summaryrefslogtreecommitdiff
path: root/fonts/utilities
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities
Initial commit
Diffstat (limited to 'fonts/utilities')
-rw-r--r--fonts/utilities/JustFontItTE/README95
-rw-r--r--fonts/utilities/TrueTypeToType42/ReadMe.html192
-rw-r--r--fonts/utilities/TrueTypeToType42/ReadMe.txt151
-rw-r--r--fonts/utilities/TrueTypeToType42/TTF2T42WE.bat73
-rw-r--r--fonts/utilities/TrueTypeToType42/TrueTypeToType42.ps662
-rw-r--r--fonts/utilities/a2ac/README49
-rw-r--r--fonts/utilities/a2ac/a2ac-cz.doc582
l---------fonts/utilities/a2ac/a2ac-cz.txt1
-rw-r--r--fonts/utilities/a2ac/a2ac-eng.doc630
l---------fonts/utilities/a2ac/a2ac-eng.txt1
-rw-r--r--fonts/utilities/a2ac/a2ac.c1214
-rw-r--r--fonts/utilities/a2ac/cscorr.tab132
-rw-r--r--fonts/utilities/a2ac/mkallfnt47
-rw-r--r--fonts/utilities/a2ac/mkfnt51
-rw-r--r--fonts/utilities/a2ac/test.tex74
-rw-r--r--fonts/utilities/a2ac/xl2.enc306
-rw-r--r--fonts/utilities/a2ac/xt2.enc306
-rw-r--r--fonts/utilities/accfonts/CHANGES342
-rw-r--r--fonts/utilities/accfonts/COPYING339
-rw-r--r--fonts/utilities/accfonts/CSX.def133
-rw-r--r--fonts/utilities/accfonts/ISO-Latin1.def131
-rw-r--r--fonts/utilities/accfonts/ISO-Latin2.def159
-rw-r--r--fonts/utilities/accfonts/IndUni_Omega.def491
-rw-r--r--fonts/utilities/accfonts/Norman.def176
-rw-r--r--fonts/utilities/accfonts/README458
-rw-r--r--fonts/utilities/accfonts/dvips.enc75
-rwxr-xr-xfonts/utilities/accfonts/mkt1font1012
-rwxr-xr-xfonts/utilities/accfonts/vpl2ovp1085
-rwxr-xr-xfonts/utilities/accfonts/vpl2vpl994
-rw-r--r--fonts/utilities/adjkerns/adjkerns.think-c.hqx610
-rw-r--r--fonts/utilities/adjkerns/examples/eo.kcf34
-rw-r--r--fonts/utilities/adjkerns/examples/eocr10.vpl2306
-rw-r--r--fonts/utilities/adjkerns/examples/eotest.tex22
-rw-r--r--fonts/utilities/adjkerns/examples/esperanto-wannabe.tex15
-rw-r--r--fonts/utilities/adjkerns/examples/esperanto-wannabe.vpl138
-rw-r--r--fonts/utilities/afmtopl/clark/aftopl.177
-rw-r--r--fonts/utilities/afmtopl/clark/aftopl.c510
-rw-r--r--fonts/utilities/afmtopl/clark/util.h91
-rw-r--r--fonts/utilities/afmtopl/elwell/aftopl.c236
-rw-r--r--fonts/utilities/afmtopl/wolczko/aftopl203
-rw-r--r--fonts/utilities/afmtopl/wolczko/edsymbols4
-rw-r--r--fonts/utilities/afmtopl/wolczko/fontdimens24
-rw-r--r--fonts/utilities/afmtopl/wolczko/mk-con91
-rw-r--r--fonts/utilities/afmtopl/wolczko/mk-obl100
-rw-r--r--fonts/utilities/afmtopl/wolczko/mk-red43
-rw-r--r--fonts/utilities/afmtopl/wolczko/mk-sc99
-rw-r--r--fonts/utilities/afmtopl/wolczko/readme14
-rw-r--r--fonts/utilities/cjk-gs-integrate/ChangeLog1468
-rw-r--r--fonts/utilities/cjk-gs-integrate/Makefile20
-rw-r--r--fonts/utilities/cjk-gs-integrate/README.md226
-rwxr-xr-xfonts/utilities/cjk-gs-integrate/cjk-gs-integrate.pl2675
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-adobe.dat58
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-apple.dat119
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-arphic.dat46
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-bizud.dat60
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-cjkuni.dat66
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-dynacomware.dat148
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-fandol.dat39
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-fontworks.dat69
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-founder.dat112
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-hancom.dat26
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-heisei.dat54
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-hiragino.dat160
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-ipa.dat103
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-kozuka.dat302
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-macos-removeonly.dat582
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-microsoft.dat256
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-mogamobo.dat200
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-monotype.dat30
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-morisawa.dat705
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-nanum.dat78
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-notosans.dat182
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-notoserif.dat141
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-ryokana.dat141
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-sazanami.dat12
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-sinotype.dat194
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-solaris.dat33
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehansans.dat182
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehanserif.dat142
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-toppan.dat69
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-typebank.dat33
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-ume.dat106
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-unfonts.dat112
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-wenquanyi.dat56
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-osx.dat79
-rw-r--r--fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-win.dat119
-rw-r--r--fonts/utilities/corelfonts/README63
-rw-r--r--fonts/utilities/corelfonts/corelfonts233
-rw-r--r--fonts/utilities/corelfonts/fontinst.sty2229
-rw-r--r--fonts/utilities/corelfonts/fontnames.dat818
-rw-r--r--fonts/utilities/ega2mf/00readme.txt83
l---------fonts/utilities/ega2mf/README1
-rw-r--r--fonts/utilities/ega2mf/cp437.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp437.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/cp850.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp850.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/cp860.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp860.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/cp863.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp863.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/cp865.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp865.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/cp880dv.egabin0 -> 3584 bytes
-rw-r--r--fonts/utilities/ega2mf/cp880dv.vgabin0 -> 4096 bytes
-rw-r--r--fonts/utilities/ega2mf/ega2mf.c187
-rw-r--r--fonts/utilities/ega2mf/foo.bar10
-rw-r--r--fonts/utilities/ega2mf/vga2mf.c193
-rw-r--r--fonts/utilities/ega2mf/wnpc10.mf3420
-rw-r--r--fonts/utilities/ega2mf/wnpc10.tex35
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/HISTORY60
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/README136
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/examples/greek/hancock.tex58
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/examples/greek/ohancock.tex64
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/examples/greek/owingreek.tex48
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/examples/greek/wingreek.tex45
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/base/aliasing.tex68
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-lt.tex77
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-uni.tex291
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias.tex73
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/wgalias.tex207
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/greek-ltr.etx926
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-lig.etx1587
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-ligc.etx67
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-orig.etx1050
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-origc.etx67
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr.etx1049
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgrc.etx67
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek-lt.mtx305
-rw-r--r--fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek.mtx1704
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/HISTORY63
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/README118
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/examples/uni/oltt.tex87
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/inputs/smblmtx/resetmu.mtx41
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1.etx4054
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1c.etx59
-rw-r--r--fonts/utilities/fontinst-contrib/ofntinst/inputs/unimtx/unilatin.mtx1382
l---------fonts/utilities/fontinst-prerelease1
-rw-r--r--fonts/utilities/fontinst/README114
-rw-r--r--fonts/utilities/fontinst/doc/encspecs/encspecs.tex1443
-rw-r--r--fonts/utilities/fontinst/doc/encspecs/omxdraft.etx985
-rw-r--r--fonts/utilities/fontinst/doc/encspecs/ot1draft.etx1027
-rw-r--r--fonts/utilities/fontinst/doc/encspecs/t1draft.etx1484
-rw-r--r--fonts/utilities/fontinst/doc/manual/fontinst.pdfbin0 -> 463486 bytes
-rw-r--r--fonts/utilities/fontinst/doc/manual/fontinst.tex4680
-rw-r--r--fonts/utilities/fontinst/doc/manual/intro98.pdfbin0 -> 190986 bytes
-rw-r--r--fonts/utilities/fontinst/doc/manual/intro98.tex1330
-rw-r--r--fonts/utilities/fontinst/doc/manual/roadmap.eps265
-rw-r--r--fonts/utilities/fontinst/doc/talks/et99-font-tables.pdfbin0 -> 201767 bytes
-rw-r--r--fonts/utilities/fontinst/doc/talks/et99-font-tutorial.pdfbin0 -> 242186 bytes
-rw-r--r--fonts/utilities/fontinst/examples/basic/basicex.tex431
-rw-r--r--fonts/utilities/fontinst/examples/basic/basicex2.tex50
-rw-r--r--fonts/utilities/fontinst/examples/eurofont/Makefile45
-rw-r--r--fonts/utilities/fontinst/examples/eurofont/eurofont.map12
-rw-r--r--fonts/utilities/fontinst/examples/eurofont/eurofont.tex43
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/Makefile24
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/fontptcm.tex75
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/mathtest.tex643
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/resetsy.mtx30
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/unsetmu.mtx7
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/zrhax.mtx15
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/zrmhax.mtx14
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/zrmkern.mtx158
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/zrvhax.mtx73
-rw-r--r--fonts/utilities/fontinst/examples/mathptm/zryhax.mtx26
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/Makefile23
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/fontptcmx.tex76
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/mathptmx.sty42
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/mathtestx.tex643
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/resetsy.mtx30
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/unsetmu.mtx7
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zrhax.mtx15
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zrmhax.mtx14
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zrmkernx.mtx239
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zrvhax.mtx73
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zryhax.mtx26
-rw-r--r--fonts/utilities/fontinst/examples/mathptmx/zrykernx.mtx35
-rw-r--r--fonts/utilities/fontinst/inputs/base/bbox.sty163
-rw-r--r--fonts/utilities/fontinst/inputs/base/cfntinst.sty3688
-rw-r--r--fonts/utilities/fontinst/inputs/base/finstmsc.sty1470
-rw-r--r--fonts/utilities/fontinst/inputs/base/fontinst.ini97
-rw-r--r--fonts/utilities/fontinst/inputs/base/fontinst.sty3676
-rw-r--r--fonts/utilities/fontinst/inputs/base/multislot.sty234
-rw-r--r--fonts/utilities/fontinst/inputs/base/xfntinst.sty3775
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/8r.etx1354
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/8y.etx1305
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1.etx938
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1c.etx92
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1cj.etx69
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1ctt.etx63
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1i.etx56
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1ij.etx56
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1itt.etx70
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1j.etx52
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/ot1tt.etx66
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1.etx1478
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1c.etx63
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1cj.etx51
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1i.etx20
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1ij.etx20
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/t1j.etx20
-rw-r--r--fonts/utilities/fontinst/inputs/latinetx/txtfdmns.etx136
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/8r.mtx234
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/8y.mtx251
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/latin.mtx1791
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/latinsc.mtx1324
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/llbuild.mtx568
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/lsbuild.mtx260
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/lsfake.mtx359
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/lsmisc.mtx194
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/ltcmds.mtx305
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/ltpunct.mtx247
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/lubuild.mtx656
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/newlatin.mtx190
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/resetsc.mtx166
-rw-r--r--fonts/utilities/fontinst/inputs/latinmtx/unsetalf.mtx114
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/euex.etx164
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/eufrak.etx238
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/eurm.etx239
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/euscr.etx171
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/msam.etx636
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/msbm.etx619
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/oml.etx627
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/oms.etx678
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/omx.etx731
-rw-r--r--fonts/utilities/fontinst/inputs/mathetx/rsfs.etx92
-rw-r--r--fonts/utilities/fontinst/inputs/mathmtx/mathex.mtx303
-rw-r--r--fonts/utilities/fontinst/inputs/mathmtx/mathit.mtx280
-rw-r--r--fonts/utilities/fontinst/inputs/mathmtx/mathsy.mtx313
-rw-r--r--fonts/utilities/fontinst/inputs/misc/csc2x.tex118
-rw-r--r--fonts/utilities/fontinst/inputs/misc/csckrn2x.tex121
-rw-r--r--fonts/utilities/fontinst/inputs/misc/glyphbox.mtx62
-rw-r--r--fonts/utilities/fontinst/inputs/misc/glyphoff.mtx8
-rw-r--r--fonts/utilities/fontinst/inputs/misc/glyphon.mtx7
-rw-r--r--fonts/utilities/fontinst/inputs/misc/kernoff.mtx6
-rw-r--r--fonts/utilities/fontinst/inputs/misc/kernon.mtx6
-rw-r--r--fonts/utilities/fontinst/inputs/misc/osf2x.tex37
-rw-r--r--fonts/utilities/fontinst/inputs/smbletx/digit2.etx10
-rw-r--r--fonts/utilities/fontinst/inputs/smbletx/ts1.etx764
-rw-r--r--fonts/utilities/fontinst/inputs/smbletx/ts1i.etx7
-rw-r--r--fonts/utilities/fontinst/inputs/smbletx/ts1ij.etx7
-rw-r--r--fonts/utilities/fontinst/inputs/smbletx/ts1j.etx7
-rw-r--r--fonts/utilities/fontinst/inputs/smblmtx/resetosf.mtx88
-rw-r--r--fonts/utilities/fontinst/inputs/smblmtx/textcomp.mtx561
-rw-r--r--fonts/utilities/fontinst/inputs/smblmtx/unsetnum.mtx62
-rw-r--r--fonts/utilities/fontinst/latex/fontdoc.sty1390
-rw-r--r--fonts/utilities/fontinst/source/CHANGES648
-rw-r--r--fonts/utilities/fontinst/source/fibasics.dtx2345
-rw-r--r--fonts/utilities/fontinst/source/ficommon.dtx2416
-rw-r--r--fonts/utilities/fontinst/source/ficonv.dtx3169
-rw-r--r--fonts/utilities/fontinst/source/filtfam.dtx1187
-rw-r--r--fonts/utilities/fontinst/source/fimain.dtx4965
-rw-r--r--fonts/utilities/fontinst/source/fimapgen.dtx1607
-rw-r--r--fonts/utilities/fontinst/source/fisource.dvibin0 -> 1147220 bytes
-rw-r--r--fonts/utilities/fontinst/source/fisource.ist47
-rw-r--r--fonts/utilities/fontinst/source/fisource.sty691
-rw-r--r--fonts/utilities/fontinst/source/fisource.tex3037
-rw-r--r--fonts/utilities/fontinst/source/fitrig.dtx326
-rw-r--r--fonts/utilities/fontinst/source/fontinst.ins135
-rw-r--r--fonts/utilities/fontinst/test/cc-pl.enc258
-rw-r--r--fonts/utilities/fontinst/test/comparemetrics.sty941
-rw-r--r--fonts/utilities/fontinst/test/comparepls.tex73
-rw-r--r--fonts/utilities/fontinst/test/fadrr.mtx51
-rw-r--r--fonts/utilities/fontinst/test/multislot-test.tex16
-rw-r--r--fonts/utilities/fontinst/test/multislot.etx54
-rw-r--r--fonts/utilities/fontinst/test/omsdraft.etx871
-rw-r--r--fonts/utilities/fontinst/test/testsc.tex41
-rw-r--r--fonts/utilities/fontinst/test/v1901test.mtx22
-rw-r--r--fonts/utilities/fontinst/test/v1901test.tex214
-rw-r--r--fonts/utilities/fontinst/test/v1902test.tex11
-rw-r--r--fonts/utilities/fontinst/test/v1905test.tex22
-rw-r--r--fonts/utilities/fontinst/test/v1906test.etx128
-rw-r--r--fonts/utilities/fontinst/test/v1906test.mtx64
-rw-r--r--fonts/utilities/fontinst/test/v1906test.tex12
-rw-r--r--fonts/utilities/fontinst/test/v1913test.tex21
-rw-r--r--fonts/utilities/fontinst/test/v1914test.tex50
-rw-r--r--fonts/utilities/fontinst/test/v1914testmap.tex17
-rw-r--r--fonts/utilities/fontinst/test/v1914testshow.tex22
-rw-r--r--fonts/utilities/fontinst/test/v1915test.tex25
-rw-r--r--fonts/utilities/fontinst/test/v1915testmap.tex9
-rw-r--r--fonts/utilities/fontinst/test/v1916test.mtx23
-rw-r--r--fonts/utilities/fontinst/test/v1916test.tex14
-rw-r--r--fonts/utilities/fontinst/test/v1916test2.tex27
-rw-r--r--fonts/utilities/fontinst/test/v1923test.tex47
-rw-r--r--fonts/utilities/fontinst/test/v1927test.tex18
-rw-r--r--fonts/utilities/fontinst/test/v1928test.tex13
-rw-r--r--fonts/utilities/fontinst/test/v1928test2.tex32
-rw-r--r--fonts/utilities/fontinst/test/v1930test.tex16
-rw-r--r--fonts/utilities/fontinst/test/v1931test0.tex8
-rw-r--r--fonts/utilities/fontinst/test/v1931test1.tex50
-rw-r--r--fonts/utilities/fontinst/test/v1931test2.tex35
-rw-r--r--fonts/utilities/fontload/README46
-rw-r--r--fonts/utilities/fontload/README.news25
-rw-r--r--fonts/utilities/fontload/lib/35.FS35
-rw-r--r--fonts/utilities/fontload/lib/Fontmap.t1348
-rw-r--r--fonts/utilities/fontload/lib/Standard.FS13
-rw-r--r--fonts/utilities/fontload/lib/cvtmap.ps13
-rw-r--r--fonts/utilities/fontload/lib/psfstat.ps386
-rw-r--r--fonts/utilities/fontload/man/fload.170
-rw-r--r--fonts/utilities/fontload/man/subfont.1175
-rw-r--r--fonts/utilities/fontload/src/Makefile21
-rw-r--r--fonts/utilities/fontload/src/fstat.c17
-rw-r--r--fonts/utilities/fontload/src/subfont.c1860
-rw-r--r--fonts/utilities/fontload/unix/INSTALL120
-rw-r--r--fonts/utilities/fontload/unix/UpdateMap.csh35
-rw-r--r--fonts/utilities/fontload/unix/fload.csh140
-rw-r--r--fonts/utilities/fontload/unix/home.dirs15
-rw-r--r--fonts/utilities/fontload/unix/install.dirs18
-rw-r--r--fonts/utilities/fontload/unix/install.txt5
-rw-r--r--fonts/utilities/fontload/unix/mkmap34
-rw-r--r--fonts/utilities/fontload/unix/ppd2fs13
-rw-r--r--fonts/utilities/fontload/unix/usr-local.dirs15
-rw-r--r--fonts/utilities/fontload/vms/fload.com122
-rw-r--r--fonts/utilities/fontload/vms/fontmap.t1254
-rw-r--r--fonts/utilities/fontload/vms/init.com7
-rw-r--r--fonts/utilities/fontload/vms/install.txt77
-rw-r--r--fonts/utilities/fontload/vms/make.com11
-rw-r--r--fonts/utilities/fontload/vms/subfont.exe-alphabin0 -> 48128 bytes
-rw-r--r--fonts/utilities/fontload/vms/subfont.exe-vaxbin0 -> 89600 bytes
-rw-r--r--fonts/utilities/fontools/GPLv2.txt341
-rw-r--r--fonts/utilities/fontools/README83
-rwxr-xr-xfonts/utilities/fontools/bin/afm2afm500
-rwxr-xr-xfonts/utilities/fontools/bin/autoinst3220
-rwxr-xr-xfonts/utilities/fontools/bin/ot2kpx932
-rwxr-xr-xfonts/utilities/fontools/bin/splitttc271
-rw-r--r--fonts/utilities/fontools/doc/afm2afm.pdfbin0 -> 26995 bytes
-rw-r--r--fonts/utilities/fontools/doc/autoinst.pdfbin0 -> 68838 bytes
-rw-r--r--fonts/utilities/fontools/doc/ot2kpx.pdfbin0 -> 27378 bytes
-rw-r--r--fonts/utilities/fontools/doc/splitttc.pdfbin0 -> 20490 bytes
-rw-r--r--fonts/utilities/fontools/share/fontools_lgr.enc381
-rw-r--r--fonts/utilities/fontools/share/fontools_ly1.enc306
-rw-r--r--fonts/utilities/fontools/share/fontools_ot1.enc303
-rw-r--r--fonts/utilities/fontools/share/fontools_t1.enc306
-rw-r--r--fonts/utilities/fontools/share/fontools_t2a.enc304
-rw-r--r--fonts/utilities/fontools/share/fontools_t2b.enc304
-rw-r--r--fonts/utilities/fontools/share/fontools_t2c.enc304
-rw-r--r--fonts/utilities/fontools/share/fontools_t3.enc276
-rw-r--r--fonts/utilities/fontools/share/fontools_ts1.enc293
-rw-r--r--fonts/utilities/fontools/share/fontools_ts3.enc276
-rw-r--r--fonts/utilities/jfmutil/LICENSE21
-rw-r--r--fonts/utilities/jfmutil/README-ja.md498
-rw-r--r--fonts/utilities/jfmutil/README.md117
-rw-r--r--fonts/utilities/jfmutil/jfmutil.pl3343
-rw-r--r--fonts/utilities/lcdf-typetools/README144
-rw-r--r--fonts/utilities/macfont/COPYING280
-rw-r--r--fonts/utilities/macfont/Makefile21
-rw-r--r--fonts/utilities/macfont/README60
-rw-r--r--fonts/utilities/macfont/applestd.h276
-rw-r--r--fonts/utilities/macfont/getbits.c108
-rw-r--r--fonts/utilities/macfont/mac2bdf.c554
-rw-r--r--fonts/utilities/macfont/mac2bdf.h26
-rw-r--r--fonts/utilities/macfont/macfont.c828
-rw-r--r--fonts/utilities/macfont/macio.c201
-rw-r--r--fonts/utilities/macfont/macio.h44
-rw-r--r--fonts/utilities/macfont/mactypes.h115
-rwxr-xr-xfonts/utilities/makefonts/00previous/FontInstall56
-rwxr-xr-xfonts/utilities/makefonts/00previous/FontMetricInstall63
-rw-r--r--fonts/utilities/makefonts/00previous/README77
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_ams257
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_cc93
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_cm441
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_cmextrabold76
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_cmmore76
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_etc150
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_gothic118
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_karta65
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_latex109
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_musixtex0.6356
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_musixtex0.63156
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_musixtexT.58111
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_pandora154
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_rsfs69
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_stmaryrd74
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_utility106
-rwxr-xr-xfonts/utilities/makefonts/00previous/mk_wasy87
-rw-r--r--fonts/utilities/makefonts/README58
-rwxr-xr-xfonts/utilities/makefonts/allcm106
-rwxr-xr-xfonts/utilities/makefonts/allec106
-rwxr-xr-xfonts/utilities/makefonts/make_ams143
-rwxr-xr-xfonts/utilities/makefonts/make_cm149
-rwxr-xr-xfonts/utilities/makefonts/make_concrete138
-rwxr-xr-xfonts/utilities/makefonts/make_gothic139
-rwxr-xr-xfonts/utilities/makefonts/make_latex139
-rwxr-xr-xfonts/utilities/makefonts/make_mflogo148
-rwxr-xr-xfonts/utilities/makefonts/make_pandora131
-rwxr-xr-xfonts/utilities/makefonts/make_rsfs141
-rwxr-xr-xfonts/utilities/makefonts/make_slitex139
-rwxr-xr-xfonts/utilities/makefonts/make_stmaryrd141
-rwxr-xr-xfonts/utilities/makefonts/make_wasy139
-rw-r--r--fonts/utilities/mathinst/INSTALL37
-rw-r--r--fonts/utilities/mathinst/MTMI.etx519
-rw-r--r--fonts/utilities/mathinst/MTSY.etx494
-rw-r--r--fonts/utilities/mathinst/OMLlus.etx16
-rw-r--r--fonts/utilities/mathinst/OMLluss.etx16
-rw-r--r--fonts/utilities/mathinst/OMLmt.etx588
-rw-r--r--fonts/utilities/mathinst/OMLmts.etx19
-rw-r--r--fonts/utilities/mathinst/OMLmtss.etx19
-rw-r--r--fonts/utilities/mathinst/OMSeu.etx59
-rw-r--r--fonts/utilities/mathinst/OMSeus.etx59
-rw-r--r--fonts/utilities/mathinst/OMSeuss.etx59
-rw-r--r--fonts/utilities/mathinst/OMSlu.etx57
-rw-r--r--fonts/utilities/mathinst/OMSlus.etx56
-rw-r--r--fonts/utilities/mathinst/OMSluss.etx56
-rw-r--r--fonts/utilities/mathinst/OMSmt.etx600
-rw-r--r--fonts/utilities/mathinst/OMSmts.etx58
-rw-r--r--fonts/utilities/mathinst/OMSmtss.etx58
-rw-r--r--fonts/utilities/mathinst/OMXlu.etx907
-rw-r--r--fonts/utilities/mathinst/OMXmt.etx41
-rw-r--r--fonts/utilities/mathinst/OT1eu.etx858
-rw-r--r--fonts/utilities/mathinst/OT1eus.etx858
-rw-r--r--fonts/utilities/mathinst/OT1euss.etx858
-rw-r--r--fonts/utilities/mathinst/OT1lus.etx16
-rw-r--r--fonts/utilities/mathinst/OT1luss.etx16
-rw-r--r--fonts/utilities/mathinst/OT1s.etx18
-rw-r--r--fonts/utilities/mathinst/OT1ss.etx18
-rw-r--r--fonts/utilities/mathinst/README44
-rw-r--r--fonts/utilities/mathinst/accsoff.mtx62
-rw-r--r--fonts/utilities/mathinst/alphoff.mtx77
-rw-r--r--fonts/utilities/mathinst/cm.par75
-rw-r--r--fonts/utilities/mathinst/dotlessj.mtx41
-rw-r--r--fonts/utilities/mathinst/eu.par85
-rw-r--r--fonts/utilities/mathinst/eu_ihax.mtx136
-rw-r--r--fonts/utilities/mathinst/eu_iskew.mtx71
-rw-r--r--fonts/utilities/mathinst/euex.etx89
-rw-r--r--fonts/utilities/mathinst/euexs.mtx33
-rw-r--r--fonts/utilities/mathinst/eufm.etx128
-rw-r--r--fonts/utilities/mathinst/eurm.etx162
-rw-r--r--fonts/utilities/mathinst/eusm.etx76
-rw-r--r--fonts/utilities/mathinst/eusyms.mtx27
-rw-r--r--fonts/utilities/mathinst/expert.etx183
-rw-r--r--fonts/utilities/mathinst/harpoons.mtx35
-rw-r--r--fonts/utilities/mathinst/lbma.etx241
-rw-r--r--fonts/utilities/mathinst/lbme.etx656
-rw-r--r--fonts/utilities/mathinst/lbmi.etx638
-rw-r--r--fonts/utilities/mathinst/lbmo.etx645
-rw-r--r--fonts/utilities/mathinst/lbms.etx644
-rw-r--r--fonts/utilities/mathinst/lu.par87
-rw-r--r--fonts/utilities/mathinst/lu_ihax.mtx135
-rw-r--r--fonts/utilities/mathinst/lu_iskew.mtx71
-rw-r--r--fonts/utilities/mathinst/ma.par87
-rw-r--r--fonts/utilities/mathinst/ma_ihax.mtx135
-rw-r--r--fonts/utilities/mathinst/ma_iskew.mtx71
-rw-r--r--fonts/utilities/mathinst/makegr.tex10
-rw-r--r--fonts/utilities/mathinst/makemma/alphoff.mtx78
-rw-r--r--fonts/utilities/mathinst/makemma/bbolds.mtx78
-rw-r--r--fonts/utilities/mathinst/makemma/cmmi10.pl1133
-rw-r--r--fonts/utilities/mathinst/makemma/fraks.mtx79
-rw-r--r--fonts/utilities/mathinst/makemma/greekoff.mtx34
-rw-r--r--fonts/utilities/mathinst/makemma/kernoff.mtx17
-rw-r--r--fonts/utilities/mathinst/makemma/kernon.mtx16
-rw-r--r--fonts/utilities/mathinst/makemma/ma1ex.mtx51
-rw-r--r--fonts/utilities/mathinst/makemma/ma1mi.mtx87
-rw-r--r--fonts/utilities/mathinst/makemma/ma1mitt.mtx23
-rw-r--r--fonts/utilities/mathinst/makemma/ma1sy.mtx95
-rw-r--r--fonts/utilities/mathinst/makemma/ma2ex.mtx159
-rw-r--r--fonts/utilities/mathinst/makemma/ma2sy.mtx48
-rw-r--r--fonts/utilities/mathinst/makemma/ma3mi.mtx47
-rw-r--r--fonts/utilities/mathinst/makemma/ma3sy.mtx67
-rw-r--r--fonts/utilities/mathinst/makemma/ma4ex.mtx44
-rw-r--r--fonts/utilities/mathinst/makemma/ma4mi.mtx37
-rw-r--r--fonts/utilities/mathinst/makemma/ma4sy.mtx41
-rw-r--r--fonts/utilities/mathinst/makemma/ma5mi.mtx32
-rw-r--r--fonts/utilities/mathinst/makemma/ma5sy.mtx63
-rw-r--r--fonts/utilities/mathinst/makemma/makemapl.bat20
-rw-r--r--fonts/utilities/mathinst/makemma/makemma.tex121
-rw-r--r--fonts/utilities/mathinst/makemma/makemmas.tex38
-rw-r--r--fonts/utilities/mathinst/makemma/negslash.mtx29
-rw-r--r--fonts/utilities/mathinst/makemma/psfonts.mma25
-rw-r--r--fonts/utilities/mathinst/makemma/rename.bat42
-rw-r--r--fonts/utilities/mathinst/makemma/unadobe.mtx248
-rw-r--r--fonts/utilities/mathinst/makemma/uncmmi.mtx79
-rw-r--r--fonts/utilities/mathinst/makemma/unsave.mtx246
-rw-r--r--fonts/utilities/mathinst/map.a2d434
-rw-r--r--fonts/utilities/mathinst/map.sup32
-rw-r--r--fonts/utilities/mathinst/mathinst288
-rw-r--r--fonts/utilities/mathinst/mathinst.lib1876
-rw-r--r--fonts/utilities/mathinst/mathinst.tex664
-rw-r--r--fonts/utilities/mathinst/mt.par102
-rw-r--r--fonts/utilities/mathinst/mt_ihax.mtx135
-rw-r--r--fonts/utilities/mathinst/mt_iskew.mtx71
-rw-r--r--fonts/utilities/mathinst/newlbme.mtx36
-rw-r--r--fonts/utilities/mathinst/newlbmo.mtx41
-rw-r--r--fonts/utilities/mathinst/newlbms.mtx32
-rw-r--r--fonts/utilities/mathinst/newmtex.mtx34
-rw-r--r--fonts/utilities/mathinst/newmtsy.mtx38
-rw-r--r--fonts/utilities/mathinst/newmtx.prl78
-rw-r--r--fonts/utilities/mathinst/newrmtmi.mtx41
-rw-r--r--fonts/utilities/mathinst/newxht.mtx18
-rw-r--r--fonts/utilities/mathinst/nodotles.mtx20
-rw-r--r--fonts/utilities/mathinst/noslash.mtx21
-rw-r--r--fonts/utilities/mathinst/notequa.mtx16
-rw-r--r--fonts/utilities/mathinst/notequal.mtx16
-rw-r--r--fonts/utilities/mathinst/numoff.mtx25
-rw-r--r--fonts/utilities/mathinst/plainsty.tpl155
-rw-r--r--fonts/utilities/mathinst/regreek.mtx47
-rw-r--r--fonts/utilities/mathinst/rhax.mtx62
-rw-r--r--fonts/utilities/mathinst/testmath.tpl331
-rw-r--r--fonts/utilities/mathinst/testmatp.tpl325
-rw-r--r--fonts/utilities/mathinst/ucgrkoff.mtx28
-rw-r--r--fonts/utilities/mathinst/unfake.mtx67
-rw-r--r--fonts/utilities/mathinst/upsilon.mtx19
-rw-r--r--fonts/utilities/mathinst/xdotless.mtx16
-rw-r--r--fonts/utilities/mathkit/.dir.tiffbin0 -> 6646 bytes
-rw-r--r--fonts/utilities/mathkit/alphoff.mtx80
-rw-r--r--fonts/utilities/mathkit/bv.mkr50
-rw-r--r--fonts/utilities/mathkit/bv.mks48
-rw-r--r--fonts/utilities/mathkit/bvpacriw.mtx83
-rw-r--r--fonts/utilities/mathkit/bvpacrix.mtx144
-rw-r--r--fonts/utilities/mathkit/dos/alphoff.mtx80
-rw-r--r--fonts/utilities/mathkit/dos/bv.mkr50
-rw-r--r--fonts/utilities/mathkit/dos/bv.mks48
-rw-r--r--fonts/utilities/mathkit/dos/bvpacriw.mtx83
-rw-r--r--fonts/utilities/mathkit/dos/bvpacrix.mtx144
-rw-r--r--fonts/utilities/mathkit/dos/dotlessj.mtx43
-rw-r--r--fonts/utilities/mathkit/dos/greekoff.mtx45
-rw-r--r--fonts/utilities/mathkit/dos/ihax.mtx135
-rw-r--r--fonts/utilities/mathkit/dos/iskew.mtx71
-rw-r--r--fonts/utilities/mathkit/dos/makevp.mk71
-rw-r--r--fonts/utilities/mathkit/dos/mathkit1048
-rw-r--r--fonts/utilities/mathkit/dos/mathkit.par97
-rw-r--r--fonts/utilities/mathkit/dos/mathkit.tex605
-rw-r--r--fonts/utilities/mathkit/dos/mkaccent.mf219
-rw-r--r--fonts/utilities/mathkit/dos/mkmathex.mf22
-rw-r--r--fonts/utilities/mathkit/dos/mkmathit.mf71
-rw-r--r--fonts/utilities/mathkit/dos/mkmathsy.mf38
-rw-r--r--fonts/utilities/mathkit/dos/mkroman.mf73
-rw-r--r--fonts/utilities/mathkit/dos/pl.mkr51
-rw-r--r--fonts/utilities/mathkit/dos/readme28
-rw-r--r--fonts/utilities/mathkit/dos/rhax.mtx61
-rw-r--r--fonts/utilities/mathkit/dos/testmath.mk364
-rw-r--r--fonts/utilities/mathkit/dos/testmatp.mk338
-rw-r--r--fonts/utilities/mathkit/dos/tm.mkb56
-rw-r--r--fonts/utilities/mathkit/dos/tm.mkr70
-rw-r--r--fonts/utilities/mathkit/dos/zsty.mk75
-rw-r--r--fonts/utilities/mathkit/dos/ztex.mk115
-rw-r--r--fonts/utilities/mathkit/dotlessj.mtx43
-rw-r--r--fonts/utilities/mathkit/greekoff.mtx45
-rw-r--r--fonts/utilities/mathkit/ihax.mtx135
-rw-r--r--fonts/utilities/mathkit/iskew.mtx71
-rw-r--r--fonts/utilities/mathkit/makevp.mk71
-rw-r--r--fonts/utilities/mathkit/mathkit1048
-rw-r--r--fonts/utilities/mathkit/mathkit.par97
-rw-r--r--fonts/utilities/mathkit/mathkit.tex605
-rw-r--r--fonts/utilities/mathkit/mkaccent.mf219
-rw-r--r--fonts/utilities/mathkit/mkmathex.mf22
-rw-r--r--fonts/utilities/mathkit/mkmathit.mf71
-rw-r--r--fonts/utilities/mathkit/mkmathsy.mf38
-rw-r--r--fonts/utilities/mathkit/mkroman.mf73
-rw-r--r--fonts/utilities/mathkit/pl.mkr51
-rw-r--r--fonts/utilities/mathkit/readme28
-rw-r--r--fonts/utilities/mathkit/rhax.mtx62
-rw-r--r--fonts/utilities/mathkit/testmath.mk364
-rw-r--r--fonts/utilities/mathkit/testmatp.mk338
-rw-r--r--fonts/utilities/mathkit/tm.mkb56
-rw-r--r--fonts/utilities/mathkit/tm.mkr70
-rw-r--r--fonts/utilities/mathkit/zsty.mk75
-rw-r--r--fonts/utilities/mathkit/ztex.mk115
-rw-r--r--fonts/utilities/metatype1/README266
-rw-r--r--fonts/utilities/metatype1/metatype1-ver056.inf3
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/README9
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/move9
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.base184
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.log17
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.mf622
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm1
-rw-r--r--fonts/utilities/mf2ps/READ.ME37
-rw-r--r--fonts/utilities/mf2ps/doc/Fig8.ps287
-rw-r--r--fonts/utilities/mf2ps/doc/Makefile17
-rw-r--r--fonts/utilities/mf2ps/doc/README10
-rw-r--r--fonts/utilities/mf2ps/doc/fig1.ps29
-rw-r--r--fonts/utilities/mf2ps/doc/fig10.ps283
-rw-r--r--fonts/utilities/mf2ps/doc/fig2.ps138
-rw-r--r--fonts/utilities/mf2ps/doc/fig4.ps283
-rw-r--r--fonts/utilities/mf2ps/doc/fig5.ps236
-rw-r--r--fonts/utilities/mf2ps/doc/fig6.ps30
-rw-r--r--fonts/utilities/mf2ps/doc/fig7.ps447
-rw-r--r--fonts/utilities/mf2ps/doc/fig8.ps292
-rw-r--r--fonts/utilities/mf2ps/doc/fig9.ps114
-rw-r--r--fonts/utilities/mf2ps/doc/figure.pages89
-rw-r--r--fonts/utilities/mf2ps/doc/figure.pages.ps508
-rw-r--r--fonts/utilities/mf2ps/doc/paper1755
-rw-r--r--fonts/utilities/mf2ps/doc/paper.pdfbin0 -> 142847 bytes
-rw-r--r--fonts/utilities/mf2ps/doc/paper.ps16427
-rw-r--r--fonts/utilities/mf2ps/doc/paper.ref1890
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/README15
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/builtins.ps16
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm.ps211
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm.tex8
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm7.ps503
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm7.tex12
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cmr.ps4555
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cmtt.ps6993
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/lasy.ps1715
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/logo.ps1096
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/sy.ps415
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/sy.tex11
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt.ps180
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt.tex8
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt7.ps457
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt7.tex12
-rw-r--r--fonts/utilities/mf2ps/mf2ps/.make3
-rw-r--r--fonts/utilities/mf2ps/mf2ps/Makefile24
-rw-r--r--fonts/utilities/mf2ps/mf2ps/README8
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps1.h388
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps1.p95
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps2.h25
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps2.p143
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps3.p657
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2psv.p19049
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf_ext.h54
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf_window.h15
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/README3
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p95
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p117
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p649
-rw-r--r--fonts/utilities/mf2pt3/mf2pt3.html577
-rw-r--r--fonts/utilities/mf2pt3/mf2pt3.nw530
-rwxr-xr-xfonts/utilities/mf2pt3/mf2pt3.pl305
-rw-r--r--fonts/utilities/mff-29/CONTENTS69
-rw-r--r--fonts/utilities/mff-29/COPYING29
-rw-r--r--fonts/utilities/mff-29/DITKO22
-rw-r--r--fonts/utilities/mff-29/EBCDIC12
-rw-r--r--fonts/utilities/mff-29/EXAMPLES59
-rw-r--r--fonts/utilities/mff-29/FCMFONTS30
-rw-r--r--fonts/utilities/mff-29/INSTALL48
-rw-r--r--fonts/utilities/mff-29/LIST150
-rw-r--r--fonts/utilities/mff-29/MACHINES40
-rw-r--r--fonts/utilities/mff-29/MANIFEST187
-rw-r--r--fonts/utilities/mff-29/MFLOGO20
-rw-r--r--fonts/utilities/mff-29/NEWS163
-rw-r--r--fonts/utilities/mff-29/README21
-rw-r--r--fonts/utilities/mff-29/SunPRO.mk210
-rw-r--r--fonts/utilities/mff-29/TEST145
-rw-r--r--fonts/utilities/mff-29/UNIX.mk155
-rw-r--r--fonts/utilities/mff-29/al_file.c50
-rw-r--r--fonts/utilities/mff-29/al_init.c106
-rw-r--r--fonts/utilities/mff-29/argloop.c178
-rw-r--r--fonts/utilities/mff-29/argloop.h66
-rw-r--r--fonts/utilities/mff-29/assoc.c102
-rw-r--r--fonts/utilities/mff-29/assoc.h39
-rw-r--r--fonts/utilities/mff-29/config.x174
-rw-r--r--fonts/utilities/mff-29/ditko.mff52
-rw-r--r--fonts/utilities/mff-29/ditko.tex13
-rw-r--r--fonts/utilities/mff-29/dk.mf400
-rw-r--r--fonts/utilities/mff-29/dkalpha.mf351
-rw-r--r--fonts/utilities/mff-29/dkpunct.mf86
-rw-r--r--fonts/utilities/mff-29/dksym.mf13
-rw-r--r--fonts/utilities/mff-29/error.c217
-rw-r--r--fonts/utilities/mff-29/example.mffrc12
-rw-r--r--fonts/utilities/mff-29/fatal.h38
-rw-r--r--fonts/utilities/mff-29/fcm.mf158
-rw-r--r--fonts/utilities/mff-29/fcm.mff56
-rw-r--r--fonts/utilities/mff-29/fgetword.c45
-rw-r--r--fonts/utilities/mff-29/findfile.c64
-rw-r--r--fonts/utilities/mff-29/fx.c310
-rw-r--r--fonts/utilities/mff-29/fx.h22
-rw-r--r--fonts/utilities/mff-29/gray.mf11
-rw-r--r--fonts/utilities/mff-29/magstep.c48
-rw-r--r--fonts/utilities/mff-29/magstep.h13
-rw-r--r--fonts/utilities/mff-29/mf.mf30
-rw-r--r--fonts/utilities/mff-29/mfbrackets.mf46
-rw-r--r--fonts/utilities/mff-29/mfcaps.mf192
-rw-r--r--fonts/utilities/mff-29/mfcommas.mf64
-rw-r--r--fonts/utilities/mff-29/mfdigits.mf55
-rw-r--r--fonts/utilities/mff-29/mff.1950
-rw-r--r--fonts/utilities/mff-29/mff.c1172
-rw-r--r--fonts/utilities/mff-29/mff.pdfbin0 -> 31596 bytes
-rw-r--r--fonts/utilities/mff-29/mflogo.mff41
-rw-r--r--fonts/utilities/mff-29/mfmacros.mf106
-rw-r--r--fonts/utilities/mff-29/mfparams.mf13
-rw-r--r--fonts/utilities/mff-29/mfpunct.mf25
-rw-r--r--fonts/utilities/mff-29/searchpath.1105
-rw-r--r--fonts/utilities/mff-29/searchpath.c49
-rw-r--r--fonts/utilities/mff-29/searchpath.h8
-rw-r--r--fonts/utilities/mff-29/stdc.h84
-rw-r--r--fonts/utilities/mff-29/strdup.c68
-rw-r--r--fonts/utilities/mff-29/stritem.c37
-rw-r--r--fonts/utilities/mff-29/strmisc.h88
-rw-r--r--fonts/utilities/mff-29/strword.c42
-rw-r--r--fonts/utilities/mff-29/testfont74
-rw-r--r--fonts/utilities/mff-29/testfont.1168
-rw-r--r--fonts/utilities/mff-29/version.h3
-rw-r--r--fonts/utilities/mff-29/xstdio.h62
-rw-r--r--fonts/utilities/mkpkfontdir/INSTALL16
-rw-r--r--fonts/utilities/mkpkfontdir/Makefile105
-rw-r--r--fonts/utilities/mkpkfontdir/README16
-rw-r--r--fonts/utilities/mkpkfontdir/lnggetopt.pl510
-rw-r--r--fonts/utilities/mkpkfontdir/misc/MakeTeXPK.in336
-rw-r--r--fonts/utilities/mkpkfontdir/misc/README12
-rw-r--r--fonts/utilities/mkpkfontdir/misc/texmf.cnf.in124
-rw-r--r--fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir730
-rw-r--r--fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir.1407
-rw-r--r--fonts/utilities/mm/makefile9
-rw-r--r--fonts/utilities/mm/makeinstance.sh70
-rw-r--r--fonts/utilities/mm/mmafm.c493
-rw-r--r--fonts/utilities/mm/mmfont183
-rw-r--r--fonts/utilities/mm/parseAFM.c1226
-rw-r--r--fonts/utilities/mm/parseAFM.h321
-rw-r--r--fonts/utilities/mm/parseAFMclient.c346
-rw-r--r--fonts/utilities/otfinst/README7
-rw-r--r--fonts/utilities/otfinst/otfinst.py748
-rw-r--r--fonts/utilities/otftofd/COPYING340
-rw-r--r--fonts/utilities/otftofd/README94
-rw-r--r--fonts/utilities/otftofd/otftofd1037
-rw-r--r--fonts/utilities/pbmtogf/00README115
-rw-r--r--fonts/utilities/pf2afm/pf2afm.bat3
-rw-r--r--fonts/utilities/pf2afm/pf2afm.ps490
-rw-r--r--fonts/utilities/pfm2afm/README54
-rw-r--r--fonts/utilities/pfm2afm/unix.patches111
-rw-r--r--fonts/utilities/pkbbox/README41
-rw-r--r--fonts/utilities/pkbbox/pkbbox.mak43
-rw-r--r--fonts/utilities/pkbbox/pkbbox.pas170
-rw-r--r--fonts/utilities/ps2mf/AFMparse.c552
-rw-r--r--fonts/utilities/ps2mf/AFMparse.h67
-rw-r--r--fonts/utilities/ps2mf/Makefile29
-rw-r--r--fonts/utilities/ps2mf/PSparse.c1498
-rw-r--r--fonts/utilities/ps2mf/PSparse.h335
-rw-r--r--fonts/utilities/ps2mf/alloca.c191
-rw-r--r--fonts/utilities/ps2mf/chr2ps.c350
-rw-r--r--fonts/utilities/ps2mf/chr2ps.h112
-rw-r--r--fonts/utilities/ps2mf/defines.h20
-rw-r--r--fonts/utilities/ps2mf/getopt.c611
-rw-r--r--fonts/utilities/ps2mf/getopt.h102
-rw-r--r--fonts/utilities/ps2mf/hints.mf619
-rw-r--r--fonts/utilities/ps2mf/myerror.c20
-rw-r--r--fonts/utilities/ps2mf/myerror.h3
-rw-r--r--fonts/utilities/ps2mf/mymalloc.c24
-rw-r--r--fonts/utilities/ps2mf/mymalloc.h3
-rw-r--r--fonts/utilities/ps2mf/myopen.c42
-rw-r--r--fonts/utilities/ps2mf/myopen.h3
-rw-r--r--fonts/utilities/ps2mf/pfa2chr.c107
-rw-r--r--fonts/utilities/ps2mf/pfa2chr.h13
-rw-r--r--fonts/utilities/ps2mf/pfb2mf.tex383
-rw-r--r--fonts/utilities/ps2mf/pfb2pfa.c152
-rw-r--r--fonts/utilities/ps2mf/pfb2pfa.h5
-rw-r--r--fonts/utilities/ps2mf/ps2mf.c145
-rw-r--r--fonts/utilities/ps2mf/ps2mf.h75
-rw-r--r--fonts/utilities/ps2mf/ps2mfutl.c217
-rw-r--r--fonts/utilities/ps2mf/ps2mfutl.h20
-rw-r--r--fonts/utilities/ps2mf/strstr.c75
-rw-r--r--fonts/utilities/ps2mf/times.mf8657
-rw-r--r--fonts/utilities/ps2mf/xmalloc.c60
-rw-r--r--fonts/utilities/ps2pk/CHANGES.type165
-rw-r--r--fonts/utilities/ps2pk/ChangeLog393
-rw-r--r--fonts/utilities/ps2pk/INSTALLATION208
-rw-r--r--fonts/utilities/ps2pk/Makefile.am144
-rw-r--r--fonts/utilities/ps2pk/Makefile.in1520
-rw-r--r--fonts/utilities/ps2pk/README240
-rw-r--r--fonts/utilities/ps2pk/README.14m35
-rw-r--r--fonts/utilities/ps2pk/README.type125
-rw-r--r--fonts/utilities/ps2pk/Xstuff.h42
-rw-r--r--fonts/utilities/ps2pk/ac/withenable.ac7
-rw-r--r--fonts/utilities/ps2pk/aclocal.m41179
-rw-r--r--fonts/utilities/ps2pk/arith.c409
-rw-r--r--fonts/utilities/ps2pk/arith.h70
-rw-r--r--fonts/utilities/ps2pk/basename.c23
-rw-r--r--fonts/utilities/ps2pk/basics.c27
-rw-r--r--fonts/utilities/ps2pk/basics.h99
-rw-r--r--fonts/utilities/ps2pk/blues.h93
-rw-r--r--fonts/utilities/ps2pk/bstring.c13
-rw-r--r--fonts/utilities/ps2pk/c-auto.in196
-rw-r--r--fonts/utilities/ps2pk/cluts.h35
-rwxr-xr-xfonts/utilities/ps2pk/configure24
-rw-r--r--fonts/utilities/ps2pk/configure.ac42
-rwxr-xr-xfonts/utilities/ps2pk/configure.texk17537
-rw-r--r--fonts/utilities/ps2pk/curves.c222
-rw-r--r--fonts/utilities/ps2pk/curves.h41
-rw-r--r--fonts/utilities/ps2pk/digit.h64
-rw-r--r--fonts/utilities/ps2pk/encoding.c353
-rw-r--r--fonts/utilities/ps2pk/ffilest.h153
-rw-r--r--fonts/utilities/ps2pk/filenames.c136
-rw-r--r--fonts/utilities/ps2pk/filenames.h27
-rw-r--r--fonts/utilities/ps2pk/flisearch.c42
-rw-r--r--fonts/utilities/ps2pk/font.h107
-rw-r--r--fonts/utilities/ps2pk/fontfcn.c300
-rw-r--r--fonts/utilities/ps2pk/fontfcn.h121
-rw-r--r--fonts/utilities/ps2pk/fontfile.h72
-rw-r--r--fonts/utilities/ps2pk/fontmisc.h63
-rw-r--r--fonts/utilities/ps2pk/fonts.h47
-rw-r--r--fonts/utilities/ps2pk/fontstruct.h224
-rw-r--r--fonts/utilities/ps2pk/fontxlfd.h43
-rw-r--r--fonts/utilities/ps2pk/fsmasks.h72
-rw-r--r--fonts/utilities/ps2pk/hdigit.h94
-rw-r--r--fonts/utilities/ps2pk/hints.c916
-rw-r--r--fonts/utilities/ps2pk/hints.h43
-rw-r--r--fonts/utilities/ps2pk/lines.c194
-rw-r--r--fonts/utilities/ps2pk/lines.h36
-rw-r--r--fonts/utilities/ps2pk/mag.168
-rw-r--r--fonts/utilities/ps2pk/mag.c156
-rw-r--r--fonts/utilities/ps2pk/objects.c1156
-rw-r--r--fonts/utilities/ps2pk/objects.h298
-rw-r--r--fonts/utilities/ps2pk/paths.c1395
-rw-r--r--fonts/utilities/ps2pk/paths.h220
-rw-r--r--fonts/utilities/ps2pk/pfb2pfa.121
-rw-r--r--fonts/utilities/ps2pk/pfb2pfa.c106
-rw-r--r--fonts/utilities/ps2pk/pictures.h48
-rw-r--r--fonts/utilities/ps2pk/pk2bm.140
-rw-r--r--fonts/utilities/ps2pk/pk2bm.c231
-rw-r--r--fonts/utilities/ps2pk/pkin.c435
-rw-r--r--fonts/utilities/ps2pk/pkin.h60
-rw-r--r--fonts/utilities/ps2pk/pkout.c578
-rw-r--r--fonts/utilities/ps2pk/pkout.h45
-rw-r--r--fonts/utilities/ps2pk/pktest.c110
-rw-r--r--fonts/utilities/ps2pk/protos.h402
-rw-r--r--fonts/utilities/ps2pk/ps2pk.1159
-rw-r--r--fonts/utilities/ps2pk/ps2pk.c708
-rw-r--r--fonts/utilities/ps2pk/psearch.c557
-rw-r--r--fonts/utilities/ps2pk/psearch.h115
-rw-r--r--fonts/utilities/ps2pk/regions.c1589
-rw-r--r--fonts/utilities/ps2pk/regions.h205
-rw-r--r--fonts/utilities/ps2pk/scanfont.c1480
-rw-r--r--fonts/utilities/ps2pk/sexpr.c25
-rw-r--r--fonts/utilities/ps2pk/spaces.c999
-rw-r--r--fonts/utilities/ps2pk/spaces.h152
-rw-r--r--fonts/utilities/ps2pk/strexpr.c292
-rw-r--r--fonts/utilities/ps2pk/strexpr.h13
-rw-r--r--fonts/utilities/ps2pk/strokes.h38
-rw-r--r--fonts/utilities/ps2pk/t1funcs.c493
-rw-r--r--fonts/utilities/ps2pk/t1hdigit.h40
-rw-r--r--fonts/utilities/ps2pk/t1imager.h152
-rw-r--r--fonts/utilities/ps2pk/t1info.c380
-rw-r--r--fonts/utilities/ps2pk/t1intf.h42
-rw-r--r--fonts/utilities/ps2pk/t1io.c287
-rw-r--r--fonts/utilities/ps2pk/t1snap.c81
-rw-r--r--fonts/utilities/ps2pk/t1stdio.h110
-rw-r--r--fonts/utilities/ps2pk/t1stub.c44
-rw-r--r--fonts/utilities/ps2pk/t1test.c529
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol.afm209
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol.alpha.hex29
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol.alpha.pix29
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol.pfa1099
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol.pfbbin0 -> 31586 bytes
-rw-r--r--fonts/utilities/ps2pk/tests/Symbol10.300pkbin0 -> 9216 bytes
-rwxr-xr-xfonts/utilities/ps2pk/tests/lmmath.test24
-rw-r--r--fonts/utilities/ps2pk/tests/lmmi12.600pkbin0 -> 18700 bytes
-rwxr-xr-xfonts/utilities/ps2pk/tests/ps2pk.test43
-rw-r--r--fonts/utilities/ps2pk/texfiles.c26
-rw-r--r--fonts/utilities/ps2pk/texfiles.h29
-rw-r--r--fonts/utilities/ps2pk/token.c1170
-rw-r--r--fonts/utilities/ps2pk/token.h61
-rw-r--r--fonts/utilities/ps2pk/tokst.h508
-rw-r--r--fonts/utilities/ps2pk/trig.h33
-rw-r--r--fonts/utilities/ps2pk/type1.c1776
-rw-r--r--fonts/utilities/ps2pk/types.h33
-rw-r--r--fonts/utilities/ps2pk/usenet64
-rw-r--r--fonts/utilities/ps2pk/util.c178
-rw-r--r--fonts/utilities/ps2pk/util.h209
-rw-r--r--fonts/utilities/ps4mf-dos/ps4mf28.txt123
-rw-r--r--fonts/utilities/ps4mf/ps4mf.txt405
-rw-r--r--fonts/utilities/psposter/CHANGELOG110
-rw-r--r--fonts/utilities/psposter/Makefile216
-rw-r--r--fonts/utilities/psposter/README86
-rw-r--r--fonts/utilities/psposter/TODO12
-rw-r--r--fonts/utilities/psposter/bb.ps527
-rw-r--r--fonts/utilities/psposter/fontlist.ps167
-rw-r--r--fonts/utilities/psposter/fontlold.ps98
-rw-r--r--fonts/utilities/psposter/fontlsim.ps41
-rw-r--r--fonts/utilities/psposter/fontshow.ps190
-rw-r--r--fonts/utilities/psposter/man2ps36
-rw-r--r--fonts/utilities/psposter/psposter.awk1184
-rw-r--r--fonts/utilities/psposter/psposter.man719
-rw-r--r--fonts/utilities/psposter/psposter.ps606
-rw-r--r--fonts/utilities/psposter/psposter.sh2
-rw-r--r--fonts/utilities/psposter/rofvms.awk61
-rw-r--r--fonts/utilities/qdtexvpl/distrib.cmd2
-rw-r--r--fonts/utilities/qdtexvpl/ibmpc437.bat9
-rw-r--r--fonts/utilities/qdtexvpl/ibmpc437.cmd9
-rw-r--r--fonts/utilities/qdtexvpl/ibmpc437.tex15
-rw-r--r--fonts/utilities/qdtexvpl/makefile38
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.c1271
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.def1
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.doc81
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.pl16
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.tex28
-rw-r--r--fonts/utilities/qdtexvpl/qdtexvpl.tfmbin0 -> 148 bytes
l---------fonts/utilities/qdtexvpl/qdtexvpl.txt1
-rw-r--r--fonts/utilities/qdtexvpl/self.tex11
-rw-r--r--fonts/utilities/t1infos/README9
-rw-r--r--fonts/utilities/t1infos/kerndict.ps618
-rw-r--r--fonts/utilities/t1infos/t1area.c167
-rw-r--r--fonts/utilities/t1infos/t1extremes.c159
-rw-r--r--fonts/utilities/t1install/toil/0toileng.inf184
-rw-r--r--fonts/utilities/t1install/toil/0toileng.lic51
-rw-r--r--fonts/utilities/t1install/toil/0toilpol.inf228
-rw-r--r--fonts/utilities/t1install/toil/0toilpol.lic55
-rw-r--r--fonts/utilities/t1install/toil/a2t.bat85
-rw-r--r--fonts/utilities/t1install/toil/a2tqx.bat85
-rw-r--r--fonts/utilities/t1install/toil/e.pl263
-rw-r--r--fonts/utilities/t1install/toil/e.qx264
-rw-r--r--fonts/utilities/t1install/toil/l.qx21
-rw-r--r--fonts/utilities/t1install/toil/toil.cfg78
-rw-r--r--fonts/utilities/t1install/toil/toil.mf1175
-rw-r--r--fonts/utilities/t1install/toil/toil.mf230
-rw-r--r--fonts/utilities/t1install/toil/toil.mf321
-rw-r--r--fonts/utilities/t1install/toil/toila.awk442
-rw-r--r--fonts/utilities/t1install/toil/toilb.awk335
-rw-r--r--fonts/utilities/t1install/toil/toilc.awk75
-rw-r--r--fonts/utilities/t1tools/afm-inf.bat64
-rw-r--r--fonts/utilities/t1tools/afm-pfm.bat93
-rw-r--r--fonts/utilities/t1tools/afm-sort.bat14
-rw-r--r--fonts/utilities/t1tools/apple.enc173
-rw-r--r--fonts/utilities/t1tools/fm.ps1
-rw-r--r--fonts/utilities/t1tools/getmetri.bat60
-rw-r--r--fonts/utilities/t1tools/getmetri.ps298
-rw-r--r--fonts/utilities/t1tools/getmetric67
-rw-r--r--fonts/utilities/t1tools/gpreview277
-rw-r--r--fonts/utilities/t1tools/makeafm198
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/fontbbox.sed9
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/fontinf1.sed14
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/fontinf2.sed5
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/fontmetr.sed5
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/makeafm.bat129
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/pccinfo.sed7
-rw-r--r--fonts/utilities/t1tools/makeafm.dir/pccnames.sed90
-rw-r--r--fonts/utilities/t1tools/pcs.ps330
-rw-r--r--fonts/utilities/t1tools/pfb-abf.bat57
-rw-r--r--fonts/utilities/t1tools/pfb-enc.bat11
-rw-r--r--fonts/utilities/t1tools/pfb-sfp.bat58
-rw-r--r--fonts/utilities/t1tools/pfblist.bat1
-rw-r--r--fonts/utilities/t1tools/pfbnames.pas58
-rw-r--r--fonts/utilities/t1tools/pfbpr.bat20
-rw-r--r--fonts/utilities/t1tools/pfbshow.bat41
-rw-r--r--fonts/utilities/t1tools/pfshow.ps181
-rw-r--r--fonts/utilities/t1tools/readme228
-rw-r--r--fonts/utilities/t1tools/t1tidy/@t1tidy.doc281
-rw-r--r--fonts/utilities/t1tools/t1tidy/afm.pas361
-rw-r--r--fonts/utilities/t1tools/t1tidy/data.pas158
-rw-r--r--fonts/utilities/t1tools/t1tidy/pathunit.pas1135
-rw-r--r--fonts/utilities/t1tools/t1tidy/strtype.pas196
-rw-r--r--fonts/utilities/t1tools/t1tidy/t1t.bat48
-rw-r--r--fonts/utilities/t1tools/t1tidy/t1tidy.pas531
-rw-r--r--fonts/utilities/t1tools/t1tools.doc211
-rw-r--r--fonts/utilities/t1tools/w.enc144
-rw-r--r--fonts/utilities/t1utils/README81
-rw-r--r--fonts/utilities/tfmpktest/README9
-rw-r--r--fonts/utilities/tfmpktest/tfmpktest.pl429
-rw-r--r--fonts/utilities/ttf2mf/notes.txt15
-rw-r--r--fonts/utilities/ttf2mf/readme127
-rw-r--r--fonts/utilities/ttf2pfb/README.ttf2pfb7
-rw-r--r--fonts/utilities/ttf2pt1/CHANGES.html588
-rw-r--r--fonts/utilities/ttf2pt1/COPYRIGHT77
-rw-r--r--fonts/utilities/ttf2pt1/FONTS.hpux.html197
-rw-r--r--fonts/utilities/ttf2pt1/FONTS.html669
-rw-r--r--fonts/utilities/ttf2pt1/Makefile243
-rw-r--r--fonts/utilities/ttf2pt1/README.FIRST4
-rw-r--r--fonts/utilities/ttf2pt1/README.html1105
-rw-r--r--fonts/utilities/ttf2pt1/app/RPM/ttf2pt1.spec.src40
-rw-r--r--fonts/utilities/ttf2pt1/app/X11/README.html41
-rw-r--r--fonts/utilities/ttf2pt1/app/X11/t1-xf86.334.patch199
-rw-r--r--fonts/utilities/ttf2pt1/app/X11/t1-xf86.39.patch252
-rw-r--r--fonts/utilities/ttf2pt1/app/netscape/Makefile2
-rw-r--r--fonts/utilities/ttf2pt1/app/netscape/README.html229
-rw-r--r--fonts/utilities/ttf2pt1/app/netscape/fontsz.cf8
-rwxr-xr-xfonts/utilities/ttf2pt1/app/netscape/notscape25
-rwxr-xr-xfonts/utilities/ttf2pt1/app/netscape/nsfilter24
-rw-r--r--fonts/utilities/ttf2pt1/app/netscape/nsfix.c469
-rwxr-xr-xfonts/utilities/ttf2pt1/app/netscape/nsprint10
-rw-r--r--fonts/utilities/ttf2pt1/app/netscape/psfonts.cf11
-rw-r--r--fonts/utilities/ttf2pt1/byteorder.h24
-rw-r--r--fonts/utilities/ttf2pt1/cygbuild.sh8
-rw-r--r--fonts/utilities/ttf2pt1/encodings/README.html81
-rw-r--r--fonts/utilities/ttf2pt1/encodings/adobestd/adobe-std.tbl0
-rw-r--r--fonts/utilities/ttf2pt1/encodings/bulgarian/encodings.alias3
-rw-r--r--fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-1251.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-866.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/bulgarian/iso8859-5.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/bulgarian/koi8-r.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/latin1/iso8859-1.tbl0
-rw-r--r--fonts/utilities/ttf2pt1/encodings/latin2/iso8859-2.tbl0
-rw-r--r--fonts/utilities/ttf2pt1/encodings/latin4/iso8859-40
-rw-r--r--fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4.tbl0
-rw-r--r--fonts/utilities/ttf2pt1/encodings/latin5/iso8859-90
-rw-r--r--fonts/utilities/ttf2pt1/encodings/russian/encodings.alias5
-rw-r--r--fonts/utilities/ttf2pt1/encodings/russian/ibm-1251.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/russian/ibm-866.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/russian/iso8859-5.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/encodings/russian/koi8-r.tbl128
-rw-r--r--fonts/utilities/ttf2pt1/ft.c639
-rw-r--r--fonts/utilities/ttf2pt1/global.h157
-rw-r--r--fonts/utilities/ttf2pt1/maps/CP1250.map254
-rw-r--r--fonts/utilities/ttf2pt1/maps/adobe-standard-encoding.map231
-rw-r--r--fonts/utilities/ttf2pt1/maps/unicode-sample.map143
-rw-r--r--fonts/utilities/ttf2pt1/other/Makefile20
-rw-r--r--fonts/utilities/ttf2pt1/other/README.html146
-rw-r--r--fonts/utilities/ttf2pt1/other/bmpfont.h338
-rw-r--r--fonts/utilities/ttf2pt1/other/bz.c78
-rw-r--r--fonts/utilities/ttf2pt1/other/bzscreen.c220
-rw-r--r--fonts/utilities/ttf2pt1/other/bzscreen.h40
-rw-r--r--fonts/utilities/ttf2pt1/other/cmpf.c67
-rwxr-xr-xfonts/utilities/ttf2pt1/other/cntstems.pl50
-rw-r--r--fonts/utilities/ttf2pt1/other/dmpf.c53
-rwxr-xr-xfonts/utilities/ttf2pt1/other/lst.pl65
-rwxr-xr-xfonts/utilities/ttf2pt1/other/showg633
-rw-r--r--fonts/utilities/ttf2pt1/pt1.c5878
-rw-r--r--fonts/utilities/ttf2pt1/pt1.h229
-rw-r--r--fonts/utilities/ttf2pt1/runt1asm.c61
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/convert367
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/convert.cfg.sample194
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/forceiso428
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/frommap24
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/html2man231
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/inst_dir43
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/inst_file17
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/mkrel104
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/t1fdir227
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/trans164
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/unhtml22
-rwxr-xr-xfonts/utilities/ttf2pt1/scripts/x2gs118
-rw-r--r--fonts/utilities/ttf2pt1/t1asm.c604
-rw-r--r--fonts/utilities/ttf2pt1/ttf.c1480
-rw-r--r--fonts/utilities/ttf2pt1/ttf.h172
-rw-r--r--fonts/utilities/ttf2pt1/ttf2pt1.1765
-rw-r--r--fonts/utilities/ttf2pt1/ttf2pt1.c2334
-rw-r--r--fonts/utilities/ttf2pt1/ttf2pt1_convert.1506
-rw-r--r--fonts/utilities/ttf2pt1/ttf2pt1_x2gs.1313
-rw-r--r--fonts/utilities/ttf2pt1/version.h7
-rw-r--r--fonts/utilities/ttf2pt1/winbuild.bat9
-rw-r--r--fonts/utilities/ttf2pt1/windows.h93
-rw-r--r--fonts/utilities/unadobe/unAdobe.hqx162
-rw-r--r--fonts/utilities/vfinst/1vfinst808
-rw-r--r--fonts/utilities/vfinst/2vfinst963
-rw-r--r--fonts/utilities/vfinst/ASE2ALT.MTX75
-rw-r--r--fonts/utilities/vfinst/ASE2EXP.MTX187
-rw-r--r--fonts/utilities/vfinst/DOA2E354
-rw-r--r--fonts/utilities/vfinst/INSTALL36
-rw-r--r--fonts/utilities/vfinst/OT19vf.etx27
-rw-r--r--fonts/utilities/vfinst/OT1c9vf.etx55
-rw-r--r--fonts/utilities/vfinst/OT1i9vf.etx26
-rw-r--r--fonts/utilities/vfinst/OT1pacl.etx789
-rw-r--r--fonts/utilities/vfinst/OT1padl.etx780
-rw-r--r--fonts/utilities/vfinst/OT1sw.etx28
-rw-r--r--fonts/utilities/vfinst/README52
-rw-r--r--fonts/utilities/vfinst/T19vf.etx25
-rw-r--r--fonts/utilities/vfinst/T1c9vf.etx54
-rw-r--r--fonts/utilities/vfinst/T1sw.etx28
-rw-r--r--fonts/utilities/vfinst/dotlessj.mtx43
-rw-r--r--fonts/utilities/vfinst/example/OT1put.fd93
-rw-r--r--fonts/utilities/vfinst/example/cleanup.bat23
-rw-r--r--fonts/utilities/vfinst/example/fonts.lst10
-rw-r--r--fonts/utilities/vfinst/example/makefont.tex48
-rw-r--r--fonts/utilities/vfinst/example/maketfm.bat54
-rw-r--r--fonts/utilities/vfinst/example/mkdirs.bat6
-rw-r--r--fonts/utilities/vfinst/example/newnames.bat6
-rw-r--r--fonts/utilities/vfinst/example/psfonts.new9
-rw-r--r--fonts/utilities/vfinst/example/putb7t.vpl2332
-rw-r--r--fonts/utilities/vfinst/example/putb8a.afm1005
-rw-r--r--fonts/utilities/vfinst/example/putb8a.pfbbin0 -> 36580 bytes
-rw-r--r--fonts/utilities/vfinst/example/putb8a.pl910
-rw-r--r--fonts/utilities/vfinst/example/putb8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putbc7t.vpl2324
-rw-r--r--fonts/utilities/vfinst/example/putbi7t.vpl2424
-rw-r--r--fonts/utilities/vfinst/example/putbi8a.afm1017
-rw-r--r--fonts/utilities/vfinst/example/putbi8a.pfbbin0 -> 37836 bytes
-rw-r--r--fonts/utilities/vfinst/example/putbi8a.pl910
-rw-r--r--fonts/utilities/vfinst/example/putbi8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putbic7t.vpl2436
-rw-r--r--fonts/utilities/vfinst/example/putbn7t.vpl2764
-rw-r--r--fonts/utilities/vfinst/example/putbni7t.vpl2856
-rw-r--r--fonts/utilities/vfinst/example/putbo7t.vpl2449
-rw-r--r--fonts/utilities/vfinst/example/putbo8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putbu7t.vpl2327
-rw-r--r--fonts/utilities/vfinst/example/putbu8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putfonts.bat11
-rw-r--r--fonts/utilities/vfinst/example/putr7t.vpl2358
-rw-r--r--fonts/utilities/vfinst/example/putr8a.afm1029
-rw-r--r--fonts/utilities/vfinst/example/putr8a.pfbbin0 -> 36350 bytes
-rw-r--r--fonts/utilities/vfinst/example/putr8a.pl910
-rw-r--r--fonts/utilities/vfinst/example/putr8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putrc7t.vpl2395
-rw-r--r--fonts/utilities/vfinst/example/putri7t.vpl2386
-rw-r--r--fonts/utilities/vfinst/example/putri8a.afm1008
-rw-r--r--fonts/utilities/vfinst/example/putri8a.pfbbin0 -> 37599 bytes
-rw-r--r--fonts/utilities/vfinst/example/putri8a.pl910
-rw-r--r--fonts/utilities/vfinst/example/putri8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putric7t.vpl2437
-rw-r--r--fonts/utilities/vfinst/example/putrn7t.vpl2790
-rw-r--r--fonts/utilities/vfinst/example/putrni7t.vpl2818
-rw-r--r--fonts/utilities/vfinst/example/putro7t.vpl2475
-rw-r--r--fonts/utilities/vfinst/example/putro8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putru7t.vpl2301
-rw-r--r--fonts/utilities/vfinst/example/putru8r.pl1384
-rw-r--r--fonts/utilities/vfinst/example/putvftf.bat47
-rw-r--r--fonts/utilities/vfinst/example/testltx.tex51
-rw-r--r--fonts/utilities/vfinst/example/testpln.tex68
-rw-r--r--fonts/utilities/vfinst/example/vfinst.vlg101
-rw-r--r--fonts/utilities/vfinst/famnames1053
-rw-r--r--fonts/utilities/vfinst/latinx.mtx1677
-rw-r--r--fonts/utilities/vfinst/map.a2d433
-rw-r--r--fonts/utilities/vfinst/map.n2a1067
-rw-r--r--fonts/utilities/vfinst/map.sup31
-rw-r--r--fonts/utilities/vfinst/minoff.mtx44
-rw-r--r--fonts/utilities/vfinst/numoff.mtx26
-rw-r--r--fonts/utilities/vfinst/osfon.mtx34
-rw-r--r--fonts/utilities/vfinst/padalt.MTX35
-rw-r--r--fonts/utilities/vfinst/smcapon.mtx53
-rw-r--r--fonts/utilities/vfinst/uline.mtx305
-rw-r--r--fonts/utilities/vfinst/vfinst52
-rw-r--r--fonts/utilities/vfinst/vfinst.dos74
-rw-r--r--fonts/utilities/vfinst/vfinst.lib430
-rw-r--r--fonts/utilities/vfinst/vfinst.par75
-rw-r--r--fonts/utilities/vfinst/vfinst.pdfbin0 -> 134537 bytes
-rw-r--r--fonts/utilities/vfinst/vfinst.rc40
-rw-r--r--fonts/utilities/vfinst/vfinst.tex882
-rw-r--r--fonts/utilities/vfinst/vfinst.unx74
-rw-r--r--fonts/utilities/vfinst/x.mtx14
-rw-r--r--fonts/utilities/vplutils/Makefile79
-rw-r--r--fonts/utilities/vplutils/README41
-rw-r--r--fonts/utilities/vplutils/encodings/ASCII.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMmathex.enc66
-rw-r--r--fonts/utilities/vplutils/encodings/CMmathit.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMsymbol.enc57
-rw-r--r--fonts/utilities/vplutils/encodings/CMtext.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMtextit.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMtypewriter.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/DC.enc80
-rw-r--r--fonts/utilities/vplutils/encodings/EC.enc88
-rw-r--r--fonts/utilities/vplutils/encodings/extex.enc79
-rw-r--r--fonts/utilities/vplutils/encodings/isolatin1.enc54
-rw-r--r--fonts/utilities/vplutils/encodings/standard.enc52
-rw-r--r--fonts/utilities/vplutils/encodings/symbol.enc58
-rw-r--r--fonts/utilities/vplutils/maketext19
-rw-r--r--fonts/utilities/vplutils/makevpl.man187
-rw-r--r--fonts/utilities/vplutils/makevpl.pl628
-rw-r--r--fonts/utilities/vplutils/parseenc.pl111
-rw-r--r--fonts/utilities/vplutils/parsepl.pl254
-rw-r--r--fonts/utilities/vplutils/paths.pl51
-rw-r--r--fonts/utilities/vplutils/spacevpl.man85
-rw-r--r--fonts/utilities/vplutils/spacevpl.pl349
1127 files changed, 416637 insertions, 0 deletions
diff --git a/fonts/utilities/JustFontItTE/README b/fonts/utilities/JustFontItTE/README
new file mode 100644
index 0000000000..c10ee5ddc2
--- /dev/null
+++ b/fonts/utilities/JustFontItTE/README
@@ -0,0 +1,95 @@
+JustFontIt(tm) TeX Edition, version 1.1.
+
+JustFontIt(tm) TeX Edition is freeware.
+
+Please read the license agreement (see license.txt) before
+using JustFontIt(tm) TeX Edition.
+
+==========================================================
+
+JustFontIt(tm) TeX Edition for Windows is designed for
+Windows 2000 or later. However, it may run (whilst never
+tested) under ealier versions of Windows.
+
+JustFontIt(tm) TeX Edition Beta for Linux is known to run under
+Red Hat Enterprise Linux 4 and SUSE Linux 10.1. The feedback
+regarding your experience of running JustFontIt under other
+Linux systems is welcome.
+
+==========================================================
+
+INSTALLATION
+
+a) Linux
+
+Copy jfite to /user/bin on your computer. Copy documentation
+to a desired location on your computer.
+
+b) Windows
+
+Copy jfite.exe and accompaning files to a desired location
+on your computer.
+
+UNINSTALLATION
+
+a) Linux
+
+Delete jfite and accompaning files from your computer.
+
+b) Windows
+
+Delete jfite.exe and accompaning files from your computer.
+JustFontIt(tm) TeX Edition does not modify your operating
+system, i.e. no changes to Windows Registry, system files
+or folders are made.
+
+==========================================================
+
+FIRST STEPS
+
+a) Linux
+
+Run
+
+jfite
+
+from the command line and read brief help. In case of
+further questions, refer to program documentation
+(JFITEDocsLinux.pdf). Reading the documentation requires
+PDF reading software (like Adobe Reader) installed
+on the computer.
+
+b) Windows
+
+Run
+
+jfite.exe
+
+from the command line and read brief help. In case of
+further questions, refer to program documentation
+(JFITEDocsWin32.pdf). Reading the documentation requires
+PDF reading software (like Adobe Reader) installed
+on the computer.
+
+In case of further questions, please email to
+support@justfontit.com.
+
+==========================================================
+
+COPYRIGHT AND TRADEMARKS
+
+JustFontIt(tm) TeX Edition is
+copyright (c) Alexei V. Kostin, 2006-2007. All rights reserved.
+
+JustFontIt is a trademark Alexei V. Kostin.
+
+The following are trademarks or registered trademarks of
+their respective owners:
+
+Adobe, Adobe Reader of Adobe Systems Inc.
+Windows of Microsoft Corp.
+
+All other trademarks are the property of their respective
+owners.
+
+==========================================================
diff --git a/fonts/utilities/TrueTypeToType42/ReadMe.html b/fonts/utilities/TrueTypeToType42/ReadMe.html
new file mode 100644
index 0000000000..6cb0080cfb
--- /dev/null
+++ b/fonts/utilities/TrueTypeToType42/ReadMe.html
@@ -0,0 +1,192 @@
+<H2 align=center B>TrueType Font to PostScript Type 42 Conversion</H3>
+
+<H2 align=center B>Using Program TrueTypeToType42.ps</H2>
+
+<P>
+TrueType fonts are widely available but cannot be used directly in
+current versions of PostScript, levels 1 through 3, although, with
+Adobe's introduction of Open Type fonts, that may change in the future.
+To overcome this, several programs have been written which create a
+PostScript Type 1 font from a TrueType font.
+</P>
+<P>
+With level 2.013 PostScript, Adobe introduced a new font category, Type
+42, which is, to use Adobe's own words, a TrueType font wrapped in some
+PostScript code. Actually the complexity of the conversion is
+considerably more than the word <I>wrapped</I> implies and, although the
+preponderant view is that the use of Type 42 gives better printed
+output than conversion to Type 1, few programs for the conversion to
+Type 42 exist.
+</P>
+<P>
+This document describes the use of the PostScript program
+TrueTypeToType42.ps to generate the equivalent PostScript Type 42 font
+file from a TrueType font file. The actual work of <i>wrapping</i> is done
+by the GhostScript procedure .loadttfont and this program simply
+operates on the resulting file. I don't know when .loadttfont was
+introduced into GhostScript but I developed this program using version
+6.5 and am now using it with version 7.0.
+</P>
+
+<H3 B> Preliminaries </H3>
+
+<P>
+You will probably wish to make two minor changes to the program before
+running it.
+</P>
+<UL>
+<LI> The value of the key /Path is the folder where the output files
+ will be created. It is currently set to D:\Temp and you may wish
+ change it. Search for /Path and change its value making sure you
+ retain the parentheses enclosing it. Note that this folder must
+ already exist, the program will not create it for you.
+<LI> The <I>setpagedevice</I> dictionary is set for simplex
+ printing from tray 3. You will probably wish to change these to
+ suit your printer. In your editor, search for <I>setpagedevice</I>
+ and change the value of /Duplex to true and the value of
+ /MediaPosition to whatever suits you printer.
+</UL>
+
+<H3 B> Running the program </H3>
+<P>
+TrueTypeToType42.ps is run under GhostScript from the command prompt
+with the command line:</P>
+
+<P style="margin-left=24">&#60Full path name of GhostScript executable&#62</P>
+<P style="margin-left=48">-I&#60Full path to the GhostScript main folder&#62</P>
+<P style="margin-left=72">-- &#60Full path name of the conversion program&#63</P>
+<P style="margin-left=96">&#60Full path name of the TrueType font&#63</P>
+
+<P> Note </P>
+<UL>
+<LI> This is a single command line, it has been folded into four parts
+because of its great length.
+<LI> The double hyphen at the start of the third line is part of the command.
+<LI> The program will not run under GhostView.
+</UL>
+
+<H3 B> Output files </H3>
+
+<P>
+The program generates three files, all in a folder of your choice (see
+<i>Preliminaries</i> above). The files are:
+</P>
+<UL>
+<LI>
+ The Type 42 equivalent of the TrueType font. The root name of this
+ file is the PostScript name of the font and its extension is .pfa.
+ For example, the name of the font defined by the TrueType file
+ times.ttf is TimesNewRomanPSMT and the name of its Type 42
+ equivalent is TimesNewRomanPSMT.pfa. The length of the Type 42 file
+ is about twice that of the TrueType original. As the .pfa extension
+ implies, the Type 42 file can be treated as any other .pfa file.
+<LI>
+ A PostScript file called ShowAllGlyphs.ps which will display under
+ GhostView or cause a PostScript printer to print a table of all the
+ glyphs defined by the font alongside their names. This file contains
+ a copy of the Type 42 font file in its prologue so that it is self
+ contained and can be displayed in GhostView or printed without
+ downloading the font.
+<LI>
+ A report on the operation of the program in file
+ TrueTypeToType42.out.
+</UL>
+<P>
+The folder into which these files are placed is defined in the setup
+section of the program as the value of the key /Path. This must be set
+to suit your system. Go to the program line %%BeginSetup. After it you will find
+a few lines of comments and the line in question. Modify
+the contents of the string being careful to maintain the parentheses
+enclosing it. Note that the folder must already exist, the program will
+not create it for you.
+</P>
+<P>
+Since TrueTypeToType42.ps is a PostScript file, it should run on any
+platform, i.e. Unix, Linux, Macs, PCs, provided there is a recent
+version of GhostScript installed. I am not sure of the precise meaning
+of recent but I have run the program under GhostScript 6.5 and 7.0.
+</P>
+<P>
+The Type 42 file has the extension .pfa and can be treated as a normal
+.pfa file. For example:
+</P>
+<UL>
+<LI> The font can be renamed by changing the value of the /FontName key.
+<LI> The font can be reencoded by changing its Encoding vector.
+<LI> The font file can be included in a PostScript file.
+<LI> The font file can be stored on a printer hard disk.
+</UL>
+
+<H3 B> Running under Windows </H3>
+
+<P>
+What follows is a description of the way I run TrueTypeToType42 on my
+system which is a PC under Windows 2000. I hope they will provide
+pointers to its use in other systems.&nbsp;
+I am currently using GhostScript 7.00.
+</P>
+
+<H4 B> Storing the TrueType files </H4>
+<P>
+A large number of TrueType fonts came with my copy of Windows 2000. They
+are by default placed in folder C:\Winnt\Fonts. This folder has special
+properties for working with the Windows font software and I have found
+it more convenient to keep a copy of all TrueType fonts in folder
+C:\TrueTypeFonts and to convert them from there.
+</P>
+<H4 B> My command line </H4>
+<P>
+My command line is:
+</P>
+<P style="margin-left=24">C:\GS\GS7.00\bin\gswin32 -IC:\GS\GS7.00</P>
+<P style="margin-left=48">-- D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps</P>
+<P style="margin-left=72">C:\TrueTypeFonts\&#60name of the TrueType font file&#62</P>
+<P>
+To get round the great length of this command, I have created a
+batch file called TTF2T42WE.bat. This can be run from the Windows
+command prompt but I find it more convenient to run it from within
+Windows Explorer.
+</P>
+
+<H4 B> Running from the command prompt </H4>
+<P>
+To run it from the Windows command prompt, first place a copy of
+TTF2T42WE.bat in a folder on your path. I have it in C:\BatchFiles.
+Then, at the comman prompt, enter TTF2T42WE followed by the full path name of the TrueType
+font to be converted. Pressing Enter will then start the program
+and create the three output files. If the current folder is the one
+containing the TrueType file, you can enter only the name of the
+TrueType file rather than its full path name.
+</P>
+
+<H4 B> Running in Windows Explorer </H4>
+<P>
+If you prefer to operate from Windows Explorer, as I do, place a copy
+of TTF2T42WE.bat in your <I>SendTo</I> folder which in my case is:
+</P>
+<P align=center>
+ C:\Documents and Settings\Thomas H. Barton\SendTo
+</P>
+<P>
+To use this batch file:
+</P>
+<OL>
+<LI> Start Windows Explorer.
+
+<LI> Move to the folder containing the TrueType file.
+
+<LI> Right click on the TrueType file. This displays a list of
+ activities.
+
+<LI> On this list, left click on <I>SendTo</I> to display another list of activities
+ one of which is TTF2T42WE.
+
+<LI> Left click on TTF2T42WE. This invokes the conversion program. The three
+ output files are placed in the folder specified by the /Path key
+ in TrueTypeToType42.ps.
+</OL>
+<P>
+Thomas H. Barton, April 2002
+</P>
+<P>
+thbarton@shaw.ca \ No newline at end of file
diff --git a/fonts/utilities/TrueTypeToType42/ReadMe.txt b/fonts/utilities/TrueTypeToType42/ReadMe.txt
new file mode 100644
index 0000000000..a5abb875df
--- /dev/null
+++ b/fonts/utilities/TrueTypeToType42/ReadMe.txt
@@ -0,0 +1,151 @@
+TrueType Font to PostScript Type 42 Conversion
+Using Program TrueTypeToType42.ps
+
+TrueType fonts are widely available but cannot be used directly in
+current versions of PostScript, levels 1 through 3, although, with
+Adobe's introduction of Open Type fonts, that may change in the future.
+To overcome this, several programs have been written which create a
+PostScript Type 1 font from a TrueType font.
+
+With level 2.013 PostScript, Adobe introduced a new font category, Type
+42, which is, to use Adobe's own words, a TrueType font wrapped in some
+PostScript code. Actually the complexity of the conversion is
+considerably more than the word "wrapped" implies and, although the
+preponderant view is that the use of Type 42 gives better printed
+output than conversion to Type 1, few programs for the conversion to
+Type 42 exist.
+
+This document describes the use of the PostScript program
+TrueTypeToType42.ps to generate the equivalent PostScript Type 42 font
+file from a TrueType font file. The actual work of "wrapping" is done
+by the GhostScript procedure .loadttfont and this program simply
+operates on the resulting file. I don't know when .loadttfont was
+introduced into GhostScript but I developed this program using version
+6.5 and am now using it with version 7.0.
+
+Preliminaries
+
+Before you can run the program, you will probably have to make two
+minor changes to it to suit your system.
+
+First, the value of the key /Path is the full path name of the folder
+where the output files are stored. This is currently set to D:\Temp and
+you may wish to change it. Search for /Path and change its value. Note
+that this folder must exist, the program will not create it for you.
+
+Second, the setpagedevice dictionary is set for simplex printing,
+taking the paper from media position 3. To change these, search for
+setpagedevice and change the value of /Duplex to true and the value of
+/MediaPosition to whatever suits your printer.
+
+Running the program
+
+TrueTypeToType42.ps is run under GhostScript from the command prompt
+with the command line:
+
+<Full path name of GhostScript executable>
+ -I<Full path to the GhostScript main folder>
+ -- <Full path name of the conversion program>
+ <Full path name of the TrueType font>
+
+NB This is a single command line, it has been folded to fit the text
+width. Note that the double hyphen at the start of the third line is
+part of the command.
+
+The program generates three files, all in a folder of your choice (see
+preliminaries above). The files are:
+
+ The Type 42 equivalent of the TrueType font. The root name of this
+ file is the PostScript name of the font and its extension is .pfa.
+ For example, the name of the font defined by the TrueType file
+ times.ttf is TimesNewRomanPSMT and the name of its Type 42
+ equivalent is TimesNewRomanPSMT.pfa. The length of the Type 42 file
+ is about twice that of the TrueType original. As the .pfa extension
+ implies, the Type 42 file can be treated as any other .pfa file.
+
+ A PostScript file called ShowAllGlyphs.ps which will display under
+ GhostView or cause a PostScript printer to print a table of all the
+ glyphs defined by the font alongside their names. This file contains
+ a copy of the Type 42 font file in its prologue so that it is self
+ contained and can be displayed in GhostView or printed without
+ downloading the font.
+
+ A report on the operation of the program in file
+ TrueTypeToType42.out.
+
+The folder into which these files are placed is defined in the setup
+section of the program as the value of the key /Path. This must be set
+to suit your system. Go to the program line %%BeginSetup. After it you
+will find a few lines of comments and the the line in question. Modify
+the contents of the string being careful to maintain the parentheses
+enclosing it. Note that the folder must already exist, the program will
+not create it for you.
+
+Since TrueTypeToType42.ps is a PostScript file, it should run on any
+platform, i.e. Unix, Linux, Macs, PCs, provided there is a recent
+version of GhostScript installed. I am not sure of the precise meaning
+of recent but I have run the program under GhostScript 6.5 and 7.0.
+
+The Type 42 file has the extension pfa and can be treated as a normal
+pfa file. For example:
+ The font can be renamed by changing the value of the /FontName key.
+ The font can be reencoded by changing its Encoding vector.
+ The font file can be included in a PostScript file.
+ The font file can be stored on a printer hard disk.
+
+Running in Windows
+
+What follows is a description of the way I run TrueTypeToType42 on my
+system which is a PC under Windows 2000. I hope they will provide
+pointers to its use in other systems.
+
+A large number of TrueType fonts came with my copy of Windows 2000. They
+are by default placed in folder C:\Winnt\Fonts. This folder has special
+properties for working with the Windows font software and I have found
+it more convenient to keep a copy of all TrueType fonts in folder
+C:\TrueTypeFonts and to convert them from there.
+
+I am currently using GhostScript 7.00.
+
+My command line is:
+
+C:\GS\GS7.00\bin\gswin32 -IC:\GS\GS7.00
+ -- D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps
+ C:\TrueTypeFonts\<name of the TrueType font file>
+
+To get round the great length of this command, I have created a
+batch file called TTF2T42WE.bat. This can be run from the Windows
+command prompt but I find it more convenient to run it from within
+Windows Explorer.
+
+To run it from the Windows command prompt, first place a copy of
+TTF2T42WE.bat in a folder on your path. I have it in C:\BatchFiles.
+Then enter TTF2T42WE followed by the full path name of the TrueType
+font to be converted. Pressing Enter will then start the program
+and create the three output files. If the current folder is the one
+containing the TrueType file, you can enter only the name of the
+TrueType file rather than its full path name.
+
+If you prefer to operate from Windows Explorer, as I do, place a copy
+of TTF2T42WE.bat in your SendTo folder which in my case is:
+
+ C:\Documents and Settings\Thomas H. Barton\SendTo
+
+To use this batch file:
+
+ Start Windows Explorer.
+
+ Move to the folder containing the TrueType file.
+
+ Right click on the TrueType file. This displays a list of
+ activities.
+
+ On this list, click on SendTo to display another list of activities
+ one of which is TTF2T42WE.
+
+ Left click on TTF2T42WE. This invokes the conversion program. The three
+ output files are placed in the folder specified by the /Path key
+ in TrueTypeToType42.ps.
+
+Thomas H. Barton, April 2002
+thbarton@shaw.ca
diff --git a/fonts/utilities/TrueTypeToType42/TTF2T42WE.bat b/fonts/utilities/TrueTypeToType42/TTF2T42WE.bat
new file mode 100644
index 0000000000..3be7820c69
--- /dev/null
+++ b/fonts/utilities/TrueTypeToType42/TTF2T42WE.bat
@@ -0,0 +1,73 @@
+echo off
+REM TTF2T42WE.bat is a modified version of TTF2T42.bat file indtended for use
+REM within the Microsoft Windows Explorer environment. Before you can
+REM use it:
+REM 1. Modify the command line below (it starts with C:\GS) to
+REM reflect where GhostScript and TrueTypeToType42.ps are
+REM located in your own folder structure.
+REM 2. Place a copy of the modified file in your SendTo folder.
+REM (The path name of my SendTo folder is:
+REM C:\Documents and Settings\Thomas H. Barton\SendTo
+REM )
+REM
+REM To use TTF2T42WE.bat to create the PostScript type 42 version of a
+REM TrueType font,
+REM 1. Start Windows Explorer.
+REM 2. Move to the folder containing the TrueType font. (My
+REM TrueType fonts which came with Windows 2000 are by default
+REM placed in folder C:\WINNT\Fonts. This folder has special
+REM properties suited to the Microsoft font software. To
+REM overcome the difficutlies caused by this, I have copied the
+REM font files to folder C:\TrueType\ and convert them from
+REM there.)
+REM 3. Right click on the font. This unfurls a short menu of
+REM choices.
+REM 4. Left click on SendTo. This unfurls another menu of choices.
+REM 5. Left click on TTF2T42WE.bat. This starts up the conversion
+REM process within GhostScript.
+REM Three output files are created in the directory specified by the
+REM value of the key /Path in file TrueTypeToType42.ps. In Windows
+REM Explorer, it is a trivial matter to transfer these files to wherever
+REM you may need them.(I use folder D:\Temp for this purpose but you
+REM can change the value of /Path to suit your own needs.)
+REM
+REM The three files which are created are:
+REM 1. The type 42 equivalent of the TrueType file.
+REM 2. A PostScript file called ShowAllGlyphs.ps which will
+REM print a table of all the names and appearances of all the
+REM glyphs defined by the font.
+REM 3. A text file called TrueTypeToType42.out containing a report
+REM on the progress of program TrueTypeTpType42.ps.
+REM
+REM The root name of the type 42 file is the PostScript name of the
+REM font and its extension is .pfa. For example TrueType file arial.ttf
+REM defines font ArialMT and its type 42 equivalent is called
+REM ArialMT.pfa. This file can be used like a Type 1 PFA file:
+REM a. It can be inserted as-is into the prologue of any PostScript
+REM file using the font.
+REM b. It can be downloaded as-is to a printer hard disk.
+REM c. It can be renamed and/or reencoded.
+REM
+REM File ShowAllGlyphs.ps can be displayed in GhostView or can be
+REM downloaded to a printer whose PostScript can recognise type 42 fonts.
+REM (This capability was introduced about half way through the life of level
+REM 2 PostScript.) I use it with PostScript interpreter version
+REM 2011.110 and have used it with GhostScript versions 6.5 and 7.0. The
+REM file is self contained, i.e. there is a copy of the type 42 file in
+REM its prologue.
+REM
+REM File TrueTypeToType42.out is almost identical to the report which
+REM is made to the screen during the running of TrueTypeToType42.ps under
+REM GhostScript. You probably only need to look at it if you are having
+REM problems.
+if "%1"=="" goto G1
+if not exist %1 goto G2
+C:\GS\GS7.00\bin\gswin32 -IC:\GS\GS7.00 -- D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps %1
+goto End
+:G1 echo  You must give the root name of the TTF file as the command
+echo line argument. Please try again.
+goto End
+:G2 echo  I cannot file the TrueType input file %1.ttf in folder
+echo C:\Winnt\Fonts. Please check and try again.
+goto End
+:End \ No newline at end of file
diff --git a/fonts/utilities/TrueTypeToType42/TrueTypeToType42.ps b/fonts/utilities/TrueTypeToType42/TrueTypeToType42.ps
new file mode 100644
index 0000000000..006582a851
--- /dev/null
+++ b/fonts/utilities/TrueTypeToType42/TrueTypeToType42.ps
@@ -0,0 +1,662 @@
+%!PS-Adobe-3.0
+%%Title: TrueTypeToType42.ps
+%%Creator: T.H.Barton
+%%CreationDate: May 2001
+%%BoundingBox: 0 0 612 792
+%%Pages: 1
+% Usage:
+% This program runs under GhostScript, (NB it will not run under GhostView),
+% to produce the PostScript type 42 font equivalent of a TrueType font. It
+% uses the GhostScript .loadttfont procedure to load the Type 42 font
+% dictionary on the stack and, to have access to this command, you must
+% use a recent version of GhostScript. I developed the program using
+% GhostScript 6.51 and am now running it under version 7.00.
+% The command line is:
+% <Full path name to GhostScript exec file> -IC:\GS\GS7.00 == <Full path name of this file> <Full path name of the input ttf file>
+% In my own case, the full path name of my GhostScript file is:
+% C:\GS\GS7.00\bin\gswin32.exe
+% The full path name of this file, i.e. the file you are reading, is:
+% D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps
+% All my TrueType fonts are in folder C:\Winnt\Fonts so that the
+% full path name of Arial.ttf is:
+% C:\Winnt\Fonts\Arial.ttf
+% and the command to start the conversion on my machine is:
+% C:\GS\GS6.50\bin\gswin32.exe -IC:\GS\GS6.51 == D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps C:\Winnt\Fonts\Arial.ttf
+% I have incorporated most of this into a batch file so that I
+% only have to enter the root name, i.e. without the extension .TTF,
+% of the True Type font file.
+%
+% Three output files are produced, all in the directory designated as
+% the value of the /Path key. Change this value to suit your needs.
+% Search for /Path, you will find it about line 306.
+% One output file is the PostScript Type 42 file. Its root name
+% is the name of the font. In the case of Arial, it is ArialMT.
+% Its extension is .pfa.
+% The second output file is called ShowAllGlyphs.ps. It is a PostScript
+% file which, when viewed in GhostScript or downloaded to a PostScript
+% printer, will display all the glyphs defined by the font alongside
+% their names in ASCII sort order. This file contains
+% in its prologue a copy of the Type 42 font file so that it is
+% and independent entity, i.e. you do not need the font in your
+% printer. The price paid for this convenience is the large size
+% of the file.
+% The third file is a permanent copy of the report made to the
+% GhostScript standard output window during execution of the
+% program. It is called TrueTypeToType42.out.
+%
+% Many TrueType fonts define a large number of glyphs, Arial.ttf defines
+% 1296, and program execution can take a long time even on a fairly
+% modern system. You are reassured that progress is being made during
+% the periods of seeming inactivity by numerous messages displayed on
+% the GhostScript standard output screen. These messages are also
+% copied to file TrueTypeToType42 so that you have a permanent record.
+% The screen shows a list of all the required and optional components
+% of the Type 42 file as listed in Tables 5.2, 5.3, and 5.7 of the
+% PostScript Language Reference. It states whether a component was
+% found or not found. If a required component is not found, you are
+% warned that PostScript will reject the font. The number of glyphs
+% defined by the font is displayed along with other potentially
+% useful information.
+%
+% The program uses three internally defined GhostScript commands,
+% .loadttfont, concatstrings, and .quit, which are not recognized
+% by standard PostScript.
+% .loadttfont is defined in the GhostScript file gs_tt.ps. It
+% converts a TrueType font to Type 42 and loads the Type 42 font
+% dictionary on the stack.
+% concatstrings takes two strings as its arguments, pops them
+% from the stack, concatenates them and leaves the result on
+% the stack.
+% I have not found a definition of .quit but it seems to require
+% two integers as input parameters and stops processing with the
+% GhostScript stdout window displaying an error code whose value
+% is the second of the two integers.
+%
+% TrueType fonts frequently define very large numbers of glyphs and,
+% as a consequence, may be large. My copy of Arial, defines 1296
+% glyphs and occupies 267 KB. Because the translation to Type 42
+% requires the conversion of eight bit character strings in sfnts
+% to hexadecimal strings, the Type 42 font file is almost twice as
+% long as the True Type file. In my case ArialMT.pfa contains 496 KB.
+%
+% I have set setpagedevice for simplex printing from the manual
+% input tray of my printer. You will wish to change these to
+% suit your printer. Search for setpagedevice and follow the comments
+% just above it. (You will find it at about line 619.)
+%
+%%EndComments
+%%BeginProlog
+% Procedure AAA takes a keyname expressed as a string as it sole
+% argument. Prior to use of AAA, the dictionary loaded on the stack
+% by applying .loadttfont to the TrueType font file, is given the name TTF.
+% Within the procedure, the string argument to AAA is called KN
+% and when required it is converted to a keyname by cvn. First,
+% it is established whether the key is defined within TTF
+% or not using the PostScript command known. If not, a message is
+% printed on stdout (the screen) and false is loaded on the stack.
+% If it is defined, the value of the key KN and true are loaded on
+% the stack, true in the top position and the value below it.
+%
+/AAA {
+ /KN exch def
+ TTF KN cvn known {
+ TTF KN cvn get
+ KN ( is defined in this font.\n) concatstrings print
+ RFO KN ( is defined in this font.\n) concatstrings writestring
+ true
+ }
+ {
+ KN ( not defined in this font.\n) concatstrings print
+ RFO KN ( not defined in this font.\n) concatstrings writestring
+ false
+ } ifelse
+} def
+/R 1 def /O 0 def
+% The following procedures translate the various components to suit the
+% Type 42 format. Some are used more than once, justifying their
+% creation. as procedures. Some are only used once but having them
+% as procedures clarifies the main program.
+/NumberProc {
+ /RorO exch def % RorO = Required or Optional
+ {
+ Outfile ( /) KN concatstrings ( ) concatstrings writestring
+ 20 string cvs (\n) concatstrings Outfile exch writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/NumericalMatrixProc {
+ /RorO exch def
+ {
+ Outfile ( /) KN concatstrings ( [ ) concatstrings writestring
+ {20 string cvs ( ) concatstrings Outfile exch writestring} forall
+ Outfile (]\n) writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/NameProc {
+ /RorO exch def
+ {
+ ( /FontName /) exch concatstrings (\n) concatstrings Outfile exch writestring
+ }
+ {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ RorO 1 eq {
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/DictProc {
+ /RorO exch def
+ {
+ Outfile ( /FontInfo\n <<\n) writestring
+ {
+ exch 20 string cvs Outfile ( /) writestring
+ Outfile exch writestring Outfile ( ) writestring
+ dup type (stringtype) eq {
+ Outfile (\() writestring
+ Outfile exch writestring
+ Outfile (\)\n) writestring
+ }
+ {
+ 20 string cvs Outfile exch writestring
+ Outfile (\n) writestring
+ } ifelse
+ } forall
+ Outfile ( >>\n) writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/EncodingProc {
+ /RorO exch def
+ {
+ Outfile ( /Encoding [\n) writestring
+ {
+ Outfile ( /) writestring
+ 48 string cvs Outfile exch writestring
+ Outfile (\n) writestring
+ } forall
+ Outfile ( ]\n) writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/CharStringsProc {
+% /NG 0 def
+ /RorO exch def
+ {
+ Outfile ( /CharStrings\n <<\n) writestring
+ {
+ exch
+ Outfile ( /) writestring
+ 48 string cvs dup Outfile exch writestring
+ GlyphArray i 3 2 roll put
+ Outfile ( ) writestring
+ 48 string cvs Outfile exch writestring
+ Outfile (\n) writestring
+ /i i 1 add def
+ } forall
+ Outfile ( >>\n) writestring
+ NG 20 string cvs print ( glyphs are defined in this font.\n) print flush
+ RFO NG 20 string cvs ( glyphs are defined in this font.\n) concatstrings writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+/SfntsProc {
+ /RorO exch def
+ {
+ /S1 1 string def
+ Outfile ( /sfnts [\n) writestring
+ {
+ Outfile ( <\n ) writestring
+ /ln 0 def
+ {
+ S1 exch 0 exch put
+ Outfile S1 writehexstring
+ /ln ln 1 add def
+ ln 36 eq {
+ /ln 0 def
+ Outfile (\n ) writestring
+ } if
+ } forall
+ Outfile (>\n) writestring
+ } forall
+ Outfile ( ]\n) writestring
+ }
+ {
+ RorO 1 eq {
+ Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring
+ Outfile (% Because it is a required parameter, the font will not be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ }
+ {
+ Outfile (% Because it is not a required parameter, the font will be\n) writestring
+ Outfile (% acceptable to PostScript.\n) writestring
+ } ifelse
+ } ifelse
+} def
+% PSS, = Print Stack and Stop, is a debugging aid. When called it prints
+% the contents of the stack at the time of the call and stops with error
+% code 88
+/PSS {(\n\nStack contents =\n) print pstack (End of stack contents\n\n) print 8 88 .quit} def
+%%EndProlog
+%%BeginSetup
+%
+% The value of the keyname Path is the full path to the location where you
+% want the output files. As you can see, I create them in D:\Temp\ and
+% transfer them from there to where I really wand them. You should change
+% this path to suit your needs.
+%
+/Path (D:\\Temp\\) def
+%%EndSetup
+mark
+shellarguments
+{
+ counttomark /narg exch def
+ narg 1 eq not {
+ (Error message #2 from TrueTypeToType42.ps\n) print
+ (The call to TrueTypeToType42.ps must have one command line argument.\n) print
+ ( The path name of the TTF file\n) print
+ (You have ) print narg 10 string cvs print ( arguments.\n) print
+ (Please correct and try again.\n\n\n) print
+ 9 99 .quit
+ } if
+}
+{
+ (Error message #1 from TrueTypeToType42.ps\n) print
+ (You must use the -- command line switch in the call to GhostScript.\n) print
+ (Please correct and try again.\n\n\n) print
+ 9 99 .quit
+} ifelse
+
+% The command line argument, converted to a string, is now on the stack.
+% It is the full path name of the TrueType font file.
+/InfilePath exch def pop
+
+% Open the TrueType font file for reading and call it Infile
+InfilePath (r) file /Infile exch def
+
+% Convert Infile to a Type 42 font dictionary, call that dictionary TTF,
+% and close Infile.
+Infile .loadttfont /TTF exch def
+Infile closefile
+
+% Get the number of glyphs and define an array to receive their names.
+TTF /CharStrings get length /NG exch def
+/GlyphArray NG array def /i 0 def
+
+% Get the PostScript name of the font and open the output
+% file using that for its root and .pfa for its extension.
+% Call this file Outfile.
+Path TTF /FontName get concatstrings (.pfa) concatstrings (w) file /Outfile exch def
+Outfile (%!PS-TrueType font\n) writestring
+
+% Open the report file in the current directory. This file receives,
+% in ASCII text format, the same report on the progress of this program
+% as is written to the GhostScript standard output window.
+/ReportFile (TrueTypeToType42.out) def
+Path ReportFile concatstrings /ReportPath exch def
+ReportPath (w) file /RFO exch def
+RFO (Report from TrueTypeToType42 on the conversion of file ) InfilePath concatstrings (\n) concatstrings writestring
+(\nThe font name is ) TTF /FontName get concatstrings (\n\n) concatstrings dup print
+RFO exch writestring
+% Open the Type 42 font dictionary file with left double guillemets.
+Outfile (<<\n) writestring
+
+% The next section is a search, and processing if found, of all the
+% required and optional elements of a Type 42 font dictionary as
+% laid out in tables 5.2, 5.3, and 5.7 of the PostScript Language
+% Reference, PLR.
+
+% Entries common to all font dictionaries, Table 5.2 of PLR
+
+% The value of FontType is an integer. Required
+(FontType) AAA R NumberProc
+
+% The value of Fontmatrix is a numerical matrix containing six numbers. Required
+(FontMatrix) AAA R NumericalMatrixProc
+
+% The value of /FontName is a name type object, e.g. /Times-Roman. Required
+(FontName) AAA R NameProc
+
+% The value of FontInfo is a dictionary whose contents are defined in
+% Table 5.5 of PLR. Optional
+(FontInfo) AAA O DictProc
+
+% The value of LanguageLevel is an integer. Optional
+(LanguageLevel) AAA O NumberProc
+
+% The value of WMode is an integer. Optional
+(WMode) AAA O NumberProc
+
+% Additional entries common to all base fonts, Table 5.3 of PLR
+
+% The value of Encoding is an array of names. Required
+(Encoding) AAA R EncodingProc
+
+% The value of FontBBox is a numerical array. Required
+(FontBBox) AAA R NumericalMatrixProc
+
+% The value of UniqueID is an integer. Optional
+(UniqueID) AAA O NumberProc
+
+% The value of XUID is a numerical array. Optional
+(XUID) AAA O NumericalMatrixProc
+
+% Additional entries specific to Type 42 fonts, Table 5.7
+
+% The value of CharStrings is a dictionary of glyph names and numbers.
+% Required
+(CharStrings) AAA R CharStringsProc
+
+% The value of sfnts is an array of strings. Required
+(sfnts) AAA R SfntsProc
+
+% The value of PaintType is an integer. Required
+(PaintType) AAA R NumberProc
+
+% The value of StrokeWidth is a number. Optional
+(StrokeWidth) AAA O NumberProc
+
+% The following four items are all optional and seem to rarely occur
+% in a TrueType font file. (I have not so far encountered any of them.)
+% If one or more are found, that will be the time to add the appropriate
+% processing procedure.
+
+% The value of Metrica is a dictionary. Optional
+(Metrics) AAA {
+ ==
+} if
+
+% The value of Metrics2 is a dictionary. Optional
+(Metrics2) AAA {
+ ==
+} if
+
+% The value of CDevProc is a procedure. Optional
+(CDevProc) AAA {
+ ==
+} if
+
+% The value of GlyphDirectory is either an array or dictionary. Optional
+(GlyphDirectory) AAA {
+ ==
+} if
+
+% Terminate the Type 42 font dictionary and name the font with the
+% name found as the value of the key /FontName
+Outfile (>> begin FontName currentdict end definefont pop\n) writestring
+Outfile closefile
+% Sorting the glyph names. A bubble sort is used. This is slow but is
+% easy to write. Please feel free to substitute a more efficient
+% algorithm.
+(Sorting the glyph names into ASCII order.\n) print
+(This may take several minutes depending on the number of glyphs.\n) print
+(PLEASE BE PATIENT.\n) print flush
+RFO (\nSorting the glyph names into ASCII order.\n) writestring
+RFO (This may take several minutes depending on the number of glyphs.\n) writestring
+RFO (PLEASE BE PATIENT.\n) writestring
+/nit 0 def
+{
+ /i 0 def /j 1 def /nex 0 def
+ /nit nit 1 add def
+ {
+ GlyphArray i get /S1 exch def
+ GlyphArray j get /S2 exch def
+ S1 S2 gt {
+ GlyphArray i S2 put
+ GlyphArray j S1 put
+ /nex nex 1 add def
+ } if
+ /i i 1 add def /j j 1 add def
+ j NG eq {
+ exit
+ } if
+ } loop
+ nex 0 eq {exit} if
+ nit 100 mod 0 eq {
+ (Traversed the array of glyph names ) print nit 20 string cvs print ( times.\n) print flush
+ RFO (Traversed the array of glyph names ) nit 20 string cvs concatstrings ( times.\n) concatstrings writestring
+ } if
+ nit NG 2 mul eq {
+ (Error message from TrueTypeToType42\n) print
+ (Bubble sort of glyph names not completed because of\n) print
+ (an excessive number of iterations.\n) print
+ ( nit = ) print 20 string cvs print (\n) print
+ RFO (\nError message from TrueTypeToType42\n) writestring
+ RFO (Bubble sort of glyph names not completed because of\n) writestring
+ RFO (an excessive number of iterations.\n) writestring
+ RFO ( nit = ) 20 string cvs concatstrings (\n) concatstrings writestrings
+ 8 88 .quit
+ } if
+} loop
+(Sort completed. The glyph array has been traversed ) print nit 20 string cvs print ( times.\n\n) print
+RFO (\nSort completed. The glyph array has been traversed ) nit 20 string cvs concatstrings ( times\n) concatstrings writestring
+% The glyph names are now in ASCII sort order in an array called GlyphArray.
+% Now determine the number of pages of output required for displaying all the glyphs
+NG 141 sub dup 0 le {pop /iii 0 def}{/iii exch def} ifelse
+iii 150 mod 0 eq {
+ iii 150 idiv 1 add /NPG exch def}
+ {
+ iii 150 idiv 2 add /NPG exch def
+} ifelse
+(Now create the file ShowAllGlyphs.ps which will display all ) print NG 20 string cvs print (\n) print
+(glyphs in ASCII sort order on ) print NPG 20 string cvs print ( pages of output.\n) print
+% Creating the PostScript file which will print the glyphs.
+% Open the output file for writing
+(D:\\Temp\\ShowAllGlyphs.ps) (w) file /OF exch def
+OF (%%!PS-Adobe-3.0\n) writestring
+OF (%%Title: ShowAllGlyphs.ps\n) writestring
+OF (%%Creator: TrueTypeTpType42.ps\n) writestring
+OF (%%CreationDate: April 2002\n) writestring
+OF (%%BoundingBox: 0 0 612 792\n) writestring
+OF (%%Pages: ) NPG 10 string cvs concatstrings (\n) concatstrings writestring
+OF (%%EndComments\n) writestring
+OF (%%BeginProlog\n) writestring
+% concatstrings is defined in GhostScript but not in PostScript so it
+% is put here for printing on a PostScript printer.
+OF (/concatstrings {\n) writestring
+OF ( /concatdict 6 dict def\n) writestring
+OF ( concatdict begin\n) writestring
+OF ( /s2 exch def\n) writestring
+OF ( /s1 exch def\n) writestring
+OF ( s1 length /l1 exch def\n) writestring
+OF ( s2 length /l2 exch def\n) writestring
+OF ( /strng l1 l2 add string def\n) writestring
+OF ( strng 0 s1 putinterval\n) writestring
+OF ( strng l1 s2 putinterval\n) writestring
+OF ( strng\n) writestring
+OF ( end\n) writestring
+OF (} def\n) writestring
+% Procedure ctr centers a string
+OF (/ctr{\n) writestring
+OF ( 4 -2 roll 2 copy translate\n) writestring
+OF ( 4 -2 roll exch dup rotate exch\n) writestring
+OF ( dup stringwidth pop 2 div neg 0 moveto show\n) writestring
+OF ( neg rotate\n) writestring
+OF ( neg exch neg exch translate\n) writestring
+OF (} def\n) writestring
+% Procedure dl draws a line between two points
+OF (/dl{moveto lineto stroke} def\n) writestring
+OF (/mt{moveto} def\n) writestring
+% Procedure nl starts a new line
+OF (/nl {\n) writestring
+OF ( count 0 eq {1.0}{\n) writestring
+OF ( dup type 20 string cvs dup\n) writestring
+OF ( (integertype) eq exch\n) writestring
+OF ( (realtype) eq xor not {1.0} if\n) writestring
+OF ( } ifelse\n) writestring
+OF ( dy mul neg yp add /yp exch store xp yp moveto\n) writestring
+OF (} def\n) writestring
+% Procedure rj right justifies a string
+OF (/rj{\n) writestring
+OF ( 4 -2 roll 2 copy translate\n) writestring
+OF ( 4 -2 roll exch dup rotate exch\n) writestring
+OF ( dup stringwidth pop neg 0 moveto show\n) writestring
+OF ( neg rotate\n) writestring
+OF ( neg exch neg exch translate\n) writestring
+OF (} def\n) writestring
+OF (/sg{setgray} def\n) writestring
+% Procedure PB1 grids the first page
+OF (/PB1 {\n) writestring
+OF ( 0.7 sg 2.0 slw 36 36 540 720 rectstroke\n) writestring
+OF ( 36 711 576 711 dl\n) writestring
+OF ( 216 36 216 711 dl 396 36 396 711 dl 0 sg\n) writestring
+OF (} def\n) writestring
+% Procedure PBX grids all pages after the first. It takes a single integer
+% argument, the page number and prints Page <number> at top right of page.
+OF (/PBX {\n) writestring
+OF ( gsave\n) writestring
+OF ( /ipg exch def\n) writestring
+OF ( 594 766 0 /Times-Bold 14 selectfont) ((Page )) concatstrings ( ipg 10 string cvs concatstrings rj\n) concatstrings writestring
+OF ( 0.7 sg 2.0 slw 36 36 540 720 rectstroke\n) writestring
+OF ( 216 36 216 756 dl 396 36 396 756 dl 0 sg\n) writestring
+OF ( grestore\n) writestring
+OF (} def\n) writestring
+OF (/sh{show} def\n) writestring
+OF (/slw{setlinewidth} def\n) writestring
+% Procedure F1 defines 12 point Times Roman for printing the glyph names and
+% procedure F2 defines the TrueType font at 12 points for printing the glyphs.
+OF (/F1 {/Times-Roman 12 selectfont} def\n) writestring
+OF (/F2 \{/) TTF /FontName get concatstrings ( 12 selectfont} def\n) concatstrings writestring
+% Open the Type 42 version of the font file for reading and call it FF
+Path TTF /FontName get concatstrings (.pfa) concatstrings (r) file /FF exch def
+% The following loop copies the Type 42 version of the font file to the glyph display file
+{
+ FF 500 string readline { % I have had problems with the length of this string. It seems to be long enough now but if you get an error message from readline, try increasing it.
+ OF exch (\n) concatstrings writestring
+ }
+ {
+ pop exit
+ } ifelse
+} loop
+FF closefile
+%
+OF (%%EndProlog\n) writestring
+OF (%%BeginSetup\n) writestring
+% I have set Duplex to false so that you can use this with a simplex only printer.
+% However, if you have duplex capability, you will probably want to use it
+% so change the value of Duplex to true.
+% I have also set MediaPosition to 3 to suit my printer. You will probably
+% have to change the value to suit your printer.
+OF (<< /Duplex false /MediaPosition 3 >> setpagedevice\n) writestring
+OF (/NG ) NG 20 string cvs concatstrings ( def\n) concatstrings writestring
+OF (%%EndSetup\n) writestring
+OF (%%Page: 1 1\n) writestring
+OF (/ypo 710 def /dy 14 def /xpo 42 def /xppo xpo 147 add def\n) writestring
+OF (PB1\n) writestring
+OF (/Times-Bold 18 selectfont\n) writestring
+OF ( 306 738 0 \() TTF /FontName get concatstrings ( Glyphs) concatstrings (\) ctr\n) concatstrings writestring
+OF (/Times-Bold 12 selectfont\n) writestring
+OF (306 723 0 (All ) NG 20 string cvs concatstrings ( glyphs are shown in ASCII sort order) concatstrings ctr\n) writestring
+OF (F2\n) writestring
+% Now print the first page
+(Creating the first page\n) print
+OF (/yp ypo def /xp xpo 180 sub def /xpp xp 147 add def\n) writestring
+/IG 0 def
+NG 144 gt {/RPT 144 def}{/RPT NG def} ifelse
+3 {
+ IG NG ge {exit} if
+ OF (/yp ypo def /xp xp 180 add def /xpp xpp 180 add def\n) writestring
+ 48 {
+ OF (1.0 nl F1 \() GlyphArray IG get concatstrings (\) show) concatstrings ( xpp yp mt ) concatstrings writestring
+ OF (F2 /) GlyphArray IG get concatstrings ( glyphshow\n) concatstrings writestring
+ /IG IG 1 add def
+ IG NG ge {exit} if
+ } repeat
+} repeat
+OF (showpage\n) writestring
+% If IG is greater than or equal to NG the job is done, else create subsequent pages.
+OF (/ypo ypo dy 3 mul add def\n) writestring
+/IPG 1 def
+{
+ IG NG ge {exit} if
+% The next line is a safety switch. If something goes wrong you may be stuck in this
+% loop forever. The next line exits if IPG exceeds 20. This allows for a maximum of
+% 3013 glyphs which is well beyond anything I have encountered. If it is too small,
+% increase the maximum page number to suit.
+ IPG 20 gt {exit} if
+ /IPG IPG 1 add def
+ (Creating page ) IPG 10 string cvs concatstrings (\n) concatstrings print
+ OF (%%Page: ) IPG 10 string cvs concatstrings ( ) concatstrings IPG 10 string cvs concatstrings (\n) concatstrings writestring
+ OF (/yp ypo def /xp xpo def\n) writestring
+ OF IPG 10 string cvs ( PBX\n) concatstrings writestring
+ OF (/yp ypo def /xp xpo 180 sub def /xpp xp 147 add def\n) writestring
+ NG 144 gt {/RPT 144 def}{/RPT NG def} ifelse
+ 3 {
+ IG NG ge {exit} if
+ OF (/yp ypo def /xp xp 180 add def /xpp xpp 180 add def\n) writestring
+ 51 {
+ OF (1.0 nl F1 \() GlyphArray IG get concatstrings (\) show) concatstrings ( xpp yp mt ) concatstrings writestring
+ OF (F2 /) GlyphArray IG get concatstrings ( glyphshow\n) concatstrings writestring
+ /IG IG 1 add def
+ IG NG ge {exit} if
+ } repeat
+ } repeat
+ OF (showpage\n) writestring
+} loop
+OF (%%Trailer\n) writestring
+OF (%%EOF) writestring
+OF closefile
+(Three output files have been created:\n) print
+( ) TTF /FontName get concatstrings (.pfa,\n) concatstrings print
+( ShowAllGlyphs.ps\n) print
+( TrueTypeToType42.out\n) print
+(They will be found in folder ) Path concatstrings (\n) concatstrings print
+%%Trailer
+%%EOF \ No newline at end of file
diff --git a/fonts/utilities/a2ac/README b/fonts/utilities/a2ac/README
new file mode 100644
index 0000000000..72dede55a1
--- /dev/null
+++ b/fonts/utilities/a2ac/README
@@ -0,0 +1,49 @@
+a2ac, ver. 2, Juni 1995, Petr Olsak (Ol\v{s}\'ak), olsak@math.feld.cvut.cz
+---------------------------------------------------------------------------
+
+The program a2ac (Afm To Afm plus Composites) enables to use
+PostScript fonts while typesetting texts in languages where accented
+letters are used. The font doesn't need to contain complete alphabet
+of a given language; the presence of mere accents themselves (no whole
+accented characters) is sufficient. The configuration files of the
+a2ac program are independent on the PostScript font encoding and on
+the typesetting system encoding. The program may be used to prepare a
+font for any typesetting system, but only \TeX{} was tested. Program
+was compiled for operation systems SUN OS, Linux and on DOS. May be, the
+program will work in others systems with C compiler.
+
+This package included following files:
+
+a2ac.c ... the source text in C language
+a2ac.exe ... the executable for DOS
+a2ac-eng.doc ... the English documentation
+a2ac-cz.doc ... the Czech documentation
+cscorr.tab ... an example of config file for a2ac (for Czech and Slovak)
+xl2.enc ... enc file for afm2tfm (\rm-like CS-encoding)
+xt2.enc ... enc file for afm2tfm (\tt-like CS-encoding)
+mkfnt ... a UNIX script for font preparing for TeX (CS-encoding)
+mkallfnt ... a UNIX script prepares 32 standard PostScript font
+test.tex ... test for 32 standard PostScript font in Czech and Slovak.
+README ... this file
+
+Program can be compiled in UNIX-like systems by the following line:
+
+cc a2ac.c -lm -o a2ac
+
+The make file is not necessary.
+
+Copyright: Program can be free used and distributed if the package is
+complete, i.e. all 11 files mentioned above are present without changes.
+The program cannot be included into greater packages without author's
+confirmation.
+
+The bug reports send me to my addres olsak@math.feld.cvut.cz, please.
+
+Notice: An article about this program was sent to TUG-boat editor and czech
+variant to TeXbulletin editor.
+
+Known bugs: The UNIX man page is not present now.
+
+
+
+
diff --git a/fonts/utilities/a2ac/a2ac-cz.doc b/fonts/utilities/a2ac/a2ac-cz.doc
new file mode 100644
index 0000000000..a8413d7435
--- /dev/null
+++ b/fonts/utilities/a2ac/a2ac-cz.doc
@@ -0,0 +1,582 @@
+ ****************************************************************
+ * Program a2ac *
+ ****************************************************************
+ verze 1, Èerven 95 Petr Ol¹ák
+
+Program a2ac (Afm To Afm add Composites) konvertuje afm soubory (Adobe
+Font Metrics) na nové soubory rovnì¾ ve formátu afm. Program pøitom naèítá
+tzv. definièní soubor, v nìm¾ je stanoveno, jaké zmìny se mají v afm
+formátu provést. Program pøedev¹ím pøidává nové kompozitní znaky a
+roz¹iøuje tabulku kernù o nové kerningové údaje podle jistých masek.
+
+Program se volá se tøemi parametry:
+
+ a2ac input.afm corr.tab output.afm
+
+První parametr je název vstupního (afm) souboru, druhý parametr oznaèuje
+definièní soubor obsahující definice zmìn, které se mají provést. Tøetí
+parametr je název výstupního souboru. Pøípony souborù (.afm, .tab) je
+nutno uvést, program si je nedomyslí.
+
+Pokud chceme vytvoøit log a nechceme zaplnit terminál mno¾stvím informací,
+mù¾eme napsat:
+
+ a2ac input.afm corr.tab output.afm > logfile
+
+Pøíkazový øádek volání programu bývá obvykle souèástí nìjakého scriptu nebo
+dávkového souboru (viz té¾ soubor readme.txt v balíku programu a2ac).
+
+K balíku programu je pøidán soubor cscorr.tab, který obsahuje definice
+korekcí, pomocí nich¾ lze vytvoøit èeský a slovenský font (tj. font
+obsahující znaky èeské a slovenské abecedy a vhodný kerning). Pøi pou¾ití
+tohoto souboru se pouze vy¾aduje, aby vstupní afm soubor obsahoval v¹echny
+akcenty pro èeské/slovenské znaky. To splòují napø. v¹echny standardní
+Adobe fonty. Výstupem je afm, obsahující navíc kompozitní znaky z cs
+abecedy a roz¹íøený kerning. Takto upravený font se dá pou¾ít napøíklad
+v TeXu.
+
+Pro zaøazení nového fontu do TeXu je mo¾no pou¾ít script "mkfnt".
+Ruènì se zaøazení provede v následujících krocích: (pro ilustraci
+výchozí standarní PostScriptový font má metriku s názvem font.afm).
+
+1. a2ac font.afm cscorr.tab cfont.afm
+ ... vytvoøí se metrika cfont.afm se v¹emi akcentovanými znaky.
+2. afm2tfm cfont.afm -t xil2.enc -v cfont rfont
+ ... vytvoøí se metrika rfont.tfm (potøebná pro dal¹í manipulace
+ s programem dvips) a virtuální popis cfont.vpl kódovaný podle
+ souboru xil2.enc.
+3. vptovf cfont.vpl cfont.vf cfont.tfm
+ ... vytvoøí se metrika vhodná pro TeX (cfont.tfm) a virtuální popis
+ cfont.vf pro ovladaè dvips.
+4. Obì tfm metriky (cfont, rfont) ulo¾íme do adresáøe s metrikami a
+ soubor cfont.vf ulo¾íme do adresáøe, kde jej ète dvips.
+ V konfiguraèním souboru pro dvips s názvem psfonts.map pøidáme øádek:
+ rfont Uplny-Nazev-PostScriptoveho-Fontu
+ Pokud font není rezidentnì v tiskárnì a máme tedy od nìj soubor typu
+ pfb, pak nový øádek v psfonts.map bude mít tvar:
+ rfont Uplny-Nazev-PostScriptoveho-Fontu </cesta/k/souboru.pfb
+ nebo v DOSu:
+ rfont Uplny-Nazev-PostScriptoveho-Fontu <disk:\cesta\k\souboru.pfb
+5. V souboru *.tex zavedeme font bì¾ným zpùsobem:
+ \font\muj=cfont {\muj tady je text v novém fontu}
+ Po zpracování TeXem a ovladaèem dvips máme text vysázený pøíslu¹ným fontem.
+
+Poznámka 1: V nìkterých instalacích DOSu je potøeba pøed provedením tøetího
+kroku soubor *.vpl naèíst do editoru a ulo¾it, èím¾ se upraví správnì konce
+øádkù (provede se transformace unix2dos).
+
+Poznámka 2: Program afm2tfm dodávaný v balíku CSTeX94 (19.disketa) je
+nepou¾itelný, proto¾e se jedná o starou verzi navíc pravdìpodobnì vùbec
+nechodivou. Je potøeba pou¾ít afm2tfm z nového balíku programu dvips.
+
+Poznámka 3: Pro prohlí¾eè a tiskárny nevybavené PostScriptem je
+vìt¹inou potøeba provést nìjaké opatøení. Nabízí se tyto tøi
+nejbì¾nìj¹í mo¾nosti:
+
+1. Pou¾ít Ghostscript pro konverzi z PostScriptu do jazyka tiskárny.
+2. Pou¾ít ps2pk pro konverzi PostScriptového fontu do formátu pk
+3. Pou¾ít náhradní font.
+
+První dvì mo¾nosti se mohou pou¾ít v pøípadì, ¾e font je v poèítaèi
+instalován (ve formátu pfb nebo pfa). Tøetí mo¾nost je jen náhradním
+øe¹ením pro úèely koreturních tiskù, nikoli pro finální tisk. Na druhé
+stranì nelze tøetí mo¾nost pøehlí¾et, proto¾e se èasto stává, ¾e font
+je instalován jen v RIPu finálního zaøízení a odtud jej nelze "vydolovat".
+Uvedeme proto postup, jak v pøípadì 3 postupovat. Pøíklad je pro
+nahrazení fontu cptmr fontem csr10:
+
+- tftopl csr10.tfm csr10.pl ... konverze metriky do .pl formátu,
+
+- editace csr10.pl ... doplnìní pøíkazu MAPFONT a VTITLE (viz [1])
+ Na zaèátek souboru pøidáme tyto øádky:
+ (VTITLE Substitute font cfont -> csr10)
+ (MAPFONT D 0
+ (FONTNAME csr10)
+ (FONTCHECKSUM D 0)
+ (FONTAT R 1.0)
+ )
+
+- mv csr10.pl cptrm.vpl ... pøejmenuj csr10.pl na cptrm.vpl (v DOSu: ren)
+
+- vptovf cptmr.vpl cptmr.vf cptmr.tfm ... soubor tfm zahodíme a soubor vf
+ pøedlo¾íme ovladaèi, který má pou¾ít náhradní
+ font. Pozor! Nikoli pro ovladaè dvips.
+
+Kutání do hloubky
+=================
+
+Z pøedchozího odstavce je patrné, ¾e byly pou¾ity dva soubory, jejich¾
+zmìnou mù¾eme vìc více pøizùsobit obrazu svému. Za prvé se jedná o soubor
+cscorr.tab a za druhé jde o soubor xil2.enc. O jejich významu bude øeè
+v následujícím textu.
+
+AFM metrika obsahuje informace o symbolických názvech znakù (napø. Scaron
+znamená ©, Uring je Ù a eacute je é). Ka¾dý pou¾itý název mù¾e být
+podchycen v metrice dvìma zpùsoby. Buï je vázán na konkrétní pozici ve
+fontu (kód), nebo má kód oznaèen hodnotou -1 a je popsán v metrice jako
+slo¾enina jiných znakù. Popis slo¾ených (kompozitních) znakù se pøitom
+opírá o symbolické názvy, tak¾e není závislý na kódování fontu.
+
+Základní my¹lenka programu a2ac je zalo¾ena na tom, ¾e v definièním souboru
+(napøíklad cscorr.tab) popí¹eme v¹echny potøebné slo¾eniny pomocí
+symbolických znakù a program a2ac je do metriky doplní. Výstupní afm soubor
+programu a2ac tedy vìt¹inou obsahuje vìt¹í mno¾ství kompozitních znakù a
+navíc v nìm mohou být doplnìny kerningové vztahy s tìmito novými znaky.
+
+Proto¾e program pracuje na úrovni symbolických názvù znakù, jeho èinnost je
+naprosto nezávislá na kódování jak PostScriptového fontu, tak vnitøního
+kódování sázecího systému, pro který se font pøipravuje.
+
+Program a2ac je pøi ètení definièního souboru vybaven nenulovou
+inteligencí. Umo¾òuje deklarovat a pou¾ívat promìnné, psát metrické a
+kompozitní informace pomocí jednoduchých výrazù a pomocí masky kernù
+doplòovat rozsáhlé mno¾ství nových kerningových informací pro nové znaky.
+
+Po transformaci afm metriky programem a2ac se pro TeX mù¾e pou¾ít program
+afm2tfm, který ète upravený soubor afm a dále soubor *.enc, podle nìho¾
+provádí pøekódování fontu do kódování pou¾itém v TeXu. Výsledkem je
+virtuální font, který obsahuje nejen pøekódování fontu podle souboru *.enc,
+ale obsahuje té¾ mechanismy na sestavení v¹ech kompozitních znakù. Tyto
+mechanismy byly pøitom sázecímu systému vnuceny pomocí popisu kompozitních
+znakù v souboru afm. O to se postaral program a2ac prostøednictvím souboru
+typu cscorr.tab.
+
+
+Popis chování programu
+======================
+
+Program pracuje ve tøech krocích.
+1. Naète vstupní soubor afm a informace ulo¾í do pamìti.
+2. Provede v pamìti zmìny podle definièního souboru.
+3. Ulo¾í obsah pamìti do výstupního afm souboru.
+
+V druhém kroku se provádìjí tyto operace:
+a) Definují se pracovní promìnné a ukládají se do nich hodnoty.
+b) Sestavují se nové kompozitní znaky.
+c) Provádí se korekce nìkterých metrických informací.
+d) Provádí se pøípadná redukce mno¾ství kerningových informací.
+e) Definují se kerny nové.
+
+Operace se provádìjí v poøadí daném obsahem definièního souboru.
+Pokyny pro provedení operací c) a¾ e) jsou ignorovány, pokud má font
+parametr IsFixedPitch roven hodnotì "true", tj. jedná se o font s pevnou
+¹íøkou písmen -- napø. font psacího stroje.
+
+Formát definièního souboru
+==========================
+
+Doporuèuje se pøi vytváøení nových definièních souborù vyjít z dodávaného
+souboru cscorr.tab. Jedná se o textový soubor. Øádky souboru se dìlí na
+výkonné a komentáøové.
+
+Výkonné øádky jsou z kraje (bez mezer) uvedeny tzv. prefixem. Jedná se
+zpravidla o dva a¾ tøi znaky na zaèátku øádku, viz ní¾e.
+Komentáøové øádky jsou v¹echny ostatní øádky, které nemají ¾ádný z ní¾e
+stanovených prefixù. Doporuèuje se uvést ka¾dý komentáøový øádek nìjakým
+symbolem tak, aby nikdy nedo¹lo ke krytí s prefixem. Staèí mezera, ale
+vhodnìj¹í asi je pou¾ít znak % nebo #. Komentáøe se nesmí vyskytovat uvnitø
+výkonného øádku.
+
+Pøehled prefixù:
+>> .......... definice promìnných (viz a)
+NC, RC, !C ... definice nového kompozitního znaku (viz b)
+RWX .......... korekce parametru WX (viz c)
+ReduceKerns .. sní¾ení poètu kerningových informací (viz d)
+NK, RK ....... vytváøení nových kerningových informací (viz e).
+
+Poøadí výkonných øádkù není pevnì stanoveno. Podle tohoto poøadí se budou
+jednotlivé operace provádìt. Operace, které vycházejí z existence
+symbolického jména nìjakého znaku, musejí být uvedeny pozdìji, ne¾ je
+symbolické jméno definováno. Napøíklad pomocí definice kompozitního znaku
+zavedeme jméno Rcaron a teprve pak mù¾eme vytváøet nové kerningové páry se
+znakem Rcaron. Nedodr¾íme-li tento po¾adavek, doèkáme se chybového hlá¹ení
+"Undefined identifier".
+
+a) Definice promìnných.
+-----------------------
+Øádek, který definuje promìnnou, má tento formát:
+
+>> NazevPromenne = výraz
+
+kde ">>" je prefix, "NazevPromenne" je identifikátor promìnné a "výraz" je
+ve srovnání s bì¾nými výrazy syntakticky omezený. Výraz je souètem
+sèítancù, z nich¾ ka¾dý sèítanec mù¾e být tímto syntaktickým celkem:
+
+- èíslo,
+- døíve definovaná promìnná,
+- volání funkce b, w, h nebo W,
+- souèin èísla a promìnné,
+- souèin èísla a funkce.
+
+Hodnoty jednotlivých sèítancù jsou celá èísla a sèítá se na úrovni celých
+èísel. Do promìnných je tedy mo¾no ulo¾it pouze celé èíslo.
+
+Identifikátor mù¾e sestávat z alfanumerických znakù nebo znaku _. První
+znak musí být písmeno. Délka identifikátoru není omezena. Velká a
+malá písmena se v¹ude rozli¹ují.
+
+Desetinné èíslo je mo¾né pou¾ít pouze jako konstantu a má smysl pouze
+v pøípadì souèinu èísla s promìnnou nebo funkcí. Výsledek souèinu se hned
+konvertuje do celého èísla, pøièem¾ se provede zaokrouhlení. Èísla tedy
+mohou obsahovat desetinnou teèku. V zápisu souèinu mezi èíslem a promìnnou
+nebo funkcí se nesmí pou¾ít mezi tìmito objekty ¾ádný znak, tj. bì¾né
+násobítko ve tvaru * není povoleno. Závorky (s vyjímkou pou¾ití u funkcí),
+vnoøení operací, násobení dvou promìnných a dìlení není povoleno.
+
+Funkce b, w, h, W nebo k musí mít hned za svým identifikátorem v kulatých
+závorkách napsaný jeden parametr. V pøípadì funkce b nebo k se jedná o dva
+parametry oddìlené èárkou. Parametrem je symbolický název znaku a u funkce
+b je¹tì následuje èíslo od 1 do 4. Funkce vracejí do výrazu tyto hodnoty:
+
+b(znak,i) ... i tá hodnota parametru BoudingBox pro znak. Pøesnìji:
+ b(znak,1) ... levý prùmìt znaku (souøadnice x),
+ b(znak,2) ... dolní prùmìt znaku (souøadnice y),
+ b(znak,3) ... pravý prùmìt znaku (souøadnice x),
+ b(znak,4) ... horní prùmìt znaku (souøadnice y).
+w(znak) ... ¹íøka znaku = b(znak,3) - b(znak,1).
+h(znak) ... celková vý¹ka znaku = b(znak,4) - b(znak,2).
+W(znak) ... hodnota WX pro daný znak.
+k(znak1,znak2) . hodnota kernu pro dvojici znak1 znak2
+ (nula, pokud kern pro dvojici neexistuje).
+
+Pøíklady výrazù najdete v souboru cscorr.tab.
+
+Pøi zahájení zpracování pole definic promìnných jsou známy hodnoty tìchto
+promìnných: CapHeight, XHeight, Ascender, Descender
+(pouze ov¹em za pøedpokladu, ¾e jsou o nich vyplnìny údaje ve
+vstupní afm metrice).
+
+V prùbìhu "výpoètu" je mo¾né mìnit hodnotu stejné promìnné tím, ¾e se øádek
+deklarující promìnnou napí¹e znova s jiným výrazem. V takovém pøípadì je
+mo¾né ve výrazu vyu¾ít starou hodnotu této promìnné. Napøíklad:
+
+>> Acutetop = Acutetop + 7
+
+!! Dùle¾itá poznámka: Mezery je mo¾no vkládat do výrazu (kamkoli)
+pouze v øádcích definic pracovních promìnných. Ve v¹ech ostatních výkonných
+øádcích tento výraz NESMÍ obsahovat jedinou mezeru! Mezera má v tìchto
+øádcích význam delimitaèní a ukonèuje naèítání výrazu.
+
+b) Definice nového kompozitního znaku
+-------------------------------------
+Øádek definuje jeden kompozitní znak podobnì jako ve formátu afm.
+Øádek mù¾e být uveden tøemi prefixy:
+
+NC ... New Composite -- Sestavení nového kompozitního znaku. Pokud ve
+ vstupní metrice znak existuje (definovaný jako kompozitní nebo
+ fyzický), originální definice se nepøepisuje.
+RC ... Rewrite Composite -- Sestaví nový znak. Pokud je znak v pùvodní
+ metrice definován jako kompozitní, tato definice je pøepsána.
+!C ... Sestaví nový znak jako kompozitní, a pøípadnì pøepí¹e pùvodní
+ definici znaku, tøeba¾e je pùvodní znak fyzickým znakem fontu.
+
+Následuje název znaku a poèet èástí (dílkù), ze kterých se kompozitní znak
+skládá (maximálnì 10). Pak je za støedníkem premisa PCC následovaná názvem
+prvního dílku znaku se dvìma parametry oddìlenými mezerami. Parametry udávají
+posun dílku vùèi poèátku v souøadnici x a y. Pak za støedníkem je toté¾ pro
+druhý a dal¹í dílek.
+
+V¹echny èíselné parametry (kromì èísla udávajícího poèet dílkù) mohou být
+výrazy (viz vý¹e). Výrazy jsou oddìleny od sebe mezerami.
+
+Kromì premisy PCC se mohou pou¾ít je¹tì následující premisy: PAC, PCT, PAT.
+Premisy deklarují interpretaci následných èíselných parametrù, které pøi
+standardním pou¾ití (písmeno C) udávají posun dílku vùèi poèátku.
+
+Premisa s písmenem A (axis) v druhé pozici øíká, ¾e údaj pro x-ovou
+souøadnici posunu dílku vyjadøuje posun osy dílku vzhledem k ose základního
+(tj. prvního) dílku v kompozitním znaku. Napøíklad "PAC caron 0 cosi"
+znamená, ¾e osa znaku caron bude od osy základního znaku kompozitu
+vychýlena o 0, tj. osy se budou krýt. Kladná hodnota posunuje doprava,
+záporná doleva. Abychom definovali pøesnì osu znaku, uva¾ujme
+vodorovnou úseèku o délce WX daného znaku. První konec této úseèky je
+v poèátku a druhý smìøuje doprava. Osa znaku prochází støedem této úseèky a
+svírá s ní úhel 90+ItalicAngle stupòù.
+
+Premisa s písmenem T (top) na tøetí pozici øíká, ¾e y-ová souøadnice posunu
+dílku se poèítá z parametru, který oznaèuje hodnotu horního okraje dílku.
+Napøíklad v souboru cscorr.tab je napoèítána hodnota Acutetop jako vý¹ka
+velkého písmene s akcentem. Pak jsou v¹echny akcenty pový¹eny na tuto vý¹ku
+jednodu¹e pomocí zápisu P?T cosi Acutetop. Tím je dosa¾eno toho, ¾e v¹echny
+akcenty mají stejnou vý¹ku, aèkoli velikosti písmen se nepatrnì li¹í (napø,
+O kvùli optickému klamu pøesahuje horní i dolní okraj.
+
+Je-li pou¾ita jiná premisa, ne¾ PCC, program údaje pøepoèítá a na výstupu
+pou¾ije pouze premisy PCC.
+
+!! Dùle¾itá poznámka: Mezery jsou v celém øádku významné, tj. tøeba mezery
+pøed a za støedníkem tam nejsou jenom pro okrasu. ®ádnou mezeru nelze
+bezstarostnì vynechat. Jedna mezera a více mezer toté¾ jsou, tj. mù¾e se
+vkládáním vìt¹ího poètu mezer docílit jisté pøehlednosti tím, ¾e budou
+v¹echny údaje zarovnány pod sebou.
+
+c) Korekce parametru WX
+-----------------------
+Sázecí systémy pou¾ívají pøi sazbì znakù z fontu parametr posunu sázecího
+bodu ka¾dého znaku, který s BoudingBoxy nemusí mít mnoho spoleèného.
+Posun sázecího bodu ve smìru osy x je dán parametrem WX pro ka¾dý znak.
+(Pro evropské jazyky je posun ve smìru osy y nulový). Tento údaj se napø. do
+TeXu promítne jako ¹íøka boxu pro znak (vý¹ka a hloubka se poèítá
+z BoudingBoxù).
+
+Pøi poèítání nových kompozitních znakù program napoèítá pro ka¾dý znak nové
+hodnoty BoudingBoxù a pro parametr WX pou¾ije hodnotu WX z prvního
+(základního) dílku kompozitu. To nemusí být v¾dy vyhovující
+(viz znaky », ï).
+Proto lze pou¾ít øádky definující novou hodnotu WX.
+Ka¾dý øádek má tvar:
+
+RWX nazev vyraz
+
+kde "RWX" je pevná premisa, "nazev" je názem znaku, u kterého mìníme
+hodnotu WX a "vyraz" vrací novou hodnotu WX. "vyraz" musí splòovat vý¹e uvedená
+syntaktická omezení a nesmí obsahovat mezeru. Hodnota výrazu se mù¾e opírat
+o pùvodní hodnotu WX znaku (pou¾itím funkce W).
+
+d) Sní¾ení poètu kerningových informací
+---------------------------------------
+Øádek má tvar
+
+ReduceKerns vyraz
+
+a zpùsobí vymazání v¹ech kerningových informací, které definují kern
+mezi dvìma písmeny v absolutní hodnotì men¹í nebo roven hodnotì "vyraz".
+"vyraz" má vý¹e uvedená syntaktická omezení a pí¹e se bez mezer.
+
+Tento øádek je u¾iteèný pro vymazání kernù s nulovou nebo nepatrnou
+velikostí. Tyto kerny zbyteènì zabírají místo v metrice fontu sázecího
+systému.
+
+Øádek je u¾iteèné pou¾ít dvakrát. Nejprve na zaèátku definièního souboru
+(zpùsobí vymazání zbyteèných kerningových informací získaných pøímo ze
+vstupního souboru) a podruhé na konci (vyma¾e novì vzniklé informace
+s malou absolutní hodnotou kernu). Chceme-li být èistotní, je rozumné
+pou¾ít aspoò "ReduceKerns 0" na konci souboru.
+
+e) Vytváøení nových kerningových informací
+------------------------------------------
+Øádek definující nové kerningové páry mù¾e mít jeden ze dvou prefixù:
+
+NK ... (New Kern), nový kern, pokud kern pro danou dvojici existuje,
+ zùstane zachován.
+RK ... (Rewrite Kern), nový kern, pokud kern pro danou dvojici existuje,
+ bude pøepsán.
+
+Dal¹í pokraèování øádku mù¾e být rùzné, viz následující body (i) a¾ (v):
+
+(i) Pevná definice kernu jediného páru je ve tvaru:
+---------------------------------------------------
+prefix prvni druhy vyraz
+
+kde "prefix" je NK nebo RK, "prvni" je název prvního znaku, "druhy" je název
+druhého znaku a "vyraz" (bez mezer) vrací hodnotu kernu.
+
+(ii) Definice kernu jediného páru podle hodnoty jiného páru
+-----------------------------------------------------------
+Øádek má tvar
+
+prefix prvni druhy : treti ctvrty vyraz
+
+kde dvojice znakù se jmény "prvni" "druhy" dostane stejný kern, jako dvojice
+"treti" "ctvrty" zvìt¹ený o hodnotu "vyraz". Parametr "vyraz" (bez mezer) je
+nepovinný a není-li uveden, je poèítáno, ¾e má hodnotu 0.
+
+Místo znaku "treti" anebo "ctvrty" mù¾e být uveden symbol "*".
+Vynechaný znak "treti" se doplní znakem "prvni" a vynechaný znak "ctvrty" se
+doplní znakem "druhy". Napøíklad:
+
+NK Anew B : A *
+
+je toté¾ jako
+
+NK Anew B : A B
+
+Chceme-li zvìt¹it kern mezi A a B o hodnotu c, napí¹eme:
+
+RK A B : * * +c
+
+(iii) Definice skupiny kernù podle masky:
+-----------------------------------------
+Øádek má stejný tvar, jako v pøedchozím pøípadì, ov¹em symbol "*"
+je uveden nejen za dvojteèkou ale i pøed ní. Tyto symboly se musí krýt, tj.
+pokud je znak "prvni" nahrazen, musí být nahrazen té¾ znak "tøetí".
+Symboly nahrazení jsou dva -- teèka nebo hvìzdièka -- a musí být
+v obou pøípadech stejné. Øádek definuje kerny podle hodnot kernù v¹ech
+dvojic, které lze sestavit vpravo od dvojteèky a jsou v pamìti, doplnìním
+postupnì v¹ech znakù za vynechaný znak. Je-li symbol nahrazení "*",
+doplòují se v¹echny znaky, je-li pou¾ita teèka, doplòují se jen malá
+písmena (názvy znakù, které zaèínají malými písmeny). V¹e osvìtlí pøíklad.
+
+Nech» máme v pamìti kern hodnoty 1 pro A B, hodnoty 2 pro A C a hodnoty 3
+pro A D. Nech» jiné kerny s písmenem A na zaèátku dvojice neexistují. Pak
+øádek
+
+NK Anew * : A *
+
+definuje kern hodnoty 1 pro Anew B, dále kern hodnoty 2 pro Anew C a
+koneènì kern hodnoty 3 pro Anew D. Definují se tedy celkem tøi kerny.
+
+V levo od dvojteèky je mo¾no nahradit (hvìzdièkou nebo teèkou) jen jediné
+jméno z dvojice. Na druhé stranì vpravo od dvojteèky je mo¾né napsat
+hvìzdièku i na místo proti jménu. Napøíklad:
+
+RK Anew * : * * +c
+
+je toté¾ jako
+
+RK Anew * : Anew * +c
+
+tj. v¹echny kerny typu Anew * se zvìt¹í o c.
+
+(iv) Jeden øádek je zkratkou za dva:
+------------------------------------
+Øádek má tvar:
+
+prefix prvni : druhy
+
+a nahrazuje dva øádky:
+
+prefix prvni * : druhy *
+prefix * prvni : * druhy
+
+(v) Výèty v øádcích definujících kerny:
+---------------------------------------
+Symbolické jméno je mo¾né nahradit výètem symbolických jmen
+oddìlených èárkami. Výèet je uzavøen do závorek a nesmí obsahovat mezery a
+dal¹í výèty. Jméno je mo¾né nahradit výètem v pøípadech, které jsou
+shrnuty v následující tabulce. Slovo "vycet" znamená jedno jméno nebo
+výèet jmen, zatímco "single" je jedno jméno, které nesmí být nahrazeno
+výètem. Slovo "vyraz" je nepovinný výraz. Tabulka zároveò shrnuje v¹echny
+syntaktické mo¾nosti definování nových kernù.
+
+(i) prefix vycet vycet vyraz
+
+(ii) prefix vycet vycet : single single vyraz
+ prefix vycet vycet : single * vyraz
+ prefix vycet vycet : * single vyraz
+ prefix vycet vycet : * * vyraz
+
+(iii) prefix vycet * : single * vyraz
+ prefix vycet * : * * vyraz
+ prefix * vycet : * single vyraz
+ prefix * vycet : * * vyraz
+
+(iv) prefix vycet : single
+
+Hvìzdièky v tabulce (iii) lze nahradit teèkami. Vidíme, ¾e není dovoleno
+zapsat výèet za dvojteèku. Výèty se expandují do více øádkù s postupnì
+v¹emi jmény z výètu. To se dìje pøed spu¹tìním algoritmù podle (ii), (iii)
+a (iv). Jsou-li v jednom øádku dva výèty, pak se pøíkaz rozvine køí¾ovým
+zpùsobem. Napøíklad:
+
+NK (A,B,C) (x,y) : * one
+
+se expanduje do ¹esti øádkù:
+
+NK A x : * one NK A x : A one
+NK A y : * one NK A y : A one
+NK B x : * one co¾ se interpretuje podle (ii) jako: NK B x : B one
+NK B y : * one NK B y : B one
+NK C x : * one NK C x : C one
+NK C y : * one NK C y : C one
+
+
+Ligatury
+========
+
+Informace o ligaturách bývá uvedena na konci øádkù s prefixem C ve vstupním
+afm souboru. Napøíklad:
+
+C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
+
+Tato informace se pøepí¹e do výstupního afm souboru a pro vytvoøení záznamu
+v tabulce ligatur pro sázecí systémy je dostaèující. Skuteènì, napø.
+program afm2tfm ète tyto údaje a vytváøí odpovídající záznam v ligaèní
+tabulce pro formát tfm. Navíc se dají prostøednictvím souborù typu *.enc
+definovat nové, speciálnì TeXovské, ligatury. Napøíklad øádek v souboru
+xl2.enc:
+
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+
+definuje ligatury pro "--" a "---".
+
+
+Poznámka k souboru cscorr.tab
+=============================
+
+Pro znaky ï, » by se správnì mìly pou¾ít symbolické názvy dquoteright a
+tquoteright. Místo nich byly ale pou¾ity symbolické názvy dcaron a tcaron.
+Dùvod je ten, ¾e tyto znaky mají svùj protìj¹ek v kapitálkách nazvaný
+správnì Dcaron a Tcaron. Kdybychom nazvali písmeno ï jako dquoteright, pak
+by pou¾ití parametru -V v programu afm2tfm pro vytvoøení fontu "Capitals
+and Small Capitals" nedalo správný výsledek. Abychom nezavádìli nová
+symbolická oznaèení pro ¥ a µ, zùstali jsme i zde u názvu Lcaron a lcaron.
+
+
+Poznámka k souboru xil2.enc
+===========================
+
+Kódovací soubor definuje tzv. CSencoding vector, tj. kódování CS-fontù.
+Kódování CS-fontù je patrné z tabulky na str. 3 po zpracování souboru
+ctimne.tex v CSTeXu. Pøesnìj¹í tabulka je v dodatku F v [2].
+
+Soubor xil2.enc je návrhem na standard kódování PostScriptových fontù
+v CSTeXu. Dolní polovina tabulky se pøesnì kryje s CM kódováním a horní
+polovina tabulky odpovídá normì ISO-8859 Latin2 kódování a¾ na dvì výjimky
+(umístìní èeských uvozovek v posledních dvou pozicích). Toto kódování je
+nadmno¾inou kódování CS-fontù. Znamená to, ¾e pokud výchozí PostScriptový
+font definuje v¹echny znaky, které jsou pou¾ity v CS-fontech, pak se
+v¹echny znaky z CS-fontu budou krýt se znaky v sestaveném PostScriptovém
+virtuálním fontu. Navíc jsou definovány pozice podle ISO-8859 pro dal¹í
+znaky, které se mohou vyskytovat ve výchozím fontu ale nejsou v CS-fontech
+(napø. pøe¹krtnuté l).
+
+V CSencoding vektoru je jedna výjimka proti kódování CS-fontù. V tabulkách
+Adobe Encoding vektorù neexistuje samostatnì ¹krtátko pro
+polské l (CM: Cross for Polish l and L, kód 32), tak¾e zùstalo
+v CSencoding vektoru nedefinováno.
+
+Podrobnìji o problematice kódování fontù -- viz [3].
+
+Poznamenejme, ¾e vìt¹inou nejsou výchozím fontem pokryty první pozice CM
+kódování odpovídající øeckým znakùm a trojnásobným ligaturám.
+Pro speciální aplikace -- pou¾ití TeXovské sazby matematiky
+PostScriptovým fontem je tedy vhodné editovat soubor *.vpl tak, aby se
+pokryly aspoò øecké znaky z fontu Symbol.
+
+
+Historie
+========
+Verze 0 <Záøí 1994>
+ - Vznik programu a èeské dokumentace. Program byl vystaven na ftp pro
+ èeské a slovenské TeX-kouzelníky.
+Verze 1 <Èerven 1995>
+ - Nový formát definièních souborù umo¾òuje libovolné poøadí operací.
+ Starý definièní soubor bude fungovat právì tehdy, kdy¾ se pøidá
+ pøed ka¾dý øádek, definující promìnnou, prefix ve tvaru ">>".
+ - Jsou mo¾né zkratky jednoho øádku za dva (viz odst. e, (iv))
+ a výèty jmen, které uspoøí je¹tì více øádkù (viz odst. e, (v)).
+ - Zavedena nová funkce "k" vracející hodnotu kerningového páru.
+ - Opraveny nìkteré chyby:
+ . Opravena nestabilita UNIXového a2ac na DOSosvkém formátu vstupních
+ souborù (ne¹»astné ^M na konci ka¾dého øádku).
+ . Chybí-li pole "Composites" ve vstupní metrice, ve výstupní se u¾
+ objeví.
+ . Výstupní soubor se nevytvoøí, pokud se narazí na chybu ve vstupu.
+ . Opravena èeská dokumentace a pøidána (pseudo)anglická.
+ . Pøeuspoøádán soubor cscorr.tab a pøidány nìkteré chybìjící údaje.
+
+
+Reference
+=========
+[1] Donald Knuth: Virtual fonts, a more fun for grand wizards.
+ TUGboat 11/89
+[2] Petr Ol¹ák: Typografický sytém TeX. CSTUG 1995, 270 stran.
+ ISBN 80-901950-0-8.
+[3] Petr Ol¹ák: Úvaha o fontech v CSTeXu, TeXbulletin 3/93 (121--131).
+
+
+
+
+
+
diff --git a/fonts/utilities/a2ac/a2ac-cz.txt b/fonts/utilities/a2ac/a2ac-cz.txt
new file mode 120000
index 0000000000..e18a7e7a90
--- /dev/null
+++ b/fonts/utilities/a2ac/a2ac-cz.txt
@@ -0,0 +1 @@
+a2ac-cz.doc \ No newline at end of file
diff --git a/fonts/utilities/a2ac/a2ac-eng.doc b/fonts/utilities/a2ac/a2ac-eng.doc
new file mode 100644
index 0000000000..e2b8d39bd1
--- /dev/null
+++ b/fonts/utilities/a2ac/a2ac-eng.doc
@@ -0,0 +1,630 @@
+ ****************************************************************
+ * Program a2ac *
+ ****************************************************************
+ version 1, June 95 Petr Olsak (Ol\v{s}\'ak)
+
+Program a2ac (Afm To Afm and add Composites) converts the afm files (Adobe
+Font Metrics) to new files in the same format. Program reads so called
+"description file" during its work. The changes, we want to made, are
+defined in this file. The main feature of the program is adding the new
+composites by clear descriptions and kern pairs by patterns.
+
+The command line looks like:
+
+a2ac input.afm desc.tab output.afm
+
+The first parameter is the name of input afm file, second one is the
+name of description file and third one is the name of output afm file.
+The extensions (.afm, .tab) must be written---the program has no
+algorithms to add the extensions automatically.
+
+If we need to create the log file and we need not to see more
+information on the terminal then we can write:
+
+a2ac input.afm desc.tab output.afm > logfile
+
+The command line with program a2ac caling is usually placed as a part of a
+script or a batch file (see the "mkfnt" UNIX script in a2ac package).
+
+The file cscorr.tab is included to the package of a2ac. It includes
+definitions of composites for Czech and Slovak letters (i.e. the output
+font includes Czech and Slovak letters and appropriate kerns for
+this letters). The input font has to include all the accents for
+composites letters. The necessary and sufficient condition is to include
+the acute, caron, ring, quoteright, dieresis, circumflex accents and
+standard 26 letters (in lower- and upper-case) for Czech and Slovak
+alphabet. If the Adobe font in StandardEncoding is used then the condition
+is satisfied. The output afm file includes the composite characters for all
+Czech and Slovak alphabet and new kern information. This file can be used
+as an input for typesetting systems (for example TeX). Therefore, the whole
+Czech and Slovak alphabet is available for this systems.
+
+To prepare the new PostScript font for TeX you can use the script "mkfnt"
+or you have to follow next steps. For example, the standard PostScript font
+has afm metric with the name font.afm and the dvips program for dvi to
+PostScript is used:
+
+1. a2ac font.afm cscorr.tab cfont.afm
+ ... the metric csfont.afm is created with whole Czech/Slovak alphabet.
+2. afm2tfm cfont.afm -t xl2.enc -v cfont rfont
+ ... the metric rfont.tfm is created (it is needed for dvips handling)
+ and the virtual property list cfont.vpl is made by encoding
+ definition file xl2.enc.
+3. vptovf cfont.vpl cfont.vf cfont.tfm
+ ... the metric (for TeX) cfont.tfm is created and the virtual
+ script cfont.vf (for dvips driver) is made.
+4. We store the cfont.tfm, rfont.tfm and cfont.vf to appropriate
+ directories: cfont.tfm for TeX input, rfont.tfm and cfont.vf for
+ dvips input. We add the new line to the configuration file psfont.map
+ of dvips:
+ rfont The-Full-Name-Of-PostScript-Font
+ If the PostScript font is no resident in the PostScript RIP of the output
+ device, we have to store the pfb (pfa) format of PostScript font in our
+ computer. Therefore the line in psfont.map looks like:
+ rfont The-Full-Name-Of-PostScript-Font </unix/path/to/file.pfb
+ or (for DOS):
+ rfont The-Full-Name-Of-PostScript-Font <disk:\dos\path\to\file.pfb
+5. We can load the new font in the TeX input file (usually *.tex) by the
+ commands:
+ \font\newfont=cfont
+ {\newfont the eight-bit text in the same encoding as defined in
+ xl2.enc can be used and the new font will be shown.}
+ The new font will be used for the text after TeX and dvips processing.
+
+Notice 1. The input text encoding for TeX need not to be the same as internal
+TeX encoding. The transformations can be performed by tcp table for
+emTeX, by changes of xord/xchr vectors in tex.ch file of TeX's web source or
+by setting active characters. The .enc file is exactly the same as internal
+TeX encoding in which the hyphenation patterns were read.
+
+Notice 2. There is a necessity to perform the unix2dos transformation in some
+DOS installations before third step. Namely, the file *.vpl has UNIX text
+file format after afm2tfm, but the vptovf needs the DOS format on input. You
+can load the *.vpl into any DOS editor and save it---the unix2dos
+transformation is performed.
+
+Notice 3. We need to handle with the font by dvi drivers
+without PostScript output (the screen viewer, for instance).
+If we have got the PostScript font in pfb (or pfa) format in our computer
+then we can use the ps2pk, for example. In other case (font is implemented
+only in RIP of output device) the substitute virtual font preparing is
+needed. For example, we have got the font csr10 in tfm and pk format. The
+encoding of the font has to be the same as defined by *.enc table. This
+font will substitute the original font for a proof reading. The substitution
+virtual font can be prepared by following steps.
+
+- tftopl csr10.tfm csr10.pl
+ We obtain the property list text format of tfm.
+- editing csr10.pl
+ Adding the MAPFONT and VTITLE commands (see [1]).
+ We have to insert the following lines at begin of file csr10.pl only:
+ (VTITLE Substitute font cfont -> csr10)
+ (MAPFONT D 0
+ (FONTNAME csr10)
+ (FONTCHECKSUM D 0)
+ (FONTAT R 1.0)
+ )
+- rename the new version of file csr10.pl to cfont.vpl
+- vptovf csfont.vpl csfont.vf csfont.tfm
+ The vf and tfm of csfont is created. We remove the tfm file because
+ the original tfm created by afm2tfm must be used for TeX. The vf file
+ will be read by dvi driver without PostScript output. Therefore the
+ substitute font csr10.pk will be used in this case. Use this feature
+ only for proof reading, no for final output(!).
+
+
+More information
+================
+
+It is easy to see that two files have main role in preparing the new
+PostScript font for TeX---the cscorr.tab and xl2.enc in examples above.
+The following text gives more information about these files.
+
+The afm metric file describes information using symbolic names of characters
+(Aacute is A with acute, for example). Each name can be present in one of
+two variants. First, the name is bonded to the definite encoding position
+and to the PostScript procedure to rendering the image of character.
+Second, the name is described as so called ``composite character''. In this
+case the encoding position of the character is set to -1 and the
+description of making the character by elements is stored in afm. The
+elements are usually characters from first variant and only symbolic names
+are used.
+
+The main idea of a2ac program is to describe all requested composite
+characters in description file. Only the symbolic names are used, therefore
+the description file is totally independent on the encoding of PostScript
+font and encoding used by typesetting system. Program a2ac adds new
+composite characters into output afm file by information in description
+file. In addition the new kern pairs are added (usually for new composite
+characters). These data are described in description file too.
+
+The program has nonzero intelligence during the reading of description
+file. You can declare and use so called "variables", you can write
+metric and composite information by simple expressions and you can add
+new kerns by patterns in which the information of similar kern pairs
+is used (but exceptions are possible).
+
+Preparing of the font for TeX goes on the standard way (as for english
+language), after a2ac is used. You can use the afm2tfm which reads the
+converted afm file and arbitrary *.enc file to define the internal TeX
+encoding. The result is a virtual font which include two kinds of
+information: the information for re-encoding from internal TeX encoding to
+raw PostScript font encoding and the information about building the
+accented letters from elements. The first kind of information is a result
+of the *.enc file (used during afm2tfm processing) and the second one is
+result of the description file (used during a2ac processing).
+
+
+The behavior of the program
+===========================
+
+The program works in three steps:
+1. The input file is read and information is stored into memory.
+2. The changes are performed by the description file in memory.
+3. The contents of memory is written into output file.
+
+The following operations are performed in the second step:
+
+a) The variables are defined and values are set.
+b) The new composite information is calculated.
+c) Some metric corrections are performed.
+d) The number of kern information is reduced (prospectively).
+e) The new kern pair are defined.
+
+The operations are performed in the same order as written in the
+description file. If the font parameter IsFixedPitch is true,
+operations of type c), d) and e) are ignored. For example, the typewriter
+style fonts have IsFixedPitch=true, therefore the kern information and
+different metric width are irrelevant.
+
+
+Description file format
+=======================
+
+It is recommended to use the cscorr.tab file as starting point for creating
+new description files. The description file has text format. Each line is
+comment line or execute line.
+
+The execute line is started from begin (without spaces) by a prefix.
+Prefix consists usually from two or three characters, see below.
+If the line does not start by any prefix, it is the comment line and will
+be ignored. It is recommended to start every comment line by some special
+(comment) character in order to never match the comment with any prefix.
+The space is sufficient comment character, but more suitable is to use
+character % or #. Comments are not allowed in the execute line.
+
+Summary of prefixes:
+>> .......... the variable definition (see a)
+NC, RC, !C ... the composite character definition (see b)
+RWX .......... the WX parameter correction
+ReduceKerns .. reducing the amount of kern data (see d)
+NK, RK ....... generation new kern data (see e)
+
+The order of execute lines is arbitrary. It gives the order of operations
+performed by the program. Operation can be performed in the time of all
+symbolic names used in execute line are known. First, the symbolic names
+are defined in input afm file a second they are defined by definition of
+new composite character. For example, we have to write the definition
+of Rcaron character as a composite before we define the new kern data with
+Rcaron character. If this condition is not satisfied then the error
+"Undefined identifier" occurs.
+
+
+a) The define-variables field
+-----------------------------
+The line has following format:
+
+>> NameOfVariable = expression
+
+where ">>" is the prefix, "NameOfVariable" is variable identifier and the
+"expression" has some limited syntax in comparison with a common algebraic
+expression. We will call this expression "limited expression". The
+limited expression is a sum of terms. Each term can be one of the
+following syntactic objects:
+
+- the decimal number
+- the value defined earlier
+- the function b, w, h or W
+- the product of number and variable
+- the product of number and function
+
+Values of terms of addition are integers and the sum is computed with
+integers only. The value of variables can be integer only.
+
+The number can be expressed with decimal point. The usage of this case is
+reasonable only for product of number with variable or function. The result
+of the product is rounded to integer immediately. The product is written
+without presence of any "multiply" character, i.e. the common multiply
+character "*" is not allowed. The parentheses (with exception of usage
+parentheses around parameter of function), nesting of operations, product
+of two variables and fractions are not allowed.
+
+The identifier of variable can include any alphanumeric character and
+character "_" (underscore). The first character must be alphabetic. The
+length of identifier is not limited. Identifiers are case sensitive.
+
+Function b, w, h, W or k is written by its one-character identifier
+immediately followed by its argument in parentheses. In case of
+function b or k, there are two parameters separated by comma in parentheses.
+The parameter is the symbolic name of the font character (in case of
+function b, the second parameter is the integer from 1 to 4).
+Functions return following values:
+
+b(char,i) ... i-th value from BoudingBox parameter of char. More exactly:
+ b(char,1) ... left-bottom corner, x coordinate,
+ b(char,2) ... left-bottom corner, y coordinate,
+ b(char,3) ... right-top corner, x coordinate,
+ b(char,4) ... right-top corner, y coordinate.
+w(char) ... the width of char = b(char,3) - b(char,1).
+h(char) ... the height of char = b(char,4) - b(char,2).
+W(char) ... the WX value: The x coordinate of vector of moving the
+ actual typesetting point after rendering the character.
+ The WY value is no supported and it is zero for European
+ languages.
+k(char1,char2) . the kern value of the pair char1 char2
+ (zero, if kern does not exist).
+
+Examples can be found in cscorr.tab file.
+
+The variables CapHeight, XHeight, Ascender and Descender have known values
+at the start od processing. Of course, these quantities must be set in
+the input afm file.
+
+!! The important: Spaces can be written in an expression only in
+define-variable line. Spaces have a special meaning as delimiter
+of expression in another types of lines and they must not be present in
+expression in this situation.
+
+b) The composite character definition
+-------------------------------------
+The line defines one composite character by a syntax similar as in afm
+format. There can be used one of three prefixes in the line:
+
+NC ... New composite. If the character exists in the input afm (defined as
+ composite character or natural character), the original definition
+ takes precedence.
+RC ... Rewrite Composite. If the character exists in the input afm defined
+ as composite character, the new definition rewrite the old one.
+ If the character is defined as natural character, the old definition
+ takes precedence.
+!C ... Rewrite Composite. The new definition is used in any circumstance.
+
+The symbolic name of the character follows after the prefix. Next the
+number of elements (at the most 10) is written. The PCC symbol follows
+after semicolon. Next there is the symbolic name of the first (main)
+element of composite character and two numeric parameters. All objects are
+separated by spaces. The same information repeats for another elements of
+composite character and are separated by semicolon (spaces must be before and
+after semicolon).
+
+All numeric parameters (with exception of number of elements) can be written
+as a restricted expression (see above). The expressions are separated by
+spaces.
+
+You can replace the PCC symbol by following symbols: PAC, PCT and PAT.
+The symbol declare the way of interpretation of next numeric parameters.
+The shift of the element with respect to origin is given by the numeric
+parameters. The P in symbol is constant letter, the first C stands for no
+re-interpretation of first numeric parameter (x coordinate) and the second
+C stands for y coordinate.
+
+If the first C is replaced by A (axis), the element is shifted (in x
+coordinate) with respect to the axis of the main (first) element.
+For example, "PAC caron 0 350" means the axis of the caron accent will be
+equivalent to the axis of the main character (see the first zero parameter)
+and shifted up by 350. The positive number in first numeric parameter means
+to shift to the right, the negative one means to shift to the left. Now we
+define the "axis" of character exactly. Suppose the WX, WY vector of the
+character with the starting point on origin. The axis of the character
+cross this vector in its middle point with the angle 90+ItalicAngle degrees.
+
+If the second C is replaced by T (top), the element is shifted (in y
+coordinate) with respect to top. In this case, the second numeric parameter
+gives the position of the top border of the element. For example, the value
+of Acutetop is used for each accents in cscorr.tab in order to save the
+same height position of accents without respect of different height of
+primary characters (O is some higher than E for optical illusion
+correction).
+
+If the symbol PAC, PCT or PAT is used, program calculates the element
+position and writes all numeric information using PCC in the output.
+
+!! Notice: Spaces are significant. Any space cannot be removed (for example
+before or after semicolon). Two or more consecutive spaces are interpreted
+as one space. You can place more spaces in order to obtain more readable
+listing of description file.
+
+
+c) The WX parameter correction
+------------------------------
+Typesetting systems uses a parameter of shifting the actual
+point during typesetting each character. This parameter cannot have
+a connection to BoudingBox of the character. The shift of the actual
+typesetting point in the x-coordinate direction is given by WX for each
+character in afm format and the shift in the y-coordinate direction is zero
+for European languages. For example, the WX is converted into TeX metric
+as the width of the character box. The height and depth of box are
+calculated (by afm2tfm) from BoudingBox information and they are rounded to
+at most 16 different amounts for both (depth and height) by the vptovf
+program. This limitation is a feature of the tfm format.
+
+The WX parameter from first (main) element is used as new WX parameter for
+new composite character. Program a2ac calculates a new BoudingBox information
+of composite character from BoudingBox parameters of each element. Program
+calculates minimum or maximum of appropriates parameters. The feature of
+copying the WX data from WX parameter of first (main) element can be
+problematic in some cases. For example, we have d' as one character
+of alphabet. The composite construction for this character is needed, but
+the width of the result is some greater than the width of character d
+itself. Therefore, it is possible to correct the WX parameters of (usually
+new defined) characters by the line with RWX prefix.
+The line has the following format:
+
+RWX name expression
+
+where the "RWX" is a prefix, "name" is the symbolic name of the
+character and "expression" is a limited expression which returns the new
+value of WX for named character. You can use the W(name) function in
+the expression. This feature gives possibility to calculate new WX
+parameter from old one.
+
+d) Reducing the number of kern data
+-----------------------------------
+The line has the form:
+
+ReduceKern expression
+
+If absolute value of kern in kern-pair is less or equal to "expression"
+value, the information about this kern-pair will be removed. The
+"expression" is limited expression and includes no spaces.
+
+This command is senseful for zero or small amounts of kerns. These data
+are redundant and takes place in font metrics for typesetting systems.
+
+It is useful to write this command at two points in description file.
+First at start (to save the time and to reduce the number of new computed
+kerns) and second at the end (to remove the new redundant kern pairs).
+It is sufficient to place the ReduceKern command at the end only.
+It is recommended to write at least "ReduceKern 0".
+
+e) New kerning information
+--------------------------
+To define new kern information you can write a line with one of two
+prefixes:
+
+NK ... New Kern. If the kern info for given pair exists, it is unchanged.
+RK ... Rewrite Kern. New kern info can rewrite the old one.
+
+The contents of the line can vary, see next paragraphs (i) to (v).
+
+(i) Fixed definition of one kern pair has a form:
+-------------------------------------------------
+prefix first second expression
+
+where "prefix" is NK or RK, "first" is the name of the first character of
+pair and "second" stands for second character. The "expression"
+(limited expression without spaces) gives the kern value.
+
+(ii) Definition of one kern pair by another kern pair value
+-----------------------------------------------------------
+The line has the form:
+
+prefix first second : third fourth expression
+
+where the pair of characters "first" and "second" will take the value of
+kern pair "third", "fourth" advanced by a value of the "expression". The
+"expression" (limited expression without spaces) can be omitted. In such
+case none is advanced.
+
+The symbol "*" can be written instead of the name of "third" and/or "fourth".
+The appropriate name from "first" and "second" will be substituted.
+("first"->"third" and "second"->"fourth"). For example:
+
+NK Anew B : A *
+
+is the same as:
+
+NK Anew B : A B
+
+If we want to advance the kern value to the same kern pair, we can write
+(for example):
+
+RK A B : * * +c
+
+(iii) More new kern data by pattern:
+------------------------------------
+The line has the same form as above (ii), but the symbol "*"
+is written instead of "first" exclusive or "second". If the "first" is
+replaced, the "third" must be replaced too and if the second is replaced,
+the "fourth" must be replaced too. You can write the "*" or the "." instead
+names. The replaced symbol ("*" or "." must be the same). The "*" stands for
+all characters and the "." stands for the lowercase characters only.
+If the "first" is replaced (by "*" for example), the new kerns are
+calculated from all values of kern pairs of type "*" "fourth". If the
+"second" is replaced, the kern pair data of type "third" "*" will be used.
+The example shows the algorithm better:
+
+Let the kern pair values are stored for pairs A b and A C and A d.
+Let more kern data of type A * don't exist. In such case the
+line
+
+NK Anew * : A *
+
+is equivalent to
+
+NK Anew b : A b
+NK Anew C : A C
+NK Anew d : A d
+
+and the line
+
+NK Anew . : A .
+
+is equivalent to
+
+NK Anew b : A b
+NK Anew d : A d
+
+Left from the colon, there is possible only one symbol "*" or "." but
+right of the colon, there is possible two such symbols.
+The algorithm from (ii) will be performed first. For example the line
+
+RK Anew * : * * +c
+
+is equivalent to
+
+RK Anew * : Anew * +c
+
+i.e all kerns of type Anew * will be enlarged by c.
+
+(iv) One line instead two ones
+-----------------------------
+The line
+
+prefix new : old expression
+
+is equivalent to two lines
+
+prefix new * : old * expression
+prefix * new : * old expression
+
+The expression can be omitted. It means the character new takes the same kerns
+as the character old have.
+
+(v) List of names instead single name
+-------------------------------------
+You can replace the name of character by list of names separated by commas
+at several positions. The list is closed in parenthesis and has no spaces
+and further lists. The positions, you can replace a name by a list, are
+summarized by the following table. The "list" stands for position where the
+list is possible and the "single" stands for position where the list is
+prohibited. The table summarizes all syntactic constructions of lines for
+definitions new kerns.
+
+(i) prefix list list expression
+
+(ii) prefix list list : single single expression
+ prefix list list : single * expression
+ prefix list list : * single expression
+ prefix list list : * * expression
+
+(iii) prefix list * : single * expression
+ prefix list * : * * expression
+ prefix * list : * single expression
+ prefix * list : * * expression
+
+(iv) prefix list : single
+
+You can replace the "*" by "." in table (iii). You can see, the list is
+prohibited after colon. The list is expanded to more lines with single
+names before the algorithms (ii), (iii) and (iv) is done. If there are two
+lists in single line, the expansion is done in two levels. For example:
+
+NK (A,B,C) (x,y) : * one
+
+is expanded to six lines:
+
+NK A x : * one NK A x : A one
+NK A y : * one NK A y : A one
+NK B x : * one and it is the same as (see ii): NK B x : B one
+NK B y : * one NK B y : B one
+NK C x : * one NK C x : C one
+NK C y : * one NK C y : C one
+
+
+Ligatures
+=========
+
+Information about ligatures is written in input afm file at the end of
+lines with C prefix. For example:
+
+C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
+
+This information is completely rewritten to output afm file and it is
+sufficient for ligtable generation for typesetting systems. Really, the
+afm2tfm program (for example) reads these data and generates appropriate
+information in ligtable of tfm format. In addition, it is possible to
+declare new ligatures (specially for TeX). For example the line:
+
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+
+in the file xl2.enc defines new ligatures for "--" and "---".
+
+
+The notice about cscorr.tab file
+================================
+
+The names dquoteright and tquteright would be used for characters d' and
+t'. We use the names dcaron and tcaron instead. The reason is, the
+characters d' and t' has its uppercase alternative \v{D} and \v{T},
+i.e Dcaron and Tcaron respectively. The parameter -V (for afm2tfm
+to make the small caps variant of a font) does not work for names
+dquoteright and tqouteright. We use Lcaron instead Lquoteright, because the
+semantic of these accents is the same as for Dcaron, dcaron, Tcaron and
+tcaron.
+
+
+The notice to xl2.enc file
+==========================
+
+The file defines CSencoding vector which is superset of CS-font encoding.
+The CS-font encoding is superset of Computer Modern text font encoding (by
+the norm ISO-8859-2). There are little exceptions. The Computer Modern text
+font encoding is not definite. Two alternatives of characters are present
+at some positions depending on lig/non-lig font (fi or downarrow for
+example) and on rm/it font (the dollar or sterling).
+
+It is recommended to use two *.enc files: xl2.enc for fonts with ligatures
+and xt2.enc for typewriter-like fonts. The dollar is at position 36 in
+every circumstances and the sterling has a position number 132. The
+position number 32 in xl2.enc file is not defined because the cross for
+Polish L and l is not included in Adobe StandardEncoding. The \L and \l
+itself are included at positions 163 and 179 respectively.
+
+Note, the three-letters ligatures and uppercase greek letters are not
+present in Adobe StandardEncoding but they are present in Computer Modern
+fonts and in CS-fonts. If you want to typeset the math by PostScript font,
+you have to edit the *.vpl file to include the uppercase Greek characters
+from Symbol font (usually). Sorry, it is not obvious to typeset the math
+by PostScript font; some more hack must be done (at plainTeX macro level,
+for example).
+
+The three-letters ligatures are not used in czech but it is possible to use
+them. You can use some hack at *.vpl level and use the PostScript font
+coded by ExpertEncoding vector.
+
+For more information of czech font encoding see the [3] and the
+appendix F in [2].
+
+
+History
+=======
+Version 0 <September 1994>
+ - The program was created and placed on anonymous ftp for Czech and Slovak
+ TeX vizards. Only czech documentation was done.
+Version 1 <June 1995>
+ - New format of description file serves an arbitrary order of commands.
+ The old format wok if and only if the >> prefixes are added to variable
+ definition lines.
+ - More formats of kern definition line are possible ("lists" for example).
+ - The function "k" for kern value introduced.
+ - Some bugs removed:
+ . The unstability of unix-compiled program on input files in DOS format
+ is corrected (the ^M character at the end of line is ignored).
+ . If the field "Composites" is not present in input afm, it is created
+ in output.
+ . If an error occurs in input, the output is not touched.
+ . The Czech documentation corrected and (pseudo) English added.
+ . The cscorr.tab is rewritten. Some data are added to this file.
+
+
+Reference
+=========
+[1] Donald Knuth: Virtual fonts, a more fun for grand wizards.
+ TUGboat 11(1):13--23, April 1990.
+[2] Petr Ol\v{s}\'ak: Typografick\'y syt\'em TeX (Typesetting System TeX).
+ CSTUG 1995, 270 pages. ISBN 80-901950-0-8.
+[3] Petr Ol\v{s}\ak: \'Uvaha o fontech v CSTeXu (A Reflection about fonts in
+ CSTeX). TeXbulletin 3/93 (121--131).
+
+
diff --git a/fonts/utilities/a2ac/a2ac-eng.txt b/fonts/utilities/a2ac/a2ac-eng.txt
new file mode 120000
index 0000000000..dd600f702f
--- /dev/null
+++ b/fonts/utilities/a2ac/a2ac-eng.txt
@@ -0,0 +1 @@
+a2ac-eng.doc \ No newline at end of file
diff --git a/fonts/utilities/a2ac/a2ac.c b/fonts/utilities/a2ac/a2ac.c
new file mode 100644
index 0000000000..c77acb9e82
--- /dev/null
+++ b/fonts/utilities/a2ac/a2ac.c
@@ -0,0 +1,1214 @@
+
+/* Program a2ac, Petr Olsak */
+/* ************************* */
+
+/* ver.0 <September 94> The program was created. */
+
+/* ver.1 <June 95>
+ - The new format of description file: the order of actions are not fixed
+ - Abbverbations of kern data are allowed
+ - The function k for kern value introduced
+ - Mistake corrections:
+ . correct the nestability of unix version of a2ac on DOS files (^M)
+ . if the Composites field is missing on input, the program add its
+ . the output is no created if an error in input occurs
+ . the Czech docummentation corrected and English added */
+
+/* for more information see the a2ac-cz.doc or a2ac-eng.doc file */
+
+/* If your linker needs information about libraries, you have to load
+ the math. libm.a explicitly. For example you can use the UNIX command:
+ cc a2ac.c -lm -o a2ac
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define POOLSIZE 6000
+#define MAXLINE 256
+#define MAXP 10
+
+#define DOSCR 13
+
+#define COMMENT "Converted by a2ac to obtain more composites and kerns"
+#define ISFIXEDPITCH "IsFixedPitch"
+#define ITALICANGLE "ItalicAngle"
+#define FONTNAME "FontName"
+#define CAPHEIGHT "CapHeight"
+#define XHEIGHT "XHeight"
+#define ASCENDER "Ascender"
+#define DESCENDER "Descender"
+
+#define STARTCHARMETRICS "StartCharMetrics"
+#define ENDCHARMETRICS "EndCharMetrics"
+#define STARTKERNPAIRS "StartKernPairs"
+#define ENDKERNPAIRS "EndKernPairs"
+#define STARTCOMPOSITES "StartComposites"
+#define ENDCOMPOSITES "EndComposites"
+#define ENDFONTMETRICS "EndFontMetrics"
+
+#define STARTDEFVARIABLES "StartDefVariables"
+#define ENDDEFVARIABLES "EndDefVariables"
+#define STARTNEWCOMPOSITES "StartNewComposites"
+#define ENDNEWCOMPOSITES "EndNewComposites"
+#define STARTNEWKERNS "StartNewKerns"
+#define ENDNEWKERNS "EndNewKerns"
+#define REDUCEKERNS "ReduceKerns"
+#define STARTWXCORRECTIONS "StartWXCorrections"
+#define ENDWXCORRECTIONS "EndWXCorrections"
+
+char pool[POOLSIZE] ;
+int lastpool, poolwrite ;
+
+char line[MAXLINE], buf[20] ;
+int currspace, eofline;
+
+typedef struct CHARINFO {
+ int code ;
+ char *name ;
+ int wx ;
+ int bb[4] ;
+ char *rest ;
+} CHARINFO ;
+
+typedef struct CHARLIST {
+ CHARINFO *chi ;
+ struct CHARLIST *next ;
+} CHARLIST ;
+
+CHARLIST *firstchar, *lastchar;
+
+typedef struct KERNINFO {
+ char *name ;
+ int kern ;
+ struct KERNINFO *next ;
+} KERNINFO ;
+
+typedef struct KERNLIST {
+ char *name ;
+ KERNINFO *ki ;
+ struct KERNLIST *next ;
+} KERNLIST ;
+
+KERNLIST *firstkern, *lastkern;
+
+int sumkerns, rewkerns, onlysmall;
+int SUMkern, SUMrewritekern, SUMremovekern;
+int inputkerns=0;
+
+typedef struct COMLIST {
+ char *name ;
+ char *lin ;
+ struct COMLIST *next ;
+} COMLIST ;
+
+COMLIST *firstcom, *lastcom;
+
+typedef struct VARLIST {
+ char *name ;
+ int value ;
+ struct VARLIST *next ;
+} VARLIST ;
+
+VARLIST *firstvar, *lastvar;
+
+int ind, isfixed;
+
+char P[3][MAXP]; int S[2][MAXP]; char *N[MAXP];
+
+FILE *input, *afminput, *output, *corrfile;
+#define FGETC(INPUT) (feof(INPUT)||i>=MAXLINE ? '\n' : fgetc(INPUT))
+
+#define MAX(A,B) ((A>B) ? (A) : (B))
+#define MIN(A,B) ((A>B) ? (B) : (A))
+
+int endfile=0;
+double slant;
+
+#define ERROR(TEXT) {printf(">>>>ERROR<<<< %s\n",TEXT);printline();exit(1);}
+
+
+void printline () /* prints the line with error */
+/*---------------*/
+{
+ int i=0;
+
+ while (i < currspace) if (line[i++] == 0) line[i-1] = ' ';
+
+ printf ("Line: %s\n", line);
+ return;
+}
+
+int round (f) /* the round function */
+/*-----------*/
+ double f;
+{
+ return (int) (f >= 0) ? (f + 0.5) : (f - 0.5) ;
+}
+
+void *myalloc (size) /* alloc with own check */
+/*------------------*/
+ int size;
+{
+ void *p;
+ p = malloc (size);
+ if (myalloc == NULL) ERROR ("no memory, malloc failed");
+ return p;
+}
+
+char *newpool (s) /* adds the (probably) new string s to the pool */
+/*---------------*/
+ char *s;
+{
+ int i = 0;
+ while (i < lastpool)
+ {
+ if (strcmp(&pool[i], s) == 0) return &pool[i] ;
+ i += strlen(&pool[i]) + 1;
+ }
+ if (!poolwrite) ERROR ("Undefined identifier");
+ i = lastpool;
+ strcpy (&pool[i], s);
+ lastpool += strlen(&pool[i]) + 1;
+ return &pool[i];
+}
+
+char *readstr () /* returns the next string from line separated by ' ' */
+/*--------------*/
+{
+ int i, j;
+ if (eofline) return NULL;
+ currspace++;
+ while (line[currspace] == ' ' || line[currspace] == '\t') currspace++;
+ i = currspace;
+ while (line[i] != ' ' && line[i] != '\t' && line[i] != 0) i++;
+ if (line[i] == 0) eofline = 1;
+ line[i] = 0;
+ j = currspace; currspace = i;
+ return &line[j];
+}
+
+void readline () /* reads line with check for MAXLINE and skip blank lines */
+/*--------------*/
+{
+ register int i=0;
+
+ do
+ {
+ while ((line[i]=FGETC(input)) != '\n') i++;
+
+ if (i==MAXLINE)
+ {
+ printf ("a2ac: bad input file format\n");
+ exit (1);
+ }
+ if (feof(input))
+ {
+ if (endfile) return ;
+ printf ("a2ac: end of input not expected, bad format\n");
+ exit (1);
+ }
+ if (line[i-1] == DOSCR && i > 0) i--;
+ i = line[i] = 0;
+ while (line[i] == ' ' || line[i] == '\t') i++;
+ }
+ while (line[i] == 0) ; /* skipping blank line */
+
+ eofline = 0;
+ while (line[i] != 0 && line[i] != ' ') i++;
+ if (line[i] == 0) eofline = 1;
+ line[i] = 0;
+ currspace = i;
+ return;
+}
+
+int rawreadline () /* reads line without skip blank lines */
+/*----------------*/
+{
+ register int i=0;
+
+ while ((line[i]=FGETC(input)) != '\n') i++;
+
+ if (line[i-1] == DOSCR && i > 0) i--;
+ i = line[i] = 0;
+
+ while (line[i] != 0 && line[i] != ' ') i++;
+ if (line[i] == 0) currspace = i+1;
+ else currspace = i, line[i] = 0 ;
+ return feof(input) ;
+}
+
+int lincmp (name) /* compares name with line, returns 1 if OK */
+/*---------------*/
+ char *name ;
+{
+ register int i=0, j=0;
+ while (line[i] == name[j] && name[j]) i++, j++;
+ return !name[j];
+}
+
+void newchar (code, wx, name, b0, b1, b2, b3) /* allocates new char info */
+/*-------------------------------------------*/
+ char *name ;
+ int code, wx, b0, b1, b2, b3 ;
+{
+ CHARINFO *c; int len;
+ if (lastchar == NULL) firstchar = lastchar = myalloc (sizeof(CHARLIST)) ;
+ else lastchar = lastchar->next = myalloc (sizeof(CHARLIST)) ;
+ lastchar->next = NULL;
+ c = lastchar->chi = myalloc (sizeof(CHARINFO)) ;
+ c->name = newpool (name);
+ c->code = code;
+ c->wx = wx;
+ c->bb[0] = b0; c->bb[1] = b1; c->bb[2] = b2; c->bb[3] = b3;
+ readstr ();
+ if (eofline) c->rest = NULL ;
+ else len = strlen(&line[currspace+1]) + 1 ,
+ c->rest = myalloc(len) ,
+ strcpy (c->rest, &line[currspace+1]) ;
+ return ;
+}
+
+void newkern (name1, name2, kern) /* allocates new kern info */
+/*-------------------------------*/
+ char *name1, *name2;
+ int kern;
+{
+ KERNINFO *c, *cold; KERNLIST *p;
+
+ /* Check of presence name1 */
+
+ p = firstkern ;
+
+ while (p != NULL)
+ {
+ if (strcmp (p->name,name1) == 0) /* the name1 is present */
+ {
+ c = p->ki ;
+ do
+ {
+ if (strcmp (c->name,name2) == 0) { c->kern = kern ; return ; }
+ cold = c ;
+ c = c->next;
+ }
+ while (c != NULL) ;
+
+ c = cold->next = myalloc (sizeof(KERNINFO));
+ c->name = newpool(name2);
+ c->kern = kern;
+ c->next = NULL;
+ return;
+ }
+ p = p->next ;
+ }
+
+ /* Make new KERNLIST */
+
+ if (lastkern == NULL) firstkern = lastkern = myalloc (sizeof(KERNLIST)) ;
+ else lastkern = lastkern->next = myalloc (sizeof(KERNLIST)) ;
+ lastkern->next = NULL;
+ lastkern->name = newpool(name1);
+ c = lastkern->ki = myalloc (sizeof(KERNINFO)) ;
+ c->name = newpool(name2);
+ c->kern = kern;
+ c->next = NULL;
+ return;
+}
+
+void newcom (name) /* allocates new composite info */
+/*----------------*/
+ char *name;
+{
+ if (lastcom == NULL) firstcom = lastcom = myalloc (sizeof(COMLIST)) ;
+ else lastcom = lastcom->next = myalloc (sizeof(COMLIST)) ;
+ lastcom->next = NULL;
+ lastcom->name = newpool(name);
+ line[currspace] = ' ';
+ lastcom->lin = myalloc(strlen(line)+1);
+ strcpy (lastcom->lin, line);
+ return;
+}
+
+void newvar (name, value) /* allocates new variable info */
+/*-----------------------*/
+ char *name;
+ int value;
+{
+ VARLIST *p;
+
+ p = firstvar;
+ while (p != NULL)
+ {
+ if (strcmp (p->name, name) == 0)
+ {
+ p->value = value;
+ printf (">> %s = %d\n", name, value);
+ return;
+ }
+ p = p->next;
+ }
+ if (lastvar == NULL) firstvar = lastvar = myalloc (sizeof(VARLIST)) ;
+ else lastvar = lastvar->next = myalloc (sizeof(VARLIST)) ;
+ lastvar->next = NULL;
+ lastvar->name = newpool(name);
+ lastvar->value = value;
+ printf (">> %s = %d\n", name, value);
+}
+
+void readafm () /* reads the afm input (first step) */
+/*-------------*/
+{
+ int c, wx, b0, b1, b2, b3, kern;
+ char *name, *name1, *name2;
+
+ /* read CharMetrics */
+
+ isfixed = 0; slant = 0.0;
+ do
+ {
+ readline() ;
+ if (lincmp (FONTNAME)) printf ("%s %s\n", FONTNAME, &line[currspace+1]);
+ if (lincmp (ISFIXEDPITCH) && line[currspace+1] == 't') isfixed = 1 ;
+ if (lincmp (ITALICANGLE))
+ slant = tan (-0.0174532 * (double) atoi (readstr ())) ;
+ if (lincmp (CAPHEIGHT)) newvar (CAPHEIGHT, atoi (readstr ()));
+ if (lincmp (XHEIGHT)) newvar (XHEIGHT, atoi (readstr ()));
+ if (lincmp (ASCENDER)) newvar (ASCENDER, atoi (readstr ()));
+ if (lincmp (DESCENDER)) newvar (DESCENDER, atoi (readstr ()));
+ }
+ while (!lincmp (STARTCHARMETRICS));
+
+ while (1)
+ {
+ readline () ;
+ if (lincmp(ENDCHARMETRICS)) break;
+
+ c = atoi (readstr ()) ;
+
+ while (!eofline && strcmp("WX",readstr()) != 0) ;
+ if (eofline) ERROR("the WX attribute not present, bad AFM ??");
+ wx = atoi (readstr ());
+
+ while (!eofline && strcmp("N",readstr()) != 0) ;
+ if (eofline) ERROR("the N attribute not present, bad AFM ??");
+ name = readstr ();
+
+ while (!eofline && strcmp("B",readstr()) != 0) ;
+ if (eofline) ERROR("the B attribute not present, bad AFM ??");
+ b0 = atoi (readstr ()); b1 = atoi (readstr ());
+ b2 = atoi (readstr ()); b3 = atoi (readstr ());
+
+ newchar (c, wx, name, b0, b1, b2, b3);
+ }
+
+ /* read KernPairs */
+
+ do
+ {
+ readline ();
+ if (lincmp (ENDFONTMETRICS)) return ;
+ if (lincmp (STARTCOMPOSITES)) break ;
+ }
+ while (!lincmp (STARTKERNPAIRS)) ;
+
+ if (lincmp (STARTKERNPAIRS))
+ {
+ while (1)
+ {
+ readline () ;
+ if (lincmp (ENDKERNPAIRS)) break;
+
+ name1 = readstr () ; name2 = readstr () ;
+ if (eofline) ERROR("the kern pair not compleete, bad AFM ??") ;
+ kern = atoi (readstr ());
+
+ newkern (name1, name2, kern);
+ inputkerns++;
+ }
+
+ /* read Composites */
+
+ do
+ {
+ readline() ;
+ if (lincmp (ENDFONTMETRICS)) return ;
+ }
+ while (!lincmp (STARTCOMPOSITES));
+ }
+
+ while (1)
+ {
+ readline () ;
+ if (lincmp (ENDCOMPOSITES)) break;
+
+ line[currspace] = ' '; name = readstr ();
+
+ newcom (name);
+ }
+
+ return;
+}
+
+int valvar(c) /* returns the value of variable c */
+/*-----------*/
+ char *c;
+{
+ int i=0; char save; VARLIST *p;
+
+ while ( isalnum (c[i]) || c[i]=='_') i++;
+ save = c[i]; c[i] = 0;
+ p = firstvar;
+ while (p != NULL)
+ {
+ if (strcmp (c,p->name) == 0) break;
+ p = p->next;
+ }
+ if (p == NULL) ERROR ("Variable is not defined");
+ c[i] = save;
+ ind += i;
+ return p->value;
+}
+
+int valF(c) /* returns the value of function */
+/*---------*/
+ char *c;
+{
+ int i, i0, j, v; CHARLIST *p;
+
+ i = 2;
+
+ while (c[i] != ',' && c[i] != ')' && c[i] != 0) i++;
+ if (c[i] == 0) ERROR ("Bad syntax for function");
+ j = c[i]; c[i] = 0;
+ p = firstchar;
+ while (p != NULL)
+ {
+ if (strcmp (p->chi->name, &c[2]) == 0) break ;
+ p = p->next;
+ }
+ if (p == NULL) ERROR ("Uknown identifier as parameter of function");
+ switch (c[0])
+ {
+ case 'b' : if (j != ',') ERROR ("two parameters expected in b function");
+ if (!isdigit (c[i+1])) ERROR ("Bad index in b function");
+ if (c[i+2] != ')') ERROR ("Long index in b function");
+ c[i+2] = 0;
+ j = atoi (&c[i+1]) ;
+ if (j > 4 || j == 0)
+ ERROR ("Index must be in 1..4 in B function");
+ ind += i+3;
+ return p->chi->bb[j-1];
+ case 'w' : v = p->chi->bb[2] - p->chi->bb[0]; break;
+ case 'h' : v = p->chi->bb[3] - p->chi->bb[1]; break;
+ case 'k' : if (j != ',') ERROR ("two parameters expected in b function");
+ i++; i0 = i;
+ while (c[i] != ')' && c[i] != 0) i++;
+ if (c[i] == 0) ERROR ("Bad syntax for function");
+ j = c[i]; c[i] = 0;
+ v = searchkern (&c[2], &c[i0]);
+ break;
+ case 'W' : v = p->chi->wx;
+ }
+ if (j != ')') ERROR ("one parameter expected in function");
+ ind += i+1;
+ return v ;
+}
+
+int number(c) /* evaluates the number in the simple expressinon */
+/*-----------*/
+ char *c;
+{
+ int i; double f; char save;
+
+ if (!isdigit(c[0]) && c[0] != '.') ERROR ("Syntax error in expression");
+
+ i = 0;
+ while (isdigit (c[i]) || c[i] == '.') i++;
+ save = c[i]; c[i] = 0;
+ f = atof (c);
+ ind += i;
+ c[i] = save;
+
+ if (!isalpha (c[i])) return round (f);
+
+ if ((c[i]=='b'||c[i]=='w'||c[i]=='h'||c[i]=='W'||c[i]=='k') && c[i+1] == '(')
+ return round (f * valF(&c[i])) ;
+ return round (f * valvar(&c[i])) ;
+}
+
+int eval (c) /* evaluates the simple expressinon */
+/*----------*/
+ char *c;
+{
+ int v, sg;
+
+ ind = 0; v = 0; sg = 1;
+
+ if (c[0] == '-') sg = -1 , ind++;
+ if (c[0] == '+') ind++;
+
+ while (1)
+ {
+ if ((c[ind]=='b'||c[ind]=='w'||c[ind]=='h'||c[ind]=='W'||c[ind]=='k')
+ && c[ind+1] == '(') v += sg * valF(&c[ind]) ;
+ else if (isalpha (c[ind])) v += sg * valvar(&c[ind]) ;
+ else v += sg * number(&c[ind]) ;
+
+ if (c[ind] == ' ' || c[ind] == 0) break ;
+ switch (c[ind++])
+ {
+ case '+' : sg = 1; break;
+ case '.' : sg = 1; ind--; break;
+ case '-' : sg = -1; break;
+ default : ERROR ("Syntax error in expression");
+ }
+ }
+ return v;
+}
+
+void removespaces () /* shift the characters in line to remove spaces */
+/*------------------*/
+{
+ register int i=0, j=0;
+
+ while (1)
+ {
+ while (line[i] != ' ' && line[i] != '\t' && line[i] != 0) i++;
+ if (line[i] == 0) return;
+
+ j = i;
+ while (line[j++] != 0) line[j-1] = line[j];
+ line[j-1] = 0;
+ }
+}
+
+void calculatecompose (name, num) /* calculates new BoudingBox nad CC */
+/*-------------------------------*/
+ char *name;
+ int num;
+{
+ int i, j; CHARLIST *p, *p1, *pc; COMLIST *pcc;
+ int b0, b1, b2, b3;
+
+ /* calculate new BoudingBoxes and recalculate CC parameters */
+
+/* printf ("CC input: %s, %s: %d %d, %s: %d %d\n",
+ name, N[0], S[0][0], S[1][0], N[1], S[0][1], S[1][1]); */
+
+ pc = firstchar;
+ while (pc != NULL)
+ {
+ if (strcmp (name, pc->chi->name) == 0)
+ {
+ if (pc->chi->code > 0 && line[0] != '!') return ;
+ if (line[0] == 'N') return ;
+ break ;
+ }
+ pc = pc->next;
+ }
+
+ p = firstchar;
+ while (p != NULL)
+ {
+ if (strcmp(N[0], p->chi->name) == 0) break ;
+ p = p->next;
+ }
+ if (p == NULL) ERROR ("Undefined identifier");
+
+ b0 = p->chi->bb[0] + S[0][0] ; b2 = p->chi->bb[2] + S[0][0];
+ b1 = p->chi->bb[1] + S[1][0] ; b3 = p->chi->bb[3] + S[1][0];
+
+ for (i=1; i<num; i++)
+ {
+ if (P[0][i] != 'P') ERROR ("Character P exepted as first");
+
+ p1 = firstchar;
+ while (p1 != NULL)
+ {
+ if (strcmp(N[i], p1->chi->name) == 0) break ;
+ p1 = p1->next;
+ }
+ if (p1 == NULL) ERROR ("Undefined identifier");
+
+ if (P[2][i] != 'C')
+ {
+ if (P[2][i] != 'T') ERROR ("The third premisse have to be C or T");
+
+ S[1][i] -= p1->chi->bb[3] ;
+ }
+ b1 = MIN (b1, (p1->chi->bb[1] + S[1][i]));
+ b3 = MAX (b3, (p1->chi->bb[3] + S[1][i]));
+
+ if (P[1][i] != 'C')
+ {
+ if (P[1][i] != 'A') ERROR ("The second premisse have to be C or A");
+
+ S[0][i] += (p->chi->wx - p1->chi->wx)/2 + (int)(slant * S[1][i]) ;
+ }
+ b0 = MIN (b0, (p1->chi->bb[0] + S[0][i]));
+ b2 = MAX (b2, (p1->chi->bb[2] + S[0][i]));
+ }
+
+ /* write results to line[] */
+
+ pcc = firstcom;
+ while (pcc != NULL)
+ {
+ if (strcmp (name, pcc->name) == 0)
+ {
+ if (line[0] == 'N') break;
+ }
+ pcc = pcc->next;
+ }
+
+ sprintf (line, "CC %s %d ; PCC %s %d %d ; PCC %s %d %d ;",
+ name, num,
+ N[0], S[0][0], S[1][0], N[1], S[0][1], S[1][1]) ;
+ j = strlen (line);
+
+ for (i=2; i<num; i++)
+ {
+ sprintf (&line[j], " PCC %s %d %d ;", N[i], S[0][i], S[1][i]);
+ j = strlen (line);
+ }
+ currspace = j+2;
+ printf ("%s\n", line);
+
+ if (pcc == NULL) newcom (name);
+ else
+ {
+ pcc->lin = myalloc (strlen (line) + 1);
+ strcpy (pcc->lin, line);
+ }
+
+ /* save new Bouding Box parameters */
+
+ if (pc != NULL)
+ {
+ pc->chi->code = -1; pc->chi->wx = p->chi->wx;
+ pc->chi->bb[0] = b0; pc->chi->bb[1] = b1;
+ pc->chi->bb[2] = b2; pc->chi->bb[3] = b3;
+ }
+ else newchar (-1, p->chi->wx, name, b0, b1, b2, b3);
+
+ return;
+}
+
+void reducekerns (value) /* removes kerns with abs value less than value */
+/*----------------------*/
+ int value;
+{
+ KERNLIST *p, **p0; KERNINFO *pi, **pi0; int i=0; char s[2];
+
+ printf ("ReduceKerns. Abs. value: %d .", value);
+
+ p = firstkern; p0 = &firstkern;
+ while (p != NULL)
+ {
+ pi = p->ki; pi0 = &(p->ki);
+ while (pi != NULL)
+ {
+ if (abs(pi->kern) <= value) *pi0 = pi->next, i++, free(pi) ;
+ else pi0 = &(pi->next) ;
+
+ pi = *pi0;
+ }
+ if (p->ki == NULL) *p0 = p->next, free(p);
+ else p0 = &(p->next);
+
+ p = *p0;
+ }
+
+ p = firstkern;
+ while (p != NULL) lastkern = p, p = p->next;
+
+ s[1] = 0;
+ if (i == 1) s[0] = 0; else s[0] = 's';
+ printf (" Removed: %d kern pair%s\n", i, s);
+ SUMremovekern += i;
+ return ;
+}
+
+
+void setnewkern (name1, name2, kern) /* creates new kern(s) */
+/*----------------------------------*/
+ char *name1, *name2;
+ int kern;
+{
+ KERNLIST *p; KERNINFO *pi;
+
+ p = firstkern;
+ while (p != NULL)
+ {
+ if (strcmp (p->name, name1) == 0)
+ {
+ pi = p->ki;
+ while (pi != NULL)
+ {
+ if (strcmp (pi->name, name2) == 0) /* rewrite orig. kern info ? */
+ {
+ if (line[0] != 'N') pi->kern = kern, sumkerns++, rewkerns++;
+ return;
+ }
+ if (pi->next == NULL) /* make new kern info */
+ {
+ pi = pi->next = myalloc (sizeof (KERNINFO));
+ pi->next = NULL;
+ pi->name = newpool (name2);
+ pi->kern = kern;
+ sumkerns++;
+ return;
+ }
+ pi = pi->next;
+ }
+ }
+ p = p->next;
+ }
+ newkern (name1, name2, kern);
+ sumkerns++;
+ return;
+}
+
+int searchkern (name1, name2) /* returns the kern value of pair name1 name2 */
+/*---------------------------*/
+ char *name1, *name2;
+{
+ KERNLIST *p; KERNINFO *pi;
+
+ p = firstkern;
+ while (p != NULL)
+ {
+ if (strcmp (p->name, name1) == 0)
+ {
+ pi = p->ki;
+ while (pi != NULL)
+ {
+ if (strcmp (pi->name, name2) == 0) return pi->kern;
+ pi = pi->next;
+ }
+ }
+ p = p->next;
+ }
+ return 0;
+}
+
+
+void testkernline (name1, name2, name3, name4) /* test patterns */
+/*--------------------------------------------*/
+ char *name1, *name2, *name3, *name4;
+{
+ if (name3[0] == '.') onlysmall = 1, name3[0] = '*';
+ if (name4[0] == '.') onlysmall = 1, name4[0] = '*';
+ if (name1[0] == '.') onlysmall = 1, name1[0] = '*';
+ if (name2[0] == '.') onlysmall = 1, name2[0] = '*';
+
+ if (name1[0] == '*' && name2[0] == '*' ||
+ name3[0] != '*' && name1[0] == '*' ||
+ name4[0] != '*' && name2[0] == '*' ) ERROR ("inconsistent mask");
+}
+
+
+void makenewkerns (name1, name2, name3, name4, expr) /* one pattern */
+/*--------------------------------------------------*/
+ char *name1, *name2, *name3, *name4, *expr;
+{
+ KERNLIST *p, *p1; KERNINFO *pi, *pi1, *spi; int v; int i; char *np;
+
+ if (name1[0] == '(')
+ {
+ i = 1; np = &name1[i];
+ while (name1[i] != 0 && name1[i] != ')')
+ {
+ if (name1[i] == ',')
+ {
+ name1[i] = 0 ;
+ makenewkerns (np, name2, name3, name4, expr);
+ name1[i] = ',';
+ np = &name1[i+1];
+ }
+ i++;
+ }
+ if (name1[i] != ')') ERROR ("The ')' expected");
+ name1[i] = 0 ;
+ makenewkerns (np, name2, name3, name4, expr);
+ name1[i] = ')' ;
+ return;
+ }
+
+ if (name2[0] == '(')
+ {
+ i = 1; np = &name2[i];
+ while (name2[i] != 0 && name2[i] != ')')
+ {
+ if (name2[i] == ',')
+ {
+ name2[i] = 0 ;
+ makenewkerns (name1, np, name3, name4, expr);
+ name2[i] = ',';
+ np = &name2[i+1];
+ }
+ i++;
+ }
+ if (name2[i] != ')') ERROR ("The ')' expected");
+ name2[i] = 0 ;
+ makenewkerns (name1, np, name3, name4, expr);
+ name2[i] = ')' ;
+ return;
+ }
+
+ /* name1 and name2 are one symbolic name (or "*", "."), no a list */
+
+ if (expr == NULL) v = 0;
+ else v = eval (expr);
+
+ if (name3==NULL)
+ {
+ setnewkern (name1, name2, v);
+ return;
+ }
+
+ if (name3[0] == '*') name3 = name1;
+ if (name4[0] == '*') name4 = name2;
+
+ if (name1[0] != '*' && name2[0] != '*')
+ {
+ setnewkern (name1, name2, searchkern (name3, name4)+v);
+ return;
+ }
+
+ /* more kerns */
+
+ if (name2[0] == '*')
+ {
+ p = firstkern;
+ while (p != NULL)
+ {
+ if (strcmp (p->name, name3) == 0)
+ {
+ pi = p->ki;
+ while (pi != NULL)
+ {
+ if (!onlysmall || islower (pi->name[0]))
+ setnewkern (name1, pi->name, pi->kern+v);
+ pi = pi->next;
+ }
+ }
+ p = p->next;
+ }
+ return;
+ }
+ p = firstkern;
+ while (p != 0)
+ {
+ pi = p->ki;
+ while (pi != NULL)
+ {
+ if (strcmp (pi->name, name4) == 0)
+ {
+ if (!onlysmall || islower (p->name[0]))
+ setnewkern (p->name, name2, pi->kern+v);
+ break;
+ }
+ pi = pi->next;
+ }
+ p = p->next;
+ }
+ return;
+}
+
+void makenews () /* variables, new composites, width corrs and kerns */
+/*--------------*/
+{
+ int i, j;
+ char *name, *name1, *name2, *name3, *name4, *expr, *p;
+ VARLIST *pv; CHARLIST *pc;
+ KERNLIST *pk; KERNINFO *pi;
+ char s[2];
+
+ s[1]=0; SUMkern=0; SUMrewritekern=0; SUMremovekern=0;
+
+ endfile = 1;
+ do
+ {
+ readline ();
+
+ if (lincmp (">>")) /* Variable setting */
+ {
+ if (!eofline) line[currspace] = ' ';
+ removespaces () ;
+ i = 0;
+ while (line[i] != '=' && line[i] != 0) i++;
+ if (line[i] == 0 || i==2) ERROR ("Missing '=' or variable identifier");
+
+ line[i] = 0; name = newpool(&line[2]); line[i] = '=';
+ newvar (name, eval(&line[i+1]));
+ continue;
+ }
+ if (lincmp ("NC") || lincmp ("RC") || lincmp ("!C")) /* New composite */
+ {
+ name = newpool(readstr ());
+
+ i = 0; poolwrite = 0;
+ while (1)
+ {
+ while (!eofline && strcmp (readstr (), ";") != 0) ;
+ p = readstr ();
+ if (eofline) break;
+ P[0][i] = p[0], P[1][i] = p[1]; P[2][i] = p[2];
+ N[i] = newpool (readstr ());
+ S[0][i] = eval (readstr ());
+ if (eofline) ERROR ("Uncomplete compose definition (param missing)");
+ S[1][i] = eval (readstr ());
+ if (eofline) ERROR ("Uncomplete compose definition (';' missing)");
+ i++;
+ }
+ if (i < 2) ERROR ("Uncomplete composite definition");
+ calculatecompose (name, i);
+ poolwrite = 1;
+ continue;
+ }
+ if (isfixed) continue;
+
+ if (lincmp ("RWX")) /* Width correction */
+ {
+ name = readstr ();
+ if (eofline) ERROR ("Uncomplete WX correction line");
+ pc = firstchar;
+ while (pc != NULL)
+ {
+ if (strcmp (pc->chi->name, name) == 0)
+ {
+ p = readstr ();
+ pc->chi->wx = eval (p) ;
+ printf ("RWX %s ; WX %d\n", name, pc->chi->wx) ;
+ break;
+ }
+ pc = pc->next;
+ }
+ if (pc == NULL) ERROR ("Uknown identifier");
+ continue;
+ }
+ if (lincmp (REDUCEKERNS)) /* ReduceKerns */
+ {
+ reducekerns (eval (readstr ()));
+ continue;
+ }
+ if (lincmp("NK") || lincmp("RK")) /* Kern */
+ {
+ poolwrite = 0;
+ if (eofline) ERROR ("Short kern definition");
+
+ onlysmall = rewkerns = sumkerns = 0;
+
+ name1 = readstr (); name2 = readstr ();
+ if (eofline) ERROR ("Short kern definition");
+
+ if (name2[0] == ':')
+ {
+ name2 = readstr ();
+ expr = readstr ();
+ makenewkerns (name1, "*", name2, "*", expr);
+ makenewkerns ("*", name1, "*", name2, expr);
+ }
+ else
+ {
+ expr = readstr ();
+
+ if (expr[0] == ':') /* Mask definition */
+ {
+ name3 = readstr (); name4 = readstr (); expr = readstr ();
+ testkernline (name1, name2, name3, name4);
+ makenewkerns (name1, name2, name3, name4, expr);
+ }
+ else /* only One new kern */
+ makenewkerns (name1, name2, NULL, NULL, expr);
+ }
+ SUMkern += sumkerns; SUMrewritekern += rewkerns;
+ if (sumkerns > 0)
+ {
+ for (j=0; j<currspace; j++)
+ {
+ if (line[j] == 0) line[j] = ' ';
+ if (line[j] == '*' && onlysmall) line[j] = '.';
+ }
+ printf ("%s", line);
+ if (sumkerns == 1) s[0] = 0 ; else s[0] = 's' ;
+ printf (" -- %d kern pair%s added", sumkerns, s);
+ if (rewkerns == 1) s[0] = 0 ; else s[0] = 's' ;
+ if (rewkerns) printf (" (%d pair%s rewritten)\n", rewkerns, s) ;
+ else printf ("\n") ;
+ }
+ poolwrite = 1;
+ continue;
+ }
+ }
+ while (!feof (input)) ;
+ if (!isfixed)
+ {
+ printf ("Kern summary: %d added, %d rewitten, %d removed.\n",
+ SUMkern, SUMrewritekern, SUMremovekern);
+
+ i = 0; pk = firstkern;
+ while (pk != NULL)
+ {
+ pi = pk->ki;
+ while (pi != NULL) pi = pi->next, i++;
+ pk = pk->next;
+ }
+ printf (" Total kerns: input %d, output %d.\n",
+ inputkerns, i);
+ }
+ return;
+}
+
+void writeafm () /* writes the output */
+/*--------------*/
+{
+
+ CHARLIST *p; KERNLIST *pk; KERNINFO *pi; COMLIST *c;
+ int i;
+
+ /* Write header */
+
+ rawreadline (); line[currspace] = ' ';
+ fprintf(output, "%s\nComment %s\n", line, COMMENT);
+
+ while (1)
+ {
+ rawreadline ();
+ if (lincmp (STARTCHARMETRICS)) break ;
+ line[currspace] = ' ';
+ fprintf (output, "%s\n", line);
+ }
+
+ /* Write CharMetrics */
+
+ i = 0; p = firstchar;
+ while (p != NULL) p = p->next, i++;
+
+ fprintf (output, "%s %d\n", STARTCHARMETRICS, i);
+
+ p = firstchar;
+ while (p != NULL)
+ {
+ fprintf (output, "C %d ; WX %d ; N %s ; B %d %d %d %d ;",
+ p->chi->code,
+ p->chi->wx,
+ p->chi->name,
+ p->chi->bb[0],
+ p->chi->bb[1],
+ p->chi->bb[2],
+ p->chi->bb[3]) ;
+
+ if (p->chi->rest == NULL) fprintf (output, "\n") ;
+ else fprintf (output, " %s\n", p->chi->rest) ;
+
+ p = p->next;
+ }
+ while (!lincmp (ENDCHARMETRICS)) rawreadline ();
+ fprintf (output, "%s\n", line);
+
+ /* Write KernPairs */
+
+ while (1)
+ {
+ if (rawreadline ()) return;
+ if (lincmp (ENDFONTMETRICS)) goto SKIP ;
+ if (lincmp (STARTKERNPAIRS)) break ;
+ if (lincmp (STARTCOMPOSITES)) goto SKIP ;
+ line[currspace] = ' ';
+ fprintf (output, "%s\n", line);
+ }
+
+ i = 0; pk = firstkern;
+ while (pk != NULL)
+ {
+ pi = pk->ki;
+ while (pi != NULL) pi = pi->next, i++;
+ pk = pk->next;
+ }
+ fprintf (output, "%s %d\n\n", STARTKERNPAIRS, i);
+
+ pk = firstkern;
+ while (pk != NULL)
+ {
+ pi = pk->ki;
+ while (pi != NULL)
+ {
+ fprintf (output, "KPX %s %s %d\n", pk->name, pi->name, pi->kern);
+ pi = pi->next;
+ }
+ fprintf (output, "\n");
+ pk = pk->next;
+ }
+
+ while (!lincmp (ENDKERNPAIRS)) rawreadline ();
+ fprintf (output, "%s\n", line);
+
+ /* Write Composites */
+
+ while (1)
+ {
+ if (rawreadline ()) return;
+ if (lincmp (ENDFONTMETRICS)) break ;
+ if (lincmp (STARTCOMPOSITES)) break ;
+ line[currspace] = ' ';
+ fprintf (output, "%s\n", line);
+ }
+
+ SKIP:
+ i = 0; c = firstcom;
+ while (c != NULL) c = c->next, i++;
+ fprintf (output, "%s %d\n", STARTCOMPOSITES, i);
+
+ c = firstcom;
+ while (c != NULL) fprintf (output, "%s\n", c->lin), c = c->next;
+
+ fprintf (output, "%s\n", ENDCOMPOSITES);
+ if (lincmp (STARTCOMPOSITES))
+ {
+ while (!lincmp (ENDCOMPOSITES)) rawreadline ();
+ while (rawreadline() == 0)
+ {
+ line[currspace] = ' ';
+ fprintf (output, "%s\n", line);
+ }
+ }
+ else fprintf (output, "%s\n", ENDFONTMETRICS);
+ return;
+}
+
+int main (argc, argv) /* main program */
+/*-------------------*/
+ int argc;
+ char *argv[];
+{
+ lastpool = 0;
+ firstchar = lastchar = NULL;
+ firstkern = lastkern = NULL;
+ firstcom = lastcom = NULL;
+ firstvar = lastvar = NULL;
+ poolwrite = 1;
+
+ printf ("Program a2ac, ver.1, Copyright (C) 1994,1995, Petr Olsak\n");
+
+ if (argc != 4)
+ return printf ("usage: a2ac input.afm corr.tab output.afm\n"), 2 ;
+
+ afminput = fopen (argv[1], "r");
+ if (afminput == NULL) ERROR ("can't open afm input file");
+ corrfile = fopen (argv[2], "r");
+ if (corrfile == NULL) ERROR ("can't open corr file");
+
+ input = afminput; readafm () ;
+ input = corrfile; makenews () ;
+
+ input = afminput; rewind (input);
+ output = fopen (argv[3], "w");
+ if (output == NULL) ERROR ("can't write to output file");
+
+ writeafm () ;
+ return 0;
+}
diff --git a/fonts/utilities/a2ac/cscorr.tab b/fonts/utilities/a2ac/cscorr.tab
new file mode 100644
index 0000000000..c7f8597b58
--- /dev/null
+++ b/fonts/utilities/a2ac/cscorr.tab
@@ -0,0 +1,132 @@
+% The description file for a2ac program for making Czech and Slovak composites
+%
+% Petr Olsak, June 1995
+%
+% Tested for 32 fonts (see file mfonts.bat and psfonts.tex)
+
+ReduceKerns 9
+
+>> Captop = b(I,4)
+>> distance = 0.0916 Captop
+>> Acutetop = Captop + h(acute) + distance
+>> Carontop = Captop + h(caron) + distance
+>> acutewidth = w(acute)
+>> acuteshift = 0.1 acutewidth
+>> Acuteshift = 0.19 acutewidth
+>> vshift = 0
+>> diershift = b(acute,4) - b(dieresis,4)
+>> Ccorrection = 0.1 w(C)
+>> ccorrection = 0.05 w(c)
+>> quotwidth = w(quoteright)
+>> quotshift = .1quotwidth-b(quoteright,1)
+
+NC Aacute 2 ; PCC A 0 0 ; PAT acute Acuteshift Acutetop ;
+NC Adieresis 2 ; PCC A 0 0 ; PAT dieresis 0 Acutetop-diershift ;
+NK (Aacute,Adieresis) : A
+NC aacute 2 ; PCC a 0 0 ; PAC acute acuteshift vshift ;
+NC adieresis 2 ; PCC a 0 0 ; PAC dieresis 0 vshift ;
+NK (aacute,adieresis) : a
+RK (T,P) (aacute,adieresis) 0
+NC Agrave 2 ; PCC A 0 0 ; PAT grave -Acuteshift Acutetop ;
+NC agrave 2 ; PCC a 0 0 ; PAC grave -acuteshift vshift ;
+% Agrave needn't kerns---it is symbol only.
+
+NC Ccaron 2 ; PCC C 0 0 ; PAT caron Ccorrection Carontop ;
+NK Ccaron : C
+NC ccaron 2 ; PCC c 0 0 ; PAC caron ccorrection vshift ;
+NK ccaron : c
+RK V ccaron 0
+
+NC Dcaron 2 ; PCC D 0 0 ; PAT caron 0 Carontop ;
+NK Dcaron : D
+NC dcaron 2 ; PCC d 0 0 ; PCT quoteright quotshift+b(d,3) 1.1b(d,4) ;
+RWX dcaron W(d)+0.7quotwidth
+NK * dcaron : * d
+NK dcaron * : f * -.3quotwidth
+
+NC Ecaron 2 ; PCC E 0 0 ; PAT caron 0 Carontop ;
+NC Eacute 2 ; PCC E 0 0 ; PAT acute Acuteshift Acutetop ;
+NK (Ecaron,Eacute) : E
+NC ecaron 2 ; PCC e 0 0 ; PAC caron 0 0 ;
+NC eacute 2 ; PCC e 0 0 ; PAC acute acuteshift vshift ;
+NK (ecaron,eacute) : e
+RK (P,T,V) ecaron 0
+RK (P,T) eacute 0
+
+NC Iacute 2 ; PCC I 0 0 ; PAT acute Acuteshift Acutetop ;
+NK Iacute : I
+NC iacute 2 ; PCC dotlessi 0 0 ; PAC acute acuteshift 0 ;
+NK iacute : i
+
+NC Lcaron 2 ; PCC L 0 0 ; PCT quoteright quotshift+b(I,3) 1.1Captop ;
+NC Lacute 2 ; PCC L 0 0 ; PAT acute 0 Acutetop ;
+NK (Lcaron,Lacute) : L
+NC lcaron 2 ; PCC l 0 0 ; PCT quoteright quotshift+b(l,3) 1.1b(l,4) ;
+RWX lcaron W(l)+0.7quotwidth
+NK * lcaron : * l
+NK lcaron * : f * -.3quotwidth
+NC lacute 2 ; PCC l 0 0 ; PAT acute acuteshift Acutetop ;
+NK lacute : l
+
+NC Ncaron 2 ; PCC N 0 0 ; PAT caron 0 Carontop ;
+NK Ncaron : N
+NC ncaron 2 ; PCC n 0 0 ; PAC caron 0 vshift ;
+NK ncaron : n
+
+NC Ocircumflex 2 ; PCC O 0 0 ; PAT circumflex 0 Carontop ;
+NC Odieresis 2 ; PCC O 0 0 ; PAT dieresis 0 Acutetop-diershift ;
+NC Oacute 2 ; PCC O 0 0 ; PAT acute Acuteshift Acutetop ;
+NK (Ocircumflex,Odieresis,Oacute) : O
+NC ocircumflex 2 ; PCC o 0 0 ; PAC circumflex 0 vshift ;
+NC odieresis 2 ; PCC o 0 0 ; PAC dieresis 0 vshift ;
+NC oacute 2 ; PCC o 0 0 ; PAC acute acuteshift vshift ;
+NK (ocircumflex,odieresis,oacute) : o
+
+NC Rcaron 2 ; PCC R 0 0 ; PAT caron 0 Carontop ;
+NC Racute 2 ; PCC R 0 0 ; PAT acute Acuteshift Acutetop ;
+NK (Rcaron,Racute) : R
+NC rcaron 2 ; PCC r 0 0 ; PAC caron 0 vshift ;
+NC racute 2 ; PCC r 0 0 ; PAC acute acuteshift vshift ;
+NK (rcaron,racute) : r
+RK (F,P,T,V) rcaron 0
+RK (P,T) racute 0
+
+NC Scaron 2 ; PCC S 0 0 ; PAT caron 0 Carontop ;
+NK Scaron : S
+NC scaron 2 ; PCC s 0 0 ; PAC caron 0 vshift ;
+NK scaron : s
+RK (F,P,T,V) scaron 0
+
+NC Tcaron 2 ; PCC T 0 0 ; PAT caron 0 Carontop ;
+NK Tcaron : T
+NC tcaron 2 ; PCC t 0 0 ; PCC quoteright quotshift+b(t,3) 0 ;
+RWX tcaron W(t)+0.7quotwidth
+NK * tcaron : * t
+NK tcaron * : f * -.3quotwidth
+
+NC Udieresis 2 ; PCC U 0 0 ; PAT dieresis 0 Acutetop-diershift ;
+NC Uring 2 ; PCC U 0 0 ; PAT ring 0 Carontop ;
+NC Uacute 2 ; PCC U 0 0 ; PAT acute Acuteshift Acutetop ;
+NK (Udieresis,Uring,Uacute) : U
+NC udieresis 2 ; PCC u 0 0 ; PAC dieresis 0 vshift ;
+NC uring 2 ; PCC u 0 0 ; PAC ring 0 vshift ;
+NC uacute 2 ; PCC u 0 0 ; PAC acute acuteshift vshift ;
+NK (udieresis,uring,uacute) : u
+RK (F,P,T,V) uring 0
+
+NC Yacute 2 ; PCC Y 0 0 ; PAT acute Acuteshift Acutetop ;
+NK Yacute : Y
+NC yacute 2 ; PCC y 0 0 ; PAC acute acuteshift vshift ;
+NK yacute : y
+
+RC Zcaron 2 ; PCC Z 0 0 ; PAT caron 0 Carontop ;
+NK Zcaron : Z
+RC zcaron 2 ; PCC z 0 0 ; PAC caron 0 vshift ;
+NK zcaron : z
+RK (F,P,T,V) zcaron 0
+
+NK (eacute,ecaron,iacute) quotedblleft quotwidth
+
+ReduceKerns 9
+
+
diff --git a/fonts/utilities/a2ac/mkallfnt b/fonts/utilities/a2ac/mkallfnt
new file mode 100644
index 0000000000..7bca1e7cc4
--- /dev/null
+++ b/fonts/utilities/a2ac/mkallfnt
@@ -0,0 +1,47 @@
+# Script prepares all 32 standard PostScript fonts for TeX
+# (for Czech and Slovak).
+# The result is TeX virtual fonts prefixed by c letter, i.e.
+# \font\tenrm=cptmr loads Czech and Slovak variant of Times-Roman font,
+# irrespective to \font\tenrm=ptmr loads standard Times-Roman without
+# Czech and Slovak support.
+
+mkfnt Times-Roman ptmr
+mkfnt Times-Bold ptmb
+mkfnt Times-BoldItalic ptmbi
+mkfnt Times-Italic ptmri
+mkfnt Times-Roman ptmr c -V
+
+mkfnt AvantGarde-Book pagk
+mkfnt AvantGarde-BookOblique pagko
+mkfnt AvantGarde-Demi pagd
+mkfnt AvantGarde-DemiOblique pagdo
+
+mkfnt Bookman-Demi pbkd
+mkfnt Bookman-DemiItalic pbkdi
+mkfnt Bookman-Light pbkl
+mkfnt Bookman-LightItalic pbkli
+
+mkfnt Courier-Bold pcrb
+mkfnt Courier-BoldOblique pcrbo
+mkfnt Courier-Oblique pcrro
+mkfnt Courier pcrr
+
+mkfnt NewCenturySchlbk-Bold pncb
+mkfnt NewCenturySchlbk-BoldItalic pncbi
+mkfnt NewCenturySchlbk-Italic pncri
+mkfnt NewCenturySchlbk-Roman pncr
+
+mkfnt Helvetica-Bold phvb
+mkfnt Helvetica-BoldOblique phvbo
+mkfnt Helvetica-Narrow-Bold phvbrn
+mkfnt Helvetica-Narrow-Oblique phvron
+mkfnt Helvetica-Narrow phvrrn
+mkfnt Helvetica-Oblique phvro
+mkfnt Helvetica phvr
+
+mkfnt Palatino-BoldItalic pplbi
+mkfnt Palatino-Italic pplri
+mkfnt Palatino-Roman pplr
+mkfnt Palatino-Bold pplb
+
+mkfnt ZapfChancery-MediumItalic pzcmi
diff --git a/fonts/utilities/a2ac/mkfnt b/fonts/utilities/a2ac/mkfnt
new file mode 100644
index 0000000000..941d2fed0f
--- /dev/null
+++ b/fonts/utilities/a2ac/mkfnt
@@ -0,0 +1,51 @@
+#!/bin/sh
+# This script prepares Czech and Slovak TeX font using a2ac and afm2tfm
+# The name of output virtual font is prefixed by c and font encoding
+# is chosen by ISO 8859-2 (more precisely by CS-encoding defined in files
+# xl2.enc or xt2.enc).
+
+if test $# -lt 2 ; then
+ echo usage:
+ echo ' ' mkfnt Full-PostScript-Name texname
+ echo for example:
+ echo ' ' mkfnt Times-Roman ptmr
+ echo more advanced usage:
+ echo ' ' mkfnt Full-PostScript-Name texname nextletters [afm2tfm options]
+ echo where [afm2tfm options] have to end by -v or -V . For example:
+ echo ' ' mkfnt Times-Roman ptmr c -V
+ echo makes the cptmrc.vf: the Caps and Small Caps variant of Times-Roman.
+ exit
+fi
+
+# You can edit the following paths in order to match with your system strategy.
+# The currentdir variants of output can be used by any user.
+
+# corrtabfile=/usr/lib/a2ac/cscorr.tab
+corrtabfile=cscorr.tab
+texfontpath=/usr/lib/texfm/fonts
+# encfilepath=$texfontpath/enc
+encfilepath=.
+afminput=/usr/openwin/lib/fonts/afm
+# vfoutput=$texfontpath/vf/dvips
+vfoutput=.
+# tfmoutput=$texfontpath/tfm
+tfmoutput=.
+# rtfmoutput=$texfontpath/tfm/dvips
+rtfmoutput=.
+
+a2ac $afminput/$1.afm $corrtabfile c$2.afm
+if grep 'IsFixedPitch true' c$2.afm ; then
+ encfile=$encfilepath/xt2.enc
+else
+ encfile=$encfilepath/xl2.enc
+fi
+if test $# -gt 2 ; then
+ afmparam=$4 $5 $6 $7 $8 $9
+else
+ afmparam=-v
+fi
+echo afm2tfm c$2.afm -t $encfile $afmparam c$2$3.vpl $rtfmoutput/r$2.tfm
+afm2tfm c$2.afm -t $encfile $afmparam c$2$3.vpl $rtfmoutput/r$2.tfm
+vptovf c$2$3.vpl $vfoutput/c$2$3.vf $tfmoutput/c$2$3.tfm
+rm c$2.afm c$2$3.vpl
+
diff --git a/fonts/utilities/a2ac/test.tex b/fonts/utilities/a2ac/test.tex
new file mode 100644
index 0000000000..6651e86f20
--- /dev/null
+++ b/fonts/utilities/a2ac/test.tex
@@ -0,0 +1,74 @@
+
+% test.tex -- plainTeX file for test of 32 standard PostScript fonts
+% in Czech and Slovak
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Juni 1995 Petr Ol¹ák
+
+% Encoding: ISO 8859-2
+% Needs Format: csplain
+
+\chyph % czech hyphenation used
+
+\advance\vsize by2\baselineskip
+
+\def\allowhyphens{\nobreak\hskip0pt\relax}
+\def \uv#1{\char254 \allowhyphens#1\allowhyphens\char255 }
+
+\def\text#1{Tento text je napsán Post\-Scrip\-to\-vým fontem #1 za pou¾ití
+\TeX{}ov\-ské metriky {\tt \fontname\testfont}. Metrika fontu
+v~èeské/slovenské variantì byla pøipravena konvertorem {\tt a2ac}
+s~následným pou¾itím programu {\tt afm2tfm}. Je potøeba si v¹ímat ménì
+obvyklých slov, jako je slovo ¹»astný (písmeno » uprostøed slova), nebo
+tøeba slovenské koµko. Vìøme, ¾e výsledný text pùjde nejen pøeèíst, ale
+bude i typograficky pokud mo¾no v~poøádku. Také je tøeba \uv{sledovat
+chování} na¹ich \uv{uvozovek}.
+\medskip
+Á á Ä ä È è Ï ï É é Ì ì Í í Å å ¥ µ Ò ò Ó ó Ô ô Ö ö Ø ø À à © ¹ « » Ú ú Ù ù
+Ü ü Ý ý ® ¾.}
+
+\def\test#1 #2 {\font\testfont=c#1 {\testfont\text{#2}\bigskip}}
+
+\test ptmr Times-Roman
+\test ptmb Times-Bold
+\test ptmbi Times-BoldItalic
+\test ptmri Times-Italic
+\test ptmrc Times-Roman-SmallCaps
+
+\test pagk AvantGarde-Book
+\test pagko AvantGarde-BookOblique
+\test pagd AvantGarde-Demi
+\test pagdo AvantGarde-DemiOblique
+
+\test pbkd Bookman-Demi
+\test pbkdi Bookman-DemiItalic
+\test pbkl Bookman-Light
+\test pbkli Bookman-LightItalic
+
+{\rightskip=0pt plus4em
+\test pcrb Courier-Bold
+\test pcrbo Courier-BoldOblique
+\test pcrro Courier-Oblique
+\test pcrr Courier
+}
+
+\test pncb NewCenturySchlbk-Bold
+\test pncbi NewCenturySchlbk-BoldItalic
+\test pncri NewCenturySchlbk-Italic
+\test pncr NewCenturySchlbk-Roman
+
+\test phvb Helvetica-Bold
+\test phvbo Helvetica-BoldOblique
+\test phvbrn Helvetica-Narrow-Bold
+\test phvron Helvetica-Narrow-Oblique
+\test phvrrn Helvetica-Narrow
+\test phvro Helvetica-Oblique
+\test phvr Helvetica
+
+\test pplbi Palatino-BoldItalic
+\test pplri Palatino-Italic
+\test pplr Palatino-Roman
+\test pplb Palatino-Bold
+
+\test pzcmi ZapfChancery-MediumItalic
+
+\end
diff --git a/fonts/utilities/a2ac/xl2.enc b/fonts/utilities/a2ac/xl2.enc
new file mode 100644
index 0000000000..0664384909
--- /dev/null
+++ b/fonts/utilities/a2ac/xl2.enc
@@ -0,0 +1,306 @@
+/XL2encoding [
+%%%%% '000 = "00
+ /Gamma
+ /Delta
+ /Theta
+ /Lambda
+ /Xi
+ /Pi
+ /Sigma
+ /Upsilon
+%%%%% '010 = "08
+ /Phi
+ /Psi
+ /Omega
+ /ff
+ /fi
+ /fl
+ /ffi
+ /ffl
+%%%%% '020 = "10
+ /dotlessi
+ /dotlessj
+ /grave
+ /acute
+ /caron
+ /breve
+ /macron
+ /ring
+%%%%% '030 = "18
+ /cedilla
+ /germandbls
+ /ae
+ /oe
+ /oslash
+ /AE
+ /OE
+ /Oslash
+%%%%% '040 = "20
+ /.notdef
+ /exclam
+ /quotedblright
+ /numbersign
+ /dollar
+ /percent
+ /ampersand
+ /quoteright
+%%%%% '050 = "28
+ /parenleft
+ /parenright
+ /asterisk
+ /plus
+ /comma
+ /hyphen
+ /period
+ /slash
+%%%%% '060 = "30
+ /zero
+ /one
+ /two
+ /three
+ /four
+ /five
+ /six
+ /seven
+%%%%% '070 = "38
+ /eight
+ /nine
+ /colon
+ /semicolon
+ /exclamdown
+ /equal
+ /questiondown
+ /question
+%%%%% '100 = "40
+ /at
+ /A
+ /B
+ /C
+ /D
+ /E
+ /F
+ /G
+%%%%% '110 = "48
+ /H
+ /I
+ /J
+ /K
+ /L
+ /M
+ /N
+ /O
+%%%%% '120 = "50
+ /P
+ /Q
+ /R
+ /S
+ /T
+ /U
+ /V
+ /W
+%%%%% '130 = "58
+ /X
+ /Y
+ /Z
+ /bracketleft
+ /quotedblleft
+ /bracketright
+ /circumflex
+ /dotaccent
+%%%%% '140 = "60
+ /quoteleft
+ /a
+ /b
+ /c
+ /d
+ /e
+ /f
+ /g
+%%%%% '150 = "68
+ /h
+ /i
+ /j
+ /k
+ /l
+ /m
+ /n
+ /o
+%%%%% '160 = "70
+ /p
+ /q
+ /r
+ /s
+ /t
+ /u
+ /v
+ /w
+%%%%% '170 = "78
+ /x
+ /y
+ /z
+ /endash
+ /emdash
+ /hungarumlaut
+ /tilde
+ /dieresis
+%%%%% '200 = "80
+ /ellipsis
+ /dagger
+ /daggerdbl
+ /bullet
+ /sterling
+ /paragraph
+ /.notdef
+ /.notdef
+%%%%% '210 = "88
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /perthousand
+ /.notdef
+ /.notdef
+%%%%% '220 = "90
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+%%%%% '230 = "98
+ /Agrave
+ /.notdef
+ /.notdef
+ /.notdef
+ /hyphen
+ /ogonek
+ /guillemotleft
+ /guillemotright
+%%%%% '240 = "A0
+ /.notdef
+ /Aogonek
+ /breve
+ /Lslash
+ /currency
+ /Lcaron
+ /Sacute
+ /section
+%%%%% '250 = "A8
+ /dieresis
+ /Scaron
+ /Scedilla
+ /Tcaron
+ /Zacute
+ /.notdef
+ /Zcaron
+ /Zdotaccent
+%%%%% '260 = "B0
+ /ring
+ /aogonek
+ /cedilla
+ /lslash
+ /acute
+ /lcaron
+ /sacute
+ /caron
+%%%%% '270 = "B8
+ /agrave
+ /scaron
+ /scedilla
+ /tcaron
+ /zacute
+ /hungarumlaut
+ /zcaron
+ /zdotaccent
+%%%%% '300 = "C0
+ /Racute
+ /Aacute
+ /Acircumflex
+ /Abreve
+ /Adieresis
+ /Lacute
+ /Cacute
+ /Ccedilla
+%%%%% '310 = "C8
+ /Ccaron
+ /Eacute
+ /Eogonek
+ /Edieresis
+ /Ecaron
+ /Iacute
+ /Icircumflex
+ /Dcaron
+%%%%% '320 = "D0
+ /Eth
+ /Nacute
+ /Ncaron
+ /Oacute
+ /Ocircumflex
+ /Ohungarumlaut
+ /Odieresis
+ /multiply
+%%%%% '330 = "D8
+ /Rcaron
+ /Uring
+ /Uacute
+ /Uhungarumlaut
+ /Udieresis
+ /Yacute
+ /Togonek
+ /germandbls
+%%%%% '340 = "E0
+ /racute
+ /aacute
+ /acircumflex
+ /abreve
+ /adieresis
+ /lacute
+ /cacute
+ /ccedilla
+%%%%% '350 = "E8
+ /ccaron
+ /eacute
+ /eogonek
+ /edieresis
+ /ecaron
+ /iacute
+ /icircumflex
+ /dcaron
+%%%%% '360 = "F0
+ /eth
+ /nacute
+ /ncaron
+ /oacute
+ /ocircumflex
+ /ohungarumlaut
+ /odieresis
+ /divide
+%%%%% '370 = "F8
+ /rcaron
+ /uring
+ /uacute
+ /uhungarumlaut
+ /udieresis
+ /yacute
+ /quotedblbase
+ /quotedblleft
+] def
+
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN exclamdown exclamdown =: guillemotleft ;
+% frenchdblquotes
+% LIGKERN questiondown questiondown =: guillemotright ;
+% csquoteleft
+% LIGKERN comma comma =: quotedblbase ;
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN question {} quoteleft ; exclam {} quoteleft ;
diff --git a/fonts/utilities/a2ac/xt2.enc b/fonts/utilities/a2ac/xt2.enc
new file mode 100644
index 0000000000..880596fce4
--- /dev/null
+++ b/fonts/utilities/a2ac/xt2.enc
@@ -0,0 +1,306 @@
+/XT2encoding [
+%%%%% '000 = "00
+ /Gamma
+ /Delta
+ /Theta
+ /Lambda
+ /Xi
+ /Pi
+ /Sigma
+ /Upsilon
+%%%%% '010 = "08
+ /Phi
+ /Psi
+ /Omega
+ /arrowup
+ /arrowdown
+ /qoutesingle
+ /exclamdown
+ /questiondown
+%%%%% '020 = "10
+ /dotlessi
+ /dotlessj
+ /grave
+ /acute
+ /caron
+ /breve
+ /macron
+ /ring
+%%%%% '030 = "18
+ /cedilla
+ /germandbls
+ /ae
+ /oe
+ /oslash
+ /AE
+ /OE
+ /Oslash
+%%%%% '040 = "20
+ /.notdef
+ /exclam
+ /quotedblright
+ /numbersign
+ /dollar
+ /percent
+ /ampersand
+ /quoteright
+%%%%% '050 = "28
+ /parenleft
+ /parenright
+ /asterisk
+ /plus
+ /comma
+ /hyphen
+ /period
+ /slash
+%%%%% '060 = "30
+ /zero
+ /one
+ /two
+ /three
+ /four
+ /five
+ /six
+ /seven
+%%%%% '070 = "38
+ /eight
+ /nine
+ /colon
+ /semicolon
+ /less
+ /equal
+ /greater
+ /question
+%%%%% '100 = "40
+ /at
+ /A
+ /B
+ /C
+ /D
+ /E
+ /F
+ /G
+%%%%% '110 = "48
+ /H
+ /I
+ /J
+ /K
+ /L
+ /M
+ /N
+ /O
+%%%%% '120 = "50
+ /P
+ /Q
+ /R
+ /S
+ /T
+ /U
+ /V
+ /W
+%%%%% '130 = "58
+ /X
+ /Y
+ /Z
+ /bracketleft
+ /backslash
+ /bracketright
+ /circumflex
+ /underscore
+%%%%% '140 = "60
+ /quoteleft
+ /a
+ /b
+ /c
+ /d
+ /e
+ /f
+ /g
+%%%%% '150 = "68
+ /h
+ /i
+ /j
+ /k
+ /l
+ /m
+ /n
+ /o
+%%%%% '160 = "70
+ /p
+ /q
+ /r
+ /s
+ /t
+ /u
+ /v
+ /w
+%%%%% '170 = "78
+ /x
+ /y
+ /z
+ /braceleft
+ /bar
+ /braceright
+ /tilde
+ /dieresis
+%%%%% '200 = "80
+ /ellipsis
+ /dagger
+ /daggerdbl
+ /bullet
+ /sterling
+ /paragraph
+ /.notdef
+ /.notdef
+%%%%% '210 = "88
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /perthousand
+ /.notdef
+ /.notdef
+%%%%% '220 = "90
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+ /.notdef
+%%%%% '230 = "98
+ /Agrave
+ /.notdef
+ /.notdef
+ /.notdef
+ /hyphen
+ /ogonek
+ /guillemotleft
+ /guillemotright
+%%%%% '240 = "A0
+ /.notdef
+ /Aogonek
+ /breve
+ /Lslash
+ /currency
+ /Lcaron
+ /Sacute
+ /section
+%%%%% '250 = "A8
+ /dieresis
+ /Scaron
+ /Scedilla
+ /Tcaron
+ /Zacute
+ /.notdef
+ /Zcaron
+ /Zdotaccent
+%%%%% '260 = "B0
+ /ring
+ /aogonek
+ /cedilla
+ /lslash
+ /acute
+ /lcaron
+ /sacute
+ /caron
+%%%%% '270 = "B8
+ /agrave
+ /scaron
+ /scedilla
+ /tcaron
+ /zacute
+ /hungarumlaut
+ /zcaron
+ /zdotaccent
+%%%%% '300 = "C0
+ /Racute
+ /Aacute
+ /Acircumflex
+ /Abreve
+ /Adieresis
+ /Lacute
+ /Cacute
+ /Ccedilla
+%%%%% '310 = "C8
+ /Ccaron
+ /Eacute
+ /Eogonek
+ /Edieresis
+ /Ecaron
+ /Iacute
+ /Icircumflex
+ /Dcaron
+%%%%% '320 = "D0
+ /Eth
+ /Nacute
+ /Ncaron
+ /Oacute
+ /Ocircumflex
+ /Ohungarumlaut
+ /Odieresis
+ /multiply
+%%%%% '330 = "D8
+ /Rcaron
+ /Uring
+ /Uacute
+ /Uhungarumlaut
+ /Udieresis
+ /Yacute
+ /Togonek
+ /germandbls
+%%%%% '340 = "E0
+ /racute
+ /aacute
+ /acircumflex
+ /abreve
+ /adieresis
+ /lacute
+ /cacute
+ /ccedilla
+%%%%% '350 = "E8
+ /ccaron
+ /eacute
+ /eogonek
+ /edieresis
+ /ecaron
+ /iacute
+ /icircumflex
+ /dcaron
+%%%%% '360 = "F0
+ /eth
+ /nacute
+ /ncaron
+ /oacute
+ /ocircumflex
+ /ohungarumlaut
+ /odieresis
+ /divide
+%%%%% '370 = "F8
+ /rcaron
+ /uring
+ /uacute
+ /uhungarumlaut
+ /udieresis
+ /yacute
+ /quotedblbase
+ /quotedblleft
+] def
+
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN exclamdown exclamdown =: guillemotleft ;
+% frenchdblquotes
+% LIGKERN questiondown questiondown =: guillemotright ;
+% csquoteleft
+% LIGKERN comma comma =: quotedblbase ;
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN question {} quoteleft ; exclam {} quoteleft ;
+% LIGKERN f {} f ; f {} i ; f {} l ;
diff --git a/fonts/utilities/accfonts/CHANGES b/fonts/utilities/accfonts/CHANGES
new file mode 100644
index 0000000000..039ab7709b
--- /dev/null
+++ b/fonts/utilities/accfonts/CHANGES
@@ -0,0 +1,342 @@
+Changes to vpl2vpl between first (unnumbered) release and release 0.1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When I first wrote vpl2vpl I was under the impression that the vpl
+file output by afm2tfm could never contain accented character
+definitions. The first (unnumbered) release of vpl2vpl thus did not
+implement the -b option allowed for mkt1font (to block the use of
+predefined accented characters). I have since become aware that in
+the rather rare case of an afm file containing composite character
+information, afm2tfm uses that information to build definitions of
+accented characters; I have therefore introduced a -b option in
+version 0.1.
+
+There were two bugs in the coding dealing with the -s option in the
+first version of vpl2vpl. First, the shrink-factor specified by the
+user was incorrectly applied to the underdot accent as well as to
+dropped superscript accents. Second, the shrink-factor was not
+correctly scaled in terms of the value of DESIGNUNITS (this chiefly
+affected Computer Modern fonts). Both of these have been fixed in
+version 0.1.
+
+Another bug affected those characters (quotesingle, quotedbl,
+backslash, underscore, braceleft, bar and braceright) which
+dvips.enc places in the lower half of the character set, but which
+vpl2vpl removes to make room for the normal TeX inhabitants of their
+"slots"; in the first version of the program it was not possible to
+include these characters in the output font. This has also been
+fixed in version 0.1.
+
+The handling of LIGTABLE information controlling kerning etc. has
+been improved, to eliminate repeated instructions and "orphaned"
+instructions with no LABEL.
+
+In the first version of vpl2vpl I deliberately did not allow for
+double superscript accents on tall characters such as capital
+letters, on the grounds that this would be bad typographic practice.
+A specific request for one such character has led me to modify
+version 0.1 of the program to make the creation of such characters
+possible, but I would still argue against their use.
+
+Some minor improvements have been made to the code in various areas,
+including checking for inappropriate input, calculation of italic
+correction for characters with superscript accents, and placing of
+dropped superscript accents. (However, it is likely that such
+accents will still sometimes require manual intervention.)
+
+
+Changes to mkt1font between first (unnumbered) release and release 0.1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In the first release of mkt1font, kerning information for predefined
+accented characters was taken from the input font, even if the -b
+option had been specified to force the redefinition of such
+characters. This has been fixed in version 0.1: if the -b option is
+used, kerns for characters such as "eacute" are generalised from the
+kerns for "e" in just the same way as happens for "emacron" etc.
+
+Similarly, predefined accented characters eliminated by the -b
+option used to retain "ghost" entries among the unencoded characters
+in the afm file. This too has been fixed in version 0.1.
+
+As of version 0.1, any composite character definitions contained in
+the afm file of the input font are eliminated from the output font,
+since they will almost certainly be incomplete, and (if the user has
+specified -b) will probably be wrong as well.
+
+Version 0.1 can now properly process input fonts using MS-DOS file
+format (with newline represented by CR/LF). It can also process
+fonts in which the character "|" is used in the names of the
+frequently used "noaccess def" and "noaccess put" definitions
+(previously this fell foul of Perl's regular expression handler).
+
+As with vpl2vpl, I have modified version 0.1 of mkt1font to permit
+the creation of tall characters bearing double superscript accents,
+though I do not recommend the use of such characters.
+
+The "FontBBox" entries in the afm and pfb files now reflect any
+increase in the maximum height or depth of characters in the output
+font.
+
+Various other minor improvements have been made to the code,
+including the placing of dropped superscript accents. (As with
+vpl2vpl, however, it is likely that such accents will still
+sometimes require manual intervention.)
+
+
+Changes between release 0.1 and release 0.2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes common to both programs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+I have implemented the candrabindu ("moon-dot") accent sometimes
+used in Indian-language material. This is achieved by overprinting a
+breve with a dotaccent; a new command-line option (-c) has been
+introduced to allow for font-specific adjustments in the placing of
+the dotaccent.
+
+The user's command-line is now stored as a comment at the head of
+the output file(s).
+
+The constraint on the ordering of definitions in a definition file
+has been removed: it is no longer necessary to ensure that a
+character is defined before it is used.
+
+Digraphs are now implemented: if the character specified as the
+"accent" in a definition is not in fact a valid accent character,
+the definition is interpreted as a request for a digraph formed from
+the "character" followed by the "accent".
+
+A bug which placed superscript accents incorrectly over tall
+characters already bearing "under" accents has been fixed.
+
+The vertical positioning of "under" accents has been adjusted: they
+are now placed slightly lower than previously.
+
+
+B. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+Fixed a bug which resulted in some accents in small caps fonts being
+positioned at the wrong height.
+
+Fixed a bug which resulted in small amounts of LIGTABLE information
+being lost.
+
+
+C. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+The internal organisation of the program has been cleaned up in a
+number of respects. In particular, various subroutines are now
+called with the appropriate formal parameters, rather than relying
+on the existence of equivalent global variables; the fetching and
+storing of character metric information is tidier and more
+efficient; and kerning information is dealt with in the course of
+the main program loop, rather than in a private (double) loop
+afterwards.
+
+The -s option allowing "under" accents to be shrunk by a specified
+factor, which was previously available only in vpl2vpl, has now been
+implemented in mkt1font also.
+
+The output afm file previously sometimes contained spurious entries
+for unencoded characters that duplicated items in the list of
+encoded characters. This has been fixed.
+
+Despite the fix introduced in version 0.1, some predefined kerning
+information continued to find its way into the afm file even when
+the -b option was specified to block the use of predefined accented
+characters. A new, improved fix is now in place to prevent this. An
+error in a regular expression which generated some undesirable kerns
+has also been corrected.
+
+The "FontBBox" entries in the afm and pfb files now reflect any
+increase in the maximum width of characters in the output font, as
+well as increases in their maximum height or depth.
+
+Fixed a bug causing the underbar accent to be too long.
+
+Fixed a bug causing "under" accents to be assigned the wrong depth:
+this could result in the bottom of the accent failing to print
+properly.
+
+
+Changes between release 0.2 and release 0.21
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Changes common to both programs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The vertical positioning of "under" accents has been adjusted again
+(the previous adjustment was a little too enthusiastic). They have
+been raised slightly.
+
+The height at which characters are reckoned to be so tall that
+superscript accents placed on them must be raised above the normal
+level has been increased slightly (from 1.1 x xheight to 1.15 x
+xheight).
+
+Changes between release 0.21 and release 0.211
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+A single minor change has been made to vpl2vpl: this has been
+necessitated by a change in the format of the LIGTABLE information
+produced by version 8.1 of afm2tfm, which now adds identificatory
+comments to lines referring to characters by means of octal
+notation. Vpl2vpl strips out such comments.
+
+
+B. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+Minor bugfixes have been put in place: extra spaces in the the
+"noaccess def" and "noaccess put" definitions are now permitted, and
+so is a character named ".null". An error message has been improved.
+
+Changes between release 0.211 and release 0.212
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+Fixed a bug in the "double superscript accent on small caps
+character" routine.
+
+
+B. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+Fixed a bug which produced incorrect output in cases where the
+character to be accented is defined as blank (e.g. space).
+
+Changes to between release 0.212 and release 0.22
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Changes common to both programs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The programs now recognise "commaaccent" as a valid subscript
+accent. Note that they cannot replace this subscript with the
+superscript form used with the letter "g" (any more than they can
+substitute the apostrophe-like form of the caron that is used with
+"L", "d", "l" and "t"). Note also that as there is no position for
+this accent in either the standard TeX encoding or the dvips.enc
+variant, vpl2vpl will not actually be able to use it to build new
+characters without further modification.
+
+In the case where the definition file specifies, say, "z overdot"
+and the font contains a predefined version named "zdotaccent", it
+previously happened that the output font contained both characters.
+This has been fixed: now only the character requested in the
+definition file exists in the output.
+
+Changes between release 0.22 and release 0.221
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+Fixed a bug which caused the program to fail after incorrectly
+identifying CharStrings definitions.
+
+Changes tbetween release 0.221 and release 0.222
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+Changed FamilyName to remove only the final one of a number of
+hyphenated elements from the font name.
+
+Changes between release 0.222 and release 0.23
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+No changes have in fact been made to mkt1font, but its version number
+has been raised to 0.23 to conform with those of vpl2vpl and vpl2ovp.
+
+B. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+A change has been introduced to permit the program to use the output
+of the AFM conversion utility afm2pl, rather than the earlier afm2tfm.
+This has been done because it has come to light that afm2tfm gives
+incorrect values for the heights of some characters, which can cause
+poor accent placement. Support for the output of afm2tfm has not been
+withdrawn, but afm2pl is now definitely preferred.
+
+B. A new program: vpl2ovp
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The greatest change as of 0.23 is the addition of a third program to
+the suite. Vpl2ovp does essentially the same job as vpl2vpl, in that
+it creates virtual fonts that contain arbitrarily accented characters,
+but its output is a .ovp file suitable for use with Omega (the 16-bit
+Unicode-aware development from TeX). Using vpl2ovp it is possible to
+build substantial Unicode-compliant virtual fonts for use with Omega,
+and a .def file for the set of characters I have included in my
+earlier "IndUni" OpenType fonts is now included in the distribution.
+(IndUni virtual fonts for Omega created with vpl2ovp are available at
+http://bombay.indology.info/software/fonts/induni/index.html.) Glyphs
+representing characters requiring more than a single codepoint are
+stored in the Private Use Area, and a system of ligatures is provided
+to allow them to be accessed. This system also permits
+single-codepoint accented characters to be accessed through their
+"decomposed" component parts. Thus if the characters a-macron (single
+codepoint: U+0101) and a-macron-acute (two codepoints: U+0101 +
+U+0301) are defined, the former will be accessible both as U+0101
+(a-macron) and as U+0061 + U+0304 ("a" + macron); the latter will be
+accessible both as U+0101 + U+0301 (a-macron + acute) and U+0061 +
+U+0304 + U+0301 ("a" + macron + acute). This is a considerable
+advantage, given the different possible ways in which Unicode can be,
+and is, used.
+
+Changes between release 0.23 and release 0.24
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+The format expected of glyph names has been brought into line with
+Adobe's specification, i.e. they may contain upper- and lower-case
+letters, numerals, "_" and ".", but must begin with a letter or with
+"_". The format expected of PFB head and tail material has been made
+less restrictive, to match the realities of perceived usage. A bug in
+digraph creation has been fixed. A "dotlessj" character is created for
+use with superscript accents. Full Flex hinting is now supported.
+
+B. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+The help information has been improved.
+
+C. Changes to vpl2ovp
+~~~~~~~~~~~~~~~~~~~~~
+
+A bug has been fixed that generated "ghost" replicas of some existing
+accent characters in the Private Use Area. The handling of digraphs
+and underscored digraphs has been brought into better Unicode
+compliance. The help information has also been improved.
+
+Changes between release 0.24 and release 0.25
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+Various bugs have been fixed. Rounding of non-integer values to
+integers has been improved.
+
+B. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+No changes have in fact been made to vpl2vpl or vpl2ovp, but their
+version number has been raised to 0.25 to conform with that of
+mkt1font.
diff --git a/fonts/utilities/accfonts/COPYING b/fonts/utilities/accfonts/COPYING
new file mode 100644
index 0000000000..a43ea2126f
--- /dev/null
+++ b/fonts/utilities/accfonts/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/fonts/utilities/accfonts/CSX.def b/fonts/utilities/accfonts/CSX.def
new file mode 100644
index 0000000000..be299b77fc
--- /dev/null
+++ b/fonts/utilities/accfonts/CSX.def
@@ -0,0 +1,133 @@
+# CSX encoding for mkt1font and vpl2vpl
+#
+# Classical Sanskrit eXtended encoding for the representation of
+# Indian languages in Roman script
+
+128 C cedilla
+129 u dieresis
+130 e acute
+131 a circumflex
+132 a dieresis
+133 a grave
+134 a ring
+135 c cedilla
+136 e circumflex
+137 e dieresis
+138 e grave
+139 i dieresis
+140 i circumflex
+141 i grave
+142 A dieresis
+143 A ring
+144 E acute
+145 ae
+146 AE
+147 o circumflex
+148 o dieresis
+149 o grave
+150 u circumflex
+151 u grave
+152 y dieresis
+153 O dieresis
+154 U dieresis
+155 cent
+156 sterling
+157 yen
+158 .notdef
+159 r underbar
+160 a acute
+161 i acute
+162 o acute
+163 u acute
+164 n tilde
+165 N tilde
+166 l tilde
+167 m overdot
+168 amacron breve
+169 imacron breve
+170 umacron breve
+171 amacron tilde
+172 imacron tilde
+173 n underbar
+174 guillemotleft
+175 guillemotright
+176 .notdef
+177 .notdef
+178 .notdef
+179 .notdef
+180 .notdef
+181 amacron acute
+182 amacron grave
+183 imacron acute
+184 imacron grave
+185 .notdef
+186 .notdef
+187 .notdef
+188 .notdef
+189 umacron acute
+190 umacron grave
+191 .notdef
+192 .notdef
+193 .notdef
+194 .notdef
+195 .notdef
+196 .notdef
+197 .notdef
+198 runderdot acute
+199 runderdot grave
+200 .notdef
+201 .notdef
+202 .notdef
+203 .notdef
+204 .notdef
+205 .notdef
+206 .notdef
+207 runderdotmacron acute
+208 a tilde
+209 i tilde
+210 u tilde
+211 e tilde
+212 o tilde
+213 e breve
+214 o breve
+215 l underbar
+216 umacron tilde
+217 .notdef
+218 .notdef
+219 .notdef
+220 .notdef
+221 .notdef
+222 .notdef
+223 .notdef
+224 a macron
+225 germandbls
+226 A macron
+227 i macron
+228 I macron
+229 u macron
+230 U macron
+231 r underdot
+232 R underdot
+233 runderdot macron
+234 Runderdot macron
+235 l underdot
+236 L underdot
+237 lunderdot macron
+238 Lunderdot macron
+239 n overdot
+240 N overdot
+241 t underdot
+242 T underdot
+243 d underdot
+244 D underdot
+245 n underdot
+246 N underdot
+247 s acute
+248 S acute
+249 s underdot
+250 S underdot
+251 .notdef
+252 m underdot
+253 M underdot
+254 h underdot
+255 H underdot
diff --git a/fonts/utilities/accfonts/ISO-Latin1.def b/fonts/utilities/accfonts/ISO-Latin1.def
new file mode 100644
index 0000000000..7221082541
--- /dev/null
+++ b/fonts/utilities/accfonts/ISO-Latin1.def
@@ -0,0 +1,131 @@
+# ISO-Latin1 encoding (iso8859-1) for mkt1font and vpl2vpl
+
+127 .notdef
+128 .notdef
+129 .notdef
+130 .notdef
+131 .notdef
+132 .notdef
+133 .notdef
+134 .notdef
+135 .notdef
+136 .notdef
+137 .notdef
+138 .notdef
+139 .notdef
+140 .notdef
+141 .notdef
+142 .notdef
+143 .notdef
+144 dotlessi
+145 grave
+146 acute
+147 circumflex
+148 tilde
+149 .notdef
+150 breve
+151 dotaccent
+152 .notdef
+153 .notdef
+154 ring
+155 .notdef
+156 .notdef
+157 hungarumlaut
+158 ogonek
+159 caron
+160 .notdef
+161 exclamdown
+162 cent
+163 sterling
+164 currency
+165 yen
+166 brokenbar
+167 section
+168 dieresis
+169 copyright
+170 ordfeminine
+171 guillemotleft
+172 logicalnot
+173 hyphen
+174 registered
+175 macron
+176 degree
+177 plusminus
+178 twosuperior
+179 threesuperior
+180 acute
+181 mu
+182 paragraph
+183 periodcentered
+184 cedilla
+185 onesuperior
+186 ordmasculine
+187 guillemotright
+188 onequarter
+189 onehalf
+190 threequarters
+191 questiondown
+192 A grave
+193 A acute
+194 A circumflex
+195 A tilde
+196 A dieresis
+197 A ring
+198 AE
+199 C cedilla
+200 E grave
+201 E acute
+202 E circumflex
+203 E dieresis
+204 I grave
+205 I acute
+206 I circumflex
+207 I dieresis
+208 Eth
+209 N tilde
+210 O grave
+211 O acute
+212 O circumflex
+213 O tilde
+214 O dieresis
+215 multiply
+216 Oslash
+217 U grave
+218 U acute
+219 U circumflex
+220 U dieresis
+221 Y acute
+222 Thorn
+223 germandbls
+224 a grave
+225 a acute
+226 a circumflex
+227 a tilde
+228 a dieresis
+229 a ring
+230 ae
+231 c cedilla
+232 e grave
+233 e acute
+234 e circumflex
+235 e dieresis
+236 i grave
+237 i acute
+238 i circumflex
+239 i dieresis
+240 eth
+241 n tilde
+242 o grave
+243 o acute
+244 o circumflex
+245 o tilde
+246 o dieresis
+247 divide
+248 oslash
+249 u grave
+250 u acute
+251 u circumflex
+252 u dieresis
+253 y acute
+254 thorn
+255 y dieresis
diff --git a/fonts/utilities/accfonts/ISO-Latin2.def b/fonts/utilities/accfonts/ISO-Latin2.def
new file mode 100644
index 0000000000..736906f016
--- /dev/null
+++ b/fonts/utilities/accfonts/ISO-Latin2.def
@@ -0,0 +1,159 @@
+# ISO-Latin2 encoding (iso8859-2) for mkt1font and vpl2vpl
+
+# This document is a modified version of Jan "Yenya" Kasprzak's
+# mpage filter ISO-Latin.2. Yenya writes as follows:
+
+#% Wed Dec 7 14:43:55 MET 1994
+#% Written by Jan "Yenya" Kasprzak (kas@foresta.cz, kas@muni.cz) for mpage
+#% filter. ISO Latin 2 (aka iso8859-2) is a character set, used in some
+#% Middle- and East European countries (Czech republic, Slovakia, Poland,
+#% Slovenia, Hungary, and some other -- I don't remember right now).
+#%
+#% You can redistribute this file under the terms of GNU General
+#% Public License (GPL). If you have not your own copy of GPL,
+#% mail me, I will send you one.
+#% -Yenya
+#%
+#% This encoding vector describes real 8859-2 encoding, except of
+#% some little differences: I was not able to find how to name characters,
+#% which have accent shaped as right quote. Instead of these characters
+#% I put there character with caron accent. If you find out how to name
+#% characters with "right quote" accent, mail me. Or you can change it
+#% yourself. You must change the following characters:
+#%
+#% lcaron -> l with right quote,
+#% Lcaron -> L --''--
+#% tcaron -> L --''--
+#% dcaron -> L --''--
+#%
+#% Tcaron and Dcaron are written with a _real_ caron.
+
+127 .notdef
+128 .notdef
+129 .notdef
+130 .notdef
+131 .notdef
+132 .notdef
+133 .notdef
+134 .notdef
+135 .notdef
+136 .notdef
+137 .notdef
+138 .notdef
+139 .notdef
+140 .notdef
+141 .notdef
+142 .notdef
+143 .notdef
+144 dotlessi
+145 grave
+146 acute
+147 circumflex
+148 tilde
+149 .notdef
+150 breve
+151 .notdef
+152 .notdef
+153 .notdef
+154 ring
+155 .notdef
+156 .notdef
+157 hungarumlaut
+158 ogonek
+159 caron
+160 .notdef
+161 A ogonek
+162 breve
+163 Lslash
+164 currency
+165 L caron # ? -- See above
+166 S acute
+167 section
+168 dieresis
+169 S caron
+170 S cedilla
+171 T caron
+172 Z acute
+173 hyphen
+174 Z caron
+175 Z dotaccent
+176 degree
+177 a ogonek
+178 ogonek
+179 lslash
+180 acute
+181 l caron # ? -- See above
+182 s acute
+183 circumflex
+184 cedilla
+185 s caron
+186 s cedilla
+187 t caron # ? -- See above
+188 z acute
+189 hungarumlaut
+190 z caron
+191 z dotaccent
+192 R acute
+193 A acute
+194 A circumflex
+195 A breve
+196 A dieresis
+197 L acute
+198 C acute
+199 C cedilla
+200 C caron
+201 E acute
+202 E ogonek
+203 E dieresis
+204 E caron
+205 I acute
+206 I circumflex
+207 D caron
+208 Eth
+209 N acute
+210 N caron
+211 O acute
+212 O circumflex
+213 O hungarumlaut
+214 O dieresis
+215 multiply
+216 R caron
+217 U ring
+218 U acute
+219 U hungarumlaut
+220 U dieresis
+221 Y acute
+222 T cedilla
+223 germandbls
+224 r acute
+225 a acute
+226 a circumflex
+227 a breve
+228 a dieresis
+229 l acute
+230 c acute
+231 c cedilla
+232 c caron
+233 e acute
+234 e ogonek
+235 e dieresis
+236 e caron
+237 i acute
+238 i circumflex
+239 d caron # ? -- See above
+240 eth
+241 n acute
+242 n caron
+243 o acute
+244 o circumflex
+245 o hungarumlaut
+246 o dieresis
+247 divide
+248 r caron
+249 u ring
+250 u acute
+251 u hungarumlaut
+252 u dieresis
+253 y acute
+254 t cedilla
+255 dotaccent
diff --git a/fonts/utilities/accfonts/IndUni_Omega.def b/fonts/utilities/accfonts/IndUni_Omega.def
new file mode 100644
index 0000000000..dee9c2850d
--- /dev/null
+++ b/fonts/utilities/accfonts/IndUni_Omega.def
@@ -0,0 +1,491 @@
+# IndUni encoding for mkt1font and vpl2vpl
+#
+# This version designed for use with Omega
+#
+# Characters are intended to represent a complete
+# set of those required for use with Indian languages in
+# transliteration, together with others commonly needed
+# in the same environment. The "non-Indian" characters
+# form an almost complete implementation on MES1, but
+# are limited by the fact that some glyphs, though
+# present in later versions of the URW++ fonts, are not
+# present in all, and anyway cannot readily be accessed.
+# Such items are included in this list but commented out.
+
+# ASCII: I should probably put in a complete list, or at least
+# notdef the control codes and return other odds and ends to
+# ASCII normality. I would need to know Omega policies here.
+
+0x007f .notdef
+
+# ISO-Latin1
+
+0x0080 .notdef
+0x0081 .notdef
+0x0082 .notdef
+0x0083 .notdef
+0x0084 .notdef
+0x0085 .notdef
+0x0086 .notdef
+0x0087 .notdef
+0x0088 .notdef
+0x0089 .notdef
+0x008a .notdef
+0x008b .notdef
+0x008c .notdef
+0x008d .notdef
+0x008e .notdef
+0x008f .notdef
+0x0090 .notdef
+0x0091 .notdef
+0x0092 .notdef
+0x0093 .notdef
+0x0094 .notdef
+0x0095 .notdef
+0x0096 .notdef
+0x0097 .notdef
+0x0098 .notdef
+0x0099 .notdef
+0x009a .notdef
+0x009b .notdef
+0x009c .notdef
+0x009d .notdef
+0x009e .notdef
+0x009f .notdef
+0x00a0 space
+0x00a1 exclamdown
+0x00a2 cent
+0x00a3 sterling
+0x00a4 currency
+0x00a5 yen
+#0x00a6 brokenbar
+0x00a7 section
+0x00a8 dieresis
+#0x00a9 copyright
+0x00aa ordfeminine
+0x00ab guillemotleft
+#0x00ac logicalnot
+0x00ad hyphen
+#0x00ae registered
+0x00af macron
+#0x00b0 degree
+#0x00b1 plusminus
+#0x00b2 twosuperior
+#0x00b3 threesuperior
+0x00b4 acute
+#0x00b5 mu
+0x00b6 paragraph
+0x00b7 periodcentered
+0x00b8 cedilla
+#0x00b9 onesuperior
+0x00ba ordmasculine
+0x00bb guillemotright
+#0x00bc onequarter
+#0x00bd onehalf
+#0x00be threequarters
+0x00bf questiondown
+0x00c0 A grave
+0x00c1 A acute
+0x00c2 A circumflex
+0x00c3 A tilde
+0x00c4 A dieresis
+0x00c5 A ring
+0x00c6 AE
+0x00c7 C cedilla
+0x00c8 E grave
+0x00c9 E acute
+0x00ca E circumflex
+0x00cb E dieresis
+0x00cc I grave
+0x00cd I acute
+0x00ce I circumflex
+0x00cf I dieresis
+#0x00d0 Eth
+0x00d1 N tilde
+0x00d2 O grave
+0x00d3 O acute
+0x00d4 O circumflex
+0x00d5 O tilde
+0x00d6 O dieresis
+#0x00d7 multiply
+0x00d8 Oslash
+0x00d9 U grave
+0x00da U acute
+0x00db U circumflex
+0x00dc U dieresis
+0x00dd Y acute
+#0x00de Thorn
+0x00df germandbls
+0x00e0 a grave
+0x00e1 a acute
+0x00e2 a circumflex
+0x00e3 a tilde
+0x00e4 a dieresis
+0x00e5 a ring
+0x00e6 ae
+0x00e7 c cedilla
+0x00e8 e grave
+0x00e9 e acute
+0x00ea e circumflex
+0x00eb e dieresis
+0x00ec i grave
+0x00ed i acute
+0x00ee i circumflex
+0x00ef i dieresis
+#0x00f0 eth
+0x00f1 n tilde
+0x00f2 o grave
+0x00f3 o acute
+0x00f4 o circumflex
+0x00f5 o tilde
+0x00f6 o dieresis
+#0x00f7 divide
+0x00f8 oslash
+0x00f9 u grave
+0x00fa u acute
+0x00fb u circumflex
+0x00fc u dieresis
+0x00fd y acute
+#0x00fe thorn
+0x00ff y dieresis
+
+# Bare accents.
+
+0x0327 cedilla
+0x0328 ogonek
+#0x0326 commaaccent
+0x0301 acute
+0x0300 grave
+0x0302 circumflex
+0x0303 tilde
+0x0304 macron
+0x0306 breve
+0x0307 space overdot
+0x0308 dieresis
+0x030a ring
+0x030b hungarumlaut
+0x030c caron
+0x0310 space candrabindu
+0x0331 space underbar
+0x032e space underbreve
+0x0324 space underdieresis
+0x0323 space underdot
+0x0325 space underring
+
+# Indian etc. characters
+
+0x0102 A breve
+0x01cd A caron
+0x0100 A macron
+#0x0104 A ogonek
+0x01fc AE acute
+0x01e2 AE macron
+0xe000 Amacron tilde
+0xe001 Atilde acute
+0x0106 C acute
+0x010c C caron
+0x0108 C circumflex
+0xe002 C macron
+0x010a C overdot
+0xe003 C underdot
+#0x010E D caron
+0x1e0c D underdot
+0xe004 Dunderdot acute
+#0x0110 Dcroat
+0x0114 E breve
+0x011a E caron
+0x0112 E macron
+0x1ebc E tilde
+#0x0118 E ogonek
+0x0116 E overdot
+0xe006 Emacron tilde
+0xe005 Etilde acute
+0xe007 G acute
+#0x0122 G cedilla
+0x0120 G overdot
+0xe008 Gacute macron
+0xe009 H acute
+0x0124 H circumflex
+0xe00b H underbar
+0x1e2a H underbreve
+0xe00a H underdieresis
+0x1e24 H underdot
+#0x0126 Hbar
+0x012c I breve
+0x01cf I caron
+#0x012e I ogonek
+0x012a I macron
+0x0130 I overdot
+0x0128 I tilde
+0xe00d Imacron tilde
+0xe00c Itilde acute
+#0x0132 IJ
+0x0134 J circumflex
+0xe00f J caron
+0xe00e J macron
+0xe05e K underdot
+#0x0136 K cedilla
+0xe012 K h
+0xe010 K H
+0x1e34 K underbar
+0xe013 Kh underbar
+0xe011 KH underbar
+0x0139 L acute
+#0x013d L caron
+#0x013b L cedilla
+0x1e3a L underbar
+0x1e36 L underdot
+0xe014 L underring
+#0x013f L middot
+0x0141 Lslash
+0x1e38 Lunderdot macron
+0xe015 Lunderring macron
+0xe016 M breve
+0xe017 M candrabindu
+0x1e40 M overdot
+0x1e42 M underdot
+0x0143 N acute
+0xe018 N breve
+0x0147 N caron
+0x1e44 N overdot
+#0x0145 N cedilla
+0x1e48 N underbar
+0x1e46 N underdot
+#0x014a Eng
+0x014e O breve
+0x01d1 O caron
+0x014c O macron
+0x0150 O hungarumlaut
+0x0152 OE
+0xe019 Omacron tilde
+0x1e4c Otilde acute
+0x1e54 P acute
+0x0154 R acute
+0xe01a R breve
+0x0158 R caron
+#0x0156 R cedilla
+0x1e5e R underbar
+0x1e5a R underdot
+0xe01b R underring
+0x1e5c Runderdot macron
+0xe01c Runderring macron
+0x015a S acute
+0x015c S circumflex
+0x0160 S caron
+0x015e S cedilla
+0xe020 S underbar
+0xe01f S underdieresis
+0x1e62 S underdot
+0xe01d Sacute macron
+0xe01e Sunderdot macron
+#0x0164 T caron
+0x0162 T cedilla
+#0x0166 Tcroat
+0x1e6e T underbar
+0xe022 T underdieresis
+0x1e6c T underdot
+0xe021 Tunderdot acute
+0x016c U breve
+0x01d3 U caron
+0x016a U macron
+0x016e U ring
+0x0170 U hungarumlaut
+#0x0172 U ogonek
+0x0168 U tilde
+0x01d7 Udieresis acute
+0x01d9 Udieresis caron
+0x01db Udieresis grave
+0x01d5 Udieresis macron
+0xe023 Umacron tilde
+0x1e78 Utilde acute
+0xe024 V acute
+0x0174 W circumflex
+0x1e88 W underdot
+0x0176 Y circumflex
+0x0178 Y dieresis
+0x1e8e Y overdot
+0x0179 Z acute
+0x017d Z caron
+0x017b Z overdot
+0x1e94 Z underbar
+0xe025 Z underdieresis
+0x1e92 Z underdot
+0x0103 a breve
+0x01ce a caron
+0x0101 a macron
+#0x0105 a ogonek
+0x01fd ae acute
+0x01e3 ae macron
+0xe026 amacron acute
+0xe029 amacron breve
+0xe027 amacron grave
+0xe028 amacron tilde
+0xe02a atilde acute
+0x0107 c acute
+0x010d c caron
+0x0109 c circumflex
+0xe02b c macron
+0x010b c overdot
+0xe02c c underdot
+#0x010f d caron
+#0x0111 dcroat
+0x1e0d d underdot
+0xe02d dunderdot acute
+0x0115 e breve
+0x011b e caron
+0x0113 e macron
+0x1ebd e tilde
+0x0117 e overdot
+#0x0119 e ogonek
+0xe02f emacron acute
+0xe031 emacron breve
+0xe030 emacron tilde
+0xe02e etilde acute
+0xe032 g acute
+0x0121 g overdot
+#0x0123 g cedilla
+0xe033 gacute macron
+0xe034 h acute
+0x0125 h circumflex
+0x1e96 h underbar
+0x1e2b h underbreve
+0xe035 h underdieresis
+0x1e25 h underdot
+#0x0127 hbar
+0x012d i breve
+0x01d0 i caron
+0x012b i macron
+0x0129 i tilde
+#0x012f i ogonek
+0xe036 imacron acute
+0xe039 imacron breve
+0xe037 imacron grave
+0xe038 imacron tilde
+0xe03a itilde acute
+0x0131 dotlessi
+#0x0133 ij
+0x0135 j circumflex
+0x01f0 j caron
+0xe03b j macron
+#0x0137 k cedilla
+0xe05f k underdot
+0xe03c k h
+0x1e35 k underbar
+0xe03d kh underbar
+#0x0138 kra (Greenlandic)
+0x013a l acute
+#0x013e l caron
+#0x013c l cedilla
+#0x0140 l middot
+0xe03e l tilde
+0x1e3b l underbar
+0x1e37 l underdot
+0xe040 l underring
+0x0142 lslash
+0xe03f lunderdot acute
+0x1e39 lunderdot macron
+0xe041 lunderring acute
+0xe042 lunderring macron
+0xe043 m breve
+0xe044 m candrabindu
+0x1e41 m overdot
+0x1e43 m underdot
+0x0144 n acute
+0x0148 n caron
+#0x0146 n cedilla
+0xe045 n breve
+0x1e45 n overdot
+0x1e49 n underbar
+0x1e47 n underdot
+#0x0149 n apostophe
+#0x014b eng
+0x014f o breve
+0x01d2 o caron
+0x014d o macron
+0x0151 o hungarumlaut
+0x0153 oe
+0xe047 omacron breve
+0xe046 omacron tilde
+0x1e4d otilde acute
+0x1e55 p acute
+0x0155 r acute
+0xe048 r breve
+0x0159 r caron
+#0x0156 r cedilla
+0x1e5f r underbar
+0xe04c r underdieresis
+0x1e5b r underdot
+0xe04d r underring
+0xe049 runderdot acute
+0xe04a runderdot grave
+0x1e5d runderdot macron
+0xe04b runderdotmacron acute
+0xe04e runderring acute
+0xe04f runderring grave
+0xe050 runderring macron
+0xe051 runderringmacron acute
+0x015b s acute
+0x015d s circumflex
+0x015f s cedilla
+0x0161 s caron
+0xe055 s underbar
+0xe054 s underdieresis
+0x1e63 s underdot
+0xe052 sacute macron
+0xe053 sunderdot macron
+#0x0165 t caron
+0x0163 t cedilla
+0x1e6f t underbar
+0xe057 t underdieresis
+0x1e6d t underdot
+0xe056 tunderdot acute
+#0x0167 tcroat
+0x016d u breve
+0x01d4 u caron
+0x016b u macron
+0x016f u ring
+0x0169 u tilde
+0x0171 u hungarumlaut
+#0x0173 u ogonek
+0x01d8 udieresis acute
+0x01da udieresis caron
+0x01dc udieresis grave
+0x01d6 udieresis macron
+0xe058 umacron acute
+0xe05b umacron breve
+0xe059 umacron grave
+0xe05a umacron tilde
+0x1e79 utilde acute
+0xe05c v acute
+0x0175 w circumflex
+0x1e89 w underdot
+0x0177 y circumflex
+0x1e8f y overdot
+0x017a z acute
+0x017e z caron
+0x017c z overdot
+0x1e95 z underbar
+0xe05d z underdieresis
+0x1e93 z underdot
+
+# Odds and ends
+
+0x2002 bullet
+0x2020 dagger
+0x2021 daggerdbl
+0x2026 ellipsis
+0x2014 emdash
+0x2013 endash
+0x0192 florin
+0x2039 guilsinglleft
+0x203a guilsinglright
+#0x2212 minus
+0x2030 perthousand
+0x201e quotedblbase
+0x201c quotedblleft
+0x201d quotedblright
+0x2018 quoteleft
+0x2019 quoteright
+0x201a quotesinglbase
+0x0027 quotesingle
+#0x2122 trademark
diff --git a/fonts/utilities/accfonts/Norman.def b/fonts/utilities/accfonts/Norman.def
new file mode 100644
index 0000000000..b934f46bba
--- /dev/null
+++ b/fonts/utilities/accfonts/Norman.def
@@ -0,0 +1,176 @@
+# Norman encoding for mkt1font and vpl2vpl
+#
+# Encoding devised by Prof. K. R. Norman for the representation of
+# Indian languages in Roman script
+
+# Chars 0-31
+
+0 .notdef
+1 Eth
+2 eth
+3 Lslash
+4 lslash
+5 S caron
+6 s caron
+7 Y acute
+8 y acute
+9 .notdef
+10 .notdef
+11 Thorn
+12 thorn
+13 .notdef
+14 Z caron
+15 z caron
+16 .notdef
+17 asciitilde
+18 j macron # j is dotless in Normyn
+19 circumflex
+20 tilde
+21 onehalf
+22 onequarter
+23 onesuperior
+24 threequarters
+25 threesuperior
+26 twosuperior
+27 brokenbar
+28 minus
+29 multiply
+30 .notdef
+31 .notdef
+
+# Changes from ASCII in range 32-127
+
+39 quotesingle
+94 circumflex
+96 grave
+
+# Chars 128-255
+
+128 A dieresis
+129 A ring
+130 imacron tilde
+131 E acute
+132 N tilde
+133 O dieresis
+134 U dieresis
+135 a acute
+136 a grave
+137 a circumflex
+138 a dieresis
+139 a tilde
+140 a macron
+141 c cedilla
+142 e acute
+143 e grave
+144 e circumflex
+145 e dieresis
+146 i acute
+147 i grave
+148 i circumflex
+149 i dieresis
+150 n tilde
+151 o acute
+152 o grave
+153 o circumflex
+154 o dieresis
+155 o tilde
+156 u acute
+157 u grave
+158 u circumflex
+159 u dieresis
+160 t underdot # see also 173, 202
+161 degree
+162 e tilde
+163 sterling
+164 section
+165 runderdot macron # runderring macron in Normyn
+166 paragraph
+167 s acute
+168 r underdot
+169 s caron
+170 umacron breve
+171 acute
+172 dieresis
+173 t underdot # notequal in Normyn
+174 AE
+175 o macron
+176 i tilde
+177 plusminus
+178 amacron acute
+179 umacron acute
+180 i macron
+181 m underdot
+182 d underdot
+183 s underdot
+184 emacron acute
+185 z acute
+186 n overdot
+187 emacron breve
+188 omacron breve
+189 u tilde
+190 ae
+191 oslash
+192 macron breve
+193 amacron breve
+194 l underdot
+195 j macron # j is dotless in Normyn
+196 a breve
+197 u breve
+198 amacron tilde
+199 imacron acute
+200 M underdot
+201 ellipsis
+202 .notdef # t underdot in PC Normyn
+203 A grave
+204 A tilde
+205 O tilde
+206 m breve
+207 oe
+208 endash
+209 emdash
+210 quotedblleft
+211 quotedblright
+212 quoteleft
+213 quoteright
+214 l underring
+215 m overdot
+216 n breve
+217 multiply
+218 runderdotmacron acute # runderringmacron acute in Normyn
+219 r underring
+220 N overdot
+221 S underdot
+222 H underdot
+223 D underdot
+224 daggerdbl
+225 runderdot acute # runderring acute in Normyn
+226 L underdot
+227 e macron
+228 imacron breve
+229 r underbar
+230 r underdieresis
+231 I macron
+232 u macron
+233 T underdot
+234 S acute
+235 dagger
+236 e breve
+237 o breve
+238 A macron
+239 N underdot
+240 umacron tilde
+241 l underbar
+242 U macron
+243 Z acute
+244 R underdot # R underring in Normyn
+245 dotlessi
+246 n underdot
+247 n underbar
+248 macron
+249 breve
+250 h underdot
+251 i breve
+252 cedilla
+253 hungarumlaut
+254 ogonek
+255 caron
diff --git a/fonts/utilities/accfonts/README b/fonts/utilities/accfonts/README
new file mode 100644
index 0000000000..79431d7653
--- /dev/null
+++ b/fonts/utilities/accfonts/README
@@ -0,0 +1,458 @@
+
+
+ Mkt1font, vpl2vpl and vpl2ovp: programs to generate accented fonts
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ John D. Smith
+ ~~~~~~~~~~~~~
+
+
+These three programs, all made available under the GNU General Public
+License, address the same requirement using the same basic algorithms:
+their aim is to make it easy to create versions of existing fonts
+containing whatever accented characters the user may need, arranged
+according to whatever encoding he/she may favour. Mkt1font does this
+by reading in the two files that define a Type 1 PostScript font and
+writing out new versions of them; vpl2vpl does it by reading in the
+file that defines a TeX virtual font and writing out a new version of
+it; vpl2ovp does the same as vpl2vpl, but its output is a 16-bit
+virtual font suitable for Omega, the Unicode-aware development from
+TeX. In each case information about what accented characters are
+required and where they should be located is supplied by means of a
+simple definition file, which has the same format for both programs.
+
+Note that most Type 1 PostScript fonts are commercial products
+subject to both copyright and licensing restrictions. If the license
+for such a font forbids reverse-engineering it, it is presumably
+illegal to run mkt1font on it; in any case it would certainly be a
+serious breach of copyright to make modified versions of the font
+available to third parties. The author of mkt1font will not be held
+responsible for any such misuses of the software. (No such legal
+problems surround the use of TeX virtual fonts, which merely specify
+new ways to use existing fonts.) However, would-be users may wish to
+note the existence of a body of high-quality freeware lookalikes for
+many of the standard Type 1 fonts: like mkt1font and vpl2vpl, the
+Ghostscript fonts developed by URW++ Design and Development
+Incorporated are made available under the GNU General Public License
+(see the file COPYING), which permits them to be modified and
+redistributed provided that certain simple decencies are observed.
+These fonts are available from many ftp sites, including those
+forming the Comprehensive TeX Archive Network (CTAN), for example
+ftp.tex.ac.uk: look for the most recent font archive file in the
+directory /tex-archive/support/ghostscript/gnu/fonts.
+
+A detailed specification of the form of the definition file used by
+mkt1font and vpl2vpl is given below in the instructions for using the
+programs, but it may be helpful to give a quick idea of its contents
+here. Each line of the file contains something similar to "128 x
+acute", which is an instruction to create a new character formed from
+"x" with an acute accent and located at position 128 in the character
+set. Once a new character has been defined in this way, it "exists" in
+just the same way as any other character, under the name "xacute" (or
+whatever); thus it can even receive further accents. The two lines
+
+ 129 e macron
+ 130 emacron breve
+
+will create a "long e" and a "long-or-short e" at the positions
+specified. (If only the latter is desired, they can both be assigned
+the same position in the encoding -- the second will overwrite the
+first.) Subscript as well as superscript accents are available. Some
+sample definition files are included to give an idea of the format:
+note that two of these (CSX.def and Norman.def), used for Indian
+language material in Roman script, contain the triple-accented
+character "runderdotmacron acute"!
+
+In addition to accented characters proper, both programs can produce
+digraphs -- single characters composed of pairs of other characters.
+In itself this may seem to be of limited use, since the digraph
+should always be indistinguishable from its two constituent
+characters printed consecutively. However, some Unicode-style
+encodings require that certain character-pairs be treated as
+digraphs. In addition, use of a digraph in subsequent definitions
+allows an accent to be applied to two characters as a pair: so, for
+example,
+
+ 131 k h
+ 131 kh underbar
+
+will produce a character consisting of an underlined "kh" at
+position 131.
+
+The algorithms used in both programs take great care to secure the
+most attractive results, placing accents centrally over/under their
+characters at appropriate heights/depths, varying their position
+according to the angle of slant in Italic and similar fonts,
+providing new characters with kerning information (which will be
+resolutely ignored by most word-processors), and -- in the case of
+mkt1font -- giving hinting instructions to improve output on
+low-resolution printers. However, users may feel that some
+characters need "tweaking". This tends to happen when the part of
+the character adjacent to the accent is highly asymmetrical:
+subscript accents below "r" may need moving to the left, while
+superscript accents above "d" may need moving to the right. It is
+relatively easy to modify the output of vpl2vpl to make such
+improvements by hand (vpl files are designed to be easy for humans
+to read, and vpl2vpl identifies each character with a comment). Type
+1 fonts are another matter; mkt1font generates a human-readable and
+commented ".dis" file as well as the ".pfb" font file, and it is
+possible to make changes to this and rebuild the pfb file with t1asm
+(see below), but this is not quite as simple as modifying a TeX
+virtual font.
+
+For details on how vpl2ovp handles access to accented characters by
+means of a system of ligatures, see further the CHANGES file.
+
+The programs are written in Perl, and have not been tested on
+systems other than Unix. (Apart from the #! line at the top, the
+only Unix specificities the author is aware of are two references to
+"/dev/null" in mkt1font and the general assumption that filenames
+can be of any length.) At run time, mkt1font invokes two further
+font utilities, t1asm and t1disasm, written by I. Lee Hetherington
+and available from CTAN ftp sites: look in the directory
+/tex-archive/fonts/utilities/t1utils.
+
+Detailed instructions for using the programs follow. In each case
+these instructions can also be seen by typing the name of the program
+with a "-h" option.
+
+
+Mkt1font
+~~~~~~~~
+Syntax: mkt1font -n fontname -d definition-file -a afm-file -f font-file
+ [-s shrink-factor] [-c candrabindu-adjustment] [-b]
+
+Mkt1font creates new Type 1 PostScript fonts based on existing fonts
+("input fonts"). In order to do this it makes use of I. Lee
+Hetherington's programs t1asm and t1disasm, which must be present on
+the system. A successful run will generate an AFM file and a PFB
+file, as well as a DIS file containing a disassembled version of the
+PFB file (including useful comments). Four options must be specified
+on the command line, as follows:
+
+ -n should name the font it is intended to generate. Avoid names
+ such as "myfont", as both mkt1font and other programs attempt
+ to draw conclusions from the name; better would be something
+ like "Utopia_French-BoldItalic". The generated font files
+ will also use this for their basename.
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., "French.def") should consist of
+ lines of character definitions, in the form
+ "number" "character"
+ or
+ "number" "character" "accent"
+ Here "number" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ "character" names the character (e.g. "comma", "eight",
+ "A") or consists of the word ".notdef" (indicating that
+ the specified number's "slot" in the new encoding is to be
+ empty); and "accent" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, "underbar" and "underdot" are also
+ available, as are "under" versions of all the normal
+ superscript accents ("underdieresis", "underring", etc.).
+ The Indian accent "candrabindu" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ "overdot" may be used as a synonym for "dotaccent".
+
+ If the character named in the "accent" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the "character" and the
+ "accent". A digraph consisting of, say, "k" and "h" will be
+ indistinguishable from the letters "k" and "h" printed
+ consecutively, but the digraph "kh" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as "amacron" or "kh") may be freely
+ used in the "character" position of a further definition (such
+ as "amacron breve" or "kh underbar"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of "a macron" does not have to precede that of
+ "amacron breve": requests for "impossible" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ "Slots" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by "#").
+
+ -a should refer to the AFM (Adobe Font Metrics) file for the input
+ font.
+
+ -f should refer to the binary font file (PFB) for the input font.
+ (In fact the equivalent ASCII file (PFA) is also acceptable for
+ input, but the output font is always in PFB format.)
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing mkt1font to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share mkt1font's views
+ on where accents should be placed.
+
+The -h option prints this help.
+
+
+Vpl2vpl
+~~~~~~~
+Syntax: vpl2vpl -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2vpl creates new TeX virtual fonts based on existing fonts or
+virtual fonts ("input fonts"). A successful run will read a pl
+(Property List) or vpl (Virtual Property List) file and a definition
+file, and will generate a new vpl (Virtual Property List) file on
+standard output. The input font is assumed to adhere to the standard
+TeX encoding for text fonts unless it was created with either of the
+programs afm2pl or afm2tfm, in which case it is assumed to conform to
+(respectively) the Adobe Standard Encoding or the encoding specified
+in the file dvips.enc. In either case, the name of the input font is
+assumed to be the name of the input file without its .vpl or .pl
+extension: it must conform to normal TeX conventions for naming fonts,
+as vpl2vpl attempts to draw conclusions from it about the kind of font
+it is dealing with.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2vpl -d ISO-Latin1.def cmr10.pl >cmr10_isol1.vpl
+ vptovf cmr10_isol1.vpl cmr10_isol1.vf cmr10_isol1.tfm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2vpl -d ISO-Latin1.def rptmr.pl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole upper half of the character set free for
+the requirements of the encoding specified in the definition file,
+certain modifications are made to input fonts following the
+dvips.enc encoding to bring them into greater conformity with the
+TeX norm. In particular, the characters dotaccent and hungarumlaut
+are placed in the positions assigned by TeX ("5F, "7D), not those
+enforced by dvips.enc ("C7, "CD). The f-ligatures, double quotes
+and dashes are also moved from the upper half of the character set
+to their normal TeX positions. As a result, the following characters
+are not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., "French.def") should consist of
+ lines of character definitions, in the form
+ "number" "character"
+ or
+ "number" "character" "accent"
+ Here "number" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ "character" names the character (e.g. "comma", "eight",
+ "A") or consists of the word ".notdef" (indicating that
+ the specified number's "slot" in the new encoding is to be
+ empty); and "accent" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, "underbar" and "underdot" are also
+ available, as are "under" versions of all the normal
+ superscript accents ("underdieresis", "underring", etc.).
+ The Indian accent "candrabindu" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ "overdot" may be used as a synonym for "dotaccent".
+
+ If the character named in the "accent" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the "character" and the
+ "accent". A digraph consisting of, say, "k" and "h" will be
+ indistinguishable from the letters "k" and "h" printed
+ consecutively, but the digraph "kh" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as "amacron" or "kh") may be freely
+ used in the "character" position of a further definition (such
+ as "amacron breve" or "kh underbar"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of "a macron" does not have to precede that of
+ "amacron breve": requests for "impossible" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ "Slots" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by "#").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ "DESIGNUNITS R 1000" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2vpl to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2vpl's views
+ on where accents should be placed.
+
+ -h prints this help.
+
+
+Vpl2ovp
+~~~~~~~
+
+Syntax: vpl2ovp -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2ovp creates new Omega virtual fonts based on existing TeX
+fonts or virtual fonts ("input fonts"). A successful run will
+read a pl (Property List) or vpl (Virtual Property List) file
+and a definition file, and will generate a new ovp (Omega
+Virtual Property List) file on standard output. The input font
+is assumed to adhere to the standard TeX encoding for text
+fonts unless it was created with either of the programs afm2pl
+or afm2tfm, in which case it is assumed to conform to
+(respectively) the Adobe Standard Encoding or the encoding
+specified in the file dvips.enc. In either case, the name of
+the input font is assumed to be the name of the input file
+without its .vpl or .pl extension: it must conform to normal
+TeX conventions for naming fonts, as vpl2ovp attempts to draw
+conclusions from it about the kind of font it is dealing with.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2ovp -d Unicode1.def cmr10.pl >cmr10-uni1.ovp
+ ovp2ovf cmr10-uni1.ovp cmr10-uni1.ovf cmr10-uni1.ofm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2ovp -d Unicode1.def rptmr.pl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2ovp -d Unicode1.def ptmr.vpl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole of the character range "F0-"FF free for
+the requirements of the encoding specified in the definition file,
+certain modifications are made to input fonts following the dvips.enc
+encoding to bring them into greater conformity with the TeX norm. In
+particular, the characters dotaccent and hungarumlaut are placed in
+the positions assigned by TeX ("5F, "7D), not those enforced by
+dvips.enc ("C7, "CD). The f-ligatures, double quotes and dashes are
+also moved from the upper half of the original 8-bit character set to
+their normal TeX positions. As a result, the following characters are
+not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., "Unicode1.def") should consist of
+ lines of character definitions, in the form
+ "number" "character"
+ or
+ "number" "character" "accent"
+ Here "number" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ "character" names the character (e.g. "comma", "eight",
+ "A") or consists of the word ".notdef" (indicating that
+ the specified number's "slot" in the new encoding is to be
+ empty); and "accent" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, "underbar" and "underdot" are also
+ available, as are "under" versions of all the normal
+ superscript accents ("underdieresis", "underring", etc.).
+ The Indian accent "candrabindu" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ "overdot" may be used as a synonym for "dotaccent".
+
+ Note that all accents used in defining accented characters must
+ themselves be defined in the .def file. Those which exist in the
+ source font should simply be referenced by name in their
+ appropriate Unicode position (e.g. "0x0304 macron"); those
+ which do not should be defined as the character "space"
+ followed by the name of the accent (e.g. "0x0310 space
+ candrabindu").
+
+ If the character named in the "accent" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the "character" and the
+ "accent". A digraph consisting of, say, "k" and "h" will be
+ indistinguishable from the letters "k" and "h" printed
+ consecutively, but the digraph "kh" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as "amacron" or "kh") may be freely
+ used in the "character" position of a further definition (such
+ as "amacron breve" or "kh underbar"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of "a macron" does not have to precede that of
+ "amacron breve": requests for "impossible" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ "Slots" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by "#").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ "DESIGNUNITS R 1000" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2ovp to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2ovp's views
+ on where accents should be placed.
+
+ -h prints this help.
+
+
+John D. Smith
+jds10@cam.ac.uk
+http://bombay.indology.info
diff --git a/fonts/utilities/accfonts/dvips.enc b/fonts/utilities/accfonts/dvips.enc
new file mode 100644
index 0000000000..ea451ff106
--- /dev/null
+++ b/fonts/utilities/accfonts/dvips.enc
@@ -0,0 +1,75 @@
+% @@psencodingfile@{
+% author = "T. Rokicki, K. Berry",
+% version = "2.0",
+% date = "22 June 1996",
+% filename = "dvips.enc",
+% email = "kb@@mail.tug.org",
+% address = "135 Center Hill Rd. // Plymouth, MA 02360",
+% codetable = "ISO/ASCII",
+% checksum = "75 515 3715",
+% docstring = "An encoding for PostScript fonts to be used with TeX."
+% @}
+%
+% This is almost the default encoding produced by the afm2tfm program
+% that comes with the dvips distribution, when it is applied to a
+% StandardEncoding PostScript font. The positions of the accented
+% characters (which afm2tfm assigned more or less randomly in the
+% previous set of fonts) have been held fixed.
+%
+% It is almost upward-compatible with TeX text. (The primary exceptions
+% are dotaccent and hungarumlaut.) Some of the ligatures are also in
+% different positions, but this is not important, since ligature
+% positions are defined in the TFM file, not by macros.
+%
+% The character positions were assigned in this order:
+% 1) non-composite characters in the afm2tfm encoding (except dotlessj
+% was included in its plain TeX position);
+% 2) available characters in the Cork (EC) encoding;
+% 3) remaining composite characters in the base encoding (starting at
+% position 130 decimal). We don't include all the other base
+% characters because that changes the height/depth/width tables in
+% the TFM files (because more characters mean more distinct values).
+%
+% We leave the initial positions open for the Greek letters in Times-Roman.
+%
+/DvipsEncoding [
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /quotesingle /exclamdown /questiondown
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /circumflex /underscore
+ /quoteleft /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /tilde /dieresis
+ /asciicircum /asciitilde /Ccedilla /Iacute
+ /Icircumflex /atilde /edieresis /egrave
+ /scaron /zcaron /Eth /ff /ffi /ffl /.notdef /.notdef
+ /.notdef /.notdef /Scaron /.notdef /.notdef /.notdef /.notdef /.notdef
+ /Ydieresis /.notdef /Zcaron /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /cent /sterling /fraction /yen /florin /section
+ /currency /copyright /quotedblleft /guillemotleft
+ /guilsinglleft /guilsinglright /fi /fl
+ /degree /endash /dagger /daggerdbl /periodcentered /.notdef /paragraph /bullet
+ /quotesinglbase /quotedblbase /quotedblright /guillemotright
+ /ellipsis /perthousand /.notdef /.notdef
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /.notdef /dotaccent
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /hungarumlaut /ogonek /Idieresis
+ /emdash /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /.notdef
+ /.notdef /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /.notdef
+ /agrave /aacute /acircumflex /ordfeminine
+ /adieresis /aring /.notdef /ccedilla
+ /Lslash /eacute /ecircumflex /ordmasculine
+ /igrave /iacute /icircumflex /idieresis
+ /.notdef /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /.notdef
+ /lslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
diff --git a/fonts/utilities/accfonts/mkt1font b/fonts/utilities/accfonts/mkt1font
new file mode 100755
index 0000000000..966ba5932d
--- /dev/null
+++ b/fonts/utilities/accfonts/mkt1font
@@ -0,0 +1,1012 @@
+#!/usr/bin/perl
+
+# Mkt1font: a program to generate accented Type 1 PostScript fonts
+# Copyright (C) 1997 John D. Smith
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$version = 0.25;
+#-----------------------------------------------------------------------------#
+$description =
+"Syntax: mkt1font -n fontname -d definition-file -a afm-file -f font-file
+ [-s shrink-factor] [-c candrabindu-adjustment] [-b]
+
+Mkt1font creates new Type 1 PostScript fonts based on existing fonts
+(\"input fonts\"). In order to do this it makes use of I. Lee
+Hetherington's programs t1asm and t1disasm, which must be present on
+the system. A successful run will generate an AFM file and a PFB
+file, as well as a DIS file containing a disassembled version of the
+PFB file (including useful comments). Four options must be specified
+on the command line, as follows:
+
+ -n should name the font it is intended to generate. Avoid names
+ such as \"myfont\", as both mkt1font and other programs attempt
+ to draw conclusions from the name; better would be something
+ like \"Utopia_French-BoldItalic\". The generated font files
+ will also use this for their basename.
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., \"French.def\") should consist of
+ lines of character definitions, in the form
+ \"number\" \"character\"
+ or
+ \"number\" \"character\" \"accent\"
+ Here \"number\" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ \"character\" names the character (e.g. \"comma\", \"eight\",
+ \"A\") or consists of the word \".notdef\" (indicating that
+ the specified number's \"slot\" in the new encoding is to be
+ empty); and \"accent\" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, \"underbar\" and \"underdot\" are also
+ available, as are \"under\" versions of all the normal
+ superscript accents (\"underdieresis\", \"underring\", etc.).
+ The Indian accent \"candrabindu\" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ \"overdot\" may be used as a synonym for \"dotaccent\".
+
+ If the character named in the \"accent\" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the \"character\" and the
+ \"accent\". A digraph consisting of, say, \"k\" and \"h\" will be
+ indistinguishable from the letters \"k\" and \"h\" printed
+ consecutively, but the digraph \"kh\" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as \"amacron\" or \"kh\") may be freely
+ used in the \"character\" position of a further definition (such
+ as \"amacron breve\" or \"kh underbar\"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of \"a macron\" does not have to precede that of
+ \"amacron breve\": requests for \"impossible\" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ \"Slots\" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by \"\#\").
+
+ -a should refer to the AFM (Adobe Font Metrics) file for the input
+ font.
+
+ -f should refer to the binary font file (PFB) for the input font.
+ (In fact the equivalent ASCII file (PFA) is also acceptable for
+ input, but the output font is always in PFB format.)
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing mkt1font to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share mkt1font's views
+ on where accents should be placed.
+
+The -h option prints this help.
+";
+#-----------------------------------------------------------------------------#
+
+########################
+# Packages and constants
+########################
+#
+use File::Basename;
+use Getopt::Std;
+$cmdline = basename($0) . " " . join " ", @ARGV;
+getopts('n:d:a:f:c:s:bh');
+if ($opt_h or !($opt_n && $opt_d && $opt_a && $opt_f) or ($#ARGV >= 0)) {
+ print STDERR $description;
+ exit 1;
+}
+($enc = basename($opt_d)) =~ s/\..*$//;
+if ($opt_n =~ /\s/) { die "Font name cannot contain whitespace\n" }
+($famname = $opt_n) =~ s/^(.*)-.*?$/$1/;
+if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
+@months = ( "January", "February", "March", "April",
+ "May", "June", "July", "August",
+ "September", "October", "November", "December"
+ );
+@lt = localtime;
+$date = "$months[$lt[4]] $lt[3], ${ \($lt[5] + 1900) }";
+if ($opt_c) { ($cbx, $cby) = $opt_c =~ /^(.*),(.*)$/ } # candrabindu
+
+###############
+# Read DEF file
+###############
+#
+open DEF, $opt_d or die "Cannot open $opt_d: $!\n";
+while (<DEF>) {
+ next if (/^\s*$/ || /^\#/);
+ s/\s*(\#.*)?$//;
+ push @deflines, $_;
+}
+close DEF;
+
+###############
+# Read AFM file
+###############
+#
+# File header
+#
+open AFM, $opt_a or die "Cannot open $opt_a: $!\n";
+while (<AFM>) {
+ if (/^StartFontMetrics/) {
+ $afmhead = $_;
+ do {
+ $_ = <AFM>;
+ $afmhead .= $_;
+ }
+ until $_ =~ /^StartCharMetrics \d+\r?$/;
+ $afmhead =~ s/\r//gm; # Might be DOS file
+ $afmhead =~ /^FontName (.*)$/m;
+ $ofname = $1;
+ $afmbanner = "\nComment Based on $ofname; modified for $enc encoding";
+ $afmbanner .= "\nComment by John Smiths's program mkt1font ";
+ $afmbanner .= "(v. $version) " if $version;
+ $afmbanner .= "on $date";
+ $afmbanner .= "\nComment Command line: $cmdline";
+ $afmhead =~ s/(\n^FontName )(.*)$/$1$opt_n/m;
+ $afmhead =~ s/(\n^FullName )(.*)$/$1$opt_n/m;
+ $afmhead =~ s/(\n^FamilyName )(.*)$/$1$famname/m;
+ $afmhead =~ s/\n^Comment /$afmbanner$&/m;
+ $afmhead =~ s/(\n^EncodingScheme ).*$/$1FontSpecific/m;
+ if ($afmhead =~ /\n^ItalicAngle (.*)$/m) { $italangle = $1 }
+ if ($afmhead =~ /\n^CapHeight (.*)$/m) { $capheight = $1 }
+ if ($afmhead =~ /\n^XHeight (.*)$/m) { $xheight = $1 }
+ if ($afmhead =~ /\n^FontBBox -?\d+ (-?\d+) (-?\d+) (-?\d+)$/m) {
+ ($maxdp, $maxrs, $maxht) = ($1, $2, $3);
+ }
+ }
+ #
+ # Encoded chars
+ #
+ if (/(^C (\d+) ; WX \d+ ; N ([a-zA-Z_][a-zA-Z0-9_.]*|\.notdef) ; B .* ;( L .* ;)?)\r?$/) {
+ $metrics_enc[$2] = "$1\n";
+ }
+ #
+ # Unencoded chars
+ #
+ elsif (/(^C -1 ; WX \d+ ; N ([a-zA-Z_][a-zA-Z0-9_.]*|\.notdef) ; B .* ;( L .* ;)?)\r?$/) {
+ $metrics_unenc .= "$1\n";
+ }
+ #
+ # Kerns etc.
+ #
+ if (/^EndCharMetrics\r?$/) {
+ $afmtail = $_;
+ do {
+ $_ = <AFM>;
+ $afmtail .= $_;
+ }
+ until eof(AFM);
+ $afmtail =~ s/[\r\cZ]//gm; # Might be DOS file
+ }
+}
+if ($afmtail =~ /(\A(?:.|\n)*^StartKernPairs )\d+\n((?:.|\n)*)(^EndKernPairs(?:.|\n)*\Z)/m) {
+ ($kstart, $kdefs, $kend) = ($1, $2, $3);
+}
+close AFM;
+
+###############################
+# Read and disassemble PFB file
+###############################
+#
+open PFB, $opt_f or die "Cannot open $opt_f: $!\n";
+$_ = <PFB>;
+unless (/%!/) { die "File $opt_f is not a PostScript font\n" }
+close PFB;
+$disfile1 = "mkt1font$$.dis";
+system "t1disasm $opt_f >$disfile1 2>/dev/null";
+open DIS, $disfile1 or die "Cannot open disassembled font file: $!\n";
+while (<DIS>) {
+ #
+ # Locate crucial definitions
+ #
+ if (/^\/(.*?) ?{ ?noaccess def ?} ?executeonly def$/) {
+ $nd = $1;
+ ($rend = $nd) =~ s/\|/\\|/g; # Regexp version
+ next;
+ }
+ if (/^\/(.*?) ?{ ?noaccess put ?} ?executeonly def$/) {
+ $np = $1;
+ ($renp = $np) =~ s/\|/\\|/g; # Regexp version
+ next;
+ }
+ if (/^\/Subrs (\d+) array/) {
+ $subrsnum = $1;
+ do {
+ #
+ # Store subroutine definitions in @subrs
+ #
+ $l = $_ = <DIS>;
+ if (/^dup (\d+) {$/) {
+ $subrnum = $1;
+ $subrdef = $_;
+ do {
+ $_ = <DIS>;
+ $subrdef .= $_;
+ }
+ until /^\t} ?$renp$/;
+ }
+ #
+ # "correct" t1disasm output so t1asm will accept it as input
+ #
+ $subrdef =~ s/^(\t})($rend|$renp)$/$1 $2/m;
+ $subrs[$subrnum] = $subrdef;
+ }
+ until ($l !~ /^dup \d+ {$/);
+ next;
+ }
+ if (/^2 index \/CharStrings (\d+) dict dup begin/) {
+ #
+ # do *not* use "$" to anchor the end of this line, because
+ # it may end with an invisible trailing space!
+ #
+ $chdefsnum = $1;
+ do {
+ #
+ # Store character definitions in %chstrings
+ #
+ $l = $_ = <DIS>;
+ if (/^\/([a-zA-Z_][a-zA-Z0-9_.]*|\.notdef|\.null) {$/) {
+ $chname = $1;
+ $chdef = $_;
+ do {
+ $_ = <DIS>;
+ $chdef .= $_;
+ }
+ until /^\t} ?$rend$/;
+ }
+ #
+ #"correct" t1disasm output so t1asm will accept it as input
+ #
+ $chdef =~ s/^(\t})($rend|$renp)$/$1 $2/m;
+ $chstrings{$chname} = $chdef;
+ }
+ until ($l !~ /^\/([a-zA-Z_][a-zA-Z0-9_.]*|\.notdef|\.null) {$/);
+ #
+ # File tail
+ #
+ if (/^end/) {
+ $distail = $_;
+ do {
+ $_ = <DIS>;
+ $distail .= $_;
+ }
+ until eof(DIS);
+ }
+ }
+}
+close DIS;
+unless ($nd) { die "Cannot find \"noaccess def\" definition\n" }
+unless ($np) { die "Cannot find \"noaccess put\" definition\n" }
+unless ($subrsnum) { die "Cannot find size of Subrs array\n" }
+unless ($chdefsnum) { die "Cannot find size of CharStrings dict\n" }
+
+##################
+# Set up constants
+##################
+#
+$subacc = "(cedilla|ogonek|commaaccent)";
+$supacc = "(grave|acute|circumflex|tilde|macron|breve|dotaccent|overdot|dieresis|ring|hungarumlaut|caron|candrabindu)";
+$underacc = "(underdot|under$supacc)";
+$accents = "($subacc|$supacc|$underacc|underbar)";
+$underadp = -230; # depth of "under" accs
+$underddp = -213; # depth of underdot
+if ($opt_n =~ /Bold/) { $thk = 72 } else { $thk = 52 } # thickness and
+$underbdp = -(82 + $thk); # depth of underbar
+getcharinfo("macron");
+$accheight = $chht{macron}; # height of macron
+$accdepth = $chdp{macron}; # "depth" of macron
+$v1 = $accheight - $xheight; # vertical offset for double accents
+$v2 = $capheight - $xheight; # vertical offset for accented caps etc
+#
+# Italic adjustment: tan(angle)
+#
+$itadj = sin($italangle * 3.14159 / 180) / cos($italangle * 3.14159 / 180);
+
+###########################
+# Create uni0237 (dotlessj)
+###########################
+#
+$chstrings{uni0237} = $chstrings{j} . "\n";
+$chstrings{uni0237} =~ /\A(.*?)(\t[-0-9 ]+?[rvh]moveto)(\n.+)(\n\t.*?(-?\d+) [rv]moveto)(.*?)(\n\tendchar.*?)\Z/ms;
+($one, $two, $three, $four, $five, $six, $seven) = ($1, $2, $3, $4, $5, $6, $7);
+if ($five > 0) { $chstrings{uni0237} = $one . $two . $three . $seven }
+else {
+ findend("j1", ($two . $three));
+ $j1end = "\t$hend{j1} $vend{j1} rmoveto";
+ $chstrings{uni0237} = $one . $j1end . $four . $six . $seven
+}
+$chstrings{uni0237} =~s/\A\/j /\/uni0237 /m;
+getcharinfo("j");
+getcharinfo("dotlessi");
+$metrics_unenc .= "C -1 ; WX $chwd{j} ; N uni0237 ; B $chls{j} $chdp{j} $chrs{j} $chht{dotlessi} ;\n";
+#
+######################
+# Build the characters
+######################
+#
+# First build a list of definitions supplied by user
+#
+for (@deflines) {
+ if (/^\s*(\d+|0[0-7]+|0x[0-9a-fA-F]+)\s+([a-zA-Z_][a-zA-Z0-9_.]*?|\.notdef)(?:\s+([a-zA-Z_][a-zA-Z0-9_.]*))?$/) {
+ ($num, $char, $acc) = ($1, $2, $3);
+ $num = oct $num if $num =~ /^0/;
+ if ($num > 255) { die "Bad definition (number out of range): $_\n" }
+ $def = {};
+ $def->{qdef} = $_;
+ $def->{num} = $num;
+ $def->{char} = $char;
+ $def->{acc} = $acc;
+ $def->{nchar} = $char . $acc;
+ push @nchars, $def->{nchar};
+ push @defs, $def;
+ }
+ else { die "Bad definition: $_\n" }
+}
+#
+# Work through the list
+#
+while (@defs) {
+ $def = shift @defs;
+ $qdef = $def->{qdef};
+ $num = $def->{num};
+ $char = $def->{char};
+ $acc = $def->{acc};
+ $nchar = $def->{nchar};
+ #
+ # If we can't handle $char/$acc yet, but believe we will be able
+ # to later, send the definition to the back of the queue. In case
+ # it later turns out we were wrong, allow only five loops before
+ # giving up.
+ #
+ if (!grep / ; N $char ; /, @metrics_enc
+ and $metrics_unenc !~ / ; N $char ; /m) {
+ if (grep /^$char$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such character): $qdef\n" }
+ }
+ if ($acc
+ and !grep / ; N $acc ; /, @metrics_enc
+ and $metrics_unenc !~ / ; N $acc ; /m
+ and $acc !~ /^$accents$/) {
+ if (grep /^$acc$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such accent): $qdef\n" }
+ }
+ #
+ # First deal with .notdef
+ #
+ if ($nchar eq ".notdef") {
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ undef $metrics_enc[$num];
+ }
+ #
+ # Now look for new char among existing encoded chars (unless blocked by -b)
+ #
+ else {
+ if (!($acc and $opt_b)
+ and @foundit = grep / ; N $nchar ; /, @metrics_enc) {
+ ($foundit = shift @foundit) =~ s/^C (\d+)/C $num/;
+ $prevnum = $1;
+ unless ($prevnum == $num) {
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ $metrics_enc[$num] = $foundit;
+ }
+ fixkerns($char, $acc);
+ }
+ #
+ # Next look among existing unencoded chars (unless blocked by -b)
+ #
+ elsif (!($acc and $opt_b)
+ and $metrics_unenc =~ s/^C -1 ; WX \d+ ; N $nchar ; B .* ;( L .* ;)?\n//m) {
+ ($foundit = $&) =~ s/^C -1/C $num$1/m;
+ $old = $metrics_enc[$num];
+ if ($old) {
+ $old =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ }
+ $metrics_enc[$num] = $foundit;
+ fixkerns($char, $acc);
+ }
+ #
+ # If it can't be built from sub-elements, issue a warning and move on
+ #
+ elsif (!$acc) { warn "No such character - ignoring definition: $qdef\n" }
+ #
+ # Now build the char
+ #
+ else {
+ #
+ # First get rid of predefined afm entries and synonyms
+ #
+ $metrics_unenc =~ s/^C -1 ; WX \d+ ; N $nchar ; B .* ;( L .* ;)?\n//m;
+ $kdefs =~ s/\nKPX .*$nchar .*$//gm;
+ if ($acc eq "overdot") {
+ $nchar2 = $char . "dotaccent";
+ $metrics_unenc =~ s/^C -1 ; WX \d+ ; N $nchar2 ; B .* ;( L .* ;)?\n//m;
+ $kdefs =~ s/\nKPX .*$nchar2 .*$//gm;
+ delete $chstrings{$nchar2};
+ }
+ #
+ # Go!
+ #
+ if ($acc =~ /^$subacc$/) {
+ subacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$supacc$/) {
+ supacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$underacc$/) {
+ underacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^underbar$/) {
+ underb($num, $char, $nchar);
+ fixkerns($char, $acc);
+ }
+ else {
+ digraph($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ }
+ }
+}
+
+################
+# Write AFM file
+################
+#
+open OUTAFM, ">$opt_n.afm";
+foreach (@metrics_enc) { # Avoid duplicate entries
+ ($chname) = /( ; N [a-zA-Z_][a-zA-Z0-9_.]* ; )/;
+ $metrics_unenc =~ s/^C -1 .*$chname.*\n//gm if $chname;
+}
+$chmetricnum = split(/\n/, $metrics_unenc);
+$chmetricnum += grep /^C /, @metrics_enc;
+$afmhead =~ s/^(FontBBox -?\d+ )-?\d+ -?\d+ -?\d+$/$1$maxdp $maxrs $maxht/m;
+$afmhead =~ s/^(StartCharMetrics )\d+$/$1$chmetricnum/m;
+$encoding = "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n";
+print OUTAFM $afmhead;
+for $i (0 .. 255) {
+ $line = $metrics_enc[$i];
+ if ($line) {
+ print OUTAFM $line;
+ if ($line =~ /^C \d+ ; WX \d+ ; N ([a-zA-Z_][a-zA-Z0-9_.]*) ; /) {
+ $encoding .= "dup $i /$1 put\n";
+ }
+ }
+}
+$encoding .= "readonly def\n";
+print OUTAFM $metrics_unenc;
+#
+# Tidy up kerns
+#
+if ($kdefs) {
+ $kdefs = join("\n", sort split /\n/, $kdefs); # sort
+ $kdefs .= "\n";
+ $kdefs =~ s/((^KPX .*?)-?\d+$)\n\2.*$/$1/gm; # remove duplicates
+ $kdefs =~ s/^\s*\n//gm; # and blank lines
+ $knum = split(/\n/, $kdefs);
+ $afmtail = $kstart . $knum . "\n" . $kdefs . $kend;
+}
+#
+# Eliminate composite character definitions
+#
+$afmtail =~ s/\n(Start|End)Composites.*$//gm;
+$afmtail =~ s/\nCC .*;$//gm;
+print OUTAFM $afmtail;
+close OUTAFM;
+
+#########################
+# Write DIS and PFB files
+#########################
+#
+$disfile2 = "$opt_n.dis";
+open OUTDIS, ">$disfile2";
+$disbanner = "% Based on $ofname; modified for $enc encoding\n";
+$disbanner .= "% by John Smiths's program mkt1font ";
+$disbanner .= "(v. $version) " if $version;
+$disbanner .= "on $date\n";
+$disbanner .= "% Command line: $cmdline";
+open DIS, $disfile1;
+while (<DIS>) { # get header
+ s/^(%!.*: ).*$/$1$opt_n\n$disbanner/;
+ s/(\/FullName \().*(\).*)$/$1$opt_n$2/;
+ s/(\/FamilyName \().*(\).*)$/$1$famname$2/;
+ s/(\/FontName \/).*?( .*)$/$1$opt_n$2/;
+ s/(\/FontBBox {-?\d+ )-?\d+ -?\d+ -?\d+/$1$maxdp $maxrs $maxht/m;
+ if (/^\/Encoding /) {
+ print OUTDIS $encoding;
+ next;
+ }
+ next if (/\/UniqueID .*$/);
+ s /(\/BlueValues \[.*)(\] def)$/$1 $accheight $accheight$2/;
+ if (/(\/Subrs )\d+( array)$/) {
+ print OUTDIS "$1$subrsnum$2\n";
+ last;
+ }
+ else { print OUTDIS }
+}
+close DIS;
+unlink $disfile1;
+foreach $subrdef (@subrs) { print OUTDIS $subrdef }
+$chdefsnum = scalar(keys(%chstrings));
+print OUTDIS "$nd\n2 index /CharStrings $chdefsnum dict dup begin\n";
+foreach (sort values %chstrings) { print OUTDIS }
+print OUTDIS $distail;
+close OUTDIS;
+system "t1asm -b $disfile2 >$opt_n.pfb 2>/dev/null";
+
+#####################
+# End of main program
+#####################
+
+sub subacc {
+ #
+ # Subscript accents
+ #
+ my ($num, $char, $acc, $nchar) = @_;
+ my ($old, $astr, $h, $H, $V, $chdef, $acdef, $pstr);
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ getcharinfo($char) unless defined $chwd{$char};
+ getcharinfo($acc) unless defined $chwd{$acc};
+ $astr = "C $num ; WX $chwd{$char} ; N $nchar ; B $chls{$char} ";
+ $astr .= "$chdp{$acc} $chrs{$char} $chht{$char} ;\n";
+ $metrics_enc[$num] = $astr;
+ $h = round(($chwd{$char} - $chwd{$acc}) / 2 + $chls{$acc});
+ unless (defined $hend{$char}) { findend($char, $chstrings{$char}) }
+ $H = $h - $hend{$char} - $chls{$char};
+ $V = -$vend{$char};
+ $chstrings{$char} =~ /^\/$char {\n(\t.+?hsbw\n(.|\n)*?)\tendchar\n\t} $rend\n/m;
+ $chdef = $1;
+ $chstrings{$acc} =~ /^\/$acc {\n\t.+? .+?hsbw\n((.|\n)+?\t} $rend\n)/m;
+ $acdef = $1;
+ $acdef = fixhints($nchar, $acc, $acdef, $h, 0);
+ $pstr = "/$nchar {\n$chdef % $nchar: start of $acc\n";
+ $pstr .= "\t$H $V rmoveto\n$acdef";
+ $chstrings{$nchar} = $pstr;
+}
+
+sub supacc {
+ #
+ # Superscript accents
+ #
+ my ($num, $char, $acc, $nchar) = @_;
+ my ($old, $cb, $astr, $h, $v, $H, $V, $it, $chdef, $acdef, $pstr, $newchar);
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ if ($char eq "i") { $char = "dotlessi" }
+ if ($char eq "j") { $char = "uni0237" }
+ if ($acc eq "overdot") { $acc = "dotaccent" }
+ if ($acc eq "candrabindu") {
+ $acc = "breve";
+ $chstrings{"dotaccent"} =~ /^\/dotaccent {\n\t.+? .+?hsbw\n((.|\n)+?\t} $rend\n)/m;
+ $cb = $1;
+ }
+ getcharinfo($char) unless defined $chwd{$char};
+ getcharinfo($acc) unless defined $chwd{$acc};
+ $astr = "C $num ; WX $chwd{$char} ; N $nchar ; B ";
+ $astr .= "$chls{$char} $chdp{$char} $chrs{$char} ";
+ $v = $chht{$acc};
+ if ($chht{$char} >= $accheight + $v2) { # double accs
+ $v += ($v1 + $v2); # on caps etc.
+ $it = ($v1 + $v2) * $itadj;
+ }
+ elsif ($chht{$char} > 1.15 * $xheight) {
+ if ($char =~ /$supacc$/ and $char !~ /under$supacc$/) {
+ $v += $v1; # double accents
+ $it = $v1 * $itadj;
+ }
+ else {
+ $v += $v2; # accented caps etc.
+ $it = $v2 * $itadj;
+ }
+ }
+ else { $it = 0 }
+ if ($v > $maxht) { $maxht = $v }
+ $astr .= "$v ;\n";
+ $metrics_enc[$num] = $astr;
+ $v -= $chht{$acc};
+ $h = round(($chwd{$char} - $chwd{$acc}) / 2 + $chls{$acc} - $it);
+ unless (defined $hend{$char}) { findend($char, $chstrings{$char}) }
+ $H = $h - $hend{$char} - $chls{$char};
+ $V = $v - $vend{$char};
+ $chstrings{$char} =~ /^\/$char {\n(\t.+?hsbw\n(.|\n)*?)\tendchar\n\t} $rend\n/m;
+ $chdef = $1;
+ $chstrings{$acc} =~ /^\/$acc {\n\t.+? .+?hsbw\n((.|\n)+?\t} $rend\n)/m;
+ $acdef = $1;
+ $acdef = fixhints($nchar, $acc, $acdef, $h, $v);
+ $pstr = "/$nchar {\n$chdef % $nchar: start of $acc\n";
+ $pstr .= "\t$H $V rmoveto\n$acdef";
+ if ($cb) { # candrabindu
+ getcharinfo("dotaccent") unless defined $chwd{dotaccent};
+ $h = round(($chwd{$char} - $chwd{dotaccent}) / 2 + $chls{dotaccent} - $it);
+ $h += $cbx;
+ $v += $cby;
+ $cb = fixhints($nchar, "dotaccent", $cb, $h, $v);
+ $newchar = $char . $acc;
+ unless (defined $hend{$newchar}) { findend($newchar, $pstr) }
+ $H = $h - $hend{$newchar} - $chls{$char};
+ $V = $v - $vend{$newchar};
+ $pstr =~ s/\tendchar\n\t} $rend\n\Z//m;
+ $pstr .= " % $nchar: start of dotaccent\n\t$H $V rmoveto\n$cb";
+ }
+$chstrings{$nchar} = $pstr;
+}
+
+sub underacc {
+ #
+ # Dropped accents
+ #
+ # The Fontographer hack below is necessary because Fontographer (which
+ # I have had to use to build TrueType and Macintosh versions of fonts)
+ # seems not to respect the depths for characters specified in afm files
+ # it has imported: it sets the depth to the lowest point in the path,
+ # whether or not a mark was made there. So it is not possible to
+ # implement (e.g.) underring by diving down low and then printing a
+ # ring at its normal height.
+ #
+ my ($num, $char, $acc, $nchar) = @_;
+ my ($old, $acname, $astr, $h, $v, $H, $V, $chdef, $acdef, $begin, $line, $end, $pstr);
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ $acc =~ s/^under//;
+ $acname = $acc;
+ if ($acc eq "dot") { $acc = "period" }
+ if ($acc eq "candrabindu") { die "Bad definition (no such accent): $qdef\n" }
+ getcharinfo($char) unless defined $chwd{$char};
+ getcharinfo($acc) unless defined $chwd{$acc};
+ if ($acc =~ /^$supacc$/) {
+ $v = round($underadp + ($chdp{$acc} - $accdepth) * $shrink);
+ }
+ else { $v = $underddp + $chdp{$acc} }
+ if ($v < $maxdp) { $maxdp = $v }
+ $astr = "C $num ; WX $chwd{$char} ; N $nchar ; B $chls{$char} ";
+ $astr .= "$v $chrs{$char} $chht{$char} ;\n";
+ $metrics_enc[$num] = $astr;
+ if ($acc =~ /^$supacc$/) {
+ $h = round(($chwd{$char} - ($chwd{$acc} * $shrink)) / 2
+ + $chls{$acc} * $shrink - ($v - $accdepth * $shrink) * $itadj);
+ }
+ else {
+ $h = round(($chwd{$char} - $chwd{$acc}) / 2 + $chls{$acc} - $v * $itadj);
+ }
+ unless (defined $hend{$char}) { findend($char, $chstrings{$char}) }
+ $H = $h - $hend{$char} - $chls{$char};
+ if ($acc =~ /^$supacc$/) { $V = $underadp - $vend{$char} }
+ else { $V = $v - $chdp{$acc} - $vend{$char} }
+ #
+ # Adjustment for smaller, therefore lower, shrunken accent defs
+ #
+ if ($acc =~ /^$supacc$/) {
+ $V += round($chdp{$acc} * (1 - $shrink) / $shrink);
+ }
+ $chstrings{$char} =~ /^\/$char {\n(\t.+?hsbw\n(.|\n)*?)\tendchar\n\t} $rend\n/m;
+ $chdef = $1;
+ $chstrings{$acc} =~ /^\/$acc {\n\t.+? .+?hsbw\n((.|\n)+?\t} $rend\n)/m;
+ $acdef = $1;
+ if ($acc =~ /^$supacc$/ and $opt_s) { $acdef = fixshrink($acc, $acdef) }
+ if ($acc =~ /^$supacc$/) {
+ $acdef = fixhints($nchar, $acc, $acdef, $h, $underadp);
+ }
+ else { $acdef = fixhints($nchar, $acc, $acdef, $h, $underddp) }
+ #
+ # Bloody Fontographer! We can't just say
+ # if ($acc =~ /^$supacc$/) { $V -= $accdepth }
+ # Instead we have to go through the following rigmarole:
+ #
+ if ($acc =~ /^$supacc$/) {
+ if ($acdef =~ /^(.*moveto)$/m) {
+ ($begin, $line, $end) = ($`, $1, $');
+ if ($line =~ /^\t(-?\d+) (-?\d+)( rmoveto)$/) {
+ $acdef = "$begin\t$1 " . ($2 - $accdepth) . $3 . $end;
+ }
+ elsif ($line =~ /^\t(-?\d+)( vmoveto)$/) {
+ $acdef = "$begin\t" . ($1 - $accdepth) . $2 . $end;
+ }
+ elsif ($line =~ /\t(-?\d+) hmoveto$/) {
+ $acdef = "$begin\t$1 " . (-$accdepth) . "rmoveto" . $end;
+ }
+ }
+ else { $acdef =~ s/\A/\t-$accdepth vmoveto\n/m }
+ }
+ $pstr = "/$nchar {\n$chdef % $nchar: start of $acname\n";
+ $pstr .= "\t$H $V rmoveto\n$acdef";
+ $chstrings{$nchar} = $pstr;
+}
+
+sub underb {
+ #
+ # Underbar
+ #
+ my ($num, $char, $nchar) = @_;
+ my ($old, $astr, $l, $h, $v, $H, $V, $bdef, $chdef, $acdef, $pstr);
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ $v = $underbdp + $thk;
+ getcharinfo($char) unless defined $chwd{$char};
+ $h = round(0.1 * $chwd{$char} - $underbdp * $itadj);
+ $l = round(0.8 * $chwd{$char});
+ $astr = "C $num ; WX $chwd{$char} ; N $nchar ; B $chls{$char} ";
+ $astr .= "$underbdp $chrs{$char} $chht{$char} ;\n";
+ $metrics_enc[$num] = $astr;
+ unless (defined $hend{$char}) { findend($char, $chstrings{$char}) }
+ $H = $h - $hend{$char} - $chls{$char};
+ $V = -$vend{$char};
+ $bdef = "\t$underbdp $thk hstem\n\t$v vmoveto\n\t-$thk vlineto\n\t";
+ $bdef .= "$l hlineto\n\t$thk vlineto\n\tclosepath\n";
+ $chstrings{$char} =~ /^\/$char {\n(\t.+?hsbw\n(.|\n)*?)\tendchar\n\t} $rend\n/m;
+ $chdef = $1;
+ $acdef = fixhints($nchar, "underbar", $bdef, $h, 0);
+ $pstr = "/$nchar {\n$chdef % $nchar: start of $acc\n";
+ $pstr .= "\t$H $V rmoveto\n$acdef\tendchar\n\t} $nd\n";
+ $chstrings{$nchar} = $pstr;
+}
+
+sub digraph {
+ #
+ # Make a new character consisting of two existing characters
+ #
+ my ($num, $char, $acc, $nchar) = @_;
+ my ($old, $kern, $w, $newrs, $astr, $H, $V, $chdef, $acdef, $pstr);
+ ($old = $metrics_enc[$num]) =~ s/^C $num/C -1/;
+ $metrics_unenc .= $old unless $metrics_unenc =~ /$old/m;
+ getcharinfo($char) unless defined $chwd{$char};
+ getcharinfo($acc) unless defined $chwd{$acc};
+ if ($kdefs =~ /^KPX $char $acc (-?\d+)$/m) { $kern = $1 };
+ $w = $chwd{$char} + $chwd{$acc} + $kern;
+ $newrs = $chrs{$char} + $chwd{$acc} + $kern;
+ if ($newrs > $maxrs) { $maxrs = $newrs }
+ $astr = "C $num ; WX " . $w . " ; N $nchar ; B $chls{$char} ";
+ $astr .= (min($chdp{$char}, $chdp{$acc})) . " $newrs ";
+ $astr .= (max($chht{$char}, $chht{$acc})) . " ;\n";
+ $metrics_enc[$num] = $astr;
+ unless (defined $hend{$char}) { findend($char, $chstrings{$char}) }
+ $H = $chwd{$char} + $chls{$acc} + $kern - $hend{$char};
+ $V = -$vend{$char};
+ $chstrings{$char} =~ /^\/$char {\n(\t.+?hsbw\n(.|\n)*?)\tendchar\n\t} $rend\n/m;
+ ($chdef = $1) =~ s/-?\d+( hsbw\n)/$w$1/m;
+ $chstrings{$acc} =~ /^\/$acc {\n\t.+? .+?hsbw\n((.|\n)+?\t} $rend\n)/m;
+ $acdef = $1;
+ $acdef = fixhints($nchar, $acc, $acdef, ($chwd{$char} + $kern), 0);
+ $pstr = "/$nchar {\n$chdef % $nchar: start of $acc\n";
+ $pstr .= "\t$H $V rmoveto\n$acdef";
+ $chstrings{$nchar} = $pstr;
+}
+
+sub max {
+ #
+ # Return greater of two values
+ #
+ my ($a, $b) = @_;
+ return $a > $b ? $a : $b;
+}
+
+sub min {
+ #
+ # Return lesser of two values
+ #
+ my ($a, $b) = @_;
+ return $a > $b ? $b : $a;
+}
+
+sub round {
+ #
+ # Return nearest integer value
+ #
+ my ($num) = shift;
+ my $n1, $n2;
+ if ($num < 0) { $n1 = (0 - $num) }
+ else { $n1 = $num }
+ $n2 = int($n1);
+ if (($n1 - $n2) >= 0.5) { $n2++ }
+ if ($num < 0) { return (0 - $n2) }
+ else { return $n2 }
+}
+
+sub getcharinfo {
+ #
+ # Store character metric information
+ #
+ my $char = shift;
+ my $foundit;
+ my $metrics_all = join("", @metrics_enc) . $metrics_unenc;
+ if ($metrics_all =~ /^.* ; N $char ; .*$/m) { $foundit = $& }
+ else { die "Bad definition (no such character/accent): $char\n" }
+ $foundit =~ /^C (-?\d+) ; WX (\d+) ; N $char ; B (.+?) (.+?) (.+?) (.+?) ;/;
+ ($chnum{$char}, $chwd{$char}, $chls{$char},
+ $chdp{$char}, $chrs{$char}, $chht{$char}) = ($1, $2, $3, $4, $5, $6);
+}
+
+sub fixkerns {
+ #
+ # Generalise the kerning info contained in the afm file by applying
+ # it to new accented chars. Do not kern lower-case chars bearing
+ # superscript accents with capitals, quotes or a preceding "f".
+ #
+ my ($char, $acc) = @_;
+ my ($lchar, $rchar);
+ if ($acc =~ /^$accents$/) { $lchar = $rchar = $char }
+ else {
+ $lchar = $char;
+ $rchar = $acc;
+ }
+ if ($char =~ /^[a-z]/ and $acc =~ /^$supacc$/) {
+ if ($kdefs =~ /^(KPX $char)(( (?:[a-pr-z][a-zA-Z]*|q(?!uote).*?) )-?\d+)$/m) {
+ ($one, $three) = ($1, $3);
+ $kdefs =~ s[^(KPX $char)(( (?:[a-pr-z][a-zA-Z]*|q(?!uote).*?) )-?\d+)$]
+ [$&\n$1$acc$2]gm
+ unless $kdefs =~ /^$one$acc$three/m;
+ }
+ if ($kdefs =~ /^(KPX (?:[a-eg-pr-z][a-zA-Z]*|q(?!uote).*?) $char)( -?\d+)$/m) {
+ $one = $1;
+ $kdefs =~ s[^(KPX (?:[a-eg-pr-z][a-zA-Z]*|q(?!uote).*?) $char)( -?\d+)$]
+ [$&\n$1$acc$2]gm
+ unless $kdefs =~ /^$one$acc /m;
+ }
+ }
+ else {
+ if ($kdefs =~ /^(KPX )$rchar(( [a-zA-Z]+ )-?\d+)$/m) {
+ ($one, $three) = ($1, $3);
+ $kdefs =~ s[^(KPX )$rchar(( [a-zA-Z]+ )-?\d+)$]
+ [$&\n$1$char$acc$2]gm
+ unless $kdefs =~ /^$one$char$acc$three/m;
+ }
+ if ($kdefs =~ /^(KPX [a-zA-Z]+ )$char( -?\d+)$/m) {
+ $one = $1;
+ $kdefs =~ s[^(KPX [a-zA-Z]+ )$char( -?\d+)$]
+ [$&\n$1$char$acc$2]gm
+ unless $kdefs =~ /^$one$char$acc /m;
+ }
+ }
+}
+
+sub fixshrink {
+ #
+ # Multiply all coordinates in a character definition by $shrink,
+ # creating new subroutines as necessary.
+ #
+ my ($ch, $chdef) = @_;
+ my (@chdef, $line, $snum, $subrdef);
+ @chdef = split(/\n/, $chdef);
+ $chdef = "";
+ foreach $line (@chdef) {
+ if ($line =~ /^\t(\d+) .*call(other)?subr$/) {
+ $snum = $1;
+ $subrdef = $subrs[$snum];
+ $subrdef = fixshrink($ch, $subrdef);
+ $subrdef =~ s/^(dup )$snum \{$/$1$subrsnum {\n % $nchar: shrink $ch/m;
+ $subrs[$subrsnum] = $subrdef;
+ $line =~ s/^\t$snum/\t$subrsnum/;
+ $subrsnum++;
+ }
+ else { $line =~ s/-?\d+/int($& * $shrink)/ge unless $line =~ /^dup / }
+ $chdef .= "$line\n";
+ }
+ return $chdef;
+}
+
+sub fixhints {
+ #
+ # First adjust any Flex "0 callsubr" lines for horizontal and
+ # vertical offset. Then collect the hints from the accent definition,
+ # remove them, adjust for horizontal and vertical offset, and
+ # place them in a numbered subroutine. Have the definition call
+ # the subroutine.
+ #
+ my ($nchar, $acc, $acdef, $h, $v) = @_;
+ my $subrdef;
+ $acdef =~ s[^(\t-?\d+ )(-?\d+) (-?\d+)( 0 callsubr)$]
+ [$1 . ($2 + $h) . " " . ($3 + $v) . $4]gme;
+ if ($subrdef = join("\n", grep /^\t.*[hv]stem$/, split(/\n/, $acdef))) {
+ $acdef = join("\n", grep !/^\t.*[hv]stem$/, split(/\n/, $acdef)) . "\n";
+ }
+ elsif ($acdef =~ s/\A(?:\t(\d+) callsubr\n)((?:.|\n)*)\Z/$2/m) {
+ $subrdef = $subrs[$1];
+ $subrdef = join("\n", grep /^\t.*[hv]stem$/, split(/\n/, $subrdef))
+ }
+ $subrdef =~ s/^(\t)(-?\d+)( .*hstem)$/$1 . ($2 + $v) . $3/gme;
+ $subrdef =~ s/^(\t)(-?\d+)( .*vstem)$/$1 . ($2 + $h) . $3/gme;
+ if ($subrdef) {
+ $subrs[$subrsnum] = "dup $subrsnum {\n % $nchar: hints for $acc\n";
+ $subrs[$subrsnum] .= "$subrdef\n\treturn\n\t} $np\n";
+ $acdef = "\t$subrsnum 1 3 callothersubr\n\tpop\n\tcallsubr\n" . $acdef;
+ $subrsnum++;
+ }
+ return $acdef;
+}
+
+sub findend {
+ #
+ # Calculate the current point reached at the end of the character
+ # definition. Place the horizontal offset in $hend{$char}, the
+ # vertical offset in $vend{$char}.
+ #
+ my ($char, $def) = @_;
+ my $line;
+ foreach $line (split /\n/, $def) {
+ SWITCH: {
+ $line =~ /^\t(-?\d+) h(line|move)to$/
+ && do {
+ $hend{$char} += $1;
+ last SWITCH;
+ };
+ $line =~ /^\t(-?\d+) v(line|move)to$/
+ && do {
+ $vend{$char} += $1;
+ last SWITCH;
+ };
+ $line =~ /^\t(-?\d+) (-?\d+) r(line|move)to$/
+ && do {
+ $hend{$char} += $1;
+ $vend{$char} += $2;
+ last SWITCH;
+ };
+ $line =~ /^\t(-?\d+) (-?\d+) (-?\d+) (-?\d+) hvcurveto$/
+ && do {
+ $hend{$char} += ($1 + $2);
+ $vend{$char} += ($3 + $4);
+ last SWITCH;
+ };
+ $line =~ /^\t(-?\d+) (-?\d+) (-?\d+) (-?\d+) vhcurveto$/
+ && do {
+ $hend{$char} += ($2 + $4);
+ $vend{$char} += ($1 + $3);
+ last SWITCH;
+ };
+ $line =~ /^\t(-?\d+) (-?\d+) (-?\d+) (-?\d+) (-?\d+) (-?\d+) rrcurveto$/
+ && do {
+ $hend{$char} += ($1 + $3 + $5);
+ $vend{$char} += ($2 + $4 + $6);
+ last SWITCH;
+ };
+ $line =~ /^\t(\d+) callsubr$/
+ && do {
+ findend($char, $subrs[$1]);
+ last SWITCH;
+ };
+ $line =~ /^\t-?\d+ (-?\d+) (-?\d+) 0 callsubr$/ # Flex
+ && do {
+ $hend{$char} = $1;
+ $vend{$char} = $2;
+ last SWITCH;
+ };
+ }
+ }
+}
diff --git a/fonts/utilities/accfonts/vpl2ovp b/fonts/utilities/accfonts/vpl2ovp
new file mode 100755
index 0000000000..eb88bfd3dd
--- /dev/null
+++ b/fonts/utilities/accfonts/vpl2ovp
@@ -0,0 +1,1085 @@
+#!/usr/bin/perl
+
+# Vpl2ovp: a program to generate accented virtual fonts for Omega
+# Copyright (C) 2008 John D. Smith
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$version = 0.25;
+#------------------------------------------------------------------------#
+$description =
+"Syntax: vpl2ovp -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2ovp creates new Omega virtual fonts based on existing TeX
+fonts or virtual fonts (\"input fonts\"). A successful run will
+read a pl (Property List) or vpl (Virtual Property List) file
+and a definition file, and will generate a new ovp (Omega
+Virtual Property List) file on standard output. The input font
+is assumed to adhere to the standard TeX encoding for text
+fonts unless it was created with either of the programs afm2pl
+or afm2tfm, in which case it is assumed to conform to
+(respectively) the Adobe Standard Encoding or the encoding
+specified in the file dvips.enc. In either case, the name of
+the input font is assumed to be the name of the input file
+without its .vpl or .pl extension: it must conform to normal
+TeX conventions for naming fonts, as vpl2ovp attempts to draw
+conclusions from it about the kind of font it is dealing with.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2ovp -d Unicode1.def cmr10.pl >cmr10-uni1.ovp
+ ovp2ovf cmr10-uni1.ovp cmr10-uni1.ovf cmr10-uni1.ofm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2ovp -d Unicode1.def rptmr.pl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2ovp -d Unicode1.def ptmr.vpl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole of the character range \"F0-\"FF free for
+the requirements of the encoding specified in the definition file,
+certain modifications are made to input fonts following the dvips.enc
+encoding to bring them into greater conformity with the TeX norm. In
+particular, the characters dotaccent and hungarumlaut are placed in
+the positions assigned by TeX (\"5F, \"7D), not those enforced by
+dvips.enc (\"C7, \"CD). The f-ligatures, double quotes and dashes are
+also moved from the upper half of the original 8-bit character set to
+their normal TeX positions. As a result, the following characters are
+not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., \"Unicode1.def\") should consist of
+ lines of character definitions, in the form
+ \"number\" \"character\"
+ or
+ \"number\" \"character\" \"accent\"
+ Here \"number\" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ \"character\" names the character (e.g. \"comma\", \"eight\",
+ \"A\") or consists of the word \".notdef\" (indicating that
+ the specified number's \"slot\" in the new encoding is to be
+ empty); and \"accent\" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, \"underbar\" and \"underdot\" are also
+ available, as are \"under\" versions of all the normal
+ superscript accents (\"underdieresis\", \"underring\", etc.).
+ The Indian accent \"candrabindu\" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ \"overdot\" may be used as a synonym for \"dotaccent\".
+
+ Note that all accents used in defining accented characters must
+ themselves be defined in the .def file. Those which exist in the
+ source font should simply be referenced by name in their
+ appropriate Unicode position (e.g. \"0x0304 macron\"); those
+ which do not should be defined as the character \"space\"
+ followed by the name of the accent (e.g. \"0x0310 space
+ candrabindu\").
+
+ If the character named in the \"accent\" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the \"character\" and the
+ \"accent\". A digraph consisting of, say, \"k\" and \"h\" will be
+ indistinguishable from the letters \"k\" and \"h\" printed
+ consecutively, but the digraph \"kh\" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as \"amacron\" or \"kh\") may be freely
+ used in the \"character\" position of a further definition (such
+ as \"amacron breve\" or \"kh underbar\"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of \"a macron\" does not have to precede that of
+ \"amacron breve\": requests for \"impossible\" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ \"Slots\" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by \"\#\").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ \"DESIGNUNITS R 1000\" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2ovp to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2ovp's views
+ on where accents should be placed.
+
+ -h prints this help.
+";
+#------------------------------------------------------------------------#
+
+########################
+# Packages and constants
+########################
+#
+use File::Basename;
+use Getopt::Std;
+$cmdline = basename($0) . " " . join " ", @ARGV;
+getopts('d:s:c:bh');
+if ($opt_h or !$opt_d or $#ARGV != 0) {
+ print STDERR $description;
+ exit 1;
+}
+
+$filename = $ARGV[0];
+$dummycodepoint = 0xF8FF;
+($fontname = $filename) =~ s/\..*$//;
+($encname = basename($opt_d)) =~ s/\..*$//;
+$vtitle = "(VTITLE Font $fontname modified for $encname encoding by vpl2ovp";
+$vtitle .= " v. $version" if $version;
+$vtitle .= ")\n(COMMENT Command line: $cmdline)";
+$vtitle .= "\n(OFMLEVEL H 0)";
+
+#
+# Flags for bold and small caps. These are probably a bit iffy, but
+# there's not much that can be done about it.
+#
+if ($fontname =~ /(^p.*b[oi]?[c]?$|^[^p].*bx[a-z]*[0-9]+$)/) { $bold = 1 }
+if ($fontname =~ /(^p.*c$|^[^p].*csc[a-z]*[0-9]+$)/) { $scaps = 1 }
+if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
+
+#
+# Array to convert from number to vpl representation
+#
+foreach $i (0 .. 0xFFFF) {
+ $nv[$i] = (chr($i) =~ /[0-9A-Za-z]/ ? "C " . chr $i : sprintf("H %04lX", $i));
+}
+
+#
+# Now the encoding vectors.
+#
+@TeXenc = (
+ "Gamma", "Delta", "Theta", "Lambda",
+ "Xi", "Pi", "Sigma", "Upsilon",
+ "Phi", "Psi", "Omega", "ff",
+ "fi", "fl", "ffi", "ffl",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedblright", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "exclamdown", "equal", "questiondown", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "quotedblleft", "bracketright", "circumflex", "dotaccent",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "endash",
+ "emdash", "hungarumlaut", "tilde", "dieresis"
+);
+
+@dvipsenc = (
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "quotesingle", "exclamdown", "questiondown",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "circumflex", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "tilde", "dieresis",
+ "asciicircum", "asciitilde", "Ccedilla", "Iacute",
+ "Icircumflex", "atilde", "edieresis", "egrave",
+ "scaron", "zcaron", "Eth", "ff",
+ "ffi", "ffl", ".notdef", ".notdef",
+ ".notdef", ".notdef", "Scaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Ydieresis", ".notdef", "Zcaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "copyright", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ "degree", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", ".notdef",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", ".notdef", "dotaccent",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "hungarumlaut", "ogonek", "Idieresis",
+ "emdash", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", ".notdef",
+ ".notdef", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", ".notdef",
+ "agrave", "aacute", "acircumflex", "ordfeminine",
+ "adieresis", "aring", ".notdef", "ccedilla",
+ "Lslash", "eacute", "ecircumflex", "ordmasculine",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ ".notdef", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", ".notdef",
+ "lslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+);
+
+@adobeenc=(
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+);
+
+###############
+# Read DEF file
+###############
+#
+open DEF, $opt_d or die "Cannot open $opt_d: $!\n";
+while (<DEF>) {
+ next if (/^\s*$/ || /^\#/);
+ s/\s*(\#.*)?$//;
+ push @deflines, $_;
+}
+close DEF;
+
+###############
+# Read VPL file
+###############
+#
+# File header
+#
+$vplhead = <> or exit 1;
+unless ($vplhead =~ /^\((VTITLE|FAMILY) /) {
+ die "$filename is not a vpl file: giving up\n"
+}
+do {
+ $_ = <>;
+ $vplhead .= $_;
+} until ($_ =~ /^\(LIGTABLE$/ or eof);
+if (eof) {
+ die "$filename does not seem to be a text font (no LIGTABLE): giving up\n";
+}
+if ($vplhead =~ s/\A\(VTITLE(.*)$/$vtitle\n(COMMENT Old vtitle:$1/m) {
+ $vplhead =~ s/\n\(COMMENT Please edit that VTITLE .*\)$//m;
+ @enc = @dvipsenc;
+ $dvips = 1;
+}
+elsif ($vplhead =~ /\A\(FAMILY.*\)\n\(CODINGSCHEME ADOBESTANDARDENCODING\)$/m) {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @adobeenc;
+ $dvips = 0;
+}
+else {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @TeXenc;
+ $dvips = 0;
+}
+if ($vplhead =~ /^\(CODINGSCHEME TEX MATH SYMBOLS/m) {
+ die "$filename is a TeX math font: giving up\n";
+}
+unless ($vplhead =~ s/^(\(CODINGSCHEME .*\+\s?)(\S+)\)$/$1$encname)/m) {
+ $vplhead =~ s/^(\(CODINGSCHEME .*)\)$/$1 + $encname)/m;
+}
+if ($vplhead =~ s/^\(DESIGNUNITS R (.+)\)\n//m) { $scale = $1 }
+else { $scale = 1 }
+$vplhead =~ s/^\(COMMENT.*DESIGNSIZE.*\)\n//gm;
+$vplhead =~ s/^\(BOUNDARYCHAR.*\)\n//gm;
+if ($vplhead =~ /^ \(SLANT R (.+)\)/m) { $slant = $1 }
+if ($vplhead =~ /^ \(XHEIGHT [DR] (.+)\)/m) { $xheight = $1 }
+unless ($vplhead =~ /^\(MAPFONT /m) {
+ if ($vplhead =~ /^\(DESIGNSIZE R (.*)\)$/m) { $dsize = $1 *$scale }
+ $mapfont = "\n(MAPFONT D 0\n (FONTNAME $fontname)\n (FONTDSIZE R $dsize)\n )";
+ $vplhead =~ s/\n\(LIGTABLE\Z/$mapfont$&/m;
+}
+$vplhead =~ s/^(\(FONTDIMEN)/(SEVENBITSAFEFLAG FALSE)\n$1/m;
+if ($opt_s) {
+ $vplhead =~ s[^(\(MAPFONT D )0(.*?)( \))]
+ [$&\n${1}1$2 (FONTAT R ${ \($shrink * $scale) })\n$3]ms;
+}
+@vplhead = split /^/, $vplhead;
+foreach (@vplhead) {
+ s[(?<!(IGNSIZE|MAPFONT)) [RD] (-?)([0-9.]+)\)]
+ [" R " . $2 . $3/$scale . ")"]ge
+}
+
+#
+# Ligatures and kerns
+#
+do {
+ $_ = <>;
+ s/ \(comment .*$//i;
+ s/^( \((?:LABEL|KRN) )O ([0-7]+)(.*)$/$1 . sprintf("H %04lX", oct $2) . $3/e;
+if (/ \(LIG /) {
+ s/O ([0-7]+)/sprintf("H %04lX", oct $1)/ge;
+ }
+ $ligs .= $_;
+} until $_ =~ /^ \)/;
+#
+# Now build a hash to convert from vpl representation to char name
+# and use it to make ligtable readable
+#
+foreach $i (0 .. 255) { $vc{$nv[$i]} = $enc[$i] }
+$ligs =~ s/^( \((?:LABEL|KRN) )(\S+ \S+)(.*\))$/$1$vc{$2}$3/gm;
+$ligs =~ s/^( \(LIG )(\S+ \S+) (\S+ \S+)\)$/$1$vc{$2} $vc{$3})/gm;
+#
+# Character definitions: store "encoded" defs in @chars, store *all*
+# defs in %allchars
+#
+$_ = <>;
+do {
+ if (/^\(CHARACTER/) {
+ $character = $_;
+ do {
+ $_ = <>;
+ $character .= $_;
+ } until $_ =~ /^ \)/;
+ storeinfo($character);
+ $_ = <>;
+ }
+} until eof;
+foreach $i (0 .. $#chars) {
+ if ($chars[$i] and $enc[$i] ne ".notdef") {
+ $allchars{$enc[$i]} = $chars[$i];
+ }
+}
+
+##################
+# Set up constants
+##################
+
+$subacc = "(cedilla|ogonek|commaaccent)";
+$supacc = "(grave|acute|circumflex|tilde|macron|breve|dotaccent|overdot|dieresis|ring|hungarumlaut|caron|candrabindu)";
+$underacc = "(underdot|under$supacc)";
+$accents = "($subacc|$supacc|$underacc|underbar)";
+$underadp = 0.230; # depth of "under" accs
+$underddp = 0.213; # depth of underdot
+if ($bold) { $thk = 0.072 } else { $thk = 0.052 } # thickness and
+$underbdp = 0.082 + $thk; # depth of underbar
+$capheight = $allchars{"X"}{ht};
+$accheight = $allchars{"macron"}{ht};
+$accdepth = $accheight - $thk * $scale; # probable approx. "depth" of macron
+$v1 = $accheight - $xheight; # vertical offset for double accents
+$v2 = $capheight - $xheight; # vertical offset for accented caps etc
+if ($scaps) { # accented small caps
+ $scoffset = $allchars{"x"}{ht} - $xheight;
+ $v1 += $scoffset;
+}
+if ($opt_c) { # candrabindu
+ ($cbx, $cby) = $opt_c =~ /^(.*),(.*)$/;
+ $cbx += ($allchars{"breve"}{wd} - $allchars{"dotaccent"}{wd}) / 2;
+ $cbx /= 1000;
+ $cby /= 1000;
+}
+
+######################
+# Build the characters
+######################
+#
+# First normalise dvips.enc encoding quirks
+#
+if ($dvips) {
+ chmove("fi", 014);
+ chmove("fl", 015);
+ chmove("quotedblright", 042);
+ chmove("quotedblleft", 0134);
+ chmove("dotaccent", 0137);
+ chmove("endash", 0173);
+ chmove("emdash", 0174);
+ chmove("hungarumlaut", 0175);
+}
+#
+# Now build a list of definitions supplied by user
+#
+for (@deflines) {
+ if (/^\s*(\d+|0[0-7]+|0x[0-9a-fA-F]+)\s+([a-zA-Z]+?|\.notdef)(?:\s+([a-zA-Z]+))?$/) {
+ ($num, $char, $acc) = ($1, $2, $3);
+ $num = oct $num if $num =~ /^0/;
+ if ($num > 0xFFFF) { die "Bad definition (number out of range): $_\n" }
+ $def = {};
+ $def->{qdef} = $_;
+ $def->{num} = $num;
+ $def->{char} = $char;
+ $def->{acc} = $acc;
+ if ($char eq "space") { $def->{nchar} = $acc }
+ else { $def->{nchar} = $char . $acc }
+ push @nchars, $def->{nchar};
+ push @defs, $def;
+ }
+ else { die "Bad definition: $_\n" }
+}
+#
+# Work through the list
+#
+while (@defs) {
+ $def = shift @defs;
+ $qdef = $def->{qdef};
+ $num = $def->{num};
+ $char = $def->{char};
+ $acc = $def->{acc};
+ $nchar = $def->{nchar};
+ #
+ # If we can't handle $char/$acc yet, but believe we will be able
+ # to later, send the definition to the back of the queue. In case
+ # it later turns out we were wrong, allow only five loops before
+ # giving up.
+ #
+ if (!$allchars{$char} and $char ne ".notdef") {
+ if (grep /^$char$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such character): $qdef\n" }
+ }
+ if ($acc and !$allchars{$acc} and $acc !~ /^$accents$/) {
+ if (grep /^$acc$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such accent): $qdef\n" }
+ }
+ #
+ # Remove any existing claims on $num
+ #
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ #
+ # First deal with .notdef
+ #
+ if ($nchar eq ".notdef") {
+ undef $chars[$num];
+ }
+ #
+ # Next look among existing chars (unless blocked by -b)
+ #
+ elsif (!($acc and $opt_b) and $allchars{$nchar}) {
+ push( @{ $allchars{$nchar}{num} }, $num);
+ $chars[$num] = $allchars{$nchar};
+ }
+ #
+ # If it can't be built from sub-elements, issue a warning and move on
+ #
+ elsif (!$acc) {
+ warn "No such character - ignoring definition: $qdef\n";
+ undef $chars[$num];
+ }
+ #
+ # Now build the char
+ #
+ else {
+ #
+ # First get rid of predefined/duplicated ligtable statements
+ # and character definitions; also synonyms
+ #
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar .*|.*$nchar)\)$//gm;
+ $allchars{$nchar} = ();
+ if ($acc eq "overdot") {
+ $nchar2 = $char . "dotaccent";
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar2 .*|.*$nchar2)\)$//gm;
+ delete $allchars{$nchar2};
+ }
+ #
+ # Store the info that will be needed to have the character
+ # linked into the LIGTABLE
+ #
+ push @newligs, "$char: (LIG $acc $nchar)";
+ #
+ # Go!
+ #
+ if ($acc =~ /^$subacc$/) {
+ subacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$supacc$/) {
+ supacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$underacc$/) {
+ underacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^underbar$/) {
+ underb($num, $char, $nchar);
+ fixkerns($char, $acc);
+ }
+ else {
+ digraph($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ }
+}
+
+###################
+# Sort out ligtable
+###################
+#
+# Pull in the newly created ligatures
+#
+foreach $newlig (@newligs) {
+ $newlig =~ s/^(.+)://;
+ $newelm1 = $1;
+ unless ($ligs =~ s/(^ \(LABEL $newelm1\)\n)/$1$newlig\n/m) {
+ $ligs =~ s[^( \)\n)]
+ [ \(LABEL $newelm1\)\n$newlig\n \(STOP\)\n$1]m
+ }
+}
+#
+# Convert to vpl representation, eliminating statements invoking
+# "unencoded" characters
+#
+@liglist = split /\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^( \(LIG \S+ )(\S+)\)$/) {
+ if ($n = ${ $allchars{$2}{num} }[0]) {
+ s/^( \(LIG \S+ )(\S+)\)$/$1$nv[$n])/;
+ }
+ else { next }
+ }
+ if (/^( \((?:LABEL|LIG|KRN) )([^ )]+)(.*)$/) {
+ ($one, $two, $three) = ($1, $2, $3);
+ foreach $n (@{ $allchars{$two}{num} }) {
+ $ligs .= "$one$nv[$n]$three\n";
+ }
+ }
+ else { $ligs .= "$_\n" }
+}
+#
+# Eliminate sequences orphaned by elimination of a LABEL
+#
+@liglist = split / \(STOP\)\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^ \(LABEL /m) { $ligs .= "$_ (STOP)\n" }
+ elsif (/^ \)$/m) { $ligs .= $_ }
+}
+#
+# Eliminate empty statements
+#
+$ligs =~ s/(^ \(LABEL .*\)\n)+ \(STOP\)\n//gm;
+@ligs = split /^/, $ligs;
+foreach (@ligs) {
+ s/ [RD] (-?)([0-9.]+)\)/" R " . $1 . $2\/$scale . ")"/ge
+}
+
+####################
+# Output the results
+####################
+#
+print @vplhead, @ligs;
+foreach $i (0 .. 0xFFFF) { if (defined $chars[$i]{id}) { printchar($i) } }
+
+#####################
+# End of main program
+#####################
+
+sub storeinfo {
+ #
+ # Extract info from a character definition and store it in @chars
+ #
+ my $char = shift;
+ my $num;
+ if ($char =~ /\A\(CHARACTER O ([0-7]+)/m) { $num = oct $1 }
+ elsif ($char =~ /\A\(CHARACTER C (.)/m) { $num = ord $1 }
+ $chars[$num]{id} = $enc[$num];
+ push( @{ $chars[$num]{num} }, $num);
+ if ($char =~ /^ \(CHARWD R (.*?)\)$/m) { $chars[$num]{wd} = $1 }
+ if ($char =~ /^ \(CHARHT R (.*?)\)$/m) { $chars[$num]{ht} = $1 }
+ if ($char =~ /^ \(CHARDP R (.*?)\)$/m) { $chars[$num]{dp} = $1 }
+ if ($char =~ /^ \(CHARIC R (.*?)\)$/m) { $chars[$num]{ic} = $1 }
+ if ($char =~ /^ \(MAP\n((.|\n)*)^ \)/m) { $chars[$num]{map} = $1 }
+ else { $chars[$num]{map} = " (SETCHAR $nv[$num])\n" }
+ $chars[$num]{map} =~ s[(\(SETCHAR )O ([0-7]+)\)]
+ [$1 . sprintf("H %04lX", oct $2) . ")"]gme
+}
+
+sub printchar {
+ #
+ # Extract info from @chars and build it into a character definition
+ #
+ my $num = shift;
+ my @ch;
+ push @ch, "(CHARACTER ";
+ if (chr($num) =~ /[0-9A-Za-z]/) { push @ch, "C " . chr($num) }
+ else {
+ push @ch, sprintf("H %04lX", $num);
+ push @ch, " (COMMENT " . $chars[$num]{id} . ")";
+ }
+ push @ch, "\n";
+ push @ch, " (CHARWD R " . $chars[$num]{wd} . ")\n"
+ if defined $chars[$num]{wd};
+ push @ch, " (CHARHT R " . $chars[$num]{ht} . ")\n"
+ if defined $chars[$num]{ht};
+ push @ch, " (CHARDP R " . $chars[$num]{dp} . ")\n" if $chars[$num]{dp};
+ push @ch, " (CHARIC R " . $chars[$num]{ic} . ")\n" if $chars[$num]{ic};
+ push @ch, " (MAP\n";
+ push @ch, $chars[$num]{map};
+ push @ch, " )\n";
+ push @ch, " )\n";
+ foreach (@ch) {
+ s/(?<!SELECTFONT) [RD] (-?)([0-9.]+)\)/" R " . $1 . $2\/$scale . ")"/ge
+ }
+ print @ch
+}
+
+sub chmove {
+ #
+ # Move a character
+ #
+ my ($char, $num) = @_;
+ my $i;
+ foreach $i (@{ $allchars{$char}{num} }) { undef $chars[$i] }
+ @{ $allchars{$char}{num} } = ();
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ push( @{ $allchars{$char}{num} }, $num);
+ $chars[$num] = $allchars{$char};
+}
+
+sub max {
+ #
+ # Return greater of two values
+ #
+ my ($a, $b) = @_;
+ return $a > $b ? $a : $b;
+}
+
+sub subacc {
+ #
+ # Subscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $allchars{$acc}{dp};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ if ($h > 0) { $s2 = " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVELEFT R $h) ";
+ }
+ else { $s2 = " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub supacc {
+ #
+ # Superscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($cb, $h, $hadj, $tallchar, $ic, $s1, $s2, $s3);
+ if ($char eq "i" and $allchars{"dotlessi"}) { $char = "dotlessi" }
+ if ($char eq "j" and $allchars{"dotlessj"}) { $char = "dotlessj" }
+ if ($acc eq "overdot") { $acc = "dotaccent" }
+ if ($acc eq "candrabindu") {
+ $acc = "breve";
+ ($cb = $allchars{"dotaccent"}{map}) =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$acc}{ht};
+ $allchars{$id}{dp} = $allchars{$char}{dp};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($scaps and $char =~ /^[a-z]/) { # accented small caps
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # single accs
+ $s2 = " (MOVEUP R $scoffset)";
+ $allchars{$id}{ht} += $scoffset;
+ $hadj = sprintf("%.3f", $scoffset * $slant);
+ $ic = $allchars{$acc}{ic} + $hadj;
+ }
+ }
+ elsif ($allchars{$char}{ht} >= ($accheight + $v2)) { # double accs
+ $tallchar = 1; # on caps etc.
+ $s2 = " (MOVEUP R ${ \($v1 + $v2) })";
+ $allchars{$id}{ht} += ($v1 + $v2);
+ $hadj = sprintf("%.3f", ($v1 + $v2) * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ elsif ($allchars{$char}{ht} > 1.15 * $xheight) {
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # caps etc.
+ $s2 = " (MOVEUP R $v2)";
+ $allchars{$id}{ht} += $v2;
+ $hadj = sprintf("%.3f", $v2 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ }
+ else { # single accs
+ $s2 = " ";
+ $ic = $allchars{$acc}{ic};
+ }
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ unless ($tallchar) { $ic -= $h }
+ $allchars{$id}{ic} = $ic unless $ic < 0;
+ $h += $hadj;
+ if ($h > 0) { $s2 .= " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($cb) { # candrabindu
+ $cb = $s2 . $cb;
+ if ($cbx) {
+ unless (($cb =~ s/(MOVERIGHT R )([0-9.]+)/$1 . ($2 + $cbx * $scale)/e)
+ or ($cb =~ s/(MOVELEFT R )([0-9.]+)/$1 . ($2 - $cbx * $scale)/e)) {
+ $cb =~ s/^( +)/"$1(MOVERIGHT R " . ($cbx * $scale) . ") "/e;
+ }
+ }
+ if ($cby) {
+ unless ($cb =~ s/(MOVEUP R )([0-9.]+)/$1 . ($2 + $cby * $scale)/e) {
+ $cb =~ s/^( +)/"$1(MOVEUP R " . ($cby * $scale) . ") "/e;
+ }
+ }
+ $cb .= "\n";
+ $s1 = "(PUSH) " . $s1;
+ $s3 .= " (POP)";
+ }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n$cb";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underacc {
+ #
+ # Dropped accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $v, $s1, $s2, $s3);
+ $acc =~ s/^under//;
+ if ($acc eq "dot") { $acc = "period" }
+ if ($acc eq "candrabindu") { die "Bad definition (no such accent): $qdef\n" }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ if ($acc =~ /^$supacc$/) {
+ $v = $allchars{$id}{dp} = $underadp * $scale * $shrink;
+ $v += ($accdepth * $shrink);
+ }
+ else {
+ $v = $allchars{$id}{dp} = $underddp * $scale + $allchars{$acc}{dp};
+ }
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($acc =~ /^$supacc$/) {
+ $h = ($allchars{$char}{wd} - ($allchars{$acc}{wd} * $shrink)) / 2 - $v * $slant;
+ if ($opt_s) { $s2 = " (SELECTFONT D 1)\n" }
+ }
+ else {
+ $h = ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2 - $v * $slant;
+ }
+ $h = sprintf("%.3f", $h);
+ if ($h > 0) {
+ $s2 .= " (MOVEDOWN R $v) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVEDOWN R $v) (MOVELEFT R $h) ";
+ }
+ else { $s2 = " (MOVEDOWN R $v) " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($opt_s and $acc =~ /^$supacc$/) { $s3 .= "\n (SELECTFONT D 0)" }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underb {
+ #
+ # Underbar
+ #
+ my ($num, $char, $id) = @_;
+ my ($h, $w, $dp, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $dp = $underbdp * $scale;
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$id}{wd} / 10 - $dp * $slant));
+ $w = sprintf("%.3f", ($allchars{$id}{wd} * 8 / 10));
+ if ($h > 0) {
+ $s2 = " (MOVEDOWN R $dp) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVEDOWN R $dp) (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " (MOVEDOWN R $dp) " }
+ $s3 = "(SETRULE R ${ \($thk) } R $w)";
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+ #
+ # If the character to be underscored is a digraph, fix up the LIGTABLE
+ #
+ if (grep /^$char$/, @digraphs) {
+ pop @newligs;
+ dummychar(0x035F, "uni035F") unless defined $allchars{uni035F};
+ $char =~ /^(.)(.)$/;
+ ($one, $two) = ($1, $2);
+ $one_ = $one . "_uni035F";
+ dummychar($dummycodepoint--, $one_) unless defined $allchars{$one_};
+ push @newligs, "$one: (LIG uni035F $one_)"
+ unless (grep /^$one: \(LIG uni035F $one_\)$/, @newligs);
+ push @newligs, "$one_: (LIG $two $id)";
+ }
+}
+
+sub digraph {
+ #
+ # Make a new character consisting of two existing characters
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($one, $two, $kern, $s1, $s2, $charZWJ);
+ #
+ # Remove the ligature info -- we don't want every occurrence of
+ # e.g."kh" to be converted into a digraph.
+ #
+ pop @newligs;
+ #
+ # List all digraphs for future reference
+ #
+ push @digraphs, $id;
+ if ($ligs =~ /^ \(LABEL $char\)\n(.*?)\n \(KRN $acc R (-?[0-9.]+)\)\n/ms) {
+ ($one, $two) = ($1, $2);
+ }
+ $kern = $two if $one !~ /^ \(STOP\)$/m;
+ $allchars{$id}{wd} = $allchars{$char}{wd} + $allchars{$acc}{wd};
+ $allchars{$id}{wd} += $kern;
+ $allchars{$id}{ht} = max($allchars{$char}{ht}, $allchars{$acc}{ht});
+ $allchars{$id}{dp} = max($allchars{$char}{dp}, $allchars{$acc}{dp});
+ $allchars{$id}{ic} = $allchars{$acc}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ chomp ($s2 = $allchars{$acc}{map});
+ $s1 =~ s/(\(SETCHAR .*?\))/$1\n$s2/;
+ if ($kern) {
+ if ($kern < 0) {
+ $kern = -$kern;
+ $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVELEFT R $kern)/;
+ }
+ else { $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVERIGHT R $kern)/ }
+ }
+ $allchars{$id}{map} = $s1;
+ $chars[$num] = $allchars{$id};
+}
+
+sub dummychar {
+ #
+ # Make a new dummy character
+ #
+ my ($num, $id) = @_;
+ $allchars{$id}{wd} = 0;
+ $allchars{$id}{ht} = 0;
+ $allchars{$id}{dp} = 0;
+ $allchars{$id}{ic} = 0;
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $allchars{$id}{map} = " (SETCHAR H 0020)\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub fixkerns {
+ #
+ # Generalise the kerning info contained in the vpl file by applying
+ # it to new accented chars. Do not kern lower-case chars bearing
+ # superscript accents with capitals, quotes or a preceding "f".
+ #
+ my ($char, $acc) = @_;
+ my ($olabel, $nlabel, @liglist, $lchar, $rchar);
+ return if $char eq "space";
+ if ($acc =~ /^$accents$/) { $lchar = $rchar = $char }
+ else {
+ $lchar = $char;
+ $rchar = $acc;
+ }
+ unless ($char =~ /^[a-z]/ and $acc =~ /^$supacc$/) {
+ $ligs =~ s[(\n \(LABEL )$rchar\)(?!\n \(LIG.*$)]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(LABEL )$rchar\)(\n \(LIG.*$)+(?!\n \(STOP\))]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(KRN )$lchar( .*)$]
+ [$&$1$char$acc$2]gm;
+ }
+ else {
+ if ($ligs =~ /\n \(LABEL $char\).*?\(STOP\)/s) {
+ $nlabel = $olabel = $&;
+ $nlabel =~ s/(\n \(LABEL $char)\)/$1$acc)/
+ unless $ligs =~ /\n \(LABEL $char$acc\)/m;
+ $nlabel =~ s/\n \(LIG .*\)$//gm;
+ $nlabel =~ s/\n \(LABEL (?!$char$acc).*\)$//gm;
+ $nlabel =~ s/\n \(KRN ([A-Z]|quote).*\)$//gm;
+ $ligs =~ s/(\n \(LABEL )$char\).*?\(STOP\)/$olabel$nlabel/s;
+ }
+ @liglist = split /\n \(STOP\)/, $ligs;
+ foreach (@liglist) {
+ unless (/\n \(LABEL ([A-Zf]|quote).*\)$/m) {
+ s/(\n \(KRN $char)( .*\))$/$&$1$acc$2/gm;
+ }
+ }
+ $ligs = join("\n (STOP)", @liglist);
+ }
+}
diff --git a/fonts/utilities/accfonts/vpl2vpl b/fonts/utilities/accfonts/vpl2vpl
new file mode 100755
index 0000000000..65ded28ce5
--- /dev/null
+++ b/fonts/utilities/accfonts/vpl2vpl
@@ -0,0 +1,994 @@
+#!/usr/bin/perl
+
+# Vpl2vpl: a program to generate accented virtual fonts for TeX
+# Copyright (C) 1997 John D. Smith
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$version = 0.25;
+#------------------------------------------------------------------------#
+$description =
+"Syntax: vpl2vpl -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2vpl creates new TeX virtual fonts based on existing fonts or
+virtual fonts (\"input fonts\"). A successful run will read a pl
+(Property List) or vpl (Virtual Property List) file and a definition
+file, and will generate a new vpl (Virtual Property List) file on
+standard output. The input font is assumed to adhere to the standard
+TeX encoding for text fonts unless it was created with either of the
+programs afm2pl or afm2tfm, in which case it is assumed to conform to
+(respectively) the Adobe Standard Encoding or the encoding specified
+in the file dvips.enc. In either case, the name of the input font is
+assumed to be the name of the input file without its .vpl or .pl
+extension: it must conform to normal TeX conventions for naming fonts,
+as vpl2vpl attempts to draw conclusions from it about the kind of font
+it is dealing with.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2vpl -d ISO-Latin1.def cmr10.pl >cmr10_isol1.vpl
+ vptovf cmr10_isol1.vpl cmr10_isol1.vf cmr10_isol1.tfm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2vpl -d ISO-Latin1.def rptmr.pl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole upper half of the character set free for
+the requirements of the encoding specified in the definition file,
+certain modifications are made to input fonts following the
+dvips.enc encoding to bring them into greater conformity with the
+TeX norm. In particular, the characters dotaccent and hungarumlaut
+are placed in the positions assigned by TeX (\"5F, \"7D), not those
+enforced by dvips.enc (\"C7, \"CD). The f-ligatures, double quotes
+and dashes are also moved from the upper half of the character set
+to their normal TeX positions. As a result, the following characters
+are not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., \"French.def\") should consist of
+ lines of character definitions, in the form
+ \"number\" \"character\"
+ or
+ \"number\" \"character\" \"accent\"
+ Here \"number\" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ \"character\" names the character (e.g. \"comma\", \"eight\",
+ \"A\") or consists of the word \".notdef\" (indicating that
+ the specified number's \"slot\" in the new encoding is to be
+ empty); and \"accent\" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, \"underbar\" and \"underdot\" are also
+ available, as are \"under\" versions of all the normal
+ superscript accents (\"underdieresis\", \"underring\", etc.).
+ The Indian accent \"candrabindu\" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ \"overdot\" may be used as a synonym for \"dotaccent\".
+
+ If the character named in the \"accent\" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the \"character\" and the
+ \"accent\". A digraph consisting of, say, \"k\" and \"h\" will be
+ indistinguishable from the letters \"k\" and \"h\" printed
+ consecutively, but the digraph \"kh\" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as \"amacron\" or \"kh\") may be freely
+ used in the \"character\" position of a further definition (such
+ as \"amacron breve\" or \"kh underbar\"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of \"a macron\" does not have to precede that of
+ \"amacron breve\": requests for \"impossible\" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ \"Slots\" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by \"\#\").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ \"DESIGNUNITS R 1000\" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2vpl to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2vpl's views
+ on where accents should be placed.
+
+ -h prints this help.
+";
+#------------------------------------------------------------------------#
+
+########################
+# Packages and constants
+########################
+#
+use File::Basename;
+use Getopt::Std;
+$cmdline = basename($0) . " " . join " ", @ARGV;
+getopts('d:s:c:bh');
+if ($opt_h or !$opt_d or $#ARGV != 0) {
+ print STDERR $description;
+ exit 1;
+}
+
+$filename = $ARGV[0];
+($fontname = $filename) =~ s/\..*$//;
+($encname = basename($opt_d)) =~ s/\..*$//;
+$vtitle = "(VTITLE Font $fontname modified for $encname encoding by vpl2vpl";
+$vtitle .= " v. $version" if $version;
+$vtitle .= ")\n(COMMENT Command line: $cmdline)";
+
+#
+# Flags for bold and small caps. These are probably a bit iffy, but
+# there's not much that can be done about it.
+#
+if ($fontname =~ /(^p.*b[oi]?[c]?$|^[^p].*bx[a-z]*[0-9]+$)/) { $bold = 1 }
+if ($fontname =~ /(^p.*c$|^[^p].*csc[a-z]*[0-9]+$)/) { $scaps = 1 }
+if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
+
+#
+# Array to convert from number to vpl representation
+#
+foreach $i (0 .. 255) {
+ $nv[$i] = (chr($i) =~ /[0-9A-Za-z]/ ? "C " . chr $i : sprintf("O %lo", $i));
+}
+
+#
+# Now the encoding vectors.
+#
+@TeXenc = (
+ "Gamma", "Delta", "Theta", "Lambda",
+ "Xi", "Pi", "Sigma", "Upsilon",
+ "Phi", "Psi", "Omega", "ff",
+ "fi", "fl", "ffi", "ffl",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedblright", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "exclamdown", "equal", "questiondown", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "quotedblleft", "bracketright", "circumflex", "dotaccent",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "endash",
+ "emdash", "hungarumlaut", "tilde", "dieresis"
+);
+
+@dvipsenc = (
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "quotesingle", "exclamdown", "questiondown",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "circumflex", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "tilde", "dieresis",
+ "asciicircum", "asciitilde", "Ccedilla", "Iacute",
+ "Icircumflex", "atilde", "edieresis", "egrave",
+ "scaron", "zcaron", "Eth", "ff",
+ "ffi", "ffl", ".notdef", ".notdef",
+ ".notdef", ".notdef", "Scaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Ydieresis", ".notdef", "Zcaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "copyright", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ "degree", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", ".notdef",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", ".notdef", "dotaccent",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "hungarumlaut", "ogonek", "Idieresis",
+ "emdash", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", ".notdef",
+ ".notdef", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", ".notdef",
+ "agrave", "aacute", "acircumflex", "ordfeminine",
+ "adieresis", "aring", ".notdef", "ccedilla",
+ "Lslash", "eacute", "ecircumflex", "ordmasculine",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ ".notdef", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", ".notdef",
+ "lslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+);
+
+@adobeenc=(
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+);
+
+###############
+# Read DEF file
+###############
+#
+open DEF, $opt_d or die "Cannot open $opt_d: $!\n";
+while (<DEF>) {
+ next if (/^\s*$/ || /^\#/);
+ s/\s*(\#.*)?$//;
+ push @deflines, $_;
+}
+close DEF;
+
+###############
+# Read VPL file
+###############
+#
+# File header
+#
+$vplhead = <> or exit 1;
+unless ($vplhead =~ /^\((VTITLE|FAMILY) /) {
+ die "$filename is not a vpl file: giving up\n"
+}
+do {
+ $_ = <>;
+ $vplhead .= $_;
+} until ($_ =~ /^\(LIGTABLE$/ or eof);
+if (eof) {
+ die "$filename does not seem to be a text font (no LIGTABLE): giving up\n";
+}
+if ($vplhead =~ s/\A\(VTITLE(.*)$/$vtitle\n(COMMENT Old vtitle:$1/m) {
+ $vplhead =~ s/\n\(COMMENT Please edit that VTITLE .*\)$//m;
+ @enc = @dvipsenc;
+ $dvips = 1;
+}
+elsif ($vplhead =~ /\A\(FAMILY.*\)\n\(CODINGSCHEME ADOBESTANDARDENCODING\)$/m) {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @adobeenc;
+ $dvips = 0;
+}
+else {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @TeXenc;
+ $dvips = 0;
+}
+if ($vplhead =~ /^\(CODINGSCHEME TEX MATH SYMBOLS/m) {
+ die "$filename is a TeX math font: giving up\n";
+}
+unless ($vplhead =~ s/^(\(CODINGSCHEME .*\+\s?)(\S+)\)$/$1$encname)/m) {
+ $vplhead =~ s/^(\(CODINGSCHEME .*)\)$/$1 + $encname)/m;
+}
+if ($vplhead =~ /^\(DESIGNUNITS R (.+)\)/m) { $scale = $1 }
+else {$scale = 1 }
+if ($vplhead =~ /^ \(SLANT R (.+)\)/m) { $slant = $1 }
+if ($vplhead =~ /^ \(XHEIGHT [DR] (.+)\)/m) { $xheight = $1 }
+unless ($vplhead =~ /^\(MAPFONT /m) {
+ if ($vplhead =~ /^\(DESIGNSIZE R (.*)\)$/m) { $dsize = $1 }
+ $mapfont = "\n(MAPFONT D 0\n (FONTNAME $fontname)\n (FONTDSIZE R $dsize)\n )";
+ $vplhead =~ s/\n\(LIGTABLE\Z/$mapfont$&/m;
+}
+if ($opt_s) {
+ $vplhead =~ s[^(\(MAPFONT D )0(.*?)( \))]
+ [$&\n${1}1$2 (FONTAT R ${ \($shrink * $scale) })\n$3]ms;
+}
+
+#
+# Ligatures and kerns
+#
+do {
+ $_ = <>;
+ s/ \(comment .*$//i;
+ $ligs .= $_;
+} until $_ =~ /^ \)/;
+#
+# Now build a hash to convert from vpl representation to char name
+# and use it to make ligtable readable
+#
+foreach $i (0 .. 255) { $vc{$nv[$i]} = $enc[$i] }
+$ligs =~ s/^( \((?:LABEL|KRN) )(\S+ \S+)(.*\))$/$1$vc{$2}$3/gm;
+$ligs =~ s/^( \(LIG )(\S+ \S+) (\S+ \S+)\)$/$1$vc{$2} $vc{$3})/gm;
+
+#
+# Character definitions: store "encoded" defs in @chars, store *all*
+# defs in %allchars
+#
+$_ = <>;
+do {
+ if (/^\(CHARACTER/) {
+ $character = $_;
+ do {
+ $_ = <>;
+ $character .= $_;
+ } until $_ =~ /^ \)/;
+ storeinfo($character);
+ $_ = <>;
+ }
+} until eof;
+foreach $i (0 .. $#chars) {
+ if ($chars[$i] and $enc[$i] ne ".notdef") {
+ $allchars{$enc[$i]} = $chars[$i];
+ }
+}
+
+##################
+# Set up constants
+##################
+
+$subacc = "(cedilla|ogonek|commaaccent)";
+$supacc = "(grave|acute|circumflex|tilde|macron|breve|dotaccent|overdot|dieresis|ring|hungarumlaut|caron|candrabindu)";
+$underacc = "(underdot|under$supacc)";
+$accents = "($subacc|$supacc|$underacc|underbar)";
+$underadp = 0.230; # depth of "under" accs
+$underddp = 0.213; # depth of underdot
+if ($bold) { $thk = 0.072 } else { $thk = 0.052 } # thickness and
+$underbdp = 0.082 + $thk; # depth of underbar
+$capheight = $allchars{"X"}{ht};
+$accheight = $allchars{"macron"}{ht};
+$accdepth = $accheight - $thk * $scale; # probable approx. "depth" of macron
+$v1 = $accheight - $xheight; # vertical offset for double accents
+$v2 = $capheight - $xheight; # vertical offset for accented caps etc
+if ($scaps) { # accented small caps
+ $scoffset = $allchars{"x"}{ht} - $xheight;
+ $v1 += $scoffset;
+}
+if ($opt_c) { # candrabindu
+ ($cbx, $cby) = $opt_c =~ /^(.*),(.*)$/;
+ $cbx += ($allchars{"breve"}{wd} - $allchars{"dotaccent"}{wd}) / 2;
+ $cbx /= 1000;
+ $cby /= 1000;
+}
+
+######################
+# Build the characters
+######################
+#
+# First normalise dvips.enc encoding quirks
+#
+if ($dvips) {
+ chmove("fi", 014);
+ chmove("fl", 015);
+ chmove("quotedblright", 042);
+ chmove("quotedblleft", 0134);
+ chmove("dotaccent", 0137);
+ chmove("endash", 0173);
+ chmove("emdash", 0174);
+ chmove("hungarumlaut", 0175);
+}
+#
+# Now build a list of definitions supplied by user
+#
+for (@deflines) {
+ if (/^\s*(\d+|0[0-7]+|0x[0-9a-fA-F]+)\s+([a-zA-Z]+?|\.notdef)(?:\s+([a-zA-Z]+))?$/) {
+ ($num, $char, $acc) = ($1, $2, $3);
+ $num = oct $num if $num =~ /^0/;
+ if ($num > 255) { die "Bad definition (number out of range): $_\n" }
+ $def = {};
+ $def->{qdef} = $_;
+ $def->{num} = $num;
+ $def->{char} = $char;
+ $def->{acc} = $acc;
+ $def->{nchar} = $char . $acc;
+ push @nchars, $def->{nchar};
+ push @defs, $def;
+ }
+ else { die "Bad definition: $_\n" }
+}
+#
+# Work through the list
+#
+while (@defs) {
+ $def = shift @defs;
+ $qdef = $def->{qdef};
+ $num = $def->{num};
+ $char = $def->{char};
+ $acc = $def->{acc};
+ $nchar = $def->{nchar};
+ #
+ # If we can't handle $char/$acc yet, but believe we will be able
+ # to later, send the definition to the back of the queue. In case
+ # it later turns out we were wrong, allow only five loops before
+ # giving up.
+ #
+ if (!$allchars{$char} and $char ne ".notdef") {
+ if (grep /^$char$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such character): $qdef\n" }
+ }
+ if ($acc and !$allchars{$acc} and $acc !~ /^$accents$/) {
+ if (grep /^$acc$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such accent): $qdef\n" }
+ }
+ #
+ # Remove any existing claims on $num
+ #
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ #
+ # First deal with .notdef
+ #
+ if ($nchar eq ".notdef") {
+ undef $chars[$num];
+ }
+ #
+ # Next look among existing chars (unless blocked by -b)
+ #
+ elsif (!($acc and $opt_b) and $allchars{$nchar}) {
+ push( @{ $allchars{$nchar}{num} }, $num);
+ $chars[$num] = $allchars{$nchar};
+ }
+ #
+ # If it can't be built from sub-elements, issue a warning and move on
+ #
+ elsif (!$acc) {
+ warn "No such character - ignoring definition: $qdef\n";
+ undef $chars[$num];
+ }
+ #
+ # Now build the char
+ #
+ else {
+ #
+ # First get rid of predefined/duplicated ligtable statements
+ # and character definitions; also synonyms
+ #
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar .*|.*$nchar)\)$//gm;
+ $allchars{$nchar} = ();
+ if ($acc eq "overdot") {
+ $nchar2 = $char . "dotaccent";
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar2 .*|.*$nchar2)\)$//gm;
+ delete $allchars{$nchar2};
+ }
+ #
+ # Go!
+ #
+ if ($acc =~ /^$subacc$/) {
+ subacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$supacc$/) {
+ supacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$underacc$/) {
+ underacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^underbar$/) {
+ underb($num, $char, $nchar);
+ fixkerns($char, $acc);
+ }
+ else {
+ digraph($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ }
+}
+
+###################
+# Sort out ligtable
+###################
+#
+# Convert to vpl representation, eliminating statements invoking
+# "unencoded" characters
+#
+@liglist = split /\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^( \(LIG \S+ )(\S+)\)$/) {
+ if ($n = ${ $allchars{$2}{num} }[0]) {
+ s/^( \(LIG \S+ )(\S+)\)$/$1$nv[$n])/;
+ }
+ else { next }
+ }
+ if (/^( \((?:LABEL|LIG|KRN) )([^ )]+)(.*)$/) {
+ ($one, $two, $three) = ($1, $2, $3);
+ foreach $n (@{ $allchars{$two}{num} }) {
+ $ligs .= "$one$nv[$n]$three\n";
+ }
+ }
+ else { $ligs .= "$_\n" }
+}
+#
+# Eliminate sequences orphaned by elimination of a LABEL
+#
+@liglist = split / \(STOP\)\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^ \(LABEL /m) { $ligs .= "$_ (STOP)\n" }
+ elsif (/^ \)$/m) { $ligs .= $_ }
+}
+#
+# Eliminate empty statements
+#
+$ligs =~ s/(^ \(LABEL .*\)\n)+ \(STOP\)\n//gm;
+
+####################
+# Output the results
+####################
+#
+print $vplhead, $ligs;
+foreach $i (0 .. 255) { if (defined $chars[$i]{id}) { printchar($i) } }
+
+#####################
+# End of main program
+#####################
+
+sub storeinfo {
+ #
+ # Extract info from a character definition and store it in @chars
+ #
+ my $char = shift;
+ my $num;
+ if ($char =~ /\A\(CHARACTER O ([0-7]+)/m) { $num = oct $1 }
+ elsif ($char =~ /\A\(CHARACTER C (.)/m) { $num = ord $1 }
+ $chars[$num]{id} = $enc[$num];
+ push( @{ $chars[$num]{num} }, $num);
+ if ($char =~ /^ \(CHARWD R (.*?)\)$/m) { $chars[$num]{wd} = $1 }
+ if ($char =~ /^ \(CHARHT R (.*?)\)$/m) { $chars[$num]{ht} = $1 }
+ if ($char =~ /^ \(CHARDP R (.*?)\)$/m) { $chars[$num]{dp} = $1 }
+ if ($char =~ /^ \(CHARIC R (.*?)\)$/m) { $chars[$num]{ic} = $1 }
+ if ($char =~ /^ \(MAP\n((.|\n)*)^ \)/m) { $chars[$num]{map} = $1 }
+ else { $chars[$num]{map} = " (SETCHAR $nv[$num])\n" }
+}
+
+sub printchar {
+ #
+ # Extract info from @chars and build it into a character definition
+ #
+ my $num = shift;
+ print "(CHARACTER ";
+ if (chr($num) =~ /[0-9A-Za-z]/) { print "C " . chr($num) }
+ else {
+ printf "O %lo", $num;
+ print " (COMMENT " . $chars[$num]{id} . ")";
+ }
+ print "\n";
+ print " (CHARWD R " . $chars[$num]{wd} . ")\n" if $chars[$num]{wd};
+ print " (CHARHT R " . $chars[$num]{ht} . ")\n" if $chars[$num]{ht};
+ print " (CHARDP R " . $chars[$num]{dp} . ")\n" if $chars[$num]{dp};
+ print " (CHARIC R " . $chars[$num]{ic} . ")\n" if $chars[$num]{ic};
+ print " (MAP\n";
+ print $chars[$num]{map};
+ print " )\n";
+ print " )\n";
+}
+
+sub chmove {
+ #
+ # Move a character
+ #
+ my ($char, $num) = @_;
+ my $i;
+ foreach $i (@{ $allchars{$char}{num} }) { undef $chars[$i] }
+ @{ $allchars{$char}{num} } = ();
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ push( @{ $allchars{$char}{num} }, $num);
+ $chars[$num] = $allchars{$char};
+}
+
+sub max {
+ #
+ # Return greater of two values
+ #
+ my ($a, $b) = @_;
+ return $a > $b ? $a : $b;
+}
+
+sub subacc {
+ #
+ # Subscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $allchars{$acc}{dp};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ if ($h > 0) { $s2 = " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVELEFT R $h) ";
+ }
+ else { $s2 = " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub supacc {
+ #
+ # Superscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($cb, $h, $hadj, $tallchar, $ic, $s1, $s2, $s3);
+ if ($char eq "i" and $allchars{"dotlessi"}) { $char = "dotlessi" }
+ if ($char eq "j" and $allchars{"dotlessj"}) { $char = "dotlessj" }
+ if ($acc eq "overdot") { $acc = "dotaccent" }
+ if ($acc eq "candrabindu") {
+ $acc = "breve";
+ ($cb = $allchars{"dotaccent"}{map}) =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$acc}{ht};
+ $allchars{$id}{dp} = $allchars{$char}{dp};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($scaps and $char =~ /^[a-z]/) { # accented small caps
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # single accs
+ $s2 = " (MOVEUP R $scoffset)";
+ $allchars{$id}{ht} += $scoffset;
+ $hadj = sprintf("%.3f", $scoffset * $slant);
+ $ic = $allchars{$acc}{ic} + $hadj;
+ }
+ }
+ elsif ($allchars{$char}{ht} >= ($accheight + $v2)) { # double accs
+ $tallchar = 1; # on caps etc.
+ $s2 = " (MOVEUP R ${ \($v1 + $v2) })";
+ $allchars{$id}{ht} += ($v1 + $v2);
+ $hadj = sprintf("%.3f", ($v1 + $v2) * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ elsif ($allchars{$char}{ht} > 1.15 * $xheight) {
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # caps etc.
+ $s2 = " (MOVEUP R $v2)";
+ $allchars{$id}{ht} += $v2;
+ $hadj = sprintf("%.3f", $v2 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ }
+ else { # single accs
+ $s2 = " ";
+ $ic = $allchars{$acc}{ic};
+ }
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ unless ($tallchar) { $ic -= $h }
+ $allchars{$id}{ic} = $ic unless $ic < 0;
+ $h += $hadj;
+ if ($h > 0) { $s2 .= " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($cb) { # candrabindu
+ $cb = $s2 . $cb;
+ if ($cbx) {
+ unless (($cb =~ s/(MOVERIGHT R )([0-9.]+)/$1 . ($2 + $cbx * $scale)/e)
+ or ($cb =~ s/(MOVELEFT R )([0-9.]+)/$1 . ($2 - $cbx * $scale)/e)) {
+ $cb =~ s/^( +)/"$1(MOVERIGHT R " . ($cbx * $scale) . ") "/e;
+ }
+ }
+ if ($cby) {
+ unless ($cb =~ s/(MOVEUP R )([0-9.]+)/$1 . ($2 + $cby * $scale)/e) {
+ $cb =~ s/^( +)/"$1(MOVEUP R " . ($cby * $scale) . ") "/e;
+ }
+ }
+ $cb .= "\n";
+ $s1 = "(PUSH) " . $s1;
+ $s3 .= " (POP)";
+ }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n$cb";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underacc {
+ #
+ # Dropped accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $v, $s1, $s2, $s3);
+ $acc =~ s/^under//;
+ if ($acc eq "dot") { $acc = "period" }
+ if ($acc eq "candrabindu") { die "Bad definition (no such accent): $qdef\n" }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ if ($acc =~ /^$supacc$/) {
+ $v = $allchars{$id}{dp} = $underadp * $scale * $shrink;
+ $v += ($accdepth * $shrink);
+ }
+ else {
+ $v = $allchars{$id}{dp} = $underddp * $scale + $allchars{$acc}{dp};
+ }
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($acc =~ /^$supacc$/) {
+ $h = ($allchars{$char}{wd} - ($allchars{$acc}{wd} * $shrink)) / 2 - $v * $slant;
+ if ($opt_s) { $s2 = " (SELECTFONT D 1)\n" }
+ }
+ else {
+ $h = ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2 - $v * $slant;
+ }
+ $h = sprintf("%.3f", $h);
+ if ($h > 0) {
+ $s2 .= " (MOVEDOWN R $v) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVEDOWN R $v) (MOVELEFT R $h) ";
+ }
+ else { $s2 = " (MOVEDOWN R $v) " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($opt_s and $acc =~ /^$supacc$/) { $s3 .= "\n (SELECTFONT D 0)" }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underb {
+ #
+ # Underbar
+ #
+ my ($num, $char, $id) = @_;
+ my ($h, $w, $dp, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $dp = $underbdp * $scale;
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$id}{wd} / 10 - $dp * $slant));
+ $w = sprintf("%.3f", ($allchars{$id}{wd} * 8 / 10));
+ if ($h > 0) {
+ $s2 = " (MOVEDOWN R $dp) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVEDOWN R $dp) (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " (MOVEDOWN R $dp) " }
+ $s3 = "(SETRULE R ${ \($thk * $scale) } R $w)";
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub digraph {
+ #
+ # Make a new character consisting of two existing characters
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($one, $two, $kern, $s1, $s2);
+ if ($ligs =~ /^ \(LABEL $char\)\n(.*?)\n \(KRN $acc R (-?[0-9.]+)\)\n/ms) {
+ ($one, $two) = ($1, $2);
+ }
+ $kern = $two if $one !~ /^ \(STOP\)$/m;
+ $allchars{$id}{wd} = $allchars{$char}{wd} + $allchars{$acc}{wd};
+ $allchars{$id}{wd} += $kern;
+ $allchars{$id}{ht} = max($allchars{$char}{ht}, $allchars{$acc}{ht});
+ $allchars{$id}{dp} = max($allchars{$char}{dp}, $allchars{$acc}{dp});
+ $allchars{$id}{ic} = $allchars{$acc}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ chomp ($s2 = $allchars{$acc}{map});
+ $s1 =~ s/(\(SETCHAR .*?\))/$1\n$s2/;
+ if ($kern) {
+ if ($kern < 0) {
+ $kern = -$kern;
+ $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVELEFT R $kern)/;
+ }
+ else { $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVERIGHT R $kern)/ }
+ }
+ $allchars{$id}{map} = $s1;
+ $chars[$num] = $allchars{$id};
+}
+
+sub fixkerns {
+ #
+ # Generalise the kerning info contained in the vpl file by applying
+ # it to new accented chars. Do not kern lower-case chars bearing
+ # superscript accents with capitals, quotes or a preceding "f".
+ #
+ my ($char, $acc) = @_;
+ my ($olabel, $nlabel, @liglist, $lchar, $rchar);
+ if ($acc =~ /^$accents$/) { $lchar = $rchar = $char }
+ else {
+ $lchar = $char;
+ $rchar = $acc;
+ }
+ unless ($char =~ /^[a-z]/ and $acc =~ /^$supacc$/) {
+ $ligs =~ s[(\n \(LABEL )$rchar\)(?!\n \(LIG.*$)]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(LABEL )$rchar\)(\n \(LIG.*$)+(?!\n \(STOP\))]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(KRN )$lchar( .*)$]
+ [$&$1$char$acc$2]gm;
+ }
+ else {
+ if ($ligs =~ /\n \(LABEL $char\).*?\(STOP\)/s) {
+ $nlabel = $olabel = $&;
+ $nlabel =~ s/(\n \(LABEL $char)\)/$1$acc)/
+ unless $ligs =~ /\n \(LABEL $char$acc\)/m;
+ $nlabel =~ s/\n \(LIG .*\)$//gm;
+ $nlabel =~ s/\n \(LABEL (?!$char$acc).*\)$//gm;
+ $nlabel =~ s/\n \(KRN ([A-Z]|quote).*\)$//gm;
+ $ligs =~ s/(\n \(LABEL )$char\).*?\(STOP\)/$olabel$nlabel/s;
+ }
+ @liglist = split /\n \(STOP\)/, $ligs;
+ foreach (@liglist) {
+ unless (/\n \(LABEL ([A-Zf]|quote).*\)$/m) {
+ s/(\n \(KRN $char)( .*\))$/$&$1$acc$2/gm;
+ }
+ }
+ $ligs = join("\n (STOP)", @liglist);
+ }
+}
diff --git a/fonts/utilities/adjkerns/adjkerns.think-c.hqx b/fonts/utilities/adjkerns/adjkerns.think-c.hqx
new file mode 100644
index 0000000000..f8944bda56
--- /dev/null
+++ b/fonts/utilities/adjkerns/adjkerns.think-c.hqx
@@ -0,0 +1,610 @@
+(This file must be converted with BinHex 4.0)
+:#%&NDNYPFQjc!%&38%aC5&P))!#3"h3di@F!N!3"!*!$Fii!!(+1!*!$TM!Z-$)
+hN!-a+3dJN!BS5e*1)%mJ-c3d)&)J,6!Z#%&NDNYPFQjc!!)!N!0"8&"-@8KC5#!
+!N!Y"8&"-@8KC5#!!N"HRmEJ@!*!'G$3J3b"[)&)J,6!Z-$)hN!-a+3dJN!BS5e*
+1)%mJ-M8f)&)J,6!Z-$)hN!-a+3dJN!BS5e*1)%mJ-cBb)&)J,6!Z-$)hN!-a+3d
+JN!BS5e*1)%mJ-cBc)&)J,6!Z-$)hN!-a+3dJN!BS5e*1)%mJ-cBd)&)J,6!Z!!!
+-*J!!,da*4`!!I$dk!*!$6%P(,`!!26Tm!*!$,da*4bm!N!0m26Tm!!![6%P(2J#
+3!h`p1Mi!!%a*4bmq!*!$26Tm2J!!,da*4bmq!!"m26Tm2J#3!bp-58F[2Mi!I$d
+kI$iq!!"-58F!N!-p1J!!#LU32JS!!#9c!!!++T!q#J!!9A0KCf8k)%&NDNYPFQj
+c)&Y[F(4TEfjcA5!m@hCGF'`YCQPXC6iZ@eCG8%`+!##3"dp`G'P[ER-JBA*P1JS
+!!##3"beM)$aMEfjQD@Fq,NY$4L#3"#KMEfjQD@GeFQ&dD@pZ)'CTE'8JEQ&YC5N
++!!!JN!FYEb!m@hCGF'`YCQPXC6iZ@eCG8%`JN!8SEh9dF(9d)'CTE'8JEQ&YC5N
++!!!JN!G*CL"ZEb"MEfjQD@FJCQPXC5"TFb"cF'9MD@CTC@3JG'KPEL"E9Pe36#"
+QD@aP)'Pc#J!JN!GUGA0d)(*PGh*TG(4PEL"hDA4SEh9d)'eeE(4TF'aP)'YPFQj
+c,JS!!##3"dPQ)'j[)'peG("eG#"QD@aP)'Pc)(0`C@0TCQPPC#`JG'KPEL"dD'8
+JD@j`GA3+!!!JN!GQD@aP)'Pc)'pfCA*hFQPdG'9Z,JS!!!SUN$i+!!!+)*!&9'K
+TFb"TFb"`FQpRFQ&Y)%&NDNYPFQjc)#Jp)%&NDR9cG#",CA*ZD@jR)&"KDA*c+5!
++!'*PG'%Y-3!!#L#3&PCPFR0TEfiJ*A-+!!!JN!PhFQPdG'9Z)'C[FL"jEh8JBRN
+JB5"XEh9cH5"$)("bEfGbB@eYCA)+!##3$bKCB@jZDA-J5'&bB@aKE@*[GA-X)$%
+j16-T#JS!)*!'5A3JFfKKE'`JD'9XF#"jEh8JE@&VC5"PCQCTBfPPER3JGQPbG(9
+KE#"QEfjdF`S!)*!)9'KTFb"cEfCdGf&bC5"LC@a[EQGc)(4[)(4SC5"`G@*XD@-
+JC'pYB@PZ#J!++T!q#J!!6Qpd)'9ZEh9RD#"YC@e[FRNJCQpb)'aTCfpbDf9ZFb%
+J55"aG@Pd,T!$#J!YB`!!@@pe)'0KELGd)(0`C@0TCRNJG(G[)'0[EQCTCb"QD@a
+PF`!!FJ"*)'0KELGd)'p`C@iJCQPXC5!PF`S!,@m!!&P[G5"MB@iRG#"cF'9MD@C
+j)(4hEb"[GA4`GA3JCQPXCA-!!(F!55"MB@iRG#"[F'9Z)'peG("eG#"QD@aP)#9
+c#J!!@@pe)'0KELGd)(0`C@0TCRNJG(G[)'PZF(9d)'CTE'9c!()!55"MB@iRG#"
+[F'9Z)'PZF(9d)'CTE'8J*A-+!(F!G'9YF!!!55"MB@iRG#"[F'9Z)(4PEA"[FQ&
+bH5"QD@aP,T!$#J!J+#N+!!"3FQpLE'9Y)(0MB@jZD@jR)(4[Df9ZFb%!!#!S+3S
+!!&"bEf*XC@dJFf0KEQjTEQFJG'pVC@jc)3!!)#JT#J!!8(*[BQaPE5"cBf&ZEQP
+ZCb"dEfYPER-K!!!J+#N+!!"3FQpLE'9Y)(0MB@jZD@jR)(4[Df9ZFb%!!%-!4!"
+2!%J!8J"-Ef&ND@jR)'PZF(9d)'CTE'8JF(*PB@eLE'8ZN!-+!#K-58G838*-43!
+S6%P(9%&#6%8+!!"5C@&ND@jR)'YPFQiJB@jN)'aTCf&dGA*P)'4KG'%ZN!-+!!!
+S3dK"8N&$9%95!!!S6%&#48`!!%*298j%39*C3dK"8J!!+&086e!T!!"-58F!,da
+*4bmq2J![6%P(,ci!!#p-58F[!#p-58Fq!%a*4bmq!%a*4bm!!#p-58F!!%Y56J"
+CEh8JBA*P)'j[G#"cGA"`Eh0PC#"dEb"VCA*Z)'%JBQ9RD@iJEfBJGfpbC#"LEh9
+ZC'&bH5'3!`!!8Q9KC'PZCb"XD@jPFb"QFQpY)'0[EQCTCh9bBA4TEfiJCQPXC5"
+KEQ3JCAKPBh9dD@jR)(4SC@dZN!-+!!"96NY&8Ni!!#i!5d956J!!,J"-48C8!!"
+558G)9!"-48C8!!"558G)9!"-58F!,J""4%3!8N906eC&!!"6D'&XE#"*)%&%4#"
+[FL"548e29N8JG'KP)%a*4cm!!#p-58F[2Mi!,da*4bmq!!![6%P(,`![6%P(2J"
+-58F[2J"-58F[!!![6%P(!!"#6e914%&5@80)39)!!&0,59!!!&0,59!JBfpYE@&
+ZC(-JBA*P)'j[G#"cGA"`Eh*dC@3JH@9d,#"cEh*bH5%ZN!-!!!T'D@jTFfKPC#"
+bC@&ND@jR)(4SC5"MEfjQD@GeFQ&dD@pZ)'CTE'8+!#9c!!"AFQPdD@jR)'4[Gfi
+JEQ9h)'aTCbpVCA*Z)'4KG'%ZN!-+!!!JN!-S6%&#48`J3Np96N4"8PP$5%&5+3S
+!!##3!bJPFb!!)!!T#J!!)*!$+&086e!T#J!!)*!$+%a"3N9-)!!!+3S!!##3!bK
+,8NiJ!!!J8L!P,M4Q+3S!)*!$+%a"3N9-)!!!+3S!!##3!bJPFb!!)!!T#J!!)*!
+$+&086e!T#J!!)*!$+3S!9h*TG'PZCb"TER"eG#"QD@aP)(*PE@&TEQPZCb"NBA4
+K,T!$#J"9EQ&LE'8JG'mJFQ9YEhCP)'PZF(9d)'CTE'8!G'9YF!!!9@jKBQaP)(4
+[)(*PEQ&YC5"dC@e`Eh*KFRNJCQPXC3#3"!)!!#9XCL9Z!#9N!!!P2faN*@i!!#8
+rE(8PEJ#3!eS!8J"U!'J!$!#3!l!!F`$%!+m%!*!%X!$K!-3"(33!N!50!#)!R3&
+iN!!!N!3L!"i!-J#d"J#3"$B!(J"'!,3'!*!%)J$Q!$)"I!B!N!3f!1B!4J&m"J#
+3"%S!jJ"D!A`'!*!%AJ$Q!'i"I!B!N!5L!+`!E`$)!,1!!*!%#J!8!"S!USJ!N!3
++!0`!'J&bL!#3"()!&!##!+U)!!!m!$-"$J(0!!3!"J!!9%9B9!!!*50c!(F!FJ#
+3!`*25`!'3f&ZBf9X!!GMEfjcEfaP"'CTE'8!"f0[ER0[E'8%CQPXC3!-BfpZFfp
+XC5YQD@aP!!pMEfjcEfaP+h"bD@jdCA)28h4KEQ4KFQ3J5@j`GA3k%&0dB@jNBA*
+N)%peG("eG$S!$80[E@eKEQ3J6'PZC6SP)h-!*50c!!!b!!Vrrr[L!!J!"!!*!*!
+$'3"3!!%(B!!!!@S!N!-F!"`!(J!F!#3),Q0[ER0[E'8!6R91q3!!6[N!N!0N!'3
+!b!%X!'3!H#F2*`m!!'%!G`!P)h-ZE'pR!!%8"%CTE'8!"P&eDA3[83!%4@4TG!!
+N9@jNEbpD1bJY1d0eG#pB1d0[F(N[3cY3BA0dC5p@1d0XC@&b!"C`FQ9cFb$(FQ9
+dGA*Zb#"dEb"PH'Pd!*!$$3!(BfpZFfpXC3'3#3+3"3'3%J3)N!m3N!S)N!GJN!C
+!N"3)N!DJN!D!N"3)N!3"!!"cBh*KG'0S!(GL+`"dC@e`!!!PFb8Z0'3!!$q3#)!
+!N!1!!*!$J!#3!c!a-M-d06Bh1$P"3N0%48B!!$!a-M-d06Bh1$PKBQ0NC@B!!!B
+qN!B!N!085%P15b"$)%aTBR*KFQPPFb#T)$%j16%J8hPYB@jdC@-J3fpbF#i!N!E
+U!!i!!J!#!!)!!J#3!`)!N!-#!*!$!J#3"`)&UJ#3I`i!f!#3"`)!!J!#!!)!!J!
+#!!)!!J!#!*!$!J!#!!)"E!!%!*!*!J!#!&)!!J#B!*!&)J!L!I)!N!8q!!)!N!-
+%qYciP!!!6b`!8!!H6PB!!!bZ!!!kQ!!)C!`r,J!+6VS"a&52B"i-VJ#!!*!$#'-
+%F!"J%#!Z!!K8J+%HD`3`r2rr)!K1ANje6PErr!bZ!)!!N!--B`4`!'"U##i!N!-
+2C`45VJ!-,bi!$#mZ!!K1V3"#,8!!$!b!!)!!!'-%F!"J3JbZ!!!kQ!!-C#Jr,J!
+16VS"8P52,8$rr'F5,bi!$%*R,blrr%kk0%C2l`!+)#lrr'!3)#i!$&5!SajV"$$
+mrrmJ#%jH6R919J!!51F('#iZ!!`SEJ!)$)F!J!!!B`C`!'!!!1)J$'B-,`G1Z[m
+H@)pJ!!$55SGQ$Lm-6VS!d&L2F!"J!!$!#!F!!'F#8SFJ6(!!-#"'3'B#S#&9J#`
+![)GM&#S($)B!!$UBC5B-K`!!1TKPF'"L[)GN&#S'$)B!!$UBC&3-K`!!1TKN@'!
+B)!aJFL"--L!J"T!!Kp*!-)&'3G$"-)"Jk#*--#&'3%(a!!!`%'X`+fhh$[F5FJ$
+336)`!!"Uq$#!)JH5KY$"N!""C44R!M#!Ne&JYL"-9BJJ"e5!S#"UULm(6VVqBPL
+2*N!J#fF3)!8L5b"-S#i[$%kk!!jBMb!,60mBi%jH6R919J!!)#i!#'F))%"'B'B
+#S"p1ANje6PErq#m(2Li!#&C(#)F!!#eYp`lrr#!Ypa*Q6#!m!!!kS+%HD`!!KM&
+mrrmkQL&Yp`BkR#Y)p`BV52F1)#hh#QB')!JV32F+)N!M5$UF-$`kQM#!B%3J,[r
+iX+lrr'Hm+d$h$LY!pa)J3(6rB"K'3'B1,@J!![ri)'hh$L3Ypa,3`,(#C0!`%'[
+NFJ$336)`!!"Uq$#!X%GPjL*)dXFV5IF5N!"(C`)bJ%C(--FJ##iI6Pj1G8j@!!!
+[$!aY!#(h&Qm%F2pJ-$!YpaC5EIF@`I`!"NRYpaV3M#K!++i!#%UYpqCQ%#"Y!'`
+V52IQ3Hd!FLY)!'a`!#KI6Pj1G8j@!!")j`!B$'d!)IF@E`4`rf"J-#hh&P*YpaE
+"r!!'5Hhh'Y#-+%!SVJ!)1A`!!3!%5UhhkQBk-$bTp+&'+dMhkNTi!SjY$%(Y!(S
+`2+RdS%GJ(R!'T4iQ5$Dm6[P"l3"k*dJ!!LY,pqi`2+Rd)%ZJ4h!!60mB!%jH6R9
+19J!!,`Fq,IF@1h`!!IF@,bi!#%kkrbBl4rF@,Llrr%jH6R919J!!,`Fq,IF@3Qh
+h&LmZ!!K1Z[p-1dIh&LiZrra1ANje6PB!!#"Y!'a1N!#Tp%jH6R919J!!UI41ANj
+e2c`!!8kk!"*8Mdje3QG1ZJ!)UI48Mdje6PB!!%MR!aK*lIIQ)!dUH!N%,!"+EJ!
+)CJBlI!!"paK*lIIQIL*J'&f-*P3J#fF33T4+EJ!)CJC+E!!%C`*1Nc!(8dG+3'E
+J5UhhlQF+)'hhlU!I3UhhlNUYpqTR$M!mUI3JEIIUS%G#VIIU5UhhjQF))'hhjNk
+3!'!')'d!E%k3!%(Y!))V52IQ)!E"M8cI'-"1ANje6R919[rd3UF[,J!-5'lrp%k
+k!"3JEJ!)3qlrp#$C)0NJf8jH6R919[rb5'lrmNKZrr4)EIIb,bi!$%kk5$*+3%r
+[!""Z$%*Zrr*#V[rm3Ulrq%UZ!""R$M"Zrr,4lJ!-)Qi!%#+))'i!#%2Zrr3Jf5$
+C)0P1ANje6PErrNKZrrj)EIIi,bi!#%kk4q4+3%r[!!aZ"%*Zrri`,[rq6Pj1G8j
+@!!!r2!!+3UF[,J!)6VS!"NjH6R919[rk5'lrqNKZrr`r,J!35'hhr#mZ!!K1ZNH
+H5N"2l`!5EJK#E[rk3Ulrr%UZ!!aR$M"ZrrV4lJ!))Qi!$#+))#lrr%jH6R919[r
+k5'lrqNKZrr`r,J!35'hi"#mZ!!K1ZNG@5N"2l`!5EJK#E[rk3Ulrr%UZ!!aR$M"
+ZrrV4lJ!))Qi!$#+))#lrr%jH6R919J!!,``SEJ!)3U`!%Lm-6VT&fNSX!!&BMfS
+D)#`!#LP!!",4V!!@+@`!"J!1#+`!"`!"B"B[$%kk!-`ZM%kk4b4+3&L2C`4`rf!
+38k`!%L"X!!j5V!!1F!!3%#KI6Pj1G8j@!!")j`%)2Li!##KZ!!S)&!!$CN)[$%k
+k4A!)&!!"@)pR"LPX!"S!&Lm-6VS!GNUX!"jBMfF'F!%T3!!5#03!!e1X!"*R%#"
+X!!j5V!!1%)G`!"!(B%4`!"!(2J!JE!!18U`!$K#!5U`!(QFF$%F!)'d@)#`!$T!
+!V!!'X+`!#Q3)F!%T3!!5B"![$%kk!&K+3&L2C`4`rf!#-!G-ha#!6Pj1G8j@!!!
+[$#KZ!!JTE!!'!!iTE!!+!"*+E!!%EaK`!E#X!!TN%#mX!!S[,!!@6Ud!8T'X!")
+J,!!5dD`!&LKI6Pj1G8j@!!")j`%)+'i!#(i!)#`!%T'X!"B)&!!$Cb!J,!!1N!#
+X!!BT3!!5+@`!"J!1#*3!!bm-6VT&rMi!@)m[$%kk!!i`"dcZ%)$rq%jH6R919J!
+!,``SEJ!))'`!"Y(X!!ST5!!13U`!%JLX!!F!!5KI6Pj1G8j@rL!["dKYr5C1ZJF
+Z6VS"fNKYq8")E[iJ6VS$IMkm!!41ZJ,),S!r2!!"U@-q[!!'6VS#Z#k!2c`!!DP
+M,Uhk3+N93UG)E[rqUC%`,[rq$%!!#@)!!+C$qJ&md%$5m3!!6Y&1ZN1i,bhi$%K
+YqN4#Tcmm!!&)EIT'3UG)E[mJ2c`!!URU5Llr)'G`3HlrY%2Zrb"`%5$C8FMrr$$
+C,c`!"!!#-#lrrMY!q03r!%kk!PjFMf"',bhi%%KYqNa)EIT13UG)E[mJ2c`!!DR
+U5Llr)'FS3HlrDN2Zrb"`%5$C8FMrr$$C,c`!"J!%-#lrrMY!q0Br!%kk!KCFM`a
+Z!!(rrQB!rd!r2!!$6VS"i#m!5'hj3+Q3!%KYq8")EIT35'lq)%kk3r4)EIP!5'l
+q)%kk!cBq!%(Yq0JLEJ!))SJZVIT!UB--E3!*q0C2l`!5CJa)EIe-6VS'EPL2B%B
+-E3!'q0CR2NKZrfT)E[mU6VS"r!aY!!IieP#2CKC)EIe-5'hk9%KZrbT1ZL%q6qm
+!$'!55'hp6%*R5'lr+Nkk"GK2l`!+$'d!"IM8CL")E[qd5'lr+Nkk!EC)EIdQ5'h
+k9NKZrbT1ZL%#6qm!&%*Yr1S`"biI6Pj1GImQrbEqM[mQrXMqN[m3rZ$qi2m36PE
+rr%(Yq"3J2!#3!lLTibe)rra#Td+R5'hic%KYqPJ[2!!"!!")H2rr3LG#TbmZrrb
+TI5YIqN!r2!!"6VS!a&52,`")EITDU9mr2!!#6VS!XP52,`")EITHU9mr2!!%6VS
+!S&52,`")EITQU9mr2!!&6VS!MP52,`")EITZU9mr2!!'6VS!I&52,`")EITdU9m
+r2!!(6VS!DP52,`")EITmU9mr2!!)6VS!@&52,`")EIU#U9mr2!!*6VS!4P52,`"
+)EIU3!+PI2c`!#dkk!$48Mbm!5'hkS+Q22c`!$%kk!#*8Mbm!5'hkX+Q22c`!$8k
+k!""8Mbm!5'hk`UQ26Pj1G8j@rr)[,IT!2bi!#%KZrrj)E[rk5'lrmUQ0)#lrqNj
+H6R919J!!B#)r,J!+6VVrdLm!-#i!#,"Z!!TA`83"5)%r!DPM9)p5EJ!+-#i!$&0
+Z!!a+3'E56Pj1G8j@!!#SRLmm!!-!!kLE5'hiQ#mm!"!!%+L`U*j1AL"IA)p1d%j
+@rmj#V[rJ)'i!$$eS!!Erj%(ZrmkJ&5"Z!!a)D!!+5'hkd#mZ!!K1ZN'%6Pj1G8j
+@!!")jami+'i!##4Z!!am!(S!H!"f!%Ki#4")EIV8*N`[$%kk39K2l`!-B"`-4`!
+JCJ4m!@!5$%F!)QB%HJ&J#!a(!#GQ!RJ"(KY)KdT(CYa+4QB)5N9Q"%T%Ca*+4@F
+)5N4Q"(!RB!*`)MB!&-!Q6'!3YNGR"Ja(!&aQ""6m!&`8aaiE5)G+4fES5N0R!K6
+$&2`!)%)D2c`!!dkkrV3[!#m-,bi!$%kk3#CBMbk!UBm[,IT!,c`R$`!$2c`R$kP
+q61iFq2rJ6Pj1G8j@!!")j`FB+'i!##CZ!!am!(S!B&i-4`!JCeJ-43!CE"!`"9*
+&)%e)`1@)dF!K5rMB$%F!A'B+5K4R"KiF5)GJ(!a(!#*R"Ja(!#GQ%%T'CJ3m"f!
++[%GQ"(`!B!)@adS8C`iH(%L($%F!)'E%5NCQ`%)E(Ka)KdT(CTS`"8cI'1"1ANj
+e6VSQ!Lm!3UG1ZJ!'8)p1G8j@!!![$#KZ!!`J$'B%F!"J8NSi#2*R"%kk!eS[$%k
+k*i`jI2rr!!4+VJ!)@)pR#L"Z!!JJ+!!HB!41ZJ8#+8!!(NKi!J!r2!!"3UF[$%k
+k*S*"l3#b+8J!)NKY!,T1Z[D@)!`SE[rm6Pj1G8j@rrK)E[ri,bi!$%kk"VJZJ%k
+k$Sj`rp"Z!!Jl32XmF2r3EJ!+1d$l1NKZrrK1ZJlJ6Pj1G8j@rrK)E[ri,bi!%%k
+k"S)ZJ%kk$PK`!G"Yqc`JEJ!)-)"`!G"YqcSLEJ!--S")E[ri6VS1TNjH6R919[r
+i5'lrq#mZ!!K1ZJC),S"1ZJiH2Uhl1Nkk#0C)E[ri6VS1I%jH6R919[ri5'lrq#m
+Z!!K1ZJBH,S"1ZJhd6VS)m%KZrrK1ZJj@6Pj1G8j@rrJ["ciZ!!K)E[ri,bi!#Nk
+k"I)ZJ%kk$FJ-4`!"8)pY"VjYqcK[!Ri"1dIl2NKZrrK1ZJiD,Llrp%jH6R919[r
+i5'lrq#mZ!!T1ZJ@i,S"1ZJf1#+d!"IYB#+d!"[YB#+d!"rYB-#i!#&#2C`jV)PG
+!CaKU(&*!DKKJ#!MY!!Il@'!1#1d!"[YBB!B)l3!&qeK)E[ri6VS0YNjH6R919[r
+i,``[,J!+6VS&@LK!5'lrq#m-6VS0+NTZ!!K2l`!-Cb4+V!"SCM*)H!!d6VVaULP
+!!'JZV!"SU1T"l3$#)Q`!D#+)B"4+V!"SC`i[,!"S6VVc5%+X!'KBMd*R6VS(SNK
+ZrrK1ZJe)+'lrp%jH6R919J!!,``[,J!)6VS%k#K!3THT*,RIC`3[$+NI,`bT&5K
+I6Pj1G8j@!!![,J!)6VS%a#k!U4C1ANje6PErq%KZrrJ[,J!16VS%V#k!6VS-JNk
+k")4+EJ!-8)pR#%(Yqh`J#'!'3HhlIL!),`![,J!)6VSE!#Y!qe3)V3!#qeK)E[r
+i6VS-ZNjH6R919[ri5'lrq#mZ!!K1ZJ4F,S"1ZJ`b6VS%0%kk'H!V32Y8#1d!![Y
+B5'lrq%kk$)C1ANje6PErf#m-QFa+,IdQDJj)EIdQ,`a1Z[cZ+%"3MdSYr8aU$NK
+Yr8`[$%kkr0SS3&#25LhpFQS15'hpFLm-6VVmaLK!8)p+,IXXCbK)H!N35'hlJ%K
+ZrpK1ZMc)5'hp6$mm!!&)E[rB6VVr&%*YqZa2l`!@+&p1ANje51F"#%Ti!SjY!U"
+MIJ"J"+!f8NF-4`!+EIBJ2!#3!mkK(NKS!-USEUMqU4+Tc%+RUAZT-%+R2c`!!8K
+YqiLT-5!I+d$lB#m!3QHT05mYqf![2%459P+T68+R2c`!!NKYqiUT-5KI,`a#CkN
+e,`a)EIZ3!+Nc3UFr2!!$5'hlQ+Na+&m[$%*RU68[$%KYqjkT-kNh,c`!!2rr)"q
+J-UK3'h`!!IYD60m3J%je6PEqk#m(5Uhl5'G')'hl5#!Yqda5VIY-d*!!)%"q!"i
+3)#hl6,#Yqe"Q#L"YqdLJ)d+YqdJ),3!$qeKR"!*(!(m-4`!*CJ*q)$m(6VS49'!
+!!-LTY%)i!9a#*cmmrrp)E[r`UA"+(fF33LG)E[r`UE*+(fFFB!!!SNTZrr"Q!!#
+D3UHT*%UICJ!!N!#S8'!!!)S-EJ!"rr"Q!!#!3QF[,[rk5'lrl+NX-"pREQYX98"
+R%QTQU&"#TbmZrrUT25eIrqKJ$%KZrr![,[rXUE0J5M!ZrqKR3'Xq9d"R,'Si8N"
+U'LmYqf!r,[rU5'lqk+P'3QG)E[lSUEC8Mf!D3Qhkl%*R6VVb(&523LG`rp"ZrqS
+r!+R#9)p#CkNi,Llqj%jH6R919[rS51F!'%KZrrbSG%+R6VS+9&L23UG#TdKYqaJ
+[,IVF3LFr,IVJ5(Mrrd)R3UHT%bKI,``r,IVD2bhkf%)RU4XV62XZ,`bSFcmYqZ+
+SKcmYqZ5SLMmYqZDSL%KZrqLSLc!ZrqM3E[rUd'lrlMY!qc)lE[rXqc3lI!!)qci
+)V3!$qeJ)V3!%qeJ)V3!'qeJ)V3!(qeJ)l3!&qeK#VIY)3Uhl9%*Zrr*#E[r`-#h
+kk$Y!qcE"lIXb8%!p32rd-#hkkMY!qcM"lIXd8%!p32rf,``r,[rf2blrp%)RU4e
+#TdKZrr")E[r`UG)VArY!)'hl3#"3-Acrr`")F2r3EIXf1d$l1N*R6VS$L&52+fl
+rp2Y%8Qhl4&*YqdC)E[r`U(")E[rdU(!JE!##*P!RE[r`!!JRE[rd!!`QU`!)*fX
+!$!!%3Hhl,R!XUH-T5!#B5QhlAQB)6VS+R$Y!qeijEIYH!'a1ZJJ1,`bT&5mZrrb
+SFb!-60mB!%jH6R9)j`-)IJ"*lIdQI!pJ&L!X!"k`VIXZCJJ`"e*(5N"Q0NRX!#B
+`"P0'5N"QiNkk!#j+VIY)C`BJEIY)S#-JEIXZ)'J!Q+!M,bhl3+R0,bhl,UN83Uh
+l,NcI%-"1G8UYqe4R&JJY!!,l@'F%6VS4`#mYqe41ZL#!@)p1G8j@!!")j`%B+'i
+!##m-6VShmL"!*QJ!(NRYr5Cq$eL2B"J)&!!$C`khl!!HCJJ[$%kk(r4BMdRX!#B
+`"e0(5N"Qi#!,60mBJ%jH6R9)j`%)5Hhp*Ri2B"J)&!!$C`j+V!!HC`J[$%kk(lj
+BMdRX!#B`"e0(5N"Qi%SYqeTR6NTYqZaR5%RYr5Cq$f!i5U`!(QFZ,b`!(NKYqm5
+T'JLY!!Al@!LY!!El@!LY!!Il@%+R,`a1ZKl',Sa1ZKek8)pJ$%RX!#B`"e0(5N"
+Q`%RYr5Cq$f!55U`!(QF),`a1ZKqF@)p*l!!Q-!G64dT!CZC-ha#!6R919[ri51F
+"##KZ!!Kq!%TYpaKR"R!!B!!"&%KZrrJ[,!!H6VS'a$!Z!!a3MfF5D`!!bP9!C`!
+!XQS!!-"J!!#D)#`!$LY!qf`V32YS5Lhl@QG`,`a1Z[R##1d!"2YB+f`!%[Y`##d
+!"IYB@)pR)$"Yqc`bEIXidHhlF,2)C"!`,IXiN!"Yqca53$"!+dMlF%SYqeKU"(!
+!B!K#Cdkk"+C8McY!qhBl32Yd#*3!"8kkqdT+VIY`C`C+,IYBD[!)V3!%qeJJ,IY
+XN!#YqfJT3!!5CLS)e!!&I[pJ)MmX!"3[,!!16VS"2Pb2B"*1Z[fS)#`!(V#ZrrK
+Q"%+ZrrK+,IYFCb*#,IYF5(J!##!IS$*#V!!52c`!"%kk0BJlI!!%r1Tqre525'l
+rq%kk"Li`"dcZ%)$rm%jH6R919[rq51F"'$iZ!"3SEJ!3B%SQ6%SF@mrrr'S#8ib
+hc'35)!b3!)Xr!#m,,bi!$#mZ!!LSJNT(E5a`Im!F(8$rrcmm!!5SL6mm!!&)E[r
+r,bi!$#mZ!!LSJN*RU)N`"e0(5N"QVNcI')"1AL"I6qm!$Nl36PB!!$!YqcD3!'i
+!#$"!,`K#Tamm!!e1ZJ-S)'hl3#"32UJ!2#"Yqd!bEJ!)dmR6d$mT!'"1ZJ0!3Qh
+l2%jH6R9)j`-B6VS$a#K!-#hl1NId!'$@`$iYqccH8hcrh'X!!Va(E`ij4`!J18B
+!)LmYqd#TedcI'-"1G8j@rra)j`%B2Li!$#KZ!!KJ!!$Q,8crr(!JX"a5crrmB`*
+6M,RZrraM%L!-N!#Zrr`[!#mZrra1ZJ$J8)p+4fd!!-*+,IYBDbiQH!&-B#3-D`!
+$!!CQ'J`V!#i!#fB5##X!N!-8C`SEI!!"qeaJ!!#8*P-J#fEBF!!3(&p!$%!!"Q*
+f3rS!KY"!d[%!!%l42c`!"+R)B'*1ZJ,k5Qhl2'GB8fhl2'"53Qhl1N*R6VVqfP5
+2B%41ZJ8LB$j5EIXk-#hl1V"YqcCQ-&0YqcTJ+N*YqcaJ*&*Yqc``,IXm5-#"lIX
+q5%"+3'EX-#hl2,"YqcK["MYYqcMl2$!(8dG+3'B!ra4-haL!6Pj1GIq%ricrb[q
+Url$rR2r%6PB!!%MR$`JZ,J!-,!F`EIXi-Qhl202(XFPX#M`YqcLFEIXm5-BJEIY
+!-#hl1MK!5I3!B0R31Lhl20T8H2rBE!!#Z%9X)M!&N!"%-%![#%+R(c`!)%kk!9S
+qK$m%6VS"L$J&6qm!$'!1-%A4aM*%XFPX"$J'f%8J"L*i#V3JEJ!)UH)aaJU`2`3
+r"8kk!9UqKPL2E`j1ZJ3UhDi!#*k'B!$rE0eYqca-ha$`6Pj1G8j@!!")j`-)2Li
+!#$`Z!!T1ZJ'k+%!`,IXk5-$3J()"dQhlGV*d#'*Q%$P(!#!j4J!L,bhl3+RAB$S
+j4J!J1@hlGJ!L,bhl3+R9-#hlGT!!4c"!,`J`,IYfN!"'-%![#"mm!#"1ZJ#H2Uh
+lGMm(6VS!bNr[!!``"T!!4j&YqhC-ha$!6Pj1G8j@!!![$%kk!8!S3$PZ!!S!)$!
+YqcT)`0#!FJ(5EIYfXR3)BQB@1@i!#J!L%#i!#%L!2`![,IY!UGaJ1$PYqhB!)Lm
+Yqd#Te8+R,cJ+Y%+R3UG#TdKZ!!K)H!!"UH"5H!U`F!(3EIYf2S!r,J!+6VS!4&b
+28QhlGLKI6Pj1G8j@!!")j`F!(Li!##`Z!!SU,J!1)(J+Y#!&-F!+X+!N)&$4aTU
+'B!)3ae(0rra-h`$J6Pj1G8j@!!![$%kk!)`S3$PZ!!J!)$PZ!!S!)LmYqd#TfbK
+I6Pj1G8j@!!")j`-B2Li!#%kk!')S3$!YqcT(p!"JeX"mrpaV!!)`%p"YqccH3,a
+(E#3`"j!!4M"!,`K#Tamm!#"1Z[pS2SBr"NkkrjBJEIY!+&"2l`!-18F!)MP(!#!
+jI!$r!%B[,IY!UGJ`"dcI'-"1ANje)'hl3#"35QJ!*'F',bhl3+RC)'hl3#!36R9
+)j`FB2Lhl0L"Yqd!S8'!!!*``"e0(5-$3J(VrfR3)B$`&)'`!2LC3eXCJ!P0'5NC
+R#&1,$"-!)'Ib##d!"2YBCaC+,IYBDa#qEIXkCJUmEIYfE!3m,IYfQNCR8%+R,b`
+!2M"',`K#Tc"&,`K)EI[F3UHTi#"Yqd!S8!JY!!6l@&L2Ca5mEIYdE!5EEIYd['h
+lGQ`%QfhlGVaX!#"X"*YX!##mE!!LE!5EE!!L5NGQ!2pL,bhl3+R360mBi%je6PE
+rq#"YqbiYD!!3rrJYD!!8rra)E[riU5K)E[ri,c`!"!!%U+NJEIY!)&!KE[ri!!J
+KE[rm!!``,IXb`Hhl0M)Zrrb53$e"rrJJEIY!)&!JV[ri)@lrr!!%6Pj1G8j@rrJ
+[$#KZ!!JJEJ!-5'J!"+Kd)'i!$##Yqf3J$'G)-#`!E,"YqejQ2Lm-6VS!D#k-U(0
+#*bmX!(USiNSICL3YE!!3rrJYE!!8rr`[$+NL5'lrq+LM5'lrq#mYqd#Tdbm-U5-
+V62YN+&p1ANje6PB!!#"Z!!JV82YNC``JEJ!),a"1ZJ!5@)mJEJ!),bJ!"+Kc6Pj
+1G8j@!!!J,J!)X+hl,QFi5Uhl,QF@)'hl,L"S!*JJ8%2Yqbj`#L$C8FMrr%UZ!!K
+R&L"Z!!JJD!#B)&"$lIXZF!SLf&()rra1ANje)(J+Y+!T)"!),3!$qeKR&L*!-MJ
++X'!+5KPU"JLT!!Irre(*rr41G5"i#V5J+Nje6PErk%MR"cK1Z[f`+%!),3!%qeK
+R%JJY!!Al@'B+##d!"[YBC`!!j%(ZrqK`!U!a8N"+!'F13Hlrk(!%S$&53%S!Cr*
++VIY8CcS`,IXk4r3!B0E!19-!)$PV!!)!)LmYqd#Te5mYqe3`H!U`,`K)H!!"6VV
+rA#m!6VS5X%kkrhT2l`!38Qhl1M!YqcU`EIXfCR3JEIY!+&!NE!!q2L`!BTpX!$`
+m,!!m8Q`!2#e8rrJYE!!%rra)E[ri3QF`,IXb4%!r!%+RU0JU(bm&U1m["DMC3UF
+[#N+R3UF`4bm)5'hlhN+RUH"#Pbm+-%B[#%+R3UG)EI[J5(J!!DRJ,Uhl3+R38fh
+l1N*Yqca-hacJ6Pj1G8j@rrS[$%UYqhKQ(%(Y!-SV52X13Hd!dLY)qa4"lIVZF#U
+TibY)qhJpI!!ErrjJ%L"ZrrSJ8!JS!!8!"@FB8QlrrM!Zrrj)`1@)d,J"(#"!,9$
+rqQED-#lrrNC!28$rrM!ZrrkK25K3++hlH$PYqZi!"$PYq[)!*$!ZrriSAdjH6R9
+`k%je6PErjNMR!"JJ$5Ti#33Y32rQ+%JY5Irm5'lrp%+RU541Z[df8)m`,!!D"%!
+!3!a!!!PL!!#H3rS!d0"!d[%!!%l46VS!f'!!!)T1ZJAZB!!!JNkk"M4JHNkk"R"
+JG$mm!"Y1ZJ1N9)pJD#CX!"``%`a!!!CLA%2k!),330,a!!"1d8KZrq`[+`!#6VV
+mc&#2B%![#dkk!-CBMf!fF!!3+`!&28$rkJJV!*!$$QF8$&-!"@FH2blrkNkk!NT
+8Mce!rqT+E[rUC`Sr,[rU6VS$1P52)'hlH+!U)'lrr+8SS#T)E[rd6VVmi&L2)#l
+rjX'0F!"-haJ!6Pj1GIrBrjMrf2qLrpMrS[q)rf,rb[mkrmVrb[r+rd,r5[p3reC
+19[rm,bhl3+RD5'lrr+Pb3LF[,[rm)'hl,NKS!"#SV8SICa"#Tcmm!!'TZ5"I,a#
+S8@!))&9)D2q8U&&1ANje6PB!!%MR!3JSEJ!))'hl,M&m!!J!E%*R,b`!#NKYqbk
+T,$iI)'hl,M&Yqei!E$!(Dd"E3'FHDJC83'FZB$4C3'S`9%"V,$m(,b`!#Nkk!#a
+FMf!H-#`!$J*!#3"Q$#mX!!T1ZJ"1@)pJ##m-6VS!L&L260m3J%jH6R919J!!,``
+SEIXZU&"#*bm-,bi!#$mZ!!bS1dSICa4)E!!3U+-[$$mZ!!a#*kJk6VVkp#KI6Pj
+1G8j@rr`[$#KYqbkS8#YYqd6l*%+R,``[,J!)5'hl)+NV,9rrr'FB5'`!%+LM,``
+r,[rq2blrr%)RU4e1Z[U`+&p1ANje6PB!!%MR!4JSEJ!)IJ!JEIY!)&"+D!!NCJT
+#Cdkkq8*8Mf!+##`!!3!1C`*q!8kkqET)E!!+U(%[,!!+(`F[,IY!UG3JEIY!*P!
+`+`!JX'X!)QC@0h`!r`"'##d!"2YBC`C+,IYBDJJ[,IY!UGPJ1M!V!##`EIYdE"3
+`EIYd,`J`EIYd,`J[,IY!UG&J($!V!#+`EIYfEa)`EIYf,`J`EIYf,`J[,IY!UG&
+-haL!6Pj1G8j@!!"+,IYBDJK`(m"Z!!KJ9$!Z!!J%3!!Z$%!!6'*%3rS!50"!d[%
+!!%l46VS$#'!b6VS$8'!X6VS$M'!Q5Lhl@QF''h`!!IYFF!4J'(!9B"4+,IYDC`a
+#EIVX3QG1ZZ)L9)p`!%jH6RAre2rkrrVrq[rkrrVrq[rkrrVrq[rkrrVrq[rkrrV
+rq[rkrrVrq[rkrrVrb2rJrrVrq[rkrrVrq[rkrrVrq[rkrrVrq[rkrqMrq[rkrrV
+rj2r1rrVr`[rkrq6rq[rkrrVrq[rkrrVrq[rkrmMri2rkrrVrq[rkrrVrq[rkrrV
+rq[rkrrVrq[rSrrVrq[rkrq6rc[rkrm,rq[rN6PB!!%MR"aJJEIY!+&!q,!!J2#`
+!)JJY!!6l@'F!!F`),3!$qeKR#JaZ!(m!#'i!!ET+,IYBDK3JEIYX8UhlE"#Z!!P
+#VIY`B!!"TJaZ!#!!#'`!!0)`,J!)9d!-3!!FBJ!"MN2k!C,330,a!!"1d5!Yqfb
+3!+hlD0'Yqh!VEIYSqf`q,IYd2#hlGQ!!!*S),3!&qeKQ!!#3!!JY!!El@'B!!23
+J,IYXX+hlD'F!!6j6VIYX8UhlF'!!!3bm4fB!!3C64f!!!3#m4fB#8NBq"Q!!!23
+q,IYdB!!!l$iYqhCJ!!$N1LhlGTTYqh4R'L"X!$ifEIYdep!JEIYXB!)3fe(0rr`
+V52YX$'i!"!!)C``JEIYX8UhlE"#m!!T1Z[P%3UhlF'!!!-`),3!&qeKR+,a(CJS
+-EJ!)!!KQ(&0([QhlG'd!!+LmEIYfEJ!!S$m'2`G1Z[6m@)m-EJ!J!!KYCM!YqhD
+3!'hlG(,rdUhlF$"!XSKQ#$mm!!+Tb'"+##d!"IYBCa)`"e*(2`!I,J!*6VVe4&L
+2B$!JEIYX8UhlE"#Z!!N),3!'qeKR'$mm!!%JEIYX5'MrrdkkmY*FMd+Yqh"J-&1
+Yqh#qEIYfE`Bq,IYfB!UqEIYdE!3q,IYd-!H3!'hlG$m!6VVeaP52B!Br2!!#UFK
+-haMJ6Pj1GIlUrZVrq2rirrMqP[lLrrMrq2rirZVrq2rirrMrq2rirrMrq2jirrM
+rq2rirrMrq2jirX,qc[lDrZ)[$#"Yqd!S8%TX!#4R2$!X!##`E!!LE$)),3!%qeK
+R&$!X!##`EIYdE3S`,!!LX'hlGQm)2c`!!UR)B!j1ZJ!32c`!#%kkrBK8MbKI6R8
+[$#"Yqd!S8%TX!#4R-$!X!##`E!!LE#B[,IY!UG9#TkRm3TF`H!U`,`J[2&4&@&4
+1Z[Gq,`#TrNkkpjjBMbKI6R8),3!%qeKR)#"Yqd!J8$!S!##`EIYdE4!JEIY!)&!
+`+!!LX'hlGQm)2c`!!UR)B$*#Tbmi#V3[2&4&@&4)EIY-UIdJ(bY!qe"+J'm5+hJ
++Y2Y)F!#K)L()#V4#VIY-3RJ+X%je6PErr$!mU2fK4Le)rr``2+LIS8Dal[rmCJS
+JEIY8#*!!!!"J+%SYqeYQ)Lmmb!#3!kMp3QF[2,S!N!1Sr8TICJa1ZJ!1,cc3!*!
+$U2e1ANje6PEpeNMR"cK`H+%L+%J[$#mm)!3%J+Mp5Uhl+'F@,bhl+#m-,caB"!L
+FU2dJEIXSS#0J(+K33LF[$#mm-J3%L+Mp5KpQ#KYm!!(l@f!!!6BV62XS5'lrr+K
+d3UF[$%+R3UF[2!3!$!#Sr5CI)'hl3#432bS!5UL(2bS!8+L+F!!3+J"-2`#SL$i
+U!"SJ9#eS!!Mrp#eS!!crq$`ZrrLFE[rd5-D0lIXbF#63E[rf28$rmLmYqe41ZJM
+S)'hl9!L3!!!'@)m[#d+R,c`3!!J)U2d`,[rdd%Fp32r`HJ"J+MmZrr)r,[r`U*0
+)E[h`3QG)E[h`6VSRm&0!9)mqJ+L&-#hl-Y&Zrr"54Ea&EaJ[,IY82c`#!%KZrI"
+1ZJT-5S"2l`!+CVS[#bmm'!!%$+Mp3QF[2,S!N!1Sr8TICJ`JEIY8#"!!"@F!rhi
+[#bmm#!!%K+Mp,blrr+Kc)&3-+!!"!%4Q)N*R,cbk!*!$U2e+AfB8,`a#Td+R3UG
+)E[h@,caJ"45!U2e-hacJ6Pj1G8j@!!"`!"!Z!!NJ6G(!%#MlkNL!!N!!d%jH6R9
+19J!!F!!3,J!*)%h4`"!SqqT)J!*!!-"1ANje6PB!!(!!%#i!#5"0dF!3+2[U5)!
+#3!!$6Pj1G8j@!!"`!"!Z!!NJ6G(!%#MlkNL!!N!!%%jH6R919J!!F!!3,J!*)%h
+4`"!SqqT)J!*!!0K1ANje6PB!!(!!%#i!#5"0dF!3+2[U5)!#3!#!6Pj1G8j@!!"
+`!"!Z!!NJ6G(!%#MlkNL!!N!!h%jH6R919J!!F!!3,J!*)%h4`"!SqqT)J!*!!!K
+1ANje6PB!!(!!%#i!#5"0dF!3+2[U5)!#3!!'6Pj1G8j@!!"`!"!Z!!NJ6G(!%#M
+lkNL!!N!!3%jH6R919J!!F!!3,J!*)%h4`"!SqqT)J!*!!$"1ANje6PB!!(!!%#i
+!#5"0dF"++2[UDJS`,J!)#N!!)'!%-#i!#%jH6R919J!!F!!3,J!*)%h4`!JS!!E
+lkQF+-#i!#!T!!#"J"$!Z!!K1ANje6PEqcNKZrXi[,J!)6VSM(Le!rq"#E[rN3Ll
+rk%(ZrmkJ#8T!8)pR#MYZrplmkR$rB!*`!%jH6R919[h15'lqcLmZ!!K1ZL,Q,8$
+ri%*Zrq4#,[rS5'lpcLmZ!!a1ZL,1,8$rkN(ZrmkJ#dT!6qm!%'F+1flrh[cUF2p
+J!R!!6Pj1G8j@rq`[$%KYr1a)EId%5'lrl%kk!&4+J%r[!!aR(%KYr3a)E[rX6VS
+!a#K!)!a3MfF)#03!!#!-B!*`!#KI6Pj1G8j@!!"+VJ!)CJK"lIcZ,8J!#%KYr3*
+)EId3,bi!#%kk!!C1ANje6PErX%MR!4JSEJ!)*Qi!%$i6,bi!$%kk*04B!"L!,8c
+r`N*ZrmC#,[r+3Qlrc&L28P--8bF2E`3f[!!"[P0Q"(!!B$Br%bmZ!!a)EId@5'`
+!!8kk)Ta2l`!13HlrX+!-$%$re@E+F!!3&$"!5'J!!8KX!!%[$%kk#Rj-lKL!rk4
+1ANje6PB!!%kk#$i[!#mZ!!`[,J!)6VS!"NjH6R919J!!51F$##KZ!!`-&!"bCJC
+q!A`!B#)-&!"hCJCq!R`$B"B-&!"KCJCq!R`*B!SlI!!@r1T`!'!q$#`!BJ!"CK!
+!4J!3$#`!+`!#CKTq!f!@$#`!+`!"CJjq!``X!')!!QB%!%B!%#mZ!"!r"Mm(,bi
+!#%kk!!a-lK$!rr41ANje6PEqcNMR!3Jq,J!1+'i!%#!-CJC`!'!!!2i[$%kk#8*
+)E[l1,bi!#%kk)2JY32rJ3Qlrj%)ZrqJGEJ!0rqP#V[rU#!F!!%r[!!aR-N(Zrmk
+J#%TZrpjQ"J*(rreJ)!aZrp$rhQB-#!F!!QB'!NIrrQ!-1flrh[cUF!"J!!#D3Hl
+rcU!!5QlrhQF@1flrh[cU#!F!!'F'3HlrcU!*F!"JGMPZrqB!"!J(!!&R#%(Zrmk
+J%Q!-#!F!!'B'3HlrcU!4+@lrkJ!D#!F!!fF+#03!!5PX!"S!&JJ(!!4R"!M8!!C
+)H!)!3QG#Tbm-6VS(QN(Y!8)T5!!LF!2!4dr[!!jR$$m(,blri%kk!"KFMdKY!8T
+1ZYHm)!a-lK#!rXC1ANje6PErX#eZ!!Mr`N*ZrmC#,[r+3Qlrc%(Zrl#J$%T!CL3
+),J!%!!eR##eYr4lrd'!),Aa849K8rp!YEIdLrp4"l[q`S!e1ANje51F"#%RYr5C
+q$f!-,`a1ZJIS@)p*l!!Q-!G64dT!CZa-ha#!6R919[r1,``SEJ!)2@`!"2rQ-#i
+!$'F5D`!"%P9!C`!"!'S!!3KJ!!#!,@`!$[rZ,@`!%[rb5Q`!"'m%F!&J!R!!28$
+rqL!X!"D3!+`!%Le!rra"l[r1S!)-E[rCrpjQ(LPZrr`!&LPZrrB!%QF'3QlrhQ!
++#03!"A$rB!!!fNTZrpjQ!!#S#"3!"QB!!+![2!!0!!S[,!!5,b`!$Nkk!C*2l`!
+-B!!!KLeX!!lrlLeX!",rmNTX!!4["(!"B!*`!$e!rrSJ,!!@N!#X!")Y32rmX+`
+!'Q-3,@lrr2rU3HlrcU!55N"Q4JJ8!!CQ&Lmm!!S!$5mX!")[,!!16VS"0%r[!!a
+"l[r1S!0+E[rHCKiJ,[rmX+`!'Q-8+@lrr!!DB!`[$%kk!$Jp32rH@)p+E[rHCb)
+-EJ!#!!aX$#!X!"+4V!!@3U`!%JM8!!3lE[rHr1T`rf!#F!!SAdjH6R919[k`51F
+$1#iZ!!JJ4cCS!!6Aq!01*'X!&(`!2@S!6[r')%F)%!!!CfK"l[k`,8Mr`N)ZrmS
+-DN*%!!KQ*LeV!$Vri%RV!$j`!"!8-%")D!!",`a)E[k`6VS'I(`#6qm!$'!Z$'V
+5e`!)CLBpI!!"rma"l[q`S!a+3'B@)%F`,[r)X'J!"'B%I!&J"P*ZrmaJi#"(2@J
+!"2r)3HlrX+!"5N"Q*!`'!!&Q#%(Zrl#J#@!-$!B!!QB'3HlrX+)*3Ulr`N(Zrl#
+J%c!Zrm"-hac!6Pj1G8j@!!")j`FB,Li!$$`Z!"!k,J!5+'i!#'!+&X8J#j!!M*k
+!+%Y+KfF8,`Fr"Lm-6VS'-LC!)!Y2l`!+CYj-haMJ6Pj1G8j@!!")j`F),Li!$#K
+Z!!Jm,J!3+L`!&TUX!"*+E!!%EJSlI!!6r1T`rf!m,`a1ZJ6F$%B!!9L2CJ6HK@!
+5$%B!!QB'hU`!'Q!'5NCR!Rlr5SGX#MYm!"EmkR$rB!ST4`!@#*3!"A!!60m3i%j
+H6R919J!!3QFJEJ!-,a![,J!)6VVrINjH6R919J!!3QG#TbmZ!!K1Z[pU)'i!#!L
+3!!!%6Pj1G8j@!!!JEJ!)5QJ!"'i+1h`!%rcUF2pJ$#"Z!!JJ+!!@N!#S!"*1ANj
+e6PB!!#"Z!!K+D!!%EJSlI!!6r1T`rf!8)'i!##!S!"D3!+J!%L*Z!!`LJ(!!6Pj
+1G8j@!!")jam)+'i!&#iZ!!`X,J!3,`B["dkY!%)U!%U&CJC`!'!!!53[$%kk'm!
+)&!!"@)pR$!J8!!0Q"LPX!"S!&NTX!!4[CJJ8!!CRB%UX!"*Q@VUX!!TP9(!"X+`
+!#QF3,b`!#LmX!"C1V3"55S"Q2#J&F!'`V!!+C!`[,!!+,`41V3"5Q)!TEJ!)!!i
+T4!!5fD`!&Lm-6VSFiMB!,Sa1ZYEd5N0BMfB!!)TJI!J8!!0R"NUX!"jR2L!X!"*
+6V!!58i"M&L"Z!!JLE!!18U`!$K!3%S"b!")!B"3[$#"Z!!J3%%L!2`"1ZY9i-J"
+FMe*"Cd"i!@!b+#`!%VU%C!)S"5m%,bi!##mX!!j1ZJ1dfD`!$TQX!"*2l`!-CJ`
+[$%kkeLC+3&L2CJVCVJ!)QS4Q!2m35S9R%#m()!A3Ke1!,`"1V3"+R)!J"NcI%2K
+1ANje6PB!!%MR!6JQEJ!1+'i!##4-$'i!!3!-E%*`!'"))#X!%P1V!"*+J'F1)'X
+!$P+V!!j`!"!3B!J[#dkke(*BMci!5N"X$JJ6!!9R",R+CK*`!'!5&-F-4`!+C`C
+6EJ!-CVa#%L!-60mFJ%jH6R919J!!51F"1#KZ!!K(lIdQ*%`J+`!58kX!%NU!C`i
+JD`!18UX!$R!!%""J##m,6VV8%&L22J"+3'`1#"-!"@F%ZFTQ$R!!B!i-4`!+C`3
+8af$!3K)J$%cI()"1ANje6PB!!#"Z!!JJ+!!58kJ!%NU!Ca)JEJ!))QJ!$P+S!!j
+`!"!4B!S[,J!)6VV6YPL26Pj1G8j@!!!JEJ!))#J!%P1S!"*+J'F5)'i!##*S!!j
+5U!!1F!!3%@!+,bi!#%kkdi*BMdjH6R8J,Idi8khp1%U!C`iJEIdd8Uhp0(!!%""
+J#NKYr5C1ZY0D@)p1G8MR!3K*lIfBIJaJ$NTX!!4Q"#!-B"4*l!!Q-!G64dT!CZS
+lI!!Br1T`!%cI%)"1G8j@!!")EJ!3,bi!$#mZ!!K1ZJ*U6Pj1G8j@!!")EJ!-,bi
+!#%kk!!C1ANje6PB!!#mZ!!`[,J!)5'hp6%kk!Mj1ANje6PB!!%KZ!"![,J!-,bi
+!#%kk$B41ANje6PB!!%KZ!!`[,J!)6VS!"NjH6R919J!!,bi!$#mZ!!K)EIdQ6VS
+0@%jH6R919J!!5(J#!%UZ!!aR"(!!B!*`!Mm!,bi!$#mZ!!K1ZJ!'6Pj1G8j@!!"
+)j`-B,Li!%LKZ!!JQEJ!-I!![$%kk'%J`,J!3@)pV+&9!C`4U)Q!)4q`!!Ri"B"a
++KfF8)!YQ&(`",`G1ZXb5*N!J#eL2CJ4`rf!X#"3!!QF1,b`!"NkkcMS)P!!#@)p
++4QF%#03!!LP,!!BT4`!+,`a1ZY18F!"-lKM!rr"1ANje6PB!!%MR!`JSEJ!))!a
+R$Lm-6VSAb#k-6VV6(Q!XIJ"*lIdQI!pJ'!J8!!0R$Lm-6VV6"NT!@)pR!Rlr5H`
+!*M!'8dC+3'EJ-!G-lK$!rr41ANje6PB!!%MR!3JSEJ!)IJ!)P!!(5Q`!"'Fm,`a
+1ZY,)5N"BMfF#I[m[$%kk'3K+3&L2C`*qr`J8!!*R#LmX!!C1ZXem@)p)H!!Q3QF
+[$%kk!)j2l`!+-!G-ha#!6Pj1G5![!!3J3#*[!!JL,`!-B!33f91"C[T1G5![!!3
+J3#*[!!JL,`!-CaDcb')-dF(6`4%K8i&QqNje%0P6J@Ek6R9`!#"[!!3LE`!))Lm
+!$'!#8i&R#V-)CrKP!P@!8S"1GA!")'m!"")[!!NN,`!+B!*6JQF'XKKQq#!)8i"
+1G5![!!3J3")[!!NN,`!+B!33`91#C[T1G8j@rF4)jami+'i!##CZ!!ai!"i65)G
+J!!LS$%F!*@B!"lJYEIpJrH3YEIpNrHK5Lai65)F-4`!YCJJ)lJ!(rH4Jl!a(!#Y
+Q#!MZ!!Epj'$H$%F!)'B)(A`!)2hQB0!-4`!MCJJ)lJ!&rH4J`Ja(!$"Q#!MZ!!6
+pj'#d$%F!+QC!)'i!%&5Z!"!`%$e!rHK+3'`3#1i!"rhN-#lpk%4!28$pk&+,(K0
+)Kf!LF!V"l[hS"N$rd0"(28$pk&+,(K0)K`a(!$"Y"Ja(!$P[hJa(!#jQ6P+,(K0
+)K`a(!#TQ+L"Z!""8VJ!329$pkP+,(K0)Kf!LF!V"l[hU"N$rd0"(28$pkP+,(K0
+)K`a(!$"Y"Ja(!$P[hNTZrHTY"JMZ!!2pj%AZrr4+,[hNDJB)VJ!%rH3`"`4!!%8
+-3!!cBJ!'P%2k"j!!d%$5m3!!6Y%)lJ!#rH45Lai65)GJf!MZ!!(pj&+,(K0)Kf$
++#1i!!2hN8SXH%dL(B,`),J!"rH4R$#"Z!""BVJ!3*K"J$#"Z!""8VJ!30K")``J
+Z!!,pj'F#5-0+Jf`+4)-GI!!YrHCJ3JJZ!!Epj'Fk(A`!+rhQB$)),J!"rH4R$#"
+Z!""BVJ!3*K"J$#"Z!""8VJ!3GJ!f%!JZ!!,pj'F'F!!`!bB!3LlpjJJZ!!2pj'B
+Q##i!"2hNCa!pE[hSrHT+,[hQC`46E[hU$'i!!IhUE!BpI!!"rHTm!'!J5(J!#Lm
+$6Ud!8JB!!$"6LK5!5(J!#Lm$6Ud!5LB!8NC+JfEFB!K6LK5m!$"54VaZrHTYmNS
+ZrHCR!!@d8iS8V[hQ8NCJ!!@S##i!!IhNC``JEJ!3@+i!%#B3B!`JEJ!39+i!%(B
+!0K!),J!#rH4R"R!!-!-Q!!JZ!!2pj'BF##i!"2hNC`BpE[hSrHS-EJ!"rHTX"Me
+m!!(pkR`!B""`"m#$"J!!-&1+&)$QLe*'5S0Ql!JZ!!Apj'FF5NCR'!`5!$"R%P1
++&,`!-&*'B!K6LK5m!$"54VaZrHTYmQ!!"4!)lJ!"rH3)lJ!$rH3pI!!)rHT"lIp
+S,8Mpm'!)3HhrHLe)rI!),J!"rH4R$#"Z!""BVJ!3*K"J$#"Z!""8VJ!3GJ!f%!J
+Z!!,pj'F'F!!`!bB!##i!!rhNCLJ),J!%rH4R%MeZrHMpkJJZ!!Apj'F%9@lpkJa
+Z!!(pkQ`'2A`!!IhUI!"J%R!2`)23V[h`)%"6LK53!1L,8NC+JfEUB!K6LK5m!$"
+54VaZrHTYmJJZ!!Apj'F!"&T6LK5(8iS8[!!`9%CJ!!4+##i!!2hNCaJJEJ!3"Ui
+!N!--!""$l[rd)YJLf#,BB"BJEJ!3"Ui!N!--!""$l[rd)YJLf#,B##i!!rhNCJB
+pI!!'rHS[,[rm,blrq#mZrr4)E[h%2blpkMmm!!&1ZJ88%#lpb%L!d'lpaMe!rH!
+`,[hJ28$phP0!6qm!&'m'2A`!!IhH-#lpi0"ZrHSp32hL-#lpiT!!E[hH$%!"r'm
+!!Ba)H!!(5'hrM%KZrFK1Z[Vf6qm!$'!!!A3),J!!rH4R'#"Z!"!'VJ#3!``!%%2
+Zrr3Lf#,B)YKJ&L"Z!"!'VJ#3!``!%%2Zrr3Lf#,B)YJ),J!$rH4Q"Mem!!EpkKe
+(rHF[,[rm,blrq#mZrr4)E[h%F!(3E[hU28$piMm!3QG1ZJ45F!%p32hJ28$phK!
+ZrFK)J&0!d@lpaNr[!"4J!!$X##i!!2hNCaJJEJ!3"Ui!N!--!""$l[rd)YJLf#,
+BB"BJEJ!3"Ui!N!--!""$l[rd)YJLf#,B##i!!rhNCJJpI!!'rHTJ$%TZrHTQ"Me
+m!!(pkR$qd!FG32hR,blrr#mZrrJ[,[rd5'lpa$!ZrHSp32hL2`"#Cdkk!lT`!6e
+!rH!p32hH%#lpb%L!8d$4E[h'$'lrr2h'6qm!&'dN-#lpaV"ZrHTX'N)ZrHF`,[h
+'d@lpi!aZ!!(pi'`'2@lpi2hH##i!"IhNCL)3,[h)5)#`E[hLE"B3,[h)5)!p32h
+LX'lpi'`'2@lpi2hL$#i!1Ih*EaK#,[hR3Qlpi$em!!(phK!ZrFK)J$e!rH*m!%S
+ZrHGRC%TZrFCX#$!ZrFC%3'!%-#lpaNM!*J"J)%Ki!!S[!dkY!&)'!!!`8iS8J%K
+i!!S[!dkY!%SQ!&*'5S0Qh'!)8iS8[!!`8NB-4J!#EI*+E[h'E!4`,@!#F#Y6LK5
+!8iS8V[hR9%Bk,[hLZQlpi'B-##i!"IhNCJ45E[hJZQlpi'B)8iS8[!!Z8NC+4@m
+@%#lpb%L!X%9Y$#"1d-83+2h)5)"J!R!`8iS8J&0&ZQlphQc+-#lpiT!!4Ga!5Ll
+pa'F)(A`!,IhQB!i),J!'rH4R"Kem!#[pjJJZ!!6pj'FD1Llpk%SZrHCR$&0&B!K
+6LK5m!$"54VT'E[4+,[hQC`!!qP1+&+lpjP*'B!!!lL"Z!""8VJ!38iS8U!!"I!&
+J!!$D)'i!%&LZ!"!N8!JZ!!Apj'FHI!!F'JJZ!!2pj'F!!,UmE[hUE`!!XM`ZrHT
+J!!#U##i!!rhNCJi[#Nkk%JBm!&L2B!!!P$"ZrHS[#%*R,`T1Z[K#,8$pl%r[!!T
+R##`ZrHbFLQ"b2#lpkQ"X)'i!%&LZ!"!N8!JZ!!,pj'F'0)4J!!%###i!!IhNC`J
+`4#5)B!!!mM5%B!!!l!a(!#9Q!!$`)#`!%P1X!"*6J'-3)'`!$P+X!!i3Kh!!%!G
+J#Lm-2`G1ZXN3A)p+3'`'F2pJ!!$#8N4J!!#Z['lpk'a'5Llpj'Y!)#`!%P1X!"*
+6J'-5)'`!$P+X!!j`)"#!FJ!5!'!1,``r2!!J6VV)bM)!A)p+3@`%F2pJHP*%8fl
+pk,aZrHKY`#m--%B[#%Ki!!%[#NkkmN!`4V(!6qm!%'F%F2pJ80K'B$JJ,!!58k`
+!%P1!Ba)JE!!18U`!$R!J%)"b!")!B!i[$$mm!#"1ZXKS-J"FMdT"E!4`rf!B8N4
+54VaZrHKY`P+,(K0)KdT(CJ$h9M!%60mFq%jH6RAlV[m!r$Er!2m!r`$r!2L@r`$
+r!2m!r`$r!2m!r`$r!2m!r`$r!2T#r`$r!2m!r`$r!2m!r`$r!2m!r`$q8[LNqkl
+kp[`fq(ViT2m!r`$iL2m!rY,jQ2S`r`$r!2jQr`$il2m!r`$k6%j@rra)j`-B+'i
+!$$iZ!!T(lJ!39)X-4`!8C3*q%aeZ!!Rrr$e(rrj)E[rm,`X[$$mm!!ZTk``X!$m
+!"@BB3Llrr$em!"2rrNKZrr`[#bm-2c`!#kRV(#`!"%L'B!C5E!!#8dB-4J!"E`J
+-0!!`B!4Rl"P'!!3-,!!`!!9Q#%)83Q`!!Q!f$#`!53!&CK3CI!!$!!3CI!"1!!B
+CI!"'!!GJ'J`X!%i!"@B5'A`!"3!%'A`!33!''A`!6J!(60mB`%jH6R919J!!51F
+!'#KZ!!JQEJ!-B$BJ+`!58kX!%P1!Ba)JD`!18UX!$K!F%)"b!")!B"![#a!F5)!
+r!%kkaY3b!&b25N&X"($rB!C+&'E'F!"-haJ!6Pj1G8j@!!")EIe-,bi!#%kkrja
++3&#2E!4`rf!`)#hpAP1Yr9j6J'-5)'hp@P+Yr9T`#K#!FJ!5!'!35'hp6$mm!!T
+1ZXCf-J"FMc!"6Pj1G8j@!!!JEJ!+)#J!%P1S!"*6J'-B)'i!#L*S!!j5U!!1%#i
+!#4+!FJ!5!'!3,bi!#MmZ!!K1ZXBd-J"FMc!"6Pj1G8j@!!!JEJ!+)#J!%P1S!"*
+6J'-B)'i!#L*S!!j5U!!1%#i!#4+!FJ!5!'!3,bi!#MmZ!!K1ZXAb-J"FMc!"6Pj
+1G8j@!!!J,IeH8khpAP1!Ba3JEIeD8Uhp@K!Z!!N3J()!%J"J%%KYr8`r,J!)6VV
+&Z$)!A)m`!8jH6R919[rB51F2#%*Zrrj#E[rm3QlrqL"Z!!`H%%L(B!!)I!a(!#9
+Q!!,U,@hrP2r`8Ui!$#"Z!!`H%%L($%F!+QB5#1i!"rr`8Ui!$#"Z!!`H%%L(F!!
+3"b"0dF!)+!!%qqTR1JMZ!!Erm(!+`HlrmJC!rp$34ce!rr*5VJ!-)'i!$"i35)G
+`!"!()%h4`!JS!!6lkQE85QlrmQm!#!B`"`4!!$m-3!!jBJ!#B%2k#"$330,a!!"
+1d3MZ!!Irm9+Z!!`JEJ!-(K")Kf$5#1i!"[ra8Ui!$#"Z!!`H%%L(B,i)lJ!&rr&
+5VJ!-)'i!$"i35)GJUJMZ!!Arm&+Z!!`JEJ!-(K")Kf#@I!TJ!!0ZI!"J!!0SI!K
+J!!0FI!TJ!!0@#1i!"[raI""J!!0+#1i!!Ir`2AcrN!2fB!!$9L"Z!!JJ+!!58kJ
+!%NU!Ca)JEJ!))QJ!$P+S!!j`!"!4B!S[,J!)6VV$k&L22J"5E[rkF!!3"b"0dF"
+`"X!SqqTQ[Mmm!!&1ZJHZ9)pJ!!*!8Ui!$#"Z!!`H%%L($%F!AQB5#1i!"2r`8Ui
+!$#"Z!!`H%%L(3QG1ZJGq9)p+4fF!"ZC`!"!(2`"1ZJHJ9)p5VJ!-)'i!$"i35)F
+-4`"GCeJ-4`!YCYBJEJ!-$#J!A3!"CmSJEJ!-%#J!!8L!%L!G3IreG!!8!E4!EV*
+5VJ!-)'i!$"i35)GJ&"!Zrr95,[reFJ!5!$m"6VS(3P52F!!3,[re[N"QiQ#%##i
+!"2r`C`41ZJG))'i!##!S!"*6U!!55S"R%L"Z!!JLD!!18UJ!$R!!%"&J#LmZ!!K
+1ZX,N@)mq!&*ZrrTJ!!&@##i!"[r`CJBpI!!"rr*+,[r`Dd`JEJ!3@+i!%#K3B%!
+JEJ!))#J!%P1S!"*+J'F5)'i!##*S!!j5U!!1F!!3%@!+,bi!#%kk`SjBMci!8N"
+R!!AD5Llrm'X#'-G5E[rk-#lrmP0Zrr*+3'kd5Llrm'X%8QlrrP*ZrraJ!!@H1#l
+rqNM%5Llrm'X!"2a6E[rqB!!%p!a(!#9Q!!@5F!!3"b"0dF"`"X!SqqTR9L"Z!!J
+J+!!58kJ!%NU!Ca)JEJ!))QJ!$P+S!!j`!"!4B!S[,J!)6VV#!PL22J"5E[rkF!!
+3"b"0dF"`"X!SqqTQ[LmZ!!Jr"dkk#VjFMe0ZrrTJ!!8D)'i!##!S!"*6U!!55S"
+R%L"Z!!JLD!!18UJ!$R!!%"&J#LmZ!!K1ZX'X@)mq!#"Z!!ab!")3XN"R%#mZ!!J
+r"dkk#R"FMf!!"1*5E[rkB!!%b!JZ!!Erm'B'2Aarrrrb5Llrm'YL)'i!%&LZ!"!
+S8'"@8flrmMm(6VS&UP525N"R6!MZ!!2rm%SZrr"V!KM(5QlrmQG))'i!##!S!"*
+6U!!55S"R%L"Z!!JLD!!18UJ!$R!!%"&J#LmZ!!K1ZX%@@)mq!&*ZrrS-4rrrCU3
+[,J!)2`G1ZJRFA)p6E[rk##i!!rr`C`!%4%SZrr"V"N)88QlrrP*ZrraJ!!3H#1i
+!![r`##i!"Ir`C`SJEJ!39+i!%$`33QlrpRJ!)'i!##!S!"*6U!!55S"R%L"Z!!J
+LD!!18UJ!$R!!%"&J#LmZ!!K1ZX#5@)mq!&*ZrrT`!"!()%h4`(!'`#MlkQDq##i
+!"[r`CJBpI(rrrr*#E[riB!!"p&0Zrr)`,[rfCb"U$P4!C`!"*'S!!2CJ!!'L9d"
+R!!#%DJ!"Q&*!DPaJ(Mem!!(rpJa(!#eQ#JMZ!!6rm'!!!A`-4`!VC`!"G$em!!2
+rpJa(!$"Q6JMZ!!2rm%TZrr*R!!&D5NCQ$(`)2A`!![rfB!!"5Ja'!""Q!!&#2A`
+!![rfB!!"1$em!!2rpJa(!(KR"Ja(!&KQ$(`3#+i!!rr`B!!"'MS($%8!-'d-$%8
+!1@i'"NArd'!Q$%8!3@d-$%8!@Qi'"NArb@!8$%8!B@d!!5`-43"kEJ!"*!C&rkP
++4QB#I!Um4@m!!43J"%K!`-C)3%T!CJJ`"FM'f)"N"&$ZrrJ)lJ!$rr"J!!#b2Ac
+rr[rf3QlrfN)Zrp`-4`!YCJSGI!!"rpKJ!!#83Llrf!a(!#YR!!#)$%F!-'e+$%F
+!1@j%#1i!!rr`$%F!-'B'5Llrh'FN$#i!%rrFC3i),J!!rr"Q@&*ZrpTJ8P)Zrp`
+3,[rF5)!GK`$F##i!!2r`Cca6E[rDB$B-4`!ZCK!),J!!rr"Q#!MZ!!$rm'!J$%F
+!C@F'$%F!4@C8##i!!rr`Cdam#JLZ!!2rm%*ZrrC+E[rbCdSJEJ!))#J!%P1S!"*
++J'F5)'i!##*S!!j5U!!1F!!3%@!+,bi!#%kk[RTBMci!8QlrqJa(rrpQ!2i),bi
+!#$m(6VS(2Pb28flrqJJZ!!2rm'F!!DB),J!%rr"R'NU%CaC%K!JZ!!,rm'B%5S4
+['Mem!!(rq'!5##i!![r`CJT+K'`'2A`!!Iri##i!!Ir`Ca3`E[rDf)KT"L"%X-K
+R"&$ZrrKJ@%SZrr&U*JJZ!!,rm'F3F!!`",L!Cd)pI!!"rrKJ1M"%Z)KR0$em!!(
+rq'!X##i!"[raCL3),J!#rr"R%(!!-!5iJ'F82A`!!IriB!``4,L)C`BpI!!"rrK
++E[riCe!),J!#rr"R"(J!B#a+,[raD`J),J!"rr"R##Jmrrq!!'!@##i!"[raC`J
+S2)!!N!0J"LJmrrq!!!JZ!!6rm'B#4S3),J!"rr"Q"MYm!#,mkNSZrr"V!!#+)'i
+!%&LZ!"!S8!JZ!!(rm'GD286rfJJZ!!Erm@F'#1i!"Ira##i!"IraCa)[$%KZrpK
+#Cdkk!BC2l`!+B%C+,[raDK3[$%KZrpJr2!J!6VS"E%r[!!TJ,#m-5'lrf$mm%!"
+1ZJ&B6qm!#Q!B##i!"[raC`3SK'!-5Llrm@S%1)4J!ML%8QlrrP*Zrra5VJ!-)'i
+!$"i35)G+4fB!pi*+E[rmCJS-4rrrCJ4`rf!%-#lrrNcI%2"1ANjeq$Ek62T-qNc
+k62T-q'lk62KZqNck62T-qNci)[T-qNck62T-qNck62T-qNck62T-qNciD2T-qNc
+ic[T-qNck62T-qNck62T-qEMi5[KZq'liE[Ikq&$k62T-q!lk62Sfq&EiB[T-qNc
+iI[T-q&ck62T-q'K19J!!3HhrQ(!!)-!J`#$!)-!J`#$!)-!J`%TZ!!KR%"Ym!$l
+rQ4Ym!!(rR%kk!#C1ANje6PB!!(!(`#i!#A)"i5N`,J!)jN!J6G$!JbMrQ%jH6R9
+"lIqB4TK'Q%DB4TK'Q%DB4TK'Q%je6PB!!(!(`#i!#A)"i@N`,J!)jN!J6G$!%#M
+rQ%L!`%&1ANje6PErr%MR!cJq,J!)+'i!#LCZ!!jm-#4,5NGQ"%IU!!*)E[rq2c`
+!&kRV5L`!"'GH,``[#h!*d%Fr!+RV5'lrrMmm!!1Tkbm,5'lrr(!Fd%Fr!+RV5Ql
+rr'`+-#lrr%4!28$rr!aZ!!2rr'F)##i!![rqC`4m5@!3$'i!"IrmCJJ),J!"rrj
+R+$Ym!#,mkJa'!$"Q!N)83Q`!!KPm!!%!""P'!!8[$#m,F!R34cm!UHY+4fB%0+S
+!!NcI(-"1ANje6PB!!%MR!3Jq,J!)5NG["Ja(!!C[#MYm!"EmkR$rB#!J65!(5-$
+PL0(!+'MrZ#"0)!G)`1@)dF!KEJ!+rlJJ$%cI%)"1ANje6PB!!%MR!3Jq,J!)5NG
+["Ja(!!C[#MYm!"EmkR$rB$BJ65!(5-$PL0(!+'MrZ#!-8i"R)#"0)!G)`1@)dF"
+#U2qi)!aQ#%*R6VUi2P522`G1P&52F!"-ha#!6Pj1G6mm!!&1Z[qF3PG1ZVJH9)p
+1G8j@!!![$#KZ!!K+&'S%6VV$Z%TX!!4Q'N(X!!)T5!!'+8J!$R!"+8!!#N(Y!4)
+T5!!L)!`SAdjH6R919J!!51F!'#KZ!!JQEJ!-)%Y3`4E!8J%3('Ei%)%J#%cI'!"
+1ANje6PB!!#mZ!!a1ZJ*i,S![,J!-,bi!#%kk!#`J,J!)6Pj1G8j@!!")H2rr,bi
+!$#mZ!!K1ZJ!3)'i!#!M3!!-J#%jH6R919J!!,``SEJ!)5(J!*N*R,`a1ZZLD1Ac
+rr`!%+@i!$!!1+@i!%!!53Hd"%LP)!#)SE[rm6Pj1G8j@!!"`rdjH6R919J!!5'i
+!%#mZ!!`[,J!)6VS!"NjH6R919[rD,`F[,J!3,bi!$#mZ!!K)E[rD6VVrE&L2,S"
+1ZZK-2J"+3%r[!!aY##"Z!!K#-(!!-!FZ(djH6R919J!!5'i!%#mZ!!`[,J!)6VS
+!"NjH6R919[rD,bi!%#mZ!!`[,J!)5'lrfNkkr[KBMbk!6VVc@%jH6R919J!!3QF
+[,J!))'i!##"S!#*1N!"1ANje6PB!!$mm!!%[,J!))'i!##"S!#*1N!"1ANje6PB
+!!$mm!!)[,J!))'i!##"S!#*1N!"1ANje)'m!"#*[!!JJ#"$CC[a1G5"[!!3LE`!
+))!K+''Em8iJ3f@Em6R8JE`!%)Qm!#(!!B!4+!@F-%KLb'@IfBJ*9J&+!6R8JE`!
+%%Lm!#A!!B!4+''F'XK"Qq#!)6R8JE`!%F2p5J")BC``LE`!)&"PRmV3"C[K1G5"
+[!!4`!")BCa!LE`!)&"PRp,3"C[K6L#!)6R8JE`!%%Lm!#A!!XK"Q!L!)5KKQpNj
+e)'m!"(!!B!Dd!@B+8S!5''F))Qm!#"3CCZj1G5![!!4J"V3"C`K5J#"!)Qm!#")
+CC`B8''EXF!"1G5![!!4Q"L!YrraR-%+Yrr`J3'!'Y!&Q#L!)%KKRk#*[!!J8'@E
+Z%KKR%L*[!!J8'@IdY!&Qq#Y)rra#)%jeF2mJE`!%8S"+''Ek6R919[rm,``SEJ!
++$'lrr`!)CJC`rf!!!)`[$%kkr2*+,!!"@)pU#NUX!"*R@R$rB()J,!!5X+`!#QB
+L5U`!#QFF)#`!%T'X!"C#V!!53H`!"#P)!!i)l!!(!!&J+L!X!!k`V!!'CL![,!!
+5,b`!"L!X!!U3!+`!%Y'X!!i[,!!16VVPI%r[!!`)P!!&8U`!%P1X!!iJE!!1%#i
+!#4#!FJ!5!$!"+&p1ANje!!!5RJ&!!!&19J!!5'hZG%KYrA*1V3%#,Ui!#%KYlVC
+)EIeb6Ud"!NKYlVT)EIeb6Ud"!N*A6Ud!LNjH6R9)EHlm5'hpFNkY!3*)EHmU5'h
+pFNkY!3*)EHp!5'hpFNkY!3*)EHpf5'hpFNkY!3*)EHqX5'hpFNkY!3*)EHrQ5'h
+pFNkY!3*)EI!@5'hpFNkY!3*)EI"15'hpFNkY!3*#9dkY!)T2l`"!6R9)EI"X5'h
+p6%kY!3*)EI#Z5'hp6%kY!3*)EI$S5'h`m%KYr8a1V3%#5'ha&%KYr8a1V3%#5'h
+a4NKYr8a1V3%#5'haFNKYr8a1V3%#5'haU%KYr8a1V3%#5'hah%KYr8a1V3%#6qm
+!4%je,`F[2!!"!!")H!!'6Ud"@LY!k0*3MfB85'hb(NKYrA*1V3%#3PG1V3#+8)p
+q!'!+)%h3ad)Sl(454`a(!2p[m#iI6R919[rq51F$!(i!5'i!#NkY!+Sp3!!)I!&
+BMf!!!@T)EI*+)!C)`1@)d+i!#L"!,a"1V3%L5N"3MfCJ$'d!!HM3CJT)EI*16VV
+qD&L25'hbFP*')!C)`1@)d+i!#L"!,a"1V3&5+d$ShP#2CL3J"NM!jBM3VJ!+)%!
+[%%KYmR4)EIeb6Ud"!N*A6Ud!LNr[!!`lI!!"k0"J!!$X5'hbLL!'5-$PL0#Z!!S
+J3#m36Ud")NT!8)pQE!aY!!(ScQB+5'hbMNkkrHaBMe*')!C)`1@)d+i!#L"!,a"
+)EHML6Ud"'NKYmV*)EHML6Ud"8LY!k0T2l`!3CL3J"NM!jBM3VJ!+)%![%%KYmV4
+)EIeb6Ud"!N*A6Ud!LNr[!!`lI!!"k-jJBJa(!!&Q#NKYmY*1Z[f#@)mJ"NM!jBM
+3VJ!+)%![%%KYkZ"1V3%D5'hbp%KYkZ"1V3&5+d$SeNr[!""Q*#!'5-$PL0#Z!!S
+J3#m35'hbpNKYrA*1V3%#3PG1V3#+6qm!$(i"8NDmEJ!)E3$qNNT(CJ41Z[e55Qh
+ScQBS5'hc%NKYma41V3&5+d$SfP#2CK4)EI-D5'hpFNkY!3*#9dkY!)T3MdcI!-"
+1ANje6PB!!#m((Li!#!`(!$"Y%!`(!$PZ#K!(5)!'32r3B"J-"`""E4!-"`"'EJS
+3"dL!"N$rb@!#F!!Z(djH6R919[pU51F2'(`!HJ"i!#mZ!!K)E[pX6Ud"'NKYmcT
+)E[pX6Ud"-LK!I!"2l`!3B!!"JNT%Cc!S5b!,CJT)EI0!6VVmC&L25'hc@N+R6Ud
+"-LC!)!Y3MfB+5'hcB%kkr%KBMhJ!B$K)EI0k3UG1V3%b+%!J$&#2CJT)EI1!6VV
+m+&L25'hcQN+R6Ud"-LC!)!Y3MfB+5'hcS%kkr!aBMdKYmlS[$%kY!5*+3&#2CJJ
+GNf$XB!!!r%KYml`[$%kY!5*+3&#2CK![#dkY!*SGJ'$X@)pJ!!$F5'hc[Lm-6Ud
+")NT!8)pQ8Lm,6Ud!QMi!)!G)`)(m!'6Y#"f!B1`J"dM!JI`!C-(m!'5H3#!(5-#
+"r!!+j`M30Q$X(B"Jl#!(5-#"r!!+`I`!#Tj!%$CJl0!((B"Jl&L2B(K)EI2!,`a
+1V3%L5N"3MfBd,`Y1V3%k9B"BMfBL(a01Z[jU28$rDKkV!!&1Z[jH%LlrDqN*dJ!
+GJ@$X9)pJ1N)fB1aJ0%KYmm)[$%kY!5*+3&#2CL"k!#m,6Ud"1M"&X)KBMf8+(E0
+3!&$Y8N9Jk(`#h%9J"&0'H!&54R$rd'i!$,"'E!$qGN)fB1a)E[rX5'hVi%kY!4T
+-lKM`re*1ANje6PEq5%MR(`"qrh`!HJ"i!(B!5'hca%KYr8a1V3%#5'hp6%kY!2T
+2l`!-,bhSeMmm!)")E[q!6Ud!kNU!6qm!#QFL5'hcj%KZri"1V3%U5S"3MfB3,bh
+SfNKZri"1V3%+8)pJaLmYk0T)EI2Z6Ud"#NKYmrT)EIe-6Ud"!NKYr8a1V3$k6qm
+!&#mYk0Br2!#!5'lrJ%kY!1T+J%r[!!TR!!*f5'hd(NKZri"1V3%U5S"3MfB!!Q*
+)EI3U5'lrJ%kY!5T+J&#2Cd")EI3b5'lrJ%kY!5T+J&#2C`4f!@#U8NFr2!!"5'l
+rJ%kkr6j)EH[J5'lqE%kY!4SJ6Y$(%@lqE2k!6qm!$Q#!5'hd3%KZri"1V3%U5S"
+3MfF)I[pf!'!!rfK)EI4)5'lrJ%kY!5T+J&#2C`!"-NKYp%a)E[q!6Ud"+NU!8)p
+R"R`(B!!!L%KYp&4)E[q!6Ud"+NU!8)pR"(`'B(")EI4F5'lrJ%kY!5T+J&#2C`4
+m!f"D5'hdBNKZri"1V3%U5S"3MfF%I!4J4%KYp'K)E[q!6Ud"+NU!8)pR"(`&B#j
+)EI4Z5'lrJ%kY!5T+J&#2C`4m!Q!B5'hdG%KZri"1V3%U5S"3MfF%I!&J!R`)2c`
+!!NKZri"1Z[a+5'hVi%KZrQa1V3%D5N02l`!1Cb*`!"!ZrQ`J6G(!%8EXG(!!%#l
+qE#"0dF!4E[jYlA4J!2jdHJ"J4#"1d-83+2k!5)$K5()!%LlqE0""`I`!"L"Yk0)
+4KJJ%)%l3a4!SrS")J1&)FJ!5,[jXd%("r!!')'hSdK'ZrQd)"9*&[N9XZ'!!rL4
+)EI4k5'lrJ%kY!5T+J&#2C`$q%%T$C`T)EI4q6VVi5PL22c`!!NKZri"1Z[Z@5'h
+Vi%KZrQa1V3%D5'lqE%kY!6Si!(S!6qm!%Q!3)%l3a5*1dX86D2jYrPK54A$rd%5
+`4@cSHJ"J3%KZrPK)E[j-6Ud!NNKZrNj)E[j)2c`3%+RV)%l3a4!SrS")J1&)FJ!
+5,[jXd%("r!!'d+hSdL"!)+lq5&#28N@q4@bmB!$pG%KZri")EH[d6Ud"'NcZ!2M
+q0%jH6R919[pJ51FI!(i!2A`!!IpUHJ!pI!!"rfKf!%)ZrfGm!(J!3LlrCN)Zrf9
+#,[pN5'hdZ%KYr8a1V3%#5'hp6%kY!2T2l`!-,bhShMmm!)")E[q!6Ud!kNU!6qm
+!#QF!"DS-,J!Pri"RhNKYp2C)E[q!6Ud"+NU!8)pR!!$#5'hdrNKYr8a1V3%#5'h
+p6%kY!2Sq[!!"5'lrJ%kkqQ*)EH[J5'lrE%kY!4SB,[pXGJ"2l`!BB(T)H!!')!2
+KL()!%J63J5m!6Ud!3Y#Yk0)J3##m!*!%5(J!"L!$iBKb!")%d)%[!%kY!%)JEHM
+53M!)"%Ki!!C`!"!%i8J`3%K`1!"1V3"#d+hSdL"!),`!N!4)H!!'F!!3"1&)-%"
+)F$J!6Ud!3L"Yk0*#-!J%8S--J`#3!rp[!2pqB!$r$%KYp3")E[q!6Ud"+NU!8)p
+R!!+Q5'he"NKYr8a1V3%#5'hp6%kY!2Tq!%KYp3K)E[q!6Ud"+NU!6qm!&'F#IJ&
+)EI815'lrJ%kY!5T+J&#2C`*84c!(C`!!cQX!!-TA3'F-DJ!!`P*!DQjJ!!#55'h
+e&%KZri"1V3%U,8$rB%KYp4T)E[q!6Ud"+V#Zrf"2l`!3C!4#E[pU2c`!!dKZri"
+1Z[NH5'hVi%KZrfa1V3%D'#lrE%TZrfT2l`!1C`iGE[pYrfFF,[pZB!!!KKeZrfl
+rCa`ZrfeJH$mm!!*)E[q!6VVihNKYkq")E[pX6Ud"'KJZrf`F,[pY6qm!$Q"52c`
+!!NKZri"1Z[Li5'hVi%KZrfa1V3%D'#lrE"eZrfhrCdr[!!jJ+Mmm!!*)E[q!6VV
+iN!")EH[J5'lrE%kY!4SB,[pX(@lrEIpR(#lrE8r[!!jf!'"k5(J!"L!$iBKb!")
+%d)%[!%kY!%,3VHM5)%!J[!#3"%Ki!!BJ!q')FJ!5"0#",`"1V3"#)'hSdN)`#!4
+)H!!'F!!3"1&)-%")F$J!6Ud!3Y#Yk0)J3##m!*!%5(J!"R!!%!6K5$"!5(!i!%k
+Y!%)JEHM53M!)"&+$$)-!N!2rE`$rIR!!%!3J6G(!3LMXG!a(!!*RBRB!B&C)H!!
+')!2KL()!%LlrCp#",`"1V3"#d+hSdL"!5(J!"L!$iBKb!")%d)%[!%kY!%,3VHM
+5)N!LN!")H!!')!2KL()!%J63J5m!6Ud!3L"Yk0*#-!J%8S--J`#3!rp[SJa(!!&
+R!2biGJ"J9%Ki!!C`!"!'i8J`3%K`1!"1V3"#d+hSdL"!5(J!"R!!%!6K5$*!5(%
+i!%kY!%,3VHM5)N!LN!")H!!'F!!3"1&)-%")F$J!6Ud!3L"Yk0*#-!J%8S--J`#
+3!rp[T'!!r&4)EI8J5'lrJ%kY!5T+J&#2C`!"i%KYp54)EIe-6Ud"!NKYr8a1V3$
+k5'he*NKZri"1V3%U5S"2l`!8C`JpI!!"rfKJ)NKYp5T)E[q!6Ud"+NU!8)pR"N*
+ZrfKJ#NKYp6*1Z[0-@)p)EI955'lrJ%kY!5T+J&#2C`Ck"f!!!)K)EI9D5'lrJ%k
+Y!5T+J&#2C`4k"Q"`5'heBNKZri"1V3%U5S"3MfF%HJ0J@NKYp@K)E[q!6Ud"+NU
+!8)pR"(S%B%4)EI9Z5'lrJ%kY!5T+J&#2C`4k"@!Z5'heG%KZri"1V3%U5S"3MfF
+%HJ*J'%KYpAT)E[q!6Ud"+NU!8)pR"(S"B!*k#%KYpB")E[q!6Ud"+NU!8)pR5Mm
+m!!*)E[q!6VVek%TZrfKFMfFNF!!3,[pX)%h4`"&m!!(XG(!!%#lrE#"0dF!4E[p
+YlA4J!2X'F!!3,[pX)%h4`%)Sl(4J!2Vd2c`!!dKZri"1Z[@H5'hVi%KZrfa1V3%
+D(@lrE2pQ(@lrEIpP(@lrE[pN5QlrD%r[!!jR2R!!%#lrCZ&)FJ!5,[pPd%("r!!
+')'hSdK'&#!4`!"!ZrfEK5()!%LlrCG""`I`!"L"Yk0)4V[pN#!9J!2U#F!!3,[p
+Qi8Kb!")ZrfA33F(m!!BJEHM53M!)"'!!qQ*)EI@15'lrJ%kY!5T+J&#2C`$k6NK
+YpC41Z['L@)pJ!2T!5'hea%KYr8a1V3%#5'hp6%kY!2T-lJ$irda1ANje6PErk%M
+R(`!q,J!)$%F!3@d'$%F!@Qm-$%F!B@dF$%F!HQi@(A`!3rrX(A`!)2rY(8IrlN)
+ZrqpJGKem!%rrl"em!#$rl5`(5-D0r!"!%!EY#"S(QJ!B"8L%5-5*r!!)%!6R#"B
+&PJ"+"QFHF$$3"Ke!rqj`-0!%(8$rlh!`d!-G32r`3Llrm@!Q5J4R&R!`d!3G32r
+ZF$$3!ae!rqp#,[r`B!a`-0!$(8$rlN)Zrqp)E[rX5'helLmYk0T1V3%#61i!q2r
+86Pj1G8j@ri")j`m!IJ"m!(S!H!&)EIAb5'hp6%kY!3*)EIe-6Ud!qRi!6qm!$'!
+1)%h4ah!!%#MXG0U!8SF-K`#3!rp[kNU&C`!!L%KYpKB[,HMD6Ud"!Ri!8)pJAL"
+0dFG++1adCe)J6G((F!!3+1adkBJJ6G(!5'MS2NKYpM![,HMD6Ud"!Mk(6VVqVNK
+YpMJ[,HMD6Ud"!L"0dFG`!"!SlA3qJ%kkrT*)EIBk,bhSfNkY!3*2l`!F8SF-K`#
+3!rp[QNKYpMi[,HMD6Ud"!P#2IJ"J!!&kH!&m!'!!!94)H!!')!IKL0#',`"1V3"
+#d+hSdL"!5&")HJ(!2c`3#+RVCh4+4'FN5'hf5LmYk0T1V3%#2SG1Z[iL5'hf9Lm
+Yk0T1V3%#H!"2l`!35'hf@LmYk0T1V3%#2SC1Z[hqF!BZJ#!(iBM3KLm!6Ud!3Y#
+Yk0)J3&f25&")E`!%2c`3$URV2aG)EICN,bhSfNkY!3*2l`!8B!!!ZNKi!!BJ"q'
+)d)B[!%kY!%)JEHM55M!)"'F!!*j+4'FN5'hfELmYk0T1V3%#2SG1Z[f55'hfHLm
+Yk0T1V3%#H!"2l`!35(J!"L!(iBM3KLm!6Ud!3L"Yk0)3-!J%5)")`1Q))Nh6`%K
+Tk$j)EICq,bhSfNkY!3)qKNkkr8K)EID',bhSfNkY!3*`"Lk!)!IKL0#',`"1V3"
+#)'hSdR)!%M!)"6k"6VVp(%KYpSJ[,HMD6Ud"!Nr[!"K5KJb'!*!$rfm!rUC+4'B
+15'hfM#mYk0T1V3%#8)p5K`b(!*!$rfm!rS")EIDB,bhSfNkY!3*)EIDH5'hp6%k
+Y!3*)EIe-6Ud!qLkYk0T)EH[d6Ud"#Nr[!"J[,HM@2c`!J%KZri"1V3$U5S"2l`!
++Ca![,HMD5'lrJ%kY!3T3Mf$B60m!m%jH6R8!N!T19[rq6VVZq%kklSS[,J!-2bi
+!#Nkklba1Z[-+5QhSd&b2C`41Z[BU6VVp&LmYk0T1V3$b,UhSeNkY!2*+EHM3@)p
+R#LmYk0j1V3$b@)p+EHM1CM4)EHVJ6Ud!fNT!@)pR#NKYpX41ZZf+@)p)EHVJ5'h
+fi%kY!1*+3&#2C`T)EIEQ6VVYEPL26Pj1G3!!!Li!N!-+!!!"BN*i#NUGcNkk!#4
+#CdKj!!$rrdK[!!4)9dKi!!%L1[rH6V83!#"Y!'a1N!#Tp&Q2,caD49*23QHTS#4
+A@Bm[2%4"9%&#CkQJ)&FJ8#*i#3JN8Q!1-YKQ#M)DB!*#'9(*rrblb@EZUD1TSeQ
+2,ca%8N9-3QHTS#"AS#8J81*!*!eJ"M)BeE83!&()rrLTSdje)&mb'$3BX&KAbIr
+k5N*RrNl`)2`JAc)B0"L`Q&I*rrT+3QIq6[!JqL"I-KJd',"#EJU3!%&Y"Y"!3I!
+!!M!3Crj1m!!!)#m!"#p"!!3L,`!),em!"%MR2!!N!#B"5%,%`bJ!+J&)4FM&e%4
+)3T!$`-(3JNcI!$`L(dje)#m!"#p"!!3L,`!),em!"%MR-3"1ZJ#F60m!M#)I6R8
+J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!(`J!8cI!)`L(dje)#m!"#p"!!3L,`!),em
+!"%MR-3"1ZJ!X60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!!`J!8cI!)`
+L(dje5S"U(%U"DJa%J%5"6VS!)%5"6R9%J%kk!"C%J%5"6R9+J@S+4)&1ZJ!'4)"
+1G5im!!$rrl+!B`BL!(!!6R@`Kf)-J-&)3$)!3N")3%jeXSGL'Li!3N")3)$"5%"
+)4ci!5%H1`6!(5%Fb"dje*!!Q!H+)iSQbKf,iJ-(!Kc)$`X!Z!dK(cX")4p+(C3L
+5JQ)%4)&1G90!B141G3!!!9J!!!&S!!!A`J!!!8J!N!-J!!3r2!!"UI!!NMmm!!'
+Tm!#Q2c`!!DR`!,Sr2!!"UI!!eMmm!!'Tm!%-2c`!!DR`!5`r2!!"UI!"6Mmm!!'
+Tm!&Z2c`!!DR`!LJr2!!"UI!$X$mm!!+Tm!1m2c`!!UR`"&`r2!!#UI!$PMmm!!+
+Tm!4H2c`!!UR`"03r2!!#UI!+T$mm!!+Tm!GH2c`!!UR`&)!r2!!#UI!6f$mm!!+
+Tm"@f2c`!!UR`(K!r2!!#UI!H$$mm!!+Tm#LF2c`!!UR`+03r2!!#UI!`p$mm!!+
+Tm$3'2c`!!UR`-l)r2!!#UI!bIMmm!!+Tm$lf2c`!!UR`6'`r2!!#UI"08Mmm!!+
+Tm%ei2c`!!UR`6KBr2!!#UI"10$mm!!+Tm%jb2c`!!UR`,$3r2!!#UI!X$Mmm!!+
+Tm#S+2c`!!UR`!$`r2!!#UI!5$Mmm!!1Tm!#3!`S!N!-3!*!$%!#3"!%!N!0cMJ!
+!FSi!N!1Q!'9S["H#!*!$(!#Q!!4%394"!*!$+PT&8Nm!N!-f4&*&6!#3!d*$6d4
+&!!-!6P0*@N8!N!0q!!$rrbJ!N!Rrr`J!$#S!N!ErrbJ!$4J!N!8#rrmi!!dJ!*!
+&!rrr1!"F8!#3"3(rra`!E[)!N!ErrbJ!F53!N!6rN!3!!(+!!*!%#Bd:
+
diff --git a/fonts/utilities/adjkerns/examples/eo.kcf b/fonts/utilities/adjkerns/examples/eo.kcf
new file mode 100644
index 0000000000..760a25dcac
--- /dev/null
+++ b/fonts/utilities/adjkerns/examples/eo.kcf
@@ -0,0 +1,34 @@
+% Kerning and ligature configuration for
+% Esperanto virtual fonts, based on DC
+% Semi-official (not yet aproved by TWGMLC)
+KERN H AD LIKE C s
+KERN H 8D LIKE C S
+KERN H A0 LIKE C c
+KERN H 80 LIKE C C
+KERN H A8 LIKE C h
+KERN H 88 LIKE C H
+KERN H A9 LIKE C j
+KERN H 89 LIKE C J
+KERN H A7 LIKE C g
+KERN H 87 LIKE C G
+KERN H B8 LIKE C u
+KERN H 98 LIKE C U
+ADD LIG C s C x -> H AD
+ADD LIG C S C x -> H 8D
+ADD LIG C S C X -> H 8D
+ADD LIG C c C x -> H A0
+ADD LIG C C C x -> H 80
+ADD LIG C C C X -> H 80
+ADD LIG C h C x -> H A8
+ADD LIG C H C x -> H 88
+ADD LIG C H C X -> H 88
+ADD LIG C j C x -> H A9
+ADD LIG C J C x -> H 89
+ADD LIG C J C X -> H 89
+ADD LIG C g C x -> H A7
+ADD LIG C G C x -> H 87
+ADD LIG C G C X -> H 87
+ADD LIG C u C x -> H B8
+ADD LIG C U C x -> H 98
+ADD LIG C U C X -> H 98
+
diff --git a/fonts/utilities/adjkerns/examples/eocr10.vpl b/fonts/utilities/adjkerns/examples/eocr10.vpl
new file mode 100644
index 0000000000..40d546e67d
--- /dev/null
+++ b/fonts/utilities/adjkerns/examples/eocr10.vpl
@@ -0,0 +1,2306 @@
+(DESIGNSIZE R 10.0)
+(COMMENT DESIGNSIZE IS IN POINTS)
+(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)
+(CHECKSUM O 30523766474)
+(FONTDIMEN
+ (SLANT R 0.0)
+ (SPACE R 0.333252)
+ (STRETCH R 0.166626)
+ (SHRINK R 0.111084)
+ (XHEIGHT R 0.43045)
+ (QUAD R 0.999756)
+ (EXTRASPACE R 0.111084)
+ (PARAMETER D 8 R 0.1)
+ (PARAMETER D 9 R 0.0)
+ (PARAMETER D 10 R 0.208282)
+ (PARAMETER D 11 R 0.6831665)
+ (PARAMETER D 12 R 0.694275)
+ (PARAMETER D 13 R 0.039999)
+ )
+(MAPFONT D 16
+ (FONTNAME dcr10)
+ (FONTCHECKSUM O 30523766474)
+ (FONTDSIZE R 10.000000))
+(BOUNDARYCHAR O 27)
+(LIGTABLE
+ (LABEL O 25)
+ (LIG O 55 O 26)
+ (STOP)
+ (LABEL O 33)
+ (KRN O 41 R 0.0778)
+ (KRN O 47 R 0.0778)
+ (KRN O 51 R 0.0778)
+ (KRN O 77 R 0.0778)
+ (KRN O 135 R 0.0778)
+ (LIG C i O 36)
+ (LIG C l O 37)
+ (STOP)
+ (LABEL O 47)
+ (KRN O 41 R 0.1111)
+ (LIG O 47 O 21)
+ (KRN O 77 R 0.1111)
+ (STOP)
+ (LABEL O 54)
+ (LIG O 54 O 22)
+ (STOP)
+ (LABEL O 55)
+ (LIG O 55 O 25)
+ (STOP)
+ (LABEL O 74)
+ (LIG O 74 O 23)
+ (STOP)
+ (LABEL O 76)
+ (LIG O 76 O 24)
+ (STOP)
+ (LABEL C A)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN C T R -0.0833)
+ (KRN C U R -0.0278)
+ (KRN C V R -0.1111)
+ (KRN C W R -0.1111)
+ (KRN C Y R -0.0833)
+ (KRN C t R -0.0278)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (KRN O 230 R -0.0278)
+ (STOP)
+ (LABEL C C)
+ (LIG C X O 200)
+ (LIG C x O 200)
+ (STOP)
+ (LABEL C D)
+ (KRN C A R -0.0278)
+ (KRN C V R -0.0278)
+ (KRN C W R -0.0278)
+ (KRN C X R -0.0278)
+ (KRN C Y R -0.0278)
+ (STOP)
+ (LABEL C F)
+ (KRN C A R -0.1111)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN C a R -0.0833)
+ (KRN C e R -0.0833)
+ (KRN C o R -0.0833)
+ (KRN C r R -0.0833)
+ (KRN C u R -0.0833)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (KRN O 270 R -0.0833)
+ (STOP)
+ (LABEL C G)
+ (LIG C X O 207)
+ (LIG C x O 207)
+ (STOP)
+ (LABEL C H)
+ (LIG C X O 210)
+ (LIG C x O 210)
+ (STOP)
+ (LABEL C I)
+ (KRN C I R 0.0278)
+ (STOP)
+ (LABEL C J)
+ (LIG C X O 211)
+ (LIG C x O 211)
+ (STOP)
+ (LABEL C K)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (STOP)
+ (LABEL C L)
+ (KRN C T R -0.0833)
+ (KRN C V R -0.1111)
+ (KRN C W R -0.1111)
+ (KRN C Y R -0.0833)
+ (STOP)
+ (LABEL C O)
+ (KRN C A R -0.0278)
+ (KRN C V R -0.0278)
+ (KRN C W R -0.0278)
+ (KRN C X R -0.0278)
+ (KRN C Y R -0.0278)
+ (STOP)
+ (LABEL C P)
+ (KRN O 54 R -0.0833)
+ (KRN O 56 R -0.0833)
+ (KRN C A R -0.0833)
+ (KRN C a R -0.0278)
+ (KRN C e R -0.0278)
+ (KRN C o R -0.0278)
+ (KRN O 241 R -0.0278)
+ (KRN O 242 R -0.0278)
+ (KRN O 245 R -0.0278)
+ (KRN O 246 R -0.0278)
+ (KRN O 256 R -0.0278)
+ (KRN O 340 R -0.0278)
+ (KRN O 341 R -0.0278)
+ (KRN O 342 R -0.0278)
+ (KRN O 343 R -0.0278)
+ (KRN O 344 R -0.0278)
+ (KRN O 345 R -0.0278)
+ (KRN O 346 R -0.0278)
+ (KRN O 350 R -0.0278)
+ (KRN O 351 R -0.0278)
+ (KRN O 352 R -0.0278)
+ (KRN O 353 R -0.0278)
+ (KRN O 362 R -0.0278)
+ (KRN O 363 R -0.0278)
+ (KRN O 364 R -0.0278)
+ (KRN O 365 R -0.0278)
+ (KRN O 366 R -0.0278)
+ (KRN O 367 R -0.0278)
+ (STOP)
+ (LABEL C R)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN C T R -0.0833)
+ (KRN C U R -0.0278)
+ (KRN C V R -0.1111)
+ (KRN C W R -0.1111)
+ (KRN C Y R -0.0833)
+ (KRN C t R -0.0278)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (KRN O 230 R -0.0278)
+ (STOP)
+ (LABEL C S)
+ (LIG C X O 215)
+ (LIG C x O 215)
+ (STOP)
+ (LABEL C T)
+ (KRN C A R -0.0833)
+ (KRN C a R -0.0833)
+ (KRN C e R -0.0833)
+ (KRN C o R -0.0833)
+ (KRN C r R -0.0833)
+ (KRN C u R -0.0833)
+ (KRN C y R -0.0278)
+ (KRN O 270 R -0.0833)
+ (STOP)
+ (LABEL C U)
+ (LIG C X O 230)
+ (LIG C x O 230)
+ (STOP)
+ (LABEL C V)
+ (KRN C A R -0.1111)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN C a R -0.0833)
+ (KRN C e R -0.0833)
+ (KRN C o R -0.0833)
+ (KRN C r R -0.0833)
+ (KRN C u R -0.0833)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (KRN O 270 R -0.0833)
+ (STOP)
+ (LABEL C W)
+ (KRN C A R -0.1111)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN C a R -0.0833)
+ (KRN C e R -0.0833)
+ (KRN C o R -0.0833)
+ (KRN C r R -0.0833)
+ (KRN C u R -0.0833)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (KRN O 270 R -0.0833)
+ (STOP)
+ (LABEL C X)
+ (KRN C C R -0.0278)
+ (KRN C G R -0.0278)
+ (KRN C O R -0.0278)
+ (KRN C Q R -0.0278)
+ (KRN O 200 R -0.0278)
+ (KRN O 207 R -0.0278)
+ (STOP)
+ (LABEL C Y)
+ (KRN C A R -0.0833)
+ (KRN C a R -0.0833)
+ (KRN C e R -0.0833)
+ (KRN C o R -0.0833)
+ (KRN C r R -0.0833)
+ (KRN C u R -0.0833)
+ (KRN O 270 R -0.0833)
+ (STOP)
+ (LABEL O 140)
+ (LIG O 140 O 20)
+ (STOP)
+ (LABEL C a)
+ (KRN C j R 0.0555)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 251 R 0.0555)
+ (STOP)
+ (LABEL C b)
+ (KRN C c R 0.0278)
+ (KRN C d R 0.0278)
+ (KRN C e R 0.0278)
+ (KRN C j R 0.0555)
+ (KRN C o R 0.0278)
+ (KRN C q R 0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C x R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 240 R 0.0278)
+ (KRN O 242 R 0.0278)
+ (KRN O 243 R 0.0278)
+ (KRN O 245 R 0.0278)
+ (KRN O 246 R 0.0278)
+ (KRN O 251 R 0.0555)
+ (KRN O 256 R 0.0278)
+ (KRN O 347 R 0.0278)
+ (KRN O 350 R 0.0278)
+ (KRN O 351 R 0.0278)
+ (KRN O 352 R 0.0278)
+ (KRN O 353 R 0.0278)
+ (KRN O 362 R 0.0278)
+ (KRN O 363 R 0.0278)
+ (KRN O 364 R 0.0278)
+ (KRN O 365 R 0.0278)
+ (KRN O 366 R 0.0278)
+ (KRN O 367 R 0.0278)
+ (STOP)
+ (LABEL C c)
+ (KRN C h R -0.0278)
+ (KRN C k R -0.0278)
+ (LIG C x O 240)
+ (KRN O 250 R -0.0278)
+ (STOP)
+ (LABEL C f)
+ (KRN O 41 R 0.0778)
+ (KRN O 47 R 0.0778)
+ (KRN O 51 R 0.0778)
+ (KRN O 77 R 0.0778)
+ (KRN O 135 R 0.0778)
+ (LIG C f O 33)
+ (LIG C i O 34)
+ (LIG C l O 35)
+ (STOP)
+ (LABEL C g)
+ (KRN C j R 0.0278)
+ (LIG C x O 247)
+ (KRN O 251 R 0.0278)
+ (STOP)
+ (LABEL C h)
+ (KRN C b R -0.0278)
+ (KRN C t R -0.0278)
+ (KRN C u R -0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (LIG C x O 250)
+ (KRN C y R -0.0278)
+ (KRN O 266 R -0.0278)
+ (KRN O 267 R -0.0278)
+ (KRN O 270 R -0.0278)
+ (KRN O 371 R -0.0278)
+ (KRN O 372 R -0.0278)
+ (KRN O 373 R -0.0278)
+ (KRN O 374 R -0.0278)
+ (STOP)
+ (LABEL C j)
+ (LIG C x O 251)
+ (STOP)
+ (LABEL C k)
+ (KRN C a R -0.0278)
+ (KRN C c R -0.0278)
+ (KRN C e R -0.0278)
+ (KRN C o R -0.0278)
+ (KRN O 240 R -0.0278)
+ (KRN O 241 R -0.0278)
+ (KRN O 242 R -0.0278)
+ (KRN O 243 R -0.0278)
+ (KRN O 245 R -0.0278)
+ (KRN O 246 R -0.0278)
+ (KRN O 256 R -0.0278)
+ (KRN O 340 R -0.0278)
+ (KRN O 341 R -0.0278)
+ (KRN O 342 R -0.0278)
+ (KRN O 343 R -0.0278)
+ (KRN O 344 R -0.0278)
+ (KRN O 345 R -0.0278)
+ (KRN O 346 R -0.0278)
+ (KRN O 347 R -0.0278)
+ (KRN O 350 R -0.0278)
+ (KRN O 351 R -0.0278)
+ (KRN O 352 R -0.0278)
+ (KRN O 353 R -0.0278)
+ (KRN O 362 R -0.0278)
+ (KRN O 363 R -0.0278)
+ (KRN O 364 R -0.0278)
+ (KRN O 365 R -0.0278)
+ (KRN O 366 R -0.0278)
+ (KRN O 367 R -0.0278)
+ (STOP)
+ (LABEL C m)
+ (KRN C b R -0.0278)
+ (KRN C t R -0.0278)
+ (KRN C u R -0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 266 R -0.0278)
+ (KRN O 267 R -0.0278)
+ (KRN O 270 R -0.0278)
+ (KRN O 371 R -0.0278)
+ (KRN O 372 R -0.0278)
+ (KRN O 373 R -0.0278)
+ (KRN O 374 R -0.0278)
+ (STOP)
+ (LABEL C n)
+ (KRN C b R -0.0278)
+ (KRN C t R -0.0278)
+ (KRN C u R -0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 266 R -0.0278)
+ (KRN O 267 R -0.0278)
+ (KRN O 270 R -0.0278)
+ (KRN O 371 R -0.0278)
+ (KRN O 372 R -0.0278)
+ (KRN O 373 R -0.0278)
+ (KRN O 374 R -0.0278)
+ (STOP)
+ (LABEL C o)
+ (KRN C c R 0.0278)
+ (KRN C d R 0.0278)
+ (KRN C e R 0.0278)
+ (KRN C j R 0.0555)
+ (KRN C o R 0.0278)
+ (KRN C q R 0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C x R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 240 R 0.0278)
+ (KRN O 242 R 0.0278)
+ (KRN O 243 R 0.0278)
+ (KRN O 245 R 0.0278)
+ (KRN O 246 R 0.0278)
+ (KRN O 251 R 0.0555)
+ (KRN O 256 R 0.0278)
+ (KRN O 347 R 0.0278)
+ (KRN O 350 R 0.0278)
+ (KRN O 351 R 0.0278)
+ (KRN O 352 R 0.0278)
+ (KRN O 353 R 0.0278)
+ (KRN O 362 R 0.0278)
+ (KRN O 363 R 0.0278)
+ (KRN O 364 R 0.0278)
+ (KRN O 365 R 0.0278)
+ (KRN O 366 R 0.0278)
+ (KRN O 367 R 0.0278)
+ (STOP)
+ (LABEL C p)
+ (KRN C c R 0.0278)
+ (KRN C d R 0.0278)
+ (KRN C e R 0.0278)
+ (KRN C j R 0.0555)
+ (KRN C o R 0.0278)
+ (KRN C q R 0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C x R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 240 R 0.0278)
+ (KRN O 242 R 0.0278)
+ (KRN O 243 R 0.0278)
+ (KRN O 245 R 0.0278)
+ (KRN O 246 R 0.0278)
+ (KRN O 251 R 0.0555)
+ (KRN O 256 R 0.0278)
+ (KRN O 347 R 0.0278)
+ (KRN O 350 R 0.0278)
+ (KRN O 351 R 0.0278)
+ (KRN O 352 R 0.0278)
+ (KRN O 353 R 0.0278)
+ (KRN O 362 R 0.0278)
+ (KRN O 363 R 0.0278)
+ (KRN O 364 R 0.0278)
+ (KRN O 365 R 0.0278)
+ (KRN O 366 R 0.0278)
+ (KRN O 367 R 0.0278)
+ (STOP)
+ (LABEL C s)
+ (LIG C x O 255)
+ (STOP)
+ (LABEL C t)
+ (KRN C w R -0.0278)
+ (KRN C y R -0.0278)
+ (STOP)
+ (LABEL C u)
+ (KRN C w R -0.0278)
+ (LIG C x O 270)
+ (STOP)
+ (LABEL C v)
+ (KRN C a R -0.0278)
+ (KRN C c R -0.0278)
+ (KRN C e R -0.0278)
+ (KRN C o R -0.0278)
+ (KRN O 240 R -0.0278)
+ (KRN O 241 R -0.0278)
+ (KRN O 242 R -0.0278)
+ (KRN O 243 R -0.0278)
+ (KRN O 245 R -0.0278)
+ (KRN O 246 R -0.0278)
+ (KRN O 256 R -0.0278)
+ (KRN O 340 R -0.0278)
+ (KRN O 341 R -0.0278)
+ (KRN O 342 R -0.0278)
+ (KRN O 343 R -0.0278)
+ (KRN O 344 R -0.0278)
+ (KRN O 345 R -0.0278)
+ (KRN O 346 R -0.0278)
+ (KRN O 347 R -0.0278)
+ (KRN O 350 R -0.0278)
+ (KRN O 351 R -0.0278)
+ (KRN O 352 R -0.0278)
+ (KRN O 353 R -0.0278)
+ (KRN O 362 R -0.0278)
+ (KRN O 363 R -0.0278)
+ (KRN O 364 R -0.0278)
+ (KRN O 365 R -0.0278)
+ (KRN O 366 R -0.0278)
+ (KRN O 367 R -0.0278)
+ (STOP)
+ (LABEL C w)
+ (KRN C a R -0.0278)
+ (KRN C c R -0.0278)
+ (KRN C e R -0.0278)
+ (KRN C o R -0.0278)
+ (KRN O 240 R -0.0278)
+ (KRN O 241 R -0.0278)
+ (KRN O 242 R -0.0278)
+ (KRN O 243 R -0.0278)
+ (KRN O 245 R -0.0278)
+ (KRN O 246 R -0.0278)
+ (KRN O 256 R -0.0278)
+ (KRN O 340 R -0.0278)
+ (KRN O 341 R -0.0278)
+ (KRN O 342 R -0.0278)
+ (KRN O 343 R -0.0278)
+ (KRN O 344 R -0.0278)
+ (KRN O 345 R -0.0278)
+ (KRN O 346 R -0.0278)
+ (KRN O 347 R -0.0278)
+ (KRN O 350 R -0.0278)
+ (KRN O 351 R -0.0278)
+ (KRN O 352 R -0.0278)
+ (KRN O 353 R -0.0278)
+ (KRN O 362 R -0.0278)
+ (KRN O 363 R -0.0278)
+ (KRN O 364 R -0.0278)
+ (KRN O 365 R -0.0278)
+ (KRN O 366 R -0.0278)
+ (KRN O 367 R -0.0278)
+ (STOP)
+ (LABEL C y)
+ (KRN O 54 R -0.0833)
+ (KRN O 56 R -0.0833)
+ (KRN C a R -0.0278)
+ (KRN C e R -0.0278)
+ (KRN C o R -0.0278)
+ (KRN O 241 R -0.0278)
+ (KRN O 242 R -0.0278)
+ (KRN O 245 R -0.0278)
+ (KRN O 246 R -0.0278)
+ (KRN O 256 R -0.0278)
+ (KRN O 340 R -0.0278)
+ (KRN O 341 R -0.0278)
+ (KRN O 342 R -0.0278)
+ (KRN O 343 R -0.0278)
+ (KRN O 344 R -0.0278)
+ (KRN O 345 R -0.0278)
+ (KRN O 346 R -0.0278)
+ (KRN O 350 R -0.0278)
+ (KRN O 351 R -0.0278)
+ (KRN O 352 R -0.0278)
+ (KRN O 353 R -0.0278)
+ (KRN O 362 R -0.0278)
+ (KRN O 363 R -0.0278)
+ (KRN O 364 R -0.0278)
+ (KRN O 365 R -0.0278)
+ (KRN O 366 R -0.0278)
+ (KRN O 367 R -0.0278)
+ (STOP)
+ (LABEL O 240)
+ (KRN C h R -0.0278)
+ (KRN C k R -0.0278)
+ (KRN O 250 R -0.0278)
+ (STOP)
+ (LABEL O 247)
+ (KRN C j R 0.0278)
+ (KRN O 251 R 0.0278)
+ (STOP)
+ (LABEL O 250)
+ (KRN C b R -0.0278)
+ (KRN C t R -0.0278)
+ (KRN C u R -0.0278)
+ (KRN C v R -0.0278)
+ (KRN C w R -0.0278)
+ (KRN C y R -0.0278)
+ (KRN O 266 R -0.0278)
+ (KRN O 267 R -0.0278)
+ (KRN O 270 R -0.0278)
+ (KRN O 371 R -0.0278)
+ (KRN O 372 R -0.0278)
+ (KRN O 373 R -0.0278)
+ (KRN O 374 R -0.0278)
+ (STOP)
+ (LABEL O 270)
+ (KRN C w R -0.0278)
+ (STOP)
+ )
+(CHARACTER O 0
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 1
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 2
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 3
+ (CHARWD R 0.499878)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 4
+ (CHARWD R 0.499878)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 5
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 6
+ (CHARWD R 0.749817)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 7
+ (CHARWD R 0.499878)
+ (CHARHT R 0.621625)
+ )
+(CHARACTER O 10
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 11
+ (CHARWD R 0.499878)
+ (CHARHT R 0.575414)
+ )
+(CHARACTER O 12
+ (CHARWD R 0.27771)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 13
+ (CHARWD R 0.444336)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 14
+ (CHARWD R 0.27771)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 15
+ (CHARWD R 0.27771)
+ (CHARHT R 0.10553)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 16
+ (CHARWD R 0.444336)
+ (CHARHT R 0.53331)
+ (CHARDP R 0.039093)
+ )
+(CHARACTER O 17
+ (CHARWD R 0.444336)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 20
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 21
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 22
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 23
+ (CHARWD R 0.666504)
+ (CHARHT R 0.53331)
+ (CHARDP R 0.039093)
+ )
+(CHARACTER O 24
+ (CHARWD R 0.666504)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 25
+ (CHARWD R 0.499878)
+ (CHARHT R 0.43045)
+ (CHARIC R 0.027771)
+ (COMMENT
+ (LIG O 55 O 26)
+ )
+ )
+(CHARACTER O 26
+ (CHARWD R 0.999756)
+ (CHARHT R 0.43045)
+ (CHARIC R 0.027771)
+ )
+(CHARACTER O 27
+ (CHARWD R 0.0)
+ )
+(CHARACTER O 30
+ (CHARWD R 0.388794)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.055542)
+ )
+(CHARACTER O 31
+ (CHARWD R 0.27771)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 32
+ (CHARWD R 0.305481)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 33
+ (CHARWD R 0.583191)
+ (CHARHT R 0.694275)
+ (CHARIC R 0.077759)
+ (COMMENT
+ (LIG C i O 36)
+ (LIG C l O 37)
+ (KRN O 47 R 0.077759)
+ (KRN O 77 R 0.077759)
+ (KRN O 41 R 0.077759)
+ (KRN O 51 R 0.077759)
+ (KRN O 135 R 0.077759)
+ )
+ )
+(CHARACTER O 34
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 35
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 36
+ (CHARWD R 0.83313)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 37
+ (CHARWD R 0.83313)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 40
+ (CHARWD R 0.499878)
+ (CHARHT R 0.241608)
+ (CHARDP R 0.0971985)
+ )
+(CHARACTER O 41
+ (CHARWD R 0.27771)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 42
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 43
+ (CHARWD R 0.83313)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 44
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.055542)
+ )
+(CHARACTER O 45
+ (CHARWD R 0.83313)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.055542)
+ )
+(CHARACTER O 46
+ (CHARWD R 0.777588)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 47
+ (CHARWD R 0.27771)
+ (CHARHT R 0.694275)
+ (COMMENT
+ (LIG O 47 O 21)
+ (KRN O 77 R 0.111084)
+ (KRN O 41 R 0.111084)
+ )
+ )
+(CHARACTER O 50
+ (CHARWD R 0.388794)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 51
+ (CHARWD R 0.388794)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 52
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ )
+(CHARACTER O 53
+ (CHARWD R 0.777588)
+ (CHARHT R 0.575414)
+ (CHARDP R 0.083313)
+ )
+(CHARACTER O 54
+ (CHARWD R 0.27771)
+ (CHARHT R 0.10553)
+ (CHARDP R 0.194397)
+ (COMMENT
+ (LIG O 54 O 22)
+ )
+ )
+(CHARACTER O 55
+ (CHARWD R 0.333252)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (LIG O 55 O 25)
+ )
+ )
+(CHARACTER O 56
+ (CHARWD R 0.27771)
+ (CHARHT R 0.10553)
+ )
+(CHARACTER O 57
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER C 0
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 1
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 2
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 3
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 4
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 5
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 6
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 7
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 8
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER C 9
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 72
+ (CHARWD R 0.27771)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 73
+ (CHARWD R 0.27771)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 74
+ (CHARWD R 0.777588)
+ (CHARHT R 0.53331)
+ (CHARDP R 0.039093)
+ (COMMENT
+ (LIG O 74 O 23)
+ )
+ )
+(CHARACTER O 75
+ (CHARWD R 0.777588)
+ (CHARHT R 0.366789)
+ (CHARDP R -0.133089)
+ )
+(CHARACTER O 76
+ (CHARWD R 0.777588)
+ (CHARHT R 0.53331)
+ (CHARDP R 0.039093)
+ (COMMENT
+ (LIG O 76 O 24)
+ )
+ )
+(CHARACTER O 77
+ (CHARWD R 0.472107)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 100
+ (CHARWD R 0.777588)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER C A
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER C B
+ (CHARWD R 0.70816)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C C
+ (CHARWD R 0.722046)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C D
+ (CHARWD R 0.763702)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C X R -0.027771)
+ (KRN C W R -0.027771)
+ (KRN C A R -0.027771)
+ (KRN C V R -0.027771)
+ (KRN C Y R -0.027771)
+ )
+ )
+(CHARACTER C E
+ (CHARWD R 0.680389)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C F
+ (CHARWD R 0.652618)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C o R -0.083313)
+ (KRN C e R -0.083313)
+ (KRN C u R -0.083313)
+ (KRN C r R -0.083313)
+ (KRN C a R -0.083313)
+ (KRN C A R -0.111084)
+ (KRN C O R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C Q R -0.027771)
+ )
+ )
+(CHARACTER C G
+ (CHARWD R 0.784531)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C H
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C I
+ (CHARWD R 0.361023)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C I R 0.027771)
+ )
+ )
+(CHARACTER C J
+ (CHARWD R 0.513763)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C K
+ (CHARWD R 0.777588)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C O R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C Q R -0.027771)
+ )
+ )
+(CHARACTER C L
+ (CHARWD R 0.624847)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER C M
+ (CHARWD R 0.916443)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C N
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C O
+ (CHARWD R 0.777588)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C X R -0.027771)
+ (KRN C W R -0.027771)
+ (KRN C A R -0.027771)
+ (KRN C V R -0.027771)
+ (KRN C Y R -0.027771)
+ )
+ )
+(CHARACTER C P
+ (CHARWD R 0.680389)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C A R -0.083313)
+ (KRN C o R -0.027771)
+ (KRN O 256 R -0.027771)
+ (KRN O 362 R -0.027771)
+ (KRN O 363 R -0.027771)
+ (KRN O 364 R -0.027771)
+ (KRN O 365 R -0.027771)
+ (KRN O 366 R -0.027771)
+ (KRN O 367 R -0.027771)
+ (KRN C e R -0.027771)
+ (KRN O 245 R -0.027771)
+ (KRN O 246 R -0.027771)
+ (KRN O 350 R -0.027771)
+ (KRN O 351 R -0.027771)
+ (KRN O 352 R -0.027771)
+ (KRN O 353 R -0.027771)
+ (KRN C a R -0.027771)
+ (KRN O 241 R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 340 R -0.027771)
+ (KRN O 341 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 343 R -0.027771)
+ (KRN O 344 R -0.027771)
+ (KRN O 345 R -0.027771)
+ (KRN O 346 R -0.027771)
+ (KRN O 56 R -0.083313)
+ (KRN O 54 R -0.083313)
+ )
+ )
+(CHARACTER C Q
+ (CHARWD R 0.777588)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER C R
+ (CHARWD R 0.735931)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER C S
+ (CHARWD R 0.55542)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C T
+ (CHARWD R 0.722046)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C y R -0.027771)
+ (KRN C e R -0.083313)
+ (KRN C o R -0.083313)
+ (KRN C r R -0.083313)
+ (KRN C a R -0.083313)
+ (KRN C u R -0.083313)
+ (KRN C A R -0.083313)
+ )
+ )
+(CHARACTER C U
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C V
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C o R -0.083313)
+ (KRN C e R -0.083313)
+ (KRN C u R -0.083313)
+ (KRN C r R -0.083313)
+ (KRN C a R -0.083313)
+ (KRN C A R -0.111084)
+ (KRN C O R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C Q R -0.027771)
+ )
+ )
+(CHARACTER C W
+ (CHARWD R 1.027527)
+ (CHARHT R 0.67543)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C o R -0.083313)
+ (KRN C e R -0.083313)
+ (KRN C u R -0.083313)
+ (KRN C r R -0.083313)
+ (KRN C a R -0.083313)
+ (KRN C A R -0.111084)
+ (KRN C O R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C Q R -0.027771)
+ )
+ )
+(CHARACTER C X
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ (COMMENT
+ (KRN C O R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C Q R -0.027771)
+ )
+ )
+(CHARACTER C Y
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ (CHARIC R 0.024994)
+ (COMMENT
+ (KRN C e R -0.083313)
+ (KRN C o R -0.083313)
+ (KRN C r R -0.083313)
+ (KRN C a R -0.083313)
+ (KRN C u R -0.083313)
+ (KRN C A R -0.083313)
+ )
+ )
+(CHARACTER C Z
+ (CHARWD R 0.610962)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 133
+ (CHARWD R 0.27771)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 134
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 135
+ (CHARWD R 0.27771)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 136
+ (CHARWD R 0.610962)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 137
+ (CHARWD R 0.777588)
+ (CHARDP R 0.232794)
+ )
+(CHARACTER O 140
+ (CHARWD R 0.27771)
+ (CHARHT R 0.694275)
+ (COMMENT
+ (LIG O 140 O 20)
+ )
+ )
+(CHARACTER C a
+ (CHARWD R 0.499878)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C v R -0.027771)
+ (KRN C j R 0.055542)
+ (KRN C y R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C b
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ (COMMENT
+ (KRN C e R 0.027771)
+ (KRN O 245 R 0.027771)
+ (KRN O 246 R 0.027771)
+ (KRN O 350 R 0.027771)
+ (KRN O 351 R 0.027771)
+ (KRN O 352 R 0.027771)
+ (KRN O 353 R 0.027771)
+ (KRN C o R 0.027771)
+ (KRN O 256 R 0.027771)
+ (KRN O 362 R 0.027771)
+ (KRN O 363 R 0.027771)
+ (KRN O 364 R 0.027771)
+ (KRN O 365 R 0.027771)
+ (KRN O 366 R 0.027771)
+ (KRN O 367 R 0.027771)
+ (KRN C x R -0.027771)
+ (KRN C d R 0.027771)
+ (KRN C c R 0.027771)
+ (KRN O 242 R 0.027771)
+ (KRN O 243 R 0.027771)
+ (KRN O 347 R 0.027771)
+ (KRN C q R 0.027771)
+ (KRN C v R -0.027771)
+ (KRN C j R 0.055542)
+ (KRN C y R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C c
+ (CHARWD R 0.444336)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C h R -0.027771)
+ (KRN C k R -0.027771)
+ )
+ )
+(CHARACTER C d
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER C e
+ (CHARWD R 0.444336)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER C f
+ (CHARWD R 0.305481)
+ (CHARHT R 0.694275)
+ (CHARIC R 0.077759)
+ (COMMENT
+ (LIG C i O 34)
+ (LIG C f O 33)
+ (LIG C l O 35)
+ (KRN O 47 R 0.077759)
+ (KRN O 77 R 0.077759)
+ (KRN O 41 R 0.077759)
+ (KRN O 51 R 0.077759)
+ (KRN O 135 R 0.077759)
+ )
+ )
+(CHARACTER C g
+ (CHARWD R 0.499878)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C j R 0.027771)
+ )
+ )
+(CHARACTER C h
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C u R -0.027771)
+ (KRN O 266 R -0.027771)
+ (KRN O 267 R -0.027771)
+ (KRN O 371 R -0.027771)
+ (KRN O 372 R -0.027771)
+ (KRN O 373 R -0.027771)
+ (KRN O 374 R -0.027771)
+ (KRN C b R -0.027771)
+ (KRN C y R -0.027771)
+ (KRN C v R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C i
+ (CHARWD R 0.27771)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER C j
+ (CHARWD R 0.305481)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER C k
+ (CHARWD R 0.527649)
+ (CHARHT R 0.694275)
+ (COMMENT
+ (KRN C a R -0.055542)
+ (KRN O 241 R -0.055542)
+ (KRN O 242 R -0.055542)
+ (KRN O 340 R -0.055542)
+ (KRN O 341 R -0.055542)
+ (KRN O 342 R -0.055542)
+ (KRN O 342 R -0.055542)
+ (KRN O 343 R -0.055542)
+ (KRN O 344 R -0.055542)
+ (KRN O 345 R -0.055542)
+ (KRN O 346 R -0.055542)
+ (KRN C e R -0.027771)
+ (KRN O 245 R -0.027771)
+ (KRN O 246 R -0.027771)
+ (KRN O 350 R -0.027771)
+ (KRN O 351 R -0.027771)
+ (KRN O 352 R -0.027771)
+ (KRN O 353 R -0.027771)
+ (KRN C a R -0.027771)
+ (KRN O 241 R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 340 R -0.027771)
+ (KRN O 341 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 343 R -0.027771)
+ (KRN O 344 R -0.027771)
+ (KRN O 345 R -0.027771)
+ (KRN O 346 R -0.027771)
+ (KRN C o R -0.027771)
+ (KRN O 256 R -0.027771)
+ (KRN O 362 R -0.027771)
+ (KRN O 363 R -0.027771)
+ (KRN O 364 R -0.027771)
+ (KRN O 365 R -0.027771)
+ (KRN O 366 R -0.027771)
+ (KRN O 367 R -0.027771)
+ (KRN C c R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 243 R -0.027771)
+ (KRN O 347 R -0.027771)
+ )
+ )
+(CHARACTER C l
+ (CHARWD R 0.27771)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER C m
+ (CHARWD R 0.83313)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C u R -0.027771)
+ (KRN O 266 R -0.027771)
+ (KRN O 267 R -0.027771)
+ (KRN O 371 R -0.027771)
+ (KRN O 372 R -0.027771)
+ (KRN O 373 R -0.027771)
+ (KRN O 374 R -0.027771)
+ (KRN C b R -0.027771)
+ (KRN C y R -0.027771)
+ (KRN C v R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C n
+ (CHARWD R 0.55542)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C u R -0.027771)
+ (KRN O 266 R -0.027771)
+ (KRN O 267 R -0.027771)
+ (KRN O 371 R -0.027771)
+ (KRN O 372 R -0.027771)
+ (KRN O 373 R -0.027771)
+ (KRN O 374 R -0.027771)
+ (KRN C b R -0.027771)
+ (KRN C y R -0.027771)
+ (KRN C v R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C o
+ (CHARWD R 0.499878)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C e R 0.027771)
+ (KRN O 245 R 0.027771)
+ (KRN O 246 R 0.027771)
+ (KRN O 350 R 0.027771)
+ (KRN O 351 R 0.027771)
+ (KRN O 352 R 0.027771)
+ (KRN O 353 R 0.027771)
+ (KRN C o R 0.027771)
+ (KRN O 256 R 0.027771)
+ (KRN O 362 R 0.027771)
+ (KRN O 363 R 0.027771)
+ (KRN O 364 R 0.027771)
+ (KRN O 365 R 0.027771)
+ (KRN O 366 R 0.027771)
+ (KRN O 367 R 0.027771)
+ (KRN C x R -0.027771)
+ (KRN C d R 0.027771)
+ (KRN C c R 0.027771)
+ (KRN O 242 R 0.027771)
+ (KRN O 243 R 0.027771)
+ (KRN O 347 R 0.027771)
+ (KRN C q R 0.027771)
+ (KRN C v R -0.027771)
+ (KRN C j R 0.055542)
+ (KRN C y R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C p
+ (CHARWD R 0.55542)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ (COMMENT
+ (KRN C e R 0.027771)
+ (KRN O 245 R 0.027771)
+ (KRN O 246 R 0.027771)
+ (KRN O 350 R 0.027771)
+ (KRN O 351 R 0.027771)
+ (KRN O 352 R 0.027771)
+ (KRN O 353 R 0.027771)
+ (KRN C o R 0.027771)
+ (KRN O 256 R 0.027771)
+ (KRN O 362 R 0.027771)
+ (KRN O 363 R 0.027771)
+ (KRN O 364 R 0.027771)
+ (KRN O 365 R 0.027771)
+ (KRN O 366 R 0.027771)
+ (KRN O 367 R 0.027771)
+ (KRN C x R -0.027771)
+ (KRN C d R 0.027771)
+ (KRN C c R 0.027771)
+ (KRN O 242 R 0.027771)
+ (KRN O 243 R 0.027771)
+ (KRN O 347 R 0.027771)
+ (KRN C q R 0.027771)
+ (KRN C v R -0.027771)
+ (KRN C j R 0.055542)
+ (KRN C y R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C q
+ (CHARWD R 0.527649)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER C r
+ (CHARWD R 0.391571)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER C s
+ (CHARWD R 0.394348)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER C t
+ (CHARWD R 0.388794)
+ (CHARHT R 0.621625)
+ (COMMENT
+ (KRN C y R -0.027771)
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C u
+ (CHARWD R 0.55542)
+ (CHARHT R 0.43045)
+ (COMMENT
+ (KRN C w R -0.027771)
+ )
+ )
+(CHARACTER C v
+ (CHARWD R 0.527649)
+ (CHARHT R 0.43045)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C a R -0.055542)
+ (KRN O 241 R -0.055542)
+ (KRN O 242 R -0.055542)
+ (KRN O 340 R -0.055542)
+ (KRN O 341 R -0.055542)
+ (KRN O 342 R -0.055542)
+ (KRN O 342 R -0.055542)
+ (KRN O 343 R -0.055542)
+ (KRN O 344 R -0.055542)
+ (KRN O 345 R -0.055542)
+ (KRN O 346 R -0.055542)
+ (KRN C e R -0.027771)
+ (KRN O 245 R -0.027771)
+ (KRN O 246 R -0.027771)
+ (KRN O 350 R -0.027771)
+ (KRN O 351 R -0.027771)
+ (KRN O 352 R -0.027771)
+ (KRN O 353 R -0.027771)
+ (KRN C a R -0.027771)
+ (KRN O 241 R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 340 R -0.027771)
+ (KRN O 341 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 343 R -0.027771)
+ (KRN O 344 R -0.027771)
+ (KRN O 345 R -0.027771)
+ (KRN O 346 R -0.027771)
+ (KRN C o R -0.027771)
+ (KRN O 256 R -0.027771)
+ (KRN O 362 R -0.027771)
+ (KRN O 363 R -0.027771)
+ (KRN O 364 R -0.027771)
+ (KRN O 365 R -0.027771)
+ (KRN O 366 R -0.027771)
+ (KRN O 367 R -0.027771)
+ (KRN C c R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 243 R -0.027771)
+ (KRN O 347 R -0.027771)
+ )
+ )
+(CHARACTER C w
+ (CHARWD R 0.722046)
+ (CHARHT R 0.43045)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C e R -0.027771)
+ (KRN O 245 R -0.027771)
+ (KRN O 246 R -0.027771)
+ (KRN O 350 R -0.027771)
+ (KRN O 351 R -0.027771)
+ (KRN O 352 R -0.027771)
+ (KRN O 353 R -0.027771)
+ (KRN C a R -0.027771)
+ (KRN O 241 R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 340 R -0.027771)
+ (KRN O 341 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 343 R -0.027771)
+ (KRN O 344 R -0.027771)
+ (KRN O 345 R -0.027771)
+ (KRN O 346 R -0.027771)
+ (KRN C o R -0.027771)
+ (KRN O 256 R -0.027771)
+ (KRN O 362 R -0.027771)
+ (KRN O 363 R -0.027771)
+ (KRN O 364 R -0.027771)
+ (KRN O 365 R -0.027771)
+ (KRN O 366 R -0.027771)
+ (KRN O 367 R -0.027771)
+ (KRN C c R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 243 R -0.027771)
+ (KRN O 347 R -0.027771)
+ )
+ )
+(CHARACTER C x
+ (CHARWD R 0.527649)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER C y
+ (CHARWD R 0.527649)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ (CHARIC R 0.0138855)
+ (COMMENT
+ (KRN C o R -0.027771)
+ (KRN O 256 R -0.027771)
+ (KRN O 362 R -0.027771)
+ (KRN O 363 R -0.027771)
+ (KRN O 364 R -0.027771)
+ (KRN O 365 R -0.027771)
+ (KRN O 366 R -0.027771)
+ (KRN O 367 R -0.027771)
+ (KRN C e R -0.027771)
+ (KRN O 245 R -0.027771)
+ (KRN O 246 R -0.027771)
+ (KRN O 350 R -0.027771)
+ (KRN O 351 R -0.027771)
+ (KRN O 352 R -0.027771)
+ (KRN O 353 R -0.027771)
+ (KRN C a R -0.027771)
+ (KRN O 241 R -0.027771)
+ (KRN O 242 R -0.027771)
+ (KRN O 340 R -0.027771)
+ (KRN O 341 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 342 R -0.027771)
+ (KRN O 343 R -0.027771)
+ (KRN O 344 R -0.027771)
+ (KRN O 345 R -0.027771)
+ (KRN O 346 R -0.027771)
+ (KRN O 56 R -0.083313)
+ (KRN O 54 R -0.083313)
+ )
+ )
+(CHARACTER C z
+ (CHARWD R 0.444336)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 173
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 174
+ (CHARWD R 0.27771)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 175
+ (CHARWD R 0.499878)
+ (CHARHT R 0.749817)
+ (CHARDP R 0.249939)
+ )
+(CHARACTER O 176
+ (CHARWD R 0.610962)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 177
+ (CHARWD R 0.333252)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 200
+ (CHARWD R 0.722046)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.111084)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C C)))
+(CHARACTER O 201
+ (CHARWD R 0.749817)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.170097)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 202
+ (CHARWD R 0.722046)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 203
+ (CHARWD R 0.722046)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 204
+ (CHARWD R 0.763702)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 205
+ (CHARWD R 0.680389)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 206
+ (CHARWD R 0.680389)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 207
+ (CHARWD R 0.784529)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.142326)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C G)))
+(CHARACTER O 210
+ (CHARWD R 0.749817)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.124969)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C H)))
+(CHARACTER O 211
+ (CHARWD R 0.513762)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.006943)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C J)))
+(CHARACTER O 212
+ (CHARWD R 0.624847)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 213
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 214
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 215
+ (CHARWD R 0.555420)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.027771)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C S)))
+(CHARACTER O 216
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 217
+ (CHARWD R 0.735931)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 220
+ (CHARWD R 0.735931)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 221
+ (CHARWD R 0.55542)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 222
+ (CHARWD R 0.55542)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 223
+ (CHARWD R 0.55542)
+ (CHARHT R 0.897003)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 224
+ (CHARWD R 0.722046)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 225
+ (CHARWD R 0.722046)
+ (CHARHT R 0.897003)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 226
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 227
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 230
+ (CHARWD R 0.749817)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.124969)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 10)
+ (POP)
+ (SETCHAR C U)))
+(CHARACTER O 231
+ (CHARWD R 0.610962)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 232
+ (CHARWD R 0.610962)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 233
+ (CHARWD R 0.610962)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 234
+ (CHARWD R 0.860901)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 235
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 236
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 237
+ (CHARWD R 0.444336)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 240
+ (CHARWD R 0.444336)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R -0.027771)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.472107)
+ (SETCHAR C c)))
+(CHARACTER O 241
+ (CHARWD R 0.499878)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 242
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 243
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 244
+ (CHARWD R 0.674835)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 245
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 246
+ (CHARWD R 0.444336)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 247
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ (MAP
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.499878)
+ (SETCHAR C g)))
+(CHARACTER O 250
+ (CHARWD R 0.555420)
+ (CHARHT R 0.958099)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.027771)
+ (MOVEDOWN R -0.263824)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C h)))
+(CHARACTER O 251
+ (CHARWD R 0.305481)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ (MAP
+ (MOVERIGHT R -0.097198)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.402679)
+ (SETCHAR O 32)))
+(CHARACTER O 252
+ (CHARWD R 0.27771)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 253
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 254
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 255
+ (CHARWD R 0.394347)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R -0.052765)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.447113)
+ (SETCHAR C s)))
+(CHARACTER O 256
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 257
+ (CHARWD R 0.391571)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 260
+ (CHARWD R 0.391571)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 261
+ (CHARWD R 0.394348)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 262
+ (CHARWD R 0.394348)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 263
+ (CHARWD R 0.394348)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 264
+ (CHARWD R 0.411011)
+ (CHARHT R 0.621625)
+ )
+(CHARACTER O 265
+ (CHARWD R 0.388794)
+ (CHARHT R 0.621625)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 266
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 267
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 270
+ (CHARWD R 0.555420)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R 0.027771)
+ (SELECTFONT D 16)
+ (SETCHAR O 10)
+ (MOVERIGHT R -0.527649)
+ (SETCHAR C u)))
+(CHARACTER O 271
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 272
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 273
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 274
+ (CHARWD R 0.583191)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 275
+ (CHARWD R 0.27771)
+ (CHARHT R 0.499878)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 276
+ (CHARWD R 0.472107)
+ (CHARHT R 0.499878)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 277
+ (CHARWD R 0.638733)
+ (CHARHT R 0.694275)
+ )
+(CHARACTER O 300
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 301
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 302
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 303
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 304
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 305
+ (CHARWD R 0.749817)
+ (CHARHT R 0.8497925)
+ (COMMENT
+ (KRN C t R -0.027771)
+ (KRN C C R -0.027771)
+ (KRN C O R -0.027771)
+ (KRN C G R -0.027771)
+ (KRN C U R -0.027771)
+ (KRN C Q R -0.027771)
+ (KRN C T R -0.083313)
+ (KRN C Y R -0.083313)
+ (KRN C V R -0.111084)
+ (KRN C W R -0.111084)
+ )
+ )
+(CHARACTER O 306
+ (CHARWD R 0.902557)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 307
+ (CHARWD R 0.722046)
+ (CHARHT R 0.67543)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 310
+ (CHARWD R 0.680389)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 311
+ (CHARWD R 0.680389)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 312
+ (CHARWD R 0.680389)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 313
+ (CHARWD R 0.680389)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 314
+ (CHARWD R 0.361023)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 315
+ (CHARWD R 0.361023)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 316
+ (CHARWD R 0.361023)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 317
+ (CHARWD R 0.361023)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 320
+ (CHARWD R 0.763702)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 321
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 322
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 323
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 324
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 325
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 326
+ (CHARWD R 0.777588)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 327
+ (CHARWD R 1.013641)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 330
+ (CHARWD R 0.777588)
+ (CHARHT R 0.731766)
+ (CHARDP R 0.048599)
+ )
+(CHARACTER O 331
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 332
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 333
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 334
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ )
+(CHARACTER O 335
+ (CHARWD R 0.749817)
+ (CHARHT R 0.897003)
+ (CHARIC R 0.024994)
+ )
+(CHARACTER O 336
+ (CHARWD R 0.624847)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 337
+ (CHARWD R 1.11084)
+ (CHARHT R 0.67543)
+ )
+(CHARACTER O 340
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 341
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 342
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 343
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 344
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 345
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 346
+ (CHARWD R 0.722046)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 347
+ (CHARWD R 0.444336)
+ (CHARHT R 0.43045)
+ (CHARDP R 0.170097)
+ )
+(CHARACTER O 350
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 351
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 352
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 353
+ (CHARWD R 0.444336)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 354
+ (CHARWD R 0.27771)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 355
+ (CHARWD R 0.27771)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 356
+ (CHARWD R 0.27771)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 357
+ (CHARWD R 0.333252)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 360
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ (CHARIC R 0.553343)
+ )
+(CHARACTER O 361
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 362
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 363
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 364
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 365
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 366
+ (CHARWD R 0.499878)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 367
+ (CHARWD R 0.777588)
+ (CHARHT R 0.43045)
+ )
+(CHARACTER O 370
+ (CHARWD R 0.499878)
+ (CHARHT R 0.53331)
+ (CHARDP R 0.0971985)
+ )
+(CHARACTER O 371
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 372
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 373
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 374
+ (CHARWD R 0.55542)
+ (CHARHT R 0.64151)
+ )
+(CHARACTER O 375
+ (CHARWD R 0.527649)
+ (CHARHT R 0.64151)
+ (CHARDP R 0.194397)
+ (CHARIC R 0.0138855)
+ )
+(CHARACTER O 376
+ (CHARWD R 0.55542)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ )
+(CHARACTER O 377
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ )
+
diff --git a/fonts/utilities/adjkerns/examples/eotest.tex b/fonts/utilities/adjkerns/examples/eotest.tex
new file mode 100644
index 0000000000..958997fb13
--- /dev/null
+++ b/fonts/utilities/adjkerns/examples/eotest.tex
@@ -0,0 +1,22 @@
+\magnification=1200
+\font\myfont=eocr10
+\myfont
+Berto staras antaux la vendejo. Sxi estas rigardanta la
+montran fenestregon. Si vidas multajn obiektojn. En la
+montra fenestrego trovigxas skatoloj kai faruno. Sub
+klosxo kusxas fromagxo, kiu havas multajn truojn. Ankaux
+botelojn sxi estas vidanta. La boteloj, kiujn sxi estas
+rigardanta, estas egale grandaj. En la mezo de la
+fenestrego pendas afisxo, sur kiu estas skribita la
+frazo: ,,Cxi tie oni parolas Esperanton``. La pordo
+de la vendejo estas malfermita. En la vendejo en angulo
+oni vidas barelon kun haringoj. Haringoj estas fisxoj.
+La fromagxa klosxo estas farita el vitro. La posedanto
+de la vendejo nun estas vendanta fumajxojn kaj cindrujon
+al sinjoro. Berto demandas la vendistinon, cxu cxokolado
+kaj dolcxajxoj estas haveblaj. La vendistino neas tion.
+Ankaux teo, kafo kaj rizo ne plu estas haveblaj. Vino
+estas trinkajxo. Berto volas acxeti unue fromagxon kaj
+due haringojn. La acxetita fromagxo kostas unu marko. Nun
+sxi estas portanta la acxetitan hejmen.
+\end
diff --git a/fonts/utilities/adjkerns/examples/esperanto-wannabe.tex b/fonts/utilities/adjkerns/examples/esperanto-wannabe.tex
new file mode 100644
index 0000000000..c0d1b55d5e
--- /dev/null
+++ b/fonts/utilities/adjkerns/examples/esperanto-wannabe.tex
@@ -0,0 +1,15 @@
+\font\f=dcr10
+\input qdtexvpl
+\texvpl{^^ad}{\f\^s}
+\texvpl{^^8d}{\f\^S}
+\texvpl{^^a0}{\f\^c}
+\texvpl{^^80}{\f\^C}
+\texvpl{^^a8}{\f\^h}
+\texvpl{^^88}{\f\^H}
+\texvpl{^^a9}{\f\^\j}
+\texvpl{^^89}{\f\^J}
+\texvpl{^^a7}{\f\^g}
+\texvpl{^^87}{\f\^G}
+\texvpl{^^b8}{\f\u u}
+\texvpl{^^98}{\f\u U}
+\bye
diff --git a/fonts/utilities/adjkerns/examples/esperanto-wannabe.vpl b/fonts/utilities/adjkerns/examples/esperanto-wannabe.vpl
new file mode 100644
index 0000000000..fbfba59079
--- /dev/null
+++ b/fonts/utilities/adjkerns/examples/esperanto-wannabe.vpl
@@ -0,0 +1,138 @@
+(MAPFONT D 16
+ (FONTNAME dcr10)
+ (FONTCHECKSUM O 30523766474)
+ (FONTDSIZE R 10.000000))
+(CHARACTER O 255
+ (CHARWD R 0.394347)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R -0.052765)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.447113)
+ (SETCHAR C s)))
+(CHARACTER O 215
+ (CHARWD R 0.555420)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.027771)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C S)))
+(CHARACTER O 240
+ (CHARWD R 0.444336)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R -0.027771)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.472107)
+ (SETCHAR C c)))
+(CHARACTER O 200
+ (CHARWD R 0.722046)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.111084)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C C)))
+(CHARACTER O 250
+ (CHARWD R 0.555420)
+ (CHARHT R 0.958099)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.027771)
+ (MOVEDOWN R -0.263824)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C h)))
+(CHARACTER O 210
+ (CHARWD R 0.749817)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.124969)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C H)))
+(CHARACTER O 251
+ (CHARWD R 0.305481)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ (MAP
+ (MOVERIGHT R -0.097198)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.402679)
+ (SETCHAR O 32)))
+(CHARACTER O 211
+ (CHARWD R 0.513762)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.006943)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C J)))
+(CHARACTER O 247
+ (CHARWD R 0.499878)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.194397)
+ (MAP
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (MOVERIGHT R -0.499878)
+ (SETCHAR C g)))
+(CHARACTER O 207
+ (CHARWD R 0.784529)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.142326)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 2)
+ (POP)
+ (SETCHAR C G)))
+(CHARACTER O 270
+ (CHARWD R 0.555420)
+ (CHARHT R 0.694275)
+ (CHARDP R 0.000000)
+ (MAP
+ (MOVERIGHT R 0.027771)
+ (SELECTFONT D 16)
+ (SETCHAR O 10)
+ (MOVERIGHT R -0.527649)
+ (SETCHAR C u)))
+(CHARACTER O 230
+ (CHARWD R 0.749817)
+ (CHARHT R 0.939255)
+ (CHARDP R 0.000000)
+ (MAP
+ (PUSH)
+ (MOVERIGHT R 0.124969)
+ (MOVEDOWN R -0.244980)
+ (SELECTFONT D 16)
+ (SETCHAR O 10)
+ (POP)
+ (SETCHAR C U)))
+
diff --git a/fonts/utilities/afmtopl/clark/aftopl.1 b/fonts/utilities/afmtopl/clark/aftopl.1
new file mode 100644
index 0000000000..3162a230b3
--- /dev/null
+++ b/fonts/utilities/afmtopl/clark/aftopl.1
@@ -0,0 +1,77 @@
+.\" $Header: /u/jjc/dvitops/RCS/aftopl.1,v 1.1 89/02/01 09:06:36 jjc Rel $
+.TH AFTOPL L "10 December 1988"
+.SH NAME
+aftopl \- convert an AFM file to a TeX PL file
+.SH SYNOPSIS
+.B aftopl
+[
+.BI \-e encoding
+]
+.I afmfile
+[
+.I plfile
+]
+.SH DESCRIPTION
+.B aftopl
+converts an AFM (Adobe Font Metric) file to a TeX PL (Property List) file.
+An extension of
+.B .afm
+can be omitted from
+.IR afmfile .
+An extension of
+.B .pl
+can be omitted from
+.IR plfile .
+If
+.I plfile
+is omitted, it will be derived from
+.I afmfile
+by replacing the extension of
+.I afmfile
+by
+.BR .pl .
+The PL file can be converted to the TFM file needed by TeX by the pltotf
+utility.
+.SH OPTIONS
+.TP
+.BI \-e encoding
+Produce a PL file suitable for the font when reencoded using
+.IR encoding .
+There should be a file called
+.IB encoding .enc
+in the same place that TFM files are kept.
+This should give the PostScript name of each element of the encoding vector
+(without a leading
+.BR / ).
+Names should be separated by white space.
+Use the name
+.B .notdef
+for empty elements of the vector.
+.SH FILES
+.B /usr/local/tex/fonts/*.enc
+.SH "SEE ALSO"
+.BR tex (L),
+.BR pltotf (L),
+.BR dvitops (L),
+.IR "PostScript Language Reference Manual" .
+.SH BUGS
+.LP
+The same character must not occur more than once in the encoding vector.
+.LP
+There is no single `right' way to generate a PL file from an AFM file.
+.B aftopl
+tries to do something reasonable.
+If you don't like the results, you should feel free to edit the PL file.
+.LP
+If a composite character is included in the encoding vector, then all
+of its components must also be included; for example, if
+.B aacute
+occurs
+then so must
+.B a
+and
+.BR acute .
+.B aftopl
+does not check this.
+.SH AUTHOR
+James Clark <jjc@jclark.uucp>
diff --git a/fonts/utilities/afmtopl/clark/aftopl.c b/fonts/utilities/afmtopl/clark/aftopl.c
new file mode 100644
index 0000000000..6e9aa5cd66
--- /dev/null
+++ b/fonts/utilities/afmtopl/clark/aftopl.c
@@ -0,0 +1,510 @@
+static char rcsid[] = "$Header: /u/jjc/dvitops/RCS/aftopl.c,v 1.3 89/02/22 11:40:31 jjc Rel $";
+
+#include "util.h"
+
+#define MAXNAMES 500
+#define NOT_DEFINED 100000.0
+#ifndef PI
+#define PI 3.14159265358979324
+#endif
+
+struct ligatures {
+ char *ch;
+ char *succ;
+ char *lig;
+};
+
+char *program_name = "aftopl";
+
+static int lineno = 0;
+
+FILE *infp;
+FILE *outfp;
+#ifdef PROTO
+int lookup(const char *);
+char *getkeyvalue(char *, int);
+void scan_char_metric(char *);
+void compute_font_dimens(void);
+void do_kern_pairs(int);
+void do_char_metrics(int);
+void do_afms(void);
+void print_font_dimens(void);
+void do_encoding(char *);
+void print_char_metrics(void);
+void print_lig_kerns(void);
+void do_ligatures(struct ligatures *);
+#endif
+
+#define bad_afm_file() message(FATAL_ERROR, "bad afm file, line %d", lineno)
+
+struct lig_kern_list {
+ struct lig_kern_list *next;
+ int succ;
+ int lig; /* -1 if its a kern */
+ double x;
+};
+
+
+struct {
+ struct lig_kern_list *p;
+ char *name;
+ int code;
+ double llx;
+ double lly;
+ double urx;
+ double ury;
+ double wx;
+} table[MAXNAMES];
+
+struct {
+ int is_fixed_pitch;
+ double italic_angle;
+ double x_height;
+ /* we use max(urx - wx + italic_correction_space, 0)
+ as the italic correction for each character */
+ double italic_correction_space;
+ double normal_space;
+ double normal_stretch;
+ double normal_shrink;
+ double extra_space;
+ double quad;
+ double slant;
+} font = { 0, 0.0, NOT_DEFINED, NOT_DEFINED, NOT_DEFINED, NOT_DEFINED,
+NOT_DEFINED, NOT_DEFINED, NOT_DEFINED, NOT_DEFINED};
+
+
+
+int lookup(s)
+const char *s;
+{
+ int i;
+ for (i = 0; i < MAXNAMES; i++)
+ if (table[i].name == NULL)
+ break;
+ else if (strcmp(table[i].name, s) == 0)
+ return i;
+ if (i == MAXNAMES)
+ message(FATAL_ERROR, "too many names");
+ if ((table[i].name = malloc(strlen(s) + 1)) == NULL)
+ message(FATAL_ERROR, "out of memory");
+ strcpy(table[i].name, s);
+ table[i].code = -2;
+ table[i].llx = table[i].lly = 0.0;
+ table[i].urx = table[i].ury = 0.0;
+ table[i].wx = 0.0;
+ table[i].p = NULL;
+ return i;
+}
+
+
+char *getkeyvalue(s, c)
+char *s;
+char c;
+{
+ while (*s != '\0') {
+ while (isspace(*s))
+ s++;
+ if (*s == c)
+ return s + 1;
+ while (*s != '\0')
+ if (*s++ == ';')
+ break;
+ }
+ return NULL;
+}
+
+void scan_char_metric(s)
+char *s;
+{
+ char name[128];
+ int code, n;
+ double llx, lly, urx, ury;
+ double wx, wy;
+ char *p;
+ while (isspace(*s))
+ s++;
+ if (*s == '\0') /* ignore blank line */
+ return;
+ p = getkeyvalue(s, 'N');
+ if (p == NULL)
+ bad_afm_file();
+ /* sscanf(p, " %[A-Za-z0-9]", name); */
+ /* Microsoft C scanf doesn't understand %[ */
+ sscanf(p, "%s", name);
+ if ((p = strchr(name, ';')) != NULL)
+ *p = '\0';
+ if ((p = getkeyvalue(s, 'C')) == NULL)
+ bad_afm_file();
+ if (sscanf(p, "%d", &code) != 1)
+ bad_afm_file();
+ p = getkeyvalue(s, 'B');
+ if (p == NULL)
+ bad_afm_file();
+ if (sscanf(p, "%lg %lg %lg %lg", &llx, &lly, &urx, &ury) != 4)
+ bad_afm_file();
+ p = getkeyvalue(s, 'W');
+ if (p == NULL)
+ bad_afm_file();
+ if (*p == 'X') {
+ if (sscanf(p+1, "%lg", &wx) != 1)
+ bad_afm_file();
+ wy = 0.0;
+ }
+ else if (sscanf(p, "%lg %lg", &wx, &wy) != 2)
+ bad_afm_file();
+ n = lookup(name);
+ table[n].code = code;
+ table[n].wx = wx;
+ table[n].llx = llx;
+ table[n].lly = lly;
+ table[n].urx = urx;
+ table[n].ury = ury;
+ while ((p = getkeyvalue(s, 'L')) != NULL) {
+ char successor[128];
+ char ligature[128];
+ struct lig_kern_list *ptr;
+ if (sscanf(p, " %s %s", successor, ligature) != 2)
+ bad_afm_file();
+ else if ((s = strchr(ligature, ';')) != NULL)
+ *s = '\0';
+ if ((s = strchr(p, ';')) == NULL)
+ bad_afm_file();
+ s++;
+ if ((ptr = (struct lig_kern_list *)malloc(sizeof(struct lig_kern_list))) == NULL)
+ message(FATAL_ERROR, "out of memory");
+ ptr->succ = lookup(successor);
+ ptr->lig = lookup(ligature);
+ ptr->next = table[n].p;
+ table[n].p = ptr;
+ }
+}
+
+
+void compute_font_dimens()
+{
+ if (font.normal_space == NOT_DEFINED) {
+ int n = lookup("space");
+ if (table[n].code == -2)
+ message(FATAL_ERROR, "no char metric for space character");
+ else
+ font.normal_space = table[n].wx;
+ }
+ if (font.quad == NOT_DEFINED)
+ font.quad = (font.is_fixed_pitch?2.0:3.0)*font.normal_space;
+ if (font.italic_correction_space == NOT_DEFINED)
+ font.italic_correction_space = font.normal_space/12.0;
+ if (font.normal_shrink == NOT_DEFINED)
+ font.normal_shrink = font.is_fixed_pitch ? 0.0 :
+ font.normal_space/3.0;
+ if (font.normal_stretch == NOT_DEFINED)
+ font.normal_stretch = font.is_fixed_pitch ? 0.0 :
+ font.normal_space/2.0;
+ if (font.extra_space == NOT_DEFINED)
+ font.extra_space = (font.is_fixed_pitch ? 1.0 :0.5)
+ *font.normal_space;
+ if (font.slant == NOT_DEFINED)
+ if (font.italic_angle == 0.0)
+ font.slant = 0.0;
+ else
+ font.slant = sin(-font.italic_angle*PI/180.0);
+ if (font.x_height == NOT_DEFINED)
+ font.x_height = table[lookup("x")].ury;
+}
+
+void do_kern_pairs(n)
+int n;
+{
+ char buf[512];
+ char name1[128];
+ char name2[128];
+ double x, y;
+ for (;;) {
+ int i;
+ struct lig_kern_list *ptr;
+ lineno++;
+ if (fgets(buf, 512, infp) == NULL)
+ bad_afm_file();
+ if (buf[0] == '\n')
+ continue;
+ if (strcmp(buf, "EndKernPairs\n") == 0)
+ break;
+ if (sscanf(buf, "KPX %s %s %lg", name1, name2, &x) != 3) {
+ if (sscanf(buf, "KP %s %s %lg %lg", name1, name2,
+ &x, &y) != 4)
+ bad_afm_file();
+ }
+ else
+ y = 0.0;
+ i = lookup(name1);
+ if ((ptr = (struct lig_kern_list *)malloc(sizeof(struct lig_kern_list))) == NULL)
+ message(FATAL_ERROR, "out of memory");
+ ptr->succ = lookup(name2);
+ ptr->lig = -1;
+ ptr->x = x;
+ ptr->next = table[i].p;
+ table[i].p = ptr;
+ n--;
+ }
+ if (n != 0)
+ message(WARNING, "wrong number of kern pairs");
+}
+
+
+void do_char_metrics(n)
+int n;
+{
+ char buf[512];
+ for (;;) {
+ char *ptr = buf;
+ lineno++;
+ if (fgets(buf, 512, infp) == NULL)
+ bad_afm_file();
+ if (strcmp(buf, "EndCharMetrics\n") == 0)
+ break;
+ while (isspace(*ptr))
+ ptr++;
+ if (*ptr == '\0')
+ continue;
+ scan_char_metric(buf);
+ n--;
+ }
+ if (n != 0)
+ message(WARNING, "wrong number of char metrics");
+}
+
+void do_afms()
+{
+ char buf[512];
+ lineno = 0;
+
+ while (fgets(buf, 512, infp) != NULL) {
+ char *key, *value;
+ key = buf;
+ lineno++;
+ while (isspace(*key))
+ key++;
+ value = key;
+ while (*value != '\0' && !isspace(*value))
+ value++;
+ if (*value != '\0') {
+ /* strip trailing white space */
+ char *p;
+ *value++ = '\0';
+ while (isspace(*value))
+ value++;
+ p = value;
+ while (*p != '\0')
+ p++;
+ while (p > value && isspace(*(p-1)))
+ p--;
+ *p = '\0';
+ }
+ if (strcmp(key, "IsFixedPitch") == 0)
+ font.is_fixed_pitch = (strcmp(value, "true") == 0);
+ else if (strcmp(key, "XHeight") == 0)
+ font.x_height = atof(value);
+ else if (strcmp(key, "StartCharMetrics") == 0)
+ do_char_metrics(atoi(value));
+ else if (strcmp(key, "ItalicAngle") == 0)
+ font.italic_angle = atof(value);
+ else if (strcmp(key, "StartKernPairs") == 0)
+ do_kern_pairs(atoi(value));
+ else if (strcmp(key, "italicCorrectionSpace") == 0)
+ font.italic_correction_space = atof(value);
+ }
+
+}
+
+
+void print_font_dimens()
+{
+ fprintf(outfp, "(FONTDIMEN\n");
+ fprintf(outfp, " (SLANT R %f)\n", font.slant);
+ fprintf(outfp, " (SPACE R %f)\n", font.normal_space/1000.0);
+ fprintf(outfp, " (SHRINK R %f)\n", font.normal_shrink/1000.0);
+ fprintf(outfp, " (STRETCH R %f)\n", font.normal_stretch/1000.0);
+ fprintf(outfp, " (EXTRASPACE R %f)\n", font.extra_space/1000.0);
+ fprintf(outfp, " (QUAD R %f)\n", font.quad/1000.0);
+ fprintf(outfp, " (XHEIGHT R %f)\n", font.x_height/1000.0);
+ fprintf(outfp, " )\n");
+}
+
+
+void do_encoding(encoding)
+char *encoding;
+{
+ int i;
+ char name[256];
+ FILE *fp;
+ char *texfonts;
+ fprintf(outfp, "(CODINGSCHEME %s)\n", encoding);
+ texfonts = getenv("TEXFONTS");
+ if (texfonts == NULL)
+ texfonts = TEXFONTS;
+ if ((fp = xfopen(encoding, FALSE, texfonts, ".enc")) == NULL)
+ message(FATAL_ERROR, "can't find %s", encoding);
+ for (i = 0; i < MAXNAMES; i++)
+ if (table[i].code >= -1)
+ table[i].code = -1;
+ for (i = 0; i < 256 && fscanf(fp, " %s ", name) == 1; i++) {
+ int n;
+ if (strcmp(".notdef", name) == 0)
+ continue;
+ n = lookup(name);
+ if (table[n].code == -2)
+ message(WARNING, "%s in encoding but not in font", name);
+ else if (table[n].code == -1)
+ table[n].code = i;
+ else
+ message(ERROR, "%s appears more than once in encoding", name);
+ }
+}
+
+
+
+void print_char_metrics()
+{
+ int i;
+ for (i = 0; i < MAXNAMES; i++)
+ if (table[i].name != NULL && table[i].code > 0) {
+ double charic;
+ fprintf(outfp, "(CHARACTER O %03o\n", table[i].code);
+ fprintf(outfp, " (COMMENT %s)\n", table[i].name);
+ fprintf(outfp, " (CHARWD R %f)\n",
+ table[i].wx/1000.0);
+ /* negative heights and depths mess up \mathaccent */
+ if (table[i].ury > 0.0)
+ fprintf(outfp, " (CHARHT R %f)\n",
+ table[i].ury/1000.0);
+ if (table[i].lly < 0.0)
+ fprintf(outfp, " (CHARDP R %f)\n",
+ -table[i].lly/1000.0);
+ charic = table[i].urx - table[i].wx + font.italic_correction_space;
+ if (charic > 0.0)
+ fprintf(outfp, " (CHARIC R %f)\n",
+ charic/1000.0);
+ fputs(" )\n", outfp);
+ }
+}
+
+
+
+void print_lig_kerns()
+{
+ int i;
+ fputs("(LIGTABLE\n", outfp);
+ for (i = 0; i < MAXNAMES; i++) {
+ struct lig_kern_list *p;
+ char label_line[128];
+ if (table[i].name == NULL || table[i].code < 0)
+ continue;
+ sprintf(label_line, " (LABEL O %03o)\n", table[i].code);
+ /* print the ligatures */
+ for (p = table[i].p; p != NULL; p = p->next)
+ if (p->lig != -1 && table[p->lig].code > 0
+ && table[p->succ].code > 0) {
+ fputs(label_line, outfp);
+ label_line[0]= '\0';
+ fprintf(outfp," (LIG O %03o O %03o)\n",
+ table[p->succ].code,
+ table[p->lig].code);
+ }
+ for (p = table[i].p; p != NULL; p = p->next)
+ if (p->lig == -1 && table[p->succ].code > 0) {
+ fputs(label_line, outfp);
+ label_line[0] = '\0';
+ fprintf(outfp, " (KRN O %03o R %f)\n",
+ table[p->succ].code,
+ p->x/1000.0);
+ }
+ if (label_line[0] == '\0')
+ fputs(" (STOP)\n", outfp);
+ }
+ fputs(" )\n", outfp);
+}
+
+
+struct ligatures standard_ligatures[] = {
+ "hyphen", "hyphen", "endash",
+ "endash", "hyphen", "emdash",
+ "quoteleft", "quoteleft", "quotedblleft",
+ "quoteright", "quoteright", "quotedblright",
+ "exclam", "quoteleft", "exclamdown",
+ "question", "quoteleft", "questiondown",
+ NULL, NULL, NULL
+ };
+
+struct ligatures tt_ligatures[] = {
+ "exclam", "quoteleft", "exclamdown",
+ "question", "quoteleft", "questiondown",
+ NULL, NULL, NULL
+ };
+
+
+void do_ligatures(lig)
+struct ligatures *lig;
+{
+ int i;
+ for (i = 0; lig[i].lig != NULL; i++) {
+ int n;
+ struct lig_kern_list *p;
+ n = lookup(lig[i].ch);
+ if ((p = (struct lig_kern_list *)malloc(sizeof(struct lig_kern_list))) == NULL)
+ message(FATAL_ERROR, "out_of_memory");
+ p->succ = lookup(lig[i].succ);
+ p->lig = lookup(lig[i].lig);
+ p->next = table[n].p;
+ table[n].p = p;
+ }
+}
+
+
+
+int main(argc, argv)
+int argc;
+char **argv;
+{
+ char filename[128];
+ int c;
+ char *efile = NULL;
+ while ((c = getopt(argc, argv, "e:")) != EOF)
+ switch(c) {
+ case 'e':
+ efile = optarg;
+ break;
+ case '?':
+ goto usage;
+ }
+ if (argc - optind < 1)
+ goto usage;
+ strcpy(filename, argv[optind]);
+ if (strchr(filename, '.') == NULL)
+ strcat(filename, ".afm");
+ if ((infp = fopen(filename, "r")) == NULL)
+ message(FATAL_ERROR, "can't open %s", filename);
+ if (argc - optind == 1)
+ strcpy(strchr(filename, '.'), ".pl");
+ else if (argc - optind == 2) {
+ strcpy(filename, argv[optind+1]);
+ if (strchr(filename, '.') == NULL)
+ strcat(filename, ".pl");
+ }
+ else
+ goto usage;
+ if ((outfp = fopen(filename, "w")) == NULL)
+ message(FATAL_ERROR, "can't open %s", filename);
+ do_afms();
+ if (efile != NULL)
+ do_encoding(efile);
+ if (font.is_fixed_pitch)
+ do_ligatures(tt_ligatures);
+ else
+ do_ligatures(standard_ligatures);
+ compute_font_dimens();
+ print_font_dimens();
+ print_char_metrics();
+ print_lig_kerns();
+ exit(history);
+usage:
+ message(FATAL_ERROR, "usage: aftopl [-e encoding] afmfile [plfile]");
+}
diff --git a/fonts/utilities/afmtopl/clark/util.h b/fonts/utilities/afmtopl/clark/util.h
new file mode 100644
index 0000000000..c96a8672f7
--- /dev/null
+++ b/fonts/utilities/afmtopl/clark/util.h
@@ -0,0 +1,91 @@
+/* $Header: /u/jjc/dvitops/RCS/util.h,v 1.2 89/02/01 12:18:22 jjc Rel $ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <errno.h>
+
+#include "config.h"
+
+#ifdef STDARG
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+#ifdef PROTO
+int abs(int);
+char *getenv(char *);
+int atoi(const char *);
+long atol(const char *);
+char *calloc(size_t, size_t);
+void exit(int);
+void free(char *);
+char *getenv(char *);
+char *malloc(size_t);
+void qsort(char *, size_t, size_t, int (*)());
+char *realloc(char *, size_t);
+double atof(const char *);
+int getopt(int argc, char **argv, char *opts);
+FILE *xfopen(char *filename, int is_binary, char *area_list,
+char *extension);
+#else
+int abs();
+char *getenv();
+double atof();
+int atoi();
+long atol();
+char *calloc();
+void exit();
+void free();
+char *getenv();
+char *malloc();
+void qsort();
+char *realloc();
+double atof();
+long atol();
+int getopt();
+FILE *xfopen();
+#endif
+
+extern int errno;
+
+extern int opterr;
+extern int optind;
+extern int optopt;
+extern char *optarg;
+
+#define TRUE 1
+#define FALSE 0
+
+#ifdef BINARY
+#define RB "rb"
+#else
+#define RB "r"
+#endif
+
+#define cant_happen() message(FATAL_ERROR, "can't happen: %s, line %d",\
+__FILE__, __LINE__);
+#define out_of_memory() message(FATAL_ERROR, "out of memory");
+
+
+enum message_type {INFORMATION = 0, WARNING = 1, ERROR = 2, FATAL_ERROR = 3 };
+
+extern enum message_type history;
+extern char *program_name;
+
+#ifdef STDARG
+void message(enum message_type, char *,...);
+#else
+void message();
+#endif
diff --git a/fonts/utilities/afmtopl/elwell/aftopl.c b/fonts/utilities/afmtopl/elwell/aftopl.c
new file mode 100644
index 0000000000..8ff16630c0
--- /dev/null
+++ b/fonts/utilities/afmtopl/elwell/aftopl.c
@@ -0,0 +1,236 @@
+/**
+ Program: aftopl -- convert Adobe AFM files into TeX PL files
+ Author: Clayton M. Elwell, Ohio State University
+
+ Disclaimer: This program seems to work, but it was cobbled up in
+ an afternoon. Its operation should be readily apparent
+ to any C programmer.
+**/
+static char RCSid[] = "$Header: aftopl.c,v 2.1 87/11/24 12:34:38 cudcv Exp $";
+/*
+ * $Log: aftopl.c,v $
+ * Revision 2.1 87/11/24 12:34:38 cudcv
+ * Finished (?) - Release.
+ *
+ * Revision 1.3 87/10/30 09:41:26 cudcv
+ * Don't want ligatures for typewriter fonts, even if they are in the
+ * Postscript fonts.
+ *
+ * Revision 1.2 87/10/30 09:19:26 cudcv
+ * Remap for TeX fonts, add LIGTABLE. Fixed bug in slant.
+ *
+ * Revision 1.1 87/07/09 12:57:27 cudcv
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+
+#ifndef M_PI /* not in all math.h files */
+#define M_PI 3.14159265358979323846
+#endif
+
+#define max(a,b) ((a) > (b) ? (a) : (b))
+
+char line[BUFSIZ];
+
+char *strupr(s)
+register char *s;
+{
+ register char *s1;
+ s1 = s;
+ while (*s) {
+ if (islower(*s)) *s = toupper(*s);
+ s++;
+ }
+ return s1;
+}
+
+starts(s1, s2)
+register char *s1;
+register char *s2;
+{
+ return !strncmp(s1, s2, strlen(s2));
+}
+
+float hscale;
+
+float scale(i)
+int i;
+{
+ return (hscale * (((float) i) / 1000.0));
+}
+
+struct {
+ int number;
+ char *name;
+ int forfw;
+} map [] =
+{
+ { 0000, "Gamma", 1 },
+ { 0001, "Delta", 1 },
+ { 0002, "Theta", 1 },
+ { 0003, "Lambda", 1 },
+ { 0004, "Xi", 1 },
+ { 0005, "Pi", 1 },
+ { 0006, "Sigma", 1 },
+ { 0007, "Upsilon", 1 },
+ { 0010, "Phi", 1 },
+ { 0011, "Psi", 1 },
+ { 0012, "Omega", 1 },
+ { 0013, "ff", 0 },
+ { 0014, "fi", 0 },
+ { 0015, "fl", 0 },
+ { 0016, "ffi", 0 },
+ { 0017, "ffl", 0 },
+ { 0020, "dotlessi", 1 },
+ { 0021, "dotlessj", 1 },
+ { 0022, "grave", 1 },
+ { 0023, "acute", 1 },
+ { 0024, "caron", 1 },
+ { 0025, "breve", 1 },
+ { 0026, "macron", 1 },
+ { 0027, "ring", 1 },
+ { 0030, "cedilla", 1 },
+ { 0031, "germandbls", 1 },
+ { 0032, "ae", 1 },
+ { 0033, "oe", 1 },
+ { 0034, "oslash", 1 },
+ { 0035, "AE", 1 },
+ { 0036, "OE", 1 },
+ { 0037, "Oslash", 1 },
+ { 0136, "circumflex", 0 },
+ { 0137, "dotaccent", 0 },
+ { 0175, "hungarumlaut", 0 },
+ { 0176, "tilde", 0 },
+ { 0177, "dieresis", 1 },
+};
+
+int number, width, left, bottom, right, top;
+char name[64];
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ double atof();
+ int fixedwidth = 0, filigs = 0;
+
+ if (argc == 2) hscale = atof(argv[1]); else hscale = 1.0;
+ puts("(COMMENT THIS PL FILE WAS GENERATED FROM AN AFM FILE BY AFTOPL)");
+ puts("(COMMENT AFTOPL WAS WRITTEN BY CLAYTON M. ELWELL, OHIO STATE UNIVERSITY)");
+ puts("(DESIGNSIZE R 10.0)");
+ puts("(SEVENBITSAFEFLAG FALSE)");
+ while (gets(line)) {
+ if (starts(line, "Comment"))
+ printf("(COMMENT %s)\n", strupr(line+8));
+ else if (starts(line, "EncodingScheme"))
+ printf("(CODINGSCHEME %s)\n", strupr(line+15));
+ else if (starts(line, "ItalicAngle")) {
+ double d = -tan(atof(line+12) * M_PI / 180.0);
+ printf("(FONTDIMEN\n (SLANT R %.6f)\n", d);
+ puts(" (STRETCH R 0.300)\n (SHRINK R 0.100)\n )");
+ }
+ else if (starts(line, "IsFixedPitch")) {
+ if (line[13] == 't')
+ fixedwidth++;
+ }
+ else if (starts(line, "CapHeight"))
+ printf("(FONTDIMEN\n (QUAD R %f)\n )\n", scale(atoi(line+10)));
+ else if (starts(line, "XHeight"))
+ printf("(FONTDIMEN\n (XHEIGHT R %f)\n )\n", scale(atoi(line+8)));
+ else if (starts(line, "C ")) {
+ sscanf(line, "C %d ; WX %d ; N %s ; B %d %d %d %d ;",
+ &number, &width, name, &left, &bottom, &right, &top);
+ if (number < 32) { /* do nothing */
+ } else if (number == 32) {
+ printf("(FONTDIMEN\n");
+ printf(" (SPACE R %f)\n (EXTRASPACE R %f)\n",
+ scale(width),
+ fixedwidth ? scale(width) : scale(width)/2);
+ printf(" )\n");
+ } else {
+ int found = 0, i;
+ for (i = 0; i < sizeof(map)/sizeof(map[0]); i++) {
+ if (fixedwidth && !map[i].forfw)
+ continue;
+ if (!(strcmp(map[i].name, name)))
+ OutChar(map[i].number, width, name,
+ left, bottom, right, top);
+ if (map[i].number == number)
+ found++;
+ }
+ if (!found)
+ OutChar(number, width, name, left, bottom, right, top);
+ if (!strcmp(name, "fi"))
+ filigs++;
+ }
+ } else if (starts(line, "StartKernPairs"))
+ puts("(LIGTABLE");
+ else if (starts(line, "EndKernPairs"))
+ puts(" )");
+ else if (starts(line, "KPX ")) {
+ if ((line[5] != ' ') || (line[7] != ' ')) {
+ } else {
+ printf(" (LABEL C %c)\n", line[4]);
+ while (starts(line, "KPX ")) {
+ if ((line[5] == ' ') && (line[7] == ' ')) {
+ sscanf(line, "KPX %c %c %d", name, name+1, &width);
+ printf(" (KRN C %c R %f)\n", name[1], scale(width));
+ }
+ gets(line);
+ }
+ puts(" (STOP)");
+ }
+ }
+ }
+ printf(
+"(LIGTABLE\n\
+ (LABEL O 40)\n\
+ (LIG C l O 370)\n\
+ (LIG C L O 350)\n\
+ (STOP)\n\
+ (LABEL O 41)\n\
+ (LIG O 140 O 241)\n\
+ (STOP)\n\
+ (LABEL O 77)\n\
+ (LIG O 140 O 277)\n\
+ (STOP)\n");
+ if (!fixedwidth) {
+ printf(
+" (LABEL O 140)\n\
+ (LIG O 140 O 252)\n\
+ (STOP)\n\
+ (LABEL O 47)\n\
+ (LIG O 47 O 272)\n\
+ (STOP)\n\
+ (LABEL O 55)\n\
+ (LIG O 55 O 261)\n\
+ (STOP)\n\
+ (LABEL O 261)\n\
+ (LIG O 55 O 320)\n\
+ (STOP)\n");
+ if (filigs) printf(
+" (LABEL C f)\n\
+ (LIG C i O 256)\n\
+ (LIG C l O 257)\n\
+ (STOP)\n");
+ }
+ printf(" )");
+}
+
+OutChar(number, width, name, left, bottom, right, top)
+ int number, width, left, bottom, right, top;
+ char *name;
+{
+ printf("(COMMENT %s)\n(CHARACTER D %d\n", name, number);
+ printf(" (CHARWD R %f)\n (CHARHT R %f)\n",
+ scale(width), scale(top));
+ if (max(0, -bottom))
+ printf(" (CHARDP R %f)\n", scale(-bottom));
+ if (right > width)
+ printf(" (CHARIC R %f)\n", scale(right - width));
+ puts(" )");
+}
diff --git a/fonts/utilities/afmtopl/wolczko/aftopl b/fonts/utilities/afmtopl/wolczko/aftopl
new file mode 100644
index 0000000000..4c628c6b1e
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/aftopl
@@ -0,0 +1,203 @@
+#! /bin/awk -f
+# Translate Adobe afm file to TeX pl file.
+# usage: aftopl afm-file-name >pl-file-name
+# Greg Lee, lee@uhccux.uhcc.hawaii.edu, 12/87
+# extensively modified by Mario Wolczko, mario@uk.ac.man.cs.ux, 4/88
+BEGIN {
+ tan[ 0]=0; tan[ 1]=.017454; tan[ 2]=.034919; tan[ 3]=.052406;
+ tan[ 4]=.069926; tan[ 5]=.087487; tan[ 6]=.105102; tan[ 7]=.122783;
+ tan[ 8]=.140539; tan[ 9]=.158383; tan[10]=.176325; tan[11]=.194379;
+ tan[12]=.212555; tan[13]=.230867; tan[14]=.249325; tan[15]=.267948;
+ tan[16]=.286744; tan[17]=.305728; tan[18]=.324918; tan[19]=.344326;
+ tan[20]=.363969; tan[21]=.383863; tan[22]=.404025; tan[23]=.424473;
+ tan[24]=.445227; tan[25]=.466306; tan[26]=.487731; tan[27]=.509524;
+ tan[28]=.531707; tan[29]=.554308; tan[30]=.577349; tan[31]=.600859;
+ tan[32]=.624867; tan[33]=.649406; tan[34]=.674507; tan[35]=.700205;
+ tan[36]=.726540; tan[37]=.753552; tan[38]=.781283; tan[39]=.809782;
+ tan[40]=.839099; tan[41]=.869284; tan[42]=.900401; tan[43]=.932512;
+ tan[44]=.965686; tan[45]=.999998; tan[46]=1.035526; tan[47]=1.072368;
+ tan[48]=1.110610; tan[49]=1.150364; tan[50]=1.191750; tan[51]=1.234894;
+ tan[52]=1.279939; tan[53]=1.327040; tan[54]=1.376380; tan[55]=1.428144;
+ tan[56]=1.482555; tan[57]=1.539859; tan[58]=1.600330; tan[59]=1.664273;
+ tan[60]=1.732044; tan[61]=1.804039; tan[62]=1.880723; tan[63]=1.962604;
+ tan[64]=2.050297; tan[65]=2.144501; tan[66]=2.246033; tan[67]=2.355844;
+ tan[68]=2.475075; tan[69]=2.605080; tan[70]=2.747468; tan[71]=2.904201;
+ tan[72]=3.077671; tan[73]=3.270835; tan[74]=3.487391; tan[75]=3.732019;
+ tan[76]=4.010759; tan[77]=4.331452; tan[78]=4.704597; tan[79]=5.144493;
+ tan[80]=5.671250; tan[81]=6.313687; tan[82]=7.115264; tan[83]=8.144301;
+ tan[84]=9.514216; tan[85]=11.42988; tan[86]=14.30034; tan[87]=19.08075;
+ tan[88]=28.63500; tan[89]=57.28469;
+
+ # extra kerning and ligature info is added to these chars
+ extra= " exclam question hyphen endash quoteleft quoteright f ";
+ # same, except for \tt fonts
+ extraf= " exclam question ";
+
+ LIG = " (LIG O %o O %o)\n"
+
+ print "(DESIGNSIZE R 10.0)"
+ print "(COMMENT DESIGNSIZE IS IN POINTS)"
+ print "(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)"
+ }
+
+/^FontName/ {
+ smallcaps = index($2, "SmallCaps");
+}
+
+/^FamilyName/ {
+ family = substr($0, length("FamilyName "));
+# if (family ~ /Symbol/) {
+# print "Can't deal with Symbol fonts" >"/dev/tty";
+# exit 1;
+# }
+ if (family ~ /Dingbats/ || family ~ /Symbol/)
+ nonchar = 1;
+ print "(FAMILY " family ")";
+}
+
+/^EncodingScheme/ { print "(CODINGSCHEME " $2 ")"; }
+
+/^ItalicAngle/ {
+ angle = int($2 + .5); slant = 0;
+ if (angle < 0)
+ slant = tan[-angle];
+ else
+ slant = -tan[angle];
+}
+
+/^IsFixedPitch/ { fixed = $2; }
+
+/^XHeight/ { xheight = $2/1000; }
+
+/^C 32/ { if (fixed == "true")
+ space = $5/1000
+ else
+ space = ($5 * 1.1)/1000 # this is a frig...
+ print "(FONTDIMEN"
+ printf(" (SLANT R %1.6f)\n", slant)
+ printf(" (SPACE R %1.6f)\n", space)
+ if (fixed == "false") {
+ # ...and this...
+ printf(" (STRETCH R %1.6f)\n", space/2)
+ # ...and this...
+ printf(" (SHRINK R %1.6f)\n", space/3)
+ }
+ printf(" (XHEIGHT R %1.6f)\n", xheight)
+ # ... and this ...
+ print " (QUAD R 1.0)"
+ # ...and this
+ if (fixed == "true")
+ printf(" (EXTRASPACE R %1.6f)\n", space)
+ else
+ printf(" (EXTRASPACE R %1.6f)\n", space/3)
+ print " )"
+ }
+
+/WX/ && $2 >= 0 {
+
+ ch = $2;
+ w = $5;
+ h = $14;
+ d = -$12;
+ rp = $13 - w;
+ name[$8] = ch;
+ c = ch;
+
+ if (c < 48) printf("(CHARACTER O %o\n", c);
+ if (c >= 48 && c <= 57) printf("(CHARACTER C %c\n", c);
+ if (c > 57 && c < 65) printf("(CHARACTER O %o\n", c);
+ if (c >= 65 && c <= 90) printf("(CHARACTER C %c\n", c);
+ if (c > 90 && c < 97) printf("(CHARACTER O %o\n", c);
+ if (c >= 97 && c <= 122) printf("(CHARACTER C %c\n", c);
+ if (c > 122) printf("(CHARACTER O %o\n", c);
+
+ printf(" (CHARWD R %1.6f)\n", w/1000);
+
+ if (h > 0) printf(" (CHARHT R %1.6f)\n", h/1000);
+ if (d > 0) printf(" (CHARDP R %1.6f)\n", d/1000);
+ if (rp > 0) printf(" (CHARIC R %1.6f)\n", rp/1000);
+
+ print " )";
+}
+
+/^EndCharMetrics/ {
+ # all TeX fonts (except DingBats)
+ # map !` to upside-down! and ?` to upside-down?
+ if (nonchar) next;
+ printf("(LIGTABLE\n");
+}
+
+/^KPX/ {
+ if ($2=="quoteleft" && $3=="quoteleft") next; # these are ligatured,
+ if ($2=="quoteright" && $3=="quoteright") next;# not kerned.
+ if (ck != $2) {
+ if (ck != "") printf(" (STOP)\n");
+ c = name[$2];
+ printf(" (LABEL O %o)\n", c);
+ ck = $2;
+ if ((fixed == "false" && index(extra," "ck" ")) || (fixed == "true" && index(extraf," "ck" "))) {
+ if (ck == "exclam")
+ printf(LIG,name["quoteleft"], name["exclamdown"]);
+ else if (ck == "question")
+ printf(LIG,name["quoteleft"], name["questiondown"]);
+ else if (ck == "hyphen")
+ printf(LIG,name["hyphen"], name["endash"]);
+ else if (ck == "endash")
+ printf(LIG,name["hyphen"], name["emdash"]);
+ else if (ck == "quoteleft")
+ printf(LIG,name["quoteleft"], name["quotedblleft"]);
+ else if (ck == "quoteright")
+ printf(LIG,name["quoteright"], name["quotedblright"]);
+ else if (ck == "f") {
+ printf(" (LIG C i O %o)\n",name["fi"]);
+ printf(" (LIG C l O %o)\n",name["fl"]);
+ }
+ done[ck]=1;
+ }
+
+ }
+ cm = name[$3];
+ printf(" (KRN O %o R %1.6f)\n", cm, $4/1000)
+ }
+
+/^EndKernPairs/ {
+ printf(" (STOP)\n");
+}
+
+/^EndFontMetrics/ {
+ if (nonchar) next;
+
+ if (fixed=="true")
+ todo= substr(extraf, 2);
+ else
+ todo= substr(extra, 2);
+ while (todo) {
+ n = index(todo, " ");
+ ck = substr(todo, 1, n-1);
+ todo = substr(todo, n+1);
+ if (!done[ck]) {
+ printf(" (LABEL O %o)\n", name[ck]);
+ # this is replica of the code in KPX
+ if (ck == "exclam")
+ printf(LIG,name["quoteleft"], name["exclamdown"]);
+ else if (ck == "question")
+ printf(LIG,name["quoteleft"], name["questiondown"]);
+ else if (ck == "f") {
+ printf(" (LIG C i O %o)\n",name["fi"]);
+ printf(" (LIG C l O %o)\n",name["fl"]);
+ } else if (fixed == "false") {
+ if (ck == "hyphen")
+ printf(LIG,name["hyphen"], name["endash"]);
+ else if (ck == "endash")
+ printf(LIG,name["hyphen"], name["emdash"]);
+ else if (ck == "quoteleft")
+ printf(LIG,name["quoteleft"], name["quotedblleft"]);
+ else if (ck == "quoteright")
+ printf(LIG,name["quoteright"], name["quotedblright"]);
+ }
+ printf(" (STOP)\n");
+ }
+ }
+ printf(" )\n");
+}
+
diff --git a/fonts/utilities/afmtopl/wolczko/edsymbols b/fonts/utilities/afmtopl/wolczko/edsymbols
new file mode 100644
index 0000000000..96bb6efdb9
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/edsymbols
@@ -0,0 +1,4 @@
+/^(FONTDIMEN/,/^ )/d
+.-1r fontdimens
+w
+q
diff --git a/fonts/utilities/afmtopl/wolczko/fontdimens b/fonts/utilities/afmtopl/wolczko/fontdimens
new file mode 100644
index 0000000000..92d4a6f024
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/fontdimens
@@ -0,0 +1,24 @@
+(FONTDIMEN
+ (SLANT R 0.0)
+ (SPACE R 0.0)
+ (STRETCH R 0.0)
+ (SHRINK R 0.0)
+ (XHEIGHT R 0.500)
+ (QUAD R 1.0)
+ (EXTRASPACE R 0.0)
+ (PARAMETER D 8 R 0.677)
+ (PARAMETER D 9 R 0.394)
+ (PARAMETER D 10 R 0.444)
+ (PARAMETER D 11 R 0.686)
+ (PARAMETER D 12 R 0.345)
+ (PARAMETER D 13 R 0.413)
+ (PARAMETER D 14 R 0.363)
+ (PARAMETER D 15 R 0.289)
+ (PARAMETER D 16 R 0.150)
+ (PARAMETER D 17 R 0.247)
+ (PARAMETER D 18 R 0.386)
+ (PARAMETER D 19 R 0.050)
+ (PARAMETER D 20 R 2.390)
+ (PARAMETER D 21 R 1.010)
+ (PARAMETER D 22 R 0.250)
+ )
diff --git a/fonts/utilities/afmtopl/wolczko/mk-con b/fonts/utilities/afmtopl/wolczko/mk-con
new file mode 100644
index 0000000000..ffd92c5844
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/mk-con
@@ -0,0 +1,91 @@
+#! /bin/sh
+# Make a condensed version of an AFM file
+# usage: mk-con x-scaling afm-file-name >new-afm-file-name
+#
+# rounding is done with int(x+0.5) --- this is wrong for -ve values
+awk 'BEGIN {'scale=$1';
+ tan[ 0]=0; tan[ 1]=.017454; tan[ 2]=.034919; tan[ 3]=.052406;
+ tan[ 4]=.069926; tan[ 5]=.087487; tan[ 6]=.105102; tan[ 7]=.122783;
+ tan[ 8]=.140539; tan[ 9]=.158383; tan[10]=.176325; tan[11]=.194379;
+ tan[12]=.212555; tan[13]=.230867; tan[14]=.249325; tan[15]=.267948;
+ tan[16]=.286744; tan[17]=.305728; tan[18]=.324918; tan[19]=.344326;
+ tan[20]=.363969; tan[21]=.383863; tan[22]=.404025; tan[23]=.424473;
+ tan[24]=.445227; tan[25]=.466306; tan[26]=.487731; tan[27]=.509524;
+ tan[28]=.531707; tan[29]=.554308; tan[30]=.577349; tan[31]=.600859;
+ tan[32]=.624867; tan[33]=.649406; tan[34]=.674507; tan[35]=.700205;
+ tan[36]=.726540; tan[37]=.753552; tan[38]=.781283; tan[39]=.809782;
+ tan[40]=.839099; tan[41]=.869284; tan[42]=.900401; tan[43]=.932512;
+ tan[44]=.965686; tan[45]=.999998; tan[46]=1.035526; tan[47]=1.072368;
+ tan[48]=1.110610; tan[49]=1.150364; tan[50]=1.191750; tan[51]=1.234894;
+ tan[52]=1.279939; tan[53]=1.327040; tan[54]=1.376380; tan[55]=1.428144;
+ tan[56]=1.482555; tan[57]=1.539859; tan[58]=1.600330; tan[59]=1.664273;
+ tan[60]=1.732044; tan[61]=1.804039; tan[62]=1.880723; tan[63]=1.962604;
+ tan[64]=2.050297; tan[65]=2.144501; tan[66]=2.246033; tan[67]=2.355844;
+ tan[68]=2.475075; tan[69]=2.605080; tan[70]=2.747468; tan[71]=2.904201;
+ tan[72]=3.077671; tan[73]=3.270835; tan[74]=3.487391; tan[75]=3.732019;
+ tan[76]=4.010759; tan[77]=4.331452; tan[78]=4.704597; tan[79]=5.144493;
+ tan[80]=5.671250; tan[81]=6.313687; tan[82]=7.115264; tan[83]=8.144301;
+ tan[84]=9.514216; tan[85]=11.42988; tan[86]=14.30034; tan[87]=19.08075;
+ tan[88]=28.63500; tan[89]=57.28469; tan[90]=1e6;
+
+
+}
+
+/^FontName/ {
+ print $0 "-Condensed";
+ next;
+ }
+
+/^FullName/ {
+ print $0, "Condensed";
+ next;
+ }
+
+/^ItalicAngle/ {
+ if ($2 < 0) {
+ origangle = int($2 - 0.5);
+ abstanorig = tan[-origangle];
+ } else if ($2 > 0) {
+ origangle = int($2 + 0.5);
+ abstanorig = tan[origangle];
+ } else {
+ origangle = 0;
+ abstanorig = 0;
+ }
+ abstannew = scale * abstanorig;
+ newangle= 0;
+ while (tan[newangle] < abstannew)
+ ++newangle;
+ if (origangle < 0)
+ newangle = -newangle;
+ print "ItalicAngle " newangle ; next ;
+}
+
+/^UnderlinePosition/ {
+ $2 = int(scale*$2 + 0.5);
+ print $0; next;
+}
+
+/^FontBBox/ {
+ $2 = int(scale*$2 + 0.5);
+ $4 = int(scale*$4 + 0.5);
+ print $0; next;
+}
+
+
+/^C / {
+ llx = $11;
+ urx = $13;
+ w = $5;
+ $11 = int(scale*llx + 0.5);
+ $13 = int(scale*urx + 0.5);
+ $5 = int(scale*w + 0.5);
+ print $0; next;
+}
+
+/^KPX/ {
+ $4 = int($4*scale - 0.5)
+ print $0; next;
+}
+
+{print}' $2
diff --git a/fonts/utilities/afmtopl/wolczko/mk-obl b/fonts/utilities/afmtopl/wolczko/mk-obl
new file mode 100644
index 0000000000..56d7354223
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/mk-obl
@@ -0,0 +1,100 @@
+#! /bin/sh
+# Make an oblique version of an AFM file
+# usage: mk-obl newangle afm-file-name >new-afm-file-name
+#
+# newangle should be an integer, in degrees of anti-clockwise skew
+#
+# bugs: doesn't set these fields properly:
+# FontBBox
+# UnderlinePosition
+# KPX
+# the llx field of Character Metrics is unchanged.
+# the urx field is guesstimated
+#
+# rounding is done with int(x+0.5) --- this is wrong for -ve values
+awk 'BEGIN {'newangle=$1';
+ tan[ 0]=0; tan[ 1]=.017454; tan[ 2]=.034919; tan[ 3]=.052406;
+ tan[ 4]=.069926; tan[ 5]=.087487; tan[ 6]=.105102; tan[ 7]=.122783;
+ tan[ 8]=.140539; tan[ 9]=.158383; tan[10]=.176325; tan[11]=.194379;
+ tan[12]=.212555; tan[13]=.230867; tan[14]=.249325; tan[15]=.267948;
+ tan[16]=.286744; tan[17]=.305728; tan[18]=.324918; tan[19]=.344326;
+ tan[20]=.363969; tan[21]=.383863; tan[22]=.404025; tan[23]=.424473;
+ tan[24]=.445227; tan[25]=.466306; tan[26]=.487731; tan[27]=.509524;
+ tan[28]=.531707; tan[29]=.554308; tan[30]=.577349; tan[31]=.600859;
+ tan[32]=.624867; tan[33]=.649406; tan[34]=.674507; tan[35]=.700205;
+ tan[36]=.726540; tan[37]=.753552; tan[38]=.781283; tan[39]=.809782;
+ tan[40]=.839099; tan[41]=.869284; tan[42]=.900401; tan[43]=.932512;
+ tan[44]=.965686; tan[45]=.999998; tan[46]=1.035526; tan[47]=1.072368;
+ tan[48]=1.110610; tan[49]=1.150364; tan[50]=1.191750; tan[51]=1.234894;
+ tan[52]=1.279939; tan[53]=1.327040; tan[54]=1.376380; tan[55]=1.428144;
+ tan[56]=1.482555; tan[57]=1.539859; tan[58]=1.600330; tan[59]=1.664273;
+ tan[60]=1.732044; tan[61]=1.804039; tan[62]=1.880723; tan[63]=1.962604;
+ tan[64]=2.050297; tan[65]=2.144501; tan[66]=2.246033; tan[67]=2.355844;
+ tan[68]=2.475075; tan[69]=2.605080; tan[70]=2.747468; tan[71]=2.904201;
+ tan[72]=3.077671; tan[73]=3.270835; tan[74]=3.487391; tan[75]=3.732019;
+ tan[76]=4.010759; tan[77]=4.331452; tan[78]=4.704597; tan[79]=5.144493;
+ tan[80]=5.671250; tan[81]=6.313687; tan[82]=7.115264; tan[83]=8.144301;
+ tan[84]=9.514216; tan[85]=11.42988; tan[86]=14.30034; tan[87]=19.08075;
+ tan[88]=28.63500; tan[89]=57.28469;
+
+ if (newangle != int(newangle)) {
+ print "Angle must be an integer" >"/dev/tty";
+ exit 1;
+ }
+ if (newangle < 0) {
+ tannew = -tan[-newangle];
+ } else if (newangle > 0) {
+ tannew = tan[newangle];
+ } else {
+ tannew = 0;
+ }
+}
+
+/^FontName/ {
+ print $0 "-Oblique";
+ next;
+ }
+
+/^FullName/ {
+ print $0, "Oblique";
+ next;
+ }
+
+/^ItalicAngle/ {
+ if ($2 < 0) {
+ origangle = int($2 - 0.5);
+ tanorig = -tan[-origangle];
+ } else if ($2 > 0) {
+ origangle = int($2 + 0.5);
+ tanorig = tan[origangle];
+ } else {
+ origangle = 0;
+ tanorig = 0;
+ }
+ print "ItalicAngle " newangle ; next ;
+}
+
+/^C / {
+ llx = $11;
+ lly = $12;
+ urx = $13;
+ ury = $14;
+ h = ury - lly;
+ if (origangle < 0)
+ urx = urx + h * tanorig;
+ else if (origangle > 0)
+ llx = llx + h * tanorig;
+
+ # now llx and urx are correct for an upright font
+ # so apply the desired slope
+ if (newangle < 0)
+ urx = urx - h * tannew;
+ else if (newangle > 0)
+ llx = llx - h * tannew;
+
+ $11 = int(llx + 0.5);
+ $13 = int(urx + 0.5);
+ print $0; next;
+}
+
+{print}' $2
diff --git a/fonts/utilities/afmtopl/wolczko/mk-red b/fonts/utilities/afmtopl/wolczko/mk-red
new file mode 100644
index 0000000000..f6bfeb045f
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/mk-red
@@ -0,0 +1,43 @@
+#! /bin/sh
+# Make a reduced version of an AFM file
+# usage: mk-red scale afm-file-name >new-afm-file-name
+#
+# rounding is done with int(x+0.5) --- this is wrong for -ve values
+# doesn't deal with composites
+awk 'BEGIN {'scale=$1'; }
+
+/^FontName/ {
+ print $0 "-Reduced";
+ next;
+ }
+
+/^FullName/ {
+ print $0, "Reduced";
+ next;
+ }
+
+/^Underline/ || /^CapHeight/ || /^XHeight/ || /^Descender/ || /^Ascender/ {
+ print $1, int($2*scale + 0.5); next;
+}
+
+/^FontBBox/ {
+ print "FontBBox", int($2*scale+0.5), int($3*scale+0.5), int($4*scale+0.5), int($5*scale+0.5);
+ next;
+}
+
+
+/^C / {
+ $5 = int($5 * scale + 0.5);
+ $11 = int($11 * scale + 0.5);
+ $12 = int($12 * scale + 0.5);
+ $13 = int($13 * scale + 0.5);
+ $14 = int($14 * scale + 0.5);
+ print $0; next;
+}
+
+/^KPX/ {
+ $4 = int($4*scale - 0.5)
+ print $0; next;
+}
+
+{print}' $2
diff --git a/fonts/utilities/afmtopl/wolczko/mk-sc b/fonts/utilities/afmtopl/wolczko/mk-sc
new file mode 100644
index 0000000000..8b74dac630
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/mk-sc
@@ -0,0 +1,99 @@
+#! /bin/sh
+# Make a small-caps version of an AFM file
+# usage: mk-sc scale afm-file-name >new-afm-file-name
+#
+# scale is the ratio between the small and the large caps (e.g, 0.8)
+#
+# bugs: doesn't set these fields properly:
+# FontBBox
+# KPX data for lowercase is discarded
+#
+# rounding is done with int(x+0.5) --- this is wrong for -ve values
+
+trap "rm -f /tmp/afm$$0[012] /tmp/kern$$" 0
+
+csplit -f /tmp/afm$$ -s $2 /StartKernPairs/+1 /EndKernPairs/
+
+# chardata now in /tmp/afm$$00, kern in /tmp/afm$$01,
+# composites in /tmp/afm$$02
+
+# first do the kern data
+
+awk 'BEGIN {
+ lower= "abcdefghijklmnopqrstuvwxyz";
+ upper= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ }
+
+ /^$/ { next; }
+
+ /^KPX/ && $2 ~ /^[A-Z]$/ && $3 ~ /^[A-Z]$/ {
+ # insert extra kerning data for lower case, based on upper case
+ lwr2=substr(lower, index(upper, $2), 1);
+ lwr3=substr(lower, index(upper, $3), 1);
+ print "KPX", lwr2, $3, $4
+ print "KPX", $2, lwr3, $4
+ print "KPX", lwr2, lwr3, $4
+ print $0
+ next;
+ }
+
+ /^KPX/ && ($2 ~ /^[a-z]$/ || $3 ~ /^[a-z]$/) {
+ # filter out kerning applied to lower-case
+ next;
+ }
+ { print ; }' /tmp/afm$$01 |
+sort +1 -3 |
+awk '
+ $2 != last { printf "\n" ; last= $2 }
+ { print }
+' >/tmp/kern$$
+
+# now process the chardata, and put the bits together
+awk 'BEGIN {'scale=$1';}
+
+ /^FontName/ {
+ print $0 "-SmallCaps";
+ next;
+ }
+
+ /^FullName/ {
+ print $0, "SmallCaps";
+ next;
+ }
+
+ /^CapHeight/ {
+ print "XHeight", int($2*scale + 0.5)
+ }
+
+ /^XHeight/ { next;}
+
+ /^Descender/ {
+ print "Descender 0";
+ next;
+ }
+
+ /^C / {
+ ch = $2;
+ if (ch >= 65 && ch <= 90) {
+ # it is an upper case letter, so save the (scaled) metric info
+ ch += 32;
+ w[ch] = int($5 * scale + 0.5);
+ llx[ch] = int($11 * scale + 0.5);
+ lly[ch] = int($12 * scale + 0.5);
+ urx[ch] = int($13 * scale + 0.5);
+ ury[ch] = int($14 * scale + 0.5);
+ print;
+ } else if (ch >= 97 && ch <= 122) {
+ # it is a lower case letter -- substitute the saved info
+ printf "C %d ; WX %d ; N %s ; B %d %d %d %d\n", \
+ ch, w[ch], $8, llx[ch], lly[ch], urx[ch], ury[ch], ";";
+ # do not want any ligature info
+ } else
+ print;
+
+ next;
+ }
+
+ {print}' /tmp/afm$$00 |
+cat - /tmp/kern$$ /tmp/afm$$02
+
diff --git a/fonts/utilities/afmtopl/wolczko/readme b/fonts/utilities/afmtopl/wolczko/readme
new file mode 100644
index 0000000000..9d2bc101ef
--- /dev/null
+++ b/fonts/utilities/afmtopl/wolczko/readme
@@ -0,0 +1,14 @@
+This directory contains several UNIX utilities for converting AFM to
+PL files.
+
+aftopl - an awk script that does basic AFM to PL conversion
+
+edsymbols & fontdimens - used by the Makefile in the TFM directory to
+ make a Symbol font
+
+mk-con - makes a condensed AFM font (ie, squeezed horizontally)
+mk-obl - makes an oblique AFM font
+mk-red - makes a reduced (in both x and y) AFM font
+mk-sc - makes a smallcaps AFM fonts
+
+getmetrics - alternative way of getting AFM data...asks the printer for it!
diff --git a/fonts/utilities/cjk-gs-integrate/ChangeLog b/fonts/utilities/cjk-gs-integrate/ChangeLog
new file mode 100644
index 0000000000..cd697a8e08
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/ChangeLog
@@ -0,0 +1,1468 @@
+2019-08-16 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Release 20190816.0 (HEAD -> master) [089a440]
+
+2019-08-16 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * gs-9.27 doesn't like snippets for TTF/TTC it seems gs-9.25 and gs-9.26 does not require snippets for TTF/TTC so it will be safe enough (origin/master, origin/HEAD) [22bc208]
+
+2019-05-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * mention requirement of kpsewhich in help message [fd6f3d2]
+
+2019-05-19 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * make sure CR is stripped [2120e9f]
+
+2019-05-19 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * \/dev\/null -> $nul (origin/check-kpse) [1145435]
+
+2019-05-19 Norbert Preining <norbert@preining.info>
+
+ * test for kpsewhich (Issue: #33) [68ae7ce]
+
+2019-04-06 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add info for latest BIZ-UD fonts [ce8d802]
+
+2019-03-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Release 20190303.0 (tag: 20190303.0) [131b0f4]
+
+2019-03-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * copyright year [0732219]
+
+2019-03-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate-macos.pl: warning for macOS newer than known version [dd747ad]
+
+2018-11-10 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate,pl: make sure CR is stripped [510c7a5]
+
+2018-11-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database/cjkgs-{noto,sourcehan}*.dat: priority [276565c]
+
+2018-11-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database/cjkgs-{noto,sourcehan}*.dat [18dcc41]
+
+2018-10-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * forgotten removeonly database [d037c14]
+
+2018-10-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate more database [106a2f5]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate-macos.pl: support 10.14 Mojave (mostly safe) [4aa6618]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate cjkuni database [d285e93]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate fandol database [2bc5564]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate arphic database, more [adf6ae2]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate arphic database [30fcfed]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate monotype database [2a38d6d]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate dynacomware taiwan [d279791]
+
+2018-09-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tools/fontlist_mac.sh: Font5 [dac2a0b]
+
+2018-08-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * more debug code [4d6c622]
+
+2018-08-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add bizud database [1958d12]
+
+2018-08-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Adobe-Japan1-7 [a5bc97b]
+
+2018-08-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * hidden option --strict-psname for me debugging [2f10f6c]
+
+2018-08-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * execute 'mktexlsr' when --link-texmf is enabled [2d20f05]
+
+2018-08-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cleanup code [c28d11d]
+
+2018-08-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjkgs-morisawa-extra is not ready [9ff11f7]
+
+2018-05-20 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add heisei database (more) [7e0eeba]
+
+2018-05-20 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add heisei database [2b3a5e4]
+
+2018-05-19 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate apple database [876176d]
+
+2018-05-19 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * information for apple database [1fcc897]
+
+2018-05-06 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate apple database [7f9f0b8]
+
+2018-03-31 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * sort keys for $bntofn without this, link target differs from time to time. e.g. Office for Mac 2016 have the same font files for Excel, Word and PowerPoint. [796fd66]
+
+2018-03-06 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Release 20180306.0 (tag: 20180306.0) [409e696]
+
+2018-03-06 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * release.sh [4205a94]
+
+2018-03-06 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * release.sh [0ee14c4]
+
+2018-02-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database helper scripts [5cae691]
+
+2018-02-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Makefile, release.sh: adjustment [ba488b3]
+
+2018-02-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * move database files to database/ [63f9b4e]
+
+2018-02-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * don't discard when otfinfo exits with non-zero [9e630e3]
+
+2018-02-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * forgotten initialization of casefold flag [9abf580]
+
+2018-02-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Guard against unavailable 'otfinfo' command, skip OTC/TTC [bab740e]
+
+2018-02-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Use 'otfinfo' command for casefolding search safety (WIP) [fccf54a]
+
+2018-01-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate-macos.pl: typo [ca1bba1]
+
+2018-01-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add a wrapper cjk-gs-integrate-macos.pl [f820eec]
+
+2018-01-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add typebank database (based on Win10 Fall Creators Update) [e5a9733]
+
+2017-12-21 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * removeonly database should be read only in cleanup mode [cbb0b84]
+
+2017-12-21 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate ume database [b1a2269]
+
+2017-12-11 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate mogamobo database [cb36720]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * regenerate README.md [3eca807]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tools/release.sh: adjusted [789b6c7]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * built-in database does not support >=10.8 [59f0912]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * forgotten entry for removeonly database [6e03baf]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add removeonly database [2e16cdc]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tweaked database for sierra/highsierra [3281f12]
+
+2017-12-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * implement 'RMVname' entry for removing-only database [6e49733]
+
+2017-12-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * CRLF -> LF [a5db0ee]
+
+2017-12-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate founder database [afe9fc5]
+
+2017-12-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate adobe database [983cc3b]
+
+2017-12-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate solaris database [d27777a]
+
+2017-12-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add '/Library/Application Support/Apple/Fonts//' to search path [b3caba8]
+
+2017-11-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * checked latest CMap resources [9c274fb]
+
+2017-11-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add simli.ttf and simyou.ttf [44e62dd]
+
+2017-11-25 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate toppan database [125a2a3]
+
+2017-11-25 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * cjkgs-morisawa.dat: non-existent ShinMGoPr5-* [7609991]
+
+2017-11-25 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate fontworks database [c1c9735]
+
+2017-11-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * special case for native CID fonts in ancient days [b1b0d5f]
+
+2017-11-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * fix a mistake in previous commit [6c131a8]
+
+2017-11-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * handle tlgs.win32 pre-shipped cidfmap [5458fba]
+
+2017-11-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate microsoft database [2f22f8d]
+
+2017-11-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * support more aliases [9c81832]
+
+2017-11-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * update help message [56f97aa]
+
+2017-11-12 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * allow partial comment [c4119ff]
+
+2017-11-12 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate dynacomware database [005f5c2]
+
+2017-11-11 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate macOS-specific sinotype database [918d868]
+
+2017-11-11 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * update sinotype database (WIP) [48de9e3]
+
+2017-11-10 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * rename cjkgs-morisawa-standard.dat -> cjkgs-morisawa.dat (aminophen/master) [3afc59a]
+
+2017-11-10 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * update sinotype database [e1e781c]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database comment (more) [16446f9]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database comment (more) [27de76e]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database comment [b2b8c70]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * update sinotype database (WIP) [e35f7bf]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate sinotype database (WIP) [2e41fae]
+
+2017-11-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database order [2d749fd]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Update README-macos.md [c53e9be]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tweaked datbase [cec6e62]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate yu-osx/win database [9bbf637]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * perl syntax [3711113]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Support 'INCLUDE' syntax in database [a884634]
+
+2017-10-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Rename: cjkgs-adobe.dat -> cjkgs-ryokana.dat [b4cee4e]
+
+2017-10-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Update help message, regenerate README.md [363cda0]
+
+2017-10-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate hiragino database [07bd9c2]
+
+2017-10-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate kozuka database [a56a8e3]
+
+2017-10-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Shorten .dat namespace (macos), separate morisawa standard [a49e730]
+
+2017-10-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Removed non-existent A-OTF-Jun101Pr6N-Light.otf entry [d675ad6]
+
+2017-10-21 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add cjk-gs-integrate-adobe.dat (ryokana) [994fb3e]
+
+2017-10-14 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * dump PSName only when required [94021d0]
+
+2017-10-01 Norbert Preining <norbert@preining.info>
+
+ * fix format [0053b99]
+
+2017-10-01 Norbert Preining <norbert@preining.info>
+
+ * work on the README-macos [6d2e22b]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add GitHub repository URL [88fed5d]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * README-macos.md: more information [4db2895]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add draft README-macos.md, adjust tools/release.sh [9f6464f]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add Makefile [2ad0d1b]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * revised debug level (0:none -- 3:most verbose) [5fe9d00]
+
+2017-10-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * --fontdef-add can be given multiple times [70b5042]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database overwrite warning too noisy, switching to debug [e0fad54]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * ignore cjk-gs-integrate-data.dat this is the default of --dump-data [cdeaed6]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * search external database using kpsewhich -format=miscfont [3987272]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Warning on Mac OS 10.11 or later without --fontdef-add [05599ae]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * separate hiragino chinese [6c012e3]
+
+2017-09-30 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Clean up macOS database [d516eab]
+
+2017-09-28 doraTeX <taylorkgb@gmail.com>
+
+ * Separate macOS fonts [9c48c51]
+
+2017-09-27 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * implement --fontdef-add option this works as an addition (not a substitution) to the already-available database. it would be useful for OS-specific additional database [2562926]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * SubfontID is unnecessary for TTF, omit it [0c5187e]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * re-implement --dump-data option Now usable for dumping effective database only [d3e2154]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * --dump-data option is unsupported temporarily I'll re-implement this option as a dumper of only effective database, not a merely copying the built-in database [f56585f]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * fix typo in database [faafa60]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * start code refactoring I'd like to implement --fontdef-add option, to allow multiple database input. First in this commit, separate database catching and database reading. [c06d27d]
+
+2017-09-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tweaked [bcfc0b1]
+
+2017-07-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add lowercase link name for simsun.ttf [42e61f0]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * more likely to find gswin32c Resource [1a873db]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * strict check for exclusive options [ca86015]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Release 20170624.0 (tag: 20170624.0) [962f02b]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Better comments, update README.md from source [b204205]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Re-add MS-UIGothic (reverts 9a724ad), add YuGothic-UI These are supported by cidfmap.TeXLive by tlgs.win32, so we should restore it [ef00a77]
+
+2017-06-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add more database (based on WPS Office for Linux) [3dcdd5f]
+
+2017-06-23 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * TTC preferred to TTF for Yu-win, OTC warnings to debug (aminophen/cleanup) [35065fe]
+
+2017-06-21 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * more cp932 for win32 console (list-aliases, list-fonts) [d8518a4]
+
+2017-06-20 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * NTFS symlink on win32 has file size = 0, we can distinguish it [ab9b543]
+
+2017-06-20 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * More cleanup operation (#5) [7e03a4a]
+
+2017-06-20 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Implement a general cleanup operation (trial) (#5) [bfb8138]
+
+2017-06-19 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tidy up the order of sub functions [47e08a1]
+
+2017-06-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * add more comments [4a432a0]
+
+2017-06-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * check --list-fonts and --list-all-aliases conflict [62eb267]
+
+2017-06-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * fix uninitialized types for --list-all-aliases this bug was introduced when OTC is excluded from aliases [5d7167b]
+
+2017-06-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tidy up (more) [b61e550]
+
+2017-06-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * support --winbatch=[FILE] and --dump-data=[FILE], tidy up [ed28a2b]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * --markdown assumes --help too [97e262b]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Update README.md from source [2e46b62]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add --dump-data option, for easily editing built-in database [de30570]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Move info_list_aliases to sub [bb5f7b4]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * the issue has been settled in 0d03be7 [786b870]
+
+2017-06-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * sort keys to output lines in the same order for each run [06567da]
+
+2017-06-16 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Fix danglink links for NTFS on win32, kpsewhich -all [0d03be7]
+
+2017-05-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Remove MS-UIGothic database [9a724ad]
+
+2017-05-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add HiraMin{Pro,ProN}-W2 database [194bfd2]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Release 20170505.0 (tag: 20170505.0) [1f040e5]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * snippets: %% -> %, %%%% -> %% seems enough [ba0b225]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * help message: search paths all if available [727f51c]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * update README.md from source [61ca8ec]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Merge branch 'win32-support' [a8528dc]
+
+2017-05-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * fix a mistake, adjust help message for search path (aminophen/win32-support) [8fd2c88]
+
+2017-05-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * more TODO for win32 [b2d0cf5]
+
+2017-05-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * the order of option declaration [584c0d5]
+
+2017-05-02 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * throw an error for machine-readable alone [bbbd319]
+
+2017-04-29 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * file check [0cf210f]
+
+2017-04-27 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * fix a mistake in previous commit [e73ca96]
+
+2017-04-27 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * ensure new line when adding .runlibfile line [d12f6bb]
+
+2017-04-27 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * more chinese/korean database from debian packages [cf306ed]
+
+2017-04-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * comment [78cd68b]
+
+2017-04-26 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * default to symlink for win32, add --hardlink option [bd87af7]
+
+2017-04-25 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * change output to lib/ for tlgs, winbatch instruction [aebfd74]
+
+2017-04-25 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * tweaked [f487ab8]
+
+2017-04-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * symplify code for Encode::decode -> Encode::encode chain [ca81c6f]
+
+2017-04-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * simplify code [b2c9c77]
+
+2017-04-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * database sync [6ebc456]
+
+2017-04-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Determine tlgs or native-gs (work in progress) [2eb249a]
+
+2017-04-15 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * better aliases [362084c]
+
+2017-03-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * typo in previous commit [092b662]
+
+2017-03-22 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add --winbatch option [cea39ee]
+
+2017-03-17 Norbert Preining <norbert@preining.info>
+
+ * add a TODO concerning symlink generation on Windows [ab4a6ca]
+
+2017-03-17 Norbert Preining <norbert@preining.info>
+
+ * simplify code [c755d0f]
+
+2017-03-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add more database for Mac [3254356]
+
+2017-03-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Forgotten fonts for Mac OS X 10.7.5 (Lion) [f8de6fa]
+
+2017-03-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add more database for Office for Mac 2016 [0b9f826]
+
+2017-03-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Support for Office for Mac 2016 search path (typo) [8460b62]
+
+2017-03-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Support for Office for Mac 2016 search path [4db0f57]
+
+2017-03-17 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add database for Office for Mac 2016, MSOffice 2010 [86fce22]
+
+2017-03-09 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * More database for win32 [901274f]
+
+2017-03-09 Norbert Preining <norbert@preining.info>
+
+ * Release 20170309.0 (tag: 20170309.0) [8ce526f]
+
+2017-03-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Update wrt. master [6503d0e]
+
+2017-03-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * comment [efcd6ec]
+
+2017-03-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Fix for Hiragino aliases (#23) [b1fb331]
+
+2017-03-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Hiragino aliases (gs9.20 without OTC support) [1c494b6]
+
+2017-03-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * bug fix for morisawa aliases [bcbce0c]
+
+2017-02-24 Norbert Preining <norbert@preining.info>
+
+ * update release script for CTAN location [f2ae343]
+
+2017-02-20 Norbert Preining <norbert@preining.info>
+
+ * Release 20170220.0 (tag: 20170220.0) [4997503]
+
+2017-02-20 Norbert Preining <norbert@preining.info>
+
+ * update copyright [a865618]
+
+2017-02-20 Norbert Preining <norbert@preining.info>
+
+ * update README.md from source [a22f890]
+
+2017-02-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * alias priority: New priority for Simplified/Traditional Chinese [4f02658]
+
+2017-02-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * alias priority: Kozuka before Yu, Adobe before Solaris [4b3e12c]
+
+2017-02-08 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Fix for priority numbers (#12) [97b0c63]
+
+2017-01-18 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Support for ptex-fontmaps 20170114.0 (ume, yu etc.) [cd91c2f]
+
+2017-01-14 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Win32 support: symlink/unlink consistency, quote [0445c18]
+
+2017-01-14 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Win32 support: encode/decode (cp932 <=> utf8) [6e51c3d]
+
+2017-01-14 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Reduce file open/close (again) [5c7e946]
+
+2017-01-13 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Add data for psnames-for-otf also for aliases [5142e98]
+
+2017-01-12 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * better code [d439cac]
+
+2017-01-12 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Reduce file open/close for winbatch and otfps [6cff16a]
+
+2016-12-29 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add fandol database (typo) [7c15bdf]
+
+2016-12-29 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add fandol database [1de88ed]
+
+2016-12-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Generate psnames-for-otf only when --otfps is given [a1fbdb3]
+
+2016-12-23 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Experiment for supporting win32 (again) [ba45bee]
+
+2016-12-23 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Experiment for supporting win32 [2846489]
+
+2016-12-14 Norbert Preining <norbert@preining.info>
+
+ * fix indentation, add better explanation for case-insensitve problem [b73e45b]
+
+2016-12-14 Norbert Preining <norbert@preining.info>
+
+ * update README.md with the changes included recently [0330718]
+
+2016-12-14 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add moga-mobo database [de56b28]
+
+2016-12-14 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #20 from aminophen/ttc-ttf-otc [72cc9f1]
+
+2016-12-13 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix for Name entry different from PSName (aminophen/ttc-ttf-otc) [fcd2515]
+
+2016-12-13 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Complete TTC/OTC database (thanks to @doraTeX) [67a90e3]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Parse 'Filename:' entry for backward compatibility [ce22753]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Show subfont number only when TTC/OTC (even zero) [4ea9cab]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix typo in d3ad4b4 [515e303]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Do not use OTC font as aliases [780f3b2]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Forgotten initialization [ebb6326]
+
+2016-12-12 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Separate OTC/TTC/TTF (experiment) [d3ad4b4]
+
+2016-12-10 Yusuke Terada <taylorkgb@gmail.com>
+
+ * Merge pull request #19 from doraTeX/master [3db9b75]
+
+2016-12-10 doraTeX <taylorkgb@gmail.com>
+
+ * Revert unintended Unicode normalization [83267e7]
+
+2016-12-10 Yusuke Terada <taylorkgb@gmail.com>
+
+ * Merge pull request #18 from doraTeX/master [2666a1d]
+
+2016-12-10 Yusuke Terada <taylorkgb@gmail.com>
+
+ * cjk-gs-integrate.pl: Fix regex for /bin/gs [2e5d027]
+
+2016-12-10 doraTeX <taylorkgb@gmail.com>
+
+ * cjk-gs-integrate.pl: Fix regex for /bin/gs [a41ddd0]
+
+2016-12-09 aminophen <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate.pl: change ttfname -> ttname [9bdfd20]
+
+2016-12-06 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix a mistake in previous commit [daf1c07]
+
+2016-12-06 aminophen <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate.pl: more database (CJK-Unifonts) [513d8b1]
+
+2016-12-05 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Merge branch 'master' of https://github.com/texjporg/cjk-gs-support [ceb9542]
+
+2016-12-05 aminophen <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate.pl: more database (arphic) [33b19ff]
+
+2016-12-05 Norbert Preining <norbert@preining.info>
+
+ * adjust header for copyright and url [4da74ae]
+
+2016-12-03 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix for texjporg/jfontmaps#6 (second attempt) [2374e0c]
+
+2016-12-03 aminophen <h.y.acetaminophen@gmail.com>
+
+ * More .gitignore [e3f323e]
+
+2016-12-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * cjk-gs-integrate.pl: Fix for database [ec61fef]
+
+2016-10-26 Norbert Preining <norbert@preining.info>
+
+ * Release 20161026.0 (tag: 20161026.0) [af37d2e]
+
+2016-10-26 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #16 from aminophen/master [480b932]
+
+2016-10-26 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Finished macOS Sierra CJK font database. [7763ba6]
+
+2016-10-07 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #15 from aminophen/master [5c852da]
+
+2016-10-05 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Small fix for comments (thanks to @doraTeX) [40017a9]
+
+2016-10-05 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add CK font list (partial) [90fae6c]
+
+2016-10-04 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add macOS Sierra fonts (Japan) [003e010]
+
+2016-10-02 Norbert Preining <norbert@preining.info>
+
+ * add Yamashita-san to help and README [9fb17a2]
+
+2016-10-02 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #14 from aminophen/master [8c8e81e]
+
+2016-10-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add more korean fonts, priority settings [9de8aca]
+
+2016-10-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add more korean fonts, priority settings [db77c33]
+
+2016-10-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * small fixups [dfaf936]
+
+2016-10-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * small fixups [206ffec]
+
+2016-10-02 aminophen <h.y.acetaminophen@gmail.com>
+
+ * restore previous code [ed5c381]
+
+2016-10-01 Norbert Preining <norbert@preining.info>
+
+ * small fixups [38a2059]
+
+2016-10-01 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #13 from aminophen/gsres [9f702b2]
+
+2016-10-01 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Directory check [4845c37]
+
+2016-10-01 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Assume relative path of gs-resource [8e54dc3]
+
+2016-09-29 Norbert Preining <norbert@preining.info>
+
+ * update copyright year [df1fd69]
+
+2016-09-29 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #11 from aminophen/master [5993098]
+
+2016-09-29 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add baekmuk (korean) -- now the lowest priority [e6edb62]
+
+2016-09-29 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #10 from aminophen/master [0171ef8]
+
+2016-09-28 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Use 'sep' instead of ':' [f87a35b]
+
+2016-09-27 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Workaround (not setting OPENTYPEFONTS/TTFONTS explicitly) [7d0f926]
+
+2016-09-27 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix a mistake [10e8fd0]
+
+2016-09-27 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Special name (IPAMincho.ttf etc) not needed [ffd8e79]
+
+2016-09-27 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #8 from aminophen/master [2619378]
+
+2016-09-26 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Prevent ttc -> ttf symlink (Songti/STSong, Kaiti/STKaiti) [043feee]
+
+2016-09-25 aminophen <h.y.acetaminophen@gmail.com>
+
+ * TODO: comment about wrong symlink [3009288]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix for STHeiti family [91455e9]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * cleanup [7b0d0e3]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add ipa-proportional database [548fa68]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add yuwin10 fonts to yu-win database [e7acb2c]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix for hiragino database [805e1b1]
+
+2016-09-24 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Fix morisawa database [68f500d]
+
+2016-09-23 aminophen <h.y.acetaminophen@gmail.com>
+
+ * typo [5d116a1]
+
+2016-09-23 aminophen <h.y.acetaminophen@gmail.com>
+
+ * Add /System/Library/Assets, /usr/share/fonts, recursive search [5b96e5a]
+
+2016-01-15 Norbert Preining <norbert@preining.info>
+
+ * Release 20160115.0 (tag: 20160115.0) [bfb2c76]
+
+2016-01-15 Norbert Preining <norbert@preining.info>
+
+ * ship README.md as is, supported by CTAN now [ad27d2b]
+
+2016-01-15 Norbert Preining <norbert@preining.info>
+
+ * remove unrelated file [5f10f56]
+
+2016-01-15 Norbert Preining <norbert@preining.info>
+
+ * Release 20160115.0 [5a42230]
+
+2016-01-14 Norbert Preining <norbert@preining.info>
+
+ * if --link-texmf is passed without argument use TEXMFLOCAL again [a4a8228]
+
+2015-10-21 Norbert Preining <norbert@preining.info>
+
+ * remove cleanup_link and bruteforce [1f9649d]
+
+2015-10-21 Norbert Preining <norbert@preining.info>
+
+ * fix TTFONT env name [2eee0ce]
+
+2015-10-20 Norbert Preining <norbert@preining.info>
+
+ * resolve symlinks to make sure we don't catch the wrong files [9f68007]
+
+2015-10-20 Norbert Preining <norbert@preining.info>
+
+ * put OSFONTDIR before OPENTYPEFONTS and TTFFONTS [c28684d]
+
+2015-10-19 Norbert Preining <norbert@preining.info>
+
+ * fix problems with links pointing to itself [76e5f82]
+
+2015-10-19 Norbert Preining <norbert@preining.info>
+
+ * fix name of otf font links in texmf dir [0fc6e58]
+
+2015-10-11 Norbert Preining <norbert@preining.info>
+
+ * rework link_font to warn only if necessary [c2b986d]
+
+2015-10-11 Norbert Preining <norbert@preining.info>
+
+ * remove end-of-lines of gs output [157a150]
+
+2015-10-10 Norbert Preining <norbert@preining.info>
+
+ * better extraction of gs resource (Issue: #6) [c01d79e]
+
+2015-10-10 Norbert Preining <norbert@preining.info>
+
+ * list other candidates for --list-fonts and --info [bb03240]
+
+2015-10-02 Norbert Preining <norbert@preining.info>
+
+ * Release 20151002.0 (tag: 20151002.0) [0cab259]
+
+2015-10-02 Norbert Preining <norbert@preining.info>
+
+ * update documentation [403383d]
+
+2015-09-28 Norbert Preining <norbert@preining.info>
+
+ * update README.md for current status [789f124]
+
+2015-09-28 Norbert Preining <norbert@preining.info>
+
+ * add --remove option [fea9b13]
+
+2015-09-28 Norbert Preining <norbert@preining.info>
+
+ * use only --link-texmf with optional argument [d2ff6f8]
+
+2015-09-25 Norbert Preining <norbert@preining.info>
+
+ * add HIraginoSans-W2 [10ca035]
+
+2015-09-24 Norbert Preining <norbert@preining.info>
+
+ * use ttfname also for CIDFSubst link and cidfmap entry, add texmfout option [6acc38a]
+
+2015-09-24 Norbert Preining <norbert@preining.info>
+
+ * ttf link name support [970dcf0]
+
+2015-09-24 Norbert Preining <norbert@preining.info>
+
+ * auto-determine type of fontfile, and make type file specific [f8b7032]
+
+2015-09-22 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #4 from doraTeX/master [fed6b30]
+
+2015-09-22 doraTeX <taylorkgb@gmail.com>
+
+ * Update font definitions for the latest El Capitan [86d28d1]
+
+2015-07-24 Norbert Preining <preining@logic.at>
+
+ * Merge pull request #1 from munepi/master [98e37ef]
+
+2015-07-24 Munehiro Yamamoto <munepixyz@gmail.com>
+
+ * cjk-gs-integrate.pl (encode_list): added 2004-{H,V} for Japan [51f4ffd]
+
+2015-07-24 Norbert Preining <norbert@preining.info>
+
+ * add ISX 10.11 El Capitan fonts [dbe04b4]
+
+2015-05-07 Norbert Preining <norbert@preining.info>
+
+ * fix line endings [81f0a82]
+
+2015-05-07 Norbert Preining <norbert@preining.info>
+
+ * remove x bit from prn-variants.tex [202fc80]
+
+2015-05-07 Norbert Preining <norbert@preining.info>
+
+ * rename README.md to README on release [25dcf6d]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * Release 20150506.1 (tag: 20150506.1) [daf2e89]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * reactivate aliases for MSung-Light and STFangsong-Light [bf0d437]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * remove debug statement [cf81cb7]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * Release 20150506.0 (tag: 20150506.0) [24db8e7]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * add a release script [593eb64]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * genrated md and help output from the same source [32c57ed]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * add /Library/Fonts/Microsoft to search path, add --link-texmflocal option [fc80300]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * provide family like aliases [32a827a]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * remove provides for two imaginary fonts ;-) [f55f662]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * add more Kozuka fonts (not used in jfontmaps) [32d46e9]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * make gulim provide HyGoThic-Medium in case Dotum is not available [b41adbb]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * STKaiti-Adobe-CNS1 update from Bruno [40ad49f]
+
+2015-05-06 Norbert Preining <norbert@preining.info>
+
+ * add MidashiGo(Pro) provides, fix FutoMin provides for IPA [a173ce6]
+
+2015-04-24 Norbert Preining <norbert@preining.info>
+
+ * make link checking more resilient to errors [fa083ce]
+
+2015-04-24 Norbert Preining <norbert@preining.info>
+
+ * terminate immediately on windows, add some TODOs [8a12b5a]
+
+2015-04-24 Norbert Preining <norbert@preining.info>
+
+ * adjust prefs, add warning when provide priorities agree [c1fffb1]
+
+2015-04-24 Norbert Preining <norbert@preining.info>
+
+ * add more fonts from Microsoft 2015 for Apple [d9348d4]
+
+2015-04-24 Norbert Preining <norbert@preining.info>
+
+ * add --list-all-aliases command [c040122]
+
+2015-04-23 Norbert Preining <norbert@preining.info>
+
+ * add --force option [e4d9ce5]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * add decomposed form filenames for HFS [28c79ea]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * add support for reading files from file list, fix some fonts [a6a4c34]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * update README.md [3d5090f]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * lots of changes, automated testing [8c73fa0]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * order alias output [66bbe4a]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * really fix Morisawa fonts [21be97b]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * make morisawa fonts work [9462210]
+
+2015-04-21 Norbert Preining <norbert@preining.info>
+
+ * add Gulim fonts for HYRGoThic-Medium [1acf5f3]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * remove the strange alias with extra - at the end [5105987]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * add ~/Library/Fonts and /Network/Library/Fonts on unix/mac add alas for HYRGoThic-Medium [7c8f87f]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * link ttf fonts *not* into Font dir, but into CIDFSubst [513adae]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * first step in Morisawa support, add PSName to font database [ef59d24]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * provide more Foobar- font names for GhostScript [7288e8c]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * sort alias names, remove last Std alias [2d47a81]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * rank Adobe CK fonts higher, fix list aliases ouput [0d4b693]
+
+2015-04-20 Norbert Preining <norbert@preining.info>
+
+ * add priority to output of aliases [cb5b296]
+
+2015-04-19 Norbert Preining <norbert@preining.info>
+
+ * list aliases separated in categories [751a7ee]
+
+2015-04-19 Norbert Preining <norbert@preining.info>
+
+ * add entries for Adobe's CK fonts [8c9fb77]
+
+2015-04-19 Norbert Preining <norbert@preining.info>
+
+ * add more strange provides ... [6567c15]
+
+2015-04-19 Norbert Preining <norbert@preining.info>
+
+ * add more aliases after dicsussion with Bruno [e1d089c]
+
+2015-04-16 Norbert Preining <norbert@preining.info>
+
+ * formatting [2f07c70]
+
+2015-04-16 Norbert Preining <norbert@preining.info>
+
+ * README.md and help output editing [ffd1988]
+
+2015-04-16 Norbert Preining <norbert@preining.info>
+
+ * update README.md [b6667d5]
+
+2015-04-16 Norbert Preining <norbert@preining.info>
+
+ * lots of updates, in particular ttf linking and user aliases [060376a]
+
+2015-04-14 Norbert Preining <norbert@preining.info>
+
+ * priorities for file names, unify priority writing [1d2727f]
+
+2015-04-13 Norbert Preining <norbert@preining.info>
+
+ * remove font-definitions.txt, always outdated [b532745]
+
+2015-04-13 Norbert Preining <norbert@preining.info>
+
+ * add more alias for Korean [c610bb8]
+
+2015-04-13 Norbert Preining <norbert@preining.info>
+
+ * add TODO, gitingore, and some tests [8f4de68]
+
+2015-04-13 Norbert Preining <norbert@preining.info>
+
+ * fixes for Korean [287b64d]
+
+2015-04-11 Norbert Preining <norbert@preining.info>
+
+ * fix subfonts in ttcs, add more fonts for Korea (not working) [243b61e]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * more name fixes from Bruno [33fb493]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * update font-definitions file [fb1135a]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * Korean support (hopefully), fix some name errors [1bb8aed]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * add some provides for TC SC and Korean, and fixes, thanks Bruno [5b754be]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * fix spaces in file names [d7b1ab8]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * fix Dumper usage [05e5789]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * load Data::Dumper only when debugging [a839074]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * add font-definitions for ease of access, but not really used [35302c0]
+
+2015-04-08 Norbert Preining <norbert@preining.info>
+
+ * fully working script including aliases [283d64a]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * more or less fully functional [88a478b]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * fix typo in cjk-font-definitons [eed0614]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * bummer [d111a8d]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * fix warning for missing font defs [4130ced]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * don't bail out if gs is not found, for now [b625240]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * more work [5b4489d]
+
+2015-04-07 Norbert Preining <norbert@preining.info>
+
+ * first commit [8011270]
+
diff --git a/fonts/utilities/cjk-gs-integrate/Makefile b/fonts/utilities/cjk-gs-integrate/Makefile
new file mode 100644
index 0000000000..21f16209ff
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/Makefile
@@ -0,0 +1,20 @@
+PROJECT=cjk-gs-integrate
+TEXMF = $(shell kpsewhich -var-value=TEXMFHOME)
+
+.PHONY: default install release
+default: README.md
+
+
+README.md: cjk-gs-integrate.pl
+ perl cjk-gs-integrate.pl --markdown > README.md
+
+install: README.md
+ mkdir -p ${TEXMF}/doc/fonts/$(PROJECT)
+ cp *.md ${TEXMF}/doc/fonts/$(PROJECT)/
+ mkdir -p ${TEXMF}/scripts/$(PROJECT)
+ cp *.pl ${TEXMF}/scripts/$(PROJECT)/
+ mkdir -p ${TEXMF}/fonts/misc/$(PROJECT)
+ cp database/*.dat ${TEXMF}/fonts/misc/$(PROJECT)/
+
+release: README.md
+ sh tools/release.sh
diff --git a/fonts/utilities/cjk-gs-integrate/README.md b/fonts/utilities/cjk-gs-integrate/README.md
new file mode 100644
index 0000000000..9f948f7b24
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/README.md
@@ -0,0 +1,226 @@
+Configuring Ghostscript for CJK CID/TTF fonts
+=============================================
+
+This script searches a list of directories for CJK fonts, and makes
+them available to an installed Ghostscript. In the simplest case with
+sufficient privileges, a run without arguments should effect in a
+complete setup of Ghostscript.
+Search is done using the kpathsea library, in particular `kpsewhich`
+program. To run this script, you will need some TeX distribution in
+your system.
+
+Usage
+-----
+
+`````
+[perl] cjk-gs-integrate[.pl] [OPTIONS]
+`````
+
+#### Options ####
+
+`````
+ -o, --output DIR specifies the base output dir, if not provided,
+ the Resource directory of an installed Ghostscript
+ is searched and used.
+ -f, --fontdef FILE specify alternate set of font definitions, if not
+ given, the built-in set is used
+ --fontdef-add FILE specify additional set of font definitions, to
+ overwrite subset of built-in definitions;
+ can be given multiple times
+ -a, --alias LL=RR defines an alias, or overrides a given alias;
+ illegal if LL is provided by a real font, or
+ RR is neither available as real font or alias;
+ can be given multiple times
+ --filelist FILE read list of available font files from FILE
+ instead of searching with kpathsea
+ --link-texmf [DIR] link fonts into
+ DIR/fonts/opentype/cjk-gs-integrate
+ and
+ DIR/fonts/truetype/cjk-gs-integrate
+ where DIR defaults to TEXMFLOCAL
+ --otfps [DIR] generate configuration file (psnames-for-otf) into
+ DIR/dvips/ps2otfps
+ which is used by ps2otfps (developed by Akira Kakuto),
+ instead of generating snippets
+ --force do not bail out if linked fonts already exist
+ --remove try to remove instead of create
+ --cleanup try to clean up all possible links/snippets and
+ cidfmap.local/cidfmap.aliases, which could have been
+ generated in the previous runs
+ -n, --dry-run do not actually output anything
+ -q, --quiet be less verbose
+ -d, --debug output debug information, can be given multiple times
+ -v, --version outputs only the version information
+ -h, --help this help
+`````
+
+#### Windows only options ####
+
+`````
+ --hardlink create hardlinks instead of symlinks
+ --winbatch [FILE] prepare a batch file for link generation, instead of
+ generating links right away
+ the batch file name defaults to makefontlinks.bat
+`````
+
+#### Command like options ####
+
+`````
+ --dump-data [FILE] dump the set of font definitions which is currently
+ effective, where FILE (the dump output) defaults to
+ cjk-gs-integrate-data.dat; you can easily modify it,
+ and tell me with -f (or --fontdef) option
+ --only-aliases regenerate only cidfmap.aliases file, instead of all
+ --list-aliases lists the available aliases and their options, with the
+ selected option on top
+ --list-all-aliases list all possible aliases without searching for
+ actually present files
+ --list-fonts lists the fonts found on the system
+ --info combines the information of --list-aliases and
+ --list-fonts
+ --machine-readable output of --list-aliases is machine readable
+`````
+
+Operation
+---------
+
+For each found TrueType (TTF) font it creates a cidfmap entry in
+
+ <Resource>/Init/cidfmap.local
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap.local instead
+
+and links the font to
+
+ <Resource>/CIDFSubst/
+
+For each CID font it creates a snippet in
+
+ <Resource>/Font/
+
+and links the font to
+
+ <Resource>/CIDFont/
+
+The `<Resource>` dir is either given by `-o`/`--output`, or otherwise searched
+from an installed Ghostscript (binary name is assumed to be 'gs' on unix,
+'gswin32c' on win32).
+
+Aliases are added to
+
+ <Resource>/Init/cidfmap.aliases
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap.aliases instead
+
+Finally, it tries to add runlib calls to
+
+ <Resource>/Init/cidfmap
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap
+
+to load the cidfmap.local and cidfmap.aliases.
+
+How and which directories are searched
+--------------------------------------
+
+Search is done using the kpathsea library, in particular using kpsewhich
+program. By default the following directories are searched:
+ - all TEXMF trees
+ - `/Library/Fonts`, `/Library/Fonts/Microsoft`, `/System/Library/Fonts`,
+ `/System/Library/Assets`, `/Network/Library/Fonts`,
+ `~/Library/Fonts` and `/usr/share/fonts` (all if available)
+ - `/Applications/Microsoft Word.app/Contents/Resources/{Fonts,DFonts}`,
+ `/Applications/Microsoft Excel.app/Contents/Resources/{Fonts,DFonts}`,
+ `/Applications/Microsoft PowerPoint.app/Contents/Resources/{Fonts,DFonts}`
+ (all if available, meant for Office for Mac 2016)
+ - `c:/windows/fonts` (on Windows)
+ - the directories in `OSFONTDIR` environment variable
+
+In case you want to add some directories to the search path, adapt the
+`OSFONTDIR` environment variable accordingly: Example:
+
+`````
+ OSFONTDIR="/usr/local/share/fonts/truetype//:/usr/local/share/fonts/opentype//" $prg
+`````
+
+will result in fonts found in the above two given directories to be
+searched in addition.
+
+Output files
+------------
+
+If no output option is given, the program searches for a Ghostscript
+interpreter 'gs' and determines its Resource directory. This might
+fail, in which case one need to pass the output directory manually.
+
+Since the program adds files and link to this directory, sufficient
+permissions are necessary.
+
+Aliases
+-------
+
+Aliases are managed via the Provides values in the font database.
+At the moment entries for the basic font names for CJK fonts
+are added:
+
+Japanese:
+
+ Ryumin-Light GothicBBB-Medium FutoMinA101-Bold FutoGoB101-Bold
+ MidashiMin-MA31 MidashiGo-MB31 Jun101-Light
+
+Korean:
+
+ HYSMyeongJo-Medium HYGoThic-Medium HYRGoThic-Medium
+
+Simplified Chinese:
+
+ STSong-Light STSong-Regular STHeiti-Regular STHeiti-Light
+ STKaiti-Regular STFangsong-Light STFangsong-Regular
+
+Traditional Chinese:
+
+ MSung-Light MSung-Medium MHei-Medium MKai-Medium
+
+In addition, we also include provide entries for the OTF Morisawa names:
+
+ RyuminPro-Light GothicBBBPro-Medium
+ FutoMinA101Pro-Bold FutoGoB101Pro-Bold
+ MidashiMinPro-MA31 MidashiGoPro-MB31 Jun101Pro-Light
+
+The order is determined by the `Provides` setting in the font database.
+That is, the first font found in this order will be used to provide the
+alias if necessary.
+
+For the Japanese fonts:
+ Morisawa Pr6N, Morisawa, Hiragino ProN, Hiragino,
+ Kozuka Pr6N, Kozuka ProVI, Kozuka Pro, Kozuka Std,
+ Yu OS X, Yu Win, MS,
+ Moga-Mobo-ex, Moga-Mobo, IPAex, IPA, Ume
+
+For the Korean fonts:
+ (Hanyang,) Adobe, Solaris, MS, Unfonts, Baekmuk
+
+For the Simplified Chinese:
+ Adobe, Fandol, Hiragino, Founder, MS, CJKUnifonts, Arphic, CJKUnifonts-ttf
+
+For the Traditional Chinese:
+ Adobe, MS, CJKUnifonts, Arphic, CJKUnifonts-ttf
+
+#### Overriding aliases ####
+
+Using the command line option `--alias LL=RR` one can add arbitrary aliases,
+or override ones selected by the program. For this to work the following
+requirements of `LL` and `RR` must be fulfilled:
+ * `LL` is not provided by a real font
+ * `RR` is available either as real font, or as alias (indirect alias)
+
+Authors, Contributors, and Copyright
+------------------------------------
+
+The script and its documentation was written by Norbert Preining, based
+on research and work by Yusuke Kuroki, Yusuke Terada, Bruno Voisin,
+Hironobu Yamashita, Munehiro Yamamoto and the TeX Q&A wiki page.
+
+Maintained by Japanese TeX Development Community. For development, see
+ https://github.com/texjporg/cjk-gs-support
+
+The script is licensed under GNU General Public License Version 3 or later.
+The contained font data is not copyrightable.
+
diff --git a/fonts/utilities/cjk-gs-integrate/cjk-gs-integrate.pl b/fonts/utilities/cjk-gs-integrate/cjk-gs-integrate.pl
new file mode 100755
index 0000000000..6fce593611
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/cjk-gs-integrate.pl
@@ -0,0 +1,2675 @@
+#!/usr/bin/env perl
+#
+# cjk-gs-integrate - setup Ghostscript for CID/TTF CJK fonts
+#
+# Copyright 2015-2019 by Norbert Preining
+# Copyright 2016-2019 by Japanese TeX Development Community
+#
+# This work is based on research and work by (in alphabetical order)
+# Yusuke Kuroki
+# Yusuke Terada
+# Bruno Voisin
+# Munehiro Yamamoto
+# Hironobu Yamashita
+# and the Japanese TeX Q&A wiki page
+#
+# This file is licensed under GPL version 3 or any later version.
+# For copyright statements see end of file.
+#
+# For development see
+# https://github.com/texjporg/cjk-gs-support
+#
+# LIMITATIONS:
+# - Running the script (with default mode = actual setup/removing operations)
+# always overwrites "cidfmap.local" and "cidfmap.aliases" without asking,
+# whose file names might be common enough. If you choose to run the script,
+# leave these files untouched. (Do NOT edit these files by yourself!)
+# (This note also applies to MacTeX pre-shipped configuration files.)
+#
+# TODO:
+# - interoperability with kanji-config-updmap
+#
+# Note that symlink names should be consistent with ptex-fontmaps!
+
+$^W = 1;
+use Getopt::Long qw(:config no_autoabbrev ignore_case_always);
+use File::Basename;
+use File::Path qw(make_path);
+use Cwd 'abs_path';
+use strict;
+
+(my $prg = basename($0)) =~ s/\.pl$//;
+my $version = '20190816.0';
+
+if (win32()) {
+ # conversion between internal (utf-8) and console (cp932):
+ # multibyte characters should be encoded in cp932 at least during
+ # * kpathsea file search
+ # * abs_path existence test
+ # * input/output on console
+ # * batch file output
+ # routines. make sure all of these should be restricted to win32 mode!
+ # TODO: what to do with $opt_fontdef, @opt_aliases and $opt_filelist,
+ # with regard to encodings?
+ use utf8;
+ use Encode;
+ # some perl functions (symlink, -l test) does not work
+ print_warning("Sorry, we have only partial support for Windows!\n");
+}
+
+# The followings are installed by ptex-fontmaps (texjporg):
+# * 2004-H
+# * 2004-V
+# The followings are created by Adobe but not considered official
+# (see https://forums.adobe.com/thread/537415)
+# * GB-RKSJ-H
+# * GBT-RKSJ-H
+# * KSC-RKSJ-H
+# All others are provided in the latest Adobe CMap Resources:
+# https://github.com/adobe-type-tools/cmap-resources
+my %encode_list = (
+ Japan => [ qw/
+ 2004-H
+ 2004-V
+ 78-EUC-H
+ 78-EUC-V
+ 78-H
+ 78-RKSJ-H
+ 78-RKSJ-V
+ 78-V
+ 78ms-RKSJ-H
+ 78ms-RKSJ-V
+ 83pv-RKSJ-H
+ 90ms-RKSJ-H
+ 90ms-RKSJ-V
+ 90msp-RKSJ-H
+ 90msp-RKSJ-V
+ 90pv-RKSJ-H
+ 90pv-RKSJ-V
+ Add-H
+ Add-RKSJ-H
+ Add-RKSJ-V
+ Add-V
+ Adobe-Japan1-0
+ Adobe-Japan1-1
+ Adobe-Japan1-2
+ Adobe-Japan1-3
+ Adobe-Japan1-4
+ Adobe-Japan1-5
+ Adobe-Japan1-6
+ Adobe-Japan1-7
+ EUC-H
+ EUC-V
+ Ext-H
+ Ext-RKSJ-H
+ Ext-RKSJ-V
+ Ext-V
+ H
+ Hankaku
+ Hiragana
+ Identity-H
+ Identity-V
+ Katakana
+ NWP-H
+ NWP-V
+ RKSJ-H
+ RKSJ-V
+ Roman
+ UniJIS-UCS2-H
+ UniJIS-UCS2-HW-H
+ UniJIS-UCS2-HW-V
+ UniJIS-UCS2-V
+ UniJIS-UTF16-H
+ UniJIS-UTF16-V
+ UniJIS-UTF32-H
+ UniJIS-UTF32-V
+ UniJIS-UTF8-H
+ UniJIS-UTF8-V
+ UniJIS2004-UTF16-H
+ UniJIS2004-UTF16-V
+ UniJIS2004-UTF32-H
+ UniJIS2004-UTF32-V
+ UniJIS2004-UTF8-H
+ UniJIS2004-UTF8-V
+ UniJISPro-UCS2-HW-V
+ UniJISPro-UCS2-V
+ UniJISPro-UTF8-V
+ UniJISX0213-UTF32-H
+ UniJISX0213-UTF32-V
+ UniJISX02132004-UTF32-H
+ UniJISX02132004-UTF32-V
+ V
+ WP-Symbol
+ / ],
+ GB => [ qw/
+ Adobe-GB1-0
+ Adobe-GB1-1
+ Adobe-GB1-2
+ Adobe-GB1-3
+ Adobe-GB1-4
+ Adobe-GB1-5
+ GB-EUC-H
+ GB-EUC-V
+ GB-H
+ GB-RKSJ-H
+ GB-V
+ GBK-EUC-H
+ GBK-EUC-V
+ GBK2K-H
+ GBK2K-V
+ GBKp-EUC-H
+ GBKp-EUC-V
+ GBT-EUC-H
+ GBT-EUC-V
+ GBT-H
+ GBT-RKSJ-H
+ GBT-V
+ GBTpc-EUC-H
+ GBTpc-EUC-V
+ GBpc-EUC-H
+ GBpc-EUC-V
+ Identity-H
+ Identity-V
+ UniGB-UCS2-H
+ UniGB-UCS2-V
+ UniGB-UTF16-H
+ UniGB-UTF16-V
+ UniGB-UTF32-H
+ UniGB-UTF32-V
+ UniGB-UTF8-H
+ UniGB-UTF8-V
+ / ],
+ CNS => [ qw/
+ Adobe-CNS1-0
+ Adobe-CNS1-1
+ Adobe-CNS1-2
+ Adobe-CNS1-3
+ Adobe-CNS1-4
+ Adobe-CNS1-5
+ Adobe-CNS1-6
+ Adobe-CNS1-7
+ B5-H
+ B5-V
+ B5pc-H
+ B5pc-V
+ CNS-EUC-H
+ CNS-EUC-V
+ CNS1-H
+ CNS1-V
+ CNS2-H
+ CNS2-V
+ ETHK-B5-H
+ ETHK-B5-V
+ ETen-B5-H
+ ETen-B5-V
+ ETenms-B5-H
+ ETenms-B5-V
+ HKdla-B5-H
+ HKdla-B5-V
+ HKdlb-B5-H
+ HKdlb-B5-V
+ HKgccs-B5-H
+ HKgccs-B5-V
+ HKm314-B5-H
+ HKm314-B5-V
+ HKm471-B5-H
+ HKm471-B5-V
+ HKscs-B5-H
+ HKscs-B5-V
+ Identity-H
+ Identity-V
+ UniCNS-UCS2-H
+ UniCNS-UCS2-V
+ UniCNS-UTF16-H
+ UniCNS-UTF16-V
+ UniCNS-UTF32-H
+ UniCNS-UTF32-V
+ UniCNS-UTF8-H
+ UniCNS-UTF8-V
+ / ],
+ Korea => [ qw/
+ Adobe-Korea1-0
+ Adobe-Korea1-1
+ Adobe-Korea1-2
+ Identity-H
+ Identity-V
+ KSC-EUC-H
+ KSC-EUC-V
+ KSC-H
+ KSC-Johab-H
+ KSC-Johab-V
+ KSC-RKSJ-H
+ KSC-V
+ KSCms-UHC-H
+ KSCms-UHC-HW-H
+ KSCms-UHC-HW-V
+ KSCms-UHC-V
+ KSCpc-EUC-H
+ KSCpc-EUC-V
+ UniKS-UCS2-H
+ UniKS-UCS2-V
+ UniKS-UTF16-H
+ UniKS-UTF16-V
+ UniKS-UTF32-H
+ UniKS-UTF32-V
+ UniKS-UTF8-H
+ UniKS-UTF8-V
+ / ] );
+
+#
+# location where links to fonts in texmf are created, relative to TEXMF
+my $otf_pathpart = "fonts/opentype/cjk-gs-integrate";
+my $ttf_pathpart = "fonts/truetype/cjk-gs-integrate";
+
+# location where cidfmap, cidfmap.local and cidfmap.aliases are placed
+# when found gs is tlgs (win32), then files will be placed in lib/ instead of Resource/Init/
+my $cidfmap_pathpart = "Init/cidfmap";
+my $cidfmap_local_pathpart = "Init/cidfmap.local";
+my $cidfmap_aliases_pathpart = "Init/cidfmap.aliases";
+
+# support for ps2otfps by Akira Kakuto
+my $akotfps_pathpart = "dvips/ps2otfps";
+my $akotfps_datafilename = "psnames-for-otf";
+my $akotfps_datacontent = '';
+
+# if windows, we might create batch file for links
+my $winbatch = "makefontlinks.bat";
+my $winbatch_content = '';
+
+# dump output for data file (for easy editing for users)
+my $dump_datafile = "$prg-data.dat";
+
+my $opt_output;
+my $opt_fontdef;
+my @opt_fontdef_add;
+my @opt_aliases;
+my $opt_filelist;
+my $opt_texmflink;
+my $opt_akotfps;
+my $opt_force = 0;
+my $opt_remove = 0;
+my $opt_cleanup = 0;
+my $opt_hardlink = 0;
+my $opt_winbatch;
+my $opt_dump_data;
+my $opt_only_aliases = 0;
+my $opt_listaliases = 0;
+my $opt_listallaliases = 0;
+my $opt_listfonts = 0;
+my $opt_info = 0;
+my $opt_machine = 0;
+my $opt_strictpsname = 0;
+my $dry_run = 0;
+my $opt_quiet = 0;
+my $opt_debug = 0;
+my $opt_help = 0;
+my $opt_markdown = 0;
+
+if (! GetOptions(
+ "o|output=s" => \$opt_output,
+ "f|fontdef=s" => \$opt_fontdef,
+ "fontdef-add=s" => \@opt_fontdef_add,
+ "a|alias=s" => \@opt_aliases,
+ "filelist=s" => \$opt_filelist,
+ "link-texmf:s" => \$opt_texmflink,
+ "otfps:s" => \$opt_akotfps,
+ "force" => \$opt_force,
+ "remove" => \$opt_remove,
+ "cleanup" => \$opt_cleanup,
+ "hardlink" => \$opt_hardlink,
+ "winbatch:s" => \$opt_winbatch,
+ "dump-data:s" => \$opt_dump_data,
+ "only-aliases" => \$opt_only_aliases,
+ "list-aliases" => \$opt_listaliases,
+ "list-all-aliases" => \$opt_listallaliases,
+ "list-fonts" => \$opt_listfonts,
+ "info" => \$opt_info,
+ "machine-readable" => \$opt_machine,
+ "strict-psname" => \$opt_strictpsname, # hidden option for debugging
+ "n|dry-run" => \$dry_run,
+ "q|quiet" => \$opt_quiet,
+ "d|debug+" => \$opt_debug,
+ "h|help" => \$opt_help,
+ "markdown" => \$opt_markdown,
+ "v|version" => sub { print &version(); exit(0); }, ) ) {
+ die "Try \"$0 --help\" for more information.\n";
+}
+
+sub win32 { return ($^O=~/^MSWin(32|64)$/i); }
+sub macosx { return ($^O=~/^darwin$/i); }
+my $nul = (win32() ? 'nul' : '/dev/null') ;
+my $sep = (win32() ? ';' : ':');
+my %fontdb;
+my %aliases;
+my %user_aliases;
+
+if ($opt_help || $opt_markdown) {
+ Usage();
+ exit(0);
+}
+
+# check for the existence of kpsewhich, otherwise we cannot do anything
+if (system("kpsewhich --version >$nul 2>&1 <$nul" ) != 0) {
+ print_error("We need `kpsewhich' being installed! Exiting.\n");
+ exit(1);
+}
+
+if ($opt_debug >= 2) {
+ require Data::Dumper;
+ $Data::Dumper::Indent = 1;
+}
+
+my $otfinfo_available;
+chomp(my $otfinfo_help = `otfinfo --help 2>$nul`);
+if ($?) {
+ # to tell the truth, we want to show below as a warning
+ # but BasicTeX (scheme-small) does not have 'otfinfo' (lcdf-typetools);
+ # show info only for debugging
+ print_debug("The program 'otfinfo' not found in PATH.\n");
+ print_debug("Sorry, we can't be safe enough to distinguish\n");
+ print_debug("uppercase / lowercase file names.\n");
+ # but the below should be an error!
+ if ($opt_strictpsname) {
+ print_error("'otfinfo' not found, cannot proceed!\n");
+ exit(1);
+ }
+ $otfinfo_available = 0;
+} else {
+ $otfinfo_available = 1;
+}
+
+if (macosx()) {
+ # due to frequent incompatible changes in font file names by Apple,
+ # our built-in database doesn't support OS X 10.11 El Capitan or
+ # later versions
+ my $macos_ver = `sw_vers -productVersion`;
+ my $macos_ver_major = $macos_ver;
+ $macos_ver_major =~ s/^(\d+)\.(\d+).*/$1/;
+ my $macos_ver_minor = $macos_ver;
+ $macos_ver_minor =~ s/^(\d+)\.(\d+).*/$2/;
+ if ($macos_ver_major==10 && $macos_ver_minor>=8) {
+ if (!$opt_cleanup && !$opt_fontdef && !@opt_fontdef_add) { # if built-in only
+ print_warning("Our built-in database does not support recent\n");
+ print_warning("versions of Mac OS (10.8 Mountain Lion or later)!\n");
+ print_warning("If you want to use Hiragino fonts bundled with\n");
+ print_warning("your OS, obtain external database file and\n");
+ print_warning("specify it with --fontdef-add option!\n");
+ print_warning("I'll continue with my built-in database ...\n");
+ }
+ }
+}
+
+if (defined($opt_texmflink)) {
+ my $foo;
+ if ($opt_texmflink eq '') {
+ # option was passed but didn't receive a value
+ # -> use TEXMFLOCAL
+ chomp($foo = `kpsewhich -var-value=TEXMFLOCAL`);
+ } else {
+ # option was passed with an argument
+ # -> use it
+ $foo = $opt_texmflink;
+ }
+ $opt_texmflink = $foo;
+}
+
+if (defined($opt_akotfps)) {
+ my $foo;
+ if ($opt_akotfps eq '') {
+ if (defined($opt_texmflink)) {
+ $foo = $opt_texmflink;
+ } else {
+ chomp($foo = `kpsewhich -var-value=TEXMFLOCAL`);
+ }
+ } else {
+ $foo = $opt_akotfps;
+ }
+ $opt_akotfps = $foo;
+}
+
+if (defined($opt_winbatch)) {
+ if ($opt_winbatch ne '') {
+ $winbatch = $opt_winbatch;
+ }
+ if (win32()) {
+ $opt_winbatch = 1;
+ unlink $winbatch if (-f $winbatch);
+ } else {
+ print_warning("ignoring --winbatch option due to non-Windows\n");
+ $opt_winbatch = 0;
+ }
+} else {
+ $opt_winbatch = 0;
+}
+if ($opt_hardlink) {
+ if (win32()) {
+ $opt_hardlink = 1;
+ } else {
+ print_warning("ignoring --hardlink option due to non-Windows\n");
+ $opt_hardlink = 0;
+ }
+}
+
+if (defined($opt_dump_data)) {
+ if ($opt_dump_data ne '') {
+ $dump_datafile = $opt_dump_data;
+ }
+ $opt_dump_data = 1;
+ unlink $dump_datafile if (-f $dump_datafile);
+} else {
+ $opt_dump_data = 0;
+}
+
+if ($opt_cleanup) {
+ $opt_remove = 1;
+}
+
+if ($opt_info) {
+ $opt_listfonts = 1;
+ $opt_listaliases = 1;
+}
+
+# check exclusive options; unsafe due to make_all_available()
+if ($opt_listallaliases && $opt_listaliases) {
+ print_error("Both --list-all-aliases and --list-aliases!? I'm confused!\n");
+ exit(1);
+}
+if ($opt_listallaliases && $opt_listfonts) {
+ print_error("Options --list-all-aliases and --list-fonts cannot be used at the same time!\n");
+ exit(1);
+}
+if ($opt_cleanup && $opt_listfonts) {
+ print_error("Options --cleanup and --list-fonts cannot be used at the same time!\n");
+ exit(1);
+}
+if ($opt_cleanup && $opt_listaliases) {
+ print_error("Options --cleanup and --list-aliases cannot be used at the same time!\n");
+ exit(1);
+}
+
+main(@ARGV);
+
+#
+# only sub definitions from here on
+#
+sub main {
+ # first, read font database to obtain %fontdb
+ print_info("reading font database ...\n");
+ read_font_database();
+ if ($opt_dump_data) {
+ # with --dump-data, dump only effective database and exit
+ dump_font_database();
+ if (-f $dump_datafile) {
+ print_info("*** Data dumped to $dump_datafile ***\n");
+ exit(0);
+ } else {
+ print_error("Failed to dump data to $dump_datafile!\n");
+ exit(1);
+ }
+ }
+ # second, determine non-otf link name
+ # this is actually required only by info_found_fonts() and do_nonotf_fonts()
+ # operations, but it does no harm for other cases too
+ determine_nonotf_link_name(); # see comments there
+
+ # set 'available' flags and 'type' by kpsewhich search
+ # if $opt_cleanup or $opt_listallaliases is given, treat all files
+ # in the database as if they were actually available as OTF
+ if (!$opt_cleanup && !$opt_listallaliases) {
+ print_info("checking for files ...\n");
+ check_for_files();
+ } else {
+ make_all_available();
+ }
+ # obtain %aliases and %user_aliases
+ compute_aliases();
+
+ # informative operations
+ if ($opt_listfonts) {
+ info_found_fonts();
+ }
+ if ($opt_listaliases || $opt_listallaliases) {
+ info_list_aliases();
+ }
+ exit(0) if ($opt_listfonts || $opt_listaliases || $opt_listallaliases);
+ # if $opt_machine is still alive after the above exit(0), it's useless
+ if ($opt_machine) {
+ print_error("Option --machine-readable should be used with at least one of the followings:\n");
+ print_error(" --list-aliases, --list-all-aliases, --list-fonts, --info\n");
+ print_error("terminating.\n");
+ exit(1);
+ }
+
+ # do actual setup/removing operations
+ if (!$opt_output) {
+ print_info("searching for Ghostscript resource\n");
+ my $gsres = find_gs_resource();
+ if (!$gsres) {
+ print_error("Cannot find Ghostscript, terminating!\n");
+ exit(1);
+ } else {
+ $opt_output = $gsres;
+ }
+ }
+ if (! -d $opt_output) {
+ $dry_run || mkdir($opt_output) ||
+ die("Cannot create directory $opt_output: $!");
+ }
+ if ($opt_cleanup) {
+ print_info("going to clean up $opt_output\n");
+ } else {
+ print_info("output is going to $opt_output\n");
+ }
+ if (!$opt_only_aliases) {
+ if ($opt_cleanup) {
+ # all font types are handled at the same time
+ print_info("cleaning up all links, snippets and cidfmap.local ...\n");
+ do_all_fonts();
+ } else {
+ # OTF and TTF/TTC/OTC must be handled separately, depending on the found files
+ print_info(($opt_remove ? "removing" : "generating") . " links and snippets for CID fonts ...\n");
+ do_otf_fonts();
+ print_info(($opt_remove ? "removing" : "generating") . " links, snippets and cidfmap.local for non-CID fonts ...\n");
+ do_nonotf_fonts();
+ }
+ write_winbatch() if $opt_winbatch;
+ }
+ print_info(($opt_remove ? "removing" : "generating") . " snippets and cidfmap.aliases for font aliases ...\n");
+ do_aliases();
+ write_akotfps_datafile() if $opt_akotfps;
+ if ($opt_texmflink && !$dry_run) {
+ print_info("running mktexlsr ...\n");
+ system("mktexlsr");
+ }
+ print_info("finished\n");
+ if ($opt_winbatch) {
+ if (-f $winbatch) {
+ print_info("*** Batch file $winbatch created ***\n");
+ print_info("*** to complete, run it as administrator privilege.***\n");
+ } else {
+ print_error("Failed to create $winbatch!\n");
+ exit(1);
+ }
+ }
+}
+
+sub do_all_fonts {
+ # try to clean up all possible links/snippets/cidfmap which could have been
+ # generated in the previous runs
+ # previous versions of cjk-gs-integrate included following bugs:
+ # * the database sometimes identified GB/CNS classes wrongly
+ # * symlink names were sometimes invalid (some of which contained
+ # white-spaces, due to the absence of proper database entry) or
+ # inconsistent with ptex-fontmaps (Name <-> PSName or redundant Filename)
+ # * confused symlinks between TTF/TTC/OTC (including ttf <-> ttc links)
+ # also, current version generates OTC links into $otf_pathpart instead of
+ # $ttf_pathpart, which was not true in the older versions
+ # we'd like to clean up all such files
+ my $fontdest = "$opt_output/Font";
+ my $ciddest = "$opt_output/CIDFont";
+ my $cidfsubst = "$opt_output/CIDFSubst";
+ for my $k (sort keys %fontdb) {
+ #
+ # remove snippets: note that $class = $fontdb{$k}{'class'} is not enough
+ # due to previous bugs
+ for my $class (%encode_list) {
+ for my $enc (@{$encode_list{$class}}) {
+ unlink "$fontdest/$k-$enc" if (-f "$fontdest/$k-$enc");
+ }
+ }
+ #
+ # remove links; borrow link_font operation here for convenience
+ # since we don't need target in cleanup mode, initialize with stub "none"
+ #
+ # for OTF/TTF fonts, first remove both $k[.otf,ttf] and $fontdb{$k}{'origname'}[.otf]
+ # the links $k.otf and $fontdb{$k}{'origname'} are coming from previous bugs,
+ # and the links $k.ttf are (sometimes) coming from inconsistency
+ if ($fontdb{$k}{'origname'}) { # this test skips alias-only fonts (e.g. Ryumin-Light)
+ link_font("none", $ciddest, $k);
+ link_font("none", $cidfsubst, "$k.ttf");
+ link_font("none", "$opt_texmflink/$otf_pathpart", "$k.otf")
+ if $opt_texmflink;
+ link_font("none", "$opt_texmflink/$ttf_pathpart", "$k.ttf")
+ if $opt_texmflink;
+ link_font("none", $ciddest, $fontdb{$k}{'origname'});
+ link_font("none", "$opt_texmflink/$otf_pathpart", "$fontdb{$k}{'origname'}.otf")
+ if $opt_texmflink;
+ }
+ # for OTF/TTF/TTC/OTC fonts, loop through all file candidates
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ # check for subfont extension
+ my $foo = $f;
+ $foo =~ s/^(.*)\(\d*\)$/$1/;
+ link_font("none", $cidfsubst, "$foo");
+ link_font("none", "$opt_texmflink/$otf_pathpart", "$foo") if $opt_texmflink;
+ link_font("none", "$opt_texmflink/$ttf_pathpart", "$foo") if $opt_texmflink;
+ }
+ }
+ update_master_cidfmap('cidfmap.local');
+ # we are in cleanup mode, also remove cidfmap.local itself
+ if (-f "$opt_output/$cidfmap_local_pathpart") {
+ unlink "$opt_output/$cidfmap_local_pathpart";
+ }
+}
+
+sub do_otf_fonts {
+ my $fontdest = "$opt_output/Font";
+ my $ciddest = "$opt_output/CIDFont";
+ make_dir($fontdest, "cannot create CID snippets there!");
+ make_dir($ciddest, "cannot link CID fonts there!");
+ make_dir("$opt_texmflink/$otf_pathpart",
+ "cannot link fonts to it!")
+ if $opt_texmflink;
+ for my $k (sort keys %fontdb) {
+ if ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'OTF') {
+ generate_font_snippet($fontdest,
+ $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ link_font($fontdb{$k}{'target'}, $ciddest, $k);
+ link_font($fontdb{$k}{'target'}, "$opt_texmflink/$otf_pathpart", "$fontdb{$k}{'origname'}.otf")
+ if $opt_texmflink;
+ }
+ }
+}
+
+sub do_nonotf_fonts {
+ my $fontdest = "$opt_output/Font";
+ my $cidfsubst = "$opt_output/CIDFSubst";
+ my $outp = '';
+ make_dir($fontdest, "cannot create CID snippets there!");
+ make_dir($cidfsubst, "cannot link TTF fonts there!");
+ make_dir("$opt_texmflink/$ttf_pathpart",
+ "cannot link fonts to it!")
+ if $opt_texmflink;
+ for my $k (sort keys %fontdb) {
+ if ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'TTF') {
+ # generate_font_snippet($fontdest,
+ # $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ $outp .= generate_cidfmap_entry($k, $fontdb{$k}{'class'}, $fontdb{$k}{'ttfname'}, -1);
+ link_font($fontdb{$k}{'target'}, $cidfsubst, $fontdb{$k}{'ttfname'});
+ link_font($fontdb{$k}{'target'}, "$opt_texmflink/$ttf_pathpart", $fontdb{$k}{'ttfname'})
+ if $opt_texmflink;
+ } elsif ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'TTC') {
+ # generate_font_snippet($fontdest,
+ # $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ $outp .= generate_cidfmap_entry($k, $fontdb{$k}{'class'}, $fontdb{$k}{'ttcname'}, $fontdb{$k}{'subfont'});
+ link_font($fontdb{$k}{'target'}, $cidfsubst, $fontdb{$k}{'ttcname'});
+ link_font($fontdb{$k}{'target'}, "$opt_texmflink/$ttf_pathpart", $fontdb{$k}{'ttcname'})
+ if $opt_texmflink;
+ } elsif ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'OTC') {
+ # currently Ghostscript does not have OTC support; not creating gs resource
+ print_debug("gs does not support OTC, not creating gs resource for $k\n");
+ # generate_font_snippet($fontdest,
+ # $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ # $outp .= generate_cidfmap_entry($k, $fontdb{$k}{'class'}, $fontdb{$k}{'otcname'}, $fontdb{$k}{'subfont'});
+ # link_font($fontdb{$k}{'target'}, $cidfsubst, $fontdb{$k}{'otcname'});
+ link_font($fontdb{$k}{'target'}, "$opt_texmflink/$otf_pathpart", $fontdb{$k}{'otcname'})
+ if $opt_texmflink;
+ }
+ }
+ return if $dry_run;
+ if ($outp) {
+ if (! -d "$opt_output/Init") {
+ mkdir("$opt_output/Init") ||
+ die("Cannot create directory $opt_output/Init: $!");
+ }
+ open(FOO, ">$opt_output/$cidfmap_local_pathpart") ||
+ die("Cannot open $opt_output/$cidfmap_local_pathpart: $!");
+ print FOO $outp;
+ close(FOO);
+ }
+ update_master_cidfmap('cidfmap.local');
+}
+
+sub do_aliases {
+ my $fontdest = "$opt_output/Font";
+ my $ciddest = "$opt_output/CIDFont"; # required for Heisei* check only
+ my $cidfsubst = "$opt_output/CIDFSubst";
+ my $outp = '';
+ #
+ # alias handling
+ # we use two levels of aliases
+ # * one is for the default generic names (these are not actual fonts)
+ # Ryumin-Light, GothicBBB-Medium, ... etc.
+ # * the second level of aliases is for Morisawa OTF font names
+ # RyuminPro-Light, GothicBBBPro-Medium, ... etc.
+ # the order of fonts selected is
+ # defined in the Provides(Priority): Name in the font definiton
+ #
+ $outp .= "\n\n% Aliases\n";
+ #
+ my (@jal, @kal, @tal, @sal);
+ #
+ for my $al (sort keys %aliases) {
+ my $target;
+ my $class;
+ if ($user_aliases{$al}) {
+ $target = $user_aliases{$al};
+ # determine class
+ if ($fontdb{$target}{'available'}) {
+ $class = $fontdb{$target}{'class'};
+ } else {
+ # must be an aliases, we checked this when initializing %user_aliases
+ # reset the $al value
+ # and since $class is still undefined we will use the next code below
+ $al = $target;
+ }
+ }
+ if (!$class) {
+ if (!%{$aliases{$al}}) {
+ print_warning("Alias candidate for $al is empty, skipping!\n");
+ next;
+ }
+ # search lowest number
+ my @ks = keys(%{$aliases{$al}});
+ my $first = (sort { $a <=> $b} @ks)[0];
+ $target = $aliases{$al}{$first};
+ $class = $fontdb{$target}{'class'};
+ }
+ # we also need to create font snippets in Font (or add configuration)
+ # for the aliases!
+ generate_font_snippet($fontdest, $al, $class, $target);
+ if ($class eq 'Japan') {
+ push @jal, "/$al /$target ;";
+ } elsif ($class eq 'Korea') {
+ push @kal, "/$al /$target ;";
+ } elsif ($class eq 'GB') {
+ push @sal, "/$al /$target ;";
+ } elsif ($class eq 'CNS') {
+ push @tal, "/$al /$target ;";
+ } else {
+ print STDERR "unknown class $class for $al\n";
+ }
+ }
+ # special case for native CID fonts in ancient days
+ # if not readable, add aliases for substitution
+ push @jal, "/HeiseiMin-W3 /Ryumin-Light ;" if (! -r "$ciddest/HeiseiMin-W3");
+ push @jal, "/HeiseiKakuGo-W5 /GothicBBB-Medium ;" if (! -r "$ciddest/HeiseiKakuGo-W5");
+ #
+ $outp .= "\n% Japanese fonts\n" . join("\n", @jal) . "\n" if @jal;
+ $outp .= "\n% Korean fonts\n" . join("\n", @kal) . "\n" if @kal;
+ $outp .= "\n% Traditional Chinese fonts\n" . join("\n", @tal) . "\n" if @tal;
+ $outp .= "\n% Simplified Chinese fonts\n" . join("\n", @sal) . "\n" if @sal;
+ #
+ return if $dry_run;
+ if ($outp && !$opt_remove) {
+ if (! -d "$opt_output/Init") {
+ mkdir("$opt_output/Init") ||
+ die("Cannot create directory $opt_output/Init: $!");
+ }
+ open(FOO, ">$opt_output/$cidfmap_aliases_pathpart") ||
+ die("Cannot open $opt_output/$cidfmap_aliases_pathpart: $!");
+ print FOO $outp;
+ close(FOO);
+ }
+ update_master_cidfmap('cidfmap.aliases');
+ # if we are in cleanup mode, also remove cidfmap.aliases itself
+ if (-f "$opt_output/$cidfmap_aliases_pathpart") {
+ unlink "$opt_output/$cidfmap_aliases_pathpart" if $opt_cleanup;
+ }
+}
+
+sub update_master_cidfmap {
+ # what we have to do is:
+ # in add mode:
+ # * add an entry for the given argument
+ # * for tlgs.win32 pre-shipped cidfmap, prepend '%' to override
+ # the default of "(cidfmap.TeXLive) .runlibfile",
+ # in remove mode:
+ # * remove an entry for the given argument
+ # * for tlgs.win32 pre-shipped cidfmap, remove '%' to restore the default
+ my $add = shift;
+ my $cidfmap_master = "$opt_output/$cidfmap_pathpart";
+ print_info(sprintf("%s $add %s cidfmap file ...\n",
+ ($opt_remove ? "removing" : "adding"), ($opt_remove ? "from" : "to")));
+ if (-r $cidfmap_master) {
+ open(FOO, "<", $cidfmap_master) ||
+ die("Cannot open $cidfmap_master for reading: $!");
+ my $found = 0;
+ my $found_tl = 0;
+ my $newmaster = "";
+ # in add mode: just search for the entry and set $found
+ # in remove mode: collect all lines that do not match
+ # also, we handle "cidfmap.TeXLive" now
+ while(<FOO>) {
+ if (m/^\s*\(\Q$add\E\)\s\s*\.runlibfile\s*$/) {
+ $found = 1;
+ } elsif (m/^\s*\(cidfmap\.TeXLive\)\s\s*\.runlibfile\s*$/) {
+ # if found, it has to be disabled in add mode in a way in which it can
+ # be detected in the (future) remove mode
+ next if $found_tl; # skip it as duplicate (though unlikely to happen)
+ $found_tl = 1;
+ $newmaster .= "\%" if (!$opt_remove); # in add mode, disable it
+ $newmaster .= $_; # pass it as-is
+ } elsif (m/^\s*\%\%*\s*\(cidfmap\.TeXLive\)\s\s*\.runlibfile\s*$/) {
+ # if found, it should be the one disabled by myself in the previous run;
+ # restore it in remove mode
+ next if $found_tl; # skip it as duplicate (though unlikely to happen)
+ $found_tl = 1;
+ $_ =~ s/\%//g if $opt_remove; # in remove mode, enable it
+ $newmaster .= $_; # pass it
+ } else {
+ $newmaster .= $_;
+ }
+ }
+ close(FOO);
+ # if the original master cidfmap has a new line at end of file,
+ # then $newmaster should end with "\n".
+ # otherwise we add a new line, since there is a possibility of %EOF comment
+ # without trailing new line (e.g. TL before r44039)
+ $newmaster =~ s/\n$//;
+ $newmaster =~ s/$/\n/;
+ if ($opt_remove) {
+ if ($found || $found_tl) {
+ return if $dry_run;
+ open(FOO, ">", $cidfmap_master) ||
+ die("Cannot clean up $cidfmap_master: $!");
+ print FOO $newmaster;
+ close FOO;
+ }
+ } else {
+ if ($found && !$found_tl) {
+ print_info("$add already loaded in $cidfmap_master, no changes\n");
+ } else {
+ return if $dry_run;
+ open(FOO, ">", $cidfmap_master) ||
+ die("Cannot open $cidfmap_master for appending: $!");
+ print FOO $newmaster;
+ print FOO "($add) .runlibfile\n";
+ close(FOO);
+ }
+ }
+ } else {
+ return if $dry_run;
+ return if $opt_remove;
+ open(FOO, ">", $cidfmap_master) ||
+ die("Cannot open $cidfmap_master for writing: $!");
+ print FOO "($add) .runlibfile\n";
+ close(FOO);
+ }
+}
+
+sub generate_cidfmap_entry {
+ my ($n, $c, $f, $sf) = @_;
+ return "" if $opt_remove;
+ # $f is already the link target name 'ttfname' (or 'ttcname' or 'otcname')
+ # as determined by minimal priority number
+ # extract subfont
+ my $s = "/$n << /FileType /TrueType
+ /Path pssystemparams /GenericResourceDir get
+ (CIDFSubst/$f) concatstrings\n";
+ if ($sf >= 0) { # in this script, $sf < 0 represents TTF
+ $s .= " /SubfontID $sf\n";
+ }
+ $s .= " /CSI [($c";
+ if ($c eq "Japan") {
+ $s .= "1) 6]";
+ } elsif ($c eq "GB") {
+ $s .= "1) 5]";
+ } elsif ($c eq "CNS") {
+ $s .= "1) 5]";
+ } elsif ($c eq "Korea") {
+ $s .= "1) 2]";
+ } else {
+ print_warning("unknown class $c for $n, skipping.\n");
+ return '';
+ }
+ $s .= " >> ;\n";
+ return $s;
+}
+
+sub generate_font_snippet {
+ my ($fd, $n, $c, $f) = @_;
+ return if $dry_run;
+ if ($opt_akotfps) {
+ add_akotfps_data($n);
+ return;
+ }
+ for my $enc (@{$encode_list{$c}}) {
+ if ($opt_remove) {
+ unlink "$fd/$n-$enc" if (-f "$fd/$n-$enc");
+ next;
+ }
+ open(FOO, ">$fd/$n-$enc") ||
+ die("cannot open $fd/$n-$enc for writing: $!");
+ print FOO "%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: $enc (CMap)
+%%IncludeResource: $enc (CMap)
+%%BeginResource: Font ($n-$enc)
+($n-$enc)
+($enc) /CMap findresource
+[($n) /CIDFont findresource]
+composefont
+pop
+%%EndResource
+%%EOF
+";
+ close(FOO);
+ }
+}
+
+sub add_akotfps_data {
+ my ($fn) = @_;
+ return if $dry_run;
+ if (!$opt_remove) {
+ $akotfps_datacontent .= "$fn\n";
+ }
+}
+
+#
+# link_font operation
+# $opt_force is *not* treated first to warn only
+# at really critical cases
+# case 1:
+# exists, is link, link targets agree
+# $opt_force is ignored
+# remove or remove+add according to $opt_remove
+# case 2:
+# exists, is link, dangling symlink
+# $opt_force is ignored
+# remove or remove+add according to $opt_remove
+# case 3:
+# exists, is link, link target different
+# if $opt_force
+# warn, remove or remove+add according to $opt_remove
+# else
+# error message
+# case 4:
+# exists, not a link
+# if $opt_force
+# warn, remove or remove+add according to $opt_remove
+# else
+# error message
+# case 5:
+# not exists
+# $opt_force is ignored
+# do nothing or add according to $opt_remove
+#
+sub link_font {
+ my ($f, $cd, $n) = @_;
+ return if $dry_run;
+ if (!$n) {
+ $n = basename($f);
+ }
+ my $target = "$cd/$n";
+ my $do_unlink = 0;
+ if (-l $target) {
+ if ($opt_cleanup) {
+ $do_unlink = 1;
+ } else {
+ my $linkt = readlink($target);
+ if ($linkt) {
+ if ($linkt eq $f) {
+ # case 1: exists, link, targets agree
+ $do_unlink = 1;
+ } elsif (-r $linkt) {
+ # case 3: exists, link, targets different
+ if ($opt_force) {
+ print_info("Removing link $target due to --force!\n");
+ $do_unlink = 1;
+ } else {
+ print_error("Link $target already existing, but target different from $f, exiting!\n");
+ exit(1);
+ }
+ } else {
+ # case 2: dangling symlink or link-to-link
+ print_warning("Removing dangling symlink $target to $linkt\n");
+ $do_unlink = 1;
+ }
+ } else {
+ print_error("This should not happen, we have a link but cannot read the target?\n");
+ exit(1);
+ }
+ }
+ } elsif (-r $target) {
+ # case 4: exists, but not link (NTFS hardlink on win32 falls into this)
+ if (-s $target) {
+ if ($opt_force) {
+ print_info("Removing $target due to --force!\n");
+ $do_unlink = 1;
+ } else {
+ print_error("$target already existing, exiting!\n");
+ exit(1);
+ }
+ } else {
+ # NTFS symlink on win32 has file size 0, we're safe to remove it
+ $do_unlink = 1;
+ }
+ } # case 5: otherwise it is not existing!
+
+ # if we are still here and $do_unlink is set, remove it
+ maybe_unlink($target) if $do_unlink;
+ # recreate link if we are not in the remove case
+ if (!$opt_remove) {
+ maybe_symlink($f, $target) || die("Cannot link font $f to $target: $!");
+ }
+}
+
+sub make_dir {
+ my ($d, $w) = @_;
+ if (-r $d) {
+ if (! -d $d) {
+ print_error("$d is not a directory, $w\n");
+ exit(1);
+ }
+ } else {
+ $dry_run || make_path($d);
+ }
+}
+
+# perl symlink function does not work on windows, so leave it to
+# cmd.exe mklink function (or write to batch file).
+# if target already exists, do not try to override it. otherwise
+# "mklink error: Cannot create a file when that file already exists"
+# is thrown many times
+sub maybe_symlink {
+ my ($realname, $targetname) = @_;
+ if (win32()) {
+ # hardlink vs. symlink -- HY 2017/04/26
+ # * readablitiy: hardlink is easier, but it seems that current gs can read
+ # symlink properly, so it doesn't matter
+ # * permission: hardlink creation does not require administrator privilege,
+ # but is likely to fail for c:/windows/fonts/* system files
+ # due to "Access denied"
+ # symlink creation requires administrator privilege, but
+ # it can link to all files in c:/windows/fonts/
+ # * versatility: symlink can point to a file on a different/remote volume
+ # for these reasons, we try to create symlink by default.
+ # if --hardlink option is given, we create hardlink instead.
+ # also, if --winbatch option is given, we prepare batch file for link generation,
+ # instead of creating links right away.
+ $realname =~ s!/!\\!g;
+ $targetname =~ s!/!\\!g;
+ if ($opt_winbatch) {
+ # re-encoding of $winbatch_content is done by write_winbatch()
+ $winbatch_content .= "if not exist \"$targetname\" mklink ";
+ $winbatch_content .= "/h " if $opt_hardlink;
+ $winbatch_content .= "\"$targetname\" \"$realname\"\n";
+ } else {
+ # should be encoded in cp932 for win32 console
+ $realname = encode_utftocp($realname);
+ $targetname = encode_utftocp($targetname);
+ my $cmdl = "cmd.exe /c if not exist \"$targetname\" mklink ";
+ $cmdl .= "/h " if $opt_hardlink;
+ $cmdl .= "\"$targetname\" \"$realname\"";
+ my @ret = `$cmdl`;
+ # sometimes hard link creation may fail due to "Access denied"
+ # (especially when $realname is located in c:/windows/fonts).
+ # TODO: what should we do to ensure resources, which might be
+ # different from $realname? -- HY (2017/03/21)
+ # -- one possibility:
+ # if (@ret) {
+ # @ret ="done";
+ # } else {
+ # print_info("Hard link creation for $realname failed. I will copy this file instead.\n");
+ # $cmdl = "cmd.exe /c if not exist \"$targetname\" copy \"$realname\" \"$targetname\"";
+ # @ret = `$cmdl`;
+ # }
+ # -- however, both tlgs (TeX Live) and standalone gswin32/64 (built
+ # by Akira Kakuto) can search in c:/windows/fonts by default.
+ # Thus, copying such files is waste of memory
+ }
+ } else {
+ symlink ($realname, $targetname);
+ }
+}
+
+# unlink function actually works also on windows, however,
+# leave it to batch file for consistency. otherwise
+# option $opt_force may not work as expected
+sub maybe_unlink {
+ my ($targetname) = @_;
+ if (win32()) {
+ $targetname =~ s!/!\\!g;
+ if ($opt_winbatch) {
+ # re-encoding of $winbatch_content is done by write_winbatch()
+ $winbatch_content .= "if exist \"$targetname\" del \"$targetname\"\n";
+ } else {
+ # should be encoded in cp932 for win32 console
+ $targetname = encode_utftocp($targetname);
+ my $cmdl = "cmd.exe /c if exist \"$targetname\" del \"$targetname\"";
+ my @ret = `$cmdl`;
+ }
+ } else {
+ unlink ($targetname);
+ }
+}
+
+# write batch file (windows only)
+sub write_winbatch {
+ return if $dry_run;
+ open(FOO, ">$winbatch") ||
+ die("cannot open $winbatch for writing: $!");
+ # $winbatch_content may contain multibyte characters, and they
+ # should be encoded in cp932 in batch file
+ $winbatch_content = encode_utftocp($winbatch_content);
+ print FOO "\@echo off\n",
+ "$winbatch_content",
+ "\@echo symlink ", ($opt_remove ? "removed\n" : "generated\n"),
+ "\@pause 1\n";
+ close(FOO);
+}
+
+# write to psnames-for-otfps
+sub write_akotfps_datafile {
+ return if $dry_run;
+ make_dir("$opt_akotfps/$akotfps_pathpart",
+ "cannot create $akotfps_datafilename in it!");
+ open(FOO, ">$opt_akotfps/$akotfps_pathpart/$akotfps_datafilename") ||
+ die("cannot open $opt_akotfps/$akotfps_pathpart/$akotfps_datafilename for writing: $!");
+ print FOO "% psnames-for-otf
+%
+% PostSctipt names for OpenType fonts
+%
+% This file is used by a program ps2otfps
+% in order to add needed information to a ps file
+% created by the dvips
+%
+$akotfps_datacontent";
+ close(FOO);
+}
+
+#
+# dump found files
+sub info_found_fonts {
+ print "List of found fonts:\n\n";
+ for my $k (sort keys %fontdb) {
+ my @foundfiles;
+ if ($fontdb{$k}{'available'}) {
+ print "Font: $k\n";
+ print "Type: $fontdb{$k}{'type'}\n";
+ print "Class: $fontdb{$k}{'class'}\n";
+ my $fn = $fontdb{$k}{'target'};
+ # cp932 for win32 console
+ if (win32()) {
+ $fn = encode_utftocp($fn);
+ }
+ if ($fontdb{$k}{'type'} eq 'TTC' || $fontdb{$k}{'type'} eq 'OTC') {
+ $fn .= "($fontdb{$k}{'subfont'})";
+ }
+ print "File: $fn\n";
+ if ($fontdb{$k}{'type'} eq 'TTF') {
+ print "Link: $fontdb{$k}{'ttfname'}\n";
+ } elsif ($fontdb{$k}{'type'} eq 'TTC') {
+ print "Link: $fontdb{$k}{'ttcname'}\n";
+ } elsif ($fontdb{$k}{'type'} eq 'OTC') {
+ print "Link: $fontdb{$k}{'otcname'}\n";
+ }
+ my @ks = sort { $fontdb{$k}{'files'}{$a}{'priority'}
+ <=>
+ $fontdb{$k}{'files'}{$b}{'priority'} }
+ keys %{$fontdb{$k}{'files'}};
+ # remove the top element which is the winner and shown above
+ shift @ks;
+ if (@ks) {
+ print "Other candidates in decreasing order:\n";
+ for my $f (@ks) {
+ print " ", $fontdb{$k}{'files'}{$f}{'target'}, "\n";
+ }
+ }
+ print "\n";
+ }
+ }
+}
+
+#
+# dump aliases
+sub info_list_aliases {
+ print "List of ", ($opt_listallaliases ? "all" : "available"), " aliases and their options (in decreasing priority):\n" unless $opt_machine;
+ my (@jal, @kal, @tal, @sal);
+ for my $al (sort keys %aliases) {
+ my $cl;
+ my @ks = sort { $a <=> $b} keys(%{$aliases{$al}});
+ my $foo = '';
+ $foo = "$al:\n" unless $opt_machine;
+ for my $p (@ks) {
+ my $t = $aliases{$al}{$p};
+ my $fn = ($opt_listallaliases ? "-" : $fontdb{$t}{'target'} );
+ # cp932 for win32 console
+ if (win32()) {
+ $fn = encode_utftocp($fn);
+ }
+ # should always be the same ;-)
+ $cl = $fontdb{$t}{'class'};
+ if (!$opt_listallaliases && ($fontdb{$t}{'type'} eq 'TTC' || $fontdb{$t}{'type'} eq 'OTC')) {
+ $fn .= "($fontdb{$t}{'subfont'})";
+ }
+ if ($opt_machine) {
+ $foo .= "$al:$p:$aliases{$al}{$p}:$fn\n";
+ } else {
+ $foo .= "\t($p) $aliases{$al}{$p} ($fn)\n";
+ }
+ }
+ if ($cl eq 'Japan') {
+ push @jal, $foo;
+ } elsif ($cl eq 'Korea') {
+ push @kal, $foo;
+ } elsif ($cl eq 'GB') {
+ push @sal, $foo;
+ } elsif ($cl eq 'CNS') {
+ push @tal, $foo;
+ } else {
+ print STDERR "unknown class $cl for $al\n";
+ }
+ }
+ if ($opt_machine) {
+ print @jal if @jal;
+ print @kal if @kal;
+ print @sal if @sal;
+ print @tal if @tal;
+ } else {
+ print "Aliases for Japanese fonts:\n", @jal, "\n" if @jal;
+ print "Aliases for Korean fonts:\n", @kal, "\n" if @kal;
+ print "Aliases for Simplified Chinese fonts:\n", @sal, "\n" if @sal;
+ print "Aliases for Traditional Chinese fonts:\n", @tal, "\n" if @tal;
+ }
+}
+
+#
+# make all fonts available for listing all aliases
+sub make_all_available {
+ for my $k (keys %fontdb) {
+ $fontdb{$k}{'available'} = 1;
+ $fontdb{$k}{'type'} = 'OTF';
+ delete $fontdb{$k}{'files'} if (!$opt_cleanup);
+ }
+}
+
+#
+# checks all file names listed in %fontdb
+# and sets
+sub check_for_files {
+ my @foundfiles;
+ if ($opt_filelist) {
+ open(FOO, "<", $opt_filelist) || die("Cannot open $opt_filelist: $!");
+ @foundfiles = <FOO>;
+ close(FOO) || warn "Cannot close $opt_filelist: $!";
+ } else {
+ # first collect all files:
+ my @fn;
+ for my $k (keys %fontdb) {
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ # check for subfont extension
+ if ($f =~ m/^(.*)\(\d*\)$/) {
+ push @fn, $1;
+ } else {
+ push @fn, $f;
+ }
+ }
+ }
+ #
+ # collect extra directories for search
+ my @extradirs;
+ if (win32()) {
+ push @extradirs, "c:/windows/fonts//";
+ } else {
+ # other dirs to check, for normal unix?
+ for my $d (qw!/Library/Fonts /System/Library/Fonts /System/Library/Assets
+ /Network/Library/Fonts /usr/share/fonts!) {
+ push @extradirs, "$d//" if (-d $d); # recursive search
+ }
+ # the path contains white space, so hack required
+ for my $d (qw!/Library/Application__Support/Apple/Fonts!) {
+ my $sd = $d;
+ $sd =~ s/__/ /;
+ push @extradirs, "$sd//" if (-d "$sd"); # recursive search
+ }
+ # office for mac 2016
+ for my $d (qw!/Applications/Microsoft__Word.app
+ /Applications/Microsoft__Excel.app
+ /Applications/Microsoft__PowerPoint.app!) {
+ my $sd = $d;
+ $sd =~ s/__/ /;
+ push @extradirs, "$sd/Contents/Resources/Fonts/" if (-d "$sd/Contents/Resources/Fonts");
+ push @extradirs, "$sd/Contents/Resources/DFonts/" if (-d "$sd/Contents/Resources/DFonts");
+ }
+ my $home = $ENV{'HOME'};
+ push @extradirs, "$home/Library/Fonts//" if (-d "$home/Library/Fonts");
+ }
+ #
+ if (@extradirs) {
+ # TODO: we want that files in OSFONTDIR are found first, before
+ # links that we have created in TEXMFLOCAL
+ # Thus, instead of setting OSFONTDIR which is at the *END* of
+ # the kpsewhich variables OPENTYPEFONTS and TTFONTS, we'd like to
+ # put all these fonts at the front of them
+ #
+ # There are problems with case-insensitive file systems like HFS
+ # on MacOS, as we might catch different names (batang/Batang)
+ # and identify them wrongly.
+ # https://github.com/texjporg/cjk-gs-support/issues/9
+ # For now until we have dealt with that, do not set the
+ # two variables (HY 2016/09/27) and think about a different approach.
+ push @extradirs, $ENV{'OSFONTDIR'} if $ENV{'OSFONTDIR'};
+ if (@extradirs) {
+ # comment out -- HY (2016/09/27)
+ # my $newotf = join($sep, @extradirs) . $sep;
+ # my $newttf = $newotf;
+ # $newotf .= $ENV{'OPENTYPEFONTS'} if $ENV{'OPENTYPEFONTS'};
+ # $newttf .= $ENV{'TTFONTS'} if $ENV{'TTFONTS'};
+ # $ENV{'OPENTYPEFONTS'} = $newotf;
+ # $ENV{'TTFONTS'} = $newttf;
+ # new code for uppercase/lowercase workaround -- HY (2016/09/27)
+ my $extrafontdir = join($sep, @extradirs) . $sep;
+ $ENV{'OSFONTDIR'} = $extrafontdir;
+ }
+ }
+ # prepare for kpsewhich call, we need to do quoting
+ # we need as much candidate files as possible, so -all is needed
+ my $cmdl = 'kpsewhich -all ';
+ for my $f (@fn) {
+ $cmdl .= " \"$f\" ";
+ }
+ # shoot up kpsewhich
+ # this call (derived from the database) contains multibyte characters,
+ # and they should be encoded in cp932 for win32 console
+ if (win32()) {
+ $cmdl = encode_utftocp($cmdl);
+ }
+ print_ddebug("checking for $cmdl\n");
+ @foundfiles = `$cmdl`;
+ }
+ # at this point, on windows, @foundfiles is encoded in cp932
+ # which is suitable for the next few lines
+ chomp(@foundfiles);
+ print_ddebug("Found files @foundfiles\n");
+ # map basenames to filenames
+ my %bntofn;
+ for my $f (@foundfiles) {
+ $f =~ s/[\r\n]+\z//; # perl's chomp() on git-bash cannot strip CR of CRLF ??
+ my $realf = abs_path($f);
+ if (!$realf) {
+ print_warning("dead link or strange file found: $f - ignored!\n");
+ next;
+ }
+ if (win32()) {
+ # abs_path cannot read NTFS symlink/hardlink, and it serves as
+ # identity transformation.
+ # this might lead to dangling links for multiple runs of cjk-gs-integrate,
+ # when $opt_texmflink (in the previous run) is contained in the (current)
+ # kpsewhich search path.
+ # to avoid this, ignore targets which contain $otf_pathpart or $ttf_pathpart
+ my $temp_realfdir = "$realf";
+ $temp_realfdir =~ s!^(.*)/(.*)$!$1!;
+ next if ($temp_realfdir =~ $otf_pathpart || $temp_realfdir =~ $ttf_pathpart);
+ }
+ # decode now on windows! (cp932 -> internal utf-8)
+ if (win32()) {
+ $f = encode_cptoutf($f);
+ $realf = encode_cptoutf($realf);
+ }
+ my $bn = basename($f);
+ # kpsewhich -all might return multiple files with the same basename;
+ # collect all of them
+ $bntofn{$bn}{$realf} = 1;
+ }
+
+ # show the %fontdb before file check
+ if ($opt_debug >= 2) {
+ print_ddebug("dumping font database before file check:\n");
+ print_ddebug(Data::Dumper::Dumper(\%fontdb));
+ }
+ if ($opt_debug >= 3) {
+ print_dddebug("dumping basename to filename list:\n");
+ print_dddebug(Data::Dumper::Dumper(\%bntofn));
+ }
+
+ # update the %fontdb with the found files
+ for my $k (keys %fontdb) {
+ $fontdb{$k}{'available'} = 0;
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ # check for subfont extension
+ my $realfile = $f;
+ $realfile =~ s/^(.*)\(\d*\)$/$1/;
+ # check for casefolding
+ # we might catch different names (batang/Batang) and identify them wrongly on
+ # * case-insensitive file systems (like HFS on MacOS)
+ # * kpathsea 6.3.0 or later, with casefolding fallback search (TL2018)
+ # check the actual psname using otfinfo utility, only when we "know"
+ # both uppercase/lowercase font files are possible and they are different
+ my $actualpsname;
+ my $bname;
+ for my $b (sort keys %{$bntofn{$realfile}}) {
+ $fontdb{$k}{'casefold'} = "debug" if $opt_strictpsname;
+ if ($fontdb{$k}{'casefold'} && $otfinfo_available &&
+ ($fontdb{$k}{'files'}{$f}{'type'} eq 'OTF' || $fontdb{$k}{'files'}{$f}{'type'} eq 'TTF')) {
+ print_debug("We need to test whether\n");
+ print_debug(" $b\n");
+ print_debug("is the correct one. Invoking otfinfo ...\n");
+ chomp($actualpsname = `otfinfo -p "$b"`);
+ if ($?) {
+ # something is wrong with the font file, or otfinfo does not support it;
+ # still there is a chance that Ghostscript supports, so don't discard it
+ print_debug("... command exited with $?!\n");
+ print_debug("OK, I'll take this, but it may not work properly.\n");
+ print_warning("otfinfo check failed for $b\n") if $opt_strictpsname;
+ $bname = $b;
+ last;
+ }
+ $actualpsname =~ s/[\r\n]+\z//; # perl's chomp() on git-bash cannot strip CR of CRLF ??
+ if ($actualpsname ne $k) {
+ print_debug("... PSName returned by otfinfo ($actualpsname) is\n");
+ print_debug("different from our database ($k), discarding!\n");
+ print_warning("otfinfo check failed for $b\n") if $opt_strictpsname;
+ } else {
+ print_debug("... test passed.\n");
+ $bname = $b;
+ last;
+ }
+ } else {
+ $bname = $b;
+ last;
+ }
+ }
+ if ($bname) {
+ # we found a representative, make it available
+ $fontdb{$k}{'files'}{$f}{'target'} = $bname;
+ $fontdb{$k}{'available'} = 1;
+ } else {
+ # delete the entry for convenience
+ delete $fontdb{$k}{'files'}{$f};
+ }
+ }
+ }
+ # second round to determine the winner in case of more targets
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'}) {
+ my $mp = 1000000; my $mf;
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ if ($fontdb{$k}{'files'}{$f}{'priority'} < $mp) {
+ $mp = $fontdb{$k}{'files'}{$f}{'priority'};
+ $mf = $f;
+ }
+ }
+ # extract subfont if necessary
+ my $sf = 0;
+ if ($mf =~ m/^(.*)\((\d*)\)$/) { $sf = $2; }
+ $fontdb{$k}{'target'} = $fontdb{$k}{'files'}{$mf}{'target'};
+ $fontdb{$k}{'type'} = $fontdb{$k}{'files'}{$mf}{'type'};
+ $fontdb{$k}{'subfont'} = $sf if ($fontdb{$k}{'type'} eq 'TTC' || $fontdb{$k}{'type'} eq 'OTC');
+ }
+ # not needed anymore
+ # delete $fontdb{$k}{'files'};
+ }
+ if ($opt_debug >= 2) {
+ print_ddebug("dumping font database:\n");
+ print_ddebug(Data::Dumper::Dumper(\%fontdb));
+ }
+}
+
+sub compute_aliases {
+ # go through fontdb to check for provides
+ # accumulate all provided fonts in @provides
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'}) {
+ for my $p (keys %{$fontdb{$k}{'provides'}}) {
+ # do not check alias if the real font is available in OTF/TTF/TTC format
+ if ($fontdb{$p}{'available'}) {
+ next if ($fontdb{$p}{'type'} ne 'OTC');
+ }
+ # use the priority as key
+ # if priorities are double, this will pick one at chance
+ if ($aliases{$p}{$fontdb{$k}{'provides'}{$p}}) {
+ print_warning("duplicate provide levels:\n");
+ print_warning(" current $p $fontdb{$k}{'provides'}{$p} $aliases{$p}{$fontdb{$k}{'provides'}{$p}}\n");
+ print_warning(" ignored $p $fontdb{$k}{'provides'}{$p} $k\n");
+ } else {
+ # if OTC font is caught, then skip it as Ghostscript doesn't support it (2016/12/12)
+ if ($fontdb{$k}{'type'} eq 'OTC') {
+ print_debug("Currently Ghostscript does not support OTC font,\n");
+ print_debug("not adding $fontdb{$k}{'otcname'} to alias candidates\n");
+ } else {
+ $aliases{$p}{$fontdb{$k}{'provides'}{$p}} = $k;
+ }
+ }
+ }
+ }
+ }
+ # check for user supplied aliases
+ for my $a (@opt_aliases) {
+ if ($a =~ m/^(.*)=(.*)$/) {
+ my $ll = $1;
+ my $rr = $2;
+ # check for consistency of user provided aliases:
+ # - ll must not be available
+ # - rr needs to be available as font or alias
+ # check whether $rr is available, either as real font or as alias
+ if ($fontdb{$ll}{'available'}) {
+ print_error("left side of alias spec is provided by a real font: $a\n");
+ print_error("stopping here\n");
+ exit(1);
+ }
+ if (!($fontdb{$rr}{'available'} || $aliases{$rr})) {
+ print_error("right side of alias spec is not available as real font or alias: $a\n");
+ print_error("stopping here\n");
+ exit(1);
+ }
+ $user_aliases{$ll} = $rr;
+ }
+ }
+ if ($opt_debug >= 2) {
+ print_ddebug("dumping aliases:\n");
+ print_ddebug(Data::Dumper::Dumper(\%aliases));
+ }
+}
+
+# While the OTF link target is determined by the filename itself
+# for TTF we can have ttc with several fonts.
+# The following routine determines the link target by selecting
+# the file name of the ttf candidates with the lowest priority
+# as the link target name for TTF
+sub determine_nonotf_link_name {
+ for my $k (keys %fontdb) {
+ my $ttfname = "";
+ my $ttcname = "";
+ my $otcname = "";
+ my $mpttf = 10000000;
+ my $mpttc = 10000000;
+ my $mpotc = 10000000;
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ if ($fontdb{$k}{'files'}{$f}{'type'} eq 'TTF') {
+ my $p = $fontdb{$k}{'files'}{$f}{'priority'};
+ if ($p < $mpttf) {
+ $ttfname = $f;
+ $ttfname =~ s/^(.*)\(\d*\)$/$1/;
+ $mpttf = $p;
+ }
+ } elsif ($fontdb{$k}{'files'}{$f}{'type'} eq 'TTC') {
+ my $p = $fontdb{$k}{'files'}{$f}{'priority'};
+ if ($p < $mpttc) {
+ $ttcname = $f;
+ $ttcname =~ s/^(.*)\(\d*\)$/$1/;
+ $mpttc = $p;
+ }
+ } elsif ($fontdb{$k}{'files'}{$f}{'type'} eq 'OTC') {
+ my $p = $fontdb{$k}{'files'}{$f}{'priority'};
+ if ($p < $mpotc) {
+ $otcname = $f;
+ $otcname =~ s/^(.*)\(\d*\)$/$1/;
+ $mpotc = $p;
+ }
+ }
+ }
+ if ($ttfname) {
+ $fontdb{$k}{'ttfname'} = $ttfname;
+ }
+ if ($ttcname) {
+ $fontdb{$k}{'ttcname'} = $ttcname;
+ }
+ if ($otcname) {
+ $fontdb{$k}{'otcname'} = $otcname;
+ }
+ }
+}
+
+sub read_font_database {
+ my @dbl;
+ # if --fontdef=foo is given, disregard built-in database and
+ # use "foo" as a substitute; otherwise, use built-in database
+ if ($opt_fontdef) {
+ my $foo = kpse_miscfont($opt_fontdef);
+ open(FDB, "<$foo") ||
+ die("Cannot find $opt_fontdef: $!");
+ @dbl = <FDB>;
+ close(FDB);
+ print_debug("New database file: $opt_fontdef...\n");
+ } else {
+ @dbl = <DATA>;
+ }
+ read_each_font_database(@dbl);
+ # if --fontdef-add=bar is given, use "bar" as an addition
+ # to the current database; if the same Name entry appears,
+ # overwrite existing one (that is, the addition wins)
+ for (@opt_fontdef_add) {
+ my $foo = kpse_miscfont($_);
+ open(FDB, "<$foo") ||
+ die("Cannot find $_: $!");
+ @dbl = <FDB>;
+ close(FDB);
+ print_debug("Additional database file: $_...\n");
+ read_each_font_database(@dbl);
+ }
+}
+
+sub read_each_font_database {
+ my (@curdbl) = @_;
+ my $fontname = "";
+ my $fontclass = "";
+ my %fontprovides = ();
+ my $fontcasefold = "";
+ my %fontfiles;
+ my $psname = "";
+ my $lineno = 0;
+ chomp(@curdbl);
+ push @curdbl, ""; # add a "final empty line" to easy parsing
+ for my $l (@curdbl) {
+ $lineno++;
+ next if ($l =~ m/^\s*#/); # skip comment line
+ $l =~ s/\s*#.*$//; # skip comment after '#'
+ if ($l =~ m/^\s*$/) { # empty line is a separator between entries
+ if ($fontname || $fontclass || keys(%fontfiles)) {
+ if ($fontname && $fontclass && keys(%fontfiles)) {
+ my $realfontname = ($psname ? $psname : $fontname);
+ if ($fontdb{$realfontname}{'origname'}) {
+ # needed for --fontdef-add, which allows overwriting with external database given by user
+ print_debug("$fontdb{$realfontname}{'origname'} is already registered in database,\n");
+ print_debug("overwriting with the new one ...\n");
+ }
+ $fontdb{$realfontname}{'origname'} = $fontname;
+ $fontdb{$realfontname}{'class'} = $fontclass;
+ $fontdb{$realfontname}{'casefold'} = $fontcasefold;
+ $fontdb{$realfontname}{'files'} = { %fontfiles };
+ $fontdb{$realfontname}{'provides'} = { %fontprovides };
+ if ($opt_debug >= 3) {
+ print_dddebug("Dumping fontfiles for $realfontname: " . Data::Dumper::Dumper(\%fontfiles));
+ }
+ # reset to start
+ $fontname = $fontclass = $psname = "";
+ $fontcasefold = "";
+ %fontfiles = ();
+ %fontprovides = ();
+ } else {
+ print_warning("incomplete entry above line $lineno for $fontname/$fontclass, skipping!\n");
+ # reset to start
+ $fontname = $fontclass = $psname = "";
+ $fontcasefold = "";
+ %fontfiles = ();
+ %fontprovides = ();
+ }
+ } else {
+ # no term is set, so nothing to warn about
+ }
+ next;
+ }
+ if ($l =~ m/^!INCLUDE\s*(.*)$/) { # for remove-only database
+ next if (!$opt_cleanup);
+ my @dbl;
+ my $foo = kpse_miscfont($1);
+ if (!open(FDB, "<$foo")) {
+ print_warning("Cannot find $1, skipping!\n");
+ next;
+ }
+ @dbl = <FDB>;
+ close(FDB);
+ print_debug("Reading database file $1...\n");
+ read_each_font_database(@dbl);
+ next;
+ }
+ if ($l =~ m/^INCLUDE\s*(.*)$/) {
+ my @dbl;
+ my $foo = kpse_miscfont($1);
+ if (!open(FDB, "<$foo")) {
+ print_warning("Cannot find $1, skipping!\n");
+ next;
+ }
+ @dbl = <FDB>;
+ close(FDB);
+ print_debug("Reading database file $1...\n");
+ read_each_font_database(@dbl);
+ next;
+ }
+ if ($l =~ m/^Name:\s*(.*)$/) { $fontname = $1; next; }
+ if ($l =~ m/^PSName:\s*(.*)$/) { $psname = $1; next; }
+ if ($l =~ m/^Class:\s*(.*)$/) { $fontclass = $1 ; next ; }
+ if ($l =~ m/^Provides\((\d+)\):\s*(.*)$/) { $fontprovides{$2} = $1; next; }
+ if ($l =~ m/^Casefold:\s*(.*)$/) { $fontcasefold = $1 ; next ; }
+ # new code: distinguish 4 types (otf, otc, ttf, ttc)
+ if ($l =~ m/^OTFname(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ print_dddebug("type: otf\n");
+ $fontfiles{$fn}{'type'} = 'OTF';
+ next;
+ }
+ if ($l =~ m/^OTCname(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ print_dddebug("type: otc\n");
+ $fontfiles{$fn}{'type'} = 'OTC';
+ next;
+ }
+ if ($l =~ m/^TTFname(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ print_dddebug("type: ttf\n");
+ $fontfiles{$fn}{'type'} = 'TTF';
+ next;
+ }
+ if ($l =~ m/^TTCname(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ print_dddebug("type: ttc\n");
+ $fontfiles{$fn}{'type'} = 'TTC';
+ next;
+ }
+ # only for backward compatibility; guess type from the file extension
+ if ($l =~ m/^Filename(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ if ($fn =~ m/\.otf$/i) {
+ print_dddebug("type: otf\n");
+ $fontfiles{$fn}{'type'} = 'OTF';
+ } elsif ($fn =~ m/\.otc(\(\d+\))?$/i) {
+ print_dddebug("type: otc\n");
+ $fontfiles{$fn}{'type'} = 'OTC';
+ } elsif ($fn =~ m/\.ttf$/i) {
+ print_dddebug("type: ttf\n");
+ $fontfiles{$fn}{'type'} = 'TTF';
+ } elsif ($fn =~ m/\.ttc(\(\d+\))?$/i) {
+ print_dddebug("type: ttc\n");
+ $fontfiles{$fn}{'type'} = 'TTC';
+ } else {
+ print_warning("cannot determine font type of $fn at line $lineno, skipping!\n");
+ delete $fontfiles{$fn};
+ }
+ next;
+ }
+ # only for removing
+ if ($l =~ m/^RMVname(\((\d+)\))?:\s*(.*)$/) {
+ my $fn = $3;
+ $fontfiles{$fn}{'priority'} = ($2 ? $2 : 10);
+ # cp932 for win32 console
+ my $encoded_fn;
+ if (win32()) {
+ $encoded_fn = encode_utftocp($fn);
+ }
+ print_dddebug("filename: ", ($encoded_fn ? "$encoded_fn" : "$fn"), "\n");
+ print_dddebug("type: remove\n");
+ $fontfiles{$fn}{'type'} = 'RMV';
+ next;
+ }
+ # we are still here??
+ print_error("Cannot parse this file at line $lineno, exiting.
+ Strange line: >>>$l<<<\n");
+ exit(1);
+ }
+}
+
+sub dump_font_database {
+ open(FOO, ">$dump_datafile") ||
+ die("cannot open $dump_datafile for writing: $!");
+ for my $k (sort keys %fontdb) {
+ print FOO "Name: $fontdb{$k}{'origname'}\n";
+ print FOO "PSName: $k\n" if ($fontdb{$k}{'origname'} ne $k);
+ print FOO "Class: $fontdb{$k}{'class'}\n";
+ for my $p (sort keys %{$fontdb{$k}{'provides'}}) {
+ print FOO "Provides($fontdb{$k}{'provides'}{$p}): $p\n";
+ }
+ print FOO "Casefold: $fontdb{$k}{'casefold'}\n" if ($fontdb{$k}{'casefold'});
+ for my $f (sort { $fontdb{$k}{'files'}{$a}{'priority'}
+ <=>
+ $fontdb{$k}{'files'}{$b}{'priority'} }
+ keys %{$fontdb{$k}{'files'}}) {
+ print FOO "$fontdb{$k}{'files'}{$f}{'type'}name($fontdb{$k}{'files'}{$f}{'priority'}): $f\n";
+ }
+ print FOO "\n"; # empty line is a separator between entries
+ }
+ close(FOO);
+}
+
+sub find_gs_resource {
+ my $foundres = '';
+ if (win32()) {
+ # determine tlgs or native gs
+ chomp(my $foo = `kpsewhich -var-value=SELFAUTOPARENT`);
+ if ( -d "$foo/tlpkg/tlgs" ) {
+ # should be texlive with tlgs
+ print_debug("Assuming tlgs win32 ...\n");
+ $foundres = "$foo/tlpkg/tlgs/Resource";
+ # for TL2016, tlgs binary has built-in Resource,
+ # so we cannot set up CJK fonts correctly.
+ # the following test forces to exit in such case
+ if ( ! -d $foundres ) {
+ print_error("No Resource directory available for tlgs,\n");
+ print_error("we cannot support such gs, sorry.\n");
+ $foundres = '';
+ }
+ # change output location
+ $cidfmap_pathpart = "../lib/cidfmap";
+ $cidfmap_local_pathpart = "../lib/cidfmap.local";
+ $cidfmap_aliases_pathpart = "../lib/cidfmap.aliases";
+ } else {
+ # we assume gswin32c is in the path
+ # TODO: what should we do for gswin64c?
+ chomp($foundres = `where gswin32c 2>$nul`); # assume 'where' is available
+ if ($?) {
+ print_error("Cannot run where gswin32c ...\n");
+ } else {
+ # trial 1: assume the relative path
+ # when C:\path\to\bin\gswin32c.exe is found, then there should be
+ # C:\path\to\Resource (note that 'where' returns backslash-ed path)
+ print_debug("Finding gs resource by assuming relative path ...\n");
+ $foundres = encode_cptoutf($foundres); # 99.99% unnecessary
+ $foundres =~ s!\\!/!g;
+ $foundres =~ s!/bin/gswin32c\.exe$!/Resource!;
+ if ( ! -d $foundres ) {
+ $foundres = '';
+ }
+ if (!$foundres) {
+ print_debug("Found gs but no resource, try another routine ...\n");
+ }
+ }
+ if (!$foundres) {
+ chomp(my $gsver = `gswin32c --version 2>$nul`);
+ if ($?) {
+ print_error("Cannot run gswin32c --version ...\n");
+ } else {
+ # trial 2: assume the fixed path, c:/gs/gs$gsver/Resource
+ print_debug("Finding gs resource by assuming fixed path ...\n");
+ $foundres = "c:/gs/gs$gsver/Resource";
+ if ( ! -d $foundres ) {
+ $foundres = '';
+ }
+ if (!$foundres) {
+ print_error("Found gs but no resource???\n");
+ }
+ }
+ }
+ }
+ } else {
+ # we assume that gs is in the path
+ chomp(my $gsver = `gs --version 2>$nul`);
+ if ($?) {
+ print_error("Cannot run gs --version ...\n");
+ } else {
+ # trial 1: assume the relative path
+ # when /path/to/bin/gs is found, then there should be
+ # /path/to/share/ghostscript/$(gs --version)/Resource
+ print_debug("Finding gs resource by assuming relative path ...\n");
+ chomp($foundres = `which gs`);
+ $foundres =~ s!/bin/gs$!/share/ghostscript/$gsver/Resource!;
+ if ( ! -d $foundres ) {
+ $foundres = '';
+ }
+ if (!$foundres) {
+ print_debug("Found gs but no resource, try another routine ...\n");
+ }
+ }
+ if (!$foundres) {
+ chomp(my @ret = `gs --help 2>$nul`);
+ if ($?) {
+ print_error("Cannot run gs --help ...\n");
+ } else {
+ # trial 2: parse gs help message
+ print_debug("Finding gs resource by parsing help message ...\n");
+ $foundres = '';
+ # try to find resource line
+ for (@ret) {
+ if (m!Resource/Font!) {
+ $foundres = $_;
+ # extract the first substring of non-space chars
+ # up to Resource/Font and drop the /Font part
+ $foundres =~ s!^.*\s(\S*Resource)/Font.*$!$1!;
+ last;
+ }
+ }
+ if (!$foundres) {
+ print_error("Found gs but no resource???\n");
+ }
+ }
+ }
+ }
+ return $foundres;
+}
+
+sub kpse_miscfont {
+ my ($file) = @_;
+ chomp(my $foo = `kpsewhich -format=miscfont $file`);
+ # for GitHub repository diretory structure
+ if ($foo eq "") {
+ $foo = "database/$file" if (-f "database/$file");
+ }
+ return $foo;
+}
+
+sub encode_utftocp {
+ my ($foo) = @_;
+ $foo = Encode::decode('utf-8', $foo);
+ $foo = Encode::encode('cp932', $foo);
+ return $foo;
+}
+
+sub encode_cptoutf {
+ my ($foo) = @_;
+ $foo = Encode::decode('cp932', $foo);
+ $foo = Encode::encode('utf-8', $foo);
+ return $foo;
+}
+
+sub version {
+ my $ret = sprintf "%s version %s\n", $prg, $version;
+ return $ret;
+}
+
+sub Usage {
+ my $headline = "Configuring Ghostscript for CJK CID/TTF fonts";
+ my $usage = "[perl] $prg\[.pl\] [OPTIONS]";
+ my $options = "
+-o, --output DIR specifies the base output dir, if not provided,
+ the Resource directory of an installed Ghostscript
+ is searched and used.
+-f, --fontdef FILE specify alternate set of font definitions, if not
+ given, the built-in set is used
+--fontdef-add FILE specify additional set of font definitions, to
+ overwrite subset of built-in definitions;
+ can be given multiple times
+-a, --alias LL=RR defines an alias, or overrides a given alias;
+ illegal if LL is provided by a real font, or
+ RR is neither available as real font or alias;
+ can be given multiple times
+--filelist FILE read list of available font files from FILE
+ instead of searching with kpathsea
+--link-texmf [DIR] link fonts into
+ DIR/$otf_pathpart
+ and
+ DIR/$ttf_pathpart
+ where DIR defaults to TEXMFLOCAL
+--otfps [DIR] generate configuration file (psnames-for-otf) into
+ DIR/$akotfps_pathpart
+ which is used by ps2otfps (developed by Akira Kakuto),
+ instead of generating snippets
+--force do not bail out if linked fonts already exist
+--remove try to remove instead of create
+--cleanup try to clean up all possible links/snippets and
+ cidfmap.local/cidfmap.aliases, which could have been
+ generated in the previous runs
+-n, --dry-run do not actually output anything
+-q, --quiet be less verbose
+-d, --debug output debug information, can be given multiple times
+-v, --version outputs only the version information
+-h, --help this help
+";
+
+ my $winonlyoptions = "
+--hardlink create hardlinks instead of symlinks
+--winbatch [FILE] prepare a batch file for link generation, instead of
+ generating links right away
+ the batch file name defaults to $winbatch
+";
+
+ my $commandoptions = "
+--dump-data [FILE] dump the set of font definitions which is currently
+ effective, where FILE (the dump output) defaults to
+ $dump_datafile; you can easily modify it,
+ and tell me with -f (or --fontdef) option
+--only-aliases regenerate only cidfmap.aliases file, instead of all
+--list-aliases lists the available aliases and their options, with the
+ selected option on top
+--list-all-aliases list all possible aliases without searching for
+ actually present files
+--list-fonts lists the fonts found on the system
+--info combines the information of --list-aliases and
+ --list-fonts
+--machine-readable output of --list-aliases is machine readable
+";
+
+ my $shortdesc = "
+This script searches a list of directories for CJK fonts, and makes
+them available to an installed Ghostscript. In the simplest case with
+sufficient privileges, a run without arguments should effect in a
+complete setup of Ghostscript.
+Search is done using the kpathsea library, in particular `kpsewhich`
+program. To run this script, you will need some TeX distribution in
+your system.
+";
+
+my $operation = "
+For each found TrueType (TTF) font it creates a cidfmap entry in
+
+ <Resource>/Init/cidfmap.local
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap.local instead
+
+and links the font to
+
+ <Resource>/CIDFSubst/
+
+For each CID font it creates a snippet in
+
+ <Resource>/Font/
+
+and links the font to
+
+ <Resource>/CIDFont/
+
+The `<Resource>` dir is either given by `-o`/`--output`, or otherwise searched
+from an installed Ghostscript (binary name is assumed to be 'gs' on unix,
+'gswin32c' on win32).
+
+Aliases are added to
+
+ <Resource>/Init/cidfmap.aliases
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap.aliases instead
+
+Finally, it tries to add runlib calls to
+
+ <Resource>/Init/cidfmap
+ -- if you are using tlgs win32, tlpkg/tlgs/lib/cidfmap
+
+to load the cidfmap.local and cidfmap.aliases.
+";
+
+ my $dirsearch = '
+Search is done using the kpathsea library, in particular using kpsewhich
+program. By default the following directories are searched:
+ - all TEXMF trees
+ - `/Library/Fonts`, `/Library/Fonts/Microsoft`, `/System/Library/Fonts`,
+ `/System/Library/Assets`, `/Network/Library/Fonts`,
+ `~/Library/Fonts` and `/usr/share/fonts` (all if available)
+ - `/Applications/Microsoft Word.app/Contents/Resources/{Fonts,DFonts}`,
+ `/Applications/Microsoft Excel.app/Contents/Resources/{Fonts,DFonts}`,
+ `/Applications/Microsoft PowerPoint.app/Contents/Resources/{Fonts,DFonts}`
+ (all if available, meant for Office for Mac 2016)
+ - `c:/windows/fonts` (on Windows)
+ - the directories in `OSFONTDIR` environment variable
+
+In case you want to add some directories to the search path, adapt the
+`OSFONTDIR` environment variable accordingly: Example:
+
+`````
+ OSFONTDIR="/usr/local/share/fonts/truetype//:/usr/local/share/fonts/opentype//" $prg
+`````
+
+will result in fonts found in the above two given directories to be
+searched in addition.
+';
+
+ my $outputfile = "
+If no output option is given, the program searches for a Ghostscript
+interpreter 'gs' and determines its Resource directory. This might
+fail, in which case one need to pass the output directory manually.
+
+Since the program adds files and link to this directory, sufficient
+permissions are necessary.
+";
+
+ my $aliases = "
+Aliases are managed via the Provides values in the font database.
+At the moment entries for the basic font names for CJK fonts
+are added:
+
+Japanese:
+
+ Ryumin-Light GothicBBB-Medium FutoMinA101-Bold FutoGoB101-Bold
+ MidashiMin-MA31 MidashiGo-MB31 Jun101-Light
+
+Korean:
+
+ HYSMyeongJo-Medium HYGoThic-Medium HYRGoThic-Medium
+
+Simplified Chinese:
+
+ STSong-Light STSong-Regular STHeiti-Regular STHeiti-Light
+ STKaiti-Regular STFangsong-Light STFangsong-Regular
+
+Traditional Chinese:
+
+ MSung-Light MSung-Medium MHei-Medium MKai-Medium
+
+In addition, we also include provide entries for the OTF Morisawa names:
+
+ RyuminPro-Light GothicBBBPro-Medium
+ FutoMinA101Pro-Bold FutoGoB101Pro-Bold
+ MidashiMinPro-MA31 MidashiGoPro-MB31 Jun101Pro-Light
+
+The order is determined by the `Provides` setting in the font database.
+That is, the first font found in this order will be used to provide the
+alias if necessary.
+
+For the Japanese fonts:
+ Morisawa Pr6N, Morisawa, Hiragino ProN, Hiragino,
+ Kozuka Pr6N, Kozuka ProVI, Kozuka Pro, Kozuka Std,
+ Yu OS X, Yu Win, MS,
+ Moga-Mobo-ex, Moga-Mobo, IPAex, IPA, Ume
+
+For the Korean fonts:
+ (Hanyang,) Adobe, Solaris, MS, Unfonts, Baekmuk
+
+For the Simplified Chinese:
+ Adobe, Fandol, Hiragino, Founder, MS, CJKUnifonts, Arphic, CJKUnifonts-ttf
+
+For the Traditional Chinese:
+ Adobe, MS, CJKUnifonts, Arphic, CJKUnifonts-ttf
+
+#### Overriding aliases ####
+
+Using the command line option `--alias LL=RR` one can add arbitrary aliases,
+or override ones selected by the program. For this to work the following
+requirements of `LL` and `RR` must be fulfilled:
+ * `LL` is not provided by a real font
+ * `RR` is available either as real font, or as alias (indirect alias)
+";
+
+ my $authors = "
+The script and its documentation was written by Norbert Preining, based
+on research and work by Yusuke Kuroki, Yusuke Terada, Bruno Voisin,
+Hironobu Yamashita, Munehiro Yamamoto and the TeX Q&A wiki page.
+
+Maintained by Japanese TeX Development Community. For development, see
+ https://github.com/texjporg/cjk-gs-support
+
+The script is licensed under GNU General Public License Version 3 or later.
+The contained font data is not copyrightable.
+";
+
+
+ if ($opt_markdown) {
+ print "$headline\n";
+ print ("=" x length($headline));
+ print "\n$shortdesc\nUsage\n-----\n\n`````\n$usage\n`````\n\n";
+ print "#### Options ####\n\n`````";
+ print_for_out($options, " ");
+ print "`````\n\n#### Windows only options ####\n\n`````";
+ print_for_out($winonlyoptions, " ");
+ print "`````\n\n#### Command like options ####\n\n`````";
+ print_for_out($commandoptions, " ");
+ print "`````\n\nOperation\n---------\n$operation\n";
+ print "How and which directories are searched\n";
+ print "--------------------------------------\n$dirsearch\n";
+ print "Output files\n";
+ print "------------\n$outputfile\n";
+ print "Aliases\n";
+ print "-------\n$aliases\n";
+ print "Authors, Contributors, and Copyright\n";
+ print "------------------------------------\n$authors\n";
+ } else {
+ print "\nUsage: $usage\n\n$headline\n$shortdesc";
+ print "\nOptions:\n";
+ print_for_out($options, " ");
+ if (win32()) {
+ print "\nWindows only options:\n";
+ print_for_out($winonlyoptions, " ");
+ }
+ print "\nCommand like options:\n";
+ print_for_out($commandoptions, " ");
+ print "\nOperation:\n";
+ print_for_out($operation, " ");
+ print "\nHow and which directories are searched:\n";
+ print_for_out($dirsearch, " ");
+ print "\nOutput files:\n";
+ print_for_out($outputfile, " ");
+ print "\nAliases:\n";
+ print_for_out($aliases, " ");
+ print "\nAuthors, Contributors, and Copyright:\n";
+ print_for_out($authors, " ");
+ print "\n";
+ }
+ exit(0);
+}
+
+sub print_for_out {
+ my ($what, $indent) = @_;
+ for (split /\n/, $what) {
+ next if m/`````/;
+ s/\s*####\s*//g;
+ if ($_ eq '') {
+ print "\n";
+ } else {
+ print "$indent$_\n";
+ }
+ }
+}
+
+# info/warning can be suppressed
+# verbose/error cannot be suppressed
+sub print_info {
+ print STDOUT "$prg: ", @_ if (!$opt_quiet);
+}
+sub print_verbose {
+ print STDOUT "$prg: ", @_;
+}
+sub print_warning {
+ print STDERR "$prg [WARNING]: ", @_ if (!$opt_quiet)
+}
+sub print_error {
+ print STDERR "$prg [ERROR]: ", @_;
+}
+sub print_debug {
+ print STDERR "$prg [DEBUG]: ", @_ if ($opt_debug >= 1);
+}
+sub print_ddebug {
+ print STDERR "$prg [DEBUG]: ", @_ if ($opt_debug >= 2);
+}
+sub print_dddebug {
+ print STDERR "$prg [DEBUG]: ", @_ if ($opt_debug >= 3);
+}
+
+
+__DATA__
+#
+# CJK FONT DEFINITIONS
+#
+
+# Noto
+INCLUDE cjkgs-notoserif.dat
+INCLUDE cjkgs-notosans.dat
+
+# SourceHan
+INCLUDE cjkgs-sourcehanserif.dat
+INCLUDE cjkgs-sourcehansans.dat
+
+#
+# JAPANESE FONTS
+#
+
+# Morisawa -- Provides J10(Pr6N), J15(Pr6), J18(Pr5), J20(Pro)
+INCLUDE cjkgs-morisawa.dat
+#INCLUDE cjkgs-morisawa-extra.dat
+
+# Hiragino -- Provides J30(ProN), J40(Pro)
+INCLUDE cjkgs-hiragino.dat
+
+# Kozuka -- Provides J50(Pr6N), J55(ProVI), J60(Pro), J65(Std)
+INCLUDE cjkgs-kozuka.dat
+INCLUDE cjkgs-ryokana.dat
+
+# Yu-fonts MacOS version -- Provides J80
+INCLUDE cjkgs-yu-osx.dat
+
+# Yu-fonts Windows/MSOffice version -- Provides J90
+INCLUDE cjkgs-yu-win.dat
+
+# MS -- Provides J95
+INCLUDE cjkgs-microsoft.dat
+
+# BIZ UD
+INCLUDE cjkgs-bizud.dat
+
+# TypeBank
+INCLUDE cjkgs-typebank.dat
+
+# Fontworks
+INCLUDE cjkgs-fontworks.dat
+
+# Toppan
+INCLUDE cjkgs-toppan.dat
+
+# Heisei
+INCLUDE cjkgs-heisei.dat
+
+# Moga-Mobo from Y.Oz Vox (free) -- Provides J100(Ex), J110(none)
+INCLUDE cjkgs-mogamobo.dat
+
+# IPA (free) -- Provides J120(Ex), J130(none)
+INCLUDE cjkgs-ipa.dat
+
+# Ume-font (free) -- Provides J140
+INCLUDE cjkgs-ume.dat
+
+# Sazanami (free)
+INCLUDE cjkgs-sazanami.dat
+
+# Osaka (Apple)
+
+Name: Osaka
+Class: Japan
+TTFname: Osaka.ttf
+
+Name: Osaka-Mono
+Class: Japan
+TTFname: OsakaMono.ttf
+
+#
+# CHINESE FONTS
+#
+
+# Adobe -- Provides S30, T30
+INCLUDE cjkgs-adobe.dat
+
+# Hiragino -- Provides S50
+# (already included in JAPANESE section)
+
+# Beijing Founder Electronics -- Provides S55
+INCLUDE cjkgs-founder.dat
+
+# Changzhou SinoType -- Provides S??
+INCLUDE cjkgs-sinotype.dat
+
+# DynaComware -- Provides T??
+INCLUDE cjkgs-dynacomware.dat
+
+# Monotype
+INCLUDE cjkgs-monotype.dat
+
+# Apple
+INCLUDE cjkgs-apple.dat
+
+# Shanghai Ikarus Ltd./URW Software & Type GmbH
+
+Name: SIL-Hei-Med-Jian
+Class: GB
+TTFname: Hei.ttf
+
+Name: SIL-Kai-Reg-Jian
+Class: GB
+TTFname: Kai.ttf
+
+# Fandol (free) -- Provides S40
+INCLUDE cjkgs-fandol.dat
+
+# Arphic (free) -- Provides S80, T80
+INCLUDE cjkgs-arphic.dat
+
+# CJK-Unifonts new ttc edition (free) -- Provides T70, S70
+# CJK-Unifonts old ttf edition (free) -- Provides T90, S90
+INCLUDE cjkgs-cjkuni.dat
+
+# WenQuanYi (free)
+INCLUDE cjkgs-wenquanyi.dat
+
+# cwTeX (free)
+
+Name: cwTeXMing
+Class: CNS
+TTFname: cwming.ttf
+
+Name: cwTeXHeiBold
+Class: CNS
+TTFname: cwheib.ttf
+
+Name: cwTeXKai
+Class: CNS
+TTFname: cwkai.ttf
+
+Name: cwTeXYen
+Class: CNS
+TTFname: cwyen.ttf
+
+Name: cwTeXFangSong
+Class: CNS
+TTFname: cwfs.ttf
+
+#
+# KOREAN FONTS
+#
+
+# Adobe -- Provides K30/80
+# (already included in CHINESE section)
+
+# Solaris -- Provides K40
+INCLUDE cjkgs-solaris.dat
+
+# Baekmuk (free)
+# This is a special case, because "batang.ttf" in baekmuk and
+# "Batang.ttf" in Microsoft Mac Office font share the same filename;
+# symlink name should be "Baekmuk-Batang.ttf"
+# similar for "Gulim.ttf" -- HY (2016/09/29)
+
+Name: Baekmuk-Batang
+Class: Korea
+Provides(70): HYSMyeongJo-Medium
+Casefold: true
+TTFname(20): batang.ttf
+TTFname(10): Baekmuk-Batang.ttf
+
+Name: Baekmuk-Dotum
+Class: Korea
+Provides(70): HYGoThic-Medium
+TTFname(20): dotum.ttf
+TTFname(10): Baekmuk-Dotum.ttf
+
+Name: Baekmuk-Gulim
+Class: Korea
+Provides(70): HYRGoThic-Medium
+Casefold: true
+TTFname(20): gulim.ttf
+TTFname(10): Baekmuk-Gulim.ttf
+
+Name: Baekmuk-Headline
+Class: Korea
+TTFname(20): hline.ttf
+TTFname(10): Baekmuk-Headline.ttf
+
+# Unfonts (free) -- Provides K60
+INCLUDE cjkgs-unfonts.dat
+
+# Nanum (free)
+INCLUDE cjkgs-nanum.dat
+
+# Design font by Ho-Seok Ee, aka. "ALee's font" (free)
+
+Name: Bandal
+Class: Korea
+TTFname: Bandal.ttf
+
+Name: Bangwool
+Class: Korea
+TTFname: Bangwool.ttf
+
+Name: Eunjin
+Class: Korea
+TTFname: Eunjin.ttf
+
+Name: EunjinNakseo
+Class: Korea
+TTFname: EunjinNakseo.ttf
+
+Name: Guseul
+Class: Korea
+TTFname: Guseul.ttf
+
+# Woowa Brothers (free)
+
+Name: BMHANNA
+Class: Korea
+TTFname: BM-HANNA.ttf
+
+# Hancom HCR (free)
+INCLUDE cjkgs-hancom.dat
+
+
+#
+# Microsoft Windows, Windows/Mac Office fonts
+#
+
+# korea
+
+Name: Batang
+Class: Korea
+Casefold: true
+TTFname(50): Batang.ttf
+TTCname(20): batang.ttc(0)
+
+Name: BatangChe
+Class: Korea
+Provides(50): HYSMyeongJo-Medium
+TTCname(20): batang.ttc(1)
+
+Name: Dotum
+Class: Korea
+TTCname(20): gulim.ttc(2)
+
+Name: DotumChe
+Class: Korea
+Provides(50): HYGoThic-Medium
+TTCname(20): gulim.ttc(3)
+
+Name: Gulim
+Class: Korea
+Casefold: true
+TTFname(50): Gulim.ttf
+TTCname(20): gulim.ttc(0)
+
+Name: GulimChe
+Class: Korea
+Provides(50): HYRGoThic-Medium
+Provides(90): HYGoThic-Medium
+TTCname(20): gulim.ttc(1)
+
+Name: Gungsuh
+Class: Korea
+TTCname(20): batang.ttc(2)
+
+Name: GungsuhChe
+Class: Korea
+TTCname(20): batang.ttc(3)
+
+Name: MalgunGothicRegular
+Class: Korea
+TTFname: malgun.ttf
+
+Name: MalgunGothicBold
+Class: Korea
+TTFname: malgunbd.ttf
+
+Name: MalgunGothic-Semilight
+Class: Korea
+TTFname: malgunsl.ttf
+
+# simplified chinese
+
+Name: SimHei
+Class: GB
+Provides(60): STHeiti-Regular
+Provides(60): STHeiti-Light
+TTFname(50): SimHei.ttf
+TTFname(20): simhei.ttf
+
+Name: SimSun
+Class: GB
+Provides(60): STSong-Light
+Provides(60): STSong-Regular
+TTFname(50): SimSun.ttf
+TTFname(21): simsun.ttf
+TTCname(20): simsun.ttc(0)
+
+Name: NSimSun
+Class: GB
+TTCname(20): simsun.ttc(1)
+
+Name: KaiTi
+Class: GB
+Provides(60): STKaiti-Regular
+TTFname(40): Kaiti.ttf
+TTFname(20): simkai.ttf
+
+Name: FangSong
+Class: GB
+Provides(60): STFangsong-Light
+Provides(60): STFangsong-Regular
+TTFname(40): Fangsong.ttf
+TTFname(20): simfang.ttf
+
+Name: LiSu
+Class: GB
+TTCname(20): SIMLI.TTF
+TTCname(19): simli.ttf
+
+Name: YouYuan
+Class: GB
+TTCname(20): SIMYOU.TTF
+TTCname(19): simyou.ttf
+
+Name: MicrosoftYaHei
+Class: GB
+TTFname(20): msyh.ttf
+TTCname(30): msyh.ttc(0)
+
+Name: MicrosoftYaHei-Bold
+Class: GB
+TTFname(20): msyhbd.ttf
+TTCname(30): msyhbd.ttc(0)
+
+Name: MicrosoftYaHeiLight
+Class: GB
+TTFname(20): msyhl.ttf
+TTCname(30): msyhl.ttc(0)
+
+Name: DengXian-Regular
+Class: GB
+TTFname: Deng.ttf
+
+Name: DengXian-Bold
+Class: GB
+TTFname: Dengb.ttf
+
+Name: DengXian-Light
+Class: GB
+TTFname: Dengl.ttf
+
+# traditional chinese
+
+Name: MingLiU
+Class: CNS
+Provides(60): MSung-Medium
+Provides(60): MSung-Light
+TTFname(50): MingLiU.ttf
+TTCname(20): mingliu.ttc(0)
+
+Name: PMingLiU
+Class: CNS
+TTFname(50): PMingLiU.ttf
+TTCname(20): mingliu.ttc(1)
+
+Name: DFKaiShu-SB-Estd-BF
+Class: CNS
+Provides(60): MKai-Medium
+TTFname(50): BiauKai.ttf
+TTFname(20): kaiu.ttf
+
+Name: MicrosoftJhengHeiRegular
+Class: CNS
+Provides(60): MHei-Medium
+TTFname(40): MSJH.ttf
+TTFname(20): msjh.ttf
+TTCname(30): msjh.ttc(0)
+
+Name: MicrosoftJhengHeiBold
+Class: CNS
+TTFname(40): MSJHBD.ttf
+TTFname(20): msjhbd.ttf
+TTCname(30): msjhbd.ttc(0)
+
+Name: MicrosoftJhengHeiLight
+Class: CNS
+TTCname(30): msjhl.ttc(0)
+
+Name: MicrosoftMHei
+Class: CNS
+Provides(65): MHei-Medium
+TTFname(10): MSMHei.ttf
+
+Name: MicrosoftMHei-Bold
+Class: CNS
+TTFname(10): MSMHei-Bold.ttf
+
+# Remove-only database (should begin with !INCLUDE)
+# that is, entries which contain at least one 'RMVname' line
+# note that this line should come at the _end_ of all INCLUDE files
+!INCLUDE cjkgs-macos-removeonly.dat
+
+
+### Local Variables:
+### perl-indent-level: 2
+### tab-width: 2
+### indent-tabs-mode: nil
+### End:
+# vim: set tabstop=2 expandtab autoindent:
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-adobe.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-adobe.dat
new file mode 100644
index 0000000000..0081d845d2
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-adobe.dat
@@ -0,0 +1,58 @@
+# Adobe
+
+### SIMPLIFIED CHINESE ###
+
+Name: AdobeSongStd-Light
+Class: GB
+Provides(30): STSong-Light
+Provides(30): STSong-Regular
+OTFname(10): AdobeSongStd-Light.otf
+
+Name: AdobeHeitiStd-Regular
+Class: GB
+Provides(30): STHeiti-Regular
+Provides(30): STHeiti-Light
+OTFname(20): AdobeHeitiStd-Regular.otf
+
+Name: AdobeKaitiStd-Regular
+Class: GB
+Provides(30): STKaiti-Regular
+OTFname(20): AdobeKaitiStd-Regular.otf
+
+Name: AdobeFangsongStd-Regular
+Class: GB
+Provides(30): STFangsong-Light
+Provides(30): STFangsong-Regular
+OTFname(20): AdobeFangsongStd-Regular.otf
+
+### TRADITIONAL CHINESE ###
+
+Name: AdobeMingStd-Light
+Class: CNS
+Provides(30): MSung-Light
+Provides(30): MSung-Medium
+OTFname(20): AdobeMingStd-Light.otf
+
+Name: AdobeFanHeitiStd-Bold
+Class: CNS
+Provides(30): MHei-Medium
+Provides(30): MKai-Medium
+OTFname(20): AdobeFanHeitiStd-Bold.otf
+
+### KOREAN ###
+
+Name: AdobeMyungjoStd-Medium
+Class: Korea
+Provides(30): HYSMyeongJo-Medium
+OTFname: AdobeMyungjoStd-Medium.otf
+
+Name: AdobeGothicStd-Bold
+Class: Korea
+Provides(30): HYGoThic-Medium
+Provides(80): HYRGoThic-Medium
+OTFname: AdobeGothicStd-Bold.otf
+
+Name: AdobeGothicStd-Light
+Class: Korea
+OTFname: AdobeGothicStd-Light.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-apple.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-apple.dat
new file mode 100644
index 0000000000..95d70a2610
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-apple.dat
@@ -0,0 +1,119 @@
+# Apple
+
+### TRADITIONAL CHINESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# Apple LiSung Light.ttf
+# Apple LiGothic Medium.ttf
+# are bundled with macOS 10.12.6 Sierra or earlier versions.
+# AppleLiSung-Light.ttf
+# AppleLiGothic-Medium.ttf
+# are bundled with macOS 10.13 High Sierra or later versions.
+
+Name: LiSungLight
+Class: CNS
+TTFname(20): Apple LiSung Light.ttf
+TTFname(19): AppleLiSung-Light.ttf
+TTFname(10): LiSungLight.ttf
+
+Name: LiGothicMed
+Class: CNS
+TTFname(20): Apple LiGothic Medium.ttf
+TTFname(19): AppleLiGothic-Medium.ttf
+TTFname(10): LiGothicMed.ttf
+
+### KOREAN ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# AppleMyungjo.ttf
+# AppleGothic.ttf
+# PCmyoungjo.ttf
+# Pilgiche.ttf
+# Gungseouche.ttf
+# HeadlineA.ttf
+# are bundled with all versions.
+# AppleSDGothicNeo-Regular.otf
+# AppleSDGothicNeo-Medium.otf
+# AppleSDGothicNeo-SemiBold.otf
+# AppleSDGothicNeo-Bold.otf
+# AppleSDGothicNeo-Light.otf
+# AppleSDGothicNeo-Thin.otf
+# AppleSDGothicNeo-UltraLight.otf
+# AppleSDGothicNeo-ExtraBold.otf
+# AppleSDGothicNeo-Heavy.otf
+# are bundled with OS X 10.10.5 Yosemite or earlier versions.
+# AppleSDGothicNeo.ttc
+# is bundled with OS X 10.11 El Capitan or later versions.
+
+Name: AppleMyungjo
+Class: Korea
+#Provides(??): HYSMyeongJo-Medium # fails
+TTFname: AppleMyungjo.ttf
+
+Name: AppleGothic
+Class: Korea
+#Provides(??): HYGoThic-Medium # fails
+#Provides(??): HYRGoThic-Medium # fails
+TTFname: AppleGothic.ttf
+
+Name: AppleSDGothicNeo-Regular
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Regular.otf
+OTCname(20): AppleSDGothicNeo.ttc(0)
+
+Name: AppleSDGothicNeo-Medium
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Medium.otf
+OTCname(20): AppleSDGothicNeo.ttc(2)
+
+Name: AppleSDGothicNeo-SemiBold
+Class: Korea
+OTFname(10): AppleSDGothicNeo-SemiBold.otf
+OTCname(20): AppleSDGothicNeo.ttc(4)
+
+Name: AppleSDGothicNeo-Bold
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Bold.otf
+OTCname(20): AppleSDGothicNeo.ttc(6)
+
+Name: AppleSDGothicNeo-Light
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Light.otf
+OTCname(20): AppleSDGothicNeo.ttc(8)
+
+Name: AppleSDGothicNeo-Thin
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Thin.otf
+OTCname(20): AppleSDGothicNeo.ttc(10)
+
+Name: AppleSDGothicNeo-UltraLight
+Class: Korea
+OTFname(10): AppleSDGothicNeo-UltraLight.otf
+OTCname(20): AppleSDGothicNeo.ttc(12)
+
+Name: AppleSDGothicNeo-ExtraBold
+Class: Korea
+OTFname(10): AppleSDGothicNeo-ExtraBold.otf
+OTCname(20): AppleSDGothicNeo.ttc(14)
+
+Name: AppleSDGothicNeo-Heavy
+Class: Korea
+OTFname(10): AppleSDGothicNeo-Heavy.otf
+OTCname(20): AppleSDGothicNeo.ttc(16)
+
+Name: JCsmPC
+Class: Korea
+TTFname: PCmyoungjo.ttf
+
+Name: JCfg
+Class: Korea
+TTFname: Pilgiche.ttf
+
+Name: JCkg
+Class: Korea
+TTFname: Gungseouche.ttf
+
+Name: JCHEadA
+Class: Korea
+TTFname: HeadlineA.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-arphic.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-arphic.dat
new file mode 100644
index 0000000000..80b4b45d00
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-arphic.dat
@@ -0,0 +1,46 @@
+# Arphic Technology
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Note about TeX Live:
+# gbsn00lp.ttf
+# gkai00mp.ttf
+# bsmi00lp.ttf
+# bkai00mp.ttf
+# are available as "arphic" package for free.
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# WeibeiSC-Bold.otf (PSName: Weibei-SC-Bold)
+# WeibeiTC-Bold.otf (PSName: Weibei-TC-Bold)
+# are bundled with macOS 10.12.6 Sierra or earlier versions.
+# WeibeiSC-Bold.otf (PSName: WeibeiSC-Bold)
+# WeibeiTC-Bold.otf (PSName: WeibeiTC-Bold)
+# are bundled with macOS 10.13 High Sierra or later versions.
+
+Name: BousungEG-Light-GB
+Class: GB
+Provides(80): STSong-Light
+Provides(80): STSong-Regular
+Provides(80): STFangsong-Light
+Provides(80): STFangsong-Regular
+TTFname: gbsn00lp.ttf
+
+Name: GBZenKai-Medium
+Class: GB
+Provides(80): STKaiti-Regular
+Provides(80): STHeiti-Regular
+Provides(80): STHeiti-Light
+TTFname: gkai00mp.ttf
+
+Name: ShanHeiSun-Light
+Class: CNS
+Provides(80): MSung-Light
+Provides(80): MSung-Medium
+TTFname: bsmi00lp.ttf
+
+Name: ZenKai-Medium
+Class: CNS
+Provides(80): MKai-Medium
+Provides(80): MHei-Medium
+TTFname: bkai00mp.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-bizud.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-bizud.dat
new file mode 100644
index 0000000000..3ab501673e
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-bizud.dat
@@ -0,0 +1,60 @@
+# BIZ UD (Morisawa)
+
+### JAPANESE ###
+
+# Note:
+# BIZ-UD*.ttc (3 files)
+# are bundled with Windows 10 (October 2018 Update).
+# Also available from https://bizplus.morisawa.co.jp for Win/Mac.
+
+Name: BIZ-UDGothic-Bold
+Class: Japan
+TTCname: BIZ-UDGothicB.ttc(0)
+
+Name: BIZ-UDPGothic-Bold
+Class: Japan
+TTCname: BIZ-UDGothicB.ttc(1)
+
+Name: BIZ-UDGothic
+Class: Japan
+TTCname: BIZ-UDGothicR.ttc(0)
+
+Name: BIZ-UDPGothic
+Class: Japan
+TTCname: BIZ-UDGothicR.ttc(1)
+
+Name: BIZ-UDMincho-Medium
+Class: Japan
+TTCname: BIZ-UDMinchoM.ttc(0)
+
+Name: BIZ-UDPMincho-Medium
+Class: Japan
+TTCname: BIZ-UDMinchoM.ttc(1)
+
+# Version 2018-10-23 or earlier (before official October 2018 Update)
+# had different filename and PSName
+
+Name: BIZ-UDGothic-B
+Class: Japan
+TTCname: BIZ-UDGothic-B.ttc(0)
+
+Name: BIZ-UDPGothic-B
+Class: Japan
+TTCname: BIZ-UDGothic-B.ttc(1)
+
+Name: BIZ-UDGothic-R
+Class: Japan
+TTCname: BIZ-UDGothic-R.ttc(0)
+
+Name: BIZ-UDPGothic-R
+Class: Japan
+TTCname: BIZ-UDGothic-R.ttc(1)
+
+Name: BIZ-UDMincho-M
+Class: Japan
+TTCname: BIZ-UDMincho-M.ttc(0)
+
+Name: BIZ-UDPMincho-M
+Class: Japan
+TTCname: BIZ-UDMincho-M.ttc(1)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-cjkuni.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-cjkuni.dat
new file mode 100644
index 0000000000..9e63d805e2
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-cjkuni.dat
@@ -0,0 +1,66 @@
+# CJK-Unifonts new ttc edition (free)
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+Name: UMingCN
+Class: GB
+Provides(70): STSong-Light
+Provides(70): STSong-Regular
+Provides(70): STFangsong-Light
+Provides(70): STFangsong-Regular
+TTCname: uming.ttc(0)
+
+Name: UMingTW
+Class: CNS
+Provides(70): MSung-Light
+Provides(70): MSung-Medium
+TTCname: uming.ttc(2)
+
+Name: UKaiCN
+Class: GB
+Provides(70): STKaiti-Regular
+Provides(70): STHeiti-Regular
+Provides(70): STHeiti-Light
+TTCname: ukai.ttc(0)
+
+Name: UKaiTW
+Class: CNS
+Provides(70): MKai-Medium
+Provides(70): MHei-Medium
+TTCname: ukai.ttc(2)
+
+# CJK-Unifonts old ttf edition (free)
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# CNS
+Name: ShanHeiSun-Uni
+Class: CNS
+Provides(90): MSung-Light
+Provides(90): MSung-Medium
+TTFname: uming.ttf
+
+# GB
+Name: ShanHeiSun-Uni-Adobe-GB1
+Class: GB
+Provides(90): STSong-Light
+Provides(90): STSong-Regular
+Provides(90): STFangsong-Light
+Provides(90): STFangsong-Regular
+TTFname: uming.ttf
+
+# CNS
+Name: ZenKai-Uni
+Class: CNS
+Provides(90): MKai-Medium
+Provides(90): MHei-Medium
+TTFname: ukai.ttf
+
+# GB
+Name: ZenKai-Uni-Adobe-GB1
+Class: GB
+Provides(90): STKaiti-Regular
+Provides(90): STHeiti-Regular
+Provides(90): STHeiti-Light
+TTFname: ukai.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-dynacomware.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-dynacomware.dat
new file mode 100644
index 0000000000..8fef04f139
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-dynacomware.dat
@@ -0,0 +1,148 @@
+# DynaComware, Dynacomware Taiwan
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# 儷黑 Pro.ttf
+# 儷宋 Pro.ttf
+# are bundled with macOS 10.12.6 Sierra or earlier versions.
+# LiHeiPro.ttf
+# LiSongPro.ttf
+# are bundled with macOS 10.13 High Sierra or later versions.
+# WawaSC-Regular.otf
+# WawaTC-Regular.otf
+# Hannotate.ttc
+# Hanzipen.ttc
+# are bundled with OS X 10.9 Mavericks or later versions.
+# PingFang.ttc
+# index 0--17: PingFang*
+# index 18--35: .PingFang* (hidden fonts)
+# is bundled with OS X 10.11 El Capitan or later versions.
+
+Name: LiHeiPro
+Class: CNS
+#Provides(??): MHei-Medium # fails
+TTFname(20): 儷黑 Pro.ttf
+TTFname(10): LiHeiPro.ttf
+
+Name: LiSongPro
+Class: CNS
+#Provides(??): MSung-Medium # fails
+#Provides(??): MSung-Light # fails
+TTFname(20): 儷宋 Pro.ttf
+TTFname(10): LiSongPro.ttf
+
+Name: WawaSC-Regular
+PSName: DFWaWaSC-W5
+Class: GB
+OTFname: WawaSC-Regular.otf
+
+Name: WawaTC-Regular
+PSName: DFWaWaTC-W5
+Class: CNS
+OTFname: WawaTC-Regular.otf
+
+Name: HannotateSC-W5
+Class: GB
+OTCname: Hannotate.ttc(0)
+
+Name: HannotateTC-W5
+Class: CNS
+OTCname: Hannotate.ttc(1)
+
+Name: HannotateSC-W7
+Class: GB
+OTCname: Hannotate.ttc(2)
+
+Name: HannotateTC-W7
+Class: CNS
+OTCname: Hannotate.ttc(3)
+
+Name: HanziPenSC-W3
+Class: GB
+OTCname: Hanzipen.ttc(0)
+
+Name: HanziPenTC-W3
+Class: CNS
+OTCname: Hanzipen.ttc(1)
+
+Name: HanziPenSC-W5
+Class: GB
+OTCname: Hanzipen.ttc(2)
+
+Name: HanziPenTC-W5
+Class: CNS
+OTCname: Hanzipen.ttc(3)
+
+Name: PingFangHK-Regular
+Class: CNS # HK
+OTCname: PingFang.ttc(0)
+
+Name: PingFangTC-Regular
+Class: CNS
+OTCname: PingFang.ttc(1)
+
+Name: PingFangSC-Regular
+Class: GB
+OTCname: PingFang.ttc(2)
+
+Name: PingFangHK-Medium
+Class: CNS # HK
+OTCname: PingFang.ttc(3)
+
+Name: PingFangTC-Medium
+Class: CNS
+OTCname: PingFang.ttc(4)
+
+Name: PingFangSC-Medium
+Class: GB
+OTCname: PingFang.ttc(5)
+
+Name: PingFangHK-Semibold
+Class: CNS # HK
+OTCname: PingFang.ttc(6)
+
+Name: PingFangTC-Semibold
+Class: CNS
+OTCname: PingFang.ttc(7)
+
+Name: PingFangSC-Semibold
+Class: GB
+OTCname: PingFang.ttc(8)
+
+Name: PingFangHK-Light
+Class: CNS # HK
+OTCname: PingFang.ttc(9)
+
+Name: PingFangTC-Light
+Class: CNS
+OTCname: PingFang.ttc(10)
+
+Name: PingFangSC-Light
+Class: GB
+OTCname: PingFang.ttc(11)
+
+Name: PingFangHK-Thin
+Class: CNS # HK
+OTCname: PingFang.ttc(12)
+
+Name: PingFangTC-Thin
+Class: CNS
+OTCname: PingFang.ttc(13)
+
+Name: PingFangSC-Thin
+Class: GB
+OTCname: PingFang.ttc(14)
+
+Name: PingFangHK-Ultralight
+Class: CNS # HK
+OTCname: PingFang.ttc(15)
+
+Name: PingFangTC-Ultralight
+Class: CNS
+OTCname: PingFang.ttc(16)
+
+Name: PingFangSC-Ultralight
+Class: GB
+OTCname: PingFang.ttc(17)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-fandol.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-fandol.dat
new file mode 100644
index 0000000000..c2e10bd2b9
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-fandol.dat
@@ -0,0 +1,39 @@
+# Fandol (free)
+
+### SIMPLIFIED CHINESE ###
+
+# Note about TeX Live:
+# Fandol*.otf (6 files)
+# are available as "fandol" package for free.
+
+Name: FandolSong-Regular
+Class: GB
+Provides(40): STSong-Light
+OTFname(10): FandolSong-Regular.otf
+
+Name: FandolSong-Bold
+Provides(40): STSong-Regular
+Class: GB
+OTFname(10): FandolSong-Bold.otf
+
+Name: FandolKai-Regular
+Class: GB
+Provides(40): STKaiti-Regular
+OTFname(10): FandolKai-Regular.otf
+
+Name: FandolHei-Regular
+Class: GB
+Provides(40): STHeiti-Regular
+Provides(40): STHeiti-Light
+OTFname(10): FandolHei-Regular.otf
+
+Name: FandolHei-Bold
+Class: GB
+OTFname(10): FandolHei-Bold.otf
+
+Name: FandolFang-Regular
+Class: GB
+Provides(40): STFangsong-Light
+Provides(40): STFangsong-Regular
+OTFname(10): FandolFang-Regular.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-fontworks.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-fontworks.dat
new file mode 100644
index 0000000000..0a40e4f5ef
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-fontworks.dat
@@ -0,0 +1,69 @@
+# Fontworks (including Fontworks MacOS version)
+
+### JAPANESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# Klee.ttc
+# Tsukushi{A,B}MaruGothic.ttc
+# are bundled with OS X 10.11 El Capitan or later versions.
+
+Name: FOT-KleePro-M
+PSName: KleePro-M
+Class: Japan
+OTFname: FOT-KleePro-M.otf
+
+Name: FOT-KleePro-DB
+PSName: KleePro-DB
+Class: Japan
+OTFname: FOT-KleePro-DB.otf
+
+Name: FOT-TsukuARdGothicStd-L
+PSName: TsukuARdGothicStd-L
+Class: Japan
+OTFname: FOT-TsukuARdGothicStd-L.otf
+
+Name: FOT-TsukuARdGothicStd-R
+PSName: TsukuARdGothicStd-R
+Class: Japan
+OTFname: FOT-TsukuARdGothicStd-R.otf
+
+Name: FOT-TsukuARdGothicStd-M
+PSName: TsukuARdGothicStd-M
+Class: Japan
+OTFname: FOT-TsukuARdGothicStd-M.otf
+
+Name: FOT-TsukuARdGothicStd-D
+PSName: TsukuARdGothicStd-D
+Class: Japan
+OTFname: FOT-TsukuARdGothicStd-D.otf
+
+Name: FOT-TsukuARdGothicStd-E
+PSName: TsukuARdGothicStd-E
+Class: Japan
+OTFname: FOT-TsukuARdGothicStd-E.otf
+
+Name: FOT-TsukuBRdGothicStd-L
+PSName: TsukuBRdGothicStd-L
+Class: Japan
+OTFname: FOT-TsukuBRdGothicStd-L.otf
+
+Name: FOT-TsukuBRdGothicStd-R
+PSName: TsukuBRdGothicStd-R
+Class: Japan
+OTFname: FOT-TsukuBRdGothicStd-R.otf
+
+Name: FOT-TsukuBRdGothicStd-M
+PSName: TsukuBRdGothicStd-M
+Class: Japan
+OTFname: FOT-TsukuBRdGothicStd-M.otf
+
+Name: FOT-TsukuBRdGothicStd-D
+PSName: TsukuBRdGothicStd-D
+Class: Japan
+OTFname: FOT-TsukuBRdGothicStd-D.otf
+
+Name: FOT-TsukuBRdGothicStd-E
+PSName: TsukuBRdGothicStd-E
+Class: Japan
+OTFname: FOT-TsukuBRdGothicStd-E.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-founder.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-founder.dat
new file mode 100644
index 0000000000..8951754865
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-founder.dat
@@ -0,0 +1,112 @@
+# Beijing Founder Electronics
+
+### SIMPLIFIED CHINESE ###
+
+# Note:
+# FZ****.TTF (13 files)
+# are bundled with with WPS Office (formerly Kingsoft Office) Linux.
+# Lantinghei.ttc
+# is bundled with OS X 10.9 Mavericks or later versions.
+
+# FZShuSong-Z01
+Name: FZSSK--GBK1-0
+Class: GB
+Provides(55): STSong-Light
+TTFname: FZSSK.TTF
+
+# FZXiaoBiaoSong-B05
+Name: FZXBSK--GBK1-0
+Class: GB
+Provides(55): STSong-Regular
+TTFname: FZXBSK.TTF
+
+# FZXiHeiI-Z08
+Name: FZXH1K--GBK1-0
+Class: GB
+Provides(55): STHeiti-Light
+TTFname: FZXH1K.TTF
+
+# FZHei-B01
+Name: FZHTK--GBK1-0
+Class: GB
+Provides(55): STHeiti-Regular
+TTFname: FZHTK.TTF
+
+# FZKai-Z03
+Name: FZKTK--GBK1-0
+Class: GB
+Provides(55): STKaiti-Regular
+TTFname: FZKTK.TTF
+
+# FZFangSong-Z02
+Name: FZFSK--GBK1-0
+Class: GB
+Provides(55): STFangsong-Light
+Provides(55): STFangsong-Regular
+TTFname: FZFSK.TTF
+
+# FZXingKai-S04
+Name: FZXKK--GBK1-0
+Class: GB
+TTFname: FZXKK.TTF
+
+# FZWeiBei-S03
+Name: FZWBK--GBK1-0
+Class: GB
+TTFname: FZWBK.TTF
+
+# FZChaoCuHei-M10
+Name: FZCCHK--GBK1-0
+Class: GB
+TTFname: FZCCHK.TTF
+
+# FZLiShu-S01
+Name: FZLSK--GBK1-0
+Class: GB
+TTFname: FZLSK.TTF
+
+# FZYaoTi-M06
+Name: FZYTK--GBK1-0
+Class: GB
+TTFname: FZYTK.TTF
+
+# FZSongS-Extended
+Name: FZSONGS--GB1-5
+Class: GB
+TTFname: FZSongS_20100603.TTF
+
+# FZSongS-Extended(SIP)
+Name: FZSONGS_SIP--GB1-5
+Class: GB
+TTFname: FZSongS(SIP)_2010603.TTF
+
+# Lantinghei SC Demibold
+Name: FZLTZHK--GBK1-0
+Class: GB
+TTCname: Lantinghei.ttc(0)
+
+# Lantinghei SC Extralight
+Name: FZLTXHK--GBK1-0
+Class: GB
+TTCname: Lantinghei.ttc(1)
+
+# Lantinghei SC Heavy
+Name: FZLTTHK--GBK1-0
+Class: GB
+TTCname: Lantinghei.ttc(2)
+
+# Lantinghei TC Demibold
+Name: FZLTZHB--B51-0
+Class: CNS
+TTCname: Lantinghei.ttc(3)
+
+# Lantinghei TC Extralight
+Name: FZLTXHB--B51-0
+Class: CNS
+TTCname: Lantinghei.ttc(4)
+
+# Lantinghei TC Heavy
+Name: FZLTTHB--B51-0
+Class: CNS
+TTCname: Lantinghei.ttc(5)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-hancom.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-hancom.dat
new file mode 100644
index 0000000000..9f1609cde8
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-hancom.dat
@@ -0,0 +1,26 @@
+# Hancom HCR (free)
+
+# Note:
+# HAN*.ttf (4 files)
+# are available from Hancom Office website for free.
+
+### KOREAN ###
+
+# note that all fonts have narrow metrics
+
+Name: HCRBatang
+Class: Korea
+TTFname: HANBatang.ttf
+
+Name: HCRBatang-Bold
+Class: Korea
+TTFname: HANBatangB.ttf
+
+Name: HCRDotum
+Class: Korea
+TTFname: HANDotum.ttf
+
+Name: HCRDotum-Bold
+Class: Korea
+TTFname: HANDotumB.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-heisei.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-heisei.dat
new file mode 100644
index 0000000000..9c092f4c90
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-heisei.dat
@@ -0,0 +1,54 @@
+# Heisei (Adobe)
+
+### JAPANESE ###
+
+Name: HeiseiMinStd-W3
+Class: Japan
+OTFname(20): Heisei Mincho Std W3.otf # ?
+OTFname(10): HeiseiMinStd-W3.otf
+
+Name: HeiseiMinStd-W5
+Class: Japan
+OTFname(20): Heisei Mincho Std W5.otf # ?
+OTFname(10): HeiseiMinStd-W5.otf
+
+Name: HeiseiMinStd-W7
+Class: Japan
+OTFname(20): Heisei Mincho Std W7.otf # ?
+OTFname(10): HeiseiMinStd-W7.otf
+
+Name: HeiseiMinStd-W9
+Class: Japan
+OTFname(20): Heisei Mincho Std W9.otf # ?
+OTFname(10): HeiseiMinStd-W9.otf
+
+Name: HeiseiKakuGoStd-W3
+Class: Japan
+OTFname(20): Heisei Kaku Gothic Std W3.otf # ?
+OTFname(10): HeiseiKakuGoStd-W3.otf
+
+Name: HeiseiKakuGoStd-W5
+Class: Japan
+OTFname(20): Heisei Kaku Gothic Std W5.otf # ?
+OTFname(10): HeiseiKakuGoStd-W5.otf
+
+Name: HeiseiKakuGoStd-W7
+Class: Japan
+OTFname(20): Heisei Kaku Gothic Std W7.otf # ?
+OTFname(10): HeiseiKakuGoStd-W7.otf
+
+Name: HeiseiKakuGoStd-W9
+Class: Japan
+OTFname(20): Heisei Kaku Gothic Std W9.otf # ?
+OTFname(10): HeiseiKakuGoStd-W9.otf
+
+Name: HeiseiMaruGoStd-W4
+Class: Japan
+OTFname(20): Heisei Maru Gothic Std W4.otf # ?
+OTFname(10): HeiseiMaruGoStd-W4.otf
+
+Name: HeiseiMaruGoStd-W8
+Class: Japan
+OTFname(20): Heisei Maru Gothic Std W8.otf # ?
+OTFname(10): HeiseiMaruGoStd-W8.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-hiragino.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-hiragino.dat
new file mode 100644
index 0000000000..94b4a07e69
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-hiragino.dat
@@ -0,0 +1,160 @@
+# Hiragino
+
+### JAPANESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# ヒラギノ角ゴ {Pro,ProN} {W3,W6}.otf
+# ヒラギノ角ゴ {Std,StdN} W8.otf
+# ヒラギノ丸ゴ {Pro,ProN} W4.otf
+# ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ {Pro,ProN} {W3,W6}.otf
+# are bundled with OS X 10.10.5 Yosemite or earlier versions.
+# ヒラギノ角ゴシック {W0,...W9}.ttc
+# ヒラギノ丸ゴ ProN W4.ttc
+# are bundled with OS X 10.11 El Capitan or later versions.
+# ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN {W3,W6}.ttc
+# are bundled with OS X 10.11 El Capitan -- macOS 10.12.6 Sierra.
+# ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc
+# is bundled with macOS 10.13 High Sierra or later versions.
+
+Name: HiraMinProN-W3
+Class: Japan
+Provides(30): Ryumin-Light
+Provides(30): RyuminPro-Light
+# the following two are *not* the same
+# one is in decomposed form (for Mac), one is in composed form (for the rest)
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W3.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W3.otf
+OTFname(10): HiraMinProN-W3.otf
+
+Name: HiraMinProN-W6
+Class: Japan
+Provides(30): FutoMinA101-Bold
+Provides(30): FutoMinA101Pro-Bold
+Provides(30): MidashiMin-MA31
+Provides(30): MidashiMinPro-MA31
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W6.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W6.otf
+OTFname(10): HiraMinProN-W6.otf
+
+Name: HiraKakuProN-W3
+Class: Japan
+Provides(30): GothicBBB-Medium
+Provides(30): GothicBBBPro-Medium
+OTFname(20): ヒラギノ角ゴ ProN W3.otf
+OTFname(19): ヒラギノ角ゴ ProN W3.otf
+OTFname(10): HiraKakuProN-W3.otf
+
+Name: HiraKakuProN-W6
+Class: Japan
+Provides(30): FutoGoB101-Bold
+Provides(30): FutoGoB101Pro-Bold
+OTFname(20): ヒラギノ角ゴ ProN W6.otf
+OTFname(19): ヒラギノ角ゴ ProN W6.otf
+OTFname(10): HiraKakuProN-W6.otf
+
+Name: HiraKakuStdN-W8
+Class: Japan
+Provides(30): MidashiGo-MB31
+Provides(30): MidashiGoPro-MB31
+OTFname(20): ヒラギノ角ゴ StdN W8.otf
+OTFname(19): ヒラギノ角ゴ StdN W8.otf
+OTFname(10): HiraKakuStdN-W8.otf
+
+Name: HiraMaruProN-W4
+Class: Japan
+Provides(30): Jun101-Light
+Provides(30): Jun101Pro-Light
+OTFname(20): ヒラギノ丸ゴ ProN W4.otf
+OTFname(19): ヒラギノ丸ゴ ProN W4.otf
+OTFname(10): HiraMaruProN-W4.otf
+
+Name: HiraMinPro-W3
+Class: Japan
+Provides(40): Ryumin-Light
+Provides(40): RyuminPro-Light
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ Pro W3.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ Pro W3.otf
+OTFname(10): HiraMinPro-W3.otf
+
+Name: HiraMinPro-W6
+Class: Japan
+Provides(40): FutoMinA101-Bold
+Provides(40): FutoMinA101Pro-Bold
+Provides(40): MidashiMin-MA31
+Provides(40): MidashiMinPro-MA31
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ Pro W6.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ Pro W6.otf
+OTFname(10): HiraMinPro-W6.otf
+
+Name: HiraKakuPro-W3
+Class: Japan
+Provides(40): GothicBBB-Medium
+Provides(40): GothicBBBPro-Medium
+OTFname(20): ヒラギノ角ゴ Pro W3.otf
+OTFname(19): ヒラギノ角ゴ Pro W3.otf
+OTFname(10): HiraKakuPro-W3.otf
+
+Name: HiraKakuPro-W6
+Class: Japan
+Provides(40): FutoGoB101-Bold
+Provides(40): FutoGoB101Pro-Bold
+OTFname(20): ヒラギノ角ゴ Pro W6.otf
+OTFname(19): ヒラギノ角ゴ Pro W6.otf
+OTFname(10): HiraKakuPro-W6.otf
+
+Name: HiraKakuStd-W8
+Class: Japan
+Provides(40): MidashiGo-MB31
+Provides(40): MidashiGoPro-MB31
+OTFname(20): ヒラギノ角ゴ Std W8.otf
+OTFname(19): ヒラギノ角ゴ Std W8.otf
+OTFname(10): HiraKakuStd-W8.otf
+
+Name: HiraMaruPro-W4
+Class: Japan
+Provides(40): Jun101-Light
+Provides(40): Jun101Pro-Light
+OTFname(20): ヒラギノ丸ゴ Pro W4.otf
+OTFname(19): ヒラギノ丸ゴ Pro W4.otf
+OTFname(10): HiraMaruPro-W4.otf
+
+# Following Hiragino fonts are not bundled with OS X,
+# but used in ptex-fontmaps
+
+Name: HiraMinProN-W2
+Class: Japan
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W2.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W2.otf
+OTFname(10): HiraMinProN-W2.otf
+
+Name: HiraMinPro-W2
+Class: Japan
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ Pro W2.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ Pro W2.otf
+OTFname(10): HiraMinPro-W2.otf
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Note about Mac OS X:
+# Hiragino Sans GB {W3,W6}.otf
+# are bundled with OS X 10.10.5 Yosemite or earlier versions.
+# Hiragino Sans GB {W3,W6}.ttc
+# are bundled with OS X 10.11 El Capitan -- macOS 10.12.6 Sierra.
+# Hiragino Sans CNS.ttc
+# is bundled with macOS 10.12 Sierra -- macOS 10.12.6 Sierra.
+# Hiragino Sans GB.ttc
+# Hiragino_Sans_CNS.ttc
+# are bundled with macOS 10.13 High Sierra or later versions.
+
+Name: HiraginoSansGB-W3
+Class: GB
+Provides(50): STHeiti-Light
+OTFname(20): Hiragino Sans GB W3.otf
+OTFname(10): HiraginoSansGB-W3.otf
+
+Name: HiraginoSansGB-W6
+Class: GB
+Provides(50): STHeiti-Regular
+OTFname(20): Hiragino Sans GB W6.otf
+OTFname(10): HiraginoSansGB-W6.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-ipa.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ipa.dat
new file mode 100644
index 0000000000..132fe33c7f
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ipa.dat
@@ -0,0 +1,103 @@
+# IPA (free)
+
+### JAPANESE ###
+
+# Note about TeX Live:
+# ipam.ttf
+# ipag.ttf
+# ipaexm.ttf
+# ipaexg.ttf
+# ipapm.ttf
+# ipapg.ttf
+# are available as "ipaex" package for free.
+
+Name: IPAMincho
+Class: Japan
+Provides(130): Ryumin-Light
+Provides(130): RyuminPro-Light
+Provides(130): HiraMinProN-W3
+Provides(130): HiraMinPro-W3
+Provides(130): FutoMinA101-Bold
+Provides(130): FutoMinA101Pro-Bold
+Provides(130): HiraMinProN-W6
+Provides(130): HiraMinPro-W6
+Provides(130): MidashiMin-MA31
+Provides(130): MidashiMinPro-MA31
+TTFname(20): ipam.ttf
+#TTFname(21): IPAMincho.ttf
+
+Name: IPAGothic
+Class: Japan
+Provides(130): GothicBBB-Medium
+Provides(130): GothicBBBPro-Medium
+Provides(130): HiraKakuProN-W3
+Provides(130): HiraKakuPro-W3
+Provides(130): FutoGoB101-Bold
+Provides(130): FutoGoB101Pro-Bold
+Provides(130): HiraKakuProN-W6
+Provides(130): HiraKakuPro-W6
+Provides(130): MidashiGo-MB31
+Provides(130): MidashiGoPro-MB31
+Provides(130): HiraKakuStdN-W8
+Provides(130): HiraKakuStd-W8
+Provides(130): Jun101-Light
+Provides(130): Jun101Pro-Light
+Provides(130): HiraMaruProN-W4
+Provides(130): HiraMaruPro-W4
+TTFname(20): ipag.ttf
+#TTFname(21): IPAGothic.ttf
+
+Name: IPAexMincho
+Class: Japan
+Provides(120): Ryumin-Light
+Provides(120): RyuminPro-Light
+Provides(120): HiraMinProN-W3
+Provides(120): HiraMinPro-W3
+Provides(120): FutoMinA101-Bold
+Provides(120): FutoMinA101Pro-Bold
+Provides(120): HiraMinProN-W6
+Provides(120): HiraMinPro-W6
+Provides(120): MidashiMin-MA31
+Provides(120): MidashiMinPro-MA31
+TTFname(20): ipaexm.ttf
+#TTFname(21): IPAexMincho.ttf
+
+Name: IPAexGothic
+Class: Japan
+Provides(120): GothicBBB-Medium
+Provides(120): GothicBBBPro-Medium
+Provides(120): HiraKakuProN-W3
+Provides(120): HiraKakuPro-W3
+Provides(120): FutoGoB101-Bold
+Provides(120): FutoGoB101Pro-Bold
+Provides(120): HiraKakuProN-W6
+Provides(120): HiraKakuPro-W6
+Provides(120): MidashiGo-MB31
+Provides(120): MidashiGoPro-MB31
+Provides(120): HiraKakuStdN-W8
+Provides(120): HiraKakuStd-W8
+Provides(120): Jun101-Light
+Provides(120): Jun101Pro-Light
+Provides(120): HiraMaruProN-W4
+Provides(120): HiraMaruPro-W4
+TTFname(20): ipaexg.ttf
+#TTFname(21): IPAexGothic.ttf
+
+# IPA proportional (free)
+
+Name: IPAPMincho
+Class: Japan
+TTFname(20): ipamp.ttf
+#TTFname(21): IPAPMincho.ttf
+
+Name: IPAPGothic
+Class: Japan
+TTFname(20): ipagp.ttf
+#TTFname(21): IPAPGothic.ttf
+
+# IPA MJ (free)
+
+Name: IPAmjMincho
+Class: Japan
+TTFname: ipamjm.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-kozuka.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-kozuka.dat
new file mode 100644
index 0000000000..f9fb1a44dd
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-kozuka.dat
@@ -0,0 +1,302 @@
+# Kozuka (Adobe)
+
+### JAPANESE ###
+
+# Some of the {Pr6N,ProVI,Pro} variants are used in ptex-fontmaps.
+
+Name: KozMinPr6N-ExtraLight
+Class: Japan
+OTFname: KozMinPr6N-ExtraLight.otf
+
+Name: KozMinPr6N-Light
+Class: Japan
+OTFname: KozMinPr6N-Light.otf
+
+Name: KozMinPr6N-Regular
+Class: Japan
+Provides(50): Ryumin-Light
+Provides(50): RyuminPro-Light
+Provides(50): HiraMinProN-W3
+Provides(50): HiraMinPro-W3
+OTFname: KozMinPr6N-Regular.otf
+
+Name: KozMinPr6N-Medium
+Class: Japan
+OTFname: KozMinPr6N-Medium.otf
+
+Name: KozMinPr6N-Bold
+Class: Japan
+Provides(50): FutoMinA101-Bold
+Provides(50): FutoMinA101Pro-Bold
+Provides(50): HiraMinProN-W6
+Provides(50): HiraMinPro-W6
+OTFname: KozMinPr6N-Bold.otf
+
+Name: KozMinPr6N-Heavy
+Class: Japan
+Provides(50): MidashiMin-MA31
+Provides(50): MidashiMinPro-MA31
+OTFname: KozMinPr6N-Heavy.otf
+
+Name: KozMinProVI-ExtraLight
+Class: Japan
+OTFname: KozMinProVI-ExtraLight.otf
+
+Name: KozMinProVI-Light
+Class: Japan
+OTFname: KozMinProVI-Light.otf
+
+Name: KozMinProVI-Regular
+Class: Japan
+Provides(55): Ryumin-Light
+Provides(55): RyuminPro-Light
+Provides(55): HiraMinProN-W3
+Provides(55): HiraMinPro-W3
+OTFname: KozMinProVI-Regular.otf
+
+Name: KozMinProVI-Medium
+Class: Japan
+OTFname: KozMinProVI-Medium.otf
+
+Name: KozMinProVI-Bold
+Class: Japan
+Provides(55): FutoMinA101-Bold
+Provides(55): FutoMinA101Pro-Bold
+Provides(55): HiraMinProN-W6
+Provides(55): HiraMinPro-W6
+OTFname: KozMinProVI-Bold.otf
+
+Name: KozMinProVI-Heavy
+Class: Japan
+Provides(55): MidashiMin-MA31
+Provides(55): MidashiMinPro-MA31
+OTFname: KozMinProVI-Heavy.otf
+
+Name: KozMinPro-ExtraLight
+Class: Japan
+OTFname: KozMinPro-ExtraLight.otf
+
+Name: KozMinPro-Light
+Class: Japan
+OTFname: KozMinPro-Light.otf
+
+Name: KozMinPro-Regular
+Class: Japan
+Provides(60): Ryumin-Light
+Provides(60): RyuminPro-Light
+Provides(60): HiraMinProN-W3
+Provides(60): HiraMinPro-W3
+OTFname: KozMinPro-Regular.otf
+
+Name: KozMinPro-Medium
+Class: Japan
+OTFname: KozMinPro-Medium.otf
+
+Name: KozMinPro-Bold
+Class: Japan
+Provides(60): FutoMinA101-Bold
+Provides(60): FutoMinA101Pro-Bold
+Provides(60): HiraMinProN-W6
+Provides(60): HiraMinPro-W6
+OTFname: KozMinPro-Bold.otf
+
+Name: KozMinPro-Heavy
+Class: Japan
+Provides(60): MidashiMin-MA31
+Provides(60): MidashiMinPro-MA31
+OTFname: KozMinPro-Heavy.otf
+
+Name: KozMinStd-ExtraLight
+Class: Japan
+OTFname: KozMinStd-ExtraLight.otf
+
+Name: KozMinStd-Light
+Class: Japan
+OTFname: KozMinStd-Light.otf
+
+Name: KozMinStd-Regular
+Class: Japan
+Provides(65): Ryumin-Light
+Provides(65): RyuminPro-Light
+Provides(65): HiraMinProN-W3
+Provides(65): HiraMinPro-W3
+OTFname: KozMinStd-Regular.otf
+
+Name: KozMinStd-Medium
+Class: Japan
+OTFname: KozMinStd-Medium.otf
+
+Name: KozMinStd-Bold
+Class: Japan
+Provides(65): FutoMinA101-Bold
+Provides(65): FutoMinA101Pro-Bold
+Provides(65): HiraMinProN-W6
+Provides(65): HiraMinPro-W6
+OTFname: KozMinStd-Bold.otf
+
+Name: KozMinStd-Heavy
+Class: Japan
+Provides(65): MidashiMin-MA31
+Provides(65): MidashiMinPro-MA31
+OTFname: KozMinStd-Heavy.otf
+
+Name: KozGoPr6N-ExtraLight
+Class: Japan
+OTFname: KozGoPr6N-ExtraLight.otf
+
+Name: KozGoPr6N-Light
+Class: Japan
+OTFname: KozGoPr6N-Light.otf
+
+Name: KozGoPr6N-Regular
+Class: Japan
+OTFname: KozGoPr6N-Regular.otf
+
+Name: KozGoPr6N-Medium
+Class: Japan
+Provides(50): GothicBBB-Medium
+Provides(50): GothicBBBPro-Medium
+Provides(50): HiraKakuProN-W3
+Provides(50): HiraKakuPro-W3
+OTFname: KozGoPr6N-Medium.otf
+
+Name: KozGoPr6N-Bold
+Class: Japan
+Provides(50): FutoGoB101-Bold
+Provides(50): FutoGoB101Pro-Bold
+Provides(50): HiraKakuProN-W6
+Provides(50): HiraKakuPro-W6
+OTFname: KozGoPr6N-Bold.otf
+
+Name: KozGoPr6N-Heavy
+Class: Japan
+Provides(50): MidashiGo-MB31
+Provides(50): MidashiGoPro-MB31
+Provides(50): HiraKakuStdN-W8
+Provides(50): HiraKakuStd-W8
+Provides(50): Jun101-Light
+Provides(50): Jun101Pro-Light
+Provides(50): HiraMaruProN-W4
+Provides(50): HiraMaruPro-W4
+OTFname: KozGoPr6N-Heavy.otf
+
+Name: KozGoProVI-ExtraLight
+Class: Japan
+OTFname: KozGoProVI-ExtraLight.otf
+
+Name: KozGoProVI-Light
+Class: Japan
+OTFname: KozGoProVI-Light.otf
+
+Name: KozGoProVI-Regular
+Class: Japan
+OTFname: KozGoProVI-Regular.otf
+
+Name: KozGoProVI-Medium
+Class: Japan
+Provides(55): GothicBBB-Medium
+Provides(55): GothicBBBPro-Medium
+Provides(55): HiraKakuProN-W3
+Provides(55): HiraKakuPro-W3
+OTFname: KozGoProVI-Medium.otf
+
+Name: KozGoProVI-Bold
+Class: Japan
+Provides(55): FutoGoB101-Bold
+Provides(55): FutoGoB101Pro-Bold
+Provides(55): HiraKakuProN-W6
+Provides(55): HiraKakuPro-W6
+OTFname: KozGoProVI-Bold.otf
+
+Name: KozGoProVI-Heavy
+Class: Japan
+Provides(55): MidashiGo-MB31
+Provides(55): MidashiGoPro-MB31
+Provides(55): HiraKakuStdN-W8
+Provides(55): HiraKakuStd-W8
+Provides(55): Jun101-Light
+Provides(55): Jun101Pro-Light
+Provides(55): HiraMaruProN-W4
+Provides(55): HiraMaruPro-W4
+OTFname: KozGoProVI-Heavy.otf
+
+Name: KozGoPro-ExtraLight
+Class: Japan
+OTFname: KozGoPro-ExtraLight.otf
+
+Name: KozGoPro-Light
+Class: Japan
+OTFname: KozGoPro-Light.otf
+
+Name: KozGoPro-Regular
+Class: Japan
+OTFname: KozGoPro-Regular.otf
+
+Name: KozGoPro-Medium
+Class: Japan
+Provides(60): GothicBBB-Medium
+Provides(60): GothicBBBPro-Medium
+Provides(60): HiraKakuProN-W3
+Provides(60): HiraKakuPro-W3
+OTFname: KozGoPro-Medium.otf
+
+Name: KozGoPro-Bold
+Class: Japan
+Provides(60): FutoGoB101-Bold
+Provides(60): FutoGoB101Pro-Bold
+Provides(60): HiraKakuProN-W6
+Provides(60): HiraKakuPro-W6
+OTFname: KozGoPro-Bold.otf
+
+Name: KozGoPro-Heavy
+Class: Japan
+Provides(60): MidashiGo-MB31
+Provides(60): MidashiGoPro-MB31
+Provides(60): HiraKakuStdN-W8
+Provides(60): HiraKakuStd-W8
+Provides(60): Jun101-Light
+Provides(60): Jun101Pro-Light
+Provides(60): HiraMaruProN-W4
+Provides(60): HiraMaruPro-W4
+OTFname: KozGoPro-Heavy.otf
+
+Name: KozGoStd-ExtraLight
+Class: Japan
+OTFname: KozGoStd-ExtraLight.otf
+
+Name: KozGoStd-Light
+Class: Japan
+OTFname: KozGoStd-Light.otf
+
+Name: KozGoStd-Regular
+Class: Japan
+OTFname: KozGoStd-Regular.otf
+
+Name: KozGoStd-Medium
+Class: Japan
+Provides(65): GothicBBB-Medium
+Provides(65): GothicBBBPro-Medium
+Provides(65): HiraKakuProN-W3
+Provides(65): HiraKakuPro-W3
+OTFname: KozGoStd-Medium.otf
+
+Name: KozGoStd-Bold
+Class: Japan
+Provides(65): FutoGoB101-Bold
+Provides(65): FutoGoB101Pro-Bold
+Provides(65): HiraKakuProN-W6
+Provides(65): HiraKakuPro-W6
+OTFname: KozGoStd-Bold.otf
+
+Name: KozGoStd-Heavy
+Class: Japan
+Provides(65): MidashiGo-MB31
+Provides(65): MidashiGoPro-MB31
+Provides(65): HiraKakuStdN-W8
+Provides(65): HiraKakuStd-W8
+Provides(65): Jun101-Light
+Provides(65): Jun101Pro-Light
+Provides(65): HiraMaruProN-W4
+Provides(65): HiraMaruPro-W4
+OTFname: KozGoStd-Heavy.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-macos-removeonly.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-macos-removeonly.dat
new file mode 100644
index 0000000000..ce9ff48eb2
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-macos-removeonly.dat
@@ -0,0 +1,582 @@
+# Remove-only database for Mac OS
+
+### JAPANESE ###
+
+# Hiragino
+
+Name: HiraMinProN-W3
+Class: Japan
+Provides(30): Ryumin-Light
+Provides(30): RyuminPro-Light
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W3.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W3.otf
+OTFname(10): HiraMinProN-W3.otf
+RMVname(30): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W3.ttc(0)
+RMVname(29): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W3.ttc(0)
+RMVname(28): HiraginoSerif-W3.ttc(0)
+RMVname(40): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN.ttc(0)
+RMVname(39): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc(0)
+RMVname(38): HiraginoSerif.ttc(0)
+
+Name: HiraMinProN-W6
+Class: Japan
+Provides(30): FutoMinA101-Bold
+Provides(30): FutoMinA101Pro-Bold
+Provides(30): MidashiMin-MA31
+Provides(30): MidashiMinPro-MA31
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W6.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W6.otf
+OTFname(10): HiraMinProN-W6.otf
+RMVname(30): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W6.ttc(0)
+RMVname(29): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W6.ttc(0)
+RMVname(28): HiraginoSerif-W6.ttc(0)
+RMVname(40): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN.ttc(2)
+RMVname(39): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc(2)
+RMVname(38): HiraginoSerif.ttc(2)
+
+Name: HiraKakuProN-W3
+Class: Japan
+Provides(30): GothicBBB-Medium
+Provides(30): GothicBBBPro-Medium
+OTFname(20): ヒラギノ角ゴ ProN W3.otf
+OTFname(19): ヒラギノ角ゴ ProN W3.otf
+OTFname(10): HiraKakuProN-W3.otf
+RMVname(30): ヒラギノ角ゴシック W3.ttc(2)
+RMVname(29): ヒラギノ角ゴシック W3.ttc(2)
+RMVname(28): HiraginoSans-W3.ttc(2)
+
+Name: HiraKakuProN-W6
+Class: Japan
+Provides(30): FutoGoB101-Bold
+Provides(30): FutoGoB101Pro-Bold
+OTFname(20): ヒラギノ角ゴ ProN W6.otf
+OTFname(19): ヒラギノ角ゴ ProN W6.otf
+OTFname(10): HiraKakuProN-W6.otf
+RMVname(30): ヒラギノ角ゴシック W6.ttc(2)
+RMVname(29): ヒラギノ角ゴシック W6.ttc(2)
+RMVname(28): HiraginoSans-W6.ttc(2)
+
+Name: HiraKakuStdN-W8
+Class: Japan
+Provides(30): MidashiGo-MB31
+Provides(30): MidashiGoPro-MB31
+OTFname(20): ヒラギノ角ゴ StdN W8.otf
+OTFname(19): ヒラギノ角ゴ StdN W8.otf
+OTFname(10): HiraKakuStdN-W8.otf
+RMVname(30): ヒラギノ角ゴシック W8.ttc(3)
+RMVname(29): ヒラギノ角ゴシック W8.ttc(3)
+RMVname(28): HiraginoSans-W8.ttc(3)
+
+Name: HiraMaruProN-W4
+Class: Japan
+Provides(30): Jun101-Light
+Provides(30): Jun101Pro-Light
+OTFname(20): ヒラギノ丸ゴ ProN W4.otf
+OTFname(19): ヒラギノ丸ゴ ProN W4.otf
+OTFname(10): HiraMaruProN-W4.otf
+RMVname(30): ヒラギノ丸ゴ ProN W4.ttc(1)
+RMVname(29): ヒラギノ丸ゴ ProN W4.ttc(1)
+RMVname(28): HiraginoSansR-W4.ttc(1)
+
+Name: HiraMinPro-W3
+Class: Japan
+Provides(40): Ryumin-Light
+Provides(40): RyuminPro-Light
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ Pro W3.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ Pro W3.otf
+OTFname(10): HiraMinPro-W3.otf
+RMVname(30): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W3.ttc(1)
+RMVname(29): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W3.ttc(1)
+RMVname(28): HiraginoSerif-W3.ttc(1)
+RMVname(40): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN.ttc(1)
+RMVname(39): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc(1)
+RMVname(38): HiraginoSerif.ttc(1)
+
+Name: HiraMinPro-W6
+Class: Japan
+Provides(40): FutoMinA101-Bold
+Provides(40): FutoMinA101Pro-Bold
+Provides(40): MidashiMin-MA31
+Provides(40): MidashiMinPro-MA31
+OTFname(20): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ Pro W6.otf
+OTFname(19): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ Pro W6.otf
+OTFname(10): HiraMinPro-W6.otf
+RMVname(30): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN W6.ttc(1)
+RMVname(29): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN W6.ttc(1)
+RMVname(28): HiraginoSerif-W6.ttc(1)
+RMVname(40): ãƒ’ãƒ©ã‚®ãƒŽæ˜Žæœ ProN.ttc(3)
+RMVname(39): ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc(3)
+RMVname(38): HiraginoSerif.ttc(3)
+
+Name: HiraKakuPro-W3
+Class: Japan
+Provides(40): GothicBBB-Medium
+Provides(40): GothicBBBPro-Medium
+OTFname(20): ヒラギノ角ゴ Pro W3.otf
+OTFname(19): ヒラギノ角ゴ Pro W3.otf
+OTFname(10): HiraKakuPro-W3.otf
+RMVname(30): ヒラギノ角ゴシック W3.ttc(3)
+RMVname(29): ヒラギノ角ゴシック W3.ttc(3)
+RMVname(28): HiraginoSans-W3.ttc(3)
+
+Name: HiraKakuPro-W6
+Class: Japan
+Provides(40): FutoGoB101-Bold
+Provides(40): FutoGoB101Pro-Bold
+OTFname(20): ヒラギノ角ゴ Pro W6.otf
+OTFname(19): ヒラギノ角ゴ Pro W6.otf
+OTFname(10): HiraKakuPro-W6.otf
+RMVname(30): ヒラギノ角ゴシック W6.ttc(3)
+RMVname(29): ヒラギノ角ゴシック W6.ttc(3)
+RMVname(28): HiraginoSans-W6.ttc(3)
+
+Name: HiraKakuStd-W8
+Class: Japan
+Provides(40): MidashiGo-MB31
+Provides(40): MidashiGoPro-MB31
+OTFname(20): ヒラギノ角ゴ Std W8.otf
+OTFname(19): ヒラギノ角ゴ Std W8.otf
+OTFname(10): HiraKakuStd-W8.otf
+RMVname(30): ヒラギノ角ゴシック W8.ttc(2)
+RMVname(29): ヒラギノ角ゴシック W8.ttc(2)
+RMVname(28): HiraginoSans-W8.ttc(2)
+
+Name: HiraMaruPro-W4
+Class: Japan
+Provides(40): Jun101-Light
+Provides(40): Jun101Pro-Light
+OTFname(20): ヒラギノ丸ゴ Pro W4.otf
+OTFname(19): ヒラギノ丸ゴ Pro W4.otf
+OTFname(10): HiraMaruPro-W4.otf
+RMVname(30): ヒラギノ丸ゴ ProN W4.ttc(0)
+RMVname(29): ヒラギノ丸ゴ ProN W4.ttc(0)
+RMVname(28): HiraginoSansR-W4.ttc(0)
+
+Name: HiraginoSans-W0
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W0.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W0.ttc(0)
+RMVname(28): HiraginoSans-W0.ttc(0)
+
+Name: HiraginoSans-W1
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W1.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W1.ttc(0)
+RMVname(28): HiraginoSans-W1.ttc(0)
+
+Name: HiraginoSans-W2
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W2.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W2.ttc(0)
+RMVname(28): HiraginoSans-W2.ttc(0)
+
+Name: HiraginoSans-W3
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W3.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W3.ttc(0)
+RMVname(28): HiraginoSans-W3.ttc(0)
+
+Name: HiraginoSans-W4
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W4.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W4.ttc(0)
+RMVname(28): HiraginoSans-W4.ttc(0)
+
+Name: HiraginoSans-W5
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W5.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W5.ttc(0)
+RMVname(28): HiraginoSans-W5.ttc(0)
+
+Name: HiraginoSans-W6
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W6.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W6.ttc(0)
+RMVname(28): HiraginoSans-W6.ttc(0)
+
+Name: HiraginoSans-W7
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W7.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W7.ttc(0)
+RMVname(28): HiraginoSans-W7.ttc(0)
+
+Name: HiraginoSans-W8
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W8.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W8.ttc(0)
+RMVname(28): HiraginoSans-W8.ttc(0)
+
+Name: HiraginoSans-W9
+Class: Japan
+RMVname(30): ヒラギノ角ゴシック W9.ttc(0)
+RMVname(29): ヒラギノ角ゴシック W9.ttc(0)
+RMVname(28): HiraginoSans-W9.ttc(0)
+
+# Yu-fonts MacOS version
+
+Name: YuMin-Medium
+Class: Japan
+Provides(80): Ryumin-Light
+Provides(80): RyuminPro-Light
+Provides(80): HiraMinProN-W3
+Provides(80): HiraMinPro-W3
+OTFname(20): Yu Mincho Medium.otf
+OTFname(10): YuMin-Medium.otf
+RMVname(30): YuMincho.ttc(0)
+
+Name: YuMin-Demibold
+Class: Japan
+Provides(80): FutoMinA101-Bold
+Provides(80): FutoMinA101Pro-Bold
+Provides(80): HiraMinProN-W6
+Provides(80): HiraMinPro-W6
+Provides(80): MidashiMin-MA31
+Provides(80): MidashiMinPro-MA31
+OTFname(20): Yu Mincho Demibold.otf
+OTFname(10): YuMin-Demibold.otf
+RMVname(30): YuMincho.ttc(1)
+
+Name: YuMin-Extrabold
+Class: Japan
+RMVname(30): YuMincho.ttc(2)
+
+Name: YuMin_36pKn-Medium
+Class: Japan
+RMVname(30): YuMincho.ttc(3)
+
+Name: YuMin_36pKn-Demibold
+Class: Japan
+RMVname(30): YuMincho.ttc(4)
+
+Name: YuMin_36pKn-Extrabold
+Class: Japan
+RMVname(30): YuMincho.ttc(5)
+
+Name: YuKyo_Yoko-Medium
+Class: Japan
+RMVname: Kyokasho.ttc(0)
+
+Name: YuKyo_Yoko-Bold
+Class: Japan
+RMVname: Kyokasho.ttc(1)
+
+Name: YuKyo-Medium
+Class: Japan
+RMVname: Kyokasho.ttc(2)
+
+Name: YuKyo-Bold
+Class: Japan
+RMVname: Kyokasho.ttc(3)
+
+# Fontworks MacOS version
+
+Name: Klee-Medium
+Class: Japan
+RMVname: Klee.ttc(1)
+
+Name: Klee-Demibold
+Class: Japan
+RMVname: Klee.ttc(0)
+
+Name: TsukuARdGothic-Regular
+Class: Japan
+RMVname: TsukushiAMaruGothic.ttc(0)
+
+Name: TsukuARdGothic-Bold
+Class: Japan
+RMVname: TsukushiAMaruGothic.ttc(1)
+
+Name: TsukuBRdGothic-Regular
+Class: Japan
+RMVname: TsukushiBMaruGothic.ttc(0)
+
+Name: TsukuBRdGothic-Bold
+Class: Japan
+RMVname: TsukushiBMaruGothic.ttc(1)
+
+# Toppan MacOS version
+
+Name: ToppanBunkyuMincho-Regular
+PSName: ToppanBunkyuMinchoPr6N-Regular
+Class: Japan
+RMVname(20): ToppanBunkyuMincho-Regular.otf
+
+#Name: ToppanBunkyuMinchoPr6N-Regular
+#Class: Japan
+#RMVname(10): ToppanBunkyuMinchoPr6N-Regular.otf
+
+Name: ToppanBunkyuGothicPr6N-DB
+Class: Japan
+RMVname(20): ToppanBunkyuGothic.ttc(0)
+RMVname(10): ToppanBunkyuGothicPr6N.ttc(0)
+
+Name: ToppanBunkyuGothicPr6N-Regular
+Class: Japan
+RMVname(20): ToppanBunkyuGothic.ttc(1)
+RMVname(10): ToppanBunkyuGothicPr6N.ttc(1)
+
+Name: ToppanBunkyuMidashiMincho-ExtraBold
+PSName: ToppanBunkyuMidashiMinchoStdN-ExtraBold
+Class: Japan
+RMVname(20): ToppanBunkyuMidashiMincho-ExtraBold.otf
+
+#Name: ToppanBunkyuMidashiMinchoStdN-ExtraBold
+#Class: Japan
+#RMVname(10): ToppanBunkyuMidashiMinchoStdN-ExtraBold.otf
+
+Name: ToppanBunkyuMidashiGothic-ExtraBold
+PSName: ToppanBunkyuMidashiGothicStdN-ExtraBold
+Class: Japan
+RMVname(20): ToppanBunkyuMidashiGothic-ExtraBold.otf
+
+#Name: ToppanBunkyuMidashiGothicStdN-ExtraBold
+#Class: Japan
+#RMVname(10): ToppanBunkyuMidashiGothicStdN-ExtraBold.otf
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Hiragino chinese
+
+Name: HiraginoSansGB-W3
+Class: GB
+Provides(50): STHeiti-Light
+OTFname(20): Hiragino Sans GB W3.otf
+OTFname(10): HiraginoSansGB-W3.otf
+RMVname(30): Hiragino Sans GB W3.ttc(0)
+RMVname(28): HiraginoSansGB-W3.ttc(0)
+RMVname(40): Hiragino Sans GB.ttc(0)
+RMVname(38): HiraginoSansGB.ttc(0)
+
+Name: HiraginoSansGB-W6
+Class: GB
+Provides(50): STHeiti-Regular
+OTFname(20): Hiragino Sans GB W6.otf
+OTFname(10): HiraginoSansGB-W6.otf
+RMVname(30): Hiragino Sans GB W6.ttc(0)
+RMVname(28): HiraginoSansGB-W6.ttc(0)
+RMVname(40): Hiragino Sans GB.ttc(2)
+RMVname(38): HiraginoSansGB.ttc(2)
+
+Name: HiraginoSansCNS-W3
+Class: CNS
+RMVname(30): Hiragino Sans CNS.ttc(0)
+RMVname(29): Hiragino_Sans_CNS.ttc(0)
+RMVname(28): HiraginoSansCNS.ttc(0)
+
+Name: HiraginoSansCNS-W6
+Class: CNS
+RMVname(30): Hiragino Sans CNS.ttc(1)
+RMVname(29): Hiragino_Sans_CNS.ttc(1)
+RMVname(28): HiraginoSansCNS.ttc(1)
+
+# Changzhou SinoType
+
+Name: STSong
+Class: GB
+#Provides(??): STSong-Light # fails
+#Provides(??): STSong-Regular # fails
+TTFname(10): STSong.ttf
+TTFname(11): STSONG.TTF
+TTFname(20): åŽæ–‡å®‹ä½“.ttf
+RMVname(30): Songti.ttc(4)
+RMVname(39): Songti-mountainlion.ttc(3)
+RMVname(40): 宋体.ttc(3)
+
+Name: STKaiti
+Class: GB
+#Provides(??): STKaiti-Regular # fails
+TTFname(10): STKaiti.ttf
+TTFname(11): STKAITI.TTF
+TTFname(20): åŽæ–‡æ¥·ä½“.ttf
+RMVname(30): Kaiti.ttc(1)
+RMVname(39): Kaiti-mountainlion.ttc(3)
+RMVname(40): 楷体.ttc(3)
+
+Name: STKaiti-Adobe-CNS1
+Class: CNS
+#Provides(??): MKai-Medium # fails
+TTFname(10): STKaiti.ttf
+TTFname(11): STKAITI.TTF
+TTFname(20): åŽæ–‡æ¥·ä½“.ttf
+RMVname(30): Kaiti.ttc(1)
+RMVname(39): Kaiti-mountainlion.ttc(3)
+RMVname(40): 楷体.ttc(3)
+
+Name: STSongti-SC-Black
+Class: GB
+RMVname(30): Songti.ttc(0)
+RMVname(39): Songti-mountainlion.ttc(0)
+RMVname(40): 宋体.ttc(0)
+
+Name: STSongti-SC-Bold
+Class: GB
+RMVname(30): Songti.ttc(1)
+RMVname(39): Songti-mountainlion.ttc(1)
+RMVname(40): 宋体.ttc(1)
+
+Name: STSongti-TC-Bold
+Class: CNS
+RMVname(30): Songti.ttc(2)
+
+Name: STSongti-SC-Light
+Class: GB
+RMVname(30): Songti.ttc(3)
+RMVname(39): Songti-mountainlion.ttc(2)
+RMVname(40): 宋体.ttc(2)
+
+Name: STSongti-TC-Light
+Class: CNS
+RMVname(30): Songti.ttc(5)
+
+Name: STSongti-SC-Regular
+Class: GB
+RMVname(30): Songti.ttc(6)
+RMVname(39): Songti-mountainlion.ttc(4)
+RMVname(40): 宋体.ttc(4)
+
+Name: STSongti-TC-Regular
+Class: CNS
+RMVname(30): Songti.ttc(7)
+
+Name: STKaitiSC-Regular
+Class: GB
+RMVname(30): Kaiti.ttc(0)
+
+Name: STKaitiTC-Regular
+Class: CNS
+RMVname(30): Kaiti.ttc(2)
+
+Name: STKaitiSC-Bold
+Class: GB
+RMVname(30): Kaiti.ttc(3)
+
+Name: STKaitiTC-Bold
+Class: CNS
+RMVname(30): Kaiti.ttc(4)
+
+Name: STKaitiSC-Black
+Class: GB
+RMVname(30): Kaiti.ttc(5)
+
+Name: STKaitiTC-Black
+Class: CNS
+RMVname(30): Kaiti.ttc(6)
+
+Name: STKaiti-SC-Black
+Class: GB
+RMVname(30): Kaiti.ttc(0)
+RMVname(39): Kaiti-mountainlion.ttc(0)
+RMVname(40): 楷体.ttc(0)
+
+Name: STKaiti-SC-Bold
+Class: GB
+RMVname(30): Kaiti.ttc(1)
+RMVname(39): Kaiti-mountainlion.ttc(1)
+RMVname(40): 楷体.ttc(1)
+
+Name: STKaiTi-TC-Bold
+Class: CNS
+RMVname(30): Kaiti.ttc(2)
+
+Name: STKaiti-SC-Regular
+Class: GB
+RMVname(30): Kaiti.ttc(3)
+RMVname(39): Kaiti-mountainlion.ttc(2)
+RMVname(40): 楷体.ttc(2)
+
+Name: STKaiTi-TC-Regular
+Class: CNS
+RMVname(30): Kaiti.ttc(5)
+
+Name: STBaoliSC-Regular
+Class: GB
+RMVname(30): Baoli.ttc(0)
+
+Name: STBaoliTC-Regular
+Class: CNS
+RMVname(30): Baoli.ttc(1)
+
+Name: STBaoli-SC-Regular
+Class: GB
+RMVname(30): Baoli.ttc(0)
+
+Name: STLibianSC-Regular
+Class: GB
+RMVname(30): Libian.ttc(0)
+
+Name: STLibianTC-Regular
+Class: CNS
+RMVname(30): Libian.ttc(1)
+
+Name: STLibian-SC-Regular
+Class: GB
+RMVname(30): Libian.ttc(0)
+
+Name: STXingkaiSC-Bold
+Class: GB
+RMVname(30): Xingkai.ttc(0)
+
+Name: STXingkaiTC-Bold
+Class: CNS
+RMVname(30): Xingkai.ttc(1)
+
+Name: STXingkaiSC-Light
+Class: GB
+RMVname(30): Xingkai.ttc(2)
+
+Name: STXingkaiTC-Light
+Class: CNS
+RMVname(30): Xingkai.ttc(3)
+
+Name: STXingkai-SC-Bold
+Class: GB
+RMVname(30): Xingkai.ttc(0)
+
+Name: STXingkai-SC-Light
+Class: GB
+RMVname(30): Xingkai.ttc(1)
+
+Name: STYuanti-SC-Bold
+Class: GB
+RMVname(30): Yuanti.ttc(0)
+
+Name: STYuanti-TC-Bold
+Class: CNS
+RMVname(30): Yuanti.ttc(1)
+
+Name: STYuanti-SC-Light
+Class: GB
+RMVname(30): Yuanti.ttc(2)
+
+Name: STYuanti-TC-Light
+Class: CNS
+RMVname(30): Yuanti.ttc(3)
+
+Name: STYuanti-SC-Regular
+Class: GB
+RMVname(30): Yuanti.ttc(4)
+
+Name: STYuanti-TC-Regular
+Class: CNS
+RMVname(30): Yuanti.ttc(5)
+
+# Arphic Technology
+
+Name: WeibeiSC-Bold
+PSName: Weibei-SC-Bold
+Class: GB
+OTFname: WeibeiSC-Bold.otf
+
+#Name: WeibeiSC-Bold
+#Class: GB
+#OTFname: WeibeiSC-Bold.otf
+
+Name: WeibeiTC-Bold
+PSName: Weibei-TC-Bold
+Class: CNS
+OTFname: WeibeiTC-Bold.otf
+
+#Name: WeibeiTC-Bold
+#Class: CNS
+#OTFname: WeibeiTC-Bold.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-microsoft.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-microsoft.dat
new file mode 100644
index 0000000000..19e70596ec
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-microsoft.dat
@@ -0,0 +1,256 @@
+# Microsoft Windows, Windows/Mac Office fonts
+
+### JAPANESE ###
+
+# Note about Windows:
+# MSMINCHO.TTC
+# MSGOTHIC.TTC
+# are bundled with Windows XP.
+# msmincho.ttc
+# msgothic.ttc
+# are bundled with Windows Vista or later versions.
+# meiryo.ttc
+# meiryob.ttc
+# are bundled with Windows Vista or later versions,
+# and "Japanese ClearType fonts for Windows XP".
+
+# Note about MSOffice:
+# MS Mincho.ttf
+# MS Gothic.ttf
+# Meiryo.ttf
+# Meiryo Bold.ttf
+# Meiryo Bold Italic.ttf
+# Meiryo Italic.ttf
+# are bundled with Office for Mac 2011.
+# msmincho.ttc
+# msgothic.ttc
+# Meiryo.ttf
+# MeiryoBold.ttf
+# MeiryoBoldItalic.ttf
+# MeiryoItalic.ttf
+# are bundled with Office for Mac 2016.
+
+# [TODO] Check about HG* fonts, and move Chinese/Korean fonts
+
+Name: MS-Mincho
+Class: Japan
+Provides(95): Ryumin-Light
+Provides(95): RyuminPro-Light
+Provides(95): HiraMinProN-W3
+Provides(95): HiraMinPro-W3
+Provides(95): FutoMinA101-Bold
+Provides(95): FutoMinA101Pro-Bold
+Provides(95): HiraMinProN-W6
+Provides(95): HiraMinPro-W6
+Provides(95): MidashiMin-MA31
+Provides(95): MidashiMinPro-MA31
+TTFname(50): MS Mincho.ttf
+TTFname(30): MS-Mincho.ttf
+TTCname(20): msmincho.ttc(0)
+
+Name: MS-Gothic
+Class: Japan
+Provides(95): GothicBBB-Medium
+Provides(95): GothicBBBPro-Medium
+Provides(95): HiraKakuProN-W3
+Provides(95): HiraKakuPro-W3
+Provides(95): FutoGoB101-Bold
+Provides(95): FutoGoB101Pro-Bold
+Provides(95): HiraKakuProN-W6
+Provides(95): HiraKakuPro-W6
+Provides(95): MidashiGo-MB31
+Provides(95): MidashiGoPro-MB31
+Provides(95): HiraKakuStdN-W8
+Provides(95): HiraKakuStd-W8
+Provides(95): Jun101-Light
+Provides(95): Jun101Pro-Light
+Provides(95): HiraMaruProN-W4
+Provides(95): HiraMaruPro-W4
+TTFname(50): MS Gothic.ttf
+TTFname(30): MS-Gothic.ttf
+TTCname(20): msgothic.ttc(0)
+
+Name: MS-PMincho
+Class: Japan
+TTFname(50): MS PMincho.ttf
+TTFname(30): MS-PMincho.ttf
+TTCname(20): msmincho.ttc(1)
+
+Name: MS-PGothic
+Class: Japan
+TTFname(50): MS PGothic.ttf
+TTFname(30): MS-PGothic.ttf
+TTCname(20): msgothic.ttc(1)
+
+Name: MS-UIGothic
+Class: Japan
+TTCname(20): msgothic.ttc(2)
+
+Name: Meiryo
+Class: Japan
+TTFname(50): Meiryo.ttf
+TTCname(20): meiryo.ttc(0)
+
+Name: Meiryo-Bold
+Class: Japan
+TTFname(50): Meiryo Bold.ttf
+TTFname(40): MeiryoBold.ttf
+TTFname(30): Meiryo-Bold.ttf
+TTCname(20): meiryob.ttc(0)
+
+Name: Meiryo-BoldItalic
+Class: Japan
+TTFname(50): Meiryo Bold Italic.ttf
+TTFname(40): MeiryoBoldItalic.ttf
+TTFname(30): Meiryo-BoldItalic.ttf
+TTCname(20): meiryob.ttc(1)
+
+Name: Meiryo-Italic
+Class: Japan
+TTFname(50): Meiryo Italic.ttf
+TTFname(40): MeiryoItalic.ttf
+TTFname(30): Meiryo-Italic.ttf
+TTCname(20): meiryo.ttc(1)
+
+Name: MeiryoUI
+Class: Japan
+TTCname(20): meiryo.ttc(2)
+
+Name: MeiryoUI-Bold
+Class: Japan
+TTCname(20): meiryob.ttc(2)
+
+Name: MeiryoUI-BoldItalic
+Class: Japan
+TTCname(20): meiryob.ttc(3)
+
+Name: MeiryoUI-Italic
+Class: Japan
+TTCname(20): meiryo.ttc(3)
+
+Name: HGGothicE
+Class: Japan
+TTCname(50): HGRGE.ttc(0)
+TTCname(20): HGRGE.TTC(0)
+
+Name: HGPGothicE
+Class: Japan
+TTCname(50): HGRGE.ttc(1)
+TTCname(20): HGRGE.TTC(1)
+
+Name: HGSGothicE
+Class: Japan
+TTCname(50): HGRGE.ttc(2)
+TTCname(20): HGRGE.TTC(2)
+
+Name: HGGothicM
+Class: Japan
+TTCname(20): HGRGM.TTC(0)
+
+Name: HGPGothicM
+Class: Japan
+TTCname(20): HGRGM.TTC(1)
+
+Name: HGSGothicM
+Class: Japan
+TTCname(20): HGRGM.TTC(2)
+
+Name: HGMinchoE
+Class: Japan
+TTCname(50): HGRME.ttc(0)
+TTCname(20): HGRME.TTC(0)
+
+Name: HGPMinchoE
+Class: Japan
+TTCname(50): HGRME.ttc(1)
+TTCname(20): HGRME.TTC(2)
+
+Name: HGSMinchoE
+Class: Japan
+TTCname(50): HGRME.ttc(2)
+TTCname(20): HGRME.TTC(2)
+
+Name: HGMinchoB
+Class: Japan
+TTCname(20): HGRMB.TTC(0)
+
+Name: HGPMinchoB
+Class: Japan
+TTCname(20): HGRMB.TTC(1)
+
+Name: HGSMinchoB
+Class: Japan
+TTCname(20): HGRMB.TTC(2)
+
+Name: HGSoeiKakugothicUB
+Class: Japan
+TTCname(50): HGRSGU.ttc(0)
+TTCname(20): HGRSGU.TTC(0)
+
+Name: HGPSoeiKakugothicUB
+Class: Japan
+TTCname(50): HGRSGU.ttc(1)
+TTCname(20): HGRSGU.TTC(1)
+
+Name: HGSSoeiKakugothicUB
+Class: Japan
+TTCname(50): HGRSGU.ttc(2)
+TTCname(20): HGRSGU.TTC(2)
+
+Name: HGSoeiKakupoptai
+Class: Japan
+TTCname(20): HGRPP1.TTC(0)
+
+Name: HGPSoeiKakupoptai
+Class: Japan
+TTCname(20): HGRPP1.TTC(1)
+
+Name: HGSSoeiKakupoptai
+Class: Japan
+TTCname(20): HGRPP1.TTC(2)
+
+Name: HGSoeiPresenceEB
+Class: Japan
+TTCname(20): HGRPRE.TTC(0)
+
+Name: HGPSoeiPresenceEB
+Class: Japan
+TTCname(20): HGRPRE.TTC(1)
+
+Name: HGSSoeiPresenceEB
+Class: Japan
+TTCname(20): HGRPRE.TTC(2)
+
+Name: HGKyokashotai
+Class: Japan
+TTCname(20): HGRKK.TTC(0)
+
+Name: HGPKyokashotai
+Class: Japan
+TTCname(20): HGRKK.TTC(1)
+
+Name: HGSKyokashotai
+Class: Japan
+TTCname(20): HGRKK.TTC(2)
+
+Name: HGGyoshotai
+Class: Japan
+TTCname(20): HGRGY.TTC(0)
+
+Name: HGPGyoshotai
+Class: Japan
+TTCname(20): HGRGY.TTC(1)
+
+Name: HGSGyoshotai
+Class: Japan
+TTCname(20): HGRGY.TTC(2)
+
+Name: HGMaruGothicMPRO
+Class: Japan
+TTFname(40): HGRSMP.ttf
+TTFname(20): HGRSMP.TTF
+
+Name: HGSeikaishotaiPRO
+Class: Japan
+TTFname(20): HGRSKP.TTF
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-mogamobo.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-mogamobo.dat
new file mode 100644
index 0000000000..bddebd45e1
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-mogamobo.dat
@@ -0,0 +1,200 @@
+# Moga-Mobo from Y.Oz Vox (free)
+
+### JAPANESE ###
+
+Name: MogaMincho-Regular
+Class: Japan
+Provides(110): Ryumin-Light
+Provides(110): RyuminPro-Light
+Provides(110): HiraMinProN-W3
+Provides(110): HiraMinPro-W3
+TTCname: mogam.ttc(0)
+
+Name: MogaExMincho-Regular
+Class: Japan
+Provides(100): Ryumin-Light
+Provides(100): RyuminPro-Light
+Provides(100): HiraMinProN-W3
+Provides(100): HiraMinPro-W3
+TTCname: mogam.ttc(1)
+
+Name: MogaExMincho-Italic
+Class: Japan
+TTCname: mogam.ttc(2)
+
+Name: Moga90Mincho-Regular
+Class: Japan
+TTCname: mogam.ttc(3)
+
+Name: MogaEx90Mincho-Regular
+Class: Japan
+TTCname: mogam.ttc(4)
+
+Name: MogaEx90Mincho-Italic
+Class: Japan
+TTCname: mogam.ttc(5)
+
+Name: MogaMincho-Bold
+Class: Japan
+Provides(110): FutoMinA101-Bold
+Provides(110): FutoMinA101Pro-Bold
+Provides(110): HiraMinProN-W6
+Provides(110): HiraMinPro-W6
+Provides(110): MidashiMin-MA31
+Provides(110): MidashiMinPro-MA31
+TTCname: mogamb.ttc(0)
+
+Name: MogaExMincho-Bold
+Class: Japan
+Provides(100): FutoMinA101-Bold
+Provides(100): FutoMinA101Pro-Bold
+Provides(100): HiraMinProN-W6
+Provides(100): HiraMinPro-W6
+Provides(100): MidashiMin-MA31
+Provides(100): MidashiMinPro-MA31
+TTCname: mogamb.ttc(1)
+
+Name: Moga90Mincho-Bold
+Class: Japan
+TTCname: mogamb.ttc(2)
+
+Name: MogaEx90Mincho-Bold
+Class: Japan
+TTCname: mogamb.ttc(3)
+
+Name: MogaHMincho-Regular
+Class: Japan
+TTCname: mogahm.ttc(0)
+
+Name: MogaExHMincho-Regular
+Class: Japan
+TTCname: mogahm.ttc(1)
+
+Name: MogaExHMincho-Italic
+Class: Japan
+TTCname: mogahm.ttc(2)
+
+Name: Moga90HMincho-Regular
+Class: Japan
+TTCname: mogahm.ttc(3)
+
+Name: MogaEx90HMincho-Regular
+Class: Japan
+TTCname: mogahm.ttc(4)
+
+Name: MogaEx90HMincho-Italic
+Class: Japan
+TTCname: mogahm.ttc(5)
+
+Name: MogaHMincho-Bold
+Class: Japan
+TTCname: mogahmb.ttc(0)
+
+Name: MogaExHMincho-Bold
+Class: Japan
+TTCname: mogahmb.ttc(1)
+
+Name: Moga90HMincho-Bold
+Class: Japan
+TTCname: mogahmb.ttc(2)
+
+Name: MogaEx90HMincho-Bold
+Class: Japan
+TTCname: mogahmb.ttc(3)
+
+Name: MogaGothic-Regular
+Class: Japan
+Provides(110): GothicBBB-Medium
+Provides(110): GothicBBBPro-Medium
+Provides(110): HiraKakuProN-W3
+Provides(110): HiraKakuPro-W3
+TTCname: mogag.ttc(0)
+
+Name: MogaExGothic-Regular
+Class: Japan
+Provides(100): GothicBBB-Medium
+Provides(100): GothicBBBPro-Medium
+Provides(100): HiraKakuProN-W3
+Provides(100): HiraKakuPro-W3
+TTCname: mogag.ttc(1)
+
+Name: Moga90Gothic-Regular
+Class: Japan
+TTCname: mogag.ttc(2)
+
+Name: MogaEx90Gothic-Regular
+Class: Japan
+TTCname: mogag.ttc(3)
+
+Name: MogaGothic-Bold
+Class: Japan
+Provides(110): FutoGoB101-Bold
+Provides(110): FutoGoB101Pro-Bold
+Provides(110): HiraKakuProN-W6
+Provides(110): HiraKakuPro-W6
+Provides(110): MidashiGo-MB31
+Provides(110): MidashiGoPro-MB31
+Provides(110): HiraKakuStdN-W8
+Provides(110): HiraKakuStd-W8
+TTCname: mogagb.ttc(0)
+
+Name: MogaExGothic-Bold
+Class: Japan
+Provides(100): FutoGoB101-Bold
+Provides(100): FutoGoB101Pro-Bold
+Provides(100): HiraKakuProN-W6
+Provides(100): HiraKakuPro-W6
+Provides(100): MidashiGo-MB31
+Provides(100): MidashiGoPro-MB31
+Provides(100): HiraKakuStdN-W8
+Provides(100): HiraKakuStd-W8
+TTCname: mogagb.ttc(1)
+
+Name: Moga90Gothic-Bold
+Class: Japan
+TTCname: mogagb.ttc(2)
+
+Name: MogaEx90Gothic-Bold
+Class: Japan
+TTCname: mogagb.ttc(3)
+
+Name: MoboGothic-Regular
+Class: Japan
+Provides(110): Jun101-Light
+Provides(110): Jun101Pro-Light
+Provides(110): HiraMaruProN-W4
+Provides(110): HiraMaruPro-W4
+TTCname: mobog.ttc(0)
+
+Name: MoboExGothic-Regular
+Class: Japan
+Provides(100): Jun101-Light
+Provides(100): Jun101Pro-Light
+Provides(100): HiraMaruProN-W4
+Provides(100): HiraMaruPro-W4
+TTCname: mobog.ttc(1)
+
+Name: Mobo90Gothic-Regular
+Class: Japan
+TTCname: mobog.ttc(2)
+
+Name: MoboEx90Gothic-Regular
+Class: Japan
+TTCname: mobog.ttc(3)
+
+Name: MoboGothic-Bold
+Class: Japan
+TTCname: mobogb.ttc(0)
+
+Name: MoboExGothic-Bold
+Class: Japan
+TTCname: mobogb.ttc(1)
+
+Name: Mobo90Gothic-Bold
+Class: Japan
+TTCname: mobogb.ttc(2)
+
+Name: MoboEx90Gothic-Bold
+Class: Japan
+TTCname: mobogb.ttc(3)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-monotype.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-monotype.dat
new file mode 100644
index 0000000000..caeeb14e7a
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-monotype.dat
@@ -0,0 +1,30 @@
+# Monotype Imaging, Monotype Hong Kong
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# YuppySC-Regular.otf
+# YuppyTC-Regular.otf
+# are bundled with OS X 10.9 Mavericks or later versions.
+# LingWaiSC-Medium.otf
+# LingWaiTC-Medium.otf
+# are bundled with macOS 10.12 Sierra or later versions.
+
+Name: YuppySC-Regular
+Class: GB
+OTFname: YuppySC-Regular.otf
+
+Name: YuppyTC-Regular
+Class: CNS
+OTFname: YuppyTC-Regular.otf
+
+Name: LingWaiSC-Medium
+PSName: MLingWaiMedium-SC
+Class: GB
+OTFname: LingWaiSC-Medium.otf
+
+Name: LingWaiTC-Medium
+PSName: MLingWaiMedium-TC
+Class: CNS
+OTFname: LingWaiTC-Medium.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-morisawa.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-morisawa.dat
new file mode 100644
index 0000000000..740c7b683c
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-morisawa.dat
@@ -0,0 +1,705 @@
+# Morisawa standard sets
+
+### JAPANESE ###
+
+# Some of the {Pr6N,Pro} variants are used in morisawa (ptex-fontmaps)
+# or in moriprop (S. Saito).
+
+# Note:
+# A-OTF-Jun101Pr6N-Light appeared in otf-(up-)morisawa-pr6n.map
+# which is older than jfontmaps 20140301.0
+# however, such a Pr6N variant never existed, so removed
+# https://www.tug.org/pipermail/tex-live/2014-February/034855.html
+
+Name: A-OTF-RyuminPr6N-Light
+PSName: RyuminPr6N-Light
+Class: Japan
+Provides(10): Ryumin-Light
+Provides(10): RyuminPro-Light
+Provides(10): HiraMinProN-W3
+Provides(10): HiraMinPro-W3
+OTFname: A-OTF-RyuminPr6N-Light.otf
+
+Name: A-OTF-RyuminPr6N-Regular
+PSName: RyuminPr6N-Regular
+Class: Japan
+Provides(10): Ryumin-Regular
+OTFname: A-OTF-RyuminPr6N-Regular.otf
+
+Name: A-OTF-RyuminPr6N-Medium
+PSName: RyuminPr6N-Medium
+Class: Japan
+Provides(10): Ryumin-Medium
+OTFname: A-OTF-RyuminPr6N-Medium.otf
+
+Name: A-OTF-RyuminPr6N-Bold
+PSName: RyuminPr6N-Bold
+Class: Japan
+Provides(10): Ryumin-Bold
+OTFname: A-OTF-RyuminPr6N-Bold.otf
+
+Name: A-OTF-RyuminPr6N-ExBold
+PSName: RyuminPr6N-ExBold
+Class: Japan
+Provides(10): Ryumin-ExBold
+OTFname: A-OTF-RyuminPr6N-ExBold.otf
+
+Name: A-OTF-RyuminPr6N-Heavy
+PSName: RyuminPr6N-Heavy
+Class: Japan
+Provides(10): Ryumin-Heavy
+OTFname: A-OTF-RyuminPr6N-Heavy.otf
+
+Name: A-OTF-RyuminPr6N-ExHeavy
+PSName: RyuminPr6N-ExHeavy
+Class: Japan
+Provides(10): Ryumin-ExHeavy
+OTFname: A-OTF-RyuminPr6N-ExHeavy.otf
+
+Name: A-OTF-RyuminPr6N-Ultra
+PSName: RyuminPr6N-Ultra
+Class: Japan
+Provides(10): Ryumin-Ultra
+OTFname: A-OTF-RyuminPr6N-Ultra.otf
+
+Name: A-OTF-RyuminPr6-Light
+PSName: RyuminPr6-Light
+Class: Japan
+Provides(15): Ryumin-Light
+Provides(15): HiraMinPro-W3
+OTFname: A-OTF-RyuminPr6-Light.otf
+
+Name: A-OTF-RyuminPr6-Regular
+PSName: RyuminPr6-Regular
+Class: Japan
+Provides(15): Ryumin-Regular
+OTFname: A-OTF-RyuminPr6-Regular.otf
+
+Name: A-OTF-RyuminPr6-Medium
+PSName: RyuminPr6-Medium
+Class: Japan
+Provides(15): Ryumin-Medium
+OTFname: A-OTF-RyuminPr6-Medium.otf
+
+Name: A-OTF-RyuminPr6-Bold
+PSName: RyuminPr6-Bold
+Class: Japan
+Provides(15): Ryumin-Bold
+OTFname: A-OTF-RyuminPr6-Bold.otf
+
+Name: A-OTF-RyuminPr6-ExBold
+PSName: RyuminPr6-ExBold
+Class: Japan
+Provides(15): Ryumin-ExBold
+OTFname: A-OTF-RyuminPr6-ExBold.otf
+
+Name: A-OTF-RyuminPr6-Heavy
+PSName: RyuminPr6-Heavy
+Class: Japan
+Provides(15): Ryumin-Heavy
+OTFname: A-OTF-RyuminPr6-Heavy.otf
+
+Name: A-OTF-RyuminPr6-ExHeavy
+PSName: RyuminPr6-ExHeavy
+Class: Japan
+Provides(15): Ryumin-ExHeavy
+OTFname: A-OTF-RyuminPr6-ExHeavy.otf
+
+Name: A-OTF-RyuminPr6-Ultra
+PSName: RyuminPr6-Ultra
+Class: Japan
+Provides(15): Ryumin-Ultra
+OTFname: A-OTF-RyuminPr6-Ultra.otf
+
+Name: A-OTF-RyuminPr5-Light
+PSName: RyuminPr5-Light
+Class: Japan
+Provides(18): Ryumin-Light
+Provides(18): HiraMinPro-W3
+OTFname: A-OTF-RyuminPr5-Light.otf
+
+Name: A-OTF-RyuminPr5-Regular
+PSName: RyuminPr5-Regular
+Class: Japan
+Provides(18): Ryumin-Regular
+OTFname: A-OTF-RyuminPr5-Regular.otf
+
+Name: A-OTF-RyuminPr5-Medium
+PSName: RyuminPr5-Medium
+Class: Japan
+Provides(18): Ryumin-Medium
+OTFname: A-OTF-RyuminPr5-Medium.otf
+
+Name: A-OTF-RyuminPr5-Bold
+PSName: RyuminPr5-Bold
+Class: Japan
+Provides(18): Ryumin-Bold
+OTFname: A-OTF-RyuminPr5-Bold.otf
+
+Name: A-OTF-RyuminPr5-ExBold
+PSName: RyuminPr5-ExBold
+Class: Japan
+Provides(18): Ryumin-ExBold
+OTFname: A-OTF-RyuminPr5-ExBold.otf
+
+Name: A-OTF-RyuminPr5-Heavy
+PSName: RyuminPr5-Heavy
+Class: Japan
+Provides(18): Ryumin-Heavy
+OTFname: A-OTF-RyuminPr5-Heavy.otf
+
+Name: A-OTF-RyuminPr5-ExHeavy
+PSName: RyuminPr5-ExHeavy
+Class: Japan
+Provides(18): Ryumin-ExHeavy
+OTFname: A-OTF-RyuminPr5-ExHeavy.otf
+
+Name: A-OTF-RyuminPr5-Ultra
+PSName: RyuminPr5-Ultra
+Class: Japan
+Provides(18): Ryumin-Ultra
+OTFname: A-OTF-RyuminPr5-Ultra.otf
+
+Name: A-OTF-RyuminPro-Light
+PSName: RyuminPro-Light
+Class: Japan
+Provides(20): Ryumin-Light
+Provides(20): HiraMinPro-W3
+OTFname: A-OTF-RyuminPro-Light.otf
+
+Name: A-OTF-RyuminPro-Regular
+PSName: RyuminPro-Regular
+Class: Japan
+Provides(20): Ryumin-Regular
+OTFname: A-OTF-RyuminPro-Regular.otf
+
+Name: A-OTF-RyuminPro-Medium
+PSName: RyuminPro-Medium
+Class: Japan
+Provides(20): Ryumin-Medium
+OTFname: A-OTF-RyuminPro-Medium.otf
+
+Name: A-OTF-RyuminPro-Bold
+PSName: RyuminPro-Bold
+Class: Japan
+Provides(20): Ryumin-Bold
+OTFname: A-OTF-RyuminPro-Bold.otf
+
+Name: A-OTF-RyuminPro-ExBold
+PSName: RyuminPro-ExBold
+Class: Japan
+Provides(20): Ryumin-ExBold
+OTFname: A-OTF-RyuminPro-ExBold.otf
+
+Name: A-OTF-RyuminPro-Heavy
+PSName: RyuminPro-Heavy
+Class: Japan
+Provides(20): Ryumin-Heavy
+OTFname: A-OTF-RyuminPro-Heavy.otf
+
+Name: A-OTF-RyuminPro-ExHeavy
+PSName: RyuminPro-ExHeavy
+Class: Japan
+Provides(20): Ryumin-ExHeavy
+OTFname: A-OTF-RyuminPro-ExHeavy.otf
+
+Name: A-OTF-RyuminPro-Ultra
+PSName: RyuminPro-Ultra
+Class: Japan
+Provides(20): Ryumin-Ultra
+OTFname: A-OTF-RyuminPro-Ultra.otf
+
+Name: A-OTF-FutoMinA101Pr6N-Bold
+PSName: FutoMinA101Pr6N-Bold
+Class: Japan
+Provides(10): FutoMinA101-Bold
+Provides(10): FutoMinA101Pro-Bold
+Provides(10): HiraMinProN-W6
+Provides(10): HiraMinPro-W6
+OTFname: A-OTF-FutoMinA101Pr6N-Bold.otf
+
+Name: A-OTF-FutoMinA101Pr6-Bold
+PSName: FutoMinA101Pr6-Bold
+Class: Japan
+Provides(15): FutoMinA101-Bold
+Provides(15): HiraMinPro-W6
+OTFname: A-OTF-FutoMinA101Pr6-Bold.otf
+
+Name: A-OTF-FutoMinA101Pr5-Bold
+PSName: FutoMinA101Pr5-Bold
+Class: Japan
+Provides(18): FutoMinA101-Bold
+Provides(18): HiraMinPro-W6
+OTFname: A-OTF-FutoMinA101Pr5-Bold.otf
+
+Name: A-OTF-FutoMinA101Pro-Bold
+PSName: FutoMinA101Pro-Bold
+Class: Japan
+Provides(20): FutoMinA101-Bold
+Provides(20): HiraMinPro-W6
+OTFname: A-OTF-FutoMinA101Pro-Bold.otf
+
+Name: A-OTF-GothicBBBPr6N-Medium
+PSName: GothicBBBPr6N-Medium
+Class: Japan
+Provides(10): GothicBBB-Medium
+Provides(10): GothicBBBPro-Medium
+Provides(10): HiraKakuProN-W3
+Provides(10): HiraKakuPro-W3
+OTFname: A-OTF-GothicBBBPr6N-Medium.otf
+
+Name: A-OTF-GothicBBBPr6-Medium
+PSName: GothicBBBPr6-Medium
+Class: Japan
+Provides(15): GothicBBB-Medium
+Provides(15): HiraKakuPro-W3
+OTFname: A-OTF-GothicBBBPr6-Medium.otf
+
+Name: A-OTF-GothicBBBPr5-Medium
+PSName: GothicBBBPr5-Medium
+Class: Japan
+Provides(18): GothicBBB-Medium
+Provides(18): HiraKakuPro-W3
+OTFname: A-OTF-GothicBBBPr5-Medium.otf
+
+Name: A-OTF-GothicBBBPro-Medium
+PSName: GothicBBBPro-Medium
+Class: Japan
+Provides(20): GothicBBB-Medium
+Provides(20): HiraKakuPro-W3
+OTFname: A-OTF-GothicBBBPro-Medium.otf
+
+Name: A-OTF-FutoGoB101Pr6N-Bold
+PSName: FutoGoB101Pr6N-Bold
+Class: Japan
+Provides(10): FutoGoB101-Bold
+Provides(10): FutoGoB101Pro-Bold
+Provides(10): HiraKakuProN-W6
+Provides(10): HiraKakuPro-W6
+OTFname: A-OTF-FutoGoB101Pr6N-Bold.otf
+
+Name: A-OTF-FutoGoB101Pr6-Bold
+PSName: FutoGoB101Pr6-Bold
+Class: Japan
+Provides(15): FutoGoB101-Bold
+Provides(15): HiraKakuPro-W6
+OTFname: A-OTF-FutoGoB101Pr6-Bold.otf
+
+Name: A-OTF-FutoGoB101Pr5-Bold
+PSName: FutoGoB101Pr5-Bold
+Class: Japan
+Provides(18): FutoGoB101-Bold
+Provides(18): HiraKakuPro-W6
+OTFname: A-OTF-FutoGoB101Pr5-Bold.otf
+
+Name: A-OTF-FutoGoB101Pro-Bold
+PSName: FutoGoB101Pro-Bold
+Class: Japan
+Provides(20): FutoGoB101-Bold
+Provides(20): HiraKakuPro-W6
+OTFname: A-OTF-FutoGoB101Pro-Bold.otf
+
+Name: A-OTF-MidashiGoPr6N-MB31
+PSName: MidashiGoPr6N-MB31
+Class: Japan
+Provides(10): MidashiGo-MB31
+Provides(10): MidashiGoPro-MB31
+Provides(10): HiraKakuStdN-W8
+Provides(10): HiraKakuStd-W8
+OTFname: A-OTF-MidashiGoPr6N-MB31.otf
+
+Name: A-OTF-MidashiGoPr6-MB31
+PSName: MidashiGoPr6-MB31
+Class: Japan
+Provides(15): MidashiGo-MB31
+Provides(15): HiraKakuStd-W8
+OTFname: A-OTF-MidashiGoPr6-MB31.otf
+
+Name: A-OTF-MidashiGoPr5-MB31
+PSName: MidashiGoPr5-MB31
+Class: Japan
+Provides(18): MidashiGo-MB31
+Provides(18): HiraKakuStd-W8
+OTFname: A-OTF-MidashiGoPr5-MB31.otf
+
+Name: A-OTF-MidashiGoPro-MB31
+PSName: MidashiGoPro-MB31
+Class: Japan
+Provides(20): MidashiGo-MB31
+Provides(20): HiraKakuStd-W8
+OTFname: A-OTF-MidashiGoPro-MB31.otf
+
+Name: A-OTF-Jun101Pro-Light
+PSName: Jun101Pro-Light
+Class: Japan
+Provides(20): Jun101-Light
+Provides(20): HiraMaruPro-W4
+OTFname: A-OTF-Jun101Pro-Light.otf
+
+Name: A-OTF-Jun201Pro-Regular
+PSName: Jun201Pro-Regular
+Class: Japan
+Provides(20): Jun201-Regular
+OTFname: A-OTF-Jun201Pro-Regular.otf
+
+Name: A-OTF-Jun34Pro-Medium
+PSName: Jun34Pro-Medium
+Class: Japan
+Provides(20): Jun34-Medium
+OTFname: A-OTF-Jun34Pro-Medium.otf
+
+Name: A-OTF-Jun501Pro-Bold
+PSName: Jun501Pro-Bold
+Class: Japan
+Provides(20): Jun501-Bold
+OTFname: A-OTF-Jun501Pro-Bold.otf
+
+Name: A-OTF-ShinGoPr6N-ExLight
+PSName: ShinGoPr6N-ExLight
+Class: Japan
+Provides(10): ShinGo-ExLight
+OTFname: A-OTF-ShinGoPr6N-ExLight.otf
+
+Name: A-OTF-ShinGoPr6N-Light
+PSName: ShinGoPr6N-Light
+Class: Japan
+Provides(10): ShinGo-Light
+OTFname: A-OTF-ShinGoPr6N-Light.otf
+
+Name: A-OTF-ShinGoPr6N-Regular
+PSName: ShinGoPr6N-Regular
+Class: Japan
+Provides(10): ShinGo-Regular
+OTFname: A-OTF-ShinGoPr6N-Regular.otf
+
+Name: A-OTF-ShinGoPr6N-Medium
+PSName: ShinGoPr6N-Medium
+Class: Japan
+Provides(10): ShinGo-Medium
+OTFname: A-OTF-ShinGoPr6N-Medium.otf
+
+Name: A-OTF-ShinGoPr6N-DeBold
+PSName: ShinGoPr6N-DeBold
+Class: Japan
+Provides(10): ShinGo-DeBold
+OTFname: A-OTF-ShinGoPr6N-DeBold.otf
+
+Name: A-OTF-ShinGoPr6N-Bold
+PSName: ShinGoPr6N-Bold
+Class: Japan
+Provides(10): ShinGo-Bold
+OTFname: A-OTF-ShinGoPr6N-Bold.otf
+
+Name: A-OTF-ShinGoPr6N-Heavy
+PSName: ShinGoPr6N-Heavy
+Class: Japan
+Provides(10): ShinGo-Heavy
+OTFname: A-OTF-ShinGoPr6N-Heavy.otf
+
+Name: A-OTF-ShinGoPr6N-Ultra
+PSName: ShinGoPr6N-Ultra
+Class: Japan
+Provides(10): ShinGo-Ultra
+OTFname: A-OTF-ShinGoPr6N-Ultra.otf
+
+Name: A-OTF-ShinGoPr6-ExLight
+PSName: ShinGoPr6-ExLight
+Class: Japan
+Provides(15): ShinGo-ExLight
+OTFname: A-OTF-ShinGoPr6-ExLight.otf
+
+Name: A-OTF-ShinGoPr6-Light
+PSName: ShinGoPr6-Light
+Class: Japan
+Provides(15): ShinGo-Light
+OTFname: A-OTF-ShinGoPr6-Light.otf
+
+Name: A-OTF-ShinGoPr6-Regular
+PSName: ShinGoPr6-Regular
+Class: Japan
+Provides(15): ShinGo-Regular
+OTFname: A-OTF-ShinGoPr6-Regular.otf
+
+Name: A-OTF-ShinGoPr6-Medium
+PSName: ShinGoPr6-Medium
+Class: Japan
+Provides(15): ShinGo-Medium
+OTFname: A-OTF-ShinGoPr6-Medium.otf
+
+Name: A-OTF-ShinGoPr6-DeBold
+PSName: ShinGoPr6-DeBold
+Class: Japan
+Provides(15): ShinGo-DeBold
+OTFname: A-OTF-ShinGoPr6-DeBold.otf
+
+Name: A-OTF-ShinGoPr6-Bold
+PSName: ShinGoPr6-Bold
+Class: Japan
+Provides(15): ShinGo-Bold
+OTFname: A-OTF-ShinGoPr6-Bold.otf
+
+Name: A-OTF-ShinGoPr6-Heavy
+PSName: ShinGoPr6-Heavy
+Class: Japan
+Provides(15): ShinGo-Heavy
+OTFname: A-OTF-ShinGoPr6-Heavy.otf
+
+Name: A-OTF-ShinGoPr6-Ultra
+PSName: ShinGoPr6-Ultra
+Class: Japan
+Provides(15): ShinGo-Ultra
+OTFname: A-OTF-ShinGoPr6-Ultra.otf
+
+Name: A-OTF-ShinGoPr5-ExLight
+PSName: ShinGoPr5-ExLight
+Class: Japan
+Provides(18): ShinGo-ExLight
+OTFname: A-OTF-ShinGoPr5-ExLight.otf
+
+Name: A-OTF-ShinGoPr5-Light
+PSName: ShinGoPr5-Light
+Class: Japan
+Provides(18): ShinGo-Light
+OTFname: A-OTF-ShinGoPr5-Light.otf
+
+Name: A-OTF-ShinGoPr5-Regular
+PSName: ShinGoPr5-Regular
+Class: Japan
+Provides(18): ShinGo-Regular
+OTFname: A-OTF-ShinGoPr5-Regular.otf
+
+Name: A-OTF-ShinGoPr5-Medium
+PSName: ShinGoPr5-Medium
+Class: Japan
+Provides(18): ShinGo-Medium
+OTFname: A-OTF-ShinGoPr5-Medium.otf
+
+Name: A-OTF-ShinGoPr5-DeBold
+PSName: ShinGoPr5-DeBold
+Class: Japan
+Provides(18): ShinGo-DeBold
+OTFname: A-OTF-ShinGoPr5-DeBold.otf
+
+Name: A-OTF-ShinGoPr5-Bold
+PSName: ShinGoPr5-Bold
+Class: Japan
+Provides(18): ShinGo-Bold
+OTFname: A-OTF-ShinGoPr5-Bold.otf
+
+Name: A-OTF-ShinGoPr5-Heavy
+PSName: ShinGoPr5-Heavy
+Class: Japan
+Provides(18): ShinGo-Heavy
+OTFname: A-OTF-ShinGoPr5-Heavy.otf
+
+Name: A-OTF-ShinGoPr5-Ultra
+PSName: ShinGoPr5-Ultra
+Class: Japan
+Provides(18): ShinGo-Ultra
+OTFname: A-OTF-ShinGoPr5-Ultra.otf
+
+Name: A-OTF-ShinGoPro-ExLight
+PSName: ShinGoPro-ExLight
+Class: Japan
+Provides(20): ShinGo-ExLight
+OTFname: A-OTF-ShinGoPro-ExLight.otf
+
+Name: A-OTF-ShinGoPro-Light
+PSName: ShinGoPro-Light
+Class: Japan
+Provides(20): ShinGo-Light
+OTFname: A-OTF-ShinGoPro-Light.otf
+
+Name: A-OTF-ShinGoPro-Regular
+PSName: ShinGoPro-Regular
+Class: Japan
+Provides(20): ShinGo-Regular
+OTFname: A-OTF-ShinGoPro-Regular.otf
+
+Name: A-OTF-ShinGoPro-Medium
+PSName: ShinGoPro-Medium
+Class: Japan
+Provides(20): ShinGo-Medium
+OTFname: A-OTF-ShinGoPro-Medium.otf
+
+Name: A-OTF-ShinGoPro-DeBold
+PSName: ShinGoPro-DeBold
+Class: Japan
+Provides(20): ShinGo-DeBold
+OTFname: A-OTF-ShinGoPro-DeBold.otf
+
+Name: A-OTF-ShinGoPro-Bold
+PSName: ShinGoPro-Bold
+Class: Japan
+Provides(20): ShinGo-Bold
+OTFname: A-OTF-ShinGoPro-Bold.otf
+
+Name: A-OTF-ShinGoPro-Heavy
+PSName: ShinGoPro-Heavy
+Class: Japan
+Provides(20): ShinGo-Heavy
+OTFname: A-OTF-ShinGoPro-Heavy.otf
+
+Name: A-OTF-ShinGoPro-Ultra
+PSName: ShinGoPro-Ultra
+Class: Japan
+Provides(20): ShinGo-Ultra
+OTFname: A-OTF-ShinGoPro-Ultra.otf
+
+Name: A-OTF-ShinMGoPr6N-Light
+PSName: ShinMGoPr6N-Light
+Class: Japan
+Provides(10): Jun101-Light
+Provides(10): Jun101Pro-Light
+Provides(10): HiraMaruProN-W4
+Provides(10): HiraMaruPro-W4
+Provides(10): ShinMGo-Light
+OTFname: A-OTF-ShinMGoPr6N-Light.otf
+
+Name: A-OTF-ShinMGoPr6N-Regular
+PSName: ShinMGoPr6N-Regular
+Class: Japan
+Provides(10): ShinMGo-Regular
+OTFname: A-OTF-ShinMGoPr6N-Regular.otf
+
+Name: A-OTF-ShinMGoPr6N-Medium
+PSName: ShinMGoPr6N-Medium
+Class: Japan
+Provides(10): ShinMGo-Medium
+OTFname: A-OTF-ShinMGoPr6N-Medium.otf
+
+Name: A-OTF-ShinMGoPr6N-DeBold
+PSName: ShinMGoPr6N-DeBold
+Class: Japan
+Provides(10): ShinMGo-DeBold
+OTFname: A-OTF-ShinMGoPr6N-DeBold.otf
+
+Name: A-OTF-ShinMGoPr6N-Bold
+PSName: ShinMGoPr6N-Bold
+Class: Japan
+Provides(10): ShinMGo-Bold
+OTFname: A-OTF-ShinMGoPr6N-Bold.otf
+
+Name: A-OTF-ShinMGoPr6N-Heavy
+PSName: ShinMGoPr6N-Heavy
+Class: Japan
+Provides(10): ShinMGo-Heavy
+OTFname: A-OTF-ShinMGoPr6N-Heavy.otf
+
+Name: A-OTF-ShinMGoPr6N-Ultra
+PSName: ShinMGoPr6N-Ultra
+Class: Japan
+Provides(10): ShinMGo-Ultra
+OTFname: A-OTF-ShinMGoPr6N-Ultra.otf
+
+Name: A-OTF-ShinMGoPr6-Light
+PSName: ShinMGoPr6-Light
+Class: Japan
+Provides(15): Jun101-Light
+Provides(15): HiraMaruPro-W4
+Provides(15): ShinMGo-Light
+OTFname: A-OTF-ShinMGoPr6-Light.otf
+
+Name: A-OTF-ShinMGoPr6-Regular
+PSName: ShinMGoPr6-Regular
+Class: Japan
+Provides(15): ShinMGo-Regular
+OTFname: A-OTF-ShinMGoPr6-Regular.otf
+
+Name: A-OTF-ShinMGoPr6-Medium
+PSName: ShinMGoPr6-Medium
+Class: Japan
+Provides(15): ShinMGo-Medium
+OTFname: A-OTF-ShinMGoPr6-Medium.otf
+
+Name: A-OTF-ShinMGoPr6-DeBold
+PSName: ShinMGoPr6-DeBold
+Class: Japan
+Provides(15): ShinMGo-DeBold
+OTFname: A-OTF-ShinMGoPr6-DeBold.otf
+
+Name: A-OTF-ShinMGoPr6-Bold
+PSName: ShinMGoPr6-Bold
+Class: Japan
+Provides(15): ShinMGo-Bold
+OTFname: A-OTF-ShinMGoPr6-Bold.otf
+
+Name: A-OTF-ShinMGoPr6-Heavy
+PSName: ShinMGoPr6-Heavy
+Class: Japan
+Provides(15): ShinMGo-Heavy
+OTFname: A-OTF-ShinMGoPr6-Heavy.otf
+
+Name: A-OTF-ShinMGoPr6-Ultra
+PSName: ShinMGoPr6-Ultra
+Class: Japan
+Provides(15): ShinMGo-Ultra
+OTFname: A-OTF-ShinMGoPr6-Ultra.otf
+
+Name: A-OTF-ShinMGoPro-Light
+PSName: ShinMGoPro-Light
+Class: Japan
+Provides(20): ShinMGo-Light
+OTFname: A-OTF-ShinMGoPro-Light.otf
+
+Name: A-OTF-ShinMGoPro-Regular
+PSName: ShinMGoPro-Regular
+Class: Japan
+Provides(20): ShinMGo-Regular
+OTFname: A-OTF-ShinMGoPro-Regular.otf
+
+Name: A-OTF-ShinMGoPro-Medium
+PSName: ShinMGoPro-Medium
+Class: Japan
+Provides(20): ShinMGo-Medium
+OTFname: A-OTF-ShinMGoPro-Medium.otf
+
+Name: A-OTF-ShinMGoPro-DeBold
+PSName: ShinMGoPro-DeBold
+Class: Japan
+Provides(20): ShinMGo-DeBold
+OTFname: A-OTF-ShinMGoPro-DeBold.otf
+
+Name: A-OTF-ShinMGoPro-Bold
+PSName: ShinMGoPro-Bold
+Class: Japan
+Provides(20): ShinMGo-Bold
+OTFname: A-OTF-ShinMGoPro-Bold.otf
+
+Name: A-OTF-ShinMGoPro-Heavy
+PSName: ShinMGoPro-Heavy
+Class: Japan
+Provides(20): ShinMGo-Heavy
+OTFname: A-OTF-ShinMGoPro-Heavy.otf
+
+Name: A-OTF-ShinMGoPro-Ultra
+PSName: ShinMGoPro-Ultra
+Class: Japan
+Provides(20): ShinMGo-Ultra
+OTFname: A-OTF-ShinMGoPro-Ultra.otf
+
+Name: A-OTF-MidashiMinPr6N-MA31
+PSName: MidashiMinPr6N-MA31
+Class: Japan
+Provides(10): MidashiMin-MA31
+Provides(10): MidashiMinPro-MA31
+OTFname: A-OTF-MidashiMinPr6N-MA31.otf
+
+Name: A-OTF-MidashiMinPr6-MA31
+PSName: MidashiMinPr6-MA31
+Class: Japan
+Provides(15): MidashiMin-MA31
+OTFname: A-OTF-MidashiMinPr6-MA31.otf
+
+Name: A-OTF-MidashiMinPr5-MA31
+PSName: MidashiMinPr5-MA31
+Class: Japan
+Provides(18): MidashiMin-MA31
+OTFname: A-OTF-MidashiMinPr5-MA31.otf
+
+Name: A-OTF-MidashiMinPro-MA31
+PSName: MidashiMinPro-MA31
+Class: Japan
+Provides(20): MidashiMin-MA31
+OTFname: A-OTF-MidashiMinPro-MA31.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-nanum.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-nanum.dat
new file mode 100644
index 0000000000..533a3d9e99
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-nanum.dat
@@ -0,0 +1,78 @@
+# Nanum (free) (including Nanum MacOS version)
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# Nanum*.ttc (3 files)
+# are bundled with ???.
+
+### KOREAN ###
+
+# note that all fonts have narrow metrics
+
+Name: NanumMyeongjo
+Class: Korea
+TTFname(10): NanumMyeongjo.ttf
+TTCname(20): NanumMyeongjo.ttc(0)
+
+Name: NanumMyeongjoBold
+Class: Korea
+TTFname(10): NanumMyeongjoBold.ttf
+TTCname(20): NanumMyeongjo.ttc(1)
+
+Name: NanumMyeongjoExtraBold
+Class: Korea
+TTFname(10): NanumMyeongjoExtraBold.ttf
+TTCname(20): NanumMyeongjo.ttc(2)
+
+Name: NanumGothic
+Class: Korea
+TTFname(10): NanumGothic.ttf
+TTCname(20): NanumGothic.ttc(0)
+
+Name: NanumGothicBold
+Class: Korea
+TTFname(10): NanumGothicBold.ttf
+TTCname(20): NanumGothic.ttc(1)
+
+Name: NanumGothicExtraBold
+Class: Korea
+TTFname(10): NanumGothicExtraBold.ttf
+TTCname(20): NanumGothic.ttc(2)
+
+Name: NanumGothicLight
+Class: Korea
+TTFname(10): NanumGothicLight.ttf
+
+Name: NanumBarunGothic
+Class: Korea
+TTFname(10): NanumBarunGothic.ttf
+
+Name: NanumBarunGothicBold
+Class: Korea
+TTFname(10): NanumBarunGothicBold.ttf
+
+Name: NanumBarunGothicLight
+Class: Korea
+TTFname(10): NanumBarunGothicLight.ttf
+
+Name: NanumBarunGothicUltraLight
+Class: Korea
+TTFname(10): NanumBarunGothicUltraLight.ttf
+
+Name: NanumBarunpen
+Class: Korea
+TTFname(10): NanumBarunpenR.ttf
+
+Name: NanumBarunpen-Bold
+Class: Korea
+TTFname(10): NanumBarunpenB.ttf
+
+Name: NanumBrush
+Class: Korea
+TTFname(10): NanumBrush.ttf
+TTCname(20): NanumScript.ttc(0)
+
+Name: NanumPen
+Class: Korea
+TTFname(10): NanumPen.ttf
+TTCname(20): NanumScript.ttc(1)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-notosans.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-notosans.dat
new file mode 100644
index 0000000000..d93b43f73f
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-notosans.dat
@@ -0,0 +1,182 @@
+# NotoSans
+
+Name: NotoSansCJKjp-Thin
+Class: Japan
+OTFname(10): NotoSansCJKjp-Thin.otf
+OTCname(20): NotoSansCJK-Thin.ttc(0)
+
+Name: NotoSansCJKjp-Light
+Class: Japan
+OTFname(10): NotoSansCJKjp-Light.otf
+OTCname(20): NotoSansCJK-Light.ttc(0)
+
+Name: NotoSansCJKjp-DemiLight
+Class: Japan
+OTFname(10): NotoSansCJKjp-DemiLight.otf
+OTCname(20): NotoSansCJK-DemiLight.ttc(0)
+
+Name: NotoSansCJKjp-Regular
+Class: Japan
+OTFname(10): NotoSansCJKjp-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(0)
+
+Name: NotoSansCJKjp-Medium
+Class: Japan
+OTFname(10): NotoSansCJKjp-Medium.otf
+OTCname(20): NotoSansCJK-Medium.ttc(0)
+
+Name: NotoSansCJKjp-Bold
+Class: Japan
+OTFname(10): NotoSansCJKjp-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(0)
+
+Name: NotoSansCJKjp-Black
+Class: Japan
+OTFname(10): NotoSansCJKjp-Black.otf
+OTCname(20): NotoSansCJK-Black.ttc(0)
+
+Name: NotoSansCJKkr-Thin
+Class: Korea
+OTFname(10): NotoSansCJKkr-Thin.otf
+OTCname(20): NotoSansCJK-Thin.ttc(1)
+
+Name: NotoSansCJKkr-Light
+Class: Korea
+OTFname(10): NotoSansCJKkr-Light.otf
+OTCname(20): NotoSansCJK-Light.ttc(1)
+
+Name: NotoSansCJKkr-DemiLight
+Class: Korea
+OTFname(10): NotoSansCJKkr-DemiLight.otf
+OTCname(20): NotoSansCJK-DemiLight.ttc(1)
+
+Name: NotoSansCJKkr-Regular
+Class: Korea
+OTFname(10): NotoSansCJKkr-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(1)
+
+Name: NotoSansCJKkr-Medium
+Class: Korea
+OTFname(10): NotoSansCJKkr-Medium.otf
+OTCname(20): NotoSansCJK-Medium.ttc(1)
+
+Name: NotoSansCJKkr-Bold
+Class: Korea
+OTFname(10): NotoSansCJKkr-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(1)
+
+Name: NotoSansCJKkr-Black
+Class: Korea
+OTFname(10): NotoSansCJKkr-Black.otf
+OTCname(20): NotoSansCJK-Black.ttc(1)
+
+Name: NotoSansCJKsc-Thin
+Class: GB
+OTFname(10): NotoSansCJKsc-Thin.otf
+OTCname(20): NotoSansCJK-Thin.ttc(2)
+
+Name: NotoSansCJKsc-Light
+Class: GB
+OTFname(10): NotoSansCJKsc-Light.otf
+OTCname(20): NotoSansCJK-Light.ttc(2)
+
+Name: NotoSansCJKsc-DemiLight
+Class: GB
+OTFname(10): NotoSansCJKsc-DemiLight.otf
+OTCname(20): NotoSansCJK-DemiLight.ttc(2)
+
+Name: NotoSansCJKsc-Regular
+Class: GB
+OTFname(10): NotoSansCJKsc-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(2)
+
+Name: NotoSansCJKsc-Medium
+Class: GB
+OTFname(10): NotoSansCJKsc-Medium.otf
+OTCname(20): NotoSansCJK-Medium.ttc(2)
+
+Name: NotoSansCJKsc-Bold
+Class: GB
+OTFname(10): NotoSansCJKsc-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(2)
+
+Name: NotoSansCJKsc-Black
+Class: GB
+OTFname(10): NotoSansCJKsc-Black.otf
+OTCname(20): NotoSansCJK-Black.ttc(2)
+
+Name: NotoSansCJKtc-Thin
+Class: CNS
+OTFname(10): NotoSansCJKtc-Thin.otf
+OTCname(20): NotoSansCJK-Thin.ttc(3)
+
+Name: NotoSansCJKtc-Light
+Class: CNS
+OTFname(10): NotoSansCJKtc-Light.otf
+OTCname(20): NotoSansCJK-Light.ttc(3)
+
+Name: NotoSansCJKtc-DemiLight
+Class: CNS
+OTFname(10): NotoSansCJKtc-DemiLight.otf
+OTCname(20): NotoSansCJK-DemiLight.ttc(3)
+
+Name: NotoSansCJKtc-Regular
+Class: CNS
+OTFname(10): NotoSansCJKtc-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(3)
+
+Name: NotoSansCJKtc-Medium
+Class: CNS
+OTFname(10): NotoSansCJKtc-Medium.otf
+OTCname(20): NotoSansCJK-Medium.ttc(3)
+
+Name: NotoSansCJKtc-Bold
+Class: CNS
+OTFname(10): NotoSansCJKtc-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(3)
+
+Name: NotoSansCJKtc-Black
+Class: CNS
+OTFname(10): NotoSansCJKtc-Black.otf
+OTCname(20): NotoSansCJK-Black.ttc(3)
+
+Name: NotoSansMonoCJKjp-Regular
+Class: Japan
+OTFname(10): NotoSansMonoCJKjp-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(4)
+
+Name: NotoSansMonoCJKjp-Bold
+Class: Japan
+OTFname(10): NotoSansMonoCJKjp-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(4)
+
+Name: NotoSansMonoCJKkr-Regular
+Class: Korea
+OTFname(10): NotoSansMonoCJKkr-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(5)
+
+Name: NotoSansMonoCJKkr-Bold
+Class: Korea
+OTFname(10): NotoSansMonoCJKkr-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(5)
+
+Name: NotoSansMonoCJKsc-Regular
+Class: GB
+OTFname(10): NotoSansMonoCJKsc-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(6)
+
+Name: NotoSansMonoCJKsc-Bold
+Class: GB
+OTFname(10): NotoSansMonoCJKsc-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(6)
+
+Name: NotoSansMonoCJKtc-Regular
+Class: CNS
+OTFname(10): NotoSansMonoCJKtc-Regular.otf
+OTCname(20): NotoSansCJK-Regular.ttc(7)
+
+Name: NotoSansMonoCJKtc-Bold
+Class: CNS
+OTFname(10): NotoSansMonoCJKtc-Bold.otf
+OTCname(20): NotoSansCJK-Bold.ttc(7)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-notoserif.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-notoserif.dat
new file mode 100644
index 0000000000..e913166807
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-notoserif.dat
@@ -0,0 +1,141 @@
+# NotoSerif
+
+Name: NotoSerifCJKjp-ExtraLight
+Class: Japan
+OTFname(10): NotoSerifCJKjp-ExtraLight.otf
+OTCname(20): NotoSerifCJK-ExtraLight.ttc(0)
+
+Name: NotoSerifCJKjp-Light
+Class: Japan
+OTFname(10): NotoSerifCJKjp-Light.otf
+OTCname(20): NotoSerifCJK-Light.ttc(0)
+
+Name: NotoSerifCJKjp-Regular
+Class: Japan
+OTFname(10): NotoSerifCJKjp-Regular.otf
+OTCname(20): NotoSerifCJK-Regular.ttc(0)
+
+Name: NotoSerifCJKjp-Medium
+Class: Japan
+OTFname(10): NotoSerifCJKjp-Medium.otf
+OTCname(20): NotoSerifCJK-Medium.ttc(0)
+
+Name: NotoSerifCJKjp-SemiBold
+Class: Japan
+OTFname(10): NotoSerifCJKjp-SemiBold.otf
+OTCname(20): NotoSerifCJK-SemiBold.ttc(0)
+
+Name: NotoSerifCJKjp-Bold
+Class: Japan
+OTFname(10): NotoSerifCJKjp-Bold.otf
+OTCname(20): NotoSerifCJK-Bold.ttc(0)
+
+Name: NotoSerifCJKjp-Black
+Class: Japan
+OTFname(10): NotoSerifCJKjp-Black.otf
+OTCname(20): NotoSerifCJK-Black.ttc(0)
+
+Name: NotoSerifCJKkr-ExtraLight
+Class: Korea
+OTFname(10): NotoSerifCJKkr-ExtraLight.otf
+OTCname(20): NotoSerifCJK-ExtraLight.ttc(1)
+
+Name: NotoSerifCJKkr-Light
+Class: Korea
+OTFname(10): NotoSerifCJKkr-Light.otf
+OTCname(20): NotoSerifCJK-Light.ttc(1)
+
+Name: NotoSerifCJKkr-Regular
+Class: Korea
+OTFname(10): NotoSerifCJKkr-Regular.otf
+OTCname(20): NotoSerifCJK-Regular.ttc(1)
+
+Name: NotoSerifCJKkr-Medium
+Class: Korea
+OTFname(10): NotoSerifCJKkr-Medium.otf
+OTCname(20): NotoSerifCJK-Medium.ttc(1)
+
+Name: NotoSerifCJKkr-SemiBold
+Class: Korea
+OTFname(10): NotoSerifCJKkr-SemiBold.otf
+OTCname(20): NotoSerifCJK-SemiBold.ttc(1)
+
+Name: NotoSerifCJKkr-Bold
+Class: Korea
+OTFname(10): NotoSerifCJKkr-Bold.otf
+OTCname(20): NotoSerifCJK-Bold.ttc(1)
+
+Name: NotoSerifCJKkr-Black
+Class: Korea
+OTFname(10): NotoSerifCJKkr-Black.otf
+OTCname(20): NotoSerifCJK-Black.ttc(1)
+
+Name: NotoSerifCJKsc-ExtraLight
+Class: GB
+OTFname(10): NotoSerifCJKsc-ExtraLight.otf
+OTCname(20): NotoSerifCJK-ExtraLight.ttc(2)
+
+Name: NotoSerifCJKsc-Light
+Class: GB
+OTFname(10): NotoSerifCJKsc-Light.otf
+OTCname(20): NotoSerifCJK-Light.ttc(2)
+
+Name: NotoSerifCJKsc-Regular
+Class: GB
+OTFname(10): NotoSerifCJKsc-Regular.otf
+OTCname(20): NotoSerifCJK-Regular.ttc(2)
+
+Name: NotoSerifCJKsc-Medium
+Class: GB
+OTFname(10): NotoSerifCJKsc-Medium.otf
+OTCname(20): NotoSerifCJK-Medium.ttc(2)
+
+Name: NotoSerifCJKsc-SemiBold
+Class: GB
+OTFname(10): NotoSerifCJKsc-SemiBold.otf
+OTCname(20): NotoSerifCJK-SemiBold.ttc(2)
+
+Name: NotoSerifCJKsc-Bold
+Class: GB
+OTFname(10): NotoSerifCJKsc-Bold.otf
+OTCname(20): NotoSerifCJK-Bold.ttc(2)
+
+Name: NotoSerifCJKsc-Black
+Class: GB
+OTFname(10): NotoSerifCJKsc-Black.otf
+OTCname(20): NotoSerifCJK-Black.ttc(2)
+
+Name: NotoSerifCJKtc-ExtraLight
+Class: CNS
+OTFname(10): NotoSerifCJKtc-ExtraLight.otf
+OTCname(20): NotoSerifCJK-ExtraLight.ttc(3)
+
+Name: NotoSerifCJKtc-Light
+Class: CNS
+OTFname(10): NotoSerifCJKtc-Light.otf
+OTCname(20): NotoSerifCJK-Light.ttc(3)
+
+Name: NotoSerifCJKtc-Regular
+Class: CNS
+OTFname(10): NotoSerifCJKtc-Regular.otf
+OTCname(20): NotoSerifCJK-Regular.ttc(3)
+
+Name: NotoSerifCJKtc-Medium
+Class: CNS
+OTFname(10): NotoSerifCJKtc-Medium.otf
+OTCname(20): NotoSerifCJK-Medium.ttc(3)
+
+Name: NotoSerifCJKtc-SemiBold
+Class: CNS
+OTFname(10): NotoSerifCJKtc-SemiBold.otf
+OTCname(20): NotoSerifCJK-SemiBold.ttc(3)
+
+Name: NotoSerifCJKtc-Bold
+Class: CNS
+OTFname(10): NotoSerifCJKtc-Bold.otf
+OTCname(20): NotoSerifCJK-Bold.ttc(3)
+
+Name: NotoSerifCJKtc-Black
+Class: CNS
+OTFname(10): NotoSerifCJKtc-Black.otf
+OTCname(20): NotoSerifCJK-Black.ttc(3)
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-ryokana.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ryokana.dat
new file mode 100644
index 0000000000..9364cc55a2
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ryokana.dat
@@ -0,0 +1,141 @@
+# Ryo PlusN (Kana + Kozuka Std) and Ryo Std (Kana only)
+
+### JAPANESE ###
+
+# Note about Adobe Creative Suite:
+# RyoTextStd: CS1, CS2, CS3
+# RyoTextPlusN: CS4, CS5, CS5.5
+# RyoDispStd: CS1, CS2, CS3, CS4
+# RyoDispPlusN: CS5, CS5.5
+# RyoGothicStd: CS3
+# RyoGothicPlusN: CS4, CS5, CS5.5
+# are bundled in DVD installer/data.
+
+Name: RyoTextPlusN-ExtraLight
+Class: Japan
+OTFname: RyoTextPlusN-ExtraLight.otf
+
+Name: RyoTextPlusN-Light
+Class: Japan
+OTFname: RyoTextPlusN-Light.otf
+
+Name: RyoTextPlusN-Regular
+Class: Japan
+OTFname: RyoTextPlusN-Regular.otf
+
+Name: RyoTextPlusN-Medium
+Class: Japan
+OTFname: RyoTextPlusN-Medium.otf
+
+Name: RyoDispPlusN-Medium
+Class: Japan
+OTFname: RyoDispPlusN-Medium.otf
+
+Name: RyoDispPlusN-SemiBold
+Class: Japan
+OTFname: RyoDispPlusN-SemiBold.otf
+
+Name: RyoDispPlusN-Bold
+Class: Japan
+OTFname: RyoDispPlusN-Bold.otf
+
+Name: RyoDispPlusN-ExtraBold
+Class: Japan
+OTFname: RyoDispPlusN-ExtraBold.otf
+
+Name: RyoDispPlusN-Heavy
+Class: Japan
+OTFname: RyoDispPlusN-Heavy
+
+Name: RyoTextStd-ExtraLight
+Class: Japan
+OTFname: RyoTextStd-ExtraLight.otf
+
+Name: RyoTextStd-Light
+Class: Japan
+OTFname: RyoTextStd-Light.otf
+
+Name: RyoTextStd-Regular
+Class: Japan
+OTFname: RyoTextStd-Regular.otf
+
+Name: RyoTextStd-Medium
+Class: Japan
+OTFname: RyoTextStd-Medium.otf
+
+Name: RyoDispStd-Medium
+Class: Japan
+OTFname: RyoDispStd-Medium.otf
+
+Name: RyoDispStd-SemiBold
+Class: Japan
+OTFname: RyoDispStd-SemiBold.otf
+
+Name: RyoDispStd-Bold
+Class: Japan
+OTFname: RyoDispStd-Bold.otf
+
+Name: RyoDispStd-ExtraBold
+Class: Japan
+OTFname: RyoDispStd-ExtraBold.otf
+
+Name: RyoDispStd-Heavy
+Class: Japan
+OTFname: RyoDispStd-Heavy.otf
+
+Name: RyoGothicPlusN-ExtraLight
+Class: Japan
+OTFname: RyoGothicPlusN-ExtraLight.otf
+
+Name: RyoGothicPlusN-Light
+Class: Japan
+OTFname: RyoGothicPlusN-Light.otf
+
+Name: RyoGothicPlusN-Regular
+Class: Japan
+OTFname: RyoGothicPlusN-Regular.otf
+
+Name: RyoGothicPlusN-Medium
+Class: Japan
+OTFname: RyoGothicPlusN-Medium.otf
+
+Name: RyoGothicPlusN-Bold
+Class: Japan
+OTFname: RyoGothicPlusN-Bold.otf
+
+Name: RyoGothicPlusN-Heavy
+Class: Japan
+OTFname: RyoGothicPlusN-Heavy.otf
+
+Name: RyoGothicPlusN-UltraHeavy
+Class: Japan
+OTFname: RyoGothicPlusN-UltraHeavy.otf
+
+Name: RyoGothicStd-ExtraLight
+Class: Japan
+OTFname: RyoGothicStd-ExtraLight.otf
+
+Name: RyoGothicStd-Light
+Class: Japan
+OTFname: RyoGothicStd-Light.otf
+
+Name: RyoGothicStd-Regular
+Class: Japan
+OTFname: RyoGothicStd-Regular.otf
+
+Name: RyoGothicStd-Medium
+Class: Japan
+OTFname: RyoGothicStd-Medium.otf
+
+Name: RyoGothicStd-Bold
+Class: Japan
+OTFname: RyoGothicStd-Bold.otf
+
+Name: RyoGothicStd-Heavy
+Class: Japan
+OTFname: RyoGothicStd-Heavy.otf
+
+Name: RyoGothicStd-UltraHeavy
+Class: Japan
+OTFname: RyoGothicStd-UltraHeavy.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-sazanami.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sazanami.dat
new file mode 100644
index 0000000000..a8ee6a481e
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sazanami.dat
@@ -0,0 +1,12 @@
+# Sazanami (free)
+
+### JAPANESE ###
+
+Name: Sazanami-Mincho-Regular
+Class: Japan
+TTFname: sazanami-mincho.ttf
+
+Name: Sazanami-Gothic-Regular
+Class: Japan
+TTFname: sazanami-gothic.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-sinotype.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sinotype.dat
new file mode 100644
index 0000000000..37a032391e
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sinotype.dat
@@ -0,0 +1,194 @@
+# Changzhou SinoType
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# STHeiti Light.ttc
+# STHeiti Medium.ttc
+# are bundled with all versions.
+# åŽæ–‡ç»†é»‘.ttf
+# åŽæ–‡é»‘体.ttf
+# åŽæ–‡ä»¿å®‹.ttf
+# are bundled with macOS 10.12.6 Sierra or earlier versions.
+# STXIHEI.ttf
+# STHEITI.ttf
+# STFANGSO.ttf
+# are bundled with macOS 10.13 High Sierra or later versions.
+# åŽæ–‡å®‹ä½“.ttf
+# åŽæ–‡æ¥·ä½“.ttf
+# are bundled with Mac OS X 10.7.5 Lion or earlier versions.
+# 宋体.ttc
+# 楷体.ttc
+# are bundled with OS X 10.8 -- 10.8.5 Mountain Lion.
+# Songti.ttc
+# index 0: STSongti-SC-Black
+# index 1: STSongti-SC-Bold
+# index 2: STSongti-TC-Bold
+# index 3: STSongti-SC-Light
+# index 4: STSong
+# index 5: STSongti-TC-Light
+# index 6: STSongti-SC-Regular
+# index 7: STSongti-TC-Regular
+# is bundled with OS X 10.9 or later versions.
+# Kaiti.ttc
+# index 0: STKaiti-SC-Black
+# index 1: STKaiti-SC-Bold
+# index 2: STKaiTi-TC-Bold
+# index 3: STKaiti-SC-Regular
+# index 4: STKaiti
+# index 5: STKaiTi-TC-Regular
+# is bundled with OS X 10.9 -- 10.11.6 El Capitan.
+# Kaiti.ttc
+# index 0: STKaitiSC-Regular
+# index 1: STKaiti
+# index 2: STKaitiTC-Regular
+# index 3: STKaitiSC-Bold
+# index 4: STKaitiTC-Bold
+# index 5: STKaitiSC-Black
+# index 6: STKaitiTC-Black
+# is bundled with macOS 10.12 Sierra or later versions.
+# Baoli.ttc
+# index 0: STBaoli-SC-Regular
+# Libian.ttc
+# index 0: STLibian-SC-Regular
+# Xingkai.ttc
+# index 0: STXingkai-SC-Bold
+# index 1: STXingkai-SC-Light
+# are bundled with OS X 10.9 Mavericks -- 10.11.6 El Capitan.
+# Baoli.ttc
+# index 0: STBaoliSC-Regular
+# index 1: STBaoliTC-Regular
+# Libian.ttc
+# index 0: STLibianSC-Regular
+# index 1: STLibianTC-Regular
+# Xingkai.ttc
+# index 0: STXingkaiSC-Bold
+# index 1: STXingkaiTC-Bold
+# index 2: STXingkaiSC-Light
+# index 3: STXingkaiTC-Light
+# are bundled with macOS 10.12 Sierra or later versions.
+# Yuanti.ttc
+# index 0: STYuanti-SC-Bold
+# index 1: STYuanti-SC-Light
+# index 2: STYuanti-SC-Regular
+# is bundled with OS X 10.9 Mavericks -- 10.10.5 Yosemite.
+# Yuanti.ttc
+# index 0: STYuanti-SC-Bold
+# index 1: STYuanti-TC-Bold
+# index 2: STYuanti-SC-Light
+# index 3: STYuanti-TC-Light
+# index 4: STYuanti-SC-Regular
+# index 5: STYuanti-TC-Regular
+# is bundled with OS X 10.11 -- 10.11.6 El Capitan.
+# Yuanti.ttc
+# index 0: STYuanti-SC-Regular
+# index 1: STYuanti-TC-Regular
+# index 2: STYuanti-SC-Bold
+# index 3: STYuanti-TC-Bold
+# index 4: STYuanti-SC-Light
+# index 5: STYuanti-TC-Light
+# is bundled with macOS 10.12 Sierra or later versions.
+
+# Note about MSOffice:
+# STZHONGS.ttf
+# STXINWEI.ttf
+# STXINGKA.ttf
+# STLITI.ttf
+# STHUPO.ttf
+# are bundled with Office for Mac 2016.
+
+Name: STSong
+Class: GB
+#Provides(??): STSong-Light # fails
+#Provides(??): STSong-Regular # fails
+TTFname(10): STSong.ttf
+TTFname(11): STSONG.TTF
+TTFname(20): åŽæ–‡å®‹ä½“.ttf
+
+Name: STKaiti
+Class: GB
+#Provides(??): STKaiti-Regular # fails
+TTFname(10): STKaiti.ttf
+TTFname(11): STKAITI.TTF
+TTFname(20): åŽæ–‡æ¥·ä½“.ttf
+
+Name: STKaiti-Adobe-CNS1
+Class: CNS
+#Provides(??): MKai-Medium # fails
+TTFname(10): STKaiti.ttf
+TTFname(11): STKAITI.TTF
+TTFname(20): åŽæ–‡æ¥·ä½“.ttf
+
+Name: STXihei
+Class: GB
+#Provides(??): STHeiti-Light # fails
+TTFname(10): STXihei.ttf
+TTFname(11): STXIHEI.TTF
+TTFname(19): STXIHEI.ttf
+TTFname(20): åŽæ–‡ç»†é»‘.ttf
+
+Name: STHeiti
+Class: GB
+#Provides(??): STHeiti-Regular # fails
+TTFname(10): STHeiti.ttf
+TTFname(19): STHEITI.ttf
+TTFname(20): åŽæ–‡é»‘体.ttf
+
+Name: STFangsong
+Class: GB
+#Provides(??): STFangsong-Light # fails
+#Provides(??): STFangsong-Regular # fails
+TTFname(10): STFangsong.ttf
+TTFname(11): STFANGSO.TTF
+TTFname(19): STFANGSO.ttf
+TTFname(20): åŽæ–‡ä»¿å®‹.ttf
+
+Name: STZhongsong
+Class: GB
+TTFname(11): STZHONGS.TTF
+TTFname(12): STZHONGS.ttf
+
+Name: STXinwei
+Class: GB
+TTFname(11): STXINWEI.TTF
+TTFname(12): STXINWEI.ttf
+
+Name: STXingkai
+Class: GB
+TTFname(11): STXINGKA.TTF
+TTFname(12): STXINGKA.ttf
+
+Name: STLiti
+Class: GB
+TTFname(11): STLITI.TTF
+TTFname(12): STLITI.ttf
+
+Name: STHupo
+Class: GB
+TTFname(11): STHUPO.TTF
+TTFname(12): STHUPO.ttf
+
+Name: STCaiyun
+Class: GB
+TTFname(11): STCAIYUN.TTF
+
+Name: STHeitiSC-Light
+Class: GB
+TTCname(30): STHeiti-Light.ttc(1)
+TTCname(40): STHeiti Light.ttc(1)
+
+Name: STHeitiTC-Light
+Class: CNS
+TTCname(30): STHeiti-Light.ttc(0)
+TTCname(40): STHeiti Light.ttc(0)
+
+Name: STHeitiSC-Medium
+Class: GB
+TTCname(30): STHeiti-Medium.ttc(1)
+TTCname(40): STHeiti Medium.ttc(1)
+
+Name: STHeitiTC-Medium
+Class: CNS
+TTCname(30): STHeiti-Medium.ttc(0)
+TTCname(40): STHeiti Medium.ttc(0)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-solaris.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-solaris.dat
new file mode 100644
index 0000000000..157f84327f
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-solaris.dat
@@ -0,0 +1,33 @@
+# Solaris
+
+# All these fonts are bundled with Solaris 10, 11.
+
+### KOREAN ###
+
+Name: Myeongjo
+Class: Korea
+Provides(40): HYSMyeongJo-Medium
+TTFname: h2mjsm.ttf
+
+Name: Gothic
+Class: Korea
+Provides(40): HYGoThic-Medium
+TTFname: h2gtrm.ttf
+
+Name: RoundedGothic
+Class: Korea
+Provides(40): HYRGoThic-Medium
+TTFname: h2drrm.ttf
+
+Name: Haeseo
+Class: Korea
+TTFname: h2hsrm.ttf
+
+Name: SunDotum
+Class: Korea
+TTFname: sundotump.ttf
+
+Name: SunDotumChe
+Class: Korea
+TTFname: sundotumf.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehansans.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehansans.dat
new file mode 100644
index 0000000000..e480b7dc6b
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehansans.dat
@@ -0,0 +1,182 @@
+# SourceHanSans
+
+Name: SourceHanSans-ExtraLight
+Class: Japan
+OTFname(10): SourceHanSans-ExtraLight.otf
+OTCname(20): SourceHanSans-ExtraLight.ttc(0)
+
+Name: SourceHanSans-Light
+Class: Japan
+OTFname(10): SourceHanSans-Light.otf
+OTCname(20): SourceHanSans-Light.ttc(0)
+
+Name: SourceHanSans-Normal
+Class: Japan
+OTFname(10): SourceHanSans-Normal.otf
+OTCname(20): SourceHanSans-Normal.ttc(0)
+
+Name: SourceHanSans-Regular
+Class: Japan
+OTFname(10): SourceHanSans-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(0)
+
+Name: SourceHanSans-Medium
+Class: Japan
+OTFname(10): SourceHanSans-Medium.otf
+OTCname(20): SourceHanSans-Medium.ttc(0)
+
+Name: SourceHanSans-Bold
+Class: Japan
+OTFname(10): SourceHanSans-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(0)
+
+Name: SourceHanSans-Heavy
+Class: Japan
+OTFname(10): SourceHanSans-Heavy.otf
+OTCname(20): SourceHanSans-Heavy.ttc(0)
+
+Name: SourceHanSansK-ExtraLight
+Class: Korea
+OTFname(10): SourceHanSansK-ExtraLight.otf
+OTCname(20): SourceHanSans-ExtraLight.ttc(1)
+
+Name: SourceHanSansK-Light
+Class: Korea
+OTFname(10): SourceHanSansK-Light.otf
+OTCname(20): SourceHanSans-Light.ttc(1)
+
+Name: SourceHanSansK-Normal
+Class: Korea
+OTFname(10): SourceHanSansK-Normal.otf
+OTCname(20): SourceHanSans-Normal.ttc(1)
+
+Name: SourceHanSansK-Regular
+Class: Korea
+OTFname(10): SourceHanSansK-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(1)
+
+Name: SourceHanSansK-Medium
+Class: Korea
+OTFname(10): SourceHanSansK-Medium.otf
+OTCname(20): SourceHanSans-Medium.ttc(1)
+
+Name: SourceHanSansK-Bold
+Class: Korea
+OTFname(10): SourceHanSansK-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(1)
+
+Name: SourceHanSansK-Heavy
+Class: Korea
+OTFname(10): SourceHanSansK-Heavy.otf
+OTCname(20): SourceHanSans-Heavy.ttc(1)
+
+Name: SourceHanSansSC-ExtraLight
+Class: GB
+OTFname(10): SourceHanSansSC-ExtraLight.otf
+OTCname(20): SourceHanSans-ExtraLight.ttc(2)
+
+Name: SourceHanSansSC-Light
+Class: GB
+OTFname(10): SourceHanSansSC-Light.otf
+OTCname(20): SourceHanSans-Light.ttc(2)
+
+Name: SourceHanSansSC-Normal
+Class: GB
+OTFname(10): SourceHanSansSC-Normal.otf
+OTCname(20): SourceHanSans-Normal.ttc(2)
+
+Name: SourceHanSansSC-Regular
+Class: GB
+OTFname(10): SourceHanSansSC-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(2)
+
+Name: SourceHanSansSC-Medium
+Class: GB
+OTFname(10): SourceHanSansSC-Medium.otf
+OTCname(20): SourceHanSans-Medium.ttc(2)
+
+Name: SourceHanSansSC-Bold
+Class: GB
+OTFname(10): SourceHanSansSC-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(2)
+
+Name: SourceHanSansSC-Heavy
+Class: GB
+OTFname(10): SourceHanSansSC-Heavy.otf
+OTCname(20): SourceHanSans-Heavy.ttc(2)
+
+Name: SourceHanSansTC-ExtraLight
+Class: CNS
+OTFname(10): SourceHanSansTC-ExtraLight.otf
+OTCname(20): SourceHanSans-ExtraLight.ttc(3)
+
+Name: SourceHanSansTC-Light
+Class: CNS
+OTFname(10): SourceHanSansTC-Light.otf
+OTCname(20): SourceHanSans-Light.ttc(3)
+
+Name: SourceHanSansTC-Normal
+Class: CNS
+OTFname(10): SourceHanSansTC-Normal.otf
+OTCname(20): SourceHanSans-Normal.ttc(3)
+
+Name: SourceHanSansTC-Regular
+Class: CNS
+OTFname(10): SourceHanSansTC-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(3)
+
+Name: SourceHanSansTC-Medium
+Class: CNS
+OTFname(10): SourceHanSansTC-Medium.otf
+OTCname(20): SourceHanSans-Medium.ttc(3)
+
+Name: SourceHanSansTC-Bold
+Class: CNS
+OTFname(10): SourceHanSansTC-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(3)
+
+Name: SourceHanSansTC-Heavy
+Class: CNS
+OTFname(10): SourceHanSansTC-Heavy.otf
+OTCname(20): SourceHanSans-Heavy.ttc(3)
+
+Name: SourceHanSansHW-Regular
+Class: Japan
+OTFname(10): SourceHanSansHW-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(4)
+
+Name: SourceHanSansHW-Bold
+Class: Japan
+OTFname(10): SourceHanSansHW-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(4)
+
+Name: SourceHanSansHWK-Regular
+Class: Korea
+OTFname(10): SourceHanSansHWK-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(5)
+
+Name: SourceHanSansHWK-Bold
+Class: Korea
+OTFname(10): SourceHanSansHWK-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(5)
+
+Name: SourceHanSansHWSC-Regular
+Class: GB
+OTFname(10): SourceHanSansHWSC-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(6)
+
+Name: SourceHanSansHWSC-Bold
+Class: GB
+OTFname(10): SourceHanSansHWSC-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(6)
+
+Name: SourceHanSansHWTC-Regular
+Class: CNS
+OTFname(10): SourceHanSansHWTC-Regular.otf
+OTCname(20): SourceHanSans-Regular.ttc(7)
+
+Name: SourceHanSansHWTC-Bold
+Class: CNS
+OTFname(10): SourceHanSansHWTC-Bold.otf
+OTCname(20): SourceHanSans-Bold.ttc(7)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehanserif.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehanserif.dat
new file mode 100644
index 0000000000..a3c3ec1bee
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-sourcehanserif.dat
@@ -0,0 +1,142 @@
+# SourceHanSerif
+
+Name: SourceHanSerif-ExtraLight
+Class: Japan
+OTFname(10): SourceHanSerif-ExtraLight.otf
+OTCname(20): SourceHanSerif-ExtraLight.ttc(0)
+
+Name: SourceHanSerif-Light
+Class: Japan
+OTFname(10): SourceHanSerif-Light.otf
+OTCname(20): SourceHanSerif-Light.ttc(0)
+
+Name: SourceHanSerif-Regular
+Class: Japan
+OTFname(10): SourceHanSerif-Regular.otf
+OTCname(20): SourceHanSerif-Regular.ttc(0)
+
+Name: SourceHanSerif-Medium
+Class: Japan
+OTFname(10): SourceHanSerif-Medium.otf
+OTCname(20): SourceHanSerif-Medium.ttc(0)
+
+Name: SourceHanSerif-SemiBold
+Class: Japan
+OTFname(10): SourceHanSerif-SemiBold.otf
+OTCname(20): SourceHanSerif-SemiBold.ttc(0)
+
+Name: SourceHanSerif-Bold
+Class: Japan
+OTFname(10): SourceHanSerif-Bold.otf
+OTCname(20): SourceHanSerif-Bold.ttc(0)
+
+Name: SourceHanSerif-Heavy
+Class: Japan
+OTFname(10): SourceHanSerif-Heavy.otf
+OTCname(20): SourceHanSerif-Heavy.ttc(0)
+
+Name: SourceHanSerifK-ExtraLight
+Class: Korea
+OTFname(10): SourceHanSerifK-ExtraLight.otf
+OTCname(20): SourceHanSerif-ExtraLight.ttc(1)
+
+Name: SourceHanSerifK-Light
+Class: Korea
+OTFname(10): SourceHanSerifK-Light.otf
+OTCname(20): SourceHanSerif-Light.ttc(1)
+
+Name: SourceHanSerifK-Regular
+Class: Korea
+OTFname(10): SourceHanSerifK-Regular.otf
+OTCname(20): SourceHanSerif-Regular.ttc(1)
+
+Name: SourceHanSerifK-Medium
+Class: Korea
+OTFname(10): SourceHanSerifK-Medium.otf
+OTCname(20): SourceHanSerif-Medium.ttc(1)
+
+Name: SourceHanSerifK-SemiBold
+Class: Korea
+OTFname(10): SourceHanSerifK-SemiBold.otf
+OTCname(20): SourceHanSerif-SemiBold.ttc(1)
+
+Name: SourceHanSerifK-Bold
+Class: Korea
+OTFname(10): SourceHanSerifK-Bold.otf
+OTCname(20): SourceHanSerif-Bold.ttc(1)
+
+Name: SourceHanSerifK-Heavy
+Class: Korea
+OTFname(10): SourceHanSerifK-Heavy.otf
+OTCname(20): SourceHanSerif-Heavy.ttc(1)
+
+Name: SourceHanSerifSC-ExtraLight
+Class: GB
+OTFname(10): SourceHanSerifSC-ExtraLight.otf
+OTCname(20): SourceHanSerif-ExtraLight.ttc(2)
+
+Name: SourceHanSerifSC-Light
+Class: GB
+OTFname(10): SourceHanSerifSC-Light.otf
+OTCname(20): SourceHanSerif-Light.ttc(2)
+
+Name: SourceHanSerifSC-Regular
+Class: GB
+OTFname(10): SourceHanSerifSC-Regular.otf
+OTCname(20): SourceHanSerif-Regular.ttc(2)
+
+Name: SourceHanSerifSC-Medium
+Class: GB
+OTFname(10): SourceHanSerifSC-Medium.otf
+OTCname(20): SourceHanSerif-Medium.ttc(2)
+
+Name: SourceHanSerifSC-SemiBold
+Class: GB
+OTFname(10): SourceHanSerifSC-SemiBold.otf
+OTCname(20): SourceHanSerif-SemiBold.ttc(2)
+
+Name: SourceHanSerifSC-Bold
+Class: GB
+OTFname(10): SourceHanSerifSC-Bold.otf
+OTCname(20): SourceHanSerif-Bold.ttc(2)
+
+Name: SourceHanSerifSC-Heavy
+Class: GB
+OTFname(10): SourceHanSerifSC-Heavy.otf
+OTCname(20): SourceHanSerif-Heavy.ttc(2)
+
+Name: SourceHanSerifTC-ExtraLight
+Class: CNS
+OTFname(10): SourceHanSerifTC-ExtraLight.otf
+OTCname(20): SourceHanSerif-ExtraLight.ttc(3)
+
+Name: SourceHanSerifTC-Light
+Class: CNS
+OTFname(10): SourceHanSerifTC-Light.otf
+OTCname(20): SourceHanSerif-Light.ttc(3)
+
+Name: SourceHanSerifTC-Regular
+Class: CNS
+OTFname(10): SourceHanSerifTC-Regular.otf
+OTCname(20): SourceHanSerif-Regular.ttc(3)
+
+Name: SourceHanSerifTC-Medium
+Class: CNS
+OTFname(10): SourceHanSerifTC-Medium.otf
+OTCname(20): SourceHanSerif-Medium.ttc(3)
+
+Name: SourceHanSerifTC-SemiBold
+Class: CNS
+OTFname(10): SourceHanSerifTC-SemiBold.otf
+OTCname(20): SourceHanSerif-SemiBold.ttc(3)
+
+Name: SourceHanSerifTC-Bold
+Class: CNS
+OTFname(10): SourceHanSerifTC-Bold.otf
+OTCname(20): SourceHanSerif-Bold.ttc(3)
+
+Name: SourceHanSerifTC-Heavy
+Class: CNS
+OTFname(10): SourceHanSerifTC-Heavy.otf
+OTCname(20): SourceHanSerif-Heavy.ttc(3)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-toppan.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-toppan.dat
new file mode 100644
index 0000000000..f4bc4a54fa
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-toppan.dat
@@ -0,0 +1,69 @@
+# Toppan (including Fontworks MacOS version)
+
+### JAPANESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# ToppanBunkyuMincho-Regular.otf
+# ToppanBunkyuGothic.ttc
+# ToppanBunkyuMidashiMincho-ExtraBold.otf
+# ToppanBunkyuMidashiGothic-ExtraBold.otf
+# are bundled with macOS 10.12 -- 10.12.6 Sierra.
+# ToppanBunkyuMinchoPr6N-Regular.otf
+# ToppanBunkyuGothicPr6N.ttc
+# ToppanBunkyuMidashiMinchoStdN-ExtraBold.otf
+# ToppanBunkyuMidashiGothicStdN-ExtraBold.otf
+# are bundled with macOS 10.13 High Sierra or later versions.
+
+# based on Morisawa Passport
+# ("P" stands for pair kerning)
+
+Name: AP-OTF-BunkyuMinPr6N-R
+PSName: PBunkyuMinPr6N-R
+Class: Japan
+OTFname: AP-OTF-BunkyuMinPr6N-R.otf
+
+Name: AP-OTF-BunkyuMinPr6-R
+PSName: PBunkyuMinPr6-R
+Class: Japan
+OTFname: AP-OTF-BunkyuMinPr6-R.otf
+
+Name: AP-OTF-BunkyuMdMinStdN-EB
+PSName: PBunkyuMdMinStdN-EB
+Class: Japan
+OTFname: AP-OTF-BunkyuMdMinStdN-EB.otf
+
+Name: AP-OTF-BunkyuMdMinStd-EB
+PSName: PBunkyuMdMinStd-EB
+Class: Japan
+OTFname: AP-OTF-BunkyuMdMinStd-EB.otf
+
+Name: AP-OTF-BunkyuGoPr6N-DB
+PSName: PBunkyuGoPr6N-DB
+Class: Japan
+OTFname: AP-OTF-BunkyuGoPr6N-DB.otf
+
+Name: AP-OTF-BunkyuGoPr6N-R
+PSName: PBunkyuGoPr6N-R
+Class: Japan
+OTFname: AP-OTF-BunkyuGoPr6N-R.otf
+
+Name: AP-OTF-BunkyuGoPr6-DB
+PSName: PBunkyuGoPr6-DB
+Class: Japan
+OTFname: AP-OTF-BunkyuGoPr6-DB.otf
+
+Name: AP-OTF-BunkyuGoPr6-R
+PSName: PBunkyuGoPr6-R
+Class: Japan
+OTFname: AP-OTF-BunkyuGoPr6-R.otf
+
+Name: AP-OTF-BunkyuMdGoStdN-EB
+PSName: PBunkyuMdGoStdN-EB
+Class: Japan
+OTFname: AP-OTF-BunkyuMdGoStdN-EB.otf
+
+Name: AP-OTF-BunkyuMdGoStd-EB
+PSName: PBunkyuMdGoStd-EB
+Class: Japan
+OTFname: AP-OTF-BunkyuMdGoStd-EB.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-typebank.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-typebank.dat
new file mode 100644
index 0000000000..d0fac9c1f7
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-typebank.dat
@@ -0,0 +1,33 @@
+# TypeBank
+
+### JAPANESE ###
+
+# Note about Windows:
+# UDDigiKyokashoN-R.ttc
+# UDDigiKyokashoN-B.ttc
+# are bundled with Windows 10 (Fall Creators Update).
+
+Name: UDDigiKyokashoN-R
+Class: Japan
+TTCname: UDDigiKyokashoN-R.ttc(0)
+
+Name: UDDigiKyokashoNP-R
+Class: Japan
+TTCname: UDDigiKyokashoN-R.ttc(1)
+
+Name: UDDigiKyokashoNK-R
+Class: Japan
+TTCname: UDDigiKyokashoN-R.ttc(2)
+
+Name: UDDigiKyokashoN-B
+Class: Japan
+TTCname: UDDigiKyokashoN-B.ttc(0)
+
+Name: UDDigiKyokashoNP-B
+Class: Japan
+TTCname: UDDigiKyokashoN-B.ttc(1)
+
+Name: UDDigiKyokashoNK-B
+Class: Japan
+TTCname: UDDigiKyokashoN-B.ttc(2)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-ume.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ume.dat
new file mode 100644
index 0000000000..dc0e129b8f
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-ume.dat
@@ -0,0 +1,106 @@
+# Ume-font (free)
+
+### JAPANESE ###
+
+# Note:
+# in the current release (2016-09-03 umefont_660.7z),
+# ume-tms.ttf and ume-pms.ttf ("studybook" family) share the same PSName
+# as ume-tmo.ttf and ume-pmo.ttf; we don't add these database
+# intentionally -- HY (2017/01/17)
+
+Name: Ume-Mincho
+Class: Japan
+Provides(140): Ryumin-Light
+Provides(140): RyuminPro-Light
+Provides(140): HiraMinProN-W3
+Provides(140): HiraMinPro-W3
+Provides(140): FutoMinA101-Bold
+Provides(140): FutoMinA101Pro-Bold
+Provides(140): HiraMinProN-W6
+Provides(140): HiraMinPro-W6
+Provides(140): MidashiMin-MA31
+Provides(140): MidashiMinPro-MA31
+TTFname(10): ume-tmo3.ttf
+#TTFname(11): ume-tms3.ttf
+
+Name: Ume-Gothic
+Class: Japan
+Provides(140): GothicBBB-Medium
+Provides(140): GothicBBBPro-Medium
+Provides(140): HiraKakuProN-W3
+Provides(140): HiraKakuPro-W3
+Provides(140): FutoGoB101-Bold
+Provides(140): FutoGoB101Pro-Bold
+Provides(140): HiraKakuProN-W6
+Provides(140): HiraKakuPro-W6
+Provides(140): MidashiGo-MB31
+Provides(140): MidashiGoPro-MB31
+Provides(140): HiraKakuStdN-W8
+Provides(140): HiraKakuStd-W8
+Provides(140): Jun101-Light
+Provides(140): Jun101Pro-Light
+Provides(140): HiraMaruProN-W4
+Provides(140): HiraMaruPro-W4
+TTFname(10): ume-tgo4.ttf
+
+Name: Ume-Gothic-O5
+Class: Japan
+TTFname(10): ume-tgo5.ttf
+
+Name: Ume-Gothic-C4
+Class: Japan
+TTFname(10): ume-tgc4.ttf
+
+Name: Ume-Gothic-C5
+Class: Japan
+TTFname(10): ume-tgc5.ttf
+
+Name: Ume-Gothic-S4
+Class: Japan
+TTFname(10): ume-tgs4.ttf
+
+Name: Ume-Gothic-S5
+Class: Japan
+TTFname(10): ume-tgs5.ttf
+
+Name: Ume-P-Mincho
+Class: Japan
+TTFname(10): ume-pmo3.ttf
+#TTFname(11): ume-pms3.ttf
+
+Name: Ume-P-Gothic
+Class: Japan
+TTFname(10): ume-pgo4.ttf
+
+Name: Ume-P-Gothic-O5
+Class: Japan
+TTFname(10): ume-pgo5.ttf
+
+Name: Ume-P-Gothic-C4
+Class: Japan
+TTFname(10): ume-pgc4.ttf
+
+Name: Ume-P-Gothic-C5
+Class: Japan
+TTFname(10): ume-pgc5.ttf
+
+Name: Ume-P-Gothic-S4
+Class: Japan
+TTFname(10): ume-pgs4.ttf
+
+Name: Ume-P-Gothic-S5
+Class: Japan
+TTFname(10): ume-pgs5.ttf
+
+Name: Ume-UI-Gothic
+Class: Japan
+TTFname(10): ume-ugo4.ttf
+
+Name: Ume-UI-Gothic-O5
+Class: Japan
+TTFname(10): ume-ugo5.ttf
+
+Name: Ume-Hy-Gothic
+Class: Japan
+TTFname(10): ume-hgo4.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-unfonts.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-unfonts.dat
new file mode 100644
index 0000000000..1b1201b478
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-unfonts.dat
@@ -0,0 +1,112 @@
+# Unfonts (free)
+
+### KOREAN ###
+
+# Note about TeX Live:
+# Un*.ttf (23 files, excluding UnBom.ttf for license issue)
+# are available as "unfonts-{core,extra}" package for free.
+
+# Unfonts-core (free)
+
+Name: UnBatang
+Class: Korea
+Provides(60): HYSMyeongJo-Medium
+TTFname: UnBatang.ttf
+
+Name: UnBatang-Bold
+Class: Korea
+TTFname: UnBatangBold.ttf
+
+Name: UnDotum
+Class: Korea
+Provides(60): HYGoThic-Medium
+TTFname: UnDotum.ttf
+
+Name: UnDotum-Bold
+Class: Korea
+TTFname: UnDotumBold.ttf
+
+Name: UnDinaru
+Class: Korea
+Provides(60): HYRGoThic-Medium
+TTFname: UnDinaru.ttf
+
+Name: UnDinaru-Bold
+Class: Korea
+TTFname: UnDinaruBold.ttf
+
+Name: UnDinaru-Light
+Class: Korea
+TTFname: UnDinaruLight.ttf
+
+Name: UnGraphic
+Class: Korea
+TTFname: UnGraphic.ttf
+
+Name: UnGraphic-Bold
+Class: Korea
+TTFname: UnGraphicBold.ttf
+
+Name: UnGungseo
+Class: Korea
+TTFname: UnGungseo.ttf
+
+Name: UnPilgi
+Class: Korea
+TTFname: UnPilgi.ttf
+
+Name: UnPilgi-Bold
+Class: Korea
+TTFname: UnPilgiBold.ttf
+
+# Unfonts-extra (free)
+
+#Name: UnBom
+#Class: Korea
+#TTFname: UnBom.ttf
+
+Name: UnPen
+Class: Korea
+TTFname: UnPen.ttf
+
+Name: UnPenheulim
+Class: Korea
+TTFname: UnPenheulim.ttf
+
+Name: UnPilgia
+Class: Korea
+TTFname: UnPilgia.ttf
+
+Name: UnShinmun
+Class: Korea
+TTFname: UnShinmun.ttf
+
+Name: UnVada
+Class: Korea
+TTFname: UnVada.ttf
+
+Name: UnYetgul
+Class: Korea
+TTFname: UnYetgul.ttf
+
+Name: UnTaza
+Class: Korea
+TTFname: UnTaza.ttf
+
+# UnJamo... family has proportional metrics
+Name: UnJamoBatang
+Class: Korea
+TTFname: UnJamoBatang.ttf
+
+Name: UnJamoDotum
+Class: Korea
+TTFname: UnJamoDotum.ttf
+
+Name: UnJamoNovel
+Class: Korea
+TTFname: UnJamoNovel.ttf
+
+Name: UnJamoSora
+Class: Korea
+TTFname: UnJamoSora.ttf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-wenquanyi.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-wenquanyi.dat
new file mode 100644
index 0000000000..8d0f2264a8
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-wenquanyi.dat
@@ -0,0 +1,56 @@
+# WenQuanYi (free)
+
+### SIMPLIFIED/TRADITIONAL CHINESE ###
+
+# GB
+Name: WenQuanYiMicroHei
+Class: GB
+TTCname(10): wqy-microhei.ttc(0)
+
+# CNS
+Name: WenQuanYiMicroHei-Adobe-CNS1
+Class: CNS
+TTCname(10): wqy-microhei.ttc(0)
+
+# GB
+Name: WenQuanYiMicroHeiMono
+Class: GB
+TTCname(10): wqy-microhei.ttc(1)
+
+# CNS
+Name: WenQuanYiMicroHeiMono-Adobe-CNS1
+Class: CNS
+TTCname(10): wqy-microhei.ttc(1)
+
+# GB
+Name: WenQuanYiZenHei
+Class: GB
+TTCname(10): wqy-zenhei.ttc(0)
+TTFname(20): wqy-zenhei.ttf
+
+# CNS
+Name: WenQuanYiZenHei-Adobe-CNS1
+Class: CNS
+TTCname(10): wqy-zenhei.ttc(0)
+TTFname(20): wqy-zenhei.ttf
+
+# GB
+Name: WenQuanYiZenHeiMono
+Class: GB
+TTCname(10): wqy-zenhei.ttc(1)
+
+# CNS:
+Name: WenQuanYiZenHeiMono-Adobe-CNS1
+Class: CNS
+TTCname(10): wqy-zenhei.ttc(1)
+
+# GB
+Name: WenQuanYiZenHeiSharp
+Class: GB
+TTCname(10): wqy-zenhei.ttc(2)
+
+# CNS
+Name: WenQuanYiZenHeiSharp-Adobe-CNS1
+Class: CNS
+TTCname(10): wqy-zenhei.ttc(2)
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-osx.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-osx.dat
new file mode 100644
index 0000000000..68866fe2f9
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-osx.dat
@@ -0,0 +1,79 @@
+# Yu-fonts MacOS version
+
+### JAPANESE ###
+
+# Note about Mac (Mac OS X 10.6 -- macOS 10.13)
+# Yu Gothic Medium.otf
+# Yu Gothic Bold.otf
+# are bundled with OS X 10.9 Mavericks -- macOS 10.12.6 Sierra.
+# YuGothic-Medium.otf
+# YuGothic-Bold.otf
+# are bundled with macOS 10.13 High Sierra or later versions.
+# Yu Mincho Medium.otf
+# Yu Mincho Demibold.otf
+# are bundled with OS X 10.9 Mavericks -- 10.10.5 Yosemite.
+# YuMincho.ttc
+# index 0: YuMin-Medium
+# index 1: YuMin-Demibold
+# index 2: YuMin_36pKn-Medium
+# index 3: YuMin_36pKn-Demibold
+# is bundled with OS X 10.11 -- 10.11.6 El Capitan.
+# YuMincho.ttc
+# index 0: YuMin-Medium
+# index 1: YuMin-Demibold
+# index 2: YuMin-Extrabold
+# index 3: YuMin_36pKn-Medium
+# index 4: YuMin_36pKn-Demibold
+# index 5: YuMin_36pKn-Extrabold
+# is bundled with macOS 10.12 Sierra or later versions.
+# Kyokasho.ttc
+# is bundled with macOS 10.12 Sierra or later versions.
+
+Name: YuMin-Medium
+Class: Japan
+Provides(80): Ryumin-Light
+Provides(80): RyuminPro-Light
+Provides(80): HiraMinProN-W3
+Provides(80): HiraMinPro-W3
+OTFname(20): Yu Mincho Medium.otf
+OTFname(10): YuMin-Medium.otf
+
+Name: YuMin-Demibold
+Class: Japan
+Provides(80): FutoMinA101-Bold
+Provides(80): FutoMinA101Pro-Bold
+Provides(80): HiraMinProN-W6
+Provides(80): HiraMinPro-W6
+Provides(80): MidashiMin-MA31
+Provides(80): MidashiMinPro-MA31
+OTFname(20): Yu Mincho Demibold.otf
+OTFname(10): YuMin-Demibold.otf
+
+Name: YuGo-Medium
+Class: Japan
+Provides(80): GothicBBB-Medium
+Provides(80): GothicBBBPro-Medium
+Provides(80): HiraKakuProN-W3
+Provides(80): HiraKakuPro-W3
+OTFname(20): Yu Gothic Medium.otf
+OTFname(19): YuGothic-Medium.otf
+OTFname(10): YuGo-Medium.otf
+
+Name: YuGo-Bold
+Class: Japan
+Provides(80): FutoGoB101-Bold
+Provides(80): FutoGoB101Pro-Bold
+Provides(80): HiraKakuProN-W6
+Provides(80): HiraKakuPro-W6
+Provides(80): MidashiGo-MB31
+Provides(80): MidashiGoPro-MB31
+Provides(80): HiraKakuStdN-W8
+Provides(80): HiraKakuStd-W8
+Provides(80): Jun101-Light
+Provides(80): Jun101Pro-Light
+Provides(80): HiraMaruProN-W4
+Provides(80): HiraMaruPro-W4
+OTFname(20): Yu Gothic Bold.otf
+OTFname(19): YuGothic-Bold.otf
+OTFname(10): YuGo-Bold.otf
+
diff --git a/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-win.dat b/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-win.dat
new file mode 100644
index 0000000000..34d2e1be6f
--- /dev/null
+++ b/fonts/utilities/cjk-gs-integrate/database/cjkgs-yu-win.dat
@@ -0,0 +1,119 @@
+# Yu-fonts Windows/MSOffice version
+
+### JAPANESE ###
+
+# Note about Windows:
+# yugothi{b,c,l}.ttf
+# yumin.ttf, yumin{db,l}.ttf
+# are bundled with Windows 8.1.
+# YuGoth{B,L,M,R}.ttc
+# yumin.ttf, yumin{db,l}.ttf
+# are bundled with Windows 10.
+# YUGOTH{B,L,M,R}.TTC
+# YUMIN.TTF, YUMIN{DB,L}.TTF
+# are bundled with "Yu Font Pack for MSOffice 2010/2013".
+# YuGothic.ttf
+# YuGothic-Bold.ttf
+# are bundled with VS2013 or later versions.
+
+# Note about MSOffice:
+# YuGoth{B,L,M,R}.ttf
+# yumin.ttf, yumin{db,l}.ttf
+# are bundled with Office for Mac 2016.
+
+# In the following database, Yu Font Pack entries do not appear
+# as separate lines, but they are implied by Windows 10 entries
+# since win32 is case-insensitive.
+# Currently we don't add VS2013 YuGothic.ttf (YuGothic) and
+# YuGothic-Bold.ttf (YuGothic-Bold) on purpose, because these files
+# are smaller than Windows 8.1 yugothic.ttf and yugothib.ttf
+
+Name: YuMincho-Regular
+Class: Japan
+Provides(90): Ryumin-Light
+Provides(90): RyuminPro-Light
+Provides(90): HiraMinProN-W3
+Provides(90): HiraMinPro-W3
+TTFname(20): yumin.ttf
+#TTFname(50): YuMincho-Regular.ttf # never existed
+
+Name: YuMincho-Light
+Class: Japan
+TTFname(20): yuminl.ttf
+#TTFname(50): YuMincho-Light.ttf # never existed
+
+Name: YuMincho-DemiBold
+Class: Japan
+Provides(90): FutoMinA101-Bold
+Provides(90): FutoMinA101Pro-Bold
+Provides(90): HiraMinProN-W6
+Provides(90): HiraMinPro-W6
+Provides(90): MidashiMin-MA31
+Provides(90): MidashiMinPro-MA31
+TTFname(20): yumindb.ttf
+#TTFname(50): YuMincho-DemiBold.ttf # never existed
+
+Name: YuGothic-Regular
+Class: Japan
+Provides(90): GothicBBB-Medium
+Provides(90): GothicBBBPro-Medium
+Provides(90): HiraKakuProN-W3
+Provides(90): HiraKakuPro-W3
+TTFname(25): yugothic.ttf
+TTCname(20): YuGothR.ttc(0)
+TTFname(40): YuGothR.ttf
+#TTFname(50): YuGothic-Regular.ttf # never existed
+
+Name: YuGothic-Medium
+Class: Japan
+TTCname(20): YuGothM.ttc(0)
+TTFname(40): YuGothM.ttf
+
+Name: YuGothic-Light
+Class: Japan
+TTFname(25): yugothil.ttf
+TTCname(20): YuGothL.ttc(0)
+TTFname(40): YuGothL.ttf
+#TTFname(50): YuGothic-Light.ttf # never existed
+
+Name: YuGothic-Bold
+Class: Japan
+Provides(90): FutoGoB101-Bold
+Provides(90): FutoGoB101Pro-Bold
+Provides(90): HiraKakuProN-W6
+Provides(90): HiraKakuPro-W6
+Provides(90): MidashiGo-MB31
+Provides(90): MidashiGoPro-MB31
+Provides(90): HiraKakuStdN-W8
+Provides(90): HiraKakuStd-W8
+Provides(90): Jun101-Light
+Provides(90): Jun101Pro-Light
+Provides(90): HiraMaruProN-W4
+Provides(90): HiraMaruPro-W4
+TTFname(25): yugothib.ttf
+TTCname(20): YuGothB.ttc(0)
+TTFname(40): YuGothB.ttf
+#TTFname(50): YuGothic-Bold.ttf
+
+# Yu-UI-fonts (Windows only)
+
+Name: YuGothicUI-Semilight
+Class: Japan
+TTCname(20): YuGothR.ttc(1)
+
+Name: YuGothicUI-Regular
+Class: Japan
+TTCname(20): YuGothM.ttc(1)
+
+Name: YuGothicUI-Light
+Class: Japan
+TTCname(20): YuGothL.ttc(1)
+
+Name: YuGothicUI-Bold
+Class: Japan
+TTCname(20): YuGothB.ttc(1)
+
+Name: YuGothicUI-Semibold
+Class: Japan
+TTCname(20): YuGothB.ttc(2)
+
diff --git a/fonts/utilities/corelfonts/README b/fonts/utilities/corelfonts/README
new file mode 100644
index 0000000000..3d3f179c2b
--- /dev/null
+++ b/fonts/utilities/corelfonts/README
@@ -0,0 +1,63 @@
+NAME
+corelfonts
+
+DESCRIPTION
+The file corelfonts is a perl script which will install all the PostScript
+Type 1 fonts supplied on the Corel Ventura 5 CD (and probably with other
+versions of Corel Ventura and Corel Draw). These fonts are from Bitstream.
+Running this script will copy the afm and pfb files from the Corel CD and
+run fontinst on them to create tfm, vf, fd and sty files for use with
+LaTeX. The fonts, font descriptions and LaTeX package files are installed
+to subdirectories in your TeXMF tree.
+
+INSTALLATION
+Installation is simply a matter of running the script with perl and telling
+your tex system about the new fonts and packages. The instructions here work
+for teTeX running on FreeBSD 4.7 and fpTeX running on Windows XP, but they
+ought to work with minor variations on other systems.
+
+ Unix: chmod +x corelfonts
+ ./corelfonts
+
+ Edit your config.ps file (probably located at texmf/dvips/config)
+ to include the line:
+
+ p +bitstrea.map
+
+ Then run texhash to update the filename database.
+
+ Win32: perl corelfonts
+
+ Edit your updmap.cfg file (probably located at texmf/web2c)
+ to include the line:
+
+ Map bitstrea.map
+
+ Then run updmap to update the filename database.
+
+USAGE
+Just include a line such as \usepackage{sabon} in the preamble to your
+LaTeX document and the default font will be Sabon (Garamond). Have a look
+through the texmf/tex/latex/bitstrea directory to see which packages are
+available. Each package supplies a font family.
+
+LICENSE
+This material is subject to the LaTeX Project Public License.
+See http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+for the details of that license.
+
+DISCLAIMER
+Apart from the fact that I had these Corel (Bitstream) fonts lying around
+and wanted to use them with LaTeX, this was simply an exercise in learning
+perl for me. If you find the script useful I will be delighted, but I cannot
+take responsibility for any problems you might have with it. Please let me
+know if you find the script useful though. I can be contacted by email
+as tony@thenoc.org.uk
+
+Tony McClelland
+11/02/2003
+
+
+
+
+
diff --git a/fonts/utilities/corelfonts/corelfonts b/fonts/utilities/corelfonts/corelfonts
new file mode 100644
index 0000000000..48d3e47456
--- /dev/null
+++ b/fonts/utilities/corelfonts/corelfonts
@@ -0,0 +1,233 @@
+#!/usr/bin/perl -w
+#################################################################
+# corelfonts #
+# Tony McClelland 11-Feb-2003 #
+# Copy the PostScript Type1 fonts from the Corel Ventura 5 #
+# CD into the local TeXMF tree and install these fonts for use #
+# with TeX and LaTeX. These fonts are from Bitstream. #
+#################################################################
+
+use strict;
+use Cwd 'chdir', 'cwd';
+use File::Copy;
+
+#################################################################
+# Global variables #
+#################################################################
+my $texmfdir; # Path to local TeXMF directory
+my $coreldir; # Where the Corel fonts are
+my $scriptdir; # Where this script and support files are
+my $afmdir; # Where subdirectories for .afm files are
+my $tfmdir; # Where subdirectories for .tfm files are
+my $vfdir; # Where subdirectories for .vf files are
+my $pfbdir; # Where subdirectories for .pfb files are
+my $latexdir; # Where the .sty and .fd files go
+my $latexbindir; # Path to the latex/pltotf/vptovf binaries
+
+#################################################################
+# init_paths #
+# Set up various paths for the TeXMF tree etc #
+#################################################################
+sub init_paths {
+ print "Enter the path for the local TeXMF tree [/usr/local/share/texmf]: ";
+ my $response = <STDIN>;
+ chomp $response;
+ if ($response eq "") {
+ $texmfdir = "/usr/local/share/texmf";
+ }
+ else {
+ $texmfdir = $response;
+ }
+
+ print "Enter the path for the Corel fonts [/cdrom/Fonts/Type1]: ";
+ $response = <STDIN>;
+ chomp $response;
+ if ($response eq "") {
+ $coreldir = "/cdrom/Fonts/Type1";
+ }
+ else {
+ $coreldir = $response;
+ }
+
+ print "Enter the full path of the latex executables [/usr/local/bin/]: ";
+ $response = <STDIN>;
+ chomp $response;
+ if ($response eq "") {
+ $latexbindir = "/usr/local/bin";
+ }
+ else {
+ $latexbindir = $response;
+ }
+
+ $scriptdir = cwd();
+ $afmdir = "$texmfdir/fonts/afm/bitstrea";
+ $tfmdir = "$texmfdir/fonts/tfm/bitstrea";
+ $vfdir = "$texmfdir/fonts/vf/bitstrea";
+ $pfbdir = "$texmfdir/fonts/type1/bitstrea";
+ $latexdir = "$texmfdir/tex/latex/bitstrea";
+
+ # Create the directories if necessary
+ mkdir $afmdir unless -e $afmdir ;
+ mkdir $tfmdir unless -e $tfmdir;
+ mkdir $vfdir unless -e $vfdir;
+ mkdir $pfbdir unless -e $pfbdir;
+ mkdir $latexdir unless -e $latexdir;
+}
+
+
+#################################################################
+# Copy fonts from the CD, renaming according to the fontname #
+# scheme. The fonts are arranged on the CD in subdirectories #
+# under $coreldir named by the first letter of the font name. #
+#################################################################
+sub copy_fonts {
+ # Start off with fonts beginning with 'A'
+ my $oldsubdir = "A";
+ chdir("$coreldir/$oldsubdir");
+
+ # Prepare a map file for dvips
+ open(MAPFILE, ">$texmfdir/dvips/config/bitstrea.map")
+ or die "Unable to open the map file: $!";
+
+ # Use the font name information in fontnames.dat (taken from
+ # the file bitstrea.map in the fontinst info on CTAN) to copy
+ # the afm and pfb files and build the dvips map file.
+ open(FONTNAMES, "$scriptdir/fontnames.dat")
+ or die "Unable to open the fontnames.dat file: $!";
+
+ while (<FONTNAMES>) {
+ chomp;
+ my ($fontname, $prefix, $kbname, $shortname, $shape) = split;
+ my $subdir = substr($fontname, 0, 1);
+
+ # Only change directory when the first letter changes
+ if ($subdir ne $oldsubdir) {
+ $oldsubdir = $subdir;
+ chdir("$coreldir/$subdir");
+ }
+
+ # Set up the name of the AFM and PFB files used by Corel
+ my $fontfile = "${prefix}A___";
+ my $afmfile = "$fontfile.afm";
+ my $pfbfile = "$fontfile.pfb";
+
+ # Not all the files in the bitstrea.map are on the CD.
+ # Only set up texmf directories for those that are.
+ if (-e $afmfile) {
+ # Create subdirectories in the texmf tree
+ mkdir "$afmdir/$shortname" unless -e "$afmdir/$shortname";
+ mkdir "$tfmdir/$shortname" unless -e "$tfmdir/$shortname";
+ mkdir "$vfdir/$shortname" unless -e "$vfdir/$shortname";
+ mkdir "$pfbdir/$shortname" unless -e "$pfbdir/$shortname";
+
+ # Copy the font using the fontname scheme
+ copy($afmfile, "$afmdir/$shortname/$kbname.afm");
+ copy($pfbfile, "$pfbdir/$shortname/$kbname.pfb");
+
+ # Put an entry for this font in the map file
+ my $reencode = $kbname;
+ $reencode =~ s/8a/8r/;
+ print MAPFILE "$reencode $fontname \"TeXBase1Encoding ReEncodeFont\" <8r.enc <$kbname.pfb\n";
+
+ # If this font is not already italic or oblique, add a fake
+ # slanted variant to the map file
+ unless (($fontname =~ /[Oo]blique/) || ($fontname =~ /[Ii]talic/)) {
+ $reencode =~ s/8r/o8r/;
+ print MAPFILE "$reencode $fontname \".167 SlantFont TeXBase1Encoding ReEncodeFont\" <8r.enc <$kbname.pfb\n";
+ }
+ }
+ }
+
+ close(FONTNAMES);
+ close(MAPFILE);
+}
+
+
+#################################################################
+# install_fonts #
+# Install font families by running fontinst on the afm files #
+#################################################################
+sub install_fonts {
+ my %families; # font families and rm, sf or tt shapes
+ my %famcodes; # 3 letter codes for font families
+ my %btnames; # Bitstream names for font families
+
+ # Get a list of all the subdirectories containing *.afm files
+ # organised by font name, for fontinst to work on
+ open(FONTNAMES, "$scriptdir/fontnames.dat")
+ or die "Unable to open the file fontnames.dat: $!";
+
+ while (<FONTNAMES>) {
+ chomp;
+ my ($fontname, $prefix, $kbname, $shortname, $shape) = split;
+ if (-e "$afmdir/$shortname") {
+ $families{$shortname} = $shape;
+ $famcodes{$shortname} = substr($kbname, 0, 3);
+ $fontname =~ s/BT.*//; # strip off everything after BT
+ $btnames{$shortname} = $fontname;
+ }
+ }
+
+ close(FONTNAMES);
+
+ # Run fontinst in each subdirectory
+ foreach my $font (sort keys %families) {
+ chdir "$afmdir/$font";
+
+ # Create a tex file to allow latex to be run on fontinst with
+ # this family of fonts as the \latinfamily
+ copy("$scriptdir/fontinst.sty", "$afmdir/$font/fontinst.sty");
+ open(FONTINST, ">$afmdir/$font/corelfont.tex")
+ or die "Cannot open the LaTeX file: $!";
+ print FONTINST <<EOF;
+\\input fontinst.sty
+\\latinfamily{$famcodes{$font}}{} \\bye
+EOF
+ system("$latexbindir/latex corelfont.tex");
+
+ # Now create .tfm and .vf files from the fontinst output
+ while (my $vpl = glob("*.vpl")) {
+ system("$latexbindir/vptovf $vpl");
+ }
+ while (my $pl = glob("*.pl")) {
+ system("$latexbindir/pltotf $pl");
+ }
+
+ # Move the .tfm, .vf and .fd files to their destinations
+ while (my $tfm = glob("*.tfm")) {
+ rename($tfm, "$tfmdir/$font/$tfm");
+ }
+ while (my $vf = glob("*.vf")) {
+ rename($vf, "$vfdir/$font/$vf");
+ }
+ while (my $fd = glob("*.fd")) {
+ rename($fd, "$latexdir/$fd");
+ }
+
+ # Clean up the files created by fontinst
+ unlink <*.vpl>;
+ unlink <*.pl>;
+ unlink <*.mtx>;
+ unlink <*.tex>;
+ unlink <*.sty>;
+
+ # Create a LaTeX style file for this font
+ open(LATEXFILE, ">$latexdir/$font.sty");
+ print LATEXFILE "% LaTeX package file for using the Bitstream font $btnames{$font}\n";
+ print LATEXFILE "\\ProvidesPackage{$font}[2003/02/11 Bitstream font $btnames{$font}]\n";
+ print LATEXFILE "\\renewcommand{\\$families{$font}default}{$famcodes{$font}}\n";
+ close(LATEXFILE);
+
+ chdir $afmdir;
+ }
+}
+
+
+#################################################################
+# Main program #
+#################################################################
+init_paths();
+copy_fonts();
+install_fonts();
+
+print "Done.\n";
diff --git a/fonts/utilities/corelfonts/fontinst.sty b/fonts/utilities/corelfonts/fontinst.sty
new file mode 100644
index 0000000000..8cd29c70f8
--- /dev/null
+++ b/fonts/utilities/corelfonts/fontinst.sty
@@ -0,0 +1,2229 @@
+%%
+%% This is file `fontinst.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fontinst.dtx (with options: `pkg,textcomp,debug')
+%%
+%% IMPORTANT NOTICE:
+%%
+%% For the copyright see the source file.
+%%
+%% You are *not* allowed to modify this file.
+%%
+%% You are *not* allowed to distribute this file.
+%% For distribution of the original source see the terms
+%% for copying and modification in the file fontinst.dtx.
+%%
+%%
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+\def\fontinstversion{1.801}
+\def\filedate{1998/07/07}
+\def\docdate{1998/07/07}
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+\ProvidesPackage{fontinst}
+[\filedate\space v\fontinstversion\space
+ fontinst installation package]
+\edef\spacecatcode{\the\catcode`\ }
+\edef\nlcatcode{\the\catcode`\^^M}
+\edef\atcatcode{\the\catcode`\@}
+\edef\underscorecatcode{\the\catcode`\_}
+\edef\tildecatcode{\the\catcode`\~}
+\catcode`\ =9
+\catcode`\^^M=9
+\catcode`\@=11
+\catcode`\_=11
+\catcode`\~=10
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+\newwrite\out_file
+\mathchardef\one_thousand=1000
+\mathchardef\max_mathchardef="7FFF
+\let\@tempdima\a_dimen
+\let\@tempdimb\b_dimen
+\input trig.sty
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+\def\first_char#1#2={#1}
+\def\add_to#1#2{
+ \ifx#1\relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+\def\never_do{\noexpand\do}
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \def\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\def\out_lline#1{\out_line{\space\space\space#1}}
+\def\out_llline#1{\out_lline{\space\space\space#1}}
+\let\then=\iffalse
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\relax
+ \ifeof1\relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+\x_cs\ifx{@@input}\relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+\def\setint#1#2{
+ \x_cs\ifx{i-#1}\relax
+ \resetint{#1}{#2}
+ \fi
+}
+\def\setstr#1#2{\x_cs\ifx{s-#1}\relax
+ \x_cs\edef{s-#1}{#2}\fi}
+\def\setdim#1#2{\x_cs\ifx{d-#1}\relax
+ \a_dimen=#2\relax\x_cs\edef{d-#1}{\the\a_dimen}\fi}
+\def\setcommand#1{\ifx#1\undefined_command
+ \expandafter\def\expandafter#1\else
+ \expandafter\def\expandafter\a_command\fi}
+\def\resetint#1#2{
+ \eval_expr{#2}
+ \ifnum\result<\max_mathchardef
+ \ifnum\result<0
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\def\resetstr#1#2{\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{\a_dimen=#2\x_cs\edef{d-#1}{\the\a_dimen}}
+\def\resetcommand#1{\def#1}
+\def\int#1{\csname~i-#1\endcsname}
+\def\str#1{\csname~s-#1\endcsname}
+\def\dim#1{\csname~d-#1\endcsname}
+\def\ifisint#1\then{\x_cs\ifx{i-#1}\relax\expandafter\if_false
+ \else\expandafter\if_true\fi}
+\def\ifisstr#1\then{\x_cs\ifx{s-#1}\relax\expandafter\if_false
+ \else\expandafter\if_true\fi}
+\def\ifisdim#1\then{\x_cs\ifx{d-#1}\relax\expandafter\if_false
+ \else\expandafter\if_true\fi}
+\def\ifiscommand#1\then{\ifx#1\undefined_command\expandafter\if_false
+ \else\expandafter\if_true\fi}
+\def\unsetint#1{\x_cs\let{i-#1}\relax}
+\def\unsetstr#1{\x_cs\let{s-#1}\relax}
+\def\unsetdim#1{\x_cs\let{d-#1}\relax}
+\def\unsetcommand#1{\let#1=\undefined_command}
+\newcount\result
+\def\eval_expr#1{\global\result=#1\relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+\def\neg#1{#1\global\result=-\result}
+\def\add#1#2{#1{\a_count=\result\eval_expr{#2}
+ \global\advance\result by \a_count}}
+\def\sub#1#2{#1{\a_count=\result\eval_expr{#2}
+ \advance\a_count by -\result
+ \global\result=\a_count}}
+\def\mul#1#2{#1{\a_count=\result\eval_expr{#2}
+ \global\multiply\result by \a_count}}
+\def\div#1#2{#1{\a_count=\result\eval_expr{#2}
+ \divide\a_count by \result
+ \global\result=\a_count}}
+\def\max#1#2{#1{\a_count=\result\eval_expr{#2}
+ \ifnum\a_count>\result \global\result=\a_count \fi}}
+\def\min#1#2{#1{\a_count=\result\eval_expr{#2}
+ \ifnum\a_count<\result \global\result=\a_count \fi}}
+\def\scale#1#2{#1{\a_count=\result\eval_expr{#2}
+ \global\multiply\result by \a_count
+ \global\divide\result by \one_thousand}}
+\newif\ifmissingslots
+\x_cs\def{o-.notdef}#1{\global\missingslotstrue}
+{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \gdef\enctoetx#1#2{{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \def/##1[{
+ \a_count=0
+ \global\missingslotsfalse
+ \def/####1~{
+ \csname~o-####1\endcsname{
+ \ifmissingslots
+ \out_line{\string\nextslot{\the\a_count}}
+ \fi
+ \global\missingslotsfalse
+ \out_line{\string\setslot{####1}}
+ \out_line{\string\endsetslot}
+ \out_line{}
+ }
+ \advance\a_count by 1
+ }
+ }
+ \def]~def{}
+ \make_etx{#1}{#2}
+ }}
+}
+\def\make_etx#1#2{
+ \open_out{\temp_prefix#2.etx}
+ \out_line{\percent_char~Filename:~#2.etx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\enctoetx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the
+ information~of~#1.enc~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{}
+ \out_line{\string\documentclass[twocolumn]{article}}
+ \out_line{\string\usepackage{fontdoc}}
+ \out_line{}
+ \out_line{\string\begin{document}}
+ \out_line{}
+ \out_line{This~document~describes~the~#1~encoding.}
+ \out_line{It~was~automatically~generated~by~the}
+ \out_line{{\string\tt\space~fontinst}~package.}
+ \out_line{}
+ \out_line{\string\encoding}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \primitiveinput #1.enc\relax
+ \out_line{}
+ \out_line{\string\endencoding}
+ \out_line{}
+ \out_line{\string\end{document}}
+ \close_out{Encoding~vector}
+}
+\def\afmtomtx#1#2{{
+ \open_out{\temp_prefix#2.mtx}
+ \def\raw_font_name{#2}
+ \_italicfalse
+ \setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the
+ information~of~#1.afm~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\^^M=12
+ \catcode`\ =10
+ \expandafter\afm_line\primitiveinput #1.afm\relax
+ \out_line{}
+ \out_line{\string\endmetrics}
+ \close_out{Metrics}
+}}
+\newcount\minimum_kern
+\newif\if_italic
+{\catcode`\^^M=12 \gdef\afm_line#1
+{\afm_command#1~\end_of_line\afm_line}}
+\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line}
+\def\gobble_one_line#1\end_of_line{}
+\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput}
+\def\afm_def#1(#2)#3{\x_cs\def{afm-#1}
+ \gobble_one_line#2\end_of_line{#3}}
+\afm_def{CharWidth}(#1){\charxwidth=#1\relax}
+\afm_def{ItalicAngle}(#1){\calculate_it_slant{#1}}
+\afm_def{XHeight}(#1){
+ \out_line{\string\setint{xheight}{#1}}}
+\afm_def{CapHeight}(#1){
+ \out_line{\string\setint{capheight}{#1}}}
+\afm_def{Ascender}(#1){
+ \out_line{\string\setint{ascender}{#1}}}
+\afm_def{Descender}(#1){
+ \out_line{\string\setint{descender_neg}{#1}}}
+\afm_def{UnderlineThickness}(#1){
+ \out_line{\string\setint{underlinethickness}{#1}}}
+\afm_def{FontBBox}(#1~#2~#3~#4){
+ \out_line{\string\setint{maxheight}{#4}}
+ \out_line{\string\setint{maxdepth_neg}{#2}}}
+\afm_def{IsFixedPitch}(#1){
+ \if\first_char#1=f
+ \else\out_line{\string\setint{monowidth}{1}}
+ \fi
+}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \ifnum#3>\minimum_kern\relax
+ \out_line{\string\setkern{#1}{#2}{#3}}
+ \else\ifnum#3<-\minimum_kern\relax
+ \out_line{\string\setkern{#1}{#2}{#3}}
+ \fi\fi
+ \fi\fi
+}
+\afm_def{KPX}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \ifnum#3>\minimum_kern\relax
+ \out_line{\string\setkern{#1}{#2}{#3}}
+ \else\ifnum#3<-\minimum_kern\relax
+ \out_line{\string\setkern{#1}{#2}{#3}}
+ \fi\fi
+ \fi\fi
+}
+\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+\afm_def{CH}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char}
+\newcount\char_slot
+\newcount\char_x_width
+\newcount\x_width
+\newcount\bbox_llx
+\newcount\bbox_lly
+\newcount\bbox_urx
+\newcount\bbox_ury
+\let\char_name=\empty_command
+\def\init_afm#1{
+ \char_slot=#1\relax
+ \x_width=\char_x_width
+ \bbox_llx=0
+ \bbox_lly=0
+ \bbox_urx=0
+ \bbox_ury=0
+ \let\char_name=\empty_command
+}
+\def\afm_char{
+ \a_count=-\bbox_lly
+ \if_italic
+ \b_count=-\x_width
+ \advance\b_count by \bbox_urx
+ \ifnum\b_count>0\else
+ \b_count=0
+ \fi
+ \else
+ \b_count=0
+ \fi
+ \out_line{
+ \ifnum\char_slot>-1
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\the\a_count}
+ {\the\b_count}
+ }
+}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{#1}}
+ \def\char_name{#1}
+}
+\def\cc_char{%
+ \out_lline{\string\samesize{\char_name-not}}
+ \out_line{\string\endsetglyph}
+}
+\def\calculate_it_slant#1{
+ \edef\theangle{\strip_spaces#1~\end_strip_spaces}
+ \CalculateTan{\theangle}
+ \a_dimen=-\one_thousand sp
+ \a_dimen=\UseTan{\theangle}\a_dimen
+ \a_count=\a_dimen
+ \out_line{\string\setint{italicslant}{\the\a_count}}
+ \ifnum\a_count>0~\_italictrue \else \_italicfalse \fi
+}
+\def\strip_spaces#1~#2\end_strip_spaces{#1}
+\def\do_list[~#1~#2;~#3]{
+ \csname~list-#1\endcsname\gobble_one_semi#2;
+ \ifx\relax#3\relax\expandafter\gobble_one
+ \else\expandafter\identity_one\fi
+ {\do_list[~#3]}
+}
+\def\gobble_one_semi#1;{}
+\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}}
+\list_def{W}(#1~#2){\x_width=#1\relax}
+\list_def{WX}(#1){\x_width=#1\relax}
+\list_def{WY}(#1){}
+\list_def{N}(#1){\def\char_name{#1}}
+\list_def{B}(#1~#2~#3~#4){
+ \bbox_llx=#1\relax
+ \bbox_lly=#2\relax
+ \bbox_urx=#3\relax
+ \bbox_ury=#4\relax
+}
+\list_def{PCC}(#1~#2~#3){
+ \out_lline{\string\glyphpcc{#1}{#2}{#3}}
+}
+\def\pltomtx#1#2{{
+ \def\raw_font_name{#1}
+ \open_out{\temp_prefix#2.mtx}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\pltomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.pl~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\(=0 \catcode`\)=9
+ \let\/=\ignore_parens
+ \let\do_pl_glyph=\relax
+ \primitiveinput #1.pl\relax
+ \do_pl_glyph
+ \out_line{}
+ \out_line{\string\endmetrics}
+ \close_out{Metrics}
+}}
+\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \relax
+ \expandafter\expandafter\expandafter\gobble_parens
+ \iftrue\expandafter{\else}\fi}
+\def\gobble_parens#1{\egroup}
+\def\pl_real#1{\pl_realer(#1000)}
+\def\pl_realer(#1.#2#3#4#5){#1#2#3#4}
+\def\pl_int#1#2{
+ \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+\let\COMMENT=\ignore_parens
+\let\FAMILY=\ignore_parens
+\let\FACE=\ignore_parens
+\let\CHECKSUM=\ignore_parens
+\let\BOUNDARYCHAR=\ignore_parens
+\let\LIG=\ignore_parens
+\let\NEXTLARGER=\ignore_parens
+\let\VARCHAR=\ignore_parens
+\def\CODINGSCHEME{\bgroup\catcode`\)=12\relax\CODINGSCHEME_cont}
+\def\CODINGSCHEME_cont#1){
+ \egroup
+ \x_cs\ifx{enc-#1}\relax
+ \errhelp{The~encoding~`#1'~has~not~been~declared.^^J
+ You~should~declare~it~with~\string\declareencoding{#1}{ETXFILE}.^^J
+ Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J
+ or~X~<RETURN>~to~exit.}
+ \errmessage{Undeclared~encoding~`#1'}
+ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \catcode`\(=12 \catcode`\)=12
+ \x_cs\inputetx{enc-#1}\relax
+ \catcode`\(=0 \catcode`\)=9
+ \fi
+}
+\def\DESIGNSIZE~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designsize}{\the\a_dimen}}
+}
+\def\DESIGNUNITS~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designunits}{\the\a_dimen}}
+}
+\let\FONTDIMEN=\relax
+\def\SLANT~R~#1~{\out_line{\string\setint{italicslant}{\pl_real{#1}}}}
+\def\SPACE~R~#1~{\out_line{\string\setint{interword}{\pl_real{#1}}}}
+\def\STRETCH~R~#1~{\out_line{\string\setint{stretchword}{\pl_real{#1}}}}
+\def\SHRINK~R~#1~{\out_line{\string\setint{shrinkword}{\pl_real{#1}}}}
+\def\XHEIGHT~R~#1~{\out_line{\string\setint{xheight}{\pl_real{#1}}}}
+\def\QUAD~R~#1~{\out_line{\string\setint{quad}{\pl_real{#1}}}}
+\def\EXTRASPACE~R~#1~{\out_line{\string\setint{extraspace}{\pl_real{#1}}}}
+\def\DEFAULTRULETHICKNESS~R~#1~{
+ \out_line{\string\setint{underlinethickness}{\pl_real{#1}}}
+}
+\def\HEADER~#1~#2~#3~#4~{}
+\def\SEVENBITSAFEFLAG~#1~{}
+\def\PARAMETER~#1~#2~#3~#4~{}
+\def\NUM#1~#2~#3~{}
+\def\DENOM#1~#2~#3~{}
+\def\SUP#1~#2~#3~{}
+\def\SUB#1~#2~#3~{}
+\def\SUBDROP~#1~#2~{}
+\def\SUPDROP~#1~#2~{}
+\def\DELIM#1~#2~#3~{}
+\def\AXISHEIGHT~#1~#2~{}
+\def\BIGOPSPACING#1~#2~#3~{}
+\def\LIGTABLE{\let\do=\never_do\let\temp_command\empty_command}
+\def\LABEL~#1~#2~{\edef\temp_command{\temp_command\do{\pl_int{#1}{#2}}}}
+\def\STOP{\let\temp_command\empty_command}
+\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}}
+\def\KRN~#1~#2~R~#3~{
+ \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\pl_real{#3}}}
+ \temp_command
+ \let\do=\never_do
+}
+\def\write_pl_krn#1#2#3{
+ \f_count=#1
+ \g_count=#3
+ \out_line{\string\setkern{\csname~name-\the\g_count\endcsname}
+ {\csname~name-\the\f_count\endcsname}
+ {#2}}
+}
+\def\CHARWD~R~#1~{\b_count=\pl_real{#1}}
+\def\CHARHT~R~#1~{\c_count=\pl_real{#1}}
+\def\CHARDP~R~#1~{\d_count=\pl_real{#1}}
+\def\CHARIC~R~#1~{\e_count=\pl_real{#1}}
+\def\CHARACTER~#1~#2~{
+ \do_pl_glyph
+ \a_count=\pl_int{#1}{#2}
+ \b_count=0
+ \c_count=0
+ \d_count=0
+ \e_count=0
+ \let\do_pl_glyph=\write_pl_glyph
+}
+\def\write_pl_glyph{
+ \x_cs\ifx{name-\the\a_count}\relax\else
+ \out_line{\string\setrawglyph
+ {\csname~name-\the\a_count\endcsname}
+ {\raw_font_name}
+ {\the\a_dimen}
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\the\e_count}}
+ \fi
+ }
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \let\endencoding=\endinput
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\relax}
+\let\do_slot\empty_command
+\let\do_new_slot\empty_command
+\let\end_do_slot\empty_command
+\newcount\slot_number
+\def\nextslot#1{\slot_number=#1\relax}
+\def\skipslots#1{\advance\slot_number by #1\relax}
+\let\ligature=\gobble_three
+\let\nextlarger=\gobble_one
+\let\varchar=\empty_command
+\let\endvarchar=\empty_command
+\let\comment=\gobble_one
+\let\usedas=\gobble_two
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+\def\inputmtx#1{
+ \a_count=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \let\endmetrics=\endinput
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\def\setkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\relax
+ \expandafter\set_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{#3}
+ \else
+ \expandafter\set_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\set_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\set_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\set_kern_cs#1#2#3{
+ \add_to#2{\k#3#1}
+ \add_to#3{\k#2#1}
+}
+\def\setleftkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+}
+\def\setrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\setleftrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\set_kerning#1#2{
+ \if\b_count=\one_thousand
+ \def\k##1##2{
+ \set_kern_cs##2##1#1
+ }
+ \else
+ \def\k##1##2{
+ \set_kern##1#1{
+ \scale\b_count{\expandafter\gobble_one\string##2}
+ }
+ }
+ \fi
+ #2
+}
+\def\kerning#1#2{0\relax
+ \def\k##1{\csname~set-\string##1\endcsname\gobble_one}
+ \bgroup
+ \x_cs\def{set-\string\l-#2}##1##2{
+ \global\result=\expandafter\gobble_one\string##2\egroup
+ }
+ \csname~r-#1\endcsname
+ \csname~set-\string\l-#2\endcsname\gobble_one{00}
+}
+\def\width{\glyph_parameter\first_of_six}
+\def\height{\glyph_parameter\second_of_six}
+\def\depth{\glyph_parameter\third_of_six}
+\def\italic{\glyph_parameter\fourth_of_six}
+\def\mapcommands{\glyph_parameter\fifth_of_six}
+\def\mapfonts{\glyph_parameter\sixth_of_six}
+\def\glyph_parameter#1#2{
+ \expandafter\expandafter\expandafter
+ #1\csname~g-#2\endcsname
+}
+\def\first_of_six#1#2#3#4#5#6{#1}
+\def\second_of_six#1#2#3#4#5#6{#2}
+\def\third_of_six#1#2#3#4#5#6{#3}
+\def\fourth_of_six#1#2#3#4#5#6{#4}
+\def\fifth_of_six#1#2#3#4#5#6{#5}
+\def\sixth_of_six#1#2#3#4#5#6{#6}
+\let\saved_scale\relax
+\let\saved_mapfont\relax
+\let\saved_raw\relax
+\let\saved_rule\relax
+\let\saved_special\relax
+\let\saved_warning\relax
+\let\saved_movert\relax
+\let\saved_moveup\relax
+\let\saved_push\relax
+\let\saved_pop\relax
+\newcount\glyph_width
+\newcount\glyph_height
+\newcount\glyph_depth
+\newcount\glyph_italic
+\newtoks\glyph_map_commands
+\newtoks\glyph_map_fonts
+\newcount\glyph_voffset
+\def\setglyph#1{
+ \ifisglyph{#1}\then
+ \expandafter\gobble_glyph
+ \else
+ \x_cs\def{g-#1}{{\the\glyph_width}{\the
+ \glyph_height}{\the\glyph_depth}{\the\glyph_italic}{\the
+ \glyph_map_commands}{\the\glyph_map_fonts}}
+ \resetglyph{#1}
+ \fi
+}
+\long\def\gobble_glyph#1\endsetglyph{}
+\def\resetglyph#1{
+ \def\glyphname{#1}
+ \glyph_width=0
+ \global\glyph_height=0
+ \global\glyph_depth=0
+ \global\glyph_italic=0
+ \glyph_voffset=0
+ \global\glyph_map_commands={}
+ \global\glyph_map_fonts={}
+}
+\def\endsetglyph{
+ \x_cs\edef{g-\glyphname}
+ {{\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}}
+}
+\let\endresetglyph=\endsetglyph
+\def\setrawglyph#1#2#3#4#5#6#7#8{
+ \x_cs\ifx{g-#1}\relax
+ \x_cs\ifx{i-rawscale}\relax
+ \x_cs\def{g-#1}{
+ {#5}
+ {#6}
+ {#7}
+ {#8}
+ {\saved_raw{#2}{#4}{#1}}
+ {\saved_mapfont{#2}{#3}}
+ }
+ \else
+ \eval_expr_to\e_count{\int{rawscale}}
+ \eval_expr_to\a_count{\scale{#5}\e_count}
+ \eval_expr_to\b_count{\scale{#6}\e_count}
+ \eval_expr_to\c_count{\scale{#7}\e_count}
+ \eval_expr_to\d_count{\scale{#8}\e_count}
+ \x_cs\edef{g-#1}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\saved_scale{\the\e_count}
+ {\saved_raw{#2}{#4}{#1}}}
+ {\saved_scale{\the\e_count}
+ {\saved_mapfont{#2}{#3}}}
+ }
+ \fi
+ \fi
+}
+\def\setnotglyph#1#2#3#4#5#6#7#8{
+ \x_cs\ifx{g-#1-not}\relax
+ \x_cs\ifx{i-rawscale}\relax
+ \x_cs\def{g-#1-not}{
+ {#5}
+ {#6}
+ {#7}
+ {#8}
+ {}
+ {}
+ }
+ \else
+ \eval_expr_to\e_count{\int{rawscale}}
+ \eval_expr_to\a_count{\scale{#5}\e_count}
+ \eval_expr_to\b_count{\scale{#6}\e_count}
+ \eval_expr_to\c_count{\scale{#7}\e_count}
+ \eval_expr_to\d_count{\scale{#8}\e_count}
+ \x_cs\edef{g-#1-not}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {}
+ {}
+ }
+ \fi
+ \fi
+}
+\def\unsetglyph#1{\x_cs\let{g-#1}\relax}
+\def\glyph#1#2{
+ \eval_expr_to\b_count{#2}
+ \eval_expr_to\glyph_width{\add\glyph_width{\scale\b_count{\width{#1}}}}
+ \g_eval_expr_to\glyph_height{\max\glyph_height
+ {\add{\scale\b_count{\height{#1}}}\glyph_voffset}}
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth
+ {\sub{\scale\b_count{\depth{#1}}}\glyph_voffset}}
+ \g_eval_expr_to\glyph_italic{\scale\b_count{\italic{#1}}}
+ \edef\temp_command{\the\glyph_map_commands
+ \saved_scale{\the\b_count}{\mapcommands{#1}}}
+ \global\glyph_map_commands\expandafter{\temp_command}
+ \edef\temp_command{\the\glyph_map_fonts
+ \saved_scale{\the\b_count}{\mapfonts{#1}}}
+ \global\glyph_map_fonts\expandafter{\temp_command}
+}
+\def\glyphrule#1#2{
+ \eval_expr_to\b_count{#1} \eval_expr_to\c_count{#2}
+ \advance\glyph_width by \b_count
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth{-\glyph_voffset}}
+ \g_eval_expr_to\glyph_height{\max\glyph_height{\add\glyph_voffset\c_count}}
+ \global\glyph_italic=0
+ \edef\temp_command{\the\glyph_map_commands
+ \saved_rule{\the\b_count}{\the\c_count}}
+ \global\glyph_map_commands\expandafter{\temp_command}
+}
+\def\glyphspecial#1{
+ \edef\temp_command{\the\glyph_map_commands\saved_special{#1}}
+ \global\glyph_map_commands\expandafter{\temp_command}}
+\def\glyphwarning#1{
+ \edef\temp_command{\the\glyph_map_commands\saved_warning{#1}}
+ \global\glyph_map_commands\expandafter{\temp_command}}
+\def\movert#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_width by \result
+ \edef\temp_command{\the\glyph_map_commands\saved_movert{\the\result}}
+ \global\glyph_map_commands\expandafter{\temp_command}
+ \fi}
+\def\moveup#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_voffset by \result
+ \edef\temp_command{\the\glyph_map_commands\saved_moveup{\the\result}}
+ \global\glyph_map_commands\expandafter{\temp_command}
+ \fi}
+\def\push{\bgroup
+ \edef\temp_command{\the\glyph_map_commands\saved_push}
+ \global\glyph_map_commands\expandafter{\temp_command}}
+\def\pop{\egroup
+ \edef\temp_command{\the\glyph_map_commands\saved_pop}
+ \global\glyph_map_commands\expandafter{\temp_command}}
+\def\resetwidth#1{\movert{\sub{#1}\glyph_width}}
+\def\resetheight{\g_eval_expr_to\glyph_height}
+\def\resetdepth{\g_eval_expr_to\glyph_depth}
+\def\resetitalic{\g_eval_expr_to\glyph_italic}
+\def\glyphpcc#1#2#3{
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{#1}{\one_thousand}
+ \pop
+}
+\def\samesize#1{
+ \expandafter\expandafter\expandafter
+ \same_size\csname g-#1\endcsname
+}
+\def\same_size#1#2#3#4#5#6{
+ \movert{\sub{#1}\glyph_width}
+ \global\glyph_height=#2
+ \global\glyph_depth=#3
+ \global\glyph_italic=#4
+}
+\def\ifisglyph#1\then{
+ \x_cs\ifx{g-#1}\relax
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+\def\etxtovpl#1#2{{
+ \def\vpl_extension{vpl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{virtual~font}
+ \def\vpl_Font{Virtual~font}
+ \def\vpl_caller{\string\etxtovpl}
+ \def\vpl_to_vf##1{vpltovf~##1.vpl~##1.vf~##1.tfm}
+ \etx_to_font{#1}{#2}
+}}
+\def\etxtopl#1#2{{
+ \def\vpl_extension{pl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{font}
+ \def\vpl_Font{Font}
+ \def\vpl_caller{\string\etxtopl}
+ \def\vpl_to_vf##1{pltotfm~##1.pl~##1.tfm}
+ \let\make_mapfonts\gobble_one
+ \let\do_character_map\relax
+ \etx_to_font{#1}{#2}
+}}
+\def\etx_to_font#1#2{
+ \def\do_slot{\resetint\slot_name\slot_number}
+ \inputetx{#1}
+ \open_out{#2.\vpl_extension}
+ \out_line{(\vpl_title\space\vpl_font\space
+ #2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.\vpl_extension)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\vpl_caller{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~\vpl_font~with)}
+ \out_line{(COMMENT~\vpl_to_vf{#2})}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \make_font{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.\vpl_extension)}
+ \close_out{\vpl_Font}
+}
+\newdimen\scaled_design_size
+\def\afm_convert#1=#2;{
+ \eval_expr{#2}
+ #1=\scaled_design_size
+ \divide#1 by 8
+ \multiply #1 by \result
+ \divide #1 by \one_thousand
+ \multiply#1 by 8
+}
+\def\vpl_real#1{R~\expandafter\lose_measure\the#1}
+\def\vpl_int#1{D~\the#1}
+\def\make_font#1{
+ \make_header{#1}
+ \make_mapfonts{#1}
+ \make_fontdimens{#1}
+ \make_ligtable{#1}
+ \make_characters{#1}
+ \make_tidy{#1}
+}
+\newcount\boundary_char
+\newdimen\side_bearings
+\newdimen\curr_bearings
+\def\make_header#1{
+ \global\font_count=0
+ \setdim{designsize}{10pt}
+ \scaled_design_size=\dim{designsize}
+ \out_line{(DESIGNSIZE~\vpl_real\scaled_design_size)}
+ \out_line{(DESIGNUNITS~\vpl_real\scaled_design_size)}
+ \setstr{codingscheme}{UNKNOWN}
+ \out_line{(CODINGSCHEME~\str{codingscheme})}
+ \ifisint{boundarychar}\then
+ \boundary_char=\int{boundarychar}
+ \out_line{(BOUNDARYCHAR~\vpl_int\boundary_char)}
+ \else
+ \boundary_char=-1
+ \fi
+ \setint{letterspacing}{0}
+ \afm_convert\side_bearings=\div{\int{letterspacing}}{2};
+ \ifdim\side_bearings=0pt
+ \let\do_character_sidebearings=\relax
+ \fi
+ \out_line{}
+}
+\def\make_mapfonts#1{
+ \let\saved_scale\vpl_scale
+ \let\saved_mapfont\vpl_mapfont
+ \let\saved_raw\vpl_raw
+ \let\saved_rule\vpl_rule
+ \let\saved_special\vpl_special
+ \let\saved_warning\vpl_warning
+ \let\saved_movert\vpl_movert
+ \let\saved_moveup\vpl_moveup
+ \let\saved_push\vpl_push
+ \let\saved_pop\vpl_pop
+ \let\do_slot=\do_mapfont
+ \inputetx{#1}
+ \out_line{}
+}
+\def\make_fontdimens#1{
+ \out_line{(FONTDIMEN}
+ \ifisint{fontdimen(1)}\then
+ \a_dimen=\int{fontdimen(1)}pt
+ \divide\a_dimen by \one_thousand
+ \out_lline{(PARAMETER~D~1~\vpl_real\a_dimen)}
+ \fi
+ \a_count=2
+ \loop\ifnum\a_count<256
+ {\ifisint{fontdimen(\the\a_count)}\then
+ \afm_convert\a_dimen=\int{fontdimen(\the\a_count)};
+ \out_lline{(PARAMETER~\vpl_int\a_count\space\vpl_real\a_dimen)}
+ \fi}
+ \advance\a_count by 1 \repeat
+ \out_lline{)}
+ \out_line{}
+}
+\def\make_ligtable#1{
+ \bgroup
+ \out_line{(LIGTABLE}
+ \let\do_slot=\relax
+ \let\end_do_slot=\vpl_kerning
+ \let\ligature=\vpl_ligature
+ \let\k=\vpl_kern
+ \inputetx{#1}
+ \out_lline{)}
+ \egroup
+ \out_line{}
+}
+\def\make_characters#1{
+ \bgroup
+ \let\do_slot=\do_character
+ \let\end_do_slot=\end_do_character
+ \let\nextlarger=\vpl_nextlarger
+ \let\varchar=\vpl_varchar
+ \let\endvarchar=\end_vpl_varchar
+ \let\vartop=\vpl_vartop
+ \let\varmid=\vpl_varmid
+ \let\varbot=\vpl_varbot
+ \let\varrep=\vpl_varrep
+ \inputetx{#1}
+ \egroup
+}
+\def\make_tidy#1{
+ \a_count=0\loop\ifnum\a_count<\font_count
+ \edef\temp_command{\csname~f-\the\a_count\endcsname}
+ \global\x_cs\let\temp_command\relax
+ \advance\a_count by 1
+ \repeat
+ \global\font_count=0
+}
+\def\vpl_ligature#1#2#3{
+ \ifisint{#2}\then
+ \ifisint{#3}\then
+ \ifisglyph{#3}\then
+ \a_count=\int{#2}
+ \b_count=\int{#3}
+ \vpl_liglabel
+ \out_lline{(#1~\vpl_int\a_count\space \vpl_int\b_count)~
+ (COMMENT~#2~#3)}
+ \else
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \fi
+ \else
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \fi
+ \else
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#2'.}
+ \fi
+}
+\def\vpl_kerning{\csname~r-\slot_name\endcsname\vpl_ligstop}
+\def\vpl_kern#1#2{
+ \edef\temp_command{\expandafter\gobble_three\string#1}
+ \ifisint\temp_command\then
+ \vpl_liglabel
+ \a_count=\int\temp_command
+ \afm_convert\a_dimen=\expandafter\gobble_one\string#2;
+ \out_lline{
+ (KRN~\vpl_int\a_count\space \vpl_real\a_dimen)~
+ (COMMENT~\temp_command)
+ }
+ \fi
+}
+\def\out_liglabel{
+ \out_lline{(LABEL~\vpl_int\slot_number)~(COMMENT~\slot_name)}
+ \ifnum\slot_number=\boundary_char
+ \out_lline{(LABEL~BOUNDARYCHAR)}
+ \fi
+ \let\vpl_liglabel=\relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\let\vpl_liglabel=\out_liglabel
+\def\out_ligstop{\out_lline{(STOP)}
+ \let\vpl_liglabel=\out_liglabel
+ \let\vpl_ligstop=\relax}
+\let\vpl_ligstop=\relax
+\def\do_mapfont{
+ \ifisglyph\slot_name\then
+ \mapfonts\slot_name
+ \fi
+}
+\def\vpl_scale#1#2{{
+ \divide \scaled_design_size by 8
+ \multiply \scaled_design_size by #1
+ \divide \scaled_design_size by \one_thousand
+ \multiply \scaled_design_size by 8
+ #2
+}}
+\def\vpl_mapfont#1#2{
+ \a_dimen=#2
+ \x_cs\ifx{#1-\the\scaled_design_size}\relax
+ \x_cs\xdef{#1-\the\scaled_design_size}{\the\font_count}
+ \x_cs\xdef{f-\the\font_count}{#1-\the\scaled_design_size}
+ \out_line{(MAPFONT~\vpl_int\font_count\space
+ (FONTNAME~#1)~
+ (FONTDSIZE~\vpl_real\a_dimen)~
+ (FONTAT~\vpl_real\scaled_design_size))}
+ \global\advance\font_count by 1
+ \fi
+}
+\newcount\font_count
+\newcount\next_mapfont
+\newcount\prev_mapfont
+\def\do_character{
+ \x_cs\ifx{g-\slot_name}\relax
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \afm_convert\a_dimen=\width\slot_name;
+ \do_character_sidebearings
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\height\slot_name;
+ \out_lline{(CHARHT~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\depth\slot_name;
+ \out_lline{(CHARDP~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\italic\slot_name;
+ \ifnum\a_dimen>0
+ \out_lline{(CHARIC~\vpl_real\a_dimen)}
+ \fi
+ \do_character_map
+ \fi
+ \fi
+}
+\def\do_character_sidebearings{
+ \ifisint{\slot_name-spacing}\then
+ \afm_convert\curr_bearings=\int{\slot_name-spacing};
+ \divide\curr_bearings by 2
+ \else
+ \curr_bearings=\side_bearings
+ \fi
+ \afm_convert\a_dimen=\width\slot_name;
+ \advance\a_dimen by 2\curr_bearings
+}
+\def\do_character_map{
+ \global\prev_mapfont=0 \out_lline{(MAP}
+ \ifdim \curr_bearings=0pt
+ \mapcommands\slot_name
+ \else
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \mapcommands\slot_name
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \fi
+ \out_llline{)}
+}
+\def\do_character_no_letterspacing{
+ \x_cs\ifx{g-\slot_name}\relax
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \afm_convert\a_dimen=\width\slot_name;
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\height\slot_name;
+ \out_lline{(CHARHT~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\depth\slot_name;
+ \out_lline{(CHARDP~\vpl_real\a_dimen)}
+ \afm_convert\a_dimen=\italic\slot_name;
+ \ifnum\a_dimen>0 \out_lline{(CHARIC~\vpl_real\a_dimen)} \fi
+ \global\prev_mapfont=0 \out_lline{(MAP}
+ \mapcommands\slot_name
+ \out_llline{)}
+ \fi
+ \fi
+}
+\def\gobble_setslot#1\endsetslot{\endsetslot}
+\def\end_do_character{
+ \ifisglyph\slot_name\then
+ \out_lline{)}
+ \fi
+}
+\def\notdef_name{.notdef}
+\def\vpl_nextlarger#1{
+ \ifisint{#1}\then
+ \out_lline{(NEXTLARGER~D~\the\int{#1})~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\nextlarger\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varchar{\out_lline{(VARCHAR}}
+\def\vpl_vartop#1{
+ \ifisint{#1}\then
+ \out_llline{(TOP~D~\the\int{#1})~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\vartop\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varmid#1{
+ \ifisint{#1}\then
+ \out_llline{(MID~D~\the\int{#1})~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varmid\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varbot#1{
+ \ifisint{#1}\then
+ \out_llline{(BOT~D~\the\int{#1})~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varbot\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varrep#1{
+ \ifisint{#1}\then
+ \out_llline{(REP~D~\the\int{#1})~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varrep\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\end_vpl_varchar{\out_llline{)}}
+\def\vpl_raw#1#2#3{
+ \global\next_mapfont=\csname~#1-\the\scaled_design_size\endcsname\relax
+ \ifnum\next_mapfont=\prev_mapfont\else
+ \out_llline{(SELECTFONT~\vpl_int\next_mapfont)~
+ (COMMENT~#1~at~\the\scaled_design_size)}
+ \fi
+ \out_llline{(SETCHAR~D~#2)~(COMMENT~#3)}
+ \global\prev_mapfont=\next_mapfont
+}
+\def\vpl_rule#1#2{
+ \afm_convert\a_dimen=#1;
+ \afm_convert\b_dimen=#2;
+ \out_llline{(SETRULE~\vpl_real\b_dimen\space~\vpl_real\a_dimen)}
+}
+\def\vpl_special#1{
+ \out_llline{(SPECIAL~#1)}}
+\def\vpl_warning#1{
+ \out_llline{(SPECIAL~Warning:~#1)}
+ \immediate\write16{Warning:~#1.}
+}
+\def\vpl_movert#1{
+ \afm_convert\a_dimen=#1;
+ \out_llline{(MOVERIGHT~\vpl_real\a_dimen)}
+}
+\def\vpl_moveup#1{
+ \afm_convert\a_dimen=#1;
+ \out_llline{(MOVEUP~\vpl_real\a_dimen)}
+}
+\def\vpl_push{\out_llline{(PUSH)}}
+\def\vpl_pop{\out_llline{(POP)}}
+\def\mtxtopl#1#2{{
+ \open_out{#2.pl}
+ \out_line{(COMMENT~raw~font~#2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.pl)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~TeX~font~with)}
+ \out_line{(COMMENT~pltotfm~#2.pl~#2.tfm)}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \out_line{(DESIGNSIZE~R~10.0)}
+ \out_line{(DESIGNUNITS~R~10.0)}
+ \out_line{}
+ \scaled_design_size=10pt
+ \let\setglyph=\iffalse
+ \let\endsetglyph=\fi
+ \let\setkern=\gobble_three
+ \let\setrawglyph=\pl_raw_glyph
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.pl)}
+ \close_out{Raw~font}
+}}
+\def\pl_raw_glyph#1#2#3#4#5#6#7#8{
+ \a_count=#4
+ \afm_convert\a_dimen=#5;
+ \afm_convert\b_dimen=#6;
+ \afm_convert\c_dimen=#7;
+ \afm_convert\d_dimen=#8;
+ \out_line{(CHARACTER~\vpl_int\a_count\space(COMMENT~#1)}
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \out_lline{(CHARHT~\vpl_real\b_dimen)}
+ \out_lline{(CHARDP~\vpl_real\c_dimen)}
+ \out_lline{(CHARIC~\vpl_real\d_dimen)}
+ \out_lline{)}
+}
+\newtoks\family_toks
+\def\installfonts{
+ \bgroup
+ \global\family_toks={}
+ \gdef\prev_file_list{}
+}
+\def\installfamily#1#2#3{
+ \global\family_toks=\expandafter{\the\family_toks\fd_family{#1}{#2}{#3}}
+ \global\x_cs\let{#1-#2}\empty_command
+}
+\def\installfont#1#2#3#4#5#6#7#8{
+ \install_font{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{\etxtovpl}
+}
+\def\installrawfont#1#2#3#4#5#6#7#8{
+ \install_font{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{\etxtopl}
+}
+\def\install_font#1#2#3#4#5#6#7#8#9{
+ \xdef\curr_file_list{#2}
+ \ifx\prev_file_list\curr_file_list\else
+ \egroup\bgroup
+ \expandafter\input_mtx_files\curr_file_list,
+ \relax,\end_input_mtx_files
+ \global\let\prev_file_list=\curr_file_list
+ \fi
+ #9{#3}{#1}
+ \x_cs\ifx{#4-#5-#6-#7}\relax
+ \let\do_shape=\relax
+ \x_cs\xdef{#4-#5}{
+ \x_cs\ifx{#4-#5}\relax\else
+ \csname#4-#5\endcsname
+ \fi
+ \do_shape{#4}{#5}{#6}{#7}
+ }
+ \fi
+ \let\do_size=\relax
+ \x_cs\xdef{#4-#5-#6-#7}{
+ \x_cs\ifx{#4-#5-#6-#7}\relax\else
+ \csname#4-#5-#6-#7\endcsname
+ \fi
+ \do_size{#8}{#1}
+ }
+}
+\def\endinstallfonts{
+ \let\do_shape=\fd_shape
+ \let\do_size=\fd_size
+ \the\family_toks
+ \global\family_toks{}
+ \egroup
+}
+\def\input_mtx_files#1,#2\end_input_mtx_files{
+ \if\relax#1
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ \input_mtx_file{#1}
+ \input_mtx_files#2\end_input_mtx_files
+ }
+}
+\def\input_mtx_file#1{
+ \if\relax#1\relax\else
+ \get_file_name #1~scaled~1000~;
+ \if_file_exists{\file_name.mtx}\then
+ \inputmtx\file_name
+ \else
+ % changed the order (SPQR, 15/01/97) because of cmr*.afm
+ % files found in TEXMF/fonts/afm hierarchy
+ \if_file_exists{\file_name.pl}\then
+ \pltomtx\file_name\file_name
+ \else
+ \if_file_exists{\file_name.afm}\then
+ \afmtomtx\file_name\file_name
+ \mtxtopl\file_name\file_name
+ \fi
+ \fi
+ \inputmtx\file_name
+ \fi
+ \fi
+}
+\def\get_file_name #1~scaled~#2~#3;{
+ \edef\file_name{#1}
+ \ifnum#2=\one_thousand
+ \unsetint{rawscale}
+ \else
+ \setint{rawscale}{#2}
+ \fi
+}
+\def\fd_family#1#2#3{
+ \a_toks{#3}
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1#2.fd}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~Filename:~\lowercase_file}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using~fontinst~v\fontinstversion}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~SHOULD~BE~PUT~IN~A~TEX~INPUTS~DIRECTORY}
+ \out_line{}
+ \out_line{\string\ProvidesFile{\lowercase_file}}
+ \out_lline{[
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day\space
+ Fontinst~v\fontinstversion\space
+ font~definitions~for~#1/#2.
+ ]}
+ \out_line{}
+ \out_line{\string\DeclareFontFamily{#1}{#2}{\the\a_toks}}
+ {
+ \csname #1-#2\endcsname
+ \out_line{}
+ \let\do_shape=\substitute_shape
+ \csname #1-#2\endcsname
+ \let\do_shape=\remove_shape
+ \csname #1-#2\endcsname
+ }
+ \x_cs\g_let{#1-#2}\relax
+ \out_line{}
+ \out_line{\string\endinput}
+ \close_out{Font~definitions}
+}
+\def\fd_shape#1#2#3#4{
+ \out_line{}
+ \out_line{\string\DeclareFontShape{#1}{#2}{#3}{#4}\left_brace_char}
+ \csname #1-#2-#3-#4\endcsname
+ \x_cs\g_let{#1-#2-#3-#4}\empty_command
+ \out_line{\right_brace_char{}}
+}
+\def\fd_size#1#2{
+ \x_cs\ifx{siz-#1}\relax
+ \out_lline{#1~#2}
+ \else
+ \out_lline{\csname siz-#1\endcsname\space #2}
+ \fi
+}
+\def\remove_shape#1#2#3#4{
+ \x_cs\g_let{#1-#2-#3-#4}\relax
+}
+\def\substitute_shape#1#2#3#4{
+ \edef\orig_shape{#4}
+ \substitute_series{#1}{#2}{#3}{\orig_shape}
+ \x_cs\ifx{sub-\orig_shape}\relax\else
+ \edef\subst_shape{\csname sub-\orig_shape\endcsname}
+ \x_cs\ifx{#1-#2-#3-\subst_shape}\relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{#3}{\subst_shape}{
+ <->\csname typ-\orig_shape\endcsname\space *~#2/#3/\orig_shape
+ }{}
+ }
+ \x_cs\let{#1-#2-#3-\subst_shape}\empty_command
+ \substitute_shape{#1}{#2}{#3}{\subst_shape}
+ \fi
+ \fi
+}
+\def\substitute_series#1#2#3#4{
+ \edef\orig_series{#3}
+ \x_cs\ifx{sub-\orig_series}\relax\else
+ \edef\subst_series{\csname sub-\orig_series\endcsname}
+ \x_cs\ifx{#1-#2-\subst_series-#4}\relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{\subst_series}{#4}{
+ <->\csname typ-\orig_series\endcsname\space *~#2/\orig_series/#4
+ }{}
+ }
+ \x_cs\let{#1-#2-\subst_series-#4}\empty_command
+ \substitute_series{#1}{#2}{\subst_series}{#4}
+ \fi
+ \fi
+}
+\def\substitutesilent#1#2{
+ \x_cs\def{sub-#2}{#1}
+ \x_cs\def{typ-#2}{ssub}
+}
+\def\substitutenoisy#1#2{
+ \x_cs\def{sub-#2}{#1}
+ \x_cs\def{typ-#2}{sub}
+}
+\substitutesilent{bx}{b}
+\substitutesilent{b}{bx}
+\substitutesilent{b}{sb}
+\substitutesilent{b}{db}
+\substitutesilent{m}{mb}
+\substitutesilent{m}{l}
+\substitutenoisy{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{it}{sl}
+\def\declareencoding#1#2{\x_cs\edef{enc-#1}{#2}}
+\declareencoding{TEX~TEXT}{OT1}
+\declareencoding{TEX~TEXT~WITHOUT~F-LIGATURES}{OT1}
+\declareencoding{TEX~TYPEWRITER~TEXT}{OT1TT}
+\declareencoding{TEX~MATH~ITALIC}{OML}
+\declareencoding{TEX~MATH~SYMBOLS}{OMS}
+\declareencoding{TEX~MATH~EXTENSION}{OMX}
+\declareencoding{LATEX~SYMBOLS}{lasy}
+\declareencoding{TEX~TEXT~SUBSET}{eufrak}
+\declareencoding{TEX~MATH~ITALIC~SUBSET}{eurm}
+\declareencoding{TEX~MATH~SYMBOLS~SUBSET}{euscr}
+\declareencoding{EULER~SUBSTITUTIONS~ONLY}{euex}
+\declareencoding{EXTENDED~TEX~FONT~ENCODING~-~LATIN}{T1}
+\declareencoding{TEX~TEXT~COMPANION~SYMBOLS~1---TS1}{TS1}
+\declareencoding{TEXBASE1ENCODING}{8r}
+\declareencoding{TEX~TYPEWRITER~AND~WINDOWS~ANSI}{8y}
+\def\declaresize#1#2{\x_cs\edef{siz-#1}{#2}}
+\declaresize{}{<->}
+\declaresize{5}{<5>}
+\declaresize{6}{<6>}
+\declaresize{7}{<7>}
+\declaresize{8}{<8>}
+\declaresize{9}{<9>}
+\declaresize{10}{<10>}
+\declaresize{11}{<10.95>}
+\declaresize{12}{<12>}
+\declaresize{14}{<14.4>}
+\declaresize{17}{<17.28>}
+\declaresize{20}{<20.74>}
+\declaresize{25}{<24.88>}
+\def\transformfont#1#2{{
+ \unsetstr{afm-name}
+ \unsetstr{etx-name}
+ \resetint{x-scale}{\one_thousand}
+ \resetint{y-scale}{\one_thousand}
+ \resetint{slant-scale}{0}
+ #2
+ \mtxtomtx{\str{afm-name}}{#1}
+ \mtxtopl{#1}{#1}
+}}
+\def\fromafm#1{
+ \setstr{afm-name}{#1}
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+}
+\def\frompl#1{
+ \setstr{afm-name}{#1}
+ \pltomtx{#1}{#1}
+}
+\def\frommtx#1{
+ \setstr{afm-name}{#1}
+}
+\def\scalefont#1#2{
+ \resetint{x-scale}{#1}
+ \resetint{y-scale}{\int{x-scale}}
+ #2
+}
+\def\xscalefont#1#2{
+ \resetint{x-scale}{#1}
+ #2
+}
+\def\yscalefont#1#2{
+ \resetint{y-scale}{#1}
+ #2
+}
+\def\slantfont#1#2{
+ \resetint{slant-scale}{#1}
+ #2
+}
+\def\reencodefont#1#2{
+ \resetstr{etx-name}{#1}
+ #2
+}
+\def\mtxtomtx#1#2{{
+ \ifisstr{etx-name}\then
+ \def\do_slot{\resetint\slot_name\slot_number}
+ \inputetx{\str{etx-name}}
+ \fi
+ \open_out{\temp_prefix#2.mtx}
+ \def\raw_font_name{#2}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \let\setint=\mtxtomtx_setint
+ \let\setrawglyph=\mtxtomtx_setrawglyph
+ \let\setnotglyph=\mtxtomtx_setrawglyph
+ \let\setkern=\mtxtomtx_setkern
+ \let\setglyph=\mtxtomtx_setglyph
+ \let\glyphpcc=\mtxtomtx_glyphpcc
+ \let\samesize=\mtxtomtx_samesize
+ \let\endsetglyph=\mtxtomtx_endsetglyph
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{\string\endmetrics}
+ \close_out{Transformed~metrics}
+}}
+\def\mtxtomtx_setint#1#2{
+ \def\temp_command{#1}
+ \ifx\temp_command\italicslant_name
+ \eval_expr_to\a_count{
+ \add{\int{slant-scale}}
+ {\div{\mul{\int{x-scale}}{#2}}{\int{y-scale}}}
+ }
+ \else
+ \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}}
+ \fi
+ \out_line{\string\setint{#1}{\the\a_count}}
+}
+\def\italicslant_name{italicslant}
+\def\mtxtomtx_setrawglyph#1#2#3#4#5#6#7#8{
+ \eval_expr_to\a_count{\scale{#5}{\int{x-scale}}}
+ \eval_expr_to\b_count{\scale{#6}{\int{y-scale}}}
+ \eval_expr_to\c_count{\scale{#7}{\int{y-scale}}}
+ \eval_expr_to\d_count{
+ \add{\scale{#8}{\int{x-scale}}}
+ {\scale\b_count{\int{slant-scale}}}
+ }
+ \ifisstr{etx-name}\then
+ \ifisint{#1}\then
+ \e_count=\int{#1}
+ \else
+ \e_count=-1
+ \fi
+ \else
+ \e_count=#4
+ \fi
+ \out_line{
+ \ifnum\e_count>-1
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {#1}{\raw_font_name}{#3}{\the\e_count}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+\def\mtxtomtx_setkern#1#2#3{
+ \eval_expr{\scale{\int{x-scale}}{#3}}
+ \out_line{\string\setkern{#1}{#2}{\the\result}}
+}
+\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}}
+\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}}
+\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}}
+\def\mtxtomtx_glyphpcc#1#2#3{
+ \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}}
+ \eval_expr_to\a_count{
+ \add{\scale{\int{x-scale}}{#2}}
+ {\scale\b_count{\int{slant-scale}}}
+ }
+ \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}}
+}
+\def\latinfamily#1#2{{
+ \edef\temp_command{#1}
+ \expandafter\parse_family\temp_command
+ \empty_command\empty_command\end_parse_family
+ \installfonts
+ \if_file_exists{\raw_encoding.mtx}\then
+ \installfamily{\raw_encoding}{\latex_family}{#2}
+ \fi
+ \installfamily{OT1}{\latex_family}{#2}
+ \installfamily{T1}{\latex_family}{#2}
+ \installfamily{TS1}{\latex_family}{#2}
+ \latin_weights
+ \endinstallfonts
+}}
+\def\parse_family #1#2#3#4#5\end_parse_family{
+ \gdef\font_family{#1#2#3}
+ \gdef\font_variant{#4#5}
+ \gdef\raw_variant{#4#5}
+ \gdef\latex_family{#1#2#3#4#5}
+ \_expert_false
+ \_oldstyle_false
+ \ifx#4x
+ \_expert_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1}
+ \else\ifx#4j
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else\ifx#49
+ \gdef\latex_family{#1#2#3j#5}
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else
+ \_expert_false
+ \_oldstyle_false
+ %\setcommand\digit##1{##1}
+ \fi\fi\fi
+ \if_oldstyle_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(oldstyle)}
+ \else\if_expert_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(expert)}
+ \else
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#4#5>}
+ \fi\fi
+}
+\newif\if_expert_
+\newif\if_oldstyle_
+\def\latin_weight#1#2{
+ \gdef\font_weight{#1}%
+ \gdef\latex_weight{#2}%
+ \latin_widths
+}
+\def\latin_width#1#2{
+ \gdef\font_width{#1}
+ \gdef\latex_width{#2}
+ \latin_shapes
+}
+\def\latin_shape#1#2#3#4#5{
+ \gdef\font_shape{#1}
+ \gdef\raw_shape{#2}
+ \gdef\encoding_shape{#3}
+ \if_oldstyle_
+ \gdef\encoding_shape{#3\oldstyle_shape}
+ \fi
+ \gdef\latex_shape{#4}
+ \gdef\encoding_switches{#5}
+ \immediate\write16{
+ INFO>~to~make~LaTeX~font~shape~<\latex_family,
+ \latex_weight,\latex_shape,\latex_width>~seek~
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx}
+ \csname fake_width_\font_width\endcsname
+ \csname fake_shape_\raw_shape\endcsname
+ \if_file_exists{
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \latin_encodings
+ \fi
+}
+\def\fake_shape_{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_raw_encoding
+ \fi
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.afm
+ }\then
+ \fake_shape_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width>
+ }
+ \transformfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+}
+\def\fake_shape_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width
+ }
+ \fi
+}
+\def\fake_shape_c{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ % If real smallcaps font doesn't exist, fake it from the roman.
+ \gdef\raw_shape{}
+ \if_oldstyle_
+ \gdef\encoding_shape{cj}
+ \else
+ \gdef\encoding_shape{c}
+ \fi
+ \fake_shape_
+ \fi
+}
+\def\fake_shape_o{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ \fake_shape_o_raw_encoding
+ \if_expert_
+ \fake_shape_o_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_o_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_shape_o_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \expert_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\let\fake_shape_i\fake_shape_ % We must do this again!
+\newif\if_fake_narrow_
+\_fake_narrow_false
+\def\fakenarrow#1{
+ \_fake_narrow_true
+ \gdef\fake_narrow_width{#1}
+}
+\def\fake_width_{}
+\def\fake_width_c{}
+\def\fake_width_n{
+ \if_fake_narrow_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then % no action required
+ \else
+ \fake_width_n_raw_encoding
+ \if_expert_
+ \fake_width_n_expert_encoding
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\def\latin_encoding#1#2#3#4#5{
+ \gdef\latex_encoding{#4}
+ \gdef\latex_mtx{#5}
+ \if_oldstyle_
+ \gdef\font_encoding{#3}
+ \else\if_expert_
+ \gdef\font_encoding{#2}
+ \else
+ \gdef\font_encoding{#1}
+ \fi\fi
+ \gdef\expert_font{}
+ \gdef\oldstyle_font{}
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \gdef\expert_font{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width,
+ }
+ \fi
+ \fi
+ \immediate\write16{
+ INFO>~run~\string\installfont\space
+ <\font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx>
+ <\latex_encoding\encoding_shape>
+ <\latex_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installfont{
+ \font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width
+ }{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx
+ }{
+ \latex_encoding\encoding_shape
+ }{
+ \latex_encoding
+ }{
+ \latex_family
+ }{
+ \latex_weight\latex_width
+ }{
+ \latex_shape
+ }{}
+}
+\def\latin_weights{
+ \latin_weight{r}{m}
+ \latin_weight{k}{m}
+ \latin_weight{b}{b}
+ \latin_weight{s}{sb}
+ \latin_weight{d}{db} % was {d}{sb}, SPQR changed
+ \latin_weight{m}{mb} % was {m}{m}, UV changed
+ \latin_weight{c}{eb} % UV added
+ \latin_weight{h}{eb} % UV added
+ \latin_weight{x}{eb}
+ \latin_weight{u}{ub}
+ \latin_weight{l}{l}
+ %\latin_weight{j}{el}
+ %\latin_weight{a}{ul} % UV added
+}
+\def\latin_widths{
+ \latin_width{}{}
+ \latin_width{n}{c}
+ %latin_width{c}{c}
+ %latin_width{x}{x}
+}
+\def\latin_shapes{
+ \latin_shape{} {} {} {n} {\_textcomp_true }
+ \latin_shape{c}{c}{} {sc}{\_textcomp_false}
+ \latin_shape{o}{o}{} {sl}{\_textcomp_true }
+ \latin_shape{i}{i}{i}{it}{\_textcomp_true }
+}
+\def\latin_encodings{
+ \latin_encoding{7t}{9t}{9o}{OT1}{latin}
+ \latin_encoding{8t}{9e}{9d}{T1} {latin}
+ \encoding_switches
+ \if_textcomp_
+ \latin_encoding{8c}{9c}{9c}{TS1}{textcomp}
+ \fi
+}
+\newif\if_textcomp_
+
+\def\raw_encoding{8r}
+\def\adobe_encoding{8a}
+\def\expert_encoding{8x}
+
+\def\caps_shape{c}
+\def\oldstyle_shape{j}
+\def\SlantAmount{167}
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~\fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+\def\NOFILES{
+ \def\transformfont##1##2{
+ \touch_file{##1.mtx}
+ \touch_file{##1.pl}
+ }
+ \def\installfonts{}
+ \def\endinstallfonts{}
+ \def\installfont##1##2##3##4##5##6##7##8{%
+ \touch_file{##1.vpl}
+ }
+ \def\installrawfont##1##2##3##4##5##6##7##8{%
+ \touch_file{##1.pl}
+ }
+ \def\installfamily##1##2##3{
+ \touch_file{##1##2.fd}
+ }
+}
+\def\touch_file#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~TEST~FILE.}
+ \out_line{\percent_char~Created~whilst~debugging~fontinst.}
+ \close_out{Test~file}
+}
+\errorcontextlines=999
+\newlinechar=`\^^J
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\x_cs\def{bye}{\par\vfill\supereject\@@end}
+\fi
+\catcode`\@=\atcatcode
+\catcode`\^^M=\nlcatcode
+\catcode`\ =\spacecatcode
+\catcode`\~=\tildecatcode
+\if_file_exists{fontinst.rc}\then
+ \primitiveinput fontinst.rc
+ \catcode`\_=\underscorecatcode
+\else
+ \catcode`\_=\underscorecatcode
+ \immediate\write16{No file fontinst.rc.}
+\fi
+\endinput
+%%
+%% End of file `fontinst.sty'.
diff --git a/fonts/utilities/corelfonts/fontnames.dat b/fonts/utilities/corelfonts/fontnames.dat
new file mode 100644
index 0000000000..21d665a9c6
--- /dev/null
+++ b/fonts/utilities/corelfonts/fontnames.dat
@@ -0,0 +1,818 @@
+AachenBT-Bold 1103 baab8a aachen rm
+AachenBT-Roman 1102 baar8a aachen rm
+AdLibBT-Regular 1154 ba3r8a adlib rm
+Aldine401BT-BoldA 0304 bbbb8a bembo rm
+Aldine401BT-BoldItalicA 0305 bbbbi8a bembo rm
+Aldine401BT-ItalicA 0303 bbbri8a bembo rm
+Aldine401BT-RomanA 0302 bbbr8a bembo rm
+Aldine721BT-Bold 0114 bpnb8a plantin rm
+Aldine721BT-BoldItalic 0115 bpnbi8a plantin rm
+Aldine721BT-Italic 0113 bpnri8a plantin rm
+Aldine721BT-Light 0804 bpnl8a plantin rm
+Aldine721BT-LightItalic 0805 bpnli8a plantin rm
+Aldine721BT-Roman 0112 bpnr8a plantin rm
+AllegroBT-Regular 1138 ba5r8a allegro rm
+AlternateGothicNo2BT-Regular 0542 ba4r8a altgoth2 sf
+AmazoneBT-Regular 1040 bmzr8a amazone rm
+AmeliaBT-Regular 0510 ba6r8a amelia rm
+AmerTypewriterITCbyBT-Bold 0194 batb8a atypewri tt
+AmerTypewriterITCbyBT-Medium 0193 batm8a atypewri tt
+AmericanGaramondBT-Bold 0045 bg3b8a garamon3 rm
+AmericanGaramondBT-BoldItalic 0046 bg3bi8a garamon3 rm
+AmericanGaramondBT-Italic 0044 bg3ri8a garamon3 rm
+AmericanGaramondBT-Roman 0043 bg3r8a garamon3 rm
+AmericanTextBT-Regular 0211 ba7r8a amertext rm
+AmericanaBT-Bold 0500 bamb8a amercana rm
+AmericanaBT-ExtraBold 0501 bamx8a amercana rm
+AmericanaBT-ExtraBoldCondensed 0502 bamx8ac amercana rm
+AmericanaBT-Italic 0499 bamri8a amercana rm
+AmericanaBT-Roman 0498 bamr8a amercana rm
+AmerigoBT-BoldA 0645 beob8a amerigo rm
+AmerigoBT-BoldItalicA 0772 beobi8a amerigo rm
+AmerigoBT-ItalicA 0644 beori8a amerigo rm
+AmerigoBT-MediumA 0770 beom8a amerigo rm
+AmerigoBT-MediumItalicA 0771 beomi8a amerigo rm
+AmerigoBT-RomanA 0643 beor8a amerigo rm
+ArrusBT-Black 1149 brsc8a arrus rm
+ArrusBT-BlackItalic 1150 brsci8a arrus rm
+ArrusBT-Bold 1147 brsb8a arrus rm
+ArrusBT-BoldItalic 1148 brsbi8a arrus rm
+ArrusBT-Italic 1146 brsri8a arrus rm
+ArrusBT-Roman 1145 brsr8a arrus rm
+AuroraBT-BoldCondensed 1028 ba8b8ac aurora rm
+AuroraBT-RomanCondensed 1027 ba8a8ac aurora rm
+AvantGardeITCbyBT-Book 0154 bagk8a avantgar rm
+AvantGardeITCbyBT-BookOblique 0155 bagko8a avantgar rm
+AvantGardeITCbyBT-Medium 0156 bagm8a avantgar rm
+AvantGardeITCbyBT-MediumOblique 0157 bagmo8a avantgar rm
+BakerSignetBT-Roman 1152 bbsr8a bakersig rm
+BalloonBT-Bold 0728 bbob8a balloon rm
+BalloonBT-ExtraBold 0729 bbox8a balloon rm
+BalloonBT-Light 0121 bbol8a balloon rm
+BankGothicBT-Light 0589 bkgl8a bankgoth sf
+BankGothicBT-Medium 0590 bkgm8a bankgoth sf
+BauerBodoniBT-Black 0332 bubc8a babodoni rm
+BauerBodoniBT-BlackCondensed 0335 bubc8ac babodoni rm
+BauerBodoniBT-BlackItalic 0333 bubci8a babodoni rm
+BauerBodoniBT-Bold 0330 bubb8a babodoni rm
+BauerBodoniBT-BoldCondensed 0334 bubb8ac babodoni rm
+BauerBodoniBT-BoldItalic 0331 bubbi8a babodoni rm
+BauerBodoniBT-Italic 0329 bubri8a babodoni rm
+BauerBodoniBT-Roman 0328 bubr8a babodoni rm
+BauerBodoniBT-Titling 1072 bubrd8a babodoni rm
+BauhausITCbyBT-Bold 0408 bbhb8a bauhaus rm
+BauhausITCbyBT-Heavy 0409 bbhh8a bauhaus rm
+BauhausITCbyBT-Light 0405 bbhl8a bauhaus rm
+BauhausITCbyBT-Medium 0406 bbhm8a bauhaus rm
+BellCentennialBT-Address 0356 b_____ bellcent rm
+BellCentennialBT-BoldListing 0358 b_____ bellcent rm
+BellCentennialBT-NameAndNumber 0355 b_____ bellcent rm
+BellCentennialBT-SubCaption 0357 b_____ bellcent rm
+BellGothicBT-Black 0361 bbecs8a bell rm
+BellGothicBT-Bold 0360 bbebs8a bell rm
+BellGothicBT-Roman 0359 bbers8a bell rm
+BelweBT-Bold 1024 bblb8a belwe rm
+BelweBT-Light 1022 bbll8a belwe rm
+BelweBT-Medium 1023 bblm8a belwe rm
+BelweBT-RomanCondensed 1025 bblr8ac belwe rm
+BenguiatGothicITCbyBT-Bold 0463 bugb8a bengugth rm
+BenguiatGothicITCbyBT-BoldItal 0464 bugbi8a bengugth rm
+BenguiatGothicITCbyBT-Book 0459 bugk8a bengugth rm
+BenguiatGothicITCbyBT-BookItal 0460 bugki8a bengugth rm
+BenguiatITCbyBT-Bold 0127 bbgb8a benguiat rm
+BenguiatITCbyBT-BoldItalic 0128 bbgbi8a benguiat rm
+BenguiatITCbyBT-Book 0123 bbgk8a benguiat rm
+BenguiatITCbyBT-BookItalic 0124 bbgki8a benguiat rm
+BernhardBoldCondensedBT-Regular 1003 bb7b8ac bernhard rm
+BernhardFashionBT-Regular 1051 bb7rn8a bernhard rm
+BernhardModernBT-Bold 0838 bb7b8a bernhard rm
+BernhardModernBT-BoldItalic 0839 bb7bi8a bernhard rm
+BernhardModernBT-Italic 0837 bb7ri8a bernhard rm
+BernhardModernBT-Roman 0607 bb7r8a bernhard rm
+BernhardTangoBT-Regular 0986 bb7rw8a bernhard rm
+BlippoBT-Black 0511 bb8c8a blippo sf
+BodoniBT-Bold 0037 bbdb8a bodoni rm
+BodoniBT-BoldCondensed 0973 bbdb8ac bodoni rm
+BodoniBT-BoldItalic 0038 bbdbi8a bodoni rm
+BodoniBT-Book 0035 bbdk8a bodoni rm
+BodoniBT-BookItalic 0036 bbdki8a bodoni rm
+BodoniBT-Italic 0056 bbdri8a bodoni rm
+BodoniBT-Roman 0055 bbdr8a bodoni rm
+BookmanITCbyBT-Demi 0079 bbkd8a bookman rm
+BookmanITCbyBT-DemiItalic 0080 bbkdi8a bookman rm
+BookmanITCbyBT-Light 0075 bbkl8a bookman rm
+BookmanITCbyBT-LightItalic 0076 bbkli8a bookman rm
+BremenBT-Black 1232 bb9c8a bremen rm
+BremenBT-Bold 1231 bb9b8a bremen rm
+BroadwayBT-Regular 0131 bbwr8a broadway rm
+BroadwayEngravedBT-Regular 0802 bbwre8a broadway rm
+Brush445BT-Regular 0990 bp3r8a palette rm
+Brush738BT-RegularA 0806 bb4r8a bison rm
+BrushScriptBT-Regular 0199 bburw8a brush rm
+BulmerBT-Italic 1076 bbmri8a bulmer rm
+BulmerBT-Roman 1075 bbmr8a bulmer rm
+Calligraphic421BT-RomanB 1139 bc9r8a codex rm
+Calligraphic810BT-Italic 0812 bdiri8a diotima rm
+Calligraphic810BT-Roman 0811 bdir8a diotima rm
+CandidaBT-Bold 0810 bcib8a candida rm
+CandidaBT-Italic 0809 bciri8a candida rm
+CandidaBT-Roman 0808 bcir8a candida rm
+CarminaBT-Black 0668 brmc8a carmina rm
+CarminaBT-BlackItalic 0719 brmci8a carmina rm
+CarminaBT-Bold 0723 brmb8a carmina rm
+CarminaBT-BoldItalic 0724 brmbi8a carmina rm
+CarminaBT-Light 0667 brml8a carmina rm
+CarminaBT-LightItalic 0624 brmli8a carmina rm
+CarminaBT-Medium 0721 brmm8a carmina rm
+CarminaBT-MediumItalic 0722 brmmi8a carmina rm
+Caslon224ITCbyBT-Bold 0749 bc2b8a casln224 rm
+Caslon224ITCbyBT-BoldItalic 0750 bc2bi8a casln224 rm
+Caslon224ITCbyBT-Book 0745 bc2k8a casln224 rm
+Caslon224ITCbyBT-BookItalic 0746 bc2ki8a casln224 rm
+Caslon540BT-Italic 0119 bc5ri8a casln540 rm
+Caslon540BT-Roman 0118 bc5r8a casln540 rm
+CaslonBT-Bold 0443 bcab8a caslon rm
+CaslonBT-BoldItalic 0444 bcabi8a caslon rm
+CaslonOpenfaceBT-Regular 0581 bcarl8a caslon rm
+CaxtonBT-Bold 0891 bcxb8a caxton rm
+CaxtonBT-BoldItalic 0892 bcxbi8a caxton rm
+CaxtonBT-Book 0889 bcxk8a caxton rm
+CaxtonBT-BookItalic 0890 bcxki8a caxton rm
+CaxtonBT-Light 0887 bcxl8a caxton rm
+CaxtonBT-LightItalic 0888 bcxli8a caxton rm
+Century725BT-Black 1060 bcnc8a century rm
+Century725BT-Bold 1056 bcnb8a century rm
+Century725BT-BoldCondensed 1058 bcnb8ac century rm
+Century725BT-Italic 1059 bcnri8a century rm
+Century725BT-Roman 1055 bcnr8a century rm
+Century725BT-RomanCondensed 1057 bcnr8ac century rm
+CenturyExpandedBT-Bold 0041 bcnb8ax century rm
+CenturyExpandedBT-BoldItalic 0042 bcnbi8ax century rm
+CenturyExpandedBT-Italic 0040 bcnri8ax century rm
+CenturyExpandedBT-Roman 0039 bcnr8ax century rm
+CenturyOldstyleBT-Bold 0287 bcub8a centuros rm
+CenturyOldstyleBT-Italic 0286 bcuri8a centuros rm
+CenturyOldstyleBT-Roman 0285 bcur8a centuros rm
+CenturySchoolbookBT-Bold 0085 bcsb8a cntursbk rm
+CenturySchoolbookBT-BoldCond 0574 bcsb8ac cntursbk rm
+CenturySchoolbookBT-BoldItalic 0086 bcsbi8a cntursbk rm
+CenturySchoolbookBT-Italic 0084 bcsri8a cntursbk rm
+CenturySchoolbookBT-Monospace 0600 bcsrt8a cntursbk rm
+CenturySchoolbookBT-Roman 0083 bcsr8a cntursbk rm
+CharterBT-Black 0709 bchk8a charter rm
+CharterBT-BlackItalic 0710 bchki8a charter rm
+CharterBT-Bold 0632 bchb8a charter rm
+CharterBT-BoldItalic 0633 bchbi8a charter rm
+CharterBT-Italic 0649 bchri8a charter rm
+CharterBT-Roman 0648 bchr8a charter rm
+CheltenhamBT-Bold 0622 bctb8a cheltenh rm
+CheltenhamBT-BoldCondItalic 1066 bctbi8ac cheltenh rm
+CheltenhamBT-BoldCondensed 1065 bctb8ac cheltenh rm
+CheltenhamBT-BoldExtraCondensed 1067 bctb8aq cheltenh rm
+CheltenhamBT-BoldHeadline 0508 bctbd8a cheltenh rm
+CheltenhamBT-BoldItalic 0623 bctbi8a cheltenh rm
+CheltenhamBT-BoldItalicHeadline 0509 bctbdi8a cheltenh rm
+CheltenhamBT-Italic 0621 bctri8a cheltenh rm
+CheltenhamBT-Roman 0620 bctr8a cheltenh rm
+CheltenhamITCbyBT-Bold 0383 bctb8a cheltenh rm
+CheltenhamITCbyBT-BoldItalic 0384 bctbi8a cheltenh rm
+CheltenhamITCbyBT-Book 0381 bctk8a cheltenh rm
+CheltenhamITCbyBT-BookItalic 0382 bctki8a cheltenh rm
+ClarendonBT-Black 0351 bcdc8a clarendo rm
+ClarendonBT-Bold 0284 bcdb8a clarendo rm
+ClarendonBT-BoldCondensed 0228 bcdb8ac clarendo rm
+ClarendonBT-Heavy 0416 bcdh8a clarendo rm
+ClarendonBT-Light 0282 bcdl8a clarendo rm
+ClarendonBT-Roman 0283 bcdr8a clarendo rm
+ClarendonBT-RomanCondensed 0846 bcdr8ac clarendo rm
+ClassicalGaramondBT-Bold 0279 bsbb8a sabon rm
+ClassicalGaramondBT-BoldItalic 0972 bsbbi8a sabon rm
+ClassicalGaramondBT-Italic 0278 bsbri8a sabon rm
+ClassicalGaramondBT-Roman 0277 bsbr8a sabon rm
+CloisterBlackBT-Regular 0757 bclr8a cloister rm
+CloisterOpenFaceBT-Regular 0938 bclrl8a cloister rm
+CommercialScriptBT-Regular 0976 bi0r8a commscr rm
+CompactaBT-Black 0788 bc7c8a compacta rm
+CompactaBT-Bold 0786 bc7b8a compacta rm
+CompactaBT-BoldItalic 0787 bc7bi8a compacta rm
+CompactaBT-Italic 0785 bc7ri8a compacta rm
+CompactaBT-Light 0783 bc7l8a compacta rm
+CompactaBT-Roman 0784 bc7r8a compacta rm
+CooperBT-Black 0630 bcbc8a cooper rm
+CooperBT-BlackHeadline 0231 bcbcd8a cooper rm
+CooperBT-BlackItalic 0631 bcbci8a cooper rm
+CooperBT-BlackItalicHeadline 0232 bcbcid8a cooper rm
+CooperBT-BlackOutline 1034 bcbcl8a cooper rm
+CooperBT-Bold 0579 bcbb8a cooper rm
+CooperBT-BoldItalic 0580 bcbbi8a cooper rm
+CooperBT-Light 0575 bcbl8a cooper rm
+CooperBT-LightItalic 0576 bcbli8a cooper rm
+CooperBT-Medium 0577 bcbm8a cooper rm
+CooperBT-MediumItalic 0578 bcbmi8a cooper rm
+CopperplateGothicBT-Bold 0421 bcpbs8a copperpl rm
+CopperplateGothicBT-BoldCond 0424 bcpbs8ac copperpl rm
+CopperplateGothicBT-Heavy 0422 bcphs8a copperpl rm
+CopperplateGothicBT-Roman 0420 bcprs8a copperpl rm
+CopperplateGothicBT-RomanCond 0423 bcprs8ac copperpl rm
+Courier10PitchBT-Bold 0583 bcrb8a courier tt
+Courier10PitchBT-BoldItalic 0611 bcrbi8a courier tt
+Courier10PitchBT-Italic 0582 bcrri8a courier tt
+Courier10PitchBT-Roman 0419 bcrr8a courier tt
+CushingITCbyBT-Heavy 0641 buhh8a cushing rm
+CushingITCbyBT-HeavyItalic 0642 buhhi8a cushing rm
+DavidaBoldBT-Regular 0195 bd0b8a davida rm
+DeVinneBT-Italic 0912 bviri8a victoria rm
+DeVinneBT-ItalicText 1042 bvirid8a victoria rm
+DeVinneBT-Roman 0911 bvir8a victoria rm
+DeVinneBT-Text 1041 bvird8a victoria rm
+Decorated035BT-Regular 0605 bpfr8a profile rm
+DellaRobbiaBT-Bold 1113 bdeb8a dellarob rm
+DellaRobbiaBT-Roman 1112 bder8a dellarob rm
+DomBoldBT-Regular 0769 bdcb8a domcasl rm
+DomCasualBT-Regular 0604 bdcr8a domcasl rm
+DomDiagonalBT-Bold 0921 bdcbi8a domcasl rm
+DomDiagonalBT-Regular 0920 bdcri8a domcasl rm
+Dutch766BT-BoldA 0340 biib8a imprint rm
+Dutch766BT-ItalicA 0339 biiri8a imprint rm
+Dutch766BT-RomanA 0338 biir8a imprint rm
+Dutch801BT-Bold 0013 btmb8a times rm
+Dutch801BT-BoldItalic 0014 btmbi8a times rm
+Dutch801BT-ExtraBold 0549 btmx8a times rm
+Dutch801BT-ExtraBoldItalic 0971 btmxi8a times rm
+Dutch801BT-Italic 0012 btmri8a times rm
+Dutch801BT-ItalicHeadline 1036 btmrid8a times rm
+Dutch801BT-Roman 0011 btmr8a times rm
+Dutch801BT-RomanHeadline 1035 btmrd8a times rm
+Dutch801BT-SemiBold 0834 btms8a times rm
+Dutch801BT-SemiBoldItalic 0835 btmsi8a times rm
+Dutch809BT-BoldC 1063 bocb8a concorde rm
+Dutch809BT-ItalicC 1062 bocri8a concorde rm
+Dutch809BT-RomanC 1061 bocr8a concorde rm
+Dutch811BT-BoldD 1085 boyb8a olympian rm
+Dutch811BT-BoldItalicD 1086 boybi8a olympian rm
+Dutch811BT-ItalicD 1084 boyri8a olympian rm
+Dutch811BT-RomanD 1083 boyr8a olympian rm
+Dutch823BT-BoldB 0237 bnab8a newaster rm
+Dutch823BT-BoldItalicB 0753 bnabi8a newaster rm
+Dutch823BT-ItalicB 0236 bnari8a newaster rm
+Dutch823BT-RomanB 0235 bnar8a newaster rm
+Egyptian505BT-Bold 0964 beeb8a egyptian rm
+Egyptian505BT-Light 0961 beel8a egyptian rm
+Egyptian505BT-Medium 0963 beem8a egyptian rm
+Egyptian505BT-Roman 0962 beer8a egyptian rm
+ElegantGaramondBT-Bold 0713 bgjb8a granjon rm
+ElegantGaramondBT-Italic 0712 bgjri8a granjon rm
+ElegantGaramondBT-Roman 0711 bgjr8a granjon rm
+EmbassyBT-Regular 0588 be0r8a embassy rm
+EmpireBT-Regular 1176 be1r8a empire sf
+English157BT-Regular 0840 boer8a oldengli rm
+EngraversGothicBT-Regular 0586 benrs8a engraver sf
+EngraversOldEnglishBT-Bold 1045 benbf8a engraver sf
+EngraversOldEnglishBT-Regular 0212 benrf8a engraver sf
+EngraversRomanBT-Bold 0974 benb8a engraver sf
+EngraversRomanBT-Regular 0587 benr8a engraver sf
+ErasITCbyBT-Bold 0242 berb8a eras rm
+ErasITCbyBT-Book 0239 berk8a eras rm
+ErasITCbyBT-Demi 0241 berd8a eras rm
+ErasITCbyBT-Light 0238 berl8a eras rm
+ErasITCbyBT-Medium 0240 berm8a eras rm
+ErasITCbyBT-Ultra 0243 beru8a eras rm
+Exotic350BT-Bold 0628 bpgb8a peignot sf
+Exotic350BT-DemiBold 0627 bpgd8a peignot sf
+Exotic350BT-Light 0626 bpgl8a peignot sf
+FeniceITCbyBT-Bold 0684 bfnb8a fenice rm
+FeniceITCbyBT-BoldItalic 0685 bfnbi8a fenice rm
+FeniceITCbyBT-Regular 0682 bfnr8a fenice rm
+FeniceITCbyBT-RegularItalic 0683 bfnri8a fenice rm
+Flareserif821BT-Bold 0918 balb8a albertus rm
+Flareserif821BT-Light 0916 ball8a albertus rm
+Flareserif821BT-Roman 0917 balr8a albertus rm
+FlemishScriptBT-Regular 0591 bf0r8a flemishs rm
+FolioBT-Bold 0852 bfob8a folio rm
+FolioBT-BoldCondensed 0854 bfob8ac folio rm
+FolioBT-Book 0850 bfok8a folio rm
+FolioBT-ExtraBold 0853 bfox8a folio rm
+FolioBT-Light 0848 bfol8a folio rm
+FolioBT-LightItalic 0849 bfoli8a folio rm
+FolioBT-Medium 0851 bfom8a folio rm
+Formal436BT-Regular 1141 bpi005 frml436n rm
+FormalScript421BT-Regular 0609 boir8a ondine rm
+FrakturBT-Regular 0983 bftr8a fettefrk rm
+FranklinGothicITCbyBT-Book 0670 bfgk8a frankgth rm
+FranklinGothicITCbyBT-BookItal 0671 bfgki8a frankgth rm
+FranklinGothicITCbyBT-Demi 0674 bfgd8a frankgth rm
+FranklinGothicITCbyBT-DemiItal 0675 bfgdi8a frankgth rm
+FranklinGothicITCbyBT-Heavy 0676 bfgh8a frankgth rm
+FranklinGothicITCbyBT-HeavyItal 0677 bfghi8a frankgth rm
+Freeform710BT-Regular 0714 bekr8a eckmann rm
+Freeform721BT-Black 1001 bauc8a auriol rm
+Freeform721BT-BlackItalic 1002 bauci8a auriol rm
+Freeform721BT-Bold 0999 baub8a auriol rm
+Freeform721BT-BoldItalic 1000 baubi8a auriol rm
+Freeform721BT-Italic 0998 bauri8a auriol rm
+Freeform721BT-Roman 0997 baur8a auriol rm
+Freehand471BT-Regular 0418 bccr8a cascade rm
+Freehand521BT-RegularC 1018 bmar8a mandate rm
+Freehand575BT-RegularB 1046 bjfr8a jeffersn rm
+Freehand591BT-RegularA 1043 bb5r8a binghams rm
+FrizQuadrataITCbyBT-Bold 0429 bfqb8a frizquad rm
+FrizQuadrataITCbyBT-Roman 0428 bfqr8a frizquad rm
+FrysBaskervilleBT-Roman 1101 b_____ frybaskn rm
+FuturaBT-Bold 0144 bfub8a futura sf
+FuturaBT-BoldCondensed 0202 bfub8ac futura sf
+FuturaBT-BoldCondensedItalic 0203 bfubi8ac futura sf
+FuturaBT-BoldItalic 0145 bfubi8a futura sf
+FuturaBT-Book 0140 bfuk8a futura sf
+FuturaBT-BookItalic 0141 bfuki8a futura sf
+FuturaBT-ExtraBlack 0148 bfux8a futura sf
+FuturaBT-ExtraBlackCondItalic 0205 bfuxi8ac futura sf
+FuturaBT-ExtraBlackCondensed 0204 bfux8ac futura sf
+FuturaBT-ExtraBlackItalic 0149 bfuxi8a futura sf
+FuturaBT-Heavy 0146 bfuh8a futura sf
+FuturaBT-HeavyItalic 0147 bfuhi8a futura sf
+FuturaBT-Light 0138 bful8a futura sf
+FuturaBT-LightCondensed 0200 bful8ac futura sf
+FuturaBT-LightItalic 0139 bfuli8a futura sf
+FuturaBT-Medium 0142 bfum8a futura sf
+FuturaBT-MediumCondensed 0201 bfum8ac futura sf
+FuturaBT-MediumItalic 0143 bfumi8a futura rm
+FuturaBlackBT-Regular 0206 bfuc8a futura sf
+GalliardITCbyBT-Bold 0069 bglb8a galliard rm
+GalliardITCbyBT-BoldItalic 0070 bglbi8a galliard rm
+GalliardITCbyBT-Italic 0068 bglri8a galliard rm
+GalliardITCbyBT-Roman 0067 bglr8a galliard rm
+GandoBT-Regular 0625 bg0r8a gando rm
+GaramondITCbyBT-Bold 0347 bgmb8a garamond rm
+GaramondITCbyBT-BoldCondItalic 0456 bgmbi8ac garamond rm
+GaramondITCbyBT-BoldCondensed 0455 bgmb8ac garamond rm
+GaramondITCbyBT-BoldItalic 0348 bgmbi8a garamond rm
+GaramondITCbyBT-Book 0345 bgmk8a garamond rm
+GaramondITCbyBT-BookCondItalic 0454 bgmki8ac garamond rm
+GaramondITCbyBT-BookCondensed 0453 bgmk8ac garamond rm
+GaramondITCbyBT-BookItalic 0346 bgmki8a garamond rm
+Geometric212BT-Book 0150 bsnk8a spartan rm
+Geometric212BT-BookCondensed 0503 bsnk8ac spartan rm
+Geometric212BT-Heavy 0151 bsnh8a spartan rm
+Geometric212BT-HeavyCondensed 0504 bsnh8ac spartan rm
+Geometric231BT-BoldC 1128 bkbb8a kabel sf
+Geometric231BT-HeavyC 1129 bkbh8a kabel sf
+Geometric231BT-LightC 1126 bkbl8a kabel sf
+Geometric231BT-RomanC 1127 bkbr8a kabel sf
+Geometric415BT-BlackA 0524 bm2c8a metro sf
+Geometric415BT-BlackItalicA 0525 bm2ci8a metro sf
+Geometric415BT-LiteA 0520 bm2l8a metro sf
+Geometric415BT-LiteItalicA 0521 bm2li8a metro sf
+Geometric415BT-MediumA 0522 bm2m8a metro sf
+Geometric415BT-MediumItalicA 0523 bm2mi8a metro sf
+Geometric706BT-BlackB 0661 bnzc8a neuzeits sf
+Geometric706BT-BlackCondensedB 0663 bnzc8ac neuzeits sf
+Geometric706BT-BoldCondensedB 0662 bnzb8ac neuzeits sf
+Geometric706BT-MediumB 0660 bnzm8a neuzeits sf
+Geometric885BT-RegularD 1140 b_____ geo885n rm
+GeometricSlab703BT-Bold 0310 bmpb8a memphis rm
+GeometricSlab703BT-BoldCond 1020 bmpb8ac memphis rm
+GeometricSlab703BT-BoldItalic 0311 bmpbi8a memphis rm
+GeometricSlab703BT-Light 0306 bmpl8a memphis rm
+GeometricSlab703BT-LightItalic 0307 bmpli8a memphis rm
+GeometricSlab703BT-Medium 0308 bmpm8a memphis rm
+GeometricSlab703BT-MediumCond 1019 bmpm8ac memphis rm
+GeometricSlab703BT-MediumItalic 0309 bmpmi8a memphis rm
+GeometricSlab703BT-XtraBold 0312 bmpx8a memphis rm
+GeometricSlab703BT-XtraBoldCond 1021 bmpx8ac memphis rm
+GeometricSlab703BT-XtraBoldItal 0313 bmpxi8a memphis rm
+GeometricSlab712BT-BoldA 0487 brwb8a rockwell rm
+GeometricSlab712BT-ExtraBoldA 0488 brwx8a rockwell rm
+GeometricSlab712BT-LightA 0483 brwl8a rockwell rm
+GeometricSlab712BT-LightItalicA 0484 brwli8a rockwell rm
+GeometricSlab712BT-MediumA 0485 brwm8a rockwell rm
+GeometricSlab712BT-MediumItalA 0486 brwmi8a rockwell rm
+GorillaITCbyBT-Regular 0664 bg6r8a gorilla rm
+Gothic720BT-BoldB 0995 bgqb8a grotesq rm
+Gothic720BT-BoldItalicB 0996 bgqbi8a grotesq rm
+Gothic720BT-ItalicB 0994 bgqri8a grotesq rm
+Gothic720BT-LightB 0991 bgql8a grotesq rm
+Gothic720BT-LightItalicB 0992 bgqli8a grotesq rm
+Gothic720BT-RomanB 0993 bgqr8a grotesq rm
+Gothic725BT-BlackA 1007 bazc8a azdzgrot sf
+Gothic725BT-BoldA 0541 bazb8a azdzgrot sf
+Gothic821CondensedBT-Regular 0807 bb6r8ac block sf
+GothicNo13BT-Regular 0120 b_____ gothic13 rm
+GoudyCatalogueBT-Regular 1054 bg5r8a gycatalg rm
+GoudyHandtooledBTsRegular 1053 bgyrf8a goudy rm
+GoudyHeavyfaceBT-Regular 1049 bgyh8a goudy rm
+GoudyHeavyfaceBT-RegularCond 1050 bgyh8ac goudy rm
+GoudyOldStyleBT-Bold 0109 bgob8a gyoldsty rm
+GoudyOldStyleBT-BoldItalic 0110 bgobi8a gyoldsty rm
+GoudyOldStyleBT-ExtraBold 0111 bgox8a gyoldsty rm
+GoudyOldStyleBT-Italic 0108 bgori8a gyoldsty rm
+GoudyOldStyleBT-Roman 0107 bgor8a gyoldsty rm
+GoudySansITCbyBT-Black 0928 bysc8a goudysan sf
+GoudySansITCbyBT-BlackItalic 0929 bysci8a goudysan sf
+GoudySansITCbyBT-Bold 0926 bysb8a goudysan sf
+GoudySansITCbyBT-BoldItalic 0927 bysbi8a goudysan sf
+GoudySansITCbyBT-Light 0922 bysl8a goudysan sf
+GoudySansITCbyBT-LightItalic 0923 bysli8a goudysan sf
+GoudySansITCbyBT-Medium 0924 bysm8a goudysan sf
+GoudySansITCbyBT-MediumItalic 0925 bysmi8a goudysan sf
+GrizzlyITCbyBT-Regular 0688 b_____ grizzlyn rm
+GrouchITCbyBT-Regular 0678 b_____ grouchn rm
+HandelGothicBT-Regular 0768 bh0r8a handelgo sf
+HoboBT-Regular 0057 bhbr8a hobo rm
+Humanist521BT-Bold 0292 bgsb8a gillsans sf
+Humanist521BT-BoldCondensed 0496 bgsb8ac gillsans sf
+Humanist521BT-BoldItalic 0293 bgsbi8a gillsans sf
+Humanist521BT-ExtraBold 0294 bgsx8a gillsans sf
+Humanist521BT-Italic 0291 bgsri8a gillsans sf
+Humanist521BT-Light 0288 bgsl8a gillsans sf
+Humanist521BT-LightItalic 0289 bgsli8a gillsans sf
+Humanist521BT-Roman 0290 bgsr8a gillsans sf
+Humanist521BT-RomanCondensed 0495 bgsr8ac gillsans sf
+Humanist521BT-UltraBold 0295 bgsu8a gillsans sf
+Humanist521BT-XtraBoldCondensed 0497 bgsx8ac gillsans sf
+Humanist531BT-BlackA 0875 bsxc8a syntax rm
+Humanist531BT-BoldA 0874 bsxb8a syntax rm
+Humanist531BT-RomanA 0872 bsxr8a syntax rm
+Humanist531BT-UltraBlackA 0876 bsxu8a syntax rm
+Humanist777BT-BlackB 0861 bfrc8a frutiger sf
+Humanist777BT-BlackItalicB 0862 bfrci8a frutiger sf
+Humanist777BT-BoldB 0859 bfrb8a frutiger sf
+Humanist777BT-BoldItalicB 0860 bfrbi8a frutiger sf
+Humanist777BT-ItalicB 0858 bfrri8a frutiger sf
+Humanist777BT-LightB 0855 bfrl8a frutiger sf
+Humanist777BT-LightItalicB 0856 bfrli8a frutiger sf
+Humanist777BT-RomanB 0857 bfrr8a frutiger sf
+Humanist970BT-BoldC 0265 ba9b8a adsans sf
+Humanist970BT-RomanC 0264 ba9r8a adsans sf
+HumanistSlabserif712BT-Black 0324 befc8a egyptien rm
+HumanistSlabserif712BT-Bold 0323 befb8a egyptien rm
+HumanistSlabserif712BT-Italic 0322 befri8a egyptien rm
+HumanistSlabserif712BT-Roman 0321 befr8a egyptien rm
+HuxleyVerticalBT-Regular 1177 bhxr8a huxleyvr rm
+ImperialBT-Bold 0354 bi3b8a imperial rm
+ImperialBT-Italic 0353 bi3ri8a imperial rm
+ImperialBT-Roman 0352 bi3r8a imperial rm
+ImpressBT-Regular 0209 bi1r8a impress rm
+ImpulsBT-Regular 0725 bi2r8a impuls rm
+Incised901BT-Black 0391 baoc8a atqolive sf
+Incised901BT-Bold 0390 baob8a atqolive sf
+Incised901BT-BoldCondensed 0467 baob8ac atqolive sf
+Incised901BT-Compact 0468 baop8a atqolive sf
+Incised901BT-Italic 0389 baori8a atqolive sf
+Incised901BT-Light 0387 baol8a atqolive sf
+Incised901BT-Nord 0469 baoh8ax atqolive sf
+Incised901BT-NordItalic 0470 baohi8ax atqolive sf
+Incised901BT-Roman 0388 baor8a atqolive sf
+Industrial736BT-Italic 1048 btori8a torino rm
+Industrial736BT-Roman 1047 btor8a torino rm
+Informal011BT-Black 1116 bnlc8a neuland rm
+Informal011BT-Roman 1115 bnlr8a neuland rm
+IowanOldStyleBT-Black 1202 biyc8a iowanold rm
+IowanOldStyleBT-BlackItalic 1203 biyci8a iowanold rm
+IowanOldStyleBT-Bold 1200 biyb8a iowanold rm
+IowanOldStyleBT-BoldItalic 1201 biybi8a iowanold rm
+IowanOldStyleBT-Italic 1199 biyri8a iowanold rm
+IowanOldStyleBT-Roman 1198 biyr8a iowanold rm
+KabelITCbyBT-Book 0162 bkbk8a kabel sf
+KabelITCbyBT-Demi 0164 bkbd8a kabel sf
+KabelITCbyBT-Medium 0163 bkbm8a kabel sf
+KabelITCbyBT-Ultra 0166 bkbu8a kabel sf
+KaufmannBT-Bold 0727 bkub8a kaufmann rm
+KaufmannBT-Regular 0726 bkur8a kaufmann rm
+KisBT-Italic 0117 bjnri8a janson rm
+KisBT-Roman 0116 bjnr8a janson rm
+KorinnaITCbyBT-Bold 0089 bkrb8a korinna rm
+KorinnaITCbyBT-KursivBold 0090 bkrbi8a korinna rm
+KorinnaITCbyBT-KursivRegular 0088 bkrri8a korinna rm
+KorinnaITCbyBT-Regular 0087 bkrr8a korinna rm
+Kuenstler480BT-Black 1026 btvc8a trumpmed rm
+Kuenstler480BT-Bold 0763 btvb8a trumpmed rm
+Kuenstler480BT-BoldItalic 0764 btvbi8a trumpmed rm
+Kuenstler480BT-Italic 0762 btvri8a trumpmed rm
+Kuenstler480BT-Roman 0761 btvr8a trumpmed rm
+Lapidary333BT-Black 1052 bppc8a perpetua rm
+Lapidary333BT-Bold 0717 bppb8a perpetua rm
+Lapidary333BT-BoldItalic 0718 bppbi8a perpetua rm
+Lapidary333BT-Italic 0716 bppri8a perpetua rm
+Lapidary333BT-Roman 0715 bppr8a perpetua rm
+Latin725BT-Bold 0493 bmdb8a meridien rm
+Latin725BT-BoldItalic 0494 bmdbi8a meridien rm
+Latin725BT-Italic 0490 bmdri8a meridien rm
+Latin725BT-Medium 0491 bmdm8a meridien rm
+Latin725BT-MediumItalic 0492 bmdmi8a meridien rm
+Latin725BT-Roman 0489 bmdr8a meridien rm
+LatinExtraCondensedBT-Regular 0507 blir8ac latin rm
+LeawoodITCbyBT-Book 0941 blwk8a leawood rm
+LeawoodITCbyBT-BookItalic 0942 blwki8a leawood rm
+LetterGothic12PitchBT-Bold 0533 blgb8a lettrgth tt
+LetterGothic12PitchBT-BoldItal 0543 blgbi8a lettrgth tt
+LetterGothic12PitchBT-Italic 0532 blgri8a lettrgth tt
+LetterGothic12PitchBT-Roman 0414 blgr8a lettrgth tt
+LibertyBT-Regular 0987 bl1r8a liberty rm
+LibraBT-Regular 0690 bl2r8a libra rm
+LifeBT-Bold 0956 blfb8a life rm
+LifeBT-BoldItalic 0957 blfbi8a life rm
+LifeBT-Italic 0955 blfri8a life rm
+LifeBT-Roman 0954 blfr8a life rm
+LubalinGraphITCbyBT-Bold 0370 blbb8a lubaling rm
+LubalinGraphITCbyBT-Book 0367 blbk8a lubaling rm
+LubalinGraphITCbyBT-Medium 0368 blbm8a lubaling rm
+LubalinGraphITCbyBT-XtraLight 0366 blbj8a lubaling rm
+LuciaBT-Regular 0847 bl3r8a lucia rm
+LucianBT-Bold 1143 bl4b8a lucian rm
+LucianBT-Roman 1142 bl4r8a lucian rm
+LydianBT-Bold 0843 blyb8a lydian rm
+LydianBT-BoldItalic 0844 blybi8a lydian rm
+LydianBT-Italic 0842 blyri8a lydian rm
+LydianBT-Roman 0841 blyr8a lydian rm
+LydianCursiveBT-Regular 0845 blyrw8a lydian rm
+MICR10byBT-Regular 8729 b_____ micro10 rm
+MICR12byBT-Regular 8730 b_____ micro12 rm
+MICR13byBT-Regular 8731 b_____ micro13 rm
+MachineITCbyBT-Regular 0534 bmhr8a machine rm
+MattAntiqueBT-Bold 1016 b_____ matantq rm
+MattAntiqueBT-Italic 1015 b_____ matantq rm
+MattAntiqueBT-Roman 1014 b_____ matantq rm
+MiraraeBT-Bold 0831 bm3b8a mirarae rm
+MiraraeBT-Roman 0830 bm3r8a mirarae rm
+MisterEarlBT-Regular 1221 bm4r8a mrearl rm
+MixageITCbyBT-Bold 0825 b_____ mixage rm
+MixageITCbyBT-BoldItalic 0826 b_____ mixage rm
+Modern20BT-ItalicB 1169 bmori8a modern rm
+Modern20BT-RomanB 1168 bmor8a modern rm
+Modern735BT-RomanA 0793 bbpr8a bodocamp rm
+Modern880BT-Bold 1039 b_____ mod880 rm
+Modern880BT-Italic 1038 b_____ mod880 rm
+Modern880BT-Roman 1037 b_____ mod880 rm
+Monospace821BT-Bold 0598 bhvbt8a helvetic rm
+Monospace821BT-BoldItalic 0599 bhvbit8a helvetic rm
+Monospace821BT-Italic 0597 bhvrit8a helvetic rm
+Monospace821BT-Roman 0596 bhvrt8a helvetic rm
+MurrayHillBT-Bold 0886 bm5b8a murrayhl rm
+NewBaskervilleITCbyBT-Bold 0934 bnbb8a nbaskerv rm
+NewBaskervilleITCbyBT-BoldItal 0935 bnbbi8a nbaskerv rm
+NewBaskervilleITCbyBT-Italic 0931 bnbri8a nbaskerv rm
+NewBaskervilleITCbyBT-Roman 0930 bnbr8a nbaskerv rm
+News701BT-BoldA 0320 biob8a ionic rm
+News701BT-ItalicA 0319 biori8a ionic rm
+News701BT-RomanA 0318 bior8a ionic rm
+News702BT-Bold 0029 bexb8a exclsior rm
+News702BT-BoldItalic 0030 bexbi8a exclsior rm
+News702BT-Italic 0028 bexri8a exclsior rm
+News702BT-Roman 0027 bexr8a exclsior rm
+News705BT-BoldB 0060 bonb8a corona rm
+News705BT-BoldItalicB 0803 bonbi8a corona rm
+News705BT-ItalicB 0059 bonri8a corona rm
+News705BT-RomanB 0058 bonr8a corona rm
+News706BT-BoldC 0365 bn7b8a news706 rm
+News706BT-ItalicC 0364 bn7ri8a news706 rm
+News706BT-RomanC 0363 bn7r8a news706 rm
+NewsGothicBT-Bold 0049 bngb8a newsgth rm
+NewsGothicBT-BoldCondItalic 0378 bngbi8ac newsgth rm
+NewsGothicBT-BoldCondensed 0377 bngb8ac newsgth rm
+NewsGothicBT-BoldExtraCond 0871 bngb8aq newsgth rm
+NewsGothicBT-BoldItalic 0050 bngbi8a newsgth rm
+NewsGothicBT-Demi 0949 bngd8a newsgth rm
+NewsGothicBT-DemiItalic 0950 bngdi8a newsgth rm
+NewsGothicBT-ExtraCondensed 0870 bngr8aq newsgth rm
+NewsGothicBT-Italic 0048 bngri8a newsgth rm
+NewsGothicBT-ItalicCondensed 0376 bngri8ac newsgth rm
+NewsGothicBT-Light 0132 bngl8a newsgth rm
+NewsGothicBT-LightItalic 0133 bngli8a newsgth rm
+NewsGothicBT-Roman 0047 bngr8a newsgth rm
+NewsGothicBT-RomanCondensed 0375 bngr8ac newsgth rm
+NewtextITCbyBT-Regular 0697 b_____ newtxt rm
+NewtextITCbyBT-RegularItalic 0698 b_____ newtxt rm
+NormandeBT-Italic 1012 bn0ri8a normande rm
+NormandeBT-Roman 1011 bn0r8a normande rm
+NovareseITCbyBT-Bold 0734 bnvb8a novarese rm
+NovareseITCbyBT-BoldItalic 0735 bnvbi8a novarese rm
+NovareseITCbyBT-Book 0730 bnvk8a novarese rm
+NovareseITCbyBT-BookItalic 0731 bnvki8a novarese rm
+NuptialBT-Regular 0981 bnur8a nuptial rm
+OCRAbyBT-Regular 0395 boar ocra rm
+OCRB10PitchBT-Regular 0646 bobr ocrb rm
+OldDreadfulNo7BT-Regular 7009 bo0r8a oldreadf rm
+OnyxBT-Regular 0519 boxr8a onyx rm
+OrandaBT-Bold 1206 bo1b8a oranda rm
+OrandaBT-BoldCondensed 1209 bo1b8ac oranda rm
+OrandaBT-BoldItalic 1207 bo1bi8a oranda rm
+OrandaBT-Italic 1205 bo1ri8a oranda rm
+OrandaBT-Roman 1204 bo1r8a oranda rm
+OrandaBT-RomanCondensed 1208 bo1r8ac oranda rm
+OratorBT-FifteenPitch 0758 borr8a15 orator tt
+OratorBT-TenPitch 0755 borr8a10 orator tt
+OrbitBbyBT-Regular 0213 bo2r8a orbitb rm
+OriginalGaramondBT-Bold 0865 begb8a stgaramo rm
+OriginalGaramondBT-BoldItalic 0866 begbi8a stgaramo rm
+OriginalGaramondBT-Italic 0864 begri8a stgaramo rm
+OriginalGaramondBT-Roman 0863 begr8a stgaramo rm
+OzHandicraftBT-Roman 1178 bozr8a ozhandcr rm
+PTBarnumBT-Regular 0720 bpbr8a ptbarnum rm
+ParisianBT-Regular 1064 bpsr8a parisian rm
+ParkAvenueBT-Regular 0362 bpar8a parkave rm
+Pica10PitchBT-Roman 0691 b_____ pica10 tt
+PioneerITCbyBT-Regular 0214 bp4r8a pioneer rm
+PiranesiItalicBT-Regular 0592 bp5r8a piranesi rm
+PlaybillBT-Regular 0867 bpyr8a playbill rm
+PosterBodoniBT-Italic 0130 bbdpi8a bodoni rm
+PosterBodoniBT-Roman 0129 bbdp8a bodoni rm
+Prestige12PitchBT-Bold 0614 bpeb8a prestige tt
+Prestige12PitchBT-BoldItalic 0615 bpebi8a prestige tt
+Prestige12PitchBT-Italic 0613 bperi8a prestige tt
+Prestige12PitchBT-Roman 0413 bper8a prestige tt
+QuorumITCbyBT-Black 0442 bqrc8a quorum rm
+QuorumITCbyBT-Light 0438 bqrl8a quorum rm
+QuorumITCbyBT-Medium 0440 bqrm8a quorum rm
+RaleighBT-Bold 1081 brab8a raleigh rm
+RaleighBT-DemiBold 1080 brad8a raleigh rm
+RaleighBT-ExtraBold 1082 brax8a raleigh rm
+RaleighBT-Light 1077 bral8a raleigh rm
+RaleighBT-Medium 1079 bram8a raleigh rm
+RaleighBT-Roman 1078 brar8a raleigh rm
+Revival565BT-Bold 1070 bbrb8a berling rm
+Revival565BT-BoldItalic 1071 bbrbi8a berling rm
+Revival565BT-Italic 1069 bbrri8a berling rm
+Revival565BT-Roman 1068 bbrr8a berling rm
+RevueBT-Regular 0895 brvr8a revue rm
+Ribbon131BT-Bold 0208 botb8a coronet rm
+Ribbon131BT-Regular 0207 botr8a coronet rm
+RomanaBT-Bold 0897 br0b8a romana rm
+RomanaBT-Roman 0896 br0r8a romana rm
+SchadowBT-Black 1108 bhwc8a schadow rm
+SchadowBT-BlackCondensed 1114 bhwc8ac schadow rm
+SchadowBT-Bold 1107 bhwb8a schadow rm
+SchadowBT-Light 1104 bhwl8a schadow rm
+SchadowBT-LightCursive 1105 bhwli8a schadow rm
+SchadowBT-Roman 1106 bhwr8a schadow rm
+SchneidlerBT-Black 0907 bssc8a stschnei rm
+SchneidlerBT-BlackItalic 0908 bssci8a stschnei rm
+SchneidlerBT-Bold 0905 bssb8a stschnei rm
+SchneidlerBT-BoldItalic 0906 bssbi8a stschnei rm
+SchneidlerBT-Italic 0902 bssri8a stschnei rm
+SchneidlerBT-Light 0899 bssl8a stschnei rm
+SchneidlerBT-LightItalic 0900 bssli8a stschnei rm
+SchneidlerBT-Medium 0903 bssm8a stschnei rm
+SchneidlerBT-MediumItalic 0904 bssmi8a stschnei rm
+SchneidlerBT-Roman 0901 bssr8a stschnei rm
+Script12PitchBT-Roman 0940 bs2r8a script rm
+SeagullBT-Bold 0819 bs3b8a seagull rm
+SeagullBT-Heavy 0820 bs3h8a seagull rm
+SeagullBT-Light 0817 bs3l8a seagull rm
+SeagullBT-Medium 0818 bs3m8a seagull rm
+SerifaBT-Black 0259 bsfc8a serifa rm
+SerifaBT-Bold 0258 bsfb8a serifa rm
+SerifaBT-BoldCondensed 0836 bsfb8ac serifa rm
+SerifaBT-Italic 0257 bsfri8a serifa rm
+SerifaBT-Light 0254 bsfl8a serifa rm
+SerifaBT-LightItalic 0255 bsfli8a serifa rm
+SerifaBT-Roman 0256 bsfr8a serifa rm
+SerifaBT-Thin 0252 bsfa8a serifa rm
+SerifaBT-ThinItalic 0253 bsfai8a serifa rm
+ShotgunBT-Regular 0167 bs4r8a shotgun rm
+ShotgunBlanksBT-Regular 0234 bs4rl8a shotgun rm
+SnellBT-Black 0198 bs5c8a snell rm
+SnellBT-Bold 0197 bs5b8a snell rm
+SnellBT-Regular 0196 bs5r8a snell rm
+SouvenirITCbyBT-Demi 0021 bsvd8a souvenir rm
+SouvenirITCbyBT-DemiItalic 0022 bsvdi8a souvenir rm
+SouvenirITCbyBT-Light 0019 bsvl8a souvenir rm
+SouvenirITCbyBT-LightItalic 0020 bsvli8a souvenir rm
+Square721BT-Bold 0247 besb8a eurostil sf
+Square721BT-BoldCondensed 0249 besb8ac eurostil sf
+Square721BT-BoldExtended 0251 besb8ax eurostil sf
+Square721BT-Roman 0246 besr8a eurostil sf
+Square721BT-RomanCondensed 0248 besr8ac eurostil sf
+Square721BT-RomanExtended 0250 besr8ax eurostil sf
+SquareSlabserif711BT-Bold 0412 bcyb8a city rm
+SquareSlabserif711BT-Light 0410 bcyl8a city rm
+SquareSlabserif711BT-Medium 0411 bcym8a city rm
+Staccato222BT-Regular 0610 bmsr8a mistral rm
+Staccato555BT-RegularA 1153 bczr8a choc rm
+StencilBT-Regular 0191 bslr8a stencil rm
+StuyvesantBT-Regular 0980 bs6r8a stuyvesa rm
+StymieBT-Bold 0218 bymb8a stymie rm
+StymieBT-BoldItalic 0692 bymbi8a stymie rm
+StymieBT-ExtraBold 0219 bymx8a stymie rm
+StymieBT-ExtraBoldCondensed 0910 bymx8ac stymie rm
+StymieBT-Light 0216 byml8a stymie rm
+StymieBT-LightItalic 0679 bymli8a stymie rm
+StymieBT-Medium 0217 bymm8a stymie rm
+StymieBT-MediumItalic 0689 bymmi8a stymie rm
+Swiss721BT-Black 0007 bhvc8a helvetic sf
+Swiss721BT-BlackCondensed 0173 bhvc8ac helvetic sf
+Swiss721BT-BlackCondensedItalic 0174 bhvci8ac helvetic sf
+Swiss721BT-BlackExtended 0374 bhvc8ax helvetic sf
+Swiss721BT-BlackItalic 0008 bhvci8a helvetic sf
+Swiss721BT-BlackOutline 0563 bhvcl8a helvetic sf
+Swiss721BT-BlackRounded 0815 bhrc8a hvround sf
+Swiss721BT-Bold 0005 bhvb8a helvetic sf
+Swiss721BT-BoldCondensed 0010 bhvb8ac helvetic sf
+Swiss721BT-BoldCondensedItalic 0172 bhvbi8ac helvetic sf
+Swiss721BT-BoldCondensedOutline 0767 bhvbl8ac helvetic sf
+Swiss721BT-BoldExtended 0373 bhvb8ax helvetic sf
+Swiss721BT-BoldItalic 0006 bhvbi8a helvetic sf
+Swiss721BT-BoldOutline 0175 bhvbl8a helvetic sf
+Swiss721BT-BoldRounded 0813 bhrb8a hvround sf
+Swiss721BT-Heavy 0102 bhvh8a helvetic sf
+Swiss721BT-HeavyItalic 0103 bhvhi8a helvetic sf
+Swiss721BT-Italic 0004 bhvri8a helvetic sf
+Swiss721BT-ItalicCondensed 0171 bhvri8ac helvetic sf
+Swiss721BT-Light 0001 bhvl8a helvetic sf
+Swiss721BT-LightCondensed 0169 bhvl8ac helvetic sf
+Swiss721BT-LightCondensedItalic 0170 bhvli8ac helvetic sf
+Swiss721BT-LightExtended 0371 bhvl8ax helvetic sf
+Swiss721BT-LightItalic 0002 bhvli8a helvetic sf
+Swiss721BT-Medium 0759 bhvm8a helvetic sf
+Swiss721BT-MediumItalic 0760 bhvmi8a helvetic sf
+Swiss721BT-Roman 0003 bhvr8a helvetic sf
+Swiss721BT-RomanCondensed 0009 bhvr8ac helvetic sf
+Swiss721BT-RomanExtended 0372 bhvr8ax helvetic sf
+Swiss721BT-Thin 0100 bhva8a helvetic sf
+Swiss721BT-ThinItalic 0101 bhvai8a helvetic sf
+Swiss911BT-ExtraCompressed 0105 bhvh8aq helvetic sf
+Swiss911BT-UltraCompressed 0106 bhvh8au helvetic sf
+Swiss921BT-RegularA 0562 bhir8a hvinsera sf
+Swiss924BT-RegularB 0969 bhsr8a hnseati sf
+SymbolITCbyBT-Bold 0554 bsyb8a symbol rm
+SymbolITCbyBT-BoldItalic 0555 bsybi8a symbol rm
+SymbolProportionalBT-Regular 9830 bpi002 symbpro rm
+TangoBT-Regular 1151 bt0r8a tango rm
+ThunderbirdBT-Regular 0606 bt1r8a thunderb rm
+TiffanyITCbyBT-Demi 0224 btfd8a tiffany rm
+TiffanyITCbyBT-DemiItalic 0225 btfdi8a tiffany rm
+TiffanyITCbyBT-Heavy 0226 btfh8a tiffany rm
+TiffanyITCbyBT-HeavyItalic 0227 btfhi8a tiffany rm
+TiffanyITCbyBT-Light 0220 btfl8a tiffany rm
+TiffanyITCbyBT-LightItalic 0221 btfli8a tiffany rm
+Transitional511BT-Bold 0270 bndb8a ncaledon rm
+Transitional511BT-BoldItalic 0271 bndbi8a ncaledon rm
+Transitional511BT-Italic 0267 bndri8a ncaledon rm
+Transitional511BT-Roman 0266 bndr8a ncaledon rm
+Transitional521BT-BoldA 0915 beab8a lectra rm
+Transitional521BT-CursiveA 0914 bearw8a lectra rm
+Transitional521BT-RomanA 0913 bear8a lectra rm
+Transitional551BT-MediumB 0884 bffm8a fairfld rm
+Transitional551BT-MediumItalicB 0885 bffmi8a fairfld rm
+TypoUprightBT-Regular 0939 bt2r8a typo rm
+UmbraBT-Regular 1074 bumr8a umbra sf
+UniversityRomanBT-Bold 0317 buyb8a universi rm
+UniversityRomanBT-Regular 0316 buyr8a universi rm
+VAGRoundedBT-Regular 0756 bvrr8a vagrnd sf
+Venetian301BT-Bold 1099 burb8a centaur rm
+Venetian301BT-BoldItalic 1100 burbi8a centaur rm
+Venetian301BT-Demi 1097 burd8a centaur rm
+Venetian301BT-DemiItalic 1098 burdi8a centaur rm
+Venetian301BT-Italic 1096 burri8a centaur rm
+Venetian301BT-Roman 1095 burr8a centaur rm
+VinetaBT-Regular 0215 bv0r8a vineta rm
+WeddingTextBT-Regular 0985 bw0r8a weddingt rm
+WeidemannITCbyBT-Bold 1091 bwdb8a weideman rm
+WeidemannITCbyBT-BoldItalic 1092 bwdbi8a weideman rm
+WindsorBT-Elongated 0327 bwnr8ax windsor rm
+WindsorBT-Light 0909 bwnl8a windsor rm
+WindsorBT-LightCondensed 0326 bwnl8ac windsor rm
+WindsorBT-Outline 0988 bwnrl8a windsor rm
+WindsorBT-Roman 0122 bwnr8a windsor rm
+ZapfCalligraphic801BT-Bold 0025 bplb8a palatino rm
+ZapfCalligraphic801BT-BoldItal 0026 bplbi8a palatino rm
+ZapfCalligraphic801BT-Italic 0024 bplri8a palatino rm
+ZapfCalligraphic801BT-Roman 0023 bplr8a palatino rm
+ZapfChanceryITCbyBT-Bold 0450 bzcb8a zapfchan rm
+ZapfChanceryITCbyBT-Demi 0449 bzcd8a zapfchan rm
+ZapfChanceryITCbyBT-Medium 0447 bzcm8a zapfchan rm
+ZapfChanceryITCbyBT-MediumItal 0448 bzcmi8a zapfchan rm
+ZapfDingbatsITCbyBT-Regular 8556 bzdr zapfding rm
+ZapfElliptical711BT-Bold 0053 bmlb8a melior rm
+ZapfElliptical711BT-BoldItalic 0054 bmlbi8a melior rm
+ZapfElliptical711BT-Italic 0052 bmlri8a melior rm
+ZapfElliptical711BT-Roman 0051 bmlr8a melior rm
+ZapfHumanist601BT-Bold 0017 bopb8a optima sf
+ZapfHumanist601BT-BoldItalic 0018 bopbi8a optima sf
+ZapfHumanist601BT-Demi 0134 bopd8a optima sf
+ZapfHumanist601BT-DemiItalic 0135 bopdi8a optima sf
+ZapfHumanist601BT-Italic 0016 bopri8a optima sf
+ZapfHumanist601BT-Roman 0015 bopr8a optima sf
+ZapfHumanist601BT-Ultra 0136 bopu8a optima sf
+ZapfHumanist601BT-UltraItalic 0137 bopui8a optima sf
+ZurichBT-Black 0182 bunc8a univers sf
+ZurichBT-BlackExtended 0262 bunc8ax univers sf
+ZurichBT-BlackItalic 0183 bunci8a univers sf
+ZurichBT-Bold 0180 bunb8a univers sf
+ZurichBT-BoldCondensed 0300 bunb8ac univers sf
+ZurichBT-BoldCondensedItalic 0301 bunbi8ac univers sf
+ZurichBT-BoldExtended 0261 bunb8ax univers sf
+ZurichBT-BoldExtraCondensed 0960 bunb8aq univers sf
+ZurichBT-BoldItalic 0181 bunbi8a univers sf
+ZurichBT-ExtraBlack 0970 bunx8a univers sf
+ZurichBT-ExtraCondensed 0959 bunr8aq univers sf
+ZurichBT-Italic 0179 bunri8a univers sf
+ZurichBT-ItalicCondensed 0299 bunri8ac univers sf
+ZurichBT-Light 0176 bunl8a univers sf
+ZurichBT-LightCondensed 0296 bunl8ac univers sf
+ZurichBT-LightCondensedItalic 0297 bunli8ac univers sf
+ZurichBT-LightExtraCondensed 0958 bunl8aq univers sf
+ZurichBT-LightItalic 0177 bunli8a univers sf
+ZurichBT-Roman 0178 bunr8a univers sf
+ZurichBT-RomanCondensed 0298 bunr8ac univers sf
+ZurichBT-RomanExtended 0260 bunr8ax univers sf
+ZurichBT-UltraBlackExtended 0263 bunu8ax univers sf
diff --git a/fonts/utilities/ega2mf/00readme.txt b/fonts/utilities/ega2mf/00readme.txt
new file mode 100644
index 0000000000..fbfcabcab0
--- /dev/null
+++ b/fonts/utilities/ega2mf/00readme.txt
@@ -0,0 +1,83 @@
+EGA2MF is a utility to generate METAFONT code for
+8x14 bitmaps of the type used for EGA screen fonts
+on machines of the IBM pc/xt/at class. The idea
+is that you may then produce a font which emulates
+the appearance of a video display screen with all
+the crudities appropriate for that medium.
+There are some trivial changes necessary to make
+ega2mf work with some other bitmap type (e.g. 8x16
+for the VGA or Hercules Plus). This is left as an
+exercise for the reader.
+% 4/25/90: a slightly modified version, vga2mf.c, is
+% now available wherein the necessary changes have been
+% made for doing VGA 8x16 fonts (at the urging of Dimitri
+% Vulis). A really improved version would have the font-specific
+% dimensions abstracted so that a command-line switch could
+% determine the font type to be used.
+% ``This is left as an exercise for the reader''
+
+EGA2MF expects the name of an input bitmap file and an output
+generated code file. If these are not supplied it will ask.
+EGA2MF does not do checking to verify that the input file truly
+is a bitmapped font. You may obtain spectacularly worthless
+METAFONT code by allowing EGA2MF to process, for instance, this
+README file.
+
+The METAFONT code generated will expect to have cmbase and the cmtt10
+parameter file available.
+
+An early version of EGA2MF was used to produce the font WNPC10
+which uses the ``standard'' character set as found in IBM pc-type
+systems in the USA. This is the same as the code page 437
+character set below. Your copy of EGA2MF __may__ be distributed
+with the following code page bitmaps
+CP437.EGA United States
+CP850.EGA Multilingual
+CP860.EGA Portugal
+CP863.EGA Canada-French
+CP865.EGA Norway
+CP880DV.EGA Dimitri Vulus' Cyrillic ``code page 880''
+% 4/25/90: there _may_ also be corresponding *.vga files
+% suitable for input to vga2mf
+
+For METAFONT tinkerers, the essential works are all at the head
+of the file in s small number of magic-number variables which are
+used by a macro named crt which draws the individual crt-style dots
+for the characters. I don't have any doubt that someone could
+make improvements to the METAFONT code. The C code can probably
+also use some improvement; but given what it does, how much trouble
+is it worth if it works at all?
+
+[One such improvement of the algorithim is present in the jis2mf
+program distributed as part of jemtex. See [tex.babel.japanese]
+for more information. -dh]
+
+EGA2MF works on my machines, under both DOS and UNIX, but is provided
+to you in source so that you may verify that it will do nothing
+catastrophic _before_ you compile it. Since it is available to
+you free there is, of course, no warranty of any sort whatsoever,
+and you use the program entirely at your own risk.
+
+% 91/05/24 Brian {Hamilton Kelly}, checking that the programs would work
+% under VAX/VMS, replaced the line reading
+ FILE *f1,*f2;
+% in each source with these lines
+ FILE *f1=(FILE *) NULL;
+ FILE *f2=(FILE *) NULL;
+% (In C, there's no guarantee that automatic variables will have _any_
+% particular value, let alone the (FILE *)NULL that was necessary here
+% with the method the program uses to prompt for missing command-line
+% arguments. Perhaps he was just lucky with his Unix & DOS :-)
+
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Thomas Ridgeway, Director,
+Humanities and Arts Computing Center/NorthWest Computing Support Center
+35 Thomson Hall H H AA CCCCC CCCCC
+University of Washington, DR-10 H H A A C C
+Seattle, WA 98195 HHHHHH AAAAAA C C
+(206)-543-4218 H H A A C C
+ridgeway@blackbox.hacc.washington.edu H H A A CCCCC CCCCC
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+- Your comments, suggestions and improvements will be welcome -
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/fonts/utilities/ega2mf/README b/fonts/utilities/ega2mf/README
new file mode 120000
index 0000000000..5d84037450
--- /dev/null
+++ b/fonts/utilities/ega2mf/README
@@ -0,0 +1 @@
+00readme.txt \ No newline at end of file
diff --git a/fonts/utilities/ega2mf/cp437.ega b/fonts/utilities/ega2mf/cp437.ega
new file mode 100644
index 0000000000..1ef2e7d5cb
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp437.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp437.vga b/fonts/utilities/ega2mf/cp437.vga
new file mode 100644
index 0000000000..0f3cbdf6e1
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp437.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp850.ega b/fonts/utilities/ega2mf/cp850.ega
new file mode 100644
index 0000000000..cc9d30e743
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp850.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp850.vga b/fonts/utilities/ega2mf/cp850.vga
new file mode 100644
index 0000000000..a671c011bd
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp850.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp860.ega b/fonts/utilities/ega2mf/cp860.ega
new file mode 100644
index 0000000000..f34860c8fb
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp860.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp860.vga b/fonts/utilities/ega2mf/cp860.vga
new file mode 100644
index 0000000000..62dc3c4918
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp860.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp863.ega b/fonts/utilities/ega2mf/cp863.ega
new file mode 100644
index 0000000000..b7af7087b9
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp863.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp863.vga b/fonts/utilities/ega2mf/cp863.vga
new file mode 100644
index 0000000000..3df505acea
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp863.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp865.ega b/fonts/utilities/ega2mf/cp865.ega
new file mode 100644
index 0000000000..cd8fd74f0e
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp865.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp865.vga b/fonts/utilities/ega2mf/cp865.vga
new file mode 100644
index 0000000000..53e16afbff
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp865.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp880dv.ega b/fonts/utilities/ega2mf/cp880dv.ega
new file mode 100644
index 0000000000..de81013caf
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp880dv.ega
Binary files differ
diff --git a/fonts/utilities/ega2mf/cp880dv.vga b/fonts/utilities/ega2mf/cp880dv.vga
new file mode 100644
index 0000000000..262f6ad283
--- /dev/null
+++ b/fonts/utilities/ega2mf/cp880dv.vga
Binary files differ
diff --git a/fonts/utilities/ega2mf/ega2mf.c b/fonts/utilities/ega2mf/ega2mf.c
new file mode 100644
index 0000000000..908b8c66a7
--- /dev/null
+++ b/fonts/utilities/ega2mf/ega2mf.c
@@ -0,0 +1,187 @@
+/* EGA2MF.C is Copyright 1990 Humanities and Arts Computing Center */
+/* usage: ega2mf [egafontname] [metafont_sourcecode_output_file] */
+/* suggestions to ridgeway@blake.acs.washington.edu */
+
+/* history: */
+/* v. 1.0 released 4/16/1990 */
+
+#include <stdio.h>
+#include <string.h>
+
+
+
+/* the charblock structure is used for processing each character */
+typedef struct {
+ unsigned char column[8];
+ } videorow;
+typedef struct {
+ videorow row[14];
+ } charblock;
+
+/* the ega font is a naked 8x14 bitmap 256 chars deep */
+typedef struct {
+ unsigned char bitmap[14];
+ } egachar;
+
+typedef struct {
+ egachar charset[256];
+ } egafont;
+
+/* globally accessible area */
+charblock editchar;
+/* global vars and strings */
+char infilename[128];
+char outfilename[128];
+
+jumpout() { exit(1); }
+
+void copyright()
+{
+ puts("Ega2Mf Screen font --> METAFONT code generator\n");
+ puts("HUMANITIES AND ARTS COMPUTING CENTER, DR-10");
+ puts("UNIVERSITY OF WASHINGTON, SEATTLE WA 98195 USA\n");
+ puts("Copyright 1990 Humanities and Arts Computing Center\n");
+ puts("This software may be used, modified, and redistributed free of any");
+ puts("fee or royalty, provided that this copyright and 'free software' notice");
+ puts("remains intact in any copies redistributed, and that you may charge no fee");
+ puts("of any sort whatsoever without the written permission of the Humanities");
+ puts("and Arts Computing Center.");
+ return;
+}
+
+
+void exists (char *filename)
+ {
+ unsigned char response;
+ FILE *handle;
+ handle = fopen ( filename , "rb" ) ;
+ if (handle != (FILE *) NULL)
+ { fclose(handle);
+ printf("File %s already exists: O.K. to replace? (Y/N): ", filename);
+ response = getchar();
+ if ( ! ( (response=='y') || (response=='Y') ) )
+ {
+ printf("\nPlease rename files as necessary and try again.\n");
+ jumpout();
+ }
+ }
+ return;
+ }
+
+FILE *getopen(char *filename, char *access)
+{
+ int temp;
+ FILE *handle;
+ gets(filename);
+ if (access[0]=='w' || access[0]=='W') exists(filename);
+ handle=fopen(filename,access);
+ if (handle == NULL) {
+ puts("\nCan't open file ");
+ puts(filename);
+ puts("\n");
+ }
+ return handle;
+}
+
+FILE *get_file(char *access,char *prompt,char *filename)
+{
+ printf("\n %s",prompt);
+ return getopen(filename,access);
+}
+
+void makedisplay(unsigned char thischar, egafont *thisfont)
+{
+ int temp,mask,i,k,hold;
+ for (i=0; i<14; i++) {
+ temp=thisfont->charset[thischar].bitmap[i];
+ mask=0x80;
+ for (k=0; k<8; k++) {
+ hold=temp & mask;
+ if (hold==0) editchar.row[i].column[k]=0;
+ else editchar.row[i].column[k]=1;
+ mask=mask / 2;
+ } /* endfor k */
+ } /* endfor i */
+ return;
+}
+
+
+main(int argc, char *argv[])
+{
+ FILE *f1=(FILE *) NULL;
+ FILE *f2=(FILE *) NULL;
+ int done,ch,i,k,codeout;
+ char quote,percent;
+ egafont *thisega;
+ quote=34;
+ percent=37;
+ /* yes, yes! we are assuming the ASCII character set */
+ copyright();
+ thisega = (egafont *) malloc(sizeof(egafont));
+ if (argc > 1) {
+ f1 = fopen(argv[1],"rb");
+ (void) strcpy(infilename,argv[1]);
+ }
+ if (f1 == (FILE *) NULL) {
+ /* prompt for and open input file */
+ for ( ; f1 == (FILE *) NULL; f1=get_file("rb","Enter name of input ega font file: ",infilename)) ;
+ }
+ fread(thisega,sizeof(egafont),1,f1);
+ fclose(f1);
+ if (argc > 2) {
+ (void) strcpy(outfilename,argv[2]);
+ exists(outfilename);
+ f2 = fopen(argv[2],"w");
+ }
+ if (f2 == (FILE *) NULL) {
+ /* prompt for and open output file */
+ for ( ; f2 == (FILE *) NULL; f2=get_file("w","Enter name of output Metafont source file: ",outfilename)) ;
+ }
+ fprintf(f2,"%c This is %s generated by EGA2MF from %s.\n",percent,outfilename,infilename);
+ fprintf(f2,"if unknown cmbase: input cmbase fi\n");
+ fprintf(f2,"mode_setup;\n");
+ fprintf(f2,"def generate suffix t= enddef;\n");
+ fprintf(f2,"input cmtt10; font_setup;\n");
+ fprintf(f2,"if ligs>1: font_coding_scheme:=%cTeX text%c;\n",quote,quote);
+ fprintf(f2,"else: font_coding_scheme:=if ligs=0: %cTeX typewriter text%c\n",quote,quote);
+ fprintf(f2," else: %cTeX text without f-ligatures%c fi; fi \n",quote,quote);
+ fprintf(f2,"numeric cheight; cheight=body_height+desc_depth;\n");
+ fprintf(f2,"numeric hhalf; numeric vhalf; hhalf=.4u; vhalf=(cheight)/36;\n");
+ fprintf(f2,"numeric vcent; vcent=cheight/28; numeric hcent; hcent=9/16u;\n");
+ fprintf(f2,"def crt(expr row,col) =\n");
+ fprintf(f2,"y.c:=body_height-(row * cheight / 14)-vcent; x.c:=hcent+(col * 9/8u);\n");
+ fprintf(f2,"y.a:=y.c+vhalf; y.b:=y.c-vhalf;\n");
+ fprintf(f2,"x.a:=x.c-hhalf; x.b:=x.c+hhalf;\n");
+ fprintf(f2,"filldraw (x.a,y.b)..(x.a,y.a)..(x.b,y.a)..(x.b,y.b)..cycle;\n");
+ fprintf(f2,"enddef;\n");
+ printf("Now processing character ");
+ for (ch=0; ch<256; ch++) {
+ /* generate code for character ch */
+ if ( (ch < 32) || (ch > 126) ) printf("[%d] ",ch);
+ else printf("[%c] ",ch);
+ fprintf(f2,"\nbeginchar(%d,9u#,body_height#,desc_depth#);",ch);
+ fprintf(f2,"adjust_fit(0,0);\npickup pencircle scaled 0.2pt;\n");
+ makedisplay(ch,thisega);
+ for(i=0; i < 14; i++) {
+ codeout=0;
+ for(k=0; k<8; k++) {
+ if (editchar.row[i].column[k] != 0) {
+ fprintf(f2,"crt(%d,%d); ",i,k);
+ codeout=1;
+ } /* endif set dot on */
+ } /* end k */
+ if (codeout > 0) fprintf(f2,"\n");
+ } /* endfor i */
+ fprintf(f2,"endchar;\n");
+ if ( ( ch % 16 ) == 0 ) printf("\n");
+ } /* endfor ch */
+ fprintf(f2,"\n");
+ fprintf(f2,"font_slant slant; font_x_height x_height#;\n");
+ fprintf(f2," font_normal_space 9u#;\n");
+ fprintf(f2," font_quad 18u#;\n");
+ fprintf(f2," font_extra_space 9u#;\n");
+ fprintf(f2,"bye.\n");
+ printf("\nEGA2MF is done. Good luck with your new font.\n");
+ fclose(f2);
+}
+
diff --git a/fonts/utilities/ega2mf/foo.bar b/fonts/utilities/ega2mf/foo.bar
new file mode 100644
index 0000000000..7735b1d281
--- /dev/null
+++ b/fonts/utilities/ega2mf/foo.bar
@@ -0,0 +1,10 @@
+> % 91/05/24 Brian {Hamilton Kelly}, checking that the programs would work
+> % under VAX/VMS, replaced the line reading
+> FILE *f1,*f2;
+> % in each source with these lines
+> FILE *f1=(FILE *) NULL;
+> FILE *f2=(FILE *) NULL;
+> % (In C, there's no guarantee that automatic variables will have _any_
+> % particular value, let alone the (FILE *)NULL that was necessary here
+> % with the method the program uses to prompt for missing command-line
+> % arguments. Perhaps he was just lucky with his Unix & DOS :-)
diff --git a/fonts/utilities/ega2mf/vga2mf.c b/fonts/utilities/ega2mf/vga2mf.c
new file mode 100644
index 0000000000..f728f38851
--- /dev/null
+++ b/fonts/utilities/ega2mf/vga2mf.c
@@ -0,0 +1,193 @@
+/* VGA2MF.C is Copyright 1990 Humanities and Arts Computing Center */
+/* usage: vga2mf [vgafontname] [metafont_sourcecode_output_file] */
+/* suggestions to ridgeway@blake.acs.washington.edu */
+
+/* history: */
+/* v. 1.0 released 4/25/1990 */
+/* this is a minimally modified version of Ega2mf */
+/* modifications to handle larger VGA character cell */
+/* one might also modify egamf to accept a -v switch */
+/* to permit one program to do both */
+/* but _we_ didn't do it that way because . . . */
+/* "So many programs, so little time . . . */
+
+#include <stdio.h>
+#include <string.h>
+
+
+
+/* the charblock structure is used for processing each character */
+typedef struct {
+ unsigned char column[8];
+ } videorow;
+typedef struct {
+ videorow row[16];
+ } charblock;
+
+/* the vga font is a naked 8x16 bitmap 256 chars deep */
+typedef struct {
+ unsigned char bitmap[16];
+ } vgachar;
+
+typedef struct {
+ vgachar charset[256];
+ } vgafont;
+
+/* globally accessible area */
+charblock editchar;
+/* global vars and strings */
+char infilename[128];
+char outfilename[128];
+
+jumpout() { exit(1); }
+
+void copyright()
+{
+ puts("VGA2Mf Screen font --> METAFONT code generator\n");
+ puts("HUMANITIES AND ARTS COMPUTING CENTER, DR-10");
+ puts("UNIVERSITY OF WASHINGTON, SEATTLE WA 98195 USA\n");
+ puts("Copyright 1990 Humanities and Arts Computing Center\n");
+ puts("This software may be used, modified, and redistributed free of any");
+ puts("fee or royalty, provided that this copyright and 'free software' notice");
+ puts("remains intact in any copies redistributed, and that you may charge no fee");
+ puts("of any sort whatsoever without the written permission of the Humanities");
+ puts("and Arts Computing Center.");
+ return;
+}
+
+
+void exists (char *filename)
+ {
+ unsigned char response;
+ FILE *handle;
+ handle = fopen ( filename , "rb" ) ;
+ if (handle != (FILE *) NULL)
+ { fclose(handle);
+ printf("File %s already exists: O.K. to replace? (Y/N): ", filename);
+ response = getchar();
+ if ( ! ( (response=='y') || (response=='Y') ) )
+ {
+ printf("\nPlease rename files as necessary and try again.\n");
+ jumpout();
+ }
+ }
+ return;
+ }
+
+FILE *getopen(char *filename, char *access)
+{
+ int temp;
+ FILE *handle;
+ gets(filename);
+ if (access[0]=='w' || access[0]=='W') exists(filename);
+ handle=fopen(filename,access);
+ if (handle == NULL) {
+ puts("\nCan't open file ");
+ puts(filename);
+ puts("\n");
+ }
+ return handle;
+}
+
+FILE *get_file(char *access,char *prompt,char *filename)
+{
+ printf("\n %s",prompt);
+ return getopen(filename,access);
+}
+
+void makedisplay(unsigned char thischar, vgafont *thisfont)
+{
+ int temp,mask,i,k,hold;
+ for (i=0; i<16; i++) {
+ temp=thisfont->charset[thischar].bitmap[i];
+ mask=0x80;
+ for (k=0; k<8; k++) {
+ hold=temp & mask;
+ if (hold==0) editchar.row[i].column[k]=0;
+ else editchar.row[i].column[k]=1;
+ mask=mask / 2;
+ } /* endfor k */
+ } /* endfor i */
+ return;
+}
+
+
+main(int argc, char *argv[])
+{
+ FILE *f1=(FILE *) NULL;
+ FILE *f2=(FILE *) NULL;
+ int done,ch,i,k,codeout;
+ char quote,percent;
+ vgafont *thisvga;
+ quote=34;
+ percent=37;
+ /* yes, yes! we are assuming the ASCII character set */
+ copyright();
+ thisvga = (vgafont *) malloc(sizeof(vgafont));
+ if (argc > 1) {
+ f1 = fopen(argv[1],"rb");
+ (void) strcpy(infilename,argv[1]);
+ }
+ if (f1 == (FILE *) NULL) {
+ /* prompt for and open input file */
+ for ( ; f1 == (FILE *) NULL; f1=get_file("rb","Enter name of input vga font file: ",infilename)) ;
+ }
+ fread(thisvga,sizeof(vgafont),1,f1);
+ fclose(f1);
+ if (argc > 2) {
+ (void) strcpy(outfilename,argv[2]);
+ exists(outfilename);
+ f2 = fopen(argv[2],"w");
+ }
+ if (f2 == (FILE *) NULL) {
+ /* prompt for and open output file */
+ for ( ; f2 == (FILE *) NULL; f2=get_file("w","Enter name of output Metafont source file: ",outfilename)) ;
+ }
+ fprintf(f2,"%c This is %s generated by VGA2MF from %s.\n",percent,outfilename,infilename);
+ fprintf(f2,"if unknown cmbase: input cmbase fi\n");
+ fprintf(f2,"mode_setup;\n");
+ fprintf(f2,"def generate suffix t= enddef;\n");
+ fprintf(f2,"input cmtt10; font_setup;\n");
+ fprintf(f2,"if ligs>1: font_coding_scheme:=%cTeX text%c;\n",quote,quote);
+ fprintf(f2,"else: font_coding_scheme:=if ligs=0: %cTeX typewriter text%c\n",quote,quote);
+ fprintf(f2," else: %cTeX text without f-ligatures%c fi; fi \n",quote,quote);
+ fprintf(f2,"numeric cheight; cheight=body_height+desc_depth;\n");
+ fprintf(f2,"numeric hhalf; numeric vhalf; hhalf=.4u; vhalf=(cheight)/36;\n");
+ fprintf(f2,"numeric vcent; vcent=cheight/32; numeric hcent; hcent=9/16u;\n");
+ fprintf(f2,"def crt(expr row,col) =\n");
+ fprintf(f2,"y.c:=body_height-(row * cheight / 16)-vcent; x.c:=hcent+(col * 9/8u);\n");
+ fprintf(f2,"y.a:=y.c+vhalf; y.b:=y.c-vhalf;\n");
+ fprintf(f2,"x.a:=x.c-hhalf; x.b:=x.c+hhalf;\n");
+ fprintf(f2,"filldraw (x.a,y.b)..(x.a,y.a)..(x.b,y.a)..(x.b,y.b)..cycle;\n");
+ fprintf(f2,"enddef;\n");
+ printf("Now processing character ");
+ for (ch=0; ch<256; ch++) {
+ /* generate code for character ch */
+ if ( (ch < 32) || (ch > 126) ) printf("[%d] ",ch);
+ else printf("[%c] ",ch);
+ fprintf(f2,"\nbeginchar(%d,9u#,body_height#,desc_depth#);",ch);
+ fprintf(f2,"adjust_fit(0,0);\npickup pencircle scaled 0.2pt;\n");
+ makedisplay(ch,thisvga);
+ for(i=0; i < 16; i++) {
+ codeout=0;
+ for(k=0; k<8; k++) {
+ if (editchar.row[i].column[k] != 0) {
+ fprintf(f2,"crt(%d,%d); ",i,k);
+ codeout=1;
+ } /* endif set dot on */
+ } /* end k */
+ if (codeout > 0) fprintf(f2,"\n");
+ } /* endfor i */
+ fprintf(f2,"endchar;\n");
+ if ( ( ch % 16 ) == 0 ) printf("\n");
+ } /* endfor ch */
+ fprintf(f2,"\n");
+ fprintf(f2,"font_slant slant; font_x_height x_height#;\n");
+ fprintf(f2," font_normal_space 9u#;\n");
+ fprintf(f2," font_quad 18u#;\n");
+ fprintf(f2," font_extra_space 9u#;\n");
+ fprintf(f2,"bye.\n");
+ printf("\nVGA2MF is done. Good luck with your new font.\n");
+ fclose(f2);
+}
+
diff --git a/fonts/utilities/ega2mf/wnpc10.mf b/fonts/utilities/ega2mf/wnpc10.mf
new file mode 100644
index 0000000000..6ed06adc4b
--- /dev/null
+++ b/fonts/utilities/ega2mf/wnpc10.mf
@@ -0,0 +1,3420 @@
+% File: MF Inputs wnpc10.mf
+% Author: Thomas Ridgeway
+% Internet: ridgeway@blake.acs.washington.edu
+% Date: May 12, 1989
+%
+% This is one of a proposed collection of University of Washington
+% "screen" fonts. This one is derived from the actual bitmap for the basic
+% ega font for the IBM PC and its close relatives. As you will see, if you
+% run it interactively in proof mode, it preserves the dot pattern
+% of the screen font, as well as the outline. The output at 300-dpi
+% looks surprisingly good, and will be very useful for simulating
+% the appearance of the screen in descriptions of programs and
+% manuals.
+
+
+mode_setup;
+def generate suffix t= enddef;input cmtt10; font_setup;
+if ligs>1: font_coding_scheme:="TeX text";
+else: font_coding_scheme:=if ligs=0: "TeX typewriter text"
+ else: "TeX text without f-ligatures" fi; fi
+numeric cheight; cheight=body_height+desc_depth;
+numeric hhalf; numeric vhalf; hhalf=.4u; vhalf=(cheight)/36;
+numeric vcent; vcent=cheight/28; numeric hcent; hcent=9/16u;
+def crt(expr row,col) =
+y.c:=body_height-(row * cheight / 14)-vcent; x.c:=hcent+(col * 9/8u);
+y.a:=y.c+vhalf; y.b:=y.c-vhalf;
+x.a:=x.c-hhalf; x.b:=x.c+hhalf;
+filldraw (x.a,y.b)..(x.a,y.a)..(x.b,y.a)..(x.b,y.b)..cycle;
+enddef;
+
+beginchar(0,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+endchar;
+
+beginchar(1,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,7);
+crt(4,0); crt(4,2); crt(4,5); crt(4,7);
+crt(5,0); crt(5,7);
+crt(6,0); crt(6,7);
+crt(7,0); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,7);
+crt(8,0); crt(8,3); crt(8,4); crt(8,7);
+crt(9,0); crt(9,7);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(2,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,3); crt(4,4); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,2); crt(8,5); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(3,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,2); crt(9,3); crt(9,4);
+crt(10,3);
+endchar;
+
+beginchar(4,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,3);
+crt(4,2); crt(4,3); crt(4,4);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,2); crt(8,3); crt(8,4);
+crt(9,3);
+endchar;
+
+beginchar(5,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,2); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,2); crt(6,5); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(6,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(7,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,3); crt(5,4);
+crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,3); crt(8,4);
+endchar;
+
+beginchar(8,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,2); crt(0,3); crt(0,4); crt(0,5); crt(0,6); crt(0,7);
+crt(1,0); crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,2); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,2); crt(8,5); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+crt(11,0); crt(11,1); crt(11,2); crt(11,3); crt(11,4); crt(11,5); crt(11,6); crt(11,7);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+crt(13,0); crt(13,1); crt(13,2); crt(13,3); crt(13,4); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(9,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,6);
+crt(7,1); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+endchar;
+
+beginchar(10,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,2); crt(0,3); crt(0,4); crt(0,5); crt(0,6); crt(0,7);
+crt(1,0); crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,6); crt(4,7);
+crt(5,0); crt(5,3); crt(5,4); crt(5,7);
+crt(6,0); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,7);
+crt(7,0); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,7);
+crt(8,0); crt(8,3); crt(8,4); crt(8,7);
+crt(9,0); crt(9,1); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+crt(11,0); crt(11,1); crt(11,2); crt(11,3); crt(11,4); crt(11,5); crt(11,6); crt(11,7);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+crt(13,0); crt(13,1); crt(13,2); crt(13,3); crt(13,4); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(11,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,4); crt(3,5); crt(3,6);
+crt(4,3); crt(4,4); crt(4,6);
+crt(5,2); crt(5,3); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(12,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,3); crt(7,4);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(13,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,2); crt(3,3); crt(3,6); crt(3,7);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,2); crt(5,3);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3);
+crt(8,1); crt(8,2); crt(8,3);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3);
+crt(10,0); crt(10,1); crt(10,2);
+endchar;
+
+beginchar(14,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,1); crt(3,2); crt(3,6); crt(3,7);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,1); crt(5,2); crt(5,6); crt(5,7);
+crt(6,1); crt(6,2); crt(6,6); crt(6,7);
+crt(7,1); crt(7,2); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,5); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+crt(11,0); crt(11,1);
+endchar;
+
+beginchar(15,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,0); crt(4,1); crt(4,3); crt(4,4); crt(4,6); crt(4,7);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,2); crt(6,5); crt(6,6); crt(6,7);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,6); crt(8,7);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(16,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0);
+crt(3,0); crt(3,1);
+crt(4,0); crt(4,1); crt(4,2);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,0); crt(8,1); crt(8,2);
+crt(9,0); crt(9,1);
+crt(10,0);
+endchar;
+
+beginchar(17,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,6);
+crt(3,5); crt(3,6);
+crt(4,4); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,4); crt(8,5); crt(8,6);
+crt(9,5); crt(9,6);
+crt(10,6);
+endchar;
+
+beginchar(18,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(19,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(20,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,3); crt(3,4); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,3); crt(4,4); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,6); crt(5,7);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,6); crt(6,7);
+crt(7,3); crt(7,4); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4); crt(8,6); crt(8,7);
+crt(9,3); crt(9,4); crt(9,6); crt(9,7);
+crt(10,3); crt(10,4); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(21,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5);
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2);
+crt(4,2); crt(4,3); crt(4,4);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,2); crt(9,3); crt(9,4);
+crt(10,4); crt(10,5);
+crt(11,0); crt(11,1); crt(11,5); crt(11,6);
+crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5);
+endchar;
+
+beginchar(22,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(23,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+crt(11,1); crt(11,2); crt(11,3); crt(11,4); crt(11,5); crt(11,6);
+endchar;
+
+beginchar(24,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(25,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(26,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,3); crt(4,4);
+crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,4); crt(7,5);
+crt(8,3); crt(8,4);
+endchar;
+
+beginchar(27,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,2); crt(4,3);
+crt(5,1); crt(5,2);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2);
+crt(8,2); crt(8,3);
+endchar;
+
+beginchar(28,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+endchar;
+
+beginchar(29,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,2); crt(4,5);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,2); crt(8,5);
+endchar;
+
+beginchar(30,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,3);
+crt(4,2); crt(4,3); crt(4,4);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+endchar;
+
+beginchar(31,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,2); crt(7,3); crt(7,4);
+crt(8,2); crt(8,3); crt(8,4);
+crt(9,3);
+endchar;
+
+beginchar(32,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+endchar;
+
+beginchar(33,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(34,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2); crt(1,6); crt(1,7);
+crt(2,1); crt(2,2); crt(2,6); crt(2,7);
+crt(3,1); crt(3,2); crt(3,6); crt(3,7);
+crt(4,2); crt(4,6);
+endchar;
+
+beginchar(35,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(36,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,6);
+crt(5,0); crt(5,1);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,5); crt(7,6);
+crt(8,0); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+endchar;
+
+beginchar(37,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,0); crt(4,1); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,4); crt(6,5);
+crt(7,3); crt(7,4);
+crt(8,2); crt(8,3);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(38,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,4); crt(4,5);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(39,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3);
+crt(2,2); crt(2,3);
+crt(3,2); crt(3,3);
+crt(4,1); crt(4,2);
+endchar;
+
+beginchar(40,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,4); crt(2,5);
+crt(3,3); crt(3,4);
+crt(4,2); crt(4,3);
+crt(5,2); crt(5,3);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3);
+crt(8,2); crt(8,3);
+crt(9,3); crt(9,4);
+crt(10,4); crt(10,5);
+endchar;
+
+beginchar(41,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(4,4); crt(4,5);
+crt(5,4); crt(5,5);
+crt(6,4); crt(6,5);
+crt(7,4); crt(7,5);
+crt(8,4); crt(8,5);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3);
+endchar;
+
+beginchar(42,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+endchar;
+
+beginchar(43,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+endchar;
+
+beginchar(44,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,2); crt(11,3);
+endchar;
+
+beginchar(45,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+endchar;
+
+beginchar(46,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(47,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,6);
+crt(3,5); crt(3,6);
+crt(4,4); crt(4,5);
+crt(5,3); crt(5,4);
+crt(6,2); crt(6,3);
+crt(7,1); crt(7,2);
+crt(8,0); crt(8,1);
+crt(9,0);
+endchar;
+
+beginchar(48,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,4); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(49,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3); crt(3,4);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(50,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,5); crt(4,6);
+crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3);
+crt(8,1); crt(8,2);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(51,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,5); crt(4,6);
+crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,5); crt(7,6);
+crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(52,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,4); crt(2,5);
+crt(3,3); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,4); crt(8,5);
+crt(9,4); crt(9,5);
+crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(53,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1);
+crt(4,0); crt(4,1);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,5); crt(7,6);
+crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(54,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2);
+crt(4,0); crt(4,1);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(55,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,5); crt(4,6);
+crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3);
+crt(8,2); crt(8,3);
+crt(9,2); crt(9,3);
+crt(10,2); crt(10,3);
+endchar;
+
+beginchar(56,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(57,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,5); crt(7,6);
+crt(8,5); crt(8,6);
+crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(58,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+endchar;
+
+beginchar(59,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3);
+endchar;
+
+beginchar(60,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,5); crt(2,6);
+crt(3,4); crt(3,5);
+crt(4,3); crt(4,4);
+crt(5,2); crt(5,3);
+crt(6,1); crt(6,2);
+crt(7,2); crt(7,3);
+crt(8,3); crt(8,4);
+crt(9,4); crt(9,5);
+crt(10,5); crt(10,6);
+endchar;
+
+beginchar(61,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+endchar;
+
+beginchar(62,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2);
+crt(3,2); crt(3,3);
+crt(4,3); crt(4,4);
+crt(5,4); crt(5,5);
+crt(6,5); crt(6,6);
+crt(7,4); crt(7,5);
+crt(8,3); crt(8,4);
+crt(9,2); crt(9,3);
+crt(10,1); crt(10,2);
+endchar;
+
+beginchar(63,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(64,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(65,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3);
+crt(3,2); crt(3,3); crt(3,4);
+crt(4,1); crt(4,2); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(66,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(67,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,6);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1);
+crt(8,0); crt(8,1); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(68,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(69,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,6);
+crt(5,1); crt(5,2); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4);
+crt(7,1); crt(7,2); crt(7,4);
+crt(8,1); crt(8,2); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(70,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,6);
+crt(5,1); crt(5,2); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4);
+crt(7,1); crt(7,2); crt(7,4);
+crt(8,1); crt(8,2);
+crt(9,1); crt(9,2);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(71,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,6);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,4); crt(10,6);
+endchar;
+
+beginchar(72,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(73,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(74,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,4); crt(3,5);
+crt(4,4); crt(4,5);
+crt(5,4); crt(5,5);
+crt(6,4); crt(6,5);
+crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(75,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(76,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3);
+crt(3,1); crt(3,2);
+crt(4,1); crt(4,2);
+crt(5,1); crt(5,2);
+crt(6,1); crt(6,2);
+crt(7,1); crt(7,2);
+crt(8,1); crt(8,2); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(77,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,2); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(78,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(79,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(80,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2);
+crt(8,1); crt(8,2);
+crt(9,1); crt(9,2);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(81,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,3); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,4); crt(10,5);
+crt(11,4); crt(11,5); crt(11,6);
+endchar;
+
+beginchar(82,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(83,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2);
+crt(6,2); crt(6,3); crt(6,4);
+crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(84,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,3); crt(3,4); crt(3,6); crt(3,7);
+crt(4,0); crt(4,3); crt(4,4); crt(4,7);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(85,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(86,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(87,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6); crt(8,7);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(88,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,6); crt(3,7);
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(89,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,6); crt(4,7);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(90,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,6); crt(3,7);
+crt(4,0); crt(4,5); crt(4,6);
+crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3);
+crt(8,1); crt(8,2); crt(8,7);
+crt(9,0); crt(9,1); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(91,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,2); crt(3,3);
+crt(4,2); crt(4,3);
+crt(5,2); crt(5,3);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3);
+crt(8,2); crt(8,3);
+crt(9,2); crt(9,3);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(92,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0);
+crt(3,0); crt(3,1);
+crt(4,0); crt(4,1); crt(4,2);
+crt(5,1); crt(5,2); crt(5,3);
+crt(6,2); crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5);
+crt(8,4); crt(8,5); crt(8,6);
+crt(9,5); crt(9,6);
+crt(10,6);
+endchar;
+
+beginchar(93,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,4); crt(3,5);
+crt(4,4); crt(4,5);
+crt(5,4); crt(5,5);
+crt(6,4); crt(6,5);
+crt(7,4); crt(7,5);
+crt(8,4); crt(8,5);
+crt(9,4); crt(9,5);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(94,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3);
+crt(1,2); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+endchar;
+
+beginchar(95,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+endchar;
+
+beginchar(96,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3);
+crt(1,2); crt(1,3);
+crt(2,3); crt(2,4);
+endchar;
+
+beginchar(97,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(98,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2);
+crt(3,1); crt(3,2);
+crt(4,1); crt(4,2);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(99,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(100,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4); crt(2,5);
+crt(3,4); crt(3,5);
+crt(4,4); crt(4,5);
+crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(101,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(102,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,5);
+crt(5,1); crt(5,2);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3);
+crt(7,1); crt(7,2);
+crt(8,1); crt(8,2);
+crt(9,1); crt(9,2);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(103,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,4); crt(10,5);
+crt(11,0); crt(11,1); crt(11,4); crt(11,5);
+crt(12,1); crt(12,2); crt(12,3); crt(12,4);
+endchar;
+
+beginchar(104,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2);
+crt(3,1); crt(3,2);
+crt(4,1); crt(4,2);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(105,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(106,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,5); crt(2,6);
+crt(3,5); crt(3,6);
+crt(5,4); crt(5,5); crt(5,6);
+crt(6,5); crt(6,6);
+crt(7,5); crt(7,6);
+crt(8,5); crt(8,6);
+crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+crt(11,1); crt(11,2); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,4); crt(12,5);
+endchar;
+
+beginchar(107,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2);
+crt(3,1); crt(3,2);
+crt(4,1); crt(4,2);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(108,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(109,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,3); crt(9,4); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,3); crt(10,4); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(110,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(111,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(112,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2);
+crt(11,1); crt(11,2);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3);
+endchar;
+
+beginchar(113,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,4); crt(10,5);
+crt(11,4); crt(11,5);
+crt(12,3); crt(12,4); crt(12,5); crt(12,6);
+endchar;
+
+beginchar(114,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2);
+crt(9,1); crt(9,2);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(115,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,3);
+crt(8,3); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(116,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3);
+crt(3,2); crt(3,3);
+crt(4,2); crt(4,3);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3);
+crt(8,2); crt(8,3);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(117,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(118,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(119,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(120,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,2); crt(7,3); crt(7,4);
+crt(8,2); crt(8,3); crt(8,4);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(121,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+crt(10,5); crt(10,6);
+crt(11,4); crt(11,5);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4);
+endchar;
+
+beginchar(122,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,3); crt(7,4);
+crt(8,2); crt(8,3);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(123,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,4); crt(2,5); crt(2,6);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(124,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(125,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,4); crt(6,5); crt(6,6);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(126,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,3); crt(3,4); crt(3,5);
+endchar;
+
+beginchar(127,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,3);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+endchar;
+
+beginchar(128,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,6);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,4); crt(10,5);
+crt(11,5); crt(11,6);
+crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5);
+endchar;
+
+beginchar(129,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,4); crt(3,5);
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(130,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,4); crt(1,5);
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(131,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3);
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(132,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,4); crt(3,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(133,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2);
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(134,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,2); crt(3,3); crt(3,4);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(135,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,4); crt(9,5);
+crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,4); crt(11,5);
+endchar;
+
+beginchar(136,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3);
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(137,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,4); crt(2,5);
+crt(3,0); crt(3,1); crt(3,4); crt(3,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(138,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2);
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(139,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(140,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3); crt(1,4);
+crt(2,2); crt(2,3); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(141,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2);
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(142,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1); crt(1,5); crt(1,6);
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,3);
+crt(4,2); crt(4,3); crt(4,4);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(143,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,4);
+crt(1,1); crt(1,2); crt(1,4); crt(1,5);
+crt(2,2); crt(2,3); crt(2,4);
+crt(4,2); crt(4,3); crt(4,4);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(144,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,2); crt(1,3);
+crt(2,1); crt(2,2);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(145,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,4); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,4); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4); crt(6,6); crt(6,7);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4);
+crt(9,0); crt(9,1); crt(9,3); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(146,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,0); crt(10,1); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(147,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3);
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(148,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(149,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2);
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(150,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3);
+crt(2,1); crt(2,2); crt(2,3); crt(2,4);
+crt(3,0); crt(3,1); crt(3,4); crt(3,5);
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(151,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2);
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(152,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+crt(10,5); crt(10,6);
+crt(11,4); crt(11,5);
+crt(12,1); crt(12,2); crt(12,3); crt(12,4);
+endchar;
+
+beginchar(153,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1); crt(1,5); crt(1,6);
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,4);
+crt(4,1); crt(4,2); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(154,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1); crt(1,5); crt(1,6);
+crt(2,0); crt(2,1); crt(2,5); crt(2,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(155,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(156,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,5);
+crt(4,1); crt(4,2);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3);
+crt(6,1); crt(6,2);
+crt(7,1); crt(7,2);
+crt(8,1); crt(8,2);
+crt(9,0); crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(157,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,6); crt(2,7);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,3); crt(5,4);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,3); crt(7,4);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6); crt(8,7);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(158,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5);
+crt(2,1); crt(2,2); crt(2,5); crt(2,6);
+crt(3,1); crt(3,2); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,6);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(159,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,4); crt(1,5); crt(1,6);
+crt(2,3); crt(2,4); crt(2,6); crt(2,7);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,0); crt(11,1); crt(11,3); crt(11,4);
+crt(12,1); crt(12,2); crt(12,3);
+endchar;
+
+beginchar(160,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3); crt(1,4);
+crt(2,2); crt(2,3);
+crt(3,1); crt(3,2);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(161,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,4); crt(1,5);
+crt(2,3); crt(2,4);
+crt(3,2); crt(3,3);
+crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(162,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3); crt(1,4);
+crt(2,2); crt(2,3);
+crt(3,1); crt(3,2);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(163,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,3); crt(1,4);
+crt(2,2); crt(2,3);
+crt(3,1); crt(3,2);
+crt(5,0); crt(5,1); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5);
+crt(9,0); crt(9,1); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(164,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,3); crt(3,4); crt(3,5);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(165,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,1); crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,0); crt(1,1); crt(1,3); crt(1,4); crt(1,5);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(166,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3); crt(1,4); crt(1,5);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+endchar;
+
+beginchar(167,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+endchar;
+
+beginchar(168,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3);
+crt(3,2); crt(3,3);
+crt(5,2); crt(5,3);
+crt(6,2); crt(6,3);
+crt(7,1); crt(7,2);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(169,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1);
+endchar;
+
+beginchar(170,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,5); crt(7,6);
+crt(8,5); crt(8,6);
+crt(9,5); crt(9,6);
+endchar;
+
+beginchar(171,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1);
+crt(2,0); crt(2,1);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4);
+crt(6,2); crt(6,3);
+crt(7,1); crt(7,2);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,5);
+crt(9,0); crt(9,5); crt(9,6);
+crt(10,4); crt(10,5);
+crt(11,3); crt(11,4);
+crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6);
+endchar;
+
+beginchar(172,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1);
+crt(2,0); crt(2,1);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4);
+crt(6,2); crt(6,3);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,4); crt(8,5); crt(8,6);
+crt(9,0); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+crt(11,5); crt(11,6);
+crt(12,5); crt(12,6);
+endchar;
+
+beginchar(173,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(174,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+endchar;
+
+beginchar(175,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,0); crt(4,1); crt(4,3); crt(4,4);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4);
+endchar;
+
+beginchar(176,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,7);
+crt(1,1); crt(1,5);
+crt(2,3); crt(2,7);
+crt(3,1); crt(3,5);
+crt(4,3); crt(4,7);
+crt(5,1); crt(5,5);
+crt(6,3); crt(6,7);
+crt(7,1); crt(7,5);
+crt(8,3); crt(8,7);
+crt(9,1); crt(9,5);
+crt(10,3); crt(10,7);
+crt(11,1); crt(11,5);
+crt(12,3); crt(12,7);
+crt(13,1); crt(13,5);
+endchar;
+
+beginchar(177,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,1); crt(0,3); crt(0,5); crt(0,7);
+crt(1,0); crt(1,2); crt(1,4); crt(1,6);
+crt(2,1); crt(2,3); crt(2,5); crt(2,7);
+crt(3,0); crt(3,2); crt(3,4); crt(3,6);
+crt(4,1); crt(4,3); crt(4,5); crt(4,7);
+crt(5,0); crt(5,2); crt(5,4); crt(5,6);
+crt(6,1); crt(6,3); crt(6,5); crt(6,7);
+crt(7,0); crt(7,2); crt(7,4); crt(7,6);
+crt(8,1); crt(8,3); crt(8,5); crt(8,7);
+crt(9,0); crt(9,2); crt(9,4); crt(9,6);
+crt(10,1); crt(10,3); crt(10,5); crt(10,7);
+crt(11,0); crt(11,2); crt(11,4); crt(11,6);
+crt(12,1); crt(12,3); crt(12,5); crt(12,7);
+crt(13,0); crt(13,2); crt(13,4); crt(13,6);
+endchar;
+
+beginchar(178,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,3); crt(0,4); crt(0,5); crt(0,7);
+crt(1,1); crt(1,2); crt(1,3); crt(1,5); crt(1,6); crt(1,7);
+crt(2,0); crt(2,1); crt(2,3); crt(2,4); crt(2,5); crt(2,7);
+crt(3,1); crt(3,2); crt(3,3); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,3); crt(4,4); crt(4,5); crt(4,7);
+crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,5); crt(6,7);
+crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,5); crt(8,7);
+crt(9,1); crt(9,2); crt(9,3); crt(9,5); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,3); crt(10,4); crt(10,5); crt(10,7);
+crt(11,1); crt(11,2); crt(11,3); crt(11,5); crt(11,6); crt(11,7);
+crt(12,0); crt(12,1); crt(12,3); crt(12,4); crt(12,5); crt(12,7);
+crt(13,1); crt(13,2); crt(13,3); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(179,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(180,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(181,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(182,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(183,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(184,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(185,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(186,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,2); crt(7,3); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(187,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(188,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+endchar;
+
+beginchar(189,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6);
+endchar;
+
+beginchar(190,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+endchar;
+
+beginchar(191,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(192,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(193,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(194,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(195,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(196,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(197,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(198,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(199,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(200,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6); crt(5,7);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(201,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(202,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(203,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(204,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6); crt(5,7);
+crt(6,2); crt(6,3);
+crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(205,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(206,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(207,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(208,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(209,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(210,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(211,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(212,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+endchar;
+
+beginchar(213,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(214,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(215,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,2); crt(0,3); crt(0,5); crt(0,6);
+crt(1,2); crt(1,3); crt(1,5); crt(1,6);
+crt(2,2); crt(2,3); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3); crt(3,5); crt(3,6);
+crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,2); crt(6,3); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,2); crt(8,3); crt(8,5); crt(8,6);
+crt(9,2); crt(9,3); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+crt(11,2); crt(11,3); crt(11,5); crt(11,6);
+crt(12,2); crt(12,3); crt(12,5); crt(12,6);
+crt(13,2); crt(13,3); crt(13,5); crt(13,6);
+endchar;
+
+beginchar(216,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(217,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4);
+endchar;
+
+beginchar(218,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(219,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,2); crt(0,3); crt(0,4); crt(0,5); crt(0,6); crt(0,7);
+crt(1,0); crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+crt(11,0); crt(11,1); crt(11,2); crt(11,3); crt(11,4); crt(11,5); crt(11,6); crt(11,7);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+crt(13,0); crt(13,1); crt(13,2); crt(13,3); crt(13,4); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(220,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6); crt(8,7);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+crt(11,0); crt(11,1); crt(11,2); crt(11,3); crt(11,4); crt(11,5); crt(11,6); crt(11,7);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3); crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+crt(13,0); crt(13,1); crt(13,2); crt(13,3); crt(13,4); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(221,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,2); crt(0,3);
+crt(1,0); crt(1,1); crt(1,2); crt(1,3);
+crt(2,0); crt(2,1); crt(2,2); crt(2,3);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3);
+crt(8,0); crt(8,1); crt(8,2); crt(8,3);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3);
+crt(11,0); crt(11,1); crt(11,2); crt(11,3);
+crt(12,0); crt(12,1); crt(12,2); crt(12,3);
+crt(13,0); crt(13,1); crt(13,2); crt(13,3);
+endchar;
+
+beginchar(222,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,4); crt(0,5); crt(0,6); crt(0,7);
+crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(7,4); crt(7,5); crt(7,6); crt(7,7);
+crt(8,4); crt(8,5); crt(8,6); crt(8,7);
+crt(9,4); crt(9,5); crt(9,6); crt(9,7);
+crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+crt(11,4); crt(11,5); crt(11,6); crt(11,7);
+crt(12,4); crt(12,5); crt(12,6); crt(12,7);
+crt(13,4); crt(13,5); crt(13,6); crt(13,7);
+endchar;
+
+beginchar(223,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,0); crt(0,1); crt(0,2); crt(0,3); crt(0,4); crt(0,5); crt(0,6); crt(0,7);
+crt(1,0); crt(1,1); crt(1,2); crt(1,3); crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6); crt(2,7);
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6); crt(3,7);
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6); crt(4,7);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+endchar;
+
+beginchar(224,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4);
+crt(9,0); crt(9,1); crt(9,3); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(225,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,0); crt(10,1);
+crt(11,0); crt(11,1);
+crt(12,1);
+endchar;
+
+beginchar(226,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1);
+crt(6,0); crt(6,1);
+crt(7,0); crt(7,1);
+crt(8,0); crt(8,1);
+crt(9,0); crt(9,1);
+crt(10,0); crt(10,1);
+endchar;
+
+beginchar(227,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,0); crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,1); crt(10,2); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(228,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,0); crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,0); crt(3,1); crt(3,5); crt(3,6);
+crt(4,1); crt(4,2);
+crt(5,2); crt(5,3);
+crt(6,3); crt(6,4);
+crt(7,2); crt(7,3);
+crt(8,1); crt(8,2);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(229,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4);
+crt(9,0); crt(9,1); crt(9,3); crt(9,4);
+crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(230,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,5); crt(4,6);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2);
+crt(10,1); crt(10,2);
+crt(11,0); crt(11,1);
+endchar;
+
+beginchar(231,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(232,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,1); crt(2,2); crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,3); crt(3,4);
+crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,5); crt(5,6);
+crt(6,1); crt(6,2); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,3); crt(9,4);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(233,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,2); crt(10,3); crt(10,4);
+endchar;
+
+beginchar(234,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3); crt(2,4);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,4); crt(9,5);
+crt(10,0); crt(10,1); crt(10,2); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(235,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4); crt(2,5); crt(2,6);
+crt(3,2); crt(3,3);
+crt(4,3); crt(4,4);
+crt(5,4); crt(5,5);
+crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(7,1); crt(7,2); crt(7,5); crt(7,6);
+crt(8,1); crt(8,2); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2); crt(9,5); crt(9,6);
+crt(10,2); crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(236,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,3); crt(7,4); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+endchar;
+
+beginchar(237,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,6); crt(2,7);
+crt(3,5); crt(3,6);
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,6); crt(5,7);
+crt(6,0); crt(6,1); crt(6,3); crt(6,4); crt(6,6); crt(6,7);
+crt(7,0); crt(7,1); crt(7,2); crt(7,3); crt(7,6); crt(7,7);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5); crt(8,6);
+crt(9,1); crt(9,2);
+crt(10,0); crt(10,1);
+endchar;
+
+beginchar(238,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4); crt(2,5);
+crt(3,2); crt(3,3);
+crt(4,1); crt(4,2);
+crt(5,1); crt(5,2);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2);
+crt(8,1); crt(8,2);
+crt(9,2); crt(9,3);
+crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(239,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5);
+crt(4,0); crt(4,1); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,5); crt(5,6);
+crt(6,0); crt(6,1); crt(6,5); crt(6,6);
+crt(7,0); crt(7,1); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,5); crt(8,6);
+crt(9,0); crt(9,1); crt(9,5); crt(9,6);
+crt(10,0); crt(10,1); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(240,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(3,0); crt(3,1); crt(3,2); crt(3,3); crt(3,4); crt(3,5); crt(3,6);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6);
+crt(9,0); crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5); crt(9,6);
+endchar;
+
+beginchar(241,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,0); crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5); crt(5,6); crt(5,7);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(10,0); crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6); crt(10,7);
+endchar;
+
+beginchar(242,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,2); crt(2,3);
+crt(3,3); crt(3,4);
+crt(4,4); crt(4,5);
+crt(5,5); crt(5,6);
+crt(6,4); crt(6,5);
+crt(7,3); crt(7,4);
+crt(8,2); crt(8,3);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(243,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,4); crt(2,5);
+crt(3,3); crt(3,4);
+crt(4,2); crt(4,3);
+crt(5,1); crt(5,2);
+crt(6,2); crt(6,3);
+crt(7,3); crt(7,4);
+crt(8,4); crt(8,5);
+crt(10,1); crt(10,2); crt(10,3); crt(10,4); crt(10,5); crt(10,6);
+endchar;
+
+beginchar(244,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,4); crt(2,5); crt(2,6);
+crt(3,3); crt(3,4); crt(3,6); crt(3,7);
+crt(4,3); crt(4,4); crt(4,6); crt(4,7);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,3); crt(8,4);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+crt(11,3); crt(11,4);
+crt(12,3); crt(12,4);
+crt(13,3); crt(13,4);
+endchar;
+
+beginchar(245,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(0,3); crt(0,4);
+crt(1,3); crt(1,4);
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(4,3); crt(4,4);
+crt(5,3); crt(5,4);
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4);
+crt(9,0); crt(9,1); crt(9,3); crt(9,4);
+crt(10,1); crt(10,2); crt(10,3);
+endchar;
+
+beginchar(246,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(2,3); crt(2,4);
+crt(3,3); crt(3,4);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5); crt(6,6); crt(6,7);
+crt(9,3); crt(9,4);
+crt(10,3); crt(10,4);
+endchar;
+
+beginchar(247,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,3); crt(4,5); crt(4,6);
+crt(5,0); crt(5,1); crt(5,3); crt(5,4); crt(5,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,5); crt(7,6);
+crt(8,0); crt(8,1); crt(8,3); crt(8,4); crt(8,5);
+endchar;
+
+beginchar(248,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,2); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,2); crt(4,3); crt(4,4);
+endchar;
+
+beginchar(249,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(6,3); crt(6,4);
+crt(7,3); crt(7,4);
+endchar;
+
+beginchar(250,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(7,3); crt(7,4);
+endchar;
+
+beginchar(251,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,4); crt(1,5); crt(1,6); crt(1,7);
+crt(2,4); crt(2,5);
+crt(3,4); crt(3,5);
+crt(4,4); crt(4,5);
+crt(5,4); crt(5,5);
+crt(6,4); crt(6,5);
+crt(7,0); crt(7,1); crt(7,2); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,4); crt(8,5);
+crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+crt(10,3); crt(10,4); crt(10,5);
+endchar;
+
+beginchar(252,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,0); crt(1,1); crt(1,3); crt(1,4);
+crt(2,1); crt(2,2); crt(2,4); crt(2,5);
+crt(3,1); crt(3,2); crt(3,4); crt(3,5);
+crt(4,1); crt(4,2); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,4); crt(6,5);
+endchar;
+
+beginchar(253,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(1,1); crt(1,2); crt(1,3);
+crt(2,0); crt(2,1); crt(2,3); crt(2,4);
+crt(3,2); crt(3,3);
+crt(4,1); crt(4,2);
+crt(5,0); crt(5,1); crt(5,4);
+crt(6,0); crt(6,1); crt(6,2); crt(6,3); crt(6,4);
+endchar;
+
+beginchar(254,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+crt(4,1); crt(4,2); crt(4,3); crt(4,4); crt(4,5);
+crt(5,1); crt(5,2); crt(5,3); crt(5,4); crt(5,5);
+crt(6,1); crt(6,2); crt(6,3); crt(6,4); crt(6,5);
+crt(7,1); crt(7,2); crt(7,3); crt(7,4); crt(7,5);
+crt(8,1); crt(8,2); crt(8,3); crt(8,4); crt(8,5);
+crt(9,1); crt(9,2); crt(9,3); crt(9,4); crt(9,5);
+endchar;
+
+beginchar(255,9u#,body_height#,desc_depth#);
+adjust_fit(0,0);
+pickup pencircle scaled 0.2pt;
+endchar;
+
+font_slant slant; font_x_height x_height#;
+ font_normal_space 9u#;
+ font_quad 18u#;
+ font_extra_space 9u#;
+bye.
diff --git a/fonts/utilities/ega2mf/wnpc10.tex b/fonts/utilities/ega2mf/wnpc10.tex
new file mode 100644
index 0000000000..5ce68ace25
--- /dev/null
+++ b/fonts/utilities/ega2mf/wnpc10.tex
@@ -0,0 +1,35 @@
+\noindent document: wnpc10.tex translated from wnpc10.txt
+\font\screen=wnpc10
+\vfil
+This little document shows how one may make use of the wnpc10 screen
+display font for illustration in a manual. Suppose for instance, that one wishes
+to show an actual screen display which a program may present to the user.
+Switch to the wnpc10 font, and $\ldots$
+\medskip
+
+\def\crtscreen{\obeylines\obeyspaces\offinterlineskip\screen\parindent=0pt}
+{\crtscreen
+ÉÍÍÍÍÍÍÍÍÍÍÍÍ» HUMANITIES AND ARTS COMPUTING CENTER DW-10
+ºÉÍÍÍÍÍÍÍÍÍÍ»º University of Washington
+ºº ɸոոջ ºº
+ºº ÈØÏØØÏؼ ºº
+ºº ÉØÑØØÑØ» ºº Copyright 1989 HACC
+ºÈ͹ƵƵƵÌͼº
+º ÓÙÀÙÀÙÀ½ º
+º HACC º
+ÈÍÍÍÍÍÍÍÍÍÍÍͼ
+}
+\medskip
+ In some cases, one may wish to show a rendering of a PC screen with non--Ascii
+characters displayed, as above, or at other times, one may just wish to have
+the verisimilitude obtained with a font resembling an actual screen display,
+even if the text could perfectly well be printed without a special font:
+\medskip
+{\crtscreen
+This is TeX, Version 2.1 (preloaded format=plain 88.7.5) 11 MAY 1989 18:01
+ (PCTeX 2.10, (c)Personal TeX, Inc 1987. S/N 11003)
+**
+}
+\vfil\vfil
+
+\bye
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/HISTORY b/fonts/utilities/fontinst-contrib/grkfinst/HISTORY
new file mode 100644
index 0000000000..184a2816ad
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/HISTORY
@@ -0,0 +1,60 @@
+2005-05-07 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.3.2 released.
+
+ * Added everything needed for installing Greek Linotype fonts
+ (including a set of aliases and a special mtx file,
+ greek-lt.mtx, used to fake Greek letters with iota
+ subscriptum (ypogegrammeni) by adding to the corresponding
+ letter one of the combining glyphs, iotasubscripta,
+ iotasubscripte or iotasubscripto, present in the Linotype
+ Greek fonts.
+
+ * Some new characters added to the greek.mtx file.
+
+ * Added new aliases for the Greek acrophonic numerals, available
+ in the LGR encoding, according to their (recently introduced)
+ Unicode values.
+
+ * dieresisacute/dieresisgrave renamed to dieresisacutegreek and
+ dieresisgravegreek to avoid clashes with dieresisacute and
+ dieresisgrave present in Adobe Cyrillic fonts.
+
+ * The file finstadd.tex renamed to aliasing.tex (since really
+ the only feature it adds to the fontinst core is the possibility
+ of adding aliases to the glyph names used in mtx files).
+
+ * All LaTeX macros replaced with equivalent fontinst constructions,
+ so that you can process fontinst job files with plain TeX or
+ plain Omega.
+
+ * Removed the file noautokern.mtx (load greek.mtx with the
+ `noautokern' option instead).
+
+2004-04-23 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.3.1 released.
+
+ * Added possibility to disable automatical generation of kerning
+ pairs for unfakable small accented letters.
+
+ * Added ligatures for quoteleft and quoteright in the LGR encoding.
+
+ * Added ligatures allowing to get automatical final sigma substitution
+ in the lgr-orig.etx file. Note that I still think these ligatures are
+ useless, and so I'm not planning to include them also into the
+ lgr.etx file, which is used for generating fonts in my psgreek
+ and cm-lgc packages.
+
+2003-08-31 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.3 released.
+
+ * The package adapted for fontinst v. 1.926.
+
+ * The directory structure changed according to the conventions used in
+ fontinst v. 1.926.
+
+2003-03-20 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.2 released: first public release.
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/README b/fonts/utilities/fontinst-contrib/grkfinst/README
new file mode 100644
index 0000000000..8471b4452a
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/README
@@ -0,0 +1,136 @@
+This is the README file of the GRKFINST package,
+version 0.3.2 (May 7, 2005)
+
+GRKFINST package is Copyright 2002-2005 by Alexej Kryukov
+<basileia@yandex.ru>.
+
+It may be distributed under the conditions of the LaTeX Project Public
+License, either version 1.1 of this license or (at your option) any
+later version.
+
+ABSTRACT
+~~~~~~~~
+
+GRKFINST is a plug-in for the fontinst package, which allows to
+install Greek Type 1 fonts with TeX.
+
+REQUIREMENTS
+~~~~~~~~~~~~
+
+First, you have to obtain the fontinst system version 1.926 or later. If
+you already have an older fontinst installation (teTeX 2.0 comes with
+fontinst 1.8), remove it. This document supposes that you already know how
+to install fonts with fontinst; if not refer to the fontinst
+documentation.
+
+If you are planning to create "large" virtual fonts for use with
+Omega, you have to download also my ofntinst package.
+
+FILES INCLUDED
+~~~~~~~~~~~~~~
+
+The GRKFINST package includes the following files:
+
+-- greek.mtx. This file represents the core of the system. It
+describes all glyphs from the Basic Greek and Extended Greek
+Unicode ranges and also some glyphs not present in Unicode, which,
+however, exist in the LGR encoding. This file utilizes some ideas
+originally implemented in the Cyrillic T2 package and adapts them
+to the Greek alphabet.
+
+Previously the package included a special file, called noautokern.mtx,
+used to disable automatical generation of kerning pairs for small
+accented letters. Although it is natural to set kerning for all such
+letters equal to the kerning of the same letters without accents (e. g.
+alphatonos should have the same kerning pairs as alpha), this may produce
+a lot of redundant kern pairs, which may never occur in real text. Now
+this file is not needed: if you want to prevent generating of such kern
+pairs, load greek.mtx with the `noautokern' option. Note that capital
+accented glyphs will be kerned anyway.
+
+-- greek-lt.mtx. This file is needed for installing Polytonic Greek fonts
+from Linotype. These fonts haven't precomposed combinations with iota
+subscriptum (ypogegrammeni): instead, they contain 3 variants of a
+combining ypogegrammeni (iotasubscripta, iotasubscripte or
+iotasubscripto), supposed to be typed before alpha, eta and omega
+correspondingly. greek-lt.mtx allows to `fake' accented letters with
+ypogegrammeni by adding this combining glyphs to the appropriate letters.
+
+-- aliasingtex. This file is based on fnstcorr.tex, taken from the
+Cyrillic T2 package. You have to load this file immediately after
+fontinst.sty. It defines some useful commands, for example, the \galias
+command, which allows to define aliases for glyph names used in the
+greek.mtx file.
+
+The idea behind glyph aliasing is that standard Greek glyph names could be
+used everywhere (greek.mtx, *.etx, your local mtx files, etc), and one
+file serves all possible non-standard glyph names! This glyph aliasing
+mechanism is also considered as an important way to correct glyph naming
+bugs in certain fonts.
+
+-- elalias.tex. This is a standard aliases table which allows to install
+Greek fonts from some vendors, using different glyph naming
+systems. It was tested with Greek fonts designed by Ralph Hancock
+and by the Paratype company. You may have to customize it
+according to the fonts you want to install.
+
+-- elalias-lt.tex. This table should be used for Linotype polytonic
+Greek fonts.
+
+-- elalias-uni.tex. This is another aliases table, which is suitable
+for fonts with more strict glyph naming system, based on the AGL
+(for example, it sets `uni1F00' as an alias for `alphalenis').
+
+-- wgalias.tex. This aliases table should be used for some WinGreek fonts
+where glyphs are named according to the ANSI standard, although these
+names really don't correspond to the glyphs they are representing. For
+example, the character with code 0xC0 has name `Agrave' although really it
+is Greek letter eta with psili and varia.
+
+-- lgr.etx. This file describes the LGR font encoding with some small
+modifications, as it is used in my psgreek package.
+
+-- lgr-orig.etx. This file describes the same LGR encoding exactly as
+it is represented in the CB Greek fonts. Now it also includes ligatures
+for final sigma (I still think they are useless and even harmful, so they
+will never be added also into lgr.etx and lgr-lig.etx).
+
+-- lgr-lig.etx. This file is useful for installing Greek fonts, containing
+some alternate glyph forms, especially the curled beta. It provides
+some ligatures which automatically replace standard beta with the curled
+form in the middle of the word.
+
+-- lgrc.etx, lgr-origc.etx, lgr-ligc.etx. These are driver files, used
+to load lgr.etx, lgr-orig.etx and lgr-lig.etx with slightly different
+parameters. They are necessary for installing fonts with faked small
+capitals.
+
+-- hancock.tex, wingreek.tex. These are sample files which illustrate
+installing Greek fonts with the LGR encoding.
+
+-- ohancock.tex, owingreek.tex. These are sample files which illustrate
+installing Unicode Greek fonts for use with Omega.
+
+INSTALLATION AND USAGE
+~~~~~~~~~~~~~~~~~~~~~~
+
+First, put all *.mtx, *.etx, *.sty and *.tex files to some places
+where TeX can find them (maybe, together with the corresponding
+files from the original fontinst package).
+
+Put *.afm files for font families you want to install to a separate
+directory and create a job file (if in trouble, refer to the fontinst
+documentation and to the samples included with this package).
+
+Process this file either with latex or with plain tex. For Unicode fonts
+with Greek glyphs use omega/lambda instead.
+
+Use the pltotf and vptovf utilities to convert your *.pl and *.vpl
+files into the binary format, ready for use with TeX.
+
+You can get nicely formatted sources of *.etx and *.mtx files by
+processing them with LaTeX. E.g., "latex lgr.etx" will generate
+"lgr.dvi" which documents the LGR encoding vector.
+
+Happy TeXing!
+Alexej Kryukov <basileia@yandex.ru>
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/hancock.tex b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/hancock.tex
new file mode 100644
index 0000000000..eb39db7eba
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/hancock.tex
@@ -0,0 +1,58 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This is an installation script for two Greek Type 1
+% font families designed by R. Hancock: Greek Old Face and
+% Milan Greek. This fonts itself use the WinGreek
+% encoding, so we have to create a set of virtual fonts
+% reencoding them to LGR.
+
+\input fontinst.sty
+
+% aliasing.tex provides some additional functionality and
+% is necessary for installing fonts with not AGL-compliant
+% glyph names
+
+\input aliasing
+
+% Some glyph names in Ralph Hancock's fonts don't correspond
+% to those expected by the grkfinst package. So,
+% we need a table of aliases.
+
+\input elalias
+
+\installfonts
+
+\installfamily{LGR}{hof}{}
+\installfont{hofrgr}{greekof,greek}{lgr}{LGR}{hof}{m}{it}{}
+\installfont{hofrgr}{greekof,greek}{lgr}{LGR}{hof}{m}{n}{}
+\installfont{hofrcgr}{greekof,greek}{lgrc}{LGR}{hof}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\installfonts
+
+\installfamily{LGR}{hml}{}
+\installfont{hmlrgr}{milan,greek}{lgr}{LGR}{hml}{m}{it}{}
+\installfont{hmlrgr}{milan,greek}{lgr}{LGR}{hml}{m}{n}{}
+\installfont{hmlrcgr}{milan,greek}{lgrc}{LGR}{hml}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/ohancock.tex b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/ohancock.tex
new file mode 100644
index 0000000000..4432c0d167
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/ohancock.tex
@@ -0,0 +1,64 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This is an installation script for two Greek Type 1
+% font families designed by R. Hancock: Greek Old Face and
+% Milan Greek. The fonts itself are 8-bit, but we reencode
+% them to Unicode using virtual fonts in Omega's ovf format.
+
+% This file should be processed with lambda or plain Omega
+% (not (La)TeX).
+
+\input fntinst.sty
+
+% aliasing.tex provides some additional functionality and
+% is necessary for installing fonts with not AGL-compliant
+% glyph names
+
+\input aliasing
+
+% Some glyph names in Ralph Hancock's fonts don't correspond
+% to those expected by the grkfinst package. So,
+% we need a table of aliases.
+
+\input elalias
+
+\installfonts
+
+% The ut1.etx and ut1c.etx files can be downloaded with
+% my ofntinst package.
+
+\installfamily{UT1}{hof}{}
+\installfont{hofrut}{greekof,greek}{ut1}{UT1}{hof}{m}{it}{}
+\installfont{hofrut}{greekof,greek}{ut1}{UT1}{hof}{m}{n}{}
+\installfont{hofrcut}{greekof,greek}{ut1c}{UT1}{hof}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\installfonts
+
+\installfamily{UT1}{hml}{}
+\installfont{hmlrut}{milan,greek}{ut1}{UT1}{hml}{m}{it}{}
+\installfont{hmlrut}{milan,greek}{ut1}{UT1}{hml}{m}{n}{}
+\installfont{hmlrcut}{milan,greek}{ut1c}{UT1}{hml}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\bye
+
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/owingreek.tex b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/owingreek.tex
new file mode 100644
index 0000000000..ba87412b00
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/owingreek.tex
@@ -0,0 +1,48 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This is an installation script for the original WinGreek
+% font designed by P. Gentry and A. Fountain.
+% The font itself is 8-bit, but we reencode
+% it to Unicode using virtual fonts in Omega's ovf format.
+
+% This file should be processed with lambda or plain Omega
+% (not (La)TeX).
+
+\input fntinst.sty
+
+% aliasing.tex provides some additional functionality and
+% is necessary for installing fonts with not AGL-compliant
+% glyph names
+
+\input aliasing
+
+% Although the font really has WinGreek encoding, it uses
+% the glyph naming scheme corresponding to microsoft-cp1252.
+% So we need a special alises table instead of standard
+% elalias.tex.
+
+\input wgalias
+
+\installfonts
+
+\installfamily{UT1}{wgr}{}
+\installfont{wgrrut}{greeregu,greek}{ut1}{UT1}{wgr}{m}{n}{}
+\installfont{wgrrut}{greeregu,greek}{ut1}{UT1}{wgr}{m}{it}{}
+\installfont{wgrrcut}{greeregu,greek}{ut1c}{UT1}{wgr}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\bye
+
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/wingreek.tex b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/wingreek.tex
new file mode 100644
index 0000000000..dc28d3f6b4
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/examples/greek/wingreek.tex
@@ -0,0 +1,45 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This is an installation script for the original WinGreek
+% font designed by P. Gentry and A. Fountain. The fonts uses
+% the WinGreek encoding, so we have to create a set of
+% virtual fonts reencoding it to LGR.
+
+\input fontinst.sty
+
+% aliasing.tex provides some additional functionality and
+% is necessary for installing fonts with not AGL-compliant
+% glyph names
+
+\input aliasing
+
+% Although the font really has WinGreek encoding, it uses
+% the glyph naming scheme corresponding to microsoft-cp1252.
+% So we need a special alises table instead of standard
+% elalias.tex.
+
+\input wgalias
+
+\installfonts
+
+\installfamily{LGR}{wgr}{}
+\installfont{wgrrgr}{greeregu,greek}{lgr}{LGR}{wgr}{m}{n}{}
+\installfont{wgrrgr}{greeregu,greek}{lgr}{LGR}{wgr}{m}{it}{}
+\installfont{wgrrcgr}{greeregu,greek}{lgrc}{LGR}{wgr}{m}{sc}{}
+\substitutesilent{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{l}{m}
+\substitutesilent{b}{m}
+\substitutesilent{bx}{m}
+
+\endinstallfonts
+
+\bye
+
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/base/aliasing.tex b/fonts/utilities/fontinst-contrib/grkfinst/inputs/base/aliasing.tex
new file mode 100644
index 0000000000..a4922f3206
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/base/aliasing.tex
@@ -0,0 +1,68 @@
+%% This file is part of the GRKFINST project version 0.3.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%%
+%% The file was initially based on the fnstcorr.tex file from the cyrfinst
+%% package by Vladimir Volovich, but later was modified to take advantage
+%% of the \aliased command, introduced in fontinst 1.915. I also have
+%% replaced all LaTeX macros with equivalent fontinst constructions,
+%% so that fontinst job files, which load this file, can be processed
+%% with plain TeX or plain Omega.
+%%
+%% Copyright (C) 2002--2005 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\needsfontinstversion{1.926}
+\fontinstcc
+
+\let\charnameprefix\empty
+\def\charnamealias#1{
+ \if_undefined{GN@\charnameprefix#1}\then
+ \if_undefined{GN@#1}\then
+ #1
+ \else
+ \csname GN@#1\endcsname
+ \fi% was just {#1}
+ \else
+ \csname GN@\charnameprefix#1\endcsname
+ \fi
+}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{\charnamealias{#1}}}
+ \edef\char_name{\charnamealias{#1}}
+}
+\list_def{N}(#1){\edef\char_name{\charnamealias{#1}}}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \afm_length\a_count{#3}
+ \ifnum \a_count>\minimum_kern
+ \out_line{\string\setkern{\charnamealias{#1}}{\charnamealias{#2}}{\the\a_count}}
+ \else\ifnum \a_count<-\minimum_kern
+ \out_line{\string\setkern{\charnamealias{#1}}{\charnamealias{#2}}{\the\a_count}}
+ \fi\fi
+ \fi\fi
+}
+\afm_let{KPX}{KP}
+
+\def\galias#1#2{
+ \def\temp@a{#1}%
+ \foreach(temp@b){#2}
+ \expandafter\let\csname GN@\str{temp@b}\endcsname\temp@a
+ \endfor(temp@b)
+}
+\def\aliasfonts#1#2#3{%
+ \def\charnameprefix{#1}%
+ \foreach(temp@font){#3}
+ \afmtomtx{#2\str{temp@font}}{#2\str{temp@font}}
+ \mtxtopl{#2\str{temp@font}}{#2\str{temp@font}}
+ \endfor(temp@font)
+ \let\charnameprefix\empty
+}
+
+\normalcc
+
+\endinput
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-lt.tex b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-lt.tex
new file mode 100644
index 0000000000..4bd5d15e34
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-lt.tex
@@ -0,0 +1,77 @@
+%% This file is part of the GRKFINST project version 0.3.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2005 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This files contains information about some glyph names, specific
+% for Greek fonts designed by Linotype
+
+\galias{katwtonos}{lowcomma}
+\galias{qoppa}{koppa}
+\galias{anoteleia}{periodcenteredgreek}
+\galias{tonos}{acutegreek}
+\galias{circumgreek}{tildegreek}
+\galias{leniscircum}{lenistilde}
+\galias{aspercircum}{aspertilde}
+\galias{dieresistonos}{dieresisacute}
+
+\galias{hyphen}{softhyphen}
+\galias{angleleft}{less}
+\galias{angleright}{greater}
+\galias{guillemotleftgreek}{guillemotleft}
+\galias{guillemotrightgreek}{guillemotright}
+
+\galias{Zeta}{Dzeta}
+\galias{zeta}{dzeta}
+\galias{Xi}{Ksi}
+\galias{xi}{ksi}
+\galias{Omicron}{Omikron}
+\galias{omicron}{omikron}
+\galias{Chi}{Khi}
+\galias{chi}{khi}
+\galias{sigma1}{sigmafinal}
+
+\galias{iotadieresistonos}{iotadieresisacute}
+\galias{upsilondieresistonos}{upsilondieresisacute}
+\galias{Alphatonos}{Alphaacute}
+\galias{Epsilontonos}{Epsilonacute}
+\galias{Etatonos}{Etaacute}
+\galias{Iotatonos}{Iotaacute}
+\galias{Omicrontonos}{Omikronacute}
+\galias{Upsilontonos}{Upsilonacute}
+\galias{Omegatonos}{Omegaacute}
+\galias{alphatonos}{alphaacute}
+\galias{epsilontonos}{epsilonacute}
+\galias{etatonos}{etaacute}
+\galias{iotatonos}{iotaacute}
+\galias{omicrontonos}{omikronacute}
+\galias{upsilontonos}{upsilonacute}
+\galias{omegatonos}{omegaacute}
+
+\galias{omicrongrave}{omikrongrave}
+\galias{omicronlenis}{omikronlenis}
+\galias{omicronasper}{omikronasper}
+\galias{omicronlenisacute}{omikronlenisacute}
+\galias{omicronlenisgrave}{omikronlenisgrave}
+\galias{omicronasperacute}{omikronasperacute}
+\galias{omicronaspergrave}{omikronaspergrave}
+
+\galias{alphacircum}{alphatilde}
+\galias{etacircum}{etatilde}
+\galias{iotacircum}{iotatilde}
+\galias{upsiloncircum}{upsilontilde}
+\galias{omegacircum}{omegatilde}
+\galias{alphaaspercircum}{alphaaspertilde}
+\galias{etaaspercircum}{etaaspertilde}
+\galias{iotaaspercircum}{iotaaspertilde}
+\galias{upsilonaspercircum}{upsilonaspertilde}
+\galias{omegaaspercircum}{omegaaspertilde}
+\galias{alphaleniscircum}{alphalenistilde}
+\galias{etaleniscircum}{etalenistilde}
+\galias{iotaleniscircum}{iotalenistilde}
+\galias{upsilonleniscircum}{upsilonlenistilde}
+\galias{omegaleniscircum}{omegalenistilde}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-uni.tex b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-uni.tex
new file mode 100644
index 0000000000..5818d9e049
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias-uni.tex
@@ -0,0 +1,291 @@
+%% This file is part of the GRKFINST project version 0.3.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% Unicode-based aliases for Greek glyph names
+
+\galias{anwtonos}{uni0374}
+\galias{katwtonos}{uni0375}
+\galias{iotasubscript}{uni037A}
+\galias{questiongreek}{uni037E}
+
+\galias{beta1}{uni03D0}
+\galias{theta1}{uni03D1}
+\galias{phi1}{uni03D5}
+\galias{pi1}{uni03D6}
+\galias{greekkai}{uni03D7}
+\galias{Qoppaarchaic}{uni03D8}
+\galias{qoppaarchaic}{uni03D9}
+\galias{Stigma}{uni03DA}
+\galias{stigma}{uni03DB}
+\galias{Digamma}{uni03DC}
+\galias{digamma}{uni03DD}
+\galias{Qoppa}{uni03DE}
+\galias{qoppa}{uni03DF}
+\galias{Sampi}{uni03E0}
+\galias{sampi}{uni03E1}
+\galias{kappa1}{uni03F0}
+\galias{rho1}{uni03F1}
+\galias{csigma}{uni03F2}
+\galias{yot}{uni03F3}
+\galias{Theta1}{uni03F4}
+\galias{epsilon1}{uni03F5}
+\galias{vardigamma}{uni03DB.alt}
+
+\galias{alphalenis}{uni1F00}
+\galias{alphaasper}{uni1F01}
+\galias{alphalenisgrave}{uni1F02}
+\galias{alphaaspergrave}{uni1F03}
+\galias{alphalenisacute}{uni1F04}
+\galias{alphaasperacute}{uni1F05}
+\galias{alphaleniscircum}{uni1F06}
+\galias{alphaaspercircum}{uni1F07}
+\galias{Alphalenis}{uni1F08}
+\galias{Alphaasper}{uni1F09}
+\galias{Alphalenisgrave}{uni1F0A}
+\galias{Alphaaspergrave}{uni1F0B}
+\galias{Alphalenisacute}{uni1F0C}
+\galias{Alphaasperacute}{uni1F0D}
+\galias{Alphaleniscircum}{uni1F0E}
+\galias{Alphaaspercircum}{uni1F0F}
+
+\galias{epsilonlenis}{uni1F10}
+\galias{epsilonasper}{uni1F11}
+\galias{epsilonlenisgrave}{uni1F12}
+\galias{epsilonaspergrave}{uni1F13}
+\galias{epsilonlenisacute}{uni1F14}
+\galias{epsilonasperacute}{uni1F15}
+\galias{Epsilonlenis}{uni1F18}
+\galias{Epsilonasper}{uni1F19}
+\galias{Epsilonlenisgrave}{uni1F1A}
+\galias{Epsilonaspergrave}{uni1F1B}
+\galias{Epsilonlenisacute}{uni1F1C}
+\galias{Epsilonasperacute}{uni1F1D}
+
+\galias{etalenis}{uni1F20}
+\galias{etaasper}{uni1F21}
+\galias{etalenisgrave}{uni1F22}
+\galias{etaaspergrave}{uni1F23}
+\galias{etalenisacute}{uni1F24}
+\galias{etaasperacute}{uni1F25}
+\galias{etaleniscircum}{uni1F26}
+\galias{etaaspercircum}{uni1F27}
+\galias{Etalenis}{uni1F28}
+\galias{Etaasper}{uni1F29}
+\galias{Etalenisgrave}{uni1F2A}
+\galias{Etaaspergrave}{uni1F2B}
+\galias{Etalenisacute}{uni1F2C}
+\galias{Etaasperacute}{uni1F2D}
+\galias{Etaleniscircum}{uni1F2E}
+\galias{Etaaspercircum}{uni1F2F}
+
+\galias{iotalenis}{uni1F30}
+\galias{iotaasper}{uni1F31}
+\galias{iotalenisgrave}{uni1F32}
+\galias{iotaaspergrave}{uni1F33}
+\galias{iotalenisacute}{uni1F34}
+\galias{iotaasperacute}{uni1F35}
+\galias{iotaleniscircum}{uni1F36}
+\galias{iotaaspercircum}{uni1F37}
+\galias{Iotalenis}{uni1F38}
+\galias{Iotaasper}{uni1F39}
+\galias{Iotalenisgrave}{uni1F3A}
+\galias{Iotaaspergrave}{uni1F3B}
+\galias{Iotalenisacute}{uni1F3C}
+\galias{Iotaasperacute}{uni1F3D}
+\galias{Iotaleniscircum}{uni1F3E}
+\galias{Iotaaspercircum}{uni1F3F}
+
+\galias{omicronlenis}{uni1F40}
+\galias{omicronasper}{uni1F41}
+\galias{omicronlenisgrave}{uni1F42}
+\galias{omicronaspergrave}{uni1F43}
+\galias{omicronlenisacute}{uni1F44}
+\galias{omicronasperacute}{uni1F45}
+\galias{Omicronlenis}{uni1F48}
+\galias{Omicronasper}{uni1F49}
+\galias{Omicronlenisgrave}{uni1F4A}
+\galias{Omicronaspergrave}{uni1F4B}
+\galias{Omicronlenisacute}{uni1F4C}
+\galias{Omicronasperacute}{uni1F4D}
+
+\galias{upsilonlenis}{uni1F50}
+\galias{upsilonasper}{uni1F51}
+\galias{upsilonlenisgrave}{uni1F52}
+\galias{upsilonaspergrave}{uni1F53}
+\galias{upsilonlenisacute}{uni1F54}
+\galias{upsilonasperacute}{uni1F55}
+\galias{upsilonleniscircum}{uni1F56}
+\galias{upsilonaspercircum}{uni1F57}
+\galias{Upsilonasper}{uni1F59}
+\galias{Upsilonaspergrave}{uni1F5B}
+\galias{Upsilonasperacute}{uni1F5D}
+\galias{Upsilonaspercircum}{uni1F5F}
+
+\galias{omegalenis}{uni1F60}
+\galias{omegaasper}{uni1F61}
+\galias{omegalenisgrave}{uni1F62}
+\galias{omegaaspergrave}{uni1F63}
+\galias{omegalenisacute}{uni1F64}
+\galias{omegaasperacute}{uni1F65}
+\galias{omegaleniscircum}{uni1F66}
+\galias{omegaaspercircum}{uni1F67}
+\galias{Omegalenis}{uni1F68}
+\galias{Omegaasper}{uni1F69}
+\galias{Omegalenisgrave}{uni1F6A}
+\galias{Omegaaspergrave}{uni1F6B}
+\galias{Omegalenisacute}{uni1F6C}
+\galias{Omegaasperacute}{uni1F6D}
+\galias{Omegaleniscircum}{uni1F6E}
+\galias{Omegaaspercircum}{uni1F6F}
+
+\galias{alphagrave}{uni1F70}
+\galias{alphaacute}{uni1F71}
+\galias{epsilongrave}{uni1F72}
+\galias{epsilonacute}{uni1F73}
+\galias{etagrave}{uni1F74}
+\galias{etaacute}{uni1F75}
+\galias{iotagrave}{uni1F76}
+\galias{iotaacute}{uni1F77}
+\galias{omicrongrave}{uni1F78}
+\galias{omicronacute}{uni1F79}
+\galias{upsilongrave}{uni1F7A}
+\galias{upsilonacute}{uni1F7B}
+\galias{omegagrave}{uni1F7C}
+\galias{omegaacute}{uni1F7D}
+
+\galias{alphaiotalenis}{uni1F80}
+\galias{alphaiotaasper}{uni1F81}
+\galias{alphaiotalenisgrave}{uni1F82}
+\galias{alphaiotaaspergrave}{uni1F83}
+\galias{alphaiotalenisacute}{uni1F84}
+\galias{alphaiotaasperacute}{uni1F85}
+\galias{alphaiotaleniscircum}{uni1F86}
+\galias{alphaiotaaspercircum}{uni1F87}
+\galias{Alphaiotalenis}{uni1F88}
+\galias{Alphaiotaasper}{uni1F89}
+\galias{Alphaiotalenisgrave}{uni1F8A}
+\galias{Alphaiotaaspergrave}{uni1F8B}
+\galias{Alphaiotalenisacute}{uni1F8C}
+\galias{Alphaiotaasperacute}{uni1F8D}
+\galias{Alphaiotaleniscircum}{uni1F8E}
+\galias{Alphaiotaaspercircum}{uni1F8F}
+
+\galias{etaiotalenis}{uni1F90}
+\galias{etaiotaasper}{uni1F91}
+\galias{etaiotalenisgrave}{uni1F92}
+\galias{etaiotaaspergrave}{uni1F93}
+\galias{etaiotalenisacute}{uni1F94}
+\galias{etaiotaasperacute}{uni1F95}
+\galias{etaiotaleniscircum}{uni1F96}
+\galias{etaiotaaspercircum}{uni1F97}
+\galias{Etaiotalenis}{uni1F98}
+\galias{Etaiotaasper}{uni1F99}
+\galias{Etaiotalenisgrave}{uni1F9A}
+\galias{Etaiotaaspergrave}{uni1F9B}
+\galias{Etaiotalenisacute}{uni1F9C}
+\galias{Etaiotaasperacute}{uni1F9D}
+\galias{Etaiotaleniscircum}{uni1F9E}
+\galias{Etaiotaaspercircum}{uni1F9F}
+
+\galias{omegaiotalenis}{uni1FA0}
+\galias{omegaiotaasper}{uni1FA1}
+\galias{omegaiotalenisgrave}{uni1FA2}
+\galias{omegaiotaaspergrave}{uni1FA3}
+\galias{omegaiotalenisacute}{uni1FA4}
+\galias{omegaiotaasperacute}{uni1FA5}
+\galias{omegaiotaleniscircum}{uni1FA6}
+\galias{omegaiotaaspercircum}{uni1FA7}
+\galias{Omegaiotalenis}{uni1FA8}
+\galias{Omegaiotaasper}{uni1FA9}
+\galias{Omegaiotalenisgrave}{uni1FAA}
+\galias{Omegaiotaaspergrave}{uni1FAB}
+\galias{Omegaiotalenisacute}{uni1FAC}
+\galias{Omegaiotaasperacute}{uni1FAD}
+\galias{Omegaiotaleniscircum}{uni1FAE}
+\galias{Omegaiotaaspercircum}{uni1FAF}
+
+\galias{alphabreve}{uni1FB0}
+\galias{alphamacron}{uni1FB1}
+\galias{alphaiotagrave}{uni1FB2}
+\galias{alphaiota}{uni1FB3}
+\galias{alphaiotaacute}{uni1FB4}
+\galias{alphacircum}{uni1FB6}
+\galias{alphaiotacircum}{uni1FB7}
+\galias{Alphabreve}{uni1FB8}
+\galias{Alphamacron}{uni1FB9}
+\galias{Alphagrave}{uni1FBA}
+\galias{Alphaacute}{uni1FBB}
+\galias{Alphaiota}{uni1FBC}
+\galias{iotaadscript}{uni1FBE}
+\galias{lenis}{uni1FBF}
+
+\galias{circumgreek}{uni1FC0}
+\galias{dieresiscircum}{uni1FC1}
+\galias{etaiotagrave}{uni1FC2}
+\galias{etaiota}{uni1FC3}
+\galias{etaiotaacute}{uni1FC4}
+\galias{etacircum}{uni1FC6}
+\galias{etaiotacircum}{uni1FC7}
+\galias{Epsilongrave}{uni1FC8}
+\galias{Epsilonacute}{uni1FC9}
+\galias{Etagrave}{uni1FCA}
+\galias{Etaacute}{uni1FCB}
+\galias{Etaiota}{uni1FCC}
+\galias{lenisgrave}{uni1FCD}
+\galias{lenisacute}{uni1FCE}
+\galias{leniscircum}{uni1FCF}
+
+\galias{iotabreve}{uni1FD0}
+\galias{iotamacron}{uni1FD1}
+\galias{iotadieresisgrave}{uni1FD2}
+\galias{iotadieresisacute}{uni1FD3}
+\galias{iotacircum}{uni1FD6}
+\galias{iotadieresiscircum}{uni1FD7}
+\galias{Iotabreve}{uni1FD8}
+\galias{Iotamacron}{uni1FD9}
+\galias{Iotagrave}{uni1FDA}
+\galias{Iotaacute}{uni1FDB}
+\galias{aspergrave}{uni1FDD}
+\galias{asperacute}{uni1FDE}
+\galias{aspercircum}{uni1FDF}
+
+\galias{upsilonbreve}{uni1FE0}
+\galias{upsilonmacron}{uni1FE1}
+\galias{upsilondieresisgrave}{uni1FE2}
+\galias{upsilondieresisacute}{uni1FE3}
+\galias{rholenis}{uni1FE4}
+\galias{rhoasper}{uni1FE5}
+\galias{upsiloncircum}{uni1FE6}
+\galias{upsilondieresiscircum}{uni1FE7}
+\galias{Upsilonbreve}{uni1FE8}
+\galias{Upsilonmacron}{uni1FE9}
+\galias{Upsilongrave}{uni1FEA}
+\galias{Upsilonacute}{uni1FEB}
+\galias{Rhoasper}{uni1FEC}
+\galias{dieresisgravegreek}{uni1FED}
+\galias{dieresisacutegreek}{uni1FEE}
+\galias{gravegreek}{uni1FEF}
+
+\galias{omegaiotagrave}{uni1FF2}
+\galias{omegaiota}{uni1FF3}
+\galias{omegaiotaacute}{uni1FF4}
+\galias{omegacircum}{uni1FF6}
+\galias{omegaiotacircum}{uni1FF7}
+\galias{Omicrongrave}{uni1FF8}
+\galias{Omicronacute}{uni1FF9}
+\galias{Omegagrave}{uni1FFA}
+\galias{Omegaacute}{uni1FFB}
+\galias{Omegaiota}{uni1FFC}
+\galias{acutegreek}{uni1FFD}
+\galias{asper}{uni1FFE}
+
+\galias{pentedeka}{u10144}
+\galias{pentehekaton}{u10145}
+\galias{penteqilioi}{u10146}
+\galias{pentemurioi}{u10147}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias.tex b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias.tex
new file mode 100644
index 0000000000..3198e57377
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/elalias.tex
@@ -0,0 +1,73 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% aliases for type1 Greek fonts
+\galias{anwtonos}{Acute}
+\galias{katwtonos}{primebase,AcuteInferior}
+\galias{qoppaarchaic}{koppa,nd}
+\galias{qoppa}{koppa1,nd1,numkoppa}
+\galias{anoteleia}{periodcenteredgreek,periodcentered}
+\galias{tonos}{acutegreek,acute}
+\galias{gravegreek}{grave}
+\galias{circumgreek}{tilda}
+\galias{leniscircum}{lenistilde}
+\galias{aspercircum}{aspertilde}
+\galias{dieresisgreek}{diaeresis}
+\galias{dieresistonos}{dieresisacute,diaeresisacute}
+\galias{dieresisgravegreek}{dieresisgrave,diaeresisgrave}
+\galias{dieresiscircum}{diaeresistilde}
+\galias{hyphen}{hyphenminus}
+\galias{angleleft}{cornerleft,less}
+\galias{angleright}{cornerright,greater}
+\galias{reference}{segno}
+\galias{guillemotleftgreek}{guillemotleft}
+\galias{guillemotrightgreek}{guillemotright}
+\galias{sigma1}{finalsigma}
+\galias{Beta}{Betta}
+\galias{iotasubscript}{iotasubscipt}
+\galias{Iotadieresis}{Iotatremo}
+\galias{iotadieresis}{iotadiaeresis}
+\galias{iotadieresistonos}{iotadieresisacute,iotadiaeresisacute}
+\galias{iotadieresisgrave}{iotadiaeresisgrave}
+\galias{Upsilondieresis}{Upsilontremo}
+\galias{upsilondieresis}{upsilondiaeresis}
+\galias{upsilondieresistonos}{upsilondieresisacute,upsilondiaeresisacute}
+\galias{upsilondieresisgrave}{upsilondiaeresisgrave}
+\galias{alphatonos}{alphaacute}
+\galias{epsilontonos}{epsilonacute}
+\galias{etatonos}{etaacute}
+\galias{iotatonos}{iotaacute}
+\galias{omicrontonos}{omicronacute}
+\galias{upsilontonos}{upsilonacute}
+\galias{omegatonos}{omegaacute}
+\galias{alphacircum}{alphatilde}
+\galias{etacircum}{etatilde}
+\galias{iotacircum}{iotatilde}
+\galias{upsiloncircum}{upsilontilde}
+\galias{omegacircum}{omegatilde}
+\galias{alphaiotacircum}{alphaiotatilde}
+\galias{etaiotacircum}{etaiotatilde}
+\galias{omegaiotacircum}{omegatildeflex}
+\galias{alphaaspercircum}{alphaaspertilde}
+\galias{etaaspercircum}{etaaspertilde}
+\galias{iotaaspercircum}{iotaaspertilde}
+\galias{upsilonaspercircum}{upsilonaspertilde}
+\galias{omegaaspercircum}{omegaaspertilde}
+\galias{alphaiotaaspercircum}{alphaiotaaspertilde}
+\galias{etaiotaaspercircum}{etaiotaaspertilde}
+\galias{omegaiotaaspercircum}{omegaiotaaspertilde}
+\galias{alphaleniscircum}{alphalenistilde}
+\galias{etaleniscircum}{etalenistilde}
+\galias{iotaleniscircum}{iotalenistilde}
+\galias{upsilonleniscircum}{upsilonlenistilde}
+\galias{omegaleniscircum}{omegalenistilde}
+\galias{alphaiotaleniscircum}{alphaiotalenistilde}
+\galias{etaiotaleniscircum}{etaiotalenistilde}
+\galias{omegaiotaleniscircum}{omegaiotalenistilde}
+\galias{omicronlenis}{omicronlinis}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/wgalias.tex b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/wgalias.tex
new file mode 100644
index 0000000000..fadda6dc88
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekalias/wgalias.tex
@@ -0,0 +1,207 @@
+%% This file is part of the GRKFINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% aliases for type1 greek fonts with standard WinGreek encoding
+
+% \galias{katwtonos}{ydieresis}
+\galias{reference}{plus}
+\galias{qoppaarchaic}{percent}
+\galias{qoppa}{ampersand}
+\galias{digamma}{numbersign}
+\galias{stigma}{dollar}
+\galias{sampi}{quotedbl}
+\galias{anoteleia}{colon}
+\galias{tonos}{slash}
+\galias{gravegreek}{backslash}
+\galias{circumgreek}{asciicircum}
+\galias{lenis}{quotesingle}
+\galias{asper}{grave}
+\galias{lenisacute}{quotedblright}
+\galias{lenisgrave}{endash}
+\galias{asperacute}{quotedblleft}
+\galias{aspergrave}{bullet}
+\galias{leniscircum}{quoteright}
+\galias{aspercircum}{quoteleft}
+\galias{dieresisgreek}{at}
+\galias{dieresistonos}{emdash}
+\galias{dieresisgravegreek}{nbspace}
+% \galias{dieresisgrave}{thorn}
+% \galias{guillemotleftgreek}{c128}
+% \galias{guillemotrightgreek}{c129}
+% \galias{exclam}{quotesinglbase}
+\galias{swarow}{exclam}
+\galias{angleleft}{less}
+\galias{angleright}{greater}
+\galias{Alpha}{A}
+\galias{Beta}{B}
+\galias{Gamma}{G}
+\galias{Delta}{D}
+\galias{Epsilon}{E}
+\galias{Zeta}{Z}
+\galias{Eta}{H}
+\galias{Theta}{Q}
+\galias{Iota}{I}
+\galias{Kappa}{K}
+\galias{Lambda}{L}
+\galias{Mu}{M}
+\galias{Nu}{N}
+\galias{Xi}{X}
+\galias{Omicron}{O}
+\galias{Pi}{P}
+\galias{Rho}{R}
+\galias{Sigma}{S}
+\galias{Tau}{T}
+\galias{Upsilon}{U}
+\galias{Phi}{F}
+\galias{Chi}{C}
+\galias{Psi}{Y}
+\galias{Omega}{W}
+\galias{alpha}{a}
+\galias{beta}{b}
+\galias{gamma}{g}
+\galias{delta}{d}
+\galias{epsilon}{e}
+\galias{zeta}{z}
+\galias{eta}{h}
+\galias{theta}{q}
+\galias{iota}{i}
+\galias{kappa}{k}
+\galias{lambda}{l}
+\galias{mu}{m}
+\galias{nu}{n}
+\galias{xi}{x}
+\galias{omicron}{o}
+\galias{pi}{p}
+\galias{rho}{r}
+\galias{sigma}{s}
+\galias{sigma1}{j}
+\galias{tau}{t}
+\galias{upsilon}{u}
+\galias{phi}{f}
+\galias{chi}{c}
+\galias{psi}{y}
+\galias{omega}{w}
+\galias{iotasubscript}{Adieresis}
+\galias{alphaiota}{v}
+\galias{etaiota}{V}
+\galias{omegaiota}{J}
+\galias{iotadieresis}{c142}
+\galias{iotadieresistonos}{c143}
+\galias{iotadieresisgrave}{c144}
+\galias{upsilondieresis}{atilde}
+\galias{upsilondieresistonos}{adieresis}
+\galias{upsilondieresisgrave}{aring}
+\galias{alphalenis}{cent}
+\galias{epsilonlenis}{trademark}
+\galias{etalenis}{ordmasculine}
+\galias{iotalenis}{quotedblbase}
+\galias{omicronlenis}{Ntilde}
+\galias{upsilonlenis}{Ugrave}
+\galias{omegalenis}{ccedilla}
+\galias{alphaasper}{exclamdown}
+\galias{epsilonasper}{tilde}
+\galias{etaasper}{onesuperior}
+\galias{iotaasper}{florin}
+\galias{omicronasper}{Eth}
+\galias{upsilonasper}{Oslash}
+\galias{omegaasper}{ae}
+\galias{alphatonos}{sterling}
+\galias{epsilontonos}{scaron}
+\galias{etatonos}{guillemotright}
+\galias{iotatonos}{ellipsis}
+\galias{omicrontonos}{Ograve}
+\galias{upsilontonos}{Uacute}
+\galias{omegatonos}{egrave}
+\galias{alphagrave}{brokenbar}
+\galias{epsilongrave}{c157}
+\galias{etagrave}{threequarters}
+\galias{iotagrave}{circumflex}
+\galias{omicrongrave}{Otilde}
+\galias{upsilongrave}{Yacute}
+\galias{omegagrave}{edieresis}
+\galias{alphacircum}{copyright}
+\galias{etacircum}{Aacute}
+\galias{iotacircum}{guilsinglleft}
+\galias{upsiloncircum}{agrave}
+\galias{omegacircum}{icircumflex}
+\galias{alphalenisacute}{yen}
+\galias{epsilonlenisacute}{oe}
+\galias{etalenisacute}{onehalf}
+\galias{iotalenisacute}{daggerdbl}
+\galias{omicronlenisacute}{Ocircumflex}
+\galias{upsilonlenisacute}{Udieresis}
+\galias{omegalenisacute}{ecircumflex}
+\galias{alphalenisgrave}{dieresis}
+\galias{epsilonlenisgrave}{Ydieresis}
+\galias{etalenisgrave}{Agrave}
+\galias{iotalenisgrave}{Scaron}
+\galias{omicronlenisgrave}{multiply}
+\galias{upsilonlenisgrave}{germandbls}
+\galias{omegalenisgrave}{iacute}
+\galias{alphaleniscircum}{guillemotleft}
+\galias{etaleniscircum}{Atilde}
+\galias{iotaleniscircum}{c141}
+\galias{upsilonleniscircum}{acircumflex}
+\galias{omegaleniscircum}{eth}
+\galias{alphaasperacute}{currency}
+\galias{epsilonasperacute}{guilsinglright}
+\galias{etaasperacute}{onequarter}
+\galias{iotaasperacute}{dagger}
+\galias{omicronasperacute}{Oacute}
+\galias{upsilonasperacute}{Ucircumflex}
+\galias{omegaasperacute}{eacute}
+\galias{alphaaspergrave}{section}
+\galias{epsilonaspergrave}{c158}
+\galias{etaaspergrave}{questiondown}
+\galias{iotaaspergrave}{perthousand}
+\galias{omicronaspergrave}{Odieresis}
+\galias{upsilonaspergrave}{Thorn}
+\galias{omegaaspergrave}{igrave}
+\galias{alphaaspercircum}{ordfeminine}
+\galias{etaaspercircum}{Acircumflex}
+\galias{iotaaspercircum}{OE}
+\galias{upsilonaspercircum}{aacute}
+\galias{omegaaspercircum}{idieresis}
+\galias{alphaiotalenis}{minus}
+\galias{etaiotalenis}{AE}
+\galias{omegaiotalenis}{ograve}
+\galias{alphaiotaasper}{logicalnot}
+\galias{etaiotaasper}{Aring}
+\galias{omegaiotaasper}{ntilde}
+\galias{alphaiotaacute}{registered}
+\galias{etaiotaacute}{Ccedilla}
+\galias{omegaiotaacute}{oacute}
+\galias{alphaiotagrave}{plusminus}
+\galias{etaiotagrave}{Ecircumflex}
+\galias{omegaiotagrave}{odieresis}
+\galias{alphaiotacircum}{acute}
+\galias{etaiotacircum}{Iacute}
+\galias{omegaiotacircum}{ugrave}
+\galias{alphaiotalenisacute}{degree}
+\galias{etaiotalenisacute}{Eacute}
+\galias{omegaiotalenisacute}{otilde}
+\galias{alphaiotalenisgrave}{threesuperior}
+\galias{etaiotalenisgrave}{Igrave}
+\galias{omegaiotalenisgrave}{oslash}
+\galias{alphaiotaleniscircum}{paragraph}
+\galias{etaiotaleniscircum}{Idieresis}
+\galias{omegaiotaleniscircum}{ucircumflex}
+\galias{alphaiotaasperacute}{macron}
+\galias{etaiotaasperacute}{Egrave}
+\galias{omegaiotaasperacute}{ocircumflex}
+\galias{alphaiotaaspergrave}{twosuperior}
+\galias{etaiotaaspergrave}{Edieresis}
+\galias{omegaiotaaspergrave}{divide}
+\galias{alphaiotaaspercircum}{mu,mu1}
+\galias{etaiotaaspercircum}{Icircumflex}
+\galias{omegaiotaaspercircum}{uacute}
+\galias{rholenis}{cedilla}
+\galias{rhoasper}{periodcentered}
+
+
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/greek-ltr.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/greek-ltr.etx
new file mode 100644
index 0000000000..705c719e67
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/greek-ltr.etx
@@ -0,0 +1,926 @@
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes a raw font encoding used for installing Greek
+fonts designed by Linotype. It almost exactly reproduces the original
+encoding vector of these fonts, but maps all extra characters to arbitrary
+slots in the 0x01--0x19 area, thus making them accessible to fontinst.
+
+\encoding
+
+\needsfontinstversion{1.914}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK RAW FONT ENCODING - 8R-GRK}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#2}
+\setcommand\lowsubscript#1#2{#2}
+\setcommand\capcomb#1#2{#2}
+
+\setint{italicslant}{0}
+
+\ifisglyph{kappa}\then
+ \setint{xheight}{\height{kappa}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{hyphen}\then
+ \setint{interword}{\width{hyphen}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisglyph{Chi}\then
+ \setint{capheight}{\height{Chi}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{delta}\then
+ \setint{ascender}{\height{delta}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{acccapheight}{\height{Iotadieresis}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{chi}\then
+ \setint{descender}{\depth{chi}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{maxheight}{\height{Iotadieresis}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{chi}\then
+ \setint{maxdepth}{\depth{chi}}
+ \else
+ \setint{maxdepth}{250}
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+
+\begincomment\section{Default font dimensions}\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\Else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\Fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \ifisint{typewriter}\then
+ \setint{fontdimen(7)}{0} % extra space after .
+ \Else
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+ \Fi
+\Else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\Fi
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\nextslot{1}
+
+\setslot{\lc{Beta}{betatwo}}
+\endsetslot
+
+\setslot{\lc{Theta}{thetatwo}}
+\endsetslot
+
+\setslot{\lc{Phi}{phitwo}}
+\endsetslot
+
+\setslot{dieresisgravegreek}
+\endsetslot
+
+\setslot{katwtonos}
+\endsetslot
+
+\nextslot{"10}
+
+\setslot{apple}
+\endsetslot
+
+\setslot{devicecontroltwo}
+\endsetslot
+
+\setslot{devicecontrolthree}
+\endsetslot
+
+\nextslot{"20}
+
+\setslot{space}
+ \comment{The space character.}
+\endsetslot
+
+\setslot{exclam}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\setslot{quotedbl}
+ \comment{The `neutral' double quote mark `\,\textquotedbl\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quote mark `\,\textquotesingle\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The period `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon `;'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The less-than sign `\textless'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The greater-than sign `\textgreater'.}
+\endsetslot
+
+\setslot{question}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphacircum}}
+\endsetslot
+
+\setslot{iotasubscripta}
+\endsetslot
+
+\setslot{iotasubscripte}
+\endsetslot
+
+\setslot{iotasubscripto}
+\endsetslot
+
+\setslot{asperacute}
+\endsetslot
+
+\setslot{aspergrave}
+\endsetslot
+
+\setslot{aspercircum}
+\endsetslot
+
+\setslot{lenisacute}
+\endsetslot
+
+\setslot{lenisgrave}
+\endsetslot
+
+\setslot{leniscircum}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphagrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilongrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etagrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotagrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrongrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilongrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasperacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasperacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasperacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspergrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspergrave}}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\setslot{lenis}
+\endsetslot
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{asper}
+\endsetslot
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{gravegreek}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronaspergrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisgrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisgrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisgrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspercircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaleniscircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaleniscircum}}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\textbraceleft'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\textbraceright'.}
+\endsetslot
+
+\setslot{circumgreek}
+\endsetslot
+
+\nextslot{"80}
+
+\setslot{\lc{UPSILON}{upsilonleniscircum}}
+\endsetslot
+
+\setslot{onesuperior}
+ \comment{The raised digit `\textonesuperior'.}
+\endsetslot
+
+\setslot{quotesinglbase}
+ \comment{A German single quote mark `\quotesinglbase' similar to a
+ comma, but with different sidebearings.}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaleniscircum}}
+\endsetslot
+
+\setslot{quotedblbase}
+ \comment{A German double quote mark `\quotedblbase' similar to two
+ commas, but with tighter letterspacing and different sidebearings.}
+\endsetslot
+
+\setslot{ellipsis}
+ \comment{The ellipsis `\textellipsis'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The single dagger `\textdagger'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger `\textdaggerdbl'.}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasper}}
+\endsetslot
+
+\setslot{\lc{ETA}{etacircum}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasper}}
+\endsetslot
+
+\setslot{guilsinglleft}
+ \comment{A French single opening quote mark `\guilsinglleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasper}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasper}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasper}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasper}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasper}}
+\endsetslot
+
+\setslot{quoteleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+\endsetslot
+
+\setslot{quoteright}
+ \comment{The English closing single quote mark `\,\textquoteright\,'.}
+\endsetslot
+
+\setslot{quotedblleft}
+ \comment{The English opening double quote mark `\,\textquotedblleft\,'.}
+\endsetslot
+
+\setslot{quotedblright}
+ \comment{The English closing double quote mark `\,\textquotedblright\,'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The centered bullet `\textbullet'.}
+\endsetslot
+
+\setslot{rangedash}
+ \comment{The en-dash `\textendash'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The em-dash `\textemdash'.}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenis}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenis}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenis}}
+\endsetslot
+
+\setslot{guilsinglright}
+ \comment{A French single closing quote mark `\guilsinglright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenis}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenis}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenis}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenis}}
+\endsetslot
+
+\setslot{nonbreakingspace}
+\endsetslot
+
+\setslot{dieresistonos}
+\endsetslot
+
+\setslot{\uc{Alphatonos}{alphatonos}}
+\endsetslot
+
+\setslot{\lc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{\uc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{\lc{Qoppa}{qoppa}}
+\endsetslot
+
+\setslot{\lc{Iotacircum}{iotacircum}}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `\textsection'.}
+\endsetslot
+
+\setslot{dieresisgreek}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisgrave}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{guillemotleft}
+ \comment{A French double opening quote mark `\guillemotleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{softhyphen}
+ \comment{This is the \texttt {alternate-hyphen} (n\'ee `\softhyphen')
+ slot.}
+\endsetslot
+
+\setslot{\lc{Digamma}{digamma}}
+\endsetslot
+
+\setslot{\lc{Upsiloncircum}{upsiloncircum}}
+\endsetslot
+
+\setslot{degree}
+ \comment{The degree sign `\textdegree'.}
+\endsetslot
+
+\setslot{\lc{Rho}{rholenis}}
+\endsetslot
+
+\setslot{twosuperior}
+ \comment{The raised digit `\texttwosuperior'.}
+\endsetslot
+
+\setslot{threesuperior}
+ \comment{The raised digit `\textthreesuperior'.}
+\endsetslot
+
+\setslot{tonos}
+\endsetslot
+
+\setslot{\lc{Omegacircum}{omegacircum}}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph mark `\textparagraph'.}
+\endsetslot
+
+\setslot{anoteleia}
+\endsetslot
+
+\setslot{\uc{Epsilontonos}{epsilontonos}}
+\endsetslot
+
+\setslot{\uc{Etatonos}{Etatonos}}
+\endsetslot
+
+\setslot{\uc{Iotatonos}{iotatonos}}
+\endsetslot
+
+\setslot{guillemotright}
+ \comment{A French double closing quote mark `\guillemotright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uc{Omicrontonos}{omicrontonos}}
+\endsetslot
+
+\setslot{\lc{Rho}{rhoasper}}
+\endsetslot
+
+\setslot{\uc{Upsilontonos}{upsilontonos}}
+\endsetslot
+
+\setslot{\uc{Omegatonos}{omegatonos}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresistonos}}
+\endsetslot
+
+\setslot{\uc{Alpha}{alpha}}
+\endsetslot
+
+\setslot{\uc{Beta}{beta}}
+\endsetslot
+
+\setslot{\uc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\uc{Delta}{delta}}
+\endsetslot
+
+\setslot{\uc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\uc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{\uc{Eta}{eta}}
+\endsetslot
+
+\setslot{\uc{Theta}{theta}}
+\endsetslot
+
+\setslot{\uc{Iota}{iota}}
+\endsetslot
+
+\setslot{\uc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\uc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\uc{Mu}{mu}}
+\endsetslot
+
+\setslot{\uc{Nu}{nu}}
+\endsetslot
+
+\setslot{\uc{Xi}{xi}}
+\endsetslot
+
+\setslot{\uc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\uc{Pi}{pi}}
+\endsetslot
+
+\setslot{\uc{Rho}{rho}}
+\endsetslot
+
+\setslot{quoteright}
+\endsetslot
+
+\setslot{\uc{Sigma}{sigma}}
+\endsetslot
+
+\setslot{\uc{Tau}{tau}}
+\endsetslot
+
+\setslot{\uc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{\uc{Phi}{phi}}
+\endsetslot
+
+\setslot{\uc{Chi}{chi}}
+\endsetslot
+
+\setslot{\uc{Psi}{psi}}
+\endsetslot
+
+\setslot{\uc{Omega}{omega}}
+\endsetslot
+
+\setslot{\uc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\uc{Upsilondieresis}{Upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphatonos}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilontonos}}
+\endsetslot
+
+\setslot{\lc{ETA}{etatonos}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotatonos}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{\lc{Alpha}{alpha}}
+\endsetslot
+
+\setslot{\lc{Beta}{beta}}
+\endsetslot
+
+\setslot{\lc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\lc{Delta}{delta}}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\lc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{\lc{Eta}{eta}}
+\endsetslot
+
+\setslot{\lc{Theta}{theta}}
+\endsetslot
+
+\setslot{\lc{Iota}{iota}}
+\endsetslot
+
+\setslot{\lc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\lc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\lc{Mu}{mu}}
+\endsetslot
+
+\setslot{\lc{Nu}{nu}}
+\endsetslot
+
+\setslot{\lc{Xi}{xi}}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\lc{Pi}{pi}}
+\endsetslot
+
+\setslot{\lc{Rho}{rho}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma1}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma}}
+\endsetslot
+
+\setslot{\lc{Tau}{tau}}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{\lc{Phi}{phi}}
+\endsetslot
+
+\setslot{\lc{Chi}{chi}}
+\endsetslot
+
+\setslot{\lc{Psi}{psi}}
+\endsetslot
+
+\setslot{\lc{Omega}{omega}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrontonos}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilontonos}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegatonos}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspergrave}}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-lig.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-lig.etx
new file mode 100644
index 0000000000..93070dd8e3
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-lig.etx
@@ -0,0 +1,1587 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\begin{document}
+
+\encoding
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#2}
+\setcommand\lowsubscript#1#2{#2}
+\setcommand\capcomb#1#2{#2}
+
+\setint{italicslant}{0}
+
+\ifisglyph{kappa}\then
+ \setint{xheight}{\height{kappa}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{iota}\then
+ \setint{interword}{\width{iota}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisglyph{Chi}\then
+ \setint{capheight}{\height{Chi}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{delta}\then
+ \setint{ascender}{\height{delta}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{acccapheight}{\height{Iotadieresis}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{chi}\then
+ \setint{descender}{\depth{chi}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{maxheight}{\height{Iotadieresis}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{chi}\then
+ \setint{maxdepth}{\depth{chi}}
+ \else
+ \setint{maxdepth}{250}
+
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+
+\begincomment\section{Default font dimensions}\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\Else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\Fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \ifisint{typewriter}\then
+ \setint{fontdimen(7)}{0} % extra space after .
+ \Else
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+ \Fi
+\Else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\Fi
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+\endsetslot
+
+\nextslot{2}
+
+\setslot{pentedeka}
+\endsetslot
+
+\setslot{pentehekaton}
+\endsetslot
+
+\setslot{penteqilioi}
+\endsetslot
+
+\setslot{pentemurioi}
+\endsetslot
+
+\setslot{\lc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{vardigamma}
+\endsetslot
+
+\setslot{\uc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{\capsubscript{ALPHAIOTA}{Alphaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\capsubscript{ETAIOTA}{Etaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\capsubscript{OMEGAIOTA}{Omegaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\nextslot{16}
+
+\setslot{quotedblleftgreek}
+\endsetslot
+
+\setslot{quotedblrightgreek}
+\endsetslot
+
+\setslot{qoppa}
+\endsetslot
+
+\setslot{\lc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\nextslot{21}
+
+\setslot{\uc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\setslot{\uc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{\uc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{euro}
+\endsetslot
+
+\setslot{perthousand}
+\endsetslot
+
+\nextslot{27}
+
+\setslot{\lc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{quoteleft}
+\endsetslot
+
+\setslot{quoteright}
+\endsetslot
+
+\setslot{brevegreek}
+\endsetslot
+
+\setslot{macrongreek}
+\endsetslot
+
+\setslot{dieresiscircum}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresiscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresiscircum}}
+\endsetslot
+
+\setslot{exclam}
+\endsetslot
+
+\setslot{dieresisgreek}
+ \ligature{LIG}{tonos}{dieresistonos}
+ \ligature{LIG}{gravegreek}{dieresisgravegreek}
+ \ligature{LIG}{circumgreek}{dieresiscircum}
+ \ligature{LIG}{asciitilde}{dieresiscircum}
+ \ligature{LIG}{\uc{Iota}{iota}}{\uc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\uc{Upsilon}{upsilon}}{\uc{Upsilondieresis}{upsilondieresis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{dieresistonos}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresistonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{dieresisgravegreek}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{percent}
+\endsetslot
+
+\nextslot{39}
+
+\setslot{tonos}
+ \ligature{LIG}{tonos}{quoteright}
+ \ligature{LIG}{lenis}{lenisacute}
+ \ligature{LIG}{asper}{asperacute}
+ \ligature{LIG}{dieresisgreek}{dieresistonos}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphatonos}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilontonos}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etatonos}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotatonos}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrontonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilontonos}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegatonos}}
+\endsetslot
+
+\setslot{parenleft}
+ \ligature{LIG}{parenleft}{guillemotleftgreek}
+\endsetslot
+
+\setslot{parenright}
+ \ligature{LIG}{parenright}{guillemotrightgreek}
+\endsetslot
+
+\setslot{asterisk}
+\endsetslot
+
+\setslot{plus}
+\endsetslot
+
+\setslot{comma}
+\endsetslot
+
+\setslot{hyphen}
+ \ligature{LIG}{hyphen}{rangedash}
+\endsetslot
+
+\setslot{period}
+\endsetslot
+
+\setslot{slash}
+\endsetslot
+
+\setslot{\digit{zero}}
+\endsetslot
+
+\setslot{\digit{one}}
+\endsetslot
+
+\setslot{\digit{two}}
+\endsetslot
+
+\setslot{\digit{three}}
+\endsetslot
+
+\setslot{\digit{four}}
+\endsetslot
+
+\setslot{\digit{five}}
+\endsetslot
+
+\setslot{\digit{six}}
+\endsetslot
+
+\setslot{\digit{seven}}
+\endsetslot
+
+\setslot{\digit{eight}}
+\endsetslot
+
+\setslot{\digit{nine}}
+\endsetslot
+
+\setslot{colon}
+\endsetslot
+
+\setslot{anoteleia}
+\endsetslot
+
+\setslot{asper}
+ \ligature{LIG}{asper}{quotedblleftgreek}
+ \ligature{LIG}{tonos}{asperacute}
+ \ligature{LIG}{gravegreek}{aspergrave}
+ \ligature{LIG}{circumgreek}{aspercircum}
+ \ligature{LIG}{asciitilde}{aspercircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rhoasper}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasper}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasper}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasper}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasper}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasper}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasper}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasper}}
+\endsetslot
+
+\setslot{circumgreek}
+ \ligature{LIG}{lenis}{leniscircum}
+ \ligature{LIG}{asper}{aspercircum}
+ \ligature{LIG}{dieresisgreek}{dieresiscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotacircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsiloncircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegacircum}}
+\endsetslot
+
+\setslot{lenis}
+ \ligature{LIG}{lenis}{quotedblrightgreek}
+ \ligature{LIG}{tonos}{lenisacute}
+ \ligature{LIG}{gravegreek}{lenisgrave}
+ \ligature{LIG}{circumgreek}{leniscircum}
+ \ligature{LIG}{asciitilde}{leniscircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rholenis}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenis}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenis}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenis}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenis}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenis}}
+\endsetslot
+
+\setslot{questiongreek}
+\endsetslot
+
+\setslot{aspercircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaaspercircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaaspercircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaaspercircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonaspercircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaaspercircum}}
+\endsetslot
+
+\setslot{\uc{Alpha}{alpha}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ALPHAIOTA}{Alphaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Beta}{beta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{aspergrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonaspergrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaaspergrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaaspergrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronaspergrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonaspergrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaaspergrave}}
+\endsetslot
+
+\setslot{\uc{Delta}{delta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Epsilon}{epsilon}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Phi}{phi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Gamma}{gamma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Eta}{eta}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ETAIOTA}{Etaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Iota}{iota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Theta}{theta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Kappa}{kappa}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Lambda}{lambda}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Mu}{mu}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Nu}{nu}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Omicron}{omicron}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Pi}{pi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Chi}{chi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Rho}{rho}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Sigma}{sigma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Tau}{tau}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Upsilon}{upsilon}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{asperacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasperacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasperacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasperacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasperacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasperacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasperacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasperacute}}
+\endsetslot
+
+\setslot{\uc{Omega}{omega}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{OMEGAIOTA}{Omegaiota}}
+\endsetslot
+
+\setslot{\uc{Xi}{xi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Psi}{psi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Zeta}{zeta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{bracketleft}
+\endsetslot
+
+\setslot{leniscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaleniscircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaleniscircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaleniscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonleniscircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaleniscircum}}
+\endsetslot
+
+\setslot{bracketright}
+\endsetslot
+
+\setslot{lenisacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisacute}}
+\endsetslot
+
+\setslot{lenisgrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisgrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisgrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisgrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisgrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisgrave}}
+\endsetslot
+
+\setslot{gravegreek}
+ \ligature{LIG}{gravegreek}{quoteleft}
+ \ligature{LIG}{lenis}{lenisgrave}
+ \ligature{LIG}{asper}{aspergrave}
+ \ligature{LIG}{dieresisgreek}{dieresisgravegreek}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphagrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilongrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etagrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotagrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrongrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilongrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegagrave}}
+\endsetslot
+
+\setslot{\lc{Alpha}{alpha}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ALPHAIOTA}{alphaiota}}
+\endsetslot
+
+\setslot{\lc{Beta}{beta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma1}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Delta}{delta}}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Phi}{phi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Gamma}{gamma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Eta}{eta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ETAIOTA}{etaiota}}
+\endsetslot
+
+\setslot{\lc{Iota}{iota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Theta}{theta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Kappa}{kappa}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Lambda}{lambda}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Mu}{mu}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Nu}{nu}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicron}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Pi}{pi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Chi}{chi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Rho}{rho}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Tau}{tau}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilon}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{compwordmark}
+\endsetslot
+
+\setslot{\lc{Omega}{omega}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{OMEGAIOTA}{omegaiota}}
+\endsetslot
+
+\setslot{\lc{Xi}{xi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Psi}{psi}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Zeta}{zeta}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{guillemotleftgreek}
+\endsetslot
+
+\setslot{\lc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{guillemotrightgreek}
+\endsetslot
+
+\setslot{asciitilde}
+ \ligature{LIG}{lenis}{leniscircum}
+ \ligature{LIG}{asper}{aspercircum}
+ \ligature{LIG}{dieresisgreek}{dieresiscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotacircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsiloncircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegacircum}}
+\endsetslot
+
+\setslot{punctdash}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenis}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphatonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{Digamma}{digamma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Csigma}{csigma}}
+\endsetslot
+
+\setslot{\lc{ETA}{etagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenis}}
+\endsetslot
+
+\setslot{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenis}}
+\endsetslot
+
+\setslot{\lc{Phi}{phi1}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETA}{etatonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETA}{etacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotagrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasper}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenis}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegatonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotacircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaleniscircum}}
+\endsetslot
+
+\setslot{\uc{Digamma}{digamma}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Csigma}{csigma}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotagrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilongrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotatonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilontonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotacircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Iotadieresis}{iotadieresis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsiloncircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspercircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonleniscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\uc{Upsilondieresis}{Upsilondieresis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilongrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrongrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronaspergrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilontonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrontonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasperacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisacute}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresistonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresiscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisgrave}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresistonos}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresiscircum}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lowsubscript{ALPHAIOTA}{alphaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lowsubscript{ETAIOTA}{etaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lowsubscript{OMEGAIOTA}{omegaiota}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{RHO}{rhoasper}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{RHO}{rholenis}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Beta}{beta}}{\lc{Beta}{beta1}}
+ \ligature{/LIG}{\lc{Theta}{theta}}{\lc{Theta}{theta1}}
+ \ligature{/LIG}{\lc{Phi}{phi}}{\lc{Phi}{phi1}}
+\endsetslot
+
+\setslot{anwtonos}
+\endsetslot
+
+\setslot{katwtonos}
+\endsetslot
+
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-ligc.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-ligc.etx
new file mode 100644
index 0000000000..a323be62b8
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-ligc.etx
@@ -0,0 +1,67 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+% lgrc.etx -- install a LGR-encoded faked small-caps font
+%
+% This is used exclusively to install faked small-caps fonts;
+% real small caps fonts are installed using the default lgr.etx.
+
+\encoding
+
+% We define the parameters for lgr.etx to produce a c&sc font.
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#1}
+\setcommand\lowsubscript#1#2{#1small}
+\setcommand\greekaccent#1#2{#1}
+\setcommand\capcomb#1#2{#1}
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{50}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call lgr-lig.etx.
+
+\inputetx{lgr-lig}
+
+\endencoding
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-orig.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-orig.etx
new file mode 100644
index 0000000000..31227cdc92
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-orig.etx
@@ -0,0 +1,1050 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\begin{document}
+
+\encoding
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#1}
+\setcommand\lowsubscript#1#2{#2}
+\setcommand\capcomb#1#2{#2}
+
+\setint{italicslant}{0}
+
+\ifisglyph{kappa}\then
+ \setint{xheight}{\height{kappa}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{iota}\then
+ \setint{interword}{\width{iota}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisglyph{Chi}\then
+ \setint{capheight}{\height{Chi}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{delta}\then
+ \setint{ascender}{\height{delta}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{acccapheight}{\height{Iotadieresis}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{chi}\then
+ \setint{descender}{\depth{chi}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{maxheight}{\height{Iotadieresis}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{chi}\then
+ \setint{maxdepth}{\depth{chi}}
+ \else
+ \setint{maxdepth}{250}
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+
+\begincomment\section{Default font dimensions}\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\Else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\Fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \ifisint{typewriter}\then
+ \setint{fontdimen(7)}{0} % extra space after .
+ \Else
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+ \Fi
+\Else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\Fi
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+\endsetslot
+
+\nextslot{2}
+
+\setslot{pentedeka}
+\endsetslot
+
+\setslot{pentehekaton}
+\endsetslot
+
+\setslot{penteqilioi}
+\endsetslot
+
+\setslot{pentemurioi}
+\endsetslot
+
+\setslot{\lc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{vardigamma}
+\endsetslot
+
+\setslot{\uc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{\capsubscript{ALPHAIOTA}{Alphaiota}}
+\endsetslot
+
+\setslot{\capsubscript{ETAIOTA}{Etaiota}}
+\endsetslot
+
+\setslot{\capsubscript{OMEGAIOTA}{Omegaiota}}
+\endsetslot
+
+\nextslot{18}
+
+\setslot{qoppa}
+\endsetslot
+
+\setslot{\lc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\nextslot{21}
+
+\setslot{\uc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\setslot{\uc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{\uc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{euro}
+\endsetslot
+
+\setslot{perthousand}
+\endsetslot
+
+\nextslot{27}
+
+\setslot{\lc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{quoteleft}
+\endsetslot
+
+\setslot{quoteright}
+\endsetslot
+
+\setslot{brevegreek}
+\endsetslot
+
+\setslot{macrongreek}
+\endsetslot
+
+\setslot{dieresiscircum}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresiscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresiscircum}}
+\endsetslot
+
+\setslot{exclam}
+\endsetslot
+
+\setslot{dieresisgreek}
+ \ligature{LIG}{tonos}{dieresistonos}
+ \ligature{LIG}{gravegreek}{dieresisgravegreek}
+ \ligature{LIG}{circumgreek}{dieresiscircum}
+ \ligature{LIG}{\uc{Iota}{iota}}{\uc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\uc{Upsilon}{upsilon}}{\uc{Upsilondieresis}{upsilondieresis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{dieresistonos}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresistonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{dieresisgravegreek}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{percent}
+\endsetslot
+
+\nextslot{39}
+
+\setslot{tonos}
+ \ligature{LIG}{tonos}{quoteright}
+ \ligature{LIG}{lenis}{lenisacute}
+ \ligature{LIG}{asper}{asperacute}
+ \ligature{LIG}{dieresisgreek}{dieresistonos}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphatonos}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilontonos}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etatonos}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotatonos}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrontonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilontonos}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegatonos}}
+\endsetslot
+
+\setslot{parenleft}
+ \ligature{LIG}{parenleft}{guillemotleftgreek}
+\endsetslot
+
+\setslot{parenright}
+ \ligature{LIG}{parenright}{guillemotrightgreek}
+\endsetslot
+
+\setslot{asterisk}
+\endsetslot
+
+\setslot{plus}
+\endsetslot
+
+\setslot{comma}
+\endsetslot
+
+\setslot{hyphen}
+ \ligature{LIG}{hyphen}{rangedash}
+\endsetslot
+
+\setslot{period}
+\endsetslot
+
+\setslot{slash}
+\endsetslot
+
+\setslot{\digit{zero}}
+\endsetslot
+
+\setslot{\digit{one}}
+\endsetslot
+
+\setslot{\digit{two}}
+\endsetslot
+
+\setslot{\digit{three}}
+\endsetslot
+
+\setslot{\digit{four}}
+\endsetslot
+
+\setslot{\digit{five}}
+\endsetslot
+
+\setslot{\digit{six}}
+\endsetslot
+
+\setslot{\digit{seven}}
+\endsetslot
+
+\setslot{\digit{eight}}
+\endsetslot
+
+\setslot{\digit{nine}}
+\endsetslot
+
+\setslot{colon}
+\endsetslot
+
+\setslot{anoteleia}
+\endsetslot
+
+\setslot{asper}
+ \ligature{LIG}{tonos}{asperacute}
+ \ligature{LIG}{gravegreek}{aspergrave}
+ \ligature{LIG}{circumgreek}{aspercircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rhoasper}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasper}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasper}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasper}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasper}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasper}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasper}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasper}}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{lenis}
+ \ligature{LIG}{tonos}{lenisacute}
+ \ligature{LIG}{gravegreek}{lenisgrave}
+ \ligature{LIG}{circumgreek}{leniscircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rholenis}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenis}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenis}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenis}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenis}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenis}}
+\endsetslot
+
+\setslot{questiongreek}
+\endsetslot
+
+\setslot{aspercircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaaspercircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaaspercircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaaspercircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonaspercircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaaspercircum}}
+\endsetslot
+
+\setslot{\uc{Alpha}{alpha}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ALPHAIOTA}{Alphaiota}}
+\endsetslot
+
+\setslot{\uc{Beta}{beta}}
+\endsetslot
+
+\setslot{aspergrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonaspergrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaaspergrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaaspergrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronaspergrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonaspergrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaaspergrave}}
+\endsetslot
+
+\setslot{\uc{Delta}{delta}}
+\endsetslot
+
+\setslot{\uc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\uc{Phi}{phi}}
+\endsetslot
+
+\setslot{\uc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\uc{Eta}{eta}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ETAIOTA}{Etaiota}}
+\endsetslot
+
+\setslot{\uc{Iota}{iota}}
+\endsetslot
+
+\setslot{\uc{Theta}{theta}}
+\endsetslot
+
+\setslot{\uc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\uc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\uc{Mu}{mu}}
+\endsetslot
+
+\setslot{\uc{Nu}{nu}}
+\endsetslot
+
+\setslot{\uc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\uc{Pi}{pi}}
+\endsetslot
+
+\setslot{\uc{Chi}{chi}}
+\endsetslot
+
+\setslot{\uc{Rho}{rho}}
+\endsetslot
+
+\setslot{\uc{Sigma}{sigma}}
+\endsetslot
+
+\setslot{\uc{Tau}{tau}}
+\endsetslot
+
+\setslot{\uc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{asperacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasperacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasperacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasperacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasperacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasperacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasperacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasperacute}}
+\endsetslot
+
+\setslot{\uc{Omega}{omega}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{OMEGAIOTA}{Omegaiota}}
+\endsetslot
+
+\setslot{\uc{Xi}{xi}}
+\endsetslot
+
+\setslot{\uc{Psi}{psi}}
+\endsetslot
+
+\setslot{\uc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{bracketleft}
+\endsetslot
+
+\setslot{leniscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaleniscircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaleniscircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaleniscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonleniscircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaleniscircum}}
+\endsetslot
+
+\setslot{bracketright}
+\endsetslot
+
+\setslot{lenisacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisacute}}
+\endsetslot
+
+\setslot{lenisgrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisgrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisgrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisgrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisgrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisgrave}}
+\endsetslot
+
+\setslot{gravegreek}
+ \ligature{LIG}{gravegreek}{quoteleft}
+ \ligature{LIG}{lenis}{lenisgrave}
+ \ligature{LIG}{asper}{aspergrave}
+ \ligature{LIG}{dieresisgreek}{dieresisgravegreek}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphagrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilongrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etagrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotagrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrongrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilongrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegagrave}}
+\endsetslot
+
+\setslot{\lc{Alpha}{alpha}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ALPHAIOTA}{alphaiota}}
+\endsetslot
+
+\setslot{\lc{Beta}{beta}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma1}}
+\endsetslot
+
+\setslot{\lc{Delta}{delta}}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\lc{Phi}{phi}}
+\endsetslot
+
+\setslot{\lc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\lc{Eta}{eta}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ETAIOTA}{etaiota}}
+\endsetslot
+
+\setslot{\lc{Iota}{iota}}
+\endsetslot
+
+\setslot{\lc{Theta}{theta}}
+\endsetslot
+
+\setslot{\lc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\lc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\lc{Mu}{mu}}
+\endsetslot
+
+\setslot{\lc{Nu}{nu}}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\lc{Pi}{pi}}
+\endsetslot
+
+\setslot{\lc{Chi}{chi}}
+\endsetslot
+
+\setslot{\lc{Rho}{rho}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma}}
+ \ligature{LIG/}{boundarychar}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{period}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{comma}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{anoteleia}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{colon}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{questiongreek}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{exclam}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{parenright}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{slash}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{bracketright}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{asterisk}{\lc{Sigma}{sigma1}}
+ \ligature{LIG/}{quoteright}{\lc{Sigma}{sigma1}}
+\endsetslot
+
+\setslot{\lc{Tau}{tau}}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{compwordmark}
+\endsetslot
+
+\setslot{\lc{Omega}{omega}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{OMEGAIOTA}{omegaiota}}
+\endsetslot
+
+\setslot{\lc{Xi}{xi}}
+\endsetslot
+
+\setslot{\lc{Psi}{psi}}
+\endsetslot
+
+\setslot{\lc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{guillemotleftgreek}
+\endsetslot
+
+\setslot{\lc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{guillemotrightgreek}
+\endsetslot
+
+\setslot{circumgreek}
+ \ligature{LIG}{lenis}{leniscircum}
+ \ligature{LIG}{asper}{aspercircum}
+ \ligature{LIG}{dieresisgreek}{dieresiscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotacircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsiloncircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegacircum}}
+\endsetslot
+
+\setslot{punctdash}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenis}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenis}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{Digamma}{digamma}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaleniscircum}}
+\endsetslot
+
+\nextslot{152}
+
+\setslot{\lc{ETA}{etagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenis}}
+\endsetslot
+
+\nextslot{156}
+
+\setslot{\lc{ETAIOTA}{etaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenis}}
+\endsetslot
+
+\nextslot{160}
+
+\setslot{\lc{ETA}{etatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotagrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasper}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenis}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotagrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasper}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenis}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotacircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaleniscircum}}
+\endsetslot
+
+\setslot{\uc{Digamma}{digamma}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotacircum}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaleniscircum}}
+\endsetslot
+
+\nextslot{200}
+
+\setslot{\lc{IOTA}{iotagrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasper}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenis}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilongrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasper}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenis}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotatonos}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasperacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilontonos}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotacircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaleniscircum}}
+\endsetslot
+
+\setslot{\uc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsiloncircum}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspercircum}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonleniscircum}}
+\endsetslot
+
+\setslot{\uc{Upsilondieresis}{Upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilongrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasper}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenis}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrongrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasper}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenis}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronaspergrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilontonos}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrontonos}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasperacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisgrave}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisgrave}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresistonos}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresiscircum}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresiscircum}}
+\endsetslot
+
+\setslot{\lowsubscript{ALPHAIOTA}{alphaiota}}
+\endsetslot
+
+\setslot{\lowsubscript{ETAIOTA}{etaiota}}
+\endsetslot
+
+\setslot{\lowsubscript{OMEGAIOTA}{omegaiota}}
+\endsetslot
+
+\setslot{\lc{RHO}{rhoasper}}
+\endsetslot
+
+\setslot{\lc{RHO}{rholenis}}
+\endsetslot
+
+\setrightboundary{boundarychar}
+
+\setslot{anwtonos}
+\endsetslot
+
+\setslot{katwtonos}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-origc.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-origc.etx
new file mode 100644
index 0000000000..3fde8a02e9
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr-origc.etx
@@ -0,0 +1,67 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+% lgrc.etx -- install a LGR-encoded faked small-caps font
+%
+% This is used exclusively to install faked small-caps fonts;
+% real small caps fonts are installed using the default lgr.etx.
+
+\encoding
+
+% We define the parameters for lgr.etx to produce a c&sc font.
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#1}
+\setcommand\lowsubscript#1#2{#1small}
+\setcommand\greekaccent#1#2{#1}
+\setcommand\capcomb#1#2{#1}
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{50}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call lgr-orig.etx.
+
+\inputetx{lgr-orig}
+
+\endencoding
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr.etx
new file mode 100644
index 0000000000..b8a570a09e
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgr.etx
@@ -0,0 +1,1049 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\begin{document}
+
+\encoding
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#2}
+\setcommand\lowsubscript#1#2{#2}
+\setcommand\capcomb#1#2{#2}
+
+\setint{italicslant}{0}
+
+\ifisglyph{kappa}\then
+ \setint{xheight}{\height{kappa}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{iota}\then
+ \setint{interword}{\width{iota}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisglyph{Chi}\then
+ \setint{capheight}{\height{Chi}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{delta}\then
+ \setint{ascender}{\height{delta}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{acccapheight}{\height{Iotadieresis}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{chi}\then
+ \setint{descender}{\depth{chi}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Iotadieresis}\then
+ \setint{maxheight}{\height{Iotadieresis}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{chi}\then
+ \setint{maxdepth}{\depth{chi}}
+ \else
+ \setint{maxdepth}{250}
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+
+\begincomment\section{Default font dimensions}\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\Else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\Fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \ifisint{typewriter}\then
+ \setint{fontdimen(7)}{0} % extra space after .
+ \Else
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+ \Fi
+\Else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\Fi
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+\endsetslot
+
+\nextslot{2}
+
+\setslot{pentedeka}
+\endsetslot
+
+\setslot{pentehekaton}
+\endsetslot
+
+\setslot{penteqilioi}
+\endsetslot
+
+\setslot{pentemurioi}
+\endsetslot
+
+\setslot{\lc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{vardigamma}
+\endsetslot
+
+\setslot{\uc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{\capsubscript{ALPHAIOTA}{Alphaiota}}
+\endsetslot
+
+\setslot{\capsubscript{ETAIOTA}{Etaiota}}
+\endsetslot
+
+\setslot{\capsubscript{OMEGAIOTA}{Omegaiota}}
+\endsetslot
+
+\nextslot{18}
+
+\setslot{qoppa}
+\endsetslot
+
+\setslot{\lc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\nextslot{21}
+
+\setslot{\uc{Qoppaarchaic}{qoppaarchaic}}
+\endsetslot
+
+\setslot{\uc{Stigma}{stigma}}
+\endsetslot
+
+\setslot{\uc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{euro}
+\endsetslot
+
+\setslot{perthousand}
+\endsetslot
+
+\nextslot{27}
+
+\setslot{\lc{Sampi}{sampi}}
+\endsetslot
+
+\setslot{quoteleft}
+\endsetslot
+
+\setslot{quoteright}
+\endsetslot
+
+\setslot{brevegreek}
+\endsetslot
+
+\setslot{macrongreek}
+\endsetslot
+
+\setslot{dieresiscircum}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresiscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresiscircum}}
+\endsetslot
+
+\setslot{exclam}
+\endsetslot
+
+\setslot{dieresisgreek}
+ \ligature{LIG}{tonos}{dieresistonos}
+ \ligature{LIG}{gravegreek}{dieresisgravegreek}
+ \ligature{LIG}{circumgreek}{dieresiscircum}
+ \ligature{LIG}{asciitilde}{dieresiscircum}
+ \ligature{LIG}{\uc{Iota}{iota}}{\uc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\uc{Upsilon}{upsilon}}{\uc{Upsilondieresis}{upsilondieresis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iotadieresis}{iotadieresis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{dieresistonos}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresistonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{dieresisgravegreek}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotadieresisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{percent}
+\endsetslot
+
+\nextslot{39}
+
+\setslot{tonos}
+ \ligature{LIG}{tonos}{quoteright}
+ \ligature{LIG}{lenis}{lenisacute}
+ \ligature{LIG}{asper}{asperacute}
+ \ligature{LIG}{dieresisgreek}{dieresistonos}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphatonos}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilontonos}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etatonos}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotatonos}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrontonos}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilontonos}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegatonos}}
+\endsetslot
+
+\setslot{parenleft}
+ \ligature{LIG}{parenleft}{guillemotleftgreek}
+\endsetslot
+
+\setslot{parenright}
+ \ligature{LIG}{parenright}{guillemotrightgreek}
+\endsetslot
+
+\setslot{asterisk}
+\endsetslot
+
+\setslot{plus}
+\endsetslot
+
+\setslot{comma}
+\endsetslot
+
+\setslot{hyphen}
+ \ligature{LIG}{hyphen}{rangedash}
+\endsetslot
+
+\setslot{period}
+\endsetslot
+
+\setslot{slash}
+\endsetslot
+
+\setslot{\digit{zero}}
+\endsetslot
+
+\setslot{\digit{one}}
+\endsetslot
+
+\setslot{\digit{two}}
+\endsetslot
+
+\setslot{\digit{three}}
+\endsetslot
+
+\setslot{\digit{four}}
+\endsetslot
+
+\setslot{\digit{five}}
+\endsetslot
+
+\setslot{\digit{six}}
+\endsetslot
+
+\setslot{\digit{seven}}
+\endsetslot
+
+\setslot{\digit{eight}}
+\endsetslot
+
+\setslot{\digit{nine}}
+\endsetslot
+
+\setslot{colon}
+\endsetslot
+
+\setslot{anoteleia}
+\endsetslot
+
+\setslot{asper}
+ \ligature{LIG}{tonos}{asperacute}
+ \ligature{LIG}{gravegreek}{aspergrave}
+ \ligature{LIG}{circumgreek}{aspercircum}
+ \ligature{LIG}{asciitilde}{aspercircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rhoasper}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasper}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasper}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasper}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasper}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasper}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasper}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasper}}
+\endsetslot
+
+\setslot{circumgreek}
+ \ligature{LIG}{lenis}{leniscircum}
+ \ligature{LIG}{asper}{aspercircum}
+ \ligature{LIG}{dieresisgreek}{dieresiscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotacircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsiloncircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegacircum}}
+\endsetslot
+
+\setslot{lenis}
+ \ligature{LIG}{tonos}{lenisacute}
+ \ligature{LIG}{gravegreek}{lenisgrave}
+ \ligature{LIG}{circumgreek}{leniscircum}
+ \ligature{LIG}{asciitilde}{leniscircum}
+ \ligature{LIG}{\lc{Rho}{rho}}{\lc{RHO}{rholenis}}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenis}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenis}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenis}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenis}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenis}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenis}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenis}}
+\endsetslot
+
+\setslot{questiongreek}
+\endsetslot
+
+\setslot{aspercircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaaspercircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaaspercircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaaspercircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonaspercircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaaspercircum}}
+\endsetslot
+
+\setslot{\uc{Alpha}{alpha}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ALPHAIOTA}{Alphaiota}}
+\endsetslot
+
+\setslot{\uc{Beta}{beta}}
+\endsetslot
+
+\setslot{aspergrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonaspergrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaaspergrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaaspergrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronaspergrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonaspergrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaaspergrave}}
+\endsetslot
+
+\setslot{\uc{Delta}{delta}}
+\endsetslot
+
+\setslot{\uc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\uc{Phi}{phi}}
+\endsetslot
+
+\setslot{\uc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\uc{Eta}{eta}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{ETAIOTA}{Etaiota}}
+\endsetslot
+
+\setslot{\uc{Iota}{iota}}
+\endsetslot
+
+\setslot{\uc{Theta}{theta}}
+\endsetslot
+
+\setslot{\uc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\uc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\uc{Mu}{mu}}
+\endsetslot
+
+\setslot{\uc{Nu}{nu}}
+\endsetslot
+
+\setslot{\uc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\uc{Pi}{pi}}
+\endsetslot
+
+\setslot{\uc{Chi}{chi}}
+\endsetslot
+
+\setslot{\uc{Rho}{rho}}
+\endsetslot
+
+\setslot{\uc{Sigma}{sigma}}
+\endsetslot
+
+\setslot{\uc{Tau}{tau}}
+\endsetslot
+
+\setslot{\uc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{asperacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphaasperacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonasperacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etaasperacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotaasperacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronasperacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonasperacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegaasperacute}}
+\endsetslot
+
+\setslot{\uc{Omega}{omega}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\capsubscript{OMEGAIOTA}{Omegaiota}}
+\endsetslot
+
+\setslot{\uc{Xi}{xi}}
+\endsetslot
+
+\setslot{\uc{Psi}{psi}}
+\endsetslot
+
+\setslot{\uc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{bracketleft}
+\endsetslot
+
+\setslot{leniscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{Alpha}{alphaleniscircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{Eta}{etaleniscircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{Iota}{iotaleniscircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{Upsilon}{upsilonleniscircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{Omega}{omegaleniscircum}}
+\endsetslot
+
+\setslot{bracketright}
+\endsetslot
+
+\setslot{lenisacute}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisacute}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisacute}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisacute}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisacute}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisacute}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisacute}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisacute}}
+\endsetslot
+
+\setslot{lenisgrave}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilonlenisgrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etalenisgrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotalenisgrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicronlenisgrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilonlenisgrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegalenisgrave}}
+\endsetslot
+
+\setslot{gravegreek}
+ \ligature{LIG}{gravegreek}{quoteleft}
+ \ligature{LIG}{lenis}{lenisgrave}
+ \ligature{LIG}{asper}{aspergrave}
+ \ligature{LIG}{dieresisgreek}{dieresisgravegreek}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphagrave}}
+ \ligature{LIG}{\lc{Epsilon}{epsilon}}{\lc{EPSILON}{epsilongrave}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etagrave}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotagrave}}
+ \ligature{LIG}{\lc{Omicron}{omicron}}{\lc{OMICRON}{omicrongrave}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsilongrave}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegagrave}}
+\endsetslot
+
+\setslot{\lc{Alpha}{alpha}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ALPHAIOTA}{alphaiota}}
+\endsetslot
+
+\setslot{\lc{Beta}{beta}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma1}}
+\endsetslot
+
+\setslot{\lc{Delta}{delta}}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon}}
+\endsetslot
+
+\setslot{\lc{Phi}{phi}}
+\endsetslot
+
+\setslot{\lc{Gamma}{gamma}}
+\endsetslot
+
+\setslot{\lc{Eta}{eta}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{ETAIOTA}{etaiota}}
+\endsetslot
+
+\setslot{\lc{Iota}{iota}}
+\endsetslot
+
+\setslot{\lc{Theta}{theta}}
+\endsetslot
+
+\setslot{\lc{Kappa}{kappa}}
+\endsetslot
+
+\setslot{\lc{Lambda}{lambda}}
+\endsetslot
+
+\setslot{\lc{Mu}{mu}}
+\endsetslot
+
+\setslot{\lc{Nu}{nu}}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicron}}
+\endsetslot
+
+\setslot{\lc{Pi}{pi}}
+\endsetslot
+
+\setslot{\lc{Chi}{chi}}
+\endsetslot
+
+\setslot{\lc{Rho}{rho}}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma}}
+\endsetslot
+
+\setslot{\lc{Tau}{tau}}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilon}}
+\endsetslot
+
+\setslot{compwordmark}
+\endsetslot
+
+\setslot{\lc{Omega}{omega}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lowsubscript{OMEGAIOTA}{omegaiota}}
+\endsetslot
+
+\setslot{\lc{Xi}{xi}}
+\endsetslot
+
+\setslot{\lc{Psi}{psi}}
+\endsetslot
+
+\setslot{\lc{Zeta}{zeta}}
+\endsetslot
+
+\setslot{guillemotleftgreek}
+\endsetslot
+
+\setslot{\lc{iotaadscript}{iotasubscript}}
+\endsetslot
+
+\setslot{guillemotrightgreek}
+\endsetslot
+
+\setslot{asciitilde}
+ \ligature{LIG}{lenis}{leniscircum}
+ \ligature{LIG}{asper}{aspercircum}
+ \ligature{LIG}{dieresisgreek}{dieresiscircum}
+ \ligature{LIG}{\lc{Alpha}{alpha}}{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{Eta}{eta}}{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{Iota}{iota}}{\lc{IOTA}{iotacircum}}
+ \ligature{LIG}{\lc{Upsilon}{upsilon}}{\lc{UPSILON}{upsiloncircum}}
+ \ligature{LIG}{\lc{Omega}{omega}}{\lc{OMEGA}{omegacircum}}
+\endsetslot
+
+\setslot{punctdash}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenis}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenis}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHA}{alphaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ALPHA}{alphaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{Digamma}{digamma}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ALPHAIOTA}{alphaiotaleniscircum}}
+\endsetslot
+
+\nextslot{152}
+
+\setslot{\lc{ETA}{etagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenis}}
+\endsetslot
+
+\nextslot{156}
+
+\setslot{\lc{ETAIOTA}{etaiotagrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasper}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenis}}
+\endsetslot
+
+\nextslot{160}
+
+\setslot{\lc{ETA}{etatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{ETA}{etacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETA}{etalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{ETA}{etaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotacircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotaleniscircum}}
+\endsetslot
+
+\setslot{\lc{ETAIOTA}{etaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegagrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotagrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasper}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasper}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenis}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenis}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspergrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotagrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasper}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenis}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegatonos}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaasperacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisacute}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegalenisgrave}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaasperacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisacute}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegacircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotacircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaaspercircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGA}{omegaleniscircum}}
+ \ligature{LIG}{\lc{iotaadscript}{iotasubscript}}{\lc{OMEGA}{omegaiotaleniscircum}}
+\endsetslot
+
+\setslot{\uc{Digamma}{digamma}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotacircum}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{OMEGAIOTA}{omegaiotaleniscircum}}
+\endsetslot
+
+\nextslot{200}
+
+\setslot{\lc{IOTA}{iotagrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasper}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenis}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspergrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilongrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasper}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenis}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotatonos}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaasperacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisacute}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotalenisgrave}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilontonos}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotacircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaaspercircum}}
+\endsetslot
+
+\setslot{\lc{IOTA}{iotaleniscircum}}
+\endsetslot
+
+\setslot{\uc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsiloncircum}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonaspercircum}}
+\endsetslot
+
+\setslot{\lc{UPSILON}{upsilonleniscircum}}
+\endsetslot
+
+\setslot{\uc{Upsilondieresis}{Upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilongrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasper}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenis}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonaspergrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrongrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasper}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenis}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronaspergrave}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilontonos}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonasperacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisacute}}
+\endsetslot
+
+\setslot{\lc{EPSILON}{epsilonlenisgrave}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicrontonos}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronasperacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisacute}}
+\endsetslot
+
+\setslot{\lc{OMICRON}{omicronlenisgrave}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresis}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisgrave}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresistonos}}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresiscircum}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresis}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisgrave}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresistonos}}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresiscircum}}
+\endsetslot
+
+\setslot{\lowsubscript{ALPHAIOTA}{alphaiota}}
+\endsetslot
+
+\setslot{\lowsubscript{ETAIOTA}{etaiota}}
+\endsetslot
+
+\setslot{\lowsubscript{OMEGAIOTA}{omegaiota}}
+\endsetslot
+
+\setslot{\lc{RHO}{rhoasper}}
+\endsetslot
+
+\setslot{\lc{RHO}{rholenis}}
+\endsetslot
+
+\nextslot{254}
+
+\setslot{anwtonos}
+\endsetslot
+
+\setslot{katwtonos}
+\endsetslot
+
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgrc.etx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgrc.etx
new file mode 100644
index 0000000000..b954dac16d
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greeketx/lgrc.etx
@@ -0,0 +1,67 @@
+%% This file is part of the GRKFINST project version 0.3.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+% lgrc.etx -- install a LGR-encoded faked small-caps font
+%
+% This is used exclusively to install faked small-caps fonts;
+% real small caps fonts are installed using the default lgr.etx.
+
+\encoding
+
+% We define the parameters for lgr.etx to produce a c&sc font.
+
+\needsfontinstversion{1.926}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{GREEK FONT ENCODING - LGR}
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1}
+
+% added for typesetting Greek
+\setcommand\capsubscript#1#2{#1}
+\setcommand\lowsubscript#1#2{#1small}
+\setcommand\greekaccent#1#2{#1}
+\setcommand\capcomb#1#2{#1}
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{50}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call lgr.etx.
+
+\inputetx{lgr}
+
+\endencoding
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek-lt.mtx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek-lt.mtx
new file mode 100644
index 0000000000..1c11f78996
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek-lt.mtx
@@ -0,0 +1,305 @@
+%% This file is part of the OFNTINST project version 0.3.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{noautokern.mtx} metrics file}
+\author{Alexej Kryukov}
+\date{26 April 2004}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{greek-lt.mtx} metrics file,
+used to make some substitutions necessary while installing Greek
+fonts designed by Linotype.
+
+\metrics
+
+\ifisglyph{betatwo}\then
+ \setglyph{beta1}
+ \glyph{beta}{1000}
+ \endsetglyph
+ \setleftrightkerning{beta1}{beta}{1000}
+
+ \resetglyph{beta}
+ \glyph{betatwo}{1000}
+ \endresetglyph
+ \setleftrightkerning{beta}{betatwo}{1000}
+\fi
+
+\ifisglyph{phitwo}\then
+ \setglyph{phi1}
+ \glyph{phi}{1000}
+ \endsetglyph
+ \setleftrightkerning{phi1}{phi}{1000}
+
+ \resetglyph{phi}
+ \glyph{phitwo}{1000}
+ \endresetglyph
+ \setleftrightkerning{phi}{phitwo}{1000}
+\fi
+
+\ifisglyph{thetatwo}\then
+ \setglyph{theta1}
+ \glyph{thetatwo}{1000}
+ \endsetglyph
+ \setleftrightkerning{theta1}{theta}{1000}
+\fi
+
+\ifisglyph{iotasubscripta}\then
+ \setglyph{alphaiota}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alpha}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiota}{alpha}{1000}
+
+ \setglyph{alphaiotaacute}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphatonos}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaacute}{alphatonos}{1000}
+
+ \setglyph{alphaiotagrave}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphagrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotagrave}{alphaiota}{1000}
+
+ \setglyph{alphaiotacircum}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphacircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotacircum}{alphacircum}{1000}
+
+ \setglyph{alphaiotalenis}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphalenis}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotalenis}{alphalenis}{1000}
+
+ \setglyph{alphaiotaasper}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphaasper}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaasper}{alphaasper}{1000}
+
+ \setglyph{alphaiotaasperacute}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphaasperacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaasperacute}{alphaasperacute}{1000}
+
+ \setglyph{alphaiotaaspergrave}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphaaspergrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaaspergrave}{alphaaspergrave}{1000}
+
+ \setglyph{alphaiotaaspercircum}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphaaspercircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaaspercircum}{alphaaspercircum}{1000}
+
+ \setglyph{alphaiotalenisacute}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphalenisacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotalenisacute}{alphalenisacute}{1000}
+
+ \setglyph{alphaiotalenisgrave}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphalenisgrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotalenis}{alphalenisgrave}{1000}
+
+ \setglyph{alphaiotaleniscircum}
+ \glyph{iotasubscripta}{1000}
+ \glyph{alphaleniscircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{alphaiotaleniscircum}{alphaleniscircum}{1000}
+\fi
+
+\ifisglyph{iotasubscripte}\then
+ \setglyph{etaiota}
+ \glyph{iotasubscripte}{1000}
+ \glyph{eta}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiota}{eta}{1000}
+
+ \setglyph{etaiotaacute}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etatonos}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaacute}{etatonos}{1000}
+
+ \setglyph{etaiotagrave}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etagrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotagrave}{etaiota}{1000}
+
+ \setglyph{etaiotacircum}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etacircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotacircum}{etacircum}{1000}
+
+ \setglyph{etaiotalenis}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etalenis}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotalenis}{etalenis}{1000}
+
+ \setglyph{etaiotaasper}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etaasper}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaasper}{etaasper}{1000}
+
+ \setglyph{etaiotaasperacute}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etaasperacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaasperacute}{etaasperacute}{1000}
+
+ \setglyph{etaiotaaspergrave}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etaaspergrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaaspergrave}{etaaspergrave}{1000}
+
+ \setglyph{etaiotaaspercircum}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etaaspercircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaaspercircum}{etaaspercircum}{1000}
+
+ \setglyph{etaiotalenisacute}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etalenisacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotalenisacute}{etalenisacute}{1000}
+
+ \setglyph{etaiotalenisgrave}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etalenisgrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotalenis}{etalenisgrave}{1000}
+
+ \setglyph{etaiotaleniscircum}
+ \glyph{iotasubscripte}{1000}
+ \glyph{etaleniscircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{etaiotaleniscircum}{etaleniscircum}{1000}
+\fi
+
+\ifisglyph{iotasubscripto}\then
+ \setglyph{omegaiota}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omega}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiota}{omega}{1000}
+
+ \setglyph{omegaiotaacute}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegatonos}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaacute}{omegatonos}{1000}
+
+ \setglyph{omegaiotagrave}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegagrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotagrave}{omegaiota}{1000}
+
+ \setglyph{omegaiotacircum}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegacircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotacircum}{omegacircum}{1000}
+
+ \setglyph{omegaiotalenis}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegalenis}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotalenis}{omegalenis}{1000}
+
+ \setglyph{omegaiotaasper}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegaasper}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaasper}{omegaasper}{1000}
+
+ \setglyph{omegaiotaasperacute}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegaasperacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaasperacute}{omegaasperacute}{1000}
+
+ \setglyph{omegaiotaaspergrave}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegaaspergrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaaspergrave}{omegaaspergrave}{1000}
+
+ \setglyph{omegaiotaaspercircum}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegaaspercircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaaspercircum}{omegaaspercircum}{1000}
+
+ \setglyph{omegaiotalenisacute}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegalenisacute}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotalenisacute}{omegalenisacute}{1000}
+
+ \setglyph{omegaiotalenisgrave}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegalenisgrave}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotalenis}{omegalenisgrave}{1000}
+
+ \setglyph{omegaiotaleniscircum}
+ \glyph{iotasubscripto}{1000}
+ \glyph{omegaleniscircum}{1000}
+ \endsetglyph
+ \setleftrightkerning{omegaiotaleniscircum}{omegaleniscircum}{1000}
+
+ \setint{iotashift}{\div{\sub{\width{Omega}}{\width{omega}}}{2}}
+
+ \setglyph{Alphaiota}
+ \movert{\int{iotashift}}
+ \glyph{iotasubscripto}{1000}
+ \movert{\neg{\int{iotashift}}}
+ \glyph{Alpha}{1000}
+ \endsetglyph
+
+ \setglyph{Etaiota}
+ \movert{\int{iotashift}}
+ \glyph{iotasubscripto}{1000}
+ \movert{\neg{\int{iotashift}}}
+ \glyph{Eta}{1000}
+ \endsetglyph
+
+ \setglyph{Omegaiota}
+ \movert{\int{iotashift}}
+ \glyph{iotasubscripto}{1000}
+ \movert{\neg{\int{iotashift}}}
+ \glyph{Omega}{1000}
+ \endsetglyph
+\fi
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek.mtx b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek.mtx
new file mode 100644
index 0000000000..946b3442a5
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/grkfinst/inputs/greekmtx/greek.mtx
@@ -0,0 +1,1704 @@
+%% This file is part of the GRKFINST project version 0.3.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2001--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The {\tt fontinst} Greek glyphs}
+\author{A. Kryukov}
+\date{26 April 2004. Version 0.5}
+
+\begin{document}
+\maketitle
+
+\metrics
+
+\needsfontinstversion{1.926}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \ifisglyph{#1-not}\then
+ \moveup{\neg{\depth{#1-not}}}
+ \glyphrule{
+ \width{#1-not}
+ }{
+ \add{\depth{#1-not}}{\height{#1-not}}
+ }
+ \resetitalic{\italic{#1-not}}
+ \moveup{\depth{#1-not}}
+ \else
+ \glyphrule{500}{500}
+ \fi
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% A top accent is set by placing the center of the accent at the given
+% position along the width of the letter, raised up by the difference
+% between the height of the letter and the xheight.
+
+\setcommand\topaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{#1}}{\int{xheight}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ {\scale{\int{italicslant}}{\sub{\height{#1}}{\int{xheight}}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A bottom accent is set by placing the center of the accent at the given
+% position along the width of the letter.
+
+\setcommand\botaccent#1#2#3{
+ \push
+ \movert{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+}
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+
+\setcommand\greekglyph#1#2#3 {
+ \foreach(temp@a){#2}
+ \ifisglyph{\str{temp@a}}\then
+ \setglyph{#1}
+ \glyph{\str{temp@a}}{1000}
+ \endsetglyph
+ \fi
+ \endfor(temp@a)
+ \unfakable{#1}
+ \csname greek@extra@#3\endcsname{#1}
+}
+
+\fontinstcc
+\let\greek@extra@\gobble_one
+\normalcc
+\expandafter\def\csname greek@extra@*\endcsname#1{
+ \setglyph{#1small}
+ \cscglyph{#1}
+ \endsetglyph
+ \setleftrightkerning{#1small}{#1}{\int{smallcapskerning}}
+}
+\expandafter\def\csname greek@extra@A\endcsname#1{
+ \setglyph{#1small}
+ \cscaccent{#1}
+ \endsetglyph
+}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{\height{kappa}}
+\fi
+
+\ifisglyph{A}\then
+ \setint{capheight}{\height{A}}
+\else
+ \setint{capheight}{\height{Alpha}}
+\fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\else
+ \setint{ascender}{\height{delta}}
+\fi
+
+\ifisglyph{g}\then
+ \setint{descender}{\depth{g}}
+\else
+ \setint{descender}{\depth{gamma}}
+\fi
+
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+\ifisint{monowidth}\then
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}
+ {\div{\scale{\width{x}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+\else
+ \setint{capspacing}{50}
+ \setint{smallcapsextraspace}{0}
+\fi
+
+\ifisint{visiblespace}\then
+ \setint{boundarychar}{\int{visiblespace}}
+\fi
+
+\comment{\section{Kerning}}
+
+\setleftrightkerning{visiblespace}{space}{1000}
+
+\setleftkerning{hyphenchar}{hyphen}{1000}
+
+\setleftrightkerning{Alphaiota}{Alpha}{1000}
+\setleftrightkerning{Etaiota}{Eta}{1000}
+\setleftrightkerning{Omegaiota}{Omega}{1000}
+
+\setleftrightkerning{Alphamacron}{Alpha}{1000}
+\setleftrightkerning{Iotamacron}{Iota}{1000}
+\setleftrightkerning{Upsilonmacron}{Upsilon}{1000}
+\setleftrightkerning{alphamacron}{alpha}{1000}
+\setleftrightkerning{iotamacron}{iota}{1000}
+\setleftrightkerning{upsilonmacron}{upsilon}{1000}
+
+\setleftrightkerning{Alphabreve}{Alpha}{1000}
+\setleftrightkerning{Iotabreve}{Iota}{1000}
+\setleftrightkerning{Upsilonbreve}{Upsilon}{1000}
+\setleftrightkerning{alphabreve}{alpha}{1000}
+\setleftrightkerning{iotabreve}{iota}{1000}
+\setleftrightkerning{upsilonbreve}{upsilon}{1000}
+
+\setleftkerning{ALPHAIOTA}{Alpha}{1000}
+\setleftkerning{ETAIOTA}{Eta}{1000}
+\setleftkerning{OMEGAIOTA}{Omega}{1000}
+
+\setleftrightkerning{Iotadieresis}{Iota}{1000}
+\setleftrightkerning{Upsilondieresis}{Upsilon}{1000}
+\setleftrightkerning{Iotadieresissmall}{Iota}{\int{smallcapskerning}}
+\setleftrightkerning{Upsilondieresissmall}{Upsilon}{\int{smallcapskerning}}
+
+\begincomment
+ It is logical to set kerning for all accented letters equal to kerning
+ for the same letters without accents. However, since there are too many
+ accented letters in Greek, doing so may produce a lot of redundant
+ kerning pairs, which will never occur in any real text. On the other hand,
+ since we are not trying to fake the most part of small accented letters,
+ it is supposed that all these letters are already present in the font
+ and have their own kerning pairs, which should be enough for typesetting
+ Greek text. So I've added a possibility to disable automatical generation
+ of kerning pairs for small unfakable accented letters by enabling the
+ `noautokern' option.
+\endcomment
+
+\ifoption{noautokern}\then
+\else
+ \setleftrightkerning{alphatonos}{alpha}{1000}
+ \setleftrightkerning{alphaacute}{alpha}{1000}
+ \setleftrightkerning{alphagrave}{alpha}{1000}
+ \setleftrightkerning{alphacircum}{alpha}{1000}
+ \setleftrightkerning{alphalenis}{alpha}{1000}
+ \setleftrightkerning{alphaasper}{alpha}{1000}
+ \setleftrightkerning{alphalenisacute}{alpha}{1000}
+ \setleftrightkerning{alphalenisgrave}{alpha}{1000}
+ \setleftrightkerning{alphaleniscircum}{alpha}{1000}
+ \setleftrightkerning{alphaasperacute}{alpha}{1000}
+ \setleftrightkerning{alphaaspergrave}{alpha}{1000}
+ \setleftrightkerning{alphaaspercircum}{alpha}{1000}
+ \setleftrightkerning{alphaiota}{alpha}{1000}
+ \setleftrightkerning{alphaiotaacute}{alpha}{1000}
+ \setleftrightkerning{alphaiotagrave}{alpha}{1000}
+ \setleftrightkerning{alphaiotacircum}{alpha}{1000}
+ \setleftrightkerning{alphaiotalenis}{alpha}{1000}
+ \setleftrightkerning{alphaiotaasper}{alpha}{1000}
+ \setleftrightkerning{alphaiotalenisacute}{alpha}{1000}
+ \setleftrightkerning{alphaiotalenisgrave}{alpha}{1000}
+ \setleftrightkerning{alphaiotaleniscircum}{alpha}{1000}
+ \setleftrightkerning{alphaiotaasperacute}{alpha}{1000}
+ \setleftrightkerning{alphaiotaaspergrave}{alpha}{1000}
+ \setleftrightkerning{alphaiotaaspercircum}{alpha}{1000}
+
+ \setleftrightkerning{etatonos}{eta}{1000}
+ \setleftrightkerning{etaacute}{eta}{1000}
+ \setleftrightkerning{etagrave}{eta}{1000}
+ \setleftrightkerning{etacircum}{eta}{1000}
+ \setleftrightkerning{etalenis}{eta}{1000}
+ \setleftrightkerning{etaasper}{eta}{1000}
+ \setleftrightkerning{etalenisacute}{eta}{1000}
+ \setleftrightkerning{etalenisgrave}{eta}{1000}
+ \setleftrightkerning{etaleniscircum}{eta}{1000}
+ \setleftrightkerning{etaasperacute}{eta}{1000}
+ \setleftrightkerning{etaaspergrave}{eta}{1000}
+ \setleftrightkerning{etaaspercircum}{eta}{1000}
+ \setleftrightkerning{etaiota}{omega}{1000}
+ \setleftrightkerning{etaiotaacute}{eta}{1000}
+ \setleftrightkerning{etaiotagrave}{eta}{1000}
+ \setleftrightkerning{etaiotacircum}{eta}{1000}
+ \setleftrightkerning{etaiotalenis}{eta}{1000}
+ \setleftrightkerning{etaiotaasper}{eta}{1000}
+ \setleftrightkerning{etaiotalenisacute}{eta}{1000}
+ \setleftrightkerning{etaiotalenisgrave}{eta}{1000}
+ \setleftrightkerning{etaiotaleniscircum}{eta}{1000}
+ \setleftrightkerning{etaiotaasperacute}{eta}{1000}
+ \setleftrightkerning{etaiotaaspergrave}{eta}{1000}
+ \setleftrightkerning{etaiotaaspercircum}{eta}{1000}
+
+ \setleftrightkerning{omegatonos}{omega}{1000}
+ \setleftrightkerning{omegaacute}{omega}{1000}
+ \setleftrightkerning{omegagrave}{omega}{1000}
+ \setleftrightkerning{omegacircum}{omega}{1000}
+ \setleftrightkerning{omegalenis}{omega}{1000}
+ \setleftrightkerning{omegaasper}{omega}{1000}
+ \setleftrightkerning{omegalenisacute}{omega}{1000}
+ \setleftrightkerning{omegalenisgrave}{omega}{1000}
+ \setleftrightkerning{omegaleniscircum}{omega}{1000}
+ \setleftrightkerning{omegaasperacute}{omega}{1000}
+ \setleftrightkerning{omegaaspergrave}{omega}{1000}
+ \setleftrightkerning{omegaaspercircum}{omega}{1000}
+ \setleftrightkerning{omegaiota}{omega}{1000}
+ \setleftrightkerning{omegaiotaacute}{omega}{1000}
+ \setleftrightkerning{omegaiotagrave}{omega}{1000}
+ \setleftrightkerning{omegaiotacircum}{omega}{1000}
+ \setleftrightkerning{omegaiotalenis}{omega}{1000}
+ \setleftrightkerning{omegaiotaasper}{omega}{1000}
+ \setleftrightkerning{omegaiotalenisacute}{omega}{1000}
+ \setleftrightkerning{omegaiotalenisgrave}{omega}{1000}
+ \setleftrightkerning{omegaiotaleniscircum}{omega}{1000}
+ \setleftrightkerning{omegaiotaasperacute}{omega}{1000}
+ \setleftrightkerning{omegaiotaaspergrave}{omega}{1000}
+ \setleftrightkerning{omegaiotaaspercircum}{omega}{1000}
+
+ \setleftrightkerning{iotatonos}{iota}{1000}
+ \setleftrightkerning{iotaacute}{iota}{1000}
+ \setleftrightkerning{iotagrave}{iota}{1000}
+ \setleftrightkerning{iotacircum}{iota}{1000}
+ \setleftrightkerning{iotalenis}{iota}{1000}
+ \setleftrightkerning{iotaasper}{iota}{1000}
+ \setleftrightkerning{iotalenisacute}{iota}{1000}
+ \setleftrightkerning{iotalenisgrave}{iota}{1000}
+ \setleftrightkerning{iotaleniscircum}{iota}{1000}
+ \setleftrightkerning{iotaasperacute}{iota}{1000}
+ \setleftrightkerning{iotaaspergrave}{iota}{1000}
+ \setleftrightkerning{iotaaspercircum}{iota}{1000}
+ \setleftrightkerning{iotadieresis}{iota}{1000}
+ \setleftrightkerning{iotadieresistonos}{iota}{1000}
+ \setleftrightkerning{iotadieresisgrave}{iota}{1000}
+ \setleftrightkerning{iotadieresiscircum}{iota}{1000}
+
+ \setleftrightkerning{upsilontonos}{upsilon}{1000}
+ \setleftrightkerning{upsilonacute}{upsilon}{1000}
+ \setleftrightkerning{upsilongrave}{upsilon}{1000}
+ \setleftrightkerning{upsiloncircum}{upsilon}{1000}
+ \setleftrightkerning{upsilonlenis}{upsilon}{1000}
+ \setleftrightkerning{upsilonasper}{upsilon}{1000}
+ \setleftrightkerning{upsilonlenisacute}{upsilon}{1000}
+ \setleftrightkerning{upsilonlenisgrave}{upsilon}{1000}
+ \setleftrightkerning{upsilonleniscircum}{upsilon}{1000}
+ \setleftrightkerning{upsilonasperacute}{upsilon}{1000}
+ \setleftrightkerning{upsilonaspergrave}{upsilon}{1000}
+ \setleftrightkerning{upsilonaspercircum}{upsilon}{1000}
+ \setleftrightkerning{upsilondieresis}{upsilon}{1000}
+ \setleftrightkerning{upsilondieresistonos}{upsilon}{1000}
+ \setleftrightkerning{upsilondieresisgrave}{upsilon}{1000}
+ \setleftrightkerning{upsilondieresiscircum}{upsilon}{1000}
+
+ \setleftrightkerning{epsilontonos}{epsilon}{1000}
+ \setleftrightkerning{epsilonacute}{epsilon}{1000}
+ \setleftrightkerning{epsilongrave}{epsilon}{1000}
+ \setleftrightkerning{epsiloncircum}{epsilon}{1000}
+ \setleftrightkerning{epsilonlenis}{epsilon}{1000}
+ \setleftrightkerning{epsilonasper}{epsilon}{1000}
+ \setleftrightkerning{epsilonlenisacute}{epsilon}{1000}
+ \setleftrightkerning{epsilonlenisgrave}{epsilon}{1000}
+ \setleftrightkerning{epsilonasperacute}{epsilon}{1000}
+ \setleftrightkerning{epsilonaspergrave}{epsilon}{1000}
+
+ \setleftrightkerning{omicrontonos}{omicron}{1000}
+ \setleftrightkerning{omicronacute}{omicron}{1000}
+ \setleftrightkerning{omicrongrave}{omicron}{1000}
+ \setleftrightkerning{omicroncircum}{omicron}{1000}
+ \setleftrightkerning{omicronlenis}{omicron}{1000}
+ \setleftrightkerning{omicronasper}{omicron}{1000}
+ \setleftrightkerning{omicronlenisacute}{omicron}{1000}
+ \setleftrightkerning{omicronlenisgrave}{omicron}{1000}
+ \setleftrightkerning{omicronasperacute}{omicron}{1000}
+ \setleftrightkerning{omicronaspergrave}{omicron}{1000}
+
+ \setleftrightkerning{rholenis}{rho}{1000}
+ \setleftrightkerning{rhoasper}{rho}{1000}
+\fi
+
+\setrightkerning{Alphatonos}{Alpha}{1000}
+\setrightkerning{Epsilontonos}{Epsilon}{1000}
+\setrightkerning{Etatonos}{Eta}{1000}
+\setrightkerning{Iotatonos}{Iota}{1000}
+\setrightkerning{Omicrontonos}{Omicron}{1000}
+\setrightkerning{Upsilontonos}{Upsilon}{1000}
+\setrightkerning{Omegatonos}{Omega}{1000}
+
+\setrightkerning{Alphaacute}{Alpha}{1000}
+\setrightkerning{Epsilonacute}{Epsilon}{1000}
+\setrightkerning{Etaacute}{Eta}{1000}
+\setrightkerning{Iotaacute}{Iota}{1000}
+\setrightkerning{Omicronacute}{Omicron}{1000}
+\setrightkerning{Upsilonacute}{Upsilon}{1000}
+\setrightkerning{Omegaacute}{Omega}{1000}
+
+\setrightkerning{Alphagrave}{Alpha}{1000}
+\setrightkerning{Epsilongrave}{Epsilon}{1000}
+\setrightkerning{Etagrave}{Eta}{1000}
+\setrightkerning{Iotagrave}{Iota}{1000}
+\setrightkerning{Omicrongrave}{Omicron}{1000}
+\setrightkerning{Upsilongrave}{Upsilon}{1000}
+\setrightkerning{Omegagrave}{Omega}{1000}
+
+\setrightkerning{Alphalenis}{Alpha}{1000}
+\setrightkerning{Epsilonlenis}{Epsilon}{1000}
+\setrightkerning{Etalenis}{Eta}{1000}
+\setrightkerning{Iotalenis}{Iota}{1000}
+\setrightkerning{Omicronlenis}{Omicron}{1000}
+\setrightkerning{Upsilonlenis}{Upsilon}{1000}
+\setrightkerning{Omegalenis}{Omega}{1000}
+
+\setrightkerning{Alphaasper}{Alpha}{1000}
+\setrightkerning{Epsilonasper}{Epsilon}{1000}
+\setrightkerning{Etaasper}{Eta}{1000}
+\setrightkerning{Iotaasper}{Iota}{1000}
+\setrightkerning{Omicronasper}{Omicron}{1000}
+\setrightkerning{Upsilonasper}{Upsilon}{1000}
+\setrightkerning{Omegaasper}{Omega}{1000}
+\setrightkerning{Rhoasper}{Rho}{1000}
+
+\setrightkerning{Alphalenisacute}{Alpha}{1000}
+\setrightkerning{Epsilonlenisacute}{Epsilon}{1000}
+\setrightkerning{Etalenisacute}{Eta}{1000}
+\setrightkerning{Iotalenisacute}{Iota}{1000}
+\setrightkerning{Omicronlenisacute}{Omicron}{1000}
+\setrightkerning{Upsilonlenisacute}{Upsilon}{1000}
+\setrightkerning{Omegalenisacute}{Omega}{1000}
+
+\setrightkerning{Alphalenisgrave}{Alpha}{1000}
+\setrightkerning{Epsilonlenisgrave}{Epsilon}{1000}
+\setrightkerning{Etalenisgrave}{Eta}{1000}
+\setrightkerning{Iotalenisgrave}{Iota}{1000}
+\setrightkerning{Omicronlenisgrave}{Omicron}{1000}
+\setrightkerning{Upsilonlenisgrave}{Upsilon}{1000}
+\setrightkerning{Omegalenisgrave}{Omega}{1000}
+
+\setrightkerning{Alphaleniscircum}{Alpha}{1000}
+\setrightkerning{Epsilonleniscircum}{Epsilon}{1000}
+\setrightkerning{Etaleniscircum}{Eta}{1000}
+\setrightkerning{Iotaleniscircum}{Iota}{1000}
+\setrightkerning{Omicronleniscircum}{Omicron}{1000}
+\setrightkerning{Upsilonleniscircum}{Upsilon}{1000}
+\setrightkerning{Omegaleniscircum}{Omega}{1000}
+
+\setrightkerning{Alphaasperacute}{Alpha}{1000}
+\setrightkerning{Epsilonasperacute}{Epsilon}{1000}
+\setrightkerning{Etaasperacute}{Eta}{1000}
+\setrightkerning{Iotaasperacute}{Iota}{1000}
+\setrightkerning{Omicronasperacute}{Omicron}{1000}
+\setrightkerning{Upsilonasperacute}{Upsilon}{1000}
+\setrightkerning{Omegaasperacute}{Omega}{1000}
+
+\setrightkerning{Alphaaspergrave}{Alpha}{1000}
+\setrightkerning{Epsilonaspergrave}{Epsilon}{1000}
+\setrightkerning{Etaaspergrave}{Eta}{1000}
+\setrightkerning{Iotaaspergrave}{Iota}{1000}
+\setrightkerning{Omicronaspergrave}{Omicron}{1000}
+\setrightkerning{Upsilonaspergrave}{Upsilon}{1000}
+\setrightkerning{Omegaaspergrave}{Omega}{1000}
+
+\setrightkerning{Alphaaspercircum}{Alpha}{1000}
+\setrightkerning{Epsilonaspercircum}{Epsilon}{1000}
+\setrightkerning{Etaaspercircum}{Eta}{1000}
+\setrightkerning{Iotaaspercircum}{Iota}{1000}
+\setrightkerning{Omicronaspercircum}{Omicron}{1000}
+\setrightkerning{Upsilonaspercircum}{Upsilon}{1000}
+\setrightkerning{Omegaaspercircum}{Omega}{1000}
+
+\setleftrightkerning{Alphaiotaacute}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotagrave}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotacircum}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotalenisacute}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotaasperacute}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotalenisgrave}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotaaspergrave}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotaleniscircum}{Alphaiota}{1000}
+\setleftrightkerning{Alphaiotaaspercircum}{Alphaiota}{1000}
+
+\setleftrightkerning{Etaiotaacute}{Etaiota}{1000}
+\setleftrightkerning{Etaiotagrave}{Etaiota}{1000}
+\setleftrightkerning{Etaiotacircum}{Etaiota}{1000}
+\setleftrightkerning{Etaiotalenisacute}{Etaiota}{1000}
+\setleftrightkerning{Etaiotaasperacute}{Etaiota}{1000}
+\setleftrightkerning{Etaiotalenisgrave}{Etaiota}{1000}
+\setleftrightkerning{Etaiotaaspergrave}{Etaiota}{1000}
+\setleftrightkerning{Etaiotaleniscircum}{Etaiota}{1000}
+\setleftrightkerning{Etaiotaaspercircum}{Etaiota}{1000}
+
+\setleftrightkerning{Omegaiotaacute}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotagrave}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotacircum}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotalenisacute}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotaasperacute}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotalenisgrave}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotaaspergrave}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotaleniscircum}{Omegaiota}{1000}
+\setleftrightkerning{Omegaiotaaspercircum}{Omegaiota}{1000}
+
+\setleftrightkerning{ALPHA}{Alpha}{1000}
+\setleftrightkerning{EPSILON}{Epsilon}{1000}
+\setleftrightkerning{ETA}{Eta}{1000}
+\setleftrightkerning{IOTA}{Iota}{1000}
+\setleftrightkerning{OMICRON}{Omicron}{1000}
+\setleftrightkerning{UPSILON}{Upsilon}{1000}
+\setleftrightkerning{OMEGA}{Omega}{1000}
+
+\comment{\section{Unfakable common glyphs}}
+
+\unfakable{slash}
+\unfakable{backslash}
+\unfakable{bracketleft}
+\unfakable{bracketright}
+\unfakable{braceleft}
+\unfakable{braceright}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{asciitilde}
+\unfakable{asciicircum}
+\unfakable{numbersign}
+\unfakable{dollar}
+\unfakable{percent}
+\unfakable{perthousand}{}
+\unfakable{asterisk}
+\unfakable{euro}{}
+\unfakable{hyphen}
+\unfakable{comma}
+\unfakable{period}
+\unfakable{colon}
+\unfakable{exclam}
+\unfakable{question}
+\unfakable{rangedash}
+\unfakable{punctdash}
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+\unfakable{underscore}
+
+\comment{\section{Common glyphs}}
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \else
+ \movert{\width{iota}}
+ \fi
+\endsetglyph
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+\endsetglyph
+
+\setglyph{compwordmark}
+ \glyphrule{0}{\int{xheight}}
+\endsetglyph
+\setint{compwordmark-spacing}{0}
+
+\greekglyph{plus}{}
+\greekglyph{dotbelowcomb}{}
+
+\comment{\section{Greek accents and punctuation marks}}
+
+\greekglyph{tonos}{}
+\greekglyph{acutegreek}{tonos}
+\greekglyph{gravegreek}{}
+\greekglyph{circumgreek}{}
+\greekglyph{asper}{}
+\greekglyph{lenis}{}
+\greekglyph{asperacute}{}
+\greekglyph{lenisacute}{}
+\greekglyph{aspergrave}{}
+\greekglyph{lenisgrave}{}
+\greekglyph{aspercircum}{}
+\greekglyph{leniscircum}{}
+\greekglyph{dieresisgreek}{dieresis}
+\greekglyph{dieresistonos}{}
+\greekglyph{dieresisacutegreek}{dieresistonos,dieresisacute}
+\greekglyph{dieresisgravegreek}{dieresisgrave}
+
+\setglyph{dieresiscircum}
+ \topaccent{dieresisgreek}{circumgreek}{500}
+\endsetglyph
+
+\greekglyph{anwtonos}{tonos,acute}
+\greekglyph{katwtonos}{}
+\greekglyph{macrongreek}{macron}
+\greekglyph{brevegreek}{breve}
+\greekglyph{iotasubscript}{}
+
+\comment{Combining variants of iota subscriptum, used in Linotype Greek
+ fonts and in the Ibycus package.}
+\greekglyph{iotasubscripto}{}
+\greekglyph{iotasubscripta}{}
+\greekglyph{iotasubscripte}{}
+
+\setglyph{iotaadscript}
+ \glyph{Iota}{500}
+\endsetglyph
+
+\setglyph{iotaadscriptsmall}
+ \glyph{Iota}{\scale{500}{\int{smallcapsscale}}}
+\endsetglyph
+
+\greekglyph{questiongreek}{semicolon}
+\greekglyph{anoteleia}{}
+\greekglyph{angleleft}{less}
+\greekglyph{angleright}{greater}
+
+\setglyph{guillemotleftgreek}
+ \ifisglyph{guillemotleft}\then
+ \glyph{guillemotleft}{1000}
+ \else
+ \glyph{angleleft}{1000}
+ \movert{\kerning{angleleft}{angleleft}}
+ \glyph{angleleft}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{guillemotrightgreek}
+ \ifisglyph{guillemotright}\then
+ \glyph{guillemotright}{1000}
+ \else
+ \glyph{angleright}{1000}
+ \movert{\kerning{angleright}{angleright}}
+ \glyph{angleright}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{quotedblleftgreek}
+ \ifisglyph{quotedblleft}\then
+ \glyph{quotedblleft}{1000}
+ \else
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{asper}}
+ \glyph{asper}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{quotedblrightgreek}
+ \ifisglyph{quotedblright}\then
+ \glyph{quotedblright}{1000}
+ \else
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{lenis}}
+ \glyph{lenis}{1000}
+ \fi
+\endsetglyph
+
+\greekglyph{quoteleft}{asper}
+\greekglyph{quoteright}{lenis}
+
+\comment{\section{Greek numeric and archaic symbols}}
+
+\setglyph{Stigma}
+ \glyph{Sigma}{1000}
+ \movert{\kerning{Sigma}{Tau}}
+ \glyph{Tau}{1000}
+\endsetglyph
+\greekglyph{Stigma}{}*
+
+\setglyph{stigma}
+ \glyph{sigma}{1000}
+ \movert{\kerning{sigma}{tau}}
+ \glyph{tau}{1000}
+\endsetglyph
+\greekglyph{stigma}{}
+
+\greekglyph{Digamma}{F}*
+\greekglyph{digamma}{f}
+\greekglyph{vardigamma}{}
+\greekglyph{Qoppaarchaic}{uni03D8}*
+\greekglyph{qoppaarchaic}{uni03D9}
+\greekglyph{Qoppa}{uni03DE}*
+\greekglyph{qoppa}{uni03DF}
+\greekglyph{Sampi}{uni03E0}*
+\greekglyph{sampi}{uni03E1}
+\greekglyph{yot}{j}
+\greekglyph{aspirate}{uni0195}
+
+\greekglyph{pentedeka}{Deltanum}
+\greekglyph{pentehekaton}{Etanum}
+\greekglyph{penteqilioi}{Chinum}
+\greekglyph{pentemurioi}{Munum}
+
+\comment{\section{Greek capital letters}}
+
+\greekglyph{Alpha}{}*
+\greekglyph{Beta}{}*
+\greekglyph{Gamma}{}*
+\greekglyph{Delta}{}*
+\greekglyph{Epsilon}{}*
+\greekglyph{Zeta}{}*
+\greekglyph{Eta}{}*
+\greekglyph{Theta}{}*
+\greekglyph{Iota}{}*
+\greekglyph{Kappa}{}*
+\greekglyph{Lambda}{}*
+\greekglyph{Mu}{}*
+\greekglyph{Nu}{}*
+\greekglyph{Xi}{}*
+\greekglyph{Omicron}{}*
+\greekglyph{Pi}{}*
+\greekglyph{Rho}{}*
+\greekglyph{Sigma}{}*
+\greekglyph{Tau}{}*
+\greekglyph{Upsilon}{}*
+\greekglyph{Phi}{}*
+\greekglyph{Chi}{}*
+\greekglyph{Psi}{}*
+\greekglyph{Omega}{}*
+
+\begincomment
+ The following glyph variants are necessary only for making correct
+ ligatures. However they shouldn't be used in Unicode fonts,
+ since with $\Omega$ we should use translation processes rather than
+ \TeX\ ligatures.
+\endcomment
+
+\greekglyph{ALPHA}{Alpha}*
+
+\greekglyph{EPSILON}{Epsilon}*
+
+\greekglyph{ETA}{Eta}*
+
+\greekglyph{IOTA}{Iota}*
+
+\greekglyph{OMICRON}{Omicron}*
+
+\greekglyph{UPSILON}{Upsilon}*
+
+\greekglyph{OMEGA}{Omega}*
+
+\greekglyph{RHO}{Rho}*
+
+\comment{\section{Greek small letters}}
+
+\greekglyph{alpha}{}
+\greekglyph{beta}{}
+\greekglyph{gamma}{}
+\greekglyph{delta}{}
+\greekglyph{epsilon}{}
+\greekglyph{zeta}{}
+\greekglyph{eta}{}
+\greekglyph{theta}{}
+\greekglyph{iota}{}
+\greekglyph{kappa}{}
+\greekglyph{lambda}{}
+\greekglyph{mu}{}
+\greekglyph{nu}{}
+\greekglyph{xi}{}
+\greekglyph{omicron}{}
+\greekglyph{pi}{}
+\greekglyph{rho}{}
+\greekglyph{sigma1}{}
+\greekglyph{sigma}{}
+\greekglyph{tau}{}
+\greekglyph{upsilon}{}
+\greekglyph{phi}{}
+\greekglyph{chi}{}
+\greekglyph{psi}{}
+\greekglyph{omega}{}
+
+\comment{\section{Alternate forms of Greek letters}}
+
+\greekglyph{beta1}{beta}
+\greekglyph{theta1}{theta}
+\greekglyph{Theta1}{Theta}*
+\greekglyph{phi1}{phi}
+\greekglyph{pi1}{pi}
+\greekglyph{rho1}{rho}
+\greekglyph{kappa1}{kappa}
+\greekglyph{epsilon1}{epsilon}
+\greekglyph{Csigma}{C}*
+\greekglyph{csigma}{c}
+
+\greekglyph{greekkai}{uni03D7}
+
+\setglyph{greekkaismall}
+ \glyph{Kappasmall}{1000}
+ \movert{\kerning{Kappasmall}{Alphasmall}}
+ \glyph{Alphasmall}{1000}
+ \movert{\kerning{Alphasmall}{Iotasmall}}
+ \glyph{Iotasmall}{1000}
+\endsetglyph
+\greekglyph{greekkaismall}{}
+
+\comment{\section{Greek capital letters with iota subscriptum}}
+
+\setglyph{Alphaiota}
+ \botaccent{Alpha}{iotasubscript}{500}
+\endsetglyph
+
+\setglyph{Etaiota}
+ \botaccent{Eta}{iotasubscript}{500}
+\endsetglyph
+
+\setglyph{Omegaiota}
+ \botaccent{Omega}{iotasubscript}{500}
+\endsetglyph
+
+\comment{\section{Greek capital letters with iota adscriptum,
+ intended for use in small caps fonts}}
+
+\setglyph{ALPHAIOTA}
+ \glyph{Alpha}{1000}
+ \movert{\kerning{Alpha}{iotaadscript}}
+ \glyph{iotaadscript}{1000}
+\endsetglyph
+\greekglyph{ALPHAIOTA}{}*
+
+\setglyph{ETAIOTA}
+ \glyph{Eta}{1000}
+ \movert{\kerning{Eta}{iotaadscript}}
+ \glyph{iotaadscript}{1000}
+\endsetglyph
+\greekglyph{ETAIOTA}{}*
+
+\setglyph{OMEGAIOTA}
+ \glyph{Omega}{1000}
+ \movert{\kerning{Omega}{iotaadscript}}
+ \glyph{iotaadscript}{1000}
+\endsetglyph
+\greekglyph{OMEGAIOTA}{}*
+
+\comment{\section{Greek capital letters with tonos}}
+
+\setglyph{Alphatonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etatonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilontonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotatonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicrontonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilontonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegatonos}
+ \glyph{tonos}{1000}
+ \movert{\kerning{tonos}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\comment{\section{Greek capital accented letters}}
+
+\setglyph{Iotadieresis}
+ \topaccent{Iota}{dieresisgreek}{500}
+\endsetglyph
+\greekglyph{Iotadieresis}{}*
+
+\setglyph{Upsilondieresis}
+ \topaccent{Upsilon}{dieresisgreek}{500}
+\endsetglyph
+\greekglyph{Upsilondieresis}{}*
+
+\setglyph{Alphaacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaacute}
+ \glyph{acutegreek}{1000}
+ \movert{\kerning{acutegreek}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphagrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etagrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilongrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotagrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicrongrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilongrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegagrave}
+ \glyph{gravegreek}{1000}
+ \movert{\kerning{gravegreek}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonlenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronlenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonlenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Rhoasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Rho}}
+ \glyph{Rho}{1000}
+\endsetglyph
+
+\setglyph{Alphalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonlenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronlenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonlenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonlenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronlenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonlenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\setglyph{Alphaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Alpha}}
+ \glyph{Alpha}{1000}
+\endsetglyph
+
+\setglyph{Etaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Eta}}
+ \glyph{Eta}{1000}
+\endsetglyph
+
+\setglyph{Epsilonaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Epsilon}}
+ \glyph{Epsilon}{1000}
+\endsetglyph
+
+\setglyph{Iotaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Iota}}
+ \glyph{Iota}{1000}
+\endsetglyph
+
+\setglyph{Omicronaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Omicron}}
+ \glyph{Omicron}{1000}
+\endsetglyph
+
+\setglyph{Upsilonaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Upsilon}}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{Omegaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Omega}}
+ \glyph{Omega}{1000}
+\endsetglyph
+
+\comment{\section{Greek capital accented letters with ypogegrammeni}}
+
+\setglyph{Alphaiotalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Alphaiotaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Alpha}}
+ \glyph{Alphaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Etaiotaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Eta}}
+ \glyph{Etaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotalenis}
+ \glyph{lenis}{1000}
+ \movert{\kerning{lenis}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotaasper}
+ \glyph{asper}{1000}
+ \movert{\kerning{asper}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotalenisacute}
+ \glyph{lenisacute}{1000}
+ \movert{\kerning{lenisacute}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotalenisgrave}
+ \glyph{lenisgrave}{1000}
+ \movert{\kerning{lenisgrave}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotaleniscircum}
+ \glyph{leniscircum}{1000}
+ \movert{\kerning{leniscircum}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotaasperacute}
+ \glyph{asperacute}{1000}
+ \movert{\kerning{asperacute}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotaaspergrave}
+ \glyph{aspergrave}{1000}
+ \movert{\kerning{aspergrave}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\setglyph{Omegaiotaaspercircum}
+ \glyph{aspercircum}{1000}
+ \movert{\kerning{aspercircum}{Omega}}
+ \glyph{Omegaiota}{1000}
+\endsetglyph
+
+\comment{\section{Greek small accented letters}}
+
+\greekglyph{iotadieresis}{}
+\greekglyph{iotadieresistonos}{}
+\greekglyph{iotadieresisacute}{iotadieresistonos}
+\greekglyph{iotadieresisgrave}{}
+
+\setglyph{iotadieresiscircum}
+ \topaccent{iotadieresis}{circumgreek}{500}
+\endsetglyph
+
+\greekglyph{upsilondieresis}{}
+\greekglyph{upsilondieresistonos}{}
+\greekglyph{upsilondieresisacute}{upsilondieresistonos}
+\greekglyph{upsilondieresisgrave}{}
+
+\setglyph{upsilondieresiscircum}
+ \topaccent{upsilondieresis}{circumgreek}{500}
+\endsetglyph
+
+\comment{Small epslion and omicron with circumflex, not available in most
+ Greek fonts.}
+
+\setglyph{epsiloncircum}
+ \topaccent{epsilon}{circumgreek}{500}
+\endsetglyph
+\greekglyph{epsiloncircum}{}
+
+\setglyph{epsilonleniscircum}
+ \topaccent{epsilon}{leniscircum}{500}
+\endsetglyph
+\greekglyph{epsilonleniscircum}{}
+
+\setglyph{epsilonaspercircum}
+ \topaccent{epsilon}{aspercircum}{500}
+\endsetglyph
+\greekglyph{epsilonaspercircum}{}
+
+\setglyph{omicroncircum}
+ \topaccent{omicron}{circumgreek}{500}
+\endsetglyph
+\greekglyph{omicroncircum}{}
+
+\setglyph{omicronleniscircum}
+ \topaccent{omicron}{leniscircum}{500}
+\endsetglyph
+\greekglyph{omicronleniscircum}{}
+
+\setglyph{omicronaspercircum}
+ \topaccent{omicron}{aspercircum}{500}
+\endsetglyph
+\greekglyph{omicronaspercircum}{}
+
+\greekglyph{alphalenis}{}
+\greekglyph{alphaasper}{}
+\greekglyph{alphatonos}{}
+\greekglyph{alphaacute}{alphatonos}
+\greekglyph{alphagrave}{}
+\greekglyph{alphacircum}{}
+\greekglyph{alphalenisacute}{}
+\greekglyph{alphalenisgrave}{}
+\greekglyph{alphaleniscircum}{}
+\greekglyph{alphaasperacute}{}
+\greekglyph{alphaaspergrave}{}
+\greekglyph{alphaaspercircum}{}
+\greekglyph{alphaiota}{}
+\greekglyph{alphaiotalenis}{}
+\greekglyph{alphaiotaasper}{}
+\greekglyph{alphaiotaacute}{}
+\greekglyph{alphaiotagrave}{}
+\greekglyph{alphaiotacircum}{}
+\greekglyph{alphaiotalenisacute}{}
+\greekglyph{alphaiotalenisgrave}{}
+\greekglyph{alphaiotaleniscircum}{}
+\greekglyph{alphaiotaasperacute}{}
+\greekglyph{alphaiotaaspergrave}{}
+\greekglyph{alphaiotaaspercircum}{}
+
+\greekglyph{etalenis}{}
+\greekglyph{etaasper}{}
+\greekglyph{etatonos}{}
+\greekglyph{etaacute}{etatonos}
+\greekglyph{etagrave}{}
+\greekglyph{etacircum}{}
+\greekglyph{etalenisacute}{}
+\greekglyph{etalenisgrave}{}
+\greekglyph{etaleniscircum}{}
+\greekglyph{etaasperacute}{}
+\greekglyph{etaaspergrave}{}
+\greekglyph{etaaspercircum}{}
+\greekglyph{etaiota}{}
+\greekglyph{etaiotalenis}{}
+\greekglyph{etaiotaasper}{}
+\greekglyph{etaiotaacute}{}
+\greekglyph{etaiotagrave}{}
+\greekglyph{etaiotacircum}{}
+\greekglyph{etaiotalenisacute}{}
+\greekglyph{etaiotalenisgrave}{}
+\greekglyph{etaiotaleniscircum}{}
+\greekglyph{etaiotaasperacute}{}
+\greekglyph{etaiotaaspergrave}{}
+\greekglyph{etaiotaaspercircum}{}
+
+\greekglyph{omegalenis}{}
+\greekglyph{omegaasper}{}
+\greekglyph{omegatonos}{}
+\greekglyph{omegaacute}{omegatonos}
+\greekglyph{omegagrave}{}
+\greekglyph{omegacircum}{}
+\greekglyph{omegalenisacute}{}
+\greekglyph{omegalenisgrave}{}
+\greekglyph{omegaleniscircum}{}
+\greekglyph{omegaasperacute}{}
+\greekglyph{omegaaspergrave}{}
+\greekglyph{omegaaspercircum}{}
+\greekglyph{omegaiota}{}
+\greekglyph{omegaiotalenis}{}
+\greekglyph{omegaiotaasper}{}
+\greekglyph{omegaiotaacute}{}
+\greekglyph{omegaiotagrave}{}
+\greekglyph{omegaiotacircum}{}
+\greekglyph{omegaiotalenisacute}{}
+\greekglyph{omegaiotalenisgrave}{}
+\greekglyph{omegaiotaleniscircum}{}
+\greekglyph{omegaiotaasperacute}{}
+\greekglyph{omegaiotaaspergrave}{}
+\greekglyph{omegaiotaaspercircum}{}
+
+\greekglyph{iotalenis}{}
+\greekglyph{iotaasper}{}
+\greekglyph{iotatonos}{}
+\greekglyph{iotaacute}{iotatonos}
+\greekglyph{iotagrave}{}
+\greekglyph{iotacircum}{}
+\greekglyph{iotalenisacute}{}
+\greekglyph{iotalenisgrave}{}
+\greekglyph{iotaleniscircum}{}
+\greekglyph{iotaasperacute}{}
+\greekglyph{iotaaspergrave}{}
+\greekglyph{iotaaspercircum}{}
+
+\greekglyph{upsilonlenis}{}
+\greekglyph{upsilonasper}{}
+\greekglyph{upsilontonos}{}
+\greekglyph{upsilonacute}{upsilontonos}
+\greekglyph{upsilongrave}{}
+\greekglyph{upsiloncircum}{}
+\greekglyph{upsilonlenisacute}{}
+\greekglyph{upsilonlenisgrave}{}
+\greekglyph{upsilonleniscircum}{}
+\greekglyph{upsilonasperacute}{}
+\greekglyph{upsilonaspergrave}{}
+\greekglyph{upsilonaspercircum}{}
+
+\greekglyph{epsilonlenis}{}
+\greekglyph{epsilonasper}{}
+\greekglyph{epsilontonos}{}
+\greekglyph{epsilonacute}{epsilontonos}
+\greekglyph{epsilongrave}{}
+\greekglyph{epsilonlenisacute}{}
+\greekglyph{epsilonlenisgrave}{}
+\greekglyph{epsilonasperacute}{}
+\greekglyph{epsilonaspergrave}{}
+
+\greekglyph{omicronlenis}{}
+\greekglyph{omicronasper}{}
+\greekglyph{omicrontonos}{}
+\greekglyph{omicronacute}{omicrontonos}
+\greekglyph{omicrongrave}{}
+\greekglyph{omicronlenisacute}{}
+\greekglyph{omicronlenisgrave}{}
+\greekglyph{omicronasperacute}{}
+\greekglyph{omicronaspergrave}{}
+
+\comment{\section{Greek letters with macron/breve}}
+
+\setglyph{Alphamacron}
+ \topaccent{Alpha}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{Iotamacron}
+ \topaccent{Iota}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{Upsilonmacron}
+ \topaccent{Upsilon}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{Alphabreve}
+ \topaccent{Alpha}{brevegreek}{500}
+\endsetglyph
+
+\setglyph{Iotabreve}
+ \topaccent{Iota}{brevegreek}{500}
+\endsetglyph
+
+\setglyph{Upsilonbreve}
+ \topaccent{Upsilon}{brevegreek}{500}
+\endsetglyph
+
+\setglyph{alphamacron}
+ \topaccent{alpha}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{iotamacron}
+ \topaccent{iota}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{upsilonmacron}
+ \topaccent{upsilon}{macrongreek}{500}
+\endsetglyph
+
+\setglyph{alphabreve}
+ \topaccent{alpha}{brevegreek}{500}
+\endsetglyph
+
+\setglyph{iotabreve}
+ \topaccent{iota}{brevegreek}{500}
+\endsetglyph
+
+\setglyph{upsilonbreve}
+ \topaccent{upsilon}{brevegreek}{500}
+\endsetglyph
+
+\comment{\section{Combining dot below}}
+
+\comment{Instead of making a single bottom accent, the Ibycus font
+ provides a special version of combining dot below for almost each
+ character. These odd glyphs are listed below (glyph names are taken
+ from the PostScript version of the Ibycus font.}
+
+\greekglyph{dotI}{}
+
+\greekglyph{dotJdlmnpqu}{}
+
+\greekglyph{dotbt}{}
+
+\greekglyph{dotchjz}{}
+
+\greekglyph{doti}{}
+
+\greekglyph{dotGZ}{}
+
+\greekglyph{dotkos}{}
+
+\greekglyph{dotCEVaw}{}
+
+\greekglyph{dotDK}{}
+
+\greekglyph{dotfy}{}
+
+\greekglyph{dotgx}{}
+
+\greekglyph{dotkoppa}{}
+
+\greekglyph{dotAOQUXY}{}
+
+\greekglyph{dotr}{}
+
+\greekglyph{dotM}{}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/HISTORY b/fonts/utilities/fontinst-contrib/ofntinst/HISTORY
new file mode 100644
index 0000000000..df70d1fa3a
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/HISTORY
@@ -0,0 +1,63 @@
+2005-05-07 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.2.2 released.
+
+ * Some TeX characters, including compound word mark and
+ several TS1 glyphs, are mapped to their appropriate Unicode
+ slots.
+
+ * Accents are now mapped both to their positions in the Combining
+ diacritical marks area (U+0300 -- U+036F) and (if available)
+ also to the slots in the Spacing Modifier letters area (U+02B0
+ -- U+02FF). Note that there is practically no difference
+ between spacing and combining accent marks for TeX, since
+ TeX doesn't require combining marks to be zero-width.
+
+ * Some accents (including capital versions) are mapped
+ to the PUA as in Adobe fonts; unilatin.mtx now uses "capital"
+ versions of accents for faking capital accented glyphs.
+
+ * Removed some mtx files, needed only for preparing my cm-lgc
+ package, since now they are available in that package.
+
+ * All LaTeX macros replaced with equivalent fontinst constructions,
+ so that you can process fontinst job files with plain Omega. Note
+ that you still need Lambda in case you are using ofntinst
+ in conjunction with Cyrillic fontinst extensions.
+
+ * The purely hypothetical example file (utm.tex) is now replaced
+ with a real (but slightly simplified) sample script, used to install
+ the Linotype Times Ten family for Omega/Lambda.
+
+2004-04-26 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.2.1 released.
+
+ * Added seceral small mtx files, used while generating
+ my cm-lgc fonts (CTAN:fonts/ps-type1/cm-lgc/).
+
+ * Corrected the ellipsis glyph for monospaced fonts, which was
+ almost 3 character width in previous versions.
+
+ * In general, some glyphs which can be faked are redesigned to
+ be single character width in monospaced fonts. I think this
+ solution should be preferred in all the cases where it will
+ produce more or less satisfactory results.
+
+2003-08-31 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.2 released.
+
+ * The package adapted for fontinst v. 1.926.
+
+ * Directory structure changed according to fontinst v 1.926.
+
+ * Fixed bug in the ut1.etx file which caused dagger and double
+ dagger to be placed incorrectly.
+
+ * Removed file ofntinst.sty. Use standard fontinst.sty from
+ the fontinst 1.926 distribution instead.
+
+2003-03-20 Alexej Kryukov <basileia@yandex.ru>
+
+ * Version 0.1 released: first public release.
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/README b/fonts/utilities/fontinst-contrib/ofntinst/README
new file mode 100644
index 0000000000..82adfb86c3
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/README
@@ -0,0 +1,118 @@
+This is the README file of the ofntinst package,
+version 0.2.2 (May 7, 2005)
+
+OFNTINST package is Copyright 2002-2005 by Alexej Kryukov
+<basileia@yandex.ru>.
+
+It may be distributed under the conditions of the LaTeX Project Public
+License, either version 1.1 of this license or (at your option) any
+later version.
+
+ABSTRACT
+~~~~~~~~
+
+OFNTINST is a plug-in for the fontinst package, which allows to
+create Unicode virtual fonts for use with Omega/Lambda. It takes
+several 8-bit Type 1 fonts and merges them to one large virtual
+font.
+
+REQUIREMENTS
+~~~~~~~~~~~~
+
+First, you have to obtain the fontinst system version 1.926 or
+later. If you already have an older fontinst installation (teTeX 2.0
+comes with fontinst 1.8), remove it. This document supposes that
+you already know how to install fonts with fontinst; if not,
+refer to the fontinst documentation.
+
+If you are planning to create virtual fonts with Cyrillic and/or
+Greek glyphs, download additionally the Cyrillic T2 package
+and my GRKFINST package (for Greek).
+
+FILES INCLUDED
+~~~~~~~~~~~~~~
+
+The OFNTINST package includes the following files:
+
+-- unilatin.mtx. This file represents the core of the system. It
+describes all Basic Latin, Latin-1 Supplement and Latin Extended-A
+glyphs, necessary for installing Unicode fonts. Although this file is
+based on the latin.mtx file from the original fontinst package, it
+utilizes some ideas originally implemented in the Cyrillic T2 package.
+However, it doesn't include Cyrillic glyphs itself: for installing
+Cyrillic or Greek fonts you will need additionally the cyrillic.mtx file
+from the T2 package and the greek.mtx file from my GRKFINST package.
+
+Previously a special version of the unilatin.mtx file was available, used
+for installing fonts with true small capitals, which, however, use the
+same glyph naming system as regular fonts. Since this file shared the most
+part of code with unilatin.mtx, it was very inconvenient to maintain it.
+So now this file is removed: instead you can load the sane unilatin.mtx
+file with the `smallcaps' option, for example:
+
+\installfont{myfont}{myrawfont,unilatin option smallcaps}{ut1}{UT1}{myfam}{m}{sc}{}
+
+-- resetmu.mtx. This file is necessary for installing mixed Latin and
+Greek fonts. It takes the "mu" glyph, creates from it another glyph,
+named "mu1", and then unsets "mu" itself. It should be loaded immediately
+after your Latin font metrics file, but before Greek one. So the "mu"
+glyph from your Latin font will be used only in the Unicode position 0x00b5,
+(micro sign), but will not replace another "mu" from the Greek
+font, which should be included at 0x0385.
+
+-- ut1.etx. This file describes the Unicode-based encoding vector for
+Omega's virtual fonts. Currently the following Unicode ranges are
+supported: Latin-1 Supplement, Latin Extended-A, Basic Greek, Extended
+Greek and Cyrillic. Also included some combining diacritical marks,
+General Punctuation characters and some symbols from the TS1 encoding
+(only those existing in Unicode).
+
+-- ut1c.etx. This is a driver file which loads ut1.etx with slightly
+different parameters. It is used for installing faked small capitals
+fonts.
+
+-- oltt.tex. This is sample installation script for Linotype Times Ten,
+Times Ten Cyrillic and Times Ten GreekP families, which demonstrates some
+capacities of the ofntinst package.
+
+OFNTINST v. 0.1 included a special version of the file fontinst.sty
+(called ofntinst.sty), but now I removed it. This file was introduced
+mainly because of one significant bug in the definition for
+\setscalednotglyph. This bug caused fontinst not to report about missing
+glyphs, which is crucial for "large" Unicode fonts, where some glyphs
+surely will be missing. However, this bug is fixed in fontinst 1.926. So
+update your job files if they contain references to ofntinst.sty.
+Unfortunately, removing this file means that the metric files produced by
+ofntinst will have extensions specific for TeX rather than for Omega
+(i.e. *.pl and *.vpl instead of *.opl and *.vpl). However, these files may
+be processed by Omega font utilities (in case they are not broken in your
+installation, see below) anyway.
+
+INSTALLATION AND USAGE
+~~~~~~~~~~~~~~~~~~~~~~
+
+First, put all *.mtx, *.etx, *.sty and *.tex files into some places
+where TeX can find them (maybe, together with the corresponding
+files from the original fontinst package).
+
+Put *.afm files for font families you want to install to a separate
+directory and create a job file (if in trouble, refer to the fontinst
+documentation and to the samples included with this package).
+
+Process this file with Lambda or plain Omega (not with plain TeX or
+LaTeX). Note that you have to process your file with Lambda in case
+you are using Cyrillic fontinst extensions in addition to OFNTINST
+itself.
+
+Use the opl2otf and ovp2ovf utilities to convert your *.opl and *.ovp
+files to the binary format, ready for use with omega. Unfortunately,
+these utilities are broken in teTeX 2 and it looks like nobody plans
+to fix them. Hopefully their old versions, taken from teTeX 1.0.7, should
+work with newer teTeX installations.
+
+You can get nicely formatted sources of *.etx and *.mtx files by
+processing them with lambda. E.g., "lambda ut1.etx" will generate
+"ut1.dvi" which documents the UT1 encoding vector.
+
+Happy TeXing!
+Alexej Kryukov <basileia@yandex.ru>
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/examples/uni/oltt.tex b/fonts/utilities/fontinst-contrib/ofntinst/examples/uni/oltt.tex
new file mode 100644
index 0000000000..264d6dbd47
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/examples/uni/oltt.tex
@@ -0,0 +1,87 @@
+%% This file is part of the OFNTINST project version 0.2.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This is sample installation script for Linotype Times Ten,
+% Times Ten Cyrillic and Times Ten GreekP families.
+% It is supposed that *.afm files are renamed according to
+% standard TeX conventions. Since there are no (yet) standard
+% TeX names for Greek raw codepage, I used the `pg' suffix.
+
+% This file should be processed with Lambda (not LaTeX).
+
+\input{fontinst.sty}
+
+% aliasing.tex is distributed with my grkfinst package.
+% It provides some additional functionality and
+% is useful for installing fonts with non AGL-compliant
+% glyph names
+
+\input{aliasing}
+
+\transformfont{lttr8r}{\reencodefont{8r}{\fromafm{lttr8a}}}
+\transformfont{lttri8r}{\reencodefont{8r}{\fromafm{lttri8a}}}
+\transformfont{lttb8r}{\reencodefont{8r}{\fromafm{lttb8a}}}
+\transformfont{lttbi8r}{\reencodefont{8r}{\fromafm{lttbi8a}}}
+\transformfont{lttro8r}{\slantfont{267}{\frommtx{lttr8r}}}
+\transformfont{lttru8r}{\slantfont{-267}{\frommtx{lttri8r}}}
+\transformfont{lttbo8r}{\slantfont{267}{\frommtx{lttb8r}}}
+\transformfont{lttbu8r}{\slantfont{-267}{\frommtx{lttbi8r}}}
+
+\transformfont{lttrc8r}{\reencodefont{8r}{\fromafm{lttrc8a}}}
+\transformfont{lttrij8r}{\reencodefont{8r}{\fromafm{lttrij8a}}}
+\transformfont{lttbj8r}{\reencodefont{8r}{\fromafm{lttbj8a}}}
+\transformfont{lttbij8r}{\reencodefont{8r}{\fromafm{lttbij8a}}}
+\transformfont{lttroc8r}{\slantfont{267}{\frommtx{lttrc8r}}}
+\transformfont{lttruj8r}{\slantfont{-267}{\frommtx{lttrij8r}}}
+\transformfont{lttboj8r}{\slantfont{267}{\frommtx{lttbj8r}}}
+\transformfont{lttbuj8r}{\slantfont{-267}{\frommtx{lttbij8r}}}
+
+\input{cyralias}
+
+\transformfont{lttro6w}{\slantfont{267}{\frommtx{lttr6w}}}
+\transformfont{lttru6w}{\slantfont{-267}{\frommtx{lttri6w}}}
+\transformfont{lttbo6w}{\slantfont{267}{\frommtx{lttb6w}}}
+\transformfont{lttbu6w}{\slantfont{-267}{\frommtx{lttbi6w}}}
+
+\input{elalias-lt}
+
+\transformfont{lttropg}{\slantfont{267}{\frommtx{lttrpg}}}
+\transformfont{lttrupg}{\slantfont{-267}{\frommtx{lttripg}}}
+\transformfont{lttbopg}{\slantfont{267}{\frommtx{lttbpg}}}
+\transformfont{lttbupg}{\slantfont{-267}{\frommtx{lttbipg}}}
+
+\installfonts
+
+\installfamily{UT1}{ltt}{}
+
+% The file unilatin.mtx is a part of the ofntinst package.
+%
+% The file greek.mtx is a part of my grkfints package.
+% Load it only if you need Greek glyphs.
+%
+% cyrillic.mtx is distributed with the Cyrillic t2 package. Load
+% it only if you want to install a font with Cyrillic glyphs.
+
+\installfont{lttrut}{lttr8r,unsetnum,kernoff,lttrc8r,resetosf,unsetnum,kernon,lttr8r,lttr6w,resetmu,lttrpg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{m}{n}{}
+\installfont{lttriut}{lttri8r,unsetnum,kernoff,lttrij8r,resetosf,unsetnum,kernon,lttri8r,lttri6w,resetmu,lttripg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{m}{it}{}
+\installfont{lttbut}{lttb8r,unsetnum,kernoff,lttbj8r,resetosf,unsetnum,kernon,lttb8r,lttb6w,resetmu,lttbpg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{b}{n}{}
+\installfont{lttbiut}{lttbi8r,unsetnum,kernoff,lttbij8r,resetosf,unsetnum,kernon,lttbi8r,lttbi6w,resetmu,lttbipg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{b}{it}{}
+\installfont{lttrout}{lttro8r,unsetnum,kernoff,lttroc8r,resetosf,unsetnum,kernon,lttro8r,lttro6w,resetmu,lttropg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{m}{sl}{}
+\installfont{lttruut}{lttru8r,unsetnum,kernoff,lttruj8r,resetosf,unsetnum,kernon,lttru8r,lttru6w,resetmu,lttrupg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{m}{ui}{}
+\installfont{lttbout}{lttbo8r,unsetnum,kernoff,lttboj8r,resetosf,unsetnum,kernon,lttbo8r,lttbo6w,resetmu,lttbopg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{b}{sl}{}
+\installfont{lttbuut}{lttbu8r,unsetnum,kernoff,lttbuj8r,resetosf,unsetnum,kernon,lttbu8r,lttbu6w,resetmu,lttbupg,greek-lt,unilatin,cyrillic,greek}{ut1}{UT1}{ltt}{b}{ui}{}
+\installfont{lttrcut}{lttr8r,unsetnum,kernoff,lttrc8r,resetosf,unsetnum,kernon,lttr8r,lttr6w,resetmu,lttrpg,greek-lt,unilatin,cyrillic,greek}{ut1c}{UT1}{ltt}{m}{sc}{}
+\installfont{lttbcut}{lttb8r,unsetnum,kernoff,lttbj8r,resetosf,unsetnum,kernon,lttb8r,lttb6w,resetmu,lttbpg,greek-lt,unilatin,cyrillic,greek}{ut1c}{UT1}{ltt}{b}{sc}{}
+
+\substitutesilent{l}{m}
+\substitutesilent{bx}{b}
+
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/inputs/smblmtx/resetmu.mtx b/fonts/utilities/fontinst-contrib/ofntinst/inputs/smblmtx/resetmu.mtx
new file mode 100644
index 0000000000..922a3f3184
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/inputs/smblmtx/resetmu.mtx
@@ -0,0 +1,41 @@
+%% This file is part of the OFNTINST project version 0.2.1
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002--2004 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{resetmu.mtx} metrics file}
+\author{Alexej Kryukov}
+\date{1 March 2003}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{resetmu.mtx} metrics file,
+used to recode glyph name `mu' to `mu1', which is the name for micro sign
+in the \texttt{ut1.etx} file. This file should be loaded immediately after
+latin font file, so that the micro sign from the 8r encoding could be
+correctly mapped.
+
+\metrics
+
+\ifisglyph{mu}\then
+ \setglyph{mu1}
+ \glyph{mu}{1000}
+ \endsetglyph
+ \setleftrightkerning{mu1}{mu}{1000}
+
+ \unsetglyph{mu}
+ \noleftrightkerning{mu}
+\fi
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1.etx b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1.etx
new file mode 100644
index 0000000000..e2171550eb
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1.etx
@@ -0,0 +1,4054 @@
+%% This file is part of the OFNTINST project version 0.2.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+% This file should be processed with Lambda!
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{omega}
+\usepackage{fontdoc}
+
+\title{The Unicode based encoding vector for $\Omega$}
+\author{Alexej Kryukov}
+\date{10 October 2002 \\
+Version 0.1}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the Unicode based encoding vector for $\Omega$.
+Currently the following Unicode ranges are supported: Latin-1 Supplement,
+Latin Extended-A, Basic Greek, Extended Greek and Cyrillic. Also included
+some combining diacritical marks, General Punctuation characters and
+symbols from \TeX\ TS1 encoding, which exist in Unicode.
+
+\encoding
+
+\needsfontinstversion{1.926}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+\setstr{codingscheme}{UNICODE-BASED ENCODING FOR OMEGA - UT1}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+
+% added by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>
+% 1997/02/07 to calculate values for extra EC fontdimens
+% Amended by SPQR 1997/02/09
+\ifisglyph{X}\then
+ \setint{capheight}{\height{X}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Aring}\then
+ \setint{acccapheight}{\height{Aring}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{p}\then
+ \setint{descender}{\depth{p}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Aring}\then
+ \setint{maxheight}{\height{Aring}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{j}\then
+ \setint{maxdepth}{\depth{j}}
+ \else
+ \setint{maxdepth}{250}
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+% end changes by Thierry
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\fi
+% added by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr> 1997/02/07
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\comment{The following 96 slots, 32--127, are based on standard ASCII.}
+
+\nextslot{"0020}
+\setslot{space}
+ \comment{The space character.}
+\endsetslot
+
+\setslot{exclam}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\setslot{quotedbl}
+ \comment{The `neutral' double quote mark `\,\textquotedbl\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quote mark `\,\textquotesingle\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The period `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon `;'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `\textless'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `\textgreater'.}
+\endsetslot
+
+\setslot{question}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `A'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `B'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `C'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `D'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `E'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `F'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `G'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `H'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `I'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `J'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `K'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `L'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `M'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `N'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `O'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `P'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `Q'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `R'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `S'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `T'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `U'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `V'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `W'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `X'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `Y'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `Z'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique `\textbackslash'.}
+\endsetslot
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{asciicircum}
+ \comment{The ASCII upward-pointing arrow head `\textasciicircum'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{asciigrave}
+ \comment{An ASCII-style grave `\textasciigrave'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `a'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `b'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `c'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `d'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `e'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+ \comment{The letter `f'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `g'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `h'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `i'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `j'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `k'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `l'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `m'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `n'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `o'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `p'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `q'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `r'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `s'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `t'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `u'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `v'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `w'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `x'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `y'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `z'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\textbraceleft'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\textbraceright'.}
+\endsetslot
+
+\setslot{asciitilde}
+ \comment{The ASCII tilde `\textasciitilde'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\nextslot{"00A1}
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `^^a1'.}
+\endsetslot
+
+\setslot{cent}
+ \comment{The cent sign `^^a2'.}
+\endsetslot
+
+\setslot{sterling}
+ \comment{The British currency sign, `^^a3'.}
+\endsetslot
+
+\setslot{currency}
+ \comment{The international currency sign, `^^a4'.}
+\endsetslot
+
+\setslot{yen}
+ \comment{The Japanese currency sign, `^^a5'.}
+\endsetslot
+
+\setslot{brokenbar}
+ \comment{A broken vertical bar, `^^a6',
+ similar to `\textbar' with a gap through the middle.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `^^a7'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\setslot{copyright}
+ \comment{The copyright sign `^^a9',
+ similar to a small `C' enclosed by a circle.}
+\endsetslot
+
+\setslot{ordfeminine}
+ \comment{The raised letter `^^aa'.}
+\endsetslot
+
+\setslot{guillemotleft}
+ \comment{A French double opening quote mark `^^ab',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The logical not sign `^^ac'.}
+\endsetslot
+
+\setslot{hyphen}
+ \comment{This is the \texttt{alternate-hyphen} (n\'ee `softhyphen')
+ slot.}
+\endsetslot
+
+\setslot{registered}
+ \comment{The registered trademark sign `^^ae',
+ similar to a small `R' enclosed by a circle.}
+\endsetslot
+
+\setslot{asciimacron}
+ \comment{An ASCII-style macron `^^af'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{degree}
+ \comment{The degree sign `^^b0'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus sign `^^b1'.}
+\endsetslot
+
+\setslot{twosuperior}
+ \comment{The raised digit `^^b2'.}
+\endsetslot
+
+\setslot{threesuperior}
+ \comment{The raised digit `^^b3'.}
+\endsetslot
+
+\setslot{asciiacute}
+ \comment{An ASCII-style acute `^^b4'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{mu1}
+ \comment{The lowercase Greek letter `^^b5', intended
+ for use as a prefix `micro' in physical units.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph mark `^^b6'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered period `^^b7'.}
+\endsetslot
+
+\setslot{\lc{Cedilla}{cedilla}}
+ \comment{The cedilla accent `\c{}'.}
+\endsetslot
+
+\setslot{onesuperior}
+ \comment{The raised digit `^^b9'.}
+\endsetslot
+
+\setslot{ordmasculine}
+ \comment{The raised letter `^^ba'.}
+\endsetslot
+
+\setslot{guillemotright}
+ \comment{A French double closing quote mark `^^bb',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{onequarter}
+ \comment{The fraction `^^bc'.}
+\endsetslot
+
+\setslot{onehalf}
+ \comment{The fraction `^^bd'.}
+\endsetslot
+
+\setslot{threequarters}
+ \comment{The fraction `^^be'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `^^bf'.}
+\endsetslot
+
+\setslot{\uctop{Agrave}{agrave}}
+ \comment{The letter `\`A'.}
+\endsetslot
+
+\setslot{\uctop{Aacute}{aacute}}
+ \comment{The letter `\'A'.}
+\endsetslot
+
+\setslot{\uctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^A'.}
+\endsetslot
+
+\setslot{\uctop{Atilde}{atilde}}
+ \comment{The letter `\~A'.}
+\endsetslot
+
+\setslot{\uctop{Adieresis}{adieresis}}
+ \comment{The letter `\"A'.}
+\endsetslot
+
+\setslot{\uctop{Aring}{aring}}
+ \comment{The letter `\r A'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'.
+ This is a single letter, and should not be faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c C'.}
+\endsetslot
+
+\setslot{\uctop{Egrave}{egrave}}
+ \comment{The letter `\`E'.}
+\endsetslot
+
+\setslot{\uctop{Eacute}{eacute}}
+ \comment{The letter `\'E'.}
+\endsetslot
+
+\setslot{\uctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^E'.}
+\endsetslot
+
+\setslot{\uctop{Edieresis}{edieresis}}
+ \comment{The letter `\"E'.}
+\endsetslot
+
+\setslot{\uctop{Igrave}{igrave}}
+ \comment{The letter `\`I'.}
+\endsetslot
+
+\setslot{\uctop{Iacute}{iacute}}
+ \comment{The letter `\'I'.}
+\endsetslot
+
+\setslot{\uctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^I'.}
+\endsetslot
+
+\setslot{\uctop{Idieresis}{idieresis}}
+ \comment{The letter `\"I'.}
+\endsetslot
+
+\setslot{\uc{Eth}{eth}}
+ \comment{The Icelandic capital letter `Eth' similar to a `D'
+ with a horizontal bar through the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Ntilde}{ntilde}}
+ \comment{The letter `\~N'.}
+\endsetslot
+
+\setslot{\uctop{Ograve}{ograve}}
+ \comment{The letter `\`O'.}
+\endsetslot
+
+\setslot{\uctop{Oacute}{oacute}}
+ \comment{The letter `\'O'.}
+\endsetslot
+
+\setslot{\uctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^O'.}
+\endsetslot
+
+\setslot{\uctop{Otilde}{otilde}}
+ \comment{The letter `\~O'.}
+\endsetslot
+
+\setslot{\uctop{Odieresis}{odieresis}}
+ \comment{The letter `\"O'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication sign `^^d7'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\O'.}
+\endsetslot
+
+\setslot{\uctop{Ugrave}{ugrave}}
+ \comment{The letter `\`U'.}
+\endsetslot
+
+\setslot{\uctop{Uacute}{uacute}}
+ \comment{The letter `\'U'.}
+\endsetslot
+
+\setslot{\uctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^U'.}
+\endsetslot
+
+\setslot{\uctop{Udieresis}{udieresis}}
+ \comment{The letter `\"U'.}
+\endsetslot
+
+\setslot{\uctop{Yacute}{yacute}}
+ \comment{The letter `\'Y'.}
+\endsetslot
+
+\setslot{\uc{Thorn}{thorn}}
+ \comment{The Icelandic capital letter `Thorn', similar to a `P'
+ with the bowl moved down. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lctop{Agrave}{agrave}}
+ \comment{The letter `\`a'.}
+\endsetslot
+
+\setslot{\lctop{Aacute}{aacute}}
+ \comment{The letter `\'a'.}
+\endsetslot
+
+\setslot{\lctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^a'.}
+\endsetslot
+
+\setslot{\lctop{Atilde}{atilde}}
+ \comment{The letter `\~a'.}
+\endsetslot
+
+\setslot{\lctop{Adieresis}{adieresis}}
+ \comment{The letter `\"a'.}
+\endsetslot
+
+\setslot{\lctop{Aring}{aring}}
+ \comment{The letter `\r a'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'.
+ This is a single letter, and should not be faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c c'.}
+\endsetslot
+
+\setslot{\lctop{Egrave}{egrave}}
+ \comment{The letter `\`e'.}
+\endsetslot
+
+\setslot{\lctop{Eacute}{eacute}}
+ \comment{The letter `\'e'.}
+\endsetslot
+
+\setslot{\lctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^e'.}
+\endsetslot
+
+\setslot{\lctop{Edieresis}{edieresis}}
+ \comment{The letter `\"e'.}
+\endsetslot
+
+\setslot{\lctop{Igrave}{igrave}}
+ \comment{The letter `\`\i'.}
+\endsetslot
+
+\setslot{\lctop{Iacute}{iacute}}
+ \comment{The letter `\'\i'.}
+\endsetslot
+
+\setslot{\lctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^\i'.}
+\endsetslot
+
+\setslot{\lctop{Idieresis}{idieresis}}
+ \comment{The letter `\"\i'.}
+\endsetslot
+
+\setslot{\lc{Eth}{eth}}
+ \comment{The Icelandic lowercase letter `eth' similar to a
+ `$\partial$' with an oblique bar through the stem. It is
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ntilde}{ntilde}}
+ \comment{The letter `\~n'.}
+\endsetslot
+
+\setslot{\lctop{Ograve}{ograve}}
+ \comment{The letter `\`o'.}
+\endsetslot
+
+\setslot{\lctop{Oacute}{oacute}}
+ \comment{The letter `\'o'.}
+\endsetslot
+
+\setslot{\lctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^o'.}
+\endsetslot
+
+\setslot{\lctop{Otilde}{otilde}}
+ \comment{The letter `\~o'.}
+\endsetslot
+
+\setslot{\lctop{Odieresis}{odieresis}}
+ \comment{The letter `\"o'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division sign `^^f7'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\lctop{Ugrave}{ugrave}}
+ \comment{The letter `\`u'.}
+\endsetslot
+
+\setslot{\lctop{Uacute}{uacute}}
+ \comment{The letter `\'u'.}
+\endsetslot
+
+\setslot{\lctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^u'.}
+\endsetslot
+
+\setslot{\lctop{Udieresis}{udieresis}}
+ \comment{The letter `\"u'.}
+\endsetslot
+
+\setslot{\lctop{Yacute}{yacute}}
+ \comment{The letter `\'y'.}
+\endsetslot
+
+\setslot{\lc{Thorn}{thorn}}
+ \comment{The Icelandic lowercase letter `thorn', similar to a `p'
+ with an ascender rising from the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"y'.}
+\endsetslot
+
+\setslot{\uctop{Amacron}{amacron}}
+ \comment{The letter `\= A'.}
+\endsetslot
+
+\setslot{\lctop{Amacron}{amacron}}
+ \comment{The letter `\= a'.}
+\endsetslot
+
+\setslot{\uctop{Abreve}{abreve}}
+ \comment{The letter `\u A'.}
+\endsetslot
+
+\setslot{\lctop{Abreve}{abreve}}
+ \comment{The letter `\u a'.}
+\endsetslot
+
+\setslot{\uc{Aogonek}{aogonek}}
+ \comment{The letter `\k A'.}
+\endsetslot
+
+\setslot{\lc{Aogonek}{aogonek}}
+ \comment{The letter `\k a'.}
+\endsetslot
+
+\setslot{\uctop{Cacute}{cacute}}
+ \comment{The letter `\' C'.}
+\endsetslot
+
+\setslot{\lctop{Cacute}{cacute}}
+ \comment{The letter `\' c'.}
+\endsetslot
+
+\setslot{\uctop{Ccircumflex}{ccircumflex}}
+ \comment{The letter `\^ C'.}
+\endsetslot
+
+\setslot{\lctop{Ccircumflex}{ccircumflex}}
+ \comment{The letter `\^ c'.}
+\endsetslot
+
+\setslot{\uctop{Cdotaccent}{cdotaccent}}
+ \comment{The letter `\. C'.}
+\endsetslot
+
+\setslot{\lctop{Cdotaccent}{cdotaccent}}
+ \comment{The letter `\. c'.}
+\endsetslot
+
+\setslot{\uctop{Ccaron}{ccaron}}
+ \comment{The letter `\v C'.}
+\endsetslot
+
+\setslot{\lctop{Ccaron}{ccaron}}
+ \comment{The letter `\v c'.}
+\endsetslot
+
+\setslot{\uctop{Dcaron}{dcaron}}
+ \comment{The letter `\v D'.}
+\endsetslot
+
+\setslot{\lctop{Dcaron}{dcaron}}
+ \comment{The letter `\v d'.}
+\endsetslot
+
+\setslot{\uc{Dcroat}{dcroat}}
+ \comment{The letter `\dj'.}
+\endsetslot
+
+\setslot{\lc{Dcroat}{dcroat}}
+ \comment{The letter `\dj'.}
+\endsetslot
+
+\setslot{\uctop{Emacron}{emacron}}
+ \comment{The letter `\= E'.}
+\endsetslot
+
+\setslot{\lctop{Emacron}{emacron}}
+ \comment{The letter `\= e'.}
+\endsetslot
+
+\setslot{\uctop{Ebreve}{ebreve}}
+ \comment{The letter `\u E'.}
+\endsetslot
+
+\setslot{\lctop{Ebreve}{ebreve}}
+ \comment{The letter `\u e'.}
+\endsetslot
+
+\setslot{\uctop{Edotaccent}{edotaccent}}
+ \comment{The letter `\. E'.}
+\endsetslot
+
+\setslot{\lctop{Edotaccent}{edotaccent}}
+ \comment{The letter `\^ e'.}
+\endsetslot
+
+\setslot{\uc{Eogonek}{eogonek}}
+ \comment{The letter `\k E'.}
+\endsetslot
+
+\setslot{\lc{Eogonek}{eogonek}}
+ \comment{The letter `\k e'.}
+\endsetslot
+
+\setslot{\uctop{Ecaron}{ecaron}}
+ \comment{The letter `\v E'.}
+\endsetslot
+
+\setslot{\lctop{Ecaron}{ecaron}}
+ \comment{The letter `\v e'.}
+\endsetslot
+
+\setslot{\uctop{Gcircumflex}{gcircumflex}}
+ \comment{The letter `\^ G'.}
+\endsetslot
+
+\setslot{\lctop{Gcircumflex}{gcircumflex}}
+ \comment{The letter `\^ g'.}
+\endsetslot
+
+\setslot{\uctop{Gbreve}{gbreve}}
+ \comment{The letter `\u G'.}
+\endsetslot
+
+\setslot{\lctop{Gbreve}{gbreve}}
+ \comment{The letter `\u g'.}
+\endsetslot
+
+\setslot{\uctop{Gdotaccent}{gdotaccent}}
+ \comment{The letter `\. G'.}
+\endsetslot
+
+\setslot{\lctop{Gdotaccent}{gdotaccent}}
+ \comment{The letter `\. g'.}
+\endsetslot
+
+\setslot{\uc{Gcommaaccent}{gcommaaccent}}
+ \comment{The letter `\c G'.}
+\endsetslot
+
+\setslot{\lc{Gcommaaccent}{gcommaaccent}}
+ \comment{The letter `\c g'.}
+\endsetslot
+
+\setslot{\uctop{Hcircumflex}{hcircumflex}}
+ \comment{The letter `\^ H'.}
+\endsetslot
+
+\setslot{\lctop{Hcircumflex}{hcircumflex}}
+ \comment{The letter `\^ h'.}
+\endsetslot
+
+\setslot{\uc{Hbar}{hbar}}
+ \comment{The capital letter `Hbar', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{Hbar}{hbar}}
+ \comment{The small letter `hbar', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\setslot{\uctop{Itilde}{itilde}}
+ \comment{The letter `\~ I'.}
+\endsetslot
+
+\setslot{\lctop{Itilde}{itilde}}
+ \comment{The letter `\~ i'.}
+\endsetslot
+
+\setslot{\uctop{Imacron}{imacron}}
+ \comment{The letter `\= I'.}
+\endsetslot
+
+\setslot{\lctop{Imacron}{imacron}}
+ \comment{The letter `\= i'.}
+\endsetslot
+
+\setslot{\uctop{Ibreve}{ibreve}}
+ \comment{The letter `\u I'.}
+\endsetslot
+
+\setslot{\lctop{Ibreve}{ibreve}}
+ \comment{The letter `\u i'.}
+\endsetslot
+
+\setslot{\uctop{Iogonek}{iogonek}}
+ \comment{The letter `\k I'.}
+\endsetslot
+
+\setslot{\lctop{Iogonek}{iogonek}}
+ \comment{The letter `\k i'.}
+\endsetslot
+
+\setslot{\uctop{Idotaccent}{i}}
+ \comment{The letter `\. I'.}
+\endsetslot
+
+\setslot{\lc{I}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'. Also used in Turkish language.}
+\endsetslot
+
+\setslot{\uclig{IJ}{ij}}
+ \comment{The letter `IJ'. This is a single letter, and in a monowidth
+ font should ideally be one letter wide.}
+\endsetslot
+
+\setslot{\lclig{IJ}{ij}}
+ \comment{The letter `ij'. This is a single letter, and in a monowidth
+ font should ideally be one letter wide.}
+\endsetslot
+
+\setslot{\uctop{Jcircumflex}{jcircumflex}}
+ \comment{The letter `\^ J'.}
+\endsetslot
+
+\setslot{\lctop{Jcircumflex}{jcircumflex}}
+ \comment{The letter `\^ j'.}
+\endsetslot
+
+\setslot{\uc{Kcommaaccent}{kcommaaccent}}
+ \comment{The letter `\c K'.}
+\endsetslot
+
+\setslot{\lc{Kcommaaccent}{kcommaaccent}}
+ \comment{The letter `\c k'.}
+\endsetslot
+
+\setslot{\lc{K}{kra}}
+ \comment{The Greenlandic letter `kra', similar to `k' without
+ ascender. It is unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{\uctop{Lacute}{lacute}}
+ \comment{The letter `\' L'.}
+\endsetslot
+
+\setslot{\lctop{Lacute}{lacute}}
+ \comment{The letter `\' l'.}
+\endsetslot
+
+\setslot{\uc{Lcommaaccent}{lcommaaccent}}
+ \comment{The letter `\c L'.}
+\endsetslot
+
+\setslot{\lc{Lcommaaccent}{lcommaaccent}}
+ \comment{The letter `\c l'.}
+\endsetslot
+
+\setslot{\uc{Lcaron}{lcaron}}
+ \comment{The letter `\v L'.}
+\endsetslot
+
+\setslot{\lc{Lcaron}{lcaron}}
+ \comment{The letter `\v l'.}
+\endsetslot
+
+\setslot{\uc{Ldot}{ldot}}
+ \comment{The letter `\d L'.}
+\endsetslot
+
+\setslot{\lc{Ldot}{ldot}}
+ \comment{The letter `\d l'.}
+\endsetslot
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\setslot{\uctop{Nacute}{nacute}}
+ \comment{The letter `\' N'.}
+\endsetslot
+
+\setslot{\lctop{Nacute}{nacute}}
+ \comment{The letter `\' n'.}
+\endsetslot
+
+\setslot{\uc{Ncommaaccent}{ncommaaccent}}
+ \comment{The letter `\c N'.}
+\endsetslot
+
+\setslot{\lc{Ncommaaccent}{ncommaaccent}}
+ \comment{The letter `\c n'.}
+\endsetslot
+
+\setslot{\uctop{Ncaron}{ncaron}}
+ \comment{The letter `\v N'.}
+\endsetslot
+
+\setslot{\lctop{Ncaron}{ncaron}}
+ \comment{The letter `\v n'.}
+\endsetslot
+
+\setslot{\lc{N}{napostrophe}}
+ \comment{The letter `'n'.}
+\endsetslot
+
+\setslot{\uc{Ng}{ng}}
+ \comment{The Sami letter `\NG'. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{Ng}{ng}}
+ \comment{The Sami letter `\ng'. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Omacron}{omacron}}
+ \comment{The letter `\= O'.}
+\endsetslot
+
+\setslot{\lctop{Omacron}{omacron}}
+ \comment{The letter `\= o'.}
+\endsetslot
+
+\setslot{\uctop{Obreve}{obreve}}
+ \comment{The letter `\u O'.}
+\endsetslot
+
+\setslot{\lctop{Obreve}{obreve}}
+ \comment{The letter `\u o'.}
+\endsetslot
+
+\setslot{\uctop{Ohungarumlaut}{ohungarumlaut}}
+ \comment{The letter `\H O'.}
+\endsetslot
+
+\setslot{\lctop{Ohungarumlaut}{ohungarumlaut}}
+ \comment{The letter `\H o'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'.
+ This is a single letter, and should not be faked with `OE'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'.
+ This is a single letter, and should not be faked with `oe'.}
+\endsetslot
+
+\setslot{\uctop{Racute}{racute}}
+ \comment{The letter `\' R'.}
+\endsetslot
+
+\setslot{\lctop{Racute}{racute}}
+ \comment{The letter `\' r'.}
+\endsetslot
+
+\setslot{\uc{Rcommaaccent}{rcommaaccent}}
+ \comment{The letter `\c R'.}
+\endsetslot
+
+\setslot{\lc{Rcommaaccent}{rcommaaccent}}
+ \comment{The letter `\c r'.}
+\endsetslot
+
+\setslot{\uctop{Rcaron}{rcaron}}
+ \comment{The letter `\v R'.}
+\endsetslot
+
+\setslot{\lctop{Rcaron}{rcaron}}
+ \comment{The letter `\v r'.}
+\endsetslot
+
+\setslot{\uctop{Sacute}{sacute}}
+ \comment{The letter `\' S'.}
+\endsetslot
+
+\setslot{\lctop{Sacute}{sacute}}
+ \comment{The letter `\' s'.}
+\endsetslot
+
+\setslot{\uc{Scircumflex}{scircumflex}}
+ \comment{The letter `\^ S'.}
+\endsetslot
+
+\setslot{\lc{Scircumflex}{scircumflex}}
+ \comment{The letter `\^ s'.}
+\endsetslot
+
+\setslot{\uc{Scedilla}{scedilla}}
+ \comment{The letter `\c S'.}
+\endsetslot
+
+\setslot{\lc{Scedilla}{scedilla}}
+ \comment{The letter `\c s'.}
+\endsetslot
+
+\setslot{\uctop{Scaron}{scaron}}
+ \comment{The letter `\v S'.}
+\endsetslot
+
+\setslot{\lctop{Scaron}{scaron}}
+ \comment{The letter `\v s'.}
+\endsetslot
+
+\setslot{\uc{Tcedilla}{tcedilla}}
+ \comment{The letter `\c T'.}
+\endsetslot
+
+\setslot{\lc{Tcedilla}{tcedilla}}
+ \comment{The letter `\c t'.}
+\endsetslot
+
+\setslot{\uctop{Tcaron}{tcaron}}
+ \comment{The letter `\v T'.}
+\endsetslot
+
+\setslot{\lctop{Tcaron}{tcaron}}
+ \comment{The letter `\v t'.}
+\endsetslot
+
+\setslot{\uc{Tbar}{tbar}}
+ \comment{The letter `Tbar', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{Tbar}{tbar}}
+ \comment{The letter `tbar', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{\uctop{Utilde}{utilde}}
+ \comment{The letter `\~ U'.}
+\endsetslot
+
+\setslot{\lctop{Utilde}{utilde}}
+ \comment{The letter `\~ u'.}
+\endsetslot
+
+\setslot{\uctop{Umacron}{umacron}}
+ \comment{The letter `\= U'.}
+\endsetslot
+
+\setslot{\lctop{Umacron}{umacron}}
+ \comment{The letter `\= u'.}
+\endsetslot
+
+\setslot{\uctop{Ubreve}{ubreve}}
+ \comment{The letter `\u U'.}
+\endsetslot
+
+\setslot{\lctop{Ubreve}{ubreve}}
+ \comment{The letter `\u u'.}
+\endsetslot
+
+\setslot{\uctop{Uring}{uring}}
+ \comment{The letter `\r U'.}
+\endsetslot
+
+\setslot{\lctop{Uring}{uring}}
+ \comment{The letter `\r u'.}
+\endsetslot
+
+\setslot{\uctop{Uhungarumlaut}{uhungarumlaut}}
+ \comment{The letter `\H U'.}
+\endsetslot
+
+\setslot{\lctop{Uhungarumlaut}{uhungarumlaut}}
+ \comment{The letter `\H u'.}
+\endsetslot
+
+\setslot{\uctop{Uogonek}{uogonek}}
+ \comment{The letter `\k U'.}
+\endsetslot
+
+\setslot{\lctop{Uogonek}{uogonek}}
+ \comment{The letter `\k u'.}
+\endsetslot
+
+\setslot{\uctop{Wcircumflex}{wcircumflex}}
+ \comment{The letter `\^ W'.}
+\endsetslot
+
+\setslot{\lctop{Wcircumflex}{wcircumflex}}
+ \comment{The letter `\^ w'.}
+\endsetslot
+
+\setslot{\uctop{Ycircumflex}{ycircumflex}}
+ \comment{The letter `\^ Y'.}
+\endsetslot
+
+\setslot{\lctop{Ycircumflex}{ycircumflex}}
+ \comment{The letter `\^ y'.}
+\endsetslot
+
+\setslot{\uctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"Y'.}
+\endsetslot
+
+\setslot{\uctop{Zacute}{zacute}}
+ \comment{The letter `\' Z'.}
+\endsetslot
+
+\setslot{\lctop{Zacute}{zacute}}
+ \comment{The letter `\' z'.}
+\endsetslot
+
+\setslot{\uctop{Zdotaccent}{zdotaccent}}
+ \comment{The letter `\. Z'.}
+\endsetslot
+
+\setslot{\lctop{Zdotaccent}{zdotaccent}}
+ \comment{The letter `\. z'.}
+\endsetslot
+
+\setslot{\uctop{Zcaron}{zcaron}}
+ \comment{The letter `\v Z'.}
+\endsetslot
+
+\setslot{\lctop{Zcaron}{zcaron}}
+ \comment{The letter `\v z'.}
+\endsetslot
+
+\setslot{\lc{S}{longs}}
+ \comment{The latin letter longs.}
+\endsetslot
+
+\nextslot{"0192}
+
+\setslot{florin}
+ \comment{The florin sign, similar to an italic letter `^^^^0192'.}
+\endsetslot
+
+\nextslot{"0232}
+
+\setslot{\uctop{Ymacron}{ymacron}}
+ \comment{The letter `\= Y'.}
+\endsetslot
+
+\setslot{\lctop{Ymacron}{ymacron}}
+ \comment{The letter `\= y'.}
+\endsetslot
+
+\nextslot{"02C6}
+
+\setslot{\lc{Circumflex}{circumflex}}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{\lc{Caron}{caron}}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\nextslot{"02C9}
+
+\setslot{\lc{Macron}{macron}}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\setslot{\lc{Acute}{acute}}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{\lc{Grave}{grave}}
+ \comment{The grave accent `\`{}'.}
+\endsetslot
+
+\nextslot{"02D8}
+
+\setslot{\lc{Breve}{breve}}
+ \comment{The breve accent `\u{}'.}
+\endsetslot
+
+\setslot{\lc{Dotaccent}{dotaccent}}
+ \comment{The dot accent `\.{}'.}
+\endsetslot
+
+\setslot{\lc{Ring}{ring}}
+ \comment{The ring accent `\r{}'.}
+\endsetslot
+
+\setslot{\lc{Ogonek}{ogonek}}
+ \comment{The ogonek accent `\k{}'.}
+\endsetslot
+
+\setslot{\lc{Tilde}{tilde}}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{\lc{Hungarumlaut}{hungarumlaut}}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\nextslot{"0300}
+
+\setslot{\lc{Grave}{grave}}
+ \comment{The grave accent `\`{}'.}
+\endsetslot
+
+\setslot{\lc{Acute}{acute}}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{\lc{Circumflex}{circumflex}}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{\lc{Tilde}{tilde}}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{\lc{Macron}{macron}}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\nextslot{"0306}
+
+\setslot{\lc{Breve}{breve}}
+ \comment{The breve accent `\u{}'.}
+\endsetslot
+
+\setslot{\lc{Dotaccent}{dotaccent}}
+ \comment{The dot accent `\.{}'.}
+\endsetslot
+
+\setslot{\lc{Dieresis}{dieresis}}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\nextslot{"030A}
+
+\setslot{\lc{Ring}{ring}}
+ \comment{The ring accent `\r{}'.}
+\endsetslot
+
+\setslot{\lc{Hungarumlaut}{hungarumlaut}}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\setslot{\lc{Caron}{caron}}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\nextslot{"030F}
+
+\setslot{\lc{Dblgrave}{dblgrave}}
+ \comment{The Cyrillic dblgrave accent `\`{}\`{}'.}
+\endsetslot
+
+\nextslot{"0327}
+
+\setslot{\lc{Cedilla}{cedilla}}
+ \comment{The cedilla accent `\c{}'.}
+\endsetslot
+
+\setslot{\lc{Ogonek}{ogonek}}
+ \comment{The ogonek accent `\k{}'.}
+\endsetslot
+
+\nextslot{"0374}
+
+\setslot{anwtonos}
+ \comment{Greek numeral sign `dexia keraia'.}
+\endsetslot
+
+\setslot{katwtonos}
+ \comment{Greek lower numeral sign `aristera keraia'.}
+\endsetslot
+
+\nextslot{"037A}
+
+\setslot{\lc{iotaadscript}{iotasubscript}}
+ \comment{Greek ypogegrammeni.}
+\endsetslot
+
+\nextslot{"037E}
+
+\setslot{questiongreek}
+ \comment{Greek question mark, similar to english semicolon.}
+\endsetslot
+
+\nextslot{"0384}
+
+\setslot{tonos}
+ \comment{Greek monotonic accent `tonos'.}
+\endsetslot
+
+\setslot{dieresistonos}
+ \comment{Greek monotonic accent `dialytika and tonos'.}
+\endsetslot
+
+\setslot{\uc{Alphatonos}{alphatonos}}
+ \comment{Greek capital letter `Alpha with tonos'.}
+\endsetslot
+
+\setslot{anoteleia}
+ \comment{Greek punctuation mark `anoteleia'}
+\endsetslot
+
+\setslot{\uc{Epsilontonos}{epsilontonos}}
+ \comment{Greek capital letter `Epsilon with tonos'.}
+\endsetslot
+
+\setslot{\uc{Etatonos}{etatonos}}
+ \comment{Greek capital letter `Eta with tonos'.}
+\endsetslot
+
+\setslot{\uc{Iotatonos}{iotatonos}}
+ \comment{Greek capital letter `Iota with tonos'.}
+\endsetslot
+
+\nextslot{"038C}
+
+\setslot{\uc{Omicrontonos}{omicrontonos}}
+ \comment{Greek capital letter `Omicron with tonos'.}
+\endsetslot
+
+\nextslot{"038E}
+
+\setslot{\uc{Upsilontonos}{upsilontonos}}
+ \comment{Greek capital letter `Upsilon with tonos'.}
+\endsetslot
+
+\setslot{\uc{Omegatonos}{omegatonos}}
+ \comment{Greek capital letter `Omega with tonos'.}
+\endsetslot
+
+\nextslot{"0390}
+
+\setslot{\lc{Iotadieresis}{iotadieresistonos}}
+ \comment{The Greek small letter `iota with dialytika and tonos'.}
+\endsetslot
+
+\setslot{\uc{Alpha}{alpha}}
+ \comment{The Greek capital letter `Alpha'.}
+\endsetslot
+
+\setslot{\uc{Beta}{beta}}
+ \comment{The Greek capital letter `Beta'.}
+\endsetslot
+
+\setslot{\uc{Gamma}{gamma}}
+ \comment{The Greek capital letter `Gamma'.}
+\endsetslot
+
+\setslot{\uc{Delta}{delta}}
+ \comment{The Greek capital letter `Delta'.}
+\endsetslot
+
+\setslot{\uc{Epsilon}{epsilon}}
+ \comment{The Greek capital letter `Epsilon'.}
+\endsetslot
+
+\setslot{\uc{Zeta}{zeta}}
+ \comment{The Greek capital letter `Zeta'.}
+\endsetslot
+
+\setslot{\uc{Eta}{eta}}
+ \comment{The Greek capital letter `Eta'.}
+\endsetslot
+
+\setslot{\uc{Theta}{theta}}
+ \comment{The Greek capital letter `Theta'.}
+\endsetslot
+
+\setslot{\uc{Iota}{iota}}
+ \comment{The Greek capital letter `Iota'.}
+\endsetslot
+
+\setslot{\uc{Kappa}{kappa}}
+ \comment{The Greek capital letter `Kappa'.}
+\endsetslot
+
+\setslot{\uc{Lambda}{lambda}}
+ \comment{The Greek capital letter `Lambda'.}
+\endsetslot
+
+\setslot{\uc{Mu}{mu}}
+ \comment{The Greek capital letter `Mu'.}
+\endsetslot
+
+\setslot{\uc{Nu}{nu}}
+ \comment{The Greek capital letter `Nu'.}
+\endsetslot
+
+\setslot{\uc{Xi}{xi}}
+ \comment{The Greek capital letter `Xi'.}
+\endsetslot
+
+\setslot{\uc{Omicron}{omicron}}
+ \comment{The Greek capital letter `Omicron'.}
+\endsetslot
+
+\setslot{\uc{Pi}{pi}}
+ \comment{The Greek capital letter `Pi'.}
+\endsetslot
+
+\setslot{\uc{Rho}{rho}}
+ \comment{The Greek capital letter `Rho'.}
+\endsetslot
+
+\nextslot{"03A3}
+
+\setslot{\uc{Sigma}{sigma}}
+ \comment{The Greek capital letter `Sigma'.}
+\endsetslot
+
+\setslot{\uc{Tau}{tau}}
+ \comment{The Greek capital letter `Tau'.}
+\endsetslot
+
+\setslot{\uc{Upsilon}{upsilon}}
+ \comment{The Greek capital letter `Upsilon'.}
+\endsetslot
+
+\setslot{\uc{Phi}{phi}}
+ \comment{The Greek capital letter `Phi'.}
+\endsetslot
+
+\setslot{\uc{Chi}{chi}}
+ \comment{The Greek capital letter `Chi'.}
+\endsetslot
+
+\setslot{\uc{Psi}{psi}}
+ \comment{The Greek capital letter `Psi'.}
+\endsetslot
+
+\setslot{\uc{Omega}{omega}}
+ \comment{The Greek capital letter `Omega'.}
+\endsetslot
+
+\setslot{\uc{Iotadieresis}{iotadieresis}}
+ \comment{The Greek capital letter `Iota with dialytika'.}
+\endsetslot
+
+\setslot{\uc{Upsilondieresis}{Upsilondieresis}}
+ \comment{The Greek capital letter `Upsilon with dialytika'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphatonos}}
+ \comment{The Greek small letter `alpha with tonos'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilontonos}}
+ \comment{The Greek small letter `epsilon with tonos'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etatonos}}
+ \comment{The Greek small letter `eta with tonos'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotatonos}}
+ \comment{The Greek small letter `iota with tonos'.}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresistonos}}
+ \comment{The Greek small letter `upsilon with dialytika and tonos'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alpha}}
+ \comment{The Greek small letter `alpha'.}
+\endsetslot
+
+\setslot{\lc{Beta}{beta}}
+ \comment{The Greek small letter `beta'.}
+\endsetslot
+
+\setslot{\lc{Gamma}{gamma}}
+ \comment{The Greek small letter `gamma'.}
+\endsetslot
+
+\setslot{\lc{Delta}{delta}}
+ \comment{The Greek small letter `delta'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon}}
+ \comment{The Greek small letter `epsilon'.}
+\endsetslot
+
+\setslot{\lc{Zeta}{zeta}}
+ \comment{The Greek small letter `zeta'.}
+\endsetslot
+
+\setslot{\lc{Eta}{eta}}
+ \comment{The Greek small letter `eta'.}
+\endsetslot
+
+\setslot{\lc{Theta}{theta}}
+ \comment{The Greek small letter `theta'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iota}}
+ \comment{The Greek small letter `iota'.}
+\endsetslot
+
+\setslot{\lc{Kappa}{kappa}}
+ \comment{The Greek small letter `kappa'.}
+\endsetslot
+
+\setslot{\lc{Lambda}{lambda}}
+ \comment{The Greek small letter `lambda'.}
+\endsetslot
+
+\setslot{\lc{Mu}{mu}}
+ \comment{The Greek small letter `mu'.}
+\endsetslot
+
+\setslot{\lc{Nu}{nu}}
+ \comment{The Greek small letter `nu'.}
+\endsetslot
+
+\setslot{\lc{Xi}{xi}}
+ \comment{The Greek small letter `xi'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicron}}
+ \comment{The Greek small letter `omicron'.}
+\endsetslot
+
+\setslot{\lc{Pi}{pi}}
+ \comment{The Greek small letter `pi'.}
+\endsetslot
+
+\setslot{\lc{Rho}{rho}}
+ \comment{The Greek small letter `rho'.}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma1}}
+ \comment{The Greek small letter `final sigma'.}
+\endsetslot
+
+\setslot{\lc{Sigma}{sigma}}
+ \comment{The Greek small letter `sigma'.}
+\endsetslot
+
+\setslot{\lc{Tau}{tau}}
+ \comment{The Greek small letter `tau'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilon}}
+ \comment{The Greek small letter `upsilon'.}
+\endsetslot
+
+\setslot{\lc{Phi}{phi}}
+ \comment{The Greek small letter `phi'.}
+\endsetslot
+
+\setslot{\lc{Chi}{chi}}
+ \comment{The Greek small letter `chi'.}
+\endsetslot
+
+\setslot{\lc{Psi}{psi}}
+ \comment{The Greek small letter `psi'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omega}}
+ \comment{The Greek small letter `omega'.}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresis}}
+ \comment{The Greek small letter `iota with dialytika'.}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresis}}
+ \comment{The Greek small letter `upsilon with dialytika'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicrontonos}}
+ \comment{The Greek small letter `omicron with tonos'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilontonos}}
+ \comment{The Greek small letter `upsilon with tonos'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegatonos}}
+ \comment{The Greek small letter `omega with tonos'.}
+\endsetslot
+
+\nextslot{"03D0}
+
+\setslot{\lc{Beta}{beta1}}
+ \comment{The Greek small letter `curled beta'.}
+\endsetslot
+
+\setslot{\lc{Theta}{theta1}}
+ \comment{The Greek small letter `alternate theta'.}
+\endsetslot
+
+\nextslot{"03D5}
+
+\setslot{\lc{Phi}{phi1}}
+ \comment{The Greek small letter `alternate phi'.}
+\endsetslot
+
+\setslot{\lc{Pi}{pi1}}
+ \comment{The Greek small letter `omega-shaped pi'.}
+\endsetslot
+
+\setslot{greekkai}
+ \comment{The Greek `kai' symbol.}
+\endsetslot
+
+\setslot{\uc{Qoppaarchaic}{qoppaarchaic}}
+ \comment{The Greek capital letter `archaic Qoppa'.}
+\endsetslot
+
+\setslot{\lc{Qoppaarchaic}{qoppaarchaic}}
+ \comment{The Greek small letter `archaic qoppa'.}
+\endsetslot
+
+\setslot{\uc{Stigma}{stigma}}
+ \comment{The Greek capital letter `Stigma'.}
+\endsetslot
+
+\setslot{\lc{Stigma}{stigma}}
+ \comment{The Greek small letter `stigma'.}
+\endsetslot
+
+\setslot{\uc{Digamma}{digamma}}
+ \comment{The Greek capital letter `Digamma'.}
+\endsetslot
+
+\setslot{\lc{Digamma}{digamma}}
+ \comment{The Greek small letter `digamma'.}
+\endsetslot
+
+\setslot{\uc{Qoppa}{qoppa}}
+ \comment{The Greek capital letter `Qoppa'.}
+\endsetslot
+
+\setslot{\lc{Qoppa}{qoppa}}
+ \comment{The Greek small letter `qoppa'.}
+\endsetslot
+
+\setslot{\uc{Sampi}{sampi}}
+ \comment{The Greek capital letter `Sampi'.}
+\endsetslot
+
+\setslot{\lc{Sampi}{sampi}}
+ \comment{The Greek small letter `sampi'.}
+\endsetslot
+
+\nextslot{"03F0}
+
+\setslot{\lc{Kappa}{kappa1}}
+ \comment{The Greek small letter `alternate kappa'.}
+\endsetslot
+
+\setslot{\lc{Rho}{rho1}}
+ \comment{The Greek small letter `alternate rho'.}
+\endsetslot
+
+\setslot{\lc{Sigma}{csigma}}
+ \comment{The Greek small letter `lunate sigma'.}
+\endsetslot
+
+\setslot{yot}
+ \comment{The Greek small letter `yot'.}
+\endsetslot
+
+\setslot{\uc{Theta1}{theta}}
+ \comment{The Greek capital letter `alternate theta'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilon1}}
+ \comment{The Greek small letter `lunate epsilon'.}
+\endsetslot
+
+\nextslot{"0401}
+
+\setslot{\uc{CYRYO}{cyryo}}
+ \comment{Cyrillic capital letter io `^^^^0401'.}
+\endsetslot
+
+\setslot{\uc{CYRDJE}{cyrdje}}
+ \comment{Cyrillic capital letter dje `^^^^0402'.}
+\endsetslot
+
+\setslot{\uc{CYRGJE}{cyrgje}}
+ \comment{Cyrillic capital letter gje `^^^^0403'.}
+\endsetslot
+
+\setslot{\uc{CYRIE}{cyrie}}
+ \comment{Cyrillic capital letter ukrainian ie `^^^^0404'.}
+\endsetslot
+
+\setslot{\uc{CYRDZE}{cyrdze}}
+ \comment{Cyrillic capital letter dze `^^^^0405'.}
+\endsetslot
+
+\setslot{\uc{CYRII}{cyrii}}
+ \comment{Cyrillic capital letter byelorussian-ukrainian i `^^^^0406'.}
+\endsetslot
+
+\setslot{\uc{CYRYI}{cyryi}}
+ \comment{Cyrillic capital letter yi `^^^^0407'.}
+\endsetslot
+
+\setslot{\uc{CYRJE}{cyrje}}
+ \comment{Cyrillic capital letter je `^^^^0408'.}
+\endsetslot
+
+\setslot{\uc{CYRLJE}{cyrlje}}
+ \comment{Cyrillic capital letter lje `^^^^0409'.}
+\endsetslot
+
+\setslot{\uc{CYRNJE}{cyrnje}}
+ \comment{Cyrillic capital letter nje `^^^^040a'.}
+\endsetslot
+
+\setslot{\uc{CYRTSHE}{cyrtshe}}
+ \comment{Cyrillic capital letter tshe `^^^^040b'.}
+\endsetslot
+
+\setslot{\uc{CYRKJE}{cyrkje}}
+ \comment{Cyrillic capital letter kje `^^^^040c'.}
+\endsetslot
+
+\nextslot{"040E}
+
+\setslot{\uc{CYRUSHRT}{cyrushrt}}
+ \comment{Cyrillic capital letter short u `^^^^040e'.}
+\endsetslot
+
+\setslot{\uc{CYRDZHE}{cyrdzhe}}
+ \comment{Cyrillic capital letter dzhe `^^^^040f'.}
+\endsetslot
+
+\setslot{\uc{CYRA}{cyra}}
+ \comment{Cyrillic capital letter a `^^^^0410'.}
+\endsetslot
+
+\setslot{\uc{CYRB}{cyrb}}
+ \comment{Cyrillic capital letter be `^^^^0411'.}
+\endsetslot
+
+\setslot{\uc{CYRV}{cyrv}}
+ \comment{Cyrillic capital letter ve `^^^^0412'.}
+\endsetslot
+
+\setslot{\uc{CYRG}{cyrg}}
+ \comment{Cyrillic capital letter ghe `^^^^0413'.}
+\endsetslot
+
+\setslot{\uc{CYRD}{cyrd}}
+ \comment{Cyrillic capital letter de `^^^^0414'.}
+\endsetslot
+
+\setslot{\uc{CYRE}{cyre}}
+ \comment{Cyrillic capital letter ie `^^^^0415'.}
+\endsetslot
+
+\setslot{\uc{CYRZH}{cyrzh}}
+ \comment{Cyrillic capital letter zhe `^^^^0416'.}
+\endsetslot
+
+\setslot{\uc{CYRZ}{cyrz}}
+ \comment{Cyrillic capital letter ze `^^^^0417'.}
+\endsetslot
+
+\setslot{\uc{CYRI}{cyri}}
+ \comment{Cyrillic capital letter i `^^^^0418'.}
+\endsetslot
+
+\setslot{\uc{CYRISHRT}{cyrishrt}}
+ \comment{Cyrillic capital letter short i `^^^^0419'.}
+\endsetslot
+
+\setslot{\uc{CYRK}{cyrk}}
+ \comment{Cyrillic capital letter ka `^^^^041a'.}
+\endsetslot
+
+\setslot{\uc{CYRL}{cyrl}}
+ \comment{Cyrillic capital letter el `^^^^041b'.}
+\endsetslot
+
+\setslot{\uc{CYRM}{cyrm}}
+ \comment{Cyrillic capital letter em `^^^^041c'.}
+\endsetslot
+
+\setslot{\uc{CYRN}{cyrn}}
+ \comment{Cyrillic capital letter en `^^^^041d'.}
+\endsetslot
+
+\setslot{\uc{CYRO}{cyro}}
+ \comment{Cyrillic capital letter o `^^^^041e'.}
+\endsetslot
+
+\setslot{\uc{CYRP}{cyrp}}
+ \comment{Cyrillic capital letter pe `^^^^041f'.}
+\endsetslot
+
+\setslot{\uc{CYRR}{cyrr}}
+ \comment{Cyrillic capital letter er `^^^^0420'.}
+\endsetslot
+
+\setslot{\uc{CYRS}{cyrs}}
+ \comment{Cyrillic capital letter es `^^^^0421'.}
+\endsetslot
+
+\setslot{\uc{CYRT}{cyrt}}
+ \comment{Cyrillic capital letter te `^^^^0422'.}
+\endsetslot
+
+\setslot{\uc{CYRU}{cyru}}
+ \comment{Cyrillic capital letter u `^^^^0423'.}
+\endsetslot
+
+\setslot{\uc{CYRF}{cyrf}}
+ \comment{Cyrillic capital letter ef `^^^^0424'.}
+\endsetslot
+
+\setslot{\uc{CYRH}{cyrh}}
+ \comment{Cyrillic capital letter ha `^^^^0425'.}
+\endsetslot
+
+\setslot{\uc{CYRC}{cyrc}}
+ \comment{Cyrillic capital letter tse `^^^^0426'.}
+\endsetslot
+
+\setslot{\uc{CYRCH}{cyrch}}
+ \comment{Cyrillic capital letter che `^^^^0427'.}
+\endsetslot
+
+\setslot{\uc{CYRSH}{cyrsh}}
+ \comment{Cyrillic capital letter sha `^^^^0428'.}
+\endsetslot
+
+\setslot{\uc{CYRSHCH}{cyrshch}}
+ \comment{Cyrillic capital letter shcha `^^^^0429'.}
+\endsetslot
+
+\setslot{\uc{CYRHRDSN}{cyrhrdsn}}
+ \comment{Cyrillic capital letter hard sign `^^^^042a'.}
+\endsetslot
+
+\setslot{\uc{CYRERY}{cyrery}}
+ \comment{Cyrillic capital letter yeru `^^^^042b'.}
+\endsetslot
+
+\setslot{\uc{CYRSFTSN}{cyrsftsn}}
+ \comment{Cyrillic capital letter soft sign `^^^^042c'.}
+\endsetslot
+
+\setslot{\uc{CYREREV}{cyrerev}}
+ \comment{Cyrillic capital letter e `^^^^042d'.}
+\endsetslot
+
+\setslot{\uc{CYRYU}{cyryu}}
+ \comment{Cyrillic capital letter yu `^^^^042e'.}
+\endsetslot
+
+\setslot{\uc{CYRYA}{cyrya}}
+ \comment{Cyrillic capital letter ya `^^^^042f'.}
+\endsetslot
+
+\setslot{\lc{CYRA}{cyra}}
+ \comment{Cyrillic small letter a `^^^^0430'.}
+\endsetslot
+
+\setslot{\lc{CYRB}{cyrb}}
+ \comment{Cyrillic small letter be `^^^^0431'.}
+\endsetslot
+
+\setslot{\lc{CYRV}{cyrv}}
+ \comment{Cyrillic small letter ve `^^^^0432'.}
+\endsetslot
+
+\setslot{\lc{CYRG}{cyrg}}
+ \comment{Cyrillic small letter ghe `^^^^0433'.}
+\endsetslot
+
+\setslot{\lc{CYRD}{cyrd}}
+ \comment{Cyrillic small letter de `^^^^0434'.}
+\endsetslot
+
+\setslot{\lc{CYRE}{cyre}}
+ \comment{Cyrillic small letter ie `^^^^0435'.}
+\endsetslot
+
+\setslot{\lc{CYRZH}{cyrzh}}
+ \comment{Cyrillic small letter zhe `^^^^0436'.}
+\endsetslot
+
+\setslot{\lc{CYRZ}{cyrz}}
+ \comment{Cyrillic small letter ze `^^^^0437'.}
+\endsetslot
+
+\setslot{\lc{CYRI}{cyri}}
+ \comment{Cyrillic small letter i `^^^^0438'.}
+\endsetslot
+
+\setslot{\lc{CYRISHRT}{cyrishrt}}
+ \comment{Cyrillic small letter short i `^^^^0439'.}
+\endsetslot
+
+\setslot{\lc{CYRK}{cyrk}}
+ \comment{Cyrillic small letter ka `^^^^043a'.}
+\endsetslot
+
+\setslot{\lc{CYRL}{cyrl}}
+ \comment{Cyrillic small letter el `^^^^043b'.}
+\endsetslot
+
+\setslot{\lc{CYRM}{cyrm}}
+ \comment{Cyrillic small letter em `^^^^043c'.}
+\endsetslot
+
+\setslot{\lc{CYRN}{cyrn}}
+ \comment{Cyrillic small letter en `^^^^043d'.}
+\endsetslot
+
+\setslot{\lc{CYRO}{cyro}}
+ \comment{Cyrillic small letter o `^^^^043e'.}
+\endsetslot
+
+\setslot{\lc{CYRP}{cyrp}}
+ \comment{Cyrillic small letter pe `^^^^043f'.}
+\endsetslot
+
+\setslot{\lc{CYRR}{cyrr}}
+ \comment{Cyrillic small letter er `^^^^0440'.}
+\endsetslot
+
+\setslot{\lc{CYRS}{cyrs}}
+ \comment{Cyrillic small letter es `^^^^0441'.}
+\endsetslot
+
+\setslot{\lc{CYRT}{cyrt}}
+ \comment{Cyrillic small letter te `^^^^0442'.}
+\endsetslot
+
+\setslot{\lc{CYRU}{cyru}}
+ \comment{Cyrillic small letter u `^^^^0443'.}
+\endsetslot
+
+\setslot{\lc{CYRF}{cyrf}}
+ \comment{Cyrillic small letter ef `^^^^0444'.}
+\endsetslot
+
+\setslot{\lc{CYRH}{cyrh}}
+ \comment{Cyrillic small letter ha `^^^^0445'.}
+\endsetslot
+
+\setslot{\lc{CYRC}{cyrc}}
+ \comment{Cyrillic small letter tse `^^^^0446'.}
+\endsetslot
+
+\setslot{\lc{CYRCH}{cyrch}}
+ \comment{Cyrillic small letter che `^^^^0447'.}
+\endsetslot
+
+\setslot{\lc{CYRSH}{cyrsh}}
+ \comment{Cyrillic small letter sha `^^^^0448'.}
+\endsetslot
+
+\setslot{\lc{CYRSHCH}{cyrshch}}
+ \comment{Cyrillic small letter shcha `^^^^0449'.}
+\endsetslot
+
+\setslot{\lc{CYRHRDSN}{cyrhrdsn}}
+ \comment{Cyrillic small letter hard sign `^^^^044a'.}
+\endsetslot
+
+\setslot{\lc{CYRERY}{cyrery}}
+ \comment{Cyrillic small letter yeru `^^^^044b'.}
+\endsetslot
+
+\setslot{\lc{CYRSFTSN}{cyrsftsn}}
+ \comment{Cyrillic small letter soft sign `^^^^044c'.}
+\endsetslot
+
+\setslot{\lc{CYREREV}{cyrerev}}
+ \comment{Cyrillic small letter e `^^^^044d'.}
+\endsetslot
+
+\setslot{\lc{CYRYU}{cyryu}}
+ \comment{Cyrillic small letter yu `^^^^044e'.}
+\endsetslot
+
+\setslot{\lc{CYRYA}{cyrya}}
+ \comment{Cyrillic small letter ya `^^^^044f'.}
+\endsetslot
+
+\nextslot{"0451}
+
+\setslot{\lc{CYRYO}{cyryo}}
+ \comment{Cyrillic small letter io `^^^^0451'.}
+\endsetslot
+
+\setslot{\lc{CYRDJE}{cyrdje}}
+ \comment{Cyrillic small letter dje `^^^^0452'.}
+\endsetslot
+
+\setslot{\lc{CYRGJE}{cyrgje}}
+ \comment{Cyrillic small letter gje `^^^^0453'.}
+\endsetslot
+
+\setslot{\lc{CYRIE}{cyrie}}
+ \comment{Cyrillic small letter ukrainian ie `^^^^0454'.}
+\endsetslot
+
+\setslot{\lc{CYRDZE}{cyrdze}}
+ \comment{Cyrillic small letter dze `^^^^0455'.}
+\endsetslot
+
+\setslot{\lc{CYRII}{cyrii}}
+ \comment{Cyrillic small letter byelorussian-ukrainian i `^^^^0456'.}
+\endsetslot
+
+\setslot{\lc{CYRYI}{cyryi}}
+ \comment{Cyrillic small letter yi `^^^^0457'.}
+\endsetslot
+
+\setslot{\lc{CYRJE}{cyrje}}
+ \comment{Cyrillic small letter je `^^^^0458'.}
+\endsetslot
+
+\setslot{\lc{CYRLJE}{cyrlje}}
+ \comment{Cyrillic small letter lje `^^^^0459'.}
+\endsetslot
+
+\setslot{\lc{CYRNJE}{cyrnje}}
+ \comment{Cyrillic small letter nje `^^^^045a'.}
+\endsetslot
+
+\setslot{\lc{CYRTSHE}{cyrtshe}}
+ \comment{Cyrillic small letter tshe `^^^^045b'.}
+\endsetslot
+
+\setslot{\lc{CYRKJE}{cyrkje}}
+ \comment{Cyrillic small letter kje `^^^^045c'.}
+\endsetslot
+
+\nextslot{"045E}
+
+\setslot{\lc{CYRUSHRT}{cyrushrt}}
+ \comment{Cyrillic small letter short u `^^^^045e'.}
+\endsetslot
+
+\setslot{\lc{CYRDZHE}{cyrdzhe}}
+ \comment{Cyrillic small letter dzhe `^^^^045f'.}
+\endsetslot
+
+\nextslot{"0462}
+
+\setslot{\uc{CYRYAT}{cyryat}}
+ \comment{Cyrillic capital letter yat `^^^^0462'.}
+\endsetslot
+
+\setslot{\lc{CYRYAT}{cyryat}}
+ \comment{Cyrillic small letter yat `^^^^0463'.}
+\endsetslot
+
+\nextslot{"046A}
+
+\setslot{\uc{CYRBYUS}{cyrbyus}}
+ \comment{Cyrillic capital letter big yus `^^^^046a'.}
+\endsetslot
+
+\setslot{\lc{CYRBYUS}{cyrbyus}}
+ \comment{Cyrillic small letter big yus `^^^^046b'.}
+\endsetslot
+
+\nextslot{"0472}
+
+\setslot{\uc{CYRFITA}{cyrfita}}
+ \comment{Cyrillic capital letter fita `^^^^0472'.}
+\endsetslot
+
+\setslot{\lc{CYRFITA}{cyrfita}}
+ \comment{Cyrillic small letter fita `^^^^0473'.}
+\endsetslot
+
+\setslot{\uc{CYRIZH}{cyrizh}}
+ \comment{Cyrillic capital letter izhitsa `^^^^0474'.}
+\endsetslot
+
+\setslot{\lc{CYRIZH}{cyrizh}}
+ \comment{Cyrillic small letter izhitsa `^^^^0475'.}
+\endsetslot
+
+\nextslot{"0490}
+
+\setslot{\uc{CYRGUP}{cyrgup}}
+ \comment{Cyrillic capital letter ghe with upturn `^^^^0490'.}
+\endsetslot
+
+\setslot{\lc{CYRGUP}{cyrgup}}
+ \comment{Cyrillic small letter ghe with upturn `^^^^0491'.}
+\endsetslot
+
+\nextslot{"0E3F}
+
+\setslot{baht}
+ \comment{The Baht currency sign `\textbaht', similar to a capital `B'
+ with a vertical bar through the middle.}
+\endsetslot
+
+\nextslot{"1F00}
+
+\setslot{\lc{Alpha}{alphalenis}}
+ \comment{Greek small letter alpha with psili `^^^^1f00'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaasper}}
+ \comment{Greek small letter alpha with dasia `^^^^1f01'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphalenisgrave}}
+ \comment{Greek small letter alpha with psili and varia `^^^^1f02'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaaspergrave}}
+ \comment{Greek small letter alpha with dasia and varia `^^^^1f03'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphalenisacute}}
+ \comment{Greek small letter alpha with psili and oxia `^^^^1f04'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaasperacute}}
+ \comment{Greek small letter alpha with dasia and oxia `^^^^1f05'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaleniscircum}}
+ \comment{Greek small letter alpha with psili and perispomeni `^^^^1f06'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaaspercircum}}
+ \comment{Greek small letter alpha with dasia and perispomeni `^^^^1f07'.}
+\endsetslot
+
+\setslot{\uc{Alphalenis}{alphalenis}}
+ \comment{Greek capital letter Alpha with psili `^^^^1f08'.}
+\endsetslot
+
+\setslot{\uc{Alphaasper}{alphaasper}}
+ \comment{Greek capital letter Alpha with dasia `^^^^1f09'.}
+\endsetslot
+
+\setslot{\uc{Alphalenisgrave}{alphalenisgrave}}
+ \comment{Greek capital letter Alpha with psili and varia `^^^^1f0a'.}
+\endsetslot
+
+\setslot{\uc{Alphaaspergrave}{alphaaspergrave}}
+ \comment{Greek capital letter Alpha with dasia and varia `^^^^1f0b'.}
+\endsetslot
+
+\setslot{\uc{Alphalenisacute}{alphalenisacute}}
+ \comment{Greek capital letter Alpha with psili and oxia `^^^^1f0c'.}
+\endsetslot
+
+\setslot{\uc{Alphaasperacute}{alphaasperacute}}
+ \comment{Greek capital letter Alpha with dasia and oxia `^^^^1f0d'.}
+\endsetslot
+
+\setslot{\uc{Alphaleniscircum}{alphaleniscircum}}
+ \comment{Greek capital letter Alpha with psili and perispomeni `^^^^1f0e'.}
+\endsetslot
+
+\setslot{\uc{Alphaaspercircum}{alphaaspercircum}}
+ \comment{Greek capital letter Alpha with dasia and perispomeni `^^^^1f0f'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonlenis}}
+ \comment{Greek small letter epsilon with psili `^^^^1f10'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonasper}}
+ \comment{Greek small letter epsilon with dasia `^^^^1f11'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonlenisgrave}}
+ \comment{Greek small letter epsilon with psili and varia `^^^^1f12'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonaspergrave}}
+ \comment{Greek small letter epsilon with dasia and varia `^^^^1f13'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonlenisacute}}
+ \comment{Greek small letter epsilon with psili and oxia `^^^^1f14'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonasperacute}}
+ \comment{Greek small letter epsilon with dasia and oxia `^^^^1f15'.}
+\endsetslot
+
+\nextslot{"1F18}
+
+\setslot{\uc{Epsilonlenis}{epsilonlenis}}
+ \comment{Greek capital letter Epsilon with psili `^^^^1f18'.}
+\endsetslot
+
+\setslot{\uc{Epsilonasper}{epsilonasper}}
+ \comment{Greek capital letter Epsilon with dasia `^^^^1f19'.}
+\endsetslot
+
+\setslot{\uc{Epsilonlenisgrave}{epsilonlenisgrave}}
+ \comment{Greek capital letter Epsilon with psili and varia `^^^^1f1a'.}
+\endsetslot
+
+\setslot{\uc{Epsilonaspergrave}{epsilonaspergrave}}
+ \comment{Greek capital letter Epsilon with dasia and varia `^^^^1f1b'.}
+\endsetslot
+
+\setslot{\uc{Epsilonlenisacute}{epsilonlenisacute}}
+ \comment{Greek capital letter Epsilon with psili and oxia `^^^^1f1c'.}
+\endsetslot
+
+\setslot{\uc{Epsilonasperacute}{epsilonasperacute}}
+ \comment{Greek capital letter Epsilon with dasia and oxia `^^^^1f1d'.}
+\endsetslot
+
+\nextslot{"1F20}
+
+\setslot{\lc{Eta}{etalenis}}
+ \comment{Greek small letter eta with psili `^^^^1f20'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaasper}}
+ \comment{Greek small letter eta with dasia `^^^^1f21'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etalenisgrave}}
+ \comment{Greek small letter eta with psili and varia `^^^^1f22'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaaspergrave}}
+ \comment{Greek small letter eta with dasia and varia `^^^^1f23'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etalenisacute}}
+ \comment{Greek small letter eta with psili and oxia `^^^^1f24'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaasperacute}}
+ \comment{Greek small letter eta with dasia and oxia `^^^^1f25'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaleniscircum}}
+ \comment{Greek small letter eta with psili and perispomeni `^^^^1f26'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaaspercircum}}
+ \comment{Greek small letter eta with dasia and perispomeni `^^^^1f27'.}
+\endsetslot
+
+\setslot{\uc{Etalenis}{etalenis}}
+ \comment{Greek capital letter Eta with psili `^^^^1f28'.}
+\endsetslot
+
+\setslot{\uc{Etaasper}{etaasper}}
+ \comment{Greek capital letter Eta with dasia `^^^^1f29'.}
+\endsetslot
+
+\setslot{\uc{Etalenisgrave}{etalenisgrave}}
+ \comment{Greek capital letter Eta with psili and varia `^^^^1f2a'.}
+\endsetslot
+
+\setslot{\uc{Etaaspergrave}{etaaspergrave}}
+ \comment{Greek capital letter Eta with dasia and varia `^^^^1f2b'.}
+\endsetslot
+
+\setslot{\uc{Etalenisacute}{etalenisacute}}
+ \comment{Greek capital letter Eta with psili and oxia `^^^^1f2c'.}
+\endsetslot
+
+\setslot{\uc{Etaasperacute}{etaasperacute}}
+ \comment{Greek capital letter Eta with dasia and oxia `^^^^1f2d'.}
+\endsetslot
+
+\setslot{\uc{Etaleniscircum}{etaleniscircum}}
+ \comment{Greek capital letter Eta with psili and perispomeni `^^^^1f2e'.}
+\endsetslot
+
+\setslot{\uc{Etaaspercircum}{etaaspercircum}}
+ \comment{Greek capital letter Eta with dasia and perispomeni `^^^^1f2f'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotalenis}}
+ \comment{Greek small letter iota with psili `^^^^1f30'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaasper}}
+ \comment{Greek small letter iota with dasia `^^^^1f31'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotalenisgrave}}
+ \comment{Greek small letter iota with psili and varia `^^^^1f32'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaaspergrave}}
+ \comment{Greek small letter iota with dasia and varia `^^^^1f33'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotalenisacute}}
+ \comment{Greek small letter iota with psili and oxia `^^^^1f34'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaasperacute}}
+ \comment{Greek small letter iota with dasia and oxia `^^^^1f35'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaleniscircum}}
+ \comment{Greek small letter iota with psili and perispomeni `^^^^1f36'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaaspercircum}}
+ \comment{Greek small letter iota with dasia and perispomeni `^^^^1f37'.}
+\endsetslot
+
+\setslot{\uc{Iotalenis}{iotalenis}}
+ \comment{Greek capital letter Iota with psili `^^^^1f38'.}
+\endsetslot
+
+\setslot{\uc{Iotaasper}{iotaasper}}
+ \comment{Greek capital letter Iota with dasia `^^^^1f39'.}
+\endsetslot
+
+\setslot{\uc{Iotalenisgrave}{iotalenisgrave}}
+ \comment{Greek capital letter Iota with psili and varia `^^^^1f3a'.}
+\endsetslot
+
+\setslot{\uc{Iotaaspergrave}{iotaaspergrave}}
+ \comment{Greek capital letter Iota with dasia and varia `^^^^1f3b'.}
+\endsetslot
+
+\setslot{\uc{Iotalenisacute}{iotalenisacute}}
+ \comment{Greek capital letter Iota with psili and oxia `^^^^1f3c'.}
+\endsetslot
+
+\setslot{\uc{Iotaasperacute}{iotaasperacute}}
+ \comment{Greek capital letter Iota with dasia and oxia `^^^^1f3d'.}
+\endsetslot
+
+\setslot{\uc{Iotaleniscircum}{iotaleniscircum}}
+ \comment{Greek capital letter Iota with psili and perispomeni `^^^^1f3e'.}
+\endsetslot
+
+\setslot{\uc{Iotaaspercircum}{iotaaspercircum}}
+ \comment{Greek capital letter Iota with dasia and perispomeni `^^^^1f3f'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronlenis}}
+ \comment{Greek small letter omicron with psili `^^^^1f40'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronasper}}
+ \comment{Greek small letter omicron with dasia `^^^^1f41'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronlenisgrave}}
+ \comment{Greek small letter omicron with psili and varia `^^^^1f42'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronaspergrave}}
+ \comment{Greek small letter omicron with dasia and varia `^^^^1f43'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronlenisacute}}
+ \comment{Greek small letter omicron with psili and oxia `^^^^1f44'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronasperacute}}
+ \comment{Greek small letter omicron with dasia and oxia `^^^^1f45'.}
+\endsetslot
+
+\nextslot{"1F48}
+
+\setslot{\uc{Omicronlenis}{omicronlenis}}
+ \comment{Greek capital letter Omicron with psili `^^^^1f48'.}
+\endsetslot
+
+\setslot{\uc{Omicronasper}{omicronasper}}
+ \comment{Greek capital letter Omicron with dasia `^^^^1f49'.}
+\endsetslot
+
+\setslot{\uc{Omicronlenisgrave}{omicronlenisgrave}}
+ \comment{Greek capital letter Omicron with psili and varia `^^^^1f4a'.}
+\endsetslot
+
+\setslot{\uc{Omicronaspergrave}{omicronaspergrave}}
+ \comment{Greek capital letter Omicron with dasia and varia `^^^^1f4b'.}
+\endsetslot
+
+\setslot{\uc{Omicronlenisacute}{omicronlenisacute}}
+ \comment{Greek capital letter Omicron with psili and oxia `^^^^1f4c'.}
+\endsetslot
+
+\setslot{\uc{Omicronasperacute}{omicronasperacute}}
+ \comment{Greek capital letter Omicron with dasia and oxia `^^^^1f4d'.}
+\endsetslot
+
+\nextslot{"1F50}
+
+\setslot{\lc{Upsilon}{upsilonlenis}}
+ \comment{Greek small letter upsilon with psili `^^^^1f50'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonasper}}
+ \comment{Greek small letter upsilon with dasia `^^^^1f51'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonlenisgrave}}
+ \comment{Greek small letter upsilon with psili and varia `^^^^1f52'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonaspergrave}}
+ \comment{Greek small letter upsilon with dasia and varia `^^^^1f53'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonlenisacute}}
+ \comment{Greek small letter upsilon with psili and oxia `^^^^1f54'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonasperacute}}
+ \comment{Greek small letter upsilon with dasia and oxia `^^^^1f55'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonleniscircum}}
+ \comment{Greek small letter upsilon with psili and perispomeni `^^^^1f56'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonaspercircum}}
+ \comment{Greek small letter upsilon with dasia and perispomeni `^^^^1f57'.}
+\endsetslot
+
+\nextslot{"1F59}
+
+\setslot{\uc{Upsilonasper}{upsilonasper}}
+ \comment{Greek capital letter Upsilon with dasia `^^^^1f59'.}
+\endsetslot
+
+\nextslot{"1F5B}
+
+\setslot{\uc{Upsilonaspergrave}{upsilonaspergrave}}
+ \comment{Greek capital letter Upsilon with dasia and varia `^^^^1f5b'.}
+\endsetslot
+
+\nextslot{"1F5D}
+
+\setslot{\uc{Upsilonasperacute}{upsilonasperacute}}
+ \comment{Greek capital letter Upsilon with dasia and oxia `^^^^1f5d'.}
+\endsetslot
+
+\nextslot{"1F5F}
+
+\setslot{\uc{Upsilonaspercircum}{upsilonaspercircum}}
+ \comment{Greek capital letter Upsilon with dasia and perispomeni `^^^^1f5f'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegalenis}}
+ \comment{Greek small letter omega with psili `^^^^1f60'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaasper}}
+ \comment{Greek small letter omega with dasia `^^^^1f61'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegalenisgrave}}
+ \comment{Greek small letter omega with psili and varia `^^^^1f62'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaaspergrave}}
+ \comment{Greek small letter omega with dasia and varia `^^^^1f63'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegalenisacute}}
+ \comment{Greek small letter omega with psili and oxia `^^^^1f64'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaasperacute}}
+ \comment{Greek small letter omega with dasia and oxia `^^^^1f65'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaleniscircum}}
+ \comment{Greek small letter omega with psili and perispomeni `^^^^1f66'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaaspercircum}}
+ \comment{Greek small letter omega with dasia and perispomeni `^^^^1f67'.}
+\endsetslot
+
+\setslot{\uc{Omegalenis}{omegalenis}}
+ \comment{Greek capital letter Omega with psili `^^^^1f68'.}
+\endsetslot
+
+\setslot{\uc{Omegaasper}{omegaasper}}
+ \comment{Greek capital letter Omega with dasia `^^^^1f69'.}
+\endsetslot
+
+\setslot{\uc{Omegalenisgrave}{omegalenisgrave}}
+ \comment{Greek capital letter Omega with psili and varia `^^^^1f6a'.}
+\endsetslot
+
+\setslot{\uc{Omegaaspergrave}{omegaaspergrave}}
+ \comment{Greek capital letter Omega with dasia and varia `^^^^1f6b'.}
+\endsetslot
+
+\setslot{\uc{Omegalenisacute}{omegalenisacute}}
+ \comment{Greek capital letter Omega with psili and oxia `^^^^1f6c'.}
+\endsetslot
+
+\setslot{\uc{Omegaasperacute}{omegaasperacute}}
+ \comment{Greek capital letter Omega with dasia and oxia `^^^^1f6d'.}
+\endsetslot
+
+\setslot{\uc{Omegaleniscircum}{omegaleniscircum}}
+ \comment{Greek capital letter Omega with psili and perispomeni `^^^^1f6e'.}
+\endsetslot
+
+\setslot{\uc{Omegaaspercircum}{omegaaspercircum}}
+ \comment{Greek capital letter Omega with dasia and perispomeni `^^^^1f6f'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphagrave}}
+ \comment{Greek small letter alpha with varia `^^^^1f70'.}
+\endsetslot
+
+\setslot{\lc{Alpha}{alphaacute}}
+ \comment{Greek small letter alpha with oxia `^^^^1f71'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilongrave}}
+ \comment{Greek small letter epsilon with varia `^^^^1f72'.}
+\endsetslot
+
+\setslot{\lc{Epsilon}{epsilonacute}}
+ \comment{Greek small letter epsilon with oxia `^^^^1f73'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etagrave}}
+ \comment{Greek small letter eta with varia `^^^^1f74'.}
+\endsetslot
+
+\setslot{\lc{Eta}{etaacute}}
+ \comment{Greek small letter eta with oxia `^^^^1f75'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotagrave}}
+ \comment{Greek small letter iota with varia `^^^^1f76'.}
+\endsetslot
+
+\setslot{\lc{Iota}{iotaacute}}
+ \comment{Greek small letter iota with oxia `^^^^1f77'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicrongrave}}
+ \comment{Greek small letter omicron with varia `^^^^1f78'.}
+\endsetslot
+
+\setslot{\lc{Omicron}{omicronacute}}
+ \comment{Greek small letter omicron with oxia `^^^^1f79'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilongrave}}
+ \comment{Greek small letter upsilon with varia `^^^^1f7a'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsilonacute}}
+ \comment{Greek small letter upsilon with oxia `^^^^1f7b'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegagrave}}
+ \comment{Greek small letter omega with varia `^^^^1f7c'.}
+\endsetslot
+
+\setslot{\lc{Omega}{omegaacute}}
+ \comment{Greek small letter omega with oxia `^^^^1f7d'.}
+\endsetslot
+
+\nextslot{"1F80}
+
+\setslot{\lc{Alphaiota}{alphaiotalenis}}
+ \comment{Greek small letter alpha with ypogegrammeni
+ and psili `^^^^1f80'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaasper}}
+ \comment{Greek small letter alpha with ypogegrammeni
+ and dasia `^^^^1f81'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotalenisgrave}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ psili and varia `^^^^1f82'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaaspergrave}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ dasia and varia `^^^^1f83'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotalenisacute}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ psili and oxia `^^^^1f84'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaasperacute}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ dasia and oxia `^^^^1f85'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaleniscircum}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ psili and perispomeni `^^^^1f86'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaaspercircum}}
+ \comment{Greek small letter alpha with ypogegrammeni,
+ dasia and perispomeni `^^^^1f87'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotalenis}{alphaiotalenis}}
+ \comment{Greek capital letter Alpha with prosgegrammeni
+ and psili `^^^^1f88'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotaasper}{alphaiotaasper}}
+ \comment{Greek capital letter Alph with prosgegrammeni
+ and dasia `^^^^1f89'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotalenisgrave}{alphaiotalenisgrave}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ psili and varia `^^^^1f8a'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotaaspergrave}{alphaiotaaspergrave}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ dasia and varia `^^^^1f8b'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotalenisacute}{alphaiotalenisacute}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ psili and oxia `^^^^1f8c'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotaasperacute}{alphaiotaasperacute}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ dasia and oxia `^^^^1f8d'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotaleniscircum}{alphaiotaleniscircum}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ psili and perispomeni `^^^^1f8e'.}
+\endsetslot
+
+\setslot{\uc{Alphaiotaaspercircum}{alphaiotaaspercircum}}
+ \comment{Greek capital letter Alpha with prosgegrammeni,
+ dasia and perispomeni `^^^^1f8f'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotalenis}}
+ \comment{Greek small letter eta with ypogegrammeni
+ and psili `^^^^1f90'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaasper}}
+ \comment{Greek small letter eta with ypogegrammeni
+ and dasia `^^^^1f91'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotalenisgrave}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ psili and varia `^^^^1f92'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaaspergrave}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ dasia and varia `^^^^1f93'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotalenisacute}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ psili and oxia `^^^^1f94'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaasperacute}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ dasia and oxia `^^^^1f95'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaleniscircum}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ psili and perispomeni `^^^^1f96'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaaspercircum}}
+ \comment{Greek small letter eta with ypogegrammeni,
+ dasia and perispomeni `^^^^1f97'.}
+\endsetslot
+
+\setslot{\uc{Etaiotalenis}{etaiotalenis}}
+ \comment{Greek capital letter Eta with prosgegrammeni
+ and psili `^^^^1f98'.}
+\endsetslot
+
+\setslot{\uc{Etaiotaasper}{etaiotaasper}}
+ \comment{Greek capital letter Alph with prosgegrammeni
+ and dasia `^^^^1f99'.}
+\endsetslot
+
+\setslot{\uc{Etaiotalenisgrave}{etaiotalenisgrave}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ psili and varia `^^^^1f9a'.}
+\endsetslot
+
+\setslot{\uc{Etaiotaaspergrave}{etaiotaaspergrave}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ dasia and varia `^^^^1f9b'.}
+\endsetslot
+
+\setslot{\uc{Etaiotalenisacute}{etaiotalenisacute}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ psili and oxia `^^^^1f9c'.}
+\endsetslot
+
+\setslot{\uc{Etaiotaasperacute}{etaiotaasperacute}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ dasia and oxia `^^^^1f9d'.}
+\endsetslot
+
+\setslot{\uc{Etaiotaleniscircum}{etaiotaleniscircum}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ psili and perispomeni `^^^^1f9e'.}
+\endsetslot
+
+\setslot{\uc{Etaiotaaspercircum}{etaiotaaspercircum}}
+ \comment{Greek capital letter Eta with prosgegrammeni,
+ dasia and perispomeni `^^^^1f9f'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotalenis}}
+ \comment{Greek small letter omega with ypogegrammeni
+ and psili `^^^^1fa0'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaasper}}
+ \comment{Greek small letter omega with ypogegrammeni
+ and dasia `^^^^1fa1'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotalenisgrave}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ psili and varia `^^^^1fa2'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaaspergrave}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ dasia and varia `^^^^1fa3'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotalenisacute}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ psili and oxia `^^^^1fa4'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaasperacute}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ dasia and oxia `^^^^1fa5'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaleniscircum}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ psili and perispomeni `^^^^1fa6'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaaspercircum}}
+ \comment{Greek small letter omega with ypogegrammeni,
+ dasia and perispomeni `^^^^1fa7'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotalenis}{omegaiotalenis}}
+ \comment{Greek capital letter Omega with prosgegrammeni
+ and psili `^^^^1fa8'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotaasper}{omegaiotaasper}}
+ \comment{Greek capital letter Alph with prosgegrammeni
+ and dasia `^^^^1fa9'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotalenisgrave}{omegaiotalenisgrave}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ psili and varia `^^^^1faa'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotaaspergrave}{omegaiotaaspergrave}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ dasia and varia `^^^^1fab'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotalenisacute}{omegaiotalenisacute}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ psili and oxia `^^^^1fac'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotaasperacute}{omegaiotaasperacute}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ dasia and oxia `^^^^1fad'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotaleniscircum}{omegaiotaleniscircum}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ psili and perispomeni `^^^^1fae'.}
+\endsetslot
+
+\setslot{\uc{Omegaiotaaspercircum}{omegaiotaaspercircum}}
+ \comment{Greek capital letter Omega with prosgegrammeni,
+ dasia and perispomeni `^^^^1faf'.}
+\endsetslot
+
+\setslot{\lc{Alphabreve}{alphabreve}}
+ \comment{Greek small letter alpha with vrachy `^^^^1fb0'.}
+\endsetslot
+
+\setslot{\lc{Alphamacron}{alphamacron}}
+ \comment{Greek small letter alpha with macron `^^^^1fb1'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotagrave}}
+ \comment{Greek small letter alpha with ypogegrammeni
+ and varia `^^^^1fb2'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiota}}
+ \comment{Greek small letter alpha with ypogegrammeni `^^^^1fb3'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotaacute}}
+ \comment{Greek small letter alpha with ypogegrammeni
+ and oxia `^^^^1fb4'.}
+\endsetslot
+
+\nextslot{"1FB6}
+
+\setslot{\lc{Alpha}{alphacircum}}
+ \comment{Greek small letter alpha with perispomeni `^^^^1fb6'.}
+\endsetslot
+
+\setslot{\lc{Alphaiota}{alphaiotacircum}}
+ \comment{Greek small letter alpha with ypogegrammeni
+ and perispomeni `^^^^1fb7'.}
+\endsetslot
+
+\setslot{\uc{Alphabreve}{alphabreve}}
+ \comment{Greek capital letter Alpha with vrachy `^^^^1fb8'.}
+\endsetslot
+
+\setslot{\uc{Alphamacron}{alphamacron}}
+ \comment{Greek capital letter Alpha with macron `^^^^1fb9'.}
+\endsetslot
+
+\setslot{\uc{Alphagrave}{alphagrave}}
+ \comment{Greek capital letter Alpha with varia `^^^^1fba'.}
+\endsetslot
+
+\setslot{\uc{Alphaacute}{alphaacute}}
+ \comment{Greek capital letter Alpha with oxia `^^^^1fbb'.}
+\endsetslot
+
+\setslot{\uc{Alphaiota}{alphaiota}}
+ \comment{Greek capital letter Alpha with prosgegrammeni `^^^^1fbc'.}
+\endsetslot
+
+\setslot{lenis}
+ \comment{Greek coronis, similar to psili `^^^^1fbd'.}
+\endsetslot
+
+\setslot{\uc{iotaadscript}{iotasubscript}}
+ \comment{Greek prosgegrammeni `^^^^1fbe'.}
+\endsetslot
+
+\setslot{lenis}
+ \comment{Greek psili `^^^^1fbf'.}
+\endsetslot
+
+\setslot{circumgreek}
+ \comment{Greek perispomeni `^^^^1fc0'.}
+\endsetslot
+
+\setslot{dieresiscircum}
+ \comment{Greek dialytica and perispomeni `^^^^1fc1'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotagrave}}
+ \comment{Greek small letter eta with ypogegrammeni
+ and varia `^^^^1fc2'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiota}}
+ \comment{Greek small letter eta with ypogegrammeni `^^^^1fc3'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotaacute}}
+ \comment{Greek small letter eta with ypogegrammeni
+ and oxia `^^^^1fc4'.}
+\endsetslot
+
+\nextslot{"1FC6}
+
+\setslot{\lc{Eta}{etacircum}}
+ \comment{Greek small letter eta with perispomeni `^^^^1fc6'.}
+\endsetslot
+
+\setslot{\lc{Etaiota}{etaiotacircum}}
+ \comment{Greek small letter eta with ypogegrammeni
+ and perispomeni `^^^^1fc7'.}
+\endsetslot
+
+\setslot{\uc{Epsilongrave}{epsilongrave}}
+ \comment{Greek capital letter Epsilon with varia `^^^^1fc8'.}
+\endsetslot
+
+\setslot{\uc{Epsilonacute}{epsilonacute}}
+ \comment{Greek capital letter Epsilon with oxia `^^^^1fc9'.}
+\endsetslot
+
+\setslot{\uc{Etagrave}{etagrave}}
+ \comment{Greek capital letter Eta with varia `^^^^1fca'.}
+\endsetslot
+
+\setslot{\uc{Etaacute}{etaacute}}
+ \comment{Greek capital letter Eta with oxia `^^^^1fcb'.}
+\endsetslot
+
+\setslot{\uc{Etaiota}{etaiota}}
+ \comment{Greek capital letter Eta with prosgegrammeni `^^^^1fcc'.}
+\endsetslot
+
+\setslot{lenisgrave}
+ \comment{Greek psili and varia `^^^^1fcd'.}
+\endsetslot
+
+\setslot{lenisacute}
+ \comment{Greek psili and oxia `^^^^1fce'.}
+\endsetslot
+
+\setslot{leniscircum}
+ \comment{Greek psili and perispomeni `^^^^1fcf'.}
+\endsetslot
+
+\setslot{\lc{Iotabreve}{iotabreve}}
+ \comment{Greek small letter iota with vrachy `^^^^1fd0'.}
+\endsetslot
+
+\setslot{\lc{Iotamacron}{iotamacron}}
+ \comment{Greek small letter iota with macron `^^^^1fd1'.}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisgrave}}
+ \comment{Greek small letter iota with dialytica
+ and varia `^^^^1fd2'.}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresisacute}}
+ \comment{Greek small letter iota with dialytica
+ and oxia `^^^^1fd3'.}
+\endsetslot
+
+\nextslot{"1FD6}
+
+\setslot{\lc{Iota}{iotacircum}}
+ \comment{Greek small letter iota with perispomeni `^^^^1fd6'.}
+\endsetslot
+
+\setslot{\lc{Iotadieresis}{iotadieresiscircum}}
+ \comment{Greek small letter iota with dialytica
+ and perispomeni `^^^^1fd7'.}
+\endsetslot
+
+\setslot{\uc{Iotabreve}{iotabreve}}
+ \comment{Greek capital letter Iota with vrachy `^^^^1fd8'.}
+\endsetslot
+
+\setslot{\uc{Iotamacron}{iotamacron}}
+ \comment{Greek capital letter Iota with macron `^^^^1fd9'.}
+\endsetslot
+
+\setslot{\uc{Iotagrave}{iotagrave}}
+ \comment{Greek capital letter Iota with varia `^^^^1fda'.}
+\endsetslot
+
+\setslot{\uc{Iotaacute}{iotaacute}}
+ \comment{Greek capital letter Iota with oxia `^^^^1fdb'.}
+\endsetslot
+
+\nextslot{"1FDD}
+
+\setslot{aspergrave}
+ \comment{Greek dasia and varia `^^^^1fdd'.}
+\endsetslot
+
+\setslot{asperacute}
+ \comment{Greek dasia and oxia `^^^^1fde'.}
+\endsetslot
+
+\setslot{aspercircum}
+ \comment{Greek dasia and perispomeni `^^^^1fdf'.}
+\endsetslot
+
+\setslot{\lc{Upsilonbreve}{upsilonbreve}}
+ \comment{Greek small letter upsilon with vrachy `^^^^1fe0'.}
+\endsetslot
+
+\setslot{\lc{Upsilonmacron}{upsilonmacron}}
+ \comment{Greek small letter upsilon with macron `^^^^1fe1'.}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisgrave}}
+ \comment{Greek small letter upsilon with dialytica
+ and varia `^^^^1fe2'.}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresisacute}}
+ \comment{Greek small letter upsilon with dialytica
+ and oxia `^^^^1fe3'.}
+\endsetslot
+
+\setslot{\lc{Rho}{rholenis}}
+ \comment{Greek small letter rho with psili `^^^^1fe4'.}
+\endsetslot
+
+\setslot{\lc{Rho}{rhoasper}}
+ \comment{Greek small letter rho with dasia `^^^^1fe5'.}
+\endsetslot
+
+\setslot{\lc{Upsilon}{upsiloncircum}}
+ \comment{Greek small letter upsilon with perispomeni `^^^^1fe6'.}
+\endsetslot
+
+\setslot{\lc{Upsilondieresis}{upsilondieresiscircum}}
+ \comment{Greek small letter upsilon with dialytica
+ and perispomeni `^^^^1fe7'.}
+\endsetslot
+
+\setslot{\uc{Upsilonbreve}{upsilonbreve}}
+ \comment{Greek capital letter Upsilon with vrachy `^^^^1fe8'.}
+\endsetslot
+
+\setslot{\uc{Upsilonmacron}{upsilonmacron}}
+ \comment{Greek capital letter Upsilon with macron `^^^^1fe9'.}
+\endsetslot
+
+\setslot{\uc{Upsilongrave}{upsilongrave}}
+ \comment{Greek capital letter Upsilon with varia `^^^^1fea'.}
+\endsetslot
+
+\setslot{\uc{Upsilonacute}{upsilonacute}}
+ \comment{Greek capital letter Upsilon with oxia `^^^^1feb'.}
+\endsetslot
+
+\setslot{\uc{Rhoasper}{rhoasper}}
+ \comment{Greek capital letter rho with dasia `^^^^1fec'.}
+\endsetslot
+
+\setslot{dieresisgravegreek}
+ \comment{Greek dialytica and varia `^^^^1fed'.}
+\endsetslot
+
+\setslot{dieresisacutegreek}
+ \comment{Greek dialytica and oxia `^^^^1fee'.}
+\endsetslot
+
+\setslot{gravegreek}
+ \comment{Greek varia `^^^^1fef'.}
+\endsetslot
+
+\nextslot{"1FF2}
+
+\setslot{\lc{Omegaiota}{omegaiotagrave}}
+ \comment{Greek small letter omega with ypogegrammeni
+ and varia `^^^^1ff2'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiota}}
+ \comment{Greek small letter omega with ypogegrammeni `^^^^1ff3'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotaacute}}
+ \comment{Greek small letter omega with ypogegrammeni
+ and oxia `^^^^1ff4'.}
+\endsetslot
+
+\nextslot{"1FF6}
+
+\setslot{\lc{Omega}{omegacircum}}
+ \comment{Greek small letter omega with perispomeni `^^^^1ff6'.}
+\endsetslot
+
+\setslot{\lc{Omegaiota}{omegaiotacircum}}
+ \comment{Greek small letter omega with ypogegrammeni
+ and perispomeni `^^^^1ff7'.}
+\endsetslot
+
+\setslot{\uc{Omicrongrave}{omicrongrave}}
+ \comment{Greek capital letter Omicron with varia `^^^^1ff8'.}
+\endsetslot
+
+\setslot{\uc{Omicronacute}{omicronacute}}
+ \comment{Greek capital letter Omicron with oxia `^^^^1ff9'.}
+\endsetslot
+
+\setslot{\uc{Omegagrave}{omegagrave}}
+ \comment{Greek capital letter Omega with varia `^^^^1ffa'.}
+\endsetslot
+
+\setslot{\uc{Omegaacute}{omegaacute}}
+ \comment{Greek capital letter Omega with oxia `^^^^1ffb'.}
+\endsetslot
+
+\setslot{\uc{Omegaiota}{omegaiota}}
+ \comment{Greek capital letter Omega with prosgegrammeni `^^^^1ffc'.}
+\endsetslot
+
+\setslot{acutegreek}
+ \comment{Greek oxia `^^^^1ffd'.}
+\endsetslot
+
+\setslot{asper}
+ \comment{Greek dasia `^^^^1ffe'.}
+\endsetslot
+
+% End of the Extended Greek Range
+
+\nextslot{"200C}
+
+\setslot{compwordmark}
+ \comment{An invisible glyph, with zero width and depth, but the
+ height of lowercase letters without ascenders.
+ It is used to stop ligaturing in words like `shelf{}ful'.}
+\endsetslot
+
+\nextslot{"2013}
+
+\setslot{rangedash}
+ \comment{The en-dash `\textendash'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The em-dash `\textemdash'.}
+\endsetslot
+
+\nextslot{"2016}
+
+\setslot{bardbl}
+ \comment{The double vertical bar `^^^^2016'.}
+\endsetslot
+
+\nextslot{"2018}
+
+\setslot{quoteleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+\endsetslot
+
+\setslot{quoteright}
+ \comment{The English closing quote mark `\,\textquoteright\,'.}
+\endsetslot
+
+\setslot{quotesinglbase}
+ \comment{A German single quote mark `\quotesinglbase' similar to a
+ comma, but with different sidebearings.}
+\endsetslot
+
+\nextslot{"201C}
+
+\setslot{quotedblleft}
+ \comment{The English opening double quote mark `\,\textquotedblleft\,'.}
+\endsetslot
+
+\setslot{quotedblright}
+ \comment{The English closing double quote mark `\,\textquotedblright\,'.}
+\endsetslot
+
+\setslot{quotedblbase}
+ \comment{A German double quote mark `\quotedblbase' similar to two
+ commas, but with tighter letterspacing and different sidebearings.}
+\endsetslot
+
+\nextslot{"2020}
+
+\setslot{dagger}
+ \comment{The single dagger `^^^^2020'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger `^^^^2021'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The centered bullet `^^^^2022'.}
+\endsetslot
+
+\nextslot{"2026}
+
+\setslot{ellipsis}
+ \comment{The ellipsis `^^^^2026'.}
+\endsetslot
+
+\nextslot{"2030}
+
+\setslot{perthousand}
+ \comment{The perthousand sign `^^^^2030',
+ similar to `\%' with an extra zero.}
+\endsetslot
+
+\setslot{pertenthousand}
+ \comment{The pertenthousand sign `^^^^2031', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2039}
+
+\setslot{guilsinglleft}
+ \comment{A French single opening quote mark `\guilsinglleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{guilsinglright}
+ \comment{A French single closing quote mark `\guilsinglright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{referencemark}
+ \comment{The reference mark `^^^^203b', similar to
+ a combination of the `multiply' and `divide' symbols.}
+\endsetslot
+
+\nextslot{"203D}
+
+\setslot{interrobang}
+ \comment{The interrobang symbol `^^^^203d', similar to
+ a combination of an exclamation mark and a question mark.}
+\endsetslot
+
+\nextslot{"2044}
+
+\setslot{fraction}
+ \comment{The fraction slash `^^^^2044'.}
+\endsetslot
+
+\setslot{quillbracketleft}
+ \comment{The opening quill bracket `^^^^2045', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{quillbracketright}
+ \comment{The closing quill bracket `^^^^2046', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2052}
+
+\setslot{discount}
+ \comment{The discount sign `\textdiscount', similar to a stylized
+ percent sign, unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"20A0}
+
+\setslot{currency}
+ \comment{The international currency sign, `\textcurrency'.}
+\endsetslot
+
+\setslot{colonmonetary}
+ \comment{The Colon currency sign `^^^^20a1', similar to
+ a capital `C' with a vertical bar through the middle.}
+\endsetslot
+
+\nextslot{"20A4}
+
+\setslot{lira}
+ \comment{The Lira currency sign `^^^^20a4', similar to a sterling
+ sign `\textsterling' with two horizontal bars.}
+\endsetslot
+
+\nextslot{"20A6}
+
+\setslot{naira}
+ \comment{The Naira currency sign `^^^^20a6', similar to a
+ capital `N' with two horizontal bars.}
+\endsetslot
+
+\nextslot{"20A9}
+
+\setslot{won}
+ \comment{The Won currency sign `^^^^20a9', similar to a capital `W'
+ with two horizontal bars.}
+\endsetslot
+
+\nextslot{"20AB}
+
+\setslot{dong}
+ \comment{The Dong currency sign `^^^^20ab', similar to a lowercase
+ `d' with a horizontal bar through the stem and another bar below
+ the letter.}
+\endsetslot
+
+\setslot{euro}
+ \comment{The European currency sign, similar to `^^^^20ac'.}
+\endsetslot
+
+\nextslot{"20B1}
+
+\setslot{peso}
+ \comment{The Peso currency sign `\textpeso', similar to a capital `P'
+ with a horizontal bar through the bowl or below the bowl.}
+\endsetslot
+
+\setslot{guarani}
+ \comment{The Guarani currency sign `\textguarani', similar to
+ a capital `G' with a vertical bar through the middle.}
+\endsetslot
+
+\nextslot{"20DD}
+
+\setslot{bigcircle}
+ \comment{A circle `^^^^25cb', big enough to enclose a letter
+ as in `\textcopyright' or `\textregistered'.}
+\endsetslot
+
+\nextslot{"2103}
+
+\setslot{centigrade}
+ \comment{The degree centigrade symbol `^^^^2103'.}
+\endsetslot
+
+\nextslot{"2116}
+
+\setslot{numero}
+ \comment{The numero sign `^^^^2116', similar to the letter `N'
+ with a raised `o', unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{circledP}
+ \comment{A small letter `P' enclosed by a circle, `^^^^2117',
+ unavailable in most fonts.}
+\endsetslot
+
+\nextslot{"211E}
+
+\setslot{recipe}
+ \comment{The recipe symbol `^^^^211e', similar to a capital `R'
+ with an oblique bar through the tail.}
+\endsetslot
+
+\nextslot{"2120}
+
+\setslot{servicemark}
+ \comment{The service mark sign `^^^^2120', similar to the
+ raised letters `SM', unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2122}
+
+\setslot{trademark}
+ \comment{The trademark sign, similar to the raised letters `TM'.}
+\endsetslot
+
+\nextslot{"2126}
+
+\setslot{Ohm}
+ \comment{The upright Ohm sign `^^^^2126', unavailable in most fonts.
+ Even if it is available in Mac-encoded fonts, it isn't directly
+ accessible in the 8r or 8y encodings.}
+\endsetslot
+
+\setslot{Omegainv}
+ \comment{The inverted Ohm sign `^^^^2127', unavailable in most fonts.}
+\endsetslot
+
+\nextslot{"212E}
+
+\setslot{estimated}
+ \comment{The estimated sign `^^^^212e', similar to an enlarged
+ lowercase `e', unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2190}
+
+\setslot{arrowleft}
+ \comment{A left pointing arrow, `^^^^2190', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{An upwards pointing arrow `^^^^2191', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{A right pointing arrow, `^^^^2192', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{An downwards pointing arrow `^^^^2193', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2212}
+
+\setslot{minus}
+ \comment{The subtraction sign `^^^^2212'.}
+\endsetslot
+
+\nextslot{"2217}
+
+\setslot{asteriskcentered}
+ \comment{The centered asterisk, `^^^^2217'.}
+\endsetslot
+
+\nextslot{"221A}
+
+\setslot{radical}
+ \comment{The radical sign `^^^^221a', unavailable in most fonts.
+ Even if it is available in Mac-encoded fonts, it isn't directly
+ accessible in the 8r or 8y encodings.}
+\endsetslot
+
+\nextslot{"2329}
+
+\setslot{angbracketleft}
+ \comment{The opening angle bracket `^^^^2329', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{angbracketright}
+ \comment{The closing angle bracket `^^^^232a', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{"2422}
+
+\setslot{blank}
+ \comment{The blank indicator `^^^^2422', similar to the letter `b'
+ with an oblique bar throgh the stem.}
+\endsetslot
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `\textvisiblespace'.}
+\endsetslot
+
+\nextslot{"25E6}
+
+\setslot{openbullet}
+ \comment{The centered open bullet `^^^^25e6', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"266A}
+
+\setslot{musicalnote}
+ \comment{A musical note symbol `^^^^266a', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{"301A}
+
+\setslot{openbracketleft}
+ \comment{The opening double square bracket `^^^^301a',
+ unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{openbracketright}
+ \comment{The closing double square bracket `^^^^301b',
+ unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{"EFED}
+
+\setslot{capitaldotaccent}
+ \comment{The dot accent `\capitaldotaccent{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalbreve}
+ \comment{The breve accent `\capitalbreve{}', intended for use with
+ capital letters.}
+\endsetslot
+
+
+\nextslot{"EFF1}
+
+\setslot{capitalcedilla}
+ \comment{The cedilla accent `\capitalcedilla{}', intended for use
+ with capital letters.}
+\endsetslot
+
+\setslot{capitalogonek}
+ \comment{The ogonek accent `\capitalogonek{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalring}
+ \comment{The ring accent `\capitalring{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\nextslot{"EFF5}
+
+\setslot{capitaltilde}
+ \comment{The tilde accent `\capitaltilde{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\nextslot{"EFF7}
+
+\setslot{capitalcircumflex}
+ \comment{The circumflex accent `\capitalcircumflex{}', intended for
+ use with capital letters.}
+\endsetslot
+
+\nextslot{"F6BE}
+
+\setslot{\lc{J}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\nextslot{"F6C4}
+\setslot{\lc{CYRG}{cyrvarg}}
+ \comment{Serbian letter ghe variant,
+ unavailable in most Cyrillic PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{CYRB}{cyrvarb}}
+ \comment{Serbian letter be variant,
+ unavailable in most Cyrillic PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{CYRD}{cyrvard}}
+ \comment{Serbian letter de variant,
+ unavailable in most Cyrillic PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{CYRP}{cyrvarp}}
+ \comment{Serbian letter pe variant,
+ unavailable in most Cyrillic PostScript fonts.}
+\endsetslot
+
+\setslot{\lc{CYRT}{cyrvart}}
+ \comment{Serbian letter te variant,
+ unavailable in most Cyrillic PostScript fonts.}
+\endsetslot
+
+\setslot{capitalacute}
+ \comment{The acute accent `\capitalacute{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalcaron}
+ \comment{The caron or h\'a\v cek accent `\capitalcaron{}', intended
+ for use with capital letters.}
+\endsetslot
+
+\setslot{capitaldieresis}
+ \comment{The umlaut or dieresis accent `\capitaldieresis{}',
+ intended for use with capital letters.}
+\endsetslot
+
+\setslot{capitaldieresisacute}
+ \comment{Capital Dieresis Acute accent}
+\endsetslot
+
+\setslot{capitaldieresisgrave}
+ \comment{Capital Dieresis Grave accent}
+\endsetslot
+
+\setslot{capitalgrave}
+ \comment{The grave accent `\capitalgrave{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalhungarumlaut}
+ \comment{The long Hungarian umlaut `\capitalhungarumlaut{}',
+ intended for use with capital letters.}
+\endsetslot
+
+\setslot{capitalmacron}
+ \comment{The macron accent `\capitalmacron{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalcyrbreve}
+ \comment{Capital Cyrillic Breve}
+\endsetslot
+
+\setslot{capitalcyrflex}
+ \comment{Capital Cyrillic Circumflex, or inverted Breve accent}
+\endsetslot
+
+\setslot{capitaldblgrave}
+ \comment{Capital double Grave accent}
+\endsetslot
+
+\setslot{\lc{cyrBreve}{cyrbreve}}
+ \comment{Cyrillic breve accent}
+\endsetslot
+
+\setslot{\lc{cyrFlex}{cyrflex}}
+ \comment{Cyrillic circumflex, or inverted breve accent}
+\endsetslot
+
+\setslot{\lc{dblGrave}{dblgrave}}
+ \comment{Double grave accent}
+\endsetslot
+
+\setslot{\lc{DieresisAcute}{dieresisacute}}
+ \comment{Dieresis acute accent}
+\endsetslot
+
+\setslot{\lc{DieresisGrave}{dieresisgrave}}
+ \comment{Dieresis grave accent}
+\endsetslot
+
+\nextslot{"F724}
+\setslot{dollaroldstyle}
+ \comment{The oldstyle dollar sign.}
+\endsetslot
+
+\nextslot{"F730}
+\setslot{zerooldstyle}
+ \comment{The oldstyle number `\oldstylenums{0}'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The oldstyle number `\oldstylenums{1}'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The oldstyle number `\oldstylenums{2}'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The oldstyle number `\oldstylenums{3}'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The oldstyle number `\oldstylenums{4}'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The oldstyle number `\oldstylenums{5}'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The oldstyle number `\oldstylenums{6}'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The oldstyle number `\oldstylenums{7}'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The oldstyle number `\oldstylenums{8}'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The oldstyle number `\oldstylenums{9}'.}
+\endsetslot
+
+\nextslot{"F7A2}
+\setslot{centoldstyle}
+ \comment{The oldstyle cent sign.}
+\endsetslot
+
+\nextslot{"FB00}
+
+\setslot{\lclig{FF}{ff}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1c.etx b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1c.etx
new file mode 100644
index 0000000000..b372ec93a9
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unietx/ut1c.etx
@@ -0,0 +1,59 @@
+%% This file is part of the OFNTINST project version 0.2
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002 -- 2003 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+% UT1c.etx -- install a Unicode faked small-caps font
+%
+% This is used exclusively to install faked small-caps fonts;
+% real small caps fonts are installed using the default UT1.etx.
+
+\encoding
+
+% We define the parameters for T1.etx to produce a c&sc font.
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1}
+
+% The default letter spacing is 1/10 of the design size, with small
+% caps 80% the size of large caps.
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{50}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call UT1.etx.
+
+\inputetx{UT1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst-contrib/ofntinst/inputs/unimtx/unilatin.mtx b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unimtx/unilatin.mtx
new file mode 100644
index 0000000000..cc57ea0f92
--- /dev/null
+++ b/fonts/utilities/fontinst-contrib/ofntinst/inputs/unimtx/unilatin.mtx
@@ -0,0 +1,1382 @@
+%% This file is part of the OFNTINST project version 0.2.2
+%% -------------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%% Copyright (C) 2002--2005 by Alexej Kryukov
+%% Please report errors to: A.M. Kryukov <basileia@yandex.ru>
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The {\tt fontinst} unicode glyphs}
+\author{Alexej Kryukov}
+\date{05 October 2002\\
+Version 0.1}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \textsf{fontinst} package
+when generating Unicode fonts. This file, \texttt{unilatin.mtx}, is intended
+for use with normal fonts or with faked small caps fonts generated by
+scaling and applying some letterspacing.
+
+This file uses some ideas from cyrillic.mtx, distributed with cyrillic
+t2 package. However, it doesn't support Cyrillic letters itself. If
+you want to create a Unicode font for Omega with support for Cyrillic
+script, load it together with \texttt{cyrillic.mtx}. You will need also
+\texttt{fnstcor.tex} and \texttt{cyralias.tex} files from t2 package.
+
+\metrics
+
+\needsfontinstversion{1.926}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \ifisglyph{#1-not}\then
+ \moveup{\neg{\depth{#1-not}}}
+ \glyphrule{
+ \width{#1-not}
+ }{
+ \add{\depth{#1-not}}{\height{#1-not}}
+ }
+ \resetitalic{\italic{#1-not}}
+ \moveup{\depth{#1-not}}
+ \else
+ \glyphrule{500}{500}
+ \fi
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% A top accent is set by placing the center of the accent at the given
+% position along the width of the letter, raised up by the difference
+% between the height of the letter and the xheight.
+
+% A c&sc top accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+% A capital top accent glyph is placed using the capital version
+% of the accent, if available.
+
+\setcommand\topaccent#1#2#3#4{
+ \setstr{tmp@a}{#4}
+ \setstr{tmp@lc}{lc}
+ \setstr{tmp@uc}{uc}
+ \setstr{tmp@sc}{sc}
+ \if\str{tmp@a}\str{tmp@uc}
+ \setint{baseheight}{\int{xheight}}
+ \setstr{accentname}{capital#2}
+ \setstr{lettername}{#1}
+ \else\if\str{tmp@a}\str{tmp@sc}
+ \setint{baseheight}{\scale{\int{capheight}}{\int{smallcapsscale}}}
+ \setstr{accentname}{#2small}
+ \setstr{lettername}{#1small}
+ \else
+ \setint{baseheight}{\int{xheight}}
+ \setstr{accentname}{#2}
+ \setstr{lettername}{#1}
+ \fi\fi
+ \push
+ \moveup{\max{0}{\sub{\height{\str{lettername}}}{\int{baseheight}}}}
+ \movert{\add{\sub{\scale{\width{\str{lettername}}}{#3}}{\scale{\width{\str{accentname}}}{500}}}
+ {\scale{\int{italicslant}}{\sub{\height{\str{lettername}}}{\int{baseheight}}}}}
+ \glyph{\str{accentname}}{1000}
+ \pop
+ \glyph{\str{lettername}}{1000}
+ \unsetstr{tmp@a}
+ \unsetstr{tmp@lc}
+ \unsetstr{tmp@uc}
+ \unsetstr{tmp@sc}
+ \unsetstr{accentname}
+ \unsetstr{lettername}
+ \unsetint{baseheight}
+}
+
+% A bottom accent is set by placing the center of the accent at the given
+% position along the width of the letter.
+
+% A c&sc bot accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+% A capital bot accent glyph is placed using the capital version
+% of the accent, if available.
+
+\setcommand\botaccent#1#2#3#4{
+ \setstr{tmp@a}{#4}
+ \setstr{tmp@lc}{lc}
+ \setstr{tmp@uc}{uc}
+ \setstr{tmp@sc}{sc}
+ \if\str{tmp@a}\str{tmp@uc}
+ \setstr{accentname}{capital#2}
+ \setstr{lettername}{#1}
+ \else\if\str{tmp@a}\str{tmp@sc}
+ \setstr{accentname}{#2small}
+ \setstr{lettername}{#1small}
+ \else
+ \setstr{accentname}{#2}
+ \setstr{lettername}{#1}
+ \fi\fi
+ \push
+ \movert{\sub{\scale{\width{\str{lettername}}}{#3}}{\scale{\width{\str{accentname}}}{500}}}
+ \glyph{\str{accentname}}{1000}
+ \pop
+ \glyph{\str{lettername}}{1000}
+ \unsetstr{tmp@a}
+ \unsetstr{tmp@lc}
+ \unsetstr{tmp@uc}
+ \unsetstr{tmp@sc}
+ \unsetstr{accentname}
+ \unsetstr{lettername}
+}
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+}
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled X and an unscaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\sub{\scale{\int{capheight}}{\int{smallcapsscale}}}{\int{xheight}}}
+ \cscglyph{#1}
+ \moveup{\sub{\int{xheight}}{\scale{\int{capheight}}{\int{smallcapsscale}}}}
+}
+
+% If a PostScript font contains specially designed capital accents,
+% they are usually positioned so that their position corresponds to
+% the capital letter height. However, \TeX{} accent positioning engine
+% assumes that the accent as it appears in the font file is properly
+% positioned for a character that is as high as the x-height of the font.
+% So we have to move the accent down by the difference between x and X.
+
+\setcommand\capaccent#1{
+ \moveup{\sub{\int{xheight}}{\int{capheight}}}
+ \glyph{#1}{1000}
+ \moveup{\sub{\int{capheight}}{\int{xheight}}}
+}
+
+\setcommand\uniaccent#1#2#3 {
+ \setstr{tmp@a}{#3}
+ \setstr{tmp@top}{T}
+ \setstr{tmp@bot}{B}
+ \ifisglyph{#1}\then
+ \setglyph{#2small}
+ \if\str{tmp@a}\str{tmp@top}
+ \cscaccent{#1}
+ \else
+ \cscglyph{#1}
+ \fi
+ \endsetglyph
+ \setglyph{#1small}
+ \glyph{#2small}{1000}
+ \endsetglyph
+ \setglyph{capital#1}
+ \ifisglyph{#2}\then
+ \if\str{tmp@a}\str{tmp@top}
+ \capaccent{#2}
+ \else
+ \glyph{#2}{1000}
+ \fi
+ \else
+ \glyph{#1}{1000}
+ \fi
+ \endsetglyph
+ \fi
+ \unfakable{#1}
+ \unsetstr{tmp@a}
+ \unsetstr{tmp@top}
+ \unsetstr{tmp@bot}
+}
+
+\setcommand\uniglyph#1#2#3 {
+ \foreach(temp@a){#2}
+ \ifisglyph{\str{temp@a}}\then
+ \setglyph{#1}
+ \glyph{\str{temp@a}}{1000}
+ \endsetglyph
+ \setleftrightkerning{#1}{\str{temp@a}}{1000}
+ \fi
+ \endfor(temp@a)
+ \unfakable{#1}
+ \csname uni@extra@#3\endcsname{#1}
+}
+\fontinstcc
+\let\uni@extra@\gobble_one
+\normalcc
+\expandafter\def\csname uni@extra@*\endcsname#1{
+ \setglyph{#1small}
+ \cscglyph{#1}
+ \endsetglyph
+ \setleftrightkerning{#1small}{#1}{\int{smallcapskerning}}
+}
+
+\setcommand\unitopaccentglyph#1#2#3#4#5 {
+ \ifisglyph{#2}\then
+ \ifisglyph{#3}\then
+ \csname unitop@extra@#5\endcsname{#1}{#2}{#3}{#4}
+ \else
+ \unfakable{#1}
+ \fi
+ \else
+ \unfakable{#1}
+ \fi
+}
+\expandafter\def\csname unitop@extra@\endcsname#1#2#3#4{
+ \setglyph{#1}
+ \topaccent{#2}{#3}{#4}{lc}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2}{1000}
+}
+\expandafter\def\csname unitop@extra@*\endcsname#1#2#3#4{
+ \setglyph{#1}
+ \topaccent{#2}{#3}{#4}{uc}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2}{1000}
+ \setglyph{#1small}
+ \topaccent{#2}{#3}{#4}{sc}
+ \endsetglyph
+ \setleftrightkerning{#1small}{#1}{\int{smallcapskerning}}
+}
+
+\setcommand\unibotaccentglyph#1#2#3#4#5 {
+ \ifisglyph{#2}\then
+ \ifisglyph{#3}\then
+ \csname unibot@extra@#5\endcsname{#1}{#2}{#3}{#4}
+ \else
+ \unfakable{#1}
+ \fi
+ \else
+ \unfakable{#1}
+ \fi
+}
+\expandafter\def\csname unibot@extra@\endcsname#1#2#3#4{
+ \setglyph{#1}
+ \botaccent{#2}{#3}{#4}{lc}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2}{1000}
+}
+\expandafter\def\csname unibot@extra@*\endcsname#1#2#3#4{
+ \setglyph{#1}
+ \botaccent{#2}{#3}{#4}{uc}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2}{1000}
+ \setglyph{#1small}
+ \botaccent{#2}{#3}{#4}{sc}
+ \endsetglyph
+ \setleftrightkerning{#1small}{#1}{\int{smallcapskerning}}
+}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+\setint{xheight}{\height{x}}
+\setint{capheight}{\height{A}}
+\setint{ascender}{\height{d}}
+\setint{descender}{\depth{g}}
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+\ifisint{monowidth}\then
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}
+ {\div{\scale{\width{x}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+\else
+ \setint{capspacing}{50}
+ \setint{smallcapsextraspace}{0}
+\fi
+
+\ifisint{visiblespace}\then
+ \setint{boundarychar}{\int{visiblespace}}
+\fi
+
+\comment{\section{Kerning}}
+\comment{We have to specially set the kerning only for
+ unfakable glyphs, since usually this operation is
+ performed by the \verb|\unitopaccentglyph| and
+ \verb|\unibotaccentglyph| commands.}
+
+\setleftrightkerning{visiblespace}{space}{1000}
+
+\setleftkerning{hyphenchar}{hyphen}{1000}
+
+\setleftrightkerning{Hbar}{H}{1000}
+\setleftrightkerning{hbar}{h}{1000}
+
+\setleftkerning{IJ}{I}{1000}
+\setrightkerning{IJ}{J}{1000}
+\setleftkerning{ij}{i}{1000}
+\setrightkerning{ij}{j}{1000}
+\setleftrightkerning{dotlessi}{i}{1000}
+\setleftrightkerning{dotlessj}{j}{1000}
+
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftkerning{Lcaron}{L}{1000}
+\setleftkerning{Ldot}{L}{1000}
+\setleftrightkerning{lslash}{l}{1000}
+\setleftkerning{lcaron}{l}{1000}
+\setleftkerning{ldot}{l}{1000}
+
+\setleftkerning{Ng}{N}{1000}
+\setrightkerning{Ng}{J}{1000}
+\setleftkerning{ng}{n}{1000}
+\setrightkerning{ng}{j}{1000}
+
+\setleftrightkerning{Oslash}{O}{1000}
+\setleftrightkerning{oslash}{o}{1000}
+\setleftkerning{OE}{O}{1000}
+\setrightkerning{OE}{E}{1000}
+\setleftkerning{oe}{o}{1000}
+\setrightkerning{oe}{e}{1000}
+
+\setleftrightkerning{SS}{S}{1000}
+\ifoption{smallcaps}\then
+ \setleftrightkerning{germandbls}{s}{1000}
+\fi
+
+\setleftrightkerning{Tbar}{T}{1000}
+\setleftrightkerning{tbar}{t}{1000}
+
+\setleftkerning{ffi}{f}{1000}
+\setleftkerning{ffl}{f}{1000}
+\setleftrightkerning{ff}{f}{1000}
+\setleftkerning{fi}{f}{1000}
+\setleftkerning{fl}{f}{1000}
+
+\setleftkerning{ij}{i}{1000}
+
+\setrightkerning{fi}{i}{1000}
+\setrightkerning{ffi}{i}{1000}
+
+\setrightkerning{ij}{j}{1000}
+
+\setrightkerning{fl}{l}{1000}
+\setrightkerning{ffl}{l}{1000}
+
+\comment{\section{All-caps kerning}}
+
+\setleftrightkerning{dotlessI}{I}{1000}
+\setleftrightkerning{dotlessJ}{J}{1000}
+\setleftrightkerning{FFspaced}{F}{1000}
+\setleftkerning{FIspaced}{F}{1000}
+\setrightkerning{FIspaced}{I}{1000}
+\setleftkerning{FLspaced}{F}{1000}
+\setrightkerning{FLspaced}{L}{1000}
+\setleftkerning{FFIspaced}{F}{1000}
+\setrightkerning{FFIspaced}{I}{1000}
+\setleftkerning{FFLspaced}{F}{1000}
+\setrightkerning{FFLspaced}{L}{1000}
+\setleftkerning{IJspaced}{I}{1000}
+\setrightkerning{IJspaced}{J}{1000}
+\setleftrightkerning{SSspaced}{S}{1000}
+
+\comment{\section{Unfakable glyphs}}
+
+\unfakable{guilsinglleft}
+\unfakable{guilsinglright}
+\unfakable{quotedblleft}
+\unfakable{quotedblright}
+\unfakable{quotedblbase}
+\unfakable{guillemotleft}
+\unfakable{guillemotright}
+\unfakable{endash}
+\unfakable{emdash}
+\unfakable{dotlessi}
+\unfakable{perthousandzero}
+\unfakable{exclam}
+\unfakable{quotedbl}
+\unfakable{numbersign}
+\unfakable{dollar}
+\unfakable{percent}
+\unfakable{ampersand}
+\unfakable{quoteright}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{asterisk}
+\unfakable{plus}
+\unfakable{comma}
+\unfakable{hyphen}
+\unfakable{period}
+\unfakable{slash}
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+\unfakable{zerooldstyle}
+\unfakable{oneoldstyle}
+\unfakable{twooldstyle}
+\unfakable{threeoldstyle}
+\unfakable{fouroldstyle}
+\unfakable{fiveoldstyle}
+\unfakable{sixoldstyle}
+\unfakable{sevenoldstyle}
+\unfakable{eightoldstyle}
+\unfakable{nineoldstyle}
+\unfakable{colon}
+\unfakable{semicolon}
+\unfakable{less}
+\unfakable{equal}
+\unfakable{greater}
+\unfakable{question}
+\unfakable{at}
+\unfakable{bracketleft}
+\unfakable{backslash}
+\unfakable{bracketright}
+\unfakable{asciicircum}
+\unfakable{underscore}
+\unfakable{quoteleft}
+\unfakable{braceleft}
+\unfakable{bar}
+\unfakable{braceright}
+\unfakable{asciitilde}
+\unfakable{section}
+\unfakable{exclamdown}
+\unfakable{questiondown}
+\unfakable{sterling}
+
+\comment{\section{Unfakable glyphs from textcomp.mtx}}
+
+\unfakable{arrowleft}
+\unfakable{arrowright}
+\unfakable{tieaccentlowercase}
+\unfakable{tieaccentcapital}
+\unfakable{newtieaccentlowercase}
+\unfakable{newtieaccentcapital}
+\unfakable{blank}
+\unfakable{hyphendbl}
+\unfakable{angbracketleft}
+\unfakable{angbracketright}
+\unfakable{Omegainv}
+\unfakable{bigcircle}
+\unfakable{openbracketleft} % faked 8r,8y
+\unfakable{openbracketright} % faked 8r,8y
+\unfakable{arrowup}
+\unfakable{arrowdown}
+\unfakable{born}
+\unfakable{divorced}
+\unfakable{died}
+\unfakable{leaf}
+\unfakable{married}
+\unfakable{musicalnote}
+\unfakable{hyphendblchar}
+\unfakable{dagger} % 8r,8y
+\unfakable{daggerdbl} % 8r,8y
+\unfakable{perthousand} % 8r,8y
+\unfakable{bullet} % 8r,8y
+\unfakable{centigrade} % faked 8r,8y
+\unfakable{dollaroldstyle} % 8x (Adobe)
+\unfakable{centoldstyle} % 8x (Adobe)
+\unfakable{florin} % 8r,8y
+\unfakable{colonmonetary} % 8x (Adobe)
+\unfakable{won}
+\unfakable{naira}
+\unfakable{guarani}
+\unfakable{peso}
+\unfakable{lira} % 8x (URW)
+\unfakable{recipe}
+\unfakable{interrobang}
+\unfakable{interrobangdown}
+\unfakable{dong}
+\unfakable{trademark} % 8r,8y
+\unfakable{pertenthousand} % faked 8x
+\unfakable{pilcrow}
+\unfakable{baht}
+\unfakable{numero}
+\unfakable{discount}
+\unfakable{estimated}
+\unfakable{openbullet}
+\unfakable{servicemark}
+\unfakable{quillbracketleft}
+\unfakable{quillbracketright}
+\unfakable{cent} % 8r,8y
+\unfakable{yen} % 8r,8y
+\unfakable{brokenbar} % 8r,8y
+\unfakable{section} % 8r,8y
+\unfakable{copyright} % 8r,8y
+\unfakable{ordfeminine} % 8r,8y
+\unfakable{copyleft}
+\unfakable{logicalnot} % 8r,8y
+\unfakable{circledP}
+\unfakable{registered} % 8r,8y
+\unfakable{degree} % 8r,8y
+\unfakable{plusminus} % 8r,8y
+\unfakable{twosuperior} % 8r,8y
+\unfakable{threesuperior} % 8r,8y
+\unfakable{paragraph} % 8r,8y
+\unfakable{periodcentered} % 8r,8y
+\unfakable{referencemark}
+\unfakable{onesuperior} % 8r,8y
+\unfakable{ordmasculine} % 8r,8y
+\unfakable{radical}
+\unfakable{onequarter} % 8r,8y
+\unfakable{onehalf} % 8r,8y
+\unfakable{threequarters} % 8r,8y
+\unfakable{multiply} % 8r,8y
+\unfakable{divide} % 8r,8y
+\unfakable{currency}
+
+\uniglyph{euro}{Euro}
+\uniglyph{mu1}{mu}
+\uniglyph{Ohm}{Omega}
+
+\comment{\section{Accents}}
+
+\uniaccent{grave}{Grave}{T}
+\uniaccent{acute}{Acute}{T}
+\uniaccent{circumflex}{Circumflex}{T}
+\uniaccent{tilde}{Tilde}{T}
+\uniaccent{dieresis}{Dieresis}{T}
+\uniaccent{hungarumlaut}{Hungarumlaut}{T}
+\uniaccent{ring}{Ring}{T}
+\uniaccent{caron}{Caron}{T}
+\uniaccent{breve}{Breve}{T}
+\uniaccent{macron}{Macron}{T}
+\uniaccent{dotaccent}{Dotaccent}{T}
+\uniaccent{cedilla}{Cedilla}{B}
+\uniaccent{ogonek}{Ogonek}{B}
+\uniaccent{dblgrave}{dblGrave}{T}
+\uniaccent{cyrbreve}{cyrBreve}{T}
+\uniaccent{cyrflex}{cyrFlex}{T}
+\uniaccent{dieresisacute}{DieresisAcute}{T}
+\uniaccent{dieresisgrave}{DieresisGrave}{T}
+
+\comment{\section{ASCII-styled accents}}
+
+\uniglyph{tildelow}{asciitilde}
+\uniglyph{asciigrave}{grave}
+\uniglyph{asciiacute}{acute}
+\uniglyph{asciidieresis}{dieresis}
+\uniglyph{asciibreve}{breve}
+\uniglyph{asciimacron}{macron}
+\uniglyph{asciicaron}{caron}
+
+\ifisglyph{acute}\then
+\setglyph{asciiacutedbl}
+ \ifisint{monowidth}\then
+ \movert{\neg{\scale{\width{acute}}{333}}}
+ \glyph{acute}{1000}
+ \movert{\neg{\scale{\width{acute}}{333}}}
+ \glyph{acute}{1000}
+ \movert{\neg{\scale{\width{acute}}{333}}}
+ \else
+ \glyph{acute}{1000}
+ \movert{\neg{\scale{\width{acute}}{333}}}
+ \glyph{acute}{1000}
+ \fi
+\endsetglyph
+\fi
+
+\ifisglyph{grave}\then
+\setglyph{asciigravedbl}
+ \ifisint{monowidth}\then
+ \movert{\neg{\scale{\width{grave}}{333}}}
+ \glyph{grave}{1000}
+ \movert{\neg{\scale{\width{grave}}{333}}}
+ \glyph{grave}{1000}
+ \movert{\neg{\scale{\width{grave}}{333}}}
+ \else
+ \glyph{grave}{1000}
+ \movert{\neg{\scale{\width{grave}}{333}}}
+ \glyph{grave}{1000}
+ \fi
+\endsetglyph
+\fi
+
+\comment{\section{\TeX nical symbols}}
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \else
+ \movert{\width{i}}
+ \fi
+\endsetglyph
+
+\setglyph{compwordmark}
+ \glyphrule{0}{\int{xheight}}
+\endsetglyph
+\setint{compwordmark-spacing}{0}
+
+\setglyph{quotesinglbase}
+ \glyph{comma}{1000}
+\endsetglyph
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+
+\setglyph{rangedash}
+ \glyph{endash}{1000}
+\endsetglyph
+
+\setglyph{punctdash}
+ \glyph{emdash}{1000}
+\endsetglyph
+
+% CYRILLIC EM DASH
+\setglyph{cyrdash}
+ \glyph{emdash}{1000}
+\endsetglyph
+
+% assumes that 3/4em = 750 and \width{endash} = 500
+\ifisglyph{endash}\then
+ \setglyph{threequartersemdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{endash}{1000}
+ \movert{-250}
+ \glyph{endash}{1000}
+ \fi
+ \endsetglyph
+\fi
+
+% assumes that 2/3em = 667 and \width{endash} = 500
+\ifisglyph{endash}\then
+ \setglyph{twelveudash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{endash}{1000}
+ \movert{-333}
+ \glyph{endash}{1000}
+ \fi
+ \endsetglyph
+\fi
+
+\ifisglyph{bar}\then
+ \setglyph{bardbl}
+ \ifisint{monowidth}\then
+ \movert{\neg{\scale{\width{bar}}{333}}}
+ \glyph{bar}{1000}
+ \movert{\neg{\scale{\width{bar}}{333}}}
+ \glyph{bar}{1000}
+ \movert{\neg{\scale{\width{bar}}{333}}}
+ \else
+ \glyph{bar}{1000}
+ \movert{\neg{\scale{\width{bar}}{333}}}
+ \glyph{bar}{1000}
+ \fi
+ \endsetglyph
+\fi
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+\endsetglyph
+
+\setglyph{ringfitted}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+ \glyph{ring}{1000}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+\endsetglyph
+
+\ifisglyph{asterisk}\then
+ \setglyph{asteriskcentered}
+ \moveup{\depth{asterisk}}
+ \glyph{asterisk}{1000}
+ \moveup{\neg{\depth{asterisk}}}
+ \resetdepth{0}
+ \endsetglyph
+\fi
+
+\setglyph{ellipsis}
+ \ifisint{monowidth}\then
+ \movert{\neg{\scale{\width{period}}{333}}}
+ \glyph{period}{1000}
+ \movert{\neg{\scale{\width{period}}{666}}}
+ \glyph{period}{1000}
+ \movert{\neg{\scale{\width{period}}{666}}}
+ \glyph{period}{1000}
+ \movert{\neg{\scale{\width{period}}{333}}}
+ \else
+ \glyph{period}{1000}
+ \movert{\scale{\int{interword}}{300}}
+ \glyph{period}{1000}
+ \movert{\scale{\int{interword}}{300}}
+ \glyph{period}{1000}
+ \fi
+\endsetglyph
+
+\comment{\section{Latin ligatures}}
+
+\setglyph{fi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{i}}
+ \glyph{i}{1000}
+\endsetglyph
+
+\setglyph{ff}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{f}{1000}
+\endsetglyph
+
+\setglyph{fl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+
+\setglyph{ffi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fi}{1000}
+\endsetglyph
+
+\setglyph{ffl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fl}{1000}
+\endsetglyph
+
+\uniglyph{longs}{}
+
+\comment{\section{Latin letters}}
+
+\uniglyph{A}{}*
+\uniglyph{B}{}*
+\uniglyph{C}{}*
+\uniglyph{D}{}*
+\uniglyph{E}{}*
+\uniglyph{F}{}*
+\uniglyph{G}{}*
+\uniglyph{H}{}*
+\uniglyph{I}{}*
+\uniglyph{J}{}*
+\uniglyph{K}{}*
+\uniglyph{L}{}*
+\uniglyph{M}{}*
+\uniglyph{N}{}*
+\uniglyph{O}{}*
+\uniglyph{P}{}*
+\uniglyph{Q}{}*
+\uniglyph{R}{}*
+\uniglyph{S}{}*
+\uniglyph{T}{}*
+\uniglyph{U}{}*
+\uniglyph{V}{}*
+\uniglyph{W}{}*
+\uniglyph{X}{}*
+\uniglyph{Y}{}*
+\uniglyph{Z}{}*
+\uniglyph{a}{}
+\uniglyph{b}{}
+\uniglyph{c}{}
+\uniglyph{d}{}
+\uniglyph{e}{}
+\uniglyph{f}{}
+\uniglyph{g}{}
+\uniglyph{h}{}
+\uniglyph{i}{}
+\uniglyph{j}{}
+\uniglyph{k}{}
+\uniglyph{l}{}
+\uniglyph{m}{}
+\uniglyph{n}{}
+\uniglyph{o}{}
+\uniglyph{p}{}
+\uniglyph{q}{}
+\uniglyph{r}{}
+\uniglyph{s}{}
+\uniglyph{t}{}
+\uniglyph{u}{}
+\uniglyph{v}{}
+\uniglyph{w}{}
+\uniglyph{x}{}
+\uniglyph{y}{}
+\uniglyph{z}{}
+
+\comment{\section{Latin accented letters}}
+
+\setglyph{lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+\uniglyph{lslash}{}
+
+\setglyph{Lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{L}}
+ \glyph{L}{1000}
+\endsetglyph
+\uniglyph{Lslash}{}*
+
+\uniglyph{Ng}{Eng}*
+\uniglyph{ng}{eng}
+\unitopaccentglyph{Abreve}{A}{breve}{500}*
+\unibotaccentglyph{Aogonek}{A}{ogonek}{900}*
+\unitopaccentglyph{Cacute}{C}{acute}{500}*
+\unitopaccentglyph{Ccaron}{C}{caron}{500}*
+\unitopaccentglyph{Dcaron}{D}{caron}{500}*
+\unitopaccentglyph{Ecaron}{E}{caron}{500}*
+\unibotaccentglyph{Eogonek}{E}{ogonek}{850}*
+\unitopaccentglyph{Gbreve}{G}{breve}{500}*
+\unitopaccentglyph{Lacute}{L}{acute}{250}*
+
+\setglyph{Lcaron}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\unitopaccentglyph{Nacute}{N}{acute}{500}*
+\unitopaccentglyph{Ncaron}{N}{caron}{500}*
+\unitopaccentglyph{Ohungarumlaut}{O}{hungarumlaut}{500}*
+\unitopaccentglyph{Racute}{R}{acute}{500}*
+\unitopaccentglyph{Rcaron}{R}{caron}{500}*
+\unitopaccentglyph{Sacute}{S}{acute}{500}*
+\unitopaccentglyph{Scaron}{S}{caron}{500}*
+\unibotaccentglyph{Scedilla}{S}{cedilla}{500}*
+\unitopaccentglyph{Tcaron}{T}{caron}{500}*
+\unibotaccentglyph{Tcedilla}{T}{cedilla}{500}*
+\unitopaccentglyph{Uhungarumlaut}{U}{hungarumlaut}{500}*
+\unitopaccentglyph{Uring}{U}{ring}{500}*
+\unitopaccentglyph{Ydieresis}{Y}{dieresis}{500}*
+\unitopaccentglyph{Zacute}{Z}{acute}{500}*
+\unitopaccentglyph{Zcaron}{Z}{caron}{500}*
+\unitopaccentglyph{Zdotaccent}{Z}{dotaccent}{500}*
+
+\setglyph{IJ}
+ \glyph{I}{1000}
+ \movert{\kerning{I}{J}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\unitopaccentglyph{Idotaccent}{I}{dotaccent}{500}*
+\uniglyph{Dcroat}{Eth}*
+
+\ifoption{smallcaps}\then
+ \uniglyph{dbar}{eth}
+\else
+ \setglyph{dbar}
+ \push
+ \movert{\sub{\width{d}}{\width{macron}}}
+ \moveup{
+ \sub{\scale{\add{\height{d}}{\int{xheight}}}{500}}
+ {\height{macron}}}
+ \glyph{macron}{1000}
+ \pop
+ \glyph{d}{1000}
+ \endsetglyph
+\fi
+\uniglyph{dcroat}{dbar}
+
+\unitopaccentglyph{abreve}{a}{breve}{500}
+\ifoption{smallcaps}\then
+ \unibotaccentglyph{aogonek}{a}{ogonek}{900}
+\else
+ \unibotaccentglyph{aogonek}{a}{ogonek}{850}
+\fi
+\unitopaccentglyph{cacute}{c}{acute}{500}
+\unitopaccentglyph{ccaron}{c}{caron}{500}
+
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{dcaron}{d}{caron}{500}
+\else
+ \setglyph{dcaron}
+ \glyph{d}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+ \endsetglyph
+\fi
+
+\unitopaccentglyph{ecaron}{e}{caron}{500}
+\ifoption{smallcaps}\then
+ \unibotaccentglyph{eogonek}{e}{ogonek}{850}
+\else
+ \unibotaccentglyph{eogonek}{e}{ogonek}{500}
+\fi
+\unitopaccentglyph{gbreve}{g}{breve}{500}
+\unitopaccentglyph{lacute}{l}{acute}{500}
+
+\setglyph{lcaron}
+ \ifoption{smallcaps}\then
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \glyph{quoteright}{1000}
+ \else
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{1000}
+ \fi
+\endsetglyph
+
+\unitopaccentglyph{nacute}{n}{acute}{500}
+\unitopaccentglyph{ncaron}{n}{caron}{500}
+\unitopaccentglyph{ohungarumlaut}{o}{hungarumlaut}{500}
+\unitopaccentglyph{racute}{r}{acute}{500}
+\unitopaccentglyph{rcaron}{r}{caron}{500}
+\unitopaccentglyph{sacute}{s}{acute}{500}
+\unitopaccentglyph{scaron}{s}{caron}{500}
+\unibotaccentglyph{scedilla}{s}{cedilla}{500}
+
+\ifoption{smallcaps}\then
+ \unibotaccentglyph{tcaron}{t}{caron}{500}
+\else
+ \setglyph{tcaron}
+ \glyph{t}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+ \endsetglyph
+\fi
+
+\unibotaccentglyph{tcedilla}{t}{cedilla}{500}
+\unitopaccentglyph{uhungarumlaut}{u}{hungarumlaut}{500}
+\unitopaccentglyph{uring}{u}{ring}{500}
+\unitopaccentglyph{ydieresis}{y}{dieresis}{500}
+\unitopaccentglyph{zacute}{z}{acute}{500}
+\unitopaccentglyph{zcaron}{z}{caron}{500}
+\unitopaccentglyph{zdotaccent}{z}{dotaccent}{500}
+
+\setglyph{ij}
+ \glyph{i}{1000}
+ \movert{\kerning{i}{j}}
+ \glyph{j}{1000}
+\endsetglyph
+
+\unitopaccentglyph{Agrave}{A}{grave}{500}*
+\unitopaccentglyph{Aacute}{A}{acute}{500}*
+\unitopaccentglyph{Acircumflex}{A}{circumflex}{500}*
+\unitopaccentglyph{Atilde}{A}{tilde}{500}*
+\unitopaccentglyph{Adieresis}{A}{dieresis}{500}*
+\unitopaccentglyph{Aring}{A}{ring}{500}*
+\uniglyph{AE}{}*
+\unibotaccentglyph{Ccedilla}{C}{cedilla}{500}*
+\unitopaccentglyph{Egrave}{E}{grave}{500}*
+\unitopaccentglyph{Eacute}{E}{acute}{500}*
+\unitopaccentglyph{Ecircumflex}{E}{circumflex}{500}*
+\unitopaccentglyph{Edieresis}{E}{dieresis}{500}*
+\unitopaccentglyph{Igrave}{I}{grave}{500}*
+\unitopaccentglyph{Iacute}{I}{acute}{500}*
+\unitopaccentglyph{Icircumflex}{I}{circumflex}{500}*
+\uniglyph{Eth}{}*
+\unitopaccentglyph{Ntilde}{N}{tilde}{500}*
+\unitopaccentglyph{Ograve}{O}{grave}{500}*
+\unitopaccentglyph{Oacute}{O}{acute}{500}*
+\unitopaccentglyph{Ocircumflex}{O}{circumflex}{500}*
+\unitopaccentglyph{Otilde}{O}{tilde}{500}*
+\unitopaccentglyph{Odieresis}{O}{dieresis}{500}*
+\uniglyph{OE}{}*
+\uniglyph{Oslash}{}*
+\unitopaccentglyph{Ugrave}{U}{grave}{500}*
+\unitopaccentglyph{Uacute}{U}{acute}{500}*
+\unitopaccentglyph{Ucircumflex}{U}{circumflex}{500}*
+\unitopaccentglyph{Udieresis}{U}{dieresis}{500}*
+\unitopaccentglyph{Yacute}{Y}{acute}{500}*
+\uniglyph{Thorn}{}*
+
+\setglyph{SS}
+ \glyph{S}{1000}
+ \movert{\kerning{S}{S}}
+ \glyph{S}{1000}
+\endsetglyph
+
+\unitopaccentglyph{agrave}{a}{grave}{500}
+\unitopaccentglyph{aacute}{a}{acute}{500}
+\unitopaccentglyph{acircumflex}{a}{circumflex}{500}
+\unitopaccentglyph{atilde}{a}{tilde}{500}
+\unitopaccentglyph{adieresis}{a}{dieresis}{500}
+\unitopaccentglyph{aring}{a}{ring}{500}
+\uniglyph{ae}{}
+\unibotaccentglyph{ccedilla}{c}{cedilla}{500}
+\unitopaccentglyph{egrave}{e}{grave}{500}
+\unitopaccentglyph{eacute}{e}{acute}{500}
+\unitopaccentglyph{ecircumflex}{e}{circumflex}{500}
+\unitopaccentglyph{edieresis}{e}{dieresis}{500}
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{igrave}{i}{grave}{500}
+ \unitopaccentglyph{iacute}{i}{acute}{500}
+ \unitopaccentglyph{icircumflex}{i}{circumflex}{500}
+ \unitopaccentglyph{idieresis}{i}{dieresis}{500}
+\else
+ \unitopaccentglyph{igrave}{dotlessi}{grave}{500}
+ \unitopaccentglyph{iacute}{dotlessi}{acute}{500}
+ \unitopaccentglyph{icircumflex}{dotlessi}{circumflex}{500}
+ \unitopaccentglyph{idieresis}{dotlessi}{dieresis}{500}
+\fi
+\uniglyph{eth}{}
+\unitopaccentglyph{ntilde}{n}{tilde}{500}
+\unitopaccentglyph{ograve}{o}{grave}{500}
+\unitopaccentglyph{oacute}{o}{acute}{500}
+\unitopaccentglyph{ocircumflex}{o}{circumflex}{500}
+\unitopaccentglyph{otilde}{o}{tilde}{500}
+\unitopaccentglyph{odieresis}{o}{dieresis}{500}
+\uniglyph{oe}{}
+\uniglyph{oslash}{}
+\unitopaccentglyph{ugrave}{u}{grave}{500}
+\unitopaccentglyph{uacute}{u}{acute}{500}
+\unitopaccentglyph{ucircumflex}{u}{circumflex}{500}
+\unitopaccentglyph{udieresis}{u}{dieresis}{500}
+\unitopaccentglyph{yacute}{y}{acute}{500}
+\uniglyph{thorn}{}
+\ifoption{smallcaps}\then
+ \setglyph{germandbls}
+ \glyph{s}{1000}
+ \movert{\kerning{s}{s}}
+ \glyph{s}{1000}
+ \endsetglyph
+\fi
+\uniglyph{germandbls}{}
+
+\comment{\section{Latin accented symbols not present in T1}}
+
+\unitopaccentglyph{Amacron}{A}{macron}{500}*
+\unitopaccentglyph{amacron}{a}{macron}{500}
+\unitopaccentglyph{Emacron}{E}{macron}{500}*
+\unitopaccentglyph{emacron}{e}{macron}{500}
+\unitopaccentglyph{Imacron}{I}{macron}{500}*
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{imacron}{i}{macron}{500}
+\else
+ \unitopaccentglyph{imacron}{dotlessi}{macron}{500}
+\fi
+\unitopaccentglyph{Omacron}{O}{macron}{500}*
+\unitopaccentglyph{omacron}{o}{macron}{500}
+\unitopaccentglyph{Umacron}{U}{macron}{500}*
+\unitopaccentglyph{umacron}{u}{macron}{500}
+\unitopaccentglyph{Ymacron}{Y}{macron}{500}*
+\unitopaccentglyph{ymacron}{y}{macron}{500}
+\unitopaccentglyph{Ebreve}{E}{breve}{500}*
+\unitopaccentglyph{ebreve}{e}{breve}{500}
+\unitopaccentglyph{Ibreve}{I}{breve}{500}*
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{ibreve}{i}{breve}{500}
+\else
+ \unitopaccentglyph{ibreve}{dotlessi}{breve}{500}
+\fi
+\unitopaccentglyph{Obreve}{O}{breve}{500}*
+\unitopaccentglyph{obreve}{o}{breve}{500}
+\unitopaccentglyph{Ubreve}{U}{breve}{500}*
+\unitopaccentglyph{ubreve}{u}{breve}{500}
+\unitopaccentglyph{Ybreve}{Y}{breve}{500}*
+\unitopaccentglyph{ybreve}{y}{breve}{500}
+\unitopaccentglyph{Ccircumflex}{C}{circumflex}{500}*
+\unitopaccentglyph{ccircumflex}{c}{circumflex}{500}
+\unitopaccentglyph{Gcircumflex}{G}{circumflex}{500}*
+\unitopaccentglyph{gcircumflex}{g}{circumflex}{500}
+\unitopaccentglyph{Hcircumflex}{H}{circumflex}{500}*
+\unitopaccentglyph{hcircumflex}{h}{circumflex}{500}
+\unitopaccentglyph{Jcircumflex}{J}{circumflex}{550}*
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{jcircumflex}{j}{circumflex}{500}
+\else
+ \unitopaccentglyph{jcircumflex}{dotlessj}{circumflex}{500}
+\fi
+\unitopaccentglyph{Scircumflex}{S}{circumflex}{500}*
+\unitopaccentglyph{scircumflex}{s}{circumflex}{500}
+\unitopaccentglyph{Wcircumflex}{W}{circumflex}{500}*
+\unitopaccentglyph{wcircumflex}{w}{circumflex}{500}
+\unitopaccentglyph{Ycircumflex}{Y}{circumflex}{500}*
+\unitopaccentglyph{ycircumflex}{y}{circumflex}{500}
+\unitopaccentglyph{Itilde}{I}{tilde}{500}*
+\ifoption{smallcaps}\then
+ \unitopaccentglyph{itilde}{i}{tilde}{500}
+\else
+ \unitopaccentglyph{itilde}{dotlessi}{tilde}{500}
+\fi
+\unitopaccentglyph{Utilde}{U}{tilde}{500}*
+\unitopaccentglyph{utilde}{u}{tilde}{500}
+\unitopaccentglyph{Cdotaccent}{C}{dotaccent}{500}*
+\unitopaccentglyph{cdotaccent}{c}{dotaccent}{500}
+\unitopaccentglyph{Edotaccent}{E}{dotaccent}{500}*
+\unitopaccentglyph{edotaccent}{e}{dotaccent}{500}
+\unitopaccentglyph{Gdotaccent}{G}{dotaccent}{500}*
+\unitopaccentglyph{gdotaccent}{g}{dotaccent}{500}
+
+\setglyph{Ldotaccent}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \moveup{\add{\depth{dotaccent}}{\scale{\height{L}}{500}}}
+ \glyph{dotaccent}{1000}
+\endsetglyph
+\uniglyph{Ldot}{Ldotaccent}
+
+\setglyph{ldotaccent}
+ \ifoption{smallcaps}\then
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{\scale{-200}{\int{smallcapsscale}}}
+ \fi
+ \moveup{\add{\scale{\depth{dotaccent}}{\int{smallcapsscale}}}
+ {\scale{\height{l}}{500}}}
+ \cscglyph{dotaccent}
+ \else
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \moveup{\add{\depth{dotaccent}}{\scale{\height{l}}{500}}}
+ \glyph{dotaccent}{1000}
+ \fi
+\endsetglyph
+\uniglyph{ldot}{ldotaccent}
+
+\unibotaccentglyph{Iogonek}{I}{ogonek}{500}*
+\unibotaccentglyph{iogonek}{i}{ogonek}{500}
+\unibotaccentglyph{Uogonek}{U}{ogonek}{500}*
+\unibotaccentglyph{uogonek}{u}{ogonek}{500}
+
+\unibotaccentglyph{Gcedilla}{G}{cedilla}{500}*
+\uniglyph{Gcommaaccent}{Gcedilla}*
+
+\ifoption{smallcaps}\then
+ \unibotaccentglyph{gcedilla}{g}{cedilla}{500}*
+\else
+ \unitopaccentglyph{gcedilla}{g}{acute}{500}
+\fi
+\uniglyph{gcommaaccent}{gcedilla}
+
+\unibotaccentglyph{Kcedilla}{K}{cedilla}{500}*
+\uniglyph{Kcommaaccent}{Kcedilla}*
+
+\unibotaccentglyph{kcedilla}{k}{cedilla}{500}
+\uniglyph{kcommaaccent}{kcedilla}
+
+\unibotaccentglyph{Lcedilla}{L}{cedilla}{500}*
+\uniglyph{Lcommaaccent}{Lcedilla}*
+
+\unibotaccentglyph{lcedilla}{l}{cedilla}{500}
+\uniglyph{lcommaaccent}{lcedilla}
+
+\unibotaccentglyph{Ncedilla}{N}{cedilla}{500}*
+\uniglyph{Ncommaaccent}{Ncedilla}*
+
+\unibotaccentglyph{ncedilla}{n}{cedilla}{500}
+\uniglyph{ncommaaccent}{ncedilla}
+
+\unibotaccentglyph{Rcedilla}{R}{cedilla}{500}*
+\uniglyph{Rcommaaccent}{Rcedilla}*
+
+\unibotaccentglyph{rcedilla}{r}{cedilla}{500}
+\uniglyph{rcommaaccent}{rcedilla}
+
+\setglyph{napostrophe}
+ \glyph{quoteright}{1000}
+ \movert{\kerning{quoteright}{n}}
+ \glyph{n}{1000}
+\endsetglyph
+
+\ifoption{smallcaps}\then
+ \uniglyph{kra}{k}
+\else
+ \uniglyph{kra}{kgreenlandic}
+\fi
+\uniglyph{Hbar}{}*
+\uniglyph{hbar}{}
+\uniglyph{Tbar}{}*
+\uniglyph{tbar}{}
+
+\comment{\section{All-caps glyphs}}
+
+\setglyph{dotlessI}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{dotlessJ}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{FFspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{F}}
+ {\int{capspacing}}}
+ \glyph{F}{1000}
+\endsetglyph
+
+\setglyph{FIspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FLspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{FFIspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FFLspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{IJspaced}
+ \glyph{I}{1000}
+ \movert{\add{\kerning{I}{J}}{\int{capspacing}}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{SSspaced}
+ \glyph{S}{1000}
+ \movert{\add{\kerning{S}{S}}{\int{capspacing}}}
+ \glyph{S}{1000}
+\endsetglyph
+
+\comment{\section{Small caps glyphs}}
+
+\setglyph{dotlessIsmall}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{dotlessJsmall}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{FFsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Fsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Fsmall}{1000}
+\endsetglyph
+
+\setglyph{FIsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FLsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{FFIsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FFLsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{IJsmall}
+ \glyph{Ismall}{1000}
+ \movert{\add{\kerning{Ismall}{Jsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{SSsmall}
+ \glyph{Ssmall}{1000}
+ \movert{\add{\kerning{Ssmall}{Ssmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ssmall}{1000}
+\endsetglyph
+
+\setglyph{Lcaronsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{\scale{-200}{\int{smallcapsscale}}}
+ \fi
+ \cscglyph{quoteright}
+\endsetglyph
+
+\setglyph{Ldotaccentsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{\scale{-200}{\int{smallcapsscale}}}
+ \fi
+ \moveup{\add{\scale{\depth{dotaccent}}{\int{smallcapsscale}}}
+ {\scale{\height{Lsmall}}{500}}}
+ \cscglyph{dotaccent}
+\endsetglyph
+\uniglyph{Ldotsmall}{Ldotaccentsmall}
+
+\comment{\section{Accents}
+ \TeX's math accent-positioning requires accents to have zero depth.}
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+\zerodepth{grave}
+\zerodepth{acute}
+\zerodepth{circumflex}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+\zerodepth{hungarumlaut}
+\zerodepth{ring}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{dotaccent}
+\zerodepth{dblgrave}
+
+\unsetcommand{\topaccent}
+\unsetcommand{\botaccent}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst-prerelease b/fonts/utilities/fontinst-prerelease
new file mode 120000
index 0000000000..965b6b6d0a
--- /dev/null
+++ b/fonts/utilities/fontinst-prerelease
@@ -0,0 +1 @@
+fontinst \ No newline at end of file
diff --git a/fonts/utilities/fontinst/README b/fonts/utilities/fontinst/README
new file mode 100644
index 0000000000..b6a30ea506
--- /dev/null
+++ b/fonts/utilities/fontinst/README
@@ -0,0 +1,114 @@
+README for fontinst
+
+* What is it?
+
+Fontinst is a program that helps with installing fonts
+for (La)TeX. Since it is written entirely in TeX macros,
+it is completely portable.
+
+More precisely, fontinst helps mainly with the number
+crunching and shoveling parts of font installation. This
+means in practice that it creates a number of files which
+give the TeX metrics (and related information) for a font
+family that (La)TeX needs to do any typesetting in these
+fonts. Fontinst furthermore makes it easy to create fonts
+containing glyphs from more than one base font, taking
+advantage of e.g. "expert" font sets.
+
+Fontinst cannot examine files to see if they contain any
+useful information or work with binary file formats; those
+tasks must normally be done manually or with the help of
+some other tool, such as the pltotf and vptovf programs.
+Nor can fontinst automatically search for files, but if
+they are named according to the fontname scheme (Berry)
+then fontinst sometimes succeeds very well in guessing
+what the interesting files are called.
+
+
+* Documentation
+
+The doc directory contains pure documentation; in
+particular the doc/manual directory should be of
+interest, as it contains the fontinst manual. For questions
+about the meaning of fontinst commands, see this manual.
+
+The manual is however not a tutorial on how to use fontinst.
+Some alternative sources of information that you may find
+useful are:
+
+ * Philipp Lehman's "The Font Installation Guide"
+ Available on CTAN, at info/Type1fonts/fontinstallationguide/
+
+ * intro98.tex - parts of the 1998 fontinst v1.8 manual
+ that were split off during the v1.9 revision. These are
+ much more tutorial in style, although not entirely modern.
+
+ * The fontinst mailing list and its archives
+ (See below for relevant addresses.)
+
+ * The fontinst Literate Programming sources (see
+ source/fisource.dvi). If a command isn't documented
+ anywhere else, there is probably a discussion of it
+ in the sources. They're thoroughly indexed.
+
+The examples directory contains some examples (with
+comments) of using fontinst to install a font family.
+
+
+* Installation
+
+To use fontinst, you only need to make sure the inputs
+directory and its subdirectories are on TeX's input path.
+Usually you do this by moving it to a suitable location.
+In a TDS texmf tree, the inputs directory is usually
+made the ${TEXMF}/tex/fontinst directory.
+
+You will probably also want to move the file fontdoc.sty
+in the latex directory to some location where TeX will
+find it. Many of the .mtx and .etx files in the inputs
+hierarchy are simultaneously fontinst input files and
+LaTeX documents; the fontdoc package is needed to typeset
+them as the latter. In a TDS texmf tree, the normal place
+for fontdoc.sty is in the tex/latex/misc directory.
+
+Also recall that some TeX implementations maintain a
+database over files that have been installed. If you've
+placed fontinst in a suitable place but TeX complains it
+cannot find the file fontinst.sty then the problem may
+be that you need to update this database of files. That
+is however nothing that is particular for fontinst.
+
+
+* Latin and other scripts
+
+The fontinst distribution includes the necessary encoding
+definition (.etx) files for the latin script as used in
+European languages, but there is nothing in fontinst as
+a program that restricts it to these languages. In the T2
+bundle (CTAN:macros/latex/contrib/t2) there are
+corresponding fontinst files for the cyrillic scripts
+(and in the future it might become part of the main
+fontinst distribution).
+
+
+* The test directory
+
+This is mainly of interest for advanced fontinst users.
+It collects some files that were written to test the new
+features in various versions of fontinst.
+
+
+* Mailing list
+
+Questions and bug reports should be sent to the fontinst
+mailing list
+
+ fontinst@tug.org
+
+General information about the mailing list is at:
+
+ http://tug.org/mailman/listinfo/fontinst
+
+
+22 August 2009,
+Lars Hellstr\"om
diff --git a/fonts/utilities/fontinst/doc/encspecs/encspecs.tex b/fonts/utilities/fontinst/doc/encspecs/encspecs.tex
new file mode 100644
index 0000000000..a23be98dd2
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/encspecs/encspecs.tex
@@ -0,0 +1,1443 @@
+\documentclass[a4paper]{article}
+
+\usepackage{array}
+
+\makeatletter
+\@ifundefined{l@nohyphenation}{\newlanguage\l@nohyphenation}{}
+\DeclareRobustCommand\meta[1]{%
+ \ensuremath{\langle}%
+ \sbox{\z@}{%
+ \setlanguage\l@nohyphenation
+ \normalfont\itshape #1\/%
+ \setlanguage\language
+ }%
+ \unhbox\z@
+ \ensuremath{\rangle}%
+}
+\makeatother
+\DeclareRobustCommand\marg[1]{%
+ \texttt{\char`\{}\meta{#1}\texttt{\char`\}}%
+}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+
+\makeatletter
+\DeclareTextFontCommand\textsmaller{%
+ \fontsize{\scaledsize{\f@size}}{\f@baselineskip}\selectfont
+}
+\newcommand\scaledsize[1]{%
+ \ifdim #1\p@>6\p@
+ \ifdim #1\p@>7\p@
+ \ifdim #1\p@>8\p@
+ \ifdim #1\p@>9\p@
+ \ifdim #1\p@>10\p@
+ \ifdim #1\p@>11\p@
+ \ifdim #1\p@>12\p@
+ \ifdim #1\p@>14\p@ 14%
+ \else 12\fi
+ \else 11\fi
+ \else 10\fi
+ \else 9\fi
+ \else 8\fi
+ \else 7\fi
+ \else 6\fi
+ \else 5\fi
+}
+\makeatother
+\DeclareRobustCommand\ETX{\textsmaller{ETX}}
+\DeclareRobustCommand\PDF{\textsmaller{PDF}}
+
+% From tugboat.cls
+\def\thinskip{\hskip 0.16667em\relax}
+\def\endash{--}
+\def\emdash{\endash-}
+\makeatletter
+\def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces}
+\def\dash{\d@sh\nobreak\endash}
+\def\Dash{\d@sh\nobreak\emdash}
+\def\ldash{\d@sh\empty{\hbox{\endash}\nobreak}}
+\def\rdash{\d@sh\nobreak\endash}
+\def\Ldash{\d@sh\empty{\hbox{\emdash}\nobreak}}
+\def\Rdash{\d@sh\nobreak\emdash}
+\newcommand{\La}%
+ {L\kern-.36em
+ {\setbox0\hbox{T}%
+ \vbox to\ht0{\hbox{$\m@th$%
+ \csname S@\f@size\endcsname
+ \fontsize\sf@size\z@
+ \math@fontsfalse\selectfont
+ A}%
+ \vss}%
+ }}
+\IfFileExists{mflogo.sty}%
+ {\RequirePackage{mflogo}}%
+ {\TBWarning
+ {Package mflogo.sty not available --\MessageBreak
+ Proceeding to emulate mflogo.sty}
+ \DeclareRobustCommand\logofamily{%
+ \not@math@alphabet\logofamily\relax
+ \fontencoding{U}\fontfamily{logo}\selectfont}
+ \DeclareTextFontCommand{\textlogo}{\logofamily}
+ \def\MF{\textlogo{META}\-\textlogo{FONT}\@}
+ \def\MP{\textlogo{META}\-\textlogo{POST}\@}
+ \DeclareFontFamily{U}{logo}{}
+ \DeclareFontShape{U}{logo}{m}{n}{%
+ <8><9>gen*logo%
+ <10><10.95><12><14.4><17.28><20.74><24.88>logo10%
+ }{}
+ \DeclareFontShape{U}{logo}{m}{sl}{%
+ <8><9>gen*logosl%
+ <10><10.95><12><14.4><17.28><20.74><24.88>logosl10%
+ }{}
+ \DeclareFontShape{U}{logo}{m}{it}{%
+ <->ssub*logo/m/sl%
+ }{}%
+ }
+\makeatother
+\def\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}
+
+\usepackage{shortvrb}
+\MakeShortVerb{\|}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+
+\newcommand{\TeXOmega}{Omega}
+\DeclareRobustCommand\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+\DeclareRobustCommand\package[1]{\textsf{#1}}
+
+\providecommand*{\href}[2]{#2}
+\newcommand*{\ctanref}[2]{\href{ftp://ftp.ctan.org/#1}{#2}}
+
+\title{Writing \ETX\ format font encoding specifications}
+\author{Lars Hellstr\"om}
+\date{2003/07/09}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+ This paper explains how one writes formal specifications of font
+ encodings for \LaTeX\ and suggests a ratification procedure for such
+ specifications.
+\end{abstract}
+
+
+\tableofcontents
+
+\vspace{0mm plus 35mm}
+\pagebreak[2]
+
+
+\section{Introduction}
+
+One of the many difficult problems any creator of a new typesetting
+system encounters is that of \emph{font construction}\Dash to create
+fonts that provide all information that the typesetting system needs
+to do its job. From the early history of \TeX, we learn that this
+problem is so significant that it motivated the creation of \TeX's
+companion and equal \MF, whose implementation proved to be an even
+greater scientific challenge than \TeX\ was. It is also a tell-tale
+sign that the \texttt{fonts} subtree of the te\TeX\ distribution is
+about three times as large as the \texttt{tex} subtree: fonts are
+important, and not at all trivial to generate.
+
+The most respected and celebrated part of font construction is
+\emph{font design}\Ldash the creation from practically nothing of new
+letter (and symbol) shapes, in pursuit of an artistic
+vision\Dash but it is also something very few people have the time
+and skill to carry through. More common is the task of \emph{font
+installation}, where one has to solve the very concrete problem of how
+to set up an existing font so that it can be used with \AllTeX. The
+subproblems in this domain ranges from the very technical\Ldash how
+to make different pieces of software ``talk'' to each other, for
+example making information in file format~$A$ available to
+program~$B$\Dash to the almost artistic\Ldash finding values for
+glyph metrics and kerns that will make them look good in text\Dash
+but these extremes tend to be clearly defined even if solving them
+can be hard, so they are not what will be considered here. Rather,
+this paper is about a class of more subtle problems that have to do
+with how a font is organised.
+
+The technical name for such a ``font organisation'' is a \emph{font
+encoding}. In some contexts, font encodings are assumed to be mere
+mappings from a set of ``slots'' to a set of glyph identifiers, but
+in \TeX\ the concept entails much more; the various aspects are
+detailed in subsequent sections. For the moment, it is sufficient to
+observe that the role that a font encoding plays in a typesetting
+system is that of a standard: it describes what an author can expect
+from a font, so that a document or macro package can be written that
+work with a large class of fonts rather than just for one font family.
+The world of \AllTeX\ would be very different if papers published in
+journal $X$ that is printed in commercial font $Y$ could not use
+essentially the same sources as the author prepared for typesetting
+in the free font $Z$. Fine-tuning of a document (overfull lines, bad
+page breaks, etc.\@) depends on the exact font used, but it is a great
+convenience that one can typeset a well-coded body of text under a
+rather wide range of layout parameter (of which the main font family
+is one) values and still expect the result to look decent, often even
+good. Had font encodings not been standardised, the results might not
+even have been readable.
+
+When font encodings are viewed as standards, the historical states of
+most \AllTeX\ font encodings becomes rather embarrassing, as they
+lack something as fundamental as proper specifications! The typical
+origin of a font encoding has been that some\-one creates a font that
+behaves noticably different from other fonts, macro packages are then
+created to support this new font, and in time other people create other
+fonts that work with the same macros. At the end of this story the new
+encoding exists, but it is not clear who created it, and there is
+probably no document that describes all aspects of the encoding. Later
+contributors have typically had to rely on a combination of imitation
+of previous works, folklore, and reverse engineering of existing
+software when trying to figure out what they need to provide, but the
+results are not always verifiable. Furthermore the errors in this area
+are usually silent\Ldash the classical error being that a `\textdollar'
+was substituted for a `\textsterling' (or vice versa)\Dash which means
+they can only be discovered through careful proofreading, and then
+only \emph{provided} there at all exists a document which exercises
+all aspects of the font encoding. Since font encodings interact with
+hyphenation, exhaustive font verification through proofreading is
+probably beyond the capabilities of any living \TeX pert on purely
+linguistic grounds.
+
+Proper specifications of font encodings makes the task of font
+installation\Ldash and to some extent also the task of font design,
+as it too is subject to the technicalities of font encodings\Dash
+much simpler, as there is then a document that authoratively gives
+all details of a font encoding. This paper even goes one step further,
+and proposes (i)~a standard format for formal specifications of
+\AllTeX\ font encodings and (ii)~a process through which such
+specifications can be ratified as \emph{the} specification of a
+particular encoding. My hope is that future \AllTeX\ font encodings
+will have proper specifications from the start, as this will greatly
+simplify making more fonts available in these encodings, and perhaps
+also make font designers aware of the subtler points of \AllTeX\ font
+design, as many details have been poorly documented.
+
+The proposed file format for encoding specifications is a development
+of the \textsf{fontinst}~\cite{fontinst-pre} \ETX\ format. One reason
+for this choice was that it is an established format; many of those
+who are making fonts already use it, even if for a slightly
+different purpose. Another major reason is that an \ETX\ file is both
+a \LaTeX\ document and a processable data file; this is the same kind
+of bilinguality that has made the \texttt{.dtx} format so useful.
+Finally the \ETX\ format makes it easy to create experimental font
+installations when a new encoding is being designed; \textsf{fontinst}
+can directly read the file, but the file can also be automatically
+converted to a PostScript encoding vector if that approach seems more
+convenient.
+On the other hand, there are some features\Ldash most notably the
+prominent role of the glyph names\Dash of the \ETX\ format that would
+probably had been done differently in a file format that was built
+from scratch, but this is necessary for several of the advantages
+listed above.
+
+
+% \paragraph*{Why should one make formal specifications?}
+% Because the informal specifications that we have today
+% are incomplete and hard to use. E.g.\ the \LaTeX\
+% \meta{enc}\texttt{enc.def} files only say something about the
+% characters that are accessed via commands, and even for those you
+% really have to do reverse engineering to figure out what the
+% encoding contains. To figure out what the remaining characters
+% should do you have to compile what the various user manuals claim
+% to work and then work backwards from that, but I don't think the
+% general problem of which character tokens are allowed in input is
+% thoroughly treated anywhere. On top of that, \LaTeX\ itself
+% contributes some character tokens when the document is being
+% typeset.\footnote{This is basically the ``a \texttt{T}$*$ encoding
+% must contain the characters \ldots'' problem that was the reason
+% that the \texttt{T2} encoding had to be split up.}
+%
+% On the other side of things there are the files which tell e.g.
+% \textsf{fontinst} or \textsf{AFMtoTFM} what the target font
+% encoding is. These are basically recipes which are known (?\@) to
+% produce valid results, and they do usually provide more
+% information about the encoding than the sources listed above, but
+% they don't give much information about where the recipe can be
+% modified.
+
+% \paragraph*{Why use the \ETX\ format?}
+
+
+\section{Points to keep in mind}
+
+\subsection{Characters, glyphs, and slots}
+
+One fundamental difference one must understand is that between
+characters and glyphs. A \emph{character} is a semantic entity---it
+carries some meaning, even if you usually have to combine several
+characters to make up even one word---whereas a \emph{glyph} simply
+is a piece of graphics. In printed text, glyphs are used to represent
+characters and the first step of reading is to determine which
+character(s) a given glyph is representing.\footnote{Some \PDF\ viewers
+also try to accomplish this, but in general they need extra
+information to do it right. The generic solution provided is to embed
+a \emph{ToUnicode CMap}\Ldash which is precisely a map from slots to
+characters\Rdash in the \PDF\ font object.}
+
+In the output, \TeX\ neither deals with characters nor glyphs, really
+(although many of its messages speak of characters), but with
+\emph{slots}, which essentially are numbered positions in a font. To
+\TeX, a slot is simply something which can have certain metric
+properties (width, height, depth, etc.\@) but to the driver which
+actually does the printing the slot also specifies a glyph. The same
+slot in two different fonts can correspond to two quite different
+characters.
+
+For completeness it should also be mentioned that the \emph{input} of
+\TeX\ is a stream of semantic entities and thus \TeX\ is dealing with
+characters on that side, but the input is not the subject of this
+paper.
+
+
+\subsection{Ligatures}
+
+In typography, a \emph{ligature} is a glyph which has been formed by
+joining glyphs that represent two or more characters; this joining can
+involve quite a lot of deformation of the original shapes. Examples
+of ligatures are the `fi' ligature (from `f' and `i'), the `\AE'
+ligature (from `A' and `E'), and the `\textit{\&}' character (from `E'
+and `t'), the latter two of which has evolved to become characters of
+their own. For those ligatures (such as `fi') that have not evolved to
+characters, \TeX\ has a mechanism for forming the ligature out of the
+characters it is composed from, under the guidance of ligature\slash
+kerning programs found in the font.
+
+More technically, what happens is really that if the |\char| (or
+equivalent) for one slot is immediately followed by the |\char| (or
+equivalent) for another (or the same) slot and there is a ligaturing
+instruction in the \texttt{\small LIGKERN} table of the current font
+which applies to this slot pair then this ligaturing instruction is
+executed. This usually replaces the two slots in the pair with a
+single new slot specified by the ligaturing instruction (it could
+also keep one or both of the original slots, but that is less common).
+\TeX\ has no idea about whether these replacements change the meaning
+of anything, but \TeX\ assumes that it doesn't, and it is up to the
+font designer to ensure that this is the case.
+
+Apart from forming ligatures in text, the ligaturing mechanism of
+\TeX\ is traditionally also employed for another task which is much
+more problematic. Ligatures are also used to produce certain
+characters which are not part of visible ASCII---the most common are
+the endash (typed as |--|) and the emdash (typed as |---|). This is a
+problem because it violates \TeX's assumption that the meaning is
+unchanged; the classical problem with this appears in the \texttt{OT2}
+encoding, where the Unicode character \texttt{U+0446}
+(\textsc{cyrillic small letter tse}) could be typed as |ts|, whilst
+the |t| and |s| by themselves produced Unicode characters
+\texttt{U+0442} (\textsc{cyrillic small letter te}) and \texttt{U+0441}
+(\textsc{cyrillic small letter es}) respectively. \TeX's hyphenation
+mechanism can however decompose ligatures, so it sometimes happened
+that the \textsc{tse} was hyphenated as \textsc{te}-\textsc{es},
+which is quite different from what was intended. Since this is such
+an obvious disadvantage, the use of ligatures for forming non-English
+letters quickly disappeared after 8-bit input encodings became
+available. The practice still remains in use for punctuation, however,
+and the font designer must be aware of this. For many font encodings
+there is a set of ligatures which must be present and replace two or
+more characters by a single, different character. These ligatures are
+called \emph{mandatory ligatures} in this paper.
+
+The use of mandatory ligatures in new font encodings is strongly
+discouraged, for a number of reasons. The main problem is that they
+create unhealthy dependencies between input and output encoding,
+whereas these should ideally be totally independent. Using ligatures
+in this way complicates the internal representation of text, and it
+also makes it much harder to typeset text where those ligatures are not
+wanted (such as verbatim text). Furthermore it creates problems with
+kerning, since the ``ligature'' has not yet been formed when a kern
+to the left of it is inserted. Finally, a much better solution (when
+it is available) is to use an \TeXOmega\ translation process
+(see~\cite[Sec.~8--11]{Omega-doc}), since that \emph{is} independent
+of the font, different translations can be combined, and they can
+easily handle even ``abbreviations'' much more complicated than those
+ligatures can deal with.
+
+
+\subsection{Output stages}
+
+On its way out of \LaTeX\ towards the printed text, a character passes
+through a number of stages. The following five seem to cover what is
+relevant for the present discussion:
+\begin{enumerate}
+ \item \emph{\LaTeX\ Internal Character Representation} (LICR);
+ see~\cite{LaTeXCompanion}, Section~7.11 for a full description.
+ At this point the character is a character token (e.g.~|a|),
+ a text command (e.g.~|\ss|), or a combination (e.g.~|\H{o}|).
+ \item \emph{Horizontal material;} this is what the character is
+ en route from \TeX's mouth to its stomach. For most characters
+ this is equivalent to a single |\char| command (e.g.\ |a| is
+ equivalent to |\char|\,|97|), but some require more than one, some
+ are combined using the |\accent| and |\char| commands, some
+ involve rules and\slash or kerns, and some are built using boxes
+ that arbitrarily combine the above elements.
+ \item \emph{DVI commands;} this is the DVI file commands that
+ produce the printed representation of the character.
+ \item \emph{Printed text;} this is the graphical representation of
+ the character, e.g. as ink on paper or as a pattern on a computer
+ screen. Here the text consists of glyphs.
+ \item \emph{Interpreted text;} this is essentially printed text
+ modulo equivalence of interpretation, hence the text doesn't really
+ reach this stage until someone reads it. Here the text consists of
+ characters.
+\end{enumerate}
+
+In theory there is a universal mapping from LICR to interpreted text,
+but various technical restrictions make it impossible to simultaneously
+support the entire mapping. A \LaTeX\ encoding selects a restriction
+of this mapping to a limited set which will be ``well supported''
+(meaning kerning and such between characters in the set works), whereas
+elements outside this set at best can be supported through temporary
+encoding changes. The encoding also specifies a decomposition of the
+mapping into one part which maps LICR to horizontal material and one
+part which maps horizontal material to interpreted text. The first
+part is realized by the text command definitions usually found in the
+\meta{enc}\texttt{enc.def} file for the encoding. The second part is
+the font encoding, the specification of which is the topic of this
+paper. It is also worth noticing that an actual font is a mapping of
+horizontal material to printed text.
+
+An alternative decomposition of the mapping from LICR to interpreted
+text would be at the DVI command level, but even though this
+decomposition is realized in most \TeX\ implementations, it has very
+little relevance for the discussion of encodings. The main reason for
+this is that it depends not only on the encoding of a font, but
+also on its metrics. Furthermore it is worth noticing that in e.g.\
+pdf\TeX\ there need not be a DVI command level.
+
+
+\subsection{Hyphenation}
+
+There are strong connections between font encoding and hyphenation because
+\TeX's hyphenation mechanism operates on horizontal material; more
+precisely the hyphenation mechanism only works on pieces of horizontal
+material that are equivalent to sequences of |\char| commands. This
+implies that hyphenation patterns, as selected via the |\language|
+parameter, are not only for a specific language, they are also for a
+specific font encoding.
+
+The hyphenation mechanism uses the |\lccode| values to distinguish
+between three types of slots: lower case letters (|\lccode|\(\,n =
+n\)), upper case letters (|\lccode|\(\,n \notin \{0,n\}\)), and
+non-letters (|\lccode|\(\,n = 0\)); only the first two types can be
+part of a hyphenatable word and only lower case letters are needed
+in the hyphenation patters. This does however place severe
+restrictions on how letters can be placed in a text font because
+\TeX\ uses the same |\lccode| values for all text in a paragraph and
+therefore these values cannot be changed whenever the encoding changes.
+In \LaTeX\ the |\lccode| table is not allowed to change at all and
+consequently all text font encodings must work using the standard set
+of |\lccode| values.
+
+In \eTeX\ each set of hyphenation patterns has its own set of
+|\lccode| values for hyphenation, so the problem isn't as severe
+there. The hyphenation mechanism of \TeXOmega\ should become
+completely independent of the font encoding, although the last time I
+checked it was still operating on material encoded according to
+a font encoding.
+
+
+\subsection{Production and specification \ETX\ files}
+
+Finally, it is worth pointing out the difference between an \ETX\ file
+created for the specification of a font encoding and one created for
+being used in actually producing fonts with this encoding. They are
+usually not the same. Specification \ETX s certainly may be of direct
+use in the production of fonts---especially experimental fonts
+produced as part of the work on a new encoding---but they are usually
+not ideal for the purpose. In particular there is often a need to
+switch between alternative names for a glyph to accommodate what is
+actually in the fonts, but such trickeries are undesirable
+complications in a specification. On the other hand a production
+\ETX\ file has little need for verbose comments, whereas they are rather
+an advantage in a specification \ETX\ file.
+
+Therefore one shouldn't be surprised if there are two \ETX\ files for a
+specific encoding: one which is a specification version and one which
+is a production version. If both might need to be in the same
+directory then one should, as a rule of thumb, include a
+`\texttt{spec}' in the name of the specification version.
+
+
+\section{Font encoding specifications}
+\label{Sec:FontEncSpec}
+
+\subsection{Basic principles}
+
+Most features of the font encoding are categorized as either
+\emph{mandatory} or \emph{ordinary}. The mandatory features are what
+macros may rely on, whereas the ordinary simply are something which
+fonts with this encoding normally provide. Font designers may choose
+to provide other features than the ordinary, but are recommended to
+provide the ordinary features to the extent that the available
+resources permit.
+
+Many internal references in the specification are in the form of
+\emph{glyph names} and the choice of these is a slightly tricky
+matter. From the point of formal specification, the choices can be
+completely arbitrary, but from the point of practical usefulness they
+most likely are not. One of the main advantages of the \ETX\ format
+for specifications is that such specifications can also be used to
+make experimental implementations, but this requires that the glyph
+names in the specification are the same as those used in the fonts
+from which the experimental implementation should be built. Yet
+another aspect is that the glyph names are best chosen to be the ones
+one can expect to find in actual fonts, as that will make things
+easier for other people that want to make non-experimental
+implementations later. For this last purpose, a good reference is
+Adobe's technical note on Unicode and glyph names~\cite{unicodesign}.
+For most common glyphs, \cite{unicodesign} ends up recommending that
+one should follow the Adobe glyph list~\cite{AGL}, which however has
+the peculiar trait of recommending names on the form
+\texttt{afii}\textit{ddddd} (rather than the Unicode-based alternative
+\texttt{uni}\textit{xxxx}) for most non-latin glyphs. This is somewhat
+put in perspective by~\cite{ATN5013}.
+
+
+\subsection{Slot assignments}
+
+The purpose of the slot assignments is to specify for each slot which
+character or characters it is mapped to. That one slot is mapped to
+many characters is an unfortunate, but not very uncommon, reality in
+many encodings, as limitations in font size have often encouraged
+identifications of two characters which are almost the same. It should
+be avoided in new encodings.
+
+Slot assignmets are done using the |\nextslot| command and a
+|\setslot| \dots\ |\endsetslot| construction as follows:
+\begin{quote}
+ |\nextslot|\marg{slot number}\\*
+ |\setslot|\marg{glyph name}\\*
+ \mbox{\quad}\meta{slot commands}\\*
+ |\endsetslot|
+\end{quote}
+A typical example of this is
+\begin{quote}\begin{verbatim}
+\nextslot{65}
+\setslot{A}
+ \Unicode{0041}{LATIN CAPITAL LETTER A}
+\endsetslot
+\end{verbatim}\end{quote}
+which gets typeset as
+\begin{quote}
+ \textbf{Slot 65 `\texttt{A}'}\\*
+ Unicode character \texttt{U+0041}, \textsc{latin capital letter a}.
+\end{quote}
+
+The |\nextslot| command does not typeset anything; it simply stores
+the slot number in a counter, for later use by |\setslot|. The
+|\endsetslot| command increments this counter by one. Hence the
+|\nextslot| command is unnecessary between |\setslot|s for consecutive
+slots. Besides |\nextslot|, there is also a command |\skipslots| which
+increments the slot number counter by a specified amount. The
+argument of both |\nextslot| and |\skipslots| can be arbitrary
+\package{fontinst} integer expressions (see~\cite{fontinst-man}). All
+\TeX\ \meta{number}s that survive full expansion are valid
+\package{fontinst} integer expressions, but for example |`\~| isn't,
+as |\~| is a macro which will break before the expression is typeset.
+These cases can however be fixed by preceding the \TeX\ \meta{number}
+by |\number|, as |\number`\~| survives full expansion by expanding to
+|126|.
+
+The main duty of the \meta{slot commands} is to specify the target
+character (or characters) for this slot. The simplest way of doing
+this is to use the |\Unicode| command, which has the syntax
+\begin{quote}
+ |\Unicode|\marg{code point}\marg{name}
+\end{quote}
+The \meta{code point} is the number of the character (in hexadecimal
+notation, usually a four-digit number) and the \meta{name} is the name.
+Case is insignificant in these arguments. If a slot corresponds to a
+string of characters rather than to a single character, then one uses
+the |\charseq| command, which has the syntax
+\begin{quote}
+ |\charseq|\marg{\cs{Unicode} commands}
+\end{quote}
+e.g.
+\begin{quote}\begin{verbatim}
+\nextslot{30}
+\setslot{ffi}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ }
+\endsetslot
+\end{verbatim}\end{quote}
+Several |\Unicode| commands not in the argument of a |\charseq|
+instead mean that each of the listed characters is a valid
+interpretation of the slot.
+
+If a character cannot be specified in terms of Unicode code points then
+the specification should simply be a description in text which
+identifies the character. Such descriptions are written using the
+|\comment| command
+\begin{quote}
+ |\comment|\marg{text}
+\end{quote}
+It is worth noticing that the \meta{text} is technically only an
+argument of |\comment| when the program processing the \ETX\ file is
+ignoring |\comment| commands. This means |\verb| and similar
+catcode-changing commands \emph{can} be used in the \meta{text}. The
+|\par| command is on the other hand not allowed in the \meta{text}.
+
+The |\comment| command should also be used for any further piece of
+explanation of or commentary to the character used for the slot, if the
+exposition seems to need it. There can be any number of |\comment|
+commands in the \meta{slot commands}.
+
+
+\subsection{Ligatures}
+
+There are three classes of ligatures in the font encoding
+specifications: mandatory, ordinary, and odd. Mandatory ligatures must
+be present in any font which complies with the encoding, whereas
+ordinary and odd ligatures need not be. No clear distinction can be
+made between ordinary and odd ligatures, but a non-mandatory ligature
+should be categorized as ordinary if it makes sense for the majority
+of users, and as odd otherwise. Hence the `fi' ligature is
+categorized as ordinary in the \texttt{T1} encoding (although it
+makes no sense in Turkish), whereas the `ij' ligature is odd.
+
+In the \ETX\ format, a ligature is specified using one of the slot
+commands
+\begin{quote}
+ |\Ligature|\marg{ligtype}\marg{right}\marg{new}\\
+ |\ligature|\marg{ligtype}\marg{right}\marg{new}\\
+ |\oddligature|\marg{note}\marg{ligtype}\marg{right}\marg{new}
+\end{quote}
+|\Ligature| is used for mandatory ligatures, |\ligature| is used for
+ordinary ligatures, and |\oddligature| is used for odd ligatures. The
+\meta{right} and \meta{new} arguments are names of the glyphs being
+assigned to the slots involved in this ligature. The \meta{right}
+specifies the right part in the slot pair being affected by the
+ligature, whereas the left part is the one of the |\setslot| \dots\
+|\endsetslot| construction in which the ligaturing command is placed.
+The \meta{new} specifies a new slot which will be inserted by the
+ligaturing instruction. The \meta{ligtype} is the actual ligaturing
+instruction that will be used; it must be |LIG|, |/LIG|, |/LIG>|,
+|LIG/|, |LIG/>|, |/LIG/|, |/LIG/>|, or |/LIG/>>|. The slashes specify
+retention of the left or right original character; the |>| signs
+specify passing over that many slots in the result without further
+ligature processing. \meta{note}, finally, is a piece of text which
+explains when the odd ligature may be appropriate. It is typeset as a
+footnote.
+
+As an example of ligatures we find the following in the specification
+of the \texttt{T1} encoding:
+\begin{quote}
+ |\nextslot{33}|\\
+ |\setslot{exclam}|\\
+ | \Unicode{0021}{EXCLAMATION MARK}|\\
+ | \Ligature{LIG}{quoteleft}{exclamdown}|\\
+ |\endsetslot|
+\end{quote}
+It is typeset as
+\begin{quote}
+ \textbf{Slot 33 `\texttt{exclam}'}\\*
+ Unicode character \texttt{U+0021}, \textsc{exclamation mark}.\\*
+ \textbf{Mandatory ligature}
+ \texttt{exclam}${}*{}$\texttt{quoteleft}${}\rightarrow
+ {}$\texttt{exclamdown}
+\end{quote}
+With other \meta{ligtype}s there may be more names listed on the
+right hand side and possibly a `$\lfloor$' symbol showing the
+position at which ligature processing will start afterwards.
+
+
+\subsection{Math font specialities}
+
+There are numerous technicalities which are special to math fonts, but
+only a few of them are exhibited in \ETX\ files.\footnote{For an
+overview of the subject, see for example Vieth~\cite{Vieth2001}.} Most
+of these have to do with the \TeX\ mechanisms that find sufficiently
+large characters for commands like |\left|, |\sqrt|, and |\widetilde|.
+
+The first mechanism for this is that a character in a font can sort of
+say ``If I'm too small, then then try character \dots\ instead''. This
+is expressed in an \ETX\ file using the |\nextlarger| command, which
+has the syntax
+\begin{quote}
+ |\nextlarger|\marg{glyph name}
+\end{quote}
+The second mechanism constructs a sufficiently large character from
+smaller pieces; this is known as a `varchar' or `extensible character'.
+This is expressed in an \ETX\ file using an ``extensible recipe'', the
+syntax for which is
+\begin{quote}
+ |\varchar| \meta{varchar commands} |\endvarchar|
+\end{quote}
+where each \meta{varchar command} is one of
+\begin{quote}
+ |\varrep|\marg{glyph name}\\
+ |\vartop|\marg{glyph name}\\
+ |\varmid|\marg{glyph name}\\
+ |\varbot|\marg{glyph name}
+\end{quote}
+There can be at most one of each and their order is irrelevant. The
+most important is the |\varrep| command, as that is the part which is
+repeated until the character is sufficiently large. The |\vartop|,
+|\varmid|, and |\varbot| commands are used to specify some other part
+which should be put at the top, middle, and bottom of the extensible
+character respectively. Not all extensible recipes use all of these,
+however.
+
+As an example, here is how a very large left brace is constructed:
+\begin{center}
+ \begin{tabular}{>{%
+ \fontencoding{OMX}\fontfamily{cmex}\selectfont
+ $\vcenter\bgroup\hbox\bgroup
+ }l<{\egroup\egroup$} l}
+ \char"38& For |\vartop{bracelefttp}|\\
+ \char"3E& For |\varrep{braceex}|\\
+ \char"3C& For |\varmid{braceleftmid}|\\
+ \char"3E& Again for |\varrep{braceex}|\\
+ \char"3A& For |\varbot{braceleftbt}|
+ \end{tabular}
+\end{center}
+
+Both |\nextlarger| and |\varchar| commands are like |\ligature| in
+that they describe ordinary features for the encoding; they appear in
+a specification \ETX\ file mainly to explain the purpose of some
+ordinary character. There is no such thing as a mandatory |\nextlarger|
+or |\varchar|, but varchars are occationally used to a similar effect.
+In these cases, the character generated by the extensible recipe is
+something quite different from what a |\char| for that slot would
+produce. Thus for the slot to produce the expected result it must be
+referenced using a |\delimiter| or |\radical| primitive, since those
+are the only ones which make use of the extensible recipe. The effect
+is that the slot has a \emph{semimandatory} assignment; the result of
+|\char| is unspecified (as for a slot with an ordinary assignment), but
+the result for a large delimiter or radical is not (as for a slot with
+a mandatory assignment).
+
+Thus some math fonts have an extra section ``Semimandatory characters''
+between the mandatory and ordinary character sections. In that section
+for the \texttt{OMX} encoding we find for example
+\begin{quote}\begin{verbatim}
+\nextslot{60}
+\setslot{braceleftmid}
+ \Unicode{2016}{DOUBLE VERTICAL LINE}
+ \comment{This is the large size of the |\Arrowvert|
+ delimiter, a glyphic variation on |\Vert|.
+ The \texttt{braceleftmid} glyph ordinarily
+ placed in this slot must not be too tall,
+ or else the extensible recipe actually producing
+ the character might sometimes not be used.}
+ \varchar
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+\end{verbatim}\end{quote}
+which is typeset as
+\begin{quote}
+ \textbf{Slot 60 `\texttt{braceleftmid}'}\\*
+ Unicode character \texttt{U+2016}, \textsc{double vertical line}.\\
+ This is the large size of the |\Arrowvert|
+ delimiter, a glyphic variation on |\Vert|.
+ The \texttt{braceleftmid} glyph ordinarily
+ placed in this slot must not be too tall,
+ or else the extensible recipe actually producing
+ the character might sometimes not be used.\\
+ \textbf{Extensible glyph:}\\*
+ \textbf{Repeated} \texttt{arrowvertex}
+\end{quote}
+
+
+
+
+\subsection{Fontdimens}
+
+Each \TeX\ font contains a list of fontdimens, numbered from $1$ and
+up, which are accessible via the |\fontdimen| \TeX\ primitive. Quite a
+few are also used implicitly by \TeX\ and therefore cannot be left out
+even if they are totally irrelevant, but as one can always include
+some extra fontdimens in a font---the only bounds on how many
+fontdimens there may be are the general bound on the size of a TFM
+file and the amount of font memory \TeX\ has available---this is
+usually not a problem.
+
+The reason fontdimens are part of font encoding specifications is
+that the meaning of e.g.\ |\fontdimen|\,|8| varies between different
+fonts depending on their encoding; thus the encoding specification
+must define the quantity stored in each |\fontdimen| parameter. This
+is done using the |\setfontdimen| command, which has the syntax
+\begin{quote}
+ |\setfontdimen|\marg{number}\marg{name}
+\end{quote}
+The \meta{number} is the fontdimen number (as a sequence of decimal
+digits where the first digit isn't zero) and the \meta{name} is a
+symbolic name for the quantity.
+
+The standard list of symbolic names for fontdimen quantities appears
+below; the listed quantities should always be described using the names
+in this list. Encoding specifications that employ other quantities as
+fontdimens should include definitions of these quantities. Those
+quantities that are defined as ``Formula parameter \dots'' have to
+do with how mathematical formulae are rendered and are usually much
+too complicated to explain here. For exact definitions of these
+parameters, the reader is referred to Appendix~G of \textit{The
+\TeX book}~\cite{TeXbook}.
+\begin{list}{}{%
+ \setlength\labelwidth{0pt}%
+ \setlength\itemindent{-\leftmargin}%
+ \def\makelabel#1{\hspace{\labelsep}\normalfont\itshape #1}%
+ \setlength\itemsep{0.5\itemsep}%
+ \setlength\parsep{0.5\parsep}%
+}
+\item[acccapheight]
+ The height of accented full capitals.
+\item[ascender]
+ The height of lower case letters with ascenders.
+\item[axisheight] Formula parameter $\sigma_{22}$.
+\item[baselineskip]
+ The font designer's recommendation for natural length of the
+ \TeX\ parameter |\baselineskip|.
+\item[bigopspacing1] Formula parameter $\xi_{9}$.
+\item[bigopspacing2] Formula parameter $\xi_{10}$.
+\item[bigopspacing3] Formula parameter $\xi_{11}$.
+\item[bigopspacing4] Formula parameter $\xi_{12}$.
+\item[bigopspacing5] Formula parameter $\xi_{13}$.
+\item[capheight]
+ The height of full capitals.
+\item[defaultrulethickness] Formula parameter $\xi_{8}$.
+\item[delim1] Formula parameter $\sigma_{20}$.
+\item[delim2] Formula parameter $\sigma_{21}$.
+\item[denom1] Formula parameter $\sigma_{11}$.
+\item[denom2] Formula parameter $\sigma_{12}$.
+\item[descender]
+ The depth of lower case letters with descenders.
+\item[digitwidth]
+ The median width of the digits in the font.
+\item[extraspace]
+ The natural width of extra interword glue at the end of a sentence.
+ \TeX\ implicitly uses this parameter if |\spacefactor| is $2000$ or
+ more and |\xspaceskip| is zero.
+\item[interword]
+ The natural width of interword glue (spaces). \TeX\ implicitly uses
+ this parameter unless |\spaceskip| is nonzero.
+\item[italicslant]
+ The slant per point of the font. Unlike all other fontdimens, it is
+ not proportional to the font size.
+\item[maxdepth]
+ The maximal depth over all slots in the font.
+\item[maxheight]
+ The maximal height over all slots in the font.
+\item[num1] Formula parameter $\sigma_{8}$.
+\item[num2] Formula parameter $\sigma_{9}$.
+\item[num3] Formula parameter $\sigma_{10}$.
+\item[quad]
+ The quad width of the font, normally approximately equal to the
+ font size and\slash or the width of an `M'. Also implicitly available
+ as the length unit |em| and used for determining the size of the
+ length unit |mu|.
+\item[shrinkword]
+ The (finite) shrink component of interword glue (spaces). \TeX\
+ implicitly uses this parameter unless |\spaceskip| is nonzero.
+\item[stretchword]
+ The (finite) stretch component of interword glue (spaces). \TeX\
+ implicitly uses this parameter unless |\spaceskip| is nonzero.
+\item[sub1] Formula parameter $\sigma_{16}$.
+\item[sub2] Formula parameter $\sigma_{17}$.
+\item[subdrop] Formula parameter $\sigma_{19}$.
+\item[sup1] Formula parameter $\sigma_{13}$.
+\item[sup2] Formula parameter $\sigma_{14}$.
+\item[sup3] Formula parameter $\sigma_{15}$.
+\item[supdrop] Formula parameter $\sigma_{18}$.
+\item[verticalstem]
+ The dominant width of vertical stems. This quantity is meant to be used
+ as a measure of how ``dark'' the font is.
+\item[xheight]
+ The x-height (height of lower case letters without ascenders). Also
+ implicitly available as the length unit |ex|.
+\end{list}
+
+
+\subsection{The codingscheme}
+
+The final encoding-dependent piece of information in a \TeX\ font is
+the codingscheme, which is essentially a string declaring what
+encoding the font has. This information is currently only used by
+programs that convert the information in a \TeX\ font to some other
+format and these use it to identify the glyphs in the font. Therefore
+this string should be chosen so that the contents of the slots in the
+font can be positively identified. Observe that the encoding
+specification by itself does not provide enough information for this,
+since there are usually a couple of slots that do not contain
+mandatory characters. On the other hand, it is not a problem in this
+context if the font leaves some of the slots (even mandatory ones)
+empty as that is anyway easily detected. The only problem is with
+fonts where the slots are assigned to other characters than the ones
+specified in the encoding.
+
+For that reason, it is appropriate to assign two codingscheme strings
+to each encoding. The main codingscheme is for fonts were all slots
+(mandatory and ordinary alike) have been assigned according to the
+specification or have been left empty. The variant codingscheme is for
+fonts where some ordinary slots have been assigned other characters
+than the ones listed in the specification, but where the mandatory
+slots are still assigned according to the specification or are left
+empty. The font encoding specification should give the main
+codingscheme name, whereas the variant codingscheme name could be
+formed by adding \verb*| VARIANT| to the main codingscheme name.
+
+Technically the codingscheme is specified by setting the
+\texttt{codingscheme} string variable. This has the syntax
+\begin{quote}
+ |\setstr{codingscheme}|\marg{codingscheme name}
+\end{quote}
+e.g.
+\begin{quote}
+ |\setstr{codingscheme}{EXTENDED TEX FONT ENCODING - LATIN}|
+\end{quote}
+which is typeset as
+\begin{quote}
+ \textbf{Default} s(\texttt{codingscheme}) =
+ \verb*|EXTENDED TEX FONT ENCODING - LATIN|
+\end{quote}
+A codingscheme name may be at most 40 characters long and may not
+contain parentheses. If the entire \verb*| VARIANT| cannot be suffixed
+to a main name because the result becomes to long (as in the above
+example) then use the first 40 characters of the result.
+
+
+\subsection{Overall document structure}
+\label{Ssec:Structure}
+
+The overall structure of a font encoding specification should be
+roughly the following
+\begin{quote}
+ |\relax|\\
+ |\documentclass[twocolumn]{article}|\\
+ |\usepackage[specification]{fontdoc}|\\
+ \meta{preamble}\\
+ |\begin{document}|\\
+ \meta{title}\\
+ \meta{manifest}\\
+ |\encoding|\\
+ \meta{body}\\
+ |\endencoding|\\
+ \meta{discussion}\\
+ \meta{change history}\\
+ \meta{bibliography}\\
+ |\end{document}|
+\end{quote}
+The commands described in the preceding subsections must all go in
+the \meta{body} part of the document, as that is the only part of the
+file which actually gets processed as a data file. The part before
+|\encoding| is skipped and the part after |\endencoding| is never
+even input, so whatever appears there is only part of the \LaTeX\
+document. For the purposes of processing as a data file, the
+important markers in the file are the |\relax|, the |\endcoding|, and
+the |\endencoding| commands.
+
+The \meta{title} is the usual |\maketitle| (and the like) stuff. The
+person or persons who appear as author(s) are elsewhere in this paper
+described as the \emph{encoding proposers}. The \meta{title} should
+also give the date when the specification was last changed.
+
+The \meta{manifest} is an important, although usually pretty short,
+part of the specification. It is a piece of text which explains the
+purpose of the encoding (in particular what it can be used for) and
+the basic ideas (if any) which have been used in its construction. It
+is often best marked up as an abstract.
+
+The \meta{discussion} is the place for any longer comments on the
+encoding, such as analyses of different implementations, comparisons
+with other encodings, etc. This is also the place to explain any more
+general structures in the encoding, such as the arrow kit in the
+proposed \texttt{MS2} encoding~\cite{ClasenVieth}. In cases where the
+specification is mainly a formulation of what is already an
+established standard the \meta{discussion} is often rather short as
+the relevant discussion has already been published elsewhere, but
+it is anyway a service to the reader to include this information.
+References to the original documents should always be given.
+
+It might be convenient to include an FAQ section at the end of the
+discussion. This is particularly suited for explaining things where
+one has to look for a while and consult the references to find the
+relevant information.
+
+The \meta{change history} documents how the specification has changed
+over time. It is preferably detailed, as each detail in an encoding
+is important, but one should not be surprised if it is anyway rather
+short due to that there haven't been that many changes.
+
+The \meta{bibliography} is an important part of the specification. It
+should at the very least include all the sources which have been used
+in compiling the encoding specification, regardless of whether they
+are printed, available on the net, merely ``personal communication'',
+or something else. It is also a service to the reader to include in
+the bibliography some more general references for related matters.
+
+The \meta{preamble} is just a normal \LaTeX\ preamble and there are no
+restrictions on defining new commands in it, although use of such
+commands in the \meta{body} part is subject to the same restrictions
+as use of any general \LaTeX\ command. The preamble should however
+\emph{not} load any packages not part of the required suite of
+\LaTeX\ packages, as that may prevent users who do not have these
+packages from typesetting the specification. Likewise, the
+specification should \emph{not} require that some special font is
+available. Glyph examples for characters are usually better
+referenced via Unicode character charts than via special fonts.
+
+An exception to this rule about packages is that the specification
+must load the \package{fontdoc} package, as shown in the outline
+above, since that defines the |\setslot| etc.\ commands that should
+appear in the \meta{body}. This should not be a problem, as the
+\package{fontdoc} package can preferably be kept in the same directory
+as the collection of encoding specifications (see below). The
+\texttt{specification} option should be passed to the package to let it know
+that the file being processed is an encoding specification---otherwise
+|\Ligature| and |\ligature| will get the same formatting, for one. It
+is not necessary to use the \package{article} document class, and
+neither must it be passed the \texttt{twocolumn} option, but it is
+customary to do so. In principle any other document class within
+required \LaTeX\ will do just as well.
+
+If you absolutely think that using some non-required package
+significantly improves the specification, then try writing the code so
+that is loads the package only if it is available and provide some
+kind of fallback definition for sites where it is not. E.g.\ the
+\package{url} package could be loaded as
+\begin{verbatim}
+\IfFileExists{url.sty}{\usepackage{url}}{}
+\providecommand\url{\verb}
+\end{verbatim}
+The |\url| command defined by this is not equivalent to the command
+defined by the \package{url} package, but it can serve fairly well
+(with a couple of extra overfull lines as only ill effect) if its
+use is somewhat restricted.
+
+Finally, a technical restriction on the \meta{preamble}, \meta{title},
+and \meta{manifest} is that they must not contain any mismatched
+|\if|s (of any type) or |\fi|s, as \TeX\ conditionals will be used for
+skipping those parts of the file when it is processed as a data file.
+If the definition of some macro includes mismatched |\if|s or |\fi|s
+(this will probably occur only rarely) then include some extra code
+so that they do match.
+
+
+% All technical parts of the encoding specification (slot assignments,
+% fontdimens, etc.\@) have to be in the \meta{encoding commands} part.
+% The other parts are suitably used for longer commentry, such as the
+% mainfest (see below), revision history, and bibliography.
+%
+% When the file is being typeset as a \LaTeX\ document there is nothing
+% special going on. The |\encoding| and |\endencoding| commands may set
+% some internal variables, but otherwise they do very little. When the
+% file is being read by \package{fontinst}, things are quite different.
+% Everything between the initial |\relax| and |\encoding| is skipped,
+% and the file is not read further than to the |\endencoding|. Hence
+% the \meta{preamble}, \meta{\LaTeX\ text 1}, and \meta{\LaTeX\ text 2}
+% can contain pretty much anything (with a few exceptions) which is
+% legal in a \LaTeX\ document.
+
+
+\subsection{Encoding specification body syntax}
+
+The \meta{body} part of an encoding specification must comply to a
+much stricter syntax than the rest of the file. The \meta{body} is
+a sequence of \meta{encoding command}s, each of which should be one
+of the following:
+\begin{quote}
+ |\setslot|\marg{glyph name} \meta{slots commands} |\endsetslot|\\
+ |\nextslot|\marg{number}\\
+ |\skipslots|\marg{number}\\
+ |\setfontdimen|\marg{number}\marg{name}\\
+ |\setstr{codingscheme}|\marg{codingscheme name}\\
+ |\needsfontinstversion|\marg{version number}
+\end{quote}
+The |\needsfontinstversion| command is usually placed immediately
+after the |\encoding| command. The \meta{version number} must be at
+least |1.918| for many of the features described in this file to be
+available, and at least |1.928| if the |\charseq| command is used.
+
+The \meta{slot commands} are likewise a sequence of \meta{slot
+command}s, each of which should be one of the following:
+\begin{quote}
+ |\Unicode|\marg{code point}\marg{name}\\
+ |\charseq|\marg{\cs{Unicode} commands}\\
+ |\comment|\marg{text}\\
+ |\Ligature|\marg{ligtype}\marg{right}\marg{new}\\
+ |\ligature|\marg{ligtype}\marg{right}\marg{new}\\
+ |\oddligature|\marg{note}\marg{ligtype}\marg{right}\marg{new}\\
+ |\nextlarger|\marg{glyph name}\\
+ |\varchar| \meta{varchar commands} |\endvarchar|
+\end{quote}
+where \meta{varchar commands} similarly is a sequence of \meta{varchar
+command}s, each of which should be one of the following:
+\begin{quote}
+ |\varrep|\marg{glyph name}\\
+ |\vartop|\marg{glyph name}\\
+ |\varmid|\marg{glyph name}\\
+ |\varbot|\marg{glyph name}
+\end{quote}
+Finally, one can include any number of \meta{comment command}s between
+any two encoding, slot, or varchar commands. The comment commands are
+\begin{quote}
+ |\begincomment| \meta{\LaTeX\ text} |\endcomment|\\
+ |\label|\marg{reference label}
+\end{quote}
+The \meta{\LaTeX\ text} can be pretty much any \LaTeX\ code that can
+appear in conditional text. (|\begincomment| is either |\iffalse| or
+|\iftrue| depending on whether the encoding specification is
+processed as a data file or typeset as a \LaTeX\ document respectively.
+|\endcomment| is always |\fi|.) The |\label| command is just
+the normal \LaTeX\ |\label| command; when it is used in a \meta{slot
+commands} it references that particular slot (by number and glyph
+name).
+
+The full syntax of the \ETX\ format can be found in the
+\package{fontinst} manual~\cite{fontinst-man}, but font encoding
+specifications only need a subset of that.
+
+
+\subsection{Additional \package{fontdoc} features}
+
+There is an ``in comment paragraph'' form |\textunicode| of the
+|\Unicode| command. Both commands have the same syntax, but
+|\textunicode| is only allowed in ``comment'' contexts. A typical use
+of |\textunicode| is
+\begin{quote}
+ |\comment{An |\dots\\
+ \quad\dots| this is \textunicode{2012}{FIGURE DASH}; in |\dots\\
+ |}|
+\end{quote}
+which is typeset as
+\begin{quote}
+ An \dots\ this is \texttt{U+2012} (\textsc{figure dash}); in \dots
+\end{quote}
+
+The \package{fontdoc} package inputs a configuration file
+\texttt{fontdoc.cfg} if that exists. This can be used to pass
+additional options to the package. The only currently available
+options that this could be of interest for are the \texttt{hypertex}
+and \texttt{pdftex} options, which hyperlinks each \texttt{U+}\dots\
+generated by |\Unicode| or |\textunicode| (using Hyper\TeX\ or
+pdf\TeX\ conventions\footnote{One could just as well do the same
+thing using some other convention if a suitable definition of
+\cs{FD@codepoint} is included in \texttt{fontdoc.cfg}. See the
+\package{fontinst} sources~\cite{fontinst-pre} for more details.}
+respectively) to a corresponding glyph image on the Unicode consortium
+website. To use this feature one should put the line
+\begin{quote}
+ |\ExecuteOptions{hypertex}|
+\end{quote}
+or
+\begin{quote}
+ |\ExecuteOptions{pdftex}|
+\end{quote}
+in the \texttt{fontdoc.cfg} file. \emph{Please} do not include this
+option in the |\usepackage|\nolinebreak[1]|{fontdoc}| of an encoding
+specification file as that can be a severe annoyance for people whose
+\TeX\ program or DVI viewers do not support the necessary extensions.
+% Hyper\TeX\ |\special|s.
+
+
+\section{Font encoding ratification}
+
+This section describes a suggested ratification process for font
+encoding specifications. As there are fewer technical matters that
+impose restrictions on what it may look like, it is probably more
+subjective than the other parts of this paper.
+
+\medskip
+
+A specification in the process of being ratified can be in one of
+three different stages: \emph{draft}, \emph{beta}, or \emph{final}.
+Initially the specification is in the draft stage, during which it
+will be scrutinized and can be subject to major changes. A
+specification which is in the beta stage has got a formal approval
+but the encoding in question may still be subject to some minor
+changes if weighty arguments present themselves. Once the
+specification has reached the final stage, the encoding may not
+change at all.
+
+
+\subsection{Getting to the draft stage}
+
+The process of taking an encoding to the draft stage can be
+summarized in the following steps. Being in the draft stage doesn't
+really say anything about whether the encoding is in any way correct
+or useful, except in that some people (the encoding proposers)
+believe it is and are willing to spend some time on ratifying it.
+
+\paragraph{Write an encoding specification} The first step is to
+write a specification for the font encoding in question. This
+document must not only technically describe the encoding but also
+explain what the encoding is for and why it was created. See
+Subsection~\ref{Ssec:Structure} for details on how the document is
+preferably organised.
+
+\paragraph{Request an encoding name} The second step is to write to
+the \LaTeX3 project and request a \LaTeX\ encoding name for the
+encoding. This mail should be in the form of a \LaTeX\ bug report, it
+must be sent to
+\begin{quote}
+ \href{mailto:latex-bugs@latex-project.org}%
+ {\texttt{latex-bugs@latex-project.org}},
+\end{quote}
+and it must include the encoding specification file. Suggestions for
+an encoding name are appreciated, but not necessarily accepted.
+The purpose of this mail is \emph{not} to get an approval of the
+encoding, but only to have a reasonable name assigned to it.
+
+\paragraph{Upload the specification to CTAN} The third step is make
+the encoding specification publicly available by uploading it to
+CTAN. Encoding specifications are collected in the
+\begin{quote}
+ \ctanref{info/encodings}{\texttt{info/encodings}}
+\end{quote}
+directory (which should also contain the most recent version of this
+paper). The name of the uploaded file should be
+\meta{encoding name}\texttt{draft.etx}. The reason for this naming is
+that it must be clear that the specification has not yet been ratified.
+
+\paragraph{Announce the encoding} When the upload has been confirmed,
+it is time to announce the encoding by posting a message about it to
+the relevant forums. Most important is the \texttt{tex-fonts} mailing
+list, since that is where new encodings should be debated. Messages
+should also be posted to the \texttt{comp.text.tex} newsgroup and any
+forums related to the intended use of the encoding: an encoding for
+Sanskrit should be announced on Indian \TeX\ users forums, an
+encoding for printing chess positions should be announced on some
+chess-with-\TeX\ user forum, etc.; in the extent that such forums exist.
+
+The full address of the \texttt{tex-fonts} mailing list is
+\begin{quote}
+ \texttt{tex-fonts@math.utah.edu}
+\end{quote}
+This list rejects postings from non-members, so you need to subscribe
+to it before you can post your announcement. This is done by sending
+a `subscribe me' mail to
+\begin{quote}
+ \href{mailto:tex-fonts-request@math.utah.edu}
+ {\texttt{tex-fonts-request@math.utah.edu}}
+\end{quote}
+The list archives can be found at
+\begin{quote}
+ \href{http://www.math.utah.edu/mailman/listinfo/tex-fonts}
+ {\textsc{http:}/\slash \texttt{www.math.utah.edu}\slash
+ \texttt{mailman}\slash \texttt{listinfo}\slash
+ \texttt{tex-fonts}}
+\end{quote}
+A tip is to read through the messages from a couple of months
+before you write up your announcement, as that should help you get
+acquainted with the normal style on the list. Please do not send
+messages encoded in markup languages (notably, \textsmaller{HTML},
+\textsmaller{XML}, and word processor formats) to the list.
+
+\paragraph{Experimental encodings} There is a point in going through
+the above procedure even for experimental encodings, i.e., encodings
+whose names start with an \texttt{E}. Of course there is no idea in
+ratifying a specification of an experimental encoding, as it is very
+likely to frequently change, but having a proper name assigned to the
+encoding and uploading its specification to CTAN makes it much simpler
+for other people to learn about and make references to the encoding.
+
+
+\subsection{From draft to beta stage}
+
+The main difference between a draft and beta stage specification
+respectively is that beta stage specifications have been scrutinized
+by other people and found to be free of errors. The practical
+implementation of this is that a debate is held (in the normal
+anarchical manner of mailing list debates) on the \texttt{tex-fonts}
+mailing list. In particular the following aspects of the
+specification should be checked:
+\begin{enumerate}
+ \item \emph{Is the encoding technically correct?}
+ There are many factors which affect what \TeX\ does and it is
+ easy to overlook some. (The \cs{lccode}s seem to be particularly
+ troublesome, in this respect.) Sometimes fonts simply cannot work
+ as an encoding specifies they should and it is important that
+ such defects in the encoding are discovered on an early stage.
+ \item \emph{Are there any errors in the specification?}
+ A font encoding specification is largely a table and typos are
+ easy to make. Proof-reading may be boring, but it is very, very
+ important.
+ \item \emph{Is the specification sufficiently precise?}
+ Are there any omissions, ambiguities, inaccuracies, or completely
+ irrelevant material in the specification? There shouldn't be.
+\end{enumerate}
+During the debate, the encoding proposers should hear what other
+people have to say about the encoding draft, revise it accordingly
+when some flaw is pointed out, and upload the revised version. This
+cycle may well have to be repeated several times before everyone's
+content. It is worth pointing out that in practice the debate should
+turn out to be more of a collective authoring of the specification
+than a defense of its validity. There is no point in going into it
+expecting the worst.
+
+Unfortunately, it might happen that there never is a complete agreement
+on an encoding specification---depending on what side on takes, either
+the encoding proposers refuse to correct obvious flaws in it, or someone
+on the list insists that there is a flaw although there is obviously
+not---but hopefully that will never happen. If it anyway does happen
+then the person objecting should send a mail whose subject contains the
+phrase "formal protest against XXX encoding" (with XXX replaced by
+whatever the encoding is called) to the list. Then it will be up to
+the powers that be to decide on the fate of the encoding (see below).
+
+\paragraph{Summarize the debate} When the debate on the encoding is
+over---e.g.\ a month after anyone last posted anything new on the
+subject---then the encoding proposers should summarize the debate on
+the encoding specification draft and post this summary as a follow-up
+on the original mail to \texttt{latex-bugs}. This summary should list
+the changes that have been made to the encoding, what suggestions there
+were for changes which have not been included, and whether there were
+any formal protests against the encoding. The summary should also explain
+what the proposers want to have be done with the encoding. In the
+usual case this is having it advanced to beta stage, but the proposers
+might alternatively at this point have reached the conclusion that the
+encoding wasn't such a good idea to start with and therefore withdraw
+it, possibly to come again later with a different proposal.
+
+In response to this summary, the \LaTeX-project people may do one of
+three things:
+\begin{itemize}
+ \item
+ If the proposers wants the encoding specification advanced and
+ there are no formal protests against this, then the encoding
+ should be advanced to the beta stage. The \LaTeX-project
+ people do this by adding the encoding to the list of approved
+ (beta or final stage) encodings that they [presumably] maintain.
+ \item
+ If the proposers want to withdraw the encoding specification
+ then the name assigned to it should once again be made available
+ for use for other encodings.
+ \item
+ If the proposers want the encoding specification advanced but
+ there is some formal protest against this, then the entire matter
+ should be handed over to some suitable authority, as a suggestion
+ some technical TUG committee, for resolution.
+\end{itemize}
+
+
+\paragraph{Update the specification on CTAN} When the specification
+has reached the beta stage, its file on CTAN should be updated to say
+so. In particular the file name should be changed from \meta{encoding
+name}\texttt{draft.etx} to \meta{encoding name}\texttt{spec.etx}.
+
+
+\paragraph{Modifying beta stage encodings} If a beta stage encoding is
+modified then the revised specification should go through the above
+procedure of ratification again before it can replace the previous
+\meta{encoding name}\texttt{spec.etx} file on CTAN. The revised
+version should thus initially be uploaded as \meta{encoding
+name}\texttt{draft.etx}, reannounced, and redebated. It can however
+be expected that such debates will not be as extensive as the
+original debates.
+
+
+\subsection{From beta stage to final stage}
+
+The requirements for going from beta stage to final stage are more
+about showing that the encoding has reached a certain maturity than
+about demonstrating any technical merits of it. The main difference in
+usefulness between a beta stage encoding and a final stage encoding is
+that the latter can be considered safe for archival purposes, whereas
+one should have certain reservations against such use of beta stage
+encodings.
+
+It seems reasonable that the following conditions should have to be
+fulfilled before a beta stage encoding can be made a final stage
+encoding:
+\begin{itemize}
+ \item At least one year must have passed since the last change was
+ made to the specification.
+ \item At least two people other than the proposer must have
+ succeeded in implemented the encoding in a font.
+\end{itemize}
+It is quite possible that some condition should be added or some of
+the above conditions reformulated.
+
+
+% References updated 2004/08/07.
+\begin{thebibliography}{???}
+\bibitem{ATN5013}
+ Adobe Systems Incorporated:
+ \textit{Adobe Standard Cyrillic Font Specification},
+ Adobe Technical Note \#5013, 1998;
+ \href{http://partners.adobe.com/asn/developer/pdfs/tn/%
+ 5013.Cyrillic_Font_Spec.pdf}{\textsc{http}:/\slash
+ \texttt{partners.adobe.com}\slash \texttt{asn}\slash
+ \texttt{developer}\slash \texttt{pdfs}\slash \texttt{tn}\slash
+ \texttt{5013.Cyrillic\_Font\_Spec.pdf}}.
+\bibitem{AGL}
+ Adobe Systems Incorporated: \textit{Adobe Glyph List},
+ text file, 1998,
+ \href{http://partners.adobe.com/asn/developer/type/glyphlist.txt}
+ {\textsc{http}:/\slash \texttt{partners.adobe.com}\slash
+ \texttt{asn}\slash \texttt{developer}\slash \texttt{type}\slash
+ \texttt{glyphlist.txt}}.
+\bibitem{unicodesign}
+ Adobe Systems Incorporated:
+ \textit{Adobe Solutions Network: Unicode and Glyph Names},
+ web page, 1998,
+ \href{http://partners.adobe.com/asn/developer/type/unicodegn.html}
+ {\textsc{http}:/\slash \texttt{partners.adobe.com}\slash
+ \texttt{asn}\slash \texttt{developer}\slash \texttt{type}\slash
+ \texttt{unicodegn.html}}.
+\bibitem{ClasenVieth}
+ Matthias Clasen and Ulrik Vieth:
+ \textit{Towards a new Math Font Encoding for (La)TeX},
+ March 1998, presented at EuroTeX'98;
+ \href{http://tug.org/twg/mfg/papers/current/mfg-euro-all.ps.gz}
+ {\textsc{http}:/\slash \texttt{tug.org}\slash \texttt{twg}\slash
+ \texttt{mfg}\slash \texttt{papers}\slash \texttt{current}\slash
+ \texttt{mfg-euro-all.ps.gz}}.
+\bibitem{fontinst-man}
+ Alan Jeffrey, Rowland McDonnell, Ulrik Vieth, and Lars Hellstr\"om:
+ \textit{\package{fontinst}---font installation software for \TeX}
+ (manual), 2004,
+ \ctanref{fonts/utilities/fontinst/doc/fontinst.tex}{%
+ \textsc{ctan}:\discretionary{}{}{\thinspace}%
+ \texttt{fonts}\slash \texttt{utilities}\slash
+ \texttt{fontinst}\slash \texttt{doc}\slash \texttt{fontinst.tex}}.
+% \bibitem{fontinst}
+% Alan Jeffrey, Sebastian Rahtz, and Ulrik Vieth:
+% \textit{The \package{fontinst} utility}, documented source code,
+% v\,1.801,
+% \ctanref{fonts/utilities/fontinst/source}{%
+% \textsc{ctan}:\discretionary{}{}{\thinspace}%
+% \texttt{fonts}\slash \texttt{utilities}\slash
+% \texttt{fontinst}\slash \texttt{source}/}.
+\bibitem{fontinst-pre}
+ Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth, and Lars Hellstr\"om:
+ \textit{The \package{fontinst} utility}, documented source code,
+ v\,1.9xx,
+ \ctanref{fonts/utilities/fontinst/source}{%
+ \textsc{ctan}:\discretionary{}{}{\thinspace}%
+ \texttt{fonts}\slash \texttt{utilities}\slash
+ \texttt{fontinst}\slash \texttt{source}/}.
+\bibitem{TeXbook}
+ Donald E.\ Knuth, Duane Bibby (illustrations): \textit{The \TeX book},
+ Ad\-di\-son--Wes\-ley, 1991;
+ volume A of \textit{Computers and typesetting}.
+\bibitem{LaTeXCompanion}
+ Frank Mittelbach and Michel Goossens, with Johannes Braams,
+ David Carlisle, and Chris Rowley:
+ \textit{The \LaTeX\ Companion} (second edition),
+ Ad\-di\-son--Wes\-ley, 2004; ISBN~0-201-36299-6.
+\bibitem{Omega-doc}
+ John Plaice and Yannis Haralambous:
+ \textit{Draft documentation for the Omega system},
+ version~1.12, 1999;
+ \href{http://omega.cse.unsw.edu.au:8080/doc-1.12.ps}{%
+ \textsc{http:}/\slash \texttt{omega.cse.unsw.edu.au:8080}\slash
+ \texttt{doc-1.12.ps}}.
+% \textsc{ctan}:\discretionary{}{}{\thinspace}%
+% \texttt{systems}\slash \texttt{omega}\slash
+% \texttt{omega-doc-1.8.tar.gz}.
+\bibitem{Vieth2001}
+ Ulrik Vieth:
+ \textit{Math typesetting in \TeX: The~good, the~bad, the~ugly},
+ to appear in the proceedings of Euro\TeX\ 2001;
+ \href{http://www.ntg.nl/eurotex/vieth.pdf}{%
+ \textsc{http}:/\slash \texttt{www.ntg.nl}\slash
+ \texttt{eurotex}\slash \texttt{vieth.pdf}}.
+\end{thebibliography}
+
+
+\end{document} \ No newline at end of file
diff --git a/fonts/utilities/fontinst/doc/encspecs/omxdraft.etx b/fonts/utilities/fontinst/doc/encspecs/omxdraft.etx
new file mode 100644
index 0000000000..efccabde85
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/encspecs/omxdraft.etx
@@ -0,0 +1,985 @@
+\documentclass[twocolumn]{article}
+\usepackage[specification]{fontdoc}[2001/06/01]
+
+% \usepackage[T1]{fontenc}
+\DeclareTextCommandDefault{\textvisiblespace}{%
+ \mbox{\kern.06em\vrule height.3ex}%
+ \vbox{\hrule width.3em}%
+ \hbox{\vrule height.3ex\kern.06em}}
+
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+
+\showbranches
+
+\begin{document}
+
+\title{\texttt{OMX} encoding draft specification}
+\author{Lars Hellstr\"om}
+\date{2001/10/20}
+\maketitle
+
+\begin{abstract}
+ The \TeX\ math extensions (\texttt{OMX}) encoding is a container for
+ most of the ``growing'' characters in the standard math set-up, but
+ that is pretty much the extent of it. Some of the characters occur
+ in ``normal size'' in other encodings; in these cases it is usually
+ a single math command that usually make use of characters in both
+ encodings.
+\end{abstract}
+
+
+\encoding
+
+\begincomment
+\section{Mandatory characters}
+
+\subsection{Delimiters}
+\endcomment
+
+\nextslot{0}
+\setslot{parenleftbig}
+ \Unicode{0028}{LEFT PARENTHESIS}
+ \nextlarger{parenleftBig}
+\endsetslot
+
+\setslot{parenrightbig}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+ \nextlarger{parenrightBig}
+\endsetslot
+
+\setslot{bracketleftbig}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+ \nextlarger{bracketleftBig}
+\endsetslot
+
+\setslot{bracketrightbig}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+ \nextlarger{bracketrightBig}
+\endsetslot
+
+\setslot{floorleftbig}
+ \Unicode{230A}{LEFT FLOOR}
+ \nextlarger{floorleftBig}
+\endsetslot
+
+\setslot{floorrightbig}
+ \Unicode{230B}{RIGHT FLOOR}
+ \nextlarger{floorrightBig}
+\endsetslot
+
+\setslot{ceilingleftbig}
+ \Unicode{2308}{LEFT CEILING}
+ \nextlarger{ceilingleftBig}
+\endsetslot
+
+\setslot{ceilingrightbig}
+ \Unicode{2309}{RIGHT CEILING}
+ \nextlarger{ceilingrightBig}
+\endsetslot
+
+\setslot{braceleftbig}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+ \nextlarger{braceleftBig}
+\endsetslot
+
+\setslot{bracerightbig}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+ \nextlarger{bracerightBig}
+\endsetslot
+
+\setslot{angleleftbig}
+ \Unicode{2329}{LEFT-POINTING ANGLE BRACKET}
+ \nextlarger{angleleftBig}
+\endsetslot
+
+\setslot{anglerightbig}
+ \Unicode{232A}{RIGHT-POINTING ANGLE BRACKET}
+ \nextlarger{anglerightBig}
+\endsetslot
+
+\setslot{barex}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{This is used by the \cs{vert} command. When not accessed
+ as a delimiter, this character may be much shorter than one
+ would expect.}
+ \varchar
+ \varrep{barex}
+ \endvarchar
+\endsetslot
+
+\setslot{bardblex}
+ \Unicode{2016}{DOUBLE VERTICAL LINE}
+ \comment{This is used by the \cs{Vert} command. When not accessed
+ as a delimiter, this character may be much shorter than one
+ would expect.}
+ \varchar
+ \varrep{bardblex}
+ \endvarchar
+\endsetslot
+
+\setslot{slashbig}
+ \Unicode{2215}{DIVISION SLASH}
+ \comment{Although this character is normally accessed via \TeX's
+ growing delimiter mechanism, it is not used as such in formulae,
+ but as a large division slash. Since the use is unambigously for
+ division and the like, it would be inaccurate to identify this
+ character with \textunicode{002F}{SOLIDUS}.}
+ \nextlarger{slashBig}
+\endsetslot
+
+\setslot{backslashbig}
+ \Unicode{005C}{REVERSE SOLIDUS}
+ \comment{This is \TeX's \cs{backslash} (use for ``double coset''),
+ not \cs{setminus}, and hence it is not
+ \textunicode{2216}{SET MINUS}.}
+ \nextlarger{backslashBig}
+\endsetslot
+
+\nextslot{62}
+\setslot{braceex}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{This is used by the \cs{bracevert} command.}
+ \label{braceex}
+ \varchar
+ \varrep{braceex}
+ \endvarchar
+ \comment{This slot contains the repeatable part of a extensible
+ brace delimiter. In the standard set-up, the extensible recipes of
+ slots~\ref{bracelefttp}, \ref{bracerighttp}, \ref{braceleftbt},
+ \ref{bracerightbt}, \ref{parenleftbt}, and \ref{parenrightbt} all
+ make use of this slot.}
+\endsetslot
+
+\nextslot{"42}
+\setslot{parenleftex}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{As astonishing as it may seem, there is no command which
+ accesses this slot. The glyph is similar to that in
+ slot~\ref{braceex}, but shifted to the left.}
+ \varchar
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightex}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{As astonishing as it may seem, there is no command which
+ accesses this slot. The glyph is similar to that in
+ slot~\ref{braceex}, but shifted to the right.}
+ \varchar
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\nextslot{"7A}
+\setslot{bracehtipdownleft}
+ \comment{This is \cs{braceld}, a tip (pointing left, bending down)
+ used to build over- and underbraces.}
+\endsetslot
+
+\setslot{bracehtipdownright}
+ \comment{This is \cs{bracerd}, a tip (pointing right, bending down)
+ used to build over- and underbraces.}
+\endsetslot
+
+\setslot{bracehtipupleft}
+ \comment{This is \cs{bracelu}, a tip (pointing left, bending up)
+ used to build over- and underbraces.}
+\endsetslot
+
+\setslot{bracehtipupright}
+ \comment{This is \cs{braceru}, a tip (pointing right, bending up)
+ used to build over- and underbraces.}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Text style operators}
+
+With the exception of the integrals, all the following characters
+should be \textsc{n-ary \dots}, but some cases there are no such
+variants defined in Unicode.
+\endcomment
+
+\nextslot{"46}
+\setslot{unionsqtext}
+ \Unicode{2294}{SQUARE CUP}
+ \nextlarger{unionsqdisplay}
+\endsetslot
+
+\skipslots{1}
+\setslot{contintegraltext}
+ \Unicode{222E}{CONTOUR INTEGRAL}
+ \nextlarger{contintegraldisplay}
+\endsetslot
+
+\skipslots{1}
+\setslot{circledottext}
+ \Unicode{2299}{CIRCLED DOT OPERATOR}
+ \nextlarger{circledotdisplay}
+\endsetslot
+
+\skipslots{1}
+\setslot{circleplustext}
+ \Unicode{2295}{CIRCLED PLUS}
+ \nextlarger{circleplusdisplay}
+\endsetslot
+
+\skipslots{1}
+\setslot{circlemultiplytext}
+ \Unicode{2297}{CIRCLED TIMES}
+ \nextlarger{circlemultiplydisplay}
+\endsetslot
+
+\skipslots{1}
+\setslot{summationtext}
+ \Unicode{2211}{N-ARY SUMMATION}
+ \nextlarger{summationdisplay}
+\endsetslot
+
+\setslot{producttext}
+ \Unicode{220F}{N-ARY PRODUCT}
+ \nextlarger{productdisplay}
+\endsetslot
+
+\setslot{integraltext}
+ \Unicode{222B}{INTEGRAL}
+ \nextlarger{integraldisplay}
+\endsetslot
+
+\setslot{uniontext}
+ \Unicode{22C3}{N-ARY UNION}
+ \nextlarger{uniondisplay}
+\endsetslot
+
+\setslot{intersectiontext}
+ \Unicode{22C2}{N-ARY INTERSECTION}
+ \nextlarger{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultitext}
+ \Unicode{228E}{MULTISET UNION}
+ \nextlarger{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalandtext}
+ \Unicode{22C0}{N-ARY LOGICAL AND}
+ \nextlarger{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalortext}
+ \Unicode{22C1}{N-ARY LOGICAL OR}
+ \nextlarger{logicalordisplay}
+\endsetslot
+
+\skipslots{8}
+\setslot{coproducttext}
+ \Unicode{2210}{N-ARY COPRODUCT}
+ \nextlarger{coproductdisplay}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Accents, arrows, and the radical}
+\endcomment
+
+\nextslot{"62}
+\setslot{hatwide}
+ \Unicode{0302}{COMBINING CIRCUMFLEX ACCENT}
+ \nextlarger{hatwider}
+\endsetslot
+
+\skipslots{2}
+
+\setslot{tildewide}
+ \Unicode{0303}{COMBINING TILDE}
+ \nextlarger{tildewider}
+\endsetslot
+
+\nextslot{"70}
+\setslot{radicalbig}
+ \Unicode{221A}{SQUARE ROOT}
+ \nextlarger{radicalBig}
+\endsetslot
+
+\nextslot{"78}
+\setslot{arrowtp}
+ \Unicode{2191}{UPWARDS ARROW}
+ \varchar
+ \vartop{arrowtp}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowbt}
+ \Unicode{2193}{DOWNWARDS ARROW}
+ \varchar
+ \varrep{arrowvertex}
+ \varbot{arrowbt}
+ \endvarchar
+\endsetslot
+
+\nextslot{"7E}
+\setslot{arrowdbltp}
+ \Unicode{21D1}{UPWARDS DOUBLE ARROW}
+ \varchar
+ \vartop{arrowdbltp}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowdblbt}
+ \Unicode{21D3}{DOWNWARDS DOUBLE ARROW}
+ \varchar
+ \varrep{arrowdblvertex}
+ \varbot{arrowdblbt}
+ \endvarchar
+\endsetslot
+
+
+
+
+
+
+\begincomment
+\section{Semimandatory characters}
+\endcomment
+
+\nextslot{"3A}
+\setslot{braceleftbt}
+ \comment{This is the \cs{lgroup} delimiter, which looks like a
+ \textunicode{007B}{LEFT CURLY BRACKET} with flat middle section.
+ There does not seem to be such a character in Unicode, but a
+ close approximation would be a narrowed
+ \textunicode{3014}{LEFT TORTOISE SHELL BRACKET}.}
+ \label{braceleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varrep{braceex}
+ \varbot{braceleftbt}
+ \endvarchar
+ \comment{The slot contains the curved bottom of a
+ \textunicode{007B}{LEFT CURLY BRACKET}.}
+\endsetslot
+
+\setslot{bracerightbt}
+ \comment{This is the \cs{rgroup} delimiter, which looks like a
+ \textunicode{007D}{RIGHT CURLY BRACKET} with flat middle section.
+ There does not seem to be such a character in Unicode, but a
+ close approximation would be a narrowed
+ \textunicode{3015}{RIGHT TORTOISE SHELL BRACKET}.}
+ \label{bracerightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varrep{braceex}
+ \varbot{bracerightbt}
+ \endvarchar
+ \comment{The slot contains the curved bottom of a
+ \textunicode{007D}{RIGHT CURLY BRACKET}.}
+\endsetslot
+
+\setslot{braceleftmid}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{This is used by the \cs{arrowvert} command.}
+ \varchar
+ \varrep{arrowvertex}
+ \endvarchar
+ \comment{The slot contains the middle part of a
+ \textunicode{007B}{LEFT CURLY BRACKET}.}
+\endsetslot
+
+\setslot{bracerightmid}
+ \Unicode{2016}{DOUBLE VERTICAL LINE}
+ \comment{This is used by the \cs{Arrowvert} command.}
+ \varchar
+ \varrep{arrowdblvertex}
+ \endvarchar
+ \comment{The slot contains the middle part of a
+ \textunicode{007D}{RIGHT CURLY BRACKET}.}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{arrowvertex}
+ \Unicode{2195}{UP DOWN ARROW}
+ \varchar
+ \vartop{arrowtp}
+ \varrep{arrowvertex}
+ \varbot{arrowbt}
+ \endvarchar
+ \comment{This slot contains the repeatable middle part of a vertical
+ arrow.}
+\endsetslot
+
+\setslot{parenleftbt}
+ \label{parenleftbt}
+ \comment{This is the \cs{lmoustache} delimiter, whose top half is
+ like \cs{lgroup} and whose bottom half is like \cs{rgroup}.}
+ \varchar
+ \vartop{bracelefttp}
+ \varrep{braceex}
+ \varbot{bracerightbt}
+ \endvarchar
+ \comment{This slot contains the curved bottom of a
+ \textunicode{0028}{LEFT PARENTHESIS}.}
+\endsetslot
+
+\setslot{parenrightbt}
+ \label{parenrightbt}
+ \comment{This is the \cs{rmoustache} delimiter, whose top half is
+ like \cs{rgroup} and whose bottom half is like \cs{lgroup}.}
+ \varchar
+ \vartop{bracerighttp}
+ \varrep{braceex}
+ \varbot{braceleftbt}
+ \endvarchar
+ \comment{This slot contains the curved bottom of a
+ \textunicode{0029}{RIGHT PARENTHESIS}.}
+\endsetslot
+
+\nextslot{"77}
+\setslot{arrowdblvertex}
+ \Unicode{21D5}{UP DOWN DOUBLE ARROW}
+ \varchar
+ \vartop{arrowdbltp}
+ \varbot{arrowdblbt}
+ \varrep{arrowdblvertex}
+ \endvarchar
+ \comment{This slot contains the repeatable middle part of a vertical
+ double arrow.}
+\endsetslot
+
+
+
+
+
+\begincomment
+\section{Ordinary characters}
+\endcomment
+
+
+\begincomment
+\subsection{\texttt{Big} size delimiters}
+\endcomment
+
+\nextslot{16}
+\setslot{parenleftBig}
+ \Unicode{0028}{LEFT PARENTHESIS}
+ \nextlarger{parenleftbigg}
+\endsetslot
+
+\setslot{parenrightBig}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+ \nextlarger{parenrightbigg}
+\endsetslot
+
+\nextslot{46}
+\setslot{slashBig}
+ \Unicode{2215}{DIVISION SLASH}
+ \nextlarger{slashbigg}
+\endsetslot
+
+\setslot{backslashBig}
+ \Unicode{005C}{REVERSE SOLIDUS}
+ \nextlarger{backslashbigg}
+\endsetslot
+
+\nextslot{"44}
+\setslot{angleleftBig}
+ \Unicode{2329}{LEFT-POINTING ANGLE BRACKET}
+ \nextlarger{angleleftbigg}
+\endsetslot
+
+\setslot{anglerightBig}
+ \Unicode{232A}{RIGHT-POINTING ANGLE BRACKET}
+ \nextlarger{anglerightbigg}
+\endsetslot
+
+\nextslot{"68}
+\setslot{bracketleftBig}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+ \nextlarger{bracketleftbigg}
+\endsetslot
+
+\setslot{bracketrightBig}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+ \nextlarger{bracketrightbigg}
+\endsetslot
+
+\setslot{floorleftBig}
+ \Unicode{230A}{LEFT FLOOR}
+ \nextlarger{floorleftbigg}
+\endsetslot
+
+\setslot{floorrightBig}
+ \Unicode{230B}{RIGHT FLOOR}
+ \nextlarger{floorrightbigg}
+\endsetslot
+
+\setslot{ceilingleftBig}
+ \Unicode{2308}{LEFT CEILING}
+ \nextlarger{ceilingleftbigg}
+\endsetslot
+
+\setslot{ceilingrightBig}
+ \Unicode{2309}{RIGHT CEILING}
+ \nextlarger{ceilingrightbigg}
+\endsetslot
+
+\setslot{braceleftBig}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+ \nextlarger{braceleftbigg}
+\endsetslot
+
+\setslot{bracerightBig}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+ \nextlarger{bracerightbigg}
+\endsetslot
+
+
+
+
+
+\begincomment
+\subsection{\texttt{bigg} size delimiters}
+\endcomment
+
+\nextslot{18}
+\setslot{parenleftbigg}
+ \Unicode{0028}{LEFT PARENTHESIS}
+ \nextlarger{parenleftBigg}
+\endsetslot
+
+\setslot{parenrightbigg}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+ \nextlarger{parenrightBigg}
+\endsetslot
+
+\setslot{bracketleftbigg}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+ \nextlarger{bracketleftBigg}
+\endsetslot
+
+\setslot{bracketrightbigg}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+ \nextlarger{bracketrightBigg}
+\endsetslot
+
+\setslot{floorleftbigg}
+ \Unicode{230A}{LEFT FLOOR}
+ \nextlarger{floorleftBigg}
+\endsetslot
+
+\setslot{floorrightbigg}
+ \Unicode{230B}{RIGHT FLOOR}
+ \nextlarger{floorrightBigg}
+\endsetslot
+
+\setslot{ceilingleftbigg}
+ \Unicode{2308}{LEFT CEILING}
+ \nextlarger{ceilingleftBigg}
+\endsetslot
+
+\setslot{ceilingrightbigg}
+ \Unicode{2309}{RIGHT CEILING}
+ \nextlarger{ceilingrightBigg}
+\endsetslot
+
+\setslot{braceleftbigg}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+ \nextlarger{braceleftBigg}
+\endsetslot
+
+\setslot{bracerightbigg}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+ \nextlarger{bracerightBigg}
+\endsetslot
+
+\setslot{angleleftbigg}
+ \Unicode{2329}{LEFT-POINTING ANGLE BRACKET}
+ \nextlarger{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightbigg}
+ \Unicode{232A}{RIGHT-POINTING ANGLE BRACKET}
+ \nextlarger{anglerightBigg}
+\endsetslot
+
+\setslot{slashbigg}
+ \Unicode{2215}{DIVISION SLASH}
+ \nextlarger{slashBigg}
+\endsetslot
+
+\setslot{backslashbigg}
+ \Unicode{005C}{REVERSE SOLIDUS}
+ \nextlarger{backslashBigg}
+\endsetslot
+
+
+
+\begincomment
+\subsection{\texttt{Bigg} size delimiters}
+\endcomment
+
+\nextslot{32}
+\setslot{parenleftBigg}
+ \Unicode{0028}{LEFT PARENTHESIS}
+ \nextlarger{parenlefttp}
+\endsetslot
+
+\setslot{parenrightBigg}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+ \nextlarger{parenrighttp}
+\endsetslot
+
+\setslot{bracketleftBigg}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+ \nextlarger{bracketlefttp}
+\endsetslot
+
+\setslot{bracketrightBigg}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+ \nextlarger{bracketrighttp}
+\endsetslot
+
+\setslot{floorleftBigg}
+ \Unicode{230A}{LEFT FLOOR}
+ \nextlarger{bracketleftbt}
+\endsetslot
+
+\setslot{floorrightBigg}
+ \Unicode{230B}{RIGHT FLOOR}
+ \nextlarger{bracketrightbt}
+\endsetslot
+
+\setslot{ceilingleftBigg}
+ \Unicode{2308}{LEFT CEILING}
+ \nextlarger{bracketleftex}
+\endsetslot
+
+\setslot{ceilingrightBigg}
+ \Unicode{2309}{RIGHT CEILING}
+ \nextlarger{bracketrightex}
+\endsetslot
+
+\setslot{braceleftBigg}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+ \nextlarger{bracelefttp}
+\endsetslot
+
+\setslot{bracerightBigg}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+ \nextlarger{bracerighttp}
+\endsetslot
+
+\setslot{angleleftBigg}
+ \Unicode{2329}{LEFT-POINTING ANGLE BRACKET}
+\endsetslot
+
+\setslot{anglerightBigg}
+ \Unicode{232A}{RIGHT-POINTING ANGLE BRACKET}
+\endsetslot
+
+\setslot{slashBigg}
+ \Unicode{2215}{DIVISION SLASH}
+\endsetslot
+
+\setslot{backslashBigg}
+ \Unicode{005C}{REVERSE SOLIDUS}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Extensible delimiters}
+\endcomment
+
+\nextslot{48}
+\setslot{parenlefttp}
+ \comment{This slot contains the curved top of a
+ \textunicode{0028}{LEFT PARENTHESIS}.}
+ \varchar
+ \vartop{parenlefttp}
+ \varrep{parenleftex}
+ \varbot{parenleftbt}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrighttp}
+ \comment{This slot contains the curved top of a
+ \textunicode{0029}{RIGHT PARENTHESIS}.}
+ \varchar
+ \vartop{parenrighttp}
+ \varrep{parenrightex}
+ \varbot{parenrightbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketlefttp}
+ \comment{This slot contains the corner top of a
+ \textunicode{005B}{LEFT SQUARE BRACKET}.}
+ \varchar
+ \vartop{bracketlefttp}
+ \varrep{bracketleftex}
+ \varbot{bracketleftbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrighttp}
+ \comment{This slot contains the corner top of a
+ \textunicode{005D}{RIGHT SQUARE BRACKET}.}
+ \varchar
+ \vartop{bracketrighttp}
+ \varrep{bracketrightex}
+ \varbot{bracketrightbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftbt}
+ \comment{This slot contains the corner bottom of a
+ \textunicode{005B}{LEFT SQUARE BRACKET}, but it serves as the
+ final slot in the chain of larger sizes of
+ \textunicode{230A}{LEFT FLOOR}.}
+ \varchar
+ \varrep{bracketleftex}
+ \varbot{bracketleftbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightbt}
+ \comment{This slot contains the corner bottom of a
+ \textunicode{005D}{RIGHT SQUARE BRACKET}, but it serves as the
+ final slot in the chain of larger sizes of
+ \textunicode{230B}{RIGHT FLOOR}.}
+ \varchar
+ \varrep{bracketrightex}
+ \varbot{bracketrightbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftex}
+ \comment{This slot contains the repeatable middle part of a
+ \textunicode{005B}{LEFT SQUARE BRACKET}, but it serves as the
+ final slot in the chain of larger sizes of
+ \textunicode{2308}{LEFT CEILING}.}
+ \varchar
+ \vartop{bracketlefttp}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightex}
+ \comment{This slot contains the repeatable middle part of a
+ \textunicode{005D}{RIGHT SQUARE BRACKET}, but it serves as the
+ final slot in the chain of larger sizes of
+ \textunicode{2309}{RIGHT CEILING}.}
+ \varchar
+ \vartop{bracketrighttp}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracelefttp}
+ \comment{This slot contains the curved top of a
+ \textunicode{007B}{LEFT CURLY BRACKET}.}
+ \label{bracelefttp}
+ \varchar
+ \vartop{bracelefttp}
+ \varrep{braceex}
+ \varmid{braceleftmid}
+ \varbot{braceleftbt}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerighttp}
+ \comment{This slot contains the curved top of a
+ \textunicode{007D}{RIGHT CURLY BRACKET}.}
+ \label{bracerighttp}
+ \varchar
+ \vartop{bracerighttp}
+ \varrep{braceex}
+ \varmid{bracerightmid}
+ \varbot{bracerightbt}
+ \endvarchar
+\endsetslot
+
+
+
+
+
+\begincomment
+\subsection{Display style operators}
+\endcomment
+
+\nextslot{"47}
+\setslot{unionsqdisplay}
+ \Unicode{2294}{SQUARE CUP}
+\endsetslot
+
+\skipslots{1}
+\setslot{contintegraldisplay}
+ \Unicode{222E}{CONTOUR INTEGRAL}
+\endsetslot
+
+\skipslots{1}
+\setslot{circledotdisplay}
+ \Unicode{2299}{CIRCLED DOT OPERATOR}
+\endsetslot
+
+\skipslots{1}
+\setslot{circleplusdisplay}
+ \Unicode{2295}{CIRCLED PLUS}
+\endsetslot
+
+\skipslots{1}
+\setslot{circlemultiplydisplay}
+ \Unicode{2297}{CIRCLED TIMES}
+\endsetslot
+
+\skipslots{8}
+\setslot{summationdisplay}
+ \Unicode{2211}{N-ARY SUMMATION}
+\endsetslot
+
+\setslot{productdisplay}
+ \Unicode{220F}{N-ARY PRODUCT}
+\endsetslot
+
+\setslot{integraldisplay}
+ \Unicode{222B}{INTEGRAL}
+\endsetslot
+
+\setslot{uniondisplay}
+ \Unicode{22C3}{N-ARY UNION}
+\endsetslot
+
+\setslot{intersectiondisplay}
+ \Unicode{22C2}{N-ARY INTERSECTION}
+\endsetslot
+
+\setslot{unionmultidisplay}
+ \Unicode{228E}{MULTISET UNION}
+\endsetslot
+
+\setslot{logicalanddisplay}
+ \Unicode{22C0}{N-ARY LOGICAL AND}
+\endsetslot
+
+\setslot{logicalordisplay}
+ \Unicode{22C1}{N-ARY LOGICAL OR}
+\endsetslot
+
+\skipslots{1}
+\setslot{coproductdisplay}
+ \Unicode{2210}{N-ARY COPRODUCT}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Accents}
+\endcomment
+
+\nextslot{"63}
+\setslot{hatwider}
+ \Unicode{0302}{COMBINING CIRCUMFLEX ACCENT}
+ \nextlarger{hatwiderr}
+\endsetslot
+
+\setslot{hatwiderr}
+ \Unicode{0302}{COMBINING CIRCUMFLEX ACCENT}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{tildewider}
+ \Unicode{0303}{COMBINING TILDE}
+ \nextlarger{tildewiderr}
+\endsetslot
+
+\setslot{tildewiderr}
+ \Unicode{0303}{COMBINING TILDE}
+\endsetslot
+
+
+\begincomment
+\subsection{Radicals}
+\endcomment
+
+\nextslot{"71}
+\setslot{radicalBig}
+ \Unicode{221A}{SQUARE ROOT}
+ \nextlarger{radicalbigg}
+\endsetslot
+
+\setslot{radicalbigg}
+ \Unicode{221A}{SQUARE ROOT}
+ \nextlarger{radicalBigg}
+\endsetslot
+
+\setslot{radicalBigg}
+ \Unicode{221A}{SQUARE ROOT}
+ \nextlarger{radicalbt}
+\endsetslot
+
+\setslot{radicalbt}
+ \Unicode{221A}{SQUARE ROOT}
+ \varchar
+ \varbot{radicalbt}
+ \vartop{radicaltp}
+ \varrep{radicalvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{radicalvertex}
+ \comment{This is the repeatable, vertically middle part of an
+ extensible \textunicode{221A}{SQUARE ROOT}.}
+\endsetslot
+
+\setslot{radicaltp}
+ \comment{This is the top corner part of an extensible
+ \textunicode{221A}{SQUARE ROOT}.}
+\endsetslot
+
+
+
+
+
+\begincomment
+\section{Fontdimens and codingscheme}
+
+\texttt{OMX} fonts have the necessary fontdimens to serve as a math
+group 3 font.
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+\setfontdimen{8}{defaultrulethickness} % default rule thickness
+\setfontdimen{9}{bigopspacing1} % bigopspacing 1
+\setfontdimen{10}{bigopspacing2} % bigopspacing 2
+\setfontdimen{11}{bigopspacing3} % bigopspacing 3
+\setfontdimen{12}{bigopspacing4} % bigopspacing 4
+\setfontdimen{13}{bigopspacing5} % bigopspacing 5
+
+\setstr{codingscheme}{TEX MATH EXTENSION}
+
+
+
+
+
+\endencoding
+
+
+\section{Discussion}
+
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/doc/encspecs/ot1draft.etx b/fonts/utilities/fontinst/doc/encspecs/ot1draft.etx
new file mode 100644
index 0000000000..6f07bbd6f4
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/encspecs/ot1draft.etx
@@ -0,0 +1,1027 @@
+\relax
+\documentclass[twocolumn]{article}
+\usepackage[specification]{fontdoc}[2004/11/28]
+
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+
+\showbranches
+
+\begin{document}
+
+\title{\texttt{OT1} encoding draft specification}
+\author{Lars Hellstr\"om}
+\date{2004/12/16}
+\maketitle
+
+\begin{abstract}
+ The \texttt{OT1} encoding is an attempt to describe the encoding of
+ the text fonts in Donald~E.~Knuth's \emph{Computer Modern} family
+ of fonts~\cite{ComputerModern}. This is an impossibile goal, since
+ these fonts present no less than five different encodings, but they
+ are nontheless largely treated by \LaTeX\ as having identical
+ encodings. Due to the ambiguities this creates, and in view of that
+ the \texttt{T1} encoding supersedes \texttt{OT1} as text font
+ encoding, there is little point in using the text commands for
+ distiguishing mandatory features of \texttt{OT1} from the ordinary.
+
+ \texttt{OT1} is however also used as a math font encoding (to go
+ with \texttt{OML}, \texttt{OMS}, and \texttt{OMX}), and that use is
+ today the by far most important since there is no obvious alternative
+ to the standard math font set-up. Therefore this specification
+ considers a feature of the encoding to be mandatory if it is
+ (i)~necessary for the standard math set-up or (ii)~is a text feature
+ which works for all encoding variants.
+\end{abstract}
+
+\encoding
+\needsfontinstversion{1.928}
+
+
+
+\begincomment
+\section{Encoding variants}
+
+This document aims to record all the encoding variations that are
+present within the set of fonts classified by \LaTeX\ as having the
+\texttt{OT1} encoding. It turns out that they can all be described
+using only two parameters. One of these might be called
+`\textit{ligaturing}' as one factor it affects is how many ligatures
+there will be in the font. The other parameter is best called
+`\textit{italicizing}' as it is different between italic and
+non-italic fonts. Most of the Computer Modern fonts have
+\(\mathit{ligaturing} = 2\) and \(\mathit{italicizing} = 0\).
+
+\endcomment
+\setint{ligaturing}{2}
+\setint{italicizing}{0}
+
+
+\begincomment
+
+
+\section{Mandatory characters}
+
+\subsection{Latin letters}
+\endcomment
+
+\nextslot{16}
+\setslot{dotlessi}
+ \Unicode{0131}{LATIN SMALL LETTER DOTLESS I}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'. It is not used for math.}
+\endsetslot
+
+\setslot{dotlessj}
+ \Unicode{F6BE}{LATIN SMALL LETTER DOTLESS J}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. It is not used for math. The Unicode standard does not
+ define this character, but Adobe has assigned code point
+ \texttt{U+F6BE} (which is in the private use subarea assigned by
+ Adobe) to it.}
+\endsetslot
+
+\nextslot{25}
+\setslot{germandbls}
+ \Unicode{00DF}{LATIN SMALL LETTER SHARP S}
+ \comment{This slot is not used in math.}
+\endsetslot
+
+\setslot{ae}
+ \Unicode{00E6}{LATIN SMALL LETTER AE}
+ \comment{This slot is not used in math.}
+\endsetslot
+
+\setslot{oe}
+ \Unicode{0153}{LATIN SMALL LIGATURE OE}
+ \comment{This is a single letter, and should not be faked with `oe'.
+ It is not used in math.}
+\endsetslot
+
+\setslot{oslash}
+ \Unicode{00F8}{LATIN SMALL LETTER O WITH STROKE}
+ \comment{This slot is not used in math.}
+\endsetslot
+
+\setslot{AE}
+ \Unicode{00C6}{LATIN CAPITAL LETTER AE}
+ \comment{This slot is not used in math.}
+\endsetslot
+
+\setslot{OE}
+ \Unicode{0152}{LATIN CAPITAL LIGATURE OE}
+ \comment{This is a single letter, and should not be faked with
+ `OE'. It is not used in math.}
+\endsetslot
+
+\setslot{Oslash}
+ \Unicode{00D8}{LATIN CAPITAL LETTER O WITH STROKE}
+ \comment{This slot is not used in math.}
+\endsetslot
+
+
+\nextslot{65}
+\setslot{A}
+ \Unicode{0041}{LATIN CAPITAL LETTER A}
+ \label{A}
+\endsetslot
+
+\setslot{B}
+ \Unicode{0042}{LATIN CAPITAL LETTER B}
+\endsetslot
+
+\setslot{C}
+ \Unicode{0043}{LATIN CAPITAL LETTER C}
+\endsetslot
+
+\setslot{D}
+ \Unicode{0044}{LATIN CAPITAL LETTER D}
+\endsetslot
+
+\setslot{E}
+ \Unicode{0045}{LATIN CAPITAL LETTER E}
+\endsetslot
+
+\setslot{F}
+ \Unicode{0046}{LATIN CAPITAL LETTER F}
+\endsetslot
+
+\setslot{G}
+ \Unicode{0047}{LATIN CAPITAL LETTER G}
+\endsetslot
+
+\setslot{H}
+ \Unicode{0048}{LATIN CAPITAL LETTER H}
+\endsetslot
+
+\setslot{I}
+ \Unicode{0049}{LATIN CAPITAL LETTER I}
+\endsetslot
+
+\setslot{J}
+ \Unicode{004A}{LATIN CAPITAL LETTER J}
+\endsetslot
+
+\setslot{K}
+ \Unicode{004B}{LATIN CAPITAL LETTER K}
+\endsetslot
+
+\setslot{L}
+ \Unicode{004C}{LATIN CAPITAL LETTER L}
+\endsetslot
+
+\setslot{M}
+ \Unicode{004D}{LATIN CAPITAL LETTER M}
+\endsetslot
+
+\setslot{N}
+ \Unicode{004E}{LATIN CAPITAL LETTER N}
+\endsetslot
+
+\setslot{O}
+ \Unicode{004F}{LATIN CAPITAL LETTER O}
+\endsetslot
+
+\setslot{P}
+ \Unicode{0050}{LATIN CAPITAL LETTER P}
+\endsetslot
+
+\setslot{Q}
+ \Unicode{0051}{LATIN CAPITAL LETTER Q}
+\endsetslot
+
+\setslot{R}
+ \Unicode{0052}{LATIN CAPITAL LETTER R}
+\endsetslot
+
+\setslot{S}
+ \Unicode{0053}{LATIN CAPITAL LETTER S}
+\endsetslot
+
+\setslot{T}
+ \Unicode{0054}{LATIN CAPITAL LETTER T}
+\endsetslot
+
+\setslot{U}
+ \Unicode{0055}{LATIN CAPITAL LETTER U}
+\endsetslot
+
+\setslot{V}
+ \Unicode{0056}{LATIN CAPITAL LETTER V}
+\endsetslot
+
+\setslot{W}
+ \Unicode{0057}{LATIN CAPITAL LETTER W}
+\endsetslot
+
+\setslot{X}
+ \Unicode{0058}{LATIN CAPITAL LETTER X}
+\endsetslot
+
+\setslot{Y}
+ \Unicode{0059}{LATIN CAPITAL LETTER Y}
+ \label{Y}
+\endsetslot
+
+\setslot{Z}
+ \Unicode{005A}{LATIN CAPITAL LETTER Z}
+\endsetslot
+
+
+\nextslot{97}
+\setslot{a}
+ \Unicode{0061}{LATIN SMALL LETTER A}
+\endsetslot
+
+\setslot{b}
+ \Unicode{0062}{LATIN SMALL LETTER B}
+\endsetslot
+
+\setslot{c}
+ \Unicode{0063}{LATIN SMALL LETTER C}
+\endsetslot
+
+\setslot{d}
+ \Unicode{0064}{LATIN SMALL LETTER D}
+\endsetslot
+
+\setslot{e}
+ \Unicode{0065}{LATIN SMALL LETTER E}
+\endsetslot
+
+\setslot{f}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \ifnumber{\int{ligaturing}}={2}\then
+ \ligature{LIG}{f}{ff}
+ \ligature{LIG}{i}{fi}
+ \ligature{LIG}{l}{fl}
+ \Fi
+\endsetslot
+
+\setslot{g}
+ \Unicode{0067}{LATIN SMALL LETTER G}
+\endsetslot
+
+\setslot{h}
+ \Unicode{0068}{LATIN SMALL LETTER H}
+\endsetslot
+
+\setslot{i}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+\endsetslot
+
+\setslot{j}
+ \Unicode{006A}{LATIN SMALL LETTER J}
+\endsetslot
+
+\setslot{k}
+ \Unicode{006B}{LATIN SMALL LETTER K}
+\endsetslot
+
+\setslot{l}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+\endsetslot
+
+\setslot{m}
+ \Unicode{006D}{LATIN SMALL LETTER M}
+\endsetslot
+
+\setslot{n}
+ \Unicode{006E}{LATIN SMALL LETTER N}
+\endsetslot
+
+\setslot{o}
+ \Unicode{006F}{LATIN SMALL LETTER O}
+\endsetslot
+
+\setslot{p}
+ \Unicode{0070}{LATIN SMALL LETTER P}
+\endsetslot
+
+\setslot{q}
+ \Unicode{0071}{LATIN SMALL LETTER Q}
+\endsetslot
+
+\setslot{r}
+ \Unicode{0072}{LATIN SMALL LETTER R}
+\endsetslot
+
+\setslot{s}
+ \Unicode{0073}{LATIN SMALL LETTER S}
+\endsetslot
+
+\setslot{t}
+ \Unicode{0074}{LATIN SMALL LETTER T}
+\endsetslot
+
+\setslot{u}
+ \Unicode{0075}{LATIN SMALL LETTER U}
+\endsetslot
+
+\setslot{v}
+ \Unicode{0076}{LATIN SMALL LETTER V}
+\endsetslot
+
+\setslot{w}
+ \Unicode{0077}{LATIN SMALL LETTER W}
+\endsetslot
+
+\setslot{x}
+ \Unicode{0078}{LATIN SMALL LETTER X}
+\endsetslot
+
+\setslot{y}
+ \Unicode{0079}{LATIN SMALL LETTER Y}
+\endsetslot
+
+\setslot{z}
+ \Unicode{007A}{LATIN SMALL LETTER Z}
+\endsetslot
+
+
+\begincomment
+\subsection{Greek letters}
+\endcomment
+
+\nextslot{0}
+\setslot{Gamma}
+ \Unicode{0393}{GREEK CAPITAL LETTER GAMMA}
+\endsetslot
+
+\setslot{Delta}
+ \Unicode{0394}{GREEK CAPITAL LETTER DELTA}
+\endsetslot
+
+\setslot{Theta}
+ \Unicode{0398}{GREEK CAPITAL LETTER THETA}
+\endsetslot
+
+\setslot{Lambda}
+ \Unicode{039B}{GREEK CAPITAL LETTER LAMBDA}
+ % Unicode's preferred name for this character seems to be
+ % GREEK CAPITAL LETTER LAMDA, i.e., without the `B'. Why?
+ % GREEK CAPITAL LETTER LAMBDA is listed as an alternative name.
+\endsetslot
+
+\setslot{Xi}
+ \Unicode{039E}{GREEK CAPITAL LETTER XI}
+\endsetslot
+
+\setslot{Pi}
+ \Unicode{03A0}{GREEK CAPITAL LETTER PI}
+\endsetslot
+
+\setslot{Sigma}
+ \Unicode{03A3}{GREEK CAPITAL LETTER SIGMA}
+\endsetslot
+
+\setslot{Upsilon1}
+ \Unicode{03D2}{GREEK UPSILON WITH HOOK SYMBOL}
+ \comment{This is primarily a math character and it is should
+ be visually distinct from the character in slot~\ref{Y}. This is
+ not generally the case for the normal Upsilon
+ \textunicode{03A5}{GREEK CAPITAL LETTER UPSILON}, which is by
+ the way what usually has the glyph name \texttt{Upsilon}.
+ An argument for the latter is however that all the purely
+ mathematical Upsilons that exist in the Unicode standard are
+ described as variants of the non-hook character.}
+\endsetslot
+
+\setslot{Phi}
+ \Unicode{03A6}{GREEK CAPITAL LETTER PHI}
+\endsetslot
+
+\setslot{Psi}
+ \Unicode{03A8}{GREEK CAPITAL LETTER PSI}
+\endsetslot
+
+\setslot{Omega}
+ \Unicode{03A9}{GREEK CAPITAL LETTER OMEGA}
+\endsetslot
+
+
+\begincomment
+\subsection{Digits}
+\endcomment
+
+\nextslot{48}
+\setslot{zero}
+ \Unicode{0030}{DIGIT ZERO}
+\endsetslot
+
+\setslot{one}
+ \Unicode{0031}{DIGIT ONE}
+\endsetslot
+
+\setslot{two}
+ \Unicode{0032}{DIGIT TWO}
+\endsetslot
+
+\setslot{three}
+ \Unicode{0033}{DIGIT THREE}
+\endsetslot
+
+\setslot{four}
+ \Unicode{0034}{DIGIT FOUR}
+\endsetslot
+
+\setslot{five}
+ \Unicode{0035}{DIGIT FIVE}
+\endsetslot
+
+\setslot{six}
+ \Unicode{0036}{DIGIT SIX}
+\endsetslot
+
+\setslot{seven}
+ \Unicode{0037}{DIGIT SEVEN}
+\endsetslot
+
+\setslot{eight}
+ \Unicode{0038}{DIGIT EIGHT}
+\endsetslot
+
+\setslot{nine}
+ \Unicode{0039}{DIGIT NINE}
+\endsetslot
+
+
+\begincomment
+\subsection{Accents}
+\endcomment
+
+\nextslot{18}
+\setslot{grave}
+ \Unicode{0300}{COMBINING GRAVE ACCENT}
+\endsetslot
+
+\setslot{acute}
+ \Unicode{0301}{COMBINING ACUTE ACCENT}
+\endsetslot
+
+\setslot{caron}
+ \Unicode{030C}{COMBINING CARON}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\setslot{breve}
+ \Unicode{0306}{COMBINING BREVE}
+\endsetslot
+
+\setslot{macron}
+ \Unicode{0304}{COMBINING MACRON}
+\endsetslot
+
+\setslot{ring}
+ \Unicode{030A}{COMBINING RING ABOVE}
+ \comment{The text definition of `\verb|\r{A}|' assumes that this
+ glyph has the same width as that in slot~\ref{A}.}
+\endsetslot
+
+\setslot{cedilla}
+ \Unicode{0327}{COMBINING CEDILLA}
+ \comment{This slot is not required for math, but is used by
+ the \cs{c} \LaTeX\ command.}
+\endsetslot
+
+
+\nextslot{94}
+\setslot{circumflex}
+ \Unicode{0302}{COMBINING CIRCUMFLEX ACCENT}
+ \Unicode{005E}{CIRCUMFLEX ACCENT}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{dotaccent}
+ \Unicode{0307}{COMBINING DOT ABOVE}
+ \label{dotaccent}
+\endsetslot
+
+\begincomment
+\par\medskip
+Note that the \(\mathit{ligaturing} = 0\) assignment to
+slot~\ref{underscore} is ordinary, not mandatory.
+\endcomment
+
+\Fi
+
+
+\nextslot{126}
+\setslot{tilde}
+ \Unicode{0303}{COMBINING TILDE}
+ \Unicode{007E}{TILDE}
+\endsetslot
+
+\setslot{dieresis}
+ \Unicode{0308}{COMBINING DIAERESIS}
+\endsetslot
+
+
+\begincomment
+\subsection{Symbols}
+\endcomment
+
+\nextslot{33}
+\setslot{exclam}
+ \Unicode{0021}{EXCLAMATION MARK}
+ \Ligature{LIG}{quoteleft}{exclamdown}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{numbersign}
+ \Unicode{0023}{NUMBER SIGN}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\ifnumber{\int{italicizing}}={0}\then
+
+\setslot{dollar}
+ \Unicode{0024}{DOLLAR SIGN}
+\endsetslot
+
+\Else
+
+\setslot{sterling}
+ \Unicode{00A3}{POUND SIGN}
+\endsetslot
+
+\Fi
+
+\setslot{percent}
+ \Unicode{0025}{PERCENT SIGN}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\setslot{ampersand}
+ \Unicode{0026}{AMPERSAND}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\setslot{quoteright}
+ \Unicode{2019}{RIGHT SINGLE QUOTATION MARK}
+ \comment{This slot is not used for math.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \Ligature{LIG}{quoteright}{quotedblright}
+ \Fi
+\endsetslot
+
+\setslot{parenleft}
+ \Unicode{0028}{LEFT PARENTHESIS}
+\endsetslot
+
+\setslot{parenright}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+\endsetslot
+
+\setslot{asterisk}
+ \Unicode{002A}{ASTERISK}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\setslot{plus}
+ \Unicode{002B}{PLUS SIGN}
+\endsetslot
+
+\setslot{comma}
+ \Unicode{002C}{COMMA}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\setslot{hyphen}
+ \Unicode{002D}{HYPHEN-MINUS}
+ \comment{This slot is not used for math.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \Ligature{LIG}{hyphen}{endash}
+ \Fi
+\endsetslot
+
+\setslot{period}
+ \Unicode{002E}{FULL STOP}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\setslot{slash}
+ \Unicode{002F}{SOLIDUS}
+\endsetslot
+
+\nextslot{58}
+\setslot{colon}
+ \Unicode{003A}{COLON}
+\endsetslot
+
+\setslot{semicolon}
+ \Unicode{003B}{SEMICOLON}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{equal}
+ \Unicode{003D}{EQUALS SIGN}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{question}
+ \Unicode{003F}{QUESTION MARK}
+ \Ligature{LIG}{quoteleft}{questiondown}
+\endsetslot
+
+\setslot{at}
+ \Unicode{0040}{COMMERCIAL AT}
+ \comment{This slot is not used for math.}
+\endsetslot
+
+\nextslot{91}
+\setslot{bracketleft}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{bracketright}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+\endsetslot
+
+\nextslot{96}
+\setslot{quoteleft}
+ \Unicode{2018}{LEFT SINGLE QUOTATION MARK}
+ \comment{This slot is not used for math.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \Ligature{LIG}{quoteleft}{quotedblleft}
+ \Fi
+\endsetslot
+
+
+
+\begincomment
+\section{Ordinary characters}
+
+\subsection{Letters}
+\endcomment
+
+\ifnumber{\int{ligaturing}}={2}\then
+
+\nextslot{11}
+\setslot{ff}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+ \ligature{LIG}{i}{ffi}
+ \ligature{LIG}{l}{ffl}
+\endsetslot
+
+\setslot{fi}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{fl}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{ffi}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ }
+ \comment{This glyph should be three characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{ffl}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+ }
+ \comment{This glyph should be three characters wide in a monowidth
+ font.}
+\endsetslot
+
+\Fi
+
+\nextslot{"8A}
+\setslot{Lslash}
+ \Unicode{0141}{LATIN CAPITAL LETTER L WITH STROKE}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+\setslot{lslash}
+ \Unicode{0142}{LATIN SMALL LETTER L WITH STROKE}
+ \comment{The letter `\l'.}
+\endsetslot
+
+
+\begincomment
+\subsection{Accents}
+\endcomment
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\nextslot{125}
+\setslot{hungarumlaut}
+ \Unicode{030B}{COMBINING DOUBLE ACUTE ACCENT}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\Fi
+
+\begincomment
+\subsection{Symbols}
+\endcomment
+
+\ifnumber{\int{ligaturing}}<{2}\then
+
+\nextslot{11}
+\setslot{arrowup}
+ \Unicode{2191}{UPWARDS ARROW}
+\endsetslot
+
+\setslot{arrowdown}
+ \Unicode{2193}{DOWNWARDS ARROW}
+\endsetslot
+
+\setslot{quotesingle}
+ \Unicode{0027}{APOSTROPHE}
+\endsetslot
+
+\setslot{exclamdown}
+ \Unicode{00A1}{INVERTED EXCLAMATION MARK}
+\endsetslot
+
+\setslot{questiondown}
+ \Unicode{00BF}{INVERTED QUESTION MARK}
+\endsetslot
+
+\Fi
+
+\nextslot{32}
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{lslashslash}
+ \comment{When this character is followed by
+ \textunicode{004C}{LATIN CAPITAL LETTER L} then the combined
+ result is \textunicode{0141}{LATIN CAPITAL LETTER L WITH STROKE};
+ this is used by the \cs{L} command. When this character is
+ followed by \textunicode{006C}{LATIN SMALL LETTER L} then the
+ combined result is \textunicode{0142}{LATIN SMALL LETTER L WITH
+ STROKE}; this is used by the \cs{l} command. There are no further
+ semantics for this character.}
+ \ligature{LIG}{L}{Lslash}
+ \ligature{LIG}{l}{lslash}
+ \comment{These ligatures, and the characters they point to, were
+ added by Alan Jeffrey early in \textsf{fontinst} development in
+ order to allow the character in this slot to exhibit the correct
+ behaviour even in fonts where there is no corresponding glyph.}
+\endsetslot
+
+\Else
+
+\setslot{visiblespace}
+ \Unicode{2423}{OPEN BOX}
+ \comment{A visible space glyph `\textvisiblespace'.}
+\endsetslot
+
+\Fi
+
+
+\nextslot{34}
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{quotedblright}
+ \Unicode{201D}{RIGHT DOUBLE QUOTATION MARK}
+\endsetslot
+
+\Else
+
+\setslot{quotedbl}
+ \Unicode{0022}{QUOTATION MARK}
+\endsetslot
+
+\Fi
+
+\nextslot{60}
+\ifnumber{\int{ligaturing}}={2}\then
+
+\setslot{exclamdown}
+ \Unicode{00A1}{INVERTED EXCLAMATION MARK}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{questiondown}
+ \Unicode{00BF}{INVERTED QUESTION MARK}
+\endsetslot
+
+\Else
+
+\setslot{less}
+ \Unicode{003C}{LESS-THAN SIGN}
+\endsetslot
+
+\skipslots{1}
+
+\setslot{greater}
+ \Unicode{003E}{GREATER-THAN SIGN}
+\endsetslot
+
+\Fi
+
+\nextslot{92}
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{quotedblleft}
+ \Unicode{201C}{LEFT DOUBLE QUOTATION MARK}
+\endsetslot
+
+\Else
+
+\setslot{backslash}
+ \Unicode{005C}{REVERSE SOLIDUS}
+\endsetslot
+
+\nextslot{95}
+\setslot{underscore}
+ \Unicode{005F}{LOW LINE}
+ \label{underscore}
+\endsetslot
+
+\begincomment
+\par\medskip
+Note that the \(\mathit{ligaturing} > 0\) assignment to
+slot~\ref{dotaccent} is mandatory, not ordinary.
+\endcomment
+
+\Fi
+
+
+\nextslot{123}
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{endash}
+ \Unicode{2013}{EN DASH}
+ \Ligature{LIG}{hyphen}{emdash}
+\endsetslot
+
+\setslot{emdash}
+ \Unicode{2014}{EM DASH}
+ \comment{In a monowidth font this character is preferably given the
+ width of two normal characters.}
+\endsetslot
+
+\Else
+
+\setslot{braceleft}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+\endsetslot
+
+\setslot{bar}
+ \Unicode{007C}{VERTICAL LINE}
+\endsetslot
+
+\setslot{braceright}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+\endsetslot
+
+\Fi
+
+
+\begincomment
+\section{Fontdimens}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+
+\begincomment
+\section{Coding scheme}
+\endcomment
+
+\ifnumber{\int{ligaturing}}={2}\then
+
+\setstr{codingscheme}{TEX TEXT}
+
+\Else\ifnumber{\int{ligaturing}}={1}\then
+
+\setstr{codingscheme}{TEX TEXT WITHOUT F-LIGATURES}
+
+\Else
+
+\setstr{codingscheme}{TEX TYPEWRITER TEXT}
+
+\Fi\Fi
+
+
+\endencoding
+
+
+\section{Discussion}
+
+
+\subsection{\texttt{OT1} as math font encoding}
+
+As source for the math requirements on the \texttt{OT1} encoding
+was used the standard \LaTeX\ math set-up~\cite{fontdef}. Those
+definitions that make use of \texttt{OT1} fonts either use the
+\texttt{operators} symbol font\slash font family~0 or have math
+class~7 (\cs{mathalpha}).
+
+There are two slots used for math that have different assignments
+in different encoding variants. Slot 36 (\texttt{dollar}\slash
+\texttt{sterling}) depends on the $\mathit{italicizing}$, and is used
+by the commands \cs{mathdollar} (called by \verb|\$|) and
+\cs{mathsterling} (called by \cs{pounds}). This works because these
+commands explicitly take the character from a font with the correct
+$\mathit{italicizing}$.
+
+Slot~95 (\texttt{dotaccent}\slash \texttt{underline}) depends on the
+$\mathit{ligaturing}$ and is used by the \cs{dot} command. This
+command does \emph{not} work for fonts with \(\mathit{ligaturing}=0\),
+and hence e.g.\ the formula \verb|$\mathtt{\dot{x}}$| does not produce
+a typewriter dotted `x', but rather an `x' and underscore printed on
+top of each other. This is thus an error, but due to that it is
+unlikely that the error will be missed by the author who encounters
+it, the error is probably harmless.
+
+
+\subsection{\texttt{OT1} as text font encoding}
+
+The sources used to determine the text requirements on the
+\texttt{OT1} encoding were~\cite{ltoutenc}.
+
+It turns out that there are LICR commands which rely on non-mandatory
+features of the font. It is mostly for the \(\mathit{ligaturing} = 0\)
+fonts that commands produce incorrect results. The following commands
+work with all \texttt{OT1} fonts which have \(\mathit{ligaturing} > 0\)
+but fail with the others: \cs{L}, \cs{l}, \cs{.}, \cs{H},
+\cs{textemdash}, \cs{textendash}, and \cs{textquotedblleft}.
+In addition, the command \cs{textquotedblright} produces a
+reasonable, but not exactly correct, result.
+
+Traditionally the \cs{textexclamdown} and \cs{textquestiondown} have
+only worked for fonts which have \(\mathit{ligaturing} = 2\), but
+that can be fixed; see~\cite{latex/3368}.
+
+
+\section{Changes}
+
+The changes made to this specification since the original 2001/09/09
+version are as follows.
+
+2004/12/16: Changed the f-ligatures to character sequences, which
+makes more sense for \texttt{CMap}s. Incremented needed versions
+accordingly. /LH
+
+
+\begin{thebibliography}{9}
+\bibitem{ltoutenc}
+ Johannes Braams, David Carlisle, Alan Jeffrey, Frank Mittelbach,
+ Chris Rowley, and Rainer Sch\"opf:
+ \textit{ltoutenc.dtx}, v\,1.91 (2000);
+ the file \texttt{ltoutenc.dtx} in the \LaTeX\ base distribution.
+\bibitem{latex/3368}
+ Lars Hellstr\"om:
+ \textit{\texttt{OT1} def.\ of \cs{textexclamdown} and
+ \cs{textquestiondown}}, \LaTeX\ bugs database entry
+ \textbf{latex/3368}, 2001.
+% ; \textsc{http:}/\slash \texttt{www.latex-project.org}\slash
+% \texttt{cgi-bin}\slash \texttt{ltxbugs2html\discretionary{?}{}{?}%
+% pr=latex/3368}.
+\bibitem{ComputerModern}
+ Donald E. Knuth:
+ \textit{Computer Modern Typefaces},
+ volume E of \textit{Computers \& Typesetting},
+ Ad\-di\-son--Wes\-ley, 1986, xvi+588\,pp.;
+ ISBN~0-201-13446-2.
+\bibitem{fontdef}
+ Frank Mittelbach and Rainer Sch\"opf:
+ \textit{The \texttt{fontdef.dtx} file}, v\,2.2x (1999);
+ the file \texttt{fontdef.dtx} in the \LaTeX\ base distribution.
+\end{thebibliography}
+
+
+\end{document}
+
+
+
diff --git a/fonts/utilities/fontinst/doc/encspecs/t1draft.etx b/fonts/utilities/fontinst/doc/encspecs/t1draft.etx
new file mode 100644
index 0000000000..d82c9e53ed
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/encspecs/t1draft.etx
@@ -0,0 +1,1484 @@
+\relax
+\documentclass[twocolumn]{article}
+\usepackage[specification]{fontdoc}[2004/11/28]
+\usepackage{shortvrb}
+
+\MakeShortVerb{\|}
+
+\begin{document}
+\title{\texttt{T1} encoding draft specification}
+\author{Lars Hellstr\"om}
+\date{2002/07/05}
+\maketitle
+
+\begin{abstract}
+ The \texttt{T1} encoding covers most\footnote{But not quite all.}
+ letters in the latin script that are used in European languages.
+ Code points 32--126 coincide with ASCII\footnote{As defined in
+ Appendix C of \emph{The \TeX book}~\cite{TeXbook}, not as defined
+ by the ANSI.} and code points 192--255 are mainly the same as in
+ the latin-1 encoding~\cite{ISO8859-1,latin-page}, but there are
+ exceptions.
+\end{abstract}
+
+\encoding
+
+\needsfontinstversion{1.928}
+
+\begincomment
+\section{Mandatory characters}
+\endcomment
+
+\begincomment
+\subsection{Letters}
+More than two thirds of the characters in the encoding are letters.
+This is a deliberate choice: \TeX's hyphenation algorithm requires
+that all characters in a word are taken from the same font, hence it
+is advantageous\footnote{Probably less so than what was thought when
+the encoding was designed, but still advantageous.} to keep as many
+letters as possible in the same font. Taking symbols from other fonts
+is less of a disadvantage.
+
+\subsubsection{``Unaccented'' letters in slots 0--127}
+\endcomment
+
+\nextslot{25}
+\setslot{dotlessi}
+ \Unicode{0131}{LATIN SMALL LETTER DOTLESS I}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \Unicode{F6BE}{LATIN SMALL LETTER DOTLESS J}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. The Unicode standard does not define this character, but
+ Adobe has assigned code point \texttt{U+F6BE} (which lies
+ in the private use subarea assigned by Adobe) to it.}
+\endsetslot
+
+
+\nextslot{65}
+\setslot{A}
+ \Unicode{0041}{LATIN CAPITAL LETTER A}
+\endsetslot
+
+\setslot{B}
+ \Unicode{0042}{LATIN CAPITAL LETTER B}
+\endsetslot
+
+\setslot{C}
+ \Unicode{0043}{LATIN CAPITAL LETTER C}
+\endsetslot
+
+\setslot{D}
+ \Unicode{0044}{LATIN CAPITAL LETTER D}
+\endsetslot
+
+\setslot{E}
+ \Unicode{0045}{LATIN CAPITAL LETTER E}
+\endsetslot
+
+\setslot{F}
+ \Unicode{0046}{LATIN CAPITAL LETTER F}
+\endsetslot
+
+\setslot{G}
+ \Unicode{0047}{LATIN CAPITAL LETTER G}
+\endsetslot
+
+\setslot{H}
+ \Unicode{0048}{LATIN CAPITAL LETTER H}
+\endsetslot
+
+\setslot{I}
+ \Unicode{0049}{LATIN CAPITAL LETTER I}
+ \oddligature{This ligature only occurs in Dutch typography.}
+ {LIG}{J}{IJ}
+ \oddligature{This ligature only occurs in Dutch typography.}
+ {LIG}{j}{IJ}
+\endsetslot
+
+\setslot{J}
+ \Unicode{004A}{LATIN CAPITAL LETTER J}
+\endsetslot
+
+\setslot{K}
+ \Unicode{004B}{LATIN CAPITAL LETTER K}
+\endsetslot
+
+\setslot{L}
+ \Unicode{004C}{LATIN CAPITAL LETTER L}
+\endsetslot
+
+\setslot{M}
+ \Unicode{004D}{LATIN CAPITAL LETTER M}
+\endsetslot
+
+\setslot{N}
+ \Unicode{004E}{LATIN CAPITAL LETTER N}
+\endsetslot
+
+\setslot{O}
+ \Unicode{004F}{LATIN CAPITAL LETTER O}
+\endsetslot
+
+\setslot{P}
+ \Unicode{0050}{LATIN CAPITAL LETTER P}
+\endsetslot
+
+\setslot{Q}
+ \Unicode{0051}{LATIN CAPITAL LETTER Q}
+\endsetslot
+
+\setslot{R}
+ \Unicode{0052}{LATIN CAPITAL LETTER R}
+\endsetslot
+
+\setslot{S}
+ \Unicode{0053}{LATIN CAPITAL LETTER S}
+\endsetslot
+
+\setslot{T}
+ \Unicode{0054}{LATIN CAPITAL LETTER T}
+\endsetslot
+
+\setslot{U}
+ \Unicode{0055}{LATIN CAPITAL LETTER U}
+\endsetslot
+
+\setslot{V}
+ \Unicode{0056}{LATIN CAPITAL LETTER V}
+\endsetslot
+
+\setslot{W}
+ \Unicode{0057}{LATIN CAPITAL LETTER W}
+\endsetslot
+
+\setslot{X}
+ \Unicode{0058}{LATIN CAPITAL LETTER X}
+\endsetslot
+
+\setslot{Y}
+ \Unicode{0059}{LATIN CAPITAL LETTER Y}
+\endsetslot
+
+\setslot{Z}
+ \Unicode{005A}{LATIN CAPITAL LETTER Z}
+\endsetslot
+
+
+\nextslot{97}
+\setslot{a}
+ \Unicode{0061}{LATIN SMALL LETTER A}
+\endsetslot
+
+\setslot{b}
+ \Unicode{0062}{LATIN SMALL LETTER B}
+\endsetslot
+
+\setslot{c}
+ \Unicode{0063}{LATIN SMALL LETTER C}
+\endsetslot
+
+\setslot{d}
+ \Unicode{0064}{LATIN SMALL LETTER D}
+\endsetslot
+
+\setslot{e}
+ \Unicode{0065}{LATIN SMALL LETTER E}
+\endsetslot
+
+\setslot{f}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \ligature{LIG}{f}{ff}
+ \ligature{LIG}{i}{fi}
+ \ligature{LIG}{l}{fl}
+\endsetslot
+
+\setslot{g}
+ \Unicode{0067}{LATIN SMALL LETTER G}
+\endsetslot
+
+\setslot{h}
+ \Unicode{0068}{LATIN SMALL LETTER H}
+\endsetslot
+
+\setslot{i}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ \oddligature{This ligature only occurs in Dutch typography.}
+ {LIG}{j}{ij}
+\endsetslot
+
+\setslot{j}
+ \Unicode{006A}{LATIN SMALL LETTER J}
+\endsetslot
+
+\setslot{k}
+ \Unicode{006B}{LATIN SMALL LETTER K}
+\endsetslot
+
+\setslot{l}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+\endsetslot
+
+\setslot{m}
+ \Unicode{006D}{LATIN SMALL LETTER M}
+\endsetslot
+
+\setslot{n}
+ \Unicode{006E}{LATIN SMALL LETTER N}
+\endsetslot
+
+\setslot{o}
+ \Unicode{006F}{LATIN SMALL LETTER O}
+\endsetslot
+
+\setslot{p}
+ \Unicode{0070}{LATIN SMALL LETTER P}
+\endsetslot
+
+\setslot{q}
+ \Unicode{0071}{LATIN SMALL LETTER Q}
+\endsetslot
+
+\setslot{r}
+ \Unicode{0072}{LATIN SMALL LETTER R}
+\endsetslot
+
+\setslot{s}
+ \Unicode{0073}{LATIN SMALL LETTER S}
+\endsetslot
+
+\setslot{t}
+ \Unicode{0074}{LATIN SMALL LETTER T}
+\endsetslot
+
+\setslot{u}
+ \Unicode{0075}{LATIN SMALL LETTER U}
+\endsetslot
+
+\setslot{v}
+ \Unicode{0076}{LATIN SMALL LETTER V}
+\endsetslot
+
+\setslot{w}
+ \Unicode{0077}{LATIN SMALL LETTER W}
+\endsetslot
+
+\setslot{x}
+ \Unicode{0078}{LATIN SMALL LETTER X}
+\endsetslot
+
+\setslot{y}
+ \Unicode{0079}{LATIN SMALL LETTER Y}
+\endsetslot
+
+\setslot{z}
+ \Unicode{007A}{LATIN SMALL LETTER Z}
+\endsetslot
+
+
+\begincomment
+\subsubsection{Mainly East-European accented letters
+ in slots 128--191}
+\endcomment
+
+\nextslot{128}
+\setslot{Abreve}
+ \Unicode{0102}{LATIN CAPITAL LETTER A WITH BREVE}
+\endsetslot
+
+\setslot{Aogonek}
+ \Unicode{0104}{LATIN CAPITAL LETTER A WITH OGONEK}
+\endsetslot
+
+\setslot{Cacute}
+ \Unicode{0106}{LATIN CAPITAL LETTER C WITH ACUTE}
+\endsetslot
+
+\setslot{Ccaron}
+ \Unicode{010C}{LATIN CAPITAL LETTER C WITH CARON}
+\endsetslot
+
+\setslot{Dcaron}
+ \Unicode{010E}{LATIN CAPITAL LETTER D WITH CARON}
+\endsetslot
+
+\setslot{Ecaron}
+ \Unicode{011A}{LATIN CAPITAL LETTER E WITH CARON}
+\endsetslot
+
+\setslot{Eogonek}
+ \Unicode{0118}{LATIN CAPITAL LETTER E WITH OGONEK}
+\endsetslot
+
+\setslot{Gbreve}
+ \Unicode{011E}{LATIN CAPITAL LETTER G WITH BREVE}
+\endsetslot
+
+\setslot{Lacute}
+ \Unicode{0139}{LATIN CAPITAL LETTER L WITH ACUTE}
+\endsetslot
+
+\setslot{Lcaron}
+ \Unicode{013D}{LATIN CAPITAL LETTER L WITH CARON}
+ \comment{The normal glyph for this character consists of a capital
+ L and a right single quote, but the underlying accent is a caron.
+ The glyph name \texttt{Lquoteright} is not uncommon, but
+ \cite{AGL} uses \texttt{Lcaron}.}
+\endsetslot
+
+\setslot{Lslash}
+ \Unicode{0141}{LATIN CAPITAL LETTER L WITH STROKE}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\setslot{Nacute}
+ \Unicode{0143}{LATIN CAPITAL LETTER N WITH ACUTE}
+\endsetslot
+
+\setslot{Ncaron}
+ \Unicode{0147}{LATIN CAPITAL LETTER N WITH CARON}
+\endsetslot
+
+\setslot{Eng}
+ \Unicode{014A}{LATIN CAPITAL LETTER ENG}
+\endsetslot
+
+\setslot{Ohungarumlaut}
+ \Unicode{0150}{LATIN CAPITAL LETTER O WITH DOUBLE ACUTE}
+ \comment{The letter `\H{O}'.}
+\endsetslot
+
+\setslot{Racute}
+ \Unicode{0154}{LATIN CAPITAL LETTER R WITH ACUTE}
+\endsetslot
+
+\setslot{Rcaron}
+ \Unicode{0158}{LATIN CAPITAL LETTER R WITH CARON}
+\endsetslot
+
+\setslot{Sacute}
+ \Unicode{015A}{LATIN CAPITAL LETTER S WITH ACUTE}
+\endsetslot
+
+\setslot{Scaron}
+ \Unicode{0160}{LATIN CAPITAL LETTER S WITH CARON}
+\endsetslot
+
+\setslot{Scedilla}
+ \Unicode{015E}{LATIN CAPITAL LETTER S WITH CEDILLA}
+ \comment{In Romanian, character \textunicode{0218}{latin
+ capital letter s with comma below} is preferred, but that
+ wasn't known when this encoding was designed.}
+\endsetslot
+
+\setslot{Tcaron}
+ \Unicode{0164}{LATIN CAPITAL LETTER T WITH CARON}
+\endsetslot
+
+\setslot{Tcommaaccent}
+ \Unicode{021A}{LATIN CAPITAL LETTER T WITH COMMA BELOW}
+\endsetslot
+
+\setslot{Uhungarumlaut}
+ \Unicode{0170}{LATIN CAPITAL LETTER U WITH DOUBLE ACUTE}
+ \comment{The letter `\H{U}'.}
+\endsetslot
+
+\setslot{Uring}
+ \Unicode{016E}{LATIN CAPITAL LETTER U WITH RING ABOVE}
+\endsetslot
+
+\setslot{Ydieresis}
+ \Unicode{0178}{LATIN CAPITAL LETTER Y WITH DIAERESIS}
+\endsetslot
+
+\setslot{Zacute}
+ \Unicode{0179}{LATIN CAPITAL LETTER Z WITH ACUTE}
+\endsetslot
+
+\setslot{Zcaron}
+ \Unicode{017D}{LATIN CAPITAL LETTER Z WITH CARON}
+\endsetslot
+
+\setslot{Zdotaccent}
+ \Unicode{017B}{LATIN CAPITAL LETTER Z WITH DOT ABOVE}
+\endsetslot
+
+\skipslots{1}
+\setslot{Idotaccent}
+ \Unicode{0130}{LATIN CAPITAL LETTER I WITH DOT ABOVE}
+ \comment{This character's |\lccode| value points to slot 105
+ (\texttt{i}), as does that of slot 73 (\texttt{I}).}
+\endsetslot
+
+\setslot{dcroat}
+ \Unicode{0111}{LATIN SMALL LETTER D WITH STROKE}
+\endsetslot
+
+
+\nextslot{160}
+\setslot{abreve}
+ \Unicode{0103}{LATIN SMALL LETTER A WITH BREVE}
+\endsetslot
+
+\setslot{aogonek}
+ \Unicode{0105}{LATIN SMALL LETTER A WITH OGONEK}
+\endsetslot
+
+\setslot{cacute}
+ \Unicode{0107}{LATIN SMALL LETTER C WITH ACUTE}
+\endsetslot
+
+\setslot{ccaron}
+ \Unicode{010D}{LATIN SMALL LETTER C WITH CARON}
+\endsetslot
+
+\setslot{dcaron}
+ \Unicode{010F}{LATIN SMALL LETTER D WITH CARON}
+ \comment{The normal glyph for this character consists of a
+ lower case d and a right single quote, but the underlying
+ accent is a caron.}
+\endsetslot
+
+\setslot{ecaron}
+ \Unicode{011B}{LATIN SMALL LETTER E WITH CARON}
+\endsetslot
+
+\setslot{eogonek}
+ \Unicode{0119}{LATIN SMALL LETTER E WITH OGONEK}
+\endsetslot
+
+\setslot{gbreve}
+ \Unicode{011F}{LATIN SMALL LETTER G WITH BREVE}
+\endsetslot
+
+\setslot{lacute}
+ \Unicode{013A}{LATIN SMALL LETTER L WITH ACUTE}
+\endsetslot
+
+\setslot{lcaron}
+ \Unicode{013E}{LATIN SMALL LETTER L WITH CARON}
+ \comment{The normal glyph for this character consists of a
+ lower case l and a right single quote, but the underlying
+ accent is a caron. The glyph name \texttt{lquoteright} is
+ not uncommon, but \cite{AGL} uses \texttt{lcaron}.}
+\endsetslot
+
+\setslot{lslash}
+ \Unicode{0142}{LATIN SMALL LETTER L WITH STROKE}
+\endsetslot
+
+\setslot{nacute}
+ \Unicode{0144}{LATIN SMALL LETTER N WITH ACUTE}
+\endsetslot
+
+\setslot{ncaron}
+ \Unicode{0148}{LATIN SMALL LETTER N WITH CARON}
+\endsetslot
+
+\setslot{eng}
+ \Unicode{014B}{LATIN SMALL LETTER ENG}
+\endsetslot
+
+\setslot{ohungarumlaut}
+ \Unicode{0151}{LATIN SMALL LETTER O WITH DOUBLE ACUTE}
+ \comment{The letter `\H{o}'.}
+\endsetslot
+
+\setslot{racute}
+ \Unicode{0155}{LATIN SMALL LETTER R WITH ACUTE}
+\endsetslot
+
+\setslot{rcaron}
+ \Unicode{0159}{LATIN SMALL LETTER R WITH CARON}
+\endsetslot
+
+\setslot{sacute}
+ \Unicode{015B}{LATIN SMALL LETTER S WITH ACUTE}
+\endsetslot
+
+\setslot{scaron}
+ \Unicode{0161}{LATIN SMALL LETTER S WITH CARON}
+\endsetslot
+
+\setslot{scedilla}
+ \Unicode{015F}{LATIN SMALL LETTER S WITH CEDILLA}
+ \comment{In Romanian, character \textunicode{0219}{latin
+ small letter s with comma below} is preferred, but that
+ wasn't known when this encoding was designed.}
+\endsetslot
+
+\setslot{tcaron}
+ \Unicode{0165}{LATIN SMALL LETTER T WITH CARON}
+ \comment{The normal glyph for this character consists of a
+ lower case t and a right single quote, but the underlying
+ accent is a caron.}
+\endsetslot
+
+\setslot{tcommaaccent}
+ \Unicode{021B}{LATIN SMALL LETTER T WITH COMMA BELOW}
+\endsetslot
+
+\setslot{uhungarumlaut}
+ \Unicode{0171}{LATIN SMALL LETTER U WITH DOUBLE ACUTE}
+\endsetslot
+
+\setslot{uring}
+ \Unicode{016F}{LATIN SMALL LETTER U WITH RING ABOVE}
+\endsetslot
+
+\setslot{ydieresis}
+ \Unicode{00FF}{LATIN SMALL LETTER Y WITH DIAERESIS}
+\endsetslot
+
+\setslot{zacute}
+ \Unicode{017A}{LATIN SMALL LETTER Z WITH ACUTE}
+\endsetslot
+
+\setslot{zcaron}
+ \Unicode{017E}{LATIN SMALL LETTER Z WITH CARON}
+\endsetslot
+
+\setslot{zdotaccent}
+ \Unicode{017C}{LATIN SMALL LETTER Z WITH DOT ABOVE}
+\endsetslot
+
+
+\begincomment
+\subsubsection{Mainly West-European accented letters in slots 192--255}
+\endcomment
+
+\nextslot{192}
+\setslot{Agrave}
+ \Unicode{00C0}{LATIN CAPITAL LETTER A WITH GRAVE}
+\endsetslot
+
+\setslot{Aacute}
+ \Unicode{00C1}{LATIN CAPITAL LETTER A WITH ACUTE}
+\endsetslot
+
+\setslot{Acircumflex}
+ \Unicode{00C2}{LATIN CAPITAL LETTER A WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{Atilde}
+ \Unicode{00C3}{LATIN CAPITAL LETTER A WITH TILDE}
+\endsetslot
+
+\setslot{Adieresis}
+ \Unicode{00C4}{LATIN CAPITAL LETTER A WITH DIAERESIS}
+\endsetslot
+
+\setslot{Aring}
+ \Unicode{00C5}{LATIN CAPITAL LETTER A WITH RING ABOVE}
+\endsetslot
+
+\setslot{AE}
+ \Unicode{00C6}{LATIN CAPITAL LETTER AE}
+\endsetslot
+
+\setslot{Ccedilla}
+ \Unicode{00C7}{LATIN CAPITAL LETTER C WITH CEDILLA}
+\endsetslot
+
+\setslot{Egrave}
+ \Unicode{00C8}{LATIN CAPITAL LETTER E WITH GRAVE}
+\endsetslot
+
+\setslot{Eacute}
+ \Unicode{00C9}{LATIN CAPITAL LETTER E WITH ACUTE}
+\endsetslot
+
+\setslot{Ecircumflex}
+ \Unicode{00CA}{LATIN CAPITAL LETTER E WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{Edieresis}
+ \Unicode{00CB}{LATIN CAPITAL LETTER E WITH DIAERESIS}
+\endsetslot
+
+\setslot{Igrave}
+ \Unicode{00CC}{LATIN CAPITAL LETTER I WITH GRAVE}
+\endsetslot
+
+\setslot{Iacute}
+ \Unicode{00CD}{LATIN CAPITAL LETTER I WITH ACUTE}
+\endsetslot
+
+\setslot{Icircumflex}
+ \Unicode{00CE}{LATIN CAPITAL LETTER I WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{Idieresis}
+ \Unicode{00CF}{LATIN CAPITAL LETTER I WITH DIAERESIS}
+\endsetslot
+
+\setslot{Eth}
+ \Unicode{00D0}{LATIN CAPITAL LETTER ETH}
+ \Unicode{0110}{LATIN CAPITAL LETTER D WITH STROKE}
+ \comment{This slot is being used to represent two different
+ letters whose capital forms are identical. The |\lccode| value
+ points to slot \ref{eth}.}
+\endsetslot
+
+\setslot{Ntilde}
+ \Unicode{00D1}{LATIN CAPITAL LETTER N WITH TILDE}
+\endsetslot
+
+\setslot{Ograve}
+ \Unicode{00D2}{LATIN CAPITAL LETTER O WITH GRAVE}
+\endsetslot
+
+\setslot{Oacute}
+ \Unicode{00D3}{LATIN CAPITAL LETTER O WITH ACUTE}
+\endsetslot
+
+\setslot{Ocircumflex}
+ \Unicode{00D4}{LATIN CAPITAL LETTER O WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{Otilde}
+ \Unicode{00D5}{LATIN CAPITAL LETTER O WITH TILDE}
+\endsetslot
+
+\setslot{Odieresis}
+ \Unicode{00D6}{LATIN CAPITAL LETTER O WITH DIAERESIS}
+\endsetslot
+
+\setslot{OE}
+ \Unicode{0152}{LATIN CAPITAL LIGATURE OE}
+ \comment{This is a single letter, and should not be faked with `OE'.}
+\endsetslot
+
+\setslot{Oslash}
+ \Unicode{00D8}{LATIN CAPITAL LETTER O WITH STROKE}
+\endsetslot
+
+\setslot{Ugrave}
+ \Unicode{00D9}{LATIN CAPITAL LETTER U WITH GRAVE}
+\endsetslot
+
+\setslot{Uacute}
+ \Unicode{00DA}{LATIN CAPITAL LETTER U WITH ACUTE}
+\endsetslot
+
+\setslot{Ucircumflex}
+ \Unicode{00DB}{LATIN CAPITAL LETTER U WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{Udieresis}
+ \Unicode{00DC}{LATIN CAPITAL LETTER U WITH DIAERESIS}
+\endsetslot
+
+\setslot{Yacute}
+ \Unicode{00DD}{LATIN CAPITAL LETTER Y WITH ACUTE}
+\endsetslot
+
+\setslot{Thorn}
+ \Unicode{00DE}{LATIN CAPITAL LETTER THORN}
+\endsetslot
+
+\setslot{SS}
+ \comment{This is an ``uppercased'' sharp s (`\ss') which always
+ looks exactly like two S's next to each other. In a monowidth
+ font it should be two letters wide. There are other characters
+ which could have made better use of this slot; the only function
+ of this slot which could not have been handled using macros is
+ that |\SS| and |SS| can have different hyphenation.}
+ \label{SS}
+ \charseq{
+ \Unicode{0053}{LATIN CAPITAL LETTER S}
+ \Unicode{0053}{LATIN CAPITAL LETTER S}
+ }
+\endsetslot
+
+\setslot{agrave}
+ \Unicode{00E0}{LATIN SMALL LETTER A WITH GRAVE}
+\endsetslot
+
+\setslot{aacute}
+ \Unicode{00E1}{LATIN SMALL LETTER A WITH ACUTE}
+\endsetslot
+
+\setslot{acircumflex}
+ \Unicode{00E2}{LATIN SMALL LETTER A WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{atilde}
+ \Unicode{00E3}{LATIN SMALL LETTER A WITH TILDE}
+\endsetslot
+
+\setslot{adieresis}
+ \Unicode{00E4}{LATIN SMALL LETTER A WITH DIAERESIS}
+\endsetslot
+
+\setslot{aring}
+ \Unicode{00E5}{LATIN SMALL LETTER A WITH RING ABOVE}
+\endsetslot
+
+\setslot{ae}
+ \Unicode{00E6}{LATIN SMALL LETTER AE}
+\endsetslot
+
+\setslot{ccedilla}
+ \Unicode{00E7}{LATIN SMALL LETTER C WITH CEDILLA}
+\endsetslot
+
+\setslot{egrave}
+ \Unicode{00E8}{LATIN SMALL LETTER E WITH GRAVE}
+\endsetslot
+
+\setslot{eacute}
+ \Unicode{00E9}{LATIN SMALL LETTER E WITH ACUTE}
+\endsetslot
+
+\setslot{ecircumflex}
+ \Unicode{00EA}{LATIN SMALL LETTER E WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{edieresis}
+ \Unicode{00EB}{LATIN SMALL LETTER E WITH DIAERESIS}
+\endsetslot
+
+\setslot{igrave}
+ \Unicode{00EC}{LATIN SMALL LETTER I WITH GRAVE}
+\endsetslot
+
+\setslot{iacute}
+ \Unicode{00ED}{LATIN SMALL LETTER I WITH ACUTE}
+\endsetslot
+
+\setslot{icircumflex}
+ \Unicode{00EE}{LATIN SMALL LETTER I WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{idieresis}
+ \Unicode{00EF}{LATIN SMALL LETTER I WITH DIAERESIS}
+\endsetslot
+
+\setslot{eth}
+ \Unicode{00F0}{LATIN SMALL LETTER ETH}
+ \label{eth}
+\endsetslot
+
+\setslot{ntilde}
+ \Unicode{00F1}{LATIN SMALL LETTER N WITH TILDE}
+\endsetslot
+
+\setslot{ograve}
+ \Unicode{00F2}{LATIN SMALL LETTER O WITH GRAVE}
+\endsetslot
+
+\setslot{oacute}
+ \Unicode{00F3}{LATIN SMALL LETTER O WITH ACUTE}
+\endsetslot
+
+\setslot{ocircumflex}
+ \Unicode{00F4}{LATIN SMALL LETTER O WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{otilde}
+ \Unicode{00F5}{LATIN SMALL LETTER O WITH TILDE}
+\endsetslot
+
+\setslot{odieresis}
+ \Unicode{00F6}{LATIN SMALL LETTER O WITH DIAERESIS}
+\endsetslot
+
+\setslot{oe}
+ \Unicode{0153}{LATIN SMALL LIGATURE OE}
+ \comment{This is a single letter, and should not be faked with `oe'.}
+\endsetslot
+
+\setslot{oslash}
+ \Unicode{00F8}{LATIN SMALL LETTER O WITH STROKE}
+\endsetslot
+
+\setslot{ugrave}
+ \Unicode{00F9}{LATIN SMALL LETTER U WITH GRAVE}
+\endsetslot
+
+\setslot{uacute}
+ \Unicode{00FA}{LATIN SMALL LETTER U WITH ACUTE}
+\endsetslot
+
+\setslot{ucircumflex}
+ \Unicode{00FB}{LATIN SMALL LETTER U WITH CIRCUMFLEX}
+\endsetslot
+
+\setslot{udieresis}
+ \Unicode{00FC}{LATIN SMALL LETTER U WITH DIAERESIS}
+\endsetslot
+
+\setslot{yacute}
+ \Unicode{00FD}{LATIN SMALL LETTER Y WITH ACUTE}
+\endsetslot
+
+\setslot{thorn}
+ \Unicode{00FE}{LATIN SMALL LETTER THORN}
+\endsetslot
+
+\setslot{germandbls}
+ \Unicode{00DF}{LATIN SMALL LETTER SHARP S}
+\endsetslot
+
+
+\begincomment
+\subsection{Accents}
+The Unicode equivalents of the accents are taken to be the combining
+forms of the accents found in code point \texttt{U+0300} and upwards.
+The reasons for this are (i) that they are primarily used with the
+|\accent| primitive, i.e., as combining characters, (ii) that some
+of them (e.g. \texttt{tilde}) have non-combining counterparts
+elsewhere in the encoding, and (iii) that they are not primarily
+phonetic marks.
+\endcomment
+
+\nextslot{0}
+\setslot{grave}
+ \Unicode{0300}{COMBINING GRAVE ACCENT}
+\endsetslot
+
+\setslot{acute}
+ \Unicode{0301}{COMBINING ACUTE ACCENT}
+\endsetslot
+
+\setslot{circumflex}
+ \Unicode{0302}{COMBINING CIRCUMFLEX ACCENT}
+\endsetslot
+
+\setslot{tilde}
+ \Unicode{0303}{COMBINING TILDE}
+\endsetslot
+
+\setslot{dieresis}
+ \Unicode{0308}{COMBINING DIAERESIS}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \Unicode{030B}{COMBINING DOUBLE ACUTE ACCENT}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\setslot{ring}
+ \Unicode{030A}{COMBINING RING ABOVE}
+\endsetslot
+
+\setslot{caron}
+ \Unicode{030C}{COMBINING CARON}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\setslot{breve}
+ \Unicode{0306}{COMBINING BREVE}
+\endsetslot
+
+\setslot{macron}
+ \Unicode{0304}{COMBINING MACRON}
+\endsetslot
+
+\setslot{dotaccent}
+ \Unicode{0307}{COMBINING DOT ABOVE}
+\endsetslot
+
+\setslot{cedilla}
+ \Unicode{0327}{COMBINING CEDILLA}
+\endsetslot
+
+\setslot{ogonek}
+ \Unicode{0328}{COMBINING OGONEK}
+\endsetslot
+
+
+\begincomment
+\subsection{Digits}
+\endcomment
+
+\nextslot{48}
+\setslot{zero}
+ \Unicode{0030}{DIGIT ZERO}
+\endsetslot
+
+\setslot{one}
+ \Unicode{0031}{DIGIT ONE}
+\endsetslot
+
+\setslot{two}
+ \Unicode{0032}{DIGIT TWO}
+\endsetslot
+
+\setslot{three}
+ \Unicode{0033}{DIGIT THREE}
+\endsetslot
+
+\setslot{four}
+ \Unicode{0034}{DIGIT FOUR}
+\endsetslot
+
+\setslot{five}
+ \Unicode{0035}{DIGIT FIVE}
+\endsetslot
+
+\setslot{six}
+ \Unicode{0036}{DIGIT SIX}
+\endsetslot
+
+\setslot{seven}
+ \Unicode{0037}{DIGIT SEVEN}
+\endsetslot
+
+\setslot{eight}
+ \Unicode{0038}{DIGIT EIGHT}
+\endsetslot
+
+\setslot{nine}
+ \Unicode{0039}{DIGIT NINE}
+\endsetslot
+
+
+\begincomment
+\subsection{Symbols and punctuation}
+\endcomment
+
+\nextslot{13}
+\setslot{quotesinglbase}
+ \Unicode{201A}{SINGLE LOW-9 QUOTATION MARK}
+\endsetslot
+
+\setslot{guilsinglleft}
+ \Unicode{2039}{SINGLE LEFT-POINTING ANGLE QUOTATION MARK}
+ \comment{In French typography this is an opening quotation mark,
+ but in German typography it is a closing quotation mark. The
+ character should kern well in both cases.}
+\endsetslot
+
+\setslot{guilsinglright}
+ \Unicode{203A}{SINGLE RIGHT-POINTING ANGLE QUOTATION MARK}
+ \comment{In French typography this is a closing quotation mark,
+ but in German typography it is an opening quotation mark. The
+ character should kern well in both cases.}
+\endsetslot
+
+\setslot{quotedblleft}
+ \Unicode{201C}{LEFT DOUBLE QUOTATION MARK}
+\endsetslot
+
+\setslot{quotedblright}
+ \Unicode{201D}{RIGHT DOUBLE QUOTATION MARK}
+ \comment{In English typography this quotation mark is always
+ closing, but in Swedish typography it is also an opening
+ quotation mark. The character should kern well in both cases.}
+\endsetslot
+
+\setslot{quotedblbase}
+ \Unicode{201E}{DOUBLE LOW-9 QUOTATION MARK}
+\endsetslot
+
+\setslot{guillemotleft}
+ \Unicode{00AB}{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}
+ \comment{In French typography this is an opening quotation mark,
+ but in German typography it is a closing quotation mark. The
+ character should kern well in both cases. The glyph name is
+ misspelt (it should be \texttt{guillemetleft}), but this
+ incorrect name is \emph{de facto} the glyph name used.}
+\endsetslot
+
+\setslot{guillemotright}
+ \Unicode{00BB}{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}
+ \comment{In French typography this is a closing quotation mark,
+ but in German typography it is an opening quotation mark. The
+ character should kern well in both cases. The glyph name is
+ misspelt (it should be \texttt{guillemetright}), but this
+ incorrect name is \emph{de facto} the glyph name used.}
+\endsetslot
+
+\setslot{endash}
+ \Unicode{2013}{EN DASH}
+ \label{endash}
+ \Ligature{LIG}{hyphen}{emdash}
+\endsetslot
+
+\setslot{emdash}
+ \Unicode{2014}{EM DASH}
+ \comment{In a monowidth font this character is preferably given the
+ width of two normal characters.}
+\endsetslot
+
+\nextslot{32}
+\setslot{visiblespace}
+ \Unicode{2423}{OPEN BOX}
+ \comment{A visible space glyph `\textvisiblespace'.}
+\endsetslot
+
+\setslot{exclam}
+ \Unicode{0021}{EXCLAMATION MARK}
+ \Ligature{LIG}{quoteleft}{exclamdown}
+\endsetslot
+
+\setslot{quotedbl}
+ \Unicode{0022}{QUOTATION MARK}
+ \comment{The `neutral' double quotation mark, included for use in
+ monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\setslot{numbersign}
+ \Unicode{0023}{NUMBER SIGN}
+\endsetslot
+
+\setslot{dollar}
+ \Unicode{0024}{DOLLAR SIGN}
+\endsetslot
+
+\setslot{percent}
+ \Unicode{0025}{PERCENT SIGN}
+\endsetslot
+
+\setslot{ampersand}
+ \Unicode{0026}{AMPERSAND}
+\endsetslot
+
+\setslot{quoteright}
+ \Unicode{2019}{RIGHT SINGLE QUOTATION MARK}
+ \Ligature{LIG}{quoteright}{quotedblright}
+\endsetslot
+
+\setslot{parenleft}
+ \Unicode{0028}{LEFT PARENTHESIS}
+\endsetslot
+
+\setslot{parenright}
+ \Unicode{0029}{RIGHT PARENTHESIS}
+\endsetslot
+
+\setslot{asterisk}
+ \Unicode{002A}{ASTERISK}
+\endsetslot
+
+\setslot{plus}
+ \Unicode{002B}{PLUS SIGN}
+\endsetslot
+
+\setslot{comma}
+ \Unicode{002C}{COMMA}
+ \Ligature{LIG}{comma}{quotedblbase}
+\endsetslot
+
+\setslot{hyphen}
+ \Unicode{002D}{HYPHEN-MINUS}
+ \Ligature{LIG}{hyphen}{endash}
+ \Ligature{LIG}{hyphenchar}{hyphenchar}
+ \comment{See also slot \ref{hyphenchar}.}
+ \label{hyphen}
+\endsetslot
+
+\setslot{period}
+ \Unicode{002E}{FULL STOP}
+\endsetslot
+
+\setslot{slash}
+ \Unicode{002F}{SOLIDUS}
+\endsetslot
+
+\skipslots{10}
+\setslot{colon}
+ \Unicode{003A}{COLON}
+\endsetslot
+
+\setslot{semicolon}
+ \Unicode{003B}{SEMICOLON}
+\endsetslot
+
+\setslot{less}
+ \Unicode{003C}{LESS-THAN SIGN}
+ \Ligature{LIG}{less}{guillemotleft}
+\endsetslot
+
+\setslot{equal}
+ \Unicode{003D}{EQUALS SIGN}
+\endsetslot
+
+\setslot{greater}
+ \Unicode{003E}{GREATER-THAN SIGN}
+ \Ligature{LIG}{greater}{guillemotright}
+\endsetslot
+
+\setslot{question}
+ \Unicode{003F}{QUESTION MARK}
+ \Ligature{LIG}{quoteleft}{questiondown}
+\endsetslot
+
+\setslot{at}
+ \Unicode{0040}{COMMERCIAL AT}
+\endsetslot
+
+\nextslot{91}
+\setslot{bracketleft}
+ \Unicode{005B}{LEFT SQUARE BRACKET}
+\endsetslot
+
+\setslot{backslash}
+ \Unicode{005C}{REVERSE SOLIDUS}
+\endsetslot
+
+\setslot{bracketright}
+ \Unicode{005D}{RIGHT SQUARE BRACKET}
+\endsetslot
+
+\setslot{asciicircum}
+ \Unicode{005E}{CIRCUMFLEX ACCENT}
+ \comment{The ASCII upward-pointing arrow head `\textasciicircum'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{underscore}
+ \Unicode{005F}{LOW LINE}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline. This is included for compatibility with
+ typewriter fonts used for computer listings.}
+\endsetslot
+
+\setslot{quoteleft}
+ \Unicode{2018}{LEFT SINGLE QUOTATION MARK}
+ \Ligature{LIG}{quoteleft}{quotedblleft}
+\endsetslot
+
+\nextslot{123}
+\setslot{braceleft}
+ \Unicode{007B}{LEFT CURLY BRACKET}
+\endsetslot
+
+\setslot{bar}
+ \Unicode{007C}{VERTICAL LINE}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \Unicode{007D}{RIGHT CURLY BRACKET}
+\endsetslot
+
+\setslot{asciitilde}
+ \Unicode{007E}{TILDE}
+ \comment{The ASCII tilde `\textasciitilde'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\nextslot{159}
+\setslot{section}
+ \Unicode{00A7}{SECTION SIGN}
+\endsetslot
+
+\nextslot{189}
+\setslot{exclamdown}
+ \Unicode{00A1}{INVERTED EXCLAMATION MARK}
+\endsetslot
+
+\setslot{questiondown}
+ \Unicode{00BF}{INVERTED QUESTION MARK}
+\endsetslot
+
+\setslot{sterling}
+ \Unicode{00A3}{POUND SIGN}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Miscellanea}
+\endcomment
+
+\nextslot{23}
+\setslot{compwordmark}
+ \Unicode{200C}{ZERO WIDTH NON-JOINER}
+ \comment{An invisible glyph, with zero width and depth, but the
+ height of lower case letters without ascenders.
+ It is used to stop ligaturing in words like `shelf{}ful'.
+ It is possible that this character should be considered a
+ letter (and that hyphenation patterns should be designed to
+ include it), but since its |\lccode| is 0, \TeX's hyphenation
+ mechanism considers it to be a nonletter which ends the
+ hyphenatable part of a word.}
+\endsetslot
+
+\setslot{perthousandzero}
+ \comment{A glyph which is placed after `\%' to produce a
+ `per-thousand', or twice to produce `per-ten-thousand'.
+ Your guess is as good as mine as to what this glyph should look
+ like in a monowidth font. Since most fonts don't include this
+ glyph anyway, its use is discouraged.}
+\endsetslot
+
+\nextslot{127}
+\setslot{hyphenchar}
+ \label{hyphenchar}
+ \comment{This character is provided as a discretionary hyphen
+ symbol and may only appear at the end of a line, since it is often
+ hanging out of the character box, but apart from that it is almost
+ always the same as the \texttt{hyphen} character. Since \LaTeX\
+ sets the |\hyphenchar| of \texttt{T1} fonts to slot \ref{hyphen}
+ rather than this slot, this feature is usually not used.}
+\endsetslot
+
+
+
+\begincomment
+\section{Usual characters}
+The following characters are only accessed through ligatures and can
+therefore be replaced by others or completely left out if the
+ligature programs are modified accordingly.
+\endcomment
+
+
+\nextslot{27}
+\setslot{ff}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+ \ligature{LIG}{i}{ffi}
+ \ligature{LIG}{l}{ffl}
+\endsetslot
+
+\setslot{fi}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{fl}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+ }
+ \comment{This glyph should be two characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{ffi}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0069}{LATIN SMALL LETTER I}
+ }
+ \comment{This glyph should be three characters wide in a monowidth
+ font.}
+\endsetslot
+
+\setslot{ffl}
+ \charseq{
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{0066}{LATIN SMALL LETTER F}
+ \Unicode{006C}{LATIN SMALL LETTER L}
+ }
+ \comment{This glyph should be three characters wide in a monowidth
+ font.}
+\endsetslot
+
+\nextslot{156}
+\setslot{IJ}
+ \Unicode{0132}{LATIN CAPITAL LIGATURE IJ}
+ \comment{This is a single letter, and in a monowidth font should
+ ideally be one letter wide.}
+\endsetslot
+
+\nextslot{188}
+\setslot{ij}
+ \Unicode{0133}{LATIN SMALL LIGATURE IJ}
+ \comment{This is a single letter, and in a monowidth font should
+ ideally be one letter wide.}
+\endsetslot
+
+
+\begincomment
+\section{Fontdimens}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+\setfontdimen{8}{capheight} % cap height
+\setfontdimen{9}{ascender} % ascender
+\setfontdimen{10}{acccapheight} % accented cap height
+\setfontdimen{11}{descender} % descender's depth
+\setfontdimen{12}{maxheight} % max height
+\setfontdimen{13}{maxdepth} % max depth
+\setfontdimen{14}{digitwidth} % digit width
+\setfontdimen{15}{verticalstem} % dominant width of verical stems
+\setfontdimen{16}{baselineskip} % baselineskip
+
+
+\begincomment
+\section{Coding scheme}
+\endcomment
+
+\setstr{codingscheme}{EXTENDED TEX FONT ENCODING - LATIN}
+
+
+\endencoding
+
+
+\section{Discussion}
+
+As the \texttt{T1} encoding is an established standard, the discussion
+of it has already been published elsewhere. [Unfortunately, I do not
+know where as it all happened long before I started using \TeX. This
+part of the document definitely needs to be improved. To begin with, I
+would like to know if the TUGboat articles whose bibliography entries
+appear in Figure~\ref{Bib-entries} are relevant for the matter.
+\begin{figure*}
+\small
+\begin{verbatim}
+@Article{Beebe:TB11-2-171,
+ author = "Nelson Beebe",
+ title = "{Character set encoding}",
+ journal = j-TUGboat,
+ volume = "11",
+ number = "2",
+ pages = "171--175",
+ month = jun,
+ year = "1990",
+ ISSN = "0896-3207",
+ bibdate = "Fri Jun 4 18:08:09 MDT 1999",
+ bibsource = "ftp://ftp.math.utah.edu/pub/tex/bib/tugboat.bib;
+ http://www.math.utah.edu/pub/tex/bib/index-table-t.html#tugboat",
+ acknowledgement = ack-bnb # " and " # ack-nhfb,
+}
+@Article{Bien:TB11-2-175,
+ author = "Janusz S. Bie{\'n}",
+ title = "{On standards for computer modern font extensions}",
+ journal = j-TUGboat,
+ volume = "11",
+ number = "2",
+ pages = "175--183",
+ month = jun,
+ year = "1990",
+ ISSN = "0896-3207",
+ bibdate = "Fri Jun 4 18:08:09 MDT 1999",
+ bibsource = "ftp://ftp.math.utah.edu/pub/tex/bib/tugboat.bib;
+ http://www.math.utah.edu/pub/tex/bib/index-table-t.html#tugboat",
+ acknowledgement = ack-bnb # " and " # ack-nhfb,
+}
+@Article{Ferguson:TB11-4-514,
+ author = "Michael Ferguson",
+ title = "{Report on multilingual activities}",
+ journal = j-TUGboat,
+ volume = "11",
+ number = "4",
+ pages = "514--516",
+ month = nov,
+ year = "1990",
+ ISSN = "0896-3207",
+ bibdate = "Fri Jun 4 18:08:09 MDT 1999",
+ bibsource = "ftp://ftp.math.utah.edu/pub/tex/bib/tugboat.bib;
+ http://www.math.utah.edu/pub/tex/bib/index-table-t.html#tugboat",
+ acknowledgement = ack-bnb # " and " # ack-nhfb,
+}
+\end{verbatim}
+\normalsize
+
+\caption{Entries in \texttt{tugboat.bib} which may describe papers
+that contain (at least part of) the discussion regarding the
+\texttt{T1} encoding}
+\label{Bib-entries}
+\end{figure*}
+Actually reading them would be nice too, as would of course getting
+the references for whatever other papers there might be that
+constituted the discussion of the \texttt{T1} encoding. The file
+\texttt{cork.enc} in the \textit{Fontname} standard makes a cryptic
+reference to ``TTN 1(4), December 1992'', whatever that might be.]
+
+I can however answer questions on the more immediate matter of how the
+interpretation of the established standard that this file expresses was
+constructed. It is mainly the result of a comparison between the
+file \texttt{t1.etx}~\cite{t1.etx}, the Unicode
+standard~\cite{Unicode}, and the Adobe glyph list~\cite{AGL}.
+
+(Some concerns have been expressed about the fact that the glyph name
+listed for slot~0 is `\texttt{grave}', although that glyph name in
+\cite{AGL} corresponds to \textunicode{0060}{GRAVE ACCENT}, whereas
+\textunicode{0300}{COMBINING GRAVE ACCENT} is listed as corresponding
+to `\texttt{gravecomb}'. This is however formally irrelevant, since
+the glyph names are formally only internal labels in the encoding
+specification. `\texttt{gravecomb}' would furthermore be a more
+impractical label, since most font contains a `\texttt{grave}' glyph
+that is used as a combining accent but no `\texttt{gravecomb}'
+glyph.)
+
+
+\section{Changes}
+
+The changes made to this specification since the original 2001/06/19
+version are as follows.
+
+2001/09/01: Corrected some typos (reported by Vladimir Volovich). /LH
+
+2001/09/16: Added \cite{latin-page} to the bibliography. /LH
+
+2001/09/21: Removed comment on \textunicode{2012}{FIGURE DASH} from
+slot~\ref{endash}. \cite[Sec.~6.1]{Unicode} makes quite clear that
+it's not to be used for ranges. /LH
+
+2002/07/05: Added the Ferguson:TB11-4-514 and ``TTN~1(4)'' references
+to the discussion section. Also added remark on \texttt{grave} versus
+\texttt{gravecomb}. /LH
+
+2004/11/28: Changed the f-ligatures to character sequences, which
+makes more sense for \texttt{CMap}s. Added equivalent for
+slot~\ref{SS}. /LH
+
+
+\begin{thebibliography}{9}
+\bibitem{AGL}
+ Adobe Systems Incorporated: \textit{Adobe Glyph List}, 1998;
+ \textsc{http}:/\slash \texttt{partners.adobe.com}\slash
+ \texttt{asn}\slash \texttt{developer}\slash \texttt{type}\slash
+ \texttt{glyphlist.txt}
+\bibitem{latin-page}
+ Roman Czyborra: \textit{The ISO 8859 Alphabet Soup}, web page at
+ \textsc{http:}/\slash \texttt{czyborra.com}\slash
+ \texttt{charsets}\slash \texttt{iso8859.html}, 1998.
+\bibitem{ISO8859-1}
+ International Organization for Standardization:
+ \textit{ISO/IEC standard 8859-1} (Information technology --
+ 8-bit single-byte coded graphic character sets --
+ Part 1: Latin alphabet No. 1).
+ See also~\cite{latin-page}.
+\bibitem{t1.etx}
+ Alan Jeffrey, Sebastian Rahtz, and Ulrik Vieth:
+ \textit{The \TeX\ extended text encoding vector},
+ version~1.801, 1998,
+ \textsc{ctan}:\discretionary{}{}{\thinspace}\texttt{fonts}\slash
+ \texttt{utilities}\slash \texttt{fontinst}\slash
+ \texttt{inputs}\slash \texttt{etx}\slash \texttt{t1.etx}.
+\bibitem{TeXbook}
+ Donald E.\ Knuth, Duane Bibby (illustrations):
+ \textit{The \TeX book}, Ad\-di\-son--Wes\-ley, 1986;
+ ISBN~0-201-13447-0.
+\bibitem{Unicode}
+ The Unicode Consortium (editor), \emph{et al.}:
+ \textit{The Unicode Standard, Version 3.0},
+ Addison Wesley Longman Publisher, 2000; ISBN~0-201-61633-5.
+ Most of the information in this book is also available online at
+ the Unicode consortium website, at \textsc{http}:/\slash
+ \texttt{www.unicode.org}\slash \texttt{unicode}\slash
+ \texttt{uni2book}\slash \texttt{u2.html}.
+\end{thebibliography}
+
+
+
+\end{document} \ No newline at end of file
diff --git a/fonts/utilities/fontinst/doc/manual/fontinst.pdf b/fonts/utilities/fontinst/doc/manual/fontinst.pdf
new file mode 100644
index 0000000000..d05b42d320
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/manual/fontinst.pdf
Binary files differ
diff --git a/fonts/utilities/fontinst/doc/manual/fontinst.tex b/fonts/utilities/fontinst/doc/manual/fontinst.tex
new file mode 100644
index 0000000000..a66b89054c
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/manual/fontinst.tex
@@ -0,0 +1,4680 @@
+%%% ====================================================================
+%%% @LaTeX-file{
+%%% author = "Alan Jeffrey and Rowland McDonnell and
+%%% Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.928",
+%%% date = "2007-09-06",
+%%% time = "11:22:41 +02:00",
+%%% filename = "fontinst.tex",
+%%% email = "fontinst@tug.org",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "fontinst, TeX, PostScript, documentation",
+%%% supported = "yes",
+%%% abstract = "This is the documentation for the fontinst
+%%% font installation package.",
+%%% package = "fontinst",
+%%% dependencies = "ltxguide.cls, url.sty, xspace.sty"
+%%% }
+%%% ====================================================================
+
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey
+
+% Modified by Rowland McDonnell June 1998
+% Modified and revised by Ulrik Vieth June 1998
+% Modified by Lars Hellstr\"om July 2004 and later
+
+
+
+\documentclass[a4paper]{ltxguide}
+\usepackage[OT1]{fontenc}
+\usepackage{url,xspace}
+\usepackage{graphicx}
+
+\IfFileExists{palatino.flag}{
+ \renewcommand\rmdefault{ppl}
+}
+%\renewcommand\rmdefault{padx}
+%\renewcommand\rmdefault{pmnx}
+
+% \MakeShortVerb{\|}
+
+
+% Title page and running heads.
+
+\makeatletter
+\newcommand{\subtitle}[1]{\renewcommand{\@subtitle}{#1}}
+\newcommand{\version}[1]{\renewcommand{\@version}{#1}}
+\newcommand{\illustration}[1]{\renewcommand{\@illustration}{#1}}
+
+\newcommand{\@subtitle}{}
+\newcommand{\@version}{???}
+\newcommand{\@illustration}{cover.eps}
+
+% \pagestyle{myheadings}
+% \AtBeginDocument{\markright{\small\itshape
+% \@author\hfill\@title: \@subtitle\quad}}
+
+
+\renewcommand{\maketitle}{{%
+ \thispagestyle{empty}%
+ \normalfont\centering
+ \null
+ {\fontsize{100}{100}\textit{\@title}}%
+ \par\bigskip
+ {\Large\textbf{\@subtitle}}%
+ \vfill
+ \includegraphics[width=\textwidth]{\@illustration}%
+ \vfill
+ {\Large\textbf{%
+ \def\and{\egroup\qquad\hbox\bgroup}
+ \leavevmode \hbox{\@author}\\[\smallskipamount]
+ \@title~v\@version
+ \quad\textperiodcentered\quad \@date}}%
+ \clearpage
+}}
+\makeatother
+
+
+% Set lists tighter (assuming non-zero \parskip).
+
+\makeatletter
+\renewcommand{\@listI}{%
+ \leftmargin\leftmargini
+ \parsep\medskipamount
+ \itemsep\z@ % + parsep
+ \topsep\z@ % + parskip
+ \partopsep\z@
+}
+\newenvironment{isyntax}{%
+ \let\\\@centercr
+ \list{}{%
+ \itemsep \z@
+ \itemindent -1.5em%
+ \listparindent \itemindent
+ \advance \leftmargin 1.5em%
+ }%
+ \advance \rightskip \z@\@plus0.7\linewidth \relax
+ \linepenalty=100\relax
+ \item\relax
+}{\endlist}
+\makeatother
+
+\newenvironment{smalldes}{%
+ \list{}{%
+ \setlength\labelwidth{0pt}%
+ \setlength\itemindent{-\leftmargin}%
+ \setlength\listparindent{1em}%
+ \setlength\parsep{0pt}%
+ \setlength\itemsep{0pt plus 1pt}%
+ \setlength\topsep{\itemsep}%
+ \let\makelabel\descriptionlabel
+ }%
+}{\endlist}
+
+\newenvironment{hackernote}{%
+ \list{}{
+ \setlength{\leftmargin}{0pt}%
+ \setlength\labelwidth{0pt}%
+ \setlength{\listparindent}{1.4em}%
+ \setlength{\parsep}{0pt plus 1pt}%
+ \setlength{\itemsep}{\medskipamount}%
+ }\item[]%
+ \small
+ \textit{Note for hackers.}\hspace{0.5em}%
+}{\endlist}
+
+% % I don't use the <...> feature for verbatim,
+% % so I undo that ltxguide feature.
+% \makeatletter
+% \renewcommand{\verbatim@font}{%
+% \normalfont \ttfamily
+% % \catcode`\<=\active
+% % \catcode`\>=\active
+% }
+% \makeatother
+
+
+% ltxguide.cls decl environment, but with equal space above and
+% below.
+\DeleteShortVerb{\|}
+\makeatletter
+\newenvironment{decl*}[1][]{%
+ \par
+ \small
+ \addvspace{2.3ex}%
+ \vskip -\parskip
+ \ifx\relax#1\relax
+ \def\@decl@date{}%
+ \else
+ \def\@decl@date{\NEWfeature{#1}}%
+ \fi
+ \noindent\hspace{-\leftmargini}%
+ \begin{tabular}{|l|}%
+ \hline\ignorespaces
+}{%
+ \\\hline
+ \end{tabular}%
+ \nobreak\@decl@date\par\nobreak
+ \vspace{2.3ex}\vskip -\parskip
+}
+\makeatother
+\MakeShortVerb{\|}
+
+
+% Set spacing around captions.
+
+\setlength{\abovecaptionskip}{\medskipamount}
+\setlength{\belowcaptionskip}{\medskipamount}
+
+% Markup for logos, file types, programs, etc.
+
+\newcommand*{\meta}{\m}
+\newcommand*{\marg}{\arg}
+\newcommand*{\parg}[1]{\texttt{(}\m{#1}\texttt{)}}
+
+\newcommand*{\cs}[1]{\texttt{\char`\\ #1}\xspace}
+
+\newcommand*{\OzTeX}{O\kern-.03em z\kern-.15em\TeX}
+\newcommand*{\OzMF}{O\kern-.03em zMF}
+\newcommand*{\OzTools}{O\kern-.03em z\kern-.15em Tools}
+
+\makeatletter
+\newcommand{\La}{%
+ L\kern-.36em
+ {%
+ \setbox0\hbox{T}%
+ \vbox to\ht0{\hbox{%
+ $\m@th$\csname S@\f@size\endcsname
+ \fontsize\sf@size\z@\math@fontsfalse\selectfont
+ A%
+ }\vss}%
+ }%
+}
+\makeatother
+\DeclareRobustCommand\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}
+
+\newcommand{\PS}{Post\-Script\xspace}
+\newcommand{\TT}{True\-Type\xspace}
+
+\newcommand*{\setfilename}[1]{\texttt{#1}}
+\newcommand*{\setdotfilename}[1]{\setfilename{.#1}}
+\newcommand*{\setpackagename}[1]{\textsf{#1}}
+
+\newcommand{\dvips} {\setpackagename{dvips}\xspace}
+\newcommand{\Dvips} {\setpackagename{Dvips}\xspace}
+\newcommand{\fontinst}{\setpackagename{font\-inst}\xspace}
+\newcommand{\Fontinst}{\setpackagename{Font\-inst}\xspace}
+\newcommand{\fontdoc}{\setpackagename{font\-doc}\xspace}
+\newcommand{\Fontdoc}{\setpackagename{Font\-doc}\xspace}
+
+% \show\fontname
+\newcommand{\fontnamekb}{fontname\xspace}
+\newcommand{\Fontnamekb}{Fontname\xspace}
+
+\newcommand{\mf} {\setfilename{mf}\xspace}
+\newcommand{\Mf} {\setfilename{Mf}\xspace}
+\newcommand{\vf} {\setfilename{vf}\xspace}
+\newcommand{\Vf} {\setfilename{Vf}\xspace}
+\newcommand{\pl} {\setfilename{pl}\xspace}
+\newcommand{\Pl} {\setfilename{Pl}\xspace}
+\newcommand{\fd} {\setfilename{fd}\xspace}
+\newcommand{\Fd} {\setfilename{Fd}\xspace}
+\newcommand{\pk} {\setfilename{pk}\xspace}
+\newcommand{\Pk} {\setfilename{Pk}\xspace}
+\newcommand{\afm}{\setfilename{afm}\xspace}
+\newcommand{\Afm}{\setfilename{Afm}\xspace}
+\newcommand{\vpl}{\setfilename{vpl}\xspace}
+\newcommand{\Vpl}{\setfilename{Vpl}\xspace}
+\newcommand{\cvpl}{(\setfilename{v})\setfilename{pl}\xspace}
+\newcommand{\tfm}{\setfilename{tfm}\xspace}
+\newcommand{\Tfm}{\setfilename{Tfm}\xspace}
+\newcommand{\mtx}{\setfilename{mtx}\xspace}
+\newcommand{\Mtx}{\setfilename{Mtx}\xspace}
+\newcommand{\etx}{\setfilename{etx}\xspace}
+\newcommand{\Etx}{\setfilename{Etx}\xspace}
+\newcommand{\enc}{\setfilename{enc}\xspace}
+\newcommand{\Enc}{\setfilename{Enc}\xspace}
+\newcommand{\pfa}{\setfilename{pfa}\xspace}
+\newcommand{\Pfa}{\setfilename{Pfa}\xspace}
+\newcommand{\pfb}{\setfilename{pfb}\xspace}
+\newcommand{\Pfb}{\setfilename{Pfb}\xspace}
+\newcommand{\dvi}{\setfilename{dvi}\xspace}
+\newcommand{\Dvi}{\setfilename{Dvi}\xspace}
+\newcommand{\pdf}{\setfilename{pdf}\xspace}
+\newcommand{\Pdf}{\setfilename{Pdf}\xspace}
+\newcommand{\ttf}{\setfilename{ttf}\xspace}
+\newcommand{\Ttf}{\setfilename{Ttf}\xspace}
+\newcommand{\map}{\setfilename{map}\xspace}
+\newcommand{\Map}{\setfilename{Map}\xspace}
+
+
+\newcommand{\vftovp}{\setpackagename{vftovp}\xspace}
+\newcommand{\vptovf}{\setpackagename{vptovf}\xspace}
+\newcommand{\pltotf}{\setpackagename{pltotf}\xspace}
+\newcommand{\tftopl}{\setpackagename{tftopl}\xspace}
+
+\newcommand{\BibTeX}{Bib\TeX}
+
+
+
+
+\title{fontinst}
+\subtitle{Font installation software for \TeX}
+\author{Alan Jeffrey\and Rowland McDonnell\and Lars Hellstr\"om}
+\illustration{roadmap.eps}
+\version{1.9}
+\date{August 2009}
+
+\begin{document}
+
+\maketitle
+
+
+% \begin{itshape}
+% This manual is currently being rewritten, and may therefore be a
+% bit disorganised. For authoritative information on command syntaxes
+% and the like, see the Literate Programming sources for
+% \fontinst. The main file there is \textsl{\texttt{fisource.tex}}.
+% \end{itshape}
+%
+% \bigskip
+
+\begin{footnotesize}
+ This manual describes the \texttt{fontinst} software for converting
+ fonts from Adobe Font Metric format to forms readable by \TeX. This
+ manual should be distributed with the \texttt{fontinst} software,
+ which is available by anonymous FTP from
+ \url{ftp://ftp.tex.ac.uk/tex-archive/fonts/utilities/fontinst}, and
+ on the various CD-ROMs containing material from the CTAN archives.
+ Please do not contact the author directly for copies.
+
+ If you would like to report a bug with \texttt{fontinst}, please
+ mail \url{fontinst@tug.org}. The mail will be sent to the
+ \texttt{fontinst} mailing list. If you would like to be on the
+ \texttt{fontinst} mailing list, see
+ \url{http://tug.org/mailman/listinfo/fontinst}.
+\end{footnotesize}
+
+\tableofcontents
+
+% \vfill
+
+\clearpage
+
+
+\section{Introduction}
+
+The purpose of \fontinst is to make digital fonts, as they may
+be bought from a foundry or other supplier, usable with \AllTeX;
+in general, they are not directly so. An obvious problem can be
+that the font information is not available in a format that \TeX\
+understands. A more subtle problem is that the fonts are often
+organised in a way that is unsuitable for automatic typesetting.
+It is furthermore necessary to inform \AllTeX\ and related software
+about the existence of the new font, and the pieces of code needed
+to do this are somewhat exotic.
+
+Regarding the first problem, \fontinst can bridge the gap between
+non-\TeX\ and \TeX-specific file formats, but may need some help from
+other tools (\setfilename{pltotf}, \setfilename{vptovf},
+\setfilename{ttf2afm}, etc.) with conversions between text and binary
+file formats. Regarding the last problem, \fontinst can generate the
+necessary code, although you may in some cases need to paste it into
+the right configuration file yourself. It is however with respect to
+the second problem that \fontinst shines, as the many minutiae of
+providing fonts for \AllTeX\ are automated to a very high degree,
+while still providing you as user with the power to fine-tune every
+detail of the output. In addition, \fontinst is available for every
+platform that has \TeX.
+
+The reason \fontinst is so portable is simply that it is written in
+\TeX, exploiting those features of the language which does other
+things than typesetting. A drawback of this is the inability to work
+directly with binary file formats, but an advantage is that users
+do not need to learn a separate command language before they can
+configure the tool; \fontinst only introduces a set of new \TeX\
+commands, not a new set of syntax rules. Moreover, many encoding and
+metric files used with \fontinst can also be typeset as \LaTeX\
+documents, yielding a rendering of their contents which might be more
+pleasing to the eye than the raw code.
+
+The main thing \fontinst does is creating virtual fonts (\vf's). For
+this, it takes the approach that the world is full of glyphs, and a
+subset of these are to be picked, perhaps tweaked, and finally wrapped
+up as a new font for \TeX\ to use. In the basic case where one merely
+wants to make a specific foundry-supplied font available to \TeX, what
+one does is to present only that font as glyphbase for \fontinst, since
+this means all glyphs in the resulting virtual font will come from that
+base font, only reorganised to meet the requirements of \AllTeX. It is
+however not uncommon to use several base fonts for forming a single
+glyphbase, maybe because the foundry has arbitrarily decided to divide
+the basic font up into separate ``base'', ``expert'', and ``alternate''
+varieties that don't match the needs of \TeX, or maybe because the
+foundry did not provide all the glyphs of standard \TeX\ fonts and glyphs
+from some other font family are used to fill in the gaps. Either way,
+since it's you that's doing the packaging, it is you that gets to say
+what goes into the package.
+
+In the process of creating some virtual fonts, many minor pieces of
+data are encounted that would be needed when informing \AllTeX\ and
+related software about these new fonts.
+\Fontinst records this information and provides for writing finished
+files in the most common formats, notably \LaTeX\ \fd files and
+\dvips \map files. One can even ask \fontinst to have certain
+transformations performed on the base fonts, to extend or tweak the
+repertoire of glyph shapes that are available.
+
+
+\subsection{Overview of the process}
+
+If you're using \fontinst, the usual steps you need to take to use
+an ordinary \PS latin text font with \LaTeX\ are these:
+\marginpar{Related commands:}
+\begin{enumerate}
+\item \label{WhatToDoList:1}
+ Gather \afm files for the base fonts you want to make use of, and
+ (optionally) give the \afm files appropriate names.
+\item \label{WhatToDoList:2}
+ Use \fontinst\marginpar{\cs{transformfont}} to produce \texttt{8r}
+ encoded \pl files from these \afm files.
+\item \label{WhatToDoList:3}
+ Use \fontinst\marginpar{\cs{installfont}} to create T1 and OT1
+ encoded \pl and \vpl files from the |8r| encoded \pl files (this
+ procedure will also create suitable \fd files).
+\item \label{WhatToDoList:4}
+ Use \fontinst (its \setfilename{finstmsc.sty}\marginpar{
+ \cs{adddriver}} variety) to generate the mapfile entries needed
+ for the above.
+\item
+ Use \pltotf to turn each \pl file into a \tfm file.
+\item
+ Use \vptovf to turn each \vpl file into a pair of \vf and
+ \tfm files.
+\item
+ Move the \tfm, \vf, and \fd files into the appropriate
+ directories so \LaTeX\ can see them.
+\item
+ Tell your \dvi driver about the new font (typically involves
+ editing some configuration file or files, possibly also running
+ some helper command to update cached configuration information).
+\item
+ Test it. (The \LaTeX\ command \cs{usefont} lets you select a font
+ by encoding, family, series, and shape. The Plain\TeX\ file
+ \setfilename{testfont.tex} provides an easy way of producing font
+ tables.)
+\item
+ Perhaps write a package file to make selecting the new font
+ a little easier.
+\end{enumerate}
+
+The \setfilename{examples\slash basic\slash basicex.tex} file
+contains examples of doing \ref{WhatToDoList:2}
+and~\ref{WhatToDoList:3}; in many cases, it is possible to use the
+|\latinfamily| command to do all of this.
+The \setfilename{examples\slash basic\slash basicex2.tex} file
+contains examples of doing \ref{WhatToDoList:4}.
+
+
+\section{Defining terms}
+
+The process of making fonts usable involves some rather technical
+issues, so in order to understand a discussion of what is going on,
+it is necessary to first get the terminology straight. Feel free to
+skip parts of this if you think you already know the material covered
+or for the moment want to concentrate on other aspects of what
+\fontinst does, but bear in mind that you may then have reason to return
+to this section at a later time.
+
+% This is rather a large and perhaps tedious section. You might be
+% tempted to skip it so you can get to some more direct information on
+% how to use \fontinst. That's fine if you understand everything about
+% how \TeX\ handles fonts. If not, we suggest you at least skim though
+% this section.
+
+\subsection{What's a font?}
+
+Once upon a time, this question was easily answered: a font is a
+set of type in one size, style, etc. There used to be no
+ambiguity, because a font was a collection of chunks of type metal
+kept in a drawer, one drawer for each font.
+
+These days, with digital typesetting, things are more complicated.
+What a font `is' isn't easy to pin down. A typical use of a \PS
+font with \LaTeX\ might use these elements:
+\begin{itemize}
+\item Type 1 printer font file
+\item Bitmap screen font file
+\item Adobe font metric file (\afm file)
+\item \TeX\ font metric file (\tfm file)
+\item Virtual font file (\vf file)
+\item font definition file (\fd file)
+\end{itemize}
+Looked at from a particular point of view, each of these files
+`is' the font. So what's going on?
+
+
+\subsubsection{Type 1 printer font files}
+
+These files contain the information needed by your printer to draw
+the shapes of all the characters in a font. They're typically
+files with a \pfa or \pfb extension; on Macs they're usually in
+files of type `LWFN' and have icons that look like a
+laser printer. The information in all these formats is basically
+the same: the only difference is in its representation. \pfa
+stands for `printer font ASCII', while \pfb stands for `printer
+font binary'. \pfa files are pure \PS code (though in parts highly
+convoluted) and can typically be pasted into or copied from \PS
+documents using a text editor if one feels like hacking. Since \pfa
+files contain a large chunk of hex-encoded binary data, they are
+however about twice the size of the equivalent \pfb, where text and
+binary data reside in separate sections of an overall binary file
+format.
+
+% That is, \pfa files contain plain text information,
+% while \pfb files contain the same information encoded as
+% machine-readable binary data.
+
+% If you have Adobe Type Manager (ATM) installed on your computer,
+% ATM will use these files to draw an accurate representation of the
+% letters on the screen of your computer when you are previewing a
+% \TeX\ document.
+
+Printer font files are not used directly by \TeX\ at all -- \TeX\
+just prepares a \dvi file that refers to the fonts by name and the
+characters by number: \TeX\ knows nothing about the shapes
+involved. The \dvi driver uses the printer font files when you ask
+it to print the \dvi file. This means that you can produce a \dvi
+file which uses, say, Palatino, even if you do not have the
+Type~1 printer font file for this font on your computer. You will
+need to find a computer that does have Palatino before you can
+print it or preview it, though.
+(Pdf\TeX\ is different from \TeX\ in this respect; since pdf\TeX\
+integrates most of the functionality of a \dvi driver, it may be unable
+to generate working \pdf output if the some Type~1 printer font file
+is not available.)
+
+\Dvi drivers generating \pdf often require Type~1 fonts to be in \pfb
+format, as that is very close to how the data is stored in a \pdf
+file.
+
+
+\subsubsection{Bitmap screen font files}
+
+These files contain a low-resolution bitmap for drawing a
+representation of the font on the screen of your computer if ATM
+is not installed. In the \TeX\ world, these files are only used
+for screen previews by \dvi drivers that use the windowing system
+for rendering text.
+% They are kept in font suitcase files on Macintoshes.
+%\marginnote{And where on other computers?}
+
+Technically, \pk files are also bitmap font files, for use on screen
+or with a printer, but \TeX\ systems tend to be set up so that \pk
+files are generated automatically when needed. (Of course, this
+requires that the font is first available in some other format,
+usually \mf or \pfb.)
+
+
+\subsubsection{Adobe font metric files (\afm files)}
+
+These files are text files which contain information about the
+size of each character in a font, kerning and ligature
+information, and so on. They can't be used by \TeX\ directly, but
+the information they contain is essential if you want to use a
+font with \TeX. \Fontinst can from an \afm file create the
+necessary \tfm and \vf files (well, really \pl and \vpl files, but
+see below) so you can use a font with \TeX.
+Once you have created all the files you need to use a font with
+\TeX, you can remove the corresponding \afm files from your
+computer unless you have other software that needs them.
+
+The job of turning an \afm file into a set of \tfm and \vf files
+is one of the main uses for \fontinst. Most of this document is
+concerned with this process, so don't worry if it seems a bit
+vague at the moment.
+
+
+\subsubsection{\TT and OpenType font files}
+
+The \TT format was created as an Apple--Microsoft collaboration to
+avoid being dependent on Adobe's font technologies. Later Adobe and
+Microsoft went on to define the OpenType format, which is a
+development of \TT. However, the three don't always agree on the
+fine details of the format.
+
+A \TT font file is a collection of rather disparate tables, and can
+therefore contain scalable outline fonts (like \PS~type~1), bitmap
+screen fonts, and font metrics all in one file; for software with
+direct support for \TT this tends to simplify font installation, but
+for \TeX\ it rather adds a level of complication. An advantage for
+\TeX\ use is that the suppliers provide font metrics in a
+cross-platform format (as opposed to rather obscure platform-specific
+formats, which could previously be the norm), but they still have to
+undergo conversion before we can use them. \TT is furthermore a
+``there is more than one way to do it'' format, so it sometimes
+happens that information which is present in the font is ignored by
+some programs because that information happened to be in an unusal
+format\dots
+
+Classical \TT fonts have outlines defined in terms of quadratic
+Bezier curves. The main addition in the OpenType specification was a
+second outline format (CFF\slash type~2) which uses cubic Bezier
+curves. Both outline formats are directly supported in \pdf and can
+(even if the driver doesn't have built-in support for the format)
+with a thin wrapper be used in \PS, but there is also a tradition of
+rather converting to type~1 before using such fonts with \TeX; the
+latter leads to a slight drop in quality.
+
+
+
+
+\subsubsection{\TeX\ font metric files (\tfm files)}
+
+These are binary data files in a format designed for use by \TeX\
+which contain (more-or-less) the same information as \afm files:
+the size of each character in a font (font metric data), kerning,
+and ligature information.
+
+When you select a font in \TeX, you are telling \TeX\ to typeset
+using a particular \tfm file; from \TeX's point of view, a \tfm
+file (and nothing else) \emph{is} a font. \TeX\ itself doesn't
+see printer font files, screen bitmaps, \pk files, \vf files, or
+anything else to do with fonts: only \tfm files.
+
+\TeX\ uses these \tfm files to decide where to put characters when
+typesetting. From \TeX's point of view, \tfm files \emph{are}
+fonts, even though they contain no information about the shape of
+letters, and are rarely needed by anything except \TeX. (\Dvi drivers
+generally read \tfm files so that they can keep track of exact glyph
+widths and fine-tune positioning accordingly, but they would get by
+fairly well with only the information in the printer fonts.)
+
+
+\subsubsection{Property list files (\pl files)}
+
+\pl files are human-readable text files which contain all the font
+metric, kerning, ligature, and other information needed to create
+a \tfm file. You can convert between the two file formats using
+\tftopl and \pltotf, which are standard utilities in a \TeX\ system.
+
+
+\subsubsection{Virtual font files (\vf files)}
+
+These are binary data files in a format designed for use by \TeX\
+\dvi drivers. Their main purpose in life is to replace the raw font
+abstraction available in the printer with one more convenient for
+\TeX. These files are used by \dvi driver software only.
+
+\Dvi drivers use \vf files to work out what should \emph{really} be
+printed when you ask for a particular character.
+Technically they are like subroutine libraries for \dvi drivers,
+with one subroutine for each character in the virtual font: when
+the \dvi driver sees a \dvi command to set a character from a virtual
+font, it will execute a sequence of \dvi commands (the ``mapcommands
+property'' of this character) that it reads in the \vf file. You need
+not worry about the details of this, as \fontinst deals with them for
+you. Creating and using virtual fonts is what this document is about,
+so don't worry if this doesn't make sense yet. (After all, how much
+do you need to know about the inner workings of \dvi files to typeset
+and print \TeX\ documents?)
+
+Each \vf file has a \tfm file with the same name. To use a
+virtual font, you select the \tfm file as the font to use in your
+document. When the \dvi driver comes across this \tfm file in the
+\dvi file, it looks up the \vf file and uses that to decide what
+to do.
+
+
+\subsubsection{Virtual property list files (\vpl files)}
+
+\vpl files are human-readable text files which contain all the
+font metric, kerning, mapping, and other information needed to
+create a \vf and \tfm pair.
+
+\vptovf will create a \vf/\tfm pair from a \vpl file. \vftovp
+will create a \vpl from a \vf/\tfm pair. \vftovp also needs to be
+able to read all the \tfm files that are referred to by a \vf to
+recreate the \vpl\ -- it looks at the checksums to verify that
+everything's okay.
+
+
+\subsubsection{Font definition files (\fd files)}
+
+These are files containing commands to tell \LaTeX\ which \tfm
+files to associate with a request for a font using \LaTeX's font
+selection commands.
+
+For example, here is a small and edited part of the \fd file
+supplied with \setpackagename{PSNFSS} to allow you to use the
+Adobe Times font in T1 encoding:
+
+\begin{verbatim}
+ \ProvidesFile{t1ptm.fd}
+ [1997/02/11 Fontinst v1.6 font definitions for T1/ptm.]
+
+ \DeclareFontFamily{T1}{ptm}{}
+
+ \DeclareFontShape{T1}{ptm}{m}{n} {<<->> ptmr8t}{}
+ \DeclareFontShape{T1}{ptm}{m}{it}{<<->> ptmri8t}{}
+ ...
+ \DeclareFontShape{T1}{ptm}{b}{n} {<<->> ptmb8t}{}
+ \DeclareFontShape{T1}{ptm}{b}{it}{<<->> ptmbi8t}{}
+ ...
+\end{verbatim}
+What this means is: when you use \LaTeX\ to select the font family
+|ptm| in T1 encoding in the medium series (|m|) and normal shape
+(|n|), \TeX\ uses the font \texttt{ptmr8t.tfm}. Similarly, if you
+select bold italic, \TeX\ uses \texttt{ptmbi8t.tfm}.
+
+\LaTeX\ works out which \fd file to load based on the current
+encoding and font family selected. If you've selected T1 encoded
+|ptm| like this:
+\begin{verbatim}
+ \fontencoding{T1}\fontfamily{ptm}\selectfont
+\end{verbatim}
+\LaTeX\ loads the file \url{t1ptm.fd} (if it doesn't exist, you're
+in trouble). As you can see above, this file contains information
+so that \LaTeX\ knows which \tfm file to use. So if you ask for,
+say, |T1/ptm/b/it| (T1 encoded Times-Roman, bold series, italic
+shape), you get the font \texttt{ptmbi8t}.
+
+You can find more about \fd files and \LaTeX's font selection commands
+at CTAN:
+\url{ftp://ftp.tex.ac.uk/tex-archive/macros/latex/base/fntguide.tex}
+and \url{ftp://ftp.tex.ac.uk/tex-archive/info/simple-nfss.tex} are
+both useful.
+
+
+\subsubsection{Font mapping files (\map files)}
+
+These are files telling \dvi drivers which printer fonts correspond to
+specific \TeX\ fonts (\tfm files) -- how a specific \TeX\ font should
+be \emph{mapped} onto a font concept available in the \dvi driver's
+output format. Unlike \tfm, \fd, and \vf files,
+which tend to be found as soon as they're in a suitable location
+(such as the current directory), mapfiles typically need to be fully
+installed or selected through a command-line option before any notice
+is taken of them.
+
+The format of mapfiles varies from driver to driver, but a common
+format is that of \dvips, where each line is a separate entry (except
+lines that contain comments). The first word of an entry is the
+\TeX~font name, the second word is the basic printer font name, and
+remaining words provide additional information (e.g., the name of the
+file in which the font is stored).
+
+The default in most \TeX\ systems is that fonts are assumed to be \mf
+fonts unless there is a specific \map file entry which says otherwise.
+Hence if you're trying to use a new Type~1 font, but the \dvi driver
+gives you an error message that `\textit{somefile}\texttt{.mf} not
+found', then the problem is most likely with the mapfiles.
+
+
+
+
+
+
+\subsection{Fonts and characters}
+
+The term `character' (or just `char') is frequently used in
+discussions of fonts, but not always correctly, and when getting into
+the details of what \fontinst does it is necessary to keep the
+terminology straight.
+
+\begin{description}
+\item[Glyph]
+ A glyph is an image, often associated with one or several characters.
+ Some examples of glyphs are:
+ `A', `\textsf{A}', `$\mathcal{A}$', `B', `F',
+ `{\usefont{OT1}{cmr}{m}{n}f}',
+ `{\usefont{OT1}{cmr}{m}{n}fi}', `\~{}'.
+ Fonts are collections of glyphs. \Fontinst refers to glyphs by name.
+\item[Slot]
+ This is jargon for `a numbered position in a font'. (What is
+ important is the number, and that this number refers to a position
+ in a font, but which font is usually specified separately.)
+ For typesetting, \TeX\ identifies glyphs as ``slot $n$ in font $f$''.
+\item[Character]
+ The modern definition is that a character is the smallest component
+ of written language that has semantic value. Speaking of a
+ character, one refers to the abstract meaning, rather
+ than a specific shape.
+
+ Since fonts have often contained a unique glyph for each character
+ and each usable glyph has been assigned a particular slot,
+ it is not uncommon (in particular in older terminology) to see the
+ three mixed up, usually so that one says `character' where one of
+ the other two would have been more correct. The \TeX-related font
+ file formats is no exception, as you may see examples of elsewhere
+ in this document.
+\item[Encoding]
+ There are really two different encoding concepts that one encounters
+ when using \fontinst. The differences are not great, and an
+ encoding of one kind often corresponds to an encoding of the other
+ kind, but it is not merely a matter of translation.
+
+ A \emph{\LaTeX\ encoding} is a mapping from characters (or more
+ formally \LaTeX\ Internal Character Representations) to slots.
+ In the \texttt{OT1} encoding, `\o' (or more technically `|\o|') maps
+ to slot~28, whereas in the \texttt{T1} encoding it maps to slot~248.
+ This kind of encoding affects what \TeX\ is doing; \dvi drivers are
+ not involved.
+
+ A \emph{font encoding} (or \emph{encoding vector}) is a mapping from
+ slots to glyph names. This is the kind of encoding that \fontinst
+ primarily deals with, and also the kind of encoding that \dvi
+ drivers make use of. \texttt{ot1.etx} associates slot~28 with
+ `\texttt{oslash}', whereas \texttt{t1.etx} and \texttt{EC.enc} (one
+ of several to \texttt{T1} corresponding encoding vectors that come
+ with \dvips) associates slot~28 with `\texttt{fi}'.
+
+ \LaTeX\ encodings occur in \fontinst only as names and only in
+ relation to \fd files. It is unlikely that you will need to create
+ one of your own. The mappings defined by font encodings are on the
+ other hand of great importance and \etx files are used to direct
+ the generation of virtual fonts. Advanced \fontinst users may well
+ find that they need to create new font encodings to achieve their
+ goals.
+\end{description}
+
+\fontinst creates \vpl and \pl files from \afm or \pl files to map
+any glyph or combination of glyphs in the original font files to
+any slot in the output font file. There, isn't that better? Off
+you go now\ldots
+
+% You're probably familiar with ASCII
+% encoding, which has the letter `A' in slot~65, `B' in slot~66,
+% and so on. That's it, really. \TeX\ uses several different
+% encodings. The most common ones are OT1 (the original \TeX\
+% 7~bit encoding) and T1 (the newer \TeX\ 8~bit encoding).
+% % -- much more on this later.
+
+The thing is that the average \PS font comes in Adobe standard
+encoding, which, for example, has the glyph dotless~i `\i' in
+slot~245. But \TeX\ \texttt{T1} encoding expects the glyph o~dieresis
+`{\"o}' in that slot, and wants dotless~i in slot~25. So if you
+tried to use a raw \PS font with \TeX, any time you tried to get
+an `\"o', you'd get a `\i'; and every time you tried to get a `\i',
+you'd get a blank, because Adobe standard encoding says that
+slot~25 is empty. The process of dealing with this problem is
+called `re-encoding', and is one thing \fontinst helps with.
+
+% This might not make much sense yet; the best thing to do is relax.
+% There's a lot of things that need to be dealt with when you're
+% setting up \LaTeX\ to use a new font, so you can expect to be a
+% bit confused until you've done it a few times.
+
+
+\subsection{What are verbatim, typewriter, and monowidth fonts?}
+
+The verbatim, typewriter, and monowidth concepts are common sources
+of confusion for those who use \fontinst to install fonts
+with \LaTeX; in particular
+there are many misconceptions about the relation between them. The
+official view (of which not much has actually been brought forward)
+is that these concepts are really about three quite different things.
+
+A font is a \emph{monowidth} (monospaced, fixed-pitch) font if all
+glyphs in it have exactly the same width. Some font formats make
+special provisions for such fonts; the most notable example is the
+\afm format, where a single \texttt{CharWidth} keyword specifies the
+width for all glyphs in the font. \Fontinst responds to this
+by including the command
+\begin{quote}
+ |\setint{monowidth}{1}|
+\end{quote}
+in the \mtx file generated from an \afm, but that is everything that is
+hard-wired into the program. That a font is monowidth is however
+something that one should take note of when installing it for \TeX,
+as it means many of the glyphs in it have such a strange appearance
+that they are (pretty much) useless. The \texttt{endash} is for
+example usually only half as long as the \texttt{hyphen} and the
+letters in ligature glyphs are only half as wide as normal letters.
+Many of the \etx and \mtx files that come with \fontinst
+contain special commands to avoid making use of such degenerate
+glyphs.
+
+That a font is a \emph{typewriter} font really only means that it has
+a typewriterish look about it. The two most familiar typewriter fonts
+are probably Computer Modern Typewriter (\texttt{cmtt}) and Courier.
+Both of these fonts are monowidth, but there is no absolute rule about
+this. One of the standard \TeX\ fonts is for example Computer Modern
+Variable-width Typewriter (\texttt{cmvtt}), which is not a monowidth
+font, as Figure~\ref{Fig:TTvsVTT} shows.
+\begin{figure}
+ \begin{tabular}{ll}
+ \texttt{cmtt}:& \fontfamily{cmtt}\selectfont
+ The quick brown fox jumps over the lazy dog.\\
+ \texttt{cmvtt}:& \fontfamily{cmvtt}\selectfont
+ The quick brown fox jumps over the lazy dog.
+ \end{tabular}
+ \caption{Two typewriter fonts}
+ \label{Fig:TTvsVTT}
+\end{figure}
+
+The verbatim concept has very little to do with fonts at all; in
+\LaTeX\ it is considered to be a property of the environment
+(\texttt{verbatim}, \texttt{macrocode}, etc.) rather than a property
+of the font. The connection there is with fonts is that the encoding
+of the font must contain visible ASCII (as defined in Appendix~C
+of \emph{The \TeX book}%~\cite{TeXbook}
+) as a subset for the text to
+be rendered correctly. The \texttt{cmtt} family is the only one amongst
+the original Computer Modern fonts which meets this criterion and
+that is the primary grounds for the idea that these three concepts
+should be connected. Today that reason is at best a very weak one, as
+all \texttt{T1}-encoded fonts also meet the criterion of containing
+visible ASCII as a subset.
+
+A circumstance which has probably added to the confusion is that
+\texttt{OT1} is usually claimed to be one encoding. In reality the
+Computer Modern fonts that are declared in \LaTeX\ as being
+\texttt{OT1} display as many as five different encodings, as shown in
+Table~\ref{Tab:OT1-fonts}.
+\begin{table}[!tb]
+ \DeleteShortVerb{\|}
+ \begin{tabular}{l|c|c|c|}
+ & \texttt{TEX TEXT}&
+ \begin{tabular}[b]{c}
+ \texttt{TEX TEXT}\\
+ \texttt{WITHOUT}\\
+ \texttt{F-LIGATURES}
+ \end{tabular}&
+ \begin{tabular}[b]{c}\texttt{TEX}\\
+ \texttt{TYPEWRITER}\\
+ \texttt{TEXT}
+ \end{tabular}\\
+ \hline
+ non-italic&
+ \begin{tabular}{l}
+ \texttt{cmb10}\\
+ \texttt{cmbx5}--\texttt{12}\\
+ \texttt{cmbxsl10}\\
+ \texttt{cmdunh10}\\
+ \texttt{cmff10}\\
+ \texttt{cmfib8}\\
+ \texttt{cmr6}--\texttt{17}\\
+ \end{tabular}
+ \begin{tabular}{l}
+ \texttt{cmsl8}--\texttt{12}\\
+ \texttt{cmss8}--\texttt{17}\\
+ \texttt{cmssbx10}\\
+ \texttt{cmssdc10}\\
+ \texttt{cmssi8}--\texttt{17}\\
+ \texttt{cmssq8}\\
+ \texttt{cmssqi8}\\
+ \texttt{cmvtt10}
+ \end{tabular}&
+ \begin{tabular}{l}
+ \texttt{cmcsc8}--\texttt{10}\\
+ \texttt{cmr5}
+ \end{tabular}&
+ \begin{tabular}{l}
+ \texttt{cmsltt10}\\
+ \texttt{cmtcsc10}\\
+ \texttt{cmtt8}--\texttt{12}
+ \end{tabular}\\
+ \hline
+ italic&
+ \begin{tabular}{l}
+ \texttt{cmbxti10}\\
+ \texttt{cmfi10}\\
+ \texttt{cmti7}--\texttt{12}\\
+ \texttt{cmu10}
+ \end{tabular}&&
+ \begin{tabular}{l}
+ \texttt{cmitt10}
+ \end{tabular}\\
+ \hline
+ \end{tabular}
+ \MakeShortVerb{\|}
+ \caption{``\texttt{OT1}-encoded'' Computer Modern fonts, collected
+ according to the actual font encoding}
+ \label{Tab:OT1-fonts}
+\end{table}
+Since most monowidth fonts are only used for setting verbatim text,
+there is some code in \texttt{ot1.etx} which automatically chooses a
+\texttt{TEX TYPEWRITER TEXT} encoding for the font when the
+\texttt{monowidth} integer is set. The only reason for this is the
+guess that this is what the user wanted.
+
+
+
+\section{Fontmaking commands}
+
+There are three main types of files that you may write to control what
+\fontinst does: \emph{command files} (usually with suffix
+\setdotfilename{tex}), \emph{encoding definition files} (suffix
+\setdotfilename{etx}), and \emph{metric files} (suffix
+\setdotfilename{mtx}). Command files directly tell \fontinst to do
+things, whereas the purpose of an encoding or metric file is more to
+store data, but all three file types are technically sequences of
+\TeX\ commands that \fontinst execute when reading the file. Normal
+\TeX\ syntax rules apply in all three file types, although a few
+commands may behave in unfamiliar ways.
+
+Within the command file category, it is possible to discern certain
+subcategories. Most command files are written for one particular
+task, but some are common pieces that have been factored out from
+larger command files and are merely meant to be |\input| where
+appropriate. (\setfilename{csc2x.tex} in the \fontinst distribution is
+an example of this latter kind.) One may also distinguish between
+command files that are made for use with \setfilename{fontinst.sty}
+command definitions and command files that are made for use with
+\setfilename{finstmsc.sty} command definitions. This section documents
+the commands that are particular to the former category, whereas the
+next section documents commands that are particular to the latter.
+
+
+\subsection{Install commands}
+
+The core fontmaking takes place within a block of ``install
+commands''. (This name is a bit unfortunate since nothing is actually
+installed; rather some files that need to be installed are generated.)
+Such blocks have the structure
+\begin{quote}
+ |\installfonts|\\
+ \m{install commands}\\
+ |\endinstallfonts|
+\end{quote}
+The \m{install commands} describe the fonts, glyphs and encodings used
+to build fonts, whereas the purpose of the delimiting |\installfonts|
+and |\end|\-|install|\-|fonts| are rather to organise the writing
+of \fd files.
+
+\begin{decl*}
+ |\installfonts|\\
+ |\endinstallfonts|
+\end{decl*}
+At |\installfonts|, \fontinst's internal list of \fd files to generate
+are cleared. At |\endinstallfonts|, \fd files are written for those
+combinations of encoding and font family that appeared in the
+\meta{install commands}.
+
+\begin{hackernote}
+ |\installfonts|, |\endinstallfonts|, and the individual
+ install commands between them also cooperate in a rather complicated
+ grouping scheme to cache glyphbases. This may interfere with
+ non-\fontinst commands in the \meta{install commands}. If for
+ example an assignment to some |\tracing|\dots\ parameter here does
+ not seem to have any effect, try making the assignment |\global|.
+\end{hackernote}
+
+The most important \meta{install command} is
+\begin{decl*}
+ |\installfont|\arg{font-name}\arg{metrics-list}\arg{etx-list}\\
+ \hspace*{1.5em}\arg{encoding}\arg{family}\arg{series}%
+ \arg{shape}\arg{size}
+\end{decl*}
+This produces a \TeX\ virtual font called \m{font-name}. The
+\meta{metrics-list} and the \meta{etx-list} determine this font,
+whereas the other arguments specify how the \fd file will declare it
+for \LaTeX. The \m{encoding}, \m{family}, \m{series}, and \m{shape}
+are precisely the NFSS parameters. The \m{size} is either a shorthand
+declared by \verb|\declaresize| (see below), or is an \fd size
+specification.
+
+Like most \fontinst lists, the elements in the \meta{metrics-list} and
+\meta{etx-list} are separated by commas (so-called comma-separated
+lists). In their simplest form, the elements of these lists are file
+names (minus suffixes): \mtx files in the \meta{metrics-list} and
+\etx files in the \meta{etx-list}. First the \mtx files are processed
+to build up a glyphbase, i.e., store definitions of glyphs and their
+metric properties in memory, and then the \etx files are processed
+(several times) to select a set of glyphs and write the corresponding
+information to a \vpl file.
+
+For example, to install the \texttt{T1}-encoded Times Roman font
+(using \texttt{t1.etx} and \texttt{latin.mtx}), you say:
+\begin{verbatim}
+ \installfont{ptmr8t}{ptmr8r,latin}{t1}
+ {T1}{ptm}{m}{n}{}
+\end{verbatim}
+To install a \texttt{OT1}-encoded Times Roman font, with a scaled
+version of Symbol for the Greek letters, you say:
+\begin{verbatim}
+ \installfont{zptmrsy}{ptmr8r,psyr scaled 1100,latin}{ot1}
+ {OT1}{ptm}{m}{n}{}
+\end{verbatim}
+
+As the second example indicates, there is more to the list items than
+just file names. In the case of an metrics list item, the syntax
+permits the two forms
+\begin{decl*}
+ \meta{filename}\meta{optional modifiers}\\
+ |\metrics| \meta{metric commands}
+\end{decl*}
+\NEWfeature{v1.923}
+where an \meta{optional modifier} is one of
+\begin{decl*}
+ \verb*| scaled |\meta{rawscale factor}\\
+ \verb*| suffix |\meta{glyph name suffix}\\
+ \verb*| encoding |\meta{etx}\\
+ \verb*| option |\meta{string}
+\end{decl*}
+A list item may contain several such modifiers, but most commonly it
+does not contain any. The
+\meta{metric commands} are explicit metric commands, as described in
+Section~\ref{Sec:Metric}; this latter feature is meant for minor
+adjustments that you don't want to bother creating a separate \mtx
+file for.
+
+The \meta{filename} above primarily refers to a file
+\meta{filename}\texttt{.mtx}, but that need not always exist before
+executing the above command. If there exists a \pl, \afm, or \vpl file
+with the right name then that is first converted to a corresponding
+\mtx file. However, a special case occurs if there is an |encoding|
+modifier: this forces conversion of a \pl or \vpl file even if an
+\mtx file exists, and also forces using the specified \etx file when
+assigning glyph names to the slots of that file. Normally the choice
+of \etx file for such conversions to \mtx is based on
+|\declareencoding| declarations.
+
+The |scaled| modifier sets the \texttt{rawscale} variable for the
+processing of that file. This has the effect of scaling all raw
+glyphs from that file to \meta{rawscale factor} per milles of their
+previous size. The |suffix| modified causes the \meta{glyph name
+suffix} to be implicitly appended to all glyphs defined by this file.
+The |option| modifier adds the \meta{string} to the list of ``options''
+for this file. The |\ifoption| command can be used in the file to test
+whether a particular string has been supplied as an option.
+
+\begin{hackernote}
+ In general, \fontinst commands process comma-separated list arguments
+ by first splitting at commas and then fully expanding each item, but
+ this \meta{metrics-list} argument is an exception. This is first
+ fully expanded (|\edef|) and then split into items. The difference
+ is that a macro used in this \meta{metrics-list} argument can expand
+ to several list items, whereas a macro used in an ordinary
+ comma-separated list argument can only expand to (part of) a single
+ list item.
+
+ The |\metrics| list items do however constitute an exception within
+ this exception. These list items are in their entirety protected
+ from the initial full expansion, so you don't have to worry about
+ peculiar fragility errors there.
+\end{hackernote}
+
+The elements in the \meta{etx-list} have fewer variants, but there is
+still a general syntax
+\begin{decl*}
+ \meta{filename}\meta{optional modifiers}
+\end{decl*}
+The \meta{optional modifier}s permitted are:
+\begin{decl*}
+ \verb*| mtxasetx|\\
+ \verb*| option |\meta{string}
+\end{decl*}
+The \texttt{option} one is as for metric files. \texttt{mtxasetx} is
+probably only relevant for use with |\installrawfont| (see below).
+
+
+\begin{decl}[v1.912]
+ |\installfontas|\arg{font-name}\\%
+ \hspace*{1.5em}\arg{encoding}\arg{family}\arg{series}%
+ \arg{shape}\arg{size}
+\end{decl}
+This install command adds an \fd entry for the \meta{font-name}, but
+it doesn't actually generate that font. Usually that font was
+generated by a previous |\installfont|, and this is used to create
+additional entries for the font.
+
+
+\begin{decl}
+ |\installrawfont|\arg{font-name}\arg{metrics-list}\arg{etx-list}\\
+ \hspace*{1.5em}\arg{encoding}\arg{family}\arg{series}%
+ \arg{shape}\arg{size}
+\end{decl}
+This is similar to |\installfont| except that it produces
+a \TeX\ raw font as \pl file rather than a virtual font. Often a \pl
+file with the specified name will already exist when this command is
+called, and that will then be overwritten. These two \pl files will
+typically be somewhat different.
+The normal reason for using this command is that one wishes to
+``refine'' the metrics of a font that was generated by transformation
+commands.
+
+For example, to install an \texttt{8r}-encoded Times Roman raw font
+(using \texttt{8r.etx} and \texttt{8r.mtx}), you say:
+\begin{verbatim}
+ \installrawfont{ptmr8r}{ptmr8r,8r}{8r}
+ {8r}{ptm}{m}{n}{}
+\end{verbatim}
+(The files referred to are, in order, \texttt{ptmr8r.pl},
+\texttt{ptmr8r.mtx}, \texttt{8r.mtx}, and \texttt{8r.etx}.)
+
+The effect of a
+\begin{decl*}[v1.923]
+ \meta{filename}\verb*| mtxasetx|
+\end{decl*}
+in the \meta{etx-list} is not that \meta{filename}\texttt{.etx} is
+read, but that \meta{filename}\texttt{.mtx} is read. The
+interpretation of the commands in this file is however not the
+customary, and almost the only thing paid attention to is the
+correspondence between glyph names and slot numbers that is provided
+by the |\setrawglyph| and |\setscaledrawglyph| commands; this
+correspondence is treated as if it was given by |\setslot| \dots\
+|\endsetslot| commands in an \etx file. This is however only
+guaranteed to work with transformable metric files.
+
+The purpose of this feature is to simplify installation of fonts with
+very special encodings, such as ``Dingbat'' or ``Pi'' fonts. Instead
+of creating an \etx file, which would probably only be useful with
+that particular font, one can make use of the fact that the
+interesting information is anyway available in the \mtx file. To
+install Zapf Dingbats in their default encoding, one can thus say
+\begin{verbatim}
+ \installrawfont{pzdr}{pzdr}{pzdr mtxasetx}
+ {U}{pzd}{m}{n}{}
+\end{verbatim}
+
+Unlike the case with |\installfont|, which actually creates a real
+(although virtual) font, |\installrawfont| can only create the
+metrics for a font. The \dvi driver will require some other kind of
+implementation of this font, usually an entry in some map file (e.g.
+\texttt{psfonts.map}, in the case of \dvips) that links the \TeX\ font
+name to e.g.\ a \PS\ font name and file. (Many \dvi drivers are
+configured in such a way that they, without such a map file entry,
+will call Metafont with the font name and thereby raise a sequence of
+error messages about a \setdotfilename{mf} that doesn't exist. These
+results are often rather confusing.)
+
+
+
+\begin{decl}
+ |\installfamily|\arg{encoding}\arg{family}\arg{fd-commands}
+\end{decl}
+This tells \fontinst to write an \fd file for the given combination
+of encoding and family, and clears the internal list of entries to
+put in that file. |\installfamily| commands usually come first in each
+block of \meta{install commands}.
+
+For example, if you intend to produce a \texttt{T1}-encoded Times
+family of fonts, you say:
+\begin{verbatim}
+ \installfamily{T1}{ptm}{}
+\end{verbatim}
+The \m{fd-commands} are executed every time a font in that family is
+loaded, for example to stop the Courier font from being hyphenated you
+say:
+\begin{verbatim}
+ \installfamily{T1}{pcr}{\hyphenchar\font=-1}
+\end{verbatim}
+In more recent versions of \fontinst, the |\installfamily| command is
+only necessary if you want the \m{fd-commands} argument to be
+nonempty, but it doesn't hurt to make it explicit.
+
+\begin{hackernote}
+ The \m{fd-commands} argument is tokenized with the current catcodes
+ and written to file without expansion. In particular this means
+ that spaces will be inserted after all control sequences whose
+ names consists of letters, which can be unexpected if you intend to
+ make use of control sequences whose names contain |@| characters.
+
+ One way around this is to use |\fontinstcc| and |\normalcc| to
+ temporarily switch catcodes around the |\installfamily| command.
+\end{hackernote}
+
+
+
+\subsection{Transformation commands}
+
+
+\begin{decl}
+ |\transformfont|\arg{font-name}\arg{transformed font}
+\end{decl}
+This makes a raw transformed font, for example expanded, slanted,
+condensed or re-encoded. \emph{It is the responsibility of the device
+ driver to implement this transform.} Each \verb|\transformfont|
+command writes out an \mtx file and a raw \pl file for \m{font-name}.
+
+The following commands are valid \m{transformed font}s:
+\begin{decl*}
+ |\fromafm|\arg{afm}\\
+ |\fromany|\arg{whatever}\\
+ |\frompl|\arg{pl}\\
+ |\fromplgivenetx|\marg{pl}\marg{etx}\\
+ |\frommtx|\arg{mtx}
+\end{decl*}
+These read the metrics of the font which is about to be transformed from
+an external file. |\fromafm|, |\frompl|, and |\fromplgivenetx| write out
+an \mtx file corresponding to the \afm or \pl file. In addition,
+|\fromafm| also writes out a raw \pl file, containing just the glyph
+metrics but no kerning information. |\fromplgivenetx| permits
+specifying which encoding file to use when associating glyph names to
+slots, whereas |\frompl| tries to guess this from the
+\texttt{CODINGSCHEME} property of the \pl file. |\fromany| looks for
+a file in any of the formats (in the order \mtx, \pl, \afm) and
+behaves as the first |\from|\dots\ for which it found a file.
+
+A \m{transformed font} may also be one of the following:
+\begin{decl*}
+ |\scalefont|\arg{integer expression}\arg{transformed font}\\
+ |\xscalefont|\arg{integer expression}\arg{transformed font}\\
+ |\yscalefont|\arg{integer expression}\arg{transformed font}\\
+ |\slantfont|\arg{integer expression}\arg{transformed font}
+\end{decl*}
+This applies a geometric transformation to the font metrics of
+\m{transformed font}. The scale factor or slant factor are given in
+units 1000 to the design size. Typical examples are 167 for slanted
+fonts (a slant of $\frac{1}{6}$) or 850 for condensed fonts (shrunk
+to 85\% of their natural width).
+
+The final case of a \m{transformed font} is:
+\begin{decl*}
+ |\reencodefont|\arg{etx}\arg{transformed font}
+\end{decl*}
+This rearranges the encoding vector of \m{transformed font} to match
+the encoding given by the \etx file.
+
+
+For example, to create an oblique, |8r|-encoded version of Adobe Times
+called \texttt{ptmro8r} you say:
+\begin{verbatim}
+ \transformfont{ptmro8r}{
+ \reencodefont{8r}{
+ \slantfont{167}{\fromafm{ptmr8a}}
+ }
+ }
+\end{verbatim}
+This will create \texttt{ptmr8a.mtx}, \texttt{ptmr8a.pl},
+\texttt{ptmro8r.mtx} and \texttt{ptmro8r.pl}, which can then be used
+as raw fonts in \verb|\installfont| commands. The equivalent
+transformation can also be achieved in two steps:
+\begin{verbatim}
+ \transformfont{ptmr8r}{\reencodefont{8r}{\fromafm{ptmr8a}}}
+ \transformfont{ptmro8r}{\slantfont{167}{\frommtx{ptmr8r}}}
+\end{verbatim}
+This will create \texttt{ptmr8a.mtx}, \texttt{ptmr8a.pl},
+\texttt{ptmr8r.mtx}, \texttt{ptmr8r.pl}, \texttt{ptmro8r.mtx} and
+\texttt{ptmro8r.pl}.
+
+You will have to inform your device driver about the transformed font,
+using the syntax appropriate for that driver. For example, in \dvips
+you add a line to \texttt{psfonts.map}:
+\begin{verbatim}
+ ptmro8r Times-Roman ".167 SlantFont TeXBase1Encoding ReEncodeFont" <<8r.enc
+\end{verbatim}
+See Section~\ref{Sec:Mapmaking} and
+Subsection~\ref{Ssec:MapFragments} for details on how to generate
+such lines automatically.
+
+
+\subsection{The \cs{latinfamily} command}
+
+
+\begin{decl}
+ |\latinfamily|\marg{family}\marg{commands}
+\end{decl}
+This command is by itself an entire |\installfonts| \dots\
+|\endinstallfonts| block, automatically doing |\transformfont|s,
+|\installfont|s, and |\install|\-|raw|\-|font|s depending on which
+base font metrics it finds. It generates virtual fonts in the
+\texttt{T1}, \texttt{OT1}, and \texttt{TS1} encodings.
+
+There is really much to much about this command for it to be described
+in full here. Please see other available documentation.
+
+\begin{decl}
+ |\fakenarrow|\marg{width factor}
+\end{decl}
+This command makes |\latinfamily| fake `narrow' fonts in the family it
+is working on, by $x$-scaling the normal fonts. The \meta{width factor}
+is the scale factor to use.
+
+
+\subsection{Reglyphing commands}
+
+``Reglyphing'' is an \mtx file transformation that changes glyph
+names but leaves the slot numbers and metrics as they were;
+optionally it may drop some of the metric commands. See
+Subsection~\ref{Ssec:Des:Reglyph} for an introduction to this.
+
+Like installation commands, reglyphing commands are preferably placed
+in a block between two delimiter commands:
+\begin{decl*}
+ |\reglyphfonts|\\
+ \meta{reglyphing commands}\\
+ |\endreglyphfonts|
+\end{decl*}
+The purpose of these delimiter commands is to delimit the scope in
+which the various declarations made take effect. After
+|\endreglyphfont|, you're back to the ``clean'' state that existed
+before the |\reglyphfont|.
+
+\begin{decl}
+ |\reglyphfont|\marg{destination font}\marg{source font}
+\end{decl}
+This is the only command that actually does something; all the other
+commands simply set parameters for the processing carried out here.
+What the command does is that it reads the \meta{source font} (which
+may be in \mtx, \pl, \afm, or \vpl format, but will be converted to
+\mtx before it is read for reglyphing) and writes each command back to
+the \meta{destination font} (in \mtx format \emph{only}), but often
+with some subtle modifications.
+
+It should be observed that the ``destination font'' generated by this
+command is not a real font, but just an \mtx file. If that \mtx file
+contains raw glyph defintions (|\setscaledrawglyph| commands) then
+these will refer to the \meta{source font}, so that is all a \dvi
+driver needs to be informed about.
+
+\begin{decl}
+ |\renameglyph|\marg{to}\marg{from}\\
+ |\renameglyphweighted|\marg{to}\marg{from}\marg{weight}\\
+ |\killglyph|\marg{glyph}\\
+ |\killglyphweighted|\marg{glyph}\marg{weight}
+\end{decl}
+The |\renameglyph| and |\renameglyphweighted| commands cause each
+reference to the glyph \meta{from} in the source font to be replaced
+by a reference to the glyph \meta{to} in the destination font. Thus if
+the source font contains a command that sets a glyph with the name
+\meta{from}, then this will in the destination font be changed to a
+command that sets a glyph with the name \meta{to}, but with the same
+metrics, slot, and base font name as in the source font. Kerns are
+similarly adjusted to be for the \meta{to} glyph.
+
+There is also a ``weight'' associated with each command being copied
+from source font to destination font, and if that weight is too small
+then the command will be omitted from the destination font. The weight
+of a command is the sum of the weights of all glyphs mentioned in that
+command. A glyph for which no settings have been made has weight $0$.
+A glyph name which is the \meta{from} of a |\renameglyphweighted| or
+the \meta{glyph} of a |\killglyphweighted| has the \meta{weight}
+specified there. A \meta{from} glyph of a |\renameglyph| gets the
+weight stored in the \texttt{renameweight} integer variable
+(by default $1$) and the \meta{glyph} of a |\killglyph| gets the
+weight stored in the \texttt{killweight} integer variable (by default
+$-10$). It is this large negative weight that makes |\killglyph|
+``kill'' glyphs.
+
+The weight condition for keeping a command is given by the
+|\iftokeep| command, which is regarded as a \fontinst command
+variable (see Section~\ref{Sec:Variables}). The default definition is
+to keep things with non-negative weight (typically everything that
+doesn't involve a glyph that has been killed), but for example
+\setfilename{csckrn2x.tex} redefines it to only keep things with
+positive weight (typically everything involving at least one glyph
+that has been renamed and not any that has been killed).
+
+
+\begin{decl}
+ |\offmtxcommand|\marg{command}\\
+ |\onmtxcommand|\marg{command}
+\end{decl}
+Turning a command `off' using |\offmtxcommand| means no such commands
+are to be copied to a destination font by |\reglyphfont|. Turning it
+back `on' using |\onmtxcommand| restores it to normal, i.e., whether
+it is copied depends on the weight of the command.
+
+\begin{hackernote}
+ |\offmtxcommand| and |\onmtxcommand| are wrappers around the
+ general-purpose |\offcommand| and |\oncommand| commands (see
+ Subsection~\ref{Ssec:Variables}). The wrapping makes the general
+ commands to act on a family of internal macros, namely those which
+ are used by |\reglyphfont| as definitions of the transformable
+ metric commands.
+\end{hackernote}
+
+
+\subsection{Miscellaneous settings}
+
+\begin{decl}
+ |\substitutesilent|\arg{to}\arg{from}\\
+ |\substitutenoisy|\arg{to}\arg{from}
+\end{decl}
+This declares a \LaTeX\ font substitution, that the series or shape
+\m{to} should be substituted if necessary by the series or shape
+\m{from}. Font substitutions happen at |\endinstallfonts| time, and
+cause font declarations using |sub| or |ssub| to be added to the \fd
+files being written.
+
+\verb|\substitutenoisy| means that a warning will be given when
+the substitution is made by \LaTeX.
+\verb|\substitutesilent| means that \LaTeX\ should not warn when
+the font substitution is made.
+
+For example, to say that the series |bx| can be replaced by the
+series |b| (a request for series |bx| selects a font with actual series
+|b|), you say:
+\begin{verbatim}
+ \substitutesilent{bx}{b}
+\end{verbatim}
+To say that the shape |ui| can be replaced by the shape |it| (a
+request for shape |ui| selects a font with actual shape |it|), you say:
+\begin{verbatim}
+ \substitutenoisy{ui}{it}
+\end{verbatim}
+
+The following weight substitutions are standard:
+\begin{verbatim}
+ \substitutesilent{bx}{b}
+ \substitutesilent{b}{bx}
+ \substitutesilent{b}{sb}
+ \substitutesilent{b}{db}
+ \substitutesilent{m}{mb}
+ \substitutesilent{m}{l}
+\end{verbatim}
+The following shape substitutions are standard:
+\begin{verbatim}
+ \substitutenoisy{ui}{it}
+ \substitutesilent{it}{sl}
+ \substitutesilent{sl}{it}
+\end{verbatim}
+In order to disable a default substitution, use the \meta{from} for
+both arguments.
+
+The |\installfontas| command should be considered as an
+alternative to using font substitution, as it gives much finer
+control over what \fd entries will be made.
+
+
+\begin{decl}
+ |\declaresize|\arg{size}\arg{fd-size-range}
+\end{decl}
+This declares a new size shorthand, and gives the \fd size
+specifications for it. For example, \url{fontinst.sty} declares
+the following sizes:
+\begin{verbatim}
+ \declaresize{}{<<->>}
+ \declaresize{5}{<<5>>}
+ \declaresize{6}{<<6>>}
+ \declaresize{7}{<<7>>}
+ \declaresize{8}{<<8>>}
+ \declaresize{9}{<<9>>}
+ \declaresize{10}{<<10>>}
+ \declaresize{11}{<<10.95>>}
+ \declaresize{12}{<<12>>}
+ \declaresize{14}{<<14.4>>}
+ \declaresize{17}{<<17.28>>}
+ \declaresize{20}{<<20.74>>}
+ \declaresize{25}{<<24.88>>}
+\end{verbatim}
+The first of these is what gives an empty \meta{size} argument for
+the font installation commands the meaning ``all sizes''.
+
+\begin{decl}
+ |\declareencoding|\arg{string}\arg{etx}
+\end{decl}
+This declares which \etx file corresponds to which
+\texttt{CODINGSCHEME} string, and is used when reading metrics in \pl
+format. For example, \url{fontinst.sty} declares the following
+encoding strings:
+\begin{verbatim}
+ \declareencoding{TEX TEXT}{ot1}
+ \declareencoding{TEX TEXT WITHOUT F-LIGATURES}{ot1}
+ \declareencoding{TEX TYPEWRITER TEXT}{ot1tt}
+ \declareencoding{TEX MATH ITALIC}{oml}
+ \declareencoding{TEX MATH SYMBOLS}{oms}
+ \declareencoding{TEX MATH EXTENSION}{omx}
+ \declareencoding{EXTENDED TEX FONT ENCODING - LATIN}{t1}
+ \declareencoding{TEX TEXT COMPANION SYMBOLS 1---TS1}{ts1}
+ \declareencoding{TEXBASE1ENCODING}{8r}
+ \declareencoding{TEX TYPEWRITER AND WINDOWS ANSI}{8y}
+\end{verbatim}
+
+
+\subsection{Low-level conversion commands}
+
+The following commands are the low-level commands which carry out
+various conversions. There's usually no need to bother about them
+unless you are hacking \fontinst, but you may see them in the header
+comments of files \fontinst generates, so here's a description of what
+they do and when they are used.
+
+\begin{decl}
+ |\afmtomtx|\marg{afmfile}\marg{mtxfile}\\
+ |\generalpltomtx|\marg{plfile}\marg{mtxfile}%
+ \marg{plsuffix}\marg{opt-enc}
+\end{decl}
+These handle importing font metric data to the \fontinst native \mtx
+format.
+
+|\afmtomtx| converts metrics in \afm format. It uses the
+\texttt{minimumkern} integer variable and the |\slanteditalcorr| and
+|\uprightitalcorr| command variables.
+
+|\generalpltomtx| converts metrics in \pl or \vpl format. If the
+\meta{opt-enc} string expression is nonempty then that is taken as the
+name of an \etx file that assigns glyph names to the slots in the font.
+
+\begin{decl}
+ |\mtxtomtx|\marg{source MTX}\marg{destination MTX}
+\end{decl}
+This is the heart of the |\transformfont| command. It makes use of the
+\texttt{x-scale}, \texttt{y-scale}, and \texttt{slant-scale} integer
+variables, and the \texttt{etx-name} string variable.
+
+\begin{decl}
+ |\mtxtopl|\marg{mtxfile}\marg{plfile}
+\end{decl}
+This converts \mtx metrics to \pl format; more precisely it generates
+\texttt{CHARACTER} property lists for |\setrawglyph| and
+|\setscaledrawglyph| commands. Kerning information is ignored.
+
+The command is used immediately after an |\afmtomtx| or |\mtxtomtx|.
+The invariant is that if there can be some |\setrawglyph| or
+|\setscaledrawglyph| command which refers to a glyph in some font,
+then there must also be a \pl file with metrics for that font.
+
+\begin{decl}
+ |\etxtovpl|\marg{encoding list}\marg{vplfile}\\
+ |\etxtopl|\marg{encoding list}\marg{plfile}
+\end{decl}
+These are the cores of |\installfont| and |\installrawfont|
+respectively. They don't really convert files---it's more like
+generating a \vpl or \pl under the control of the \etx.
+
+
+
+
+
+
+\subsection{Other}
+
+The following commands also belong in this section, but don't belong
+to any of the major groups.
+
+\begin{decl}
+ |\recordtransforms|\marg{filename}\\
+ |\endrecordtransforms|
+\end{decl}
+See Subsection~\ref{Ssec:MapFragments} for an explanation of how these
+are used.
+
+\begin{decl}
+ |\NOFILES|
+\end{decl}
+This command switches off file generation, and causes \fontinst to
+only generate empty files. It only affects the user level commands,
+so it is primarily of use when debugging commands that build on
+these, such as for example the |\latin|\-|family| command.
+
+
+
+
+
+\section{Mapmaking commands}
+\label{Sec:Mapmaking}
+
+The commands described in this section are for use with command files
+that input \texttt{finstmsc.sty}.
+
+
+\subsection{Mapfile command reference}
+
+For an introduction to making map file entries, see
+Subsection~\ref{Ssec:MapFragments}.
+
+\begin{decl}
+ |\adddriver|\marg{driver name}\marg{fragment file name}
+\end{decl}
+This opens the file \meta{fragment file name} for writing mapfile
+entries to. The \meta{driver name} selects the format of these
+entries. \emph{Note} that if the \meta{fragment file name} does not
+include a suffix, it will get the suffix \setfilename{tex}, which is
+probably not what you want.
+
+\begin{decl}
+ |\makemapentry|\marg{\TeX\ font name}
+\end{decl}
+This causes a mapfile entry for the specified font to be written to
+all files currently open for receiving mapfile entries. These
+commands are usually automatically generated by \fontinst.
+
+\begin{decl}
+ |\donedrivers|
+\end{decl}
+This closes all files open for receiving mapfile entries.
+
+
+\subsection{Drivers}
+
+The \meta{driver name}s that may be used with |\adddriver| are:
+
+\begin{decl}
+ |dvips|
+\end{decl}
+The \dvips driver. The mapfiles generated are useful also with
+pdf\TeX, but one does not always use the exact same file for both;
+sometimes they require different settings.
+
+\begin{decl}
+ |dvipdfm|
+\end{decl}
+The \setpackagename{dvipdfm} \dvi-to-\pdf driver. Not much tested,
+but appears to work.
+
+\begin{decl}[v1.915]
+ |pltotf|
+\end{decl}
+Not really a \dvi driver. The file that is generated is a shell
+script of \texttt{pltotf} commands for converting precisely those \pl
+files which are needed to \tfm files (\fontinst generally generates
+also a bunch of \pl files that in the end turn out to be
+unnecessary). The \texttt{TFMfileprefix} variable can be used to
+specify a path to the directory where these files should be placed.
+
+\begin{decl}
+ |debug|
+\end{decl}
+Not a \dvi driver either, but for each base font a report on the
+information that was available. Useful if you need to write the
+driver file yourself.
+
+\begin{hackernote}
+ Creating a new driver \meta{foo} is mostly a matter of suitably
+ defining the |\make_|\meta{foo} command.
+\end{hackernote}
+
+
+\subsection{Configuration commands}
+\label{Ssec:MapConfig}
+
+The following commands configure the generation of mapfile entries,
+mostly with respect to how various pieces of information are deduced
+from other pieces.
+
+\begin{decl}
+ |\AssumeAMSBSYY|\\
+ |\AssumeBaKoMa|\\
+ |\AssumeMetafont|
+\end{decl}
+These commands change what the map file writer does when it needs to
+know the \PS name for a font but only knows the \TeX\ name. This
+usually happen when the metrics came from a \pl file.
+
+|\AssumeAMSBSYY| tells it to uppercase the \TeX\ name and use that as
+\PS name; this is correct for the AMS\slash Blue~Sky\slash Y\&Y
+conversions of the Computer Modern fonts.
+
+|\AssumeBaKoMa| tells it to lowercase the \TeX\ name and use that as
+\PS name; this is correct for the BaKoMa conversions of the Computer
+Modern fonts.
+
+|\AssumeMetafont| tells it to ignore base fonts for which no \PS name
+is known, on the assumption that they are \mf fonts.
+
+
+\begin{decl}
+ |\AssumeLWFN|
+\end{decl}
+This commands changes what the map file writer does when it needs to
+know the name of the file in which a \PS font is stored. The file name
+is constructed from the \PS font name using the $5+3+3+\cdots$
+convention used in (Classic) Mac~OS.
+
+By default \fontinst uses as \PS font file name the \TeX\ name of the
+font (i.e., the name of the source \afm or whatever file) and appends
+to that the contents of the \texttt{PSfontsuffix} string.
+
+For fonts which fit neither of these schemes, one can give individual
+specifications using the command
+\begin{decl*}
+ |\specifypsfont|\marg{PS font name}\marg{actions}
+\end{decl*}
+Note that the font is here identified using its \PS font name, not the
+\TeX\ font name.
+
+An \meta{action} is one of\footnote{Additional actions can be added
+in the future, if there is a need for them. It is not a problem if not
+all driver can support an action, since all actions typically default
+to \cs{download}.}
+\begin{decl*}[v1.928]
+ |\download|\marg{file}\\
+ |\fulldownload|\marg{file}
+\end{decl*}
+where \meta{file} is a file to download (`download' typically means
+``include in the generated \PS output or equivalent''). The difference
+between |\download| and |\fulldownload| have to do with how partial
+downloading (subsetting) of fonts should be handled. |\download| means
+use the driver's defaults (often settable via command line options)
+for this. |\fulldownload| means don't subset: always include the full
+font, if \fontinst knows how to express this in a map file entry for
+this particular driver.
+
+If FooBar-Regular is a non-subsettable font, then you may specify this
+to \fontinst through a command like
+\begin{verbatim}
+ \specifypsfont{FooBar-Regular}{\fulldownload{foobar.pfb}}
+\end{verbatim}
+To specify that the PDF ``base 14'' fonts do not require downloading,
+one would say
+\begin{verbatim}
+ \specifypsfont{Courier}{}
+ \specifypsfont{Courier-Bold}{}
+ \specifypsfont{Courier-BoldOblique}{}
+ \specifypsfont{Courier-Oblique}{}
+ \specifypsfont{Helvetica}{}
+ \specifypsfont{Helvetica-Bold}{}
+ \specifypsfont{Helvetica-BoldOblique}{}
+ \specifypsfont{Helvetica-Oblique}{}
+ \specifypsfont{Times-Roman}{}
+ \specifypsfont{Times-Bold}{}
+ \specifypsfont{Times-Italic}{}
+ \specifypsfont{Times-BoldItalic}{}
+ \specifypsfont{Symbol}{}
+ \specifypsfont{ZapfDingbats}{}
+\end{verbatim}
+When more than one action appears in the \meta{actions} argument,
+then it is usually the last that actually creates the font, whereas
+the others contain resources needed by the last.
+
+
+\begin{decl}
+ |\declarepsencoding|\marg{etx}\marg{postscript name}\marg{action}
+\end{decl}
+This command specifies how reencoding using a particular \etx file
+should be performed by the driver. The \meta{postscript name} is the
+\PS name of the encoding vector used, whereas the \meta{action} is the
+action (as above) that the driver needs to perform to make the
+encoding known to whatever it is that it is serving (often a \PS
+interpreter).
+
+Usually the right thing to do is to |\download| an \enc file, but
+there is also an action
+\begin{decl*}[v1.931]
+ |\encodingdownload|\marg{file}
+\end{decl*}
+which tries to express the fact that the \meta{file} contains an
+encoding vector. In the case of \dvips this is only necessary if
+(i)~the font is being subsetted and (ii)~the \meta{file} name is
+nonstandard (does not end with \enc).
+
+\begin{decl}[v1.931]
+ |\providepsencoding|\marg{etx}\marg{postscript name}\marg{action}
+\end{decl}
+This command is the same as |\declarepsencoding|, except that it
+doesn't do anything if an encoding has already been declared for this
+\meta{etx}. It is used for autogenerated encoding declarations, so
+that these will not override one issued by the user.
+
+
+
+\begin{decl}
+ |\storemapdata|\marg{\TeX\ font name}\marg{source}\marg{transforms}
+\end{decl}
+This records information about how the font named \meta{\TeX\ font
+name} was generated. Such commands are usually found in the file of
+recorded transforms. If a font is encountered for which no
+information has been stored, then the corresponding \mtx file will be
+sourced, looking for a |\storemapdata| command there.
+
+A \meta{source} is one of
+\begin{decl*}
+ |\fromafm|\marg{\afm name}\marg{PS name}\\
+ |\frompl|\marg{\pl name}\\
+ |\frommtx|\marg{\mtx name}\\
+ |\fromvpl|
+\end{decl*}
+Note that several of them have a different syntax and meaning than
+they do in fontmaking command files.
+
+A \meta{transform} is one of
+\begin{decl*}
+ |\reencodefont|\marg{etx}\\
+ |\reglyphfont|\\
+ |\transformfont|\marg{x-scale}\marg{slant-scale}
+\end{decl*}
+Note that all of these have a different meaning than they do in
+fontmaking command files.
+
+\begin{decl}
+ |\debugvalue|\arg{name}
+\end{decl}
+This adds a value to the list of those that are reported by the
+\texttt{debug} driver. Example:
+\begin{verbatim}
+ \debugvalue{PS_font_file}
+\end{verbatim}
+
+
+
+\subsection{Basic conversion commands}
+
+Some of the basic ``convert an $X$ file to a $Y$ file'' commands in
+\fontinst are not useful as part of a fontmaking run, and are
+available only in \texttt{finstmsc.sty} to conserve some memory.
+
+\begin{decl}
+ |\enctoetx|\marg{encfile}\marg{etxfile}
+\end{decl}
+This reads the file \meta{encfile}\texttt{.enc} which should be
+simple \PS code defining a \PS encoding vector and generates a
+corresponding rudimentary \fontinst encoding file
+\meta{etxfile}\texttt{.etx}. It's a basic ``import encoding to
+\fontinst'' command.
+
+\begin{decl}[v1.911]
+ |\etxtoenc|\marg{etxfiles}\marg{encfile}
+\end{decl}
+This does the opposite of |\enctoetx|; the information in the \etx
+files that is converted is the correspondence between slots and glyph
+names.
+\NEWfeature{v1.927}
+The \meta{etxfiles} argument is a comma-separated list of encoding
+files which are superimposed to generate the \PS encoding. The first
+|\setslot| for a particular slot is the one which decides which glyph
+will be placed there.
+
+\begin{decl}[v1.928]
+ |\etxtocmap|\marg{etxfile}\marg{cmapfile}
+\end{decl}
+This reads an \etx file and generates a corresponding ToUnicode CMap
+file; the information that is converted is the map from slot numbers
+to |\Unicode| code points.
+
+
+
+
+\section{General commands}
+
+
+
+This section describes commands and mechanisms that are the same in
+all file types. Commands that are particular for one type of file are
+described in subsequent sections.
+
+
+\subsection{Variables}
+\label{Ssec:Variables}
+
+Many (but not all) of the activities \fontinst perform can be
+understood as either ``setting variables'' or ``formatting and writing
+to file data stored in some variable''. The accessing of variables is
+an important aspect of how \fontinst works.
+
+Variables come in different types and variables of different types
+live in different namespaces; |\int{foo}|, |\str{foo}|, and
+|\dim{foo}| refer to three different variables which are all named
+|foo|. Variables are either set or not set. Unless the contrary is
+stated explicitly, each variable defaults to not being set. It is an
+error to access the value of a variable that has not been set.
+\Fontinst variable assignments are as a rule local, i.e., will be
+undone when the enclosing \TeX\ group is ended. Most command file
+commands that cause files to be read will begin a group before
+reading the file(s) and end the group at some point after having
+read them.
+
+Taking string variables as an example, there are three commands for
+changing a string variable:
+\begin{decl*}
+ |\setstr|\arg{name}\arg{string expression}\\
+ |\resetstr|\arg{name}\arg{string expression}\\
+ |\unsetstr|\arg{name}
+\end{decl*}
+The |\resetstr| command unconditionally sets the string variable
+\meta{name} to the full expansion of the \meta{string expression}.
+The |\unsetstr| command unconditionally renders the string variable
+\meta{name} unset. If the the string variable \meta{name} is
+currently unset then the |\setstr| command will set it to the full
+expansion of the \meta{string expression}, but if it already is set
+then |\setstr| does nothing.
+
+This pattern with three commands, one |\set|\dots\ which only sets
+unset variables, one |\reset|\dots\ which sets variables regardless of
+whether they have been set or not, and one |\unset|\dots\ which unsets
+variables is recurring in \fontinst. Variables are most commonly set
+using some |\set|\dots\ command; this has the effect that the first
+command to try to set a variable is the one which actually sets it.
+
+If |\set|\dots\ is the command for setting the value of a variable,
+the command for getting that value has the same name without the
+|set| part, e.g., |\setint|--|\int|, |\setglyph|--|\glyph|, etc.
+(Notable exceptions are |\setkern|, where the ``get'' command is
+called |\kerning|, and |\setcommand|, where no separate ``get''
+command is needed.) There
+are typically also conditionals for testing whether variables are
+set, and these take the form |\ifis|\dots\arg{name}|\then|.
+
+\medskip
+% The following commands for changing the value of a variable can be
+% used anywhere:
+
+\begin{decl}
+ |\setdim|\arg{dim}\arg{dimension}\\
+ |\setint|\arg{int}\arg{integer expression}\\
+ |\setstr|\arg{str}\arg{string expression}
+\end{decl}
+If the dimension variable \m{dim} is currently undefined, it is
+defined to be the current value of \m{dimension}.
+
+If the integer variable \m{int} is currently undefined, it is
+defined to be the current value of \m{integer expression}.
+
+If the string variable \m{str} is currently undefined, it is
+defined to be the current value of \m{string expression}.
+
+\begin{decl}
+ |\setcommand|\arg{command}\meta{parameter text}\arg{replacement text}
+\end{decl}
+If the command \m{command} is currently undefined, it is defined to
+grab parameters as specified by the \meta{parameter text} and then
+expand to the \m{replacement text}. This uses the same syntax for
+parameters as the \TeX\ \verb|\def| command.
+\begin{center}
+ \begin{tabular}{r l}
+ Number of parameters& \meta{parameter text}\\
+ 0& (empty)\\
+ 1& |#1|\\
+ 2& |#1#2|\\
+ 3& |#1#2#3|\\
+ \multicolumn{2}{c}{and so on.}
+ \end{tabular}
+\end{center}
+Some examples:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\lc#1#2{#1small}
+\end{verbatim}
+With the first definition, |\lc{A}{a}| expands to |a|, but with the
+second it expands to |Asmall|.
+
+\begin{decl}
+ |\resetdim|\arg{dim}\arg{dimension}\\
+ |\resetint|\arg{int}\arg{integer expression}\\
+ |\resetstr|\arg{str}\arg{string expression}
+\end{decl}
+The dimension variable \m{dim} is defined to be the current value
+of \m{dimension}.
+
+The integer variable \m{int} is defined to be the current value of
+\m{integer expression}.
+
+The string variable \m{str} is defined to be the current value of
+the \m{string expression}. (|\resetstr| mostly boils down to a \TeX\
+|\edef| command.)
+
+\begin{decl}
+ |\resetcommand|\arg{command}\meta{parameter text}\arg{replacement text}
+\end{decl}
+The command \m{command} is defined to grab parameters as specified by
+the \meta{parameter text} and then expand to the \m{replacement text}.
+This is a synonym for the \TeX\ \verb|\def| command.
+
+\begin{decl}
+ |\unsetdim|\arg{dim}\\
+ |\unsetint|\arg{int}\\
+ |\unsetstr|\arg{str}\\
+ |\unsetcommand|\arg{command}
+\end{decl}
+Makes \m{dim}, \m{int}, \m{str}, or \m{command} an undefined
+dimension, integer, string or command.
+
+\begin{decl}[v1.900]
+ |\offcommand|\marg{command}\\
+ |\oncommand|\marg{command}
+\end{decl}
+|\offcommand| turns off a command, i.e., it redefines it to do
+nothing (while still taking the same number of arguments).
+|\oncommand| turns a command back on, i.e., it restores the
+definition the command had before a previous |\offcommand|. Using
+|\offcommand| on a command that is already off or |\oncommand| on a
+command that is not off has no effect.
+
+
+\subsection{Argument types and expansion}
+
+Most arguments of \fontinst commands belong to one of the following
+six categories:
+\begin{itemize}
+ \item integer expressions,
+ \item string expressions,
+ \item comma-separated lists of string expressions,
+ \item dimensions,
+ \item commands (i.e., a single \TeX\ control sequence), and
+ \item code (zero or more commands in sequence, each of which may
+ have arguments of its own).
+\end{itemize}
+Integer expressions are explained in Subsection~\ref{Sec:integer}
+below.
+
+The most common form of a string expression is simply a sequence of
+character tokens, but any balanced text which expands to such a
+sequence of tokens is legal. Several of the standard \etx files use
+macros in string expressions to make glyph names to some extent
+configurable. Besides such custom macros, the following \fontinst
+commands may be used to access variable values inside a string
+expression
+\begin{decl*}
+ |\strint|\arg{int}\\
+ |\str|\arg{str}\\
+ |\dim|\arg{dim}
+\end{decl*}
+Incidentally, these \m{int}, \m{str}, and \m{dim} are themselves
+string expressions (for the names of integer, string, and dimen
+respectively variables).
+
+Dimensions are simply \TeX\ \meta{dimen}s; their use is rather
+limited. \Fontinst does not provide for any sort of ``dimen
+expressions''. Most actual lengths are expressed as integer
+expressions, in AFM units ($1/1000$ of the font size).
+
+Common to integer expressions, string expressions, and
+dimensions is that these argument types get expanded during
+evaluation (in the case of string expressions, this expansion
+\emph{is} the evaluation), which means one can use macros in
+arguments of these types. Command arguments do not get
+expanded---they are mainly used with commands that modify the
+definitions of other commands.
+
+Comma-separated lists of string expressions are first split at commas
+(without prior expansion) and each element is then treated as a
+string expression (i.e., \emph{gets expanded}). (As remarked elsewhere,
+the \meta{metrics-list} argument of |\installfont| is not properly a
+comma-separated list of string expressions, even though it may look
+like one.)
+
+Code arguments are generally expanded, but one should not make any
+presumptions about \emph{when} this will happen, and similarly not
+assume that code placed in such an argument will only be executed
+once. It is typically safe to use a macro in a code argument if the
+definition of that macro stays the same throughout, but one should
+otherwise not use any other commands in code arguments than those
+explicitly documented as legal there.
+
+Finally, there are command arguments which do not fall into any of
+these categories. For these, one cannot give any rules: they
+might get expanded, but it could also happen that they won't.
+
+
+
+\subsection{Integer expressions}
+\label{Sec:integer}
+
+The \emph{integer expressions} provide a user-friendly syntax for
+\TeX\ arithmetic. They are used to manipulate any integers,
+including glyph dimensions (which are given in AFM units, that is
+1000 to the design size). \TeX\ \pl fonts have their dimensions
+converted to AFM units automatically.
+
+The \emph{integer expressions} are:
+
+\begin{decl}
+ \m{number}
+\end{decl}
+Returns the value of a \TeX\ \m{number} (as explained in
+\emph{The \TeX book}). Typical examples of this kind of integer
+expression are |0|, |1000|, |538|, |-20|, |"9C|, |'177|, etc.
+
+\begin{decl}
+ |\int|\arg{int}
+\end{decl}
+Returns the value of the integer variable \m{int}.
+
+\begin{decl}
+ |\width|\arg{glyph}\\
+ |\height|\arg{glyph}\\
+ |\depth|\arg{glyph}\\
+ |\italic|\arg{glyph}
+\end{decl}
+Returns the width, height, depth, or italic correction of the glyph
+variable \m{glyph}.
+
+\begin{decl}
+ |\kerning|\arg{left}\arg{right}
+\end{decl}
+Returns the kerning between the \m{left} and \m{right} glyphs. Unlike
+other types of variable accesses, where it is an error to access
+something that has not been explicitly set, this command returns |0|
+if no kern has been set between the two glyphs.
+
+\begin{decl}
+ |\neg|\arg{integer expression}\\
+ |\add|\arg{integer expression}\arg{integer expression}\\
+ |\sub|\arg{integer expression}\arg{integer expression}\\
+ |\max|\arg{integer expression}\arg{integer expression}\\
+ |\min|\arg{integer expression}\arg{integer expression}\\
+ |\mul|\arg{integer expression}\arg{integer expression}\\
+ |\div|\arg{integer expression}\arg{integer expression}\\
+ |\scale|\arg{integer expression}\arg{integer expression}\\
+ |\half|\arg{integer expression}\\
+ |\otherhalf|\arg{integer expression}
+\end{decl}
+These commands evaluate their argument(s) and perform some arithmetic
+operations on the result(s).
+
+|\neg| returns the negation of the \m{integer expression}.
+
+|\add| returns the sum of the two \m{integer expression}s.
+
+|\sub| returns the first \m{integer expression} minus the second.
+
+|\max| returns the maximum of the two \m{integer expression}s.
+
+|\min| returns the minimum of the two \m{integer expression}s.
+
+|\mul| returns the product of the two \m{integer expression}s.
+
+|\div| returns the first \m{integer expression} divided by the second.
+
+|\scale| returns the first \m{integer expression} times the second,
+divided by 1000. |\scale| does better rounding than the corresponding
+combination of |\mul| and |\div|.
+
+|\half| returns half the \m{integer expression}. It does better
+rounding than |\scale|\arg{integer expression}|{500}| or
+|\div|\arg{integer expression}|{2}|.
+
+|\otherhalf| returns the ``other half'' of the \m{integer
+expression}, i.e., the sum of |\half| something and |\otherhalf| the
+same thing is that thing back.
+
+
+\subsection{Conditionals and loops}
+
+\Fontinst has a rather extensive family of conditionals (|\if|s), and
+as of late also some convenient loop commands. The most common forms
+of a \fontinst conditional are
+\begin{decl*}
+ |\if|\dots \meta{argument(s)}|\then| \meta{then branch} |\Fi|\\
+ |\if|\dots \meta{argument(s)}|\then| \meta{then branch} |\Else|
+ \meta{else branch} |\Fi|
+\end{decl*}
+i.e., \fontinst uses Plain\TeX\ style conditionals (with else and fi
+control sequences) rather than \LaTeX\ style conditionals (with
+separate arguments for the two branches). Every |\if|\dots\ command
+can be thought of as testing some condition.
+If the condition is true then the \meta{then branch} will be executed,
+but not the \meta{else branch} (if there is one).
+If the condition is false then the \meta{then branch} will not be
+executed, but if there is an \meta{else branch} then that will be
+executed. Conditionals may be nested (i.e., occur in the then or else
+branch).
+
+\begin{hackernote}
+ The |\then| is not just syntactic sugar, but a functional part of
+ those conditionals which take arguments. Its purpose is to look
+ like an |\if| to \TeX\ when the conditional occurs in a skipped
+ branch of another conditional.
+\end{hackernote}
+
+The most common conditionals are those which test if a variable is set.
+\begin{decl*}
+ |\ifisint|\arg{int}|\then|\\
+ |\ifisdim|\arg{dim}|\then|\\
+ |\ifisstr|\arg{str}|\then|\\
+ |\ifiscommand|\arg{command}|\then|
+\end{decl*}
+These cause the following \meta{then branch} to be executed if the
+specified variable is set, and the \meta{else branch} to be executed
+if the variable is not set. The \meta{int}, \meta{dim}, and
+\meta{str} are string expressions for the names of an integer,
+dimension, and string respectively variable. The \meta{command} is
+the actual control sequence (command variable) that should be tested.
+
+\begin{decl}
+ |\ifisglyph|\arg{glyph}|\then|
+\end{decl}
+This similarly tests if a glyph (also a variable of a kind) is set in
+the current glyph base. The glyph name \meta{glyph} is a string
+expression.
+
+\begin{decl}[v1.917]
+ |\ifareglyphs|\marg{glyph list}|\then|
+\end{decl}
+This command tests whether all the glyphs in the \meta{glyph list}
+(a comma-separated list of string expressions) are set in the current
+glyph base. If one of the glyphs is not set then the condition is
+false.
+
+\begin{decl}[v1.900]
+ |\ifnumber|\marg{integer expression}\meta{rel}%
+ \marg{integer expression}|\then|
+\end{decl}
+The \meta{rel} is one of \texttt{<}, \texttt{=}, and \texttt{>}.
+This command evaluates the two \meta{integer expression}s and
+then tests whether the specified relation holds between their values.
+
+\begin{decl}[v1.900]
+ |\ifiskern|\marg{glyph1}\marg{glyph2}|\then|
+\end{decl}
+This tests whether a kern has been set with \meta{glyph1} on the left
+and \meta{glyph2} on the right (both arguments are string
+expressions). This is almost the negation of
+\begin{verbatim}
+ \ifnumber{\kerning{<glyph1>}{<glyph2>}}={0}\then
+\end{verbatim}
+but |\ifiskern| can distinguish the case that an zero kern has been
+set (true) from the case that no such kern has been set (false),
+which |\kerning| can not. It is however unlikely that this
+distinction would ever be of use in a practical situation.
+
+\begin{decl}[v1.924]
+ |\ifoption|\marg{string}|\then|
+\end{decl}
+Test whether \meta{string} (a string expression) is among the current
+list of options. This list is by default empty, elements are added
+using |option| modifiers (cf.~the description of |\installfont|), and
+the list is cleared for each new file for which one can specify
+options.
+
+\begin{decl}[v1.909]
+ |\Else|
+ |\Fi|
+\end{decl}
+For \fontinst, these two control sequences are precisely the same as
+the \TeX\ primitives |\else| and |\fi|, but things are a bit more
+complicated in \fontdoc. The mechanism in \fontdoc\ that allows it to
+present both branches of the conditional in the typeset output
+requires that |\Else| and |\Fi| generate typeset output. See also the
+|\showbranches| \fontdoc command.
+
+\begin{hackernote}
+ Before |\Else| and |\Fi| were introduced, the \TeX\ primitives
+ |\else| and |\fi| were used instead for \fontinst conditionals.
+ Back then, \fontdoc defined all conditionals to expand to |\iftrue|.
+
+ It used to be the case that all conditionals would be fully
+ expandable (which in particular would have made it possible to use
+ them in string expressions), but that is no longer the case.
+\end{hackernote}
+
+The \fontdoc formatter for visible branches treats an |\Else|
+immediately followed by an `if' as an `else if', i.e., it assumes the
+entire else branch consists of the conditional begun at that `if' and
+leaves out one level of indentation. When that is not the case, you
+will upon typesetting get a \LaTeX\ error about |\begin{IfBranchDummy}|
+and |\end{IfBranch}|. In that case you need to help the formatter by
+placing something between the |\Else| and the `if'; as it turns out
+leaving an empty line there is sufficient (although just a single
+newline is not).
+
+
+\begin{decl}[v1.901]
+ |\for|\parg{name}\marg{start}\marg{stop}\marg{step}
+ \meta{body} |\endfor|\parg{name}
+\end{decl}
+will cause the \meta{body} code to be repeated some number of times.
+How many depends on the values of \meta{start}, \meta{stop}, and
+\meta{step}, which are integer expressions.
+
+As a precaution, the \meta{body} is not allowed to contain any
+empty lines (|\par| tokens). If you want to have the visual
+separation (for sakes of legibility or otherwise), put a |%|
+somewhere on the line---that makes it nonempty.
+
+\meta{name} should consist of character tokens only. It is used as
+the name of an integer variable, which will serve as loop variable.
+This variable gets reset to the value of \meta{start} before the first
+repetition of \meta{body code}. After each repetition but the last,
+it is incremented by \meta{step}. \meta{body} gets repeated if
+the value of \meta{name} has not gotten past that of \meta{stop}. To
+get past means to be bigger if \meta{step} is positive and to be
+smaller if \meta{step} is negative. In the case that \meta{step} is
+zero, the entire construction above will be equivalent to
+\begin{quote}
+ |\resetint|\marg{name}\marg{start}\\
+ \meta{body}
+\end{quote}
+
+|\for| \textellipsis\ |\endfor| constructions can be nested.
+\meta{name} is used by |\for| to identify its matching |\endfor|, so
+they need to be identical in |\for| and |\endfor|. \textbf{Note} that
+the delimiters around the \meta{name} are parentheses, not braces.
+
+
+\begin{decl}[v1.901]
+ |\foreach|\parg{name}\marg{csep-list}
+ \meta{body} |\endfor|\parg{name}
+\end{decl}
+will cause the \meta{body} code to be repeated one time for each item
+in the \meta{csep-list}. \meta{csep-list} is a comma-separated list
+of string expressions.
+
+As a precaution, the \meta{body} is not allowed to contain any
+empty lines (|\par| tokens). If you want to have the visual
+separation (for sakes of legibility or otherwise), put a |%|
+somewhere on the line---that makes it nonempty.
+
+\meta{name} should consist of character tokens only. It is used as
+the name of a string variable, which will serve as loop variable.
+Before each repetition of the \meta{body code}, the loop variable will
+get reset to the next item in the \meta{csep-list}.
+
+|\foreach|\textellipsis\ |\endfor| constructions can be nested.
+\meta{name} is used by |\foreach| to identify its matching |\endfor|,
+so they need to be identical in |\foreach| and |\endfor|.
+\textbf{Note} that the delimiters around the \meta{name} are
+parentheses, not braces.
+
+
+
+\subsection{Other general commands}
+
+\begin{decl}
+ |\needsfontinstversion|\arg{version}
+\end{decl}
+This issues a warning if the current version of the \fontinst
+package is less than \m{version}.
+
+\begin{decl}[v1.914]
+ |\needsTeXextension|\marg{extension tests}\marg{who}
+\end{decl}
+The |\needsTeXextension| command issues a warning if \fontinst is not
+being run on one of the listed extensions of \TeX. This can be used to
+protect files that make use of features not present in base \TeX. As
+\meta{who} is preferably used the file name in which the command
+occurs; it should be the answer to ``who is issuing this warning?''
+
+An extension test is one of:
+\begin{decl*}
+ |\eTeX|\marg{version number}\\
+ |\pdfTeX|\marg{version number}\marg{revision}
+\end{decl*}
+Multiple tests in sequence are \textsc{or}'ed together. If you rather
+need to \textsc{and} them, then use separate |\needsTeXextension|
+commands.
+
+\begin{hackernote}
+ At present there is no test for Omega. This is really a shame,
+ because the extended character codes (outside the 0--255 range)
+ provided by Omega is the existing extension that would be most
+ useful for \fontinst, but Omega documentation does not give any
+ indication of how such a test should be implemented. Code
+ contributions are welcome.
+\end{hackernote}
+
+
+\begin{decl}[v1.915]
+ |\fontinstcc|\\
+ |\normalcc|
+\end{decl}
+|\fontinstcc| switches to the catcodes used in e.g.\@
+\texttt{fontinst.sty}: |_| and |@| are letters, space and newline are
+ignored, and |~| is a space. |\normalcc| switches back to normal
+catcodes.
+
+\begin{decl}[v1.900]
+ |\begincomment| \meta{text} |\endcomment|
+\end{decl}
+This hides the \meta{text} from \fontinst processing, but allows it
+to show up when the file is typeset with \fontdoc.
+
+\begin{decl}[v1.906]
+ |\fontinsterror|\marg{subsystem}\marg{error}\marg{help}\\
+ |\fontinstwarning|\marg{subsystem}\marg{warning}\\
+ |\fontinstwarningnoline|\marg{subsystem}\marg{warning}\\
+ |\fontinstinfo|\marg{subsystem}\marg{info}
+\end{decl}
+General commands to convey information to the user, based on \LaTeX's
+|\PackageError|, |\PackageWarning|, etc.
+
+\begin{decl}[v1.906]
+ |\messagebreak|
+\end{decl}
+Used to start a new line in an \meta{error}, \meta{help},
+\meta{warning}, or \meta{info} message.
+
+
+Finally, there are two Plain\TeX\ commands which should be mentioned:
+\begin{decl*}
+ |\input| \meta{file name}\\
+ |\bye|
+\end{decl*}
+|\input| followed by a \meta{file name} (\emph{without} braces around)
+is the recommended way of inputting a \fontinst command file, or the
+\fontinst package itself (\texttt{fontinst.sty},
+\texttt{finstmsc.sty}, etc.). This is the only way to make things work
+regardless of whether the underlying format is \LaTeX, Plain\TeX, or
+even a raw Ini\TeX.
+
+|\bye| is the command to use to terminate a \fontinst command file.
+
+
+
+
+
+\section{Encoding files}
+
+An \emph{encoding file} (or \texttt{.etx} file) is a \TeX\ document
+with the structure:
+\begin{quote}
+ |\relax|\\
+ \meta{ignored material}\\
+ |\encoding|\\
+ \meta{encoding commands}\\
+ |\endencoding|\\
+ \meta{ignored material}
+\end{quote}
+This describes the encoding of a font, using the \m{encoding commands}.
+
+Since the encoding file ignores any material between \verb|\relax| and
+\verb|\encoding|, an \emph{encoding file} can also be a \LaTeX\
+document. The structure is then
+\begin{quote}
+ |\relax|\\
+ |\documentclass{article} %| Or some other class\\
+ |\usepackage{fontdoc}|\\
+ \meta{\LaTeX\ preamble}\\
+ |\begin{document}|\\
+ \meta{\LaTeX\ text}\\
+ |\encoding|\\
+ \m{encoding commands}\\
+ |\endencoding|\\
+ \meta{\LaTeX\ text}\\
+ |\end{document}|
+\end{quote}
+
+
+See also the descriptions in \emph{Writing ETX format font encoding
+specifications} (\texttt{encspecs.tex}).
+
+
+\subsection{Encoding commands}
+
+The \m{encoding commands} are:
+
+\begin{decl}
+ |\nextslot|\arg{integer expression}
+\end{decl}
+Sets the number of the next slot. If there is no \verb|\nextslot|
+command, the number is the successor of the previous slot. Immediately
+after |\encoding|, the next slot number is $0$.
+
+\begin{decl}[v1.8]
+ |\skipslots|\arg{integer expressions}
+\end{decl}
+Advances the number of the next slot.
+
+\begin{decl}
+ |\setslot|\arg{glyph} \m{slot commands} |\endsetslot|
+\end{decl}
+Assigns \m{glyph} to the current slot. The \m{slot commands} can be
+used to specify additional behaviour for the slot, and typically also
+contains comments about the glyph.
+
+\begin{decl}[v1.9]
+ |\setleftboundary|\marg{glyph} \m{slot commands}
+ |\endsetleftboundary|
+\end{decl}
+Makes the beginning of a word (left boundary) behave like the right
+side of \m{glyph} with respect to kerning. |\ligature| commands in
+the \meta{slot commands} create beginning of word ligatures.
+
+\begin{decl}[v1.9]
+ |\setrightboundary|\marg{glyph}
+\end{decl}
+Makes the end of a word (right boundary) behave like the left
+side of \m{glyph} with respect to kerning and ligatures. The current
+slot position is left empty.
+
+\begin{decl}
+ |\inputetx|\arg{file}
+\end{decl}
+Inputs the \m{encoding commands} of \m{file}\texttt{.etx}.
+
+\begin{decl}[v1.917]
+ |\setfontdimen|\marg{fontdimen no.}\marg{integer variable}
+\end{decl}
+Sets up a correspondence between a font dimension and an integer
+variable. When generating a font, the font dimension value is taken
+from the integer variable. When converting a font from \pl or \vpl
+format, the fontdimen value will be recorded as a |\setint| command
+for the variable.
+
+\begin{decl}[v1.924]
+ |\ifdirect|
+\end{decl}
+Encoding files set up a correspondence between slot numbers and glyph
+names, which can be used in two different ways. In the \emph{direct}
+mode, encoding files map slot numbers to glyph names. In the
+\emph{inverse} mode, glyph names are mapped to slot numbers. The
+inverse mapping can in general be one-to-many, and when precisely one
+target slot is needed \fontinst chooses that arbitrarily. The |\ifdirect|
+conditional can be used to disambiguate the inverse mapping, by
+conditionalising all undesired |\setslot|s on that the file is being
+interpreted in the direct mode. For example:
+\begin{verbatim}
+ \ifdirect
+ \setslot{hyphen}
+ \comment{Soft hyphen slot}
+ \endsetslot
+ \Else
+ \skipslots{1}
+ \Fi
+\end{verbatim}
+
+Currently the only case in which encoding files are being read in
+the inverse mode is when reencoding fonts.
+
+\begin{decl}[v1.8]
+ |\setslotcomment|\marg{text}\\
+ |\resetslotcomment|\marg{text}\\
+ |\unsetslotcomment|
+\end{decl}
+These commands can be used to specify an automatic |\comment| text
+for all slots. They are ignored by \fontinst, but interpreted by
+\fontdoc.
+
+\begin{decl}[v1.8]
+ |\useexamplefont|\marg{font}
+\end{decl}
+This command is ignored by \fontinst. In \fontdoc it sets the font
+that is used by the |\slotexample| command. The \meta{font} argument
+has the same syntax for a font as the \TeX\ primitive |\font|.
+
+
+
+
+\subsection{Slot commands}
+
+The \m{slot commands} are:
+
+\begin{decl}
+ |\comment|\arg{text}
+\end{decl}
+A comment, which is ignored by \fontinst, but typeset as a separate
+paragraph by \fontdoc.
+
+\begin{decl}[v1.917]
+ |\label|\arg{text}
+\end{decl}
+A reference label (like in \LaTeX), which records the slot number and
+glyph name. Ignored by \fontinst.
+
+\begin{decl}
+ |\ligature|\arg{ligtype}\arg{glyph1}\arg{glyph2}
+\end{decl}
+|\ligature| declares a ligature of type \m{ligtype}, which will take
+effect if the current glyph is immediately followed by \meta{glyph1}
+when \TeX\ is constructing a list of horizontal material. This
+ligature will then replace the two glyphs by the third glyph
+\meta{glyph2}. For example:
+\begin{verbatim}
+ \setslot{ff}
+ \comment{The `ff' ligature.}
+ \ligature{LIG}{i}{ffi}
+ \ligature{LIG}{l}{ffl}
+ \endsetslot
+\end{verbatim}
+declares one ligature \(\texttt{ff}*\texttt{i} \longrightarrow
+\texttt{ffi}\) and one ligature \(\texttt{ff}*\texttt{l}
+\longrightarrow \texttt{ffl}\).
+
+The eight \m{ligtype}s are the names of the underlying \pl
+properties, i.e.,:
+\begin{quote}
+ \texttt{LIG}\hfil
+ \texttt{/LIG}\hfil
+ \texttt{/LIG>}\hfil
+ \texttt{LIG/}\hfil
+ \texttt{LIG/>}\hfil
+ \texttt{/LIG/}\hfil
+ \texttt{/LIG/>}\hfil
+ \texttt{/LIG/>>}
+\end{quote}
+The basic \texttt{LIG} may be immediately preceded or followed by a
+slash, and then immediately followed by \texttt{>} characters not
+exceeding the number of slashes. The slashes specify retention of the
+left or right original glyph; the \texttt{>} signs specify passing
+over that many glyphs of the result without further ligature or kern
+processing.
+
+\begin{decl}[v1.918]
+ |\Ligature|\arg{ligtype}\arg{glyph}\arg{glyph}\\
+ |\oddligature|\marg{note}\arg{ligtype}\arg{glyph}\arg{glyph}
+\end{decl}
+The |\Ligature| command is by default a synonym of |\ligature| (but
+\fontdoc may typeset them differently). The |\oddligature| command is
+by default ignored by \fontinst. See \setfilename{encspecs.tex} for
+an explanation of the semantic differences.
+
+\begin{decl}
+ |\makerightboundary|\arg{glyph}
+\end{decl}
+This makes the current slot the end of word (right boundary) marker
+with respect to ligatures and kerning, i.e., \TeX\ will kern and
+ligature as if there was an invisible occurrence of this character
+after the last character of every word. All kerns and ligatures with
+\meta{glyph} as the right part will apply for this slot.
+
+It is preferable to use |\setrightboundary| to control end of word
+behaviour if you have an empty slot to spare.
+
+\begin{decl}
+ |\Unicode|\marg{code point}\marg{name}\\
+ |\charseq|\marg{\cs{Unicode} commands}
+\end{decl}
+These commands declare a Unicode character or character sequence as
+possible interpretations of what is in this slot. They are ignored
+when making fonts, but \fontdoc give them a prominent role in
+encoding specifications and to |\etxtocmap| they are the primary
+properties of the slot.
+
+\begin{decl}[Obsolete?!]
+ |\usedas|\arg{type}\arg{control sequence}
+\end{decl}
+This command declares a \TeX\ control sequence for this slot, with
+the \emph{type} taken from:
+\begin{verbatim}
+ char accent mathord
+ mathbin mathrel mathopen
+ mathclose mathpunct mathvariable
+ mathaccent mathdelim
+\end{verbatim}
+There is currently no code in \fontinst which makes any use of this
+command. It might in principle be possible to autogenerate \LaTeX\
+output encoding definition (\meta{enc}\texttt{enc.def}) files and
+math symbol declarations from this information.
+
+\begin{decl}
+ |\nextlarger|\arg{glyph}
+\end{decl}
+Math font property: makes \meta{glyph} the \textsc{nextlarger} entry
+of the current slot.
+
+\begin{decl}
+ |\varchar|
+ \m{varchar commands}
+ |\endvarchar|
+\end{decl}
+Math font property: sets the \textsc{varchar} entry for the current
+slot, using the \m{varchar commands}. The possible \m{varchar
+commands} are:
+\begin{decl*}
+ |\vartop|\arg{glyph}\\
+ |\varmid|\arg{glyph}\\
+ |\varbot|\arg{glyph}\\
+ |\varrep|\arg{glyph}
+\end{decl*}
+Sets the top, middle, bottom, or repeated \m{glyph} of the
+\textsc{varchar}.
+
+
+\subsection{Other}
+
+\begin{decl}[v1.9]
+ |\ifisinslot|\marg{glyph}\marg{slot}|\then|
+\end{decl}
+During \vpl\slash\pl generation, this conditional tests whether glyph
+\meta{glyph} (a string expression) is put in the slot \meta{slot} (an
+integer expression). Since encoding files are normally read several
+times in that context, the exact behaviour of this command is a bit
+uncertain. It was intended to support collecting additional
+information about the fonts being generated, but at the time of
+writing this is probably only of academic interest.
+
+
+\begin{decl}[v1.931]
+ |\declarepsencoding|\marg{etx-name}\marg{PS-encoding-name}%
+ \marg{action}
+\end{decl}
+This command is placed in \etx files generated by |\enctoetx|, and has
+the same syntax as in a mapmaking command file (see
+Subsection~\ref{Ssec:MapConfig}). It records information about the
+source encoding file to assist the map file writer, but is mostly
+ignored by main \fontinst.
+
+
+
+
+\section{Metric files}
+\label{Sec:Metric}
+
+
+A \emph{metric file} (or \mtx file) is a \TeX\ document with the
+structure:
+\begin{quote}
+ |\relax|\\
+ \emph{ignored material}\\
+ |\metrics|\\
+ \m{metric commands}\\
+ |\endmetrics|\\
+ \emph{ignored material}
+\end{quote}
+This describes the glyphs in a font, using the \m{metric commands}.
+Like encoding files, metric files can simultaneously be \LaTeX\
+documents.
+
+Metric files are usually either \emph{hand-crafted} or
+\emph{transformable}. The transformable metric files typically encode
+the metrics of one particular font and are automatically generated.
+Hand-crafted metric files (such as \setfilename{latin.mtx}) typically
+do not contain much explicit metric data, instead the code there makes
+use of metrics previously specified by other files to construct new
+glyphs or adjust metrics to meet special conditions. Whereas
+transformable metric files tend to be mere lists of metric data, the
+hand-crafted metric files are more like programs.
+
+
+\subsection{Metric commands}
+
+The \m{metric commands} are as follows. All glyph name arguments are
+string expressions.
+
+\begin{decl}
+ |\setglyph|\arg{name} \m{glyph commands} |\endsetglyph|
+\end{decl}
+If the glyph called \m{name} is undefined, it is built using the
+\m{glyph commands}, for example:
+\begin{verbatim}
+ \setglyph{IJ}
+ \glyph{I}{1000}
+ \glyph{J}{1000}
+ \endsetglyph
+
+ \setglyph{Asmall}
+ \glyph{A}{850}
+ \endsetglyph
+\end{verbatim}
+The \meta{glyph commands} are not executed if the glyph has already
+been set.
+
+\begin{decl}
+ |\resetglyph|\arg{name}
+ \m{glyph commands}
+ |\endresetglyph|
+\end{decl}
+This builds a glyph using the \m{glyph commands}, and defines
+(at~|\endresetglyph|) \meta{name} to be that glyph, regardless of
+whether that glyph was already defined.
+
+\begin{decl}
+ |\unsetglyph|\arg{name}
+\end{decl}
+Makes the glyph called \m{name} undefined.
+
+\begin{decl}
+ |\setrawglyph|\arg{name}\arg{font}\arg{dimen}\arg{slot}\\
+ \hspace*{1.5em}\arg{width}\arg{height}\arg{depth}\arg{italic
+ correction}\\
+ |\setscaledrawglyph|%
+ \arg{name}\arg{font}\arg{dimen}\arg{scale}\arg{slot}\\
+ \hspace*{1.5em}\arg{width}\arg{height}\arg{depth}\arg{italic
+ correction}
+\end{decl}
+These commands will usually be
+generated automatically from an \afm or \pl file.
+If the glyph \meta{name} is undefined, then this sets it to be that
+which is found in slot \meta{slot} of font \meta{font}. The
+\meta{width}, \meta{height}, \meta{depth}, and \meta{italic} are
+saved away as the width, height, depth and italic correction
+respectively of the glyph.
+
+The \meta{scale} is a scaling factor which has been applied to the
+font to give it the specified metrics.
+If the integer variable \texttt{rawscale} is set, another scaling by
+that amount will be applied to the glyph (this is how the |scaled|
+keyword in |\installfont| metrics-lists take effect).
+
+The \meta{dimen} is the nominal \emph{design size} of the \meta{font},
+usually |10pt|; this information isn't really needed for anything, but
+the \vf format requires it to be specified and match what is in
+\meta{font}\setfilename{.tfm}, so a \dvi driver is allowed to error
+out on us if we don't get this value right.
+
+
+\begin{decl}
+ |\setnotglyph|\arg{name}\arg{font}\arg{dimen}\arg{slot}\\
+ \hspace*{1.5em}\arg{width}\arg{height}\arg{depth}\arg{italic
+ correction}\\
+ |\setscalednotglyph|%
+ \arg{name}\arg{font}\arg{dimen}\arg{scale}\arg{slot}\\
+ \hspace*{1.5em}\arg{width}\arg{height}\arg{depth}\arg{italic
+ correction}
+\end{decl}
+These set a glyph called \m{name}\texttt{-not} (if that wasn't set
+already) to have the specified width, height, depth, and italic
+correction but be invisible in print.
+
+Such commands are usually generated automatically from an \afm file,
+when a glyph is present in the \m{font} but is not in the default
+encoding. They take the same arguments as |\setrawglyph| and
+|\setscaledrawglyph| respectively (although the \meta{slot} will
+normally be |-1|), because
+reencoding a font can turn |\setrawglyph| commands into
+|\setnotglyph| commands and vice versa.
+
+
+\begin{decl}
+ |\inputmtx|\arg{file}
+\end{decl}
+Inputs the \m{metric commands} of \m{file}\texttt{.mtx}.
+
+\begin{decl}[v1.9]
+ |\usemtxpackage|\marg{package~list}\\
+ |\ProvidesMtxPackage|\marg{package~name}
+\end{decl}
+|\usemtxpackage| behaves like |\inputmtx|, but it will only input a
+file if no |\ProvidesMtxPackage| for that file has been issued. By
+putting a |\ProvidesMtxPackage| in an \mtx file one can |use| it in
+several places without having to worry about it being sourced more
+than once.
+
+\begin{hackernote}
+ |\ProvidesMtxPackage| declarations make local assignments, so the
+ package is forgotten when the current group ends. In particular, the
+ settings made with |\ProvidesMtxPackage| are forgotten when the
+ current glyph base is flushed.
+\end{hackernote}
+
+
+
+\subsection{Glyph commands}
+
+The \m{glyph commands} add material to the glyph currently being
+constructed in a |\setglyph| \dots\ |\endsetglyph| or
+|\resetglyph| \dots\ |\endresetglyph|. They are:
+
+\begin{decl}
+ |\glyph|\arg{glyph}\arg{integer expression}
+\end{decl}
+Sets the named glyph \m{glyph} at the given scale, with 1000 as the
+natural size. This:
+\begin{itemize}
+ \item
+ Advances the current glyph width.
+ \item
+ Sets the current glyph height to be at least the height of the
+ named glyph, adjusted for the current vertical offset.
+ \item
+ Sets the current glyph depth to be at least the depth of the
+ named glyph, adjusted for the current vertical offset.
+ \item
+ Sets the current glyph italic correction to be the same as the
+ set glyph.
+\end{itemize}
+The named glyph must have already been defined, otherwise an error
+will occur. For example:
+\begin{verbatim}
+ \setglyph{fi}
+ \glyph{f}{1000}
+ \glyph{i}{1000}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\glyphrule|\arg{integer expression}\arg{integer expression}
+\end{decl}
+Sets a rule of the given width and height, for example:
+\begin{verbatim}
+ \setglyph{underline}
+ \glyphrule{333}{40}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\glyphspecial|\arg{string expression}
+\end{decl}
+Sets a driver-dependent \verb|\special|, for example:
+\begin{verbatim}
+ \setglyph{crest}
+ \glyphspecial{Filename: crest.eps}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\glyphwarning|\arg{string expression}
+\end{decl}
+Sets a warning \verb|\special|, and produces a warning message each
+time the glyph is used, for example:
+\begin{verbatim}
+ \setglyph{missingglyph}
+ \glyphrule{500}{500}
+ \glyphwarning{Missing glyph `missingglyph'}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\movert|\arg{integer expression}
+\end{decl}
+Moves right by the given amount, and advances the current glyph width,
+for example:
+\begin{verbatim}
+ \setglyph{Asmall}
+ \movert{50}
+ \glyph{A}{700}
+ \movert{50}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\moveup|\arg{integer expression}
+\end{decl}
+Moves up by the given amount, and advances the current vertical
+offset. Each glyph should always end at vertical offset zero, for
+example:
+\begin{verbatim}
+ \setglyph{onehalf}
+ \moveup{500}
+ \glyph{one}{700}
+ \moveup{-500}
+ \glyph{slash}{1000}
+ \moveup{-200}
+ \glyph{two}{700}
+ \moveup{200}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\push| \m{glyph commands} |\pop|
+\end{decl}
+Performs the \m{glyph commands}, but at the |\pop| the current
+position and glyph width are restored to what they were at the |\push|,
+for example:
+\begin{verbatim}
+ \setglyph{aacute}
+ \push
+ \movert{\half{\sub{\width{a}}{\width{acute}}}}
+ \glyph{acute}{1000}
+ \pop
+ \glyph{a}{1000}
+ \endsetglyph
+\end{verbatim}
+
+\begin{decl}
+ |\glyphpcc|\arg{glyph}\arg{integer expression}\arg{integer expression}
+\end{decl}
+This is generated from \texttt{PCC} instructions in an \afm file, and
+is syntactic sugar for:
+\begin{quote}
+ \small
+ |\push|\\
+ |\movert|\arg{first integer expression}\\
+ |\moveup|\arg{second integer expression}\\
+ |\glyph|\arg{glyph}|{1000}|\\
+ |\pop|
+\end{quote}
+
+\begin{decl}
+ |\resetwidth|\arg{integer expression}\\
+ |\resetheight|\arg{integer expression}\\
+ |\resetdepth|\arg{integer expression}\\
+ |\resetitalic|\arg{integer expression}
+\end{decl}
+Sets the width, height, depth, or italic correction of the current
+glyph.
+
+\begin{decl}
+ |\samesize|\arg{glyph}
+\end{decl}
+Sets the dimensions of the current glyph to be the same as \m{glyph}.
+
+\bigskip
+
+Inside a |\setglyph| definition of \m{glyph}, you can use expressions
+such as |\width|\arg{glyph} to refer to the glyph defined so far.
+For example, a display summation sign can be defined to be a text
+summation $\sum$ scaled 120\% with 0.5\,pt extra height and depth
+using:
+\begin{verbatim}
+ \setglyph{summationdisplay}
+ \glyph{summationtext}{1200}
+ \resetheight{\add{\height{summationdisplay}}{50}}
+ \resetdepth{\add{\depth{summationdisplay}}{50}}
+ \endsetglyph
+\end{verbatim}
+Within a |\resetglyph|, these expressions will refer to the previous
+definition of the glyph. For example, you can add sidebearings to the
+letter `A' with:
+\begin{verbatim}
+ \resetglyph{A}
+ \movert{25}
+ \glyph{A}{1000}
+ \movert{25}
+ \endresetglyph
+\end{verbatim}
+
+
+\subsection{Kerning commands}
+
+The kerning commands may be used anywhere in a metrics file.
+
+\begin{decl}
+ |\setkern|\arg{glyph}\arg{glyph}\arg{integer expression}
+\end{decl}
+This sets a kern between the two glyphs, scaled by the current
+value of \texttt{rawscale}, unless such a kern already has been set.
+
+\begin{decl}[v1.9]
+ |\resetkern|\arg{glyph}\arg{glyph}\arg{integer expression}
+\end{decl}
+|\resetkern| unconditionally sets a kern between the two glyphs,
+scaled by the current value of \texttt{rawscale}.
+
+\begin{decl}
+ |\setleftkerning|\arg{glyph}\arg{glyph}\arg{integer expression}\\
+ |\setrightkerning|\arg{glyph}\arg{glyph}\arg{integer expression}
+\end{decl}
+Sets the amount by which the first glyph should mimic how the second
+glyph kerns on the left or right, for example:
+\begin{verbatim}
+ \setleftkerning{Asmall}{A}{850}
+ \setrightkerning{Asmall}{A}{850}
+ \setleftkerning{IJ}{I}{1000}
+ \setrightkerning{IJ}{J}{1000}
+\end{verbatim}
+The commands work by copying kerning pairs containing the first glyph.
+As the names indicates, these commands do not override kerning pairs
+previously set.
+
+\begin{decl}[v1.8]
+ |\setleftrightkerning|\arg{glyph}\arg{glyph}\arg{integer expression}
+\end{decl}
+Sets the amount by which the first glyph should mimic how the second
+glyph kerns on both sides, for example:
+\begin{verbatim}
+ \setleftrightkerning{Asmall}{A}{850}
+\end{verbatim}
+This command is equivalent to doing first a |\setleftkerning| and
+then a |\setrightkerning|.
+
+\begin{decl}[v1.906]
+ |\noleftkerning|\arg{glyph}\\
+ |\norightkerning|\arg{glyph}\\
+ |\noleftrightkerning|\arg{glyph}
+\end{decl}
+Removes all kerning on the specified side(s) of the \meta{glyph}.
+
+\begin{decl}[v1.9]
+ |\unsetkerns|\marg{left~glyph~list}\marg{right~glyph~list}
+\end{decl}
+Removes all kerns with one glyph in the \meta{left glyph list} on the
+left and one glyph in the \meta{right glyph list} on the right.
+
+
+
+\subsection{Other}
+
+\begin{decl}[v1.915]
+ |\aliased|\marg{font's name}\marg{alias name}
+\end{decl}
+This command, which syntactically counts as a \meta{string
+expression}, is meant to be used in glyph name arguments of commands
+one may find in metric files. It was added to support combining
+mapfile entry generation with a custom form of reglyphing that has
+been developed for the \texttt{T2} bundle (Cyrillic font support).
+This does however not necessarily mean that the \texttt{T2} bundle
+has been updated to take advantage of this feature.
+
+The basic problem is that cyrillic fonts display a much greater
+variation in how the glyphs are named than latin fonts do.%
+\footnote{The Adobe guidelines have not been as prevailing here as
+in the latin range, but this isn't entirely surprising when they
+give opaque suggestions such as using the name \texttt{afii10018}
+for \texttt{U+0411} (\textsc{cyrillic capital letter be}). The
+suggestion made some sense though; AFII (Association for Font
+Information Interchange) maintained a glyph registry.}
+This complicates writing files similar to \setfilename{latin.mtx}, so
+the author of the \texttt{T2} bundle took the route to regularize the
+glyph names at the \afm to \mtx conversion step. Since \TeX\ does not
+know anything about glyph names, this makes no difference for the
+virtual fonts that are built.
+The glyph names do however make a difference for base fonts that are
+reencoded, since \PS encoding vectors list explicit glyph names that
+have to be the same as in the font. \Fontinst's choice of encoding
+vector for a mapfile entry is based on which \etx file was used in the
+reencoding, and hence the glyph names used when reencoding must match
+those actually used in the font, or problems will follow.
+
+The |\aliased| command can be used to preserve the information
+necessary for such reencodings. If a glyph name is specified as for
+example
+\begin{verbatim}
+ \aliased{afii10018}{CYRB}
+\end{verbatim}
+then \fontinst will behave as if the glyph name is \texttt{CYRB}
+(i.e., the \meta{alias name}) for all purposes \emph{except}
+reencoding, where instead \fontinst behaves as if the glyph name is
+the \meta{font's name} \texttt{afii10018}. This makes it possible to
+use \etx files when reencoding which can be correctly translated to
+the right encoding vectors.
+
+
+\begin{decl}[v1.931]
+ |\providepsencoding|\marg{etx}\marg{postscript name}\marg{action}
+\end{decl}
+If this command occurs in an \mtx file then it was placed there by a
+|\declare|\-|ps|\-|encoding| in an \etx file that was used to
+reencode this \mtx. It is meant for consumption by the mapfile writer,
+and is ignored by main \fontinst.
+
+
+
+\section{\textsf{fontdoc} commands}
+
+The following commands are defined by \fontdoc but are unknown to
+\fontinst.
+
+
+\subsection{Comment commands}
+
+\begin{decl}
+ |\plaindiv|\\
+ |\plainint|\\
+ |\plainmax|\\
+ |\plainmin|\\
+ |\plainneg|
+\end{decl}
+These are the \LaTeX\ definitions of |\div|, |\int|, |\max|, |\min|,
+and |\neg| respectively. They are provided under these names because
+\fontinst uses the normal names for integer expression constructions.
+
+\begin{decl}[v1.8]
+ |\slotexample|
+\end{decl}
+This typesets the character in the current slot from the example font
+(cf.~|\use|\-|example|\-|font|).
+
+\begin{decl}[v1.916]
+ |\macroparameter|\marg{digit}
+\end{decl}
+This can be used in integer and string expressions. It typesets as
+\textit{\#n}, where `\textit{n}' is the \meta{digit}.
+
+\begin{decl}[v1.918]
+ |\textunicode|\marg{code point}\marg{name}
+\end{decl}
+This generates a reference to a particular Unicode character, for use
+within a |\comment| or similar.
+
+
+\subsection{Style control commands}
+
+\begin{decl}[v1.909]
+ |\showbranches|
+\end{decl}
+The is the main switch that turns on displaying both branches of
+\fontinst conditionals. If you use this command in an encoding or
+metrics file, you \textbf{must} use |\Else| and |\Fi| to delimit the
+conditionals in that file. If you do not use this command in an
+encoding or metrics file, then the conditionals will not generate any
+typeset material and neither will their \meta{else branch}es.
+
+
+
+
+\section{\fontinst variables}
+\label{Sec:Variables}
+
+The following is a list of the \fontinst variables that are
+accessible for the user through the |\set|\textellipsis,
+|\reset|\textellipsis, |\unset|\textellipsis, etc.\ commands. You may
+of course set or use other variables in the \mtx and \etx files you
+write yourself, as does for example the standard \mtx file
+\texttt{latin.mtx}, but all variables that \fontinst commands
+implicitly use or set are listed below.
+
+% \begin{list}{}{%
+% \setlength\labelwidth{0pt}%
+% \setlength\itemindent{-\leftmargin}%
+% \setlength\parsep{0pt}
+% \def\makelabel#1{\hspace\labelsep \normalfont\ttfamily #1}%
+% }
+\begin{itemize}
+ \item[acccapheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The height of accented full capitals.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[address] (string)
+ \begin{smalldes}
+ \item[Description] Snailmail address put in \BibTeX-style file
+ header of automatically generated \enc files. No
+ \texttt{address} field is written unless the \texttt{address}
+ string is set. Quotes are not automatically inserted around
+ the \texttt{address} string.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-\enc converter.
+ \end{smalldes}
+ \item[afm-name] (string)
+ \begin{smalldes}
+ \item[Description] Name of source font. Internal variable.
+ \item[Set by] |\from|\dots\ commands.
+ \item[Used by] The |\transform|\-|font|, |\install|\-|font|,
+ |\install|\-|raw|\-|font|, and |\reglyph|\-|font| commands.
+ \end{smalldes}
+ \item[ascender] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The ascender height of the font.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this integer.
+ \item[Used by] Some \mtx and \etx files.
+ \end{smalldes}
+ \item[author] (string)
+ \begin{smalldes}
+ \item[Description] Author name(s) put in \BibTeX-style file
+ header of automatically generated \enc files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-\enc converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[\cs{autoinstallfamily}] (command)
+ \begin{smalldes}
+ \item[Description] Command called by the font installation
+ commands, as
+ \begin{quote}
+ |\autoinstallfamily|\marg{encoding}\marg{family}
+ \end{quote}
+ when they are asked to install a font with a combination of
+ \meta{encoding} and \meta{family} that has not been seen
+ before (there was no explicit |\installfamily|).
+ \item[Set by] Explicit commands. Defaults to calling
+ |\installfamily|.
+ \item[Used by] Font installation commands.
+ \end{smalldes}
+ \item[axisheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{22}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[baselineskip] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The font designer's recommendation for natural length of the
+ \TeX\ parameter |\baselineskip|.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[bigopspacing1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{9}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[bigopspacing2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{10}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[bigopspacing3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{11}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[bigopspacing4] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{12}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[bigopspacing5] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{13}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[capheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The height of the font's full capitals.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some \mtx and \etx files.
+ \end{smalldes}
+ \item[cmapname] (string)
+ \begin{smalldes}
+ \item[Description] The name given to the CMap generated from
+ an \etx file.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-CMap converter. When not set, the
+ value |fontinst-|\nolinebreak[1]\meta{cmap file name} is
+ used instead.
+ \end{smalldes}
+ \item[codingscheme] (string)
+ \begin{smalldes}
+ \item[Description] The codingscheme name.
+ \item[Set by] \etx files.
+ \item[Used by] The \cvpl writer. When not set, the
+ value \texttt{UNKNOWN} is used instead.
+ \end{smalldes}
+ \item[defaultrulethickness] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{8}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[delim1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{20}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[delim2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{21}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[denom1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{11}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[denom2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{12}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[descender] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The depth of lower case letters with descenders.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[descender\_neg] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The vertical position of the descender line
+ of the font, i.e., the negative of the font's descender depth.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some \mtx and \etx files.
+ \end{smalldes}
+ \item[designsize] (dimension)
+ \begin{smalldes}
+ \item[Description] The design size of the font.
+ \item[Set by] \mtx files. The \cvpl-to-\mtx converter usually writes
+ |\setdim| commands for this variable.
+ \item[Used by] The \cvpl writer. The design size defaults to
+ $10\,\mathrm{pt}$ if this variable is not set.
+ \item[Note] The value of this variable has no effect on how
+ the font is declared to \LaTeX.
+ \end{smalldes}
+ \item[designunits] (dimension denoting a real number)
+ \begin{smalldes}
+ \item[Description] The design size of a font expressed in the
+ design unit used in a \cvpl file.
+ \item[Set by] \mtx files. The \cvpl-to-\mtx converter usually writes
+ |\setdim| commands for this variable.
+ \item[Used by] Nothing. If this variable is set, but to any
+ value other than $1\,\mathrm{pt}$, then some metrics are most
+ likely wrong.
+ \end{smalldes}
+ \item[digitwidth] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The median width of the digits in the font.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[email] (string)
+ \begin{smalldes}
+ \item[Description] Email address put in \BibTeX-style file
+ header of automatically generated \enc files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-\enc converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[encodingname] (string)
+ \begin{smalldes}
+ \item[Description] The name by which the encoding in question is
+ made known to a Postscript interpreter.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-\enc converter. When not set, the
+ value |fontinst-|\nolinebreak[1]|autoenc-|\nolinebreak[1]%
+ \meta{etx name} is used instead.
+ \end{smalldes}
+ \item[etx-name] (string)
+ \begin{smalldes}
+ \item[Description] Name of \etx file. Internal variable in
+ |\transform|\-|font|.
+ \item[Set by] The |\reencodefont| command.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[extraspace] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The natural width of extra interword glue at the end of a
+ sentence.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[fontdimen($n$)] (integer)
+ \begin{smalldes}
+ \item[Description] Family of semi-internal variables that store
+ the values to use for font dimension $n$. It is preferred
+ that the newer |\set|\-|font|\-|dimen| interface is used for
+ setting these values.
+ \item[Set by] \etx files.
+ \item[Used by] The \cvpl writer.
+ \end{smalldes}
+ \item[\cs{iftokeep}] (macro)
+ \begin{smalldes}
+ \item[Description] |\iftokeep|\,\#1\,|\then|, where \#1 will
+ be a \meta{number}, behaves like a switch and decides whether
+ a glyph is kept or not while reglyphing.
+ \item[Set by] Explicit commands. Defaults to
+ $$
+ \mbox{\cs{iftokeep}\,\#1\,\cs{then}} \mapsto
+ \mbox{\cs{ifnum}\,\texttt{-1<}\#1}
+ $$
+ \item[Used by] The |\reglyphfont| command.
+ \end{smalldes}
+ \item[interword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The natural width of interword glue (spaces).
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[italicslant] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] The italic slant of a font.
+ \item[Set by] \mtx files generated from \afm or \cvpl files. \mtx
+ files generated by |\transformfont|. Locally in the \afm-to-\mtx
+ converter for possible use in |\uprightitalcorr| or
+ |\slanteditalcorr|.
+ \item[Used by] \mtx files (\texttt{latin.mtx} and the like). \etx
+ files (for determining \texttt{fontdimen(1)}).
+ \end{smalldes}
+ \item[killweight] (integer)
+ \begin{smalldes}
+ \item[Description] Weight for glyphs that are killed.
+ \item[Set by] Explicit commands. Defaults to $-10$ if not set.
+ \item[Used by] The |\kill|\-|glyph| command; indirectly
+ the |\reglyphfont| command.
+ \end{smalldes}
+ \item[letterspacing] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Extra width added to all glyphs of a font.
+ \item[Set by] \mtx (preferred) or \etx files.
+ \item[Used by] The \cvpl writer. Defaults to $0$ if not set.
+ \end{smalldes}
+ \item[maxdepth] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The maximal depth over all slots in the font.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[maxdepth\_neg] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The negative of the maximal depth of a glyph in
+ the font.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[maxheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The maximal height of a glyph in the font.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[minimumkern] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Kerns whose size in absolute value is less
+ than or equal to this variable are ignored.
+ \item[Set by] Command files or \mtx files.
+ \item[Used by] The \afm-to-\mtx converter and the \cvpl file
+ generator. When not set, the value $0$ is used instead.
+ \end{smalldes}
+ \item[monowidth] (flag integer)
+ \begin{smalldes}
+ \item[Description] Set if this font is monowidth, unset otherwise.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter writes a
+ |\setint| command for this variable if the \afm specifies
+ \texttt{IsFixedPitch true}.
+ \item[Used by] Some \mtx files (\texttt{latin.mtx} and the like),
+ \etx files.
+ \end{smalldes}
+ \item[num1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{8}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[num2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{9}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[num3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{10}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[quad] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The quad width of the font, normally approximately equal to
+ the font size and\slash or the width of an `M'.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \item[Note]
+ It is the quad width in the symbol math font (family~|2|)
+ that \TeX\ uses as reference when translating |mu|s to
+ ordinary lengths. Hence that quad can be considered a math
+ font designer's scaling factor for |mu|.
+ \end{smalldes}
+ \item[PSfontsuffix] (string)
+ \begin{smalldes}
+ \item[Description] Suffix added to font names to form name of
+ file to download to include font.
+ \item[Set by] Explicit commands in mapmaking command
+ files. Defaults to `\texttt{.pfa}'.
+ \item[Used by] The map file fragments writer.
+ \end{smalldes}
+ \item[rawscale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Scaling factor applied to raw glyphs.
+ \item[Set by] The |\installfont| command (\texttt{scaled}
+ clauses in argument \#2). Unset for metric files listed
+ without a \texttt{scaled} clause.
+ \item[Used by] The |\set|\-|raw|\-|glyph|,
+ |\set|\-|not|\-|glyph|, |\set|\-|scaled|\-|raw|\-|glyph|,
+ |\set|\-|scaled|\-|not|\-|glyph|, |\set|\-|kern|, and
+ |\reset|\-|kern| commands.
+ \end{smalldes}
+ \item[renameweight] (integer)
+ \begin{smalldes}
+ \item[Description] Weight for glyphs that are renamed.
+ \item[Set by] Explicit commands. Defaults to $1$ if not set.
+ \item[Used by] The |\rename|\-|glyph| command; indirectly
+ the |\reglyphfont| command.
+ \end{smalldes}
+ \item[requireglyphs] (flag integer)
+ \begin{smalldes}
+ \item[Description] Set if warnings are to be generated for
+ glyphs listed in \etx files but not present in the glyph
+ base.
+ \item[Set by] Explicit commands. By default not set.
+ \item[Used by] The \cvpl file generator.
+ \end{smalldes}
+ \item[rightboundary] (string)
+ \begin{smalldes}
+ \item[Description] The name of a glyph with the property that
+ kerns on the left may be intended as right word boundary kerns.
+ \item[Set by] \mtx files. The \cvpl-to-\mtx converter can write
+ |\setstr| commands for this variable.
+ \item[Used by] Some \mtx files.
+ \end{smalldes}
+ \item[shrinkword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The (finite) shrink component of interword glue.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[slant-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Factor to slant by.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\slant|\-|font|, |\xscale|\-|font|, and
+ |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[\cs{SlantAmount}] (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] Slant factor used for faking oblique shape.
+ \item[Set by] Explicit commands. Defaults to \texttt{167}.
+ \item[Used by] The |\latinfamily| command.
+ \end{smalldes}
+ \item[\cs{slanteditalcorr}]
+ (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] The integer expression used to calculate a
+ guess for the italic correction of glyphs in a font with
+ positive slant. It has the syntax
+ \begin{quote}
+ \cs{slanteditalcorr}\marg{width}\marg{left}\marg{right}%
+ \marg{bottom}\marg{top}
+ \end{quote}
+ where \meta{width} is the glyph's advance width, and the
+ remaining arguments are coordinates of sides of the glyph's
+ bounding box. The \texttt{italicslant} integer provides the
+ italic slant of the font.
+ \item[Set by] Explicit commands in \textsf{fontinst} command
+ files. Defaults to
+ $$
+ \max\{0, \mathit{right}-\mathit{width}\}.
+ $$
+ \item[Used by] The \afm-to-\mtx converter.
+ \end{smalldes}
+ \item[stretchword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The (finite) stretch component of interword glue.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[sub1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{16}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[sub2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{17}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[subdrop] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{19}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[sup1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{13}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[sup2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{14}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[sup3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{15}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[supdrop] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{18}$.
+ \item[Set by] \mtx files.
+ \item[Used by] Some \etx and \mtx files.
+ \end{smalldes}
+ \item[TFMfileprefix] (string)
+ \begin{smalldes}
+ \item[Description] Prefix (typically a path) added to names of
+ TFM files.
+ \item[Set by] Explicit commands in mapmaking command
+ files. By default not set, which is equivalent to being empty.
+ \item[Used by] The \texttt{pltotf} ``map file fragments writer''.
+ \end{smalldes}
+ \item[underlinethickness] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The recommended thickness of an underlining
+ rule.
+ \item[Set by] \mtx files. The \afm-to-\mtx converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some \mtx files (\texttt{latin.mtx} and the like).
+ \end{smalldes}
+ \item[\cs{uprightitalcorr}]
+ (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] The integer expression used to calculate a
+ guess for the italic correction of glyphs in a font with
+ non-positive slant. It has the syntax
+ \begin{quote}
+ \cs{uprightitalcorr}\marg{width}\marg{left}\marg{right}%
+ \marg{bottom}\marg{top}
+ \end{quote}
+ where \meta{width} is the glyph's advance width, and the
+ remaining arguments are coordinates of sides of the glyph's
+ bounding box. The \texttt{italicslant} integer provides the
+ italic slant of the font.
+ \item[Set by] Explicit commands in \textsf{fontinst} command
+ files. Defaults to $0$.
+ \item[Used by] The \afm-to-\mtx converter.
+ \end{smalldes}
+ \item[version] (string)
+ \begin{smalldes}
+ \item[Description] Version number put in \BibTeX-style file
+ header of automatically generated \enc files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] \etx files.
+ \item[Used by] The \etx-to-\enc converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[verticalstem] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The dominant width of vertical stems
+ (usually the width of stems of lower case letters).
+ \item[Set by] \mtx files. The \afm-to-\mtx converter writes
+ |\setint| commands for this variable if the \afm file specifies
+ \texttt{StdVW}.
+ \item[Used by] Currently nothing.
+ \end{smalldes}
+ \item[\texttt{warningspecials}] (switch)
+ \begin{smalldes}
+ \item[Description] Controls whether |\glyphwarning| commands
+ will generate \vpl \texttt{SPECIAL}s. Defaults to `true'.
+ \item[Set by] Explicit commands (|\warningspecialstrue| and
+ |\warningspecialsfalse|).
+ \item[Used by] The \cvpl file generator.
+ \end{smalldes}
+ \item[x-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Horizontal scaling factor.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\xscale|\-|font| and |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[xheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The x-height of the font.
+ \item[Set by] \mtx files. The \afm-to-\mtx and \cvpl-to-\mtx
+ converters usually write |\setint| commands for this variable.
+ \item[Used by] \mtx files, and \etx files (for determining
+ \texttt{fontdimen(5)}).
+ \end{smalldes}
+ \item[y-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Vertical scaling factor.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\yscale|\-|font| and |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[\meta{\rmfamily glyph}-spacing] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Glyph-specific override for
+ \texttt{letterspacing}; extra width added to the glyph
+ \meta{glyph} as part of the process of writing a \vpl
+ file.
+ \item[Set by] \etx or \mtx files.
+ \item[Used by] The \cvpl writer. Defaults to $0$ if not set.
+ \end{smalldes}
+\end{itemize}
+% \end{list}
+Besides these, the |\latinfamily| command provides a whole range of
+helper macros (|\latin_weights|, |\latin_widths|, |\latin_shapes|,
+etc.) that are often used somewhat like variables. That subject
+does however deserve to be treated separately.
+
+
+
+\section{Customisation}
+
+The \fontinst package reads a file \texttt{fontinst.rc} if it
+exists. This can contain your own customisations. The catcodes that
+are in force when this file is read are the same as those selected by
+|\fontinstcc|.
+
+Similarly \texttt{finstmsc.sty} reads \texttt{finstmsc.rc} and the
+\fontdoc package reads \texttt{fontdoc.cfg}.
+
+You can create a \texttt{fontinst} format by running ini\TeX{} on
+\texttt{fontinst.sty} then saying \verb|\dump|.
+
+
+\section{Notes on features new with v\,1.9}
+
+The following notes are copied from \texttt{fisource.tex}; they were
+written to explain new \fontinst features to old \fontinst users.
+
+
+\subsection{Metric packages}
+
+\Fontinst has traditionally come with a collection of \mtx
+files that complement the \mtx files generated from base font metrics,
+in that they build glyphs that may be missing from the base fonts or
+in some other way needs to be improved. The most well-known of these
+is the \texttt{latin.mtx} file; other examples include
+\texttt{textcomp.mtx}, \texttt{mathit.mtx}, and \texttt{latinsc.mtx}.
+A problem with these is however that they cannot produce optimal
+results for all fonts simply because there are irregular differences
+in how fonts are set up by the foundries. Most glyphs come out all right,
+but there are usually a few for which the parameters used are more or
+less wrong. Therefore most high quality font installations are made
+with modified versions of these files, where the parameters have been
+tuned to the specific font design.
+
+Modifying in particular \texttt{latin.mtx} is however not an entirely
+easy task, because this is a rather large file (with plenty of
+archaic pieces of code in curious places). Doing it once is no big
+problem, but if one has to do it several times (maybe because some
+errors are discovered in the original \texttt{latin.mtx}) then it is
+probably no fun anymore. Furthermore, if one has two or three
+modified copies of this file because one has made high quality
+installations of that many different fonts then even a trivial bugfix
+might start to feel like entirely too much work.
+
+If one has to make modifications then it is usually easier to deal
+with several small files (many of which can be used unchanged) than
+one big file. Thus it would be better if these big files were split up
+into several smaller ones.
+The main problem with splitting up something like \texttt{latin.mtx}
+is that there are some commands which are defined at the top and
+which are then used in almost all sections of the file. One must make
+certain that these commands are always loaded, which makes the metric
+files somewhat harder to use (especially if the one who tries to use
+them is not the one who wrote them).
+
+One strategy is to include all definitions needed for a metric file in
+it. This has the slight disadvantage that the commands will have to be
+defined several times. What is worse however, is that the command
+definitions will appear in several files, so if one finds a bug in one
+of them, one cannot simply correct this bug in one place. As the number
+of files can soon become quite large, correcting such bugs can become
+a boring procedure indeed.
+
+Another strategy is to put all the command definitions in one file
+and then explicitly include it in the \meta{file-list} argument of
+|\installfont|. This eliminates the repeated bug fixing problem, but
+requires the user to do something that the computer can actually do
+just as well.
+
+A third strategy is to put the command definitions in one or several
+files and then in each metric file the user explicitly mentions load
+the command definitions needed for that particular file. Metric
+packages uses an improved version of this strategy, since they also
+make it possible for \fontinst to remember which packages (i.e., sets
+of command definitions) that have already been loaded, so that they
+are not unnecessarily loaded again. The \texttt{newlatin.mtx} file is
+an alternative to \texttt{latin.mtx} that implements this strategy.
+Most of the actual code is located in the following metric packages:
+\begin{center}
+\begin{tabular}{l p{0.7\linewidth}}
+ \texttt{ltcmds.mtx}& Defines some common commands used by the other
+ files.\\
+ \texttt{llbuild.mtx}& Builds the latin lower case alphabet
+ (unaccented letters are `unfakable', the rest are constructed if
+ not present in the base fonts).\\
+ \texttt{lubuild.mtx}& Builds the latin upper case alphabet.\\
+ \texttt{lsbuild.mtx}& Builds accented letters in the latin
+ smallcaps alphabet, but only if there are unaccented letters to
+ build them from in the base fonts.\\
+ \texttt{lsfake.mtx}& Fakes a latin smallcaps alphabet by shrinking
+ the upper case alphabet, but only if the glyph had not already
+ been manufactured.\\
+ \texttt{lsmisc.mtx}& Make some miscellaneous smallcaps glyphs
+ (mostly ``smallcaps f-ligatures'').\\
+ \texttt{ltpunct.mtx}& Makes digits, punctuation marks, and other
+ symbols (mostly by marking as ``unfakable'').
+\end{tabular}
+\end{center}
+\noindent All of these are easy to use as components of equivalents
+of a modified \texttt{latin.mtx} files, and all dependencies of one
+package upon another are handled via explicit |\usemtxpackage|
+commands.
+
+% For information on the syntax etcetera of commands related to metric
+% packages, see Section~\ref{Sec:Metric files}.
+
+
+\subsection{Word boundary ligatures and kerns}
+
+One of the new features added in \TeX~3 was that of ligatures and
+kerns with word boundaries. \Fontinst has had an interface
+for making such ligatures and kerns, but it has been completely
+redesigned in v\,1.9 and the old interface (setting the integer
+|boundarychar|) is no longer recognized by \fontinst. Files
+which use the old interface can still be processed with
+\texttt{cfntinst.sty}, though.
+
+Before considering the new commands, it is suitable to make a
+distinction between proper glyphs and pseudoglyphs. A proper glyph has
+been set using one of the commands |\setrawglyph|, |\setglyph|, and
+|\resetglyph|. A pseudoglyph is any name used in the context of a
+glyph name which does not denote a proper glyph. If a pseudoglyph
+|g-not| was set using the |\setnotglyph| command, then
+|\ifisglyph{g-not}\then| will evaluate to true, but something can be
+a pseudoglyph even if an |\ifisglyph| test evaluates to false. The
+interesting point about pseudoglyphs when considering word boundaries
+however, is that a pseudoglyph can have ligatures and kerns.
+
+Kerns and ligatures at the left word boundary (beginning of word) are
+specified using the commands |\setleftboundary| and
+|\endsetleftboundary|, which are syntactically identical to
+|\setslot| and |\endsetslot| respectively. One important difference is
+however that the argument to |\setslot| must be a proper glyph, while
+the argument to |\setleftboundary| may be any glyph, hence any
+pseudoglyph will do just fine.
+
+|\ligature| commands between |\setleftboundary| and
+|\endsetleftboundary| will generate beginning of word ligatures. Kerns
+on the right of the glyph specified in |\setleftboundary| will become
+beginning of word kerns.
+
+Kerns and ligatures at the right word boundary (end of word) are
+trickier, due to the asymmetrical nature of the ligkern table in a \pl
+file. What a font can do is to specify that the right word boundary,
+for purposes of kerning and ligatures, should be interpreted as
+character $n$. By including a kern or ligature with character $n$ on
+the right, that kern or ligature will be used at the end of a word,
+but it will also be used each time the next character is character
+$n$. Because of this, one usually wants the slot $n$, which the right
+word boundary is interpreted as being, to be empty whenever the
+encoding allows this.
+
+The command
+\begin{quote}
+ |\setrightboundary|\marg{glyph}
+\end{quote}
+will mark the current slot as used to denote the right word boundary,
+and leave the slot empty, increasing the current slot number by one
+just like a |\setslot| \textellipsis\ |\endsetslot| block does. Kerns on
+the left of \meta{glyph} will be end of word kerns and |\ligature|
+commands with \meta{glyph} as the second argument will be for the end
+of a word.
+
+The command
+\begin{quote}
+ |\makerightboundary|\marg{glyph}
+\end{quote}
+is similar to |\setrightboundary|, but it is a slot command which may
+only be used between a |\setslot| and the matching |\endsetslot|. Like
+|\setrightboundary|, it marks the current slot as used to denote the
+right word boundary, but the glyph specified in the enclosing |\setslot|
+will be written to that slot. Ligatures for the glyph specified by the
+|\setslot| and ligatures for the glyph specified by the
+|\makerightboundary| will both be for this single slot. Kerns on the
+right of the |\setslot| glyph and the |\makerightboundary| glyph will
+similarly both be for this single slot. The idea is that the |\setslot|
+glyph should be used when making a kern or ligature for that glyph,
+while the |\makerightboundary| glyph should be used when making a kern
+or ligature for the end of a word. \Fontinst will warn you if
+these two uses of the slot directly contradict each other.
+
+
+\subsection{Changing the names of glyphs}
+\label{Ssec:Des:Reglyph}
+
+Sometimes, primarily when making a virtual font from more than one raw
+font and two of the raw fonts contain different glyphs with the same
+name, it becomes necessary to change the names of some glyphs to make
+some sense out of it. The main source of this kind of trouble is the
+``caps and small caps'' (SC) and ``oldstyle figures'' (OsF) fonts
+within many commercial font families. The typical problem is that what
+is typographically different glyphs---such as the lowercase `a'
+(\texttt{a}, for \fontinst) and the smallcaps `\textsc{a}'
+(\texttt{Asmall}, for \fontinst)---are given the same name by
+the foundry.
+
+One way to get round this is to say for example
+\begin{quote}
+ |\setglyph{Asmall} \glyph{a}{1000} \endsetglyph|\\
+ |\setleftrightkerning{Asmall}{a}{1000}|\\
+ |\unsetglyph{a}|\\
+ |\noleftrightkerning{a}|
+\end{quote}
+and continuing like that for all the duplicate glyph names. This is
+however a rather prolix method and if the number of glyphs is large
+then it is usually simpler to use the |\reglyphfont| command.
+
+To reglyph one or several fonts, one writes
+\begin{quote}
+ |\reglyphfonts|\\
+ \vadjust{}\quad \meta{reglyphing commands}\\
+ |\endreglyphfonts|
+\end{quote}
+There are two types of reglyphing commands: the |\reglyphfont|
+command, and the commands that modify what |\reglyphfont| will do to
+the fonts it operates on. The syntax of |\reglyphfont| is
+\begin{quote}
+ |\reglyphfont|\marg{destination font}\marg{source font}
+\end{quote}
+The \meta{source font} font here is the name (suffix not included, of
+course) of the font metric file one wants to change the glyph names in.
+This font metric file can be in any of the formats \mtx, \pl, \afm, and
+\vpl, and it will be converted to \mtx format if it isn't already in
+that format (this happens just as for files listed in the second
+argument of |\installfont|). \meta{destination font} (which must be
+different from \meta{source font}) will be taken as the name for a
+new \texttt{.mtx} file that will be generated. The destination font
+can differ from the source font only in two ways: the names of some
+glyphs in the source font might be changed, and some of the commands
+from the source font might not have been copied to the destination
+font. To what extent the fonts are different is determined by what
+modifying commands have been executed; when no modifying commands
+have been executed, the source and destination font are equal.
+
+The modifying reglyphing commands are
+\begin{quote}
+ |\renameglyph|\marg{to}\marg{from}\\
+ |\renameglyphweighted|\marg{to}\marg{from}\marg{weight}\\
+ |\killglyph|\marg{glyph}\\
+ |\killglyphweighted|\marg{glyph}\marg{weight}\\
+ |\offmtxcommand|\marg{command}\\
+ |\onmtxcommand|\marg{command}
+\end{quote}
+|\renameglyph| simply declares that occurrences of the glyph name
+\meta{from} should be replaced by the glyph name \meta{to}. To each
+glyph name is also assigned a \emph{weight}, which is used by a
+mechanism which conditions copying of commands from the source font to
+the destination font by the set of glyphs that command mentions. The
+details of this mechanism are however somewhat tricky, so those
+interested in the full generality should read the comments in the
+source of \fontinst. Here it needs only be noted that if one applies
+|\killglyph| to a glyph name, then (under most circumstances) commands
+that refer to that glyph name will not be copied to the destination
+font.
+
+|\offmtxcommand| and |\onmtxcommand| also control whether commands are
+copied to the destination font, but they look at the actual command
+rather than the glyphs it refers to. For example, after the command
+\begin{quote}
+ |\offmtxcommand{\setkern}|
+\end{quote}
+no |\setkern| commands will be copied. By using |\offmtxcommand|, it
+is possible to achieve effects similar to those of the files
+\texttt{kernoff.mtx} and \texttt{glyphoff.mtx}---the difference is
+that with |\offmtxcommand|, it happens at an earlier stage of the font
+generation. As expected, |\onmtxcommand| undoes the effect of
+|\offmtxcommand|.
+
+A special rule pertains to the |\set|\-|raw|\-|glyph|,
+|\set|\-|not|\-|glyph|, |\set|\-|scaled|\-|raw|\-|glyph|, and
+|\set|\-|scaled|\-|not|\-|glyph| commands, since |\transformfont|
+doesn't care what something was in the source font when it generates
+the transformed font. To turn these commands off while reglyphing,
+you use |\offmtx|\-|command| on |\set|\-|scaled|\-|raw|\-|glyph|.
+
+The effects of modifying reglyphing commands are delimited by
+|\reglyphfonts| and |\endreglyphfonts|, which starts and ends a group
+respectively.
+
+As we expect the most common reglyphing operation will be to go from SC
+glyph names to expert glyph names, there is a file \texttt{csc2x.tex}
+in the \fontinst distribution which contains the modifying
+reglyphing commands needed for setting up that conversion. Thus you
+can write for example
+\begin{quote}
+ |\reglyphfonts|\\
+ | \input csc2x|\\
+ | \reglyphfont{padrcx8r}{padrc8r}|\\
+ | \reglyphfont{padscx8r}{padsc8r}|\\
+ |\endreglyphfonts|
+\end{quote}
+to alter the glyph names in the SC fonts in the Adobe Garamond
+(\texttt{pad}) family.
+Note that the names of the destination fonts here really are rather
+arbitrary, since they will only exist as \texttt{.mtx} files, and
+thus only need to work within your local file system. In particular,
+all the |\setrawglyph| commands in the destination font files still
+refer to the source font, so it is that font which the drivers need
+to know about.
+
+
+\subsection{Making map file fragments}
+\label{Ssec:MapFragments}
+
+A \emph{map file fragment} is the lines\footnote{Not in general an
+entire map file, hence the word \emph{fragment}.} of a map file that
+the corresponding driver would need for handling some set of fonts.
+When told to, \fontinst can (in a fairly automatic way) create
+the map file fragment which is needed for the set of raw fonts
+\fontinst has (i) installed directly (using |\installrawfont|)
+or (ii) used as a base font for some installed virtual font (generated
+by |\installfont|). \Fontinst does not support the map file
+syntaxes of every existing driver, but the system is designed to be
+extendable and contributions that extend its capabilities are welcome.
+Nor can \fontinst examine your \TeX\ system and
+determine every piece of information needed to make the correct map
+file fragments, but you can tell it roughly how your installation
+looks, it can make guesses which work most of the time, and you can
+specify most things explicitly if the guesses turn out to be wrong.
+Should the available options for configuring the process turn out to
+be inadequate for your needs, then please write to the
+\fontinst mailing list about this---there is probably a way
+to improve the system so that your needs can be met.
+
+Now what does one have to do to use this map file fragment writer,
+then? First you need to tell \fontinst to record the
+information the map file fragment writer needs. You do this by giving
+the command
+\begin{quote}
+ |\recordtransforms{whatever.tex}|
+\end{quote}
+at the beginning of the run. Here \texttt{whatever.tex} is the name of
+a file that will be created, so you can use some other name if you
+like. After that you do all the calls to |\transform|\-|font|,
+|\install|\-|font|, |\install|\-|raw|\-|font|, |\latin|\-|family|,
+etc.\ you need to make the fonts you want. When you're done, you give
+the command
+\begin{quote}
+ |\endrecordtransforms|
+\end{quote}
+and end the run (say |\bye|). The file \texttt{whatever.tex} will now
+contain the information about which fonts were used and what needs to
+be done with them.
+
+The second step is to actually run the map file fragment writer.
+Observe that it is located in the file \texttt{finstmsc.sty}, not
+\texttt{fontinst.sty}! The commands you need to give it can be so few
+that you can type them in at \TeX's \texttt{*} prompt, but if you are
+writing a command file then it should typically have the following
+structure (comments not necessary, of course):
+\begin{center}
+ \begin{tabular}{ll}
+ |\input finstmsc.sty|& |%| Input command definitions\\
+ \meta{general settings} & |%| See below\\
+ |\adddriver|\marg{driver name}\marg{output file}&
+ |%| Open output file\\
+ |\input whatever.tex|& |%| Writes to output file(s)\\
+ |\donedrivers|& |%| Close output file(s), tidy up\\
+ |\bye|& |%| Quit
+ \end{tabular}
+\end{center}
+The |\adddriver| command gives the order ``write map file entries for
+the \meta{driver name} \dvi driver to the file \meta{output file}.'' The
+plan is that it should be possible to use the name of just about any
+major driver (\texttt{dvips}, \texttt{xdvi},\footnote{Or
+does that use the same map file as \texttt{dvips}? I heard somewhere
+that it did. /LH} \texttt{pdftex},\footnote{pdf\TeX\ can read
+the map files generated for \texttt{dvips}, but a separate driver is
+desirable because the formats are not completely identical.}
+\texttt{OzTeX}, etc.) here and get suitable map file entries for that
+driver as output, but for the moment only the \texttt{dvips} and
+\texttt{dvipdfm}\footnote{Whose support I made very much to illustrate
+that you \emph{don't} have to be a big and ancient driver like
+\texttt{dvips} to have supporting code put into \fontinst.
+(The fact that I just happened to have printed out the documentation and
+that is was easy to read also helped, of course.) Note, however, that
+there won't be any support for a driver unless someone sits down and
+writes the code for it! Don't assume I will. /LH} drivers are supported.
+
+You may also use \texttt{debug} or \texttt{pltotf} for \meta{driver name}.
+The \texttt{debug} ``\dvi driver'' file simply contains all the available
+information about each font (hence it should come handy for debugging
+code writing entries for real drivers) in a format that should be easy
+to interpret for a human. It could be the right choice if you're going
+to write the map file manually, as the combined effects of several
+font transformations are not always easy to compute manually. The
+file generated for the \texttt{pltotf} ``driver'' is actually a shell
+script consisting of a sequence of \pltotf commands. These commands
+perform the \pl to \tfm conversion for precisely those fonts that are
+actually needed (\fontinst usually generates \pl files also for a
+number of fonts at intermediate stages of transformation, and many of
+these need not be converted to \tfm files). The \texttt{TFMfileprefix}
+string can be used to add a directory path to the \tfm file names,
+perhaps saving the step of moving them to their proper location later.
+
+The file \texttt{whatever.tex} in the above example contains the
+commands (|\make|\-|map|\-|entry| commands) that actually cause entries
+to be written to the output file. It also contains a number of
+|\store|\-|map|\-|data| commands---these describe how some given font
+was made. If some metric file you have used contains
+|\set|\-|raw|\-|glyph| commands that were not automatically generated
+by \fontinst, then there might not be a |\store|\-|map|\-|data| for
+the font they refer to in \texttt{whatever.tex}, so you will have to
+include such a command yourself somewhere. This can for example be done
+in the \meta{general settings} part of the above example file.
+
+Another class of things that will typically appear in the
+\meta{general settings} part above is commands that will inform the
+routines actually writing output about your \TeX\ system, about the set
+of fonts you are using on this run, or about something else that might
+be useful. Some such commands are of a general nature and affect what
+assumptions \fontinst will make in certain conditions when no
+specific information is available. For the moment there commands are:
+\begin{description}
+ \item[\cs{AssumeMetafont}] Assume all fonts with \pl metrics are
+ bitmaps generated by Metafont, and therefore make no entries for
+ them.
+ \item[\cs{AssumeAMSBSYY}] Assume all fonts with \pl metrics have their
+ \TeX\ names in all upper case as postscript names---just like the
+ Computer Modern fonts in the AMS\slash Blue~Sky\slash Y\&Y
+ distribution.
+ \item[\cs{AssumeBaKoMa}] Assume all fonts with \pl metrics have their
+ \TeX\ names in all lower case as postscript names---just like the
+ Computer Modern fonts in the BaKoMa distribution.
+\end{description}
+Otherwise the default action of the routine for finding out the
+postscript name of a font simply is to observe that it hasn't got a clue
+about what the right value is when the metrics were taken from a \pl
+file, and therefore it writes `\texttt{??????}' for the postscript name.
+\begin{description}
+ \item[\cs{AssumeLWFN}] Assume postscript fonts for which nothing
+ else has been specified are stored in files which are named
+ according to the \mbox{MacOS} scheme for
+ \texttt{LWFN}s.%\footnote{LaserWriter FoNt}
+\end{description}
+Otherwise the default action is to use the name of the \afm or \pl from
+which the metrics were originally taken, and add the file suffix stored
+in the string \texttt{PSfontsuffix}. The default value of this string
+is \texttt{.pfa}, but it can be changed using |\resetstr|.
+
+If neither the default nor the LWFN scheme produce correct results
+then you may use the more specific |\specifypsfont| command, which
+describes exactly which file (or files, if any) a given font is stored
+in. The syntax of this command is
+\begin{quote}
+ |\specifypsfont|\marg{PS font name}\marg{actions}
+\end{quote}
+where the \meta{actions} is a sequence of ``action commands''.
+Currently the only such command is
+\begin{quote}
+ |\download|\marg{file}
+\end{quote}
+which instructs the map file writer to include in any entry using
+that PS font and ``instruction'' that the specified file should be
+downloaded. Some examples are
+\begin{verbatim}
+ \specifypsfont{Times-Roman}{}
+ \specifypsfont{Shareware-Cyrillic-Regular}{\download{fcyr.gsf}}
+ \specifypsfont{zmnl8ac6}{%
+ \download{MinionMM.pfb}\download{zmnl8ac6.pro}%
+ }
+\end{verbatim}
+Many \dvi drivers (for example \dvips) have more than one style of
+font downloading (e.g., partial and full downloading). This interface
+could be extended to control also such finer details (for example by
+adding a |\fulldownload| command to force full download of a font),
+but requests for this has so far been scarce.
+
+Finally, there is the |\declarepsencoding| command which is used to
+link \etx files to postscript encodings. If no postscript encoding has
+been linked to a given \etx file then \fontinst will
+automatically create a postscript encoding (\texttt{.enc}) file for
+that encoding, and use this file for all reencoding commands.
+The \texttt{8r} encoding is predeclared, and it doesn't
+matter if an encoding is undeclared if you never use it to reencode
+fonts, but there is potentially a problem with not having declared
+encodings you have installed and use for reencoding, as you may then
+find yourself having two files with identical names that define
+encodings that do not have the same name (as far as postscript is
+concerned).
+
+
+
+\subsection{Tuning accent positions---an application of loops}
+
+The accent placements made by \texttt{latin.mtx} certainly aren't
+perfect for all fonts, and the only way to find out where they should
+be put is through trying in text the accented letters you get for a
+couple of values for the position parameter and deciding which one
+works best. Since to try one parameter value you need to (i) edit it
+into an \mtx file, (ii) run \fontinst, (iii) run
+\vptovf, (iv) run \TeX\ on some test text, and (v) print that
+text, trying one parameter value can take annoyingly much time.
+Repeating the same procedure ten times to test ten values is not
+something one does without being bored (unless one scripts it, of
+course), but it is possible to try ten parameter values in a single
+virtual font, and without doing very much typing.
+
+Say you're not too happy with how \texttt{latin.mtx} positions the
+accent in the \texttt{ohungarumlaut} glyph:
+\begin{quote}
+ |\setglyph{ohungarumlaut}|\\
+ | \topaccent{o}{hungarumlaut}{500}|\\
+ |\endsetglyph|
+\end{quote}
+The |500| is the horizontal position (in thousandths of the width of
+the \texttt{o}) that the centre of \texttt{hungarumlaut} in the glyph
+constructed will have, so that is the position parameter value that
+you want to change. Create an \mtx file containing the code
+\begin{quote}
+ |\for(pos){250}{750}{50}|\\
+ | \setglyph{ohungarumlaut\strint{pos}}|\\
+ | \topaccent{o}{hungarumlaut}{\int{pos}}|\\
+ | \endsetglyph|\\
+ | \setleftrightkerning{ohungarumlaut\strint{pos}}|\\
+ | {ohungarumlaut}{1000}|\\
+ |\endfor(pos)|
+\end{quote}
+This will set eleven glyphs \texttt{ohungarumlaut250},
+\texttt{ohungarumlaut300}, \texttt{ohungarumlaut350}, \textellipsis\,,
+\texttt{ohungarumlaut750}, each being an Hungarianly umlauted `o'
+(i.e., an `\H{o}') but all having that umlaut in slightly different
+positions. In order to put them in a font, you also need to make an
+encoding that contains them. Therefore create an \etx file which
+contains the code
+\begin{quote}
+ |\relax\encoding|\\
+ |\nextslot{"C0}|\\
+ |\for(pos){250}{750}{50}|\\
+ | \setslot{ohungarumlaut\strint{pos}}|\\
+ | \endsetslot|\\
+ |\endfor(pos)|\\
+ |\endencoding|
+\end{quote}
+The command for installing this experiment font would be something like
+\begin{quote}
+ |\installfont|\marg{some name}|{|\meta{the normal list of metrics}%
+ |,|\penalty0\meta{the new \mtx}|}|\penalty0
+ |{ot1,|\meta{the new \etx}|}|\penalty0|{OT1}|\textellipsis
+\end{quote}
+The reason for including \texttt{ot1} in the third argument above is
+that you'll need letters other than `\H{o}' against which you can
+compare the experimental glyphs. It would not have been possible to
+use \texttt{t1} instead of \texttt{ot1} (even though that has more
+Hungarian letters) since that would set all slots in the font and
+leave none for these experimental \texttt{ohungarumlaut}s.
+
+It is even possible to use a loop for making the test text. The
+\LaTeX\ macros
+\begin{verbatim}
+\newcount\slotcount
+\newcommand\testtext[3]{%
+ \slotcount=#1\relax
+ \begin{description}%
+ \loop\item[\the\slotcount]#3%
+ \ifnum #2>>\slotcount \advance \slotcount 1 \repeat
+ \end{description}%
+}
+\DeclareTextCompositeCommand{\H}{OT1}{o}{\char\slotcount}
+\end{verbatim}
+will let you write
+\begin{quote}
+ |\testtext|\marg{first}\marg{last}\marg{text}
+\end{quote}
+to get the text \meta{text} typeset once for each slot from
+\meta{first} to \meta{last} inclusive, with |\H{o}| ranging through the
+glyphs in this interval. Thus in this case
+|\testtext|\penalty\hyphenpenalty|{"C0}|\penalty\hyphenpenalty|{"CA}|%
+\penalty\hyphenpenalty|{Erd\H{o}s}| would be a trivial test.
+
+
+\subsection{Font installation commands}
+\label{Ssec:FontInstCmds}
+
+The |\installfont|, |\installrawfont|, and |\installfontas| commands
+have the respective syntaxes
+\begin{isyntax}
+ |\installfont|\marg{font-name}\marg{metrics}\marg{etx-list}\penalty0
+ \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+ |\installrawfont|\marg{font-name}\marg{metrics}\marg{etx-list}%
+ \penalty0
+ \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+ |\installfontas|\marg{font-name}\penalty0\marg{encoding}%
+ \marg{family}\marg{series}\marg{shape}\marg{size}
+\end{isyntax}
+The \meta{font-name} argument and the last five arguments are common
+to all these commands. The first argument is the name of a \TeX\ font
+to install. The last five arguments are the NFSS attributes under which
+that font will be declared to \LaTeX---encoding, family, series, shape,
+and size. It is worth observing that encoding names are usually in
+upper case, whereas the family, series, and shape are usually in lower
+case. The size argument is either a shorthand (declared using
+|\declaresize|) for a particular font
+size (or range of font sizes), or an explicit list of font sizes or
+ranges of sizes, which is copied directly to the font declaration.
+The most common case is to let the size argument be empty, as that is
+declared as a shorthand for ``any size''.
+
+The |\installfontas| command does not itself create the font, it just
+makes a note that the specified font declaration should be written to
+the proper FD file at |\end|\-|install|\-|fonts|. The
+|\install|\-|font| and |\install|\-|raw|\-|font| commands do however
+produce the font, in the sense that they write a \vpl and \pl
+respectively file for the font. It depends solely on the \meta{metrics}
+and \meta{etx-list} arguments what this font will contain. Many
+features of these arguments are new with \fontinst v\,1.9;
+therefore the complete syntaxes are described below.
+
+Both arguments are comma-separated lists of basically file names (not
+including an extension). The files listed in the \meta{metrics} are
+font metric files which together build up a \emph{glyph base}
+(definitions of glyphs and metrics related to one or several glyphs),
+whereas the files listed in the \meta{etx-list} are encoding definition
+files that select a subset of the glyph base for turning into a
+\TeX\ font. The font metrics can be in either of the four formats
+\mtx, \pl, \afm, and \vpl, which are considered in that order. If the
+metrics are not originally in \mtx format then they will be converted
+to this format (a new file will be created) before they are used.
+The encoding definitions must be in \etx format. The files actually
+read will have a suffix \texttt{.mtx}, \texttt{.pl}, \texttt{.afm},
+\texttt{.vpl}, or \texttt{.etx} appended to the name given, depending
+on which format is expected.
+
+Within each element of the comma-separated list, the actual file name
+is followed by zero or more \emph{modifier clause}s. A \meta{modifier
+clause} consists of a \emph{keyword} followed by some number (usually
+one) of \emph{arguments}, separated by spaces. The whole thing looks
+a lot like the \meta{rule specifications} of e.g.\ the |\vrule|
+command, but here the spaces are mandatory. The currently defined
+\meta{modifier clause}s are
+\begin{description}
+ \item[\mdseries\textvisiblespace\texttt{option}\textvisiblespace
+ \meta{string}]
+ Available for metric and encoding files. This adds \meta{string}
+ to the list of options for this file, which may affect what code
+ the file executes. The file can then test, using the |\ifoption|
+ command, whether a specific string is one of the options it was
+ given.
+ \item[\mdseries\textvisiblespace\texttt{scaled}\textvisiblespace
+ \meta{factor}]
+ Available for metric files. Causes the \texttt{rawscale} integer
+ variable to be set to the \meta{factor} (an integer expression)
+ while the file is being read. This scales glyphs and kerns that
+ are added to the glyph base by the \meta{factor}.
+ \item[\mdseries\textvisiblespace\texttt{suffix}\textvisiblespace
+ \meta{suffix}]
+ Available for metric files. Causes \meta{suffix} to be appended
+ to every glyph name appearing in a glyph or kern that file adds
+ to the glyph base. Thus ``\texttt{suffix /2}'' effectively
+ changes a
+ \begin{quote}
+ |\setrawglyph{a}|\dots
+ \end{quote}
+ to a
+ \begin{quote}
+ |\setrawglyph{a/2}|\dots
+ \end{quote}
+ \item[\mdseries\textvisiblespace\texttt{encoding}\textvisiblespace
+ \meta{etx-name}]
+ Available for metric files, and forces \fontinst to
+ only consider the \pl and \vpl formats for this font.
+ As these file formats do not contain glyph names, an \etx file
+ is used to assign glyph names to the slots in the font.
+ This \etx file is usually selected according to the
+ \texttt{CODINGSCHEME} property of the \pl or \vpl (using the
+ correspondences set up via the |\declare|\-|encoding| command),
+ but that information is not always as one would want it (there
+ are even fonts for which it is quite wrong). An \texttt{encoding}
+ clause bypasses this automatic mechanism, so that the file
+ \meta{etx-name}\texttt{.etx} is used instead.
+
+% % The following is no longer true as of v1.926:
+% \textbf{Note:} The first time that a file in PL or VPL format is
+% used in a \meta{metrics} argument, a corresponding \mtx file is
+% generated. This means that if the same file reference is used
+% another time then the reference will be to the \mtx file, not to
+% the original PL or VPL, and thus \texttt{encoding} clauses on
+% subsequent uses will have no effect. Each font only has one
+% encoding, so it usually makes no sense to switch the \etx file
+% used to interpret a font, but since \mtx files are not
+% automatically deleted between runs there is a risk that this
+% takes away the intended effect of an \texttt{encoding} clause.
+
+ \item[\mdseries\textvisiblespace\texttt{mtxasetx}]
+ This is available for files in the \meta{etx-list}. The actual
+ function of a
+ \begin{quote}
+ \meta{file-name} \texttt{mtxasetx}
+ \end{quote}
+ item in the \meta{etx-list} is that the file
+ \meta{file-name}\texttt{.mtx} is inputted (\emph{not}
+ \meta{file-name}\texttt{.etx}) and that the correspondence
+ between glyph names and slot numbers set up in
+ |\set|\-|raw|\-|glyph| or |\set|\-|scaled|\-|raw|\-|glyph|
+ commands in this file is treated as if it had been set up by
+ |\setslot| commands in an \etx file. Provided the \mtx file is
+ transformable, the glyph base will be unaffected.
+
+ The purpose of this feature is to simplify quick and dirty
+ installations of odd fonts for which no suitable \etx file is
+ available. This can be useful in early stages of the design of
+ a new font, but is inferior to installation using proper \etx
+ files since one for example cannot specify any ligatures in
+ \mtx files.
+\end{description}
+Furthermore there is a special exception for the \meta{metrics}: if
+the first token in one of the list items is the control sequence
+|\metrics|, then the rest of that item is interpreted as explicit
+metric commands to execute.
+
+If the \meta{metrics} of two subsequent |\install|\-|font|
+or |\install|\-|raw|\-|font| commands are identical then the glyph
+bases will be identical as well. This creates an opportunity for
+optimization, which \fontinst makes use of by caching glyph
+bases from one installation command to the next so that the glyph
+base does not have to be rebuilt in these cases. A side-effect of
+this caching is that local assignments made between two font
+installation commands are cleared out with the glyph base, but
+|\setint| and similar \fontinst commands make global
+assignments when used in such positions.
+
+Some examples might be in order. The first is an adaptation of an
+installation command from \texttt{mfnt-0.59} %~\cite{mfnt}
+by Matthias Clasen and Ulrik Vieth: the installation command for the
+8-bit math font \texttt{xma1000} (which can be thought of as being
+to \texttt{cmmi10} sort of as \texttt{ecrm1000} is to \texttt{cmr10}).
+The first three \texttt{encoding} clauses are more fine-tuning---without
+them, a few glyphs would get incorrect names---but the last two are
+quite essential, as the \texttt{msam10} and \texttt{msbm10} fonts
+incorrectly claim to have the coding scheme \texttt{TEX MATH
+SYMBOLS}.
+\begin{verbatim}
+ \installfont{xma1000}{%
+ yma1000 encoding mcin,%
+ cmr10 encoding ot1upright,%
+ cmmi10,%
+ cmsy10 encoding omscal,%
+ msam10 encoding msam,%
+ msbm10 encoding msbm,%
+ mccmhax,mccmkern,mcmissing,%
+ cmsy10-base,cmsy10-extra%
+ }{mc}{MC}{cm}{m}{n}{<<10->>}
+\end{verbatim}
+Also note the explicit \LaTeX\ size specification for the range
+``10\,pt and up''.
+
+The second example makes use of a \texttt{suffix} clause to combine
+the letters from one font with the digits from another.
+\begin{verbatim}
+ \installfont{msbrj8t}{msbr8r,msbrc8r suffix /2,latin}{digit2,t1}
+ {T1}{msbj}{m}{n}{}
+\end{verbatim}
+In this case, the glyph base contains the glyphs of Monotype Sabon
+(SabonMT)---under names such as \texttt{A} for `A', \texttt{a} for
+`a', and \texttt{one} for a lining digit one---as well as the
+glyphs of Monotype Sabon Small Caps and Oldstyle Figures
+(SabonMT-SCOSF)---under names such as \texttt{A/2} for `A',
+\texttt{a/2} for `\textsc{a}', and \texttt{one/2} for a hanging
+digit one. The \texttt{digit2.etx} file simply makes the definition
+\begin{verbatim}
+ \setcommand\digit#1{#1/2}
+\end{verbatim}
+which causes \texttt{t1.etx} to put \texttt{zero/2} in slot 48 (digit
+zero), \texttt{one/2} in slot 49 etc., instead of as it normally
+would \texttt{zero} in slot 48, \texttt{one} in slot 49 and so on.
+The net effect is that the digits in the generated \texttt{msbrj8t}
+is from \texttt{msbrc8r} (SabonMT-SCOSF) but everything else is from
+\texttt{msbr8r} (SabonMT).
+
+The third example makes use of an \texttt{mtxasetx} clause to install
+(with its default encoding) a font for which creating an appropriate
+\etx file seems not worth the trouble.
+\begin{verbatim}
+ \installrawfont{psyr}{psyr,\metrics
+ \setint{xheight}{\height{alpha}}
+ }{txtfdmns,psyr mtxasetx}{U}{psy}{m}{n}{}
+\end{verbatim}
+The effect of the second \texttt{psyr} is that \texttt{psyr.mtx} is
+read (in case there was no \texttt{psyr.mtx} then it is created from
+(hopefully) \texttt{psyr.afm}) and the information in it will form
+the glyph base. Because of the |\metrics| control sequence, the rest
+of that item will be interpreted as explicit metric commands
+modifying the glyph base, and thus the |\setint| command can provide
+a value for the \texttt{xheight} variable (there doesn't seem to be
+such a value in the \afm). Once the glyph base is completed, the
+|\install|\-|raw|\-|font| starts writing the file \texttt{psyr.pl}
+(that's for the first \texttt{psyr}). The encoding of that font will,
+because of the \texttt{psyr mtxasetx}, be the same as that used in
+\texttt{psyr.mtx}. Finally, the \texttt{txtfdmns} is for
+\texttt{txtfdmns.etx}, an \etx file which sets fontdimens 1--16 as for
+a \texttt{T1} encoded font but does not set any slots. Since
+\texttt{psyr.mtx} reinterpreted as an \etx file sets slots but no
+fontdimens, these complement each other nicely.
+
+
+
+\subsection{Bounding boxes}
+
+Han The Thanh has created an implementation of bounding box support
+for \fontinst, and it is a modified form of that support
+is distributed with \fontinst as the file \texttt{bbox.sty}. To load
+this, begin your command file with
+\begin{verbatim}
+ \input fontinst.sty
+ \input bbox.sty
+\end{verbatim}
+The reason for not making it default is that keeping track of bounding
+boxes increases some of \fontinst's memory requirements quite a lot.
+
+One important
+characteristic of this implementation is that the dimensions of the
+bounding box are not bundled into the same data structure (the
+|\g-|\meta{glyph} macros) as the glyph's width, height, depth, and
+italic correction are, but stored in a separate data structure (the
+|\gb-|\meta{glyph} macros). A glyph doesn't need to have its bounding
+box set, it is simply a piece of information that \fontinst
+will store if you tell it to and which you can later retrieve.
+
+The bounding box will be stored as coordinates of the sides in the
+normal AFM coordinate system. The commands for retrieving these
+coordinates are
+\begin{center}
+ \begin{tabular}{ll}
+ \textbf{Command}& \textbf{Side}\\
+ |\bbtop|\marg{glyph}& top ($y$-coordinate)\\
+ |\bbbottom|\marg{glyph}& bottom ($y$-coordinate)\\
+ |\bbleft|\marg{glyph}& left ($x$-coordinate)\\
+ |\bbright|\marg{glyph}& right ($x$-coordinate)
+ \end{tabular}
+\end{center}
+In Thanh's implementation the command names were |\ury|, |\lly|,
+|\llx|, and |\urx| respectively instead, but I think the former are
+easier to remember. If no bounding box has been set for a glyph then
+the above commands will instead report the corresponding coordinate of
+the glyph's \TeX\ box (i.e.\ |\height|\marg{glyph},
+|\neg{\depth|\marg{glyph}|}|, |0|, and |\width|\marg{glyph}
+respectively).
+
+The command for setting the bounding box of a glyph is
+\begin{quote}
+ |\setglyphbb|\marg{glyph}\marg{left}\marg{bottom}\marg{right}%
+ \marg{top}
+\end{quote}
+
+
+
+
+
+\section*{Acknowledgements}
+
+We'd like to thank all of the \fontinst $\alpha$-testers, especially
+Karl Berry, Damian Cugley, Steve Grahthwohl, Yannis Haralambous, Alan
+Hoenig, Rob Hutchings, Constantin Kahn, Peter Busk Laursen, Ciar{\'a}n {\'O}
+Duibh{\'\i}n, Hilmar Schlegel, Paul Thompson, Norman Walsh and John Wells,
+who made excellent bug-catchers!
+
+Thanks to Barry Smith, Frank Mittelbach, and especially Sebastian
+Rahtz for many useful email discussions on how virtual fonts should
+interact with \LaTeXe.
+
+Thanks to Karl Berry and Damain Cugley for detailed comments on this
+documentation.
+
+Thanks to David Carlisle for the use of his \texttt{trig} macros for
+calculating trigonometry.
+
+
+% \section*{Warranty and distribution}
+%
+% There is no warranty for the \fontinst package, to the extent
+% permitted by applicable law. Except when otherwise stated in writing,
+% the author provides the program `as is' without warranty of any kind,
+% either expressed or implied, including, but not limited to, the
+% implied warranties of merchantability and fitness for a particular
+% purpose. The entire risk as to the quality and performance of the
+% program is with you. Should the package prove defective, you assume
+% the cost of all necessary servicing, repair or correction.
+%
+% In no event unless required by applicable law or agreed to in writing
+% will the author be liable to you for damages, including any general,
+% special, incidental or consequential damages arising out of the use or
+% inability to use the program (including but not limited to loss of
+% data or data being rendered inaccurate or losses sustained by you or
+% third parties or a failure of the program to operate with any other
+% programs), even if such holder or other party has been advised of the
+% possibility of such damages.
+%
+% Redistribution of unchanged files is allowed provided that all files
+% listed in the \texttt{MANIFEST} file are distributed.
+%
+% If you receive only some of these files from someone, or if you
+% receieve altered files, then complain!
+
+\end{document}
diff --git a/fonts/utilities/fontinst/doc/manual/intro98.pdf b/fonts/utilities/fontinst/doc/manual/intro98.pdf
new file mode 100644
index 0000000000..a7bb583f6b
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/manual/intro98.pdf
Binary files differ
diff --git a/fonts/utilities/fontinst/doc/manual/intro98.tex b/fonts/utilities/fontinst/doc/manual/intro98.tex
new file mode 100644
index 0000000000..0e7c485ab6
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/manual/intro98.tex
@@ -0,0 +1,1330 @@
+%%% ====================================================================
+%%% @LaTeX-file{
+%%% author = "Alan Jeffrey and Rowland McDonnell and
+%%% Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.927",
+%%% date = "28 July 2004",
+%%% time = "23:20:27 CEST",
+%%% filename = "intro98.tex",
+%%% email = "fontinst@tug.org",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "fontinst, TeX, PostScript, documentation",
+%%% supported = "yes",
+%%% abstract = "This is documentation for the fontinst
+%%% font installation package.",
+%%% package = "fontinst",
+%%% dependencies = "ltxguide.cls, url.sty, xspace.sty"
+%%% }
+%%% ====================================================================
+
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey
+
+% Modified by Rowland McDonnell June 1998
+% Modified and revised by Ulrik Vieth June 1998
+
+\documentclass[a4paper]{ltxguide}
+\usepackage[OT1]{fontenc}
+\usepackage{url,xspace}
+\usepackage{graphicx}
+%\renewcommand\rmdefault{ppl}
+%\renewcommand\rmdefault{padx}
+%\renewcommand\rmdefault{pmnx}
+
+
+% Title page and running heads.
+
+\makeatletter
+\newcommand{\subtitle}[1]{\renewcommand{\@subtitle}{#1}}
+\newcommand{\version}[1]{\renewcommand{\@version}{#1}}
+\newcommand{\illustration}[1]{\renewcommand{\@illustration}{#1}}
+
+\newcommand{\@subtitle}{}
+\newcommand{\@version}{???}
+\newcommand{\@illustration}{cover.eps}
+
+\pagestyle{myheadings}
+\AtBeginDocument{\markright{\small\itshape
+ \@author\hfill\@title: \@subtitle\quad}}
+
+
+\renewcommand{\maketitle}{{%
+ \thispagestyle{empty}%
+ \normalfont\centering
+ \null
+ {\fontsize{100}{100}\textit{\@title}}%
+ \par\bigskip
+ {\Large\textbf{\@subtitle}}%
+ \vfill
+ \includegraphics[width=\textwidth]{\@illustration}%
+ \vfill
+ {\Large\textbf{%
+ \@author\\[\smallskipamount] \@title~v\@version
+ \quad\textperiodcentered\quad \@date}}%
+ \clearpage
+}}
+\makeatother
+
+
+% Set lists tighter (assuming non-zero \parskip).
+
+\makeatletter
+\renewcommand{\@listI}{%
+ \leftmargin\leftmargini
+ \parsep\medskipamount
+ \itemsep\z@ % + parsep
+ \topsep\z@ % + parskip
+ \partopsep\z@
+}
+\makeatother
+
+% Set spacing around captions.
+
+\setlength{\abovecaptionskip}{\medskipamount}
+\setlength{\belowcaptionskip}{\medskipamount}
+
+% Markup for logos, file types, programs, etc.
+
+\newcommand*{\cs}[1]{\texttt{\char`\\ #1}\xspace}
+
+\newcommand*{\OzTeX}{O\kern-.03em z\kern-.15em\TeX}
+\newcommand*{\OzMF}{O\kern-.03em zMF}
+\newcommand*{\OzTools}{O\kern-.03em z\kern-.15em Tools}
+
+\newcommand{\PS}{Post\-Script\xspace}
+\newcommand{\TT}{True\-Type\xspace}
+
+\newcommand*{\setfilename}[1]{\texttt{#1}}
+\newcommand*{\setdotfilename}[1]{\setfilename{.#1}}
+\newcommand*{\setpackagename}[1]{\textsc{#1}}
+
+\newcommand{\dvips} {\setpackagename{dvips}\xspace}
+\newcommand{\Dvips} {\setpackagename{Dvips}\xspace}
+\newcommand{\fontinst}{\setpackagename{font\-inst}\xspace}
+\newcommand{\Fontinst}{\setpackagename{Font\-inst}\xspace}
+
+% \show\fontname
+\newcommand{\fontnamekb}{fontname\xspace}
+\newcommand{\Fontnamekb}{Fontname\xspace}
+
+\newcommand{\mf} {\setfilename{mf}\xspace}
+\newcommand{\Mf} {\setfilename{Mf}\xspace}
+\newcommand{\vf} {\setfilename{vf}\xspace}
+\newcommand{\Vf} {\setfilename{Vf}\xspace}
+\newcommand{\pl} {\setfilename{pl}\xspace}
+\newcommand{\Pl} {\setfilename{Pl}\xspace}
+\newcommand{\fd} {\setfilename{fd}\xspace}
+\newcommand{\Fd} {\setfilename{Fd}\xspace}
+\newcommand{\pk} {\setfilename{pk}\xspace}
+\newcommand{\Pk} {\setfilename{Pk}\xspace}
+\newcommand{\afm}{\setfilename{afm}\xspace}
+\newcommand{\Afm}{\setfilename{Afm}\xspace}
+\newcommand{\vpl}{\setfilename{vpl}\xspace}
+\newcommand{\Vpl}{\setfilename{Vpl}\xspace}
+\newcommand{\tfm}{\setfilename{tfm}\xspace}
+\newcommand{\Tfm}{\setfilename{Tfm}\xspace}
+\newcommand{\mtx}{\setfilename{mtx}\xspace}
+\newcommand{\Mtx}{\setfilename{Mtx}\xspace}
+\newcommand{\etx}{\setfilename{etx}\xspace}
+\newcommand{\Etx}{\setfilename{Etx}\xspace}
+\newcommand{\pfa}{\setfilename{pfa}\xspace}
+\newcommand{\Pfa}{\setfilename{Pfa}\xspace}
+\newcommand{\pfb}{\setfilename{pfb}\xspace}
+\newcommand{\Pfb}{\setfilename{Pfb}\xspace}
+\newcommand{\dvi}{\setfilename{dvi}\xspace}
+\newcommand{\Dvi}{\setfilename{Dvi}\xspace}
+\newcommand{\ttf}{\setfilename{ttf}\xspace}
+\newcommand{\Ttf}{\setfilename{Ttf}\xspace}
+
+\newcommand{\vftovp}{\setpackagename{vftovp}\xspace}
+\newcommand{\vptovf}{\setpackagename{vptovf}\xspace}
+\newcommand{\pltotf}{\setpackagename{pltotf}\xspace}
+\newcommand{\tftopl}{\setpackagename{tftopl}\xspace}
+
+
+% Stolen from Dr Knuth
+\makeatletter % borrow the private macros of PLAIN (with care)
+\def\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}} % octal constant
+\def\hex#1{\hbox{\rm\H{}\tt#1}} % hexadecimal constant
+% macros for font tables
+\def\oddline#1{\cr
+ \noalign{\nointerlineskip}
+ \multispan{19}\hrulefill&
+ \setbox0=\hbox{\lower 2.3pt\hbox{\hex{#1x}}}\smash{\box0}\cr
+ \noalign{\nointerlineskip}}
+\def\evenline{\cr\noalign{\hrule}}
+\def\chartstrut{\lower4.5pt\vbox to14pt{}}
+\def\beginchart#1{$$\global\count@=0 #1
+ \halign to\hsize\bgroup
+ \chartstrut##\tabskip0pt plus10pt&
+ &\hfil##\hfil&\vrule##\cr
+ \lower6.5pt\null
+ &&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline}
+\def\endchart{\raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B&
+ &\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$}
+\def\*{\global\advance\count@ by1 }
+\def\:{\setbox0=\hbox{\char\count@}%
+ \ifdim\ht0>7.5pt\reposition
+ \else\ifdim\dp0>2.5pt\reposition\fi\fi
+ \box0\global\advance\count@ by1 }
+\def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}
+\def\smallchart{%
+%\global\advance\count@ by16
+ &\oct{00x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline0
+ &\oct{01x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{02x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline1
+ &\oct{03x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{04x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2
+ &\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{06x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline3
+ &\oct{07x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{10x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline4
+ &\oct{11x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{12x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline5
+ &\oct{13x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{14x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline6
+ &\oct{15x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7
+ &\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline}
+
+\def\bigchart{%
+%\global\advance\count@ by16
+ &\oct{00x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline0
+ &\oct{01x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{02x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline1
+ &\oct{03x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{04x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2
+ &\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{06x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline3
+ &\oct{07x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{10x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline4
+ &\oct{11x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{12x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline5
+ &\oct{13x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{14x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline6
+ &\oct{15x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7
+ &\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{20x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline8
+ &\oct{21x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{22x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline9
+ &\oct{23x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{24x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{A}
+ &\oct{25x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{26x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{B}
+ &\oct{27x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{30x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{C}
+ &\oct{31x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{32x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{D}
+ &\oct{33x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{34x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{E}
+ &\oct{35x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{36x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline{F}
+ &\oct{37x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline}
+
+% \font\xrm = cmr10 at 10pt % change this line to test font
+% \beginchart\xrm \normalchart \endchart
+
+\newcommand{\smallfontchart}[1]{%
+ \font\xrm = #1 \beginchart\xrm \smallchart \endchart}
+\newcommand{\bigfontchart}[1]{%
+ \font\xrm = #1 \beginchart\xrm \bigchart \endchart}
+
+% \smallfontchart{cmr10 at 10pt}
+% \bigfontchart{ecrm1000 at 10pt}
+\makeatother
+% End stolen from Dr Knuth
+
+
+
+\title{fontinst}
+\subtitle{Font installation software for \TeX}
+\author{Alan Jeffrey and Rowland McDonnell}
+\illustration{roadmap.eps}
+\version{1.8}
+\date{30 June 1998}
+
+\begin{document}
+
+\maketitle
+
+
+\begin{small}
+ This is the tutorial part of the 1998 \fontinst manual, chiefly
+ written by Rowland McDonnell and conveying his then-view on related
+ subjects. Although most of it is still correct,
+ the passing of time has rendered it somewhat antiquated, and the
+ average current (2004) user new to \fontinst would probably find
+ Philipp Lehman's \emph{The Font Installation Guide}
+ (\url{http://www.ctan.org/tex-archive/info/Type1fonts/fontinstallationguide/})
+ more relevant.
+\end{small}
+
+\tableofcontents
+
+
+\clearpage
+
+\section{Introduction}
+
+The \fontinst package is a set of \TeX\ macros written to create
+virtual fonts for use with \TeX. Its main use is creating the
+files needed so you can use PostScript Type 1 fonts with \LaTeX.
+
+\Fontinst needs information about the fonts it works with. This
+information needs to be supplied in an Adobe Font Metric (\afm) or
+\TeX\ Property List (\pl) file. \pl files can be created from
+\tfm files using \tftopl, a program normally included with a \TeX\
+system.
+
+The job that \fontinst does is complicated, but it can be used for
+many tasks by people who are not \TeX\ font wizards. Having said
+that, you do need to understand at least the basics of \LaTeXe's
+font selection mechanism, which is documented in
+\texttt{fntguide.tex}, part of the standard \LaTeX\ distribution.
+\url{ftp://ftp.tex.ac.uk/tex-archive/macros/latex/base/fntguide.tex}
+will fetch a copy if you don't have one to hand.
+
+To get the most benefit out of \fontinst, it's important to
+understand and use Karl Berry's `\Fontnamekb' naming scheme. The
+definitive version of this is available from your nearest CTAN
+server. The following URL will fetch all the files needed
+compressed into a single ZIP archive:
+\url{ftp://ftp.tex.ac.uk/tex-archive/info/fontname.zip}. I
+suggest that you print out the \Fontnamekb documentation and have
+it handy when you're learning about \fontinst.
+
+The \fontinst package:
+\begin{itemize}
+\item Is written in \TeX, for maximum portability (at the cost of
+ speed).
+\item Supports the OT1 (Computer Modern) and T1 (Cork) encodings.
+\item Allows fonts to be generated with arbitrary `fake'
+ characters; for example the `ij' character can be faked if
+ necessary by putting an `i' next to a `j'.
+\item Allows caps and small caps fonts with letter spacing and
+ kerning.
+\item Allows kerning to be shared between characters, for example
+ `ij' can be kerned on the left as if it were an `i' and on the
+ right as if it were a `j'. This is useful, since many
+ PostScript fonts only include kerning information for characters
+ without diacriticals.
+\item Allows the generation of math fonts with \verb|nextlarger|,
+ \verb|varchar|, and arbitrary font dimensions.
+\item Allows more than one PostScript font to contribute to a
+ \TeX\ font, for example the `ffi' ligatures for a font can be
+ taken from the Expert encoding, if you have it.
+\item Can automatically generate a \fd file for use with \LaTeXe.
+\item Can be customized by the user to deal with arbitrary font
+ encodings.
+\end{itemize}
+Fontinst has been a stable piece of software since mid-1994. All
+further updates will be upwardly compatible with the interface
+described in this document.
+
+\subsection{What does \fontinst do?}
+
+\Fontinst is a tool written in \TeX\ that can create the various
+extra files needed so you can use \PS fonts with \LaTeX\ and \TeX.
+It can read in \afm files, and produces the necessary \vpl, \pl,
+and \fd files to use the fonts (the human-readable \vpl and \pl
+files produced by \fontinst are turned into the machine-readable
+\vf and \tfm forms by \vptovf and \pltotf). It does not help you
+configure your DVI driver.
+
+There also exists a \texttt{perl} front-end to \fontinst, intended
+specifically for use with a Unix \TeX\ system, which takes care of
+routine tasks such as running \vptovf and \pltotf on the generated
+files after \fontinst has finished it's job. It also generates a
+font map file for use with \dvips.
+
+\Fontinst's main job is creating \vf files (virtual fonts). Not
+all \TeX\ systems can use them. As far as I know, all current
+(1998) free and shareware \TeX\ systems can; virtual fonts have
+been in widespread use with \TeX\ since 1990. If you have a TeX
+system that can't use virtual fonts, \fontinst is most likely
+useless to you.
+
+There are some nice things about having a tool written in \TeX\ to
+do this: it's completely portable and you can modify its behaviour
+using \TeX\ commands. The only real problem is that it's
+relatively slow: you can expect a typical \fontinst run to take
+something like 10--20 minutes on, say, a 40~MHz 80486SX PC or a
+25~MHz 68LC040 Macintosh.
+
+\Fontinst can do its work on any font for which you have a
+corresponding \afm or \tfm metric file, so it's not limited to
+working with \PS fonts; I have used it to produce the files I
+needed to use \TT fonts with \LaTeX. Whether or not you can do
+this depends on whether or not you have suitable metric files and
+whether or not your \TeX\ system can use \TT fonts. In
+particular, the pdf\TeX\ program supports \TT fonts and includes a
+utility \texttt{ttf2afm} to generate \afm files from \ttf fonts.
+
+Some people have used \fontinst to produce `special effects' with
+normal \TeX\ fonts. One example is the \setpackagename{eco} set
+of fonts (available from CTAN:
+\url{ftp://ftp.tex.ac.uk/tex-archive/fonts/eco/}). These fonts
+are the same as the standard EC (European Modern) fonts, but with
+normal numerals replaced with old style numerals --
+\oldstylenums{12345} rather than 12345 -- everywhere except in
+maths mode.
+
+\subsection{Installation}
+
+To install \fontinst, put the contents of the \url{inputs/tex},
+\url{inputs/etx}, \url{inputs/mtx} and \url{examples} directories
+into a directory read by \TeX, for example
+\url{TEXMF/tex/generic/fontinst}.
+
+When you use \fontinst, you need to make sure that the \afm and
+\pl files it will work on are in a directory searched by \TeX.
+
+If you are using \texttt{web2c} \TeX\ on a Unix system with the
+\TeX\ directory structure (TDS), you might put all the \afm files
+in subdirectories of \url{TEXMF/fonts/afm/*}. And then say:
+\begin{verbatim}
+ setenv TEXINPUTS $TEXMF/fonts/afm//::
+\end{verbatim}%$
+Note that \pl files are not normally kept in \TeX\ installations, so
+if you want to use MF fonts with \fontinst you have to generate the
+corresponding \pl files from \tfm files and put them in your working
+directory before running \fontinst.
+
+You could adopt a similar strategy with other \TeX\ systems:
+create directories for the required files and then change the
+relevant parameter (\url{input_folders} in the default
+configuration file with \OzTeX, for example).
+
+The approach I use is this: I write a file containing commands for
+\fontinst to process, and put the \afm and \pl files needed in the
+same directory as that file. When \fontinst has finished working,
+I delete the \afm and \pl files because they are not needed and
+waste space on my hard disc drive. Some application programs on
+some computers need \afm files, so it's not always a good idea to
+remove them completely.
+
+\subsection{Why do we need \fontinst?}
+
+\TeX\ refers to characters by number when it's typesetting. When
+you use a command like \verb|\i|, \TeX\ puts a number (16 if
+you're using OT1, 25 if you're using T1) into the \dvi file. If
+you're using a font designed for use with \TeX, this number will
+correspond to the character `\i'. Assuming OT1 encoding for the
+moment, when you come to print out your \dvi file, the DVI driver
+will see the number 16 in the \dvi file, and select the character
+that sits in position 16 of the corresponding printer font file (a
+\pk file in the case of normal \TeX\ fonts). Unless something has
+gone wrong, that will result in the character `\i' being placed on
+the page.
+
+It's useful to think of these numbers and the actual characters
+corresponding to each number as sets called `encodings'. A
+particular set of characters are assigned particular numbers. An
+example of an encoding is shown in table~\ref{OT1table}.
+
+\TeX\ began life using 7-bit fonts. This means the original \TeX\
+fonts used the numbers 0--127 to represent characters:
+128~characters per font. \TeX\ can now use 8-bit fonts:
+256~numbers from 0--255, but even so, most typesetting with \TeX\
+still uses the original 7-bit encoding, now called `OT1' (Old
+\TeX~1 encoding). This has a correspondance between numbers and
+characters shown in table~\ref{OT1table}. The numbers used in
+that table are hexadecimal and octal because it makes for a neat
+table and anyway I stole the code to generate it from Donald Knuth
+and that's how he did it.
+
+\begin{table}[!t]
+\smallfontchart{cmr10 at 10pt}
+\caption{The OT1 font encoding}\label{OT1table}
+\end{table}
+
+Returning to the example above, if you've a number 16 in your \dvi
+file (expecting `\i', a dotless~i), but rather than printing
+with an OT1 encoded font, you print using a non re-encoded \PS
+font in Adobe standard encoding, you'll get a blank, because the
+Adobe standard encoding has nothing in that character position.
+
+There are several ways round this problem; I'll consider two cases
+here. If you are using \LaTeX\ you can tell it about a new
+encoding and re-define the commands that produce characters like
+`\i' that live in different positions in different encodings, or
+you can use a tool to re-encode the font so that it has the
+expected characters in the appropriate positions.
+
+Re-encoding is the approach \fontinst uses: it can produce files
+to map the characters in the new font to one of \TeX's existing
+encodings; this works with formats other than \LaTeX.
+
+The first approach is used to define the standard encodings that
+\LaTeX\ uses. See, for example, the file \texttt{ot1enc.def} that
+comes with the current \LaTeX\ distribution, which defines the a
+few commands that refer to characters which aren't in the
+positions \TeX\ would otherwise assume. This works only with
+modern versions of \LaTeX.
+
+The second approach is used to allow you to use fonts in other
+encodings with any dialect of \TeX. It has the some advantages
+over the first method: it works with any \TeX\ format; and it
+improves portability, because you can typeset a document using a
+standard \TeX\ encoding, sure that the same document will print
+correctly on a different kind of computer using a font with a
+different encoding. For example, you might say:
+\begin{verbatim}
+ \usepackage{times}
+\end{verbatim}
+in the preamble of your document. On my computer, that means my
+DVI driver will use a Macintosh encoded \TT version of Times. On
+your computer, it might mean the dvi driver will use a Unicode
+encoded \PS version of Times-Roman. The results will be identical
+in either case, without needing to modify the document.
+
+\subsection{How do you use \fontinst?}
+
+\Fontinst works on \afm files named (more-or-less) according to
+Karl Berry's font naming scheme (see
+\url{ftp://ftp.tex.ac.uk/tex-archive/info/fontname} at CTAN).
+Let's say you want to use the Adobe Times fonts. You can get the
+metric files for this font from CTAN:
+\begin{center}
+\begin{small}
+\begin{tabular}{ll}
+ \emph{Location of file at CTAN} & \emph{Rename to} \\
+ \url{fonts/psfonts/adobeafm/base35/tib_____.afm} &
+ \texttt{ptmb8a.afm} \\
+ \url{fonts/psfonts/adobeafm/base35/tibi____.afm} &
+ \texttt{ptmbi8a.afm} \\
+ \url{fonts/psfonts/adobeafm/base35/tii_____.afm} &
+ \texttt{ptmri8a.afm} \\
+ \url{fonts/psfonts/adobeafm/base35/tir_____.afm} &
+ \texttt{ptmr8a.afm}
+\end{tabular}
+\end{small}
+\end{center}
+The new name is the name you should give the \tfm files so that
+\fontinst understands what each file contains. The initial `|p|'
+means `Adobe'; `|tm|' means `Times'; `|b|' bold, `|r|' roman,
+`|i|' italic; and `|8a|' means `Adobe standard encoding'.
+
+The simplest use of \fontinst is to put the four \afm files in the
+same directory as \texttt{fontinst.sty} and run \TeX\ on
+\texttt{fontinst.sty}. At the \verb|*| prompt type:
+\begin{verbatim}
+ *\latinfamily{ptm}{} \bye
+\end{verbatim}
+
+Some time later (about 17 minutes on my rather old computer),
+\fontinst will have finished, having created:
+\begin{itemize}
+\item Two \pl files for each \afm file
+\item One \vpl file for each \TeX\ font
+\item One \fd file for each family
+\end{itemize}
+The \pl files come in pairs: for example, \texttt{ptmb8a.pl} and
+\texttt{ptmb8r.pl}. The |8a| version has the same encoding as the
+original font; the |8r| version is re-encoded to |TeXBase1| (|8r|)
+encoding, and is the font that is the base on which the T1 and OT1
+encoded versions are based on. The raw |8a| (Adobe standard)
+encoded font is not normally used.
+
+These can be converted to \TeX\ fonts using \pltotf or \vptovf.
+If you have \OzTeX, launch \OzMF, select \pltotf (or \vptovf) from
+the Tools menu, and say `Do all files'.
+
+If you use the \texttt{bash} shell on a Unix system, you can
+process all files using these one-liners at the \verb|$| prompt:
+\begin{verbatim}
+ $ for f in in *.pl; do pltotf $f; done
+ $ for f in in *.vpl; do vptovf $f; done
+\end{verbatim}%$
+(This assumes that \pltotf and \vptovf can deduce the file names
+of the corresponding \tfm and \vf files automatically.)
+
+You should then:
+\begin{itemize}
+\item Move the \tfm files to your \TeX\ fonts directory\\
+ (e.g.~\url{TEXMFLOCAL/fonts/tfm/*}).
+\item Move the \vf files to your virtual fonts directory\\
+ (e.g.~\url{TEXMFLOCAL/fonts/vf/*}).
+\item Move the \fd files to your \TeX\ inputs directory\\
+ (e.g.~\url{TEXMFLOCAL/tex/latex/psfonts/*}).
+\end{itemize}
+If your \TeX\ installation is organized using the \TeX\ directory
+structure (TDS), it is customary to subdivide the \tfm and \vf
+files into subdirectories by supplier and typeface name.
+
+The \pl, \vpl, and \mtx files are debris that can now be deleted.
+\mtx files are font metric files \fontinst creates for its own use
+from \afm and \pl files. They're just more convenient for \TeX\
+to read than other forms -- think of them as \fontinst readable
+\afm and \pl files.
+
+By now, you have all the files in place to produce a \dvi file
+using the new fonts. You can make Adobe Times the default roman
+font in your document by putting this in your preamble:
+\begin{verbatim}
+ \renewcommand{\rmdefault}{ptm}
+\end{verbatim}
+
+\TeX\ will now happily produce a perfectly good \dvi file
+including the new font, which your DVI driver will choke on
+because you've not yet told it about the new fonts. Exactly how
+you do this depends on the dvi driver, but they all need the same
+information: the name of a \TeX\ font; the printer font name it
+corresponds to; some information to handle an re-encoding needed;
+and (in the case of a \PS driver) perhaps an instruction to
+download the font to the printer. You don't need to download the
+Times font to a \PS printer, because Times is built in to every
+\PS printer.
+
+If you use \dvips, these lines added to your \texttt{psfonts.map}
+file will do the job:
+\begin{verbatim}
+ ptmr8r Times-Roman "TeXBase1Encoding ReEncodeFont" <<8r.enc
+ ptmri8r Times-Italic "TeXBase1Encoding ReEncodeFont" <<8r.enc
+ ptmb8r Times-Bold "TeXBase1Encoding ReEncodeFont" <<8r.enc
+ ptmbi8r Times-BoldItalic "TeXBase1Encoding ReEncodeFont" <<8r.enc
+ ptmro8r Times-Roman "0.167 SlantFont TeXBase1Encoding ReEncodeFont" <<8r.enc
+ ptmbo8r Times-Bold "0.167 SlantFont TeXBase1Encoding ReEncodeFont" <<8r.enc
+\end{verbatim}
+And now you can print a \dvi file containing the new fonts. If
+you really do want to use the `raw' |8a| encoded fonts for some
+reason, you need to add these lines to your \texttt{psfonts.map}
+file:
+\begin{verbatim}
+ ptmr8a Times-Roman
+ ptmri8a Times-Italic
+ ptmb8a Times-Bold
+ ptmbi8a Times-BoldItalic
+ ptmro8a Times-Roman "0.167 SlantFont"
+ ptmbo8a Times-Bold "0.167 SlantFont"
+\end{verbatim}
+
+Assuming that you're using the \fd file that \fontinst has
+produced, and that you've asked for the Adobe Times family (|ptm|)
+in medium series (|m|) and upright shape (|n| for normal) using
+the NFSS font selection commands:
+\begin{verbatim}
+ \renewcommand{\rmdefault}{ptm}
+ \rmfamily \mdseries \upshape
+\end{verbatim}
+Assuming further that you are using the \fd file \texttt{t1ptm.fd}
+produced by \fontinst, the \TeX\ font (\tfm file) \texttt{ptmr8t.tfm}
+will be selected by the above commands, as you can see from the
+relevant line in \texttt{t1ptm.fd}:
+\begin{verbatim}
+ \DeclareFontShape{T1}{ptm}{m}{n}{<<->> ptmr8t}{}
+\end{verbatim}
+
+This is what happens:
+\begin{itemize}
+\item \TeX\ typesets your document using the font metric file
+ \texttt{ptmr8t.tfm}; this is the font that is put in the \dvi
+ file.
+\item \Dvips looks at the \dvi file, and sees a reference to the
+ font \texttt{ptmr8t}.
+\item \Dvips searches for a \vf file corresponding to
+ \texttt{ptmr8t}; when it finds \texttt{ptmr8t.vf}, it knows it
+ has a virtual font on its hands.
+ %\footnote{This is a slight lie--why?}
+\item \Dvips follows the instructions in the \vf file, which map
+ characters in \texttt{ptmr8t.tfm} to characters in the font
+ \texttt{ptmr8r.tfm}. That is, when it sees a number~25 in the
+ \dvi file (dotless~i -- `\i' -- in T1 encoding), it replaces it
+ with a number~17, which is a dotless~i in |8r| encoding.
+\item Then \dvips looks up the name of each number according to
+ the scheme given in the file \texttt{8r.enc}, and replaces each
+ number with the name of the character, in this case, number~17
+ is listed as `dotlessi'.
+\item And finally, \dvips tells the printer to print the named
+ character.
+\end{itemize}
+
+Not all DVI drivers can manage re-encoding as well as \dvips can.
+For example, \OzTeX's built-in non-\PS \dvi driver can only work
+with numbers, so if I'm using a \PS font, I can't print characters
+(such as Eth) that don't have a number in Macintosh text encoding
+unless I use \dvips and print on a \PS printer. \Dvips works with
+character names, so it's not subject to this restriction. In the
+example above, \OzTeX\ would replace the number~17 for `dotlessi'
+in |8r| encoding with a number~245 for `dotlessi' in Macintosh
+text encoding.
+
+The details of the \LaTeXe{} font selection scheme are described
+in \emph{\LaTeXe{} font selection} (distributed with \LaTeXe\ as
+the file \texttt{fntguide.tex}) and \emph{The \LaTeX\ Companion}
+(Goossens, Mittelbach and Samarin, Addison-Wesley).
+%You might also find useful the file \url{info/simple-nfss.tex}
+%available at your nearest comprehensive \TeX\ archive network
+%(CTAN) FTP server.
+
+The files you need to use Times, Helvetica, Courier, and the rest
+of the `standard' \PS fonts are distributed as part of the
+\setpackagename{PSNFSS} bundle available from CTAN, so there's no
+need to create new files to use these fonts.
+
+A more involved example of \fontinst use can be seen in the file
+\texttt{fontptcm.tex} which creates the files you need to use a
+combination of Times, Symbol, Zapf Chancery and Computer Modern as
+\TeX\ math fonts.
+
+
+\section{Installing your own font family}
+
+The \fontinst package has a command \verb|\latinfamily| meant to
+do most of the work to install a `normal' set (family) of roman
+text fonts from Adobe. Assuming you have a set of \afm files to
+match the fonts you wish to use, the first step is to rename the
+\afm files according to the \Fontnamekb naming scheme.
+
+A `normal' set of text fonts usually includes the basic upright
+roman version, bold, italic, and bold italic. Sometimes there
+will also be small caps versions, perhaps some `expert' fonts, and
+maybe some other weights such as light, medium, semi bold, black
+or ultra bold.
+
+The most important point to note is this: no matter what sort of
+computer you're using and no matter what font encoding it uses
+normally, \afm files for text fonts are almost always in |8a|
+encoding (Adobe standard encoding), so the \afm files when renamed
+normally end in |8a|.
+
+A typical set of four \afm files re-named for use with \fontinst
+is this:
+\begin{verbatim}
+ ptmr8r.afm Times-Roman
+ ptmri8r.afm Times-Italic
+ ptmb8r.afm Times-Bold
+ ptmbi8r.afm Times-BoldItalic
+\end{verbatim}
+Not all \afm files use |8a| encoding. If you open an \afm file
+using a text editor, you'll see a line looking like this somewhere
+near the top:
+\begin{verbatim}
+ EncodingScheme AdobeStandardEncoding
+\end{verbatim}
+and if you see exactly that, the \afm file should end with |8a|.
+If you see something like this:
+\begin{verbatim}
+ EncodingScheme FontSpecific
+\end{verbatim}
+have a look at the name of the font in the \afm file. If you see
+something like this:
+\begin{verbatim}
+ FontName AGaramondExp-Regular
+ FullName Adobe Garamond Regular Expert
+\end{verbatim}
+you have an `expert' encoded font on your hands, and the \afm file
+should end with |8x| to indicate this to \fontinst. An |8x|
+encoded font contains extra glyphs like old style numerals, small
+capital letters, more ligatures, and so on.
+
+%% UV: taken out -- repeated below
+%%
+%If you have an expert font, you can tell \fontinst to use it when
+%it's processing a \verb|\latinfamily| command by putting an `|x|'
+%on the end of the family name:
+%\begin{verbatim}
+% \latinfamily{padx}{}
+%\end{verbatim}
+%If you want to tell \fontinst to use expert fonts to install fonts
+%with old style numerals, you can do so by putting an `|j|' on the
+%end of the family name:
+%\begin{verbatim}
+% \latinfamily{padj}{}
+%\end{verbatim}
+
+The |\latinfamily| command is used like this:
+\begin{decl}
+ |\latinfamily|\arg{family}\arg{commands}
+\end{decl}
+This installs a Latin family of fonts.
+
+For example, to install Adobe Times, you say:
+\begin{verbatim}
+ \latinfamily{ptm}{}
+\end{verbatim}
+The \textit{commands} issued by \LaTeX\ each time a font from that
+family is loaded. This is most often used with typewriter fonts,
+to switch off hyphenation. For example, Adobe Courier can be
+installed with:
+\begin{verbatim}
+ \latinfamily{pcr}{\hyphenchar\font=-1}
+\end{verbatim}
+Once the installation is over (which may take some time) the fonts
+can be used in \LaTeX\ by selecting an appropriate
+\verb|\fontfamily|, for example Adobe Times can be selected with:
+\begin{verbatim}
+ \fontfamily{ptm}\selectfont
+\end{verbatim}
+If the fourth letter of the family name is `|x|' then \fontinst
+will use expert fonts in creating the fonts. If the fourth letter
+is `|j|' (or for backward compatibility `|9|') then \fontinst will
+use expert fonts to create fonts with old style digits.
+
+For example, to install Adobe Garamond using expert fonts, you say:
+\begin{verbatim}
+ \latinfamily{padx}{}
+\end{verbatim}
+To install Adobe Garamond using expert fonts with oldstyle digits,
+you say:
+\begin{verbatim}
+ \latinfamily{padj}{}
+\end{verbatim}
+
+When you have expert fonts, and you've told \fontinst to use
+them, it will carry on as normal, but the resulting font family
+will have the name `|padx|' or `|padj|', and it will use expert
+glyphs whenever possible, so you'll have a real (rather than
+faked) small caps font, real (rather than faked) `ffl' ligatures,
+and so on.
+
+Before using these commands, you will need to make sure that you
+have the Adobe Font Metric (\afm) files for the fonts, and that
+they have appropriate names. The \fontinst package uses the
+\LaTeX\ convention for naming fonts, and uses a \emph{font family}
+name which consists of:
+\begin{itemize}
+\item a \emph{supplier} (or foundry), such as `|p|' for Adobe.
+\item a \emph{typeface}, such as `|ad|' for Adobe Garamond.
+\item up to two \emph{variants}, such as `|j|' or `|x|' for `old
+ style digits' or `expert'.
+\end{itemize}
+So the family name `|padj|' indicates Adobe Garamond with old
+style digits. Note that the variants `|j|' or `|x|' are
+interpreted by \fontinst itself and do not appear in external font
+names, whereas other variants are passed through as part of the
+font names. (This is needed for families which have a sans serif
+or typewriter variant.)
+
+The \emph{supplier} must be one letter, and the \emph{typeface}
+must be two (this is an attempt to fit all filenames into MS-DOS
+format). Each variant is one letter. The full list of foundries,
+typefaces, shapes and variants is given in Karl Berry's
+`\emph{Filenames for fonts}' (available by anonymous FTP from
+\url{ftp://ftp.tex.ac.uk/tex-archive/info/fontname}), but the more
+common ones are given in
+Tables~\ref{Tab:foundry}--\ref{Tab:typeface}.
+
+\begin{table}[!t]
+\begin{minipage}{0.5\textwidth}
+ \small
+ \begin{tabular}{ll}
+ |b| & Bitstream \\
+ |f| & `free' (public domain) \\
+ |h| & Bigelow \& Holmes \\
+ |i| & ITC \\
+ |l| & Linotype \\
+ |m| & Monotype \\
+ |p| & Adobe (|p| for \PS) \\
+ |r| & `raw' (obsolete) \\
+ |u| & URW \\
+ |z| & bizarre
+ \end{tabular}
+ \caption{A partial list of foundries}
+ \label{Tab:foundry}
+ \begin{tabular}{ll}
+ |a| & alternate \\
+ |d| & display, titling \\
+ |f| & fraktur, handtooled \\
+ |j| & oldstyle digits \\
+ |n| & informal, casual \\
+ |p| & ornaments \\
+ |s| & sans serif \\
+ |t| & typewriter \\
+ |w| & script, handwriting, swash \\
+ |x| & expert \\
+ \end{tabular}
+ \caption{A partial list of variants}
+ \label{Tab:variant}
+ \begin{tabular}{ll}
+ |c| & small caps \\
+ |i| & italic \\
+ |o| & oblique (i.e.,~slanted) \\
+ |u| & unslanted italic \\
+ \end{tabular}
+ \caption{A partial list of shapes}
+ \label{Tab:shape}
+\end{minipage}
+\begin{minipage}{0.5\textwidth}
+ \small
+ \begin{tabular}{ll}
+ |ac| & Adobe Caslon \\
+ |ad| & Adobe Garamond \\
+ |ag| & Avantgarde \\
+ |bb| & Bembo \\
+ |bd| & Bodoni \\
+ |bk| & Bookman \\
+ |bv| & Baskerville \\
+ |ca| & Caslon \\
+ |ch| & Charter \\
+ |cr| & Courier \\
+ |fr| & Frutiger \\
+ |fu| & Futura \\
+ |gl| & Galliard \\
+ |gm| & Garamond \\
+ |gs| & Gill Sans \\
+ |hv| & Helvetica \\
+ |mn| & Minion \\
+ |lc| & Lucida \\
+ |lh| & Lucida Bright \\
+ |ls| & Lucida Sans \\
+ |nb| & New Baskerville \\
+ |nc| & New Century Schoolbook \\
+ |op| & Optima \\
+ |pl| & Palatino \\
+ |sy| & Symbol \\
+ |tm| & Times \\
+ |ut| & Utopia \\
+ |zc| & Zapf Chancery \\
+ |zd| & Zapf Dingbats \\
+ \end{tabular}
+ \caption{A partial list of faces}
+ \label{Tab:typeface}
+\end{minipage}
+\end{table}
+
+The \fontinst package uses Karl Berry's naming scheme for \afm
+files. The full naming scheme is rather more flexible than the
+subset used by \fontinst, which uses filenames consisting of:
+\begin{itemize}
+\item a \emph{supplier}, such as `|p|' for Adobe.
+\item a \emph{typeface}, such as `|hv|' for Helvetica.
+\item a \emph{weight}, such as `|r|' for regular.
+\item up to two \emph{shapes} or \emph{variants}, such as `|o|'
+ for oblique.
+\item an \emph{encoding}, such as `|7t|' for Knuth's 7-bit \TeX{}
+ encoding.
+\item an optional \emph{width}, such as `|n|' for narrow.
+\item a \emph{file extension}, such as `\texttt{.tfm}'
+ for \TeX{} Font Metric.
+\end{itemize}
+So the filename name `\texttt{phvro7tn.tfm}' indicates Adobe
+Helvetica regular oblique narrow, in the 7-bit \TeX{} encoding.
+
+The full list of shapes, encodings and weights is given in Karl
+Berry's `\emph{Filenames for fonts}', but the more common ones are
+given in Tables~\ref{Tab:shape}--\ref{Tab:weight}.
+
+\begin{table}
+\begin{minipage}{0.5\textwidth}
+ \small
+ \begin{tabular}{ll}
+ |b| & bold \\
+ |c| & black \\
+ |d| & demibold \\
+ |h| & heavy \\
+ |k| & book \\
+ |l| & light \\
+ |m| & medium \\
+ |r| & regular \\
+ |s| & semibold \\
+ |u| & ultra bold \\
+ |x| & extra bold \\
+ \end{tabular}
+ \caption{A partial list of weights}
+ \label{Tab:weight}
+ \begin{tabular}{ll}
+ |c| & condensed \\
+ |n| & narrow \\
+ |w| & wide \\
+ |x| & extended \\
+ \end{tabular}
+ \caption{A partial list of widths}
+ \label{Tab:width}
+\end{minipage}
+\begin{minipage}{0.5\textwidth}
+ \small
+ \begin{tabular}{ll}
+ |8a| & Adobe Standard \\
+ |8x| & Adobe Expert \\
+ |8r| & \TeX{} 8-bit `raw' (\texttt{TeXBase1}) \\
+ |8y| & \TeX{} 8-bit `raw' (\texttt{TeXnANSI}) \\
+ |7t| & \TeX{} 7-bit text (\texttt{OT1}) \\
+ |7m| & \TeX{} 7-bit math italic (\texttt{OML}) \\
+ |7y| & \TeX{} 7-bit math symbol (\texttt{OMS}) \\
+ |7v| & \TeX{} 7-bit math extension (\texttt{OMX}) \\
+ |8t| & \TeX{} 8-bit text (\texttt{T1}) \\
+ |8c| & \TeX{} 8-bit text symbols (\texttt{TS1}) \\
+ |9t| & \TeX{} 7-bit text with expert glyphs \\
+ |9o| & \TeX{} 7-bit text with expert glyphs \\
+ & and old-style digits \\
+ |9e| & \TeX{} 8-bit text with expert glyphs \\
+ |9d| & \TeX{} 8-bit text with expert glyphs \\
+ & and old-style digits \\
+ |9c| & \TeX{} 8-bit symbols with expert glyphs \\
+ & and old-style digits \\
+ \end{tabular}
+ \caption{A partial list of encodings}
+\end{minipage}
+\end{table}
+
+For example, to install Adobe Garamond including the expert fonts, you
+would need to rename the \afm files:
+\begin{center}
+\begin{small}
+\begin{tabular}{lll}
+ \emph{Adobe name} & \emph{ATM name} & \emph{Fontinst name} \\
+ |AGaramond-Bold.afm| & |gdb_____.afm| & |padb8a.afm| \\
+ |AGaramond-BoldItalic.afm| & |gdbi____.afm| & |padbi8a.afm| \\
+ |AGaramond-Italic.afm| & |gdi_____.afm| & |padri8a.afm| \\
+ |AGaramond-Regular.afm| & |gdrg____.afm| & |padr8a.afm| \\
+ |AGaramond-Semibold.afm| & |gdsb____.afm| & |pads8a.afm| \\
+ |AGaramond-SemiboldItalic.afm| & |gdsbi___.afm| & |padsi8a.afm| \\
+ |AGaramondExp-Bold.afm| & |geb_____.afm| & |padb8x.afm| \\
+ |AGaramondExp-BoldItalic.afm| & |gebi____.afm| & |padbi8x.afm| \\
+ |AGaramondExp-Italic.afm| & |gei_____.afm| & |padri8x.afm| \\
+ |AGaramondExp-Regular.afm| & |gerg____.afm| & |padr8x.afm| \\
+ |AGaramondExp-Semibold.afm| & |gesb____.afm| & |pads8x.afm| \\
+ |AGaramondExp-SemiboldItalic.afm| & |gesbi___.afm| & |padsi8x.afm| \\
+ |AGaramond-RegularSC.afm| & |gdsc____.afm| & |padrc8a.afm| \\
+ |AGaramond-SemiboldSC.afm| & |gdsbs___.afm| & |padsc8a.afm| \\
+\end{tabular}
+\end{small}
+\end{center}
+You can then run \TeX{} on the following document to install the
+Adobe Garamond family:
+\begin{verbatim}
+ \input fontinst.sty
+ \latinfamily{padx}{}
+ \latinfamily{padj}{}
+ \bye
+\end{verbatim}
+Not all font families can be installed using the \verb|\latinfamily|
+command, nor does it always produce optimal results. The main
+interfaces to \fontinst are at a slightly lower level, where all font
+names appear explicitly in command arguments, and at that level it is
+possible to fine tune the font generation. The \verb|\latinfamily|
+command is mainly a clever collection of macros which expand to a
+mostly fixed\footnote{Commands that would refer to files which are
+not present are skipped, and in some cases there is a ``Plan B''
+when ``Plan A'' would have made use of such a nonexistent file, but
+that is about it.} sequence of lower level \fontinst commands.
+
+\begin{bfseries}
+ Descriptions of the sub-\verb|\latinfamily| commands can be found
+ in the main \fontinst manual.
+\end{bfseries}
+
+
+
+\section{More on the \cs{latinfamily} command}
+
+The \verb|\latinfamily| command is essentially a short-cut to save you
+preparing a huge file with many different \fontinst commands in it.
+
+It takes \afm or \mtx files as the source of font metric data to work
+with. Usually, you have a set of \afm files. They must be named
+according to a subset of the \Fontnamekb naming scheme. To illustrate
+the process, here is an edited part of the console log from a use of
+\verb|\latinfamily|:
+\begin{verbatim}
+ \latinfamily{pad}{}
+\end{verbatim}
+This log does not show \fontinst `in action'; it's just to illustrate
+which fonts are looked for when you use the \verb|\latinfamily|
+command.
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,m,n,>> seek padr8r.mtx
+ INFO>> to make LaTeX font shape <<pad,m,sc,>> seek padrc8r.mtx
+ INFO>> to make LaTeX font shape <<pad,m,sl,>> seek padro8r.mtx
+ INFO>> to make LaTeX font shape <<pad,m,it,>> seek padri8r.mtx
+ INFO>> to make LaTeX font shape <<pad,m,n,c>> seek padr8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,m,sc,c>> seek padrc8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,m,sl,c>> seek padro8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,m,it,c>> seek padri8rn.mtx
+\end{verbatim}
+
+The important point to notice is that \fontinst needs an |8r| encoded
+\mtx file for each font when you are using the \verb|latinfamily|
+command. If it can't find an |8r| encoded \mtx file, it'll look for
+for an |8a| encoded \afm file. It will automatically turn the file it
+finds into an |8r| encoded \mtx file. So when \fontinst says
+`\verb|seek padr8r.mtx|', it is in fact looking for
+\texttt{padr8r.mtx} and \texttt{padr8a.afm}. Whatever it finds, it
+will end up with \verb|padr8r.mtx| to work on.
+
+The first line of the log shows that \fontinst is trying to create a
+\vpl file for |pad/m/n|. That is, font family |pad| (Adobe Garamond),
+font series |m| (normal `book' or `regular' weight), and font shape
+|n| (normal upright).
+
+If it finds what it's looking for, it will create the files:
+\begin{verbatim}
+ padr7t.vpl
+ padr8t.vpl
+ padr8c.vpl
+\end{verbatim}
+And add these lines to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{m}{n}{<<->> padr7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{m}{n}{<<->> padr8t}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{m}{n}{<<->> padr8c}{}
+\end{verbatim}
+This means you will have three new fonts to use in \LaTeX: the OT1, T1
+and TS1 encoded versions of |pad/m/n|. You'll be able to select (say)
+|T1/pad/m/n| by saying:
+\begin{verbatim}
+ \fontencoding{T1}\fontfamily{pad}\fontseries{m}\fontshape{n}\selectfont
+\end{verbatim}
+This is the clumsiest way of selecting that particular font, but I've
+done it to illustrate exactly what's happening.
+
+The next line:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,m,sc,>> seek padrc8r.mtx
+\end{verbatim}
+shows that \fontinst is trying to install a small caps font. If you
+have a real small caps metric file named \texttt{padrc8r.mtx} (don't
+forget it'll look for an |8a| encoded \afm file), \fontinst will go
+ahead and create the \vpl file and \fd file entry as expected.
+
+But you don't normally have a real small caps font, so \fontinst will
+quite happily produce a fake small caps font. To do this, it looks
+for a suitable metric file by dropping the `|c|':
+\begin{quote}
+ `Hmm\ldots\ I can't find \texttt{padrc8r}, so I'll look for
+ \texttt{padr8r}.'
+\end{quote}
+And you will eventually have:
+\begin{verbatim}
+ padrc7t.vpl
+ padrc8t.vpl
+\end{verbatim}
+And add these lines to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{m}{sc}{<<->> padrc7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{m}{sc}{<<->> padrc8t}{}
+\end{verbatim}
+(Note that it won't install a TS1-encoded small caps font because
+TS1 is a text symbol font, which would look the same in the upright
+and small caps shape.)
+
+The next log line shows \fontinst trying to create a \vpl for the
+oblique version of Adobe Garamond:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,m,sl,>> seek padro8r.mtx
+\end{verbatim}
+It's quite usual for an oblique version to be unavailable, but
+\fontinst has a way round this: it can fake an oblique font from the
+corresponding `straight' version:
+\begin{quote}
+ `Oh dear: I can't find \texttt{padro8r}, so I'll look for
+ \texttt{padr8r} and use clever maths to fake a slanted version.'
+\end{quote}
+This is not as straightforward as the small caps case. \Fontinst
+only works out what the metrics ought to be if the entire font is
+slanted to the right. It's up to the DVI driver to actually print a
+slanted font. \Dvips can do this.
+
+You will eventually have:
+\begin{verbatim}
+ padro7t.vpl
+ padro8t.vpl
+ padro8c.vpl
+\end{verbatim}
+And these lines added to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{m}{sl}{<<->> padro7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{m}{sl}{<<->> padro8t}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{m}{sl}{<<->> padro8c}{}
+\end{verbatim}
+
+The next line is straightforward:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,m,it,>> seek padri8r.mtx
+\end{verbatim}
+If \fontinst can't find a suitable metrics file (\texttt{padri8r.mtx}
+or \texttt{padri8a.afm}), it carries on without doing anything. If it
+does find a suitable metrics file, it churns away until you will
+eventually have:
+\begin{verbatim}
+ padri7t.vpl
+ padri8t.vpl
+ padri8c.vpl
+\end{verbatim}
+And these lines added to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{m}{it}{<<->> padri7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{m}{it}{<<->> padri8t}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{m}{it}{<<->> padri8c}{}
+\end{verbatim}
+
+The next line is a bit different. \Fontinst is now trying to create a
+\vpl file for a \emph{condensed} font:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,m,n,c>> seek padr8rn.mtx
+\end{verbatim}
+If it finds a suitable metric file (Adobe Garamond, medium weight,
+normal upright shape, condensed), it will eventually produce:
+\begin{verbatim}
+ padr7tn.vpl
+ padr8tn.vpl
+ padr8cn.vpl
+\end{verbatim}
+And these lines added to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{mc}{n}{<<->> padr7tn}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{mc}{n}{<<->> padr8tn}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{mc}{n}{<<->> padr8cn}{}
+\end{verbatim}
+There is no standard \LaTeX\ command like \verb|\bfseries| to select
+the medium condensed (|mc|) series created here. If you want to use
+this font, you must do something like:
+\begin{verbatim}
+ \fontfamily{pad}\fontseries{mc}\selectfont
+\end{verbatim}
+If it doesn't find a suitable metric file for a narrow series,
+\fontinst will just skip over and continue, unless you specifically
+tell it to fake a narrow series.
+
+And so the process continues: \fontinst attempts to create \vpl files
+for condensed versions of all the font shapes met so far, and then
+goes on to:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,b,n,>> seek padb8r.mtx
+\end{verbatim}
+And again, if it finds a suitable metric file (\texttt{padb8r.mtx} or
+\texttt{padb8a.afm}), it'll potter off and create the files:
+\begin{verbatim}
+ padb7t.vpl
+ padb8t.vpl
+ padb8c.vpl
+\end{verbatim}
+And these lines added to the given \fd files:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{b}{n}{<<->> padb7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{b}{n}{<<->> padb8t}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{b}{n}{<<->> padb8c}{}
+\end{verbatim}
+With this step done, fontinst will try to create \vpl files for the
+small caps, slanted, and italic versions of |pad/b|; and then it'll
+try to create condensed versions of all those:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,b,n,>> seek padb8r.mtx
+ INFO>> to make LaTeX font shape <<pad,b,sc,>> seek padbc8r.mtx
+ INFO>> to make LaTeX font shape <<pad,b,sl,>> seek padbo8r.mtx
+ INFO>> to make LaTeX font shape <<pad,b,it,>> seek padbi8r.mtx
+ INFO>> to make LaTeX font shape <<pad,b,n,c>> seek padb8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,b,sc,c>> seek padbc8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,b,sl,c>> seek padbo8rn.mtx
+ INFO>> to make LaTeX font shape <<pad,b,it,c>> seek padbi8rn.mtx
+\end{verbatim}
+If it manages to find the files it needs to create the \vpl files to
+use all those fonts with \LaTeX, you'll end up with the following
+lines in the T1 \fd file (I've ignored the OT1 \fd file to save some
+space):
+\begin{verbatim}
+ \DeclareFontShape{T1} {pad}{b} {n} {<<->> padb8t}{}
+ \DeclareFontShape{T1} {pad}{b} {sc}{<<->> padbc8t}{}
+ \DeclareFontShape{T1} {pad}{b} {sl}{<<->> padbo8t}{}
+ \DeclareFontShape{T1} {pad}{b} {it}{<<->> padbi8t}{}
+ \DeclareFontShape{T1} {pad}{bc}{n} {<<->> padb8tn}{}
+ \DeclareFontShape{T1} {pad}{bc}{sc}{<<->> padbc8tn}{}
+ \DeclareFontShape{T1} {pad}{bc}{sl}{<<->> padbo8tn}{}
+ \DeclareFontShape{T1} {pad}{bc}{it}{<<->> pckbi8tn}{}
+\end{verbatim}
+To translate into English: Adobe Garamond bold in `normal', small
+caps, slanted, and italic versions, as well as condensed versions of
+all four.
+
+Again, because there's no convenient way of selecting the condensed
+versions with existing \LaTeX\ commands, you need to say something
+like:
+\begin{verbatim}
+ \fontfamily{pad}\fontseries{bc}\selectfont
+\end{verbatim}
+to use the bold condensed (|bc|) versions of this font; you can of
+course use \verb|\itshape|, \verb|\scshape|, \verb|\slshape|, and
+\verb|upshape| to switch between the italic, small caps, slanted, and
+`normal' versions of Adobe Garamond bold condensed once you've got
+|pad/bc| selected.
+
+So far, you've seen \verb|\latinfamily| look at two different weights
+and two different widths. For each weight, \verb|\latinfamily| will
+try and install eight different fonts as you can see above. It will
+try and install the same eight different fonts for each of the
+following different weights:
+\begin{center}
+\begin{tabular}{lll}
+ \emph{\LaTeX} & \emph{Fontname} & \emph{description} \\
+ |ul| & |a| & ultra light \\
+ |el| & |i| & extra light \\
+ |l| & |l| & light \\
+ |m| & |k|, |r| & book, regular \\
+ |mb| & |m| & medium \\
+ |db| & |d| & demi bold \\
+ |sb| & |s| & semi bold \\
+ |b| & |b| & bold \\
+ |eb| & |c|, |h|, |x| & black, heavy, extra bold \\
+ |ub| & |u| & ultra bold
+\end{tabular}
+\end{center}
+The \LaTeX\ column contains the label that will be used in the
+\verb|\DeclareFontShape| command to specify the font series. The
+\Fontnamekb column contains the width specifier used to name the font
+metric file that \fontinst will look for in that case.
+
+In other words, at some stage \fontinst will look for:
+\begin{verbatim}
+ INFO>> to make LaTeX font shape <<pad,sb,n,>> seek pads8r.mtx
+\end{verbatim}
+and if it finds a suitable metric file (\texttt{pads8r.mtx} or
+\texttt{pads8a.afm}), it will create:
+\begin{verbatim}
+ pads7t.vpl
+ pads8t.vpl
+ pads8c.vpl
+\end{verbatim}
+and \fd file entries like this:
+\begin{verbatim}
+ OT1pad.fd: \DeclareFontShape{OT1}{pad}{sb}{n}{<<->> pads7t}{}
+ T1pad.fd: \DeclareFontShape{T1} {pad}{sb}{n}{<<->> pads8t}{}
+ TS1pad.fd: \DeclareFontShape{TS1}{pad}{sb}{n}{<<->> pads8c}{}
+\end{verbatim}
+and since |sb| is not a normal \LaTeX\ font series, you'll need to use
+something like:
+\begin{verbatim}
+ \fontfamily{pad}\fontseries{sb}\selectfont
+\end{verbatim}
+to use this font.
+
+% For example, \verb|\latinfamily{ptm}{}| is
+% syntactic sugar for:
+% \begin{verbatim}
+% \transformfont{ptmr8r}{\reencodefont{8r}{\fromafm{ptmr8a}}}
+% \transformfont{ptmri8r}{\reencodefont{8r}{\fromafm{ptmri8a}}}
+% \transformfont{ptmb8r}{\reencodefont{8r}{\fromafm{ptmb8a}}}
+% \transformfont{ptmbi8r}{\reencodefont{8r}{\fromafm{ptmbi8a}}}
+% \transformfont{ptmro8r}{\slantfont{167}{\frommtx{ptmr8r}}}
+% \transformfont{ptmbo8r}{\slantfont{167}{\frommtx{ptmb8r}}}
+% \installfonts
+% \installfamily{T1}{ptm}{}
+% \installfamily{OT1}{ptm}{}
+% \installfont{ptmr8t}{ptmr8r,latin}{T1}{T1}{ptm}{m}{n}{}
+% \installfont{ptmr7t}{ptmr8r,latin}{OT1}{OT1}{ptm}{m}{n}{}
+% \installfont{ptmrc8t}{ptmr8r,latin}{T1c}{T1}{ptm}{m}{sc}{}
+% \installfont{ptmrc7t}{ptmr8r,latin}{OT1c}{OT1}{ptm}{m}{sc}{}
+% \installfont{ptmri8t}{ptmri8r,latin}{T1}{T1}{ptm}{m}{it}{}
+% \installfont{ptmri7t}{ptmri8r,latin}{OT1i}{OT1}{ptm}{m}{it}{}
+% \installfont{ptmro8t}{ptmro8r,latin}{T1}{T1}{ptm}{m}{sl}{}
+% \installfont{ptmro7t}{ptmro8r,latin}{OT1}{OT1}{ptm}{m}{sl}{}
+% \installfont{ptmb8t}{ptmb8r,latin}{T1}{T1}{ptm}{b}{n}{}
+% \installfont{ptmb7t}{ptmb8r,latin}{OT1}{OT1}{ptm}{b}{n}{}
+% \installfont{ptmbc8t}{ptmb8r,latin}{T1c}{T1}{ptm}{b}{sc}{}
+% \installfont{ptmbc7t}{ptmb8r,latin}{OT1c}{OT1}{ptm}{b}{sc}{}
+% \installfont{ptmbi8t}{ptmbi8r,latin}{T1}{T1}{ptm}{b}{it}{}
+% \installfont{ptmbi7t}{ptmbi8r,latin}{OT1i}{OT1}{ptm}{b}{it}{}
+% \installfont{ptmbo8t}{ptmbo8r,latin}{T1}{T1}{ptm}{b}{sl}{}
+% \installfont{ptmbo7t}{ptmbo8r,latin}{OT1}{OT1}{ptm}{b}{sl}{}
+% \endinstallfonts
+% \end{verbatim}
+
+
+The \texttt{basicex.tex} file in the \texttt{examples} directory of
+the main \fontinst distribution is an annotated command file which
+does roughly the same things as the \verb|\latinfamily| command for
+the \texttt{pad} family of fonts.
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/doc/manual/roadmap.eps b/fonts/utilities/fontinst/doc/manual/roadmap.eps
new file mode 100644
index 0000000000..8ca14df79d
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/manual/roadmap.eps
@@ -0,0 +1,265 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: roadmap.fig
+%%Creator: fig2dev Version 3.1 Patchlevel 1
+%%CreationDate: Sat Sep 16 18:24:06 1995
+%%For: alanje@rsuna.crn.cogs.susx.ac.uk (Alan Jeffrey, Research Fellow)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 298 312
+%%Pages: 0
+%%BeginSetup
+%%IncludeFeature: *PageSize A4
+%%EndSetup
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {} def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-112.0 334.0 translate
+1 -1 scale
+
+/clp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def
+ /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc 0 0 1 startangle endangle arc
+ closepath
+ savematrix setmatrix
+ } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+ 0.06000 0.06000 sc
+7.500 slw
+% Arc
+n 4813.51 1452.05 m 4800.00 1575.00 l 4754.06 1460.15 l gs col-1 s gr
+n 4284.38 1645.31 520.40 -91.03 -7.77 arc
+gs col-1 s gr
+
+% Arc
+n 3045.94 1460.15 m 3000.00 1575.00 l 2986.49 1452.05 l gs col-1 s gr
+n 3515.62 1645.31 520.40 -88.97 -172.23 arcn
+gs col-1 s gr
+
+% Arc
+n 2771.84 3251.35 m 2775.00 3375.00 l 2714.02 3267.38 l gs col-1 s gr
+n 2279.17 3512.50 514.55 -84.89 -15.50 arc
+gs col-1 s gr
+
+% Arc
+n 3285.98 3267.38 m 3225.00 3375.00 l 3228.16 3251.35 l gs col-1 s gr
+n 3720.83 3512.50 514.55 -95.11 -164.50 arcn
+gs col-1 s gr
+
+% Arc
+n 4247.24 2906.08 m 4125.00 2925.00 l 4223.95 2850.78 l gs col-1 s gr
+n 3525.00 1500.00 1546.16 39.09 67.17 arc
+gs col-1 s gr
+
+% Arc
+n 3403.37 4702.50 m 3525.00 4725.00 l 3407.09 4762.39 l gs col-1 s gr
+n 3493.27 4214.42 511.56 164.63 86.44 arcn
+gs col-1 s gr
+
+% Arc
+n 4394.64 4681.42 m 4275.00 4650.00 l 4395.35 4621.42 l gs col-1 s gr
+n 4291.72 3239.01 1411.09 -3.62 90.68 arc
+gs col-1 s gr
+
+% Arc
+n 4398.18 4811.29 m 4275.00 4800.00 l 4389.00 4752.00 l gs col-1 s gr
+n 3787.50 1650.00 3187.50 28.07 81.20 arc
+gs col-1 s gr
+
+% Arc
+n 4306.30 4511.76 m 4200.00 4575.00 l 4264.03 4469.17 l gs col-1 s gr
+n 2769.64 3133.93 2030.42 0.45 45.21 arc
+gs col-1 s gr
+
+% Ellipse
+n 3900 2962 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 3900 562 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 3900 1762 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 3000 1762 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 4800 1762 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 4800 2962 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 5700 2962 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 6600 2962 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 2100 2962 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 3000 4162 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Ellipse
+n 3900 5362 225 187 0 360 DrawEllipse gs col-1 s gr
+
+% Polyline
+n 3525 975 m 4275 975 l 4275 1275 l 3525 1275 l clp gs col-1 s gr
+% Polyline
+n 3525 2175 m 4275 2175 l 4275 2475 l 3525 2475 l clp gs col-1 s gr
+% Polyline
+n 4425 2175 m 5175 2175 l 5175 2475 l 4425 2475 l clp gs col-1 s gr
+% Polyline
+n 2625 3375 m 3375 3375 l 3375 3675 l 2625 3675 l clp gs col-1 s gr
+% Polyline
+n 3525 4575 m 4275 4575 l 4275 4875 l 3525 4875 l clp gs col-1 s gr
+% Polyline
+n 3900 750 m 3900 975 l gs col-1 s gr
+n 3930.00 855.00 m 3900.00 975.00 l 3870.00 855.00 l gs col-1 s gr
+% Polyline
+n 3900 1275 m 3900 1575 l gs col-1 s gr
+n 3930.00 1455.00 m 3900.00 1575.00 l 3870.00 1455.00 l gs col-1 s gr
+% Polyline
+n 3900 1950 m 3900 2175 l gs col-1 s gr
+n 3930.00 2055.00 m 3900.00 2175.00 l 3870.00 2055.00 l gs col-1 s gr
+% Polyline
+n 3900 2475 m 3900 2775 l gs col-1 s gr
+n 3930.00 2655.00 m 3900.00 2775.00 l 3870.00 2655.00 l gs col-1 s gr
+% Polyline
+n 4800 1950 m 4800 2175 l gs col-1 s gr
+n 4830.00 2055.00 m 4800.00 2175.00 l 4770.00 2055.00 l gs col-1 s gr
+% Polyline
+n 4800 2475 m 4800 2775 l gs col-1 s gr
+n 4830.00 2655.00 m 4800.00 2775.00 l 4770.00 2655.00 l gs col-1 s gr
+% Polyline
+n 3000 1950 m 3000 3375 l gs col-1 s gr
+n 3030.00 3255.00 m 3000.00 3375.00 l 2970.00 3255.00 l gs col-1 s gr
+% Polyline
+n 3000 3675 m 3000 3975 l gs col-1 s gr
+n 3030.00 3855.00 m 3000.00 3975.00 l 2970.00 3855.00 l gs col-1 s gr
+% Polyline
+n 3900 3150 m 3900 4575 l gs col-1 s gr
+n 3930.00 4455.00 m 3900.00 4575.00 l 3870.00 4455.00 l gs col-1 s gr
+% Polyline
+n 3900 4875 m 3900 5175 l gs col-1 s gr
+n 3930.00 5055.00 m 3900.00 5175.00 l 3870.00 5055.00 l gs col-1 s gr
+/Helvetica findfont 180.00 scalefont setfont
+3900 3000 m
+gs 1 -1 sc (tfm) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+3900 600 m
+gs 1 -1 sc (afm) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+3900 1800 m
+gs 1 -1 sc (pl) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+4800 1800 m
+gs 1 -1 sc (vpl) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+3000 1800 m
+gs 1 -1 sc (fd) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+4800 3000 m
+gs 1 -1 sc (vf) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+5700 3000 m
+gs 1 -1 sc (pfa) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+6600 3000 m
+gs 1 -1 sc (pfb) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+2100 3000 m
+gs 1 -1 sc (tex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+3000 4200 m
+gs 1 -1 sc (dvi) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Helvetica findfont 180.00 scalefont setfont
+3900 5400 m
+gs 1 -1 sc (ps) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Palatino-Italic findfont 180.00 scalefont setfont
+3900 1175 m
+gs 1 -1 sc (fontinst) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Palatino-Italic findfont 180.00 scalefont setfont
+3900 2375 m
+gs 1 -1 sc (pltotf) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Palatino-Italic findfont 180.00 scalefont setfont
+4800 2375 m
+gs 1 -1 sc (vptovf) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Palatino-Italic findfont 180.00 scalefont setfont
+3000 3575 m
+gs 1 -1 sc (latex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Palatino-Italic findfont 180.00 scalefont setfont
+3900 4775 m
+gs 1 -1 sc (dvips) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+$F2psEnd
+restore
diff --git a/fonts/utilities/fontinst/doc/talks/et99-font-tables.pdf b/fonts/utilities/fontinst/doc/talks/et99-font-tables.pdf
new file mode 100644
index 0000000000..8d6c2b593c
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/talks/et99-font-tables.pdf
Binary files differ
diff --git a/fonts/utilities/fontinst/doc/talks/et99-font-tutorial.pdf b/fonts/utilities/fontinst/doc/talks/et99-font-tutorial.pdf
new file mode 100644
index 0000000000..4ae8a1eeb7
--- /dev/null
+++ b/fonts/utilities/fontinst/doc/talks/et99-font-tutorial.pdf
Binary files differ
diff --git a/fonts/utilities/fontinst/examples/basic/basicex.tex b/fonts/utilities/fontinst/examples/basic/basicex.tex
new file mode 100644
index 0000000000..fe7f6f6993
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/basic/basicex.tex
@@ -0,0 +1,431 @@
+% basicex.tex
+%
+% This file contains some basic examples of commands for
+% installing the AGaramond family of fonts with fontinst v1.9.
+% It is pretty similar to what the \latinfamily command
+% does for these fonts, but the details are not identical.
+%
+% In case you want to run this file yourself, the metrics for
+% the AGaramond font family can be downloaded from
+%
+% ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles/051-100/100/
+% and
+% ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles/101-150/101/
+%
+% The AFM files found in these directories should then be renamed
+% as indicated in the Fontname adobe.map file. Also note that
+% the line endings are Windows-style (CRLF), so you probably need
+% to download as binary and do some conversion before you can use
+% these files comfortably.
+
+\input fontinst.sty
+
+% This tells fontinst to collect information about font
+% transformations in the file basicex.recs. That file is
+% then used by basicex2.tex.
+\recordtransforms{basicex.recs}
+
+% These commands perform transformations on the metrics of
+% some of the fonts, thereby creating new metrics files for
+% the transformed fonts.
+\transformfont{padr8r}{\reencodefont{8r}{\fromafm{padr8a}}}
+\transformfont{padrc8r}{\reencodefont{8r}{\fromafm{padrc8a}}}
+\transformfont{padri8r}{\reencodefont{8r}{\fromafm{padri8a}}}
+\transformfont{padro8r}{\slantfont{250}{\frommtx{padr8r}}}
+\transformfont{padro8x}{\slantfont{250}{\fromafm{padr8x}}}
+
+% The first three lines of each group reencode fonts
+% so that TeX can access all glyphs in them.
+\transformfont{pads8r}{\reencodefont{8r}{\fromafm{pads8a}}}
+\transformfont{padsc8r}{\reencodefont{8r}{\fromafm{padsc8a}}}
+\transformfont{padsi8r}{\reencodefont{8r}{\fromafm{padsi8a}}}
+% The last two lines artifically create slanted variants
+% of fonts by skewing them. 250 is the natural slant of
+% the italics in this family.
+\transformfont{padso8r}{\slantfont{250}{\frommtx{pads8r}}}
+\transformfont{padso8x}{\slantfont{250}{\fromafm{pads8x}}}
+
+\transformfont{padb8r}{\reencodefont{8r}{\fromafm{padb8a}}}
+% There is no padbc8a, hence nothing to make a padbc8r from.
+\transformfont{padbi8r}{\reencodefont{8r}{\fromafm{padbi8a}}}
+\transformfont{padbo8r}{\slantfont{250}{\frommtx{padb8r}}}
+\transformfont{padbo8x}{\slantfont{250}{\fromafm{padb8x}}}
+% The DVI driver must be told to make the same transformations
+% to the actual fonts when a document using them is to be viewed
+% or printed. The information collected in basicex.recs can
+% help with this. The job of basicex2.tex is to translate this
+% information to a format understood by DVI drivers.
+
+
+% The \transformfont commands above generate metric files in MTX
+% format (for use by the \installfont commands below) and PL
+% format (for transformation to TFMs that are needed by the DVI
+% driver when interpreting VFs based on these fonts). These PL
+% files are minimal and not suitable for direct use in typesetting
+% since there is no kerning information, ligaturing instructions,
+% or fontdimens, but they are perfectly adequate to serve as
+% base fonts for VFs.
+%
+% The next bunch of commands generate a new set of PL files for
+% these fonts (overwriting the previous), and these new files
+% do contain kerning information, ligaturing instructions, and
+% fontdimens. (As a side-effect, these files are also larger than
+% the previous ones.) Since 8r-encoded fonts are not in practice
+% used for typesetting (not much, anyway), it is perfectly
+% possible to skip this step.
+\installfonts
+ \installrawfont {padr8r}{padr8r,8r}{8r} {8r}{pad}{m}{n}{}
+ \installrawfont {padrc8r}{padrc8r,8r}{8r} {8r}{pad}{m}{sc}{}
+ \installrawfont {padri8r}{padri8r,8r}{8r} {8r}{pad}{m}{it}{}
+ \installrawfont {padro8r}{padro8r,8r}{8r} {8r}{pad}{m}{sl}{}
+
+ \installrawfont {pads8r}{pads8r,8r}{8r} {8r}{pad}{sb}{n}{}
+ \installrawfont {padsc8r}{padsc8r,8r}{8r} {8r}{pad}{sb}{sc}{}
+ \installrawfont {padsi8r}{padsi8r,8r}{8r} {8r}{pad}{sb}{it}{}
+ \installrawfont {padso8r}{padso8r,8r}{8r} {8r}{pad}{sb}{sl}{}
+
+ \installrawfont {padb8r}{padb8r,8r}{8r} {8r}{pad}{b}{n}{}
+ \installrawfont {padbi8r}{padbi8r,8r}{8r} {8r}{pad}{b}{it}{}
+ \installrawfont {padbo8r}{padbo8r,8r}{8r} {8r}{pad}{b}{sl}{}
+\endinstallfonts
+
+
+% In the above commands, the commands have been lined up to
+% visually separate those arguments that have to do with how
+% a font is declared to LaTeX (rightmost) from those arguments
+% that specify how the font is made and what it should be called.
+
+
+% The following commands make a very basic installation of "pad"
+% families in the OT1, T1, and TS1 encodings; there is not attempt
+% to make use of the -Exp (expert) or -SC (smallcaps) fonts in
+% the AGaramond family. (One reason for making this distinction
+% is that Adobe sell these other fonts separately, so some people
+% may have the basic set used below and nothing more. Another
+% reason is that for many typefaces, there are no expert or -SC
+% fonts at all. Adapting an example using such fonts to a typeface
+% which do not have them is much too confusing for a beginner.)
+\installfonts
+ \installfamily{OT1}{pad}{}
+ \installfamily{T1}{pad}{}
+ \installfamily{TS1}{pad}{}
+
+ \installfont {padr8t}{padr8r,newlatin}{t1} {T1}{pad}{m}{n}{}
+ \installfont {padr7t}{padr8r,newlatin}{ot1} {OT1}{pad}{m}{n}{}
+ \installfont {padrc8t}{padr8r,newlatin}{t1c} {T1}{pad}{m}{sc}{}
+ \installfont {padrc7t}{padr8r,newlatin}{ot1c} {OT1}{pad}{m}{sc}{}
+ \installfont {padr8i}{padr8r,textcomp}{ts1} {TS1}{pad}{m}{n}{}
+ % There is no difference between the n and the sc shapes
+ % of TS1 encoded fonts, hence the same TeX font can be
+ % used for both. LaTeX does however need the declarations
+ % to be explicit, hence this \installfontas command.
+ \installfontas{padr8i} {TS1}{pad}{m}{sc}{}
+ % The "option nosc" below is a speed optimization.
+ % newlatin.mtx normally makes sure that a smallcaps
+ % alphabet is defined (faking it if necessary),
+ % regardless of whether that alphabet is at all
+ % going to be used. By passing it the "nosc" option,
+ % one can tell newlatin.mtx to completely skip those
+ % commands that have to do with smallcaps.
+ \installfont {padri8t}{padri8r,newlatin option nosc}{t1} {T1}{pad}{m}{it}{}
+ \installfont {padri7t}{padri8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{it}{}
+ \installfont {padri8i}{padri8r,textcomp}{ts1} {TS1}{pad}{m}{it}{}
+ \installfont {padro8t}{padro8r,newlatin option nosc}{t1} {T1}{pad}{m}{sl}{}
+ \installfont {padro7t}{padro8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{sl}{}
+ \installfont {padro8i}{padro8r,textcomp}{ts1} {TS1}{pad}{m}{sl}{}
+
+ % The reason newlatin is not passed the nosc option when
+ % making the "n" shape fonts here is another (more tricky)
+ % speed optimization. If the metric argument of two
+ % subsequent \installfont commands are identical then the
+ % respective glyph bases will be identical too, and in these
+ % cases fontinst saves work by not rebuilding the glyph base
+ % at the second command, but instead using the cached
+ % definitions from the first.
+ \installfont {pads8t}{pads8r,newlatin}{t1} {T1}{pad}{sb}{n}{}
+ \installfont {pads7t}{pads8r,newlatin}{ot1} {OT1}{pad}{sb}{n}{}
+ \installfont {padsc8t}{pads8r,newlatin}{t1c} {T1}{pad}{sb}{sc}{}
+ \installfont {padsc7t}{pads8r,newlatin}{ot1c} {OT1}{pad}{sb}{sc}{}
+ % Thus the last four commands cause four fonts to be
+ % generated, but the pads8r.mtx and newlatin.mtx files
+ % are only read once.
+ \installfont {pads8i}{pads8r,textcomp}{ts1} {TS1}{pad}{sb}{n}{}
+ \installfontas{pads8i} {TS1}{pad}{sb}{sc}{}
+ \installfont {padsi8t}{padsi8r,newlatin option nosc}{t1} {T1}{pad}{sb}{it}{}
+ \installfont {padsi7t}{padsi8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{it}{}
+ \installfont {padsi8i}{padsi8r,textcomp}{ts1} {TS1}{pad}{sb}{it}{}
+ \installfont {padso8t}{padso8r,newlatin option nosc}{t1} {T1}{pad}{sb}{sl}{}
+ \installfont {padso7t}{padso8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{sl}{}
+ \installfont {padso8i}{padso8r,textcomp}{ts1} {TS1}{pad}{sb}{sl}{}
+
+ \installfont {padb8t}{padb8r,newlatin}{t1} {T1}{pad}{b}{n}{}
+ \installfont {padb7t}{padb8r,newlatin}{ot1} {OT1}{pad}{b}{n}{}
+ \installfont {padbc8t}{padb8r,newlatin}{t1c} {T1}{pad}{b}{sc}{}
+ \installfont {padbc7t}{padb8r,newlatin}{ot1c} {OT1}{pad}{b}{sc}{}
+ \installfont {padb8i}{padb8r,textcomp}{ts1} {TS1}{pad}{b}{n}{}
+ \installfontas{padb8i} {TS1}{pad}{b}{sc}{}
+ \installfont {padbi8t}{padbi8r,newlatin option nosc}{t1} {T1}{pad}{b}{it}{}
+ \installfont {padbi7t}{padbi8r,newlatin option nosc}{ot1} {OT1}{pad}{b}{it}{}
+ \installfont {padbi8i}{padbi8r,textcomp}{ts1} {TS1}{pad}{b}{it}{}
+ \installfont {padbo8t}{padbo8r,newlatin option nosc}{t1} {T1}{pad}{b}{sl}{}
+ \installfont {padbo7t}{padbo8r,newlatin option nosc}{ot1} {OT1}{pad}{b}{sl}{}
+ \installfont {padbo8i}{padbo8r,textcomp}{ts1} {TS1}{pad}{b}{sl}{}
+\endinstallfonts
+
+
+% The set of commands above will "fake" an sc shape for the typeface
+% by making dual use of the capitals in the n shape (Regular): both
+% as normal (for the upper case in the sc shape) and shrunk to 80% of
+% their normal size (for the lower case in the sc shape). This works
+% (anyone who looks at it will understand what was intended), but it
+% does not look good, and therefore it is always better to make use
+% of proper smallcaps when it is available.
+%
+% The next set of commands is another take at creating the "pad"
+% families, this time making use of the proper smallcaps in padrc8r
+% and padsc8r. The files created by this set of commands will
+% completely overwrite the files created by the previous set of
+% commands; in practice one would only include one set of commands,
+% but both are provided here for comparison.
+\installfonts
+ \installfamily{OT1}{pad}{}
+ \installfamily{T1}{pad}{}
+ \installfamily{TS1}{pad}{}
+
+ % Since the glyph bases used for the n and sc shapes in this
+ % case are different, there is no point in doing the smallcaps
+ % processing when making the n shape fonts.
+ \installfont {padr8t}{padr8r,newlatin option nosc}{t1} {T1}{pad}{m}{n}{}
+ \installfont {padr7t}{padr8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{n}{}
+ % There is actually no point in doing that processing for
+ % the sc shape fonts either! This is because the glyph names
+ % used in padrc8r are the same as those used in padr8r (and
+ % padri8r), and thus the smallcaps glyphs will already have
+ % been delt with by the code for lower case glyphs. Another
+ % consequence is that the same ETX files as are used for
+ % the other shapes should be used for the sc shape.
+ \installfont {padrc8t}{padrc8r,newlatin option nosc}{t1} {T1}{pad}{m}{sc}{}
+ \installfont {padrc7t}{padrc8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{sc}{}
+ \installfont {padr8i}{padr8r,textcomp}{ts1} {TS1}{pad}{m}{n}{}
+ \installfontas{padr8i} {TS1}{pad}{m}{sc}{}
+ \installfont {padri8t}{padri8r,newlatin option nosc}{t1} {T1}{pad}{m}{it}{}
+ \installfont {padri7t}{padri8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{it}{}
+ \installfont {padri8i}{padri8r,textcomp}{ts1} {TS1}{pad}{m}{it}{}
+ \installfont {padro8t}{padro8r,newlatin option nosc}{t1} {T1}{pad}{m}{sl}{}
+ \installfont {padro7t}{padro8r,newlatin option nosc}{ot1} {OT1}{pad}{m}{sl}{}
+ \installfont {padro8i}{padro8r,textcomp}{ts1} {TS1}{pad}{m}{sl}{}
+
+ \installfont {pads8t}{pads8r,newlatin option nosc}{t1} {T1}{pad}{sb}{n}{}
+ \installfont {pads7t}{pads8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{n}{}
+ \installfont {padsc8t}{padsc8r,newlatin option nosc}{t1} {T1}{pad}{sb}{sc}{}
+ \installfont {padsc7t}{padsc8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{sc}{}
+ \installfont {pads8i}{pads8r,textcomp}{ts1} {TS1}{pad}{sb}{n}{}
+ \installfontas{pads8i} {TS1}{pad}{sb}{sc}{}
+ \installfont {padsi8t}{padsi8r,newlatin option nosc}{t1} {T1}{pad}{sb}{it}{}
+ \installfont {padsi7t}{padsi8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{it}{}
+ \installfont {padsi8i}{padsi8r,textcomp}{ts1} {TS1}{pad}{sb}{it}{}
+ \installfont {padso8t}{padso8r,newlatin option nosc}{t1} {T1}{pad}{sb}{sl}{}
+ \installfont {padso7t}{padso8r,newlatin option nosc}{ot1} {OT1}{pad}{sb}{sl}{}
+ \installfont {padso8i}{padso8r,textcomp}{ts1} {TS1}{pad}{sb}{sl}{}
+
+ % There is however no padbc8r font; hence the sc shape of
+ % the b series must still be faked, just as above.
+ \installfont {padb8t}{padb8r,newlatin}{t1} {T1}{pad}{b}{n}{}
+ \installfont {padb7t}{padb8r,newlatin}{ot1} {OT1}{pad}{b}{n}{}
+ \installfont {padbc8t}{padb8r,newlatin}{t1c} {T1}{pad}{b}{sc}{}
+ \installfont {padbc7t}{padb8r,newlatin}{ot1c} {OT1}{pad}{b}{sc}{}
+ \installfont {padb8i}{padb8r,textcomp}{ts1} {TS1}{pad}{b}{n}{}
+ \installfontas{padb8i} {TS1}{pad}{b}{sc}{}
+ \installfont {padbi8t}{padbi8r,newlatin option nosc}{t1} {T1}{pad}{b}{it}{}
+ \installfont {padbi7t}{padbi8r,newlatin option nosc}{ot1} {OT1}{pad}{b}{it}{}
+ \installfont {padbi8i}{padbi8r,textcomp}{ts1} {TS1}{pad}{b}{it}{}
+ \installfont {padbo8t}{padbo8r,newlatin option nosc}{t1} {T1}{pad}{b}{sl}{}
+ \installfont {padbo7t}{padbo8r,newlatin option nosc}{ot1} {OT1}{pad}{b}{sl}{}
+ \installfont {padbo8i}{padbo8r,textcomp}{ts1} {TS1}{pad}{b}{sl}{}
+\endinstallfonts
+
+
+% The "pad" family installed above is however still far from perfect.
+% The `ff', `ffi', and `ffl' ligatures are fakes, since those aren't
+% available in the fonts used. There are however such glyphs in the
+% expert (8x) companions of the fonts used above, and hence the
+% results will be better if these resources can be combined.
+%
+% One of the great advantages with TeX, virtual fonts, and fontinst
+% is the ease with which one can combine glyphs from (what the foundry
+% has packaged as) several different fonts into a single font;
+% if \installfont is given the metrics of two fonts, and some glyph
+% is available in one font but not the other, then fontinst will
+% automatically take it from the font where it was available.
+% Hence one can fill in (at least some of) the blanks of one font
+% by also listing a second font in the metrics argument of
+% \installfont. It will do the right thing automatically.
+\installfonts
+ \installfamily{OT1}{padx}{}
+ \installfamily{T1}{padx}{}
+ \installfamily{TS1}{padx}{}
+ % The "padx" family name used here is mainly motivated by
+ % tradition. It has been considered useful to simultaneously
+ % on a single system have both a family of virtual fonts which
+ % do not make use of the expert set of base fonts, and a family
+ % of virtual fonts which do make use of the expert set of base
+ % fonts. For this to work, the different fonts must have
+ % different names. In the Fontname scheme, this is accomplished
+ % by including an "x" variant letter in the names to signify that
+ % the font is "expertized". In LaTeX there is no proper standard
+ % for this, but the custom is to similarly append an "x" to the
+ % basic three letter family name, thus yielding "padx" instead
+ % of "pad".
+
+ % The Fontname scheme is in this case further complicated by
+ % a desire to avoid names of more than eight characters
+ % (a limit which is important in many old file systems).
+ % Therefore many of the two-character variants starting with
+ % 9 is a combination of an encoding variant with one or two
+ % other variants (most commonly the "x" variant). The commands
+ % below utilize these abbreviations (but there is no software
+ % involved which would require them to).
+ \installfont {padr9e}{padr8r,padr8x,newlatin}{t1} {T1}{padx}{m}{n}{}
+ \installfont {padr9t}{padr8r,padr8x,newlatin}{ot1} {OT1}{padx}{m}{n}{}
+ % Besides the extra ligatures, the upright 8x fonts also contain
+ % a proper smallcaps alphabet. This makes it possible to make do
+ % without the -c8r fonts. The commands below will make a font
+ % using the upper case from padr8r and (as lower case) the
+ % small caps from padr8x.
+ \installfont {padrc9e}{padr8r,padr8x,newlatin}{t1c} {T1}{padx}{m}{sc}{}
+ \installfont {padrc9t}{padr8r,padr8x,newlatin}{ot1c} {OT1}{padx}{m}{sc}{}
+ \installfont {padr9i}{padr8r,padr8x,textcomp}{ts1} {TS1}{padx}{m}{n}{}
+ \installfontas{padr9i} {TS1}{padx}{m}{sc}{}
+ \installfont {padri9e}{padri8r,padri8x,newlatin option nosc}{t1} {T1}{padx}{m}{it}{}
+ \installfont {padri9t}{padri8r,padri8x,newlatin option nosc}{ot1} {OT1}{padx}{m}{it}{}
+ \installfont {padri9i}{padri8r,padri8x,textcomp}{ts1} {TS1}{padx}{m}{it}{}
+ \installfont {padro9e}{padro8r,padro8x,newlatin option nosc}{t1} {T1}{padx}{m}{sl}{}
+ \installfont {padro9t}{padro8r,padro8x,newlatin option nosc}{ot1} {OT1}{padx}{m}{sl}{}
+ \installfont {padro9i}{padro8r,padro8x,textcomp}{ts1} {TS1}{padx}{m}{sl}{}
+
+ \installfont {pads9e}{pads8r,pads8x,newlatin}{t1} {T1}{padx}{sb}{n}{}
+ \installfont {pads9t}{pads8r,pads8x,newlatin}{ot1} {OT1}{padx}{sb}{n}{}
+ \installfont {padsc9e}{pads8r,pads8x,newlatin}{t1c} {T1}{padx}{sb}{sc}{}
+ \installfont {padsc9t}{pads8r,pads8x,newlatin}{ot1c} {OT1}{padx}{sb}{sc}{}
+ \installfont {pads9i}{pads8r,pads8x,textcomp}{ts1} {TS1}{padx}{sb}{n}{}
+ \installfontas{pads9i} {TS1}{padx}{sb}{sc}{}
+ \installfont {padsi9e}{padsi8r,padsi8x,newlatin option nosc}{t1} {T1}{padx}{sb}{it}{}
+ \installfont {padsi9t}{padsi8r,padsi8x,newlatin option nosc}{ot1} {OT1}{padx}{sb}{it}{}
+ \installfont {padsi9i}{padsi8r,padsi8x,textcomp}{ts1} {TS1}{padx}{sb}{it}{}
+ \installfont {padso9e}{padso8r,padso8x,newlatin option nosc}{t1} {T1}{padx}{sb}{sl}{}
+ \installfont {padso9t}{padso8r,padso8x,newlatin option nosc}{ot1} {OT1}{padx}{sb}{sl}{}
+ \installfont {padso9i}{padso8r,padso8x,textcomp}{ts1} {TS1}{padx}{sb}{sl}{}
+
+ \installfont {padb9e}{padb8r,padb8x,newlatin}{t1} {T1}{padx}{b}{n}{}
+ \installfont {padb9t}{padb8r,padb8x,newlatin}{ot1} {OT1}{padx}{b}{n}{}
+ % The padb8x font does not contain a smallcaps alphabet --
+ % hence in this case the newlatin.mtx file reverts to faking
+ % such an alphabet by shrinking the upper case. The commands
+ % can however be the same as above!
+ \installfont {padbc9e}{padb8r,padb8x,newlatin}{t1c} {T1}{padx}{b}{sc}{}
+ \installfont {padbc9t}{padb8r,padb8x,newlatin}{ot1c} {OT1}{padx}{b}{sc}{}
+ \installfont {padb9i}{padb8r,padb8x,textcomp}{ts1} {TS1}{padx}{b}{n}{}
+ \installfontas{padb9i} {TS1}{padx}{b}{sc}{}
+ \installfont {padbi9e}{padbi8r,padbi8x,newlatin option nosc}{t1} {T1}{padx}{b}{it}{}
+ \installfont {padbi9t}{padbi8r,padbi8x,newlatin option nosc}{ot1} {OT1}{padx}{b}{it}{}
+ \installfont {padbi9i}{padbi8r,padbi8x,textcomp}{ts1} {TS1}{padx}{b}{it}{}
+ \installfont {padbo9e}{padbo8r,padbo8x,newlatin option nosc}{t1} {T1}{padx}{b}{sl}{}
+ \installfont {padbo9t}{padbo8r,padbo8x,newlatin option nosc}{ot1} {OT1}{padx}{b}{sl}{}
+ \installfont {padbo9i}{padbo8r,padbo8x,textcomp}{ts1} {TS1}{padx}{b}{sl}{}
+\endinstallfonts
+
+
+% Finally we get to my personal favourite -- the families with hanging
+% (a.k.a. oldstyle) figures. From a historical point of view, this is
+% really the most correct appearence of these fonts, because in the 16th
+% century (when Claude Garamond designed the metal types after which the
+% AGaramond fonts where modelled) there was no such thing as lining
+% figures; all figures were hanging.
+%
+% The 8x fonts all contain a suitable set of hanging figures. This makes
+% it very straightforward to make use of these instead of the lining
+% digits of the base fonts. One simply has to make use of ETX files
+% which selects these glyphs hanging figure glyphs instead of the
+% lining figure glyphs.
+\installfonts
+ \installfamily{OT1}{padj}{}
+ \installfamily{T1}{padj}{}
+ \installfamily{TS1}{padj}{}
+ % Another custom: a "j" (the Fontname hanging figure variant letter)
+ % is appended to the LaTeX family name to distinguish between
+ % lining and hanging figure families.
+
+ \installfont {padr9d}{padr8r,padr8x,newlatin}{t1j} {T1}{padj}{m}{n}{}
+ \installfont {padr9o}{padr8r,padr8x,newlatin}{ot1j} {OT1}{padj}{m}{n}{}
+ \installfont {padrc9d}{padr8r,padr8x,newlatin}{t1cj} {T1}{padj}{m}{sc}{}
+ \installfont {padrc9o}{padr8r,padr8x,newlatin}{ot1cj} {OT1}{padj}{m}{sc}{}
+ \installfont {padr9i}{padr8r,padr8x,textcomp}{ts1} {TS1}{padj}{m}{n}{}
+ \installfontas{padr9i} {TS1}{padj}{m}{sc}{}
+ \installfont {padri9d}{padri8r,padri8x,newlatin option nosc}{t1j} {T1}{padj}{m}{it}{}
+ \installfont {padri9o}{padri8r,padri8x,newlatin option nosc}{ot1j} {OT1}{padj}{m}{it}{}
+ \installfont {padri9i}{padri8r,padri8x,textcomp}{ts1} {TS1}{padj}{m}{it}{}
+ \installfont {padro9d}{padro8r,padro8x,newlatin option nosc}{t1j} {T1}{padj}{m}{sl}{}
+ \installfont {padro9o}{padro8r,padro8x,newlatin option nosc}{ot1j} {OT1}{padj}{m}{sl}{}
+ \installfont {padro9i}{padro8r,padro8x,textcomp}{ts1} {TS1}{padj}{m}{sl}{}
+
+ \installfont {pads9d}{pads8r,pads8x,newlatin}{t1j} {T1}{padj}{sb}{n}{}
+ \installfont {pads9o}{pads8r,pads8x,newlatin}{ot1j} {OT1}{padj}{sb}{n}{}
+ \installfont {padsc9d}{pads8r,pads8x,newlatin}{t1cj} {T1}{padj}{sb}{sc}{}
+ \installfont {padsc9o}{pads8r,pads8x,newlatin}{ot1cj} {OT1}{padj}{sb}{sc}{}
+ \installfont {pads9i}{pads8r,pads8x,textcomp}{ts1} {TS1}{padj}{sb}{n}{}
+ \installfontas{pads9i} {TS1}{padj}{sb}{sc}{}
+ \installfont {padsi9d}{padsi8r,padsi8x,newlatin option nosc}{t1j} {T1}{padj}{sb}{it}{}
+ \installfont {padsi9o}{padsi8r,padsi8x,newlatin option nosc}{ot1j} {OT1}{padj}{sb}{it}{}
+ \installfont {padsi9i}{padsi8r,padsi8x,textcomp}{ts1} {TS1}{padj}{sb}{it}{}
+ \installfont {padso9d}{padso8r,padso8x,newlatin option nosc}{t1j} {T1}{padj}{sb}{sl}{}
+ \installfont {padso9o}{padso8r,padso8x,newlatin option nosc}{ot1j} {OT1}{padj}{sb}{sl}{}
+ \installfont {padso9i}{padso8r,padso8x,textcomp}{ts1} {TS1}{padj}{sb}{sl}{}
+
+ \installfont {padb9d}{padb8r,padb8x,newlatin}{t1j} {T1}{padj}{b}{n}{}
+ \installfont {padb9o}{padb8r,padb8x,newlatin}{ot1j} {OT1}{padj}{b}{n}{}
+ \installfont {padbc9d}{padb8r,padb8x,newlatin}{t1cj} {T1}{padj}{b}{sc}{}
+ \installfont {padbc9o}{padb8r,padb8x,newlatin}{ot1cj} {OT1}{padj}{b}{sc}{}
+ \installfont {padb9i}{padb8r,padb8x,textcomp}{ts1} {TS1}{padj}{b}{n}{}
+ \installfontas{padb9i} {TS1}{padj}{b}{sc}{}
+ \installfont {padbi9d}{padbi8r,padbi8x,newlatin option nosc}{t1j} {T1}{padj}{b}{it}{}
+ \installfont {padbi9o}{padbi8r,padbi8x,newlatin option nosc}{ot1j} {OT1}{padj}{b}{it}{}
+ \installfont {padbi9i}{padbi8r,padbi8x,textcomp}{ts1} {TS1}{padj}{b}{it}{}
+ \installfont {padbo9d}{padbo8r,padbo8x,newlatin option nosc}{t1j} {T1}{padj}{b}{sl}{}
+ \installfont {padbo9o}{padbo8r,padbo8x,newlatin option nosc}{ot1j} {OT1}{padj}{b}{sl}{}
+ \installfont {padbo9i}{padbo8r,padbo8x,textcomp}{ts1} {TS1}{padj}{b}{sl}{}
+\endinstallfonts
+
+% This closes the file opened by \recordtransforms above.
+\endrecordtransforms
+
+\bye
+
+% The installations made by the above commands are certainly not
+% optimal. Some things which can be improved are:
+%
+% - Although the padrc9e, padrc9t, padsc9e, padsc9t, padrc9d,
+% padrc9o, padsc9d, and padsc9o fonts contain proper smallcaps
+% glyphs, there are no kerns between the smallcaps and
+% the upper case in these fonts, because there were no such
+% kerns in any of the fonts they are based on. There are
+% however such kerning pairs in padrc8r and padsc8r, and it is
+% quite easy to extract this information using the \reglyphfont
+% command with the settings in the csckrn2x.tex file.
+%
+% - The padrc8t, padrc7t, padsc8t, and padsc7t fonts that are
+% based on padrc8r and padsc8r respectively have hanging figures,
+% whereas the other fonts in the same family have lining figures.
+% This is only because that is how the foundry packaged the
+% glyphs into fonts, and the careful font installer might want
+% to straighten out this situation. One way to do that is
+% to make use of the unsetnum.mtx file, another is to make
+% use of the `suffix' mechanism (new in v1.923).
+%
+% - One glyph which is missing from all the fonts made above is
+% the Euro glyph (and that is kind of awkward these days, although
+% as of v1.926 textcomp.mtx fakes this using a C and two rules).
+% One way to supply a Euro glyph is to provide yet another font
+% (besides the -8r's and -8x's) as base font, if that extra
+% font contains the missing Euro glyph. The same trick can be used
+% to get greek capitals for the OT1-encoded fonts.
+
diff --git a/fonts/utilities/fontinst/examples/basic/basicex2.tex b/fonts/utilities/fontinst/examples/basic/basicex2.tex
new file mode 100644
index 0000000000..74fe2a4df5
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/basic/basicex2.tex
@@ -0,0 +1,50 @@
+%
+% basicex2.tex
+%
+% fontinst command file for writing map file fragments for
+% the raw fonts used by the fonts made in basicex.tex.
+%
+
+\input finstmsc.sty
+
+% At this point, you might want to change some settings
+% to make the map file fragments written better adjusted
+% to your particular system. Some common examples are:
+%
+% \resetstr{PSfontsuffix}{.pfb}
+%
+% which is useful if the actual fonts are in PFB format.
+%
+% \AssumeLWFN
+%
+% This is useful if the font files are named according to
+% the old Mac OS Classic convention for PostScript fonts
+% (names like AGarBolIta).
+
+\adddriver{dvips}{dvips.map}
+% This causes a .map file for dvips to be written.
+% It is probably better to choose a name that has to
+% do with the fonts than to use `dvips.map'.
+% In some systems, there is a program updmap which combines
+% several small .map files such as this one into a large
+% psfonts.map file.
+\adddriver{dvipdfm}{dvipdfm.map}
+% Similar file for dvipdfm.
+\adddriver{pltotf}{pltotf-script.sh}
+% A shell script that runs pltotf on those .pl files
+% which you need to turn into .tfm files.
+\adddriver{debug}{mapdump.txt}
+% This file contains the available data in a human-readable
+% format. This is useful if your dvi driver uses some other
+% kind of map file.
+
+\input basicex.recs
+% This is where all the work is done.
+
+\donedrivers
+% This closes the files and does some cleanup.
+
+\bye
+
+
+
diff --git a/fonts/utilities/fontinst/examples/eurofont/Makefile b/fonts/utilities/fontinst/examples/eurofont/Makefile
new file mode 100644
index 0000000000..ec07888a1a
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/eurofont/Makefile
@@ -0,0 +1,45 @@
+## Makefile to build TS1-encoded text companion fonts
+## for Times, Helvetica and Symbol using the Adobe Euro Fonts
+
+all: afms tex vfs
+
+afms:
+ cp _3______.afm zpeur.afm
+ cp _3i_____.afm zpeuri.afm
+ cp _3b_____.afm zpeub.afm
+ cp _3bi____.afm zpeubi.afm
+ cp _1______.afm zpeurs.afm
+ cp _1i_____.afm zpeuris.afm
+ cp _1b_____.afm zpeubs.afm
+ cp _1bi____.afm zpeubis.afm
+ cp _2______.afm zpeurt.afm
+ cp _2i_____.afm zpeurit.afm
+ cp _2b_____.afm zpeubt.afm
+ cp _2bi____.afm zpeubit.afm
+
+tex:
+ tex eurofont.tex
+
+vfs:
+ vptovf ptmr8c.vpl ptmr8c.vf ptmr8c.tfm
+ vptovf ptmro8c.vpl ptmro8c.vf ptmro8c.tfm
+ vptovf ptmri8c.vpl ptmri8c.vf ptmri8c.tfm
+ vptovf ptmb8c.vpl ptmb8c.vf ptmb8c.tfm
+ vptovf ptmbo8c.vpl ptmbo8c.vf ptmbo8c.tfm
+ vptovf ptmbi8c.vpl ptmbi8c.vf ptmbi8c.tfm
+
+ vptovf phvr8c.vpl phvr8c.vf phvr8c.tfm
+ vptovf phvro8c.vpl phvro8c.vf phvro8c.tfm
+ vptovf phvb8c.vpl phvb8c.vf phvb8c.tfm
+ vptovf phvbo8c.vpl phvbo8c.vf phvbo8c.tfm
+
+ vptovf pcrr8c.vpl pcrr8c.vf pcrr8c.tfm
+ vptovf pcrro8c.vpl pcrro8c.vf pcrro8c.tfm
+ vptovf pcrb8c.vpl pcrb8c.vf pcrb8c.tfm
+ vptovf pcrbo8c.vpl pcrbo8c.vf pcrbo8c.tfm
+
+clean:
+ -rm *.mtx *.pl *.vpl *.log
+
+realclean: clean
+ -rm p*.tfm *.vf *.fd
diff --git a/fonts/utilities/fontinst/examples/eurofont/eurofont.map b/fonts/utilities/fontinst/examples/eurofont/eurofont.map
new file mode 100644
index 0000000000..373ffd2d16
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/eurofont/eurofont.map
@@ -0,0 +1,12 @@
+zpeur EuroSerif-Regular <_3______.pfb
+zpeuri EuroSerif-Italic <_3i_____.pfb
+zpeub EuroSerif-Bold <_3b_____.pfb
+zpeubi EuroSerif-BoldItalic <_3bi____.pfb
+zpeurs EuroSans-Regular <_1______.pfb
+zpeuris EuroSans-Italic <_1i_____.pfb
+zpeubs EuroSans-Bold <_1b_____.pfb
+zpeubis EuroSans-BoldItalic <_1bi____.pfb
+zpeurt EuroMono-Regular <_2______.pfb
+zpeurit EuroMono-Italic <_2i_____.pfb
+zpeubt EuroMono-Bold <_2b_____.pfb
+zpeubit EuroMono-BoldItalic <_2bi____.pfb
diff --git a/fonts/utilities/fontinst/examples/eurofont/eurofont.tex b/fonts/utilities/fontinst/examples/eurofont/eurofont.tex
new file mode 100644
index 0000000000..b97cfeb84a
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/eurofont/eurofont.tex
@@ -0,0 +1,43 @@
+\input fontinst.sty
+
+\transformfont{ptmr8r} {\reencodefont{8r}{\fromafm{ptmr8a}}}
+\transformfont{ptmro8r}{\slantfont{167} {\frommtx{ptmr8r}}}
+\transformfont{ptmri8r}{\reencodefont{8r}{\fromafm{ptmri8a}}}
+\transformfont{ptmb8r} {\reencodefont{8r}{\fromafm{ptmb8a}}}
+\transformfont{ptmbo8r}{\slantfont{167} {\frommtx{ptmb8r}}}
+\transformfont{ptmbi8r}{\reencodefont{8r}{\fromafm{ptmbi8a}}}
+
+\transformfont{phvr8r} {\reencodefont{8r}{\fromafm{phvr8a}}}
+\transformfont{phvro8r}{\reencodefont{8r}{\fromafm{phvro8a}}}
+\transformfont{phvb8r} {\reencodefont{8r}{\fromafm{phvb8a}}}
+\transformfont{phvbo8r}{\reencodefont{8r}{\fromafm{phvbo8a}}}
+
+\transformfont{pcrr8r} {\reencodefont{8r}{\fromafm{pcrr8a}}}
+\transformfont{pcrro8r}{\reencodefont{8r}{\fromafm{pcrro8a}}}
+\transformfont{pcrb8r} {\reencodefont{8r}{\fromafm{pcrb8a}}}
+\transformfont{pcrbo8r}{\reencodefont{8r}{\fromafm{pcrbo8a}}}
+
+\installfonts
+
+\installfamily{TS1}{ptm}{}
+\installfont{ptmr8c} {ptmr8r,zpeur,textcomp} {TS1}{TS1}{ptm}{m}{n}{}
+\installfont{ptmro8c}{ptmro8r,zpeuri,textcomp}{TS1}{TS1}{ptm}{m}{sl}{}
+\installfont{ptmri8c}{ptmri8r,zpeuri,textcomp}{TS1}{TS1}{ptm}{m}{it}{}
+\installfont{ptmb8c} {ptmb8r,zpeub,textcomp} {TS1}{TS1}{ptm}{b}{n}{}
+\installfont{ptmbo8c}{ptmbo8r,zpeubi,textcomp}{TS1}{TS1}{ptm}{b}{sl}{}
+\installfont{ptmbi8c}{ptmbi8r,zpeubi,textcomp}{TS1}{TS1}{ptm}{b}{it}{}
+
+\installfamily{TS1}{phv}{}
+\installfont{phvr8c} {phvr8r,zpeurs,textcomp} {TS1}{TS1}{phv}{m}{n}{}
+\installfont{phvro8c}{phvro8r,zpeuris,textcomp}{TS1}{TS1}{phv}{m}{sl}{}
+\installfont{phvb8c} {phvb8r,zpeubs,textcomp} {TS1}{TS1}{phv}{b}{n}{}
+\installfont{phvbo8c}{phvbo8r,zpeubis,textcomp}{TS1}{TS1}{phv}{b}{sl}{}
+
+\installfamily{TS1}{pcr}{}
+\installfont{pcrr8c} {pcrr8r,zpeurt,textcomp} {TS1}{TS1}{pcr}{m}{n}{}
+\installfont{pcrro8c}{pcrro8r,zpeurit,textcomp}{TS1}{TS1}{pcr}{m}{sl}{}
+\installfont{pcrb8c} {pcrb8r,zpeubt,textcomp} {TS1}{TS1}{pcr}{b}{n}{}
+\installfont{pcrbo8c}{pcrbo8r,zpeubit,textcomp}{TS1}{TS1}{pcr}{b}{sl}{}
+
+\endinstallfonts
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/examples/mathptm/Makefile b/fonts/utilities/fontinst/examples/mathptm/Makefile
new file mode 100644
index 0000000000..8f2b4df065
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/Makefile
@@ -0,0 +1,24 @@
+ZAP= cmex10.mtx cmex9.mtx cmr10.mtx cmmi10.mtx cmsy10.mtx \
+ psyr.mtx psyr.pl \
+ ptmr8a.mtx ptmr8a.pl ptmr8r.mtx ptmr8r.pl \
+ ptmri8a.mtx ptmri8a.pl ptmri8r.mtx ptmri8r.pl \
+ pzcmi8a.mtx pzcmi8a.pl pzcmi8r.mtx pzcmi8r.pl \
+ zpsycmrv.vpl zptmcmr.vpl zptmcmrm.vpl zpzccmry.vpl \
+ fontptcm.log
+
+all: tex vfs
+
+tex:
+ tex fontptcm
+
+vfs:
+ vptovf zpsycmrv.vpl zpsycmrv.vf zpsycmrv.tfm
+ vptovf zptmcmr.vpl zptmcmr.vf zptmcmr.tfm
+ vptovf zptmcmrm.vpl zptmcmrm.vf zptmcmrm.tfm
+ vptovf zpzccmry.vpl zpzccmry.vf zpzccmry.tfm
+
+clean:
+ -rm $(ZAP) *.log
+
+realclean: clean
+ -rm p*tfm z*.tfm *.vf *.fd
diff --git a/fonts/utilities/fontinst/examples/mathptm/fontptcm.tex b/fonts/utilities/fontinst/examples/mathptm/fontptcm.tex
new file mode 100644
index 0000000000..12f9200f1a
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/fontptcm.tex
@@ -0,0 +1,75 @@
+%%% ====================================================================
+%%% @TeX-file{
+%%% author = "Alan Jeffrey and Sebastian Rathz and
+%%% Ulrik Vieth",
+%%% version = "1.801",
+%%% date = "30 June 1998",
+%%% time = "00:24:26 CEST",
+%%% filename = "fontptcm.tex",
+%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%% URL = "http://www.thphy.uni-duesseldorf.de/~vieth/",
+%%% checksum = "55484 75 248 2976",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "font installation example",
+%%% supported = "yes",
+%%% abstract = "This is an example program which uses
+%%% Adobe Times, Adobe Symbol and Computer
+%%% Modern fonts to build Times math fonts.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, ptmr8a.afm, ptmri8a.afm,
+%%% pzcmi8a.afm, psyr.afm, cmr10.pl,
+%%% cmmi10.pl, cmsy10.pl, cmex10.pl, cmex9.pl,
+%%% mathit.mtx, mathsy.mtx, mathex.mtx,
+%%% zrhax.mtx, zrmhax.mtx, zrvhax.mtx,
+%%% zrmkern.mtx, unsethum.mtx, unsetalf.mtx,
+%%% resetsy.mtx, kernoff.mtx, kernon.mtx",
+%%% }
+%%% ====================================================================
+
+% Math fonts built from Times, Symbol, Zapf Chancery and CM math.
+
+\input fontinst.sty
+
+\needsfontinstversion{1.800}
+
+\installfonts
+ \transformfont{ptmr8r} {\reencodefont{8r}{\fromafm{ptmr8a}}}
+ \transformfont{ptmri8r}{\reencodefont{8r}{\fromafm{ptmri8a}}}
+ \transformfont{pzcmi8r}{\reencodefont{8r}{\fromafm{pzcmi8a}}}
+ \fromafm{psyr}
+
+ % OT1: Latin and digits from Times-Roman, Greek from Symbol,
+ % accents and punctuation from Times, delimiters from cmr10
+ \installfamily{OT1}{ptmcm}{}
+ \installfont{zptmcmr}
+ {ptmr8r,psyr,resetsy,latin,%
+ zrhax,kernoff,cmr10,kernon}
+ {OT1}{OT1}{ptmcm}{m}{n}{}
+
+ % OML: Latin from Times-Italic, Greek from Adobe Symbol,
+ % operators, delimiters and punctuation from cmmi10
+ \installfamily{OML}{ptmcm}{\skewchar\font=127}
+ \installfont{zptmcmrm}
+ {ptmri8r,psyr,resetsy,%
+ zrmhax,kernoff,cmmi10,kernon,%
+ zrmkern,mathit}
+ {OML}{OML}{ptmcm}{m}{it}{}
+
+ % OMS: Humanist symbols from Times-Roman and Symbol,
+ % Calligraphic alphabet from Zapf Chancery,
+ % operators, delimiters and arrows from cmsy10
+ \installfamily{OMS}{pzccm}{}
+ \installfont{zpzccmry}
+ {cmsy10,zryhax,psyr,ptmr8r,%
+ unsetalf,pzcmi8r scaled 1124,mathsy}
+ {OMS}{OMS}{pzccm}{m}{n}{}
+
+ % OMX: summation and product from psyr, bigops from cmex9,
+ % delimiters, radicals and arrows from cmex10
+ \installfamily{OMX}{psycm}{}
+ \installfont{zpsycmrv}
+ {cmex10,psyr,zrvhax,cmex9 scaled 900}
+ {OMX}{OMX}{psycm}{m}{n}{}
+
+\endinstallfonts
+\end
diff --git a/fonts/utilities/fontinst/examples/mathptm/mathtest.tex b/fonts/utilities/fontinst/examples/mathptm/mathtest.tex
new file mode 100644
index 0000000000..f0504baf5c
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/mathtest.tex
@@ -0,0 +1,643 @@
+\documentclass[fleqn]{article}
+\usepackage{mathptm}
+
+\DeclareMathSymbol{\Gamma} {\mathalpha}{letters}{"00}
+\DeclareMathSymbol{\Delta} {\mathalpha}{letters}{"01}
+\DeclareMathSymbol{\Theta} {\mathalpha}{letters}{"02}
+\DeclareMathSymbol{\Lambda} {\mathalpha}{letters}{"03}
+\DeclareMathSymbol{\Xi} {\mathalpha}{letters}{"04}
+\DeclareMathSymbol{\Pi} {\mathalpha}{letters}{"05}
+\DeclareMathSymbol{\Sigma} {\mathalpha}{letters}{"06}
+\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
+\DeclareMathSymbol{\Phi} {\mathalpha}{letters}{"08}
+\DeclareMathSymbol{\Psi} {\mathalpha}{letters}{"09}
+\DeclareMathSymbol{\Omega} {\mathalpha}{letters}{"0A}
+
+\DeclareMathSymbol{\alpha} {\mathalpha}{letters}{"0B}
+\DeclareMathSymbol{\beta} {\mathalpha}{letters}{"0C}
+\DeclareMathSymbol{\gamma} {\mathalpha}{letters}{"0D}
+\DeclareMathSymbol{\delta} {\mathalpha}{letters}{"0E}
+\DeclareMathSymbol{\epsilon}{\mathalpha}{letters}{"0F}
+\DeclareMathSymbol{\zeta} {\mathalpha}{letters}{"10}
+\DeclareMathSymbol{\eta} {\mathalpha}{letters}{"11}
+\DeclareMathSymbol{\theta} {\mathalpha}{letters}{"12}
+\DeclareMathSymbol{\iota} {\mathalpha}{letters}{"13}
+\DeclareMathSymbol{\kappa} {\mathalpha}{letters}{"14}
+\DeclareMathSymbol{\lambda} {\mathalpha}{letters}{"15}
+\DeclareMathSymbol{\mu} {\mathalpha}{letters}{"16}
+\DeclareMathSymbol{\nu} {\mathalpha}{letters}{"17}
+\DeclareMathSymbol{\xi} {\mathalpha}{letters}{"18}
+\DeclareMathSymbol{\pi} {\mathalpha}{letters}{"19}
+\DeclareMathSymbol{\rho} {\mathalpha}{letters}{"1A}
+\DeclareMathSymbol{\sigma} {\mathalpha}{letters}{"1B}
+\DeclareMathSymbol{\tau} {\mathalpha}{letters}{"1C}
+\DeclareMathSymbol{\upsilon}{\mathalpha}{letters}{"1D}
+\DeclareMathSymbol{\phi} {\mathalpha}{letters}{"1E}
+\DeclareMathSymbol{\chi} {\mathalpha}{letters}{"1F}
+\DeclareMathSymbol{\psi} {\mathalpha}{letters}{"20}
+\DeclareMathSymbol{\omega} {\mathalpha}{letters}{"21}
+\DeclareMathSymbol{\varepsilon} {\mathalpha}{letters}{"22}
+\DeclareMathSymbol{\vartheta} {\mathalpha}{letters}{"23}
+\DeclareMathSymbol{\varpi} {\mathalpha}{letters}{"24}
+\DeclareMathSymbol{\varrho} {\mathalpha}{letters}{"25}
+\DeclareMathSymbol{\varsigma} {\mathalpha}{letters}{"26}
+\DeclareMathSymbol{\varphi} {\mathalpha}{letters}{"27}
+
+\DeclareMathSymbol{\dit}{\mathord}{letters}{`d}
+\DeclareMathSymbol{\dup}{\mathord}{operators}{`d}
+
+\nofiles
+
+\parindent 0pt
+\mathindent 1em
+
+\def\test#1{#1}
+
+\def\testnums{%
+ \test 0 \test 1 \test 2 \test 3 \test 4 \test 5 \test 6 \test 7
+ \test 8 \test 9 }
+\def\testupperi{%
+ \test A \test B \test C \test D \test E \test F \test G \test H
+ \test I \test J \test K \test L \test M }
+\def\testupperii{%
+ \test N \test O \test P \test Q \test R \test S \test T \test U
+ \test V \test W \test X \test Y \test Z }
+\def\testupper{%
+ \testupperi\testupperii}
+
+\def\testloweri{%
+ \test a \test b \test c \test d \test e \test f \test g \test h
+ \test i \test j \test k \test l \test m }
+\def\testlowerii{%
+ \test n \test o \test p \test q \test r \test s \test t \test u
+ \test v \test w \test x \test y \test z
+ \test\imath \test\jmath }
+\def\testlower{%
+ \testloweri\testlowerii}
+
+\def\testupgreeki{%
+ \test A \test B \test\Gamma \test\Delta \test E \test Z \test H
+ \test\Theta \test I \test K \test\Lambda \test M }
+\def\testupgreekii{%
+ \test N \test\Xi \test O \test\Pi \test P \test\Sigma \test T
+ \test\Upsilon \test\Phi \test X \test\Psi \test\Omega
+ \test\nabla }
+\def\testupgreek{%
+ \testupgreeki\testupgreekii}
+
+\def\testlowgreeki{%
+ \test\alpha \test\beta \test\gamma \test\delta \test\epsilon
+ \test\zeta \test\eta \test\theta \test\iota \test\kappa \test\lambda
+ \test\mu }
+\def\testlowgreekii{%
+ \test\nu \test\xi \test o \test\pi \test\rho \test\sigma \test\tau
+ \test\upsilon \test\phi \test\chi \test\psi \test\omega }
+\def\testlowgreekiii{%
+ \test\varepsilon \test\vartheta \test\varpi \test\varrho
+ \test\varsigma \test\varphi}
+\def\testlowgreek{%
+ \testlowgreeki\testlowgreekii\testlowgreekiii}
+
+
+\begin{document}
+
+\section{Math Alphabets}
+
+Math Italic (\texttt{\string\mathnormal})
+\def\test#1{\mathnormal{#1},}
+\begin{eqnarray*}
+ && {\testnums}\\
+ && {\testupper}\\
+ && {\testlower}\\
+ && {\testupgreek}\\
+ && {\testlowgreek}
+\end{eqnarray*}%
+
+Math Roman (\texttt{\string\mathrm})
+\def\test#1{\mathrm{#1},}
+\begin{eqnarray*}
+ && {\testnums}\\
+ && {\testupper}\\
+ && {\testlower}\\
+ && {\testupgreek}
+\end{eqnarray*}%
+
+%Math Italic Bold
+%\def\test#1{\mathbm{#1},}
+%\begin{eqnarray*}
+% && {\testnums}\\
+% && {\testupper}\\
+% && {\testlower}\\
+% && {\testupgreek}\\
+% && {\testlowgreek}
+%\end{eqnarray*}%
+
+%Math Bold (\texttt{\string\mathbf})
+%\def\test#1{\mathbf{#1},}
+%\begin{eqnarray*}
+% && {\testnums}\\
+% && {\testupper}\\
+% && {\testlower}\\
+% && {\testupgreek}
+%\end{eqnarray*}%
+
+Caligraphic (\texttt{\string\mathcal})
+\def\test#1{\mathcal{#1},}
+\begin{eqnarray*}
+ && {\testupper}
+\end{eqnarray*}%
+
+%Script (\texttt{\string\mathscr})
+%\def\test#1{\mathscr{#1},}
+%\begin{eqnarray*}
+% && {\testupper}
+%\end{eqnarray*}%
+
+%Fraktur (\texttt{\string\mathfrak})
+%\def\test#1{\mathfrak{#1},}
+%\begin{eqnarray*}
+% && {\testupper}\\
+% && {\testlower}
+%\end{eqnarray*}%
+
+%Blackboard Bold (\texttt{\string\mathbb})
+%\def\test#1{\mathbb{#1},}
+%\begin{eqnarray*}
+% && {\testupper}
+%\end{eqnarray*}%
+
+
+\clearpage
+\section{Character Sidebearings}
+
+\def\test#1{|#1|+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{|\mathrm{#1}|+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{|\mathbm{#1}|+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%%
+%\def\test#1{|\mathbf{#1}|+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}%
+%
+\def\test#1{|\mathcal{#1}|+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Superscript positioning}
+
+\def\test#1{#1^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\mathrm{#1}^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\mathbm{#1}^{2}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%
+%\def\test#1{\mathbf{#1}^{2}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}
+%
+\def\test#1{\mathcal{#1}^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Subscript positioning}
+
+\def\test#1{\mathnormal{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\mathrm{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\mathbm{#1}_{i}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}
+%%
+%\def\test#1{\mathbf{#1}_{i}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}%
+%
+\def\test#1{\mathcal{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Accent positioning}
+
+\def\test#1{\hat{#1}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\hat{\mathrm{#1}}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\hat{\mathbm{#1}}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%%
+%\def\test#1{\hat{\mathbf{#1}}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}
+%
+\def\test#1{\hat{\mathcal{#1}}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Differentials}
+
+\begin{eqnarray*}
+\gdef\test#1{\dit #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\dit \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+\begin{eqnarray*}
+\gdef\test#1{\dup #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\dup \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+\begin{eqnarray*}
+\gdef\test#1{\partial #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\partial \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Slash kerning}
+
+\def\test#1{1/#1+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}
+
+\def\test#1{#1/2+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}
+
+
+\clearpage
+\section{Big operators}
+
+\def\testop#1{#1_{i=1}^{n} x^{n} \quad}
+\begin{displaymath}
+ \testop\sum
+ \testop\prod
+ \testop\coprod
+ \testop\int
+ \testop\oint
+\end{displaymath}
+\begin{displaymath}
+ \testop\bigotimes
+ \testop\bigoplus
+ \testop\bigodot
+ \testop\bigwedge
+ \testop\bigvee
+ \testop\biguplus
+ \testop\bigcup
+ \testop\bigcap
+ \testop\bigsqcup
+% \testop\bigsqcap
+\end{displaymath}
+
+
+\section{Radicals}
+
+\begin{displaymath}
+ \sqrt{x+y} \qquad \sqrt{x^{2}+y^{2}} \qquad
+ \sqrt{x_{i}^{2}+y_{j}^{2}} \qquad
+ \sqrt{\left(\frac{\cos x}{2}\right)} \qquad
+ \sqrt{\left(\frac{\sin x}{2}\right)}
+\end{displaymath}
+
+\begingroup
+\delimitershortfall-1pt
+\begin{displaymath}
+ \sqrt{\sqrt{\sqrt{\sqrt{\sqrt{\sqrt{\sqrt{x+y}}}}}}}
+\end{displaymath}
+\endgroup % \delimitershortfall
+
+
+\section{Over- and underbraces}
+
+\begin{displaymath}
+ \overbrace{x} \quad
+ \overbrace{x+y} \quad
+ \overbrace{x^{2}+y^{2}} \quad
+ \overbrace{x_{i}^{2}+y_{j}^{2}} \quad
+ \underbrace{x} \quad
+ \underbrace{x+y} \quad
+ \underbrace{x_{i}+y_{j}} \quad
+ \underbrace{x_{i}^{2}+y_{j}^{2}} \quad
+\end{displaymath}
+
+
+\section{Normal and wide accents}
+
+\begin{displaymath}
+ \dot{x} \quad
+ \ddot{x} \quad
+ \vec{x} \quad
+ \bar{x} \quad
+ \overline{x} \quad
+ \overline{xx} \quad
+ \tilde{x} \quad
+ \widetilde{x} \quad
+ \widetilde{xx} \quad
+ \widetilde{xxx} \quad
+ \hat{x} \quad
+ \widehat{x} \quad
+ \widehat{xx} \quad
+ \widehat{xxx} \quad
+\end{displaymath}
+
+
+\section{Long arrows}
+
+\begin{displaymath}
+ \leftarrow \mathrel{-} \rightarrow \quad
+ \leftrightarrow \quad
+ \longleftarrow \quad
+ \longrightarrow \quad
+ \longleftrightarrow \quad
+ \Leftarrow = \Rightarrow \quad
+ \Leftrightarrow \quad
+ \Longleftarrow \quad
+ \Longrightarrow \quad
+ \Longleftrightarrow \quad
+\end{displaymath}
+
+
+\section{Left and right delimters}
+
+\def\testdelim#1#2{ - #1 f #2 - }
+\begin{displaymath}
+ \testdelim()
+ \testdelim[]
+ \testdelim\lfloor\rfloor
+ \testdelim\lceil\rceil
+ \testdelim\langle\rangle
+ \testdelim\{\}
+\end{displaymath}
+
+\def\testdelim#1#2{ - \left#1 f \right#2 - }
+\begin{displaymath}
+ \testdelim()
+ \testdelim[]
+ \testdelim\lfloor\rfloor
+ \testdelim\lceil\rceil
+ \testdelim\langle\rangle
+ \testdelim\{\}
+% \testdelim\lgroup\rgroup
+% \testdelim\lmoustache\rmoustache
+\end{displaymath}
+\begin{displaymath}
+ \testdelim)(
+ \testdelim][
+ \testdelim//
+ \testdelim\backslash\backslash
+ \testdelim/\backslash
+ \testdelim\backslash/
+\end{displaymath}
+
+
+\clearpage
+\section{Big-g-g delimters}
+
+\def\testdelim#1#2{%
+ - \left#1\left#1\left#1\left#1\left#1\left#1\left#1\left#1 -
+ \right#2\right#2\right#2\right#2\right#2\right#2\right#2\right#2 -}
+
+\begingroup
+\delimitershortfall-1pt
+\begin{displaymath}
+ \testdelim\lfloor\rfloor
+ \qquad
+ \testdelim()
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\lceil\rceil
+ \qquad
+ \testdelim\{\}
+\end{displaymath}
+\begin{displaymath}
+ \testdelim[]
+ \qquad
+ \testdelim\lgroup\rgroup
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\langle\rangle
+ \qquad
+ \testdelim\lmoustache\rmoustache
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\uparrow\downarrow \quad
+ \testdelim\Uparrow\Downarrow \quad
+\end{displaymath}
+\endgroup % \delimitershortfall
+
+
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/fonts/utilities/fontinst/examples/mathptm/resetsy.mtx b/fonts/utilities/fontinst/examples/mathptm/resetsy.mtx
new file mode 100644
index 0000000000..27da54c046
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/resetsy.mtx
@@ -0,0 +1,30 @@
+\relax
+
+\metrics
+
+\unsetglyph{Upsilon}
+\setglyph{Upsilon}
+ \glyph{Upsilon1}{1000}
+\endsetglyph
+
+\setglyph{pi1}
+ \glyph{omega1}{1000}
+\endsetglyph
+
+\setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+\endsetglyph
+
+\setglyph{rho1}
+ \glyph{rho}{1000}
+\endsetglyph
+
+\setglyph{dotlessj}
+ \moveup{\neg{\depth{j}}}
+ \glyphrule{\width{j}}{\add{\depth{j}}{\height{dotlessi}}}
+ \resetitalic{\italic{dotlessi}}
+ \moveup{\depth{j}}
+ \glyphwarning{missing glyph `dotlessj'}
+\endsetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/unsetmu.mtx b/fonts/utilities/fontinst/examples/mathptm/unsetmu.mtx
new file mode 100644
index 0000000000..63b222ed9f
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/unsetmu.mtx
@@ -0,0 +1,7 @@
+\relax
+
+\metrics
+
+\unsetglyph{mu}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/zrhax.mtx b/fonts/utilities/fontinst/examples/mathptm/zrhax.mtx
new file mode 100644
index 0000000000..ce1bc5a281
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/zrhax.mtx
@@ -0,0 +1,15 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the Times-Roman
+% glyphs. We unset those glyphs that should be taken from cmr.
+
+\unsetglyph{plus}
+\unsetglyph{equal}
+\unsetglyph{parenleft}
+\unsetglyph{parenright}
+\unsetglyph{bracketleft}
+\unsetglyph{bracketright}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/zrmhax.mtx b/fonts/utilities/fontinst/examples/mathptm/zrmhax.mtx
new file mode 100644
index 0000000000..141899c6dc
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/zrmhax.mtx
@@ -0,0 +1,14 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the Times-Italic
+% glyphs. We unset those glyphs that should be taken from cmmi.
+
+\unsetglyph{period}
+\unsetglyph{comma}
+\unsetglyph{less}
+\unsetglyph{slash}
+\unsetglyph{greater}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/zrmkern.mtx b/fonts/utilities/fontinst/examples/mathptm/zrmkern.mtx
new file mode 100644
index 0000000000..62ccd50a84
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/zrmkern.mtx
@@ -0,0 +1,158 @@
+\relax
+
+% The following adjustments (as originally derived by Alan Jeffrey)
+% are tuned for Times-Italic and non-oblique Adobe Symbol.
+
+\metrics
+
+\needsfontinstversion{1.800}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount of extra space for subscripts
+
+\setcommand\shiftglyph#1#2#3#4{
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+}
+
+% \skewkern sets a skewchar kern, assuming that `tie'
+% is the skewchar.
+%
+% #1 the name of the glyph
+% #2 the amount of skewchar kerning
+
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+
+% A
+% B
+\shiftglyph{C}{-50}{0}{-25}
+% D
+\shiftglyph{E}{0}{50}{0}
+\shiftglyph{F}{0}{50}{-100}
+% G
+\shiftglyph{H}{0}{25}{-25}
+\shiftglyph{I}{0}{0}{-25}
+\shiftglyph{J}{0}{0}{-25}
+\shiftglyph{K}{0}{0}{-25}
+% L
+% M
+\shiftglyph{N}{0}{0}{-25}
+% O
+\shiftglyph{P}{0}{0}{-100}
+% Q
+% R
+% S
+\shiftglyph{T}{0}{50}{-75}
+\shiftglyph{U}{-50}{50}{-25}
+\shiftglyph{V}{-50}{50}{-50}
+\shiftglyph{W}{-50}{50}{-50}
+\shiftglyph{X}{0}{50}{-25}
+\shiftglyph{Y}{-50}{50}{-50}
+% Z
+
+% a
+\shiftglyph{b}{0}{-25}{0}
+% c
+\shiftglyph{d}{0}{25}{0}
+% e
+\shiftglyph{f}{150}{0}{25}
+\shiftglyph{g}{0}{-50}{0}
+% h
+% i
+\shiftglyph{j}{150}{25}{0}
+% k
+\shiftglyph{l}{0}{50}{0}
+% m
+% n
+\shiftglyph{o}{0}{-50}{0}
+\shiftglyph{p}{75}{-25}{0}
+% q
+% r
+% s
+\shiftglyph{t}{-25}{50}{0}
+% u
+% v
+% w
+% x
+% y
+% z
+
+\shiftglyph{Upsilon}{0}{0}{-150} % was: -50 -100, adds up to -150
+\shiftglyph{weierstrass}{-100}{-200}{-150}
+
+\skewkern{A}{75}
+\skewkern{B}{100}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{100}
+\skewkern{J}{200}
+\skewkern{K}{75}
+% L
+\skewkern{M}{100}
+\skewkern{N}{25}
+\skewkern{O}{100}
+\skewkern{P}{100}
+\skewkern{Q}{100}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{X}{50}
+\skewkern{Z}{50}
+
+\skewkern{a}{75}
+% b
+\skewkern{c}{75}
+\skewkern{d}{200}
+\skewkern{e}{75}
+\skewkern{f}{150}
+\skewkern{g}{75}
+% h
+\skewkern{i}{75}
+\skewkern{j}{150}
+% k
+\skewkern{l}{100}
+\skewkern{m}{50}
+\skewkern{n}{50}
+\skewkern{o}{75}
+\skewkern{p}{100}
+\skewkern{q}{75}
+\skewkern{r}{50}
+\skewkern{s}{100}
+\skewkern{t}{50}
+\skewkern{u}{75}
+\skewkern{v}{75}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{75}
+\skewkern{z}{50}
+
+\skewkern{dotlessi}{50}
+\skewkern{dotlessj}{50}
+
+\skewkern{upsilon}{25}
+\skewkern{iota}{-50}
+\skewkern{lambda}{-75}
+\skewkern{weierstrass}{175}
+\skewkern{lscript}{125}
+
+\resetglyph{vector}
+ \movert{-100}
+ \glyph{vector}{1000}
+ \movert{100}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/zrvhax.mtx b/fonts/utilities/fontinst/examples/mathptm/zrvhax.mtx
new file mode 100644
index 0000000000..6270feb615
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/zrvhax.mtx
@@ -0,0 +1,73 @@
+\relax
+
+% This metrics file is loaded after having read the cmex glyps.
+% We unset the big operators that should be taken from Symbol
+% or from a scaled-down version of cmex.
+
+\metrics
+
+\setint{psy-textscale}{1000}
+\setint{psy-displayscale}{1440}
+
+\unsetglyph{circledotdisplay}
+\unsetglyph{circledottext}
+\unsetglyph{circlemultiplydisplay}
+\unsetglyph{circlemultiplytext}
+\unsetglyph{circleplusdisplay}
+\unsetglyph{circleplustext}
+\unsetglyph{contintegraldisplay}
+\unsetglyph{contintegraltext}
+\unsetglyph{integraldisplay}
+\unsetglyph{integraltext}
+\unsetglyph{intersectiondisplay}
+\unsetglyph{intersectiontext}
+\unsetglyph{logicalanddisplay}
+\unsetglyph{logicalandtext}
+\unsetglyph{logicalordisplay}
+\unsetglyph{logicalortext}
+\unsetglyph{uniondisplay}
+\unsetglyph{unionmultidisplay}
+\unsetglyph{unionmultitext}
+\unsetglyph{unionsqdisplay}
+\unsetglyph{unionsqtext}
+\unsetglyph{uniontext}
+
+\resetglyph{summationtext}
+ \glyph{summation}{\int{psy-textscale}}
+\endresetglyph
+
+\resetglyph{summationdisplay}
+ \glyph{summation}{\int{psy-displayscale}}
+\endresetglyph
+
+\resetglyph{producttext}
+ \glyph{product}{\int{psy-textscale}}
+\endresetglyph
+
+\resetglyph{productdisplay}
+ \glyph{product}{\int{psy-displayscale}}
+\endresetglyph
+
+\resetglyph{coproducttext}
+ \moveup{\neg{\depth{producttext}}}
+ \glyphrule{
+ \width{producttext}
+ }{
+ \add{\height{producttext}}{\depth{producttext}}
+ }
+ \moveup{\depth{producttext}}
+ \glyphwarning{missing glyph `coproducttext'}
+\endresetglyph
+
+\resetglyph{coproductdisplay}
+ \moveup{\neg{\depth{productdisplay}}}
+ \glyphrule{
+ \width{productdisplay}
+ }{
+ \add{\height{productdisplay}}{\depth{productdisplay}}
+ }
+ \moveup{\depth{productdisplay}}
+ \glyphwarning{missing glyph `coproductdisplay'}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptm/zryhax.mtx b/fonts/utilities/fontinst/examples/mathptm/zryhax.mtx
new file mode 100644
index 0000000000..19addd6ad8
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptm/zryhax.mtx
@@ -0,0 +1,26 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the cmsy glyphs.
+% We unset those glyphs that should be taken from Times or Symbol.
+
+\unsetglyph{infinity}
+\unsetglyph{proportional}
+
+\unsetglyph{emptysetstress}
+
+\unsetglyph{Rfraktur}
+\unsetglyph{Ifraktur}
+
+\unsetglyph{aleph}
+
+\unsetglyph{coproduct}
+\unsetglyph{gradient}
+
+\unsetglyph{section}
+\unsetglyph{dagger}
+\unsetglyph{daggerdbl}
+\unsetglyph{paragraph}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/Makefile b/fonts/utilities/fontinst/examples/mathptmx/Makefile
new file mode 100644
index 0000000000..37a660e0cb
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/Makefile
@@ -0,0 +1,23 @@
+ZAP= cmex10.mtx cmr10.mtx cmmi10.mtx cmsy10.mtx \
+ rsfs10.mtx psyr.mtx psyr.pl psyro.mtx psyro.pl \
+ ptmr8a.mtx ptmr8a.pl ptmr8r.mtx ptmr8r.pl \
+ ptmri8a.mtx ptmri8a.pl ptmri8r.mtx ptmri8r.pl \
+ zptmcm7t.vpl zptmcm7m.vpl zptmcm7y.vpl zptmcm7v.vpl \
+ fontptcmx.log
+
+all: tex vfs
+
+tex:
+ tex fontptcmx
+
+vfs:
+ vptovf zptmcm7t.vpl zptmcm7t.vf zptmcm7t.tfm
+ vptovf zptmcm7m.vpl zptmcm7m.vf zptmcm7m.tfm
+ vptovf zptmcm7y.vpl zptmcm7y.vf zptmcm7y.tfm
+ vptovf zptmcm7v.vpl zptmcm7v.vf zptmcm7v.tfm
+
+clean:
+ -rm $(ZAP) *.log
+
+realclean: clean
+ -rm p*tfm z*.tfm *.vf *.fd
diff --git a/fonts/utilities/fontinst/examples/mathptmx/fontptcmx.tex b/fonts/utilities/fontinst/examples/mathptmx/fontptcmx.tex
new file mode 100644
index 0000000000..0f876ce345
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/fontptcmx.tex
@@ -0,0 +1,76 @@
+%%% ====================================================================
+%%% @TeX-file{
+%%% author = "Alan Jeffrey and Sebastian Rathz and
+%%% Ulrik Vieth",
+%%% version = "1.802",
+%%% date = "01 July 1998",
+%%% time = "10:57:48 MET DST",
+%%% filename = "fontzcmtmx.tex",
+%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%% URL = "http://www.thphy.uni-duesseldorf.de/~vieth/",
+%%% checksum = "49508 76 251 3044",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "font installation example",
+%%% supported = "yes",
+%%% abstract = "This is an example program which uses
+%%% Adobe Times, Adobe Symbol and Computer
+%%% Modern fonts to build Times math fonts.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, ptmr8a.afm, ptmri8a.afm,
+%%% pzcmi8a.afm, psyr.afm, cmr10.pl,
+%%% cmmi10.pl, cmsy10.pl, cmex10.pl,
+%%% mathit.mtx, mathsy.mtx, mathex.mtx,
+%%% zrhax.mtx, zrmhax.mtx, zrvhax.mtx,
+%%% zrmkern.mtx, unsethum.mtx, unsetalf.mtx,
+%%% resetsy.mtx, kernoff.mtx, kernon.mtx",
+%%% }
+%%% ====================================================================
+
+% Math fonts built from Times, Symbol, RSFS and CM math.
+
+\input fontinst.sty
+
+\needsfontinstversion{1.800}
+
+\declareencoding{RAS SCRIPT}{rsfs}
+
+\installfonts
+ \transformfont{ptmr8r} {\reencodefont{8r}{\fromafm{ptmr8a}}}
+ \transformfont{ptmri8r}{\reencodefont{8r}{\fromafm{ptmri8a}}}
+ \transformfont{psyro} {\slantfont{167}{\fromafm{psyr}}}
+
+ % OT1: Latin and digits from Times-Roman, Greek from Symbol,
+ % accents and punctuation from Times, delimiters from cmr10
+ \installfamily{OT1}{ztmcm}{}
+ \installfont{zptmcm7t}
+ {ptmr8r,psyr,resetsy,latin,%
+ zrhax,kernoff,cmr10,kernon}
+ {OT1}{OT1}{ztmcm}{m}{n}{}
+
+ % OML: Latin from Times-Italic, Greek from Symbol (oblique),
+ % operators, delimiters and puctuation from cmmi10
+ \installfamily{OML}{ztmcm}{\skewchar\font=127}
+ \installfont{zptmcm7m}
+ {ptmri8r,unsetmu,psyro,resetsy,%
+ zrmhax,kernoff,cmmi10,kernon,%
+ mathit,zrmkernx}
+ {OML}{OML}{ztmcm}{m}{it}{}
+
+ % OMS: Humanist symbols from Times-Roman and Symbol,
+ % Script alphabet from Ralph Smith's Formal Script,
+ % operators, delimiters and arrows from cmsy10
+ \installfamily{OMS}{ztmcm}{\skewchar\font=48}
+ \installfont{zptmcm7y}
+ {kernoff,cmsy10,kernon,zryhax,ptmr8r,psyr,%
+ unsetalf,rsfs10,zrykernx,mathsy}
+ {OMS}{OMS}{ztmcm}{m}{n}{}
+
+ % OMX: summation and product from psyr, bigops from scaled cmex10,
+ % delimiters, radicals and arrows from cmex10
+ \installfamily{OMX}{ztmcm}{}
+ \installfont{zptmcm7v}
+ {cmex10,psyr,zrvhax,cmex10 scaled 900}
+ {OMX}{OMX}{ztmcm}{m}{n}{}
+
+\endinstallfonts
+\end
diff --git a/fonts/utilities/fontinst/examples/mathptmx/mathptmx.sty b/fonts/utilities/fontinst/examples/mathptmx/mathptmx.sty
new file mode 100644
index 0000000000..068bddd65c
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/mathptmx.sty
@@ -0,0 +1,42 @@
+\def\filedate{1998/06/30}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{mathptmx}[\filedate\space
+ Times + math package from fontinst]
+\def\rmdefault{ptm}
+\DeclareSymbolFont{operators} {OT1}{ztmcm}{m}{n}
+\DeclareSymbolFont{letters} {OML}{ztmcm}{m}{it}
+\DeclareSymbolFont{symbols} {OMS}{ztmcm}{m}{n}
+\DeclareSymbolFont{largesymbols}{OMX}{ztmcm}{m}{n}
+\DeclareSymbolFont{bold} {OT1}{ptm}{bx}{n}
+\DeclareSymbolFont{italic} {OT1}{ptm}{m}{it}
+\@ifundefined{mathbf}{}{\DeclareMathAlphabet{\mathbf}{OT1}{ptm}{bx}{n}}
+\@ifundefined{mathit}{}{\DeclareMathAlphabet{\mathit}{OT1}{ptm}{m}{it}}
+\DeclareMathSymbol{\omicron}{0}{operators}{`\o}
+\thinmuskip=2mu
+\medmuskip=2.5mu plus 1mu minus 1mu
+\thickmuskip=4mu plus 1.5mu minus 1mu
+ \let\@tempa\version@elt
+ \def\version@elt#1{%
+ \ifx\mv@bold#1\else\noexpand\version@elt\noexpand#1\fi}
+ \edef\version@list{\version@list}
+ \let\version@elt\@tempa
+ \let\mv@bold\@undefined
+\def\boldmath{%
+ \PackageWarning{there is no bold Symbol font}%
+ \global\let\boldmath=\relax
+}
+\DeclareMathSizes{5}{5}{5}{5}
+\DeclareMathSizes{6}{6}{5}{5}
+\DeclareMathSizes{7}{7}{5}{5}
+\DeclareMathSizes{8}{8}{6}{5}
+\DeclareMathSizes{9}{9}{7}{5}
+\DeclareMathSizes{10}{10}{7.4}{6}
+\DeclareMathSizes{10.95}{10.95}{8}{6}
+\DeclareMathSizes{12}{12}{9}{7}
+\DeclareMathSizes{14.4}{14.4}{10.95}{8}
+\DeclareMathSizes{17.28}{17.28}{12}{10}
+\DeclareMathSizes{20.74}{20.74}{14.4}{12}
+\DeclareMathSizes{24.88}{24.88}{17.28}{14.4}
+\endinput
+%%
+%% End of file `mathptmx.sty'.
diff --git a/fonts/utilities/fontinst/examples/mathptmx/mathtestx.tex b/fonts/utilities/fontinst/examples/mathptmx/mathtestx.tex
new file mode 100644
index 0000000000..8f3342ea7c
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/mathtestx.tex
@@ -0,0 +1,643 @@
+\documentclass[fleqn]{article}
+\usepackage{mathptmx}
+
+\DeclareMathSymbol{\Gamma} {\mathalpha}{letters}{"00}
+\DeclareMathSymbol{\Delta} {\mathalpha}{letters}{"01}
+\DeclareMathSymbol{\Theta} {\mathalpha}{letters}{"02}
+\DeclareMathSymbol{\Lambda} {\mathalpha}{letters}{"03}
+\DeclareMathSymbol{\Xi} {\mathalpha}{letters}{"04}
+\DeclareMathSymbol{\Pi} {\mathalpha}{letters}{"05}
+\DeclareMathSymbol{\Sigma} {\mathalpha}{letters}{"06}
+\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
+\DeclareMathSymbol{\Phi} {\mathalpha}{letters}{"08}
+\DeclareMathSymbol{\Psi} {\mathalpha}{letters}{"09}
+\DeclareMathSymbol{\Omega} {\mathalpha}{letters}{"0A}
+
+\DeclareMathSymbol{\alpha} {\mathalpha}{letters}{"0B}
+\DeclareMathSymbol{\beta} {\mathalpha}{letters}{"0C}
+\DeclareMathSymbol{\gamma} {\mathalpha}{letters}{"0D}
+\DeclareMathSymbol{\delta} {\mathalpha}{letters}{"0E}
+\DeclareMathSymbol{\epsilon}{\mathalpha}{letters}{"0F}
+\DeclareMathSymbol{\zeta} {\mathalpha}{letters}{"10}
+\DeclareMathSymbol{\eta} {\mathalpha}{letters}{"11}
+\DeclareMathSymbol{\theta} {\mathalpha}{letters}{"12}
+\DeclareMathSymbol{\iota} {\mathalpha}{letters}{"13}
+\DeclareMathSymbol{\kappa} {\mathalpha}{letters}{"14}
+\DeclareMathSymbol{\lambda} {\mathalpha}{letters}{"15}
+\DeclareMathSymbol{\mu} {\mathalpha}{letters}{"16}
+\DeclareMathSymbol{\nu} {\mathalpha}{letters}{"17}
+\DeclareMathSymbol{\xi} {\mathalpha}{letters}{"18}
+\DeclareMathSymbol{\pi} {\mathalpha}{letters}{"19}
+\DeclareMathSymbol{\rho} {\mathalpha}{letters}{"1A}
+\DeclareMathSymbol{\sigma} {\mathalpha}{letters}{"1B}
+\DeclareMathSymbol{\tau} {\mathalpha}{letters}{"1C}
+\DeclareMathSymbol{\upsilon}{\mathalpha}{letters}{"1D}
+\DeclareMathSymbol{\phi} {\mathalpha}{letters}{"1E}
+\DeclareMathSymbol{\chi} {\mathalpha}{letters}{"1F}
+\DeclareMathSymbol{\psi} {\mathalpha}{letters}{"20}
+\DeclareMathSymbol{\omega} {\mathalpha}{letters}{"21}
+\DeclareMathSymbol{\varepsilon} {\mathalpha}{letters}{"22}
+\DeclareMathSymbol{\vartheta} {\mathalpha}{letters}{"23}
+\DeclareMathSymbol{\varpi} {\mathalpha}{letters}{"24}
+\DeclareMathSymbol{\varrho} {\mathalpha}{letters}{"25}
+\DeclareMathSymbol{\varsigma} {\mathalpha}{letters}{"26}
+\DeclareMathSymbol{\varphi} {\mathalpha}{letters}{"27}
+
+\DeclareMathSymbol{\dit}{\mathord}{letters}{`d}
+\DeclareMathSymbol{\dup}{\mathord}{operators}{`d}
+
+\nofiles
+
+\parindent 0pt
+\mathindent 1em
+
+\def\test#1{#1}
+
+\def\testnums{%
+ \test 0 \test 1 \test 2 \test 3 \test 4 \test 5 \test 6 \test 7
+ \test 8 \test 9 }
+\def\testupperi{%
+ \test A \test B \test C \test D \test E \test F \test G \test H
+ \test I \test J \test K \test L \test M }
+\def\testupperii{%
+ \test N \test O \test P \test Q \test R \test S \test T \test U
+ \test V \test W \test X \test Y \test Z }
+\def\testupper{%
+ \testupperi\testupperii}
+
+\def\testloweri{%
+ \test a \test b \test c \test d \test e \test f \test g \test h
+ \test i \test j \test k \test l \test m }
+\def\testlowerii{%
+ \test n \test o \test p \test q \test r \test s \test t \test u
+ \test v \test w \test x \test y \test z
+ \test\imath \test\jmath }
+\def\testlower{%
+ \testloweri\testlowerii}
+
+\def\testupgreeki{%
+ \test A \test B \test\Gamma \test\Delta \test E \test Z \test H
+ \test\Theta \test I \test K \test\Lambda \test M }
+\def\testupgreekii{%
+ \test N \test\Xi \test O \test\Pi \test P \test\Sigma \test T
+ \test\Upsilon \test\Phi \test X \test\Psi \test\Omega
+ \test\nabla }
+\def\testupgreek{%
+ \testupgreeki\testupgreekii}
+
+\def\testlowgreeki{%
+ \test\alpha \test\beta \test\gamma \test\delta \test\epsilon
+ \test\zeta \test\eta \test\theta \test\iota \test\kappa \test\lambda
+ \test\mu }
+\def\testlowgreekii{%
+ \test\nu \test\xi \test o \test\pi \test\rho \test\sigma \test\tau
+ \test\upsilon \test\phi \test\chi \test\psi \test\omega }
+\def\testlowgreekiii{%
+ \test\varepsilon \test\vartheta \test\varpi \test\varrho
+ \test\varsigma \test\varphi}
+\def\testlowgreek{%
+ \testlowgreeki\testlowgreekii\testlowgreekiii}
+
+
+\begin{document}
+
+\section{Math Alphabets}
+
+Math Italic (\texttt{\string\mathnormal})
+\def\test#1{\mathnormal{#1},}
+\begin{eqnarray*}
+ && {\testnums}\\
+ && {\testupper}\\
+ && {\testlower}\\
+ && {\testupgreek}\\
+ && {\testlowgreek}
+\end{eqnarray*}%
+
+Math Roman (\texttt{\string\mathrm})
+\def\test#1{\mathrm{#1},}
+\begin{eqnarray*}
+ && {\testnums}\\
+ && {\testupper}\\
+ && {\testlower}\\
+ && {\testupgreek}
+\end{eqnarray*}%
+
+%Math Italic Bold
+%\def\test#1{\mathbm{#1},}
+%\begin{eqnarray*}
+% && {\testnums}\\
+% && {\testupper}\\
+% && {\testlower}\\
+% && {\testupgreek}\\
+% && {\testlowgreek}
+%\end{eqnarray*}%
+
+%Math Bold (\texttt{\string\mathbf})
+%\def\test#1{\mathbf{#1},}
+%\begin{eqnarray*}
+% && {\testnums}\\
+% && {\testupper}\\
+% && {\testlower}\\
+% && {\testupgreek}
+%\end{eqnarray*}%
+
+Caligraphic (\texttt{\string\mathcal})
+\def\test#1{\mathcal{#1},}
+\begin{eqnarray*}
+ && {\testupper}
+\end{eqnarray*}%
+
+%Script (\texttt{\string\mathscr})
+%\def\test#1{\mathscr{#1},}
+%\begin{eqnarray*}
+% && {\testupper}
+%\end{eqnarray*}%
+
+%Fraktur (\texttt{\string\mathfrak})
+%\def\test#1{\mathfrak{#1},}
+%\begin{eqnarray*}
+% && {\testupper}\\
+% && {\testlower}
+%\end{eqnarray*}%
+
+%Blackboard Bold (\texttt{\string\mathbb})
+%\def\test#1{\mathbb{#1},}
+%\begin{eqnarray*}
+% && {\testupper}
+%\end{eqnarray*}%
+
+
+\clearpage
+\section{Character Sidebearings}
+
+\def\test#1{|#1|+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{|\mathrm{#1}|+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{|\mathbm{#1}|+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%%
+%\def\test#1{|\mathbf{#1}|+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}%
+%
+\def\test#1{|\mathcal{#1}|+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Superscript positioning}
+
+\def\test#1{#1^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\mathrm{#1}^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\mathbm{#1}^{2}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%
+%\def\test#1{\mathbf{#1}^{2}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}
+%
+\def\test#1{\mathcal{#1}^{2}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Subscript positioning}
+
+\def\test#1{\mathnormal{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\mathrm{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\mathbm{#1}_{i}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}
+%%
+%\def\test#1{\mathbf{#1}_{i}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}%
+%
+\def\test#1{\mathcal{#1}_{i}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Accent positioning}
+
+\def\test#1{\hat{#1}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}%
+%
+\def\test#1{\hat{\mathrm{#1}}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+%\def\test#1{\hat{\mathbm{#1}}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}\\
+% && {\testlowgreeki}\\
+% && {\testlowgreekii}\\
+% && {\testlowgreekiii}
+%\end{eqnarray*}%
+%%
+%\def\test#1{\hat{\mathbf{#1}}+}%
+%\begin{eqnarray*}
+% && {\testupperi}\\
+% && {\testupperii}\\
+% && {\testloweri}\\
+% && {\testlowerii}\\
+% && {\testupgreeki}\\
+% && {\testupgreekii}
+%\end{eqnarray*}
+%
+\def\test#1{\hat{\mathcal{#1}}+}%
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Differentials}
+
+\begin{eqnarray*}
+\gdef\test#1{\dit #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\dit \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+\begin{eqnarray*}
+\gdef\test#1{\dup #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\dup \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+%
+\begin{eqnarray*}
+\gdef\test#1{\partial #1+}%
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}\\
+\gdef\test#1{\partial \mathrm{#1}+}%
+ && {\testupgreeki}\\
+ && {\testupgreekii}
+\end{eqnarray*}%
+
+
+\clearpage
+\section{Slash kerning}
+
+\def\test#1{1/#1+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}
+
+\def\test#1{#1/2+}
+\begin{eqnarray*}
+ && {\testupperi}\\
+ && {\testupperii}\\
+ && {\testloweri}\\
+ && {\testlowerii}\\
+ && {\testupgreeki}\\
+ && {\testupgreekii}\\
+ && {\testlowgreeki}\\
+ && {\testlowgreekii}\\
+ && {\testlowgreekiii}
+\end{eqnarray*}
+
+
+\clearpage
+\section{Big operators}
+
+\def\testop#1{#1_{i=1}^{n} x^{n} \quad}
+\begin{displaymath}
+ \testop\sum
+ \testop\prod
+ \testop\coprod
+ \testop\int
+ \testop\oint
+\end{displaymath}
+\begin{displaymath}
+ \testop\bigotimes
+ \testop\bigoplus
+ \testop\bigodot
+ \testop\bigwedge
+ \testop\bigvee
+ \testop\biguplus
+ \testop\bigcup
+ \testop\bigcap
+ \testop\bigsqcup
+% \testop\bigsqcap
+\end{displaymath}
+
+
+\section{Radicals}
+
+\begin{displaymath}
+ \sqrt{x+y} \qquad \sqrt{x^{2}+y^{2}} \qquad
+ \sqrt{x_{i}^{2}+y_{j}^{2}} \qquad
+ \sqrt{\left(\frac{\cos x}{2}\right)} \qquad
+ \sqrt{\left(\frac{\sin x}{2}\right)}
+\end{displaymath}
+
+\begingroup
+\delimitershortfall-1pt
+\begin{displaymath}
+ \sqrt{\sqrt{\sqrt{\sqrt{\sqrt{\sqrt{\sqrt{x+y}}}}}}}
+\end{displaymath}
+\endgroup % \delimitershortfall
+
+
+\section{Over- and underbraces}
+
+\begin{displaymath}
+ \overbrace{x} \quad
+ \overbrace{x+y} \quad
+ \overbrace{x^{2}+y^{2}} \quad
+ \overbrace{x_{i}^{2}+y_{j}^{2}} \quad
+ \underbrace{x} \quad
+ \underbrace{x+y} \quad
+ \underbrace{x_{i}+y_{j}} \quad
+ \underbrace{x_{i}^{2}+y_{j}^{2}} \quad
+\end{displaymath}
+
+
+\section{Normal and wide accents}
+
+\begin{displaymath}
+ \dot{x} \quad
+ \ddot{x} \quad
+ \vec{x} \quad
+ \bar{x} \quad
+ \overline{x} \quad
+ \overline{xx} \quad
+ \tilde{x} \quad
+ \widetilde{x} \quad
+ \widetilde{xx} \quad
+ \widetilde{xxx} \quad
+ \hat{x} \quad
+ \widehat{x} \quad
+ \widehat{xx} \quad
+ \widehat{xxx} \quad
+\end{displaymath}
+
+
+\section{Long arrows}
+
+\begin{displaymath}
+ \leftarrow \mathrel{-} \rightarrow \quad
+ \leftrightarrow \quad
+ \longleftarrow \quad
+ \longrightarrow \quad
+ \longleftrightarrow \quad
+ \Leftarrow = \Rightarrow \quad
+ \Leftrightarrow \quad
+ \Longleftarrow \quad
+ \Longrightarrow \quad
+ \Longleftrightarrow \quad
+\end{displaymath}
+
+
+\section{Left and right delimters}
+
+\def\testdelim#1#2{ - #1 f #2 - }
+\begin{displaymath}
+ \testdelim()
+ \testdelim[]
+ \testdelim\lfloor\rfloor
+ \testdelim\lceil\rceil
+ \testdelim\langle\rangle
+ \testdelim\{\}
+\end{displaymath}
+
+\def\testdelim#1#2{ - \left#1 f \right#2 - }
+\begin{displaymath}
+ \testdelim()
+ \testdelim[]
+ \testdelim\lfloor\rfloor
+ \testdelim\lceil\rceil
+ \testdelim\langle\rangle
+ \testdelim\{\}
+% \testdelim\lgroup\rgroup
+% \testdelim\lmoustache\rmoustache
+\end{displaymath}
+\begin{displaymath}
+ \testdelim)(
+ \testdelim][
+ \testdelim//
+ \testdelim\backslash\backslash
+ \testdelim/\backslash
+ \testdelim\backslash/
+\end{displaymath}
+
+
+\clearpage
+\section{Big-g-g delimters}
+
+\def\testdelim#1#2{%
+ - \left#1\left#1\left#1\left#1\left#1\left#1\left#1\left#1 -
+ \right#2\right#2\right#2\right#2\right#2\right#2\right#2\right#2 -}
+
+\begingroup
+\delimitershortfall-1pt
+\begin{displaymath}
+ \testdelim\lfloor\rfloor
+ \qquad
+ \testdelim()
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\lceil\rceil
+ \qquad
+ \testdelim\{\}
+\end{displaymath}
+\begin{displaymath}
+ \testdelim[]
+ \qquad
+ \testdelim\lgroup\rgroup
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\langle\rangle
+ \qquad
+ \testdelim\lmoustache\rmoustache
+\end{displaymath}
+\begin{displaymath}
+ \testdelim\uparrow\downarrow \quad
+ \testdelim\Uparrow\Downarrow \quad
+\end{displaymath}
+\endgroup % \delimitershortfall
+
+
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/fonts/utilities/fontinst/examples/mathptmx/resetsy.mtx b/fonts/utilities/fontinst/examples/mathptmx/resetsy.mtx
new file mode 100644
index 0000000000..27da54c046
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/resetsy.mtx
@@ -0,0 +1,30 @@
+\relax
+
+\metrics
+
+\unsetglyph{Upsilon}
+\setglyph{Upsilon}
+ \glyph{Upsilon1}{1000}
+\endsetglyph
+
+\setglyph{pi1}
+ \glyph{omega1}{1000}
+\endsetglyph
+
+\setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+\endsetglyph
+
+\setglyph{rho1}
+ \glyph{rho}{1000}
+\endsetglyph
+
+\setglyph{dotlessj}
+ \moveup{\neg{\depth{j}}}
+ \glyphrule{\width{j}}{\add{\depth{j}}{\height{dotlessi}}}
+ \resetitalic{\italic{dotlessi}}
+ \moveup{\depth{j}}
+ \glyphwarning{missing glyph `dotlessj'}
+\endsetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/unsetmu.mtx b/fonts/utilities/fontinst/examples/mathptmx/unsetmu.mtx
new file mode 100644
index 0000000000..63b222ed9f
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/unsetmu.mtx
@@ -0,0 +1,7 @@
+\relax
+
+\metrics
+
+\unsetglyph{mu}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zrhax.mtx b/fonts/utilities/fontinst/examples/mathptmx/zrhax.mtx
new file mode 100644
index 0000000000..ce1bc5a281
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zrhax.mtx
@@ -0,0 +1,15 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the Times-Roman
+% glyphs. We unset those glyphs that should be taken from cmr.
+
+\unsetglyph{plus}
+\unsetglyph{equal}
+\unsetglyph{parenleft}
+\unsetglyph{parenright}
+\unsetglyph{bracketleft}
+\unsetglyph{bracketright}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zrmhax.mtx b/fonts/utilities/fontinst/examples/mathptmx/zrmhax.mtx
new file mode 100644
index 0000000000..141899c6dc
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zrmhax.mtx
@@ -0,0 +1,14 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the Times-Italic
+% glyphs. We unset those glyphs that should be taken from cmmi.
+
+\unsetglyph{period}
+\unsetglyph{comma}
+\unsetglyph{less}
+\unsetglyph{slash}
+\unsetglyph{greater}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zrmkernx.mtx b/fonts/utilities/fontinst/examples/mathptmx/zrmkernx.mtx
new file mode 100644
index 0000000000..f05a2f6867
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zrmkernx.mtx
@@ -0,0 +1,239 @@
+\relax
+
+% The following adjustments (as proposed by Ulrik Vieth)
+% are tuned for Times-Italic and oblique Adobe Symbol.
+
+\metrics
+
+\needsfontinstversion{1.800}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount of extra space for subscripts
+
+\setcommand\shiftglyph#1#2#3#4{
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+}
+
+% \skewkern sets a skewchar kern, assuming that `tie'
+% is the skewchar.
+%
+% #1 the name of the glyph
+% #2 the amount of skewchar kerning
+
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+
+%\shiftglyph{A}{}{}{}
+%\shiftglyph{B}{}{}{}
+\shiftglyph{C}{-50}{0}{-25}
+%\shiftglyph{D}{}{}{}
+\shiftglyph{E}{0}{50}{0}
+\shiftglyph{F}{0}{50}{-100}
+%\shiftglyph{G}{}{}{}
+\shiftglyph{H}{0}{25}{-25}
+\shiftglyph{I}{0}{0}{-25}
+\shiftglyph{J}{0}{0}{-25}
+\shiftglyph{K}{0}{0}{-25}
+%\shiftglyph{L}{}{}{}
+\shiftglyph{M}{0}{0}{-25}
+\shiftglyph{N}{0}{0}{-25}
+%\shiftglyph{O}{}{}{}
+\shiftglyph{P}{0}{0}{-125}
+%\shiftglyph{Q}{}{}{}
+%\shiftglyph{R}{}{}{}
+%\shiftglyph{S}{}{}{}
+\shiftglyph{T}{0}{50}{-75}
+\shiftglyph{U}{-50}{50}{-25}
+\shiftglyph{V}{-50}{50}{-50}
+\shiftglyph{W}{-50}{50}{-50}
+\shiftglyph{X}{0}{50}{-25}
+\shiftglyph{Y}{-50}{50}{-50}
+%\shiftglyph{Z}{}{}{}
+
+%\shiftglyph{a}{}{}{}
+\shiftglyph{b}{0}{-25}{0}
+%\shiftglyph{c}{}{}{}
+\shiftglyph{d}{0}{25}{0}
+%\shiftglyph{e}{}{}{}
+\shiftglyph{f}{150}{0}{25}
+\shiftglyph{g}{0}{-50}{0}
+%\shiftglyph{h}{}{}{}
+%\shiftglyph{i}{}{}{}
+\shiftglyph{j}{150}{25}{0}
+%\shiftglyph{k}{}{}{}
+\shiftglyph{l}{0}{50}{0}
+%\shiftglyph{m}{}{}{}
+%\shiftglyph{n}{}{}{}
+\shiftglyph{o}{0}{-50}{0}
+\shiftglyph{p}{75}{-25}{0}
+%\shiftglyph{q}{}{}{}
+%\shiftglyph{r}{}{}{}
+%\shiftglyph{s}{}{}{}
+\shiftglyph{t}{-25}{50}{0}
+%\shiftglyph{u}{}{}{}
+%\shiftglyph{v}{}{}{}
+%\shiftglyph{w}{}{}{}
+%\shiftglyph{x}{}{}{}
+%\shiftglyph{y}{}{}{}
+%\shiftglyph{z}{}{}{}
+
+\shiftglyph{Gamma}{-25}{50}{-125}
+\shiftglyph{Delta}{0}{0}{25}
+\shiftglyph{Theta}{-50}{0}{0}
+\shiftglyph{Lambda}{-25}{0}{0}
+\shiftglyph{Xi}{0}{0}{25}
+%\shiftglyph{Pi}{}{}{}
+\shiftglyph{Sigma}{0}{0}{25}
+\shiftglyph{Upsilon}{-75}{25}{-100}
+\shiftglyph{Phi}{0}{-25}{0}
+\shiftglyph{Psi}{-75}{0}{-100}
+\shiftglyph{Omega}{0}{0}{25}
+
+%\shiftglyph{alpha}{}{}{}
+%\shiftglyph{beta}{}{}{}
+%\shiftglyph{gamma}{}{}{}
+%\shiftglyph{delta}{}{}{}
+%\shiftglyph{epsilon1}{}{}{}
+%\shiftglyph{zeta}{}{}{}
+%\shiftglyph{theta}{}{}{}
+%\shiftglyph{iota}{}{}{}
+%\shiftglyph{kappa}{}{}{}
+%\shiftglyph{lambda}{}{}{}
+\shiftglyph{mu}{25}{0}{0}
+%\shiftglyph{nu}{}{}{}
+%\shiftglyph{xi}{}{}{}
+%\shiftglyph{omikron}{}{}{}
+%\shiftglyph{pi}{}{}{}
+%\shiftglyph{rho}{}{}{}
+\shiftglyph{sigma}{0}{25}{0}
+%\shiftglyph{tau}{}{}{}
+%\shiftglyph{upsilon}{}{}{}
+\shiftglyph{chi}{25}{0}{0}
+%\shiftglyph{phi}{}{}{}
+%\shiftglyph{psi}{}{}{}
+%\shiftglyph{omega}{}{}{}
+%\shiftglyph{epsilon}{}{}{}
+%\shiftglyph{theta1}{}{}{}
+%\shiftglyph{pi1}{}{}{}
+%\shiftglyph{rho1}{}{}{}
+\shiftglyph{sigma1}{0}{25}{0}
+%\shiftglyph{phi1}{}{}{}
+
+\shiftglyph{weierstrass}{-100}{-200}{-150}
+
+\skewkern{A}{75}
+\skewkern{B}{100}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{75}
+\skewkern{I}{100}
+\skewkern{J}{200}
+\skewkern{K}{75}
+%\skewkern{L}{}
+\skewkern{M}{100}
+\skewkern{N}{25}
+\skewkern{O}{100}
+\skewkern{P}{100}
+\skewkern{Q}{100}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+%\skewkern{V}{}
+%\skewkern{W}{}
+\skewkern{X}{50}
+%\skewkern{Y}{}
+\skewkern{Z}{50}
+
+\skewkern{a}{75}
+%\skewkern{b}{}
+\skewkern{c}{75}
+\skewkern{d}{200}
+\skewkern{e}{75}
+\skewkern{f}{150}
+\skewkern{g}{75}
+%\skewkern{h}{}
+\skewkern{i}{75}
+\skewkern{j}{150}
+%\skewkern{k}{}
+\skewkern{l}{100}
+\skewkern{m}{50}
+\skewkern{n}{50}
+\skewkern{o}{75}
+\skewkern{p}{100}
+\skewkern{q}{75}
+\skewkern{r}{50}
+\skewkern{s}{100}
+\skewkern{t}{50}
+\skewkern{u}{75}
+\skewkern{v}{75}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{75}
+\skewkern{z}{50}
+\skewkern{dotlessi}{50}
+\skewkern{dotlessj}{50}
+
+\skewkern{Gamma}{75}
+\skewkern{Delta}{75}
+\skewkern{Theta}{50}
+\skewkern{Lambda}{50}
+\skewkern{Xi}{50}
+\skewkern{Pi}{75}
+\skewkern{Sigma}{50}
+\skewkern{Upsilon}{25}
+\skewkern{Phi}{75}
+\skewkern{Psi}{50}
+\skewkern{Omega}{50}
+
+%\skewkern{alpha}{}
+\skewkern{beta}{50}
+\skewkern{gamma}{75}
+\skewkern{delta}{50}
+%\skewkern{epsilon1}{}
+\skewkern{zeta}{50}
+\skewkern{theta}{50}
+%\skewkern{iota}{}
+\skewkern{kappa}{25}
+\skewkern{lambda}{-75}
+%\skewkern{mu}{}
+%\skewkern{nu}{}
+\skewkern{xi}{50}
+\skewkern{pi}{50}
+\skewkern{rho}{25}
+\skewkern{sigma}{25}
+\skewkern{tau}{50}
+\skewkern{upsilon}{50}
+\skewkern{chi}{25}
+\skewkern{phi}{75}
+\skewkern{psi}{50}
+\skewkern{omega}{50}
+%\skewkern{epsilon}{}
+\skewkern{theta1}{75}
+\skewkern{pi1}{50}
+\skewkern{rho1}{25}
+\skewkern{sigma1}{50}
+\skewkern{phi1}{50}
+
+\skewkern{weierstrass}{175}
+\skewkern{lscript}{125}
+
+\resetglyph{vector}
+ \movert{-100}
+ \glyph{vector}{1000}
+ \movert{100}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zrvhax.mtx b/fonts/utilities/fontinst/examples/mathptmx/zrvhax.mtx
new file mode 100644
index 0000000000..6270feb615
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zrvhax.mtx
@@ -0,0 +1,73 @@
+\relax
+
+% This metrics file is loaded after having read the cmex glyps.
+% We unset the big operators that should be taken from Symbol
+% or from a scaled-down version of cmex.
+
+\metrics
+
+\setint{psy-textscale}{1000}
+\setint{psy-displayscale}{1440}
+
+\unsetglyph{circledotdisplay}
+\unsetglyph{circledottext}
+\unsetglyph{circlemultiplydisplay}
+\unsetglyph{circlemultiplytext}
+\unsetglyph{circleplusdisplay}
+\unsetglyph{circleplustext}
+\unsetglyph{contintegraldisplay}
+\unsetglyph{contintegraltext}
+\unsetglyph{integraldisplay}
+\unsetglyph{integraltext}
+\unsetglyph{intersectiondisplay}
+\unsetglyph{intersectiontext}
+\unsetglyph{logicalanddisplay}
+\unsetglyph{logicalandtext}
+\unsetglyph{logicalordisplay}
+\unsetglyph{logicalortext}
+\unsetglyph{uniondisplay}
+\unsetglyph{unionmultidisplay}
+\unsetglyph{unionmultitext}
+\unsetglyph{unionsqdisplay}
+\unsetglyph{unionsqtext}
+\unsetglyph{uniontext}
+
+\resetglyph{summationtext}
+ \glyph{summation}{\int{psy-textscale}}
+\endresetglyph
+
+\resetglyph{summationdisplay}
+ \glyph{summation}{\int{psy-displayscale}}
+\endresetglyph
+
+\resetglyph{producttext}
+ \glyph{product}{\int{psy-textscale}}
+\endresetglyph
+
+\resetglyph{productdisplay}
+ \glyph{product}{\int{psy-displayscale}}
+\endresetglyph
+
+\resetglyph{coproducttext}
+ \moveup{\neg{\depth{producttext}}}
+ \glyphrule{
+ \width{producttext}
+ }{
+ \add{\height{producttext}}{\depth{producttext}}
+ }
+ \moveup{\depth{producttext}}
+ \glyphwarning{missing glyph `coproducttext'}
+\endresetglyph
+
+\resetglyph{coproductdisplay}
+ \moveup{\neg{\depth{productdisplay}}}
+ \glyphrule{
+ \width{productdisplay}
+ }{
+ \add{\height{productdisplay}}{\depth{productdisplay}}
+ }
+ \moveup{\depth{productdisplay}}
+ \glyphwarning{missing glyph `coproductdisplay'}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zryhax.mtx b/fonts/utilities/fontinst/examples/mathptmx/zryhax.mtx
new file mode 100644
index 0000000000..19addd6ad8
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zryhax.mtx
@@ -0,0 +1,26 @@
+\relax
+
+\metrics
+
+% This metrics file is loaded after having read the cmsy glyphs.
+% We unset those glyphs that should be taken from Times or Symbol.
+
+\unsetglyph{infinity}
+\unsetglyph{proportional}
+
+\unsetglyph{emptysetstress}
+
+\unsetglyph{Rfraktur}
+\unsetglyph{Ifraktur}
+
+\unsetglyph{aleph}
+
+\unsetglyph{coproduct}
+\unsetglyph{gradient}
+
+\unsetglyph{section}
+\unsetglyph{dagger}
+\unsetglyph{daggerdbl}
+\unsetglyph{paragraph}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/examples/mathptmx/zrykernx.mtx b/fonts/utilities/fontinst/examples/mathptmx/zrykernx.mtx
new file mode 100644
index 0000000000..249700156e
--- /dev/null
+++ b/fonts/utilities/fontinst/examples/mathptmx/zrykernx.mtx
@@ -0,0 +1,35 @@
+\relax
+
+% We reset the skewchar kerning for OMS (assuming skewchar=`prime')
+% using the original kern pairs for OML (assuming skewchar=`tie').
+
+\metrics
+
+\setkern{A}{prime}{\kerning{A}{tie}}
+\setkern{B}{prime}{\kerning{B}{tie}}
+\setkern{C}{prime}{\kerning{C}{tie}}
+\setkern{D}{prime}{\kerning{D}{tie}}
+\setkern{E}{prime}{\kerning{E}{tie}}
+\setkern{F}{prime}{\kerning{F}{tie}}
+\setkern{G}{prime}{\kerning{G}{tie}}
+\setkern{H}{prime}{\kerning{H}{tie}}
+\setkern{I}{prime}{\kerning{I}{tie}}
+\setkern{J}{prime}{\kerning{J}{tie}}
+\setkern{K}{prime}{\kerning{K}{tie}}
+\setkern{L}{prime}{\kerning{L}{tie}}
+\setkern{M}{prime}{\kerning{M}{tie}}
+\setkern{N}{prime}{\kerning{N}{tie}}
+\setkern{O}{prime}{\kerning{O}{tie}}
+\setkern{P}{prime}{\kerning{P}{tie}}
+\setkern{Q}{prime}{\kerning{Q}{tie}}
+\setkern{R}{prime}{\kerning{R}{tie}}
+\setkern{S}{prime}{\kerning{S}{tie}}
+\setkern{T}{prime}{\kerning{T}{tie}}
+\setkern{U}{prime}{\kerning{U}{tie}}
+\setkern{V}{prime}{\kerning{V}{tie}}
+\setkern{W}{prime}{\kerning{W}{tie}}
+\setkern{X}{prime}{\kerning{X}{tie}}
+\setkern{Y}{prime}{\kerning{Y}{tie}}
+\setkern{Z}{prime}{\kerning{Z}{tie}}
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/inputs/base/bbox.sty b/fonts/utilities/fontinst/inputs/base/bbox.sty
new file mode 100644
index 0000000000..d06bc8f47c
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/bbox.sty
@@ -0,0 +1,163 @@
+
+% bbox.sty -- bounding box extension for fontinst
+%
+% This file defines the following commands for setting, resetting,
+% and unsetting the bounding boxes of glyphs:
+%
+% \setglyphbb{GLYPH}{LEFT}{BOTTOM}{RIGHT}{TOP}
+% \resetglyphbb{GLYPH}{LEFT}{BOTTOM}{RIGHT}{TOP}
+% \unsetglyphbb{GLYPH}
+%
+% It also defines the following four integer expressions for
+% quering bounding box metrics:
+%
+% \bbleft{GLYPH}
+% \bbbottom{GLYPH}
+% \bbright{GLYPH}
+% \bbtop{GLYPH}
+%
+% For glyphs that do not have a bounding box set, they default
+% to using the "TeX box" of the glyph.
+%
+% Finally, the file changes AFM-to-MTX conversions so that bounding
+% box information is converted to \setglyphbb commands and augments
+% font transformation and reglyphing to preserve this information.
+
+
+\needsfontinstversion{1.927}
+
+\fontinstcc
+
+\def\resetglyphbb#1#2#3#4#5{
+ \eval_expr_to\a_count{#2}
+ \eval_expr_to\b_count{#3}
+ \eval_expr_to\c_count{#4}
+ \eval_expr_to\d_count{#5}
+ \x_cs\edef{gb-#1}{
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+\def\setglyphbb#1#2#3#4#5{
+ \if_undefined{gb-\glyph_name_modifier{#1}}\then
+ \resetglyphbb{\glyph_name_modifier{#1}}{#2}{#3}{#4}{#5}
+ \fi
+}
+\def\unsetglyphbb#1{\x_cs\let{gb-#1}=\x_relax}
+
+\def\first_of_four#1#2#3#4{#1}
+\def\second_of_four#1#2#3#4{#2}
+\def\third_of_four#1#2#3#4{#3}
+\def\fourth_of_four#1#2#3#4{#4}
+
+\def\bbleft#1{
+ \if_defined{gb-#1}\then
+ \expandafter\expandafter \expandafter\first_of_four
+ \csname gb-#1\endcsname
+ \else
+ 0
+ \fi
+}
+\def\bbbottom#1{
+ \if_defined{gb-#1}\then
+ \expandafter\expandafter \expandafter\second_of_four
+ \csname gb-#1\endcsname
+ \else
+ \neg{\depth{#1}}
+ \fi
+}
+\def\bbright#1{
+ \if_defined{gb-#1}\then
+ \expandafter\expandafter \expandafter\third_of_four
+ \csname gb-#1\endcsname
+ \else
+ \width{#1}
+ \fi
+}
+\def\bbtop#1{
+ \if_defined{gb-#1}\then
+ \expandafter\expandafter \expandafter\fourth_of_four
+ \csname gb-#1\endcsname
+ \else
+ \height{#1}
+ \fi
+}
+
+
+% Make \afmtomtx generate \setglyphbb commands:
+\def\afm_char{
+ \a_count=-\bbox_lly
+ \eval_expr{
+ \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury
+ }
+ \out_line{
+ \ifnum -1<\char_slot
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\the\a_count}
+ {\the\result}
+ }
+ \out_line{
+ \string\setglyphbb{\char_name}
+ {\the\bbox_llx}{\the\bbox_lly}{\the\bbox_urx}{\the\bbox_ury}
+ }
+}
+
+
+% Make sure \setglyphbb is transformed OK.
+% Slanting of course cannot be done exactly when only the bbox
+% is known.
+\def\mtxtomtx_setglyphbb#1#2#3#4#5{
+ \eval_expr_to\a_count{\add{
+ \scale{#2}{\int{x-scale}}
+ }{
+ \scale{#3}{\int{slant-scale}}
+ }}
+ \eval_expr_to\b_count{\scale{#3}{\int{y-scale}}}
+ \eval_expr_to\c_count{\add{
+ \scale{#4}{\int{x-scale}}
+ }{
+ \scale{#5}{\int{slant-scale}}
+ }}
+ \eval_expr_to\d_count{\scale{#5}{\int{y-scale}}}
+ \out_line{
+ \string\setglyphbb{#1}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+
+\add_to\mtxtomtx_redefinitions{
+ \let\setglyphbb=\mtxtomtx_setglyphbb
+}
+
+% Finally, for completeness, the analogous thing for reglyphing.
+
+\def\reglyph_setglyphbb#1#2#3#4#5{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{
+ \string\setglyphbb{\glyphname}{#2}{#3}{#4}{#5}
+ }
+ \fi
+}
+
+\add_to\reglyph_redefinitions{
+ \let\setglyphbb=\reglyph_setglyphbb
+}
+
+
+\normalcc
+
+
+\endinput
+
+
diff --git a/fonts/utilities/fontinst/inputs/base/cfntinst.sty b/fonts/utilities/fontinst/inputs/base/cfntinst.sty
new file mode 100644
index 0000000000..033e21175d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/cfntinst.sty
@@ -0,0 +1,3688 @@
+%%
+%% This is file `cfntinst.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `pkg')
+%% ficommon.dtx (with options: `pkg')
+%% fimain.dtx (with options: `pkg,boundaryCompability')
+%% fitrig.dtx (with options: `pkg')
+%% ficonv.dtx (with options: `pkg')
+%% filtfam.dtx (with options: `pkg,textcomp,debug')
+%% fimapgen.dtx (with options: `pkg')
+%% fibasics.dtx (with options: `pkg2')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: fibasics.dtx
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+\def\fontinstversion{1.933}
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+\ProvidesPackage{fontinst}
+[2007/01/23 v\fontinstversion\space
+ fontinst installation package]
+\def\a_macro#1{\catcode\number`#1=\the\catcode`#1 }
+\edef\normalcc{%
+ \a_macro{\ }\a_macro{\^^M}\a_macro{\@}\a_macro{\_}\a_macro{\~}
+}
+\def\fontinstcc{%
+ \catcode`\ =9%
+ \catcode`\^^M=9%
+ \catcode`\@=11%
+ \catcode`\_=11%
+ \catcode`\~=10
+}
+\fontinstcc
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\expandafter\def \csname bye\endcsname
+ {\par\vfill\supereject\@@end}
+\fi
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+\newif\if_a_
+\newwrite\out_file
+\mathchardef\one_thousand=1000
+\mathchardef\five_hundred=500
+\mathchardef\one_hundred=100
+\mathchardef\max_mathchardef="7FFF
+\mathchardef\two_thousand=2000
+\newdimen\half_point \half_point=0.5pt
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\def\swap_two#1#2{#2#1}
+\def\first_of_three#1#2#3{#1}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\#=12
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\hash_char[#]
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+\def\first_char#1#2={#1}
+\def\add_to#1#2{
+ \ifx#1\x_relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+\def\prep_to#1#2{
+ \ifx#1\x_relax
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2#1}
+ \fi
+}
+\def\never_do{\noexpand\do}
+\newif\if_extensions_warning_
+\_extensions_warning_false
+\ifx \eTeXversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\eTeX#1{
+ \if_extensions_warning_
+ \space/\space e-TeX\space version\space #1
+~ \else
+~ \ifdim \number\eTeXversion\eTeXrevision\p@ < #1\p@ \else
+~ \_a_true
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\ifx \pdftexversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\pdfTeX#1#2{%
+ \if_extensions_warning_
+ \space/\space pdfTeX\space version\space
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+ \expandafter\swap_two \expandafter.
+ \fi
+ #1#2%
+~ \else
+~ \ifdim #1>\pdftexversion \else
+~ \ifnum \expandafter\expandafter \expandafter`
+~ \expandafter\first_char \pdftexrevision= <
+~ \expandafter` \first_char#2=
+~ \else \_a_true \fi
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\def\needsTeXextension#1#2{
+ \_a_false
+ #1
+ \if_a_ \else
+ \_extensions_warning_true
+ \edef\a_macro{#1}
+ \_extensions_warning_false
+ \fontinstwarningnoline{#2}{
+ This~file~needs:\messagebreak
+ \expandafter\second_of_two\a_macro
+ \iffalse
+ <no~sufficient~extensions~were~listed!!>\if_false
+ \fi
+ \messagebreak
+ You~are~not~using~any~of~them.~This~is~likely~to~cause~errors
+ }
+ \fi
+}
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \xdef\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\edef\out_lline#1{\noexpand\out_line{\space\space\space#1}}
+\edef\out_llline#1{
+ \noexpand\out_line{\space\space\space\space\space\space#1}
+}
+\def\TeX_terminal{\string\TeX\space terminal}
+\chardef\closed_stream=99
+\x_cs\let{out_filename-99}=\TeX_terminal
+\x_cs\def{out_filename--1}{\jobname.log}
+\def\allocate_stream{
+ \a_count=\m@ne
+ \b_count=\m@ne
+ \loop \ifnum \count17>\a_count
+ \advance \a_count \@ne
+ \x_cs\ifx{out_filename-\the\a_count}\TeX_terminal
+ \b_count=\a_count
+ \a_count=\count17
+ \fi
+ \repeat
+ \ifnum \b_count=\m@ne
+ \global\advance\count17by\@ne
+ \ifnum \count17<\sixt@@n
+ \b_count=\count17
+ \global\x_cs\let{out_filename-\the\b_count}\TeX_terminal
+ \wlog{\string\write\the\b_count\space allocated~to~the~pool.}
+ \else
+ \global\count17=\sixt@@n
+ \fi
+ \fi
+}
+\def\ch@ck#1#2#3{
+ \ifnum \count1#1<#2 \else
+ \errmessage{No~room~for~a~new~#3}
+ \global\count1#1=#2
+ \fi
+}
+\def\open_pout#1#2{
+ \allocate_stream
+ \ifnum \b_count=\m@ne
+ \immediate\write\sixt@@n{fontinst~is~out~of~output~streams.^^J
+ Output~file~#2~cannot~be~opened.^^J
+ Writes~will~be~redirected~to~the~log~file.
+ }
+ \gdef#1{\m@ne}
+ \else
+ \immediate\openout\b_count=#2\x_relax
+ \x_cs\xdef{out_filename-\the\b_count}{#2}
+ \global\chardef#1=\b_count
+ \fi
+}
+\def\close_pout#1#2{
+ \ifnum #1=\closed_stream
+ \errmessage{Output~file~\string#1~(#2)~not~closed,^^J
+ since~it~was~not~open}
+ \else
+ \immediate\write\sixt@@n{#2~written~on~
+ \csname out_filename-\the#1\endcsname.}
+ \ifnum #1=\m@ne \else
+ \immediate\closeout#1
+ \global\x_cs\let{out_filename-\the#1}=\TeX_terminal
+ \fi
+ \global\chardef#1=\closed_stream
+ \fi
+}
+\def\pout_line#1#2{\immediate\write#1{#2}}
+\edef\pout_lline#1#2{\noexpand\pout_line#1{\space\space\space#2}}
+\edef\pout_llline#1#2{
+ \noexpand\pout_line#1{\space\space\space\space\space\space#2}
+}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+\let\then=\iffalse
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+\_a_false\eTeX{2.0}
+\if_a_\else \catcode`\~=14\x_relax \fi
+~ \def\if_defined#1\then{
+~ \if
+~ \ifcsname#1\endcsname
+~ \expandafter\ifx \csname#1\endcsname \x_relax
+~ 0
+~ \else
+~ 1
+~ \fi
+~ \else
+~ 0
+~ \fi
+~ 1
+~ }
+~ \def\if_undefined{\expandafter\unless\if_defined}
+\catcode`\~=\if_a_ 14 \else 10 \fi \x_relax
+~ \def\if_defined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ \expandafter\if_false
+~ \else
+~ \expandafter\if_true
+~ \fi
+~ }
+~ \def\if_undefined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ }
+\catcode`\~=10\x_relax
+\def\gobble_if{\iftrue\else}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+\def\if_equal#1\then{\ifx#1}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\x_relax
+ \ifeof1\x_relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+\let\Else=\else
+\let\Fi=\fi
+\x_cs\ifx{@@input}\x_relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+\def\process_csep_list#1#2,{
+ \ifx\process_csep_list#2
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ #1{#2}
+ \process_csep_list{#1}
+ }
+}
+\def\make_factor#1{
+ \ifnum #1<\z@
+ -\expandafter\make_factor_i\expandafter{\number-#1}
+ \else
+ \expandafter\make_factor_i\expandafter{\number#1}
+ \fi
+}
+\def\make_factor_i#1{
+ \ifnum #1<\one_thousand
+ \make_factor_ii{#1}
+ \else
+ \make_factor_iii #1
+ \fi
+ #1
+}
+\def\make_factor_ii#1{
+ 0.
+ \ifnum #1<\one_hundred
+ 0
+ \ifnum #1<10~ 0\fi
+ \fi
+}
+\def\make_factor_iii#1#2#3\fi#4{
+ \fi
+ #4
+ \ifnum 1#3<\one_thousand
+ .
+ \else
+ \make_factor_iii#2#3
+ \fi
+}
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+\def\format_hex_i#1#2{
+ \if #2i \else
+ \b_count=\a_count
+ \divide \a_count \sixt@@n
+ \c_count=\a_count
+ \multiply \c_count \sixt@@n
+ \advance \b_count -\c_count
+ \edef#1{
+ \ifcase\b_count 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or
+ 9\or a\or b\or c\or d\or e\or f\fi
+ #1
+ }
+ \expandafter\format_hex_i \expandafter#1
+ \fi
+}
+\def\format_hex#1#2#3{
+ \a_count=#2
+ \let#1\empty_command
+ \expandafter\format_hex_i \expandafter#1 \romannumeral
+ \expandafter\identity_one\expandafter{\number#3}001~
+}
+\let\messagebreak\x_relax
+\def\generic_info#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\m@ne{#2\on_line.}
+ \endgroup
+}
+\def\generic_warning#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{^^J#2\on_line.^^J}
+ \endgroup
+}
+\def\generic_error#1#2#3#4{
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \errmessage{#2.^^J^^J#3
+ Type~\space H~<return>~\space for~immediate~help
+ }
+ \endgroup
+}
+\def\fontinsterror#1#2#3{
+ \generic_error{
+ \four_spaces\four_spaces
+ }{
+ #1~error:\messagebreak #2
+ }{
+ }{#3}
+}
+\def\fontinstwarning#1#2{
+ \generic_warning{
+ \four_spaces\four_spaces
+ }{
+ #1~warning:\messagebreak #2
+ }
+}
+\def\fontinstwarningnoline#1#2{
+ \fontinstwarning{#1}{#2\gobble_one}
+}
+\def\fontinstinfo#1#2{
+ \generic_info{
+ \four_spaces\four_spaces
+ }{
+ #1~info:\messagebreak #2
+ }
+}
+\def\on_line{~on~input~line~\the\inputlineno}
+\edef\four_spaces{\space\space\space\space}
+\gdef\error_help_a{
+ Your~command~was~ignored.\messagebreak
+ Type~\space I~<command>~<return>~\space to~replace~it~
+ with~another~command,\messagebreak
+ or~\space <return>~\space to~continue~without~it.}
+\gdef\error_help_c{
+ Try~typing~\space <return>~
+ \space to~proceed.\messagebreak
+ If~that~doesn't~work,~type~\space X~<return>~\space to~quit.}
+\gdef\error_help_d{
+ You're~in~trouble~here.~\space\error_help_c}
+\def\error_help_e#1{You~can~continue,~but~the~#1~wrong.}
+\newlinechar=`\^^J
+\errorcontextlines=999
+\tracinglostchars=1
+%%% From file: ficommon.dtx
+\def\str#1{\csname~s-#1\endcsname}
+\def\strint#1{\expandafter\identity_one\expandafter{\number\int{#1}}}
+\newcount\result
+\def\eval_expr#1{\global\result=#1\x_relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+\def\add#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\advance \result \a_count
+ \egroup
+}
+\def\sub#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \advance \a_count -\result
+ \global\result=\a_count
+ \egroup
+}
+\def\int#1{\csname i-#1 \endcsname}
+\def\neg#1{#1 \global\result=-\result}
+\def\mul#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \egroup
+}
+\def\div#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \divide \a_count \result
+ \global\result=\a_count
+ \egroup
+}
+\def\max#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count>\result \global\result=\a_count \fi
+ \egroup
+}
+\def\min#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count<\result \global\result=\a_count \fi
+ \egroup
+}
+\def\half#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\otherhalf#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \else \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\scale#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \rounded_thousandths
+ \egroup
+}
+\def\rounded_thousandths{
+ \global\divide \result \five_hundred
+ \ifodd \result
+ \global\advance \result by \ifnum 0>\result - \fi 1
+ \fi
+ \global\divide \result \tw@
+}
+\def\l_rounded_thousandths#1{
+ \divide #1 \five_hundred
+ \ifodd #1
+ \advance #1 by \ifnum 0>#1 - \fi\@ne
+ \fi
+ \divide #1 \tw@
+}
+\def\l_inv_scale#1#2{
+ \multiply #1 \two_thousand
+ \divide #1 #2\x_relax
+ \ifodd#1 \advance #1 \ifnum 0>#1 - \fi\@ne \fi
+ \divide #1 \tw@
+}
+\def\ifnumber#1#2#3\then{
+ \eval_expr_to\a_count{#1}
+ \eval_expr{#3}
+ \ifnum \a_count#2\result
+ \expandafter\if_true
+ \else
+ \expandafter\if_false
+ \fi
+}
+\let\setsomething_global=\x_relax
+\def\x_setint#1#2{
+ \x_cs\ifx{i-#1}\x_relax
+ \x_resetint{#1}{#2}
+ \fi
+}
+\let\setint=\x_setint
+\def\x_setstr#1#2{
+ \x_cs\ifx{s-#1}\x_relax
+ \setsomething_global\x_cs\edef{s-#1}{#2}
+ \fi
+}
+\let\setstr=\x_setstr
+\def\setdim#1#2{
+ \x_cs\ifx{d-#1}\x_relax
+ \a_dimen=#2\x_relax
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+ \fi
+}
+\def\setcommand#1{
+ \ifx#1\undefined_command
+ \setsomething_global \expandafter\def \expandafter#1
+ \else
+ \expandafter\def \expandafter\a_macro
+ \fi
+}
+\def\x_resetint#1#2{
+ \eval_expr{#2}
+ \setsomething_global
+ \ifnum\result<\max_mathchardef
+ \ifnum 0>\result
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\let\resetint=\x_resetint
+\def\resetstr#1#2{\setsomething_global\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{
+ \a_dimen=#2
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+}
+\def\resetcommand#1{\setsomething_global\def#1}
+\def\dim#1{\csname~d-#1\endcsname}
+\def\ifisint#1\then{\if_defined i-#1\then}
+\def\ifisstr#1\then{\if_defined s-#1\then}
+\def\ifisdim#1\then{\if_defined d-#1\then}
+\def\ifiscommand#1\then{
+ \ifx#1\undefined_command
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+\def\unsetint#1{\setsomething_global\x_cs\let{i-#1}\x_relax}
+\def\unsetstr#1{\setsomething_global\x_cs\let{s-#1}\x_relax}
+\def\unsetdim#1{\setsomething_global\x_cs\let{d-#1}\x_relax}
+\def\unsetcommand#1{\setsomething_global\let#1=\undefined_command}
+\def\offcommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax
+ \setsomething_global\x_cs\let{saved-\string#1}#1
+ \x_cs\ifx{off-\string#1}\x_relax
+ \generate_off_command{#1}
+ \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname off-\string#1\endcsname
+ \fi
+ \fi
+}
+\def\oncommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname saved-\string#1\endcsname
+ \setsomething_global\x_cs\let{saved-\string#1}\x_relax
+ \fi
+}
+\def\generate_off_command#1{
+ \a_count=0
+ \let\next=\count_hashes
+ \expandafter\next\meaning#1~->\x_relax
+ \b_count=0
+ \a_toks={}
+ \loop \ifnum \b_count<\a_count
+ \advance \b_count 1
+ \a_toks=\expandafter{\the\expandafter\a_toks \expandafter####
+ \the\b_count}
+ \repeat
+ \setsomething_global \expandafter\def \expandafter#1 \the\a_toks {}
+}
+\def\count_hashes#1#2{
+ \if \hash_char#1
+ \advance \a_count 1
+ \else
+ \if -#1
+ \if >#2
+ \let\next=\gobble_to_xrelax
+ \fi\fi
+ \fi
+ \next#2
+}
+\def\gobble_to_xrelax#1\x_relax{}
+\def\for(#1)#2#3#4{
+ \eval_expr_to\a_count{#2}
+ \x_resetint{#1}{\a_count}
+ \eval_expr{#4}
+ \ifnum 0=\result \else
+ \c_count=\result
+ \eval_expr_to\b_count{#3}
+ \setsomething_global\x_cs\edef{for-#1}{
+ \the\c_count \x_relax
+ \noexpand\ifnum \gobble_one\fi
+ \the\b_count \ifnum 0>\c_count > \else < \fi
+ }
+ \def\next##1##2##3\endfor(#1){##2\for_i{##1}{##3}}
+ \next{#1}
+ \fi
+}
+\def\for_i#1#2{
+ \setsomething_global\x_cs\def{body-#1}{#2}
+ \ifnum \b_count \ifnum0>\c_count >\else<\fi \a_count
+ \expandafter\gobble_two
+ \else
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\for_ii#1{
+ \a_count=\int{#1}
+ \advance \a_count \csname for-#1\endcsname \a_count
+ \expandafter\gobble_two
+ \else
+ \x_resetint{#1}\a_count
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\endfor(#1){}
+\def\foreach(#1)#2{
+ \def\next##1\endfor(#1){
+ \setsomething_global\x_cs\def{body-#1}{##1}
+ \process_csep_list{\foreach_i{#1}}#2,\process_csep_list,
+ }
+ \next
+}
+\def\foreach_i#1#2{
+ \resetstr{#1}{#2}
+ \csname body-#1\endcsname
+}
+\let\comment=\gobble_one
+\let\begincomment=\iffalse
+\let\endcomment=\fi
+%%% From file: fimain.dtx
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\let\encoding=\relax
+\outer\def\endencoding{\endinput}
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\x_relax}
+\let\do_slot\empty_command
+\let\end_do_slot\empty_command
+\newcount\slot_number
+\def\nextslot#1{\eval_expr_to\slot_number{#1}}
+\def\skipslots#1{\eval_expr{#1} \advance\slot_number by \result}
+\def\setleftboundary#1{\edef\slot_name{#1}\do_boundary}
+\let\endsetleftboundary\x_relax
+\let\do_boundary\x_relax
+\def\setrightboundary#1{
+ \makerightboundary{#1}
+ \advance \slot_number 1\x_relax
+}
+\let\ligature=\gobble_three
+\def\Ligature{\ligature}
+\def\oddligature#1#2#3#4{}
+\let\nextlarger=\gobble_one
+\let\usedas=\gobble_two
+\let\makerightboundary=\gobble_one
+\let\Unicode=\gobble_two
+\let\charseq=\gobble_one
+\let\varchar=\empty_command
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\endvarchar=\empty_command
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+\def\setfontdimen#1#2{
+ \ifisint{#2}\then \setint{fontdimen(#1)}{\int{#2}} \fi
+}
+\let\label=\gobble_one
+\newif\ifdirect \directtrue
+\def\input_mtx_as_etx#1{
+ \def\setscaledrawglyph##1##2##3##4##5##6##7##8##9{
+ \nextslot{##5}
+ \setslot{##1}\endsetslot
+ }
+ \offcommand\setscalednotglyph
+ \let\setglyph=\gobble_glyph
+ \offcommand\setkern
+ \inputmtx{#1}
+}
+\def\inputmtx#1{
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\let\metrics=\x_relax
+\edef\endmetrics_text{\string\endmetrics}
+\outer\def\endmetrics{\endinput}
+\def\ProvidesMtxPackage#1{\x_cs\let{pack-#1}P}
+\def\usemtxpackage{\futurelet\next_token\test_UseMtxPkg_arguments}
+\def\test_UseMtxPkg_arguments{\ifx\next_token[
+ \expandafter\mtx_package_given_file
+ \else
+ \expandafter\mtx_package_separate_files
+ \fi
+}
+\def\mtx_package_given_file[#1]#2{
+ \_a_false
+ \process_csep_list\load_true_unless_loaded #2,\process_csep_list,
+ \if_a_ \inputmtx{#1} \fi
+}
+\def\load_true_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else\_a_true\fi
+}
+\def\mtx_package_separate_files#1{
+ \process_csep_list\load_file_unless_loaded #1,\process_csep_list,
+}
+\def\load_file_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else \inputmtx{#1} \fi
+}
+\let\glyph_name_modifier=\identity_one
+\def\setkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {#3}
+ \else
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\set_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\set_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\set_kern_cs#1#2#3{
+ \add_to#2{\k#3#1}
+ \add_to#3{\k#2#1}
+}
+\def\resetkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{#3}
+ \else
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\reset_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\reset_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\reset_kern_cs#1#2#3{
+ \prep_to#2{\k\expandafter#3\expandafter#1}
+ \prep_to#3{\k\expandafter#2\expandafter#1}
+}
+\def\setleftkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+}
+\def\setrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\setleftrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\set_kerning#1#2{
+ \if\b_count=\one_thousand
+ \def\k##1##2{
+ \set_kern_cs##2##1#1
+ }
+ \else
+ \def\k##1##2{
+ \set_kern##1#1{
+ \scale\b_count{\expandafter\gobble_one\string##2}
+ }
+ }
+ \fi
+ #2
+}
+\def\kerning#1#2{0\x_relax
+ \def\k##1{\csname~set-\string##1\endcsname\gobble_one}
+ \bgroup
+ \x_cs\def{set-\string\l-#2}##1##2{
+ \global\result=\expandafter\gobble_one\string##2\egroup
+ }
+ \csname~r-#1\endcsname
+ \csname~set-\string\l-#2\endcsname\gobble_one{00}
+}
+\def\ifiskern#1#2\then{
+ \def\k##1##2{\ifx T##1 \let\k\gobble_two \fi}
+ \bgroup
+ \x_cs\let{l-#2}T
+ \csname r-#1\endcsname
+ \expandafter\egroup \ifx\k\gobble_two
+}
+\def\unsetkerns#1#2{
+ \let\k\k_unless_to_U
+ \process_csep_list\make_slots_U#1,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{l-##1}}
+ \process_csep_list\do#2,\process_csep_list,
+ \process_csep_list\make_slots_relax#1,\process_csep_list,
+ \process_csep_list\make_slots_U#2,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{r-##1}}
+ \process_csep_list\do#1,\process_csep_list,
+ \process_csep_list\make_slots_relax#2,\process_csep_list,
+}
+\def\make_slots_U#1{\x_cs\let{slots-#1}U}
+\def\make_slots_relax#1{\x_cs\let{slots-#1}\x_relax}
+\def\k_unless_to_U#1#2{
+ \x_cs\ifx{slots-\expandafter\gobble_three\string#1}U \else
+ \noexpand\k\noexpand#1\noexpand#2
+ \fi
+}
+\def\main_remove_Us#1{
+ \ifx#1\x_relax \else
+ \edef#1{#1}
+ \ifx#1\empty_command \let#1\x_relax \fi
+ \fi
+}
+\def\noleftkerning#1{\no_kerning{l}{#1}}
+\def\norightkerning#1{\no_kerning{r}{#1}}
+\def\noleftrightkerning#1{\no_kerning{l}{#1}\no_kerning{r}{#1}}
+\def\no_kerning#1#2{
+ \let\k\no_kerning_i
+ \def\do##1{\csname #1-##1\endcsname}
+ \bgroup
+ \aftergroup\def \aftergroup\a_macro \aftergroup{
+ \process_csep_list\do #2,\process_csep_list,
+ \aftergroup}
+ \egroup
+ \def\do##1{\expandafter\let \csname #1-##1\endcsname \x_relax}
+ \process_csep_list\do #2,\process_csep_list,
+ \let\k\no_kerning_ii
+ \def\do##1{\edef##1{##1}}
+ \a_macro
+}
+\def\no_kerning_i#1#2{
+ \ifx #1\x_relax \else
+ \aftergroup\do \aftergroup#1
+ \let #1\x_relax
+ \fi
+}
+\def\no_kerning_ii#1#2{
+ \ifx #1\x_relax \else \noexpand\k \noexpand#1 \noexpand#2 \fi
+}
+\def\width{\glyph_parameter\first_of_six}
+\def\height{\glyph_parameter\second_of_six}
+\def\depth{\glyph_parameter\third_of_six}
+\def\italic{\glyph_parameter\fourth_of_six}
+\def\mapcommands{\glyph_parameter\fifth_of_six}
+\def\mapfonts{\glyph_parameter\sixth_of_six}
+\def\glyph_parameter#1#2{
+ \expandafter\expandafter\expandafter
+ #1\csname g-#2\endcsname
+}
+\def\first_of_six#1#2#3#4#5#6{#1}
+\def\second_of_six#1#2#3#4#5#6{#2}
+\def\third_of_six#1#2#3#4#5#6{#3}
+\def\fourth_of_six#1#2#3#4#5#6{#4}
+\def\fifth_of_six#1#2#3#4#5#6{#5}
+\def\sixth_of_six#1#2#3#4#5#6{#6}
+\def\glyph_metrics#1#2#3#4#5#6{
+ \a_count=#1
+ \b_count=#2
+ \c_count=#3
+ \d_count=#4~
+}
+\let\saved_scale\x_relax
+\let\saved_mapfont\x_relax
+\let\saved_raw\x_relax
+\let\saved_rule\x_relax
+\let\saved_special\x_relax
+\let\saved_warning\x_relax
+\let\saved_movert\x_relax
+\let\saved_moveup\x_relax
+\let\saved_push\x_relax
+\let\saved_pop\x_relax
+\newcount\glyph_width
+\newcount\glyph_height
+\newcount\glyph_depth
+\newcount\glyph_italic
+\newtoks\glyph_map_commands
+\newtoks\glyph_map_fonts
+\newcount\glyph_voffset
+\newcount\glyph_maxhpos
+\def\setglyph#1{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \expandafter\gobble_glyph
+ \else
+ \x_cs\def{g-\glyph_name_modifier{#1}}{
+ {\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}
+ }
+ \resetglyph{\glyph_name_modifier{#1}}
+ \fi
+}
+\long\def\gobble_glyph#1\endsetglyph{}
+\def\resetglyph#1{
+ \edef\glyphname{#1}
+ \glyph_width=0
+ \global\glyph_height=0
+ \global\glyph_depth=0
+ \global\glyph_italic=0
+ \glyph_voffset=0
+ \global\glyph_maxhpos=0
+ \global\glyph_map_commands={}
+ \global\glyph_map_fonts={}
+}
+\def\endsetglyph{
+ \x_cs\edef{g-\glyphname}
+ {{\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}}
+}
+\let\endresetglyph=\endsetglyph
+\def\setrawglyph#1#2#3{
+ \setscaledrawglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \eval_expr{#4}
+ \ifnum \result=\one_thousand
+ \let\a_macro\identity_one
+ \else
+ \edef\a_macro##1{\saved_scale{\the\result}{##1}}
+ \fi
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro##1{\saved_scale{\the\e_count}{\a_macro{##1}}}
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\a_macro{\saved_raw{#2}{#5}{#1}}}
+ {\a_macro{\saved_mapfont{#2}{#3}}}
+ }
+ \fi
+}
+\def\setnotglyph#1#2#3{
+ \setscalednotglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscalednotglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}-not}\then
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}-not}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {}{}
+ }
+ \fi
+}
+\def\unsetglyph#1{\x_cs\let{g-#1}\x_relax}
+\def\glyph#1#2{
+ \glyph_parameter\glyph_metrics{#1}
+ \eval_expr_to\e_count{#2}
+ \ifnum \e_count=\one_thousand
+ \edef\a_macro{\mapcommands{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\mapfonts{#1}}
+ \else
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapcommands{#1}}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapfonts{#1}}}
+ \fi
+ \advance \glyph_width \a_count
+ \advance \b_count \glyph_voffset
+ \ifnum \glyph_height<\b_count \global\glyph_height=\b_count \fi
+ \advance \c_count -\glyph_voffset
+ \ifnum \glyph_depth<\c_count \global\glyph_depth=\c_count \fi
+ \global\glyph_italic=\d_count
+ \global\glyph_map_fonts\expandafter{
+ \the\expandafter\glyph_map_fonts \a_macro
+ }
+}
+\def\glyphrule#1#2{
+ \eval_expr_to\b_count{#1} \eval_expr_to\c_count{#2}
+ \advance\glyph_width by \b_count
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth{-\glyph_voffset}}
+ \g_eval_expr_to\glyph_height{
+ \max\glyph_height{\add\glyph_voffset\c_count}
+ }
+ \global\glyph_italic=0
+ \edef\a_macro{\saved_rule{\the\b_count}{\the\c_count}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphspecial#1{
+ \edef\a_macro{\saved_special{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphwarning#1{
+ \edef\a_macro{\saved_warning{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\movert#1{
+ \eval_expr{#1}
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \ifnum 0=\result \else
+ \advance\glyph_width by \result
+ \edef\a_macro{\saved_movert{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\moveup#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_voffset by \result
+ \edef\a_macro{\saved_moveup{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\push{
+ \bgroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_push
+ }
+}
+\def\pop{
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \egroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_pop
+ }
+}
+\def\resetwidth#1{\movert{\sub{#1}\glyph_width}}
+\def\resetheight{\g_eval_expr_to\glyph_height}
+\def\resetdepth{\g_eval_expr_to\glyph_depth}
+\def\resetitalic{\g_eval_expr_to\glyph_italic}
+\def\glyphpcc#1#2#3{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{\glyph_name_modifier{#1}}{\one_thousand}
+ \pop
+ \else\ifisglyph{\glyph_name_modifier{#1}-not}\then
+ \fontinstwarning{\string\glyphpcc}{
+ Base~glyph~`\glyph_name_modifier{#1}'~not~appended,\messagebreak
+ because~it~is~so~far~unencoded~in~the~glyph~base
+ }
+ \else
+ \fontinsterror{\string\glyphpcc}{
+ Base~glyph~not~set.\messagebreak
+ This~could~be~a~sign~that~the~AFM~file~is~buggy
+ }\error_help_a
+ \fi\fi
+}
+\def\glyphbboxright{\max\glyph_width\glyph_maxhpos}
+\def\samesize#1{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \resetwidth{\glyphbboxright}
+ \else
+ \expandafter\expandafter\expandafter
+ \same_size\csname g-\glyph_name_modifier{#1}\endcsname
+ \fi
+}
+\def\same_size#1#2#3#4#5#6{
+ \movert{\sub{#1}\glyph_width}
+ \global\glyph_height=#2
+ \global\glyph_depth=#3
+ \global\glyph_italic=#4
+}
+\def\ifisglyph#1\then{\if_defined{g-#1}\then}
+\def\ifareglyphs#1\then{
+ \process_csep_list{\if_is_glyph}#1,\process_csep_list,
+ \if_true
+}
+\def\if_is_glyph#1{
+ \if_undefined{g-#1}\then \expandafter\if_false \fi
+}
+\def\etxtovpl#1#2{{
+ \def\vpl_extension{vpl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{virtual~font}
+ \def\vpl_Font{Virtual~font}
+ \def\vpl_call{\string\etxtovpl{#1}{#2}}
+ \def\vpl_to_vf##1{vptovf~##1.vpl~##1.vf~##1.tfm}
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\def\etxtopl#1#2{{
+ \def\vpl_extension{pl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{font}
+ \def\vpl_Font{Font}
+ \def\vpl_call{\string\etxtopl{#1}{#2}}
+ \def\vpl_to_vf##1{pltotf~##1.pl~##1.tfm}
+ \_including_map_false
+ \global\rawfont_scaling=-\p@
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\newif\if_including_map_
+\_including_map_true
+\def\make_inputetx#1{
+ \def\a_macro{\noexpand\inputetx{\file_name}}
+ \get_file_name #1~{}~\par
+ \edef\a_macro{\a_macro}
+ \a_toks=\expandafter{ \the\expandafter\a_toks \a_macro}
+}
+\x_cs\def{IFKW-mtxasetx}{
+ \def\a_macro{\noexpand\input_mtx_as_etx{\file_name}}
+ \get_keyword
+}
+\def\etx_to_font#1#2{
+ \make_assignments{#1}
+ \open_out{#2.\vpl_extension}
+ \top_of_pl_hook
+ \out_line{(\vpl_title\space\vpl_font\space
+ #2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.\vpl_extension)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\vpl_call)}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~\vpl_font\space
+ with)}
+ \out_line{(COMMENT~\vpl_to_vf{#2})}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \make_header{#1}
+ \if_including_map_ \make_mapfonts{#1} \fi
+ \make_fontdimens{#1}
+ \make_ligtable{#1}
+ \make_characters{#1}
+ \make_tidy{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.\vpl_extension)}
+ \close_out{\vpl_Font}
+}
+\let\pre_first_etx_pass_hook\x_relax
+\let\pre_second_etx_pass_hook\x_relax
+\let\pre_third_etx_pass_hook\x_relax
+\let\pre_fourth_etx_pass_hook\x_relax
+\let\post_first_etx_pass_hook\x_relax
+\let\post_second_etx_pass_hook\x_relax
+\let\post_third_etx_pass_hook\x_relax
+\let\post_fourth_etx_pass_hook\x_relax
+\let\tidying_up_hook\x_relax
+\let\top_of_pl_hook\x_relax
+\def\make_assignments#1{
+ \let\do_slot=\assign_slot
+ \let\end_do_slot=\end_assign_slot
+ \def\do_boundary{\bgroup
+ \let\makerightboundary=\bad_makerightboundary
+ }
+ \let\endsetleftboundary=\egroup
+ \let\makerightboundary=\assign_rboundary
+ \pre_first_etx_pass_hook
+ #1
+ \post_first_etx_pass_hook
+ \let\end_do_slot=\empty_command
+ \let\do_boundary=\x_relax
+ \let\endsetleftboundary=\x_relax
+ \let\makerightboundary=\gobble_one
+}
+\def\assign_slot{\a_toks={\do}}
+\begingroup
+ \catcode0=12
+ \gdef\end_assign_slot{
+ \ifisglyph\slot_name\then
+ \lccode0=\slot_number
+ \lowercase{
+ \expandafter\add_to
+ \csname slots-\slot_name\expandafter\endcsname
+ \expandafter{\the\a_toks^^@}
+ }
+ \x_resetint\slot_name\slot_number
+ \fi
+ }
+ \gdef\assign_rboundary#1{
+ \lccode0=\slot_number
+ \lowercase{\x_cs\add_to{slots-#1}{\rboundary_do^^@}}
+ \x_setint{\percent_char boundarychar}\slot_number
+ \a_toks={\rbserver_do}
+ }
+\endgroup
+\def\bad_makerightboundary#1{
+ \errhelp={The~left~boundary~is~not~a~slot,~so~it~cannot~serve~
+ as~right~boundary.}
+ \errmessage{Incorrect~use~of~\string\makerightboundary}
+}
+\def\get_slot_num#1{
+ \ifisint{#1}\then
+ \global\result=\int{#1}
+ \else
+ \global\result=-1
+ \fi
+ \x_relax
+}
+\def\ifisinslot#1#2\then{
+ \ifx \makerightboundary\gobble_one
+ \eval_expr{#2}
+ \begingroup
+ \def\do##1{\ifnum `##1=\result \let\do=\gobble_one \fi}
+ \def\rbserver_do{\do}
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \expandafter\endgroup
+ \ifx \do\gobble_one
+ \expandafter\expandafter \expandafter\if_true
+ \else
+ \expandafter\expandafter \expandafter\if_false
+ \fi
+ \else
+ \expandafter\gobble_if
+ \fi
+}
+\newdimen\mapfont_scaling
+\mapfont_scaling=1pt
+\newdimen\rawfont_scaling
+\def\vpl_real#1{R~\expandafter\lose_measure\the#1}
+\def\vpl_int#1{D~\the#1}
+\newdimen\side_bearings
+\newdimen\curr_bearings
+\def\make_header#1{
+ \global\font_count=0
+ \setdim{designsize}{10pt}
+ \a_dimen=\dim{designsize}
+ \out_line{(DESIGNSIZE~\vpl_real\a_dimen)}
+ \x_setstr{codingscheme}{UNKNOWN}
+ \out_line{(CODINGSCHEME~\str{codingscheme})}
+ \ifisint{boundarychar}\then
+ \x_setint{\percent_char boundarychar}{\int{boundarychar}}
+ \immediate\write16{Please~use~\string\setleftboundary\space
+ and/or~\string\makerightboundary^^J
+ instead~of~setting~the~boundarychar~integer.}
+ \fi
+ \ifisint{\percent_char boundarychar}\then
+ \a_count=\int{\percent_char boundarychar}
+ \out_line{(BOUNDARYCHAR~\vpl_int\a_count)}
+ \fi
+ \x_setint{letterspacing}{0}
+ \side_bearings=\make_factor{\int{letterspacing}}\half_point
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{}
+}
+\def\make_mapfonts#1{
+ \let\saved_scale\vpl_scale
+ \let\saved_mapfont\vpl_mapfont
+ \let\do_slot=\do_mapfont
+ \pre_second_etx_pass_hook
+ #1
+ \post_second_etx_pass_hook
+ \out_line{}
+}
+\def\do_mapfont{
+ \ifisglyph\slot_name\then
+ \mapfonts\slot_name
+ \fi
+}
+\def\vpl_scale#1#2{{
+ \mapfont_scaling=\make_factor{#1}\mapfont_scaling
+ #2
+}}
+\def\vpl_mapfont#1#2{
+ \a_dimen=#2
+ \if_undefined{\the\mapfont_scaling-#1}\then
+ \global\x_cs\mathchardef{\the\mapfont_scaling-#1}=\font_count
+ \x_cs\xdef{f-\the\font_count}{\the\mapfont_scaling-#1}
+ \out_line{(MAPFONT~\vpl_int\font_count\space
+ (FONTNAME~#1)~
+ (FONTDSIZE~\vpl_real\a_dimen)~
+ (FONTAT~\vpl_real\mapfont_scaling))}
+ \record_usage{#1}
+ \global\advance\font_count by 1
+ \fi
+}
+\def\pl_mapfont#1#2{\global\rawfont_scaling=\mapfont_scaling}
+\newcount\font_count
+\newcount\next_mapfont
+\newcount\prev_mapfont
+\def\make_fontdimens#1{
+ \out_line{(FONTDIMEN}
+ \a_count=1
+ \loop\ifnum 256>\a_count
+ \ifisint{fontdimen(\the\a_count)}\then
+ \out_lline{(PARAMETER~\vpl_int\a_count\space
+ R~\make_factor{\int{fontdimen(\the\a_count)}})}
+ \fi
+ \advance \a_count \@ne
+ \repeat
+ \out_lline{)}
+ \out_line{}
+}
+\def\make_ligtable#1{
+ \begingroup
+ \out_line{(LIGTABLE}
+ \def\do_slot{\bgroup
+ \ifisint{boundarychar}\then
+ \ifnum \int{boundarychar}=\slot_number
+ \def\vpl_liglabel{\out_liglabel\boundary_liglabel}
+ \fi
+ \fi
+ }
+ \let\end_do_slot=\vpl_kerning
+ \def\do_boundary{\bgroup \let\vpl_liglabel=\boundary_liglabel}
+ \let\endsetleftboundary=\vpl_kerning
+ \let\ligature=\vpl_ligature
+ \let\k=\vpl_kern
+ \let\rbserver_do=\vpl_rbserver_do
+ \let\rboundary_do=\vpl_rboundary_do
+ \pre_third_etx_pass_hook
+ #1
+ \post_third_etx_pass_hook
+ \out_lline{)}
+ \endgroup
+ \out_line{}
+}
+\def\vpl_rbserver_do#1{
+ \do{#1}
+ \let\rboundary_do=\wrn_rboundary_do
+}
+\def\vpl_rboundary_do#1{
+ \do{#1}
+ \let\rbserver_do=\wrn_rboundary_do
+}
+\def\wrn_rboundary_do#1{
+ \do{#1}
+ \immediate\write16{Boundarychar~slot~usage~collision~in~
+ `\slot_name'~ligkern~program.}
+}
+\def\vpl_ligature#1#2#3{
+ \get_slot_num{#3}
+ \ifnum -1=\result
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \else
+ \x_cs\ifx{slots-#2}\x_relax
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#2'.}
+ \else
+ \def\do##1{
+ \vpl_liglabel
+ \out_lline{(#1~D~\number`##1~\space\vpl_int\result)~
+ (COMMENT~#2~#3)}
+ }
+ \csname slots-#2\endcsname
+ \fi
+ \fi
+}
+\def\vpl_kerning{
+ \let\do=\vpl_kern_do
+ \csname~r-\slot_name\endcsname
+ \vpl_ligstop
+ \egroup
+}
+\def\vpl_kern#1#2{
+ \edef\a_macro{\expandafter\gobble_three\string#1}
+ \a_count=\expandafter\gobble_one\string#2\x_relax
+ \ifnum \ifnum -\a_count>\a_count - \fi\a_count>\minimum_kern
+ \edef\b_macro{~R~\make_factor\a_count}
+ \csname slots-\a_macro\endcsname
+ \fi
+ \x_cs\let{slots-\a_macro}=\x_relax
+}
+\def\vpl_kern_do#1{
+ \vpl_liglabel
+ \out_lline{
+ (KRN~D~\number`#1~\b_macro)~
+ (COMMENT~\a_macro)
+ }
+}
+\def\out_liglabel{
+ \out_lline{(LABEL~\vpl_int\slot_number)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\def\boundary_liglabel{
+ \out_lline{(LABEL~BOUNDARYCHAR)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\let\vpl_liglabel=\out_liglabel
+\def\out_ligstop{\out_lline{(STOP)}
+ \let\vpl_liglabel=\out_liglabel
+ \let\vpl_ligstop=\x_relax}
+\let\vpl_ligstop=\x_relax
+\def\make_characters#1{
+ \bgroup
+ \let\do_slot=\do_character
+ \let\end_do_slot=\end_do_character
+ \let\nextlarger=\vpl_nextlarger
+ \let\varchar=\vpl_varchar
+ \let\endvarchar=\end_vpl_varchar
+ \let\vartop=\vpl_vartop
+ \let\varmid=\vpl_varmid
+ \let\varbot=\vpl_varbot
+ \let\varrep=\vpl_varrep
+ \if_including_map_
+ \let\saved_raw\vpl_raw
+ \let\saved_rule\vpl_rule
+ \let\saved_special\vpl_special
+ \let\saved_warning\vpl_warning
+ \let\saved_movert\vpl_movert
+ \let\saved_moveup\vpl_moveup
+ \let\saved_push\vpl_push
+ \let\saved_pop\vpl_pop
+ \else
+ \def\do_character_map{
+ \ifdim \rawfont_scaling=-\p@
+ \mapfonts\slot_name
+ \else
+ \let\do_character_map=\x_relax
+ \fi
+ }
+ \let\saved_mapfont\pl_mapfont
+ \let\saved_scale\vpl_scale
+ \fi
+ \pre_fourth_etx_pass_hook
+ #1
+ \post_fourth_etx_pass_hook
+ \egroup
+}
+\def\do_character{
+ \if_undefined{g-\slot_name}\then
+ \ifisint{requireglyphs}\then
+ \fontinstwarning{ETX~to~(V)PL}{
+ Undefined~glyph~`\slot_name'~requested\message_break
+ for~slot~\the\slot_number\message_number}
+ \fi
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \glyph_parameter\glyph_metrics\slot_name
+ \a_dimen=\make_factor\a_count \p@
+ \do_character_sidebearings
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \ifnum \z@=\b_count \else
+ \out_lline{(CHARHT~R~\make_factor\b_count)}
+ \fi
+ \ifnum \z@=\c_count \else
+ \out_lline{(CHARDP~R~\make_factor\c_count)}
+ \fi
+ \ifnum \z@=\d_count \else
+ \out_lline{(CHARIC~R~\make_factor\d_count)}
+ \fi
+ \do_character_map
+ \fi
+ \fi
+}
+\def\do_character_sidebearings{
+ \ifisint{\slot_name-spacing}\then
+ \curr_bearings=\make_factor{\int{\slot_name-spacing}}\half_point
+ \else
+ \curr_bearings=\side_bearings
+ \fi
+ \advance\a_dimen by 2\curr_bearings
+}
+\def\do_character_map{
+ \global\prev_mapfont=0
+ \out_lline{(MAP}
+ \ifdim 0pt=\curr_bearings
+ \mapcommands\slot_name
+ \else
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \mapcommands\slot_name
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \fi
+ \out_llline{)}
+}
+\long\def\gobble_setslot#1\endsetslot{\endsetslot}
+\def\end_do_character{
+ \ifisglyph\slot_name\then
+ \out_lline{)}
+ \fi
+}
+\def\notdef_name{.notdef}
+\def\vpl_nextlarger#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_lline{(NEXTLARGER~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\nextlarger\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varchar{\out_lline{(VARCHAR}}
+\def\end_vpl_varchar{\out_llline{)}}
+\def\vpl_vartop#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(TOP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\vartop\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varmid#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(MID~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varmid\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varbot#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(BOT~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varbot\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varrep#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(REP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varrep\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_raw#1#2#3{
+ \global\next_mapfont=\csname\the\mapfont_scaling-#1\endcsname
+ \ifnum \next_mapfont=\prev_mapfont \else
+ \out_llline{(SELECTFONT~\vpl_int\next_mapfont)~
+ (COMMENT~#1~at~
+ \expandafter\lose_measure \the\mapfont_scaling)}
+ \fi
+ \out_llline{(SETCHAR~D~#2)~(COMMENT~#3)}
+ \global\prev_mapfont=\next_mapfont
+}
+\def\vpl_rule#1#2{
+ \a_dimen=\make_factor{#2}\mapfont_scaling
+ \b_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(SETRULE~\vpl_real\a_dimen\space\vpl_real\b_dimen)}
+}
+\def\vpl_special#1{
+ \out_llline{(SPECIAL~#1)}}
+\def\vpl_warning#1{
+ \ifwarningspecials
+ \out_llline{(SPECIAL~Warning:~#1)}
+ \fi
+ \immediate\write16{Warning:~#1.}
+}
+\newif\ifwarningspecials
+\warningspecialstrue
+\def\vpl_movert#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVERIGHT~\vpl_real\a_dimen)}
+}
+\def\vpl_moveup#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVEUP~\vpl_real\a_dimen)}
+}
+\def\vpl_push{\out_llline{(PUSH)}}
+\def\vpl_pop{\out_llline{(POP)}}
+\def\make_tidy#1{
+ \tidying_up_hook
+ \if_including_map_
+ \a_count=0
+ \loop\ifnum \a_count<\font_count
+ \edef\a_macro{\csname~f-\the\a_count\endcsname}
+ \global\x_cs\let\a_macro\x_relax
+ \advance\a_count by 1
+ \repeat
+ \global\font_count=0
+ \else
+ \ifdim \rawfont_scaling<\z@
+ \fontinstwarning{ETX~to~(V)PL}{The~font~
+ \out_filename\space doesn't~contain~any~characters}
+ \global\rawfont_scaling=\p@
+ \fi
+ \ifdim \rawfont_scaling=\p@ \else
+ \out_line{(DESIGNUNITS~\vpl_real\rawfont_scaling)}
+ \fi
+ \fi
+}
+\newtoks\family_toks
+\def\installfonts{
+ \bgroup
+ \global\family_toks={}
+ \gdef\prev_file_list{}
+ \global\let\setsomething_global=\global
+}
+\def\installfamily#1#2#3{
+ \global\family_toks=
+ \expandafter{\the\family_toks\fd_family{#1}{#2}{#3}}
+ \global\x_cs\let{#1-#2}\empty_command
+}
+\def\installfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \input_metrics{}{#2}
+ \etxtovpl{#3}{#1}
+ \installfontas{#1}{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installrawfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \xdef\out_filename{#1}
+ \input_metrics{\let\storemapdata=\installraw_storemap}{#2}
+ \let\storemapdata=\gobble_three
+ \etxtopl{#3}{#1}
+ \record_usage{#1}
+ \installfontas{
+ \ifdim \rawfont_scaling=\p@ \else
+ [\expandafter\lose_measure\the\rawfont_scaling]~
+ \fi #1
+ }{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installraw_storemap#1#2#3{
+ \def\a_macro{#1}
+ \ifx \a_macro\out_filename \else
+ \record_transform{\out_filename}{\string\frommtx{#1}}{}\if_false
+ \fi
+}
+\def\input_metrics#1#2{
+ \let\metrics=\file_list_metrics
+ \xdef\curr_file_list{#2,}
+ \let\metrics=\x_relax
+ \ifx\prev_file_list\curr_file_list\else
+ \egroup\bgroup
+ #1
+ \expandafter\process_csep_list \expandafter\input_mtx_file
+ \curr_file_list\process_csep_list,
+ \global\let\prev_file_list=\curr_file_list
+ \fi
+}
+\def\file_list_metrics#1,{
+ \iffalse{\fi}
+ \a_toks=\expandafter{\curr_file_list\x_relax#1,}
+ \xdef\curr_file_list{\the\a_toks \iffalse}\fi
+}
+\def\installfontas#1#2#3#4#5#6{
+ \if_undefined{#2-#3-#4-#5}\then
+ \let\do_shape=\x_relax
+ \if_undefined{#2-#3}\then
+ \x_cs\let{#2-#3}\empty_command
+ \autoinstallfamily{#2}{#3}
+ \fi
+ \x_cs\xdef{#2-#3}{
+ \csname#2-#3\endcsname
+ \do_shape{#2}{#3}{#4}{#5}
+ }
+ \fi
+ \let\do_size=\x_relax
+ \x_cs\xdef{#2-#3-#4-#5}{
+ \if_defined{#2-#3-#4-#5}\then
+ \csname#2-#3-#4-#5\endcsname
+ \fi
+ \do_size{#6}{#1}
+ }
+}
+\def\autoinstallfamily#1#2{\installfamily{#1}{#2}{}}
+\def\endinstallfonts{
+ \global\let\setsomething_global=\x_relax
+ \let\do_shape=\fd_shape
+ \let\do_size=\fd_size
+ \the\family_toks
+ \global\family_toks{}
+ \egroup
+}
+\def\input_mtx_file#1{
+ \reset_modifiers_hook
+ \ifx\x_relax#1\x_relax
+ \else
+ \identity_one{\get_file_name #1~}~\par
+ \ifx \pl_encoding\empty_command
+ \fromany\file_name
+ \else
+ \metrics_given_encoding{\file_name}{\pl_encoding}
+ \fi
+ \ifisstr{afm-name}\then
+ \inputmtx{\str{afm-name}}
+ \else
+ \fontinsterror{\string\install...}{
+ Font/MTX~file~\file_name\space not~found
+ }{
+ You~can~insert~an~\string\inputmtx\space command~here
+ \messagebreak to~input~some~other~MTX~file~instead.
+ \ifisint{rawscale}\then \messagebreak
+ The~requested~raw~scaling~will~then~be~applied~on~that.
+ \fi
+ }
+ \fi
+ \fi
+}
+\def\metrics_given_encoding#1#2{
+ \x_cs\edef{s-afm-name}{#1-#2}
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1-#2}{pl}{#2}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1-#2}{vpl}{#2}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi
+}
+\def\reset_modifiers_hook{
+ \unsetint{rawscale}
+ \let\glyph_name_modifier\identity_one
+ \let\pl_encoding\empty_command
+ \let\list_of_options\empty_command
+}
+\def\get_file_name #1~{
+ \edef\file_name{#1}
+ \get_keyword
+}
+\def\get_keyword #1~{
+ \if_defined{IFKW-#1}\then
+ \csname IFKW-#1 \expandafter\endcsname
+ \else
+ \fontinsterror{\string\install...}{
+ `#1'~is~not~a~defined~keyword
+ }{
+ \error_help_a\messagebreak
+ Extra~tokens~will~be~flushed.
+ }
+ \expandafter\gobble_keywords
+ \fi
+}
+\def\gobble_keywords#1\par{}
+\x_cs\let{IFKW-}=\gobble_keywords
+\x_cs\def{IFKW-scaled}#1~{
+ \ifnum #1=\one_thousand
+ \unsetint{rawscale}
+ \else
+ \x_resetint{rawscale}{#1}
+ \fi
+ \get_keyword
+}
+\x_cs\def{IFKW-suffix}#1~{
+ \def\glyph_name_modifier##1{##1#1}
+ \get_keyword
+}
+\x_cs\def{IFKW-encoding}#1~{
+ \def\pl_encoding{#1}
+ \get_keyword
+}
+\let\pl_encoding=\empty_command
+\x_cs\def{IFKW-option}#1~{
+ \add_to\list_of_options{\do{#1}}
+}
+\def\ifoption#1\then{
+ \_a_false
+ \edef\a_macro{#1}
+ \def\do##1{
+ \if_a_ \else
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \_a_true \fi
+ \fi
+ }
+ \list_of_options
+ \if_a_
+}
+\let\list_of_options\empty_command
+\def\fd_family#1#2#3{
+ \a_toks{#3}
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1#2.fd}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~Filename:~\lowercase_file}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using~fontinst~v\fontinstversion}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~SHOULD~BE~PUT~IN~A~TEX~INPUTS~
+ DIRECTORY}
+ \out_line{}
+ \out_line{\string\ProvidesFile{\lowercase_file}}
+ \out_lline{[
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day\space
+ Fontinst~v\fontinstversion\space
+ font~definitions~for~#1/#2.
+ ]}
+ \out_line{}
+ \out_line{\string\DeclareFontFamily{#1}{#2}{\the\a_toks}}
+ {
+ \csname #1-#2\endcsname
+ \out_line{}
+ \let\do_shape=\substitute_shape
+ \csname #1-#2\endcsname
+ \let\do_shape=\remove_shape
+ \csname #1-#2\endcsname
+ }
+ \x_cs\g_let{#1-#2}\x_relax
+ \out_line{}
+ \out_line{\string\endinput}
+ \close_out{Font~definitions}
+}
+\def\fd_shape#1#2#3#4{
+ \out_line{}
+ \out_line{\string\DeclareFontShape{#1}{#2}{#3}{#4}\left_brace_char}
+ \csname #1-#2-#3-#4\endcsname
+ \x_cs\g_let{#1-#2-#3-#4}\empty_command
+ \out_line{\right_brace_char{}}
+}
+\def\fd_size#1#2{
+ \x_cs\ifx{siz-#1}\x_relax
+ \out_lline{#1~#2}
+ \else
+ \out_lline{\csname siz-#1\endcsname\space #2}
+ \fi
+}
+\def\remove_shape#1#2#3#4{
+ \x_cs\g_let{#1-#2-#3-#4}\x_relax
+}
+\def\substitute_shape#1#2#3#4{
+ \edef\orig_shape{#4}
+ \substitute_series{#1}{#2}{#3}{\orig_shape}
+ \x_cs\ifx{sub-\orig_shape}\x_relax\else
+ \edef\subst_shape{\csname sub-\orig_shape\endcsname}
+ \x_cs\ifx{#1-#2-#3-\subst_shape}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{#3}{\subst_shape}{
+ <->\csname typ-\orig_shape\endcsname\space
+ *~#2/#3/\orig_shape
+ }{}
+ }
+ \x_cs\let{#1-#2-#3-\subst_shape}\empty_command
+ \substitute_shape{#1}{#2}{#3}{\subst_shape}
+ \fi
+ \fi
+}
+\def\substitute_series#1#2#3#4{
+ \edef\orig_series{#3}
+ \x_cs\ifx{sub-\orig_series}\x_relax\else
+ \edef\subst_series{\csname sub-\orig_series\endcsname}
+ \x_cs\ifx{#1-#2-\subst_series-#4}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{\subst_series}{#4}{
+ <->\csname typ-\orig_series\endcsname\space
+ *~#2/\orig_series/#4
+ }{}
+ }
+ \x_cs\let{#1-#2-\subst_series-#4}\empty_command
+ \substitute_series{#1}{#2}{\subst_series}{#4}
+ \fi
+ \fi
+}
+\def\substitute_generic#1#2#3{
+ \edef\a_macro{#2}
+ \edef\b_macro{#3}
+ \ifx \a_macro \b_macro
+ \x_cs\let{sub-#3}\undefined_command
+ \else
+ \x_cs\let{sub-#3}\a_macro
+ \x_cs\def{typ-#3}{#1}
+ \fi
+}
+\def\substitutesilent{\substitute_generic{ssub}}
+\def\substitutenoisy{\substitute_generic{sub}}
+\substitutesilent{bx}{b}
+\substitutesilent{b}{bx}
+\substitutesilent{b}{sb}
+\substitutesilent{b}{db}
+\substitutesilent{m}{mb}
+\substitutesilent{m}{l}
+\substitutenoisy{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{it}{sl}
+\def\declareencoding#1#2{\x_cs\edef{enc-#1}{#2}}
+\declareencoding{TEX~TEXT}{ot1}
+\declareencoding{TEX~TEXT~WITHOUT~F-LIGATURES}{ot1}
+\declareencoding{TEX~TYPEWRITER~TEXT}{ot1tt}
+\declareencoding{TEX~MATH~ITALIC}{oml}
+\declareencoding{TEX~MATH~SYMBOLS}{oms}
+\declareencoding{TEX~MATH~EXTENSION}{omx}
+\declareencoding{LATEX~SYMBOLS}{lasy}
+\declareencoding{TEX~TEXT~SUBSET}{eufrak}
+\declareencoding{TEX~MATH~ITALIC~SUBSET}{eurm}
+\declareencoding{TEX~MATH~SYMBOLS~SUBSET}{euscr}
+\declareencoding{EULER~SUBSTITUTIONS~ONLY}{euex}
+\declareencoding{EXTENDED~TEX~FONT~ENCODING~-~LATIN}{t1}
+\declareencoding{TEX~TEXT~COMPANION~SYMBOLS~1---TS1}{ts1}
+\declareencoding{TEXBASE1ENCODING}{8r}
+\declareencoding{TEX~TYPEWRITER~AND~WINDOWS~ANSI}{8y}
+\def\declaresize#1#2{\x_cs\edef{siz-#1}{#2}}
+\declaresize{}{<->}
+\declaresize{5}{<5>}
+\declaresize{6}{<6>}
+\declaresize{7}{<7>}
+\declaresize{8}{<8>}
+\declaresize{9}{<9>}
+\declaresize{10}{<10>}
+\declaresize{11}{<10.95>}
+\declaresize{12}{<12>}
+\declaresize{14}{<14.4>}
+\declaresize{17}{<17.28>}
+\declaresize{20}{<20.74>}
+\declaresize{25}{<24.88>}
+\def\NOFILES{
+ \def\transformfont##1##2{
+ \touch_file{##1.mtx}
+ \touch_file{##1.pl}
+ }
+ \def\reglyphfont##1##2{\touch_file{##1.mtx}}
+ \def\installfonts{}
+ \def\endinstallfonts{}
+ \def\installfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.vpl}
+ }
+ \def\installrawfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.pl}
+ }
+ \def\installfamily##1##2##3{\touch_file{##1##2.fd}}
+}
+\def\touch_file#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~TEST~FILE.}
+ \out_line{\percent_char~Created~whilst~debugging~fontinst.}
+ \close_out{Test~file}
+}
+%%% From file: fitrig.dtx
+\chardef\nin@ty=90
+\chardef\@clxxx=180
+\chardef\@lxxi=71
+\mathchardef\@mmmmlxviii=4068
+\chardef\@coeffz=72
+\chardef\@coefb=42
+\mathchardef\@coefc=840
+\mathchardef\@coefd=5040
+\def\TG@rem@pt#1{\expandafter\lose_measure\the#1\space}
+\def\TG@term#1{
+ \dimen@\@tempb\dimen@
+ \advance\dimen@ #1\p@
+}
+\def\TG@series{
+ \dimen@\@lxxi\dimen@
+ \divide \dimen@ \@mmmmlxviii
+ \edef\@tempa{\TG@rem@pt\dimen@}
+ \dimen@\@tempa\dimen@
+ \edef\@tempb{\TG@rem@pt\dimen@}
+ \divide\dimen@\@coeffz
+ \advance\dimen@\m@ne\p@
+ \TG@term\@coefb
+ \TG@term{-\@coefc}%
+ \TG@term\@coefd
+ \dimen@\@tempa\dimen@
+ \divide\dimen@ \@coefd
+}
+\def\CalculateSin#1{{%
+ \if_undefined{sin(\number#1)}\then
+ \dimen@=#1\p@
+ \TG@@sin
+ \x_cs\xdef{sin(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\CalculateCos#1{{%
+ \if_undefined{cos(\number#1)}\then
+ \dimen@=\nin@ty\p@
+ \advance \dimen@ -#1\p@
+ \TG@@sin
+ \x_cs\xdef{cos(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\TG@@sin{%
+ \ifdim\TG@reduce>+%
+ \else\ifdim\TG@reduce<-%
+ \else\TG@series\fi\fi
+}
+\def\TG@reduce#1#2{
+ \dimen@#1#2\nin@ty\p@
+ \advance\dimen@#2-\@clxxx\p@
+ \dimen@-\dimen@
+ \TG@@sin
+}
+\def\UseSin#1{\csname sin(\number#1)\endcsname}
+\def\UseCos#1{\csname cos(\number#1)\endcsname}
+\chardef\z@num\z@
+\x_cs\let{sin(0)} \z@num
+\x_cs\let{cos(0)} \@ne
+\x_cs\let{sin(90)} \@ne
+\x_cs\let{cos(90)} \z@num
+\x_cs\let{sin(-90)}\m@ne
+\x_cs\let{cos(-90)}\z@num
+\x_cs\let{sin(180)}\z@num
+\x_cs\let{cos(180)}\m@ne
+\def\CalculateTan#1{{%
+ \if_undefined{tan(\number#1)}\then
+ \CalculateSin{#1}%
+ \CalculateCos{#1}%
+ \a_dimen\UseCos{#1}\p@
+ \divide \a_dimen \@iv
+ \b_dimen\UseSin{#1}\p@
+ \b_dimen\two@fourteen\b_dimen
+ \divide\b_dimen\a_dimen
+ \x_cs\xdef{tan(\number#1)}{\TG@rem@pt\b_dimen}
+ \fi
+}}
+\def\UseTan#1{\csname tan(\number#1)\endcsname}
+\mathchardef\two@fourteen=16384
+\chardef\@iv=4
+\x_cs\def{tan(90)}{\errmessage{Infinite tan !}}
+\expandafter\let
+ \csname tan(-90)\expandafter\endcsname \csname tan(90)\endcsname
+%%% From file: ficonv.dtx
+\def\afmtomtx#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \edef\source_font_name{#1}
+ \x_resetint{italicslant}{0}
+ \let\italcorr_expression=\uprightitalcorr
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.afm~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\^^M=12
+ \catcode`\ =10
+ \expandafter\afm_line\primitiveinput #1.afm\x_relax
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}}
+\newcount\minimum_kern
+\def\afm_length#1#2{
+ \a_dimen=#2\afm_unit_dimen
+ #1=\a_dimen
+ \divide #1 by \afm_unit_dimen
+ \advance \a_dimen by -#1\afm_unit_dimen
+ \ifdim \a_dimen>0.5\afm_unit_dimen
+ \advance #1 by 1
+ \else \ifdim \a_dimen<-0.5\afm_unit_dimen
+ \advance #1 by -1
+ \fi\fi
+ \x_relax
+}
+\newdimen\afm_unit_dimen
+\afm_unit_dimen=1000sp
+{\catcode`\^^M=12 \gdef\afm_line#1
+{\afm_command#1~\end_of_line\afm_line}}
+\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line}
+\def\gobble_one_line#1\end_of_line{}
+\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput}
+\def\afm_def#1(#2)#3{
+ \x_cs\def{afm-#1}\gobble_one_line#2\end_of_line{#3}
+}
+\def\afm_let#1#2{
+ \expandafter\let \csname afm-#1\expandafter\endcsname
+ \csname afm-#2\endcsname
+}
+\afm_def{CharWidth}(#1){\afm_length\char_x_width{#1}}
+\afm_def{ItalicAngle}(#1~){\calculate_it_slant{#1}}
+\afm_def{XHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{xheight}{\the\a_count}}}
+\afm_def{CapHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{capheight}{\the\a_count}}}
+\afm_def{Ascender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{ascender}{\the\a_count}}}
+\afm_def{Descender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{descender_neg}{\the\a_count}}}
+\afm_def{UnderlineThickness}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{underlinethickness}{\the\a_count}}}
+\afm_def{FontBBox}(#1~#2~#3~#4){
+ \afm_length\a_count{#4}
+ \out_line{\string\setint{maxheight}{\the\a_count}}
+ \afm_length\a_count{#2}
+ \out_line{\string\setint{maxdepth_neg}{\the\a_count}}}
+\afm_def{StdVW}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{verticalstem}{\the\a_count}}}
+\afm_def{IsFixedPitch}(#1){
+ \if\first_char#1=f
+ \else\out_line{\string\setint{monowidth}{1}}
+ \fi
+}
+\afm_def{FontName}(#1~){
+ \record_transform{\raw_font_name}
+ {\string\fromafm{\source_font_name}{#1}}{}\iftrue
+}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \afm_length\a_count{#3}
+ \ifnum \a_count>\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \else\ifnum \a_count<-\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \fi\fi
+ \fi\fi
+}
+\afm_let{KPX}{KP}
+\def\afm_write_setkern#1#2#3{\out_line{\string\setkern{#1}{#2}{#3}}}
+\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+\afm_def{CH}(<#1>~;#2){\uppercase{\init_afm{"#1}}\do_list[#2]\afm_char}
+\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char}
+\newcount\char_slot
+\newcount\char_x_width
+\newcount\x_width
+\newcount\bbox_llx
+\newcount\bbox_lly
+\newcount\bbox_urx
+\newcount\bbox_ury
+\let\char_name=\empty_command
+\def\init_afm#1{
+ \char_slot=#1\x_relax
+ \x_width=\char_x_width
+ \bbox_llx=0
+ \bbox_lly=0
+ \bbox_urx=0
+ \bbox_ury=0
+ \let\char_name=\empty_command
+}
+\def\afm_char{
+ \eval_expr{
+ \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury
+ }
+ \out_line{
+ \ifnum -1<\char_slot
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\number -\bbox_lly}
+ {\the\result}
+ }
+}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{#1}}
+ \def\char_name{#1}
+}
+\def\cc_char{%
+ \out_lline{\string\samesize{\char_name-not}}
+ \out_line{\string\endsetglyph}
+}
+\def\uprightitalcorr#1#2#3#4#5{0}
+\def\slanteditalcorr#1#2#3#4#5{\max{\sub{#3}{#1}}{0}}
+\def\calculate_it_slant#1{
+ \edef\theangle{#1}
+ \CalculateTan{\theangle}
+ \a_dimen=-\one_thousand sp
+ \a_dimen=\UseTan{\theangle}\a_dimen
+ \a_count=\a_dimen
+ \out_line{\string\setint{italicslant}{\the\a_count}}
+ \x_resetint{italicslant}{\a_count}
+ \ifnum 0<\a_count
+ \let\italcorr_expression=\slanteditalcorr
+ \else
+ \let\italcorr_expression=\uprightitalcorr
+ \fi
+}
+\def\do_list[~#1~#2;~#3]{
+ \csname~list-#1\endcsname\gobble_one_semi#2;
+ \ifx\x_relax#3\x_relax\expandafter\gobble_one
+ \else\expandafter\identity_one\fi
+ {\do_list[~#3]}
+}
+\def\gobble_one_semi#1;{}
+\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}}
+\list_def{W}(#1~#2){\afm_length\x_width{#1}}
+\list_def{WX}(#1){\afm_length\x_width{#1}}
+\list_def{WY}(#1){}
+\list_def{N}(#1){\def\char_name{#1}}
+\list_def{B}(#1~#2~#3~#4){
+ \afm_length\bbox_llx{#1}
+ \afm_length\bbox_lly{#2}
+ \afm_length\bbox_urx{#3}
+ \afm_length\bbox_ury{#4}
+}
+\list_def{PCC}(#1~#2~#3){
+ \afm_length\a_count{#2}
+ \afm_length\b_count{#3}
+ \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}}
+}
+\def\definealias#1#2#3{
+ \expandafter\def \csname GN-#1 \expandafter\endcsname
+ \expandafter{ \csname g-#2 \expandafter\endcsname
+ \csname i-#3\endcsname}
+}
+\def\glyph_alias#1{
+ \expandafter\expandafter \expandafter\glyph_alias_i
+ \csname GN-#1\endcsname
+}
+\def\glyph_alias_i#1#2{
+ \expandafter\gobble_three \string#1
+}
+\let\charnameprefix\empty
+\def\charnamealias#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \glyph_alias{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \glyph_alias{#1}
+ \else
+ #1
+ \fi\fi
+}
+\def\alias_incr#1{
+ \expandafter\expandafter \expandafter\alias_incr_i
+ \csname GN-#1\endcsname
+}
+\def\alias_incr_i#1#2{
+ \ifx#2\x_relax
+ \mathchardef#2=\@ne
+ \else
+ \a_count=#2
+ \advance\a_count\@ne
+ \mathchardef#2=\a_count
+ \fi
+}
+\def\alias_char_name#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{\charnameprefix#1}}
+ }
+ \alias_incr{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{#1}}
+ }
+ \alias_incr{#1}
+ \else
+ \edef\char_name{#1}
+ \fi\fi
+}
+\def\autoaliasafm{
+ \begingroup
+ \list_def{N}(##1){\alias_char_name{##1}}
+ \def\afm_write_setkern##1##2##3{
+ \out_line{
+ \string\setkern{\charnamealias{##1}}{\charnamealias{##2}}{##3}
+ }
+ }
+ \def\init_cc##1{%
+ \edef\char_name{\charnamealias{##1}}
+ \out_line{\string\setglyph{\char_name}}
+ }
+ \list_def{PCC}(##1~##2~##3){
+ \afm_length\a_count{##2}
+ \afm_length\b_count{##3}
+ \out_lline{\string\glyphpcc
+ {\charnamealias{##1}}{\the\a_count}{\the\b_count}}
+ }
+}
+\def\endautoaliasafm{\endgroup}
+\def\generalpltomtx#1#2#3#4{{
+ \let\setsomething_global=\x_relax
+ \let\setfontdimen=\pl_setfontdimen
+ \if _#4_ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \inputetx{#4}
+ \let\CODINGSCHEME=\ignore_parens
+ \fi
+ \pl_to_mtx{#1}{#2}{#3}{\string\generalpltomtx{#1}{#2}{#3}{#4}}
+}}
+\def\pltomtx#1#2{\generalpltomtx{#1}{#2}{pl}{}}
+\def\pl_to_mtx#1#2#3#4{
+ \edef\raw_font_name{#1}
+ \open_out{\temp_prefix#2.mtx}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~#4}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.#3~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \lowercase{
+ \record_transform{#2}{
+ \string\from#3 \x_cs\ifx{from#3}\frompl {#1} \fi
+ }{}\iftrue
+ }
+ \out_line{}
+ \catcode`\(=0 \catcode`\)=9
+ \let\/=\ignore_parens
+ \let\do_pl_glyph=\x_relax
+ \primitiveinput #1.#3\x_relax
+ \do_pl_glyph
+ \out_line{}
+ \ifisint{\percent_char boundarychar}\then
+ \f_count=\int{\percent_char boundarychar}
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setstr{rightboundary}
+ {\csname name-\the\f_count\endcsname}
+ }
+ \out_line{}
+ \fi
+ \fi
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}
+\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \x_relax
+ \expandafter\expandafter\expandafter\gobble_parens
+ \iftrue\expandafter{\else}\fi}
+\def\gobble_parens#1{\egroup}
+\def\pl_real#1{\pl_realer(#1000)}
+\def\pl_realer(#1.#2#3#4#5){#1#2#3#4}
+\def\pl_rounded_real(#1.#2#3#4#5){
+ \global\result=#1#2#3#4\relax
+ \ifnum \first_char#5= >4
+ \global\advance \result
+ \if - \first_char#1= \m@ne \else \@ne \fi
+ \fi
+}
+\def\pl_int#1#2{
+ \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else -1\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+\let\FAMILY=\ignore_parens
+\let\FACE=\ignore_parens
+\let\CHECKSUM=\ignore_parens
+\def\HEADER~#1~#2~#3~#4~{}
+\def\SEVENBITSAFEFLAG~#1~{}
+\let\COMMENT=\ignore_parens
+\let\LIG=\ignore_parens
+\let\NEXTLARGER=\ignore_parens
+\let\VARCHAR=\ignore_parens
+\let\VTITLE=\ignore_parens
+\let\MAPFONT=\ignore_parens
+\let\MAP=\ignore_parens
+\def\CODINGSCHEME{\bgroup\catcode`\)=12\x_relax\CODINGSCHEME_cont}
+\def\CODINGSCHEME_cont#1){
+ \egroup
+ \if_undefined{enc-#1}\then
+ \errhelp{The~encoding~for~`#1'~has~not~been~declared.^^J
+ You~should~declare~it~with~
+ \string\declareencoding{#1}{ETXFILE}.^^J
+ Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J
+ or~X~<RETURN>~to~exit.}
+ \errmessage{Undeclared~encoding~`#1'}
+ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \catcode`\(=12 \catcode`\)=12
+ \x_cs\inputetx{enc-#1}\x_relax
+ \catcode`\(=0 \catcode`\)=9
+ \fi
+}
+\def\DESIGNSIZE~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designsize}{\the\a_dimen}}
+}
+\def\DESIGNUNITS~#1~#2~{
+ \b_dimen=#2pt\x_relax
+ \ifdim 1pt=\b_dimen \else
+ \fontinsterror{PL-to-MTX}{Nondefault~unit~used~in~PL~file}
+ {You~may~continue,~but~the~metrics~for~this~font~will~be~wrong.}
+ \fi
+ \out_line{\string\setdim{designunits}{\the\b_dimen}}
+}
+\def\BOUNDARYCHAR~#1~#2~{
+ \x_setint{\percent_char boundarychar}{\pl_int{#1}{#2}}
+}
+\def\pl_setfontdimen#1#2{\x_cs\def{fdimen-#1}{#2}}
+\def\PARAMETER~#1~#2~R~#3~{
+ \f_count=\pl_int{#1}{#2}\x_relax
+ \if_defined{fdimen-\the\f_count}\then
+ \pl_rounded_real(#3 0000)
+ \out_line{\string\setint{\csname fdimen-\the\f_count\endcsname}
+ {\the\result}}
+ \fi
+}
+\let\FONTDIMEN=\x_relax
+\def\SLANT{\PARAMETER D~1~}
+\pl_setfontdimen{1}{italicslant}
+\def\SPACE{\PARAMETER D~2~}
+\pl_setfontdimen{2}{interword}
+\def\STRETCH{\PARAMETER D~3~}
+\pl_setfontdimen{3}{stretchword}
+\def\SHRINK{\PARAMETER D~4~}
+\pl_setfontdimen{4}{shrinkword}
+\def\XHEIGHT{\PARAMETER D~5~}
+\pl_setfontdimen{5}{xheight}
+\def\QUAD{\PARAMETER D~6~}
+\pl_setfontdimen{6}{quad}
+\def\EXTRASPACE{\PARAMETER D~7~}
+\pl_setfontdimen{7}{extraspace}
+\def\NUM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~8~#2~#3~
+ \or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \fi
+}
+\def\DENOM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \fi
+}
+\def\SUP#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~13~#2~#3~
+ \or
+ \PARAMETER D~14~#2~#3~
+ \or
+ \PARAMETER D~15~#2~#3~
+ \fi
+}
+\def\SUB#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~16~#2~#3~
+ \or
+ \PARAMETER D~17~#2~#3~
+ \fi
+}
+\def\SUPDROP{\PARAMETER D~18~}
+\def\SUBDROP{\PARAMETER D~19~}
+\def\AXISHEIGHT{\PARAMETER D~22~}
+\def\DELIM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~20~#2~#3~
+ \or
+ \PARAMETER D~21~#2~#3~
+ \fi
+}
+\def\DEFAULTRULETHICKNESS{\PARAMETER D~8~}
+\def\BIGOPSPACING#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \or
+ \PARAMETER D~13~#2~#3~
+ \fi
+}
+\def\LABEL~#1{\ifx #1B
+ \expandafter\LABEL_boundarychar
+ \else
+ \expandafter\LABEL_slot \expandafter#1
+ \fi
+}
+\def\LABEL_slot #1~#2~{
+ \f_count=\pl_int{#1}{#2}
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-\the\f_count}
+ }
+}
+\def\LABEL_boundarychar OUNDARYCHAR{
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-BOUNDARYCHAR}
+ }
+}
+\def\do_if_defined#1{\ifx #1\x_relax \else \do{#1} \fi}
+\def\LIGTABLE{\let\do=\never_do\let\a_macro\empty_command}
+\def\STOP{\let\a_macro\empty_command}
+\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}}
+\def\KRN~#1~#2~R~#3~{
+ \pl_rounded_real(#3 0000)
+ \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\the\result}}
+ \a_macro
+ \let\do=\never_do
+}
+\def\write_pl_krn#1#2#3{
+ \f_count=#1\x_relax
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setkern{#3}
+ {\csname name-\the\f_count\endcsname}{#2}
+ }
+ \fi
+}
+\def\CHARWD~R~#1~{\pl_rounded_real(#1 0000) \b_count=\result}
+\def\CHARHT~R~#1~{\pl_rounded_real(#1 0000) \c_count=\result}
+\def\CHARDP~R~#1~{\pl_rounded_real(#1 0000) \d_count=\result}
+\def\CHARIC~R~#1~{\pl_rounded_real(#1 0000) \e_count=\result}
+\def\CHARACTER~#1~#2~{
+ \do_pl_glyph
+ \a_count=\pl_int{#1}{#2}
+ \b_count=0
+ \c_count=0
+ \d_count=0
+ \e_count=0
+ \let\do_pl_glyph=\write_pl_glyph
+}
+\def\write_pl_glyph{
+ \x_cs\ifx{name-\the\a_count}\x_relax\else
+ \out_line{\string\setrawglyph
+ {\csname~name-\the\a_count\endcsname}
+ {\raw_font_name}
+ {\the\a_dimen}
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\the\e_count}}
+ \fi
+ }
+\def\mtxtopl#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{#2.pl}
+ \top_of_pl_hook
+ \out_line{(COMMENT~raw~font~#2~created~by~fontinst~
+ v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.pl)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~
+ a~ligless~TeX~font~with)}
+ \out_line{(COMMENT~pltotf~#2.pl~#2.tfm)}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \out_line{(DESIGNSIZE~R~10.0)}
+ \out_line{}
+ \let\setglyph=\iffalse
+ \let\endsetglyph=\fi
+ \let\setkern=\gobble_three
+ \let\setscaledrawglyph=\first_pl_raw_glyph
+ \def\setscalednotglyph##1##2##3##4##5##6##7##8##9{}
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.pl)}
+ \close_out{Raw~font}
+}}
+\def\first_pl_raw_glyph#1#2#3#4{
+ \out_line{(DESIGNUNITS~R~\make_factor{#4})}
+ \let\setscaledrawglyph=\pl_raw_glyph
+ \pl_raw_glyph{#1}{#2}{#3}{#4}
+}
+\def\pl_raw_glyph#1#2#3#4#5#6#7#8#9{
+ \out_line{(CHARACTER~D~\number#5~\space(COMMENT~#1)}
+ \out_lline{(CHARWD~R~\make_factor{#6})}
+ \out_lline{(CHARHT~R~\make_factor{#7})}
+ \out_lline{(CHARDP~R~\make_factor{#8})}
+ \out_lline{(CHARIC~R~\make_factor{#9})}
+ \out_lline{)}
+}
+\def\transformfont#1#2{{
+ \let\setsomething_global=\x_relax
+ \unsetstr{afm-name}
+ \unsetstr{etx-name}
+ \x_resetint{x-scale}{\one_thousand}
+ \x_resetint{y-scale}{\one_thousand}
+ \x_resetint{slant-scale}{0}
+ #2
+ \ifisstr{afm-name}\then
+ \mtxtomtx{\str{afm-name}}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \fontinsterror{Transformfont}{
+ Failed~to~make~transformed~font~#1;\messagebreak
+ source~font~metrics~file~not~found
+ }\error_help_a
+ \fi
+}}
+\def\fromafm#1{
+ \if_file_exists{#1.afm}\then
+ \x_setstr{afm-name}{#1}
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \fi
+}
+\def\frommtx#1{
+ \if_file_exists{#1.mtx}\then \x_setstr{afm-name}{#1} \fi
+}
+\def\frompl#1{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{}
+ \fi
+}
+\def\fromplgivenetx#1#2{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{#2}
+ \fi
+}
+\def\fromany#1{
+ \x_cs\edef{s-afm-name}{#1}
+ \if_file_exists{#1.mtx}\then\else
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1}{pl}{}
+ \else
+ \if_file_exists{#1.afm}\then
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1}{vpl}{}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi\fi\fi
+}
+\def\scalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{x-scale}{\scale{\d_count}{\int{x-scale}}}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\xscalefont#1#2{
+ \x_resetint{x-scale}{\scale{#1}{\int{x-scale}}}
+ #2
+}
+\def\yscalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\slantfont#1#2{
+ \x_resetint{slant-scale}{
+ \add{\scale{#1}{\int{x-scale}}}{\int{slant-scale}}
+ }
+ #2
+}
+\def\reencodefont#1#2{
+ #2
+ \resetstr{etx-name}{#1}
+}
+\def\mtxtomtx#1#2{{
+ \let\a_macro=\empty_command
+ \_a_true
+ \ifnum \int{x-scale}=\int{y-scale}
+ \ifnum \int{slant-scale}=\z@
+ \_a_false
+ \fi \fi
+ \if_a_
+ \a_count=\int{x-scale}
+ \l_inv_scale\a_count{\int{y-scale}}
+ \b_count=\int{slant-scale}
+ \l_inv_scale\b_count{\int{y-scale}}
+ \edef\a_macro{\a_macro
+ \string\transformfont{\the\a_count}{\the\b_count}
+ }
+ \fi
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \ifisstr{etx-name}\then
+ \def\do_slot{\x_cs\edef{slots-\slot_name}{\the\slot_number}}
+ \def\declarepsencoding##1##2##3{
+ \a_toks={{##1}{##2}{##3}}
+ \out_line{\string\providepsencoding\the\a_toks}
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file
+ {\string\providepsencoding\the\a_toks}
+ \fi
+ }
+ \directfalse
+ \inputetx{\str{etx-name}}
+ \edef\a_macro{\a_macro\string\reencodefont{\str{etx-name}}}
+ \fi
+ \record_transform{#2}{\string\frommtx{#1}}{\a_macro}\iftrue
+ \out_line{}
+ \mtxtomtx_redefinitions
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Transformed~metrics}
+}}
+\def\mtxtomtx_redefinitions{
+ \let\setint=\mtxtomtx_setint
+ \let\setdim=\mtxtomtx_setdim
+ \let\setstr=\mtxtomtx_setstr
+ \let\setscaledrawglyph=\mtxtomtx_setscaledrawglyph
+ \let\setscalednotglyph=\mtxtomtx_setscaledrawglyph
+ \let\setkern=\mtxtomtx_setkern
+ \let\setglyph=\mtxtomtx_setglyph
+ \let\glyphpcc=\mtxtomtx_glyphpcc
+ \let\samesize=\mtxtomtx_samesize
+ \let\endsetglyph=\mtxtomtx_endsetglyph
+ \def\aliased{\string\aliased}
+}
+\let\aliased=\second_of_two
+\def\mtxtomtx_setint#1#2{
+ \def\a_macro{#1}
+ \ifx \a_macro\italicslant_name
+ \eval_expr{#2}
+ \global\multiply \result \int{x-scale}
+ \a_count=\int{slant-scale}
+ \multiply \a_count \one_thousand
+ \advance \a_count \result
+ \divide \a_count \int{y-scale}\x_relax
+ \else
+ \def\do##1{
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \expandafter\if_false \fi
+ }
+ \gobble_one\iftrue \width_ints_list \if_true
+ \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}}
+ \else
+ \eval_expr_to\a_count{\scale{#2}{\int{x-scale}}}
+ \fi
+ \fi
+ \out_line{\string\setint{#1}{\the\a_count}}
+}
+\def\italicslant_name{italicslant}
+\def\width_ints_list{
+ \do{interword}\do{stretchword}\do{shrinkword}\do{quad}
+ \do{extraspace}\do{digitwidth}\do{verticalstem}
+}
+\def\mtxtomtx_setdim#1#2{
+ \out_line{\string\setdim{#1}{#2}}
+}
+\def\mtxtomtx_setstr#1#2{
+ \out_line{\string\setstr{#1}{#2}}
+}
+\def\mtxtomtx_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \eval_expr_to\a_count{\scale{#6}{\int{x-scale}}}
+ \eval_expr_to\b_count{\scale{#7}{\int{y-scale}}}
+ \eval_expr_to\c_count{\scale{#8}{\int{y-scale}}}
+ \eval_expr_to\d_count{#9} \eval_expr{#7}
+ \multiply \d_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \d_count
+ \rounded_thousandths
+ \d_count=\result
+ \eval_expr{\scale{#4}{\int{y-scale}}}
+ \ifisstr{etx-name}\then
+ \bgroup
+ \let\aliased=\first_of_two
+ \if_undefined{slots-#1}\then
+ \egroup \e_count=\m@ne
+ \else
+ \expandafter\egroup \expandafter\e_count
+ \csname slots-#1\endcsname
+ \fi
+ \else
+ \e_count=#5
+ \fi
+ \out_line{
+ \ifnum \e_count>\m@ne
+ \string\setscaledrawglyph
+ \else
+ \string\setscalednotglyph
+ \fi
+ {#1}{\raw_font_name}{#3}{\the\result}{\the\e_count}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+\def\mtxtomtx_setkern#1#2#3{
+ \eval_expr{\scale{\int{x-scale}}{#3}}
+ \out_line{\string\setkern{#1}{#2}{\the\result}}
+}
+\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}}
+\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}}
+\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}}
+\def\mtxtomtx_glyphpcc#1#2#3{
+ \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}}
+ \eval_expr_to\a_count{#2} \eval_expr{#3}
+ \multiply \a_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \a_count
+ \rounded_thousandths
+ \out_lline{\string\glyphpcc{#1}{\the\result}{\the\b_count}}
+}
+\def\reglyphfonts{
+ \begingroup
+ \let\setsomething_global=\x_relax
+ \x_setint{renameweight}{1}
+ \x_setint{killweight}{-10}
+ \setcommand\iftokeep##1\then{\ifnum -1<##1}
+}
+\def\endreglyphfonts{\endgroup}
+\def\offmtxcommand#1{
+ \x_cs\offcommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\def\onmtxcommand#1{
+ \x_cs\oncommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\renameglyph#1#2{
+ \x_cs\edef{slots-#2}{
+ \noexpand\rename_glyph{#1}\noexpand\i-renameweight
+ }
+ }
+\endgroup
+\def\renameglyphweighted#1#2#3{
+ \eval_expr{#3}
+ \x_cs\edef{slots-#2}{\noexpand\rename_glyph{#1}{\the\result}}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\killglyph#1{
+ \x_cs\def{slots-#1}{\kill_glyph\i-killweight}
+ }
+\endgroup
+\def\killglyphweighted#1#2{
+ \eval_expr{#2}
+ \x_cs\edef{slots-#1}{\noexpand\kill_glyph{\the\result}}
+}
+\def\reglyphfont#1#2{
+ \fromany{#2}
+ \ifisstr{afm-name}\then
+ \reglyph_font{#1}{#2}
+ \else
+ \fontinsterror{Reglyph}{Could~not~find~font~metrics~for~#2.}
+ \error_help_a
+ \fi
+}
+\def\reglyph_font#1#2{{
+ \open_out{\temp_prefix#1.mtx}
+ \out_line{\percent_char~Filename:~#1.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\reglyphfont{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \record_transform{#1}{\string\frommtx{#2}}{\string\reglyphfont}
+ \iftrue
+ \out_line{}
+ \reglyph_redefinitions
+ \inputmtx{#2}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Reglyphed~metrics}
+}}
+\def\reglyph_redefinitions{
+ \let\setint=\reglyph_setint
+ \let\setdim=\reglyph_setdim
+ \let\setstr=\reglyph_setstr
+ \let\setscaledrawglyph=\reglyph_setscaledrawglyph
+ \let\setscalednotglyph=\reglyph_setscaledrawglyph
+ \let\setkern=\reglyph_setkern
+ \let\setglyph=\reglyph_setglyph
+ \let\glyphpcc=\reglyph_glyphpcc
+ \let\samesize=\reglyph_samesize
+ \let\endsetglyph=\reglyph_endsetglyph
+}
+\def\reglyph_setint#1#2{\out_line{\string\setint{#1}{#2}}}
+\def\reglyph_setdim#1#2{\out_line{\string\setdim{#1}{#2}}}
+\def\reglyph_setstr#1#2{\out_line{\string\setstr{#1}{#2}}}
+\newcount\command_survivance
+\def\rename_glyph#1{\def\glyphname{#1}\kill_glyph}
+\def\kill_glyph#1{\advance \command_survivance #1\x_relax}
+\def\reglyph_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{
+ \ifnum #5<\z@
+ \string\setscalednotglyph
+ \else
+ \string\setscaledrawglyph
+ \fi
+ {\glyphname}{#2}{#3}{\number#4}{#5}{#6}{#7}{#8}{#9}
+ }
+ \fi
+}
+\def\reglyph_setkern#1#2#3{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \let\a_macro=\glyphname
+ \def\glyphname{#2}
+ \csname slots-#2\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{\string\setkern{\a_macro}{\glyphname}{#3}}
+ \fi
+}
+\def\reglyph_setglyph#1{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_line{\string\setglyph{\glyphname}}}
+ \a_toks=\expandafter{\a_macro}
+}
+\x_cs\def{off-\string\reglyph_setglyph}#1{\gobble_glyph}
+\def\reglyph_glyphpcc#1#2#3{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\glyphpcc{\glyphname}{#2}{#3}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_samesize#1{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\samesize{\glyphname}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_endsetglyph{
+ \iftokeep\command_survivance\then
+ \the\a_toks
+ \out_line{\string\endsetglyph}
+ \fi
+ \a_toks={}
+}
+%%% From file: filtfam.dtx
+\def\latinfamily#1#2{{
+ \edef\a_macro{#1}
+ \expandafter\parse_family\a_macro
+ \empty_command\empty_command\end_parse_family
+ \installfonts
+ \if_file_exists{\raw_encoding.mtx}\then
+ \installfamily{\raw_encoding}{\latex_family}{#2}
+ \fi
+ \installfamily{OT1}{\latex_family}{#2}
+ \installfamily{T1}{\latex_family}{#2}
+ \installfamily{TS1}{\latex_family}{#2}
+ \latin_weights
+ \endinstallfonts
+}}
+\def\parse_family #1#2#3#4#5\end_parse_family{
+ \gdef\font_family{#1#2#3}
+ \gdef\font_variant{#4#5}
+ \gdef\raw_variant{#4#5}
+ \gdef\latex_family{#1#2#3#4#5}
+ \_expert_false
+ \_oldstyle_false
+ \ifx#4x
+ \_expert_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1}
+ \else\ifx#4j
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else\ifx#49
+ \gdef\latex_family{#1#2#3j#5}
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else
+ \_expert_false
+ \_oldstyle_false
+ %\setcommand\digit##1{##1}
+ \fi\fi\fi
+ \if_oldstyle_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(oldstyle)}
+ \else\if_expert_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(expert)}
+ \else
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#4#5>}
+ \fi\fi
+}
+\newif\if_expert_
+\newif\if_oldstyle_
+\def\latin_weight#1#2{
+ \gdef\font_weight{#1}%
+ \gdef\latex_weight{#2}%
+ \latin_widths
+}
+\def\latin_width#1#2{
+ \gdef\font_width{#1}
+ \gdef\latex_width{#2}
+ \latin_shapes
+}
+\def\latin_shape#1#2#3#4#5{
+ \gdef\font_shape{#1}
+ \gdef\raw_shape{#2}
+ \gdef\encoding_shape{#3}
+ \if_oldstyle_
+ \gdef\encoding_shape{#3\oldstyle_shape}
+ \fi
+ \gdef\latex_shape{#4}
+ \gdef\encoding_switches{#5}
+ \immediate\write16{
+ INFO>~to~make~LaTeX~font~shape~<\latex_family,
+ \latex_weight,\latex_shape,\latex_width>~seek~
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx}
+ \csname fake_width_\font_width\endcsname
+ \csname fake_shape_\raw_shape\endcsname
+ \if_file_exists{
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \latin_encodings
+ \fi
+}
+\def\fake_shape_{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_raw_encoding
+ \fi
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.afm
+ }\then
+ \fake_shape_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width>
+ }
+ \transformfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+}
+\def\fake_shape_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width
+ }
+ \fi
+}
+\def\fake_shape_c{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ % If real smallcaps font doesn't exist, fake it from the roman.
+ \gdef\raw_shape{}
+ \if_oldstyle_
+ \gdef\encoding_shape{cj}
+ \else
+ \gdef\encoding_shape{c}
+ \fi
+ \fake_shape_
+ \fi
+}
+\def\fake_shape_o{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ \fake_shape_o_raw_encoding
+ \if_expert_
+ \fake_shape_o_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_o_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_shape_o_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \expert_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\let\fake_shape_i\fake_shape_ % We must do this again!
+\newif\if_fake_narrow_
+\_fake_narrow_false
+\def\fakenarrow#1{
+ \_fake_narrow_true
+ \gdef\fake_narrow_width{#1}
+}
+\def\fake_width_{}
+\def\fake_width_c{}
+\def\fake_width_n{
+ \if_fake_narrow_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then % no action required
+ \else
+ \fake_width_n_raw_encoding
+ \if_expert_
+ \fake_width_n_expert_encoding
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\def\latin_encoding#1#2#3#4#5{
+ \gdef\latex_encoding{#4}
+ \gdef\latex_mtx{#5}
+ \if_oldstyle_
+ \gdef\font_encoding{#3}
+ \else\if_expert_
+ \gdef\font_encoding{#2}
+ \else
+ \gdef\font_encoding{#1}
+ \fi\fi
+ \gdef\expert_font{}
+ \gdef\oldstyle_font{}
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \gdef\expert_font{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width,
+ }
+ \fi
+ \fi
+ \immediate\write16{
+ INFO>~run~\string\installfont\space
+ <\font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx>
+ <\latex_encoding\encoding_shape>
+ <\latex_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installfont{
+ \font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width
+ }{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx
+ }{
+ \latex_encoding\encoding_shape
+ }{
+ \latex_encoding
+ }{
+ \latex_family
+ }{
+ \latex_weight\latex_width
+ }{
+ \latex_shape
+ }{}
+}
+\def\latin_weights{
+ \latin_weight{r}{m}
+ \latin_weight{k}{m}
+ \latin_weight{b}{b}
+ \latin_weight{s}{sb}
+ \latin_weight{d}{db} % was {d}{sb}, SPQR changed
+ \latin_weight{m}{mb} % was {m}{m}, UV changed
+ \latin_weight{c}{eb} % UV added
+ \latin_weight{h}{eb} % UV added
+ \latin_weight{x}{eb}
+ \latin_weight{u}{ub}
+ \latin_weight{l}{l}
+ %\latin_weight{j}{el}
+ %\latin_weight{a}{ul} % UV added
+}
+\def\latin_widths{
+ \latin_width{}{}
+ \latin_width{n}{c}
+ %latin_width{c}{c}
+ %latin_width{x}{x}
+}
+\def\latin_shapes{
+ \latin_shape{} {} {} {n} {\_textcomp_true }
+ \latin_shape{c}{c}{} {sc}{\_textcomp_false}
+ \latin_shape{o}{o}{} {sl}{\_textcomp_true }
+ \latin_shape{i}{i}{i}{it}{\_textcomp_true }
+}
+\def\latin_encodings{
+ \latin_encoding{7t}{9t}{9o}{OT1}{newlatin}
+ \latin_encoding{8t}{9e}{9d}{T1} {newlatin}
+ \encoding_switches
+ \if_textcomp_
+ \latin_encoding{8c}{9c}{9c}{TS1}{textcomp}
+ \fi
+}
+\newif\if_textcomp_
+
+\def\raw_encoding{8r}
+\def\adobe_encoding{8a}
+\def\expert_encoding{8x}
+
+\def\caps_shape{c}
+\def\oldstyle_shape{j}
+\def\SlantAmount{167}
+%%% From file: fimapgen.dtx
+\def\mapfrags_subsystem{Map~fragments~writer}
+\def\recordtransforms#1{\open_pout\transform_record_file{#1}}
+\def\endrecordtransforms{
+ \close_pout\transform_record_file{Font~transformation~records}
+}
+\chardef\transform_record_file=\closed_stream
+\let\storemapdata=\gobble_three
+\def\record_transform#1#2#3#4{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\storemapdata{#1}{#2}{#3}}
+ \fi
+ #4 \out_line{\string\storemapdata{#1}{#2}{#3}} \fi
+}
+\def\record_usage#1{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\makemapentry{#1}}
+ \fi
+}
+\let\declarepsencoding=\gobble_three
+\let\providepsencoding=\gobble_three
+%%% From file: fibasics.dtx
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\x_relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~
+ \fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+\if_file_exists{fontinst.rc}\then
+ \primitiveinput fontinst.rc
+\else
+ \immediate\write16{No~file~fontinst.rc.}
+\fi
+\normalcc
+\endinput
+%%
+%% End of file `cfntinst.sty'.
diff --git a/fonts/utilities/fontinst/inputs/base/finstmsc.sty b/fonts/utilities/fontinst/inputs/base/finstmsc.sty
new file mode 100644
index 0000000000..d2fd613cef
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/finstmsc.sty
@@ -0,0 +1,1470 @@
+%%
+%% This is file `finstmsc.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `pkg')
+%% ficommon.dtx (with options: `pkg')
+%% fimain.dtx (with options: `misc')
+%% ficonv.dtx (with options: `misc')
+%% fimapgen.dtx (with options: `map')
+%% fibasics.dtx (with options: `pkg2,misc')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: fibasics.dtx
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+\def\fontinstversion{1.933}
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+\ProvidesPackage{fontinst}
+[2007/01/23 v\fontinstversion\space
+ fontinst installation package]
+\def\a_macro#1{\catcode\number`#1=\the\catcode`#1 }
+\edef\normalcc{%
+ \a_macro{\ }\a_macro{\^^M}\a_macro{\@}\a_macro{\_}\a_macro{\~}
+}
+\def\fontinstcc{%
+ \catcode`\ =9%
+ \catcode`\^^M=9%
+ \catcode`\@=11%
+ \catcode`\_=11%
+ \catcode`\~=10
+}
+\fontinstcc
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\expandafter\def \csname bye\endcsname
+ {\par\vfill\supereject\@@end}
+\fi
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+\newif\if_a_
+\newwrite\out_file
+\mathchardef\one_thousand=1000
+\mathchardef\five_hundred=500
+\mathchardef\one_hundred=100
+\mathchardef\max_mathchardef="7FFF
+\mathchardef\two_thousand=2000
+\newdimen\half_point \half_point=0.5pt
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\def\swap_two#1#2{#2#1}
+\def\first_of_three#1#2#3{#1}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\#=12
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\hash_char[#]
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+\def\first_char#1#2={#1}
+\def\add_to#1#2{
+ \ifx#1\x_relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+\def\prep_to#1#2{
+ \ifx#1\x_relax
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2#1}
+ \fi
+}
+\def\never_do{\noexpand\do}
+\newif\if_extensions_warning_
+\_extensions_warning_false
+\ifx \eTeXversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\eTeX#1{
+ \if_extensions_warning_
+ \space/\space e-TeX\space version\space #1
+~ \else
+~ \ifdim \number\eTeXversion\eTeXrevision\p@ < #1\p@ \else
+~ \_a_true
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\ifx \pdftexversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\pdfTeX#1#2{%
+ \if_extensions_warning_
+ \space/\space pdfTeX\space version\space
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+ \expandafter\swap_two \expandafter.
+ \fi
+ #1#2%
+~ \else
+~ \ifdim #1>\pdftexversion \else
+~ \ifnum \expandafter\expandafter \expandafter`
+~ \expandafter\first_char \pdftexrevision= <
+~ \expandafter` \first_char#2=
+~ \else \_a_true \fi
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\def\needsTeXextension#1#2{
+ \_a_false
+ #1
+ \if_a_ \else
+ \_extensions_warning_true
+ \edef\a_macro{#1}
+ \_extensions_warning_false
+ \fontinstwarningnoline{#2}{
+ This~file~needs:\messagebreak
+ \expandafter\second_of_two\a_macro
+ \iffalse
+ <no~sufficient~extensions~were~listed!!>\if_false
+ \fi
+ \messagebreak
+ You~are~not~using~any~of~them.~This~is~likely~to~cause~errors
+ }
+ \fi
+}
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \xdef\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\edef\out_lline#1{\noexpand\out_line{\space\space\space#1}}
+\edef\out_llline#1{
+ \noexpand\out_line{\space\space\space\space\space\space#1}
+}
+\def\TeX_terminal{\string\TeX\space terminal}
+\chardef\closed_stream=99
+\x_cs\let{out_filename-99}=\TeX_terminal
+\x_cs\def{out_filename--1}{\jobname.log}
+\def\allocate_stream{
+ \a_count=\m@ne
+ \b_count=\m@ne
+ \loop \ifnum \count17>\a_count
+ \advance \a_count \@ne
+ \x_cs\ifx{out_filename-\the\a_count}\TeX_terminal
+ \b_count=\a_count
+ \a_count=\count17
+ \fi
+ \repeat
+ \ifnum \b_count=\m@ne
+ \global\advance\count17by\@ne
+ \ifnum \count17<\sixt@@n
+ \b_count=\count17
+ \global\x_cs\let{out_filename-\the\b_count}\TeX_terminal
+ \wlog{\string\write\the\b_count\space allocated~to~the~pool.}
+ \else
+ \global\count17=\sixt@@n
+ \fi
+ \fi
+}
+\def\ch@ck#1#2#3{
+ \ifnum \count1#1<#2 \else
+ \errmessage{No~room~for~a~new~#3}
+ \global\count1#1=#2
+ \fi
+}
+\def\open_pout#1#2{
+ \allocate_stream
+ \ifnum \b_count=\m@ne
+ \immediate\write\sixt@@n{fontinst~is~out~of~output~streams.^^J
+ Output~file~#2~cannot~be~opened.^^J
+ Writes~will~be~redirected~to~the~log~file.
+ }
+ \gdef#1{\m@ne}
+ \else
+ \immediate\openout\b_count=#2\x_relax
+ \x_cs\xdef{out_filename-\the\b_count}{#2}
+ \global\chardef#1=\b_count
+ \fi
+}
+\def\close_pout#1#2{
+ \ifnum #1=\closed_stream
+ \errmessage{Output~file~\string#1~(#2)~not~closed,^^J
+ since~it~was~not~open}
+ \else
+ \immediate\write\sixt@@n{#2~written~on~
+ \csname out_filename-\the#1\endcsname.}
+ \ifnum #1=\m@ne \else
+ \immediate\closeout#1
+ \global\x_cs\let{out_filename-\the#1}=\TeX_terminal
+ \fi
+ \global\chardef#1=\closed_stream
+ \fi
+}
+\def\pout_line#1#2{\immediate\write#1{#2}}
+\edef\pout_lline#1#2{\noexpand\pout_line#1{\space\space\space#2}}
+\edef\pout_llline#1#2{
+ \noexpand\pout_line#1{\space\space\space\space\space\space#2}
+}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+\let\then=\iffalse
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+\_a_false\eTeX{2.0}
+\if_a_\else \catcode`\~=14\x_relax \fi
+~ \def\if_defined#1\then{
+~ \if
+~ \ifcsname#1\endcsname
+~ \expandafter\ifx \csname#1\endcsname \x_relax
+~ 0
+~ \else
+~ 1
+~ \fi
+~ \else
+~ 0
+~ \fi
+~ 1
+~ }
+~ \def\if_undefined{\expandafter\unless\if_defined}
+\catcode`\~=\if_a_ 14 \else 10 \fi \x_relax
+~ \def\if_defined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ \expandafter\if_false
+~ \else
+~ \expandafter\if_true
+~ \fi
+~ }
+~ \def\if_undefined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ }
+\catcode`\~=10\x_relax
+\def\gobble_if{\iftrue\else}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+\def\if_equal#1\then{\ifx#1}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\x_relax
+ \ifeof1\x_relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+\let\Else=\else
+\let\Fi=\fi
+\x_cs\ifx{@@input}\x_relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+\def\process_csep_list#1#2,{
+ \ifx\process_csep_list#2
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ #1{#2}
+ \process_csep_list{#1}
+ }
+}
+\def\make_factor#1{
+ \ifnum #1<\z@
+ -\expandafter\make_factor_i\expandafter{\number-#1}
+ \else
+ \expandafter\make_factor_i\expandafter{\number#1}
+ \fi
+}
+\def\make_factor_i#1{
+ \ifnum #1<\one_thousand
+ \make_factor_ii{#1}
+ \else
+ \make_factor_iii #1
+ \fi
+ #1
+}
+\def\make_factor_ii#1{
+ 0.
+ \ifnum #1<\one_hundred
+ 0
+ \ifnum #1<10~ 0\fi
+ \fi
+}
+\def\make_factor_iii#1#2#3\fi#4{
+ \fi
+ #4
+ \ifnum 1#3<\one_thousand
+ .
+ \else
+ \make_factor_iii#2#3
+ \fi
+}
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+\def\format_hex_i#1#2{
+ \if #2i \else
+ \b_count=\a_count
+ \divide \a_count \sixt@@n
+ \c_count=\a_count
+ \multiply \c_count \sixt@@n
+ \advance \b_count -\c_count
+ \edef#1{
+ \ifcase\b_count 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or
+ 9\or a\or b\or c\or d\or e\or f\fi
+ #1
+ }
+ \expandafter\format_hex_i \expandafter#1
+ \fi
+}
+\def\format_hex#1#2#3{
+ \a_count=#2
+ \let#1\empty_command
+ \expandafter\format_hex_i \expandafter#1 \romannumeral
+ \expandafter\identity_one\expandafter{\number#3}001~
+}
+\let\messagebreak\x_relax
+\def\generic_info#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\m@ne{#2\on_line.}
+ \endgroup
+}
+\def\generic_warning#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{^^J#2\on_line.^^J}
+ \endgroup
+}
+\def\generic_error#1#2#3#4{
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \errmessage{#2.^^J^^J#3
+ Type~\space H~<return>~\space for~immediate~help
+ }
+ \endgroup
+}
+\def\fontinsterror#1#2#3{
+ \generic_error{
+ \four_spaces\four_spaces
+ }{
+ #1~error:\messagebreak #2
+ }{
+ }{#3}
+}
+\def\fontinstwarning#1#2{
+ \generic_warning{
+ \four_spaces\four_spaces
+ }{
+ #1~warning:\messagebreak #2
+ }
+}
+\def\fontinstwarningnoline#1#2{
+ \fontinstwarning{#1}{#2\gobble_one}
+}
+\def\fontinstinfo#1#2{
+ \generic_info{
+ \four_spaces\four_spaces
+ }{
+ #1~info:\messagebreak #2
+ }
+}
+\def\on_line{~on~input~line~\the\inputlineno}
+\edef\four_spaces{\space\space\space\space}
+\gdef\error_help_a{
+ Your~command~was~ignored.\messagebreak
+ Type~\space I~<command>~<return>~\space to~replace~it~
+ with~another~command,\messagebreak
+ or~\space <return>~\space to~continue~without~it.}
+\gdef\error_help_c{
+ Try~typing~\space <return>~
+ \space to~proceed.\messagebreak
+ If~that~doesn't~work,~type~\space X~<return>~\space to~quit.}
+\gdef\error_help_d{
+ You're~in~trouble~here.~\space\error_help_c}
+\def\error_help_e#1{You~can~continue,~but~the~#1~wrong.}
+\newlinechar=`\^^J
+\errorcontextlines=999
+\tracinglostchars=1
+%%% From file: ficommon.dtx
+\def\str#1{\csname~s-#1\endcsname}
+\def\strint#1{\expandafter\identity_one\expandafter{\number\int{#1}}}
+\newcount\result
+\def\eval_expr#1{\global\result=#1\x_relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+\def\add#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\advance \result \a_count
+ \egroup
+}
+\def\sub#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \advance \a_count -\result
+ \global\result=\a_count
+ \egroup
+}
+\def\int#1{\csname i-#1 \endcsname}
+\def\neg#1{#1 \global\result=-\result}
+\def\mul#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \egroup
+}
+\def\div#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \divide \a_count \result
+ \global\result=\a_count
+ \egroup
+}
+\def\max#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count>\result \global\result=\a_count \fi
+ \egroup
+}
+\def\min#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count<\result \global\result=\a_count \fi
+ \egroup
+}
+\def\half#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\otherhalf#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \else \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\scale#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \rounded_thousandths
+ \egroup
+}
+\def\rounded_thousandths{
+ \global\divide \result \five_hundred
+ \ifodd \result
+ \global\advance \result by \ifnum 0>\result - \fi 1
+ \fi
+ \global\divide \result \tw@
+}
+\def\l_rounded_thousandths#1{
+ \divide #1 \five_hundred
+ \ifodd #1
+ \advance #1 by \ifnum 0>#1 - \fi\@ne
+ \fi
+ \divide #1 \tw@
+}
+\def\l_inv_scale#1#2{
+ \multiply #1 \two_thousand
+ \divide #1 #2\x_relax
+ \ifodd#1 \advance #1 \ifnum 0>#1 - \fi\@ne \fi
+ \divide #1 \tw@
+}
+\def\ifnumber#1#2#3\then{
+ \eval_expr_to\a_count{#1}
+ \eval_expr{#3}
+ \ifnum \a_count#2\result
+ \expandafter\if_true
+ \else
+ \expandafter\if_false
+ \fi
+}
+\let\setsomething_global=\x_relax
+\def\x_setint#1#2{
+ \x_cs\ifx{i-#1}\x_relax
+ \x_resetint{#1}{#2}
+ \fi
+}
+\let\setint=\x_setint
+\def\x_setstr#1#2{
+ \x_cs\ifx{s-#1}\x_relax
+ \setsomething_global\x_cs\edef{s-#1}{#2}
+ \fi
+}
+\let\setstr=\x_setstr
+\def\setdim#1#2{
+ \x_cs\ifx{d-#1}\x_relax
+ \a_dimen=#2\x_relax
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+ \fi
+}
+\def\setcommand#1{
+ \ifx#1\undefined_command
+ \setsomething_global \expandafter\def \expandafter#1
+ \else
+ \expandafter\def \expandafter\a_macro
+ \fi
+}
+\def\x_resetint#1#2{
+ \eval_expr{#2}
+ \setsomething_global
+ \ifnum\result<\max_mathchardef
+ \ifnum 0>\result
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\let\resetint=\x_resetint
+\def\resetstr#1#2{\setsomething_global\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{
+ \a_dimen=#2
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+}
+\def\resetcommand#1{\setsomething_global\def#1}
+\def\dim#1{\csname~d-#1\endcsname}
+\def\ifisint#1\then{\if_defined i-#1\then}
+\def\ifisstr#1\then{\if_defined s-#1\then}
+\def\ifisdim#1\then{\if_defined d-#1\then}
+\def\ifiscommand#1\then{
+ \ifx#1\undefined_command
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+\def\unsetint#1{\setsomething_global\x_cs\let{i-#1}\x_relax}
+\def\unsetstr#1{\setsomething_global\x_cs\let{s-#1}\x_relax}
+\def\unsetdim#1{\setsomething_global\x_cs\let{d-#1}\x_relax}
+\def\unsetcommand#1{\setsomething_global\let#1=\undefined_command}
+\def\offcommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax
+ \setsomething_global\x_cs\let{saved-\string#1}#1
+ \x_cs\ifx{off-\string#1}\x_relax
+ \generate_off_command{#1}
+ \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname off-\string#1\endcsname
+ \fi
+ \fi
+}
+\def\oncommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname saved-\string#1\endcsname
+ \setsomething_global\x_cs\let{saved-\string#1}\x_relax
+ \fi
+}
+\def\generate_off_command#1{
+ \a_count=0
+ \let\next=\count_hashes
+ \expandafter\next\meaning#1~->\x_relax
+ \b_count=0
+ \a_toks={}
+ \loop \ifnum \b_count<\a_count
+ \advance \b_count 1
+ \a_toks=\expandafter{\the\expandafter\a_toks \expandafter####
+ \the\b_count}
+ \repeat
+ \setsomething_global \expandafter\def \expandafter#1 \the\a_toks {}
+}
+\def\count_hashes#1#2{
+ \if \hash_char#1
+ \advance \a_count 1
+ \else
+ \if -#1
+ \if >#2
+ \let\next=\gobble_to_xrelax
+ \fi\fi
+ \fi
+ \next#2
+}
+\def\gobble_to_xrelax#1\x_relax{}
+\def\for(#1)#2#3#4{
+ \eval_expr_to\a_count{#2}
+ \x_resetint{#1}{\a_count}
+ \eval_expr{#4}
+ \ifnum 0=\result \else
+ \c_count=\result
+ \eval_expr_to\b_count{#3}
+ \setsomething_global\x_cs\edef{for-#1}{
+ \the\c_count \x_relax
+ \noexpand\ifnum \gobble_one\fi
+ \the\b_count \ifnum 0>\c_count > \else < \fi
+ }
+ \def\next##1##2##3\endfor(#1){##2\for_i{##1}{##3}}
+ \next{#1}
+ \fi
+}
+\def\for_i#1#2{
+ \setsomething_global\x_cs\def{body-#1}{#2}
+ \ifnum \b_count \ifnum0>\c_count >\else<\fi \a_count
+ \expandafter\gobble_two
+ \else
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\for_ii#1{
+ \a_count=\int{#1}
+ \advance \a_count \csname for-#1\endcsname \a_count
+ \expandafter\gobble_two
+ \else
+ \x_resetint{#1}\a_count
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\endfor(#1){}
+\def\foreach(#1)#2{
+ \def\next##1\endfor(#1){
+ \setsomething_global\x_cs\def{body-#1}{##1}
+ \process_csep_list{\foreach_i{#1}}#2,\process_csep_list,
+ }
+ \next
+}
+\def\foreach_i#1#2{
+ \resetstr{#1}{#2}
+ \csname body-#1\endcsname
+}
+\let\comment=\gobble_one
+\let\begincomment=\iffalse
+\let\endcomment=\fi
+%%% From file: fimain.dtx
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\let\encoding=\relax
+\outer\def\endencoding{\endinput}
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\x_relax}
+\let\do_slot\empty_command
+\let\end_do_slot\empty_command
+\newcount\slot_number
+\def\nextslot#1{\eval_expr_to\slot_number{#1}}
+\def\skipslots#1{\eval_expr{#1} \advance\slot_number by \result}
+\let\setleftboundary=\gobble_one
+\let\endsetleftboundary=\x_relax
+\def\setrightboundary#1{
+ \makerightboundary{#1}
+ \advance \slot_number 1\x_relax
+}
+\let\ligature=\gobble_three
+\def\Ligature{\ligature}
+\def\oddligature#1#2#3#4{}
+\let\nextlarger=\gobble_one
+\let\usedas=\gobble_two
+\let\makerightboundary=\gobble_one
+\let\Unicode=\gobble_two
+\let\charseq=\gobble_one
+\let\varchar=\empty_command
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\endvarchar=\empty_command
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+\let\setfontdimen\gobble_two
+\let\label=\gobble_one
+\newif\ifdirect \directtrue
+\def\input_mtx_as_etx#1{
+ \def\setscaledrawglyph##1##2##3##4##5##6##7##8##9{
+ \nextslot{##5}
+ \setslot{##1}\endsetslot
+ }
+ \offcommand\setscalednotglyph
+ \let\setglyph=\gobble_glyph
+ \offcommand\setkern
+ \inputmtx{#1}
+}
+\def\inputmtx#1{
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\let\metrics=\x_relax
+\edef\endmetrics_text{\string\endmetrics}
+\outer\def\endmetrics{\endinput}
+\let\setkern=\gobble_three
+\long\def\setglyph#1\endsetglyph{}
+\def\setrawglyph#1#2#3#4#5#6#7#8{}
+\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{}
+\let\setnotglyph=\setrawglyph
+\let\setscalednotglyph=\setscaledrawglyph
+\def\ifisglyph#1\then{\iffalse}
+\let\ifareglyphs=\ifisglyph
+%%% From file: ficonv.dtx
+\newif\ifmissingslots
+\x_cs\def{o-.notdef}#1{\global\missingslotstrue}
+{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \gdef\enctoetx#1#2{{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \def/##1[{
+ \encname_to_etx ##1~{#1}{#2}
+ \a_count=0
+ \global\missingslotsfalse
+ \let/=\encslot_to_etx
+ }
+ \def]~def{}
+ \make_etx{#1}{#2}
+ }}
+}
+\def\encname_to_etx#1~#2#3{
+ \out_line{\percent_char\space REMOVE~THE~FOLLOWING~LINE~IF~
+ THIS~FILE~IS~MODIFIED~OR~RENAMED.}
+ \out_line{\string\declarepsencoding{#3}{#1}{\string\download{#2.enc}}}
+ \out_line{}
+}
+\def\encslot_to_etx#1~{
+ \csname o-#1\endcsname{
+ \ifmissingslots
+ \out_line{\string\nextslot{\the\a_count}}
+ \fi
+ \global\missingslotsfalse
+ \out_line{\string\setslot{#1}}
+ \out_line{\string\endsetslot}
+ \out_line{}
+ }
+ \advance\a_count by 1
+}
+\def\make_etx#1#2{
+ \open_out{\temp_prefix#2.etx}
+ \out_line{\percent_char~Filename:~#2.etx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\enctoetx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.enc~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{}
+ \out_line{\string\documentclass[twocolumn]{article}}
+ \out_line{\string\usepackage{fontdoc}[2005/05/13]}
+ \out_line{}
+ \out_line{\string\begin{document}}
+ \out_line{}
+ \out_line{This~document~describes~the~#1~encoding.}
+ \out_line{It~was~automatically~generated~by~the}
+ \out_line{\string\texttt{fontinst}~package.}
+ \out_line{}
+ \out_line{\string\encoding}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \primitiveinput #1.enc\x_relax
+ \out_line{}
+ \out_line{\string\end encoding}
+ \out_line{}
+ \out_line{\string\end{document}}
+ \close_out{Encoding}
+}
+\def\notdef_name{.notdef}
+\def\etxtoenc#1#2{\begingroup
+ \a_count=\z@
+ \loop
+ \x_cs\let{name-\the\a_count}=\notdef_name
+ \ifnum \@cclv>\a_count
+ \advance \a_count \@ne
+ \repeat
+ \def\do_slot{
+ \x_cs\ifx{name-\the\slot_number}\notdef_name
+ \x_cs\edef{name-\the\slot_number}{\slot_name}
+ \fi
+ }
+ \process_csep_list\inputetx #1,\process_csep_list,
+ \make_enc{#1}{#2}
+\endgroup}
+\def\make_enc#1#2{
+ \setstr{encodingname}{fontinst-autoenc-#1}
+ \def\a_macro##1{
+ \add_to\b_macro{##1.etx}
+ \def\a_macro####1{
+ \add_to\b_macro{,~####1.etx}
+ }
+ }
+ \let\b_macro\empty_command
+ \process_csep_list\a_macro #1,\process_csep_list,
+ \open_out{#2.enc}
+ \out_line{\percent_char !PS-Adobe-3.0~Resource-Encoding}
+ \out_line{\percent_char\space @psencodingfile\left_brace_char}
+ \ref_to_sourcefile{author}\b_macro
+ \ref_to_sourcefile{version}\b_macro
+ \out_line{\percent_char\four_spaces date~=~"generated~
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day",}
+ \out_line{\percent_char\four_spaces filename~=~"\out_filename",}
+ \ref_to_sourcefile{email}\b_macro
+ \ifisstr{address}\then
+ \out_line{\percent_char\four_spaces address~=~\str{address}}
+ \fi
+ \out_line{\percent_char\four_spaces codetable~=~"ISO/ASCII",}
+ \out_line{\percent_char\four_spaces checksum~=~"",}
+ \out_line{\percent_char\four_spaces abstract~=~"
+ This~is~a~postscript~encoding~file,~automatically~
+ generated~by~fontinst~from~\b_macro."}
+ \out_line{\percent_char\space\right_brace_char}
+ \out_line{}
+ \out_line{\percent_char\space Created~by:~tex~\jobname}
+ \out_line{\percent_char\space Created~using:~
+ \string\etxtoenc{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char\space This~file~should~be~installed~
+ somewhere~that~your~DVI}
+ \out_line{\percent_char\space to~postscript~driver~looks~for~files.~
+ It~is~needed~for}
+ \out_line{\percent_char\space reencoding~some~font~you~have~
+ transformed.}
+ \out_line{}
+ \out_line{\percent_char\space After~installing~this~file,~you~
+ should~add~the~following}
+ \out_line{\percent_char\space line~(minus~\percent_char)~
+ to~your~finstmsc.rc~file:}
+ \out_line{\percent_char\space\string\declarepsencoding
+ {#1}{\str{encodingname}}{\string\download{\out_filename}}}
+ \edef\a_macro{
+ \noexpand\declarepsencoding{#1}{\str{encodingname}}
+ {\noexpand\download{\out_filename}}
+ }
+ \a_macro
+ \out_line{}
+ \out_line{\percent_char\percent_char BeginResource:~
+ encoding~\str{encodingname}}
+ \out_line{/\str{encodingname}\space[}
+ \b_count=8
+ \a_count=\z@
+ \loop
+ \ifnum 8=\b_count
+ \b_count=\z@
+ \out_line{\percent_char\space\the\a_count}
+ \fi
+ \out_line{/\csname name-\the\a_count \endcsname}
+ \ifnum \@cclv>\a_count
+ \advance \a_count \@ne
+ \advance \b_count \@ne
+ \repeat
+ \out_line{]~def}
+ \out_line{\percent_char\percent_char EndResource}
+ \out_line{}
+ \out_line{\percent_char\space End~of~file~\out_filename.}
+ \close_out{Encoding~vector}
+}
+\def\ref_to_sourcefile#1#2{
+ \ifisstr{#1}\then
+ \out_line{\percent_char\four_spaces #1~=~\str{#1},}
+ \else
+ \out_line{\percent_char\four_spaces #1~=~"See~file~#2",}
+ \fi
+}
+\def\write_cmap_body#1{
+ \out_line{1~begincodespacerange~<00>~<FF>~endcodespacerange}
+ \let\do_slot=\_a_true
+ \def\Unicode##1##2{\cmap_charseq{\cmap_codepoint{##1}{##2}}}
+ \let\charseq=\cmap_charseq
+ \inputetx{#1}
+}
+\def\cmap_codepoint#1#2{
+ \uppercase{\a_count="#1\x_relax}
+ \ifnum "10000>\a_count
+ \format_hex\b_macro{\a_count}{4}
+ \edef\a_macro{\a_macro \b_macro \space}
+ \else
+ \advance \a_count -"10000
+ \d_count=\a_count
+ \divide \a_count "400
+ \b_count=\a_count
+ \multiply \b_count "400
+ \advance \d_count -\b_count
+ \advance \a_count "D800
+ \advance \d_count "DC00~
+ \format_hex\b_macro{\a_count}{4}
+ \format_hex\c_macro{\d_count}{4}
+ \edef\a_macro{\a_macro \b_macro \c_macro \space}
+ \fi
+}
+\def\cmap_charseq#1{%
+ \if_a_
+ \bgroup
+ \let\Unicode=\cmap_codepoint
+ \let\a_macro=\empty_command
+ #1
+ \format_hex\b_macro{\slot_number}{2}
+ \out_line{1~beginbfchar~<\b_macro>~<~\a_macro>~endbfchar}
+ \egroup
+ \_a_false
+ \fi
+}
+\def\etxtocmap#1#2{\begingroup
+ \inputetx{#1}
+ \open_out{#2.cmap}
+ \out_line{\percent_char !PS-Adobe-3.0~Resource-CMap}
+ \out_line{\percent_char\percent_char
+ DocumentNeededResources:~procset~CIDInit}
+ \out_line{\percent_char\percent_char
+ IncludeResource:~procset~CIDInit}
+ \setstr{cmapname}{fontinst-#2}
+ \out_line{\percent_char\percent_char
+ BeginResource:~CMap~\str{cmapname}}
+ \out_line{/CIDInit~/ProcSet~findresource~begin}
+ \out_line{7~dict~begin}
+ \out_line{begincmap}
+ \out_line{/CMapName~/\str{cmapname}~def}
+ \out_line{/CMapType~2~def}
+ \write_cmap_body{#1}
+ \out_line{endcmap}
+ \out_line{CMapName~currentdict~/CMap~defineresource~pop}
+ \out_line{end}
+ \out_line{end}
+ \out_line{\percent_char\percent_char EndResource}
+ \out_line{\percent_char\percent_char EOF}
+ \close_out{ToUnicode~CMap}
+\endgroup}
+\let\aliased=\second_of_two
+%%% From file: fimapgen.dtx
+\def\mapfrags_subsystem{Map~fragments~writer}
+\newcount\process_generation
+\process_generation=0
+\def\process_generation_succ{1}
+\def\extract_font_generation#1{
+ \if_defined{Tf-#1}\then
+ \expandafter\expandafter \expandafter\first_of_three
+ \csname Tf-#1\endcsname
+ \else
+ \m@ne
+ \fi
+}
+\def\storemapdata#1#2#3{
+ \expandafter\def \expandafter\a_macro
+ \expandafter{ \expandafter{ \the\process_generation}{#2}{#3}}
+ \ifnum \extract_font_generation{#1}<\process_generation \else
+ \x_cs\ifx{Tf-#1}\a_macro
+ \fontinstinfo\mapfrags_subsystem
+ {Repeated~definition~of~font~#1}
+ \else
+ \fontinstwarning\mapfrags_subsystem
+ {Inconsistent~redefinition~of~font~#1}
+ \fi
+ \fi
+ \x_cs\let{Tf-#1}=\a_macro
+}
+\let\transformfont\x_relax
+\let\reencodefont\x_relax
+\let\reglyphfont\x_relax
+\def\makemapentry#1{\begingroup
+ \def\TeX_font_name{#1}
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \if_file_exists{#1.mtx}\then
+ \inputmtx{#1}
+ \fi\fi
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \from_unknown{#1}
+ \x_cs\xdef{Tf-#1}{
+ {\process_generation_succ}{\noexpand\from_unknown{#1}}{}
+ }
+ \else
+ \expandafter\expandafter \expandafter\make_map_entry
+ \csname Tf-#1\endcsname
+ \fi
+ \endgroup
+}
+\def\make_map_entry#1#2#3{
+ \ifnum #1=\process_generation
+ \def\font_transforms{#3}
+ #2
+ \_a_false
+ \let\transformfont\concat_transformfont
+ \let\reencodefont\concat_reencodefont
+ \let\reglyphfont\_a_true
+ \font_transforms
+ \if_a_
+ \fontinsterror\mapfrags_subsystem{
+ \string\makemapentry\space for~reglyphed~font
+ }{ No~entry~for~font~\TeX_font_name\space
+ can~be~written,\messagebreak
+ since~it~had~been~reglyphed!~\error_help_a
+ }
+ \else
+ \entry_makers_list
+ \fi
+ \expandafter\gdef \csname Tf-\TeX_font_name \expandafter\endcsname
+ \expandafter{\expandafter{\process_generation_succ}{#2}{#3}}
+ \fi
+}
+\def\fromafm#1#2{
+ \def\source_font_TeX_name{#1}
+ \def\PS_font_name{#2}
+}
+\def\frompl#1{
+ \def\source_font_TeX_name{#1}
+}
+\def\frommtx#1{%
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \if_file_exists{#1.mtx}\then
+ \inputmtx{#1}
+ \fi\fi
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \from_unknown{#1}
+ \x_cs\xdef{Tf-#1}{
+ {\the\process_generation}{\noexpand\from_unknown{#1}}{}
+ }
+ \else
+ \expandafter\expandafter \expandafter\from_mtx
+ \csname Tf-#1\endcsname
+ \fi
+}
+\def\from_mtx#1#2#3{
+ \edef\font_transforms{#3\font_transforms}
+ #2
+}
+\def\fromvpl{
+ \ifx \empty_command\font_transforms \else
+ \fontinsterror\mapfrags_subsystem{
+ Font~is~virtual,~it~cannot~be~transformed}{
+ No~entry~for~font~\TeX_font_name\space can~be~written.
+ \messagebreak\error_help_a
+ }
+ \fi
+ \let\maker_do\gobble_one
+}
+\def\AssumeMetafont{
+ \def\frompl{
+ \ifx \empty_command\font_transforms \else
+ \fontinsterror\mapfrags_subsystem{
+ A~Metafont~cannot~be~transformed}{
+ No~entry~for~font~\TeX_font_name\space can~be~written.
+ \messagebreak\error_help_a
+ }
+ \fi
+ \let\maker_do\gobble_one
+ }
+}
+\def\from_unknown#1{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ No~map~data~stored~for~font~#1.\messagebreak
+ No~entry~for~\TeX_font_name\space will~be~written,\messagebreak
+ due~to~insufficient~information}
+ \includewarning\warn_unknown_source
+ \let\maker_do\gobble_one
+}
+\let\font_transforms\empty_command
+\newdimen\xscale_factor \newdimen\slant_factor
+\xscale_factor=\p@ \slant_factor=\z@
+\let\reencode_etx\empty_command
+\def\concat_transformfont#1#2{
+ \edef\a_macro{\make_factor{#1}}
+ \xscale_factor=\a_macro\xscale_factor
+ \slant_factor=\a_macro\slant_factor
+ \advance \slant_factor \make_factor{#2}\p@
+}
+\def\concat_reencodefont#1{\def\reencode_etx{#1}}
+\def\adddriver#1#2{
+ \x_cs\ifx{make_#1}\x_relax
+ \fontinsterror\mapfrags_subsystem
+ {There~is~no~entry~maker~for~#1}\error_help_a
+ \else
+ \x_cs\ifx{output_#1}\x_relax \_a_true \else
+ \x_cs\ifx{output_#1}\closed_stream \_a_true \else
+ \_a_false
+ \fi\fi
+ \if_a_
+ \x_cs\open_pout{output_#1}{#2}
+ \expandafter\add_to \expandafter\entry_makers_list
+ \expandafter{ \expandafter\maker_do
+ \csname make_#1\endcsname}
+ \fi
+ \fi
+}
+\let\entry_makers_list\empty_command
+\let\maker_do\x_relax
+\def\donedrivers{
+ \def\maker_do##1{
+ \x_cs\close_pout{output\expandafter\gobble_five\string##1}
+ {Map~file~fragments}
+ }
+ \entry_makers_list
+ \let\maker_do\x_relax
+ \let\entry_makers_list\empty_command
+ \errorstopmode
+ \reportwarnings
+ \advance \process_generation \thr@@
+ \edef\process_generation_succ{\the\process_generation}
+ \advance \process_generation \m@ne
+}
+\def\gobble_five#1#2#3#4#5{}
+\g_let\warnings_list=\empty_command
+\def\warning_do#1#2#3{
+ \noexpand\warning_do \noexpand#2
+ \ifx #1#2
+ \expandafter#3 \expandafter\x_relax
+ \else
+ \expandafter#3 \expandafter#1
+ \fi
+}
+\def\includewarning#1{
+ \xdef\warnings_list{
+ \expandafter\swap_two \expandafter#1 \warnings_list
+ \if_equal\x_relax\then \else
+ \noexpand\warning_do \noexpand#1
+ \fi
+ }
+}
+\def\reportwarnings{
+ \begingroup
+ \let\warning_do=\x_relax
+ \warnings_list
+ \endgroup
+ \g_let\warnings_list=\empty_command
+}
+\def\warn_unknown_source{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Some~font~is~missing~from~the~output~file(s),\messagebreak
+ since~its~source~is~unknown}
+}
+\def\warn_undecided_data{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Check~the~output~file(s)--some~data~could~not~be~determined}
+}
+\def\warn_uncertain_data{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Check~the~output~file(s)--some~data~was~considered~uncertain}
+}
+\def\declarepsencoding#1#2#3{\x_cs\gdef{pse-#1}{{#2}{#3}}}
+\def\providepsencoding#1#2#3{
+ \if_undefined{pse-#1}\then
+ \declarepsencoding{#1}{#2}{#3}
+ \fi
+}
+\let\download=\gobble_one
+\def\fulldownload#1{\download{#1}}
+\def\encodingdownload#1{\download{#1}}
+\declarepsencoding{8r}{TeXBase1Encoding}{\encodingdownload{8r.enc}}
+\declarepsencoding{8a}{StandardEncoding}{}
+\def\specifypsfont#1#2{\x_cs\def{psf-#1}{#2}}
+\def\AssumeLWFN{\let\get_PS_font_file\LWFN_get_PS_font_file}
+\def\unknown_str{?????}
+\edef\clueless_str{\unknown_str ?}
+\let\TeX_font_name\unknown_str
+\let\source_font_TeX_name\unknown_str
+\let\PS_font_name\unknown_str
+\def\get_PS_font_name{\let\PS_font_name\clueless_str}
+\def\AssumeAMSBSYY{\def\get_PS_font_name{
+ \uppercase \expandafter{ \expandafter\def
+ \expandafter\PS_font_name \expandafter{ \source_font_TeX_name}
+ }
+}}
+\def\AssumeBaKoMa{\def\get_PS_font_name{
+ \lowercase \expandafter{ \expandafter\def
+ \expandafter\PS_font_name \expandafter{ \source_font_TeX_name}
+ }
+}}
+\let\PS_font_file\unknown_str
+\resetstr{PSfontsuffix}{.pfa}
+\def\normal_get_PS_font_file{
+ \edef\PS_font_file{\source_font_TeX_name\str{PSfontsuffix}}
+}
+\let\get_PS_font_file=\normal_get_PS_font_file
+\def\LWFN_get_PS_font_file{
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \ifx \PS_font_name\clueless_str
+ \normal_get_PS_font_file
+ \includewarning\warn_uncertain_data
+ \else
+ \begingroup
+ \aftergroup\def \aftergroup\PS_font_file
+ \aftergroup{
+ \a_count=4~
+ \expandafter\expandafter \expandafter\aftergroup
+ \expandafter\swap_two \expandafter\abbreviate_PS_font_name
+ \PS_font_name \x_relax
+ \aftergroup}
+ \endgroup
+ \fi
+}
+\def\abbreviate_PS_font_name#1{
+ \ifx \x_relax#1 \else
+ \ifnum \uccode`#1=`#1
+ \a_count=2
+ \aftergroup#1
+ \else\ifx -#1
+ \a_count=\z@
+ \else\ifnum \a_count>\z@
+ \advance \a_count \m@ne
+ \aftergroup#1
+ \fi\fi\fi
+ \expandafter\abbreviate_PS_font_name
+ \fi
+}
+\def\make_debug{
+ \pout_line\output_debug{Driver~data~for~font~\TeX_font_name:}
+ \pout_lline\output_debug{Source~font~TeX~name:~\source_font_TeX_name}
+ \ifx \reencode_etx\empty_command \else
+ \pout_lline\output_debug{Font~reencoded~using~\reencode_etx.etx.}
+ \fi
+ \ifdim \xscale_factor=\p@ \else
+ \pout_lline\output_debug{Font~x-scaled~by~
+ \expandafter\lose_measure\the\xscale_factor.
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \pout_lline\output_debug{Font~slanted~by~
+ \expandafter\lose_measure\the\slant_factor.
+ }
+ \fi
+ \debug_values_hook
+}
+\def\debug_value#1{
+ \ifx #1\unknown_str
+ \csname get_ \expandafter\gobble_one \string#1 \endcsname
+ \fi
+ \pout_lline\output_debug{\string#1:~#1}
+ \ifx #1\clueless_str \includewarning\warn_undecided_data \fi
+}
+\def\debugvalue#1{
+ \expandafter\add_to \expandafter\debug_values_hook
+ \expandafter{ \expandafter\debug_value \csname#1\endcsname}
+}
+\let\debug_values_hook\empty_command
+\debugvalue{PS_font_name}
+\newtoks\downloads_list
+\def\append_download#1#2{
+ \edef\a_macro{
+ \downloads_list =
+ \noexpand\expandafter{ \noexpand\the \downloads_list
+ \noexpand#1 {#2} }
+ }
+ \a_macro
+}
+\def\make_dvips{
+ \downloads_list={}
+ \let\postscript_code\empty_command
+ \def\download{\append_download\download}
+ \def\fulldownload{\append_download\fulldownload}
+ \def\encodingdownload{\append_download\encodingdownload}
+ \ifx \reencode_etx\empty_command \else
+ \if_undefined{pse-\reencode_etx}\then
+ \etxtoenc{\reencode_etx}{\reencode_etx}
+ \fi
+ \expandafter\expandafter \expandafter\second_of_two
+ \csname pse-\reencode_etx\endcsname
+ \edef\postscript_code{\postscript_code\space
+ \expandafter\expandafter \expandafter\first_of_two
+ \csname pse-\reencode_etx\endcsname
+ \space ReEncodeFont
+ }
+ \fi
+ \ifdim \xscale_factor=\p@ \else
+ \edef\postscript_code{\postscript_code
+ \space\expandafter\lose_measure\the\xscale_factor
+ \space ExtendFont
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \edef\postscript_code{\postscript_code
+ \space\expandafter\lose_measure\the\slant_factor
+ \space SlantFont
+ }
+ \fi
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \ifx \PS_font_name\clueless_str
+ \includewarning\warn_undecided_data
+ \_a_true
+ \else
+ \if_undefined{psf-\PS_font_name}\then
+ \_a_true
+ \else
+ \csname psf-\PS_font_name \endcsname
+ \_a_false
+ \fi\fi
+ \if_a_
+ \ifx \PS_font_file\unknown_str \get_PS_font_file \fi
+ \append_download\download{\PS_font_file}
+ \ifx \PS_font_file\clueless_str
+ \includewarning\warn_undecided_data
+ \fi
+ \fi
+ \def\download##1{~<##1}
+ \def\fulldownload##1{~<<##1}
+ \def\encodingdownload##1{~<[##1}
+ \pout_line\output_dvips{
+ \TeX_font_name\space\PS_font_name
+ \expandafter\empty_command \the\downloads_list
+ \ifx \postscript_code\empty_command \else
+ \space"\postscript_code\space"
+ \fi
+ }
+}
+\def\make_dvipdfm{
+ \def\font_encoding{default}
+ \ifx \reencode_etx\empty_command \else
+ \if_undefined{pse-\reencode_etx}\then
+ \etxtoenc{\reencode_etx}{\reencode_etx}
+ \fi
+ \def\download##1{\def\font_encoding{##1}}
+ \expandafter\expandafter \expandafter\second_of_two
+ \csname pse-\reencode_etx\endcsname
+ \fi
+ \let\options_text\empty_command
+ \ifdim \xscale_factor=\p@ \else
+ \edef\options_text{\options_text\space
+ -e~\expandafter\lose_measure\the\xscale_factor
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \edef\options_text{\options_text\space
+ -s~\expandafter\lose_measure\the\slant_factor
+ }
+ \fi
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \if_or \if_equal\PS_font_name\clueless_str \or_else
+ \if_undefined{psf-\PS_font_name}
+ \then
+ \ifx \PS_font_file\unknown_str \get_PS_font_file \fi
+ \ifx \PS_font_file\clueless_str
+ \includewarning\warn_undecided_data
+ \fi
+ \let\a_macro=\PS_font_file
+ \else
+ \let\a_macro=\PS_font_name
+ \def\download##1{\def\a_macro{##1}}
+ \csname psf-\PS_font_name \endcsname
+ \fi
+ \pout_line\output_dvipdfm{
+ \TeX_font_name\space\font_encoding\space\a_macro
+ \options_text
+ }
+}
+\def\make_pltotf{
+ \pout_line\output_pltotf{pltotf~\TeX_font_name.pl~
+ \ifisstr{TFMfileprefix}\then \str{TFMfileprefix}\fi
+ \TeX_font_name.tfm
+ }
+}
+%%% From file: fibasics.dtx
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\x_relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~
+ \fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+\if_file_exists{finstmsc.rc}\then
+ \primitiveinput finstmsc.rc
+\else
+ \immediate\write16{No~file~finstmsc.rc.}
+\fi
+\normalcc
+\endinput
+%%
+%% End of file `finstmsc.sty'.
diff --git a/fonts/utilities/fontinst/inputs/base/fontinst.ini b/fonts/utilities/fontinst/inputs/base/fontinst.ini
new file mode 100644
index 0000000000..3769e47f6f
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/fontinst.ini
@@ -0,0 +1,97 @@
+%%
+%% This is file `fontinst.ini',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `ini')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: fibasics.dtx
+\chardef\active=13
+
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+\countdef\count@=255
+\dimendef\dimen@=0
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No~room~for~a~new~#3}\fi}
+
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+
+\def\space{~}
+\let\bgroup={
+\let\egroup=}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\supereject{\par\penalty-\@MM}
+\outer\def\bye{\par\vfill\supereject\end}
+\endinput
+%%
+%% End of file `fontinst.ini'.
diff --git a/fonts/utilities/fontinst/inputs/base/fontinst.sty b/fonts/utilities/fontinst/inputs/base/fontinst.sty
new file mode 100644
index 0000000000..c19adcf838
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/fontinst.sty
@@ -0,0 +1,3676 @@
+%%
+%% This is file `fontinst.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `pkg')
+%% ficommon.dtx (with options: `pkg')
+%% fimain.dtx (with options: `pkg')
+%% fitrig.dtx (with options: `pkg')
+%% ficonv.dtx (with options: `pkg')
+%% filtfam.dtx (with options: `pkg,textcomp,debug')
+%% fimapgen.dtx (with options: `pkg')
+%% fibasics.dtx (with options: `pkg2')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: fibasics.dtx
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+\def\fontinstversion{1.933}
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+\ProvidesPackage{fontinst}
+[2007/01/23 v\fontinstversion\space
+ fontinst installation package]
+\def\a_macro#1{\catcode\number`#1=\the\catcode`#1 }
+\edef\normalcc{%
+ \a_macro{\ }\a_macro{\^^M}\a_macro{\@}\a_macro{\_}\a_macro{\~}
+}
+\def\fontinstcc{%
+ \catcode`\ =9%
+ \catcode`\^^M=9%
+ \catcode`\@=11%
+ \catcode`\_=11%
+ \catcode`\~=10
+}
+\fontinstcc
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\expandafter\def \csname bye\endcsname
+ {\par\vfill\supereject\@@end}
+\fi
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+\newif\if_a_
+\newwrite\out_file
+\mathchardef\one_thousand=1000
+\mathchardef\five_hundred=500
+\mathchardef\one_hundred=100
+\mathchardef\max_mathchardef="7FFF
+\mathchardef\two_thousand=2000
+\newdimen\half_point \half_point=0.5pt
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\def\swap_two#1#2{#2#1}
+\def\first_of_three#1#2#3{#1}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\#=12
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\hash_char[#]
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+\def\first_char#1#2={#1}
+\def\add_to#1#2{
+ \ifx#1\x_relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+\def\prep_to#1#2{
+ \ifx#1\x_relax
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2#1}
+ \fi
+}
+\def\never_do{\noexpand\do}
+\newif\if_extensions_warning_
+\_extensions_warning_false
+\ifx \eTeXversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\eTeX#1{
+ \if_extensions_warning_
+ \space/\space e-TeX\space version\space #1
+~ \else
+~ \ifdim \number\eTeXversion\eTeXrevision\p@ < #1\p@ \else
+~ \_a_true
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\ifx \pdftexversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\pdfTeX#1#2{%
+ \if_extensions_warning_
+ \space/\space pdfTeX\space version\space
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+ \expandafter\swap_two \expandafter.
+ \fi
+ #1#2%
+~ \else
+~ \ifdim #1>\pdftexversion \else
+~ \ifnum \expandafter\expandafter \expandafter`
+~ \expandafter\first_char \pdftexrevision= <
+~ \expandafter` \first_char#2=
+~ \else \_a_true \fi
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\def\needsTeXextension#1#2{
+ \_a_false
+ #1
+ \if_a_ \else
+ \_extensions_warning_true
+ \edef\a_macro{#1}
+ \_extensions_warning_false
+ \fontinstwarningnoline{#2}{
+ This~file~needs:\messagebreak
+ \expandafter\second_of_two\a_macro
+ \iffalse
+ <no~sufficient~extensions~were~listed!!>\if_false
+ \fi
+ \messagebreak
+ You~are~not~using~any~of~them.~This~is~likely~to~cause~errors
+ }
+ \fi
+}
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \xdef\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\edef\out_lline#1{\noexpand\out_line{\space\space\space#1}}
+\edef\out_llline#1{
+ \noexpand\out_line{\space\space\space\space\space\space#1}
+}
+\def\TeX_terminal{\string\TeX\space terminal}
+\chardef\closed_stream=99
+\x_cs\let{out_filename-99}=\TeX_terminal
+\x_cs\def{out_filename--1}{\jobname.log}
+\def\allocate_stream{
+ \a_count=\m@ne
+ \b_count=\m@ne
+ \loop \ifnum \count17>\a_count
+ \advance \a_count \@ne
+ \x_cs\ifx{out_filename-\the\a_count}\TeX_terminal
+ \b_count=\a_count
+ \a_count=\count17
+ \fi
+ \repeat
+ \ifnum \b_count=\m@ne
+ \global\advance\count17by\@ne
+ \ifnum \count17<\sixt@@n
+ \b_count=\count17
+ \global\x_cs\let{out_filename-\the\b_count}\TeX_terminal
+ \wlog{\string\write\the\b_count\space allocated~to~the~pool.}
+ \else
+ \global\count17=\sixt@@n
+ \fi
+ \fi
+}
+\def\ch@ck#1#2#3{
+ \ifnum \count1#1<#2 \else
+ \errmessage{No~room~for~a~new~#3}
+ \global\count1#1=#2
+ \fi
+}
+\def\open_pout#1#2{
+ \allocate_stream
+ \ifnum \b_count=\m@ne
+ \immediate\write\sixt@@n{fontinst~is~out~of~output~streams.^^J
+ Output~file~#2~cannot~be~opened.^^J
+ Writes~will~be~redirected~to~the~log~file.
+ }
+ \gdef#1{\m@ne}
+ \else
+ \immediate\openout\b_count=#2\x_relax
+ \x_cs\xdef{out_filename-\the\b_count}{#2}
+ \global\chardef#1=\b_count
+ \fi
+}
+\def\close_pout#1#2{
+ \ifnum #1=\closed_stream
+ \errmessage{Output~file~\string#1~(#2)~not~closed,^^J
+ since~it~was~not~open}
+ \else
+ \immediate\write\sixt@@n{#2~written~on~
+ \csname out_filename-\the#1\endcsname.}
+ \ifnum #1=\m@ne \else
+ \immediate\closeout#1
+ \global\x_cs\let{out_filename-\the#1}=\TeX_terminal
+ \fi
+ \global\chardef#1=\closed_stream
+ \fi
+}
+\def\pout_line#1#2{\immediate\write#1{#2}}
+\edef\pout_lline#1#2{\noexpand\pout_line#1{\space\space\space#2}}
+\edef\pout_llline#1#2{
+ \noexpand\pout_line#1{\space\space\space\space\space\space#2}
+}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+\let\then=\iffalse
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+\_a_false\eTeX{2.0}
+\if_a_\else \catcode`\~=14\x_relax \fi
+~ \def\if_defined#1\then{
+~ \if
+~ \ifcsname#1\endcsname
+~ \expandafter\ifx \csname#1\endcsname \x_relax
+~ 0
+~ \else
+~ 1
+~ \fi
+~ \else
+~ 0
+~ \fi
+~ 1
+~ }
+~ \def\if_undefined{\expandafter\unless\if_defined}
+\catcode`\~=\if_a_ 14 \else 10 \fi \x_relax
+~ \def\if_defined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ \expandafter\if_false
+~ \else
+~ \expandafter\if_true
+~ \fi
+~ }
+~ \def\if_undefined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ }
+\catcode`\~=10\x_relax
+\def\gobble_if{\iftrue\else}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+\def\if_equal#1\then{\ifx#1}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\x_relax
+ \ifeof1\x_relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+\let\Else=\else
+\let\Fi=\fi
+\x_cs\ifx{@@input}\x_relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+\def\process_csep_list#1#2,{
+ \ifx\process_csep_list#2
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ #1{#2}
+ \process_csep_list{#1}
+ }
+}
+\def\make_factor#1{
+ \ifnum #1<\z@
+ -\expandafter\make_factor_i\expandafter{\number-#1}
+ \else
+ \expandafter\make_factor_i\expandafter{\number#1}
+ \fi
+}
+\def\make_factor_i#1{
+ \ifnum #1<\one_thousand
+ \make_factor_ii{#1}
+ \else
+ \make_factor_iii #1
+ \fi
+ #1
+}
+\def\make_factor_ii#1{
+ 0.
+ \ifnum #1<\one_hundred
+ 0
+ \ifnum #1<10~ 0\fi
+ \fi
+}
+\def\make_factor_iii#1#2#3\fi#4{
+ \fi
+ #4
+ \ifnum 1#3<\one_thousand
+ .
+ \else
+ \make_factor_iii#2#3
+ \fi
+}
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+\def\format_hex_i#1#2{
+ \if #2i \else
+ \b_count=\a_count
+ \divide \a_count \sixt@@n
+ \c_count=\a_count
+ \multiply \c_count \sixt@@n
+ \advance \b_count -\c_count
+ \edef#1{
+ \ifcase\b_count 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or
+ 9\or a\or b\or c\or d\or e\or f\fi
+ #1
+ }
+ \expandafter\format_hex_i \expandafter#1
+ \fi
+}
+\def\format_hex#1#2#3{
+ \a_count=#2
+ \let#1\empty_command
+ \expandafter\format_hex_i \expandafter#1 \romannumeral
+ \expandafter\identity_one\expandafter{\number#3}001~
+}
+\let\messagebreak\x_relax
+\def\generic_info#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\m@ne{#2\on_line.}
+ \endgroup
+}
+\def\generic_warning#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{^^J#2\on_line.^^J}
+ \endgroup
+}
+\def\generic_error#1#2#3#4{
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \errmessage{#2.^^J^^J#3
+ Type~\space H~<return>~\space for~immediate~help
+ }
+ \endgroup
+}
+\def\fontinsterror#1#2#3{
+ \generic_error{
+ \four_spaces\four_spaces
+ }{
+ #1~error:\messagebreak #2
+ }{
+ }{#3}
+}
+\def\fontinstwarning#1#2{
+ \generic_warning{
+ \four_spaces\four_spaces
+ }{
+ #1~warning:\messagebreak #2
+ }
+}
+\def\fontinstwarningnoline#1#2{
+ \fontinstwarning{#1}{#2\gobble_one}
+}
+\def\fontinstinfo#1#2{
+ \generic_info{
+ \four_spaces\four_spaces
+ }{
+ #1~info:\messagebreak #2
+ }
+}
+\def\on_line{~on~input~line~\the\inputlineno}
+\edef\four_spaces{\space\space\space\space}
+\gdef\error_help_a{
+ Your~command~was~ignored.\messagebreak
+ Type~\space I~<command>~<return>~\space to~replace~it~
+ with~another~command,\messagebreak
+ or~\space <return>~\space to~continue~without~it.}
+\gdef\error_help_c{
+ Try~typing~\space <return>~
+ \space to~proceed.\messagebreak
+ If~that~doesn't~work,~type~\space X~<return>~\space to~quit.}
+\gdef\error_help_d{
+ You're~in~trouble~here.~\space\error_help_c}
+\def\error_help_e#1{You~can~continue,~but~the~#1~wrong.}
+\newlinechar=`\^^J
+\errorcontextlines=999
+\tracinglostchars=1
+%%% From file: ficommon.dtx
+\def\str#1{\csname~s-#1\endcsname}
+\def\strint#1{\expandafter\identity_one\expandafter{\number\int{#1}}}
+\newcount\result
+\def\eval_expr#1{\global\result=#1\x_relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+\def\add#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\advance \result \a_count
+ \egroup
+}
+\def\sub#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \advance \a_count -\result
+ \global\result=\a_count
+ \egroup
+}
+\def\int#1{\csname i-#1 \endcsname}
+\def\neg#1{#1 \global\result=-\result}
+\def\mul#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \egroup
+}
+\def\div#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \divide \a_count \result
+ \global\result=\a_count
+ \egroup
+}
+\def\max#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count>\result \global\result=\a_count \fi
+ \egroup
+}
+\def\min#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count<\result \global\result=\a_count \fi
+ \egroup
+}
+\def\half#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\otherhalf#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \else \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\scale#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \rounded_thousandths
+ \egroup
+}
+\def\rounded_thousandths{
+ \global\divide \result \five_hundred
+ \ifodd \result
+ \global\advance \result by \ifnum 0>\result - \fi 1
+ \fi
+ \global\divide \result \tw@
+}
+\def\l_rounded_thousandths#1{
+ \divide #1 \five_hundred
+ \ifodd #1
+ \advance #1 by \ifnum 0>#1 - \fi\@ne
+ \fi
+ \divide #1 \tw@
+}
+\def\l_inv_scale#1#2{
+ \multiply #1 \two_thousand
+ \divide #1 #2\x_relax
+ \ifodd#1 \advance #1 \ifnum 0>#1 - \fi\@ne \fi
+ \divide #1 \tw@
+}
+\def\ifnumber#1#2#3\then{
+ \eval_expr_to\a_count{#1}
+ \eval_expr{#3}
+ \ifnum \a_count#2\result
+ \expandafter\if_true
+ \else
+ \expandafter\if_false
+ \fi
+}
+\let\setsomething_global=\x_relax
+\def\x_setint#1#2{
+ \x_cs\ifx{i-#1}\x_relax
+ \x_resetint{#1}{#2}
+ \fi
+}
+\let\setint=\x_setint
+\def\x_setstr#1#2{
+ \x_cs\ifx{s-#1}\x_relax
+ \setsomething_global\x_cs\edef{s-#1}{#2}
+ \fi
+}
+\let\setstr=\x_setstr
+\def\setdim#1#2{
+ \x_cs\ifx{d-#1}\x_relax
+ \a_dimen=#2\x_relax
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+ \fi
+}
+\def\setcommand#1{
+ \ifx#1\undefined_command
+ \setsomething_global \expandafter\def \expandafter#1
+ \else
+ \expandafter\def \expandafter\a_macro
+ \fi
+}
+\def\x_resetint#1#2{
+ \eval_expr{#2}
+ \setsomething_global
+ \ifnum\result<\max_mathchardef
+ \ifnum 0>\result
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\let\resetint=\x_resetint
+\def\resetstr#1#2{\setsomething_global\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{
+ \a_dimen=#2
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+}
+\def\resetcommand#1{\setsomething_global\def#1}
+\def\dim#1{\csname~d-#1\endcsname}
+\def\ifisint#1\then{\if_defined i-#1\then}
+\def\ifisstr#1\then{\if_defined s-#1\then}
+\def\ifisdim#1\then{\if_defined d-#1\then}
+\def\ifiscommand#1\then{
+ \ifx#1\undefined_command
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+\def\unsetint#1{\setsomething_global\x_cs\let{i-#1}\x_relax}
+\def\unsetstr#1{\setsomething_global\x_cs\let{s-#1}\x_relax}
+\def\unsetdim#1{\setsomething_global\x_cs\let{d-#1}\x_relax}
+\def\unsetcommand#1{\setsomething_global\let#1=\undefined_command}
+\def\offcommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax
+ \setsomething_global\x_cs\let{saved-\string#1}#1
+ \x_cs\ifx{off-\string#1}\x_relax
+ \generate_off_command{#1}
+ \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname off-\string#1\endcsname
+ \fi
+ \fi
+}
+\def\oncommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname saved-\string#1\endcsname
+ \setsomething_global\x_cs\let{saved-\string#1}\x_relax
+ \fi
+}
+\def\generate_off_command#1{
+ \a_count=0
+ \let\next=\count_hashes
+ \expandafter\next\meaning#1~->\x_relax
+ \b_count=0
+ \a_toks={}
+ \loop \ifnum \b_count<\a_count
+ \advance \b_count 1
+ \a_toks=\expandafter{\the\expandafter\a_toks \expandafter####
+ \the\b_count}
+ \repeat
+ \setsomething_global \expandafter\def \expandafter#1 \the\a_toks {}
+}
+\def\count_hashes#1#2{
+ \if \hash_char#1
+ \advance \a_count 1
+ \else
+ \if -#1
+ \if >#2
+ \let\next=\gobble_to_xrelax
+ \fi\fi
+ \fi
+ \next#2
+}
+\def\gobble_to_xrelax#1\x_relax{}
+\def\for(#1)#2#3#4{
+ \eval_expr_to\a_count{#2}
+ \x_resetint{#1}{\a_count}
+ \eval_expr{#4}
+ \ifnum 0=\result \else
+ \c_count=\result
+ \eval_expr_to\b_count{#3}
+ \setsomething_global\x_cs\edef{for-#1}{
+ \the\c_count \x_relax
+ \noexpand\ifnum \gobble_one\fi
+ \the\b_count \ifnum 0>\c_count > \else < \fi
+ }
+ \def\next##1##2##3\endfor(#1){##2\for_i{##1}{##3}}
+ \next{#1}
+ \fi
+}
+\def\for_i#1#2{
+ \setsomething_global\x_cs\def{body-#1}{#2}
+ \ifnum \b_count \ifnum0>\c_count >\else<\fi \a_count
+ \expandafter\gobble_two
+ \else
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\for_ii#1{
+ \a_count=\int{#1}
+ \advance \a_count \csname for-#1\endcsname \a_count
+ \expandafter\gobble_two
+ \else
+ \x_resetint{#1}\a_count
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\endfor(#1){}
+\def\foreach(#1)#2{
+ \def\next##1\endfor(#1){
+ \setsomething_global\x_cs\def{body-#1}{##1}
+ \process_csep_list{\foreach_i{#1}}#2,\process_csep_list,
+ }
+ \next
+}
+\def\foreach_i#1#2{
+ \resetstr{#1}{#2}
+ \csname body-#1\endcsname
+}
+\let\comment=\gobble_one
+\let\begincomment=\iffalse
+\let\endcomment=\fi
+%%% From file: fimain.dtx
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\let\encoding=\relax
+\outer\def\endencoding{\endinput}
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\x_relax}
+\let\do_slot\empty_command
+\let\end_do_slot\empty_command
+\newcount\slot_number
+\def\nextslot#1{\eval_expr_to\slot_number{#1}}
+\def\skipslots#1{\eval_expr{#1} \advance\slot_number by \result}
+\def\setleftboundary#1{\edef\slot_name{#1}\do_boundary}
+\let\endsetleftboundary\x_relax
+\let\do_boundary\x_relax
+\def\setrightboundary#1{
+ \makerightboundary{#1}
+ \advance \slot_number 1\x_relax
+}
+\let\ligature=\gobble_three
+\def\Ligature{\ligature}
+\def\oddligature#1#2#3#4{}
+\let\nextlarger=\gobble_one
+\let\usedas=\gobble_two
+\let\makerightboundary=\gobble_one
+\let\Unicode=\gobble_two
+\let\charseq=\gobble_one
+\let\varchar=\empty_command
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\endvarchar=\empty_command
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+\def\setfontdimen#1#2{
+ \ifisint{#2}\then \setint{fontdimen(#1)}{\int{#2}} \fi
+}
+\let\label=\gobble_one
+\newif\ifdirect \directtrue
+\def\input_mtx_as_etx#1{
+ \def\setscaledrawglyph##1##2##3##4##5##6##7##8##9{
+ \nextslot{##5}
+ \setslot{##1}\endsetslot
+ }
+ \offcommand\setscalednotglyph
+ \let\setglyph=\gobble_glyph
+ \offcommand\setkern
+ \inputmtx{#1}
+}
+\def\inputmtx#1{
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\let\metrics=\x_relax
+\edef\endmetrics_text{\string\endmetrics}
+\outer\def\endmetrics{\endinput}
+\def\ProvidesMtxPackage#1{\x_cs\let{pack-#1}P}
+\def\usemtxpackage{\futurelet\next_token\test_UseMtxPkg_arguments}
+\def\test_UseMtxPkg_arguments{\ifx\next_token[
+ \expandafter\mtx_package_given_file
+ \else
+ \expandafter\mtx_package_separate_files
+ \fi
+}
+\def\mtx_package_given_file[#1]#2{
+ \_a_false
+ \process_csep_list\load_true_unless_loaded #2,\process_csep_list,
+ \if_a_ \inputmtx{#1} \fi
+}
+\def\load_true_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else\_a_true\fi
+}
+\def\mtx_package_separate_files#1{
+ \process_csep_list\load_file_unless_loaded #1,\process_csep_list,
+}
+\def\load_file_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else \inputmtx{#1} \fi
+}
+\let\glyph_name_modifier=\identity_one
+\def\setkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {#3}
+ \else
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\set_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\set_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\set_kern_cs#1#2#3{
+ \add_to#2{\k#3#1}
+ \add_to#3{\k#2#1}
+}
+\def\resetkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{#3}
+ \else
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\reset_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\reset_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\reset_kern_cs#1#2#3{
+ \prep_to#2{\k\expandafter#3\expandafter#1}
+ \prep_to#3{\k\expandafter#2\expandafter#1}
+}
+\def\setleftkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+}
+\def\setrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\setleftrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\set_kerning#1#2{
+ \if\b_count=\one_thousand
+ \def\k##1##2{
+ \set_kern_cs##2##1#1
+ }
+ \else
+ \def\k##1##2{
+ \set_kern##1#1{
+ \scale\b_count{\expandafter\gobble_one\string##2}
+ }
+ }
+ \fi
+ #2
+}
+\def\kerning#1#2{0\x_relax
+ \def\k##1{\csname~set-\string##1\endcsname\gobble_one}
+ \bgroup
+ \x_cs\def{set-\string\l-#2}##1##2{
+ \global\result=\expandafter\gobble_one\string##2\egroup
+ }
+ \csname~r-#1\endcsname
+ \csname~set-\string\l-#2\endcsname\gobble_one{00}
+}
+\def\ifiskern#1#2\then{
+ \def\k##1##2{\ifx T##1 \let\k\gobble_two \fi}
+ \bgroup
+ \x_cs\let{l-#2}T
+ \csname r-#1\endcsname
+ \expandafter\egroup \ifx\k\gobble_two
+}
+\def\unsetkerns#1#2{
+ \let\k\k_unless_to_U
+ \process_csep_list\make_slots_U#1,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{l-##1}}
+ \process_csep_list\do#2,\process_csep_list,
+ \process_csep_list\make_slots_relax#1,\process_csep_list,
+ \process_csep_list\make_slots_U#2,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{r-##1}}
+ \process_csep_list\do#1,\process_csep_list,
+ \process_csep_list\make_slots_relax#2,\process_csep_list,
+}
+\def\make_slots_U#1{\x_cs\let{slots-#1}U}
+\def\make_slots_relax#1{\x_cs\let{slots-#1}\x_relax}
+\def\k_unless_to_U#1#2{
+ \x_cs\ifx{slots-\expandafter\gobble_three\string#1}U \else
+ \noexpand\k\noexpand#1\noexpand#2
+ \fi
+}
+\def\main_remove_Us#1{
+ \ifx#1\x_relax \else
+ \edef#1{#1}
+ \ifx#1\empty_command \let#1\x_relax \fi
+ \fi
+}
+\def\noleftkerning#1{\no_kerning{l}{#1}}
+\def\norightkerning#1{\no_kerning{r}{#1}}
+\def\noleftrightkerning#1{\no_kerning{l}{#1}\no_kerning{r}{#1}}
+\def\no_kerning#1#2{
+ \let\k\no_kerning_i
+ \def\do##1{\csname #1-##1\endcsname}
+ \bgroup
+ \aftergroup\def \aftergroup\a_macro \aftergroup{
+ \process_csep_list\do #2,\process_csep_list,
+ \aftergroup}
+ \egroup
+ \def\do##1{\expandafter\let \csname #1-##1\endcsname \x_relax}
+ \process_csep_list\do #2,\process_csep_list,
+ \let\k\no_kerning_ii
+ \def\do##1{\edef##1{##1}}
+ \a_macro
+}
+\def\no_kerning_i#1#2{
+ \ifx #1\x_relax \else
+ \aftergroup\do \aftergroup#1
+ \let #1\x_relax
+ \fi
+}
+\def\no_kerning_ii#1#2{
+ \ifx #1\x_relax \else \noexpand\k \noexpand#1 \noexpand#2 \fi
+}
+\def\width{\glyph_parameter\first_of_six}
+\def\height{\glyph_parameter\second_of_six}
+\def\depth{\glyph_parameter\third_of_six}
+\def\italic{\glyph_parameter\fourth_of_six}
+\def\mapcommands{\glyph_parameter\fifth_of_six}
+\def\mapfonts{\glyph_parameter\sixth_of_six}
+\def\glyph_parameter#1#2{
+ \expandafter\expandafter\expandafter
+ #1\csname g-#2\endcsname
+}
+\def\first_of_six#1#2#3#4#5#6{#1}
+\def\second_of_six#1#2#3#4#5#6{#2}
+\def\third_of_six#1#2#3#4#5#6{#3}
+\def\fourth_of_six#1#2#3#4#5#6{#4}
+\def\fifth_of_six#1#2#3#4#5#6{#5}
+\def\sixth_of_six#1#2#3#4#5#6{#6}
+\def\glyph_metrics#1#2#3#4#5#6{
+ \a_count=#1
+ \b_count=#2
+ \c_count=#3
+ \d_count=#4~
+}
+\let\saved_scale\x_relax
+\let\saved_mapfont\x_relax
+\let\saved_raw\x_relax
+\let\saved_rule\x_relax
+\let\saved_special\x_relax
+\let\saved_warning\x_relax
+\let\saved_movert\x_relax
+\let\saved_moveup\x_relax
+\let\saved_push\x_relax
+\let\saved_pop\x_relax
+\newcount\glyph_width
+\newcount\glyph_height
+\newcount\glyph_depth
+\newcount\glyph_italic
+\newtoks\glyph_map_commands
+\newtoks\glyph_map_fonts
+\newcount\glyph_voffset
+\newcount\glyph_maxhpos
+\def\setglyph#1{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \expandafter\gobble_glyph
+ \else
+ \x_cs\def{g-\glyph_name_modifier{#1}}{
+ {\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}
+ }
+ \resetglyph{\glyph_name_modifier{#1}}
+ \fi
+}
+\long\def\gobble_glyph#1\endsetglyph{}
+\def\resetglyph#1{
+ \edef\glyphname{#1}
+ \glyph_width=0
+ \global\glyph_height=0
+ \global\glyph_depth=0
+ \global\glyph_italic=0
+ \glyph_voffset=0
+ \global\glyph_maxhpos=0
+ \global\glyph_map_commands={}
+ \global\glyph_map_fonts={}
+}
+\def\endsetglyph{
+ \x_cs\edef{g-\glyphname}
+ {{\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}}
+}
+\let\endresetglyph=\endsetglyph
+\def\setrawglyph#1#2#3{
+ \setscaledrawglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \eval_expr{#4}
+ \ifnum \result=\one_thousand
+ \let\a_macro\identity_one
+ \else
+ \edef\a_macro##1{\saved_scale{\the\result}{##1}}
+ \fi
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro##1{\saved_scale{\the\e_count}{\a_macro{##1}}}
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\a_macro{\saved_raw{#2}{#5}{#1}}}
+ {\a_macro{\saved_mapfont{#2}{#3}}}
+ }
+ \fi
+}
+\def\setnotglyph#1#2#3{
+ \setscalednotglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscalednotglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}-not}\then
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}-not}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {}{}
+ }
+ \fi
+}
+\def\unsetglyph#1{\x_cs\let{g-#1}\x_relax}
+\def\glyph#1#2{
+ \glyph_parameter\glyph_metrics{#1}
+ \eval_expr_to\e_count{#2}
+ \ifnum \e_count=\one_thousand
+ \edef\a_macro{\mapcommands{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\mapfonts{#1}}
+ \else
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapcommands{#1}}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapfonts{#1}}}
+ \fi
+ \advance \glyph_width \a_count
+ \advance \b_count \glyph_voffset
+ \ifnum \glyph_height<\b_count \global\glyph_height=\b_count \fi
+ \advance \c_count -\glyph_voffset
+ \ifnum \glyph_depth<\c_count \global\glyph_depth=\c_count \fi
+ \global\glyph_italic=\d_count
+ \global\glyph_map_fonts\expandafter{
+ \the\expandafter\glyph_map_fonts \a_macro
+ }
+}
+\def\glyphrule#1#2{
+ \eval_expr_to\b_count{#1} \eval_expr_to\c_count{#2}
+ \advance\glyph_width by \b_count
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth{-\glyph_voffset}}
+ \g_eval_expr_to\glyph_height{
+ \max\glyph_height{\add\glyph_voffset\c_count}
+ }
+ \global\glyph_italic=0
+ \edef\a_macro{\saved_rule{\the\b_count}{\the\c_count}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphspecial#1{
+ \edef\a_macro{\saved_special{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphwarning#1{
+ \edef\a_macro{\saved_warning{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\movert#1{
+ \eval_expr{#1}
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \ifnum 0=\result \else
+ \advance\glyph_width by \result
+ \edef\a_macro{\saved_movert{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\moveup#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_voffset by \result
+ \edef\a_macro{\saved_moveup{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\push{
+ \bgroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_push
+ }
+}
+\def\pop{
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \egroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_pop
+ }
+}
+\def\resetwidth#1{\movert{\sub{#1}\glyph_width}}
+\def\resetheight{\g_eval_expr_to\glyph_height}
+\def\resetdepth{\g_eval_expr_to\glyph_depth}
+\def\resetitalic{\g_eval_expr_to\glyph_italic}
+\def\glyphpcc#1#2#3{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{\glyph_name_modifier{#1}}{\one_thousand}
+ \pop
+ \else\ifisglyph{\glyph_name_modifier{#1}-not}\then
+ \fontinstwarning{\string\glyphpcc}{
+ Base~glyph~`\glyph_name_modifier{#1}'~not~appended,\messagebreak
+ because~it~is~so~far~unencoded~in~the~glyph~base
+ }
+ \else
+ \fontinsterror{\string\glyphpcc}{
+ Base~glyph~not~set.\messagebreak
+ This~could~be~a~sign~that~the~AFM~file~is~buggy
+ }\error_help_a
+ \fi\fi
+}
+\def\glyphbboxright{\max\glyph_width\glyph_maxhpos}
+\def\samesize#1{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \resetwidth{\glyphbboxright}
+ \else
+ \expandafter\expandafter\expandafter
+ \same_size\csname g-\glyph_name_modifier{#1}\endcsname
+ \fi
+}
+\def\same_size#1#2#3#4#5#6{
+ \movert{\sub{#1}\glyph_width}
+ \global\glyph_height=#2
+ \global\glyph_depth=#3
+ \global\glyph_italic=#4
+}
+\def\ifisglyph#1\then{\if_defined{g-#1}\then}
+\def\ifareglyphs#1\then{
+ \process_csep_list{\if_is_glyph}#1,\process_csep_list,
+ \if_true
+}
+\def\if_is_glyph#1{
+ \if_undefined{g-#1}\then \expandafter\if_false \fi
+}
+\def\etxtovpl#1#2{{
+ \def\vpl_extension{vpl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{virtual~font}
+ \def\vpl_Font{Virtual~font}
+ \def\vpl_call{\string\etxtovpl{#1}{#2}}
+ \def\vpl_to_vf##1{vptovf~##1.vpl~##1.vf~##1.tfm}
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\def\etxtopl#1#2{{
+ \def\vpl_extension{pl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{font}
+ \def\vpl_Font{Font}
+ \def\vpl_call{\string\etxtopl{#1}{#2}}
+ \def\vpl_to_vf##1{pltotf~##1.pl~##1.tfm}
+ \_including_map_false
+ \global\rawfont_scaling=-\p@
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\newif\if_including_map_
+\_including_map_true
+\def\make_inputetx#1{
+ \def\a_macro{\noexpand\inputetx{\file_name}}
+ \get_file_name #1~{}~\par
+ \edef\a_macro{\a_macro}
+ \a_toks=\expandafter{ \the\expandafter\a_toks \a_macro}
+}
+\x_cs\def{IFKW-mtxasetx}{
+ \def\a_macro{\noexpand\input_mtx_as_etx{\file_name}}
+ \get_keyword
+}
+\def\etx_to_font#1#2{
+ \make_assignments{#1}
+ \open_out{#2.\vpl_extension}
+ \top_of_pl_hook
+ \out_line{(\vpl_title\space\vpl_font\space
+ #2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.\vpl_extension)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\vpl_call)}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~\vpl_font\space
+ with)}
+ \out_line{(COMMENT~\vpl_to_vf{#2})}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \make_header{#1}
+ \if_including_map_ \make_mapfonts{#1} \fi
+ \make_fontdimens{#1}
+ \make_ligtable{#1}
+ \make_characters{#1}
+ \make_tidy{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.\vpl_extension)}
+ \close_out{\vpl_Font}
+}
+\let\pre_first_etx_pass_hook\x_relax
+\let\pre_second_etx_pass_hook\x_relax
+\let\pre_third_etx_pass_hook\x_relax
+\let\pre_fourth_etx_pass_hook\x_relax
+\let\post_first_etx_pass_hook\x_relax
+\let\post_second_etx_pass_hook\x_relax
+\let\post_third_etx_pass_hook\x_relax
+\let\post_fourth_etx_pass_hook\x_relax
+\let\tidying_up_hook\x_relax
+\let\top_of_pl_hook\x_relax
+\def\make_assignments#1{
+ \let\do_slot=\assign_slot
+ \let\end_do_slot=\end_assign_slot
+ \def\do_boundary{\bgroup
+ \let\makerightboundary=\bad_makerightboundary
+ }
+ \let\endsetleftboundary=\egroup
+ \let\makerightboundary=\assign_rboundary
+ \pre_first_etx_pass_hook
+ #1
+ \post_first_etx_pass_hook
+ \let\end_do_slot=\empty_command
+ \let\do_boundary=\x_relax
+ \let\endsetleftboundary=\x_relax
+ \let\makerightboundary=\gobble_one
+}
+\def\assign_slot{\a_toks={\do}}
+\begingroup
+ \catcode0=12
+ \gdef\end_assign_slot{
+ \ifisglyph\slot_name\then
+ \lccode0=\slot_number
+ \lowercase{
+ \expandafter\add_to
+ \csname slots-\slot_name\expandafter\endcsname
+ \expandafter{\the\a_toks^^@}
+ }
+ \fi
+ }
+ \gdef\assign_rboundary#1{
+ \lccode0=\slot_number
+ \lowercase{\x_cs\add_to{slots-#1}{\rboundary_do^^@}}
+ \x_setint{\percent_char boundarychar}\slot_number
+ \a_toks={\rbserver_do}
+ }
+\endgroup
+\def\bad_makerightboundary#1{
+ \errhelp={The~left~boundary~is~not~a~slot,~so~it~cannot~serve~
+ as~right~boundary.}
+ \errmessage{Incorrect~use~of~\string\makerightboundary}
+}
+\def\get_slot_num#1{
+ \global\result=-1
+ \bgroup
+ \def\do{\global\result=`}
+ \let\rbserver_do=\do
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \egroup
+}
+\def\ifisinslot#1#2\then{
+ \ifx \makerightboundary\gobble_one
+ \eval_expr{#2}
+ \begingroup
+ \def\do##1{\ifnum `##1=\result \let\do=\gobble_one \fi}
+ \def\rbserver_do{\do}
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \expandafter\endgroup
+ \ifx \do\gobble_one
+ \expandafter\expandafter \expandafter\if_true
+ \else
+ \expandafter\expandafter \expandafter\if_false
+ \fi
+ \else
+ \expandafter\gobble_if
+ \fi
+}
+\newdimen\mapfont_scaling
+\mapfont_scaling=1pt
+\newdimen\rawfont_scaling
+\def\vpl_real#1{R~\expandafter\lose_measure\the#1}
+\def\vpl_int#1{D~\the#1}
+\newdimen\side_bearings
+\newdimen\curr_bearings
+\def\make_header#1{
+ \global\font_count=0
+ \setdim{designsize}{10pt}
+ \a_dimen=\dim{designsize}
+ \out_line{(DESIGNSIZE~\vpl_real\a_dimen)}
+ \x_setstr{codingscheme}{UNKNOWN}
+ \out_line{(CODINGSCHEME~\str{codingscheme})}
+ \ifisint{\percent_char boundarychar}\then
+ \a_count=\int{\percent_char boundarychar}
+ \out_line{(BOUNDARYCHAR~\vpl_int\a_count)}
+ \fi
+ \x_setint{letterspacing}{0}
+ \side_bearings=\make_factor{\int{letterspacing}}\half_point
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{}
+}
+\def\make_mapfonts#1{
+ \let\saved_scale\vpl_scale
+ \let\saved_mapfont\vpl_mapfont
+ \let\do_slot=\do_mapfont
+ \pre_second_etx_pass_hook
+ #1
+ \post_second_etx_pass_hook
+ \out_line{}
+}
+\def\do_mapfont{
+ \ifisglyph\slot_name\then
+ \mapfonts\slot_name
+ \fi
+}
+\def\vpl_scale#1#2{{
+ \mapfont_scaling=\make_factor{#1}\mapfont_scaling
+ #2
+}}
+\def\vpl_mapfont#1#2{
+ \a_dimen=#2
+ \if_undefined{\the\mapfont_scaling-#1}\then
+ \global\x_cs\mathchardef{\the\mapfont_scaling-#1}=\font_count
+ \x_cs\xdef{f-\the\font_count}{\the\mapfont_scaling-#1}
+ \out_line{(MAPFONT~\vpl_int\font_count\space
+ (FONTNAME~#1)~
+ (FONTDSIZE~\vpl_real\a_dimen)~
+ (FONTAT~\vpl_real\mapfont_scaling))}
+ \record_usage{#1}
+ \global\advance\font_count by 1
+ \fi
+}
+\def\pl_mapfont#1#2{\global\rawfont_scaling=\mapfont_scaling}
+\newcount\font_count
+\newcount\next_mapfont
+\newcount\prev_mapfont
+\def\make_fontdimens#1{
+ \out_line{(FONTDIMEN}
+ \a_count=1
+ \loop\ifnum 256>\a_count
+ \ifisint{fontdimen(\the\a_count)}\then
+ \out_lline{(PARAMETER~\vpl_int\a_count\space
+ R~\make_factor{\int{fontdimen(\the\a_count)}})}
+ \fi
+ \advance \a_count \@ne
+ \repeat
+ \out_lline{)}
+ \out_line{}
+}
+\def\make_ligtable#1{
+ \begingroup
+ \out_line{(LIGTABLE}
+ \let\do_slot=\bgroup
+ \let\end_do_slot=\vpl_kerning
+ \def\do_boundary{\bgroup \let\vpl_liglabel=\boundary_liglabel}
+ \let\endsetleftboundary=\vpl_kerning
+ \let\ligature=\vpl_ligature
+ \let\k=\vpl_kern
+ \let\rbserver_do=\vpl_rbserver_do
+ \let\rboundary_do=\vpl_rboundary_do
+ \pre_third_etx_pass_hook
+ #1
+ \post_third_etx_pass_hook
+ \out_lline{)}
+ \endgroup
+ \out_line{}
+}
+\def\vpl_rbserver_do#1{
+ \do{#1}
+ \let\rboundary_do=\wrn_rboundary_do
+}
+\def\vpl_rboundary_do#1{
+ \do{#1}
+ \let\rbserver_do=\wrn_rboundary_do
+}
+\def\wrn_rboundary_do#1{
+ \do{#1}
+ \immediate\write16{Boundarychar~slot~usage~collision~in~
+ `\slot_name'~ligkern~program.}
+}
+\def\vpl_ligature#1#2#3{
+ \get_slot_num{#3}
+ \ifnum -1=\result
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \else
+ \x_cs\ifx{slots-#2}\x_relax
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#2'.}
+ \else
+ \def\do##1{
+ \vpl_liglabel
+ \out_lline{(#1~D~\number`##1~\space\vpl_int\result)~
+ (COMMENT~#2~#3)}
+ }
+ \csname slots-#2\endcsname
+ \fi
+ \fi
+}
+\def\vpl_kerning{
+ \let\do=\vpl_kern_do
+ \csname~r-\slot_name\endcsname
+ \vpl_ligstop
+ \egroup
+}
+\def\vpl_kern#1#2{
+ \edef\a_macro{\expandafter\gobble_three\string#1}
+ \a_count=\expandafter\gobble_one\string#2\x_relax
+ \ifnum \ifnum -\a_count>\a_count - \fi\a_count>\minimum_kern
+ \edef\b_macro{~R~\make_factor\a_count}
+ \csname slots-\a_macro\endcsname
+ \fi
+ \x_cs\let{slots-\a_macro}=\x_relax
+}
+\def\vpl_kern_do#1{
+ \vpl_liglabel
+ \out_lline{
+ (KRN~D~\number`#1~\b_macro)~
+ (COMMENT~\a_macro)
+ }
+}
+\def\out_liglabel{
+ \out_lline{(LABEL~\vpl_int\slot_number)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\def\boundary_liglabel{
+ \out_lline{(LABEL~BOUNDARYCHAR)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\let\vpl_liglabel=\out_liglabel
+\def\out_ligstop{\out_lline{(STOP)}
+ \let\vpl_liglabel=\out_liglabel
+ \let\vpl_ligstop=\x_relax}
+\let\vpl_ligstop=\x_relax
+\def\make_characters#1{
+ \bgroup
+ \let\do_slot=\do_character
+ \let\end_do_slot=\end_do_character
+ \let\nextlarger=\vpl_nextlarger
+ \let\varchar=\vpl_varchar
+ \let\endvarchar=\end_vpl_varchar
+ \let\vartop=\vpl_vartop
+ \let\varmid=\vpl_varmid
+ \let\varbot=\vpl_varbot
+ \let\varrep=\vpl_varrep
+ \if_including_map_
+ \let\saved_raw\vpl_raw
+ \let\saved_rule\vpl_rule
+ \let\saved_special\vpl_special
+ \let\saved_warning\vpl_warning
+ \let\saved_movert\vpl_movert
+ \let\saved_moveup\vpl_moveup
+ \let\saved_push\vpl_push
+ \let\saved_pop\vpl_pop
+ \else
+ \def\do_character_map{
+ \ifdim \rawfont_scaling=-\p@
+ \mapfonts\slot_name
+ \else
+ \let\do_character_map=\x_relax
+ \fi
+ }
+ \let\saved_mapfont\pl_mapfont
+ \let\saved_scale\vpl_scale
+ \fi
+ \pre_fourth_etx_pass_hook
+ #1
+ \post_fourth_etx_pass_hook
+ \egroup
+}
+\def\do_character{
+ \if_undefined{g-\slot_name}\then
+ \ifisint{requireglyphs}\then
+ \fontinstwarning{ETX~to~(V)PL}{
+ Undefined~glyph~`\slot_name'~requested\message_break
+ for~slot~\the\slot_number\message_number}
+ \fi
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \glyph_parameter\glyph_metrics\slot_name
+ \a_dimen=\make_factor\a_count \p@
+ \do_character_sidebearings
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \ifnum \z@=\b_count \else
+ \out_lline{(CHARHT~R~\make_factor\b_count)}
+ \fi
+ \ifnum \z@=\c_count \else
+ \out_lline{(CHARDP~R~\make_factor\c_count)}
+ \fi
+ \ifnum \z@=\d_count \else
+ \out_lline{(CHARIC~R~\make_factor\d_count)}
+ \fi
+ \do_character_map
+ \fi
+ \fi
+}
+\def\do_character_sidebearings{
+ \ifisint{\slot_name-spacing}\then
+ \curr_bearings=\make_factor{\int{\slot_name-spacing}}\half_point
+ \else
+ \curr_bearings=\side_bearings
+ \fi
+ \advance\a_dimen by 2\curr_bearings
+}
+\def\do_character_map{
+ \global\prev_mapfont=0
+ \out_lline{(MAP}
+ \ifdim 0pt=\curr_bearings
+ \mapcommands\slot_name
+ \else
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \mapcommands\slot_name
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \fi
+ \out_llline{)}
+}
+\long\def\gobble_setslot#1\endsetslot{\endsetslot}
+\def\end_do_character{
+ \ifisglyph\slot_name\then
+ \out_lline{)}
+ \fi
+}
+\def\notdef_name{.notdef}
+\def\vpl_nextlarger#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_lline{(NEXTLARGER~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\nextlarger\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varchar{\out_lline{(VARCHAR}}
+\def\end_vpl_varchar{\out_llline{)}}
+\def\vpl_vartop#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(TOP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\vartop\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varmid#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(MID~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varmid\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varbot#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(BOT~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varbot\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varrep#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(REP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varrep\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_raw#1#2#3{
+ \global\next_mapfont=\csname\the\mapfont_scaling-#1\endcsname
+ \ifnum \next_mapfont=\prev_mapfont \else
+ \out_llline{(SELECTFONT~\vpl_int\next_mapfont)~
+ (COMMENT~#1~at~
+ \expandafter\lose_measure \the\mapfont_scaling)}
+ \fi
+ \out_llline{(SETCHAR~D~#2)~(COMMENT~#3)}
+ \global\prev_mapfont=\next_mapfont
+}
+\def\vpl_rule#1#2{
+ \a_dimen=\make_factor{#2}\mapfont_scaling
+ \b_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(SETRULE~\vpl_real\a_dimen\space\vpl_real\b_dimen)}
+}
+\def\vpl_special#1{
+ \out_llline{(SPECIAL~#1)}}
+\def\vpl_warning#1{
+ \ifwarningspecials
+ \out_llline{(SPECIAL~Warning:~#1)}
+ \fi
+ \immediate\write16{Warning:~#1.}
+}
+\newif\ifwarningspecials
+\warningspecialstrue
+\def\vpl_movert#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVERIGHT~\vpl_real\a_dimen)}
+}
+\def\vpl_moveup#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVEUP~\vpl_real\a_dimen)}
+}
+\def\vpl_push{\out_llline{(PUSH)}}
+\def\vpl_pop{\out_llline{(POP)}}
+\def\make_tidy#1{
+ \tidying_up_hook
+ \if_including_map_
+ \a_count=0
+ \loop\ifnum \a_count<\font_count
+ \edef\a_macro{\csname~f-\the\a_count\endcsname}
+ \global\x_cs\let\a_macro\x_relax
+ \advance\a_count by 1
+ \repeat
+ \global\font_count=0
+ \else
+ \ifdim \rawfont_scaling<\z@
+ \fontinstwarning{ETX~to~(V)PL}{The~font~
+ \out_filename\space doesn't~contain~any~characters}
+ \global\rawfont_scaling=\p@
+ \fi
+ \ifdim \rawfont_scaling=\p@ \else
+ \out_line{(DESIGNUNITS~\vpl_real\rawfont_scaling)}
+ \fi
+ \fi
+}
+\newtoks\family_toks
+\def\installfonts{
+ \bgroup
+ \global\family_toks={}
+ \gdef\prev_file_list{}
+ \global\let\setsomething_global=\global
+}
+\def\installfamily#1#2#3{
+ \global\family_toks=
+ \expandafter{\the\family_toks\fd_family{#1}{#2}{#3}}
+ \global\x_cs\let{#1-#2}\empty_command
+}
+\def\installfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \input_metrics{}{#2}
+ \etxtovpl{#3}{#1}
+ \installfontas{#1}{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installrawfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \xdef\out_filename{#1}
+ \input_metrics{\let\storemapdata=\installraw_storemap}{#2}
+ \let\storemapdata=\gobble_three
+ \etxtopl{#3}{#1}
+ \record_usage{#1}
+ \installfontas{
+ \ifdim \rawfont_scaling=\p@ \else
+ [\expandafter\lose_measure\the\rawfont_scaling]~
+ \fi #1
+ }{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installraw_storemap#1#2#3{
+ \def\a_macro{#1}
+ \ifx \a_macro\out_filename \else
+ \record_transform{\out_filename}{\string\frommtx{#1}}{}\if_false
+ \fi
+}
+\def\input_metrics#1#2{
+ \let\metrics=\file_list_metrics
+ \xdef\curr_file_list{#2,}
+ \let\metrics=\x_relax
+ \ifx\prev_file_list\curr_file_list\else
+ \egroup\bgroup
+ #1
+ \expandafter\process_csep_list \expandafter\input_mtx_file
+ \curr_file_list\process_csep_list,
+ \global\let\prev_file_list=\curr_file_list
+ \fi
+}
+\def\file_list_metrics#1,{
+ \iffalse{\fi}
+ \a_toks=\expandafter{\curr_file_list\x_relax#1,}
+ \xdef\curr_file_list{\the\a_toks \iffalse}\fi
+}
+\def\installfontas#1#2#3#4#5#6{
+ \if_undefined{#2-#3-#4-#5}\then
+ \let\do_shape=\x_relax
+ \if_undefined{#2-#3}\then
+ \x_cs\let{#2-#3}\empty_command
+ \autoinstallfamily{#2}{#3}
+ \fi
+ \x_cs\xdef{#2-#3}{
+ \csname#2-#3\endcsname
+ \do_shape{#2}{#3}{#4}{#5}
+ }
+ \fi
+ \let\do_size=\x_relax
+ \x_cs\xdef{#2-#3-#4-#5}{
+ \if_defined{#2-#3-#4-#5}\then
+ \csname#2-#3-#4-#5\endcsname
+ \fi
+ \do_size{#6}{#1}
+ }
+}
+\def\autoinstallfamily#1#2{\installfamily{#1}{#2}{}}
+\def\endinstallfonts{
+ \global\let\setsomething_global=\x_relax
+ \let\do_shape=\fd_shape
+ \let\do_size=\fd_size
+ \the\family_toks
+ \global\family_toks{}
+ \egroup
+}
+\def\input_mtx_file#1{
+ \reset_modifiers_hook
+ \ifx\x_relax#1\x_relax
+ \else
+ \identity_one{\get_file_name #1~}~\par
+ \ifx \pl_encoding\empty_command
+ \fromany\file_name
+ \else
+ \metrics_given_encoding{\file_name}{\pl_encoding}
+ \fi
+ \ifisstr{afm-name}\then
+ \inputmtx{\str{afm-name}}
+ \else
+ \fontinsterror{\string\install...}{
+ Font/MTX~file~\file_name\space not~found
+ }{
+ You~can~insert~an~\string\inputmtx\space command~here
+ \messagebreak to~input~some~other~MTX~file~instead.
+ \ifisint{rawscale}\then \messagebreak
+ The~requested~raw~scaling~will~then~be~applied~on~that.
+ \fi
+ }
+ \fi
+ \fi
+}
+\def\metrics_given_encoding#1#2{
+ \x_cs\edef{s-afm-name}{#1-#2}
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1-#2}{pl}{#2}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1-#2}{vpl}{#2}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi
+}
+\def\reset_modifiers_hook{
+ \unsetint{rawscale}
+ \let\glyph_name_modifier\identity_one
+ \let\pl_encoding\empty_command
+ \let\list_of_options\empty_command
+}
+\def\get_file_name #1~{
+ \edef\file_name{#1}
+ \get_keyword
+}
+\def\get_keyword #1~{
+ \if_defined{IFKW-#1}\then
+ \csname IFKW-#1 \expandafter\endcsname
+ \else
+ \fontinsterror{\string\install...}{
+ `#1'~is~not~a~defined~keyword
+ }{
+ \error_help_a\messagebreak
+ Extra~tokens~will~be~flushed.
+ }
+ \expandafter\gobble_keywords
+ \fi
+}
+\def\gobble_keywords#1\par{}
+\x_cs\let{IFKW-}=\gobble_keywords
+\x_cs\def{IFKW-scaled}#1~{
+ \ifnum #1=\one_thousand
+ \unsetint{rawscale}
+ \else
+ \x_resetint{rawscale}{#1}
+ \fi
+ \get_keyword
+}
+\x_cs\def{IFKW-suffix}#1~{
+ \def\glyph_name_modifier##1{##1#1}
+ \get_keyword
+}
+\x_cs\def{IFKW-encoding}#1~{
+ \def\pl_encoding{#1}
+ \get_keyword
+}
+\let\pl_encoding=\empty_command
+\x_cs\def{IFKW-option}#1~{
+ \add_to\list_of_options{\do{#1}}
+}
+\def\ifoption#1\then{
+ \_a_false
+ \edef\a_macro{#1}
+ \def\do##1{
+ \if_a_ \else
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \_a_true \fi
+ \fi
+ }
+ \list_of_options
+ \if_a_
+}
+\let\list_of_options\empty_command
+\def\fd_family#1#2#3{
+ \a_toks{#3}
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1#2.fd}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~Filename:~\lowercase_file}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using~fontinst~v\fontinstversion}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~SHOULD~BE~PUT~IN~A~TEX~INPUTS~
+ DIRECTORY}
+ \out_line{}
+ \out_line{\string\ProvidesFile{\lowercase_file}}
+ \out_lline{[
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day\space
+ Fontinst~v\fontinstversion\space
+ font~definitions~for~#1/#2.
+ ]}
+ \out_line{}
+ \out_line{\string\DeclareFontFamily{#1}{#2}{\the\a_toks}}
+ {
+ \csname #1-#2\endcsname
+ \out_line{}
+ \let\do_shape=\substitute_shape
+ \csname #1-#2\endcsname
+ \let\do_shape=\remove_shape
+ \csname #1-#2\endcsname
+ }
+ \x_cs\g_let{#1-#2}\x_relax
+ \out_line{}
+ \out_line{\string\endinput}
+ \close_out{Font~definitions}
+}
+\def\fd_shape#1#2#3#4{
+ \out_line{}
+ \out_line{\string\DeclareFontShape{#1}{#2}{#3}{#4}\left_brace_char}
+ \csname #1-#2-#3-#4\endcsname
+ \x_cs\g_let{#1-#2-#3-#4}\empty_command
+ \out_line{\right_brace_char{}}
+}
+\def\fd_size#1#2{
+ \x_cs\ifx{siz-#1}\x_relax
+ \out_lline{#1~#2}
+ \else
+ \out_lline{\csname siz-#1\endcsname\space #2}
+ \fi
+}
+\def\remove_shape#1#2#3#4{
+ \x_cs\g_let{#1-#2-#3-#4}\x_relax
+}
+\def\substitute_shape#1#2#3#4{
+ \edef\orig_shape{#4}
+ \substitute_series{#1}{#2}{#3}{\orig_shape}
+ \x_cs\ifx{sub-\orig_shape}\x_relax\else
+ \edef\subst_shape{\csname sub-\orig_shape\endcsname}
+ \x_cs\ifx{#1-#2-#3-\subst_shape}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{#3}{\subst_shape}{
+ <->\csname typ-\orig_shape\endcsname\space
+ *~#2/#3/\orig_shape
+ }{}
+ }
+ \x_cs\let{#1-#2-#3-\subst_shape}\empty_command
+ \substitute_shape{#1}{#2}{#3}{\subst_shape}
+ \fi
+ \fi
+}
+\def\substitute_series#1#2#3#4{
+ \edef\orig_series{#3}
+ \x_cs\ifx{sub-\orig_series}\x_relax\else
+ \edef\subst_series{\csname sub-\orig_series\endcsname}
+ \x_cs\ifx{#1-#2-\subst_series-#4}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{\subst_series}{#4}{
+ <->\csname typ-\orig_series\endcsname\space
+ *~#2/\orig_series/#4
+ }{}
+ }
+ \x_cs\let{#1-#2-\subst_series-#4}\empty_command
+ \substitute_series{#1}{#2}{\subst_series}{#4}
+ \fi
+ \fi
+}
+\def\substitute_generic#1#2#3{
+ \edef\a_macro{#2}
+ \edef\b_macro{#3}
+ \ifx \a_macro \b_macro
+ \x_cs\let{sub-#3}\undefined_command
+ \else
+ \x_cs\let{sub-#3}\a_macro
+ \x_cs\def{typ-#3}{#1}
+ \fi
+}
+\def\substitutesilent{\substitute_generic{ssub}}
+\def\substitutenoisy{\substitute_generic{sub}}
+\substitutesilent{bx}{b}
+\substitutesilent{b}{bx}
+\substitutesilent{b}{sb}
+\substitutesilent{b}{db}
+\substitutesilent{m}{mb}
+\substitutesilent{m}{l}
+\substitutenoisy{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{it}{sl}
+\def\declareencoding#1#2{\x_cs\edef{enc-#1}{#2}}
+\declareencoding{TEX~TEXT}{ot1}
+\declareencoding{TEX~TEXT~WITHOUT~F-LIGATURES}{ot1}
+\declareencoding{TEX~TYPEWRITER~TEXT}{ot1tt}
+\declareencoding{TEX~MATH~ITALIC}{oml}
+\declareencoding{TEX~MATH~SYMBOLS}{oms}
+\declareencoding{TEX~MATH~EXTENSION}{omx}
+\declareencoding{LATEX~SYMBOLS}{lasy}
+\declareencoding{TEX~TEXT~SUBSET}{eufrak}
+\declareencoding{TEX~MATH~ITALIC~SUBSET}{eurm}
+\declareencoding{TEX~MATH~SYMBOLS~SUBSET}{euscr}
+\declareencoding{EULER~SUBSTITUTIONS~ONLY}{euex}
+\declareencoding{EXTENDED~TEX~FONT~ENCODING~-~LATIN}{t1}
+\declareencoding{TEX~TEXT~COMPANION~SYMBOLS~1---TS1}{ts1}
+\declareencoding{TEXBASE1ENCODING}{8r}
+\declareencoding{TEX~TYPEWRITER~AND~WINDOWS~ANSI}{8y}
+\def\declaresize#1#2{\x_cs\edef{siz-#1}{#2}}
+\declaresize{}{<->}
+\declaresize{5}{<5>}
+\declaresize{6}{<6>}
+\declaresize{7}{<7>}
+\declaresize{8}{<8>}
+\declaresize{9}{<9>}
+\declaresize{10}{<10>}
+\declaresize{11}{<10.95>}
+\declaresize{12}{<12>}
+\declaresize{14}{<14.4>}
+\declaresize{17}{<17.28>}
+\declaresize{20}{<20.74>}
+\declaresize{25}{<24.88>}
+\def\NOFILES{
+ \def\transformfont##1##2{
+ \touch_file{##1.mtx}
+ \touch_file{##1.pl}
+ }
+ \def\reglyphfont##1##2{\touch_file{##1.mtx}}
+ \def\installfonts{}
+ \def\endinstallfonts{}
+ \def\installfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.vpl}
+ }
+ \def\installrawfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.pl}
+ }
+ \def\installfamily##1##2##3{\touch_file{##1##2.fd}}
+}
+\def\touch_file#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~TEST~FILE.}
+ \out_line{\percent_char~Created~whilst~debugging~fontinst.}
+ \close_out{Test~file}
+}
+%%% From file: fitrig.dtx
+\chardef\nin@ty=90
+\chardef\@clxxx=180
+\chardef\@lxxi=71
+\mathchardef\@mmmmlxviii=4068
+\chardef\@coeffz=72
+\chardef\@coefb=42
+\mathchardef\@coefc=840
+\mathchardef\@coefd=5040
+\def\TG@rem@pt#1{\expandafter\lose_measure\the#1\space}
+\def\TG@term#1{
+ \dimen@\@tempb\dimen@
+ \advance\dimen@ #1\p@
+}
+\def\TG@series{
+ \dimen@\@lxxi\dimen@
+ \divide \dimen@ \@mmmmlxviii
+ \edef\@tempa{\TG@rem@pt\dimen@}
+ \dimen@\@tempa\dimen@
+ \edef\@tempb{\TG@rem@pt\dimen@}
+ \divide\dimen@\@coeffz
+ \advance\dimen@\m@ne\p@
+ \TG@term\@coefb
+ \TG@term{-\@coefc}%
+ \TG@term\@coefd
+ \dimen@\@tempa\dimen@
+ \divide\dimen@ \@coefd
+}
+\def\CalculateSin#1{{%
+ \if_undefined{sin(\number#1)}\then
+ \dimen@=#1\p@
+ \TG@@sin
+ \x_cs\xdef{sin(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\CalculateCos#1{{%
+ \if_undefined{cos(\number#1)}\then
+ \dimen@=\nin@ty\p@
+ \advance \dimen@ -#1\p@
+ \TG@@sin
+ \x_cs\xdef{cos(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\TG@@sin{%
+ \ifdim\TG@reduce>+%
+ \else\ifdim\TG@reduce<-%
+ \else\TG@series\fi\fi
+}
+\def\TG@reduce#1#2{
+ \dimen@#1#2\nin@ty\p@
+ \advance\dimen@#2-\@clxxx\p@
+ \dimen@-\dimen@
+ \TG@@sin
+}
+\def\UseSin#1{\csname sin(\number#1)\endcsname}
+\def\UseCos#1{\csname cos(\number#1)\endcsname}
+\chardef\z@num\z@
+\x_cs\let{sin(0)} \z@num
+\x_cs\let{cos(0)} \@ne
+\x_cs\let{sin(90)} \@ne
+\x_cs\let{cos(90)} \z@num
+\x_cs\let{sin(-90)}\m@ne
+\x_cs\let{cos(-90)}\z@num
+\x_cs\let{sin(180)}\z@num
+\x_cs\let{cos(180)}\m@ne
+\def\CalculateTan#1{{%
+ \if_undefined{tan(\number#1)}\then
+ \CalculateSin{#1}%
+ \CalculateCos{#1}%
+ \a_dimen\UseCos{#1}\p@
+ \divide \a_dimen \@iv
+ \b_dimen\UseSin{#1}\p@
+ \b_dimen\two@fourteen\b_dimen
+ \divide\b_dimen\a_dimen
+ \x_cs\xdef{tan(\number#1)}{\TG@rem@pt\b_dimen}
+ \fi
+}}
+\def\UseTan#1{\csname tan(\number#1)\endcsname}
+\mathchardef\two@fourteen=16384
+\chardef\@iv=4
+\x_cs\def{tan(90)}{\errmessage{Infinite tan !}}
+\expandafter\let
+ \csname tan(-90)\expandafter\endcsname \csname tan(90)\endcsname
+%%% From file: ficonv.dtx
+\def\afmtomtx#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \edef\source_font_name{#1}
+ \x_resetint{italicslant}{0}
+ \let\italcorr_expression=\uprightitalcorr
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.afm~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\^^M=12
+ \catcode`\ =10
+ \expandafter\afm_line\primitiveinput #1.afm\x_relax
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}}
+\newcount\minimum_kern
+\def\afm_length#1#2{
+ \a_dimen=#2\afm_unit_dimen
+ #1=\a_dimen
+ \divide #1 by \afm_unit_dimen
+ \advance \a_dimen by -#1\afm_unit_dimen
+ \ifdim \a_dimen>0.5\afm_unit_dimen
+ \advance #1 by 1
+ \else \ifdim \a_dimen<-0.5\afm_unit_dimen
+ \advance #1 by -1
+ \fi\fi
+ \x_relax
+}
+\newdimen\afm_unit_dimen
+\afm_unit_dimen=1000sp
+{\catcode`\^^M=12 \gdef\afm_line#1
+{\afm_command#1~\end_of_line\afm_line}}
+\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line}
+\def\gobble_one_line#1\end_of_line{}
+\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput}
+\def\afm_def#1(#2)#3{
+ \x_cs\def{afm-#1}\gobble_one_line#2\end_of_line{#3}
+}
+\def\afm_let#1#2{
+ \expandafter\let \csname afm-#1\expandafter\endcsname
+ \csname afm-#2\endcsname
+}
+\afm_def{CharWidth}(#1){\afm_length\char_x_width{#1}}
+\afm_def{ItalicAngle}(#1~){\calculate_it_slant{#1}}
+\afm_def{XHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{xheight}{\the\a_count}}}
+\afm_def{CapHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{capheight}{\the\a_count}}}
+\afm_def{Ascender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{ascender}{\the\a_count}}}
+\afm_def{Descender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{descender_neg}{\the\a_count}}}
+\afm_def{UnderlineThickness}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{underlinethickness}{\the\a_count}}}
+\afm_def{FontBBox}(#1~#2~#3~#4){
+ \afm_length\a_count{#4}
+ \out_line{\string\setint{maxheight}{\the\a_count}}
+ \afm_length\a_count{#2}
+ \out_line{\string\setint{maxdepth_neg}{\the\a_count}}}
+\afm_def{StdVW}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{verticalstem}{\the\a_count}}}
+\afm_def{IsFixedPitch}(#1){
+ \if\first_char#1=f
+ \else\out_line{\string\setint{monowidth}{1}}
+ \fi
+}
+\afm_def{FontName}(#1~){
+ \record_transform{\raw_font_name}
+ {\string\fromafm{\source_font_name}{#1}}{}\iftrue
+}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \afm_length\a_count{#3}
+ \ifnum \a_count>\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \else\ifnum \a_count<-\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \fi\fi
+ \fi\fi
+}
+\afm_let{KPX}{KP}
+\def\afm_write_setkern#1#2#3{\out_line{\string\setkern{#1}{#2}{#3}}}
+\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+\afm_def{CH}(<#1>~;#2){\uppercase{\init_afm{"#1}}\do_list[#2]\afm_char}
+\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char}
+\newcount\char_slot
+\newcount\char_x_width
+\newcount\x_width
+\newcount\bbox_llx
+\newcount\bbox_lly
+\newcount\bbox_urx
+\newcount\bbox_ury
+\let\char_name=\empty_command
+\def\init_afm#1{
+ \char_slot=#1\x_relax
+ \x_width=\char_x_width
+ \bbox_llx=0
+ \bbox_lly=0
+ \bbox_urx=0
+ \bbox_ury=0
+ \let\char_name=\empty_command
+}
+\def\afm_char{
+ \eval_expr{
+ \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury
+ }
+ \out_line{
+ \ifnum -1<\char_slot
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\number -\bbox_lly}
+ {\the\result}
+ }
+}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{#1}}
+ \def\char_name{#1}
+}
+\def\cc_char{%
+ \out_lline{\string\samesize{\char_name-not}}
+ \out_line{\string\endsetglyph}
+}
+\def\uprightitalcorr#1#2#3#4#5{0}
+\def\slanteditalcorr#1#2#3#4#5{\max{\sub{#3}{#1}}{0}}
+\def\calculate_it_slant#1{
+ \edef\theangle{#1}
+ \CalculateTan{\theangle}
+ \a_dimen=-\one_thousand sp
+ \a_dimen=\UseTan{\theangle}\a_dimen
+ \a_count=\a_dimen
+ \out_line{\string\setint{italicslant}{\the\a_count}}
+ \x_resetint{italicslant}{\a_count}
+ \ifnum 0<\a_count
+ \let\italcorr_expression=\slanteditalcorr
+ \else
+ \let\italcorr_expression=\uprightitalcorr
+ \fi
+}
+\def\do_list[~#1~#2;~#3]{
+ \csname~list-#1\endcsname\gobble_one_semi#2;
+ \ifx\x_relax#3\x_relax\expandafter\gobble_one
+ \else\expandafter\identity_one\fi
+ {\do_list[~#3]}
+}
+\def\gobble_one_semi#1;{}
+\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}}
+\list_def{W}(#1~#2){\afm_length\x_width{#1}}
+\list_def{WX}(#1){\afm_length\x_width{#1}}
+\list_def{WY}(#1){}
+\list_def{N}(#1){\def\char_name{#1}}
+\list_def{B}(#1~#2~#3~#4){
+ \afm_length\bbox_llx{#1}
+ \afm_length\bbox_lly{#2}
+ \afm_length\bbox_urx{#3}
+ \afm_length\bbox_ury{#4}
+}
+\list_def{PCC}(#1~#2~#3){
+ \afm_length\a_count{#2}
+ \afm_length\b_count{#3}
+ \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}}
+}
+\def\definealias#1#2#3{
+ \expandafter\def \csname GN-#1 \expandafter\endcsname
+ \expandafter{ \csname g-#2 \expandafter\endcsname
+ \csname i-#3\endcsname}
+}
+\def\glyph_alias#1{
+ \expandafter\expandafter \expandafter\glyph_alias_i
+ \csname GN-#1\endcsname
+}
+\def\glyph_alias_i#1#2{
+ \expandafter\gobble_three \string#1
+}
+\let\charnameprefix\empty
+\def\charnamealias#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \glyph_alias{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \glyph_alias{#1}
+ \else
+ #1
+ \fi\fi
+}
+\def\alias_incr#1{
+ \expandafter\expandafter \expandafter\alias_incr_i
+ \csname GN-#1\endcsname
+}
+\def\alias_incr_i#1#2{
+ \ifx#2\x_relax
+ \mathchardef#2=\@ne
+ \else
+ \a_count=#2
+ \advance\a_count\@ne
+ \mathchardef#2=\a_count
+ \fi
+}
+\def\alias_char_name#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{\charnameprefix#1}}
+ }
+ \alias_incr{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{#1}}
+ }
+ \alias_incr{#1}
+ \else
+ \edef\char_name{#1}
+ \fi\fi
+}
+\def\autoaliasafm{
+ \begingroup
+ \list_def{N}(##1){\alias_char_name{##1}}
+ \def\afm_write_setkern##1##2##3{
+ \out_line{
+ \string\setkern{\charnamealias{##1}}{\charnamealias{##2}}{##3}
+ }
+ }
+ \def\init_cc##1{%
+ \edef\char_name{\charnamealias{##1}}
+ \out_line{\string\setglyph{\char_name}}
+ }
+ \list_def{PCC}(##1~##2~##3){
+ \afm_length\a_count{##2}
+ \afm_length\b_count{##3}
+ \out_lline{\string\glyphpcc
+ {\charnamealias{##1}}{\the\a_count}{\the\b_count}}
+ }
+}
+\def\endautoaliasafm{\endgroup}
+\def\generalpltomtx#1#2#3#4{{
+ \let\setsomething_global=\x_relax
+ \let\setfontdimen=\pl_setfontdimen
+ \if _#4_ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \inputetx{#4}
+ \let\CODINGSCHEME=\ignore_parens
+ \fi
+ \pl_to_mtx{#1}{#2}{#3}{\string\generalpltomtx{#1}{#2}{#3}{#4}}
+}}
+\def\pltomtx#1#2{\generalpltomtx{#1}{#2}{pl}{}}
+\def\pl_to_mtx#1#2#3#4{
+ \edef\raw_font_name{#1}
+ \open_out{\temp_prefix#2.mtx}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~#4}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.#3~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \lowercase{
+ \record_transform{#2}{
+ \string\from#3 \x_cs\ifx{from#3}\frompl {#1} \fi
+ }{}\iftrue
+ }
+ \out_line{}
+ \catcode`\(=0 \catcode`\)=9
+ \let\/=\ignore_parens
+ \let\do_pl_glyph=\x_relax
+ \primitiveinput #1.#3\x_relax
+ \do_pl_glyph
+ \out_line{}
+ \ifisint{\percent_char boundarychar}\then
+ \f_count=\int{\percent_char boundarychar}
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setstr{rightboundary}
+ {\csname name-\the\f_count\endcsname}
+ }
+ \out_line{}
+ \fi
+ \fi
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}
+\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \x_relax
+ \expandafter\expandafter\expandafter\gobble_parens
+ \iftrue\expandafter{\else}\fi}
+\def\gobble_parens#1{\egroup}
+\def\pl_real#1{\pl_realer(#1000)}
+\def\pl_realer(#1.#2#3#4#5){#1#2#3#4}
+\def\pl_rounded_real(#1.#2#3#4#5){
+ \global\result=#1#2#3#4\relax
+ \ifnum \first_char#5= >4
+ \global\advance \result
+ \if - \first_char#1= \m@ne \else \@ne \fi
+ \fi
+}
+\def\pl_int#1#2{
+ \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else -1\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+\let\FAMILY=\ignore_parens
+\let\FACE=\ignore_parens
+\let\CHECKSUM=\ignore_parens
+\def\HEADER~#1~#2~#3~#4~{}
+\def\SEVENBITSAFEFLAG~#1~{}
+\let\COMMENT=\ignore_parens
+\let\LIG=\ignore_parens
+\let\NEXTLARGER=\ignore_parens
+\let\VARCHAR=\ignore_parens
+\let\VTITLE=\ignore_parens
+\let\MAPFONT=\ignore_parens
+\let\MAP=\ignore_parens
+\def\CODINGSCHEME{\bgroup\catcode`\)=12\x_relax\CODINGSCHEME_cont}
+\def\CODINGSCHEME_cont#1){
+ \egroup
+ \if_undefined{enc-#1}\then
+ \errhelp{The~encoding~for~`#1'~has~not~been~declared.^^J
+ You~should~declare~it~with~
+ \string\declareencoding{#1}{ETXFILE}.^^J
+ Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J
+ or~X~<RETURN>~to~exit.}
+ \errmessage{Undeclared~encoding~`#1'}
+ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \catcode`\(=12 \catcode`\)=12
+ \x_cs\inputetx{enc-#1}\x_relax
+ \catcode`\(=0 \catcode`\)=9
+ \fi
+}
+\def\DESIGNSIZE~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designsize}{\the\a_dimen}}
+}
+\def\DESIGNUNITS~#1~#2~{
+ \b_dimen=#2pt\x_relax
+ \ifdim 1pt=\b_dimen \else
+ \fontinsterror{PL-to-MTX}{Nondefault~unit~used~in~PL~file}
+ {You~may~continue,~but~the~metrics~for~this~font~will~be~wrong.}
+ \fi
+ \out_line{\string\setdim{designunits}{\the\b_dimen}}
+}
+\def\BOUNDARYCHAR~#1~#2~{
+ \x_setint{\percent_char boundarychar}{\pl_int{#1}{#2}}
+}
+\def\pl_setfontdimen#1#2{\x_cs\def{fdimen-#1}{#2}}
+\def\PARAMETER~#1~#2~R~#3~{
+ \f_count=\pl_int{#1}{#2}\x_relax
+ \if_defined{fdimen-\the\f_count}\then
+ \pl_rounded_real(#3 0000)
+ \out_line{\string\setint{\csname fdimen-\the\f_count\endcsname}
+ {\the\result}}
+ \fi
+}
+\let\FONTDIMEN=\x_relax
+\def\SLANT{\PARAMETER D~1~}
+\pl_setfontdimen{1}{italicslant}
+\def\SPACE{\PARAMETER D~2~}
+\pl_setfontdimen{2}{interword}
+\def\STRETCH{\PARAMETER D~3~}
+\pl_setfontdimen{3}{stretchword}
+\def\SHRINK{\PARAMETER D~4~}
+\pl_setfontdimen{4}{shrinkword}
+\def\XHEIGHT{\PARAMETER D~5~}
+\pl_setfontdimen{5}{xheight}
+\def\QUAD{\PARAMETER D~6~}
+\pl_setfontdimen{6}{quad}
+\def\EXTRASPACE{\PARAMETER D~7~}
+\pl_setfontdimen{7}{extraspace}
+\def\NUM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~8~#2~#3~
+ \or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \fi
+}
+\def\DENOM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \fi
+}
+\def\SUP#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~13~#2~#3~
+ \or
+ \PARAMETER D~14~#2~#3~
+ \or
+ \PARAMETER D~15~#2~#3~
+ \fi
+}
+\def\SUB#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~16~#2~#3~
+ \or
+ \PARAMETER D~17~#2~#3~
+ \fi
+}
+\def\SUPDROP{\PARAMETER D~18~}
+\def\SUBDROP{\PARAMETER D~19~}
+\def\AXISHEIGHT{\PARAMETER D~22~}
+\def\DELIM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~20~#2~#3~
+ \or
+ \PARAMETER D~21~#2~#3~
+ \fi
+}
+\def\DEFAULTRULETHICKNESS{\PARAMETER D~8~}
+\def\BIGOPSPACING#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \or
+ \PARAMETER D~13~#2~#3~
+ \fi
+}
+\def\LABEL~#1{\ifx #1B
+ \expandafter\LABEL_boundarychar
+ \else
+ \expandafter\LABEL_slot \expandafter#1
+ \fi
+}
+\def\LABEL_slot #1~#2~{
+ \f_count=\pl_int{#1}{#2}
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-\the\f_count}
+ }
+}
+\def\LABEL_boundarychar OUNDARYCHAR{
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-BOUNDARYCHAR}
+ }
+}
+\def\do_if_defined#1{\ifx #1\x_relax \else \do{#1} \fi}
+\def\LIGTABLE{\let\do=\never_do\let\a_macro\empty_command}
+\def\STOP{\let\a_macro\empty_command}
+\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}}
+\def\KRN~#1~#2~R~#3~{
+ \pl_rounded_real(#3 0000)
+ \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\the\result}}
+ \a_macro
+ \let\do=\never_do
+}
+\def\write_pl_krn#1#2#3{
+ \f_count=#1\x_relax
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setkern{#3}
+ {\csname name-\the\f_count\endcsname}{#2}
+ }
+ \fi
+}
+\def\CHARWD~R~#1~{\pl_rounded_real(#1 0000) \b_count=\result}
+\def\CHARHT~R~#1~{\pl_rounded_real(#1 0000) \c_count=\result}
+\def\CHARDP~R~#1~{\pl_rounded_real(#1 0000) \d_count=\result}
+\def\CHARIC~R~#1~{\pl_rounded_real(#1 0000) \e_count=\result}
+\def\CHARACTER~#1~#2~{
+ \do_pl_glyph
+ \a_count=\pl_int{#1}{#2}
+ \b_count=0
+ \c_count=0
+ \d_count=0
+ \e_count=0
+ \let\do_pl_glyph=\write_pl_glyph
+}
+\def\write_pl_glyph{
+ \x_cs\ifx{name-\the\a_count}\x_relax\else
+ \out_line{\string\setrawglyph
+ {\csname~name-\the\a_count\endcsname}
+ {\raw_font_name}
+ {\the\a_dimen}
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\the\e_count}}
+ \fi
+ }
+\def\mtxtopl#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{#2.pl}
+ \top_of_pl_hook
+ \out_line{(COMMENT~raw~font~#2~created~by~fontinst~
+ v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.pl)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~
+ a~ligless~TeX~font~with)}
+ \out_line{(COMMENT~pltotf~#2.pl~#2.tfm)}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \out_line{(DESIGNSIZE~R~10.0)}
+ \out_line{}
+ \let\setglyph=\iffalse
+ \let\endsetglyph=\fi
+ \let\setkern=\gobble_three
+ \let\setscaledrawglyph=\first_pl_raw_glyph
+ \def\setscalednotglyph##1##2##3##4##5##6##7##8##9{}
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.pl)}
+ \close_out{Raw~font}
+}}
+\def\first_pl_raw_glyph#1#2#3#4{
+ \out_line{(DESIGNUNITS~R~\make_factor{#4})}
+ \let\setscaledrawglyph=\pl_raw_glyph
+ \pl_raw_glyph{#1}{#2}{#3}{#4}
+}
+\def\pl_raw_glyph#1#2#3#4#5#6#7#8#9{
+ \out_line{(CHARACTER~D~\number#5~\space(COMMENT~#1)}
+ \out_lline{(CHARWD~R~\make_factor{#6})}
+ \out_lline{(CHARHT~R~\make_factor{#7})}
+ \out_lline{(CHARDP~R~\make_factor{#8})}
+ \out_lline{(CHARIC~R~\make_factor{#9})}
+ \out_lline{)}
+}
+\def\transformfont#1#2{{
+ \let\setsomething_global=\x_relax
+ \unsetstr{afm-name}
+ \unsetstr{etx-name}
+ \x_resetint{x-scale}{\one_thousand}
+ \x_resetint{y-scale}{\one_thousand}
+ \x_resetint{slant-scale}{0}
+ #2
+ \ifisstr{afm-name}\then
+ \mtxtomtx{\str{afm-name}}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \fontinsterror{Transformfont}{
+ Failed~to~make~transformed~font~#1;\messagebreak
+ source~font~metrics~file~not~found
+ }\error_help_a
+ \fi
+}}
+\def\fromafm#1{
+ \if_file_exists{#1.afm}\then
+ \x_setstr{afm-name}{#1}
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \fi
+}
+\def\frommtx#1{
+ \if_file_exists{#1.mtx}\then \x_setstr{afm-name}{#1} \fi
+}
+\def\frompl#1{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{}
+ \fi
+}
+\def\fromplgivenetx#1#2{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{#2}
+ \fi
+}
+\def\fromany#1{
+ \x_cs\edef{s-afm-name}{#1}
+ \if_file_exists{#1.mtx}\then\else
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1}{pl}{}
+ \else
+ \if_file_exists{#1.afm}\then
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1}{vpl}{}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi\fi\fi
+}
+\def\scalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{x-scale}{\scale{\d_count}{\int{x-scale}}}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\xscalefont#1#2{
+ \x_resetint{x-scale}{\scale{#1}{\int{x-scale}}}
+ #2
+}
+\def\yscalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\slantfont#1#2{
+ \x_resetint{slant-scale}{
+ \add{\scale{#1}{\int{x-scale}}}{\int{slant-scale}}
+ }
+ #2
+}
+\def\reencodefont#1#2{
+ #2
+ \resetstr{etx-name}{#1}
+}
+\def\mtxtomtx#1#2{{
+ \let\a_macro=\empty_command
+ \_a_true
+ \ifnum \int{x-scale}=\int{y-scale}
+ \ifnum \int{slant-scale}=\z@
+ \_a_false
+ \fi \fi
+ \if_a_
+ \a_count=\int{x-scale}
+ \l_inv_scale\a_count{\int{y-scale}}
+ \b_count=\int{slant-scale}
+ \l_inv_scale\b_count{\int{y-scale}}
+ \edef\a_macro{\a_macro
+ \string\transformfont{\the\a_count}{\the\b_count}
+ }
+ \fi
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \ifisstr{etx-name}\then
+ \def\do_slot{\x_cs\edef{slots-\slot_name}{\the\slot_number}}
+ \def\declarepsencoding##1##2##3{
+ \a_toks={{##1}{##2}{##3}}
+ \out_line{\string\providepsencoding\the\a_toks}
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file
+ {\string\providepsencoding\the\a_toks}
+ \fi
+ }
+ \directfalse
+ \inputetx{\str{etx-name}}
+ \edef\a_macro{\a_macro\string\reencodefont{\str{etx-name}}}
+ \fi
+ \record_transform{#2}{\string\frommtx{#1}}{\a_macro}\iftrue
+ \out_line{}
+ \mtxtomtx_redefinitions
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Transformed~metrics}
+}}
+\def\mtxtomtx_redefinitions{
+ \let\setint=\mtxtomtx_setint
+ \let\setdim=\mtxtomtx_setdim
+ \let\setstr=\mtxtomtx_setstr
+ \let\setscaledrawglyph=\mtxtomtx_setscaledrawglyph
+ \let\setscalednotglyph=\mtxtomtx_setscaledrawglyph
+ \let\setkern=\mtxtomtx_setkern
+ \let\setglyph=\mtxtomtx_setglyph
+ \let\glyphpcc=\mtxtomtx_glyphpcc
+ \let\samesize=\mtxtomtx_samesize
+ \let\endsetglyph=\mtxtomtx_endsetglyph
+ \def\aliased{\string\aliased}
+}
+\let\aliased=\second_of_two
+\def\mtxtomtx_setint#1#2{
+ \def\a_macro{#1}
+ \ifx \a_macro\italicslant_name
+ \eval_expr{#2}
+ \global\multiply \result \int{x-scale}
+ \a_count=\int{slant-scale}
+ \multiply \a_count \one_thousand
+ \advance \a_count \result
+ \divide \a_count \int{y-scale}\x_relax
+ \else
+ \def\do##1{
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \expandafter\if_false \fi
+ }
+ \gobble_one\iftrue \width_ints_list \if_true
+ \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}}
+ \else
+ \eval_expr_to\a_count{\scale{#2}{\int{x-scale}}}
+ \fi
+ \fi
+ \out_line{\string\setint{#1}{\the\a_count}}
+}
+\def\italicslant_name{italicslant}
+\def\width_ints_list{
+ \do{interword}\do{stretchword}\do{shrinkword}\do{quad}
+ \do{extraspace}\do{digitwidth}\do{verticalstem}
+}
+\def\mtxtomtx_setdim#1#2{
+ \out_line{\string\setdim{#1}{#2}}
+}
+\def\mtxtomtx_setstr#1#2{
+ \out_line{\string\setstr{#1}{#2}}
+}
+\def\mtxtomtx_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \eval_expr_to\a_count{\scale{#6}{\int{x-scale}}}
+ \eval_expr_to\b_count{\scale{#7}{\int{y-scale}}}
+ \eval_expr_to\c_count{\scale{#8}{\int{y-scale}}}
+ \eval_expr_to\d_count{#9} \eval_expr{#7}
+ \multiply \d_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \d_count
+ \rounded_thousandths
+ \d_count=\result
+ \eval_expr{\scale{#4}{\int{y-scale}}}
+ \ifisstr{etx-name}\then
+ \bgroup
+ \let\aliased=\first_of_two
+ \if_undefined{slots-#1}\then
+ \egroup \e_count=\m@ne
+ \else
+ \expandafter\egroup \expandafter\e_count
+ \csname slots-#1\endcsname
+ \fi
+ \else
+ \e_count=#5
+ \fi
+ \out_line{
+ \ifnum \e_count>\m@ne
+ \string\setscaledrawglyph
+ \else
+ \string\setscalednotglyph
+ \fi
+ {#1}{\raw_font_name}{#3}{\the\result}{\the\e_count}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+\def\mtxtomtx_setkern#1#2#3{
+ \eval_expr{\scale{\int{x-scale}}{#3}}
+ \out_line{\string\setkern{#1}{#2}{\the\result}}
+}
+\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}}
+\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}}
+\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}}
+\def\mtxtomtx_glyphpcc#1#2#3{
+ \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}}
+ \eval_expr_to\a_count{#2} \eval_expr{#3}
+ \multiply \a_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \a_count
+ \rounded_thousandths
+ \out_lline{\string\glyphpcc{#1}{\the\result}{\the\b_count}}
+}
+\def\reglyphfonts{
+ \begingroup
+ \let\setsomething_global=\x_relax
+ \x_setint{renameweight}{1}
+ \x_setint{killweight}{-10}
+ \setcommand\iftokeep##1\then{\ifnum -1<##1}
+}
+\def\endreglyphfonts{\endgroup}
+\def\offmtxcommand#1{
+ \x_cs\offcommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\def\onmtxcommand#1{
+ \x_cs\oncommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\renameglyph#1#2{
+ \x_cs\edef{slots-#2}{
+ \noexpand\rename_glyph{#1}\noexpand\i-renameweight
+ }
+ }
+\endgroup
+\def\renameglyphweighted#1#2#3{
+ \eval_expr{#3}
+ \x_cs\edef{slots-#2}{\noexpand\rename_glyph{#1}{\the\result}}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\killglyph#1{
+ \x_cs\def{slots-#1}{\kill_glyph\i-killweight}
+ }
+\endgroup
+\def\killglyphweighted#1#2{
+ \eval_expr{#2}
+ \x_cs\edef{slots-#1}{\noexpand\kill_glyph{\the\result}}
+}
+\def\reglyphfont#1#2{
+ \fromany{#2}
+ \ifisstr{afm-name}\then
+ \reglyph_font{#1}{#2}
+ \else
+ \fontinsterror{Reglyph}{Could~not~find~font~metrics~for~#2.}
+ \error_help_a
+ \fi
+}
+\def\reglyph_font#1#2{{
+ \open_out{\temp_prefix#1.mtx}
+ \out_line{\percent_char~Filename:~#1.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\reglyphfont{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \record_transform{#1}{\string\frommtx{#2}}{\string\reglyphfont}
+ \iftrue
+ \out_line{}
+ \reglyph_redefinitions
+ \inputmtx{#2}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Reglyphed~metrics}
+}}
+\def\reglyph_redefinitions{
+ \let\setint=\reglyph_setint
+ \let\setdim=\reglyph_setdim
+ \let\setstr=\reglyph_setstr
+ \let\setscaledrawglyph=\reglyph_setscaledrawglyph
+ \let\setscalednotglyph=\reglyph_setscaledrawglyph
+ \let\setkern=\reglyph_setkern
+ \let\setglyph=\reglyph_setglyph
+ \let\glyphpcc=\reglyph_glyphpcc
+ \let\samesize=\reglyph_samesize
+ \let\endsetglyph=\reglyph_endsetglyph
+}
+\def\reglyph_setint#1#2{\out_line{\string\setint{#1}{#2}}}
+\def\reglyph_setdim#1#2{\out_line{\string\setdim{#1}{#2}}}
+\def\reglyph_setstr#1#2{\out_line{\string\setstr{#1}{#2}}}
+\newcount\command_survivance
+\def\rename_glyph#1{\def\glyphname{#1}\kill_glyph}
+\def\kill_glyph#1{\advance \command_survivance #1\x_relax}
+\def\reglyph_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{
+ \ifnum #5<\z@
+ \string\setscalednotglyph
+ \else
+ \string\setscaledrawglyph
+ \fi
+ {\glyphname}{#2}{#3}{\number#4}{#5}{#6}{#7}{#8}{#9}
+ }
+ \fi
+}
+\def\reglyph_setkern#1#2#3{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \let\a_macro=\glyphname
+ \def\glyphname{#2}
+ \csname slots-#2\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{\string\setkern{\a_macro}{\glyphname}{#3}}
+ \fi
+}
+\def\reglyph_setglyph#1{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_line{\string\setglyph{\glyphname}}}
+ \a_toks=\expandafter{\a_macro}
+}
+\x_cs\def{off-\string\reglyph_setglyph}#1{\gobble_glyph}
+\def\reglyph_glyphpcc#1#2#3{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\glyphpcc{\glyphname}{#2}{#3}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_samesize#1{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\samesize{\glyphname}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_endsetglyph{
+ \iftokeep\command_survivance\then
+ \the\a_toks
+ \out_line{\string\endsetglyph}
+ \fi
+ \a_toks={}
+}
+%%% From file: filtfam.dtx
+\def\latinfamily#1#2{{
+ \edef\a_macro{#1}
+ \expandafter\parse_family\a_macro
+ \empty_command\empty_command\end_parse_family
+ \installfonts
+ \if_file_exists{\raw_encoding.mtx}\then
+ \installfamily{\raw_encoding}{\latex_family}{#2}
+ \fi
+ \installfamily{OT1}{\latex_family}{#2}
+ \installfamily{T1}{\latex_family}{#2}
+ \installfamily{TS1}{\latex_family}{#2}
+ \latin_weights
+ \endinstallfonts
+}}
+\def\parse_family #1#2#3#4#5\end_parse_family{
+ \gdef\font_family{#1#2#3}
+ \gdef\font_variant{#4#5}
+ \gdef\raw_variant{#4#5}
+ \gdef\latex_family{#1#2#3#4#5}
+ \_expert_false
+ \_oldstyle_false
+ \ifx#4x
+ \_expert_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1}
+ \else\ifx#4j
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else\ifx#49
+ \gdef\latex_family{#1#2#3j#5}
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else
+ \_expert_false
+ \_oldstyle_false
+ %\setcommand\digit##1{##1}
+ \fi\fi\fi
+ \if_oldstyle_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(oldstyle)}
+ \else\if_expert_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(expert)}
+ \else
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#4#5>}
+ \fi\fi
+}
+\newif\if_expert_
+\newif\if_oldstyle_
+\def\latin_weight#1#2{
+ \gdef\font_weight{#1}%
+ \gdef\latex_weight{#2}%
+ \latin_widths
+}
+\def\latin_width#1#2{
+ \gdef\font_width{#1}
+ \gdef\latex_width{#2}
+ \latin_shapes
+}
+\def\latin_shape#1#2#3#4#5{
+ \gdef\font_shape{#1}
+ \gdef\raw_shape{#2}
+ \gdef\encoding_shape{#3}
+ \if_oldstyle_
+ \gdef\encoding_shape{#3\oldstyle_shape}
+ \fi
+ \gdef\latex_shape{#4}
+ \gdef\encoding_switches{#5}
+ \immediate\write16{
+ INFO>~to~make~LaTeX~font~shape~<\latex_family,
+ \latex_weight,\latex_shape,\latex_width>~seek~
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx}
+ \csname fake_width_\font_width\endcsname
+ \csname fake_shape_\raw_shape\endcsname
+ \if_file_exists{
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \latin_encodings
+ \fi
+}
+\def\fake_shape_{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_raw_encoding
+ \fi
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.afm
+ }\then
+ \fake_shape_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width>
+ }
+ \transformfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+}
+\def\fake_shape_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width
+ }
+ \fi
+}
+\def\fake_shape_c{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ % If real smallcaps font doesn't exist, fake it from the roman.
+ \gdef\raw_shape{}
+ \if_oldstyle_
+ \gdef\encoding_shape{cj}
+ \else
+ \gdef\encoding_shape{c}
+ \fi
+ \fake_shape_
+ \fi
+}
+\def\fake_shape_o{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ \fake_shape_o_raw_encoding
+ \if_expert_
+ \fake_shape_o_expert_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_o_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_shape_o_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \expert_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\let\fake_shape_i\fake_shape_ % We must do this again!
+\newif\if_fake_narrow_
+\_fake_narrow_false
+\def\fakenarrow#1{
+ \_fake_narrow_true
+ \gdef\fake_narrow_width{#1}
+}
+\def\fake_width_{}
+\def\fake_width_c{}
+\def\fake_width_n{
+ \if_fake_narrow_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then % no action required
+ \else
+ \fake_width_n_raw_encoding
+ \if_expert_
+ \fake_width_n_expert_encoding
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\def\latin_encoding#1#2#3#4#5{
+ \gdef\latex_encoding{#4}
+ \gdef\latex_mtx{#5}
+ \if_oldstyle_
+ \gdef\font_encoding{#3}
+ \else\if_expert_
+ \gdef\font_encoding{#2}
+ \else
+ \gdef\font_encoding{#1}
+ \fi\fi
+ \gdef\expert_font{}
+ \gdef\oldstyle_font{}
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \gdef\expert_font{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width,
+ }
+ \fi
+ \fi
+ \immediate\write16{
+ INFO>~run~\string\installfont\space
+ <\font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx>
+ <\latex_encoding\encoding_shape>
+ <\latex_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installfont{
+ \font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width
+ }{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx
+ }{
+ \latex_encoding\encoding_shape
+ }{
+ \latex_encoding
+ }{
+ \latex_family
+ }{
+ \latex_weight\latex_width
+ }{
+ \latex_shape
+ }{}
+}
+\def\latin_weights{
+ \latin_weight{r}{m}
+ \latin_weight{k}{m}
+ \latin_weight{b}{b}
+ \latin_weight{s}{sb}
+ \latin_weight{d}{db} % was {d}{sb}, SPQR changed
+ \latin_weight{m}{mb} % was {m}{m}, UV changed
+ \latin_weight{c}{eb} % UV added
+ \latin_weight{h}{eb} % UV added
+ \latin_weight{x}{eb}
+ \latin_weight{u}{ub}
+ \latin_weight{l}{l}
+ %\latin_weight{j}{el}
+ %\latin_weight{a}{ul} % UV added
+}
+\def\latin_widths{
+ \latin_width{}{}
+ \latin_width{n}{c}
+ %latin_width{c}{c}
+ %latin_width{x}{x}
+}
+\def\latin_shapes{
+ \latin_shape{} {} {} {n} {\_textcomp_true }
+ \latin_shape{c}{c}{} {sc}{\_textcomp_false}
+ \latin_shape{o}{o}{} {sl}{\_textcomp_true }
+ \latin_shape{i}{i}{i}{it}{\_textcomp_true }
+}
+\def\latin_encodings{
+ \latin_encoding{7t}{9t}{9o}{OT1}{newlatin}
+ \latin_encoding{8t}{9e}{9d}{T1} {newlatin}
+ \encoding_switches
+ \if_textcomp_
+ \latin_encoding{8c}{9c}{9c}{TS1}{textcomp}
+ \fi
+}
+\newif\if_textcomp_
+
+\def\raw_encoding{8r}
+\def\adobe_encoding{8a}
+\def\expert_encoding{8x}
+
+\def\caps_shape{c}
+\def\oldstyle_shape{j}
+\def\SlantAmount{167}
+%%% From file: fimapgen.dtx
+\def\mapfrags_subsystem{Map~fragments~writer}
+\def\recordtransforms#1{\open_pout\transform_record_file{#1}}
+\def\endrecordtransforms{
+ \close_pout\transform_record_file{Font~transformation~records}
+}
+\chardef\transform_record_file=\closed_stream
+\let\storemapdata=\gobble_three
+\def\record_transform#1#2#3#4{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\storemapdata{#1}{#2}{#3}}
+ \fi
+ #4 \out_line{\string\storemapdata{#1}{#2}{#3}} \fi
+}
+\def\record_usage#1{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\makemapentry{#1}}
+ \fi
+}
+\let\declarepsencoding=\gobble_three
+\let\providepsencoding=\gobble_three
+%%% From file: fibasics.dtx
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\x_relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~
+ \fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+\if_file_exists{fontinst.rc}\then
+ \primitiveinput fontinst.rc
+\else
+ \immediate\write16{No~file~fontinst.rc.}
+\fi
+\normalcc
+\endinput
+%%
+%% End of file `fontinst.sty'.
diff --git a/fonts/utilities/fontinst/inputs/base/multislot.sty b/fonts/utilities/fontinst/inputs/base/multislot.sty
new file mode 100644
index 0000000000..fac7214405
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/multislot.sty
@@ -0,0 +1,234 @@
+% multislot.sty
+%
+% Second version
+
+
+\needsfontinstversion{1.900}
+% Relies heavily on _etx_pass_hook commands.
+
+
+%%%%%%%%%%%%%%% RESOURCES USED %%%%%%%%%%%%%%%
+%
+% The following classes of control sequences are used by the multislot
+% routines, in addition to the ones defined below and the ones fontinst
+% normally uses:
+%
+% \name-NUM
+%
+% where NUM is a number consisting of one, two, or three decimal digits.
+% These are also used by \pltomtx, so they probably already exist as
+% hash table entries.
+
+
+
+%%%%%%%%%%%%%%% SAVE CATCODES %%%%%%%%%%%%%%%
+%
+% Save the current values of the catcodes of space, @, NL, ~ and _.
+% _ and @ are made letters, ~ is a space, and space and NL are ignored.
+
+\edef\spacecatcode{\the\catcode`\ }
+\edef\atcatcode{\the\catcode`\@}
+\edef\nlcatcode{\the\catcode`\^^M}
+\edef\underscorecatcode{\the\catcode`\_}
+\edef\tildecatcode{\the\catcode`\~}
+
+\catcode`\ =9
+\catcode`\^^M=9
+\catcode`\@=11
+\catcode`\_=11
+\catcode`\~=10
+
+
+%%%%%%%%%%%%%%% MULTIPLE SLOT COMMANDS %%%%%%%%%%%%%%%
+%
+% The user-level commands are quite simple. As usual, you can write
+%
+% \setslot{NAME}
+% <slot commands>
+% \endsetslot
+%
+% to assign a glyph to a slot. The difference is that if there are
+% multiple \setslot commands for a slot, this will no longer cause
+% strange results. Instead, only the first \setslot-\endsetslot pair
+% for each slot will be used, the others are ignored.
+%
+% If you instead write
+%
+% \resetslot{NAME}
+% <slot commands>
+% \endsetslot
+%
+% then this will override any earlier occurences of \setslot or
+% \resetslot. Finally, there is the command
+%
+% \unsetslot{NUMBER}
+%
+% which makes fontinst forget any earlier occurences of \setslot
+% or \resetslot commands for that particular slot.
+
+
+% The way this works is that every \setslot or \resetslot command is
+% implicitly assigned an index, namely the number of such commands
+% perviously encountered since the start of the ETX pass. The count
+% register \slot_index is allocated to keep track of the current
+% index:
+
+\newcount\slot_index
+\def\clear_slot_index{\slot_index=\m@ne}
+\add_to\pre_first_etx_pass_hook{\clear_slot_index}
+\add_to\pre_second_etx_pass_hook{\clear_slot_index}
+\add_to\pre_third_etx_pass_hook{\clear_slot_index}
+\add_to\pre_fourth_etx_pass_hook{\clear_slot_index}
+
+% \setslot, \setleftboundary, and \setrightboundary increments the
+% counter just before checking it.
+
+
+
+% The point of maintaining the index is that the index of the
+% \setslot (or whatever) that actually sets a particular slot gets
+% stored in the \name-SLOT control sequence (which is \mathchardef'ed
+% to the index). After assignments are made, all a \setslot (or
+% whatever) needs to do is to check whether the stored index matches
+% the current one, and gobble itself if they don't.
+
+% The basic check is performed by the command \later_index_check.
+% This has the syntax
+%
+% \later_index_check{SLOT}{<else-code>}
+%
+% and expands to nothing if this \setslot will be active, but to
+% <else-code> if it will not.
+\def\later_index_check#1{
+ \x_cs\ifnum {name-#1}=\slot_index
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi
+}
+% However, when deciding which \setslots will be active, the condition
+% to test is slightly different: is the control sequence in question
+% already defined to be a mathchar token? If it isn't, then this will
+% be the active \setslot.
+\def\setslot_index_check#1{\x_cs\setslot_index_check_i{name-#1}}
+\def\temp_command#1{
+ \def\setslot_index_check_ii##1#1##2\setslot_index_check_ii{##1}
+ \def\setslot_index_check_i##1{
+ \expandafter\setslot_index_check_ii \expandafter\ifx
+ \expandafter$ \meaning##1 #1 0 \setslot_index_check_ii $
+ \expandafter\identity_one
+ \else
+ \mathchardef##1=\slot_index
+ \expandafter\gobble_one
+ \fi
+ }
+}
+\expandafter\temp_command \expandafter{ \string\mathchar " }
+
+% The stated definition of \setslot_index_check should thus be in
+% force during the first etx pass, but after that the
+% \later_index_check definition should rule.
+\add_to\post_first_etx_pass_hook{
+ \let\setslot_index_check=\later_index_check
+}
+
+% The following is used to ignore a \setslot--\endsetslot or
+% \setleftboundary--\endsetleftboundary construction; the argument is
+% the command which marks the end. The reason not to use
+% \gobble_setslot is that it still executes \end_do_slot, which is
+% quite wrong for the kind of ignoring done here.
+\def\ignore_to_end#1{
+ \bgroup
+ \let#1=\fi
+ \expandafter
+ \egroup
+ \iffalse
+}
+
+
+% The \setslot, \setleftboundary, and \setrightboundary commands must
+% be equipped with checks at the start.
+\def\checked_setslot{
+ \advance \slot_index \@ne
+ \setslot_index_check{\the\slot_number}{
+ \advance \slot_number \@ne
+ \ignore_to_end\endsetslot
+ }
+ \unchecked_setslot
+}
+
+\def\checked_setleftboundary{
+ \advance \slot_index \@ne
+ \setslot_index_check{leftboundary}{\ignore_to_end\endsetleftboundary}
+ \unchecked_setleftboundary
+}
+
+\def\checked_setrightboundary#1{
+ \advance \slot_index \@ne
+ \setslot_index_check{\the\slot_number}{
+ \advance \slot_number \@ne
+ \gobble_two
+ }
+ \unchecked_setrightboundary{#1}
+}
+\add_to\pre_first_etx_pass_hook{
+ \let\unchecked_setslot=\setslot
+ \let\setslot=\checked_setslot
+ \let\unchecked_setleftboundary=\setleftboundary
+ \let\setleftboundary=\checked_setleftboundary
+ \let\unchecked_setrightboundary=\setrightboundary
+ \let\setrightboundary=\checked_setrightboundary
+}
+% But that's it, as far as the \set... commands are concerned.
+
+
+% What about \unsetslot? In principle, it _should_ just be a matter of
+\def\unsetslot#1{
+ \eval_expr{#1}
+ \x_cs\let{name-\the\result}\undefined_command
+}
+\add_to\post_first_etx_pass_hook{\let\unsetslot=\gobble_one}
+% given which \resetslot is simply
+\def\resetslot{\unsetslot\slot_number \setslot}
+% and this sort-of works, but not quite.
+%
+% The problem is that the ordinary slot assignment table, which is
+% used for ligature and kerning instructions, is not updated by
+% \unsetslot. Hence ligatures and kerns will be generated as if all
+% glyphs that have been set for a slot are present there; after
+%
+% \nextslot{108}
+% \setslot{l} \endsetslot
+%
+% \nextslot{108}
+% \resetslot{lambda} \endsetslot
+%
+% the effect will be as if one had given the command
+%
+% \setleftkerning{lambda}{l}{1000}
+%
+% and moreover the same happens for ligatures, so an f + l -> fl
+% ligature will also work as an f + lambda -> fl ligature.
+%
+% This is of course a BUG, and there doesn't seem to be any way
+% around it, short of adding another pass of reading ETX files. Doing
+% so would probably not be worth the effort, since the usefulness of
+% a \resetslot command is not clear; unlike \resetglyph, it cannot be
+% used to amend an existing \set..., but only to override it.
+
+
+
+%%%%%%%%%%%%%%% RESTORE CATCODES %%%%%%%%%%%%%%%
+%
+% Restore the catcodes that were changed.
+
+\catcode`\@=\atcatcode
+\catcode`\^^M=\nlcatcode
+\catcode`\ =\spacecatcode
+\catcode`\~=\tildecatcode
+\catcode`\_=\underscorecatcode
+
+%%%%%%%%%%%%%%% THE END %%%%%%%%%%%%%%%
+
+\endinput
+
diff --git a/fonts/utilities/fontinst/inputs/base/xfntinst.sty b/fonts/utilities/fontinst/inputs/base/xfntinst.sty
new file mode 100644
index 0000000000..d13e974623
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/base/xfntinst.sty
@@ -0,0 +1,3775 @@
+%%
+%% This is file `xfntinst.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `pkg')
+%% ficommon.dtx (with options: `pkg')
+%% fimain.dtx (with options: `pkg')
+%% fitrig.dtx (with options: `pkg')
+%% ficonv.dtx (with options: `pkg')
+%% filtfam.dtx (with options: `pkg,textcomp,debug,oldstyle')
+%% fimapgen.dtx (with options: `pkg')
+%% fibasics.dtx (with options: `pkg2')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: fibasics.dtx
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+\def\fontinstversion{1.933}
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+\ProvidesPackage{fontinst}
+[2007/01/23 v\fontinstversion\space
+ fontinst installation package]
+\def\a_macro#1{\catcode\number`#1=\the\catcode`#1 }
+\edef\normalcc{%
+ \a_macro{\ }\a_macro{\^^M}\a_macro{\@}\a_macro{\_}\a_macro{\~}
+}
+\def\fontinstcc{%
+ \catcode`\ =9%
+ \catcode`\^^M=9%
+ \catcode`\@=11%
+ \catcode`\_=11%
+ \catcode`\~=10
+}
+\fontinstcc
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\expandafter\def \csname bye\endcsname
+ {\par\vfill\supereject\@@end}
+\fi
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+\newif\if_a_
+\newwrite\out_file
+\mathchardef\one_thousand=1000
+\mathchardef\five_hundred=500
+\mathchardef\one_hundred=100
+\mathchardef\max_mathchardef="7FFF
+\mathchardef\two_thousand=2000
+\newdimen\half_point \half_point=0.5pt
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\def\swap_two#1#2{#2#1}
+\def\first_of_three#1#2#3{#1}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\#=12
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\hash_char[#]
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+\def\first_char#1#2={#1}
+\def\add_to#1#2{
+ \ifx#1\x_relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+\def\prep_to#1#2{
+ \ifx#1\x_relax
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2#1}
+ \fi
+}
+\def\never_do{\noexpand\do}
+\newif\if_extensions_warning_
+\_extensions_warning_false
+\ifx \eTeXversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\eTeX#1{
+ \if_extensions_warning_
+ \space/\space e-TeX\space version\space #1
+~ \else
+~ \ifdim \number\eTeXversion\eTeXrevision\p@ < #1\p@ \else
+~ \_a_true
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\ifx \pdftexversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\pdfTeX#1#2{%
+ \if_extensions_warning_
+ \space/\space pdfTeX\space version\space
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+ \expandafter\swap_two \expandafter.
+ \fi
+ #1#2%
+~ \else
+~ \ifdim #1>\pdftexversion \else
+~ \ifnum \expandafter\expandafter \expandafter`
+~ \expandafter\first_char \pdftexrevision= <
+~ \expandafter` \first_char#2=
+~ \else \_a_true \fi
+~ \fi
+ \fi
+}
+\catcode`\~=10
+\def\needsTeXextension#1#2{
+ \_a_false
+ #1
+ \if_a_ \else
+ \_extensions_warning_true
+ \edef\a_macro{#1}
+ \_extensions_warning_false
+ \fontinstwarningnoline{#2}{
+ This~file~needs:\messagebreak
+ \expandafter\second_of_two\a_macro
+ \iffalse
+ <no~sufficient~extensions~were~listed!!>\if_false
+ \fi
+ \messagebreak
+ You~are~not~using~any~of~them.~This~is~likely~to~cause~errors
+ }
+ \fi
+}
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \xdef\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\edef\out_lline#1{\noexpand\out_line{\space\space\space#1}}
+\edef\out_llline#1{
+ \noexpand\out_line{\space\space\space\space\space\space#1}
+}
+\def\TeX_terminal{\string\TeX\space terminal}
+\chardef\closed_stream=99
+\x_cs\let{out_filename-99}=\TeX_terminal
+\x_cs\def{out_filename--1}{\jobname.log}
+\def\allocate_stream{
+ \a_count=\m@ne
+ \b_count=\m@ne
+ \loop \ifnum \count17>\a_count
+ \advance \a_count \@ne
+ \x_cs\ifx{out_filename-\the\a_count}\TeX_terminal
+ \b_count=\a_count
+ \a_count=\count17
+ \fi
+ \repeat
+ \ifnum \b_count=\m@ne
+ \global\advance\count17by\@ne
+ \ifnum \count17<\sixt@@n
+ \b_count=\count17
+ \global\x_cs\let{out_filename-\the\b_count}\TeX_terminal
+ \wlog{\string\write\the\b_count\space allocated~to~the~pool.}
+ \else
+ \global\count17=\sixt@@n
+ \fi
+ \fi
+}
+\def\ch@ck#1#2#3{
+ \ifnum \count1#1<#2 \else
+ \errmessage{No~room~for~a~new~#3}
+ \global\count1#1=#2
+ \fi
+}
+\def\open_pout#1#2{
+ \allocate_stream
+ \ifnum \b_count=\m@ne
+ \immediate\write\sixt@@n{fontinst~is~out~of~output~streams.^^J
+ Output~file~#2~cannot~be~opened.^^J
+ Writes~will~be~redirected~to~the~log~file.
+ }
+ \gdef#1{\m@ne}
+ \else
+ \immediate\openout\b_count=#2\x_relax
+ \x_cs\xdef{out_filename-\the\b_count}{#2}
+ \global\chardef#1=\b_count
+ \fi
+}
+\def\close_pout#1#2{
+ \ifnum #1=\closed_stream
+ \errmessage{Output~file~\string#1~(#2)~not~closed,^^J
+ since~it~was~not~open}
+ \else
+ \immediate\write\sixt@@n{#2~written~on~
+ \csname out_filename-\the#1\endcsname.}
+ \ifnum #1=\m@ne \else
+ \immediate\closeout#1
+ \global\x_cs\let{out_filename-\the#1}=\TeX_terminal
+ \fi
+ \global\chardef#1=\closed_stream
+ \fi
+}
+\def\pout_line#1#2{\immediate\write#1{#2}}
+\edef\pout_lline#1#2{\noexpand\pout_line#1{\space\space\space#2}}
+\edef\pout_llline#1#2{
+ \noexpand\pout_line#1{\space\space\space\space\space\space#2}
+}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+\let\then=\iffalse
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+\_a_false\eTeX{2.0}
+\if_a_\else \catcode`\~=14\x_relax \fi
+~ \def\if_defined#1\then{
+~ \if
+~ \ifcsname#1\endcsname
+~ \expandafter\ifx \csname#1\endcsname \x_relax
+~ 0
+~ \else
+~ 1
+~ \fi
+~ \else
+~ 0
+~ \fi
+~ 1
+~ }
+~ \def\if_undefined{\expandafter\unless\if_defined}
+\catcode`\~=\if_a_ 14 \else 10 \fi \x_relax
+~ \def\if_defined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ \expandafter\if_false
+~ \else
+~ \expandafter\if_true
+~ \fi
+~ }
+~ \def\if_undefined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ }
+\catcode`\~=10\x_relax
+\def\gobble_if{\iftrue\else}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+\def\if_equal#1\then{\ifx#1}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\x_relax
+ \ifeof1\x_relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+\let\Else=\else
+\let\Fi=\fi
+\x_cs\ifx{@@input}\x_relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+\def\process_csep_list#1#2,{
+ \ifx\process_csep_list#2
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ #1{#2}
+ \process_csep_list{#1}
+ }
+}
+\def\make_factor#1{
+ \ifnum #1<\z@
+ -\expandafter\make_factor_i\expandafter{\number-#1}
+ \else
+ \expandafter\make_factor_i\expandafter{\number#1}
+ \fi
+}
+\def\make_factor_i#1{
+ \ifnum #1<\one_thousand
+ \make_factor_ii{#1}
+ \else
+ \make_factor_iii #1
+ \fi
+ #1
+}
+\def\make_factor_ii#1{
+ 0.
+ \ifnum #1<\one_hundred
+ 0
+ \ifnum #1<10~ 0\fi
+ \fi
+}
+\def\make_factor_iii#1#2#3\fi#4{
+ \fi
+ #4
+ \ifnum 1#3<\one_thousand
+ .
+ \else
+ \make_factor_iii#2#3
+ \fi
+}
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+\def\format_hex_i#1#2{
+ \if #2i \else
+ \b_count=\a_count
+ \divide \a_count \sixt@@n
+ \c_count=\a_count
+ \multiply \c_count \sixt@@n
+ \advance \b_count -\c_count
+ \edef#1{
+ \ifcase\b_count 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or
+ 9\or a\or b\or c\or d\or e\or f\fi
+ #1
+ }
+ \expandafter\format_hex_i \expandafter#1
+ \fi
+}
+\def\format_hex#1#2#3{
+ \a_count=#2
+ \let#1\empty_command
+ \expandafter\format_hex_i \expandafter#1 \romannumeral
+ \expandafter\identity_one\expandafter{\number#3}001~
+}
+\let\messagebreak\x_relax
+\def\generic_info#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\m@ne{#2\on_line.}
+ \endgroup
+}
+\def\generic_warning#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{^^J#2\on_line.^^J}
+ \endgroup
+}
+\def\generic_error#1#2#3#4{
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \errmessage{#2.^^J^^J#3
+ Type~\space H~<return>~\space for~immediate~help
+ }
+ \endgroup
+}
+\def\fontinsterror#1#2#3{
+ \generic_error{
+ \four_spaces\four_spaces
+ }{
+ #1~error:\messagebreak #2
+ }{
+ }{#3}
+}
+\def\fontinstwarning#1#2{
+ \generic_warning{
+ \four_spaces\four_spaces
+ }{
+ #1~warning:\messagebreak #2
+ }
+}
+\def\fontinstwarningnoline#1#2{
+ \fontinstwarning{#1}{#2\gobble_one}
+}
+\def\fontinstinfo#1#2{
+ \generic_info{
+ \four_spaces\four_spaces
+ }{
+ #1~info:\messagebreak #2
+ }
+}
+\def\on_line{~on~input~line~\the\inputlineno}
+\edef\four_spaces{\space\space\space\space}
+\gdef\error_help_a{
+ Your~command~was~ignored.\messagebreak
+ Type~\space I~<command>~<return>~\space to~replace~it~
+ with~another~command,\messagebreak
+ or~\space <return>~\space to~continue~without~it.}
+\gdef\error_help_c{
+ Try~typing~\space <return>~
+ \space to~proceed.\messagebreak
+ If~that~doesn't~work,~type~\space X~<return>~\space to~quit.}
+\gdef\error_help_d{
+ You're~in~trouble~here.~\space\error_help_c}
+\def\error_help_e#1{You~can~continue,~but~the~#1~wrong.}
+\newlinechar=`\^^J
+\errorcontextlines=999
+\tracinglostchars=1
+%%% From file: ficommon.dtx
+\def\str#1{\csname~s-#1\endcsname}
+\def\strint#1{\expandafter\identity_one\expandafter{\number\int{#1}}}
+\newcount\result
+\def\eval_expr#1{\global\result=#1\x_relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+\def\add#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\advance \result \a_count
+ \egroup
+}
+\def\sub#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \advance \a_count -\result
+ \global\result=\a_count
+ \egroup
+}
+\def\int#1{\csname i-#1 \endcsname}
+\def\neg#1{#1 \global\result=-\result}
+\def\mul#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \egroup
+}
+\def\div#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \divide \a_count \result
+ \global\result=\a_count
+ \egroup
+}
+\def\max#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count>\result \global\result=\a_count \fi
+ \egroup
+}
+\def\min#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count<\result \global\result=\a_count \fi
+ \egroup
+}
+\def\half#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\otherhalf#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \else \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\scale#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \rounded_thousandths
+ \egroup
+}
+\def\rounded_thousandths{
+ \global\divide \result \five_hundred
+ \ifodd \result
+ \global\advance \result by \ifnum 0>\result - \fi 1
+ \fi
+ \global\divide \result \tw@
+}
+\def\l_rounded_thousandths#1{
+ \divide #1 \five_hundred
+ \ifodd #1
+ \advance #1 by \ifnum 0>#1 - \fi\@ne
+ \fi
+ \divide #1 \tw@
+}
+\def\l_inv_scale#1#2{
+ \multiply #1 \two_thousand
+ \divide #1 #2\x_relax
+ \ifodd#1 \advance #1 \ifnum 0>#1 - \fi\@ne \fi
+ \divide #1 \tw@
+}
+\def\ifnumber#1#2#3\then{
+ \eval_expr_to\a_count{#1}
+ \eval_expr{#3}
+ \ifnum \a_count#2\result
+ \expandafter\if_true
+ \else
+ \expandafter\if_false
+ \fi
+}
+\let\setsomething_global=\x_relax
+\def\x_setint#1#2{
+ \x_cs\ifx{i-#1}\x_relax
+ \x_resetint{#1}{#2}
+ \fi
+}
+\let\setint=\x_setint
+\def\x_setstr#1#2{
+ \x_cs\ifx{s-#1}\x_relax
+ \setsomething_global\x_cs\edef{s-#1}{#2}
+ \fi
+}
+\let\setstr=\x_setstr
+\def\setdim#1#2{
+ \x_cs\ifx{d-#1}\x_relax
+ \a_dimen=#2\x_relax
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+ \fi
+}
+\def\setcommand#1{
+ \ifx#1\undefined_command
+ \setsomething_global \expandafter\def \expandafter#1
+ \else
+ \expandafter\def \expandafter\a_macro
+ \fi
+}
+\def\x_resetint#1#2{
+ \eval_expr{#2}
+ \setsomething_global
+ \ifnum\result<\max_mathchardef
+ \ifnum 0>\result
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\let\resetint=\x_resetint
+\def\resetstr#1#2{\setsomething_global\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{
+ \a_dimen=#2
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+}
+\def\resetcommand#1{\setsomething_global\def#1}
+\def\dim#1{\csname~d-#1\endcsname}
+\def\ifisint#1\then{\if_defined i-#1\then}
+\def\ifisstr#1\then{\if_defined s-#1\then}
+\def\ifisdim#1\then{\if_defined d-#1\then}
+\def\ifiscommand#1\then{
+ \ifx#1\undefined_command
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+\def\unsetint#1{\setsomething_global\x_cs\let{i-#1}\x_relax}
+\def\unsetstr#1{\setsomething_global\x_cs\let{s-#1}\x_relax}
+\def\unsetdim#1{\setsomething_global\x_cs\let{d-#1}\x_relax}
+\def\unsetcommand#1{\setsomething_global\let#1=\undefined_command}
+\def\offcommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax
+ \setsomething_global\x_cs\let{saved-\string#1}#1
+ \x_cs\ifx{off-\string#1}\x_relax
+ \generate_off_command{#1}
+ \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname off-\string#1\endcsname
+ \fi
+ \fi
+}
+\def\oncommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname saved-\string#1\endcsname
+ \setsomething_global\x_cs\let{saved-\string#1}\x_relax
+ \fi
+}
+\def\generate_off_command#1{
+ \a_count=0
+ \let\next=\count_hashes
+ \expandafter\next\meaning#1~->\x_relax
+ \b_count=0
+ \a_toks={}
+ \loop \ifnum \b_count<\a_count
+ \advance \b_count 1
+ \a_toks=\expandafter{\the\expandafter\a_toks \expandafter####
+ \the\b_count}
+ \repeat
+ \setsomething_global \expandafter\def \expandafter#1 \the\a_toks {}
+}
+\def\count_hashes#1#2{
+ \if \hash_char#1
+ \advance \a_count 1
+ \else
+ \if -#1
+ \if >#2
+ \let\next=\gobble_to_xrelax
+ \fi\fi
+ \fi
+ \next#2
+}
+\def\gobble_to_xrelax#1\x_relax{}
+\def\for(#1)#2#3#4{
+ \eval_expr_to\a_count{#2}
+ \x_resetint{#1}{\a_count}
+ \eval_expr{#4}
+ \ifnum 0=\result \else
+ \c_count=\result
+ \eval_expr_to\b_count{#3}
+ \setsomething_global\x_cs\edef{for-#1}{
+ \the\c_count \x_relax
+ \noexpand\ifnum \gobble_one\fi
+ \the\b_count \ifnum 0>\c_count > \else < \fi
+ }
+ \def\next##1##2##3\endfor(#1){##2\for_i{##1}{##3}}
+ \next{#1}
+ \fi
+}
+\def\for_i#1#2{
+ \setsomething_global\x_cs\def{body-#1}{#2}
+ \ifnum \b_count \ifnum0>\c_count >\else<\fi \a_count
+ \expandafter\gobble_two
+ \else
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\for_ii#1{
+ \a_count=\int{#1}
+ \advance \a_count \csname for-#1\endcsname \a_count
+ \expandafter\gobble_two
+ \else
+ \x_resetint{#1}\a_count
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+\def\endfor(#1){}
+\def\foreach(#1)#2{
+ \def\next##1\endfor(#1){
+ \setsomething_global\x_cs\def{body-#1}{##1}
+ \process_csep_list{\foreach_i{#1}}#2,\process_csep_list,
+ }
+ \next
+}
+\def\foreach_i#1#2{
+ \resetstr{#1}{#2}
+ \csname body-#1\endcsname
+}
+\let\comment=\gobble_one
+\let\begincomment=\iffalse
+\let\endcomment=\fi
+%%% From file: fimain.dtx
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\let\encoding=\relax
+\outer\def\endencoding{\endinput}
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\x_relax}
+\let\do_slot\empty_command
+\let\end_do_slot\empty_command
+\newcount\slot_number
+\def\nextslot#1{\eval_expr_to\slot_number{#1}}
+\def\skipslots#1{\eval_expr{#1} \advance\slot_number by \result}
+\def\setleftboundary#1{\edef\slot_name{#1}\do_boundary}
+\let\endsetleftboundary\x_relax
+\let\do_boundary\x_relax
+\def\setrightboundary#1{
+ \makerightboundary{#1}
+ \advance \slot_number 1\x_relax
+}
+\let\ligature=\gobble_three
+\def\Ligature{\ligature}
+\def\oddligature#1#2#3#4{}
+\let\nextlarger=\gobble_one
+\let\usedas=\gobble_two
+\let\makerightboundary=\gobble_one
+\let\Unicode=\gobble_two
+\let\charseq=\gobble_one
+\let\varchar=\empty_command
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\endvarchar=\empty_command
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+\def\setfontdimen#1#2{
+ \ifisint{#2}\then \setint{fontdimen(#1)}{\int{#2}} \fi
+}
+\let\label=\gobble_one
+\newif\ifdirect \directtrue
+\def\input_mtx_as_etx#1{
+ \def\setscaledrawglyph##1##2##3##4##5##6##7##8##9{
+ \nextslot{##5}
+ \setslot{##1}\endsetslot
+ }
+ \offcommand\setscalednotglyph
+ \let\setglyph=\gobble_glyph
+ \offcommand\setkern
+ \inputmtx{#1}
+}
+\def\inputmtx#1{
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\let\metrics=\x_relax
+\edef\endmetrics_text{\string\endmetrics}
+\outer\def\endmetrics{\endinput}
+\def\ProvidesMtxPackage#1{\x_cs\let{pack-#1}P}
+\def\usemtxpackage{\futurelet\next_token\test_UseMtxPkg_arguments}
+\def\test_UseMtxPkg_arguments{\ifx\next_token[
+ \expandafter\mtx_package_given_file
+ \else
+ \expandafter\mtx_package_separate_files
+ \fi
+}
+\def\mtx_package_given_file[#1]#2{
+ \_a_false
+ \process_csep_list\load_true_unless_loaded #2,\process_csep_list,
+ \if_a_ \inputmtx{#1} \fi
+}
+\def\load_true_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else\_a_true\fi
+}
+\def\mtx_package_separate_files#1{
+ \process_csep_list\load_file_unless_loaded #1,\process_csep_list,
+}
+\def\load_file_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else \inputmtx{#1} \fi
+}
+\let\glyph_name_modifier=\identity_one
+\def\setkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {#3}
+ \else
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\set_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\set_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\set_kern_cs#1#2#3{
+ \add_to#2{\k#3#1}
+ \add_to#3{\k#2#1}
+}
+\def\resetkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{#3}
+ \else
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\reset_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\reset_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\reset_kern_cs#1#2#3{
+ \prep_to#2{\k\expandafter#3\expandafter#1}
+ \prep_to#3{\k\expandafter#2\expandafter#1}
+}
+\def\setleftkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+}
+\def\setrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\setleftrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\set_kerning#1#2{
+ \if\b_count=\one_thousand
+ \def\k##1##2{
+ \set_kern_cs##2##1#1
+ }
+ \else
+ \def\k##1##2{
+ \set_kern##1#1{
+ \scale\b_count{\expandafter\gobble_one\string##2}
+ }
+ }
+ \fi
+ #2
+}
+\def\kerning#1#2{0\x_relax
+ \def\k##1{\csname~set-\string##1\endcsname\gobble_one}
+ \bgroup
+ \x_cs\def{set-\string\l-#2}##1##2{
+ \global\result=\expandafter\gobble_one\string##2\egroup
+ }
+ \csname~r-#1\endcsname
+ \csname~set-\string\l-#2\endcsname\gobble_one{00}
+}
+\def\ifiskern#1#2\then{
+ \def\k##1##2{\ifx T##1 \let\k\gobble_two \fi}
+ \bgroup
+ \x_cs\let{l-#2}T
+ \csname r-#1\endcsname
+ \expandafter\egroup \ifx\k\gobble_two
+}
+\def\unsetkerns#1#2{
+ \let\k\k_unless_to_U
+ \process_csep_list\make_slots_U#1,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{l-##1}}
+ \process_csep_list\do#2,\process_csep_list,
+ \process_csep_list\make_slots_relax#1,\process_csep_list,
+ \process_csep_list\make_slots_U#2,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{r-##1}}
+ \process_csep_list\do#1,\process_csep_list,
+ \process_csep_list\make_slots_relax#2,\process_csep_list,
+}
+\def\make_slots_U#1{\x_cs\let{slots-#1}U}
+\def\make_slots_relax#1{\x_cs\let{slots-#1}\x_relax}
+\def\k_unless_to_U#1#2{
+ \x_cs\ifx{slots-\expandafter\gobble_three\string#1}U \else
+ \noexpand\k\noexpand#1\noexpand#2
+ \fi
+}
+\def\main_remove_Us#1{
+ \ifx#1\x_relax \else
+ \edef#1{#1}
+ \ifx#1\empty_command \let#1\x_relax \fi
+ \fi
+}
+\def\noleftkerning#1{\no_kerning{l}{#1}}
+\def\norightkerning#1{\no_kerning{r}{#1}}
+\def\noleftrightkerning#1{\no_kerning{l}{#1}\no_kerning{r}{#1}}
+\def\no_kerning#1#2{
+ \let\k\no_kerning_i
+ \def\do##1{\csname #1-##1\endcsname}
+ \bgroup
+ \aftergroup\def \aftergroup\a_macro \aftergroup{
+ \process_csep_list\do #2,\process_csep_list,
+ \aftergroup}
+ \egroup
+ \def\do##1{\expandafter\let \csname #1-##1\endcsname \x_relax}
+ \process_csep_list\do #2,\process_csep_list,
+ \let\k\no_kerning_ii
+ \def\do##1{\edef##1{##1}}
+ \a_macro
+}
+\def\no_kerning_i#1#2{
+ \ifx #1\x_relax \else
+ \aftergroup\do \aftergroup#1
+ \let #1\x_relax
+ \fi
+}
+\def\no_kerning_ii#1#2{
+ \ifx #1\x_relax \else \noexpand\k \noexpand#1 \noexpand#2 \fi
+}
+\def\width{\glyph_parameter\first_of_six}
+\def\height{\glyph_parameter\second_of_six}
+\def\depth{\glyph_parameter\third_of_six}
+\def\italic{\glyph_parameter\fourth_of_six}
+\def\mapcommands{\glyph_parameter\fifth_of_six}
+\def\mapfonts{\glyph_parameter\sixth_of_six}
+\def\glyph_parameter#1#2{
+ \expandafter\expandafter\expandafter
+ #1\csname g-#2\endcsname
+}
+\def\first_of_six#1#2#3#4#5#6{#1}
+\def\second_of_six#1#2#3#4#5#6{#2}
+\def\third_of_six#1#2#3#4#5#6{#3}
+\def\fourth_of_six#1#2#3#4#5#6{#4}
+\def\fifth_of_six#1#2#3#4#5#6{#5}
+\def\sixth_of_six#1#2#3#4#5#6{#6}
+\def\glyph_metrics#1#2#3#4#5#6{
+ \a_count=#1
+ \b_count=#2
+ \c_count=#3
+ \d_count=#4~
+}
+\let\saved_scale\x_relax
+\let\saved_mapfont\x_relax
+\let\saved_raw\x_relax
+\let\saved_rule\x_relax
+\let\saved_special\x_relax
+\let\saved_warning\x_relax
+\let\saved_movert\x_relax
+\let\saved_moveup\x_relax
+\let\saved_push\x_relax
+\let\saved_pop\x_relax
+\newcount\glyph_width
+\newcount\glyph_height
+\newcount\glyph_depth
+\newcount\glyph_italic
+\newtoks\glyph_map_commands
+\newtoks\glyph_map_fonts
+\newcount\glyph_voffset
+\newcount\glyph_maxhpos
+\def\setglyph#1{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \expandafter\gobble_glyph
+ \else
+ \x_cs\def{g-\glyph_name_modifier{#1}}{
+ {\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}
+ }
+ \resetglyph{\glyph_name_modifier{#1}}
+ \fi
+}
+\long\def\gobble_glyph#1\endsetglyph{}
+\def\resetglyph#1{
+ \edef\glyphname{#1}
+ \glyph_width=0
+ \global\glyph_height=0
+ \global\glyph_depth=0
+ \global\glyph_italic=0
+ \glyph_voffset=0
+ \global\glyph_maxhpos=0
+ \global\glyph_map_commands={}
+ \global\glyph_map_fonts={}
+}
+\def\endsetglyph{
+ \x_cs\edef{g-\glyphname}
+ {{\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}}
+}
+\let\endresetglyph=\endsetglyph
+\def\setrawglyph#1#2#3{
+ \setscaledrawglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \eval_expr{#4}
+ \ifnum \result=\one_thousand
+ \let\a_macro\identity_one
+ \else
+ \edef\a_macro##1{\saved_scale{\the\result}{##1}}
+ \fi
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro##1{\saved_scale{\the\e_count}{\a_macro{##1}}}
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\a_macro{\saved_raw{#2}{#5}{#1}}}
+ {\a_macro{\saved_mapfont{#2}{#3}}}
+ }
+ \fi
+}
+\def\setnotglyph#1#2#3{
+ \setscalednotglyph{#1}{#2}{#3}\one_thousand
+}
+\def\setscalednotglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}-not}\then
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}-not}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {}{}
+ }
+ \fi
+}
+\def\unsetglyph#1{\x_cs\let{g-#1}\x_relax}
+\def\glyph#1#2{
+ \glyph_parameter\glyph_metrics{#1}
+ \eval_expr_to\e_count{#2}
+ \ifnum \e_count=\one_thousand
+ \edef\a_macro{\mapcommands{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\mapfonts{#1}}
+ \else
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapcommands{#1}}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapfonts{#1}}}
+ \fi
+ \advance \glyph_width \a_count
+ \advance \b_count \glyph_voffset
+ \ifnum \glyph_height<\b_count \global\glyph_height=\b_count \fi
+ \advance \c_count -\glyph_voffset
+ \ifnum \glyph_depth<\c_count \global\glyph_depth=\c_count \fi
+ \global\glyph_italic=\d_count
+ \global\glyph_map_fonts\expandafter{
+ \the\expandafter\glyph_map_fonts \a_macro
+ }
+}
+\def\glyphrule#1#2{
+ \eval_expr_to\b_count{#1} \eval_expr_to\c_count{#2}
+ \advance\glyph_width by \b_count
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth{-\glyph_voffset}}
+ \g_eval_expr_to\glyph_height{
+ \max\glyph_height{\add\glyph_voffset\c_count}
+ }
+ \global\glyph_italic=0
+ \edef\a_macro{\saved_rule{\the\b_count}{\the\c_count}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphspecial#1{
+ \edef\a_macro{\saved_special{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphwarning#1{
+ \edef\a_macro{\saved_warning{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\movert#1{
+ \eval_expr{#1}
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \ifnum 0=\result \else
+ \advance\glyph_width by \result
+ \edef\a_macro{\saved_movert{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\moveup#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_voffset by \result
+ \edef\a_macro{\saved_moveup{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+\def\push{
+ \bgroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_push
+ }
+}
+\def\pop{
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \egroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_pop
+ }
+}
+\def\resetwidth#1{\movert{\sub{#1}\glyph_width}}
+\def\resetheight{\g_eval_expr_to\glyph_height}
+\def\resetdepth{\g_eval_expr_to\glyph_depth}
+\def\resetitalic{\g_eval_expr_to\glyph_italic}
+\def\glyphpcc#1#2#3{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{\glyph_name_modifier{#1}}{\one_thousand}
+ \pop
+ \else\ifisglyph{\glyph_name_modifier{#1}-not}\then
+ \fontinstwarning{\string\glyphpcc}{
+ Base~glyph~`\glyph_name_modifier{#1}'~not~appended,\messagebreak
+ because~it~is~so~far~unencoded~in~the~glyph~base
+ }
+ \else
+ \fontinsterror{\string\glyphpcc}{
+ Base~glyph~not~set.\messagebreak
+ This~could~be~a~sign~that~the~AFM~file~is~buggy
+ }\error_help_a
+ \fi\fi
+}
+\def\glyphbboxright{\max\glyph_width\glyph_maxhpos}
+\def\samesize#1{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \resetwidth{\glyphbboxright}
+ \else
+ \expandafter\expandafter\expandafter
+ \same_size\csname g-\glyph_name_modifier{#1}\endcsname
+ \fi
+}
+\def\same_size#1#2#3#4#5#6{
+ \movert{\sub{#1}\glyph_width}
+ \global\glyph_height=#2
+ \global\glyph_depth=#3
+ \global\glyph_italic=#4
+}
+\def\ifisglyph#1\then{\if_defined{g-#1}\then}
+\def\ifareglyphs#1\then{
+ \process_csep_list{\if_is_glyph}#1,\process_csep_list,
+ \if_true
+}
+\def\if_is_glyph#1{
+ \if_undefined{g-#1}\then \expandafter\if_false \fi
+}
+\def\etxtovpl#1#2{{
+ \def\vpl_extension{vpl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{virtual~font}
+ \def\vpl_Font{Virtual~font}
+ \def\vpl_call{\string\etxtovpl{#1}{#2}}
+ \def\vpl_to_vf##1{vptovf~##1.vpl~##1.vf~##1.tfm}
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\def\etxtopl#1#2{{
+ \def\vpl_extension{pl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{font}
+ \def\vpl_Font{Font}
+ \def\vpl_call{\string\etxtopl{#1}{#2}}
+ \def\vpl_to_vf##1{pltotf~##1.pl~##1.tfm}
+ \_including_map_false
+ \global\rawfont_scaling=-\p@
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\newif\if_including_map_
+\_including_map_true
+\def\make_inputetx#1{
+ \def\a_macro{\noexpand\inputetx{\file_name}}
+ \get_file_name #1~{}~\par
+ \edef\a_macro{\a_macro}
+ \a_toks=\expandafter{ \the\expandafter\a_toks \a_macro}
+}
+\x_cs\def{IFKW-mtxasetx}{
+ \def\a_macro{\noexpand\input_mtx_as_etx{\file_name}}
+ \get_keyword
+}
+\def\etx_to_font#1#2{
+ \make_assignments{#1}
+ \open_out{#2.\vpl_extension}
+ \top_of_pl_hook
+ \out_line{(\vpl_title\space\vpl_font\space
+ #2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.\vpl_extension)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\vpl_call)}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~\vpl_font\space
+ with)}
+ \out_line{(COMMENT~\vpl_to_vf{#2})}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \make_header{#1}
+ \if_including_map_ \make_mapfonts{#1} \fi
+ \make_fontdimens{#1}
+ \make_ligtable{#1}
+ \make_characters{#1}
+ \make_tidy{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.\vpl_extension)}
+ \close_out{\vpl_Font}
+}
+\let\pre_first_etx_pass_hook\x_relax
+\let\pre_second_etx_pass_hook\x_relax
+\let\pre_third_etx_pass_hook\x_relax
+\let\pre_fourth_etx_pass_hook\x_relax
+\let\post_first_etx_pass_hook\x_relax
+\let\post_second_etx_pass_hook\x_relax
+\let\post_third_etx_pass_hook\x_relax
+\let\post_fourth_etx_pass_hook\x_relax
+\let\tidying_up_hook\x_relax
+\let\top_of_pl_hook\x_relax
+\def\make_assignments#1{
+ \let\do_slot=\assign_slot
+ \let\end_do_slot=\end_assign_slot
+ \def\do_boundary{\bgroup
+ \let\makerightboundary=\bad_makerightboundary
+ }
+ \let\endsetleftboundary=\egroup
+ \let\makerightboundary=\assign_rboundary
+ \pre_first_etx_pass_hook
+ #1
+ \post_first_etx_pass_hook
+ \let\end_do_slot=\empty_command
+ \let\do_boundary=\x_relax
+ \let\endsetleftboundary=\x_relax
+ \let\makerightboundary=\gobble_one
+}
+\def\assign_slot{\a_toks={\do}}
+\begingroup
+ \catcode0=12
+ \gdef\end_assign_slot{
+ \ifisglyph\slot_name\then
+ \lccode0=\slot_number
+ \lowercase{
+ \expandafter\add_to
+ \csname slots-\slot_name\expandafter\endcsname
+ \expandafter{\the\a_toks^^@}
+ }
+ \fi
+ }
+ \gdef\assign_rboundary#1{
+ \lccode0=\slot_number
+ \lowercase{\x_cs\add_to{slots-#1}{\rboundary_do^^@}}
+ \x_setint{\percent_char boundarychar}\slot_number
+ \a_toks={\rbserver_do}
+ }
+\endgroup
+\def\bad_makerightboundary#1{
+ \errhelp={The~left~boundary~is~not~a~slot,~so~it~cannot~serve~
+ as~right~boundary.}
+ \errmessage{Incorrect~use~of~\string\makerightboundary}
+}
+\def\get_slot_num#1{
+ \global\result=-1
+ \bgroup
+ \def\do{\global\result=`}
+ \let\rbserver_do=\do
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \egroup
+}
+\def\ifisinslot#1#2\then{
+ \ifx \makerightboundary\gobble_one
+ \eval_expr{#2}
+ \begingroup
+ \def\do##1{\ifnum `##1=\result \let\do=\gobble_one \fi}
+ \def\rbserver_do{\do}
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \expandafter\endgroup
+ \ifx \do\gobble_one
+ \expandafter\expandafter \expandafter\if_true
+ \else
+ \expandafter\expandafter \expandafter\if_false
+ \fi
+ \else
+ \expandafter\gobble_if
+ \fi
+}
+\newdimen\mapfont_scaling
+\mapfont_scaling=1pt
+\newdimen\rawfont_scaling
+\def\vpl_real#1{R~\expandafter\lose_measure\the#1}
+\def\vpl_int#1{D~\the#1}
+\newdimen\side_bearings
+\newdimen\curr_bearings
+\def\make_header#1{
+ \global\font_count=0
+ \setdim{designsize}{10pt}
+ \a_dimen=\dim{designsize}
+ \out_line{(DESIGNSIZE~\vpl_real\a_dimen)}
+ \x_setstr{codingscheme}{UNKNOWN}
+ \out_line{(CODINGSCHEME~\str{codingscheme})}
+ \ifisint{\percent_char boundarychar}\then
+ \a_count=\int{\percent_char boundarychar}
+ \out_line{(BOUNDARYCHAR~\vpl_int\a_count)}
+ \fi
+ \x_setint{letterspacing}{0}
+ \side_bearings=\make_factor{\int{letterspacing}}\half_point
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{}
+}
+\def\make_mapfonts#1{
+ \let\saved_scale\vpl_scale
+ \let\saved_mapfont\vpl_mapfont
+ \let\do_slot=\do_mapfont
+ \pre_second_etx_pass_hook
+ #1
+ \post_second_etx_pass_hook
+ \out_line{}
+}
+\def\do_mapfont{
+ \ifisglyph\slot_name\then
+ \mapfonts\slot_name
+ \fi
+}
+\def\vpl_scale#1#2{{
+ \mapfont_scaling=\make_factor{#1}\mapfont_scaling
+ #2
+}}
+\def\vpl_mapfont#1#2{
+ \a_dimen=#2
+ \if_undefined{\the\mapfont_scaling-#1}\then
+ \global\x_cs\mathchardef{\the\mapfont_scaling-#1}=\font_count
+ \x_cs\xdef{f-\the\font_count}{\the\mapfont_scaling-#1}
+ \out_line{(MAPFONT~\vpl_int\font_count\space
+ (FONTNAME~#1)~
+ (FONTDSIZE~\vpl_real\a_dimen)~
+ (FONTAT~\vpl_real\mapfont_scaling))}
+ \record_usage{#1}
+ \global\advance\font_count by 1
+ \fi
+}
+\def\pl_mapfont#1#2{\global\rawfont_scaling=\mapfont_scaling}
+\newcount\font_count
+\newcount\next_mapfont
+\newcount\prev_mapfont
+\def\make_fontdimens#1{
+ \out_line{(FONTDIMEN}
+ \a_count=1
+ \loop\ifnum 256>\a_count
+ \ifisint{fontdimen(\the\a_count)}\then
+ \out_lline{(PARAMETER~\vpl_int\a_count\space
+ R~\make_factor{\int{fontdimen(\the\a_count)}})}
+ \fi
+ \advance \a_count \@ne
+ \repeat
+ \out_lline{)}
+ \out_line{}
+}
+\def\make_ligtable#1{
+ \begingroup
+ \out_line{(LIGTABLE}
+ \let\do_slot=\bgroup
+ \let\end_do_slot=\vpl_kerning
+ \def\do_boundary{\bgroup \let\vpl_liglabel=\boundary_liglabel}
+ \let\endsetleftboundary=\vpl_kerning
+ \let\ligature=\vpl_ligature
+ \let\k=\vpl_kern
+ \let\rbserver_do=\vpl_rbserver_do
+ \let\rboundary_do=\vpl_rboundary_do
+ \pre_third_etx_pass_hook
+ #1
+ \post_third_etx_pass_hook
+ \out_lline{)}
+ \endgroup
+ \out_line{}
+}
+\def\vpl_rbserver_do#1{
+ \do{#1}
+ \let\rboundary_do=\wrn_rboundary_do
+}
+\def\vpl_rboundary_do#1{
+ \do{#1}
+ \let\rbserver_do=\wrn_rboundary_do
+}
+\def\wrn_rboundary_do#1{
+ \do{#1}
+ \immediate\write16{Boundarychar~slot~usage~collision~in~
+ `\slot_name'~ligkern~program.}
+}
+\def\vpl_ligature#1#2#3{
+ \get_slot_num{#3}
+ \ifnum -1=\result
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \else
+ \x_cs\ifx{slots-#2}\x_relax
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#2'.}
+ \else
+ \def\do##1{
+ \vpl_liglabel
+ \out_lline{(#1~D~\number`##1~\space\vpl_int\result)~
+ (COMMENT~#2~#3)}
+ }
+ \csname slots-#2\endcsname
+ \fi
+ \fi
+}
+\def\vpl_kerning{
+ \let\do=\vpl_kern_do
+ \csname~r-\slot_name\endcsname
+ \vpl_ligstop
+ \egroup
+}
+\def\vpl_kern#1#2{
+ \edef\a_macro{\expandafter\gobble_three\string#1}
+ \a_count=\expandafter\gobble_one\string#2\x_relax
+ \ifnum \ifnum -\a_count>\a_count - \fi\a_count>\minimum_kern
+ \edef\b_macro{~R~\make_factor\a_count}
+ \csname slots-\a_macro\endcsname
+ \fi
+ \x_cs\let{slots-\a_macro}=\x_relax
+}
+\def\vpl_kern_do#1{
+ \vpl_liglabel
+ \out_lline{
+ (KRN~D~\number`#1~\b_macro)~
+ (COMMENT~\a_macro)
+ }
+}
+\def\out_liglabel{
+ \out_lline{(LABEL~\vpl_int\slot_number)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\def\boundary_liglabel{
+ \out_lline{(LABEL~BOUNDARYCHAR)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\let\vpl_liglabel=\out_liglabel
+\def\out_ligstop{\out_lline{(STOP)}
+ \let\vpl_liglabel=\out_liglabel
+ \let\vpl_ligstop=\x_relax}
+\let\vpl_ligstop=\x_relax
+\def\make_characters#1{
+ \bgroup
+ \let\do_slot=\do_character
+ \let\end_do_slot=\end_do_character
+ \let\nextlarger=\vpl_nextlarger
+ \let\varchar=\vpl_varchar
+ \let\endvarchar=\end_vpl_varchar
+ \let\vartop=\vpl_vartop
+ \let\varmid=\vpl_varmid
+ \let\varbot=\vpl_varbot
+ \let\varrep=\vpl_varrep
+ \if_including_map_
+ \let\saved_raw\vpl_raw
+ \let\saved_rule\vpl_rule
+ \let\saved_special\vpl_special
+ \let\saved_warning\vpl_warning
+ \let\saved_movert\vpl_movert
+ \let\saved_moveup\vpl_moveup
+ \let\saved_push\vpl_push
+ \let\saved_pop\vpl_pop
+ \else
+ \def\do_character_map{
+ \ifdim \rawfont_scaling=-\p@
+ \mapfonts\slot_name
+ \else
+ \let\do_character_map=\x_relax
+ \fi
+ }
+ \let\saved_mapfont\pl_mapfont
+ \let\saved_scale\vpl_scale
+ \fi
+ \pre_fourth_etx_pass_hook
+ #1
+ \post_fourth_etx_pass_hook
+ \egroup
+}
+\def\do_character{
+ \if_undefined{g-\slot_name}\then
+ \ifisint{requireglyphs}\then
+ \fontinstwarning{ETX~to~(V)PL}{
+ Undefined~glyph~`\slot_name'~requested\message_break
+ for~slot~\the\slot_number\message_number}
+ \fi
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \glyph_parameter\glyph_metrics\slot_name
+ \a_dimen=\make_factor\a_count \p@
+ \do_character_sidebearings
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \ifnum \z@=\b_count \else
+ \out_lline{(CHARHT~R~\make_factor\b_count)}
+ \fi
+ \ifnum \z@=\c_count \else
+ \out_lline{(CHARDP~R~\make_factor\c_count)}
+ \fi
+ \ifnum \z@=\d_count \else
+ \out_lline{(CHARIC~R~\make_factor\d_count)}
+ \fi
+ \do_character_map
+ \fi
+ \fi
+}
+\def\do_character_sidebearings{
+ \ifisint{\slot_name-spacing}\then
+ \curr_bearings=\make_factor{\int{\slot_name-spacing}}\half_point
+ \else
+ \curr_bearings=\side_bearings
+ \fi
+ \advance\a_dimen by 2\curr_bearings
+}
+\def\do_character_map{
+ \global\prev_mapfont=0
+ \out_lline{(MAP}
+ \ifdim 0pt=\curr_bearings
+ \mapcommands\slot_name
+ \else
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \mapcommands\slot_name
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \fi
+ \out_llline{)}
+}
+\long\def\gobble_setslot#1\endsetslot{\endsetslot}
+\def\end_do_character{
+ \ifisglyph\slot_name\then
+ \out_lline{)}
+ \fi
+}
+\def\notdef_name{.notdef}
+\def\vpl_nextlarger#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_lline{(NEXTLARGER~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\nextlarger\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varchar{\out_lline{(VARCHAR}}
+\def\end_vpl_varchar{\out_llline{)}}
+\def\vpl_vartop#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(TOP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\vartop\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varmid#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(MID~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varmid\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varbot#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(BOT~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varbot\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_varrep#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(REP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varrep\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+\def\vpl_raw#1#2#3{
+ \global\next_mapfont=\csname\the\mapfont_scaling-#1\endcsname
+ \ifnum \next_mapfont=\prev_mapfont \else
+ \out_llline{(SELECTFONT~\vpl_int\next_mapfont)~
+ (COMMENT~#1~at~
+ \expandafter\lose_measure \the\mapfont_scaling)}
+ \fi
+ \out_llline{(SETCHAR~D~#2)~(COMMENT~#3)}
+ \global\prev_mapfont=\next_mapfont
+}
+\def\vpl_rule#1#2{
+ \a_dimen=\make_factor{#2}\mapfont_scaling
+ \b_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(SETRULE~\vpl_real\a_dimen\space\vpl_real\b_dimen)}
+}
+\def\vpl_special#1{
+ \out_llline{(SPECIAL~#1)}}
+\def\vpl_warning#1{
+ \ifwarningspecials
+ \out_llline{(SPECIAL~Warning:~#1)}
+ \fi
+ \immediate\write16{Warning:~#1.}
+}
+\newif\ifwarningspecials
+\warningspecialstrue
+\def\vpl_movert#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVERIGHT~\vpl_real\a_dimen)}
+}
+\def\vpl_moveup#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVEUP~\vpl_real\a_dimen)}
+}
+\def\vpl_push{\out_llline{(PUSH)}}
+\def\vpl_pop{\out_llline{(POP)}}
+\def\make_tidy#1{
+ \tidying_up_hook
+ \if_including_map_
+ \a_count=0
+ \loop\ifnum \a_count<\font_count
+ \edef\a_macro{\csname~f-\the\a_count\endcsname}
+ \global\x_cs\let\a_macro\x_relax
+ \advance\a_count by 1
+ \repeat
+ \global\font_count=0
+ \else
+ \ifdim \rawfont_scaling<\z@
+ \fontinstwarning{ETX~to~(V)PL}{The~font~
+ \out_filename\space doesn't~contain~any~characters}
+ \global\rawfont_scaling=\p@
+ \fi
+ \ifdim \rawfont_scaling=\p@ \else
+ \out_line{(DESIGNUNITS~\vpl_real\rawfont_scaling)}
+ \fi
+ \fi
+}
+\newtoks\family_toks
+\def\installfonts{
+ \bgroup
+ \global\family_toks={}
+ \gdef\prev_file_list{}
+ \global\let\setsomething_global=\global
+}
+\def\installfamily#1#2#3{
+ \global\family_toks=
+ \expandafter{\the\family_toks\fd_family{#1}{#2}{#3}}
+ \global\x_cs\let{#1-#2}\empty_command
+}
+\def\installfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \input_metrics{}{#2}
+ \etxtovpl{#3}{#1}
+ \installfontas{#1}{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installrawfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \xdef\out_filename{#1}
+ \input_metrics{\let\storemapdata=\installraw_storemap}{#2}
+ \let\storemapdata=\gobble_three
+ \etxtopl{#3}{#1}
+ \record_usage{#1}
+ \installfontas{
+ \ifdim \rawfont_scaling=\p@ \else
+ [\expandafter\lose_measure\the\rawfont_scaling]~
+ \fi #1
+ }{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installraw_storemap#1#2#3{
+ \def\a_macro{#1}
+ \ifx \a_macro\out_filename \else
+ \record_transform{\out_filename}{\string\frommtx{#1}}{}\if_false
+ \fi
+}
+\def\input_metrics#1#2{
+ \let\metrics=\file_list_metrics
+ \xdef\curr_file_list{#2,}
+ \let\metrics=\x_relax
+ \ifx\prev_file_list\curr_file_list\else
+ \egroup\bgroup
+ #1
+ \expandafter\process_csep_list \expandafter\input_mtx_file
+ \curr_file_list\process_csep_list,
+ \global\let\prev_file_list=\curr_file_list
+ \fi
+}
+\def\file_list_metrics#1,{
+ \iffalse{\fi}
+ \a_toks=\expandafter{\curr_file_list\x_relax#1,}
+ \xdef\curr_file_list{\the\a_toks \iffalse}\fi
+}
+\def\installfontas#1#2#3#4#5#6{
+ \if_undefined{#2-#3-#4-#5}\then
+ \let\do_shape=\x_relax
+ \if_undefined{#2-#3}\then
+ \x_cs\let{#2-#3}\empty_command
+ \autoinstallfamily{#2}{#3}
+ \fi
+ \x_cs\xdef{#2-#3}{
+ \csname#2-#3\endcsname
+ \do_shape{#2}{#3}{#4}{#5}
+ }
+ \fi
+ \let\do_size=\x_relax
+ \x_cs\xdef{#2-#3-#4-#5}{
+ \if_defined{#2-#3-#4-#5}\then
+ \csname#2-#3-#4-#5\endcsname
+ \fi
+ \do_size{#6}{#1}
+ }
+}
+\def\autoinstallfamily#1#2{\installfamily{#1}{#2}{}}
+\def\endinstallfonts{
+ \global\let\setsomething_global=\x_relax
+ \let\do_shape=\fd_shape
+ \let\do_size=\fd_size
+ \the\family_toks
+ \global\family_toks{}
+ \egroup
+}
+\def\input_mtx_file#1{
+ \reset_modifiers_hook
+ \ifx\x_relax#1\x_relax
+ \else
+ \identity_one{\get_file_name #1~}~\par
+ \ifx \pl_encoding\empty_command
+ \fromany\file_name
+ \else
+ \metrics_given_encoding{\file_name}{\pl_encoding}
+ \fi
+ \ifisstr{afm-name}\then
+ \inputmtx{\str{afm-name}}
+ \else
+ \fontinsterror{\string\install...}{
+ Font/MTX~file~\file_name\space not~found
+ }{
+ You~can~insert~an~\string\inputmtx\space command~here
+ \messagebreak to~input~some~other~MTX~file~instead.
+ \ifisint{rawscale}\then \messagebreak
+ The~requested~raw~scaling~will~then~be~applied~on~that.
+ \fi
+ }
+ \fi
+ \fi
+}
+\def\metrics_given_encoding#1#2{
+ \x_cs\edef{s-afm-name}{#1-#2}
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1-#2}{pl}{#2}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1-#2}{vpl}{#2}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi
+}
+\def\reset_modifiers_hook{
+ \unsetint{rawscale}
+ \let\glyph_name_modifier\identity_one
+ \let\pl_encoding\empty_command
+ \let\list_of_options\empty_command
+}
+\def\get_file_name #1~{
+ \edef\file_name{#1}
+ \get_keyword
+}
+\def\get_keyword #1~{
+ \if_defined{IFKW-#1}\then
+ \csname IFKW-#1 \expandafter\endcsname
+ \else
+ \fontinsterror{\string\install...}{
+ `#1'~is~not~a~defined~keyword
+ }{
+ \error_help_a\messagebreak
+ Extra~tokens~will~be~flushed.
+ }
+ \expandafter\gobble_keywords
+ \fi
+}
+\def\gobble_keywords#1\par{}
+\x_cs\let{IFKW-}=\gobble_keywords
+\x_cs\def{IFKW-scaled}#1~{
+ \ifnum #1=\one_thousand
+ \unsetint{rawscale}
+ \else
+ \x_resetint{rawscale}{#1}
+ \fi
+ \get_keyword
+}
+\x_cs\def{IFKW-suffix}#1~{
+ \def\glyph_name_modifier##1{##1#1}
+ \get_keyword
+}
+\x_cs\def{IFKW-encoding}#1~{
+ \def\pl_encoding{#1}
+ \get_keyword
+}
+\let\pl_encoding=\empty_command
+\x_cs\def{IFKW-option}#1~{
+ \add_to\list_of_options{\do{#1}}
+}
+\def\ifoption#1\then{
+ \_a_false
+ \edef\a_macro{#1}
+ \def\do##1{
+ \if_a_ \else
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \_a_true \fi
+ \fi
+ }
+ \list_of_options
+ \if_a_
+}
+\let\list_of_options\empty_command
+\def\fd_family#1#2#3{
+ \a_toks{#3}
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1#2.fd}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~Filename:~\lowercase_file}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using~fontinst~v\fontinstversion}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~SHOULD~BE~PUT~IN~A~TEX~INPUTS~
+ DIRECTORY}
+ \out_line{}
+ \out_line{\string\ProvidesFile{\lowercase_file}}
+ \out_lline{[
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day\space
+ Fontinst~v\fontinstversion\space
+ font~definitions~for~#1/#2.
+ ]}
+ \out_line{}
+ \out_line{\string\DeclareFontFamily{#1}{#2}{\the\a_toks}}
+ {
+ \csname #1-#2\endcsname
+ \out_line{}
+ \let\do_shape=\substitute_shape
+ \csname #1-#2\endcsname
+ \let\do_shape=\remove_shape
+ \csname #1-#2\endcsname
+ }
+ \x_cs\g_let{#1-#2}\x_relax
+ \out_line{}
+ \out_line{\string\endinput}
+ \close_out{Font~definitions}
+}
+\def\fd_shape#1#2#3#4{
+ \out_line{}
+ \out_line{\string\DeclareFontShape{#1}{#2}{#3}{#4}\left_brace_char}
+ \csname #1-#2-#3-#4\endcsname
+ \x_cs\g_let{#1-#2-#3-#4}\empty_command
+ \out_line{\right_brace_char{}}
+}
+\def\fd_size#1#2{
+ \x_cs\ifx{siz-#1}\x_relax
+ \out_lline{#1~#2}
+ \else
+ \out_lline{\csname siz-#1\endcsname\space #2}
+ \fi
+}
+\def\remove_shape#1#2#3#4{
+ \x_cs\g_let{#1-#2-#3-#4}\x_relax
+}
+\def\substitute_shape#1#2#3#4{
+ \edef\orig_shape{#4}
+ \substitute_series{#1}{#2}{#3}{\orig_shape}
+ \x_cs\ifx{sub-\orig_shape}\x_relax\else
+ \edef\subst_shape{\csname sub-\orig_shape\endcsname}
+ \x_cs\ifx{#1-#2-#3-\subst_shape}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{#3}{\subst_shape}{
+ <->\csname typ-\orig_shape\endcsname\space
+ *~#2/#3/\orig_shape
+ }{}
+ }
+ \x_cs\let{#1-#2-#3-\subst_shape}\empty_command
+ \substitute_shape{#1}{#2}{#3}{\subst_shape}
+ \fi
+ \fi
+}
+\def\substitute_series#1#2#3#4{
+ \edef\orig_series{#3}
+ \x_cs\ifx{sub-\orig_series}\x_relax\else
+ \edef\subst_series{\csname sub-\orig_series\endcsname}
+ \x_cs\ifx{#1-#2-\subst_series-#4}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{\subst_series}{#4}{
+ <->\csname typ-\orig_series\endcsname\space
+ *~#2/\orig_series/#4
+ }{}
+ }
+ \x_cs\let{#1-#2-\subst_series-#4}\empty_command
+ \substitute_series{#1}{#2}{\subst_series}{#4}
+ \fi
+ \fi
+}
+\def\substitute_generic#1#2#3{
+ \edef\a_macro{#2}
+ \edef\b_macro{#3}
+ \ifx \a_macro \b_macro
+ \x_cs\let{sub-#3}\undefined_command
+ \else
+ \x_cs\let{sub-#3}\a_macro
+ \x_cs\def{typ-#3}{#1}
+ \fi
+}
+\def\substitutesilent{\substitute_generic{ssub}}
+\def\substitutenoisy{\substitute_generic{sub}}
+\substitutesilent{bx}{b}
+\substitutesilent{b}{bx}
+\substitutesilent{b}{sb}
+\substitutesilent{b}{db}
+\substitutesilent{m}{mb}
+\substitutesilent{m}{l}
+\substitutenoisy{ui}{it}
+\substitutesilent{sl}{it}
+\substitutesilent{it}{sl}
+\def\declareencoding#1#2{\x_cs\edef{enc-#1}{#2}}
+\declareencoding{TEX~TEXT}{ot1}
+\declareencoding{TEX~TEXT~WITHOUT~F-LIGATURES}{ot1}
+\declareencoding{TEX~TYPEWRITER~TEXT}{ot1tt}
+\declareencoding{TEX~MATH~ITALIC}{oml}
+\declareencoding{TEX~MATH~SYMBOLS}{oms}
+\declareencoding{TEX~MATH~EXTENSION}{omx}
+\declareencoding{LATEX~SYMBOLS}{lasy}
+\declareencoding{TEX~TEXT~SUBSET}{eufrak}
+\declareencoding{TEX~MATH~ITALIC~SUBSET}{eurm}
+\declareencoding{TEX~MATH~SYMBOLS~SUBSET}{euscr}
+\declareencoding{EULER~SUBSTITUTIONS~ONLY}{euex}
+\declareencoding{EXTENDED~TEX~FONT~ENCODING~-~LATIN}{t1}
+\declareencoding{TEX~TEXT~COMPANION~SYMBOLS~1---TS1}{ts1}
+\declareencoding{TEXBASE1ENCODING}{8r}
+\declareencoding{TEX~TYPEWRITER~AND~WINDOWS~ANSI}{8y}
+\def\declaresize#1#2{\x_cs\edef{siz-#1}{#2}}
+\declaresize{}{<->}
+\declaresize{5}{<5>}
+\declaresize{6}{<6>}
+\declaresize{7}{<7>}
+\declaresize{8}{<8>}
+\declaresize{9}{<9>}
+\declaresize{10}{<10>}
+\declaresize{11}{<10.95>}
+\declaresize{12}{<12>}
+\declaresize{14}{<14.4>}
+\declaresize{17}{<17.28>}
+\declaresize{20}{<20.74>}
+\declaresize{25}{<24.88>}
+\def\NOFILES{
+ \def\transformfont##1##2{
+ \touch_file{##1.mtx}
+ \touch_file{##1.pl}
+ }
+ \def\reglyphfont##1##2{\touch_file{##1.mtx}}
+ \def\installfonts{}
+ \def\endinstallfonts{}
+ \def\installfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.vpl}
+ }
+ \def\installrawfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.pl}
+ }
+ \def\installfamily##1##2##3{\touch_file{##1##2.fd}}
+}
+\def\touch_file#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~TEST~FILE.}
+ \out_line{\percent_char~Created~whilst~debugging~fontinst.}
+ \close_out{Test~file}
+}
+%%% From file: fitrig.dtx
+\chardef\nin@ty=90
+\chardef\@clxxx=180
+\chardef\@lxxi=71
+\mathchardef\@mmmmlxviii=4068
+\chardef\@coeffz=72
+\chardef\@coefb=42
+\mathchardef\@coefc=840
+\mathchardef\@coefd=5040
+\def\TG@rem@pt#1{\expandafter\lose_measure\the#1\space}
+\def\TG@term#1{
+ \dimen@\@tempb\dimen@
+ \advance\dimen@ #1\p@
+}
+\def\TG@series{
+ \dimen@\@lxxi\dimen@
+ \divide \dimen@ \@mmmmlxviii
+ \edef\@tempa{\TG@rem@pt\dimen@}
+ \dimen@\@tempa\dimen@
+ \edef\@tempb{\TG@rem@pt\dimen@}
+ \divide\dimen@\@coeffz
+ \advance\dimen@\m@ne\p@
+ \TG@term\@coefb
+ \TG@term{-\@coefc}%
+ \TG@term\@coefd
+ \dimen@\@tempa\dimen@
+ \divide\dimen@ \@coefd
+}
+\def\CalculateSin#1{{%
+ \if_undefined{sin(\number#1)}\then
+ \dimen@=#1\p@
+ \TG@@sin
+ \x_cs\xdef{sin(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\CalculateCos#1{{%
+ \if_undefined{cos(\number#1)}\then
+ \dimen@=\nin@ty\p@
+ \advance \dimen@ -#1\p@
+ \TG@@sin
+ \x_cs\xdef{cos(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+\def\TG@@sin{%
+ \ifdim\TG@reduce>+%
+ \else\ifdim\TG@reduce<-%
+ \else\TG@series\fi\fi
+}
+\def\TG@reduce#1#2{
+ \dimen@#1#2\nin@ty\p@
+ \advance\dimen@#2-\@clxxx\p@
+ \dimen@-\dimen@
+ \TG@@sin
+}
+\def\UseSin#1{\csname sin(\number#1)\endcsname}
+\def\UseCos#1{\csname cos(\number#1)\endcsname}
+\chardef\z@num\z@
+\x_cs\let{sin(0)} \z@num
+\x_cs\let{cos(0)} \@ne
+\x_cs\let{sin(90)} \@ne
+\x_cs\let{cos(90)} \z@num
+\x_cs\let{sin(-90)}\m@ne
+\x_cs\let{cos(-90)}\z@num
+\x_cs\let{sin(180)}\z@num
+\x_cs\let{cos(180)}\m@ne
+\def\CalculateTan#1{{%
+ \if_undefined{tan(\number#1)}\then
+ \CalculateSin{#1}%
+ \CalculateCos{#1}%
+ \a_dimen\UseCos{#1}\p@
+ \divide \a_dimen \@iv
+ \b_dimen\UseSin{#1}\p@
+ \b_dimen\two@fourteen\b_dimen
+ \divide\b_dimen\a_dimen
+ \x_cs\xdef{tan(\number#1)}{\TG@rem@pt\b_dimen}
+ \fi
+}}
+\def\UseTan#1{\csname tan(\number#1)\endcsname}
+\mathchardef\two@fourteen=16384
+\chardef\@iv=4
+\x_cs\def{tan(90)}{\errmessage{Infinite tan !}}
+\expandafter\let
+ \csname tan(-90)\expandafter\endcsname \csname tan(90)\endcsname
+%%% From file: ficonv.dtx
+\def\afmtomtx#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \edef\source_font_name{#1}
+ \x_resetint{italicslant}{0}
+ \let\italcorr_expression=\uprightitalcorr
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.afm~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\^^M=12
+ \catcode`\ =10
+ \expandafter\afm_line\primitiveinput #1.afm\x_relax
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}}
+\newcount\minimum_kern
+\def\afm_length#1#2{
+ \a_dimen=#2\afm_unit_dimen
+ #1=\a_dimen
+ \divide #1 by \afm_unit_dimen
+ \advance \a_dimen by -#1\afm_unit_dimen
+ \ifdim \a_dimen>0.5\afm_unit_dimen
+ \advance #1 by 1
+ \else \ifdim \a_dimen<-0.5\afm_unit_dimen
+ \advance #1 by -1
+ \fi\fi
+ \x_relax
+}
+\newdimen\afm_unit_dimen
+\afm_unit_dimen=1000sp
+{\catcode`\^^M=12 \gdef\afm_line#1
+{\afm_command#1~\end_of_line\afm_line}}
+\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line}
+\def\gobble_one_line#1\end_of_line{}
+\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput}
+\def\afm_def#1(#2)#3{
+ \x_cs\def{afm-#1}\gobble_one_line#2\end_of_line{#3}
+}
+\def\afm_let#1#2{
+ \expandafter\let \csname afm-#1\expandafter\endcsname
+ \csname afm-#2\endcsname
+}
+\afm_def{CharWidth}(#1){\afm_length\char_x_width{#1}}
+\afm_def{ItalicAngle}(#1~){\calculate_it_slant{#1}}
+\afm_def{XHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{xheight}{\the\a_count}}}
+\afm_def{CapHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{capheight}{\the\a_count}}}
+\afm_def{Ascender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{ascender}{\the\a_count}}}
+\afm_def{Descender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{descender_neg}{\the\a_count}}}
+\afm_def{UnderlineThickness}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{underlinethickness}{\the\a_count}}}
+\afm_def{FontBBox}(#1~#2~#3~#4){
+ \afm_length\a_count{#4}
+ \out_line{\string\setint{maxheight}{\the\a_count}}
+ \afm_length\a_count{#2}
+ \out_line{\string\setint{maxdepth_neg}{\the\a_count}}}
+\afm_def{StdVW}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{verticalstem}{\the\a_count}}}
+\afm_def{IsFixedPitch}(#1){
+ \if\first_char#1=f
+ \else\out_line{\string\setint{monowidth}{1}}
+ \fi
+}
+\afm_def{FontName}(#1~){
+ \record_transform{\raw_font_name}
+ {\string\fromafm{\source_font_name}{#1}}{}\iftrue
+}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \afm_length\a_count{#3}
+ \ifnum \a_count>\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \else\ifnum \a_count<-\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \fi\fi
+ \fi\fi
+}
+\afm_let{KPX}{KP}
+\def\afm_write_setkern#1#2#3{\out_line{\string\setkern{#1}{#2}{#3}}}
+\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+\afm_def{CH}(<#1>~;#2){\uppercase{\init_afm{"#1}}\do_list[#2]\afm_char}
+\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char}
+\newcount\char_slot
+\newcount\char_x_width
+\newcount\x_width
+\newcount\bbox_llx
+\newcount\bbox_lly
+\newcount\bbox_urx
+\newcount\bbox_ury
+\let\char_name=\empty_command
+\def\init_afm#1{
+ \char_slot=#1\x_relax
+ \x_width=\char_x_width
+ \bbox_llx=0
+ \bbox_lly=0
+ \bbox_urx=0
+ \bbox_ury=0
+ \let\char_name=\empty_command
+}
+\def\afm_char{
+ \eval_expr{
+ \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury
+ }
+ \out_line{
+ \ifnum -1<\char_slot
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\number -\bbox_lly}
+ {\the\result}
+ }
+}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{#1}}
+ \def\char_name{#1}
+}
+\def\cc_char{%
+ \out_lline{\string\samesize{\char_name-not}}
+ \out_line{\string\endsetglyph}
+}
+\def\uprightitalcorr#1#2#3#4#5{0}
+\def\slanteditalcorr#1#2#3#4#5{\max{\sub{#3}{#1}}{0}}
+\def\calculate_it_slant#1{
+ \edef\theangle{#1}
+ \CalculateTan{\theangle}
+ \a_dimen=-\one_thousand sp
+ \a_dimen=\UseTan{\theangle}\a_dimen
+ \a_count=\a_dimen
+ \out_line{\string\setint{italicslant}{\the\a_count}}
+ \x_resetint{italicslant}{\a_count}
+ \ifnum 0<\a_count
+ \let\italcorr_expression=\slanteditalcorr
+ \else
+ \let\italcorr_expression=\uprightitalcorr
+ \fi
+}
+\def\do_list[~#1~#2;~#3]{
+ \csname~list-#1\endcsname\gobble_one_semi#2;
+ \ifx\x_relax#3\x_relax\expandafter\gobble_one
+ \else\expandafter\identity_one\fi
+ {\do_list[~#3]}
+}
+\def\gobble_one_semi#1;{}
+\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}}
+\list_def{W}(#1~#2){\afm_length\x_width{#1}}
+\list_def{WX}(#1){\afm_length\x_width{#1}}
+\list_def{WY}(#1){}
+\list_def{N}(#1){\def\char_name{#1}}
+\list_def{B}(#1~#2~#3~#4){
+ \afm_length\bbox_llx{#1}
+ \afm_length\bbox_lly{#2}
+ \afm_length\bbox_urx{#3}
+ \afm_length\bbox_ury{#4}
+}
+\list_def{PCC}(#1~#2~#3){
+ \afm_length\a_count{#2}
+ \afm_length\b_count{#3}
+ \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}}
+}
+\def\definealias#1#2#3{
+ \expandafter\def \csname GN-#1 \expandafter\endcsname
+ \expandafter{ \csname g-#2 \expandafter\endcsname
+ \csname i-#3\endcsname}
+}
+\def\glyph_alias#1{
+ \expandafter\expandafter \expandafter\glyph_alias_i
+ \csname GN-#1\endcsname
+}
+\def\glyph_alias_i#1#2{
+ \expandafter\gobble_three \string#1
+}
+\let\charnameprefix\empty
+\def\charnamealias#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \glyph_alias{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \glyph_alias{#1}
+ \else
+ #1
+ \fi\fi
+}
+\def\alias_incr#1{
+ \expandafter\expandafter \expandafter\alias_incr_i
+ \csname GN-#1\endcsname
+}
+\def\alias_incr_i#1#2{
+ \ifx#2\x_relax
+ \mathchardef#2=\@ne
+ \else
+ \a_count=#2
+ \advance\a_count\@ne
+ \mathchardef#2=\a_count
+ \fi
+}
+\def\alias_char_name#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{\charnameprefix#1}}
+ }
+ \alias_incr{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{#1}}
+ }
+ \alias_incr{#1}
+ \else
+ \edef\char_name{#1}
+ \fi\fi
+}
+\def\autoaliasafm{
+ \begingroup
+ \list_def{N}(##1){\alias_char_name{##1}}
+ \def\afm_write_setkern##1##2##3{
+ \out_line{
+ \string\setkern{\charnamealias{##1}}{\charnamealias{##2}}{##3}
+ }
+ }
+ \def\init_cc##1{%
+ \edef\char_name{\charnamealias{##1}}
+ \out_line{\string\setglyph{\char_name}}
+ }
+ \list_def{PCC}(##1~##2~##3){
+ \afm_length\a_count{##2}
+ \afm_length\b_count{##3}
+ \out_lline{\string\glyphpcc
+ {\charnamealias{##1}}{\the\a_count}{\the\b_count}}
+ }
+}
+\def\endautoaliasafm{\endgroup}
+\def\generalpltomtx#1#2#3#4{{
+ \let\setsomething_global=\x_relax
+ \let\setfontdimen=\pl_setfontdimen
+ \if _#4_ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \inputetx{#4}
+ \let\CODINGSCHEME=\ignore_parens
+ \fi
+ \pl_to_mtx{#1}{#2}{#3}{\string\generalpltomtx{#1}{#2}{#3}{#4}}
+}}
+\def\pltomtx#1#2{\generalpltomtx{#1}{#2}{pl}{}}
+\def\pl_to_mtx#1#2#3#4{
+ \edef\raw_font_name{#1}
+ \open_out{\temp_prefix#2.mtx}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~#4}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.#3~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \lowercase{
+ \record_transform{#2}{
+ \string\from#3 \x_cs\ifx{from#3}\frompl {#1} \fi
+ }{}\iftrue
+ }
+ \out_line{}
+ \catcode`\(=0 \catcode`\)=9
+ \let\/=\ignore_parens
+ \let\do_pl_glyph=\x_relax
+ \primitiveinput #1.#3\x_relax
+ \do_pl_glyph
+ \out_line{}
+ \ifisint{\percent_char boundarychar}\then
+ \f_count=\int{\percent_char boundarychar}
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setstr{rightboundary}
+ {\csname name-\the\f_count\endcsname}
+ }
+ \out_line{}
+ \fi
+ \fi
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}
+\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \x_relax
+ \expandafter\expandafter\expandafter\gobble_parens
+ \iftrue\expandafter{\else}\fi}
+\def\gobble_parens#1{\egroup}
+\def\pl_real#1{\pl_realer(#1000)}
+\def\pl_realer(#1.#2#3#4#5){#1#2#3#4}
+\def\pl_rounded_real(#1.#2#3#4#5){
+ \global\result=#1#2#3#4\relax
+ \ifnum \first_char#5= >4
+ \global\advance \result
+ \if - \first_char#1= \m@ne \else \@ne \fi
+ \fi
+}
+\def\pl_int#1#2{
+ \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else -1\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+\let\FAMILY=\ignore_parens
+\let\FACE=\ignore_parens
+\let\CHECKSUM=\ignore_parens
+\def\HEADER~#1~#2~#3~#4~{}
+\def\SEVENBITSAFEFLAG~#1~{}
+\let\COMMENT=\ignore_parens
+\let\LIG=\ignore_parens
+\let\NEXTLARGER=\ignore_parens
+\let\VARCHAR=\ignore_parens
+\let\VTITLE=\ignore_parens
+\let\MAPFONT=\ignore_parens
+\let\MAP=\ignore_parens
+\def\CODINGSCHEME{\bgroup\catcode`\)=12\x_relax\CODINGSCHEME_cont}
+\def\CODINGSCHEME_cont#1){
+ \egroup
+ \if_undefined{enc-#1}\then
+ \errhelp{The~encoding~for~`#1'~has~not~been~declared.^^J
+ You~should~declare~it~with~
+ \string\declareencoding{#1}{ETXFILE}.^^J
+ Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J
+ or~X~<RETURN>~to~exit.}
+ \errmessage{Undeclared~encoding~`#1'}
+ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \catcode`\(=12 \catcode`\)=12
+ \x_cs\inputetx{enc-#1}\x_relax
+ \catcode`\(=0 \catcode`\)=9
+ \fi
+}
+\def\DESIGNSIZE~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designsize}{\the\a_dimen}}
+}
+\def\DESIGNUNITS~#1~#2~{
+ \b_dimen=#2pt\x_relax
+ \ifdim 1pt=\b_dimen \else
+ \fontinsterror{PL-to-MTX}{Nondefault~unit~used~in~PL~file}
+ {You~may~continue,~but~the~metrics~for~this~font~will~be~wrong.}
+ \fi
+ \out_line{\string\setdim{designunits}{\the\b_dimen}}
+}
+\def\BOUNDARYCHAR~#1~#2~{
+ \x_setint{\percent_char boundarychar}{\pl_int{#1}{#2}}
+}
+\def\pl_setfontdimen#1#2{\x_cs\def{fdimen-#1}{#2}}
+\def\PARAMETER~#1~#2~R~#3~{
+ \f_count=\pl_int{#1}{#2}\x_relax
+ \if_defined{fdimen-\the\f_count}\then
+ \pl_rounded_real(#3 0000)
+ \out_line{\string\setint{\csname fdimen-\the\f_count\endcsname}
+ {\the\result}}
+ \fi
+}
+\let\FONTDIMEN=\x_relax
+\def\SLANT{\PARAMETER D~1~}
+\pl_setfontdimen{1}{italicslant}
+\def\SPACE{\PARAMETER D~2~}
+\pl_setfontdimen{2}{interword}
+\def\STRETCH{\PARAMETER D~3~}
+\pl_setfontdimen{3}{stretchword}
+\def\SHRINK{\PARAMETER D~4~}
+\pl_setfontdimen{4}{shrinkword}
+\def\XHEIGHT{\PARAMETER D~5~}
+\pl_setfontdimen{5}{xheight}
+\def\QUAD{\PARAMETER D~6~}
+\pl_setfontdimen{6}{quad}
+\def\EXTRASPACE{\PARAMETER D~7~}
+\pl_setfontdimen{7}{extraspace}
+\def\NUM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~8~#2~#3~
+ \or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \fi
+}
+\def\DENOM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \fi
+}
+\def\SUP#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~13~#2~#3~
+ \or
+ \PARAMETER D~14~#2~#3~
+ \or
+ \PARAMETER D~15~#2~#3~
+ \fi
+}
+\def\SUB#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~16~#2~#3~
+ \or
+ \PARAMETER D~17~#2~#3~
+ \fi
+}
+\def\SUPDROP{\PARAMETER D~18~}
+\def\SUBDROP{\PARAMETER D~19~}
+\def\AXISHEIGHT{\PARAMETER D~22~}
+\def\DELIM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~20~#2~#3~
+ \or
+ \PARAMETER D~21~#2~#3~
+ \fi
+}
+\def\DEFAULTRULETHICKNESS{\PARAMETER D~8~}
+\def\BIGOPSPACING#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \or
+ \PARAMETER D~13~#2~#3~
+ \fi
+}
+\def\LABEL~#1{\ifx #1B
+ \expandafter\LABEL_boundarychar
+ \else
+ \expandafter\LABEL_slot \expandafter#1
+ \fi
+}
+\def\LABEL_slot #1~#2~{
+ \f_count=\pl_int{#1}{#2}
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-\the\f_count}
+ }
+}
+\def\LABEL_boundarychar OUNDARYCHAR{
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-BOUNDARYCHAR}
+ }
+}
+\def\do_if_defined#1{\ifx #1\x_relax \else \do{#1} \fi}
+\def\LIGTABLE{\let\do=\never_do\let\a_macro\empty_command}
+\def\STOP{\let\a_macro\empty_command}
+\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}}
+\def\KRN~#1~#2~R~#3~{
+ \pl_rounded_real(#3 0000)
+ \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\the\result}}
+ \a_macro
+ \let\do=\never_do
+}
+\def\write_pl_krn#1#2#3{
+ \f_count=#1\x_relax
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setkern{#3}
+ {\csname name-\the\f_count\endcsname}{#2}
+ }
+ \fi
+}
+\def\CHARWD~R~#1~{\pl_rounded_real(#1 0000) \b_count=\result}
+\def\CHARHT~R~#1~{\pl_rounded_real(#1 0000) \c_count=\result}
+\def\CHARDP~R~#1~{\pl_rounded_real(#1 0000) \d_count=\result}
+\def\CHARIC~R~#1~{\pl_rounded_real(#1 0000) \e_count=\result}
+\def\CHARACTER~#1~#2~{
+ \do_pl_glyph
+ \a_count=\pl_int{#1}{#2}
+ \b_count=0
+ \c_count=0
+ \d_count=0
+ \e_count=0
+ \let\do_pl_glyph=\write_pl_glyph
+}
+\def\write_pl_glyph{
+ \x_cs\ifx{name-\the\a_count}\x_relax\else
+ \out_line{\string\setrawglyph
+ {\csname~name-\the\a_count\endcsname}
+ {\raw_font_name}
+ {\the\a_dimen}
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\the\e_count}}
+ \fi
+ }
+\def\mtxtopl#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{#2.pl}
+ \top_of_pl_hook
+ \out_line{(COMMENT~raw~font~#2~created~by~fontinst~
+ v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.pl)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~
+ a~ligless~TeX~font~with)}
+ \out_line{(COMMENT~pltotf~#2.pl~#2.tfm)}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \out_line{(DESIGNSIZE~R~10.0)}
+ \out_line{}
+ \let\setglyph=\iffalse
+ \let\endsetglyph=\fi
+ \let\setkern=\gobble_three
+ \let\setscaledrawglyph=\first_pl_raw_glyph
+ \def\setscalednotglyph##1##2##3##4##5##6##7##8##9{}
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.pl)}
+ \close_out{Raw~font}
+}}
+\def\first_pl_raw_glyph#1#2#3#4{
+ \out_line{(DESIGNUNITS~R~\make_factor{#4})}
+ \let\setscaledrawglyph=\pl_raw_glyph
+ \pl_raw_glyph{#1}{#2}{#3}{#4}
+}
+\def\pl_raw_glyph#1#2#3#4#5#6#7#8#9{
+ \out_line{(CHARACTER~D~\number#5~\space(COMMENT~#1)}
+ \out_lline{(CHARWD~R~\make_factor{#6})}
+ \out_lline{(CHARHT~R~\make_factor{#7})}
+ \out_lline{(CHARDP~R~\make_factor{#8})}
+ \out_lline{(CHARIC~R~\make_factor{#9})}
+ \out_lline{)}
+}
+\def\transformfont#1#2{{
+ \let\setsomething_global=\x_relax
+ \unsetstr{afm-name}
+ \unsetstr{etx-name}
+ \x_resetint{x-scale}{\one_thousand}
+ \x_resetint{y-scale}{\one_thousand}
+ \x_resetint{slant-scale}{0}
+ #2
+ \ifisstr{afm-name}\then
+ \mtxtomtx{\str{afm-name}}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \fontinsterror{Transformfont}{
+ Failed~to~make~transformed~font~#1;\messagebreak
+ source~font~metrics~file~not~found
+ }\error_help_a
+ \fi
+}}
+\def\fromafm#1{
+ \if_file_exists{#1.afm}\then
+ \x_setstr{afm-name}{#1}
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \fi
+}
+\def\frommtx#1{
+ \if_file_exists{#1.mtx}\then \x_setstr{afm-name}{#1} \fi
+}
+\def\frompl#1{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{}
+ \fi
+}
+\def\fromplgivenetx#1#2{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{#2}
+ \fi
+}
+\def\fromany#1{
+ \x_cs\edef{s-afm-name}{#1}
+ \if_file_exists{#1.mtx}\then\else
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1}{pl}{}
+ \else
+ \if_file_exists{#1.afm}\then
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1}{vpl}{}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi\fi\fi
+}
+\def\scalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{x-scale}{\scale{\d_count}{\int{x-scale}}}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\xscalefont#1#2{
+ \x_resetint{x-scale}{\scale{#1}{\int{x-scale}}}
+ #2
+}
+\def\yscalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\slantfont#1#2{
+ \x_resetint{slant-scale}{
+ \add{\scale{#1}{\int{x-scale}}}{\int{slant-scale}}
+ }
+ #2
+}
+\def\reencodefont#1#2{
+ #2
+ \resetstr{etx-name}{#1}
+}
+\def\mtxtomtx#1#2{{
+ \let\a_macro=\empty_command
+ \_a_true
+ \ifnum \int{x-scale}=\int{y-scale}
+ \ifnum \int{slant-scale}=\z@
+ \_a_false
+ \fi \fi
+ \if_a_
+ \a_count=\int{x-scale}
+ \l_inv_scale\a_count{\int{y-scale}}
+ \b_count=\int{slant-scale}
+ \l_inv_scale\b_count{\int{y-scale}}
+ \edef\a_macro{\a_macro
+ \string\transformfont{\the\a_count}{\the\b_count}
+ }
+ \fi
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \ifisstr{etx-name}\then
+ \def\do_slot{\x_cs\edef{slots-\slot_name}{\the\slot_number}}
+ \def\declarepsencoding##1##2##3{
+ \a_toks={{##1}{##2}{##3}}
+ \out_line{\string\providepsencoding\the\a_toks}
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file
+ {\string\providepsencoding\the\a_toks}
+ \fi
+ }
+ \directfalse
+ \inputetx{\str{etx-name}}
+ \edef\a_macro{\a_macro\string\reencodefont{\str{etx-name}}}
+ \fi
+ \record_transform{#2}{\string\frommtx{#1}}{\a_macro}\iftrue
+ \out_line{}
+ \mtxtomtx_redefinitions
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Transformed~metrics}
+}}
+\def\mtxtomtx_redefinitions{
+ \let\setint=\mtxtomtx_setint
+ \let\setdim=\mtxtomtx_setdim
+ \let\setstr=\mtxtomtx_setstr
+ \let\setscaledrawglyph=\mtxtomtx_setscaledrawglyph
+ \let\setscalednotglyph=\mtxtomtx_setscaledrawglyph
+ \let\setkern=\mtxtomtx_setkern
+ \let\setglyph=\mtxtomtx_setglyph
+ \let\glyphpcc=\mtxtomtx_glyphpcc
+ \let\samesize=\mtxtomtx_samesize
+ \let\endsetglyph=\mtxtomtx_endsetglyph
+ \def\aliased{\string\aliased}
+}
+\let\aliased=\second_of_two
+\def\mtxtomtx_setint#1#2{
+ \def\a_macro{#1}
+ \ifx \a_macro\italicslant_name
+ \eval_expr{#2}
+ \global\multiply \result \int{x-scale}
+ \a_count=\int{slant-scale}
+ \multiply \a_count \one_thousand
+ \advance \a_count \result
+ \divide \a_count \int{y-scale}\x_relax
+ \else
+ \def\do##1{
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \expandafter\if_false \fi
+ }
+ \gobble_one\iftrue \width_ints_list \if_true
+ \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}}
+ \else
+ \eval_expr_to\a_count{\scale{#2}{\int{x-scale}}}
+ \fi
+ \fi
+ \out_line{\string\setint{#1}{\the\a_count}}
+}
+\def\italicslant_name{italicslant}
+\def\width_ints_list{
+ \do{interword}\do{stretchword}\do{shrinkword}\do{quad}
+ \do{extraspace}\do{digitwidth}\do{verticalstem}
+}
+\def\mtxtomtx_setdim#1#2{
+ \out_line{\string\setdim{#1}{#2}}
+}
+\def\mtxtomtx_setstr#1#2{
+ \out_line{\string\setstr{#1}{#2}}
+}
+\def\mtxtomtx_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \eval_expr_to\a_count{\scale{#6}{\int{x-scale}}}
+ \eval_expr_to\b_count{\scale{#7}{\int{y-scale}}}
+ \eval_expr_to\c_count{\scale{#8}{\int{y-scale}}}
+ \eval_expr_to\d_count{#9} \eval_expr{#7}
+ \multiply \d_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \d_count
+ \rounded_thousandths
+ \d_count=\result
+ \eval_expr{\scale{#4}{\int{y-scale}}}
+ \ifisstr{etx-name}\then
+ \bgroup
+ \let\aliased=\first_of_two
+ \if_undefined{slots-#1}\then
+ \egroup \e_count=\m@ne
+ \else
+ \expandafter\egroup \expandafter\e_count
+ \csname slots-#1\endcsname
+ \fi
+ \else
+ \e_count=#5
+ \fi
+ \out_line{
+ \ifnum \e_count>\m@ne
+ \string\setscaledrawglyph
+ \else
+ \string\setscalednotglyph
+ \fi
+ {#1}{\raw_font_name}{#3}{\the\result}{\the\e_count}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+\def\mtxtomtx_setkern#1#2#3{
+ \eval_expr{\scale{\int{x-scale}}{#3}}
+ \out_line{\string\setkern{#1}{#2}{\the\result}}
+}
+\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}}
+\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}}
+\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}}
+\def\mtxtomtx_glyphpcc#1#2#3{
+ \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}}
+ \eval_expr_to\a_count{#2} \eval_expr{#3}
+ \multiply \a_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \a_count
+ \rounded_thousandths
+ \out_lline{\string\glyphpcc{#1}{\the\result}{\the\b_count}}
+}
+\def\reglyphfonts{
+ \begingroup
+ \let\setsomething_global=\x_relax
+ \x_setint{renameweight}{1}
+ \x_setint{killweight}{-10}
+ \setcommand\iftokeep##1\then{\ifnum -1<##1}
+}
+\def\endreglyphfonts{\endgroup}
+\def\offmtxcommand#1{
+ \x_cs\offcommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\def\onmtxcommand#1{
+ \x_cs\oncommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\renameglyph#1#2{
+ \x_cs\edef{slots-#2}{
+ \noexpand\rename_glyph{#1}\noexpand\i-renameweight
+ }
+ }
+\endgroup
+\def\renameglyphweighted#1#2#3{
+ \eval_expr{#3}
+ \x_cs\edef{slots-#2}{\noexpand\rename_glyph{#1}{\the\result}}
+}
+\begingroup
+ \catcode`\-=11
+ \gdef\killglyph#1{
+ \x_cs\def{slots-#1}{\kill_glyph\i-killweight}
+ }
+\endgroup
+\def\killglyphweighted#1#2{
+ \eval_expr{#2}
+ \x_cs\edef{slots-#1}{\noexpand\kill_glyph{\the\result}}
+}
+\def\reglyphfont#1#2{
+ \fromany{#2}
+ \ifisstr{afm-name}\then
+ \reglyph_font{#1}{#2}
+ \else
+ \fontinsterror{Reglyph}{Could~not~find~font~metrics~for~#2.}
+ \error_help_a
+ \fi
+}
+\def\reglyph_font#1#2{{
+ \open_out{\temp_prefix#1.mtx}
+ \out_line{\percent_char~Filename:~#1.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\reglyphfont{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \record_transform{#1}{\string\frommtx{#2}}{\string\reglyphfont}
+ \iftrue
+ \out_line{}
+ \reglyph_redefinitions
+ \inputmtx{#2}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Reglyphed~metrics}
+}}
+\def\reglyph_redefinitions{
+ \let\setint=\reglyph_setint
+ \let\setdim=\reglyph_setdim
+ \let\setstr=\reglyph_setstr
+ \let\setscaledrawglyph=\reglyph_setscaledrawglyph
+ \let\setscalednotglyph=\reglyph_setscaledrawglyph
+ \let\setkern=\reglyph_setkern
+ \let\setglyph=\reglyph_setglyph
+ \let\glyphpcc=\reglyph_glyphpcc
+ \let\samesize=\reglyph_samesize
+ \let\endsetglyph=\reglyph_endsetglyph
+}
+\def\reglyph_setint#1#2{\out_line{\string\setint{#1}{#2}}}
+\def\reglyph_setdim#1#2{\out_line{\string\setdim{#1}{#2}}}
+\def\reglyph_setstr#1#2{\out_line{\string\setstr{#1}{#2}}}
+\newcount\command_survivance
+\def\rename_glyph#1{\def\glyphname{#1}\kill_glyph}
+\def\kill_glyph#1{\advance \command_survivance #1\x_relax}
+\def\reglyph_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{
+ \ifnum #5<\z@
+ \string\setscalednotglyph
+ \else
+ \string\setscaledrawglyph
+ \fi
+ {\glyphname}{#2}{#3}{\number#4}{#5}{#6}{#7}{#8}{#9}
+ }
+ \fi
+}
+\def\reglyph_setkern#1#2#3{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \let\a_macro=\glyphname
+ \def\glyphname{#2}
+ \csname slots-#2\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{\string\setkern{\a_macro}{\glyphname}{#3}}
+ \fi
+}
+\def\reglyph_setglyph#1{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_line{\string\setglyph{\glyphname}}}
+ \a_toks=\expandafter{\a_macro}
+}
+\x_cs\def{off-\string\reglyph_setglyph}#1{\gobble_glyph}
+\def\reglyph_glyphpcc#1#2#3{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\glyphpcc{\glyphname}{#2}{#3}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_samesize#1{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\samesize{\glyphname}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+\def\reglyph_endsetglyph{
+ \iftokeep\command_survivance\then
+ \the\a_toks
+ \out_line{\string\endsetglyph}
+ \fi
+ \a_toks={}
+}
+%%% From file: filtfam.dtx
+\def\latinfamily#1#2{{
+ \edef\a_macro{#1}
+ \expandafter\parse_family\a_macro
+ \empty_command\empty_command\end_parse_family
+ \installfonts
+ \if_file_exists{\raw_encoding.mtx}\then
+ \installfamily{\raw_encoding}{\latex_family}{#2}
+ \fi
+ \installfamily{OT1}{\latex_family}{#2}
+ \installfamily{T1}{\latex_family}{#2}
+ \installfamily{TS1}{\latex_family}{#2}
+ \latin_weights
+ \endinstallfonts
+}}
+\def\parse_family #1#2#3#4#5\end_parse_family{
+ \gdef\font_family{#1#2#3}
+ \gdef\font_variant{#4#5}
+ \gdef\raw_variant{#4#5}
+ \gdef\latex_family{#1#2#3#4#5}
+ \_expert_false
+ \_oldstyle_false
+ \ifx#4x
+ \_expert_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1}
+ \else\ifx#4j
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else\ifx#49
+ \gdef\latex_family{#1#2#3j#5}
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else
+ \_expert_false
+ \_oldstyle_false
+ %\setcommand\digit##1{##1}
+ \fi\fi\fi
+ \if_oldstyle_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(oldstyle)}
+ \else\if_expert_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(expert)}
+ \else
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#4#5>}
+ \fi\fi
+}
+\newif\if_expert_
+\newif\if_oldstyle_
+\def\latin_weight#1#2{
+ \gdef\font_weight{#1}%
+ \gdef\latex_weight{#2}%
+ \latin_widths
+}
+\def\latin_width#1#2{
+ \gdef\font_width{#1}
+ \gdef\latex_width{#2}
+ \latin_shapes
+}
+\def\latin_shape#1#2#3#4#5{
+ \gdef\font_shape{#1}
+ \gdef\raw_shape{#2}
+ \gdef\encoding_shape{#3}
+ \if_oldstyle_
+ \gdef\encoding_shape{#3\oldstyle_shape}
+ \fi
+ \gdef\latex_shape{#4}
+ \gdef\encoding_switches{#5}
+ \immediate\write16{
+ INFO>~to~make~LaTeX~font~shape~<\latex_family,
+ \latex_weight,\latex_shape,\latex_width>~seek~
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx}
+ \csname fake_width_\font_width\endcsname
+ \csname fake_shape_\raw_shape\endcsname
+ \if_file_exists{
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \latin_encodings
+ \fi
+}
+\def\fake_shape_{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_raw_encoding
+ \fi
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.afm
+ }\then
+ \fake_shape_expert_encoding
+ \fi
+ \fi
+ \if_oldstyle_
+ \gdef\oldstyle_variant{\oldstyle_shape}
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_oldstyle_encoding
+ \else
+ \gdef\oldstyle_variant{\caps_shape}
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_oldstyle_encoding
+ \fi
+ \fi
+ \fi
+}
+\def\fake_shape_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width>
+ }
+ \transformfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+}
+\def\fake_shape_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width
+ }
+ \fi
+}
+\def\fake_shape_oldstyle_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width>
+ }
+ \transformfont{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \fi
+}
+\def\fake_shape_c{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ % If real smallcaps font doesn't exist, fake it from the roman.
+ \gdef\raw_shape{}
+ \if_oldstyle_
+ \gdef\encoding_shape{cj}
+ \else
+ \gdef\encoding_shape{c}
+ \fi
+ \fake_shape_
+ \fi
+}
+\def\fake_shape_o{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ \fake_shape_o_raw_encoding
+ \if_expert_
+ \fake_shape_o_expert_encoding
+ \fi
+ \if_oldstyle_
+ \fake_shape_o_oldstyle_encoding
+ \fi
+ \fi
+}
+\def\fake_shape_o_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_shape_o_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \expert_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\def\fake_shape_o_oldstyle_encoding{
+ \if_file_exists{
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\let\fake_shape_i\fake_shape_ % We must do this again!
+\newif\if_fake_narrow_
+\_fake_narrow_false
+\def\fakenarrow#1{
+ \_fake_narrow_true
+ \gdef\fake_narrow_width{#1}
+}
+\def\fake_width_{}
+\def\fake_width_c{}
+\def\fake_width_n{
+ \if_fake_narrow_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then % no action required
+ \else
+ \fake_width_n_raw_encoding
+ \if_expert_
+ \fake_width_n_expert_encoding
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+\def\fake_width_n_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding>~(faking~narrow)
+ }
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ }
+ }
+ \fi
+ \fi
+}
+\def\latin_encoding#1#2#3#4#5{
+ \gdef\latex_encoding{#4}
+ \gdef\latex_mtx{#5}
+ \if_oldstyle_
+ \gdef\font_encoding{#3}
+ \else\if_expert_
+ \gdef\font_encoding{#2}
+ \else
+ \gdef\font_encoding{#1}
+ \fi\fi
+ \gdef\expert_font{}
+ \gdef\oldstyle_font{}
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \gdef\expert_font{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width,
+ }
+ \fi
+ \fi
+ \if_oldstyle_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \gdef\oldstyle_font{
+ unsetnum,
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_variant\raw_encoding\font_width,
+ resetosf,
+ }
+ \fi
+ \fi
+ \immediate\write16{
+ INFO>~run~\string\installfont\space
+ <\font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx>
+ <\latex_encoding\encoding_shape>
+ <\latex_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+ \installfont{
+ \font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width
+ }{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx
+ }{
+ \latex_encoding\encoding_shape
+ }{
+ \latex_encoding
+ }{
+ \latex_family
+ }{
+ \latex_weight\latex_width
+ }{
+ \latex_shape
+ }{}
+}
+\def\latin_weights{
+ \latin_weight{r}{m}
+ \latin_weight{k}{m}
+ \latin_weight{b}{b}
+ \latin_weight{s}{sb}
+ \latin_weight{d}{db} % was {d}{sb}, SPQR changed
+ \latin_weight{m}{mb} % was {m}{m}, UV changed
+ \latin_weight{c}{eb} % UV added
+ \latin_weight{h}{eb} % UV added
+ \latin_weight{x}{eb}
+ \latin_weight{u}{ub}
+ \latin_weight{l}{l}
+ %\latin_weight{j}{el}
+ %\latin_weight{a}{ul} % UV added
+}
+\def\latin_widths{
+ \latin_width{}{}
+ \latin_width{n}{c}
+ %latin_width{c}{c}
+ %latin_width{x}{x}
+}
+\def\latin_shapes{
+ \latin_shape{} {} {} {n} {\_textcomp_true }
+ \latin_shape{c}{c}{} {sc}{\_textcomp_false}
+ \latin_shape{o}{o}{} {sl}{\_textcomp_true }
+ \latin_shape{i}{i}{i}{it}{\_textcomp_true }
+}
+\def\latin_encodings{
+ \latin_encoding{7t}{9t}{9o}{OT1}{newlatin}
+ \latin_encoding{8t}{9e}{9d}{T1} {newlatin}
+ \encoding_switches
+ \if_textcomp_
+ \latin_encoding{8c}{9c}{9c}{TS1}{textcomp}
+ \fi
+}
+\newif\if_textcomp_
+
+\def\raw_encoding{8r}
+\def\adobe_encoding{8a}
+\def\expert_encoding{8x}
+
+\def\caps_shape{c}
+\def\oldstyle_shape{j}
+\def\SlantAmount{167}
+%%% From file: fimapgen.dtx
+\def\mapfrags_subsystem{Map~fragments~writer}
+\def\recordtransforms#1{\open_pout\transform_record_file{#1}}
+\def\endrecordtransforms{
+ \close_pout\transform_record_file{Font~transformation~records}
+}
+\chardef\transform_record_file=\closed_stream
+\let\storemapdata=\gobble_three
+\def\record_transform#1#2#3#4{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\storemapdata{#1}{#2}{#3}}
+ \fi
+ #4 \out_line{\string\storemapdata{#1}{#2}{#3}} \fi
+}
+\def\record_usage#1{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\makemapentry{#1}}
+ \fi
+}
+\let\declarepsencoding=\gobble_three
+\let\providepsencoding=\gobble_three
+%%% From file: fibasics.dtx
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\x_relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~
+ \fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+\if_file_exists{fontinst.rc}\then
+ \primitiveinput fontinst.rc
+\else
+ \immediate\write16{No~file~fontinst.rc.}
+\fi
+\normalcc
+\endinput
+%%
+%% End of file `xfntinst.sty'.
diff --git a/fonts/utilities/fontinst/inputs/latinetx/8r.etx b/fonts/utilities/fontinst/inputs/latinetx/8r.etx
new file mode 100644
index 0000000000..c4592964f0
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/8r.etx
@@ -0,0 +1,1354 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Sebastian Rahtz and
+%%% Constantin Kahn and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m and Walter Schmidt
+%%% and Philipp Lehman",
+%%% version = "2.0",
+%%% date = "2003-02-09",
+%%% time = "17:13:33 +01:00",
+%%% filename = "8r.etx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the 8r encoding as a TeX font encoding
+%%% file, for use with the fontinst utility.
+%%% It implements the TeX Base1 encoding.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage[TS1,T1]{fontenc}
+\usepackage{textcomp}
+\usepackage{fontdoc}[2001/03/16]
+\usepackage{amsfonts}
+
+\title{The \TeX\ Base~1 encoding vector}
+\author{Alan~Jeffrey\and Sebastian~Rahtz\and Constantin~Kahn\and
+ Ulrik~Vieth\and Lars~Hellstr\"om\and Walter~Schmidt\and
+ Philipp~Lehman}
+\date{9 February 2003\\Version 2.0}
+
+\showbranches
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX{}Base1 encoding vector, also known
+as the \texttt{8r} encoding.
+
+\encoding
+
+\needsfontinstversion{1.924}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\Else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\Else
+ \setint{interword}{333}
+\Fi\Fi
+
+\ifisint{monowidth}\then
+ \setint{stretchword}{0}
+ \setint{shrinkword}{0}
+ \setint{extraspace}{\int{interword}}
+ \setint{ligaturing}{0}
+\Else
+ \setint{stretchword}{\scale{\int{interword}}{600}}
+ \setint{shrinkword}{\scale{\int{interword}}{240}}
+ \setint{extraspace}{\scale{\int{interword}}{240}}
+ \setint{ligaturing}{1}
+\Fi
+\setint{quad}{1000}
+
+
+\begincomment
+\section{Font parameters}
+\endcomment
+
+\setstr{codingscheme}{TEXBASE1ENCODING}
+
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+
+\begincomment
+\section{The encoding}
+
+\subsection{The ASCII control range}
+
+The layout of the first 32 slots is rather arbitrary, except
+that is was carefully chosen to avoid the potentially dangerous
+slots 0 (NUL), 10 (LF) and 13 (CR).
+\endcomment
+
+\nextslot{1}
+\setslot{dotaccent}
+ \comment{The dot accent `\.{}'.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{fraction}
+ \comment{The fraction slash `\textfractionsolidus'.}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\setslot{ogonek}
+ \comment{The ogonek accent `\k{}'.}
+\endsetslot
+
+\setslot{ring}
+ \comment{The ring accent `\r{}'.}
+\endsetslot
+
+\nextslot{11}
+\setslot{breve}
+ \comment{The breve accent `\u{}'.}
+\endsetslot
+
+\setslot{minus}
+ \comment{The subtraction sign `\textminus'.}
+\endsetslot
+
+\nextslot{14}
+\setslot{\uctop{Zcaron}{zcaron}}
+ \comment{The letter `\v Z'.}
+\endsetslot
+
+\setslot{\lctop{Zcaron}{zcaron}}
+ \comment{The letter `\v z'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{\lclig{FF}{ff}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \Fi
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\begincomment
+ \begin{trivlist}\item
+ The following eight slots, 22--29, incorporate glyphs found in
+ MacRoman encoding, in no particular order.
+ \end{trivlist}
+\endcomment
+
+\setslot{notequal}
+ \comment{The `not equal to' symbol `$\neq$'.}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The `less-than or equal to' symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The `great-than or equal to' symbol `$\geq$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differential symbol `$\partial$'.}
+\endsetslot
+
+\setslot{summation}
+ \comment{The $n$-ary summation symbol `$\Sigma$', similar to the greek
+ capital letter sigma.}
+\endsetslot
+
+\setslot{product}
+ \comment{The $n$-ary product symbol `$\Pi$', similar to the greek
+ capital letter pi.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The mathematical constant `$\pi$'.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`{}'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quote mark `\,\textquotesingle\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\begincomment
+\subsection{The visible ASCII range}
+The following 96 slots, 32--127, are based on standard ASCII (as
+interpreted in \textit{The \TeX book}).
+\endcomment
+
+\nextslot{32}
+\setslot{space}
+ \comment{The space character.}
+\endsetslot
+
+\setslot{exclam}
+ \comment{The exclamation mark `!'.}
+ \ligature{LIG}{quoteleft}{exclamdown}
+\endsetslot
+
+\setslot{quotedbl}
+ \comment{The `neutral' double quote mark `\,\textquotedbl\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \comment{The English closing quote mark `\,\textquoteright\,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteright}{quotedblright}
+ \Fi
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{comma}{quotedblbase}
+ \Fi
+\endsetslot
+
+\setslot{hyphen}
+ \comment{The hyphen `-'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{endash}
+ \Fi
+\endsetslot
+
+\setslot{period}
+ \comment{The period `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon `;'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `\textless'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{less}{guillemotleft}
+ \Fi
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `\textgreater'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{greater}{guillemotright}
+ \Fi
+\endsetslot
+
+\setslot{question}
+ \comment{The question mark `?'.}
+ \ligature{LIG}{quoteleft}{questiondown}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `A'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `B'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `C'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `D'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `E'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `F'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `G'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `H'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `I'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `J'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `K'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `L'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `M'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `N'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `O'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `P'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `Q'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `R'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `S'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `T'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `U'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `V'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `W'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `X'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `Y'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `Z'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique `\textbackslash'.}
+\endsetslot
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{asciicircum}
+ \comment{The ASCII upward-pointing arrow head `\textasciicircum'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{quoteleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteleft}{quotedblleft}
+ \Fi
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `a'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `b'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `c'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `d'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `e'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+ \comment{The letter `f'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+ \Fi
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `g'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `h'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `i'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `j'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `k'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `l'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `m'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `n'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `o'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `p'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `q'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `r'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `s'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `t'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `u'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `v'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `w'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `x'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `y'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `z'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\textbraceleft'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\textbraceright'.}
+\endsetslot
+
+\setslot{asciitilde}
+ \comment{The ASCII tilde `\textasciitilde'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\begincomment
+\subsection{The Windows ANSI range}
+The following 32 slots, 128--159, are mostly based on
+Windows ANSI. Slots 129, 141--143, and 157--158 incorporate glyphs
+found in MacRoman encoding, in no particular order.
+\endcomment
+
+\nextslot{128}
+\setslot{Euro}
+ \comment{The European currency sign `\texteuro'.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The integral symbol.}
+\endsetslot
+
+\setslot{quotesinglbase}
+ \comment{A German single quote mark `\quotesinglbase' similar to a comma,
+ but with different sidebearings.}
+\endsetslot
+
+\setslot{florin}
+ \comment{The florin sign, similar to an italic letter `\textflorin'.}
+\endsetslot
+
+\setslot{quotedblbase}
+ \comment{A German double quote mark `\quotedblbase' similar to two commas,
+ but with tighter letterspacing and different sidebearings.}
+\endsetslot
+
+\setslot{ellipsis}
+ \comment{The ellipsis `\textellipsis'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The single dagger `\textdagger'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger `\textdaggerdbl'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{perthousand}
+ \comment{The perthousand sign `\textperthousand',
+ similar to `\%' with an extra zero.}
+\endsetslot
+
+\setslot{\uctop{Scaron}{scaron}}
+ \comment{The letter `\v S'.}
+\endsetslot
+
+\setslot{guilsinglleft}
+ \comment{A French single opening quote mark `\guilsinglleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'.
+ This is a single letter, and should not be faked with `OE'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek capital letter omega, the Ohm sign `\textohm'.}
+\endsetslot
+
+\setslot{radical}
+ \comment{The radical sign `\textsurd'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The `approximately equal to' symbol `$\approx$'.}
+\endsetslot
+
+\iffalse
+\nextslot{145}
+\setslot{quoteleft-unused}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+\endsetslot
+
+\setslot{quoteright-unused}
+ \comment{The English closing single quote mark `\,\textquoteright\,'.}
+\endsetslot
+\fi
+
+\nextslot{147}
+\setslot{quotedblleft}
+ \comment{The English opening double quote mark `\,\textquotedblleft\,'.}
+\endsetslot
+
+\setslot{quotedblright}
+ \comment{The English closing double quote mark `\,\textquotedblright\,'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The centered bullet `\textbullet'.}
+\endsetslot
+
+\setslot{endash}
+ \comment{The en-dash `\textendash'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{emdash}
+ \Fi
+\endsetslot
+
+\setslot{emdash}
+ \comment{The em-dash `\textemdash'.}
+\endsetslot
+
+\setslot{tilde}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{trademark}
+ \comment{The trademark sign, similar to the raised letters `TM'.}
+\endsetslot
+
+\setslot{\lctop{Scaron}{scaron}}
+ \comment{The letter `\v s'.}
+\endsetslot
+
+\setslot{guilsinglright}
+ \comment{A French single closing quote mark `\guilsinglright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'.
+ This is a single letter, and should not be faked with `oe'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The forward difference symbol `$\Delta$' similar to the
+ greek capital letter delta.}
+\endsetslot
+
+\setslot{lozenge}
+ \comment{The lozenge symbol `$\lozenge$'.}
+\endsetslot
+
+\setslot{\uctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"Y'.}
+\endsetslot
+
+\begincomment
+\subsection{The low ISO latin 1 range}
+The following 32 slots, 160--191, are based on ISO Latin~1,
+which is identical to Windows ANSI in this plane.
+\endcomment
+
+% % This is commented out since the \texttt{8r.enc} encoding vector
+% % does not (at least not currently) place any glyph in this slot.
+%
+% \ifdirect
+% \nextslot{160}
+% \setslot{space}
+% \comment{The (non-breaking) space character.}
+% \endsetslot
+% \Fi
+
+\nextslot{161}
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{cent}
+ \comment{The cent sign `\textcent'.}
+\endsetslot
+
+\setslot{sterling}
+ \comment{The British currency sign, `\textsterling'.}
+\endsetslot
+
+\setslot{currency}
+ \comment{The international currency sign, `\textcurrency'.}
+\endsetslot
+
+\setslot{yen}
+ \comment{The Japanese currency sign, `\textyen'.}
+\endsetslot
+
+\setslot{brokenbar}
+ \comment{A broken vertical bar, `\textbrokenbar',
+ similar to `\textbar' with a gap through the middle.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `\textsection'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\setslot{copyright}
+ \comment{The copyright sign `\textcopyright',
+ similar to a small `C' enclosed by a circle.}
+\endsetslot
+
+\setslot{ordfeminine}
+ \comment{The raised letter `\textordfeminine'.}
+\endsetslot
+
+\setslot{guillemotleft}
+ \comment{A French double opening quote mark `\guillemotleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The logical not sign `\textlnot'.}
+\endsetslot
+
+\ifdirect
+
+\setslot{hyphen}
+ \comment{\texttt{8r.enc} puts \texttt{hyphen} in this slot as
+ well, because it is the position of the latin-1 ``soft
+ hyphen''.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{endash}
+ \Fi
+\endsetslot
+
+\Fi
+
+\nextslot{174}
+\setslot{registered}
+ \comment{The registered trademark sign `\textregistered',
+ similar to a small `R' enclosed by a circle.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\setslot{degree}
+ \comment{The degree sign `\textdegree'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus sign `\textpm'.}
+\endsetslot
+
+\setslot{twosuperior}
+ \comment{The raised digit `\texttwosuperior'.}
+\endsetslot
+
+\setslot{threesuperior}
+ \comment{The raised digit `\textthreesuperior'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The lowercase Greek letter `\textmu', intended
+ for use as a prefix `micro' in physical units.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph mark `\textparagraph'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered period `\textperiodcentered'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c{}'.}
+\endsetslot
+
+\setslot{onesuperior}
+ \comment{The raised digit `\textonesuperior'.}
+\endsetslot
+
+\setslot{ordmasculine}
+ \comment{The raised letter `\textordmasculine'.}
+\endsetslot
+
+\setslot{guillemotright}
+ \comment{A French double closing quote mark `\guillemotright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{onequarter}
+ \comment{The fraction `\textonequarter'.}
+\endsetslot
+
+\setslot{onehalf}
+ \comment{The fraction `\textonehalf'.}
+\endsetslot
+
+\setslot{threequarters}
+ \comment{The fraction `\textthreequarters'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\begincomment
+\subsection{The high ISO latin 1 range}
+The remaining 64 slots, 192--255, are again based on ISO Latin~1.
+\endcomment
+
+\nextslot{192}
+\setslot{\uctop{Agrave}{agrave}}
+ \comment{The letter `\`A'.}
+\endsetslot
+
+\setslot{\uctop{Aacute}{aacute}}
+ \comment{The letter `\'A'.}
+\endsetslot
+
+\setslot{\uctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^A'.}
+\endsetslot
+
+\setslot{\uctop{Atilde}{atilde}}
+ \comment{The letter `\~A'.}
+\endsetslot
+
+\setslot{\uctop{Adieresis}{adieresis}}
+ \comment{The letter `\"A'.}
+\endsetslot
+
+\setslot{\uctop{Aring}{aring}}
+ \comment{The letter `\AA'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'.
+ This is a single letter, and should not be faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c C'.}
+\endsetslot
+
+\setslot{\uctop{Egrave}{egrave}}
+ \comment{The letter `\`E'.}
+\endsetslot
+
+\setslot{\uctop{Eacute}{eacute}}
+ \comment{The letter `\'E'.}
+\endsetslot
+
+\setslot{\uctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^E'.}
+\endsetslot
+
+\setslot{\uctop{Edieresis}{edieresis}}
+ \comment{The letter `\"E'.}
+\endsetslot
+
+\setslot{\uctop{Igrave}{igrave}}
+ \comment{The letter `\`I'.}
+\endsetslot
+
+\setslot{\uctop{Iacute}{iacute}}
+ \comment{The letter `\'I'.}
+\endsetslot
+
+\setslot{\uctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^I'.}
+\endsetslot
+
+\setslot{\uctop{Idieresis}{idieresis}}
+ \comment{The letter `\"I'.}
+\endsetslot
+
+\setslot{\uc{Eth}{eth}}
+ \comment{The Icelandic capital letter `Eth' similar to a `D'
+ with a horizontal bar through the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Ntilde}{ntilde}}
+ \comment{The letter `\~N'.}
+\endsetslot
+
+\setslot{\uctop{Ograve}{ograve}}
+ \comment{The letter `\`O'.}
+\endsetslot
+
+\setslot{\uctop{Oacute}{oacute}}
+ \comment{The letter `\'O'.}
+\endsetslot
+
+\setslot{\uctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^O'.}
+\endsetslot
+
+\setslot{\uctop{Otilde}{otilde}}
+ \comment{The letter `\~O'.}
+\endsetslot
+
+\setslot{\uctop{Odieresis}{odieresis}}
+ \comment{The letter `\"O'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication sign `\texttimes'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\O'.}
+\endsetslot
+
+\setslot{\uctop{Ugrave}{ugrave}}
+ \comment{The letter `\`U'.}
+\endsetslot
+
+\setslot{\uctop{Uacute}{uacute}}
+ \comment{The letter `\'U'.}
+\endsetslot
+
+\setslot{\uctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^U'.}
+\endsetslot
+
+\setslot{\uctop{Udieresis}{udieresis}}
+ \comment{The letter `\"U'.}
+\endsetslot
+
+\setslot{\uctop{Yacute}{yacute}}
+ \comment{The letter `\'Y'.}
+\endsetslot
+
+\setslot{\uc{Thorn}{thorn}}
+ \comment{The Icelandic capital letter `Thorn', similar to a `P'
+ with the bowl moved down. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lctop{Agrave}{agrave}}
+ \comment{The letter `\`a'.}
+\endsetslot
+
+\setslot{\lctop{Aacute}{aacute}}
+ \comment{The letter `\'a'.}
+\endsetslot
+
+\setslot{\lctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^a'.}
+\endsetslot
+
+\setslot{\lctop{Atilde}{atilde}}
+ \comment{The letter `\~a'.}
+\endsetslot
+
+\setslot{\lctop{Adieresis}{adieresis}}
+ \comment{The letter `\"a'.}
+\endsetslot
+
+\setslot{\lctop{Aring}{aring}}
+ \comment{The letter `\aa'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'.
+ This is a single letter, and should not be faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c c'.}
+\endsetslot
+
+\setslot{\lctop{Egrave}{egrave}}
+ \comment{The letter `\`e'.}
+\endsetslot
+
+\setslot{\lctop{Eacute}{eacute}}
+ \comment{The letter `\'e'.}
+\endsetslot
+
+\setslot{\lctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^e'.}
+\endsetslot
+
+\setslot{\lctop{Edieresis}{edieresis}}
+ \comment{The letter `\"e'.}
+\endsetslot
+
+\setslot{\lctop{Igrave}{igrave}}
+ \comment{The letter `\`\i'.}
+\endsetslot
+
+\setslot{\lctop{Iacute}{iacute}}
+ \comment{The letter `\'\i'.}
+\endsetslot
+
+\setslot{\lctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^\i'.}
+\endsetslot
+
+\setslot{\lctop{Idieresis}{idieresis}}
+ \comment{The letter `\"\i'.}
+\endsetslot
+
+\setslot{\lc{Eth}{eth}}
+ \comment{The Icelandic lowercase letter `eth' similar to a
+ `$\partial$' with an oblique bar through the stem. It is
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ntilde}{ntilde}}
+ \comment{The letter `\~n'.}
+\endsetslot
+
+\setslot{\lctop{Ograve}{ograve}}
+ \comment{The letter `\`o'.}
+\endsetslot
+
+\setslot{\lctop{Oacute}{oacute}}
+ \comment{The letter `\'o'.}
+\endsetslot
+
+\setslot{\lctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^o'.}
+\endsetslot
+
+\setslot{\lctop{Otilde}{otilde}}
+ \comment{The letter `\~o'.}
+\endsetslot
+
+\setslot{\lctop{Odieresis}{odieresis}}
+ \comment{The letter `\"o'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division sign `\textdiv'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\lctop{Ugrave}{ugrave}}
+ \comment{The letter `\`u'.}
+\endsetslot
+
+\setslot{\lctop{Uacute}{uacute}}
+ \comment{The letter `\'u'.}
+\endsetslot
+
+\setslot{\lctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^u'.}
+\endsetslot
+
+\setslot{\lctop{Udieresis}{udieresis}}
+ \comment{The letter `\"u'.}
+\endsetslot
+
+\setslot{\lctop{Yacute}{yacute}}
+ \comment{The letter `\'y'.}
+\endsetslot
+
+\setslot{\lc{Thorn}{thorn}}
+ \comment{The Icelandic lowercase letter `thorn', similar to a `p'
+ with an ascender rising from the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"y'.}
+\endsetslot
+
+\endencoding
+
+
+\section{The basis for the design of this encoding}
+
+The idea is to have all the characters normally included in Type 1 fonts
+available for typesetting. This is effectively the characters in Adobe
+Standard encoding, ISO Latin 1, Windows ANSI including the \texttt{euro}
+symbol, MacRoman, and some extra characters from Lucida.
+
+Character code assignments were made as follows:
+\begin{enumerate}
+ \item
+ the Windows ANSI characters are almost all in their Windows ANSI
+ positions, because some Windows users cannot easily reencode the
+ fonts, and it makes no difference on other systems. The only
+ Windows ANSI characters not available are those that make no sense
+ for typesetting---\texttt{rubout} (127~decimal),
+ \texttt{nobreakspace}~(160), \texttt{softhyphen}~(173).
+ \texttt{quotesingle} and \texttt{grave} are moved just because
+ it's such an irritation not having them in TeX positions.
+ \item
+ Remaining characters are assigned arbitrarily to the lower part
+ of the range, avoiding 0, 10 and 13 in case we meet dumb software.
+ \item
+ Y\&Y Lucida Bright includes some extra text characters; in the
+ hopes that other PostScript fonts, perhaps created for public
+ consumption, will include them, they are included starting at 0x12.
+ These are \texttt{dotlessj}, \texttt{ff}, \texttt{ffi},
+ \texttt{ffl}.
+ \item
+ \texttt{hyphen} appears twice for compatibility with both ASCII
+ and Windows.
+ \item
+ \texttt{Euro} was assigned to 128, as in Windows ANSI.
+ \item
+ Missing characters from MacRoman encoding incorporated as
+ follows:
+ \begin{center}
+ \small
+ \begin{tabular}{lrr}
+ \textbf{Glyph}& \textbf{MacRoman}& \textbf{TeXBase1}\\
+ \texttt{notequal}& 173& 22\\
+ \texttt{infinity}& 176& 23\\
+ \texttt{lessequal}& 178& 24\\
+ \texttt{greaterequal}& 179& 25\\
+ \texttt{partialdiff}& 182& 26\\
+ \texttt{summation}& 183& 27\\
+ \texttt{product}& 184& 28\\
+ \texttt{pi}& 185& 29\\
+ \texttt{integral}& 186& 129\\
+ \texttt{Omega}& 189& 141\\
+ \texttt{radical}& 195& 142\\
+ \texttt{approxequal}& 197& 143\\
+ \texttt{Delta}& 198& 157\\
+ \texttt{lozenge}& 215& 158
+ \end{tabular}
+ \end{center}
+\end{enumerate}
+
+
+
+\section{Changes}
+
+1995/03/19: The `\texttt{softhyphen}' is back; now called
+`\texttt{alternate-hyphen}' and has \verb|\ligature| commands. In
+`\texttt{hyphen}' slot \verb|\ligature| $\mapsto$ `\texttt{rangedash}'
+changed to `\texttt{endash}'. (ASAJ)
+
+1995/04/03: Changed around the order of some characters at start
+(to avoid 0, 10 and 13, and reposition \texttt{quoteleft} and
+\texttt{quoteright}). (ASAJ)
+
+1995/08/03: Interword stretch and shrink [again!]. (ASAJ)
+
+1998/06/29: Major update of comments and markup; made it a
+proper \LaTeXe\ document, using \texttt{T1} and \texttt{TS1} encoded
+fonts for giving examples of glyphs, and added descriptions for
+numerous slots. Lowercasified names of accents---removed uses of
+\verb|\lc| in \verb|\setslot|s for accents. (UV)
+
+2002/03/11: Added `\texttt{Euro}' in slot 128. (WaS)
+
+2002/10/30: New symbols incorporated from MacRoman. (Philipp Lehman)
+
+2002/11/12: Added \verb|\showbranches| markup. Modernised setting of
+fontdimens. (LH)
+
+2003/02/04: Introduced the \textit{ligaturing} integer for control of
+ whether ligatures are made. (LH)
+
+2003/02/09: Made use of \verb|\ifdirect| to clear up the situation
+ with \texttt{alternate-hyphen}. It is now included under the proper
+ name \texttt{hyphen}, but is ignored when reencoding. (LH)
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/8y.etx b/fonts/utilities/fontinst/inputs/latinetx/8y.etx
new file mode 100644
index 0000000000..d84921a545
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/8y.etx
@@ -0,0 +1,1305 @@
+% Copyright 1998, 1999, 2003, 2004 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.928",
+%%% date = "2004-09-24",
+%%% time = "21:21:00 +01:00",
+%%% filename = "8y.etx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the 8y encoding as a TeX font encoding
+%%% file, for use with the fontinst utility.
+%%% It implements the TeXnANSI (or LY1) encoding
+%%% proposed and promoted by Y&Y.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+% Changes list at end of file.
+
+\documentclass[twocolumn]{article}
+\usepackage[TS1,T1]{fontenc}
+\usepackage{textcomp}
+\usepackage{fontdoc}[2003/02/09]
+
+\title{The \TeX'n'ANSI encoding vector}
+\author{Ulrik Vieth\and Lars Hellstr\"om}
+\date{13 September 2004\\Version 1.928}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX'n'ANSI encoding vector proposed
+by Y\&Y, which is represented by the \texttt{LY1} encoding in \LaTeXe.
+
+It is almost identical to the \TeX{}Base1 encoding (defined in
+\texttt{8r.etx}) in the range 32--126 and 161--255. It is similar
+to \texttt{8r.etx} in the range 127--160, but contains additional
+characters, which are stored elsewhere in \texttt{8r.etx}.
+
+\showbranches
+\encoding
+
+\needsfontinstversion{1.924}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\Else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\Else
+ \setint{interword}{333}
+\Fi\Fi
+
+\ifisint{monowidth}\then
+ \setint{stretchword}{0}
+ \setint{shrinkword}{0}
+ \setint{extraspace}{\int{interword}}
+ \setint{ligaturing}{0}
+\Else
+ \setint{stretchword}{\scale{\int{interword}}{600}}
+ \setint{shrinkword}{\scale{\int{interword}}{240}}
+ \setint{extraspace}{\scale{\int{interword}}{240}}
+ \setint{ligaturing}{1}
+\Fi
+\setint{quad}{1000}
+
+
+\begincomment
+\section{Font parameters}
+\endcomment
+
+\setstr{codingscheme}{TEX TYPEWRITER AND WINDOWS ANSI}
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+
+\begincomment
+\section{The encoding}
+
+\subsection{Low ASCII control characters}
+
+The layout of the first 16 slots wase carefully chosen to avoid
+potentially dangerous slots 0 (NUL), 9 (HT), 10 (LF) and 13 (CR).
+\endcomment
+
+\nextslot{1}
+\setslot{Euro}
+ \comment{The Euro currency sign.}
+\endsetslot
+
+\nextslot{4}
+\setslot{fraction}
+ \comment{The fraction slash `\textfractionsolidus'.}
+\endsetslot
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.{}'.}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\setslot{ogonek}
+ \comment{The ogonek accent `\k{}'.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\nextslot{11}
+\setslot{\lclig{FF}{ff}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \Fi
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\nextslot{14}
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\begincomment
+\subsection{The \texttt{OT1} compatibility range}
+The following 16 slots share the same encoding as \texttt{OT1}.
+\endcomment
+
+\nextslot{16}
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`{}'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v {}'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u{}'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\setslot{ring}
+ \comment{The ring accent `\r{}'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c{}'.}
+\endsetslot
+
+\ifdirect
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'.
+ This is a single letter, and should not be faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'.
+ This is a single letter, and should not be faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'.
+ This is a single letter, and should not be faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'.
+ This is a single letter, and should not be faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\O'.}
+\endsetslot
+
+\Fi
+
+\begincomment
+\subsection{The visible ASCII range}
+The following 96 slots, 32--127, are based on standard ASCII,
+except that `\texttt{asciicircum}', `\texttt{asciitilde}', and the
+empty slot 127 have been replaced by the `\texttt{circumflex}',
+`\texttt{tilde}' and `\texttt{dieresis}' as in \texttt{OT1}.
+\endcomment
+
+\nextslot{32}
+\setslot{space}
+ \comment{The space character.}
+\endsetslot
+
+\setslot{exclam}
+ \comment{The exclamation mark `!'.}
+ \ligature{LIG}{quoteleft}{exclamdown}
+\endsetslot
+
+\setslot{quotedbl}
+ \comment{The `neutral' double quote mark `\,\textquotedbl\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \comment{The English closing quote mark `\,\textquoteright\,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteright}{quotedblright}
+ \Fi
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{comma}{quotedblbase}
+ \Fi
+\endsetslot
+
+\setslot{hyphen}
+ \comment{The hyphen `-'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{endash}
+ \Fi
+\endsetslot
+
+\setslot{period}
+ \comment{The period `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon `;'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `\textless'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{less}{guillemotleft}
+ \Fi
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `\textgreater'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{greater}{guillemotright}
+ \Fi
+\endsetslot
+
+\setslot{question}
+ \comment{The question mark `?'.}
+ \ligature{LIG}{quoteleft}{questiondown}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `A'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `B'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `C'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `D'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `E'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `F'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `G'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `H'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `I'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `J'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `K'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `L'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `M'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `N'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `O'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `P'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `Q'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `R'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `S'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `T'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `U'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `V'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `W'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `X'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `Y'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `Z'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique `\textbackslash'.}
+\endsetslot
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{quoteleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteleft}{quotedblleft}
+ \Fi
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `a'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `b'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `c'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `d'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `e'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+ \comment{The letter `f'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+ \Fi
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `g'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `h'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `i'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `j'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `k'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `l'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `m'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `n'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `o'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `p'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `q'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `r'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `s'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `t'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `u'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `v'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `w'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `x'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `y'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `z'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\textbraceleft'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\textbraceright'.}
+\endsetslot
+
+\setslot{tilde}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\begincomment
+\subsection{The Windows ANSI range}
+The following 32 slots, 128--159, are based on an extended
+version of Windows ANSI.
+\endcomment
+
+\nextslot{128}
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quote mark `\,\textquotesingle\,',
+ included for use in monowidth fonts, or for setting computer
+ programs.}
+\endsetslot
+
+\setslot{quotesinglbase}
+ \comment{A German single quote mark `\quotesinglbase' similar to a comma,
+ but with different sidebearings.}
+\endsetslot
+
+\setslot{florin}
+ \comment{The florin sign, similar to an italic letter `\textflorin'.}
+\endsetslot
+
+\setslot{quotedblbase}
+ \comment{A German double quote mark `\quotedblbase' similar to two commas,
+ but with tighter letterspacing and different sidebearings.}
+\endsetslot
+
+\setslot{ellipsis}
+ \comment{The ellipsis `\textellipsis'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The single dagger `\textdagger'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger `\textdaggerdbl'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{perthousand}
+ \comment{The perthousand sign `\textperthousand',
+ similar to `\%' with an extra zero.}
+\endsetslot
+
+\setslot{\uctop{Scaron}{scaron}}
+ \comment{The letter `\v S'.}
+\endsetslot
+
+\setslot{guilsinglleft}
+ \comment{A French single opening quote mark `\guilsinglleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'.
+ This is a single letter, and should not be faked with `OE'.}
+\endsetslot
+
+\setslot{\uctop{Zcaron}{zcaron}}
+ \comment{The letter `\v Z'.}
+\endsetslot
+
+\setslot{asciicircum}
+ \comment{The ASCII upward-pointing arrow head `\textasciicircum'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{minus}
+ \comment{The subtraction sign `\textminus'.}
+\endsetslot
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\ifdirect
+
+\nextslot{145}
+\setslot{quoteleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+\endsetslot
+
+\setslot{quoteright}
+ \comment{The English closing single quote mark `\,\textquoteright\,'.}
+\endsetslot
+
+\Fi
+
+\nextslot{147}
+\setslot{quotedblleft}
+ \comment{The English opening double quote mark `\,\textquotedblleft\,'.}
+\endsetslot
+
+\setslot{quotedblright}
+ \comment{The English closing double quote mark `\,\textquotedblright\,'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The centered bullet `\textbullet'.}
+\endsetslot
+
+\setslot{endash}
+ \comment{The en-dash `\textendash'.}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{emdash}
+ \Fi
+\endsetslot
+
+\setslot{emdash}
+ \comment{The em-dash `\textemdash'.}
+\endsetslot
+
+\setslot{tilde}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{trademark}
+ \comment{The trademark sign, similar to the raised letters `TM'.}
+\endsetslot
+
+\setslot{\lctop{Scaron}{scaron}}
+ \comment{The letter `\v s'.}
+\endsetslot
+
+\setslot{guilsinglright}
+ \comment{A French single closing quote mark `\guilsinglright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'.
+ This is a single letter, and should not be faked with `oe'.}
+\endsetslot
+
+\setslot{\lctop{Zcaron}{zcaron}}
+ \comment{The letter `\v z'.}
+\endsetslot
+
+\setslot{asciitilde}
+ \comment{The ASCII tilde `\textasciitilde'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{\uctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"Y'.}
+\endsetslot
+
+\begincomment
+\subsection{The low ISO latin 1 range}
+The following 32 slots, 160--191, are based on ISO Latin~1,
+which is identical to Windows ANSI in this plane.
+\endcomment
+
+\ifdirect
+
+\nextslot{160}
+\setslot{space}
+ \comment{The (non-breaking) space character.}
+\endsetslot
+
+\Fi
+
+\nextslot{161}
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{cent}
+ \comment{The cent sign `\textcent'.}
+\endsetslot
+
+\setslot{sterling}
+ \comment{The British currency sign, `\textsterling'.}
+\endsetslot
+
+\setslot{currency}
+ \comment{The international currency sign, `\textcurrency'.}
+\endsetslot
+
+\setslot{yen}
+ \comment{The Japanese currency sign, `\textyen'.}
+\endsetslot
+
+\setslot{brokenbar}
+ \comment{A broken vertical bar, `\textbrokenbar',
+ similar to `\textbar' with a gap through the middle.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `\textsection'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\setslot{copyright}
+ \comment{The copyright sign `\textcopyright',
+ similar to a small `C' enclosed by a circle.}
+\endsetslot
+
+\setslot{ordfeminine}
+ \comment{The raised letter `\textordfeminine'.}
+\endsetslot
+
+\setslot{guillemotleft}
+ \comment{A French double opening quote mark `\guillemotleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The logical not sign `\textlnot'.}
+\endsetslot
+
+\ifdirect
+
+\nextslot{173}
+\setslot{hyphen}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{endash}
+ \Fi
+\endsetslot
+
+\Fi
+
+\nextslot{174}
+\setslot{registered}
+ \comment{The registered trademark sign `\textregistered',
+ similar to a small `R' enclosed by a circle.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\setslot{degree}
+ \comment{The degree sign `\textdegree'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus sign `\textpm'.}
+\endsetslot
+
+\setslot{twosuperior}
+ \comment{The raised digit `\texttwosuperior'.}
+\endsetslot
+
+\setslot{threesuperior}
+ \comment{The raised digit `\textthreesuperior'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The lowercase Greek letter `\textmu', intended
+ for use as a prefix `micro' in physical units.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph mark `\textparagraph'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered period `\textperiodcentered'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c{}'.}
+\endsetslot
+
+\setslot{onesuperior}
+ \comment{The raised digit `\textonesuperior'.}
+\endsetslot
+
+\setslot{ordmasculine}
+ \comment{The raised letter `\textordmasculine'.}
+\endsetslot
+
+\setslot{guillemotright}
+ \comment{A French double closing quote mark `\guillemotright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{onequarter}
+ \comment{The fraction `\textonequarter'.}
+\endsetslot
+
+\setslot{onehalf}
+ \comment{The fraction `\textonehalf'.}
+\endsetslot
+
+\setslot{threequarters}
+ \comment{The fraction `\textthreequarters'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\begincomment
+\subsection{The high ISO latin 1 range}
+The remaining 64 slots, 192--255, are again based on ISO Latin~1.
+\endcomment
+
+\nextslot{192}
+\setslot{\uctop{Agrave}{agrave}}
+ \comment{The letter `\`A'.}
+\endsetslot
+
+\setslot{\uctop{Aacute}{aacute}}
+ \comment{The letter `\'A'.}
+\endsetslot
+
+\setslot{\uctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^A'.}
+\endsetslot
+
+\setslot{\uctop{Atilde}{atilde}}
+ \comment{The letter `\~A'.}
+\endsetslot
+
+\setslot{\uctop{Adieresis}{adieresis}}
+ \comment{The letter `\"A'.}
+\endsetslot
+
+\setslot{\uctop{Aring}{aring}}
+ \comment{The letter `\AA'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'.
+ This is a single letter, and should not be faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c C'.}
+\endsetslot
+
+\setslot{\uctop{Egrave}{egrave}}
+ \comment{The letter `\`E'.}
+\endsetslot
+
+\setslot{\uctop{Eacute}{eacute}}
+ \comment{The letter `\'E'.}
+\endsetslot
+
+\setslot{\uctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^E'.}
+\endsetslot
+
+\setslot{\uctop{Edieresis}{edieresis}}
+ \comment{The letter `\"E'.}
+\endsetslot
+
+\setslot{\uctop{Igrave}{igrave}}
+ \comment{The letter `\`I'.}
+\endsetslot
+
+\setslot{\uctop{Iacute}{iacute}}
+ \comment{The letter `\'I'.}
+\endsetslot
+
+\setslot{\uctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^I'.}
+\endsetslot
+
+\setslot{\uctop{Idieresis}{idieresis}}
+ \comment{The letter `\"I'.}
+\endsetslot
+
+\setslot{\uc{Eth}{eth}}
+ \comment{The Icelandic capital letter `Eth' similar to a `D'
+ with a horizontal bar through the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Ntilde}{ntilde}}
+ \comment{The letter `\~N'.}
+\endsetslot
+
+\setslot{\uctop{Ograve}{ograve}}
+ \comment{The letter `\`O'.}
+\endsetslot
+
+\setslot{\uctop{Oacute}{oacute}}
+ \comment{The letter `\'O'.}
+\endsetslot
+
+\setslot{\uctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^O'.}
+\endsetslot
+
+\setslot{\uctop{Otilde}{otilde}}
+ \comment{The letter `\~O'.}
+\endsetslot
+
+\setslot{\uctop{Odieresis}{odieresis}}
+ \comment{The letter `\"O'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication sign `\texttimes'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\O'.}
+\endsetslot
+
+\setslot{\uctop{Ugrave}{ugrave}}
+ \comment{The letter `\`U'.}
+\endsetslot
+
+\setslot{\uctop{Uacute}{uacute}}
+ \comment{The letter `\'U'.}
+\endsetslot
+
+\setslot{\uctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^U'.}
+\endsetslot
+
+\setslot{\uctop{Udieresis}{udieresis}}
+ \comment{The letter `\"U'.}
+\endsetslot
+
+\setslot{\uctop{Yacute}{yacute}}
+ \comment{The letter `\'Y'.}
+\endsetslot
+
+\setslot{\uc{Thorn}{thorn}}
+ \comment{The Icelandic capital letter `Thorn', similar to a `P'
+ with the bowl moved down. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lctop{Agrave}{agrave}}
+ \comment{The letter `\`a'.}
+\endsetslot
+
+\setslot{\lctop{Aacute}{aacute}}
+ \comment{The letter `\'a'.}
+\endsetslot
+
+\setslot{\lctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^a'.}
+\endsetslot
+
+\setslot{\lctop{Atilde}{atilde}}
+ \comment{The letter `\~a'.}
+\endsetslot
+
+\setslot{\lctop{Adieresis}{adieresis}}
+ \comment{The letter `\"a'.}
+\endsetslot
+
+\setslot{\lctop{Aring}{aring}}
+ \comment{The letter `\aa'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'.
+ This is a single letter, and should not be faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c c'.}
+\endsetslot
+
+\setslot{\lctop{Egrave}{egrave}}
+ \comment{The letter `\`e'.}
+\endsetslot
+
+\setslot{\lctop{Eacute}{eacute}}
+ \comment{The letter `\'e'.}
+\endsetslot
+
+\setslot{\lctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^e'.}
+\endsetslot
+
+\setslot{\lctop{Edieresis}{edieresis}}
+ \comment{The letter `\"e'.}
+\endsetslot
+
+\setslot{\lctop{Igrave}{igrave}}
+ \comment{The letter `\`\i'.}
+\endsetslot
+
+\setslot{\lctop{Iacute}{iacute}}
+ \comment{The letter `\'\i'.}
+\endsetslot
+
+\setslot{\lctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^\i'.}
+\endsetslot
+
+\setslot{\lctop{Idieresis}{idieresis}}
+ \comment{The letter `\"\i'.}
+\endsetslot
+
+\setslot{\lc{Eth}{eth}}
+ \comment{The Icelandic lowercase letter `eth' similar to a
+ `$\partial$' with an oblique bar through the stem. It is
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ntilde}{ntilde}}
+ \comment{The letter `\~n'.}
+\endsetslot
+
+\setslot{\lctop{Ograve}{ograve}}
+ \comment{The letter `\`o'.}
+\endsetslot
+
+\setslot{\lctop{Oacute}{oacute}}
+ \comment{The letter `\'o'.}
+\endsetslot
+
+\setslot{\lctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^o'.}
+\endsetslot
+
+\setslot{\lctop{Otilde}{otilde}}
+ \comment{The letter `\~o'.}
+\endsetslot
+
+\setslot{\lctop{Odieresis}{odieresis}}
+ \comment{The letter `\"o'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division sign `\textdiv'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\lctop{Ugrave}{ugrave}}
+ \comment{The letter `\`u'.}
+\endsetslot
+
+\setslot{\lctop{Uacute}{uacute}}
+ \comment{The letter `\'u'.}
+\endsetslot
+
+\setslot{\lctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^u'.}
+\endsetslot
+
+\setslot{\lctop{Udieresis}{udieresis}}
+ \comment{The letter `\"u'.}
+\endsetslot
+
+\setslot{\lctop{Yacute}{yacute}}
+ \comment{The letter `\'y'.}
+\endsetslot
+
+\setslot{\lc{Thorn}{thorn}}
+ \comment{The Icelandic lowercase letter `thorn', similar to a `p'
+ with an ascender rising from the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\"y'.}
+\endsetslot
+
+\endencoding
+
+
+\section{Changes}
+
+The noteworthy changes made to this document are as follows.
+
+1999/10/25:
+ Typos regarding \texttt{Lslash} and \texttt{lslash}
+ corrected. (UV\&LH)
+
+1999/11/11:
+ Added \verb|\showbranches| markup. Removed \texttt{-OT1}
+ suffix from some glyph names. (LH)
+
+2003/02/04:
+ Returned to the v\,1.801 version of this file, and
+ reintroduced the few later additions (see above) that made sense.
+ Modernized setting of font parameters. Tidied up some markup.
+ (LH)
+
+2003/02/09:
+ Unified the duplicate glyphs (again!), this time using
+ the new \verb|\ifdirect| switch.
+
+2003/12/08:
+ Fixed two typos (\verb|\setslot| where it should be
+ \verb|\nextslot|). (LH)
+
+2004/09/13:
+ Added \texttt{Euro} in slot 1, as that is in \texttt{texnansi.enc}.
+ (LH, following a mail from Peter Harmard)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1.etx
new file mode 100644
index 0000000000..d047de664d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1.etx
@@ -0,0 +1,938 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team and
+% any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = {Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m},
+%%% version = "1.910",
+%%% date = "2002-07-31",
+%%% time = "21:45:37 +02:00",
+%%% filename = "ot1.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the old TeX text encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \TeX\ text encoding vector}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{31 July 2002\\Version 1.921}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ text (\texttt{OT1}) encoding---or
+rather the \texttt{OT1} encodings, since the Computer Modern font
+family alone provide examples of no less than five different
+\texttt{OT1} encodings.
+
+The exact encoding of fonts produced using this file is controlled
+through the two integers \texttt{ligaturing} (relevant values are $0$,
+$1$, and $2$) and \texttt{italicizing} (relevant values are $0$ and
+$1$). \texttt{ligaturing} controls roughly how many ligature
+characters and ligaturing instructions there are in the font.
+\texttt{italicizing} controls whether the font contains a dollar or
+pound sign.
+
+This file also makes use of five macros in forming the names of
+glyphs, so that this can be configured.
+\begin{itemize}
+\item \verb|\lc{A}{a}| should return the name of a lower-case
+ glyph, for example `\texttt{a}' or `\texttt{Asmall}'.
+
+\item \verb|\uc{A}{a}| should return the name of an upper-case
+ glyph, for example `\texttt{A}' or `\texttt{Amedium}'.
+
+\item \verb|\lclig{FI}{fi}| should return the name of a lower-case
+ ligature, for example `\texttt{fi}' or `\texttt{FIsmall}'.
+
+\item \verb|\uclig{FI}{fi}| should return the name of an upper-case
+ ligature, for example `\texttt{FI}' or `\texttt{FImedium}'.
+
+\item \verb|\digit{zero}| should return the name of a digit, for
+ example `\texttt{zero}' or `\texttt{zerooldstyle}'.
+
+% \item \verb|\currency| should be the name of the currency glyph, either
+% `\texttt{sterling}' or `\texttt{dollar}'.
+\end{itemize}
+These should all expand in the mouth, otherwise you may get error
+messages!
+
+For example, to get the standard upper and lower case font, you should
+define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2}
+ \setcommand\uclig#1#2{#1}
+ \setcommand\digit#1{#1}
+\end{verbatim}
+To get a caps and small caps font with old style digits and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1small}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2small}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1oldstyle}
+\end{verbatim}
+To get an all-caps font with medium-cap composite letters and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#1spaced}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1}
+\end{verbatim}
+This document describes the upper and lower case encoding.
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.917}
+
+
+\begincomment\section{Default values}\endcomment
+
+\comment{The \textit{ligaturing} default depends on whether
+ \textit{monowidth} is set mainly because that causes the default
+ installation of fonts to be slightly more intelligent.}
+\ifisint{monowidth}\then
+ \setint{ligaturing}{0}
+\Else
+ \setint{ligaturing}{2}
+\Fi
+
+\setint{italicizing}{0}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+% \comment{The following trickery was introduced to make the change
+% from monowidth implying typewriter to monowidth not implying
+% typewriter less abrupt.}
+% \ifisint{monowidth}\then
+% \ifisint{typewriter}\then \Else
+% \ifnumber{\int{monowidth}}={9876}\then \Else
+% \fontinstwarningnoline{ot1.etx}{%
+% Set the typewriter integer to get a typewriter font,%
+% \messagebreak
+% set monowidth to 9876 to get a monowidth font,%
+% \messagebreak
+% or set both to get a monowidth typewriter font%
+% }
+% \setint{typewriter}{0}
+% \Fi
+% \Fi
+% \Fi
+
+
+\setint{italicslant}{0}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\Else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\Else
+ \setint{interword}{333}
+\Fi\Fi
+
+\ifisint{monowidth}\then
+ \setint{stretchword}{0}
+ \setint{shrinkword}{0}
+\Else
+ \setint{stretchword}{\scale{\int{interword}}{600}}
+ \setint{shrinkword}{\scale{\int{interword}}{240}}
+\Fi
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\setint{quad}{1000}
+
+\ifisint{monowidth}\then
+% \ifnumber{\int{ligaturing}}={0}\then
+% \setint{extraspace}{0}
+% \Else
+ \setint{extraspace}{\int{interword}}
+% \Fi
+\Else
+ \setint{extraspace}{\scale{\int{interword}}{240}}
+\Fi
+
+
+
+\begincomment
+\section{Font dimensions and coding scheme}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+
+\ifnumber{\int{ligaturing}}={2}\then
+
+\setstr{codingscheme}{TEX TEXT}
+
+\Else\ifnumber{\int{ligaturing}}={1}\then
+
+\setstr{codingscheme}{TEX TEXT WITHOUT F-LIGATURES}
+
+\Else
+
+\setstr{codingscheme}{TEX TYPEWRITER TEXT}
+
+\Fi\Fi
+
+
+
+\begincomment
+\section{The encoding}
+
+There are 130 glyphs in this encoding. 128 of these are in Knuth's CM
+encoding, and the other two are `\l' and `\L', which are composite
+letters in CM, but are single glyphs in almost every other font.
+\endcomment
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon}
+ \comment{The greek letter `$\Upsilon$' named `\texttt{Upsilon1}' by
+ Adobe.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{2}\then
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `\texttt{\char`\'}',
+ for use with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\Else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\Fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{1}\then
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `\texttt{\char`\ }'.}
+\endsetslot
+
+\Else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\Fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\Else
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `\texttt{\char`\"}', included
+ for use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\Fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\ifnumber{\int{italicizing}}={0}\then
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\Else
+
+\setslot{sterling}
+ \comment{The pound sign `\pounds'.}
+\endsetslot
+
+\Fi
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteright}{quotedblright}
+ \Fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{hyphen}{rangedash}
+ \Fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{2}\then
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\Else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\Fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\Else
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\Fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\Else
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\texttt{\char`\_}', usually
+ set on the baseline.}
+\endsetslot
+
+\Fi
+
+\setslot{quoteleft}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{quoteleft}{quotedblleft}
+ \Fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+ \ifnumber{\int{ligaturing}}<{2}\then \Else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+ \Fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}>{0}\then
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `\texttt{1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `\texttt{Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\Else
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is included
+ for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\Fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\begincomment
+\section{Non-standard ligatures}
+
+The `\l' and `\L' glyphs are not usually in the ot1 encoding, but
+they're needed for fonts which don't have a special `lslashslash' glyph.
+\endcomment
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+1999/10/18: Introduced the \texttt{typewriter} integer and made changes
+for \verb|\showbranches|. (LH)
+
+1999/11/07: Removed the ``if \texttt{typewriter} then
+\texttt{monowidth}'' implication. Changed \texttt{fontdimen(7)} to zero
+in monowidth typewriter fonts. (LH)
+
+2002/07/31: Major update. The \verb|\currency| and
+\textit{typewriter} parameters were removed---instead the
+\textit{ligaturing} and \textit{italicizing} parameters were added.
+\verb|\setfontdimen| interface used for setting fontdimens. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1c.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1c.etx
new file mode 100644
index 0000000000..4251562e56
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1c.etx
@@ -0,0 +1,92 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team and
+% any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for small-caps fonts}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+This file is used to install a small-caps font in which the small-caps
+glyphs are named as $\langle$\textit{full cap glyph name}$\rangle +{}$%
+\texttt{small}. It is mainly used to install faked small-caps fonts,
+but it is also used to install small-caps fonts where the small-caps
+glyphs are taken from an Expert font.
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+% \setcommand\currency{dollar}
+
+% \comment{The default letter spacing is 1/10 of the design size, with
+% small caps 80\% the size of full caps.}
+
+% \setint{smallcapsscale}{800}
+
+% \ifisglyph{space}\then
+% \setint{interword}{\width{space}}
+% \Else\ifisglyph{i}\then
+% \setint{interword}{\width{i}}
+% \Else
+% \setint{interword}{333}
+% \Fi\Fi
+
+% \ifisint{monowidth}\then
+% \setint{smallcapsextraspace}
+% {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+% \setint{smallcapsspacing}{0}
+% \Else
+% \setint{smallcapsextraspace}{0}
+% \setint{smallcapsspacing}{50}
+% \Fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\Else\ifisint{smallcapsspacing}\then
+ \setint{letterspacing}{\int{smallcapsspacing}}
+\Fi\Fi
+
+\comment{Then we call \texttt{ot1.etx}.}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1999/10/26: Added \textsf{fontdoc} markup, made changes for
+\verb|\showbranches|, and code for things that was moved from encoding
+to metric files ages ago commented out. (LH)
+
+2002/07/31: Minor fixes. (LH)
+
+\end{document}
+
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1cj.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1cj.etx
new file mode 100644
index 0000000000..9be75daafb
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1cj.etx
@@ -0,0 +1,69 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for small-caps and hanging figures fonts}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+This file is used to install a small-caps and hanging (oldstyle)
+figures font in which the small-caps glyphs are named as
+$\langle$\textit{full cap glyph name}$\rangle +{}$\texttt{small} and
+the figures are named as $\langle$\textit{figure name}$\rangle + {}$%
+\texttt{oldstyle}. It is mainly used to install faked small-caps fonts,
+but it is also used to install small-caps fonts where the small-caps
+glyphs are taken from an Expert font.
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle}
+% \setcommand\currency{dollar}
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\Else\ifisint{letterspacing}\then
+ \setint{letterspacing}{\int{smallcapsspacing}}
+\Fi\Fi
+
+\inputetx{ot1}
+
+\endencoding
+
+
+\section{Changes}
+
+1999/10/27: Added \textsf{fontdoc} markup, made changes for
+\verb|\showbranches|, and code for things that was moved from encoding
+to metric files ages ago was removed. (LH)
+
+2002/07/31: Minor fixes. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1ctt.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1ctt.etx
new file mode 100644
index 0000000000..4ed62672b3
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1ctt.etx
@@ -0,0 +1,63 @@
+% Copyright 1993 Alan Jeffrey,
+% copyright 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for small-caps typewriter fonts}
+\author{Alan Jeffrey\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+The main use for this file is conversion from PL to MTX format of the
+metrics for a small-caps font with the \texttt{TEX TYPEWRITER TEXT}
+codingscheme. It can also be used to install an \texttt{OT1}-%
+typewriter encoded font with small-caps in the places of the lower case.
+
+\errorcontextlines=999
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setint{ligaturing}{0}
+
+\comment{Then we call \texttt{ot1c.etx}.}
+
+\inputetx{ot1c}
+
+\endencoding
+
+\section{Changes}
+
+1993/12/29: File created. (ASAJ)
+
+1999/11/04: Removed a lot of antiquated code (including two
+\verb|\setglyph| commands!!), updated for the v\,1.909 \texttt{ot1.etx},
+made the file call \texttt{ot1c.etx} rather than \texttt{ot1.etx}, and
+added \textsf{fontdoc} markup. (LH)
+
+2002/07/31: Minor fixes, after having updated \texttt{ot1.etx}. (LH)
+
+\end{document}
+
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1i.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1i.etx
new file mode 100644
index 0000000000..415d4826f8
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1i.etx
@@ -0,0 +1,56 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for italic fonts}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file is used to install an italic \texttt{OT1}-encoded font. It
+is necessary to distinguish between roman and italic in \texttt{OT1},
+because the \texttt{sterling} and \texttt{dollar} glyphs share the
+same slot.
+
+\section{Default values}
+\showbranches
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+% \setcommand\currency{sterling}
+\setint{italicizing}{1}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1999/10/27: Added \textsf{fontdoc} markup. (LH)
+
+2002/07/31:
+Minor update called for by changes in \texttt{ot1.etx}. (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1ij.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1ij.etx
new file mode 100644
index 0000000000..8564c3f50a
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1ij.etx
@@ -0,0 +1,56 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for italic fonts}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file is used to install an italic \texttt{OT1}-encoded font with
+hanging (oldstyle) digits. It is necessary to distinguish between roman
+and italic in \texttt{OT1}, because the \texttt{sterling} and
+\texttt{dollar} glyphs share the same slot.
+
+\section{Default values}
+\showbranches
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle}
+% \setcommand\currency{sterling}
+\setint{italicizing}{1}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1999/10/27: Added \textsf{fontdoc} markup. (LH)
+
+2002/07/31:
+Minor update called for by changes in \texttt{ot1.etx}. (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1itt.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1itt.etx
new file mode 100644
index 0000000000..37e9c8e371
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1itt.etx
@@ -0,0 +1,70 @@
+% Copyright 1993 Alan Jeffrey,
+% copyright 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/10/16]
+
+\title{The \texttt{OT1} encoding for italic typewriter fonts}
+\author{Alan Jeffrey\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+The main use for this file is conversion from PL to MTX format of the
+metrics for a font with the \texttt{TEX TYPEWRITER TEXT}
+codingscheme. It can also be used to install an \texttt{OT1}-%
+typewriter encoded font.
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+% \setint{typewriter}{0}
+% \setcommand\currency{dollar}
+
+\setint{italicizing}{1}
+\setint{ligaturing}{0}
+
+\comment{Then we call \texttt{ot1.etx}.}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1993/12/29: File created. (ASAJ)
+
+1999/11/04: Updated for v\,1.909 \texttt{ot1.etx} and added
+\textsf{fontdoc} markup. (LH)
+
+2002/07/31: Updated for v\,1.921 \texttt{ot1.etx} and corrected the
+name of the currency glyph. (LH)
+
+2004/11/24: Added ``italic'' to the document title. (LH)
+
+\end{document}
+
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1j.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1j.etx
new file mode 100644
index 0000000000..4fdd71bcad
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1j.etx
@@ -0,0 +1,52 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% copyright 1998, 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for italic fonts}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file is used to install an \texttt{OT1}-encoded font with hanging
+(oldstyle) digits.
+
+\section{Default values}
+\showbranches
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle}
+% \setcommand\currency{dollar}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1999/10/27: Added \textsf{fontdoc} markup. (LH)
+
+2002/07/31: Minor fixes. (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/ot1tt.etx b/fonts/utilities/fontinst/inputs/latinetx/ot1tt.etx
new file mode 100644
index 0000000000..23cbd66ac3
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/ot1tt.etx
@@ -0,0 +1,66 @@
+% Copyright 1993 Alan Jeffrey,
+% copyright 1999, 2002 the fontinst maintenance team
+% and any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/03/16]
+
+\title{The \texttt{OT1} encoding for typewriter fonts}
+\author{Alan Jeffrey\and Lars Hellstr\"om}
+\date{See also the normal \texttt{OT1} encoding}
+
+\begin{document}
+\maketitle
+
+The main use for this file is conversion from PL to MTX format of the
+metrics for a font with the \texttt{TEX TYPEWRITER TEXT}
+codingscheme. It can also be used to install an \texttt{OT1}-%
+encoded font with that codingscheme.
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+% \setint{typewriter}{0}
+% \setcommand\currency{dollar}
+\setint{ligaturing}{0}
+
+\comment{Then we call \texttt{ot1.etx}.}
+
+\inputetx{ot1}
+
+\endencoding
+
+\section{Changes}
+
+1993/12/29: File created. (ASAJ)
+
+1999/11/04: Updated for v\,1.909 \texttt{ot1.etx} and added
+\textsf{fontdoc} markup. (LH)
+
+2002/07/31: Updated for v\,1.921 \texttt{ot1.etx}. (LH)
+
+\end{document}
+
+
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1.etx b/fonts/utilities/fontinst/inputs/latinetx/t1.etx
new file mode 100644
index 0000000000..e44ef1cdd1
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1.etx
@@ -0,0 +1,1478 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Sebastian Rahtz and
+%%% Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.932",
+%%% date = "2005-05-27",
+%%% time = "16:17:50 +02:00",
+%%% filename = "t1.etx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the T1 encoding as a TeX font encoding
+%%% file, for use with the fontinst utility.
+%%% It implements the TeX extended text encoding.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage[TS1,T1]{fontenc}
+\usepackage{textcomp}
+\usepackage{fontdoc}
+
+\showbranches
+
+\title{The \TeX\ extended text encoding vector}
+\author{Alan Jeffrey\and Sebastian Rahtz\and Ulrik Vieth\and
+ Lars Hellstr\"om}
+\date{26 October 2002\\Version 1.923}
+
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the Cork (\texttt{T1}) text encoding.
+
+The following macros play an important role in this file, since they
+are involved in determining the names of most glyphs that will be put
+in some slot.
+\begin{itemize}
+\item
+ \verb|\lc{A}{a}| should return the name of a lower-case
+ glyph, for example `\texttt{a}' or `\texttt{Asmall}'.
+\item
+ \verb|\uc{A}{a}| should return the name of an upper-case
+ glyph, for example `\texttt{A}' or `\texttt{Amedium}'.
+\item
+ \verb|\lctop{Aacute}{aacute}| should return the name of a
+ lower-case composite glyph formed from putting a diacritical above
+ a letter, for example `\texttt{aacute}' or `\texttt{Aacutesmall}'.
+\item
+ \verb|\uctop{Aacute}{aacute}| should return the name of an
+ upper-case composite glyph formed from putting a diacritical above
+ a letter, for example `\texttt{Aacute}' or `\texttt{Aacutemedium}'.
+\item
+ \verb|\lclig{FI}{fi}| should return the name of a lower-case
+ ligature, for example `\texttt{fi}' or `\texttt{FIsmall}'.
+\item
+ \verb|\uclig{FI}{fi}| should return the name of an upper-case
+ ligature, for example `\texttt{FI}' or `\texttt{FImedium}'.
+\item
+ \verb|\digit{zero}| should return the name of a digit, for
+ example `\texttt{zero}' or `\texttt{zerooldstyle}'.
+\end{itemize}
+By explicitly defining them, the encoding can (to some extent) be
+customised. All these macros should expand in the mouth,
+otherwise you may get error messages!
+
+For example, to get the standard upper and lower case font (which is
+the default), you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lctop#1#2{#2}
+ \setcommand\uctop#1#2{#1}
+ \setcommand\lclig#1#2{#2}
+ \setcommand\uclig#1#2{#1}
+ \setcommand\digit#1{#1}
+\end{verbatim}
+To get a caps and small caps font with old style digits and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1small}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lctop#1#2{#1small}
+ \setcommand\uctop#1#2{#1}
+ \setcommand\lclig#1#2{#2small}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1oldstyle}
+\end{verbatim}
+To get an all-caps font with medium-cap composite letters and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lctop#1#2{#1medium}
+ \setcommand\uctop#1#2{#1medium}
+ \setcommand\lclig#1#2{#1spaced}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1}
+\end{verbatim}
+In this document, the glyph names shown are for the upper and
+lower case variant.
+
+Another important parameter is the integer variable \textit{ligaturing},
+which controls to what extent (non-mandatory) ligatures are made. The
+value of this variable is interpreted as follows:
+\begin{enumerate}
+ \item[$1$]
+ All the standard ligature glyphs (\texttt{fi}, \texttt{fl},
+ \texttt{ff}, \texttt{ffi}, \texttt{ffl}, \texttt{IJ}, and
+ \texttt{ij}) are included and the normal ligaturing instructions
+ (those for the \texttt{f}-ligatures) are included.
+ \item[$0$]
+ All the standard ligature glyphs are included, but none of their
+ ligaturing instructions.
+ \item[$-1$]
+ The seven slots normally used for ligatures are left empty.
+ \item[$-2$]
+ The seven slots normally used for ligatures are left empty, as
+ are the slots normally used for \texttt{c}, \texttt{f},
+ \texttt{s}, \texttt{i}, and \texttt{I}.
+\end{enumerate}
+The default value is $0$ for monowidth or letterspaced fonts (because
+the ligature glyphs in such fonts are often useless, or at least not
+looking right) and $1$ otherwise. The negative values are useful when
+making fonts with a nonstandard set of ligatures; the idea is that
+some other (smaller) encoding file should set these remaining slots.
+
+
+\encoding
+
+\needsfontinstversion{1.910}
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\ifisint{letterspacing}\then
+ \ifnumber{\int{letterspacing}}={0}\then \Else
+ \setcommand\uclig#1#2{#1spaced}
+ \comment{Here we set \verb|\uclig#1#2| to \verb|#1spaced|, but
+ you can't see it as \verb|\setcommand| commands are invisible in
+ the typeset output.}
+ \Fi
+\Fi
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+
+\ifisint{monowidth}\then
+ \setint{ligaturing}{0}
+\Else
+ % The following empty line is *important* to get the formatting
+ % right here (sigh)! (Remember that it is a \par token.)
+
+ \ifisint{letterspacing}\then
+ \ifnumber{\int{letterspacing}}={0}\then \Else
+ \setint{ligaturing}{0}
+ \Fi
+ \Fi
+ \setint{ligaturing}{1}
+\Fi
+
+
+\comment{The remaining code in this section sets various metric
+parameters for the font. Ideally, all these parameters should already
+have been set; the values computed here are merely crude guesses
+about what might be the right value.}
+
+\setint{italicslant}{0}
+\setint{quad}{1000}
+\setint{baselineskip}{1200}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\Else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\Else
+ \setint{interword}{333}
+\Fi\Fi
+
+\ifisint{monowidth}\then
+ \setint{stretchword}{0}
+ \setint{shrinkword}{0}
+ \setint{extraspace}{\int{interword}}
+\Else
+ \setint{stretchword}{\scale{\int{interword}}{600}}
+ \setint{shrinkword}{\scale{\int{interword}}{240}}
+ \setint{extraspace}{\scale{\int{interword}}{240}}
+\Fi
+
+% added by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>
+% 1997/02/07 to calculate values for extra EC fontdimens
+% Amended by SPQR 1997/02/09
+\ifisglyph{X}\then
+ \setint{capheight}{\height{X}}
+\Else
+ \setint{capheight}{750}
+\Fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\Else\ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+\Else
+ \setint{ascender}{750}
+\Fi\Fi
+
+\ifisglyph{Aring}\then
+ \setint{acccapheight}{\height{Aring}}
+\Else
+ \setint{acccapheight}{999}
+\Fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+\Else\ifisglyph{p}\then
+ \setint{descender}{\depth{p}}
+\Else
+ \setint{descender}{250}
+\Fi\Fi
+
+\ifisglyph{Aring}\then
+ \setint{maxheight}{\height{Aring}}
+\Else
+ \setint{maxheight}{1000}
+\Fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\Else\ifisglyph{j}\then
+ \setint{maxdepth}{\depth{j}}
+\Else
+ \setint{maxdepth}{250}
+\Fi\Fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\Else
+ \setint{digitwidth}{500}
+\Fi
+
+\setint{capstem}{0} % not in AFM files
+% end changes by Thierry
+
+
+\begincomment
+\section{Font parameters}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+\setfontdimen{8}{capheight} % cap height
+\setfontdimen{9}{ascender} % ascender
+\setfontdimen{10}{acccapheight} % accented cap height
+\setfontdimen{11}{descender} % descender's depth
+\setfontdimen{12}{maxheight} % max height
+\setfontdimen{13}{maxdepth} % max depth
+\setfontdimen{14}{digitwidth} % digit width
+\setfontdimen{15}{verticalstem} % dominant width of verical stems
+\setfontdimen{16}{baselineskip} % baselineskip
+
+\ifnumber{\int{ligaturing}}<{0}\then
+ \comment{In this case, the codingscheme can be different from the
+ default, and therefore we refrain from setting it.}
+\Else
+ \setstr{codingscheme}{EXTENDED TEX FONT ENCODING - LATIN}
+\Fi
+
+
+
+\begincomment
+\section{The encoding}
+There are 256 glyphs in this encoding.
+\endcomment
+
+\setslot{\lc{Grave}{grave}}
+ \comment{The grave accent `\`{}'.}
+\endsetslot
+
+\setslot{\lc{Acute}{acute}}
+ \comment{The acute accent `\'{}'.}
+\endsetslot
+
+\setslot{\lc{Circumflex}{circumflex}}
+ \comment{The circumflex accent `\^{}'.}
+\endsetslot
+
+\setslot{\lc{Tilde}{tilde}}
+ \comment{The tilde accent `\~{}'.}
+\endsetslot
+
+\setslot{\lc{Dieresis}{dieresis}}
+ \comment{The umlaut or dieresis accent `\"{}'.}
+\endsetslot
+
+\setslot{\lc{Hungarumlaut}{hungarumlaut}}
+ \comment{The long Hungarian umlaut `\H{}'.}
+\endsetslot
+
+\setslot{\lc{Ring}{ring}}
+ \comment{The ring accent `\r{}'.}
+\endsetslot
+
+\setslot{\lc{Caron}{caron}}
+ \comment{The caron or h\'a\v cek accent `\v{}'.}
+\endsetslot
+
+\setslot{\lc{Breve}{breve}}
+ \comment{The breve accent `\u{}'.}
+\endsetslot
+
+\setslot{\lc{Macron}{macron}}
+ \comment{The macron accent `\={}'.}
+\endsetslot
+
+\setslot{\lc{Dotaccent}{dotaccent}}
+ \comment{The dot accent `\.{}'.}
+\endsetslot
+
+\setslot{\lc{Cedilla}{cedilla}}
+ \comment{The cedilla accent `\c {}'.}
+\endsetslot
+
+\setslot{\lc{Ogonek}{ogonek}}
+ \comment{The ogonek accent `\k {}'.}
+\endsetslot
+
+\setslot{quotesinglbase}
+ \comment{A German single quote mark `\quotesinglbase' similar to a comma,
+ but with different sidebearings.}
+\endsetslot
+
+\setslot{guilsinglleft}
+ \comment{A French single opening quote mark `\guilsinglleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{guilsinglright}
+ \comment{A French single closing quote mark `\guilsinglright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{quotedblleft}
+ \comment{The English opening quote mark `\,\textquotedblleft\,'.}
+\endsetslot
+
+\setslot{quotedblright}
+ \comment{The English closing quote mark `\,\textquotedblright\,'.}
+\endsetslot
+
+\setslot{quotedblbase}
+ \comment{A German double quote mark `\quotedblbase' similar to two commas,
+ but with tighter letterspacing and different sidebearings.}
+\endsetslot
+
+\setslot{guillemotleft}
+ \comment{A French double opening quote mark `\guillemotleft',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{guillemotright}
+ \comment{A French closing opening quote mark `\guillemotright',
+ unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `\texttt{1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `\texttt{Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{compwordmark}
+ \comment{An invisible glyph, with zero width and depth, but the
+ height of lowercase letters without ascenders.
+ It is used to stop ligaturing in words like `shelf{}ful'.}
+\endsetslot
+
+\setslot{perthousandzero}
+ \comment{A glyph which is placed after `\%' to produce a
+ `per-thousand', or twice to produce `per-ten-thousand'.
+ Your guess is as good as mine as to what this glyph should look
+ like in a monowidth font.}
+\endsetslot
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{0}\then \skipslots{5}\Else
+
+\setslot{\lclig{FF}{ff}}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \Fi
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\Fi
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `\textvisiblespace'.}
+\endsetslot
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\setslot{quotedbl}
+ \comment{The `neutral' double quotation mark `\,\textquotedbl\,',
+ included for use in monowidth fonts, or for setting computer
+ programs. Note that the inclusion of this glyph in this slot
+ means that \TeX\ documents which used `{\tt\char`\"}' as an
+ input character will no longer work.}
+\endsetslot
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{dollar}
+ \comment{The dollar sign `\$'.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \ligature{LIG}{quoteright}{quotedblright}
+ \comment{The English closing single quote mark `\,\textquoteright\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \ligature{LIG}{comma}{quotedblbase}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \ligature{LIG}{hyphen}{rangedash}
+ \ligature{LIG}{hyphenchar}{hyphenchar}
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The period `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\setslot{less}
+ \ligature{LIG}{less}{guillemotleft}
+ \comment{The less-than sign `\textless'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \ligature{LIG}{greater}{guillemotright}
+ \comment{The greater-than sign `\textgreater'.}
+\endsetslot
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{-1}\then \skipslots{1}\Else
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\Fi
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique `\textbackslash'.}
+\endsetslot
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{asciicircum}
+ \comment{The ASCII upward-pointing arrow head `\textasciicircum'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{underscore}
+ \comment{The ASCII underline character `\textunderscore', usually
+ set on the baseline.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{quoteleft}
+ \ligature{LIG}{quoteleft}{quotedblleft}
+ \comment{The English opening single quote mark `\,\textquoteleft\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{-1}\then \skipslots{1}\Else
+
+ \setslot{\lc{C}{c}}
+ \comment{The letter `{c}'.}
+ \endsetslot
+
+\Fi
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{-1}\then \skipslots{1}\Else
+
+ \setslot{\lc{F}{f}}
+ \ifnumber{\int{ligaturing}}>{0}\then
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+ \Fi
+ \comment{The letter `{f}'.}
+ \endsetslot
+
+\Fi
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{-1}\then \skipslots{1}\Else
+
+ \setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+ \endsetslot
+
+\Fi
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{-1}\then \skipslots{1}\Else
+
+ \setslot{\lc{S}{s}}
+ \comment{The letter `{s}'.}
+ \endsetslot
+
+\Fi
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\textbraceleft'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `\textbar'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\textbraceright'.}
+\endsetslot
+
+\setslot{asciitilde}
+ \comment{The ASCII tilde `\textasciitilde'.
+ This is included for compatibility with typewriter fonts used
+ for computer listings.}
+\endsetslot
+
+\setslot{hyphenchar}
+ \comment{The glyph used for hyphenation in this font, which will
+ almost always be the same as `hyphen'.}
+\endsetslot
+
+\setslot{\uctop{Abreve}{abreve}}
+ \comment{The letter `\u A'.}
+\endsetslot
+
+\setslot{\uc{Aogonek}{aogonek}}
+ \comment{The letter `\k A'.}
+\endsetslot
+
+\setslot{\uctop{Cacute}{cacute}}
+ \comment{The letter `\' C'.}
+\endsetslot
+
+\setslot{\uctop{Ccaron}{ccaron}}
+ \comment{The letter `\v C'.}
+\endsetslot
+
+\setslot{\uctop{Dcaron}{dcaron}}
+ \comment{The letter `\v D'.}
+\endsetslot
+
+\setslot{\uctop{Ecaron}{ecaron}}
+ \comment{The letter `\v E'.}
+\endsetslot
+
+\setslot{\uc{Eogonek}{eogonek}}
+ \comment{The letter `\k E'.}
+\endsetslot
+
+\setslot{\uctop{Gbreve}{gbreve}}
+ \comment{The letter `\u G'.}
+\endsetslot
+
+\setslot{\uctop{Lacute}{lacute}}
+ \comment{The letter `\' L'.}
+\endsetslot
+
+\setslot{\uc{Lcaron}{lcaron}}
+ \comment{The letter `\v L'.}
+\endsetslot
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\setslot{\uctop{Nacute}{nacute}}
+ \comment{The letter `\' N'.}
+\endsetslot
+
+\setslot{\uctop{Ncaron}{ncaron}}
+ \comment{The letter `\v N'.}
+\endsetslot
+
+\setslot{\uc{Ng}{ng}}
+ \comment{The Sami letter `\NG'. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Ohungarumlaut}{ohungarumlaut}}
+ \comment{The letter `\H O'.}
+\endsetslot
+
+\setslot{\uctop{Racute}{racute}}
+ \comment{The letter `\' R'.}
+\endsetslot
+
+\setslot{\uctop{Rcaron}{rcaron}}
+ \comment{The letter `\v R'.}
+\endsetslot
+
+\setslot{\uctop{Sacute}{sacute}}
+ \comment{The letter `\' S'.}
+\endsetslot
+
+\setslot{\uctop{Scaron}{scaron}}
+ \comment{The letter `\v S'.}
+\endsetslot
+
+\setslot{\uc{Scedilla}{scedilla}}
+ \comment{The letter `\c S'.}
+\endsetslot
+
+\setslot{\uctop{Tcaron}{tcaron}}
+ \comment{The letter `\v T'.}
+\endsetslot
+
+\setslot{\uc{Tcedilla}{tcedilla}}
+ \comment{The letter `\c T'.}
+\endsetslot
+
+\setslot{\uctop{Uhungarumlaut}{uhungarumlaut}}
+ \comment{The letter `\H U'.}
+\endsetslot
+
+\setslot{\uctop{Uring}{uring}}
+ \comment{The letter `\r U'.}
+\endsetslot
+
+\setslot{\uctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\" Y'.}
+\endsetslot
+
+\setslot{\uctop{Zacute}{zacute}}
+ \comment{The letter `\' Z'.}
+\endsetslot
+
+\setslot{\uctop{Zcaron}{zcaron}}
+ \comment{The letter `\v Z'.}
+\endsetslot
+
+\setslot{\uctop{Zdotaccent}{zdotaccent}}
+ \comment{The letter `\. Z'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{0}\then \skipslots{1}\Else
+
+ \setslot{\uclig{IJ}{ij}}
+ \comment{The letter `IJ'. This is a single letter, and in a
+ monowidth font should ideally be one letter wide.}
+ \endsetslot
+
+\Fi
+
+\setslot{\uctop{Idotaccent}{idotaccent}}
+ \comment{The letter `\. I'.}
+\endsetslot
+
+\setslot{\lc{Dbar}{dbar}}
+ \comment{The letter `\dj'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `\textsection'.}
+\endsetslot
+
+\setslot{\lctop{Abreve}{abreve}}
+ \comment{The letter `\u a'.}
+\endsetslot
+
+\setslot{\lc{Aogonek}{aogonek}}
+ \comment{The letter `\k a'.}
+\endsetslot
+
+\setslot{\lctop{Cacute}{cacute}}
+ \comment{The letter `\' c'.}
+\endsetslot
+
+\setslot{\lctop{Ccaron}{ccaron}}
+ \comment{The letter `\v c'.}
+\endsetslot
+
+\setslot{\lctop{Dcaron}{dcaron}}
+ \comment{The letter `\v d'.}
+\endsetslot
+
+\setslot{\lctop{Ecaron}{ecaron}}
+ \comment{The letter `\v e'.}
+\endsetslot
+
+\setslot{\lc{Eogonek}{eogonek}}
+ \comment{The letter `\k e'.}
+\endsetslot
+
+\setslot{\lctop{Gbreve}{gbreve}}
+ \comment{The letter `\u g'.}
+\endsetslot
+
+\setslot{\lctop{Lacute}{lacute}}
+ \comment{The letter `\' l'.}
+\endsetslot
+
+\setslot{\lc{Lcaron}{lcaron}}
+ \comment{The letter `\v l'.}
+\endsetslot
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\setslot{\lctop{Nacute}{nacute}}
+ \comment{The letter `\' n'.}
+\endsetslot
+
+\setslot{\lctop{Ncaron}{ncaron}}
+ \comment{The letter `\v n'.}
+\endsetslot
+
+\setslot{\lc{Ng}{ng}}
+ \comment{The Sami letter `\ng'. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ohungarumlaut}{ohungarumlaut}}
+ \comment{The letter `\H o'.}
+\endsetslot
+
+\setslot{\lctop{Racute}{racute}}
+ \comment{The letter `\' r'.}
+\endsetslot
+
+\setslot{\lctop{Rcaron}{rcaron}}
+ \comment{The letter `\v r'.}
+\endsetslot
+
+\setslot{\lctop{Sacute}{sacute}}
+ \comment{The letter `\' s'.}
+\endsetslot
+
+\setslot{\lctop{Scaron}{scaron}}
+ \comment{The letter `\v s'.}
+\endsetslot
+
+\setslot{\lc{Scedilla}{scedilla}}
+ \comment{The letter `\c s'.}
+\endsetslot
+
+\setslot{\lctop{Tcaron}{tcaron}}
+ \comment{The letter `\v t'.}
+\endsetslot
+
+\setslot{\lc{Tcedilla}{tcedilla}}
+ \comment{The letter `\c t'.}
+\endsetslot
+
+\setslot{\lctop{Uhungarumlaut}{uhungarumlaut}}
+ \comment{The letter `\H u'.}
+\endsetslot
+
+\setslot{\lctop{Uring}{uring}}
+ \comment{The letter `\r u'.}
+\endsetslot
+
+\setslot{\lctop{Ydieresis}{ydieresis}}
+ \comment{The letter `\" y'.}
+\endsetslot
+
+\setslot{\lctop{Zacute}{zacute}}
+ \comment{The letter `\' z'.}
+\endsetslot
+
+\setslot{\lctop{Zcaron}{zcaron}}
+ \comment{The letter `\v z'.}
+\endsetslot
+
+\setslot{\lctop{Zdotaccent}{zdotaccent}}
+ \comment{The letter `\. z'.}
+\endsetslot
+
+\ifnumber{\int{ligaturing}}<{0}\then \skipslots{1}\Else
+
+ \setslot{\lclig{IJ}{ij}}
+ \comment{The letter `ij'. This is a single letter, and in a
+ monowidth font should ideally be one letter wide.}
+ \endsetslot
+
+\Fi
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\setslot{sterling}
+ \comment{The British currency mark `\textsterling'.}
+\endsetslot
+
+\setslot{\uctop{Agrave}{agrave}}
+ \comment{The letter `\` A'.}
+\endsetslot
+
+\setslot{\uctop{Aacute}{aacute}}
+ \comment{The letter `\' A'.}
+\endsetslot
+
+\setslot{\uctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^ A'.}
+\endsetslot
+
+\setslot{\uctop{Atilde}{atilde}}
+ \comment{The letter `\~ A'.}
+\endsetslot
+
+\setslot{\uctop{Adieresis}{adieresis}}
+ \comment{The letter `\" A'.}
+\endsetslot
+
+\setslot{\uctop{Aring}{aring}}
+ \comment{The letter `\r A'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c C'.}
+\endsetslot
+
+\setslot{\uctop{Egrave}{egrave}}
+ \comment{The letter `\` E'.}
+\endsetslot
+
+\setslot{\uctop{Eacute}{eacute}}
+ \comment{The letter `\' E'.}
+\endsetslot
+
+\setslot{\uctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^ E'.}
+\endsetslot
+
+\setslot{\uctop{Edieresis}{edieresis}}
+ \comment{The letter `\" E'.}
+\endsetslot
+
+\setslot{\uctop{Igrave}{igrave}}
+ \comment{The letter `\` I'.}
+\endsetslot
+
+\setslot{\uctop{Iacute}{iacute}}
+ \comment{The letter `\' I'.}
+\endsetslot
+
+\setslot{\uctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^ I'.}
+\endsetslot
+
+\setslot{\uctop{Idieresis}{idieresis}}
+ \comment{The letter `\" I'.}
+\endsetslot
+
+\setslot{\uc{Eth}{eth}}
+ \comment{The uppercase Icelandic letter `Eth' similar to a `D'
+ with a horizontal bar through the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uctop{Ntilde}{ntilde}}
+ \comment{The letter `\~ N'.}
+\endsetslot
+
+\setslot{\uctop{Ograve}{ograve}}
+ \comment{The letter `\` O'.}
+\endsetslot
+
+\setslot{\uctop{Oacute}{oacute}}
+ \comment{The letter `\' O'.}
+\endsetslot
+
+\setslot{\uctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^ O'.}
+\endsetslot
+
+\setslot{\uctop{Otilde}{otilde}}
+ \comment{The letter `\~ O'.}
+\endsetslot
+
+\setslot{\uctop{Odieresis}{odieresis}}
+ \comment{The letter `\" O'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\O'.}
+\endsetslot
+
+\setslot{\uctop{Ugrave}{ugrave}}
+ \comment{The letter `\` U'.}
+\endsetslot
+
+\setslot{\uctop{Uacute}{uacute}}
+ \comment{The letter `\' U'.}
+\endsetslot
+
+\setslot{\uctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^ U'.}
+\endsetslot
+
+\setslot{\uctop{Udieresis}{udieresis}}
+ \comment{The letter `\" U'.}
+\endsetslot
+
+\setslot{\uctop{Yacute}{yacute}}
+ \comment{The letter `\' Y'.}
+\endsetslot
+
+\setslot{\uc{Thorn}{thorn}}
+ \comment{The Icelandic capital letter Thorn, similar to a `P'
+ with the bowl moved down. It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\uclig{SS}{germandbls}}
+ \comment{The ligature `SS', used to give an upper case `\ss'.
+ In a monowidth font it should be two letters wide.}
+\endsetslot
+
+\setslot{\lctop{Agrave}{agrave}}
+ \comment{The letter `\` a'.}
+\endsetslot
+
+\setslot{\lctop{Aacute}{aacute}}
+ \comment{The letter `\' a'.}
+\endsetslot
+
+\setslot{\lctop{Acircumflex}{acircumflex}}
+ \comment{The letter `\^ a'.}
+\endsetslot
+
+\setslot{\lctop{Atilde}{atilde}}
+ \comment{The letter `\~ a'.}
+\endsetslot
+
+\setslot{\lctop{Adieresis}{adieresis}}
+ \comment{The letter `\" a'.}
+\endsetslot
+
+\setslot{\lctop{Aring}{aring}}
+ \comment{The letter `\r a'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{Ccedilla}{ccedilla}}
+ \comment{The letter `\c c'.}
+\endsetslot
+
+\setslot{\lctop{Egrave}{egrave}}
+ \comment{The letter `\` e'.}
+\endsetslot
+
+\setslot{\lctop{Eacute}{eacute}}
+ \comment{The letter `\' e'.}
+\endsetslot
+
+\setslot{\lctop{Ecircumflex}{ecircumflex}}
+ \comment{The letter `\^ e'.}
+\endsetslot
+
+\setslot{\lctop{Edieresis}{edieresis}}
+ \comment{The letter `\" e'.}
+\endsetslot
+
+\setslot{\lctop{Igrave}{igrave}}
+ \comment{The letter `\`\i'.}
+\endsetslot
+
+\setslot{\lctop{Iacute}{iacute}}
+ \comment{The letter `\'\i'.}
+\endsetslot
+
+\setslot{\lctop{Icircumflex}{icircumflex}}
+ \comment{The letter `\^\i'.}
+\endsetslot
+
+\setslot{\lctop{Idieresis}{idieresis}}
+ \comment{The letter `\"\i'.}
+\endsetslot
+
+\setslot{\lc{Eth}{eth}}
+ \comment{The Icelandic lowercase letter `eth' similar to
+ a `$\partial$' with an oblique bar through the stem.
+ It is unavailable in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lctop{Ntilde}{ntilde}}
+ \comment{The letter `\~ n'.}
+\endsetslot
+
+\setslot{\lctop{Ograve}{ograve}}
+ \comment{The letter `\` o'.}
+\endsetslot
+
+\setslot{\lctop{Oacute}{oacute}}
+ \comment{The letter `\' o'.}
+\endsetslot
+
+\setslot{\lctop{Ocircumflex}{ocircumflex}}
+ \comment{The letter `\^ o'.}
+\endsetslot
+
+\setslot{\lctop{Otilde}{otilde}}
+ \comment{The letter `\~ o'.}
+\endsetslot
+
+\setslot{\lctop{Odieresis}{odieresis}}
+ \comment{The letter `\" o'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\lctop{Ugrave}{ugrave}}
+ \comment{The letter `\` u'.}
+\endsetslot
+
+\setslot{\lctop{Uacute}{uacute}}
+ \comment{The letter `\' u'.}
+\endsetslot
+
+\setslot{\lctop{Ucircumflex}{ucircumflex}}
+ \comment{The letter `\^ u'.}
+\endsetslot
+
+\setslot{\lctop{Udieresis}{udieresis}}
+ \comment{The letter `\" u'.}
+\endsetslot
+
+\setslot{\lctop{Yacute}{yacute}}
+ \comment{The letter `\' y'.}
+\endsetslot
+
+\setslot{\lc{Thorn}{thorn}}
+ \comment{The Icelandic lowercase letter `thorn', similar to a `p'
+ with an ascender rising from the stem. It is unavailable
+ in \plain\ \TeX.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\endencoding
+
+
+\section{Changes}
+
+This is one of the files which have been with \textsf{fontinst}
+``forever'', so a lot of the early changes where probably never
+recorded. The following are from the \texttt{CHANGES} file.
+
+1994/06/01 (v\,1.327): Removed the f-ligatures for monowidth fonts.
+(ASAJ) Sebastian spotted that one.
+
+1994/11/29 (v\,1.401): Added \texttt{hyphen}${}*{}$\texttt{hyphenchar}%
+${}\rightarrow{}$\texttt{hyphenchar} ligature (so that foo-bar words
+can be hyphenated as foo$\langle\mbox{\textit{hyphenchar}}\rangle$bar)%
+---spotted by Frank Mittelbach. Made default stretch and shrink 50\%
+and 16.7\% of interword space respectively. (ASAJ)
+
+1996/01/23 (v\,1.504):
+Included some of Sebastian's changes: upped stretch and shrink to $.6$
+and $.24$ of space; reduced extra space after {.} to $.24$ of space;
+made \verb|\setslot{grave}| etc.\ into
+\verb|\setslot{\lc{Grave}{grave}}| etc. (ASAJ)
+
+\bigskip
+\noindent The following changes have been made after changes stopped
+being recorded in the \texttt{CHANGES} file.
+
+1997/02/07 (v\,1.7): Added code for calculating values for and setting
+the extra fontdimens found in the \texttt{ec} fonts. (Thierry Bouche)
+
+1998/06/29 (v\,1.8): Using \texttt{T1} encoding for character
+examples. (UV)
+
+2002/10/26 (v\,1.923): Added \TypesetIntegerExpression{\int{ligaturing}}
+parameter. Using \verb|\showbranches|. Using \verb|\setfontdimen|.
+Changed definition of fontdimen 15 slightly---from ``the width of
+capital vertical stems'' to ``the dominant width of vertical stems'',
+which is provided in AFM files. (LH)
+
+2005/05/27 (v\,1.932): Modified defaults for |\uclig| and
+$\TypesetIntegerExpression{\int{ligaturing}}$ in fonts with
+letterspacing, to use \texttt{spaced} glyphs and not make ligatures
+respectively. (LH) Rationale (from discussion with Philipp Lehman):
+The non-\texttt{spaced} and ready-made ligature glyphs are often
+unnaturally cramped in comparison with other letterspaced character
+sequences. The system is probably overly complicated, but can be kept
+for historical reasons.
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1c.etx b/fonts/utilities/fontinst/inputs/latinetx/t1c.etx
new file mode 100644
index 0000000000..2805f64d46
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1c.etx
@@ -0,0 +1,63 @@
+\relax
+
+% t1c.etx -- install a T1-encoded faked small-caps font
+%
+% This is used to install expertized or faked small-caps fonts;
+% real small caps fonts built from fonts with variant c8r are
+% installed using the default t1.etx.
+
+\encoding
+
+% We define the parameters for t1.etx to produce a c&sc font.
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1}
+
+%%
+ % Commented out 2002/12/14, since t1.etx does this more carefully
+ % anyway. It could perhaps be useful to use the width of `Ismall'
+ % instead of `i', but even that is dubious. (LH)
+ %
+ % \ifisglyph{space}\then
+ % \setint{interword}{\width{space}}
+ % \else\ifisglyph{i}\then
+ % \setint{interword}{\width{i}}
+ % \else
+ % \setint{interword}{333}
+ % \fi\fi
+ %%
+
+%%
+ % Commented out 2002/12/14, since these parameters are anyway never used
+ % by t1.etx (they are used by latin.mtx, but by the time we get here, that
+ % file has already been processed). (LH)
+ %
+ % % The default letter spacing is 1/10 of the design size, with small
+ % % caps 80% the size of large caps.
+ %
+ % \setint{smallcapsscale}{800}
+ %
+ % \ifisint{monowidth}\then
+ % \setint{smallcapsextraspace}
+ % {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ % \setint{smallcapsspacing}{0}
+ % \else
+ % \setint{smallcapsextraspace}{50}
+ % \setint{smallcapsspacing}{50}
+ % \fi
+ %%
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call t1.etx.
+
+\inputetx{t1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1cj.etx b/fonts/utilities/fontinst/inputs/latinetx/t1cj.etx
new file mode 100644
index 0000000000..2c80b3821b
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1cj.etx
@@ -0,0 +1,51 @@
+\relax
+
+% t1cj.etx -- install a T1-encoded faked small-caps & oldstyle font
+%
+% This is used to install expertized or faked small-caps fonts;
+% real small caps fonts built from fonts with variant c8r are
+% installed using the default t1.etx.
+
+\encoding
+
+% We define the parameters for t1.etx to produce a c&sc font.
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+\setcommand\digit#1{#1oldstyle}
+
+% The default letter spacing is 1/10 of the design size, with small
+% caps 80% the size of large caps.
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{50}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\fi
+
+% Then we call t1.etx.
+
+\inputetx{t1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1i.etx b/fonts/utilities/fontinst/inputs/latinetx/t1i.etx
new file mode 100644
index 0000000000..99b9819b20
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1i.etx
@@ -0,0 +1,20 @@
+\relax
+
+% t1i.etx -- install a T1-encoded italic font
+%
+% We do not need to distinguish between roman and italic in T1,
+% hence we simply call t1.etx with default parameters.
+
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+
+\inputetx{t1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1ij.etx b/fonts/utilities/fontinst/inputs/latinetx/t1ij.etx
new file mode 100644
index 0000000000..6eb3e28619
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1ij.etx
@@ -0,0 +1,20 @@
+\relax
+
+% t1ij.etx -- install a T1-encoded italic font with oldstyle digits
+%
+% We do not need to distinguish between roman and italic in T1,
+% hence we simply call t1.etx with oldstyle parameters.
+
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle}
+
+\inputetx{t1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/latinetx/t1j.etx b/fonts/utilities/fontinst/inputs/latinetx/t1j.etx
new file mode 100644
index 0000000000..b8e575968e
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/t1j.etx
@@ -0,0 +1,20 @@
+\relax
+
+% t1j.etx -- install a T1-encoded roman font with oldstyle digits
+%
+% We do not need to distinguish between roman and italic in T1,
+% hence we simply call t1.etx with oldstyle parameters.
+
+\encoding
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#2}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle}
+
+\inputetx{t1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/latinetx/txtfdmns.etx b/fonts/utilities/fontinst/inputs/latinetx/txtfdmns.etx
new file mode 100644
index 0000000000..a2242468b6
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinetx/txtfdmns.etx
@@ -0,0 +1,136 @@
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\begin{document}
+
+\title{\texttt{textfdim} --- text font dimensions}
+\author{Alan Jeffrey\and Thierry Bouche\and Sebastian Rahtz\and
+ Lars Hellstr\"om}
+\date{2002/10/25}
+\maketitle
+
+\begin{abstract}
+ This encoding file sets font dimensions 1--16 as for modern
+ (\texttt{T1}-encoded) text fonts. Much of the code comes from
+ \texttt{t1.etx}.
+\end{abstract}
+
+\showbranches
+
+\encoding
+
+\needsfontinstversion{1.917}
+
+\begincomment
+\section{Default values}
+
+This code tries to produce reasonable values for the font dimensions,
+in case the font metrics didn't specify them. Preferably, all the
+integers computed below should already be set.
+\endcomment
+
+
+\setint{italicslant}{0}
+\setint{quad}{1000}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\Else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\Else
+ \setint{interword}{333}
+\Fi\Fi
+
+\ifisint{monowidth}\then
+ \setint{stretchword}{0}
+ \setint{shrinkword}{0}
+ \setint{extraspace}{\int{interword}}
+\Else
+ \setint{stretchword}{\scale{\int{interword}}{600}}
+ \setint{shrinkword}{\scale{\int{interword}}{240}}
+ \setint{extraspace}{\scale{\int{interword}}{240}}
+\Fi
+
+
+\ifisglyph{X}\then
+ \setint{capheight}{\height{X}}
+\Else
+ \setint{capheight}{750}
+\Fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\Else
+ \setint{ascender}{\int{capheight}}
+\Fi
+
+\ifisglyph{Aring}\then
+ \setint{acccapheight}{\height{Aring}}
+ \setint{maxheight}{\height{Aring}}
+\Else
+ \setint{acccapheight}{999}
+ \setint{maxheight}{1000}
+\Fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+\Else\ifisglyph{p}\then
+ \setint{descender}{\depth{p}}
+\Else
+ \setint{descender}{250}
+\Fi\Fi
+
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\Else\ifisglyph{j}\then
+ \setint{maxdepth}{\depth{j}}
+\Else
+ \setint{maxdepth}{250}
+\Fi\Fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\Else
+ \setint{digitwidth}{500}
+\Fi
+
+\setint{baselineskip}{1200}
+
+
+\begincomment
+\section{Defining font dimensions}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+\setfontdimen{8}{capheight} % cap height
+\setfontdimen{9}{ascender} % ascender
+\setfontdimen{10}{acccapheight} % accented cap height
+\setfontdimen{11}{descender} % descender's depth
+\setfontdimen{12}{maxheight} % max height
+\setfontdimen{13}{maxdepth} % max depth
+\setfontdimen{14}{digitwidth} % digit width
+\setfontdimen{15}{verticalstem} % dominant width of verical stems
+\setfontdimen{16}{baselineskip} % baselineskip
+
+\endencoding
+
+\section{Changes}
+
+This file was created 2002/10/25.
+
+\end{document} \ No newline at end of file
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/8r.mtx b/fonts/utilities/fontinst/inputs/latinmtx/8r.mtx
new file mode 100644
index 0000000000..b15d84069f
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/8r.mtx
@@ -0,0 +1,234 @@
+% Copyright 1994, 1995, 1996 Constantin Kahn, Sebastian Rathz, and
+% Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rathz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Constantin Kahn and Sebastian Rathz and
+%%% Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.910",
+%%% date = "15 November 1999",
+%%% time = "21:54:57 CET",
+%%% filename = "8r.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "26393 234 602 7162",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the 8r metrics file, for use with the
+%%% fontinst utility. It is used to install raw
+%%% fonts using the 8r encoding.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+% List of changes now at end of file.
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/10/16]
+
+\title{The metric adjustments for ligful \texttt{8r}-encoded fonts}
+\author{Constantin Kahn\and Sebastian Rathz\and
+ Ulrik Vieth\and Lars Hellstr\"om}
+\date{15 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This file is just the part of \texttt{latin.mtx} that's needed for
+installing kern-and-ligful \texttt{8r} fonts.
+
+\showbranches
+
+\metrics
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Duplicating glyphs}
+
+This part has been commented out since as of v\,1.9 \textsf{fontinst}
+has no problem putting the same glyph in several slots (it used to
+cause some kerns and ligatures to be lost).
+\endcomment
+
+% Get a `space' into the `alternate-space' slot (nee `nbspace')
+%
+%\setglyph{alternate-space}
+% \glyph{space}{1000}
+%\endsetglyph
+
+
+% \setglyph{alternate-hyphen}
+% \glyph{hyphen}{1000}
+% \comment{Get a \texttt{hyphen} into the \texttt{alternate-hyphen}
+% slot (nee \texttt{softhyphen}).}
+% \endsetglyph
+
+% The LGC claims that `quoteleft' and `quoteright' appear twice,
+% which is not the case for 8r.enc, but does apply for texnansi.enc.
+% We prefer the ASCII position and mark the second one as unused.
+%
+%\setglyph{quoteleft-unused}
+% \glyph{quoteleft}{1000}
+%\endsetglyph
+%\setglyph{quoteright-unused}
+% \glyph{quoteright}{1000}
+%\endsetglyph
+
+
+\begincomment
+\section{Kerning}
+Kern accented characters the same way as their base characters.
+Characters are listed in the order in which they appear in
+\texttt{8r.enc}.
+\endcomment
+
+
+% 0-31, 128-159
+\setleftrightkerning{Lslash}{L}{1000}
+%\setleftrightkerning{lslash}{l}{1000}
+
+\setleftrightkerning{Zcaron}{Z}{1000}
+%\setleftrightkerning{zcaron}{z}{1000}
+
+\setleftrightkerning{Scaron}{S}{1000}
+%\setleftrightkerning{scaron}{s}{1000}
+
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+% 192-255
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+
+\setleftrightkerning{Igrave}{I}{1000}
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Udieresis}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+
+%\setleftrightkerning{agrave}{a}{1000}
+%\setleftrightkerning{aacute}{a}{1000}
+%\setleftrightkerning{acircumflex}{a}{1000}
+%\setleftrightkerning{atilde}{a}{1000}
+%\setleftrightkerning{adieresis}{a}{1000}
+%\setleftrightkerning{aring}{a}{1000}
+
+\setleftrightkerning{ccedilla}{c}{1000}
+
+%\setleftrightkerning{egrave}{e}{1000}
+%\setleftrightkerning{eacute}{e}{1000}
+%\setleftrightkerning{ecircumflex}{e}{1000}
+%\setleftrightkerning{edieresis}{e}{1000}
+
+%\setleftrightkerning{igrave}{i}{1000}
+%\setleftrightkerning{iacute}{i}{1000}
+%\setleftrightkerning{icircumflex}{i}{1000}
+%\setleftrightkerning{idieresis}{i}{1000}
+
+%\setleftrightkerning{ograve}{o}{1000}
+%\setleftrightkerning{oacute}{o}{1000}
+%\setleftrightkerning{ocircumflex}{o}{1000}
+%\setleftrightkerning{otilde}{o}{1000}
+%\setleftrightkerning{odieresis}{o}{1000}
+%\setleftrightkerning{oslash}{o}{1000}
+
+%\setleftrightkerning{ugrave}{u}{1000}
+%\setleftrightkerning{uacute}{u}{1000}
+%\setleftrightkerning{ucircumflex}{u}{1000}
+%\setleftrightkerning{udieresis}{u}{1000}
+
+%\setleftrightkerning{yacute}{y}{1000}
+%\setleftrightkerning{ydieresis}{y}{1000}
+
+\begincomment
+\section{Adjusting depth of accents}
+We copy the \verb|\zerodepth| stuff from \texttt{latin.mtx}:
+\endcomment
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \Fi
+}
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\endmetrics
+
+\section{Changes}
+
+This file used to contains more kerning commands for lower case glyphs
+than \texttt{latin.mtx} but these were commented out February 1997
+after representation on \TeX-fonts list by Thierry Bouche and others.
+\global\parindent=1em
+
+It also adds a default for the \texttt{alternate-hyphen} glyph.
+
+1997/02/03: An \verb|\ifisglyph| test was added to \verb|\zerodepth|.
+(SPQR)
+
+1998/06/11: \verb|\needsfontinstversion| was updated (to v\,1.800) and
+the definition of \verb|\setleftrightkerning| was removed (now defined
+in \texttt{fontinst.sty}). (UV)
+
+1999/10/25: A typo regarding \texttt{quoteright-unused} (in code
+commented out) was corrected. (UV\&LH)
+
+1999/10/29: \textsf{fontdoc} markup was added and the
+\verb|\needsfontinstversion| was increased to v\,1.900. (LH)
+
+1999/11/10: Code setting \texttt{alternate-hyphen} commented out,
+adjustments made for \verb|\showbranches|, and
+\verb|\needsfontinstversion| was increased to v\,1.909. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/8y.mtx b/fonts/utilities/fontinst/inputs/latinmtx/8y.mtx
new file mode 100644
index 0000000000..aca2ea3b9f
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/8y.mtx
@@ -0,0 +1,251 @@
+% Copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Ulrik Vieth and Lars Hellstr{\"o}m",
+%%% version = "1.910",
+%%% date = "15 November 1999",
+%%% time = "21:55:14 CET",
+%%% filename = "8y.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "",
+%%% checksum = "58019 251 594 7215",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the 8y metrics file, for use with the
+%%% fontinst utility. It is used to install raw
+%%% fonts using the 8y encoding.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+% List of changes now at end of file.
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The metric adjustments for ligful \texttt{8y}-encoded fonts}
+\author{Constantin Kahn\and
+ Sebastian Rathz\and
+ Ulrik Vieth\and
+ Lars Hellstr\"om}
+\date{15 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This file is just the part of \texttt{latin.mtx} that's needed for
+installing kern-and-ligful \texttt{8y} fonts.
+
+\metrics
+
+\needsfontinstversion{1.900}
+
+\begincomment
+\section{Duplicating glyphs}
+
+The code in this part has been commented out since glyph duplicates
+aren't needed anymore.
+\endcomment
+
+
+
+% \setglyph{alternate-space}
+% \glyph{space}{1000}
+% \comment{Get a \texttt{space} into the \texttt{alternate-space} slot
+% (nee \texttt{nbspace}).}
+% \endsetglyph
+
+
+% \setglyph{alternate-hyphen}
+% \glyph{hyphen}{1000}
+% \comment{Get a \texttt{hyphen} into the \texttt{alternate-hyphen} slot
+% (nee \texttt{softhyphen}).}
+% \endsetglyph
+
+
+% \setglyph{quoteleft-unused}
+% \glyph{quoteleft}{1000}
+% \comment{The LGC claims that \texttt{quoteleft} and \texttt{quoteright}
+% appear twice, which is not the case for \texttt{8r.enc}, but does
+% apply for \texttt{texnansi.enc}. We prefer the ASCII position and
+% mark the second one as unused.}
+% \endsetglyph
+% \setglyph{quoteright-unused}
+% \glyph{quoteright}{1000}
+% \comment{As for \texttt{quoteleft-unused}.}
+% \endsetglyph
+
+% \begincomment\medskip
+% Several special characters from \texttt{OT1} appear twice in
+% \texttt{texnansi.enc}, once in their \texttt{OT1} position (0--31) and
+% again in their Windows ANSI or Latin 1 position (128--255). We usually
+% prefer the second one.
+% \endcomment
+%
+% \setglyph{germandbls-OT1}
+% \glyph{germandbls}{1000}
+% \endsetglyph
+% \setglyph{ae-OT1}
+% \glyph{ae}{1000}
+% \endsetglyph
+% \setglyph{oe-OT1}
+% \glyph{oe}{1000}
+% \endsetglyph
+% \setglyph{oslash-OT1}
+% \glyph{oslash}{1000}
+% \endsetglyph
+% \setglyph{AE-OT1}
+% \glyph{AE}{1000}
+% \endsetglyph
+% \setglyph{OE-OT1}
+% \glyph{OE}{1000}
+% \endsetglyph
+% \setglyph{Oslash-OT1}
+% \glyph{Oslash}{1000}
+% \endsetglyph
+
+
+\begincomment
+\section{Kerning}
+Kern accented characters the same way as their base characters.
+Characters are listed in the order in which they appear in
+\texttt{8y.enc}.
+\endcomment
+
+% 128-159
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftrightkerning{Scaron}{S}{1000}
+\setleftrightkerning{Zcaron}{Z}{1000}
+
+%\setleftrightkerning{lslash}{l}{1000}
+%\setleftrightkerning{scaron}{s}{1000}
+%\setleftrightkerning{zcaron}{z}{1000}
+
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+% 192-255
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+
+\setleftrightkerning{Igrave}{I}{1000}
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Udieresis}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+
+%\setleftrightkerning{agrave}{a}{1000}
+%\setleftrightkerning{aacute}{a}{1000}
+%\setleftrightkerning{acircumflex}{a}{1000}
+%\setleftrightkerning{atilde}{a}{1000}
+%\setleftrightkerning{adieresis}{a}{1000}
+%\setleftrightkerning{aring}{a}{1000}
+
+\setleftrightkerning{ccedilla}{c}{1000}
+
+%\setleftrightkerning{egrave}{e}{1000}
+%\setleftrightkerning{eacute}{e}{1000}
+%\setleftrightkerning{ecircumflex}{e}{1000}
+%\setleftrightkerning{edieresis}{e}{1000}
+
+%\setleftrightkerning{igrave}{i}{1000}
+%\setleftrightkerning{iacute}{i}{1000}
+%\setleftrightkerning{icircumflex}{i}{1000}
+%\setleftrightkerning{idieresis}{i}{1000}
+
+%\setleftrightkerning{ograve}{o}{1000}
+%\setleftrightkerning{oacute}{o}{1000}
+%\setleftrightkerning{ocircumflex}{o}{1000}
+%\setleftrightkerning{otilde}{o}{1000}
+%\setleftrightkerning{odieresis}{o}{1000}
+%\setleftrightkerning{oslash}{o}{1000}
+
+%\setleftrightkerning{ugrave}{u}{1000}
+%\setleftrightkerning{uacute}{u}{1000}
+%\setleftrightkerning{ucircumflex}{u}{1000}
+%\setleftrightkerning{udieresis}{u}{1000}
+
+%\setleftrightkerning{yacute}{y}{1000}
+%\setleftrightkerning{ydieresis}{y}{1000}
+
+
+\begincomment
+\section{Adjusting depth of accents}
+We copy the \verb|\zerodepth| stuff from \texttt{latin.mtx}:
+\endcomment
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\endmetrics
+
+\section{Changes}
+
+See also the changes list for \texttt{8r.mtx}.
+
+1998/06/11: This file was created based on a copy of \texttt{8r.mtx}.
+The glyphs \texttt{alternate-space}, \texttt{quoteleft-unused}, and
+\texttt{quoteright-unused} were added. (UV)
+
+1999/10/25: A typo regarding \texttt{quoteright-unused} was corrected.
+(UV\&LH)
+
+1999/10/30: \textsf{fontdoc} markup was added and the
+\verb|\needsfontinstversion| was increased to v\,1.900. (LH)
+
+1999/11/13: Duplication of glyphs was commented out. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/latin.mtx b/fonts/utilities/fontinst/inputs/latinmtx/latin.mtx
new file mode 100644
index 0000000000..74692b4768
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/latin.mtx
@@ -0,0 +1,1791 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and Walter Schmidt",
+%%% version = "1.916",
+%%% date = "18 March 2003",
+%%% time = "23:59 MESZ",
+%%% filename = "latin.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It provides the defaults
+%%% used to install the Latin glyphs.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \textsf{fontinst} latin glyphs}
+\author{Alan Jeffrey\and Ulrik Vieth\and Walter Schmidt}
+\date{18 March 2003 \\
+Version 1.916}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \textsf{fontinst} package
+when generating Latin fonts. This file, \texttt{latin.mtx}, is intended
+for use with normal fonts or with faked small caps fonts generated by
+scaling and applying some letterspacing. A special version of this
+file, \texttt{latinsc.mtx}, also exists, which may be more suitable for
+use with real small caps glyphs.
+
+\metrics
+
+\needsfontinstversion{1.800}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% A top accent is set by placing the center of the accent at the given
+% position along the width of the letter, raised up by the difference
+% between the height of the letter and the xheight.
+
+\setcommand\topaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{#1}}{\int{xheight}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ {\scale{\sub{\height{#1}}{\int{xheight}}}{\int{italicslant}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A bottom accent is set by placing the center of the accent at the given
+% position along the width of the letter.
+
+\setcommand\botaccent#1#2#3{
+ \push
+ \movert{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A command to put an accent at the same height as the dot of the i. (WaS)
+
+\setcommand\itopaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{i}}{\height{#2}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ {\scale{\sub{\height{i}}{\height{#2}}}{\int{italicslant}}}} % <--- ???
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+}
+
+% A c&sc top accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\csctopaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \topaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% A c&sc bot accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\cscbotaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \botaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+\setint{xheight}{\height{x}}
+\setint{capheight}{\height{A}}
+\setint{ascender}{\height{d}}
+\setint{descender}{\depth{g}}
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+% Vertical symmetry axis. (WaS)
+\setint{vaxis}{\scale{\sub{\height{parenleft}}{\depth{parenleft}}}{500}}
+
+\ifisint{monowidth}\then
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}
+ {\div{\scale{\width{x}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+\else
+ \setint{capspacing}{50}
+ \setint{smallcapsextraspace}{0}
+\fi
+
+\ifisint{visiblespace}\then
+ \setint{boundarychar}{\int{visiblespace}}
+\fi
+
+
+\comment{\section{Kerning}}
+
+\setleftrightkerning{visiblespace}{space}{1000}
+
+\setleftkerning{hyphenchar}{hyphen}{1000}
+
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Abreve}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aogonek}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+
+\setleftrightkerning{Cacute}{C}{1000}
+\setleftrightkerning{Ccaron}{C}{1000}
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Dcaron}{D}{1000}
+
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecaron}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eogonek}{E}{1000}
+
+\setleftrightkerning{Gbreve}{G}{1000}
+
+\setleftkerning{IJ}{I}{1000}
+
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+\setleftrightkerning{Idotaccent}{I}{1000}
+\setleftrightkerning{Igrave}{I}{1000}
+
+\setrightkerning{IJ}{J}{1000}
+
+\setleftrightkerning{Lacute}{L}{1000}
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftkerning{Lcaron}{L}{1000}
+
+\setleftrightkerning{Nacute}{N}{1000}
+\setleftrightkerning{Ncaron}{N}{1000}
+\setleftrightkerning{Ntilde}{N}{1000}
+
+\setleftkerning{Ng}{N}{1000}
+\setrightkerning{Ng}{J}{1000}
+
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Ohungarumlaut}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+
+\setleftrightkerning{Rcaron}{R}{1000}
+\setleftrightkerning{Racute}{R}{1000}
+
+\setleftrightkerning{SS}{S}{1000}
+\setleftrightkerning{Sacute}{S}{1000}
+\setleftrightkerning{Scaron}{S}{1000}
+\setleftrightkerning{Scedilla}{S}{1000}
+
+\setleftrightkerning{Tcaron}{T}{1000}
+\setleftrightkerning{Tcedilla}{T}{1000}
+
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Udieresis}{U}{1000}
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uhungarumlaut}{U}{1000}
+\setleftrightkerning{Uring}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+\setleftrightkerning{Zacute}{Z}{1000}
+\setleftrightkerning{Zcaron}{Z}{1000}
+\setleftrightkerning{Zdotaccent}{Z}{1000}
+
+\setleftrightkerning{aogonek}{a}{1000}
+
+\setleftrightkerning{ccedilla}{c}{1000}
+
+\setleftrightkerning{eogonek}{e}{1000}
+
+\setleftkerning{ffi}{f}{1000}
+\setleftkerning{ffl}{f}{1000}
+\setleftrightkerning{ff}{f}{1000}
+\setleftkerning{fi}{f}{1000}
+\setleftkerning{fl}{f}{1000}
+
+\setleftkerning{ij}{i}{1000}
+
+\setrightkerning{fi}{i}{1000}
+\setrightkerning{ffi}{i}{1000}
+
+\setrightkerning{ij}{j}{1000}
+
+\setrightkerning{fl}{l}{1000}
+\setrightkerning{ffl}{l}{1000}
+
+\setleftkerning{ng}{n}{1000}
+\setrightkerning{ng}{j}{1000}
+
+\setleftkerning{oe}{o}{1000}
+\setrightkerning{oe}{e}{1000}
+\setleftrightkerning{oslash}{o}{1000}
+
+\setleftrightkerning{scedilla}{s}{1000}
+
+\setleftrightkerning{tcedilla}{t}{1000}
+
+
+\comment{\section{All-caps kerning}}
+
+\setleftrightkerning{dotlessI}{I}{1000}
+\setleftrightkerning{dotlessJ}{J}{1000}
+\setleftrightkerning{FFspaced}{F}{1000}
+\setleftkerning{FIspaced}{F}{1000}
+\setrightkerning{FIspaced}{I}{1000}
+\setleftkerning{FLspaced}{F}{1000}
+\setrightkerning{FLspaced}{L}{1000}
+\setleftkerning{FFIspaced}{F}{1000}
+\setrightkerning{FFIspaced}{I}{1000}
+\setleftkerning{FFLspaced}{F}{1000}
+\setrightkerning{FFLspaced}{L}{1000}
+\setleftrightkerning{Dbar}{Eth}{1000}
+\setleftkerning{IJspaced}{I}{1000}
+\setrightkerning{IJspaced}{J}{1000}
+\setleftrightkerning{SSspaced}{S}{1000}
+
+
+\comment{\section{Small caps kerning}}
+
+\setleftrightkerning{Asmall}{A}{\int{smallcapskerning}}
+\setleftrightkerning{Bsmall}{B}{\int{smallcapskerning}}
+\setleftrightkerning{Csmall}{C}{\int{smallcapskerning}}
+\setleftrightkerning{Dsmall}{D}{\int{smallcapskerning}}
+\setleftrightkerning{Esmall}{E}{\int{smallcapskerning}}
+\setleftrightkerning{Fsmall}{F}{\int{smallcapskerning}}
+\setleftrightkerning{Gsmall}{G}{\int{smallcapskerning}}
+\setleftrightkerning{Hsmall}{H}{\int{smallcapskerning}}
+\setleftrightkerning{Ismall}{I}{\int{smallcapskerning}}
+\setleftrightkerning{Jsmall}{J}{\int{smallcapskerning}}
+\setleftrightkerning{Ksmall}{K}{\int{smallcapskerning}}
+\setleftrightkerning{Lsmall}{L}{\int{smallcapskerning}}
+\setleftrightkerning{Msmall}{M}{\int{smallcapskerning}}
+\setleftrightkerning{Nsmall}{N}{\int{smallcapskerning}}
+\setleftrightkerning{Osmall}{O}{\int{smallcapskerning}}
+\setleftrightkerning{Psmall}{P}{\int{smallcapskerning}}
+\setleftrightkerning{Qsmall}{Q}{\int{smallcapskerning}}
+\setleftrightkerning{Rsmall}{R}{\int{smallcapskerning}}
+\setleftrightkerning{Ssmall}{S}{\int{smallcapskerning}}
+\setleftrightkerning{Tsmall}{T}{\int{smallcapskerning}}
+\setleftrightkerning{Usmall}{U}{\int{smallcapskerning}}
+\setleftrightkerning{Vsmall}{V}{\int{smallcapskerning}}
+\setleftrightkerning{Wsmall}{W}{\int{smallcapskerning}}
+\setleftrightkerning{Xsmall}{X}{\int{smallcapskerning}}
+\setleftrightkerning{Ysmall}{Y}{\int{smallcapskerning}}
+\setleftrightkerning{Zsmall}{Z}{\int{smallcapskerning}}
+\setleftrightkerning{Aacutesmall}{Aacute}{\int{smallcapskerning}}
+\setleftrightkerning{Abrevesmall}{Abreve}{\int{smallcapskerning}}
+\setleftrightkerning{Acircumflexsmall}{Acircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Adieresissmall}{Adieresis}{\int{smallcapskerning}}
+\setleftrightkerning{AEsmall}{AE}{\int{smallcapskerning}}
+\setleftrightkerning{Agravesmall}{Agrave}{\int{smallcapskerning}}
+\setleftrightkerning{Aogoneksmall}{Aogonek}{\int{smallcapskerning}}
+\setleftrightkerning{Aringsmall}{Aring}{\int{smallcapskerning}}
+\setleftrightkerning{Atildesmall}{Atilde}{\int{smallcapskerning}}
+\setleftrightkerning{Cacutesmall}{Cacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ccaronsmall}{Ccaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ccedillasmall}{Ccedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Dbarsmall}{Dbar}{\int{smallcapskerning}}
+\setleftrightkerning{Dcaronsmall}{Dcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Eacutesmall}{Eacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ecaronsmall}{Ecaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ecircumflexsmall}{Ecircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Edieresissmall}{Edieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Egravesmall}{Egrave}{\int{smallcapskerning}}
+\setleftrightkerning{Eogoneksmall}{Eogonek}{\int{smallcapskerning}}
+\setleftrightkerning{Ethsmall}{Eth}{\int{smallcapskerning}}
+\setleftrightkerning{Gbrevesmall}{Gbreve}{\int{smallcapskerning}}
+\setleftrightkerning{IJsmall}{IJ}{\int{smallcapskerning}}
+\setleftrightkerning{Iacutesmall}{Iacute}{\int{smallcapskerning}}
+\setleftrightkerning{Icircumflexsmall}{Icircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Idieresissmall}{Idieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Idotaccentsmall}{Idotaccent}{\int{smallcapskerning}}
+\setleftrightkerning{Igravesmall}{Igrave}{\int{smallcapskerning}}
+\setleftrightkerning{Lacutesmall}{Lacute}{\int{smallcapskerning}}
+\setleftrightkerning{Lcaronsmall}{Lcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Lslashsmall}{Lslash}{\int{smallcapskerning}}
+\setleftrightkerning{Nacutesmall}{Nacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ncaronsmall}{Ncaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ngsmall}{Ng}{\int{smallcapskerning}}
+\setleftrightkerning{Ntildesmall}{Ntilde}{\int{smallcapskerning}}
+\setleftrightkerning{Oacutesmall}{Oacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ocircumflexsmall}{Ocircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Odieresissmall}{Odieresis}{\int{smallcapskerning}}
+\setleftrightkerning{OEsmall}{OE}{\int{smallcapskerning}}
+\setleftrightkerning{Ogravesmall}{Ograve}{\int{smallcapskerning}}
+\setleftrightkerning{Ohungarumlautsmall}{Ohungarumlaut}{\int{smallcapskerning}}
+\setleftrightkerning{Oslashsmall}{Oslash}{\int{smallcapskerning}}
+\setleftrightkerning{Otildesmall}{Otilde}{\int{smallcapskerning}}
+\setleftrightkerning{Racutesmall}{Racute}{\int{smallcapskerning}}
+\setleftrightkerning{Rcaronsmall}{Rcaron}{\int{smallcapskerning}}
+\setleftrightkerning{SSsmall}{SS}{\int{smallcapskerning}}
+\setleftrightkerning{Sacutesmall}{Sacute}{\int{smallcapskerning}}
+\setleftrightkerning{Scaronsmall}{Scaron}{\int{smallcapskerning}}
+\setleftrightkerning{Scedillasmall}{Scedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Tcaronsmall}{Tcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Tcedillasmall}{Tcedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Thornsmall}{Thorn}{\int{smallcapskerning}}
+\setleftrightkerning{Uacutesmall}{Uacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ucircumflexsmall}{Ucircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Udieresissmall}{Udieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Ugravesmall}{Ugrave}{\int{smallcapskerning}}
+\setleftrightkerning{Uhungarumlautsmall}{Uhungarumlaut}{\int{smallcapskerning}}
+\setleftrightkerning{Uringsmall}{Uring}{\int{smallcapskerning}}
+\setleftrightkerning{Yacutesmall}{Yacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ydieresissmall}{Ydieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Zacutesmall}{Zacute}{\int{smallcapskerning}}
+\setleftrightkerning{Zcaronsmall}{Zcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Zdotaccentsmall}{Zdotaccent}{\int{smallcapskerning}}
+\setleftrightkerning{dotlessIsmall}{Ismall}{1000}
+\setleftrightkerning{dotlessJsmall}{Jsmall}{1000}
+
+
+\comment{\section{Unfakable glyphs}}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Upsilon}
+\unfakable{Upsilon1}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+
+\unfakable{grave}
+\unfakable{acute}
+\unfakable{circumflex}
+\unfakable{tilde}
+\unfakable{dieresis}
+\unfakable{hungarumlaut}
+\unfakable{ring}
+\unfakable{caron}
+\unfakable{breve}
+\unfakable{macron}
+\unfakable{dotaccent}
+\unfakable{cedilla}
+\unfakable{ogonek}
+\unfakable{guilsinglleft}
+\unfakable{guilsinglright}
+\unfakable{quotedblleft}
+\unfakable{quotedblright}
+\unfakable{quotedblbase}
+\unfakable{guillemotleft}
+\unfakable{guillemotright}
+\unfakable{endash}
+\unfakable{emdash}
+\unfakable{dotlessi}
+\unfakable{perthousandzero}
+\unfakable{exclam}
+\unfakable{quotedbl}
+\unfakable{numbersign}
+\unfakable{dollar}
+\unfakable{percent}
+\unfakable{ampersand}
+\unfakable{quoteright}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{asterisk}
+\unfakable{plus}
+\unfakable{comma}
+\unfakable{hyphen}
+\unfakable{period}
+\unfakable{slash}
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+\unfakable{zerooldstyle}
+\unfakable{oneoldstyle}
+\unfakable{twooldstyle}
+\unfakable{threeoldstyle}
+\unfakable{fouroldstyle}
+\unfakable{fiveoldstyle}
+\unfakable{sixoldstyle}
+\unfakable{sevenoldstyle}
+\unfakable{eightoldstyle}
+\unfakable{nineoldstyle}
+\unfakable{colon}
+\unfakable{semicolon}
+\unfakable{less}
+\unfakable{equal}
+\unfakable{greater}
+\unfakable{question}
+\unfakable{at}
+\unfakable{A}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+\unfakable{bracketleft}
+\unfakable{backslash}
+\unfakable{bracketright}
+\unfakable{asciicircum}
+\unfakable{underscore}
+\unfakable{quoteleft}
+\unfakable{a}
+\unfakable{b}
+\unfakable{c}
+\unfakable{d}
+\unfakable{e}
+\unfakable{f}
+\unfakable{g}
+\unfakable{h}
+\unfakable{i}
+\unfakable{j}
+\unfakable{k}
+\unfakable{l}
+\unfakable{m}
+\unfakable{n}
+\unfakable{o}
+\unfakable{p}
+\unfakable{q}
+\unfakable{r}
+\unfakable{s}
+\unfakable{t}
+\unfakable{u}
+\unfakable{v}
+\unfakable{w}
+\unfakable{x}
+\unfakable{y}
+\unfakable{z}
+\unfakable{braceleft}
+\unfakable{bar}
+\unfakable{braceright}
+\unfakable{asciitilde}
+\unfakable{Eng}
+\unfakable{section}
+\unfakable{eng}
+\unfakable{exclamdown}
+\unfakable{questiondown}
+\unfakable{sterling}
+\unfakable{AE}
+\unfakable{Eth}
+\unfakable{OE}
+\unfakable{Oslash}
+\unfakable{Thorn}
+\unfakable{ae}
+\unfakable{eth}
+\unfakable{oe}
+\unfakable{oslash}
+\unfakable{thorn}
+\unfakable{germandbls}
+\unfakable{lslashslash}
+
+\setglyph{dotlessj}
+ \moveup{\neg{\depth{j}}}
+ \glyphrule{\width{j}}{\add{\depth{j}}{\height{dotlessi}}}
+ \resetitalic{\italic{dotlessi}}
+ \moveup{\depth{j}}
+ \glyphwarning{missing glyph `dotlessj'}
+\endsetglyph
+
+
+\comment{\section{Glyphs}}
+
+% only with monospaced fonts. (WaS)
+\ifisint{monowidth}\then
+\resetglyph{asterisk}
+ \moveup{\neg{\sub{\scale{\sub{\height{asterisk}}{\depth{asterisk}}}{500}}{\int{vaxis}}}}
+ \glyph{asterisk}{1000}
+ \resetdepth{0}
+\endresetglyph
+\fi
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \else
+ \movert{\width{i}}
+ \fi
+\endsetglyph
+
+\setglyph{compwordmark}
+ \glyphrule{0}{\int{xheight}}
+\endsetglyph
+\setint{compwordmark-spacing}{0}
+
+\setglyph{quotesinglbase}
+ \glyph{comma}{1000}
+\endsetglyph
+
+\setglyph{fi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{i}}
+ \glyph{i}{1000}
+\endsetglyph
+
+\setglyph{ff}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{f}{1000}
+\endsetglyph
+
+\setglyph{fl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+
+\setglyph{ffi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fi}{1000}
+\endsetglyph
+
+\setglyph{ffl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fl}{1000}
+\endsetglyph
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+
+\setglyph{rangedash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{endash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{punctdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{emdash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+\endsetglyph
+
+\setglyph{ringfitted}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+ \glyph{ring}{1000}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+\endsetglyph
+
+\setglyph{lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+
+\setglyph{Lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{L}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Ng}
+ \glyph{Eng}{1000}
+\endsetglyph
+
+\setglyph{ng}
+ \glyph{eng}{1000}
+\endsetglyph
+
+\setglyph{Abreve}
+ \topaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogonek}
+ \botaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacute}
+ \topaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaron}
+ \topaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaron}
+ \topaccent{D}{caron}{450}
+\endsetglyph
+
+\setglyph{Ecaron}
+ \topaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogonek}
+ \botaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbreve}
+ \topaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacute}
+ \topaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Lcaron}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{Nacute}
+ \topaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaron}
+ \topaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ohungarumlaut}
+ \topaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racute}
+ \topaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaron}
+ \topaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacute}
+ \topaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaron}
+ \topaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedilla}
+ \botaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaron}
+ \topaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedilla}
+ \botaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlaut}
+ \topaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uring}
+ \topaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresis}
+ \topaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacute}
+ \topaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaron}
+ \topaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccent}
+ \topaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{IJ}
+ \glyph{I}{1000}
+ \movert{\kerning{I}{J}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{Idotaccent}
+ \topaccent{I}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{dbar}
+ \push
+ \movert{\sub{\width{d}}{\width{macron}}}
+ \moveup{
+ \sub{\scale{\add{\height{d}}{\int{xheight}}}{500}}
+ {\height{macron}}}
+ \glyph{macron}{1000}
+ \pop
+ \glyph{d}{1000}
+\endsetglyph
+
+\setglyph{abreve}
+ \topaccent{a}{breve}{500}
+\endsetglyph
+
+\setglyph{aogonek}
+ \botaccent{a}{ogonek}{850}
+\endsetglyph
+
+\setglyph{cacute}
+ \topaccent{c}{acute}{500}
+\endsetglyph
+
+\setglyph{ccaron}
+ \topaccent{c}{caron}{500}
+\endsetglyph
+
+\setglyph{dcaron}
+ \glyph{d}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{ecaron}
+ \topaccent{e}{caron}{500}
+\endsetglyph
+
+\setglyph{eogonek}
+ \botaccent{e}{ogonek}{500}
+\endsetglyph
+
+\setglyph{gbreve}
+ \topaccent{g}{breve}{500}
+\endsetglyph
+
+\setglyph{lacute}
+ \topaccent{l}{acute}{500}
+\endsetglyph
+
+\setglyph{lcaron}
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{nacute}
+ \topaccent{n}{acute}{500}
+\endsetglyph
+
+\setglyph{ncaron}
+ \topaccent{n}{caron}{500}
+\endsetglyph
+
+\setglyph{ohungarumlaut}
+ \topaccent{o}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{racute}
+ \topaccent{r}{acute}{500}
+\endsetglyph
+
+\setglyph{rcaron}
+ \topaccent{r}{caron}{500}
+\endsetglyph
+
+\setglyph{sacute}
+ \topaccent{s}{acute}{500}
+\endsetglyph
+
+\setglyph{scaron}
+ \topaccent{s}{caron}{500}
+\endsetglyph
+
+\setglyph{scedilla}
+ \botaccent{s}{cedilla}{500}
+\endsetglyph
+
+\setglyph{tcaron}
+ \glyph{t}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{tcedilla}
+ \botaccent{t}{cedilla}{500}
+\endsetglyph
+
+\setglyph{uhungarumlaut}
+ \topaccent{u}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{uring}
+ \topaccent{u}{ring}{500}
+\endsetglyph
+
+\setglyph{ydieresis}
+ \topaccent{y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{zacute}
+ \topaccent{z}{acute}{500}
+\endsetglyph
+
+\setglyph{zcaron}
+ \topaccent{z}{caron}{500}
+\endsetglyph
+
+% make this glyph match the letter i. (WaS)
+\setglyph{zdotaccent}
+ \itopaccent{z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{ij}
+ \glyph{i}{1000}
+ \movert{\kerning{i}{j}}
+ \glyph{j}{1000}
+\endsetglyph
+
+\setglyph{Agrave}
+ \topaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacute}
+ \topaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflex}
+ \topaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atilde}
+ \topaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresis}
+ \topaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aring}
+ \topaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedilla}
+ \botaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egrave}
+ \topaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacute}
+ \topaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflex}
+ \topaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresis}
+ \topaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Iacute}
+ \topaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Igrave}
+ \topaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Icircumflex}
+ \topaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresis}
+ \topaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ntilde}
+ \topaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ograve}
+ \topaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacute}
+ \topaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflex}
+ \topaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otilde}
+ \topaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresis}
+ \topaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugrave}
+ \topaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacute}
+ \topaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflex}
+ \topaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresis}
+ \topaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacute}
+ \topaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{SS}
+ \glyph{S}{1000}
+ \movert{\kerning{S}{S}}
+ \glyph{S}{1000}
+\endsetglyph
+
+\setglyph{agrave}
+ \topaccent{a}{grave}{500}
+\endsetglyph
+
+\setglyph{aacute}
+ \topaccent{a}{acute}{500}
+\endsetglyph
+
+\setglyph{acircumflex}
+ \topaccent{a}{circumflex}{500}
+\endsetglyph
+
+\setglyph{atilde}
+ \topaccent{a}{tilde}{500}
+\endsetglyph
+
+\setglyph{adieresis}
+ \topaccent{a}{dieresis}{500}
+\endsetglyph
+
+\setglyph{aring}
+ \topaccent{a}{ring}{500}
+\endsetglyph
+
+\setglyph{ccedilla}
+ \botaccent{c}{cedilla}{500}
+\endsetglyph
+
+\setglyph{egrave}
+ \topaccent{e}{grave}{500}
+\endsetglyph
+
+\setglyph{eacute}
+ \topaccent{e}{acute}{500}
+\endsetglyph
+
+\setglyph{ecircumflex}
+ \topaccent{e}{circumflex}{500}
+\endsetglyph
+
+\setglyph{edieresis}
+ \topaccent{e}{dieresis}{500}
+\endsetglyph
+
+\setglyph{igrave}
+ \topaccent{dotlessi}{grave}{500}
+\endsetglyph
+
+\setglyph{iacute}
+ \topaccent{dotlessi}{acute}{500}
+\endsetglyph
+
+\setglyph{icircumflex}
+ \topaccent{dotlessi}{circumflex}{500}
+\endsetglyph
+
+\setglyph{idieresis}
+ \topaccent{dotlessi}{dieresis}{500}
+\endsetglyph
+
+\setglyph{ntilde}
+ \topaccent{n}{tilde}{500}
+\endsetglyph
+
+\setglyph{ograve}
+ \topaccent{o}{grave}{500}
+\endsetglyph
+
+\setglyph{oacute}
+ \topaccent{o}{acute}{500}
+\endsetglyph
+
+\setglyph{ocircumflex}
+ \topaccent{o}{circumflex}{500}
+\endsetglyph
+
+\setglyph{otilde}
+ \topaccent{o}{tilde}{500}
+\endsetglyph
+
+\setglyph{odieresis}
+ \topaccent{o}{dieresis}{500}
+\endsetglyph
+
+\setglyph{ugrave}
+ \topaccent{u}{grave}{500}
+\endsetglyph
+
+\setglyph{uacute}
+ \topaccent{u}{acute}{500}
+\endsetglyph
+
+\setglyph{ucircumflex}
+ \topaccent{u}{circumflex}{500}
+\endsetglyph
+
+\setglyph{udieresis}
+ \topaccent{u}{dieresis}{500}
+\endsetglyph
+
+\setglyph{yacute}
+ \topaccent{y}{acute}{500}
+\endsetglyph
+
+
+\comment{\section{All-caps glyphs}}
+
+\setglyph{dotlessI}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{dotlessJ}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{FFspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{F}}
+ {\int{capspacing}}}
+ \glyph{F}{1000}
+\endsetglyph
+
+\setglyph{FIspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FLspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{FFIspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FFLspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Dbar}
+ \glyph{Eth}{1000}
+\endsetglyph
+
+\setglyph{IJspaced}
+ \glyph{I}{1000}
+ \movert{\add{\kerning{I}{J}}{\int{capspacing}}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{SSspaced}
+ \glyph{S}{1000}
+ \movert{\add{\kerning{S}{S}}{\int{capspacing}}}
+ \glyph{S}{1000}
+\endsetglyph
+
+
+\comment{\section{Small caps glyphs}}
+
+\setglyph{Acutesmall}
+ \cscaccent{acute}
+\endsetglyph
+
+\setglyph{acutesmall}
+ \glyph{Acutesmall}{1000}
+\endsetglyph
+
+\setglyph{Gravesmall}
+ \cscaccent{grave}
+\endsetglyph
+
+\setglyph{gravesmall}
+ \glyph{Gravesmall}{1000}
+\endsetglyph
+
+\setglyph{Circumflexsmall}
+ \cscaccent{circumflex}
+\endsetglyph
+
+\setglyph{circumflexsmall}
+ \glyph{Circumflexsmall}{1000}
+\endsetglyph
+
+\setglyph{Tildesmall}
+ \cscaccent{tilde}
+\endsetglyph
+
+\setglyph{tildesmall}
+ \glyph{Tildesmall}{1000}
+\endsetglyph
+
+\setglyph{Dieresissmall}
+ \cscaccent{dieresis}
+\endsetglyph
+
+\setglyph{dieresissmall}
+ \glyph{Dieresissmall}{1000}
+\endsetglyph
+
+\setglyph{Brevesmall}
+ \cscaccent{breve}
+\endsetglyph
+
+\setglyph{brevesmall}
+ \glyph{Brevesmall}{1000}
+\endsetglyph
+
+\setglyph{Dotaccentsmall}
+ \cscaccent{dotaccent}
+\endsetglyph
+
+\setglyph{dotaccentsmall}
+ \glyph{Dotaccentsmall}{1000}
+\endsetglyph
+
+\setglyph{Caronsmall}
+ \cscaccent{caron}
+\endsetglyph
+
+\setglyph{caronsmall}
+ \glyph{Caronsmall}{1000}
+\endsetglyph
+
+\setglyph{Hungarumlautsmall}
+ \cscaccent{hungarumlaut}
+\endsetglyph
+
+\setglyph{hungarumlautsmall}
+ \glyph{Hungarumlautsmall}{1000}
+\endsetglyph
+
+\setglyph{Ringsmall}
+ \cscaccent{ring}
+\endsetglyph
+
+\setglyph{ringsmall}
+ \glyph{Ringsmall}{1000}
+\endsetglyph
+
+\setglyph{Macronsmall}
+ \cscaccent{macron}
+\endsetglyph
+
+\setglyph{macronsmall}
+ \glyph{Macronsmall}{1000}
+ \comment{It might be unnecessary to set this glyph. This should be
+ checked sometime. /LH}
+\endsetglyph
+
+\setglyph{Cedillasmall}
+ \cscglyph{cedilla}
+\endsetglyph
+
+\setglyph{cedillasmall}
+ \glyph{Cedillasmall}{1000}
+\endsetglyph
+
+\setglyph{Ogoneksmall}
+ \cscglyph{ogonek}
+\endsetglyph
+
+\setglyph{ogoneksmall}
+ \glyph{Ogoneksmall}{1000}
+\endsetglyph
+
+\setglyph{Idotaccentsmall}
+ \csctopaccent{I}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Abrevesmall}
+ \csctopaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogoneksmall}
+ \cscbotaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacutesmall}
+ \csctopaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaronsmall}
+ \csctopaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaronsmall}
+ \csctopaccent{D}{caron}{500}
+\endsetglyph
+
+\setglyph{Ecaronsmall}
+ \csctopaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogoneksmall}
+ \cscbotaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbrevesmall}
+ \csctopaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacutesmall}
+ \csctopaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Nacutesmall}
+ \csctopaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaronsmall}
+ \csctopaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ngsmall}
+ \cscglyph{Ng}
+\endsetglyph
+
+\setglyph{Ohungarumlautsmall}
+ \csctopaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racutesmall}
+ \csctopaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaronsmall}
+ \csctopaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacutesmall}
+ \csctopaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaronsmall}
+ \csctopaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedillasmall}
+ \cscbotaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaronsmall}
+ \csctopaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedillasmall}
+ \cscbotaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlautsmall}
+ \csctopaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uringsmall}
+ \csctopaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresissmall}
+ \csctopaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacutesmall}
+ \csctopaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaronsmall}
+ \csctopaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccentsmall}
+ \csctopaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Agravesmall}
+ \csctopaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacutesmall}
+ \csctopaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflexsmall}
+ \csctopaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atildesmall}
+ \csctopaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresissmall}
+ \csctopaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aringsmall}
+ \csctopaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedillasmall}
+ \csctopaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egravesmall}
+ \csctopaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacutesmall}
+ \csctopaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflexsmall}
+ \csctopaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresissmall}
+ \csctopaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Igravesmall}
+ \csctopaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Iacutesmall}
+ \csctopaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Icircumflexsmall}
+ \csctopaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresissmall}
+ \csctopaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ethsmall}
+ \cscglyph{Eth}
+\endsetglyph
+
+\setglyph{Dbarsmall}
+ \glyph{Ethsmall}{1000}
+\endsetglyph
+
+\setglyph{Ntildesmall}
+ \csctopaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ogravesmall}
+ \csctopaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacutesmall}
+ \csctopaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflexsmall}
+ \csctopaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otildesmall}
+ \csctopaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresissmall}
+ \csctopaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugravesmall}
+ \csctopaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacutesmall}
+ \csctopaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflexsmall}
+ \csctopaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresissmall}
+ \csctopaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacutesmall}
+ \csctopaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{Thornsmall}
+ \cscglyph{Thorn}
+\endsetglyph
+
+\setglyph{Asmall}
+ \cscglyph{A}
+\endsetglyph
+
+\setglyph{Bsmall}
+ \cscglyph{B}
+\endsetglyph
+
+\setglyph{Csmall}
+ \cscglyph{C}
+\endsetglyph
+
+\setglyph{Dsmall}
+ \cscglyph{D}
+\endsetglyph
+
+\setglyph{Esmall}
+ \cscglyph{E}
+\endsetglyph
+
+\setglyph{Fsmall}
+ \cscglyph{F}
+\endsetglyph
+
+\setglyph{Gsmall}
+ \cscglyph{G}
+\endsetglyph
+
+\setglyph{Hsmall}
+ \cscglyph{H}
+\endsetglyph
+
+\setglyph{Ismall}
+ \cscglyph{I}
+\endsetglyph
+
+\setglyph{Jsmall}
+ \cscglyph{J}
+\endsetglyph
+
+\setglyph{Ksmall}
+ \cscglyph{K}
+\endsetglyph
+
+\setglyph{Lsmall}
+ \cscglyph{L}
+\endsetglyph
+
+\setglyph{Msmall}
+ \cscglyph{M}
+\endsetglyph
+
+\setglyph{Nsmall}
+ \cscglyph{N}
+\endsetglyph
+
+\setglyph{Osmall}
+ \cscglyph{O}
+\endsetglyph
+
+\setglyph{Psmall}
+ \cscglyph{P}
+\endsetglyph
+
+\setglyph{Qsmall}
+ \cscglyph{Q}
+\endsetglyph
+
+\setglyph{Rsmall}
+ \cscglyph{R}
+\endsetglyph
+
+\setglyph{Ssmall}
+ \cscglyph{S}
+\endsetglyph
+
+\setglyph{Tsmall}
+ \cscglyph{T}
+\endsetglyph
+
+\setglyph{Usmall}
+ \cscglyph{U}
+\endsetglyph
+
+\setglyph{Vsmall}
+ \cscglyph{V}
+\endsetglyph
+
+\setglyph{Wsmall}
+ \cscglyph{W}
+\endsetglyph
+
+\setglyph{Xsmall}
+ \cscglyph{X}
+\endsetglyph
+
+\setglyph{Ysmall}
+ \cscglyph{Y}
+\endsetglyph
+
+\setglyph{Zsmall}
+ \cscglyph{Z}
+\endsetglyph
+
+\setglyph{Lslashsmall}
+ \cscglyph{Lslash}
+\endsetglyph
+
+\setglyph{AEsmall}
+ \cscglyph{AE}
+\endsetglyph
+
+\setglyph{OEsmall}
+ \cscglyph{OE}
+\endsetglyph
+
+\setglyph{Oslashsmall}
+ \cscglyph{Oslash}
+\endsetglyph
+
+\setglyph{dotlessIsmall}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{dotlessJsmall}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{FFsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Fsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Fsmall}{1000}
+\endsetglyph
+
+\setglyph{FIsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FLsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{FFIsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FFLsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{IJsmall}
+ \glyph{Ismall}{1000}
+ \movert{\add{\kerning{Ismall}{Jsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{Lcaronsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{\int{smallcapsscale}}
+\endsetglyph
+
+\setglyph{SSsmall}
+ \glyph{Ssmall}{1000}
+ \movert{\add{\kerning{Ssmall}{Ssmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ssmall}{1000}
+\endsetglyph
+
+
+\comment{\section{Accents}
+ \TeX's math accent-positioning requires accents to have zero depth.}
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+\zerodepth{grave}
+\zerodepth{acute}
+\zerodepth{circumflex}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+\zerodepth{hungarumlaut}
+\zerodepth{ring}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{dotaccent}
+
+\endmetrics
+
+\section{Changes}
+
+2003/03/18: Added \texttt{vaxis} for the vertical symmetry axis
+Changed `\texttt{asterisk}', which is now vertically centered
+in monospaced fonts.
+New code to create `\texttt{zdotaccent}', making sure that the
+height of the dot matches the letter `\texttt{i}'. This requires
+a new macro \verb|\itopaccent|. (WaS)
+
+1999/10/25: Added \verb|\setglyphs| for \texttt{Macronsmall} and
+\texttt{macronsmall}. (LH)
+
+1999/10/25: Simplified definition of \verb|\unfakable|. (UV\&LH)
+Rationale: It is thoroughly confusing if the size of the black box
+created by \verb|\unfakable| depends on the metrics of an unencoded
+glyph that isn't accessible and therefore unavailable for all pratical
+purposes.
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/latinsc.mtx b/fonts/utilities/fontinst/inputs/latinmtx/latinsc.mtx
new file mode 100644
index 0000000000..272c4df97e
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/latinsc.mtx
@@ -0,0 +1,1324 @@
+% Copyright 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Sebastian Rahtz and Ulrik Vieth and Walter Schmidt",
+%%% version = "1.916",
+%%% date = "12 March 2003",
+%%% time = "23:59 MESZ",
+%%% filename = "latinsc.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It provides the defaults
+%%% used to install the Latin small caps glyphs.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \textsf{fontinst} latin small caps glyphs}
+\author{Sebastian Rahtz, Ulrik Vieth, Walter Schmidt}
+\date{12 March 2003 \\
+Version 1.916}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \textsf{fontinst} package
+when generating Latin fonts. This file, \texttt{latinsc.mtx}, is a
+special version of \texttt{latin.mtx}, intended for use with real small
+caps glyphs from expert fonts using `oldstyle' or `small' glyph names.
+
+\metrics
+
+\needsfontinstversion{1.800}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% A top accent is set by placing the center of the accent at the given
+% position along the width of the letter, raised up by the difference
+% between the height of the letter and the xheight.
+
+\setcommand\topaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{#1}}{\int{xheight}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ {\scale{\sub{\height{#1}}{\int{xheight}}}{\int{italicslant}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A bottom accent is set by placing the center of the accent at the given
+% position along the width of the letter.
+
+\setcommand\botaccent#1#2#3{
+ \push
+ \movert{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \ifisglyph{#1small}\then
+ \glyph{#1small}{1000}
+ \else
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+ \fi
+}
+
+% A c&sc top accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\csctopaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \topaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% A c&sc bot accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\cscbotaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \botaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+\setint{xheight}{\height{x}}
+\setint{capheight}{\height{A}}
+\setint{ascender}{\height{d}}
+\setint{descender}{\depth{g}}
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+% Vertical symmetry axis. (WaS)
+\setint{vaxis}{\scale{\sub{\height{parenleft}}{\depth{parenleft}}}{500}}
+
+\ifisint{monowidth}\then
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}{0}
+\else
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}{0}
+\fi
+
+\ifisint{visiblespace}\then
+ \setint{boundarychar}{\int{visiblespace}}
+\fi
+
+
+\comment{\section{Kerning}}
+
+\setleftrightkerning{visiblespace}{space}{1000}
+
+\setleftkerning{hyphenchar}{hyphen}{1000}
+
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Abreve}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aogonek}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+
+\setleftrightkerning{Cacute}{C}{1000}
+\setleftrightkerning{Ccaron}{C}{1000}
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Dcaron}{D}{1000}
+
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecaron}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eogonek}{E}{1000}
+
+\setleftrightkerning{Gbreve}{G}{1000}
+
+\setleftkerning{IJ}{I}{1000}
+
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+\setleftrightkerning{Idotaccent}{I}{1000}
+\setleftrightkerning{Igrave}{I}{1000}
+
+\setrightkerning{IJ}{J}{1000}
+
+\setleftrightkerning{Lacute}{L}{1000}
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftkerning{Lcaron}{L}{1000}
+
+\setleftrightkerning{Nacute}{N}{1000}
+\setleftrightkerning{Ncaron}{N}{1000}
+\setleftrightkerning{Ntilde}{N}{1000}
+
+%\setleftkerning{Ng}{N}{1000}
+%\setrightkerning{Ng}{J}{1000}
+
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Ohungarumlaut}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+
+\setleftrightkerning{Rcaron}{R}{1000}
+\setleftrightkerning{Racute}{R}{1000}
+
+\setleftrightkerning{SS}{S}{1000}
+\setleftrightkerning{Sacute}{S}{1000}
+\setleftrightkerning{Scaron}{S}{1000}
+\setleftrightkerning{Scedilla}{S}{1000}
+
+\setleftrightkerning{Tcaron}{T}{1000}
+\setleftrightkerning{Tcedilla}{T}{1000}
+
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Udieresis}{U}{1000}
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uhungarumlaut}{U}{1000}
+\setleftrightkerning{Uring}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+\setleftrightkerning{Zacute}{Z}{1000}
+\setleftrightkerning{Zcaron}{Z}{1000}
+\setleftrightkerning{Zdotaccent}{Z}{1000}
+
+
+\setleftrightkerning{Aacutesmall}{Asmall}{1000}
+\setleftrightkerning{Abrevesmall}{Asmall}{1000}
+\setleftrightkerning{Acircumflexsmall}{Asmall}{1000}
+\setleftrightkerning{Adieresissmall}{Asmall}{1000}
+\setleftrightkerning{Agravesmall}{Asmall}{1000}
+\setleftrightkerning{Aogoneksmall}{Asmall}{1000}
+\setleftrightkerning{Aringsmall}{Asmall}{1000}
+\setleftrightkerning{Atildesmall}{Asmall}{1000}
+
+\setleftrightkerning{Cacutesmall}{Csmall}{1000}
+\setleftrightkerning{Ccaronsmall}{Csmall}{1000}
+\setleftrightkerning{Ccedillasmall}{Csmall}{1000}
+
+\setleftrightkerning{Dcaronsmall}{Dsmall}{1000}
+
+\setleftrightkerning{Eacutesmall}{Esmall}{1000}
+\setleftrightkerning{Ecaronsmall}{Esmall}{1000}
+\setleftrightkerning{Ecircumflexsmall}{Esmall}{1000}
+\setleftrightkerning{Edieresissmall}{Esmall}{1000}
+\setleftrightkerning{Egravesmall}{Esmall}{1000}
+\setleftrightkerning{Eogoneksmall}{Esmall}{1000}
+
+\setleftrightkerning{Gbrevesmall}{Gsmall}{1000}
+
+\setleftrightkerning{Iacutesmall}{Ismall}{1000}
+\setleftrightkerning{Icircumflexsmall}{Ismall}{1000}
+\setleftrightkerning{Idieresissmall}{Ismall}{1000}
+\setleftrightkerning{Idotaccentsmall}{Ismall}{1000}
+\setleftrightkerning{Igravesmall}{Ismall}{1000}
+
+\setleftrightkerning{Lacutesmall}{Lsmall}{1000}
+\setleftrightkerning{Lslashsmall}{Lsmall}{1000}
+\setleftkerning{Lcaronsmall}{Lsmall}{1000}
+
+\setleftrightkerning{Nacutesmall}{Nsmall}{1000}
+\setleftrightkerning{Ncaronsmall}{Nsmall}{1000}
+\setleftrightkerning{Ntildesmall}{Nsmall}{1000}
+
+%\setleftkerning{Ngsmall}{Nsmall}{1000}
+%\setrightkerning{Ngsmall}{Jsmall}{1000}
+
+\setleftrightkerning{Oacutesmall}{Osmall}{1000}
+\setleftrightkerning{Ocircumflexsmall}{Osmall}{1000}
+\setleftrightkerning{Odieresissmall}{Osmall}{1000}
+\setleftrightkerning{Ogravesmall}{Osmall}{1000}
+\setleftrightkerning{Ohungarumlautsmall}{Osmall}{1000}
+\setleftrightkerning{Oslashsmall}{Osmall}{1000}
+\setleftrightkerning{Otildesmall}{Osmall}{1000}
+
+\setleftrightkerning{Rcaronsmall}{Rsmall}{1000}
+\setleftrightkerning{Racutesmall}{Rsmall}{1000}
+
+\setleftrightkerning{SSsmall}{Ssmall}{1000}
+\setleftrightkerning{Sacutesmall}{Ssmall}{1000}
+\setleftrightkerning{Scaronsmall}{Ssmall}{1000}
+\setleftrightkerning{Scedillasmall}{Ssmall}{1000}
+
+\setleftrightkerning{Tcaronsmall}{Tsmall}{1000}
+\setleftrightkerning{Tcedillasmall}{Tsmall}{1000}
+
+\setleftrightkerning{Uacutesmall}{Usmall}{1000}
+\setleftrightkerning{Ucircumflexsmall}{Usmall}{1000}
+\setleftrightkerning{Udieresissmall}{Usmall}{1000}
+\setleftrightkerning{Ugravesmall}{Usmall}{1000}
+\setleftrightkerning{Uhungarumlautsmall}{Usmall}{1000}
+\setleftrightkerning{Uringsmall}{Usmall}{1000}
+
+\setleftrightkerning{Yacutesmall}{Ysmall}{1000}
+\setleftrightkerning{Ydieresissmall}{Ysmall}{1000}
+
+\setleftrightkerning{Zacutesmall}{Zsmall}{1000}
+\setleftrightkerning{Zcaronsmall}{Zsmall}{1000}
+\setleftrightkerning{Zdotaccentsmall}{Zsmall}{1000}
+
+
+\comment{\section{All-caps kerning}}
+
+\setleftrightkerning{dotlessI}{I}{1000}
+\setleftrightkerning{dotlessJ}{J}{1000}
+\setleftrightkerning{FFspaced}{F}{1000}
+\setleftkerning{FIspaced}{F}{1000}
+\setrightkerning{FIspaced}{I}{1000}
+\setleftkerning{FLspaced}{F}{1000}
+\setrightkerning{FLspaced}{L}{1000}
+\setleftkerning{FFIspaced}{F}{1000}
+\setrightkerning{FFIspaced}{I}{1000}
+\setleftkerning{FFLspaced}{F}{1000}
+\setrightkerning{FFLspaced}{L}{1000}
+\setleftrightkerning{Dbar}{Eth}{1000}
+\setleftkerning{IJspaced}{I}{1000}
+\setrightkerning{IJspaced}{J}{1000}
+\setleftrightkerning{SSspaced}{S}{1000}
+
+
+\comment{\section{Small caps kerning}}
+
+\setleftrightkerning{dotlessIsmall}{Ismall}{1000}
+\setleftrightkerning{dotlessJsmall}{Jsmall}{1000}
+
+
+\comment{\section{Unfakable glyphs}}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Upsilon}
+\unfakable{Upsilon1}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+
+\unfakable{grave}
+\unfakable{acute}
+\unfakable{circumflex}
+\unfakable{tilde}
+\unfakable{dieresis}
+\unfakable{hungarumlaut}
+\unfakable{ring}
+\unfakable{caron}
+\unfakable{breve}
+\unfakable{macron}
+\unfakable{dotaccent}
+\unfakable{cedilla}
+\unfakable{ogonek}
+\unfakable{guilsinglleft}
+\unfakable{guilsinglright}
+\unfakable{quotedblleft}
+\unfakable{quotedblright}
+\unfakable{quotedblbase}
+\unfakable{guillemotleft}
+\unfakable{guillemotright}
+\unfakable{endash}
+\unfakable{emdash}
+\unfakable{dotlessi}
+\unfakable{perthousandzero}
+\unfakable{exclam}
+\unfakable{quotedbl}
+\unfakable{numbersign}
+\unfakable{dollar}
+\unfakable{percent}
+\unfakable{ampersand}
+\unfakable{quoteright}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{asterisk}
+\unfakable{plus}
+\unfakable{comma}
+\unfakable{hyphen}
+\unfakable{period}
+\unfakable{slash}
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+\unfakable{zerooldstyle}
+\unfakable{oneoldstyle}
+\unfakable{twooldstyle}
+\unfakable{threeoldstyle}
+\unfakable{fouroldstyle}
+\unfakable{fiveoldstyle}
+\unfakable{sixoldstyle}
+\unfakable{sevenoldstyle}
+\unfakable{eightoldstyle}
+\unfakable{nineoldstyle}
+\unfakable{colon}
+\unfakable{semicolon}
+\unfakable{less}
+\unfakable{equal}
+\unfakable{greater}
+\unfakable{question}
+\unfakable{at}
+\unfakable{A}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+\unfakable{bracketleft}
+\unfakable{backslash}
+\unfakable{bracketright}
+\unfakable{asciicircum}
+\unfakable{underscore}
+\unfakable{quoteleft}
+\unfakable{a}
+\unfakable{b}
+\unfakable{c}
+\unfakable{d}
+\unfakable{e}
+\unfakable{f}
+\unfakable{g}
+\unfakable{h}
+\unfakable{i}
+\unfakable{j}
+\unfakable{k}
+\unfakable{l}
+\unfakable{m}
+\unfakable{n}
+\unfakable{o}
+\unfakable{p}
+\unfakable{q}
+\unfakable{r}
+\unfakable{s}
+\unfakable{t}
+\unfakable{u}
+\unfakable{v}
+\unfakable{w}
+\unfakable{x}
+\unfakable{y}
+\unfakable{z}
+\unfakable{braceleft}
+\unfakable{bar}
+\unfakable{braceright}
+\unfakable{asciitilde}
+\unfakable{Eng}
+\unfakable{section}
+\unfakable{Engsmall}
+\unfakable{exclamdown}
+\unfakable{questiondown}
+\unfakable{sterling}
+\unfakable{AE}
+\unfakable{Eth}
+\unfakable{OE}
+\unfakable{Oslash}
+\unfakable{Thorn}
+\unfakable{AEsmall}
+\unfakable{Ethsmall}
+\unfakable{OEsmall}
+\unfakable{Oslashsmall}
+\unfakable{Thornsmall}
+\unfakable{germandbls}
+\unfakable{lslashslash}
+
+\setglyph{dotlessj}
+ \moveup{\neg{\depth{j}}}
+ \glyphrule{\width{j}}{\add{\depth{j}}{\height{dotlessi}}}
+ \resetitalic{\italic{dotlessi}}
+ \moveup{\depth{j}}
+ \glyphwarning{missing glyph `dotlessj'}
+\endsetglyph
+
+
+\comment{\section{Glyphs}}
+
+% only with monospaced fonts. (WaS)
+\ifisint{monowidth}\then
+\resetglyph{asterisk}
+ \moveup{\neg{\sub{\scale{\sub{\height{asterisk}}{\depth{asterisk}}}{500}}{\int{vaxis}}}}
+ \glyph{asterisk}{1000}
+ \resetdepth{0}
+\endresetglyph
+\fi
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \else
+ \movert{\width{i}}
+ \fi
+\endsetglyph
+
+\setglyph{compwordmark}
+ \glyphrule{0}{\int{xheight}}
+\endsetglyph
+\setint{compwordmark-spacing}{0}
+
+\setglyph{quotesinglbase}
+ \glyph{comma}{1000}
+\endsetglyph
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+
+\setglyph{rangedash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{endash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{punctdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{emdash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+\endsetglyph
+
+\setglyph{ringfitted}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+ \glyph{ring}{1000}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+\endsetglyph
+
+%\setglyph{lslash}
+% \glyph{lslashslash}{1000}
+% \movert{\kerning{lslashslash}{l}}
+% \glyph{l}{1000}
+%\endsetglyph
+
+%\setglyph{Lslash}
+% \glyph{lslashslash}{1000}
+% \movert{\kerning{lslashslash}{L}}
+% \glyph{L}{1000}
+%\endsetglyph
+
+\setglyph{Ng}
+ \glyph{Eng}{1000}
+\endsetglyph
+
+\setglyph{Ngsmall}
+ \glyph{Engsmall}{1000}
+\endsetglyph
+
+\setglyph{Abreve}
+ \topaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogonek}
+ \botaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacute}
+ \topaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaron}
+ \topaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaron}
+ \topaccent{D}{caron}{450}
+\endsetglyph
+
+\setglyph{Ecaron}
+ \topaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogonek}
+ \botaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbreve}
+ \topaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacute}
+ \topaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Lcaron}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{Nacute}
+ \topaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaron}
+ \topaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ohungarumlaut}
+ \topaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racute}
+ \topaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaron}
+ \topaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacute}
+ \topaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaron}
+ \topaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedilla}
+ \botaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaron}
+ \topaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedilla}
+ \botaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlaut}
+ \topaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uring}
+ \topaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresis}
+ \topaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacute}
+ \topaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaron}
+ \topaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccent}
+ \topaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{IJ}
+ \glyph{I}{1000}
+ \movert{\kerning{I}{J}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{Idotaccent}
+ \topaccent{I}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Agrave}
+ \topaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacute}
+ \topaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflex}
+ \topaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atilde}
+ \topaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresis}
+ \topaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aring}
+ \topaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedilla}
+ \botaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egrave}
+ \topaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacute}
+ \topaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflex}
+ \topaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresis}
+ \topaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Iacute}
+ \topaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Igrave}
+ \topaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Icircumflex}
+ \topaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresis}
+ \topaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ntilde}
+ \topaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ograve}
+ \topaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacute}
+ \topaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflex}
+ \topaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otilde}
+ \topaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresis}
+ \topaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugrave}
+ \topaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacute}
+ \topaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflex}
+ \topaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresis}
+ \topaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacute}
+ \topaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{SS}
+ \glyph{S}{1000}
+ \movert{\kerning{S}{S}}
+ \glyph{S}{1000}
+\endsetglyph
+
+
+\comment{\section{All-caps glyphs}}
+
+\setglyph{dotlessI}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{dotlessJ}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{FFspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{F}}
+ {\int{capspacing}}}
+ \glyph{F}{1000}
+\endsetglyph
+
+\setglyph{FIspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FLspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{FFIspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FFLspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Dbar}
+ \glyph{Eth}{1000}
+\endsetglyph
+
+\setglyph{IJspaced}
+ \glyph{I}{1000}
+ \movert{\add{\kerning{I}{J}}{\int{capspacing}}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{SSspaced}
+ \glyph{S}{1000}
+ \movert{\add{\kerning{S}{S}}{\int{capspacing}}}
+ \glyph{S}{1000}
+\endsetglyph
+
+
+\comment{\section{Small caps glyphs}}
+
+\setglyph{Acutesmall}
+ \cscaccent{acute}
+\endsetglyph
+
+\setglyph{acutesmall}
+ \glyph{Acutesmall}{1000}
+\endsetglyph
+
+\setglyph{Gravesmall}
+ \cscaccent{grave}
+\endsetglyph
+
+\setglyph{gravesmall}
+ \glyph{Gravesmall}{1000}
+\endsetglyph
+
+\setglyph{Circumflexsmall}
+ \cscaccent{circumflex}
+\endsetglyph
+
+\setglyph{circumflexsmall}
+ \glyph{Circumflexsmall}{1000}
+\endsetglyph
+
+\setglyph{Tildesmall}
+ \cscaccent{tilde}
+\endsetglyph
+
+\setglyph{tildesmall}
+ \glyph{Tildesmall}{1000}
+\endsetglyph
+
+\setglyph{Dieresissmall}
+ \cscaccent{dieresis}
+\endsetglyph
+
+\setglyph{dieresissmall}
+ \glyph{Dieresissmall}{1000}
+\endsetglyph
+
+\setglyph{Brevesmall}
+ \cscaccent{breve}
+\endsetglyph
+
+\setglyph{brevesmall}
+ \glyph{Brevesmall}{1000}
+\endsetglyph
+
+\setglyph{Dotaccentsmall}
+ \cscaccent{dotaccent}
+\endsetglyph
+
+\setglyph{dotaccentsmall}
+ \glyph{Dotaccentsmall}{1000}
+\endsetglyph
+
+\setglyph{Caronsmall}
+ \cscaccent{caron}
+\endsetglyph
+
+\setglyph{caronsmall}
+ \glyph{Caronsmall}{1000}
+\endsetglyph
+
+\setglyph{Hungarumlautsmall}
+ \cscaccent{hungarumlaut}
+\endsetglyph
+
+\setglyph{hungarumlautsmall}
+ \glyph{Hungarumlautsmall}{1000}
+\endsetglyph
+
+\setglyph{Ringsmall}
+ \cscaccent{ring}
+\endsetglyph
+
+\setglyph{ringsmall}
+ \glyph{Ringsmall}{1000}
+\endsetglyph
+
+\setglyph{Cedillasmall}
+ \cscglyph{cedilla}
+\endsetglyph
+
+\setglyph{cedillasmall}
+ \glyph{Cedillasmall}{1000}
+\endsetglyph
+
+\setglyph{Ogoneksmall}
+ \cscglyph{ogonek}
+\endsetglyph
+
+\setglyph{ogoneksmall}
+ \glyph{Ogoneksmall}{1000}
+\endsetglyph
+
+\setglyph{Abrevesmall}
+ \csctopaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogoneksmall}
+ \cscbotaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacutesmall}
+ \csctopaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaronsmall}
+ \csctopaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaronsmall}
+ \csctopaccent{D}{caron}{500}
+\endsetglyph
+
+\setglyph{Ecaronsmall}
+ \csctopaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogoneksmall}
+ \cscbotaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbrevesmall}
+ \csctopaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacutesmall}
+ \csctopaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Nacutesmall}
+ \csctopaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaronsmall}
+ \csctopaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ngsmall}
+ \cscglyph{Ng}
+\endsetglyph
+
+\setglyph{Ohungarumlautsmall}
+ \csctopaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racutesmall}
+ \csctopaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaronsmall}
+ \csctopaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacutesmall}
+ \csctopaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaronsmall}
+ \csctopaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedillasmall}
+ \cscbotaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaronsmall}
+ \csctopaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedillasmall}
+ \cscbotaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlautsmall}
+ \csctopaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uringsmall}
+ \csctopaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresissmall}
+ \csctopaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacutesmall}
+ \csctopaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaronsmall}
+ \csctopaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccentsmall}
+ \csctopaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Agravesmall}
+ \csctopaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacutesmall}
+ \csctopaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflexsmall}
+ \csctopaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atildesmall}
+ \csctopaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresissmall}
+ \csctopaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aringsmall}
+ \csctopaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedillasmall}
+ \csctopaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egravesmall}
+ \csctopaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacutesmall}
+ \csctopaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflexsmall}
+ \csctopaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresissmall}
+ \csctopaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Igravesmall}
+ \csctopaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Iacutesmall}
+ \csctopaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Icircumflexsmall}
+ \csctopaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresissmall}
+ \csctopaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ethsmall}
+ \cscglyph{Eth}
+\endsetglyph
+
+\setglyph{Dbarsmall}
+ \glyph{Ethsmall}{1000}
+\endsetglyph
+
+\setglyph{Ntildesmall}
+ \csctopaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ogravesmall}
+ \csctopaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacutesmall}
+ \csctopaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflexsmall}
+ \csctopaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otildesmall}
+ \csctopaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresissmall}
+ \csctopaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugravesmall}
+ \csctopaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacutesmall}
+ \csctopaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflexsmall}
+ \csctopaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresissmall}
+ \csctopaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacutesmall}
+ \csctopaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{Thornsmall}
+ \cscglyph{Thorn}
+\endsetglyph
+
+\setglyph{dotlessIsmall}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{dotlessJsmall}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{FFsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Fsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Fsmall}{1000}
+\endsetglyph
+
+\setglyph{FIsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FLsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{FFIsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Ismall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FFLsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Lsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{IJsmall}
+ \glyph{Ismall}{1000}
+ \movert{\add{\kerning{Ismall}{Jsmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{Lcaronsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{\int{smallcapsscale}}
+\endsetglyph
+
+\setglyph{SSsmall}
+ \glyph{Ssmall}{1000}
+ \movert{\add{\kerning{Ssmall}{Ssmall}}
+ {\mul{2}{\int{smallcapsextraspace}}}}
+ \glyph{Ssmall}{1000}
+\endsetglyph
+
+
+\comment{\section{Accents}
+ \TeX's math accent-positioning requires accents to have zero depth.}
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+\zerodepth{Gravesmall}
+\zerodepth{Acutesmall}
+\zerodepth{Circumflexsmall}
+\zerodepth{Tildesmall}
+\zerodepth{Dieresissmall}
+\zerodepth{Hungarumlautsmall}
+\zerodepth{Ringsmall}
+\zerodepth{Caronsmall}
+\zerodepth{Brevesmall}
+\zerodepth{Macronsmall}
+\zerodepth{Dotaccentsmall}
+
+\endmetrics
+
+\section{Changes}
+
+2003/03/17: Added \texttt{vaxis} for the vertical symmetry axis.
+Changed `\texttt{asterisk}', which is now vertically centered
+in monospaced fonts. (WaS)
+
+1999/10/25: Simplified definition of \verb|\unfakable|. (UV\&LH)
+Rationale: It is thoroughly confusing if the size of the black box
+created by \verb|\unfakable| depends on the metrics of an unencoded
+glyph that isn't accessible and therefore unavailable for all
+pratical purposes.
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/llbuild.mtx b/fonts/utilities/fontinst/inputs/latinmtx/llbuild.mtx
new file mode 100644
index 0000000000..91306fbaf3
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/llbuild.mtx
@@ -0,0 +1,568 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.923",
+%%% date = "2003-03-29",
+%%% time = "01:24:47 +01:00",
+%%% filename = "llbuild.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It builds upper case latin
+%%% letters.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\title{Building lower case}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{5 January 2002\\Version 1.923}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file builds lower case (small, \texttt{l} case) latin letters,
+or more precisely, it makes sure that a set of glyphs is defined that
+cover the lower case letters used in European latin scripts.
+Even that is a slight exaggeration, because there are a couple of
+``exotic'' letters that are missing, but most people never try to use
+those anyway.
+
+For the glyphs set in this file to look anything like the letters they
+are supposed to be, it is necessary that the glyphs for unaccented
+letters and for accents already exist and look like they are supposed
+to. In that case, the commands below will manufacture decent
+substitutes for the missing glyphs by composing letters and accents.
+If some of these base glyphs are missing, then a ``missing glyph''
+substitute will be supplied for them. Such substitutes will show up in
+print as black squares, and most DVI drivers will emit a warning when
+producing them.
+
+The most common case encountered is that almost all unaccented letters
+and accents are available, but only about half of the accented
+letters. Then for the other half, quite decent substitutes are made,
+but a few letters only show up as ``missing glyph'' boxes.
+
+
+\metrics
+
+\needsfontinstversion{1.910}
+\usemtxpackage{ltcmds}
+
+\ProvidesMtxPackage{llbuild}
+
+\begincomment
+\section{Lower case base glyphs}
+
+\subsection{Unfakable glyphs}
+
+The following commands make sure all the unaccented letter glyphs and
+accent glyphs are set. If any of them are not already set at this
+point, then those will be set to ``missing glyph'' boxes.
+\endcomment
+
+\unfakable{a}
+\unfakable{ae}
+\unfakable{b}
+\unfakable{c}
+\unfakable{d}
+\unfakable{dotlessi}
+\unfakable{e}
+\unfakable{eng}
+\unfakable{eth}
+\unfakable{f}
+\unfakable{g}
+\unfakable{germandbls}
+\unfakable{h}
+\unfakable{i}
+\unfakable{j}
+\unfakable{k}
+\unfakable{l}
+\unfakable{m}
+\unfakable{n}
+\unfakable{o}
+\unfakable{oe}
+\unfakable{oslash}
+\unfakable{p}
+\unfakable{q}
+\unfakable{r}
+\unfakable{s}
+\unfakable{t}
+\unfakable{thorn}
+\unfakable{u}
+\unfakable{v}
+\unfakable{w}
+\unfakable{x}
+\unfakable{y}
+\unfakable{z}
+
+
+\unfakabletopaccent{acute}
+\unfakabletopaccent{breve}
+\unfakabletopaccent{caron}
+\unfakable{cedilla}
+\unfakabletopaccent{circumflex}
+\unfakabletopaccent{dieresis}
+\unfakabletopaccent{dotaccent}
+\unfakabletopaccent{grave}
+\unfakabletopaccent{hungarumlaut}
+\unfakable{lslashslash}
+\unfakabletopaccent{macron}
+\unfakable{ogonek}
+\unfakabletopaccent{quoteright}
+\unfakabletopaccent{ring}
+\unfakabletopaccent{tilde}
+
+\begincomment
+\subsection{Fakable lower case glyphs}
+\endcomment
+
+\ifisglyph{dcroat}\then
+ \setglyph{dbar}
+ \glyph{dcroat}{1000}
+ \endsetglyph
+\Else
+ \setglyph{dbar}
+ \push
+ \movert{\sub{\width{d}}{\width{macron}}}
+ \moveup{
+ \sub{\half{\add{\height{d}}{\int{xheight}}}}
+ {\height{macron}}}
+ \glyph{macron}{1000}
+ \pop
+ \glyph{d}{1000}
+ \endsetglyph
+\Fi
+\setleftrightkerning{dbar}{d}{1000}
+
+\setglyph{dotlessj}
+ \glyph{j}{1000}
+ \resetheight{\int{xheight}}
+ \comment{The reason \texttt{dotlessj} \emph{can} be faked using a
+ \texttt{j} is that it is not a distinct character. Unlike
+ \texttt{dotlessi}, which is in Turkish a letter distinct from
+ \texttt{i}, the only thing \texttt{dotlessj} is ever used for is
+ as the base glyph for accented j's.}
+\endsetglyph
+\setleftrightkerning{dotlessj}{j}{1000}
+
+
+\begincomment
+\subsection{Aliased lower case glyphs}
+\endcomment
+
+\setglyph{ng}
+ \glyph{eng}{1000}
+\endsetglyph
+\setleftkerning{ng}{n}{1000}
+\setrightkerning{ng}{j}{1000}
+
+
+\begincomment
+\subsection{Some extra kerning}
+\endcomment
+
+\setleftkerning{oe}{o}{1000}
+\setrightkerning{oe}{e}{1000}
+
+\setleftrightkerning{oslash}{o}{1000}
+
+
+
+\begincomment
+\section{Accented lower case glyphs}
+\endcomment
+
+\setglyph{aacute}
+ \topaccent{a}{acute}{500}
+\endsetglyph
+\setleftrightkerning{aacute}{a}{1000}
+
+\setglyph{abreve}
+ \topaccent{a}{breve}{500}
+\endsetglyph
+\setleftrightkerning{abreve}{a}{1000}
+
+\setglyph{acircumflex}
+ \topaccent{a}{circumflex}{500}
+\endsetglyph
+\setleftrightkerning{acircumflex}{a}{1000}
+
+\setglyph{adieresis}
+ \topaccent{a}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{adieresis}{a}{1000}
+
+\setglyph{agrave}
+ \topaccent{a}{grave}{500}
+\endsetglyph
+\setleftrightkerning{agrave}{a}{1000}
+
+\setglyph{aogonek}
+ \botaccent{a}{ogonek}{850}
+\endsetglyph
+\setleftrightkerning{aogonek}{a}{1000}
+
+\setglyph{aring}
+ \topaccent{a}{ring}{500}
+\endsetglyph
+\setleftrightkerning{aring}{a}{1000}
+
+\setglyph{atilde}
+ \topaccent{a}{tilde}{500}
+\endsetglyph
+\setleftrightkerning{atilde}{a}{1000}
+
+\setglyph{cacute}
+ \topaccent{c}{acute}{500}
+\endsetglyph
+\setleftrightkerning{cacute}{c}{1000}
+
+\setglyph{ccaron}
+ \topaccent{c}{caron}{500}
+\endsetglyph
+\setleftrightkerning{ccaron}{c}{1000}
+
+\setglyph{ccedilla}
+ \botaccent{c}{cedilla}{500}
+\endsetglyph
+\setleftrightkerning{ccedilla}{c}{1000}
+
+\setglyph{dcaron}
+ \glyph{d}{1000}
+ \ifisint{monowidth}\then\Else
+ \movert{-75}
+ \Fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+\setleftkerning{dcaron}{d}{1000}
+
+\setglyph{eacute}
+ \topaccent{e}{acute}{500}
+\endsetglyph
+\setleftrightkerning{eacute}{e}{1000}
+
+\setglyph{ecaron}
+ \topaccent{e}{caron}{500}
+\endsetglyph
+\setleftrightkerning{ecaron}{e}{1000}
+
+\setglyph{ecircumflex}
+ \topaccent{e}{circumflex}{500}
+\endsetglyph
+\setleftrightkerning{ecircumflex}{e}{1000}
+
+\setglyph{edieresis}
+ \topaccent{e}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{edieresis}{e}{1000}
+
+\setglyph{egrave}
+ \topaccent{e}{grave}{500}
+\endsetglyph
+\setleftrightkerning{egrave}{e}{1000}
+
+\setglyph{eogonek}
+ \botaccent{e}{ogonek}{500}
+\endsetglyph
+\setleftrightkerning{eogonek}{e}{1000}
+
+\setglyph{gbreve}
+ \topaccent{g}{breve}{500}
+\endsetglyph
+\setleftrightkerning{gbreve}{g}{1000}
+
+\setglyph{iacute}
+ \topaccent{dotlessi}{acute}{500}
+\endsetglyph
+\setleftrightkerning{iacute}{i}{1000}
+
+\setglyph{icircumflex}
+ \topaccent{dotlessi}{circumflex}{500}
+\endsetglyph
+\setleftrightkerning{icircumflex}{i}{1000}
+
+\setglyph{idieresis}
+ \topaccent{dotlessi}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{idieresis}{i}{1000}
+
+\setglyph{idotaccent}
+ \comment{This should be the normal `\texttt{i}', except in
+ smallcaps fonts.}
+ \ifnumber{\height{i}}>{\scale{\int{xheight}}{1050}}\then
+ \comment{Some quick statistics showed that the height of an
+ `\texttt{i}' with dot is usually around 140\% of the
+ x-height, but to be on the safe side we assume all
+ \texttt{i}s whose height exceed 105\% of the x-height to
+ be dotted.}
+ \glyph{i}{1000}
+ \Else
+ \topaccent{i}{dotaccent}{500}
+ \Fi
+\endsetglyph
+\setleftrightkerning{idotaccent}{i}{1000}
+
+\setglyph{igrave}
+ \topaccent{dotlessi}{grave}{500}
+\endsetglyph
+\setleftrightkerning{igrave}{i}{1000}
+
+\setglyph{lacute}
+ \topaccent{l}{acute}{500}
+\endsetglyph
+\setleftrightkerning{lacute}{l}{1000}
+
+\setglyph{lcaron}
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\Else
+ \movert{-100}
+ \Fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+\setleftkerning{lcaron}{l}{1000}
+
+\setglyph{lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+\comment{I'm not sure what this should kern like.}
+
+\setglyph{nacute}
+ \topaccent{n}{acute}{500}
+\endsetglyph
+\setleftrightkerning{nacute}{n}{1000}
+
+\setglyph{ncaron}
+ \topaccent{n}{caron}{500}
+\endsetglyph
+\setleftrightkerning{ncaron}{n}{1000}
+
+\setglyph{ntilde}
+ \topaccent{n}{tilde}{500}
+\endsetglyph
+\setleftrightkerning{ntilde}{n}{1000}
+
+\setglyph{oacute}
+ \topaccent{o}{acute}{500}
+\endsetglyph
+\setleftrightkerning{oacute}{o}{1000}
+
+\setglyph{ocircumflex}
+ \topaccent{o}{circumflex}{500}
+\endsetglyph
+\setleftrightkerning{ocircumflex}{o}{1000}
+
+\setglyph{odieresis}
+ \topaccent{o}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{odieresis}{o}{1000}
+
+\setglyph{ograve}
+ \topaccent{o}{grave}{500}
+\endsetglyph
+\setleftrightkerning{ograve}{o}{1000}
+
+\setglyph{ohungarumlaut}
+ \topaccent{o}{hungarumlaut}{500}
+\endsetglyph
+\setleftrightkerning{ohungarumlaut}{o}{1000}
+
+\setglyph{otilde}
+ \topaccent{o}{tilde}{500}
+\endsetglyph
+\setleftrightkerning{otilde}{o}{1000}
+
+\setglyph{racute}
+ \topaccent{r}{acute}{500}
+\endsetglyph
+\setleftrightkerning{racute}{r}{1000}
+
+\setglyph{rcaron}
+ \topaccent{r}{caron}{500}
+\endsetglyph
+\setleftrightkerning{rcaron}{r}{1000}
+
+\setglyph{sacute}
+ \topaccent{s}{acute}{500}
+\endsetglyph
+\setleftrightkerning{sacute}{s}{1000}
+
+\setglyph{scaron}
+ \topaccent{s}{caron}{500}
+\endsetglyph
+\setleftrightkerning{scaron}{s}{1000}
+
+\setglyph{scedilla}
+ \botaccent{s}{cedilla}{500}
+\endsetglyph
+\setleftrightkerning{scedilla}{s}{1000}
+
+\setglyph{tcaron}
+ \glyph{t}{1000}
+ \ifisint{monowidth}\then\Else
+ \movert{-75}
+ \Fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+\setleftkerning{tcaron}{t}{1000}
+\comment{I don't know what this should kern like on the right.}
+
+\setglyph{tcedilla}
+ \botaccent{t}{cedilla}{500}
+\endsetglyph
+\setleftrightkerning{tcedilla}{t}{1000}
+
+\setglyph{ugrave}
+ \topaccent{u}{grave}{500}
+\endsetglyph
+\setleftrightkerning{ugrave}{u}{1000}
+
+\setglyph{uacute}
+ \topaccent{u}{acute}{500}
+\endsetglyph
+\setleftrightkerning{uacute}{u}{1000}
+
+\setglyph{ucircumflex}
+ \topaccent{u}{circumflex}{500}
+\endsetglyph
+\setleftrightkerning{ucircumflex}{u}{1000}
+
+\setglyph{udieresis}
+ \topaccent{u}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{udieresis}{u}{1000}
+
+\setglyph{uhungarumlaut}
+ \topaccent{u}{hungarumlaut}{500}
+\endsetglyph
+\setleftrightkerning{uhungarumlaut}{u}{1000}
+
+\setglyph{uring}
+ \topaccent{u}{ring}{500}
+\endsetglyph
+\setleftrightkerning{uring}{u}{1000}
+
+\setglyph{yacute}
+ \topaccent{y}{acute}{500}
+\endsetglyph
+\setleftrightkerning{yacute}{y}{1000}
+
+\setglyph{ydieresis}
+ \topaccent{y}{dieresis}{500}
+\endsetglyph
+\setleftrightkerning{ydieresis}{y}{1000}
+
+\setglyph{zacute}
+ \topaccent{z}{acute}{500}
+\endsetglyph
+\setleftrightkerning{zacute}{z}{1000}
+
+\setglyph{zcaron}
+ \topaccent{z}{caron}{500}
+\endsetglyph
+\setleftrightkerning{zcaron}{z}{1000}
+
+\setglyph{zdotaccent}
+ \topaccentas{z}{dotaccent}{500}{idotaccent}
+\endsetglyph
+\setleftrightkerning{zdotaccent}{z}{1000}
+
+
+\begincomment
+\section{Lower case ligatures}
+\endcomment
+
+\setglyph{fi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{i}}
+ \glyph{i}{1000}
+\endsetglyph
+\setleftkerning{fi}{f}{1000}
+\setrightkerning{fi}{i}{1000}
+
+\setglyph{ff}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{f}{1000}
+\endsetglyph
+\setleftrightkerning{ff}{f}{1000}
+
+\setglyph{fl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+\setleftkerning{fl}{f}{1000}
+\setrightkerning{fl}{l}{1000}
+
+\setglyph{ffi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fi}{1000}
+\endsetglyph
+\setleftkerning{ffi}{f}{1000}
+\setrightkerning{ffi}{i}{1000}
+
+\setglyph{ffl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fl}{1000}
+\endsetglyph
+\setleftkerning{ffl}{f}{1000}
+\setrightkerning{ffl}{l}{1000}
+
+
+\setglyph{ij}
+ \glyph{i}{1000}
+ \movert{\kerning{i}{j}}
+ \glyph{j}{1000}
+\endsetglyph
+\setleftkerning{ij}{i}{1000}
+\setrightkerning{ij}{j}{1000}
+
+
+
+
+\endmetrics
+
+\section{Changes}
+
+The original version of this file was created in February 2003,
+although it is based on code from the traditional \texttt{latin.mtx}.
+The changes that have been made after that are as follows.
+
+2003/03/15: Using \verb|\unfakabletopaccent| for the accent
+characters. This should change the appearence of accented letters
+built using such a character from ``a black square'' to ``a letter
+with a black square above''. Neither is satisfactory, but the latter
+conveys more information. (LH)
+
+2003/03/15: Modified the construction of `\texttt{zdotaccent}' so that
+it always has the dot at the same vertical position as a dotted i, as
+requested by Walter Schmidt. Also added the `\texttt{idotaccent}'
+glyph to have something to compare with. (LH)
+
+2003/03/15: Added kerning for ligatures; it seems I had forgotten
+that. (LH)
+
+2003/03/29: Added some kerning for non-English unfakable letters. (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/lsbuild.mtx b/fonts/utilities/fontinst/inputs/latinmtx/lsbuild.mtx
new file mode 100644
index 0000000000..35220c773c
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/lsbuild.mtx
@@ -0,0 +1,260 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Lars Hellstr{\"o}m",
+%%% date = "2003-03-29",
+%%% time = "16:16:56 +01:00",
+%%% filename = "lsbuild.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It builds less common
+%%% small caps letters from plain ones and
+%%% accents.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\title{Building latin smallcaps letters}
+\author{Lars Hellstr\"om}
+\date{3 January 2003}
+
+\begin{document}
+\maketitle
+
+This file contains commands that build some proper small capital
+glyphs from other small capital glyphs, but nothing is done is those
+base glyphs have not already been set.
+
+If you want to \emph{fake} small capitals using full capitals, then
+have a look at \texttt{lsfake.mtx} instead.
+
+\metrics
+
+\needsfontinstversion{1.917}
+
+\usemtxpackage{ltcmds}
+\ProvidesMtxPackage{lsbuild}
+
+\begincomment
+\section{Proper latin small capitals}
+
+\subsection{Some utility commands}
+\endcomment
+
+\setcommand\setcsctopglyph#1#2#3#4{
+ \ifareglyphs{#2small,#3}\then
+ \setglyph{#1}
+ \topaccent{#2small}{#3}{#4}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2small}{1000}
+ \Fi
+}
+\setcommand\setcscbotglyph#1#2#3#4{
+ \ifareglyphs{#2small,#3}\then
+ \setglyph{#1}
+ \botaccent{#2small}{#3}{#4}
+ \endsetglyph
+ \setleftrightkerning{#1}{#2small}{1000}
+ \Fi
+}
+\begincomment\medskip
+A ``\textbf{Try: Set glyph}'' is an ordinary \textbf{Set glyph} which is
+conditional on that a set of glyphs (those used to construct the
+composite glyph) are available. Technically the command definitions
+are
+\begin{quotation}
+ \verb|\setcsctopglyph|\textit{\#1\#2\#3\#4} $\mapsto$\\
+ \setcsctopglyph{\macroparameter{1}}{\macroparameter{2}}%
+ {\macroparameter{3}}{\macroparameter{4}}
+ \par\medskip
+
+ \verb|\setcscbotglyph|\textit{\#1\#2\#3\#4} $\mapsto$\\
+ \setcscbotglyph{\macroparameter{1}}{\macroparameter{2}}%
+ {\macroparameter{3}}{\macroparameter{4}}\par
+\end{quotation}
+but in the list of commands below those two commands will
+be typeset as
+\resetcommand\setcsctopglyph#1#2#3#4{%
+ \Aheading{Try: Set glyph `\TypesetStringExpression{#1}'}
+ \topaccent{#2small}{#3}{#4}
+ \setleftrightkerning{#1}{#2small}{1000}
+}
+\resetcommand\setcscbotglyph#1#2#3#4{%
+ \Aheading{Try: Set glyph `\TypesetStringExpression{#1}'}
+ \botaccent{#2small}{#3}{#4}
+ \setleftrightkerning{#1}{#2small}{1000}
+}
+\begin{quotation}
+ \setcsctopglyph{\macroparameter{1}}{\macroparameter{2}}%
+ {\macroparameter{3}}{\macroparameter{4}}
+ \setcscbotglyph{\macroparameter{1}}{\macroparameter{2}}%
+ {\macroparameter{3}}{\macroparameter{4}}
+\end{quotation}
+\endcomment
+
+\begincomment
+\subsection{Getting the \textit{smallcapsscale} right}
+
+The \textit{smallcapsscale} integer is normally only used when
+faking smallcaps by shrinking capitals, but with one of the
+glyphs below (\texttt{Lcaron}) it is actually used for shrinking
+the right quote. Thus a suitable default value has to be assigned
+to it.
+\endcomment
+
+\ifareglyphs{L,Lsmall}\then
+ \setint{smallcapsscale}{
+ \div{\mul{1000}{\height{Lsmall}}}{\height{L}}
+ }
+\Else
+ \setint{smallcapsscale}{800}
+\Fi
+
+\begincomment
+\subsection{Accenting smallcaps glyphs}
+
+The commands below build accented smallcaps letters from existing
+smallcaps letters and normal accents. The accent positions are the
+ones traditionally used in \texttt{latin.mtx}.
+
+\endcomment
+
+
+\setcsctopglyph{Aacutesmall}{A}{acute}{500}
+\setcsctopglyph{Abrevesmall}{A}{breve}{500}
+\setcsctopglyph{Acircumflexsmall}{A}{circumflex}{500}
+\setcsctopglyph{Adieresissmall}{A}{dieresis}{500}
+\setcsctopglyph{Agravesmall}{A}{grave}{500}
+\setcscbotglyph{Aogoneksmall}{A}{ogonek}{900}
+\setcsctopglyph{Aringsmall}{A}{ring}{500}
+\setcsctopglyph{Atildesmall}{A}{tilde}{500}
+
+\setcsctopglyph{Cacutesmall}{C}{acute}{500}
+\setcsctopglyph{Ccaronsmall}{C}{caron}{500}
+\setcsctopglyph{Ccedillasmall}{C}{cedilla}{500}
+
+\setcsctopglyph{Dcaronsmall}{D}{caron}{500}
+
+\setcsctopglyph{Eacutesmall}{E}{acute}{500}
+\setcsctopglyph{Ecaronsmall}{E}{caron}{500}
+\setcsctopglyph{Ecircumflexsmall}{E}{circumflex}{500}
+\setcsctopglyph{Edieresissmall}{E}{dieresis}{500}
+\setcsctopglyph{Egravesmall}{E}{grave}{500}
+\setcscbotglyph{Eogoneksmall}{E}{ogonek}{850}
+
+\setcsctopglyph{Gbrevesmall}{G}{breve}{500}
+
+\setcsctopglyph{Iacutesmall}{I}{acute}{500}
+\setcsctopglyph{Icircumflexsmall}{I}{circumflex}{500}
+\setcsctopglyph{Idieresissmall}{I}{dieresis}{500}
+\setcsctopglyph{Idotaccentsmall}{I}{dotaccent}{500}
+\setcsctopglyph{Igravesmall}{I}{grave}{500}
+
+\setcsctopglyph{Lacutesmall}{L}{acute}{250}
+
+\ifareglyphs{Lsmall,quoteright}\then
+ \setglyph{Lcaronsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\Else \movert{-100} \Fi
+ \glyph{quoteright}{\int{smallcapsscale}}
+ \endsetglyph
+ \setleftkerning{Lcaronsmall}{Lsmall}{1000}
+\Fi
+
+\setcsctopglyph{Nacutesmall}{N}{acute}{500}
+\setcsctopglyph{Ncaronsmall}{N}{caron}{500}
+\setcsctopglyph{Ntildesmall}{N}{tilde}{500}
+
+\setcsctopglyph{Oacutesmall}{O}{acute}{500}
+\setcsctopglyph{Ocircumflexsmall}{O}{circumflex}{500}
+\setcsctopglyph{Odieresissmall}{O}{dieresis}{500}
+\setcsctopglyph{Ogravesmall}{O}{grave}{500}
+\setcsctopglyph{Ohungarumlautsmall}{O}{hungarumlaut}{500}
+\setcsctopglyph{Otildesmall}{O}{tilde}{500}
+
+\setcsctopglyph{Racutesmall}{R}{acute}{500}
+\setcsctopglyph{Rcaronsmall}{R}{caron}{500}
+
+\setcsctopglyph{Sacutesmall}{S}{acute}{500}
+\setcsctopglyph{Scaronsmall}{S}{caron}{500}
+\setcscbotglyph{Scedillasmall}{S}{cedilla}{500}
+
+\setcsctopglyph{Tcaronsmall}{T}{caron}{500}
+\setcscbotglyph{Tcedillasmall}{T}{cedilla}{500}
+
+\setcsctopglyph{Uacutesmall}{U}{acute}{500}
+\setcsctopglyph{Ucircumflexsmall}{U}{circumflex}{500}
+\setcsctopglyph{Udieresissmall}{U}{dieresis}{500}
+\setcsctopglyph{Ugravesmall}{U}{grave}{500}
+\setcsctopglyph{Uhungarumlautsmall}{U}{hungarumlaut}{500}
+\setcsctopglyph{Uringsmall}{U}{ring}{500}
+
+\setcsctopglyph{Yacutesmall}{Y}{acute}{500}
+\setcsctopglyph{Ydieresissmall}{Y}{dieresis}{500}
+
+\setcsctopglyph{Zacutesmall}{Z}{acute}{500}
+\setcsctopglyph{Zcaronsmall}{Z}{caron}{500}
+\setcsctopglyph{Zdotaccentsmall}{Z}{dotaccent}{500}
+
+
+\begincomment
+\subsection{Other glyphs that can be built}
+\endcomment
+
+\ifisglyph{Dcroatsmall}\then
+ \setglyph{Dbarsmall}
+ \glyph{Dcroatsmall}{1000}
+ \endsetglyph
+ \setleftrightkerning{Dbarsmall}{Dcroatsmall}{1000}
+\Else\ifisglyph{Ethsmall}\then
+ \setglyph{Dbarsmall}
+ \glyph{Ethsmall}{1000}
+ \endsetglyph
+ \setleftrightkerning{Dbarsmall}{Ethsmall}{1000}
+\Fi\Fi
+
+
+\endmetrics
+
+\texttt{Dbar} and \texttt{Dbarsmall} are old names for this glyph;
+nowadays the standard names are rather \texttt{Dcroat} and
+\texttt{Dcroatsmall}, but using those names throughout would require
+a coordinated change of the ETX files.
+It is probably possible to build a decent \texttt{Dbarsmall} from
+\texttt{Dsmall} and an \texttt{lslashslash} (or the like), similarly
+to the case with \texttt{dbar}, but that would require some
+experimentation.
+
+\section{Changes}
+
+This file was created 2003/01/02--05. It is loosely based on parts
+of \texttt{latin.mtx}. (LH)
+
+2003/02/06: Added setting of \textit{smallcapsscale}, and made
+\texttt{Lcaron} kern like \texttt{L} only on the left (not on the
+right). (LH)
+
+\end{document}
+
+% Copyright 2003 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/lsfake.mtx b/fonts/utilities/fontinst/inputs/latinmtx/lsfake.mtx
new file mode 100644
index 0000000000..9062e376a1
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/lsfake.mtx
@@ -0,0 +1,359 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Lars Hellstr{\"o}m",
+%%% version = "1.923",
+%%% date = "2005-04-15",
+%%% time = "12:13:38 +02:00",
+%%% filename = "lsfake.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It fakes latin smallcaps.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty, lubuild.mtx",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\newcommand{\IEint}[1]{\ensuremath{\TypesetIntegerExpression{\int{#1}}}}
+
+\title{Faking smallcaps}
+\author{Lars Hellstr\"om}
+\date{5 January 2003\\Version 1.923}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file is used to fake small capitals (the \texttt{s} case) for a
+font by shrinking the full capitals (the \texttt{u} case) by a
+certain factor (\IEint{smallcapsscale}). This effectively changes the
+weight of the font so that it becomes lighter, but that effect is
+(for scaling factors near the default value) not too large, even
+though it is quite visible.
+
+Optimal distance between two letters generally grows slower than the
+dimensions of the letters themself. Conversely, to linearly shrink a
+line of text usually places the letters a bit too close. To counteract
+that, the \textbf{Small glyph} commands used below insert a bit of
+extra space (\IEint{smallcapsextraspace}) before and after the actual
+glyph.
+
+Besides the letters, there is also manufactured a special set of
+diacritical marks (skrunk by the same factor as the letters), with
+names such as \texttt{Acutesmall}. These are meant to be used as
+accent characters in a font where the fake small capitals are used as
+small letters, so that clashes within a single character when \TeX's
+\verb|\accent| primitive is used can be less pronounced.
+\textsf{Fontinst} users should however be aware that this is not
+necessarily the right thing to do; some fonts might look better with
+the \texttt{acute} etc.\@ glyphs as \texttt{Acutesmall} and friends.
+
+
+\metrics
+
+\needsfontinstversion{1.910}
+\usemtxpackage{lubuild}
+
+\ProvidesMtxPackage{lsfake}
+
+
+\begincomment
+\section{Some commands and default values}
+
+\endcomment
+
+
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+}
+\begincomment
+A \textbf{Small glyph} is mainly the special case of a \textbf{Glyph}
+when the glyph is scaled
+$\TypesetIntegerExpression{\int{smallcapsscale}}$. This is used to
+fake smallcaps from full capitals. The exact meaning of
+``\textbf{Small glyph} `\#1'\,'' is
+\begin{quotation}\cscglyph{\macroparameter{1}}\end{quotation}
+
+\resetcommand\cscglyph#1{%
+ \Bheading{Small glyph} `\TypesetStringExpression{#1}'%
+}
+\endcomment
+
+\setcommand\fakecscglyph#1#2{
+ \setglyph{#1small}
+ \cscglyph{#2}
+ \setleftrightkerning{#1small}{#2}{\int{smallcapskerning}}
+ \endsetglyph
+}
+% If you supply a definition of \fakecscglyph which has #1medium
+% instead of #1small, then you can use this file to fake medium
+% capitals instead of small capitals.
+
+
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+\ifisint{monowidth}\then
+ \setint{smallcapsextraspace}
+ {\half{\scale{\width{x}}{\sub{1000}{\int{smallcapsscale}}}}}
+\Else
+ \setint{smallcapsextraspace}{25}
+\Fi
+
+
+
+\begincomment
+\section{Unaccented letters}
+\endcomment
+
+\fakecscglyph{A}{A}
+\fakecscglyph{AE}{AE}
+\fakecscglyph{B}{B}
+\fakecscglyph{C}{C}
+\fakecscglyph{D}{D}
+\fakecscglyph{Eth}{Eth}
+\fakecscglyph{E}{E}
+\fakecscglyph{F}{F}
+\fakecscglyph{G}{G}
+\fakecscglyph{H}{H}
+\fakecscglyph{I}{I}
+\fakecscglyph{J}{J}
+\fakecscglyph{K}{K}
+\fakecscglyph{Lslash}{Lslash}
+\fakecscglyph{L}{L}
+\fakecscglyph{M}{M}
+\fakecscglyph{N}{N}
+\fakecscglyph{Ng}{Ng}
+\fakecscglyph{O}{O}
+\fakecscglyph{OE}{OE}
+\fakecscglyph{Oslash}{Oslash}
+\fakecscglyph{P}{P}
+\fakecscglyph{Q}{Q}
+\fakecscglyph{R}{R}
+\fakecscglyph{S}{S}
+\fakecscglyph{T}{T}
+\fakecscglyph{Thorn}{Thorn}
+\fakecscglyph{U}{U}
+\fakecscglyph{V}{V}
+\fakecscglyph{W}{W}
+\fakecscglyph{X}{X}
+\fakecscglyph{Y}{Y}
+\fakecscglyph{Z}{Z}
+
+\setglyph{Dbarsmall}
+ \glyph{Ethsmall}{1000}
+ \setleftrightkerning{Dbarsmall}{Ethsmall}{1000}
+\endsetglyph
+
+
+
+
+\begincomment
+\section{Accented letters}
+\endcomment
+
+
+\fakecscglyph{Aacute}{Aacute}
+\fakecscglyph{Abreve}{Abreve}
+\fakecscglyph{Acircumflex}{Acircumflex}
+\fakecscglyph{Adieresis}{Adieresis}
+\fakecscglyph{Agrave}{Agrave}
+\fakecscglyph{Aogonek}{Aogonek}
+\fakecscglyph{Aring}{Aring}
+\fakecscglyph{Atilde}{Atilde}
+\fakecscglyph{Cacute}{Cacute}
+\fakecscglyph{Ccaron}{Ccaron}
+\fakecscglyph{Ccedilla}{Ccedilla}
+\fakecscglyph{Dcaron}{Dcaron}
+\fakecscglyph{Eacute}{Eacute}
+\fakecscglyph{Ecaron}{Ecaron}
+\fakecscglyph{Ecircumflex}{Ecircumflex}
+\fakecscglyph{Edieresis}{Edieresis}
+\fakecscglyph{Egrave}{Egrave}
+\fakecscglyph{Eogonek}{Eogonek}
+\fakecscglyph{Gbreve}{Gbreve}
+\fakecscglyph{Iacute}{Iacute}
+\fakecscglyph{Icircumflex}{Icircumflex}
+\fakecscglyph{Idieresis}{Idieresis}
+\fakecscglyph{Idotaccent}{Idotaccent}
+\fakecscglyph{Igrave}{Igrave}
+\fakecscglyph{Lacute}{Lacute}
+\fakecscglyph{Lcaron}{Lcaron}
+\fakecscglyph{Nacute}{Nacute}
+\fakecscglyph{Ncaron}{Ncaron}
+\fakecscglyph{Ntilde}{Ntilde}
+\fakecscglyph{Oacute}{Oacute}
+\fakecscglyph{Ocircumflex}{Ocircumflex}
+\fakecscglyph{Odieresis}{Odieresis}
+\fakecscglyph{Ograve}{Ograve}
+\fakecscglyph{Ohungarumlaut}{Ohungarumlaut}
+\fakecscglyph{Otilde}{Otilde}
+\fakecscglyph{Racute}{Racute}
+\fakecscglyph{Rcaron}{Rcaron}
+\fakecscglyph{Sacute}{Sacute}
+\fakecscglyph{Scaron}{Scaron}
+\fakecscglyph{Scedilla}{Scedilla}
+\fakecscglyph{Tcaron}{Tcaron}
+\fakecscglyph{Tcedilla}{Tcedilla}
+\fakecscglyph{Uacute}{Uacute}
+\fakecscglyph{Ucircumflex}{Ucircumflex}
+\fakecscglyph{Udieresis}{Udieresis}
+\fakecscglyph{Ugrave}{Ugrave}
+\fakecscglyph{Uhungarumlaut}{Uhungarumlaut}
+\fakecscglyph{Uring}{Uring}
+\fakecscglyph{Yacute}{Yacute}
+\fakecscglyph{Ydieresis}{Ydieresis}
+\fakecscglyph{Zacute}{Zacute}
+\fakecscglyph{Zcaron}{Zcaron}
+\fakecscglyph{Zdotaccent}{Zdotaccent}
+
+
+\begincomment
+\section{Shrunk accents}
+\endcomment
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+\begincomment\medskip
+A \textbf{Shrunk accent} is a \textbf{Small glyph} whose vertical
+position has been adjusted so that the
+$\TypesetIntegerExpression{\int{xheight}}$ position of the original
+accent coincides with that of the shrunk accent. Without this
+adjustment, it would instead be the baselines that would coincide,
+but such an accent would be too low. The exact meaning of
+``\textbf{Shrunk accent} `\#1'\,'' is
+\begin{quotation}\cscaccent{\macroparameter{1}}\end{quotation}
+
+\resetcommand\cscaccent#1{%
+ \Bheading{Shrunk accent} `\TypesetStringExpression{#1}'%
+}
+\endcomment
+
+
+\setglyph{Acutesmall}
+ \cscaccent{Acute}
+\endsetglyph
+
+\setglyph{Gravesmall}
+ \cscaccent{Grave}
+\endsetglyph
+
+\setglyph{Circumflexsmall}
+ \cscaccent{Circumflex}
+\endsetglyph
+
+\setglyph{Tildesmall}
+ \cscaccent{Tilde}
+\endsetglyph
+
+\setglyph{Dieresissmall}
+ \cscaccent{Dieresis}
+\endsetglyph
+
+\setglyph{Brevesmall}
+ \cscaccent{Breve}
+\endsetglyph
+
+\setglyph{Dotaccentsmall}
+ \cscaccent{Dotaccent}
+\endsetglyph
+
+\setglyph{Caronsmall}
+ \cscaccent{Caron}
+\endsetglyph
+
+\setglyph{Hungarumlautsmall}
+ \cscaccent{Hungarumlaut}
+\endsetglyph
+
+\setglyph{Ringsmall}
+ \cscaccent{Ring}
+\endsetglyph
+
+\setglyph{Macronsmall}
+ \cscaccent{Macron}
+\endsetglyph
+
+\setglyph{Cedillasmall}
+ \cscglyph{Cedilla}
+\endsetglyph
+
+\setglyph{Ogoneksmall}
+ \cscglyph{Ogonek}
+\endsetglyph
+
+
+
+\endmetrics
+
+\section{Notes}
+
+An important, but rather obscure, difference between what is done by
+this file and what is done by the old \texttt{latin.mtx} concerns the
+manner in which the letters are spaced. In this file, spacing of
+smallcaps is consistently done using the \IEint{smallcapsextraspace}
+parameter, but \texttt{latin.mtx} only uses this mechanism in
+monowidth fonts. For proportional fonts, the default was instead to
+use the \IEint{letterspacing} parameter to space the entire
+font---the same amount for non-faked as for faked letters.
+
+
+\section{Changes}
+
+1999/10/25: Added \verb|\setglyphs| for \texttt{Macronsmall} and
+\texttt{macronsmall}. (LH)
+
+1999/10/25: Simplified definition of \verb|\unfakable|. (UV\&LH)
+Rationale: It is thoroughly confusing if the size of the black box
+created by \verb|\unfakable| depends on the metrics of an unencoded
+glyph that isn't accessible and therefore unavailable for all pratical
+purposes.
+
+2000/10/20: File split off from \texttt{latin.mtx}.
+
+2003/01/02--05: File heavily reorganised. (LH)
+
+2005/04/15: Removed section on \emph{Miscellaneous glyphs}, since
+that should be handled by \texttt{lsmisc.mtx}, and moreover prevented
+the code there from working correctly. (LH) Thanks to Michael Zedler
+for drawing my attention to this error.
+
+
+\end{document}
+
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/lsmisc.mtx b/fonts/utilities/fontinst/inputs/latinmtx/lsmisc.mtx
new file mode 100644
index 0000000000..d30ac97cfb
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/lsmisc.mtx
@@ -0,0 +1,194 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.923",
+%%% date = "2003-03-29",
+%%% time = "16:18:07 +01:00",
+%%% filename = "lsmisc.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It sets some miscellaneous
+%%% glyphs in latin smallcaps.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\title{Smallcaps miscellanea}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{5 January 2003\\Version 1.923}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file sets some miscellaneous smallcaps glyphs, most of which
+serve mainly to complete some family of glyphs whose names are built
+according to some simple pattern. It should work just as well will
+real smallcaps as with faked smallcaps.
+
+\metrics
+
+\needsfontinstversion{1.917}
+
+\ProvidesMtxPackage{lsmisc}
+
+\begincomment
+\section{Miscellaneous smallcaps}
+
+\subsection{Some glyph aliases}
+
+The next few glyphs are usually available (if any smallcaps glyphs are),
+but may come under a name different from that which ETX files expect.
+\endcomment
+
+\ifisglyph{Ismall}\then
+ \setglyph{dotlessIsmall}
+ \glyph{Ismall}{1000}
+ \setleftrightkerning{dotlessIsmall}{Ismall}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{Jsmall}\then
+ \setglyph{dotlessJsmall}
+ \glyph{Jsmall}{1000}
+ \setleftrightkerning{dotlessJsmall}{Jsmall}{1000}
+ \endsetglyph
+\Fi
+
+
+\begincomment
+\subsection{Smallcap ligatures}
+
+Smallcap letters usually do not form ligatures, but many font encodings
+nonetheless reserve slots for them, and in particular many ETX files
+will try to put smallcap ligatures in the ligature slots. Hence there
+is some point in making these glyphs, even though they are only what
+one would get if there was no ligature.
+
+\medskip
+\endcomment
+
+\setint{smallcapsspacing}{0}
+\comment{In case some letterspacing will be applied to the smallcaps,
+ then that amount should also be added between the glyphs below.
+ In most cases however, such spacing should already have been
+ included in the base glyphs, and in that case, $0$ is the correct
+ value.}
+
+\ifisglyph{Fsmall}\then
+
+\setglyph{FFsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Fsmall}}{\int{smallcapsspacing}}}
+ \glyph{Fsmall}{1000}
+\endsetglyph
+\setrightkerning{FFsmall}{Fsmall}{1000}
+
+\ifisglyph{Ismall}\then
+ \setglyph{FIsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}{\int{smallcapsspacing}}}
+ \glyph{Ismall}{1000}
+ \endsetglyph
+
+% \setleftkerning{FIsmall}{Fsmall}{1000}
+ \setrightkerning{FIsmall}{Ismall}{1000}
+
+ \setglyph{FFIsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}{\int{smallcapsspacing}}}
+ \glyph{Ismall}{1000}
+ \endsetglyph
+
+% \setleftkerning{FFIsmall}{Fsmall}{1000}
+ \setrightkerning{FFIsmall}{Ismall}{1000}
+\Fi
+
+\ifisglyph{Lsmall}\then
+ \setglyph{FLsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}{\int{smallcapsspacing}}}
+ \glyph{Lsmall}{1000}
+ \endsetglyph
+
+% \setleftkerning{FLsmall}{Fsmall}{1000}
+ \setrightkerning{FLsmall}{Lsmall}{1000}
+
+ \setglyph{FFLsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}{\int{smallcapsspacing}}}
+ \glyph{Lsmall}{1000}
+ \endsetglyph
+
+% \setleftkerning{FFLsmall}{Fsmall}{1000}
+ \setrightkerning{FFLsmall}{Lsmall}{1000}
+\Fi
+\Fi % ifisglyph{Fsmall}
+
+
+\ifareglyphs{Ismall,Jsmall}\then
+ \setglyph{IJsmall}
+ \glyph{Ismall}{1000}
+ \movert{\add{\kerning{Ismall}{Jsmall}}{\int{smallcapsspacing}}}
+ \glyph{Jsmall}{1000}
+ \endsetglyph
+% \setleftkerning{IJsmall}{Ismall}{1000}
+ \setrightkerning{IJsmall}{Jsmall}{1000}
+\Fi
+
+\comment{That the above glyphs only kern on the right is deliberate.
+ Since they are only put in a horizontal list due to a ligature,
+ they will never occur as the right party when kerning is considered.
+ Not having any kerns on the left simplifies reusing ligature slots
+ as right boundary characters. \texttt{SSsmall} is however a
+ different matter, since that is (in a sense, and probably only if
+ some German spelling reforms are ignored) a proper letter.}
+
+\ifisglyph{Ssmall}\then
+ \setglyph{SSsmall}
+ \glyph{Ssmall}{1000}
+ \movert{\add{\kerning{Ssmall}{Ssmall}}{\int{smallcapsspacing}}}
+ \glyph{Ssmall}{1000}
+ \endsetglyph
+ \setleftrightkerning{SSsmall}{Ssmall}{1000}
+\Fi
+
+
+
+\endmetrics
+
+
+\section{Changes}
+
+This file was part of \texttt{latin.mtx} until 2000/10/20. Its was set
+up as a separate file 2003/01/02--05. (LH)
+
+\end{document}
+
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/ltcmds.mtx b/fonts/utilities/fontinst/inputs/latinmtx/ltcmds.mtx
new file mode 100644
index 0000000000..6e9f1455ba
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/ltcmds.mtx
@@ -0,0 +1,305 @@
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth",
+%%% version = "1.915",
+%%% date = "2003-03-29",
+%%% time = "16:07:18 +01:00",
+%%% filename = "ltcmds.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It provides the defaults
+%%% used to install the Latin glyphs.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\title{The file \texttt{ltcmds.mtx}}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{20 October 2000\\Version 1.915}
+
+\showbranches
+
+\begin{document}
+\maketitle
+
+\metrics
+
+\needsfontinstversion{1.917}
+\ProvidesMtxPackage{ltcmds}
+
+\begincomment
+\section{Some commands for making latin glyphs}
+
+\endcomment
+
+% \unfakable is a glyph which can't be faked.
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{\int{xheight}}{\int{xheight}}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+\begincomment\medskip
+An \textbf{Unfakable} is a glyph which can't be faked. An
+``\textbf{Unfakable `\#1'}\,'' is equivalent to
+\begin{quotation}\unfakable{\macroparameter{1}}\end{quotation}
+
+\resetcommand\unfakable#1{%
+ \Aheading{Unfakable `\TypesetStringExpression{#1}'}%
+}
+\endcomment
+
+
+\setcommand\topaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{#1}}{\int{xheight}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\half{\width{#2}}}}
+ {\scale{\sub{\height{#1}}{\int{xheight}}}{\int{italicslant}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+\begincomment\medskip
+A \textbf{Top accent} is built by placing the center of the accent at
+the given position along the width of the letter, raised up by the
+difference between the height of the letter and the xheight. This is
+the algorithm used by the \TeX\ \verb|\accent| primitive.
+A ``\textbf{Top accent} `\#1' with `\#2' at \#3'' is equivalent to
+\begin{quotation}
+ \topaccent{\macroparameter{1}}{\macroparameter{2}}{\macroparameter{3}}
+\end{quotation}
+\resetcommand\topaccent#1#2#3{%
+ \Bheading{Top accent} `\TypesetStringExpression{#1}' with
+ `\TypesetStringExpression{#2}' at $\TypesetIntegerExpression{#3}$%
+}
+\endcomment
+
+
+\setcommand\topaccentas#1#2#3#4{
+ \push
+ \moveup{\sub{\height{#4}}{\height{#2}}}
+ \movert{\add{
+ \sub{\scale{\width{#1}}{#3}}{\half{\width{#2}}}
+ }{
+ \scale{\sub{\height{#4}}{\height{#2}}}{\int{italicslant}}
+ }}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+\begincomment\medskip
+A \textbf{Top accent \dots\ as} is built by placing the center of the
+accent at the given position along the width of the letter, raised up
+by the difference between the height of the accent and the height of
+the model glyph. A ``\textbf{Top accent} `\#1' with `\#2' at \#3 as
+\#4'' is equivalent to
+\begin{quotation}
+ \topaccentas{\macroparameter{1}}{\macroparameter{2}}
+ {\macroparameter{3}}{\macroparameter{4}}
+\end{quotation}
+\resetcommand\topaccentas#1#2#3#4{%
+ \Bheading{Top accent} `\TypesetStringExpression{#1}' with
+ `\TypesetStringExpression{#2}' at $\TypesetIntegerExpression{#3}$
+ as `\TypesetStringExpression{#4}'%
+}
+\endcomment
+
+
+\setcommand\botaccent#1#2#3{
+ \push
+ \movert{\sub{\scale{\width{#1}}{#3}}{\half{\width{#2}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+\begincomment\medskip
+A \textbf{Bottom accent} is built by placing the center of the accent at
+the given position along the width of the letter. A ``\textbf{Bottom
+accent} `\#1' with `\#2' at \#3'' is equivalent to
+\begin{quotation}
+ \botaccent{\macroparameter{1}}{\macroparameter{2}}{\macroparameter{3}}
+\end{quotation}
+\resetcommand\botaccent#1#2#3{%
+ \Bheading{Bottom accent} `\TypesetStringExpression{#1}' with
+ `\TypesetStringExpression{#2}' at $\TypesetIntegerExpression{#3}$%
+}
+\endcomment
+
+
+\setcommand\unfakabletopaccent#1{
+ \setglyph{#1}
+ \moveup{\add{\int{xheight}}{50}}
+ \glyphrule{\half{\int{xheight}}}{\half{\int{xheight}}}
+ \glyphwarning{missing glyph `#1'}
+ \moveup{\neg{\add{\int{xheight}}{50}}}
+ \endsetglyph
+}
+\begincomment\medskip
+An \textbf{Unfakable top accent} is the same as an
+\textbf{Unfakable}, except that the rule is smaller and has a more
+accent-like position. An ``\textbf{Unfakable top accent `\#1'}\,''
+is equivalent to
+\begin{quotation}\unfakabletopaccent{\macroparameter{1}}\end{quotation}
+
+\resetcommand\unfakabletopaccent#1{%
+ \Aheading{Unfakable top accent `\TypesetStringExpression{#1}'}%
+}
+\endcomment
+
+
+
+% A c&sc top accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\csctopaccent#1#2#3{
+% \ifareglyphs{#1small,#2small}\then
+% \topaccent{#1small}{#2small}{#3}
+% \Else
+ \cscglyph{#1#2}
+% \Fi
+}
+
+% A c&sc bot accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\cscbotaccent#1#2#3{
+% \ifisglyph{#1small}\then
+% \botaccent{#1small}{#2small}{#3}
+% \Else
+ \cscglyph{#1#2}
+% \Fi
+}
+
+% A c&sc accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\ifisglyph{A}\then
+ \setint{capheight}{\height{A}}
+ \comment{\texttt{t1.etx} has traditionally measured the capheight
+ on \texttt{X}, whereas \texttt{latin.mtx} measured it on
+ \texttt{A}. There is probably no good reason for this
+ difference.}
+\Else\ifisglyph{X}\then
+ \setint{capheight}{\height{X}}
+\Else
+ \setint{capheight}{750}
+\Fi\Fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\Else
+ \setint{ascender}{\int{capheight}}
+\Fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+\Else\ifisglyph{g}\then
+ \setint{descender}{\depth{g}}
+ \comment{Similarly, \texttt{t1.etx} has traditionally measured
+ the descender depth on \texttt{p}, whereas \texttt{latin.mtx}
+ measured it on \texttt{g}.}
+\Else\ifisglyph{p}\then
+ \setint{descender}{\depth{p}}
+\Else
+ \setint{descender}{250}
+\Fi\Fi\Fi
+
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+
+
+\ifisglyph{parenleft}\then
+ \setint{vaxis}{\half{\sub{\height{parenleft}}{\depth{parenleft}}}}
+\Else
+ \setint{vaxis}{\half{\int{xheight}}}
+\Fi
+
+
+\endmetrics
+
+
+
+
+
+\section{Changes}
+
+1999/10/25: Added \verb|\setglyphs| for \texttt{Macronsmall} and
+\texttt{macronsmall}. (LH)
+
+1999/10/25: Simplified definition of \verb|\unfakable|. (UV\&LH)
+Rationale: It is thoroughly confusing if the size of the black box
+created by \verb|\unfakable| depends on the metrics of an unencoded
+glyph that isn't accessible and therefore unavailable for all pratical
+purposes.
+
+2000/10/20--2003/03/15: File split off from \texttt{latin.mtx} and
+reorganised into a separate package. (LH) (It took until the last of
+these dates before all the useless code had been removed.) Also made
+special typeset definitions of many commands and modernized the
+conditionals.
+
+2003/03/15: Made the \verb|\unfakable| a square with side
+$\TypesetIntegerExpression{\int{xheight}}$ and added the
+\verb|\unfakabletopaccent| command. (LH) Rationale: That the glyph is
+unavailable doesn't mean the rule replacing it has to look bad. This
+should make them blend in better with any glyphs that are actually
+available.
+
+2003/03/15: Added \verb|\topaccentas|. (LH) It is based on a command
+|\idotaccent| defined by Walter Schmidt.
+
+2003/03/15: Added calculation of a vertical symmetry axis position
+$\TypesetIntegerExpression{\int{vaxis}}$. (LH) It is based on some
+code by Walter Schmidt.
+
+2004/08/07: Fixed typo in vertical symmetry axis code. (LH)
+
+2005/05/21: Moved default for
+$\TypesetIntegerExpression{\int{capspacing}}$ to \texttt{lubuild.mtx},
+which is where it is used. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/ltpunct.mtx b/fonts/utilities/fontinst/inputs/latinmtx/ltpunct.mtx
new file mode 100644
index 0000000000..223b2005f4
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/ltpunct.mtx
@@ -0,0 +1,247 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.923",
+%%% date = "2003-03-29",
+%%% time = "16:25:58 +01:00",
+%%% filename = "ltpunct.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with
+%%% the fontinst utility. It deals with the
+%%% punctuation characters needed for the most
+%%% common latin font encodings.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\title{Latin punctuation}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{7 January 2003\\Version 1.923}
+
+\begin{document}
+\maketitle
+
+
+\metrics
+
+\needsfontinstversion{1.902}
+\usemtxpackage{ltcmds}
+\ProvidesMtxPackage{ltpunct}
+
+\begincomment
+\section{Punctuation}
+
+\subsection{Unfakable characters}
+\endcomment
+
+\unfakable{ampersand}
+\unfakable{asciicircum}
+\unfakable{asciitilde}
+\unfakable{asterisk}
+\unfakable{at}
+\unfakable{backslash}
+\unfakable{bar}
+\unfakable{braceleft}
+\unfakable{braceright}
+\unfakable{bracketleft}
+\unfakable{bracketright}
+\unfakable{colon}
+\unfakable{comma}
+\unfakable{dollar}
+\unfakable{emdash}
+\unfakable{endash}
+\unfakable{equal}
+\unfakable{exclamdown}
+\unfakable{exclam}
+\unfakable{greater}
+\unfakable{guillemotleft}
+\unfakable{guillemotright}
+\unfakable{guilsinglleft}
+\unfakable{guilsinglright}
+\unfakable{hyphen}
+\unfakable{less}
+\unfakable{numbersign}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{percent}
+\unfakable{period}
+\unfakable{perthousandzero}
+\unfakable{plus}
+\unfakable{questiondown}
+\unfakable{question}
+\unfakable{quotedblbase}
+\unfakable{quotedblleft}
+\unfakable{quotedblright}
+\unfakable{quotedbl}
+\unfakable{quoteleft}
+\unfakable{quoteright}
+\unfakable{section}
+\unfakable{semicolon}
+\unfakable{slash}
+\unfakable{sterling}
+\unfakable{underscore}
+
+\begincomment
+\subsection{Fakable characters}
+\endcomment
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \Else\ifisglyph{i}\then
+ \movert{\width{i}}
+ \Else
+ \movert{333}
+ \Fi\Fi
+\endsetglyph
+
+\setglyph{compwordmark}
+ \glyphrule{0}{\int{xheight}}
+\endsetglyph
+\setint{compwordmark-spacing}{0}
+
+\setglyph{quotesinglbase}
+ \glyph{comma}{1000}
+\endsetglyph
+
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+\setleftrightkerning{visiblespace}{space}{1000}
+\comment{The matter of whether a \texttt{visiblespace} should kern
+ like a \texttt{space} has never been satisfactory resolved.}
+
+
+
+\begincomment
+\subsection{Some special dashes}
+
+\texttt{rangedash} and \texttt{punctdash} are mostly two traditional
+aliases for \texttt{endash} and \texttt{emdash}. The problem with the
+latter two ``original'' glyphs is that they in monowidth fonts
+usually are much shorter than one would expect, whereas the hyphen
+combinations look quite good.
+\endcomment
+
+\setglyph{rangedash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \Else
+ \glyph{endash}{1000}
+ \Fi
+\endsetglyph
+
+\setglyph{punctdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \Else
+ \glyph{emdash}{1000}
+ \Fi
+\endsetglyph
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+ \resetwidth{\half{\width{hyphen}}}
+ \comment{Unlike the normal \texttt{hyphen}, this glyph is only
+ meant to be used at the right end of a line of text. This means
+ it can be a ``hanging hyphen'' which significantly extends
+ outside the character box.}
+ \setleftkerning{hyphenchar}{hyphen}{1000}
+ \comment{\TeX\ does consider kerning (and ligatures) between a
+ hyphenchar and what preceeds it on the line, but there is
+ nothing after the hyphenchar.}
+\endsetglyph
+
+
+\begincomment
+\subsection{More monowidth specialities}
+\endcomment
+
+% only with monospaced fonts. (WaS)
+\ifisint{monowidth}\then
+ \resetglyph{asterisk}
+ \moveup{\sub{\int{vaxis}}{\half{\sub{\height{asterisk}}{\depth{asterisk}}}}}
+ \glyph{asterisk}{1000}
+ \resetdepth{0}
+ \endresetglyph
+\Fi
+
+
+
+\begincomment
+\section{Digits}
+
+The traditional coding here has been that all digits are considered to
+be unfakable. An obvious alternative is however to fake
+\texttt{zerooldstyle} with \texttt{zero}, \texttt{oneoldstyle} with
+\texttt{one}, etc., or vice versa.
+\endcomment
+
+
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+
+\unfakable{zerooldstyle}
+\unfakable{oneoldstyle}
+\unfakable{twooldstyle}
+\unfakable{threeoldstyle}
+\unfakable{fouroldstyle}
+\unfakable{fiveoldstyle}
+\unfakable{sixoldstyle}
+\unfakable{sevenoldstyle}
+\unfakable{eightoldstyle}
+\unfakable{nineoldstyle}
+
+
+
+\endmetrics
+
+
+\section{Changes}
+
+The original version of this file was created in February 2003,
+although it is based on code from the traditional \texttt{latin.mtx}.
+The changes that have been made after that are as follows.
+
+2003/03/15: The asterisk in monowidth fonts is vertically centered,
+to make it more useful for computer listings. Suggested by Walter
+Schmidt.
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/lubuild.mtx b/fonts/utilities/fontinst/inputs/latinmtx/lubuild.mtx
new file mode 100644
index 0000000000..c9603104bb
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/lubuild.mtx
@@ -0,0 +1,656 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.923",
+%%% date = "2003-03-29",
+%%% time = "16:12:42 +01:00",
+%%% filename = "lubuild.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It builds upper case latin
+%%% letters.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2002/03/01]
+\showbranches
+
+\title{Building upper case}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{4 January 2002\\Version 1.923}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This file builds upper case (full capitals, \texttt{u} case) latin
+letters, or more precisely, it makes sure that a set of glyphs is
+defined that cover the upper case letters used in European latin scripts.
+Even that is a slight exaggeration, because there are a couple of
+``exotic'' letters that are missing, but most people never try to use
+those anyway.
+
+For the glyphs set in this file to look anything like the letters they
+are supposed to be, it is necessary that the glyphs for unaccented
+letters and for accents already exist and look like they are supposed
+to. In that case, the commands below will manufacture decent
+substitutes for the missing glyphs by composing letters and accents.
+If some of these base glyphs are missing, then a ``missing glyph''
+substitute will be supplied for them. Such substitutes will show up in
+print as black squares, and most DVI drivers will emit a warning when
+producing them.
+
+The most common case encountered is that almost all unaccented letters
+and accents are available, but only about half of the accented
+letters. Then for the other half, quite decent substitutes are made,
+but a few letters only show up as ``missing glyph'' boxes.
+
+
+\metrics
+
+\needsfontinstversion{1.910}
+\usemtxpackage{ltcmds}
+
+\ProvidesMtxPackage{lubuild}
+
+\begincomment
+\section{Base upper case glyphs}
+
+The following commands make sure all the unaccented letter glyphs and
+accent glyphs are set. If any of them are not already set at this
+point, then those will be set to ``missing glyph'' boxes.
+
+\subsection{Letters}
+\endcomment
+
+\unfakable{A}
+\unfakable{AE}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{Eng}
+\unfakable{Eth}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{OE}
+\unfakable{Oslash}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{Thorn}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+
+\begincomment
+\subsection{Accents}
+
+The accents on designed full capitals are often different from the
+accents on lower case letters: strokes are generally at a smaller
+angle to the horizontal, so that the accent is compressed in the
+vertical direction. Most fonts do not provide those accents as
+separate characters, but one should nonetheless try to use them
+whenever possible. The standard names appear (see for example the
+\emph{Adobe Glyph List}) to be the same as for the
+normal accents, but with the first letter in upper case.
+When these accents are not available, it is anyway
+possible to make do with the ordinary accents.
+\endcomment
+
+
+\unfakabletopaccent{grave}
+\unfakabletopaccent{acute}
+\unfakabletopaccent{circumflex}
+\unfakabletopaccent{tilde}
+\unfakabletopaccent{dieresis}
+\unfakabletopaccent{hungarumlaut}
+\unfakabletopaccent{ring}
+\unfakabletopaccent{caron}
+\unfakabletopaccent{breve}
+\unfakabletopaccent{macron}
+\unfakabletopaccent{dotaccent}
+\unfakable{cedilla}
+\unfakable{ogonek}
+\unfakable{quoteright}
+\unfakable{lslashslash}
+
+
+\setglyph{Acute}
+ \glyph{acute}{1000}
+\endsetglyph
+
+\setglyph{Grave}
+ \glyph{grave}{1000}
+\endsetglyph
+
+\setglyph{Circumflex}
+ \glyph{circumflex}{1000}
+\endsetglyph
+
+\setglyph{Tilde}
+ \glyph{tilde}{1000}
+\endsetglyph
+
+\setglyph{Dieresis}
+ \glyph{dieresis}{1000}
+\endsetglyph
+
+\setglyph{Breve}
+ \glyph{breve}{1000}
+\endsetglyph
+
+\setglyph{Dotaccent}
+ \glyph{dotaccent}{1000}
+\endsetglyph
+
+\setglyph{Caron}
+ \glyph{caron}{1000}
+\endsetglyph
+
+\setglyph{Hungarumlaut}
+ \glyph{hungarumlaut}{1000}
+\endsetglyph
+
+\setglyph{Ring}
+ \glyph{ring}{1000}
+\endsetglyph
+
+\setglyph{Macron}
+ \glyph{macron}{1000}
+\endsetglyph
+
+\setglyph{Cedilla}
+ \glyph{cedilla}{1000}
+\endsetglyph
+
+\setglyph{Ogonek}
+ \glyph{ogonek}{1000}
+\endsetglyph
+
+\begincomment
+Note that the \TeX\ accenting algorithm assumes that accents are
+positioned correctly for being placed on a letter whose height is the
+x-height. It might happen that a font with special upper case accents,
+made for use with some other typesetting engine, instead has these
+glyphs positioned correctly for being placed on a capital. In such a
+case, one would first have to adjust the accent positions before they
+can be used.
+\endcomment
+
+
+\begincomment
+\section{Building accented letters}
+\endcomment
+
+
+\setglyph{Aacute}
+ \topaccent{A}{Acute}{500}
+\endsetglyph
+
+\setglyph{Abreve}
+ \topaccent{A}{Breve}{500}
+\endsetglyph
+
+\setglyph{Acircumflex}
+ \topaccent{A}{Circumflex}{500}
+\endsetglyph
+
+\setglyph{Adieresis}
+ \topaccent{A}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Agrave}
+ \topaccent{A}{Grave}{500}
+\endsetglyph
+
+\setglyph{Aogonek}
+ \botaccent{A}{Ogonek}{900}
+\endsetglyph
+
+\setglyph{Aring}
+ \topaccent{A}{Ring}{500}
+\endsetglyph
+
+\setglyph{Atilde}
+ \topaccent{A}{Tilde}{500}
+\endsetglyph
+
+\setglyph{Cacute}
+ \topaccent{C}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ccaron}
+ \topaccent{C}{Caron}{500}
+\endsetglyph
+
+\setglyph{Ccedilla}
+ \botaccent{C}{Cedilla}{500}
+\endsetglyph
+
+\setglyph{Dcaron}
+ \topaccent{D}{Caron}{450}
+\endsetglyph
+
+\setglyph{Eacute}
+ \topaccent{E}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ecaron}
+ \topaccent{E}{Caron}{500}
+\endsetglyph
+
+\setglyph{Ecircumflex}
+ \topaccent{E}{Circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresis}
+ \topaccent{E}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Egrave}
+ \topaccent{E}{Grave}{500}
+\endsetglyph
+
+\setglyph{Eogonek}
+ \botaccent{E}{Ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbreve}
+ \topaccent{G}{Breve}{500}
+\endsetglyph
+
+\setglyph{Iacute}
+ \topaccent{I}{Acute}{500}
+\endsetglyph
+
+\setglyph{Icircumflex}
+ \topaccent{I}{Circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresis}
+ \topaccent{I}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Idotaccent}
+ \topaccent{I}{Dotaccent}{500}
+\endsetglyph
+
+\setglyph{Igrave}
+ \topaccent{I}{Grave}{500}
+\endsetglyph
+
+\setglyph{Lacute}
+ \topaccent{L}{Acute}{250}
+\endsetglyph
+
+\setglyph{Lcaron}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\Else
+ \movert{-200}
+ \Fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{Nacute}
+ \topaccent{N}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ncaron}
+ \topaccent{N}{Caron}{500}
+\endsetglyph
+
+\setglyph{Ntilde}
+ \topaccent{N}{Tilde}{500}
+\endsetglyph
+
+\setglyph{Oacute}
+ \topaccent{O}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflex}
+ \topaccent{O}{Circumflex}{500}
+\endsetglyph
+
+\setglyph{Odieresis}
+ \topaccent{O}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Ograve}
+ \topaccent{O}{Grave}{500}
+\endsetglyph
+
+\setglyph{Ohungarumlaut}
+ \topaccent{O}{Hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Otilde}
+ \topaccent{O}{Tilde}{500}
+\endsetglyph
+
+\setglyph{Racute}
+ \topaccent{R}{Acute}{500}
+\endsetglyph
+
+\setglyph{Rcaron}
+ \topaccent{R}{Caron}{500}
+\endsetglyph
+
+\setglyph{Sacute}
+ \topaccent{S}{Acute}{500}
+\endsetglyph
+
+\setglyph{Scaron}
+ \topaccent{S}{Caron}{500}
+\endsetglyph
+
+\setglyph{Scedilla}
+ \botaccent{S}{Cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaron}
+ \topaccent{T}{Caron}{500}
+\endsetglyph
+
+\setglyph{Tcedilla}
+ \botaccent{T}{Cedilla}{500}
+\endsetglyph
+
+\setglyph{Uacute}
+ \topaccent{U}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflex}
+ \topaccent{U}{Circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresis}
+ \topaccent{U}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugrave}
+ \topaccent{U}{Grave}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlaut}
+ \topaccent{U}{Hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uring}
+ \topaccent{U}{Ring}{500}
+\endsetglyph
+
+\setglyph{Yacute}
+ \topaccent{Y}{Acute}{500}
+\endsetglyph
+
+\setglyph{Ydieresis}
+ \topaccent{Y}{Dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacute}
+ \topaccent{Z}{Acute}{500}
+\endsetglyph
+
+\setglyph{Zcaron}
+ \topaccent{Z}{Caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccent}
+ \topaccent{Z}{Dotaccent}{500}
+\endsetglyph
+
+
+\begincomment
+\section{Other glyphs that can be built}
+\endcomment
+
+\setglyph{Lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{L}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Ng}
+ \glyph{Eng}{1000}
+ \comment{This is simply an alias.}
+\endsetglyph
+
+\setglyph{dotlessI}
+ \glyph{I}{1000}
+ \comment{This simplifies making all-caps fonts.}
+\endsetglyph
+
+\setglyph{dotlessJ}
+ \glyph{J}{1000}
+ \comment{This simplifies making all-caps fonts.}
+\endsetglyph
+
+
+\setglyph{IJ}
+ \glyph{I}{1000}
+ \movert{\kerning{I}{J}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{SS}
+ \glyph{S}{1000}
+ \movert{\kerning{S}{S}}
+ \glyph{S}{1000}
+\endsetglyph
+
+
+\begincomment
+\subsection{All-caps spaced digraphs}
+
+These glyphs are combinations of upper case letters in which the
+distances between them have been increased by
+$\TypesetIntegerExpression{\int{capspacing}}$. These are intended for
+use in all-caps fonts that are made with a nonzero
+$\TypesetIntegerExpression{\int{letterspacing}}$ equal to the
+$\TypesetIntegerExpression{\int{capspacing}}$.
+\endcomment
+
+\ifisint{letterspacing}\then
+ \setint{capspacing}{\int{letterspacing}}
+\Else
+ \setint{capspacing}{0}
+\Fi
+
+
+\setglyph{FFspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{F}}{\int{capspacing}}}
+ \glyph{F}{1000}
+\endsetglyph
+\setleftrightkerning{FFspaced}{F}{1000}
+\setleftrightkerning{Dbar}{Eth}{1000}
+
+
+\setglyph{FIspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{I}}{\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+\setleftkerning{FIspaced}{F}{1000}
+\setrightkerning{FIspaced}{I}{1000}
+
+\setglyph{FLspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{L}}{\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+\setleftkerning{FLspaced}{F}{1000}
+\setrightkerning{FLspaced}{L}{1000}
+
+\setglyph{FFIspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{I}}{\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+\setleftkerning{FFIspaced}{F}{1000}
+\setrightkerning{FFIspaced}{I}{1000}
+
+\setglyph{FFLspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{L}}{\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+\setleftkerning{FFLspaced}{F}{1000}
+\setrightkerning{FFLspaced}{L}{1000}
+
+\setglyph{IJspaced}
+ \glyph{I}{1000}
+ \movert{\add{\kerning{I}{J}}{\int{capspacing}}}
+ \glyph{J}{1000}
+\endsetglyph
+\setleftkerning{IJspaced}{I}{1000}
+\setrightkerning{IJspaced}{J}{1000}
+
+\setglyph{SSspaced}
+ \glyph{S}{1000}
+ \movert{\add{\kerning{S}{S}}{\int{capspacing}}}
+ \glyph{S}{1000}
+\endsetglyph
+\setleftrightkerning{SSspaced}{S}{1000}
+
+
+
+
+\begincomment
+\section{All-caps kerning}
+\endcomment
+
+\setleftrightkerning{dotlessI}{I}{1000}
+\setleftrightkerning{dotlessJ}{J}{1000}
+
+
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Abreve}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aogonek}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+
+\setleftrightkerning{Cacute}{C}{1000}
+\setleftrightkerning{Ccaron}{C}{1000}
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Dcaron}{D}{1000}
+
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecaron}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eogonek}{E}{1000}
+
+\setleftrightkerning{Gbreve}{G}{1000}
+
+\setleftkerning{IJ}{I}{1000}
+
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+\setleftrightkerning{Idotaccent}{I}{1000}
+\setleftrightkerning{Igrave}{I}{1000}
+
+\setrightkerning{IJ}{J}{1000}
+
+\setleftrightkerning{Lacute}{L}{1000}
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftkerning{Lcaron}{L}{1000}
+
+\setleftrightkerning{Nacute}{N}{1000}
+\setleftrightkerning{Ncaron}{N}{1000}
+\setleftrightkerning{Ntilde}{N}{1000}
+
+\setleftkerning{Ng}{N}{1000}
+\setrightkerning{Ng}{J}{1000}
+
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Ohungarumlaut}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+
+\setleftrightkerning{Rcaron}{R}{1000}
+\setleftrightkerning{Racute}{R}{1000}
+
+\setleftrightkerning{SS}{S}{1000}
+\setleftrightkerning{Sacute}{S}{1000}
+\setleftrightkerning{Scaron}{S}{1000}
+\setleftrightkerning{Scedilla}{S}{1000}
+
+\setleftrightkerning{Tcaron}{T}{1000}
+\setleftrightkerning{Tcedilla}{T}{1000}
+
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Udieresis}{U}{1000}
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uhungarumlaut}{U}{1000}
+\setleftrightkerning{Uring}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+\setleftrightkerning{Zacute}{Z}{1000}
+\setleftrightkerning{Zcaron}{Z}{1000}
+\setleftrightkerning{Zdotaccent}{Z}{1000}
+
+
+
+\endmetrics
+
+
+\section{Changes}
+
+The original version of this file was created in February 2003,
+although it is based on code from the traditional \texttt{latin.mtx}.
+The changes that have been made after that are as follows.
+
+2003/03/15: Using \verb|\unfakabletopaccent| for the accent
+characters. This should change the appearence of accented letters
+built using such a character from ``a black square'' to ``a letter
+with a black square above''. Neither is satisfactory, but the latter
+conveys more information. (LH)
+
+2003/03/29: Added some code (from \texttt{latin.mtx}) for all-caps
+glyphs that had been forgotten. (LH)
+
+2005/05/21: Improved default for
+$\TypesetIntegerExpression{\int{capspacing}}$. (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/newlatin.mtx b/fonts/utilities/fontinst/inputs/latinmtx/newlatin.mtx
new file mode 100644
index 0000000000..083dfe259b
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/newlatin.mtx
@@ -0,0 +1,190 @@
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.924",
+%%% date = "2003-03-29",
+%%% time = "16:28:28 +01:00",
+%%% filename = "newlatin.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It provides the defaults
+%%% used to install the Latin glyphs.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}[2003/02/09]
+\showbranches
+
+\title{The \textsf{fontinst} latin glyphs, modernized}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{16 February 2003}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document lists commands for the \textsf{fontinst} utility that
+will generate the glyphs needed to make a set of latin fonts. The
+intent is that this file should replace the old \texttt{latin.mtx}
+as the generic ``fixer'' for latin fonts---doing a decent job both
+when proper smallcaps is available and when it is not.
+
+Most of the actual commands are however to be found in other files,
+which this file uses. This modular design is meant to simplify tuning
+the process, for example by adjusting the accent positions to better
+suit particular fonts.
+
+
+\metrics
+
+\needsfontinstversion{1.924}
+
+\usemtxpackage{llbuild}
+
+\usemtxpackage{lubuild}
+
+\ifoption{nosc}\then \Else
+
+\usemtxpackage{lsbuild}
+\usemtxpackage{lsfake}
+\usemtxpackage{lsmisc}
+
+\Fi
+
+\usemtxpackage{ltpunct}
+
+\begincomment
+\section{\texttt{OT1} oddities}
+
+One important, although also deprecated, encoding for latin text
+fonts is the \texttt{OT1} encoding. Besides being a text font
+encoding, that makes double service as a math font encoding, and
+this imposes some extra restrictions.
+
+\subsection{Greek capitals}
+\endcomment
+
+\usemtxpackage{ltcmds}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Upsilon}
+\unfakable{Upsilon1}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+
+\begincomment
+\subsection{Math accents}
+
+\TeX's math accent-positioning requires accents to have zero depth.
+\endcomment
+
+\foreach(accent){grave,acute,circumflex,tilde,dieresis,hungarumlaut,%
+ ring,caron,breve,macron,dotaccent}
+ \ifisglyph{\str{accent}}\then
+ \resetglyph{\str{accent}}
+ \glyph{\str{accent}}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \Fi
+\endfor(accent)
+
+% \setcommand\zerodepth#1{
+% \ifisglyph{#1}\then
+% \resetglyph{#1}
+% \glyph{#1}{1000}
+% \resetdepth{0}
+% \endresetglyph
+% \Fi
+% }
+% \zerodepth{grave}
+% \zerodepth{acute}
+% \zerodepth{circumflex}
+% \zerodepth{tilde}
+% \zerodepth{dieresis}
+% \zerodepth{hungarumlaut}
+% \zerodepth{ring}
+% \zerodepth{caron}
+% \zerodepth{breve}
+% \zerodepth{macron}
+% \zerodepth{dotaccent}
+
+
+\begincomment
+\subsection{The ring accent}
+
+The \texttt{OT1} definition of \r{A} (that does not make use of
+\verb|\accent|) assumes that the ring accent glyph has the same width
+as \texttt{A}. Hence this special \texttt{ringfitted} glyph.
+\endcomment
+
+\setglyph{ringfitted}
+ \movert{\half{\sub{\width{A}}{\width{ring}}}}
+ \glyph{ring}{1000}
+ \movert{\otherhalf{\sub{\width{A}}{\width{ring}}}}
+\endsetglyph
+
+
+\begincomment
+\section{\texttt{T1} oddities}
+
+Even the modern \texttt{T1} encoding has some odd traits. The most
+notable is that the guillemet glyphs \texttt{guillemotleft} and
+\texttt{guillemotright} can be formed as ligatures from a pair of
+\texttt{less}s and \texttt{greater}s respectively. Then to get the
+right kerning on the left side of the two former glyphs, the two
+latter must kern like them!
+\endcomment
+
+\setleftkerning{less}{guillemotleft}{1000}
+\setleftkerning{greater}{guillemotright}{1000}
+
+
+\endmetrics
+
+
+\section{Changes}
+
+The original version of this file was created in February 2003,
+although it is based on code from the traditional \texttt{latin.mtx}.
+The changes that have been made after that are listed below, but see
+also the files containing the individual metric packages for any
+changes made to those files.
+
+
+\end{document}
+
+
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2000, 2003 the fontinst maintenance team and
+% any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/resetsc.mtx b/fonts/utilities/fontinst/inputs/latinmtx/resetsc.mtx
new file mode 100644
index 0000000000..445e737525
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/resetsc.mtx
@@ -0,0 +1,166 @@
+% Copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Ulrik Vieth",
+%%% version = "1.927",
+%%% date = "13 April 2004",
+%%% time = "23:01:07 CET",
+%%% filename = "resetsc.mtx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "07130 161 332 5005",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a metrics file, for use with the
+%%% fontinst utility. It recodes glyph names
+%%% for small capitals read from AFM files
+%%% to glyph names with a `small' suffix.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{resetsc.mtx} metrics file}
+\author{Ulrik Vieth}
+\date{16 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{resetsc.mtx} metrics file, which is
+used to recode raw glyph names for small capitals to glyph names with
+a `small' suffix.
+
+\metrics
+
+\setcommand\smallcapsglyph#1#2{
+ \ifisglyph{#2}\then
+ \setglyph{#1}\glyph{#2}{1000}
+ \endsetglyph
+ \fi
+}
+
+\setcommand\smallcapskerning#1#2{
+ \ifisglyph{#2}\then
+ \setleftrightkerning{#1}{#2}{1000}
+ \fi
+}
+
+% Renaming small caps glyphs.
+
+\smallcapsglyph{Asmall}{a}
+\smallcapsglyph{Bsmall}{b}
+\smallcapsglyph{Csmall}{c}
+\smallcapsglyph{Dsmall}{d}
+\smallcapsglyph{Esmall}{e}
+\smallcapsglyph{Fsmall}{f}
+\smallcapsglyph{Gsmall}{g}
+\smallcapsglyph{Hsmall}{h}
+\smallcapsglyph{Ismall}{i}
+\smallcapsglyph{Jsmall}{j}
+\smallcapsglyph{Ksmall}{k}
+\smallcapsglyph{Lsmall}{l}
+\smallcapsglyph{Msmall}{m}
+\smallcapsglyph{Nsmall}{n}
+\smallcapsglyph{Osmall}{o}
+\smallcapsglyph{Psmall}{p}
+\smallcapsglyph{Qsmall}{q}
+\smallcapsglyph{Rsmall}{r}
+\smallcapsglyph{Ssmall}{s}
+\smallcapsglyph{Tsmall}{t}
+\smallcapsglyph{Usmall}{u}
+\smallcapsglyph{Vsmall}{v}
+\smallcapsglyph{Wsmall}{w}
+\smallcapsglyph{Xsmall}{x}
+\smallcapsglyph{Ysmall}{y}
+\smallcapsglyph{Zsmall}{z}
+
+\smallcapsglyph{Lslashsmall}{lslash}
+\smallcapsglyph{Scaronsmall}{scaron}
+\smallcapsglyph{Zcaronsmall}{zcaron}
+
+\smallcapsglyph{Agravesmall}{agrave}
+\smallcapsglyph{Aacutesmall}{aacute}
+\smallcapsglyph{Acircumflexsmall}{acircumflex}
+\smallcapsglyph{Atildesmall}{atilde}
+\smallcapsglyph{Adieresissmall}{adieresis}
+\smallcapsglyph{Aringsmall}{aring}
+\smallcapsglyph{AEsmall}{ae}
+\smallcapsglyph{Ccedillasmall}{ccedilla}
+\smallcapsglyph{Egravesmall}{egrave}
+\smallcapsglyph{Eacutesmall}{eacute}
+\smallcapsglyph{Ecircumflexsmall}{ecircumflex}
+\smallcapsglyph{Edieresissmall}{edieresis}
+\smallcapsglyph{Igravesmall}{igrave}
+\smallcapsglyph{Iacutesmall}{iacute}
+\smallcapsglyph{Icircumflexsmall}{icircumflex}
+\smallcapsglyph{Idieresissmall}{idieresis}
+\smallcapsglyph{Ethsmall}{eth}
+\smallcapsglyph{Ntildesmall}{ntilde}
+\smallcapsglyph{Ogravesmall}{ograve}
+\smallcapsglyph{Oacutesmall}{oacute}
+\smallcapsglyph{Ocircumflexsmall}{ocircumflex}
+\smallcapsglyph{Otildesmall}{otilde}
+\smallcapsglyph{Odieresissmall}{odieresis}
+\smallcapsglyph{OEsmall}{oe}
+\smallcapsglyph{Oslashsmall}{oslash}
+\smallcapsglyph{Ugravesmall}{ugrave}
+\smallcapsglyph{Uacutesmall}{uacute}
+\smallcapsglyph{Ucircumflexsmall}{ucircumflex}
+\smallcapsglyph{Udieresissmall}{udieresis}
+\smallcapsglyph{Yacutesmall}{yacute}
+\smallcapsglyph{Thornsmall}{thorn}
+\smallcapsglyph{Ydieresissmall}{ydieresis}
+
+% Renaming small caps kern pairs.
+
+\smallcapskerning{Asmall}{a}
+\smallcapskerning{Bsmall}{b}
+\smallcapskerning{Csmall}{c}
+\smallcapskerning{Dsmall}{d}
+\smallcapskerning{Esmall}{e}
+\smallcapskerning{Fsmall}{f}
+\smallcapskerning{Gsmall}{g}
+\smallcapskerning{Hsmall}{h}
+\smallcapskerning{Ismall}{i}
+\smallcapskerning{Jsmall}{j}
+\smallcapskerning{Ksmall}{k}
+\smallcapskerning{Lsmall}{l}
+\smallcapskerning{Msmall}{m}
+\smallcapskerning{Nsmall}{n}
+\smallcapskerning{Osmall}{o}
+\smallcapskerning{Psmall}{p}
+\smallcapskerning{Qsmall}{q}
+\smallcapskerning{Rsmall}{r}
+\smallcapskerning{Ssmall}{s}
+\smallcapskerning{Tsmall}{t}
+\smallcapskerning{Usmall}{u}
+\smallcapskerning{Vsmall}{v}
+\smallcapskerning{Wsmall}{w}
+\smallcapskerning{Xsmall}{x}
+\smallcapskerning{Ysmall}{y}
+\smallcapskerning{Zsmall}{z}
+
+\endmetrics
+
+\section{Changes}
+
+2004/04/13: Fixed typo (\texttt{Xsmall} instead of \texttt{Ysmall}).
+(LH)
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/latinmtx/unsetalf.mtx b/fonts/utilities/fontinst/inputs/latinmtx/unsetalf.mtx
new file mode 100644
index 0000000000..cc6b792de0
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/latinmtx/unsetalf.mtx
@@ -0,0 +1,114 @@
+% Copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Ulrik Vieth",
+%%% version = "1.910",
+%%% date = "16 November 1999",
+%%% time = "23:02:32 CET",
+%%% filename = "unsetalf.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "64950 114 264 2737",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a metrics file, for use with the
+%%% fontinst utility. It makes glyph names
+%%% for alphabetic glyphs undefined.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{unsetalf.mtx} metrics file}
+\author{Ulrik Vieth}
+\date{16 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{unsetalf.mtx} metrics file, which is
+used to make glyph names for alphabetic glyphs undefined.
+
+\metrics
+
+\unsetint{xheight}
+\unsetint{ascender}
+\unsetint{descender}
+\unsetint{capheight}
+\unsetint{italicslant}
+
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\unsetglyph{dotlessi}
+\unsetglyph{dotlessj}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/euex.etx b/fonts/utilities/fontinst/inputs/mathetx/euex.etx
new file mode 100644
index 0000000000..1d33e7ac4b
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/euex.etx
@@ -0,0 +1,164 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Matthias Clasen and Ulrik Vieth",
+%%% version = "1.915",
+%%% date = "26 October 2000",
+%%% time = "11:28:00 CEST",
+%%% filename = "euex.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the Euler extension encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\useexamplefont{euex10}
+\showbranches
+
+\title{The AMS Euler Extension encoding vector}
+\author{Matthias Clasen and Ulrik Vieth}
+
+\begin{document}
+\maketitle
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{EULER SUBSTITUTIONS ONLY}
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimensions are taken from \texttt{euex10}.}
+
+\setint{defaultrulethickness}{40}
+\setint{bigopspacing1}{111}
+\setint{bigopspacing2}{167}
+\setint{bigopspacing3}{200}
+\setint{bigopspacing4}{600}
+\setint{bigopspacing5}{100}
+
+\begincomment
+\section{Default font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{defaultrulethickness}} % default rule thickness
+\setint{fontdimen(9)}{\int{bigopspacing1}} % bigopspacing 1
+\setint{fontdimen(10)}{\int{bigopspacing2}} % bigopspacing 2
+\setint{fontdimen(11)}{\int{bigopspacing3}} % bigopspacing 3
+\setint{fontdimen(12)}{\int{bigopspacing4}} % bigopspacing 4
+\setint{fontdimen(13)}{\int{bigopspacing5}} % bigopspacing 5
+
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslotcomment{The symbol `\slotexample'.}
+
+\nextslot{8}
+\setslot{braceleftbig}\endsetslot
+\setslot{bracerightbig}\endsetslot
+\setslot{braceleftBig}\endsetslot
+\setslot{bracerightBig}\endsetslot
+\setslot{braceleftbigg}\endsetslot
+\setslot{bracerightbigg}\endsetslot
+\setslot{braceleftBigg}\endsetslot
+\setslot{bracerightBigg}\endsetslot
+
+\nextslot{24}
+\setslot{arrowlefttophalf}\endsetslot
+\setslot{arrowleftbothalf}\endsetslot
+\setslot{arrowrighttophalf}\endsetslot
+\setslot{arrowrightbothalf}\endsetslot
+
+\nextslot{32}
+\setslot{arrowleft}\endsetslot
+\setslot{arrowright}\endsetslot
+\setslot{arrowup}\endsetslot
+\setslot{arrowdown}\endsetslot
+\setslot{arrowboth}\endsetslot
+\setslot{arrownortheast}\endsetslot
+\setslot{arrowsoutheast}\endsetslot
+
+\nextslot{40}
+\setslot{arrowdblleft}\endsetslot
+\setslot{arrowdblright}\endsetslot
+\setslot{arrowdblup}\endsetslot
+\setslot{arrowdbldown}\endsetslot
+\setslot{arrowdblboth}\endsetslot
+\setslot{arrownorthwest}\endsetslot
+\setslot{arrowsouthwest}\endsetslot
+
+\nextslot{49}
+\setslot{infinity}\endsetslot
+
+\nextslot{56}
+\setslot{bracelefttp}\endsetslot
+\setslot{bracerighttp}\endsetslot
+\setslot{braceleftbt}\endsetslot
+\setslot{bracerightbt}\endsetslot
+\setslot{braceleftmid}\endsetslot
+\setslot{bracerightmid}\endsetslot
+\setslot{braceex}\endsetslot
+
+\nextslot{72}
+\setslot{contintegraltext}\endsetslot
+\setslot{contintegraldisplay}\endsetslot
+
+\nextslot{80}
+\setslot{summationtext}\endsetslot
+\setslot{producttext}\endsetslot
+\setslot{integraltext}\endsetslot
+
+\nextslot{88}
+\setslot{summationdisplay}\endsetslot
+\setslot{productdisplay}\endsetslot
+\setslot{integraldisplay}\endsetslot
+
+\nextslot{96}
+\setslot{coproducttext}\endsetslot
+\setslot{coproductdisplay}\endsetslot
+
+\nextslot{122}
+\setslot{bracehtipdownleft}\endsetslot
+\setslot{bracehtipdownright}\endsetslot
+\setslot{bracehtipupleft}\endsetslot
+\setslot{bracehtipupright}\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+12 October 2000, v1\,1.915: Introduced intermediate variables for
+fontdimens 8--13. Updated markup. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/eufrak.etx b/fonts/utilities/fontinst/inputs/mathetx/eufrak.etx
new file mode 100644
index 0000000000..edc289e80d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/eufrak.etx
@@ -0,0 +1,238 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Matthias Clasen and Ulrik Vieth",
+%%% version = "1.915",
+%%% date = "26 October 2000",
+%%% time = "11:29:00 CEST",
+%%% filename = "eufrak.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the Euler Fraktur encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\useexamplefont{eufm10}
+\showbranches
+
+\title{The AMS Euler Fraktur encoding vector (\texttt{OT1}-subset)}
+\author{Matthias Clasen and Ulrik Vieth}
+
+\begin{document}
+\maketitle
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX TEXT SUBSET}
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimensions are taken from \texttt{eufm10}.}
+
+\setint{num1}{378}
+\setint{num2}{270}
+\setint{num3}{297}
+\setint{denom1}{378}
+\setint{denom2}{162}
+\setint{sup1}{405}
+\setint{sup2}{378}
+\setint{sup3}{324}
+\setint{sub1}{189}
+\setint{sub2}{243}
+\setint{supdrop}{405}
+\setint{subdrop}{27}
+\setint{delim1}{2198}
+\setint{delim2}{1000}
+\setint{axisheight}{257}
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{num1}} % num 1
+\setint{fontdimen(9)}{\int{num2}} % num 2
+\setint{fontdimen(10)}{\int{num3}} % num 3
+\setint{fontdimen(11)}{\int{denom1}} % denom 1
+\setint{fontdimen(12)}{\int{denom2}} % denom 2
+\setint{fontdimen(13)}{\int{sup1}} % sup 1
+\setint{fontdimen(14)}{\int{sup2}} % sup 2
+\setint{fontdimen(15)}{\int{sup3}} % sup 3
+\setint{fontdimen(16)}{\int{sub1}} % sub 1
+\setint{fontdimen(17)}{\int{sub2}} % sub 2
+\setint{fontdimen(18)}{\int{supdrop}} % supdrop
+\setint{fontdimen(19)}{\int{subdrop}} % subdrop
+\setint{fontdimen(20)}{\int{delim1}} % delim 1
+\setint{fontdimen(21)}{\int{delim2}} % delim 2
+\setint{fontdimen(22)}{\int{axisheight}} % math axis height
+
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslotcomment{The alternate letter `\slotexample'.}
+
+\setslot{d1frak}\endsetslot
+\setslot{d2frak}\endsetslot
+\setslot{f1frak}\endsetslot
+\setslot{f2frak}\endsetslot
+\setslot{g1frak}\endsetslot
+\setslot{t1frak}\endsetslot
+\setslot{t2frak}\endsetslot
+\setslot{u1frak}\endsetslot
+
+\resetslotcomment{The symbol `\slotexample'.}
+
+\nextslot{18}
+\setslot{quoteleft}\endsetslot
+\setslot{quoteright}\endsetslot
+
+\nextslot{33}
+\setslot{exclam}\endsetslot
+\skipslots{4}
+\setslot{ampersand}\endsetslot
+\setslot{quotesingle}\endsetslot
+\setslot{parenleft}\endsetslot
+\setslot{parenright}\endsetslot
+\setslot{asterisk}\endsetslot
+\setslot{plus}\endsetslot
+\setslot{comma}\endsetslot
+\setslot{minus}\endsetslot
+\setslot{period}\endsetslot
+\setslot{slash}\endsetslot
+
+\resetslotcomment{The Fraktur numeral `\slotexample'.}
+
+\nextslot{48}
+\setslot{zerofrak}\endsetslot
+\setslot{onefrak}\endsetslot
+\setslot{twofrak}\endsetslot
+\setslot{threefrak}\endsetslot
+\setslot{fourfrak}\endsetslot
+\setslot{fivefrak}\endsetslot
+\setslot{sixfrak}\endsetslot
+\setslot{sevenfrak}\endsetslot
+\setslot{eightfrak}\endsetslot
+\setslot{ninefrak}\endsetslot
+
+\resetslotcomment{The symbol `\slotexample'.}
+
+\setslot{colon}\endsetslot
+\setslot{semicolon}\endsetslot
+\skipslots{1}
+\setslot{equal}\endsetslot
+\skipslots{1}
+\setslot{question}\endsetslot
+
+\resetslotcomment{The Fraktur letter `\slotexample'.}
+
+\nextslot{65}
+\setslot{Afrak}\endsetslot
+\setslot{Bfrak}\endsetslot
+\setslot{Cfrak}\endsetslot
+\setslot{Dfrak}\endsetslot
+\setslot{Efrak}\endsetslot
+\setslot{Ffrak}\endsetslot
+\setslot{Gfrak}\endsetslot
+\setslot{Hfrak}\endsetslot
+\setslot{Ifrak}\endsetslot
+\setslot{Jfrak}\endsetslot
+\setslot{Kfrak}\endsetslot
+\setslot{Lfrak}\endsetslot
+\setslot{Mfrak}\endsetslot
+\setslot{Nfrak}\endsetslot
+\setslot{Ofrak}\endsetslot
+\setslot{Pfrak}\endsetslot
+\setslot{Qfrak}\endsetslot
+\setslot{Rfrak}\endsetslot
+\setslot{Sfrak}\endsetslot
+\setslot{Tfrak}\endsetslot
+\setslot{Ufrak}\endsetslot
+\setslot{Vfrak}\endsetslot
+\setslot{Wfrak}\endsetslot
+\setslot{Xfrak}\endsetslot
+\setslot{Yfrak}\endsetslot
+\setslot{Zfrak}\endsetslot
+
+\resetslotcomment{The symbol `\slotexample'.}
+
+\setslot{bracketleft}\endsetslot
+\skipslots{1}
+\setslot{bracketright}\endsetslot
+\setslot{asciicircum}\endsetslot
+
+\resetslotcomment{The Fraktur letter `\slotexample'.}
+
+\nextslot{97}
+\setslot{afrak}\endsetslot
+\setslot{bfrak}\endsetslot
+\setslot{cfrak}\endsetslot
+\setslot{dfrak}\endsetslot
+\setslot{efrak}\endsetslot
+\setslot{ffrak}\endsetslot
+\setslot{gfrak}\endsetslot
+\setslot{hfrak}\endsetslot
+\setslot{ifrak}\endsetslot
+\setslot{jfrak}\endsetslot
+\setslot{kfrak}\endsetslot
+\setslot{lfrak}\endsetslot
+\setslot{mfrak}\endsetslot
+\setslot{nfrak}\endsetslot
+\setslot{ofrak}\endsetslot
+\setslot{pfrak}\endsetslot
+\setslot{qfrak}\endsetslot
+\setslot{rfrak}\endsetslot
+\setslot{sfrak}\endsetslot
+\setslot{tfrak}\endsetslot
+\setslot{ufrak}\endsetslot
+\setslot{vfrak}\endsetslot
+\setslot{wfrak}\endsetslot
+\setslot{xfrak}\endsetslot
+\setslot{yfrak}\endsetslot
+\setslot{zfrak}\endsetslot
+
+\resetslotcomment{The symbol `\slotexample'.}
+
+\skipslots{2}
+\setslot{quotedbl}\endsetslot
+\skipslots{1}
+\setslot{onealtfrak}\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+12 October 2000, v\,1.915: Introduced intermediate variables for fontdimens
+8--22. Updated markup. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/eurm.etx b/fonts/utilities/fontinst/inputs/mathetx/eurm.etx
new file mode 100644
index 0000000000..063137ad6f
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/eurm.etx
@@ -0,0 +1,239 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Matthias Clasen and Ulrik Vieth",
+%%% version = "1.915",
+%%% date = "26 October 2000",
+%%% time = "11:29:00 CEST",
+%%% filename = "eurm.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the Euler Roman encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\useexamplefont{eurm10}
+\showbranches
+
+\title{The AMS Euler Roman encoding vector (\texttt{OML}-subset)}
+\author{Matthias Clasen and Ulrik Vieth}
+
+\begin{document}
+\maketitle
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH ITALIC SUBSET}
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimensions are taken from \texttt{eurm10}.}
+
+\setint{num1}{378}
+\setint{num2}{270}
+\setint{num3}{297}
+\setint{denom1}{378}
+\setint{denom2}{162}
+\setint{sup1}{405}
+\setint{sup2}{378}
+\setint{sup3}{324}
+\setint{sub1}{189}
+\setint{sub2}{243}
+\setint{supdrop}{405}
+\setint{subdrop}{27}
+\setint{delim1}{2198}
+\setint{delim2}{1000}
+\setint{axisheight}{257}
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{num1}} % num 1
+\setint{fontdimen(9)}{\int{num2}} % num 2
+\setint{fontdimen(10)}{\int{num3}} % num 3
+\setint{fontdimen(11)}{\int{denom1}} % denom 1
+\setint{fontdimen(12)}{\int{denom2}} % denom 2
+\setint{fontdimen(13)}{\int{sup1}} % sup 1
+\setint{fontdimen(14)}{\int{sup2}} % sup 2
+\setint{fontdimen(15)}{\int{sup3}} % sup 3
+\setint{fontdimen(16)}{\int{sub1}} % sub 1
+\setint{fontdimen(17)}{\int{sub2}} % sub 2
+\setint{fontdimen(18)}{\int{supdrop}} % supdrop
+\setint{fontdimen(19)}{\int{subdrop}} % subdrop
+\setint{fontdimen(20)}{\int{delim1}} % delim 1
+\setint{fontdimen(21)}{\int{delim2}} % delim 2
+\setint{fontdimen(22)}{\int{axisheight}} % math axis height
+
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslotcomment{The Greek letter `\slotexample'.}
+\setslot{Gammaupright}\endsetslot
+\setslot{Deltaupright}\endsetslot
+\setslot{Thetaupright}\endsetslot
+\setslot{Lambdaupright}\endsetslot
+\setslot{Xiupright}\endsetslot
+\setslot{Piupright}\endsetslot
+\setslot{Sigmaupright}\endsetslot
+\setslot{Upsilonupright}\endsetslot
+\setslot{Phiupright}\endsetslot
+\setslot{Psiupright}\endsetslot
+\setslot{Omegaupright}\endsetslot
+\setslot{alphaupright}\endsetslot
+\setslot{betaupright}\endsetslot
+\setslot{gammaupright}\endsetslot
+\setslot{deltaupright}\endsetslot
+\setslot{epsilonupright}\endsetslot
+\setslot{zetaupright}\endsetslot
+\setslot{etaupright}\endsetslot
+\setslot{thetaupright}\endsetslot
+\setslot{iotaupright}\endsetslot
+\setslot{kappaupright}\endsetslot
+\setslot{lambdaupright}\endsetslot
+\setslot{muupright}\endsetslot
+\setslot{nuupright}\endsetslot
+\setslot{xiupright}\endsetslot
+\setslot{piupright}\endsetslot
+\setslot{rhoupright}\endsetslot
+\setslot{sigmaupright}\endsetslot
+\setslot{tauupright}\endsetslot
+\setslot{upsilonupright}\endsetslot
+\setslot{phiupright}\endsetslot
+\setslot{chiupright}\endsetslot
+\setslot{psiupright}\endsetslot
+\setslot{omegaupright}\endsetslot
+\setslot{epsilon1upright}\endsetslot
+\setslot{theta1upright}\endsetslot
+\setslot{pi1upright}\endsetslot
+\skipslots{2}
+\setslot{phi1upright}\endsetslot
+
+\nextslot{48}
+
+\resetslotcomment{The numeral `\slotexample'.}
+\setslot{zeroupright}\endsetslot
+\setslot{oneupright}\endsetslot
+\setslot{twoupright}\endsetslot
+\setslot{threeupright}\endsetslot
+\setslot{fourupright}\endsetslot
+\setslot{fiveupright}\endsetslot
+\setslot{sixupright}\endsetslot
+\setslot{sevenupright}\endsetslot
+\setslot{eightupright}\endsetslot
+\setslot{nineupright}\endsetslot
+
+\resetslotcomment{The symbol `\slotexample'.}
+\setslot{period}\endsetslot
+\setslot{comma}\endsetslot
+\setslot{less}\endsetslot
+\setslot{slash}\endsetslot
+\setslot{greater}\endsetslot
+\skipslots{1}
+\setslot{partialdiffupright}\endsetslot
+
+\nextslot{65}
+
+\resetslotcomment{The letter `\slotexample'.}
+\setslot{A}\endsetslot
+\setslot{B}\endsetslot
+\setslot{C}\endsetslot
+\setslot{D}\endsetslot
+\setslot{E}\endsetslot
+\setslot{F}\endsetslot
+\setslot{G}\endsetslot
+\setslot{H}\endsetslot
+\setslot{I}\endsetslot
+\setslot{J}\endsetslot
+\setslot{K}\endsetslot
+\setslot{L}\endsetslot
+\setslot{M}\endsetslot
+\setslot{N}\endsetslot
+\setslot{O}\endsetslot
+\setslot{P}\endsetslot
+\setslot{Q}\endsetslot
+\setslot{R}\endsetslot
+\setslot{S}\endsetslot
+\setslot{T}\endsetslot
+\setslot{U}\endsetslot
+\setslot{V}\endsetslot
+\setslot{W}\endsetslot
+\setslot{X}\endsetslot
+\setslot{Y}\endsetslot
+\setslot{Z}\endsetslot
+\skipslots{5}
+
+\setslot{lscript}\endsetslot
+\setslot{a}\endsetslot
+\setslot{b}\endsetslot
+\setslot{c}\endsetslot
+\setslot{d}\endsetslot
+\setslot{e}\endsetslot
+\setslot{f}\endsetslot
+\setslot{g}\endsetslot
+\setslot{h}\endsetslot
+\setslot{i}\endsetslot
+\setslot{j}\endsetslot
+\setslot{k}\endsetslot
+\setslot{l}\endsetslot
+\setslot{m}\endsetslot
+\setslot{n}\endsetslot
+\setslot{o}\endsetslot
+\setslot{p}\endsetslot
+\setslot{q}\endsetslot
+\setslot{r}\endsetslot
+\setslot{s}\endsetslot
+\setslot{t}\endsetslot
+\setslot{u}\endsetslot
+\setslot{v}\endsetslot
+\setslot{w}\endsetslot
+\setslot{x}\endsetslot
+\setslot{y}\endsetslot
+\setslot{z}\endsetslot
+\setslot{dotlessi}\endsetslot
+\setslot{dotlessj}\endsetslot
+\setslot{weierstrass}\endsetslot
+
+\nextslot{127}
+\setslot{skewchar}\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+12 October 2000, v\,1.915: Introduced intermediate variables for fontdimens
+8--22. Updated markup. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/euscr.etx b/fonts/utilities/fontinst/inputs/mathetx/euscr.etx
new file mode 100644
index 0000000000..c5811f646c
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/euscr.etx
@@ -0,0 +1,171 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Matthias Clasen and Ulrik Vieth",
+%%% version = "1.915",
+%%% date = "26 October 2000",
+%%% time = "11:30:00 CEST",
+%%% filename = "euscr.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the Euler Script encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\useexamplefont{eusm10}
+\showbranches
+
+\title{The AMS Euler Script encoding vector (\texttt{OMS}-subset)}
+\author{Matthias Clasen and Ulrik Vieth}
+
+\begin{document}
+\maketitle
+
+\encoding
+
+\needsfontinstversion{1.909}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH SYMBOLS SUBSET}
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimensions are taken from \texttt{eusm10}.}
+
+\setint{num1}{378}
+\setint{num2}{270}
+\setint{num3}{297}
+\setint{denom1}{378}
+\setint{denom2}{162}
+\setint{sup1}{405}
+\setint{sup2}{378}
+\setint{sup3}{324}
+\setint{sub1}{189}
+\setint{sub2}{243}
+\setint{supdrop}{405}
+\setint{subdrop}{27}
+\setint{delim1}{2198}
+\setint{delim2}{1000}
+\setint{axisheight}{257}
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{num1}} % num 1
+\setint{fontdimen(9)}{\int{num2}} % num 2
+\setint{fontdimen(10)}{\int{num3}} % num 3
+\setint{fontdimen(11)}{\int{denom1}} % denom 1
+\setint{fontdimen(12)}{\int{denom2}} % denom 2
+\setint{fontdimen(13)}{\int{sup1}} % sup 1
+\setint{fontdimen(14)}{\int{sup2}} % sup 2
+\setint{fontdimen(15)}{\int{sup3}} % sup 3
+\setint{fontdimen(16)}{\int{sub1}} % sub 1
+\setint{fontdimen(17)}{\int{sub2}} % sub 2
+\setint{fontdimen(18)}{\int{supdrop}} % supdrop
+\setint{fontdimen(19)}{\int{subdrop}} % subdrop
+\setint{fontdimen(20)}{\int{delim1}} % delim 1
+\setint{fontdimen(21)}{\int{delim2}} % delim 2
+\setint{fontdimen(22)}{\int{axisheight}} % math axis height
+
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslotcomment{The symbol `\slotexample'.}
+
+\nextslot{24}
+\setslot{similar}\endsetslot
+
+\nextslot{48}
+\setslot{skewchar}\endsetslot
+
+\nextslot{58}
+\setslot{logicalnot}\endsetslot
+\nextslot{60}
+\setslot{Rfraktur}\endsetslot
+\setslot{Ifraktur}\endsetslot
+\nextslot{64}
+\setslot{aleph}\endsetslot
+
+\setslotcomment{The script letter `\slotexample'.}
+
+\nextslot{65}
+\setslot{Acal}\endsetslot
+\setslot{Bcal}\endsetslot
+\setslot{Ccal}\endsetslot
+\setslot{Dcal}\endsetslot
+\setslot{Ecal}\endsetslot
+\setslot{Fcal}\endsetslot
+\setslot{Gcal}\endsetslot
+\setslot{Hcal}\endsetslot
+\setslot{Ical}\endsetslot
+\setslot{Jcal}\endsetslot
+\setslot{Kcal}\endsetslot
+\setslot{Lcal}\endsetslot
+\setslot{Mcal}\endsetslot
+\setslot{Ncal}\endsetslot
+\setslot{Ocal}\endsetslot
+\setslot{Pcal}\endsetslot
+\setslot{Qcal}\endsetslot
+\setslot{Rcal}\endsetslot
+\setslot{Scal}\endsetslot
+\setslot{Tcal}\endsetslot
+\setslot{Ucal}\endsetslot
+\setslot{Vcal}\endsetslot
+\setslot{Wcal}\endsetslot
+\setslot{Xcal}\endsetslot
+\setslot{Ycal}\endsetslot
+\setslot{Zcal}\endsetslot
+
+\setslotcomment{The symbol `\slotexample'.}
+
+\nextslot{94}
+\setslot{logicaland}\endsetslot
+\setslot{logicalor}\endsetslot
+\nextslot{102}
+\setslot{braceleft}\endsetslot
+\setslot{braceright}\endsetslot
+\nextslot{106}
+\setslot{bar}\endsetslot
+\nextslot{110}
+\setslot{backslash}\endsetslot
+\nextslot{120}
+\setslot{section}\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+12 October 2000, v\,1.915: Introduced intermediate variables for fontdimens
+8--22. Updated markup. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/msam.etx b/fonts/utilities/fontinst/inputs/mathetx/msam.etx
new file mode 100644
index 0000000000..89a38dedfb
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/msam.etx
@@ -0,0 +1,636 @@
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}
+\usepackage{amssymb}
+\usepackage{multicol}
+
+\title{The AMS \texttt{msam} symbol encoding vector}
+\author{Mattias Clasen, modifications by Ulrik Vieth}
+
+\begin{document}
+\onecolumn
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the AMS \texttt{msam} symbol encoding, which
+is unfortunately called \texttt{TEX MATH SYMBOLS} in the \texttt{.tfm}
+files although it has nothing to do with the encoding of
+\texttt{cmsy}. To overcome this difficulty use e.g.\ \texttt{msam10}
+like
+\begin{quote}
+ \textellipsis
+ \verb|,\metrics\generalpltomtx{msam10}{msam10}{pl}{msam},msam10,|%
+ \textellipsis
+\end{quote}
+in the \textit{file list} argument of \verb+\installfont+, or generate
+the \texttt{.mtx} file at some point before the \verb|\installfont|
+command.
+
+Most glyph names were revised to match the names used in the
+\texttt{.afm} files of the BlueSky Type~1 fonts, except for a few
+cases where those glyph names were found to be confusing or
+misleading.
+
+\showbranches
+
+\begin{multicols}{2}
+
+\encoding
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{AMS Math Symbols, Part A}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimension defaults are taken from
+\texttt{cmsy10}.}
+
+\setint{num1}{677}
+\setint{num2}{394}
+\setint{num3}{444}
+\setint{denom1}{686}
+\setint{denom2}{345}
+\setint{sup1}{413}
+\setint{sup2}{363}
+\setint{sup3}{289}
+\setint{sub1}{150}
+\setint{sub2}{247}
+\setint{supdrop}{386}
+\setint{subdrop}{50}
+\setint{delim1}{2390}
+\setint{delim2}{1010}
+\setint{axisheight}{250}
+
+
+\begincomment
+\section{Default font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{num1}} % num 1
+\setint{fontdimen(9)}{\int{num2}} % num 2
+\setint{fontdimen(10)}{\int{num3}} % num 3
+\setint{fontdimen(11)}{\int{denom1}} % denom 1
+\setint{fontdimen(12)}{\int{denom2}} % denom 2
+\setint{fontdimen(13)}{\int{sup1}} % sup 1
+\setint{fontdimen(14)}{\int{sup2}} % sup 2
+\setint{fontdimen(15)}{\int{sup3}} % sup 3
+\setint{fontdimen(16)}{\int{sub1}} % sub 1
+\setint{fontdimen(17)}{\int{sub2}} % sub 2
+\setint{fontdimen(18)}{\int{supdrop}} % supdrop
+\setint{fontdimen(19)}{\int{subdrop}} % subdrop
+\setint{fontdimen(20)}{\int{delim1}} % delim 1
+\setint{fontdimen(21)}{\int{delim2}} % delim 2
+\setint{fontdimen(22)}{\int{axisheight}} % math axis height
+
+
+\begincomment
+\section{The encoding}
+There are 128 glyphs in this encoding.
+\endcomment
+
+\setslot{squaredot}
+ \comment{The symbol `$\boxdot$'.}
+\endsetslot
+
+\setslot{squareplus}
+ \comment{The symbol `$\boxplus$'.}
+\endsetslot
+
+\setslot{squaremultiply}
+ \comment{The symbol `$\boxtimes$'.}
+\endsetslot
+
+\setslot{square}
+ \comment{The symbol `$\square$'.}
+\endsetslot
+
+\setslot{squaresolid}
+ \comment{The symbol `$\blacksquare$'.}
+\endsetslot
+
+\setslot{squaresmallsolid}
+ \comment{The symbol `$\centerdot$'.}
+\endsetslot
+
+\setslot{lozenge}
+ \comment{The symbol `$\lozenge$'.}
+\endsetslot
+
+\setslot{lozengesolid}
+ \comment{The symbol `$\blacklozenge$'.}
+\endsetslot
+
+\setslot{clockwise}
+ \comment{The symbol `$\circlearrowright$'.}
+\endsetslot
+
+\setslot{anticlockwise}
+ \comment{The symbol `$\circlearrowleft$'.}
+\endsetslot
+
+\setslot{harpoonleftright}
+ \comment{The symbol `$\rightleftharpoons$'.}
+\endsetslot
+
+\setslot{harpoonrightleft}
+ \comment{The symbol `$\leftrightharpoons$'.}
+\endsetslot
+
+\setslot{squareminus}
+ \comment{The symbol `$\boxminus$'.}
+\endsetslot
+
+\setslot{forces}
+ \comment{The symbol `$\Vdash$'.}
+\endsetslot
+
+\setslot{forcesbar}
+ \comment{The symbol `$\Vvdash$'.}
+\endsetslot
+
+\setslot{satisfies}
+ \comment{The symbol `$\vDash$'.}
+\endsetslot
+
+\setslot{dblarrowheadright}
+ \comment{The symbol `$\twoheadrightarrow$'.}
+\endsetslot
+
+\setslot{dblarrowheadleft}
+ \comment{The symbol `$\twoheadleftarrow$'.}
+\endsetslot
+
+\setslot{dblarrowleft}
+ \comment{The symbol `$\leftleftarrows$'.}
+\endsetslot
+
+\setslot{dblarrowright}
+ \comment{The symbol `$\rightrightarrows$'.}
+\endsetslot
+
+\setslot{dblarrowup}
+ \comment{The symbol `$\upuparrows$'.}
+\endsetslot
+
+\setslot{dblarrowdown}
+ \comment{The symbol `$\downdownarrows$'.}
+\endsetslot
+
+\setslot{harpoonupright}
+ \comment{The symbol `$\upharpoonright$'.}
+\endsetslot
+
+\setslot{harpoondownright}
+ \comment{The symbol `$\downharpoonright$'.}
+\endsetslot
+
+\setslot{harpoonupleft}
+ \comment{The symbol `$\upharpoonleft$'.}
+\endsetslot
+
+\setslot{harpoondownleft}
+ \comment{The symbol `$\downharpoonleft$'.}
+\endsetslot
+
+\setslot{arrowtailright}
+ \comment{The symbol `$\rightarrowtail$'.}
+\endsetslot
+
+\setslot{arrowtailleft}
+ \comment{The symbol `$\leftarrowtail$'.}
+\endsetslot
+
+\setslot{arrowparrleftright}
+ \comment{The symbol `$\leftrightarrows$'.}
+\endsetslot
+
+\setslot{arrowparrrightleft}
+ \comment{The symbol `$\rightleftarrows$'.}
+\endsetslot
+
+\setslot{shiftleft}
+ \comment{The symbol `$\Lsh$'.}
+\endsetslot
+
+\setslot{shiftright}
+ \comment{The symbol `$\Rsh$'.}
+\endsetslot
+
+\setslot{squiggleright}
+ \comment{The symbol `$\rightsquigarrow$'.}
+\endsetslot
+
+\setslot{squiggleleftright}
+ \comment{The symbol `$\leftrightsquigarrow$'.}
+\endsetslot
+
+\setslot{curlyleft}
+ \comment{The symbol `$\looparrowleft$'.}
+\endsetslot
+
+\setslot{curlyright}
+ \comment{The symbol `$\looparrowright$'.}
+\endsetslot
+
+\setslot{circleequal}
+ \comment{The symbol `$\circeq$'.}
+\endsetslot
+
+\setslot{followsorsimilar} % was: followsorequal
+ \comment{The symbol `$\succsim$'.}
+\endsetslot
+
+\setslot{greaterorsimilar}
+ \comment{The symbol `$\gtrsim$'.}
+\endsetslot
+
+\setslot{greaterorapproxeql}
+ \comment{The symbol `$\gtrapprox$'.}
+\endsetslot
+
+\setslot{multimap}
+ \comment{The symbol `$\multimap$'.}
+\endsetslot
+
+\setslot{therefore}
+ \comment{The symbol `$\therefore$'.}
+\endsetslot
+
+\setslot{because}
+ \comment{The symbol `$\because$'.}
+\endsetslot
+
+\setslot{equalsdots}
+ \comment{The symbol `$\doteqdot$'.}
+\endsetslot
+
+\setslot{defines}
+ \comment{The symbol `$\triangleq$'.}
+\endsetslot
+
+\setslot{precedesorsimilar} % was: precedesorequal
+ \comment{The symbol `$\precsim$'.}
+\endsetslot
+
+\setslot{lessorsimilar}
+ \comment{The symbol `$\lesssim$'.}
+\endsetslot
+
+\setslot{lessorapproxeql}
+ \comment{The symbol `$\lessapprox$'.}
+\endsetslot
+
+\setslot{equalslantorless} % was: equalorless
+ \comment{The symbol `$\eqslantless$'.}
+\endsetslot
+
+\setslot{equalslantorgreater} % was: equaulorgreater
+ \comment{The symbol `$\eqslantgtr$'.}
+\endsetslot
+
+\setslot{curlyorprecedes} % was: equalorprecedes
+ \comment{The symbol `$\curlyeqprec$'.}
+\endsetslot
+
+\setslot{curlyorfollows} % was: equalorfollows
+ \comment{The symbol `$\curlyeqsucc$'.}
+\endsetslot
+
+\setslot{precedesorcurly}
+ \comment{The symbol `$\preccurlyeq$'.}
+\endsetslot
+
+\setslot{lessdblequal}
+ \comment{The symbol `$\leqq$'.}
+\endsetslot
+
+\setslot{lessorequalslant}
+ \comment{The symbol `$\leqslant$'.}
+\endsetslot
+
+\setslot{lessorgreater}
+ \comment{The symbol `$\lessgtr$'.}
+\endsetslot
+
+\setslot{primereverse}
+ \comment{The symbol `$\backprime$'.}
+\endsetslot
+
+\setslot{arrowaxishorizex} % axisshort
+ \comment{The extension piece to construct dashed arrows.}
+\endsetslot
+
+\setslot{equaldotrightleft}
+ \comment{The symbol `$\risingdotseq$'.}
+\endsetslot
+
+\setslot{equaldotleftright}
+ \comment{The symbol `$\fallingdotseq$'.}
+\endsetslot
+
+\setslot{followsorcurly}
+ \comment{The symbol `$\succcurlyeq$'.}
+\endsetslot
+
+\setslot{greaterdblequal}
+ \comment{The symbol `$\geqq$'.}
+\endsetslot
+
+\setslot{greaterorequalslant}
+ \comment{The symbol `$\geqslant$'.}
+\endsetslot
+
+\setslot{greaterorless}
+ \comment{The symbol `$\gtrless$'.}
+\endsetslot
+
+\setslot{squareimage}
+ \comment{The symbol `$\sqsubset$'.}
+\endsetslot
+
+\setslot{squareoriginal}
+ \comment{The symbol `$\sqsupset$'.}
+\endsetslot
+
+\setslot{vartriangleright}
+ \comment{The symbol `$\vartriangleright$'.}
+\endsetslot
+
+\setslot{vartriangleleft}
+ \comment{The symbol `$\vartriangleleft$'.}
+\endsetslot
+
+\setslot{trianglerightequal}
+ \comment{The symbol `$\trianglerighteq$'.}
+\endsetslot
+
+\setslot{triangleleftequal}
+ \comment{The symbol `$\trianglelefteq$'.}
+\endsetslot
+
+\setslot{bigstar}
+ \comment{The symbol `$\bigstar$'.}
+\endsetslot
+
+\setslot{between}
+ \comment{The symbol `$\between$'.}
+\endsetslot
+
+\setslot{triangledownsld}
+ \comment{The symbol `$\blacktriangledown$'.}
+\endsetslot
+
+\setslot{trianglerightsld}
+ \comment{The symbol `$\blacktriangleright$'.}
+\endsetslot
+
+\setslot{triangleleftsld}
+ \comment{The symbol `$\blacktriangleleft$'.}
+\endsetslot
+
+\setslot{arrowaxisright}
+ \comment{The right arrowhead to construct dashed arrows.}
+\endsetslot
+
+\setslot{arrowaxisleft}
+ \comment{The left arrowhead to construct dashed arrows.}
+\endsetslot
+
+\setslot{triangleup}
+ \comment{The symbol `$\vartriangle$'.}
+\endsetslot
+
+\setslot{trianglesolid}
+ \comment{The symbol `$\blacktriangle$'.}
+\endsetslot
+
+\setslot{triangledown} % triangleinv ?
+ \comment{The symbol `$\triangledown$'.}
+\endsetslot
+
+\setslot{ringinequal}
+ \comment{The symbol `$\eqcirc$'.}
+\endsetslot
+
+\setslot{lessequalgreater}
+ \comment{The symbol `$\lesseqgtr$'.}
+\endsetslot
+
+\setslot{greaterequalless}
+ \comment{The symbol `$\gtreqless$'.}
+\endsetslot
+
+\setslot{lessdbleqlgreater}
+ \comment{The symbol `$\lesseqqgtr$'.}
+\endsetslot
+
+\setslot{greaterdbleqlless}
+ \comment{The symbol `$\gtreqqless$'.}
+\endsetslot
+
+\setslot{Yen}
+ \comment{The symbol `$\yen$'.}
+\endsetslot
+
+\setslot{arrowtripleright}
+ \comment{The symbol `$\Rrightarrow$'.}
+\endsetslot
+
+\setslot{arrowtripleleft}
+ \comment{The symbol `$\Lleftarrow$'.}
+\endsetslot
+
+\setslot{check}
+ \comment{The symbol `$\checkmark$'.}
+\endsetslot
+
+\setslot{orunderscore}
+ \comment{The symbol `$\veebar$'.}
+\endsetslot
+
+\setslot{nand}
+ \comment{The symbol `$\barwedge$'.}
+\endsetslot
+
+\setslot{perpcorrespond}
+ \comment{The symbol `$\doublebarwedge$'.}
+\endsetslot
+
+\setslot{angle}
+ \comment{The symbol `$\angle$'.}
+\endsetslot
+
+\setslot{measuredangle}
+ \comment{The symbol `$\measuredangle$'.}
+\endsetslot
+
+\setslot{sphericalangle}
+ \comment{The symbol `$\sphericalangle$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The symbol `$\varpropto$'.}
+\endsetslot
+
+\setslot{slurbelow} % smile ???
+ \comment{The symbol `$\smallsmile$'.}
+\endsetslot
+
+\setslot{slurabove} % frown ???
+ \comment{The symbol `$\smallfrown$'.}
+\endsetslot
+
+\setslot{subsetdbl}
+ \comment{The symbol `$\Subset$'.}
+\endsetslot
+
+\setslot{supersetdbl}
+ \comment{The symbol `$\Supset$'.}
+\endsetslot
+
+\setslot{uniondbl}
+ \comment{The symbol `$\Cup$'.}
+\endsetslot
+
+\setslot{intersectiondbl}
+ \comment{The symbol `$\Cap$'.}
+\endsetslot
+
+\setslot{uprise}
+ \comment{The symbol `$\curlywedge$'.}
+\endsetslot
+
+\setslot{downfall}
+ \comment{The symbol `$\curlyvee$'.}
+\endsetslot
+
+\setslot{multiopenleft}
+ \comment{The symbol `$\leftthreetimes$'.}
+\endsetslot
+
+\setslot{multiopenright}
+ \comment{The symbol `$\rightthreetimes$'.}
+\endsetslot
+
+\setslot{subsetdblequal}
+ \comment{The symbol `$\subseteqq$'.}
+\endsetslot
+
+\setslot{supersetdblequal}
+ \comment{The symbol `$\supseteqq$'.}
+\endsetslot
+
+\setslot{difference}
+ \comment{The symbol `$\bumpeq$'.}
+\endsetslot
+
+\setslot{geomequivalent}
+ \comment{The symbol `$\Bumpeq$'.}
+\endsetslot
+
+\setslot{muchless}
+ \comment{The symbol `$\lll$'.}
+\endsetslot
+
+\setslot{muchgreater}
+ \comment{The symbol `$\ggg$'.}
+\endsetslot
+
+\setslot{rightanglenw}
+ \comment{The symbol `$\ulcorner$'.}
+\endsetslot
+
+\setslot{rightanglene}
+ \comment{The symbol `$\urcorner$'.}
+\endsetslot
+
+\setslot{circledR} % circleR
+ \comment{The symbol `$\circledR$'.}
+\endsetslot
+
+\setslot{circledS} % circleS
+ \comment{The symbol `$\circledS$'.}
+\endsetslot
+
+\setslot{fork}
+ \comment{The symbol `$\pitchfork$'.}
+\endsetslot
+
+\setslot{dotplus}
+ \comment{The symbol `$\dotplus$'.}
+\endsetslot
+
+\setslot{revsimilar}
+ \comment{The symbol `$\backsim$'.}
+\endsetslot
+
+\setslot{revasymptequal}
+ \comment{The symbol `$\backsimeq$'.}
+\endsetslot
+
+\setslot{rightanglesw}
+ \comment{The symbol `$\llcorner$'.}
+\endsetslot
+
+\setslot{rightanglese}
+ \comment{The symbol `$\lrcorner$'.}
+\endsetslot
+
+\setslot{maltesecross}
+ \comment{The symbol `$\maltese$'.}
+\endsetslot
+
+\setslot{complement}
+ \comment{The symbol `$\complement$'.}
+\endsetslot
+
+\setslot{intercal}
+ \comment{The symbol `$\intercal$'.}
+\endsetslot
+
+\setslot{circlecirc} % circlering ???
+ \comment{The symbol `$\circledcirc$'.}
+\endsetslot
+
+\setslot{circleasterisk}
+ \comment{The symbol `$\circledast$'.}
+\endsetslot
+
+\setslot{circledash} % circleminus ???
+ \comment{The symbol `$\circleddash$'.}
+\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+2001/01/10: File added to \textsf{fontinst} distribution, description
+of workaround for codingscheme bug in \texttt{msam} fonts changed,
+intermediate variables for fontdimens 8--22 introduced, and some minor
+markup changes were made. (LH)
+
+\end{multicols}
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/mathetx/msbm.etx b/fonts/utilities/fontinst/inputs/mathetx/msbm.etx
new file mode 100644
index 0000000000..d58bd8cfb2
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/msbm.etx
@@ -0,0 +1,619 @@
+\relax
+
+\documentclass[twocolumn]{article}
+
+\usepackage{fontdoc}
+\usepackage{amssymb}
+\usepackage{multicol}
+
+\title{The AMS \texttt{msbm} symbol encoding vector}
+\author{Mattias Clasen, modifications by Ulrik Vieth}
+
+\begin{document}\onecolumn
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the AMS \texttt{msbm} symbol encoding, which
+is unfortunately called \texttt{TEX MATH SYMBOLS} in the \texttt{.tfm}
+files although it has nothing to do with the encoding of
+\texttt{cmsy}. To overcome this difficulty use e.g.\ \texttt{msbm10}
+like
+\begin{quote}
+ \textellipsis
+ \verb|,\metrics\generalpltomtx{msbm10}{msbm10}{pl}{msbm},msbm10,|%
+ \textellipsis
+\end{quote}
+in the \textit{file list} argument of \verb+\installfont+, or generate
+the \texttt{.mtx} file at some point before the \verb|\installfont|
+command.
+
+Most glyph names were revised to match the names used in the
+\texttt{.afm} files of the BlueSky Type~1 fonts, except for a few
+cases where those glyph names were found to be confusing or
+misleading.
+
+\showbranches
+\begin{multicols}{2}
+
+\encoding
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{AMS Math Symbols, Part B}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\comment{The following font dimension defaults are taken from
+\texttt{cmsy10}.}
+
+\setint{num1}{677}
+\setint{num2}{394}
+\setint{num3}{444}
+\setint{denom1}{686}
+\setint{denom2}{345}
+\setint{sup1}{413}
+\setint{sup2}{363}
+\setint{sup3}{289}
+\setint{sub1}{150}
+\setint{sub2}{247}
+\setint{supdrop}{386}
+\setint{subdrop}{50}
+\setint{delim1}{2390}
+\setint{delim2}{1010}
+\setint{axisheight}{250}
+
+
+\begincomment
+\section{Default font dimensions}
+\endcomment
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\setint{fontdimen(8)}{\int{num1}} % num 1
+\setint{fontdimen(9)}{\int{num2}} % num 2
+\setint{fontdimen(10)}{\int{num3}} % num 3
+\setint{fontdimen(11)}{\int{denom1}} % denom 1
+\setint{fontdimen(12)}{\int{denom2}} % denom 2
+\setint{fontdimen(13)}{\int{sup1}} % sup 1
+\setint{fontdimen(14)}{\int{sup2}} % sup 2
+\setint{fontdimen(15)}{\int{sup3}} % sup 3
+\setint{fontdimen(16)}{\int{sub1}} % sub 1
+\setint{fontdimen(17)}{\int{sub2}} % sub 2
+\setint{fontdimen(18)}{\int{supdrop}} % supdrop
+\setint{fontdimen(19)}{\int{subdrop}} % subdrop
+\setint{fontdimen(20)}{\int{delim1}} % delim 1
+\setint{fontdimen(21)}{\int{delim2}} % delim 2
+\setint{fontdimen(22)}{\int{axisheight}} % math axis height
+
+
+\begincomment
+\section{The encoding}
+There are 128 glyphs in this encoding.
+\endcomment
+
+\setslot{lessnotvertequal} % lessornotequal
+ \comment{The symbol `$\lvertneqq$'.}
+\endsetslot
+
+\setslot{greaternotvertequal} % greaterornotequal
+ \comment{The symbol `$\gvertneqq$'.}
+\endsetslot
+
+\setslot{notlessequal}
+ \comment{The symbol `$\nleq$'.}
+\endsetslot
+
+\setslot{notgreaterequal}
+ \comment{The symbol `$\ngeq$'.}
+\endsetslot
+
+\setslot{notless}
+ \comment{The symbol `$\nless$'.}
+\endsetslot
+
+\setslot{notgreater}
+ \comment{The symbol `$\ngtr$'.}
+\endsetslot
+
+\setslot{notprecedes}
+ \comment{The symbol `$\nprec$'.}
+\endsetslot
+
+\setslot{notfollows}
+ \comment{The symbol `$\nsucc$'.}
+\endsetslot
+
+\setslot{lessornotdbleql}
+ \comment{The symbol `$\lneqq$'.}
+\endsetslot
+
+\setslot{greaterornotdbleql}
+ \comment{The symbol `$\gneqq$'.}
+\endsetslot
+
+\setslot{notlessorequalslant} % was: notlessorslnteql
+ \comment{The symbol `$\nleqslant$'.}
+\endsetslot
+
+\setslot{notgreaterorequalslant} % was: notgreaterorslnteql
+ \comment{The symbol `$\ngeqslant$'.}
+\endsetslot
+
+\setslot{lessnotequal}
+ \comment{The symbol `$\lneq$'.}
+\endsetslot
+
+\setslot{greaternotequal}
+ \comment{The symbol `$\gneq$'.}
+\endsetslot
+
+\setslot{notprecedesoreql}
+ \comment{The symbol `$\npreceq$'.}
+\endsetslot
+
+\setslot{notfollowsoreql}
+ \comment{The symbol `$\nsucceq$'.}
+\endsetslot
+
+\setslot{precedesornotsimilar} % was: precedesornoteqvlnt
+ \comment{The symbol `$\precnsim$'.}
+\endsetslot
+
+\setslot{followsornotsimilar} % was: followornoteqvlnt
+ \comment{The symbol `$\succnsim$'.}
+\endsetslot
+
+\setslot{lessornotsimilar}
+ \comment{The symbol `$\lnsim$'.}
+\endsetslot
+
+\setslot{greaterornotsimilar}
+ \comment{The symbol `$\gnsim$'.}
+\endsetslot
+
+\setslot{notlessdblequal}
+ \comment{The symbol `$\nleqq$'.}
+\endsetslot
+
+\setslot{notgreaterdblequal}
+ \comment{The symbol `$\ngeqq$'.}
+\endsetslot
+
+\setslot{precedesnotdbleql} % was: precedesnotslnteql
+ \comment{The symbol `$\precneqq$'.}
+\endsetslot
+
+\setslot{followsnotdbleql} % was: followsnotslnteql
+ \comment{The symbol `$\succneqq$'.}
+\endsetslot
+
+\setslot{precedesnotapproxeql} % was: precedesnotdbleqv
+ \comment{The symbol `$\precnapprox$'.}
+\endsetslot
+
+\setslot{followsnotapproxeql} % was: followsnotdbleqv
+ \comment{The symbol `$\succnapprox$'.}
+\endsetslot
+
+\setslot{lessnotapproxeql} % was: lessnotdblequal
+ \comment{The symbol `$\lnapprox$'.}
+\endsetslot
+
+\setslot{greaternotapproxeql} % was: greaternotdblequal
+ \comment{The symbol `$\gnapprox$'.}
+\endsetslot
+
+\setslot{notsimilar}
+ \comment{The symbol `$\nsim$'.}
+\endsetslot
+
+\setslot{notcongruent} % was: notapproxequual
+ \comment{The symbol `$\ncong$'.}
+\endsetslot
+
+\setslot{upslope}
+ \comment{The symbol `$\diagup$'.}
+\endsetslot
+
+\setslot{downslope}
+ \comment{The symbol `$\diagdown$'.}
+\endsetslot
+
+\setslot{notsubsetoreql}
+ \comment{The symbol `$\varsubsetneq$'.}
+\endsetslot
+
+\setslot{notsupersetoreql}
+ \comment{The symbol `$\varsupsetneq$'.}
+\endsetslot
+
+\setslot{notsubsetordbleql}
+ \comment{The symbol `$\nsubseteqq$'.}
+\endsetslot
+
+\setslot{notsupersetordbleql}
+ \comment{The symbol `$\nsupseteqq$'.}
+\endsetslot
+
+\setslot{subsetornoteql}
+ \comment{The symbol `$\varsubsetneqq$'.}
+\endsetslot
+
+\setslot{supersetornoteql}
+ \comment{The symbol `$\varsupsetneqq$'.}
+\endsetslot
+
+\setslot{subsetornotdbleql}
+ \comment{The symbol `$\subsetneqq$'.}
+\endsetslot
+
+\setslot{supersetornotdbleql}
+ \comment{The symbol `$\supsetneqq$'.}
+\endsetslot
+
+\setslot{subsetnoteql}
+ \comment{The symbol `$\subsetneq$'.}
+\endsetslot
+
+\setslot{supersetnoteql}
+ \comment{The symbol `$\supsetneq$'.}
+\endsetslot
+
+\setslot{notsubseteql}
+ \comment{The symbol `$\nsubseteq$'.}
+\endsetslot
+
+\setslot{notsuperseteql}
+ \comment{The symbol `$\nsupseteq$'.}
+\endsetslot
+
+\setslot{notparallel}
+ \comment{The symbol `$\nparallel$'.}
+\endsetslot
+
+\setslot{notbar}
+ \comment{The symbol `$\nmid$'.}
+\endsetslot
+
+\setslot{notshortbar}
+ \comment{The symbol `$\nshortmid$'.}
+\endsetslot
+
+\setslot{notshortparallel}
+ \comment{The symbol `$\nshortparallel$'.}
+\endsetslot
+
+\setslot{notturnstile}
+ \comment{The symbol `$\nvdash$'.}
+\endsetslot
+
+\setslot{notforces}
+ \comment{The symbol `$\nVdash$'.}
+\endsetslot
+
+\setslot{notsatisfies}
+ \comment{The symbol `$\nvDash$'.}
+\endsetslot
+
+\setslot{notforcesextra}
+ \comment{The symbol `$\nVDash$'.}
+\endsetslot
+
+\setslot{nottriangeqlright}
+ \comment{The symbol `$\ntrianglerighteq$'.}
+\endsetslot
+
+\setslot{nottriangeqlleft}
+ \comment{The symbol `$\ntrianglelefteq$'.}
+\endsetslot
+
+\setslot{nottriangleleft}
+ \comment{The symbol `$\ntriangleleft$'.}
+\endsetslot
+
+\setslot{nottriangleright}
+ \comment{The symbol `$\ntriangleright$'.}
+\endsetslot
+
+\setslot{notarrowleft}
+ \comment{The symbol `$\nleftarrow$'.}
+\endsetslot
+
+\setslot{notarrowright}
+ \comment{The symbol `$\nrightarrow$'.}
+\endsetslot
+
+\setslot{notdblarrowleft}
+ \comment{The symbol `$\nLeftarrow$'.}
+\endsetslot
+
+\setslot{notdblarrowright}
+ \comment{The symbol `$\nRightarrow$'.}
+\endsetslot
+
+\setslot{notdblarrowboth}
+ \comment{The symbol `$\nLeftrightarrow$'.}
+\endsetslot
+
+\setslot{notarrowboth}
+ \comment{The symbol `$\nleftrightarrow$'.}
+\endsetslot
+
+\setslot{dividemultiply}
+ \comment{The symbol `$\divideontimes$'.}
+\endsetslot
+
+\setslot{emptyset}
+ \comment{The symbol `$\varnothing$'.}
+\endsetslot
+
+\setslot{notexistential}
+ \comment{The symbol `$\nexists$'.}
+\endsetslot
+
+\setslot{Abbb}
+ \comment{The letter `$\mathbb{A}$'.}
+\endsetslot
+
+\setslot{Bbbb}
+ \comment{The letter `$\mathbb{B}$'.}
+\endsetslot
+
+\setslot{Cbbb}
+ \comment{The letter `$\mathbb{C}$'.}
+\endsetslot
+
+\setslot{Dbbb}
+ \comment{The letter `$\mathbb{D}$'.}
+\endsetslot
+
+\setslot{Ebbb}
+ \comment{The letter `$\mathbb{E}$'.}
+\endsetslot
+
+\setslot{Fbbb}
+ \comment{The letter `$\mathbb{F}$'.}
+\endsetslot
+
+\setslot{Gbbb}
+ \comment{The letter `$\mathbb{G}$'.}
+\endsetslot
+
+\setslot{Hbbb}
+ \comment{The letter `$\mathbb{H}$'.}
+\endsetslot
+
+\setslot{Ibbb}
+ \comment{The letter `$\mathbb{I}$'.}
+\endsetslot
+
+\setslot{Jbbb}
+ \comment{The letter `$\mathbb{J}$'.}
+\endsetslot
+
+\setslot{Kbbb}
+ \comment{The letter `$\mathbb{K}$'.}
+\endsetslot
+
+\setslot{Lbbb}
+ \comment{The letter `$\mathbb{L}$'.}
+\endsetslot
+
+\setslot{Mbbb}
+ \comment{The letter `$\mathbb{M}$'.}
+\endsetslot
+
+\setslot{Nbbb}
+ \comment{The letter `$\mathbb{N}$'.}
+\endsetslot
+
+\setslot{Obbb}
+ \comment{The letter `$\mathbb{O}$'.}
+\endsetslot
+
+\setslot{Pbbb}
+ \comment{The letter `$\mathbb{P}$'.}
+\endsetslot
+
+\setslot{Qbbb}
+ \comment{The letter `$\mathbb{Q}$'.}
+\endsetslot
+
+\setslot{Rbbb}
+ \comment{The letter `$\mathbb{R}$'.}
+\endsetslot
+
+\setslot{Sbbb}
+ \comment{The letter `$\mathbb{S}$'.}
+\endsetslot
+
+\setslot{Tbbb}
+ \comment{The letter `$\mathbb{T}$'.}
+\endsetslot
+
+\setslot{Ubbb}
+ \comment{The letter `$\mathbb{U}$'.}
+\endsetslot
+
+\setslot{Vbbb}
+ \comment{The letter `$\mathbb{V}$'.}
+\endsetslot
+
+\setslot{Wbbb}
+ \comment{The letter `$\mathbb{W}$'.}
+\endsetslot
+
+\setslot{Xbbb}
+ \comment{The letter `$\mathbb{X}$'.}
+\endsetslot
+
+\setslot{Ybbb}
+ \comment{The letter `$\mathbb{Y}$'.}
+\endsetslot
+
+\setslot{Zbbb}
+ \comment{The letter `$\mathbb{Z}$'.}
+\endsetslot
+
+\setslot{hatwide}
+ \nextlarger{hatwider}
+\endsetslot
+
+\setslot{hatwider}
+\endsetslot
+
+\setslot{tildewide}
+ \nextlarger{tildewider}
+\endsetslot
+
+\setslot{tildewider}
+\endsetslot
+
+\nextslot{96}
+
+\setslot{Finv}
+ \comment{The symbol `$\Finv$'.}
+\endsetslot
+
+\setslot{Gmir}
+ \comment{The symbol `$\Game$'.}
+\endsetslot
+
+\nextslot{102}
+
+\setslot{Omegainv}
+ \comment{The symbol `$\mho$'.}
+\endsetslot
+
+\setslot{eth}
+ \comment{The symbol `$\eth$'.}
+\endsetslot
+
+\setslot{equalorsimilar}
+ \comment{The symbol `$\eqsim$'.}
+\endsetslot
+
+\setslot{beth}
+ \comment{The symbol `$\beth$'.}
+\endsetslot
+
+\setslot{gimel}
+ \comment{The symbol `$\gimel$'.}
+\endsetslot
+
+\setslot{daleth}
+ \comment{The symbol `$\daleth$'.}
+\endsetslot
+
+\setslot{lessdot}
+ \comment{The symbol `$\lessdot$'.}
+\endsetslot
+
+\setslot{greaterdot}
+ \comment{The symbol `$\gtrdot$'.}
+\endsetslot
+
+\setslot{multicloseleft}
+ \comment{The symbol `$\ltimes$'.}
+\endsetslot
+
+\setslot{multicloseright}
+ \comment{The symbol `$\rtimes$'.}
+\endsetslot
+
+\setslot{shortbar} % was: barshort
+ \comment{The symbol `$\shortmid$'.}
+\endsetslot
+
+\setslot{shortparallel} % was: parallelshort
+ \comment{The symbol `$\shortparallel$'.}
+\endsetslot
+
+\setslot{integerdivide}
+ \comment{The symbol `$\smallsetminus$'.}
+\endsetslot
+
+\setslot{thicksimilar} % similar ???
+ \comment{The symbol `$\thicksim$'.}
+\endsetslot
+
+\setslot{thickapproxequal} % approxequal ???
+ \comment{The symbol `$\thickapprox$'.}
+\endsetslot
+
+\setslot{approxorequal}
+ \comment{The symbol `$\approxeq$'.}
+\endsetslot
+
+\setslot{followsorapproxeql} % was: followsorequal
+ \comment{The symbol `$\succapprox$'.}
+\endsetslot
+
+\setslot{precedesorapproxeql} % was: precedesorequal
+ \comment{The symbol `$\precapprox$'.}
+\endsetslot
+
+\setslot{archleftdown}
+ \comment{The symbol `$\curvearrowleft$'.}
+\endsetslot
+
+\setslot{archrightdown}
+ \comment{The symbol `$\curvearrowright$'.}
+\endsetslot
+
+\setslot{digamma}
+ \comment{The symbol `$\digamma$'.}
+\endsetslot
+
+\setslot{kappa1}
+ \comment{The symbol `$\varkappa$'.}
+\endsetslot
+
+\setslot{kbbb}
+ \comment{The symbol `$\Bbbk$'.}
+\endsetslot
+
+\setslot{hslash}
+ \comment{The symbol `$\hslash$'.}
+\endsetslot
+
+\setslot{hbar}
+ \comment{The symbol `$\hbar$'.}
+\endsetslot
+
+\setslot{suchthat} % was: epsiloninv
+ \comment{The symbol `$\backepsilon$'.}
+\endsetslot
+
+\endencoding
+
+
+\section{Changes}
+
+2001/01/10: File added to \textsf{fontinst} distribution, description
+of workaround for codingscheme bug in \texttt{msbm} fonts changed,
+intermediate variables for fontdimens 8--22 introduced, and some minor
+markup changes were made. (LH)
+
+\end{multicols}
+\end{document}
+
+
+
+
diff --git a/fonts/utilities/fontinst/inputs/mathetx/oml.etx b/fonts/utilities/fontinst/inputs/mathetx/oml.etx
new file mode 100644
index 0000000000..38ffb1f277
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/oml.etx
@@ -0,0 +1,627 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.921",
+%%% date = "2004-11-24",
+%%% time = "18:25:42 +01:00",
+%%% filename = "oml.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the old math italic encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\title{The \TeX\ math italic encoding vector}
+\author{Alan Jeffrey, Ulrik Vieth, Lars Hellstr\"om}
+\date{27 July 2002\\Version 1.921}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ math italic (OML) encoding.
+
+\showbranches
+\encoding
+
+\needsfontinstversion{1.917}
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH ITALIC}
+\setstr{encodingname}{TeXMathItalicEncoding}
+
+\setint{italicslant}{0}
+\setint{interword}{0} % interword space
+\setint{stretchword}{0} % interword stretch
+\setint{shrinkword}{0} % interword shrink
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+
+\setint{quad}{1000} % quad
+\setint{extraspace}{0} % extra space after .
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+
+
+\begincomment
+\section{The encoding}
+There are 128 glyphs in this encoding.
+\endcomment
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon}
+ \comment{The greek letter `$\Upsilon$' named `Upsilon1' by Adobe.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\setslot{alpha}
+ \comment{The greek letter `$\alpha$'.}
+\endsetslot
+
+\setslot{beta}
+ \comment{The greek letter `$\beta$'.}
+\endsetslot
+
+\setslot{gamma}
+ \comment{The greek letter `$\gamma$'.}
+\endsetslot
+
+\setslot{delta}
+ \comment{The greek letter `$\delta$'.}
+\endsetslot
+
+\setslot{epsilon1}
+ \comment{The greek letter `$\epsilon$'.}
+\endsetslot
+
+\setslot{zeta}
+ \comment{The greek letter `$\zeta$'.}
+\endsetslot
+
+\setslot{eta}
+ \comment{The greek letter `$\eta$'.}
+\endsetslot
+
+\setslot{theta}
+ \comment{The greek letter `$\theta$'.}
+\endsetslot
+
+\setslot{iota}
+ \comment{The greek letter `$\iota$'.}
+\endsetslot
+
+\setslot{kappa}
+ \comment{The greek letter `$\kappa$'.}
+\endsetslot
+
+\setslot{lambda}
+ \comment{The greek letter `$\lambda$'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The greek letter `$\mu$'.}
+\endsetslot
+
+\setslot{nu}
+ \comment{The greek letter `$\nu$'.}
+\endsetslot
+
+\setslot{xi}
+ \comment{The greek letter `$\xi$'.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The greek letter `$\pi$'.}
+\endsetslot
+
+\setslot{rho}
+ \comment{The greek letter `$\rho$'.}
+\endsetslot
+
+\setslot{sigma}
+ \comment{The greek letter `$\sigma$'.}
+\endsetslot
+
+\setslot{tau}
+ \comment{The greek letter `$\tau$'.}
+\endsetslot
+
+\setslot{upsilon}
+ \comment{The greek letter `$\upsilon$'.}
+\endsetslot
+
+\setslot{phi}
+ \comment{The greek letter `$\phi$'.}
+\endsetslot
+
+\setslot{chi}
+ \comment{The greek letter `$\chi$'.}
+\endsetslot
+
+\setslot{psi}
+ \comment{The greek letter `$\psi$'.}
+\endsetslot
+
+\setslot{omega}
+ \comment{The greek letter `$\omega$'.}
+\endsetslot
+
+\setslot{epsilon}
+ \comment{The greek letter `$\varepsilon$'.}
+\endsetslot
+
+\setslot{theta1}
+ \comment{The greek letter `$\vartheta$'.}
+\endsetslot
+
+\setslot{pi1}
+ \comment{The greek letter `$\varpi$', rather unfortunately named
+ `omega1' by Adobe.}
+\endsetslot
+
+\setslot{rho1}
+ \comment{The greek letter `$\varrho$'.}
+\endsetslot
+
+\setslot{sigma1}
+ \comment{The greek letter `$\varsigma$'.}
+\endsetslot
+
+\setslot{phi1}
+ \comment{The greek letter `$\varphi$'.}
+\endsetslot
+
+\setslot{harpoonleftup}
+ \comment{The harpoon symbol `$\leftharpoonup$',
+ named `arrowlefttophalf' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{harpoonleftdown}
+ \comment{The harpoon symbol `$\leftharpoondown$',
+ named `arrowleftbothalf' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{harpoonrightup}
+ \comment{The harpoon symbol `$\rightharpoonup$',
+ named `arrowrighttophalf' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{harpoonrightdown}
+ \comment{The harpoon symbol `$\rightharpoondown$',
+ named `arrowrightbothalf' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{hookrightchar}
+ \comment{The building block for `$\hookrightarrow$',
+ named `arrowhookleft' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{hookleftchar}
+ \comment{The building block for `$\hookleftarrow$',
+ named `arrowhookright' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{triangleright}
+ \comment{The triangle symbol `$\triangleright$'.}
+\endsetslot
+
+\setslot{triangleleft}
+ \comment{The triangle symbol `$\triangleleft$'.}
+\endsetslot
+
+\setslot{zerooldstyle}
+ \comment{The oldstyle digit zero `0'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The oldstyle digit one `1'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The oldstyle digit two `2'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The oldstyle digit three `3'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The oldstyle digit four `4'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The oldstyle digit five `5'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The oldstyle digit six `6'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The oldstyle digit seven `7'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The oldstyle digit eight `8'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The oldstyle digit nine `9'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The period `$.$'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `$,$'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forwards oblique `$/$'.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\setslot{star}
+ \comment{The star symbol `$\star$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differentiation symbol `$\partial$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `$\mathnormal{A}$'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `$\mathnormal{B}$'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `$\mathnormal{C}$'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `$\mathnormal{D}$'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `$\mathnormal{E}$'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `$\mathnormal{F}$'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `$\mathnormal{G}$'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `$\mathnormal{H}$'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `$\mathnormal{I}$'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `$\mathnormal{J}$'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `$\mathnormal{K}$'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `$\mathnormal{L}$'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `$\mathnormal{M}$'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `$\mathnormal{N}$'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `$\mathnormal{O}$'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `$\mathnormal{P}$'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `$\mathnormal{Q}$'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `$\mathnormal{R}$'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `$\mathnormal{S}$'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `$\mathnormal{T}$'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `$\mathnormal{U}$'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `$\mathnormal{V}$'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `$\mathnormal{W}$'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `$\mathnormal{X}$'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `$\mathnormal{Y}$'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `$\mathnormal{Z}$'.}
+\endsetslot
+
+\setslot{flat}
+ \comment{The flat musical symbol `$\flat$'.}
+\endsetslot
+
+\setslot{natural}
+ \comment{The natural musical symbol `$\natural$'.}
+\endsetslot
+
+\setslot{sharp}
+ \comment{The sharp musical symbol `$\sharp$'.}
+\endsetslot
+
+\setslot{slurbelow}
+ \comment{The slur symbol `$\smile$'.}
+\endsetslot
+
+\setslot{slurabove}
+ \comment{The slur symbol `$\frown$'.}
+\endsetslot
+
+\setslot{lscript}
+ \comment{The script letter `$\ell$'.}
+\endsetslot
+
+\setslot{a}
+ \comment{The letter `$\mathnormal{a}$'.}
+\endsetslot
+
+\setslot{b}
+ \comment{The letter `$\mathnormal{b}$'.}
+\endsetslot
+
+\setslot{c}
+ \comment{The letter `$\mathnormal{c}$'.}
+\endsetslot
+
+\setslot{d}
+ \comment{The letter `$\mathnormal{d}$'.}
+\endsetslot
+
+\setslot{e}
+ \comment{The letter `$\mathnormal{e}$'.}
+\endsetslot
+
+\setslot{f}
+ \comment{The letter `$\mathnormal{f}$'.}
+\endsetslot
+
+\setslot{g}
+ \comment{The letter `$\mathnormal{g}$'.}
+\endsetslot
+
+\setslot{h}
+ \comment{The letter `$\mathnormal{h}$'.}
+\endsetslot
+
+\setslot{i}
+ \comment{The letter `$\mathnormal{i}$'.}
+\endsetslot
+
+\setslot{j}
+ \comment{The letter `$\mathnormal{j}$'.}
+\endsetslot
+
+\setslot{k}
+ \comment{The letter `$\mathnormal{k}$'.}
+\endsetslot
+
+\setslot{l}
+ \comment{The letter `$\mathnormal{l}$'.}
+\endsetslot
+
+\setslot{m}
+ \comment{The letter `$\mathnormal{m}$'.}
+\endsetslot
+
+\setslot{n}
+ \comment{The letter `$\mathnormal{n}$'.}
+\endsetslot
+
+\setslot{o}
+ \comment{The letter `$\mathnormal{o}$'.}
+\endsetslot
+
+\setslot{p}
+ \comment{The letter `$\mathnormal{p}$'.}
+\endsetslot
+
+\setslot{q}
+ \comment{The letter `$\mathnormal{q}$'.}
+\endsetslot
+
+\setslot{r}
+ \comment{The letter `$\mathnormal{r}$'.}
+\endsetslot
+
+\setslot{s}
+ \comment{The letter `$\mathnormal{s}$'.}
+\endsetslot
+
+\setslot{t}
+ \comment{The letter `$\mathnormal{t}$'.}
+\endsetslot
+
+\setslot{u}
+ \comment{The letter `$\mathnormal{u}$'.}
+\endsetslot
+
+\setslot{v}
+ \comment{The letter `$\mathnormal{v}$'.}
+\endsetslot
+
+\setslot{w}
+ \comment{The letter `$\mathnormal{w}$'.}
+\endsetslot
+
+\setslot{x}
+ \comment{The letter `$\mathnormal{x}$'.}
+\endsetslot
+
+\setslot{y}
+ \comment{The letter `$\mathnormal{y}$'.}
+\endsetslot
+
+\setslot{z}
+ \comment{The letter `$\mathnormal{z}$'.}
+\endsetslot
+
+\setslot{dotlessi}
+ \comment{The dotless letter `$\imath$'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \comment{The dotless letter `$\jmath$'.}
+\endsetslot
+
+\setslot{weierstrass}
+ \comment{The Weierstrass P symbol `$\wp$'.}
+\endsetslot
+
+\setslot{vector}
+ \comment{The vector accent symbol `$\vec{x}$'.}
+\endsetslot
+
+\setslot{tie}
+ \comment{The tie accent symbol `\t oo'.}
+\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+
+29 Dec 1993, v\,1.30: Created file.
+
+03 Jan 1994, v\,1.301: Moved from ltugboat class to article.
+
+09 Jan 1994, v\,1.305: Renamed some glyphs to use the same glyph names
+ as Lucida New Math.
+
+10 Jun 1998, v\,1.800: Really use the same names as Lucida New Math.
+ Correct ordering of `flat', `natural', `sharp'.
+
+03 Oct 2000, v\,1.915: Minor markup changes (LH).
+
+06 Oct 2000, v\,1.915: Added \texttt{encodingname} (same as in
+ \texttt{texmital.enc}). (LH)
+
+27 Jul 2002, v\,1.921: Using \verb"\setfontdimen" for specifying
+ fontdimens. (LH)
+
+24 Nov 2004: Corrected typo (extra right brace). (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/oms.etx b/fonts/utilities/fontinst/inputs/mathetx/oms.etx
new file mode 100644
index 0000000000..9e139c1589
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/oms.etx
@@ -0,0 +1,678 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.929",
+%%% date = "2005-02-03",
+%%% time = "14:24:50 +01:00",
+%%% filename = "oms.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the old math symbol encoding as a TeX
+%%% font encoding file, for use with the fontinst
+%%% utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2004/11/24]
+
+\title{The \TeX\ math symbol encoding vector}
+\author{Alan Jeffrey, Ulrik Vieth}
+\date{3 February 2005\\Version 1.929}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ math symbol (OMS) encoding.
+
+\showbranches
+\encoding
+
+\needsfontinstversion{1.917}
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+\setstr{encodingname}{TeXMathSymbolEncoding}
+
+\setint{italicslant}{0}
+\setint{interword}{0}
+\setint{stretchword}{0}
+\setint{shrinkword}{0}
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+\setint{quad}{1000}
+\setint{extraspace}{0}
+
+
+\comment{The following font dimension defaults are taken from
+\texttt{cmsy10}.}
+
+\setint{num1}{677}
+\setint{num2}{394}
+\setint{num3}{444}
+\setint{denom1}{686}
+\setint{denom2}{345}
+\setint{sup1}{413}
+\setint{sup2}{363}
+\setint{sup3}{289}
+\setint{sub1}{150}
+\setint{sub2}{247}
+\setint{supdrop}{386}
+\setint{subdrop}{50}
+\setint{delim1}{2390}
+\setint{delim2}{1010}
+\setint{axisheight}{250}
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+\setfontdimen{8}{num1} % num 1
+\setfontdimen{9}{num2} % num 2
+\setfontdimen{10}{num3} % num 3
+\setfontdimen{11}{denom1} % denom 1
+\setfontdimen{12}{denom2} % denom 2
+\setfontdimen{13}{sup1} % sup 1
+\setfontdimen{14}{sup2} % sup 2
+\setfontdimen{15}{sup3} % sup 3
+\setfontdimen{16}{sub1} % sub 1
+\setfontdimen{17}{sub2} % sub 2
+\setfontdimen{18}{supdrop} % supdrop
+\setfontdimen{19}{subdrop} % subdrop
+\setfontdimen{20}{delim1} % delim 1
+\setfontdimen{21}{delim2} % delim 2
+\setfontdimen{22}{axisheight} % math axis height
+
+
+\begincomment
+\section{The encoding}
+There are 128 glyphs in this encoding.
+\endcomment
+
+\setslot{minus}
+ \comment{The subtraction symbol `$-$'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered dot symbol `$\cdot$'.
+ It is called `dotmath' in Adobe Symbol.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication symbol `$\times$'.}
+\endsetslot
+
+\setslot{asteriskmath}
+ \comment{The centered asterisk symbol `$*$'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division symbol `$\plaindiv$'.}
+\endsetslot
+
+\setslot{diamondmath}
+ \comment{The diamond symbol `$\diamond$'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus symbol `$\pm$'.}
+\endsetslot
+
+\setslot{minusplus}
+ \comment{The minus or plus symbol `$\mp$'.}
+\endsetslot
+
+\setslot{circleplus}
+ \comment{The circled plus symbol `$\oplus$'.}
+\endsetslot
+
+\setslot{circleminus}
+ \comment{The circled minus symbol `$\ominus$'.}
+\endsetslot
+
+\setslot{circlemultiply}
+ \comment{The circled multiplication symbol `$\otimes$'.}
+\endsetslot
+
+\setslot{circledivide}
+ \comment{The circled oblique symbol `$\oslash$'.}
+\endsetslot
+
+\setslot{circledot}
+ \comment{The circled dot symbol `$\odot$'.}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \comment{The large circle symbol `$\bigcirc$' used for building the
+ copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The circle symbol `$\circ$'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The bullet symbol `$\bullet$'.}
+\endsetslot
+
+\setslot{equivasymptotic}
+ \comment{The asymptotic equals symbol `$\asymp$'.}
+\endsetslot
+
+\setslot{equivalence}
+ \comment{The equivalence symbol `$\equiv$'.}
+\endsetslot
+
+\setslot{reflexsubset}
+ \comment{The subset or equals symbol `$\subseteq$'.}
+\endsetslot
+
+\setslot{reflexsuperset}
+ \comment{The superset or equals symbol `$\supseteq$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The less or equals symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The greater or equals symbol `$\geq$'.}
+\endsetslot
+
+\setslot{precedesequal}
+ \comment{The precedes or equals symbol `$\preceq$'.}
+\endsetslot
+
+\setslot{followsequal}
+ \comment{The follows or equals symbol `$\succeq$'.}
+\endsetslot
+
+\setslot{similar}
+ \comment{The similar symbol `$\sim$'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The approximate equality symbol `$\approx$'.}
+\endsetslot
+
+\setslot{propersubset}
+ \comment{The subset symbol `$\subset$'.}
+\endsetslot
+
+\setslot{propersuperset}
+ \comment{The superset symbol `$\supset$'.}
+\endsetslot
+
+\setslot{lessmuch}
+ \comment{The much less symbol `$\ll$'.}
+\endsetslot
+
+\setslot{greatermuch}
+ \comment{The much greater symbol `$\gg$'.}
+\endsetslot
+
+\setslot{precedes} % was curlyless
+ \comment{The precedes symbol `$\prec$'.}
+\endsetslot
+
+\setslot{follows} % was curlygreater
+ \comment{The follows symbol `$\succ$'.}
+\endsetslot
+
+\setslot{arrowleft}
+ \comment{The left arrow symbol `$\leftarrow$'.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{The right arrow symbol `$\rightarrow$'.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{The up arrow symbol `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{The down arrow symbol `$\downarrow$'.}
+\endsetslot
+
+\setslot{arrowboth}
+ \comment{The horizontal arrow symbol `$\leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownortheast}
+ \comment{The north-east arrow symbol `$\nearrow$'.}
+\endsetslot
+
+\setslot{arrowsoutheast}
+ \comment{The south-east arrow symbol `$\searrow$'.}
+\endsetslot
+
+\setslot{similarequal}
+ \comment{The similar or equal symbol `$\simeq$'.}
+\endsetslot
+
+\setslot{arrowdblleft}
+ \comment{The double left arrow symbol `$\Leftarrow$'.}
+\endsetslot
+
+\setslot{arrowdblright}
+ \comment{The double right arrow symbol `$\Rightarrow$'.}
+\endsetslot
+
+\setslot{arrowdblup}
+ \comment{The double up arrow symbol `$\Uparrow$'.}
+\endsetslot
+
+\setslot{arrowdbldown}
+ \comment{The double down arrow symbol `$\Downarrow$'.}
+\endsetslot
+
+\setslot{arrowdblboth}
+ \comment{The double horizontal arrow symbol `$\Leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownorthwest}
+ \comment{The north-west arrow symbol `$\nwarrow$'.}
+\endsetslot
+
+\setslot{arrowsouthwest}
+ \comment{The south-west arrow symbol `$\swarrow$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The proportional symbol `$\propto$'.}
+\endsetslot
+
+\setslot{prime}
+ \comment{The prime symbol `$\prime$'.}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{element}
+ \comment{The set membership symbol `$\in$'.}
+\endsetslot
+
+\setslot{owner}
+ \comment{The backwards set membership symbol `$\ni$'.}
+\endsetslot
+
+\setslot{triangle}
+ \comment{The upwards triangle symbol `$\bigtriangleup$'.}
+\endsetslot
+
+\setslot{triangleinv}
+ \comment{The downwards triangle symbol `$\bigtriangledown$'.}
+\endsetslot
+
+\setslot{negationslash}
+ \comment{The negation slash symbol, used to construct
+ negated relations or arrows such as `$\not=$'.}
+\endsetslot
+
+\setslot{mapstochar}
+ \comment{The maps to building block symbol `$\mapstochar$',
+ used to build `$\mapsto$'.}
+\endsetslot
+
+\setslot{universal}
+ \comment{The universal quantification symbol `$\forall$'.}
+\endsetslot
+
+\setslot{existential}
+ \comment{The existential quantification symbol `$\exists$'.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The negation symbol `$\plainneg$'.}
+\endsetslot
+
+\setslot{emptysetstress}
+ \comment{The `stressed' empty set symbol `$\emptyset$', which should
+ look like a zero with a slash. The `emptyset' symbol is a circle
+ with a slash.}
+\endsetslot
+
+\setslot{Rfraktur}
+ \comment{The upper case Fraktur R symbol `$\Re$'. It is called
+ `Rfractur' rather than `Rfraktur' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{Ifraktur}
+ \comment{The upper case Fraktur I symbol `$\Im$'. It is called
+ `Ifractur' rather than `Ifraktur' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{latticetop}
+ \comment{The inverted perpendicular symbol `$\top$'.}
+\endsetslot
+
+\setslot{perpendicular}
+ \comment{The perpendicular symbol `$\perp$'.}
+\endsetslot
+
+\setslot{aleph}
+ \comment{The aleph symbol `$\aleph$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The calligraphic letter `$\mathcal{A}$'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The calligraphic letter `$\mathcal{B}$'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The calligraphic letter `$\mathcal{C}$'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The calligraphic letter `$\mathcal{D}$'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The calligraphic letter `$\mathcal{E}$'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The calligraphic letter `$\mathcal{F}$'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The calligraphic letter `$\mathcal{G}$'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The calligraphic letter `$\mathcal{H}$'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The calligraphic letter `$\mathcal{I}$'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The calligraphic letter `$\mathcal{J}$'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The calligraphic letter `$\mathcal{K}$'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The calligraphic letter `$\mathcal{L}$'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The calligraphic letter `$\mathcal{M}$'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The calligraphic letter `$\mathcal{N}$'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The calligraphic letter `$\mathcal{O}$'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The calligraphic letter `$\mathcal{P}$'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The calligraphic letter `$\mathcal{Q}$'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The calligraphic letter `$\mathcal{R}$'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The calligraphic letter `$\mathcal{S}$'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The calligraphic letter `$\mathcal{T}$'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The calligraphic letter `$\mathcal{U}$'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The calligraphic letter `$\mathcal{V}$'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The calligraphic letter `$\mathcal{W}$'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The calligraphic letter `$\mathcal{X}$'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The calligraphic letter `$\mathcal{Y}$'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The calligraphic letter `$\mathcal{Z}$'.}
+\endsetslot
+
+\setslot{union}
+ \comment{The set union symbol `$\cup$'.}
+\endsetslot
+
+\setslot{intersection}
+ \comment{The set intersection symbol `$\cap$'.}
+\endsetslot
+
+\setslot{unionmulti}
+ \comment{The multiset union symbol `$\uplus$'.}
+\endsetslot
+
+\setslot{logicaland}
+ \comment{The meet symbol `$\wedge$'.}
+\endsetslot
+
+\setslot{logicalor}
+ \comment{The join symbol `$\vee$'.}
+\endsetslot
+
+\setslot{turnstileleft}
+ \comment{The turnstile symbol `$\vdash$'.}
+\endsetslot
+
+\setslot{turnstileright}
+ \comment{The backwards turnstile symbol `$\dashv$'.}
+\endsetslot
+
+\setslot{floorleft}
+ \comment{The left floor symbol `$\lfloor$'.}
+\endsetslot
+
+\setslot{floorright}
+ \comment{The right floor symbol `$\rfloor$'.}
+\endsetslot
+
+\setslot{ceilingleft}
+ \comment{The left ceiling symbol `$\lceil$'.}
+\endsetslot
+
+\setslot{ceilingright}
+ \comment{The right ceiling symbol `$\rceil$'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The left brace symbol `$\{$'.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The right brace symbol `$\}$'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The left angle bracket symbol `$\langle$'.
+ It is called `angbracketleft' in MathTime and Lucida,
+ but `angleleft' in Adobe Symbol.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The right angle bracket symbol `$\rangle$'.
+ It is called `angbracketright' in MathTime and Lucida,
+ but `angleleft' in Adobe Symbol.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The vertical bar symbol `$|$'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The parallel vertical bars symbol `$\parallel$'.}
+\endsetslot
+
+\setslot{arrowbothv}
+ \comment{The vertical arrows symbol `$\updownarrow$'.}
+\endsetslot
+
+\setslot{arrowdblbothv}
+ \comment{The double vertical arrows symbol `$\Updownarrow$'.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique symbol `$\backslash$'.}
+\endsetslot
+
+\setslot{wreathproduct}
+ \comment{The Wreath product symbol `$\wr$'.}
+\endsetslot
+
+\setslot{radicallow}
+ \comment{The lowered radical symbol `$\surd$'.}
+\endsetslot
+
+\setslot{coproduct}
+ \comment{The textstyle coproduct symbol `$\coprod$'.}
+\endsetslot
+
+\setslot{gradient}
+ \comment{The inverted Delta symbol `$\nabla$'.
+ It is also called `gradient' in MathTime and Lucida,
+ but `gradient' in Adobe Symbol.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The small integral symbol `$\plainint$'.}
+\endsetslot
+
+\setslot{unionsq}
+ \comment{The square union symbol `$\sqcup$'.}
+\endsetslot
+
+\setslot{intersectionsq}
+ \comment{The square intersection symbol `$\sqcap$'.}
+\endsetslot
+
+\setslot{subsetsqequal}
+ \comment{The square subset or equal symbol `$\sqsubseteq$'.}
+\endsetslot
+
+\setslot{supersetsqequal}
+ \comment{The square superset or equal symbol `$\sqsupseteq$'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section symbol `\S'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The dagger symbol `\dag'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger symbol `\ddag'.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph symbol `\P'.}
+\endsetslot
+
+\setslot{club}
+ \comment{The club suit symbol `$\clubsuit$'.}
+\endsetslot
+
+\setslot{diamond}
+ \comment{The diamond suit symbol `$\diamondsuit$'.}
+\endsetslot
+
+\setslot{heart}
+ \comment{The heart suit symbol `$\heartsuit$'.}
+\endsetslot
+
+\setslot{spade}
+ \comment{The spade suit symbol `$\spadesuit$'.}
+\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+29 Dec 1993, v1.30: Created file.
+
+03 Jan 1994, v1.301: Moved from ltugboat class to article.
+
+06 Jan 1994, v1.303: Corrected a fontdimen bug.
+
+08 Jan 1994, v1.304: Renamed radicallowered to radicallow and
+ perpendicularinverse to perpendicularinv.
+
+09 Jan 1994, v1.305: Renamed emptyset to emptysetstress, to distinguish
+ the geometric and the humanist emptyset symbols.
+ Renamed some glyphs to use the same glyph names
+ as Lucida New Math.
+
+10 Jun 1998, v1.800: Really use the same names as Lucida New Math.
+ `curlyless/greater' renamed to `precedes/follows'.
+
+06 Oct 2000, v1.915: Introduced intermediate variables for fontdimens
+ 8--22. Added \texttt{encodingname}. Updated markup.
+ (LH)
+
+27 Jul 2002, v1.921: Introduced intermediate variables also for
+ fontdimens 1--7. Switched to setting fontdimens
+ using \verb"\setfontdimen". (LH)
+
+24 Nov 2004, v1.928: Changed \verb"\neg" to \verb"\plainneg" for
+ `\texttt{logicalnot}'. (LH)
+
+3 Feb 2005, v1.929: Corrected typo in wreath product comment. (LH)
+ Pointed out by Giuseppe Toscano.
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/omx.etx b/fonts/utilities/fontinst/inputs/mathetx/omx.etx
new file mode 100644
index 0000000000..52af52af6d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/omx.etx
@@ -0,0 +1,731 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.921",
+%%% date = "2002-07-27",
+%%% time = "18:45:45 +02:00",
+%%% filename = "omx.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the old math extension encoding as
+%%% a TeX font encoding file, for use with the
+%%% fontinst utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2001/03/16]
+
+\title{The \TeX\ math extension encoding vector}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{27 July 2002\\Version 1.921}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ math extensions (\texttt{OMX})
+encoding.
+
+\showbranches
+\setslotcomment{The glyph `$\vcenter{\hbox{\slotexample}}$'.}
+\useexamplefont{cmex10}
+\encoding
+
+\needsfontinstversion{1.917}
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH EXTENSION}
+\setstr{encodingname}{TeXMathExtensionEncoding}
+
+\setint{italicslant}{0}
+\setint{interword}{0}
+\setint{stretchword}{0}
+\setint{shrinkword}{0}
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\Else
+ \setint{xheight}{500}
+\Fi
+\setint{quad}{1000}
+\setint{extraspace}{0}
+
+\comment{The following defaults are taken from \texttt{cmex10}.}
+
+\setint{defaultrulethickness}{40}
+\setint{bigopspacing1}{111}
+\setint{bigopspacing2}{167}
+\setint{bigopspacing3}{200}
+\setint{bigopspacing4}{600}
+\setint{bigopspacing5}{100}
+
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+\setfontdimen{8}{defaultrulethickness} % default rule thickness
+\setfontdimen{9}{bigopspacing1} % bigopspacing 1
+\setfontdimen{10}{bigopspacing2} % bigopspacing 2
+\setfontdimen{11}{bigopspacing3} % bigopspacing 3
+\setfontdimen{12}{bigopspacing4} % bigopspacing 4
+\setfontdimen{13}{bigopspacing5} % bigopspacing 5
+
+
+\begincomment
+\section{The encoding}
+There are 128 glyphs in this encoding.
+\endcomment
+
+\setslot{parenleftbig}
+ \nextlarger{parenleftBig}
+\endsetslot
+
+\setslot{parenrightbig}
+ \nextlarger{parenrightBig}
+\endsetslot
+
+\setslot{bracketleftbig}
+ \nextlarger{bracketleftBig}
+\endsetslot
+
+\setslot{bracketrightbig}
+ \nextlarger{bracketrightBig}
+\endsetslot
+
+\setslot{floorleftbig}
+ \nextlarger{floorleftBig}
+\endsetslot
+
+\setslot{floorrightbig}
+ \nextlarger{floorrightBig}
+\endsetslot
+
+\setslot{ceilingleftbig}
+ \nextlarger{ceilingleftBig}
+\endsetslot
+
+\setslot{ceilingrightbig}
+ \nextlarger{ceilingrightBig}
+\endsetslot
+
+\setslot{braceleftbig}
+ \nextlarger{braceleftBig}
+\endsetslot
+
+\setslot{bracerightbig}
+ \nextlarger{bracerightBig}
+\endsetslot
+
+\setslot{angleleftbig}
+ \nextlarger{angleleftBig}
+\endsetslot
+
+\setslot{anglerightbig}
+ \nextlarger{anglerightBig}
+\endsetslot
+
+\setslot{barex}
+ \varchar
+ \varrep{barex}
+ \endvarchar
+\endsetslot
+
+\setslot{bardblex}
+ \varchar
+ \varrep{bardblex}
+ \endvarchar
+\endsetslot
+
+\setslot{slashbig}
+ \nextlarger{slashBig}
+\endsetslot
+
+\setslot{backslashbig}
+ \nextlarger{backslashBig}
+\endsetslot
+
+\setslot{parenleftBig}
+ \nextlarger{parenleftbigg}
+\endsetslot
+
+\setslot{parenrightBig}
+ \nextlarger{parenrightbigg}
+\endsetslot
+
+\setslot{parenleftbigg}
+ \nextlarger{parenleftBigg}
+\endsetslot
+
+\setslot{parenrightbigg}
+ \nextlarger{parenrightBigg}
+\endsetslot
+
+\setslot{bracketleftbigg}
+ \nextlarger{bracketleftBigg}
+\endsetslot
+
+\setslot{bracketrightbigg}
+ \nextlarger{bracketrightBigg}
+\endsetslot
+
+\setslot{floorleftbigg}
+ \nextlarger{floorleftBigg}
+\endsetslot
+
+\setslot{floorrightbigg}
+ \nextlarger{floorrightBigg}
+\endsetslot
+
+\setslot{ceilingleftbigg}
+ \nextlarger{ceilingleftBigg}
+\endsetslot
+
+\setslot{ceilingrightbigg}
+ \nextlarger{ceilingrightBigg}
+\endsetslot
+
+\setslot{braceleftbigg}
+ \nextlarger{braceleftBigg}
+\endsetslot
+
+\setslot{bracerightbigg}
+ \nextlarger{bracerightBigg}
+\endsetslot
+
+\setslot{angleleftbigg}
+ \nextlarger{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightbigg}
+ \nextlarger{anglerightBigg}
+\endsetslot
+
+\setslot{slashbigg}
+ \nextlarger{slashBigg}
+\endsetslot
+
+\setslot{backslashbigg}
+ \nextlarger{backslashBigg}
+\endsetslot
+
+\setslot{parenleftBigg}
+ \nextlarger{parenlefttp}
+\endsetslot
+
+\setslot{parenrightBigg}
+ \nextlarger{parenrighttp}
+\endsetslot
+
+\setslot{bracketleftBigg}
+ \nextlarger{bracketlefttp}
+\endsetslot
+
+\setslot{bracketrightBigg}
+ \nextlarger{bracketrighttp}
+\endsetslot
+
+\setslot{floorleftBigg}
+ \nextlarger{bracketleftbt}
+\endsetslot
+
+\setslot{floorrightBigg}
+ \nextlarger{bracketrightbt}
+\endsetslot
+
+\setslot{ceilingleftBigg}
+ \nextlarger{bracketleftex}
+\endsetslot
+
+\setslot{ceilingrightBigg}
+ \nextlarger{bracketrightex}
+\endsetslot
+
+\setslot{braceleftBigg}
+ \nextlarger{bracelefttp}
+\endsetslot
+
+\setslot{bracerightBigg}
+ \nextlarger{bracerighttp}
+\endsetslot
+
+\setslot{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightBigg}
+\endsetslot
+
+\setslot{slashBigg}
+\endsetslot
+
+\setslot{backslashBigg}
+\endsetslot
+
+\setslot{slashBig}
+ \nextlarger{slashbigg}
+\endsetslot
+
+\setslot{backslashBig}
+ \nextlarger{backslashbigg}
+\endsetslot
+
+\setslot{parenlefttp}
+ \varchar
+ \vartop{parenlefttp}
+ \varbot{parenleftbt}
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrighttp}
+ \varchar
+ \vartop{parenrighttp}
+ \varbot{parenrightbt}
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketlefttp}
+ \varchar
+ \vartop{bracketlefttp}
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrighttp}
+ \varchar
+ \vartop{bracketrighttp}
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftbt}
+ \varchar
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightbt}
+ \varchar
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftex}
+ \varchar
+ \vartop{bracketlefttp}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightex}
+ \varchar
+ \vartop{bracketrighttp}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracelefttp}
+ \varchar
+ \vartop{bracelefttp}
+ \varmid{braceleftmid}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerighttp}
+ \varchar
+ \vartop{bracerighttp}
+ \varmid{bracerightmid}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftmid}
+ \varchar
+ \varrep{arrowvertex}
+ \comment{This extensible entry has nothing to do with the
+ \texttt{braceleftmid} glyph; instead this slot is used as a
+ placeholder for the large form of the `\(\arrowvert\)'
+ delimiter.}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightmid}
+ \varchar
+ \varrep{arrowvertexdbl}
+ \comment{This extensible entry has nothing to do with the
+ \texttt{bracerightmid} glyph; instead this slot is used as a
+ placeholder for the large form of the `\(\Arrowvert\)'
+ delimiter.}
+ \endvarchar
+\endsetslot
+
+\setslot{braceex}
+ \varchar
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowvertex}
+ \varchar
+ \vartop{arrowtp}
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftex}
+ \varchar
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightex}
+ \varchar
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{angleleftBig}
+ \nextlarger{angleleftbigg}
+\endsetslot
+
+\setslot{anglerightBig}
+ \nextlarger{anglerightbigg}
+\endsetslot
+
+\setslot{unionsqtext}
+ \nextlarger{unionsqdisplay}
+\endsetslot
+
+\setslot{unionsqdisplay}
+\endsetslot
+
+\setslot{contintegraltext}
+ \nextlarger{contintegraldisplay}
+\endsetslot
+
+\setslot{contintegraldisplay}
+\endsetslot
+
+\setslot{circledottext}
+ \nextlarger{circledotdisplay}
+\endsetslot
+
+\setslot{circledotdisplay}
+\endsetslot
+
+\setslot{circleplustext}
+ \nextlarger{circleplusdisplay}
+\endsetslot
+
+\setslot{circleplusdisplay}
+\endsetslot
+
+\setslot{circlemultiplytext}
+ \nextlarger{circlemultiplydisplay}
+\endsetslot
+
+\setslot{circlemultiplydisplay}
+\endsetslot
+
+\setslot{summationtext}
+ \nextlarger{summationdisplay}
+\endsetslot
+
+\setslot{producttext}
+ \nextlarger{productdisplay}
+\endsetslot
+
+\setslot{integraltext}
+ \nextlarger{integraldisplay}
+\endsetslot
+
+\setslot{uniontext}
+ \nextlarger{uniondisplay}
+\endsetslot
+
+\setslot{intersectiontext}
+ \nextlarger{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultitext}
+ \nextlarger{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalandtext}
+ \nextlarger{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalortext}
+ \nextlarger{logicalordisplay}
+\endsetslot
+
+\setslot{summationdisplay}
+\endsetslot
+
+\setslot{productdisplay}
+\endsetslot
+
+\setslot{integraldisplay}
+\endsetslot
+
+\setslot{uniondisplay}
+\endsetslot
+
+\setslot{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalordisplay}
+\endsetslot
+
+\setslot{coproducttext}
+ \nextlarger{coproductdisplay}
+\endsetslot
+
+\setslot{coproductdisplay}
+\endsetslot
+
+\setslot{hatwide}
+ \nextlarger{hatwider}
+\endsetslot
+
+\setslot{hatwider}
+ \nextlarger{hatwidest}
+\endsetslot
+
+\setslot{hatwidest}
+\endsetslot
+
+\setslot{tildewide}
+ \nextlarger{tildewider}
+\endsetslot
+
+\setslot{tildewider}
+ \nextlarger{tildewidest}
+\endsetslot
+
+\setslot{tildewidest}
+\endsetslot
+
+\setslot{bracketleftBig}
+ \nextlarger{bracketleftbigg}
+\endsetslot
+
+\setslot{bracketrightBig}
+ \nextlarger{bracketrightbigg}
+\endsetslot
+
+\setslot{floorleftBig}
+ \nextlarger{floorleftbigg}
+\endsetslot
+
+\setslot{floorrightBig}
+ \nextlarger{floorrightbigg}
+\endsetslot
+
+\setslot{ceilingleftBig}
+ \nextlarger{ceilingleftbigg}
+\endsetslot
+
+\setslot{ceilingrightBig}
+ \nextlarger{ceilingrightbigg}
+\endsetslot
+
+\setslot{braceleftBig}
+ \nextlarger{braceleftbigg}
+\endsetslot
+
+\setslot{bracerightBig}
+ \nextlarger{bracerightbigg}
+\endsetslot
+
+\setslot{radicalbig}
+ \nextlarger{radicalBig}
+\endsetslot
+
+\setslot{radicalBig}
+ \nextlarger{radicalbigg}
+\endsetslot
+
+\setslot{radicalbigg}
+ \nextlarger{radicalBigg}
+\endsetslot
+
+\setslot{radicalBigg}
+ \nextlarger{radicalbt}
+\endsetslot
+
+\setslot{radicalbt}
+ \varchar
+ \varbot{radicalbt}
+ \vartop{radicaltp}
+ \varrep{radicalvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{radicalvertex}
+\endsetslot
+
+\setslot{radicaltp}
+\endsetslot
+
+\setslot{arrowvertexdbl}
+ \varchar
+ \vartop{arrowdbltp}
+ \varbot{arrowdblbt}
+ \varrep{arrowvertexdbl}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowtp}
+ \varchar
+ \vartop{arrowtp}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowbt}
+ \varchar
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracehtipdownleft}
+\endsetslot
+
+\setslot{bracehtipdownright}
+\endsetslot
+
+\setslot{bracehtipupleft}
+\endsetslot
+
+\setslot{bracehtipupright}
+\endsetslot
+
+\setslot{arrowdbltp}
+ \varchar
+ \vartop{arrowdbltp}
+ \varrep{arrowvertexdbl}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowdblbt}
+ \varchar
+ \varbot{arrowdblbt}
+ \varrep{arrowvertexdbl}
+ \endvarchar
+\endsetslot
+
+\endencoding
+
+
+\section{Changes}
+
+\parindent=1em
+
+29 Dec 1993, v1.30: Created file.
+
+03 Jan 1994, v1.301:
+Moved from \texttt{ltugboat} to \texttt{article} class.
+
+04 Jan 1994, v1.302:
+Renamed \texttt{loweredradical} to \texttt{radicallow}.
+
+06 Jan 1994, v1.303: Corrected a fontdimen bug.
+
+09 Jan 1994, v1.305: Changed some names to use the same glyph names
+ as Lucida New Math.
+
+10 Oct 1997, v1.306:
+Ulrik Vieth found a bug in the varchar recipe for the
+\texttt{parenrightbt} slot.
+
+10 October 2000, v\,1.915:
+Introduced intermediate variables for fontdimens 8--13.
+Added \texttt{encodingname}. Added glyph examples.
+Markup updates. (LH)
+
+20 November 2000, v\,1.915:
+Changed glyph names \texttt{arrowdblvertex}, \texttt{hatwiderr}, and
+\texttt{tildewiderr} to \texttt{arrowvertexdbl}, \texttt{hatwidest},
+and \texttt{tildewidest} respectively to really use the same names as
+\texttt{texmext.enc} and Lucida New Math. (LH) Reported by Alejandro
+L\'{o}pez-Valencia.
+
+22 November 2000, v\,1.915:
+Added explanations of the \verb|\varchar| entries for
+\texttt{braceleftmid} and \texttt{bracerightmid}. (LH)
+
+27 July 2002, v\,1.921:
+Introduced intermediate variables for fontdimens 1--7.
+Using \verb"\setfontdimen". (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathetx/rsfs.etx b/fonts/utilities/fontinst/inputs/mathetx/rsfs.etx
new file mode 100644
index 0000000000..adfd02dd20
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathetx/rsfs.etx
@@ -0,0 +1,92 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Ulrik Vieth",
+%%% version = "1.801",
+%%% date = "29 June 1998",
+%%% time = "23:57:31 CEST",
+%%% filename = "rsfs.etx",
+%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%% URL = "http://www.thphy.uni-duesseldorf.de/~vieth/",
+%%% checksum = "22539 92 192 2580",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the encoding of Ralph Smith's Formal
+%%% Script font as a TeX font encoding file, for
+%%% use with the fontinst utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\useexamplefont{rsfs10}
+
+\title{Ralph Smith's Formal Script font encoding vector}
+\author{Ulrik Vieth}
+
+\begin{document}
+\maketitle
+
+\encoding
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{RAS SCRIPT}
+\setint{italicslant}{707}
+\setint{xheight}{233}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{\section{The encoding}}
+
+\nextslot{65}
+\setslotcomment{The Script letter `\slotexample'.}
+
+\setslot{A}\endsetslot
+\setslot{B}\endsetslot
+\setslot{C}\endsetslot
+\setslot{D}\endsetslot
+\setslot{E}\endsetslot
+\setslot{F}\endsetslot
+\setslot{G}\endsetslot
+\setslot{H}\endsetslot
+\setslot{I}\endsetslot
+\setslot{J}\endsetslot
+\setslot{K}\endsetslot
+\setslot{L}\endsetslot
+\setslot{M}\endsetslot
+\setslot{N}\endsetslot
+\setslot{O}\endsetslot
+\setslot{P}\endsetslot
+\setslot{Q}\endsetslot
+\setslot{R}\endsetslot
+\setslot{S}\endsetslot
+\setslot{T}\endsetslot
+\setslot{U}\endsetslot
+\setslot{V}\endsetslot
+\setslot{W}\endsetslot
+\setslot{X}\endsetslot
+\setslot{Y}\endsetslot
+\setslot{Z}\endsetslot
+
+\nextslot{127}
+\unsetslotcomment
+
+\setslot{tie}
+ \comment{The skewchar.}
+\endsetslot
+
+\endencoding
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathmtx/mathex.mtx b/fonts/utilities/fontinst/inputs/mathmtx/mathex.mtx
new file mode 100644
index 0000000000..73170fa7cf
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathmtx/mathex.mtx
@@ -0,0 +1,303 @@
+%%%========================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey and Lars Hellstr{\"o}m",
+%%% version = "1.915",
+%%% date = "20 November 2000",
+%%% time = "17:01:00 CEST",
+%%% filename = "mathex.mtx",
+%%% checksum = "",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "These are the extra glyphs needed for TeX
+%%% math fonts, used by the fontinst package.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%%========================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\title{The \texttt{fontinst} math symbol glyphs}
+\author{Alan Jeffrey\and Lars Hellstr\"om}
+\date{November 20, 2000}
+
+\showbranches
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \texttt{fontinst}
+package when generating math symbol fonts.
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.900}
+
+
+% \unfakable is a glyph which can't be faked.
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+\begincomment\medskip
+An \textbf{Unfakable} is a glyph which can't be faked. An
+``\textbf{Unfakable `\#1'}\,'' is equivalent to
+\begin{quotation}\unfakable{\#1}\end{quotation}
+
+\resetcommand\unfakable#1{\Aheading{Unfakable `#1'}}
+\endcomment
+
+
+% \extensible and \vextensible define a number of extensible glyphs.
+\setcommand\extensible#1{
+ \begincomment
+ \subsection{The `#1' extensible}%
+ \endcomment
+ \unfakable{#1}
+ \unfakable{#1tp}
+ \unfakable{#1mid}
+ \unfakable{#1bt}
+ \unfakable{#1ex}
+ \setglyph{#1big} \glyph{#1}{1000} \endsetglyph
+ \setglyph{#1Big} \glyph{#1big}{1000} \endsetglyph
+ \setglyph{#1bigg} \glyph{#1Big}{1000} \endsetglyph
+ \setglyph{#1Bigg} \glyph{#1bigg}{1000} \endsetglyph
+}
+
+\setcommand\vextensible#1{
+ \begincomment
+ \subsection{The `#1' extensible}%
+ \endcomment
+ \unfakable{#1}
+ \unfakable{#1tp}
+ \unfakable{#1mid}
+ \unfakable{#1bt}
+ \unfakable{#1vertex}
+ \setglyph{#1big} \glyph{#1}{1000} \endsetglyph
+ \setglyph{#1Big} \glyph{#1big}{1000} \endsetglyph
+ \setglyph{#1bigg} \glyph{#1Big}{1000} \endsetglyph
+ \setglyph{#1Bigg} \glyph{#1bigg}{1000} \endsetglyph
+}
+
+% \wideaccent defines a wide accent.
+\setcommand\wideaccent#1{
+ \begincomment
+ \subsection{The `#1' wide accents}%
+ \endcomment
+ \unfakable{#1}
+ \setglyph{#1wide} \glyph{#1}{1000} \endsetglyph
+ \setglyph{#1wider} \glyph{#1wide}{1000} \endsetglyph
+ \setglyph{#1widest} \glyph{#1wider}{1000} \endsetglyph
+}
+
+\comment{\textit{displayoperatorscale} is the difference in scale
+between a big and a display operator, exept for integrals, which have
+their own scale.}
+\setint{displayoperatorscale}{1200}
+\setint{integralscale}{1728}
+
+\ifisglyph{product}\then
+ \setint{textoperatorsize}{
+ \add{\height{product}}{\depth{product}}
+ }
+\Else
+ \setint{textoperatorsize}{1000}
+ % Default taken from cmex10.
+\Fi
+
+% \integral, \bigoperator and \biggoperator define operators.
+
+\setcommand\integral#1{
+ \begincomment
+ \subsection{The `#1' integrals}%
+ \endcomment
+ \unfakable{#1}
+ \setglyph{#1text} \glyph{#1}{1000} \endsetglyph
+ \setglyph{#1display} \glyph{#1text}{\int{integralscale}} \endsetglyph
+}
+
+\setcommand\bigoperator#1{
+ \begincomment
+ \subsection{The `#1' big operators}%
+ \endcomment
+ \unfakable{#1}
+ \setglyph{#1text} \glyph{#1}{1000} \endsetglyph
+ \setglyph{#1display} \glyph{#1text}{\int{displayoperatorscale}} \endsetglyph
+}
+
+\setcommand\biggoperator#1{
+ \begincomment
+ \subsection{The `#1' big operators}%
+ \endcomment
+ \unfakable{#1}
+ \setglyph{#1text}
+ \glyph{#1}{
+ \div{\mul{1000}{\int{textoperatorsize}}}
+ {\add{\height{#1}}{\depth{#1}}}
+ }
+ \endsetglyph
+ \setglyph{#1display}
+ \glyph{#1text}{\int{displayoperatorscale}}
+ \endsetglyph
+}
+
+
+\begincomment
+\section{Math extension glyphs}
+\endcomment
+
+\unfakable{bracketleftbt}
+\unfakable{bracketrightbt}
+\unfakable{bracketlefttp}
+\unfakable{bracketrighttp}
+
+\setglyph{floorleft}
+ \glyph{bracketleftbt}{1000}
+\endsetglyph
+
+\setglyph{floorright}
+ \glyph{bracketrightbt}{1000}
+\endsetglyph
+
+\setglyph{ceilingleft}
+ \glyph{bracketlefttp}{1000}
+\endsetglyph
+
+\setglyph{ceilingright}
+ \glyph{bracketrighttp}{1000}
+\endsetglyph
+
+\setglyph{bardbl}
+ \glyph{bar}{1000}
+ \glyph{bar}{1000}
+\endsetglyph
+
+\setglyph{barex}
+ \glyph{bar}{1000}
+\endsetglyph
+
+\setglyph{bardblex}
+ \glyph{bardbl}{1000}
+\endsetglyph
+
+\setglyph{arrowtp}
+ \glyph{arrowup}{1000}
+\endsetglyph
+
+\setglyph{arrowbt}
+ \glyph{arrowdown}{1000}
+\endsetglyph
+
+\setglyph{arrowdbltp}
+ \glyph{arrowdblup}{1000}
+\endsetglyph
+
+\setglyph{arrowdblbt}
+ \glyph{arrowdbldown}{1000}
+\endsetglyph
+
+\unfakable{tilde}
+
+\setglyph{hat}
+ \glyph{circumflex}{1000}
+\endsetglyph
+
+\unfakable{plus}
+\unfakable{union}
+
+\setglyph{unionmulti}
+ \push
+ \movert{\div{\sub{\width{union}}{\scale{\width{plus}}{700}}}{2}}
+ \moveup{\div{\width{plus}}{4}}
+ \glyph{plus}{700}
+ \pop
+ \glyph{union}{1000}
+\endsetglyph
+
+\extensible{parenleft}
+\extensible{parenright}
+\extensible{bracketleft}
+\extensible{bracketright}
+\extensible{braceleft}
+\extensible{braceright}
+\extensible{floorleft}
+\extensible{floorright}
+\extensible{ceilingleft}
+\extensible{ceilingright}
+\extensible{slash}
+\extensible{backslash}
+\extensible{angleleft}
+\extensible{angleright}
+
+\wideaccent{hat}
+\wideaccent{tilde}
+
+\vextensible{radical}
+\vextensible{arrow}
+\extensible{arrowdbl}
+\unfakable{arrowvertexdbl}
+
+\biggoperator{unionsq}
+\biggoperator{circledot}
+\biggoperator{circleplus}
+\biggoperator{circlemultiply}
+\biggoperator{unionmulti}
+\biggoperator{intersection}
+\biggoperator{union}
+\biggoperator{logicaland}
+\biggoperator{logicalor}
+
+\bigoperator{product}
+\bigoperator{summation}
+\bigoperator{coproduct}
+
+\integral{integral}
+\integral{contintegral}
+
+\begincomment
+\subsection{Horizontal braces}
+\endcomment
+
+\unfakable{bracehtipdownleft}
+\unfakable{bracehtipdownright}
+\unfakable{bracehtipupleft}
+\unfakable{bracehtipupright}
+
+\endmetrics
+
+
+\section{Changes}
+
+29 Dec 1993, v1.30: Created file.
+
+3 Jan 1994, v1.301: Renamed some of the glyphs, added fakes for
+\texttt{arrowverttp} and friends.
+
+8 Jan 1994, v1.304: Renamed \texttt{similareq} to \texttt{similarequal}.
+
+9 Jan 1994, v1.305: Renamed some glyphs to use the same names as Lucida
+New Math.
+
+16 October 2000, v\,1.915: Updated markup (made it a \LaTeXe\
+document!). (LH)
+
+20 November 2000, v\,1.915: Added test for whether the \texttt{product}
+glyph exists before setting the \textit{textoperatorsize}, using
+value corresponding to \texttt{cmex10} if it doesn't. Changed
+\verb|\wideaccent| to call the widest glyph \textellipsis\texttt{widest}
+instead of \textellipsis\texttt{widerr}. Changed glyph name
+\texttt{arrowdblvertex} to \texttt{arrowvertexdbl}. (LH) Reported by
+Alejandro L\'{o}pez-Valencia.
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/mathmtx/mathit.mtx b/fonts/utilities/fontinst/inputs/mathmtx/mathit.mtx
new file mode 100644
index 0000000000..67b7250378
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathmtx/mathit.mtx
@@ -0,0 +1,280 @@
+%%%========================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey",
+%%% version = "1.915",
+%%% date = "16 October 2000",
+%%% time = "17:30:00 CEST",
+%%% filename = "mathit.mtx",
+%%% checksum = "",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "These are the extra glyphs needed for TeX
+%%% math italic fonts, used by the fontinst package.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, ltugboat.sty",
+%%% }
+%%%========================================================================
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\title{The \texttt{fontinst} math italic glyphs}
+\author{Alan Jeffrey}
+\date{9 January 1994}
+
+%\address{School of Cognitive and Computing Sciences \\
+% University of Sussex \\
+% Falmer \\
+% Brighton \\
+% BN1 9QH \\
+% UK}
+%\netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \texttt{fontinst}
+package when generating math italic fonts.
+
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.30}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+\comment{\section{Math symbol glyphs}}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+\unfakable{alpha}
+\unfakable{beta}
+\unfakable{gamma}
+\unfakable{delta}
+\unfakable{zeta}
+\unfakable{eta}
+\unfakable{theta}
+\unfakable{iota}
+\unfakable{kappa}
+\unfakable{lambda}
+\unfakable{mu}
+\unfakable{nu}
+\unfakable{xi}
+\unfakable{pi}
+\unfakable{rho}
+\unfakable{sigma}
+\unfakable{tau}
+\unfakable{upsilon}
+\unfakable{phi}
+\unfakable{chi}
+\unfakable{psi}
+\unfakable{omega}
+\unfakable{epsilon}
+\unfakable{harpoonleftup}
+\unfakable{harpoonleftdown}
+\unfakable{harpoonrightup}
+\unfakable{harpoonrightdown}
+\unfakable{hookrightchar}
+\unfakable{hookleftchar}
+\unfakable{triangleright}
+\unfakable{triangleleft}
+\unfakable{period}
+\unfakable{comma}
+\unfakable{less}
+\unfakable{slash}
+\unfakable{greater}
+\unfakable{star}
+\unfakable{partialdiff}
+\unfakable{A}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+\unfakable{flat}
+\unfakable{sharp}
+\unfakable{natural}
+\unfakable{slurabove}
+\unfakable{slurbelow}
+\unfakable{lscript}
+\unfakable{a}
+\unfakable{b}
+\unfakable{c}
+\unfakable{d}
+\unfakable{e}
+\unfakable{f}
+\unfakable{g}
+\unfakable{h}
+\unfakable{i}
+\unfakable{j}
+\unfakable{k}
+\unfakable{l}
+\unfakable{m}
+\unfakable{n}
+\unfakable{o}
+\unfakable{p}
+\unfakable{q}
+\unfakable{r}
+\unfakable{s}
+\unfakable{t}
+\unfakable{u}
+\unfakable{v}
+\unfakable{w}
+\unfakable{x}
+\unfakable{y}
+\unfakable{z}
+\unfakable{dotlessi}
+\unfakable{dotlessj}
+\unfakable{weierstrass}
+\unfakable{tie}
+
+\unfakable{Upsilon}
+\setglyph{Upsilon1}
+ \glyph{Upsilon}{1000}
+\endsetglyph
+
+\setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+\endsetglyph
+
+\setglyph{theta1}
+ \glyph{theta}{1000}
+\endsetglyph
+
+\setglyph{pi1}
+ \ifisglyph{omega1}\then
+ \glyph{omega1}{1000}
+ \else
+ \glyph{pi}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{rho1}
+ \glyph{rho}{1000}
+\endsetglyph
+
+\setglyph{sigma1}
+ \glyph{sigma}{1000}
+\endsetglyph
+
+\setglyph{phi1}
+ \glyph{phi}{1000}
+\endsetglyph
+
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+
+\setglyph{zerooldstyle}
+ \glyph{zero}{1000}
+\endsetglyph
+
+\setglyph{oneoldstyle}
+ \glyph{one}{1000}
+\endsetglyph
+
+\setglyph{twooldstyle}
+ \glyph{two}{1000}
+\endsetglyph
+
+\setglyph{threeoldstyle}
+ \glyph{three}{1000}
+\endsetglyph
+
+\setglyph{fouroldstyle}
+ \glyph{four}{1000}
+\endsetglyph
+
+\setglyph{fiveoldstyle}
+ \glyph{five}{1000}
+\endsetglyph
+
+\setglyph{sixoldstyle}
+ \glyph{six}{1000}
+\endsetglyph
+
+\setglyph{sevenoldstyle}
+ \glyph{seven}{1000}
+\endsetglyph
+
+\setglyph{eightoldstyle}
+ \glyph{eight}{1000}
+\endsetglyph
+
+\setglyph{nineoldstyle}
+ \glyph{nine}{1000}
+\endsetglyph
+
+\unfakable{arrowright}
+
+\setglyph{vector}
+ \moveup{\int{xheight}}
+ \glyph{arrowright}{500}
+ \moveup{\neg{\int{xheight}}}
+\endsetglyph
+
+\endmetrics
+
+
+\section{Changes}
+
+29 Dec 1993, v1.30: Created file.
+
+3 Jan 1994, v1.301: Renamed \texttt{neutral} to \texttt{natural}.
+
+9 Jan 1994, v1.305:
+Renamed some glyphs to use the same names as Lucida New Math.
+
+16 October 2000, v\,1.915:
+Updated markup (made it a \LaTeXe\ document!). (LH)
+
+\end{document} \ No newline at end of file
diff --git a/fonts/utilities/fontinst/inputs/mathmtx/mathsy.mtx b/fonts/utilities/fontinst/inputs/mathmtx/mathsy.mtx
new file mode 100644
index 0000000000..30737d2a07
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/mathmtx/mathsy.mtx
@@ -0,0 +1,313 @@
+%%%========================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Alan Jeffrey",
+%%% version = "1.915",
+%%% date = "26 October 2000",
+%%% time = "11:36:00 CEST",
+%%% filename = "mathex.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "These are the extra glyphs needed for TeX
+%%% math extension fonts, used by the fontinst
+%%% package.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%%========================================================================
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[1999/11/04]
+
+\title{The \texttt{fontinst} math symbol glyphs}
+\author{Alan Jeffrey}
+\date{January 10, 1994}
+% \address{School of Cognitive and Computing Sciences \\
+% University of Sussex \\
+% Falmer \\
+% Brighton \\
+% BN1 9QH \\
+% UK}
+% \netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \texttt{fontinst}
+package when generating math symbol fonts.
+
+\raggedright
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.900}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+\begincomment
+\section{Math symbol glyphs}
+\endcomment
+
+\unfakable{minus}
+\unfakable{periodcentered}
+\unfakable{multiply}
+\unfakable{asteriskmath}
+\unfakable{divide}
+\unfakable{diamondmath}
+\unfakable{plusminus}
+\unfakable{minusplus}
+\unfakable{circleplus}
+\unfakable{circleminus}
+\unfakable{circlemultiply}
+\unfakable{circledivide}
+\unfakable{circledot}
+\unfakable{circlecopyrt}
+\unfakable{bullet}
+\unfakable{equivasymptotic}
+\unfakable{equivalence}
+\unfakable{reflexsubset}
+\unfakable{reflexsuperset}
+\unfakable{lessequal}
+\unfakable{greaterequal}
+\unfakable{precedesequal}
+\unfakable{followsequal}
+\unfakable{similar}
+\unfakable{approxequal}
+\unfakable{propersubset}
+\unfakable{propersuperset}
+\unfakable{curlyless}
+\unfakable{curlygreater}
+\unfakable{arrowleft}
+\unfakable{arrowright}
+\unfakable{arrowup}
+\unfakable{arrowdown}
+\unfakable{arrowboth}
+\unfakable{arrownortheast}
+\unfakable{arrowsoutheast}
+\unfakable{similarequal}
+\unfakable{arrowdblleft}
+\unfakable{arrowdblright}
+\unfakable{arrowdblup}
+\unfakable{arrowdbldown}
+\unfakable{arrowdblboth}
+\unfakable{arrownorthwest}
+\unfakable{arrowsouthwest}
+\unfakable{proportional}
+\unfakable{infinity}
+\unfakable{element}
+\unfakable{owner}
+\unfakable{triangle}
+\unfakable{triangleinv}
+\unfakable{slash}
+\unfakable{mapstochar}
+\unfakable{universal}
+\unfakable{existential}
+\unfakable{logicalnot}
+\unfakable{emptyset}
+\unfakable{Rfraktur}
+\unfakable{Ifraktur}
+\unfakable{perpendicular}
+\unfakable{latticetop}
+\unfakable{aleph}
+\unfakable{A}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+\unfakable{union}
+\unfakable{intersection}
+\unfakable{logicaland}
+\unfakable{logicalor}
+\unfakable{turnstileleft}
+\unfakable{turnstileright}
+\unfakable{braceleft}
+\unfakable{braceright}
+\unfakable{angleleft}
+\unfakable{angleright}
+\unfakable{bar}
+\unfakable{arrowbothv}
+\unfakable{arrowdblbothv}
+\unfakable{backslash}
+\unfakable{wreathproduct}
+\unfakable{coproduct}
+\unfakable{gradient}
+\unfakable{integral}
+\unfakable{unionsq}
+\unfakable{intersectionsq}
+\unfakable{subsetsqequal}
+\unfakable{supersetsqequal}
+\unfakable{section}
+\unfakable{dagger}
+\unfakable{daggerdbl}
+\unfakable{paragraph}
+\unfakable{club}
+\unfakable{diamond}
+\unfakable{heart}
+\unfakable{spade}
+
+\unfakable{degree}
+
+\setglyph{largedegree}
+ \glyph{degree}{
+ \div{\mul{1000}{\width{bullet}}}{\width{degree}}
+ }
+\endsetglyph
+
+\setglyph{openbullet}
+ \moveup{\sub{\height{bullet}}{\height{largedegree}}}
+ \glyph{largedegree}{1000}
+ \moveup{\sub{\height{largedegree}}{\height{bullet}}}
+\endsetglyph
+
+\unfakable{minute}
+
+\setglyph{prime}
+ \moveup{\sub{\height{bullet}}{\height{largedegree}}}
+ \glyph{minute}{\div{\mul{1000}{\width{bullet}}}{\width{degree}}}
+ \moveup{\sub{\height{largedegree}}{\height{bullet}}}
+\endsetglyph
+
+\unfakable{less}
+\unfakable{greater}
+
+\setglyph{lessmuch}
+ \glyph{less}{1000}
+ \movert{\scale{\width{less}}{-400}}
+ \glyph{less}{1000}
+\endsetglyph
+
+\setglyph{greatermuch}
+ \glyph{greater}{1000}
+ \movert{\scale{\width{greater}}{-400}}
+ \glyph{greater}{1000}
+\endsetglyph
+
+\unfakable{zero}
+
+\setglyph{emptysetstress}
+ \push
+ \movert{
+ \div{\sub{\width{zero}}{\width{slash}}}{2}
+ }
+ \moveup{
+ \div{
+ \sub{
+ \add{\height{zero}}{\depth{slash}}
+ }{
+ \add{\height{slash}}{\depth{zero}}
+ }
+ }{2}
+ }
+ \glyph{slash}{1000}
+ \pop
+ \glyph{zero}{1000}
+\endsetglyph
+
+\setglyph{unionmulti}
+ \push
+ \movert{\div{\sub{\width{union}}{\scale{\width{plus}}{700}}}{2}}
+ \moveup{\div{\width{plus}}{4}}
+ \glyph{plus}{700}
+ \pop
+ \glyph{union}{1000}
+\endsetglyph
+
+\unfakable{bracketleftbt}
+\unfakable{bracketrightbt}
+\unfakable{bracketlefttp}
+\unfakable{bracketrighttp}
+
+\setglyph{floorleft}
+ \glyph{bracketleftbt}{1000}
+\endsetglyph
+
+\setglyph{floorright}
+ \glyph{bracketrightbt}{1000}
+\endsetglyph
+
+\setglyph{ceilingleft}
+ \glyph{bracketlefttp}{1000}
+\endsetglyph
+
+\setglyph{ceilingright}
+ \glyph{bracketrighttp}{1000}
+\endsetglyph
+
+\setglyph{bardbl}
+ \glyph{bar}{1000}
+ \glyph{bar}{1000}
+\endsetglyph
+
+\unfakable{radical}
+\unfakable{radicalex}
+
+\setglyph{radicallow}
+ \moveup{\sub{\add{\height{radicalex}}{\depth{radicalex}}}{\height{radical}}}
+ \glyph{radical}{1000}
+ \moveup{\sub{\height{radical}}{\int{underlinethickness}}}
+\endsetglyph
+
+\setglyph{negationslash}
+ \push
+ \movert{\div{\sub{\width{arrowright}}{\width{slash}}}{2}}
+ \glyph{slash}{1000}
+ \pop
+\endsetglyph
+
+\endmetrics
+
+\section{Changes}
+
+
+29 Dec 1993, v1.30: Created file.
+
+3 Jan 1994, v1.301: Renamed some of the glyphs, added fakes for
+\texttt{arrowverttp} and friends.
+
+8 Jan 1994, v1.304: Renamed \texttt{similareq} to \texttt{similarequal}.
+
+9 Jan 1994, v1.305:
+Renamed some glyphs to use the same names as Lucida New Math.
+
+10 Jan 1994, v1.306: Split \texttt{mathsym.mtx} into \texttt{mathsy.mtx}
+(math symbols) and \texttt{mathex.mtx} (math extensions).
+
+16 October 2000, v\,1.915: Updated markup (made it a \LaTeXe\
+document!). (LH)
+
+\end{document}
+
diff --git a/fonts/utilities/fontinst/inputs/misc/csc2x.tex b/fonts/utilities/fontinst/inputs/misc/csc2x.tex
new file mode 100644
index 0000000000..092840e00d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/csc2x.tex
@@ -0,0 +1,118 @@
+%%
+%% This is file `csc2x.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ficonv.dtx (with options: `reglyphfigures,reglyphletters,glyphs')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: ficonv.dtx
+\renameglyph{Asmall}{a}
+\renameglyph{Bsmall}{b}
+\renameglyph{Csmall}{c}
+\renameglyph{Dsmall}{d}
+\renameglyph{Esmall}{e}
+\renameglyph{Fsmall}{f}
+\renameglyph{Gsmall}{g}
+\renameglyph{Hsmall}{h}
+\renameglyph{Ismall}{i}
+\renameglyph{Jsmall}{j}
+\renameglyph{Ksmall}{k}
+\renameglyph{Lsmall}{l}
+\renameglyph{Msmall}{m}
+\renameglyph{Nsmall}{n}
+\renameglyph{Osmall}{o}
+\renameglyph{Psmall}{p}
+\renameglyph{Qsmall}{q}
+\renameglyph{Rsmall}{r}
+\renameglyph{Ssmall}{s}
+\renameglyph{Tsmall}{t}
+\renameglyph{Usmall}{u}
+\renameglyph{Vsmall}{v}
+\renameglyph{Wsmall}{w}
+\renameglyph{Xsmall}{x}
+\renameglyph{Ysmall}{y}
+\renameglyph{Zsmall}{z}
+\renameglyph{zerooldstyle}{zero}
+\renameglyph{oneoldstyle}{one}
+\renameglyph{twooldstyle}{two}
+\renameglyph{threeoldstyle}{three}
+\renameglyph{fouroldstyle}{four}
+\renameglyph{fiveoldstyle}{five}
+\renameglyph{sixoldstyle}{six}
+\renameglyph{sevenoldstyle}{seven}
+\renameglyph{eightoldstyle}{eight}
+\renameglyph{nineoldstyle}{nine}
+\renameglyph{Acutesmall}{acute}
+\renameglyph{Brevesmall}{breve}
+\renameglyph{Caronsmall}{caron}
+\renameglyph{Cedillasmall}{cedilla}
+\renameglyph{Circumflexsmall}{circumflex}
+\renameglyph{Dieresissmall}{dieresis}
+\renameglyph{Dotaccentsmall}{dotaccent}
+\renameglyph{Gravesmall}{grave}
+\renameglyph{Hungarumlautsmall}{hungarumlaut}
+\renameglyph{Macronsmall}{macron}
+\renameglyph{Ogoneksmall}{ogonek}
+\renameglyph{Ringsmall}{ring}
+\renameglyph{Tildesmall}{tilde}
+\renameglyph{ampersandsmall}{ampersand}
+\renameglyph{centoldstyle}{cent}
+\renameglyph{dollaroldstyle}{dollar}
+\renameglyph{AEsmall}{ae}
+\renameglyph{Ethsmall}{eth}
+\renameglyph{Lslashsmall}{lslash}
+\renameglyph{Oslashsmall}{oslash}
+\renameglyph{OEsmall}{oe}
+\renameglyph{Thornsmall}{thorn}
+\renameglyph{Agravesmall}{agrave}
+\renameglyph{Egravesmall}{egrave}
+\renameglyph{Igravesmall}{igrave}
+\renameglyph{Ogravesmall}{ograve}
+\renameglyph{Ugravesmall}{ugrave}
+\renameglyph{Aacutesmall}{aacute}
+\renameglyph{Eacutesmall}{eacute}
+\renameglyph{Iacutesmall}{iacute}
+\renameglyph{Oacutesmall}{oacute}
+\renameglyph{Uacutesmall}{uacute}
+\renameglyph{Yacutesmall}{yacute}
+\renameglyph{Acircumflexsmall}{acircumflex}
+\renameglyph{Ecircumflexsmall}{ecircumflex}
+\renameglyph{Icircumflexsmall}{icircumflex}
+\renameglyph{Ocircumflexsmall}{ocircumflex}
+\renameglyph{Ucircumflexsmall}{ucircumflex}
+\renameglyph{Atildesmall}{atilde}
+\renameglyph{Ntildesmall}{ntilde}
+\renameglyph{Otildesmall}{otilde}
+\renameglyph{Adieresissmall}{adieresis}
+\renameglyph{Edieresissmall}{edieresis}
+\renameglyph{Idieresissmall}{idieresis}
+\renameglyph{Odieresissmall}{odieresis}
+\renameglyph{Ydieresissmall}{ydieresis}
+\renameglyph{Udieresissmall}{udieresis}
+\renameglyph{Aringsmall}{aring}
+\renameglyph{Ccedillasmall}{ccedilla}
+\renameglyph{Scaronsmall}{scaron}
+\renameglyph{Zcaronsmall}{zcaron}
+\killglyph{dotlessi}
+\renameglyph{FIsmall}{fi}
+\renameglyph{FLsmall}{fl}
+\renameglyph{SSsmall}{germandbls}
+\endinput
+%%
+%% End of file `csc2x.tex'.
diff --git a/fonts/utilities/fontinst/inputs/misc/csckrn2x.tex b/fonts/utilities/fontinst/inputs/misc/csckrn2x.tex
new file mode 100644
index 0000000000..91428e1a4d
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/csckrn2x.tex
@@ -0,0 +1,121 @@
+%%
+%% This is file `csckrn2x.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ficonv.dtx (with options: `reglyphfigures,reglyphletters')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: ficonv.dtx
+\renameglyph{Asmall}{a}
+\renameglyph{Bsmall}{b}
+\renameglyph{Csmall}{c}
+\renameglyph{Dsmall}{d}
+\renameglyph{Esmall}{e}
+\renameglyph{Fsmall}{f}
+\renameglyph{Gsmall}{g}
+\renameglyph{Hsmall}{h}
+\renameglyph{Ismall}{i}
+\renameglyph{Jsmall}{j}
+\renameglyph{Ksmall}{k}
+\renameglyph{Lsmall}{l}
+\renameglyph{Msmall}{m}
+\renameglyph{Nsmall}{n}
+\renameglyph{Osmall}{o}
+\renameglyph{Psmall}{p}
+\renameglyph{Qsmall}{q}
+\renameglyph{Rsmall}{r}
+\renameglyph{Ssmall}{s}
+\renameglyph{Tsmall}{t}
+\renameglyph{Usmall}{u}
+\renameglyph{Vsmall}{v}
+\renameglyph{Wsmall}{w}
+\renameglyph{Xsmall}{x}
+\renameglyph{Ysmall}{y}
+\renameglyph{Zsmall}{z}
+\renameglyph{zerooldstyle}{zero}
+\renameglyph{oneoldstyle}{one}
+\renameglyph{twooldstyle}{two}
+\renameglyph{threeoldstyle}{three}
+\renameglyph{fouroldstyle}{four}
+\renameglyph{fiveoldstyle}{five}
+\renameglyph{sixoldstyle}{six}
+\renameglyph{sevenoldstyle}{seven}
+\renameglyph{eightoldstyle}{eight}
+\renameglyph{nineoldstyle}{nine}
+\renameglyph{Acutesmall}{acute}
+\renameglyph{Brevesmall}{breve}
+\renameglyph{Caronsmall}{caron}
+\renameglyph{Cedillasmall}{cedilla}
+\renameglyph{Circumflexsmall}{circumflex}
+\renameglyph{Dieresissmall}{dieresis}
+\renameglyph{Dotaccentsmall}{dotaccent}
+\renameglyph{Gravesmall}{grave}
+\renameglyph{Hungarumlautsmall}{hungarumlaut}
+\renameglyph{Macronsmall}{macron}
+\renameglyph{Ogoneksmall}{ogonek}
+\renameglyph{Ringsmall}{ring}
+\renameglyph{Tildesmall}{tilde}
+\renameglyph{ampersandsmall}{ampersand}
+\renameglyph{centoldstyle}{cent}
+\renameglyph{dollaroldstyle}{dollar}
+\renameglyph{AEsmall}{ae}
+\renameglyph{Ethsmall}{eth}
+\renameglyph{Lslashsmall}{lslash}
+\renameglyph{Oslashsmall}{oslash}
+\renameglyph{OEsmall}{oe}
+\renameglyph{Thornsmall}{thorn}
+\renameglyph{Agravesmall}{agrave}
+\renameglyph{Egravesmall}{egrave}
+\renameglyph{Igravesmall}{igrave}
+\renameglyph{Ogravesmall}{ograve}
+\renameglyph{Ugravesmall}{ugrave}
+\renameglyph{Aacutesmall}{aacute}
+\renameglyph{Eacutesmall}{eacute}
+\renameglyph{Iacutesmall}{iacute}
+\renameglyph{Oacutesmall}{oacute}
+\renameglyph{Uacutesmall}{uacute}
+\renameglyph{Yacutesmall}{yacute}
+\renameglyph{Acircumflexsmall}{acircumflex}
+\renameglyph{Ecircumflexsmall}{ecircumflex}
+\renameglyph{Icircumflexsmall}{icircumflex}
+\renameglyph{Ocircumflexsmall}{ocircumflex}
+\renameglyph{Ucircumflexsmall}{ucircumflex}
+\renameglyph{Atildesmall}{atilde}
+\renameglyph{Ntildesmall}{ntilde}
+\renameglyph{Otildesmall}{otilde}
+\renameglyph{Adieresissmall}{adieresis}
+\renameglyph{Edieresissmall}{edieresis}
+\renameglyph{Idieresissmall}{idieresis}
+\renameglyph{Odieresissmall}{odieresis}
+\renameglyph{Ydieresissmall}{ydieresis}
+\renameglyph{Udieresissmall}{udieresis}
+\renameglyph{Aringsmall}{aring}
+\renameglyph{Ccedillasmall}{ccedilla}
+\renameglyph{Scaronsmall}{scaron}
+\renameglyph{Zcaronsmall}{zcaron}
+\killglyph{dotlessi}
+\killglyph{fi}
+\killglyph{fl}
+\killglyph{germandbls}
+\offmtxcommand\setscaledrawglyph
+\offmtxcommand\setglyph
+\resetcommand\iftokeep#1\then{\ifnum 0<#1}
+\endinput
+%%
+%% End of file `csckrn2x.tex'.
diff --git a/fonts/utilities/fontinst/inputs/misc/glyphbox.mtx b/fonts/utilities/fontinst/inputs/misc/glyphbox.mtx
new file mode 100644
index 0000000000..223504d54e
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/glyphbox.mtx
@@ -0,0 +1,62 @@
+\relax
+
+\documentclass{article}
+\usepackage{fontdoc}
+
+\begin{document}
+
+\title{\texttt{glyphbox.mtx}: showing metric boxes of glyphs}
+\author{Lars Hellstr\"om}
+\date{July 2003}
+\maketitle
+
+\begin{abstract}
+ This file redefines the \verb|\setscaledrawglyph| command to make a
+ thin ($5$ AFM units) frame lining the inside of the metric box of
+ the glyph. This is can be useful when debugging commands for
+ building glyphs, as it gives graphic account of the glyph metrics.
+ Use \verb|\oncommand\setscaledrawglyph| or the \texttt{glyphon.mtx}
+ file to restore the normal command definition.
+\end{abstract}
+
+
+\begin{verbatim}
+
+\metrics
+
+\needsfontinstversion{1.914}
+
+
+\offcommand\setscaledrawglyph
+
+\resetcommand\setscaledrawglyph#1#2#3#4#5#6#7#8#9{%
+ \csname saved-\string\setscaledrawglyph\endcsname
+ {#1/raw}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
+ \setglyph{#1}%
+ \push
+ \moveup{\neg{#8}}%
+ \glyphrule{5}{\add{#7}{#8}}%
+ \push
+ \ifnumber{#9}{>}{0}\then
+ \moveup{\add{#7}{#8}}%
+ \glyphrule{\add{\sub{#6}{5}}{#9}}{5}%
+ \else
+ \moveup{\add{#7}{#8}}%
+ \glyphrule{\sub{#6}{10}}{5}%
+ \fi
+ \pop
+ \glyphrule{\sub{#6}{10}}{5}%
+ \glyphrule{5}{\add{#7}{#8}}%
+ \pop
+ \glyph{#1/raw}{1000}%
+ \endsetglyph
+}
+
+
+\endmetrics
+
+
+\end{verbatim}
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/misc/glyphoff.mtx b/fonts/utilities/fontinst/inputs/misc/glyphoff.mtx
new file mode 100644
index 0000000000..35c3a28716
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/glyphoff.mtx
@@ -0,0 +1,8 @@
+\relax
+
+\metrics
+
+\offcommand\setscaledrawglyph
+\let\setscaledrawglyph\setscalednotglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/inputs/misc/glyphon.mtx b/fonts/utilities/fontinst/inputs/misc/glyphon.mtx
new file mode 100644
index 0000000000..0746fd1298
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/glyphon.mtx
@@ -0,0 +1,7 @@
+\relax
+
+\metrics
+
+\oncommand\setscaledrawglyph
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/inputs/misc/kernoff.mtx b/fonts/utilities/fontinst/inputs/misc/kernoff.mtx
new file mode 100644
index 0000000000..776011328c
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/kernoff.mtx
@@ -0,0 +1,6 @@
+\relax
+\metrics
+
+\offcommand\setkern
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/inputs/misc/kernon.mtx b/fonts/utilities/fontinst/inputs/misc/kernon.mtx
new file mode 100644
index 0000000000..a864c14242
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/kernon.mtx
@@ -0,0 +1,6 @@
+\relax
+\metrics
+
+\oncommand\setkern
+
+\endmetrics
diff --git a/fonts/utilities/fontinst/inputs/misc/osf2x.tex b/fonts/utilities/fontinst/inputs/misc/osf2x.tex
new file mode 100644
index 0000000000..a9ed8a9866
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/misc/osf2x.tex
@@ -0,0 +1,37 @@
+%%
+%% This is file `osf2x.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ficonv.dtx (with options: `reglyphfigures,glyphs')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+%% maintenance team and any individual authors listed elsewhere in
+%% this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%%
+%%% From file: ficonv.dtx
+\renameglyph{zerooldstyle}{zero}
+\renameglyph{oneoldstyle}{one}
+\renameglyph{twooldstyle}{two}
+\renameglyph{threeoldstyle}{three}
+\renameglyph{fouroldstyle}{four}
+\renameglyph{fiveoldstyle}{five}
+\renameglyph{sixoldstyle}{six}
+\renameglyph{sevenoldstyle}{seven}
+\renameglyph{eightoldstyle}{eight}
+\renameglyph{nineoldstyle}{nine}
+\endinput
+%%
+%% End of file `osf2x.tex'.
diff --git a/fonts/utilities/fontinst/inputs/smbletx/digit2.etx b/fonts/utilities/fontinst/inputs/smbletx/digit2.etx
new file mode 100644
index 0000000000..4836285400
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smbletx/digit2.etx
@@ -0,0 +1,10 @@
+\relax
+\encoding
+
+% digit2.etx - This ETX file defines the \digit commands through
+\setcommand\digit#1{#1/2}
+% so that it will append a suffix /2 to the glyph name given.
+% Use this with a "suffix /2" clause in \installfont to select
+% digits from a different font that most of the glyphs.
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/smbletx/ts1.etx b/fonts/utilities/fontinst/inputs/smbletx/ts1.etx
new file mode 100644
index 0000000000..4a28ab1460
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smbletx/ts1.etx
@@ -0,0 +1,764 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Sebastian Rahtz and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.913",
+%%% date = "2005-05-24",
+%%% time = "15:45:46 +02:00",
+%%% filename = "ts1.etx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.thphy.uni-duesseldorf.de/~vieth/",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the TS1 encoding as a TeX font encoding
+%%% file, for use with the fontinst utility.
+%%% It implements the TeX text companion encoding.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage[TS1,T1]{fontenc}
+\usepackage{textcomp}
+\usepackage{fontdoc}
+
+\title{The \TeX\ text companion font encoding vector}
+\author{Sebastian Rahtz, Ulrik Vieth}
+\date{29 June 1998 \\
+Version 1.801}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX{} text companion encoding vector.
+
+\encoding
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX TEXT COMPANION SYMBOLS 1---TS1}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\setint{italicslant}{0}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{\int{interword}} % extra space after .
+
+
+\comment{\section{The encoding}}
+
+\nextslot{0}
+\setslot{capitalgrave}
+ \comment{The grave accent `\capitalgrave{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalacute}
+ \comment{The acute accent `\capitalacute{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalcircumflex}
+ \comment{The circumflex accent `\capitalcircumflex{}', intended for
+ use with capital letters.}
+\endsetslot
+
+\setslot{capitaltilde}
+ \comment{The tilde accent `\capitaltilde{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitaldieresis}
+ \comment{The umlaut or dieresis accent `\capitaldieresis{}',
+ intended for use with capital letters.}
+\endsetslot
+
+\setslot{capitalhungarumlaut}
+ \comment{The long Hungarian umlaut `\capitalhungarumlaut{}',
+ intended for use with capital letters.}
+\endsetslot
+
+\setslot{capitalring}
+ \comment{The ring accent `\capitalring{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalcaron}
+ \comment{The caron or h\'a\v cek accent `\capitalcaron{}', intended
+ for use with capital letters.}
+\endsetslot
+
+\setslot{capitalbreve}
+ \comment{The breve accent `\capitalbreve{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitalmacron}
+ \comment{The macron accent `\capitalmacron{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{capitaldotaccent}
+ \comment{The dot accent `\capitaldotaccent{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\capitalcedilla{}', intended for use
+ with capital letters.}
+\endsetslot
+
+\setslot{ogonek}
+ \comment{The ogonek accent `\capitalogonek{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\nextslot{13}
+\setslot{quotesinglbase}
+ \comment{A straight single quote mark on the baseline,
+ `\textquotestraightbase'.}
+\endsetslot
+
+\nextslot{18}
+\setslot{quotedblbase}
+ \comment{A straight double quote mark on the baseline,
+ `\textquotestraightdblbase'.}
+\endsetslot
+
+\nextslot{21}
+\setslot{twelveudash}
+ \comment{A 2/3~em dash, `\texttwelveudash'.}
+\endsetslot
+
+\setslot{threequartersemdash}
+ \comment{A 3/4~em dash, `\textthreequartersemdash'.}
+\endsetslot
+
+\nextslot{23}
+\setslot{capitalcompwordmark}
+ \comment{An invisible glyph, with zero width and depth, but the
+ height of capital letters.
+ It is used to stop ligaturing in words like `shelf{}ful'.}
+\endsetslot
+
+\nextslot{24}
+\setslot{arrowleft}
+ \comment{A left pointing arrow, `\textleftarrow', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{A right pointing arrow, `\textrightarrow', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{26}
+\setslot{tieaccentlowercase}
+ \comment{The original tie accent `\t{}', intended for use with
+ lowercase letters.}
+\endsetslot
+
+\setslot{tieaccentcapital}
+ \comment{The tie accent `\capitaltie{}', intended for use with
+ capital letters.}
+\endsetslot
+
+\setslot{newtieaccentlowercase}
+ \comment{A new tie accent `\newtie{}', intended for use with
+ lowercase letters.}
+\endsetslot
+
+\setslot{newtieaccentcapital}
+ \comment{A new tie accent `\capitalnewtie{}', intended for use
+ with capital letters.}
+\endsetslot
+
+\nextslot{31}
+\setslot{ascendercompwordmark}
+ \comment{An invisible glyph, with zero width and depth, but the
+ height of lowercase letters with ascenders.
+ It is used to stop ligaturing in words like `shelf{}ful'.}
+\endsetslot
+
+\nextslot{32}
+\setslot{blank}
+ \comment{The blank indicator `\textblank', similar to the letter `b'
+ with an oblique bar throgh the stem.}
+\endsetslot
+
+\nextslot{36}
+\setslot{dollar}
+ \comment{The dollar sign `\textdollar'.}
+\endsetslot
+
+\nextslot{39}
+\setslot{quotesingle}
+ \comment{A straight single quote mark, `\textquotesingle'.}
+\endsetslot
+
+\nextslot{42}
+\setslot{asteriskcentered}
+ \comment{The centered asterisk, `\textasteriskcentered'.}
+\endsetslot
+
+\nextslot{44}
+\setslot{comma}
+ \comment{The decimal comma `,'.}
+\endsetslot
+
+\nextslot{45}
+\setslot{hyphendbl}
+ \comment{An alternate double hyphen, `\textdblhyphen'.}
+\endsetslot
+
+\nextslot{46}
+\setslot{period}
+ \comment{The decimal point `.'.}
+\endsetslot
+
+\nextslot{47}
+\setslot{fraction}
+ \comment{The fraction slash `\textfractionsolidus'.}
+\endsetslot
+
+\nextslot{48}
+\setslot{zerooldstyle}
+ \comment{The oldstyle number `\oldstylenums{0}'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The oldstyle number `\oldstylenums{1}'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The oldstyle number `\oldstylenums{2}'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The oldstyle number `\oldstylenums{3}'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The oldstyle number `\oldstylenums{4}'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The oldstyle number `\oldstylenums{5}'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The oldstyle number `\oldstylenums{6}'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The oldstyle number `\oldstylenums{7}'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The oldstyle number `\oldstylenums{8}'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The oldstyle number `\oldstylenums{9}'.}
+\endsetslot
+
+\nextslot{60}
+\setslot{angbracketleft}
+ \comment{The opening angle bracket `\textlangle', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{61}
+\setslot{minus}
+ \comment{The subtraction sign `\textminus'.}
+\endsetslot
+
+\nextslot{62}
+\setslot{angbracketright}
+ \comment{The closing angle bracket `\textrangle', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{77}
+\setslot{Omegainv}
+ \comment{The inverted Ohm sign `\textmho', unavailable in most fonts.}
+\endsetslot
+
+\nextslot{79}
+\setslot{bigcircle}
+ \comment{A circle `\textbigcircle', big enough to enclose a letter
+ as in `\textcopyright' or `\textregistered'.}
+\endsetslot
+
+\nextslot{87}
+\setslot{Omega}
+ \comment{The upright Ohm sign `\textohm', unavailable in most fonts.
+ Even if it is available in Mac-encoded fonts, it isn't directly
+ accessible in the 8r or 8y encodings.}
+\endsetslot
+
+\nextslot{91}
+\setslot{openbracketleft}
+ \comment{The opening double square bracket `\textlbrackdbl',
+ unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{93}
+\setslot{openbracketright}
+ \comment{The closing double square bracket `\textrbrackdbl',
+ unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{94}
+\setslot{arrowup}
+ \comment{An upwards pointing arrow `\textuparrow', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{95}
+\setslot{arrowdown}
+ \comment{An downwards pointing arrow `\textdownarrow', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\nextslot{96}
+\setslot{asciigrave}
+ \comment{An ASCII-style grave `\textasciigrave'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\nextslot{98}
+\setslot{born}
+ \comment{The born symbol `\textborn', unavailable in most PostScript
+ fonts.}
+\endsetslot
+
+\nextslot{99}
+\setslot{divorced}
+ \comment{The divorced symbol `\textdivorced', unavailable in most
+ PostScript fonts.}
+\endsetslot
+
+\nextslot{100}
+\setslot{died}
+ \comment{The died symbol `\textdied', unavailable in most PostScript
+ fonts.}
+\endsetslot
+
+\nextslot{108}
+\setslot{leaf}
+ \comment{The leaf symbol `\textleaf', unavailable in most PostScript
+ fonts.}
+\endsetslot
+
+\nextslot{109}
+\setslot{married}
+ \comment{The married symbol `\textmarried', unavailable in most
+ PostScript fonts.}
+\endsetslot
+
+\nextslot{110}
+\setslot{musicalnote}
+ \comment{A musical note symbol `\textmusicalnote', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\nextslot{126}
+\setslot{tildelow}
+ \comment{A lowered tilde `\texttildelow'. In most PostScript fonts
+ it can be substituted by `asciitilde', while `\textasciitilde'
+ is supposed to be a raised `tilde'.}
+\endsetslot
+
+\nextslot{127}
+\setslot{hyphendblchar}
+ \comment{The glyph used for hyphenation in this font, which will
+ almost always be the same as `hyphendbl'.}
+\endsetslot
+
+\nextslot{128}
+\setslot{asciibreve}
+ \comment{An ASCII-style breve `\textasciibreve'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{asciicaron}
+ \comment{An ASCII-style caron `\textasciicaron'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{asciiacutedbl}
+ \comment{An ASCII-style double tick mark, `\textacutedbl'.}
+\endsetslot
+
+\setslot{asciigravedbl}
+ \comment{An ASCII-style double backtick mark, `\textgravedbl'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The single dagger `\textdagger'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger `\textdaggerdbl'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The double vertical bar `\textbardbl'.}
+\endsetslot
+
+\setslot{perthousand}
+ \comment{The perthousand sign `\textperthousand'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The centered bullet `\textbullet'.}
+\endsetslot
+
+\setslot{centigrade}
+ \comment{The degree centigrade symbol `\textcelsius'.}
+\endsetslot
+
+\setslot{dollaroldstyle}
+ \comment{An oldstyle dollar sign `\textdollaroldstyle'.}
+\endsetslot
+
+\setslot{centoldstyle}
+ \comment{An oldstyle cent sign `\textcentoldstyle'.}
+\endsetslot
+
+\setslot{florin}
+ \comment{The florin sign `\textflorin'.}
+\endsetslot
+
+\setslot{colonmonetary}
+ \comment{The Colon currency sign `\textcolonmonetary', similar to
+ a capital `C' with a vertical bar through the middle.}
+\endsetslot
+
+\setslot{won}
+ \comment{The Won currency sign `\textwon', similar to a capital `W'
+ with two horizontal bars.}
+\endsetslot
+
+\setslot{naira}
+ \comment{The Naira currency sign `\textnaira', similar to a
+ capital `N' with two horizontal bars.}
+\endsetslot
+
+\setslot{guarani}
+ \comment{The Guarani currency sign `\textguarani', similar to
+ a capital `G' with a vertical bar through the middle.}
+\endsetslot
+
+\setslot{peso}
+ \comment{The Peso currency sign `\textpeso', similar to a capital `P'
+ with a horizontal bar through the bowl or below the bowl.}
+\endsetslot
+
+\setslot{lira}
+ \comment{The Lira currency sign `\textlira', similar to a sterling
+ sign `\textsterling' with two horizontal bars.}
+\endsetslot
+
+\setslot{recipe}
+ \comment{The recipe symbol `\textrecipe', similar to a capital `R'
+ with an oblique bar through the tail.}
+\endsetslot
+
+\setslot{interrobang}
+ \comment{The interrobang symbol `\textinterrobang', similar to
+ a combination of an exclamation mark and a question mark.}
+\endsetslot
+
+\setslot{interrobangdown}
+ \comment{The inverted interrobang symbol `\textinterrobangdown',
+ similar to a combination of an inverted exclamation mark
+ and an inverted question mark.}
+\endsetslot
+
+\setslot{dong}
+ \comment{The Dong currency sign `\textdong', similar to a lowercase
+ `d' with a horizontal bar through the stem and another bar below
+ the letter.}
+\endsetslot
+
+\setslot{trademark}
+ \comment{The trademark sign `\texttrademark', similar to the raised
+ letters `TM'.}
+\endsetslot
+
+\setslot{pertenthousand}
+ \comment{The pertenthousand sign `\textpertenthousand', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\setslot{pilcrow}
+ \comment{The pilcrow mark `\textpilcrow', similar to a paragraph
+ mark `\textparagraph' with a single stem.}
+\endsetslot
+
+\setslot{baht}
+ \comment{The Baht currency sign `\textbaht', similar to a capital `B'
+ with a vertical bar through the middle.}
+\endsetslot
+
+\setslot{numero}
+ \comment{The numero sign `\textnumero', similar to the letter `N'
+ with a raised `o', unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{discount}
+ \comment{The discount sign `\textdiscount', similar to a stylized
+ percent sign, unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{estimated}
+ \comment{The estimated sign `\textestimated', similar to an enlarged
+ lowercase `e', unavailable in most PostScript fonts.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The centered open bullet `\textopenbullet'', unavailable
+ in most PostScript fonts.}
+\endsetslot
+
+\setslot{servicemark}
+ \comment{The service mark sign `\textservicemark', similar to the
+ raised letters `SM', unavailable in most PostScript fonts.}
+\endsetslot
+
+\nextslot{160}
+\setslot{quillbracketleft}
+ \comment{The opening quill bracket `\textlquill', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{quillbracketright}
+ \comment{The closing quill bracket `\textrquill', unavailable in
+ most PostScript fonts.}
+\endsetslot
+
+\setslot{cent}
+ \comment{The cent sign `\textcent'.}
+\endsetslot
+
+\setslot{sterling}
+ \comment{The British currency sign, `\textsterling'.}
+\endsetslot
+
+\setslot{currency}
+ \comment{The international currency sign, `\textcurrency'.}
+\endsetslot
+
+\setslot{yen}
+ \comment{The Japanese currency sign, `\textyen'.}
+\endsetslot
+
+\setslot{brokenbar}
+ \comment{A broken vertical bar, `\textbrokenbar', similar to
+ `\textbar' with a gap through the middle.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section mark `\textsection'.}
+\endsetslot
+
+\setslot{asciidieresis}
+ \comment{An ASCII-style dieresis `\textasciidieresis'. This is
+ supposed to be character by itself rather than an accents.}
+\endsetslot
+
+\setslot{copyright}
+ \comment{The copyright sign `\textcopyright', similar to a small
+ letter `C' enclosed by a circle.}
+\endsetslot
+
+\setslot{ordfeminine}
+ \comment{The raised letter `\textordfeminine'.}
+\endsetslot
+
+\setslot{copyleft}
+ \comment{The reversed copyright sign `\textcopyleft', similar to
+ a small reversed `C' enclosed by a circle.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The logical not sign `\textlnot'.}
+\endsetslot
+
+\setslot{circledP}
+ \comment{A small letter `P' enclosed by a circle, `\textcircledP',
+ unavailable in most fonts.}
+\endsetslot
+
+\setslot{registered}
+ \comment{The registered trademark sign `\textregistered', similar to
+ a small letter `R' enclosed by a circle.}
+\endsetslot
+
+\setslot{asciimacron}
+ \comment{An ASCII-style macron `\textasciimacron'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{degree}
+ \comment{The degree sign `\textdegree'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus sign `\textpm'.}
+\endsetslot
+
+\setslot{twosuperior}
+ \comment{The raised digit `\texttwosuperior'.}
+\endsetslot
+
+\setslot{threesuperior}
+ \comment{The raised digit `\textthreesuperior'.}
+\endsetslot
+
+\setslot{asciiacute}
+ \comment{An ASCII-style acute `\textasciiacute'. This is supposed
+ to be a character by itself rather than a combining accents.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The lowercase Greek letter `\textmu', intended for use as
+ a prefix `micro' in physical units.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph mark `\textparagraph'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered period `\textperiodcentered'.}
+\endsetslot
+
+\setslot{referencemark}
+ \comment{The reference mark `\textreferencemark', similar to
+ a combination of the `multiply' and `divide' symbols.}
+\endsetslot
+
+\setslot{onesuperior}
+ \comment{The raised digit `\textonesuperior'.}
+\endsetslot
+
+\setslot{ordmasculine}
+ \comment{The raised letter `\textordmasculine'.}
+\endsetslot
+
+\setslot{radical}
+ \comment{The radical sign `\textsurd', unavailable in most fonts.
+ Even if it is available in Mac-encoded fonts, it isn't directly
+ accessible in the 8r or 8y encodings.}
+\endsetslot
+
+\setslot{onequarter}
+ \comment{The fraction `\textonequarter'.}
+\endsetslot
+
+\setslot{onehalf}
+ \comment{The fraction `\textonehalf'.}
+\endsetslot
+
+\setslot{threequarters}
+ \comment{The fraction `\textthreequarters'.}
+\endsetslot
+
+\setslot{euro}
+ \comment{The European currency sign, similar to `\texteuro'.}
+\endsetslot
+
+
+\nextslot{214}
+\setslot{multiply}
+ \comment{The multiplication sign `\texttimes'.
+ This symbol was originally intended to be put into slot~215,
+ but ended up in this slot by mistake, at which time it was
+ considered too late to change it.}
+\endsetslot
+
+\nextslot{246}
+\setslot{divide}
+ \comment{The divison sign `\textdiv'.
+ This symbol was originally intended to be put into slot~247,
+ but ended up in this slot by mistake, at which time it was
+ onsidered too late to change it.}
+\endsetslot
+
+\endencoding
+
+\section{Notes on Euro fonts}
+
+The Euro$($Serif$\mid$Sans$\mid$Mono$)$ fonts downloadable from Adobe use
+the glyph name \texttt{Euro} (in slot 128) and the unencoded glyph
+\texttt{uni20AC}. It remains to be seen, what glyph names future
+releases of new fonts will be using.
+
+The proposed Latin 9 (ISO-8859-15) encoding uses the `\texttt{currency}'
+slot for the Euro sign, and changes a few other Latin 1 slots.
+
+
+\section{Changes}
+
+(UV, 1998/06/08):
+\begin{itemize}
+ \item brought up to symbol complement of EC/TC fonts 1.0,
+ adjusted symbol names to match LaTeX \texttt{ts1enc.def} v\,3.0.
+ \item added \texttt{capitalcompwordmark} and
+ \texttt{ascendercompwordmark}.
+ \item added new variant tie accents for lowercase and capitals.
+ \item added angle brackets and open square brackets
+ (glyph names based on Lucida New Math).
+ \item renamed \texttt{shortequals} to \texttt{hyphendbl} (in slot 42
+ and 127).
+ \item renamed \texttt{ohm} and \texttt{mho} to \texttt{Omega} and
+ \texttt{Omegainv}.
+ \item renamed \texttt{$($left$\mid$right$)$pointingarrow} to
+ \texttt{arrowleft} and \texttt{arrowright}.
+ \item added various symbols and currency signs, including
+ \texttt{euro}.
+\end{itemize}
+
+(LH, 2000/03/07):
+\begin{itemize}
+ \item
+ Added default setting of \texttt{italicslant} integer
+ (otherwise \texttt{ts1.etx} won't work with \verb|\generalpltomtx|).
+ \item
+ Moved changes list and some comments to end of file.
+\end{itemize}
+
+LH, 2000/11/12: Corrected command name, should be
+\verb|\textasciimacron|.
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/smbletx/ts1i.etx b/fonts/utilities/fontinst/inputs/smbletx/ts1i.etx
new file mode 100644
index 0000000000..1fee6defb7
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smbletx/ts1i.etx
@@ -0,0 +1,7 @@
+\relax
+
+\encoding
+
+\inputetx{ts1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/smbletx/ts1ij.etx b/fonts/utilities/fontinst/inputs/smbletx/ts1ij.etx
new file mode 100644
index 0000000000..1fee6defb7
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smbletx/ts1ij.etx
@@ -0,0 +1,7 @@
+\relax
+
+\encoding
+
+\inputetx{ts1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/smbletx/ts1j.etx b/fonts/utilities/fontinst/inputs/smbletx/ts1j.etx
new file mode 100644
index 0000000000..1fee6defb7
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smbletx/ts1j.etx
@@ -0,0 +1,7 @@
+\relax
+
+\encoding
+
+\inputetx{ts1}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/inputs/smblmtx/resetosf.mtx b/fonts/utilities/fontinst/inputs/smblmtx/resetosf.mtx
new file mode 100644
index 0000000000..bde54d55d8
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smblmtx/resetosf.mtx
@@ -0,0 +1,88 @@
+% Copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Ulrik Vieth",
+%%% version = "1.910",
+%%% date = "16 November 1999",
+%%% time = "23:01:44 CET",
+%%% filename = "resetosf.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "04190 88 254 2588",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a metrics file, for use with the
+%%% fontinst utility. It recodes glyph names
+%%% for oldstyle numerals read from AFM files
+%%% to glyph names with an `oldstyle' suffix.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{resetosf.mtx} metrics file}
+\author{Ulrik Vieth}
+\date{16 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{resetosf.mtx} metrics file, which is
+used to recode raw glyph names for oldstyle numerals to glyph names
+with an `oldstyle' suffix.
+
+\metrics
+
+\setcommand\oldstyleglyph#1{
+ \ifisglyph{#1}\then
+ \setglyph{#1oldstyle}\glyph{#1}{1000}
+ \endsetglyph
+ \fi
+}
+
+\setcommand\oldstylekerning#1{
+ \ifisglyph{#1}\then
+ \setleftrightkerning{#1oldstyle}{#1}{1000}
+ \fi
+}
+
+\oldstyleglyph{zero}
+\oldstyleglyph{one}
+\oldstyleglyph{two}
+\oldstyleglyph{three}
+\oldstyleglyph{four}
+\oldstyleglyph{five}
+\oldstyleglyph{six}
+\oldstyleglyph{seven}
+\oldstyleglyph{eight}
+\oldstyleglyph{nine}
+
+\oldstylekerning{zero}
+\oldstylekerning{one}
+\oldstylekerning{two}
+\oldstylekerning{three}
+\oldstylekerning{four}
+\oldstylekerning{five}
+\oldstylekerning{six}
+\oldstylekerning{seven}
+\oldstylekerning{eight}
+\oldstylekerning{nine}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/smblmtx/textcomp.mtx b/fonts/utilities/fontinst/inputs/smblmtx/textcomp.mtx
new file mode 100644
index 0000000000..c4c0a17f27
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smblmtx/textcomp.mtx
@@ -0,0 +1,561 @@
+% Copyright 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2003 the fontinst maintenance team and
+% any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Sebastian Rahtz and Ulrik Vieth and
+%%% Walter Schmidt and Lars Hellstr{\"o}m",
+%%% version = "1.926",
+%%% date = "2005-05-24",
+%%% time = "22:30:49 +02:00",
+%%% filename = "textcomp.mtx",
+%%% email = "w-a-schmidt@arcor.de",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a font metrics file, for use with the
+%%% fontinst utility. It provides the defaults
+%%% used to install the text companion glyphs.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}[2002/06/30] %Just guessing.
+
+\title{The \textsf{fontinst} text companion glyphs}
+\author{Sebastian Rahtz\and Ulrik Vieth\and Walter Schmidt\and
+ Lars Hellstr\"om}
+\date{Version 1.926}
+
+\showbranches
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the \textsf{fontinst}
+package when generating \TeX{} text companion fonts.
+
+\metrics
+
+\needsfontinstversion{1.917}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+% \unfakableaccent is similar, but has an ``accent position''
+\setcommand\unfakableaccent#1{
+ \setglyph{#1}
+ \moveup{\add{\int{xheight}}{50}}
+ \movert{\scale{\add{\int{xheight}}{50}}{\int{italicslant}}}
+ \glyphrule{250}{\sub{\sub{\int{ascender}}{\int{xheight}}}{100}}
+ \movert{\neg{\scale{\add{\int{xheight}}{50}}{\int{italicslant}}}}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% \fakeglyph replaces glyph #1 by #2, if it exists.
+
+\setcommand\fakeglyph#1#2{
+ \ifisglyph{#2}\then
+ \setglyph{#1}
+ \glyph{#2}{1000}
+ \endsetglyph
+ \Fi
+}
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setint{italicslant}{0}
+\setint{xheight}{\height{x}}
+\setint{capheight}{\height{A}}
+\setint{ascender}{\height{d}}
+\setint{descender}{\depth{g}}
+\setint{underlinethickness}{40}
+
+% Vertical symmetry axis. (WaS)
+\setint{vaxis}{\scale{\sub{\height{parenleft}}{\depth{parenleft}}}{500}}
+
+
+\begincomment
+\section{Oldstyle numerals}
+\endcomment
+
+\unfakable{zerooldstyle}
+\unfakable{oneoldstyle}
+\unfakable{twooldstyle}
+\unfakable{threeoldstyle}
+\unfakable{fouroldstyle}
+\unfakable{fiveoldstyle}
+\unfakable{sixoldstyle}
+\unfakable{sevenoldstyle}
+\unfakable{eightoldstyle}
+\unfakable{nineoldstyle}
+
+
+\begincomment
+\section{Capital accents}
+\endcomment
+
+\fakeglyph{capitalgrave}{grave}
+\fakeglyph{capitalacute}{acute}
+\fakeglyph{capitalcircumflex}{circumflex}
+\fakeglyph{capitaltilde}{tilde}
+\fakeglyph{capitaldieresis}{dieresis}
+\fakeglyph{capitalhungarumlaut}{hungarumlaut}
+\fakeglyph{capitalring}{ring}
+\fakeglyph{capitalcaron}{caron}
+\fakeglyph{capitalbreve}{breve}
+\fakeglyph{capitalmacron}{macron}
+\fakeglyph{capitaldotaccent}{dotaccent}
+\fakeglyph{capitalcedilla}{cedilla}
+\fakeglyph{capitalogonek}{ogonek}
+
+
+\begincomment
+\section{ASCII-style accents}
+\endcomment
+
+\ifisglyph{asciitilde}\then
+ \setglyph{tildelow}
+ \glyph{asciitilde}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{grave}\then
+ \setglyph{asciigrave}
+ \glyph{grave}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{breve}\then
+ \setglyph{asciibreve}
+ \glyph{breve}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{acute}\then
+ \setglyph{asciiacutedbl}
+ \ifisint{monowidth}\then
+ \glyph{acute}{1000}
+ \glyph{acute}{1000}
+ \Else
+ \glyph{acute}{1000}
+ \movert{\neg{\scale{\width{acute}}{333}}}
+ \glyph{acute}{1000}
+ \Fi
+ \endsetglyph
+\Fi
+
+\ifisglyph{grave}\then
+ \setglyph{asciigravedbl}
+ \ifisint{monowidth}\then
+ \glyph{grave}{1000}
+ \glyph{grave}{1000}
+ \Else
+ \glyph{grave}{1000}
+ \movert{\neg{\scale{\width{grave}}{333}}}
+ \glyph{grave}{1000}
+ \Fi
+ \endsetglyph
+\Fi
+
+\ifisglyph{caron}\then
+ \setglyph{asciicaron}
+ \glyph{caron}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{dieresis}\then
+ \setglyph{asciidieresis}
+ \glyph{dieresis}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{macron}\then
+ \setglyph{asciimacron}
+ \glyph{macron}{1000}
+ \endsetglyph
+\Fi
+
+\ifisglyph{acute}\then
+ \setglyph{asciiacute}
+ \glyph{acute}{1000}
+ \endsetglyph
+\Fi
+
+
+\begincomment
+\section{Glyphs}
+\endcomment
+
+\setglyph{capitalcompwordmark}
+ \glyphrule{0}{\int{capheight}}
+\endsetglyph
+\setint{capitalcompwordmark-spacing}{0}
+
+\setglyph{ascendercompwordmark}
+ \glyphrule{0}{\int{ascender}}
+\endsetglyph
+\setint{ascendercompwordmark-spacing}{0}
+
+% centers wrt/ vertical symmetry axis. (WaS)
+\ifisglyph{asterisk}\then
+ \resetglyph{asteriskcentered}
+ \moveup{\neg{\sub
+ {\scale{\sub{\height{asterisk}}{\depth{asterisk}}}{500}}
+ {\int{vaxis}}
+ }}
+ \glyph{asterisk}{1000}
+ \resetdepth{0}
+ \endresetglyph
+\Fi
+
+% assumes that 2/3em = 667 and \width{endash} about 500
+\ifisglyph{endash}\then
+ \setglyph{twelveudash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \Else
+ \glyph{endash}{1000}
+ \movert{\sub{667}{\mul{2}{\width{endash}}}}
+ \glyph{endash}{1000}
+ \comment{This assumes that \(2/3\,\mathrm{em} = 667\) and
+ that the leading of the \texttt{endash} is less than
+ \(333/4\).}
+ \Fi
+ \endsetglyph
+\Fi
+
+% assumes that 3/4em = 750 and \width{endash} = 500
+\ifisglyph{endash}\then
+ \setglyph{threequartersemdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \Else
+ \glyph{endash}{1000}
+ \movert{\sub{750}{\mul{2}{\width{endash}}}}
+ \glyph{endash}{1000}
+ \comment{This assumes that the leading of the
+ \texttt{endash} is less than \(250/4\).}
+ \Fi
+ \endsetglyph
+\Fi
+
+% questionable fakery, doesn't really work with all fonts
+\ifisglyph{bracketleft}\then
+ \setglyph{openbracketleft}
+ \ifisint{monowidth}\then
+ \glyph{bracketleft}{1000}
+ \glyph{bracketleft}{1000}
+ \Else
+ \glyph{bracketleft}{1000}
+ \movert{\neg{\scale{\width{bracketleft}}{666}}}
+ \glyph{bracketleft}{1000}
+ \comment{This is questionable fakery, which doesn't
+ really work with all fonts.}
+ \Fi
+ \endsetglyph
+\Fi
+
+% questionable fakery, doesn't really work with all fonts
+\ifisglyph{bracketright}\then
+ \setglyph{openbracketright}
+ \ifisint{monowidth}\then
+ \glyph{bracketright}{1000}
+ \glyph{bracketright}{1000}
+ \Else
+ \glyph{bracketright}{1000}
+ \movert{\neg{\scale{\width{bracketright}}{666}}}
+ \glyph{bracketright}{1000}
+ \comment{This is questionable fakery, which doesn't
+ really work with all fonts.}
+ \Fi
+ \endsetglyph
+\Fi
+
+% questionable fakery, doesn't really work with all fonts
+\ifisglyph{bar}\then
+ \setglyph{bardbl}
+ \ifisint{monowidth}\then
+ \glyph{bar}{1000}
+ \glyph{bar}{1000}
+ \Else
+ \glyph{bar}{1000}
+ \movert{\neg{\scale{\width{bar}}{333}}}
+ \glyph{bar}{1000}
+ \comment{This is questionable fakery, which doesn't
+ really work with all fonts.}
+ \Fi
+ \endsetglyph
+\Fi
+
+\ifareglyphs{degree,C}\then
+ \setglyph{centigrade}
+ \glyph{degree}{1000}
+ \glyph{C}{1000}
+ \resetitalic{\italic{C}}
+ \endsetglyph
+\Fi
+
+\ifisglyph{Euro}\then
+ \setglyph{euro}
+ \glyph{Euro}{1000}
+ \endsetglyph
+\Else\ifisglyph{C}\then
+ \setglyph{euro}
+ \movert{50}
+ \push
+ \moveup{\half{\sub{\height{C}}{\depth{C}}}}
+ \movert{\scale
+ {\half{\sub{\height{C}}{\depth{C}}}}
+ {\int{italicslant}}
+ }
+ \push
+ \moveup{\scale{\int{underlinethickness}}{1500}}
+ \glyphrule{\scale{\width{C}}{750}}{\int{underlinethickness}}
+ \pop
+ \moveup{\scale{\int{underlinethickness}}{-1500}}
+ \glyphrule{\scale{\width{C}}{700}}{\int{underlinethickness}}
+ \comment{That this bar is slightly shorter than the previous
+ is deliberate. That the two bars are not quite centered
+ around the vertical midpoint is also deliberate.}
+ \pop
+ \movert{50}
+ \comment{This movement should be much larger for some fonts,
+ e.g. New Century Schoolbook Italic, but experiments indicate
+ that it is independent of the italic slant.}
+ \glyph{C}{1000}
+ \resetitalic{\italic{C}}
+ \endsetglyph
+\Fi\Fi
+
+\ifareglyphs{question,exclam}\then
+ \setglyph{interrobang}
+ \push
+ \movert{\add{\half{\sub{\width{question}}{\width{exclam}}}}{-50}}
+ \comment{The extra $-50$ serves to separate the exclamation mark
+ from the right side of the question mark.}
+ \glyph{exclam}{1000}
+ \pop
+ \glyph{question}{1000}
+ \endsetglyph
+\Fi
+\ifareglyphs{questiondown,exclamdown}\then
+ \setglyph{interrobangdown}
+ \push
+ \movert{\add
+ {\half{\sub{\width{questiondown}}{\width{exclamdown}}}}
+ {50}
+ }
+ \glyph{exclamdown}{1000}
+ \pop
+ \glyph{questiondown}{1000}
+ \endsetglyph
+\Fi
+
+
+\begincomment
+\section{Unfakable glyphs}
+In general, every glyph is unfakable unless we know how to fake it.
+\endcomment
+
+\unfakableaccent{capitalgrave} % 8r,8y
+\unfakableaccent{capitalacute} % 8r,8y
+\unfakableaccent{capitalcircumflex} % 8r,8y
+\unfakableaccent{capitaltilde} % 8r,8y
+\unfakableaccent{capitaldieresis} % 8r,8y
+\unfakableaccent{capitalhungarumlaut} % 8r,8y
+\unfakableaccent{capitalring} % 8r,8y
+\unfakableaccent{capitalcaron} % 8r,8y
+\unfakableaccent{capitalbreve} % 8r,8y
+\unfakableaccent{capitalmacron} % 8r,8y
+\unfakableaccent{capitaldotaccent} % 8r,8y
+\unfakable{capitalcedilla} % 8r,8y
+\unfakable{capitalogonek} % 8r,8y
+\unfakable{quotesinglbase} % 8r,8y
+\unfakable{quotedblbase} % 8r,8y
+\unfakable{twelveudash} % faked 8r,8x
+\unfakable{threequartersemdash} % 8x (Adobe)
+\unfakable{arrowleft}
+\unfakable{arrowright}
+\unfakableaccent{tieaccentlowercase}
+\unfakableaccent{tieaccentcapital}
+\unfakableaccent{newtieaccentlowercase}
+\unfakableaccent{newtieaccentcapital}
+\unfakable{blank}
+\unfakable{dollar} % 8r,8y
+\unfakable{quotesingle} % 8r,8y
+\unfakable{asteriskcentered} % faked 8r,8y
+\unfakable{comma} % 8r,8y
+\unfakable{hyphendbl}
+\unfakable{period} % 8r,8y
+\unfakable{fraction} % 8r,8y
+\unfakable{angbracketleft}
+\unfakable{minus} % 8r,8y
+\unfakable{angbracketright}
+\unfakable{Omegainv}
+\unfakable{bigcircle}
+\unfakable{Omega}
+\unfakable{openbracketleft} % faked 8r,8y
+\unfakable{openbracketright} % faked 8r,8y
+\unfakable{arrowup}
+\unfakable{arrowdown}
+\unfakable{asciigrave} % 8r,8y
+\unfakable{born}
+\unfakable{divorced}
+\unfakable{died}
+\unfakable{leaf}
+\unfakable{married}
+\unfakable{musicalnote}
+\unfakable{tildelow} % 8r,8y
+\unfakable{hyphendblchar}
+\unfakable{asciibreve} % 8r,8y
+\unfakable{asciicaron} % 8r,8y
+\unfakable{asciiacutedbl} % faked 8r,8y
+\unfakable{asciigravedbl} % faked 8r,8y
+\unfakable{dagger} % 8r,8y
+\unfakable{daggerdbl} % 8r,8y
+\unfakable{bardbl} % faked 8r,8y
+\unfakable{perthousand} % 8r,8y
+\unfakable{bullet} % 8r,8y
+\unfakable{centigrade} % faked 8r,8y
+\unfakable{dollaroldstyle} % 8x (Adobe)
+\unfakable{centoldstyle} % 8x (Adobe)
+\unfakable{florin} % 8r,8y
+\unfakable{colonmonetary} % 8x (Adobe)
+\unfakable{won}
+\unfakable{naira}
+\unfakable{guarani}
+\unfakable{peso}
+\unfakable{lira} % 8x (URW)
+\unfakable{recipe}
+\unfakable{interrobang}
+\unfakable{interrobangdown}
+\unfakable{dong}
+\unfakable{trademark} % 8r,8y
+\unfakable{pertenthousand} % faked 8x
+\unfakable{pilcrow}
+\unfakable{baht}
+\unfakable{numero}
+\unfakable{discount}
+\unfakable{estimated}
+\unfakable{openbullet}
+\unfakable{servicemark}
+\unfakable{quillbracketleft}
+\unfakable{quillbracketright}
+\unfakable{cent} % 8r,8y
+\unfakable{sterling} % 8r,8y
+\unfakable{currency} % 8r,8y
+\unfakable{yen} % 8r,8y
+\unfakable{brokenbar} % 8r,8y
+\unfakable{section} % 8r,8y
+\unfakable{asciidieresis} % 8r,8y
+\unfakable{copyright} % 8r,8y
+\unfakable{ordfeminine} % 8r,8y
+\unfakable{copyleft}
+\unfakable{logicalnot} % 8r,8y
+\unfakable{circledP}
+\unfakable{registered} % 8r,8y
+\unfakable{asciimacron} % 8r,8y
+\unfakable{degree} % 8r,8y
+\unfakable{plusminus} % 8r,8y
+\unfakable{twosuperior} % 8r,8y
+\unfakable{threesuperior} % 8r,8y
+\unfakable{asciiacute} % 8r,8y
+\unfakable{mu} % 8r,8y
+\unfakable{paragraph} % 8r,8y
+\unfakable{periodcentered} % 8r,8y
+\unfakable{referencemark}
+\unfakable{onesuperior} % 8r,8y
+\unfakable{ordmasculine} % 8r,8y
+\unfakable{radical}
+\unfakable{onequarter} % 8r,8y
+\unfakable{onehalf} % 8r,8y
+\unfakable{threequarters} % 8r,8y
+\unfakable{euro} % faked 8r,8y
+\unfakable{multiply} % 8r,8y
+\unfakable{divide} % 8r,8y
+
+
+% \begincomment
+% \section{Accents}
+% \TeX's math accent-positioning requires accents to have zero depth,
+% but is that really relevant for these accents?
+% \endcomment
+%
+% \setcommand\zerodepth#1{
+% \ifisglyph{#1}\then
+% \resetglyph{#1}
+% \glyph{#1}{1000}
+% \resetdepth{0}
+% \endresetglyph
+% \Fi
+% }
+% \zerodepth{capitalgrave}
+% \zerodepth{capitalacute}
+% \zerodepth{capitalcircumflex}
+% \zerodepth{capitaltilde}
+% \zerodepth{capitaldieresis}
+% \zerodepth{capitalhungarumlaut}
+% \zerodepth{capitalring}
+% \zerodepth{capitalcaron}
+% \zerodepth{capitalbreve}
+% \zerodepth{capitalmacron}
+% \zerodepth{capitaldotaccent}
+
+\endmetrics
+
+\section{Changes}
+
+1999/10/25: Definition of \verb|\unfakable| simplified. (UV\&LH)
+Rationale: It is thoroughly confusing if the size of the black box
+created by \verb|\unfakable| depends on the metrics of an unencoded
+glyph that isn't accessible and therefore unavailable for all
+pratical purposes.
+
+February--March 2003: Explicitly centering the
+\texttt{asteriskcentered}. Introduced the \textit{vaxis} integer. (WaS)
+
+2003/07/09:
+Making use of \verb|\showbranches|, \verb|\begincomment|, and
+\verb|\endcomment|. Make definitions of \texttt{twelveudash} and
+\texttt{threequartersemdash} less dependent on the exact width of
+\texttt{endash}. Added a fake definition of \texttt{euro}. (LH)
+
+2003/07/10:
+Commented out section on zero-depth accents. (LH) Rationale:
+\texttt{TS1}-encoded fonts are, to my knowledge, never used in math.
+
+2003/07/13:
+Added some \verb|\resetitalic| commands. Added fakes for
+\texttt{interrobang} and \texttt{interrobangdown}. Using an
+\verb|\unfakableaccent| for unfakable accents. (LH) Rationale:
+The result becomes much more readable.
+
+\end{document}
diff --git a/fonts/utilities/fontinst/inputs/smblmtx/unsetnum.mtx b/fonts/utilities/fontinst/inputs/smblmtx/unsetnum.mtx
new file mode 100644
index 0000000000..c9f89b9ea9
--- /dev/null
+++ b/fonts/utilities/fontinst/inputs/smblmtx/unsetnum.mtx
@@ -0,0 +1,62 @@
+% Copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% ====================================================================
+%%% @TeX-font-metrics-file{
+%%% author = "Ulrik Vieth",
+%%% version = "1.910",
+%%% date = "16 November 1999",
+%%% time = "23:02:47 CET",
+%%% filename = "unsetnum.mtx",
+%%% email = "fontinst@cogs.susx.ac.uk",
+%%% URL = "http://www.tug.org/applications/fontinst/",
+%%% checksum = "24513 62 213 1967",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "metrics, raw, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is a metrics file, for use with the
+%%% fontinst utility. It makes glyph names
+%%% for numerals undefined.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\title{The \texttt{unsetnum.mtx} metrics file}
+\author{Ulrik Vieth}
+\date{16 November 1999 \\
+Version 1.910}
+
+\begin{document}
+\maketitle
+
+This document describes the \texttt{unsetnum.mtx} metrics file, which is
+used to make glyph names for numerals undefined.
+
+\metrics
+
+\unsetglyph{zero}
+\unsetglyph{one}
+\unsetglyph{two}
+\unsetglyph{three}
+\unsetglyph{four}
+\unsetglyph{five}
+\unsetglyph{six}
+\unsetglyph{seven}
+\unsetglyph{eight}
+\unsetglyph{nine}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst/latex/fontdoc.sty b/fonts/utilities/fontinst/latex/fontdoc.sty
new file mode 100644
index 0000000000..01d8efa1e6
--- /dev/null
+++ b/fonts/utilities/fontinst/latex/fontdoc.sty
@@ -0,0 +1,1390 @@
+%%
+%% This is file `fontdoc.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fibasics.dtx (with options: `doc')
+%% ficommon.dtx (with options: `doc')
+%% fimain.dtx (with options: `doc')
+%% fimapgen.dtx (with options: `doc')
+%%
+%% This is a generated file.
+%%
+%% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+%% hacked and maintained 1997, 1998 Sebastian Rahtz,
+%% copyright 1998, 1999, 2000, 2001 the fontinst maintenance team and any
+%% individual authors listed elsewhere in this file. All rights reserved.
+%%
+%% This file is part of the fontinst system version 1.9.
+%% -----------------------------------------------------
+%%
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.1 or, at your option, any later version.
+%% This file may also be distributed by itself provided it is unchanged
+%% and accompanied by some prominent file which states the location of
+%% the sources for the fontinst system, from which this file was
+%% generated.
+%%
+%%% From file: fibasics.dtx
+\def\fontinstversion{1.933}
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{fontdoc}
+[2007/01/23 v\fontinstversion\space
+ fontinst documentation package]
+\newcommand*\needsfontinstversion[1]{%
+ \ifFD@spec@
+ \comment{Automatic processing of this document as a data file
+ requires \textsf{fontinst} v\,#1 or higher.}%
+ \else
+ \Bheading{Needs fontinst v\thinspace#1}%
+ \fi
+}
+\newif\ifFD@spec@
+\FD@spec@false
+\DeclareOption{specification}{\FD@spec@true}
+\DeclareOption{hypertex}{
+ \providecommand*\FD@codepoint[1]{%
+ \uppercase{\edef\@tempa{#1}}%
+ \special{html:<a href="%
+ http://www.unicode.org/cgi-bin/refglyph?24-\@tempa
+ ">%
+ }%
+ \texttt{U+\@tempa}%
+ \special{html:</a>}%
+ }%
+}
+\DeclareOption{pdftex}{
+ \providecommand*\FD@codepoint[1]{%
+ \mbox{%
+ \uppercase{\edef\@tempa{#1}}%
+ \ifx \pdfstartlink\@undefined
+ \pdfannotlink
+ \else
+ \pdfstartlink
+ \fi attr {/Border [0 0 0]} user {%
+ /Subtype /Link /A <<%
+ /S /URI /URI (%
+ http://www.unicode.org/cgi-bin/refglyph?24-\@tempa
+ )%
+ >>}%
+ \textcolor{blue}{\texttt{U+\@tempa}}%
+ \pdfendlink
+ }%
+ }%
+ \AtEndOfPackage{\RequirePackage[pdftex]{color}}%
+}
+\InputIfFileExists{fontdoc.cfg}{%
+ \typeout{*************************************^^J%
+ * Local config file fontdoc.cfg used^^J%
+ *************************************}%
+}{}
+\ProcessOptions\relax
+\RequirePackage{amstext}
+\newcount\a@count
+\newcount\b@count
+\newdimen\a@dimen
+\def\x@cs#1#2{\expandafter#1\csname#2\endcsname}
+\def\FD@swap@two#1#2{#2#1}
+\newcommand\Aheading[1]{%
+ \par\pagebreak[1]\addvspace\medskipamount
+ \noindent\textbf{#1}\vadjust{\penalty200}\par
+}
+\newcommand\Bheading[1]{\par\noindent\textbf{#1}}
+\raggedbottom
+\ifdim 1sp>\lineskiplimit \lineskiplimit=0.5pt \fi
+\newcommand\plain{\texttt{plain}}
+\let\plainint=\int
+\let\plaindiv=\div
+\let\plainneg=\neg
+\let\plainmax=\max
+\let\plainmin=\min
+\newcount\list@item@counter
+\newcommand\TypesetList[8]{%
+ \begingroup
+ \list@item@counter=\z@
+ \def\do##1{\advance\list@item@counter\@ne}%
+ #8%
+ \ifcase \list@item@counter \or
+ \def\do##1{#1#7{##1}}%
+ \or
+ \def\do##1{%
+ \advance\list@item@counter\@ne
+ \ifnum \list@item@counter=\@ne #1\else #2\fi
+ #7{##1}%
+ }%
+ \else
+ \advance\list@item@counter\m@ne
+ \expandafter\def \expandafter\do \expandafter##\expandafter1%
+ \expandafter{\expandafter\ifnum \the\list@item@counter
+ =\list@item@counter
+ #4%
+ \else\ifnum \z@=\list@item@counter
+ #1%
+ \else
+ #3%
+ \fi\fi
+ \advance\list@item@counter\@ne
+ #7{##1}%
+ }%
+ \fi
+ \ifnum \z@=\list@item@counter
+ #6%
+ \else
+ \list@item@counter=\z@
+ #8%
+ #5%
+ \fi
+ \endgroup
+}
+\let\x@relax=\relax
+\def\eTeX#1{\do{\eTeXlogo\nolinebreak[3] v\,#1}}
+\def\eTeXlogo{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+\def\pdfTeX#1#2{%
+ \do{pdf\TeX\nolinebreak[3] v\,%
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+ \expandafter\FD@swap@two \expandafter.%
+ \fi
+ #1#2%
+ }
+}
+\def\needsTeXextension#1#2{%
+ \Bheading{Needs
+ \TypesetList{}{ or }{, }{, or }{}{(unspecified)}{\@firstofone}{#1}}%
+}
+\let\then=\iffalse
+\let\Else=\else
+\let\Fi=\fi
+\def\generic@if#1{\iftrue}
+\newcommand\showbranches{%
+ \let\generic@if=\branches@if
+ \let\then=\x@relax
+ \let\Else=\branches@else
+ \let\Fi=\branches@fi
+}
+\newcount\saved@slot@number
+\def\branches@if#1{%
+ \ifnum \branches@type=\tw@
+ \begin{IfBranchDummy}%
+ \textit{ if #1 then}%
+ \else
+ \par
+ \ifFD@tight@\else \addvspace\medskipamount \fi
+ \noindent\textit{If #1 then}%
+ \fi
+ \saved@slot@number=\slot@number
+ \gdef\branches@type{0}%
+ \let\par=\branches@par
+}
+\def\branches@else{%
+ \ifnum \branches@type=\z@
+ \textit{ relax else}%
+ \gdef\branches@type{1}%
+ \else
+ \par
+ \end{IfBranch}%
+ \noindent\textit{Else}%
+ \gdef\branches@type{2}%
+ \fi
+ \global\slot@number=\saved@slot@number
+ \let\par=\branches@par
+}
+\def\branches@fi{%
+ \ifnum \branches@type=\thr@@
+ \expandafter\end \expandafter{\@currenvir}%
+ \expandafter\gdef \expandafter\FD@saved@fis
+ \expandafter{\FD@saved@fis \space fi}%
+ \else
+ \end{IfBranch}%
+ \gdef\FD@saved@fis{Fi}%
+ \fi
+ \gdef\branches@type{3}%
+ \let\par=\branches@par
+}
+\gdef\branches@type{4}
+\def\branches@par{%
+ \@restorepar
+ \ifnum \branches@type=\thr@@
+ \noindent\textit{\FD@saved@fis}\par
+ \else
+ \begin{IfBranch}%
+ \fi
+ \gdef\branches@type{4}%
+}
+\newif\ifFD@tight@
+\newenvironment{IfBranch}{%
+ \list{}{%
+ \ifFD@tight@
+ \setlength\topsep{\z@skip}%
+ \@beginparpenalty=\z@
+ \@endparpenalty=\z@
+ \setlength\leftmargin{1em}%
+ \else
+ \setlength\topsep{\medskipamount}%
+ \@beginparpenalty=-10%
+ \@endparpenalty=\@beginparpenalty
+ \setlength\leftmargin{\z@}%
+ \fi
+ \setlength\partopsep{\z@skip}%
+ \setlength\itemsep{\z@skip}%
+ \setlength\parsep{\z@ plus\p@}%
+ \setlength\rightmargin{\z@}%
+ \setlength\itemindent{\z@}%
+ }%
+ \item[]%
+}{\endlist}
+\newenvironment{IfBranchDummy}{}{}
+\begingroup
+ \catcode`\,=13
+ \gdef\print@csep@list#1#2{%
+ $%
+ \ifnum "8000=\mathcode`\,\else
+ \mathchardef\private@comma=\mathcode`\,%
+ \mathcode`\,="8000\x@relax
+ \fi
+ #1%
+ \let,=\active@comma
+ #2%
+ $%
+ }
+\endgroup
+\def\active@comma{\private@comma \penalty\binoppenalty}
+\let\messagebreak\space
+\def\fontinsterror#1#2#3{%
+ \Bheading{Error} observed by #1:%
+ \begin{quote}#2.\end{quote}%
+}
+\def\fontinstwarning#1#2{
+ \Bheading{Warning} from #1:%
+ \begin{quote}#2.\end{quote}%
+}
+\let\fontinstwarningnoline=\fontinstwarning
+\def\fontinstinfo#1#2{
+ \Bheading{Info} from #1:%
+ \begin{quote}#2.\end{quote}%
+}
+%%% From file: ficommon.dtx
+\DeclareRobustCommand\PrintChar[1]{%
+ \leavevmode
+ \begingroup
+ \count@=#1\relax
+ \ifnum \@xxxii>\count@
+ \advance \count@ 64%
+ \InvisibleCharPrefix
+ \PrintVisibleChar\count@
+ \InvisibleCharSuffix
+ \else\ifnum 127>\count@
+ \PrintVisibleChar\count@
+ \else
+ \InvisibleCharPrefix
+ \ifnum 127=\count@ \PrintVisibleChar{63}\else
+ \@tempcnta=\count@
+ \divide \count@ \sixt@@n
+ \@tempcntb=\count@
+ \multiply \count@ \sixt@@n
+ \advance \@tempcnta -\count@
+ \advance \@tempcntb \ifnum 9<\@tempcntb 87\else 48\fi
+ \advance \@tempcnta \ifnum 9<\@tempcnta 87\else 48\fi
+ \char\@tempcntb \char\@tempcnta
+ \fi
+ \InvisibleCharSuffix
+ \fi\fi
+ \endgroup
+}
+\newcommand\InvisibleCharPrefix{%
+ \/\em
+ \PrintVisibleChar{`\^}\PrintVisibleChar{`\^}%
+}
+\newcommand\InvisibleCharSuffix{\/}
+\newcommand\PrintVisibleChar[1]{%
+ \ifcase #1%
+ \or\or\or\or\or\or\or\or \or\or\or\or\or\or\or\or
+ \or\or\or\or\or\or\or\or \or\or\or\or\or\or\or\or
+ % "20
+ \textvisiblespace \or!\or\textquotedbl \or\#\or\textdollar
+ \or\%\or\&\or\textquoteright\or(\or)\or*\or+\or,\or-\or.\or/%
+ \or % "30
+ 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or:\or;\or
+ \textless\or=\or\textgreater\or?%
+ \or % "40
+ @\or A\or B\or C\or D\or E\or F\or G\or
+ H\or I\or J\or K\or L\or M\or N\or O%
+ \or % "50
+ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\or [\or
+ \textbackslash \or]\or\textasciicircum \or\textunderscore
+ \or % "60
+ \textquoteleft \or a\or b\or c\or d\or e\or f\or g\or h\or
+ i\or j\or k\or l\or m\or n\or o%
+ \or % "70
+ p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\or
+ \textbraceleft \or\textbar \or\textbraceright \or\textasciitilde
+ \fi
+}
+\DeclareTextCommandDefault{\textvisiblespace}{%
+ \makebox[\fontdimen\tw@\font]{%
+ \hfil
+ \vrule \@height.3ex%
+ \vbox{\hrule \@width .66\fontdimen\tw@\font}%
+ \vrule \@height.3ex%
+ \hfil
+ }%
+}
+\def\FD@quoted@PrintChar#1{"\number#1"}
+\count@=32
+\begingroup
+ \catcode\z@=12\relax
+ \@firstofone{%
+\endgroup
+ \loop
+ \if \ifnum 11=\catcode\count@ 1\else \ifnum 12=\catcode\count@
+ 1\else 0\fi\fi 1%
+ \uccode\z@=\count@
+ \uppercase{\def\@tempa{^^@}}%
+ \else
+ \edef\@tempa{\noexpand\PrintChar{\the\count@}}%
+ \fi
+ \x@cs\let{FD@printable@\the\count@}=\@tempa
+ \advance \count@ \@ne
+ \ifnum 127>\count@ \repeat
+}
+\@namedef{FD@printable@34}{\PrintChar{34}} % "
+\@namedef{FD@printable@60}{\PrintChar{60}} % <
+\@namedef{FD@printable@62}{\PrintChar{62}} % >
+\def\MakePrintable#1#2#3{%
+ \begingroup
+ \toks@={}%
+ \escapechar=`\\%
+ \@tempswafalse
+ \FD@printable@#3\protect\FD@printable@
+ \toks@=\expandafter{%
+ \expandafter\let \csname if#2\expandafter\endcsname
+ \csname if\if@tempswa false\else true\fi \expandafter\endcsname
+ \expandafter\def \expandafter#1\expandafter{\the\toks@}%
+ }%
+ \expandafter\endgroup \the\toks@
+}
+\def\FD@printable@iii{%
+ \expandafter\futurelet \expandafter\@let@token
+ \expandafter\FD@printable@iv \string
+}
+\def\FD@printable@iv{%
+ \ifx \@let@token\@sptoken
+ \expandafter\FD@printable@v
+ \else
+ \expandafter\FD@printable@vi
+ \fi
+}
+\begingroup
+ \catcode`3=\catcode`a
+ \catcode`2=\catcode`a
+ \@firstofone{\gdef\FD@printable@v} {%
+ \toks@=\expandafter{\the \expandafter\toks@ \FD@printable@32}%
+ \FD@printable@
+ }
+\endgroup
+\def\FD@printable@vi#1{%
+ \if \ifnum `#1<\@xxxii 1\else \ifnum `#1>126 1\else 0\fi\fi 1%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\PrintChar \expandafter{\number`#1}%
+ }%
+ \else
+ \toks@=\expandafter{\the\expandafter\expandafter\expandafter\toks@
+ \csname FD@printable@\number`#1\endcsname}%
+ \fi
+ \FD@printable@
+}
+\def\FD@printable@{\futurelet\@let@token \FD@printable@i}
+\def\FD@printable@i{%
+ \csname FD@printable@%
+ \ifcat \noexpand\@let@token \noexpand\FD@printable@
+ \ifx \@let@token\protect ii\else vii\fi
+ \else iii\fi
+ \endcsname
+}
+\def\FD@printable@ii\protect#1{%
+ \@ifundefined{FD@printable\expandafter\zap@space\string#1 \@empty}{%
+ \PackageError{fontdoc}{Command \protect#1 not allowed in string}%
+ \@eha
+ }{\csname FD@printable\expandafter\zap@space\string#1 \@empty
+ \endcsname}%
+}
+\def\FD@printable@vii{\expandafter\FD@printable@vi \string}
+\expandafter\let
+ \csname FD@printable\string\FD@printable@\endcsname \@empty
+\@namedef{FD@printable\string\PrintChar}#1{%
+ \if \ifnum #1<\@xxxii 1\else \ifnum #1>126 1\else 0\fi\fi 1%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\PrintChar \expandafter{\number#1}%
+ }%
+ \else
+ \toks@=\expandafter{\the\expandafter\expandafter\expandafter\toks@
+ \csname FD@printable@\number#1\endcsname}%
+ \fi
+ \FD@printable@
+}
+\newcommand*\ExpandAndMakePrintable[3]{%
+ \protected@edef\@tempa{{#2}{#3}}%
+ \expandafter\MakePrintable \expandafter#1\@tempa
+}
+\def\FD@string@func#1#2{%
+ \relax
+ \ifnum \spacefactor=\@ne $\mkern1mu\else$\fi
+ \mathrm{#1}($%
+ #2%
+ \ifnum \spacefactor=\@ne $\mkern-1mu\else $\fi)\mkern1mu$%
+ \spacefactor=\@ne
+}
+\newcommand\TypesetStringExpression[1]{%
+ \protected@edef\@tempa{%
+ \noexpand\MakePrintable \noexpand\@tempa {FD@swa}{#1}%
+ }%
+ \@tempa
+ \FD@typeset@string{\@tempa}%
+}
+\def\FD@typeset@string#1{%
+ \mbox{%
+ \normalfont\ttfamily
+ \spacefactor=\@ne
+ #1%
+ \ifnum \spacefactor=\@ne $\mkern-1mu\m@th$\fi
+ }%
+}
+\let\ifFD@swa\iffalse
+\DeclareRobustCommand\str[1]{\FD@string@func{s}{#1}}
+\@namedef{FD@printable\string\str}#1{%
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \begingroup
+ \let\PrintChar=\FD@quoted@PrintChar
+ \if \ifFD@swa \@ifundefined{FD@s-\@tempa}{0}{1}\else 0\fi 1%
+ \expandafter
+ \endgroup
+ \csname FD@s-\@tempa\endcsname
+ \else
+ \endgroup
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\str \expandafter{\@tempa}}%
+ \@tempswatrue
+ \fi
+ \FD@printable@
+}
+\DeclareRobustCommand\strint[1]{\FD@string@func{int}{#1}}
+\@namedef{FD@printable\string\strint}#1{%
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \protected@edef\@tempa{%
+ \ifFD@swa \protect\FD@simple@int \else \strint \fi{\@tempa}%
+ }
+ \toks@=\expandafter{\the\expandafter\toks@ \@tempa}%
+ \@tempswatrue
+ \FD@printable@
+}
+\DeclareRobustCommand\macroparameter[1]{%
+ \gdef\FD@expression{\text{\normalfont\itshape\##1}}%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\z@
+ \FD@evaluate@false
+}
+\@namedef{FD@printable\string\macroparameter}#1{%
+ \toks@=\expandafter{\the\toks@\textrm{\emph{\##1}}}%
+ \@tempswatrue
+ \FD@printable@
+}
+\newcommand\TypesetIntegerExpression[1]{%
+ \protected@edef\@tempa{#1}%
+ \expandafter\FD@eval@expr \expandafter{\@tempa}%
+ \FD@expression
+}
+\newcount\FD@result
+\newcount\FD@bracket@level
+\def\FD@evaluate@true{\global\let\ifFD@evaluate@\iftrue}
+\def\FD@evaluate@false{\global\let\ifFD@evaluate@\iffalse}
+\FD@evaluate@false
+\def\FD@eval@expr#1{%
+ \expandafter\expandafter \expandafter\ifx
+ \expandafter\@car#1\x@relax\@nil \protect
+ #1%
+ \else\ifcat \expandafter\noexpand \@car#1\x@relax\@nil 0%
+ \global\FD@result=#1\x@relax
+ \xdef\FD@expression{\the\FD@result}%
+ \global\chardef\FD@priority=\ifnum \FD@result<\z@ 4\else 6\fi
+ \global\FD@bracket@level=\z@
+ \else
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \global\FD@bracket@level=\ifFD@swa\z@\else\@ne\fi
+ \protected@xdef\FD@expression{\protect\mbox{\texttt{\@tempa}}}%
+ \endgroup
+ \global\chardef\FD@priority=5%
+ \FD@evaluate@false
+ \fi\fi
+}
+\DeclareRobustCommand\add[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \protected@xdef\FD@expression{\@tempa+\FD@expression}%
+ \ifFD@evaluate@ \global\advance \FD@result \a@count \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\z@
+ \endgroup
+}
+\DeclareRobustCommand\sub[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{\@tempa-\FD@expression}%
+ \ifFD@evaluate@
+ \advance \a@count -\FD@result
+ \global\FD@result=\a@count
+ \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\z@
+ \endgroup
+}
+\def\FD@subexpression#1{${%
+ \advance \binoppenalty \FD@commapenalty
+ \advance \relpenalty \FD@commapenalty
+ \advance \FD@commapenalty \FD@commapenalty
+ $#1$}$%
+}
+\newcount\FD@commapenalty
+\FD@commapenalty=\binoppenalty
+\advance \FD@commapenalty \relpenalty
+\def\FD@bracket@expression{%
+ \protected@xdef\FD@expression{%
+ \ifcase\FD@bracket@level \or \protect\bigl \or \protect\Bigl \or
+ \protect\biggl \else \protect\Biggl \fi (%
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \or \protect\bigr \or \protect\Bigr \or
+ \protect\biggr \else \protect\Biggr \fi )%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+}
+\DeclareRobustCommand\int[1]{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \protected@xdef\FD@expression{%
+ \ifFD@swa
+ \text{\protect\FD@simple@int{\@tempa}}%
+ \else
+ \protect\FD@integer@func{int}{\@tempa}%
+ \fi
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\ifFD@swa\z@\else\@ne\fi
+ \FD@evaluate@false
+ \endgroup
+}
+\def\FD@simple@int#1{{\normalfont\itshape #1\/}}
+\def\FD@integer@func#1#2{%
+ \mathop{\mathrm{#1}{}}(\text{\FD@typeset@string{#2}})%
+}
+\DeclareRobustCommand\neg[1]{%
+ \FD@eval@expr{#1}%
+ \ifnum 5>\FD@priority \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{-\FD@expression}%
+ \global\chardef\FD@priority=4%
+ \ifFD@evaluate@ \global\FD@result=-\FD@result \fi
+}
+\DeclareRobustCommand\mul[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \let\FD@left@priority=\FD@priority
+ \FD@eval@expr{#2}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \if \ifnum \FD@left@priority=\@ne e%
+ \else\ifnum \FD@priority<\thr@@ e%
+ \else\ifodd \FD@priority i\else e\fi\fi\fi e%
+ \cdot
+ \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@ \global\multiply \FD@result \a@count \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifnum \FD@left@priority=\@ne 2%
+ \else\ifodd\FD@left@priority
+ \ifodd\FD@priority 5\else 3\fi
+ \else
+ \ifodd\FD@priority 4\else 2\fi
+ \fi\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \endgroup
+}
+\DeclareRobustCommand\div[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \ifnum 4>\FD@priority \FD@bracket@expression \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \ifcase\FD@bracket@level \or \protect\big \or \protect\Big \or
+ \protect\bigg \else \protect\Bigg \fi /%
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \divide \a@count \FD@result
+ \global\FD@result=\a@count
+ \fi
+ \global\chardef\FD@priority=\@ne
+ \endgroup
+}
+\def\FD@eval@spec@expr#1#2#3{%
+ \expandafter\ifx \@car#1\x@relax\@nil #2%
+ #3#1%
+ \else
+ \FD@eval@expr{#1}%
+ \fi
+}
+\DeclareRobustCommand\max[2]{%
+ \begingroup
+ \toks@={}%
+ \a@count=-\maxdimen
+ \b@count=\z@
+ \FD@eval@spec@expr{\max{#1}{#2}}{\max}{\FD@maxmin@comma}%
+ \ifnum \a@count>\FD@bracket@level
+ \global\FD@bracket@level=\a@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \protect\plainmax
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\{}%
+ \the\toks@
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\}}%
+ }%
+ \ifFD@evaluate@
+ \ifnum \a@count>\FD@result \global\FD@result=\a@count \fi
+ \fi
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+ \endgroup
+}
+\DeclareRobustCommand\min[2]{%
+ \begingroup
+ \toks@={}%
+ \a@count=\maxdimen
+ \b@count=\z@
+ \FD@eval@spec@expr{\min{#1}{#2}}{\min}{\FD@maxmin@comma}%
+ \ifnum \a@count>\FD@bracket@level
+ \global\FD@bracket@level=\a@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \protect\plainmin
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\{}%
+ \the\toks@
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\}}%
+ }%
+ \ifFD@evaluate@
+ \ifnum \a@count<\FD@result \global\FD@result=\a@count \fi
+ \fi
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+ \endgroup
+}
+\def\FD@maxmin@comma#1#2#3{%
+ \FD@eval@spec@expr{#2}{#1}{\FD@maxmin@comma}%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\protect \expandafter\FD@subexpression
+ \expandafter{\FD@expression}%
+ ,\penalty\FD@commapenalty\,%
+ }
+ \ifFD@evaluate@
+ \ifnum \a@count \ifx\max#1<\else>\fi \FD@result
+ \a@count=\FD@result
+ \fi
+ \fi
+ \ifnum \b@count<\FD@bracket@level \b@count=\FD@bracket@level \fi
+ \FD@eval@spec@expr{#3}{#1}{\FD@maxmin@comma}%
+}
+\DeclareRobustCommand\half[1]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifodd\FD@priority 5%
+ \else 3\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \protected@xdef\FD@expression{%
+ \protect\frac{1}{2}%
+ \ifnum \FD@priority>\thr@@ \else \cdot \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \ifodd \FD@result
+ \global\advance \FD@result \@ne
+ \global\divide \FD@result \tw@
+ \ifodd\FD@result \global\advance \FD@result \m@ne \fi
+ \else
+ \global\divide \FD@result \tw@
+ \fi
+ \fi
+ \endgroup
+}
+\DeclareRobustCommand\otherhalf[1]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifodd\FD@priority 5%
+ \else 3\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \protected@xdef\FD@expression{%
+ \protect\frac{1}{2}%
+ \ifnum \FD@priority>\thr@@ \else \cdot \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \ifodd \FD@result
+ \global\advance \FD@result \@ne
+ \global\divide \FD@result \tw@
+ \ifodd\FD@result\else \global\advance \FD@result \m@ne \fi
+ \else
+ \global\divide \FD@result \tw@
+ \fi
+ \fi
+ \endgroup
+}
+\DeclareRobustCommand\scale[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \let\FD@left@priority=\FD@priority
+ \FD@eval@expr{#2}%
+ \if \ifnum \FD@bracket@level<\@ne \ifnum \FD@priority>\thr@@
+ 1\else 0\fi\else 0\fi 1%
+ \protected@xdef\FD@expression{%
+ \protect\frac{\FD@expression}{1000}%
+ \if \ifnum \FD@left@priority<\thr@@ e\else
+ \ifodd \FD@left@priority i\else e\fi\fi e%
+ \cdot
+ \fi
+ \@tempa
+ }
+ \global\chardef\FD@priority=%
+ \ifnum \FD@left@priority=\@ne 1\else
+ \ifodd\FD@left@priority 5\else 3\fi\fi
+ \global\FD@bracket@level=\b@count
+ \else
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \if \ifnum \FD@left@priority=\@ne e%
+ \else\ifnum \FD@priority<\thr@@ e%
+ \else\ifodd \FD@priority i\else e\fi\fi\fi e%
+ \cdot
+ \fi
+ \FD@expression
+ \ifcase\FD@bracket@level \or \protect\big \or \protect\Big
+ \or \protect\bigg \else \protect\Bigg \fi /1000%
+ }%
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\@ne
+ \fi
+ \ifFD@evaluate@
+ \global\multiply \FD@result \a@count
+ \global\divide \FD@result 500
+ \ifodd \FD@result
+ \global\advance \FD@result \ifnum 0>\FD@result - \fi \@ne
+ \fi
+ \global\divide \FD@result \tw@
+ \fi
+ \endgroup
+}
+\def\ifnumber#1#2#3\then{%
+ \FD@evaluate@false
+ \generic@if{%
+ $\TypesetIntegerExpression{#1}#2\TypesetIntegerExpression{#3}$%
+ }%
+}
+\newcommand\setint[2]{%
+ \Bheading{Default} \(\TypesetIntegerExpression{\int{#1}}\) =
+ \(\TypesetIntegerExpression{#2}\)%
+}
+\newcommand\setstr[2]{%
+ \Bheading{Default} \TypesetStringExpression{\str{#1}} =
+ \TypesetStringExpression{#2}%
+}
+\newcommand\setdim[2]{%
+ \a@dimen=#2\relax
+ \Bheading{Default} \TypesetStringExpression{#1} dimen = \the\a@dimen
+}
+\def\setcommand#1{\ifx#1\undefined@command
+ \expandafter\gdef\expandafter#1\else
+ \expandafter\gdef\expandafter\a@command\fi}
+\newcommand\resetint[2]{%
+ \Bheading{Value} \(\TypesetIntegerExpression{\int{#1}}\) =
+ \(\TypesetIntegerExpression{#2}\)%
+}
+\newcommand\resetstr[2]{%
+ \Bheading{Value} \TypesetStringExpression{\str{#1}} =
+ \TypesetStringExpression{#2}%
+}
+\newcommand\resetdim[2]{%
+ \a@dimen=#2\relax
+ \Bheading{Value} \TypesetStringExpression{#1} dimen = \the\a@dimen
+}
+\def\resetcommand#1{\gdef#1}
+\def\ifisint#1\then{%
+ \generic@if{integer $\TypesetIntegerExpression{\int{#1}}$ set}%
+}
+\def\ifisstr#1\then{%
+ \generic@if{string \TypesetStringExpression{#1} set}%
+}
+\def\ifisdim#1\then{%
+ \generic@if{dimension \TypesetStringExpression{#1} set}%
+}
+\def\ifiscommand#1\then{%
+ \generic@if{command \normalfont{\ttfamily\string#1} set}%
+}
+\def\offcommand#1{\Bheading{Turn off} \texttt{\string#1}}
+\def\oncommand#1{\Bheading{Turn on} \texttt{\string#1}}
+\newcommand\SetStringVariable[2]{%
+ \protected@edef\@tempa{\noexpand\MakePrintable \noexpand\@tempa
+ {FD@swa}{#2}}%
+ \@tempa
+ \protected@edef\@tempa{%
+ \toks@=\noexpand\expandafter{\noexpand\the \toks@ \@tempa}%
+ \ifFD@swa \noexpand\@tempswatrue \fi
+ }%
+ \protected@edef\@tempb{\noexpand\MakePrintable \noexpand\@tempb
+ {FD@swa}{#1}}%
+ \@tempb
+ \ifFD@swa
+ \begingroup
+ \let\PrintChar=\FD@quoted@PrintChar
+ \global\expandafter\let \csname FD@s-\@tempb\endcsname \@tempa
+ \endgroup
+ \else
+ \PackageError{fontdoc}{Names of string variables must be
+ simple\MessageBreak if they are to be assigned values}\@eha
+ \fi
+}
+\def\foreach(#1)#2{%
+ \def\next##1\endfor(#1){%
+ \@for\@tempa:=#2\do{%
+ \SetStringVariable{#1}{\@tempa}%
+ ##1%
+ }%
+ }%
+ \next
+}
+\def\comment{\par\noindent}
+\let\begincomment=\iftrue
+\let\endcomment=\fi
+%%% From file: fimain.dtx
+\def\inputetx#1{%
+ \begingroup
+ \edef\lowercase@file{\lowercase{%
+ \edef\noexpand\lowercase@file{#1}%
+ }}%
+ \lowercase@file
+ \global\slot@number=0%
+ \FD@slot@known@true
+ \IfFileExists{\lowercase@file.etx}{%
+ \FD@relax@encoding@tricks
+ \@@input \@filef@und
+ \let\relax=\x@relax
+ }{%
+ \PackageError{fontdoc}{File #1.etx not found}%
+ {\@eha\MessageBreak You can \protect\inputetx\space
+ some other file now, if you want.}%
+ }
+ \endgroup
+}
+\def\FD@relax@encoding@tricks{%
+ \def\relax{\let\relax=\x@relax\iffalse}%
+ \let\encoding=\fi
+ \outer\x@cs\def{endencoding}{\endinput}%
+}
+\def\encoding{%
+ \par
+ \ifFD@spec@ \addvspace{\bigskipamount}\fi
+ \begin{flushleft}
+ \global\slot@number=\z@
+}
+\outer\def\endencoding{%
+ \end{flushleft}
+ \ifFD@spec@ \addvspace{\bigskipamount}\fi
+}
+\newcommand\setslot[1]{%
+ \protected@edef\slot@name{%
+ \noexpand\MakePrintable \noexpand\slot@name {FD@swa}{#1}%
+ }%
+ \slot@name
+ \FD@tight@true
+ \Aheading{Slot
+ \ifFD@slot@known@
+ \the\slot@number\space
+ \else
+ \(\FD@slot@expression + \the\slot@number\)
+ \fi
+ `\FD@typeset@string{\slot@name}'%
+ }%
+ \protected@edef\@currentlabel{%
+ \ifFD@slot@known@
+ \the\slot@number
+ \else
+ \protect\(%
+ \FD@slot@expression+\the\slot@number
+ \protect\)%
+ \fi
+ \space(\protect\FD@typeset@string{\slot@name})%
+ }%
+ \ifFD@slot@known@ \ifslot@comment@ \comment{\slot@comment}\fi\fi
+}
+\def\endsetslot{%
+ \global\advance \slot@number \@ne
+ \FD@tight@false
+}
+\newcount\slot@number
+\def\FD@slot@known@true{\global\let\ifFD@slot@known@\iftrue}
+\def\FD@slot@known@false{\global\let\ifFD@slot@known@\iffalse}
+\FD@slot@known@true
+\newcommand\nextslot[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \ifFD@evaluate@
+ \global\slot@number=\FD@result
+ \FD@slot@known@true
+ \else
+ \global\let\FD@slot@expression=\FD@expression
+ \global\slot@number=\z@
+ \FD@slot@known@false
+ \fi
+}
+\newcommand\skipslots[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \ifFD@evaluate@
+ \global\advance \slot@number \FD@result
+ \else
+ \ifFD@slot@known@
+ \global\let\FD@slot@expression=\FD@expression
+ \else
+ \protected@xdef\FD@slot@expression{%
+ \FD@slot@expression+\FD@expression
+ }%
+ \fi
+ \FD@slot@known@false
+ \fi
+}
+\newcommand\setleftboundary[1]{%
+ \protected@edef\slot@name{%
+ \noexpand\MakePrintable \noexpand\slot@name {FD@swa}{#1}%
+ }%
+ \slot@name
+ \FD@tight@true
+ \Aheading{Left boundary `\FD@typeset@string{\slot@name}'}%
+ \protected@edef\@currentlabel{%
+ left boundary (\protect\FD@typeset@string{\slot@name})%
+ }%
+}
+\let\endsetleftboundary=\FD@tight@false
+\newcommand\setrightboundary[1]{%
+ \Aheading{Right boundary slot
+ \ifFD@slot@known@
+ \the\slot@number\space
+ \else
+ \(\FD@slot@expression + \the\slot@number\)
+ \fi
+ `\TypesetStringExpression{#1}'%
+ }%
+ \global\advance \slot@number \@ne
+}
+\newcommand\ligature[3]{%
+ \Bheading{\ifFD@spec@ Ordinary ligature\else Ligature\fi}
+ \@nameuse{FD@lig-#1}{#2}{#3}%
+}
+\newcommand\Ligature[3]{%
+ \Bheading{\ifFD@spec@ Mandatory ligature\else Ligature\fi}
+ \@nameuse{FD@lig-#1}{#2}{#3}%
+}
+\newcommand\oddligature[4]{%
+ \Bheading{Odd\footnote{#1} ligature}
+ \@nameuse{FD@lig-#2}{#3}{#4}%
+}
+\x@cs\def{FD@lig-LIG}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-/LIG}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-LIG/}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*\lfloor$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-LIG/>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \typeset@glyph{#2}${}*\lfloor$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*\lfloor$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/>>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$%
+ \typeset@glyph{#2}${}*\lfloor$\typeset@glyph{#1}%
+}
+\def\nextlarger#1{\Bheading{Next larger} \typeset@glyph{#1}}
+\def\makerightboundary#1{%
+ \Bheading{Right boundary marker slot} designation \typeset@glyph{#1}%
+}
+\newcommand*\Unicode[2]{%
+ \comment{%
+ \spaceskip=\fontdimen2\font minus 1.1\fontdimen4\font
+ Unicode character \FD@codepoint{#1}%
+ \ifx \par#2\par \else , \FD@charname{#2}\fi.%
+ \linepenalty=300\par
+ }%
+}
+\newcommand*\textunicode[2]{%
+ \FD@codepoint{#1} \ifx\par#2\par\else(\FD@charname{#2})\fi
+}
+\providecommand*\FD@codepoint[1]{\texttt{U+\uppercase{#1}}}
+\providecommand*\FD@charname[1]{\textsc{\lowercase{#1}}}
+\newcommand\charseq[1]{%
+ \comment{Unicode character sequence:}%
+ \begin{IfBranch}%
+ \def\Unicode##1##2{%
+ \noindent\FD@codepoint{##1}
+ \ifx\par##2\par\else(\FD@charname{##2})\fi
+ \par
+ }%
+ #1%
+ \end{IfBranch}%
+}
+\def\varchar{\Bheading{Extensible glyph:}}
+\def\vartop#1{\Bheading{Top} \typeset@glyph{#1}}
+\def\varmid#1{\Bheading{Middle} \typeset@glyph{#1}}
+\def\varbot#1{\Bheading{Bottom} \typeset@glyph{#1}}
+\def\varrep#1{\Bheading{Repeated} \typeset@glyph{#1}}
+\let\endvarchar\relax
+\newif\ifslot@comment@
+\slot@comment@false
+\def\slot@comment{}
+\newcommand\setslotcomment[1]{%
+ \slot@comment@true
+ \gdef\slot@comment{#1}%
+}
+\newcommand\resetslotcomment[1]{\gdef\slot@comment{#1}}
+\newcommand\unsetslotcomment{%
+ \slot@comment@false
+ \global\let\slot@comment\@empty
+}
+\let\slot@font=\nullfont
+\newcommand\useexamplefont[1]{\font\slot@font=#1 }
+\newcommand\slotexample{%
+ \ifFD@slot@known@{\slot@font\char\slot@number}\fi
+}
+\newcommand\setfontdimen[2]{%
+ \Bheading{Fontdimen} \TypesetStringExpression{#1} is
+ \(\TypesetIntegerExpression{\int{#2}}\)%
+}
+\newcommand\ifdirect{\generic@if{direct}}
+\def\inputmtx#1{%
+ \begingroup
+ \edef\lowercase@file{\lowercase{%
+ \edef\noexpand\lowercase@file{#1}%
+ }}%
+ \lowercase@file
+ \let\endmetrics@hook=\@empty
+ \IfFileExists{\lowercase@file.mtx}{%
+ \skip@mtx@preamble
+ \@@input \@filef@und
+ \let\relax=\x@relax
+ }{%
+ \PackageError{fontdoc}{File #1.mtx not found}%
+ {\@eha\MessageBreak You can \protect\inputmtx\space
+ some other file now, if you want.}%
+ }
+ \endmetrics@hook
+ \endgroup
+}
+\def\skip@mtx@preamble{%
+ \def\relax{\let\relax=\x@relax\iffalse}%
+ \let\metrics=\fi
+ \outer\x@cs\def{endmetrics}{\endinput}%
+}
+\def\metrics{%
+ \begin{flushleft}%
+ \let\endmetrics@hook=\@empty
+}
+\outer\def\endmetrics{%
+ \endmetrics@hook
+ \end{flushleft}%
+}
+\def\ProvidesMtxPackage#1{%
+ \endmetrics@hook
+ \announce@package{#1}%
+ \def\endmetrics@hook{\finish@package{#1}}
+ \global\x@cs\let{FD@pack-#1}\@empty
+}
+\def\announce@package#1{%
+ \Aheading{[Start of metric package \textsf{#1}.}%
+}
+\def\finish@package#1{%
+ \Aheading{End of metric package \textsf{#1}.]}%
+ \par\addvspace\medskipamount
+}
+\newcommand\usemtxpackage[2][\x@relax]{%
+ \ifx \x@relax#1%
+ \@for\@tempa:=#2\do{%
+ \x@cs\ifx{FD@pack-\@tempa}\@empty \else
+ \inputmtx{\@tempa}%
+ \fi
+ }%
+ \else
+ \@tempswafalse
+ \@for\@tempa:=#1\do{%
+ \x@cs\ifx{FD@pack-\@tempa}\@empty \else \@tempswatrue \fi
+ }%
+ \if@tempswa
+ \inputmtx{#2}%
+ \fi
+ \fi
+}
+\newcommand\setkern[3]{%
+ \Bheading{Kern} \typeset@glyph{#1}${{}+{}}$\typeset@glyph{#2}%
+ ${}\rightarrow \TypesetIntegerExpression{#3}$%
+}
+\newcommand\resetkern[3]{%
+ \Bheading{Override kern} \typeset@glyph{#1}${{}+{}}$\typeset@glyph{#2}%
+ ${}\rightarrow \TypesetIntegerExpression{#3}$%
+}
+\newcommand\setleftkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the left like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+\newcommand\setrightkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the right like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+\newcommand\setleftrightkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the left and right like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+\newcommand\ConditionallyScaled[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \@tempswatrue
+ \ifFD@evaluate@ \ifnum \FD@result=\@m \@tempswafalse \fi\fi
+ \FD@evaluate@false
+ \if@tempswa scaled \(\FD@expression\)\else \ignorespaces \fi
+}
+\DeclareRobustCommand\kerning[2]{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \MakePrintable\@tempb{FD@swa}{#2}%
+ \protected@xdef\FD@expression{%
+ \mathop{\protect\mathrm{k{}}}(%
+ \text{\protect\FD@typeset@string{\@tempa}}%
+ ,\penalty\FD@commapenalty
+ \text{\protect\FD@typeset@string{\@tempb}}%
+ )%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\@ne
+ \FD@evaluate@false
+ \endgroup
+}
+\def\ifiskern#1#2\then{%
+ \generic@if{kern \typeset@glyph{#1}${}+{}$\typeset@glyph{#2} set}%
+}
+\newcommand\unsetkerns[2]{%
+ \Bheading{Remove} all kerning pairs in
+ \FD@typeset@string@set{#1}${}\times{}$\FD@typeset@string@set{#2}%
+}
+\def\FD@typeset@string@set#1{%
+ \toks@={}%
+ \@for\@tempa:=#1\do{%
+ \protected@edef\@tempa{%
+ \noexpand\MakePrintable \noexpand\@tempa {FD@swa}{\@tempa}%
+ }%
+ \@tempa
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\do \expandafter{\@tempa}}%
+ }%
+ \expandafter\FD@typeset@string@set@ \expandafter{\the\toks@}%
+}
+\def\FD@typeset@string@set@#1{%
+ \TypesetList{$\{$}{$,\penalty\FD@commapenalty{}$}%
+ {$,\penalty\FD@commapenalty{}$}{$,\penalty\FD@commapenalty{}$}%
+ {$\}$}{$\emptyset$}{\FD@typeset@string}{#1}%
+}
+\newcommand\noleftkerning[1]{%
+ \Bheading{Remove kerns} on the left of glyphs in
+ \FD@typeset@string@set{#1}.}
+\newcommand\norightkerning[1]{%
+ \Bheading{Remove kerns} on the right of glyphs in
+ \FD@typeset@string@set{#1}.}
+\newcommand\noleftrightkerning[1]{%
+ \Bheading{Remove kerns} on any side of glyphs in
+ \FD@typeset@string@set{#1}.}
+\let\typeset@glyph=\TypesetStringExpression
+\DeclareRobustCommand\width[1]{\FD@glyph@metric{w}{#1}}
+\DeclareRobustCommand\height[1]{\FD@glyph@metric{h}{#1}}
+\DeclareRobustCommand\depth[1]{\FD@glyph@metric{d}{#1}}
+\DeclareRobustCommand\italic[1]{\FD@glyph@metric{i}{#1}}
+\def\FD@glyph@metric#1#2{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#2}%
+ \protected@xdef\FD@expression{%
+ \protect\FD@integer@func{#1}{\@tempa}%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\@ne
+ \FD@evaluate@false
+ \endgroup
+}
+\newcommand\setglyph[1]{%
+ \FD@tight@true
+ \Aheading{Set glyph `\typeset@glyph{#1}'}%
+}
+\newcommand\resetglyph[1]{%
+ \FD@tight@true
+ \Aheading{Reset glyph `\typeset@glyph{#1}'}}
+\let\endsetglyph=\FD@tight@false
+\let\endresetglyph=\FD@tight@false
+\newcommand\setrawglyph[8]{%
+ \Aheading{Glyph `\typeset@glyph{#1}'}
+ \Bheading{Taken from} slot $\TypesetIntegerExpression{#4}$ in
+ font \TypesetStringExpression{#2}%
+}
+\newcommand\setscaledrawglyph[9]{%
+ \Aheading{Glyph `\typeset@glyph{#1}'}
+ \Bheading{Taken from} slot $\TypesetIntegerExpression{#5}$ in
+ font \TypesetStringExpression{#2} \ConditionallyScaled{#4}%
+}
+\newcommand\setnotglyph[8]{%
+ \Aheading{Pseudoglyph `\typeset@glyph{#1-not}'}%
+}
+\newcommand\setscalednotglyph[9]{%
+ \setnotglyph{#1}{#2}{#3}{#5}{#6}{#7}{#8}{#9}%
+}
+\newcommand\unsetglyph[1]{%
+ \Aheading{Unset glyph `\typeset@glyph{#1}'}}
+\newcommand\glyph[2]{%
+ \Bheading{Glyph} `\typeset@glyph{#1}' \ConditionallyScaled{#2}%
+}
+\newcommand\glyphrule[2]{%
+ \Bheading{Rule} $\TypesetIntegerExpression{#1}$ by
+ $\TypesetIntegerExpression{#2}$%
+}
+\newcommand\glyphspecial[1]{%
+ \Bheading{Special} `\TypesetStringExpression{#1}'}
+\newcommand\glyphwarning[1]{%
+ \Bheading{Warning} `\TypesetStringExpression{#1}'}
+\newcommand\movert[1]{\Bheading{Rt}~$\TypesetIntegerExpression{#1}$}
+\newcommand\moveup[1]{\Bheading{Up}~$\TypesetIntegerExpression{#1}$}
+\newcommand\push{\Bheading{Push}}
+\newcommand\pop{\Bheading{Pop}}
+\newcommand\resetwidth[1]{%
+ \Bheading{Reset width to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetheight[1]{%
+ \Bheading{Reset height to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetdepth[1]{%
+ \Bheading{Reset depth to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetitalic[1]{%
+ \Bheading{Reset italic to $\TypesetIntegerExpression{#1}$}%
+}
+\def\glyphpcc#1#2#3{
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{#1}{1000}
+ \pop
+}
+\DeclareRobustCommand\glyphbboxright{%
+ \gdef\FD@expression{\protect\mathrm{glyphbboxright}}
+ \global\chardef\FD@priority=\tw@
+ \global\FD@bracket@level=\z@
+ \FD@evaluate@false
+}
+\newcommand\samesize[1]{%
+ \Bheading{Reset dimensions to those of `\typeset@glyph{#1}'.}%
+}
+\def\ifisglyph#1\then{\generic@if{glyph \typeset@glyph{#1} set}}
+\def\ifareglyphs#1\then{%
+ \generic@if{all glyphs in \FD@typeset@string@set{#1} are set}%
+}
+\def\ifisinslot#1#2\then{%
+ \generic@if{glyph \typeset@glyph{#1} assigned to slot
+ $\TypesetIntegerExpression{#2}$}%
+}
+\def\ifoption#1\then{%
+ \generic@if{option \TypesetStringExpression{#1}}%
+}
+%%% From file: fimapgen.dtx
+\def\mapfrags_subsystem{Map~fragments~writer}
+\def\declarepsencoding#1#2#3{\comment{%
+ This file corresponds to the \FD@typeset@string{#2} encoding vector.}}
+\newcommand\providepsencoding[3]{}
+\endinput
+%%
+%% End of file `fontdoc.sty'.
diff --git a/fonts/utilities/fontinst/source/CHANGES b/fonts/utilities/fontinst/source/CHANGES
new file mode 100644
index 0000000000..1c6155ecb8
--- /dev/null
+++ b/fonts/utilities/fontinst/source/CHANGES
@@ -0,0 +1,648 @@
+--- CHANGES ---
+
+This is the old changes log for the fontinst font installation package.
+As of v1.9, changes in the core are recorded using the \changes
+mechanism of the doc package, and appear as a section in the typeset form
+of the source (fisource.dvi). Changes to supporting files are typically
+recorded in each file, at the end.
+
+Feb 4 1993, v0.01: Created the file, wrote an afm and enc parser,
+ started on a vpl writer.
+
+Feb 10 1993, v0.02: Rewrote the enc parser, generally hacked around,
+ imported trig.tex to convert Adobe's italic slope (expressed in
+ angles!) into a font dimension (expressed as a ratio!) grrrrrr...
+
+Feb 12 1993, v0.03: Tidied up the comments a bit, moved the
+ \fontlist out of \readafm, added \writepl (as well as \writevpl).
+ Replaced \fake{CHARACTER} by having the .fd file give default
+ definitions for \char-CHARACTER. Added the \map and
+ \ligtable entries to \char-CHARACTER. Redefined \ligtable,
+ \map and \codingscheme as token lists. Moved the \kernpair's
+ into \ligtable.
+
+Feb 16 1993, v0.04: Added FontName, FullName, UnderlineThickness and
+ Notice. Added the source font encodings, and MAPFONT.
+ Discovered a seriousish bug---if a character exists in the afm
+ file but is not in the source encoding, then the fake character
+ is still overwritten, since we don't know what the source
+ encoding is going to be until later. Fixed this by reading in
+ the source encoding first, and looking to see if there is a
+ character in the source encoding for the one in the afm file.
+ Added \topaccent.
+
+17 Feb 1993, v0.05: Added the visual centre parameter to \topaccent,
+ and added \botaccent and \doublechar. Fixed a bug where the
+ default \missingchar had a horizontal rather than a vertical
+ rule. Added \settoken.
+
+19 Feb 1993, v0.06: Fixed a bug whereby a character which was in the
+ source encoding but not in the afm file overwrote it's faked
+ version. Changed the default \missingchar to be independent of
+ the values parsed from the afm file (so it doesn't matter when
+ you set a \missingchar). Added \parameter and \ligatures. Added
+ \kernalikes and \copykern, which meant I had to split \ligtable
+ back into \ligtable and \kerntable, since when you say \copykern
+ you only want the \kerntable copied, not the \ligtable.
+ Redefined \map so that it's more portable---the contents of \map
+ are allowed to assume they start in font \startfont, should move
+ and should finish having moved right by \charwd and in font
+ \stopfont. This makes it possible to have composite characters
+ within composite characters---for example to make <ffi> out of
+ <f><fi> and <fi> is in turn made out of <f><i>.
+
+23 Feb 1993, v0.07: Introduced the \character token list (previously
+ all of the variables had been set by \char-FOO). \botaccent,
+ \topaccent, etc are now commands to be used inside \defchar, so
+ you can say something like \defchar{FOO}{\ifblah ... \botaccent
+ ... \else ... \topaccent ... \fi}. Added \cramchar. Added
+ the shift-left argument to \doublechar.
+
+24 Feb 1993, v0.08: Replaced \charic by \leftbearing and
+ \rightbearing. Made the assingments in a \char-FOO command
+ global, so we can protect local variables. Fixed a bug with
+ \getchar{FOO} which used to end up calling \the\character.
+ However, \the\character may contain other \getchar{BAZ} calls,
+ which will override the values of \kernalike, \source, \target,
+ etc. So \getchar can't call \the\character. Added \shrinkfont.
+ Made all the AFM variables counts rather than dimens. Added
+ \afmunits, and did all the conversion between AFM units and TeX
+ units as late as possible (which means we can alter \afmunits
+ locally and perform scaling). Added \getfont so fonts are now
+ loaded dynamically, and can be scaled. Added \shrinkchar for
+ producing c&sc fonts.
+
+3 Mar 1993, v0.09: Added \fractionchar, \inferiorchar and
+ \superiorchar. No character is produced for characters called
+ .notdef in the target encoding. Produced a first bash at a
+ complement encoding to Cork, containing the Adobe standard and
+ Expert characters missing from Cork.
+
+9 Mar 1993, v0.10: A major spring clean. Introduced ATX and ETX
+ files, so the parser for AFM files now reads an AFM file and writes
+ out the same information in a TeX-friendly fashion as an ATX file.
+ Similarly, an ETX file contains the same information as an ENC file.
+ Introduced \inputatx, \inputetx and \inputenc to input an ATX, ETX
+ or ENC file if it already exists and to make it otherwise.
+
+14 Mar 1993, v0.11: A continuation of the spring clean. Redefined
+ \getchars to define everything locally. Redefined \writechars to
+ read the encoding from a .etx file. Discovered I'd used the command
+ \afmchar twice(!) so I redefined one of them to be \rawchar.
+ Rewrote the LIGTABLE section.
+
+15 Mar 1993, v0.12: Finished the spring clean of the file generation.
+ Redid \writevpl and \writepl. Read the FUD file in after the ATX
+ files, so the FUD file can use the parameters read in by the ATX
+ file. Fixed a bug with \afmchar that wrote incorrect values
+ to \charactersize in the ATX file. Rewrote \fontdimens to write the
+ PARAMETERs out immediately (since we are now writing the VPL file
+ when reading the FUD file). Finished the LIGTABLE section, redid
+ \copykern.
+
+22 Mar 1993, v0.13: Rewrote the generation of ATX files, so kern table
+ information is gathered together as in a LIGTABLE. Renamed
+ \defchars to \readafm. Renamed \writevpl to \makevpl ... \endvpl,
+ and rewrote it to cope with the new syntax of ATX files.
+
+24 Mar 1993, v0.14: Added \lkern and \rkern entries to ATX files,
+ replacing \copykern. Added kern copying to LIGTABLEs.
+
+29 Mar 1993, v0.15: Added \boundarychar, \nextlarger and \varchar.
+ Fixed a bug with \lrkern.
+
+30 Mar 1993, v0.16: Fixed a bug whereby FONTDIMENS was being output
+ rather than FONTDIMEN. Also \writepl was generating a VPL file.
+ And I discovered a bug with dvips that means that fonts generated
+ with designsize and designunits R 9.9945 cause a rounding error
+ and dvips complains about a design size mismatch. Grr... Fixed
+ a bug with outputting ligatures for characters without
+ kernings---previously I output a LABEL without checking that
+ there were actually going to be any LIG instructions (which there
+ might not be if, for example, it was a monoweight font).
+
+4 Apr 1993, v0.17: Added the interactive prompt. Generated the .fd
+ file. \makevpl and \makepl don't overwrite files any
+ longer---they give a message saying `FILENAME.(v)pl already
+ exists.'
+
+17 Apr 1993, v0.18: Added \makefamily, \maketexfont and \makerawfont.
+
+27 Apr 1993, v0.19: Fixed a bug with \finishligs, which caused
+ multiple LABEL instructions to be put down (I had a \labelfalse
+ where I should have had a \labeltrue).
+
+4 Aug 1993, v1.00: Ripped it up and started again... v1.00 is going
+ to be a fairly complete rewrite from the ground up. I can keep:
+
+ * the AFM parser
+ * the ENC parser
+ * much of the VPL and PL writer
+
+ but the fud engine is going to be replaced by the notion of a
+ glyphbase. The idea will be that all of the information kept in
+ the ATX and FUD files will be put into one file called a
+ `glyphbase'. Then we'll have two utilities:
+
+ * \makerawfont{ENCODING}{AFMFILE}{FONTNAME}
+ will convert an AFM file into a glyphbase and a property list.
+
+ * \maketexfont{ENCODING}{GLYPHBASES}{FONTNAME}
+ will convert a collection of glyphbases into a virtual font.
+
+ For example:
+
+ \makerawfont{adobe}{Times-Roman}{ptmr0}
+ \maketexfont{T1ulc}{ptmr0,cork}{ptmrq}
+
+ makes the raw font ptmr0.pl, the glyphbase ptmr0.gly, and then
+ converts the glyphbases ptmr0 and cork into the font ptmrq. This
+ notion of glyphbase will also allow users to modify fonts easily,
+ for example you could write a little ptmhax glyphbase, which
+ would override the default cork glyphbase by saying:
+
+ \maketexfont{T1ulc}{ptmr0,ptmhax,cork}{ptmrq}
+
+ This will make it much easier to tweak fonts. I'll also specify
+ the glyphbase syntax, and do my best to make everything upwardly
+ compatible.
+
+ On the 4th of August I started on the above. I wrote
+ \makeglyphbase, which converts an AFM file into a glyphbase, and
+ I wrote the glyphbase commands to store the glyphbase information
+ in TeX. The main thing that's missing is the PL and VPL writers,
+ and the ligature, nextlarger and varchar entries.
+
+10 Aug 1993, v1.01: Edited trig.tex to remove uses of \then. Separated
+ \maketexfont into \inputglyphbase and \makevirtualfont. Added the
+ ability to write CHARACTER instructions, (OK, but not the MAPFONTs
+ yet).
+
+11 Aug 1993, v1.02: Only output CHARDP, CHARHT and CHARIC when they
+ are positive. Added the MAPFONT and \mapfont instructions.
+
+12 Aug 1993, v1.03: Corrected a bug where I was calling \inputetx
+ *after* an \openout\outfile, which caused the \outfile to be closed,
+ if the etx file had to be generated.
+
+22 Aug 1993, v1.04: Added the concept of variable and number expression.
+ Included trig.tex as part of this file. Changed design size to an
+ integer. Renamed `glyphbase' to `metric file', and changed the
+ syntax of ETX files. Only write out SELECTFONT instructions when
+ necessary.
+
+23 Aug 1993, v1.05: Added the font dimensions.
+
+24 Aug 1993, v1.06: Made the slot of each glyph an int variable like
+ any other. Added dim variables. Made designsize a dim variable,
+ which should cure a bug that was causing design sizes not to match
+ up. Added the LIGTABLE. Fixed a bug with \inputetx and \inputmtx
+ which caused the redefinition of \relax to survive past the
+ \inputFOO command. Fixed a bug with \vplrule, since I'd got the
+ arguments to SETRULE the wrong way round (again!).
+
+25 Aug 1993, v1.07: Added the VARCHAR and NEXTLARGER entries. Added
+ the encoding documentation commands. Renamed the file to
+ fontinst.sty.
+
+26 Aug 1993, v1.08: Added the documentation of MTX files.
+
+27 Aug 1993, v1.09: Corrected a bug with \comment. Added \tfmtomtx.
+ Removed the SCALE argument to \setrawglyph. Added \convertafm to
+ convert integer AFM units to a dimen, trying to minimize rounding
+ errors whilst avoiding rounding errors. Renamed \leftkerning and
+ \rightkerning to \setleftkerning and \setrightkerning.
+
+30 Aug 1993, v1.10: Added \resetwidth, \resetheight, \resetdepth and
+ \resetitalic. Added the ability to use \width{GLYPH} etc. inside
+ \setglyph{GLYPH}. Added everyglyph and everyendglyph.
+
+10 Sep 1993, v1.11: Discovered a bug with the VPL glyphs which was
+ causing it never to write out a SELECTFONT instruction.
+
+13 Sep 1993, v1.12: Added the \familyinst...\endfamilyinst commands.
+ Added commands to zero the fonts between calls of \makefont, so
+ one document can make a large number of fonts.
+
+14 Sep 1993, v1.13: FIRST ALPHA-RELEASE OF V1.
+ Changed the syntax of \useafm and \useetx to use
+ the same parameters as LaTeX NFSS. Removed the prefix f0 from
+ the beginning of the font names, in a pathetic attempt to fit
+ MS-DOS 8+3 filenames. Added the \tempfile command.
+
+4 Oct 1993, v1.14: Removed a spurious \let in \docnextslot. Thanks
+ to Damian Cugley for spotting that one. Added \usetfm to \familyinst.
+
+5 Oct 1993, v1.15: Fixed a bug with \dotfm, which was causing it to
+ generate a PL file, even though the font was already in TFM
+ format! Thanks again to Damian. Also changed
+ \let\Input=\@@input to a catcode hack, just in case fontinst.sty
+ is read in by LaTeX when @ isn't a letter. That one was spotted
+ by Paul Thompson.
+
+6 Oct 1993, v1.16: Replaced Phil Taylor's trig macros with David
+ Carlisle's. Added the PL parser. Fixed a bug with the bug fix
+ for \dotfm, where I'd removed an \inputmtx command that was
+ needed... And I fixed a bug which was causing the VPL files to
+ be generated once for each font that contributed to the VPL file.
+ Damian got those ones as well.
+
+11 Oct 1993, v1.17: Added the SIZE argument to \useafm and \usepl,
+ and redid the FD generation to use the size info. This should
+ allow fonts like Malvern to be generated at different design
+ sizes and still have a sensible FD file. NOTE: This means old
+ fontinst files will no longer work! I also made \pltomtx create
+ a \setdim{designsize} command.
+
+13 Oct 1993, v1.18: Fixed a bug with \calculateitslant which caused
+ it to bomb if the italic angle didn't have a decimal... this was
+ caused by allowing extraneous spaces at the end of the angle.
+ These have now been stripped away. Thanks to Paul Thompson for
+ spotting that one!
+
+15 Oct 1993, v1.19: Discovered a bug with \familyinst, which caused
+ only one ETX file to be loaded. This one was introduced when I
+ added the SIZE arguments, since I reorganized the main
+ \endfamilyinst loop. Serves me right! This is now fixed, but
+ I'm left with the problem that the sensible order to generate VPL
+ files is not the sensible order to generate FD lines in. FD
+ files need the SIZE parameter inside the SERIES and SHAPE,
+ whereas if a font is contributing to a number of SERIES and
+ SHAPEs but only one SIZE, then it's sensible to have it outside
+ the SERIES and SHAPE parameters. Oh dear...
+
+19 Oct 1993, v1.20: Added the glyph `missingglyph' which is produced
+ whenever a glyph is missing.
+
+3 Nov 1993, v1.21: Corrected a bug with \kerning, which was causing
+ \kerning{A}{V} to give the kerning between V and A! And I added
+ the PL names for the math font parameters NUM1--AXISHEIGHT.
+ Damian spotted those ones. Rewrote the main loop as I said I
+ would have to in the note on v1.19, so there's no useless
+ regeneration of fonts now.
+
+17 Nov 1993, v1.22: Restored the final parameter to
+ \DeclareFontShape which had disappeared somehow! Rob Hutchings
+ spotted this one. And I stopped trying to be clever about
+ checking to see if a glyph has been defined before using it.
+ This means you get a horrible error message if you try to use an
+ undeclared glyph, but hey ho. Trying to trap this has caused so
+ many problems with other things breaking that I think I'll give
+ up :-) Added the \glyphwarning command, and removed the
+ `missingglyph' glyph. Docstripped David's trig.doc into
+ trig.sty, so I don't have to worry about trig.doc generating the
+ trig.sty file. Saved the catcodes of ` ', `@', `~' `_' and NL so I
+ so I can use @ and _ for internal macro names, space and NL
+ for ignored white space, and ~ for `real' white space. Renamed
+ all the internal commands (apart from the documentation ones) to
+ have _ in their names.
+
+29 Nov 1993, v1.23: Added a check that a glyph exists before writing
+ it to a (V)PL file... this was causing fontinst to crash if there
+ was a glyph missing from an AFM file. Yannis Haralambous and Paul
+ Thompson spotted this one.
+
+23 Dec 1993, v1.24: Removed the \familyinst...\endfamilyinst interface,
+ and replaced it by \installfonts ... \endinstallfonts, which makes
+ it easier to generate FD files that look like standard LaTeX2e FD
+ files. Removed (I'm not sure if this is a great idea) the ability
+ to specify an encoding for an AFM file, since I'm not sure every
+ dvi-to-ps converter can re-encode raw fonts. I added the
+ \declarefamily command to specify which encoding string corresponds
+ to which ETX file.
+
+24 Dec 1993, v1.25: Redid the \declare... commands, and replaced
+ everyglyh and everyendglyph by sidebearings.
+
+25 Dec 1993, v1.26: Drank a lot.
+
+26 Dec 1993, v1.27: Added \setcommand, \resetcommand and \ifiscommand.
+
+27 Dec 1993, v1.28: Bug-fixes in \setcommand and \resetcommand. Redid
+ \pltomtx so that it can read the encoding from the CODINGSCHEME line
+ in the file. Moved the documentation and tables into fontdoc and
+ fonttab.tex.
+
+28 Dec 1993, v1.29: Removed the fd-commands argument from \makefont,
+ since the FD syntax is to allow FD-commands dependent on
+ encoding/family/series/shape but not on size. This means we can't
+ generate font-specific FD-commands, but I've never seen those used,
+ so I'm not too worried... Fixed a bug with the CC commands, which
+ was producing a glyph with a different width than its horizontal
+ escapement, and I'm not sure what every DVI driver would do with
+ that. Replaced \etxtopl with \mtxtopl. Replaced the GLYPH COMMAND
+ \rawglyph with the MTX COMMAND \setrawglyph.
+
+29 Dec 1993, v1.30: Fixed a bug with \setrawglyph, which wasn't
+ checking to see if the glyph was already defined. Added
+ \unsetglyph. Corrected the spelling of `\immedaite' (sic) in
+ \vpl_nextlarger.
+
+3 Jan 1994, v1.301: The glyph warning message is now only produced when
+ the glyph is used, rather than when it is defined. And I've moved
+ over to three-digit version numbers, since I was going through the
+ two-digit ones quite rapidly. Added \bye, so fontinst documents can
+ run under LaTeX as well as plain TeX. Added \unsetint, \unsetstr,
+ \unsetdim and \unsetcommand. Renamed \makefont and \makefamily to
+ \installfont and \installfamily.
+
+4 Jan 1994, v1.302: Fixed a bug with the definition of \bye.
+
+6 Jan 1994, v1.303: Added the FONTNAME argument to \installfont.
+ Actually got rid of everyglyph.
+
+8 Jan 1994, v1.304: Added minimumkern and \resetglyph. Fixed a bug
+ with \vpl_kerning, which was swapping the left- and right-kerns.
+ Surprising I never spotted this before...
+
+9 Jan 1994, v1.305: Worked on the MTX and ETX files.
+
+10 Jan 1994, v1.306: Worked on the MTX and ETX files.
+
+12 Jan 1994, v1.307: Edited the documentation.
+
+20 Jan 1994, v1.308: Added the rawscale integer variable, and the
+ \setnotglyph command. Redid the way that CC instructions are
+ processed, to use the dimensions stored in the glyph-not variables.
+ Set all of the saved VPL commands to \relax so that they can be
+ \edef'ed on without having to protect them. Replaced some \def\foo{}
+ by \let\foo\empty_command's. Replaced a large definition that was
+ being made by \CHARACTER (when parsing PL files) by a \let. Redid
+ the datatype used to store kerning so it uses control sequences as a
+ compact representation of glyph names. All in all, fontinst now runs
+ in 79% of the time and 77% of the space that it did last week.
+
+21 Jan 1994, v1.309: Saved some more time and space on the kern table.
+
+22 Jan 1994, v1.310: Added the `FONT scaled AMOUNT', made \setkern take
+ account of \int{rawscale}. Moved the change log into a separate
+ CHANGES file. Redid \samesize and \resetwidth so that the width is
+ adjusted by a MOVERIGHT, so the glyph will have the correct horizontal
+ escapement. Corrected a typo which had renamed \resetint to \setint
+ (oops!). Corrected a typo of `itslant' rather than `italicslant'.
+ Added the \transformfont command and \mtxtomtx. Changed the
+ definition of \unfakable{foo} in latin.mtx to look to see if there's a
+ glyph <foo-not> to get the dimensions for. Added a fake <space> and a
+ fake <dotlessj> which is a missing glyph rule with the dimensions
+ combined from <j> and <dotlessi>. Changed the default interword
+ stretch to be 1/3 of interword space, rather than zero. Removed the
+ checks for the existence of <space> and <x> in OT1.etx and T1.etx,
+ since these are now faked in latin.mtx. Renamed the PS/CM math fonts,
+ after a discussion with Karl Berry, added the OMS and OMX math fonts.
+ Added the Greek letters, digits and other humanists to unsetalf.mtx.
+ Added the DEFAULTRULETHICKNESS and BIGOPSPACING commands to the PL
+ parser. Fixed a bug I'd introduced by giving \vartop, \varmid,
+ \varrep and \varbot no parameters. Oops. Created timesmat.sty and
+ testmath.tex. All in all, a reasonable day's work...
+
+23 Jan 1994, v1.311: Added some more tests to testmath.tex. Added the
+ new math sizes to timesmat.sty. Fixed a bug with fontstnd.tex which
+ was causing it to generate the wrong FD entry for italic fonts. Fixed
+ a bug with CHARACTER parsing in \pltomtx which wasn't resetting the
+ values of WIDTH, HEIGHT, DEPTH and CHARIC between glyphs.
+
+24 Jan 1994, v1.312: Added the SEVENBITSSAFE command to the PL parser.
+
+25 Jan 1994, v1.313: Restored the catcode of ~, which I'd left as 10.
+ Made /, < and > in zptmcmrm come from cmmi rather than ptmri. Added
+ zptmcmr to fontptcm.tex, which is Adobe Times with +, =, (, ), [ and ]
+ taken from CMR. This means that [...] and (...) in text is different
+ from in math, but means that the delimiters are the right size for
+ math setting with CM symbols, and match the growing delimiters in cmex.
+ Moved the files ptmcmhax.mtx and psycmhax.mtx to zrmhax.mtx and
+ zrvhax.mtx.
+
+27 Jan 1994, v1.314: Took the textstyle and displaystyle big operators
+ in zpsycmrv from cmex8 rather than cmex10, since they are more
+ suitably sized for the <summation> and <product> from Adobe Symbol.
+ Made all the accents in latin.mtx zero depth (which TeX's math accent
+ placement requires). Discovered that cmex8 doesn't have a
+ CODINGSCHEME, so I added one by hand to the PL file.
+
+30 Jan 1994, v1.315: Replaced cmex8 in zpsycmrv by cmex9. Added
+ <epsilon1>, <pi1> and <rho1> to unsethum.mtx. Added the \skewchar
+ declaration for zptmcmrm. Fixed a bug which was causing negative
+ mathchardefs. Finished off the skewchar kerns for zptcmrm.
+ Renamed timesmat.sty to mathptm.sty, since there's already a
+ timesmat.sty.
+
+7 Feb 1994, v1.316: Fixed the \ProvidesPackage line in mathptm.sty.
+
+8 Feb 1994, v1.317: Fixed a bug with fontptcm.tex where I'd put the
+ \skewchar command in the wrong argument! Made the `size' argument
+ to \installfont an FD size specification. Added fakes for <lslash>
+ and <Lslash> built from <lslashslash> to latin.mtx. Added a check
+ that a ligature glyph exists before writing out the LIGTABLE entry.
+ Edited the documentation a bit---thanks to Karl Berry for comments.
+ Added the fontcmro example, inspired by Norman Walsh. Fixed a bug
+ with .fd file generation which caused multiple \DeclareFontShape
+ entries to be produced. Added \unfakable{endash} and
+ \unfakable{emdash} to latin.mtx. Sebastian spotted that one.
+
+10 Feb 1994, v1.318: Added \unfakable{dotlessi} to latin.mtx. Karl
+ Berry pointed that one out.
+
+1 Mar 1994, v1.319: Added the HEADER. Karl Berry pointed that one out
+ too.
+
+6 Apr 1994, v1.320: Write out a LABEL BOUNDARYCHAR ligable entry where
+ necessary. Alan Hoenig pointed that one out. Rewrote mathptm.sty
+ to remove some of the nastier hacks.
+
+7 Apr 1994, v1.321: Added the ability to generate font substitutions
+ in the FD files.
+
+8 Apr 1994, v1.322: Fixed a bug with font substitution which was
+ causing the font substitutions to be written out before the real
+ fonts. Moved the mathptm package to standing on its own.
+
+17 Apr 1994, v1.323: Added the top-level \latinfamily commands, and
+ updated the example files and documentation to use them. Added
+ OT1ci.etx. Made the list of files in an \installfont command
+ expanded before running along the list, so you can have a macro
+ which expands out to a list of files now. Added substitutions for
+ semibold and demibold, for upright italic, and for sc to nc. Added
+ OT19.etx, OT1c9.etx, OT1ci9.etx, OT1i9.etx, T19.etx and T1c9.etx.
+ Removed OT1o.etx.
+
+19 Apr 1994, v1.324: Removed italic and oblique small caps. Fixed a
+ bug which was causing the latin.mtx file to be read in inside a
+ group if a latin family without an expert font was created.
+
+25 Apr 1994, v1.325: Removed a bug which caused sc fonts to have the
+ same names as u&lc fonts. Fixed a bug which was causing oblique
+ fonts not to be generated properly. Fixed a bug with FD
+ generation which was producing too few arguments for
+ DeclareFontShape for substitutions.
+
+27 May 1994, v1.326: Made fontinst.tex a 2e document. Fixed a bug
+ with generating slant which was generating slant in design size per
+ point rather than points per point. Sigh. Ciar\'an \'O Duibh\'in
+ spotted that one. Declared this to be the first full release.
+
+1 Jun 1994, v1.327: Fixed bug with filename parsing which was losing
+ variants. Rewrote the encoding files to use the OT1 tt encoding
+ whenever monoweight is set. Removed the f-liagatures from the T1
+ encoding for monowidth fonts. Sebastian spotted that one.
+
+2 Jun 1994, v1.328: Fixed a bug with FD generation: I'd added the
+ extra argument for series substitutions but not shape
+ substitutions. Ta Sebastian again.
+
+3 Jun 1994, v1.329: Made Upsilon1 unfakable.
+
+15 Jun 1994, v1.330: Fixed a bug with font substitution which was
+ ignoring chains of substitutions such as bx -> b -> db. Added the
+ m->l substitution. Renamed the `mn' and `bn' series to `mc' and
+ 'bc'. Added the `k' and `m' series.
+
+16 Jun 1994, v1.331: Sebastian spotted another problem with
+ substitutions. If a font had both a series and a shape
+ substitution, the series was sometimes getting lost.
+ Steve Grathwohl pointed out that I'd forgotten to switch off
+ kerning before loading the math italic fonts in fontcmro.
+
+27 Jun 1994, v1.332: Added braces to \needsfontinstversion, which was
+ clobbering \a_dimen and \b_dimen. Fixed a bug with compwordmark
+ which was causing it to get letterspacing added to it. Added the
+ GLYPH-spacing variable to cope with this. These were
+ spotted by Constantin Kahn.
+
+29 Jun 1994, v1.333: Added \ProvidesFile line to the .fd files.
+
+16 Aug 1994, v1.334: Added \frompl, fixed bugs with \resetdim and
+ <ccedilla>---all reported by Constantin Kahn.
+
+9 Sep 1994, v1.335: Fixed a bug with NEXTLARGER and VARCHAR generation
+ which was causing the entries to be printed out for nonexistent
+ glyphs---spotted by Alan Hoenig. Updated the example installation
+ files for Times, Helvetica and Courier. Updated to a more recent
+ trig.sty, and added the hacks to allow trig.sty to be used outside
+ LaTeX2e. Made fontinst.sty initex processable, so you can save
+ memory by building your own fontinst format without plain. Fixed
+ the names of `narrow' fonts, which used to clobber the non-narrow
+ fonts---spotted by Peter Busk Laursen.
+
+12 Sep 1994, v1.336: Fixed a bug with fontcmro, which was listing the
+ 9pt font as being 10pt in the fd file---spotted by Steve Grathwohl.
+
+22 Sep 1994, v1.337: Corrected spelling mistake in \declareencoding in
+ error message of \CODINGSCHEME---spotted by Alan Hoenig.
+
+8 Oct 1994, v1.338: Corrected definition of \space in
+ fontinst.ini---spotted by Rob Hutchings.
+
+18 Nov 1994, v1.339: Added 8r.etx and 8r.enc from Sebastian.
+ Distributed a patched fontinst.rc file containing a reimplementation
+ of \latinfamily that uses the 8r encoding.
+
+21 Nov 1994, v1.400: Added missing \fi to 8r.etx---spotted by Steve
+ Grahthwohl. Added \mtxtopl for expert fonts in
+ \latinfamily---spotted by Rob Hutchings.
+
+29 Nov 1994, v1.401: Added hyphen+hyphenchar = hyphenchar lig to
+ T1.etx (so that foo-bar words can be hyphenated as foo<hyphenchar>
+ bar)---spotted by Frank Mittelbach. Made default stretch and
+ shrink 50% and 16.7% of <space> respectively. Added \everyjob to
+ fontinst.ini to load the fontinst.rc file---spotted by Rob
+ Hutchings.
+
+7 Dec 1994, v1.402: Corrected typos with 8r.etx---spotted by
+ Constantin Kahn.
+
+12 May 1995, v1.403: Mentioned the pl files in fontinst.tex, and added
+ the encoding TEX TEXT WITHOUT F-LIGATURES. Both spotted by John
+ Wells.
+
+16 Sep 1995, v1.500: Incorporated changes by SPQR and CK in their
+ fontinst.rc file. In detail... Added the \NOFILES debugging
+ option. Used SPQR and CK's complete reimplementation of
+ \latinfamily. Added the TEXBASE1ENCODING. Added \etxtopl and
+ \installrawfont. Added the setting of \errorcontextlines. Grabbed
+ T1i.etx from CTAN. Added the setting of \newlinechar (pointed out
+ by Constantin). Fixed bug with \resetcommand which stopped braces
+ around the csname from working (Contantin again). Removed the
+ contrib/zd directory at Constantin's request. Rewrote the
+ documentation. Added fontinst.cls.
+
+[16 Sep 1995, v1.500 on CTAN with fonts/psfonts/tools]
+
+21 Sep 1995, v1.501: Corrected some typos in the documentation.
+ Added kerns for ng, Ng and hyphenchar. Fixed spacing in faked
+ <FFsmall> and friends. Fixed kerning of <dotlessJ>. Raised the
+ <macron> in <dbar> to half-way between the xheight and the height of
+ <d>. Added fake <ng> -> <eng>. Made \cscbotaccent and
+ \csctopaccent look to see if both of the glyphs exist rather than just
+ the first. Thanks to Hilmar Schlegel for all these points.
+
+29 Sep 1995, v1.502: Renamed all the distributed afm files from
+ *0*.afm to *8a*.afm. Updated the file header on 8r.etx.
+ Renamed Karl's fontinst.rc to karl-fontinst.rc, to avoid it being
+ picked up by every punter.
+ All pointed out by Sebastian.
+
+24 Nov 1995, v1.503: Included Alan Hoenig's vfinst in contrib/vfinst.
+
+23 Jan 1996, v1.504: Included some of Sebastian's changes to OT1.etx:
+ upped stretch and shrink to .6 and .24 of space; reduced extra
+ space after . to .24 of space; removed <endash> + <hyphen> =
+ <emdash> ligature from OT1 monowidth; made \setslot{grave}
+ etc. into \setslot{\lc{Grave}{grave}} etc; fixed a bug with T1c
+ `monoweight' -> `monowidth' (!); implemented Rob's changes to
+ small caps and small accented caps; included fake kerning for
+ Udieresis; added hackery from spqr.rc for faking small caps and
+ faking widths.
+
+[28 Jan 1996, v1.504 on CTAN with:fonts/psfonts/tools]
+
+24 Jan 1996, v1.505: Updated fontptcm.tex to use ptmr8a rather than ptmr0.
+
+25 Jan 1996, v1.506: Added extra braces to \latinfamily to stop
+ setting of \digits in one run from affecting it in subsequent
+ runs. Spotted by Richard Walker.
+
+23 Feb 1996, v1.507: Replaced vpltovf by vptovf. Spotted by Sebastian.
+
+17 Jun 1996, v1.508: Added an \ifdim check to stop lots of MOVERIGHT R 0.0
+ instructions being generated. Spotted by Sebastian.
+
+18 Jun 1996, v1.509: Allow real numbers in .afm files. Spotted by
+ Gintautas Grigelionis. Made spaces before ; optional, in order to
+ parse v2.0 afm files (spaces before ; were made compulsory in v3.0).
+
+20 Jun 1996, v1.510: Added 9d and 9o encodings for fonts with
+ old-style digits.
+
+21 Jun 1996, v1.511: Removed \endinput from the end of .fd files, so
+ that additions can be made more easily.
+
+24 Jul 1996, v1.512: Updated version of trig.sty.
+
+7 Aug 1996, v1.513: Moved unfakable glyphs eariler in latin.mtx so
+ that all-caps fonts will work.
+
+6 Feb 1997, v1.514: Added a zero-width rule to cwm in latin.mtx (to
+ stop the MAP entry from being empty). Made cwm 1ex high.
+
+--- Copyright 1993, 1994, 1995, 1996 Alan Jeffrey ---
+
+11 Feb 1997, unofficial v1.6 SPQR on CTAN:fonts/psfonts/tools
+ Derived from v1.504 with minor hacks and fixes (not documented).
+
+29 May 1998, unofficial v1.7 SPQR on CTAN:fonts/psfonts/tools
+ Derived from v1.6 with fixes by UV. Corrected mapping of weights.
+ Added code for 8r-encoded AFM files (intended to cope with ttf2afm
+ limitations, but taken out again after ttf2afm was updated).
+
+22 Jun 1998, unofficial v1.8 UV
+ Derived from v1.7 and v1.511. Many .etx/.mtx files touched up.
+ fontinst.sty and fontdoc.sty now generated from fontinst.dtx.
+ \textcompfamily integrated into \latinfamily. Reintroduced
+ oldstyle encodings (from v1.511). 8y.etx/8y.mtx added as an
+ alternative to 8r.etx/8r.mtx. ts1.etx and textcomp.mtx revised.
+
+30 Jun 1998, unofficial v1.800 UV on CTAN:fonts/utilities/fontinst
+ Several changes to examples/mathptm and examples/mathptmx.
+
+07 Jun 1998, v1.801: Fixed a bug when oldstyle small-caps fonts
+ are generated from <font>8r + <font>8x instead of <font>c8r.
diff --git a/fonts/utilities/fontinst/source/fibasics.dtx b/fonts/utilities/fontinst/source/fibasics.dtx
new file mode 100644
index 0000000000..eb8bc1b7a1
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fibasics.dtx
@@ -0,0 +1,2345 @@
+% \CheckSum{1505}
+% \iffalse meta-comment
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+% the fontinst maintenance team and any individual authors listed
+% elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+%%% From file: fibasics.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey\and Sebastian Rahtz\and Ulrik Vieth\and
+ Lars Hellstr\"om}
+\usepackage{fisource}
+\begin{document}
+\maketitle
+\DocInput{fibasics.dtx}
+\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \StopEventually{}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{quote}
+% ``Can't say I've ever been too fond of beginnings, myself.
+% \emph{Messy} little things. Give me a good ending any time.
+% You know where you \emph{are} with an ending.''\relax
+% \nobreak\hskip 0pt plus 1fill\penalty0\hskip 2em\relax
+% \vadjust{}\nobreak\hskip 1em plus 1fill\textemdash
+% \ from \emph{The kindly ones} by \textsc{Neil Gaiman} et al.^^A
+% \nobreak\hskip-\parfillskip\vadjust{}
+% \end{quote}
+%
+%
+% \section{The first and the last}
+%
+% \subsection{Version numbers}
+%
+% We start by making some default catcode assignments, in case we are
+% using ini\TeX{}.
+% \begin{macrocode}
+%<*pkg>
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+%</pkg>
+% \end{macrocode}
+%
+% \begin{macro}{\fontinstversion}
+% If we are running under ini\TeX{} we cannot put the identification
+% stuff any earlier than this. Note that |\fontinstversion| is not
+% just used for indentification but also in |\needsfontinstversion|.
+% \begin{macrocode}
+%<pkg|doc>\def\fontinstversion{1.933}
+% \end{macrocode}
+% \end{macro}
+%
+% If we are running under ini\TeX{} or \texttt{plain}, we have to get
+% around the \LaTeX{}-specific |\ProvidesPackage| stuff.
+%
+% \begin{macrocode}
+%<*pkg>
+\ifx\ProvidesPackage\undefined
+ \def\NeedsTeXFormat#1{}
+ \def\ProvidesPackage#1[#2]{}
+\fi
+%</pkg>
+% \end{macrocode}
+%
+% Now we can identify ourselves as usual.
+%
+% \begin{macrocode}
+%<doc>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<doc>\ProvidesPackage{fontdoc}
+%<pkg>\ProvidesPackage{fontinst}
+%<pkg|doc>[2007/01/23 v\fontinstversion\space
+%<doc> fontinst documentation package]
+%<pkg> fontinst installation package]
+% \end{macrocode}
+%
+% While we're at version numbers anyway, we might as well define the
+% command for testing them. Note however that the module name is not
+% \Module{pkg} as above, but \Module{pkg2}. Code in the latter module
+% ends up at the very end of \texttt{fontinst.sty}!
+%
+% \begin{macro}{\needsfontinstversion}
+% The macro:
+% \begin{quote}
+% |\needsfontinstversion|\marg{number}
+% \end{quote}
+% checks the version number.
+%
+% \begin{macrocode}
+%<*pkg2>
+\def\needsfontinstversion#1{{
+ \a_dimen=#1pt
+ \b_dimen=\fontinstversion~pt\x_relax
+ \ifnum\a_dimen>\b_dimen
+ \immediate\write16{}
+ \immediate\write16{Warning:~This~file~needs~fontinst~version~#1.}
+ \immediate\write16{Warning:~You~are~using~version~
+ \fontinstversion.}
+ \immediate\write16{Warning:~This~may~cause~errors.}
+ \immediate\write16{}
+ \fi
+}}
+%</pkg2>
+% \end{macrocode}
+%
+% In \package{fontdoc}, |\needsfontinstversion| is printed out as a
+% comment.
+% \changes{1.918}{2001/06/19}{Different formatting in encoding
+% specification files. (LH)}
+% \begin{macrocode}
+%<*doc>
+\newcommand*\needsfontinstversion[1]{%
+ \ifFD@spec@
+ \comment{Automatic processing of this document as a data file
+ requires \textsf{fontinst} v\,#1 or higher.}%
+ \else
+ \Bheading{Needs fontinst v\thinspace#1}%
+ \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Special catcodes and configuration file}
+%
+% \package{fontinst} uses some unusual, but convenient, settings of
+% |\catcode|. |@| and |_| are made letters, |~| is made a space, and
+% space and newline are ignored. Before setting those however, we save
+% the current values of the catcodes, so that they can be restored at
+% the end of \texttt{fontinst.sty}.
+%
+% \begin{macro}{\normalcc}
+% \begin{macro}{\fontinstcc}
+% \multchanges{\cs{fontinstcc}\cs{normalcc}}{1.915}{2000/08/09}^^A
+% {Introduced commands for changing between \package{fontinst}
+% internal catcodes and normal catcodes, as suggested by
+% Karsten Tinnefeld. (LH)}
+% The |\fontinstcc| command changes the catcodes of certain characters
+% to what is used in the \package{fontinst} source and the |\normalcc|
+% command changes them back; their use is analogous to that of the
+% |\make|\-|at|\-|letter| and |\make|\-|at|\-|other| commands in
+% \LaTeX.
+%
+% If, for some reason, you use other ``normal'' catcodes than
+% \package{fontinst} does by default, you may have to redefine
+% |\fontinstcc| and |\normalcc|. The easiest way to do this is
+% probably to use the |\add_to| macro.
+%
+% \multchanges{\cs{spacecatcode}\cs{nlcatcode}\cs{atcatcode}^^A
+% \cs{underscorecatcode}\cs{tildecatcode}}{1.915}{2000/08/09}^^A
+% {Removed since the contents can just as well be stored in
+% \cs{normalcc}. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\a_macro#1{\catcode\number`#1=\the\catcode`#1 }
+\edef\normalcc{%
+ \a_macro{\ }\a_macro{\^^M}\a_macro{\@}\a_macro{\_}\a_macro{\~}
+}
+% \end{macrocode}
+% The above definition makes the |\normalcc| macro end with a space.
+% This is deliberate; the space is used to terminate the last number
+% in the macro.
+%
+% \begin{macrocode}
+\def\fontinstcc{%
+ \catcode`\ =9%
+ \catcode`\^^M=9%
+ \catcode`\@=11%
+ \catcode`\_=11%
+ \catcode`\~=10
+}
+\fontinstcc
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% We input the \texttt{fontinst.rc} file, if it exists.\relax
+% \changes{1.6}{1997/02/07}{\texttt{fontinst.rc} search order changed
+% (Thierry Bouche).}\relax
+% \SortIndex{fontinst.rc file}{\texttt{fontinst.rc} file}
+%
+% UV, 06/1998: What is this \texttt{fontinst.rc} file good for?
+% It turns out that you can use it to do |\def\raw_encoding{8y}|
+% if you prefer to install your fonts the other way.
+%
+% \begin{macrocode}
+%<*pkg2>
+%<*!misc>
+\if_file_exists{fontinst.rc}\then
+ \primitiveinput fontinst.rc
+\else
+ \immediate\write16{No~file~fontinst.rc.}
+\fi
+%</!misc>
+% \end{macrocode}
+% Use a different configuration file for \texttt{finstmsc.sty}.^^A
+% \changes{1.905}{1999/06/21}{Different config file for
+% \texttt{finstmsc.sty}. (LH)}
+% \begin{macrocode}
+%<*misc>
+\if_file_exists{finstmsc.rc}\then
+ \primitiveinput finstmsc.rc
+\else
+ \immediate\write16{No~file~finstmsc.rc.}
+\fi
+%</misc>
+% \end{macrocode}
+%
+% At the end of \texttt{fontinst.sty}, we restore the catcodes we
+% changed.
+% \changes{1.910}{1999/11/01}{Catcodes restored \emph{after} reading
+% \texttt{.rc} file. (LH\&UV)}
+%
+% \begin{macrocode}
+\normalcc
+%</pkg2>
+% \end{macrocode}
+%
+%
+% \subsection
+% {Plain \TeX{} macros from \texttt{fontinst.ini}}
+% ^^A \subsection{PlainTeX macros from fontinst.ini}
+%
+% If we're running in ini\TeX{} we input some definitions taken
+% from \texttt{plain}.
+%
+% \begin{macrocode}
+%<*pkg>
+\ifx\@ne\undefined_command
+ \input fontinst.ini\relax
+\fi
+%</pkg>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*ini>
+\chardef\active=13
+
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+\countdef\count@=255
+\dimendef\dimen@=0
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No~room~for~a~new~#3}\fi}
+
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+
+\def\space{~}
+\let\bgroup={
+\let\egroup=}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\supereject{\par\penalty-\@MM}
+\outer\def\bye{\par\vfill\supereject\end}
+%</ini>
+% \end{macrocode}
+% The two last commands above also need to be defined if we're
+% running under \LaTeX. In that case we need to be careful with |\bye|
+% however, as no |\if|\textellipsis\ can skip over code that explicitly
+% contains that control sequence, if it has been defined as above.
+% \begin{macrocode}
+%<*pkg>
+\ifx\bye\undefined_command
+ \def\supereject{\par\penalty-\@MM}
+ \outer\expandafter\def \csname bye\endcsname
+ {\par\vfill\supereject\@@end}
+\fi
+%</pkg>
+% \end{macrocode}
+%
+% \changes{1.910}{1999/11/01}{Make \cs{everyjob} code optional, and
+% simplify it a little. (LH\&UV)}
+% \begin{macrocode}
+%<*ini&everyjob>
+\everyjob{%
+ \if_file_exists{fontinst.rc}\then
+ \primitiveinput~fontinst.rc
+ \else
+ \immediate\write16{No~file~fontinst.rc.}
+ \fi
+}
+%</ini&everyjob>
+% \end{macrocode}
+%
+%
+% \section{Basic definitions}
+%
+% \subsection{Declaring variables and constants}
+%
+% Some temporary variables:
+%
+% \begin{macro}{\a_count}
+% \begin{macro}{\b_count}
+% \begin{macro}{\c_count}
+% \begin{macro}{\d_count}
+% \begin{macro}{\e_count}
+% \begin{macro}{\f_count}
+% \begin{macro}{\g_count}
+% \begin{macrocode}
+%<*pkg>
+\newcount\a_count
+\newcount\b_count
+\newcount\c_count
+\newcount\d_count
+\newcount\e_count
+\newcount\f_count
+\newcount\g_count
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}
+% \begin{macro}{\a_dimen}
+% \begin{macro}{\b_dimen}
+% \begin{macro}{\c_dimen}
+% \begin{macro}{\d_dimen}
+% \begin{macrocode}
+\newdimen\a_dimen
+\newdimen\b_dimen
+\newdimen\c_dimen
+\newdimen\d_dimen
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\a_toks}
+% \begin{macro}{\b_toks}
+% \begin{macro}{\c_toks}
+% \begin{macrocode}
+\newtoks\a_toks
+\newtoks\b_toks
+\newtoks\c_toks
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{switch}{_a_}
+% \changes{1.901}{1999/03/07}{Temporary switch added. (LH)}
+% \begin{macrocode}
+\newif\if_a_
+% \end{macrocode}
+% \end{switch}
+%
+% \describecsfamily{\meta{letter}_macro}
+% Besides these temporary variables that have to be declared, the family
+% of control sequences with names of the form |\|\meta{letter}|_macro|,
+% such as |\a_macro|, |\b_macro|, etc., should be used as ``macro valued''
+% temporary variables.
+% \changes{1.903}{1999/05/13}{Introduced the
+% \cs{\meta{letter}_macro} temporary variables,
+% replaced \cs{temp_command}. (LH)}
+%
+% \begin{macro}{\out_file}
+% Some global variables:
+% \begin{macrocode}
+\newwrite\out_file
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\one_thousand}
+% \begin{macro}{\five_hundred}
+% \begin{macro}{\one_hundred}
+% \begin{macro}{\max_mathchardef}
+% \begin{macro}{\two_thousand}
+% \changes{1.913}{2000/03/11}{Constant added. (LH)}
+% \begin{macro}{\half_point}
+% \changes{1.913}{2000/03/04}{Constant added. (LH)}
+% Some constants:
+% \begin{macrocode}
+\mathchardef\one_thousand=1000
+\mathchardef\five_hundred=500
+\mathchardef\one_hundred=100
+\mathchardef\max_mathchardef="7FFF
+\mathchardef\two_thousand=2000
+\newdimen\half_point \half_point=0.5pt
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+%
+% \subsection{Trigonometry macros}
+%
+% Before v\,1.930, the file \texttt{trig.sty} used to be input at this
+% point. That is now inlined into the \package{fontinst} source proper
+% instead.
+%
+% \multchanges{\cs{@tempdima}\cs{@tempdimb}}{1.930}{2005/02/06}
+% {These aliases for \cs{a_dimen} and \cs{b_dimen} were removed,
+% since we may now hack them out of \cs{CalculateTan}. (LH)}
+%
+%
+% \subsection
+% {\package{fontdoc}-specific declarations}
+% ^^A \subsection{fontdoc-specific declarations}
+%
+% As of v\,1.917, \package{fontdoc} has options, so we better start
+% with declaration and processing of these.
+% \changes{1.917}{2001/03/31}{Option processing added. (LH)}
+%
+% \begin{option}{specification}
+% \begin{switch}{FD@spec@}
+% The \texttt{specification} option tells \package{fontdoc} that the
+% document is an encoding specification rather than a production
+% file---this changes some minor details in the typesetting. The
+% state of this option is recorded in the |FD@spec@| switch.
+% \begin{macrocode}
+%<*doc>
+\newif\ifFD@spec@
+\FD@spec@false
+\DeclareOption{specification}{\FD@spec@true}
+% \end{macrocode}
+% \end{switch}\end{option}
+%
+% \begin{option}{hypertex}
+% \changes{1.918}{2001/06/17}{Option added. (LH)}
+% \begin{option}{pdftex}
+% \changes{1.920}{2001/09/24}{Option added. (LH)}
+% \begin{macro}{\FD@codepoint}
+% The \texttt{hypertex} and \texttt{pdftex} options tell
+% \package{fontdoc} to include Hyper\TeX\ |\special|s and pdf\TeX\
+% annotations, in every code point number set using |\Unicode| or
+% |\textunicode|, for links to glyph images on the Unicode
+% consortium web site. The URLs to use are as follows:
+% \begin{quote}
+% \small
+% To access the reference glyph for any Unicode character,
+% you can use the new URL syntax like this:
+% \begin{quote}
+% \texttt{http://www.unicode.org/cgi-bin/refglyph?}^^A
+% \meta{XX}\texttt{-}\meta{nnnn}
+% \end{quote}
+% where \meta{XX} is the point size and \meta{nnnn} is the
+% hexadecimal codepoint. Please note however that only \texttt{24}
+% is supported as a size parameter at this time. (We are
+% reserving the possibility of providing other sizes in the
+% future.) Here is an example of usage for \texttt{U+4E78}:
+% \begin{quote}
+% \texttt{http://www.unicode.org/cgi-bin/refglyph?24-4E78}
+% \end{quote}
+% (This supports up to 6 hex digits, so it can also be used
+% with the supplementary characters.)
+% \end{quote}
+%
+% \iffalse
+% Documentation for a similar older service:
+% \begin{quotation}
+% \small
+% You may embed references to the glyph images on the Unicode site
+% in your own web pages. For example, to display a Euro sign
+% (\texttt{U+20AC}) you can use the following HTML:
+% \begin{quote}
+% |<IMG SRC="http://charts.unicode.org/Glyphs/20/U20AC.gif">|
+% \end{quote}
+% The subdirectory to use within the \texttt{Glyphs/} directory
+% is the first two hexadecimal digits of the Unicode code point.
+% The set of glyphs available covers all of Unicode 3.0 with the
+% exception of Han ideographs and Hangul syllables.
+%
+% However, you should only make occasional use of these glyphs.
+% If there is too much web traffic the Unicode
+% Consortium may be forced to discontinue this service.
+% \end{quotation}
+% \fi
+% Coding this for Hyper\TeX\ is pretty straightforward.
+% \begin{macrocode}
+\DeclareOption{hypertex}{
+ \providecommand*\FD@codepoint[1]{%
+ \uppercase{\edef\@tempa{#1}}%
+ \special{html:<a href="%
+ http://www.unicode.org/cgi-bin/refglyph?24-\@tempa
+ ">%
+ }%
+ \texttt{U+\@tempa}%
+ \special{html:</a>}%
+ }%
+}
+% \end{macrocode}
+% The pdf\TeX\ implementation is easy too, but there is one
+% complication: The key primitive is called |\pdfannotlink| in
+% v\,0.13, but |\pdfstartlink| in v\,0.14. My thanks goes to H\`an
+% Th\'{\^e} Th\`anh, who helped me sort that out.
+% \begin{macrocode}
+\DeclareOption{pdftex}{
+ \providecommand*\FD@codepoint[1]{%
+ \mbox{%
+ \uppercase{\edef\@tempa{#1}}%
+ \ifx \pdfstartlink\@undefined
+ \pdfannotlink
+ \else
+ \pdfstartlink
+ \fi attr {/Border [0 0 0]} user {%
+ /Subtype /Link /A <<%
+ /S /URI /URI (%
+ http://www.unicode.org/cgi-bin/refglyph?24-\@tempa
+ )%
+ >>}%
+ \textcolor{blue}{\texttt{U+\@tempa}}%
+ \pdfendlink
+ }%
+ }%
+ \AtEndOfPackage{\RequirePackage[pdftex]{color}}%
+}
+% \end{macrocode}
+% It would be quite possible to make these links according to some
+% other standard (e.g.~\LaTeX\-to\-HTML) instead by including a suitable
+% definition of |\FD@codepoint| in your \texttt{fontdoc.cfg} file.
+% I could include code for those standards as well if someone sends
+% it to me.
+%
+% I decided against using commands in the \package{hyperref} or
+% \package{hyper} packages for this as these packages do so much more
+% that I don't want. If some day a package providing a basic interface
+% for making hyperlinks is included in required \LaTeX\ then this
+% decision should certainly be reconsidered.
+% \end{macro}\end{option}\end{option}
+%
+% Input a local configuration file, if it exists.
+% \begin{macrocode}
+\InputIfFileExists{fontdoc.cfg}{%
+ \typeout{*************************************^^J%
+ * Local config file fontdoc.cfg used^^J%
+ *************************************}%
+}{}
+% \end{macrocode}
+%
+% Finally process the options.
+% \begin{macrocode}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+%
+% The \package{amstext} package is required, since the |\text| command
+% is used in formatting some integer expressions.
+% \changes{1.916}{2001/01/02}{Requiring the \package{amstext} package
+% in \package{fontdoc}. (LH)}
+% \begin{macrocode}
+\RequirePackage{amstext}
+% \end{macrocode}
+%
+% \begin{macro}{\a@count}
+% \begin{macro}{\b@count}
+% \changes{1.916}{2001/01/02}{Variable added. (LH)}
+% \begin{macro}{\a@dimen}
+% Three private variables:
+% \begin{macrocode}
+\newcount\a@count
+\newcount\b@count
+\newdimen\a@dimen
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% Some useful macros and constrol structures:
+%
+% \begin{macrocode}
+\def\x@cs#1#2{\expandafter#1\csname#2\endcsname}
+\def\FD@swap@two#1#2{#2#1}
+% \end{macrocode}
+%
+% \begin{macro}{\Aheading}
+% \changes{1.909}{1999/10/18}{Use \cs{addvspace} to make space
+% above. (LH)}
+% \changes{1.909}{1999/10/20}{Insert a \cs{penalty} for pagebreaking
+% after an \cs{Aheading}. (LH)}
+% \changes{1.920}{2001/10/19}{Encouraged page breaks before an
+% \cs{Aheading}. (LH)}
+% \begin{macro}{\Bheading}
+% |\Aheading| and |\Bheading| are used to typeset various headings.
+% \begin{macrocode}
+\newcommand\Aheading[1]{%
+ \par\pagebreak[1]\addvspace\medskipamount
+ \noindent\textbf{#1}\vadjust{\penalty200}\par
+}
+\newcommand\Bheading[1]{\par\noindent\textbf{#1}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% Some formating commands and a macro that comes in handy. It used to
+% say |\raggedright| at this point as well, but that functionality has
+% been moved into |\encoding| and |\metrics|.
+%
+% \definechange{raggedright}{1.920}{2001/09/16}{The body (between
+% \cs{metrics} and \cs{endmetrics}, and \cs{encoding} and
+% \cs{endencoding} respectively) of a \package{fontdoc} document is
+% now typeset in a \texttt{flushleft} environment. It used to be that
+% the entire document was typeset this way. (LH)}
+% \usechange{raggedright}
+% \changes{1.923}{2002/10/26}{Making sure \cs{lineskiplimit} is
+% positive. (LH)}
+%
+% \begin{macrocode}
+\raggedbottom
+\ifdim 1sp>\lineskiplimit \lineskiplimit=0.5pt \fi
+\newcommand\plain{\texttt{plain}}
+% \end{macrocode}
+%
+% \begin{macro}{\plainint}
+% \begin{macro}{\plaindiv}
+% \begin{macro}{\plainneg}
+% \changes{1.928}{2004/11/24}{Added \cs{plainneg}. That the
+% \protect\LaTeX\ \cs{neg} is taken over by \package{fontdoc} but
+% is needed in \texttt{oms.etx} had gone unnoticed for over ten
+% years!! (LH) Problem reported by Peter Dyballa.}
+% \begin{macro}{\plainmax}
+% \begin{macro}{\plainmin}
+% \package{fontdoc} saves away \LaTeX's |\int|, |\div|, |\neg|, |\max|,
+% and |\min| as |\plainint|, |\plaindiv|, |\plainneg|, |\plainmax|,
+% and |\plainmin| respectively, since these control sequences are going
+% to be used for other purposes.
+% \begin{macrocode}
+\let\plainint=\int
+\let\plaindiv=\div
+\let\plainneg=\neg
+\let\plainmax=\max
+\let\plainmin=\min
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\TypesetList}
+% \changes{1.914}{2000/05/13}{Macro added. (LH)}
+% \begin{macro}{\list@item@counter}
+% The |\TypesetList| command typesets the \meta{arg}s in a sequence of
+% |\do|\marg{arg} macros with separators depending on position in and
+% length of the sequence. It is loosely based on a description of a
+% similar command in the \package{amsref} package, but it has fewer
+% features, and I don't know if there is any similarity between the
+% implementations.
+%
+% The syntax is
+% \begin{isyntax}
+% |\TypesetList|\marg{left}\marg{onlysep}\marg{nonlastsep}\penalty0
+% \marg{lastsep}\penalty0\marg{right}\penalty0
+% \marg{empty}\penalty0\marg{wrap}\penalty0\marg{list}
+% \end{isyntax}
+% \meta{list} is the actual list of |\do|\marg{arg}s. If that is
+% empty then \meta{empty} is typeset. Otherwise the typeset text
+% begins with \meta{left}, ends with \meta{right}, and contains the
+% formatted forms of every \meta{arg} in the list of |\do|\marg{arg}s.
+% The formatting here consists of passing the \meta{arg} as the
+% argument to \meta{wrap}, which is typically a one-argument macro.
+% Between two ``formatted \meta{arg}s'' will \meta{onlysep},
+% \meta{nonlastsep}, or \meta{lastsep} be put, depending on the number
+% of \meta{arg}s in the list and the position in the list. If the list
+% has length two then \meta{onlysep} will be used for the only separator
+% needed. If the list has length greater than two then \meta{nonlastsep}
+% will be used for all separators but the last, and \meta{lastsep} will
+% be used for the last.
+%
+% All of the arguments of |\TypesetList| must survive being passed
+% through a |\def|.
+% \begin{macrocode}
+\newcount\list@item@counter
+\newcommand\TypesetList[8]{%
+ \begingroup
+ \list@item@counter=\z@
+ \def\do##1{\advance\list@item@counter\@ne}%
+ #8%
+ \ifcase \list@item@counter \or
+ \def\do##1{#1#7{##1}}%
+ \or
+ \def\do##1{%
+ \advance\list@item@counter\@ne
+ \ifnum \list@item@counter=\@ne #1\else #2\fi
+ #7{##1}%
+ }%
+ \else
+ \advance\list@item@counter\m@ne
+ \expandafter\def \expandafter\do \expandafter##\expandafter1%
+ \expandafter{\expandafter\ifnum \the\list@item@counter
+ =\list@item@counter
+ #4%
+ \else\ifnum \z@=\list@item@counter
+ #1%
+ \else
+ #3%
+ \fi\fi
+ \advance\list@item@counter\@ne
+ #7{##1}%
+ }%
+ \fi
+ \ifnum \z@=\list@item@counter
+ #6%
+ \else
+ \list@item@counter=\z@
+ #8%
+ #5%
+ \fi
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \section
+% {\TeX{} hackery}
+% ^^A \section{TeX hackery}
+% \changes{1.902}{1999/05/01}{Moved Section \thesection\space to
+% \texttt{fibasics.dtx}. (LH)}
+%
+% \subsection{Utiltiy macros}
+%
+% \begin{macro}{\x_cs}
+% \begin{macro}{\x_relax}
+% \begin{macro}{\g_let}
+% \begin{macrocode}
+%<*pkg>
+\def\x_cs#1#2{\expandafter#1\csname#2\endcsname}
+\let\x_relax=\relax
+\def\g_let{\global\let}
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \changes{1.900}{1999/02/07}{Replaced \cs{relax} by \cs{x_relax}. (LH)}
+%
+% \begin{macro}{\x@relax}
+% \begin{macrocode}
+%<doc>\let\x@relax=\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\empty_command}
+% \begin{macro}{\gobble_one}
+% \begin{macro}{\gobble_two}
+% \begin{macro}{\gobble_three}
+% \begin{macro}{\identity_one}
+% \begin{macro}{\first_of_two}
+% \begin{macro}{\second_of_two}
+% \begin{macro}{\swap_two}
+% \changes{1.912}{2000/02/16}{Macro added. (LH)}
+% \begin{macro}{\first_of_three}
+% \changes{1.914}{2000/05/30}{Macro added. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\empty_command{}
+\def\gobble_one#1{}
+\def\gobble_two#1#2{}
+\def\gobble_three#1#2#3{}
+\def\identity_one#1{#1}
+\def\first_of_two#1#2{#1}
+\def\second_of_two#1#2{#2}
+\def\swap_two#1#2{#2#1}
+\def\first_of_three#1#2#3{#1}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\hash_char}
+% \begin{macro}{\percent_char}
+% \begin{macro}{\left_brace_char}
+% \begin{macro}{\right_brace_char}
+% \begin{macrocode}
+\bgroup
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\#=12
+ \catcode`\%=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\hash_char[#]
+ \gdef\percent_char[%]
+ \gdef\left_brace_char[{]
+ \gdef\right_brace_char[}]
+\egroup
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\first_char}
+% Return the first character of a string.
+%
+% \begin{macrocode}
+\def\first_char#1#2={#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\add_to}
+% Append one or more tokens to the replacement text of a
+% parameterless macro.
+% \begin{macrocode}
+\def\add_to#1#2{
+ \ifx#1\x_relax
+ \def#1{#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{#1#2}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prep_to}
+% Prepend one or more tokens to the replacement text of a
+% parameterless macro. Note that if more than one token is added then
+% the second parameter must contain an |\expandafter| between every
+% pair of tokens you actually mean to contribute. Thus if you want
+% to prepend |abc| to |\next|, you must write
+% \begin{quote}
+% |\prep_to\next{a\expandafter b\expandafter c}|
+% \end{quote}
+% Also note that the second argument must not be empty.
+% \begin{macrocode}
+\def\prep_to#1#2{
+ \ifx#1\x_relax
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2}
+ \else
+ \expandafter\def\expandafter#1\expandafter{\expandafter#2#1}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\never_do}
+% The command |\do|, protected from expansion.
+%
+% \begin{macrocode}
+\def\never_do{\noexpand\do}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Testing for \TeX\ extensions}
+% \changes{1.914}{2000/05/13}{Added commands for testing for
+% \protect\TeX\ extensions. (LH)}
+% Some tasks can be done better (and usually with simpler code) if
+% one can assume that certain features in some \TeX\ extensions, such as
+% \eTeX, is available. Unfortunately one cannot generally make this
+% assumption, but it is sometimes possible to provide two implementations
+% of a macro and at runtime choose the one which best utilizes the
+% available features. This subsection defines macros for making these
+% tests.
+%
+% There is also a command |\needsTeXextension| which is used like
+% |\needs|\-|fontinst|\-|version|, but which tests the \TeX\ rather than
+% the version of \package{fontinst}. This ought to be of use for ETX files
+% that describe 16 bit encodings,\footnote{At the time of writing, no
+% such ETX files exist that I know of, but \package{fontinst} should
+% not have any problem using them. /LH} as the current implementation
+% of the (V)PL writer in this case requires the underlying \TeX\ to
+% support 16 bit character codes.
+%
+% The normal operation of the extension-testing macros is to set the |_a_|
+% switch to true if the requested extension is present, and to leave the
+% switch as it was if it isn't present. This is so that one can easily
+% test for a feature that has been added to several different extensions
+% of \TeX\ simply by doing the tests in sequence. That, however, is what
+% the testing macros do if the switch |_extensions_warning_| is set to
+% false. When it is set to true they instead expand to a short piece of
+% text suitable for inclusion in a warning message about the absence of
+% a needed feature.
+%
+% \begin{switch}{_extensions_warning_}
+% This switch controls whether extension-testing macros should
+% actually do the test (false) or produce a warning (true).
+% \begin{macrocode}
+%<*pkg>
+\newif\if_extensions_warning_
+\_extensions_warning_false
+% \end{macrocode}
+% \end{switch}
+%
+%
+% \begin{macro}{\eTeX}
+% The |\eTeX| command has the syntax
+% \begin{quote}
+% |\eTeX|\marg{version number}
+% \end{quote}
+% where the \meta{version number} is the complete version number
+% (version number plus revision) of the \eTeX\ one wishes to test for.
+%
+% The code below is geared towards not letting unnecessary control
+% sequences get tokenized, as they will then always occupy a position
+% in \TeX's hash table, but it seems one cannot get around testing
+% whether |\eTeXversion| is defined, so we start with that and then
+% do a |\catcode| trick to prevent \TeX\ from seeing |\eTeXrevision|.
+% \begin{macrocode}
+\ifx \eTeXversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+\def\eTeX#1{
+ \if_extensions_warning_
+ \space/\space e-TeX\space version\space #1
+~ \else
+~ \ifdim \number\eTeXversion\eTeXrevision\p@ < #1\p@ \else
+~ \_a_true
+~ \fi
+ \fi
+}
+\catcode`\~=10
+%</pkg>
+% \end{macrocode}
+% \begin{macro}{\eTeXlogo}
+% The |\eTeXlogo| command prints the \eTeX\ logo.
+% \changes{1.923}{2002/10/20}{Added kern, to match
+% \package{ltugboat} definition. (LH)}
+% \begin{macrocode}
+%<*doc>
+\def\eTeX#1{\do{\eTeXlogo\nolinebreak[3] v\,#1}}
+\def\eTeXlogo{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\pdfTeX}
+% The |\pdfTeX| command has the syntax
+% \begin{quote}
+% |\pdfTeX|\marg{version number}\marg{revision}
+% \end{quote}
+% where the \meta{version number} is the version number as returned
+% by |\pdftexversion|, i.e., 100 times what it would normally be
+% printed as, and the \meta{revision} is the revision code as returned
+% by |\pdftexrevision|. To test for pdf\TeX\ 0.13c or newer, one would
+% say |\pdfTeX{13}{c}|.
+%
+% The code below uses the same |\catcode| trick as that in |\eTeX|.
+% \begin{macrocode}
+%<*pkg>
+\ifx \pdftexversion\undefined_command
+ \catcode`\~=14 % 14=comment
+\fi
+%</pkg>
+%<*pkg|doc>
+\def\pdfTeX#1#2{%
+%<pkg> \if_extensions_warning_
+%<pkg> \space/\space pdfTeX\space version\space
+%<doc> \do{pdf\TeX\nolinebreak[3] v\,%
+ \ifnum #1<100\space
+ 0.\ifnum #1<10\space 0\fi
+ \else
+%<pkg> \expandafter\swap_two \expandafter.
+%<doc> \expandafter\FD@swap@two \expandafter.%
+ \fi
+ #1#2%
+%<doc> }
+%<doc>}
+%</pkg|doc>
+%<*pkg>
+% \end{macrocode}
+% The above is not ideal, but it will do for now.
+% \begin{macrocode}
+~ \else
+~ \ifdim #1>\pdftexversion \else
+~ \ifnum \expandafter\expandafter \expandafter`
+~ \expandafter\first_char \pdftexrevision= <
+~ \expandafter` \first_char#2=
+~ \else \_a_true \fi
+~ \fi
+ \fi
+}
+\catcode`\~=10
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\needsTeXextension}
+% The |\needsTeXextension| command has the syntax
+% \begin{quote}
+% |\needsTeXextension|\marg{extension tests}\marg{who}
+% \end{quote}
+% If none of the extension tests set the |_a_| switch to true, then
+% it prints a warning detailing the extensions tests which failed.
+% \meta{who} is what should be listed as the originator of this
+% message; it is typically the name of the file which contains the
+% |\needsTeXextension| command.
+%
+% An example (assuming that there will be an |\Omega| test as well
+% some time in the future; I haven't really looked into what that
+% should look like, so maybe the arguments should be different): The
+% command
+% \begin{quote}
+% |\needsTeXextension{\eTeX{1.2}\Omega{1.0}}{foobar.etx}|
+% \end{quote}
+% tests if the current \TeX\ is \eTeX\ verision 1.2 (or newer)
+% \emph{or} Omega version 1.0 (or newer). The implied conjunction
+% between the tests is always `or'.
+% \begin{macrocode}
+\def\needsTeXextension#1#2{
+ \_a_false
+ #1
+ \if_a_ \else
+ \_extensions_warning_true
+ \edef\a_macro{#1}
+ \_extensions_warning_false
+ \fontinstwarningnoline{#2}{
+ This~file~needs:\messagebreak
+ \expandafter\second_of_two\a_macro
+ \iffalse
+ <no~sufficient~extensions~were~listed!!>\if_false
+ \fi
+ \messagebreak
+ You~are~not~using~any~of~them.~This~is~likely~to~cause~errors
+ }
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\needsTeXextension#1#2{%
+ \Bheading{Needs
+ \TypesetList{}{ or }{, }{, or }{}{(unspecified)}{\@firstofone}{#1}}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Writing to output files}
+%
+% \changes{1.901}{1999/03/04}{Pooled output file allocation added. (LH)}
+% As of v\,1.901, there are two different output file
+% models in \package{fontinst}. One has been along ``forever'' and is
+% for writing output to files which are only open for a short period of
+% time---every \package{fontinst} file command that opens a file in this
+% model must also close it---and it can only be used for one file at at
+% time. The other model offers pooled allocation of output files---as
+% long as there is an unused \TeX\ output stream to open, you may open a
+% new file, and it does not matter if files are not closed in the revese
+% order of that in which they were opened.
+%
+% \begin{macro}{\open_out}
+% \changes{1.901}{1999/03/04}
+% {\cs{xdef} instead of \cs{def} on \cs{out_filename}. (LH)}
+% \begin{macro}{\close_out}
+% \begin{macro}{\out_line}
+% \begin{macro}{\out_lline}
+% \changes{1.908}{1999/08/25}{\cs{edef}, to save macro expansions
+% later. (LH)}
+% \begin{macro}{\out_llline}
+% \changes{1.908}{1999/08/25}{\cs{edef} and don't use \cs{out_lline},
+% to save macro expansions later. (LH)}
+% These macros implement the classical output file commands.
+% \begin{macrocode}
+%<*pkg>
+\def\open_out#1{
+ \immediate\openout\out_file=#1 \xdef\out_filename{#1}}
+\def\close_out#1{
+ \immediate\write16{#1~written~on~\out_filename.}
+ \immediate\closeout\out_file}
+\def\out_line#1{\immediate\write\out_file{#1}}
+\edef\out_lline#1{\noexpand\out_line{\space\space\space#1}}
+\edef\out_llline#1{
+ \noexpand\out_line{\space\space\space\space\space\space#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% In the new model, the basic writing command
+% \DescribeMacro{\pout_line}|\pout_line| takes two arguments: a file
+% identifier control sequence and the token sequence to write. Thus its
+% call looks like
+% \begin{quote}
+% |\pout_line|\meta{identifier}\marg{text}
+% \end{quote}
+% The \meta{identifier} is usually a chardef token whose number tells
+% which input stream is used, but if \TeX\ runs out of output streams
+% then it might be defined as a parameterless macro which expands to
+% |\m@ne|. This has the effect of making all output to that ``file'' go
+% to the log file, from which the data might be salvaged.
+%
+% The new model operates using the control sequence family
+% \describecsfamily{out_filename-\meta{stream}}^^A
+% |\out_filename-|\meta{stream}
+% both for storing the name of the output file and for handling
+% allocation of output streams.
+%
+% \begin{macro}{\TeX_terminal}
+% \begin{macro}{\closed_stream}
+% \begin{macro}{\out_filename-99}
+% \begin{macro}{\out_filename--1}
+% Output streams 16 and above always write to \TeX's terminal, and any
+% output file that gets closed gets its identifier set to 99 so that
+% any attempts to write to a closed file can be easily spotted. (99
+% is the character code for |c|.) Output stream --1 is the log file, and
+% if another output stream cannot be allocated then attempts to write to
+% the output file will be redirected to the log file.
+% \begin{macrocode}
+\def\TeX_terminal{\string\TeX\space terminal}
+\chardef\closed_stream=99
+\x_cs\let{out_filename-99}=\TeX_terminal
+\x_cs\def{out_filename--1}{\jobname.log}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro}
+%
+% \begin{macro}{\allocate_stream}
+% \begin{macro}{\ch@ck}
+% \begin{macrocode}
+\def\allocate_stream{
+ \a_count=\m@ne
+ \b_count=\m@ne
+ \loop \ifnum \count17>\a_count
+% \end{macrocode}
+% While |\a_count|${}<$ the number of the last allocated output
+% stream \textellipsis
+% \begin{macrocode}
+ \advance \a_count \@ne
+ \x_cs\ifx{out_filename-\the\a_count}\TeX_terminal
+% \end{macrocode}
+% If |\out_filename-|\meta{stream}, where \meta{stream} is the value
+% of |\a_count|, is equal to |\TeX_terminal|, then output stream
+% |\a_count| is allocated to the pool but is not used for any
+% currently open file. Thus we've found a stream that can be used.
+% \begin{macrocode}
+ \b_count=\a_count
+ \a_count=\count17
+ \fi
+ \repeat
+ \ifnum \b_count=\m@ne
+% \end{macrocode}
+% In this case all streams allocated to the pool are currently in use,
+% so try to allocate a new one.
+% \begin{macrocode}
+ \global\advance\count17by\@ne
+ \ifnum \count17<\sixt@@n
+% \end{macrocode}
+% Then case: There was another output stream.
+% \begin{macrocode}
+ \b_count=\count17
+ \global\x_cs\let{out_filename-\the\b_count}\TeX_terminal
+ \wlog{\string\write\the\b_count\space allocated~to~the~pool.}
+ \else
+% \end{macrocode}
+% Else case: See to that the output stream allocation register holds
+% at 16.
+% \begin{macrocode}
+ \global\count17=\sixt@@n
+ \fi
+ \fi
+}
+% \end{macrocode}
+% By now, if a new stream could be allocated then the number of that
+% stream is in |\b_count|, and if it couldn't then |\b_count| is --1.
+%
+% All output streams up to and including that whose number is in
+% |\count17| is checked to see if it is available. Many unsuccessful
+% |\newwrite|s could therefore mean we have to do quite a lot of
+% checking. What's more, output stream 99 would incorrectly be
+% interpreted as being in the pool but not used. To guard against these
+% (improbable) errors, |\ch@ck| is redefined to stop allocation
+% |\count| registers at their limit value.
+% \begin{macrocode}
+\def\ch@ck#1#2#3{
+ \ifnum \count1#1<#2 \else
+ \errmessage{No~room~for~a~new~#3}
+ \global\count1#1=#2
+ \fi
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\open_pout}
+% \begin{macro}{\close_pout}
+% The syntax for |\open_pout| is
+% \begin{quote}
+% |\open_pout|\meta{identifier}\marg{name}
+% \end{quote}
+% \meta{name} is the name of the output file one wishes to open.
+% \meta{identifier} is a control sequence which will be redefined
+% (globally) to act as an identifier of the file.
+% \begin{macrocode}
+\def\open_pout#1#2{
+ \allocate_stream
+ \ifnum \b_count=\m@ne
+ \immediate\write\sixt@@n{fontinst~is~out~of~output~streams.^^J
+ Output~file~#2~cannot~be~opened.^^J
+ Writes~will~be~redirected~to~the~log~file.
+ }
+ \gdef#1{\m@ne}
+ \else
+ \immediate\openout\b_count=#2\x_relax
+ \x_cs\xdef{out_filename-\the\b_count}{#2}
+ \global\chardef#1=\b_count
+ \fi
+}
+% \end{macrocode}
+%
+% The syntax for |\close_pout| is
+% \begin{quote}
+% |\close_pout|\meta{identifier}\marg{what}
+% \end{quote}
+% \meta{identifier} is the output stream identifier which should have
+% been defined in an earlier call of |\open_pout|. \meta{what} is a
+% string which describes what has been written to the output file,
+% e.g.\ |Metrics| or |Raw~font|. It will be used to write a message on
+% the terminal.
+% \begin{macrocode}
+\def\close_pout#1#2{
+ \ifnum #1=\closed_stream
+ \errmessage{Output~file~\string#1~(#2)~not~closed,^^J
+ since~it~was~not~open}
+ \else
+ \immediate\write\sixt@@n{#2~written~on~
+ \csname out_filename-\the#1\endcsname.}
+ \ifnum #1=\m@ne \else
+ \immediate\closeout#1
+ \global\x_cs\let{out_filename-\the#1}=\TeX_terminal
+ \fi
+ \global\chardef#1=\closed_stream
+ \fi
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\pout_line}
+% The syntax for |\pout_line| is
+% \begin{quote}
+% |\pout_line|\meta{identifier}\marg{text}
+% \end{quote}
+% \meta{identifier} is the output stream identifier which should have
+% been defined in an earlier call to |\open_pout|. \meta{text} is
+% what will be written to the file.
+% \begin{macrocode}
+\def\pout_line#1#2{\immediate\write#1{#2}}
+% \end{macrocode}
+%
+% \begin{macro}{\pout_lline}
+% \changes{1.904}{1999/06/15}{Command added. (LH)}
+% \changes{1.908}{1999/08/25}{\cs{edef}, to save macro expansions
+% later. (LH)}
+% \begin{macro}{\pout_llline}
+% \changes{1.904}{1999/06/15}{Command added. (LH)}
+% \changes{1.908}{1999/08/25}{\cs{edef} and don't use \cs{pout_lline},
+% to save macro expansions later. (LH)}
+% There relate to |\pout_line| as |\out_lline| and |\out_llline| to
+% |\out_line|.
+% \begin{macrocode}
+\edef\pout_lline#1#2{\noexpand\pout_line#1{\space\space\space#2}}
+\edef\pout_llline#1#2{
+ \noexpand\pout_line#1{\space\space\space\space\space\space#2}
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\tempfileprefix}
+% \begin{macro}{\temp_prefix}
+% Selecting the directory for temporary files.
+%
+% \begin{macrocode}
+\def\tempfileprefix#1{\def\temp_prefix{#1}}
+\tempfileprefix{}
+%</pkg>
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \subsection{Conditionals}
+%
+% \subsubsection{Conditionals in \package{fontinst}}
+%
+% \begin{macro}{\then}
+% \begin{macro}{\if_true}
+% \begin{macro}{\if_false}
+% In order to write macros that expand out to nested |\if|-statements,
+% I say:
+% \begin{quote}
+% |\ifblah| \textellipsis\ |\then| \textellipsis\ |\else|
+% \textellipsis\ |\fi|
+% \end{quote}
+% In order to match the |\fi|, |\then| has to be an |\if|.
+%
+% \begin{macrocode}
+%<pkg|doc>\let\then=\iffalse
+%<*pkg>
+\def\if_false{\iffalse}
+\def\if_true{\iftrue}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+% \begin{macro}{\if_defined}
+% \begin{macro}{\if_undefined}
+% \multchanges{\cs{if_defined}\cs{if_undefined}}{1.912}
+% {2000/02/10}{Macro added. (LH)}
+% These two macros are used as
+% \begin{quote}
+% |\if_defined|\marg{control sequence name}|\then|\\
+% |\if_undefined|\marg{control sequence name}|\then|
+% \end{quote}
+% The latter is functionally equivalent to
+% \begin{quote}
+% |\x_cs\ifx|\marg{control sequence name}|\x_relax|
+% \end{quote}
+% but it is shorter (1--3 tokens, depending on whether the
+% unnecessary braces around \meta{control sequence name} are included
+% or not). The former tests the same thing, but has true and false
+% cases reversed.
+%
+% Apart from that it is shorter, another important reason for
+% introducing these macros is that the \eTeX\ primitives
+% |\ifcsname| and |\unless| provide a much better implementation than
+% what is possible in normal \TeX. Therefore it is desirable to use
+% these commands as much as possible, and by introducing these macros
+% one can achieve this without having double definitions for more
+% than these two macros.
+%
+% To avoid trouble with mismatched ifs and tokenizing control
+% sequences special for \eTeX, |~| is temporarily made a comment
+% character. I'm not sure |\ifcsname| and |\unless| weren't available
+% in \eTeX\ versions before 2.0, but that's the oldest version I have
+% a manual for.
+% \multchanges{\cs{if_defined}\cs{if_undefined}}{1.914}{2000/05/13}
+% {Automatically selecting between \protect\TeX\ and \eTeX\
+% definitions. (LH)}
+% \multchanges{\cs{if_defined}\cs{if_undefined}}{1.927}{2003/12/11}
+% {Modified \eTeX\ definitions to make them work with the
+% crufty old ``unset is \cs{let} to \cs{relax}'' tradition
+% of \package{fontinst} implementation. (LH) This was found
+% to be a show-stopper for using v\,1.926 with \eTeX;
+% Heiko Oberdiek found the cause of it.}
+% \changes{1.927}{2004/08/07}{Fixed problem with \cs{unless}. (LH)}
+% \begin{macrocode}
+\_a_false\eTeX{2.0}
+\if_a_\else \catcode`\~=14\x_relax \fi
+% \end{macrocode}
+% The following use of |\if| is a trick I learnt from the
+% implementation of \package{docstrip}. |\if| will expand any amount of
+% material until it has two unexpandable tokens to compare, hence one
+% can use it to evaluate arbitrary boolean expressions in a single
+% \TeX\ conditional, by expressing the expression as something which
+% expands in \TeX's mouth to the value of the expression (either |0|
+% or |1|). In this case the expression is ``the control sequence is
+% defined and that definition is not \cs{relax}''.
+% \begin{macrocode}
+~ \def\if_defined#1\then{
+~ \if
+~ \ifcsname#1\endcsname
+~ \expandafter\ifx \csname#1\endcsname \x_relax
+~ 0
+~ \else
+~ 1
+~ \fi
+~ \else
+~ 0
+~ \fi
+~ 1
+~ }
+~ \def\if_undefined{\expandafter\unless\if_defined}
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\~=\if_a_ 14 \else 10 \fi \x_relax
+% \end{macrocode}
+% \begin{macrocode}
+~ \def\if_defined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ \expandafter\if_false
+~ \else
+~ \expandafter\if_true
+~ \fi
+~ }
+~ \def\if_undefined#1\then{
+~ \expandafter\ifx \csname#1\endcsname\x_relax
+~ }
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\~=10\x_relax
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\gobble_if}
+% It is sometimes best to skip both the then-part and
+% the else-part of a conditional. |\gobble_if| does this by using the
+% fact that expanding |\else| skips everything until the next matching
+% |\fi| without looking for other |\else|s.
+% \changes{1.900}{1998/12/11}{Macro added. (LH)}
+% \changes{1.913}{2000/03/03}{Macro redefined; it now works entirely
+% in the mouth. (LH)}
+% \begin{macrocode}
+\def\gobble_if{\iftrue\else}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if_or}
+% \begin{macro}{\or_else}
+% |\if_or| \textellipsis\ |\or_else| \textellipsis\ |\then| gives the
+% disjunction of two booleans.
+% \begin{macrocode}
+\def\if_or#1\or_else#2\then{
+ #1\then
+ \expandafter\if_true
+ \else
+ #2\then
+ \expandafter\expandafter\expandafter\if_true
+ \else
+ \expandafter\expandafter\expandafter\if_false
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\if_equal}
+% The |\if_equal| macro is a \textellipsis|\then|-style wrapper around the
+% |\ifx| primitive. Its calling syntax is
+% \begin{quote}
+% |\if_equal|\meta{token1}\meta{token2}|\then|
+% \end{quote}
+% \changes{1.912}{2000/02/23}{Macro added. (LH)}
+% \begin{macrocode}
+\def\if_equal#1\then{\ifx#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if_file_exists}
+% |\if_file_exists| checks to see if a file exits, using |\openin|.
+%
+% \begin{macrocode}
+\def\if_file_exists#1\then{
+ \immediate\openin1=#1\x_relax
+ \ifeof1\x_relax
+ \immediate\closein1
+ \expandafter\if_false
+ \else
+ \immediate\closein1
+ \expandafter\if_true
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Conditionals in \package{fontdoc}}
+%
+% \changes{1.909}{1999/10/16}{System for documenting both branches of
+% \texttt{if} statements in ETX and MTX files added. (LH)}
+% In order to get a reasonable documentation of branches in an ETX or
+% MTX file, the code in both branches must be typeset and the positions
+% of the if, the else, and the fi must be clearly marked. There seems to
+% be no reasonable way to achieve this if the standard names for the
+% else and fi are used. Therefore the alternative names |\Else| and
+% |\Fi| for |\else| and |\fi| have been introduced, to be used as in
+% for example
+% \begin{quote}
+% |\ifisint{monowidth}\then|\\
+% \vadjust{}\quad\meta{then-part}\\
+% |\Else|\\
+% \vadjust{}\quad\meta{else-part}\\
+% |\Fi|
+% \end{quote}
+%
+% \begin{macro}{\Else}
+% \begin{macro}{\Fi}
+% By default, these are identical to their lowercase counterparts.
+% \begin{macrocode}
+%<*pkg|doc>
+\let\Else=\else
+\let\Fi=\fi
+%</pkg|doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% The interesting part begins if the ETX or MTX file gives the command
+% |\showbranches|, since this means (i) that it wants the branches to be
+% shown and (ii) that it complies to a simple rule about where to use
+% |\Else| and |\Fi|. The rule is as follows: If an \texttt{if} statement
+% is of \package{fontinst} form (it uses |\then|), then it must be
+% terminated by |\Fi|, and a possible else in the statement must be an
+% |\Else|. If an \texttt{if} statement is \emph{not} of \package{fontinst}
+% form (it has no |\then|), then it must be terminated by |\fi|, and a
+% possible else in the statement must be an |\else|. Only the
+% \package{fontinst} form \texttt{if} statements are affected by
+% |\showbranches|.
+%
+% \begin{macro}{\showbranches}
+% \begin{macro}{\generic@if}
+% The |\showbranches| command changes the definitions of
+% |\generic@if|, |\then|, |\Else|, and |\Fi| so that the branches of
+% \texttt{if} statements will be made visible. |\generic@if| is used
+% to implement all the \package{fontinst} form \texttt{if} statements
+% in \package{fontdoc}. It is called as
+% \begin{quote}
+% |\generic@if|\marg{description}
+% \end{quote}
+% and this will by default expand to |\iftrue|, but after executing
+% |\showbranches| it will instead typeset
+% \begin{quote}
+% If \meta{description} then
+% \end{quote}
+% and do a bit of additional housekeeping.
+%
+% \begin{macrocode}
+%<*doc>
+\def\generic@if#1{\iftrue}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand\showbranches{%
+ \let\generic@if=\branches@if
+ \let\then=\x@relax
+ \let\Else=\branches@else
+ \let\Fi=\branches@fi
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\saved@slot@number}
+% The |\saved@slot@number| is used for storing the value of
+% |\slot@number| at the \texttt{if} until the |\Else|. Unlike
+% |\slot@number|, it is always set locally.
+% \begin{macrocode}
+\newcount\saved@slot@number
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\branches@if}
+% \begin{macro}{\branches@else}
+% \begin{macro}{\branches@fi}
+% \changes{1.916}{2001/01/25}{Commented out test which concatenates
+% consecutive \cs{Fi}s, since that doesn't work together with the
+% \texttt{IfBranch} environment. (LH)}
+% \begin{macro}{\branches@type}
+% \begin{macro}{\branches@par}
+% The macros |\branches@if|, |\branches@else|, and |\branches@fi|
+% contain the definitions of |\generic@if|, |\Else|, and |\Fi|
+% respectively that are used when branches are to be shown. Their
+% basic task is to typeset the texts |If #1 then|, |Else|, and |Fi| in
+% an appropriate style and with appropriate spacing around. A
+% complicating matter is however that |\slot@number| must have the
+% same value at the beginning of the \textit{else} part as at the
+% beginning of the \textit{then} part. To achieve this, the value of
+% |\slot@number| is saved in |\saved@slot@number| at the \textit{if}
+% and copied back at the \textit{else}. To make this work even with
+% nested \textit{if}s, both the \textit{then} branch and the
+% \textit{else} branch are enclosed in groups and
+% |\saved@slot@number| is assigned locally.
+%
+% There are still some formatting issues to solve, however. In some
+% cases it works best to put the text of adjacent \textit{if},
+% \textit{else}, or \textit{fi} in the same paragraph, and it must be
+% possible to recognize those cases. This is done by looking at the
+% macro |\branches@type|, which should expand to
+% \begin{enumerate}
+% \item[\texttt{0}] if the preceeding item was an \textit{if},
+% \item[\texttt{1}] if the preceeding item was an \textit{else}
+% preceeded by an \textit{if},
+% \item[\texttt{2}] if the preceeding item was an \textit{else}
+% not preceeded by an \textit{if},
+% \item[\texttt{3}] if the preceeding item was a \textit{fi},
+% \item[\texttt{4}] if it was anything else.
+% \end{enumerate}
+% |\branches@par| is used for resetting |\branches@type| to \texttt{4}.
+% It is an auto-resetting definition of |\par|.
+%
+% \begin{macrocode}
+\def\branches@if#1{%
+ \ifnum \branches@type=\tw@
+ \begin{IfBranchDummy}%
+ \textit{ if #1 then}%
+ \else
+ \par
+ \ifFD@tight@\else \addvspace\medskipamount \fi
+ \noindent\textit{If #1 then}%
+ \fi
+ \saved@slot@number=\slot@number
+ \gdef\branches@type{0}%
+ \let\par=\branches@par
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\branches@else{%
+ \ifnum \branches@type=\z@
+ \textit{ relax else}%
+ \gdef\branches@type{1}%
+ \else
+ \par
+ \end{IfBranch}%
+ \noindent\textit{Else}%
+ \gdef\branches@type{2}%
+ \fi
+ \global\slot@number=\saved@slot@number
+ \let\par=\branches@par
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\branches@fi{%
+ \ifnum \branches@type=\thr@@
+ \expandafter\end \expandafter{\@currenvir}%
+ \expandafter\gdef \expandafter\FD@saved@fis
+ \expandafter{\FD@saved@fis \space fi}%
+ \else
+ \end{IfBranch}%
+ \gdef\FD@saved@fis{Fi}%
+ \fi
+ \gdef\branches@type{3}%
+ \let\par=\branches@par
+}
+% \end{macrocode}
+% \begin{macrocode}
+\gdef\branches@type{4}
+% \end{macrocode}
+% \begin{macrocode}
+\def\branches@par{%
+ \@restorepar
+ \ifnum \branches@type=\thr@@
+ \noindent\textit{\FD@saved@fis}\par
+ \else
+ \begin{IfBranch}%
+ \fi
+ \gdef\branches@type{4}%
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{environment}{IfBranch}
+% \changes{1.916}{2001/01/09}{Environment added. (LH)}
+% \changes{1.920}{2001/09/16}{Removed assignment to \cs{listparindent}.
+% I don't know why it was there in the first place. (LH)}
+% \begin{switch}{FD@tight@}
+% \changes{1.916}{2001/01/09}{Switch added. (LH)}
+% The branches of a conditional that is being shown are put in an
+% \texttt{IfBranch} environment, to emphasize the branches as logical
+% units in the file. Depending on the value of the \texttt{FD@tight@}
+% switch, there are two different ways that the branches can be
+% distinguished. In the non-tight setting (\texttt{FD@tight@} false),
+% there is one |\medskip|\-|amount| of vertical space before and after
+% the branch, but no indentation. In the tight setting (which is used
+% for \meta{glyph commands} and \meta{slot commands}), there is no
+% extra vertical space around the branch, instead it is indented by
+% $1\,\mathrm{em}$.
+% \begin{macrocode}
+\newif\ifFD@tight@
+\newenvironment{IfBranch}{%
+ \list{}{%
+ \ifFD@tight@
+ \setlength\topsep{\z@skip}%
+ \@beginparpenalty=\z@
+ \@endparpenalty=\z@
+ \setlength\leftmargin{1em}%
+ \else
+ \setlength\topsep{\medskipamount}%
+ \@beginparpenalty=-10%
+ \@endparpenalty=\@beginparpenalty
+ \setlength\leftmargin{\z@}%
+ \fi
+ \setlength\partopsep{\z@skip}%
+ \setlength\itemsep{\z@skip}%
+ \setlength\parsep{\z@ plus\p@}%
+ \setlength\rightmargin{\z@}%
+ \setlength\itemindent{\z@}%
+ }%
+ \item[]%
+}{\endlist}
+% \end{macrocode}
+% \end{switch}\end{environment}
+%
+% \begin{environment}{IfBranchDummy}
+% \changes{1.916}{2001/01/25}{Environment added. (LH)}
+% In order to get the nesting right, each |\branches@else| command has
+% to |\begin| a new environment, but if it is immediately followed by
+% a |\branches@if| then that environment should not cause an
+% indentation. In these cases the \texttt{IfBranchDummy} environment
+% is used instead of \texttt{IfBranch}.
+% \begin{macrocode}
+\newenvironment{IfBranchDummy}{}{}
+%</doc>
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsubsection{Miscellanea}
+%
+% \begin{macro}{\primitiveinput}
+%
+% If |\@@input| is defined, I'll assume it's the \LaTeX{} version
+% of the \TeX{} |\input| primitive. I need this so that I can say
+% |\expandafter\foo\primitiveinput|, which doesn't work with the
+% \LaTeX{} version of |\input|.
+%
+% \begin{macrocode}
+%<*pkg>
+\x_cs\ifx{@@input}\x_relax
+ \let\primitiveinput=\input
+\else
+ \let\primitiveinput=\@@input
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \DescribeMacro{\process_csep_list}
+% The macro
+% \begin{quote}
+% |\process_csep_list|\marg{pretext}\meta{comma-sep~list}^^A
+% |,\process_csep_list,|
+% \end{quote}
+% executes \meta{pretext}\marg{item} for every item in the
+% \meta{comma-sep~list}.
+%
+% \begin{macro}{\process_csep_list}
+% \begin{macrocode}
+\def\process_csep_list#1#2,{
+ \ifx\process_csep_list#2
+ \expandafter\gobble_one
+ \else
+ \expandafter\identity_one
+ \fi{
+ #1{#2}
+ \process_csep_list{#1}
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\print@csep@list}
+% \textit{Use of this macro is now deprecated; use \cs{TypesetList}
+% instead wherever possible.} The macro call
+% \begin{quote}
+% |\print@csep@list|\marg{format}\marg{list}
+% \end{quote}
+% prints the comma-separated list \meta{list} in math mode.
+% \meta{format} can be used to set the style in which the list is
+% printed, since it is executed in the beginning of the same group as
+% in which the list is printed.
+%
+% The formating is based on changing the |\mathcode| of comma to
+% |"8000| so that the comma can be used as if it was an active character
+% without actually having to be one.
+% \begin{macrocode}
+%<*doc>
+\begingroup
+ \catcode`\,=13
+ \gdef\print@csep@list#1#2{%
+ $%
+ \ifnum "8000=\mathcode`\,\else
+ \mathchardef\private@comma=\mathcode`\,%
+ \mathcode`\,="8000\x@relax
+ \fi
+ #1%
+ \let,=\active@comma
+ #2%
+ $%
+ }
+\endgroup
+\def\active@comma{\private@comma \penalty\binoppenalty}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Real numbers}
+%
+% \TeX's \meta{number}s are merely integers, but \package{fontinst}
+% needs to store and calculate with numerical entities (most of which
+% are lengths) that are intrinsically real numbers. Most of the time,
+% \package{fontinst} does this by using a representation of real numbers
+% by integers in which a real number $x$ is represented by the integer
+% that $1000x$ gets rounded to. This representation has proved
+% sufficiently precise for most purposes.
+%
+% There are however a few cases in which real numbers must be delt with
+% in a more general fashion. Generic routines for this appear in this
+% subsection.
+%
+% \begin{macro}{\make_factor}
+% \changes{1.903}{1999/05/13}{Macro added. (LH)}
+% The |\make_factor| macro is meant to be used in the context
+% \begin{quote}
+% |\make_factor|\marg{number}
+% \end{quote}
+% where \meta{number} can be any legal \TeX\ number. It expands to
+% the same number divided by 1000, with decimals, so that what it
+% expands to matches the regular expression
+% \begin{quote}
+% |-?[0-9]+\.[0-9][0-9][0-9]|
+% \end{quote}
+%
+% More specifically, |\make_factor| has two tasks to perform: it takes
+% care of the sign, so that its subsidary macros need only work with
+% unsigned numbers, and it converts the \meta{number} (which could
+% well be a countdef or mathchardef token) to a sequence of digits.
+% \begin{macrocode}
+%<*pkg>
+\def\make_factor#1{
+ \ifnum #1<\z@
+ -\expandafter\make_factor_i\expandafter{\number-#1}
+ \else
+ \expandafter\make_factor_i\expandafter{\number#1}
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\make_factor_i}
+% |\make_factor_i| distinguishes between the two main cases of
+% numbers that in absolute value are less than 1000 and numbers that
+% in absolute value are greater than or equal to 1000. In the former
+% case, zeros need to be inserted. In the latter case, some number
+% of digits need to be stepped over before the decimal point can be
+% inserted.
+% \begin{macrocode}
+\def\make_factor_i#1{
+ \ifnum #1<\one_thousand
+ \make_factor_ii{#1}
+ \else
+ \make_factor_iii #1
+ \fi
+ #1
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\make_factor_ii}
+% |\make_factor_ii| inserts extra zeros, in the extent it is
+% needed.
+% \begin{macrocode}
+\def\make_factor_ii#1{
+ 0.
+ \ifnum #1<\one_hundred
+ 0
+ \ifnum #1<10~ 0\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\make_factor_iii}
+% |\make_factor_iii| steps over one digit and checks if this is the
+% correct position for the decimal point. Note that |#2#3| is
+% exactly the digits in the number that has not been stepped over.
+% Also note that comparision with |#2#3| would not work, since |#2|
+% can be |0|.
+% \begin{macrocode}
+\def\make_factor_iii#1#2#3\fi#4{
+ \fi
+ #4
+ \ifnum 1#3<\one_thousand
+ .
+ \else
+ \make_factor_iii#2#3
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% It also happens that real numbers are represented by dimens, in the
+% common way that the number 1 is represented by the dimen 1\,pt. For
+% those cases the following macro is indispensable.
+%
+% \begin{macro}{\lose_measure}
+% Get rid of a trailing |pt| when converting dimension.
+% \begin{macrocode}
+{
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\lose_measure#1pt{#1}
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Hexadecimal numbers}
+%
+% Some of the file formats \package{fontinst} can generate requires
+% that some numbers are written in hexadecimal form rather than in
+% \TeX's default decimal form. This is somewhat awkward, as it would be
+% very hard to implement without using explicit arithmetic.
+%
+% \begin{macro}{\format_hex}
+% The |\format_hex| command formats a number as hexadecimal digits.
+% The syntax is
+% \begin{quote}
+% |\format_hex|\marg{command}\marg{value}\marg{digits}
+% \end{quote}
+% where \meta{command} will be |\def|ined to be the formatted number.
+% \meta{value} is the number to format; it must not be negative.
+% \meta{digits} is the number of digits to generate. If the
+% \meta{value} is greater than or equal to $16^{\mathit{digits}}$
+% then |\a_count| will be set to \meta{value} divided by this number
+% and the formatted value will be for the corresponding remainder.
+% \changes{1.928}{2004/11/28}{Macro added. (LH)}
+%
+% The macro overwrites |\a_count|, |\b_count|, and |\c_count|.
+%
+% \begin{macro}{\format_hex_i}
+% The |\format_hex_i| macro is the iterator for |\format_hex|.
+% It is used in the context
+% \begin{quote}
+% |\format_hex_i|\marg{command}\marg{control token}
+% \end{quote}
+% If the \meta{control token} is |i| then nothing is done.
+% Otherwise the quotient and remainder of |\a_count| with respect to
+% $16$ is computed, where the former is assigned to |\a_count| and
+% the latter is converted to hexadecimal and prepended to the
+% \meta{command}, after which the macro expands to
+% |\format_hex_i|\meta{command}.
+% \begin{macrocode}
+%<*pkg>
+\def\format_hex_i#1#2{
+ \if #2i \else
+ \b_count=\a_count
+ \divide \a_count \sixt@@n
+ \c_count=\a_count
+ \multiply \c_count \sixt@@n
+ \advance \b_count -\c_count
+ \edef#1{
+ \ifcase\b_count 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or
+ 9\or a\or b\or c\or d\or e\or f\fi
+ #1
+ }
+ \expandafter\format_hex_i \expandafter#1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% To get the loop to run the wanted number of times, one uses the
+% trick that |\romannumeral| can generate an arbitrary number of |m|s.
+% The |\identity_one| stuff is to prevent |\number| from processesing
+% the subsequent |001~|, which will be the last that |\romannumeral|
+% reads.
+% \begin{macrocode}
+\def\format_hex#1#2#3{
+ \a_count=#2
+ \let#1\empty_command
+ \expandafter\format_hex_i \expandafter#1 \romannumeral
+ \expandafter\identity_one\expandafter{\number#3}001~
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Error, warning, and info messages}
+%
+% The code in this subsection is an adaptation of code from the
+% \LaTeX\ kernel---more precisely from the source file
+% \texttt{lterror.dtx}---and the same is true for some of the comments.
+% As authors of that code are listed Johannes Braams, David Carlisle,
+% Alan Jeffrey, Leslie Lamport, Frank Mittelbach, Chris Rowley, and
+% Rainer Sch\"opf. The original source can be found in the file
+% \texttt{lterror.dtx} in the \texttt{macros}\slash\texttt{latex}\slash
+% \texttt{base} directory in any of the Comprehensive \TeX\ Archive
+% Network FTP sites.\footnote{As if anyone who has managed to get this
+% far didn't already know that!}
+%
+% That should have fulfilled the conditions in the LPPL.^^A
+% \changes{1.906}{1999/07/23}{Adaptation of \LaTeX's message system
+% completed. (LH)}
+% \par\bigskip
+%
+%
+% \subsubsection{General commands}
+%
+% \begin{macro}{\messagebreak}
+% This command prints a new-line inside a message, followed by a
+% continuation whose exact appearence may depend on the context.
+% Normally this command is defined to be |\relax|, but inside messages
+% it gets redefined to a linebreak (|^^J|) followed by the appropriate
+% continuation.
+% \changes{1.909}{1999/10/16}{New name for \cs{message_break}. (LH)}
+% \begin{macrocode}
+%<pkg>\let\messagebreak\x_relax
+%<doc>\let\messagebreak\space
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\generic_info}
+% This takes two arguments: a continuation and a message, and sends
+% the result to the log file.
+% \begin{macrocode}
+%<*pkg>
+\def\generic_info#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\m@ne{#2\on_line.}
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\generic_warning}
+% This takes two arguments: a continuation and a message, and sends
+% the result to the screen.
+% \begin{macrocode}
+\def\generic_warning#1#2{
+ \begingroup
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{^^J#2\on_line.^^J}
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\generic_error}
+% ``This macro takes four arguments: a continuation,
+% an error message, where to go for further information, and the help
+% information. It displays the error message, and sets the error help
+% (the result of typing |h| to the prompt), and does a horrible hack
+% to turn the last context line (which by default is the only context
+% line) into just three dots. This could be made more efficient.''
+%
+% Thus far the \LaTeX\ comments, but the horrible hack it mensions
+% has been removed since it just makes things look strange when
+% |\errorcontextlines| is larger than one.
+% ^^A What the hack actually does is that it turns
+% ^^A as much as possible of the topmost context line to spaces. It has
+% ^^A two ways of achieving this. The first is to make the context line
+% ^^A too long to display in full, by ending the argument of |\errmessage|
+% ^^A with the control sequence
+% ^^A \begin{quote}
+% ^^A \tiny\verb*+\@err@ +^^A
+% ^^A \verb*+ +
+% ^^A \end{quote}
+% ^^A As its name ends with a long sequence of spaces, it won't be visible;
+% ^^A the |@err@| appears in the |...| part of the line. The other method
+% ^^A it uses is to turn every token in the context line that is not part
+% ^^A of a control sequence name to spaces (as characters, not in
+% ^^A category) through a |\lowercase| trick. The only characters that
+% ^^A cannot be turned into spaces this way are the three continuation
+% ^^A dots.
+% The ``where to go for further information'' message is currently not
+% used (it is commented out in |\fontinsterror| below), since there
+% is no good place to refer to anyway. If the documentation is ever
+% improved in this respect, it would of course be best to reinsert
+% this message. Note however that unlike the case in \LaTeX, this
+% message should end with a |^^J|.
+%
+% A complication is that \TeX\ versions older than 3.141 have a bug
+% which causes |^^J| to not force a linebreak in |\message| and
+% |\errmessage| commands. So for these old \TeX's we use a |\write| to
+% produce the message, and then have an empty |\errmessage| command.
+% This causes an extra line of the form
+%\begin{verbatim}
+%! .
+%\end{verbatim}
+% to appear on the terminal, but if you do not like it, you can always
+% upgrade your \TeX!
+%
+% Since I don't think many \package{fontinst} users use such old
+% \TeX s, I removed \LaTeX's test for \TeX\ version at this point. The
+% code for old \TeX s is still there, but it lies in a \package{docstrip}
+% module of its own.
+%
+% First the `standard case'.
+% \begin{macrocode}
+%<*!oldTeX>
+\def\generic_error#1#2#3#4{
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \errmessage{#2.^^J^^J#3
+ Type~\space H~<return>~\space for~immediate~help
+ }
+ \endgroup
+}
+%</!oldTeX>
+% \end{macrocode}
+%
+% Secondly the version for old \TeX's.
+% \begin{macrocode}
+%<*oldTeX>
+\def\generic_error#1#2#3#4{%
+ \begingroup
+ \immediate\write\closed_stream{}
+ \def\messagebreak{^^J}
+ \edef\a_macro{{#4}}
+ \errhelp\a_macro
+ \def\messagebreak{^^J#1}
+ \immediate\write\closed_stream{!~#2.^^J^^J#3^^J
+ Type~\space H~<return>~\space for~immediate~help.
+ }
+ \errmessage{}
+ \endgroup
+}
+%</oldTeX>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\fontinsterror}
+% \changes{1.909}{1999/10/16}{New name for \cs{fontinst_error}. (LH)}
+% \begin{macro}{\fontinstwarning}
+% \changes{1.909}{1999/10/16}{New name for \cs{fontinst_warning}. (LH)}
+% \begin{macro}{\fontinstwarningnoline}
+% \changes{1.909}{1999/10/16}{New name for
+% \cs{fontinst_warning_no_line}. (LH)}
+% \begin{macro}{\fontinstinfo}
+% \changes{1.909}{1999/10/16}{New name for \cs{fontinst_info}. (LH)}
+% These commands are intended for giving a uniformed, and for the
+% programmers hopefully simplified, form of error, warning, and info
+% messages. The syntax is:
+% \begin{quote}
+% |\fontinsterror|\marg{subsystem}\marg{error}\marg{help}\\
+% |\fontinstwarning|\marg{subsystem}\marg{warning}\\
+% |\fontinstwarningnoline|\marg{subsystem}\marg{warning}\\
+% |\fontinstinfo|\marg{subsystem}\marg{info}
+% \end{quote}
+% A \meta{subsystem} in this context is intended to be some piece of
+% text which identifies some functionally clearly defined part of
+% \package{fontinst}. Examples of \meta{subsystem}s could be
+% \texttt{PL to MTX converter}, \texttt{Ligful (V)PL writer}, and
+% \texttt{Latin family}.
+%
+% The |\fontinsterror| command prints the \meta{error} message, and
+% presents the interactive prompt; if the user types |h|, then the
+% \meta{help} information is displayed. The |\fontinstwarning|
+% command produces a warning but does not present the interactive
+% prompt. The |\fontinstwarningnoline| command does the same, but
+% doesn't print the input line number. The |\fontinstinfo| command
+% writes the message to the |log| file. Within the messages, the
+% command |\messagebreak| can be used to break a line and |\space| is
+% a space, for example:
+% \begin{verbatim}
+% \def\foo{FOO}
+% \fontinstwarning{Hungarian}{
+% Your~hovercraft~is~full~of~eels,\messagebreak
+% and~\string\foo\space is~\foo}
+% \end{verbatim}
+% produces:
+% \begin{verbatim}
+% Hungarian warning:
+% Your hovercraft is full of eels,
+% and \foo is FOO on input line 54.
+% \end{verbatim}
+%
+% \begin{macrocode}
+\def\fontinsterror#1#2#3{
+ \generic_error{
+ \four_spaces\four_spaces
+ }{
+ #1~error:\messagebreak #2
+ }{
+% See~the~#1~package~documentation~for~explanation.^^J
+ }{#3}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fontinstwarning#1#2{
+ \generic_warning{
+ \four_spaces\four_spaces
+ }{
+ #1~warning:\messagebreak #2
+ }
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fontinstwarningnoline#1#2{
+ \fontinstwarning{#1}{#2\gobble_one}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fontinstinfo#1#2{
+ \generic_info{
+ \four_spaces\four_spaces
+ }{
+ #1~info:\messagebreak #2
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\fontinsterror#1#2#3{%
+ \Bheading{Error} observed by #1:%
+ \begin{quote}#2.\end{quote}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fontinstwarning#1#2{
+ \Bheading{Warning} from #1:%
+ \begin{quote}#2.\end{quote}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\let\fontinstwarningnoline=\fontinstwarning
+% \end{macrocode}
+% \begin{macrocode}
+\def\fontinstinfo#1#2{
+ \Bheading{Info} from #1:%
+ \begin{quote}#2.\end{quote}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\on_line}
+% The message ` on input line~$n$'. \LaTeX\ has special code for
+% \TeX~2, but since \package{fontinst} has assumed the existence of
+% the |\errorcontextlines| parameter since v\,1.500, the removal of
+% that code shouldn't cause problems for anyone who wasn't already
+% having related problems.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\on_line{~on~input~line~\the\inputlineno}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\four_spaces}
+% Four spaces. Using |\edef| (rather than |\def| as in \LaTeX) to
+% save some macro expansions.
+% \begin{macrocode}
+\edef\four_spaces{\space\space\space\space}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Specific errors}
+%
+% \begin{macro}{\error_help_a}
+% \begin{macro}{\error_help_c}
+% \begin{macro}{\error_help_d}
+% \begin{macro}{\error_help_e}
+% \changes{1.912}{2000/02/12}{Macro added. (LH)}
+% The more common error help messages. The first three are called
+% |\@eha|, |\@ehc|, and |\@ehd| in \LaTeX. |\@ehb| is of no use for
+% \package{fontinst}, so it has been omitted. |\error_help_e| is a
+% new one for \package{fontinst}.
+% \begin{macrocode}
+\gdef\error_help_a{
+ Your~command~was~ignored.\messagebreak
+ Type~\space I~<command>~<return>~\space to~replace~it~
+ with~another~command,\messagebreak
+ or~\space <return>~\space to~continue~without~it.}
+\gdef\error_help_c{
+ Try~typing~\space <return>~
+ \space to~proceed.\messagebreak
+ If~that~doesn't~work,~type~\space X~<return>~\space to~quit.}
+\gdef\error_help_d{
+ You're~in~trouble~here.~\space\error_help_c}
+\def\error_help_e#1{You~can~continue,~but~the~#1~wrong.}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+%
+% \subsubsection{\TeX\ parameters}
+%
+% \multchanges{\cs{newlinechar}\cs{errorcontextlines}}{1.914}
+% {2000/05/20}{Moved to error message subsection. (LH)}
+% \begin{macro}{\newlinechar}
+% Set |\newlinechar| for |\errhelp| messages.
+% \begin{macrocode}
+\newlinechar=`\^^J
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\errorcontextlines}
+% By default, show as much error info as you can.
+% (We assume \package{fontinst} users are \TeX{}perts.)
+% \begin{macrocode}
+\errorcontextlines=999
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tracinglostchars}
+% \changes{1.915}{2000/07/31}{Added setting this parameter. (LH)}
+% Make |\tracinglostchars| positive---this will simplify catching
+% bugs, as many \package{fontinst} bugs show up in that output is
+% being generated, but that used to disappear silently when
+% \package{fontinst} was run under Ini\TeX.
+% \begin{macrocode}
+\tracinglostchars=1
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput \ No newline at end of file
diff --git a/fonts/utilities/fontinst/source/ficommon.dtx b/fonts/utilities/fontinst/source/ficommon.dtx
new file mode 100644
index 0000000000..22348cd9ce
--- /dev/null
+++ b/fonts/utilities/fontinst/source/ficommon.dtx
@@ -0,0 +1,2416 @@
+% \CheckSum{2283}
+% \iffalse meta-comment
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2000, 2001 the fontinst maintenance team and
+% any individual authors listed elsewhere in this file.
+% All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.2 or, at your option, any later version.
+%
+%%% From file: ficommon.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth, Lars Hellstr\"om}
+\begin{document}
+\maketitle
+\tableofcontents
+\DocInput{ficommon.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \StopEventually{}
+%
+%
+% \section{General commands}
+% \changes{1.916}{2000/12/27}{Moved Section \thesection\ to
+% \texttt{ficommon.dtx}. (LH)}
+%
+% \changes{1.916}{2001/01/02}{\emph{Major} overhaul of \package{fontdoc}
+% mechanisms for integer and string expressions completed. (LH)}
+% There are roughly five types of arguments that \package{fontinst}
+% commands can take. These are
+% \begin{itemize}
+% \item integer expressions,
+% \item string expressions,
+% \item dimensions,
+% \item commands (i.e., \TeX\ control sequences), and
+% \item other (pretty much ``none of the above'').
+% \end{itemize}
+% The most common form of an integer expression is simply a \TeX\
+% \meta{number} and the most common form of a string expression is
+% simply a sequence of character tokens, but there are more complicated
+% forms. Dimensions are simply \TeX\ \meta{dimen}s; their use is rather
+% limited. Common to integer expressions, string expressions, and
+% dimensions is that these argument types get expanded during
+% evaluation (in the case of string expressions, this expansion
+% \emph{is} the evaluation), which means one can use macros in
+% arguments of these types.
+%
+% Command arguments do not get expanded---they are mainly used with
+% commands that modify the definitions of other commands. As for the
+% ``other'' arguments one cannot give any rules: they might get
+% expanded, but it could also happen that they won't.
+%
+%
+% \subsection{String expressions}
+%
+% The first problem with string expressions is to typeset the values.
+% The character strings that appear in ETX and MTX files usually consist
+% only of immediately printable characters, but there are a few
+% characters (such as underscore) which may be used even though they
+% aren't directly printable. This subsection defines commands which deal
+% with this problem by replacing non-printable characters by commands.
+% The implementation is based on the implementation of the
+% |\MakeHarmless| command in the \package{xdoc} package.
+%
+% \subsubsection{Typesetting problematic characters}
+%
+% \begin{macro}{\PrintChar}
+% \begin{macro}{\InvisibleCharPrefix}
+% \begin{macro}{\InvisibleCharSuffix}
+% The |\PrintChar| command has the syntax
+% \begin{quote}
+% |\PrintChar|\marg{8-bit number}
+% \end{quote}
+% where \meta{8-bit number} is a \TeX\ number in the range 0--255.
+% For arguments in the range 0--31, |\PrintChar| prints
+% `\textit{\ttfamily\string^\string^@}'--`\textit{\ttfamily
+% \string^\string^_}'. For an argument in the range 32--126,
+% |\PrintChar| calls |\Print|\-|Visible|\-|Char| which typesets the
+% corresponding ASCII character (similar to |\char|, but it takes the
+% path via the \LaTeX\ internal representation so that it works with
+% non-typewriter \texttt{OT1} fonts); in particular, |\PrintChar{32}|
+% prints a ``visible space'' character. |\PrintChar{127}| prints
+% `\textit{\ttfamily\string^\string^?}'. For arguments in the range
+% 128--255, |\PrintChar| prints
+% `\textit{\ttfamily\string^\string^80}'--`\textit{\ttfamily
+% \string^\string^ff}'.
+% The |\PrintChar| command is robust.
+%
+% The macros |\InvisibleCharPrefix| and |\InvisibleCharSuffix| begin
+% and end a |^^|-sequence. |\InvisibleCharPrefix| should print the
+% actual |^^|, but it may also for example select a new font for
+% the |^^|-sequence (such font changes are restored at the end of
+% |\PrintChar|).
+% \begin{macrocode}
+%<*doc>
+\DeclareRobustCommand\PrintChar[1]{%
+ \leavevmode
+ \begingroup
+ \count@=#1\relax
+ \ifnum \@xxxii>\count@
+ \advance \count@ 64%
+ \InvisibleCharPrefix
+ \PrintVisibleChar\count@
+ \InvisibleCharSuffix
+ \else\ifnum 127>\count@
+ \PrintVisibleChar\count@
+ \else
+ \InvisibleCharPrefix
+ \ifnum 127=\count@ \PrintVisibleChar{63}\else
+ \@tempcnta=\count@
+ \divide \count@ \sixt@@n
+ \@tempcntb=\count@
+ \multiply \count@ \sixt@@n
+ \advance \@tempcnta -\count@
+ \advance \@tempcntb \ifnum 9<\@tempcntb 87\else 48\fi
+ \advance \@tempcnta \ifnum 9<\@tempcnta 87\else 48\fi
+ \char\@tempcntb \char\@tempcnta
+ \fi
+ \InvisibleCharSuffix
+ \fi\fi
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand\InvisibleCharPrefix{%
+ \/\em
+ \PrintVisibleChar{`\^}\PrintVisibleChar{`\^}%
+}
+\newcommand\InvisibleCharSuffix{\/}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\PrintVisibleChar}
+% The |\PrintVisibleChar| command should print the visible ASCII
+% character whose character code is given in the argument. The
+% definition given here translates every character code to the
+% corresponding \LaTeX\ internal representation, which is necessary
+% if the current font is e.g.\ an \texttt{OT1}-encoded non-typewriter
+% font. If the current font is known to be \texttt{T1}-encoded then
+% one can do just as well with |\char#1 | as the replacement text.
+% \begin{macrocode}
+\newcommand\PrintVisibleChar[1]{%
+ \ifcase #1%
+ \or\or\or\or\or\or\or\or \or\or\or\or\or\or\or\or
+ \or\or\or\or\or\or\or\or \or\or\or\or\or\or\or\or
+ % "20
+ \textvisiblespace \or!\or\textquotedbl \or\#\or\textdollar
+ \or\%\or\&\or\textquoteright\or(\or)\or*\or+\or,\or-\or.\or/%
+ \or % "30
+ 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or:\or;\or
+ \textless\or=\or\textgreater\or?%
+ \or % "40
+ @\or A\or B\or C\or D\or E\or F\or G\or
+ H\or I\or J\or K\or L\or M\or N\or O%
+ \or % "50
+ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\or [\or
+ \textbackslash \or]\or\textasciicircum \or\textunderscore
+ \or % "60
+ \textquoteleft \or a\or b\or c\or d\or e\or f\or g\or h\or
+ i\or j\or k\or l\or m\or n\or o%
+ \or % "70
+ p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\or
+ \textbraceleft \or\textbar \or\textbraceright \or\textasciitilde
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\textvisiblespace}
+% The |\textvisiblespace| command, which is heavily used in names of
+% coding schemes, unfortunately has a default definition which lacks
+% leading on the right side. This redefinition attempts to improve
+% things.
+% \changes{1.921}{2002/03/27}{Redefinition added. (LH)}
+% \begin{macrocode}
+\DeclareTextCommandDefault{\textvisiblespace}{%
+ \makebox[\fontdimen\tw@\font]{%
+ \hfil
+ \vrule \@height.3ex%
+ \vbox{\hrule \@width .66\fontdimen\tw@\font}%
+ \vrule \@height.3ex%
+ \hfil
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@quoted@PrintChar}
+% One sometimes wants to use a printable character string as part of a
+% control sequence name. If the normal definition of |\PrintChar| is
+% in force at such times then each |\PrintChar| in the string would
+% produce lots of errors, which is why |\FD@quoted@PrintChar| has
+% been defined. This macro is an alternative definition of
+% |\PrintChar| which expands to |"|\meta{number}|"|, which can be part
+% of a macro name.
+% \begin{macrocode}
+\def\FD@quoted@PrintChar#1{"\number#1"}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Converting character strings}
+%
+% Replacing all problematic characters with |\PrintChar| calls certainly
+% makes the strings easier to manage, but actually making those
+% replacements is a rather complicated task. This subsubsection
+% contains the macros necessary for doing these replacements.
+%
+% The first problem is how to efficiently recognise the problematic
+% characters. One might think that it is sufficient to look at their
+% |\catcode|, but that will fail for characters like |<| whose normal
+% catcode is 12 but do not appear in the \texttt{OT1} encoding. Because
+% of this, I have chosen a brute strength solution: build a table
+% (indexed by character code) that gives the printable form of
+% every character. This table is stored in the
+% \describecsfamily{FD@printable@\meta{code}}^^A
+% |\FD@printable@|\meta{code} family of control sequences, where the
+% \meta{code} is in the range |32|--|126|. The printable form of
+% characters outside this range is always the |\PrintChar| form.
+% \begin{macrocode}
+\count@=32
+\begingroup
+ \catcode\z@=12\relax
+ \@firstofone{%
+\endgroup
+ \loop
+ \if \ifnum 11=\catcode\count@ 1\else \ifnum 12=\catcode\count@
+ 1\else 0\fi\fi 1%
+ \uccode\z@=\count@
+ \uppercase{\def\@tempa{^^@}}%
+ \else
+ \edef\@tempa{\noexpand\PrintChar{\the\count@}}%
+ \fi
+ \x@cs\let{FD@printable@\the\count@}=\@tempa
+ \advance \count@ \@ne
+ \ifnum 127>\count@ \repeat
+}
+% \end{macrocode}
+% This loop hasn't caught all non-printable characters, so a few
+% entries have to be set explicitly.
+% \begin{macrocode}
+\@namedef{FD@printable@34}{\PrintChar{34}} % "
+\@namedef{FD@printable@60}{\PrintChar{60}} % <
+\@namedef{FD@printable@62}{\PrintChar{62}} % >
+% \end{macrocode}
+%
+%
+% \begin{macro}{\MakePrintable}
+% To render a character string harmless, you do
+% \begin{quote}
+% |\MakePrintable|\marg{macro}\marg{flag}\marg{string}
+% \end{quote}
+% This locally assigns to \meta{macro} the printable character string
+% which corresponds to \meta{string}. Furthermore the control sequence
+% |\if|\meta{flag} is locally let to |\iftrue| or |\iffalse|
+% depending on whether the printable string is simple (only consists
+% of character tokens and |\PrintChar| commands) or not.
+%
+% During the conversion the converted part of the string is stored in
+% |\toks@| and the |@tempswa| switch keeps track of whether the string
+% so far is simple (yes when |false|), but those are both local to
+% |\MakePrintable|.
+% \begin{macrocode}
+\def\MakePrintable#1#2#3{%
+ \begingroup
+ \toks@={}%
+ \escapechar=`\\%
+ \@tempswafalse
+ \FD@printable@#3\protect\FD@printable@
+ \toks@=\expandafter{%
+ \expandafter\let \csname if#2\expandafter\endcsname
+ \csname if\if@tempswa false\else true\fi \expandafter\endcsname
+ \expandafter\def \expandafter#1\expandafter{\the\toks@}%
+ }%
+ \expandafter\endgroup \the\toks@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@printable@iii}
+% \begin{macro}{\FD@printable@iv}
+% \begin{macro}{\FD@printable@v}
+% \begin{macro}{\FD@printable@vi}
+% What one has to be most careful about when making strings printable
+% are the space tokens, since many of \TeX's primitives gladly
+% snatches an extra space (or more) where you don't want them to in
+% this case. Macro parameters can be particularly dangerous, as \TeX\
+% will skip any number of spaces while looking for the replacement
+% text for an undelimited macro argument. Therefore the algorithm for
+% rendering a character token harmless consists begins
+% (|\FD@printable@iii|) with |\string|ing the next token in the
+% string---this preserves the character code and sets the category to
+% 12 for all characters except the ASCII space, which gets category 10
+% (space)---and then |\futurelet| is used to peek at the next token. If
+% it is a space token (|\FD@printable@iv|) then the character code
+% is 32 and the actual space can be gobbled (|\FD@printable@v|), and
+% if it isn't then the next token can be grabbed in a undelimited macro
+% argument (|\FD@printable@vi|). In either case, the harmless form
+% is given by the |\FD@printable@|\meta{code} table entry
+% (in |\FD@printable@v| or |\FD@printable@vi|).
+% \begin{macrocode}
+\def\FD@printable@iii{%
+ \expandafter\futurelet \expandafter\@let@token
+ \expandafter\FD@printable@iv \string
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\FD@printable@iv{%
+ \ifx \@let@token\@sptoken
+ \expandafter\FD@printable@v
+ \else
+ \expandafter\FD@printable@vi
+ \fi
+}
+% \end{macrocode}
+% ^^A Hack:
+% \begingroup
+% \expandafter\def \expandafter\MakePrivateLetters \expandafter{^^A
+% \MakePrivateLetters
+% \catcode`3=11
+% \catcode`2=11
+% }
+% \begin{macrocode}
+\begingroup
+ \catcode`3=\catcode`a
+ \catcode`2=\catcode`a
+ \@firstofone{\gdef\FD@printable@v} {%
+ \toks@=\expandafter{\the \expandafter\toks@ \FD@printable@32}%
+ \FD@printable@
+ }
+\endgroup
+% \end{macrocode}
+% \endgroup
+% \begin{macrocode}
+\def\FD@printable@vi#1{%
+ \if \ifnum `#1<\@xxxii 1\else \ifnum `#1>126 1\else 0\fi\fi 1%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\PrintChar \expandafter{\number`#1}%
+ }%
+ \else
+ \toks@=\expandafter{\the\expandafter\expandafter\expandafter\toks@
+ \csname FD@printable@\number`#1\endcsname}%
+ \fi
+ \FD@printable@
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\FD@printable@}
+% \begin{macro}{\FD@printable@i}
+% \begin{macro}{\FD@printable@ii}
+% \begin{macro}{\FD@printable@vii}
+% But that is not all |\MakePrintable| can do. One must also deal
+% with things in the string that are not simply characters, but more
+% complex items (for example |\str| and |\strint| constructions). When
+% control sequences that start such complex items are fed to
+% |\MakePrintable| they must be preceeded by a |\protect| (they will
+% be if the original command is defined using \LaTeX's
+% |\Declare|\-|Robust|\-|Command| command and the string has been fed
+% through a |\protected@edef|, which happens to be the case); this
+% |\protect| is taken as a signal that the next token should get
+% special processing. Control sequences that are not preceeded by a
+% |\protect| are simply |\string|ed.
+%
+% To accommodate for this, |\FD@printable@| (which is the first step
+% in converting a token) always begins by checking (in |\FD@|\-^^A
+% |printable@i|) whether the next token is a control sequence. If it
+% is and that control sequence is |\protect| then it is checked (in
+% |\FD@printable@ii|) whether the control sequence
+% \describecsfamily{FD@printable\PrintChar{`\\}\meta{cs-name}}^^A
+% |\FD@printable\|\meta{cs-name}, where \meta{cs-name} is the name
+% without |\| (and with any spaces removed) of the control sequence
+% encountered, is defined. If it is defined then control is handed
+% over to |\FD@printable\|\meta{cs-name} which should process the
+% arguments (if any) of |\|\meta{cs-name} and add a suitable
+% representation to |\toks@|, but if |\FD@printable\|\meta{cs-name}
+% isn't defined then this is considered to be an error.
+%
+% If the next token isn't a control sequence then control is handed
+% over to |\FD@printable@ii|. If the next token is a control sequence
+% but not |\protect| then that token is |\string|ed (in
+% |\FD@printable@vii|) and control is handed over to
+% |\FD@printable@vi|.
+% \begin{macrocode}
+\def\FD@printable@{\futurelet\@let@token \FD@printable@i}
+% \end{macrocode}
+% \begin{macrocode}
+\def\FD@printable@i{%
+ \csname FD@printable@%
+ \ifcat \noexpand\@let@token \noexpand\FD@printable@
+ \ifx \@let@token\protect ii\else vii\fi
+ \else iii\fi
+ \endcsname
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\FD@printable@ii\protect#1{%
+ \@ifundefined{FD@printable\expandafter\zap@space\string#1 \@empty}{%
+ \PackageError{fontdoc}{Command \protect#1 not allowed in string}%
+ \@eha
+ }{\csname FD@printable\expandafter\zap@space\string#1 \@empty
+ \endcsname}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\FD@printable@vii{\expandafter\FD@printable@vi \string}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\FD@printable\FD@printable@}
+% A control sequence |\FD@printable\|\meta{cs-name} is responsible for
+% interpreting the string item that begins with the control sequence
+% |\|\meta{cs-name} and appending a printable representation of it to
+% |\toks@|. Normal |\FD@printable\|\meta{cs-name} control sequences
+% must also end by inserting |\FD@printable@| in front of what remains
+% of the string after the complex string item has been removed. This
+% sees to that the rest of the string is also made printable. The only
+% such control sequence which does not insert |\FD@printable@| is
+% |\FD@printable\FD@printable@|, but that is as it should be since
+% |\MakePrintable| itself appends a |\FD@printable@| to every character
+% string it should convert to mark the end of it.
+% \begin{macrocode}
+\expandafter\let
+ \csname FD@printable\string\FD@printable@\endcsname \@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@printable\PrintChar}
+% It is occasionally convenient to use a |\PrintChar| command as part
+% of a string that is to be made harmless instead of using the raw
+% character. The definition is very similar to that of
+% |\FD@printable@vi|.
+% \begin{macrocode}
+\@namedef{FD@printable\string\PrintChar}#1{%
+ \if \ifnum #1<\@xxxii 1\else \ifnum #1>126 1\else 0\fi\fi 1%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\PrintChar \expandafter{\number#1}%
+ }%
+ \else
+ \toks@=\expandafter{\the\expandafter\expandafter\expandafter\toks@
+ \csname FD@printable@\number#1\endcsname}%
+ \fi
+ \FD@printable@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ExpandAndMakePrintable}
+% The |\ExpandAndMakePrintable| command is an abbreviation for a
+% common use of |\MakePrintable|, namely to first feed the string
+% through a |\protected@edef| to get rid of all the simple macros.
+% \begin{macrocode}
+\newcommand*\ExpandAndMakePrintable[3]{%
+ \protected@edef\@tempa{{#2}{#3}}%
+ \expandafter\MakePrintable \expandafter#1\@tempa
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Evaluating string expressions}
+%
+% In string expressions, the only available operation is juxtaposition
+% (fancy name for putting things next to each other) and thus the
+% syntax for a string expression is
+% \begin{quote}
+% \meta{string expression} \(\longrightarrow\) $\emptyset \mid$
+% \meta{string atom}\meta{string expression}
+% \end{quote}
+% where $\emptyset$ denotes the empty string. A \meta{string atom} is
+% one of
+% \begin{quote}
+% \meta{character token}\\
+% |\str|\marg{string expression}\\
+% |\strint|\marg{string expression}
+% \end{quote}
+% The meaning of a \meta{character token} is explained
+% in~\cite{TeXbook}. The |\str| and |\strint| forms of
+% \marg{string atom} refer to the respective values of the string and
+% integer variables (see Subsection~\ref{Ssec:Variables}) whose names
+% are given in the argument of |\str| or |\strint| respectively. Since
+% the names of variables are themselves string expressions, |\str| and
+% |\strint| may themselves be used in names of variables.
+%
+% It should be noted that most of \package{fontinst}'s string
+% expressions sooner or later end up between a |\csname| and the
+% corresponding |\endcsname|. This places significant restrictions on
+% what may occur in string expressions.
+%
+% \begin{macro}{\str}
+% \begin{macro}{\strint}
+% \changes{1.909}{1999/10/19}{Change to stop it from gobbling a
+% following space if the integer is stored in a macro. (LH)}
+% In \package{fontinst} the only macros needed for dealing with string
+% expressions are |\str| and |\strint|.
+% \begin{macrocode}
+%<*pkg>
+\def\str#1{\csname~s-#1\endcsname}
+\def\strint#1{\expandafter\identity_one\expandafter{\number\int{#1}}}
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \package{fontdoc} mainly uses \TeX's text mode for typesetting string
+% expressions because not all characters are available in math mode;
+% it's easier to switch to text mode than to augment the math setup. One
+% kind of material is however typeset in math mode, namely
+% ``string-valued functions'': the name and functional parenthesis of
+% such material is typeset in math mode to get a mathematical look.
+%
+% \begin{macro}{\FD@string@func}
+% The |\FD@string@func| macro has the syntax
+% \begin{quote}
+% |\FD@string@func|\marg{name}\marg{argument}
+% \end{quote}
+% It is used for typesetting the \meta{name}$($\meta{argument}$)$ of a
+% string-valued function (e.g.\ the value-of-string-variable function
+% $\mathrm{s}$). It should only be used in horizontal mode.
+%
+% |\FD@string@func| includes a bit of extra spacing around the typeset
+% text, but not at the beginning or end of a string and neither
+% between two string-valued functions. As a flag for this is used
+% that the value of |\spacefactor| is 1; when it is one should proceed
+% as if this extra spacing is already present.
+% \begin{macrocode}
+%<*doc>
+\def\FD@string@func#1#2{%
+ \relax
+ \ifnum \spacefactor=\@ne $\mkern1mu\else$\fi
+ \mathrm{#1}($%
+ #2%
+ \ifnum \spacefactor=\@ne $\mkern-1mu\else $\fi)\mkern1mu$%
+ \spacefactor=\@ne
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TypesetStringExpression}
+% \begin{macro}{\FD@typeset@string}
+% \begin{macro}{\ifFD@swa}
+% In \package{fontdoc} the string expressions must be typeset, and
+% that is not trivial due to that (i) not all character tokens have
+% catcode 11 or 12 and (ii) not all characters are available in all
+% fonts. Furthermore the non-character string atoms should be given
+% special treatment in character strings!
+%
+% Because of this, string expressions that are to be typeset are
+% handed to a special command |\TypesetStringExpression|, which takes
+% the string to typeset as its only argument. This string may contain
+% user-defined macros.
+% \begin{macrocode}
+\newcommand\TypesetStringExpression[1]{%
+ \protected@edef\@tempa{%
+ \noexpand\MakePrintable \noexpand\@tempa {FD@swa}{#1}%
+ }%
+ \@tempa
+ \FD@typeset@string{\@tempa}%
+}
+% \end{macrocode}
+% Actually typesetting the string is handled in |\FD@typeset@string|,
+% but strings handed to this macro must be preprocessed by a full
+% protected expansion and a |\MakeHarmless|.
+% \begin{macrocode}
+\def\FD@typeset@string#1{%
+ \mbox{%
+ \normalfont\ttfamily
+ \spacefactor=\@ne
+ #1%
+ \ifnum \spacefactor=\@ne $\mkern-1mu\m@th$\fi
+ }%
+}
+% \end{macrocode}
+% The |\ifFD@swa| control sequence is often |\let| to |\iftrue| or
+% |\iffalse| by |\Make|\-|Printable|, and then it is used as a
+% conditional. Since that assignment sometimes takes place in
+% conditional text however, one must make sure that |\ifFD@swa|
+% always is some conditional.
+% \begin{macrocode}
+\let\ifFD@swa\iffalse
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\str}
+% \begin{macro}{\FD@printable\str}
+% The processing of the |\str| macro in \package{fontdoc} is far from
+% straightforward. |\str| has to be robust, but apart from that its
+% defintion has no effect on how its argument is processed. That is
+% instead controlled by |\FD@printable\str|, which happens to use
+% |\str| as an auxiliary formatting macro.
+%
+% Most of the complexity below is however due to the processing
+% needed to determine whether the string variable accessed has been
+% assigned a value. See |\Set|\-|String|\-|Variable| for more
+% information.
+% \begin{macrocode}
+\DeclareRobustCommand\str[1]{\FD@string@func{s}{#1}}
+\@namedef{FD@printable\string\str}#1{%
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \begingroup
+ \let\PrintChar=\FD@quoted@PrintChar
+ \if \ifFD@swa \@ifundefined{FD@s-\@tempa}{0}{1}\else 0\fi 1%
+ \expandafter
+ \endgroup
+ \csname FD@s-\@tempa\endcsname
+ \else
+ \endgroup
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\str \expandafter{\@tempa}}%
+ \@tempswatrue
+ \fi
+ \FD@printable@
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\strint}
+% \begin{macro}{\FD@printable\strint}
+% |\strint| is handled similarly to |\str|.
+% \begin{macrocode}
+\DeclareRobustCommand\strint[1]{\FD@string@func{int}{#1}}
+\@namedef{FD@printable\string\strint}#1{%
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \protected@edef\@tempa{%
+ \ifFD@swa \protect\FD@simple@int \else \strint \fi{\@tempa}%
+ }
+ \toks@=\expandafter{\the\expandafter\toks@ \@tempa}%
+ \@tempswatrue
+ \FD@printable@
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\macroparameter}
+% \changes{1.916}{2001/01/06}{Command added. (LH)}
+% \begin{macro}{\FD@printable\macroparameter}
+% The |\macroparameter| command can be used in string and integer
+% expressions as a sort of ``macro parameter placeholder''. It is not
+% defined in \package{fontinst}, but in \package{fontdoc} one
+% occationally writes comments which say things like ``XXX is short
+% for ASDFSKADN'', and in those cases one can use |\macroparameter|
+% as a placeholder for an argument. The syntax is
+% \begin{quote}
+% |\macroparameter|\marg{digit}
+% \end{quote}
+% where \meta{digit} should be a decimal digit between |1| and |9|
+% inclusive.
+%
+% The definition in |\macroparameter| handles uses of the command in
+% integer expressions, whereas |\FD@printable\macroparameter| takes
+% care of uses in string expressions.
+% \begin{macrocode}
+\DeclareRobustCommand\macroparameter[1]{%
+ \gdef\FD@expression{\text{\normalfont\itshape\##1}}%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\z@
+ \FD@evaluate@false
+}
+\@namedef{FD@printable\string\macroparameter}#1{%
+ \toks@=\expandafter{\the\toks@\textrm{\emph{\##1}}}%
+ \@tempswatrue
+ \FD@printable@
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+%
+% \subsection{Integer expressions}
+%
+% An \meta{integer expression} is one of the following:
+% \begin{quote}
+% \meta{number}\\
+% |\int|\marg{string expression}\\
+% |\neg|\marg{integer expression}\\
+% |\add|\marg{integer expression}\marg{integer expression}\\
+% |\sub|\marg{integer expression}\marg{integer expression}\\
+% |\max|\marg{integer expression}\marg{integer expression}\\
+% |\min|\marg{integer expression}\marg{integer expression}\\
+% |\mul|\marg{integer expression}\marg{integer expression}\\
+% |\div|\marg{integer expression}\marg{integer expression}\\
+% |\half|\marg{integer expression}\\
+% |\otherhalf|\marg{integer expression}\\
+% |\scale|\marg{integer expression}\marg{integer expression}\\
+% |\width|\marg{string expression}\\
+% |\height|\marg{string expression}\\
+% |\depth|\marg{string expression}\\
+% |\italic|\marg{string expression}\\
+% |\kerning|\marg{string expression}\marg{string expression}
+% \end{quote}
+% \meta{number} is any \TeX\ number, as defined in~\cite{TeXbook}. The
+% \meta{string expression} in the argument of |\int| must be the name of
+% an integer variable which is currently set, i.e., the condition
+% \begin{quote}
+% |\ifisint|\marg{string expression}|\then|
+% \end{quote}
+% must evaluate to true. Likewise the \meta{string expression} in the
+% argument of |\width|, |\height|, |\depth|, and |\italic| must be the
+% name of a glyph which is currently set, i.e., the condition
+% \begin{quote}
+% |\ifisglyph|\marg{string expression}|\then|
+% \end{quote}
+% must evaluate to true.
+%
+% \begin{macro}{\eval_expr}
+% \begin{macro}{\eval_expr_to}
+% \begin{macro}{\g_eval_expr_to}
+% \begin{macro}{\result}
+% The only thing \package{fontinst} does with integer expressions is
+% evaluating them. The macro
+% \begin{quote}
+% |\eval_expr|\marg{integer expression}
+% \end{quote}
+% globally assigns |\result| to the value of
+% \meta{integer expression}, and changes the value of no other
+% counters.
+%
+% The macro
+% \begin{quote}
+% |\eval_expr_to|\marg{\TeX\ integer variable}^^A
+% \marg{integer expression}
+% \end{quote}
+% locally assigns the value of \meta{integer expression} to
+% \meta{\TeX\ integer variable} (which is an integer variable as
+% defined in~\cite{TeXbook}).
+% |\g_eval_expr_to| does the same globally.
+%
+% \begin{macrocode}
+%<*pkg>
+\newcount\result
+\def\eval_expr#1{\global\result=#1\x_relax}
+\def\eval_expr_to#1#2{\eval_expr{#2}#1=\result}
+\def\g_eval_expr_to#1#2{\eval_expr{#2}\global#1=\result}
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\TypesetIntegerExpression}
+% In \package{fontdoc} the main task is instead to typeset the
+% expression as a mathematical formula, but in some cases one wants to
+% know its value as well (if possible). Therefore things get a bit
+% more complex in that context. The top-level command there is
+% \begin{quote}
+% |\TypesetIntegerExpression|\marg{integer expression}
+% \end{quote}
+% which typesets the \meta{integer expression} by first forming (in the
+% |\FD@expression| macro) code for typesetting the integer expression.
+% |\Typeset|\-|Integer|\-|Expression| should be only be used in math
+% mode.
+%
+% Most of the work in |\TypesetIntegerExpression| is carried out by
+% the |\FD@eval@expr| macro and hence |\TypesetIntegerExpression| sets
+% a couple of other variables as explained below. Apart from the fact
+% that |\FD@eval@expr| doesn't actually typeset anything, the main
+% difference between it and |\Typeset|\-|Integer|\-|Expression| is that
+% the latter also accepts code that after expansion will become integer
+% expressions, whereas the former requires that all such macros have
+% first been expanded.
+% \begin{macrocode}
+%<*doc>
+\newcommand\TypesetIntegerExpression[1]{%
+ \protected@edef\@tempa{#1}%
+ \expandafter\FD@eval@expr \expandafter{\@tempa}%
+ \FD@expression
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@expression}
+% \begin{macro}{\FD@result}
+% \begin{macro}{\FD@priority}
+% \begin{macro}{\FD@bracket@level}
+% \begin{switch}{FD@evaluate@}
+% The |\FD@expression| macro, |\FD@result| and |\FD@bracket@level|
+% count registers, the |\FD@priority| chardef token, and the
+% |FD@evaluate@| switch are used by \package{fontdoc} when formatting
+% and evaluating an integer expression. They are all assigned globally.
+%
+% The |\FD@expression| macro contains code for typesetting an
+% expression. |\FD@priority| is a chardef token whose numerical value
+% specifies the priority of the outermost operation in
+% |\FD@expression| according to the following table:
+% \begin{enumerate}
+% \item[0]
+% Outermost operation is $+$ or $-$.
+% \item[1]
+% Outermost operation is explicit multiplication ($\cdot$) or
+% division $/$. If it is one of the factors in a product then
+% that multiplication must be explicit.
+% \item[2]
+% Outermost operation is explicit multiplication. If it is to be
+% the right factor in a product, then the multiplication must be
+% made explicit too.
+% \item[3]
+% Outermost operation is explicit multiplication. It
+% does not need to be explicitly multiplied.
+% \item[4]
+% Outermost operation is implicit multiplication (juxtaposition),
+% unary prefix (unary $-$) or something which is bracketed anyway.
+% If it is to be the right factor in a product, then that
+% multiplication should be made explicit too. A typical example
+% of this kind of thing is an explicit negative number.
+% \item[5]
+% Outermost operation is implicit multiplication (juxtaposition)
+% or something which is bracketed anyway. It does not need to be
+% explicitly multiplied.
+% \item[6]
+% The expression is an explicit non-negative number. If it is to
+% be the right factor in a product, then the multiplication
+% should be made explicit.
+% \end{enumerate}
+% |\FD@bracket@level| keeps track of what parenthesis size one must
+% use to cover the expression in |\FD@expression|: 0 is the normal
+% size, 1 is |\big| size, 2 is |\Big| size, etc. The |FD@evaluate@|
+% switch specifies whether |\FD@eval@expr| should try to (upon entry)
+% or managed to (after it is completed) evaluate the integer
+% expression (true is evaluate, false is don't bother). When the value
+% has been evaluated, it is returned in |\FD@result|.
+% \begin{macrocode}
+\newcount\FD@result
+\newcount\FD@bracket@level
+\def\FD@evaluate@true{\global\let\ifFD@evaluate@\iftrue}
+\def\FD@evaluate@false{\global\let\ifFD@evaluate@\iffalse}
+\FD@evaluate@false
+% \end{macrocode}
+% \end{switch}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\FD@eval@expr}
+% The |\FD@eval@expr| macro has the syntax
+% \begin{quote}
+% |\FD@eval@expr|\marg{integer expression}
+% \end{quote}
+% It puts code for typesetting the \meta{integer expression} in the
+% |\FD@expression| macro, sets |\FD@bracket@level| to the
+% corresponding value, and if |FD@evaluate@| is true it also tries to
+% evaluate the expression and put the result in |\FD@result|.
+%
+% More precisely, |\FD@eval@expr| only handles the \meta{\TeX~number}
+% cases of integer expression. In the other cases the first token in
+% the integer expression is a robust command which should take care of
+% building the expression as needed.
+% \begin{macrocode}
+\def\FD@eval@expr#1{%
+ \expandafter\expandafter \expandafter\ifx
+ \expandafter\@car#1\x@relax\@nil \protect
+ #1%
+ \else\ifcat \expandafter\noexpand \@car#1\x@relax\@nil 0%
+ \global\FD@result=#1\x@relax
+ \xdef\FD@expression{\the\FD@result}%
+ \global\chardef\FD@priority=\ifnum \FD@result<\z@ 4\else 6\fi
+ \global\FD@bracket@level=\z@
+ \else
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \global\FD@bracket@level=\ifFD@swa\z@\else\@ne\fi
+ \protected@xdef\FD@expression{\protect\mbox{\texttt{\@tempa}}}%
+ \endgroup
+ \global\chardef\FD@priority=5%
+ \FD@evaluate@false
+ \fi\fi
+}
+%</doc>
+% \end{macrocode}
+% Note: It is important that all groups that are started or ended
+% during the evaluation of an integer expression are of |\begingroup|
+% type, since |\bgroup| groups affect spacing in math mode.
+% \end{macro}
+%
+% \begin{macro}{\add}
+% The |\add| command has the syntax
+% \begin{quote}
+% |\add|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the sum of the two \meta{integer expression}s.
+% \begin{macrocode}
+%<*pkg>
+\def\add#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\advance \result \a_count
+ \egroup
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\add[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \protected@xdef\FD@expression{\@tempa+\FD@expression}%
+ \ifFD@evaluate@ \global\advance \FD@result \a@count \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\z@
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sub}
+% The |\sub| command has the syntax
+% \begin{quote}
+% |\sub|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the difference between the two \meta{integer
+% expression}s.
+% \begin{macrocode}
+%<*pkg>
+\def\sub#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \advance \a_count -\result
+ \global\result=\a_count
+ \egroup
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\sub[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{\@tempa-\FD@expression}%
+ \ifFD@evaluate@
+ \advance \a@count -\FD@result
+ \global\FD@result=\a@count
+ \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\z@
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@subexpression}
+% \begin{macro}{\FD@commapenalty}
+% The |\FD@subexpression| macro has the syntax
+% \begin{quote}
+% |\FD@subexpression|\marg{math mode material}
+% \end{quote}
+% It should only be used in math mode and produces results very
+% similar to \meta{math mode material}, but it locally increases all
+% the math-related penalties by |\FD@commapenalty| for when the math
+% mode material is converted to a horizontal list. This allows
+% linebreaking to take notice of logical nesting in expressions.
+%
+% |\FD@commapenalty| is used as a companion of |\relpenalty| and
+% |\binoppenalty|, but which is used after commas (where \TeX\ doesn't
+% insert penalties automatically).
+% \begin{macrocode}
+\def\FD@subexpression#1{${%
+ \advance \binoppenalty \FD@commapenalty
+ \advance \relpenalty \FD@commapenalty
+ \advance \FD@commapenalty \FD@commapenalty
+ $#1$}$%
+}
+\newcount\FD@commapenalty
+\FD@commapenalty=\binoppenalty
+\advance \FD@commapenalty \relpenalty
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\FD@bracket@expression}
+% The |\FD@bracket@expression| brackets the expression currently in
+% |\FD@expression| by the suitable size of parentheses and updates
+% |\FD@bracket@level| and |\FD@priority| accordingly.
+% \begin{macrocode}
+\def\FD@bracket@expression{%
+ \protected@xdef\FD@expression{%
+ \ifcase\FD@bracket@level \or \protect\bigl \or \protect\Bigl \or
+ \protect\biggl \else \protect\Biggl \fi (%
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \or \protect\bigr \or \protect\Bigr \or
+ \protect\biggr \else \protect\Biggr \fi )%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\int}
+% \changes{1.909}{1999/10/19}{\package{fontdoc} implementation
+% changed to using \cs{typeset@integer}. (LH)}
+% \begin{macro}{\FD@simple@int}
+% The |\int| command has the syntax
+% \begin{quote}
+% |\int|\marg{string expression}
+% \end{quote}
+% It is used to represent the value of the \package{fontinst} integer
+% whose name is the value of the \meta{string expression} in integer
+% expressions.
+%
+% The |\FD@simple@int| macro take the printable string form of the
+% name of an integer variable as its argument and typesets the
+% printed representation of this integer, but it should only be used
+% when the argument is a simple string expression. When the argument
+% is not a simple string expression, |\FD@integer@func| should be
+% used instead. |\FD@simple@int| should only be called in horizontal
+% mode.
+% \begin{macrocode}
+%<pkg>\def\int#1{\csname i-#1 \endcsname}
+%<*doc>
+\DeclareRobustCommand\int[1]{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \protected@xdef\FD@expression{%
+ \ifFD@swa
+ \text{\protect\FD@simple@int{\@tempa}}%
+ \else
+ \protect\FD@integer@func{int}{\@tempa}%
+ \fi
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\ifFD@swa\z@\else\@ne\fi
+ \FD@evaluate@false
+ \endgroup
+}
+\def\FD@simple@int#1{{\normalfont\itshape #1\/}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\FD@integer@func}
+% The |\FD@integer@func| macro has the syntax
+% \begin{quote}
+% |\FD@integer@func|\marg{name}\marg{argument}
+% \end{quote}
+% It is used for typesetting the \meta{name}$($\meta{argument}$)$
+% of an integer-valued function which takes a string expression as
+% argument (e.g.\ the width-of-glyph function $\mathrm{w}$). It
+% should only be used in math mode.
+%
+% The empty group in the argument of |\mathop| is there to ensure
+% that the nucleus of the mathop atom isn't simply a symbol, since
+% \TeX\ in that case centers it vertically.
+% \begin{macrocode}
+\def\FD@integer@func#1#2{%
+ \mathop{\mathrm{#1}{}}(\text{\FD@typeset@string{#2}})%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\neg}
+% The |\neg| command has the syntax
+% \begin{quote}
+% |\neg|\marg{integer expression}
+% \end{quote}
+% It represents the negative of the \meta{integer expression}.
+% \begin{macrocode}
+%<pkg>\def\neg#1{#1 \global\result=-\result}
+%<*doc>
+\DeclareRobustCommand\neg[1]{%
+ \FD@eval@expr{#1}%
+ \ifnum 5>\FD@priority \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{-\FD@expression}%
+ \global\chardef\FD@priority=4%
+ \ifFD@evaluate@ \global\FD@result=-\FD@result \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mul}
+% The |\mul| command has the syntax
+% \begin{quote}
+% |\mul|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the product of the two \meta{integer expression}s.
+% \begin{macrocode}
+%<*pkg>
+\def\mul#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \egroup
+}
+%</pkg>
+% \end{macrocode}
+%
+% The main problem in the \package{fontdoc} definition of |\mul| is
+% to determine whether the multiplication should be made explicit or
+% not, and what priority code the resulting expression should be
+% given. It turns out that if the right factor has priority 1 (it is
+% a quotient or a product that ends with a quotient) then the
+% combined expression will be too, whereas if it isn't but the left
+% factor has priority 1 then the combined expression will get
+% priority 2. The remaining cases will be explicit or implicit
+% depending on the parity of the priority of the right expression, and
+% priority will be odd or even depending on the parity of the priority
+% of the left expression.
+% \begin{macrocode}
+%<*doc>
+\DeclareRobustCommand\mul[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \let\FD@left@priority=\FD@priority
+ \FD@eval@expr{#2}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \if \ifnum \FD@left@priority=\@ne e%
+ \else\ifnum \FD@priority<\thr@@ e%
+ \else\ifodd \FD@priority i\else e\fi\fi\fi e%
+ \cdot
+ \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@ \global\multiply \FD@result \a@count \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifnum \FD@left@priority=\@ne 2%
+ \else\ifodd\FD@left@priority
+ \ifodd\FD@priority 5\else 3\fi
+ \else
+ \ifodd\FD@priority 4\else 2\fi
+ \fi\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\div}
+% The |\div| command has the syntax
+% \begin{quote}
+% |\div|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the quotient of the two \meta{integer expression}s, as
+% computed by \TeX's |\divide| command: non-integer quotients are
+% rounded towards zero.
+% \begin{macrocode}
+%<*pkg>
+\def\div#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \divide \a_count \result
+ \global\result=\a_count
+ \egroup
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\div[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \FD@eval@expr{#2}%
+ \ifnum 4>\FD@priority \FD@bracket@expression \fi
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \ifcase\FD@bracket@level \or \protect\big \or \protect\Big \or
+ \protect\bigg \else \protect\Bigg \fi /%
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \divide \a@count \FD@result
+ \global\FD@result=\a@count
+ \fi
+ \global\chardef\FD@priority=\@ne
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@eval@spec@expr}
+% The |\FD@eval@spec@expr| macro has the syntax
+% \begin{isyntax}
+% |\FD@eval@spec@expr|\marg{integer expression}^^A
+% \discretionary{}{}{}\marg{spec-command}^^A
+% \discretionary{}{}{}\marg{rep-command}
+% \end{isyntax}
+% It does pretty much the same thing as |\FD@eval@expr|, but if the
+% first token in the \meta{integer expression} is the
+% \meta{spec-command} then it will do
+% \begin{quote}
+% \meta{rep-command}\meta{integer expression}
+% \end{quote}
+% instead of the normal activities. This is useful for operations that
+% are normally denoted as $n$-ary operations rather that binary ones,
+% i.e., for |\max| and |\min|.
+% \begin{macrocode}
+\def\FD@eval@spec@expr#1#2#3{%
+ \expandafter\ifx \@car#1\x@relax\@nil #2%
+ #3#1%
+ \else
+ \FD@eval@expr{#1}%
+ \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\max}
+% The |\max| command has the syntax
+% \begin{quote}
+% |\max|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the maximum of the two \meta{integer expression}s.
+% \begin{macrocode}
+%<*pkg>
+\def\max#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count>\result \global\result=\a_count \fi
+ \egroup
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\max[2]{%
+ \begingroup
+ \toks@={}%
+ \a@count=-\maxdimen
+ \b@count=\z@
+ \FD@eval@spec@expr{\max{#1}{#2}}{\max}{\FD@maxmin@comma}%
+ \ifnum \a@count>\FD@bracket@level
+ \global\FD@bracket@level=\a@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \protect\plainmax
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\{}%
+ \the\toks@
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\}}%
+ }%
+ \ifFD@evaluate@
+ \ifnum \a@count>\FD@result \global\FD@result=\a@count \fi
+ \fi
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\min}
+% The |\min| command has the syntax
+% \begin{quote}
+% |\min|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the minimum of the two \meta{integer expression}s.
+% \begin{macrocode}
+%<*pkg>
+\def\min#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \ifnum \a_count<\result \global\result=\a_count \fi
+ \egroup
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\min[2]{%
+ \begingroup
+ \toks@={}%
+ \a@count=\maxdimen
+ \b@count=\z@
+ \FD@eval@spec@expr{\min{#1}{#2}}{\min}{\FD@maxmin@comma}%
+ \ifnum \a@count>\FD@bracket@level
+ \global\FD@bracket@level=\a@count
+ \fi
+ \protected@xdef\FD@expression{%
+ \protect\plainmin
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\{}%
+ \the\toks@
+ \protect\FD@subexpression{\FD@expression}%
+ \ifcase\FD@bracket@level \protect\@firstofone \or \protect\bigl
+ \or \protect\Bigl \or \protect\biggl \else \protect\Biggl
+ \fi{\}}%
+ }%
+ \ifFD@evaluate@
+ \ifnum \a@count<\FD@result \global\FD@result=\a@count \fi
+ \fi
+ \global\chardef\FD@priority=5%
+ \global\advance \FD@bracket@level \@ne
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@maxmin@comma}
+% The |\FD@maxmin@comma| macro does most of the work for |\max| and
+% |\min| in \package{fontdoc}. In some sense it inserts the commas
+% between the operands, but it also takes care of evaluating the
+% maximum\slash minimum and determining the proper bracketing level.
+%
+% The sequence of arguments (separated by commas) is compiled in
+% |\toks@|. The greatest\slash least value of an argument found so
+% far is kept in |\a@count|, and the greatest bracketing level found
+% is kept in |\b@count|.
+% \begin{macrocode}
+\def\FD@maxmin@comma#1#2#3{%
+ \FD@eval@spec@expr{#2}{#1}{\FD@maxmin@comma}%
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\protect \expandafter\FD@subexpression
+ \expandafter{\FD@expression}%
+ ,\penalty\FD@commapenalty\,%
+ }
+ \ifFD@evaluate@
+ \ifnum \a@count \ifx\max#1<\else>\fi \FD@result
+ \a@count=\FD@result
+ \fi
+ \fi
+ \ifnum \b@count<\FD@bracket@level \b@count=\FD@bracket@level \fi
+ \FD@eval@spec@expr{#3}{#1}{\FD@maxmin@comma}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\half}
+% \begin{macro}{\otherhalf}
+% \multchanges{\cs{half}\cs{otherhalf}}{1.916}{2000/12/31}{Macros
+% added. (LH)}
+% The |\half| and |\otherhalf| macros have the syntaxes
+% \begin{quote}
+% |\half|\marg{integer expression}\\
+% |\otherhalf|\marg{integer expression}
+% \end{quote}
+% They both represent one half of the \meta{integer expression}, but
+% they don't round it the same way. |\half| does rounding as
+% specified in~\cite[p.~237]{TAOCP2} (towards even integers) whereas
+% |\otherhalf| does it the other way (towards odd integers). This
+% means that
+% \begin{quote}
+% |\add{\half{|\meta{IE}|}}{\otherhalf{|\meta{IE}|}}|
+% \end{quote}
+% will always sum up to precisely the same as the \meta{IE} integer
+% expression.
+% \begin{macrocode}
+%<*pkg>
+\def\half#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+\def\otherhalf#1{
+ #1\x_relax
+ \ifodd\result
+ \global\advance \result \@ne
+ \global\divide \result \tw@
+ \ifodd\result \else \global\advance \result \m@ne \fi
+ \else
+ \global\divide \result \tw@
+ \fi
+}
+%</pkg>
+%<*doc>
+\DeclareRobustCommand\half[1]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifodd\FD@priority 5%
+ \else 3\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \protected@xdef\FD@expression{%
+ \protect\frac{1}{2}%
+ \ifnum \FD@priority>\thr@@ \else \cdot \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \ifodd \FD@result
+ \global\advance \FD@result \@ne
+ \global\divide \FD@result \tw@
+ \ifodd\FD@result \global\advance \FD@result \m@ne \fi
+ \else
+ \global\divide \FD@result \tw@
+ \fi
+ \fi
+ \endgroup
+}
+\DeclareRobustCommand\otherhalf[1]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \a@count=%
+ \ifnum \FD@priority=\@ne 1%
+ \else\ifodd\FD@priority 5%
+ \else 3\fi\fi
+ \global\chardef\FD@priority=\a@count
+ \protected@xdef\FD@expression{%
+ \protect\frac{1}{2}%
+ \ifnum \FD@priority>\thr@@ \else \cdot \fi
+ \FD@expression
+ }%
+ \ifFD@evaluate@
+ \ifodd \FD@result
+ \global\advance \FD@result \@ne
+ \global\divide \FD@result \tw@
+ \ifodd\FD@result\else \global\advance \FD@result \m@ne \fi
+ \else
+ \global\divide \FD@result \tw@
+ \fi
+ \fi
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\scale}
+% The |\scale| command has the syntax
+% \begin{quote}
+% |\scale|\marg{integer expression}\marg{integer expression}
+% \end{quote}
+% It represents the result of multiplying the first \meta{integer
+% expression} by as many thousands as is specified by the second
+% \meta{integer expression}. In practice, |\scale|\marg{ie1}\marg{ie2}
+% is very similar to
+% \begin{quote}
+% |\div{\mul|\marg{ie1}\marg{ie2}|}{1000}|
+% \end{quote}
+% but |\scale| also tries to do proper rounding (note however that
+% |\scale|ing by 500 is not rounded properly; use |\half| instead).
+% \begin{macrocode}
+%<*pkg>
+\def\scale#1#2{
+ #1
+ \bgroup
+ \a_count=\result
+ \eval_expr{#2}
+ \global\multiply \result \a_count
+ \rounded_thousandths
+ \egroup
+}
+%</pkg>
+% \end{macrocode}
+%
+% The second (scaling factor) argument of |\scale| is usually very
+% simple, and in that case the |\scale| will be formatted as a
+% fraction (containing the second argument) multiplied by the first
+% argument.
+% \begin{macrocode}
+%<*doc>
+\DeclareRobustCommand\scale[2]{%
+ \begingroup
+ \FD@eval@expr{#1}%
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \let\@tempa=\FD@expression
+ \ifFD@evaluate@ \a@count=\FD@result \fi
+ \b@count=\FD@bracket@level
+ \let\FD@left@priority=\FD@priority
+ \FD@eval@expr{#2}%
+ \if \ifnum \FD@bracket@level<\@ne \ifnum \FD@priority>\thr@@
+ 1\else 0\fi\else 0\fi 1%
+ \protected@xdef\FD@expression{%
+ \protect\frac{\FD@expression}{1000}%
+ \if \ifnum \FD@left@priority<\thr@@ e\else
+ \ifodd \FD@left@priority i\else e\fi\fi e%
+ \cdot
+ \fi
+ \@tempa
+ }
+ \global\chardef\FD@priority=%
+ \ifnum \FD@left@priority=\@ne 1\else
+ \ifodd\FD@left@priority 5\else 3\fi\fi
+ \global\FD@bracket@level=\b@count
+ \else
+ \ifnum \FD@priority<\@ne \FD@bracket@expression \fi
+ \protected@xdef\FD@expression{%
+ \@tempa
+ \if \ifnum \FD@left@priority=\@ne e%
+ \else\ifnum \FD@priority<\thr@@ e%
+ \else\ifodd \FD@priority i\else e\fi\fi\fi e%
+ \cdot
+ \fi
+ \FD@expression
+ \ifcase\FD@bracket@level \or \protect\big \or \protect\Big
+ \or \protect\bigg \else \protect\Bigg \fi /1000%
+ }%
+ \ifnum \FD@bracket@level<\b@count
+ \global\FD@bracket@level=\b@count
+ \fi
+ \global\chardef\FD@priority=\@ne
+ \fi
+ \ifFD@evaluate@
+ \global\multiply \FD@result \a@count
+ \global\divide \FD@result 500
+ \ifodd \FD@result
+ \global\advance \FD@result \ifnum 0>\FD@result - \fi \@ne
+ \fi
+ \global\divide \FD@result \tw@
+ \fi
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rounded_thousandths}
+% \changes{1.901}{1999/03/06}{Macro added. \cs{scale} changed to
+% use it. (LH)}
+% \begin{macro}{\l_rounded_thousandths}
+% The |\rounded_thousandths| macro divides |\result|
+% by 1000 and rounds the result to the nearest integer. This is
+% different from
+% \begin{quote}
+% |\global\divide \result \one_thousand|
+% \end{quote}
+% since the latter always rounds positive numbers downwards and
+% negative numbers upwards.
+%
+% |\l_rounded_thousandths| does the same thing, but to the register
+% passed as parameter \#1 and is assigned locally.
+% \changes{1.913}{2000/03/04}{Macro added. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\rounded_thousandths{
+ \global\divide \result \five_hundred
+ \ifodd \result
+ \global\advance \result by \ifnum 0>\result - \fi 1
+ \fi
+ \global\divide \result \tw@
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\l_rounded_thousandths#1{
+ \divide #1 \five_hundred
+ \ifodd #1
+ \advance #1 by \ifnum 0>#1 - \fi\@ne
+ \fi
+ \divide #1 \tw@
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\l_inv_scale}
+% \changes{1.913}{2000/03/11}{Macro added. (LH)}
+% The |\l_inv_scale| takes two arguments: as \#1 a count register,
+% and as \#2 a \TeX\ number. |\l_inv_scale| scales \#1 by the inverse
+% of \#2, if the value in \#1 is $n$ and the value in \#2 is $m$ then
+% |\l_inv_scale| computes
+% $$
+% \left[ \frac{1000n}{m} \right] \mbox{,}
+% $$
+% where the brackets denote rounding to the nearest integer, and
+% assigns this number to \#1 locally.
+% \begin{macrocode}
+\def\l_inv_scale#1#2{
+ \multiply #1 \two_thousand
+ \divide #1 #2\x_relax
+ \ifodd#1 \advance #1 \ifnum 0>#1 - \fi\@ne \fi
+ \divide #1 \tw@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \multchanges{\cs{priority}}{1.909}{1999/10/20}{Changed condition for
+% \cs{ifnum}, so that expressions with equal priority will not get
+% bracketed when nested. (LH)}
+% \multchanges{\cs{expression}\cs{priority}\cs{identity}^^A
+% \cs{bracket}}{1.916}{2001/01/01}{Macros removed. (LH)}
+%
+% \begin{macro}{\ifnumber}
+% \changes{1.900}{1999/02/15}{Command added. (LH)}
+% The call
+% \begin{quote}
+% |\ifnumber|\marg{integer expression}\meta{rel}^^A
+% \marg{integer expression}|\then|
+% \end{quote}
+% can be used to compare the two integer expressions. \meta{rel} may
+% be |<|, |=|, or |>|.
+% \begin{macrocode}
+\def\ifnumber#1#2#3\then{
+ \eval_expr_to\a_count{#1}
+ \eval_expr{#3}
+ \ifnum \a_count#2\result
+ \expandafter\if_true
+ \else
+ \expandafter\if_false
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+%
+% Like the other conditionals, |\ifnumber| is treated as being true by
+% \package{fontdoc}.
+% \begin{macrocode}
+%<*doc>
+\def\ifnumber#1#2#3\then{%
+ \FD@evaluate@false
+ \generic@if{%
+ $\TypesetIntegerExpression{#1}#2\TypesetIntegerExpression{#3}$%
+ }%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Setting variables}
+% \label{Ssec:Variables}
+%
+% \meta{int}, \meta{str}, and \meta{dim} below are string expressions.
+% \meta{command} can be any control sequence.
+%
+% \DescribeMacro{\setint}
+% \DescribeMacro{\setstr}
+% \DescribeMacro{\setdim}
+% \DescribeMacro{\setcommand}
+% The macros:
+% \begin{quote}
+% |\setint|\marg{int}\marg{integer expression}\\
+% |\setstr|\marg{str}\marg{string}\\
+% |\setdim|\marg{dim}\marg{dimension}\\
+% |\setcommand|\meta{command}\meta{definition}
+% \end{quote}
+% define new macros
+% \describecsfamily{i-\meta{int}}|\i-|\meta{int},
+% \describecsfamily{s-\meta{str}}|\s-|\meta{str},
+% \describecsfamily{d-\meta{dim}}|\d-|\meta{dim}, or
+% \meta{command}.
+%
+% \DescribeMacro{\resetint}
+% \DescribeMacro{\resetstr}
+% \DescribeMacro{\resetdim}
+% \DescribeMacro{\resetcommand}
+% The macros:
+% \begin{quote}
+% |\resetint|\marg{int}\marg{integer expression}\\
+% |\resetstr|\marg{str}\marg{string}\\
+% |\resetdim|\marg{dim}\marg{dimension}\\
+% |\resetcommand|\meta{command}\meta{definition}
+% \end{quote}
+% redefine the macros |\i-|\meta{int}, |\s-|\meta{str}, |\d-|\meta{dim} or
+% \meta{command}.
+%
+% \DescribeMacro{\int}
+% \DescribeMacro{\str}
+% \DescribeMacro{\dim}
+% The macros:
+% \begin{quote}
+% |\int|\marg{int}\\
+% |\str|\marg{str}\\
+% |\dim|\marg{dim}\\
+% \meta{command}
+% \end{quote}
+% return the values of |\i-|\meta{int}, |\s-|\meta{str}, |\d-|\meta{dim},
+% or \meta{command}.
+%
+% \DescribeMacro{\strint}
+% The macro
+% \begin{quote}
+% |\strint|\marg{int}
+% \end{quote}
+% returns the value of |\i-|\meta{int} as a string.
+%
+% \DescribeMacro{\ifisint}
+% \DescribeMacro{\ifisstr}
+% \DescribeMacro{\ifisdim}
+% \DescribeMacro{\ifiscommand}
+% The macros:
+% \begin{quote}
+% |\ifisint|\marg{int}|\then|\\
+% |\ifisstr|\marg{str}|\then|\\
+% |\ifisdim|\marg{dim}|\then|\\
+% |\ifiscommand|\meta{command}|\then|
+% \end{quote}
+% return |\if_true| if |\i-|\meta{int}, |\s-|\meta{str},
+% |\d-|\meta{dim}, or \meta{command} respectively have been defined,
+% and |\if_false| otherwise.
+%
+% \DescribeMacro{\unsetint}
+% \DescribeMacro{\unsetstr}
+% \DescribeMacro{\unsetdim}
+% \DescribeMacro{\unsetcommand}
+% The macros:
+% \begin{quote}
+% |\unsetint|\marg{int}\\
+% |\unsetstr|\marg{str}\\
+% |\unsetdim|\marg{dim}\\
+% |\unsetcommand|\meta{command}
+% \end{quote}
+% undefine |\i-|\meta{int}, |\s-|\meta{str}, |\d-|\meta{dim}, or
+% \meta{command}.
+%
+% \DescribeMacro{\x_setint}
+% \DescribeMacro{\x_resetint}
+% \DescribeMacro{\x_setstr}
+% The macros |\x_setint|, |\x_resetint|, and |\x_setstr| are ``private''
+% versions of |\setint|, |\resetint|, and |\setstr| respectively. They
+% have been included to reduce the problems in case a user turns off one
+% of these commands and forgets to turn it on again.
+%
+% \changes{1.900}{1999/02/07}{Replaced internal \cs{setint},
+% \cs{resetint}, and \cs{setstr} by \cs{x_setint}, \cs{x_resetint},
+% and \cs{x_setstr} respectively, to make the public versions
+% possible to turn off. (LH)}
+%
+% Integers are kept as |\mathchardef|s if possible; a comparision of
+% doing this versus not doing this appears in
+% Subsection~\ref{Ssec: ASAJ tests}.
+%
+% \begin{macro}{\setsomething_global}
+% The |\setsomething_global| control sequence should be either
+% |\relax| or |\global|. It appears before the central assignments in
+% all the |\set|\textellipsis, |\reset|\textellipsis, and
+% |\unset|\textellipsis\ commands. The normal value is |\relax|, so
+% that these assignments are local.
+%
+% When there is counter-intuitive grouping, and it could seem that
+% \TeX\ should not be inside a group at all---i.e., between
+% |\installfonts| and |\endinstallfonts|---one can make the basic
+% assignment commands act more logical by setting
+% |\setsomething_global| to |\global|.
+%
+% \changes{1.912}{2000/01/15}{Control sequence introduced and added
+% to all \cs{set}\dots, \cs{reset}\dots, and \cs{unset}\dots\
+% commands, as well as \cs{offcommand} and \cs{oncommand}. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\let\setsomething_global=\x_relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x_setint}
+% \begin{macro}{\setint}
+% \begin{macro}{\x_setstr}
+% \begin{macro}{\setstr}
+% \begin{macro}{\setdim}
+% \begin{macro}{\setcommand}
+% \changes{1.909}{1999/10/17}{Since \package{fontdoc} adds some
+% grouping, \cs{setcommand} must set its argument globally there.
+% (LH)}
+% \changes{1.912}{2000/01/15}{Settings of a command already defined
+% is diverted to \cs{a_macro}; it used to be \cs{a_command}. Saves
+% one hash table position. (LH)}
+%
+% \begin{macrocode}
+\def\x_setint#1#2{
+ \x_cs\ifx{i-#1}\x_relax
+ \x_resetint{#1}{#2}
+ \fi
+}
+\let\setint=\x_setint
+\def\x_setstr#1#2{
+ \x_cs\ifx{s-#1}\x_relax
+ \setsomething_global\x_cs\edef{s-#1}{#2}
+ \fi
+}
+\let\setstr=\x_setstr
+\def\setdim#1#2{
+ \x_cs\ifx{d-#1}\x_relax
+ \a_dimen=#2\x_relax
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+ \fi
+}
+\def\setcommand#1{
+ \ifx#1\undefined_command
+ \setsomething_global \expandafter\def \expandafter#1
+ \else
+ \expandafter\def \expandafter\a_macro
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+%
+% In \package{fontdoc}, |\setint|, |\setstr|, and |\setdim| print
+% headings. There is no need for the private forms |\x_setint| and
+% |\x_setstr|. |\setcommand|, finally, does the same thing as in
+% \package{fontinst}; the assignment is global because of grouping
+% not present in \package{fontinst}.
+% \begin{macrocode}
+%<*doc>
+\newcommand\setint[2]{%
+ \Bheading{Default} \(\TypesetIntegerExpression{\int{#1}}\) =
+ \(\TypesetIntegerExpression{#2}\)%
+}
+\newcommand\setstr[2]{%
+ \Bheading{Default} \TypesetStringExpression{\str{#1}} =
+ \TypesetStringExpression{#2}%
+}
+\newcommand\setdim[2]{%
+ \a@dimen=#2\relax
+ \Bheading{Default} \TypesetStringExpression{#1} dimen = \the\a@dimen
+}
+\def\setcommand#1{\ifx#1\undefined@command
+ \expandafter\gdef\expandafter#1\else
+ \expandafter\gdef\expandafter\a@command\fi}
+%</doc>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\x_resetint}
+% \begin{macro}{\resetint}
+% \begin{macro}{\resetstr}
+% \begin{macro}{\resetdim}
+% \begin{macro}{\resetcommand}
+% \changes{1.909}{1999/10/17}{Since \package{fontdoc} adds some
+% grouping, \cs{resetcommand} must set its argument globally there.
+% (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\x_resetint#1#2{
+ \eval_expr{#2}
+ \setsomething_global
+ \ifnum\result<\max_mathchardef
+ \ifnum 0>\result
+ \x_cs\edef{i-#1}{\the\result}
+ \else
+ \x_cs\mathchardef{i-#1}=\result
+ \fi
+ \else
+ \x_cs\edef{i-#1}{\the\result}
+ \fi
+}
+\let\resetint=\x_resetint
+\def\resetstr#1#2{\setsomething_global\x_cs\edef{s-#1}{#2}}
+\def\resetdim#1#2{
+ \a_dimen=#2
+ \setsomething_global\x_cs\edef{d-#1}{\the\a_dimen}
+}
+\def\resetcommand#1{\setsomething_global\def#1}
+%</pkg>
+% \end{macrocode}
+%
+% In \package{fontdoc}, |\resetint|, |\resetstr|, and |\resetdim|
+% print headings. There is no need for the private form |\x_resetint|.
+% |\resetcommand|, finally, does the same thing as in
+% \package{fontinst}.
+%
+% \begin{macrocode}
+%<*doc>
+\newcommand\resetint[2]{%
+ \Bheading{Value} \(\TypesetIntegerExpression{\int{#1}}\) =
+ \(\TypesetIntegerExpression{#2}\)%
+}
+\newcommand\resetstr[2]{%
+ \Bheading{Value} \TypesetStringExpression{\str{#1}} =
+ \TypesetStringExpression{#2}%
+}
+\newcommand\resetdim[2]{%
+ \a@dimen=#2\relax
+ \Bheading{Value} \TypesetStringExpression{#1} dimen = \the\a@dimen
+}
+\def\resetcommand#1{\gdef#1}
+%</doc>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\dim}
+% \begin{macrocode}
+%<pkg>\def\dim#1{\csname~d-#1\endcsname}
+% \end{macrocode}
+% \missing{doc}{\dim}
+% \end{macro}
+%
+% \multchanges{\cs{typeset@integer}\cs{typeset@string}^^A
+% \cs{typeset@dimen}}{1.916}{2000/01/02}{Macros removed. (LH)}
+%
+% \begin{macro}{\ifisint}
+% \begin{macro}{\ifisstr}
+% \begin{macro}{\ifisdim}
+% \multchanges{\cs{ifisint}\cs{ifisstr}\cs{ifisdim}}{1.912}
+% {2000/02/10}{Reimplemented using \cs{if_defined}. (LH)}
+% \begin{macro}{\ifiscommand}
+% \begin{macrocode}
+%<*pkg>
+\def\ifisint#1\then{\if_defined i-#1\then}
+\def\ifisstr#1\then{\if_defined s-#1\then}
+\def\ifisdim#1\then{\if_defined d-#1\then}
+\def\ifiscommand#1\then{
+ \ifx#1\undefined_command
+ \expandafter\if_false
+ \else
+ \expandafter\if_true
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+%
+% In \package{fontdoc}, all conditionals are handled through
+% |\generic@if|, which by default expands to |\iftrue|.
+% \changes{1.909}{1999/10/17}{Changed one fontdoc definition of
+% \cs{ifisglyph} to a definition of \cs{ifiscommand}, which was
+% missing from fontdoc.}
+% \begin{macrocode}
+%<*doc>
+\def\ifisint#1\then{%
+ \generic@if{integer $\TypesetIntegerExpression{\int{#1}}$ set}%
+}
+\def\ifisstr#1\then{%
+ \generic@if{string \TypesetStringExpression{#1} set}%
+}
+\def\ifisdim#1\then{%
+ \generic@if{dimension \TypesetStringExpression{#1} set}%
+}
+\def\ifiscommand#1\then{%
+ \generic@if{command \normalfont{\ttfamily\string#1} set}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\unsetint}
+% \begin{macro}{\unsetstr}
+% \begin{macro}{\unsetdim}
+% \begin{macro}{\unsetcommand}
+% \begin{macrocode}
+%<*pkg>
+\def\unsetint#1{\setsomething_global\x_cs\let{i-#1}\x_relax}
+\def\unsetstr#1{\setsomething_global\x_cs\let{s-#1}\x_relax}
+\def\unsetdim#1{\setsomething_global\x_cs\let{d-#1}\x_relax}
+\def\unsetcommand#1{\setsomething_global\let#1=\undefined_command}
+%</pkg>
+% \end{macrocode}
+% \missing{doc}{\unsetint}
+% \missing{doc}{\unsetstr}
+% \missing{doc}{\unsetdim}
+% \missing{doc}{\unsetcommand}
+% \begin{macrocode}
+%<*doc>
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\offcommand}
+% \begin{macro}{\oncommand}
+% \multchanges{\cs{offcommand}\cs{oncommand}}{1.900}{1999/02/07}
+% {Commands added. (LH)}
+% The calls
+% \begin{quote}
+% |\offcommand|\meta{command}\\
+% |\oncommand|\meta{command}
+% \end{quote}
+% can be used to turn a command off (make it simply absorb its
+% arguments but expand to nothing) or on (return it to normal)
+% respectively. Their primary use is for ignoring some of the
+% commands in \texttt{.mtx} files that \package{fontinst} generates
+% from \texttt{.afm}, \texttt{.pl}, or other \texttt{.mtx} files.
+%
+% \describecsfamily{saved-\meta{\textbackslash command}}
+% The normal definition of a command that has been turned off
+% is saved as the control sequence |\saved-|\meta{command}. If the
+% syntax of a command is tricky---not all arguments are read by the
+% base command or its parameter text contains tokens that are not
+% parameters---or if simply making it do nothing is not the expected
+% `off' behaviour, then the automatic off-turning may not work. In such
+% cases a handtooled off definition of the command \meta{command}
+% may be provided as the control sequence |\off-|\meta{command}.^^A
+% \describecsfamily{off-\meta{\textbackslash command}}
+%
+% Nothing happens if |\offcommand| is called for a command that is
+% not on. Nothing happens if |\oncommand| is called for a command
+% that is not off.
+% \begin{macrocode}
+%<*pkg>
+\def\offcommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax
+ \setsomething_global\x_cs\let{saved-\string#1}#1
+ \x_cs\ifx{off-\string#1}\x_relax
+ \generate_off_command{#1}
+ \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname off-\string#1\endcsname
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\oncommand#1{
+ \x_cs\ifx{saved-\string#1}\x_relax \else
+ \setsomething_global \expandafter\let \expandafter#1
+ \csname saved-\string#1\endcsname
+ \setsomething_global\x_cs\let{saved-\string#1}\x_relax
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \multchanges{\cs{offcommand}\cs{oncommand}}{1.914}{2000/05/28}
+% {\package{fontdoc} definitions added. (LH)}
+% \begin{macrocode}
+%<*doc>
+\def\offcommand#1{\Bheading{Turn off} \texttt{\string#1}}
+\def\oncommand#1{\Bheading{Turn on} \texttt{\string#1}}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\generate_off_command}
+% \begin{macro}{\count_hashes}
+% \begin{macro}{\gobble_to_xrelax}
+% |\generate_off_command|\meta{command} converts \meta{command} to
+% an ``off'' version of itself by counting the number of arguments
+% and defining it to gobble that many arguments. It cannot cope with
+% commands whose parameter texts are not simply of the type
+% \begin{quote}
+% |#1#2|\textellipsis|#|$n$
+% \end{quote}
+% \begin{macrocode}
+%<*pkg>
+\def\generate_off_command#1{
+ \a_count=0
+ \let\next=\count_hashes
+ \expandafter\next\meaning#1~->\x_relax
+ \b_count=0
+ \a_toks={}
+ \loop \ifnum \b_count<\a_count
+ \advance \b_count 1
+ \a_toks=\expandafter{\the\expandafter\a_toks \expandafter####
+ \the\b_count}
+ \repeat
+ \setsomething_global \expandafter\def \expandafter#1 \the\a_toks {}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\count_hashes#1#2{
+ \if \hash_char#1
+ \advance \a_count 1
+ \else
+ \if -#1
+ \if >#2
+ \let\next=\gobble_to_xrelax
+ \fi\fi
+ \fi
+ \next#2
+}
+\def\gobble_to_xrelax#1\x_relax{}
+%</pkg>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% Control sequences of the form
+% \begin{quote}
+% \describecsfamily{FD@s-\meta{name}}|\FD@s-|\meta{name}
+% \end{quote}
+% are used by \package{fontdoc} to store the values of string variables
+% which have been assigned values; \meta{name} is the name of the string
+% variable. Unlike the case in \package{fontinst}, the
+% \package{fontdoc} |\setstr| command does not assign values to string
+% variables, but |\SetStringVariable| does.
+%
+% The contents of the |\FD@s-|\meta{name} macros aren't really the
+% string values, but code that will append the printable form of the
+% corresponding string expression to |\toks@| and update other variables
+% used by |\MakePrintable| accordingly. Typically it might look
+% something like
+% \begin{quote}
+% |\toks@=\expandafter{\the\toks@ ab}|
+% \end{quote}
+% when the value of the string is |ab|.
+%
+% \begin{macro}{\SetStringVariable}
+% \changes{1.916}{2001/01/24}{Command added. (LH)}
+% The |\SetStringVariable| command has the syntax
+% \begin{quote}
+% |\SetStringVariable|\marg{variable name}\marg{new value}
+% \end{quote}
+% where \meta{variable name} and \meta{new value} are both string
+% expressions. The \meta{variable name} must furthermore be a simple
+% string expression. The command globally defines the corresponding
+% |\FD@s-|\meta{name} control sequence to add the printable form of
+% the \marg{new value} string to the |\toks@| token list register and,
+% in case the \meta{new value} string is non-simple, sets the |@tempswa|
+% switch to true.
+%
+% The control sequence |\@tempa| can be used as part of \meta{new
+% value}, but not in the \meta{variable name}.
+% \begin{macrocode}
+%<*doc>
+\newcommand\SetStringVariable[2]{%
+ \protected@edef\@tempa{\noexpand\MakePrintable \noexpand\@tempa
+ {FD@swa}{#2}}%
+ \@tempa
+ \protected@edef\@tempa{%
+ \toks@=\noexpand\expandafter{\noexpand\the \toks@ \@tempa}%
+ \ifFD@swa \noexpand\@tempswatrue \fi
+ }%
+ \protected@edef\@tempb{\noexpand\MakePrintable \noexpand\@tempb
+ {FD@swa}{#1}}%
+ \@tempb
+ \ifFD@swa
+ \begingroup
+ \let\PrintChar=\FD@quoted@PrintChar
+ \global\expandafter\let \csname FD@s-\@tempb\endcsname \@tempa
+ \endgroup
+ \else
+ \PackageError{fontdoc}{Names of string variables must be
+ simple\MessageBreak if they are to be assigned values}\@eha
+ \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \subsection{For loops}
+%
+%
+% \begin{macro}{\for}
+% \begin{macro}{\endfor}
+% \multchanges{\cs{for}\cs{endfor}}{1.900}{1999/02/16}{Commands
+% added. (LH)}
+% The command sequence
+% \begin{quote}
+% |\for|\parg{name}\marg{start}\marg{stop}\marg{step}\\
+% \vadjust{}\quad\meta{body code}\\
+% |\endfor|\parg{name}
+% \end{quote}
+% will cause the \meta{body code} to be repeated some number of times.
+% How many depends on the values of \meta{start}, \meta{stop}, and
+% \meta{step}, which are integer expressions.
+%
+% As a precaution, the \meta{body code} is not allowed to contain any
+% empty lines (|\par| tokens). If you want to have the visual
+% separation (for sakes of legibility or otherwise), put a |%|
+% somewhere on the line---that makes it nonempty.
+%
+% \meta{name} is used as the name of an integer variable. This
+% variable gets reset to the value of \meta{start} before the first
+% repetition of \meta{body code}. After each repetition but the last,
+% it is incremented by \meta{step}. \meta{body code} gets repeated if
+% the value of \meta{name} has not gotten past that of \meta{stop}. To
+% get past means to be bigger if \meta{step} is positive and to be
+% smaller if \meta{step} is negative. In the case that \meta{step} is
+% zero, the entire construction above will be equivalent to
+% \begin{quote}
+% |\resetint|\marg{name}\marg{start}\\
+% \meta{body code}
+% \end{quote}
+%
+% |\for| \textellipsis\ |\endfor| constructions can be nested.
+% \meta{name} is used by |\for| to identify its matching |\endfor|, so
+% they need to be identical in |\for| and |\endfor|.
+%
+% \multchanges{\cs{for}\cs{for_i}\cs{foreach}}{1.914}{2000/05/21}
+% {\cs{setsomething_global} added to assignments of the
+% \cs{for-\meta{name}} and \cs{body-\meta{name}} control
+% sequences. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\for(#1)#2#3#4{
+ \eval_expr_to\a_count{#2}
+ \x_resetint{#1}{\a_count}
+ \eval_expr{#4}
+ \ifnum 0=\result \else
+ \c_count=\result
+ \eval_expr_to\b_count{#3}
+ \setsomething_global\x_cs\edef{for-#1}{
+ \the\c_count \x_relax
+ \noexpand\ifnum \gobble_one\fi
+ \the\b_count \ifnum 0>\c_count > \else < \fi
+ }
+ \def\next##1##2##3\endfor(#1){##2\for_i{##1}{##3}}
+ \next{#1}
+ \fi
+}
+% \end{macrocode}
+%
+% The macro \describecsfamily{for-\meta{name}}|\for-|\meta{name}
+% will contain
+% \begin{quote}
+% \meta{step}|\x_relax\ifnum|\meta{stop}\meta{rel}
+% \end{quote}
+% \meta{step} is the value of the \meta{step} parameter of |\for|,
+% computed when the loop was entered and now expressed in digits.
+% \meta{stop} is likewise for the \meta{stop} parameter. \meta{rel}
+% is |>| or |<|, depending on whether \meta{step} is positive or
+% negative respectively. The reason for this curious definition will
+% be appearent in the light of the definition of |\for_ii|.
+%
+% |\for_i| is expanded in the context
+% \begin{quote}
+% |\for_i|\marg{name}\marg{body code}
+% \end{quote}
+% Also remember, when reading the definition below, that |\ifnum|
+% keeps on expanding tokens until it has found a
+% \begin{quote}
+% \meta{number}\meta{relation}\meta{number}
+% \end{quote}
+% structure. It is therefore possible to nest |\ifnum|s like this!
+%
+% \begin{macrocode}
+\def\for_i#1#2{
+ \setsomething_global\x_cs\def{body-#1}{#2}
+ \ifnum \b_count \ifnum0>\c_count >\else<\fi \a_count
+ \expandafter\gobble_two
+ \else
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+% \end{macrocode}
+%
+% The macro \describecsfamily{body-\meta{name}}|\body-|\meta{name}
+% expands to the \meta{body code}.
+%
+% |\for_ii| executes the following code:
+% \begin{quote}
+% |\a_count=\int|\marg{name}\\
+% |\advance \a_count |\meta{step}|\x_relax|\\
+% |\ifnum |\meta{stop}\meta{rel}|\a_count|\\
+% | \expandafter\gobble_two|\\
+% |\else|\\
+% | \resetint|\marg{name}|\a_count|\\
+% | \csname body-|\meta{name}| \expandafter\endcsname|\\
+% |\fi|\\
+% |\for_ii|\marg{name}
+% \end{quote}
+% \meta{step}, \meta{stop}, and \meta{rel} are in |\for-|\meta{name},
+% and since there only are two other tokens between \meta{step} and
+% \meta{rel} in the above, one might as well include them in
+% |\for-|\meta{name} as well. Doing that requires that a matching
+% hole---that will be filled in by |\for-|\meta{name}---is made in the
+% definition of |\for_ii| and that is the reason for its somewhat
+% curious definition.
+%
+% \begin{macrocode}
+\def\for_ii#1{
+ \a_count=\int{#1}
+ \advance \a_count \csname for-#1\endcsname \a_count
+ \expandafter\gobble_two
+ \else
+ \x_resetint{#1}\a_count
+ \csname body-#1 \expandafter\endcsname
+ \fi
+ \for_ii{#1}
+}
+% \end{macrocode}
+%
+% |\endfor| just gobbles its argument, so that the \meta{step}${}=0$
+% case will work right.
+%
+% \begin{macrocode}
+\def\endfor(#1){}
+%</pkg>
+% \end{macrocode}
+% \missing{doc}{\for}
+% \missing{doc}{\endfor}
+% \begin{macrocode}
+%<*doc>
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\foreach}
+% \changes{1.901}{1999/03/07}{Command added. (LH)}
+% \changes{1.916}{2001/01/24}{\package{fontdoc} definition added. (LH)}
+% \begin{macro}{\foreach_i}
+% The command sequence
+% \begin{quote}
+% |\foreach|\parg{name}\marg{csep-list}\\
+% \vadjust{}\quad\meta{body code}\\
+% |\endfor|\parg{name}
+% \end{quote}
+% will cause the \meta{body code} to be repeated one time for each item
+% in the \meta{csep-list}. \meta{csep-list} is a comma-separated list
+% of strings.
+%
+% As a precaution, the \meta{body code} is not allowed to contain any
+% empty lines (|\par| tokens). If you want to have the visual
+% separation (for sakes of legibility or otherwise), put a |%|
+% somewhere on the line---that makes it nonempty.
+%
+% \meta{name} is used as the name of a string variable. Before each
+% repetition of the \meta{body code}, this variable will get reset to
+% the next item in the \meta{csep-list}.
+%
+% |\foreach|\textellipsis\ |\endfor| constructions can be nested.
+% \meta{name} is used by |\foreach| to identify its matching |\endfor|,
+% so they need to be identical in |\foreach| and |\endfor|.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\foreach(#1)#2{
+ \def\next##1\endfor(#1){
+ \setsomething_global\x_cs\def{body-#1}{##1}
+ \process_csep_list{\foreach_i{#1}}#2,\process_csep_list,
+ }
+ \next
+}
+\def\foreach_i#1#2{
+ \resetstr{#1}{#2}
+ \csname body-#1\endcsname
+}
+%</pkg>
+%<*doc>
+\def\foreach(#1)#2{%
+ \def\next##1\endfor(#1){%
+ \@for\@tempa:=#2\do{%
+ \SetStringVariable{#1}{\@tempa}%
+ ##1%
+ }%
+ }%
+ \next
+}
+%</doc>
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+%
+% \subsection{Comments}
+%
+% \changes{1.911}{1999/11/30}{Comment commands included in
+% \texttt{finstmsc.sty}. (LH)}
+%
+% \begin{macro}{\comment}
+% In \package{fontinst}, |\comment| simply gobbles its argument.
+% \begin{macrocode}
+%<pkg>\let\comment=\gobble_one
+% \end{macrocode}
+%
+% In \package{fontdoc}, |\comment| starts a new text paragraph and
+% leaves the argument to be typeset. Note that the argument group
+% thus survives; some commands make use of this fact.
+% \begin{macrocode}
+%<*doc>
+\def\comment{\par\noindent}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\begincomment}
+% \changes{1.900}{1999/02/07}{Command added. (LH)}
+% \begin{macro}{\endcomment}
+% \changes{1.900}{1999/02/07}{Command added. (LH)}
+% Since |\comment| cannot be used for a comment longer than one
+% paragraph, we also provide the means of introducing longer comments,
+% by writing
+% \begin{quote}
+% |\begincomment| \meta{any amount of text} |\endcomment|
+% \end{quote}
+% The names are admittedly not nice from a \LaTeX\ point of view, but
+% it is hardly worth the cost to implement some kind of environment
+% processing in \package{fontinst}, just for the sake of this command.
+% \begin{macrocode}
+%<pkg>\let\begincomment=\iffalse
+%<doc>\let\begincomment=\iftrue
+%<pkg|doc>\let\endcomment=\fi
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \Finale
+%
+\endinput
diff --git a/fonts/utilities/fontinst/source/ficonv.dtx b/fonts/utilities/fontinst/source/ficonv.dtx
new file mode 100644
index 0000000000..4281142ea1
--- /dev/null
+++ b/fonts/utilities/fontinst/source/ficonv.dtx
@@ -0,0 +1,3169 @@
+% \CheckSum{2502}
+% \iffalse meta-comment
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2000 the fontinst maintenance team and any
+% individual authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+%%% From file: ficonv.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth, Lars Hellstr\"om}
+\begin{document}
+\maketitle
+\tableofcontents
+\DocInput{ficonv.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \StopEventually{}
+%
+% \section{Basic file format conversions}
+% \label{Sec:Conv. input}
+% \changes{1.902}{1999/05/01}{Collected the material in Section
+% \thesection\space and moved it to \texttt{ficonv.dtx}. (LH)}
+% \changes{1.926}{2003/07/12}{Added some missing \textasciitilde's
+% at ends of lines. (LH)}
+%
+% \subsection{Converting an ENC file to an ETX file}
+%
+% \DescribeMacro{\enctoetx}
+% The macro
+% \begin{quote}
+% |\enctoetx|\marg{encfile}\marg{etxfile}
+% \end{quote}
+% reads \meta{encfile}|.enc| and writes the same information to
+% \meta{etxfile}|.etx|, in a format \TeX{} can read more easily.
+%
+%
+% \begin{macrocode}
+%<*misc>
+\newif\ifmissingslots
+\x_cs\def{o-.notdef}#1{\global\missingslotstrue}
+% \end{macrocode}
+%
+% \begin{macro}{\enctoetx}
+% For every |/|\meta{glyph} command, the command |\o-|\meta{glyph}
+% gets passed code which writes the corresponding
+% |\setslot|\marg{glyph} \textellipsis\ |\endslot| statement.
+% Normally that constrol sequence is undefined, hence equivalent to
+% |\relax|, and thus the code gets executed. However |\o-.notdef| will
+% instead gobble this argument and set |missingslots| to true.
+% \begin{macrocode}
+{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \gdef\enctoetx#1#2{{
+ \catcode`\/=\active
+ \catcode`\]=\active
+ \def/##1[{
+ \encname_to_etx ##1~{#1}{#2}
+ \a_count=0
+ \global\missingslotsfalse
+ \let/=\encslot_to_etx
+ }
+ \def]~def{}
+ \make_etx{#1}{#2}
+ }}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\encname_to_etx}
+% This macro recieves the encoding vector name, the ENC file name,
+% and the ETX file name when converting an ENC file to an ETX file.
+% The call syntax is
+% \begin{quote}
+% |\encname_to_etx|\meta{vectorname}\textvisiblespace
+% \marg{enc}\marg{etx}
+% \end{quote}
+% (making the first argument space-delimited but the second
+% undelimited is a trick to gobble any space that may be present at
+% the end of that which the caller thinks is the vector name).
+%
+% The command outputs a |\declarepsencoding| command to the
+% generated ETX file.
+% \changes{1.931}{2005/05/13}{Macro added, to support caching
+% original ENC names in autogenerated ETX files. (LH)
+% Thanks to Alexej Kryukov for the inspiration for this.}
+% \begin{macrocode}
+\def\encname_to_etx#1~#2#3{
+ \out_line{\percent_char\space REMOVE~THE~FOLLOWING~LINE~IF~
+ THIS~FILE~IS~MODIFIED~OR~RENAMED.}
+ \out_line{\string\declarepsencoding{#3}{#1}{\string\download{#2.enc}}}
+ \out_line{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\encslot_to_etx}
+% This macro grabs everything up to the next space and writes a
+% |\setslot| entry with the grabbed material as glyph name. It is
+% used as the definition of |/| (active character) when parsing
+% elements of an encoding vector.
+% \changes{1.931}{2005/05/13}{Macro added (separated from
+% \cs{enctoetx}). (LH)}
+% \begin{macrocode}
+\def\encslot_to_etx#1~{
+ \csname o-#1\endcsname{
+ \ifmissingslots
+ \out_line{\string\nextslot{\the\a_count}}
+ \fi
+ \global\missingslotsfalse
+ \out_line{\string\setslot{#1}}
+ \out_line{\string\endsetslot}
+ \out_line{}
+ }
+ \advance\a_count by 1
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\make_etx}
+% |\make_etx| does the stuff that |\enctoetx| does not; it handles
+% writing the preamble and postamble of the ETX file, but also does
+% the actual |\input| of the ENC file to convert.
+% \changes{1.931}{2005/05/13}{Now requiring a particular
+% \package{fontdoc} version. (LH)}
+% \begin{macrocode}
+\def\make_etx#1#2{
+ \open_out{\temp_prefix#2.etx}
+ \out_line{\percent_char~Filename:~#2.etx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\enctoetx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.enc~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{}
+ \out_line{\string\documentclass[twocolumn]{article}}
+ \out_line{\string\usepackage{fontdoc}[2005/05/13]}
+ \out_line{}
+ \out_line{\string\begin{document}}
+ \out_line{}
+ \out_line{This~document~describes~the~#1~encoding.}
+ \out_line{It~was~automatically~generated~by~the}
+ \out_line{\string\texttt{fontinst}~package.}
+ \out_line{}
+ \out_line{\string\encoding}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \primitiveinput #1.enc\x_relax
+ \out_line{}
+ \out_line{\string\end encoding}
+ \out_line{}
+ \out_line{\string\end{document}}
+ \close_out{Encoding}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Converting an ETX file to an ENC file}
+% \changes{1.911}{1999/11/21}{ETX to ENC converter added. (LH)}
+%
+% \DescribeMacro{\etxtoenc}
+% The command
+% \begin{quote}
+% |\etxtoenc|\marg{etxfile}\marg{encfile}
+% \end{quote}
+% reads \meta{etxfile}|.etx| and generates a postscript encoding file
+% \meta{encfile}|.enc| that specifies the same encoding vector.
+%
+%
+% \begin{macro}{\notdef_name}
+% This macro holds the name of the \texttt{.notdef} glyph, which must
+% be put in all encoding positions where there is no other glyph.
+% \begin{macrocode}
+\def\notdef_name{.notdef}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\etxtoenc}
+% The conversion has three steps. First the \texttt{.notdef} glyph is
+% assigned to every slot in the encoding, then the ETX file is read
+% and the assignments are changed for the slots which are not
+% unassigned in the encoding, and finally the ENC file is written.
+% The first two steps are carried out by |\etxtoenc|, but the final
+% step is handled by |\make_enc|.
+% \changes{1.927}{2004/07/12}{Made the \meta{etxfile} argument a
+% comma-separated list of ETX files. Changed \cs{do_slot} definition
+% to get set rather than reset semantics. (LH) Feature requested
+% by Werner Lemberg.}
+% \begin{macrocode}
+\def\etxtoenc#1#2{\begingroup
+ \a_count=\z@
+ \loop
+ \x_cs\let{name-\the\a_count}=\notdef_name
+ \ifnum \@cclv>\a_count
+ \advance \a_count \@ne
+ \repeat
+ \def\do_slot{
+ \x_cs\ifx{name-\the\slot_number}\notdef_name
+ \x_cs\edef{name-\the\slot_number}{\slot_name}
+ \fi
+ }
+ \process_csep_list\inputetx #1,\process_csep_list,
+ \make_enc{#1}{#2}
+\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\make_enc}
+% The command
+% \begin{quote}
+% |\make_enc|\marg{etxfiles}\marg{encfile}
+% \end{quote}
+% creates the file \meta{encfile}|.enc| and writes to that file the
+% definition of the postscript encoding vector which corresponds to
+% the encoding currently stored in the |\name-|\meta{slot} family of
+% macros. That encoding is assumed to be defined by the files listed
+% in the \meta{etxfiles}.
+%
+% \changes{1.911}{1999/12/02}{Storing encoding name in string
+% \texttt{encodingname}, thus allowing the ETX file to override
+% the default. (LH)}
+% \changes{1.912}{2000/02/12}{Also calling \cs{declarepsencoding}
+% once the encoding file has been written. (LH)}
+% \changes{1.914}{2000/05/14}{Not writing an \texttt{address} entry
+% if that string isn't set. (LH)}
+% \changes{1.919}{2001/08/02}{Added DSC comments. (LH)}
+% \changes{1.927}{2004/07/12}{Modified to handle a comma-separated
+% list of ETX files. (LH)}
+% \begin{macrocode}
+\def\make_enc#1#2{
+ \setstr{encodingname}{fontinst-autoenc-#1}
+ \def\a_macro##1{
+ \add_to\b_macro{##1.etx}
+ \def\a_macro####1{
+ \add_to\b_macro{,~####1.etx}
+ }
+ }
+ \let\b_macro\empty_command
+ \process_csep_list\a_macro #1,\process_csep_list,
+ \open_out{#2.enc}
+ \out_line{\percent_char !PS-Adobe-3.0~Resource-Encoding}
+ \out_line{\percent_char\space @psencodingfile\left_brace_char}
+ \ref_to_sourcefile{author}\b_macro
+ \ref_to_sourcefile{version}\b_macro
+ \out_line{\percent_char\four_spaces date~=~"generated~
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day",}
+ \out_line{\percent_char\four_spaces filename~=~"\out_filename",}
+ \ref_to_sourcefile{email}\b_macro
+ \ifisstr{address}\then
+ \out_line{\percent_char\four_spaces address~=~\str{address}}
+ \fi
+ \out_line{\percent_char\four_spaces codetable~=~"ISO/ASCII",}
+ \out_line{\percent_char\four_spaces checksum~=~"",}
+ \out_line{\percent_char\four_spaces abstract~=~"
+ This~is~a~postscript~encoding~file,~automatically~
+ generated~by~fontinst~from~\b_macro."}
+ \out_line{\percent_char\space\right_brace_char}
+ \out_line{}
+ \out_line{\percent_char\space Created~by:~tex~\jobname}
+ \out_line{\percent_char\space Created~using:~
+ \string\etxtoenc{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char\space This~file~should~be~installed~
+ somewhere~that~your~DVI}
+ \out_line{\percent_char\space to~postscript~driver~looks~for~files.~
+ It~is~needed~for}
+ \out_line{\percent_char\space reencoding~some~font~you~have~
+ transformed.}
+ \out_line{}
+ \out_line{\percent_char\space After~installing~this~file,~you~
+ should~add~the~following}
+ \out_line{\percent_char\space line~(minus~\percent_char)~
+ to~your~finstmsc.rc~file:}
+ \out_line{\percent_char\space\string\declarepsencoding
+ {#1}{\str{encodingname}}{\string\download{\out_filename}}}
+ \edef\a_macro{
+ \noexpand\declarepsencoding{#1}{\str{encodingname}}
+ {\noexpand\download{\out_filename}}
+ }
+ \a_macro
+ \out_line{}
+ \out_line{\percent_char\percent_char BeginResource:~
+ encoding~\str{encodingname}}
+ \out_line{/\str{encodingname}\space[}
+ \b_count=8
+ \a_count=\z@
+ \loop
+ \ifnum 8=\b_count
+ \b_count=\z@
+ \out_line{\percent_char\space\the\a_count}
+ \fi
+ \out_line{/\csname name-\the\a_count \endcsname}
+ \ifnum \@cclv>\a_count
+ \advance \a_count \@ne
+ \advance \b_count \@ne
+ \repeat
+ \out_line{]~def}
+ \out_line{\percent_char\percent_char EndResource}
+ \out_line{}
+ \out_line{\percent_char\space End~of~file~\out_filename.}
+ \close_out{Encoding~vector}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref_to_sourcefile}
+% The command
+% \begin{quote}
+% |\ref_to_sourcefile|\marg{field}\marg{sourcefile}
+% \end{quote}
+% writes a \meta{field} field of a \BibTeX-style header to the
+% current main output file. If the string named \meta{field} is set
+% then the value for this field will be that string, and if it isn't
+% set then the value will be the string \texttt{"See file }^^A
+% \meta{sourcefile}\texttt{"}. Note that the string \#1 is not
+% quoted, so it must contain the quotes if it isn't simply an integer.
+% \begin{macrocode}
+\def\ref_to_sourcefile#1#2{
+ \ifisstr{#1}\then
+ \out_line{\percent_char\four_spaces #1~=~\str{#1},}
+ \else
+ \out_line{\percent_char\four_spaces #1~=~"See~file~#2",}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Converting an ETX file to CMAP file}
+% \changes{1.928}{2004/11/28}{ETX to CMAP converter added. (LH)}
+%
+% \DescribeMacro{\etxtocmap}
+% The command
+% \begin{quote}
+% |\etxtocmap|\marg{etxfile}\marg{cmapfile}
+% \end{quote}
+% reads \meta{etxfile}|.etx| and generates a ToUnicode CMap file
+% \meta{cmapfile}|.cmap| that maps slots to Unicode strings as
+% specified by the \meta{etxfile}.
+%
+% \begin{macro}{\write_cmap_body}
+% The |\write_cmap_body| command writes the actual CMap
+% data\footnote{As opposed to silly stuff that is requested by the
+% file format specification but probably isn't of any use for
+% anything, which is written by \cs{ref_to_sourcefile}.} to the
+% current output file. The syntax is
+% \begin{quote}
+% |\write_cmap_body|\marg{etxfile}
+% \end{quote}
+%
+% More precisely, what this command writes is the codespace range
+% specification and the mappings. The latter are all encoded using
+% \texttt{bfchar} operators.
+% \begin{macrocode}
+\def\write_cmap_body#1{
+ \out_line{1~begincodespacerange~<00>~<FF>~endcodespacerange}
+ \let\do_slot=\_a_true
+ \def\Unicode##1##2{\cmap_charseq{\cmap_codepoint{##1}{##2}}}
+ \let\charseq=\cmap_charseq
+ \inputetx{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\cmap_codepoint}
+% This is what |\Unicode| is inside a |\charseq|. It appends a
+% UTF-16BE character in hexadecimal notation (either four hex
+% digits for a character in the BMP, or eight hex digits for
+% a surrogate pair) to |\a_macro|, and also appends a space for
+% grouping the digits for easier reading.
+% \changes{1.928}{2004/12/05}{Added \cs{uppercase} to ensure case
+% independence. (LH)}
+% \begin{macrocode}
+\def\cmap_codepoint#1#2{
+ \uppercase{\a_count="#1\x_relax}
+ \ifnum "10000>\a_count
+ \format_hex\b_macro{\a_count}{4}
+ \edef\a_macro{\a_macro \b_macro \space}
+ \else
+ \advance \a_count -"10000
+ \d_count=\a_count
+ \divide \a_count "400
+ \b_count=\a_count
+ \multiply \b_count "400
+ \advance \d_count -\b_count
+ \advance \a_count "D800
+ \advance \d_count "DC00~
+ \format_hex\b_macro{\a_count}{4}
+ \format_hex\c_macro{\d_count}{4}
+ \edef\a_macro{\a_macro \b_macro \c_macro \space}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cmap_charseq}
+% This macro is what |\charseq| is when generating a CMap; all
+% writing of CMap entries is routed through it. Only the first
+% character equivalent of each slot should get written to file, so
+% the |_a_| switch is used for keeping track of whether this would be
+% the first.
+%
+% \begin{macrocode}
+\def\cmap_charseq#1{%
+ \if_a_
+ \bgroup
+ \let\Unicode=\cmap_codepoint
+ \let\a_macro=\empty_command
+ #1
+ \format_hex\b_macro{\slot_number}{2}
+ \out_line{1~beginbfchar~<\b_macro>~<~\a_macro>~endbfchar}
+ \egroup
+ \_a_false
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\etxtocmap}
+% As usual for macros with this kind of name, this is the user
+% level command to call to generate a CMAP from an ETX. The
+% arguments are file names (not including extensions).
+% \begin{macrocode}
+\def\etxtocmap#1#2{\begingroup
+ \inputetx{#1}
+ \open_out{#2.cmap}
+ \out_line{\percent_char !PS-Adobe-3.0~Resource-CMap}
+ \out_line{\percent_char\percent_char
+ DocumentNeededResources:~procset~CIDInit}
+ \out_line{\percent_char\percent_char
+ IncludeResource:~procset~CIDInit}
+% \end{macrocode}
+% Here comes the first problem: the CMap must have a name. If the ETX
+% file sets the string variable \texttt{cmapname} then that is used
+% as name, but otherwise |fontinst-|\meta{cmapfile} is used as name.
+% Note that this is different from the pattern in |\etxtoenc|, which
+% instead uses the \meta{etxname}.
+% \begin{macrocode}
+ \setstr{cmapname}{fontinst-#2}
+ \out_line{\percent_char\percent_char
+ BeginResource:~CMap~\str{cmapname}}
+% \end{macrocode}
+% The next problem is whether one should bother with the quite
+% extensive version control junk that Adobe has specified. I prefer
+% not to, because it is very much geared towards using CMaps with
+% CIDFonts, which is not the case here.
+%
+% Thus it is time for the actual PS code.
+% \begin{macrocode}
+ \out_line{/CIDInit~/ProcSet~findresource~begin}
+ \out_line{7~dict~begin}
+ \out_line{begincmap}
+ \out_line{/CMapName~/\str{cmapname}~def}
+ \out_line{/CMapType~2~def}
+ \write_cmap_body{#1}
+ \out_line{endcmap}
+ \out_line{CMapName~currentdict~/CMap~defineresource~pop}
+ \out_line{end}
+ \out_line{end}
+ \out_line{\percent_char\percent_char EndResource}
+ \out_line{\percent_char\percent_char EOF}
+ \close_out{ToUnicode~CMap}
+\endgroup}
+%</misc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \subsection{Converting an AFM file to an MTX file}
+%
+% \DescribeMacro{\afmtomtx}
+% The macro
+% \begin{quote}
+% |\afmtomtx|\marg{afmfile}\marg{mtxfile}
+% \end{quote}
+% reads \meta{afmfile}|.afm|, and writes the same information out to
+% \meta{mtxfile}|.mtx|.
+%
+% \begin{macro}{\afmtomtx}
+% \changes{1.911}{1999/11/18}{Changed setting of \cs{raw_font_name}
+% to \cs{edef} and added setting of \cs{source_font_name}. (LH)}
+% \changes{1.917}{2001/03/13}{Added resetting of
+% \cs{setsomething_global}---assignments made here must be
+% local. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\afmtomtx#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \edef\source_font_name{#1}
+ \x_resetint{italicslant}{0}
+ \let\italcorr_expression=\uprightitalcorr
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.afm~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \catcode`\^^M=12
+ \catcode`\ =10
+ \expandafter\afm_line\primitiveinput #1.afm\x_relax
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% Kerns below this value are ignored.
+%
+% \begin{macrocode}
+\newcount\minimum_kern
+% \end{macrocode}
+%
+%
+% \begin{macro}{\afm_length}
+% \changes{1.900}{1998/12/28}{Macro added, other macros modified to
+% use it. (LH)}
+% \begin{macro}{\afm_unit_dimen}
+% The call |\afm_length|\meta{count}\marg{real}
+% interprets the \meta{real} as a real number, rounds it to the
+% nearest integer, and sets the \meta{count} (a |\count| register)
+% to that integer. In this process, |\a_dimen| is used as a temporary
+% storage.
+% \begin{macrocode}
+\def\afm_length#1#2{
+ \a_dimen=#2\afm_unit_dimen
+ #1=\a_dimen
+ \divide #1 by \afm_unit_dimen
+ \advance \a_dimen by -#1\afm_unit_dimen
+ \ifdim \a_dimen>0.5\afm_unit_dimen
+ \advance #1 by 1
+ \else \ifdim \a_dimen<-0.5\afm_unit_dimen
+ \advance #1 by -1
+ \fi\fi
+ \x_relax
+}
+% \end{macrocode}
+% The dimen |\afm_unit_dimen| is used to keep track of how long an AFM
+% unit is interpreted as being in this routine. Lowering its value
+% makes |\afm_length| capable of handling greater lengths but looses
+% some very slight precision in the rounding, increasing the value
+% has the opposite effects. The current value of 1000\thinspace sp
+% means it reads lengths with three decimals accuracy (not very much
+% use for them though as the number is rounded to zero decimals
+% accuracy anyway, but it does make a difference when deciding how
+% a \meta{real} like |0.502| should be rounded) and can handle lengths
+% of an absolute value of a good million AFM units. This should be
+% adequate in most cases. It is, by the way, probably wisest to keep
+% it a power of ten scaled points in all cases, as this should reduce
+% the rounding errors caused by various base conversions.
+% \begin{macrocode}
+\newdimen\afm_unit_dimen
+\afm_unit_dimen=1000sp
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% The command |\afm_line| reads to the end of the line, calls
+% |\afm_command| on that line, then calls |\afm_line| again.
+%
+% \begin{macrocode}
+{\catcode`\^^M=12 \gdef\afm_line#1
+{\afm_command#1~\end_of_line\afm_line}}
+% \end{macrocode}
+%
+% The command |\afm_command| reads the first word \meta{FOO}, and
+% calls |\afm-|\meta{FOO}\describecsfamily{afm-\meta{key}}. If this
+% does not exist, then |\gobble_one_line| will
+% eat up the rest of the line.
+%
+% \begin{macrocode}
+\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line}
+\def\gobble_one_line#1\end_of_line{}
+% \end{macrocode}
+%
+% This all stops when we reach the command |EndFontMetrics|.
+%
+% \begin{macrocode}
+\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput}
+% \end{macrocode}
+%
+% \begin{macro}{\afm_def}
+% To define an AFM command, you say |\afm_def|\marg{command}^^A
+% \parg{pattern}\marg{result}
+% \begin{macrocode}
+\def\afm_def#1(#2)#3{
+ \x_cs\def{afm-#1}\gobble_one_line#2\end_of_line{#3}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\afm_let}
+% Saying |\afm_let|\marg{dest-command}\marg{source-command} copies
+% the definition of one AFM command to another.
+% \begin{macrocode}
+\def\afm_let#1#2{
+ \expandafter\let \csname afm-#1\expandafter\endcsname
+ \csname afm-#2\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% For example, we can define the following AFM commands:
+% \changes{1.6}{1997/02/07}{AFM commands fixed, to get fontdimens
+% comparable to EC fonts. (Thierry Bouche)}
+% ^^A (Fixed by Thierry Bouche
+% ^^A 1997/02/07, to get fontdimens comparable to EC fonts.)
+% \changes{1.912}{2000/02/20}{AFM command \texttt{StdVW} now
+% interpreted: generates \cs{setint} for integer
+% \texttt{verticalstem}. (LH)}
+%
+% \begin{macrocode}
+\afm_def{CharWidth}(#1){\afm_length\char_x_width{#1}}
+\afm_def{ItalicAngle}(#1~){\calculate_it_slant{#1}}
+\afm_def{XHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{xheight}{\the\a_count}}}
+\afm_def{CapHeight}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{capheight}{\the\a_count}}}
+\afm_def{Ascender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{ascender}{\the\a_count}}}
+\afm_def{Descender}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{descender_neg}{\the\a_count}}}
+\afm_def{UnderlineThickness}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{underlinethickness}{\the\a_count}}}
+\afm_def{FontBBox}(#1~#2~#3~#4){
+ \afm_length\a_count{#4}
+ \out_line{\string\setint{maxheight}{\the\a_count}}
+ \afm_length\a_count{#2}
+ \out_line{\string\setint{maxdepth_neg}{\the\a_count}}}
+\afm_def{StdVW}(#1){
+ \afm_length\a_count{#1}
+ \out_line{\string\setint{verticalstem}{\the\a_count}}}
+\afm_def{IsFixedPitch}(#1){
+ \if\first_char#1=f
+ \else\out_line{\string\setint{monowidth}{1}}
+ \fi
+}
+% \end{macrocode}
+%
+% \multchanges{\cs{afm_font_name}}{1.901}{1999/03/06}{Macro added. (LH)}
+% \multchanges{\cs{afm_font_name}}{1.911}{1999/11/18}{Macro removed,
+% since no longer needed. (LH)}
+%
+% \begin{macro}{\afm-FontName}
+% The |FontName| of a font is needed for the |\storemapdata| command,
+% so it is when that is encountered that this is written. This
+% information is of no use when making TFMs and VFs, but it is likely
+% to be of use for generation of map files, so it will be included in
+% a file of recorded transforms, if such a file is being generated.
+% \begin{macrocode}
+\afm_def{FontName}(#1~){
+ \record_transform{\raw_font_name}
+ {\string\fromafm{\source_font_name}{#1}}{}\iftrue
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\afm-KPX}
+% \begin{macro}{\afm-KP}
+% Processing kern pairs. If one of the glyph name starts with
+% a dot as in |.notdef| or |.null| the kern pair is ignored.
+% The pair is also ignored if the absolute value of the kern
+% amount is |\minimum_kern| or less.
+%
+% That \texttt{KPX} can have the same definition as \texttt{KP} is
+% due to an edge case in the processing of AFM lines: |\afm_line|
+% inserts an extra space at the end of a line. For \texttt{KPX}
+% which really only has three arguments this extra space matches
+% the space in |#3~#4|, whereas for \texttt{KP} which has four
+% arguments this extra space appears at the end of |#4|.
+%
+% \begin{macrocode}
+\afm_def{KP}(#1~#2~#3~#4){
+ \if\first_char#1=.\else
+ \if\first_char#2=.\else
+ \afm_length\a_count{#3}
+ \ifnum \a_count>\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \else\ifnum \a_count<-\minimum_kern
+ \afm_write_setkern{#1}{#2}{\the\a_count}
+ \fi\fi
+ \fi\fi
+}
+\afm_let{KPX}{KP}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\afm_write_setkern}
+% This macro is a hook for the auto-aliasing mechanism to redefine.
+% In this plain form, it just outputs a |\setkern| command with the
+% given three arguments.
+% \changes{1.933}{2007/01/23}{Macro added. (LH)}
+% \begin{macrocode}
+\def\afm_write_setkern#1#2#3{\out_line{\string\setkern{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+%
+% Processing char metrics.
+%
+% \begin{macrocode}
+\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char}
+% \end{macrocode}
+%
+% \begin{macro}{\afm-CH}
+% The |CH| keyword is like |C|, but signals that the following
+% character code is given in hexadecimal.
+% \changes{1.933}{2007/01/22}{Proper definition, that parses the
+% following hexadecimal value. (LH) Since noone has complained
+% about this before, it's probably not very common.}
+% \begin{macrocode}
+\afm_def{CH}(<#1>~;#2){\uppercase{\init_afm{"#1}}\do_list[#2]\afm_char}
+% \end{macrocode}
+% \end{macro}
+%
+% Processing composite chars.
+%
+% \begin{macrocode}
+\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char}
+% \end{macrocode}
+%
+% When parsing a character, we set the values of the following
+% variables:
+%
+% \begin{macrocode}
+\newcount\char_slot
+\newcount\char_x_width
+\newcount\x_width
+\newcount\bbox_llx
+\newcount\bbox_lly
+\newcount\bbox_urx
+\newcount\bbox_ury
+\let\char_name=\empty_command
+% \end{macrocode}
+%
+% \begin{macro}{\init_afm}
+% |\init_afm| initializes the variables the AFM character list
+% writes to.
+% \begin{macrocode}
+\def\init_afm#1{
+ \char_slot=#1\x_relax
+ \x_width=\char_x_width
+ \bbox_llx=0
+ \bbox_lly=0
+ \bbox_urx=0
+ \bbox_ury=0
+ \let\char_name=\empty_command
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\afm_char}
+% This command is executed at the end of processing a \texttt{C}
+% (or \texttt{CH}) line. It outputs the corresponding
+% |\setrawglyph| or |\setnotglyph| command, based on information
+% stored into registers when processing that line.
+% \changes{1.933}{2007/01/23}{Negating \cs{bbox_lly} using
+% \cs{number} instead of an assignment to \cs{a_count}. (LH)}
+% \begin{macrocode}
+\def\afm_char{
+ \eval_expr{
+ \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury
+ }
+ \out_line{
+ \ifnum -1<\char_slot
+ \string\setrawglyph
+ \else
+ \string\setnotglyph
+ \fi
+ {\char_name}
+ {\raw_font_name}
+ {10pt}
+ {\the\char_slot}
+ {\the\x_width}
+ {\the\bbox_ury}
+ {\number -\bbox_lly}
+ {\the\result}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% |\init_cc| and |\cc_char| write out a composite character glyph.
+%
+% \begin{macrocode}
+\def\init_cc#1{%
+ \out_line{\string\setglyph{#1}}
+ \def\char_name{#1}
+}
+\def\cc_char{%
+ \out_lline{\string\samesize{\char_name-not}}
+ \out_line{\string\endsetglyph}
+}
+% \end{macrocode}
+%
+%
+% \changes{1.900}{1998/12/28}{Method of computing italic corrections
+% changed to using an integer expression. (LH)}
+% \DescribeMacro{\italcorr_expression}
+% The way the italic correction is computed has been changed
+% quite a bit, although the computed values are still the same.
+% The point is that it is much simpler to modify the formula according
+% to which the value is computed using this method than using the
+% previous method.
+%
+% The call
+% \begin{quote}
+% |\italcorr_expression|\marg{width}\marg{left}^^A
+% \marg{right}\marg{bottom}\marg{top},
+% \end{quote}
+% where the arguments are \TeX\ \meta{number}s, should expand to an
+% integer expression. The value of that expression will be taken as the
+% italic correction of the current character.
+%
+% \meta{width} is the width of the character. \meta{left},
+% \meta{right}, \meta{bottom}, and \meta{top} are the respective
+% coordinates of the sides of the bounding box of the character. A
+% quantity which is not given as an argument, but which nontheless
+% might be of interest for a calculation of italic correction, is the
+% italic slant of the font. This quantity can be found in the fontinst
+% integer \texttt{italicslant}. (The MTX file written will also set
+% the integer \texttt{italicslant} to this value.)
+%
+% \begin{macro}{\uprightitalcorr}
+% \begin{macro}{\slanteditalcorr}
+% These two commands are what |\italcorr_expression| will get set
+% to---the slanted version is used if the italic slant is positive and
+% the upright version is used otherwise. The default definitions
+% compute the same values as in fontinst v\,1.8, but the definitions
+% can easily be modified using |\resetcommand|.
+% \begin{macrocode}
+\def\uprightitalcorr#1#2#3#4#5{0}
+\def\slanteditalcorr#1#2#3#4#5{\max{\sub{#3}{#1}}{0}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\calculate_it_slant}
+% To set the italic angle, we need to calculate the tangent of the
+% angle that the |.afm| file contains. This is done with David
+% Carlisle's \package{trig} macros. Note that the \package{trig}
+% macros don't like a space at the end of their argument.
+%
+% \changes{1.911}{1999/11/18}{Stripping off the space in
+% \cs{afm-ItalicAngle}. (LH)}
+% ^^A\question{\cs{afm_line} always inserts a space at the end of the line.}
+% ^^ACould we therefore save us a bit of trouble by simply changing the
+% ^^Apattern for |\ItalicAngle| to |(#1~)|? /LH
+%
+% \begin{macrocode}
+\def\calculate_it_slant#1{
+ \edef\theangle{#1}
+ \CalculateTan{\theangle}
+ \a_dimen=-\one_thousand sp
+ \a_dimen=\UseTan{\theangle}\a_dimen
+ \a_count=\a_dimen
+ \out_line{\string\setint{italicslant}{\the\a_count}}
+ \x_resetint{italicslant}{\a_count}
+ \ifnum 0<\a_count
+ \let\italcorr_expression=\slanteditalcorr
+ \else
+ \let\italcorr_expression=\uprightitalcorr
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+% \def\strip_spaces#1~#2\end_strip_spaces{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% To process a list of commands separated by semi-colons, we call
+% |\do_list[LIST]|. This works in a similar way to |\afm_line|, but
+% the control sequence family used for decoding is
+% \describecsfamily{list-\meta{key}}|\list-|\meta{keyword} rather
+% than |\afm-|\meta{keyword}.
+%
+% \begin{macrocode}
+\def\do_list[~#1~#2;~#3]{
+ \csname~list-#1\endcsname\gobble_one_semi#2;
+ \ifx\x_relax#3\x_relax\expandafter\gobble_one
+ \else\expandafter\identity_one\fi
+ {\do_list[~#3]}
+}
+\def\gobble_one_semi#1;{}
+% \end{macrocode}
+%
+% There is an analagous |\list_def| for defining commands to be used
+% inside lists.
+%
+% \begin{macrocode}
+\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}}
+% \end{macrocode}
+%
+% For example, these are the commands that are used in giving
+% character metrics:
+%
+% \begin{macrocode}
+\list_def{W}(#1~#2){\afm_length\x_width{#1}}
+\list_def{WX}(#1){\afm_length\x_width{#1}}
+\list_def{WY}(#1){}
+\list_def{N}(#1){\def\char_name{#1}}
+\list_def{B}(#1~#2~#3~#4){
+ \afm_length\bbox_llx{#1}
+ \afm_length\bbox_lly{#2}
+ \afm_length\bbox_urx{#3}
+ \afm_length\bbox_ury{#4}
+}
+\list_def{PCC}(#1~#2~#3){
+ \afm_length\a_count{#2}
+ \afm_length\b_count{#3}
+ \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}}
+}
+% \end{macrocode}
+%
+% \begin{macro}{\definealias}
+% The |\definealias| command can be used to define a glyph name
+% alias, for generation of |\aliased| clauses in glyph names. The
+% syntax is
+% \begin{quote}
+% |\definealias|\marg{alias name}\marg{font's name}\marg{int}
+% \end{quote}
+% where \meta{font's name} is the glyph name that if found in an
+% AFM file should be converted to an |\aliased| clause using the
+% \meta{alias name}. The \meta{int} is the name of an integer which
+% will be incremented every time this alias applies to a glyph
+% definition; this mechanism is meant to help higher level code
+% pick an ETX file that fits the font's glyph names.
+%
+% \changes{1.933}{2007/01/22}{Command added. (LH)}
+%
+% Defined aliases are stored in the
+% \describecsfamily{GN-\meta{font's name}}|\GN-|\meta{font's name}
+% family of control sequences. These control sequences are defined
+% to be macros expanding to the two tokens
+% \begin{quote}
+% |\g-|\meta{alias name}\,|\i-|\meta{int}
+% \end{quote}
+% In the case of |\g-|\meta{alias name}, this is purely a trick to
+% save memory (it is very likely that these control sequences will
+% anyway occur during the fontmaking part of the processing).
+% \begin{macrocode}
+\def\definealias#1#2#3{
+ \expandafter\def \csname GN-#1 \expandafter\endcsname
+ \expandafter{ \csname g-#2 \expandafter\endcsname
+ \csname i-#3\endcsname}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glyph_alias}
+% \begin{macro}{\glyph_alias_i}
+% The |\glyph_alias| macro has the syntax
+% \begin{quote}
+% |\glyph_alias|\marg{font's name}
+% \end{quote}
+% It expands to the \meta{alias name} corresponding to the
+% \meta{font's name}, that had previously been set up using
+% |\definealias|. Where this macro is used, it must already have
+% been checked that |\GN-|\meta{font's name} is defined.
+% \begin{macrocode}
+\def\glyph_alias#1{
+ \expandafter\expandafter \expandafter\glyph_alias_i
+ \csname GN-#1\endcsname
+}
+\def\glyph_alias_i#1#2{
+ \expandafter\gobble_three \string#1
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+\let\charnameprefix\empty
+\def\charnamealias#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \glyph_alias{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \glyph_alias{#1}
+ \else
+ #1
+ \fi\fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\alias_incr#1{
+ \expandafter\expandafter \expandafter\alias_incr_i
+ \csname GN-#1\endcsname
+}
+\def\alias_incr_i#1#2{
+ \ifx#2\x_relax
+ \mathchardef#2=\@ne
+ \else
+ \a_count=#2
+ \advance\a_count\@ne
+ \mathchardef#2=\a_count
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\alias_char_name#1{
+ \if_defined{GN-\charnameprefix#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{\charnameprefix#1}}
+ }
+ \alias_incr{\charnameprefix#1}
+ \else\if_defined{GN-#1}\then
+ \edef\char_name{
+ \string\aliased{#1}{\glyph_alias{#1}}
+ }
+ \alias_incr{#1}
+ \else
+ \edef\char_name{#1}
+ \fi\fi
+}
+\def\autoaliasafm{
+ \begingroup
+ \list_def{N}(##1){\alias_char_name{##1}}
+ \def\afm_write_setkern##1##2##3{
+ \out_line{
+ \string\setkern{\charnamealias{##1}}{\charnamealias{##2}}{##3}
+ }
+ }
+ \def\init_cc##1{%
+ \edef\char_name{\charnamealias{##1}}
+ \out_line{\string\setglyph{\char_name}}
+ }
+ \list_def{PCC}(##1~##2~##3){
+ \afm_length\a_count{##2}
+ \afm_length\b_count{##3}
+ \out_lline{\string\glyphpcc
+ {\charnamealias{##1}}{\the\a_count}{\the\b_count}}
+ }
+}
+\def\endautoaliasafm{\endgroup}
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \subsection{Converting a PL file to an MTX file}
+%
+% \DescribeMacro{\generalpltomtx}The macro
+% \begin{quote}
+% |\generalpltomtx|\marg{plfile}\marg{mtxfile}\marg{plsuffix}\relax
+% \marg{opt-enc}
+% \end{quote}
+% reads \meta{plfile}|.|\meta{plsuffix}, interprets it as having the
+% encoding specified by the file \meta{opt-enc}|.etx|, and writes the
+% same metric information out to \meta{mtxfile}|.mtx|. In case
+% \meta{opt-enc} is empty, the encoding will be determined using the
+% |CODINGSCHEME| property of the file being read.
+% \DescribeMacro{\pltomtx}The macro
+% \begin{quote}
+% |\pltomtx|\marg{plfile}\marg{mtxfile}
+% \end{quote}
+% reads \meta{plfile}|.pl|, uses the |CODINGSCHEME| property in that
+% file to determine its encoding, and writes the same metric information
+% out to \meta{mtxfile}|.mtx|.
+%
+% None of these commands can cope with |SKIP| properties in the (V)PL
+% file.
+%
+% \begin{macro}{\generalpltomtx}
+% \changes{1.902}{1999/05/01}{Command added, removed
+% \cs{pltomtxgivenetx}. (LH)}
+% \changes{1.910}{1999/11/01}{Made this command the standard one,
+% which \cs{pltomtx} calls. (UV\&LH)}
+% \changes{1.917}{2001/03/13}{Added resetting of
+% \cs{setsomething_global}---assignments made here must be
+% local. (LH)}
+% \changes{1.923}{2002/12/03}{Changed test of fourth argument to
+% instead of \cs{ifx} use \cs{if}. This is more versatile. (LH)}
+% \begin{macrocode}
+\def\generalpltomtx#1#2#3#4{{
+ \let\setsomething_global=\x_relax
+ \let\setfontdimen=\pl_setfontdimen
+ \if _#4_ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \inputetx{#4}
+ \let\CODINGSCHEME=\ignore_parens
+ \fi
+ \pl_to_mtx{#1}{#2}{#3}{\string\generalpltomtx{#1}{#2}{#3}{#4}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pltomtx}
+% \begin{macrocode}
+\def\pltomtx#1#2{\generalpltomtx{#1}{#2}{pl}{}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\pl_to_mtx}
+% \changes{1.911}{1999/11/19}{\cs{edef}ing \cs{raw_font_name}. (LH)}
+% The |\pl_to_mtx| macro contains all code that was common to
+% |\pltomtx| and |\general|\-|pltomtx| before the former was redefined
+% to a call of the latter. The structure of a call of |\pl_to_mtx| is
+% \begin{quote}
+% |\pl_to_mtx|\marg{plfile}\marg{mtxfile}\marg{plsuffix}\marg{call}
+% \end{quote}
+% \meta{call} is what should be written in the ``Created using:''
+% comment at the top of the MTX file written.
+% \changes{1.921}{2002/07/27}{\cs{fromvpl} in \cs{storemapdata} does
+% not have an argument. Fixed a bug that produced such an argument
+% anyway. (LH)}
+% \begin{macrocode}
+\def\pl_to_mtx#1#2#3#4{
+ \edef\raw_font_name{#1}
+ \open_out{\temp_prefix#2.mtx}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~#4}
+ \out_line{}
+ \out_line{\percent_char~This~file~contains~the~
+ information~of~#1.#3~in~a~form}
+ \out_line{\percent_char~more~easily~read~by~TeX.~
+ It~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \lowercase{
+ \record_transform{#2}{
+ \string\from#3 \x_cs\ifx{from#3}\frompl {#1} \fi
+ }{}\iftrue
+ }
+ \out_line{}
+ \catcode`\(=0 \catcode`\)=9
+ \let\/=\ignore_parens
+ \let\do_pl_glyph=\x_relax
+ \primitiveinput #1.#3\x_relax
+ \do_pl_glyph
+ \out_line{}
+ \ifisint{\percent_char boundarychar}\then
+ \f_count=\int{\percent_char boundarychar}
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setstr{rightboundary}
+ {\csname name-\the\f_count\endcsname}
+ }
+ \out_line{}
+ \fi
+ \fi
+ \out_line{\endmetrics_text}
+ \close_out{Metrics}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% To parse a |.pl| file, we first make |(| the escape character, make |)|
+% ignored, then define the various PL commands as \TeX\ control sequences.
+% We can ignore a parenthesis matched string by making |(| and |)| the
+% group delimiters, then gobbling them up.
+%
+% \begin{macrocode}
+\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \x_relax
+ \expandafter\expandafter\expandafter\gobble_parens
+ \iftrue\expandafter{\else}\fi}
+\def\gobble_parens#1{\egroup}
+% \end{macrocode}
+%
+% \begin{macro}{\pl_real}
+% \begin{macro}{\pl_realer}
+% Convert a PL real to an AFM unit, assuming it contains a decimal point.
+% \begin{macrocode}
+\def\pl_real#1{\pl_realer(#1000)}
+\def\pl_realer(#1.#2#3#4#5){#1#2#3#4}
+% \end{macrocode}
+% \cs{pl_real} only works if the \texttt{DESIGNUNITS}
+% setting is at the default value 1. Luckily, this is what
+% \package{TFtoPL} and \package{VFtoVP} use in all (V)PL files they
+% create, so you can always get a (V)PL file that will work by
+% converting first to TFM (+\,VF) and then back again. As of v\,1.913,
+% that is also the value \package{fontinst} uses for all VPL files it
+% generates, so the problem isn't particularly important.
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\pl_rounded_real}
+% \changes{1.921}{2002/07/26}{Macro added and is used instead of
+% \cs{pl_real}. (LH)}
+% The |\pl_rounded_real| macro is like |\pl_realer| in that it converts
+% a PL unit containing a decimal point to an AFM unit. The difference
+% is (i) that it rounds the number rather than truncating it and (ii)
+% that it stores the result in |\result| rather than expanding to it.
+% Note that the actual real (character string) to convert must be
+% followed by at least four zeros for the conversion to work
+% correctly in all cases.
+% \begin{macrocode}
+\def\pl_rounded_real(#1.#2#3#4#5){
+ \global\result=#1#2#3#4\relax
+ \ifnum \first_char#5= >4
+ \global\advance \result
+ \if - \first_char#1= \m@ne \else \@ne \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\pl_int}
+% Convert a PL int to a \TeX{} int, assuming it's prefixed
+% by |C|, |D|, |O|, or |H|.
+% \begin{macrocode}
+\def\pl_int#1#2{
+ \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else -1\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Many of the PL commands are ignored, and I'm assuming the |R|s are in
+% the places \texttt{tftopl} puts them, which is a bit naughty of me.
+%
+% \begin{PLproperty}{FAMILY}
+% \begin{PLproperty}{FACE}
+% \begin{PLproperty}{CHECKSUM}
+% \begin{PLproperty}{HEADER}
+% \begin{PLproperty}{SEVENBITSAFEFLAG}
+% \begin{macrocode}
+\let\FAMILY=\ignore_parens
+\let\FACE=\ignore_parens
+\let\CHECKSUM=\ignore_parens
+\def\HEADER~#1~#2~#3~#4~{}
+\def\SEVENBITSAFEFLAG~#1~{}
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty}
+% \end{PLproperty}
+%
+% \begin{PLproperty}{COMMENT}
+% \begin{PLproperty}{LIG}
+% \begin{PLproperty}{NEXTLARGER}
+% \begin{PLproperty}{VARCHAR}
+% \begin{macrocode}
+\let\COMMENT=\ignore_parens
+\let\LIG=\ignore_parens
+\let\NEXTLARGER=\ignore_parens
+\let\VARCHAR=\ignore_parens
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty}
+%
+%
+% \begin{PLproperty}{VTITLE}
+% \begin{PLproperty}{MAPFONT}
+% \begin{PLproperty}{MAP}
+% \begin{flushleft}
+% ^^A Flushed left since the paragraph is so hard to break
+% ^^A correctly.
+% \changes{1.900}{1998/12/04}{VPL-specific properties added to
+% those which are ignored by \cs{pltomtx}. (LH)}
+% The properties which are unique for VPL files---|VTITLE|,
+% |MAPFONT|, |MAP|, |FONTNAME|, |FONTAREA|, |FONTCHECKSUM|,
+% |FONTAT|, |FONTDSIZE|, |SELECTFONT|, |SETCHAR|, |SETRULE|,
+% |MOVERIGHT|, |MOVELEFT|, |MOVEUP|, |MOVEDOWN|, |PUSH|, |POP|,
+% |SPECIAL|, and |SPECIALHEX|---should also be ignored, but it is
+% actually sufficient to ignore the first three since the others
+% are only allowed inside |MAP| or |MAPFONT| property lists.
+% \end{flushleft}
+%
+% \begin{macrocode}
+\let\VTITLE=\ignore_parens
+\let\MAPFONT=\ignore_parens
+\let\MAP=\ignore_parens
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}
+%
+%
+% \begin{PLproperty}{CODINGSCHEME}
+% \begin{macro}{\CODINGSCHEME_cont}
+% When we reach a |CODINGSCHEME| instruction, we read the coding string,
+% and read in the corresponding \meta{encoding}|.etx| file.
+%
+% The corresponding \meta{encoding} is specified by |\declareencoding|
+% statements (see below). Each |\declare_encoding| defines a macro
+% |\enc-|\meta{codingscheme} which expands to \meta{encoding}.
+%
+% If the PL file is converted using the |\generalpltomtx| command with
+% a nonempty \meta{opt-enc} argument then the |CODINGSCHEME| instruction
+% is ignored since an encoding file has already been read in.
+%
+% \begin{macrocode}
+\def\CODINGSCHEME{\bgroup\catcode`\)=12\x_relax\CODINGSCHEME_cont}
+\def\CODINGSCHEME_cont#1){
+ \egroup
+ \if_undefined{enc-#1}\then
+ \errhelp{The~encoding~for~`#1'~has~not~been~declared.^^J
+ You~should~declare~it~with~
+ \string\declareencoding{#1}{ETXFILE}.^^J
+ Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J
+ or~X~<RETURN>~to~exit.}
+ \errmessage{Undeclared~encoding~`#1'}
+ \else
+ \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name}
+ \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name}
+ \catcode`\(=12 \catcode`\)=12
+ \x_cs\inputetx{enc-#1}\x_relax
+ \catcode`\(=0 \catcode`\)=9
+ \fi
+}
+% \end{macrocode}
+% \end{macro}\end{PLproperty}
+%
+% \begin{PLproperty}{DESIGNSIZE}
+% The |DESIGNSIZE| is needed because the |FONTDSIZE| specified in a
+% |MAPFONT| property list has to be the same as the |DESIGNSIZE| of
+% the corresponding base font.
+% \begin{macrocode}
+\def\DESIGNSIZE~#1~#2~{
+ \a_dimen=#2pt
+ \out_line{\string\setdim{designsize}{\the\a_dimen}}
+}
+% \end{macrocode}
+% \end{PLproperty}
+%
+% \begin{PLproperty}{DESIGNUNITS}
+% \changes{1.905}{1999/06/30}{Error message added. (LH)}
+% \changes{1.912}{2000/02/20}{Store designunits value in
+% \cs{b_dimen} rather than \cs{a_dimen}. \cs{a_dimen} holds the
+% design size throughout PL-to-MTX. (LH)}
+% The PL to MTX converter assumes that the (V)PL files to convert
+% look like the ones created by \texttt{TFtoPL}\slash\texttt{VFtoVP},
+% and the interpretation of the \texttt{DESIGNUNITS} property is one
+% thing specifically affected by this. The TFM file format does not
+% store the \texttt{DESIGNUNITS} value used, so the two above
+% programs always generate (V)PL files with the default setting of
+% design unit equal to the design size. Hence any occurence of the
+% \texttt{DESIGNUNITS} property with a nondefault value is an
+% indication of an error.
+%
+% The incorrect metrics can be corrected by scaling by a suitable
+% amount (1000 divided by the \texttt{designunits} dimen), but it is
+% much simpler to convert the PL to a TFM and then convert it back,
+% that will also fix the units.
+%
+% \begin{macrocode}
+\def\DESIGNUNITS~#1~#2~{
+ \b_dimen=#2pt\x_relax
+ \ifdim 1pt=\b_dimen \else
+ \fontinsterror{PL-to-MTX}{Nondefault~unit~used~in~PL~file}
+ {You~may~continue,~but~the~metrics~for~this~font~will~be~wrong.}
+ \fi
+ \out_line{\string\setdim{designunits}{\the\b_dimen}}
+}
+% \end{macrocode}
+% \end{PLproperty}
+%
+% \begin{PLproperty}{BOUNDARYCHAR}
+% \begin{macrocode}
+\def\BOUNDARYCHAR~#1~#2~{
+ \x_setint{\percent_char boundarychar}{\pl_int{#1}{#2}}
+}
+% \end{macrocode}
+% \end{PLproperty}
+%
+% \changes{1.917}{2001/03/16}{Rewrote the fontdimen part of the
+% (V)PL-to-MTX converter so that the ETX can specify the
+% fontdimens. (LH)}
+%
+% Declared fontdimens are converted to |\setint| commands in the MTX
+% file. A fontdimen declaration for fontdimen $n$ is stored in the
+% control sequence \describecsfamily{fdimen-\meta{n}}|\fdimen-|$n$; if
+% this control sequence is undefined then the fontdimen is not declared
+% and if it is set then it is a macro which expands to the name of the
+% corresponding integer variable.
+%
+% \begin{macro}{\pl_setfontdimen}
+% Fontdimens are declared by the |\pl_setfontdimen| macro, which is a
+% definition of |\setfontdimen| that is used during (V)PL-to-MTX
+% conversion.
+% \begin{macrocode}
+\def\pl_setfontdimen#1#2{\x_cs\def{fdimen-#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{PLproperty}{PARAMETER}
+% The |PARAMETER| property is the generic specifier of fontdimens in
+% (V)PL files. It takes two arguments: the fontdimen number (integer)
+% and value (real).
+% \begin{macrocode}
+\def\PARAMETER~#1~#2~R~#3~{
+ \f_count=\pl_int{#1}{#2}\x_relax
+ \if_defined{fdimen-\the\f_count}\then
+ \pl_rounded_real(#3 0000)
+ \out_line{\string\setint{\csname fdimen-\the\f_count\endcsname}
+ {\the\result}}
+ \fi
+}
+% \end{macrocode}
+% \end{PLproperty}
+%
+% \begin{PLproperty}{FONTDIMEN}
+% No special processing is required for the |FONTDIMEN| property.
+% \begin{macrocode}
+\let\FONTDIMEN=\x_relax
+% \end{macrocode}
+% \end{PLproperty}
+%
+% \begin{PLproperty}{SLANT}
+% \begin{PLproperty}{SPACE}
+% \begin{PLproperty}{STRETCH}
+% \begin{PLproperty}{SHRINK}
+% \begin{PLproperty}{XHEIGHT}
+% \begin{PLproperty}{QUAD}
+% \begin{PLproperty}{EXTRASPACE}
+% The properties for the seven mandatory fontdimens are converted
+% to the corresponding |PARAMETER| properties but their meanings are
+% predeclared. The effect of these predeclarations is that even ETX
+% files that don't use |\setfontdimen| to set the fontdimens have
+% these fontdimens converted to |\setint|s.
+%
+% A scan shows that the current (2001/03/17) MTX and ETX files aren't
+% using the integers \texttt{stretchword}, \texttt{shrinkword},
+% \texttt{quad}, and \texttt{extraspace}. They probably should.
+% \begin{macrocode}
+\def\SLANT{\PARAMETER D~1~}
+\pl_setfontdimen{1}{italicslant}
+\def\SPACE{\PARAMETER D~2~}
+\pl_setfontdimen{2}{interword}
+\def\STRETCH{\PARAMETER D~3~}
+\pl_setfontdimen{3}{stretchword}
+\def\SHRINK{\PARAMETER D~4~}
+\pl_setfontdimen{4}{shrinkword}
+\def\XHEIGHT{\PARAMETER D~5~}
+\pl_setfontdimen{5}{xheight}
+\def\QUAD{\PARAMETER D~6~}
+\pl_setfontdimen{6}{quad}
+\def\EXTRASPACE{\PARAMETER D~7~}
+\pl_setfontdimen{7}{extraspace}
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}
+%
+% \begin{numPLproperty}{NUM}{1,2,3}
+% \begin{numPLproperty}{DENOM}{1,2}
+% The |NUM|$*$ and |DENOM|$*$ properties are for fontdimens 8--10
+% and 11--12. They have to do with positioning numerator and
+% denominator in fractions.
+% \begin{macrocode}
+\def\NUM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~8~#2~#3~
+ \or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \fi
+}
+\def\DENOM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \fi
+}
+% \end{macrocode}
+% \end{numPLproperty}\end{numPLproperty}
+%
+% \begin{numPLproperty}{SUP}{1,2,3}
+% \begin{numPLproperty}{SUB}{1,2}
+% The |SUP|$*$ and |SUB|$*$ properties are for fontdimens 13--15
+% and 16--17. They have to do with positioning superscripts and
+% subscripts.
+% \begin{macrocode}
+\def\SUP#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~13~#2~#3~
+ \or
+ \PARAMETER D~14~#2~#3~
+ \or
+ \PARAMETER D~15~#2~#3~
+ \fi
+}
+\def\SUB#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~16~#2~#3~
+ \or
+ \PARAMETER D~17~#2~#3~
+ \fi
+}
+% \end{macrocode}
+% \end{numPLproperty}\end{numPLproperty}
+%
+% \begin{PLproperty}{SUPDROP}
+% \begin{PLproperty}{SUBDROP}
+% \begin{PLproperty}{AXISHEIGHT}
+% These are fontdimens 18, 19, and 22.
+% \begin{macrocode}
+\def\SUPDROP{\PARAMETER D~18~}
+\def\SUBDROP{\PARAMETER D~19~}
+\def\AXISHEIGHT{\PARAMETER D~22~}
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}
+%
+% \begin{numPLproperty}{DELIM}{1,2}
+% The |DELIM|$*$ fondimens have number 20 and 21. They have to do with
+% the size of delimiters put around a generalised fraction.
+% \begin{macrocode}
+\def\DELIM#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~20~#2~#3~
+ \or
+ \PARAMETER D~21~#2~#3~
+ \fi
+}
+% \end{macrocode}
+% \end{numPLproperty}
+%
+% \begin{PLproperty}{DEFAULTRULETHICKNESS}
+% \begin{numPLproperty}{BIGOPSPACING}{1,2,3,4,5}
+% The fontdimen properties that are special for math extension fonts
+% are |DEFAULT|\-|RULE|\-|THICKNESS| and the various
+% |BIG|\-|OP|\-|SPACING|$*$.
+% \begin{macrocode}
+\def\DEFAULTRULETHICKNESS{\PARAMETER D~8~}
+\def\BIGOPSPACING#1~#2~#3~{
+ \ifcase #1\or
+ \PARAMETER D~9~#2~#3~
+ \or
+ \PARAMETER D~10~#2~#3~
+ \or
+ \PARAMETER D~11~#2~#3~
+ \or
+ \PARAMETER D~12~#2~#3~
+ \or
+ \PARAMETER D~13~#2~#3~
+ \fi
+}
+% \end{macrocode}
+% This is the old definition of |\DEFAULTRULETHICKNESS| for historical
+% references (since its behaviour has changed).
+% \begin{macrocode}
+% \def\DEFAULTRULETHICKNESS~R~#1~{
+% \out_line{\string\setint{underlinethickness}{\pl_real{#1}}}
+% }
+% \end{macrocode}
+% \end{numPLproperty}\end{PLproperty}
+%
+%
+% \begin{PLproperty}{LABEL}
+% \begin{macro}{\LABEL_slot}
+% \begin{macro}{\LABEL_boundarychar}
+% \begin{macro}{\do_if_defined}
+% The most complicated part of the processing of the |LIGTABLE|
+% property list is that it has to keep track of which glyphs the
+% current ligature\slash kerning program applies to. This stored as
+% a |\do|\marg{glyph} list in |\a_macro| and building this list
+% is the job of the |LABEL| property.
+%
+% It is assumed that |\do| is |\never_do| whenever some element is
+% added to |\a_macro|.
+% \begin{macrocode}
+\def\LABEL~#1{\ifx #1B
+ \expandafter\LABEL_boundarychar
+ \else
+ \expandafter\LABEL_slot \expandafter#1
+ \fi
+}
+\def\LABEL_slot #1~#2~{
+ \f_count=\pl_int{#1}{#2}
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-\the\f_count}
+ }
+}
+\def\LABEL_boundarychar OUNDARYCHAR{
+ \edef\a_macro{\a_macro
+ \x_cs\do_if_defined{name-BOUNDARYCHAR}
+ }
+}
+\def\do_if_defined#1{\ifx #1\x_relax \else \do{#1} \fi}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{PLproperty}
+%
+%
+% \begin{PLproperty}{LIGTABLE}
+% \begin{PLproperty}{STOP}
+% \begin{PLproperty}{SKIP}
+% The |LIGTABLE|, |STOP|, and |SKIP| properties are the remaining
+% properties involved in managing the |\a_macro| list. |SKIP|
+% properties are \emph{not} processed.
+% \begin{macrocode}
+\def\LIGTABLE{\let\do=\never_do\let\a_macro\empty_command}
+\def\STOP{\let\a_macro\empty_command}
+\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}}
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}
+%
+% \begin{PLproperty}{KRN}
+% \begin{macro}{\write_pl_krn}
+% |KRN| properties are converted to |\setkern| instructions.
+% \begin{macrocode}
+\def\KRN~#1~#2~R~#3~{
+ \pl_rounded_real(#3 0000)
+ \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\the\result}}
+ \a_macro
+ \let\do=\never_do
+}
+\def\write_pl_krn#1#2#3{
+ \f_count=#1\x_relax
+ \x_cs\ifx{name-\the\f_count}\x_relax \else
+ \out_line{\string\setkern{#3}
+ {\csname name-\the\f_count\endcsname}{#2}
+ }
+ \fi
+}
+% \end{macrocode}
+% \end{macro}\end{PLproperty}
+%
+% \begin{PLproperty}{CHARACTER}
+% \begin{PLproperty}{CHARWD}
+% \begin{PLproperty}{CHARHT}
+% \begin{PLproperty}{CHARDP}
+% \begin{PLproperty}{CHARIC}
+% The character metrics that are processed are |CHARWD|, |CHARHT|,
+% |CHARDP|, and |CHARIC|. The |CHARACTER| property takes care of
+% writing the information to the MTX file, but note that each new
+% |CHARACTER| property writes the information from the preceeding
+% |CHARACTER| property.
+% \begin{macrocode}
+\def\CHARWD~R~#1~{\pl_rounded_real(#1 0000) \b_count=\result}
+\def\CHARHT~R~#1~{\pl_rounded_real(#1 0000) \c_count=\result}
+\def\CHARDP~R~#1~{\pl_rounded_real(#1 0000) \d_count=\result}
+\def\CHARIC~R~#1~{\pl_rounded_real(#1 0000) \e_count=\result}
+\def\CHARACTER~#1~#2~{
+ \do_pl_glyph
+ \a_count=\pl_int{#1}{#2}
+ \b_count=0
+ \c_count=0
+ \d_count=0
+ \e_count=0
+ \let\do_pl_glyph=\write_pl_glyph
+}
+% \end{macrocode}
+% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty}
+% \end{PLproperty}
+%
+% \begin{macro}{\write_pl_glyph}
+% The |\write_pl_glyph| actually writes the information contained in
+% a |CHARACTER| property list to the MTX file as a |\setrawglyph|
+% command.
+% \begin{macrocode}
+\def\write_pl_glyph{
+ \x_cs\ifx{name-\the\a_count}\x_relax\else
+ \out_line{\string\setrawglyph
+ {\csname~name-\the\a_count\endcsname}
+ {\raw_font_name}
+ {\the\a_dimen}
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\the\e_count}}
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Converting an MTX file to a PL file}
+%
+% \DescribeMacro{\mtxtopl}
+% The macro
+% \begin{quote}
+% |\mtxtopl|\marg{mtxfile}\marg{plfile}
+% \end{quote}
+% writes a font from the |\setrawglyph| instructions in \meta{mtxfile}
+% to \meta{plfile}. It ignores any font dimensions and kerning, so the
+% resulting font is only useful for generating virtual fonts from.
+% (This macro is called by |\transformfont|.)
+%
+% \begin{macro}{\mtxtopl}
+% \changes{1.911}{1999/11/19}{Added `ligless' to one of the comment
+% lines. (LH) Clarification requested by Walter Schmidt.}
+% \changes{1.917}{2001/03/13}{Added resetting of
+% \cs{setsomething_global}---assignments made here must be
+% local. (LH)}
+% \changes{1.929}{2005/02/05}{Corrected `\texttt{pltotf}' in
+% comment. (LH)}
+% \begin{macrocode}
+\def\mtxtopl#1#2{{
+ \let\setsomething_global=\x_relax
+ \open_out{#2.pl}
+ \top_of_pl_hook
+ \out_line{(COMMENT~raw~font~#2~created~by~fontinst~
+ v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.pl)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~
+ a~ligless~TeX~font~with)}
+ \out_line{(COMMENT~pltotf~#2.pl~#2.tfm)}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \out_line{(DESIGNSIZE~R~10.0)}
+ \out_line{}
+ \let\setglyph=\iffalse
+ \let\endsetglyph=\fi
+ \let\setkern=\gobble_three
+ \let\setscaledrawglyph=\first_pl_raw_glyph
+ \def\setscalednotglyph##1##2##3##4##5##6##7##8##9{}
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.pl)}
+ \close_out{Raw~font}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\first_pl_raw_glyph}
+% The |\first_pl_raw_glyph| writes the \texttt{DESIGNUNITS} property
+% for the font when the first |\setscaledrawglyph| is encountered.
+% This is to undo the scaling that has already been applied to the
+% metrics, so that the metrics will match the actual font.
+% \begin{macrocode}
+\def\first_pl_raw_glyph#1#2#3#4{
+ \out_line{(DESIGNUNITS~R~\make_factor{#4})}
+ \let\setscaledrawglyph=\pl_raw_glyph
+ \pl_raw_glyph{#1}{#2}{#3}{#4}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pl_raw_glyph}
+% \begin{macrocode}
+\def\pl_raw_glyph#1#2#3#4#5#6#7#8#9{
+ \out_line{(CHARACTER~D~\number#5~\space(COMMENT~#1)}
+ \out_lline{(CHARWD~R~\make_factor{#6})}
+ \out_lline{(CHARHT~R~\make_factor{#7})}
+ \out_lline{(CHARDP~R~\make_factor{#8})}
+ \out_lline{(CHARIC~R~\make_factor{#9})}
+ \out_lline{)}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Font transformations}
+% \label{Sec:Font.trans}
+% \changes{1.902}{1999/05/01}{Moved Section \thesection\space to
+% \texttt{ficonv.dtx}. (LH)}
+%
+% \subsection{Transformable metric files}
+% \label{Ssec:TransMTX}
+%
+% \changes{1.901}{1999/02/28}{Definition of transformable metric file
+% added. (LH)}
+% \changes{1.913}{2000/03/10}{Definition of transformable metric file
+% changed to include the \cs{setscaledrawglyph} and
+% \cs{setscalednotglyph} commands. (LH)}
+% \changes{1.915}{2000/09/09}{Added description of \cs{aliased} macro
+% to the definition of transformable metric files. (LH)}
+% A \emph{transformable metric file} is a metric file
+% which complies with certain restrictions in its syntax. The only
+% metric commands allowed are
+% \begin{isyntax}
+% |\setscaledrawglyph|\marg{glyph}\marg{font}\marg{size}^^A
+% \marg{scale}\marg{slot}\marg{width}\penalty0
+% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}\\
+% |\setrawglyph|\marg{glyph}\marg{font}\marg{size}\marg{slot}^^A
+% \marg{width}\marg{height}\penalty0\marg{depth}\penalty0
+% \marg{italic}\\
+% |\setscalednotglyph|\marg{glyph}\marg{font}\marg{size}^^A
+% \marg{scale}\marg{slot}\marg{width}\penalty0
+% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}\\
+% |\setnotglyph|\marg{glyph}\marg{font}\marg{size}\marg{slot}^^A
+% \marg{width}\marg{height}\penalty0\marg{depth}\penalty0
+% \marg{italic}\\
+% |\setkern|\marg{glyph1}\marg{glyph2}\marg{amount}\\
+% |\setglyph|\marg{glyph} \meta{glyph commands} |\endsetglyph|
+% \end{isyntax}
+% where \meta{glyph}, \meta{glyph1}, \meta{glyph2}, and \meta{font} are
+% strings without any variable references (no |\str| or |\strint| are
+% allowed), \meta{scale}, \meta{slot}, \meta{width}, \meta{height},
+% \meta{depth}, \meta{italic}, and \meta{amount} are \TeX\ numbers, and
+% \meta{size} is a \TeX\ dimen. (More accurately, all dimens in a
+% transformable metric file should be on the form \meta{optional
+% signs}\penalty0 \meta{decimal constant}\penalty0 \meta{physical unit},
+% but that's at the ``dangerous bend'' level.) The \meta{glyph}s may be
+% of the form
+% \begin{quote}
+% |\aliased|\marg{font's name}\marg{alias name}
+% \end{quote}
+% Such \meta{glyph}s are interpreted as \meta{alias name} for all
+% purposes except reencoding, when they are interpreted as \meta{font's
+% name}. \meta{glyph}s of this form are furthermore copied as they are
+% to MTX files created by |\transform|\-|font| (|\mtxtomtx|).
+%
+% The only \meta{glyph commands} allowed are
+% \begin{quote}
+% |\samesize|\marg{glyph}\\
+% |\glyphpcc|\marg{glyph}\marg{xoffset}\marg{yoffset}
+% \end{quote}
+% where \meta{glyph} is as above, and \meta{xoffset} and \meta{yoffset}
+% are \TeX\ numbers.
+%
+% The only general commands allowed are
+% \begin{quote}
+% |\needsfontinstversion|\marg{version}\\
+% |\setint|\marg{name}\marg{number}\\
+% |\setdim|\marg{name}\marg{dimen}\\
+% |\setstr|\marg{name}\marg{string}\\
+% |\storemapdata|\marg{font}\marg{source}\marg{transformations}
+% \end{quote}
+% where \meta{name} and \meta{string} are strings without variable
+% references, \meta{number} is a \TeX\ number, and \meta{dimen} is a
+% \TeX\ dimen. The arguments of |\needs|\-|fontinst|\-|version| and
+% |\store|\-|map|\-|data| are as usual, but these commands do not get
+% copied in a font transformation.
+%
+% The metric files produced by |\afmtomtx| and |\generalpltomtx| are
+% meant to be transformable. If they are not then there is a bug
+% somewhere.
+%
+% The name of the integer in |\setint| commands is interpreted. This
+% name is used to determine how the number should be transformed, see
+% the implementation of |\mtxtomtx_setint| below.
+%
+%
+% \subsection{Making font transformations}
+%
+% \changes{1.911}{1999/11/19}{Recording of transformations moved to the
+% macros that actually write the MTX files. (LH)}
+% \changes{1.911}{1999/11/19}{Flag for that source font wasn't found
+% changed to \texttt{afm-name}. \texttt{transform-source} string
+% completely removed. (LH)}
+% \changes{1.913}{2000/03/11}{New implementation of \cs{scalefont} and
+% \cs{yscalefont}, using the new \cs{setscaledrawglyph} and
+% \cs{setscalednotglyph} commands. (LH)}
+% \changes{1.913}{2000/03/12}{Using \cs{slots-}\meta{glyph} control
+% sequences for storing encoding positions of glyphs in reencoded
+% fonts. (LH)}
+%
+% \DescribeMacro{\transformfont}
+% The macro:
+% \begin{quote}
+% |\transformfont|\marg{font-name}\marg{transformed font}
+% \end{quote}
+% transforms the metrics of a raw font. As far as \TeX\ is concerned,
+% \meta{font-name} will be a new font. Actually doing the
+% transformation and providing the transformed font (as opposed to the
+% metrics of the transformed font) is for most transforms up to some
+% other piece of software, in most cases the DVI driver, but
+% \package{fontinst} will handle isotropic scaling itself.
+%
+% The easiest way to find out which transformations need to be carried
+% out is to generate a map file for the \texttt{debug} ``driver'' (see
+% Section~\ref{Sec:Mapfiles}). Of course, if \package{fontinst} can
+% generate a mapfile for the target driver then you probably don't need
+% to find out which transformations were necessary\,\textellipsis
+% \spacefactor=\sfcode`\.\space\space
+% In any case, the arguments of |\storemapdata| in the MTX file
+% generated will tell which transformations of this |\transformfont|
+% command that must be performed by some other software.
+%
+% \DescribeMacro{\fromafm}
+% \DescribeMacro{\frommtx}
+% \DescribeMacro{\frompl}
+% \DescribeMacro{\scalefont}
+% \DescribeMacro{\xscalefont}
+% \DescribeMacro{\yscalefont}
+% \DescribeMacro{\slantfont}
+% \DescribeMacro{\reencodefont}
+% The \meta{transformed font} commands are:
+% \begin{quote}
+% |\fromafm|\marg{AFM file}\\
+% |\frompl|\marg{PL file}\\
+% |\fromplgivenetx|\marg{PL file}\marg{etx}\\
+% |\frommtx|\marg{MTX file}\\
+% |\fromany|\marg{file}\\
+% |\scalefont|\marg{integer expression}\marg{transformed font}\\
+% |\xscalefont|\marg{integer expression}\marg{transformed font}\\
+% |\yscalefont|\marg{integer expression}\marg{transformed font}\\
+% |\slantfont|\marg{integer expression}\marg{transformed font}\\
+% |\reencodefont|\marg{etx}\marg{transformed font}
+% \end{quote}
+%
+% Each |\transformfont| command generates an |.mtx| file for
+% \meta{font-name} and a corresponding raw |.pl| file, which is written
+% out by |\mtxtopl|.
+%
+% Each |\fromafm|, |\frompl|, or |\fromplgivenetx| command also generates
+% an |.mtx| file for the source font, which is written out by |\afmtomtx|
+% or |\generalpltomtx|. In addition, |\fromafm| also uses |\mtxtopl|
+% to generate a corresponding raw |.pl| file.
+%
+% |\fromany| reads an MTX, PL, AFM, or VPL file depending on what it can
+% find. It tries them in the order first MTX, then PL, then AFM, and
+% last VPL.
+%
+% \begin{macro}{\transformfont}
+% \changes{1.912}{2000/01/15}{Added local resetting of
+% \cs{setsomething_global} to \cs{relax}, since \cs{transformfont}
+% assumes such assignments are local. (LH)}
+% \begin{macrocode}
+\def\transformfont#1#2{{
+ \let\setsomething_global=\x_relax
+ \unsetstr{afm-name}
+ \unsetstr{etx-name}
+ \x_resetint{x-scale}{\one_thousand}
+ \x_resetint{y-scale}{\one_thousand}
+ \x_resetint{slant-scale}{0}
+ #2
+% \end{macrocode}
+% \changes{1.903}{1999/06/01}{Added behaviour for the case source file
+% not found. (LH)}
+% \changes{1.921}{2002/07/31}{Corrected an error message that tried
+% to use a variable that wasn't set! (LH)}
+% \begin{macrocode}
+ \ifisstr{afm-name}\then
+ \mtxtomtx{\str{afm-name}}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \fontinsterror{Transformfont}{
+ Failed~to~make~transformed~font~#1;\messagebreak
+ source~font~metrics~file~not~found
+ }\error_help_a
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fromafm}
+% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)}
+% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)}
+% \begin{macrocode}
+\def\fromafm#1{
+ \if_file_exists{#1.afm}\then
+ \x_setstr{afm-name}{#1}
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\frommtx}
+% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)}
+% \begin{macrocode}
+\def\frommtx#1{
+ \if_file_exists{#1.mtx}\then \x_setstr{afm-name}{#1} \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frompl}
+% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)}
+% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)}
+% \begin{macro}{\fromplgivenetx}
+% \changes{1.902}{1999/05/02}{Command added. (LH)}
+% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)}
+% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)}
+% \begin{macrocode}
+\def\frompl#1{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fromplgivenetx#1#2{
+ \if_file_exists{#1.pl}\then
+ \x_setstr{afm-name}{#1}
+ \generalpltomtx{#1}{#1}{pl}{#2}
+ \fi
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \multchanges{\cs{fromvpl}\cs{fromvplgivenetx}}{1.902}{1999/05/02}
+% {Commands added. (LH)}
+% \multchanges{\cs{fromvpl}\cs{fromvplgivenetx}}{1.904}{1999/06/16}
+% {Commands removed. (LH)}
+% Regarding \cs{fromvpl} and \cs{fromvplgivenetx}: I realized that
+% there isn't any point in reading metrics for a font that is to be
+% transformed from a VPL file, since no driver I know of can transform
+% virtual fonts. If someone has a problem with this then I suppose he
+% or she should send word about it. /LH
+%
+%
+% \begin{macro}{\fromany}
+% \changes{1.903}{1999/05/20}{Command added. (LH) Based on a
+% suggestion by Vladimir Volovich.}
+% \changes{1.903}{1999/06/01}{Added behaviour for AFM not found case.
+% (LH)}
+% \changes{1.904}{1999/06/16}{Added search for VPL file and calls to
+% \cs{record_transform}. (LH)}
+% \changes{1.923}{2002/12/03}{Added \cs{pl_encoding}. (LH)}
+% \changes{1.926}{2003/07/10}{Removed \cs{pl_encoding}; it is better
+% to provide that functionality in a separate macro. (LH)}
+% \changes{1.926}{2003/07/10}{Has to reset the \texttt{afm-name}
+% string, since \cs{input_mtx_file} now uses the value. (LH)}
+% The |\fromany| transformed font command searches for font metrics
+% for \#1 by looking for, in turn, the files \#1|.mtx|, \#1|.pl|,
+% \#1|.afm|, and \#1|.vpl|. If an MTX file doesn't exist, it is
+% generated, and if the MTX is generated from an AFM then a
+% corresponding (non-ligful) PL file is generated as well. |\fromany|
+% also sets the fontinst string \texttt{afm-name} according
+% to what kind of font it found. If none of the fonts existed then
+% |afm-name| is unset.
+% \begin{macrocode}
+\def\fromany#1{
+ \x_cs\edef{s-afm-name}{#1}
+ \if_file_exists{#1.mtx}\then\else
+% \end{macrocode}
+%
+% \changes{1.6}{1997/01/15}{Search order changed to PL before AFM.
+% (SPQR) The code wasn't in \cs{fromany} back then, though.}
+% 1997/01/15 SPQR changed the below search order to |.pl| before |.afm|
+% because of the |cmr*.afm| files found in the |TEXMF|\slash
+% |fonts|\slash|afm| hierarchy.
+% \begin{macrocode}
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1}{pl}{}
+ \else
+ \if_file_exists{#1.afm}\then
+ \afmtomtx{#1}{#1}
+ \mtxtopl{#1}{#1}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1}{vpl}{}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection*{The mathematical basis for the metric font transformations}
+%
+% Mathematically, all the metric font transformations (|\scale|\-|font|,
+% |\xscale|\-|font|, |\yscale|\-|font|, and |\slant|\-|font|) are linear
+% mappings of the real plane onto itself. All quantities in a
+% transformable metric file are interpreted as being determined by some
+% point in this plane and hence their transformation depends on how that
+% point would be moved by the metric font transformations performed.
+% This is usually simpler than it sounds, since all quantities except
+% |italicslant| are interpreted as either the $x$- or the $y$-coordinate
+% of some point. |italicslant| is interpreted as the quotient
+% $\frac{x}{y}$ for a point.
+%
+% The best way to describe a linear mapping of the real plane to itself
+% is by a \(2 \times 2\) matrix whose components are real numbers. Since
+% true real numbers are not available in \TeX, integers are used instead,
+% with the convention that they are in units of thousandths. In a
+% concrete form this means that $0$ represents $0$, $500$ represents
+% $\frac{1}{2}$, $1000$ represents $1$, etc. This works just as for the
+% scaling factors used in |\scale|. It also means that the matrix
+% $$
+% \left(\begin{array}{cc} 1000 & 0 \\ 0 & 1000 \end{array}\right)
+% $$
+% represents the identity mapping (the mapping taking everything to
+% itself).
+%
+% Thinking of points as column vectors (\(2 \times 1\) matrices) with
+% the $x$-coordinate in the first component and the $y$-coordinate in
+% the second, the respective elementary metric font transformations
+% correspond to the following matrices:
+% \begin{eqnarray*}
+% \mbox{\cs{scalefont}\marg{n}} & \mbox{is} &
+% \left( \begin{array}{cc}
+% \mbox{\meta{n}}& 0 \\
+% 0 & \mbox{\meta{n}}
+% \end{array} \right) \\
+% \mbox{\cs{xscalefont}\marg{n}} & \mbox{is} &
+% \left( \begin{array}{cc}
+% \mbox{\meta{n}}& 0 \\
+% 0 & 1000
+% \end{array} \right) \\
+% \mbox{\cs{yscalefont}\marg{n}} & \mbox{is} &
+% \left( \begin{array}{cc}
+% 1000 & 0 \\
+% 0 & \mbox{\meta{n}}
+% \end{array} \right) \\
+% \mbox{\cs{slantfont}\marg{n}} & \mbox{is} &
+% \left( \begin{array}{cc}
+% 1000 & \mbox{\meta{n}} \\
+% 0 & 1000
+% \end{array} \right)
+% \end{eqnarray*}
+% Since all these matrices are upper triangular, all products of such
+% matrices (corresponding to compositions of the linear mappings) will be
+% upper triangular as well. It is therefore unnecessary to store the
+% subdiagonal component anywhere (it is always zero), and hence
+% \package{fontinst} represents an arbitrary metric transform by the
+% matrix
+% $$
+% \left( \begin{array}{cc}
+% \mbox{\texttt{x-scale}} & \mbox{\texttt{slant-scale}} \\
+% 0 & \mbox{\texttt{y-scale}}
+% \end{array} \right)
+% $$
+% where \texttt{x-scale}, \texttt{y-scale}, and \texttt{slant-scale}
+% are fontinst integers.
+%
+% The reason there is a representation of arbitrary metric transforms
+% is that all the elementary metric transforms listed in the second
+% argument of |\transformfont| are concatenated before the actual font
+% file conversion is made. This reduces the amount of calculations
+% performed in case there are many transformations of the font.
+%
+% Why do we only consider transformations that correspond to upper
+% triangular matrices? Well, a transformation corresponds to an upper
+% triangular matrix if and only if it leaves horizontal lines horizontal.
+% Since in particular the baseline must always be horizontal in \TeX,
+% there is no point in considering other linear transformations.
+%
+% \begin{macro}{\scalefont}
+% \begin{macro}{\xscalefont}
+% \begin{macro}{\yscalefont}
+% \begin{macro}{\slantfont}
+% \begin{macro}{\reencodefont}
+% \begin{macrocode}
+\def\scalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{x-scale}{\scale{\d_count}{\int{x-scale}}}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\xscalefont#1#2{
+ \x_resetint{x-scale}{\scale{#1}{\int{x-scale}}}
+ #2
+}
+\def\yscalefont#1#2{
+ \eval_expr_to\d_count{#1}
+ \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}}
+ \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}}
+ #2
+}
+\def\slantfont#1#2{
+ \x_resetint{slant-scale}{
+ \add{\scale{#1}{\int{x-scale}}}{\int{slant-scale}}
+ }
+ #2
+}
+\def\reencodefont#1#2{
+ #2
+ \resetstr{etx-name}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% That's only half the story, however. It is true that the transformation
+% matrix, as computed by |\scalefont|, |\slantfont|, |\xscalefont|, and
+% |\yscalefont| above, is used for transforming the font metrics, but it
+% is not directly used for transforming the font itself. Instead it is
+% factorized as
+% $$
+% \left( \begin{array}{cc}
+% x & s \\ 0 & y
+% \end{array} \right) =
+% y \left( \begin{array}{cc}
+% x/y & s/y \\ 0 & 1
+% \end{array} \right)
+% $$
+% Here the scalar factor $y$ will be used to scale the \meta{scale}
+% argument of |\set|\-|scaled|\-|raw|\-|glyph| and
+% |\set|\-|scaled|\-|not|\-|glyph| commands, whereas the matrix
+% factor will be put in the third argument of |\store|\-|map|\-|data|
+% in the MTX file written. Thus \package{fontinst} will handle the
+% scalar factor of the transformation itself, but leave the matrix
+% factor for some other software to take care of.
+%
+% \bigskip
+%
+%
+% \DescribeMacro{\mtxtomtx}
+% The macro:
+% \begin{quote}
+% |\mtxtomtx|\marg{source MTX}\marg{destination MTX}
+% \end{quote}
+% converts the first |.mtx| file to the second, using the current values
+% of |\int{x-scale}|, |\int{y-scale}|, |\int{slant-scale}|, and
+% |\str{etx-name}|.
+%
+% NOTE: this doesn't convert arbitrary |.mtx| files, just the
+% transformable ones.
+%
+% \begin{macro}{\mtxtomtx}
+% \changes{1.911}{1999/11/19}{\cs{edef}ing \cs{raw_font_name}. (LH)}
+% \changes{1.915}{2000/09/09}{Locally redefining \cs{aliased}. (LH)}
+% \changes{1.924}{2003/02/08}{Added \cs{directfalse}. (LH)}
+% \changes{1.931}{2005/05/13}{Placed ETX processing after
+% \cs{needsfontinstversion} had been written, so that ETX commands
+% can write data directly to the output MTX file. (LH)}
+% \changes{1.931}{2005/05/13}{Copying \cs{declarepsencoding} data to
+% generated MTX file as a \cs{setpsencoding} command. (LH)}
+% \begin{macrocode}
+\def\mtxtomtx#1#2{{
+ \let\a_macro=\empty_command
+ \_a_true
+ \ifnum \int{x-scale}=\int{y-scale}
+ \ifnum \int{slant-scale}=\z@
+ \_a_false
+ \fi \fi
+ \if_a_
+ \a_count=\int{x-scale}
+ \l_inv_scale\a_count{\int{y-scale}}
+ \b_count=\int{slant-scale}
+ \l_inv_scale\b_count{\int{y-scale}}
+ \edef\a_macro{\a_macro
+ \string\transformfont{\the\a_count}{\the\b_count}
+ }
+ \fi
+ \open_out{\temp_prefix#2.mtx}
+ \edef\raw_font_name{#2}
+ \out_line{\percent_char~Filename:~#2.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \ifisstr{etx-name}\then
+ \def\do_slot{\x_cs\edef{slots-\slot_name}{\the\slot_number}}
+ \def\declarepsencoding##1##2##3{
+ \a_toks={{##1}{##2}{##3}}
+ \out_line{\string\providepsencoding\the\a_toks}
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file
+ {\string\providepsencoding\the\a_toks}
+ \fi
+ }
+ \directfalse
+ \inputetx{\str{etx-name}}
+ \edef\a_macro{\a_macro\string\reencodefont{\str{etx-name}}}
+ \fi
+ \record_transform{#2}{\string\frommtx{#1}}{\a_macro}\iftrue
+ \out_line{}
+ \mtxtomtx_redefinitions
+ \inputmtx{#1}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Transformed~metrics}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mtxtomtx_redefinitions}
+% This macro serves as a hook. One can make additional commands
+% transformable by appending suitable redefenitions of them to this
+% macro.
+% \changes{1.927}{2003/12/08}{Macro added. The code used to be in
+% \cs{mtxtomtx}. (LH)}
+% \begin{macrocode}
+\def\mtxtomtx_redefinitions{
+ \let\setint=\mtxtomtx_setint
+ \let\setdim=\mtxtomtx_setdim
+ \let\setstr=\mtxtomtx_setstr
+ \let\setscaledrawglyph=\mtxtomtx_setscaledrawglyph
+ \let\setscalednotglyph=\mtxtomtx_setscaledrawglyph
+ \let\setkern=\mtxtomtx_setkern
+ \let\setglyph=\mtxtomtx_setglyph
+ \let\glyphpcc=\mtxtomtx_glyphpcc
+ \let\samesize=\mtxtomtx_samesize
+ \let\endsetglyph=\mtxtomtx_endsetglyph
+ \def\aliased{\string\aliased}
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\aliased}
+% \changes{1.915}{2000/09/09}{Macro added. (LH)}
+% The |\aliased| macro has the syntax
+% \begin{quote}
+% |\aliased|\marg{font's name}\marg{alias name}
+% \end{quote}
+% This normally expands to \meta{alias name}, but in |\mtxtomtx| it
+% normally expands to
+% \begin{quote}
+% |\string\aliased|\marg{font's name}\marg{alias name}
+% \end{quote}
+% and when |\mtxtomtx_setscaledrawglyph| is reencoding it uses
+% \meta{font's name} to determine the new slot position.
+% \begin{macrocode}
+%<pkg|misc>\let\aliased=\second_of_two
+%<doc>\let\aliased=\@secondoftwo
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mtxtomtx_setint}
+% \changes{1.917}{2001/03/24}{Redefined to allow an extensible list
+% \cs{width_ints_list} of integers that should be transformed as
+% widths. (LH)}
+% \begin{macro}{\italicslant_name}
+% \begin{macro}{\width_ints_list}
+% \changes{1.917}{2001/03/24}{Macro added. \cs{verticalstem_name}
+% removed. (LH)}
+% Most integers are transformed as if they are the $y$-coordinates of
+% some points, but |italicslant| and the integers in the
+% |\width_ints_list| are treated differently. |italicslant| is
+% interpreted as the quotient $\frac{x}{y}$ for a point $(x,y)$, but
+% represented as a real number (i.e., the \TeX\ number is really a
+% thousand times the actual quotient). The integers in the
+% |\width_ints_list| are transformed as if they are the
+% $x$-coordinates of some points on the baseline.
+%
+% The |\width_ints_list| macro is an ordinary |\do|-type list where
+% each |\do| has precisely one argument. These arguments are the names
+% of the integers which should be transformed as widths. Elements can
+% be added to the list using the |\add_to| macro.
+%
+% The test for whether a specific integer is in the |\width_ints_list|
+% exploits that |\if_true| and |\if_false| only matter in |\if|--|\fi|
+% matching after they have been expanded, whereas
+% |\gobble_one|\,|\iftrue| only matters before it is expanded.
+% \begin{macrocode}
+%<*pkg>
+\def\mtxtomtx_setint#1#2{
+ \def\a_macro{#1}
+ \ifx \a_macro\italicslant_name
+ \eval_expr{#2}
+ \global\multiply \result \int{x-scale}
+ \a_count=\int{slant-scale}
+ \multiply \a_count \one_thousand
+ \advance \a_count \result
+ \divide \a_count \int{y-scale}\x_relax
+ \else
+ \def\do##1{
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \expandafter\if_false \fi
+ }
+ \gobble_one\iftrue \width_ints_list \if_true
+ \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}}
+ \else
+ \eval_expr_to\a_count{\scale{#2}{\int{x-scale}}}
+ \fi
+ \fi
+ \out_line{\string\setint{#1}{\the\a_count}}
+}
+\def\italicslant_name{italicslant}
+\def\width_ints_list{
+ \do{interword}\do{stretchword}\do{shrinkword}\do{quad}
+ \do{extraspace}\do{digitwidth}\do{verticalstem}
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\mtxtomtx_setdim}
+% \begin{macro}{\mtxtomtx_setstr}
+% Strings and dimens are not affected by the |\mtxtomtx| transforms.
+% \begin{macrocode}
+\def\mtxtomtx_setdim#1#2{
+ \out_line{\string\setdim{#1}{#2}}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\mtxtomtx_setstr#1#2{
+ \out_line{\string\setstr{#1}{#2}}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\mtxtomtx_setscaledrawglyph}
+% \changes{1.915}{2000/09/09}{Added local redefinition of
+% \cs{aliased}. (LH)}
+% |#6| (the width) is transformed as the $x$-coordinate of a point on
+% the baseline. |#7| and |#8| (the height and depth respectively) are
+% transformed as $y$-coordinates. The depth should probably really have
+% been transformed as the negative of a $y$-coordinate, but it comes
+% out the same in the end anyway. |#9| (the italic correction) is
+% transformed as the $x$-coordinate of a point whose $y$-coordinate
+% equals the height of the character. |#4| (the scaling) is
+% transformed as a $y$-coordinate.
+%
+% If the italic slant of the font is negative then the italic
+% correction should possibly be transformed as the $x$-coordinate of
+% a point whose $y$-coordinate equals the negative of the depth
+% instead (as that is the part of the box that is sticking out to the
+% right), but it is hard to say for sure how that case should be
+% treated.
+%
+% \begin{macrocode}
+\def\mtxtomtx_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \eval_expr_to\a_count{\scale{#6}{\int{x-scale}}}
+ \eval_expr_to\b_count{\scale{#7}{\int{y-scale}}}
+ \eval_expr_to\c_count{\scale{#8}{\int{y-scale}}}
+ \eval_expr_to\d_count{#9} \eval_expr{#7}
+ \multiply \d_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \d_count
+ \rounded_thousandths
+ \d_count=\result
+ \eval_expr{\scale{#4}{\int{y-scale}}}
+ \ifisstr{etx-name}\then
+ \bgroup
+ \let\aliased=\first_of_two
+ \if_undefined{slots-#1}\then
+ \egroup \e_count=\m@ne
+ \else
+ \expandafter\egroup \expandafter\e_count
+ \csname slots-#1\endcsname
+ \fi
+ \else
+ \e_count=#5
+ \fi
+ \out_line{
+ \ifnum \e_count>\m@ne
+ \string\setscaledrawglyph
+ \else
+ \string\setscalednotglyph
+ \fi
+ {#1}{\raw_font_name}{#3}{\the\result}{\the\e_count}
+ {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mtxtomtx_setkern}
+% Kerns are transformed as the $x$-coordinate of a point on the
+% baseline.
+%
+% \begin{macrocode}
+\def\mtxtomtx_setkern#1#2#3{
+ \eval_expr{\scale{\int{x-scale}}{#3}}
+ \out_line{\string\setkern{#1}{#2}{\the\result}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mtxtomtx_setglyph}
+% \begin{macro}{\mtxtomtx_samesize}
+% \begin{macro}{\mtxtomtx_endsetglyph}
+% \begin{macrocode}
+\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}}
+\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}}
+\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+% \begin{macro}{\mtxtomtx_glyphpcc}
+% |#2| is transformed as the $x$-coordinate and |#3| is transformed
+% as the $y$-coordinate of a point---the same point for both
+% parameters.
+%
+% \begin{macrocode}
+\def\mtxtomtx_glyphpcc#1#2#3{
+ \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}}
+ \eval_expr_to\a_count{#2} \eval_expr{#3}
+ \multiply \a_count \int{x-scale}
+ \global\multiply \result \int{slant-scale}
+ \global\advance \result \a_count
+ \rounded_thousandths
+ \out_lline{\string\glyphpcc{#1}{\the\result}{\the\b_count}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Changing glyph names}
+% \label{Ssec:Reglyph}
+%
+% \package{fontinst} uses names to identify glyphs, and if for example
+% the font in question is a postscript font, then names will also be used
+% to identify glyphs in the printer. Between those two points however,
+% and in particular inside \TeX\ itself, glyphs are represented with
+% numbers (slots). Therefore there is no real need for the glyph names
+% used within \package{fontinst} and the glyph names used in the printer
+% (the names gotten from the AFM file) to be equal, but they usually are.
+% There are some cases though where the glyph names of a font are
+% unsuitable for use with \package{fontinst}---mainly because
+% \package{fontinst} can mix glyphs from different printer fonts---and
+% therefore \package{fontinst} also offers the ability to automatically
+% change the names of glyphs in transformable metric files.
+%
+% \begin{macro}{\reglyphfonts}
+% \changes{1.912}{2000/01/15}{Added local resetting of
+% \cs{setsomething_global} to \cs{relax}. It shouldn't be needed,
+% since \cs{reglyphfonts} should not occur between \cs{installfonts}
+% and \cs{endinstallfonts}, but I bet someone will try. (LH)}
+% \begin{macro}{\endreglyphfonts}
+% \begin{quote}
+% |\reglyphfonts| \meta{reglyphing commands} |\endreglyphfonts|
+% \end{quote}
+% \begin{macrocode}
+\def\reglyphfonts{
+ \begingroup
+ \let\setsomething_global=\x_relax
+ \x_setint{renameweight}{1}
+ \x_setint{killweight}{-10}
+ \setcommand\iftokeep##1\then{\ifnum -1<##1}
+}
+\def\endreglyphfonts{\endgroup}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% The \meta{reglyphing commands} are
+% \begin{quote}
+% |\renameglyph|\marg{to}\marg{from}\\
+% |\renameglyphweighted|\marg{to}\marg{from}\marg{weight}\\
+% |\killglyph|\marg{glyph}\\
+% |\killglyphweighted|\marg{glyph}\marg{weight}\\
+% |\offmtxcommand|\marg{command}\\
+% |\onmtxcommand|\marg{command}\\
+% |\reglyphfont|\marg{destination font}\marg{source font}
+% \end{quote}
+% The only reglyphing command that actually convert the names of any
+% glyphs is \DescribeMacro{\reglyphfont}|\reglyph|\-|font|; it reads a font
+% \meta{source font} (which may be of type MTX, PL, AFM, or VPL) and
+% writes another font \meta{destination font} in which the names of
+% glyphs have been converted. All the other commands control \emph{how}
+% this conversion should be made, and these settings get cleared at the
+% closing |\endreglyphfonts|.
+%
+% The conversion works in two ways. First of all, the names of the
+% glyphs can be changed. This works as a general mapping and is
+% controlled by the \DescribeMacro{\renameglyph}|\renameglyph| and
+% \DescribeMacro{\renameglyphweighted}|\renameglyphweighted|
+% commands. Any mensioning of the glyph \meta{from} in a command will be
+% converted to a mensioning of the glyph \meta{to}, if that command
+% survives the conversion. The other way the conversion works is that it
+% can selectively kill---refrain from including in \meta{destination
+% font}---commands in the metric file. This part weighs in several
+% factors.
+%
+% For one thing, one can specify that all metric commands of a certain
+% type should be killed, and this is done with the
+% \DescribeMacro{\offmtxcommand}|\offmtxcommand| command. For example,
+% one can see to that all kerning commands are killed by
+% \begin{quote}
+% |\offmtxcommand{\setkern}|
+% \end{quote}
+% The effect is the same as that of saying
+% \begin{quote}
+% |offkern,|\meta{destination font}|,onkern|
+% \end{quote}
+% rather than just \meta{destination font} in the second argument to
+% |\installfont|, but it is somewhat faster since less text is written
+% to and subsequently read from the \meta{destination font}|.mtx| file.
+% The effect of a previous |\offmtxcommand| can be canceled by a call to
+% \DescribeMacro{\onmtxcommand}|\onmtxcommand|, just like with
+% |\offcommand| and |\oncommand|.
+%
+% The survivance of a command is also affected by the glyphs it refers to.
+% Each glyph has a \emph{weight} associated with it and the sum of the
+% weights for all glyphs mensioned by a command is also used to decide
+% whether that command should survive. The test here is performed by the
+% macro \DescribeMacro{\iftokeep}|\iftokeep|, whose parameter text
+% must be |#1\then|, where |#1| will be a |\count| register. This
+% macro must eventually expand to an if of some sort and that if
+% evaluating to true is interpreted as that the command should be kept.
+% The default replacement text is |\ifnum -1<#1|, which causes a command
+% to be killed (not kept) iff the sum of weights for it is negative.
+%
+% The weight of a glyph is set by |\rename|\-|glyph|,
+% |\rename|\-|glyph|\-|weighted|,
+% \DescribeMacro{\killglyph}|\kill|\-|glyph|, and
+% \DescribeMacro{\killglyphweighted}|\kill|\-|glyph|\-|weighted|. The
+% |\rename|\textellipsis\ commands also set a new name for the glyph if
+% it survives, whereas the |\kill|\textellipsis\ commands will keep the
+% old name. Since the standard settings are that a
+% |\rename|\textellipsis\ weight is small and positive and a
+% |\kill|\textellipsis\ weight is large and negative, glyphs for which
+% a |\kill|\textellipsis\ has been done will usually not survive.
+%
+% Any one of |\rename|\-|glyph|, |\rename|\-|glyph|\-|weighted|,
+% |\kill|\-|glyph|, and |\kill|\-|glyph|\-|weighted| for a glyph will
+% override all previous settings
+% by any of these four commands for that glyph. The equivalent of the
+% neutral state for a glyph (no settings by any of these commands have
+% been made for that glyph) is achieved by the command
+% \begin{quote}
+% |\killglyphweighted|\marg{glyph}|{0}|
+% \end{quote}
+%
+%
+% \begin{macro}{\offmtxcommand}
+% \begin{macro}{\onmtxcommand}
+% These two are just special forms of |\offcommand| and |\oncommand|.
+% \begin{macrocode}
+\def\offmtxcommand#1{
+ \x_cs\offcommand{reglyph_\expandafter\gobble_one\string#1}
+}
+\def\onmtxcommand#1{
+ \x_cs\oncommand{reglyph_\expandafter\gobble_one\string#1}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \describecsfamily{slots-\meta{glyph}}Inside a |\reglyphfonts|
+% \textellipsis\ |\endreglyphfonts| block, the family
+% |\slots-|\meta{glyph} of control sequences is used to store the
+% information about how glyph \meta{glyph} should be converted. These
+% control sequences are either undefined or parameterless macros
+% whose replacement texts are of one of the forms
+% \begin{quote}
+% |\rename_glyph|\marg{to}\marg{weight}\\
+% |\rename_glyph|\marg{to}|\i-renameweight|\\
+% |\kill_glyph|\marg{weight}\\
+% |\kill_glyph\i-killweight|
+% \end{quote}
+% \meta{to} is what the glyph will be renamed to and \meta{weight} is
+% the associated weight. These four different forms are generated by
+% the four different commands |\renameglyphweighted|, |\renameglyph|,
+% |\killglyphweighted|, and |\killglyph| respectively.
+%
+% \begin{macro}{\renameglyph}
+% \begin{macro}{\renameglyphweighted}
+% The difference between the commands |\renameglyphweighted| and
+% |\renameglyph| is that the former lets one specify the weight exactly
+% while the latter will use the value of the integer |renameweight|
+% \emph{at the time of conversion}. By changing the value of
+% |renameweight| between two conversions, one changes the weights
+% used for all glyph renamings declared using |\renameglyph|.
+% \begin{macrocode}
+\begingroup
+ \catcode`\-=11
+ \gdef\renameglyph#1#2{
+ \x_cs\edef{slots-#2}{
+ \noexpand\rename_glyph{#1}\noexpand\i-renameweight
+ }
+ }
+\endgroup
+% \end{macrocode}
+% \begin{macrocode}
+\def\renameglyphweighted#1#2#3{
+ \eval_expr{#3}
+ \x_cs\edef{slots-#2}{\noexpand\rename_glyph{#1}{\the\result}}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\killglyph}
+% \begin{macro}{\killglyphweighted}
+% The difference between the commands |\killglyphweighted| and
+% |\killglyph| is that the former lets one specify the weight exactly
+% while the latter will use the value of the integer |killweight|
+% \emph{at the time of conversion}. By changing the value of
+% |killweight| between two conversions, one changes the weights
+% used for all glyph killings declared using |\killglyph|.
+% \begin{macrocode}
+\begingroup
+ \catcode`\-=11
+ \gdef\killglyph#1{
+ \x_cs\def{slots-#1}{\kill_glyph\i-killweight}
+ }
+\endgroup
+% \end{macrocode}
+% \begin{macrocode}
+\def\killglyphweighted#1#2{
+ \eval_expr{#2}
+ \x_cs\edef{slots-#1}{\noexpand\kill_glyph{\the\result}}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\reglyphfont}
+% The command
+% \begin{quote}
+% |\reglyphfont|\marg{destination font}\marg{source font}
+% \end{quote}
+% reads the font metric file \meta{source font}|.mtx| (which must be
+% transformable), \meta{source font}|.pl|, or \meta{source font}|.afm|
+% (the possibilities are tried in that order) and writes out a font
+% metric file \meta{destination font}|.mtx| that is the converted (as
+% described above) form of the source font.
+%
+% \meta{destination font} and \meta{source font} may not be equal.
+% \changes{1.903}{1999/06/01}{Using \cs{fromany} for locating font.
+% (LH)}
+% \changes{1.904}{1999/06/16}{Added \cs{record_transform}. (LH)}
+% \begin{macrocode}
+\def\reglyphfont#1#2{
+ \fromany{#2}
+ \ifisstr{afm-name}\then
+ \reglyph_font{#1}{#2}
+ \else
+ \fontinsterror{Reglyph}{Could~not~find~font~metrics~for~#2.}
+ \error_help_a
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reglyph_font}
+% This macro does the actual conversion.
+% \begin{macrocode}
+\def\reglyph_font#1#2{{
+ \open_out{\temp_prefix#1.mtx}
+ \out_line{\percent_char~Filename:~#1.mtx}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using:~\string\reglyphfont{#1}{#2}}
+ \out_line{}
+ \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.}
+ \out_line{}
+ \out_line{\string\relax}
+ \out_line{\string\metrics}
+ \out_line{}
+ \out_line{\string\needsfontinstversion{\fontinstversion}}
+ \out_line{}
+ \record_transform{#1}{\string\frommtx{#2}}{\string\reglyphfont}
+ \iftrue
+ \out_line{}
+ \reglyph_redefinitions
+ \inputmtx{#2}
+ \out_line{}
+ \out_line{\endmetrics_text}
+ \close_out{Reglyphed~metrics}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reglyph_redefinitions}
+% This macro serves as a hook. One can make additional commands
+% transformable by appending suitable redefenitions of them to this
+% macro.
+% \changes{1.927}{2003/12/08}{Macro added. The code used to be in
+% \cs{reglyph_font}. (LH)}
+% \begin{macrocode}
+\def\reglyph_redefinitions{
+ \let\setint=\reglyph_setint
+ \let\setdim=\reglyph_setdim
+ \let\setstr=\reglyph_setstr
+ \let\setscaledrawglyph=\reglyph_setscaledrawglyph
+ \let\setscalednotglyph=\reglyph_setscaledrawglyph
+ \let\setkern=\reglyph_setkern
+ \let\setglyph=\reglyph_setglyph
+ \let\glyphpcc=\reglyph_glyphpcc
+ \let\samesize=\reglyph_samesize
+ \let\endsetglyph=\reglyph_endsetglyph
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reglyph_setint}
+% \begin{macro}{\reglyph_setdim}
+% \begin{macro}{\reglyph_setstr}
+% These are just copied to the file generated.
+% \begin{macrocode}
+\def\reglyph_setint#1#2{\out_line{\string\setint{#1}{#2}}}
+\def\reglyph_setdim#1#2{\out_line{\string\setdim{#1}{#2}}}
+\def\reglyph_setstr#1#2{\out_line{\string\setstr{#1}{#2}}}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+% \begin{macro}{\command_survivance}
+% This |\count| register stores the sum of the weights associated
+% with the glyphs considered so far. It is updated by |\rename_glyph|
+% and |\kill_glyph|.
+% \begin{macrocode}
+\newcount\command_survivance
+% \end{macrocode}
+% \end{macro}
+%
+% The macro \DescribeMacro{\glyphname}|\glyphname| holds the name of
+% the glyph currently under consideration. It is altered by
+% |\rename_glyph|.
+%
+% \begin{macro}{\rename_glyph}
+% \begin{macro}{\kill_glyph}
+% \begin{macrocode}
+\def\rename_glyph#1{\def\glyphname{#1}\kill_glyph}
+\def\kill_glyph#1{\advance \command_survivance #1\x_relax}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\reglyph_setscaledrawglyph}
+% \changes{1.915}{2000/06/25}{Corrected bug in the \cs{ifnum}: it
+% should test argument \#5, not \#4. (LH) Encountered by Thierry
+% Bouche.}
+% The |\reglyph_|\-|setscaled|\-|rawglyph| macro is straightforward.
+% Whether it writes a |\setscaled|\-|rawglyph| or a |\setscaled|\-^^A
+% |notglyph| command depends on the fifth parameter, just like with
+% |\mtxtomtx_|\-|setscaled|\-|rawglyph|.
+% \begin{macrocode}
+\def\reglyph_setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{
+ \ifnum #5<\z@
+ \string\setscalednotglyph
+ \else
+ \string\setscaledrawglyph
+ \fi
+ {\glyphname}{#2}{#3}{\number#4}{#5}{#6}{#7}{#8}{#9}
+ }
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reglyph_setkern}
+% \begin{macrocode}
+\def\reglyph_setkern#1#2#3{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \let\a_macro=\glyphname
+ \def\glyphname{#2}
+ \csname slots-#2\endcsname
+ \iftokeep\command_survivance\then
+ \out_line{\string\setkern{\a_macro}{\glyphname}{#3}}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reglyph_setglyph}
+% \multchanges{\cs{reglyph_glyphpcc}\cs{reglyph_samesize}^^A
+% \cs{reglyph_setglyph}}{1.911}{1999/12/10}{\cs{string}
+% which should be \cs{noexpand} corrected. (LH) Reported by
+% Rolf Lindgren.}
+% \begin{macro}{\off-\reglyph_setglyph}
+% \begin{macro}{\reglyph_glyphpcc}
+% \changes{1.911}{1999/12/10}{Typo corrected. (LH) Spotted by Rolf
+% Lindgren.}
+% \begin{macro}{\reglyph_samesize}
+% \begin{macro}{\reglyph_endsetglyph}
+% In |\setglyph| \textellipsis\ |\endsetglyph| constructions (which
+% are written for composite characters in AFM files), the decision of
+% whether to write a command or not due to glyph weights is done
+% only once for the entire construction. This means that the commands
+% must be saved until the |\endsetglyph| where the result is finally
+% known. The token list register |\a_toks| is used for this purpose.
+% \begin{macrocode}
+\def\reglyph_setglyph#1{
+ \command_survivance=0
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_line{\string\setglyph{\glyphname}}}
+ \a_toks=\expandafter{\a_macro}
+}
+\x_cs\def{off-\string\reglyph_setglyph}#1{\gobble_glyph}
+% \end{macrocode}
+% \begin{macrocode}
+\def\reglyph_glyphpcc#1#2#3{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\glyphpcc{\glyphname}{#2}{#3}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\reglyph_samesize#1{
+ \def\glyphname{#1}
+ \csname slots-#1\endcsname
+ \edef\a_macro{\noexpand\out_lline{
+ \string\samesize{\glyphname}
+ }}
+ \a_toks=\expandafter{\the\expandafter\a_toks \a_macro}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\reglyph_endsetglyph{
+ \iftokeep\command_survivance\then
+ \the\a_toks
+ \out_line{\string\endsetglyph}
+ \fi
+ \a_toks={}
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+%
+%
+% \subsubsection*{Three common reglyphing schemes}
+%
+% As is mensioned elsewhere, the most common reglyphing operation is to
+% take a caps and small caps font produced by some major foundry and
+% change the glyph names so that they agree with the glyph names used in
+% expert fonts. The following code contains the modifying reglyphing
+% commands to set up this reglyphing, in two different variants.
+%
+% The commands are currently based on a comparision of Adobe Garamond
+% Small Caps \& Oldstyle Figures (\texttt{padrc8a} in the Berry
+% scheme) with Adobe Garamond Regular Expert (\texttt{padr8x} in the
+% Berry scheme), so they should be correct for a fair amount of Adobe
+% font families, but it is also highly probable that there are lots of
+% fonts out there for which it doesn't work quite right. In case you do
+% find such a font, please write to tell the \package{fontinst} mailing
+% list about it---it would be rather easy to add various alternative
+% set-up schemes, controlled by switches, to these files. Just make sure
+% first (by checking the newest version of \package{fontinst}) that the
+% alternative setting you have found hasn't already been included.
+%
+% As mentioned, there are two different reglyphing schemes that are set
+% up by the code below---one has \package{docstrip} guard \Module{glyphs},
+% the other has guard \Module{!glyphs}---but they both change SC names
+% to Expert names. The difference lies instead in what information is
+% copied from source font to destination font: the \Module{glyphs}
+% variant copies everything, whereas the \Module{!glyphs} variant
+% doesn't copy |\setrawglyph| commands, |\setnotglyph| commands,
+% |\setscaledrawglyph| commands, |\setscalednotglyph| commands or
+% |\setglyph| constructions. The \Module{!glyphs} variant also
+% suppresses kerns between two glyphs that doesn't change name.
+%
+% The motive for having such a curious set-up naturally lies in how the
+% files are meant to be used. If you have SC fonts, but no Expert
+% fonts, then you should definitely use the \Module{glyphs} variant. If
+% on the other hand you have both SC and Expert fonts for a family,
+% then it is worth considering using the \Module{!glyphs} variant instead.
+% The observation this is based on is that within a triad of the
+% corresponding regular, expert, and SC fonts, almost all glyphs present
+% in the SC font can also be found in either the regular or the expert
+% font; furthermore the only missing glyphs were \texttt{FIsmall},
+% \texttt{FLsmall}, and \texttt{SSsmall}, which (i) were included in the
+% SC font only to complete the \texttt{8a} encoding vector and (ii) are
+% identical to \package{fontinst}'s fakes for them.
+%
+% Thus by constructing the \texttt{sc} shape fonts from the regular and
+% expert variants, instead of the SC variant, one can get away with
+% using one raw font less, thus reducing the time needed for downloading
+% the fonts to the printer and the size of the corresponding postscript
+% file. One thing not found in either of the regular or expert font in
+% the triad is however the kerns between capitals and small capitals, but
+% these can be extracted from the metrics of the SC font, and doing this
+% is the primary objective for the \Module{!glyphs} variant.
+%
+% \bigskip
+% \changes{1.906}{1999/08/01}{Reglyphing settings files added. (LH)}
+%
+% First there is the English alphabet:
+% \begin{macrocode}
+%<*reglyphletters>
+\renameglyph{Asmall}{a}
+\renameglyph{Bsmall}{b}
+\renameglyph{Csmall}{c}
+\renameglyph{Dsmall}{d}
+\renameglyph{Esmall}{e}
+\renameglyph{Fsmall}{f}
+\renameglyph{Gsmall}{g}
+\renameglyph{Hsmall}{h}
+\renameglyph{Ismall}{i}
+\renameglyph{Jsmall}{j}
+\renameglyph{Ksmall}{k}
+\renameglyph{Lsmall}{l}
+\renameglyph{Msmall}{m}
+\renameglyph{Nsmall}{n}
+\renameglyph{Osmall}{o}
+\renameglyph{Psmall}{p}
+\renameglyph{Qsmall}{q}
+\renameglyph{Rsmall}{r}
+\renameglyph{Ssmall}{s}
+\renameglyph{Tsmall}{t}
+\renameglyph{Usmall}{u}
+\renameglyph{Vsmall}{v}
+\renameglyph{Wsmall}{w}
+\renameglyph{Xsmall}{x}
+\renameglyph{Ysmall}{y}
+\renameglyph{Zsmall}{z}
+%</reglyphletters>
+% \end{macrocode}
+%
+% Then there are the figures:
+% \multchanges{\notcs{Reglyphing}}{1.911}{1999/12/10}
+% {\texttt{eightoldstyle} typo corrected. (LH) Spotted by
+% Rolf Lindgren.}
+% \multchanges{\notcs{Reglyphing}}{1.927}{2004/07/12}
+% {Placed commands for letters and figures in separate modules,
+% so that they can be separated in generation. (LH)}
+% \begin{macrocode}
+%<*reglyphfigures>
+\renameglyph{zerooldstyle}{zero}
+\renameglyph{oneoldstyle}{one}
+\renameglyph{twooldstyle}{two}
+\renameglyph{threeoldstyle}{three}
+\renameglyph{fouroldstyle}{four}
+\renameglyph{fiveoldstyle}{five}
+\renameglyph{sixoldstyle}{six}
+\renameglyph{sevenoldstyle}{seven}
+\renameglyph{eightoldstyle}{eight}
+\renameglyph{nineoldstyle}{nine}
+%</reglyphfigures>
+% \end{macrocode}
+%
+% Then there are the accents and a couple of miscellaneous symbols. You
+% might want to check these carefully, as there might not always be a
+% distinction.
+% \changes{1.925}{2003/05/13}{Added \cs{renameglyph} for
+% \texttt{Hungarumlautsmall}. Walter Schmidt noticed it was missing.
+% (LH)}
+% \begin{macrocode}
+%<*reglyphletters>
+\renameglyph{Acutesmall}{acute}
+\renameglyph{Brevesmall}{breve}
+\renameglyph{Caronsmall}{caron}
+\renameglyph{Cedillasmall}{cedilla}
+\renameglyph{Circumflexsmall}{circumflex}
+\renameglyph{Dieresissmall}{dieresis}
+\renameglyph{Dotaccentsmall}{dotaccent}
+\renameglyph{Gravesmall}{grave}
+\renameglyph{Hungarumlautsmall}{hungarumlaut}
+\renameglyph{Macronsmall}{macron}
+\renameglyph{Ogoneksmall}{ogonek}
+\renameglyph{Ringsmall}{ring}
+\renameglyph{Tildesmall}{tilde}
+\renameglyph{ampersandsmall}{ampersand}
+\renameglyph{centoldstyle}{cent}
+\renameglyph{dollaroldstyle}{dollar}
+% \end{macrocode}
+%
+% There are also all the non-English letters:
+% \begin{macrocode}
+\renameglyph{AEsmall}{ae}
+\renameglyph{Ethsmall}{eth}
+\renameglyph{Lslashsmall}{lslash}
+\renameglyph{Oslashsmall}{oslash}
+\renameglyph{OEsmall}{oe}
+\renameglyph{Thornsmall}{thorn}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Agravesmall}{agrave}
+\renameglyph{Egravesmall}{egrave}
+\renameglyph{Igravesmall}{igrave}
+\renameglyph{Ogravesmall}{ograve}
+\renameglyph{Ugravesmall}{ugrave}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Aacutesmall}{aacute}
+\renameglyph{Eacutesmall}{eacute}
+\renameglyph{Iacutesmall}{iacute}
+\renameglyph{Oacutesmall}{oacute}
+\renameglyph{Uacutesmall}{uacute}
+\renameglyph{Yacutesmall}{yacute}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Acircumflexsmall}{acircumflex}
+\renameglyph{Ecircumflexsmall}{ecircumflex}
+\renameglyph{Icircumflexsmall}{icircumflex}
+\renameglyph{Ocircumflexsmall}{ocircumflex}
+\renameglyph{Ucircumflexsmall}{ucircumflex}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Atildesmall}{atilde}
+\renameglyph{Ntildesmall}{ntilde}
+\renameglyph{Otildesmall}{otilde}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Adieresissmall}{adieresis}
+\renameglyph{Edieresissmall}{edieresis}
+\renameglyph{Idieresissmall}{idieresis}
+\renameglyph{Odieresissmall}{odieresis}
+\renameglyph{Ydieresissmall}{ydieresis}
+\renameglyph{Udieresissmall}{udieresis}
+% \end{macrocode}
+% \begin{macrocode}
+\renameglyph{Aringsmall}{aring}
+\renameglyph{Ccedillasmall}{ccedilla}
+\renameglyph{Scaronsmall}{scaron}
+\renameglyph{Zcaronsmall}{zcaron}
+% \end{macrocode}
+%
+% The following four glyphs aren't really necessary, since they are
+% usually identical to another glyph or to their fakes.
+% \begin{macrocode}
+\killglyph{dotlessi}
+%<*glyphs>
+\renameglyph{FIsmall}{fi}
+\renameglyph{FLsmall}{fl}
+\renameglyph{SSsmall}{germandbls}
+%</glyphs>
+%<*!glyphs>
+\killglyph{fi}
+\killglyph{fl}
+\killglyph{germandbls}
+%</!glyphs>
+%</reglyphletters>
+% \end{macrocode}
+%
+% The \Module{!glyphs} settings have no need for |\setrawglyph|,
+% |\setscaledrawglyph|, or |\setglyph| commands, and no need for the
+% kerns between capitals either, since these are already known from the
+% regular variant. Note that it is pointless to say |\offmtxcommand|^^A
+% \penalty0|\setrawglyph| as of v\,1.913 since |\setrawglyph| is now
+% simply syntactic sugar for the equivalent |\set|\-|scaled|\-|raw|\-^^A
+% |glyph|.
+% \begin{macrocode}
+%<*(reglyphletters|reglyphfigures)&!glyphs>
+\offmtxcommand\setscaledrawglyph
+\offmtxcommand\setglyph
+\resetcommand\iftokeep#1\then{\ifnum 0<#1}
+%</(reglyphletters|reglyphfigures)&!glyphs>
+% \end{macrocode}
+%
+%
+% \changes{1.904}{1999/06/13}{Font transformation recordings moved to
+% \texttt{fimapgen.dtx}, so that the interface will be specified
+% in a single place. (LH)}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \Finale
+\endinput \ No newline at end of file
diff --git a/fonts/utilities/fontinst/source/filtfam.dtx b/fonts/utilities/fontinst/source/filtfam.dtx
new file mode 100644
index 0000000000..1cfcf6c1f0
--- /dev/null
+++ b/fonts/utilities/fontinst/source/filtfam.dtx
@@ -0,0 +1,1187 @@
+% \CheckSum{1041}
+% \iffalse meta-comment
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% From file: filtfam.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+\GetFileInfo{filtfam.dtx}
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth}
+\begin{document}
+\maketitle
+\DocInput{filtfam.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \section{Installing Latin families}
+%
+% \changes{1.800}{1998/06/22}{\cs{textcompfamily} integrated into
+% \cs{latinfamily}. (UV)}
+%
+% \begin{macro}{\latinfamily}
+% The macro:
+% \begin{quote}
+% |\latinfamily|\marg{family}\marg{commands}
+% \end{quote}
+% installs a Latin font family.
+%
+% \StopEventually{}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\latinfamily#1#2{{
+ \edef\a_macro{#1}
+ \expandafter\parse_family\a_macro
+ \empty_command\empty_command\end_parse_family
+ \installfonts
+ \if_file_exists{\raw_encoding.mtx}\then
+ \installfamily{\raw_encoding}{\latex_family}{#2}
+ \fi
+ \installfamily{OT1}{\latex_family}{#2}
+ \installfamily{T1}{\latex_family}{#2}
+%<*textcomp>
+ \installfamily{TS1}{\latex_family}{#2}
+%</textcomp>
+ \latin_weights
+ \endinstallfonts
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\parse_family}
+% \begin{macro}{\font_family}
+% \begin{macro}{\font_variant}
+% \begin{macro}{\raw_variant}
+% \begin{macro}{\latex_variant}
+% |\parse_family FAMILY\end_parse_family|
+%
+% Intializes |\latex_family| to |FAMILY|, |\font_family| to first
+% three characters of |FAMILY|, |\font_variant| and |\raw_variant|
+% to fourth and fifth character (if present).
+%
+% SPQR 02/95: If the fourth parameter is |x| or |9|, then its an expert
+% indication, not a variant. So initialy set |\raw_variant| to |#4|,
+% but unset it if the expert test succeeds. When |#4| is used for a
+% real variant, it passes through.
+%
+% SPQR 05/95: If it \emph{is} an expert font, then the variantness
+% is expressed by the encoding, not a variant letter, so unset
+% |\font_variant|.
+%
+% UV 06/98: Added |\if_oldstyle_| code from Alan's v~1.511 beta.
+% If the fourth parameter is |9|, treat it as if |j| was given.
+%
+% Note that instead of using |\setcommand\digit|, we now use separate
+% encoding files for |T1j.etx|, etc.
+%
+% \begin{macrocode}
+\def\parse_family #1#2#3#4#5\end_parse_family{
+ \gdef\font_family{#1#2#3}
+ \gdef\font_variant{#4#5}
+ \gdef\raw_variant{#4#5}
+ \gdef\latex_family{#1#2#3#4#5}
+ \_expert_false
+ \_oldstyle_false
+ \ifx#4x
+ \_expert_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1}
+ \else\ifx#4j
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else\ifx#49
+ \gdef\latex_family{#1#2#3j#5}
+ \_expert_true
+ \_oldstyle_true
+ \gdef\raw_variant{#5}
+ \gdef\font_variant{#5}
+ %\setcommand\digit##1{##1oldstyle}
+ \else
+ \_expert_false
+ \_oldstyle_false
+ %\setcommand\digit##1{##1}
+ \fi\fi\fi
+%<*debug>
+ \if_oldstyle_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(oldstyle)}
+ \else\if_expert_
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#5>~(expert)}
+ \else
+ \immediate\write16{INFO>~parse~family~<#1#2#3><#4#5>}
+ \fi\fi
+%</debug>
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if_expert_}
+% \begin{macro}{\if_oldstyle_}
+% \begin{macrocode}
+\newif\if_expert_
+\newif\if_oldstyle_
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Processing a list of weights, widths and shapes}
+%
+% \begin{macro}{\latin_weight}
+% \begin{macro}{\font_weight}
+% \begin{macro}{\latex_weight}
+% |\latin_weight{FONTWEIGHT}{LATEXWEIGHT}|
+%
+% \begin{macrocode}
+\def\latin_weight#1#2{
+ \gdef\font_weight{#1}%
+ \gdef\latex_weight{#2}%
+ \latin_widths
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\latin_width}
+% \begin{macro}{\font_width}
+% \begin{macro}{\latex_width}
+% |\latin_width{FONTWIDTH}{LATEXWIDTH}|
+%
+% \begin{macrocode}
+\def\latin_width#1#2{
+ \gdef\font_width{#1}
+ \gdef\latex_width{#2}
+ \latin_shapes
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\latin_shape}
+% \begin{macro}{\font_shape}
+% \begin{macro}{\raw_shape}
+% \begin{macro}{\encoding_shape}
+% \begin{macro}{\latex_shape}
+% \begin{macro}{\encoding_switches}
+% |\latin_shape{FONTSHAPE}{RAWSHAPE}{ENCODINGSHAPE}{LATEXSHAPE}{SWITCHES}|
+%
+% Calls |\fake_width_WIDTH| and |\fake_shape_SHAPE| to generate an
+% |8r|-reencoded |.mtx| file. If successful, calls |\latin_encodings|.
+%
+% UV 06/98: Added a fifth argument |SWITCHES|, which may be used
+% to set |\if_textcomp_| before it is evaluated in |\latin_encodings|.
+%
+% \begin{macrocode}
+\def\latin_shape#1#2#3#4#5{
+ \gdef\font_shape{#1}
+ \gdef\raw_shape{#2}
+ \gdef\encoding_shape{#3}
+ \if_oldstyle_
+ \gdef\encoding_shape{#3\oldstyle_shape}
+ \fi
+ \gdef\latex_shape{#4}
+ \gdef\encoding_switches{#5}
+%<*debug>
+ \immediate\write16{
+ INFO>~to~make~LaTeX~font~shape~<\latex_family,
+ \latex_weight,\latex_shape,\latex_width>~seek~
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx}
+%</debug>
+ \csname fake_width_\font_width\endcsname
+ \csname fake_shape_\raw_shape\endcsname
+ \if_file_exists{
+ \font_family\font_weight\raw_shape
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \latin_encodings
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Faking font shapes}
+%
+% (CK) changed font faking code; based on SPQR's code (still in this
+% file). I am not sure that know what I am doing here; let's hope
+% I won't be caught. Also changed: Order of |\font_width| and
+% |\font_encoding| in MANY places. Also added tests which prevent
+% multiple calls to the same font faking routine. (Seems to be
+% necessary in some cases and can't hurt.) --- (ASAJ) I think CK
+% knows more about what he's doing than he's letting on.
+%
+% \begin{macro}{\fake_shape_}
+% Check if an |8a|-encoded |.afm| file exists for current combination
+% of font attributes, and, if so, call |\fake_shape_raw_encoding|.
+% For expert fonts, also check if an |8x|-encoded |.afm| file exists,
+% and call |\fake_shape_expert_encoding|, if approporiate.
+%
+% UV, 06/98: Cut down lengthy |\fake_shape_| routine into several
+% subroutines |\fake_shape_raw_encoding| and optionally
+% |\fake_shape_expert_encoding| and |\fake_shape_oldstyle_encoding|.
+%
+% UV, 06/98: Added experimental code to install OsF or SC\&OsF fonts.
+%
+% \begin{macrocode}
+\def\fake_shape_{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_raw_encoding
+ \fi
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.afm
+ }\then
+ \fake_shape_expert_encoding
+ \fi
+ \fi
+%<*oldstyle>
+ \if_oldstyle_
+ \gdef\oldstyle_variant{\oldstyle_shape}
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_oldstyle_encoding
+ \else
+ \gdef\oldstyle_variant{\caps_shape}
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_oldstyle_encoding
+ \fi
+ \fi
+ \fi
+%</oldstyle>
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_raw_encoding}
+% Called from |\fake_shape_| if an |8a|-encoded |.afm| file was found.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>8r}|\\
+% | {\reencodefont{8r}{\fromafm{<FONT>8a}}}|
+% \end{quote}
+% to generate an |8r|-reencoded |.mtx| file (and a raw |.pl| file),
+% followed by
+% \begin{quote}
+% |\installrawfont{<FONT>8r}{<FONT>8r,8r}{8r}...|
+% \end{quote}
+% to install a ligfull |.pl| file.
+%
+% \begin{macrocode}
+\def\fake_shape_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width>
+ }
+%</debug>
+ \transformfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+%</debug>
+ \installrawfont{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_expert_encoding}
+% Called from |\fake_shape_| if an |8x|-encoded |.afm| file was found.
+% Invokes
+% \begin{quote}
+% |\fromafm{<FONT>8x}|
+% \end{quote}
+% to generate an |8x|-encoded |.mtx| file (and a raw |.pl| file).
+%
+% \begin{macrocode}
+\def\fake_shape_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+ \fromafm{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width
+ }
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_oldstyle_encoding}
+% Called from |\fake_shape_| if an OsF or SC\&OsF variant of an
+% |8a|-encoded |.afm| file was found. Invokes
+% \begin{quote}
+% |\transformfont{<FONT>j8r}|\\
+% | {\reencodefont{8r}{\fromafm{<FONT>j8a}}}|
+% \end{quote}
+% to generate an |8r|-reencoded |.mtx| file (and a raw |.pl| file).
+%
+% \begin{macrocode}
+%<*oldstyle>
+\def\fake_shape_oldstyle_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width>
+ }
+%</debug>
+ \transformfont{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_encoding\font_width
+ }{
+ \reencodefont{\raw_encoding}{
+ \fromafm{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \adobe_encoding\font_width
+ }
+ }
+ }
+ \fi
+}
+%</oldstyle>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fake_shape_c}
+% Check if an |8a|-encoded |.afm| file exists for the small caps shape.
+% If so, call |\fake_shape_| to generate an |8r|-reencoded MTX
+% file and to install a ligfull |.pl| file. If not, reset |\raw_shape|
+% to the default shape and |\encoding_shape| to small caps before
+% calling |\fake_shape_| to install a faked small caps font.
+%
+% \begin{macrocode}
+\def\fake_shape_c{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ % If real smallcaps font doesn't exist, fake it from the roman.
+ \gdef\raw_shape{}
+ \if_oldstyle_
+ \gdef\encoding_shape{cj}
+ \else
+ \gdef\encoding_shape{c}
+ \fi
+ \fake_shape_
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fake_shape_o}
+% Check if an |8a|-encoded |.afm| file exists for the oblique shape.
+% If so, call |\fake_shape_| to generate an |8r|-reencoded MTX
+% file and to install a ligfull |.pl| file. If not, call macros
+% to fake a oblique fonts.
+%
+% \begin{macrocode}
+\def\fake_shape_o{
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then
+ \fake_shape_
+ \else
+ \fake_shape_o_raw_encoding
+ \if_expert_
+ \fake_shape_o_expert_encoding
+ \fi
+%<*oldstyle>
+ \if_oldstyle_
+ \fake_shape_o_oldstyle_encoding
+ \fi
+%</oldstyle>
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_o_raw_encoding}
+% Called from |\fake_shape_o| if the oblique shape needs to be faked.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>o8r}|\\
+% | {\slantfont{SLANT}{\frommtx{<FONT>8r}}}|
+% \end{quote}
+% to generate an |8r|-reencoded |.mtx| file (and a raw |.pl| file),
+% followed by
+% \begin{quote}
+% |\installrawfont{<FONT>o8r}{<FONT>o8r,8r}{8r}...|
+% \end{quote}
+% to install a ligfull |.pl| file.
+%
+% \begin{macrocode}
+\def\fake_shape_o_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+%</debug>
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+%</debug>
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_o_expert_encoding}
+% Called from |\fake_shape_o| if the oblique shape needs to be faked.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>o8x}|\\
+% | {\slantfont{SLANT}{\frommtx{<FONT>8x}}}|
+% \end{quote}
+% to generate an |8x|-reencoded |.mtx| file (and a raw |.pl| file).
+%
+% \begin{macrocode}
+\def\fake_shape_o_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\raw_variant
+ \expert_encoding\font_width>~(faking~oblique)
+ }
+%</debug>
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\raw_variant
+ \expert_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_shape_o_oldstyle_encoding}
+% Called from |\fake_shape_o| if the oblique shape needs to be faked.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>oj8r}|\\
+% | {\slantfont{SLANT}{\frommtx{<FONT>j8r}}}|
+% \end{quote}
+% to generate an |8r|-reencoded |.mtx| file (and a raw |.pl| file).
+%
+% \begin{macrocode}
+%<*oldstyle>
+\def\fake_shape_o_oldstyle_encoding{
+ \if_file_exists{
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width>~(faking~oblique)
+ }
+%</debug>
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~oblique~font~
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\oldstyle_variant
+ \raw_encoding\font_width
+ }{
+ \slantfont{\SlantAmount}{
+ \frommtx{
+ \font_family\font_weight\oldstyle_variant
+ \raw_encoding\font_width
+ }
+ }
+ }
+ \fi
+ \fi
+}
+%</oldstyle>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fake_shape_i}
+% Call |\fake_shape_| to generate an |8r|-reencoded |.mtx| file and a
+% ligfull |.pl| file, if a corresponding |8a|-encoded |.afm| file exists.
+% Otherwise, do nothing, since an italic shape can't be faked.
+%
+% \begin{macrocode}
+\let\fake_shape_i\fake_shape_ % We must do this again!
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Faking font widths}
+%
+% \begin{macro}{\if_fake_narrow_}
+% \begin{macrocode}
+\newif\if_fake_narrow_
+\_fake_narrow_false
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fakenarrow}
+% |\fakenarrow{WIDTH}|
+%
+% Sets the expansion factor used to generate faked narrow fonts.
+% If it isn't set, do not attempt to install faked narrow fonts.
+% \begin{macrocode}
+\def\fakenarrow#1{
+ \_fake_narrow_true
+ \gdef\fake_narrow_width{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_width_}
+% Do nothing for the default width or the condensed width.
+% \begin{macrocode}
+\def\fake_width_{}
+\def\fake_width_c{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_width_n}
+% If we are faking narrow fonts, check if an |8a|-encoded |.afm| file
+% exists for the current shape in narrow width, and if not call
+% |\fake_shape_n_raw_encoding| and |\fake_shape_n_expert_encoding|.
+%
+% \begin{macrocode}
+\def\fake_width_n{
+ \if_fake_narrow_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \adobe_encoding\font_width.afm
+ }\then % no action required
+ \else
+ \fake_width_n_raw_encoding
+ \if_expert_
+ \fake_width_n_expert_encoding
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_width_n_raw_encoding}
+% Called from |\fake_width_n| if the narrow width needs to be faked.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>8rn}|\\
+% | {\xscalefont{WIDTH}{\frommtx{<FONT>8r}}}|
+% \end{quote}
+% to generate an |8r|-encoded |.mtx| file for a faked narrow font,
+% followed by
+% \begin{quote}
+% |\installrawfont{<FONT>8rn}{<FONT>8rn,8r}{8r}...|
+% \end{quote}
+% to install a ligfull |.pl| file.
+%
+% \begin{macrocode}
+\def\fake_width_n_raw_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding>~(faking~narrow)
+ }
+%</debug>
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding
+ }
+ }
+ }
+ \if_file_exists{ \raw_encoding.mtx }\then
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\installrawfont\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width>
+ <\font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding>
+ <\raw_encoding>
+ <\raw_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+%</debug>
+ \installrawfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width
+ }{ \font_family\font_weight\font_shape\raw_variant
+ \raw_encoding\font_width,
+ \raw_encoding
+ }{ \raw_encoding
+ }{ \raw_encoding
+ }{ \latex_family
+ }{ \latex_weight\latex_width
+ }{ \latex_shape
+ }{}
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fake_width_n_expert_encoding}
+% Called from |\fake_width_n| if the narrow width needs to be faked.
+% Invokes
+% \begin{quote}
+% |\transformfont{<FONT>8xn}|\\
+% | {\xscalefont{WIDTH}{\frommtx{<FONT>8x}}}|
+% \end{quote}
+% to generate an |8x|-encoded |.mtx| file for a faked narrow font.
+%
+% \begin{macrocode}
+\def\fake_width_n_expert_encoding{
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding.mtx
+ }\then
+ \if_file_exists{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then % no action required
+ \else
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\transformfont\space\space
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width>~from~
+ <\font_family\font_weight\font_shape\raw_variant
+ \expert_encoding>~(faking~narrow)
+ }
+%</debug>
+ %%% WARNING: famtool.pl relies on this message format!!!
+ \immediate\write16{
+ Faking~narrow~font~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ \space from~
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ \transformfont{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding\font_width
+ }{
+ \xscalefont{\fake_narrow_width}{
+ \frommtx{
+ \font_family\font_weight\font_shape\raw_variant
+ \expert_encoding
+ }
+ }
+ }
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Installing reencoded fonts}
+%
+% \begin{macro}{\latin_encoding}
+% \begin{macro}{\font_encoding}
+% \begin{macro}{\latex_encoding}
+% \begin{macro}{\latex_mtx}
+%
+% |\latin_encoding{FONTENC}{EXPERTISED-ENC}{OLDSTYLE-ENC}|
+% |{LATEXENC}{LATEXMTX}|
+%
+% If this is an expertised family |EXPERTISED-ENC| is used instead
+% of |FONTENC|. If this is an expertised family with oldstyle
+% digits |OLDSTYLE-ENC| is used instead of |EXPERTISED-ENC|.
+%
+% UV 06/98: Added code for oldstyle encodings from Alan's v~1.511.
+% The |\font_encoding| is changed when |\if_oldstyle_| is true.
+%
+% UV 06/98: Added anonther parameter for the default metrics file
+% (which is usually either |latin.mtx| or |textcomp.mtx|).
+%
+% UV 06/98: Added experimental code for OsF or SC\&OsF fonts.
+%
+% \begin{macrocode}
+\def\latin_encoding#1#2#3#4#5{
+ \gdef\latex_encoding{#4}
+ \gdef\latex_mtx{#5}
+ \if_oldstyle_
+ \gdef\font_encoding{#3}
+ \else\if_expert_
+ \gdef\font_encoding{#2}
+ \else
+ \gdef\font_encoding{#1}
+ \fi\fi
+ \gdef\expert_font{}
+ \gdef\oldstyle_font{}
+ \if_expert_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width.mtx
+ }\then
+ \gdef\expert_font{
+ \font_family\font_weight\raw_shape\raw_variant
+ \expert_encoding\font_width,
+ }
+ \fi
+ \fi
+%<*oldstyle>
+ \if_oldstyle_
+ \if_file_exists{
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_variant\raw_encoding\font_width.mtx
+ }\then
+ \gdef\oldstyle_font{
+ unsetnum,
+ \font_family\font_weight\raw_shape\oldstyle_variant
+ \raw_variant\raw_encoding\font_width,
+ resetosf,
+ }
+ \fi
+ \fi
+%</oldstyle>
+%<*debug>
+ \immediate\write16{
+ INFO>~run~\string\installfont\space
+ <\font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width>
+ <\font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx>
+ <\latex_encoding\encoding_shape>
+ <\latex_encoding>
+ <\latex_family>
+ <\latex_weight\latex_width>
+ <\latex_shape>}
+%</debug>
+ \installfont{
+ \font_family\font_weight\font_shape\font_variant
+ \font_encoding\font_width
+ }{
+ \font_family\font_weight\raw_shape\raw_variant
+ \raw_encoding\font_width,
+ \if_oldstyle_
+ \ifx\raw_shape\caps_shape
+ resetosf,
+ \fi
+ \fi
+ \expert_font
+ \oldstyle_font
+ \latex_mtx
+ }{
+ \latex_encoding\encoding_shape
+ }{
+ \latex_encoding
+ }{
+ \latex_family
+ }{
+ \latex_weight\latex_width
+ }{
+ \latex_shape
+ }{}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Default weights, widths and shapes}
+%
+% \begin{center}
+% \begin{tabular}{llll}
+% \hline
+% \multicolumn{2}{l}{Fontname: \texttt{weight.map}} &
+% \multicolumn{2}{l}{NFSS: \emph{\LaTeX\ Companion}, p.~190} \\
+% \hline
+% |a| & Thin Hairline & |ul| & Ultra Light \\
+% |j| & ExtraLight & |el| & Extra Light \\
+% |l| & Light & |l| & Light \\
+% |r| & Regular Roman & |m| & Medium \\
+% |k| & Book & |m| & Medium \\
+% |m| & Medium & |mb| & (was: |m|) \\
+% |d| & Demi & |db| & (was: |sb|) \\
+% |s| & Semibold & |sb| & Semibold \\
+% |b| & Bold & |b| & Bold \\
+% |h| & Heavy Heavyface & |eb| & (was missing) \\
+% |c| & Black & |eb| & (was missing) \\
+% |x| & ExtraBold ExtraBlack & |eb| & Extra Bold \\
+% |u| & Ultra UltraBlack & |ub| & Ultra Bold \\
+% |p| & Poster & & (still missing) \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \begin{macro}{\latin_weights}
+% Each call to |\latin_weight| maps a Fontname weight code
+% (|\font_weight|) to a \LaTeX{} weight code (|\latex_weight|).
+% Non-existing weights are ignored (or substituted when the
+% |.fd| files are written out by |\endinstallfont|).
+%
+% The standard values are given in the table. They may be changed,
+% but you'd better know what you're doing.
+%
+% UV, 04/98: Changed the processing order: Do the most common
+% shapes first. Added new mappings for |c| and |h|, changed
+% mapping for |m| to newly invented \LaTeX{} weight |mb|.
+%
+% \begin{macrocode}
+\def\latin_weights{
+ \latin_weight{r}{m}
+ \latin_weight{k}{m}
+ \latin_weight{b}{b}
+ \latin_weight{s}{sb}
+ \latin_weight{d}{db} % was {d}{sb}, SPQR changed
+ \latin_weight{m}{mb} % was {m}{m}, UV changed
+ \latin_weight{c}{eb} % UV added
+ \latin_weight{h}{eb} % UV added
+ \latin_weight{x}{eb}
+ \latin_weight{u}{ub}
+ \latin_weight{l}{l}
+ %\latin_weight{j}{el}
+ %\latin_weight{a}{ul} % UV added
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{center}
+% \begin{tabular}{llll}
+% \hline
+% \multicolumn{2}{l}{Fontname: \texttt{width.map}} &
+% \multicolumn{2}{l}{NFSS: \emph{\LaTeX\ Companion}, p.~190} \\
+% \hline
+% |t| & Thin & -- & -- \\
+% |o| & Ultra Condensed & |uc| & Ultra Condensed \\
+% |u| & Ultra Compressed & |uc| & . . \\
+% |q| & Extra Compressed & |ec| & Extra Condensed \\
+% |c| & Condensed & |c| & Condensed \\
+% |p| & Compressed & |c| & . . \\
+% |n| & Narrow & |c| & . . \\
+% -- & -- & |sc| & Semi Condensed \\
+% |r| & Normal, Medium, Regular & |m| & Medium \\
+% -- & -- & |sx| & Semi Expanded \\
+% |e| & Expanded & |x| & Expanded \\
+% |x| & Extended & |x| & . . \\
+% |v| & Extra Expanded & |ex| & Extra Expanded \\
+% -- & -- & |ux| & Ultra Expanded \\
+% |w| & Wide & -- & -- \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \begin{macro}{\latin_widths}
+% Each call to |\latin_width| maps a Fontname width code
+% (|\font_width|) to a \LaTeX{} width code (|\latex_width|).
+% Non-existing narrow fonts are faked only if |\fakenarrow|
+% is specifically called for.
+%
+% \begin{macrocode}
+\def\latin_widths{
+ \latin_width{}{}
+ \latin_width{n}{c}
+ %latin_width{c}{c}
+ %latin_width{x}{x}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\latin_shapes}
+% The fifth argument of |\latin_shape| is stored in the variable
+% |\encoding_switches|.
+% \begin{macrocode}
+\def\latin_shapes{
+ \latin_shape{} {} {} {n} {\_textcomp_true }
+ \latin_shape{c}{c}{} {sc}{\_textcomp_false}
+ \latin_shape{o}{o}{} {sl}{\_textcomp_true }
+ \latin_shape{i}{i}{i}{it}{\_textcomp_true }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\latin_encodings}
+% |\encoding_switches| is evaluated immediatley before the
+% |\if_textcomp_| test to set it as appropriate for the curent shape.
+% \changes{1.925}{2003/03/31}{Changed from using \texttt{latin.mtx} to
+% \texttt{newlatin.mtx}. (LH)}
+% \begin{macrocode}
+\def\latin_encodings{
+ \latin_encoding{7t}{9t}{9o}{OT1}{newlatin}
+ \latin_encoding{8t}{9e}{9d}{T1} {newlatin}
+%<*textcomp>
+ \encoding_switches
+ \if_textcomp_
+ \latin_encoding{8c}{9c}{9c}{TS1}{textcomp}
+ \fi
+%</textcomp>
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if_textcomp_}
+% Switch to control whether or not to install a text companion
+% encoding. It is set or unset for each shape by |\latin_shapes|
+% and evaluated in |\latin_encodings|.
+%
+% \begin{macrocode}
+\newif\if_textcomp_
+% \end{macrocode}
+% \end{macro}
+
+%
+% \begin{macro}{\raw_encoding}
+% \begin{macro}{\adobe_encoding}
+% \begin{macro}{\expert_encoding}
+% \begin{macrocode}
+\def\raw_encoding{8r}
+\def\adobe_encoding{8a}
+\def\expert_encoding{8x}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\caps_shape}
+% \begin{macro}{\oldstyle_shape}
+% \begin{macrocode}
+\def\caps_shape{c}
+\def\oldstyle_shape{j}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SlantAmount}
+% \begin{macrocode}
+\def\SlantAmount{167}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput \ No newline at end of file
diff --git a/fonts/utilities/fontinst/source/fimain.dtx b/fonts/utilities/fontinst/source/fimain.dtx
new file mode 100644
index 0000000000..8fe61d23a7
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fimain.dtx
@@ -0,0 +1,4965 @@
+% \CheckSum{4056}
+% \iffalse meta-comment
+%
+% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+% hacked and maintained 1997, 1998 Sebastian Rahtz,
+% copyright 1998, 1999, 2000 the fontinst maintenance team and any
+% individual authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+%%% From file: fimain.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth, Lars Hellstr\"om}
+\begin{document}
+\maketitle
+\tableofcontents
+\DocInput{fimain.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \StopEventually{}
+%
+%
+% \section{Encoding files}
+%
+% \changes{1.911}{1999/11/21}{Definitions of encoding file commands
+% added to \protect\protect\protect\Module{misc}. (LH)}
+%
+% \DescribeMacro{\inputetx}
+% The macro
+% \begin{quote}
+% |\inputetx|\marg{filename}
+% \end{quote}
+% inputs \meta{filename}|.etx|, ignoring anything between |\relax|
+% and |\encoding|, and anything after |\endencoding|.
+%
+% The file name is transformed to lowercase before opening.
+%
+% \begin{macro}{\inputetx}
+% \begin{macro}{\encoding}
+% \changes{1.900}{1999/02/07}
+% {Changed group in fontdoc to \cs{begingroup} type. (LH)}
+% \usechange{raggedright}
+% \begin{macro}{\endencoding}
+% \changes{1.900}{1999/02/07}{Made it outer. (LH)}
+% \usechange{raggedright}
+% \begin{macrocode}
+%<*pkg|misc>
+\def\inputetx#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \slot_number=0
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\encoding=\fi
+ \primitiveinput \lowercase_file.etx\x_relax
+ \let\relax=\x_relax
+}
+\let\encoding=\relax
+\outer\def\endencoding{\endinput}
+%</pkg|misc>
+% \end{macrocode}
+%
+% Things are a bit more complicated in \package{fontdoc}, since the
+% |\relax| \textellipsis\ |\encoding| \textellipsis\ |\endencoding|
+% markup must be able to work in two different ways. In the main file
+% only |\encoding| actually does anything---it sets |\slot@number| to
+% zero. In a file that is being |\inputetx|ed, they must work as with
+% \package{fontinst}: Everything between |\relax| and |\encoding|,
+% and everything after |\endencoding| must be ignored.
+% \multchanges{\cs{inputetx}\cs{inputmtx}}{1.914}{2000/05/27}
+% {New \package{fontdoc} definition, using \cs{IfFileExists}. (LH)}
+% \multchanges{\cs{encoding}\cs{endencoding}}{1.918}{2001/06/19}
+% {Added \cs{par} and \cs{addvspace} to \package{fontdoc}
+% definitions. (LH)}
+% \multchanges{\cs{endencoding}}{1.919}{2001/09/01}
+% {Added setting of \cs{parindent} to 1\,em to \package{fontdoc}
+% definition. (LH)}
+% \begin{macrocode}
+%<*doc>
+\def\inputetx#1{%
+ \begingroup
+ \edef\lowercase@file{\lowercase{%
+ \edef\noexpand\lowercase@file{#1}%
+ }}%
+ \lowercase@file
+ \global\slot@number=0%
+ \FD@slot@known@true
+ \IfFileExists{\lowercase@file.etx}{%
+ \FD@relax@encoding@tricks
+ \@@input \@filef@und
+ \let\relax=\x@relax
+ }{%
+ \PackageError{fontdoc}{File #1.etx not found}%
+ {\@eha\MessageBreak You can \protect\inputetx\space
+ some other file now, if you want.}%
+ }
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macro}{\FD@relax@encoding@tricks}
+% There is a problem with |\if| \dots\ |\fi| nesting in the
+% redefinition of |\relax| and |\encoding|, which interacts badly
+% with |\IfFileExists|. To work around that, these redefinitions
+% are hidden in the |\FD@relax@encoding@tricks| macro.
+% \changes{1.928}{2004/11/24}{Macro added, to fix bug reported by
+% Peter Dyballa. (LH)}
+% \begin{macrocode}
+\def\FD@relax@encoding@tricks{%
+ \def\relax{\let\relax=\x@relax\iffalse}%
+ \let\encoding=\fi
+ \outer\x@cs\def{endencoding}{\endinput}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\encoding{%
+ \par
+ \ifFD@spec@ \addvspace{\bigskipamount}\fi
+ \begin{flushleft}
+ \global\slot@number=\z@
+}
+\outer\def\endencoding{%
+ \end{flushleft}
+ \ifFD@spec@ \addvspace{\bigskipamount}\fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\setslot}
+% \changes{1.917}{2001/03/23}{Made slots referencable using
+% \cs{label}. (LH)}
+% \begin{macro}{\endsetslot}
+% \begin{macro}{\slot_name}
+% |\setslot|\marg{name} \meta{slot commands} |\endsetslot|
+%
+% In \package{fontinst}, this sets |\slot_name| to \meta{name} and
+% calls |\do_slot| at the beginning of the slot and it calls
+% |\end_do_slot| and increments |\slot_number| by one at the end.
+% By default, |\do_slot| and |\end_do_slot| do nothing, but this is
+% over-ridden later.
+%
+% \begin{macrocode}
+%<*pkg|misc>
+\def\setslot#1{\edef\slot_name{#1}\do_slot}
+\def\endsetslot{\end_do_slot\advance\slot_number by 1\x_relax}
+%</pkg|misc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\slot@name}
+% \changes{1.917}{2001/03/23}{Now storing the printable form of the
+% name, rather than the raw code. (LH)}
+% In \package{fontdoc}, the same code converts \meta{name} to a
+% printable string and stores the result in |\slot@name|, prints an
+% |\Aheading| heading for the slot which show the name and number
+% of the slot, and prints the current automatic slot comment (if
+% one has been set) at the beginning of the slot. At the end of
+% the slot, it simply increments |\slot@number| by one.
+%
+% \begin{macrocode}
+%<*doc>
+\newcommand\setslot[1]{%
+ \protected@edef\slot@name{%
+ \noexpand\MakePrintable \noexpand\slot@name {FD@swa}{#1}%
+ }%
+ \slot@name
+ \FD@tight@true
+ \Aheading{Slot
+ \ifFD@slot@known@
+ \the\slot@number\space
+ \else
+ \(\FD@slot@expression + \the\slot@number\)
+ \fi
+ `\FD@typeset@string{\slot@name}'%
+ }%
+ \protected@edef\@currentlabel{%
+ \ifFD@slot@known@
+ \the\slot@number
+ \else
+ \protect\(%
+ \FD@slot@expression+\the\slot@number
+ \protect\)%
+ \fi
+ \space(\protect\FD@typeset@string{\slot@name})%
+ }%
+ \ifFD@slot@known@ \ifslot@comment@ \comment{\slot@comment}\fi\fi
+}
+\def\endsetslot{%
+ \global\advance \slot@number \@ne
+ \FD@tight@false
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\do_slot}
+% \begin{macro}{\end_do_slot}
+% \begin{macrocode}
+%<*pkg|misc>
+\let\do_slot\empty_command
+\let\end_do_slot\empty_command
+% \end{macrocode}
+% \end{macro} \end{macro}
+% \multchanges{\cs{do_new_slot}}{1.910}{1999/11/01}{Macro removed. (LH)}
+%
+% \begin{macro}{\nextslot}
+% \begin{macro}{\skipslots}
+% \begin{macro}{\slot_number}
+% \begin{macro}{\slot@number}
+% \begin{switch}{FD@slot@known@}
+% \begin{macro}{\FD@slot@expression}
+% |\nextslot|\marg{integer expression}\\
+% |\skipslots|\marg{integer expression}
+%
+% In \package{fontinst}, |\nextslot| sets the |\slot_number| and
+% |\skipslots| addvances the |\slot_number|.
+%
+% \begin{macrocode}
+\newcount\slot_number
+\def\nextslot#1{\eval_expr_to\slot_number{#1}}
+\def\skipslots#1{\eval_expr{#1} \advance\slot_number by \result}
+%</pkg|misc>
+% \end{macrocode}
+%
+% The commands do the same in \package{fontdoc} as in
+% \package{fontinst}, although they do it to |\slot@number| instead of
+% |\slot_number|.
+%
+% \begin{macrocode}
+%<*doc>
+\newcount\slot@number
+\def\FD@slot@known@true{\global\let\ifFD@slot@known@\iftrue}
+\def\FD@slot@known@false{\global\let\ifFD@slot@known@\iffalse}
+\FD@slot@known@true
+\newcommand\nextslot[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \ifFD@evaluate@
+ \global\slot@number=\FD@result
+ \FD@slot@known@true
+ \else
+ \global\let\FD@slot@expression=\FD@expression
+ \global\slot@number=\z@
+ \FD@slot@known@false
+ \fi
+}
+\newcommand\skipslots[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \ifFD@evaluate@
+ \global\advance \slot@number \FD@result
+ \else
+ \ifFD@slot@known@
+ \global\let\FD@slot@expression=\FD@expression
+ \else
+ \protected@xdef\FD@slot@expression{%
+ \FD@slot@expression+\FD@expression
+ }%
+ \fi
+ \FD@slot@known@false
+ \fi
+}
+%</doc>
+% \end{macrocode}
+%
+% There has been some ambiguity concerning what is allowed as
+% arguments of \cs{nextslot} and \cs{skipslots}. At least since
+% v\,1.335 the comments in the source has said it was an integer
+% expression, but the implementation was for a \TeX\ number.
+% Alan's v\,1.5 manual and Rowland's v\,1.8 manual both say the
+% arguments must be numbers. Allowing arbitrary integer
+% expressions with \package{fontinst} is trivial, the above
+% implementation copes with that, but \package{fontdoc} gets in
+% trouble, so what should we do about it? /LH
+%
+% AFAIK, all instances of |\nextslot| or |\skipslots| appearing in
+% present |*.etx| files are explicit numbers, no fancy constructs. /UV
+%
+% No, but if a |\setslot| command appears in a |\for| loop then the
+% slot number in that command will depend on the values of various
+% integer expressions anyway, so we might as well deal with it. /LH
+%
+% The matter was finally resolved when \package{fontdoc} was
+% augmented to handle (and typeset) arbtrary integer expressions.
+%
+% \multchanges{\cs{nextslot}\cs{skipslots}}{1.900}{1999/02/07}^^A
+% {Made changes of \cs{slot@number} global. (LH)}
+% \end{macro}\end{switch}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\setleftboundary}
+% \multchanges{\cs{setleftboundary}\cs{endsetleftboundary}}^^A
+% {1.909}{1999/10/19}{\package{fontdoc} definition added. (LH)}
+% \changes{1.917}{2001/03/23}{Made the left boundary referencable
+% using \cs{label}. (LH)}
+% \begin{macro}{\endsetleftboundary}
+% \begin{macro}{\do_boundary}
+% |\setleftboundary|\marg{glyph} \meta{slot commands}
+% |\endsetleftboundary|
+%
+% These macros are like |\setslot| and |\endsetslot|, but they merely
+% set the left boundary ligkern program, they do not cause any
+% |CHARACTER| property list to be written. Thus the only metric
+% information connected to the \meta{glyph} argument that is ever used
+% is the kerns with this glyph on the left.
+%
+% |\do_boundary| and |\endsetleftboundary| are initally |\relax|, but
+% are later redefined.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\setleftboundary#1{\edef\slot_name{#1}\do_boundary}
+\let\endsetleftboundary\x_relax
+\let\do_boundary\x_relax
+%</pkg>
+%<*doc>
+\newcommand\setleftboundary[1]{%
+ \protected@edef\slot@name{%
+ \noexpand\MakePrintable \noexpand\slot@name {FD@swa}{#1}%
+ }%
+ \slot@name
+ \FD@tight@true
+ \Aheading{Left boundary `\FD@typeset@string{\slot@name}'}%
+ \protected@edef\@currentlabel{%
+ left boundary (\protect\FD@typeset@string{\slot@name})%
+ }%
+}
+\let\endsetleftboundary=\FD@tight@false
+%</doc>
+%<*misc>
+\let\setleftboundary=\gobble_one
+\let\endsetleftboundary=\x_relax
+%</misc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\setrightboundary}
+% |\setrightboundary|\marg{glyph}
+%
+% The |\setrightboundary| macro should be used to set which slot in
+% the font is used as right boundary marker if that slot is empty. It
+% advances |\slot_number| just like a |\setslot| \textellipsis\
+% |\endsetslot| pair, but since the slot will be left empty, there is
+% no need for any \meta{slot commands}, and hence there is no need for
+% a closing |\endset|\textellipsis\ command either.
+%
+% If the right boundary marker slot is not to be left empty (often
+% unavoidable), then one should use the slot command
+% |\makerightboundary| instead.
+%
+% \changes{1.909}{1999/10/19}{doc definition added. (LH)}
+% \begin{macrocode}
+%<*pkg|misc>
+\def\setrightboundary#1{
+ \makerightboundary{#1}
+ \advance \slot_number 1\x_relax
+}
+%</pkg|misc>
+%<*doc>
+\newcommand\setrightboundary[1]{%
+ \Aheading{Right boundary slot
+ \ifFD@slot@known@
+ \the\slot@number\space
+ \else
+ \(\FD@slot@expression + \the\slot@number\)
+ \fi
+ `\TypesetStringExpression{#1}'%
+ }%
+ \global\advance \slot@number \@ne
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \DescribeMacro{\ligature}
+% \DescribeMacro{\Ligature}
+% \DescribeMacro{\oddligature}
+% \DescribeMacro{\nextlarger}
+% \DescribeMacro{\varchar}
+% \DescribeMacro{\endvarchar}
+% \DescribeMacro{\usedas}
+% \DescribeMacro{\makerightboundary}
+% \DescribeMacro{\Unicode}
+% The \meta{slot commands} are:
+% \begin{quote}
+% |\ligature|\marg{lig}\marg{glyph}\marg{glyph}\\
+% |\Ligature|\marg{lig}\marg{glyph}\marg{glyph}\\
+% |\oddligature|\marg{note}\marg{lig}\marg{glyph}\marg{glyph}\\
+% |\nextlarger|\marg{glyph}\\
+% |\varchar| \meta{varchar commands} |\endvarchar|\\
+% |\usedas|\marg{command}\marg{type}\\
+% |\makerightboundary|\marg{glyph}\\
+% |\Unicode|\marg{code point}\marg{name}
+% \end{quote}
+% By default, these do nothing in \package{fontinst}, but most of
+% those defaults are overridden locally in those situations where one
+% wants them to do something. Exceptions are \cs{usedas},
+% which is never used at all AFAIK,\footnote{It was intended to be
+% used for math font encodings, but that never got off the
+% \texttt{TODO} list. /LH} and |\oddligature| and |\Unicode|,
+% which are purely documentation commands. In \package{fontdoc},
+% they generate descriptive headings.
+%
+% \begin{macro}{\ligature}
+% \begin{macro}{\Ligature}
+% \changes{1.917}{2001/03/31}{Command added. (LH)}
+% \begin{macro}{\oddligature}
+% \changes{1.918}{2001/05/31}{Command added. (LH)}
+% The |\ligature| and |\Ligature| commands have the same syntax and
+% meaning to \package{fontinst}, but \package{fontdoc} can give them
+% slightly different treatment. In a specification ETX file, the
+% |\Ligature| command gets the heading ``Mandatory ligature'', whereas
+% the |\ligature| command gets the heading ``Ordinary ligature''.
+%
+% The |\oddligature| command takes a fourth argument which contains a
+% short note on when the ligature might be appropriate. The entire
+% command is always ignored by \package{fontinst}.
+% \begin{macrocode}
+%<pkg|misc>\let\ligature=\gobble_three
+%<pkg|misc>\def\Ligature{\ligature}
+%<pkg|misc>\def\oddligature#1#2#3#4{}
+%<*doc>
+\newcommand\ligature[3]{%
+ \Bheading{\ifFD@spec@ Ordinary ligature\else Ligature\fi}
+ \@nameuse{FD@lig-#1}{#2}{#3}%
+}
+\newcommand\Ligature[3]{%
+ \Bheading{\ifFD@spec@ Mandatory ligature\else Ligature\fi}
+ \@nameuse{FD@lig-#1}{#2}{#3}%
+}
+\newcommand\oddligature[4]{%
+ \Bheading{Odd\footnote{#1} ligature}
+ \@nameuse{FD@lig-#2}{#3}{#4}%
+}
+% \end{macrocode}
+%
+% Symbolic typesetting of |\ligature| programs requires
+% special processing.\describecsfamily{FD@lig-\meta{lig}}
+% \multchanges{\cs{FD@lig-/LIG\PrintChar{`>}}\cs
+% {FD@lig-LIG/\PrintChar{`>}}\cs{FD@lig-/LIG/\PrintChar{`>}}\cs
+% {FD@lig-/LIG/\PrintChar{`>}\PrintChar{`>}}}{1.917}
+% {2001/03/31}{Changed how \package{fontdoc} marks the current
+% position after a ligature instruction, from $+$ to
+% $*\lfloor$. (LH)}
+% \multchanges{\cs{FD@lig-/LIG}}{1.927}
+% {2004/06/21}{Fixed a typo. (LH) Reported by Werner Lemberg.}
+% \multchanges{\cs{FD@lig-/LIG/\PrintChar{`>}\PrintChar{`>}}}{1.927}
+% {2004/06/24}{Fixed a typo. (LH) Reported by Werner Lemberg.}
+%
+% \begin{macrocode}
+\x@cs\def{FD@lig-LIG}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-/LIG}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-LIG/}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*\lfloor$\typeset@glyph{#2}%
+}
+\x@cs\def{FD@lig-LIG/>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \typeset@glyph{#2}${}*\lfloor$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*\lfloor$%
+ \typeset@glyph{#2}${}*{}$\typeset@glyph{#1}%
+}
+\x@cs\def{FD@lig-/LIG/>>}#1#2{%
+ \FD@typeset@string{\slot@name}${}*{}$\typeset@glyph{#1}%
+ ${}\rightarrow{}$%
+ \FD@typeset@string{\slot@name}${}*{}$%
+ \typeset@glyph{#2}${}*\lfloor$\typeset@glyph{#1}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\nextlarger}
+% \begin{macro}{\usedas}
+% \begin{macro}{\makerightboundary}
+% \begin{macrocode}
+%<*pkg|misc>
+\let\nextlarger=\gobble_one
+\let\usedas=\gobble_two
+\let\makerightboundary=\gobble_one
+%</pkg|misc>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\nextlarger#1{\Bheading{Next larger} \typeset@glyph{#1}}
+\def\makerightboundary#1{%
+ \Bheading{Right boundary marker slot} designation \typeset@glyph{#1}%
+}
+%</doc>
+% \end{macrocode}
+% \missing{doc}{\usedas}
+% \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\Unicode}
+% \changes{1.917}{2001/03/13}{Command added. (LH)}
+% \changes{1.917}{2001/03/31}{Added setting of \cs{linepenalty} and
+% \cs{spaceskip}. (LH)}
+% \begin{macro}{\textunicode}
+% \changes{1.918}{2001/06/17}{Command added. (LH)}
+% \begin{macro}{\FD@codepoint}
+% \changes{1.918}{2001/06/17}{Macro added. (LH)}
+% \begin{macro}{\FD@charname}
+% \changes{1.918}{2001/06/17}{Macro added. (LH)}
+% Since ISO\,10646\slash Unicode has become the primary reference for
+% identifying characters, we provide a special comment command for
+% specifying which Unicode character corresponds to a particular slot
+% in an encoding. \label{Unicode} The syntax is
+% \begin{quote}
+% |\Unicode|\marg{code point}\marg{name}
+% \end{quote}
+% where the \meta{code point} is the four hexadecimal digits that
+% identify the code point of the character and \meta{name} is the
+% name of the character. An example is
+% \begin{quote}
+% |\Unicode{0041}{LATIN CAPITAL LETTER A}|
+% \end{quote}
+% which is typeset as
+% \begin{quote}
+% Unicode character \texttt{U+0041}, \textsc{latin capital letter a}.
+% \end{quote}
+% The \meta{name} field may be left empty.
+%
+% The |\Unicode| command makes a whole |\comment|, but it is also
+% useful to have a similar command for writing such data as part of a
+% longer paragraph. The |\textunicode| command, which has the same
+% argument structure as |\Unicode|, is provided for this. If you write
+% \begin{quote}
+% |see also \textunicode{0041}{LATIN CAPITAL LETTER A} for|
+% \end{quote}
+% then this is typeset as
+% \begin{quote}
+% see also \texttt{U+0041} (\textsc{latin capital letter a}) for
+% \end{quote}
+%
+% As case is not significant in the character names and they
+% furthermore usually seem to be written in capitals, I have chosen
+% to typeset them using small capitals only. This is done by
+% |\FD@charname|. The |\FD@codepoint| macro similarly handles
+% typesetting of code points. See also the \texttt{hypertex} option
+% to the \package{fontdoc} package.
+%
+% The \package{fontinst} and \package{finstmsc} definitions of
+% |\Unicode| are to gobble the arguments.
+% \begin{macrocode}
+%<pkg|misc>\let\Unicode=\gobble_two
+%<*doc>
+\newcommand*\Unicode[2]{%
+ \comment{%
+ \spaceskip=\fontdimen2\font minus 1.1\fontdimen4\font
+ Unicode character \FD@codepoint{#1}%
+ \ifx \par#2\par \else , \FD@charname{#2}\fi.%
+ \linepenalty=300\par
+ }%
+}
+\newcommand*\textunicode[2]{%
+ \FD@codepoint{#1} \ifx\par#2\par\else(\FD@charname{#2})\fi
+}
+\providecommand*\FD@codepoint[1]{\texttt{U+\uppercase{#1}}}
+\providecommand*\FD@charname[1]{\textsc{\lowercase{#1}}}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\charseq}
+% Most commonly occurring glyphs correspond to one |\Unicode|
+% character, but this is not at all true in general---in fact there
+% may even be letters which cannot be encoded as single characters,
+% as they do not exist in precomposed form but have to be expressed
+% with a base letter and combining diacritical mark. Reasonable
+% compliance with the standard requires supporting character
+% sequences as well as individual characters.
+% \changes{1.928}{2004/11/27}{Command added. (LH)}
+% \changes{1.928}{2004/12/16}{Typeset form changed, from paragraph to
+% a one-item-per-line list. (LH)}
+%
+% In \package{fontinst}, the |\charseq| command is used to specify
+% such a character sequence. The syntax is
+% \begin{quote}
+% |\charseq|\marg{\cs{Unicode} commands}
+% \end{quote}
+% where the \meta{\cs{Unicode} commands} is one or several |\Unicode|
+% commands. This means the sequence of those characters. For example
+% \begin{quote}
+% |\charseq{|\\
+% | \Unicode{0066}{LATIN SMALL LETTER F}|\\
+% | \Unicode{0069}{LATIN SMALL LETTER I}|\\
+% |}|
+% \end{quote}
+% is typeset as
+% \begin{quote}
+% Unicode character sequence:\\
+% \vadjust{}\quad\texttt{U+0066} (\textsc{latin small letter f})\\
+% \vadjust{}\quad\texttt{U+0069} (\textsc{latin small letter i})
+% \end{quote}
+% This indentation is made using the \texttt{IfBranch} environment,
+% which could be considered a bit hackish.
+%
+% |\charseq| is gobbled in \Module{pkg} and \Module{misc}, but in the
+% latter case it might get redefined.
+% \begin{macrocode}
+%<pkg|misc>\let\charseq=\gobble_one
+% \end{macrocode}
+% Note how the environment group restores the definition
+% of |\Unicode|.
+% \begin{macrocode}
+%<*doc>
+\newcommand\charseq[1]{%
+ \comment{Unicode character sequence:}%
+ \begin{IfBranch}%
+ \def\Unicode##1##2{%
+ \noindent\FD@codepoint{##1}
+ \ifx\par##2\par\else(\FD@charname{##2})\fi
+ \par
+ }%
+ #1%
+ \end{IfBranch}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \DescribeMacro{\vartop}
+% \DescribeMacro{\varmid}
+% \DescribeMacro{\varbot}
+% \DescribeMacro{\varrep}
+% The \meta{varchar commands} are:
+% \begin{quote}
+% |\vartop|\marg{glyph}\\
+% |\varmid|\marg{glyph}\\
+% |\varbot|\marg{glyph}\\
+% |\varrep|\marg{glyph}
+% \end{quote}
+% These too do by default, which is overridden later, nothing in
+% \package{fontinst} but typeset descriptive headings in \package{fontdoc}.
+%
+% \begin{macro}{\varchar}
+% \begin{macro}{\vartop}
+% \begin{macro}{\varmid}
+% \begin{macro}{\varbot}
+% \begin{macro}{\varrep}
+% \begin{macro}{\endvarchar}
+% \begin{macrocode}
+%<*pkg|misc>
+\let\varchar=\empty_command
+\let\vartop=\gobble_one
+\let\varmid=\gobble_one
+\let\varbot=\gobble_one
+\let\varrep=\gobble_one
+\let\endvarchar=\empty_command
+%</pkg|misc>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\varchar{\Bheading{Extensible glyph:}}
+\def\vartop#1{\Bheading{Top} \typeset@glyph{#1}}
+\def\varmid#1{\Bheading{Middle} \typeset@glyph{#1}}
+\def\varbot#1{\Bheading{Bottom} \typeset@glyph{#1}}
+\def\varrep#1{\Bheading{Repeated} \typeset@glyph{#1}}
+\let\endvarchar\relax
+%</doc>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\useexamplefont}
+% \begin{macro}{\slotexample}
+% \begin{macro}{\setslotcomment}
+% \begin{macro}{\resetslotcomment}
+% \begin{macro}{\unsetslotcomment}
+% \begin{macro}{\slot@comment}
+% \begin{macro}{\slot@font}
+% As of v\,1.8 of \package{fontinst}, we have added an interface
+% for automatic documentation of encoding files, which has been
+% developed by Matthias Clasen as part of his work on math fonts.
+% The implementation was slightly modified and integrated into
+% this version by Ulrik Vieth.
+%
+% |\setslotcomment| defines a default slot comment, stored in the
+% variable |\slot@comment|, which is subsequently used to annotate
+% all |\setslot| commands. The slot comment can be changed by
+% |\resetslotcomment| or turned off by |\unsetslotcomment|.
+%
+% |\useexamplefont| defines a default font, |\slot@font|, which
+% may be referenced by calling |\slotexample| in slot comments to
+% display the character or symbol allocated to the current slot.
+%
+% Taking advantage of this mechanism, it is possible to write:
+% \begin{quote}
+% |\useexamplefont{FONT}|\\[0.5\baselineskip]
+% |\setslotcomment{The symbol `\slotexample'.}|\\
+% |\setslot{FOO}\endsetslot|\\
+% |\setslot{BAR}\endsetslot|\\
+% |\resetslotcomment{The character `\slotexample'.}|\\
+% |\setslot{BAZ}\endsetslot|
+% \end{quote}
+% instead of having to write:
+% \begin{quote}
+% |\usepackage{PACKAGE-to-use-symbols-from-FONT}|\\[0.5\baselineskip]
+% |\setslot{FOO}\comment{The symbol `\foo'.}\endsetslot|\\
+% |\setslot{BAR}\comment{The symbol `\bar'.}\endsetslot|\\
+% |\setslot{BAZ}\comment{The character `\baz'.}\endsetslot|
+% \end{quote}
+%
+% These macros never do anything in \package{fontinst}, they just
+% gobble their arguments.
+% \begin{macrocode}
+%<*pkg|misc>
+\let\useexamplefont=\gobble_one
+\let\slotexample=\empty_command
+\let\setslotcomment=\gobble_one
+\let\resetslotcomment=\gobble_one
+\let\unsetslotcomment=\empty_command
+%</pkg|misc>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newif\ifslot@comment@
+\slot@comment@false
+\def\slot@comment{}
+\newcommand\setslotcomment[1]{%
+ \slot@comment@true
+ \gdef\slot@comment{#1}%
+}
+\newcommand\resetslotcomment[1]{\gdef\slot@comment{#1}}
+\newcommand\unsetslotcomment{%
+ \slot@comment@false
+ \global\let\slot@comment\@empty
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\slot@font=\nullfont
+\newcommand\useexamplefont[1]{\font\slot@font=#1 }
+\newcommand\slotexample{%
+ \ifFD@slot@known@{\slot@font\char\slot@number}\fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setfontdimen}
+% \changes{1.917}{2001/03/16}{Command added. (LH)}
+% The |\setfontdimen| command is used in an ETX file to set a font
+% dimen. The syntax is
+% \begin{quote}
+% |\setfontdimen|\marg{fontdimen no.}\marg{integer}
+% \end{quote}
+% where \meta{fontdimen no.} and \meta{integer} are \emph{string}
+% expressions. \meta{fontdimen no.} specifies the fontdimen to set.
+% \meta{integer} is the name of the integer variable to whose value
+% the fontdimen will be set.
+%
+% When used in font installation, the above |\setfontdimen| command
+% is equivalent to
+% \changes{1.923}{2002/10/25}{Leave the fontdimen unset when the
+% integer variable has not been set. (LH)}
+% \begin{quote}
+% |\ifisint|\marg{integer}|\then|\\
+% | \setint{fontdimen(|\meta{fontdimen no.}|)}{\int{|^^A
+% \meta{integer}|}}|\\
+% |\fi|
+% \end{quote}
+% but |\setfontdimen| is also understood by the (V)PL-to-MTX
+% converter as declaring an integer that the generated MTX file
+% should set to the value of the fontdimen in the (V)PL.
+% \begin{macrocode}
+%<*pkg>
+\def\setfontdimen#1#2{
+ \ifisint{#2}\then \setint{fontdimen(#1)}{\int{#2}} \fi
+}
+%</pkg>
+%<misc>\let\setfontdimen\gobble_two
+%<*doc>
+\newcommand\setfontdimen[2]{%
+ \Bheading{Fontdimen} \TypesetStringExpression{#1} is
+ \(\TypesetIntegerExpression{\int{#2}}\)%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\label}
+% \changes{1.917}{2001/03/23}{Macro added. (LH)}
+% \package{fontinst} and \package{finstmsc} defines the \LaTeX\
+% |\label| command to gobble its argument, so that one can use it to
+% reference slots.
+% \begin{macrocode}
+%<pkg|misc>\let\label=\gobble_one
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{switch}{direct}
+% The encoding aspect of a font can to a large extent be understood
+% as a mapping from the set of slots to the set of glyphs---such
+% mappings are for example realised by PostScript encoding vectors
+% (mapping slots to glyph names) and virtual fonts (mapping slots to
+% DVI commands for drawing a glyph). In some cases however, encodings
+% are rather used to specify an inverse mapping going the opposite
+% way. Since encodings are in general many-to-one, this means there
+% need not be a proper inverse to a given encoding; instead the
+% inverse image of a glyph is in practice chosen randomly\footnote{In
+% the sense: according to a very deterministic (but not particularly
+% useful) rule which depends completely on details in the
+% implementation, and therefore should not be relied upon anyway.}
+% among the slots that are mapped to it. This is not always desirable.
+%
+% The \texttt{direct} switch can be used to check whether an encoding
+% is interpreted in the direct (slots to glyphs) or inverse (glyphs to
+% slots) manner. If those |\setslot| commands which are undesirable
+% under the inverse interpretation are put inside an |\ifdirect|
+% \dots\ |\Fi| construction, then these will be ignored in that
+% circumstance, thus allowing the programmer to exactly specify both
+% the direct and the inverse mappings.
+% \changes{1.924}{2003/02/08}{Command added. (LH)}
+%
+% In \package{fontinst}, this command is a switch, which is usually
+% true.
+% \begin{macrocode}
+%<pkg|misc>\newif\ifdirect \directtrue
+% \end{macrocode}
+% In \package{fontdoc}, this is a conditional that will be typeset
+% if |\showbranches| is being used.
+% \begin{macrocode}
+%<doc>\newcommand\ifdirect{\generic@if{direct}}
+% \end{macrocode}
+% \end{switch}
+%
+% \begin{macro}{\input_mtx_as_etx}
+% The |\input_mtx_as_etx| command is syntactically similar to the
+% |\inputetx| command, but it inputs an MTX file instead of an ETX
+% file and redefines |\setscaledrawglyph| so that it expands to a
+% |\nextslot| followed by a |\setslot| \dots\ |\endsetslot|. This is
+% useful when making proofs of fonts with nonstandard encodings, as
+% the MTX of a font can be used to specify ``the default encoding''
+% of that font.
+%
+% \textbf{Warning:} Since this macro redefines a lot of the metric
+% commands, you'll probably only want to call it inside a group.
+% \changes{1.923}{2002/10/24}{Macro added. (LH)}
+% \begin{macrocode}
+%<*pkg|misc>
+\def\input_mtx_as_etx#1{
+ \def\setscaledrawglyph##1##2##3##4##5##6##7##8##9{
+ \nextslot{##5}
+ \setslot{##1}\endsetslot
+ }
+ \offcommand\setscalednotglyph
+ \let\setglyph=\gobble_glyph
+ \offcommand\setkern
+ \inputmtx{#1}
+}
+%</pkg|misc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Metric files}
+% \label{Sec:Metric files}
+%
+% \changes{1.911}{1999/11/17}{Definitions of metric file commands
+% added to \protect\protect\protect\Module{misc}. (LH)}
+%
+% \DescribeMacro{\inputmtx}
+% The macro
+% \begin{quote}
+% |\inputmtx|\marg{filename}
+% \end{quote}
+% inputs \meta{filename}|.mtx|, ignoring anything between |\relax| and
+% |\metrics|, and anything after |\endmetrics|.
+%
+% \begin{macro}{\inputmtx}
+% \begin{macro}{\metrics}
+% \changes{1.914}{2000/05/26}{Fixed typo: \cs{x@relax} instead of
+% \cs{x_relax}. (LH)}
+% \usechange{raggedright}
+% \begin{macro}{\endmetrics}
+% \changes{1.900}{1999/02/08}{Made it outer. (LH)}
+% \usechange{raggedright}
+% \begin{macro}{\endmetrics_text}
+% \begin{macro}{\endmetrics@hook}
+% The |\endmetrics_text| macro expands to |\endmetrics| (eleven
+% `other' tokens, not one control sequence token). It is used instead
+% of |\string\endmetrics|, which does not work since |\endmetrics| is
+% outer.
+% \begin{macrocode}
+%<*pkg|misc>
+\def\inputmtx#1{
+ \def\relax{\let\relax=\x_relax\iffalse}
+ \let\metrics=\fi
+ \primitiveinput #1.mtx\x_relax
+ \let\relax=\x_relax
+}
+\let\metrics=\x_relax
+\edef\endmetrics_text{\string\endmetrics}
+\outer\def\endmetrics{\endinput}
+%</pkg|misc>
+% \end{macrocode}
+% |\inputmtx| used to set |\a_count|, but we haven't been able to
+% find a reason for this, so it was removed.
+%
+% In \package{fontdoc}, the |\metrics| and |\endmetrics| macros
+% initially just define a group, but |\inputmtx| redefines them to
+% work as they do in \package{fontinst}. |\endmetrics@hook| is a
+% macro that gets executed just before the |\endgroup| in
+% |\endmetrics|; it is normally |\@empty|, and it is set to this value
+% at each |\metrics|, but the metric package system redefines it.
+% \multchanges{\cs{endmetrics_hook}}{1.914}{2000/05/27}{Macro added.
+% (LH)}
+% \multchanges{\cs{inputetx}\cs{inputmtx}}{1.914}{2000/05/27}
+% {New \package{fontdoc} definition, using \cs{IfFileExists}. (LH)}
+% \begin{macrocode}
+%<*doc>
+\def\inputmtx#1{%
+ \begingroup
+ \edef\lowercase@file{\lowercase{%
+ \edef\noexpand\lowercase@file{#1}%
+ }}%
+ \lowercase@file
+ \let\endmetrics@hook=\@empty
+ \IfFileExists{\lowercase@file.mtx}{%
+ \skip@mtx@preamble
+ \@@input \@filef@und
+ \let\relax=\x@relax
+ }{%
+ \PackageError{fontdoc}{File #1.mtx not found}%
+ {\@eha\MessageBreak You can \protect\inputmtx\space
+ some other file now, if you want.}%
+ }
+ \endmetrics@hook
+ \endgroup
+}
+\def\skip@mtx@preamble{%
+ \def\relax{\let\relax=\x@relax\iffalse}%
+ \let\metrics=\fi
+ \outer\x@cs\def{endmetrics}{\endinput}%
+}
+\def\metrics{%
+ \begin{flushleft}%
+ \let\endmetrics@hook=\@empty
+}
+\outer\def\endmetrics{%
+ \endmetrics@hook
+ \end{flushleft}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\ProvidesMtxPackage}
+% \changes{1.923}{2003/01/05}{Redesigned the headings for metric
+% packages, since they interact poorly with \cs{section} headings.
+% (LH)}
+% \begin{switch}{@mtxpackage@headed@}
+% \begin{macro}{\announce@package}
+% \begin{macro}{\finish@package}
+% \multchanges{\cs{ProvidesMtxPackage}\cs{usemtxpackage}}{1.914}
+% {2000/05/27}{New \package{fontdoc} implementation---the packages
+% are actually loaded (they have to, since they can define
+% commands). Multiple loading is prevented as in
+% \package{fontinst}. (LH)}
+% The call
+% \begin{quote}
+% |\ProvidesMtxPackage|\marg{package~name}
+% \end{quote}
+% signals to the package managing system that there is no need to load
+% this package again.
+% \begin{macrocode}
+%<pkg>\def\ProvidesMtxPackage#1{\x_cs\let{pack-#1}P}
+%<*doc>
+\def\ProvidesMtxPackage#1{%
+ \endmetrics@hook
+% \@mtxpackage@headed@false
+% \everypar={
+ \announce@package{#1}%
+% }%
+ \def\endmetrics@hook{\finish@package{#1}}
+ \global\x@cs\let{FD@pack-#1}\@empty
+}
+% \end{macrocode}
+% \begin{macrocode}
+% \newif\if@mtxpackage@headed@
+% \end{macrocode}
+% \begin{macrocode}
+\def\announce@package#1{%
+% \everypar={}%
+% \@mtxpackage@headed@true
+ \Aheading{[Start of metric package \textsf{#1}.}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\finish@package#1{%
+% \if@mtxpackage@headed@
+ \Aheading{End of metric package \textsf{#1}.]}%
+% \else
+% \everypar={}%
+% \Aheading{(Metric package \textsf{#1}.)}%
+% \fi
+ \par\addvspace\medskipamount
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{switch}\end{macro}
+%
+%
+% \begin{macro}{\usemtxpackage}
+% The call
+% \begin{quote}
+% |\usemtxpackage|\marg{package~list}
+% \end{quote}
+% inputs those of the packages in the list that have not been loaded
+% yet (i.e., those for which no |\ProvidesMtxPackage| has been made).
+% Each package is assumed to reside in the metric file that
+% |\inputmtx| loads when given the name of the package as argument.
+%
+% The call
+% \begin{quote}
+% |\usemtxpackage|\oarg{filename}\marg{package~list}
+% \end{quote}
+% inputs the packages in the list if at least one of them has not been
+% loaded yet. In this case, all the packages are assumed to reside in
+% the single metric file that |\inputmtx| loads when given
+% \meta{filename} as argument.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\usemtxpackage{\futurelet\next_token\test_UseMtxPkg_arguments}
+\def\test_UseMtxPkg_arguments{\ifx\next_token[
+ \expandafter\mtx_package_given_file
+ \else
+ \expandafter\mtx_package_separate_files
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\mtx_package_given_file[#1]#2{
+ \_a_false
+ \process_csep_list\load_true_unless_loaded #2,\process_csep_list,
+ \if_a_ \inputmtx{#1} \fi
+}
+\def\load_true_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else\_a_true\fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\mtx_package_separate_files#1{
+ \process_csep_list\load_file_unless_loaded #1,\process_csep_list,
+}
+\def\load_file_unless_loaded#1{
+ \x_cs\ifx{pack-#1}P\else \inputmtx{#1} \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\usemtxpackage[2][\x@relax]{%
+ \ifx \x@relax#1%
+ \@for\@tempa:=#2\do{%
+ \x@cs\ifx{FD@pack-\@tempa}\@empty \else
+ \inputmtx{\@tempa}%
+ \fi
+ }%
+ \else
+ \@tempswafalse
+ \@for\@tempa:=#1\do{%
+ \x@cs\ifx{FD@pack-\@tempa}\@empty \else \@tempswatrue \fi
+ }%
+ \if@tempswa
+ \inputmtx{#2}%
+ \fi
+ \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glyph_name_modifier}
+% The |\glyph_name_modifier| macro is applied to all glyph names
+% supplied to commands that are allowed in transformable MTX files
+% (see Subsection~\ref{Ssec:TransMTX}). The syntax is
+% \begin{quote}
+% |\glyph_name_modifier|\marg{glyph name}
+% \end{quote}
+% and the above must expand fully to a valid glyph name in \TeX's
+% mouth.
+%
+% \changes{1.923}{2002/10/20}{Macro added. (LH)}
+% The normal definition is to simply expand to the \meta{glyph name},
+% i.e.,
+% \begin{macrocode}
+%<pkg>\let\glyph_name_modifier=\identity_one
+% \end{macrocode}
+% but the command may expand to any sequence of character tokens. It
+% was introduced to support (simple) automatic renaming of glyphs
+% in cases where the |\reglyphfont| command would not be appropriate,
+% such as when the wanted renaming is simply to add a short suffix to
+% the glyph names.
+%
+% The reason it only affects the commands allowed in transformable
+% MTX files is that the macro isn't meant as a generic override for
+% metric commands.
+% \end{macro}
+%
+%
+% \subsection{Kerning information}
+%
+% The kerning information is kept in the macros
+% \describecsfamily{l-\meta{name}}|\l-|\meta{name} and
+% \describecsfamily{r-\meta{name}}|\r-|\meta{name}, containing
+% information about how \meta{name} kerns on the left and on the right,
+% respectively. The |\l-|\meta{name} macro should expand out to a
+% series of
+% \begin{quote}
+% \DescribeMacro{\k}|\k|\,|\r-|\meta{name}\,|\|\meta{amount}
+% \end{quote}
+% control sequences, and vice versa. Examples of
+% \describecsfamily{\meta{amount}} |\|\meta{amount}
+% control sequences are: |\0|, |\1|, |\1000|, |\-50|, |\33|; these
+% corresponds to the kern amounts $0$, $1$, $1000$ (which would be
+% a very large kern), $-50$, and $33$ respectively.
+%
+%
+% \begin{macro}{\setkern}
+% |\setkern|\marg{glyph1}\marg{glyph2}\marg{integer expression}
+%
+% Sets a kern pair between \meta{glyph1} and \meta{glyph2} to the
+% specified value, which is typically a value returned by
+% |\kerning|\marg{glyph3}\marg{glyph4}. If there already is a kern
+% set between \meta{glyph1} and \meta{glyph2} then this will not affect
+% the output, but it will use up another 3 units of token memory.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\setkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {#3}
+ \else
+ \expandafter\set_kern
+ \csname~r-\glyph_name_modifier{#1}\expandafter\endcsname
+ \csname~l-\glyph_name_modifier{#2}\endcsname
+ {\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\set_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\set_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\set_kern_cs#1#2#3{
+ \add_to#2{\k#3#1}
+ \add_to#3{\k#2#1}
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\setkern[3]{%
+ \Bheading{Kern} \typeset@glyph{#1}${{}+{}}$\typeset@glyph{#2}%
+ ${}\rightarrow \TypesetIntegerExpression{#3}$%
+}
+%</doc>
+%<misc>\let\setkern=\gobble_three
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\resetkern}
+% |\resetkern|\marg{glyph1}\marg{glyph2}\marg{integer expression}
+%
+% Resets the kern pair between \meta{glyph1} and \meta{glyph2} to
+% the specified value. Note however that this does not relieve \TeX\
+% of the burden to remember the previous kerning pair between these
+% two glyphs (if there was one).
+%
+% \begin{macrocode}
+%<*pkg>
+\def\resetkern#1#2#3{
+ \x_cs\ifx{i-rawscale}\x_relax
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{#3}
+ \else
+ \expandafter\reset_kern
+ \csname~r-#1\expandafter\endcsname
+ \csname~l-#2\endcsname{\scale{#3}{\int{rawscale}}}
+ \fi
+}
+\def\reset_kern#1#2#3{
+ \eval_expr{#3}
+ \expandafter\reset_kern_cs\csname\the\result\endcsname#1#2
+}
+\def\reset_kern_cs#1#2#3{
+ \prep_to#2{\k\expandafter#3\expandafter#1}
+ \prep_to#3{\k\expandafter#2\expandafter#1}
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\resetkern[3]{%
+ \Bheading{Override kern} \typeset@glyph{#1}${{}+{}}$\typeset@glyph{#2}%
+ ${}\rightarrow \TypesetIntegerExpression{#3}$%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setleftkerning}
+% \begin{macro}{\setrightkerning}
+% \begin{macro}{\setleftrightkerning}
+% |\setleftkerning|\marg{glyph1}\marg{glyph2}\marg{scaled}\\
+% |\setrightkerning|\marg{glyph1}\marg{glyph2}\marg{scaled}\\
+% |\setleftrightkerning|\marg{glyph1}\marg{glyph2}\marg{scaled}
+%
+% Sets left or right kerning of \meta{glyph1} to that of \meta{glyph2}
+% scaled by \meta{scaled} (which is an integer expression).
+% |\setleftrightkerning| does both.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\setleftkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+}
+\def\setrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\setleftrightkerning#1#2#3{
+ \eval_expr_to\b_count{#3}
+ \expandafter\set_kerning
+ \csname~l-#1\expandafter\endcsname
+ \csname~l-#2\endcsname
+ \expandafter\set_kerning
+ \csname~r-#1\expandafter\endcsname
+ \csname~r-#2\endcsname
+}
+\def\set_kerning#1#2{
+ \if\b_count=\one_thousand
+ \def\k##1##2{
+ \set_kern_cs##2##1#1
+ }
+ \else
+ \def\k##1##2{
+ \set_kern##1#1{
+ \scale\b_count{\expandafter\gobble_one\string##2}
+ }
+ }
+ \fi
+ #2
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\setleftkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the left like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+\newcommand\setrightkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the right like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+\newcommand\setleftrightkerning[3]{%
+ \Bheading{Kern} \typeset@glyph{#1} on the left and right like
+ \typeset@glyph{#2} \ConditionallyScaled{#3}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ConditionallyScaled}
+% \changes{1.916}{2001/01/06}{Command added. (LH)}
+% Several metric commands have take a scaling factor argument which is
+% rendered by \package{fontdoc} as ``scaled \meta{argument}''. The by
+% far most common value for this argument is however the constant
+% number 1000 (no scaling), and in those cases the ``scaled
+% \textellipsis'' feels a bit long-winded. The cure for this is the
+% |\Conditionally|\-|Scaled| command, which takes an integer expression
+% as its argument and typesets the ``scaled \meta{integer expression}''
+% \emph{unless} that expression evaluates to 1000, in which case
+% |\Conditionally|\-|Scaled| simply gobbles any spaces following it.
+% \begin{macrocode}
+\newcommand\ConditionallyScaled[1]{%
+ \FD@evaluate@true
+ \FD@eval@expr{#1}%
+ \@tempswatrue
+ \ifFD@evaluate@ \ifnum \FD@result=\@m \@tempswafalse \fi\fi
+ \FD@evaluate@false
+ \if@tempswa scaled \(\FD@expression\)\else \ignorespaces \fi
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\kerning}
+% |\kerning|\marg{glyph1}\marg{glyph2}
+%
+% Returns the value of kern pair between \meta{glyph1} and
+% \meta{glyph2} as an integer. Returns a value of zero if such a kern
+% pair doesn't exist.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\kerning#1#2{0\x_relax
+ \def\k##1{\csname~set-\string##1\endcsname\gobble_one}
+ \bgroup
+ \x_cs\def{set-\string\l-#2}##1##2{
+ \global\result=\expandafter\gobble_one\string##2\egroup
+ }
+ \csname~r-#1\endcsname
+ \csname~set-\string\l-#2\endcsname\gobble_one{00}
+}
+%</pkg>
+% \end{macrocode}
+% \changes{1.909}{1999/10/19}{A use of \#1 where it should have
+% been \#2 was corrected. (LH)}
+% \begin{macrocode}
+%<*doc>
+\DeclareRobustCommand\kerning[2]{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#1}%
+ \MakePrintable\@tempb{FD@swa}{#2}%
+ \protected@xdef\FD@expression{%
+ \mathop{\protect\mathrm{k{}}}(%
+ \text{\protect\FD@typeset@string{\@tempa}}%
+ ,\penalty\FD@commapenalty
+ \text{\protect\FD@typeset@string{\@tempb}}%
+ )%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\@ne
+ \FD@evaluate@false
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifiskern}
+% |\ifiskern|\marg{glyph1}\marg{glyph2}|\then|
+%
+% This command tests if there is a kern pair between \meta{glyph1} and
+% \meta{glyph2}. It's hard to say if there is a use for it, but it is
+% included for symmetry.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\ifiskern#1#2\then{
+ \def\k##1##2{\ifx T##1 \let\k\gobble_two \fi}
+ \bgroup
+ \x_cs\let{l-#2}T
+ \csname r-#1\endcsname
+ \expandafter\egroup \ifx\k\gobble_two
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\ifiskern#1#2\then{%
+ \generic@if{kern \typeset@glyph{#1}${}+{}$\typeset@glyph{#2} set}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\unsetkerns}
+% |\unsetkerns|\marg{left~glyph~list}\marg{right~glyph~list}
+%
+% This command unsets all kerns with a glyph in the \meta{left~glyph~list}
+% on the left and a glyph in the \meta{right~glyph~list} on the right.
+% The lists themselves are ordinary comma-separated lists. Unlike
+% |\setkern| and |\resetkern|, |\unsetkerns| actually removes the
+% kerning pairs from \TeX's memory.
+%
+% The implementation itself simply goes through |\r-|\meta{left~glyph}
+% for each element \meta{left~glyph} in \meta{left~glyph~list} and
+% |\l-|\meta{right~glyph} for each element \meta{right~glyph} in
+% \meta{right~glyph~list}, removing each |\k|\meta{token}\meta{token}
+% tripple that refers to a glyph from the opposite list as it goes
+% along. To make this test reasonably fast, the routine first ``marks''
+% the glyphs in the other list by setting the control sequences
+% |\slots-|\meta{glyph} to |U| (the letter token U). This mark is
+% later removed when the |\r-|\meta{glyph} or |\l-|\meta{glyph}
+% respectively control sequences have been gone through; the
+% |\slots-|\meta{glyph} control sequences are then set to |\relax|.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\unsetkerns#1#2{
+ \let\k\k_unless_to_U
+ \process_csep_list\make_slots_U#1,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{l-##1}}
+ \process_csep_list\do#2,\process_csep_list,
+ \process_csep_list\make_slots_relax#1,\process_csep_list,
+ \process_csep_list\make_slots_U#2,\process_csep_list,
+ \def\do##1{\x_cs\main_remove_Us{r-##1}}
+ \process_csep_list\do#1,\process_csep_list,
+ \process_csep_list\make_slots_relax#2,\process_csep_list,
+}
+\def\make_slots_U#1{\x_cs\let{slots-#1}U}
+\def\make_slots_relax#1{\x_cs\let{slots-#1}\x_relax}
+\def\k_unless_to_U#1#2{
+ \x_cs\ifx{slots-\expandafter\gobble_three\string#1}U \else
+ \noexpand\k\noexpand#1\noexpand#2
+ \fi
+}
+\def\main_remove_Us#1{
+ \ifx#1\x_relax \else
+ \edef#1{#1}
+ \ifx#1\empty_command \let#1\x_relax \fi
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\unsetkerns[2]{%
+ \Bheading{Remove} all kerning pairs in
+ \FD@typeset@string@set{#1}${}\times{}$\FD@typeset@string@set{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FD@typeset@string@set}
+% \begin{macro}{\FD@typeset@string@set@}
+% \multchanges{\cs{FD@typeset@string@set}^^A
+% \cs{FD@typeset@string@set@}}{1.916}{2001/01/02}{Macros added.
+% \cs{FD@typeset@string@set} should be used instead of
+% \cs{print@csep@list} in most occations. (LH)}
+% The |\FD@typeset@string@set| macro takes a comma-separated list of
+% string expressions as argument and typesets that list as elements of
+% a set, e.g.
+% \begin{quote}
+% |\FD@typeset@string@set{a,b,\str{c}}|
+% \end{quote}
+% is typeset as
+% \begin{quote}
+% $\{$\texttt{a}$,{}$\texttt{b}$,\mathrm{s}($\texttt{c}$)\}$
+% \end{quote}
+% \begin{macrocode}
+\def\FD@typeset@string@set#1{%
+ \toks@={}%
+ \@for\@tempa:=#1\do{%
+ \protected@edef\@tempa{%
+ \noexpand\MakePrintable \noexpand\@tempa {FD@swa}{\@tempa}%
+ }%
+ \@tempa
+ \toks@=\expandafter{\the\expandafter\toks@
+ \expandafter\do \expandafter{\@tempa}}%
+ }%
+ \expandafter\FD@typeset@string@set@ \expandafter{\the\toks@}%
+}
+\def\FD@typeset@string@set@#1{%
+ \TypesetList{$\{$}{$,\penalty\FD@commapenalty{}$}%
+ {$,\penalty\FD@commapenalty{}$}{$,\penalty\FD@commapenalty{}$}%
+ {$\}$}{$\emptyset$}{\FD@typeset@string}{#1}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\noleftkerning}
+% \changes{1.906}{1999/07/30}{Macro added. (LH)}
+% \begin{macro}{\norightkerning}
+% \changes{1.906}{1999/07/30}{Macro added. (LH)}
+% \begin{macro}{\noleftrightkerning}
+% \changes{1.906}{1999/07/30}{Macro added. (LH)}
+% The argument of these commands is the name of a glyph. The commands
+% removes all kerns on the left, on the right, and on both sides
+% respectively, of this glyph.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\noleftkerning#1{\no_kerning{l}{#1}}
+\def\norightkerning#1{\no_kerning{r}{#1}}
+\def\noleftrightkerning#1{\no_kerning{l}{#1}\no_kerning{r}{#1}}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\noleftkerning[1]{%
+ \Bheading{Remove kerns} on the left of glyphs in
+ \FD@typeset@string@set{#1}.}
+\newcommand\norightkerning[1]{%
+ \Bheading{Remove kerns} on the right of glyphs in
+ \FD@typeset@string@set{#1}.}
+\newcommand\noleftrightkerning[1]{%
+ \Bheading{Remove kerns} on any side of glyphs in
+ \FD@typeset@string@set{#1}.}
+%</doc>
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\no_kerning}
+% \changes{1.906}{1999/07/30}{Macro added. (LH)}^^A
+% \changes{1.906}{1999/08/01}{Macro thoroughly rewritten. (LH)}^^A
+% This macro is called as
+% \begin{quote}
+% |\no_kerning|\marg{side}\marg{glyph list}
+% \end{quote}
+% where \meta{side} is |l| or |r|, and \meta{glyph list} is a
+% comma-separated list of glyph names. The macro unsets all kerns on
+% the \meta{side} side of the glyphs in the \meta{glyph list}.
+%
+% \begin{macrocode}
+%<*pkg>
+\def\no_kerning#1#2{
+ \let\k\no_kerning_i
+ \def\do##1{\csname #1-##1\endcsname}
+ \bgroup
+ \aftergroup\def \aftergroup\a_macro \aftergroup{
+ \process_csep_list\do #2,\process_csep_list,
+ \aftergroup}
+ \egroup
+ \def\do##1{\expandafter\let \csname #1-##1\endcsname \x_relax}
+ \process_csep_list\do #2,\process_csep_list,
+ \let\k\no_kerning_ii
+ \def\do##1{\edef##1{##1}}
+ \a_macro
+}
+% \end{macrocode}
+% \begin{macro}{\no_kerning_i}
+% The |\no_kerning_i| macro is used by |\no_kerning| in constructing
+% a list of all glyphs that a glyph in the \meta{glyph list} has a
+% \meta{side} kern to, while avoiding repetitions.
+% \begin{macrocode}
+\def\no_kerning_i#1#2{
+ \ifx #1\x_relax \else
+ \aftergroup\do \aftergroup#1
+ \let #1\x_relax
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\no_kerning_ii}
+% The |\no_kerning_ii| macro is similar to the |\k_unless_to_U|
+% macro.
+% \begin{macrocode}
+\def\no_kerning_ii#1#2{
+ \ifx #1\x_relax \else \noexpand\k \noexpand#1 \noexpand#2 \fi
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Glyph information}
+% \label{Ssec:Glyph-info}
+%
+% The glyph information is kept in the macros
+% \describecsfamily{g-\meta{name}}|\g-|\meta{name}, which expands
+% out to:
+% \begin{quote}
+% \marg{width}\marg{height}\marg{depth}\marg{italic}^^A
+% \marg{mapcommands}\marg{mapfonts}
+% \end{quote}
+% where the \meta{mapcommands} will write out VPL |MAP| fragments to a
+% |.vpl| file, and the \meta{mapfonts} will produce any |MAPFONT|
+% instructions that are needed.
+%
+%
+% \begin{macro}{\typeset@glyph}
+% \changes{1.909}{1999/10/20}{Macro added, and most commands that
+% print a glyph name changed to use this macro. (LH)}
+% \changes{1.916}{2001/01/02}{Macro redefined (made synonymous to
+% \cs{Typeset\-String\-Expression}). (LH)}
+% The |\typeset@glyph| macro takes a string expression and typesets
+% that as the name of a glyph. Currently names of glyphs are formatted
+% precisely the same as any other string expression.
+% \begin{macrocode}
+%<doc>\let\typeset@glyph=\TypesetStringExpression
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\width}
+% \begin{macro}{\height}
+% \begin{macro}{\depth}
+% \begin{macro}{\italic}
+% |\width|\marg{glyph}\\
+% |\height|\marg{glyph}\\
+% |\depth|\marg{glyph}\\
+% |\italic|\marg{glyph}
+%
+% In \package{fontinst}, these macros return the width, height,
+% depth, and italic correction of \meta{glyph} as an integer.
+% \begin{macrocode}
+%<*pkg>
+\def\width{\glyph_parameter\first_of_six}
+\def\height{\glyph_parameter\second_of_six}
+\def\depth{\glyph_parameter\third_of_six}
+\def\italic{\glyph_parameter\fourth_of_six}
+%</pkg>
+% \end{macrocode}
+%
+% In \package{fontdoc}, they print symbolic representations for the
+% corresponding integer expressions.
+% \begin{macrocode}
+%<*doc>
+\DeclareRobustCommand\width[1]{\FD@glyph@metric{w}{#1}}
+\DeclareRobustCommand\height[1]{\FD@glyph@metric{h}{#1}}
+\DeclareRobustCommand\depth[1]{\FD@glyph@metric{d}{#1}}
+\DeclareRobustCommand\italic[1]{\FD@glyph@metric{i}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\FD@glyph@metric}
+% The |\FD@glyph@metric| macro is a convenient shorthand to use when
+% defining integer-valued functions which represents some glyph
+% metric (e.g.\ \cs{height}). Its syntax is
+% \begin{quote}
+% |\FD@glyph@metric|\marg{func-name}\marg{string expression}
+% \end{quote}
+% The \meta{string expression} must be expanded.
+% \begin{macrocode}
+\def\FD@glyph@metric#1#2{%
+ \begingroup
+ \MakePrintable\@tempa{FD@swa}{#2}%
+ \protected@xdef\FD@expression{%
+ \protect\FD@integer@func{#1}{\@tempa}%
+ }%
+ \global\chardef\FD@priority=5%
+ \global\FD@bracket@level=\@ne
+ \FD@evaluate@false
+ \endgroup
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\mapcommands}
+% \begin{macro}{\mapfonts}
+% These are similar to |\width| and its companions, but they are not
+% user level commands.
+% \begin{macrocode}
+%<*pkg>
+\def\mapcommands{\glyph_parameter\fifth_of_six}
+\def\mapfonts{\glyph_parameter\sixth_of_six}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\glyph_parameter}
+% \begin{macro}{\first_of_six}
+% \begin{macro}{\second_of_six}
+% \begin{macro}{\third_of_six}
+% \begin{macro}{\fourth_of_six}
+% \begin{macro}{\fifth_of_six}
+% \begin{macro}{\sixth_of_six}
+% \begin{macro}{\glyph_metrics}
+% These macros are used to define |\width| and its friends.
+% |\glyph_parameter| takes one of the other seven for its first
+% argument and a glyph name for its second argument. The
+% |\glyph_metrics| macro can be used if one wants to get all the
+% metric variables at once.
+% \begin{macrocode}
+%<*pkg>
+\def\glyph_parameter#1#2{
+ \expandafter\expandafter\expandafter
+ #1\csname g-#2\endcsname
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\first_of_six#1#2#3#4#5#6{#1}
+\def\second_of_six#1#2#3#4#5#6{#2}
+\def\third_of_six#1#2#3#4#5#6{#3}
+\def\fourth_of_six#1#2#3#4#5#6{#4}
+\def\fifth_of_six#1#2#3#4#5#6{#5}
+\def\sixth_of_six#1#2#3#4#5#6{#6}
+% \end{macrocode}
+% \begin{macrocode}
+\def\glyph_metrics#1#2#3#4#5#6{
+ \a_count=#1
+ \b_count=#2
+ \c_count=#3
+ \d_count=#4~
+}
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+% \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\saved_scale}
+% \begin{macro}{\saved_mapfont}
+% \begin{macro}{\saved_raw}
+% \begin{macro}{\saved_rule}
+% \begin{macro}{\saved_special}
+% \begin{macro}{\saved_warning}
+% \begin{macro}{\saved_movert}
+% \begin{macro}{\saved_moveup}
+% \begin{macro}{\saved_push}
+% \begin{macro}{\saved_pop}
+% These are the commands allowed inside a glyph. They are initally
+% set to |\relax|, so we can |\edef| with them safely.
+% \begin{macrocode}
+\let\saved_scale\x_relax
+\let\saved_mapfont\x_relax
+\let\saved_raw\x_relax
+\let\saved_rule\x_relax
+\let\saved_special\x_relax
+\let\saved_warning\x_relax
+\let\saved_movert\x_relax
+\let\saved_moveup\x_relax
+\let\saved_push\x_relax
+\let\saved_pop\x_relax
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+%
+% When the glyph is being constructed by
+% \begin{quote}
+% |\setglyph|\marg{glyph} \meta{glyph commands} |\endsetglyph|
+% \end{quote}
+% the values of each of these parameters are kept in the following
+% variables. Except for |\glyph_width|, these are kept globally,
+% so they survive through |\push| \textellipsis\ |\pop| pairs. In
+% addition, the current vertical offset is kept locally in
+% |\glyph_voffset|. The |\glyph_maxhpos| variable globally keeps track
+% of the largest horizontal offset position reached so far (with the
+% possible exception of the current position, i.e.\ width, which may
+% well be larger).
+%
+%
+% \begin{macro}{\glyph_width}
+% \begin{macro}{\glyph_height}
+% \begin{macro}{\glyph_depth}
+% \begin{macro}{\glyph_italic}
+% \begin{macro}{\glyph_map_commands}
+% \begin{macro}{\glyph_map_fonts}
+% \begin{macro}{\glyph_voffset}
+% \begin{macro}{\glyph_maxhpos}
+% \changes{1.903}{1999/05/20}{Variable added. (LH)}
+% \begin{macrocode}
+\newcount\glyph_width
+\newcount\glyph_height
+\newcount\glyph_depth
+\newcount\glyph_italic
+\newtoks\glyph_map_commands
+\newtoks\glyph_map_fonts
+\newcount\glyph_voffset
+\newcount\glyph_maxhpos
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+% \end{macro} \end{macro} \end{macro}
+%
+% \begin{macro}{\setglyph}
+% \changes{1.916}{2001/01/06}{Added `set' to \package{fontdoc} text.
+% (LH)}
+% \begin{macro}{\gobble_glyph}
+% The |\setglyph|\marg{name} command defines |\g-|\meta{name},
+% unless |\g-|\meta{name} has already been defined.
+%
+% The reason |\g-|\meta{name} is defined before calling |\resetglyph|
+% is to make it possible to refer to ``the glyph constructed so far''
+% using |\width|\marg{name}, |\height|\marg{name}, etc.
+% \begin{macrocode}
+\def\setglyph#1{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \expandafter\gobble_glyph
+ \else
+ \x_cs\def{g-\glyph_name_modifier{#1}}{
+ {\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}
+ }
+ \resetglyph{\glyph_name_modifier{#1}}
+ \fi
+}
+\long\def\gobble_glyph#1\endsetglyph{}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\setglyph[1]{%
+ \FD@tight@true
+ \Aheading{Set glyph `\typeset@glyph{#1}'}%
+}
+%</doc>
+%<misc>\long\def\setglyph#1\endsetglyph{}
+% \end{macrocode}
+%
+% LH 2003/01/05: A very useful trick, which unfortunately used to be
+% undocumented, is to put kerning or variable assignment commands
+% between |\setglyph| and the corresponding |\endsetglyph|. These
+% commands will then only be executed if the glyph is being set by
+% that |\setglyph|. Typical application: If \texttt{Aacutesmall}
+% is being made by skrinking \texttt{Aacute}, then it is reasonable
+% to make \texttt{Aacutesmall} kern like \texttt{Aacute} (modulo
+% some scaling factor). If on the other hand \texttt{Aacutesmall}
+% has already been set then there is less reason to believe
+% \texttt{Aacutesmall} should kern like \texttt{Aacute} (a more
+% probable guess is that it should kern like \texttt{Asmall}).
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\resetglyph}
+% The |\resetglyph|\marg{name} command redefines |\g-|\meta{name},
+% regardless of whether |\g-|\meta{name} has already been defined.
+% \changes{1.923}{2002/10/20}{\cs{edef}ing \cs{glyphname}, for
+% consistency with \cs{setslot}. In principle, this could break
+% MTX files, but I doubt that it will. (LH)}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\resetglyph#1{
+ \edef\glyphname{#1}
+ \glyph_width=0
+ \global\glyph_height=0
+ \global\glyph_depth=0
+ \global\glyph_italic=0
+ \glyph_voffset=0
+ \global\glyph_maxhpos=0
+ \global\glyph_map_commands={}
+ \global\glyph_map_fonts={}
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\resetglyph[1]{%
+ \FD@tight@true
+ \Aheading{Reset glyph `\typeset@glyph{#1}'}}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endsetglyph}
+% \begin{macro}{\endresetglyph}
+% \begin{macrocode}
+%<*pkg>
+\def\endsetglyph{
+ \x_cs\edef{g-\glyphname}
+ {{\the\glyph_width}{\the\glyph_height}
+ {\the\glyph_depth}{\the\glyph_italic}
+ {\the\glyph_map_commands}{\the\glyph_map_fonts}}
+}
+\let\endresetglyph=\endsetglyph
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\let\endsetglyph=\FD@tight@false
+\let\endresetglyph=\FD@tight@false
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\setscaledrawglyph}
+% \changes{1.922}{2002/09/07}{Corrected typo: should test whether the
+% \texttt{rawscale} integer exists, not whether the
+% \texttt{i-rawscale} integer exists. (LH)}
+% \begin{macro}{\setrawglyph}
+% The |\setscaledrawglyph| has the syntax
+% \begin{isyntax}
+% |\setscaledrawglyph|\marg{glyph}\marg{font}\marg{design size}^^A
+% \marg{scale}\penalty0\marg{slot}\penalty0\marg{width}\penalty0
+% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}
+% \end{isyntax}
+% It is a generalized form of the old |\setrawglyph| command, which
+% has the syntax
+% \begin{isyntax}
+% |\setrawglyph|\marg{glyph}\marg{font}\marg{design size}^^A
+% \marg{slot}\penalty0\marg{width}\penalty0
+% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}
+% \end{isyntax}
+% |\setrawglyph| is now syntactic sugar for the equivalent call of
+% |\set|\-|scaled|\-|raw|\-|glyph|.
+% \begin{macrocode}
+%<*pkg>
+\def\setrawglyph#1#2#3{
+ \setscaledrawglyph{#1}{#2}{#3}\one_thousand
+}
+% \end{macrocode}
+%
+% These commands are generated automatically, when an |.mtx| file is
+% written out by |\afmtomtx|, |\pltomtx|, or |\mtxtomtx|.
+%
+% To illustrate the difference between |\setrawglyph| and the new
+% |\set|\-|scaled|\-|raw|\-|glyph|, note that
+% \begin{quote}
+% |\setscaledrawglyph{fscaled}{xfont}{10pt}{800}{102}%|\\
+% | {300}{600}{300}{40}|
+% \end{quote}
+% produces the same \texttt{fscaled} glyph as
+% \begin{quote}
+% |\setrawglyph{f}{xfont}{10pt}{102}{375}{750}{375}{50}|\\
+% |\setglyph{fscaled} \glyph{f}{800} \endsetglyph|
+% \end{quote}
+%
+% \begin{macrocode}
+\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \eval_expr{#4}
+ \ifnum \result=\one_thousand
+ \let\a_macro\identity_one
+ \else
+ \edef\a_macro##1{\saved_scale{\the\result}{##1}}
+ \fi
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro##1{\saved_scale{\the\e_count}{\a_macro{##1}}}
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {\a_macro{\saved_raw{#2}{#5}{#1}}}
+ {\a_macro{\saved_mapfont{#2}{#3}}}
+ }
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\setrawglyph[8]{%
+ \Aheading{Glyph `\typeset@glyph{#1}'}
+ \Bheading{Taken from} slot $\TypesetIntegerExpression{#4}$ in
+ font \TypesetStringExpression{#2}%
+}
+\newcommand\setscaledrawglyph[9]{%
+ \Aheading{Glyph `\typeset@glyph{#1}'}
+ \Bheading{Taken from} slot $\TypesetIntegerExpression{#5}$ in
+ font \TypesetStringExpression{#2} \ConditionallyScaled{#4}%
+}
+%</doc>
+%<misc>\def\setrawglyph#1#2#3#4#5#6#7#8{}
+%<misc>\def\setscaledrawglyph#1#2#3#4#5#6#7#8#9{}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\setscalednotglyph}
+% \changes{1.917}{2001/03/13}{This macro should set
+% \cs{g-\meta{glyph}-not}, not \cs{g-\meta{glyph}}. (LH)}
+% \changes{1.922}{2002/09/07}{Corrected typo: should test whether
+% the \texttt{rawscale} integer exists, not whether the
+% \texttt{i-rawscale} integer exists. (LH)}
+% \begin{macro}{\setnotglyph}
+% The |\setscalednotglyph| command has the same syntax as the
+% |\set|\-|scaled|\-|raw|\-|glyph| command, i.e.,
+% \begin{isyntax}
+% |\setscalednotglyph|\marg{glyph}\marg{font}\marg{design size}^^A
+% \marg{scale}\penalty0\marg{slot}\penalty0\marg{width}\penalty0
+% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}
+% \end{isyntax}
+% It is a generalized form of the old |\setnotglyph| command, which
+% has the syntax
+% \begin{isyntax}
+% |\setnotglyph|\marg{glyph}\marg{font}\marg{design size}^^A
+% \marg{slot}\penalty0\marg{width}\penalty0\marg{height}\penalty0
+% \marg{depth}\penalty0\marg{italic}
+% \end{isyntax}
+% |\setnotglyph| is now syntactic sugar for the equivalent call of
+% |\set|\-|scaled|\-|not|\-|glyph|.
+% \begin{macrocode}
+%<*pkg>
+\def\setnotglyph#1#2#3{
+ \setscalednotglyph{#1}{#2}{#3}\one_thousand
+}
+% \end{macrocode}
+%
+% Note that only the \meta{glyph}, \meta{width}, \meta{height},
+% \meta{depth}, and \meta{italic} parameters are used. The reason for
+% having the other parameters is that |\set|\-|scaled|\-|not|\-^^A
+% |glyph| commands can be converted to |\set|\-|scaled|\-|raw|\-^^A
+% |glyph| commands when a font is reencoded. Therefore all the
+% information must be present, even if it is not used by the main
+% definition.
+%
+% To think about (LH 2000/03/02): Perhaps the \meta{mapcommands} field
+% of a \texttt{-not}-glyph should contain a |\glyphwarning|, just in
+% case anyone tries to use one?
+% \begin{macrocode}
+\def\setscalednotglyph#1#2#3#4#5#6#7#8#9{
+ \if_undefined{g-\glyph_name_modifier{#1}-not}\then
+ \eval_expr_to\a_count{#6}
+ \eval_expr_to\b_count{#7}
+ \eval_expr_to\c_count{#8}
+ \eval_expr_to\d_count{#9}
+ \ifisint{rawscale}\then
+ \e_count=\int{rawscale}
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \fi
+ \x_cs\edef{g-\glyph_name_modifier{#1}-not}{
+ {\the\a_count}
+ {\the\b_count}
+ {\the\c_count}
+ {\the\d_count}
+ {}{}
+ }
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\setnotglyph[8]{%
+ \Aheading{Pseudoglyph `\typeset@glyph{#1-not}'}%
+}
+\newcommand\setscalednotglyph[9]{%
+ \setnotglyph{#1}{#2}{#3}{#5}{#6}{#7}{#8}{#9}%
+}
+%</doc>
+%<misc>\let\setnotglyph=\setrawglyph
+%<misc>\let\setscalednotglyph=\setscaledrawglyph
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\unsetglyph}
+% The |\unsetglyph|\marg{name} command makes |\g-|\meta{name}
+% undefined.
+%
+% \begin{macrocode}
+%<pkg>\def\unsetglyph#1{\x_cs\let{g-#1}\x_relax}
+%<doc>\newcommand\unsetglyph[1]{%
+%<doc> \Aheading{Unset glyph `\typeset@glyph{#1}'}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Glyph commands}
+%
+% The \meta{glyph commands} are:
+% \changes{1.908}{1999/08/22}{Glyph commands avoid \cs{edef}ing old
+% contents of \cs{glyph_map_commands} and \cs{glyph_map_fonts}. (LH)}
+% \begin{macro}{\glyph}
+% |\glyph|\marg{glyph}\marg{scale}
+% \changes{1.900}{1999/02/08}{Avoids scaling by 1000. (LH)}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\glyph#1#2{
+ \glyph_parameter\glyph_metrics{#1}
+ \eval_expr_to\e_count{#2}
+ \ifnum \e_count=\one_thousand
+ \edef\a_macro{\mapcommands{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\mapfonts{#1}}
+ \else
+ \multiply \a_count \e_count \l_rounded_thousandths\a_count
+ \multiply \b_count \e_count \l_rounded_thousandths\b_count
+ \multiply \c_count \e_count \l_rounded_thousandths\c_count
+ \multiply \d_count \e_count \l_rounded_thousandths\d_count
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapcommands{#1}}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \edef\a_macro{\saved_scale{\the\e_count}{\mapfonts{#1}}}
+ \fi
+ \advance \glyph_width \a_count
+ \advance \b_count \glyph_voffset
+ \ifnum \glyph_height<\b_count \global\glyph_height=\b_count \fi
+ \advance \c_count -\glyph_voffset
+ \ifnum \glyph_depth<\c_count \global\glyph_depth=\c_count \fi
+ \global\glyph_italic=\d_count
+ \global\glyph_map_fonts\expandafter{
+ \the\expandafter\glyph_map_fonts \a_macro
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\glyph[2]{%
+ \Bheading{Glyph} `\typeset@glyph{#1}' \ConditionallyScaled{#2}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glyphrule}
+% |\glyphrule|\marg{width}\marg{height}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\glyphrule#1#2{
+ \eval_expr_to\b_count{#1} \eval_expr_to\c_count{#2}
+ \advance\glyph_width by \b_count
+ \g_eval_expr_to\glyph_depth{\max\glyph_depth{-\glyph_voffset}}
+ \g_eval_expr_to\glyph_height{
+ \max\glyph_height{\add\glyph_voffset\c_count}
+ }
+ \global\glyph_italic=0
+ \edef\a_macro{\saved_rule{\the\b_count}{\the\c_count}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\glyphrule[2]{%
+ \Bheading{Rule} $\TypesetIntegerExpression{#1}$ by
+ $\TypesetIntegerExpression{#2}$%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glyphspecial}
+% \begin{macro}{\glyphwarning}
+% |\glyphspecial|\marg{string}\\
+% |\glyphwarning|\marg{string}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\glyphspecial#1{
+ \edef\a_macro{\saved_special{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+\def\glyphwarning#1{
+ \edef\a_macro{\saved_warning{#1}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\glyphspecial[1]{%
+ \Bheading{Special} `\TypesetStringExpression{#1}'}
+\newcommand\glyphwarning[1]{%
+ \Bheading{Warning} `\TypesetStringExpression{#1}'}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\movert}
+% \changes{1.903}{1999/05/20}{Added update of \cs{glyph_maxhpos}. (LH)}
+% \begin{macro}{\moveup}
+% |\movert|\marg{xoffset}\\
+% |\moveup|\marg{yoffset}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\movert#1{
+ \eval_expr{#1}
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \ifnum 0=\result \else
+ \advance\glyph_width by \result
+ \edef\a_macro{\saved_movert{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\moveup#1{
+ \eval_expr{#1}
+ \ifnum\result=0\else
+ \advance\glyph_voffset by \result
+ \edef\a_macro{\saved_moveup{\the\result}}
+ \global\glyph_map_commands\expandafter{
+ \the\expandafter\glyph_map_commands \a_macro
+ }
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\movert[1]{\Bheading{Rt}~$\TypesetIntegerExpression{#1}$}
+\newcommand\moveup[1]{\Bheading{Up}~$\TypesetIntegerExpression{#1}$}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\push}
+% \changes{1.907}{1999/08/02}{Removed the \cs{edef}. (LH)}
+% \begin{macro}{\pop}
+% \changes{1.903}{1999/05/20}{Added update of \cs{glyph_maxhpos}. (LH)}
+% \changes{1.907}{1999/08/02}{Removed the \cs{edef}. (LH)}
+% \begin{macrocode}
+%<*pkg>
+\def\push{
+ \bgroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_push
+ }
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\pop{
+ \ifnum \glyph_maxhpos<\glyph_width
+ \global\glyph_maxhpos\glyph_width
+ \fi
+ \egroup
+ \global\glyph_map_commands\expandafter{
+ \the\glyph_map_commands \saved_pop
+ }
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\push{\Bheading{Push}}
+\newcommand\pop{\Bheading{Pop}}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\resetwidth}
+% \begin{macro}{\resetheight}
+% \begin{macro}{\resetdepth}
+% \begin{macro}{\resetitalic}
+% |\resetwidth|\marg{width}\\
+% |\resetheight|\marg{height}\\
+% |\resetdepth|\marg{depth}\\
+% |\resetitalic|\marg{italic}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\resetwidth#1{\movert{\sub{#1}\glyph_width}}
+\def\resetheight{\g_eval_expr_to\glyph_height}
+\def\resetdepth{\g_eval_expr_to\glyph_depth}
+\def\resetitalic{\g_eval_expr_to\glyph_italic}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\resetwidth[1]{%
+ \Bheading{Reset width to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetheight[1]{%
+ \Bheading{Reset height to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetdepth[1]{%
+ \Bheading{Reset depth to $\TypesetIntegerExpression{#1}$}%
+}
+\newcommand\resetitalic[1]{%
+ \Bheading{Reset italic to $\TypesetIntegerExpression{#1}$}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\glyphpcc}
+% Some syntactic sugar: |\glyphpcc| could do with optimization.
+% \begin{quote}
+% |\glyphpcc|\marg{glyph}\marg{xoffset}\marg{yoffset}
+% \end{quote}
+% \changes{1.925}{2003/05/28}{Added check that the glyph used is
+% defined; we get an ugly error if it isn't. (LH)}
+% \changes{1.932}{2005/06/17}{Changed error message to warning when a
+% corresponding notglyph exists. (LH) This deals with an issue
+% regarding composites in fonts which have been reencoded to
+% something not a superset of \texttt{8a}.}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\glyphpcc#1#2#3{
+ \ifisglyph{\glyph_name_modifier{#1}}\then
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{\glyph_name_modifier{#1}}{\one_thousand}
+ \pop
+ \else\ifisglyph{\glyph_name_modifier{#1}-not}\then
+ \fontinstwarning{\string\glyphpcc}{
+ Base~glyph~`\glyph_name_modifier{#1}'~not~appended,\messagebreak
+ because~it~is~so~far~unencoded~in~the~glyph~base
+ }
+ \else
+ \fontinsterror{\string\glyphpcc}{
+ Base~glyph~not~set.\messagebreak
+ This~could~be~a~sign~that~the~AFM~file~is~buggy
+ }\error_help_a
+ \fi\fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\glyphpcc#1#2#3{
+ \push
+ \movert{#2}
+ \moveup{#3}
+ \glyph{#1}{1000}
+ \pop
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glyphbboxright}
+% \changes{1.903}{1999/05/20}{Macro added. (LH)}
+% The |\glyphbboxright| command is a valid integer expression, but
+% its value is only meaningful inside a |\setglyph| \textellipsis\
+% |\endsetglyph| or |\resetglyph| \textellipsis\ |\endresetglyph|
+% structure. There its value is almost the horizontal position of
+% the right edge of the bounding box for the glyph constructed so
+% far---in reality it is the greatest horizontal offset reached so
+% far.
+%
+% \begin{macrocode}
+%<pkg>\def\glyphbboxright{\max\glyph_width\glyph_maxhpos}
+%<*doc>
+\DeclareRobustCommand\glyphbboxright{%
+ \gdef\FD@expression{\protect\mathrm{glyphbboxright}}
+ \global\chardef\FD@priority=\tw@
+ \global\FD@bracket@level=\z@
+ \FD@evaluate@false
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\samesize}
+% \changes{1.903}{1999/05/20}{Added behaviour for nonexistent glyph
+% (based on a suggestion from Hilmar Schlegel) and fixed typo in
+% \package{fontdoc}. (LH)}
+% |\samesize|\marg{glyph}
+%
+% \begin{macrocode}
+%<*pkg>
+\def\samesize#1{
+ \if_undefined{g-\glyph_name_modifier{#1}}\then
+ \resetwidth{\glyphbboxright}
+ \else
+ \expandafter\expandafter\expandafter
+ \same_size\csname g-\glyph_name_modifier{#1}\endcsname
+ \fi
+}
+\def\same_size#1#2#3#4#5#6{
+ \movert{\sub{#1}\glyph_width}
+ \global\glyph_height=#2
+ \global\glyph_depth=#3
+ \global\glyph_italic=#4
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\newcommand\samesize[1]{%
+ \Bheading{Reset dimensions to those of `\typeset@glyph{#1}'.}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifisglyph}
+% The control flow command:
+% \changes{1.923}{2002/10/20}{Using \cs{if_defined}. (LH)}
+% \begin{macrocode}
+%<pkg>\def\ifisglyph#1\then{\if_defined{g-#1}\then}
+% \end{macrocode}
+% \changes{1.911}{1999/11/30}{\protect\protect\protect\Module{misc}
+% definition added. (LH)}
+% |\ifisglyph| evaluates to false in \Module{misc}, since this avoids
+% uses of various metric integer expressions (such as |\width|,
+% |\height|, etc.) that are not defined there.
+% \begin{macrocode}
+%<doc>\def\ifisglyph#1\then{\generic@if{glyph \typeset@glyph{#1} set}}
+%<misc>\def\ifisglyph#1\then{\iffalse}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifareglyphs}
+% \changes{1.917}{2001/03/17}{Macro added. (LH)}
+% The |\ifareglyphs| command test if all glyphs in a comma-separeted
+% list of glyphs are set. The syntax is
+% \begin{quote}
+% |\ifareglyphs|\marg{glyph list}|\then|
+% \end{quote}
+% The implementation relies on that |\if_true| and |\if_false| do not
+% count when \TeX\ is skipping text that is balanced with respect to
+% |\if|s and |\fi|s.
+% \begin{macrocode}
+%<*pkg>
+\def\ifareglyphs#1\then{
+ \process_csep_list{\if_is_glyph}#1,\process_csep_list,
+ \if_true
+}
+\def\if_is_glyph#1{
+ \if_undefined{g-#1}\then \expandafter\if_false \fi
+}
+%</pkg>
+%<misc>\let\ifareglyphs=\ifisglyph
+%<*doc>
+\def\ifareglyphs#1\then{%
+ \generic@if{all glyphs in \FD@typeset@string@set{#1} are set}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Converting an ETX file to a (V)PL file}
+%
+% \subsection{Lowest-level user interface}
+%
+% \DescribeMacro{\etxtovpl}
+% The macro:
+% \begin{quote}
+% |\etxtovpl|\marg{encoding list}\marg{vplfile}
+% \end{quote}
+% writes a virtual font (as a virtual property list) with the
+% encoding specified by the items in the \meta{encoding list},
+% which typically are names of ETX files.
+% (This macro is called by |\installfont|.)
+%
+% \DescribeMacro{\etxtopl}
+% The macro:
+% \begin{quote}
+% |\etxtopl|\marg{encoding list}\marg{plfile}
+% \end{quote}
+% writes a font (as a property list) with the encoding
+% specified by the items in the \meta{encoding list},
+% which typically are names of ETX files.
+% (This macro is called by |\installrawfont|.)
+%
+% \multchanges{\cs{etxtovpl}\cs{etxtopl}}{1.923}{2002/10/24}{The
+% first argument of these macros is now a comma-separated list
+% of ETX files, and the items may be subjected to modifier
+% clauses. (LH)}
+%
+% \begin{macro}{\etxtovpl}
+% \changes{1.923}{2002/10/25}{The program is called \texttt{vptovf},
+% not \texttt{vpltovf}. (LH)}
+% \begin{macro}{\etxtopl}
+% \begin{macrocode}
+%<*pkg>
+\def\etxtovpl#1#2{{
+ \def\vpl_extension{vpl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{virtual~font}
+ \def\vpl_Font{Virtual~font}
+ \def\vpl_call{\string\etxtovpl{#1}{#2}}
+ \def\vpl_to_vf##1{vptovf~##1.vpl~##1.vf~##1.tfm}
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+\def\etxtopl#1#2{{
+ \def\vpl_extension{pl}
+ \def\vpl_title{COMMENT}
+ \def\vpl_font{font}
+ \def\vpl_Font{Font}
+ \def\vpl_call{\string\etxtopl{#1}{#2}}
+ \def\vpl_to_vf##1{pltotf~##1.pl~##1.tfm}
+ \_including_map_false
+ \global\rawfont_scaling=-\p@
+ \a_toks={}
+ \process_csep_list\make_inputetx #1,\process_csep_list,
+ \expandafter\etx_to_font \expandafter{\the\a_toks}{#2}
+}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{switch}{_including_map_}
+% \changes{1.900}{1998/10/02}{New switch that can inhibit writing of
+% VPL-specific properties. (LH)}
+% The v\,1.5 method of controlling whether \texttt{MAP} and
+% \texttt{MAPFONT} properties should be written requires that some
+% code is put in an awkward place (in |\make_mapfonts| rather than
+% |\make_characters|). As the code was being reorganised anyway, it
+% seemed best to let a switch control this instead. If
+% |\if_including_map_| is true, \texttt{MAP} and \texttt{MAPFONT}
+% properties are written to the file (which should be a VPL), if it is
+% false then they are not written to the file (which is then a normal
+% PL).
+% \begin{macrocode}
+\newif\if_including_map_
+\_including_map_true
+% \end{macrocode}
+% \end{switch}
+%
+% \begin{macro}{\make_inputetx}
+% The |\make_inputetx| macro takes a single argument that should have
+% the form
+% \begin{quote}
+% \meta{file name root}\meta{optional modifiers}
+% \end{quote}
+% as explained in the comments to |\input_mtx_file|. The effect of
+% this macro is to append some commands (usually
+% |\inputetx|\marg{file name root}) to |\a_toks|. This may however
+% change if some clause in the \meta{optional modifiers} redefines
+% |\a_macro|.
+% \changes{1.923}{2002/10/24}{Macro added. (LH)}
+% \begin{macrocode}
+\def\make_inputetx#1{
+ \def\a_macro{\noexpand\inputetx{\file_name}}
+ \get_file_name #1~{}~\par
+ \edef\a_macro{\a_macro}
+ \a_toks=\expandafter{ \the\expandafter\a_toks \a_macro}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IFKW-mtxasetx}
+% The \texttt{mtxasetx} modifier clause causes the \meta{encoding
+% list} item in question to be input using |\input_mtx_as_etx| rather
+% than |\inputetx|. This makes it possible to use the |\setrawglyph|
+% and |\setscaledrawglyph| commands in an MTX file as a poor
+% substitute for a proper ETX file. This is sometimes useful for
+% making proofs.
+% \changes{1.923}{2002/10/24}{Macro added. (LH)}
+% \begin{macrocode}
+\x_cs\def{IFKW-mtxasetx}{
+ \def\a_macro{\noexpand\input_mtx_as_etx{\file_name}}
+ \get_keyword
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\etx_to_font}
+% |\etx_to_font|\marg{encoding commands}\marg{fontfile} makes
+% a (V)PL file whose encoding is specified by the \meta{encoding
+% commands}. These are usually just one or a few |\inputetx|
+% commands, as the specification of an encoding usually requires much
+% more code than is convenient to provide as an argument.
+% \changes{1.923}{2002/10/24}{Made the first argument a list of
+% commands. Renamed \cs{vpl_caller} to \cs{vpl_call}; it is now
+% assumed to contain the arguments as well. (LH)}
+% \begin{macrocode}
+\def\etx_to_font#1#2{
+ \make_assignments{#1}
+ \open_out{#2.\vpl_extension}
+ \top_of_pl_hook
+ \out_line{(\vpl_title\space\vpl_font\space
+ #2~created~by~fontinst~v\fontinstversion)}
+ \out_line{}
+ \out_line{(COMMENT~Filename:~#2.\vpl_extension)}
+ \out_line{(COMMENT~Created~by:~tex~\jobname)}
+ \out_line{(COMMENT~Created~using:~\vpl_call)}
+ \out_line{}
+ \out_line{(COMMENT~This~file~can~be~turned~into~a~\vpl_font\space
+ with)}
+ \out_line{(COMMENT~\vpl_to_vf{#2})}
+ \out_line{}
+ \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)}
+ \out_line{}
+ \make_header{#1}
+ \if_including_map_ \make_mapfonts{#1} \fi
+ \make_fontdimens{#1}
+ \make_ligtable{#1}
+ \make_characters{#1}
+ \make_tidy{#1}
+ \out_line{}
+ \out_line{(COMMENT~END~OF~FILE~#2.\vpl_extension)}
+ \close_out{\vpl_Font}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\pre_first_etx_pass_hook}
+% \begin{macro}{\pre_second_etx_pass_hook}
+% \begin{macro}{\pre_third_etx_pass_hook}
+% \begin{macro}{\pre_fourth_etx_pass_hook}
+% \begin{macro}{\post_first_etx_pass_hook}
+% \begin{macro}{\post_second_etx_pass_hook}
+% \begin{macro}{\post_third_etx_pass_hook}
+% \begin{macro}{\post_fourth_etx_pass_hook}
+% \begin{macro}{\tidying_up_hook}
+% \multchanges{\cs{pre_first_etx_pass_hook}^^A
+% \cs{pre_second_etx_pass_hook}\cs{pre_third_etx_pass_hook}^^A
+% \cs{pre_fourth_etx_pass_hook}\cs{post_first_etx_pass_hook}^^A
+% \cs{post_second_etx_pass_hook}\cs{post_third_etx_pass_hook}^^A
+% \cs{post_fourth_etx_pass_hook}\cs{tidying_up_hook}}{1.900}^^A
+% {1998/09/30}{ETX-to-VPL hooks added. (LH)}
+% \begin{macro}{\top_of_pl_hook}
+% \changes{1.912}{2000/01/29}{Property list hook added. (LH)}
+% As the |\etxtovpl| and |\etxtopl| macros are the
+% lowest-level interfaces to what they do that are available in
+% \package{fontinst} and as the amount of code they execute is really
+% quite large, I suspect that users may occationally have need of
+% some robust mechanism for inserting extra code at well specified
+% positions. Such a mechanism is provided by the following hooks:
+% \begin{macrocode}
+\let\pre_first_etx_pass_hook\x_relax
+\let\pre_second_etx_pass_hook\x_relax
+\let\pre_third_etx_pass_hook\x_relax
+\let\pre_fourth_etx_pass_hook\x_relax
+\let\post_first_etx_pass_hook\x_relax
+\let\post_second_etx_pass_hook\x_relax
+\let\post_third_etx_pass_hook\x_relax
+\let\post_fourth_etx_pass_hook\x_relax
+\let\tidying_up_hook\x_relax
+\let\top_of_pl_hook\x_relax
+% \end{macrocode}
+% The first nine are executed at the positions of the ETX-to-VPL
+% file generation that their name indicate. |\top_of_pl_hook| is
+% slightly different---it is executed right after a PL or VPL file
+% is opened for writing. Thus it is also used by the MTX-to-PL system.
+%
+% To include code in one of them, one should write things like
+% \begin{quote}
+% |\add_to\pre_first_etx_pass_hook|\marg{extra code}
+% \end{quote}
+% I (LH) have the following in my \texttt{fontinst.rc} file\relax
+% \SortIndex{fontinst.rc file}{\texttt{fontinst.rc} file}
+% \begin{quote}
+% |\add_to\top_of_pl_hook{\out_line{(COMMENT~-*-Text-*-)}}|
+% \end{quote}
+% Without it, my text editor annoys me by assuming that \texttt{.pl}
+% stands for Perl.
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro}
+%
+%
+% \subsection{Glyph to slot assignments}
+%
+% \changes{1.900}{1998/12/06}{New method of storing slot assignments.
+% (LH)}
+% The way \package{fontinst} has traditionally kept track
+% of which glyph goes to which slot---information which is needed when
+% writing the |LIGTABLE| in a (V)PL, for |\nextlarger|, and for the
+% varchar commands---is by storing the slot number in the integer
+% whose name is the name of the glyph. There are two main problems with
+% this implementation: (i)~If a user sets an integer which happens to
+% have the same name as a glyph that is not assigned to any slot, then
+% kerns for that unused glyph might be written to the file, accidentally
+% creating a kerning pair where there should be none. (ii)~It is only
+% possible to store one slot number per glyph, so if one uses the same
+% glyph for several slots then \package{fontinst} can only write kerns
+% (and ligatures) for one of the occurences, despite the fact that all
+% occurences have the same typographical need for them. These problems
+% do only occur for glyphs on the right side of a ligature/kerning
+% pair, but they are still serious enough. This part of
+% \package{fontinst} has therefore been reimplemented.
+%
+% \changes{1.910}{1999/11/04}{Changed the way slot numbers are stored
+% in \cs{slots-}\meta{glyph} control sequences. (LH)}
+% The new implementation does not use integers, instead it uses a new
+% family of macros with names on the form |\slots-|\meta{glyph}^^A
+% \describecsfamily{slots-\meta{glyph}}. These macros expand to
+% sequences of |\do|\thinspace\meta{character}, where \meta{character}
+% is a category 12 (other) token whose character code equals the slot
+% number.
+%
+% In the entire space of such names, each slot should be mentioned
+% at most once, with one exception, namely the slot which serves as
+% right boundary marker, which may occur twice (once for the glyph
+% which actually is assigned to the slot and once for the right boundary
+% marker glyph). To detect whether there is a collision between these two
+% uses of the slot, the right boundary marker glyph uses |\rboundary_do|
+% instead of |\do| and the glyph whose slot serves as boundarychar uses
+% |\rbserver_do| instead of |\do|. By redefining these two control
+% sequences to generate a warning message when appropriate, the occurence
+% of such a collision can be brought to the user's attention.
+%
+% \changes{1.900}{1998/12/11}{Added compability code for the old
+% interface for boundary ligatures and kerns. (LH)}
+% As it turned out to not be such a big deal, some extra code (protected
+% by a \package{docstrip} switch called \Module{boundaryCompability})
+% that makes \package{fontinst} compatible with the previous syntax for
+% boundary handling has been included. I don't recommend using
+% it though, since it makes \package{fontinst} store almost all slot
+% numbers in two places.
+%
+%
+% \begin{macro}{\make_assignments}
+% \begin{macrocode}
+\def\make_assignments#1{
+ \let\do_slot=\assign_slot
+ \let\end_do_slot=\end_assign_slot
+ \def\do_boundary{\bgroup
+ \let\makerightboundary=\bad_makerightboundary
+ }
+ \let\endsetleftboundary=\egroup
+ \let\makerightboundary=\assign_rboundary
+ \pre_first_etx_pass_hook
+ #1
+ \post_first_etx_pass_hook
+ \let\end_do_slot=\empty_command
+ \let\do_boundary=\x_relax
+ \let\endsetleftboundary=\x_relax
+ \let\makerightboundary=\gobble_one
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\assign_slot}
+% \begin{macro}{\end_assign_slot}
+% \changes{1.907}{1999/08/20}{Slots are not assigned to glyphs that
+% do not exist. (LH)}
+% |\assign_slot| begins the assignment of a slot to a glyph.
+% |\end_assign_slot| completes it. In the time between these two,
+% some information is stored in |\a_toks|, so that it can be
+% modified by an intervening |\makerightboundary| (which is then
+% |\assign_rboundary|).
+%
+% Note that the code below will not reset |\lccode0|. The value of
+% this register should be considered uncertain while a ligful PL
+% or VPL file is written, i.e., in ETX files.
+% \SortIndex{lccode0}{\cs{lccode\,0} register\encapchar usage}
+% \begin{macrocode}
+\def\assign_slot{\a_toks={\do}}
+\begingroup
+ \catcode0=12
+ \gdef\end_assign_slot{
+ \ifisglyph\slot_name\then
+ \lccode0=\slot_number
+ \lowercase{
+ \expandafter\add_to
+ \csname slots-\slot_name\expandafter\endcsname
+ \expandafter{\the\a_toks^^@}
+ }
+%<boundaryCompability> \x_resetint\slot_name\slot_number
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\assign_rboundary}
+% \begin{macro}{\bad_makerightboundary}
+% |\assign_rboundary| is what |\makerightboundary| is when it is
+% assigning a slot to act as right boundary marker.
+%
+% |\bad_makerightboundary| is what |\makerightboundary| temporarily
+% gets set to between |\setleftboundary| and |\endsetleftboundary|.
+% \begin{macrocode}
+ \gdef\assign_rboundary#1{
+ \lccode0=\slot_number
+ \lowercase{\x_cs\add_to{slots-#1}{\rboundary_do^^@}}
+ \x_setint{\percent_char boundarychar}\slot_number
+ \a_toks={\rbserver_do}
+ }
+\endgroup
+\def\bad_makerightboundary#1{
+ \errhelp={The~left~boundary~is~not~a~slot,~so~it~cannot~serve~
+ as~right~boundary.}
+ \errmessage{Incorrect~use~of~\string\makerightboundary}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\get_slot_num}
+% \changes{1.910}{1999/11/04}{Removed redefinition of \cs{do} to
+% \cs{gobble_one} from temporary definition of \cs{do}, since a
+% \cs{slots-} list usually contains only one or two elements
+% anyway. (LH)}
+% It is sometimes necessary to get the number of an arbitrary slot
+% given only the name of the glyph which has been assigned to the
+% slot. In such situations, the call
+% \begin{quote}
+% |\get_slot_num{|\meta{glyph}|}|
+% \end{quote}
+% will set |\result| to the number of one such slot if the glyph has
+% been assigned to some slot, or set |\result| to minus one if the glyph
+% has not been assigned to a slot.
+% \begin{macrocode}
+\def\get_slot_num#1{
+%<*!boundaryCompability>
+ \global\result=-1
+ \bgroup
+ \def\do{\global\result=`}
+ \let\rbserver_do=\do
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \egroup
+%</!boundaryCompability>
+%<*boundaryCompability>
+ \ifisint{#1}\then
+ \global\result=\int{#1}
+ \else
+ \global\result=-1
+ \fi
+ \x_relax
+%</boundaryCompability>
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ifisinslot}
+% The call |\ifisinslot|\marg{glyph}\marg{slot}|\then| can be used to
+% test whether glyph \meta{glyph} has been assigned to slot \meta{slot}.
+% Both then-part and else-part of the conditional will however be
+% ignored when the ETX file is read the first time, since the
+% assignment of glyph to slots need not have been completed yet.
+% \begin{macrocode}
+\def\ifisinslot#1#2\then{
+ \ifx \makerightboundary\gobble_one
+% \end{macrocode}
+% This is used to test if the ETX file is being read in for the first
+% time. It is a bit hacky, but it is efficient.
+% \begin{macrocode}
+ \eval_expr{#2}
+ \begingroup
+ \def\do##1{\ifnum `##1=\result \let\do=\gobble_one \fi}
+ \def\rbserver_do{\do}
+ \let\rboundary_do=\gobble_one
+ \csname slots-#1\endcsname
+ \expandafter\endgroup
+ \ifx \do\gobble_one
+ \expandafter\expandafter \expandafter\if_true
+ \else
+ \expandafter\expandafter \expandafter\if_false
+ \fi
+ \else
+ \expandafter\gobble_if
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\def\ifisinslot#1#2\then{%
+ \generic@if{glyph \typeset@glyph{#1} assigned to slot
+ $\TypesetIntegerExpression{#2}$}%
+}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The header, mapfonts, and fontdimens}
+%
+% \changes{1.913}{2000/02/26}{Using \cs{make_factor} for making PL
+% reals, rather than \cs{afm_convert}+\cs{vpl_real}.
+% \cs{scaled_design_size} replaced by new dimen \cs{mapfont_scaling} for
+% determining mapfont atsize. (LH)}
+%
+% \begin{macro}{\mapfont_scaling}
+% The |\mapfont_scaling| dimen is used for calculating how much a mapfont
+% has been scaled, for use in \texttt{FONTAT} properties, and for
+% selecting the correct mapfont. It is initialized to $1$.
+% \begin{macrocode}
+%<*pkg>
+\newdimen\mapfont_scaling
+\mapfont_scaling=1pt
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rawfont_scaling}
+% The |\rawfont_scaling| dimen is used for communicating the scaling
+% that has been applied to a raw font---a font being installed using
+% |\install|\-|rawfont|\penalty0---out to that macro. |\rawfont_|\-^^A
+% |scaling| should always be globally assigned.
+% \changes{1.913}{2000/03/21}{Dimen added. (LH)}
+% \begin{macrocode}
+\newdimen\rawfont_scaling
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\scaled_design_size}
+% \begin{macro}{\afm_convert}
+% The call
+% \begin{quote}
+% |\afm_convert|\meta{dimen}|=|\meta{integer expression}|;|
+% \end{quote}
+% converts a count into a dimen, assuming the count is a number
+% of AFM units. I'll assume that the largest dimension I'll have
+% to deal with is 131\,pt, to try to minimize rounding errors.
+%
+% \begin{macrocode}
+% \newdimen\scaled_design_size
+% \end{macrocode}
+% \begin{macrocode}
+% \def\afm_convert#1=#2;{
+% \eval_expr{#2}
+% #1=\scaled_design_size
+% \divide#1 by 8
+% \multiply #1 by \result
+% \divide #1 by \one_thousand
+% \multiply#1 by 8
+% }
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\vpl_real}
+% \begin{macro}{\vpl_int}
+% The commands |\vpl_real|\meta{dimen} and |\vpl_int|\meta{count} print
+% a dimension and integer respectively in (V)PL syntax.
+%
+% \begin{macrocode}
+\def\vpl_real#1{R~\expandafter\lose_measure\the#1}
+\def\vpl_int#1{D~\the#1}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% The count register |\boundary_char| has been removed, since
+% the reimplementation of the left and right boundaries have drastically
+% decreased the need to check which slot serves as the right boundary.
+% Instead the integer |%boundarychar| (whose name cannot normally be typed)
+% is used to store the number of this slot, but the user need never (and
+% should not) access this integer directly. If the integer is not set
+% then no slot serves as boundarychar.
+% \changes{1.900}{1998/12/04}{\cs{boundary_char} count register
+% removed. Right boundary slot number is now stored in the
+% \texttt{\%boundarychar} integer instead. (LH)}
+%
+% \begin{macro}{\side_bearings}
+% \begin{macro}{\curr_bearings}
+% These two dimens are used by the letterspacing mechanism.
+% \begin{macrocode}
+\newdimen\side_bearings
+\newdimen\curr_bearings
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\make_header}
+% \begin{macrocode}
+\def\make_header#1{
+ \global\font_count=0
+ \setdim{designsize}{10pt}
+ \a_dimen=\dim{designsize}
+ \out_line{(DESIGNSIZE~\vpl_real\a_dimen)}
+ \x_setstr{codingscheme}{UNKNOWN}
+ \out_line{(CODINGSCHEME~\str{codingscheme})}
+%<*boundaryCompability>
+ \ifisint{boundarychar}\then
+ \x_setint{\percent_char boundarychar}{\int{boundarychar}}
+ \immediate\write16{Please~use~\string\setleftboundary\space
+ and/or~\string\makerightboundary^^J
+ instead~of~setting~the~boundarychar~integer.}
+ \fi
+%</boundaryCompability>
+ \ifisint{\percent_char boundarychar}\then
+ \a_count=\int{\percent_char boundarychar}
+ \out_line{(BOUNDARYCHAR~\vpl_int\a_count)}
+ \fi
+ \x_setint{letterspacing}{0}
+ \side_bearings=\make_factor{\int{letterspacing}}\half_point
+ \x_setint{minimumkern}{0}
+ \minimum_kern=\int{minimumkern}
+ \out_line{}
+}
+% \end{macrocode}
+% \changes{1.900}{1999/01/20}{Removed test for no letterspacing. (LH)}
+% \changes{1.900}{1999/01/20}{Made integer expression \cs{div} a
+% dimen \cs{divide}. (LH)}
+% \end{macro}
+%
+%
+% \begin{macro}{\make_mapfonts}
+% \begin{macrocode}
+\def\make_mapfonts#1{
+ \let\saved_scale\vpl_scale
+ \let\saved_mapfont\vpl_mapfont
+ \let\do_slot=\do_mapfont
+ \pre_second_etx_pass_hook
+ #1
+ \post_second_etx_pass_hook
+ \out_line{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\do_mapfont}
+% |\do_mapfont| produces a |MAPFONT| entry for each font used by
+% glyph |\slot_name|.
+% \begin{macrocode}
+\def\do_mapfont{
+ \ifisglyph\slot_name\then
+ \mapfonts\slot_name
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% The following commands can be used in the \meta{mapfonts} glyph
+% parameter.
+%
+% \begin{macro}{\vpl_scale}
+% \begin{macrocode}
+\def\vpl_scale#1#2{{
+ \mapfont_scaling=\make_factor{#1}\mapfont_scaling
+ #2
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_mapfont}
+% \changes{1.904}{1999/06/16}{Added \cs{record_usage}. (LH)}
+% \changes{1.913}{2000/02/26}{Mapfont number control sequences are
+% named \cs{\meta{scaling factor}pt-\meta{font}} instead of
+% \cs{\meta{font}-\meta{scaling factor}pt}. They are also made
+% \cs{mathchardef}s. (LH)}
+% \begin{macrocode}
+\def\vpl_mapfont#1#2{
+ \a_dimen=#2
+ \if_undefined{\the\mapfont_scaling-#1}\then
+ \global\x_cs\mathchardef{\the\mapfont_scaling-#1}=\font_count
+ \x_cs\xdef{f-\the\font_count}{\the\mapfont_scaling-#1}
+ \out_line{(MAPFONT~\vpl_int\font_count\space
+ (FONTNAME~#1)~
+ (FONTDSIZE~\vpl_real\a_dimen)~
+ (FONTAT~\vpl_real\mapfont_scaling))}
+ \record_usage{#1}
+ \global\advance\font_count by 1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pl_mapfont}
+% As PL files have no \texttt{MAPFONT} properties, the |\pl_mapfont|
+% macro only needs to do one thing: copy the current value of
+% |\mapfont_|\-|scaling| to |\rawfont_|\-|scaling|. This is necessary
+% since if the raw font for which a ligful PL is being written has
+% been scaled, then that scaling factor must be put in the appropriate
+% place in the FD file entry, and the simplest way to determine this
+% scaling factor is to execute the |\mapfonts| of some glyph in the
+% font.
+%
+% Due to the fact that the second ETX file pass (that during which the
+% \texttt{MAPFONT} properties are written) is skipped when a PL file
+% is being written, the |\mapfonts| get executed during the fourth ETX
+% file pass instead of the second. This works fine since the
+% |\mapcommands| that are executed at that time when a VPL file is
+% being written aren't needed for PL files.
+% \changes{1.913}{2000/03/21}{Macro added. (LH)}
+% \begin{macrocode}
+\def\pl_mapfont#1#2{\global\rawfont_scaling=\mapfont_scaling}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\font_count}
+% \begin{macro}{\next_mapfont}
+% \begin{macro}{\prev_mapfont}
+% \begin{macrocode}
+\newcount\font_count
+\newcount\next_mapfont
+\newcount\prev_mapfont
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\make_fontdimens}
+% This macro writes the \texttt{FONTDIMEN} property list. Note that
+% there is a difference between fontdimen 1 and the others, in that
+% fontdimen 1 is always in \texttt{pt}, not in the atsize-relative
+% \texttt{FONTUNITS} unit that the others are. Nonetheless, they can
+% both be treated the same here. This relies on (i) that 1000 denotes
+% the factor 1, and (ii) that 1000 AFM units equals 1 fontunit.
+% \begin{macrocode}
+\def\make_fontdimens#1{
+ \out_line{(FONTDIMEN}
+ \a_count=1
+ \loop\ifnum 256>\a_count
+ \ifisint{fontdimen(\the\a_count)}\then
+ \out_lline{(PARAMETER~\vpl_int\a_count\space
+ R~\make_factor{\int{fontdimen(\the\a_count)}})}
+ \fi
+ \advance \a_count \@ne
+ \repeat
+ \out_lline{)}
+ \out_line{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The ligtable}
+%
+% \begin{macro}{\make_ligtable}
+% \changes{1.927}{2003/12/08}{Changed the surrounding group to
+% \cs{begingroup} type. This helps contain errors that arise when
+% the \cs{setslot}s and \cs{endsetslot}s aren't properly balanced.
+% (LH)}
+% \begin{macrocode}
+\def\make_ligtable#1{
+ \begingroup
+ \out_line{(LIGTABLE}
+%<!boundaryCompability> \let\do_slot=\bgroup
+%<*boundaryCompability>
+ \def\do_slot{\bgroup
+ \ifisint{boundarychar}\then
+ \ifnum \int{boundarychar}=\slot_number
+ \def\vpl_liglabel{\out_liglabel\boundary_liglabel}
+ \fi
+ \fi
+ }
+%</boundaryCompability>
+ \let\end_do_slot=\vpl_kerning
+ \def\do_boundary{\bgroup \let\vpl_liglabel=\boundary_liglabel}
+ \let\endsetleftboundary=\vpl_kerning
+ \let\ligature=\vpl_ligature
+ \let\k=\vpl_kern
+ \let\rbserver_do=\vpl_rbserver_do
+ \let\rboundary_do=\vpl_rboundary_do
+ \pre_third_etx_pass_hook
+ #1
+ \post_third_etx_pass_hook
+ \out_lline{)}
+ \endgroup
+ \out_line{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_rbserver_do}
+% \begin{macro}{\vpl_rboundary_do}
+% \begin{macro}{\wrn_rboundary_do}
+% |\vpl_rbserver_do| and |\vpl_rboundary_do| are what |\rbserver_do|
+% and |\rboundary_do| respectively are when a ligkern program is being
+% written and no entry has yet been written for the boundarychar
+% slot. |\wrn_rboundary_do| is what one of them will get set to
+% afterwards, so that warnings are written when collisions between
+% using the slot as a right boundary marker and using the slot for
+% the actual glyph occur.
+% \begin{macrocode}
+\def\vpl_rbserver_do#1{
+ \do{#1}
+ \let\rboundary_do=\wrn_rboundary_do
+}
+\def\vpl_rboundary_do#1{
+ \do{#1}
+ \let\rbserver_do=\wrn_rboundary_do
+}
+\def\wrn_rboundary_do#1{
+ \do{#1}
+ \immediate\write16{Boundarychar~slot~usage~collision~in~
+ `\slot_name'~ligkern~program.}
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% \begin{macro}{\vpl_ligature}
+% |\vpl_ligature{|\meta{type}|}{|\meta{glyph}|}{|\meta{glyph}|}|
+% produces a ligtable entry for glyph |\slot_name|.
+%
+% The double spaces in the |\out_lline| statement below might look
+% strange, but |\number| will always gobble the first one.
+% \begin{macrocode}
+\def\vpl_ligature#1#2#3{
+ \get_slot_num{#3}
+ \ifnum -1=\result
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#3'.}
+ \else
+ \x_cs\ifx{slots-#2}\x_relax
+ \immediate\write16{Warning:~\string\ligature\space
+ for~unknown~slot~`#2'.}
+ \else
+ \def\do##1{
+ \vpl_liglabel
+ \out_lline{(#1~D~\number`##1~\space\vpl_int\result)~
+ (COMMENT~#2~#3)}
+ }
+ \csname slots-#2\endcsname
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\vpl_kerning}
+% |\vpl_kerning| writes out kerning instructions.
+% \begin{macrocode}
+\def\vpl_kerning{
+ \let\do=\vpl_kern_do
+ \csname~r-\slot_name\endcsname
+ \vpl_ligstop
+ \egroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_kern}
+% |\vpl_kern|\,|\l-|\meta{name}\,|\|\meta{amount} writes out a |KRN|
+% instruction.
+%
+% \changes{1.900}{1998/10/02}{Macro modified to avoid duplicate kerns.
+% (LH)}
+% |\vpl_kern| has been modified so that at most one
+% \texttt{KRN} instruction is written for each (ordered) pair of
+% characters. The idea is basically to make \package{fontinst} forget,
+% until the end of |\vpl_kerning|, that the glyph for which |\vpl_kern|
+% is being called has been assigned a slot, as this stops any more
+% \texttt{KRN} instructions for that particular glyph from being
+% written. |\vpl_kern| has also been modified so that it will not write
+% out any \texttt{KRN} instructions for kerns whose absolute value is
+% less than or equal to |\minimum_kern|. |\minimum_kern| gets set to
+% the value of the integer \texttt{minimumkern} in |\make_header|. If
+% the user has not set \texttt{minimumkern}, a default value of 0 will
+% be supplied by \package{fontinst}.
+%
+% \changes{1.900}{1998/12/07}{Much of the code from \cs{vpl_kern} has
+% been moved to \cs{vpl_kern_do}. (LH)}
+% \changes{1.913}{2000/02/26}{Using a nested \cs{ifnum} construct to
+% test the condition $\left\protect\vert
+% \protect\mbox{\cs{a_count}}\right\protect\vert \quotechar >
+% \protect\mbox{\cs{minimum_kern}}$. (LH)}
+% \begin{macrocode}
+\def\vpl_kern#1#2{
+ \edef\a_macro{\expandafter\gobble_three\string#1}
+ \a_count=\expandafter\gobble_one\string#2\x_relax
+ \ifnum \ifnum -\a_count>\a_count - \fi\a_count>\minimum_kern
+ \edef\b_macro{~R~\make_factor\a_count}
+ \csname slots-\a_macro\endcsname
+ \fi
+ \x_cs\let{slots-\a_macro}=\x_relax
+}
+% \end{macrocode}
+% Observation (LH 1999/03/16): The above construction has the
+% side-effect that a direct contradiction between a right boundary
+% glyph and a glyph in the |%boundarychar| slot won't be detected if
+% one of the items in contradiction is a kern less than or equal to
+% |\minimum_kern|. Perhaps this should be changed (letting |\do| equal
+% to |\gobble_one| would let the dectection mechanism work, but |\do|
+% would have to be restored afterwards and it is doubtful if it is
+% worth it).
+% \end{macro}
+%
+%
+% \begin{macro}{\vpl_kern_do}
+% |\vpl_kern_do| is what |\do| is defined to be when kerns are written.
+% \begin{macrocode}
+\def\vpl_kern_do#1{
+ \vpl_liglabel
+ \out_lline{
+ (KRN~D~\number`#1~\b_macro)~
+ (COMMENT~\a_macro)
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\out_liglabel}
+% \begin{macro}{\boundary_liglabel}
+% \begin{macro}{\vpl_liglabel}
+% |\out_liglabel| writes out a |LIGLABEL| instruction for a slot.
+% |\boundary_liglabel| writes out a |LIGLABEL| instruction for the
+% |BOUNDARYCHAR| ligkern program. |\vpl_liglabel| writes out the
+% correct |LIGLABEL| instruction for the current ligkern program, if it
+% is approriate.
+%
+% \begin{macrocode}
+\def\out_liglabel{
+ \out_lline{(LABEL~\vpl_int\slot_number)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\def\boundary_liglabel{
+ \out_lline{(LABEL~BOUNDARYCHAR)~(COMMENT~\slot_name)}
+ \let\vpl_liglabel=\x_relax
+ \let\vpl_ligstop=\out_ligstop
+}
+\let\vpl_liglabel=\out_liglabel
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\out_ligstop}
+% \begin{macro}{\vpl_ligstop}
+% |\vpl_ligstop| writes out a |LIGSTOP| instruction if appropriate.
+% \begin{macrocode}
+\def\out_ligstop{\out_lline{(STOP)}
+ \let\vpl_liglabel=\out_liglabel
+ \let\vpl_ligstop=\x_relax}
+\let\vpl_ligstop=\x_relax
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \subsection{The characters}
+%
+% \begin{macro}{\make_characters}
+% \begin{macrocode}
+\def\make_characters#1{
+ \bgroup
+ \let\do_slot=\do_character
+ \let\end_do_slot=\end_do_character
+ \let\nextlarger=\vpl_nextlarger
+ \let\varchar=\vpl_varchar
+ \let\endvarchar=\end_vpl_varchar
+ \let\vartop=\vpl_vartop
+ \let\varmid=\vpl_varmid
+ \let\varbot=\vpl_varbot
+ \let\varrep=\vpl_varrep
+ \if_including_map_
+ \let\saved_raw\vpl_raw
+ \let\saved_rule\vpl_rule
+ \let\saved_special\vpl_special
+ \let\saved_warning\vpl_warning
+ \let\saved_movert\vpl_movert
+ \let\saved_moveup\vpl_moveup
+ \let\saved_push\vpl_push
+ \let\saved_pop\vpl_pop
+ \else
+ \def\do_character_map{
+ \ifdim \rawfont_scaling=-\p@
+ \mapfonts\slot_name
+ \else
+ \let\do_character_map=\x_relax
+ \fi
+ }
+ \let\saved_mapfont\pl_mapfont
+ \let\saved_scale\vpl_scale
+ \fi
+ \pre_fourth_etx_pass_hook
+ #1
+ \post_fourth_etx_pass_hook
+ \egroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\do_character}
+% \changes{1.913}{2000/03/10}{Negative italic corrections \emph{are}
+% written to the (V)PL being generated. (LH)}
+% \changes{1.927}{2004/07/13}{Added flag for emitting warning message
+% when a glyph is missing. (LH) Requested by Werner Lemberg.}
+% |\do_character| produces a character entry for glyph |\slot_name| in
+% slot |\slot_number|.
+%
+% \begin{macrocode}
+\def\do_character{
+ \if_undefined{g-\slot_name}\then
+ \ifisint{requireglyphs}\then
+ \fontinstwarning{ETX~to~(V)PL}{
+ Undefined~glyph~`\slot_name'~requested\message_break
+ for~slot~\the\slot_number\message_number}
+ \fi
+ \expandafter\gobble_setslot
+ \else
+ \ifx\slot_name\notdef_name\else
+ \out_line{(CHARACTER~\vpl_int\slot_number\space
+ (COMMENT~\slot_name)}
+ \glyph_parameter\glyph_metrics\slot_name
+ \a_dimen=\make_factor\a_count \p@
+ \do_character_sidebearings
+ \out_lline{(CHARWD~\vpl_real\a_dimen)}
+ \ifnum \z@=\b_count \else
+ \out_lline{(CHARHT~R~\make_factor\b_count)}
+ \fi
+ \ifnum \z@=\c_count \else
+ \out_lline{(CHARDP~R~\make_factor\c_count)}
+ \fi
+ \ifnum \z@=\d_count \else
+ \out_lline{(CHARIC~R~\make_factor\d_count)}
+ \fi
+ \do_character_map
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\do_character_sidebearings}
+% \begin{macrocode}
+\def\do_character_sidebearings{
+ \ifisint{\slot_name-spacing}\then
+ \curr_bearings=\make_factor{\int{\slot_name-spacing}}\half_point
+ \else
+ \curr_bearings=\side_bearings
+ \fi
+ \advance\a_dimen by 2\curr_bearings
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\do_character_map}
+% \begin{macrocode}
+\def\do_character_map{
+ \global\prev_mapfont=0
+ \out_lline{(MAP}
+ \ifdim 0pt=\curr_bearings
+ \mapcommands\slot_name
+ \else
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \mapcommands\slot_name
+ \out_llline{(MOVERIGHT~\vpl_real\curr_bearings)}
+ \fi
+ \out_llline{)}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\do_character_no_letterspacing}
+% LH 1999/03/27: This is an alternative version of |\do_character|
+% which I think is now antiquated. It used to have an advantage over
+% |\do_character| in that it did not do any letterspacing (in v\,1.5,
+% that was good since |\do_character| used to write code for
+% letterspacing to the VPL regardless of whether is was needed or
+% not), but that advantage is gone since |\do_character_map| is now
+% a bit less stupid than it used to be.
+%
+% For the record, I don't think there ever was a user interface for
+% using this macro instead of |\do_character|, but I suspect there
+% are plenty of people around who have hacked it into being used.
+%
+% With v\,1.913 I commented it out completely, since I didn't feel
+% like updating the calls to |\afm_convert|.
+% \begin{macrocode}
+%<*obsolete>
+% \def\do_character_no_letterspacing{
+% \x_cs\ifx{g-\slot_name}\x_relax
+% \expandafter\gobble_setslot
+% \else
+% \ifx\slot_name\notdef_name\else
+% \out_line{(CHARACTER~\vpl_int\slot_number\space
+% (COMMENT~\slot_name)}
+% \afm_convert\a_dimen=\width\slot_name;
+% \out_lline{(CHARWD~\vpl_real\a_dimen)}
+% \afm_convert\a_dimen=\height\slot_name;
+% \out_lline{(CHARHT~\vpl_real\a_dimen)}
+% \afm_convert\a_dimen=\depth\slot_name;
+% \out_lline{(CHARDP~\vpl_real\a_dimen)}
+% \afm_convert\a_dimen=\italic\slot_name;
+% \ifnum\a_dimen>0 \out_lline{(CHARIC~\vpl_real\a_dimen)} \fi
+% \global\prev_mapfont=0 \out_lline{(MAP}
+% \mapcommands\slot_name
+% \out_llline{)}
+% \fi
+% \fi
+% }
+%</obsolete>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\gobble_setslot}
+% \begin{macrocode}
+\long\def\gobble_setslot#1\endsetslot{\endsetslot}
+% \end{macrocode}
+% \changes{1.901}{1999/03/27}{Made \cs{gobble_setslot} a \cs{long}
+% macro. (LH)}
+% \end{macro}
+%
+% \begin{macro}{\end_do_character}
+% \begin{macrocode}
+\def\end_do_character{
+ \ifisglyph\slot_name\then
+ \out_lline{)}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\notdef_name}
+% \begin{macrocode}
+\def\notdef_name{.notdef}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Slot commands that put things in a character property list}
+%
+% Here follows the active definitions for those slot commands that
+% causes things to be put in |CHARACTER| property lists.
+%
+% \begin{macro}{\vpl_nextlarger}
+% |\vpl_nextlarger|\marg{name} produces a |NEXTLARGER| entry.
+% \begin{macrocode}
+\def\vpl_nextlarger#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_lline{(NEXTLARGER~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\nextlarger\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_varchar}
+% \begin{macro}{\end_vpl_varchar}
+% |\vpl_varchar| \meta{varchar commands} |\end_vpl_varchar| produces
+% a |VARCHAR| entry.
+%
+% \begin{macrocode}
+\def\vpl_varchar{\out_lline{(VARCHAR}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\end_vpl_varchar{\out_llline{)}}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\vpl_vartop}
+% \begin{macrocode}
+\def\vpl_vartop#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(TOP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\vartop\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_varmid}
+% \begin{macrocode}
+\def\vpl_varmid#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(MID~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varmid\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_varbot}
+% \begin{macrocode}
+\def\vpl_varbot#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(BOT~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varbot\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_varrep}
+% \begin{macrocode}
+\def\vpl_varrep#1{
+ \get_slot_num{#1}
+ \ifnum -1<\result
+ \out_llline{(REP~D~\the\result)~(COMMENT~#1)}
+ \else
+ \immediate\write16{Warning:~\string\varrep\space
+ for~unknown~slot~`#1'}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Saved map commands}
+%
+% The following commands (and |\vpl_scale|, which is defined above) can
+% be used in the \meta{mapcommands} glyph parameter.
+%
+% \begin{macro}{\vpl_raw}
+% This macro writes the entries in a \texttt{MAP} that are needed for
+% the given raw character. Note that the `at' comment below gives the
+% scaling relative to the atsize of the virtual font, not the physical
+% atsize.
+% \IndexEntry{\LevelSame{PL properties:}^^A
+% \LevelSorted{SELECTFONT}{\texttt{SELECTFONT}}^^A
+% }{usage}{\thepage}
+% \begin{macrocode}
+\def\vpl_raw#1#2#3{
+ \global\next_mapfont=\csname\the\mapfont_scaling-#1\endcsname
+ \ifnum \next_mapfont=\prev_mapfont \else
+ \out_llline{(SELECTFONT~\vpl_int\next_mapfont)~
+ (COMMENT~#1~at~
+ \expandafter\lose_measure \the\mapfont_scaling)}
+ \fi
+ \out_llline{(SETCHAR~D~#2)~(COMMENT~#3)}
+ \global\prev_mapfont=\next_mapfont
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_rule}
+% \begin{macrocode}
+\def\vpl_rule#1#2{
+ \a_dimen=\make_factor{#2}\mapfont_scaling
+ \b_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(SETRULE~\vpl_real\a_dimen\space\vpl_real\b_dimen)}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpl_special}
+% \begin{macro}{\vpl_warning}
+% \begin{switch}{warningspecials}
+% \changes{1.913}{2000/02/26}{Switch controlling whether
+% \cs{glyphwarning}s should put \texttt{SPECIALS} in the VPL was
+% added. (LH)}
+% \begin{macrocode}
+\def\vpl_special#1{
+ \out_llline{(SPECIAL~#1)}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\vpl_warning#1{
+ \ifwarningspecials
+ \out_llline{(SPECIAL~Warning:~#1)}
+ \fi
+ \immediate\write16{Warning:~#1.}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newif\ifwarningspecials
+\warningspecialstrue
+% \end{macrocode}
+% \end{switch}\end{macro}\end{macro}
+%
+% \begin{macro}{\vpl_movert}
+% \begin{macro}{\vpl_moveup}
+% \begin{macrocode}
+\def\vpl_movert#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVERIGHT~\vpl_real\a_dimen)}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\vpl_moveup#1{
+ \a_dimen=\make_factor{#1}\mapfont_scaling
+ \out_llline{(MOVEUP~\vpl_real\a_dimen)}
+}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+% \begin{macro}{\vpl_push}
+% \begin{macro}{\vpl_pop}
+% \begin{macrocode}
+\def\vpl_push{\out_llline{(PUSH)}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\vpl_pop{\out_llline{(POP)}}
+% \end{macrocode}
+% \end{macro} \end{macro}
+%
+%
+% \subsection{Tidying up}
+%
+% \begin{macro}{\make_tidy}
+% If a VPL file was written, the tidying up consists of clearing the
+% list of mapfont numbers, since that is stored globally. If a PL
+% file was written, the tidying up consists of writing a
+% \texttt{DESIGNUNITS} property for those fonts which need one.
+% \begin{macrocode}
+\def\make_tidy#1{
+ \tidying_up_hook
+ \if_including_map_
+ \a_count=0
+ \loop\ifnum \a_count<\font_count
+ \edef\a_macro{\csname~f-\the\a_count\endcsname}
+ \global\x_cs\let\a_macro\x_relax
+ \advance\a_count by 1
+ \repeat
+ \global\font_count=0
+ \else
+ \ifdim \rawfont_scaling<\z@
+ \fontinstwarning{ETX~to~(V)PL}{The~font~
+ \out_filename\space doesn't~contain~any~characters}
+ \global\rawfont_scaling=\p@
+ \fi
+ \ifdim \rawfont_scaling=\p@ \else
+ \out_line{(DESIGNUNITS~\vpl_real\rawfont_scaling)}
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Font installation commands and \texttt{.fd} files}
+%
+% \DescribeMacro{\installfonts}
+% \DescribeMacro{\endinstallfonts}
+% The call
+% \begin{quote}
+% |\installfonts| \meta{install commands} |\endinstallfonts|
+% \end{quote}
+% is the top-level interface for installing a number of fonts
+% and creating |.fd| files for them.
+%
+% \DescribeMacro{\installfamily}
+% \DescribeMacro{\installfont}
+% \DescribeMacro{\installrawfont}
+% The \meta{install commands} are:
+% \begin{isyntax}
+% |\installfamily|\marg{encoding}\marg{family}\marg{FD-commmands}\\
+% |\installfont|\marg{font-name}\marg{file-list}\marg{etx}\penalty0
+% \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+% |\installrawfont|\marg{font-name}\marg{file-list}\marg{etx}^^A
+% \penalty0
+% \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+% |\installfontas|\marg{font-name}\penalty0\marg{encoding}^^A
+% \marg{family}\marg{series}\marg{shape}\marg{size}
+% \end{isyntax}
+%
+% Each |\installfamily| command causes the generation of an |.fd| file
+% for \meta{encoding} and \meta{family}, which is writen out by the time
+% |\endinstallfonts| is processed.
+%
+% Each |\installfont| generates a |.vpl| font by calling |\etxtovpl|
+% and adds an |.fd| entry.
+% Each |\installrawfont| generates a ligfull |.pl| font by calling
+% |\etxtopl| and adds an |.fd| entry. (Raw |.pl| fonts, containing only
+% the glyph metrics without any ligaturing or kerning information,
+% are also generated by |\mtxtopl| called from |\transformfont|
+% statements.)
+%
+% \changes{1.912}{2000/01/15}{\cs{install}\dots\ commands updated to
+% set \cs{setsomething_global} to \cs{global} around themselves. This
+% reduces problems with assignments ``not working'' due to the
+% unintuitive grouping. (LH) Problem pointed out by Hilmar
+% Schlegel, , and others.}
+%
+% \begin{macro}{\installfonts}
+% Initializes the |\family_toks| token register, which is used to store
+% the information which is written out to |.fd| files at the end of the
+% job.
+%
+% \begin{macrocode}
+\newtoks\family_toks
+\def\installfonts{
+ \bgroup
+ \global\family_toks={}
+ \gdef\prev_file_list{}
+ \global\let\setsomething_global=\global
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\installfamily}
+% |\installfamily|\marg{encoding}\marg{family}\marg{FD-commmands}
+%
+% Adds the command
+% \begin{quote}
+% |\fd_family|\marg{encoding}\marg{family}\marg{FD-commmands}
+% \end{quote}
+% to the token list |\family_toks| and defines a macro
+% |\|\meta{encoding}|-|\meta{family}.^^A
+% \describecsfamily{\meta{encoding}-\meta{family}}
+%
+% \begin{macrocode}
+\def\installfamily#1#2#3{
+ \global\family_toks=
+ \expandafter{\the\family_toks\fd_family{#1}{#2}{#3}}
+ \global\x_cs\let{#1-#2}\empty_command
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\installfont}
+% \begin{macro}{\installrawfont}
+% \changes{1.904}{1999/06/16}{Added \cs{record_usage}. (LH)}
+% \multchanges{\cs{installfont}\cs{installrawfont}}{1.913}{2000/03/21}
+% {Moved some code from \cs{install_font} to these commands. (LH)}
+% |\installfont|\marg{font-name}\marg{file-list}\marg{etx}\\
+% \vadjust{}\qquad \marg{encoding}\marg{family}\marg{series}^^A
+% \marg{shape}\marg{size}\\
+% |\installrawfont|\marg{font-name}\marg{file-list}\marg{etx}\\
+% \vadjust{}\qquad \marg{encoding}\marg{family}\marg{series}^^A
+% \marg{shape}\marg{size}
+%
+% \begin{macrocode}
+\def\installfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \input_metrics{}{#2}
+ \etxtovpl{#3}{#1}
+ \installfontas{#1}{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+\def\installrawfont#1#2#3#4#5#6#7#8{
+ \global\let\setsomething_global=\x_relax
+ \xdef\out_filename{#1}
+ \input_metrics{\let\storemapdata=\installraw_storemap}{#2}
+ \let\storemapdata=\gobble_three
+ \etxtopl{#3}{#1}
+ \record_usage{#1}
+ \installfontas{
+ \ifdim \rawfont_scaling=\p@ \else
+ [\expandafter\lose_measure\the\rawfont_scaling]~
+ \fi #1
+ }{#4}{#5}{#6}{#7}{#8}
+ \global\let\setsomething_global=\global
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\installraw_storemap}
+% The |\installraw_storemap| macro is a definition of |\storemapdata|
+% that is used when the metrics for a ligful PL file is being inputed.
+% Its job is to write a |\storemapdata| command for this PL to the
+% transforms record file if the PL being written does not have the
+% same name as the MTX that the metrics are taken from (the
+% information is already stored if both files have the same name).
+% |\out_filename| is prematurely set by |\installrawfont| (i.e., long
+% before the PL file is actually opened) so that it can be used in
+% comparing the file names.
+% \changes{1.913}{1999/03/23}{Macro added. (LH)}
+% \begin{macrocode}
+\def\installraw_storemap#1#2#3{
+ \def\a_macro{#1}
+ \ifx \a_macro\out_filename \else
+ \record_transform{\out_filename}{\string\frommtx{#1}}{}\if_false
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\input_metrics}
+% The |\input_metrics| macro takes a comma-separated list of metric
+% files as its second argument and sees to that exactly these metrics
+% are loaded. If the list is identical to that used in the last call
+% to |\input_metrics|, then this is already the case and
+% |\input_metrics| simply refrains from flushing those previous
+% metrics from \TeX's memory. Otherwise it closes a group (flushing
+% the metrics from a previous call), opens a group (so that these
+% metrics can be flushed at the next |\installfont| or
+% |\installrawfont| command, if necessary), and starts inputting the
+% metrics files in question.
+%
+% The first argument consists of code that will be executed after the
+% group has been closed and opened, but before any metrics is inputed.
+% \changes{1.900}{1999/02/13}
+% {Use \cs{process_csep_list} for file-list. (LH)}
+% \changes{1.914}{2000/05/26}{Redefined to suite \cs{file_list_metrics}.
+% In particular, there will now be a comma at the end of
+% \cs{curr_file_list} and \cs{prev_file_list}. (LH)}
+% \begin{macrocode}
+\def\input_metrics#1#2{
+ \let\metrics=\file_list_metrics
+ \xdef\curr_file_list{#2,}
+ \let\metrics=\x_relax
+ \ifx\prev_file_list\curr_file_list\else
+ \egroup\bgroup
+ #1
+ \expandafter\process_csep_list \expandafter\input_mtx_file
+ \curr_file_list\process_csep_list,
+ \global\let\prev_file_list=\curr_file_list
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\file_list_metrics}
+% The |\file_list_metrics| macro is a definition of |\metrics| that
+% is used in the \meta{file-list} argument of |\install|\-|font| and
+% |\install|\-|raw|\-|font| when that is |\xdef|ed by |\input_metrics|.
+% This special definition prevents the succeeding \meta{metric
+% commands} from getting expanded.
+% \changes{1.914}{2000/05/26}{Macro added. (LH)}
+% \begin{macrocode}
+\def\file_list_metrics#1,{
+ \iffalse{\fi}
+ \a_toks=\expandafter{\curr_file_list\x_relax#1,}
+ \xdef\curr_file_list{\the\a_toks \iffalse}\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\installfontas}
+% The |\installfontas| command has the syntax
+% \begin{isyntax}
+% |\installfontas|\marg{font-info}\marg{encoding}\marg{family}^^A
+% \penalty0\marg{series}\penalty0\marg{shape}\penalty0\marg{size}
+% \end{isyntax}
+% The precise definition of a \meta{font-info} can be found in
+% \cite[Sec.~4]{fntguide}, here it suffices to say that a font name
+% (name of (V)PL file) is a valid \meta{font-info}. The |\installfontas|
+% command adds an entry for the \meta{font-info} font to a font
+% definition file, giving it the NFSS attributes \meta{encoding}^^A
+% \texttt{/}\nolinebreak[1]\meta{family}\texttt{/}\nolinebreak[1]^^A
+% \meta{series}\texttt{/}\nolinebreak[1]\meta{shape}\texttt{/}^^A
+% \nolinebreak[1]\meta{size}. The substitution mechanism will act on
+% \meta{series} and \meta{shape}, and it is therefore possible that
+% \meta{font-info} will appear in more than one |\Declare|\-|Font|\-^^A
+% |Shape| command. \meta{size} can be either some \meta{size-infos},
+% as defined in \cite[Sec.~4]{fntguide}, or a \package{fontinst}
+% shorthand for a such, declared using |\declaresize|.
+% \changes{1.912}{2000/01/16}{Command added. (LH)}
+% \changes{1.913}{2000/03/02}{Specification changed to allow
+% arbitrary \meta{font-info}s as first argument. (LH)}
+% \changes{1.921}{2002/03/27}{Automatically doing an
+% \cs{installfamily} if that has not been done. (LH) Suggested
+% by Rowland McDonnell.}
+% \begin{macrocode}
+\def\installfontas#1#2#3#4#5#6{
+ \if_undefined{#2-#3-#4-#5}\then
+ \let\do_shape=\x_relax
+ \if_undefined{#2-#3}\then
+ \x_cs\let{#2-#3}\empty_command
+ \autoinstallfamily{#2}{#3}
+ \fi
+ \x_cs\xdef{#2-#3}{
+ \csname#2-#3\endcsname
+ \do_shape{#2}{#3}{#4}{#5}
+ }
+ \fi
+ \let\do_size=\x_relax
+ \x_cs\xdef{#2-#3-#4-#5}{
+ \if_defined{#2-#3-#4-#5}\then
+ \csname#2-#3-#4-#5\endcsname
+ \fi
+ \do_size{#6}{#1}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\autoinstallfamily}
+% This command is called by |\installfontas| when it is asked to
+% install a font for which no |\installfamily| has been given. The
+% syntax is
+% \begin{quote}
+% |\autoinstallfamily|\marg{encoding}\marg{family}
+% \end{quote}
+% It defaults to calling |\installfamily| in the obvious way, but
+% it can be redefined if the user wants something different.
+% \changes{1.924}{2003/02/08}{Macro added. (LH)}
+% \begin{macrocode}
+\def\autoinstallfamily#1#2{\installfamily{#1}{#2}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endinstallfonts}
+% Finish the installation by processing the |\family_toks|
+% token register, which contains the accumulated information
+% to be written out to |.fd| files.
+%
+% \begin{macrocode}
+\def\endinstallfonts{
+ \global\let\setsomething_global=\x_relax
+ \let\do_shape=\fd_shape
+ \let\do_size=\fd_size
+ \the\family_toks
+ \global\family_toks{}
+ \egroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% The |\installfont| command has traditionally allowed that names of
+% base fonts (MTX files) are suffixed by a
+% \verb*" scaled "\meta{factor} that would cause the \texttt{rawscale}
+% integer to be set and thereby scale everything that was in that base
+% font by the said \meta{factor}. There is now a more general approach
+% to this. If the control sequence
+% \describecsfamily{IFKW-\meta{keyword}}|IFKW-|\meta{keyword} is
+% defined then \meta{keyword} may be used as \texttt{scaled} is above;
+% this control sequence should grab all the ``arguments'' of the
+% keyword, process them as necessary, and end with the |\get_keyword|
+% macro so that another keyword may be processed. As a rule, the
+% arguments and keywords are delimited from each other by single spaces.
+% A macro grabbing an argument grabs also the space after it. The
+% \texttt{IFKW} is for \texttt{I}nstall\texttt{F}ont
+% \texttt{K}ey\texttt{W}ord.
+%
+% \changes{1.923}{2002/10/09}{Added support for keywords other than
+% \texttt{scaled} in the second argument of \cs{installfont} and
+% such. (LH)}
+%
+% \begin{macro}{\input_mtx_file}
+% The |\input_mtx_macro| takes one undelimited argument. It
+% interprets this argument as if it was one item in the \meta{file-list}
+% argument of |\install|\-|font| or |\install|\-|rawfont|, and does
+% the corresponding processing. The argument should be one of the
+% following three things:
+% \begin{quote}
+% \meta{font}\meta{optional modifiers}\\
+% |\metrics| \meta{metric commands}\\
+% \meta{nothing}
+% \end{quote}
+% If, in the first case, an MTX file for \meta{font} does not
+% exist then it is generated on the fly from a corresponding |.pl|,
+% |.afm|, or |.vpl| file in the call to |\fromany|. In the second
+% case, the \meta{metric commands} simply get executed. In the third
+% case, nothing happens.
+%
+% The \meta{optional modifiers} is either empty or has the form
+% \meta{modifier clause}\meta{optional modifiers}. A \meta{modifier
+% clause} generally has the form
+% \begin{quote}
+% \verb*" "\meta{keyword}\verb*" "\meta{argument(s)}
+% \end{quote}
+% e.g.,
+% \begin{quote}
+% \verb*| scaled |\meta{rawscale factor}
+% \end{quote}
+%
+% \changes{1.904}{1999/06/16}{Now using \cs{fromany} to make an MTX
+% file when necessary. Furthermore testing for empty argument using
+% \cs{ifx} rather than \cs{if}. (LH)}
+% \changes{1.912}{2000/01/15}{Added error message. (LH) Suggested by
+% Alexei Kostin.}
+% \changes{1.914}{2000/05/26}{Can now accept arbitrary metric
+% commands in argument. (LH)}
+% \begin{macrocode}
+\def\input_mtx_file#1{
+ \reset_modifiers_hook
+ \ifx\x_relax#1\x_relax
+% \end{macrocode}
+% This tests for an empty argument, but it also lets explicit metric
+% commands be executed.
+% \begin{macrocode}
+ \else
+ \identity_one{\get_file_name #1~}~\par
+% \end{macrocode}
+% The two spaces have the effect of putting an empty keyword modifier
+% last in the \meta{optional modifiers}. If everything is all right
+% then this will gobble the |\par|. However, if the user forgot some
+% argument of the last keyword then there will be an error message
+% when |\get_keyword| will try to grab the next keyword.
+%
+% If an encoding has been specified then the source file must be a PL
+% or VPL file (since these are the only ones for which it makes sense
+% to specify an encoding), otherwise we rely on |\fromany| to find a
+% font metrics file.
+% \changes{1.926}{2003/07/10}{Only looking for PL and VPL files when
+% an encoding is specified. (LH)}
+% \changes{1.929}{2005/01/13}{Missing space in message inserted. (LH)
+% Pointed out by Peter Dyballa.}
+% \begin{macrocode}
+ \ifx \pl_encoding\empty_command
+ \fromany\file_name
+ \else
+ \metrics_given_encoding{\file_name}{\pl_encoding}
+ \fi
+ \ifisstr{afm-name}\then
+ \inputmtx{\str{afm-name}}
+ \else
+ \fontinsterror{\string\install...}{
+ Font/MTX~file~\file_name\space not~found
+ }{
+ You~can~insert~an~\string\inputmtx\space command~here
+ \messagebreak to~input~some~other~MTX~file~instead.
+ \ifisint{rawscale}\then \messagebreak
+ The~requested~raw~scaling~will~then~be~applied~on~that.
+ \fi
+ }
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\metrics_given_encoding}
+% This macro is a cousin of |\fromany|, for the case that metrics are
+% taken from a (V)PL file that furthermore is assigned nonstandard
+% metrics. The syntax is
+% \begin{quote}
+% |\metrics_given_encoding|\marg{font}\marg{etx}
+% \end{quote}
+% and the generated MTX file is named
+% \meta{font}\texttt{-}\meta{etx}\texttt{.mtx} to avoid that it is
+% picked up by |\fromany| by mistake.
+% \changes{1.929}{2005/01/12}{The \texttt{afm-name} string usually has
+% a value at this point, so it is necessary to reset it. (LH,
+% sighing because he knows this isn't the first time this problem
+% occurred) First to be hit by this bug was Michael Zedler.}
+% \begin{macrocode}
+\def\metrics_given_encoding#1#2{
+ \x_cs\edef{s-afm-name}{#1-#2}
+ \if_file_exists{#1.pl}\then
+ \generalpltomtx{#1}{#1-#2}{pl}{#2}
+ \else
+ \if_file_exists{#1.vpl}\then
+ \generalpltomtx{#1}{#1-#2}{vpl}{#2}
+ \else
+ \unsetstr{afm-name}
+ \fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \definechange{option-keyword}{1.924}{2002/02/16}{Added mechanism
+% for passing options to MTX and ETX files. (LH)}
+%
+% \begin{macro}{\reset_modifiers_hook}
+% The |\reset_modifiers_hook| macro contains code that initialises
+% all parameters that are modified by some \meta{modifier clause} to
+% their default values. If you need to add some initialisations due
+% to that you define additional keywords then you should append
+% these initialisations to this macro.
+% \usechange{option-keyword}
+% \begin{macrocode}
+\def\reset_modifiers_hook{
+ \unsetint{rawscale}
+ \let\glyph_name_modifier\identity_one
+ \let\pl_encoding\empty_command
+ \let\list_of_options\empty_command
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get_file_name}
+% The macro |\get_file_name| grabs the base font (or other MTX file)
+% name and starts the processing of the \meta{optional modifiers}.
+% \begin{macrocode}
+\def\get_file_name #1~{
+ \edef\file_name{#1}
+ \get_keyword
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get_keyword}
+% \begin{macro}{\gobble_keywords}
+% The |\get_keyword| macro expects to be expanded in the context
+% \begin{quote}
+% |\get_keyword|\,\meta{keyword}\verb*" "
+% \end{quote}
+% where the \meta{keyword} is a possible keyword. If
+% |\IFKW-|\meta{keyword} is defined then the above expands to it,
+% otherwise the above expands to an error message followed by a
+% |\gobble_keywords|, which will gobble the rest of the list of
+% keywords and arguments.
+% \begin{macrocode}
+\def\get_keyword #1~{
+ \if_defined{IFKW-#1}\then
+ \csname IFKW-#1 \expandafter\endcsname
+ \else
+ \fontinsterror{\string\install...}{
+ `#1'~is~not~a~defined~keyword
+ }{
+ \error_help_a\messagebreak
+ Extra~tokens~will~be~flushed.
+ }
+ \expandafter\gobble_keywords
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\gobble_keywords#1\par{}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\IFKW-}
+% The empty keyword is used to flag the end of the \meta{optional
+% modifiers}.
+% \begin{macrocode}
+\x_cs\let{IFKW-}=\gobble_keywords
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IFKW-scaled}
+% This macro handles grabbing the argument of the traditional
+% \texttt{scaled} keyword.
+% \changes{1.900}{1999/02/05}{Changed \cs{setint} to \cs{resetint}.
+% (LH)}
+% \begin{macrocode}
+\x_cs\def{IFKW-scaled}#1~{
+ \ifnum #1=\one_thousand
+ \unsetint{rawscale}
+ \else
+ \x_resetint{rawscale}{#1}
+ \fi
+ \get_keyword
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IFKW-suffix}
+% This macro handles grabbing the argument of the \texttt{suffix}
+% keyword. The effect of `\texttt{suffix} \meta{suffix}' is that
+% \meta{suffix} will be appended to the name of every glyph defined
+% by the next MTX file to be read in.
+% \begin{macrocode}
+\x_cs\def{IFKW-suffix}#1~{
+ \def\glyph_name_modifier##1{##1#1}
+ \get_keyword
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IFKW-encoding}
+% \begin{macro}{\pl_encoding}
+% This macro handles grabbing the argument of the \texttt{encoding}
+% keyword. The effect of `\texttt{encoding} \meta{etx}' is that
+% \meta{etx} will be used as encoding when converting a PL or VPL
+% file to MTX. |\pl_encoding| is used for storing the argument
+% value. Its expansion is normally empty, which means |\fromafm|
+% handles locating the metrics file and the encoding used for a PL
+% or VPL is determined by its codingscheme.
+% \begin{macrocode}
+\x_cs\def{IFKW-encoding}#1~{
+ \def\pl_encoding{#1}
+ \get_keyword
+}
+\let\pl_encoding=\empty_command
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\IFKW-option}
+% This macro handles grabbing the argument of the \texttt{option}
+% keyword. One can test using |\ifoption| whether a particular option
+% was specified.
+% \usechange{option-keyword}
+% \begin{macrocode}
+\x_cs\def{IFKW-option}#1~{
+ \add_to\list_of_options{\do{#1}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifoption}
+% \usechange{option-keyword}
+% \begin{macro}{\list_of_options}
+% \usechange{option-keyword}
+% The |\ifoption| command is used to test whether a particular option
+% is present on the list of options. The syntax is
+% \begin{quote}
+% |\ifoption|\marg{string}|\then|
+% \end{quote}
+% and it is tested whether the \meta{string} was one of the options
+% given. Like strings in general, the \meta{string} is expanded
+% before it is compared to the options listed in |\list_of_options|.
+%
+% The |\list_of_options| is a sequence of items on the form
+% \begin{quote}
+% |\do|\marg{option}
+% \end{quote}
+% where each \meta{option} is an already expanded string of
+% characters.
+% \begin{macrocode}
+\def\ifoption#1\then{
+ \_a_false
+ \edef\a_macro{#1}
+ \def\do##1{
+ \if_a_ \else
+ \def\b_macro{##1}
+ \ifx \a_macro\b_macro \_a_true \fi
+ \fi
+ }
+ \list_of_options
+ \if_a_
+}
+%</pkg>
+%<*doc>
+\def\ifoption#1\then{%
+ \generic@if{option \TypesetStringExpression{#1}}%
+}
+%</doc>
+%<*pkg>
+\let\list_of_options\empty_command
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \subsection{Writing font definition files}
+%
+% \begin{macro}{\fd_family}
+% |\fd_family{ENCODING}{FAMILY}{FD-COMMANDS}|
+%
+% Writes out an |.fd| file for the specified |ENCODING| and |FAMILY|
+% processing the accumulated information and default substitutions.
+%
+% \begin{macrocode}
+\def\fd_family#1#2#3{
+ \a_toks{#3}
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1#2.fd}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~Filename:~\lowercase_file}
+ \out_line{\percent_char~Created~by:~tex~\jobname}
+ \out_line{\percent_char~Created~using~fontinst~v\fontinstversion}
+ \out_line{}
+ \out_line{\percent_char~THIS~FILE~SHOULD~BE~PUT~IN~A~TEX~INPUTS~
+ DIRECTORY}
+ \out_line{}
+ \out_line{\string\ProvidesFile{\lowercase_file}}
+ \out_lline{[
+ \the\year/
+ \ifnum10>\month0\fi\the\month/
+ \ifnum10>\day0\fi\the\day\space
+ Fontinst~v\fontinstversion\space
+ font~definitions~for~#1/#2.
+ ]}
+ \out_line{}
+ \out_line{\string\DeclareFontFamily{#1}{#2}{\the\a_toks}}
+ {
+ \csname #1-#2\endcsname
+ \out_line{}
+ \let\do_shape=\substitute_shape
+ \csname #1-#2\endcsname
+ \let\do_shape=\remove_shape
+ \csname #1-#2\endcsname
+ }
+ \x_cs\g_let{#1-#2}\x_relax
+ \out_line{}
+ \out_line{\string\endinput}
+ \close_out{Font~definitions}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fd_shape}
+% |\fd_shape{ENCODING}{FAMILY}{SERIES}{SHAPE}|
+%
+% \begin{macrocode}
+\def\fd_shape#1#2#3#4{
+ \out_line{}
+ \out_line{\string\DeclareFontShape{#1}{#2}{#3}{#4}\left_brace_char}
+ \csname #1-#2-#3-#4\endcsname
+ \x_cs\g_let{#1-#2-#3-#4}\empty_command
+ \out_line{\right_brace_char{}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fd_size}
+% |\fd_size{SIZE}{FONT-NAME}|
+%
+% \begin{macrocode}
+\def\fd_size#1#2{
+ \x_cs\ifx{siz-#1}\x_relax
+ \out_lline{#1~#2}
+ \else
+ \out_lline{\csname siz-#1\endcsname\space #2}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\remove_shape}
+% |\remove_shape{ENCODING}{FAMILY}{SERIES}{SHAPE}|
+%
+% \begin{macrocode}
+\def\remove_shape#1#2#3#4{
+ \x_cs\g_let{#1-#2-#3-#4}\x_relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\substitute_shape}
+% |\substitute_shape{ENCODING}{FAMILY}{SERIES}{SHAPE}|
+%
+% \begin{macrocode}
+\def\substitute_shape#1#2#3#4{
+ \edef\orig_shape{#4}
+ \substitute_series{#1}{#2}{#3}{\orig_shape}
+ \x_cs\ifx{sub-\orig_shape}\x_relax\else
+ \edef\subst_shape{\csname sub-\orig_shape\endcsname}
+ \x_cs\ifx{#1-#2-#3-\subst_shape}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{#3}{\subst_shape}{
+ <->\csname typ-\orig_shape\endcsname\space
+ *~#2/#3/\orig_shape
+ }{}
+ }
+ \x_cs\let{#1-#2-#3-\subst_shape}\empty_command
+ \substitute_shape{#1}{#2}{#3}{\subst_shape}
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\substitute_series}
+% |\substitute_series{ENCODING}{FAMILY}{SERIES}{SHAPE}|
+%
+% \begin{macrocode}
+\def\substitute_series#1#2#3#4{
+ \edef\orig_series{#3}
+ \x_cs\ifx{sub-\orig_series}\x_relax\else
+ \edef\subst_series{\csname sub-\orig_series\endcsname}
+ \x_cs\ifx{#1-#2-\subst_series-#4}\x_relax
+ \out_line{
+ \string\DeclareFontShape{#1}{#2}{\subst_series}{#4}{
+ <->\csname typ-\orig_series\endcsname\space
+ *~#2/\orig_series/#4
+ }{}
+ }
+ \x_cs\let{#1-#2-\subst_series-#4}\empty_command
+ \substitute_series{#1}{#2}{\subst_series}{#4}
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\substitutesilent}
+% \begin{macro}{\substitutenoisy}
+% These commands specify a default substitution for series or shape
+% \meta{to}, which points to the series or shape \meta{from}.
+% \begin{quote}
+% |\substitutesilent|\marg{to}\marg{from}\\
+% |\substitutenoisy|\marg{to}\marg{from}
+% \end{quote}
+% There can be at most one \meta{to} for every \meta{from}; later
+% substitutions will override previous ones. If \meta{to} and
+% \meta{from} are equal, then any existing substitution from
+% \meta{from} is disabled.
+%
+% The way this is implemented is that if a font has been installed
+% with shape or series \meta{from}, but no entry for \meta{to} has
+% been written, then write an entry also for \meta{to} consisting of
+% a substitution by \meta{from}. (After doing that, an entry has been
+% written also for \meta{to}, so the process may repeat itself with
+% the old \meta{to} as a new \meta{from}.)
+%
+% \begin{macro}{\substitute_generic}
+% This is the common part of |\substitutesilent| and
+% |\substitutenoisy|. The syntax is
+% \begin{quote}
+% |\substitute_generic|\marg{type}\marg{to}\marg{from}
+% \end{quote}
+% where \meta{type} is |ssub| or |sub| respectively.
+% \changes{1.931}{2005/05/12}{Macro added, to support explicit
+% disabling of substitutions. (LH)}
+% \begin{macrocode}
+\def\substitute_generic#1#2#3{
+ \edef\a_macro{#2}
+ \edef\b_macro{#3}
+ \ifx \a_macro \b_macro
+ \x_cs\let{sub-#3}\undefined_command
+ \else
+ \x_cs\let{sub-#3}\a_macro
+ \x_cs\def{typ-#3}{#1}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\substitutesilent{\substitute_generic{ssub}}
+\def\substitutenoisy{\substitute_generic{sub}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\substitutesilent{bx}{b}
+\substitutesilent{b}{bx}
+\substitutesilent{b}{sb}
+\substitutesilent{b}{db}
+\substitutesilent{m}{mb}
+\substitutesilent{m}{l}
+% \end{macrocode}
+% \begin{macrocode}
+\substitutenoisy{ui}{it}
+% \end{macrocode}
+%
+% I don't think we want these since in OT1 encoding it will
+% cause the old |<sterling>| vs |<dollar>| problem. (ASAJ)
+% --- Oh yes we do. (SPQR)
+%
+% \begin{macrocode}
+\substitutesilent{sl}{it}
+\substitutesilent{it}{sl}
+% \end{macrocode}
+%
+%
+% \subsection{New font substitution mechanism}
+%
+% \textbf{Note:} This subsection contains (part of) a new implementation
+% of the font substitution mechanism, but it is uncertain whether it
+% will ever be completed.
+% \begin{macrocode}
+%<*underconstruction>
+% \end{macrocode}
+%
+%
+% \subsubsection{The substitution graph}
+%
+% Which substitutions are performed are determined by the substitution
+% graph. The vertices of this graph are all combinations of a series and
+% a shape. The arcs (directed edges) of this graph are the substitutions
+% that can be made. Each arc has a wheight---a real number in the range
+% $[0,1]$---that describes how much of the quality of the font that is
+% preserved with this substitution.
+%
+% As an example, consider the case that there is an arc from \texttt{m/it}
+% to \texttt{m/sl} and that the wheight of this arc is $0.5$. This means
+% that it is OK to substitute the medium italic (\texttt{m/it}) font as a
+% medium slanted (\texttt{m/sl}) font if there is no medium slanted font,
+% but that the medium italic font is only considered as being half
+% ($0.5$) as good a medium slanted font as it is a medium italic font.
+%
+% The main problem the substitution mechanism has to solve in this
+% context is to find the best possible way of substituting a font, given
+% the real fonts which has actually been installed (using |\installfont|
+% or |\installrawfont|). The solution to this problem is computed by a
+% brute force approach---all possible substitution paths are followed
+% and during this process the best solution so far, for each vertex
+% separately, is stored.
+% \medskip
+%
+% In practice, the substitution graph $G$ is constructed as the cartesian
+% product of one graph $G\sb{1}$ of series substitutions and one graph
+% $G\sb{2}$ of shape substitutions, with the option of adding some
+% additional arcs to this product. The reason for this is that one
+% usually wants to make the same shape substitutions in all series and
+% vice versa, so by only storing the $G\sb{1}$ and $G\sb{2}$ graphs, plus
+% perhaps a handfull of extra edges, one gets away with using fewer
+% tokens.
+% The wheights of the arcs are stored as integers in the range 0--1000,
+% where 0 means the real number $0$ and 1000 means the real number $1$.
+% \medskip
+%
+% \DescribeMacro\do_arc
+% The |\do_arc| macro is probably the most common in the data
+% structures that constitute the substitution graph. Its syntax is
+% always
+% \begin{quote}
+% |\do_arc|\marg{series}\marg{shape}\marg{wheight}
+% \end{quote}
+% but it is meant to be redefined whenever one needs to do something
+% ``for all arcs'' (usually all arcs at a given vertex or so). There are
+% three families of macros which consist of |\do_arc| lists, namely
+% \begin{quote}
+% |\sub1-|\meta{series}\\
+% |\sub2-|\meta{shape}\\
+% |\sub-|\meta{series}|-|\meta{shape}
+% \end{quote}
+% These macros store arcs going out from a vertex. The
+% |\sub1-|\meta{series} macross store the arcs incident with the vertex
+% \meta{series} in the series substitution graph $G\sb{1}$. The
+% |\sub2-|\meta{shape} macros store the arcs incident with the vertex
+% \meta{shape} in the shape substitution graph $G\sb{2}$. The
+% |\sub-|\meta{series}|-|\meta{shape} macros store the arcs of $G$ that
+% are incident with the vertex \meta{series}|/|\meta{shape} but do
+% \emph{not} appear in the cartesian product $G\sb{1} \times G\sb{2}$.
+%
+% The \meta{series} and \meta{shape} arguments of |\do_arc| tells which
+% vertex the arc goes to, hence for example |\do_arc{b}{it}{600}| in the
+% macro |\sub-db-sl| corresponds to an arc going from the |db/sl| vertex
+% to the |b/it| vertex and having a wheight of $0.6$.
+%
+% \DescribeMacro\curr_series
+% \DescribeMacro\curr_shape
+% The above omits one important detail, namely that the \meta{shape}
+% argument for a |\do_arc| in a |\sub1-|\textellipsis\ must be able to
+% be \emph{all} shapes since the shape is not determined for arcs in
+% $G\sb{1}$ and the series is likewise for arcs in $G\sb{2}$. To make things
+% work anyway, there are two macros |\curr_series| and |\curr_shape|
+% which contain this missing information. Furthermore, a |\do_arc| item
+% for an arc in $G\sb{1}$ will always have the structure
+% \begin{quote}
+% |\do_arc|\marg{series}|\curr_shape|\marg{wheight}
+% \end{quote}
+% and a |\do_arc| item for an arc in $G\sb{2}$ will have the structure
+% \begin{quote}
+% |\do_arc\curr_series|\marg{shape}\marg{wheight}
+% \end{quote}
+%
+%
+% \begin{macro}{\substituteshape}
+% \begin{macro}{\substituteseries}
+% \begin{macro}{\substituteseriesshape}
+% |\substituteshape|\marg{to}\marg{from}\marg{wheight}\\
+% |\substituteseries|\marg{to}\marg{from}\marg{wheight}\\
+% |\substituteseriesshape|\marg{toseries}\marg{toshape}^^A
+% \marg{fromseries}\marg{fromshape}\marg{wheight}
+%
+% \begin{macrocode}
+\def\substituteshape#1#2#3{
+ \round_wheight{#3}
+ \edef\temp_command{#1}
+ \edef\sub_suffix{#2}
+ \ifx \temp_command\sub_suffix \else
+ \def\sub_suffix##1##2{2-##2}
+ \def\do_arc##1##2##3{
+ \x_cs\ifx{sub2-##2}R \else
+ \noexpand\do_arc\noexpand\curr_series{##2}{##3}
+ \fi
+ }
+ \update_do_arc_list{}{#2}{}{#1}{\noexpand\curr_series{#1}}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\substituteseries#1#2#3{
+ \round_wheight{#3}
+ \edef\temp_command{#1}
+ \edef\sub_suffix{#2}
+ \ifx \temp_command\sub_suffix \else
+ \def\sub_suffix##1##2{1-##1}
+ \def\do_arc##1##2##3{
+ \x_cs\ifx{sub1-##1}R \else
+ \noexpand\do_arc{##1}\noexpand\curr_shape{##3}
+ \fi
+ }
+ \update_do_arc_list{#2}{}{#1}{}{{#1}\noexpand\curr_shape}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\substituteseriesshape#1#2#3#4#5{
+ \round_wheight{#5}
+ \edef\temp_command{#1-#2}
+ \edef\sub_suffix{#3-#4}
+ \ifx \temp_command\sub_suffix \else
+ \def\sub_suffix##1##2{-##1-##2}
+ \def\do_arc##1##2##3{
+ \x_cs\ifx{sub-##1-##2}R \else
+ \noexpand\do_arc{##1}{##2}{##3}
+ \fi
+ }
+ \update_do_arc_list{#3}{#4}{#1}{#2}{{#1}{#2}}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\round_wheight#1{
+ \eval_expr{#1}
+ \ifnum \one_thousand<\result
+ \result=\one_thousand
+ \else \ifnum 0>\result
+ \result=\z@
+ \fi\fi
+}
+% \end{macrocode}
+%
+% |\update_do_arc_list|\marg{update-series}\marg{update-shape}^^A
+% \allowbreak\marg{tag-series}\allowbreak\marg{tag-shape}^^A
+% \allowbreak\marg{inserted series+shape}
+%
+% \begin{macrocode}
+\def\update_do_arc_list#1#2#3#4#5{
+ \bgroup
+ \edef\temp_command{sub\sub_suffix{#1}{#2}}
+ \x_cs\let{sub\sub_suffix{#3}{#4}}=R
+ \x_cs\xdef\temp_command{
+ \x_cs\ifx\temp_command\relax \else
+ \csname\temp_command\endcsname
+ \fi
+ \ifnum 0<\result
+ \noexpand\do_arc #5{\the\result}
+ \fi
+ }
+ \egroup
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+%
+% \begin{macro}{\substitutesilent}
+% \begin{macro}{\substitutenoisy}
+% |\substitutesilent{TO}{FROM}|\\
+% |\substitutenoisy{TO}{FROM}|
+%
+% Specifies a default substitution for family or shape |TO|,
+% which is substituted by family or shape |FROM|.
+%
+% \begin{macrocode}
+\def\substitutesilent#1#2{
+ \substituteseries{#1}{#2}{900}
+ \substituteshape{#1}{#2}{900}
+}
+\def\substitutenoisy#1#2{
+ \substituteseries{#1}{#2}{500}
+ \substituteshape{#1}{#2}{500}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\a_count=900 % Silent substitution wheight
+\b_count=500 % Noisy substitution wheight
+\substituteseries{bx}{b}{\a_count}
+\substituteseries{b}{bx}{\a_count}
+\substituteseries{b}{sb}{\a_count}
+\substituteseries{b}{db}{\a_count}
+\substituteseries{m}{mb}{\a_count}
+\substituteseries{m}{l}{\a_count}
+% \end{macrocode}
+% \begin{macrocode}
+\substituteshape{ui}{it}{\b_count}
+% \end{macrocode}
+%
+% I don't think we want these since in OT1 encoding it will
+% cause the old |<sterling>| vs |<dollar>| problem. (ASAJ)
+% --- Oh yes we do. (SPQR)
+%
+% \begin{macrocode}
+\substituteshape{sl}{it}{\a_count}
+\substituteshape{it}{sl}{\a_count}
+% \end{macrocode}
+%
+%
+% \subsubsection{Listing reachable vertices}
+%
+% While determining the optimal substitutions, there is a need to store
+% some---more or less temporary---information for each vertex. Such
+% information will be called a \emph{property} of the vertex and it is
+% stored in the |\v-|\meta{series}|-|\meta{shape} family of macros.
+%
+% The following are the basic properties:
+% \begin{list}{}{^^A
+% ^^A How does one make the label go on a line of its own??
+% }
+% \item[\cs{real_font}\marg{quality}]
+% This expresses that this vertex corresponds to a font that has
+% actually been installed with a nominal quality of \meta{quality}.
+% \item[\cs{subs_font}\marg{series}\marg{shape}\marg{quality}]
+% This expresses that this vertex corresponds to a font for which
+% the font \meta{series}|/|\meta{shape} has been substituted.
+% \meta{quality} is the quality this substitution is considered to
+% have.
+% \item
+% \end{list}
+%
+%
+% There will also be some lists of vertices. These will consist of simple
+% |\do|\marg{series}\marg{shape} triples.
+%
+% \begin{macrocode}
+\def\list_subs_vertices{
+ \def\subs_vertex_list{}
+ \let\do_arc=\subs_do_arc
+ \let\do=\never_do
+ \def\real_font##1{\c_count=\@MM}
+ \def\subs_font##1##2##3{\c_count=##3\relax}
+ \real_vertex_list
+}
+\def\subs_do_arc#1#2#3{
+ \b_count=#3
+ \multiply \b_count \a_count
+ \divide \b_count \one_thousand
+ \c_count=-\max_mathchardef
+ \csname v-#1-#2\endcsname
+ \ifnum \c_count<\b_count
+ \ifnum \c_count=-\max_mathchardef
+ \edef\subs_vertex_list{\subs_vertex_list\do{#1}{#2}}
+ \fi
+ \x_cs\edef{v-#1-#2}{\noexpand\subs_font{\subs_series}
+ {\subs_shape}{\the\b_count}}
+ \toks_a=\expandafter{\the\a_toks \do_subs{#1}{#2}}
+ \fi
+}
+\def\do_subs#1#2{
+ \edef\curr_series{#1}
+ \edef\curr_shape{#2}
+ \csname v-#1-#2\endcsname
+ \a_count=\c_count
+ \a_toks={}
+ \csname sub-#1-#2\endcsname
+ \csname sub1-#1\endcsname
+ \csname sub2-#2\endcsname
+ \the\a_toks
+}
+\def\start_subs_at#1#2{
+ \edef\subs_series{#1} \let\curr_series=\subs_series
+ \edef\subs_shape{#2} \let\curr_shape=\subs_shape
+ \a_count=\x_cs\second_of_two{v-#1-#2}
+ \a_toks={}
+ \csname sub-#1-#2\endcsname
+ \csname sub1-#1\endcsname
+ \csname sub2-#2\endcsname
+ \the\a_toks
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</underconstruction>
+% \end{macrocode}
+%
+%
+% \subsection{Default encodings and font sizes}
+%
+% \begin{macro}{\declareencoding}
+% |\declareencoding{CODINGSCHEME}{ENCODING}|
+%
+% Declare a macro |\enc-CODINGSCHEME| which expands to |ENCODING|.
+% This is used to determine the encoding in |\pltomtx|.
+% \changes{1.927}{2004/07/31}{Lowercased encoding file names. (LH)}
+%
+% \begin{macrocode}
+\def\declareencoding#1#2{\x_cs\edef{enc-#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% Old \TeX{} text font encodings.
+% \begin{macrocode}
+\declareencoding{TEX~TEXT}{ot1}
+\declareencoding{TEX~TEXT~WITHOUT~F-LIGATURES}{ot1}
+\declareencoding{TEX~TYPEWRITER~TEXT}{ot1tt}
+% \end{macrocode}
+%
+% Old \TeX{} math font encodings.
+% \begin{macrocode}
+\declareencoding{TEX~MATH~ITALIC}{oml}
+\declareencoding{TEX~MATH~SYMBOLS}{oms}
+\declareencoding{TEX~MATH~EXTENSION}{omx}
+\declareencoding{LATEX~SYMBOLS}{lasy}
+% \end{macrocode}
+%
+% Euler math font encodings.
+% \begin{macrocode}
+\declareencoding{TEX~TEXT~SUBSET}{eufrak}
+\declareencoding{TEX~MATH~ITALIC~SUBSET}{eurm}
+\declareencoding{TEX~MATH~SYMBOLS~SUBSET}{euscr}
+\declareencoding{EULER~SUBSTITUTIONS~ONLY}{euex}
+% \end{macrocode}
+%
+% New \TeX{} text font encodings.
+% \begin{macrocode}
+\declareencoding{EXTENDED~TEX~FONT~ENCODING~-~LATIN}{t1}
+\declareencoding{TEX~TEXT~COMPANION~SYMBOLS~1---TS1}{ts1}
+% \end{macrocode}
+%
+% Rencoded PostScript font encdings.
+% \begin{macrocode}
+\declareencoding{TEXBASE1ENCODING}{8r}
+\declareencoding{TEX~TYPEWRITER~AND~WINDOWS~ANSI}{8y}
+% \end{macrocode}
+%
+% \begin{macro}{\declaresize}
+% |\declaresize{FONTSIZE}{LATEXSIZE}|
+%
+% \begin{macrocode}
+\def\declaresize#1#2{\x_cs\edef{siz-#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% Default sizes. An empty size argument is equivalent to |<->|,
+% for use with scalable fonts.
+%
+% \begin{macrocode}
+\declaresize{}{<->}
+\declaresize{5}{<5>}
+\declaresize{6}{<6>}
+\declaresize{7}{<7>}
+\declaresize{8}{<8>}
+\declaresize{9}{<9>}
+\declaresize{10}{<10>}
+\declaresize{11}{<10.95>}
+\declaresize{12}{<12>}
+\declaresize{14}{<14.4>}
+\declaresize{17}{<17.28>}
+\declaresize{20}{<20.74>}
+\declaresize{25}{<24.88>}
+% \end{macrocode}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \section{Debugging}
+%
+% \begin{macro}{\NOFILES}
+% |\NOFILES| switches off file generation, and causes
+% \package{fontinst} to only generate empty files. It only affects the
+% user level commands, so it is primarily of use when debugging
+% commands that build on these, such as for example the
+% |\latin|\-|family| command.
+% \changes{1.914}{2000/05/20}{Added \cs{reglyphfont}. (LH)}
+% \begin{macrocode}
+\def\NOFILES{
+ \def\transformfont##1##2{
+ \touch_file{##1.mtx}
+ \touch_file{##1.pl}
+ }
+ \def\reglyphfont##1##2{\touch_file{##1.mtx}}
+ \def\installfonts{}
+ \def\endinstallfonts{}
+ \def\installfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.vpl}
+ }
+ \def\installrawfont##1##2##3##4##5##6##7##8{
+ \touch_file{##1.pl}
+ }
+ \def\installfamily##1##2##3{\touch_file{##1##2.fd}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\touch_file}
+% \begin{macrocode}
+\def\touch_file#1{
+ \edef\lowercase_file{\lowercase{
+ \edef\noexpand\lowercase_file{#1}}}
+ \lowercase_file
+ \open_out{\lowercase_file}
+ \out_line{\percent_char~TEST~FILE.}
+ \out_line{\percent_char~Created~whilst~debugging~fontinst.}
+ \close_out{Test~file}
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput
diff --git a/fonts/utilities/fontinst/source/fimapgen.dtx b/fonts/utilities/fontinst/source/fimapgen.dtx
new file mode 100644
index 0000000000..0ebd1fe7d7
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fimapgen.dtx
@@ -0,0 +1,1607 @@
+% \CheckSum{916}
+% \iffalse meta-comment
+%
+% Copyright 1999 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+%%% From file: fimapgen.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+
+\title{\texttt{fimapgen.dtx}}
+\author{Lars Hellstr\"om}
+\begin{document}
+\maketitle
+
+\DocInput{fimapgen.dtx}
+
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \section{Generating map file fragments}
+% \label{Sec:Mapfiles}
+% \changes{1.904}{1999/06/15}{Completed rudimentary map file fragment
+% generator, made it part of \texttt{finstmsc.sty}. (LH)}
+% \newcommand\OzTeX{O\kern-.03em z\kern-.15em\TeX}
+%
+% A \emph{map file} is a file which is used by some DVI driver to link
+% various kinds of font information to each other, as is needed for the
+% driver's operation. Examples of such files are the file
+% \texttt{psfonts.map} used by \texttt{dvips} and the config files of
+% \OzTeX. There are however many other such files around in the \TeX\
+% world.
+%
+% Not all of a map file need to be related to linking specific kinds of
+% font information to each other. \OzTeX\ config files can for example
+% be used to set the values of \TeX\ implementation parameters\footnote
+% {The kind of things that were Pascal constants in the original \Web\
+% sources for \TeX.} and there need not be any font-related information
+% at all in them. The important thing is however that there can be map
+% information in them---that information could be automatically written
+% by the routines described here.
+%
+% Since there may be other kinds of information in these files (and often
+% enough need to be for everthing to work right), the routines described
+% here will only generate map file \emph{fragments}. These fragments
+% will then have to be inserted in the final map files somehow, usually
+% through manual editing. The purpose of the routines described here is
+% only to save the user a good deal of (often quite boring) typing, not
+% to actually install everything where it needs to be.
+%
+% \StopEventually{}
+%
+% \begin{macro}{\mapfrags_subsystem}
+% This macro holds the name of the automatic map file fragments
+% writer subsystem of \package{fontinst}, as it appears in error
+% messages.
+% \begin{macrocode}
+\def\mapfrags_subsystem{Map~fragments~writer}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Interface to main \package{fontinst}}
+% \label{Ssec:interface}
+%
+% The automatic generation of map file fragments is based on the two
+% commands |\storemapdata| and |\makemapentry|. Their respective
+% syntaxes are
+% \begin{quote}
+% |\storemapdata|\marg{\TeX\ font name}\marg{source}^^A
+% \marg{transforms}\\
+% |\makemapentry|\marg{\TeX\ font name}
+% \end{quote}
+%
+% \DescribeMacro{\storemapdata}|\storemapdata| commands are written when
+% a metric file \meta{\TeX\ font name}|.mtx| is generated. The purpose
+% of these commands is to record where the data for that file came from,
+% and what was done to these data. The source of the data is specified
+% in the \meta{source} argument, which can contain one of
+% \begin{quote}
+% |\fromafm|\marg{AFM name}\marg{PS name}\\
+% |\frompl|\marg{PL name}\\
+% |\frommtx|\marg{MTX name}\\
+% |\fromvpl|
+% \end{quote}
+% The only real difference between |\fromafm| and |\frompl| at this
+% stage is that the former specifies the PS name of the font, but the
+% latter does not. If you write a |\store|\-|map|\-|data| command yourself
+% and want to supply the PS name then you should use |\fromafm| even if
+% you took the font metrics from a PL.
+% There is an important difference between |\fromvpl| and the first three
+% in that virtual fonts need no map file entry (and hence there should
+% not be any either). Besides some error checking, |\fromvpl| causes a
+% |\makemapentry| to do essentially nothing.
+%
+% What was done to the data is specified by the \meta{transforms}
+% argument, which is a possibly empty sequence of commands, in which
+% each item is one of
+% \begin{isyntax}
+% |\transformfont|\marg{x-scale}\marg{slant-scale}\\
+% |\reencodefont|\marg{etx}\\
+% |\reglyphfont|
+% \end{isyntax}
+% The order is interpreted so that the thing done first appear first in
+% the sequence. In normal cases there is at most one of each, and then
+% the order is not important. \meta{x-scale}, \meta{slant-scale}, and
+% \meta{y-scale} are the values of these variables used for the
+% transformation, as \TeX\ numbers. \meta{etx} is the name of the ETX
+% file used for the font reencoding.
+% |\reglyphfont| is an error marker. It will not be encountered (but
+% it may well get stored in some table) unless a metric font transform
+% is applied to a font that has been reglyphed, which is illegal.
+%
+% \changes{1.911}{1999/11/17}{\cs{storemapdata} commands are also
+% written to metric files when they are generated. (LH)}
+% In addition to being written to a transforms record file (if one is
+% open), |\storemapdata| commands are also written to the actual metric
+% file. This makes it possible to find out where the data for a file
+% comes from even if the file was made on a previous \package{fontinst}
+% run, but since it requires reading an additional file just to find one
+% command, it will be slower than if the |\storemapdata| appeared in a
+% transforms records file.
+%
+% \DescribeMacro{\makemapentry}|\makemapentry| commands are written when
+% a VPL that uses or a ligfull PL for a font is generated. These
+% commands are the ones which actually cause the map file fragment
+% generator to write an entry, but entries are only written if they
+% haven't been written before. |\makemapentry| uses information that
+% was stored by a previous call to |\storemapdata|.
+%
+% |\storemapdata| stores its arguments in one of the control sequences
+% \describecsfamily{Tf-\meta{font}}|\Tf-|\meta{font}, where \meta{font}
+% is the same thing as \meta{\TeX\ font name} above. |Tf| stands for
+% ``\TeX\ font''. The control sequences in this family are paramterless
+% macros whose replacement texts have the following form:
+% \changes{1.914}{2000/05/30}{Contents of \cs{Tf-\meta{font}} control
+% sequences changed to allow processing the same file of recorded
+% transformations several times on the same run. (LH)}
+% \begin{quote}
+% \marg{made}\marg{source}\marg{transforms}
+% \end{quote}
+% Here \meta{source} and \meta{transforms} are exactly as above.
+% \meta{made} is a number which describes the current status of this font.
+% If \meta{made} is even then the font has been defined but no entry for
+% it has subsequently been written to the map file, whereas if it is odd
+% then an entry for it has been written to the map file. If the value of
+% \meta{made} is less than |\process_generation| then the data in the
+% other two arguments is from a previous run and should be ignored.
+% The |\Tf-|\meta{font} control sequences should always be set globally.
+%
+% \begin{macro}{\process_generation}
+% \begin{macro}{\process_generation_succ}
+% |\process_generation| is a counter which stores the number of the
+% current ``entry generation''. It starts at 0 and is increased by
+% two at each |\donedrivers|. |\process_generation_succ| is a macro
+% which expands to a number one larger than that in |\process_generation|.
+% \multchanges{\cs{process_generation}\cs{process_generation_succ}}
+% {1.914}{2000/05/30}{Control sequences added. (LH)}
+% \begin{macrocode}
+%<*map>
+\newcount\process_generation
+\process_generation=0
+\def\process_generation_succ{1}
+%</map>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\recordtransforms}
+% \begin{macro}{\endrecordtransforms}
+% \begin{macro}{\transform_record_file}
+% In main \package{fontinst}, the command
+% \begin{quote}
+% |\recordtransforms|\marg{filename}
+% \end{quote}
+% starts a block of code within which font transforms will be recorded
+% in the file \meta{filename}. |\endrecordtransforms| ends such a block.
+% \begin{macrocode}
+%<*pkg>
+\def\recordtransforms#1{\open_pout\transform_record_file{#1}}
+\def\endrecordtransforms{
+ \close_pout\transform_record_file{Font~transformation~records}
+}
+\chardef\transform_record_file=\closed_stream
+%</pkg>
+% \end{macrocode}
+% \end{macro} \end{macro} \end{macro}
+%
+%
+% \begin{macro}{\extract_font_generation}
+% The |\extract_font_generation| macro takes the name of a font and
+% returns the \meta{made} component from the |\Tf-|\meta{font} macro
+% for that font, or minus one if that macro hasn't been defined.
+% \changes{1.914}{2000/05/30}{Macro added. (LH)}
+% \begin{macrocode}
+%<*map>
+\def\extract_font_generation#1{
+ \if_defined{Tf-#1}\then
+ \expandafter\expandafter \expandafter\first_of_three
+ \csname Tf-#1\endcsname
+ \else
+ \m@ne
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\storemapdata}
+% There should not be two |\storemapdata| for the same font, hence
+% the check below. (Note that a `font' in this case is an MTX file.
+% It is quite possible (and legal) to generate the PL file for that
+% MTX file more than once.)
+% \changes{1.927}{2004/07/12}{Improved wording of warning message
+% and downgraded it to an info in the case when the two
+% definitions are the same. (LH)}
+% \begin{macrocode}
+\def\storemapdata#1#2#3{
+ \expandafter\def \expandafter\a_macro
+ \expandafter{ \expandafter{ \the\process_generation}{#2}{#3}}
+ \ifnum \extract_font_generation{#1}<\process_generation \else
+ \x_cs\ifx{Tf-#1}\a_macro
+ \fontinstinfo\mapfrags_subsystem
+ {Repeated~definition~of~font~#1}
+ \else
+ \fontinstwarning\mapfrags_subsystem
+ {Inconsistent~redefinition~of~font~#1}
+ \fi
+ \fi
+ \x_cs\let{Tf-#1}=\a_macro
+}
+%</map>
+% \end{macrocode}
+% In main \package{fontinst}, |\storemapdata| should be a noop so
+% that it can appear in metric files.
+% \begin{macrocode}
+%<pkg>\let\storemapdata=\gobble_three
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\record_transform}
+% \changes{1.911}{1999/11/18}{\cs{storemapdata} lines are optionally
+% written to the main output file as well. (LH)}
+% In main \package{fontinst}, the call
+% \begin{quote}
+% |\record_transform|\marg{TFM name}\marg{source}^^A
+% \marg{transforms}\marg{if}
+% \end{quote}
+% writes
+% \begin{quote}
+% |\storemapdata|\marg{TFM name}\marg{source}\marg{transforms}
+% \end{quote}
+% to the transformation recordings file (if font transforms are being
+% recorded) and to the main output file (if the \meta{if} evaluates
+% to true). Note that the caller of |\record_transform| must see to
+% that macros in \meta{source} and \meta{transforms} are written
+% correctly to the file (this is usually accomplished by adding
+% |\string| in suitable places of these arguments during their
+% construction).
+%
+% \begin{macrocode}
+%<*pkg>
+\def\record_transform#1#2#3#4{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\storemapdata{#1}{#2}{#3}}
+ \fi
+ #4 \out_line{\string\storemapdata{#1}{#2}{#3}} \fi
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\transformfont}
+% \changes{1.913}{2000/03/11}{Third argument removed, since it isn't
+% used anymore. This change is harmless, since the worst thing
+% that can happen to this argument is that it is typeset. (LH)}
+% \begin{macro}{\reencodefont}
+% \begin{macro}{\reglyphfont}
+% These are initially |\relax|, so they can be |\edef|ed with safely.
+% \begin{macrocode}
+%<*map>
+\let\transformfont\x_relax
+\let\reencodefont\x_relax
+\let\reglyphfont\x_relax
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+% \changes{1.914}{2000/05/30}{The total transform applied for a font is
+% determined before the entry makers are called. (LH)}
+% \begin{macro}{\makemapentry}
+% |\makemapentry| sets |\TeX_font_name|, checks if any map data have
+% been stored for the font in question, and passes them on to
+% |\make_map_entry| if they have; otherwise it raises an error. There
+% is also a group which is begun and ended by |\makemapentry|, to stop
+% values deduced for one entry to interfere with the deduction of values
+% in the following.
+% \changes{1.911}{1999/11/20}{When map data are not known, try to
+% get them from the MTX file before declaring the source unknown.
+% (LH)}
+% \begin{macrocode}
+\def\makemapentry#1{\begingroup
+ \def\TeX_font_name{#1}
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \if_file_exists{#1.mtx}\then
+ \inputmtx{#1}
+ \fi\fi
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \from_unknown{#1}
+ \x_cs\xdef{Tf-#1}{
+ {\process_generation_succ}{\noexpand\from_unknown{#1}}{}
+ }
+ \else
+ \expandafter\expandafter \expandafter\make_map_entry
+ \csname Tf-#1\endcsname
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+%
+% \begin{macro}{\make_map_entry}
+% |\make_map_entry| oversees the interpretation of the
+% \meta{source} part of the map data, something which sets
+% |\source_font_TeX_name| and possibly |\PS_font_name|. It also
+% collects the transforms applied in |\font_transforms|,
+% concatenates them, and calls a list macro |\entry_makers_list| which
+% causes the actual entries to be written, and records in
+% |\Tf-|\meta{\TeX\ font name} that the entries have been written.
+% \begin{macrocode}
+\def\make_map_entry#1#2#3{
+ \ifnum #1=\process_generation
+ \def\font_transforms{#3}
+ #2
+ \_a_false
+ \let\transformfont\concat_transformfont
+ \let\reencodefont\concat_reencodefont
+ \let\reglyphfont\_a_true
+ \font_transforms
+ \if_a_
+ \fontinsterror\mapfrags_subsystem{
+ \string\makemapentry\space for~reglyphed~font
+ }{ No~entry~for~font~\TeX_font_name\space
+ can~be~written,\messagebreak
+ since~it~had~been~reglyphed!~\error_help_a
+ }
+ \else
+ \entry_makers_list
+ \fi
+ \expandafter\gdef \csname Tf-\TeX_font_name \expandafter\endcsname
+ \expandafter{\expandafter{\process_generation_succ}{#2}{#3}}
+ \fi
+}
+%</map>
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\record_usage}
+% In main \package{fontinst}, the call
+% \begin{quote}
+% |\record_usage|\marg{TFM name}
+% \end{quote}
+% writes
+% \begin{quote}
+% |\makemapentry|\marg{TFM name}
+% \end{quote}
+% to the transformation recordings file, if font transforms are being
+% recorded. The |\record_usage| command is, roughly speaking, only used
+% by |\installfont| and |\installrawfont|.
+% \begin{macrocode}
+%<*pkg>
+\def\record_usage#1{
+ \ifnum \transform_record_file=\closed_stream \else
+ \pout_line\transform_record_file{\string\makemapentry{#1}}
+ \fi
+}
+%</pkg>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fromafm}
+% |\fromafm| saves its two arguments in the suitable string macros.
+% \begin{macrocode}
+%<*map>
+\def\fromafm#1#2{
+ \def\source_font_TeX_name{#1}
+ \def\PS_font_name{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frompl}
+% |\frompl| saves its argument in the suitable string macro.
+% \begin{macrocode}
+\def\frompl#1{
+ \def\source_font_TeX_name{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frommtx}
+% This one is tricky, since it will have to work recursively,
+% fetching data that were stored for some other font. If it cannot
+% find those data in memory, then it tries to get them from the
+% metric file itself.
+% \changes{1.911}{1999/11/17}{When map data are not known, try to
+% get them from the MTX file before declaring the source unknown.
+% (LH)}
+% \begin{macrocode}
+\def\frommtx#1{%
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \if_file_exists{#1.mtx}\then
+ \inputmtx{#1}
+ \fi\fi
+ \ifnum \extract_font_generation{#1}<\process_generation
+ \from_unknown{#1}
+ \x_cs\xdef{Tf-#1}{
+ {\the\process_generation}{\noexpand\from_unknown{#1}}{}
+ }
+ \else
+ \expandafter\expandafter \expandafter\from_mtx
+ \csname Tf-#1\endcsname
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\from_mtx}
+% \begin{macrocode}
+\def\from_mtx#1#2#3{
+ \edef\font_transforms{#3\font_transforms}
+ #2
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\fromvpl}
+% The |\fromvpl| command checks if |\font_transforms| is empty. If it
+% is then everything is fine, but no entry should be written for this
+% font. If it isn't then someone has tried to make a transformation of
+% a virtual font, which doesn't work.
+% \begin{macrocode}
+\def\fromvpl{
+ \ifx \empty_command\font_transforms \else
+ \fontinsterror\mapfrags_subsystem{
+ Font~is~virtual,~it~cannot~be~transformed}{
+ No~entry~for~font~\TeX_font_name\space can~be~written.
+ \messagebreak\error_help_a
+ }
+ \fi
+ \let\maker_do\gobble_one
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AssumeMetafont}
+% The |\AssumeMetafont| general settings command makes |\frompl|
+% behave like |\fromvpl|.
+% \begin{macrocode}
+\def\AssumeMetafont{
+ \def\frompl{
+ \ifx \empty_command\font_transforms \else
+ \fontinsterror\mapfrags_subsystem{
+ A~Metafont~cannot~be~transformed}{
+ No~entry~for~font~\TeX_font_name\space can~be~written.
+ \messagebreak\error_help_a
+ }
+ \fi
+ \let\maker_do\gobble_one
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\from_unknown}
+% This special value for \meta{source} is used for fonts that are
+% referenced by some |\frommtx| but which have no |\storemapdata|
+% themselves.
+% \begin{macrocode}
+\def\from_unknown#1{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ No~map~data~stored~for~font~#1.\messagebreak
+ No~entry~for~\TeX_font_name\space will~be~written,\messagebreak
+ due~to~insufficient~information}
+ \includewarning\warn_unknown_source
+ \let\maker_do\gobble_one
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\font_transforms}
+% This macro is used to collect all transformations that have been
+% applied to a font in, before they are concatenated.
+% \begin{macrocode}
+\let\font_transforms\empty_command
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xscale_factor}
+% \begin{macro}{\slant_factor}
+% \begin{macro}{\reencode_etx}
+% |\xscale_factor| and |\slant_factor| are dimens which the entry
+% makers can inspect to check the amount of horizontal scaling and
+% slanting should be applied to the current font. 1\,pt equals the
+% factor~1.
+% \begin{quote}
+% |\expandafter\lose_measure\the\xscale_factor|
+% \end{quote}
+% will produce the corresponding factor.
+%
+% |\reencode_etx| is a macro which contains the name of the (last)
+% ETX file used to reencode the font; it is empty if the font hasn't
+% been reencoded.
+% \multchanges{\cs{xscale_factor}\cs{slant_factor}\cs{reencode_etx}}
+% {1.914}{2000/05/30}{Control sequences added. (LH)}
+% \begin{macrocode}
+\newdimen\xscale_factor \newdimen\slant_factor
+\xscale_factor=\p@ \slant_factor=\z@
+\let\reencode_etx\empty_command
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \multchanges{\cs{concat_transformfont}\cs{concat_reencodefont}}
+% {1.914}{2000/05/30}{Macros added. (LH)}
+% \begin{macro}{\concat_transformfont}
+% The |\concat_transformfont| macro is a definition of |\transformfont|
+% which concatenates the transformation expressed by the arguments
+% with the one in |\xscale_factor| and |\slant_factor|.
+% Mathematically, it performs the multiplication
+% $$
+% \left( \begin{array}{cc} f(\#1)& f(\#2)\\ 0& 1 \end{array} \right)
+% \left( \begin{array}{cc}
+% \mbox{\cs{xscale_factor}}& \mbox{\cs{slant_factor}} \\
+% 0& 1
+% \end{array} \right)
+% $$
+% where $f$ stands for |\make_factor|.
+% \begin{macrocode}
+\def\concat_transformfont#1#2{
+ \edef\a_macro{\make_factor{#1}}
+ \xscale_factor=\a_macro\xscale_factor
+ \slant_factor=\a_macro\slant_factor
+ \advance \slant_factor \make_factor{#2}\p@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\concat_reencodefont}
+% The |\concat_reencodefont| macro is a definition of |\reencodefont|
+% which concatenates the reencoding expressed by the argument with
+% the one in |\reencode_etx|. Since reencoding ignores the previous
+% encoding, concatenating is the same thing as remembering the last
+% reencoding.
+% \begin{macrocode}
+\def\concat_reencodefont#1{\def\reencode_etx{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{User interface}
+%
+% The basic usage of the automatic map file fragment generator consists
+% of specifying for which driver(s) entries should be generated,
+% |\input|ing a file of recorded transformations generated by main
+% \package{fontinst}, and signaling that there isn't anything more to
+% write. This can be done with the commands
+% \begin{quote}
+% |\adddriver|\marg{driver name}\marg{fragment file name}\\
+% \meta{possible additional \cs{adddriver} commands}\\
+% |\input |\meta{recorded transforms file}\\
+% |\donedrivers|\\
+% |\bye|
+% \end{quote}
+% It should however be noted that this is the \emph{basic} usage. The
+% map fragments that work for one \TeX\ system need not work for
+% another (even if the driver is the same), and therefore it is
+% necessary to make the whole process of writing map file fragments
+% configurable. A few examples of things you may have to inform the map
+% fragment writer about are (and these are for \package{dvips} alone;
+% that's the driver I know best):
+% \begin{itemize}
+% \item
+% Is the font resident on the printer or must it be downloaded?
+% \item
+% If the font must be downloaded, what is the name of the file it
+% is in? Here one must take into account not only the possibility
+% that the font file might have to be shared with some other
+% software (such as a GUI) and thus cannot be named according to
+% the Berry scheme---even if it is named according to the Berry
+% scheme one still has the question of its extension: \texttt{.pfa},
+% \texttt{.pfb}, or something else? For instances of Multiple Master
+% fonts, you (at least sometimes) have to download more than one file.
+% \item
+% Again if the font must be downloaded, can/should it be partially
+% downloaded?
+% \item
+% In case the font has been reencoded, what is the name of the file
+% which defines this encoding, and by what name does that file make
+% the encoding known to the postscript interpreter?
+% \end{itemize}
+% The mechanisms available for such configuration are described in
+% Subsection~\ref{Sssec:Config-interface}.
+% Note that map files for DVI viewers are on average more likely to need
+% various platform-specific information about the fonts than map files
+% for DVI printer drivers are, and hence once can expect that
+% generation of these will need more extensive configuration than that
+% for the printer drivers.
+%
+%
+% \subsubsection{Interface for basic usage}
+%
+% An \emph{entry maker} is a group of macros which write the entry for
+% the font currently under consideration to a map fragments file each
+% time they are called. The macro to call must have a name of the form
+% \describecsfamily{make_\meta{driver}}|\make_|\meta{driver} for
+% |\adddriver| to recognise it. Each entry maker has a separate output
+% file (opened using |\open_pout|) and the identifier connected to that
+% file is called \describecsfamily{output_\meta{driver}}\relax
+% |\output_|\meta{driver}.
+%
+% A list of all entry makers currently active is maintined in the macro
+% |\entry_makers_list|. Each item in this list has the form
+% \begin{quote}
+% |\maker_do|\,|\make_|\meta{driver}
+% \end{quote}
+% |\maker_do| is usually |\relax|, but it does occationally get set to
+% other values.
+% \par\bigskip
+%
+%
+% \begin{macro}{\adddriver}
+% The |\adddriver| command adds the named driver to the list of
+% drivers to write entries for and opens an output file where the
+% entries for that particular driver will go. Repeated calls to
+% |\adddriver| for the same driver have no effect.
+% \begin{macrocode}
+\def\adddriver#1#2{
+ \x_cs\ifx{make_#1}\x_relax
+ \fontinsterror\mapfrags_subsystem
+ {There~is~no~entry~maker~for~#1}\error_help_a
+ \else
+ \x_cs\ifx{output_#1}\x_relax \_a_true \else
+ \x_cs\ifx{output_#1}\closed_stream \_a_true \else
+ \_a_false
+ \fi\fi
+ \if_a_
+ \x_cs\open_pout{output_#1}{#2}
+ \expandafter\add_to \expandafter\entry_makers_list
+ \expandafter{ \expandafter\maker_do
+ \csname make_#1\endcsname}
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\entry_makers_list}
+% \begin{macro}{\maker_do}
+% \begin{macrocode}
+\let\entry_makers_list\empty_command
+\let\maker_do\x_relax
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\donedrivers}
+% The main function performed by the |\donedrivers| command is to
+% close all the open output files. It might also print some warning
+% messages.
+% \begin{macrocode}
+\def\donedrivers{
+ \def\maker_do##1{
+ \x_cs\close_pout{output\expandafter\gobble_five\string##1}
+ {Map~file~fragments}
+ }
+ \entry_makers_list
+ \let\maker_do\x_relax
+ \let\entry_makers_list\empty_command
+ \errorstopmode
+ \reportwarnings
+ \advance \process_generation \thr@@
+ \edef\process_generation_succ{\the\process_generation}
+ \advance \process_generation \m@ne
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\gobble_five}
+% \begin{macrocode}
+\def\gobble_five#1#2#3#4#5{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% It is appropriate that the map file writer writes a summary of the
+% kinds of risky things which happened when it is done writing data to
+% files. To simplify implementing such things, there is a command
+% \DescribeMacro{\includewarning}|\includewarning| that takes care of
+% the bookkeeping involved. After the call
+% \begin{quote}
+% |\includewarning|\meta{command}
+% \end{quote}
+% the \meta{command} will be executed exactly once the next time
+% |\reportwarnings| is executed. The \meta{command} usually expands to
+% something like
+% \begin{quote}
+% \small|\fontinstwarningnoline\mapfrags_subsystem{|\\
+% | Check~the~output~file(s)--some~data~was~considered~uncertain}|
+% \end{quote}
+%
+% \begin{macro}{\warnings_list}
+% The |\warnings_list| macro contains a list of all warnings that
+% should be made. It expands to a sequence of
+% \begin{quote}
+% |\warning_do|\meta{command}
+% \end{quote}
+% |\warnings_list| is always assigned globally.
+% \begin{macrocode}
+\g_let\warnings_list=\empty_command
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\includewarning}
+% \begin{macro}{\warning_do}
+% The |\includewarning| command adds an entry for its argument to the
+% |\warnings_list| list, provided there wasn't already such an entry.
+% |\includewarning| is based on the macro |\warning_do|, which does
+% most of the bookkeeping for making sure the list contains at most
+% one entry of each kind. |\warning_do| normally expects to be
+% expanded in the context
+% \begin{quote}
+% |\warning_do|\meta{new command}\meta{old command}\meta{next}
+% \end{quote}
+% The \meta{new command} is the command that is being added to the
+% list, and the \meta{old command} is a command that is already in the
+% list. \meta{next} is the first token in the next item in the
+% list---in most cases another |\warning_do|. If \meta{new command}
+% and \meta{old command} are not equal, this should expand to
+% \begin{quote}
+% |\noexpand\warning_do|\,|\noexpand|\meta{old command}\,^^A
+% \meta{next}\,\meta{new command}
+% \end{quote}
+% If on the other hand they are equal, this should expand to
+% \begin{quote}
+% |\noexpand\warning_do|\,|\noexpand|\meta{old command}\,^^A
+% \meta{next}\,|\x_relax|
+% \end{quote}
+% The reason for this is that the last \meta{next} will not be a
+% |\warning_do|, but an |\ifx| which tests whether a new item should
+% be added to the list.
+% \begin{macrocode}
+\def\warning_do#1#2#3{
+ \noexpand\warning_do \noexpand#2
+ \ifx #1#2
+ \expandafter#3 \expandafter\x_relax
+ \else
+ \expandafter#3 \expandafter#1
+ \fi
+}
+\def\includewarning#1{
+ \xdef\warnings_list{
+ \expandafter\swap_two \expandafter#1 \warnings_list
+ \if_equal\x_relax\then \else
+ \noexpand\warning_do \noexpand#1
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\reportwarnings}
+% The |\reportwarnings| command reports all the warnings and empties
+% the |\warnings_list|.
+% \begin{macrocode}
+\def\reportwarnings{
+ \begingroup
+ \let\warning_do=\x_relax
+ \warnings_list
+ \endgroup
+ \g_let\warnings_list=\empty_command
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\warn_unknown_source}
+% \begin{macro}{\warn_undecided_data}
+% \begin{macro}{\warn_uncertain_data}
+% These macros are used to output warnings at the |\reportwarnings| at
+% the end of |\donedrivers|.
+% \begin{macrocode}
+\def\warn_unknown_source{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Some~font~is~missing~from~the~output~file(s),\messagebreak
+ since~its~source~is~unknown}
+}
+\def\warn_undecided_data{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Check~the~output~file(s)--some~data~could~not~be~determined}
+}
+\def\warn_uncertain_data{
+ \fontinstwarningnoline\mapfrags_subsystem{
+ Check~the~output~file(s)--some~data~was~considered~uncertain}
+}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+%
+%
+% \subsubsection{Configuration interface}
+% \label{Sssec:Config-interface}
+%
+% To correctly format reencodings, the map file writer must know what
+% the ETX encodings correspond to. In the case of drivers which
+% generate postscript output, this information is stored in the
+% \describecsfamily{pse-\meta{etx}}|\pse-|\meta{etx} family of macros.
+% \meta{etx} is the name (suffix excluded) of the ETX file that the
+% information pertains to. The expansion of these macros are of the form
+% \begin{quote}
+% \marg{postscript name}\marg{action}
+% \end{quote}
+% \meta{postscript name} is the name by which the encoding is known to
+% the postscript interpreter, and \meta{action} lists any additional
+% action that must be taken before the encoding can be used.
+% ^^A So far the only actions known is
+% ^^A \DescribeMacro{\download}|\download|\marg{file},
+% ^^A which will cause code for downloading the file by the name
+% ^^A \meta{file} (suffix included) to be inserted in the output.
+%
+% \begin{macro}{\declarepsencoding}
+% Data is entered in a |\pse-|\meta{etx} macro using the
+% |\declare|\-|ps|\-|encoding| command. Its syntax is
+% \begin{quote}
+% |\declarepsencoding|\marg{etx}\marg{postscript name}\marg{action}
+% \end{quote}
+% \begin{macrocode}
+\def\declarepsencoding#1#2#3{\x_cs\gdef{pse-#1}{{#2}{#3}}}
+%</map>
+% \end{macrocode}
+% In main \package{fontinst}, |\declarepsencoding| should be a noop so
+% that it can appear in encoding files. It's probably a good idea to
+% show it when typesetting as well.
+% \changes{1.931}{2005/05/13}{Added main \package{fontinst} and
+% \package{fontdoc} definitions. (LH)}
+% \begin{macrocode}
+%<pkg>\let\declarepsencoding=\gobble_three
+%<*doc>
+\def\declarepsencoding#1#2#3{\comment{%
+ This file corresponds to the \FD@typeset@string{#2} encoding vector.}}
+%</doc>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\providepsencoding}
+% This command is basically the same as |\declarepsencoding|, but it
+% checks whether the encoding has already been set and does nothing
+% if that is the case. It is used for autogenerated declarations, to
+% allow the user to override the setting.
+% \changes{1.931}{2005/05/13}{Command added. (LH)}
+% \begin{macrocode}
+%<*map>
+\def\providepsencoding#1#2#3{
+ \if_undefined{pse-#1}\then
+ \declarepsencoding{#1}{#2}{#3}
+ \fi
+}
+%</map>
+%<pkg>\let\providepsencoding=\gobble_three
+%<doc>\newcommand\providepsencoding[3]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\download}
+% By default |\download| gobbles its argument. It should be redefined
+% when that is not the desired effect.
+% \begin{macrocode}
+%<*map>
+\let\download=\gobble_one
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fulldownload}
+% By default this defaults to being a synonym of |\download|, to
+% simplify matters for drivers where the distinction is not relevant.
+% They should be redefined when that is not the desired effect.
+% \changes{1.928}{2004/12/13}{Command added. (LH)}
+% \begin{macrocode}
+\def\fulldownload#1{\download{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\encodingdownload}
+% By default this defaults to being a synonym of |\download|, to
+% simplify matters for drivers where the distinction is not relevant.
+% They should be redefined when that is not the desired effect.
+% \changes{1.931}{2005/05/04}{Command added. (LH)}
+% \begin{macrocode}
+\def\encodingdownload#1{\download{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% Some encodings seem to always be present, so they can be declared here.
+% \begin{macrocode}
+\declarepsencoding{8r}{TeXBase1Encoding}{\encodingdownload{8r.enc}}
+\declarepsencoding{8a}{StandardEncoding}{}
+% \end{macrocode}
+% \package{fontinst} must be told about other postscript encodings (if you
+% have them installed). The \texttt{finstmsc.rc} file is the right place
+% for these declarations.\relax
+% \SortIndex{finstmsc.rc file}{\texttt{finstmsc.rc} file}
+%
+% Next we have the cofiguration for fonts, which works in a similar
+% fashion. The main problem here seems to be to determine which files (if
+% any) should be downloaded to the printer, and this can be specified
+% using |\download| commands as for the encodings. The family
+% \describecsfamily{psf-\meta{PS font name}}|\psf-|\meta{PS font name}
+% of macros expand to a sequence of \meta{actions} as for the encodings.
+% If there is such a macro for a font then the instructions found there
+% should be followed.
+%
+% It is recommended that the contents of a |\psf-|\meta{PS font name}
+% macro is executed before the map file entry is written, and that
+% commands like |\download| are temporarily redefined to build the text
+% for the entry, rather than having the |\write| in |\pout_line| expand
+% the contents of |\psf-|\meta{PS font name}.
+%
+% \begin{macro}{\specifypsfont}
+% The |\specifypsfont| command is used as
+% \begin{quote}
+% |\specifypsfont|\marg{PS font name}\marg{actions}
+% \end{quote}
+% It can be used to specify the actions that should be done to make a
+% Postscript font known to the printer, when the automatic guessing
+% would not be right.
+% \begin{macrocode}
+\def\specifypsfont#1#2{\x_cs\def{psf-#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% Examples of cases where |\specifypsfont| would be needed are:
+% \begin{itemize}
+% \item Fonts which are resident on the printer. In this case the
+% \meta{actions} argument should be empty, e.g.
+% \begin{quote}
+% |\specifypsfont{Times-Roman}{}|
+% \end{quote}
+% \item Instances of multiple master fonts. In this case one must
+% download both the multiple master font and the stub file that
+% defines the instance.
+%
+% Subsection~10.6.1 in The \LaTeX\ graphics companion~\cite
+% {LaTeX-graph-comp} contains an example with an instance of the
+% \texttt{MinionMM} multiple master font. Both the \TeX\ and
+% (what is of interest here) the PS name for this instance is
+% \texttt{zmnl8ac6}, the base multiple master font is stored in the
+% file \texttt{MinionMM.pfb}, and the stub file is called
+% \texttt{zmnl8ac6.pro}. The |\specifypsfont| command for this is
+% \begin{quote}
+% |\specifypsfont{zmnl8ac6}{%|\\
+% | \download{MinionMM.pfb}\download{zmnl8ac6.pro}%|\\
+% |}|
+% \end{quote}
+% (It should probably be remarked that the most common method of
+% defining a multiple master font instance is not to explicitly
+% create it as in this example, but to simply use it as any ordinary
+% PS font and then rely on the PS \textsf{findfont} operator to
+% automagically create it for you. This requires using a special
+% naming scheme for instances of multiple master fonts.)
+% \item Fonts which do not fit any of the general naming schemes.
+% \end{itemize}
+%
+%
+% \begin{macro}{\AssumeLWFN}
+% This command makes \mbox{MacOS} \texttt{LWFN} style abbreviated
+% Postscript font names the default for fonts that have no
+% |\psf-| entry.
+% \begin{macrocode}
+\def\AssumeLWFN{\let\get_PS_font_file\LWFN_get_PS_font_file}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Deducing values for the map file entries}
+%
+%
+% \subsubsection{Basic principles}
+%
+% The automatic generation of map file fragments mainly consists of
+% determining various text strings and writing these to a file as the
+% format of the map file being written requires. The complicated part is
+% usually to determine what these text strings should be, since the only
+% restriction imposed by the output format often is that the strings
+% should be written in the right order and with separating whitespace.
+%
+% It is furthermore the case that some of these text strings seem to be
+% hard to deduce from the information primarily given in the command to
+% write the entry, but somewhat easier to deduce from some other deduced
+% text string.
+%
+% Therefore the following model seems appropriate. For each text string
+% that may need to be deduced, there is one macro which is used to store
+% the string (if it has been deduced) and one macro which can be called
+% to set the former macro to an appropriate value. Thus there is one
+% macro |\PS_font_name| which stores the postscript name for the font
+% currently in question and one macro
+% \describecsfamily{get_\meta{string name}}|\get_PS_font_name| which
+% determines the proper value for |\PS_font_name|. There is also a macro
+% \DescribeMacro{\unknown_str}|\unknown_str| to which all the
+% string storing macros should initially be |\let|, so that it can be
+% easily tested whether a string storing macro has been given its proper
+% value or not.
+%
+% Typically, if |\PS_font_name| is used somewhere, one would first have
+% a piece of code that says
+% \begin{quote}
+% \small
+% |\ifx\PS_font_name\unknown_str|\\
+% | \get_PS_font_name|\\
+% |\fi|
+% \end{quote}
+% to ensure that it is known when it is used.
+%
+% \begin{macro}{\unknown_str}
+% A suitable value for this macro seems to be |?????|.
+% \begin{macrocode}
+\def\unknown_str{?????}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clueless_str}
+% To further support this model, there is also a macro |\clueless_str|
+% which a string storing macro should be |\let| equal to if its proper
+% value could not be determined. This distinction is useful for the
+% |\get_|\textellipsis\ macros, since if |\get_|$A$ can determine the
+% correct value of $A$ from $B$, but also from $C$, then it helps if
+% |\get_|$A$ can easily check whether it has previously turned out to
+% be impossible to determine the value of $B$, because then it can
+% simply deduce $A$ from $C$ instead.
+%
+% \begin{macrocode}
+\edef\clueless_str{\unknown_str ?}
+% \end{macrocode}
+% \end{macro}
+%
+% An example of how |\clueless_str| should be used is the following
+% skeleton of a |\get_|$A$ macro:
+% \begin{quote}\small
+% |\def\get_|$A$|{|\\
+% | \ifx\unknown_str\|$B$| \get_|$B$| \fi|\\
+% | \ifx\clueless_str\|$B$\\
+% | \ifx\unknown_str\|$C$| \get_|$C$| \fi|\\
+% | \ifx\clueless_str\|$C$\\
+% | \let\|$A$|\clueless_str|\\
+% | \else|\\
+% | |\meta{Deduce $A$ from $C$}\\
+% | \fi|\\
+% | \else|\\
+% | |\meta{Deduce $A$ from $B$}\\
+% | \fi|\\
+% |}|
+% \end{quote}
+%
+%
+% \subsubsection{Implementation}
+%
+% \begin{macro}{\TeX_font_name}
+% This is the name (as appearing in a DVI or VF file) of the font for
+% which an entry should be made. It is set by |\makemapentry|, so no
+% |\get_|\textellipsis\ macro is needed.
+% \begin{macrocode}
+\let\TeX_font_name\unknown_str
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\source_font_TeX_name}
+% This is the name (as AFM or PL) of the font whose metrics were
+% used by \package{fontinst}. It is set by |\fromafm| or |\frompl|,
+% so no |\get_|\textellipsis\ macro is needed.
+% \begin{macrocode}
+\let\source_font_TeX_name\unknown_str
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PS_font_name}
+% This is the name (as FontName entry in an AFM or correspondingly) of
+% the font in question.
+% \begin{macrocode}
+\let\PS_font_name\unknown_str
+% \end{macrocode}
+% \begin{macro}{\get_PS_font_name}
+% I expect this to become one of the central macros in the map file
+% generation (at least when entries are generated for postscript
+% fonts), but for the moment it does the closest thing to nothing a
+% |\get_|\textellipsis\ macro is allowed to do; it admits it hasn't
+% got a clue about what the proper value is.
+% \begin{macrocode}
+\def\get_PS_font_name{\let\PS_font_name\clueless_str}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\AssumeAMSBSYY}
+% \begin{macro}{\AssumeBaKoMa}
+% These commands redefine |\get_PS_font_name| so that it returns the
+% PS name this font would have if it was part of the AMS\slash
+% Blue~Sky\slash Y\&Y and BaKoMa respectively distribution of the
+% Computer Modern fonts---the \TeX\ font name in all upper case and
+% all lower case respectively.
+% \begin{macrocode}
+\def\AssumeAMSBSYY{\def\get_PS_font_name{
+ \uppercase \expandafter{ \expandafter\def
+ \expandafter\PS_font_name \expandafter{ \source_font_TeX_name}
+ }
+}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\AssumeBaKoMa{\def\get_PS_font_name{
+ \lowercase \expandafter{ \expandafter\def
+ \expandafter\PS_font_name \expandafter{ \source_font_TeX_name}
+ }
+}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\PS_font_file}
+% This is the name of the file (suffix included) in which the PS font
+% is expected to be found.
+% \begin{macrocode}
+\let\PS_font_file\unknown_str
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get_PS_font_file}
+% \begin{macro}{\normal_get_PS_font_file}
+% \begin{fistring}{PSfontsuffix}
+% The macro |\normal_get_PS_font_file| is (hardly surprisingly) the
+% normal |\get_PS_font_file|. It simply uses |\source_font_TeX_name|
+% plus the suffix specified by the |PSfontsuffix| string.
+% \begin{macrocode}
+\resetstr{PSfontsuffix}{.pfa}
+\def\normal_get_PS_font_file{
+ \edef\PS_font_file{\source_font_TeX_name\str{PSfontsuffix}}
+}
+\let\get_PS_font_file=\normal_get_PS_font_file
+% \end{macrocode}
+% \end{fistring}\end{macro}\end{macro}
+%
+% \begin{macro}{\LWFN_get_PS_font_file}
+% \begin{macro}{\abbreviate_PS_font_name}
+% In MacOS, Postscript fonts file names are usually abbreviated forms of
+% the Postscript font names, formed using the so called
+% \(5+3+3+\cdots\) rule---keep the first five letters of the first
+% subword, keep the first three letters of all following subwords. The
+% |\LWFN_get_PS_font_file| macro uses this scheme if the Postscript
+% name for the font is known, otherwise it calls the
+% |\normal_get_PS_font_file|. The LWFN in the macro name is the type
+% code for such files.
+%
+% The algorithm is based on using |\aftergroup| to construct the
+% wanted |\def| statement, only |\aftergroup|ing the letters that are
+% not to be removed in the abbreviation. |\a_count| is used as a
+% counter of how many more letters in the current subword should be
+% kept.
+% \begin{macrocode}
+\def\LWFN_get_PS_font_file{
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \ifx \PS_font_name\clueless_str
+ \normal_get_PS_font_file
+ \includewarning\warn_uncertain_data
+ \else
+ \begingroup
+ \aftergroup\def \aftergroup\PS_font_file
+ \aftergroup{
+ \a_count=4~
+ \expandafter\expandafter \expandafter\aftergroup
+ \expandafter\swap_two \expandafter\abbreviate_PS_font_name
+ \PS_font_name \x_relax
+ \aftergroup}
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\abbreviate_PS_font_name#1{
+ \ifx \x_relax#1 \else
+ \ifnum \uccode`#1=`#1
+ \a_count=2
+ \aftergroup#1
+ \else\ifx -#1
+ \a_count=\z@
+ \else\ifnum \a_count>\z@
+ \advance \a_count \m@ne
+ \aftergroup#1
+ \fi\fi\fi
+ \expandafter\abbreviate_PS_font_name
+ \fi
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+%
+% \subsection{Driver makers}
+%
+% This subsection contains the definitions of macros that makes up the
+% driver makers.
+%
+%
+% \subsubsection{The \texttt{debug} driver}
+%
+% The \texttt{debug} driver maker doesn't really generate entries for
+% any DVI driver map file, it just prints the data that was available.
+% It is mainly intended for debugging purposes, but it might also serve
+% as a basic model for other driver makers.
+%
+% \begin{macro}{\make_debug}
+% \begin{macrocode}
+\def\make_debug{
+ \pout_line\output_debug{Driver~data~for~font~\TeX_font_name:}
+ \pout_lline\output_debug{Source~font~TeX~name:~\source_font_TeX_name}
+ \ifx \reencode_etx\empty_command \else
+ \pout_lline\output_debug{Font~reencoded~using~\reencode_etx.etx.}
+ \fi
+ \ifdim \xscale_factor=\p@ \else
+ \pout_lline\output_debug{Font~x-scaled~by~
+ \expandafter\lose_measure\the\xscale_factor.
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \pout_lline\output_debug{Font~slanted~by~
+ \expandafter\lose_measure\the\slant_factor.
+ }
+ \fi
+ \debug_values_hook
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\debug_value}
+% The |\debug_value| macro can be used to print the name and contents
+% of an arbitrary value macro in the |debug| driver. It is called with
+% the value macro as argument, e.g.
+% \begin{quote}
+% |\debug_value\PS_font_name|
+% \end{quote}
+%
+% \begin{macrocode}
+\def\debug_value#1{
+ \ifx #1\unknown_str
+ \csname get_ \expandafter\gobble_one \string#1 \endcsname
+ \fi
+ \pout_lline\output_debug{\string#1:~#1}
+ \ifx #1\clueless_str \includewarning\warn_undecided_data \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\debugvalue}
+% \begin{macro}{\debug_values_hook}
+% The |\debugvalue| command is a user level interface for adding
+% value macros to the list of those that are displayed by the
+% \texttt{debug} driver. The argument is the name of the value in
+% question, e.g.
+% \begin{quote}
+% |\debugvalue{PS_font_name}|
+% \end{quote}
+% Note that the name given to |\debugvalue| is not the control
+% sequence in which the name is stored.
+% \begin{macrocode}
+\def\debugvalue#1{
+ \expandafter\add_to \expandafter\debug_values_hook
+ \expandafter{ \expandafter\debug_value \csname#1\endcsname}
+}
+% \end{macrocode}
+% \begin{macrocode}
+\let\debug_values_hook\empty_command
+\debugvalue{PS_font_name}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \subsubsection{The \texttt{dvips} driver}
+%
+% \changes{1.912}{2000/02/19}{\texttt{dvips} mapfile fragments writer
+% added. (LH)}
+% Before constructing an entry for a \package{dvips} mapfile, it should
+% be sorted out how such an entry should look. The \package{dvips}
+% manual says
+% \begin{quotation}
+% The parsing of the \texttt{psfonts.map} file should be explained to
+% eliminate all confusion. If a line is empty or begins with a space,
+% asterisk, semicolon, or hash mark, it is ignored. Each remaining
+% line is separated into words, where words are separated by spaces or
+% tabs. If a word begins with a double quote, it extends until the
+% next double quote or the end of the line. If a word starts with a
+% less than character, it is treated as a font header file (or a
+% downloaded PostScript font). There can be more than one such header
+% for a given font. If a word starts with a double quote, it is a
+% special instruction for generating that font. Otherwise it is a
+% name. The first such name is always the name \TeX\ uses for the
+% font and is also the name of the raw \texttt{tfm} file. If there is
+% another name word, that name is used as the PostScript name; if
+% there is only one name word, it is used for both the \TeX\ name and
+% the PostScript name.
+% \end{quotation}
+%
+% A \package{fontinst}-generated map file entry for the \texttt{dvips}
+% driver has the following structure:
+% \begin{isyntax}
+% \meta{\TeX{} font name} \meta{PS font name} \meta{downloads}
+% \meta{font transformations}
+% \end{isyntax}
+% \meta{\TeX{} font name} is simply the value of |\TeX_font_name| and
+% \meta{PS font name} is simply the value of |\PS_font_name|.
+% \meta{downloads} is a possibly empty sequence in which each item
+% has the form
+% \begin{quote}
+% \meta{prefix}\meta{filename}
+% \end{quote}
+% The \meta{prefix} values I've came across are empty,\footnote{I think
+% this is only used for files that \package{dvips} should ignore, but
+% which certain other programs that read the same \texttt{psfonts.map}
+% need.} |<|, |<<|, and |<[|. Currently |<| is always used.
+% \meta{filename} is a filename with suffix. \meta{font transformations}
+% is either empty or has the form
+% \begin{quote}
+% |"| \meta{Postscript code} |"|
+% \end{quote}
+%
+% Should support for the |<<| or |<[| prefixes be needed, then this
+% should be done by adding some new variant of the |\download|
+% command---|\fullldownload|, maybe---rather than adding the extra
+% character to the \meta{filename}. To simplify matters for other drivers,
+% such new variants should by default expand to |\download|, rather than
+% |\gobble_one|.
+%
+%
+% \begin{macro}{\downloads_list}
+% \begin{macro}{\append_download}
+% The |\downloads_list| is a token list register which is especially
+% used for accumulating |\download| commands. Each driver maker which
+% uses it should begin by emptying it. The command
+% \begin{quote}
+% |\append_download|\marg{cseq}\marg{string expression}
+% \end{quote}
+% \changes{1.931}{2005/05/10}{New syntax (two arguments)! The second
+% is expanded, whereas the first is protected by a \cs{noexpand}.
+% (LH)}
+% appends
+% \begin{quote}
+% \meta{cseq}\marg{expanded string expression}
+% \end{quote}
+% to |\downloads_list|. It overwrites |\a_macro|.
+% \begin{macrocode}
+\newtoks\downloads_list
+\def\append_download#1#2{
+ \edef\a_macro{
+ \downloads_list =
+ \noexpand\expandafter{ \noexpand\the \downloads_list
+ \noexpand#1 {#2} }
+ }
+ \a_macro
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+%
+% \begin{macro}{\make_dvips}
+% This macro gathers the information for a \texttt{dvips} driver entry
+% and writes it to the corresponding output file. As a \texttt{dvips}
+% mapfile entry is on one line, the entire entry is written at once.
+% The \meta{font transformations} is collected as explicit text in the
+% macro |\postscript_code|. The \meta{downloads} is collected as a
+% sequence of |\|\dots|download| commands in the |\downloads_list|
+% token register.
+% \changes{1.931}{2005/05/10}{Supporting \cs{fulldownload} and
+% \cs{encodingdownload}. (LH)}
+% \begin{macrocode}
+\def\make_dvips{
+ \downloads_list={}
+ \let\postscript_code\empty_command
+ \def\download{\append_download\download}
+ \def\fulldownload{\append_download\fulldownload}
+ \def\encodingdownload{\append_download\encodingdownload}
+ \ifx \reencode_etx\empty_command \else
+ \if_undefined{pse-\reencode_etx}\then
+ \etxtoenc{\reencode_etx}{\reencode_etx}
+ \fi
+ \expandafter\expandafter \expandafter\second_of_two
+ \csname pse-\reencode_etx\endcsname
+ \edef\postscript_code{\postscript_code\space
+ \expandafter\expandafter \expandafter\first_of_two
+ \csname pse-\reencode_etx\endcsname
+ \space ReEncodeFont
+ }
+ \fi
+ \ifdim \xscale_factor=\p@ \else
+ \edef\postscript_code{\postscript_code
+ \space\expandafter\lose_measure\the\xscale_factor
+ \space ExtendFont
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \edef\postscript_code{\postscript_code
+ \space\expandafter\lose_measure\the\slant_factor
+ \space SlantFont
+ }
+ \fi
+% \end{macrocode}
+% After constructing the \meta{Postscript code} and having appended
+% the necessary download (if any) for that code, the next problem is
+% to determine the actual \meta{PS font name} and append the downloads
+% needed to actually define the font to the Postscript interpreter. If
+% there is no special entry for this font in the |\psf-|\meta{PS font
+% name} table, or if its \meta{PS font name} is unknown, then it is
+% assumed that exactly one file should be downloaded. As the name of
+% that file is taken the value of |\PS_font_file|.
+% \begin{macrocode}
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \ifx \PS_font_name\clueless_str
+ \includewarning\warn_undecided_data
+ \_a_true
+ \else
+ \if_undefined{psf-\PS_font_name}\then
+ \_a_true
+ \else
+ \csname psf-\PS_font_name \endcsname
+ \_a_false
+ \fi\fi
+ \if_a_
+ \ifx \PS_font_file\unknown_str \get_PS_font_file \fi
+ \append_download\download{\PS_font_file}
+ \ifx \PS_font_file\clueless_str
+ \includewarning\warn_undecided_data
+ \fi
+ \fi
+% \end{macrocode}
+% Finally, the entire entry is written to the file. The point with
+% expanding past an empty command is that \TeX\ in a |\write| normally
+% jumps past the expansion of a |\the|\meta{token list register}
+% without expanding it further, but this effect can be prevented by
+% expanding the |\the| with an |\expandafter|.
+% \begin{macrocode}
+ \def\download##1{~<##1}
+ \def\fulldownload##1{~<<##1}
+ \def\encodingdownload##1{~<[##1}
+ \pout_line\output_dvips{
+ \TeX_font_name\space\PS_font_name
+ \expandafter\empty_command \the\downloads_list
+ \ifx \postscript_code\empty_command \else
+ \space"\postscript_code\space"
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{The \texttt{dvipdfm} driver}
+%
+% \changes{1.912}{2000/02/22}{\texttt{dvipdfm} mapfile fragments writer
+% added. (LH)}
+%
+% A mapfile entry for the \texttt{dvipdfm} driver has the following
+% structure:
+% \begin{isyntax}
+% \meta{\TeX{} font name} \meta{encoding} \meta{PS font}
+% \meta{options}
+% \end{isyntax}
+% \meta{\TeX{} font name} is simply the value of |\TeX_font_name|.
+% \meta{encoding} is the name of the encoding file which should be used
+% to reencode the font, or \texttt{default} if there is none. \meta{PS
+% font} is the value of |\PS_font_name| for the standard 35 fonts
+% (i.e., fonts which will not be included in the PDF generated), but for
+% other fonts it is the name of the file which contains the
+% font.\footnote{The documentation seems to say that \texttt{dvipdfm}
+% can only understand fonts in PFB format; I have chosen to ignore this
+% potential problem.} \meta{options}, finally, is a possibly empty
+% sequence of space-separated options. Each option is one of the
+% following
+% \begin{quote}
+% |-e |\meta{number}\\
+% |-s |\meta{number}\\
+% |-r|
+% \end{quote}
+% The |-e| and |-s| options extend and slant by the given amounts. The
+% |-r| option is a workaround for some Acrobat bugs; it is currently not
+% generated by \package{fontinst}.
+%
+% \begin{macro}{\make_dvipdfm}
+% This macro gathers the information for a \texttt{dvipdfm} driver entry
+% and writes it to the corresponding output file. As a \texttt{dvipdfm}
+% mapfile entry is on one line, the entire entry is written at once.
+% The \meta{options} text is collected as explicit text in the
+% macro |\options_text|. The \meta{downloads} is collected as a
+% sequence of |\download| commands in the |\downloads_list| token
+% register.
+% \begin{macrocode}
+\def\make_dvipdfm{
+ \def\font_encoding{default}
+ \ifx \reencode_etx\empty_command \else
+ \if_undefined{pse-\reencode_etx}\then
+ \etxtoenc{\reencode_etx}{\reencode_etx}
+ \fi
+ \def\download##1{\def\font_encoding{##1}}
+ \expandafter\expandafter \expandafter\second_of_two
+ \csname pse-\reencode_etx\endcsname
+ \fi
+ \let\options_text\empty_command
+ \ifdim \xscale_factor=\p@ \else
+ \edef\options_text{\options_text\space
+ -e~\expandafter\lose_measure\the\xscale_factor
+ }
+ \fi
+ \ifdim \slant_factor=\z@ \else
+ \edef\options_text{\options_text\space
+ -s~\expandafter\lose_measure\the\slant_factor
+ }
+ \fi
+% \end{macrocode}
+% After constructing the \meta{options} and having determined
+% \meta{encoding}, the next problem is to determine the actual
+% \meta{PS font}, which will be put in |\a_macro|. If there is no
+% special entry for this font in the |\psf-|\meta{PS font name} table,
+% or if its \meta{PS font name} is unknown, then it is assumed that
+% exactly one file should be downloaded. As the name of that file is
+% taken the value of |\PS_font_file|.
+% \begin{macrocode}
+ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi
+ \if_or \if_equal\PS_font_name\clueless_str \or_else
+ \if_undefined{psf-\PS_font_name}
+ \then
+ \ifx \PS_font_file\unknown_str \get_PS_font_file \fi
+ \ifx \PS_font_file\clueless_str
+ \includewarning\warn_undecided_data
+ \fi
+ \let\a_macro=\PS_font_file
+ \else
+ \let\a_macro=\PS_font_name
+ \def\download##1{\def\a_macro{##1}}
+ \csname psf-\PS_font_name \endcsname
+ \fi
+% \end{macrocode}
+% Finally, the entire entry is written to the file.
+% \begin{macrocode}
+ \pout_line\output_dvipdfm{
+ \TeX_font_name\space\font_encoding\space\a_macro
+ \options_text
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{The \texttt{pltotf} ``driver''}
+% \changes{1.915}{2000/06/27}{\texttt{pltotf} ``driver'' support
+% added. (LH)}
+%
+% It can sometimes be hard to determine which of all the PL files that
+% \package{fontinst} creates need to be converted to TFM files. In most
+% cases no \texttt{8a}-encoded PLs need to be converted as they aren't
+% used as base fonts or installed in an FD file, but to automatically
+% exclude them isn't a trivial task (even though it probably could be
+% done by a regular expression filter for fonts named according to the
+% \texttt{fontname} scheme). There furthermore seems to be some systems
+% on which it for various reasons isn't easy to convert all PLs in a
+% directory. The \texttt{pltotf} ``driver'' support is meant to help with
+% both these problems, as the ``map file'' it creates really is a shell
+% script (batch file) for converting precisely those PL files that need
+% a map file entry to TFM format. I believe the shell script will work
+% both for UNIX and DOS systems.
+%
+% \begin{macro}{\make_pltotf}
+% \begin{fistring}{TFMfileprefix}
+% |\make_pltotf| writes a \package{PLtoTF} command for converting the
+% current font's PL file to a TFM file. If set, the string
+% \texttt{TFMfileprefix} will be prepended to the TFM file name---this
+% could be used for putting the TFMs in some directory other than the
+% current.
+% \begin{macrocode}
+\def\make_pltotf{
+ \pout_line\output_pltotf{pltotf~\TeX_font_name.pl~
+ \ifisstr{TFMfileprefix}\then \str{TFMfileprefix}\fi
+ \TeX_font_name.tfm
+ }
+}
+% \end{macrocode}
+% \end{fistring}\end{macro}
+%
+%
+% \begin{macrocode}
+%</map>
+% \end{macrocode}
+% \Finale
+\endinput
+
diff --git a/fonts/utilities/fontinst/source/fisource.dvi b/fonts/utilities/fontinst/source/fisource.dvi
new file mode 100644
index 0000000000..0a564d8141
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fisource.dvi
Binary files differ
diff --git a/fonts/utilities/fontinst/source/fisource.ist b/fonts/utilities/fontinst/source/fisource.ist
new file mode 100644
index 0000000000..a7f22dde29
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fisource.ist
@@ -0,0 +1,47 @@
+%%
+%% This is file `docindex.ist',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% docindex.dtx (with options: `ist')
+%%
+%% This file may be distributed and/or modified under the conditions
+%% of the LaTeX Project Public License, either version 1.2 of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the source
+%% file from which it was generated. You may distribute that source file
+%% without this generated file.
+%%
+item_0 "}{1}\n\\indexitem{1}{"
+item_1 "}{2}\n \\indexitem{2}{"
+item_01 "}{2}\n \\indexitem{2}{"
+item_x1 "}{2}\n \\indexitem{2}{"
+item_2 "}{3}\n \\indexitem{3}{"
+item_12 "}{3}\n \\indexitem{3}{"
+item_x2 "}{3}\n \\indexitem{3}{"
+delim_0 "}{9}{"
+delim_1 "}{9}{"
+delim_2 "}{9}{"
+delim_n ", "
+delim_r "--"
+group_skip "}{0}\n%^^A\n\\indexnewletter{0}{"
+heading_prefix ""
+heading_suffix ""
+headings_flag 1
+actual '='
+quote '!'
+level '>'
+page_precedence "naArR"
+keyword "\\xdocindexentry"
+page_compositor "\\+"
+preamble "\\docindexguard{\\endinput}\n%^^A\n\\indexnewletter{1}{"
+postamble "}{0}\n\\endinput"
+%%
+%%
+%% End of file `docindex.ist'.
diff --git a/fonts/utilities/fontinst/source/fisource.sty b/fonts/utilities/fontinst/source/fisource.sty
new file mode 100644
index 0000000000..35ae65d39f
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fisource.sty
@@ -0,0 +1,691 @@
+% \iffalse
+%
+% Copyright 1999, 2000 the fontinst maintenance team and any individual
+% authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+% \fi
+%
+% \title{The \package{fisource} package}
+% \author{Lars Hellstr\"om}
+% \maketitle
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fisource}%
+ [2003/03/29 v2.16 Fontinst source documentation commands]
+% \end{macrocode}
+%
+% \section{Option processing}
+%
+% \begin{option}{warnfinale}
+% \changes{2.01}{2000/07/06}{Option added. (LH)}
+% Under development I find it quite a nuisance that |\Finale| raises
+% an error if the checksum isn't correct; a warning feels more
+% appropriate. Therefore the \texttt{warnfinale} option redefines
+% |\check@checksum| to emit a warning instead.
+% \begin{macrocode}
+\DeclareOption{warnfinale}{%
+ \@ifpackageloaded{doc}\@firstofone\AtEndOfPackage {%
+ \def\check@checksum{\relax
+ \ifnum\check@sum=\z@
+ \typeout{**********************************}%
+ \typeout{* This macro file has no checksum!}%
+ \typeout{* The checksum should be \the\bslash@cnt!}%
+ \typeout{**********************************}%
+ \else\ifnum \check@sum=\bslash@cnt
+ \typeout{*******************}%
+ \typeout{* Checksum passed *}%
+ \typeout{*******************}%
+ \else
+ \PackageWarning{doc}{Checksum not passed
+ (\the\check@sum<>\the\bslash@cnt)}%
+ \fi\fi
+ \global\check@sum\z@
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{option}
+%
+% All other options are passed on to \package{xdoc}.
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{xdoc2}}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% \changes{2.00}{2000/07/06}{Use \package{xdoc1}. (LH)}
+% \changes{2.02}{2000/07/15}{Use \package{xdoc2}. (LH)}
+% \changes{2.10}{2001/02/27}{Use \package{docidx2e}. (LH)}
+% \begin{macrocode}
+\RequirePackage{xdoc2,docidx2e}
+% \end{macrocode}
+%
+% \section{Miscellanea}
+%
+% \begin{macrocode}
+\CodelineIndex
+\setcounter{IndexColumns}{2}
+\setcounter{tocdepth}{2}
+\DeclareRobustCommand\package[1]{\textsf{#1}}
+\DeclareRobustCommand\eTeX{\(\varepsilon\)-\kern-.125em\TeX}
+% \end{macrocode}
+%
+% \begin{macro}{\AllTeX}
+% \changes{2.13}{2001/08/26}{Command added. (LH)}
+% \begin{macro}{\La}
+% The |\AllTeX| command is for writing `(La)TeX' (but nicer). The
+% definition is taken from \texttt{tugboat.dtx}.
+% \begin{macrocode}
+\newcommand{\La}{%
+ L\kern-.36em
+ {%
+ \setbox0\hbox{T}%
+ \vbox to\ht0{\hbox{%
+ $\m@th$\csname S@\f@size\endcsname
+ \fontsize\sf@size\z@\math@fontsfalse\selectfont
+ A%
+ }\vss}%
+ }%
+}
+\DeclareRobustCommand\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\missing}
+% \changes{2.10}{2001/02/27}{Redefined using
+% \cs{NewDescribeCommand}. (LH)}
+% \begin{macrocode}
+\NewDescribeCommand\missing{%
+ \XD@grab@marg\XD@grab@harmless@cs
+}{2}{%
+ \GenericDescribePrint{\small Not in \texttt{#1}:
+ \texttt{\Bslash#2}}%
+ \MakeSortKey\@tempa{#2}{}%
+ \IndexEntry{%
+ \LevelSorted{Not in #1:}{Not in \texttt{#1}:}%
+ \LevelSorted{\@tempa}{\texttt{\Bslash#2}}%
+ }{usage}{\thepage}%
+}
+% \newcommand\missing[2]{%
+% \marginpar{%
+% \raggedleft\leavevmode\strut
+% Not in \texttt{#1}: \texttt{\string#2}\strut
+% \index{Not in #1\actualchar Not in \string\texttt{#1}\levelchar
+% \string#2\actualchar\string\verb\verbatimchar
+% \string#2\verbatimchar\encapchar usage}%
+% }%
+% }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\newcommand\ambiguity[1]{\leavevmode
+ \textbf{#1\index{Ambiguity\encapchar usage}}%
+ \marginpar{\raggedleft\textbf{\huge A}}%
+}
+\newcommand\question[1]{\leavevmode
+ \textbf{#1\index{Question\encapchar usage}}%
+ \marginpar{\raggedleft\textbf{\huge ?}}%
+}
+\AtBeginDocument{\catcode`\_=11}
+\def\MakePrivateLetters{\catcode`\_=11\makeatletter}
+
+% \end{macrocode}
+%
+% \multchanges{\cs{meta}}{1.30}{2000/01/02}{\cs{Meta} command (robust
+% wrapper around \package{doc}'s \cs{meta}) added. (LH)}
+% \multchanges{\cs{meta}}{1.31}{2000/02/10}{Command redefined so that
+% it is robust itself. \cs{Meta} removed. (LH)}
+% \multchanges{\cs{meta@font@select}}{1.33}{2000/02/26}{Macro added.
+% (LH)}
+% \multchanges{\cs{meta}}{1.35}{2000/03/25}{Don't make \cs{setlanguage}
+% whatsits in restricted horizontal mode. (LH)}
+% \multchanges{\cs{meta}}{2.00}{2000/07/06}{Command definition removed,
+% since the command is already defined by \package{doc} or
+% \package{xdoc}. (LH)}
+%
+% \begin{macro}{\cs}
+% This is \package{ltxdoc}'s normal |\cs|, but with a twist to make
+% |\meta| produce better results when used in the argument.
+% \changes{1.33}{2000/02/26}{Redefinition added. (LH)}
+% \changes{2.00}{2000/07/06}{Use \cs{MetaNormalfont} and
+% \cs{PrintVisibleChar}. (LH)}
+% \begin{macrocode}
+\DeclareRobustCommand\cs[1]{%
+ \texttt{\MetaNormalfont\PrintVisibleChar{`\\}#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{isyntax}
+% |isyntax| is for ``informal'' syntax specifications, such as
+% \begin{quote}
+% A \meta{varchar command} can be one of\\
+% \begin{quote}
+% |\vartop|\marg{glyph}\\
+% |\varmid|\marg{glyph}\\
+% |\varbot|\marg{glyph}\\
+% |\varrep|\marg{glyph}
+% \end{quote}
+% \end{quote}
+% The implementation is based on that of the \texttt{verse}
+% environment.It usually works just as fine with \texttt{quote}, but
+% \texttt{isyntax} handles breaking long lines better (and more
+% elegantly).
+% \changes{1.37}{2000/05/14}{Increased \cs{rightskip} stretchability
+% and added setting of \cs{linepenalty}. (LH)}
+% \begin{macrocode}
+\newenvironment{isyntax}{%
+ \let\\\@centercr
+ \list{}{%
+ \itemsep \z@
+ \itemindent -1.5em%
+ \listparindent \itemindent
+ \advance \leftmargin 1.5em%
+ }%
+ \advance \rightskip \z@\@plus0.7\linewidth \relax
+ \linepenalty=100\relax
+ \item\relax
+}{\endlist}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{obsoletemacro}
+% \changes{2.00}{2000/07/06}{Environment removed since obsolete. (LH)}
+% The \texttt{obsoletemacro} environment is for getting the right
+% heading on |\changes| comments that refer to macros which have been
+% removed. It only updates the |\saved@macroname|.
+% \begin{macrocode}
+% \newenvironment{obsoletemacro}{\begingroup
+% \catcode`\\12
+% \MakePrivateLetters
+% \obsolete@macro
+% }{}
+% \def\obsolete@macro#1{\endgroup
+% \edef\saved@macroname{\string#1}%
+% }
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \section{\texttt{macro}-like environments}
+%
+% This subsection contains the definitions of a couple of environments
+% that, like \package{doc}'s \texttt{environment}, are for marking up the
+% document (what is defined and where). The definitions of these
+% environments are identical to that of \texttt{environment}, except
+% that the index entry texts are a little different.
+%
+% This section got a lot shorter in v\,2.00 thanks to \package{xdoc}.
+%
+% \begin{environment}{fiinteger}
+% \begin{environment}{fistring}
+% \multchanges{\notcs{\texttt{fiinteger} environment}^^A
+% \notcs{\texttt{fistring} environment}}{2.03}{2000/07/24}^^A
+% {Swapped last two arguments of \cs{NewMacroEnvironment} call
+% since \package{xdoc} changed.}
+% \begin{macrocode}
+\NewMacroEnvironment{fiinteger}{\XD@grab@harmless\relax}{1}%
+ {\MacroFont#1 \normalfont integer}%
+ {\XDMainIndex{\levelsorted{#1 I}{\texttt{#1} (integer)}}%
+ \XDMainIndex{\levelsame{integers:}\levelsorted{#1}{\texttt{#1}}}}%
+ {{#1}{\texttt{#1} integer}}{}
+% \end{macrocode}
+% \begin{macrocode}
+\NewMacroEnvironment{fistring}{\XD@grab@harmless\relax}{1}%
+ {\MacroFont#1 \normalfont string}%
+ {\XDMainIndex{\levelsorted{#1 S}{\texttt{#1} (string)}}%
+ \XDMainIndex{\levelsame{strings:}\levelsorted{#1}{\texttt{#1}}}}%
+ {{#1}{\texttt{#1} string}}{}
+% \end{macrocode}
+% \end{environment}\end{environment}
+%
+% \begin{environment}{PLproperty}
+% \changes{2.04}{2000/11/03}{Environment added. (LH)}
+% \changes{2.11}{2001/03/16}{Added \cs{DoNotIndexHarmless}. (LH)}
+% The \texttt{PLproperty} environment is for marking up definitions
+% of macros for interpreting properties in (V)PL files.
+% \begin{macrocode}
+\NewMacroEnvironment{PLproperty}{\XD@grab@harmless\relax}{1}%
+ {\MacroFont#1 \normalfont property}%
+ {\XDMainIndex{\levelsorted{#1}{\texttt{\Bslash#1}}}%
+ \XDMainIndex{%
+ \levelsame{PL properties:}\levelsorted{#1}{\texttt{#1}}%
+ }}%
+ {{#1}{\texttt{\Bslash#1}}}%
+ {\DoNotIndexHarmless{#1}}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{numPLproperty}
+% \changes{2.11}{2001/03/17}{Environment added. (LH)}
+% The \texttt{numPLproperty} environment is for marking up definitions
+% of macros that interpret a numbered family of (V)PL file properties,
+% such as \texttt{NUM} for \texttt{NUM1}, \texttt{NUM2}, and
+% \texttt{NUM3}. The syntax is
+% \begin{quote}
+% |\begin{numPLproperty}|\marg{base}\marg{num-list}
+% \end{quote}
+% In the above case the \meta{base} would be \texttt{NUM}. The
+% \meta{num-list} is a comma-separated list of digits (no existing
+% family of numbered properties have more than 5 members) that
+% specify what members of the family are handled by the macro being
+% defined.
+% \begin{macrocode}
+\NewMacroEnvironment{numPLproperty}{%
+ \XD@grab@harmless\relax\XD@grab@marg
+}{2}%
+ {\MacroFont#1$*$ \normalfont properties}%
+ {\XDMainIndex{\levelsorted{#1}{\texttt{\Bslash#1}}}%
+ \@for\@tempa:=#2\do{%
+ \XDMainIndex{%
+ \levelsame{PL properties:}%
+ \levelsorted{#1\@tempa}{\texttt{#1\@tempa}}%
+ }%
+ }}%
+ {{#1}{\texttt{\Bslash#1}}}%
+ {\DoNotIndexHarmless{#1}}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \multchanges{\notcs{\texttt{switch} environment}}{2.00}{2000/07/06}
+% {Removed since defined in \package{xdoc}. (LH)}
+%
+%
+% \section{Changes of change history formating}
+%
+% \multchanges{\cs{@changes}}{2.00}{2000/07/06}{Redefinition removed
+% since already done in \package{xdoc}. (LH)}
+%
+% \begin{macro}{\multchanges}
+% \changes{1.32}{2000/02/22}{\cs{flushleftspace} between \cs{cs}
+% items when typeset, instead of space. (LH)}
+% \changes{1.34}{2000/03/11}{\cs{notcs} marker allowed in
+% \meta{commands}. (LH)}
+% \changes{2.16}{2003/03/29}{Modified macro so that it is based on
+% \cs{changes@}. This means it is now compatible with \cs{uintver}.
+% (LH)}
+% The |\multchanges| commands is used to record a change to several
+% macros. Its syntax is
+% \begin{quote}
+% |\multchanges|\marg{commands}\marg{version}\marg{date}^^A
+% \marg{description}
+% \end{quote}
+% The three last arguments are as the arguments of |\changes|. The
+% \meta{commands} should be a nonempty sequence of commands, each
+% command either a |\cs| or a |\notcs|, and each command with one
+% argument. The change history entry generated by a
+% |\multchanges| will be for all the macros (or whatever) listed in
+% the first argument. |\cs| items will be typeset in typewriter font
+% with a leading backslash, whereas |\notcs| items will receive no
+% such special formatting.
+%
+% This method may have problems with active characters (since I've
+% ignored some things the standard |\changes| do to accomodate these),
+% but luckily \package{fontinst} hardly uses active characters
+% anyway. Furthermore I don't think the \package{doc} way of dealing
+% with them would be the right way here. Perhaps an active character
+% should rather be entered in the \meta{commands} argument as
+% |\active|\marg{code} or something?
+% \begin{macrocode}
+\newcommand*\multchanges[4]{%
+ \@bsphack
+ \begingroup
+ \begingroup
+ \def\cs##1{,\space##1}%
+ \let\notcs=\cs
+ \protected@xdef\@gtempa{%
+ \expandafter\@gobbletwo#1\@empty\@empty\@empty
+ }%
+ \edef\cs{,\noexpand\flushleftspace
+ \noexpand\protect
+ \expandafter\noexpand\csname cs \endcsname
+ }%
+ \def\notcs##1{,\noexpand\flushleftspace ##1}%
+ \protected@xdef\@gtempa{%
+ {\@gtempa}%
+ {\expandafter\@gobbletwo#1\@empty\@empty\@empty}%
+ }%
+ \endgroup
+ \let\saved@macroname=\@gtempa
+ \changes@{#2}{#3}{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\flushleftspace}
+% The |\flushleftspace| command should typeset something which looks
+% like a space when not broken at, and as an \texttt{3em plus 1fil}
+% space when broken at. It also have to survive its use in
+% |\multchanges|.
+% \changes{1.32}{2000/02/22}{Command added. (LH)}
+% \changes{1.38}{2000/06/05}{Modified finite penalty. (LH)}
+% \begin{macrocode}
+\DeclareRobustCommand\flushleftspace{%
+ \nobreak \hskip 3em\@plus 1fil%
+ \penalty\@m \hskip -3em\@plus -1fil\ %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\labelednumber}
+% This \package{xdoc} macro is redefined to put a ``filbreak''
+% space before every page number labelled with a macro name.
+% \changes{2.16}{2003/03/29}{Redefinition added. (LH)}
+% \begin{macrocode}
+\renewcommand*\labelednumber[2]{%
+ \hskip -1em\@plus -8em%
+ \vadjust{}\hskip 1em\@plus 8em%
+ #2\nolinebreak[2] (#1)%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{theglossary}
+% \begin{macrocode}
+% \ifhave@multicol
+% \renewenvironment{theglossary}{%
+% \begin{multicols}\c@GlossaryColumns
+% [\glossary@prologue][\GlossaryMin]%
+% \GlossaryParms \def\item{\@idxitem v\,}\ignorespaces}%
+% {\end{multicols}}
+% \else
+% \renewenvironment{theglossary}{%
+% \@restonecoltrue\if@twocolumn\@restonecolfalse\fi
+% \columnseprule \z@ \columnsep 35\p@
+% \twocolumn[\glossary@prologue]%
+% \GlossaryParms \def\item{\@idxitem v\,}\ignorespaces}
+% {\if@restonecol\onecolumn\else\clearpage\fi}
+% \fi
+% \end{macrocode}
+%
+% If we want to use the glossary for some other information as well
+% (here I am thinking primarily on collecting |\missing| notices) then
+% perhaps we should insert the |v\,| in |\changes| instead. I would
+% guess the 64 character limit isn't at all as usual as it was when
+% the doc package documentation was written.
+%
+% \begin{macrocode}
+% \renewenvironment{theglossary}{%
+% % \penalty\z@\vskip\GlossaryMin\@plus\z@\@minus\GlossaryMin
+% % \penalty\z@\vskip-\GlossaryMin\@plus\z@\@minus-\GlossaryMin
+% \glossary@prologue
+% \GlossaryParms \let\item\@idxitem \ignorespaces
+% }{\par\bigskip}
+% \end{macrocode}
+% On second thoughts, the changes should be printed in one column.
+% They're usually very hard to linebreak in narrow columns.
+% \end{environment}
+%
+% \begin{macro}{\firstsubsubitem}
+% The idea with |\firstsubsubitem| is that it should be like |\efill|
+% |\subsubitem| if the paragraph is ended by a |\subsubitem| and like
+% \verb*"\ " if it isn't. This is achieved by grabbing the paragraph
+% into a macro and then prepend some suitable material to it when
+% typesetting.
+% \changes{1.36}{2000/04/10}{Grabbing paragraph as list of tokens,
+% rather than typeset text. (LH)}
+% \begin{macrocode}
+% \newcommand\firstsubsubitem{%
+% \begingroup
+% \let\par\@fssi@par
+% \let\subsubitem\@fssi@subsubitem
+% \protected@edef\@tempa{\iffalse}\fi
+% }
+% \end{macrocode}
+% \begin{macrocode}
+% \def\@fssi@subsubitem{%
+% \iffalse{\fi}%
+% \nobreak\hfill\vadjust{\nobreak}%
+% \penalty-\@M\vadjust{\penalty\@m}\nobreak\hskip -5pt\relax
+% \@tempa
+% \endgroup
+% \subsubitem
+% }
+% \end{macrocode}
+% \multchanges{\cs{@fssi@par}}{2000/06/05}{1.38}{Replaced simple space
+% by a more complicated sequence of penalties, vadjusts, and glue,
+% to make it more like \cs{flushleftspace}. (LH)}
+% \begin{macrocode}
+% \def\@fssi@par{%
+% \iffalse{\fi}%
+% \nobreak \hskip \z@ \@plus 0.4\linewidth
+% \vadjust{\nobreak}%
+% \penalty500\hskip \z@ \@plus -0.4\linewidth\hskip 5pt\relax
+% \penalty\z@\ \vadjust{\penalty\@m}%
+% \nobreak\hskip -5pt\relax
+% \@tempa
+% \endgroup
+% \par
+% }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\GlossaryParms}
+% \begin{macrocode}
+% \def\GlossaryParms{%
+% \parindent \z@
+% \columnsep 15pt
+% \parskip 0pt plus 1pt
+% \rightskip 15pt plus 15pt
+% \mathsurround \z@
+% \parfillskip=-\rightskip
+% \pretolerance=\tolerance
+% \small
+% \def\@idxitem{\par\hangindent 30pt v\,}%
+% \def\subitem{\par\hangindent 30pt\hspace*{15pt}}%
+% \def\subsubitem{\par\hangindent 30pt\hspace*{25pt}}%
+% \def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}%
+% }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{instance}{docindex}{changes}
+% \changes{2.10}{2001/02/27}{Redefining it. (LH)}
+% \changes{2.12}{2001/03/25}{Modified in the same way as the
+% \package{docindex} default was with v\,1.00. (LH)}
+% \changes{2.15}{2003/02/19}{Rewrote this redefinition. Something
+% was wrong with the old one, but it seems to have worked to
+% start again from the definition in \package{docindex}. (LH)}
+% \changes{2.16}{2003/03/29}{Added an insertion of `\texttt{v}\cs{,}'
+% to the version number headings. The way it is done is however a
+% hack; I should define a separate instance explicitly instead.
+% (LH)}
+%
+% Typesetting the list of changes is annoyingly slow. It should be
+% examined what takes all that time, but I suspect it is the
+% paragraph breaking (the parameters involved are rather absurd). I
+% suspect that in particular the |\multchanges| complicates things
+% more than they really need to. --- LH, 2004/12/15.
+% \begin{macrocode}
+\setcounter{GlossaryColumns}{1}
+\@namedef{TP@I{}{docindex}{changes}}#1#2{%
+ \begingroup
+ \def\DI@indexitem@i##1##2##3##4{%
+ \UseInstance{indexitem}{fixed1}{##1}{##2}{v\,##3}{##4}%
+ }%
+ \@letinstance\DI@indexitem@ii{indexitem}{fixed-r2a-nocomma}%
+ \@letinstance\DI@indexitem@iii{indexitem}{aloneaccept3}%
+ \columnsep=10pt%
+ \parskip=0pt plus 1pt%
+ \def\DI@letter@skip{\z@skip}%
+ \let\DI@letter@format\@gobble
+ \def\+{-}%
+ \IfFileExists{\jobname.gls}{%
+ \ifnum \c@GlossaryColumns>\@ne
+ \begin{multicols}{\c@GlossaryColumns}[#1][\GlossaryMin]%
+ \else
+ \enough@room{\GlossaryMin}%
+ #1\par
+ \addvspace\multicolsep
+ \fi
+ \small
+ \makeatletter
+ \hbadness=\@M
+ \hfuzz=\maxdimen
+ \pretolerance=\m@ne
+ \tolerance=9999%
+ \emergencystretch=5em
+ \@nobreakfalse
+ \DI@ind@setup
+ \input{\jobname.gls}%
+ \DI@item@nojoin
+ \ifnum \c@GlossaryColumns>\@ne
+ \end{multicols}%
+ \else
+ \enough@room\postmulticols
+ \addvspace\multicolsep
+ \fi
+ \normalsize #2\par
+ }{\typeout{No file \jobname.gls.}}
+ \endgroup
+}
+% \@namedef{TP@I{}{docindex}{changes}}#1#2{%
+% \begingroup
+% \@letinstance\DI@indexitem@i{indexitem}{fixed1}%
+% \@letinstance\DI@indexitem@ii{indexitem}{fixed-r2a-nocomma}%
+% \@letinstance\DI@indexitem@iii{indexitem}{aloneaccept3}%
+% \columnsep=10pt%
+% \parskip=0pt plus 1pt%
+% \def\DI@letter@skip{\z@skip}%
+% \let\DI@letter@format\@gobble
+% % \ifnum \c@GlossaryColumns>\@ne
+% % \begin{multicols}{\c@GlossaryColumns}[#1][\GlossaryMin]%
+% % \else
+% \enough@room{\GlossaryMin}%
+% #1\par
+% \addvspace\multicolsep
+% % \fi
+% \small
+% \emergencystretch=5em
+% \@nobreakfalse
+% \DI@ind@setup
+% \@input@{\jobname.gls}%
+% \DI@item@nojoin
+% % \ifnum \c@GlossaryColumns>\@ne
+% % \end{multicols}%
+% % \else
+% \enough@room\postmulticols
+% \addvspace\multicolsep
+% % \fi
+% \normalsize #2\par
+% \endgroup
+% }
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \section{Hack for removing ``Marginpar moved'' warning messages}
+%
+% Check if the definition matches the known. To be on the safe
+% side, only the known definition will be changed.
+%
+% \begin{macrocode}
+\def\@tempa{\@next\@marbox\@currlist{\@cons\@freelist\@marbox
+ \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
+ \if@twocolumn
+ \if@firstcolumn \@tempcnta\m@ne \fi
+ \else
+ \if@mparswitch
+ \ifodd\c@page \else\@tempcnta\m@ne \fi
+ \fi
+ \if@reversemargin \@tempcnta -\@tempcnta \fi
+ \fi
+ \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi
+ \@tempdima\@mparbottom
+ \advance\@tempdima -\@pageht
+ \advance\@tempdima\ht\@marbox
+ \ifdim\@tempdima >\z@
+ \@latex@warning@no@line {Marginpar on page \thepage\space moved}%
+ \else
+ \@tempdima\z@
+ \fi
+ \global\@mparbottom\@pageht
+ \global\advance\@mparbottom\@tempdima
+ \global\advance\@mparbottom\dp\@marbox
+ \global\advance\@mparbottom\marginparpush
+ \advance\@tempdima -\ht\@marbox
+ \global\setbox \@marbox
+ \vbox {\vskip \@tempdima
+ \box \@marbox}%
+ \global \ht\@marbox \z@
+ \global \dp\@marbox \z@
+ \kern -\@pagedp
+ \nointerlineskip
+ \hb@xt@\columnwidth
+ {\ifnum \@tempcnta >\z@
+ \hskip\columnwidth \hskip\marginparsep
+ \else
+ \hskip -\marginparsep \hskip -\marginparwidth
+ \fi
+ \box\@marbox \hss}%
+ \nointerlineskip
+ \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}}
+\ifx \@addmarginpar\@tempa
+% \end{macrocode}
+% It matched.
+% \begin{macrocode}
+ \def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox
+ \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
+ \if@twocolumn
+ \if@firstcolumn \@tempcnta\m@ne \fi
+ \else
+ \if@mparswitch
+ \ifodd\c@page \else\@tempcnta\m@ne \fi
+ \fi
+ \if@reversemargin \@tempcnta -\@tempcnta \fi
+ \fi
+ \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi
+ \@tempdima\@mparbottom
+ \advance\@tempdima -\@pageht
+ \advance\@tempdima\ht\@marbox
+ \ifdim \@tempdima<\z@ \@tempdima\z@ \fi % Modification
+ \global\@mparbottom\@pageht
+ \global\advance\@mparbottom\@tempdima
+ \global\advance\@mparbottom\dp\@marbox
+ \global\advance\@mparbottom\marginparpush
+ \advance\@tempdima -\ht\@marbox
+ \global\setbox \@marbox
+ \vbox {\vskip \@tempdima
+ \box \@marbox}%
+ \global \ht\@marbox \z@
+ \global \dp\@marbox \z@
+ \kern -\@pagedp
+ \nointerlineskip
+ \hb@xt@\columnwidth
+ {\ifnum \@tempcnta >\z@
+ \hskip\columnwidth \hskip\marginparsep
+ \else
+ \hskip -\marginparsep \hskip -\marginparwidth
+ \fi
+ \box\@marbox \hss}%
+ \nointerlineskip
+ \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}}
+\else
+% \end{macrocode}
+% It didn't match. Inform the user of what is to come.
+% \begin{macrocode}
+ \typeout{Expect a lot of ``Marginpar moved'' warnings.}
+\fi
+\let\@tempa=\relax
+% \end{macrocode}
+%
+%
+% \section{Things not to index}
+%
+% \begin{macrocode}
+\DoNotIndex{\def,\let,\else,\fi,\then,\x_cs,\x_relax}
+\DoNotIndex{\csname,\endcsname,\string,\the,\expandafter,\noexpand}
+\DoNotIndexBy{@@}\DoNotIndexBy{@}\DoNotIndexBy{_}\DoNotIndexBy{FD@}
+% \end{macrocode}
+%
+\endinput
+
diff --git a/fonts/utilities/fontinst/source/fisource.tex b/fonts/utilities/fontinst/source/fisource.tex
new file mode 100644
index 0000000000..39f29a7f17
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fisource.tex
@@ -0,0 +1,3037 @@
+%
+% Copyright 1998, 1999, 2000 the fontinst maintenance team and any
+% individual authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.0 or, at your option, any later version.
+%
+\documentclass{ltxdoc}
+\usepackage[dolayout,fileispart]{fisource}
+
+\usepackage{longtable}
+
+\RecordChanges
+\EnableCrossrefs
+
+\IndexPrologue{%
+ \section*{Index}%
+ \addcontentsline{toc}{section}{Index}%
+ \markboth{Index}{Index}%
+ Compound numbers (numbers with a hyphen) refer to a code line, and
+ the letter that is the first part of such a number specifies the
+ source file the code line is in, as explained by the file key below.
+ Simple numbers refer to pages. Numbers written in italics refer to
+ places where the corresponding entry is described, the ones
+ underlined to where it is defined, and the rest to where it is used.
+}
+\GlossaryPrologue{%
+ \section*{Change History}%
+ \addcontentsline{toc}{section}{Change History}%
+ \markboth{Change History}{Change History}%
+}
+
+
+\makeatletter
+\newcommand{\offindex}{\let\index\@gobble}
+
+\newcommand{\consumption}{%
+ \begingroup
+ \endlinechar=`\&\relax
+ \expandafter\endgroup\consumption@i
+}
+\def\consumption@i#1#2{%
+ \ifhmode{\parskip=\z@\@plus\p@\relax\par}\fi
+ Time elapsed: #1\,s\par
+ \tabskip=\leftmargin \advance \tabskip 1em\relax
+ \halign{&\hfil##\ \tabskip=\z@skip&##\hfil\tabskip=1em\cr
+ \omit\span \textbf{Stacks}&\omit\span \textbf{Others}\cr
+ \consumption@ii#2\@nil
+ }%
+}
+% #1 = number of strings used
+% #3 = string characters used
+% #5 = words of memory used
+% #7 = number of multiletter control sequences used
+% Other parameters are garbage.
+\def\consumption@ii#1 #2&#3 #4&#5 #6&#7 #8&#9&{%
+ \consumption@iii{{#1}{#3}}{{#5}{#7}}%
+}
+\def\consumption@iii#1#2#3&#4i,#5n,#6p,#7b,#8s#9\@nil{%
+ #4& input sources& \@secondoftwo#2& multiletter control
+ sequences\cr
+ #6& parameters& \@firstoftwo#1& strings\cr
+ #7& buffer characters& \@secondoftwo#1& string characters\cr
+ #8& saved values& \@firstoftwo#2& main memory words\cr
+}
+\makeatother
+
+\newenvironment{smalldes}{%
+ \list{}{%
+ \setlength\labelwidth{0pt}%
+ \setlength\itemindent{-\leftmargin}%
+ \setlength\listparindent{1em}%
+ \setlength\parsep{0pt}%
+ \setlength\itemsep{0pt plus 1pt}%
+ \setlength\topsep{\itemsep}%
+ \let\makelabel\descriptionlabel
+ }%
+}{\endlist}
+
+% \includeonly{}
+\iffalse
+\MakeShortVerb{\|}
+\fi
+
+\title{The \package{fontinst} utility}
+\author{Alan Jeffrey\and David Carlisle\and Sebastian Rahtz\and
+ Ulrik Vieth\and Lars Hellstr\"om}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\clearpage
+
+\part*{About the \package{fontinst} package}
+\addcontentsline{toc}{part}{The \package{fontinst} documentation}
+
+This document implements and describes version~1.9 of
+\package{fontinst}.
+
+
+
+\section{Files}
+
+\subsection{Source files}
+
+The source for \package{fontinst} is currently split on the seven
+source files \texttt{fibasics.dtx} (basic \TeX\ initialisation and
+hackery), \texttt{ficommon.dtx} (commands for variables, integer
+expressions, and the like), \texttt{fimain.dtx} (actually making
+fonts), \texttt{fitrig.dtx} (trigonometry), \texttt{ficonv.dtx}
+(conversions between file formats, font transformations),
+\texttt{filtfam.dtx} (the \cs{latinfamily} command), and
+\texttt{fimapgen.dtx} (mapfile generation).
+
+
+\subsection{Generated files}
+
+By running the \package{docstrip} installation script
+\texttt{fontinst.ins}, the following files are generated:
+\begin{description}
+ \item[\texttt{fontinst.sty}] This is the executable file that
+ contains all the commands that set up the \package{fontinst}
+ utility for use.
+ \item[\texttt{xfntinst.sty}] This is a variant of
+ \texttt{fontinst.sty} in which the |\latin|\-|family| command
+ behaves differently with respect to from which fonts the digits
+ are picked (see below).
+ \item[\texttt{cfntinst.sty}] This is a variant of
+ \texttt{fontinst.sty} which supports the old way of selecting
+ boundarychar for fonts (i.e., by setting the integer
+ |boundarychar|). It requires a bit more memory than
+ \texttt{fontinst.sty} does.
+ \item[\texttt{fontinst.ini}] This file contains some very basic
+ initialization code. It is used in case \package{fontinst} is used
+ under ini\TeX\ without a preloaded format.
+ \item[\texttt{finstmsc.sty}] This file contains the routines for
+ automatic map file generation, which can now generate map files
+ for the \package{dvips} and \package{dvipdfm} drivers. The system
+ is extendable, so users interested in generating map files for
+ other drivers can extend the mapfile writer's capabilities by
+ adding code to their \texttt{finstmsc.rc} files. \emph{Contributions
+ of such code is welcome}. This file also contains some seldom-used
+ code (the ENC to ETX conversion) that has been broken off from
+ the main \package{fontinst} utility, as it almost always just sat
+ there and used up space for no good reason.
+ \item[\texttt{fontdoc.sty}] This file contains the \package{fontdoc}
+ package, which can be used to typeset encoding and metric files.
+ \item[\texttt{csc2x.tex}] This file contains the reglyphing commands
+ that set up the common caps-and-small-caps to expert names
+ conversion. See Subsections~\ref{Ssec:Des:Reglyph}
+ and~\ref{Ssec:Reglyph} for details.
+ \item[\texttt{csckrn2x.tex}] This file is a variant of
+ \texttt{csc2x.tex}, which doesn't copy the commands that actually
+ set glyphs.
+ \item[\texttt{osf2x.tex}] This file is a variant of
+ \texttt{csc2x.tex}, which only changes the names of digits.
+\end{description}
+
+\changes{1.914}{2000/05/14}{Generating \texttt{trig.sty} from
+ source. (LH)}
+
+
+\subsection{Modules}
+
+The source is split up on the following \package{docstrip} modules:
+\begin{description}
+ \item[\Module{boundaryCompability}, \texttt{fimain}]
+ Guards code that is needed for \package{fontinst} to be compatible
+ with the old interface for boundary ligatures and kerns.
+ \item[\Module{!boundaryCompability}, \texttt{fimain}]
+ Guards code that is used when \package{fontinst} is not to be
+ compatible with the old interface for boundary ligatures and kerns.
+ \item[\Module{debug}, \texttt{filtfam}]
+ Guards code in the |\latinfamily| section that writes \texttt{INFO>}
+ messages.
+ \item[\Module{doc}, \texttt{fibasics}, \texttt{ficommon},
+ \texttt{fimain}, and \texttt{fimapgen}]
+ Guards code that is to go into \texttt{fontdoc.sty}.
+ \item[\Module{driver}, all files]
+ Guards the driver code---the short piece of \LaTeX\ code in the
+ beginning of each file that makes it possible to typeset as a
+ \LaTeX\ document. \texttt{docstrip.ins} doesn't extract this
+ code, but it is possible to write a script that makes
+ \package{docstrip} extract this code if one wants to write a
+ modified driver. It's not usual, though.
+ \item[\Module{everyjob}, \texttt{fibasics}]
+ Guards the code setting |\everyjob| for fontinst formats (by
+ default not used).
+ \item[\Module{!glyphs}, \texttt{ficonv}]
+ Guards reglyphing setup code that is relevant when commands that
+ set glyphs are not to be copied.
+ \item[\Module{glyphs}, \texttt{ficonv}]
+ Guards reglyphing setup code that is relevant when commands that
+ set glyphs are to be copied.
+ \item[\Module{ini}, \texttt{fibasics}]
+ Guards the code for \texttt{fontinst.ini}.
+ \item[\Module{map}, \texttt{fimapgen}]
+ Guards the code for the automatic map file generation.
+ \item[\Module{misc}, \texttt{fibasics}, \texttt{fimain}, and
+ \texttt{ficonv}]
+ Guards code that is only to go into \texttt{finstmsc.sty}.
+ \item[\Module{!misc}, \texttt{fibasics}]
+ Guards code that is not to go into \texttt{finstmsc.sty}.
+ \item[\Module{obsolete}, \texttt{ficommon} and \texttt{fimain}]
+ Guards miscellaneous pieces of code that are considered obsolete.
+ \item[\Module{oldstyle}, \texttt{filtfam}]
+ Guards code in the |\latinfamily| section. The purpose of that
+ code is described in more detail in Section~\ref{Sec:NotesOnUsing}.
+ \item[\Module{oldTeX}, \texttt{fibasics}]
+ Guards code that copes with a bug in \TeX\ versions before 3.141.
+ \item[\Module{!oldTeX}, \texttt{fibasics}]
+ Guards normal code that wouldn't work satisfactory for
+ \TeX\ versions before 3.141 due to a bug in those \TeX s.
+ \item[\Module{pkg}, all files]
+ Guards code that is to go into \texttt{fontinst.sty} (and its
+ variants).
+ \item[\Module{pkg2}, \texttt{fibasics}]
+ A special variant of \Module{pkg} that is used for code that is
+ to end up at the very end of \texttt{fontinst.sty}.
+ \item[\Module{reglyphletters}, \texttt{ficonv}]
+ Guards code that sets up for changing lower case letter names to
+ corresponding smallcaps names. Used for \texttt{csc2x.tex} and
+ \texttt{csckrn2x.tex}.
+ \item[\Module{reglyphfigures}, \texttt{ficonv}]
+ Guards code that sets up for changing ordinary figure names to
+ corresponding \texttt{oldstyle} names. Used for
+ \texttt{osf2x.tex}, \texttt{csc2x.tex}, and
+ \texttt{csckrn2x.tex}.
+ \item[\Module{reglyph}, \texttt{ficonv}]
+ Guards code that is to go to the reglyphing setup files
+ \texttt{csc2x.tex} and \texttt{csckrn2x.tex}.
+ \item[\Module{textcomp}, \texttt{filtfam}]
+ Guards code in the |\latinfamily| section that generates text symbol
+ (\texttt{TS1}\slash ``text companion'') fonts.
+ \item[\Module{underconstruction}, \texttt{fimain}]
+ Guards some code that is ``under construction''.
+\end{description}
+
+
+
+\section{About previous \package{fontinst} releases}
+
+\subsection{Pre-\package{doc} fontinst releases}
+
+The following is a choice of some \package{fontinst} versions and some
+comments about them. The complete list of versions in the range
+v\,0.01--1.7 can be found in the file \texttt{CHANGES}.
+\begin{description}
+\item[v\,0.01]
+ was begun by Alan Jeffrey in February 1993. This was the
+ very first version recorded in the \texttt{CHANGES} file.
+%
+\item[v\,0.19]
+ was completed in April 1993 and presented at the TUG~'93
+ conference in July 1993. It is described in the proceedings
+ in \emph{TUGboat}~14\#3 and represents one of the earliest
+ release versions, in which the user interface was still
+ subject to change.
+%
+\item[v\,1.0]
+ was begun in August 1993 right after the conference and
+ represents the beginning of a complete re-write from scratch.
+%
+\item[v\,1.333]
+ was presented one year later at the TUG~'94 conference and
+ is described in the proceedings in \emph{TUGboat}~15\#3.
+ It uses a different user interface, which is largely the same
+ as in the present version, although the internals of the
+ implementation have subsequently changed quite a bit.
+%
+\item[v\,1.335]
+ was released in September 1994 and was the last ``official''
+ release version by Alan Jeffrey. Until the summer of 1998 this was
+ still the version to be found in the \texttt{fonts}\slash
+ \texttt{utilities}\slash\texttt{fontinst} directory on CTAN.
+ It is considered obsolete and should not be used any longer.
+%
+\item[v\,1.400]
+ was prepared in November 1994 and was the first version which
+ used |8r|-encoded raw fonts as a basis for virtual fonts.
+%
+\item[v\,1.500]
+ appeared on CTAN in \texttt{fonts}\slash\texttt{psfonts}\slash
+ \texttt{tools} in September~1995 together with Sebastian Rahtz's
+ Unix shell scripts to automate the installation. This version
+ included a completely revised implementation of |\latinfamily| and
+ added the |\installrawfont| command to install ligful raw fonts.
+%
+\item[v\,1.504]
+ appeared on CTAN in \texttt{fonts}\slash\texttt{psfonts}\slash
+ \texttt{tools} in January~1996. It added code to install (real or
+ faked) small caps fonts and to fake narrow fonts, if they don't
+ exist.
+%
+\item[v\,1.511]
+ was one of the last beta versions by Alan Jeffrey which dates back
+ to June~1996, but for some reason was never released. It uses
+ the encodings |9o| and~|9d| instead of |9t| and~|9e| to install
+ expertized oldstyle fonts, but this change never found its way
+ into subsequent ``unofficial'' releases until v\,1.8.
+%
+\item[v\,1.6]
+ appeared on CTAN in \texttt{fonts}\slash\texttt{psfonts}\slash
+ \texttt{tools} in February~1997 and was the first ``unofficial''
+ version of \package{fontinst} maintained by Sebastian Rahtz. It
+ contains only minor changes compared to v\,1.504, such as switching
+ to lowercase file names, searching for |.pl| files before |.afm|
+ files, and adding the \texttt{textcomp} installation to the
+ distribution.
+%
+\item[v\,1.6]
+ was re-issued on CTAN in September~1997, when the Unix shell
+ scripts were replaced by Perl scripts. The \package{fontinst}
+ package itself didn't change apart from minor changes of the
+ debugging messages.
+%
+\item[v\,1.7]
+ is the latest ``unofficial version'', which was released on CTAN
+ in May~1998. It includes some changes to the mapping between
+ \texttt{fontname} and \LaTeX{} weight codes proposed by Ulrik
+ Vieth, as well as some code to support the use of |8r|-encoded
+ |.afm| files generated by |ttf2afm|.
+%
+\end{description}
+%
+
+\subsection{About fontinst v\,1.8}
+
+Version~1.8 of the \package{fontinst} utility was the first to have
+been converted to \package{docstrip} format (this was made by Ulrik
+Vieth) and it was first released in June~1998. It is based on
+Sebastian Rahtz's ``unofficial'' \package{fontinst} releases v\,1.6
+and~1.7 as of February~1997 and May~1998, which, in turn, are based
+on Alan Jeffrey's versions v\,1.500 and~1.504 of September~1995
+and January~1996. In addition, version v\,1.8 also incorporated
+some code from Alan Jeffrey's last beta version, v\,1.511,
+which dates back to June~1996, but was never released to the
+general public for some reason.
+
+% It should be noted that all these versions differ significantly
+% from the previous ``official'' version v\,1.335 as of September~1994,
+% which was the only one to be found in the \texttt{fontinst} directory
+% on CTAN until the summer of 1998. Version v\,1.335 is now obsolete.
+
+Version~1.8 was agreed upon by the \package{fontinst} hacker community,
+as represented on the \package{fontinst} mailing list, as the new
+officially endorsed version, on which all further additions and
+enhancements can be based.
+
+
+\section{About this \package{fontinst} release}
+
+Versions 1.9xx of \package{fontinst} represent a more-or-less
+continuous evolution from 1999 to the present. Several improvements,
+the extents of which are perhaps not clearly represented in the version
+number increments, have been made in this series---sometimes as fixes
+to old bugs, but more often to introduce new features. The most
+important are:
+\begin{itemize}
+ \item The old multiple |\setkern| bug, which resulted in pointless
+ |KRN| instructions being written to (V)PL files have been fixed.
+ In addition, it is now possible to reset kerns (using
+ |\resetkern|) and unset kerns (using |\unsetkerns|,
+ |\noleftkerning|, |\norightkerning|, or |\noleftrightkerning|).
+ \item A bug which resulted in too few kerns being written to a font
+ if the same glyph is used in more than one slot (this occurs if
+ you make an all-caps font from an encoding definition file which
+ sets |\lc|, |\lctop|, and |\lclig| to the same to their
+ |\uc|\textellipsis\ counterparts) has been fixed. A consequence of
+ this fix is that you cannot access the number of the slot that
+ glyph \meta{glyph} has been assigned to as |\int|\marg{glyph}
+ (unless you are using \texttt{cfntinst.sty}), but there really is
+ no need for you to do so either.
+ \item There is now a proper interface for using left and right
+ boundaries which, in contrast to the old setting of the integer
+ \texttt{boundarychar}, can make use of the full generality of the
+ PL format. (The old interface is still available if you use
+ \texttt{cfntinst.sty}.)
+ \item \package{fontinst} can now interpret AFM files which contain
+ non-integer dimensions. There is also a user-level interface for
+ changing the formula according to which the italic corrections of
+ glyphs are computed.
+ \item The PL to MTX converter can now cope with the VPL-unique
+ property lists |VTITLE|, |MAP|, and |MAPFONT|, which means that it
+ can now convert VPL files as well. In addition to this, there are
+ a couple of minor bugfixes and improvements in the PL to MTX
+ conversion.
+ \item There is now a way of overriding the PL to MTX converter's
+ automatic choice of encoding definition file made based on the
+ |CODINGSCHEME| property of a PL file. The command |\generalpltomtx|
+ lets you select which encoding definition file you want to use, as
+ does the new |\fromplgivenetx| transformed font command.
+ \item Several \package{fontinst} commands that were previously
+ missing have been added to the \package{fontdoc} package. The
+ most significant are probably |\inputmtx| and |\inputetx|.
+ \item There is now a way of automatically changing the names of
+ glyphs in metric files generated from AFM files.
+ % See Subsection~\ref{Ssec:Reglyph} for further details.
+ \item The implementation of font metrics transformations, as done by
+ |\transformfont|, has been rewritten and \package{fontinst} now
+ handles uniform scaling internally; the driver only needs to do
+ $x$-scaling and slanting. This can result in different font metrics,
+ but we think only in that it comes out more like one would expect.
+ The user interface is the same.
+ \item There is now a new transformed font command |\fromany| which
+ searches for a font metric file in any of the four formats MTX,
+ PL, AFM, and VPL; converting it to MTX format and possibly
+ generating a PL as well if necessary. This command is also used by
+ |\installfont|, |\installrawfont|, and |\reglyphfont| to search
+ for font metric files, so these can now take VPL files as a
+ source for font metric data.
+ \item There is now a mechanism for generating the necessary map files
+ automatically. So far it knows how to generate map files for the
+ \package{dvips} and \package{dvipdfm} drivers, but the system can
+ easily be extended by adding code in the \texttt{finstmsc.rc} file.
+ \item There are two new commands |\setscaled|\-|rawglyph| and
+ |\setscaled|\-|notglyph| which generalize the |\setraw|\-|glyph|
+ and |\setnot|\-|glyph| commands. These commands are described in
+ Subsection~\ref{Ssec:Glyph-info}.
+ \item The routines for converting metrics to (V)PL format have
+ changed. As a result of this the metrics of fonts are likely to
+ change (slightly), but the conversion is now more accurate than it
+ used to be. A side-effect is that VPL files generated by
+ \package{fontinst} can now be used directly as a base for other
+ fonts (it used to be necessary to convert them to binary format and
+ back to get the metrics right).
+ \item \texttt{finstmsc.sty} now contains a new command which
+ generates a Postscript encoding (\texttt{.enc}) file from an ETX
+ file. The syntax of this command is
+ \begin{quote}
+ |\etxtoenc|\marg{etxfile}\marg{encfile}
+ \end{quote}
+ Usually you don't need to use this command, since the routines
+ which generate map files will call it when the encoding used in a
+ |\reencodefont| isn't known.
+ \item The new command
+ \begin{isyntax}
+ |\installfontas|\marg{font}\marg{encoding}\marg{family}%
+ \penalty0\marg{series}\penalty0\marg{shape}\penalty0\marg{size}
+ \end{isyntax}
+ adds an entry for \meta{font} with the given NFSS parameters to
+ the corresponding FD file.
+ \item The |\set|\textellipsis, |\reset|\textellipsis, and
+ |\unset|\textellipsis\ commands now behaves as one would expect
+ even when they occur between |\install|\-|fonts| and |\end|\-%
+ |install|\-|fonts|---the assignments they make are no longer
+ subject to the grouping around the metrics of individual fonts.
+ Assignments made by these commands when they occur in MTX and ETX
+ files \emph{are} however still subject to this grouping, so that
+ behaves as usual.
+ \item There are two control flow commands |\for| and |\foreach|
+ which repeatedly execute a given sequence of commands---just like
+ a normal programming language \texttt{for} loop. With |\for| the
+ loop variable is an integer that is incremented or decremented by
+ an amount that is specified in the beginning of the loop. With
+ |\foreach| the loop variable is a string which assumes all the
+ values given in a comma-separated list.
+ \item The command |\offcommand| turns a command `off', i.e., makes
+ it gobble its arguments and do nothing. The command |\oncommand|
+ turns a command back on, i.e., restores the original definition of
+ a command that had been turned off. Turning a command off or on
+ when it is already off or on respectively has no effect.
+ \item If you begin an item in the file-list argument (\#2) of
+ |\install|\-|font| or |\install|\-|raw|\-|font| with the command
+ |\metrics|, then that item (everything up till the next comma
+ that is not inside a group) will be interpreted as explicit metric
+ commands that are executed after the previous font was loaded and
+ before the next is. Thus you can do e.g.
+ \begin{quote}
+ |\installfont{|\textellipsis|}{a,\metrics\unsetint{xheight},b,|%
+ \textellipsis
+ \end{quote}
+ if you want font \texttt{a} to be loaded before font \texttt{b},
+ but want to use the \texttt{xheight} value of font \texttt{b},
+ and you don't want to bother writing an MTX file that simply
+ contains the command |\unsetint{xheight}|.
+ \item There is now a command |\fontinstcc| which switches to the
+ catcodes that are in force for most of the time that
+ \texttt{fontinst.sty} is read (|@| and |_| are letters, |~| is a
+ space, and spaces and newlines are ignored). This makes it simpler
+ to redefine internal control sequences. To switch back to the
+ normal catcodes, there is the |\normalcc| command. Neither
+ command has any arguments.
+ \item The |\Unicode| command may be used to specify what
+ ISO\,10646\slash Unicode character a slot corresponds to. See
+ page~\pageref{Unicode} for details.
+ \item The third arguments of the |\installfont| and
+ |\install|\-|raw|\-|font| commands can now be a comma-separated
+ list of ETX files.
+ \item File names in the second and third arguments of
+ |\install|\-|font| and |\install|\-|raw|\-|font| may now be
+ suffixed by zero or more \emph{modifier clauses} that can change
+ the interpretation of a file by e.g.~assigning special values to
+ some variables while the file is read in. This is described in
+ Subsection~\ref{Ssec:FontInstCmds} below.
+ \item The |\setfontdimen| command allows an ETX file to declare
+ which integer variables correspond to font dimensions in a (V)PL
+ file. This correspondence is used both when generating a ligful
+ (V)PL file and when a (V)PL file is converted to an MTX file.
+ \item \texttt{finstmsc.sty} now contains a new command which
+ generates a ToUnicode CMap file from an ETX file. The syntax of
+ this command is
+ \begin{quote}
+ |\etxtocmap|\marg{etxfile}\marg{cmapfile}
+ \end{quote}
+ \item Unicode equivalents of slots need no longer be single
+ characters. To specify a multiple-character equivalent of a
+ slot, use the |\charseq| command and place the individual
+ characters as |\Unicode| commands in its arguments. For a
+ \texttt{fi} slot, one would say
+ \begin{quote}
+ |\charseq{|\\
+ | \Unicode{0066}{LATIN SMALL LETTER F}|\\
+ | \Unicode{0069}{LATIN SMALL LETTER I}|\\
+ |}|
+ \end{quote}
+ \item
+ There are now three `actions' for files needed for a font:
+ |\download|, |\fulldownload|, and |\encodingdownload|;
+ corresponding to the prefixes |<|, |<<|, and |<[| respectively
+ in a \package{dvips} map file.
+ \item
+ There is a documented way of turning off default substitutions:
+ Make a |\substitutesilent| or |\substitutenoisy| with the
+ \meta{from} argument also as \meta{to}.
+ \item
+ When ETX files are generated using |\enctoetx| then the original
+ encoding names (as PS object and as file) are recorded and this
+ information is made available to the map file writer when
+ necessary.
+\end{itemize}
+
+
+\subsection{Metric packages}
+
+\package{fontinst} has traditionally come with a collection of MTX
+files that complement the MTX files generated from base font metrics,
+in that they build glyphs that may be missing from the base fonts or
+in some other way needs to be improved. The most well-known of these
+is the \texttt{latin.mtx} file; other examples include
+\texttt{textcomp.mtx}, \texttt{mathit.mtx}, and \texttt{latinsc.mtx}.
+A problem with these is however that they cannot produce optimal
+results for all fonts simply because there are irregular differences
+in how fonts are set up by the foundries. Most glyphs come out alright,
+but there are usually a few for which the parameters used are more or
+less wrong. Therefore most high quality font installations are made
+with modified versions of these files, where the parameters have been
+tuned to the specific font design.
+
+Modifying in particular \texttt{latin.mtx} is however not an entirely
+easy task, because this is a rather large file (with plenty of
+archaic pieces of code in curious places). Doing it once is no big
+problem, but if one has to do it several times (maybe because some
+errors are discovered in the original \texttt{latin.mtx}) then it is
+probably no fun anymore. Furthermore, if one has two or three
+modified copies of this file because one has made high quality
+installations of that many different fonts then even a trivial bugfix
+might start to feel like entirely too much work.
+
+If one has to make modifications then it is usually easier to deal
+with several small files (many of which can be used unchanged) than
+one big file. Thus it would be better if these big files were split up
+into several smaller ones.
+The main problem with splitting up something like \texttt{latin.mtx}
+is that there are some commands which are defined at the top and
+which are then used in almost all sections of the file. One must make
+certain that these commands are always loaded, which makes the metric
+files somewhat harder to use (especially if the one who tries to use
+them is not the one who wrote them).
+
+One strategy is to include all definitions needed for a metric file in
+it. This has the slight disadvantage that the commands will have to be
+defined several times. What is worse however, is that the command
+definitions will appear in several files, so if one finds a bug in one
+of them, one cannot simply correct this bug in one place. As the number
+of files can soon become quite large, correcting such bugs can become
+a boring procedure indeed.
+
+Another strategy is to put all the command definitions in one file
+and then explicitly include it in the \meta{file-list} argument of
+|\installfont|. This eliminates the repeated bug fixing problem, but
+requires the user to do something that the computer can actually do
+just as well.
+
+A third strategy is to put the command definitions in one or several
+files and then in each metric file the user explicitly mentions load
+the command definitions needed for that particular file. Metric
+packages uses an improved version of this strategy, since they also
+make it possible for fontinst to remember which packages (i.e., sets
+of command definitions) that have already been loaded, so that they
+are not unnecessarily loaded again. The \texttt{newlatin.mtx} file is
+an alternative to \texttt{latin.mtx} that implements this strategy.
+Most of the actual code is located in the following metric packages:
+\begin{longtable}{l p{0.7\linewidth}}
+ \texttt{ltcmds.mtx}& Defines some common commands used by the other
+ files.\\
+ \texttt{llbuild.mtx}& Builds the latin lower case alphabet
+ (unaccented letters are `unfakable', the rest are constructed if
+ not present in the base fonts).\\
+ \texttt{lubuild.mtx}& Builds the latin upper case alphabet.\\
+ \texttt{lsbuild.mtx}& Builds accented letters in the latin
+ smallcaps alphabet, but only if there are unaccented letters to
+ build them from in the base fonts.\\
+ \texttt{lsfake.mtx}& Fakes a latin smallcaps alphabet by shrinking
+ the upper case alphabet, but only if the glyph had not already
+ been manufactured.\\
+ \texttt{lsmisc.mtx}& Make some miscellaneous smallcaps glyphs
+ (mostly ``smallcaps f-ligatures'').\\
+ \texttt{ltpunct.mtx}& Makes digits, punctuation marks, and other
+ symbols (mostly by marking as ``unfakable'').
+\end{longtable}
+\noindent All of these are easy to use as components of equivalents
+of a modified \texttt{latin.mtx} files, and all dependencies of one
+package upon another are handled via explicit |\usemtxpackage|
+commands.
+
+For information on the syntax etcetera of commands related to metric
+packages, see Section~\ref{Sec:Metric files}.
+
+
+\subsection{Word boundary ligatures and kerns}
+
+One of the new features added in \TeX~3 was that of ligatures and
+kerns with word boundaries.\footnote{For purposes of ligatures and
+kerning, a `word' is a consecutive string of characters from a
+single font. These words thus typically include punctuation marks,
+unlike the `words' considered in hyphenation.}
+\package{fontinst} has had an interface
+for making such ligatures and kerns, but it has been completely
+redesigned in v\,1.9 and the old interface (setting the integer
+|boundarychar|) is no longer recognized by \package{fontinst}. Files
+which use the old interface can still be processed with
+\texttt{cfntinst.sty}, though.
+
+Before considering the new commands, it is suitable to define the
+concepts of proper glyph and pseudoglyph. A \emph{proper glyph} has
+been set using one of the commands |\setrawglyph|,
+|\set|\-|scaled|\-|raw|\-|glyph|, |\setglyph|, and
+|\reset|\-|glyph|. A pseudoglyph is any name used in the context of a
+glyph name which does not denote a proper glyph. If a pseudoglyph
+|g-not| was set using the |\setnotglyph| command, then
+|\ifisglyph{g-not}\then| will evaluate to true, but something can be
+a pseudoglyph even if an |\ifisglyph| test evaluates to false. The
+interesting point about pseudoglyphs when considering word boundaries
+however, is that a pseudoglyph can have ligatures and kerns.
+
+Kerns and ligatures at the left word boundary (beginning of word) are
+specified using the commands |\setleftboundary| and
+|\endsetleftboundary|, which are syntactically identical to
+|\setslot| and |\endsetslot| respectively. One important difference is
+however that the argument to |\setslot| must be a proper glyph, while
+the argument to |\setleftboundary| may be any glyph, hence a
+pseudoglyph will do just fine.
+
+|\ligature| commands between |\setleftboundary| and
+|\endsetleftboundary| will generate beginning of word ligatures. Kerns
+on the right of the glyph specified in |\setleftboundary| will become
+beginning of word kerns.
+
+Kerns and ligatures at the right word boundary (end of word) are
+trickier, due to the asymmetrical nature of the ligkern table in a PL
+file. What a font can do is to specify that the right word boundary,
+for purposes of kerning and ligatures, should be interpreted as
+character $n$. By including a kern or ligature with character $n$ on
+the right, that kern or ligature will be used at the end of a word,
+but it will also be used each time the next character is character
+$n$. Because of this, one usually wants the slot $n$, which the right
+word boundary is interpreted as being, to be empty whenever the
+encoding allows this.
+
+The command
+\begin{quote}
+ |\setrightboundary|\marg{glyph}
+\end{quote}
+will mark the current slot as used to denote the right word boundary,
+and leave the slot empty, increasing the current slot number by one
+just like a |\setslot| \textellipsis\ |\endsetslot| block does. Kerns on
+the left of \meta{glyph} will be end of word kerns and |\ligature|
+commands with \meta{glyph} as the second argument will be for the end
+of a word.
+
+The command
+\begin{quote}
+ |\makerightboundary|\marg{glyph}
+\end{quote}
+is similar to |\setrightboundary|, but it is a slot command which may
+only be used between a |\setslot| and the matching |\endsetslot|. Like
+|\setrightboundary|, it marks the current slot as used to denote the
+right word boundary, but the glyph specified in the enclosing |\setslot|
+will be written to that slot. Ligatures for the glyph specified by the
+|\setslot| and ligatures for the glyph specified by the
+|\makerightboundary| will both be for this single slot. Kerns on the
+right of the |\setslot| glyph and the |\makerightboundary| glyph will
+similarly both be for this single slot. The idea is that the |\setslot|
+glyph should be used when making a kern or ligature for that glyph,
+while the |\makerightboundary| glyph should be used when making a kern
+or ligature for the end of a word. \package{fontinst} will warn you if
+these two uses of the slot directly contradict each other.
+
+
+\subsection{Changing the names of glyphs}
+\label{Ssec:Des:Reglyph}
+
+Sometimes, primarily when making a virtual font from more than one raw
+font and two of the raw fonts contain different glyphs with the same
+name, it becomes necessary to change the names of some glyphs to make
+some sense out of it. The main source of this kind of trouble is the
+``caps and small caps'' (SC) and ``oldstyle figures'' (OsF) fonts
+within many commercial font families. The typical problem is that what
+is typographically different glyphs---such as the lowercase `a'
+(\texttt{a}, for \package{fontinst}) and the smallcaps `\textsc{a}'
+(\texttt{Asmall}, for \package{fontinst})---are given the same name by
+the foundry.
+
+One way to get round this is to say for example
+\begin{quote}
+ |\setglyph{Asmall} \glyph{a}{1000} \endsetglyph|\\
+ |\setleftrightkerning{Asmall}{a}{1000}|\\
+ |\unsetglyph{a}|\\
+ |\noleftrightkerning{a}|
+\end{quote}
+and continuing like that for all the duplicate glyph names. This is
+however a rather prolix method and if the number of glyphs is large
+then it is usually simpler to use the |\reglyphfont| command.
+
+To reglyph one or several fonts, one writes
+\begin{quote}
+ |\reglyphfonts|\\
+ \vadjust{}\quad \meta{reglyphing commands}\\
+ |\endreglyphfonts|
+\end{quote}
+There are two types of reglyphing commands: the |\reglyphfont|
+command, and the commands that modify what |\reglyphfont| will do to
+the fonts it operates on. The syntax of |\reglyphfont| is
+\begin{quote}
+ |\reglyphfont|\marg{destination font}\marg{source font}
+\end{quote}
+The \meta{source font} font here is the name (suffix not included, of
+course) of the font metric file one wants to change the glyph names in.
+This font metric file can be in any of the formats MTX, PL, AFM, and
+VPL, and it will be converted to MTX format if it isn't already in
+that format (this happens just as for files listed in the second
+argument of |\installfont|). \meta{destination font} (which must be
+different from \meta{source font}) will be taken as the name for a
+new \texttt{.mtx} file that will be generated. The destination font
+can differ from the source font only in two ways: the names of some
+glyphs in the source font might be changed, and some of the commands
+from the source font might not have been copied to the destination
+font. To what extent the fonts are different is determined by what
+modifying commands have been executed; when no modifying commands
+have been executed, the source and destination font are equal.
+
+The modifying reglyphing commands are
+\begin{quote}
+ |\renameglyph|\marg{to}\marg{from}\\
+ |\renameglyphweighted|\marg{to}\marg{from}\marg{weight}\\
+ |\killglyph|\marg{glyph}\\
+ |\killglyphweighted|\marg{glyph}\marg{weight}\\
+ |\offmtxcommand|\marg{command}\\
+ |\onmtxcommand|\marg{command}
+\end{quote}
+|\renameglyph| simply declares that occurrences of the glyph name
+\meta{from} should be replaced by the glyph name \meta{to}. To each
+glyph name is also assigned a \emph{weight}, which is used by a
+mechanism which conditions copying of commands from the source font to
+the destination font by the set of glyphs that command mentions. The
+details of this mechanism are however somewhat tricky, so those
+interested in the full generality should go to Subsection~\ref
+{Ssec:Reglyph}. Here it needs only be noted that if one applies
+|\killglyph| to a glyph name, then (under most circumstances) commands
+that refer to that glyph name will not be copied to the destination
+font.
+
+|\offmtxcommand| and |\onmtxcommand| also control whether commands are
+copied to the destination font, but they look at the actual command
+rather than the glyphs it refers to. For example, after the command
+\begin{quote}
+ |\offmtxcommand{\setkern}|
+\end{quote}
+no |\setkern| commands will be copied. By using |\offmtxcommand|, it
+is possible to achieve effects similar to those of the files
+\texttt{kernoff.mtx} and \texttt{glyphoff.mtx}---the difference is
+that with |\offmtxcommand|, it happens at an earlier stage of the font
+generation. As expected, |\onmtxcommand| undoes the effect of
+|\offmtxcommand|.
+
+A special rule pertains to the |\set|\-|raw|\-|glyph|,
+|\set|\-|not|\-|glyph|, |\set|\-|scaled|\-|raw|\-|glyph|, and
+|\set|\-|scaled|\-|not|\-|glyph| commands, since |\transformfont|
+doesn't care what something was in the source font when it generates
+the transformed font. To turn these commands off while reglyphing,
+you use |\offmtx|\-|command| on |\set|\-|scaled|\-|raw|\-|glyph|.
+
+The effects of modifying reglyphing commands are delimited by
+|\reglyphfonts| and |\endreglyphfonts|, which starts and ends a group
+respectively.
+
+As we expect the most common reglyphing operation will be to go from SC
+glyph names to expert glyph names, there is a file \texttt{csc2x.tex}
+in the \package{fontinst} distribution which contains the modifying
+reglyphing commands needed for setting up that conversion. Thus you
+can write for example
+\begin{quote}
+ |\reglyphfonts|\\
+ | \input csc2x|\\
+ | \reglyphfont{padrcx8r}{padrc8r}|\\
+ | \reglyphfont{padscx8r}{padsc8r}|\\
+ |\endreglyphfonts|
+\end{quote}
+to alter the glyph names in the SC fonts in the Adobe Garamond
+(\texttt{pad}) family.
+Note that the names of the destination fonts here really are rather
+arbitrary, since they will only exist as \texttt{.mtx} files, and
+thus only need to work within your local file system. In particular,
+all the |\setrawglyph| commands in the destination font files still
+refer to the source font, so it is that font which the drivers need
+to know about.
+
+
+\subsection{Making map file fragments}
+
+A \emph{map file fragment} is the lines\footnote{Not in general an
+entire map file, hence the word \emph{fragment}.} of a map file that
+the corresponding driver would need for handling some set of fonts.
+When told to, \package{fontinst} can (in a fairly automatic way) create
+the map file fragment which is needed for the set of raw fonts
+\package{fontinst} has (i) installed directly (using |\installrawfont|)
+or (ii) used as a base font for some installed virtual font (generated
+by |\installfont|). \package{fontinst} does not support the map file
+syntaxes of every existing driver, but the system is designed to be
+extendable and contributions that extend its capabilities are welcome.
+Nor can \package{fontinst} examine your \TeX\ system and
+determine every piece of information needed to make the correct map
+file fragments, but you can tell it roughly how your installation
+looks, it can make guesses which work most of the time, and you can
+specify most things explicitly if the guesses turn out to be wrong.
+Should the available options for configuring the process turn out to
+be inadequate for your needs, then please write to the
+\package{fontinst} mailing list about this---there is probably a way
+to improve the system so that your needs can be met.
+
+Now what does one have to do to use this map file fragment writer,
+then? First you need to tell \package{fontinst} to record the
+information the map file fragment writer needs. You do this by giving
+the command
+\begin{quote}
+ |\recordtransforms{whatever.tex}|
+\end{quote}
+at the beginning of the run. Here \texttt{whatever.tex} is the name of
+a file that will be created, so you can use some other name if you
+like. After that you do all the calls to |\transform|\-|font|,
+|\install|\-|font|, |\install|\-|raw|\-|font|, |\latin|\-|family|,
+etc.\ you need to make the fonts you want. When you're done, you give
+the command
+\begin{quote}
+ |\endrecordtransforms|
+\end{quote}
+and end the run (say |\bye|). The file \texttt{whatever.tex} will now
+contain the information about which fonts were used and what needs to
+be done with them.
+
+The second step is to actually run the map file fragment writer.
+Observe that it is located in the file \texttt{finstmsc.sty}, not
+\texttt{fontinst.sty}! The commands you need to give it can be so few
+that you can type them in at \TeX's \texttt{*} prompt, but if you are
+writing a command file then it should typically have the following
+structure (comments not necessary, of course):
+\begin{quote}
+ \begin{tabular}{ll}
+ |\input finstmsc.sty|& |%| Input command definitions\\
+ \meta{general settings} & |%| See below\\
+ |\adddriver|\marg{driver name}\marg{output file}&
+ |%| Open output file\\
+ |\input whatever.tex|& |%| Write to output file\\
+ |\donedrivers|& |%| Close output file(s), tidy up\\
+ |\bye|& |%| Quit
+ \end{tabular}
+\end{quote}
+The |\adddriver| command gives the order ``write map file entries for
+the \meta{driver name} DVI driver to the file \meta{output file}.'' The
+plan is that it should be possible to use the name of just about any
+major driver (\texttt{dvips}, \texttt{xdvi},
+\texttt{pdftex},\footnote{pdf\TeX\ can read
+the map files generated for \texttt{dvips}, but a separate driver is
+desirable because the formats are not completely identical.}
+\texttt{OzTeX}, etc.) here and get suitable map file entries for that
+driver as output, but for the moment only the \texttt{dvips} and
+\texttt{dvipdfm}\footnote{Whose support I made very much to illustrate
+that you \emph{don't} have to be a big and ancient driver like
+\texttt{dvips} to have supporting code put into \package{fontinst}.
+(The fact that I just happened to have printed out the documentation and
+that is was easy to read also helped, of course.) Note, however, that
+there won't be any support for a driver unless someone sits down and
+writes the code for it! Don't assume I will. /LH} drivers are supported.
+You may also use \texttt{debug} for \meta{driver name}; the entries in
+the file for that ``DVI driver'' simply contain all the available
+information about each font (hence it should come handy for debugging
+code writing entries for real drivers) in a format that should be easy
+to interpret for a human. It could be the right choice if you're going
+to write the map file manually.
+
+The file \texttt{whatever.tex} in the above example contains the
+commands (|\makemapentry| commands) that actually cause entries to be
+written to the output file. It also contains a number of |\storemapdata|
+commands---these describe how some given font was made. If some
+metric file you have used contains |\setrawglyph| commands that were
+not automatically generated by \package{fontinst}, then there might
+not be a |\storemapdata| for the font they refer to in
+\texttt{whatever.tex}, so you will have to include such a command
+yourself somewhere. This can for example be done in the \meta{general
+settings} part of the above example file. The syntax of the
+|\storemapdata| command is described in Subsection~\ref{Ssec:interface}.
+
+Another class of things that will typically appear in the
+\meta{general settings} part above is commands that will inform the
+routines actually writing output about your \TeX\ system, about the set
+of fonts you are using on this run, or about something else that might
+be useful. Some such commands are of a general nature and affect what
+assumptions \package{fontinst} will make in certain conditions when no
+specific information is available. For the moment there commands are:
+\begin{description}
+ \item[\cs{AssumeMetafont}] Assume all fonts with PL metrics are
+ bitmaps generated by Metafont, and therefore make no entries for
+ them.
+ \item[\cs{AssumeAMSBSYY}] Assume all fonts with PL metrics have their
+ \TeX\ names in all upper case as postscript names---just like the
+ Computer Modern fonts in the AMS\slash Blue~Sky\slash Y\&Y
+ distribution.
+ \item[\cs{AssumeBaKoMa}] Assume all fonts with PL metrics have their
+ \TeX\ names in all lower case as postscript names---just like the
+ Computer Modern fonts in the BaKoMa distribution.
+\end{description}
+Otherwise the default action of the routine for finding out the
+postscript name of a font simply is to observe that it hasn't got a clue
+about what the right value is when the metrics were taken from a PL
+file, and therefore it writes `\texttt{??????}' for the postscript name.
+\begin{description}
+ \item[\cs{AssumeLWFN}] Assume postscript fonts for which nothing
+ else has been specified are stored in files which are named
+ according to the \mbox{MacOS} scheme for
+ \texttt{LWFN}s.%\footnote{LaserWriter FoNt}
+\end{description}
+Otherwise the default action is to use the name of the AFM or PL from
+which the metrics was originally taken, and add the file suffix stored
+in the string \texttt{PSfontsuffix}. The default value of this string
+is \texttt{.pfa}, but it can be changed using |\resetstr|.
+
+If neither the default nor the LWFN scheme produce correct results
+then you may use the more specific \DescribeMacro\specifypsfont
+|\specifypsfont| command, which describes exactly which file (or files,
+if any) a given font is stored in. For syntax and examples of usage,
+see Subsubsection~\ref{Sssec:Config-interface}. (I consider the
+semantics of this command to still be under development, but in order
+to know how to develop it further I need to know in which cases it is
+insufficient.)
+
+Finally, there is the |\declarepsencoding| command which is used to
+link ETX files to postscript encodings. If no postscript encoding has
+been linked to a given ETX file then \package{fontinst} will
+automatically create a postscript encoding (\texttt{.enc}) file for
+that encoding, and use this file for all reencoding commands. Again,
+see Subsubsection~\ref{Sssec:Config-interface} for syntax and examples
+of usage. The \texttt{8r} encoding is predeclared, and it doesn't
+matter if an encoding is undeclared if you never use it to reencode
+fonts, but there is potentially a problem with not having declared
+encodings you have installed and use for reencoding, as you may then
+find yourself having two files with identical names that define
+encodings that do not have the same name (as far as postscript is
+concerned).
+
+
+\subsection{On verbatim, typewriter, and monowidth fonts}
+
+The verbatim, typewriter, and monowidth concepts are common sources
+of confusion for those who use \package{fontinst} to install fonts
+with \AllTeX;\footnote{Myself \emph{not} excepted. /LH} in particular
+there are many misconceptions about the relation between them. The
+official view (of which not much has actually been brought forward)
+is that these concepts are really about three quite different things.
+
+A font is a \emph{monowidth} (monospaced, fixed-pitch) font if all
+glyphs in it have exactly the same width. Some font formats make
+special provisions for such fonts; the most notable example is the
+AFM format, where a single \texttt{CharWidth} keyword specifies the
+width for all glyphs in the font. \package{fontinst} responds to this
+by including the command
+\begin{quote}
+ |\setint{monowidth}{1}|
+\end{quote}
+in the MTX file generated from an AFM, but that is everything that is
+hard-wired into the program. That a font is monowidth is however
+something that one should take note of when installing it for \TeX,
+as it means many of the glyphs in it have such a strange appearance
+that they are (pretty much) useless. The \texttt{endash} is for
+example usually only half as long as the \texttt{hyphen} and the
+letters in ligature glyphs are only half as wide as normal letters.
+Many of the ETX and MTX files that come with \package{fontinst}
+contain special commands to avoid making use of such degenerate
+glyphs.
+
+That a font is a \emph{typewriter} font really only means that it has
+a typewriterish look about it. The two most familiar typewriter fonts
+are probably Computer Modern Typewriter (\texttt{cmtt}) and Courier.
+Both of these fonts are monowidth, but there is no absolute rule about
+this. One of the standard \TeX\ fonts is for example Computer Modern
+Variable-width Typewriter (\texttt{cmvtt}), which is not a monowidth
+font, as Figure~\ref{Fig:TTvsVTT} shows.
+\begin{figure}
+ \begin{tabular}{ll}
+ \texttt{cmtt}:& \fontfamily{cmtt}\selectfont
+ The quick brown fox jumps over the lazy dog.\\
+ \texttt{cmvtt}:& \fontfamily{cmvtt}\selectfont
+ The quick brown fox jumps over the lazy dog.
+ \end{tabular}
+ \caption{Two typewriter fonts}
+ \label{Fig:TTvsVTT}
+\end{figure}
+
+The verbatim concept has very little to do with fonts at all; in
+\LaTeX\ it is considered to be a property of the environment
+(\texttt{verbatim}, \texttt{macrocode}, etc.) rather than a property
+of the font. The connection there is with fonts is that the encoding
+of the font must contain visible ASCII (as defined in Appendix~C
+of \emph{The \TeX book}~\cite{TeXbook}) as a subset for the text to
+be rendered correctly. The \texttt{cmtt} family is the only one amongst
+the original Computer Modern fonts which meets this criterium and
+that is the primary grounds for the idea that these three concepts
+should be connected. Today that reason is at best a very weak one, as
+all \texttt{T1}-encoded fonts also meet the criterium of containing
+visible ASCII as a subset.
+
+A circumstance which has probably added to the confusion is that
+\texttt{OT1} is usually claimed to be an encoding. In reality the
+Computer Modern fonts that are declared in \LaTeX\ as being
+\texttt{OT1} display as many as five different encodings, as shown in
+Table~\ref{Tab:OT1-fonts}.
+\begin{table}
+ \begin{tabular}{lccc}
+ & \texttt{TEX TEXT}&
+ \begin{tabular}[b]{c}\texttt{TEX TEXT WITHOUT}\\
+ \texttt{F-LIGATURES}\end{tabular}&
+ \texttt{TEX TYPEWRITER TEXT}\\
+ \noalign{\medskip}
+ non-italic&
+ \begin{tabular}{l}
+ \texttt{cmb10}\\
+ \texttt{cmbx5}--\texttt{12}\\
+ \texttt{cmbxsl10}\\
+ \texttt{cmdunh10}\\
+ \texttt{cmff10}\\
+ \texttt{cmfib8}\\
+ \texttt{cmr6}--\texttt{17}\\
+ \texttt{cmsl8}--\texttt{12}\\
+ \texttt{cmss8}--\texttt{17}\\
+ \texttt{cmssbx10}\\
+ \texttt{cmssdc10}\\
+ \texttt{cmssi8}--\texttt{17}\\
+ \texttt{cmssq8}\\
+ \texttt{cmssqi8}\\
+ \texttt{cmvtt10}
+ \end{tabular}&
+ \begin{tabular}{l}
+ \texttt{cmcsc8}--\texttt{10}\\
+ \texttt{cmr5}
+ \end{tabular}&
+ \begin{tabular}{l}
+ \texttt{cmsltt10}\\
+ \texttt{cmtcsc10}\\
+ \texttt{cmtt8}--\texttt{12}
+ \end{tabular}\\
+ \noalign{\medskip}
+ italic&
+ \begin{tabular}{l}
+ \texttt{cmbxti10}\\
+ \texttt{cmfi10}\\
+ \texttt{cmti7}--\texttt{12}\\
+ \texttt{cmu10}
+ \end{tabular}&&
+ \begin{tabular}{l}
+ \texttt{cmitt10}
+ \end{tabular}
+ \end{tabular}
+ \caption{``\texttt{OT1}-encoded'' Computer Modern fonts, collected
+ according to the actual font encoding}
+ \label{Tab:OT1-fonts}
+\end{table}
+Since most monowidth fonts are only used for setting verbatim text,
+there is some code in \texttt{ot1.etx} which automatically chooses a
+\texttt{TEX TYPEWRITER TEXT} encoding for the font when the
+\texttt{monowidth} integer is set. The only reason for this is the
+guess that this is what the user wanted.
+
+
+\subsection{Tuning accent positions---an application of loops}
+
+The accent placements made by \texttt{latin.mtx} certainly aren't
+perfect for all fonts, and the only way to find out where they should
+be put is through trying in text the accented letters you get for a
+couple of values for the position parameter and deciding which one
+works best. Since to try one parameter value you need to (i) edit it
+into an MTX file, (ii) run \package{fontinst}, (iii) run
+\package{VPtoVF}, (iv) run \TeX\ on some test text, and (v) print that
+text, trying one parameter value can take annoyingly much time.
+Repeating the same procedure ten times to test ten values is not
+something one does without being bored (unless one scripts it, of
+course), but it is possible to try ten parameter values in a single
+virtual font, and without doing very much typing.
+
+Say you're not too happy with how \texttt{latin.mtx} positions the
+accent in the \texttt{ohungarumlaut} glyph:
+\begin{quote}
+ |\setglyph{ohungarumlaut}|\\
+ | \topaccent{o}{hungarumlaut}{500}|\\
+ |\endsetglyph|
+\end{quote}
+The |500| is the horizontal position (in thousandths of the width of
+the \texttt{o}) that the center of \texttt{hungarumlaut} in the glyph
+constructed will have, so that is the position parameter value that
+you want to change. Create an MTX file containing the code
+\begin{quote}
+ |\for(pos){250}{750}{50}|\\
+ | \setglyph{ohungarumlaut\strint{pos}}|\\
+ | \topaccent{o}{hungarumlaut}{\int{pos}}|\\
+ | \endsetglyph|\\
+ | \setleftrightkerning{ohungarumlaut\strint{pos}}|\\
+ | {ohungarumlaut}{1000}|\\
+ |\endfor(pos)|
+\end{quote}
+This will set eleven glyphs \texttt{ohungarumlaut250},
+\texttt{ohungarumlaut300}, \texttt{ohungarumlaut350}, \textellipsis\,,
+\texttt{ohungarumlaut750}, each being an Hungarianly umlauted `o'
+(i.e., an `\H{o}') but all having that umlaut in slightly different
+positions. In order to put them in a font, you also need to make an
+encoding that contains them. Therefore create an ETX file which
+contains the code
+\begin{quote}
+ |\relax\encoding|\\
+ |\nextslot{"C0}|\\
+ |\for(pos){250}{750}{50}|\\
+ | \setslot{ohungarumlaut\strint{pos}}|\\
+ | \endsetslot|\\
+ |\endfor(pos)|\\
+ |\endencoding|
+\end{quote}
+The command for installing this experiment font would be something like
+\begin{isyntax}
+ |\installfont|\marg{some name}|{|\meta{the normal list of metrics}%
+ |,|\penalty0\meta{the new MTX}|}|\penalty0
+ |{ot1,|\meta{the new ETX}|}|\penalty0|{OT1}|\textellipsis
+\end{isyntax}
+The reason for including \texttt{ot1} in the third argument above is
+that you'll need letters other than `\H{o}' against which you can
+compare the experimental glyphs. It would not have been possible to
+use \texttt{t1} instead of \texttt{ot1} (even though that has more
+Hungarian letters) since that would set all slots in the font and
+leave none for these experimental \texttt{ohungarumlaut}s.
+
+It is even possible to use a loop for making the test text. The
+\LaTeX\ macros
+\begin{verbatim}
+\newcount\slotcount
+\newcommand\testtext[3]{%
+ \slotcount=#1\relax
+ \begin{description}%
+ \loop\item[\the\slotcount]#3%
+ \ifnum #2>\slotcount \advance \slotcount 1 \repeat
+ \end{description}%
+}
+\DeclareTextCompositeCommand{\H}{OT1}{o}{\char\slotcount}
+\end{verbatim}
+will let you write
+\begin{quote}
+ |\testtext|\marg{first}\marg{last}\marg{text}
+\end{quote}
+to get the text \meta{text} typeset once for each slot from
+\meta{first} to \meta{last} inclusive, with |\H{o}| ranging through the
+glyphs in this interval. Thus in this case
+|\testtext|\penalty\hyphenpenalty|{"C0}|\penalty\hyphenpenalty|{"CA}|%
+\penalty\hyphenpenalty|{Erd\H{o}s}| would be a trivial test.
+
+
+\subsection{Font installation commands}
+\label{Ssec:FontInstCmds}
+
+The |\installfont|, |\installrawfont|, and |\installfontas| commands
+have the respective syntaxes
+\begin{isyntax}
+ |\installfont|\marg{font-name}\marg{metrics}\marg{etx-list}\penalty0
+ \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+ |\installrawfont|\marg{font-name}\marg{metrics}\marg{etx-list}^^A
+ \penalty0
+ \marg{encoding}\marg{family}\marg{series}\marg{shape}\marg{size}\\
+ |\installfontas|\marg{font-name}\penalty0\marg{encoding}^^A
+ \marg{family}\marg{series}\marg{shape}\marg{size}
+\end{isyntax}
+The \meta{font-name} argument and the last five arguments are common
+to all these commands. The first argument is the name of a \TeX\ font
+to install. The last five arguments are the NFSS attributes under which
+that font will be declared to \LaTeX---encoding, family, series, shape,
+and size. It is worth observing that encoding names are usually in
+upper case, whereas the family, series, and shape are usually in lower
+case. The size argument is either a shorthand (declared using
+\DescribeMacro{\declaresize}|\declaresize|) for a particular font
+size (or range of font sizes), or an explicit list of font sizes or
+ranges of sizes, which is copied directly to the font declaration.
+The most common case is to let the size argument be empty, as that is
+declared as a shorthand for ``any size''.
+
+The |\installfontas| command does not itself create the font, it just
+makes a note that the specified font declaration should be written to
+the proper FD file at |\end|\-|install|\-|fonts|. The
+|\install|\-|font| and |\install|\-|raw|\-|font| commands do however
+produce the font, in the sense that they write a VPL and PL
+respectively file for the font. It depends solely on the \meta{metrics}
+and \meta{etx-list} arguments what this font will contain. Many
+features of these arguments are new with \package{fontinst} v\,1.9;
+therefore the complete syntaxes are described below.
+
+Both arguments are comma-separated lists of basically file names (not
+including an extension). The files listed in the \meta{metrics} are
+font metric files which together build up a \emph{glyph base}
+(definitions of glyphs and metrics related to one or several glyphs),
+whereas the files listed in the \meta{etx-list} are encoding definition
+files that select a subset of the glyph base for turning into a
+\TeX\ font. The font metrics can be in either of the four formats
+MTX, PL, AFM, and VPL, which are considered in that order. If the
+metrics are not originally in MTX format then they will be converted
+to this format (a new file will be created) before they are used.
+The encoding definitions must be in ETX format. The files actually
+read will have a suffix \texttt{.mtx}, \texttt{.pl}, \texttt{.afm},
+\texttt{.vpl}, or \texttt{.etx} appended to the name given, depending
+on which format is expected.
+
+Within each element of the comma-separated list, the actual file name
+is followed by zero or more \emph{modifier clause}s. A \meta{modifier
+clause} consists of a \emph{keyword} followed by some number (usually
+one) of \emph{arguments}, separated by spaces. The whole thing looks
+a lot like the \meta{rule specifications} of e.g.\ the |\vrule|
+command, but here the spaces are mandatory. The currently defined
+\meta{modifier clause}s are
+\begin{description}
+ \item[\mdseries\textvisiblespace\texttt{option}\textvisiblespace
+ \meta{string}]
+ Available for metric and encoding files. This adds \meta{string}
+ to the list of options for this file, which may affect what code
+ the file executes. The file can then test, using the |\ifoption|
+ command, whether a specific string is one of the options it was
+ given.
+ \item[\mdseries\textvisiblespace\texttt{scaled}\textvisiblespace
+ \meta{factor}]
+ Available for metric files. Causes the \texttt{rawscale} integer
+ variable to be set to the \meta{factor} (an integer expression)
+ while the file is being read. This scales glyphs and kerns that
+ are added to the glyph base by the \meta{factor}.
+ \item[\mdseries\textvisiblespace\texttt{suffix}\textvisiblespace
+ \meta{suffix}]
+ Available for metric files. Causes \meta{suffix} to be appended
+ to every glyph name appearing in a glyph or kern that file adds
+ to the glyph base. Thus ``\texttt{suffix /2}'' effectively
+ changes a
+ \begin{quote}
+ |\setrawglyph{a}|\dots
+ \end{quote}
+ to a
+ \begin{quote}
+ |\setrawglyph{a/2}|\dots
+ \end{quote}
+ \item[\mdseries\textvisiblespace\texttt{encoding}\textvisiblespace
+ \meta{etx-name}]
+ Available for metric files, and forces \package{fontinst} to
+ only consider the PL and VPL formats for this font.
+ As these file formats do not contain glyph names, an ETX file
+ is used to assign glyph names to the slots in the font.
+ This ETX file is usually selected according to the
+ \texttt{CODINGSCHEME} property of the PL or VPL (using the
+ correspondances set up via the |\declare|\-|encoding| command),
+ but that information is not always as one would want it (there
+ are even fonts for which it is quite wrong). An \texttt{encoding}
+ clause bypasses this automatic mechanism, so that the file
+ \meta{etx-name}\texttt{.etx} is used instead.
+
+% % The following is no longer true as of v1.926:
+% \textbf{Note:} The first time that a file in PL or VPL format is
+% used in a \meta{metrics} argument, a corresponding MTX file is
+% generated. This means that if the same file reference is used
+% another time then the reference will be to the MTX file, not to
+% the original PL or VPL, and thus \texttt{encoding} clauses on
+% subsequent uses will have no effect. Each font only has one
+% encoding, so it usually makes no sense to switch the ETX file
+% used to interpret a font, but since MTX files are not
+% automatically deleted between runs there is a risk that this
+% takes away the intended effect of an \texttt{encoding} clause.
+
+ \item[\mdseries\textvisiblespace\texttt{mtxasetx}]
+ This is available for files in the \meta{etx-list}. The actual
+ function of a
+ \begin{quote}
+ \meta{file-name} \texttt{mtxasetx}
+ \end{quote}
+ item in the \meta{etx-list} is that the file
+ \meta{file-name}\texttt{.mtx} is inputted (\emph{not}
+ \meta{file-name}\texttt{.etx}) and that the correspondance
+ between glyph names and slot numbers set up in
+ |\set|\-|raw|\-|glyph| or |\set|\-|scaled|\-|raw|\-|glyph|
+ commands in this file is treated as if it had been set up by
+ |\setslot| commands in an ETX file. Provided the MTX file is
+ transformable, the glyph base will be unaffected.
+
+ The purpose of this feature is to simplify quick and dirty
+ installations of odd fonts for which no suitable ETX file is
+ available. This can be useful in early stages of the design of
+ a new font, but is inferior to installation using proper ETX
+ files since one for example cannot specify any ligatures in
+ MTX files.
+\end{description}
+Furthermore there is a special exception for the \meta{metrics}: if
+the first token in one of the list items is the control sequence
+|\metrics|, then the rest of that item is interpreted as explicit
+metric commands to execute.
+
+If the \meta{metrics} of two subsequent |\install|\-|font|
+or |\install|\-|raw|\-|font| commands are identical then the glyph
+bases will be identical as well. This creates an opportunity for
+optimization, which \package{fontinst} makes use of by caching glyph
+bases from one installation command to the next so that the glyph
+base does not have to be rebuilt in these cases. A side-effect of
+this caching is that local assignments made between two font
+installation commands are cleared out with the glyph base, but
+|\setint| and similar \package{fontinst} commands make global
+assignments when used in such positions.
+
+Some examples might be in order. The first is an adaptation of an
+installation command from \texttt{mfnt-0.59}~\cite{mfnt} by
+Matthias Clasen and Ulrik Vieth: the installation command for the
+8-bit math font \texttt{xma1000} (which can be thought of as being
+to \texttt{cmmi10} sort of as \texttt{ecrm1000} is to \texttt{cmr10}).
+The first three \texttt{encoding} clauses are more fine-tuning---without
+them, a few glyphs would get incorrect names---but the last two are
+quite essential, as the \texttt{msam10} and \texttt{msbm10} fonts
+incorrectly claim to have the coding scheme \texttt{TEX MATH
+SYMBOLS}.
+\begin{verbatim}
+ \installfont{xma1000}{%
+ yma1000 encoding mcin,%
+ cmr10 encoding ot1upright,%
+ cmmi10,%
+ cmsy10 encoding omscal,%
+ msam10 encoding msam,%
+ msbm10 encoding msbm,%
+ mccmhax,mccmkern,mcmissing,%
+ cmsy10-base,cmsy10-extra%
+ }{mc}{MC}{cm}{m}{n}{<10->}
+\end{verbatim}
+Also note the explicit \LaTeX\ size specification for the range
+``10\,pt and up''.
+
+The second example makes use of a \texttt{suffix} clause to combine
+the letters from one font with the digits from another.
+\begin{verbatim}
+ \installfont{msbrj8t}{msbr8r,msbrc8r suffix /2,latin}{digit2,t1}
+ {T1}{msbj}{m}{n}{}
+\end{verbatim}
+In this case, the glyph base contains the glyphs of Monotype Sabon
+(SabonMT)---under names such as \texttt{A} for `A', \texttt{a} for
+`a', and \texttt{one} for a lining digit one---as well as the
+glyphs of Monotype Sabon Small Caps and Oldstyle Figures
+(SabonMT-SCOSF)---under names such as \texttt{A/2} for `A',
+\texttt{a/2} for `\textsc{a}', and \texttt{one/2} for a hanging
+digit one. The \texttt{digit2.etx} file simply makes the definition
+\begin{verbatim}
+ \setcommand\digit#1{#1/2}
+\end{verbatim}
+which causes \texttt{t1.etx} to put \texttt{zero/2} in slot 48 (digit
+zero), \texttt{one/2} in slot 49 etc., instead of as it normally
+would \texttt{zero} in slot 48, \texttt{one} in slot 49 and so on.
+The net effect is that the digits in the generated \texttt{msbrj8t}
+is from \texttt{msbrc8r} (SabonMT-SCOSF) but everything else is from
+\texttt{msbr8r} (SabonMT).
+
+The third example makes use of an \texttt{mtxasetx} clause to install
+(with its default encoding) a font for which creating an appropriate
+ETX file seems not worth the trouble.
+\begin{verbatim}
+ \installrawfont{psyr}{psyr,\metrics
+ \setint{xheight}{\height{alpha}}
+ }{txtfdmns,psyr mtxasetx}{U}{psy}{m}{n}{}
+\end{verbatim}
+The effect of the second \texttt{psyr} is that \texttt{psyr.mtx} is
+read (in case there was no \texttt{psyr.mtx} then it is created from
+(hopefully) \texttt{psyr.afm}) and the information in it will form
+the glyph base. Because of the |\metrics| control sequence, the rest
+of that item will be interpreted as explicit metric commands
+modifying the glyph base, and thus the |\setint| command can provide
+a value for the \texttt{xheight} variable (there doesn't seem to be
+such a value in the AFM). Once the glyph base is completed, the
+|\install|\-|raw|\-|font| starts writing the file \texttt{psyr.pl}
+(that's for the first \texttt{psyr}). The encoding of that font will,
+because of the \texttt{psyr mtxasetx}, be the same as that used in
+\texttt{psyr.mtx}. Finally, the \texttt{txtfdmns} is for
+\texttt{txtfdmns.etx}, an ETX file which sets fontdimens 1--16 as for
+a \texttt{T1} encoded font but does not set any slots. Since
+\texttt{psyr.mtx} reinterpreted as an ETX file sets slots but no
+fontdimens, these complement each other nicely.
+
+
+
+\begingroup
+\renewcommand\thesubsection{\thesection.\ensuremath{\infty}}
+
+\subsection{Coming attractions}
+
+We\footnote{Well, perhaps it's just me. /LH} have some new features
+which we have pretty much sorted out how they should work and how they
+should be implemented, but didn't want to introduce in this version as
+the large modifications in core systems would require another
+pre-release version before the proper release. Instead these features
+will probably appear in the first pre-release of \package{fontinst}
+v\,2.0.
+
+
+\subsubsection{Bounding boxes}
+
+Han The Thanh has created an implementation of bounding box support
+for \package{fontinst}, and it is a modified form of that support
+that will make it into \package{fontinst} v\,2.0. One important
+characteristic of this implementation is that the dimensions of the
+bounding box are not bundled into the same data structure (the
+|\g-|\meta{glyph} macros) as the glyph's width, height, depth, and
+italic correction are, but stored in a separate data structure (the
+|\gb-|\meta{glyph} macros). A glyph doesn't need to have its bounding
+box set, it is simply a piece of information that \package{fontinst}
+will store if you tell it to and which you can later retrieve.
+
+The bounding box will be stored as coordinates of the sides in the
+normal AFM coordinate system. The commands for retrieving these
+coordinates will probably be
+\begin{center}
+ \begin{tabular}{ll}
+ \textbf{Command}& \textbf{Side}\\
+ |\bbtop|\marg{glyph}& top ($y$-coordinate)\\
+ |\bbbottom|\marg{glyph}& bottom ($y$-coordinate)\\
+ |\bbleft|\marg{glyph}& left ($x$-coordinate)\\
+ |\bbright|\marg{glyph}& right ($x$-coordinate)
+ \end{tabular}
+\end{center}
+In Thanh's implementation the command names are |\ury|, |\lly|,
+|\llx|, and |\urx| respectively instead, but I think the former are
+easier to remember. If no bounding box has been set for a glyph then
+the above commands will instead report the corresponding coordinate of
+the glyph's \TeX\ box (i.e.\ |\height|\marg{glyph},
+|\neg{\depth|\marg{glyph}|}|, |0|, and |\width|\marg{glyph}
+respectively).
+
+The command for setting the bounding box of a glyph will be
+\begin{quote}
+ |\setglyphbb|\marg{glyph}\marg{left}\marg{bottom}\marg{right}^^A
+ \marg{top}
+\end{quote}
+
+
+
+\endgroup
+
+
+\section{Notes on using \package{fontinst}}
+\label{Sec:NotesOnUsing}
+
+The primary purpose of \package{fontinst} is to simplify the
+installation of PostScript or TrueType text fonts.
+
+
+\subsection{General notes}
+
+Leaving aside unusual variants which require special attention such
+as alternate or swash fonts, almost all standard font families can
+be installed automatically using the |\latinfamily| command,
+optionally making use of the corresponding expert fonts as well.
+
+Depending on what kind of fonts you have and want to install,
+|\latinfamily| supports three different modes of operation:
+
+|\latinfamily|\marg{fam}|{}| installs a normal font family using
+|8a|-encoded standard fonts (reencoded to |8r|) and nothing else.
+It installs |.fd| files for the \LaTeX{} families \texttt{8r}\meta{fam},
+\texttt{OT1}/\meta{fam}, \texttt{T1}/\meta{fam} and
+\texttt{TS1}/\meta{fam}, and generates virtual fonts for the |7t|,
+|8t|, and |8c| encodings. This is the only option available for most
+typefaces which do not have an expert set.
+
+|\latinfamily{|\meta{fam}|x}{}| installs an expertized font family using
+|8a|-encoded standard fonts (reencoded to |8r|) and |8x|-encoded
+expert fonts. It installs |.fd| files for the \LaTeX{} families,
+\texttt{OT1}/\meta{fam}\texttt{x}, \texttt{T1}/\meta{fam}\texttt{x} and
+\texttt{TS1}/\meta{fam}\texttt{x}, and generates virtual fonts for the
+|9t|, |9e| and |9c| encodings.
+
+|\latinfamily{|\meta{fam}|j}{}| installs an expertized font family with
+oldstyle digits using |8a|-encoded standard fonts (reencoded to
+|8r|) and |8x|-encoded expert fonts. It installs |.fd| files for
+the \LaTeX{} families, |OT1|/\meta{fam}|j|, |T1|/\meta{fam}|j| and
+|TS1|/\meta{fam}|j|, and generates virtual fonts for the |9o|, |9d| and
+|9c| encodings. Since \texttt{TS1} has oldstyle digits by default, the
+|9c|-encoded fonts should be the same as in the previous case. Finally,
+|\latinfamily{|\meta{fam}|9}{}| is also supported as an alternative to
+|\latinfamily{|\meta{fam}|j}{}| for backwards compatibility.
+
+The whole installation process relies on certain assumptions about
+the symbol complement of Adobe's expert fonts. In particular, it is
+assumed that the expert fonts include the oldstyle digits and a
+complete set of small caps glyphs, which is an assumption that's not
+always satisfied for expert fonts by other suppliers. If these
+glyphs are not included in the expert fonts, the only way to get
+them is from real small caps fonts, but this requires some
+reshuffling of glyph names.
+
+To support such unusual cases, this source file contains some
+optional code embedded between \Module{*oldstyle} \dots\
+\Module{/oldstyle},
+which extends the behaviour of |\latinfamily| for expertized
+encodings with oldstyle digits. Instead of relying only on the
+glyphs of the |8r|-reencoded raw font and the |8x|-encoded expert
+font, this version also looks for corresponding OsF or SC\&OsF fonts
+and uses the default digits from those fonts as oldstyle digits.
+
+
+\subsection{Notes on small caps and oldstyle fonts}
+
+The |\latinfamily| command is supposed to do a reasonably good job
+of installing a complete font family based on all the |.afm| files
+it can find. If it doesn't find a suitable font shape, it is
+sometimes possible to fake it by default substitutions. However, in
+the case of small caps fonts, there are several options which may
+require some clarification.
+
+For the majority of typefaces, a font family typically consists only
+of of roman and italic fonts in several weights. Since real small
+caps fonts are not included, they have to be faked from the roman
+fonts, which is implemented by setting |\encoding_shape| to `|c|',
+so that different encoding files |OT1c.etx| or |T1c.etx| are used.
+Since these files call for glyph names such as `|Asmall|' which are
+not found in the roman font, the default substitutions in
+|latin.mtx| are eventually used to approximate fake small caps
+glyphs by scaling and letterspacing. The outcome is just an
+approximation for a small caps font, but it is better than nothing.
+
+For a small number of typefaces, the standard fonts are complemented
+by an expert collection, which usually includes two sets of fonts.
+First, for each standard font there is a corresponding expert font
+containing additional glyphs such as extra ligatures and symbols,
+oldstyle digits and small capital letters. For Adobe expert fonts
+this set is sufficient to build a complete small caps font from the
+standard and expert glyphs. Furthermore, the expert collection
+usually also contains a number of real small caps font corresponding
+to the roman fonts and some OsF fonts corresponding to the italic
+fonts. If these fonts are available, there are several options how
+to install small caps fonts.
+
+By default, |\latinfamily| first tries to find a real small caps
+font. If it is found, it is installed using the default encoding
+files and metric files, just like any roman or slanted font.
+However, once |\latinfamily| has taken this choice, it will fail to
+find a corresponding expert font, since it is actually looking for
+an expert font in small caps shape which doesn't exist. (In fact,
+it would be an error to substitute an expert font in normal shape.)
+The outcome will be a virtual font based only on glyphs from the
+real small caps raw font, which implies ending up with oldstyle
+digits as the default set of digits, but allows to inherit the
+kerning information of the real small caps font.
+
+Another option for an expertized installation would be to make the
+real small caps fonts unavailable, so that |\latinfamily| will
+attempt to fake a small caps font using glyphs from the standard and
+expert fonts in normal shape. This means that |\encoding_shape| is
+again set to `|c|', so that |OT1c.etx| and |T1c.etx| are used, but
+this time a glyph named `|Asmall|' does exist in the expert font and
+will be used instead of faked one generated by scaling. The outcome
+will be a font based on normal and small caps glyphs from the
+standard and expert fonts. The oldstyle digits will only be used if
+they are called for, otherwise the default digits from the roman
+font are used. The only drawback of this approach is that the
+kerning around small capital letters will be based on the scaled
+kern amounts of the capital letters rather than on the kern pairs
+from the real small caps font.
+
+Finally, the most promising approach of all these options would be
+to combine the glyphs from standard and expert fonts with kern pairs
+from the real small caps fonts. The current version of |\latinfamily|
+does not implement this, but it would be a worthwhile approach, and
+advanced \package{fontinst} users are encouraged to attempt it. The
+file \texttt{csckrn2x.tex} (a variant of \texttt{csc2x.tex}, which is
+mentioned in Subsection~\ref{Ssec:Des:Reglyph}) should come in handy
+for this.
+
+
+\subsection{\package{fontinst} variables}
+
+The following is a list of the \package{fontinst} variables that are
+accessible for the user through the |\set|\textellipsis,
+|\reset|\textellipsis, |\unset|\textellipsis, etc.\ commands. You may
+of course set or use other variables in the MTX and ETX files you
+write yourself, as does for example the standard MTX file
+\texttt{latin.mtx}, but all variables that \package{fontinst} commands
+implicitly use or set are listed below.
+
+\begin{list}{}{%
+ \setlength\labelwidth{0pt}%
+ \setlength\itemindent{-\leftmargin}%
+ \setlength\parsep{0pt}
+ \def\makelabel#1{\hspace\labelsep \normalfont\ttfamily #1}%
+}
+ \item[acccapheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The height of accented full capitals.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[address] (string)
+ \begin{smalldes}
+ \item[Description] Snailmail address put in \BibTeX-style file
+ header of automatically generated ENC files. No
+ \texttt{address} field is written unless the \texttt{address}
+ string is set. Quotes are not automatically inserted around
+ the \texttt{address} string.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-ENC converter.
+ \end{smalldes}
+ \item[afm-name] (string)
+ \begin{smalldes}
+ \item[Description] Name of source font. Internal variable.
+ \item[Set by] |\from|\dots\ commands.
+ \item[Used by] The |\transform|\-|font|, |\install|\-|font|,
+ |\install|\-|raw|\-|font|, and |\reglyph|\-|font| commands.
+ \end{smalldes}
+ \item[ascender] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The ascender height of the font.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this integer.
+ \item[Used by] Some MTX and ETX files.
+ \end{smalldes}
+ \item[author] (string)
+ \begin{smalldes}
+ \item[Description] Author name(s) put in \BibTeX-style file
+ header of automatically generated ENC files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-ENC converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[\cs{autoinstallfamily}] (command)
+ \begin{smalldes}
+ \item[Description] Command called by the font installation
+ commands, as
+ \begin{quote}
+ |\autoinstallfamily|\marg{encoding}\marg{family}
+ \end{quote}
+ when they are asked to install a font with a combination of
+ \meta{encoding} and \meta{family} that has not been seen
+ before (there was no explicit |\installfamily|).
+ \item[Set by] Explicit commands. Defaults to calling
+ |\installfamily|.
+ \item[Used by] Font installation commands.
+ \end{smalldes}
+ \item[axisheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{22}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[baselineskip] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The font designer's recommendation for natural length of the
+ \TeX\ parameter |\baselineskip|.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[bigopspacing1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{9}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[bigopspacing2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{10}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[bigopspacing3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{11}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[bigopspacing4] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{12}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[bigopspacing5] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{13}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[capheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The height of the font's full capitals.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some MTX and ETX files.
+ \end{smalldes}
+ \item[cmapname] (string)
+ \begin{smalldes}
+ \item[Description] The name given to the CMap generated from
+ an ETX file.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-CMap converter. When not set, the
+ value |fontinst-|\nolinebreak[1]\meta{cmap file name} is
+ used instead.
+ \end{smalldes}
+ \item[codingscheme] (string)
+ \begin{smalldes}
+ \item[Description] The codingscheme name.
+ \item[Set by] ETX files.
+ \item[Used by] The (V)PL writer. When not set, the
+ value \texttt{UNKNOWN} is used instead.
+ \end{smalldes}
+ \item[defaultrulethickness] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\xi\sb{8}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[delim1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{20}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[delim2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{21}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[denom1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{11}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[denom2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{12}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[descender] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The depth of lower case letters with descenders.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[descender_neg] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The vertical position of the descender line
+ of the font, i.e., the negative of the font's descender depth.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some MTX and ETX files.
+ \end{smalldes}
+ \item[designsize] (dimension)
+ \begin{smalldes}
+ \item[Description] The design size of the font.
+ \item[Set by] MTX files. The (V)PL-to-MTX converter usually writes
+ |\setdim| commands for this variable.
+ \item[Used by] The (V)PL writer. The design size defaults to
+ $10\,\mathrm{pt}$ if this variable is not set.
+ \item[Note] The value of this variable has no effect on how
+ the font is declared to \LaTeX.
+ \end{smalldes}
+ \item[designunits] (dimension denoting a real number)
+ \begin{smalldes}
+ \item[Description] The design size of a font expressed in the
+ design unit used in a (V)PL file.
+ \item[Set by] MTX files. The (V)PL-to-MTX converter usually writes
+ |\setdim| commands for this variable.
+ \item[Used by] Nothing. If this variable is set, but to any
+ value other than $1\,\mathrm{pt}$, then some metrics are most
+ likely wrong.
+ \end{smalldes}
+ \item[digitwidth] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The median width of the digits in the font.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[email] (string)
+ \begin{smalldes}
+ \item[Description] Email address put in \BibTeX-style file
+ header of automatically generated ENC files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-ENC converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[encodingname] (string)
+ \begin{smalldes}
+ \item[Description] The name by which the encoding in question is
+ made known to a Postscript interpreter.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-ENC converter. When not set, the
+ value |fontinst-|\nolinebreak[1]|autoenc-|\nolinebreak[1]%
+ \meta{etx name} is used instead.
+ \end{smalldes}
+ \item[etx-name] (string)
+ \begin{smalldes}
+ \item[Description] Name of ETX file. Internal variable in
+ |\transform|\-|font|.
+ \item[Set by] The |\reencodefont| command.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[extraspace] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The natural width of extra interword glue at the end of a
+ sentence.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[fontdimen($n$)] (integer)
+ \begin{smalldes}
+ \item[Description] Family of semi-internal variables that store
+ the values to use for font dimension $n$. It is preferred
+ that the newer |\set|\-|font|\-|dimen| interface is used for
+ setting these values.
+ \item[Set by] ETX files.
+ \item[Used by] The (V)PL writer.
+ \end{smalldes}
+ \item[\cs{iftokeep}] (macro)
+ \begin{smalldes}
+ \item[Description] |\iftokeep|\,\#1\,|\then|, where \#1 will
+ be a \meta{number}, behaves like a switch and decides whether
+ a glyph is kept or not while reglyphing.
+ \item[Set by] Explicit commands. Defaults to
+ $$
+ \mbox{\cs{iftokeep}\,\#1\,\cs{then}} \mapsto
+ \mbox{\cs{ifnum}\,\texttt{-1<}\#1}
+ $$
+ \item[Used by] The |\reglyphfont| command.
+ \end{smalldes}
+ \item[interword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The natural width of interword glue (spaces).
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[italicslant] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] The italic slant of a font.
+ \item[Set by] MTX files generated from AFM or (V)PL files. MTX
+ files generated by |\transformfont|. Locally in the AFM-to-MTX
+ converter for possible use in |\uprightitalcorr| or
+ |\slanteditalcorr|.
+ \item[Used by] MTX files (\texttt{latin.mtx} and the like). ETX
+ files (for determining \texttt{fontdimen(1)}).
+ \end{smalldes}
+ \item[killweight] (integer)
+ \begin{smalldes}
+ \item[Description] Weight for glyphs that are killed.
+ \item[Set by] Explicit commands. Defaults to $-10$ if not set.
+ \item[Used by] The |\kill|\-|glyph| command; indirectly
+ the |\reglyphfont| command.
+ \end{smalldes}
+ \item[letterspacing] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Extra width added to all glyphs of a font.
+ \item[Set by] ETX or MTX files.
+ \item[Used by] The (V)PL writer. Defaults to $0$ if not set.
+ \end{smalldes}
+ \item[maxdepth] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The maximal depth over all slots in the font.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[maxdepth_neg] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The negative of the maximal depth of a glyph in
+ the font.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[maxheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The maximal height of a glyph in the font.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[minimumkern] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Kerns whose size in absolute value is less
+ than or equal to this variable are ignored.
+ \item[Set by] \package{fontinst} command files or MTX files.
+ \item[Used by] The AFM-to-MTX converter and the (V)PL file
+ generator. When not set, the value $0$ is used instead.
+ \end{smalldes}
+ \item[monowidth] (flag integer)
+ \begin{smalldes}
+ \item[Description] Set if this font is monowidth, unset otherwise.
+ \item[Set by] MTX files. The AFM-to-MTX converter writes a
+ |\setint| command for this variable if the AFM specifies
+ \texttt{IsFixedPitch true}.
+ \item[Used by] Some MTX files (\texttt{latin.mtx} and the like),
+ ETX files.
+ \end{smalldes}
+ \item[num1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{8}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[num2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{9}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[num3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{10}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[quad] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The quad width of the font, normally approximately equal to
+ the font size and\slash or the width of an `M'.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[PSfontsuffix] (string)
+ \begin{smalldes}
+ \item[Description] Suffix added to font names to form name of
+ file to download to include font.
+ \item[Set by] Explicit commands in \textsf{finstmsc} command
+ files. Defaults to `\texttt{.pfa}'.
+ \item[Used by] The map file fragments writer.
+ \end{smalldes}
+ \item[rawscale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Scaling factor applied to raw glyphs.
+ \item[Set by] The |\installfont| command (\texttt{scaled}
+ clauses in argument \#2). Unset for metric files listed
+ without a \texttt{scaled} clause.
+ \item[Used by] The |\set|\-|raw|\-|glyph|,
+ |\set|\-|not|\-|glyph|, |\set|\-|scaled|\-|raw|\-|glyph|,
+ |\set|\-|scaled|\-|not|\-|glyph|, |\set|\-|kern|, and
+ |\reset|\-|kern| commands.
+ \end{smalldes}
+ \item[renameweight] (integer)
+ \begin{smalldes}
+ \item[Description] Weight for glyphs that are renamed.
+ \item[Set by] Explicit commands. Defaults to $1$ if not set.
+ \item[Used by] The |\rename|\-|glyph| command; indirectly
+ the |\reglyphfont| command.
+ \end{smalldes}
+ \item[requireglyphs] (flag integer)
+ \begin{smalldes}
+ \item[Description] Set if warnings are to be generated for
+ glyphs listed in ETX files but not present in the glyph
+ base.
+ \item[Set by] Explicit commands. By defaults not set.
+ \item[Used by] The (V)PL file generator.
+ \end{smalldes}
+ \item[rightboundary] (string)
+ \begin{smalldes}
+ \item[Description] The name of a glyph with the property that
+ kerns on the left may be intended as right word boundary kerns.
+ \item[Set by] MTX files. The (V)PL-to-MTX converter can write
+ |\setstr| commands for this variable.
+ \item[Used by] Some MTX files.
+ \end{smalldes}
+ \item[shrinkword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The (finite) shrink component of interword glue.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[slant-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Factor to slant by.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\slant|\-|font|, |\xscale|\-|font|, and
+ |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[\cs{SlantAmount}] (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] Slant factor used for faking oblique shape.
+ \item[Set by] Explicit commands. Defaults to \texttt{167}.
+ \item[Used by] The |\latinfamily| command.
+ \end{smalldes}
+ \item[\cs{slanteditalcorr}]
+ (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] The integer expression used to calculate a
+ guess for the italic correction of glyphs in a font with
+ positive slant. It has the syntax
+ \begin{quote}
+ \cs{slanteditalcorr}\marg{width}\marg{left}\marg{right}^^A
+ \marg{bottom}\marg{top}
+ \end{quote}
+ where \meta{width} is the glyph's advance width, and the
+ remaining arguments are coordinates of sides of the glyph's
+ bounding box. The \texttt{italicslant} integer provides the
+ italic slant of the font.
+ \item[Set by] Explicit commands in \textsf{fontinst} command
+ files. Defaults to
+ $$
+ \max\{0, \mathit{right}-\mathit{width}\}.
+ $$
+ \item[Used by] The AFM-to-MTX converter.
+ \end{smalldes}
+ \item[stretchword] (integer denoting length)
+ \begin{smalldes}
+ \item[Description]
+ The (finite) stretch component of interword glue.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[sub1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{16}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[sub2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{17}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[subdrop] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{19}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[sup1] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{13}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[sup2] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{14}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[sup3] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{15}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[supdrop] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Math formula parameter $\sigma\sb{18}$.
+ \item[Set by] MTX files.
+ \item[Used by] Some ETX and MTX files.
+ \end{smalldes}
+ \item[TFMfileprefix] (string)
+ \begin{smalldes}
+ \item[Description] Prefix (typically a path) added to names of
+ TFM files.
+ \item[Set by] Explicit commands in \textsf{finstmsc} command
+ files. By default not set, which is equivalent to being empty.
+ \item[Used by] The \textsf{PLtoTF} ``map file fragments writer''.
+ \end{smalldes}
+ \item[underlinethickness] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The recommended thickness of an underlining
+ rule.
+ \item[Set by] MTX files. The AFM-to-MTX converter usually writes
+ |\setint| commands for this variable.
+ \item[Used by] Some MTX files (\texttt{latin.mtx} and the like).
+ \end{smalldes}
+ \item[\cs{uprightitalcorr}]
+ (macro expanding to an integer expression)
+ \begin{smalldes}
+ \item[Description] The integer expression used to calculate a
+ guess for the italic correction of glyphs in a font with
+ non-positive slant. It has the syntax
+ \begin{quote}
+ \cs{uprightitalcorr}\marg{width}\marg{left}\marg{right}^^A
+ \marg{bottom}\marg{top}
+ \end{quote}
+ where \meta{width} is the glyph's advance width, and the
+ remaining arguments are coordinates of sides of the glyph's
+ bounding box. The \texttt{italicslant} integer provides the
+ italic slant of the font.
+ \item[Set by] Explicit commands in \textsf{fontinst} command
+ files. Defaults to $0$.
+ \item[Used by] The AFM-to-MTX converter.
+ \end{smalldes}
+ \item[version] (string)
+ \begin{smalldes}
+ \item[Description] Version number put in \BibTeX-style file
+ header of automatically generated ENC files. See the macro
+ |\ref_to_sourcefile| for more details.
+ \item[Set by] ETX files.
+ \item[Used by] The ETX-to-ENC converter. When not set, the
+ value \texttt{"See file }\meta{etx name}\texttt{"} is used
+ instead.
+ \end{smalldes}
+ \item[verticalstem] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The dominant width of vertical stems
+ (usually the width of stems of lower case letters).
+ \item[Set by] MTX files. The AFM-to-MTX converter writes
+ |\setint| commands for this variable if the AFM file specifies
+ \texttt{StdVW}.
+ \item[Used by] Currently nothing.
+ \end{smalldes}
+ \item[\texttt{warningspecials}] (switch)
+ \begin{smalldes}
+ \item[Description] Controls whether |\glyphwarning| commands
+ will generate VPL \texttt{SPECIAL}s. Defaults to `true'.
+ \item[Set by] Explicit commands (|\warningspecialstrue| and
+ |\warningspecialsfalse|).
+ \item[Used by] The (V)PL file generator.
+ \end{smalldes}
+ \item[x-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Horizontal scaling factor.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\xscale|\-|font| and |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[xheight] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] The x-height of the font.
+ \item[Set by] MTX files. The AFM-to-MTX and (V)PL-to-MTX
+ converters usually write |\setint| commands for this variable.
+ \item[Used by] MTX files, and ETX files (for determining
+ \texttt{fontdimen(5)}).
+ \end{smalldes}
+ \item[y-scale] (integer denoting factor)
+ \begin{smalldes}
+ \item[Description] Vertical scaling factor.
+ Internal variable in |\transform|\-|font|.
+ \item[Set by] The |\yscale|\-|font| and |\scale|\-|font| commands.
+ \item[Used by] The |\mtxtomtx| command.
+ \end{smalldes}
+ \item[\meta{\rmfamily glyph}-spacing] (integer denoting length)
+ \begin{smalldes}
+ \item[Description] Glyph-specific override for
+ \texttt{letterspacing}; extra width added to the glyph
+ \meta{glyph} as part of the process of writing a VPL
+ file.
+ \item[Set by] ETX or MTX files.
+ \item[Used by] The (V)PL writer. Defaults to $0$ if not set.
+ \end{smalldes}
+\end{list}
+Besides these, the |\latinfamily| command provides a whole range of
+parameters that are often used somewhat like variables. That subject
+does however deserve to be treated separately.
+
+
+\section{\package{fontdoc} package overview}
+
+The purpose of the \package{fontdoc} package is to support
+typesetting of \texttt{.etx} and \texttt{.mtx} files intended
+for use with \package{fontinst}.
+The typical format of these files looks something like this:
+\begin{quote}
+ |\relax|\\
+ |\documentclass[twocolumn]{article}|\\
+ |\usepackage{fontdoc}|\\[0.5\baselineskip]
+ |\begin{document}|\\
+ {}~~\textit{\LaTeX\ commands}\\
+ |\encoding| or |\metrics| \\
+ {}~~\textit{\package{fontinst} commands}\\
+ |\endencoding| or |\endmetrics|\\
+ {}~~\textit{\LaTeX\ commands}\\
+ |\end{document}|
+\end{quote}
+To make it work, \package{fontdoc} has to define all the user-level
+\package{fontinst} commands in terms of typesetting instructions. This
+goal is currently only partially achieved, but the percentage of
+\package{fontinst} commands covered by \package{fontdoc} is still
+fairly large, so it is our impression that problems with commands not
+covered occur only very rarely.
+
+
+\subsection{Some \package{fontdoc} commands that \package{fontinst}
+ doesn't know}
+
+Some of the commands defined by \package{fontdoc} are not defined by
+\package{fontinst} because they have no meaning in that context.
+Most of these commands are lower-level commands that are used in the
+implementations of commands common to \package{fontinst} and
+\package{fontdoc}, but a few are simply only meant to be used in the
+parts of ETX and MTX files that \package{fontinst} never executes.
+
+With v\,1.916 the mechanism for formatting integer expressions changed
+dramatically. The new base command to use is
+\DescribeMacro{\TypesetIntegerExpression}|\Typeset|\-|Integer|\-%
+|Expression|, which takes as its only argument the integer expression
+to format and typesets it. |\Typeset|\-|Integer|\-|Expression| expects
+to be used in math mode only. A similar command is
+\DescribeMacro{\TypesetStringExpression}|\Typeset|\-|String|\-%
+|Expression|, which takes a string expression as argument, formats,
+and typesets it. |\Typeset|\-|String|\-|Expression| can be used in any
+mode.
+
+The \DescribeMacro{\macroparameter}|\macroparameter| command is (in
+integer and string expressions) understood as a ``placeholder for a
+macro parameter''. This is primarily useful in comments that describe
+a user-defined macro; see \texttt{ltcmds.mtx} for examples.
+
+
+
+% \part*{Implementation}
+% \addcontentsline{toc}{part}{Implementation}
+
+\changes{1.800}{1998/06/22}{\texttt{fontinst.sty} and
+ \texttt{fontdoc.sty} now generated from \texttt{fontinst.dtx}. (UV)}
+\changes{1.900}{1999/02/05}{\texttt{fontinst.dtx} split into several
+ source files. (LH)}
+\changes{1.902}{1999/04/18}{Fixed some silly markup. (LH)}
+
+\DocInclude{fibasics}
+\DocInclude{ficommon}
+\DocInclude{fimain}
+\DocInclude{fitrig}
+\DocInclude{ficonv}
+\DocInclude{filtfam}
+\DocInclude{fimapgen}
+
+\PrintIndex
+\pagestyle{plain}\tracingmacros=2\tracingcommands=2
+\PrintChanges
+\tracingcommands=0\tracingmacros=0
+
+\clearpage
+\appendix
+\part*{Internal notes}
+\addcontentsline{toc}{part}{Internal notes}
+
+
+\section{Typographic treatment}
+
+\begin{itemize}
+ \item
+ I have been following \emph{The \LaTeX\ Companion} in that I have
+ set all names of packages and the like---\package{fontinst},
+ \package{fontdoc}, \package{trig}, \package{doc}, and
+ \package{docstrip} (I might have forgotten some)---in sans serif
+ type. Actually, I have defined a command |\package| in
+ \texttt{fisource.sty} (or is that \package{fisource}?) which does
+ this, so if we decide on some other formatting, we can just change
+ that. /LH
+ \item
+ It seems to me that there should indeed be some space between the
+ `v' and the digits in a version number when it is typeset, but I
+ also think a full space is too much, so I have been using thin
+ spaces. These are unbreakable and under \LaTeX\ you can simply use
+ |\,| to get one (while you are not in math mode, that is). /LH
+ \item
+ While I went through (some of) the code, I came across a few
+ inconsistencies. \ambiguity{I have marked them out like this%
+ \offindex}---some boldfaced text in a paragraph and a large A
+ in the margin. I defined a command |\ambiguity| for doing this. /LH
+ \item
+ There is also a similar command |\question| which is intended for
+ situations where there isn't really an error, but something seems
+ like it should be taken care of in some other way. \question{The
+ \cs{question} command puts a question mark in the margin.%
+ \offindex}
+ \item
+ I also noticed that there are several \package{fontinst} commands,
+ not all of which are new, which are not defined in \package{fontdoc}.
+ {\offindex\missing{doc}{\foo}}To mark out such things, I have
+ written things like the one shown in the margin by this paragraph.
+ I defined a command |\missing| for doing this. /LH
+\end{itemize}
+
+
+\section{Planning topics}
+
+This section lists items in the larger design of \package{fontinst}
+which need to be resolved in one way or another. Debates about these
+items on the fontinst mailing list are welcome.
+
+
+\subsection{Reorganisation of the source}
+
+At the moment, all the ideas suggested have been realized.
+% \begin{itemize}
+% \item
+% How about moving the first section of \texttt{fimain.dtx} to
+% \texttt{fibasics.dtx}? /LH
+% \item
+% How about extracting the code which has to do with file
+% conversions (Sections~\ref{Sec:Conv. input},
+% \ref{Sec:Font.trans}, and Subsection~\ref{Ssec:MTX->PL}) from
+% \texttt{fimain.dtx} and put it in a file of its own
+% (\texttt{ficonv.dtx}, say)? /LH
+% \end{itemize}
+
+
+\subsection{Files}
+
+Which files should be considered temporary and placed in the location
+specified with |\tempfileprefix|? Should files be explicitly be looked
+for at this location or should it be assumed that fontinst users
+include that location in their \TeX\ input file search path? In the
+former case, \emph{which} files should be looked for in that
+location? Should files be looked for in the temporary location before
+they are looked for without a specified location, or should it be the
+other way round?
+
+
+
+
+
+\section{Contributors}
+
+[The \package{fontinst} source has been pretty inconsistent in how
+people are credited for what they have done---some appear only as
+acronyms while others appear as rather striking e-mail addresses---so
+I thought it best that this is shaped up a bit. My suggestion is that
+we use names or acronyms in the source and move everything else here.
+I also thought it could be interesting with a short description of
+what each person has done and is doing, so I have started ever so
+slightly on something along those lines. Feel free to add things! /LH]
+
+\medskip
+
+The following people have contributed substantial amounts of code or
+documentation to \package{fontinst}. They are listed in strict
+alphabetical order.
+
+\begin{description}
+ \item[Thierry Bouche]
+ Thierry saw to that the \texttt{T1} encoded fonts got font
+ dimensions comparable to the \texttt{ec} fonts. Thierry is also
+ the author of several papers (published in the \textit{Cahiers
+ GUTenberg} and \textit{TUGboat}) which deal with non-trivial
+ applications of \package{fontinst}, such as creating metrics for
+ Adobe Minion Multiple Master fonts and developing a corresponding
+ math font setup.
+
+ E-mail: \texttt{Thierry.Bouche@ujf-grenoble.fr}
+
+ \item[Lars Hellstr\"om (LH)]
+ Lars is responsible for most of the things in v\,1.9 that were
+ not there in v\,1.8.
+
+ Lars is currently a member of the \package{fontinst}
+ maintenance team. He is also a Ph.D.\ in mathematics looking for
+ employment.
+
+ \item[Alan Jeffrey (ASAJ)]
+ Alan is the original author of \package{fontinst}. He is not
+ currently on the development team, but he is still managing the
+ \package{fontinst} mailing list.
+
+ E-mail (\package{fontinst} mailing list subscriptions):%
+ \nobreak\hfill\penalty0\hskip -2em plus -1fill\ \relax
+ \vadjust{}\nobreak\hskip 2em\relax
+ \texttt{fontinst-request@cogs.susx.ac.uk}.
+
+ \item[Constantin Kahn (CK)]
+ Constantin is one (Sebastian is the other) of the original coauthors
+ of the current |\latinfamily| command.
+ % \footnote{Am I right about this? It's a bit before my time,
+ % I've just read \texttt{CHANGES}. /LH}
+
+ \item[Rowland McDonnell]
+ Rowland rewrote Alan's old v\,1.5 documentation for
+ \package{fontinst} and updated it for v\,1.8.
+
+ \item[Sebastian Rahtz (SPQR)]
+ Sebastian is one (Constantin is the other) of the original coauthors
+ of the current |\latinfamily| command. He has also contributed
+ numerous ETX files and made the ``unofficial'' v\,1.6 and v\,1.7,
+ which included the first \package{fontinst} support for making
+ \texttt{TS1} encoded files.
+
+ \item[Ulrik Vieth (UV)]
+ Ulrik converted \texttt{fontinst.sty} to \package{doc}\slash
+ \package{docstrip} format, reunited Alan's v\,1.511 and
+ Sebastian's v\,1.7, and made the first official release of
+ \package{fontinst} (v\,1.8) for more than two years.
+
+ Ulrik is currently a member of the \package{fontinst}
+ maintenance team. He is also involved in the Joint TUG\slash
+ \LaTeX~3 Project Working Group on extended math font encodings.
+
+ \item[\textellipsis]
+\end{description}
+Anyone else?
+
+
+\section{To do}
+
+This section is based on the \texttt{TODO} file from \package{fontinst}
+v\,1.504, but a couple of new entries have been added and some have
+been equipped with comments.
+
+\subsection{Things to do in the ``near'' future}
+
+\begin{itemize}
+ \item
+ Update documentation. (Lars, knowing he isn't saying anything new)
+
+ \item
+ Rewrite the entire substitution mechanism from scratch! The main
+ problem with the current mechanism is that it only allows one
+ substitution per shape and one per series. One cannot substitute
+ the |it| shape for both the |sl| and the |ui| shapes since each
+ new |\substitute|(|noisy|\textbar|silent|) with |it| in the
+ \meta{from} argument will overwrite the setting made by the
+ previous;
+ \begin{quote}
+ |\substitutenoisy{ui}{it}|\\
+ |\substitutesilent{sl}{it}|
+ \end{quote}
+ is effectively the same as
+ \begin{quote}
+ |\substitutesilent{sl}{it}|
+ \end{quote}
+ Another big problem is that it isn't well defined what the
+ substitution mechanism should do. (Lars)
+
+ I've got a sketch for a new substitution mechanism, but I'm not
+ at all sure it will make it into any v\,1.9xx. /LH
+ (The code that was written is now in \texttt{fimain.dtx}, but
+ it's not included in any of the generated files.)
+
+ An alternative to substitutions is to use explicit
+ |\installfontas| commands. This provides complete control. /LH
+
+ \item
+ Consider removing the following unreliable fakes from
+ \texttt{textcomp.mtx}:
+ \begin{quote}
+ \texttt{asciiacutedbl}, \texttt{asciigravedbl},
+ \texttt{bardbl}, \texttt{openbracketleft}, and
+ \texttt{openbracketright}
+ \end{quote}
+ and consider adding fakes for the following unavailable glyphs:
+ \begin{quote}
+ \texttt{dollaroldstyle} (use \texttt{dollar}),
+ \texttt{centoldstyle} (use \texttt{cent}), \texttt{lira} (use
+ \texttt{sterling}), and \texttt{pilcrow} (use
+ \texttt{paragraph})
+ \end{quote}
+ These suggestions are of course open for debate. (Ulrik)
+
+ \item
+ One thing I miss in [the typeset form of an encoding
+ specification] is a simple hex/octal/decimal chart showing all
+ the character names in their positions (and ideally even an
+ example of the printed character, although I know that would be
+ harder). (Karl Berry)
+
+\end{itemize}
+
+
+\subsection{Things that probably won't be done in the near future}
+
+\begin{itemize}
+ \item
+ Find a way to automatically generate math fonts. (Alan)
+
+ I doubt that this will ever be possible to do automatically.
+ \package{mathptm} and \package{mathptmx} are already hackish enough,
+ not to mention the prototype implementations for new math font
+ encodings. /UV
+
+ \item
+ Investigate using Alternate sets. (Alan)
+
+ AFAIK, Thierry Bouche has done some work with alternate sets
+ for AGaramond, ACaslon and Minion, but this implies a lot of
+ manual work to compose the proper calls to \package{fontinst}. /UV
+
+ \item
+ Create \LaTeX\ packages? In fact, rethink the whole package
+ interface \textellipsis\ (Alan)
+
+ Sebastian's Perl front-end to \package{fontinst} does create trivial
+ \LaTeX\ packages automatically for the CTAN fonts. /UV
+
+ \item
+ Worry about excessive kern tables in \texttt{T1} fonts. (Alan)
+
+ I think the best way to get at this would be to write a program
+ that can optimize (for size) kern tables by making use of the |SKIP|
+ instruction. There's often room for quite a lot of compression.
+ Such a program would however have to be written in some compiling
+ language, otherwise it wouldn't be fast enough. /LH
+
+ \item
+ Consider making |\set|(|left|\textbar|right|)|kerning| parameterized
+ by the size of the other glyph, eg so that faking |<Asmall><T>| can
+ be different from |<Aacutesmall><T>|. Suggested by Hilmar Schlegel.
+
+\end{itemize}
+
+
+\subsection{Things that have been done}
+
+\begin{itemize}
+ \item
+ Update documentation (comments from Karl and Damian).
+
+ Rowland has meritoriously done the update requested here. On the
+ other hand, it needs to be updated again, since many new features
+ have been added. /LH
+
+ \item
+ Investigate using raw SC fonts. (Alan)
+
+ This problem comes up on the mailing list from time to time.
+ The problem is that \package{fontinst}'s |\latinfamily| command
+ is geared towards fonts that come with standard and expert font
+ sets (as with Adobe and Monotype fonts) rather than fonts that
+ come with standard and small caps (as with Linotype fonts).
+ I'm afraid it would be to complicated to handle both cases
+ in the same |\latinfamily| procedure. /UV
+
+ \item
+ Investigate problems with duplicate kerns appearing in VPL files
+ (Hilmar Schlegel).
+
+ The problem has been investigated and is solved with v\,1.9. /LH
+
+ \item
+ Find out why, if you have a font with both medium and light variants
+ but no italic, you get |m|/|it| $\mapsto$ |l|/|it| $\mapsto$
+ |l|/|sl| rather than |m|/|it| $\mapsto$ |m|/|sl|.
+ (Sebastian).
+
+ Because for every shape that \package{fontinst} is allowed to use
+ a given font for, it will perform all possible series substitutions.
+ If the |\installfont| for |l|/|sl| came before the |\installfont| for
+ |m|/|sl|, then substitutions will be as described above. See also
+ item about the substitution mechanism. /LH
+
+ \item
+ AFM files can contain real units, not just integers. (Gintautas
+ Grigelionis).
+
+ This is fixed with v\,1.9. /LH
+
+ \item
+ Make \texttt{fontdoc.sty} and co.\ use PS fonts. (Alan)
+
+ I think |\useexamplefont| and friends (introduced with v\,1.8)
+ pretty much do what was intended here. /LH
+
+ \item
+ \texttt{latin.mtx} uses \package{fontinst} rather than
+ \package{fontdoc}! (Rob Hutchings).
+
+ \item
+ Allow |.vpl| files to be read as |.pl| files. (Constantin)
+
+ \item
+ Richard Walker reports that if you say
+ \begin{quote}
+ |\latinfamily{mbvx}{}|\\
+ |\latinfamily{mbv9}{}|
+ \end{quote}
+ then the 2nd run doesn't use old-style digits, because the 1st run
+ has already defined |\digit|. If so, this is because |\latinfamily|
+ is missing a bracing level. I should investigate.
+
+ I think it is best to do oldstyle and non-oldstyle variants in two
+ separate fontinst runs, i.e. don't use |\latinfamily| more than once
+ in a single run. (IIRC, grouping doesn't work properly since
+ every single font closes and reopens a |\begingroup|-|\endgroup|
+ pair to encapsulate the kerning info\footnote{And glyph metrics
+ info, and glyph mapcommands info \textellipsis /LH} or something
+ like that.) /UV
+
+ \item
+ Consider writing an |\installfontas| command which doesn't
+ generate a (V)PL but makes an entry in the FD file.
+ Typical usage: Install an \texttt{sc} shape of a \texttt{TS1}
+ font family by using the font made for the \texttt{n} shape.
+ (Lars)
+
+ Done. The described installation for the \texttt{m} series of the
+ \texttt{ptm} font family can be done through
+ \begin{quote}
+ |\installfontas{ptmr8c}{TS1}{ptm}{m}{sc}{}|
+ \end{quote}
+ Note however that you need to do it in each series explicitly. /LH
+
+ \item
+ Use the \texttt{StdVW} property from AFM 4.0 files instead of the
+ width of \textit{I} for standard stem fontdimen. Pointed out by
+ Hilmar Schlegel.
+
+ Partially done. |\afmtomtx| writes a
+ |\setint{verticalstem}|\marg{value} when it encounters a
+ \texttt{StdVW} property. The ETX files have not yet (2000/05/30)
+ been changed to use this value. /LH
+
+ \item
+ \package{fontdoc} has a problem with glyph, integer, string,
+ etc.\ names that contains underscores, since these will cause
+ \TeX\ to jump to math mode when one tries to typeset these things.
+ Unfortunately \package{fontinst} itself writes two such integers:
+ \texttt{descender_neg} and \texttt{maxdepth_neg}. There are at
+ least three solutions to this. The first is to make underscore an
+ `other' character throughout, but this might break some comments in
+ MTX and ETX files. The second is to temporarily change the catcode
+ in the arguments of the commands, but that will complicate the
+ definitions of almost all \package{fontdoc} commands dramatically.
+ The third is to declare this as unsupported by \package{fontdoc} and
+ change \package{fontinst} so that the troublesome integers are
+ renamed, e.g.\ \texttt{descender-neg} and \texttt{maxdepth-neg}, but
+ this can break people's code. (Lars)
+
+ After thinking about it for a couple of months, I realized that
+ none of the above is the right solution. That is instead to use
+ something similar to the harmless character strings of the
+ \package{xdoc} package when typesetting names of variables etc.\
+ in \package{fontdoc}. This got implemented in v\,1.916. /LH
+
+ \item
+ Modify the (V)PL-to-MTX converter so that |\setint|\discretionary
+ {}{}{}|{fontdimen(|\meta{n}|)}|\discretionary{}{}{}|{\int|%
+ \marg{name}|}| commands in the ETX file declare that
+ \texttt{PARAMETER} (or equivalent) properties for fontdimen
+ \meta{n} should be converted to |\setint| commands for the integer
+ \meta{name}. This ought to be particularly useful for math fonts.
+ (Lars)
+
+ Done with v\,1.917, but only for the new \cs{setfontdimen}
+ command. /LH
+
+ \item
+ Update \texttt{fontdoc.sty} and co.\ for \LaTeXe. (Alan)
+
+ \texttt{fontdoc.sty} underwent a major overhaul from v\,1.916 on,
+ so I suspect this can be said to have been done now. The basic
+ vertical spacing put in by \cs{Aheading} and \cs{Bheading} may
+ however need more work; sometimes it doesn't come out as one
+ would want it to. /LH
+
+ \item
+ \texttt{latin.mtx} fakes composite SC glyphs [kerning?] from the
+ composite glyph, eg.
+ \begin{quote}
+ |\setleftrightkerning{Aacutesmall}{Aacute}{900}|,
+ \end{quote}
+ rather than from the SC non-composite, eg.
+ \begin{quote}
+ |\setleftrightkerning{Aacutesmall}{Asmall}{1000}|
+ \end{quote}
+ This may cause problems with SC fonts with explicit SC--C kerns,
+ eg.
+ \begin{quote}
+ |\setkern{V}{Asmall}{100}|
+ \end{quote}
+ This needs to be thought about. Pointed out by Hilmar Schlegel.
+
+ \texttt{newlatin.mtx} does this right; shrunk glyphs get shrunk
+ kerning, whereas constructed glyphs get kerning from the base
+ letter. /LH
+
+\end{itemize}
+
+
+\subsection{Other notes}
+
+Alan's \texttt{TODO} file also contains some items regarding
+\package{mathptm}, but that seems to have migrated out of
+\package{fontinst} (if it ever really was a part). The problem is that
+\package{mathptm} cannot be changed any more for the sake of checksum
+consistency and backwards compatibility. A new variant called
+\package{mathptmx} tries to do a little better, but there may still be
+room for improvements.
+
+
+
+\section{Efficiency}
+
+This section records the results of some (rather simple) test runs
+that have been made to test the efficiency of \package{fontinst},
+primarily to see how changes in the implementation affect efficiency
+by comparing the time and space used by different \package{fontinst}
+versions to complete the same task.
+
+
+\subsection{Alan Jeffrey's tests}
+\label{Ssec: ASAJ tests}
+
+I compared the version where you try to keep ints as |\mathchardef|s
+with the version where you don't bother, and for a sample font without
+|\mathchardef|s I got:
+\begin{quote}
+ 114673 words of memory out of 150001\\
+ Time elapsed: 135.0 seconds
+\end{quote}
+and with, I got:
+\begin{quote}
+ 114050 words of memory out of 150001\\
+ Time elapsed: 134.5 seconds
+\end{quote}
+so I've saved a little memory and time. Not brilliant, but I may as
+well keep it in.
+
+Where possible, we avoid re-scaling kerns, which saves a bit of time
+and memory. With a sample font, the version where we didn't avoid
+re-scaling used:
+\begin{quote}
+ 114050 words of memory out of 150001\\
+ Time elapsed: 134.5 seconds
+\end{quote}
+whereas the version where we do avoid it used:
+\begin{quote}
+ 113786 words of memory out of 150001\\
+ Time elapsed: 124.9 seconds
+\end{quote}
+
+We keep the names of the glyphs to kern with as |\l-|\meta{name} and
+|\r-|\meta{name} to save on token space, and this got the resources
+used down to:
+\begin{quote}
+ 88574 words of memory out of 150001\\
+ Time elapsed: 106.1 seconds
+\end{quote}
+Keeping track of the kern amounts as |\|\meta{amount} got the resources
+used down to:
+\begin{quote}
+ 75424 words of memory out of 150001\\
+ Time elapsed: 97.2 seconds
+\end{quote}
+Mind you, I then added all the |\transformfont| stuff, and it went
+back to:
+\begin{quote}
+ 77079 words of memory out of 150001\\
+ Time elapsed: 97.7 seconds
+\end{quote}
+
+
+
+\subsection{Current tests}
+
+The setup for this test is that \TeX\ is run on a \texttt{.tex} file
+consisting of the following commands.
+\begin{quote}
+ |\batchmode|\\
+ |\input fontinst.sty|\\
+ |\latinfamily{pad}{}|\\
+ |\tracingstats=1\bye|
+\end{quote}
+All the font metrics are generated from the AFM files; temporary MTX,
+PL, and VPL files are deleted between test runs. The format used was
+generated by typing |\dump| at ini\TeX's |**| prompt; thus there is no
+overhead from a typesetting format in the space requirements.
+
+[It appears the exact data from these tests will have to wait, since
+I haven't been able to get access to any computer with reliable
+process timing. For the next release perhaps \textellipsis\ /LH]
+
+% The \TeX\ version used is \TeX~3.14159. The \TeX\ implementation used
+% is te\TeX~0.9 (Web2C~7.2), running on a
+%
+% The \emph{input sources} figure lists how many items are used on
+% \TeX's stack for simultaneous input sources. As an input source in
+% this context is considered not only input files, but also (and mainly)
+% various token lists. Most of these token lists are replacement texts
+% and parameters of macros, but token list items on this stack also come
+% from expansions of |\the| (not only when applied to a |\toks| register)
+% and the like. The input source stack sizes of normal \TeX\
+% implementations are usually several times larger than what
+% \package{fontinst} uses, so this particular resource shouldn't cause
+% any trouble.
+%
+% The \emph{parameter} figure is the maximal number of macro parameters that
+% \TeX\ has to remember at any one time. The reason this number is
+% greater than 9 is that it counts parameters in \emph{all} macros that
+% are on the input sources stack, not just those in the top one. The
+% same remark about the likelyhood of \TeX\ running out of this resource
+% during a \package{fontinst} run as for input sources applies for
+% parameters.
+%
+% The \emph{buffer characters} stack holds lines read from input files that
+% are partially tokenized (if several files are on the input sources
+% stack then \TeX\ must remember the last line read from each of them) and
+% characters for |\csname| \textellipsis |\endcsname| constructions that
+% are being expanded. This shouldn't cause any trouble either.
+%
+% The \emph{save values} figure is the maximum number of items on \TeX's
+% save stack at any time. \package{fontinst} uses massive amounts of
+% space here (compared to normal \TeX\ documents), but there isn't much
+% that can be done about this since \package{fontinst} uses \TeX's
+% grouping mechanism to clear data for one font from memory before
+% processing begins with the next.
+%
+% The \emph{multiletter control sequences} figure is exactly
+% that---the number of control sequences whose names consist of more than
+% one character. When these become too many, \TeX\ complains that its
+% hash table is full. Some of these control sequences are macros that
+% \package{fontinst} uses in a procedure-like manner, but many of them are
+% rather used as data tables. As a comparision of the figure I might
+% mension that my \LaTeX\ used 3748 multiletter control sequences for
+% typesetting this document, so \package{fontinst} rather average in
+% this respect (perhaps a bit above, but not much).
+%
+% The \emph{strings} figure tells how many items \TeX\ put in its string
+% pool and the \emph{string characters} figure tells how many characters
+% these contain altogether. There are two main categories of things that
+% occur here: names of multiletter control sequences and \TeX's builtin
+% error messages. One thing which certainly doesn't occur here is the
+% texts you save using \package{fontinst}'s |\setstr| command; these will
+% instead become token lists and occupy main memory space (the \emph{names}
+% of string variables will however become part of a control sequence name,
+% so that will be stored as a string). Unlike some other \TeX\
+% implementations however, the Web2C \TeX\ seems to only report new
+% entries in the string pool, so the \emph{strings} and \emph{string
+% characters} figures below do not include the builtin error messages.
+% On the other hand, they don't include the names of the 322 primitive
+% multiletter control sequences either, which is why the figures below
+% report more control sequences than strings.
+%
+% The \emph{main memory}, finally, is where \TeX\ stores almost
+% everything else (I've skipped some of the memory categories \TeX\
+% reports since they are ``only'' used for typesetting), most notably
+% tokens. Each token occupies one word of memory. I don't think
+% \package{fontinst}'s consumption of main memory is that high (in
+% comparision with normal \LaTeX\ jobs) since \package{fontinst} doesn't
+% have to store any boxes here and thus frees space for more tokens.
+%
+% \begin{description}
+% \item[v\,1.801]
+% \consumption{126.68}{%954.9
+% % 5261 strings out of 8681
+% % 54607 string characters out of 136047
+% % 112422 words of memory out of 200001
+% % 3814 multiletter control sequences out of 10000
+% % 8 words of font info for 0 fonts, out of 180000 for 256
+% % 0 hyphenation exceptions out of 2551
+% % 30i,0n,42p,220b,1696s stack positions out of 600i,150n,200p,3000b,4094s
+% 3903 strings out of 13688
+% 42612 string characters out of 101822
+% 112422 words of memory out of 263001
+% 3961 multiletter control sequences out of 10000+0
+% 7 words of font info for 0 fonts, out of 200000 for 1000
+% 0 hyphenation exceptions out of 1000
+% 30i,0n,42p,220b,1770s stack positions out of 300i,100n,500p,30000b,4000s
+% }% Compulsory comment; TeX inserts a & at the end of this line
+% % as a side-effect of the implementation of \consumption.
+% \item[v\,1.902]
+% \consumption{139.59}{%997.4
+% % 6196 strings out of 8681
+% % 69530 string characters out of 136047
+% % 112617 words of memory out of 200001
+% % 4749 multiletter control sequences out of 10000
+% % 8 words of font info for 0 fonts, out of 180000 for 256
+% % 0 hyphenation exceptions out of 2551
+% % 28i,0n,42p,220b,2004s stack positions out of 600i,150n,200p,3000b,4094s
+% 4690 strings out of 13688
+% 52734 string characters out of 101822
+% 112613 words of memory out of 263001
+% 4748 multiletter control sequences out of 10000+0
+% 7 words of font info for 0 fonts, out of 200000 for 1000
+% 0 hyphenation exceptions out of 1000
+% 28i,0n,42p,220b,2000s stack positions out of 300i,100n,500p,30000b,4000s
+% }%
+% Comparing the figures for v\,1.902 with those of v\,1.801, there
+% are mainly three things which are of interest. The first is that
+% the number of items on the save stack have increased quite a lot.
+% Most of this is due to the mechanism by which \package{fontinst}
+% avoids writing multiple kerns to (V)PL files. The second thing to
+% notice is that the number of control sequences has increased quite
+% dramatically (over 20\%). This is to be expected, as a number of
+% new features have been added and the implementation of these
+% features requires many new macros.
+%
+% Some 200 of these new control sequences are however not there
+% because of new features, but because of a silly implementation of
+% how slot numbers for glyphs are stored. In an attempt to save
+% tokens, I (LH) stored these numbers as control sequence names
+% rather than token sequences, just like kern amounts have been
+% stored for some time now. One notable feature of kern
+% amounts is however that although these may assume just about any
+% value you can think of, within any given font family they tend to
+% assume only a handful of values. This means that the number of
+% hash positions occupied by such control sequences is never very
+% large and the storage is efficient. On the other hand, the set of
+% slot numbers that occur usually consists of all integers in the
+% range 0--255, with each slot number occuring in at most one
+% position. This means that the storage method, although efficient
+% in the number of tokens, really squanders space in the hash table.
+% A much better method (which should be implemented, once I get round
+% to it) is to store slot numbers in the character codes of `ordinary'
+% tokens.
+%
+% The third noticable thing is that although the number of macros
+% has grown quite a lot, the amount of main memory used has hardly
+% increased at all! Some of this is probably due to that the ENC to
+% ETX converter was moved to \texttt{finstmsc.sty}, since this
+% consists of only two macros but lots of tokens. Another factor
+% that has probably helped is that |\glyph| now avoids rescaling a
+% glyph by one thousand; this saves 9 tokens for each time
+% |\glyph|\marg{name}|{1000}| gets executed.
+% \item[v\,1.907]
+% \consumption{138.88}{%1019.9
+% % 6226 strings out of 8681
+% % 69918 string characters out of 136047
+% % 113820 words of memory out of 200001
+% % 4779 multiletter control sequences out of 10000
+% % 8 words of font info for 0 fonts, out of 180000 for 256
+% % 0 hyphenation exceptions out of 2551
+% % 28i,0n,42p,220b,2006s stack positions out of 600i,150n,200p,3000b,4094s
+% % 6225 strings out of 8681
+% 4719 strings out of 13688
+% 53105 string characters out of 101822
+% 113814 words of memory out of 263001
+% 4777 multiletter control sequences out of 10000+0
+% 7 words of font info for 0 fonts, out of 200000 for 1000
+% 0 hyphenation exceptions out of 1000
+% 28i,0n,42p,220b,2002s stack positions out of 300i,100n,500p,30000b,4000s
+% }%
+% This is pretty much what could be expected. A couple of new
+% features have been added, so naturally some of the numbers have
+% grown a little.
+% \item[v\,1.908]
+% This version is devoted to optimizing \package{fontinst}.
+%
+% The first idea was to avoid moving the contents of
+% |\glyph_map_commands| and |\glyph_map_fonts| to a macro and back
+% again each time these are updated. This changed the numbers to
+% \consumption{135.64}{%
+% 4719 strings out of 13688
+% 53105 string characters out of 101822
+% 113810 words of memory out of 263001
+% 4777 multiletter control sequences out of 10000+0
+% 7 words of font info for 0 fonts, out of 200000 for 1000
+% 0 hyphenation exceptions out of 1000
+% 28i,0n,42p,220b,2002s stack positions out of 300i,100n,500p,30000b,4000s
+% }%
+% Hence I've earned a few seconds.
+%
+% The next idea is to expand the |\space|s in |\out_lline| and
+% friends when these are defined, instead of expanding them anew
+% each time an output line is written.
+% \item[v\,1.909]
+% \consumption{}{%1159.8 % Ow! It's getting worse.
+% % 6155 strings out of 8681
+% % 68824 string characters out of 136047
+% % 113918 words of memory out of 200001
+% % 4708 multiletter control sequences out of 10000
+% % 8 words of font info for 0 fonts, out of 180000 for 256
+% % 0 hyphenation exceptions out of 2551
+% % 28i,0n,42p,220b,1982s stack positions out of 600i,150n,200p,3000b,4094s
+% }
+% \item[v\,1.910]
+% \consumption{}{%1031.6 % Perhaps not ...
+% % 5949 strings out of 8681
+% % 68261 string characters out of 136047
+% % 113840 words of memory out of 200001
+% % 4502 multiletter control sequences out of 10000
+% % 8 words of font info for 0 fonts, out of 180000 for 256
+% % 0 hyphenation exceptions out of 2551
+% % 28i,0n,42p,220b,1756s stack positions out of 600i,150n,200p,3000b,4094s
+% }
+% \end{description}
+%
+
+
+\begin{thebibliography}{99}
+\bibitem{Fontname}
+ Karl Berry: \textit{Fontname}, CTAN:\discretionary{}{}{}%
+ \texttt{info}\slash \texttt{fontname}\slash \texttt{fontname.texi}
+ (and most of the other files in that directory as well).
+\bibitem{mfnt}
+ Matthias Clasen and Ulrik Vieth:
+ \texttt{mfnt} (their ``work with math fonts''), 1997--8,
+ see \textsc{http}:/\slash \texttt{www.tug.org}\slash
+ \texttt{twg}\slash \texttt{mfg}\slash\texttt{archives}/.
+\bibitem{LaTeX-companion}
+ Michel Goossens, Frank Mittelbach, Alexander Samarin:
+ \textit{The \LaTeX\ Companion},
+ Ad\-di\-son-Wes\-ley, Reading, MA, USA, 1994.
+ % Addison and Wesley are names of two persons, but they
+ % should be joined by a hyphen since Addison-Wesley is
+ % a company name. Tricky that.
+\bibitem{LaTeX-graph-comp}
+ Michel Goossens, Sebastian Rahtz, Frank Mittelbach:
+ \textit{The \LaTeX\ Graphics Companion: Illustrating Documents with
+ \TeX\ and PostScript},
+ Ad\-di\-son-Wes\-ley, Reading, MA, USA, 1997;
+ ISBN~0-201-85469-4.
+\bibitem{TAOCP2}
+ Donald E.\ Knuth: \textit{The art of computer programming},
+ vol.~2 (\textit{Seminumerical algorithms}), 3rd ed.,
+ Ad\-di\-son-Wes\-ley, 1997.
+\bibitem{TeXbook}
+ Donald E.\ Knuth, Duane Bibby (illustrations):
+ \textit{The \TeX book},
+ Ad\-di\-son-Wes\-ley, 1991, ISBN~0-201-13448-9;
+ also volume A of \textit{Computers and typesetting},
+ ISBN~0-201-13447-0.
+\bibitem{fntguide}
+ \LaTeX3 Project Team: \textit{\LaTeXe{} font selection},
+ CTAN: \texttt{macros}\slash
+ \texttt{latex}\slash\texttt{base}\slash\texttt{fntguide.tex}.
+\end{thebibliography}
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/source/fitrig.dtx b/fonts/utilities/fontinst/source/fitrig.dtx
new file mode 100644
index 0000000000..9d369b3772
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fitrig.dtx
@@ -0,0 +1,326 @@
+% \CheckSum{209}
+% \iffalse meta-comment
+%
+% trig.dtx Copyright (C) 1993 1994 1995 1996 1997 1999 David Carlisle
+% Inlined as fitrig.dtc 2005 Lars Hellstr"om
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+%%% From file: fitrig.dtx
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{fisource}
+\title{The \textsf{trig} package inlined into \package{fontinst}}
+\author{David Carlisle\\Edited by Lars Hellstr\"om}
+\begin{document}
+\maketitle
+\DocInput{fitrig.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% The predecessor of this file is v\,1.09 of \texttt{trig.dtx}, the
+% source for the \package{trig} package in the standard \LaTeX\
+% ``graphics'' bundle. It has been inlined into the \package{fontinst}
+% source mainly because archive maintainers never seem to tire of
+% questioning the need to provide \texttt{trig.sty} with
+% \package{fontinst}.
+%
+% \changes{1.930}{2005/02/06}{Inlined the \package{trig} package into
+% \texttt{fontinst.sty} and friends. (LH)}
+%
+%
+% \section{Trigonometrical functions}
+%
+% These macros implement the trigonometric functions, sin, cos and tan.
+% In each case two commands are defined. For instance the command
+% |\CalculateSin{33}| may be isued at some point, and then anywhere
+% later in the document, the command |\UseSin{33}| will return the
+% decimal expansion of $\sin(33^\circ)$.
+%
+% The arguments to these macros do not have to be whole numbers,
+% although in the case of whole numbers, \LaTeX\ or plain \TeX\ counters
+% may be used. In \TeX{}Book syntax, arguments must be of type:
+% \meta{optional signs}\meta{factor}
+%
+% Some other examples are:\\
+% |\CalculateSin{22.5}|, |\UseTan{\int{myvar}}|,
+% |\UseCos{\count@}|.
+%
+% Note that unlike the psfig macros, these save all previously
+% computed values. This could easily be changed, but I thought that in
+% many applications one would want many instances of the
+% same value. (eg rotating all the headings of a table by the
+% \emph{same} amount).
+%
+% I don't really like this need to pre-calculate the values, I
+% originally implemented |\UseSin| so that it automatically calculated
+% the value if it was not pre-stored. This worked fine in testing, until
+% I remembered why one needs these values. You want to be able to say
+% |\dimen2=\UseSin{30}\dimen0|. Which means that |\UseSin| must
+% \emph{expand} to a \meta{factor}.
+%
+% \StopEventually{}
+%
+%
+% \subsection{The Macros}
+%
+% \begin{macrocode}
+%<*pkg>
+% \end{macrocode}
+%
+% \begin{macro}{\nin@ty}\begin{macro}{\@clxxx}
+% \changes{1.930}{2005/02/06}{Renamed this constant. There should be
+% three \texttt{x}s in \cs{romannumeral} 180, but \package{trig}
+% only had two. (LH)}
+% \begin{macro}{\@lxxi}\begin{macro}{\@mmmmlxviii}
+% Some useful constants for converting between degrees and radians.
+% $$
+% \frac{\pi}{180}\simeq\frac{355}{113\times180}=\frac{71}{4068}
+% $$
+% \begin{macrocode}
+\chardef\nin@ty=90
+\chardef\@clxxx=180
+\chardef\@lxxi=71
+\mathchardef\@mmmmlxviii=4068
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% The approximation to $\sin$. I experimented with various
+% approximations based on Tchebicheff polynomials, and also some
+% approximations from a SIAM handbook `Computer Approximations' However
+% the standard Taylor series seems sufficiently accurate, and used by
+% far the fewest \TeX\ tokens, as the coefficients are all rational.
+% \begin{eqnarray*}
+% \sin(x)& \simeq&
+% x - (1/3!)x^3 + (1/5!)x^5 - (1/7!)x^7 + (1/9!)x^9\\
+% &\simeq&
+% \frac{((((7!/9!x^2-7!/7!)x^2+7!/5!)x^2 +7!/3!)x^2+7!/1!)x}{7!}\\
+% &=& \frac{ ((((1/72x^2-1)x^2+42)x^2 +840)x^2+5040)x }{5040}
+% \end{eqnarray*}
+% The nested form used above reduces the number of operations required.
+% In order to further reduce the number of operations, and more
+% importantly reduce the number of tokens used, we can precompute the
+% coefficients. Note that we cannot use $9!$ as the denominator as
+% this would cause overflow of \TeX's arithmetic.
+%
+% \begin{macro}{\@coeffz}
+% \begin{macro}{\@coeffa}
+% \begin{macro}{\@coeffb}
+% \begin{macro}{\@coeffc}
+% \begin{macro}{\@coeffd}
+% Save the coefficients as |\|(|math|)|char|s.
+% \begin{macrocode}
+\chardef\@coeffz=72
+%\chardef\@coefa=1
+\chardef\@coefb=42
+\mathchardef\@coefc=840
+\mathchardef\@coefd=5040
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\TG@rem@pt}
+% The standard trick of getting a real number out of a \meta{dimen}.
+% This gives a maximum accuracy of approx.\ 5 decimal places, which
+% should be sufficient. It puts a space after the number, perhaps it
+% shouldn't.
+% \changes{1.930}{2005/02/06}{Using \cs{lose_measure}. (LH)}
+% \begin{macrocode}
+\def\TG@rem@pt#1{\expandafter\lose_measure\the#1\space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TG@term}
+% Compute one term of the above nested series. Multiply the previous
+% sum by $x^2$ (stored in |\@tempb|, then add the next coefficient,
+% |#1|.
+% \begin{macrocode}
+\def\TG@term#1{
+ \dimen@\@tempb\dimen@
+ \advance\dimen@ #1\p@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TG@series}
+% Compute the above series. The value in degrees will be in
+% |\dimen@| before this is called.
+% \begin{macrocode}
+\def\TG@series{
+ \dimen@\@lxxi\dimen@
+ \divide \dimen@ \@mmmmlxviii
+% \end{macrocode}
+% |\dimen@| now contains the angle in radians, as a \meta{dimen}.
+% We need to remove the units, so store the same value as a
+% \meta{factor} in |\@tempa|.
+% \begin{macrocode}
+ \edef\@tempa{\TG@rem@pt\dimen@}
+% \end{macrocode}
+% Now put $x^2$ in |\dimen@| and |\@tempb|.
+% \begin{macrocode}
+ \dimen@\@tempa\dimen@
+ \edef\@tempb{\TG@rem@pt\dimen@}
+% \end{macrocode}
+% The first coefficient is $1/72$.
+% \begin{macrocode}
+ \divide\dimen@\@coeffz
+ \advance\dimen@\m@ne\p@
+ \TG@term\@coefb
+ \TG@term{-\@coefc}%
+ \TG@term\@coefd
+% \end{macrocode}
+% Now the cubic in $x^2$ is completed, so we need to multiply by
+% $x$ and divide by $7!$.
+% \begin{macrocode}
+ \dimen@\@tempa\dimen@
+ \divide\dimen@ \@coefd
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{1.930}{2005/02/06}{Use \cs{x_cs} and \cs{if_undefined} where
+% appropriate. (LH)}
+%
+% \begin{macro}{\CalculateSin}
+% If this angle has already been computed, do nothing, else store
+% the angle, and call |\TG@@sin|. Computed sines are stored in
+% control sequences with names of the form
+% \describecsfamily{sin(\meta{number})}|\sin(|\meta{number}|)|.
+% \begin{macrocode}
+\def\CalculateSin#1{{%
+ \if_undefined{sin(\number#1)}\then
+ \dimen@=#1\p@
+ \TG@@sin
+ \x_cs\xdef{sin(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CalculateCos}
+% As above, but use the relation $\cos(x) = \sin(90-x)$. Computed
+% cosines are stored in control sequences with names of the form
+% \describecsfamily{cos(\meta{number})}|\cos(|\meta{number}|)|.
+% \begin{macrocode}
+\def\CalculateCos#1{{%
+ \if_undefined{cos(\number#1)}\then
+ \dimen@=\nin@ty\p@
+ \advance \dimen@ -#1\p@
+ \TG@@sin
+ \x_cs\xdef{cos(\number#1)}{\TG@rem@pt\dimen@}
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TG@@sin}
+% Repeatedly use one of the the relatations
+% $\sin(x)=\sin(180-x)=\sin(-180-x)$ to get $x$ in the range
+% $-90 \leq x\leq 90$. Then call |\TG@series|.
+% \begin{macrocode}
+\def\TG@@sin{%
+ \ifdim\TG@reduce>+%
+ \else\ifdim\TG@reduce<-%
+ \else\TG@series\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TG@reduce}
+% Slightly cryptic, but it seems to work\ldots\space
+% The first line is the condition for an |\ifdim|, the remaining
+% lines constitutes the `then' branch of that conditional.
+% \begin{macrocode}
+\def\TG@reduce#1#2{
+ \dimen@#1#2\nin@ty\p@
+ \advance\dimen@#2-\@clxxx\p@
+ \dimen@-\dimen@
+ \TG@@sin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UseSin}
+% \begin{macro}{\UseCos}
+% Use a pre-computed value.
+% \begin{macrocode}
+\def\UseSin#1{\csname sin(\number#1)\endcsname}
+\def\UseCos#1{\csname cos(\number#1)\endcsname}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% A few shortcuts to save space.
+% \begin{macrocode}
+\chardef\z@num\z@
+\x_cs\let{sin(0)} \z@num
+\x_cs\let{cos(0)} \@ne
+\x_cs\let{sin(90)} \@ne
+\x_cs\let{cos(90)} \z@num
+\x_cs\let{sin(-90)}\m@ne
+\x_cs\let{cos(-90)}\z@num
+\x_cs\let{sin(180)}\z@num
+\x_cs\let{cos(180)}\m@ne
+% \end{macrocode}
+%
+% \begin{macro}{\CalculateTan}
+% Originally I coded the Taylor series for tan, but it seems to
+% be more accurate to just take the ratio of the sine and cosine.
+% This is accurate to 4 decimal places for angles up to
+% $50^\circ$, after that the accuracy tails off, giving
+% $57.47894$ instead of $57.2900$ for $89^\circ$.
+%
+% Computed tangents are stored in control sequences with names of the
+% form \describecsfamily{tan(\meta{number})}|\tan(|\meta{number}|)|.
+% \begin{macrocode}
+\def\CalculateTan#1{{%
+ \if_undefined{tan(\number#1)}\then
+ \CalculateSin{#1}%
+ \CalculateCos{#1}%
+ \a_dimen\UseCos{#1}\p@
+ \divide \a_dimen \@iv
+ \b_dimen\UseSin{#1}\p@
+ \b_dimen\two@fourteen\b_dimen
+ \divide\b_dimen\a_dimen
+ \x_cs\xdef{tan(\number#1)}{\TG@rem@pt\b_dimen}
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UseTan}
+% Just like |\UseSin|.
+% \begin{macrocode}
+\def\UseTan#1{\csname tan(\number#1)\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\two@fourteen}
+% \begin{macro}{\@iv}
+% Two constants needed to keep the division within \TeX's range.
+% \begin{macrocode}
+\mathchardef\two@fourteen=16384
+\chardef\@iv=4
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Predefine $\tan(\pm90)$ to be an error.
+% \begin{macrocode}
+\x_cs\def{tan(90)}{\errmessage{Infinite tan !}}
+\expandafter\let
+ \csname tan(-90)\expandafter\endcsname \csname tan(90)\endcsname
+%</pkg>
+% \end{macrocode}
+%
+% \Finale
+%
+\endinput
+
diff --git a/fonts/utilities/fontinst/source/fontinst.ins b/fonts/utilities/fontinst/source/fontinst.ins
new file mode 100644
index 0000000000..fbde286b9d
--- /dev/null
+++ b/fonts/utilities/fontinst/source/fontinst.ins
@@ -0,0 +1,135 @@
+%
+% Copyright 1998, 1999, 2000, 2001 the fontinst maintenance team and any
+% individual authors listed elsewhere in this file. All rights reserved.
+%
+% This file is part of the fontinst system version 1.9.
+% -----------------------------------------------------
+%
+% It may be distributed under the terms of the LaTeX Project Public
+% License, as described in lppl.txt in the base LaTeX distribution.
+% Either version 1.1 or, at your option, any later version.
+%
+% This file may only be modified if (i) it is given another name and
+% (ii) all files the modified file generates using a nonempty subset
+% of the files listed in the arguments of \from commands below are
+% given the same preamble as that listed between \preamble and
+% \endpreamble below.
+%
+\input docstrip.tex
+\keepsilent
+
+\preamble
+
+This is a generated file.
+
+Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+hacked and maintained 1997, 1998 Sebastian Rahtz,
+copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 the fontinst
+maintenance team and any individual authors listed elsewhere in
+this file. All rights reserved.
+
+This file is part of the fontinst system version 1.9.
+-----------------------------------------------------
+
+It may be distributed under the terms of the LaTeX Project Public
+License, as described in lppl.txt in the base LaTeX distribution.
+Either version 1.1 or, at your option, any later version.
+
+\endpreamble
+
+\declarepreamble\docpreamble
+
+This is a generated file.
+
+Copyright 1993, 1994, 1995, 1996 Alan Jeffrey,
+hacked and maintained 1997, 1998 Sebastian Rahtz,
+copyright 1998, 1999, 2000, 2001 the fontinst maintenance team and any
+individual authors listed elsewhere in this file. All rights reserved.
+
+This file is part of the fontinst system version 1.9.
+-----------------------------------------------------
+
+It may be distributed under the terms of the LaTeX Project Public
+License, as described in lppl.txt in the base LaTeX distribution.
+Either version 1.1 or, at your option, any later version.
+This file may also be distributed by itself provided it is unchanged
+and accompanied by some prominent file which states the location of
+the sources for the fontinst system, from which this file was
+generated.
+
+\endpreamble
+
+
+
+
+
+\generate{%
+ \usedir{tex/fontinst/base}
+ \file{fontinst.sty}{%
+ \from{fibasics.dtx}{pkg}%
+ \from{ficommon.dtx}{pkg}%
+ \from{fimain.dtx}{pkg}%
+ \from{fitrig.dtx}{pkg}%
+ \from{ficonv.dtx}{pkg}%
+ \from{filtfam.dtx}{pkg,textcomp,debug}%
+ \from{fimapgen.dtx}{pkg}%
+ \from{fibasics.dtx}{pkg2}%
+ }%
+ \file{cfntinst.sty}{%
+ \from{fibasics.dtx}{pkg}%
+ \from{ficommon.dtx}{pkg}%
+ \from{fimain.dtx}{pkg,boundaryCompability}%
+ \from{fitrig.dtx}{pkg}%
+ \from{ficonv.dtx}{pkg}%
+ \from{filtfam.dtx}{pkg,textcomp,debug}%
+ \from{fimapgen.dtx}{pkg}%
+ \from{fibasics.dtx}{pkg2}%
+ }%
+ \file{xfntinst.sty}{%
+ \from{fibasics.dtx}{pkg}%
+ \from{ficommon.dtx}{pkg}%
+ \from{fimain.dtx}{pkg}%
+ \from{fitrig.dtx}{pkg}%
+ \from{ficonv.dtx}{pkg}%
+ \from{filtfam.dtx}{pkg,textcomp,debug,oldstyle}%
+ \from{fimapgen.dtx}{pkg}%
+ \from{fibasics.dtx}{pkg2}%
+ }%
+ \file{finstmsc.sty}{%
+ \from{fibasics.dtx}{pkg}%
+ \from{ficommon.dtx}{pkg}%
+ \from{fimain.dtx}{misc}%
+ \from{ficonv.dtx}{misc}%
+ \from{fimapgen.dtx}{map}%
+ \from{fibasics.dtx}{pkg2,misc}%
+ }%
+ \file{fontinst.ini}{\from{fibasics.dtx}{ini}}%
+ \usedir{tex/fontinst/misc}%
+ \file{csc2x.tex}{\from{ficonv.dtx}{reglyphfigures,reglyphletters,glyphs}}%
+ \file{csckrn2x.tex}{\from{ficonv.dtx}{reglyphfigures,reglyphletters}}%
+ \file{osf2x.tex}{\from{ficonv.dtx}{reglyphfigures,glyphs}}%
+ \usedir{tex/latex/misc}%
+ \usepreamble\docpreamble
+ \file{fontdoc.sty}{%
+ \from{fibasics.dtx}{doc}%
+ \from{ficommon.dtx}{doc}%
+ \from{fimain.dtx}{doc}%
+ \from{fimapgen.dtx}{doc}%
+ }%
+}
+
+% \OriginalAsk\answer{Do you wish to install trig.sty with fontinst? [y/n] }
+% \ifx \answer\y \let\answer\yes \fi
+% \ifx \answer\yes
+%
+% \usedir{tex/fontinst/base}
+% % From graphics.ins:
+% \preamble
+% \endpreamble
+%
+% \generate{\file{trig.sty}{\from{trig.dtx}{package}}}
+%
+% \fi
+
+\endbatchfile
+\endinput
diff --git a/fonts/utilities/fontinst/test/cc-pl.enc b/fonts/utilities/fontinst/test/cc-pl.enc
new file mode 100644
index 0000000000..161fe4345b
--- /dev/null
+++ b/fonts/utilities/fontinst/test/cc-pl.enc
@@ -0,0 +1,258 @@
+/encpcr [
+/Gamma
+/Delta
+/Theta
+/Lambda
+/Xi
+/Pi
+/Sigma
+/Upsilon
+/Phi
+/Psi
+/Omega
+/ff
+/fi
+/fl
+/ffi
+/ffl
+/dotlessi
+/dotlessj
+/grave
+/acute
+/caron
+/breve
+/macron
+/ring
+/cedilla
+/germandbls
+/ae
+/oe
+/oslash
+/AE
+/OE
+/Oslash
+/suppress
+/exclam
+/quotedblright
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+/eight
+/nine
+/colon
+/semicolon
+/exclamdown
+/equal
+/questiondown
+/question
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+/X
+/Y
+/Z
+/bracketleft
+/quotedblleft
+/bracketright
+/circumflex
+/dotaccent
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+/x
+/y
+/z
+/endash
+/emdash
+/hungarumlaut
+/tilde
+/dieresis
+/.notdef
+/Aogonek
+/Cacute
+/.notdef
+/.notdef
+/.notdef
+/Eogonek
+/.notdef
+/.notdef
+/.notdef
+/Lslash
+/Nacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Sacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Zacute
+/.notdef
+/Zdotaccent
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/aogonek
+/cacute
+/.notdef
+/.notdef
+/.notdef
+/eogonek
+/.notdef
+/.notdef
+/.notdef
+/lslash
+/nacute
+/.notdef
+/.notdef
+/guillemotleft
+/guillemotright
+/.notdef
+/sacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/zacute
+/.notdef
+/zdotaccent
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Oacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/oacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/quotedblbase
+] def
diff --git a/fonts/utilities/fontinst/test/comparemetrics.sty b/fonts/utilities/fontinst/test/comparemetrics.sty
new file mode 100644
index 0000000000..7864da8973
--- /dev/null
+++ b/fonts/utilities/fontinst/test/comparemetrics.sty
@@ -0,0 +1,941 @@
+% We start by making some default catcode assignments, in case we are
+% using ini\TeX{}.
+% \begin{macrocode}
+%<*pkg>
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\catcode`\^=7
+%</pkg>
+% \end{macrocode}
+%
+% \package{fontinst} uses some unusual, but convenient, settings of
+% |\catcode|. |@| and |_| are made letters, |~| is made a space, and
+% space and newline are ignored. Before setting those however, we save
+% the current values of the catcodes, so that they can be restored at
+% the end of \texttt{fontinst.sty}.
+%
+% \begin{macrocode}
+%<*pkg>
+\edef\spacecatcode{\the\catcode`\ }
+\edef\nlcatcode{\the\catcode`\^^M}
+\edef\atcatcode{\the\catcode`\@}
+\edef\underscorecatcode{\the\catcode`\_}
+\edef\tildecatcode{\the\catcode`\~}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\catcode`\ =9
+\catcode`\^^M=9
+\catcode`\@=11
+\catcode`\_=11
+\catcode`\~=10
+%</pkg>
+% \end{macrocode}
+%
+
+
+\newlinechar=`\^^J
+
+% \begin{macro}{\a_read}
+% \begin{macro}{\b_read}
+% \begin{macro}{\a_filelineno}
+% \begin{macro}{\b_filelineno}
+% These control sequences are used for keeping track of the ``physical''
+% side of the two input files. |\a_read| and |\b_read| are the stream
+% numbers. |\a_filelineno| and |\b_filelineno| are the respective
+% line numbers of the lines most recently read from these files.
+% \begin{macrocode}
+\newread\a_read
+\newread\b_read
+\newcount\a_filelineno
+\newcount\b_filelineno
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\a_lineno}
+% \begin{macro}{\b_lineno}
+% \begin{macro}{\a_bufbase}
+% \begin{macro}{\b_bufbase}
+% \begin{macro}{\a_bufmid}
+% \begin{macro}{\b_bufmid}
+% \begin{macro}{\a_buftop}
+% \begin{macro}{\b_buftop}
+% These count registers are used for managing the buffert of lines
+% that are read from the input files when a match between lines is
+% being looked for. This buffert consists of lines which are saved in
+% the macros
+% \begin{quote}
+% |\|\meta{letter}|_saved-|\meta{ofs}
+% \end{quote}
+% where \meta{letter} is |a| or |b| and \meta{ofs} is an integer,
+% being the index into the buffert. |\a_bufbase| and |\b_bufbase|
+% contain the \meta{ofs} of the first line currently in the buffert,
+% whereas |\a_buftop| and |\b_buftop| contain the \meta{ofs} of the
+% last such line. |\a_bufmid| and |\b_bufmid| hold the buffert
+% positions of the lines which are currently considered the next by
+% |\get_next_line|. If \(\mathtt{buftop}<\mathtt{bufmid}\) then the
+% buffert is empty. |\a_lineno| and |\b_lineno| are the respective
+% line numbers of the |\a_bufbase| and |\b_bufbase| lines.
+%
+% All these registers should be set globally.
+% \begin{macrocode}
+\newcount\a_lineno \newcount\b_lineno
+\newcount\a_bufbase \newcount\b_bufbase
+\newcount\a_bufmid \newcount\b_bufmid
+\newcount\a_buftop \newcount\b_buftop
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}
+
+
+% \begin{macro}{\get_next_line}
+% The |\get_next_line| macro is called as
+% \begin{quote}
+% |\get_next_line|\marg{letter}
+% \end{quote}
+% where \meta{letter} is |a| or |b|. This sets the
+% |\|\meta{letter}|_line| macro to the next line of that file and
+% updates the value of |\|\meta{letter}|_lineno|.
+%
+% The ``next line'' is normally read from input stream
+% |\|\meta{letter}|_read|, but if a line mismatch recently occured
+% then it might happen that the next line has already been read from
+% the file, and in that case it is taken from one of the
+% |\|\meta{letter}|_saved-|\meta{ofs} macros.
+% \begin{macrocode}
+\def\get_next_line#1{
+ \ifnum \csname#1_buftop\endcsname<\csname#1_bufmid\endcsname
+ \ifeof \csname#1_read\endcsname
+ \x_cs\let{#1_line}\end_of_file_line
+ \else
+ \read\csname#1_read\endcsname t\x_cs{o}{#1_line}
+ \global\advance \csname#1_filelineno\endcsname \@ne
+ \fi
+ \else
+ \expandafter\let \csname#1_line\expandafter\endcsname
+ \csname#1_saved-\the\csname#1_bufmid\endcsname\endcsname
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\end_of_file_line}
+% This macro expands to the text \verb*|(ENDOFFILE) | with the
+% catcodes it would have if read from an input file. It is used as an
+% end-of-file marker.
+% \begin{macrocode}
+\begingroup
+ \catcode`\(=13
+ \catcode`\)=13
+ \gdef\end_of_file_line{(ENDOFFILE)~}
+\endgroup
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\the_line}
+% The |\the_line| macro is called as
+% \begin{quote}
+% |\the_line|\marg{letter}\marg{ofs}
+% \end{quote}
+% where \meta{letter} is |a| or |b|, and \meta{ofs} is a \TeX\ number.
+% It expands to the control sequence |\|\meta{letter}|_saved-|^^A
+% \meta{ofs}.
+% \begin{macrocode}
+\def\the_line#1#2{\csname#1_saved-\number#2\endcsname}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\initialise_search}
+% The |\initialise_search| macro sets everything up for a search for
+% a match between lines.
+%
+% \begin{macrocode}
+\def\initialise_search{
+ \global\a_bufbase=\a_bufmid
+ \global\b_bufbase=\b_bufmid
+ \add_to_buffert{a}
+ \add_to_buffert{b}
+ \global\advance \a_bufmid \@ne
+ \global\advance \b_bufmid \@ne
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\add_to_buffert}
+% The |\add_to_buffert| macro is called as
+% \begin{quote}
+% |\add_to_buffert|\marg{letter}
+% \end{quote}
+% It adds the line returned by |\get_next_line| to the corresponding
+% buffert (if it wasn't already there) and updates the counters for
+% that buffert. After this, the line following the line being put into
+% the buffert will be the line that |\get_next_line| returns.
+% \begin{macrocode}
+\def\add_to_buffert#1{
+ \ifnum \csname#1_buftop\endcsname<\csname#1_bufmid\endcsname
+ \expandafter\let
+ \csname#1_saved-\the\csname#1_bufmid\endcsname
+ \expandafter\endcsname
+ \csname#1_line\endcsname
+ \global\advance \csname#1_buftop\endcsname \@ne
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+\newcount\first_integer
+\newcount\second_integer
+
+% \begin{macro}{\match_lines}
+% The |\match_lines| macro tests if two lines can be considered the
+% same (up to metrics changes, which need not be small). It is called as
+% \begin{quote}
+% |\match_lines|\marg{line a}\marg{line b}
+% \end{quote}
+% \meta{line a} and \meta{line b} may be any amount of text which
+% eventually expands to the lines in question. |\match_lines| returns
+% its answer by setting the |_a_| switch to |false| (if the lines
+% match) or |true| (if the lines don't match).
+%
+% |\match_lines| also causes the |\first_dimen| and |\second_dimen|
+% registers, as well as the |_histogram_dimen_| switch to be updated,
+% so it can be immediately followed by a test of the metrics.
+% \begin{macrocode}
+\def\match_lines#1#2{
+ \first_integer=\z@
+ \second_integer=\z@
+ \first_dimen=\z@
+ \second_dimen=\z@
+ \x_cs\let{string-+}\empty_command
+ \x_cs\let{string--}\empty_command
+% \end{macrocode}
+% \begin{macrocode}
+ \def\sign{+}
+ #1\line_stop
+ \def\sign{-}
+ #2\line_stop
+% \end{macrocode}
+% \begin{macrocode}
+ \_a_false
+ \expandafter\ifx \csname cmd-+ \expandafter\endcsname
+ \csname cmd--\endcsname
+ \else \_a_true \fi
+ \ifnum \first_integer=\z@ \else \_a_true \fi
+ \ifnum \second_integer=\z@ \else \_a_true \fi
+ \expandafter\ifx \csname string-+ \expandafter\endcsname
+ \csname string--\endcsname
+ \else \_a_true \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\try_matching}
+% \begin{macro}{\a_bufP}
+% \begin{macro}{\b_bufP}
+% The |\try_matching| descends through the buffert until the |_a_|
+% switch gets |false| or it has tried the bottommost lines in the
+% buffert. Since |\body| is already defined by the |\loop| in
+% |\process_lines|, |\try_matching| uses an explicit end recursion to
+% make the loop.
+% \begin{macrocode}
+\newcount\a_bufP
+\newcount\b_bufP
+\def\try_matching{
+ \global\advance \a_bufP \m@ne
+ \global\advance \b_bufP \m@ne
+% % Begin debug
+% \wlog{a_bufbase:~\the\a_bufbase\space\space\space
+% b_bufbase:~\the\b_bufbase}
+% \wlog{a_bufmid:~\the\a_bufmid\space\space\space
+% b_bufmid:~\the\b_bufmid}
+% \wlog{a_buftop:~\the\a_buftop\space\space\space
+% b_buftop:~\the\b_buftop}
+% \wlog{a_bufP:~\the\a_bufP\space\space\space
+% b_bufP:~\the\b_bufP}
+% \begingroup
+% \def\do_left_paren{(}\def\do_right_paren{)}
+% \wlog{a_line:~\a_line}
+% \wlog{b_buf_line:~\the_line{b}{\b_bufP}}
+% \wlog{b_line:~\b_line}
+% \wlog{a_buf_line:~\the_line{a}{\a_bufP}^^J}
+% \endgroup
+% % End debug
+ \match_lines{\a_line}{\the_line{b}{\b_bufP}}
+ \if_a_
+ \match_lines{\the_line{a}{\a_bufP}}{\b_line}
+ \if_a_ \else
+ \global\a_bufmid=\a_bufP
+ \fi
+ \else
+ \global\b_bufmid=\b_bufP
+ \fi
+ \ifnum \a_bufP>\a_bufbase \if_a_
+ \expandafter\expandafter\expandafter\try_matching
+ \fi \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\report_mismatch}
+% The |\report_mismatch| macro does precisely what it says. It also increases
+% the \texttt{bufbase} and \texttt{lineno} registers to point at the
+% matching lines.
+% \begin{macrocode}
+\def\report_mismatch{
+ \begingroup
+ \def\do_left_paren{(}
+ \def\do_right_paren{)}
+ \wlog{Mismatch~in~first~file~(at~\the\a_lineno):}
+ \loop
+ \wlog{\the_line{a}{\a_bufbase}}
+ \ifnum \a_bufbase<\a_bufmid
+ \global\advance \a_bufbase \@ne
+ \global\advance \a_lineno \@ne
+ \repeat
+ \wlog{Match~found~at~line~\the\a_lineno.}
+ \wlog{Mismatch~in~second~file~(at~\the\b_lineno):}
+ \loop
+ \wlog{\the_line{b}{\b_bufbase}}
+ \ifnum \b_bufbase<\b_bufmid
+ \global\advance \b_bufbase \@ne
+ \global\advance \b_lineno \@ne
+ \repeat
+ \wlog{Match~found~at~line~\the\b_lineno.}
+ \endgroup
+ \glyphified_location
+ \ifnum 4>\compared_status
+ \global\chardef\compared_status=4
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+\def\glyphified_location{
+ \ifx \encoding_name\empty_command
+ \ifnum \m@ne<\last_character
+ \wlog{This~is~related~to~slot~\the\last_character.^^J}
+ \else
+ \wlog{This~is~in~the~header.^^J}
+ \fi
+ \else
+ \if_undefined{name-\encoding_name-\the\last_character}\then
+ \ifnum \last_character=\m@ne
+ \wlog{This~is~in~the~header.^^J}
+ \else
+ \wlog{This~is~related~to~slot~\the\last_character\space
+ (unencoded).^^J}
+ \fi
+ \else
+ \wlog{This~is~related~to~the~glyph~
+ \csname name-\encoding_name-\the\last_character\endcsname
+ .^^J}
+ \fi
+ \fi
+}
+% \begin{macro}{\compared_status}
+% |\compared_status| is a \meta{chardef token} which stores the
+% current status of the comparision, according to the following table
+% \begin{enumerate}
+% \item[0] The property lists are equal---there may be checksum
+% differences, but nothing else.
+% \item[1] The property lists are almost equal---there are
+% differences in the metrics, but these are within the |\tolerance|
+% level.
+% \item[2] The property lists are essentially equal---there are
+% differences in the metrics, but these are within the |\tolerance|
+% level, with the exception of some \texttt{CHARHT},
+% \texttt{CHARDP}, and \texttt{CHARIC} values.
+% \item[3] The property lists have metric differences---there are
+% metric differences not with category 2.
+% \item[4] The property lists are not completely matched.
+% \end{enumerate}
+% \end{macro}
+
+% \begin{macro}{\step_linenos}
+% The |\step_linenos| macro increments the |_lineno| line numbers. If
+% the current line was fetched from the buffert, then it also
+% increments the |_bufmid| and |_bufbase| registers, and checks
+% whether the buffert ended (in which case it is normalized to its
+% starting position, to conserve hash table space).
+% \begin{macrocode}
+\def\step_linenos{
+ \global\advance \a_lineno \@ne
+ \ifnum \a_bufmid=\a_buftop
+ \global\a_bufbase=\z@
+ \global\a_bufmid=\z@
+ \global\a_buftop=\m@ne
+ \else\ifnum \a_bufmid<\a_buftop
+ \global\advance \a_bufmid \@ne
+ \global\advance \a_bufbase \@ne
+ \fi\fi
+ \global\advance \b_lineno \@ne
+ \ifnum \b_bufmid=\b_buftop
+ \global\b_bufbase=\z@
+ \global\b_bufmid=\z@
+ \global\b_buftop=\m@ne
+ \else\ifnum \b_bufmid<\b_buftop
+ \global\advance \b_bufmid \@ne
+ \global\advance \b_bufbase \@ne
+ \fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+
+
+\newdimen\first_dimen
+\newdimen\second_dimen
+\newcount\ht_hist_i
+\newcount\ht_hist_ii
+\newcount\ht_hist_iii
+\newcount\ht_hist_iv
+\newcount\dp_hist_i
+\newcount\dp_hist_ii
+\newcount\dp_hist_iii
+\newcount\dp_hist_iv
+\newcount\ic_hist_i
+\newcount\ic_hist_ii
+\newcount\ic_hist_iii
+\newcount\ic_hist_iv
+
+% \begin{macro}{\clear_histograms}
+% This macro clears all the histograms.
+% \begin{macrocode}
+\def\clear_histograms{
+ \global\ht_hist_i=\z@
+ \global\ht_hist_ii=\z@
+ \global\ht_hist_iii=\z@
+ \global\ht_hist_iv=\z@
+ \global\dp_hist_i=\z@
+ \global\dp_hist_ii=\z@
+ \global\dp_hist_iii=\z@
+ \global\dp_hist_iv=\z@
+ \global\ic_hist_i=\z@
+ \global\ic_hist_ii=\z@
+ \global\ic_hist_iii=\z@
+ \global\ic_hist_iv=\z@
+}
+% \enc{macrocode}
+% \end{macro}
+
+% \begin{macro}{\present_histograms}
+% This macro writes the histogram data to the log file.
+% \begin{macrocode}
+\def\present_histograms{
+ \wlog{\string\tolerance*~\space CHARHT~\space CHARDP~\space CHARIC}
+ \wlog{~\space\space 1--~\space\space 10\hist_to_eight{ht}{i}
+ \hist_to_eight{dp}{i}\hist_to_eight{ic}{i}}
+ \wlog{~\space 10--~\space 100\hist_to_eight{ht}{ii}
+ \hist_to_eight{dp}{ii}\hist_to_eight{ic}{ii}}
+ \wlog{~100--~1000\hist_to_eight{ht}{iii}\hist_to_eight{dp}{iii}
+ \hist_to_eight{ic}{iii}}
+ \wlog{1000--10000\hist_to_eight{ht}{iv}\hist_to_eight{dp}{iv}
+ \hist_to_eight{ic}{iv}}
+}
+\def\hist_to_eight#1#2{\x_cs\hist_to_eight_i{#1_hist_#2}}
+\def\hist_to_eight_i#1{
+ \ifnum #1<\@M
+ \four_spaces
+ \ifnum #1<\one_hundred
+ \space\space
+ \ifnum 10>#1 ~\fi
+ \else \ifnum #1<\one_thousand \space\fi \fi
+ \else
+ \ifnum 1000000>#1
+ \space\space
+ \ifnum 100000>#1 ~\fi
+ \else \ifnum 1000000>#1 ~\fi \fi
+ \fi
+ \the#1
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\metric_statistics}
+% \begin{macro}{\metric_origin}
+% The |\metric_statistics| macro takes care of comparing the metrics
+% by inspecting the values of |\first_dimen| and |\second_dimen|. It
+% has four classes of differences, which are represented by
+% |\compared_status| values 0--3: no difference, tolerable (almost no)
+% difference, histogrammed (essentially no) difference, and
+% non-tolerable difference. If a non-tolerable difference is found,
+% then the current lines are written to the log file. Histogrammed
+% differences causes the corresponding
+% |\|\meta{type}|_hist_|\meta{group} register to be incremented, and
+% tolerable differences only affect the value of |\compared_status|.
+%
+% The |\metric_origin| macro contains the \meta{type} of the metric
+% data. It is usually empty, but PL properties with metrics that have
+% histograms set it so that the correct histogram is updated.
+%
+% \begin{macrocode}
+\def\metric_statistics{
+ \_a_false
+ %
+ \ifdim \first_dimen<\z@ \first_dimen=-\first_dimen \fi
+ \ifdim \first_dimen=\z@
+ \else\ifdim \first_dimen<\tolerance
+ \ifnum 1>\compared_status
+ \global\chardef\compared_status=1
+ \fi
+ \else\ifx \metric_origin\empty_command
+ \_a_true
+ \else
+ \a_count=\@ne
+ \def\a_macro{10}
+ \loop\ifdim \a_macro\tolerance<\first_dimen
+ \edef\a_macro{\a_macro 0}
+ \advance \a_count \@ne
+ \repeat
+ \if_undefined{\metric_origin _hist_ \romannumeral\a_count}\then
+ \_a_true
+ \else
+ \global\advance \csname \metric_origin _hist_
+ \romannumeral\a_count \endcsname \@ne
+ \ifnum 2>\compared_status
+ \global\chardef\compared_status=2
+ \fi
+ \fi
+ \fi\fi\fi
+ %
+ \ifdim \second_dimen<\z@ \second_dimen=-\second_dimen \fi
+ \ifdim \second_dimen=\z@
+ \else\ifdim \second_dimen<\tolerance
+ \ifnum 1>\compared_status
+ \global\chardef\compared_status=1
+ \fi
+ \else\ifx \metric_origin\empty_command
+ \_a_true
+ \else
+ \a_count=\@ne
+ \def\a_macro{10}
+ \loop\ifdim \a_macro\tolerance<\second_dimen
+ \edef\a_macro{\a_macro 0}
+ \advance \a_count \@ne
+ \repeat
+ \if_undefined{\metric_origin _hist_ \romannumeral\a_count}\then
+ \_a_true
+ \else
+ \global\advance \csname \metric_origin _hist_
+ \romannumeral\a_count \endcsname \@ne
+ \ifnum 2>\compared_status
+ \global\chardef\compared_status=2
+ \fi
+ \fi
+ \fi\fi\fi
+ %
+ \if_a_
+ \ifnum 3>\compared_status
+ \global\chardef\compared_status=3
+ \fi
+ \begingroup
+ \def\do_left_paren{(}
+ \def\do_right_paren{)}
+ \wlog{Metric~differences~at~lines~\the\a_lineno\space
+ and~\the\b_lineno\space respectively:}
+ \wlog{\a_line}
+ \wlog{\b_line}
+ \endgroup
+ \glyphified_location
+ \fi
+}
+% \end{macrocode}
+% \end{macro}\end{macro}
+
+
+
+
+\newif\if_b_
+
+% \begin{macro}{\process_lines}
+% The |\process_lines| macro is the cheif executive in the comparision.
+% Its normal mode of operation is to retrive the next two lines from
+% the input files, match them, and update the metric differences
+% statistics. If the lines do not match, however, it starts building a
+% buffert of lines in which it searches for two matching lines. When
+% these two lines are found the mismatching portions of the files are
+% written to the log file, and the metric difference statistics are
+% updated for the two lines that matched.
+%
+% \begin{macrocode}
+\def\process_lines{
+ \get_next_line{a}
+ \get_next_line{b}
+ \match_lines{\a_line}{\b_line}
+ \if_a_
+% \end{macrocode}
+% Now the process of trying to find a match begins. At each step of
+% the search for a match, it tries all possible matches with the
+% lines read so far that haven't been tried at an earlier step.
+% \begin{macrocode}
+% \tracingmacros=\@ne\tracingcommands=\tw@ % DEBUG
+ \initialise_search
+ \loop
+ \get_next_line{a}
+ \get_next_line{b}
+ \add_to_buffert{a}
+ \add_to_buffert{b}
+ \match_lines{\a_line}{\b_line}
+ \if_a_
+ \global\a_bufP=\a_bufmid
+ \global\b_bufP=\b_bufmid
+ \try_matching
+ \fi
+ \if_a_
+ \global\advance \a_bufmid \@ne
+ \global\advance \b_bufmid \@ne
+ \ifnum \a_bufmid>\sixt@@n
+ \errmessage{Big~buffert.~\the\a_lineno[\the\a_filelineno]:
+ \the\b_lineno[\the\b_filelineno]}
+ \fi % DEBUG
+ \repeat
+ \report_mismatch
+% \tracingcommands=\z@\tracingmacros=\z@ % DEBUG
+% \end{macrocode}
+% \begin{macrocode}
+ \fi
+ \metric_statistics
+ \step_linenos
+ \par % DEBUG
+ \if \ifx \a_line\end_of_file_line
+ \ifx \b_line\end_of_file_line 1\else 0\fi\else 0\fi 0
+ % then
+ \expandafter\process_lines
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+\def\loadencoding#1{{
+ \def\do_slot{\x_cs\xdef{name-#1-\the\slot_number}{\slot_name}}
+ \inputetx{#1}
+}}
+
+% \begin{macro}{\comparePLs}
+% The |\comparePLs| command compares two property lists files. It is
+% geared against verifying that two different such files are as good
+% as equal, and it might take a very long time before it gives up on
+% trying to find any resemblance between them. It is furthermore only
+% meant to be used on (V)PL files generated by \package{TFtoPL} or
+% \package{VFtoVP}, because it assumes the property lists follow a
+% stricter syntax than \package{PLtoTF} and \package{VPtoVF} requires
+% them to. Finally it needs to be said that the comparision is rather
+% stupid in many respects, as it is completely line-oriented and
+% takes no notice of what kind of property list it is reading. This
+% may in some cases cause it to find ``matches'' between lines which
+% for syntactical reasons alone cannot match.
+%
+% |\comparePLs| is called as
+% \begin{quote}
+% |\comparePLs|\marg{first PL}\marg{second PL}\marg{encoding}
+% \end{quote}
+% where \meta{first PL} and \meta{second PL} are the complete names
+% (including extensions) of the files to compare. \meta{encoding} is
+% the name of the encoding to use when translating slots to glyph
+% names; leave it empty if you don't want to specify one. (One could
+% use the \texttt{CODINGSCHEME} property to determine the encoding in
+% that case, but this is not currently done). The slot to glyph
+% translation is only done to make it easier to locate the position of
+% some mismatch; it has not effect on the actual comparision.
+% \begin{macrocode}
+\newcount\last_character
+\def\comparePLs#1#2#3{{
+ \def\encoding_name{#3}
+ \last_character=\m@ne
+ \openin\a_read=#1\x_relax
+ \openin\b_read=#2\x_relax
+ \immediate\write\sixt@@n{#1~and^^J #2}
+ \pl_catcodes
+ \let\do_left_paren=\do_property
+ \let\do_right_paren=\empty_command
+ \global\chardef\compared_status=\z@
+ \clear_histograms
+ \global\a_filelineno=\@ne
+ \global\b_filelineno=\@ne
+ \global\a_lineno=\@ne
+ \global\b_lineno=\@ne
+ \global\a_bufbase=\z@
+ \global\b_bufbase=\z@
+ \global\a_bufmid=\z@
+ \global\b_bufmid=\z@
+ \global\a_buftop=\m@ne
+ \global\b_buftop=\m@ne
+ \process_lines
+ \closein\a_read
+ \closein\b_read
+ \ifcase \compared_status
+ \immediate\write\sixt@@n{are~equal.^^J}
+ \or
+ \immediate\write\sixt@@n{are~almost~equal.^^J}
+ \or
+ \immediate\write\sixt@@n{are~essentially~equal.}
+ \or
+ \immediate\write\sixt@@n{have~non-tolerated~metric~differences.}
+ \or
+ \immediate\write\sixt@@n{do~not~completely~match.}
+ \else
+ \immediate\write\sixt@@n{could~not~be~matched!}
+ \fi
+ \ifnum 1<\compared_status
+ \immediate\write\sixt@@n{See~log~file~for~specification.}
+ \present_histograms
+ \immediate\write\sixt@@n{}
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+\begingroup
+ \catcode`\(=13 \catcode`\)=13
+ \gdef\pl_catcodes{
+ \catcode`\(=13 \def({\do_left_paren}
+ \catcode`\)=13 \def){\do_right_paren}
+ }
+\endgroup
+
+\def\do_property#1~{
+ \x_cs\edef{cmd-\sign}{#1}
+ \let\metric_origin=\empty_command
+ \x_cs\ifx{pl-#1}\x_relax
+ \expandafter\ignore_parens
+ \else
+ \csname pl-#1 \expandafter\endcsname
+ \fi
+}
+\def\pl_def_s#1(#2){\x_cs\def{pl-#1}#2~}
+\begingroup
+ \catcode`\!=13\lccode`\!=`\)
+\lowercase{\endgroup
+ \def\pl_def_p#1(#2){\x_cs\def{pl-#1}#2!}
+}
+\def\pl_let#1#2{
+ \expandafter\let
+ \csname pl-#1 \expandafter\endcsname \csname pl-#2 \endcsname
+}
+
+
+
+\newdimen\tolerance \tolerance=110sp
+
+% The following is for gobbling to the next unmatched right parenthesis.
+% The |\catcode| trick used by the PL-to-MTX converter's
+% |\ignore_parens| cannot be used since the characters are already
+% tokenized, but one can do something similar with an |\edef| since one
+% does not have to worry about the PL files containing material which
+% expands in an undesirable way.
+%
+% The |\line_stop| is so that linebreaks in the parenthesis being
+% gobbled will not cause total havok (although the parenthesis won't be
+% gobbled completely). It inserts end-of-group tokens until the |\edef|
+% is terminated, and then the |\afterassignment| token will close the
+% group and restore the normal definition.
+
+\def\ignore_parens{
+ \begingroup
+ \def\do_left_paren{{\iffalse}\fi}
+ \def\do_right_paren{\iffalse{\fi}}
+ \def\line_stop{\do_right_paren\line_stop}
+ \afterassignment\endgroup
+ \edef\a_macro{\iffalse}\fi
+}
+\def\line_stop{\x_relax}
+% \end{macrocode}
+%
+\begingroup
+ \catcode`\(=1
+ \catcode`\)=2
+ \gdef\pl_string{
+ \begingroup
+ \def\do_left_paren{(\iffalse)\fi}
+ \def\do_right_paren{\iffalse(\fi)}
+ \def\line_stop{\iffalse{\fi}\line_stop}
+ \afterassignment\pl_string_i
+ \edef\a_macro{\iffalse}\fi
+ }
+\endgroup
+\def\pl_string_i{
+ \expandafter\endgroup \expandafter\def
+ \csname string-\sign \expandafter\endcsname
+ \expandafter{\a_macro}
+}
+
+\def\pl_real#1{\sign#1\hundred_pt}
+\newdimen\hundred_pt \hundred_pt=100pt
+
+% Convert a PL int to a \TeX{} int, assuming it's prefixed
+% by |C|, |D|, |O|, or |H|.
+%
+% \begin{macrocode}
+\def\pl_int#1#2{
+ \sign \ifx#1C `#2
+ \else\ifx#1D #2
+ \else\ifx#1O '#2
+ \else\ifx#1H "#2
+ \else -1\errmessage{Unknown~PL~number~prefix~`#1'}
+ \fi\fi\fi\fi
+}
+% \end{macrocode}
+
+
+% \begin{macrocode}
+\pl_def_p{NEXTLARGER}(#1~#2){\advance \first_integer \pl_int{#1}{#2}}
+\pl_let{BOUNDARYCHAR}{NEXTLARGER}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\x_cs\let{pl-VTITLE}=\pl_string
+\pl_let{FONTNAME}{VTITLE}
+\pl_let{FONTAREA}{VTITLE}
+% \pl_let{CHECKSUM}{VTITLE}
+% % Not really a string, but unsigned numbers can become too large for TeX.
+% \pl_let{FONTCHECKSUM}{CHECKSUM}
+% Commented out since checksums vary too much.
+\pl_def_p{FONTAT}(R~#1){\advance \first_dimen \pl_real{#1}}
+\pl_let{FONTDSIZE}{FONTAT}
+\pl_let{SELECTFONT}{NEXTLARGER}
+\pl_let{SETCHAR}{NEXTLARGER}
+\pl_def_p{SETRULE}(R~#1~R~#2){
+ \advance \first_dimen \pl_real{#1}
+ \advance \second_dimen \pl_real{#2}
+}
+\x_cs\let{pl-POP}\empty_command
+\pl_let{PUSH}{POP}
+\pl_let{MOVERIGHT}{FONTAT}
+\pl_let{MOVELEFT}{FONTAT}
+\pl_let{MOVEUP}{FONTAT}
+\pl_let{MOVEDOWN}{FONTAT}
+\pl_let{SPECIAL}{VTITLE}
+\pl_let{SPECIALHEX}{VTITLE}
+% \end{macrocode}
+%
+%
+
+\pl_let{CODINGSCHEME}{VTITLE}
+\pl_let{DESIGNSIZE}{FONTAT}
+
+\def\pl_parameter#1#2#3{
+ \advance \first_integer \pl_int{#1}{#2}
+ \advance \first_dimen \pl_real{#3}
+}
+
+\pl_def_p{PARAMETER}(#1~#2~R~#3){\pl_parameter{#1}{#2}{#3}}
+
+\pl_def_p{SLANT}(R~#1){\pl_parameter{D}{1}{#1}}
+\pl_def_p{SPACE}(R~#1){\pl_parameter{D}{2}{#1}}
+\pl_def_p{STRETCH}(R~#1){\pl_parameter{D}{3}{#1}}
+\pl_def_p{SHRINK}(R~#1){\pl_parameter{D}{4}{#1}}
+\pl_def_p{XHEIGHT}(R~#1){\pl_parameter{D}{5}{#1}}
+\pl_def_p{QUAD}(R~#1){\pl_parameter{D}{6}{#1}}
+\pl_def_p{EXTRASPACE}(R~#1){\pl_parameter{D}{7}{#1}}
+
+\pl_def_p{NUM1}(R~#1){\pl_parameter{D}{8}{#1}}
+\pl_def_p{NUM2}(R~#1){\pl_parameter{D}{9}{#1}}
+\pl_def_p{NUM3}(R~#1){\pl_parameter{D}{10}{#1}}
+\pl_def_p{DENOM1}(R~#1){\pl_parameter{D}{11}{#1}}
+\pl_def_p{DENOM2}(R~#1){\pl_parameter{D}{12}{#1}}
+\pl_def_p{SUP1}(R~#1){\pl_parameter{D}{13}{#1}}
+\pl_def_p{SUP2}(R~#1){\pl_parameter{D}{14}{#1}}
+\pl_def_p{SUP3}(R~#1){\pl_parameter{D}{15}{#1}}
+\pl_def_p{SUB1}(R~#1){\pl_parameter{D}{16}{#1}}
+\pl_def_p{SUB2}(R~#1){\pl_parameter{D}{17}{#1}}
+\pl_def_p{SUPDROP}(R~#1){\pl_parameter{D}{18}{#1}}
+\pl_def_p{SUBDROP}(R~#1){\pl_parameter{D}{19}{#1}}
+\pl_def_p{DELIM1}(R~#1){\pl_parameter{D}{20}{#1}}
+\pl_def_p{DELIM2}(R~#1){\pl_parameter{D}{21}{#1}}
+\pl_def_p{AXISHEIGHT}(R~#1){\pl_parameter{D}{22}{#1}}
+
+\pl_let{DEFAULTRULETHICKNESS}{NUM1}
+\pl_let{BIGOPSPACING1}{NUM2}
+\pl_let{BIGOPSPACING2}{NUM3}
+\pl_let{BIGOPSPACING3}{DENOM1}
+\pl_let{BIGOPSPACING4}{DENOM2}
+\pl_let{BIGOPSPACING5}{SUP1}
+
+\def\boundarychar_name{BOUNDARYCHAR}
+\pl_def_s{LABEL}(#1){
+ \def\a_macro{#1}
+ \ifx \a_macro\boundarychar_name
+ \x_cs\let{string-\sign}\a_macro
+ \else
+ \def\a_macro{\csname pl-LABEL(i\endcsname #1~}
+ \expandafter\a_macro
+ \fi
+}
+\pl_def_p{LABEL(i}(#1~#2){
+ \last_character=\first_integer
+ \advance \first_integer \pl_int{#1}{#2}
+}
+\pl_def_p{LIG}(#1~#2~#3~#4){
+ \advance \first_integer \pl_int{#1}{#2}
+ \advance \second_integer \pl_int{#3}{#4}
+}
+\pl_let{/LIG}{LIG}
+\pl_let{/LIG>}{LIG}
+\pl_let{LIG/}{LIG}
+\pl_let{LIG/>}{LIG}
+\pl_let{/LIG/}{LIG}
+\pl_let{/LIG/>}{LIG}
+\pl_let{/LIG/>>}{LIG}
+
+\pl_let{HEADER}{LIG}
+
+% \def\pl_lig#1~#2~#3~#4~#5~{
+% \x_cs\def{string-\sign}{#1}
+% \def\LIG#1~{
+% \if\ifx #1C 0
+% \else\ifx #1D 0
+% \else\ifx #1H 0
+% \else\ifx #1O 0 \else 1\fi\fi\fi\fi 0
+% % then
+% \expandafter\both_of_two
+% \else
+% \expandafter\first_of_two
+% \fi{\pl_lig LIG}{~}#1~
+% }
+% \def\/{\pl_lig/}
+
+\pl_let{KRN}{PARAMETER}
+\pl_let{SKIP}{NEXTLARGER}
+
+\pl_def_s{CHARACTER}(#1~#2){
+ \last_character=\first_integer
+ \advance \first_integer \pl_int{#1}{#2}
+}
+\pl_let{CHARWD}{FONTAT}
+\pl_def_p{CHARHT}(R~#1){
+ \def\metric_origin{ht}
+ \advance \first_dimen \pl_real{#1}
+}
+\pl_def_p{CHARDP}(R~#1){
+ \def\metric_origin{dp}
+ \advance \first_dimen \pl_real{#1}
+}
+\pl_def_p{CHARIC}(R~#1){
+ \def\metric_origin{ic}
+ \advance \first_dimen \pl_real{#1}
+}
+
+\pl_let{TOP}{NEXTLARGER}
+\pl_let{MID}{NEXTLARGER}
+\pl_let{BOT}{NEXTLARGER}
+\pl_let{REP}{NEXTLARGER}
+
+\pl_let{FONTDIMEN}{POP}
+\pl_let{LIGTABLE}{POP}
+\pl_let{VARCHAR}{POP}
+\pl_def_s{MAPFONT}(#1~#2){\advance \first_integer \pl_int{#1}{#2}}
+\pl_let{MAP}{POP}
+
+
+% \begin{macrocode}
+\catcode`\@=\atcatcode
+\catcode`\^^M=\nlcatcode
+\catcode`\ =\spacecatcode
+\catcode`\~=\tildecatcode
+\catcode`\_=\underscorecatcode
+% \end{macrocode}
diff --git a/fonts/utilities/fontinst/test/comparepls.tex b/fonts/utilities/fontinst/test/comparepls.tex
new file mode 100644
index 0000000000..a735a34ed7
--- /dev/null
+++ b/fonts/utilities/fontinst/test/comparepls.tex
@@ -0,0 +1,73 @@
+\input fontinst.sty
+\input comparemetrics.sty
+
+% % \tracingmacros=1\tracingcommands=2
+% \comparePLs{cmr5.pl}{cmr5.pl}
+%
+% \bye
+
+\tracingstats=1
+
+\def\oldf{::efficiency:saved:v1.912:}
+\def\newf{::efficiency:saved:v1.913:}
+
+\loadencoding{t1}
+\loadencoding{ot1}
+\loadencoding{ts1}
+\loadencoding{8r}
+
+\comparePLs{\oldf padb7t.vpl}{\newf padb7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padb8c.vpl}{\newf padb8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padb8t.vpl}{\newf padb8t.vpl}{t1} %OK 11sp
+\comparePLs{\oldf padbc7t.vpl}{\newf padbc7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padbc8t.vpl}{\newf padbc8t.vpl}{t1}
+\comparePLs{\oldf padbi7t.vpl}{\newf padbi7t.vpl}{ot1}
+\comparePLs{\oldf padbi8c.vpl}{\newf padbi8c.vpl}{ts1}
+\comparePLs{\oldf padbi8t.vpl}{\newf padbi8t.vpl}{t1}
+\comparePLs{\oldf padbo7t.vpl}{\newf padbo7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padbo8c.vpl}{\newf padbo8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padbo8t.vpl}{\newf padbo8t.vpl}{t1}
+\comparePLs{\oldf padr7t.vpl}{\newf padr7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padr8c.vpl}{\newf padr8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padr8t.vpl}{\newf padr8t.vpl}{t1} %OK 11sp
+\comparePLs{\oldf padrc7t.vpl}{\newf padrc7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padrc8t.vpl}{\newf padrc8t.vpl}{t1} %OK 11sp
+\comparePLs{\oldf padri7t.vpl}{\newf padri7t.vpl}{ot1}
+\comparePLs{\oldf padri8c.vpl}{\newf padri8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padri8t.vpl}{\newf padri8t.vpl}{t1}
+\comparePLs{\oldf padro7t.vpl}{\newf padro7t.vpl}{ot1} %OK 11sp
+\comparePLs{\oldf padro8c.vpl}{\newf padro8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padro8t.vpl}{\newf padro8t.vpl}{t1}
+\comparePLs{\oldf pads7t.vpl}{\newf pads7t.vpl}{ot1}
+\comparePLs{\oldf pads8c.vpl}{\newf pads8c.vpl}{ts1}
+\comparePLs{\oldf pads8t.vpl}{\newf pads8t.vpl}{t1}
+\comparePLs{\oldf padsc7t.vpl}{\newf padsc7t.vpl}{ot1}
+\comparePLs{\oldf padsc8t.vpl}{\newf padsc8t.vpl}{t1} %OK 11sp
+\comparePLs{\oldf padsi7t.vpl}{\newf padsi7t.vpl}{ot1}
+\comparePLs{\oldf padsi8c.vpl}{\newf padsi8c.vpl}{ts1} %OK 11sp
+\comparePLs{\oldf padsi8t.vpl}{\newf padsi8t.vpl}{t1}
+\comparePLs{\oldf padso7t.vpl}{\newf padso7t.vpl}{ot1}
+\comparePLs{\oldf padso8c.vpl}{\newf padso8c.vpl}{ts1}
+\comparePLs{\oldf padso8t.vpl}{\newf padso8t.vpl}{t1}
+
+\comparePLs{\oldf padb8a.pl}{\newf padb8a.pl}{}
+\comparePLs{\oldf padb8r.pl}{\newf padb8r.pl}{8r}
+\comparePLs{\oldf padbi8a.pl}{\newf padbi8a.pl}{}
+\comparePLs{\oldf padbi8r.pl}{\newf padbi8r.pl}{8r}
+\comparePLs{\oldf padbo8r.pl}{\newf padbo8r.pl}{8r}
+\comparePLs{\oldf padr8a.pl}{\newf padr8a.pl}{}
+\comparePLs{\oldf padr8r.pl}{\newf padr8r.pl}{8r}
+\comparePLs{\oldf padrc8a.pl}{\newf padrc8a.pl}{}
+\comparePLs{\oldf padrc8r.pl}{\newf padrc8r.pl}{8r}
+\comparePLs{\oldf padri8a.pl}{\newf padri8a.pl}{}
+\comparePLs{\oldf padri8r.pl}{\newf padri8r.pl}{8r}
+\comparePLs{\oldf padro8r.pl}{\newf padro8r.pl}{8r}
+\comparePLs{\oldf pads8a.pl}{\newf pads8a.pl}{}
+\comparePLs{\oldf pads8r.pl}{\newf pads8r.pl}{8r}
+\comparePLs{\oldf padsc8a.pl}{\newf padsc8a.pl}{}
+\comparePLs{\oldf padsc8r.pl}{\newf padsc8r.pl}{8r}
+\comparePLs{\oldf padsi8a.pl}{\newf padsi8a.pl}{}
+\comparePLs{\oldf padsi8r.pl}{\newf padsi8r.pl}{8r}
+\comparePLs{\oldf padso8r.pl}{\newf padso8r.pl}{8r}
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/fadrr.mtx b/fonts/utilities/fontinst/test/fadrr.mtx
new file mode 100644
index 0000000000..e9ce1b2e58
--- /dev/null
+++ b/fonts/utilities/fontinst/test/fadrr.mtx
@@ -0,0 +1,51 @@
+% Filename: fadrr.mtx
+% Created by: tclsh pstofont Knuth:MPtoType1:Test:fadrr
+% Created using: pstofont::write_MTX Knuth:MPtoType1:Test:fadrr.mtx
+%
+% This file contains the metric information about the font
+% AGaramondAdditions-Regular, in a format used by fontinst.
+
+\relax
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+\begin{document}
+\title{The \textit{AGaramondAdditions-Regular} font metrics}
+\date{2002-08-05 13.22.05}
+\maketitle
+
+\begin{abstract}
+ The AGaramond Additions family of fonts is free software;
+ you can redistribute it and/or modify it under the terms
+ of the Design Science License.
+ As a special exception, permission is granted to include
+ this font program in a Postscript, PDF, or similar file
+ that consists of a document that contains text to be
+ displayed or printed using this font, regardless of the
+ conditions or license applying to the document itself.
+\end{abstract}
+
+\metrics
+\needsfontinstversion{1.333}
+\setcommand\storemapdata#1#2#3{}
+\setcommand\setglyphbb#1#2#3#4#5{}
+\storemapdata{fadrr}{\fromafm{fadrr}{AGaramondAdditions-Regular}}{}
+\setint{ascender}{715}
+\setint{capheight}{660}
+\setint{descender_neg}{-258}
+\setint{xheight}{397}
+\setint{maxheight}{664}
+\setint{maxdepth}{4}
+\setint{italicslant}{0}
+\setnotglyph{.notdef}{fadrr}{10pt}{-1}{400}{0}{0}{0}
+\setglyphbb{.notdef}{0}{0}{0}{0}
+\setrawglyph{Gamma}{fadrr}{10pt}{71}{538}{660}{0}{0}
+\setglyphbb{Gamma}{40}{-4}{493}{664}
+\setrawglyph{I}{fadrr}{10pt}{73}{338}{660}{0}{0}
+\setglyphbb{I}{41}{-4}{297}{664}
+\setrawglyph{Pi}{fadrr}{10pt}{80}{806}{660}{0}{0}
+\setglyphbb{Pi}{40}{-4}{766}{664}
+\setrawglyph{uni0428}{fadrr}{10pt}{87}{962}{660}{0}{0}
+\setglyphbb{uni0428}{40}{-4}{922}{664}
+
+\endmetrics
+\end{document}
diff --git a/fonts/utilities/fontinst/test/multislot-test.tex b/fonts/utilities/fontinst/test/multislot-test.tex
new file mode 100644
index 0000000000..f557b47aa2
--- /dev/null
+++ b/fonts/utilities/fontinst/test/multislot-test.tex
@@ -0,0 +1,16 @@
+\input fontinst.sty
+\input multislot.sty
+
+\mathchardef\apa=0
+\catcode`\_=11
+\add_to\pre_second_etx_pass_hook{\mathchardef\apa=1}
+\catcode`\_=\underscorecatcode
+
+\transformfont{ptmr8r}{\reencodefont{8r}{\fromafm{ptmr8a}}}
+
+\installfonts
+ \installfamily{XX}{ptm}{}
+ \installfont{ptmr5z}{ptmr8r,psyr,latin}{multislot} {XX}{ptm}{m}{n}{}
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/fontinst/test/multislot.etx b/fonts/utilities/fontinst/test/multislot.etx
new file mode 100644
index 0000000000..962080bff8
--- /dev/null
+++ b/fonts/utilities/fontinst/test/multislot.etx
@@ -0,0 +1,54 @@
+\relax
+\encoding
+\immediate\write16{\the\csname slot_number\endcsname,\the\csname
+slot_index\endcsname}
+% \ifnum 1=\apa
+% \expandafter\show \csname name-0\endcsname
+% % \tracingmacros=1
+% % \tracingcommands=2
+% \fi
+\inputetx{ot1}
+\immediate\write16{\the\csname slot_number\endcsname,\the\csname
+slot_index\endcsname}
+
+% \tracingmacros=1
+% \tracingcommands=2
+
+\nextslot{32}
+\setrightboundary{space}
+
+\nextslot{172}
+\setrightboundary{omega}
+
+\setleftboundary{space}
+\endsetleftboundary
+
+% \tracingcommands=0
+% \tracingmacros=0
+
+
+\immediate\write16{\the\csname slot_number\endcsname,\the\csname
+slot_index\endcsname}
+
+
+\inputetx{t1}
+
+\immediate\write16{\the\csname slot_number\endcsname,\the\csname
+slot_index\endcsname}
+
+
+\setleftboundary{compwordmark}
+\endsetleftboundary
+
+
+\setcommand\resetslot#1\endsetslot{}
+
+\nextslot{`l}
+\resetslot{lambda}
+ \comment{The letter `$\lambda$'.}
+\endsetslot
+
+\immediate\write16{\the\csname slot_number\endcsname,\the\csname
+slot_index\endcsname}
+
+\endencoding
diff --git a/fonts/utilities/fontinst/test/omsdraft.etx b/fonts/utilities/fontinst/test/omsdraft.etx
new file mode 100644
index 0000000000..3e60ee0a56
--- /dev/null
+++ b/fonts/utilities/fontinst/test/omsdraft.etx
@@ -0,0 +1,871 @@
+%%% ====================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey and Ulrik Vieth and
+%%% Lars Hellstr{\"o}m",
+%%% version = "1.928",
+%%% date = "2004-11-30",
+%%% time = "14:45:29 +01:00",
+%%% filename = "oms.etx",
+%%% email = "fontinst@tug.org",
+%%% URL = "http://www.tug.org/applications/fontinst/index.html",
+%%% checksum = "",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, math, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is (an incomplete) specification of the
+%%% old math symbol encoding as a TeX font encoding
+%%% file, for use with the fontinst utility.",
+%%% package = "fontinst",
+%%% dependencies = "fontinst.sty, fontdoc.sty",
+%%% }
+%%% ====================================================================
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage[specification]{fontdoc}[2004/11/24]
+
+\title{The \TeX\ math symbol encoding vector}
+\author{Alan Jeffrey\and Ulrik Vieth\and Lars Hellstr\"om}
+\date{24 November 2004\\Version 1.928}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ math symbol (OMS) encoding.
+\emph{Or rather, it describes part of that encoding---a part which
+includes some characters beyond the Basic Multilingual Plane. The
+primary purpose of creating this file was to test that case of the
+ETX-to-CMap converter.}
+
+\showbranches
+\encoding
+
+\needsfontinstversion{1.928}
+
+
+\begincomment
+\section{Ordinary characters}
+There are 128 ordinary characters in this encoding.
+\endcomment
+
+
+\begincomment
+\subsection{Operations}
+\endcomment
+
+
+\nextslot{0}
+\setslot{minus}
+ \Unicode{2212}{MINUS SIGN}
+\endsetslot
+
+\setslot{periodcentered}
+ \Unicode{22C5}{DOT OPERATOR}
+ \comment{This is called `\texttt{dotmath}' in Adobe Symbol.}
+\endsetslot
+
+\setslot{multiply}
+ \Unicode{00D7}{MULTIPLICATION SIGN}
+\endsetslot
+
+\setslot{asteriskmath}
+ \Unicode{2217}{ASTERISK OPERATOR}
+\endsetslot
+
+\setslot{divide}
+ \Unicode{00F7}{DIVISION SIGN}
+\endsetslot
+
+\setslot{diamondmath}
+ \Unicode{22C4}{DIAMOND OPERATOR}
+\endsetslot
+
+\setslot{plusminus}
+ \Unicode{00B1}{PLUS-MINUS SIGN}
+\endsetslot
+
+\setslot{minusplus}
+ \Unicode{2213}{MINUS-OR-PLUS SIGN}
+\endsetslot
+
+\setslot{circleplus}
+ \Unicode{2295}{CIRCLED PLUS}
+\endsetslot
+
+\setslot{circleminus}
+ \Unicode{2296}{CIRCLED MINUS}
+\endsetslot
+
+\setslot{circlemultiply}
+ \Unicode{2297}{CIRCLED TIMES}
+\endsetslot
+
+\setslot{circledivide}
+ \Unicode{2298}{CIRCLED DIVISION SLASH}
+\endsetslot
+
+\setslot{circledot}
+ \Unicode{2299}{CIRCLED DOT OPERATOR}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \Unicode{25CB}{WHITE CIRCLE}
+ \Unicode{20DD}{COMBINING ENCLOSING CIRCLE}
+ \comment{The large circle symbol `$\bigcirc$', also used for building
+ the copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \Unicode{2218}{RING OPERATOR}
+\endsetslot
+
+\setslot{bullet}
+ \Unicode{2219}{BULLET OPERATOR}
+\endsetslot
+
+
+\begincomment
+\subsection{Calligraphic alphabet}
+\endcomment
+
+\nextslot{65}
+\setslot{A}
+ \Unicode{1D49C}{MATHEMATICAL SCRIPT CAPITAL A}
+\endsetslot
+
+\setslot{B}
+ \Unicode{212C}{SCRIPT CAPITAL B}
+\endsetslot
+
+\setslot{C}
+ \Unicode{1D49E}{MATHEMATICAL SCRIPT CAPITAL C}
+\endsetslot
+
+\setslot{D}
+ \Unicode{1D49F}{MATHEMATICAL SCRIPT CAPITAL D}
+\endsetslot
+
+\setslot{E}
+ \Unicode{2130}{SCRIPT CAPITAL E}
+\endsetslot
+
+\setslot{F}
+ \Unicode{2131}{SCRIPT CAPITAL F}
+\endsetslot
+
+\setslot{G}
+ \Unicode{1D4A2}{MATHEMATICAL SCRIPT CAPITAL G}
+\endsetslot
+
+\setslot{H}
+ \Unicode{210B}{SCRIPT CAPITAL H}
+\endsetslot
+
+\setslot{I}
+ \Unicode{2110}{SCRIPT CAPITAL I}
+\endsetslot
+
+\setslot{J}
+ \Unicode{1D4A5}{MATHEMATICAL SCRIPT CAPITAL J}
+\endsetslot
+
+\setslot{K}
+ \Unicode{1D4A6}{MATHEMATICAL SCRIPT CAPITAL K}
+\endsetslot
+
+\setslot{L}
+ \Unicode{2112}{SCRIPT CAPITAL L}
+\endsetslot
+
+\setslot{M}
+ \Unicode{2133}{SCRIPT CAPITAL M}
+\endsetslot
+
+\setslot{N}
+ \Unicode{1D4A9}{MATHEMATICAL SCRIPT CAPITAL N}
+\endsetslot
+
+\setslot{O}
+ \Unicode{1D4AA}{MATHEMATICAL SCRIPT CAPITAL O}
+\endsetslot
+
+\setslot{P}
+ \Unicode{1D4AB}{MATHEMATICAL SCRIPT CAPITAL P}
+\endsetslot
+
+\setslot{Q}
+ \Unicode{1D4AC}{MATHEMATICAL SCRIPT CAPITAL Q}
+\endsetslot
+
+\setslot{R}
+ \Unicode{211B}{SCRIPT CAPITAL R}
+\endsetslot
+
+\setslot{S}
+ \Unicode{1D4AE}{MATHEMATICAL SCRIPT CAPITAL S}
+\endsetslot
+
+\setslot{T}
+ \Unicode{1D4AF}{MATHEMATICAL SCRIPT CAPITAL T}
+\endsetslot
+
+\setslot{U}
+ \Unicode{1D4B0}{MATHEMATICAL SCRIPT CAPITAL U}
+\endsetslot
+
+\setslot{V}
+ \Unicode{1D4B1}{MATHEMATICAL SCRIPT CAPITAL V}
+\endsetslot
+
+\setslot{W}
+ \Unicode{1D4B2}{MATHEMATICAL SCRIPT CAPITAL W}
+\endsetslot
+
+\setslot{X}
+ \Unicode{1D4B3}{MATHEMATICAL SCRIPT CAPITAL X}
+\endsetslot
+
+\setslot{Y}
+ \Unicode{1D4B4}{MATHEMATICAL SCRIPT CAPITAL Y}
+\endsetslot
+
+\setslot{Z}
+ \Unicode{1D4B5}{MATHEMATICAL SCRIPT CAPITAL Z}
+\endsetslot
+
+
+
+\begincomment
+\subsection{Card suits}
+\endcomment
+
+\nextslot{124}
+\setslot{club}
+ \Unicode{2663}{BLACK CLUB SUIT}
+\endsetslot
+
+\setslot{diamond}
+ \Unicode{2662}{WHITE DIAMOND SUIT}
+\endsetslot
+
+\setslot{heart}
+ \Unicode{2661}{WHITE HEART SUIT}
+\endsetslot
+
+\setslot{spade}
+ \Unicode{2660}{BLACK SPADE SUIT}
+\endsetslot
+
+
+
+\begincomment
+\section{Font dimensions}
+\endcomment
+
+\setfontdimen{1}{italicslant} % italic slant
+\setfontdimen{2}{interword} % interword space
+\setfontdimen{3}{stretchword} % interword stretch
+\setfontdimen{4}{shrinkword} % interword shrink
+\setfontdimen{5}{xheight} % x-height
+\setfontdimen{6}{quad} % quad
+\setfontdimen{7}{extraspace} % extra space after .
+
+\setfontdimen{8}{num1} % num 1
+\setfontdimen{9}{num2} % num 2
+\setfontdimen{10}{num3} % num 3
+\setfontdimen{11}{denom1} % denom 1
+\setfontdimen{12}{denom2} % denom 2
+\setfontdimen{13}{sup1} % sup 1
+\setfontdimen{14}{sup2} % sup 2
+\setfontdimen{15}{sup3} % sup 3
+\setfontdimen{16}{sub1} % sub 1
+\setfontdimen{17}{sub2} % sub 2
+\setfontdimen{18}{supdrop} % supdrop
+\setfontdimen{19}{subdrop} % subdrop
+\setfontdimen{20}{delim1} % delim 1
+\setfontdimen{21}{delim2} % delim 2
+\setfontdimen{22}{axisheight} % math axis height
+
+
+
+\begincomment
+\section{Default values}
+\endcomment
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+\setstr{encodingname}{TeXMathSymbolEncoding}
+
+
+\endencoding
+
+
+
+\end{document}
+
+%%%%% Old stuff:
+
+\begincomment
+\section{The encoding}
+\endcomment
+
+\setslot{minus}
+ \comment{The subtraction symbol `$-$'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered dot symbol `$\cdot$'.
+ It is called `dotmath' in Adobe Symbol.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication symbol `$\times$'.}
+\endsetslot
+
+\setslot{asteriskmath}
+ \comment{The centered asterisk symbol `$*$'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division symbol `$\plaindiv$'.}
+\endsetslot
+
+\setslot{diamondmath}
+ \comment{The diamond symbol `$\diamond$'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus symbol `$\pm$'.}
+\endsetslot
+
+\setslot{minusplus}
+ \comment{The minus or plus symbol `$\mp$'.}
+\endsetslot
+
+\setslot{circleplus}
+ \comment{The circled plus symbol `$\oplus$'.}
+\endsetslot
+
+\setslot{circleminus}
+ \comment{The circled minus symbol `$\ominus$'.}
+\endsetslot
+
+\setslot{circlemultiply}
+ \comment{The circled multiplication symbol `$\otimes$'.}
+\endsetslot
+
+\setslot{circledivide}
+ \comment{The circled oblique symbol `$\oslash$'.}
+\endsetslot
+
+\setslot{circledot}
+ \comment{The circled dot symbol `$\odot$'.}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \comment{The large circle symbol `$\bigcirc$' used for building the
+ copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The circle symbol `$\circ$'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The bullet symbol `$\bullet$'.}
+\endsetslot
+
+\setslot{equivasymptotic}
+ \comment{The asymptotic equals symbol `$\asymp$'.}
+\endsetslot
+
+\setslot{equivalence}
+ \comment{The equivalence symbol `$\equiv$'.}
+\endsetslot
+
+\setslot{reflexsubset}
+ \comment{The subset or equals symbol `$\subseteq$'.}
+\endsetslot
+
+\setslot{reflexsuperset}
+ \comment{The superset or equals symbol `$\supseteq$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The less or equals symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The greater or equals symbol `$\geq$'.}
+\endsetslot
+
+\setslot{precedesequal}
+ \comment{The precedes or equals symbol `$\preceq$'.}
+\endsetslot
+
+\setslot{followsequal}
+ \comment{The follows or equals symbol `$\succeq$'.}
+\endsetslot
+
+\setslot{similar}
+ \comment{The similar symbol `$\sim$'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The approximate equality symbol `$\approx$'.}
+\endsetslot
+
+\setslot{propersubset}
+ \comment{The subset symbol `$\subset$'.}
+\endsetslot
+
+\setslot{propersuperset}
+ \comment{The superset symbol `$\supset$'.}
+\endsetslot
+
+\setslot{lessmuch}
+ \comment{The much less symbol `$\ll$'.}
+\endsetslot
+
+\setslot{greatermuch}
+ \comment{The much greater symbol `$\gg$'.}
+\endsetslot
+
+\setslot{precedes} % was curlyless
+ \comment{The precedes symbol `$\prec$'.}
+\endsetslot
+
+\setslot{follows} % was curlygreater
+ \comment{The follows symbol `$\succ$'.}
+\endsetslot
+
+\setslot{arrowleft}
+ \comment{The left arrow symbol `$\leftarrow$'.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{The right arrow symbol `$\rightarrow$'.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{The up arrow symbol `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{The down arrow symbol `$\downarrow$'.}
+\endsetslot
+
+\setslot{arrowboth}
+ \comment{The horizontal arrow symbol `$\leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownortheast}
+ \comment{The north-east arrow symbol `$\nearrow$'.}
+\endsetslot
+
+\setslot{arrowsoutheast}
+ \comment{The south-east arrow symbol `$\searrow$'.}
+\endsetslot
+
+\setslot{similarequal}
+ \comment{The similar or equal symbol `$\simeq$'.}
+\endsetslot
+
+\setslot{arrowdblleft}
+ \comment{The double left arrow symbol `$\Leftarrow$'.}
+\endsetslot
+
+\setslot{arrowdblright}
+ \comment{The double right arrow symbol `$\Rightarrow$'.}
+\endsetslot
+
+\setslot{arrowdblup}
+ \comment{The double up arrow symbol `$\Uparrow$'.}
+\endsetslot
+
+\setslot{arrowdbldown}
+ \comment{The double down arrow symbol `$\Downarrow$'.}
+\endsetslot
+
+\setslot{arrowdblboth}
+ \comment{The double horizontal arrow symbol `$\Leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownorthwest}
+ \comment{The north-west arrow symbol `$\nwarrow$'.}
+\endsetslot
+
+\setslot{arrowsouthwest}
+ \comment{The south-west arrow symbol `$\swarrow$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The proportional symbol `$\propto$'.}
+\endsetslot
+
+\setslot{prime}
+ \comment{The prime symbol `$\prime$'.}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{element}
+ \comment{The set membership symbol `$\in$'.}
+\endsetslot
+
+\setslot{owner}
+ \comment{The backwards set membership symbol `$\ni$'.}
+\endsetslot
+
+\setslot{triangle}
+ \comment{The upwards triangle symbol `$\bigtriangleup$'.}
+\endsetslot
+
+\setslot{triangleinv}
+ \comment{The downwards triangle symbol `$\bigtriangledown$'.}
+\endsetslot
+
+\setslot{negationslash}
+ \comment{The negation slash symbol, used to construct
+ negated relations or arrows such as `$\not=$'.}
+\endsetslot
+
+\setslot{mapstochar}
+ \comment{The maps to building block symbol `$\mapstochar$',
+ used to build `$\mapsto$'.}
+\endsetslot
+
+\setslot{universal}
+ \comment{The universal quantification symbol `$\forall$'.}
+\endsetslot
+
+\setslot{existential}
+ \comment{The existential quantification symbol `$\exists$'.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The negation symbol `$\plainneg$'.}
+\endsetslot
+
+\setslot{emptysetstress}
+ \comment{The `stressed' empty set symbol `$\emptyset$', which should
+ look like a zero with a slash. The `emptyset' symbol is a circle
+ with a slash.}
+\endsetslot
+
+\setslot{Rfraktur}
+ \comment{The upper case Fraktur R symbol `$\Re$'. It is called
+ `Rfractur' rather than `Rfraktur' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{Ifraktur}
+ \comment{The upper case Fraktur I symbol `$\Im$'. It is called
+ `Ifractur' rather than `Ifraktur' in MathTime and Lucida New Math.}
+\endsetslot
+
+\setslot{latticetop}
+ \comment{The inverted perpendicular symbol `$\top$'.}
+\endsetslot
+
+\setslot{perpendicular}
+ \comment{The perpendicular symbol `$\perp$'.}
+\endsetslot
+
+\setslot{aleph}
+ \comment{The aleph symbol `$\aleph$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The calligraphic letter `$\mathcal{A}$'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The calligraphic letter `$\mathcal{B}$'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The calligraphic letter `$\mathcal{C}$'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The calligraphic letter `$\mathcal{D}$'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The calligraphic letter `$\mathcal{E}$'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The calligraphic letter `$\mathcal{F}$'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The calligraphic letter `$\mathcal{G}$'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The calligraphic letter `$\mathcal{H}$'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The calligraphic letter `$\mathcal{I}$'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The calligraphic letter `$\mathcal{J}$'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The calligraphic letter `$\mathcal{K}$'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The calligraphic letter `$\mathcal{L}$'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The calligraphic letter `$\mathcal{M}$'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The calligraphic letter `$\mathcal{N}$'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The calligraphic letter `$\mathcal{O}$'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The calligraphic letter `$\mathcal{P}$'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The calligraphic letter `$\mathcal{Q}$'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The calligraphic letter `$\mathcal{R}$'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The calligraphic letter `$\mathcal{S}$'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The calligraphic letter `$\mathcal{T}$'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The calligraphic letter `$\mathcal{U}$'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The calligraphic letter `$\mathcal{V}$'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The calligraphic letter `$\mathcal{W}$'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The calligraphic letter `$\mathcal{X}$'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The calligraphic letter `$\mathcal{Y}$'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The calligraphic letter `$\mathcal{Z}$'.}
+\endsetslot
+
+\setslot{union}
+ \comment{The set union symbol `$\cup$'.}
+\endsetslot
+
+\setslot{intersection}
+ \comment{The set intersection symbol `$\cap$'.}
+\endsetslot
+
+\setslot{unionmulti}
+ \comment{The multiset union symbol `$\uplus$'.}
+\endsetslot
+
+\setslot{logicaland}
+ \comment{The meet symbol `$\wedge$'.}
+\endsetslot
+
+\setslot{logicalor}
+ \comment{The join symbol `$\vee$'.}
+\endsetslot
+
+\setslot{turnstileleft}
+ \comment{The turnstile symbol `$\vdash$'.}
+\endsetslot
+
+\setslot{turnstileright}
+ \comment{The backwards turnstile symbol `$\dashv$'.}
+\endsetslot
+
+\setslot{floorleft}
+ \comment{The left floor symbol `$\lfloor$'.}
+\endsetslot
+
+\setslot{floorright}
+ \comment{The right floor symbol `$\rfloor$'.}
+\endsetslot
+
+\setslot{ceilingleft}
+ \comment{The left ceiling symbol `$\lceil$'.}
+\endsetslot
+
+\setslot{ceilingright}
+ \comment{The right ceiling symbol `$\rceil$'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The left brace symbol `$\{$'.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The right brace symbol `$\}$'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The left angle bracket symbol `$\langle$'.
+ It is called `angbracketleft' in MathTime and Lucida,
+ but `angleleft' in Adobe Symbol.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The right angle bracket symbol `$\rangle$'.
+ It is called `angbracketright' in MathTime and Lucida,
+ but `angleleft' in Adobe Symbol.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The vertical bar symbol `$|$'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The parallel vertical bars symbol `$\parallel$'.}
+\endsetslot
+
+\setslot{arrowbothv}
+ \comment{The vertical arrows symbol `$\updownarrow$'.}
+\endsetslot
+
+\setslot{arrowdblbothv}
+ \comment{The double vertical arrows symbol `$\Updownarrow$'.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique symbol `$\backslash$'.}
+\endsetslot
+
+\setslot{wreathproduct}
+ \comment{The Wreath product symbol `$\wp$'.}
+\endsetslot
+
+\setslot{radicallow}
+ \comment{The lowered radical symbol `$\surd$'.}
+\endsetslot
+
+\setslot{coproduct}
+ \comment{The textstyle coproduct symbol `$\coprod$'.}
+\endsetslot
+
+\setslot{gradient}
+ \comment{The inverted Delta symbol `$\nabla$'.
+ It is also called `gradient' in MathTime and Lucida,
+ but `gradient' in Adobe Symbol.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The small integral symbol `$\plainint$'.}
+\endsetslot
+
+\setslot{unionsq}
+ \comment{The square union symbol `$\sqcup$'.}
+\endsetslot
+
+\setslot{intersectionsq}
+ \comment{The square intersection symbol `$\sqcap$'.}
+\endsetslot
+
+\setslot{subsetsqequal}
+ \comment{The square subset or equal symbol `$\sqsubseteq$'.}
+\endsetslot
+
+\setslot{supersetsqequal}
+ \comment{The square superset or equal symbol `$\sqsupseteq$'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section symbol `\S'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The dagger symbol `\dag'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger symbol `\ddag'.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph symbol `\P'.}
+\endsetslot
+
+\setslot{club}
+ \comment{The club suit symbol `$\clubsuit$'.}
+\endsetslot
+
+\setslot{diamond}
+ \comment{The diamond suit symbol `$\diamondsuit$'.}
+\endsetslot
+
+\setslot{heart}
+ \comment{The heart suit symbol `$\heartsuit$'.}
+\endsetslot
+
+\setslot{spade}
+ \comment{The spade suit symbol `$\spadesuit$'.}
+\endsetslot
+
+\endencoding
+
+\section{Changes}
+
+29 Dec 1993, v1.30: Created file.
+
+03 Jan 1994, v1.301: Moved from ltugboat class to article.
+
+06 Jan 1994, v1.303: Corrected a fontdimen bug.
+
+08 Jan 1994, v1.304: Renamed radicallowered to radicallow and
+ perpendicularinverse to perpendicularinv.
+
+09 Jan 1994, v1.305: Renamed emptyset to emptysetstress, to distinguish
+ the geometric and the humanist emptyset symbols.
+ Renamed some glyphs to use the same glyph names
+ as Lucida New Math.
+
+10 Jun 1998, v1.800: Really use the same names as Lucida New Math.
+ `curlyless/greater' renamed to `precedes/follows'.
+
+06 Oct 2000, v1.915: Introduced intermediate variables for fontdimens
+ 8--22. Added \texttt{encodingname}. Updated markup.
+ (LH)
+
+27 Jul 2002, v1.921: Introduced intermediate variables also for
+ fontdimens 1--7. Switched to setting fontdimens
+ using \verb"\setfontdimen". (LH)
+
+24 Nov 2004, v1.928: Changed \verb"\neg" to \verb"\plainneg" for
+ `\texttt{logicalnot}'. (LH)
+
+\end{document}
diff --git a/fonts/utilities/fontinst/test/testsc.tex b/fonts/utilities/fontinst/test/testsc.tex
new file mode 100644
index 0000000000..c54452d45e
--- /dev/null
+++ b/fonts/utilities/fontinst/test/testsc.tex
@@ -0,0 +1,41 @@
+\input fontinst.sty
+
+\transformfont{padr8r} {\reencodefont{8r}{\fromafm{padr8a}}}
+\transformfont{padrc8r}{\reencodefont{8r}{\fromafm{padrc8a}}}
+\transformfont{pads8r} {\reencodefont{8r}{\fromafm{pads8a}}}
+\transformfont{padsc8r}{\reencodefont{8r}{\fromafm{padsc8a}}}
+\fromafm{padr8x}
+\fromafm{pads8x}
+
+\installfonts
+
+\installfamily{T1}{pad} {}
+\installfamily{T1}{padx}{}
+\installfamily{T1}{padj}{}
+
+\installfont{padrc8t}{padrc8r,latin}
+ {T1}{T1}{pad}{m}{sc}{}
+\installfont{padrc9e}
+ {kernoff,padr8r,padr8x,kernon,glyphoff,padrc8r,glyphon,
+ resetsc,latinsc}
+ {T1c}{T1}{padx}{m}{sc}{}
+\installfont{padrc9d}
+ {kernoff,padr8r,padr8x,kernon,glyphoff,padrc8r,glyphon,
+ resetosf,resetsc,latinsc}
+ {T1cj}{T1}{padj}{m}{sc}{}
+
+\installfont{padsc8t}{padsc8r,latin}
+ {T1}{T1}{pad}{m}{sc}{}
+\installfont{padsc9e}
+ {kernoff,pads8r,pads8x,kernon,glyphoff,padsc8r,glyphon,
+ resetsc,latinsc}
+ {T1c}{T1}{padx}{sb}{sc}{}
+\installfont{padsc9d}
+ {kernoff,pads8r,pads8x,kernon,glyphoff,padrc8r,glyphon,
+ resetosf,resetsc,latinsc}
+ {T1cj}{T1}{padj}{sb}{sc}{}
+
+\endinstallfonts
+\bye
+
+
diff --git a/fonts/utilities/fontinst/test/v1901test.mtx b/fonts/utilities/fontinst/test/v1901test.mtx
new file mode 100644
index 0000000000..624a39bf81
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1901test.mtx
@@ -0,0 +1,22 @@
+\relax
+
+% This is a test MTX file for the new implementation of
+% the \transformfont stuff.
+
+\metrics
+
+\setint{italicslant}{0}
+\setint{italicslant}{100}
+\setint{xheight}{400}
+
+\setrawglyph{a}{v1901test}{10.95pt}{10} {500}{400}{0}{40}
+\setrawglyph{g}{v1901test}{10.95pt}{10} {500}{400}{-300}{40}
+
+\setkern{a}{g}{100}
+
+\setglyph{ag}
+ \glyphpcc{a}{0}{500}
+ \glyphpcc{g}{500}{0}
+\endsetglyph
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1901test.tex b/fonts/utilities/fontinst/test/v1901test.tex
new file mode 100644
index 0000000000..81a6218f67
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1901test.tex
@@ -0,0 +1,214 @@
+% Test of fontinst v1.901.
+% Started 1999/03/13.
+\input fontinst.sty
+
+% Part one---test of pooled file allocation.
+\catcode`\_=11
+\catcode`\@=11
+
+\def\show_out_filenames{%
+ \immediate\write16{\string\count17=\the\count17}%
+ \for(i){-1}{16}{1}%
+ \immediate\write16{Stream \strint{i}:
+ \x_cs\meaning{out_filename-\strint{i}}%
+ }%
+ \endfor(i)%
+}
+
+% %1 Standard usage
+% \show_out_filenames
+% \open_pout\tF{\jobname.out}
+% \show_out_filenames
+% \pout_line\tF{Hello world!}
+% \close_pout\tF{Test output}
+% \show_out_filenames
+% % Seems to work fine.
+
+% %2 Allocating LOTS of files.
+% \newcount\j_count
+% \newcount\k_count
+% \j_count=0
+% \k_count=1
+% \for(o){1}{48}{1}
+% \x_cs\open_pout{F-\strint{o}}{\jobname.\strint{o}}%
+% \ifodd \int{o} \else
+% \x_cs\pout_line{F-\the\k_count}{%
+% open=\strint{o} close=\the\j_count\space write=\the\k_count
+% }%
+% \multiply \k_count \thr@@
+% \advance \k_count \@ne
+% \d_count=\k_count
+% \divide \d_count \int{o}%
+% \multiply \d_count \int{o}%
+% \advance \k_count -\d_count
+% \advance \k_count \@ne
+% \advance \j_count \@ne
+% \x_cs\close_pout{F-\the\j_count}{Test data}%
+% \fi
+% \d_count=\int{o}%
+% \divide \d_count 8%
+% \multiply \d_count 8%
+% \advance \d_count -\int{o}%
+% \ifnum 0=\d_count \show_out_filenames \fi
+% \endfor(o)
+% % Seems to work fine as well.
+
+
+%% Part two---test of reimplemented \transformfont stuff
+%% Part two B---test of \recordtransforms stuff
+
+\recordtransforms{mapfrags.tex}
+\transformfont{v1901test1}{
+ \xscalefont{2000}{\reencodefont{t1c}{\frommtx{v1901test}}}
+}
+\transformfont{v1901test2}{
+ \yscalefont{500}{\xscalefont{2000}{\frommtx{v1901test}}}
+}
+\transformfont{v1901test3}{
+ \reencodefont{t1}{\slantfont{100}{\frommtx{v1901test}}}
+}
+\endrecordtransforms
+
+
+\bye
+
+%% Part three---test of reglyphing
+
+\reglyphfonts
+ \resetcommand\iftokeep#1\then{\ifnum 0<#1}
+ % This means that an AFM command will survive the conversion only if
+ % it refers to at least one renamed glyph and not refer to any killed
+ % glyph.
+
+% \offmtxcommand\setrawglyph
+% \offmtxcommand\setglyph
+% % This reglyphing file is inteded for extracting information from the
+% % AFM file of a Caps, Small caps, and Oldstyle figures fonts--with the
+% % intention to build a corresponding virtual font with glyphs that are
+% % present in the Regular and Expert Regular variants instead. Hence
+% % there is no need for \setrawglyph or \setglyph commands (the
+% % dimensions of the characters are known from the Reg. and Exp.Reg.
+% % AFM's), but the \setkern commands are most interesting (since 8x
+% % fonts don't contain any upper case letters, and hence has no kerning
+% % pairs between these and the small caps either).
+
+
+ \renameglyph{dollaroldstyle}{dollar}
+ \renameglyph{ampersandsmall}{ampersand}
+
+ \renameglyph{zerooldstyle}{zero}
+ \renameglyph{oneoldstyle}{one}
+ \renameglyph{twooldstyle}{two}
+ \renameglyph{threeoldstyle}{three}
+ \renameglyph{fouroldstyle}{four}
+ \renameglyph{fiveoldstyle}{five}
+ \renameglyph{sixoldstyle}{six}
+ \renameglyph{sevenoldstyle}{seven}
+ \renameglyph{eigtholdstyle}{eight}
+ \renameglyph{nineoldstyle}{nine}
+
+ \renameglyph{Asmall}{a}
+ \renameglyph{Bsmall}{b}
+ \renameglyph{Csmall}{c}
+ \renameglyph{Dsmall}{d}
+ \renameglyph{Esmall}{e}
+ \renameglyph{Fsmall}{f}
+ \renameglyph{Gsmall}{g}
+ \renameglyph{Hsmall}{h}
+ \renameglyph{Ismall}{i}
+ \renameglyph{Jsmall}{j}
+ \renameglyph{Ksmall}{k}
+ \renameglyph{Lsmall}{l}
+ \renameglyph{Msmall}{m}
+ \renameglyph{Nsmall}{n}
+ \renameglyph{Osmall}{o}
+ \renameglyph{Psmall}{p}
+ \renameglyph{Qsmall}{q}
+ \renameglyph{Rsmall}{r}
+ \renameglyph{Ssmall}{s}
+ \renameglyph{Tsmall}{t}
+ \renameglyph{Usmall}{u}
+ \renameglyph{Vsmall}{v}
+ \renameglyph{Wsmall}{w}
+ \renameglyph{Xsmall}{x}
+ \renameglyph{Ysmall}{y}
+ \renameglyph{Zsmall}{z}
+
+ \renameglyph{centoldstyle}{cent}
+
+ % \renameglyph{FIsmall}{fi}
+ % \renameglyph{FLsmall}{fl}
+ % These two aren't really necessary, since the ligature `fi' looks
+ % exactly as the letters `f'`i' next to each others.
+ \killglyph{fi}
+ \killglyph{fl}
+
+ \renameglyph{Gravesmall}{grave}
+ \renameglyph{Acutesmall}{acute}
+ \renameglyph{Circumflexsmall}{circumflex}
+ \renameglyph{Tildesmall}{tilde}
+ \renameglyph{Macronsmall}{macron}
+ \renameglyph{Brevesmall}{breve}
+ \renameglyph{Dotaccentsmall}{dotaccent}
+ \renameglyph{Dieresissmall}{dieresis}
+ \renameglyph{Ringsmall}{ring}
+ \renameglyph{Cedillasmall}{cedilla}
+ \renameglyph{Ogoneksmall}{ogonek}
+ \renameglyph{Caronsmall}{caron}
+
+ \renameglyph{AEsmall}{ae}
+ \renameglyph{dotlessIsmall}{dotlessi}
+ \renameglyph{Lslashsmall}{lslash}
+ \renameglyph{Oslashsmall}{oslash}
+ \renameglyph{OEsmall}{oe}
+ % \renameglyph{SSsmall}{germandbls}
+ % This isn't really needed in the AGaramond font family, since `SSsmall'
+ % looks exactly like `Ssmall'`Ssmall'
+ \killglyph{germandbls}
+
+ \renameglyph{Oacutesmall}{oacute}
+ \renameglyph{Odieresissmall}{odieresis}
+ \renameglyph{Ucircumflexsmall}{ucircumflex}
+
+ \renameglyph{Uacutesmall}{uacute}
+ \renameglyph{Eacutesmall}{eacute}
+ \renameglyph{Iacutesmall}{iacute}
+ \renameglyph{Icircumflexsmall}{icircumflex}
+
+ \renameglyph{Thornsmall}{thorn}
+ \renameglyph{Yacutesmall}{yacute}
+
+ \renameglyph{Ocircumflexsmall}{ocircumflex}
+ \renameglyph{Otildesmall}{otilde}
+ \renameglyph{Ntildesmall}{ntilde}
+ \renameglyph{Ydieresissmall}{ydieresis}
+ \renameglyph{Ethsmall}{eth}
+ \renameglyph{Acircumflexsmall}{acircumflex}
+ \renameglyph{Aringsmall}{aring}
+ \renameglyph{Ccedillasmall}{ccedilla}
+
+ \renameglyph{Ugravesmall}{ugrave}
+ \renameglyph{Zcaronsmall}{zcaron}
+ \renameglyph{Idieresissmall}{idieresis}
+ \renameglyph{Agravesmall}{agrave}
+
+ \renameglyph{Ogravesmall}{ograve}
+
+ \renameglyph{Udieresissmall}{udieresis}
+ \renameglyph{Edieresissmall}{edieresis}
+ \renameglyph{Aacutesmall}{aacute}
+ \renameglyph{Igravesmall}{igrave}
+ \renameglyph{Idieresissmall}{idieresis}
+ \renameglyph{Adieresissmall}{adieresis}
+
+ \renameglyph{Scaronsmall}{scaron}
+ \renameglyph{Egravesmall}{egrave}
+ \renameglyph{Atildesmall}{atilde}
+ \renameglyph{Ecircumflexsmall}{ecircumflex}
+
+ \reglyphfont{K-padrc}{gdsc}
+ \reglyphfont{K-padsc}{padsc8a}
+\endreglyphfonts
+
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1902test.tex b/fonts/utilities/fontinst/test/v1902test.tex
new file mode 100644
index 0000000000..7274fb7659
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1902test.tex
@@ -0,0 +1,11 @@
+\input fontinst.sty
+
+\generalpltomtx{cmr5}{cmr5;1}{pl}{OT1}
+\generalpltomtx{padr9d}{padr9d;1}{vpl}{}
+\generalpltomtx{padr9d}{padr9d;2}{vpl}{OT1}
+
+\transformfont{cmr5;2}{\fromplgivenetx{cmr5}{OT1}}
+\transformfont{padr9d;3}{\fromvpl{padr9d}}
+\transformfont{padr9d;4}{\fromvplgivenetx{padr9d}{OT1}}
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1905test.tex b/fonts/utilities/fontinst/test/v1905test.tex
new file mode 100644
index 0000000000..47117acc5f
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1905test.tex
@@ -0,0 +1,22 @@
+\input fontinst.sty
+\catcode`\_=11\catcode`\ =9\catcode`\^^M=9
+\catcode`\~=10\catcode`\@=11
+
+\fontinst_error{Hungarian}{
+ I~will~not~buy~this~record,\message_break
+ it~is~scratched
+}\error_help_a
+
+\fontinst_warning{Hungarian}{Your~hovercraft~is~full~of~eels}
+
+\fontinst_info{Hungarian}{That~will~be~six~pence,~please}
+
+\fontinst_warning_no_line{Hungarian}{
+ Do~you~want~to~come~home~to~my~place\message_break
+ and~pantsy~pantsy?
+}
+
+
+
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1906test.etx b/fonts/utilities/fontinst/test/v1906test.etx
new file mode 100644
index 0000000000..072cdfdf68
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1906test.etx
@@ -0,0 +1,128 @@
+\relax
+% Test1.etx
+
+
+
+\encoding
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+% added by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>
+% 1997/02/07 to calculate values for extra EC fontdimens
+% Amended by SPQR 1997/02/09
+\ifisglyph{X}\then
+ \setint{capheight}{\height{X}}
+\else
+ \setint{capheight}{750}
+\fi
+
+\ifisglyph{d}\then
+ \setint{ascender}{\height{d}}
+\else
+ \ifisint{capheight}\then
+ \setint{ascender}{\int{capheight}}
+ \else
+ \setint{ascender}{750}
+\fi\fi
+
+\ifisglyph{Aring}\then
+ \setint{acccapheight}{\height{Aring}}
+\else
+ \setint{acccapheight}{999}
+\fi
+
+\ifisint{descender_neg}\then
+ \setint{descender}{\neg{\int{descender_neg}}}
+ \else
+ \ifisglyph{p}\then
+ \setint{descender}{\depth{p}}
+ \else
+ \setint{descender}{250}
+ \fi
+\fi
+
+\ifisglyph{Aring}\then
+ \setint{maxheight}{\height{Aring}}
+\else
+ \setint{maxheight}{1000}
+\fi
+
+\ifisint{maxdepth_neg}\then
+ \setint{maxdepth}{\neg{\int{maxdepth_neg}}}
+\else
+ \ifisglyph{j}\then
+ \setint{maxdepth}{\depth{j}}
+ \else
+ \setint{maxdepth}{250}
+ \fi
+\fi
+
+\ifisglyph{six}\then
+ \setint{digitwidth}{\width{six}}
+\else
+ \setint{digitwidth}{500}
+\fi
+
+\setint{capstem}{0} % not in AFM files
+\setint{baselineskip}{1200}
+% end changes by Thierry
+
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\fi
+% added by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr> 1997/02/07
+\setint{fontdimen(8)}{\int{capheight}} % cap height
+\setint{fontdimen(9)}{\int{ascender}} % ascender
+\setint{fontdimen(10)}{\int{acccapheight}} % accented cap height
+\setint{fontdimen(11)}{\int{descender}} % descender's depth
+\setint{fontdimen(12)}{\int{maxheight}} % max height
+\setint{fontdimen(13)}{\int{maxdepth}} % max depth
+\setint{fontdimen(14)}{\int{digitwidth}} % digit width
+\setint{fontdimen(15)}{\int{capstem}} % cap_stem
+\setint{fontdimen(16)}{\int{baselineskip}} % baselineskip
+
+
+\comment{\section{The encoding}}
+
+\for(i){0}{20}{1}
+ \setslot{c\strint{i}}
+ \comment{The `c\strint{i}' test glyph.}
+ \endsetslot
+\endfor(i)
+
+\setslot{d}
+\endsetslot
+
+
+
+\endencoding
diff --git a/fonts/utilities/fontinst/test/v1906test.mtx b/fonts/utilities/fontinst/test/v1906test.mtx
new file mode 100644
index 0000000000..94306a07b3
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1906test.mtx
@@ -0,0 +1,64 @@
+\relax
+% v1906test.mtx
+%
+% A test of the nokerning commands and the \glyphbboxright IE.
+
+
+\metrics
+
+\for(i){0}{20}{1}
+ \setglyph{c\strint{i}}
+ \glyphrule{20}{\mul{\add{\int{i}}{1}}{20}}
+ \movert{\mul{20}{\int{i}}}
+ \endsetglyph
+\endfor(i)
+
+
+\setglyph{d}
+ \for(i){5}{10}{1}
+ \glyphpcc{c\strint{i}}{\int{i}}{\int{i}}
+ \endfor(i)
+ \resetint{j}{\glyphbboxright}
+ \immediate\write16{\string\glyphbboxright=\strint{j}}
+ \glyph{c20}{1000}
+ \resetint{j}{\glyphbboxright}
+ \immediate\write16{\string\glyphbboxright=\strint{j}}
+\endsetglyph
+
+
+\for(i){0}{20}{1}
+ \for(j){0}{20}{1}
+ \setkern{c\strint{i}}{c\strint{j}}{\mul{\int{i}}{\int{j}}}
+ \endfor(j)
+\endfor(i)
+
+\noleftkerning{c1,c3,c5,c7,c9,c11,c13,c15,c17,c19}
+\immediate\write16{\expandafter\meaning\csname a_macro\endcsname}
+\norightkerning{c1,c3,c5,c7,c9}
+
+% \resetint{i}{0}
+% \loop
+% \setkern{c\strint{i}}{c\strint{i}}{-50}
+% \resetint{j}{\sub{20}{\int{i}}}
+% \resetkern{c\strint{i}}{c\strint{j}}{-100}
+% \ifnum 20>\int{i}
+% \resetint{i}{\add{\int{i}}{1}}
+% \repeat
+
+
+% \resetint{i}{0}
+% \loop
+% \ifiskern{c3}{c\strint{i}}\then
+% \resetint{T}{\kerning{c3}{c\strint{i}}}
+% \message{c3:c\strint{i} has kern \strint{T} units^^J}
+% \else
+% \message{c3:c\strint{i} no kern^^J}
+% \fi
+% \ifnum 20>\int{i}
+% \resetint{i}{\add{\int{i}}{1}}
+% \repeat
+
+
+
+\endmetrics
+
diff --git a/fonts/utilities/fontinst/test/v1906test.tex b/fonts/utilities/fontinst/test/v1906test.tex
new file mode 100644
index 0000000000..92ed628119
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1906test.tex
@@ -0,0 +1,12 @@
+%&Plain
+% Test of fontinst v1.906.
+% Begun 1999/08/01.
+\input fontinst.sty
+
+\installfonts
+ \installfamily{U}{ztest1}{}
+ \installfont{v1906test}{v1906test}{v1906test}{U}{ztest1}{m}{n}{}
+\endinstallfonts
+
+\bye
+
diff --git a/fonts/utilities/fontinst/test/v1913test.tex b/fonts/utilities/fontinst/test/v1913test.tex
new file mode 100644
index 0000000000..b9382cdf89
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1913test.tex
@@ -0,0 +1,21 @@
+\input fontinst.sty
+
+\recordtransforms{v1913test.recs}
+
+\transformfont{padr8r}{\reencodefont{8r}{\fromafm{padr8a}}}
+\transformfont{padr8r-ys}{\yscalefont{\div{397000}{663}}{\frommtx{padr8r}}}
+\reglyphfonts
+ \renameglyph{oneoldstyle}{one}
+ \reglyphfont{padr8r-ys2}{padr8r-ys}
+\endreglyphfonts
+
+\installfonts
+ \installfamily{T1}{pad}{}
+ \installfamily{8r}{pad}{}
+ \installfont{padr9d}{padr8r,padr8r-ys2,padr8x,latin}{t1j}{T1}{pad}{m}{n}{}
+ \installrawfont{padr8r2}{padr8r-ys}{8r}{8r}{pad}{m}{n}{}
+\endinstallfonts
+
+\endrecordtransforms
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1914test.tex b/fonts/utilities/fontinst/test/v1914test.tex
new file mode 100644
index 0000000000..73b271b986
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1914test.tex
@@ -0,0 +1,50 @@
+\input fontinst.sty
+
+%1
+\recordtransforms{v1914test.recs}
+
+\transformfont{padr8r}{\reencodefont{8r}{\fromafm{padr8a}}}
+\for(x){0}{2}{1}
+ \for(y){0}{2}{1}
+ \transformfont{p-ad-rr--8r--\strint{x}=\strint{y}}{
+ \xscalefont{\add{\mul{\int{x}}{300}}{700}}{
+ \yscalefont{\add{\mul{\int{y}}{300}}{700}}{
+ \frommtx{padr8r}}}}
+ \endfor(y)
+\endfor(x)
+
+\installfonts
+ \installfamily{T1}{padxy}{}
+ \installfamily{8r}{padxy}{}
+ \for(x){0}{2}{1}
+ \for(y){0}{2}{1}
+ \installfont{p-ad-rr--8t--\strint{x}=\strint{y}}
+ {p-ad-rr--8r--\strint{x}=\strint{y},latin}
+ {t1}{T1}{padxy}{m\strint{x}\strint{y}}{n}{}
+ \installrawfont{p-ad-rr--8r--\strint{x}=\strint{y}}
+ {p-ad-rr--8r--\strint{x}=\strint{y},8r}
+ {8r}{8r}{padxy}{m\strint{x}\strint{y}}{n}{}
+ \endfor(y)
+ \endfor(x)
+\endinstallfonts
+
+\endrecordtransforms
+
+% % \tracingmacros=1\tracingcommands=2
+% %2
+% \installfonts
+% \installrawfont{cmr5}{cmr5,\metrics
+% \resetint{xheight}{\mul{\int{xheight}}{2}},kernoff}{ot1}{OT1}
+% {cmr}{m}{n}{5}
+% \installfont{padr18t}{padr8r scaled 856,%
+% \metrics \message{%
+% \ifisint{rawscale}\then\strint{rawscale}\else None\fi
+% }%
+% \expandafter\show \csname g-A\endcsname
+% ,latin,%
+% \metrics \message{%
+% \ifisint{rawscale}\then\strint{rawscale}\else None\fi
+% }}{t1}{T1}{pad}{m}{ns}{}
+% \endinstallfonts
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1914testmap.tex b/fonts/utilities/fontinst/test/v1914testmap.tex
new file mode 100644
index 0000000000..9b1921bbc8
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1914testmap.tex
@@ -0,0 +1,17 @@
+\input finstmsc.sty
+
+\resetstr{PSfontsuffix}{.pfb}
+\adddriver{dvipdfm}{v1914test.dvipdfm}
+\adddriver{pltotf}{v1914test.sh} % v1.915 feature, actually
+\input v1914test.recs
+\donedrivers
+
+\AssumeLWFN
+\adddriver{dvips}{v1914test.map}
+\adddriver{debug}{v1914test.debug}
+\debugvalue{PS_font_file}
+\input v1914test.recs
+\donedrivers
+
+
+\bye
diff --git a/fonts/utilities/fontinst/test/v1914testshow.tex b/fonts/utilities/fontinst/test/v1914testshow.tex
new file mode 100644
index 0000000000..bd7a957b0a
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1914testshow.tex
@@ -0,0 +1,22 @@
+\documentclass{article}
+
+
+\newcommand\fontxy[2]{%
+ \usefont{T1}{padxy}{m#1#2}{n}%
+ Flygande b\"ackasiner s\"oka hwila p\r{a} mjuka tuvor%
+}
+
+
+\begin{document}
+
+$$
+ \hss
+ \begin{tabular}{lll}
+ \fontxy00& \fontxy10& \fontxy20\\
+ \fontxy01& \fontxy11& \fontxy21\\
+ \fontxy02& \fontxy12& \fontxy22
+ \end{tabular}
+ \hss
+$$
+\end{document}
+
diff --git a/fonts/utilities/fontinst/test/v1915test.tex b/fonts/utilities/fontinst/test/v1915test.tex
new file mode 100644
index 0000000000..c889464e44
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1915test.tex
@@ -0,0 +1,25 @@
+\input fontinst.sty
+
+% %1: Catcodes
+% \def\do#1{Catcode of `\string#1 = \the\catcode`#1 ^^J}
+% \def\showcatcodes{\message{\do{\ }\do{\^^M}\do{\@}\do{\_}\do{\~}}}
+%
+% \showcatcodes
+% \show\fontinstcc
+% \fontinstcc
+% \showcatcodes
+% \show\normalcc
+% \normalcc
+% \showcatcodes
+
+%2: Aliased glyphs
+\input Knuth:fontinst:New.fontinst:cyrfinst:etc:fnstcorr.tex
+\transformfont{padsc8r}{\reencodefont{8r}{\fromafm{padsc8a}}}
+\def\renameglyph#1#2{\galias{#1}{#2}}
+\input csc2x.tex
+\transformfont{padscx8r}{\reencodefont{8r}{\fromafm{padsc8a}}}
+% När glyfnamnen har tagits bort från de omkodade PL-filerna så är
+% de i allt väsentligt lika. Sålunda tycks det fungera!
+
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1915testmap.tex b/fonts/utilities/fontinst/test/v1915testmap.tex
new file mode 100644
index 0000000000..7e83526cd4
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1915testmap.tex
@@ -0,0 +1,9 @@
+\input finstmsc.sty
+\adddriver{pltotf}{v1915test.sh}
+\input v1914test.recs
+\donedrivers
+\setstr{TFMfileprefix}{:a:b:c:}
+\adddriver{pltotf}{v1915test.sh2}
+\input v1913test.recs
+\donedrivers
+\bye
diff --git a/fonts/utilities/fontinst/test/v1916test.mtx b/fonts/utilities/fontinst/test/v1916test.mtx
new file mode 100644
index 0000000000..1829c79d02
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1916test.mtx
@@ -0,0 +1,23 @@
+\relax
+
+\documentclass[twocolumn]{article}
+\usepackage{fontdoc}
+
+\errorcontextlines=999
+
+\begin{document}
+
+\metrics
+
+\foreach(glyph){a,b,c,d,tilde,\strint{a},db\str{a}ef,AB\str{glyph}CD}
+ \resetglyph{\str{glyph}}
+ \glyph{\str{glyph}}{1000}
+ \resetitalic{0}
+ \endresetglyph
+\endfor(glyph)
+
+
+\endmetrics
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/test/v1916test.tex b/fonts/utilities/fontinst/test/v1916test.tex
new file mode 100644
index 0000000000..56f26a51b0
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1916test.tex
@@ -0,0 +1,14 @@
+% v1916test.tex
+
+\input fontinst.sty
+
+% \half and \otherhalf
+\fontinstcc
+\for(i){-5}{5}{1}
+ \eval_expr_to\b_count{\half{\int{i}}}
+ \eval_expr{\otherhalf{\int{i}}}
+ \immediate\write16{\strint{i}:~\the\b_count \space+~ \the\result}
+\endfor(i)
+\normalcc
+
+\bye
diff --git a/fonts/utilities/fontinst/test/v1916test2.tex b/fonts/utilities/fontinst/test/v1916test2.tex
new file mode 100644
index 0000000000..8cc954f261
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1916test2.tex
@@ -0,0 +1,27 @@
+%&Plain
+\input fontinst.sty
+
+% %1 \ifareglyphs
+%
+% \setrawglyph{f}{xfont}{10pt}{102}{375}{750}{375}{50}
+% \setrawglyph{g}{xfont}{10pt}{102}{375}{750}{375}{50}
+% \setrawglyph{h}{xfont}{10pt}{102}{375}{750}{375}{50}
+%
+% \ifareglyphs{}\then True \else False \fi
+% \ifareglyphs{a}\then True \else False \fi
+% \ifareglyphs{f}\then True \else False \fi
+% \ifareglyphs{f,a}\then True \else False \fi
+% \ifareglyphs{a,f}\then True \else False \fi
+% \ifareglyphs{f,g}\then True \else False \fi
+% \ifareglyphs{f,g,a}\then True \else False \fi
+
+%2 \setfontdimen
+\generalpltomtx{ecrm1000}{ecrm1000}{pl}{t1draft}
+\generalpltomtx{ecss1000}{ecss1000}{pl}{t1draft}
+\transformfont{ecdh-shrunk}{%
+ \yscalefont{500}{\fromplgivenetx{ecdh1000}{t1draft}}%
+}
+
+\bye
+
+
diff --git a/fonts/utilities/fontinst/test/v1923test.tex b/fonts/utilities/fontinst/test/v1923test.tex
new file mode 100644
index 0000000000..ede00d9044
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1923test.tex
@@ -0,0 +1,47 @@
+%&Plain
+
+\input fontinst.sty
+
+% %1
+% \transformfont{padr8r}{\reencodefont{8r}{\fromafm{padr8a}}}
+% \transformfont{padri8r}{\reencodefont{8r}{\fromafm{padri8a}}}
+%
+% \installfonts
+% \installfamily{T1}{pad2}{}
+% \installfont{zpad2i8t}{padri8r scaled 1009,%
+% padr8r scaled 999 suffix -upright scaled 1009,\metrics
+% % \expandafter\show \csname r-T-upright\endcsname
+% \unsetglyph{parenleft}
+% \setglyph{parenleft}
+% \glyph{parenleft-upright}{1000}
+% \endsetglyph
+% \resetglyph{parenright}
+% \glyph{parenright-upright}{1000}
+% \endresetglyph,latin}{t1}{T1}{pad2}{m}{it}{}
+% \endinstallfonts
+
+% %2
+%
+% \installfonts
+% \installfamily{U}{fad}{}
+% \installfont{fadrr}{fadrr}{textfdim,fadrr mtxasetx}{U}{fad}{m}{n}{}
+% \endinstallfonts
+
+% %3
+% \transformfont{pagk8r}{\reencodefont{8r}{\fromafm{pagk8a}}}
+% \installfonts
+% \installfont{pagk8t}{pagk8r,newlatin}{t1}{T1}{pag}{m}{n}{}
+% \endinstallfonts
+
+%4
+\installfonts
+ \installfont{test}{rsfs10 encoding rsfs,cmsy10}{oms}{OMS}{xxx}{m}{n}{}
+\endinstallfonts
+% %4b
+% \installfonts
+% \installfont{test}{cmsy10,rsfs10 encoding rsfs}{oms}{OMS}{xxx}{m}{n}{}
+% \endinstallfonts
+
+
+\bye
+
diff --git a/fonts/utilities/fontinst/test/v1927test.tex b/fonts/utilities/fontinst/test/v1927test.tex
new file mode 100644
index 0000000000..b21f16bf60
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1927test.tex
@@ -0,0 +1,18 @@
+%&Plain
+
+\input finstmsc.sty
+
+% %1
+% \etxtoenc{ot1}{temp}
+
+%2
+\storemapdata{a}{\fromafm{a}{XX}}{}
+\storemapdata{a}{\fromafm{a}{XX}}{}
+\storemapdata{a}{\fromafm{a}{XY}}{}
+\storemapdata{a}{\fromafm{a}{XX}}{}
+\storemapdata{a}{\fromafm{a}{XX}}{\reencodefont{8r}}
+
+
+
+\bye
+
diff --git a/fonts/utilities/fontinst/test/v1928test.tex b/fonts/utilities/fontinst/test/v1928test.tex
new file mode 100644
index 0000000000..8242cc3438
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1928test.tex
@@ -0,0 +1,13 @@
+%&Plain
+
+\input finstmsc.sty
+
+%1
+\etxtocmap{t1draft}{temp}
+\etxtocmap{ot1draft}{ot1}
+\etxtocmap{omsdraft}{oms}
+
+
+
+\bye
+
diff --git a/fonts/utilities/fontinst/test/v1928test2.tex b/fonts/utilities/fontinst/test/v1928test2.tex
new file mode 100644
index 0000000000..c9b099e643
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1928test2.tex
@@ -0,0 +1,32 @@
+\documentclass{article}
+
+
+
+
+\def\FontWithCMap#1#2#3{%
+ \font#1=#2\relax
+ \immediate\pdfobj stream file {#3}%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+}
+\def\AddCMapToFont#1#2{%
+ \immediate\pdfobj stream file {#2}%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+}
+
+
+\begin{document}
+
+
+\FontWithCMap\test{cmr12}{ot1.cmap}
+\test abcdef ghijkl mnopqr stuvwx yz fi fl ffi ffl
+
+
+\begin{math}
+ a
+ \AddCMapToFont{\textfont2}{oms.cmap}
+ \mathcal{A} - \mathcal{B} + \mathcal{C} * \mathcal{D} \cdot
+ \mathcal{E} \bullet \mathcal{F} \spadesuit
+\end{math}
+
+
+\end{document}
diff --git a/fonts/utilities/fontinst/test/v1930test.tex b/fonts/utilities/fontinst/test/v1930test.tex
new file mode 100644
index 0000000000..5fbc46b0d5
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1930test.tex
@@ -0,0 +1,16 @@
+%&Plain
+
+\input fontinst.sty
+
+
+%1
+\CalculateTan{30}
+\message{sin 30 = \UseSin{30}}
+\message{cos 30 = \UseCos{30}}
+\message{tan 30 = \UseTan{30}}
+
+
+
+\bye
+
+
diff --git a/fonts/utilities/fontinst/test/v1931test0.tex b/fonts/utilities/fontinst/test/v1931test0.tex
new file mode 100644
index 0000000000..edee5cf3b5
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1931test0.tex
@@ -0,0 +1,8 @@
+% Test fontinst v1.931
+%
+
+\input finstmsc.sty
+
+\enctoetx{cc-pl}{cc-pl-test}
+
+\bye \ No newline at end of file
diff --git a/fonts/utilities/fontinst/test/v1931test1.tex b/fonts/utilities/fontinst/test/v1931test1.tex
new file mode 100644
index 0000000000..d6c7052d5b
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1931test1.tex
@@ -0,0 +1,50 @@
+% fontinst v1.931 test
+
+\input fontinst.sty
+
+\recordtransforms{v1931test.recs}
+
+
+\transformfont{padr6z}{\reencodefont{cc-pl-test}{\fromafm{padr8a}}}
+\transformfont{padro6z}{\slantfont{250}{\frommtx{padr6z}}}
+
+\substitutesilent{sl}{sl}
+
+
+\installfonts
+ \installfont{padr8d}{padr6z,newlatin option nosc}{t1} {T1}{pad}{m}{n}{}
+ \installfont{padro8d}{padro6z,newlatin option nosc}{t1} {T1}{pad}{m}{sl}{}
+\endinstallfonts
+
+\endrecordtransforms
+
+\bye
+
+
+% Expected t1pad.fd contents:
+%
+% %Filename: t1pad.fd
+% %Created by: tex v1931test1
+% %Created using fontinst v1.931
+%
+% %THIS FILE SHOULD BE PUT IN A TEX INPUTS DIRECTORY
+%
+% \ProvidesFile{t1pad.fd}
+% [2005/05/14 Fontinst v1.931 font definitions for T1/pad.]
+%
+% \DeclareFontFamily{T1}{pad}{}
+%
+% \DeclareFontShape{T1}{pad}{m}{n}{
+% <-> padr8d
+% }{}
+%
+% \DeclareFontShape{T1}{pad}{m}{sl}{
+% <-> padro8d
+% }{}
+%
+%
+% \endinput
+%
+% The notable feature is that there is no {T1}{pad}{m}{it} entry,
+% since that substitution was turned off.
+
diff --git a/fonts/utilities/fontinst/test/v1931test2.tex b/fonts/utilities/fontinst/test/v1931test2.tex
new file mode 100644
index 0000000000..8fecddca18
--- /dev/null
+++ b/fonts/utilities/fontinst/test/v1931test2.tex
@@ -0,0 +1,35 @@
+% fontinst v1.931 test
+
+\input finstmsc.sty
+
+
+% %1
+%
+% \adddriver{dvips}{v1931test.map}
+% \input v1931test.recs
+% \donedrivers
+%
+% % Expected results in v1931test.map:
+% %
+% % padr6z AGaramond-Regular <cc-pl.enc <padr8a.pfa " encpcr ReEncodeFont "
+% % padro6z AGaramond-Regular <cc-pl.enc <padr8a.pfa " encpcr ReEncodeFont 0.25 SlantFont "
+
+
+%2
+
+\specifypsfont{AGaramond-Regular}{\fulldownload{gdrg____.pfb}}
+\declarepsencoding{cc-pl-test}{encpcr}{\encodingdownload{cc-pl.enc}}
+
+\adddriver{dvips}{v1931test.map}
+\input v1931test.recs
+\donedrivers
+
+% Expected results in v1931test.map:
+%
+% padr6z AGaramond-Regular <[cc-pl.enc <<gdrg____.pfb " encpcr ReEncodeFont "
+% padro6z AGaramond-Regular <[cc-pl.enc <<gdrg____.pfb " encpcr ReEncodeFont 0.25 SlantFont "
+
+
+
+\bye
+
diff --git a/fonts/utilities/fontload/README b/fonts/utilities/fontload/README
new file mode 100644
index 0000000000..2ab4070a33
--- /dev/null
+++ b/fonts/utilities/fontload/README
@@ -0,0 +1,46 @@
+
+Copyright (C) 1994, Basil K. Malyshev. All rights reserved.
+
+Partial font downloading utility.
+
+SYSTEMS: Unix, VMS, IBM-PC/MS-DOS.
+NEEDED: GhostScript interpreter: GS 2.6.1 (recomended) or GS 3.12
+
+This tool realizes partial downloading of the ATM compatible Type 1 fonts
+required in the specified PostScript file.
+This tool is combination of
+ - the psfstat.ps PostScript script
+ which collects information about font using
+ - and SubFont program which extracts from source fonts subfonts which
+ contains only required characters.
+
+This approach, in comparison with well known DVIPSONE partial font
+downloading facility, has follow advantages:
+ 1. That can be applied in many systems which generates PostScript output.
+ So, psfstat.ps script was tested with:
+ a. DVIPS output;
+ b. Frame Output;
+ c. MS Windows PostScript driver output.
+ 2. That prepare not only text fonts but also fonts used in inserted
+ pictures.
+
+However, this approach requires a lot of CPU time to complete scanning
+of the PostScript file.
+
+==== USING, for example with DVIPS. ====
+
+Tune DVIPS font maps such that ATM compatible Type 1 fonts
+will not be copied into output PostScript file.
+So, you must use for font mapping cmfonts.ref file which contains lines like:
+ cmr10 cmr10
+but not cmfonts.map file which contains lines like:
+ cmr10 cmr10 <cmr10.pfb
+
+In correct case, After command
+ dvips -P??? foo
+you will have PostScript file without fonts, which you can print by command
+ fload foo.ps | lpr
+
+Basil K. Malyshev, 11/24/94 22:59:01, Geneve, Switzerland.
+E-Mail: malyshev@dxcern.cern.ch or malyshev@mx.ihep.su
+
diff --git a/fonts/utilities/fontload/README.news b/fonts/utilities/fontload/README.news
new file mode 100644
index 0000000000..f3fd7c6b25
--- /dev/null
+++ b/fonts/utilities/fontload/README.news
@@ -0,0 +1,25 @@
+
+ Differences with previous version which was issued 28-Nov-94.
+
+ 1. It generates more compact code to download font into printer,
+ that reduces resulted file size and printer downloading time.
+ 2. Printer memory requirements is also slightly reduced.
+ 3. Ported to other platforms, such that it works now on
+ UNIX, MS-DOS, VMS.
+ 4. Improved control of the error situations.
+ 5. Added option '-p' that selects font set which is built in printer.
+ 6. Solved disadvantage with those fonts which have common
+ CharStrings (for example Univers fonts).
+ 7. Made the same font map for GhostScript and SubFont program.
+ 8. Tested with GhostScript 3.12,
+ that is able to apply partial font downloading to document
+ used Multiple Master fonts.
+ HOWEVER, gs 3.12 have a bugs, in thsi reason gs 2.6.1 using
+ is recomended.
+ 9. Man pages for 'fload' and 'subfont' are added.
+
+Basil K. Malyshev, 27-Jan-95, Geneve, Switzerland.
+
+
+
+
diff --git a/fonts/utilities/fontload/lib/35.FS b/fonts/utilities/fontload/lib/35.FS
new file mode 100644
index 0000000000..2b6a9ae723
--- /dev/null
+++ b/fonts/utilities/fontload/lib/35.FS
@@ -0,0 +1,35 @@
+AvantGarde-Book
+AvantGarde-BookOblique
+AvantGarde-Demi
+AvantGarde-DemiOblique
+Bookman-Demi
+Bookman-DemiItalic
+Bookman-Light
+Bookman-LightItalic
+Courier
+Courier-Bold
+Courier-BoldOblique
+Courier-Oblique
+Helvetica
+Helvetica-Bold
+Helvetica-BoldOblique
+Helvetica-Narrow
+Helvetica-Narrow-Bold
+Helvetica-Narrow-BoldOblique
+Helvetica-Narrow-Oblique
+Helvetica-Oblique
+NewCenturySchlbk-Bold
+NewCenturySchlbk-BoldItalic
+NewCenturySchlbk-Italic
+NewCenturySchlbk-Roman
+Palatino-Bold
+Palatino-BoldItalic
+Palatino-Italic
+Palatino-Roman
+Symbol
+Times-Bold
+Times-BoldItalic
+Times-Italic
+Times-Roman
+ZapfChancery-MediumItalic
+ZapfDingbats
diff --git a/fonts/utilities/fontload/lib/Fontmap.t1 b/fonts/utilities/fontload/lib/Fontmap.t1
new file mode 100644
index 0000000000..e96573ca11
--- /dev/null
+++ b/fonts/utilities/fontload/lib/Fontmap.t1
@@ -0,0 +1,348 @@
+%% This part was constructed from /usr/local/lib/texmf/fonts directory
+/cmcb10 (./russian/type1/cmcb10.pfb) ;
+/cmcbx10 (./russian/type1/cmcbx10.pfb) ;
+/cmcbx12 (./russian/type1/cmcbx12.pfb) ;
+/cmcbx5 (./russian/type1/cmcbx5.pfb) ;
+/cmcbx6 (./russian/type1/cmcbx6.pfb) ;
+/cmcbx7 (./russian/type1/cmcbx7.pfb) ;
+/cmcbx8 (./russian/type1/cmcbx8.pfb) ;
+/cmcbx9 (./russian/type1/cmcbx9.pfb) ;
+/cmcbxsl10 (./russian/type1/cmcbxsl1.pfb) ;
+/cmcbxti10 (./russian/type1/cmcbxti1.pfb) ;
+/cmccsc10 (./russian/type1/cmccsc10.pfb) ;
+/cmccsc8 (./russian/type1/cmccsc8.pfb) ;
+/cmccsc9 (./russian/type1/cmccsc9.pfb) ;
+/cmcitt10 (./russian/type1/cmcitt10.pfb) ;
+/cmcsc10 (./russian/type1/cmcsc10.pfb) ;
+/cmcsc8 (./russian/type1/cmcsc8.pfb) ;
+/cmcsc9 (./russian/type1/cmcsc9.pfb) ;
+/cmcsl10 (./russian/type1/cmcsl10.pfb) ;
+/cmcsl12 (./russian/type1/cmcsl12.pfb) ;
+/cmcsl8 (./russian/type1/cmcsl8.pfb) ;
+/cmcsl9 (./russian/type1/cmcsl9.pfb) ;
+/cmcsltt10 (./russian/type1/cmcsltt1.pfb) ;
+/cmcss10 (./russian/type1/cmcss10.pfb) ;
+/cmcss12 (./russian/type1/cmcss12.pfb) ;
+/cmcss17 (./russian/type1/cmcss17.pfb) ;
+/cmcss8 (./russian/type1/cmcss8.pfb) ;
+/cmcss9 (./russian/type1/cmcss9.pfb) ;
+/cmcssbx10 (./russian/type1/cmcssbx1.pfb) ;
+/cmcssdc10 (./russian/type1/cmcssdc1.pfb) ;
+/cmcssi10 (./russian/type1/cmcssi10.pfb) ;
+/cmcssi12 (./russian/type1/cmcssi12.pfb) ;
+/cmcssi17 (./russian/type1/cmcssi17.pfb) ;
+/cmcssi8 (./russian/type1/cmcssi8.pfb) ;
+/cmcssi9 (./russian/type1/cmcssi9.pfb) ;
+/cmcssq8 (./russian/type1/cmcssq8.pfb) ;
+/cmcssqi8 (./russian/type1/cmcssqi8.pfb) ;
+/cmcti10 (./russian/type1/cmcti10.pfb) ;
+/cmcti12 (./russian/type1/cmcti12.pfb) ;
+/cmcti7 (./russian/type1/cmcti7.pfb) ;
+/cmcti8 (./russian/type1/cmcti8.pfb) ;
+/cmcti9 (./russian/type1/cmcti9.pfb) ;
+/cmctt10 (./russian/type1/cmctt10.pfb) ;
+/cmctt12 (./russian/type1/cmctt12.pfb) ;
+/cmctt8 (./russian/type1/cmctt8.pfb) ;
+/cmctt9 (./russian/type1/cmctt9.pfb) ;
+/cmcu10 (./russian/type1/cmcu10.pfb) ;
+/cmcyr10 (./russian/type1/cmcyr10.pfb) ;
+/cmcyr12 (./russian/type1/cmcyr12.pfb) ;
+/cmcyr17 (./russian/type1/cmcyr17.pfb) ;
+/cmcyr5 (./russian/type1/cmcyr5.pfb) ;
+/cmcyr6 (./russian/type1/cmcyr6.pfb) ;
+/cmcyr7 (./russian/type1/cmcyr7.pfb) ;
+/cmcyr8 (./russian/type1/cmcyr8.pfb) ;
+/cmcyr9 (./russian/type1/cmcyr9.pfb) ;
+/cmb10 (./cm/type1/cmb10.pfb) ;
+/cmbsy10 (./cm/type1/cmbsy10.pfb) ;
+/cmbx10 (./cm/type1/cmbx10.pfb) ;
+/cmbx12 (./cm/type1/cmbx12.pfb) ;
+/cmbx5 (./cm/type1/cmbx5.pfb) ;
+/cmbx6 (./cm/type1/cmbx6.pfb) ;
+/cmbx7 (./cm/type1/cmbx7.pfb) ;
+/cmbx8 (./cm/type1/cmbx8.pfb) ;
+/cmbx9 (./cm/type1/cmbx9.pfb) ;
+/cmbxsl10 (./cm/type1/cmbxsl10.pfb) ;
+/cmbxti10 (./cm/type1/cmbxti10.pfb) ;
+/cmcb10 (./cm/type1/cmcb10.pfb) ;
+/cmcbx10 (./cm/type1/cmcbx10.pfb) ;
+/cmcbx12 (./cm/type1/cmcbx12.pfb) ;
+/cmcbx5 (./cm/type1/cmcbx5.pfb) ;
+/cmcbx6 (./cm/type1/cmcbx6.pfb) ;
+/cmcbx7 (./cm/type1/cmcbx7.pfb) ;
+/cmcbx8 (./cm/type1/cmcbx8.pfb) ;
+/cmcbx9 (./cm/type1/cmcbx9.pfb) ;
+/cmcbxsl10 (./cm/type1/cmcbxsl1.pfb) ;
+/cmcbxti10 (./cm/type1/cmcbxti1.pfb) ;
+/cmccsc10 (./cm/type1/cmccsc10.pfb) ;
+/cmccsc8 (./cm/type1/cmccsc8.pfb) ;
+/cmccsc9 (./cm/type1/cmccsc9.pfb) ;
+/cmcitt10 (./cm/type1/cmcitt10.pfb) ;
+/cmcsc10 (./cm/type1/cmcsc10.pfb) ;
+/cmcsc8 (./cm/type1/cmcsc8.pfb) ;
+/cmcsc9 (./cm/type1/cmcsc9.pfb) ;
+/cmcsl10 (./cm/type1/cmcsl10.pfb) ;
+/cmcsl12 (./cm/type1/cmcsl12.pfb) ;
+/cmcsl8 (./cm/type1/cmcsl8.pfb) ;
+/cmcsl9 (./cm/type1/cmcsl9.pfb) ;
+/cmcsltt10 (./cm/type1/cmcsltt1.pfb) ;
+/cmcss10 (./cm/type1/cmcss10.pfb) ;
+/cmcss12 (./cm/type1/cmcss12.pfb) ;
+/cmcss17 (./cm/type1/cmcss17.pfb) ;
+/cmcss8 (./cm/type1/cmcss8.pfb) ;
+/cmcss9 (./cm/type1/cmcss9.pfb) ;
+/cmcssbx10 (./cm/type1/cmcssbx1.pfb) ;
+/cmcssdc10 (./cm/type1/cmcssdc1.pfb) ;
+/cmcssi10 (./cm/type1/cmcssi10.pfb) ;
+/cmcssi12 (./cm/type1/cmcssi12.pfb) ;
+/cmcssi17 (./cm/type1/cmcssi17.pfb) ;
+/cmcssi8 (./cm/type1/cmcssi8.pfb) ;
+/cmcssi9 (./cm/type1/cmcssi9.pfb) ;
+/cmcssq8 (./cm/type1/cmcssq8.pfb) ;
+/cmcssqi8 (./cm/type1/cmcssqi8.pfb) ;
+/cmcti10 (./cm/type1/cmcti10.pfb) ;
+/cmcti12 (./cm/type1/cmcti12.pfb) ;
+/cmcti7 (./cm/type1/cmcti7.pfb) ;
+/cmcti8 (./cm/type1/cmcti8.pfb) ;
+/cmcti9 (./cm/type1/cmcti9.pfb) ;
+/cmctt10 (./cm/type1/cmctt10.pfb) ;
+/cmctt12 (./cm/type1/cmctt12.pfb) ;
+/cmctt8 (./cm/type1/cmctt8.pfb) ;
+/cmctt9 (./cm/type1/cmctt9.pfb) ;
+/cmcu10 (./cm/type1/cmcu10.pfb) ;
+/cmdunh10 (./cm/type1/cmdunh10.pfb) ;
+/cmex10 (./cm/type1/cmex10.pfb) ;
+/cmff10 (./cm/type1/cmff10.pfb) ;
+/cmfi10 (./cm/type1/cmfi10.pfb) ;
+/cmfib8 (./cm/type1/cmfib8.pfb) ;
+/cminch (./cm/type1/cminch.pfb) ;
+/cmitt10 (./cm/type1/cmitt10.pfb) ;
+/cmmi10 (./cm/type1/cmmi10.pfb) ;
+/cmmi12 (./cm/type1/cmmi12.pfb) ;
+/cmmi5 (./cm/type1/cmmi5.pfb) ;
+/cmmi6 (./cm/type1/cmmi6.pfb) ;
+/cmmi7 (./cm/type1/cmmi7.pfb) ;
+/cmmi8 (./cm/type1/cmmi8.pfb) ;
+/cmmi9 (./cm/type1/cmmi9.pfb) ;
+/cmmib10 (./cm/type1/cmmib10.pfb) ;
+/cmr10 (./cm/type1/cmr10.pfb) ;
+/cmr12 (./cm/type1/cmr12.pfb) ;
+/cmr17 (./cm/type1/cmr17.pfb) ;
+/cmr5 (./cm/type1/cmr5.pfb) ;
+/cmr6 (./cm/type1/cmr6.pfb) ;
+/cmr7 (./cm/type1/cmr7.pfb) ;
+/cmr8 (./cm/type1/cmr8.pfb) ;
+/cmr9 (./cm/type1/cmr9.pfb) ;
+/cmsl10 (./cm/type1/cmsl10.pfb) ;
+/cmsl12 (./cm/type1/cmsl12.pfb) ;
+/cmsl8 (./cm/type1/cmsl8.pfb) ;
+/cmsl9 (./cm/type1/cmsl9.pfb) ;
+/cmsltt10 (./cm/type1/cmsltt10.pfb) ;
+/cmss10 (./cm/type1/cmss10.pfb) ;
+/cmss12 (./cm/type1/cmss12.pfb) ;
+/cmss17 (./cm/type1/cmss17.pfb) ;
+/cmss8 (./cm/type1/cmss8.pfb) ;
+/cmss9 (./cm/type1/cmss9.pfb) ;
+/cmssbx10 (./cm/type1/cmssbx10.pfb) ;
+/cmssdc10 (./cm/type1/cmssdc10.pfb) ;
+/cmssi10 (./cm/type1/cmssi10.pfb) ;
+/cmssi12 (./cm/type1/cmssi12.pfb) ;
+/cmssi17 (./cm/type1/cmssi17.pfb) ;
+/cmssi8 (./cm/type1/cmssi8.pfb) ;
+/cmssi9 (./cm/type1/cmssi9.pfb) ;
+/cmssq8 (./cm/type1/cmssq8.pfb) ;
+/cmssqi8 (./cm/type1/cmssqi8.pfb) ;
+/cmsy10 (./cm/type1/cmsy10.pfb) ;
+/cmsy5 (./cm/type1/cmsy5.pfb) ;
+/cmsy6 (./cm/type1/cmsy6.pfb) ;
+/cmsy7 (./cm/type1/cmsy7.pfb) ;
+/cmsy8 (./cm/type1/cmsy8.pfb) ;
+/cmsy9 (./cm/type1/cmsy9.pfb) ;
+/cmtcsc10 (./cm/type1/cmtcsc10.pfb) ;
+/cmtex10 (./cm/type1/cmtex10.pfb) ;
+/cmtex8 (./cm/type1/cmtex8.pfb) ;
+/cmtex9 (./cm/type1/cmtex9.pfb) ;
+/cmti10 (./cm/type1/cmti10.pfb) ;
+/cmti12 (./cm/type1/cmti12.pfb) ;
+/cmti7 (./cm/type1/cmti7.pfb) ;
+/cmti8 (./cm/type1/cmti8.pfb) ;
+/cmti9 (./cm/type1/cmti9.pfb) ;
+/cmtt10 (./cm/type1/cmtt10.pfb) ;
+/cmtt12 (./cm/type1/cmtt12.pfb) ;
+/cmtt8 (./cm/type1/cmtt8.pfb) ;
+/cmtt9 (./cm/type1/cmtt9.pfb) ;
+/cmu10 (./cm/type1/cmu10.pfb) ;
+/cmvtt10 (./cm/type1/cmvtt10.pfb) ;
+/lasy10 (./cm/type1/lasy10.pfb) ;
+/lasy5 (./cm/type1/lasy5.pfb) ;
+/lasy6 (./cm/type1/lasy6.pfb) ;
+/lasy7 (./cm/type1/lasy7.pfb) ;
+/lasy8 (./cm/type1/lasy8.pfb) ;
+/lasy9 (./cm/type1/lasy9.pfb) ;
+/lasyb10 (./cm/type1/lasyb10.pfb) ;
+/lcircle10 (./cm/type1/lcircle1.pfb) ;
+/lcirclew10 (./cm/type1/lcirclew.pfb) ;
+/line10 (./cm/type1/line10.pfb) ;
+/linew10 (./cm/type1/linew10.pfb) ;
+/logo10 (./cm/type1/logo10.pfb) ;
+/logo8 (./cm/type1/logo8.pfb) ;
+/logo9 (./cm/type1/logo9.pfb) ;
+/logobf10 (./cm/type1/logobf10.pfb) ;
+/logosl10 (./cm/type1/logosl10.pfb) ;
+/cmbsy6 (./cm/type1/cmbsy6.pfb) ;
+/cmbsy7 (./cm/type1/cmbsy7.pfb) ;
+/cmbsy8 (./cm/type1/cmbsy8.pfb) ;
+/cmbsy9 (./cm/type1/cmbsy9.pfb) ;
+/cmex7 (./cm/type1/cmex7.pfb) ;
+/cmex8 (./cm/type1/cmex8.pfb) ;
+/cmex9 (./cm/type1/cmex9.pfb) ;
+/cmmib6 (./cm/type1/cmmib6.pfb) ;
+/cmmib7 (./cm/type1/cmmib7.pfb) ;
+/cmmib8 (./cm/type1/cmmib8.pfb) ;
+/cmmib9 (./cm/type1/cmmib9.pfb) ;
+/euex10 (./ams/type1/euex10.pfb) ;
+/eufb10 (./ams/type1/eufb10.pfb) ;
+/eufb5 (./ams/type1/eufb5.pfb) ;
+/eufb7 (./ams/type1/eufb7.pfb) ;
+/eufm10 (./ams/type1/eufm10.pfb) ;
+/eufm5 (./ams/type1/eufm5.pfb) ;
+/eufm7 (./ams/type1/eufm7.pfb) ;
+/eurb10 (./ams/type1/eurb10.pfb) ;
+/eurb5 (./ams/type1/eurb5.pfb) ;
+/eurb7 (./ams/type1/eurb7.pfb) ;
+/eurm10 (./ams/type1/eurm10.pfb) ;
+/eurm5 (./ams/type1/eurm5.pfb) ;
+/eurm7 (./ams/type1/eurm7.pfb) ;
+/eusb10 (./ams/type1/eusb10.pfb) ;
+/eusb5 (./ams/type1/eusb5.pfb) ;
+/eusb7 (./ams/type1/eusb7.pfb) ;
+/eusm10 (./ams/type1/eusm10.pfb) ;
+/eusm5 (./ams/type1/eusm5.pfb) ;
+/eusm7 (./ams/type1/eusm7.pfb) ;
+/cmcyr10 (./ams/type1/cmcyr10.pfb) ;
+/cmcyr12 (./ams/type1/cmcyr12.pfb) ;
+/cmcyr17 (./ams/type1/cmcyr17.pfb) ;
+/cmcyr5 (./ams/type1/cmcyr5.pfb) ;
+/cmcyr6 (./ams/type1/cmcyr6.pfb) ;
+/cmcyr7 (./ams/type1/cmcyr7.pfb) ;
+/cmcyr8 (./ams/type1/cmcyr8.pfb) ;
+/cmcyr9 (./ams/type1/cmcyr9.pfb) ;
+/msam10 (./ams/type1/msam10.pfb) ;
+/msbm10 (./ams/type1/msbm10.pfb) ;
+/dcb10 (./dc/type1/dcb10.pfb) ;
+/dcb12 (./dc/type1/dcb12.pfb) ;
+/dcb17 (./dc/type1/dcb17.pfb) ;
+/dcb5 (./dc/type1/dcb5.pfb) ;
+/dcb6 (./dc/type1/dcb6.pfb) ;
+/dcb7 (./dc/type1/dcb7.pfb) ;
+/dcb8 (./dc/type1/dcb8.pfb) ;
+/dcb9 (./dc/type1/dcb9.pfb) ;
+/dcbx10 (./dc/type1/dcbx10.pfb) ;
+/dcbx12 (./dc/type1/dcbx12.pfb) ;
+/dcbx5 (./dc/type1/dcbx5.pfb) ;
+/dcbx6 (./dc/type1/dcbx6.pfb) ;
+/dcbx7 (./dc/type1/dcbx7.pfb) ;
+/dcbx8 (./dc/type1/dcbx8.pfb) ;
+/dcbx9 (./dc/type1/dcbx9.pfb) ;
+/dcbxsl10 (./dc/type1/dcbxsl10.pfb) ;
+/dcbxsl12 (./dc/type1/dcbxsl12.pfb) ;
+/dcbxsl5 (./dc/type1/dcbxsl5.pfb) ;
+/dcbxsl6 (./dc/type1/dcbxsl6.pfb) ;
+/dcbxsl7 (./dc/type1/dcbxsl7.pfb) ;
+/dcbxsl8 (./dc/type1/dcbxsl8.pfb) ;
+/dcbxsl9 (./dc/type1/dcbxsl9.pfb) ;
+/dcbxti10 (./dc/type1/dcbxti10.pfb) ;
+/dcbxti12 (./dc/type1/dcbxti12.pfb) ;
+/dcbxti17 (./dc/type1/dcbxti17.pfb) ;
+/dccsc10 (./dc/type1/dccsc10.pfb) ;
+/dccsc12 (./dc/type1/dccsc12.pfb) ;
+/dccsc17 (./dc/type1/dccsc17.pfb) ;
+/dcdunh10 (./dc/type1/dcdunh10.pfb) ;
+/dcdunh12 (./dc/type1/dcdunh12.pfb) ;
+/dcdunh17 (./dc/type1/dcdunh17.pfb) ;
+/dcdunh5 (./dc/type1/dcdunh5.pfb) ;
+/dcdunh6 (./dc/type1/dcdunh6.pfb) ;
+/dcdunh7 (./dc/type1/dcdunh7.pfb) ;
+/dcdunh8 (./dc/type1/dcdunh8.pfb) ;
+/dcdunh9 (./dc/type1/dcdunh9.pfb) ;
+/dcff10 (./dc/type1/dcff10.pfb) ;
+/dcfi10 (./dc/type1/dcfi10.pfb) ;
+/dcfib10 (./dc/type1/dcfib10.pfb) ;
+/dcfib8 (./dc/type1/dcfib8.pfb) ;
+/dcfib9 (./dc/type1/dcfib9.pfb) ;
+/dcitt10 (./dc/type1/dcitt10.pfb) ;
+/dcitt12 (./dc/type1/dcitt12.pfb) ;
+/dcitt17 (./dc/type1/dcitt17.pfb) ;
+/dcitt8 (./dc/type1/dcitt8.pfb) ;
+/dcitt9 (./dc/type1/dcitt9.pfb) ;
+/dcr10 (./dc/type1/dcr10.pfb) ;
+/dcr12 (./dc/type1/dcr12.pfb) ;
+/dcr17 (./dc/type1/dcr17.pfb) ;
+/dcr5 (./dc/type1/dcr5.pfb) ;
+/dcr6 (./dc/type1/dcr6.pfb) ;
+/dcr7 (./dc/type1/dcr7.pfb) ;
+/dcr8 (./dc/type1/dcr8.pfb) ;
+/dcr9 (./dc/type1/dcr9.pfb) ;
+/dcsl10 (./dc/type1/dcsl10.pfb) ;
+/dcsl12 (./dc/type1/dcsl12.pfb) ;
+/dcsl17 (./dc/type1/dcsl17.pfb) ;
+/dcsl5 (./dc/type1/dcsl5.pfb) ;
+/dcsl6 (./dc/type1/dcsl6.pfb) ;
+/dcsl7 (./dc/type1/dcsl7.pfb) ;
+/dcsl8 (./dc/type1/dcsl8.pfb) ;
+/dcsl9 (./dc/type1/dcsl9.pfb) ;
+/dcsltt10 (./dc/type1/dcsltt10.pfb) ;
+/dcsltt12 (./dc/type1/dcsltt12.pfb) ;
+/dcsltt8 (./dc/type1/dcsltt8.pfb) ;
+/dcsltt9 (./dc/type1/dcsltt9.pfb) ;
+/dcss10 (./dc/type1/dcss10.pfb) ;
+/dcss12 (./dc/type1/dcss12.pfb) ;
+/dcss17 (./dc/type1/dcss17.pfb) ;
+/dcss7 (./dc/type1/dcss7.pfb) ;
+/dcss8 (./dc/type1/dcss8.pfb) ;
+/dcss9 (./dc/type1/dcss9.pfb) ;
+/dcssbx10 (./dc/type1/dcssbx10.pfb) ;
+/dcssbx12 (./dc/type1/dcssbx12.pfb) ;
+/dcssbx17 (./dc/type1/dcssbx17.pfb) ;
+/dcssbx8 (./dc/type1/dcssbx8.pfb) ;
+/dcssbx9 (./dc/type1/dcssbx9.pfb) ;
+/dcssbxi10 (./dc/type1/dcssbxi10.pfb) ;
+/dcssi10 (./dc/type1/dcssi10.pfb) ;
+/dcssi12 (./dc/type1/dcssi12.pfb) ;
+/dcssi17 (./dc/type1/dcssi17.pfb) ;
+/dcssi7 (./dc/type1/dcssi7.pfb) ;
+/dcssi8 (./dc/type1/dcssi8.pfb) ;
+/dcssi9 (./dc/type1/dcssi9.pfb) ;
+/dctcsc10 (./dc/type1/dctcsc10.pfb) ;
+/dctcsc12 (./dc/type1/dctcsc12.pfb) ;
+/dctcsc17 (./dc/type1/dctcsc17.pfb) ;
+/dcti10 (./dc/type1/dcti10.pfb) ;
+/dcti12 (./dc/type1/dcti12.pfb) ;
+/dcti17 (./dc/type1/dcti17.pfb) ;
+/dcti5 (./dc/type1/dcti5.pfb) ;
+/dcti6 (./dc/type1/dcti6.pfb) ;
+/dcti7 (./dc/type1/dcti7.pfb) ;
+/dcti8 (./dc/type1/dcti8.pfb) ;
+/dcti9 (./dc/type1/dcti9.pfb) ;
+/dctt10 (./dc/type1/dctt10.pfb) ;
+/dctt12 (./dc/type1/dctt12.pfb) ;
+/dctt8 (./dc/type1/dctt8.pfb) ;
+/dctt9 (./dc/type1/dctt9.pfb) ;
+/dcu10 (./dc/type1/dcu10.pfb) ;
+/dcu12 (./dc/type1/dcu12.pfb) ;
+/dcu17 (./dc/type1/dcu17.pfb) ;
+/dcu7 (./dc/type1/dcu7.pfb) ;
+/dcu8 (./dc/type1/dcu8.pfb) ;
+/dcu9 (./dc/type1/dcu9.pfb) ;
+/dcvtt10 (./dc/type1/dcvtt10.pfb) ;
+/dcvtt12 (./dc/type1/dcvtt12.pfb) ;
+/dcvtt8 (./dc/type1/dcvtt8.pfb) ;
+/dcvtt9 (./dc/type1/dcvtt9.pfb) ;
+/CharterBT-Bold (./charter/type1/bchb0.pfb) ;
+/CharterBT-BoldItalic (./charter/type1/bchbi0.pfb) ;
+/CharterBT-Roman (./charter/type1/bchr0.pfb) ;
+/CharterBT-Italic (./charter/type1/bchri0.pfb) ;
+/Utopia-Bold (./utopia/type1/putb0.pfb) ;
+/Utopia-BoldItalic (./utopia/type1/putbi0.pfb) ;
+/Utopia-Regular (./utopia/type1/putr0.pfb) ;
+/Utopia-Italic (./utopia/type1/putri0.pfb) ;
diff --git a/fonts/utilities/fontload/lib/Standard.FS b/fonts/utilities/fontload/lib/Standard.FS
new file mode 100644
index 0000000000..455ea2ecaf
--- /dev/null
+++ b/fonts/utilities/fontload/lib/Standard.FS
@@ -0,0 +1,13 @@
+Times-Roman
+Times-Bold
+Times-Italic
+Times-BoldItalic
+Courier
+Courier-Bold
+Courier-BoldOblique
+Courier-Oblique
+Helvetica
+Helvetica-Bold
+Helvetica-BoldOblique
+Helvetica-Oblique
+Symbol
diff --git a/fonts/utilities/fontload/lib/cvtmap.ps b/fonts/utilities/fontload/lib/cvtmap.ps
new file mode 100644
index 0000000000..5c2fa715ea
--- /dev/null
+++ b/fonts/utilities/fontload/lib/cvtmap.ps
@@ -0,0 +1,13 @@
+/; { def } bind def
+256 dict begin
+INFILE run
+currentdict end
+/outfp OUTFILE (w) file def
+{
+ exch (..............................................................) cvs
+ outfp exch writestring
+ outfp ( ) writestring
+ outfp exch writestring
+ outfp (\n) writestring
+} forall
+
diff --git a/fonts/utilities/fontload/lib/psfstat.ps b/fonts/utilities/fontload/lib/psfstat.ps
new file mode 100644
index 0000000000..e9e35cd379
--- /dev/null
+++ b/fonts/utilities/fontload/lib/psfstat.ps
@@ -0,0 +1,386 @@
+%!PS-GhostScript-2.6.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%!PS-GhostScript-3.12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% File: psfstat.ps %
+% %
+% This PostScript program calculate fonts and characters used %
+% in PostScript file loaded after this. %
+% This program usefull for make partial font DownLoading... %
+% %
+% Usage: %
+% gs -DNODISPLAY -DWRITESYSTEMDICT %
+% -I... (must be synchronized with SubFont path) %
+% -sRESIDENTFONTS=file_name_with_list_of_printer_fonts %
+% -sINFILE=file_name_of_the_user_PostScript_file %
+% -sOUTFILE=file_name_for_output_font/char_using_statistics %
+% psfstat.ps quit.ps %
+% %
+% Result: %
+% If all right, It generates OUTFILE which contains names of fonts%
+% and required glyph names. %
+% Zero length file mean that all fonts already in file. %
+% OUTFILE absense means that some error was accured %
+% in processing time. Typically, PS files refers to such fonts %
+% which have no in file and not accesible by GS. %
+% %
+% Date: 5-Dec-1994 %
+% %
+% Copyright (C) 1994 Basil K. Malyshev. All rights reserved. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/usrdef { userdict begin def end } bind def
+/sysdef { systemdict begin odef end } bind def
+/savdef { load systemdict begin def end } bind def
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% USAGE %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+/usage
+{
+ (Usage:\n) print
+ ( gs -q -DWRITESYSTEMDICT -DNODISPLAY psfstat.ps <user-ps-file>\n) print
+ stop
+} bind def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check SYSTEMDICT write permission and disable all access checks. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+systemdict dup wcheck not { usage } if
+begin /readonly { } odef /executeonly { } odef /noaccess { } odef end
+ /readonly { } odef /executeonly { } odef /noaccess { } odef
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Statistic collection routines .... %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/PSF-Stat 100 dict def % Dictionary with statistics ...
+/PSF-CurFont null def % No Any current font there
+
+/Create-Font-Stat-Pool
+{
+ 256 dict % Dictionary with charstrings ...
+} bind def
+
+/Use-Font % Select current font ...
+{
+% (Call Use-Font\n) print pstack
+ dup /FontType get 1 eq
+ {
+ % { dup /OrigFont known { /OrigFont get } { exit } ifelse } loop
+ % /FontName get % Name of original font there ...
+ /FontInfo get /FullName get cvn
+ dup PSF-Stat exch known
+ { PSF-Stat exch get }
+ { Create-Font-Stat-Pool PSF-Stat 2 index 2 index put exch pop }
+ ifelse
+ }
+ { % Don't try collect statistics for NOT Type1 fonts.
+ pop null % discard dictionary, and fill NONE font identifier ...
+ } ifelse
+ /PSF-CurFont exch usrdef
+% (End of Call Use-Font\n) print pstack
+} bind sysdef
+
+/Use-Character
+{
+ PSF-CurFont dup null eq
+ {
+ pop
+ (Calling font using routines (i.e. `show') before font selection\n) print
+ (Refer to character ) print (....) cvs print (\n) print
+ }
+ {
+ begin currentfont /Encoding get exch get 1 def end
+ } ifelse
+} bind sysdef
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Save original system command and redefine it by self hacks %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/Native-show /show savdef
+/Native-charpath /charpath savdef
+/Native-widthshow /widthshow savdef
+/Native-awidthshow /awidthshow savdef
+/Native-ashow /ashow savdef
+/Native-setfont /setfont savdef
+/Native-showpage /showpage savdef
+/Native-findfont /findfont savdef
+
+% This important routine dump marking of the font preloading
+% and font full names ...
+
+/Can-not-find-font
+{
+ (Can not find font ) print
+ (...........................................) cvs print
+ (\n Process will be terminated in this reason...\n) print
+ psfsFile closefile
+ OUTFILE deletefile % File absence denotes some error...
+ quit
+} bind def
+
+%%% Load map of our ATM compatible Type1 fonts.
+%%% Load our map into separate dictionary (PSF-Fontmap)
+/PSF-Fontmap 512 dict def
+PSF-Fontmap begin
+ /; { def } bind def
+ (Fontmap.t1) findlibfile
+ {
+ closefile
+ run
+% exch pop .loadFontmap % It is run in GS2.61 and GS3.12
+ }
+ { pop
+ (I can not found Type 1 fonts specific map Fontmap.t1\n) print
+ (It is probabbly error, but I will continue...\n) print
+ }
+ ifelse
+ currentdict /; undef
+end
+
+%%% Load list of resident fonts now ....
+/ResidentFonts 100 dict def
+systemdict /RESIDENTFONTS known
+{ % load list of resident fonts
+ RESIDENTFONTS findlibfile
+ { % Load all described fonts...
+ { % Read line by line in loop
+ dup (....................................) readline not { pop exit } if
+ cvn ResidentFonts begin true def end
+ } loop
+ closefile
+ } if
+ pop
+} if
+
+% In this dictionary is stored already prepared fonts to
+% avoid recursion effects which is appeared in GS 3.12
+/findfontCalledOn 100 dict def
+
+/findfont
+{ findfontCalledOn 1 index known { Native-findfont } {
+ findfontCalledOn begin dup true def end
+ (/) psfsWrite dup (........................................) cvs psfsWrite
+ dup FontDirectory exch known
+ { % Font exists in DontDirectory, this means that it is already preloaded ...
+ ( true ) psfsWrite
+ Native-findfont
+ }
+ { % Font yet not loaded, There I will try to load it ...
+ ( false ) psfsWrite
+ dup ResidentFonts exch known
+ { Native-findfont }
+ {
+ dup PSF-Fontmap exch known
+ { dup PSF-Fontmap exch get findlibfile
+ {.loadfont pop} {Can-not-find-font} ifelse
+ }
+ {
+ dup Fontmap exch known
+ { dup Fontmap exch get findlibfile
+ {.loadfont pop} {Can-not-find-font} ifelse
+ }
+ { Can-not-find-font }
+ ifelse
+ }
+ ifelse
+ Native-findfont
+ }
+ ifelse
+ }
+ ifelse
+ dup /FontInfo get /FullName get
+ (\() psfsWrite psfsWrite (\) psfsAlias\n) psfsWrite
+} ifelse } bind sysdef % bind systemdict begin def end % sysdef
+
+/show
+{
+ PSF-CurFont null ne { dup { Use-Character } forall } if
+ Native-show
+} bind sysdef
+
+/charpath
+{
+ PSF-CurFont null ne { 1 index { Use-Character } forall } if
+ Native-charpath
+} bind sysdef
+
+/ashow % ax ay string ashow -
+{
+ PSF-CurFont null ne { dup { Use-Character } forall } if
+ Native-ashow
+} bind sysdef
+
+/awidthshow % cx cy char ax ay string awidthshow -
+{
+ PSF-CurFont null ne { dup { Use-Character } forall } if
+ Native-awidthshow
+} bind sysdef
+
+/widthshow % cx cy char string widthshow -
+{
+ PSF-CurFont null ne { dup { Use-Character } forall } if
+ Native-widthshow
+} bind sysdef
+
+/setfont
+{
+% (call setfont\n) print pstack
+ dup Use-Font
+ Native-setfont
+} bind sysdef
+
+/showpage
+{
+ Print-Stat
+ Native-showpage
+} bind sysdef
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Routines for output statistics ... %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/Print-Stat
+{
+ PSF-Stat
+ {
+ % Prepare font name ...
+ (\() psfsWrite
+ exch (.........1.........2.........3.........4) cvs psfsWrite
+ (\) cvn [ ) psfsWrite
+ % Prepare statistics ...
+ { pop (/) psfsWrite (.............................) cvs psfsWrite } forall
+ (] psfsChars\n) psfsWrite
+ } forall
+} bind sysdef
+
+/Native-restore /restore load def
+/restore
+{
+ Print-Stat
+ Native-restore
+} bind sysdef
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% To avoid destruction our hacks Close up systemdict %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+systemdict readonly pop
+
+/psfsFile OUTFILE (w) file def
+/psfsWrite { dup print psfsFile exch writestring } bind sysdef
+
+%%% Now executes user file
+
+{ INFILE run } stopped
+{ % There is error, finish process with removing output file ...
+ psfsFile closefile
+ OUTFILE deletefile
+% handleerror % command run already calls this ...
+ quit
+} if
+
+% Load raw statistic file, that will remove duplicate refernces.
+
+/PSF-Loaded 100 dict def % List of loaded fonts ...
+/PSF-Alias 100 dict def
+/psfsChars
+{
+ PSF-Stat 2 index known not
+ { PSF-Stat 2 index 256 dict put } if
+ exch PSF-Stat exch get begin { 1 def } forall end
+} bind def
+/psfsAlias
+{
+ % Check, if alias yet not exists put it into dictionary ...
+ cvn dup PSF-Alias exch known not
+ {
+ PSF-Alias exch 3 index put
+ { % Mark this font as already loaded ...
+ dup PSF-Loaded exch true put
+ } if
+ pop
+ }
+ { pop pop pop }
+ ifelse
+} bind def
+
+ psfsFile closefile
+ (ReLoad file ... \n) print
+ OUTFILE run
+
+%
+% There are fonts which share CharaterStrings.
+% For example Univers & Univer-Oblique fonts.
+% In this reason Univers-Oblique font contains Univers font.
+% In this reason we have list of such fonts check that used both
+% and in this case redirect request from first font to second.
+% So, if PS files uses both Univers and Univers-Oblique fonts
+% all references to Univers font will be replaced by references
+% to Univers-Oblique.
+%
+% NOTE. There is list of fonts of the Univers family !
+% One, before installing this tool, must detect such fonts
+% and expand this list...
+% The most simplest method to detect such fonts is to call:
+% t1disasm font-file | grep FontName
+% So in case of normal font (Univers) you will see:
+% /FontName /Univers def
+% dup/FontName get exch definefont pop
+% but the same command for font Univers-Oblique will outputs:
+% /FontName /Univers-Oblique def
+% /FontName /Univers def
+% dup/FontName get exch definefont pop
+% dup/FontName get exch definefont pop
+% So, one can see that Univers-Oblique font contains Univers font.
+%
+/BiFontList 20 dict begin
+/Univers /Univers-Oblique def
+/Univers-Black /Univers-BlackOblique def
+/Univers-Bold /Univers-BoldOblique def
+/Univers-CondensedBold /Univers-CondensedBoldOblique def
+/Univers-CondensedLight /Univers-CondensedLightOblique def
+/Univers-Condensed /Univers-CondensedOblique def
+/Univers-Light /Univers-LightOblique def
+currentdict end def
+
+BiFontList
+{
+ PSF-Stat 1 index known 2 index PSF-Stat exch known and
+ { % Redirect first font references into second font
+ PSF-Stat exch get begin
+ dup PSF-Stat exch get { def } forall
+ end
+ PSF-Stat exch undef
+ }
+ { pop pop }
+ ifelse
+} forall
+
+% Write back prepared statistic ...
+
+ /psfsFile OUTFILE (w) file def
+ PSF-Loaded { ==only == } forall
+ PSF-Stat
+ {
+ % Prepare font name ...
+ exch PSF-Alias exch get
+ dup PSF-Loaded exch known not
+ 1 index ResidentFonts exch known not and
+ {
+ (.........1.........2.........3.........4) cvs psfsWrite
+ % Write list of used characters
+ { pop (/) psfsWrite (..........................) cvs psfsWrite } forall
+ (/\n) psfsWrite
+ }
+ { pop pop }
+ ifelse
+ } forall
+ psfsFile closefile
+ quit
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% End of file `psfstat.ps' %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
diff --git a/fonts/utilities/fontload/man/fload.1 b/fonts/utilities/fontload/man/fload.1
new file mode 100644
index 0000000000..22026fc6d1
--- /dev/null
+++ b/fonts/utilities/fontload/man/fload.1
@@ -0,0 +1,70 @@
+.TH fload 1.2 "11/28/94"
+.\" @(#) fload.1 1.2 21:06:00 11/28/94
+.SH NAME
+fload \- Type 1 font downloading utility.
+.SH SYNOPSIS
+.B fload [-p font-set] <source-PS-file> [<output-PS-file>]
+
+.SH DESCRIPTION
+.B Fload
+is C-shell script that
+parses (via GhostScript with
+.I psfstat.ps
+script) legal PostScript file, determines characters and fonts which
+are required but not preloaded into file and then loads required fonts
+.I partially
+(by using
+.I SubFont
+program). Source will be also copied into output streem.
+If name of output file is missed, script will write into standard output.
+So, anyone can print file by command:
+ fload foo.ps | lpr
+.SH OPTIONS
+.TP 12
+.B -p font-set
+This option selects font-set which is in your printer.
+In standard configuration, only two font sets are distributed:
+ Standard (default)
+ 35
+ However, adding of the new font sets is trivial procedure.
+In this reason
+.B fload
+called without parameters will shows list of available font sets.
+.SH REMARK
+To make partial font downloading procedure successfully
+fonts intended to be downloaded partially must not be included
+into <source-PS-file>.
+.SH ERRORS
+Several errors can accure in this process:
+ 1. Source file is absent.
+ 2. Can't write destination file(s)
+ 3. Invalid PostScript file or required font is not accessible.
+In this case one can examine
+.I *.flog
+file which contains protocol of the source parsing by GhostScript.
+.SH LIMITATIONS
+This software was tested with PS output of
+ the DVIPS program
+ the FrameBuilder (Unix)
+ MS Windows PostScript driver.
+
+There is no guarantee that any PostScript file will be processed successfully
+because of high flexibility of the PostScript language.
+
+This software was tested with several fonts and accounts such kinds of
+ATM compatible Type 1 fonts as hybrid fonts, Multiple master fonts
+and fonts with shareable set of the CharStrings.
+However, every new font must be tested that it will be correctly downloaded
+partially. Note, that Multiple master fonts can be downloaded correctly only
+with GhostScript version 3.12 and higher.
+However, this version have a lot of bugs
+that result in crashing of GS interpreter.
+.SH "SEE ALSO"
+.LP
+.BR SubFont (1),
+.LP
+.I "Adobe Type 1 Font Format"
+.SH BUGS
+None known.
+.SH AUTHOR
+Basil K. Malyshev (malyshev@mx.ihep.su)
diff --git a/fonts/utilities/fontload/man/subfont.1 b/fonts/utilities/fontload/man/subfont.1
new file mode 100644
index 0000000000..db7db9ad53
--- /dev/null
+++ b/fonts/utilities/fontload/man/subfont.1
@@ -0,0 +1,175 @@
+.TH SubFont 1.2 "11/28/94"
+.\" @(#) SubFont.1 1.2 21:06:00 11/28/94
+.SH NAME
+SubFont \- Makes type 1 font from a characters of other font
+.SH SYNOPSIS
+.B subfont
+<
+.B Command list
+>
+.SH DESCRIPTION
+.B SubFont
+parses Adobe type-1 font programs
+(in PFA (hexadecimal) or PFB (binary) formats),
+extracts specified characters and write out font which contains only
+specified characters. When this program works with single font it
+writes out font in PFA or PFB ATM compatible font formats.
+When the program works in multifont mode
+(which is automatically switched on by option
+.I -f
+) that writes fonts in such format that can be loaded only
+by complete PS interpreter.
+In multifont mode, fonts with the same encoding share one
+encoding vector,
+.I eexec
+PS operator is not used in output stream and other
+optimizations were done.
+
+.SH Commands
+
+.TP 12
+.B -v
+This option tell program to output more information about font parsing stadies.
+.TP
+.B -o<file>
+By default, program outputs into stdout.
+One can redirect output via redirection facility.
+Also one can redirect output by this option.
+.TP
+.B -a<file>
+It works like
+.I -o
+option but opens file in append mode.
+It is usefull when addition of some prolog is required.
+.TP
+.B -b<file>
+The same as
+.I -o
+option but force output in binary mode.
+So, program will be write PFB-font format.
+Note that this option contradicts with multifont preparation,
+and in attempt of loading second font process will be canceled.
+.TP
+.B -c<file>
+Copying specified file to output as is. This option is strange in
+UNIX environment but is very usefull in VMS environment.
+.TP
+.B -n/../../
+This option defines characters required to download from next font.
+Note, if this option is missed, program will loads all characters.
+In this case only convertion from
+.I PFB
+format to
+.I PFA
+format and back will be done.
+.TP
+.B <file>
+Process font from file.
+.TP
+.B -
+Process font from stdin.
+.TP
+.B -f<file>
+Reads list of required fonts and characters from
+.I file
+and process every font. This option turns on
+.I multifont
+mode in which fonts with the same encoding will share one
+encoding vector,
+.I eexec
+PS operator will not be used in output stream
+and other optimizations will be done.
+
+Every line of this file must containes specification:
+
+font-name/char-1/char-2/.../char.../
+.TP
+.B -m<map-file>
+defines file with mapping of font names (used in file processed by
+.I -f
+option) to file names.
+Every line of map-file maps font to file like to:
+
+ Times-Romat tir____.pfb
+ Times-Bold tib____.pfb
+.TP
+.B -I<path>
+Font search path, which is used for searching font files (used with
+.I -f
+option).
+.TP
+.B -u<file>
+File for put list of undefined fonts (used with -f option).
+This file will be created only in case if unknown fonts exist.
+.TP
+.B -e\#
+Touch encoding flag.
+In multifont mode the same font encoding verctors is loaded only once.
+To make so, every encoding vector loaded out of font body
+and have uniqual name. Every font will only refer
+into already loaded encoding verctor. To suppress this
+feature one can use option
+.B -e-1
+When program prepares several files without
+.I \-f
+option
+but using
+.I \-n
+option and
+.I <file>,
+encoding vector will be loaded as is.
+To force removing the same encodings one can say
+.B -e1.
+.TP
+.B -x\#
+eexec applying flag.
+In multifont mode fonts will be outputted without
+.I eexec
+instruction.
+This feature make output file smaller.
+To suppress this feature in multifont mode one can use option
+.B -x2
+When program prepares several files without
+.I \-f
+option
+but using
+.I \-n
+option and
+.I <file>,
+eexec will be applied.
+To remove eexec, in this case, one can use
+.B -x0.
+.TP
+.B -z <file1> ...
+In this case program will be read every file from list,
+search line with pattern:
+
+.B /FontName /<font-name> def
+
+and output line like
+
+.B /<fontname> (<file-name>) ;
+
+This facility is usefull for making font map file.
+.SH EXAMPLES
+.LP
+.nf
+To make font with characters 'B', 'K' and 'M' from Times-Roman font:
+
+.B subfont -o BKM.pfa -n/B/K/M/ Times-Roman.pfa
+
+The same but output will be in PFB format:
+
+.B subfont -b BKM.pfb -n/B/K/M/ Times-Roman.pfa
+
+.ft R
+.fi
+.SH "SEE ALSO"
+.LP
+.BR fload (1),
+.LP
+.I "Adobe Type 1 Font Format"
+.SH BUGS
+None known.
+.SH AUTHOR
+Basil K. Malyshev (malyshev@mx.ihep.su)
diff --git a/fonts/utilities/fontload/src/Makefile b/fonts/utilities/fontload/src/Makefile
new file mode 100644
index 0000000000..49551cde78
--- /dev/null
+++ b/fonts/utilities/fontload/src/Makefile
@@ -0,0 +1,21 @@
+# Makefile for subfont program
+
+BINDIR=$(HOME)/bin
+MANDIR=$(HOME)/man/man1
+
+# ANSI C --- can use gcc too
+CC=gcc
+CFLAGS=-O
+
+all: subfont
+
+subfont: subfont.o
+ $(CC) -o subfont subfont.o
+
+install: all
+ install -cs subfont $(BINDIR)
+ cp subfont.1 $(MANDIR)
+
+clean:
+ rm -f *.o *~ *.bak core a.out subfont
+
diff --git a/fonts/utilities/fontload/src/fstat.c b/fonts/utilities/fontload/src/fstat.c
new file mode 100644
index 0000000000..36fca11030
--- /dev/null
+++ b/fonts/utilities/fontload/src/fstat.c
@@ -0,0 +1,17 @@
+# include <stdio.h>
+
+int main()
+{
+ static char buf[4096];
+
+ while ( fgets(buf,sizeof(buf),stdin) != NULL )
+ {
+ int cnt;
+ char *cp;
+ for( cp = buf; *cp && *cp != '/' ; cp++ );
+ *cp++ = 0;
+ for( cnt = 0; *cp ; cp++ ) if ( *cp == '/' ) cnt++;
+ printf("%s & %d\\cr\n",buf,cnt);
+ }
+ return 0;
+}
diff --git a/fonts/utilities/fontload/src/subfont.c b/fonts/utilities/fontload/src/subfont.c
new file mode 100644
index 0000000000..5c24016d5f
--- /dev/null
+++ b/fonts/utilities/fontload/src/subfont.c
@@ -0,0 +1,1860 @@
+/* SubFont
+**
+** This program makes new subfont which contains only selected characters.
+** The program was started 27-Oct-1994 and began from source codes of the
+** t1disasm and t1asm programs whose wroten by I. Lee Hetherington
+** (ilh@lcs.mit.edu).
+**
+** Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved.
+**
+** LIMITATIONS:
+** This program can prepare only ATM compatible PS Type 1 fonts.
+** In this reason you must download other type fonts avoiding this program.
+**
+** The reasons and applications of this program:
+** 1. Some expert fonts have a lot of characters. For example EC/DC
+** fonts are designed to cover most of european languages.
+** However in each european language only few accented characters
+** is used. This program can be used to make own smaller font
+** which will be enought for typesetting in your language.
+** 2. Together with psfstat.ps program distributed with this program
+** you can organize partial font downloading.
+** 3. Using this module as part of DVIPS program partial font
+** downloading can be done faster.
+**
+** History:
+** 27-Oct-94 Beginning ...
+** 1-Nov-94 V1.0 First completly workable version.
+** Works together with fload C-shell script which calls
+** GhostScript with 'psfstat.ps' macroses to make
+** map of required charactrs.
+** 3-Nov-94 V1.1 Now can prepare fonts with non standard layout
+** that have 'noaccess put' instead of '|' or 'NP'.
+** Now can process HYBRID fonts which have two versions
+** of the 'Subrs' for High and low resolution devices.
+** That is many Oblique fonts (Univers, Helvetica, ...)
+** 24-Nov-94 Uploaded to CTAN:fonts/utilities/fontload.
+** 25-Nov-94 Fixed for VMS.
+** 27-Nov-94 Add ability for the output without eexec that reduces
+** size of output file and accelerates downloading process
+** but not reduces required printer memory.
+** 28-Nov-94 optimize Subrs construction, which slightly reduces
+** memory requirements.
+** Remove warning on unknown_15 code which is not documented
+** by Adobe but used in blank characters.
+** Enclose every font into mark ... cleartoark if
+** Eexec_Output flag is off.
+** 30-Nov-94 V1.2 Ported to MS-DOS, compiled by
+** Microsoft (R) C/C++ Optimizing Compiler Version 8.0
+** 19-Dec-94 V1.3 Now can read font map in GhostScript format.
+** So, SubFont and GhostScript can share the same font map.
+** 7-Jan-95 V1.4 Fixed dcr10 encoding size problem.
+**
+******* Also, copyright of the t1asm and t1disasm programs is there: ********
+**
+** Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+**
+** Permission is hereby granted to use, modify, and distribute this program
+** for any purpose provided this copyright notice and the one below remain
+** intact.
+**
+** author of the t1asm and t1disasm programs:
+** I. Lee Hetherington (ilh@lcs.mit.edu)
+*/
+
+# define PROGRAM "SubFont"
+# define PROBLEM "BKM Type1 SubFont Extractor"
+# define VERSION "1.4"
+# define REVDATE "7-Jan-1995"
+# define AUTHOR "Basil K.Malyshev (Vassili Malychev)"
+# define COPYRIGHT "1994, 1995, Basil K. Malyshev."
+
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <ctype.h>
+
+# ifdef MSDOS
+# define SMALL_MEMORY
+# define SYSID "MS-DOS"
+# define PATH_DELIMITER ';'
+# define FILE_DELIMITER '\\'
+# define DEFAULTFONTPATH ".;C:\\PSFONTS;C:\\GS;C:\\GS\\FONTS"
+# define RB "rb"
+# define WB "wb"
+# endif
+
+# ifdef vms
+# define SYSID "VMS"
+# define PATH_DELIMITER ','
+# define FILE_DELIMITER 0
+# define DEFAULTFONTPATH "SYS$DISK:[],Type1_Fonts:,GS_LIB:"
+# define RB "rb"
+# define WB "wb"
+# endif
+
+# ifdef unix
+# define SYSID "UNIX"
+# define PATH_DELIMITER ':'
+# define FILE_DELIMITER '/'
+# define DEFAULTFONTPATH ".:/usr/local/lib/Fonts"
+# define RB "r"
+# define WB "w"
+# endif
+
+# ifndef SYSID
+# define SMALL_MEMORY
+# define SYSID "(Assumed MS-DOS)"
+# define PATH_DELIMITER ';'
+# define FILE_DELIMITER '\\'
+# define DEFAULTFONTPATH ".;C:\\PSFONTS;C:\\GS;C:\\GS\\FONTS"
+# define RB "rb"
+# define WB "wb"
+# endif
+
+#define LINESIZE 4096 /* 256 */
+
+typedef unsigned char byte;
+
+static int Verbose = 0;
+static int Trace = 0;
+static int ArrLosts = 0;
+static int TouchEncoding = 0;
+static int Eexec_Output = 1;
+
+static FILE *ifp /*VMS: = stdin */ ;
+static FILE *ofp /*VMS: = stdout */;
+static FILE *ufp = NULL;
+static char *uFileName = NULL;
+static char line[LINESIZE];
+static int lenIV = 4;
+
+static char RD_String[] = "RD";
+static char ND_String[] = "noaccess def";
+static char NP_String[] = "noaccess put";
+
+static struct { int code; char *name; } StdEnc[] = {
+ 040 , "space",
+ 041 , "exclam",
+ 042 , "quotedbl",
+ 043 , "numbersign",
+ 044 , "dollar",
+ 045 , "percent",
+ 046 , "ampersand",
+ 047 , "quoteright",
+ 050 , "parenleft",
+ 051 , "parenright",
+ 052 , "asterisk",
+ 053 , "plus",
+ 054 , "comma",
+ 055 , "hyphen",
+ 056 , "period",
+ 057 , "slash",
+ 060 , "zero",
+ 061 , "one",
+ 062 , "two",
+ 063 , "three",
+ 064 , "four",
+ 065 , "five",
+ 066 , "six",
+ 067 , "seven",
+ 070 , "eight",
+ 071 , "nine",
+ 072 , "colon",
+ 073 , "semicolon",
+ 074 , "less",
+ 075 , "equal",
+ 076 , "greater",
+ 077 , "question",
+ 0100 , "at",
+ 0101 , "A",
+ 0102 , "B",
+ 0103 , "C",
+ 0104 , "D",
+ 0105 , "E",
+ 0106 , "F",
+ 0107 , "G",
+ 0110 , "H",
+ 0111 , "I",
+ 0112 , "J",
+ 0113 , "K",
+ 0114 , "L",
+ 0115 , "M",
+ 0116 , "N",
+ 0117 , "O",
+ 0120 , "P",
+ 0121 , "Q",
+ 0122 , "R",
+ 0123 , "S",
+ 0124 , "T",
+ 0125 , "U",
+ 0126 , "V",
+ 0127 , "W",
+ 0130 , "X",
+ 0131 , "Y",
+ 0132 , "Z",
+ 0133 , "bracketleft",
+ 0134 , "backslash",
+ 0135 , "bracketright",
+ 0136 , "asciicircum",
+ 0137 , "underscore",
+ 0140 , "quoteleft",
+ 0141 , "a",
+ 0142 , "b",
+ 0143 , "c",
+ 0144 , "d",
+ 0145 , "e",
+ 0146 , "f",
+ 0147 , "g",
+ 0150 , "h",
+ 0151 , "i",
+ 0152 , "j",
+ 0153 , "k",
+ 0154 , "l",
+ 0155 , "m",
+ 0156 , "n",
+ 0157 , "o",
+ 0160 , "p",
+ 0161 , "q",
+ 0162 , "r",
+ 0163 , "s",
+ 0164 , "t",
+ 0165 , "u",
+ 0166 , "v",
+ 0167 , "w",
+ 0170 , "x",
+ 0171 , "y",
+ 0172 , "z",
+ 0173 , "braceleft",
+ 0174 , "bar",
+ 0175 , "braceright",
+ 0176 , "asciitilde",
+ 0241 , "exclamdown",
+ 0242 , "cent",
+ 0243 , "sterling",
+ 0244 , "fraction",
+ 0245 , "yen",
+ 0246 , "florin",
+ 0247 , "section",
+ 0250 , "currency",
+ 0251 , "quotesingle",
+ 0252 , "quotedblleft",
+ 0253 , "guillemotleft",
+ 0254 , "guilsinglleft",
+ 0255 , "guilsinglright",
+ 0256 , "fi",
+ 0257 , "fl",
+ 0261 , "endash",
+ 0262 , "dagger",
+ 0263 , "daggerdbl",
+ 0264 , "periodcentered",
+ 0266 , "paragraph",
+ 0267 , "bullet",
+ 0270 , "quotesinglbase",
+ 0271 , "quotedblbase",
+ 0272 , "quotedblright",
+ 0273 , "guillemotright",
+ 0274 , "ellipsis",
+ 0275 , "perthousand",
+ 0277 , "questiondown",
+ 0301 , "grave",
+ 0302 , "acute",
+ 0303 , "circumflex",
+ 0304 , "tilde",
+ 0305 , "macron",
+ 0306 , "breve",
+ 0307 , "dotaccent",
+ 0310 , "dieresis",
+ 0312 , "ring",
+ 0313 , "cedilla",
+ 0315 , "hungarumlaut",
+ 0316 , "ogonek",
+ 0317 , "caron",
+ 0320 , "emdash",
+ 0341 , "AE",
+ 0343 , "ordfeminine",
+ 0350 , "Lslash",
+ 0351 , "Oslash",
+ 0352 , "OE",
+ 0353 , "ordmasculine",
+ 0361 , "ae",
+ 0365 , "dotlessi",
+ 0370 , "lslash",
+ 0371 , "oslash",
+ 0372 , "oe",
+ 0373 , "germandbls",
+ 0, 0
+};
+
+static char *StandardEncoding[256];
+
+void init_Encoding(void)
+{
+ int i;
+ for( i = 0 ; i < 256 ; i++ )
+ StandardEncoding[i] = NULL;
+
+ for( i = 0 ; StdEnc[i].name != NULL ; i++ )
+ StandardEncoding[StdEnc[i].code] = StdEnc[i].name ;
+}
+
+static int Files = 0; /* Number of processed fonts */
+
+void *xmalloc( int Size )
+{
+ void *ptr;
+
+ if ( (ptr=malloc( Size )) == NULL )
+ {
+ fprintf(stderr,"? SubFont: Not enought memory(needed %d bytes)\n",Size);
+ exit(1);
+ }
+ return ptr;
+}
+
+char *xstrdup( char *str )
+{
+ char *ptr;
+ ptr = xmalloc( strlen(str) + 1 );
+ strcpy(ptr,str);
+ return ptr;
+}
+
+# define CHUNK_SIZE 128
+struct ChunkSt
+ { struct ChunkSt *next; void *ptr[CHUNK_SIZE]; }
+ *currChunk = NULL, *next;
+static int currPtr = CHUNK_SIZE;
+
+void *fmalloc( int Size , char *tag )
+{
+ void *ptr;
+
+ if ( (ptr=malloc( Size )) == NULL )
+ {
+ fprintf(stderr,"? SubFont: Not enought memory for %s(needed %d bytes)\n",
+ tag,Size);
+ exit(1);
+ }
+ if ( currPtr >= CHUNK_SIZE )
+ {
+ next = xmalloc( sizeof(struct ChunkSt) );
+ next->next = currChunk;
+ currChunk = next;
+ currPtr = 0;
+ }
+ currChunk->ptr[currPtr++] = ptr;
+ return ptr;
+}
+
+void fAllFree( void )
+/* Freeing all memory which was allocated by fmalloc */
+{
+ int j;
+ long l;
+ for( l = 0; currChunk != NULL; currChunk = next )
+ {
+ next = currChunk->next;
+ for( j = 0 ; j < currPtr ; j++,l++ ) free(currChunk->ptr[j]);
+ free(currChunk);
+ currPtr = CHUNK_SIZE;
+ }
+ if ( Verbose ) fprintf(stderr,"fAllFree(): Freeing %d memory blocks\n",l);
+}
+
+/* decryption stuff */
+static unsigned short er, oer, cr;
+static unsigned short c1 = 52845, c2 = 22719;
+
+/* This function looks for `currentfile eexec' string and returns 1 once found.
+ If c == 0, then simply check the status. */
+
+static char *p_eexec_scan = 0;
+
+static int eexec_scanner( int /*char*/ c)
+{
+ static char *key = "currentfile eexec\n";
+
+ if (!p_eexec_scan)
+ p_eexec_scan = key;
+
+ if (c && *p_eexec_scan) {
+ if (c == *p_eexec_scan)
+ ++p_eexec_scan;
+ else
+ p_eexec_scan = key;
+ }
+ return *p_eexec_scan == '\0';
+}
+
+/* This function returns the value of a single hex digit. */
+
+static int hexval(char c)
+{
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ else if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ else if (c >= '0' && c <= '9')
+ return c - '0';
+ else
+ return 0;
+}
+
+/* This function returns a single character at a time from a PFA or PFB file.
+ This stream is mixed ASCII and binary bytes. For PFB files, the section
+ headers are removed, and \r is replaced by \n in ASCII sections. For PFA
+ files, the hexdecimal data is turned into binary bytes. */
+
+ static int first_byte = 1;
+ static int is_pfa = 0;
+ static int is_pfb = 0;
+ static long pfb_remaining = 0;
+
+static int bgetc()
+{
+ int c, val;
+
+ /* is_pfa == 1 means PFA initial ASCII section
+ is_pfa == 2 means PFA hexadecimal section
+ is_pfb == 1 means PFB ASCII section
+ is_pfB == 2 means PFB binary section */
+
+ c = fgetc(ifp);
+
+ if (c == EOF)
+ return EOF;
+
+ if (first_byte) {
+ /* Determine if this is a PFA or PFB file by looking at first byte. */
+ if (c == 0x80) {
+ is_pfb = 1;
+ is_pfa = 0;
+ } else {
+ is_pfb = 0;
+ is_pfa = 1;
+ }
+ first_byte = 0;
+ }
+
+ if (is_pfb) {
+ /* PFB */
+ if (pfb_remaining == 0) {
+ /* beginning of block---we know c == 0x80 at this point */
+ switch (fgetc(ifp)) {
+ case 1:
+ is_pfb = 1;
+ break;
+ case 2:
+ is_pfb = 2;
+ break;
+ case 3:
+ return EOF;
+ default:
+ fprintf(stderr, "error: is this really a PFB file?\n");
+ exit(1);
+ }
+ /* get block length */
+ pfb_remaining = (long)fgetc(ifp) & 0xff;
+ pfb_remaining |= ((long)fgetc(ifp) & 0xff) << 8;
+ pfb_remaining |= ((long)fgetc(ifp) & 0xff) << 16;
+ pfb_remaining |= ((long)fgetc(ifp) & 0xff) << 24;
+ /* get character */
+ c = fgetc(ifp);
+ if (c == EOF)
+ return EOF;
+ }
+ --pfb_remaining;
+ /* in ASCII section change return to newline */
+ if (is_pfb == 1 && c == '\r')
+ c = '\n';
+ (void)eexec_scanner(c);
+ return c;
+ } else {
+ /* PFA */
+ if (is_pfa == 1) {
+ /* in initial ASCII */
+ if (eexec_scanner(c))
+ is_pfa = 2;
+ return c;
+ } else {
+ /* in hexadecimal */
+ while (isspace(c))
+ c = fgetc(ifp);
+ val = hexval((char)c) << 4;
+ val |= hexval((char)(c = fgetc(ifp)));
+ if (c == EOF)
+ return EOF;
+ return val;
+ }
+ }
+}
+
+/* Two separate decryption functions because eexec and charstring decryption
+ must proceed in parallel. */
+
+static byte edecrypt(int /*byte */ cipher)
+{
+ byte plain;
+
+ plain = (byte)(cipher ^ (er >> 8));
+ er = (cipher + er) * c1 + c2;
+ return plain;
+}
+
+static byte cdecrypt( int /*byte*/ cipher)
+{
+ byte plain;
+
+ plain = (byte)(cipher ^ (cr >> 8));
+ cr = (cipher + cr) * c1 + c2;
+ return plain;
+}
+
+/* This function returns 1 the first time the eexec_scanner returns 1. */
+
+ static int reported = 0;
+static int immediate_eexec()
+{
+
+ if (!reported && eexec_scanner(0)) {
+ reported = 1;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/* This function returns a single byte at a time through (possible) eexec
+ decryption. When immediate_eexec returns 1 it fires up the eexec decryption
+ machinery. */
+
+ static int in_eexec = 0, out_eexec = 0;
+static int egetc()
+{
+ int c,j;
+
+ if ((c = bgetc()) == EOF)
+ return EOF;
+
+ if (!in_eexec) {
+ if (immediate_eexec()) {
+ /* start eexec decryption */
+ in_eexec = 1;
+ er = 55665;
+ /* toss out four random bytes */
+ for( j = 4 ; j > 0 ; j-- )
+ (void) edecrypt(bgetc());
+ }
+ return c;
+ } else {
+ return edecrypt(c);
+ }
+}
+
+/* This function returns a line of eexec decrypted characters. A line is
+ terminated by length (including terminating null) greater than LINESIZE, a
+ newline \n, or one of the special charstring start sequences ` -| ' or
+ ` RD '. The line, including the terminating newline or charstring start
+ sequence is put into line[]. If terminated by a charstring start sequence,
+ the flag start_charstring is set to 1. */
+
+static int egetline()
+{
+ int c,cnt,cntcont;
+ char *p = line;
+
+ cnt = 0; cntcont = 0;
+ while (p < line + LINESIZE) {
+ c = egetc();
+ if (c == EOF)
+ break;
+ if ( '0' <= c && c <= '9' )
+ { cnt = ( cntcont ? cnt * 10 : 0 ) + c - '0' ; cntcont = 1; }
+ else
+ cntcont = 0;
+ *p++ = (char) c;
+ if (p >= line + 4 && (strncmp(p - 4, " -| ", 4) == 0 ||
+ strncmp(p - 4, " RD ", 4) == 0)) {
+ for( ; cnt >= 0 ; cnt-- ) *p++ = (char)egetc(); /* load char string */
+ }
+ if (c == '\r') { /* map \r to \n */
+ p[-1] = '\n';
+ break;
+ }
+ if (c == '\n')
+ break;
+ }
+ *p = '\0';
+ return (int)(p-line);
+}
+
+/* If the line contains an entry of the form `/lenIV <num>' then set the global
+ lenIV to <num>. This indicates the number of random bytes at the beginning
+ of each charstring. */
+
+static void set_lenIV()
+{
+ char *p = strstr(line, "/lenIV ");
+
+ if (p && isdigit(p[7])) {
+ lenIV = atoi(p + 7);
+ }
+}
+
+/* Subroutine to output strings. */
+
+# define MAXPOOL 8192
+static char *pool[MAXPOOL];
+static int pool_cnt = 0;
+
+static void output(char *string)
+{
+ if ( pool_cnt >= MAXPOOL )
+ { fprintf(stderr,"Not enought pool size...\n"); exit(1); }
+ pool[pool_cnt] = fmalloc( strlen(string) + 1 , "output buffer line" );
+ strcpy(pool[pool_cnt],string);
+ pool_cnt++;
+}
+
+/************************** Output routines .... ************************/
+# define SMALL_MEMORY
+
+#ifdef SMALL_MEMORY
+#define MAXBLOCKLEN 32000
+#else
+#define MAXBLOCKLEN ((1<<17)-6)
+#endif
+
+#define MINBLOCKLEN ((1<<8)-6)
+
+#define MARKER 128
+#define ASCII 1
+#define BINARY 2
+#define DONE 3
+
+/* flags */
+static int pfb = 0;
+static int active = 0;
+/* static int in_eexec = 0; File firstly loaded and then dumped ... */
+
+/* for PFB block buffering */
+static byte blockbuf[MAXBLOCKLEN];
+static int blocklen = MAXBLOCKLEN;
+static int blockpos = -1;
+static int blocktyp = ASCII;
+
+static byte eencrypt( byte plain)
+{
+ byte cipher;
+
+ cipher = (byte)(plain ^ (oer >> 8));
+ oer = (cipher + oer) * c1 + c2;
+ return cipher;
+}
+
+/* This function flushes a buffered PFB block. */
+
+static void output_block()
+{
+ int i;
+
+ /* output four-byte block length */
+ fputc(blockpos & 0xff, ofp);
+ fputc((blockpos >> 8) & 0xff, ofp);
+ fputc((blockpos >> 16) & 0xff, ofp);
+ fputc((blockpos >> 24) & 0xff, ofp);
+
+ /* output block data */
+ for (i = 0; i < blockpos; i++)
+ fputc(blockbuf[i], ofp);
+
+ /* mark block buffer empty and uninitialized */
+ blockpos = -1;
+}
+
+/* This function outputs a single byte. If output is in PFB format then output
+ is buffered through blockbuf[]. If output is in PFA format, then output
+ will be hexadecimal if in_eexec is set, ASCII otherwise. */
+
+static int hexcol = 0 ;
+static void output_byte(byte b)
+{
+ static char *hexchar = "0123456789ABCDEF";
+
+ if (pfb) {
+ /* PFB */
+ if (blockpos < 0) {
+ fputc(MARKER, ofp);
+ fputc(blocktyp, ofp);
+ blockpos = 0;
+ }
+ blockbuf[blockpos++] = b;
+ if (blockpos == blocklen)
+ output_block();
+ } else {
+ /* PFA */
+ if (out_eexec) {
+ /* trim hexadecimal lines to 64 columns */
+ if (hexcol >= 64) {
+ fputc('\n', ofp);
+ hexcol = 0;
+ }
+ fputc(hexchar[(b >> 4) & 0xf], ofp);
+ fputc(hexchar[b & 0xf], ofp);
+ hexcol += 2;
+ } else {
+ fputc(b, ofp);
+ }
+ }
+}
+
+/* This function outputs a byte through possible eexec encryption. */
+
+static void eexec_byte(byte b)
+{
+ if (out_eexec)
+ output_byte(eencrypt(b));
+ else
+ output_byte(b);
+}
+
+/* This function outputs a null-terminated string through possible eexec
+ encryption. */
+
+static void eexec_string(char *string)
+{
+ while (*string)
+ eexec_byte((byte) *string++);
+}
+
+/* This function gets ready for the eexec-encrypted data. If output is in
+ PFB format then flush current ASCII block and get ready for binary block.
+ We start encryption with four random (zero) bytes. */
+
+static void eexec_start()
+{
+ if (pfb) {
+ output_block();
+ blocktyp = BINARY;
+ }
+
+ out_eexec = 1;
+ oer = 55665;
+ eexec_byte('B');
+ eexec_byte('K');
+ eexec_byte('M');
+ eexec_byte('!');
+}
+
+/* This function wraps-up the eexec-encrypted data and writes ASCII trailer.
+ If output is in PFB format then this entails flushing binary block and
+ starting an ASCII block. */
+
+static void eexec_end()
+{
+ int i, j;
+
+ if (pfb) {
+ output_block();
+ blocktyp = ASCII;
+ } else {
+ fputc('\n', ofp);
+ }
+ out_eexec = 0;
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 64; j++)
+ eexec_byte('0');
+ eexec_byte('\n');
+ }
+ eexec_string("cleartomark\n");
+ if (pfb) {
+ output_block();
+ fputc(MARKER, ofp);
+ fputc(DONE, ofp);
+ }
+}
+
+static void Dump_Pool( int from , int to )
+{
+ int i;
+ for ( i = from ; i < to ; i++ )
+ {
+ if ( Eexec_Output )
+ {
+ eexec_string(pool[i]);
+ if ( strcmp(pool[i], "currentfile eexec\n") == 0 ) eexec_start();
+ }
+ else
+ {
+ if ( i == 0 )
+ eexec_string("mark %%\n");
+ if( strcmp(pool[i], "mark currentfile closefile\n") == 0 )
+ eexec_string("end cleartomark%%\n");
+ else if ( strcmp(pool[i], "currentfile eexec\n") == 0 )
+ eexec_string("systemdict begin\n");
+ else
+ eexec_string(pool[i]);
+ }
+ }
+}
+
+static void Dump_CS( int Len , unsigned char *cs )
+{
+ if ( Eexec_Output )
+ {
+ char buf[64];
+ sprintf(buf," %d %s ", Len, RD_String);
+ eexec_string(buf);
+ for( ; Len > 0 ; Len--, cs++) eexec_byte(*cs);
+ eexec_byte(' ');
+ }
+ else
+ {
+ int c;
+ eexec_string("\n<");
+ for( c = 2 ; Len > 0 ; Len--, cs++, c += 2)
+ {
+ eexec_byte("0123456789ABCDEF"[((*cs)>>4)&0xF]);
+ eexec_byte("0123456789ABCDEF"[(*cs)&0xF]);
+ if ( c > 70 ) { eexec_byte('\n'); c = 0; }
+ }
+ eexec_string("> ");
+ }
+}
+
+int Subrs = 0;
+int MaxSubrs = 0;
+int SubrsPosition = 0;
+int HiSubrs = 0;
+int HiMaxSubrs = 0;
+int HiSubrsPosition = 0;
+typedef struct {
+ unsigned char *cs;
+ int len;
+ int use; /* Using marker ... */
+ } CSType;
+CSType *Subr, *HiSubr;
+
+int CharStrings = 0;
+int CharStringsPosition = 0;
+struct {
+ char *Name;
+ unsigned char *cs;
+ int len;
+ int use; /* Using marker */
+ } *CharString;
+int CharStringCnt = 0;
+
+static int sp, stack[128];
+static int cop, vop[32];
+void ProcessCharString( unsigned char *cs , int len )
+{
+ int p, i, b, val;
+ unsigned short cr_save ;
+
+ cr_save = cr;
+
+ cr = 4330;
+ for (p = 0; p < len && p < lenIV; p++ )
+ cdecrypt(cs[p]);
+
+ while ( p < len )
+ {
+ b = cdecrypt(cs[p++]);
+ if (b >= 32) {
+ if (b >= 32 && b <= 246)
+ val = b - 139;
+ else if (b >= 247 && b <= 250)
+ val = (b - 247)*256 + 108 + cdecrypt(cs[p++]);
+ else if (b >= 251 && b <= 254)
+ val = -(b - 251)*256 - 108 - cdecrypt(cs[p++]);
+ else if (b == 255) {
+ val = (cdecrypt(cs[p++]) & 0xff) << 24;
+ val |= (cdecrypt(cs[p++]) & 0xff) << 16;
+ val |= (cdecrypt(cs[p++]) & 0xff) << 8;
+ val |= (cdecrypt(cs[p++]) & 0xff) << 0;
+ /* in case an int is larger than four bytes---sign extend */
+ if (sizeof(int) > 4 && val & (1U << 31))
+ for (i = 4; i < sizeof(int); i++)
+ val |= 0xff << (i * 8);
+ }
+ stack[sp++] = val;
+ } else {
+ if ( Trace ) fprintf(stderr,"[%d]",b);
+ switch (b) {
+ case 1: sp = 0; /* ("hstem"); */ break;
+ case 3: sp = 0; /* ("vstem"); */ break;
+ case 4: sp = 0; /* ("vmoveto"); */ break;
+ case 5: sp = 0; /* ("rlineto"); */ break;
+ case 6: sp = 0; /* ("hlineto"); */ break;
+ case 7: sp = 0; /* ("vlineto"); */ break;
+ case 8: sp = 0; /* ("rrcurveto"); */ break;
+ case 9: sp = 0; /* ("closepath"); */ break;
+ case 10: /* ("callsubr"); */
+ val = stack[--sp];
+ if ( ! ( 0 <= val && val < MaxSubrs ) )
+ {
+ fprintf(stderr,"Illegal call of unexistant subroutine %d\n",val);
+ exit(1);
+ }
+ if ( Trace ) fprintf(stderr,"{%d:",val);
+ /* if ( ! Subr[val].use ) */
+ { /* Process it, if yet not processed ... */
+ CSType *SvSubr;
+ SvSubr = HiSubr; HiSubr = NULL;
+ Subr[val].use = 1;
+ ProcessCharString( Subr[val].cs , Subr[val].len );
+ HiSubr = SvSubr;
+ }
+ if ( HiSubr != NULL )
+ { /* Process it, if yet not processed ... */
+ CSType *SvSubr;
+ SvSubr = Subr; Subr = HiSubr; HiSubr = NULL;
+ Subr[val].use = 1;
+ ProcessCharString( Subr[val].cs , Subr[val].len );
+ HiSubr = Subr; Subr = SvSubr;
+ }
+ if ( Trace ) fprintf(stderr,"}");
+ break;
+ case 11: /* ("return"); */
+ cr = cr_save;
+ return;
+ case 13: sp = 0; /* ("hsbw"); */ break;
+ case 14: sp = 0; /* ("endchar"); */ break;
+ case 15: sp = 0; /* Undocumented code but used in blank characters */
+ break;
+ case 21: sp = 0; /* ("rmoveto"); */ break;
+ case 22: sp = 0; /* ("hmoveto"); */ break;
+ case 30: sp = 0; /* ("vhcurveto"); */ break;
+ case 31: sp = 0; /* ("hvcurveto"); */ break;
+ case 12:
+ b = cdecrypt(cs[p++]) ;
+ if ( Trace ) fprintf(stderr,"[%d]",b);
+ switch (b) {
+ case 0: sp = 0; /* ("dotsection"); */ break;
+ case 1: sp = 0; /* ("vstem3"); */ break;
+ case 2: sp = 0; /* ("hstem3"); */ break;
+ case 6: /* ("seac"); */
+ {
+ int c1,c2;
+ c1 = stack[--sp];
+ c2 = stack[--sp];
+ sp -= 3;
+ if ( StandardEncoding[c1] == NULL )
+ fprintf(stderr,"No character %d in Standard encoding\n",c1);
+ else
+ {
+ for( i = 0 ; i < CharStringCnt ; i++ )
+ if ( ! strcmp(CharString[i].Name+1,StandardEncoding[c1]) )
+ break;
+ if ( i >= CharStringCnt )
+ fprintf(stderr,"No seac refered character %s in font\n",
+ StandardEncoding[c1]);
+ else if ( ! CharString[i].use )
+ {
+ CharString[i].use = 1;
+ sp = 0;
+ ProcessCharString( CharString[i].cs , CharString[i].len );
+ }
+ }
+ c1 = c2;
+ if ( StandardEncoding[c1] == NULL )
+ fprintf(stderr,"No character %d in Standard encoding\n",c1);
+ else
+ {
+ for( i = 0 ; i < CharStringCnt ; i++ )
+ if ( ! strcmp(CharString[i].Name+1,StandardEncoding[c1]) )
+ break;
+ if ( i >= CharStringCnt )
+ fprintf(stderr,"No seac refered character %s in font\n",
+ StandardEncoding[c1]);
+ else if ( ! CharString[i].use )
+ {
+ CharString[i].use = 1;
+ sp = 0;
+ ProcessCharString( CharString[i].cs , CharString[i].len );
+ }
+ }
+ }
+ break;
+ case 7: sp = 0; /* ("sbw"); */ break;
+ case 12: sp--; stack[sp-1] /= stack[sp]; /* ("div"); */ break;
+ case 16: /* ("callothersubr"); */
+ /* I have no Adobe Type 1 manual on hands now and not remember
+ order of loading arguments in calling of othersubr
+ but there it is not important. */
+ val = stack[--sp];
+ cop = stack[--sp];
+ for( i = 0 ; i < cop ; i++ )
+ vop[i] = stack[--sp];
+ /* Special logic there ... */
+ if ( val == 3 ) Subr[3].use = 1; /* Used hint replacement */
+ break;
+ case 17: /* ("pop"); */
+ stack[sp++] = vop[--cop];
+ break;
+ case 33: sp -= 2; /* sp = 0; */ /* ("setcurrentpoint"); */ break;
+ default:
+ fprintf(stderr, "UNKNOWN_12_%d", b);
+ break;
+ }
+ break;
+ default:
+ fprintf(stderr, "UNKNOWN_%d", b);
+ break;
+ }
+ }
+ } /* End while */
+ cr = cr_save;
+}
+
+void Fix_String( char *dst , char *Tag , int Val , char *src )
+{
+ char *cp,*dp;
+ strcpy(dst,src);
+ if ( (cp=strstr(src,Tag)) == NULL )
+ { fprintf(stderr,"Nu i nu, not '%s' in '%s'\n",Tag,src); exit(1); }
+ cp += strlen(Tag);
+ dp = dst + (cp-src);
+ while ( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ while ( '0' <= *cp && *cp <= '9' ) cp++; /* skip digits */
+ sprintf(dp,"%d%s",Val,cp);
+}
+
+# define MAXENCODINGS 64
+int EncodingPosition = 0;
+# ifdef PEDANTICAL_ENCODING_PROCESSING
+char **Encoding = 0;
+int EncodingCnt = 0;
+char **EncodingList[MAXENCODINGS];
+
+char *RegisterEncoding( char **Encoding )
+{
+ int i,j;
+ static char buf[64];
+
+ /* Search the same encoding ... */
+ for( i = 0 ; i < EncodingCnt ; i++ )
+ {
+ for( j = 0 ; j < 256 ; j++ )
+ if ( strcmp(Encoding[j],EncodingList[i][j]) ) break;
+ if ( j >= 256 ) break; /* Found the same encoding ... */
+ }
+ if ( i >= EncodingCnt )
+ { /* Booking new encoding ... */
+ if ( EncodingCnt < MAXENCODINGS )
+ EncodingList[EncodingCnt++] = Encoding;
+ else
+ fprintf(stderr,"Too many different encodings...\n");
+ /* Write this Encoding into file ... */
+ fprintf(ofp,"/SubFontEncoding-%d 256 array\n",i);
+ fprintf(ofp,"0 1 255 {1 index exch /.notdef put} for\n");
+ for( j = 0 ; j < 256 ; j++ )
+ if ( strcmp(Encoding[j],"/.notdef") )
+ fprintf(ofp,"dup %d %s put\n",j,Encoding[j]);
+ fprintf(ofp,"readonly def\n");
+ }
+ sprintf(buf,"SubFontEncoding-%d",i);
+ return buf;
+}
+
+void Begin_Encoding( char *line )
+{
+ int i;
+ Encoding = xmalloc( 256 * sizeof(char *) );
+ for( i = 0; i < 256 ; i++ ) Encoding[i] = "/.notdef";
+}
+
+int Fill_Encoding( char *line )
+{
+ int IsEncoding ;
+ char *cp,buf[128];
+
+ IsEncoding = 1;
+ if ( (cp=strstr(line," def")) != NULL ) /* End of encoding vector */
+ {
+ char *EncName, buf[128];
+ IsEncoding = 0;
+ EncName = RegisterEncoding( Encoding );
+ sprintf(buf,"/Encoding %s def\n",EncName);
+ pool_cnt--; /* discard previos Encoding line */
+ if ( Verbose )
+ fprintf(stderr,"End of encoding vector at: %s by %s",line,cp);
+ output(buf); /* make reference into our encoding ... */
+ }
+ else if ( (cp=strstr(line,"dup ")) != NULL )
+ { /* Fill encoding vector by follow material ... */
+ int code;
+ char *ep;
+
+ while ( (cp=strstr(cp,"dup ")) != NULL )
+ {
+ cp += 4;
+ code = atoi(cp);
+ if ( code < 0 || code >= 256 )
+ { fprintf(stderr,"Invalid encoding '%s'\n",line); exit(1); }
+ while( *cp && *cp <= ' ' ) cp++;
+ while( *cp && '0' <= *cp && *cp <= '9' ) cp++;
+ while( *cp && *cp <= ' ' ) cp++;
+ if ( *cp != '/' )
+ { fprintf(stderr,"Invalid encoding '%s'\n",line); exit(1); }
+ for( ep = cp ; *ep && *ep > ' ' ; ep++ );
+ Encoding[code] = xmalloc( (ep-cp) + 1 );
+ memcpy(Encoding[code],cp,ep-cp);
+ Encoding[code][ep-cp] = 0;
+ }
+ }
+ return IsEncoding;
+}
+# else
+# define MAXENCODINGLINES 512 /* Must be more then 256, for example dcr... */
+int EncodingLines = 0;
+char *Encoding[MAXENCODINGLINES];
+int EncodingCnt = 0;
+struct { char **Body; int Lines; } EncodingList[MAXENCODINGS];
+
+char *RegisterEncoding( char **Encoding )
+{
+ int i,j;
+ static char buf[64];
+
+ /* Search the same encoding ... */
+ for( i = 0 ; i < EncodingCnt ; i++ )
+ if ( EncodingList[i].Lines == EncodingLines )
+ {
+ for( j = 0 ; j < EncodingList[i].Lines ; j++ )
+ if ( strcmp(Encoding[j],EncodingList[i].Body[j]) ) break;
+ if ( j >= EncodingList[i].Lines ) break; /* the same encoding ... */
+ }
+
+ if ( i >= EncodingCnt )
+ { /* Booking new encoding ... */
+ if ( EncodingCnt < MAXENCODINGS )
+ {
+ EncodingList[EncodingCnt].Lines = EncodingLines ;
+ EncodingList[EncodingCnt].Body =
+ xmalloc( sizeof(char *) * EncodingLines );
+ memcpy(EncodingList[EncodingCnt].Body,Encoding,
+ sizeof(char *) * EncodingLines );
+ EncodingCnt++;
+ }
+ else
+ fprintf(stderr,"Too many different encodings...\n");
+ /* Write this Encoding into file ... */
+ for( j = 0 ; j < EncodingLines ; j++ )
+ fputs(Encoding[j],ofp);
+ fprintf(ofp,"/SubFontEncoding-%d Encoding def\n",i);
+ }
+ sprintf(buf,"SubFontEncoding-%d",i);
+ return buf;
+}
+
+void Begin_Encoding( char *line )
+{
+ EncodingLines = 0;
+ Encoding[EncodingLines++] = xstrdup(line);
+}
+
+int Fill_Encoding( char *line )
+{
+ int IsEncoding ;
+ char *cp;
+
+ IsEncoding = 1;
+ if ( EncodingLines >= MAXENCODINGLINES )
+ { fprintf(stderr,"? SubFont: Too long encoding\n"); exit(1); }
+ Encoding[EncodingLines++] = xstrdup(line);
+ if ( (cp=strstr(line," def")) != NULL ) /* End of encoding vector */
+ {
+ char *EncName, buf[128];
+ EncName = RegisterEncoding( Encoding );
+ sprintf(buf,"/Encoding %s def\n",EncName);
+ pool_cnt--; /* discard previos Encoding line */
+ if ( Verbose )
+ fprintf(stderr,"End of encoding vector at: %s by %s",line,cp);
+ output(buf); /* make reference into our encoding ... */
+ return 0;
+ }
+ return 1;
+}
+# endif
+
+int Process_Font( char *NeedChars )
+{
+ int i,k,l;
+ int IsEncoding;
+
+ /* reset important variables ... */
+ Subrs = 0;
+ MaxSubrs = 0;
+ SubrsPosition = 0;
+ HiMaxSubrs = 0;
+ HiSubrsPosition = 0;
+ Subr = HiSubr = NULL;
+
+ CharStrings = 0;
+ CharStringsPosition = 0;
+ CharStringCnt = 0;
+ lenIV = 4;
+ first_byte = 1;
+ is_pfa = is_pfb = 0;
+ pfb_remaining = 0;
+ p_eexec_scan = 0;
+ reported = 0;
+ in_eexec = out_eexec = 0;
+ pool_cnt = 0;
+ EncodingPosition = 0;
+ /* Encoding = NULL; */
+ IsEncoding = 0;
+ hexcol = 0;
+ /* main loop---normally done when reach `mark currentfile closefile' on
+ output (rest is garbage). */
+
+ for (;;) {
+ egetline();
+ if (line[0] == '\0')
+ break;
+ set_lenIV();
+
+ if ( IsEncoding )
+ {
+ IsEncoding = Fill_Encoding( line );
+ }
+ else if ( Subrs )
+ {
+ int SubrNo;
+ char *cp;
+ for( cp = line ; *cp && *cp <= ' ' ; cp++ );
+ if ( strncmp(cp,"dup ",4) != 0 )
+ {
+ fprintf(stderr,"Unexpected end of Subrs: '%s'",line);
+ fprintf(stderr,"While %d Subrs yet not defined\n",Subrs);
+ Subrs = 0;
+ }
+ else
+ {
+ cp += 4;
+ while( *cp && *cp <= ' ' ) cp++; /* skip leader spaces */
+ SubrNo = atoi(cp);
+ if ( SubrNo < 0 || SubrNo >= MaxSubrs )
+ { fprintf(stderr,"Invalid subr number %d\n",SubrNo); exit(1); }
+ while( '0' <= *cp && *cp <= '9' ) cp++; /* skip digits */
+ while( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ Subr[SubrNo].len = atoi(cp);
+ while( '0' <= *cp && *cp <= '9' ) cp++; /* skip digits */
+ while( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ if ( ! ( ( cp[0] == 'R' && cp[1] == 'D' && cp[2] == ' ' )
+ || ( cp[0] == '-' && cp[1] == '|' && cp[2] == ' ' )
+ )
+ ) { fprintf(stderr,"Bad CharString: %s",cp); exit(1); }
+ if ( cp[0] == 'R' && cp[1] == 'D' ) strcpy(RD_String,"RD");
+ if ( cp[0] == '-' && cp[1] == '|' ) strcpy(RD_String,"-|");
+ cp += 3 ;
+ Subr[SubrNo].cs = fmalloc( Subr[SubrNo].len + 1 , "Subrs" );
+ memcpy(Subr[SubrNo].cs,cp,Subr[SubrNo].len );
+ Subr[SubrNo].cs[Subr[SubrNo].len] = 0;
+ cp += Subr[SubrNo].len ;
+ while( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ if ( cp[0] == 'N' && cp[1] == 'P' )
+ strcpy(NP_String,"NP");
+ else if ( cp[0] == '|' )
+ strcpy(NP_String,"|");
+ else if ( strncmp(cp,"noaccess put",12) == 0 )
+ strcpy(NP_String,"noaccess put");
+ else if ( strncmp(cp,"readonly put",12) == 0 )
+ strcpy(NP_String,"readonly put");
+ else
+ { fprintf(stderr,"Bad CharString: %s",cp); exit(1); }
+
+ if ( Trace ) fprintf(stderr,"[%d,%d]",SubrNo,Subr[SubrNo].len);
+ Subrs--;
+ }
+ }
+ else if ( CharStrings )
+ {
+ char *cp;
+ if ( line[0] != '/' )
+ {
+ fprintf(stderr,"Unexpected end of CharStrings: '%s'",line);
+ fprintf(stderr,"While %d CharStrings yet not defined\n",Subrs);
+ CharStrings = 0;
+ }
+ else
+ {
+ cp = line;
+ while( *cp && *cp > ' ' ) cp++; /* Skip name */
+ *cp++ = 0;
+ CharString[CharStringCnt].Name = fmalloc(strlen(line)+1,line);
+ strcpy(CharString[CharStringCnt].Name, line );
+ if ( Trace ) fprintf(stderr,"%s",line);
+ while( *cp && *cp <= ' ' ) cp++; /* Skip spaces ... */
+ CharString[CharStringCnt].len = atoi(cp);
+ while( '0' <= *cp && *cp <= '9' ) cp++; /* skip digits */
+ while( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ if ( ! ( ( cp[0] == 'R' && cp[1] == 'D' && cp[2] == ' ' )
+ || ( cp[0] == '-' && cp[1] == '|' && cp[2] == ' ' )
+ )
+ ) { fprintf(stderr,"Bad CharString: %s",cp); exit(1); }
+ if ( cp[0] == 'R' && cp[1] == 'D' ) strcpy(RD_String,"RD");
+ if ( cp[0] == '-' && cp[1] == '|' ) strcpy(RD_String,"-|");
+ cp += 3 ;
+ CharString[CharStringCnt].cs
+ = fmalloc( CharString[CharStringCnt].len , "CharString" );
+ memcpy(CharString[CharStringCnt].cs,cp,
+ CharString[CharStringCnt].len );
+ cp += CharString[CharStringCnt].len ;
+ while( *cp && *cp <= ' ' ) cp++; /* skip spaces */
+ if ( cp[0] == 'N' && cp[1] == 'D' )
+ strcpy(ND_String,"ND");
+ else if ( cp[0] == '|' && cp[1] == '-' )
+ strcpy(ND_String,"|-");
+ else if ( strncmp(cp,"noaccess def",12) == 0 )
+ strcpy(ND_String,"noaccess def");
+ else if ( strncmp(cp,"readonly def",12) == 0 )
+ strcpy(ND_String,"readonly def");
+ else
+ { fprintf(stderr,"Bad CharString: %s",cp); exit(1); }
+ CharStringCnt++;
+ CharStrings--;
+ }
+ }
+ else
+ {
+ char *cp;
+ if ( (cp=strstr(line,"/Subrs ")) != NULL )
+ { /* Start of subrs there ... */
+ if ( SubrsPosition )
+ { /* HYBRID Type1 fonts have two copies of Subrs,
+ for High and low resolution devices.
+ There I will save previously accumulated Subrs ... */
+ HiMaxSubrs = MaxSubrs;
+ HiSubrsPosition = SubrsPosition;
+ HiSubr = Subr;
+ }
+ /* Temporarie, fragments only first copy of Subrs... */
+ cp += strlen("/Subrs ");
+ MaxSubrs = Subrs = atoi(cp);
+ if ( Verbose ) fprintf(stderr,"Declared %d in Subrs\n",Subrs);
+ SubrsPosition = pool_cnt ;
+ Subr = fmalloc( Subrs * sizeof(*Subr) , "Subr array" );
+ }
+ else if ( (cp=strstr(line,"/CharStrings ")) != NULL )
+ { /* Start of CharStrings there ... */
+ if ( ! CharStringsPosition )
+ { /* Only first appearing of /CharStrings indicate real CS */
+ cp += strlen("/CharStrings ");
+ CharStrings = atoi(cp);
+ if ( Verbose )
+ fprintf(stderr,"Declared %d in CharStrings\n",CharStrings);
+ CharStringsPosition = pool_cnt ;
+ CharString = fmalloc( CharStrings * sizeof(*CharString) ,
+ "CharString array" );
+ CharStringCnt = 0;
+ }
+ }
+ else if ( TouchEncoding && (cp=strstr(line,"/Encoding ")) == line )
+ {
+ if ( (cp=strstr(line,"def")) == NULL )
+ {
+ EncodingPosition = pool_cnt;
+ IsEncoding = 1;
+ Begin_Encoding( line );
+ }
+ }
+ output(line);
+ }
+
+ if (strcmp(line, "mark currentfile closefile\n") == 0)
+ break;
+ }
+
+ if ( Verbose )
+ fprintf(stderr,"Loaded %d lines\n",pool_cnt);
+
+ /* Mark ONLY required charstrings ... */
+ /* Clear all use markers */
+ for( i = 0 ; i < MaxSubrs ; i++ ) Subr[i].use = 0;
+ if ( HiSubr != NULL )
+ for( i = 0 ; i < HiMaxSubrs ; i++ ) HiSubr[i].use = 0;
+ for( i = 0 ; i < CharStringCnt ; i++ ) CharString[i].use = 0;
+
+ /* Walk Throught Charstrings and mark all used ones. */
+ for( i = 0 ; i < CharStringCnt ; i++ )
+ {
+ char buf[128];
+ sprintf(buf,"%s/",CharString[i].Name);
+ if ( strcmp(buf,"/.notdef/") == 0 || strstr(NeedChars,buf) != NULL )
+ {
+ CharString[i].use = 1;
+ sp = 0;
+ if ( Trace ) fprintf(stderr,"<%s",buf);
+ ProcessCharString( CharString[i].cs , CharString[i].len );
+ if ( Trace ) fprintf(stderr,">");
+ }
+ }
+
+ /* Simplest variant; replace unused charstrings by shortenest ... */
+ l = 0;
+ for ( i = 0 , k = 0 ; i < MaxSubrs ; i++ )
+ if ( ! Subr[i].use )
+ { Subr[i] = Subr[3]; Subr[i].use = 0; }
+ else
+ { k = i; l++; }
+ MaxSubrs = k+1; /* Forget tail of unused subrs ... */
+ if ( HiSubr != NULL )
+ {
+ for ( i = 0 , k = 0 ; i < HiMaxSubrs ; i++ )
+ if ( ! HiSubr[i].use )
+ { HiSubr[i] = HiSubr[3]; HiSubr[i].use = 0; }
+ else
+ { k = i; l++; }
+ HiMaxSubrs = k+1; /* Forget tail of unused subrs ... */
+ }
+
+ l = MaxSubrs + (HiSubr == NULL ? 0 : HiMaxSubrs) - l;
+ if ( Verbose ) fprintf(stderr,"%d empty array positions\n",l);
+ ArrLosts += l * 8;
+
+ /* Now dumps all my fragments ... */
+ in_eexec = out_eexec = 0;
+ if ( SubrsPosition )
+ {
+ if ( HiSubrsPosition )
+ {
+ Dump_Pool( 0 , HiSubrsPosition) ;
+ if ( HiMaxSubrs > 0 ) /* Can be removed all after filtering ... */
+ { /* Dump Subrs there ... */
+ Fix_String( line , "/Subrs " , HiMaxSubrs , pool[HiSubrsPosition] );
+ eexec_string(line);
+ for( i = 0 ; i < HiMaxSubrs ; i++ )
+ {
+ if ( (!Eexec_Output) && (!HiSubr[i].use) ) continue;
+ sprintf(line,"dup %d",i);
+ eexec_string(line);
+ Dump_CS(HiSubr[i].len,HiSubr[i].cs);
+ sprintf(line,"%s\n",NP_String);
+ eexec_string(line);
+ }
+ Dump_Pool( HiSubrsPosition+1, SubrsPosition ) ;
+ }
+ else
+ Dump_Pool( HiSubrsPosition+2 , SubrsPosition) ;
+ }
+ else
+ Dump_Pool( 0 , SubrsPosition) ;
+ if ( MaxSubrs > 0 ) /* Can be removed all after filtering ... */
+ { /* Dump Subrs there ... */
+ Fix_String( line , "/Subrs " , MaxSubrs , pool[SubrsPosition] );
+ eexec_string(line);
+ for( i = 0 ; i < MaxSubrs ; i++ )
+ {
+ if ( (!Eexec_Output) && (!Subr[i].use) ) continue;
+ sprintf(line,"dup %d", i);
+ eexec_string(line);
+ Dump_CS(Subr[i].len,Subr[i].cs);
+ sprintf(line,"%s\n",NP_String);
+ eexec_string(line);
+ }
+ Dump_Pool( SubrsPosition+1, CharStringsPosition ) ;
+ }
+ else
+ Dump_Pool( SubrsPosition+2, CharStringsPosition ) ;
+ }
+ else
+ Dump_Pool( 0, CharStringsPosition ) ;
+
+ for( i = k = 0 ; i < CharStringCnt ; i++ )
+ if ( CharString[i].use ) k++;
+ Fix_String( line , "/CharStrings " , k , pool[CharStringsPosition] );
+ eexec_string(line);
+ for( i = k = 0 ; i < CharStringCnt ; i++ )
+ if ( CharString[i].use )
+ {
+ eexec_string(CharString[i].Name);
+ Dump_CS(CharString[i].len, CharString[i].cs );
+ sprintf(line,"%s\n",ND_String);
+ eexec_string(line);
+ }
+ Dump_Pool( CharStringsPosition+1 , pool_cnt ) ;
+ if ( out_eexec )
+ eexec_end();
+ else if ( Eexec_Output )
+ fprintf(stderr,"? Strange font format (without eexec...)\n");
+
+ fAllFree();
+ return 0;
+}
+
+Copying_Full_Font(void)
+{
+ int i, cnt;
+
+ lenIV = 4;
+ first_byte = 1;
+ is_pfa = is_pfb = 0;
+ pfb_remaining = 0;
+ p_eexec_scan = 0;
+ reported = 0;
+ in_eexec = out_eexec = 0;
+ hexcol = 0;
+
+ while ( 1 )
+ {
+ cnt = egetline();
+ if ( line[0] == 0 ) break;
+ set_lenIV();
+ for( i = 0 ; i < cnt ; i++ )
+ eexec_byte(line[i]);
+ if (strcmp(line, "mark currentfile closefile\n") == 0) break;
+ if ( in_eexec && (!out_eexec) ) eexec_start();
+ }
+ if ( out_eexec )
+ eexec_end();
+ else
+ fprintf(stderr,"This font is not an ATM compatible, eexec is missed\n");
+ return 0;
+}
+
+FILE *Set_Adequate_Read_Mode( FILE *fp , char *fileName )
+/* 25-Nov-94
+ I can not correctly read text file which was opened as binary in VMS.
+ In this reason, if opened file is not PFB i will reopen it in text mode.
+*/
+{
+# if defined(vms) || defined(MSDOS)
+ if ( fgetc(fp) == MARKER )
+ ungetc(MARKER,fp);
+ else
+ {
+ fclose(fp);
+ if ( (fp=fopen(fileName,"r")) == NULL )
+ {
+ fprintf(stderr,"Ops, can't reopen file %s\n",fileName);
+ exit(1);
+ }
+ }
+# endif
+ return fp;
+}
+
+Scan_FontName( char *fileName , FILE *fp )
+{
+ int cnt;
+
+ lenIV = 4;
+ first_byte = 1;
+ is_pfa = is_pfb = 0;
+ pfb_remaining = 0;
+ p_eexec_scan = 0;
+ reported = 0;
+ in_eexec = out_eexec = 0;
+ hexcol = 0;
+
+ if ( (ifp=fopen(fileName,RB)) == NULL )
+ {
+ fprintf(stderr,"? Can't found file %s\n",fileName);
+ return 0;
+ }
+ ifp = Set_Adequate_Read_Mode( ifp , fileName );
+ while ( 1 )
+ {
+ cnt = egetline();
+ if ( line[0] == 0 ) break;
+ set_lenIV();
+ if( strncmp(line,"/FontName",9) == 0 )
+ {
+ char *cp,*ep;
+ for( cp = line + 9 ; *cp && *cp <= ' ' ; cp++ );
+ for( ep = cp ; *ep && *ep > ' ' ; ep++ ); *ep = '\0';
+ fprintf(fp,"%s (%s) ;\n",cp,fileName);
+ fclose(ifp);
+ return 1;
+ }
+ }
+ fclose(ifp);
+ return 0;
+}
+
+struct FontMap {
+ struct FontMap *next;
+ char *fontName;
+ char *fileName;
+ } *fmp, *fontMap = NULL;
+
+int main(int ac, char **av)
+{
+ int ap;
+ char *cp;
+ char *Need_Chars = NULL;
+ char *FontSearchPath = DEFAULTFONTPATH ;
+ FILE *fp;
+ char buf[4096];
+
+ ifp = stdin;
+ ofp = stdout;
+
+ init_Encoding();
+
+ for( ap = 1 ; ap < ac ; ap++ )
+ if ( av[ap][0] == '-' && av[ap][1] != 0 )
+ switch( av[ap][1] )
+ {
+ case 'v': case 'V': /* Like trace verbose */
+ Verbose = 1;
+ break;
+ case 't': case 'T': /* Trace font processing */
+ Trace = 1;
+ break;
+ case 'e': case 'E': /* Encoding optimization falg */
+ TouchEncoding = atoi(av[ap]+2);
+ break;
+ case 'x': case 'X': /* output eexec using flag */
+ Eexec_Output = atoi(av[ap]+2);
+ break;
+ case 'o': case 'O': /* ... Open output file there */
+ cp = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ if ( (ofp=fopen(cp,"w")) == NULL )
+ { fprintf(stderr,"? Can't create file: '%s'\n",cp); return 1; }
+ break;
+ case 'a': case 'A': /* ... Open output file for append */
+ cp = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ if ( (ofp=fopen(cp,"a")) == NULL )
+ { fprintf(stderr,"? Can't open for append file: '%s'\n",cp); return 1; }
+ break;
+ case 'b': case 'B': /* Open binary file for output */
+ cp = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ if ( (ofp=fopen(cp,WB)) == NULL )
+ { fprintf(stderr,"? Can't create file: '%s'\n",cp); return 1; }
+ pfb = 1;
+ break;
+ case 'c': case 'C': /* Copy specified file to output as is */
+ /* Generally, this code solves problems of the file merging
+ of different record type in VMS operating system.
+ */
+ cp = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ if ( cp[0] == '-' && cp[1] == 0 )
+ ifp = stdin ;
+ else if ( (ifp=fopen(cp,"r")) == NULL )
+ { fprintf(stderr,"? Can't found file: '%s'\n",cp); return 1; }
+ while ( fgets(buf,sizeof(buf),ifp) != NULL )
+ fputs(buf,ofp);
+ if ( ifp != stdin ) fclose(ifp);
+ Files++;
+ break;
+ case 'u': case 'U': /* Open binary file for output */
+ uFileName = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ break;
+ case 'n': case 'N': /* Load required names ... */
+ Need_Chars = av[ap] + 2 ;
+ break;
+ case 'i': case 'I': /* Install font search path */
+ FontSearchPath = av[ap]+2;
+ break;
+ case 'm': case 'M': /* font mapping file */
+ cp = av[ap][2] ? av[ap]+2 : av[++ap] ;
+ if ( (fp=fopen(cp,"r")) == NULL )
+ {fprintf(stderr,"? SubFont: Can't found file '%s'\n",cp); return 1;}
+ while ( fgets(buf,sizeof(buf),fp) != NULL )
+ {
+ char *fontp,*ecp;
+ for( cp = buf; *cp && *cp <= ' ' ; cp++ ); /* skip spaces */
+ if ( *cp == 0 || *cp == '%' ) continue; /* Comment or empty line */
+ if ( *cp == '/' )
+ { /* Process GhostScript like font map */
+ fontp = ++cp;
+ while ( *cp && *cp > ' ' ) cp++; /* search end of font name */
+ *cp++ = 0;
+ while ( *cp && *cp <= ' ' ) cp++;
+ if ( *cp == '(' )
+ { /* Format like to: '/FontName (file-name) ; */
+ for( ecp = ++cp; *ecp && *ecp > ' ' && *ecp != ')'; ecp++);
+ *ecp = 0;
+ }
+ else
+ { /* Format like to: '/Fontmap file-name' */
+ for( ecp=cp ; *ecp && *ecp > ' ' ; ecp++);
+ *ecp = 0;
+ }
+ }
+ else
+ { /* Process simple format Fontmap */
+ fontp = cp;
+ while ( *cp && *cp > ' ' ) cp++; /* search end of font name */
+ *cp++ = 0;
+ while ( *cp && *cp <= ' ' ) cp++;
+ for( ecp=cp ; *ecp && *ecp > ' ' ; ecp++); *ecp = 0;
+ }
+ /* Add entry to font mapping list */
+ fmp = xmalloc(sizeof(struct FontMap));
+ fmp->next = fontMap;
+ fmp->fontName = xstrdup(fontp);
+ fmp->fileName = xstrdup(cp);
+ fontMap = fmp;
+ }
+ fclose(fp);
+ break;
+ case 'f': case 'F': /* Load all fonts according psfontstat list */
+ if ( pfb )
+ {
+ fprintf(stderr,
+ "Processing several fonts into one PFB not available.\n");
+ return 1;
+ }
+ else
+ {
+ cp = av[ap][2] ? av[ap]+2 : (ap+1<ac?av[++ap]:"-") ;
+ if ( cp[0] == '-' && cp[1] == '\0' )
+ fp = stdin;
+ else if ( (fp=fopen(cp,"r")) == NULL )
+ { fprintf(stderr,"No file '%s'\n",cp); return 1; }
+ Files += 10000 ;
+ while ( fgets( buf, sizeof(buf), fp ) != NULL )
+ {
+ char *cp, *ep, fntName[64],fontName[64],fileName[256];
+ /* extract font name */
+ if ( (cp=strchr(buf,'/')) == NULL || cp == buf )
+ { fprintf(stderr,"Invalid: '%s'\n",buf); return 1; }
+ memcpy(fontName,buf,(int)(cp-buf)); fontName[cp-buf] = '\0';
+ strcpy(fntName,fontName);
+ /* Search alias in map ... */
+ for( fmp = fontMap ; fmp != NULL ; fmp=fmp->next)
+ if ( strcmp(fmp->fontName,fontName) == 0 )
+ {
+ /* fprintf(stderr,"Font '%s' looks in file '%s'\n",
+ fmp->fontName,fmp->fileName); */
+ strcpy(fontName,fmp->fileName);
+ break;
+ }
+ /* install list of required characters */
+ Need_Chars = cp;
+ /* Search font file */
+ for( ifp = NULL, cp = FontSearchPath ; *cp > ' ' ; cp = ep )
+ {
+ int j;
+ if( (ep=strchr(cp,PATH_DELIMITER)) == NULL )
+ ep = cp + strlen(cp);
+ j = (int)(ep - cp); if ( *ep == PATH_DELIMITER ) ep++;
+ memcpy(fileName,cp,j);
+ if ( FILE_DELIMITER != '\0' )
+ if ( j && fileName[j-1] != FILE_DELIMITER )
+ fileName[j++] = FILE_DELIMITER;
+ strcpy(fileName+j,fontName); j = strlen(fileName);
+ if ( Verbose ) fprintf(stderr,"Try open '%s'\n",fileName);
+ if ( (ifp=fopen(fileName,RB)) != NULL ) break;
+ if ( strcmp(fntName,fontName) == 0 )
+ {
+ strcpy(fileName+j,".pfb");
+ if ( Verbose ) fprintf(stderr,"Try open '%s'\n",fileName);
+ if ( (ifp=fopen(fileName,RB)) != NULL ) break;
+ strcpy(fileName+j,".pfa");
+ if ( Verbose ) fprintf(stderr,"Try open '%s'\n",fileName);
+ if ( (ifp=fopen(fileName,RB)) != NULL ) break;
+ }
+ }
+ if ( ifp == NULL )
+ {
+ fprintf(stderr,"Can't found font '%s' in path '%s'\n",
+ fontName,FontSearchPath);
+ if ( ufp == NULL && uFileName != NULL )
+ {
+ if ( (ufp=fopen(uFileName,"w")) == NULL )
+ { fprintf(stderr,"? Can't create file: '%s'\n",uFileName); }
+ }
+ if ( ufp != NULL )
+ fprintf(ufp,"%s\n",fontName);
+ continue;
+ }
+ else
+ fprintf(stderr,"Process font '%s' from file '%s'\n",
+ fntName,fileName);
+ /*fprintf(ofp,"(Loading font %s\\n) print flush\n",fontName);*/
+ TouchEncoding++;
+ Eexec_Output--;
+ ifp = Set_Adequate_Read_Mode( ifp , fileName );
+ Process_Font( Need_Chars );
+ Eexec_Output++;
+ TouchEncoding--;
+ if ( ifp != stdin ) fclose(ifp);
+ Files++;
+ }
+ }
+ break;
+ case 'z': case 'Z': /* This command is used to make font map */
+ if ( av[ap][2] == '\0' )
+ ofp = stdout;
+ else if ( (ofp=fopen(av[ap]+2,"a")) == NULL )
+ {
+ fprintf(stderr,"? SubFont: Can't write file '%s'\n",av[ap]+2);
+ return 1;
+ }
+ for( ap++ ; ap < ac ; ap++ )
+ Scan_FontName( av[ap] , ofp );
+ return 0;
+ default:
+ fprintf(stderr,"? SubFont: Unknown option '%s'\n",av[ap]);
+ return 1;
+ }
+ else
+ {
+ if ( pfb && Files )
+ {
+ fprintf(stderr,
+ "Processing several fonts into one PFB not available.\n");
+ return 1;
+ }
+# ifndef vms
+ if ( av[ap][0] == '-' && av[ap][1] == 0 )
+ ifp = stdin ;
+ else
+# endif
+ if ( (ifp=fopen(av[ap],RB)) == NULL )
+ { fprintf(stderr,"? Can't found file: '%s'\n",av[ap]); return 1; }
+ ifp = Set_Adequate_Read_Mode( ifp , av[ap] );
+ if ( Need_Chars == NULL )
+ { if ( Copying_Full_Font() ) exit(1); }
+ else
+ Process_Font( Need_Chars );
+ if ( ifp != stdin ) fclose(ifp);
+ Files++;
+ }
+
+ if ( ! Files )
+ {
+ fprintf(stderr,"%s designed by %s\n",PROBLEM,AUTHOR);
+ fprintf(stderr,"Shortly called %s, Version %s/%s, Revision Date %s\n",
+ PROGRAM, VERSION, SYSID, REVDATE);
+ fprintf(stderr,"Copyright (C) %s All Rights Reserved.\n\n",COPYRIGHT);
+ fprintf(stderr,"Usage: SubFont [options] { -n... | <in-file> } \n");
+ fprintf(stderr," Options are:\n");
+ fprintf(stderr," -v - Verbose ...\n");
+ fprintf(stderr," -o<file> - Output file (Default is stdout)\n");
+ fprintf(stderr," -a<file> - Output file in append(text) mode\n");
+ fprintf(stderr," -b<file> - Output binary file (PFB)\n");
+ fprintf(stderr," -c<file> - Copying specified file to output as is\n");
+ fprintf(stderr," -n/../../ - List of names of required characters ...\n");
+ fprintf(stderr," <file> - Process font from file...\n");
+# ifndef vms
+ fprintf(stderr," - - Process font from stdin...\n");
+# endif
+ fprintf(stderr," -f<file> - Process font list from file.\n");
+ fprintf(stderr," -m<file> - Font mapping file (used with -f)\n");
+ fprintf(stderr," -I<path> - Font search path (used with -f)\n");
+ fprintf(stderr," Default='%s'\n",FontSearchPath);
+ fprintf(stderr," -u<file> - File for put list of undefined fonts (used with -f)\n");
+ fprintf(stderr," -e# - Encoding optimization flag...\n");
+ fprintf(stderr," -x# - output eexec using flag...\n");
+ fprintf(stderr," -z - read files and print it PS name...\n");
+ return 1;
+ }
+ else
+ {
+ fprintf(stderr,"Totaly %d files are processed.\n",Files % 10000 );
+ if ( Verbose )
+ fprintf(stderr,"Totally %d unused bytes in Subr arrays\n",ArrLosts);
+ }
+ if ( ofp != stdout ) fclose(ofp);
+ if ( ufp != NULL ) fclose(ufp);
+ return 0;
+}
+
diff --git a/fonts/utilities/fontload/unix/INSTALL b/fonts/utilities/fontload/unix/INSTALL
new file mode 100644
index 0000000000..bbc444d6bd
--- /dev/null
+++ b/fonts/utilities/fontload/unix/INSTALL
@@ -0,0 +1,120 @@
+#!/bin/csh
+# Install
+# This C-shell will help to install fload tool,
+# which realizes Partial Downloading of the ATM compatible Type 1 fonts
+# for some PostScript file.
+###############################################################################
+if ( ! -e INSTALL ) then
+ echo Installation available only from directory with install script.
+ exit
+endif
+if ( -e install.dirs ) then
+ source install.dirs
+else
+ # Directory to put system dependent executable files (subfont program)
+ setenv FBIN /usr/local/bin
+ # Directory to put system independent scripts (fload C-shell script)
+ setenv FSHR /usr/local/bin
+ # Directory for library files (Fontmap, psfstat.ps, SubFont.map, *.FS)
+ setenv FLIB /usr/local/lib/fload
+ # Also Check that all your fonta are in list directory tries
+ setenv FPATH /usr/local/lib/texmf/fonts
+endif
+##############################################################################
+echo Check environment ...
+set gsbin=`which gs`
+if ( ! -e "$gsbin" ) then
+ echo Can not found GhostScript program in path $path
+ exit
+endif
+
+echo Making subfont program first ...
+pushd ../src
+make
+popd
+if ( ! -e ../src/subfont ) then
+ echo Make failed.
+ exit 1
+endif
+echo Copying SubFont program to $FBIN/subfont
+cp ../src/subfont $FBIN/subfont
+if ( ! -e $FBIN/subfont ) then
+ echo Can not copying SubFont program to $FBIN directory.
+ exit
+endif
+chmod +x $FBIN/subfont
+
+############## Copying man pages if FMAN environment is on ###################
+if ( $?FMAN ) then
+ echo Copying man pages subfont.1 and fload.1 into $FMAN directory ...
+ cp ../doc/fload.1 $FMAN
+ cp ../doc/subfont.1 $FMAN
+endif
+
+############## Making fload C-shell script ###################################
+
+set out=$FSHR/fload
+echo Create $out C-shell script.
+echo "#\!/bin/csh" >$out
+if ( ! -e $FSHR/fload ) then
+ echo Can not write fload C-shell script into $FSHR directory.
+ exit
+endif
+echo "# Copyright (C) 1994, Basil K. Malyshev. All rights reserved." >>$out
+echo "# WARNING this script was created automatically." >>$out
+echo "set lib=$FLIB" >>$out
+echo "setenv FONTPATH $FPATH" >>$out
+cat <fload.csh >>$out
+chmod +x $out
+
+############## Create files in library directory #############################
+
+if ( ! -e $FLIB ) then
+ mkdir -p $FLIB
+else
+ if ( -e $FLIB/Fontmap ) then
+ rm -f $FLIB/Fontmap
+ endif
+endif
+echo Copying psfstat.ps PostScript script to $FLIB/psfstat.ps
+cp ../lib/psfstat.ps $FLIB/psfstat.ps
+if ( ! -e $FLIB/psfstat.ps ) then
+ echo Can not copying psfstat.ps PostScript script to $FLIB directory.
+ exit
+endif
+echo "Copying files ../lib/*.FS to $FLIB directory."
+cp ../lib/*.FS $FLIB
+
+#### Create standard head of the Fontmap file for GhostScript.
+### $gsbin -DNODISPLAY -sOUT=$FLIB/Fontmap ../lib/Fontmap.get
+### echo "(Fontmap.t1) run" >>$FLIB/Fontmap
+
+#### Scan all font directories and add records to Fontmap & SubFont.map ####
+# Split FPATH variable into elements
+set pathSave=($path)
+setenv PATH $FPATH
+set fpath=($path)
+set path=($pathSave)
+# Now go throght all font directories
+setenv SUBFONT $FBIN/subfont
+echo >$FLIB/Fontmap.t1
+foreach root ($fpath)
+ echo "Scanning $root directory..."
+ echo "%% This part was constructed from $root directory" >>$FLIB/Fontmap.t1
+ pushd root
+ find . -name "*.pf[ab]" -exec $SUBFONT -z$FLIB/Fontmap.t1 {} \;
+ popd
+end
+
+### # And creates map for SubFont program
+### $gsbin -DNODISPLAY -sINFILE=$FLIB/Fontmap.t1 -sOUTFILE=$FLIB/SubFont.map \
+### ../lib/cvtmap.ps quit.ps
+
+echo "=================================================="
+echo "== Installation have been completed. =="
+echo "== Now you can use command: =="
+echo "== fload PS-without-fonts >PS-with-fonts =="
+echo "== to preload fonts partially into your PS-file =="
+echo "=================================================="
+
+#### End of installation script ####
diff --git a/fonts/utilities/fontload/unix/UpdateMap.csh b/fonts/utilities/fontload/unix/UpdateMap.csh
new file mode 100644
index 0000000000..6e9adfd611
--- /dev/null
+++ b/fonts/utilities/fontload/unix/UpdateMap.csh
@@ -0,0 +1,35 @@
+#!/bin/csh
+# Copyright (C) 1994, Basil K. Malyshev. All rights reserved.
+# WARNING this script was created automatically.
+set lib=/usr/local/lib/fload
+setenv FONTPATH /usr/local/lib/texmf/fonts:/usr/local/lib/ISOFonts/pfa
+#!
+#! File: UpdateMap.csh
+#! This C shell script updates font map which is used by FLoad script.
+#!
+#! Copyright (C) 1994, Basil K. Malyshev. All rights reserved.
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+setenv SUBFONT "`which subfont`"
+if ( ! -e "$SUBFONT" ) then
+ echo Can not found SubFont program in path $path
+ exit
+endif
+
+#### Scan all font directories and add records to Fontmap.t1
+# Split FPATH variable into elements
+set pathSave=($path)
+setenv PATH $FONTPATH
+set fpath=($path)
+set path=($pathSave)
+# Now go throght all font directories
+echo >$lib/Fontmap.t1
+foreach root ($fpath)
+ echo "Scanning $root directory..."
+ echo "%% This part was constructed from $root directory" >>$lib/Fontmap.t1
+ pushd root
+ find . -name "*.pf[ab]" -exec $SUBFONT -z$lib/Fontmap.t1 {} \;
+ popd
+end
+###
+
diff --git a/fonts/utilities/fontload/unix/fload.csh b/fonts/utilities/fontload/unix/fload.csh
new file mode 100644
index 0000000000..92f670ef84
--- /dev/null
+++ b/fonts/utilities/fontload/unix/fload.csh
@@ -0,0 +1,140 @@
+#!
+#! File: FLoad.csh
+#! This C shell script implements partial downloading
+#! of the ATM compatible PostScript Type 1 fonts which
+#! is used in specified PostScript file.
+#! This procedure is done via GhostScript & SubFont programs.
+#!
+#! Copyright (C) 1994, Basil K. Malyshev. All rights reserved.
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+set FontMap=$lib/Fontmap.t1
+
+# User can place in HOME directory file '.fload'
+# which can contains redefinition of the FONTPATH, like
+# setenv FONTPATH $FONTPATH:$HOME/psfonts
+# and FontMap, like:
+# set FontMap=$HOME/Fontmap.t1
+# Also, user can redefine `lib` variable,
+# but in this case, also redefinion of the 'FontMap` variable is required.
+#
+if ( -e ~/.fload ) then
+ source ~/.fload
+endif
+
+# Check of the existance GhostScript (gs) and SubFont (subfont) programs.
+if ( ! -e "`which gs`" ) then
+ echo "? FLoad: I can not work without GhostScript." | /bin/sh -c "cat 1>&2"
+ exit
+endif
+if ( ! -e "`which subfont`" ) then
+ echo "? FLoad: I can not work without subfont program." | /bin/sh -c "cat 1>&2"
+ exit
+endif
+
+# Update map if specified option '-updatemap'
+if ( "$1" == "-updatemap" ) then
+ # Split FONTPATH variable into elements
+ set pathSave=($path)
+ setenv PATH $FONTPATH
+ set fpath=($path)
+ set path=($pathSave)
+ # Now go throght all font directories
+ echo >$FontMap
+ foreach root ($fpath)
+ echo "Scanning $root directory..."
+ echo "%% This part was constructed from $root directory" >>$FontMap
+ pushd root
+ find . -name "*.pf[ab]" -exec subfont -z$FontMap {} \;
+ popd
+ end
+ exit
+endif
+
+# Which font set is in printer
+if ( "$1" == "-p" || "$1" == "-P" ) then
+ if ( "$2" == "" ) then
+ echo "List of available font sets:" | /bin/sh -c "cat 1>&2"
+ cd $lib
+ ls *.FS | sed -e s/.FS// | /bin/sh -c "cat 1>&2"
+ exit
+ endif
+ set fontSet="$2"
+ shift
+ shift
+else
+ set fontSet="Standard"
+endif
+
+if ( ! -e $lib/$fontSet.FS ) then
+ echo "? $fontSet font set is not known." | /bin/sh -c "cat 1>&2"
+ exit
+endif
+
+set fn=$1
+set out=$2
+
+if ( "$out" == "" ) then
+ set base=$fn:r
+else
+ set base=$out:r
+ if ( "$out" == "$out:r" ) then
+ set out=$out.ps
+ endif
+endif
+
+# If input file name is not presented show usage and list of built in fonts.
+if ( "$fn" == "" ) then
+ echo "Usage: (of the fload de Basil)" | /bin/sh -c "cat 1>&2"
+ echo "fload [-p fontSet] <ps-file> [<output-ps-file>]" | /bin/sh -c "cat 1>&2"
+ echo " where following fontSets is available" | /bin/sh -c "cat 1>&2"
+ cd $lib
+ ls *.FS | sed -e s/.FS// | /bin/sh -c "cat 1>&2"
+ exit
+endif
+if ( ! -e $fn ) then
+ echo "? FLoad: I can not found file $fn." | /bin/sh -c "cat 1>&2"
+ exit
+endif
+
+# Interpret file via Ghostscript to determine required fonts and characters.
+set fstat=$base.fstat
+echo "Process PS file $fn." | /bin/sh -c "cat 1>&2"
+echo "Write font using statistic to $fstat" | /bin/sh -c "cat 1>&2"
+if ( -e $fstat ) then
+ /bin/rm -f $fstat
+endif
+gs -I${lib}:$FONTPATH -DNODISPLAY -DWRITESYSTEMDICT \
+ -sOUTFILE=$fstat -sINFILE=$fn \
+ -sRESIDENTFONTS=$fontSet.FS psfstat.ps quit.ps >&$base.flog
+if ( -e $fstat ) then
+ /bin/rm $base.flog
+else
+ echo "There is some errors in scanning PS file." | /bin/sh -c "cat 1>&2"
+ echo "Look GhostScript log file $base.flog for more information" | /bin/sh -c "cat 1>&2"
+ echo "Most frequently error is that some font is not anywhere." | /bin/sh -c "cat 1>&2"
+ exit
+endif
+
+# Began file from conventional metacomment to fit with spooler.
+if ( "$out" == "" ) then
+ echo "%\!PS-Adobe-3.0"
+else
+ echo "Write output into file $out" | /bin/sh -c "cat 1>&2"
+ echo "%\!PS-Adobe-3.0" >$out
+endif
+
+# Make partial downloading of these fonts which is available
+if ( -e $base.undef ) then
+ /bin/rm -f $base.undef
+endif
+if ( "$out" == "" ) then
+ subfont -I$FONTPATH -u$base.undef -m$FontMap -f$fstat -c$fn
+else
+ subfont -I$FONTPATH -u$base.undef -m$FontMap -f$fstat -c$fn >>$out
+endif
+if ( -e $base.undef ) then
+ echo "There is unknown font(s)" | /bin/sh -c "cat 1>&2"
+ cat $base.undef | /bin/sh -c "cat 1>&2"
+endif
+###
diff --git a/fonts/utilities/fontload/unix/home.dirs b/fonts/utilities/fontload/unix/home.dirs
new file mode 100644
index 0000000000..96c64d7cb4
--- /dev/null
+++ b/fonts/utilities/fontload/unix/home.dirs
@@ -0,0 +1,15 @@
+# CHECK THIS DIRECTORIES FIRST !!
+
+# Directory to put system dependent executable files (subfont program)
+setenv FBIN ~/bin
+
+# Directory to put system independent scripts (fload C-shell script)
+setenv FSHR ~/bin
+
+# Directory for library files (psfstat.ps, Fontmap, SubFont.map, mprint.*)
+setenv FLIB ~/lib/fload
+
+# Also Check that all your fonta are in list of directory tries
+setenv FPATH /usr/local/lib/texmf/fonts:/usr/local/lib/ISOFonts/pfa
+
+###
diff --git a/fonts/utilities/fontload/unix/install.dirs b/fonts/utilities/fontload/unix/install.dirs
new file mode 100644
index 0000000000..f3494986c4
--- /dev/null
+++ b/fonts/utilities/fontload/unix/install.dirs
@@ -0,0 +1,18 @@
+# CHECK THIS DIRECTORIES FIRST !!
+
+# Directory to put system dependent executable files (subfont program)
+setenv FBIN /usr/local/bin
+
+# Directory to put system independent scripts (fload C-shell script)
+setenv FSHR /usr/local/bin
+
+# Directory for library files (psfstat.ps, Fontmap, SubFont.map, mprint.*)
+setenv FLIB /usr/local/lib/fload
+
+# Directory for man pages (this directory may be omitted)
+setenv FMAN /usr/local/man/man1
+
+# Also Check that all your fonts are in list of directory tries
+setenv FPATH /usr/local/lib/texmf/fonts:/usr/local/lib/ISOFonts/pfa
+
+###
diff --git a/fonts/utilities/fontload/unix/install.txt b/fonts/utilities/fontload/unix/install.txt
new file mode 100644
index 0000000000..edc5fc0a9c
--- /dev/null
+++ b/fonts/utilities/fontload/unix/install.txt
@@ -0,0 +1,5 @@
+==== INSTALLATION on UNIX ====
+
+1. Correct directories specified in the 'install.dirs' file.
+2. Run installation script by command: 'csh INSTALL'.
+
diff --git a/fonts/utilities/fontload/unix/mkmap b/fonts/utilities/fontload/unix/mkmap
new file mode 100644
index 0000000000..b012e4e346
--- /dev/null
+++ b/fonts/utilities/fontload/unix/mkmap
@@ -0,0 +1,34 @@
+#!/bin/csh
+#
+# This script is used to create map of the files available in
+# specified tree ...
+#
+if ( "$1" != "-focus" ) then
+ # Temorarie, but normally this program is in path...
+ setenv SUBFONT `pwd`/subfont
+
+ set root=$1
+ if ( "$1" == "" ) then
+ set root="/usr/local/lib/texmf/fonts"
+ endif
+ set CWD=`pwd`
+ if ( -e $CWD/mkmap ) then
+ set itself=$CWD/mkmap
+ else
+ echo Can not found itself when try search in cuurent directory.
+ exit
+ endif
+ echo >SubFont.map
+ echo >Fontmap.t1
+ cd root
+ find . -name "*.pf[ab]" -exec $itself -focus {} $CWD/Fontmap.t1 $CWD/SubFont.map \;
+else
+ set fn=$2
+ set gsmap=$3
+ set sfmap=$4
+ set font=`$SUBFONT $fn | grep /FontName | cut -d/ -f3 | cut '-d ' -f1`
+ echo font /$font/ in file /$fn/
+ echo "$font $fn" >>$sfmap
+ echo "/$font ($fn) ;" >>$gsmap
+endif
+####
diff --git a/fonts/utilities/fontload/unix/ppd2fs b/fonts/utilities/fontload/unix/ppd2fs
new file mode 100644
index 0000000000..ff48ce8ff3
--- /dev/null
+++ b/fonts/utilities/fontload/unix/ppd2fs
@@ -0,0 +1,13 @@
+#!/bin/csh
+# File: ppd2fs
+# This simple C-Shell script extracts font set declared in PPD file.
+# PPD (PostScript(R) Printer Description) file for particular printer
+# anyone can extract
+# from the '/pub/adobe/PPD/win' directory of the 'ftp.adobe.com' host.
+# So, PPD-file for the 'HP LaserJet IIIP PostScript Plus' is hplj_3p1.ppd.
+# This printer contains 35 builtin fonts. List of fonts can be extracted
+# by command:
+# ppd2fs hplj_3p1.ppd >hplj_3p1.FontSet
+#
+grep "^\*Font" $1 | cut "-d " -f2 | cut -d: -f1
+###
diff --git a/fonts/utilities/fontload/unix/usr-local.dirs b/fonts/utilities/fontload/unix/usr-local.dirs
new file mode 100644
index 0000000000..d37c3f4f05
--- /dev/null
+++ b/fonts/utilities/fontload/unix/usr-local.dirs
@@ -0,0 +1,15 @@
+# CHECK THIS DIRECTORIES FIRST !!
+
+# Directory to put system dependent executable files (subfont program)
+setenv FBIN /usr/local/bin
+
+# Directory to put system independent scripts (fload C-shell script)
+setenv FSHR /usr/local/bin
+
+# Directory for library files (psfstat.ps, Fontmap, SubFont.map, mprint.*)
+setenv FLIB /usr/local/lib/fload
+
+# Also Check that all your fonta are in list of directory tries
+setenv FPATH /usr/local/lib/texmf/fonts:/usr/local/lib/ISOFonts/pfa
+
+###
diff --git a/fonts/utilities/fontload/vms/fload.com b/fonts/utilities/fontload/vms/fload.com
new file mode 100644
index 0000000000..6b78690d97
--- /dev/null
+++ b/fonts/utilities/fontload/vms/fload.com
@@ -0,0 +1,122 @@
+$!
+$! File: FLoad.com
+$! This VMS command file implements partial downloading
+$! of the ATM compatible PostScript Type 1 fonts which
+$! is used in specified PostScript file.
+$! This procedure is done via GhostScript & SubFont programs.
+$!
+$! Copyright (C) 1994, Basil K. Malyshev. All rights reserved.
+$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+$! Customize this variables...
+$ gs="$usr_local:[exe]gs.exe"
+$ define/nolog gs_path usr_local:[lib.gs]
+$ define/nolog font_path disk$et:[tex.newtex.xps],disk$et:[tex.newtex.ps]
+$! SubFont must be defined erlier ...
+$! subfont=="$disk$et:[texmgr.bkm.fload.src]subfont.exe"
+$! Which font set is in printer
+$ fontSet="Standard"
+$!
+$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+$ cf = F$ENV("PROCEDURE")
+$ root=f$parse(cf,,,"DEVICE") + f$parse(cf,,,"DIRECTORY")
+$ define/nolog fload_lib 'root'
+$ define/nolog fload_path fload_lib,font_path,gs_path
+$!
+$ echo="write sys$output"
+$!
+$! Recompute map on switch '-updatemap'
+$ if ( P1 .eqs. "-updatemap" .or. P1 .eqs. "-UPDATEMAP" )
+$ then
+$ open/write lun fontmap.t1
+$ write lun " "
+$ close lun
+$ list_loop:
+$ tmp = f$sear("font_path:*.*")
+$ if tmp .eqs. "" then goto list_end
+$ type = f$par(tmp,,,"TYPE")
+$ if ( type .eqs. ".PFB" .or. type .eqs. ".PFA" )
+$ then
+$ fname=f$par(tmp,,,"NAME") + type
+$ write sys$output "Process " + tmp
+$ subfont -zFontmap.t1 font_path:'fname'
+$ endif
+$ goto list_loop
+$ list_end:
+$ exit
+$ endif
+$!
+$! Check all required arguments is in command line
+$ if ( P1 .eqs. "-P" )
+$ then
+$ if ( P2 .eqs. "" )
+$ then
+$ echo "There are following font sets:"
+$ direct_dcl fload_lib:*.FS
+$ exit
+$ endif
+$ fontSet=P2
+$ ifn=P3
+$ out=P4
+$ else
+$ ifn=P1
+$ out=P2
+$ endif
+$ if ( f$sear("fload_lib:"+fontSet+".FS") .eqs. "" )
+$ then
+$ echo "? "+fontSet+" font set is not known."
+$ exit
+$ endif
+$! If input file name is not presented show usage and list of built in fonts.
+$ if "''ifn'" .eqs. "" .or. "''out'" .eqs. ""
+$ then
+ $ echo "Usage: (of the fload de Basil/VMS version)"
+ $ echo "fload [-p <fontset>] <input-ps-file> <output-ps-file>"
+ $ exit
+$ endif
+$! Check file existance, and make full file name
+$ fn = f$search(ifn)
+$ if fn .eqs. ""
+$ then
+ $ echo "? FLoad: Can not found file "+ifn
+ $ exit
+$ endif
+
+$! Interpret file via Ghostscript to determine required fonts and characters.
+$!fbase=f$parse(fn,,,"DEVICE")+f$parse(fn,,,"DIRECTORY")+f$parse(fn,,,"NAME")
+$ fbase=f$parse(out,,,"DEVICE")+f$parse(out,,,"DIRECTORY")+f$parse(out,,,"NAME")
+$ out=fbase+f$parse(out,,,"TYPE")
+$ if out .eqs. fbase+"." then $ out=fbase+".ps"
+$ fstat=fbase+".fstat"
+$ echo "Process PS file "+fn+"."
+$ echo "Write font using statistic to "+fstat
+$ if f$search(fstat) .nes. "" then $ delete_command/nolog 'fstat';*
+$ define/user gs_lib fload_path:
+$ define/user sys$output 'fbase'.flog
+$ gs "-DNODISPLAY" "-DWRITESYSTEMDICT" "-sOUTFILE=''fstat'" -
+ "-sRESIDENTFONTS=''fontSet'.FS" "-sINFILE=''fn'" psfstat.ps
+$ if f$search(fstat) .eqs. ""
+$ then
+ $ echo "? FLOAD EROOR: There is some errors in scanning PS file."
+ $ echo "! Look GhostScript log file "+fbase+".flog for more information"
+ $ echo "! Most frequently error is that some font is not anywhere."
+ $ exit
+$ else
+$ delete_dcl/nolog 'fbase'.flog;
+$ delete_dcl/nolog 'fstat';-1
+$ endif
+
+$ echo "Writing main output PS file: "+out
+$ open/write outfd 'out'
+$ write outfd "%!PS-Adobe-3.0"
+$ close outfd
+$! Make partial downloading of these fonts which is available
+$ if f$search(fbase+".undef") .nes. "" then $ delete_cmd/nolog 'fbase'.undef;*
+$ subfont -I,FONT_PATH: -u'fbase'.undef -mFLOAD_LIB:Fontmap.t1 -a'out' -f'fstat' -c 'fn'
+$ if f$search(fbase+".undef") .nes. ""
+$ then
+ $ echo "There is fonts which is not found by SubFont program."
+ $ echo "That is fonts:"
+ $ type_dcl 'fbase'.undef
+ $ echo "This list is also saved in file "+fbase+".undef"
+$ endif
+$ exit
diff --git a/fonts/utilities/fontload/vms/fontmap.t1 b/fonts/utilities/fontload/vms/fontmap.t1
new file mode 100644
index 0000000000..1c7ac09727
--- /dev/null
+++ b/fonts/utilities/fontload/vms/fontmap.t1
@@ -0,0 +1,254 @@
+
+/cmb10 (font_path:cmb10.pfb) ;
+/cmbsy10 (font_path:cmbsy10.pfb) ;
+/cmbsy6 (font_path:cmbsy6.pfb) ;
+/cmbsy7 (font_path:cmbsy7.pfb) ;
+/cmbsy8 (font_path:cmbsy8.pfb) ;
+/cmbsy9 (font_path:cmbsy9.pfb) ;
+/cmbx10 (font_path:cmbx10.pfb) ;
+/cmbx12 (font_path:cmbx12.pfb) ;
+/cmbx5 (font_path:cmbx5.pfb) ;
+/cmbx6 (font_path:cmbx6.pfb) ;
+/cmbx7 (font_path:cmbx7.pfb) ;
+/cmbx8 (font_path:cmbx8.pfb) ;
+/cmbx9 (font_path:cmbx9.pfb) ;
+/cmbxsl10 (font_path:cmbxsl10.pfb) ;
+/cmbxti10 (font_path:cmbxti10.pfb) ;
+/cmcsc10 (font_path:cmcsc10.pfb) ;
+/cmcsc8 (font_path:cmcsc8.pfb) ;
+/cmcsc9 (font_path:cmcsc9.pfb) ;
+/cmdunh10 (font_path:cmdunh10.pfb) ;
+/cmex10 (font_path:cmex10.pfb) ;
+/cmex7 (font_path:cmex7.pfb) ;
+/cmex8 (font_path:cmex8.pfb) ;
+/cmex9 (font_path:cmex9.pfb) ;
+/cmff10 (font_path:cmff10.pfb) ;
+/cmfi10 (font_path:cmfi10.pfb) ;
+/cmfib8 (font_path:cmfib8.pfb) ;
+/cminch (font_path:cminch.pfb) ;
+/cmitt10 (font_path:cmitt10.pfb) ;
+/cmmi10 (font_path:cmmi10.pfb) ;
+/cmmi12 (font_path:cmmi12.pfb) ;
+/cmmi5 (font_path:cmmi5.pfb) ;
+/cmmi6 (font_path:cmmi6.pfb) ;
+/cmmi7 (font_path:cmmi7.pfb) ;
+/cmmi8 (font_path:cmmi8.pfb) ;
+/cmmi9 (font_path:cmmi9.pfb) ;
+/cmmib10 (font_path:cmmib10.pfb) ;
+/cmmib6 (font_path:cmmib6.pfb) ;
+/cmmib7 (font_path:cmmib7.pfb) ;
+/cmmib8 (font_path:cmmib8.pfb) ;
+/cmmib9 (font_path:cmmib9.pfb) ;
+/cmr10 (font_path:cmr10.pfb) ;
+/cmr12 (font_path:cmr12.pfb) ;
+/cmr17 (font_path:cmr17.pfb) ;
+/cmr5 (font_path:cmr5.pfb) ;
+/cmr6 (font_path:cmr6.pfb) ;
+/cmr7 (font_path:cmr7.pfb) ;
+/cmr8 (font_path:cmr8.pfb) ;
+/cmr9 (font_path:cmr9.pfb) ;
+/cmsl10 (font_path:cmsl10.pfb) ;
+/cmsl12 (font_path:cmsl12.pfb) ;
+/cmsl8 (font_path:cmsl8.pfb) ;
+/cmsl9 (font_path:cmsl9.pfb) ;
+/cmsltt10 (font_path:cmsltt10.pfb) ;
+/cmss10 (font_path:cmss10.pfb) ;
+/cmss12 (font_path:cmss12.pfb) ;
+/cmss17 (font_path:cmss17.pfb) ;
+/cmss8 (font_path:cmss8.pfb) ;
+/cmss9 (font_path:cmss9.pfb) ;
+/cmssbx10 (font_path:cmssbx10.pfb) ;
+/cmssdc10 (font_path:cmssdc10.pfb) ;
+/cmssi10 (font_path:cmssi10.pfb) ;
+/cmssi12 (font_path:cmssi12.pfb) ;
+/cmssi17 (font_path:cmssi17.pfb) ;
+/cmssi8 (font_path:cmssi8.pfb) ;
+/cmssi9 (font_path:cmssi9.pfb) ;
+/cmssq8 (font_path:cmssq8.pfb) ;
+/cmssqi8 (font_path:cmssqi8.pfb) ;
+/cmsy10 (font_path:cmsy10.pfb) ;
+/cmsy5 (font_path:cmsy5.pfb) ;
+/cmsy6 (font_path:cmsy6.pfb) ;
+/cmsy7 (font_path:cmsy7.pfb) ;
+/cmsy8 (font_path:cmsy8.pfb) ;
+/cmsy9 (font_path:cmsy9.pfb) ;
+/cmtcsc10 (font_path:cmtcsc10.pfb) ;
+/cmtex10 (font_path:cmtex10.pfb) ;
+/cmtex8 (font_path:cmtex8.pfb) ;
+/cmtex9 (font_path:cmtex9.pfb) ;
+/cmti10 (font_path:cmti10.pfb) ;
+/cmti12 (font_path:cmti12.pfb) ;
+/cmti7 (font_path:cmti7.pfb) ;
+/cmti8 (font_path:cmti8.pfb) ;
+/cmti9 (font_path:cmti9.pfb) ;
+/cmtt10 (font_path:cmtt10.pfb) ;
+/cmtt12 (font_path:cmtt12.pfb) ;
+/cmtt8 (font_path:cmtt8.pfb) ;
+/cmtt9 (font_path:cmtt9.pfb) ;
+/cmu10 (font_path:cmu10.pfb) ;
+/cmvtt10 (font_path:cmvtt10.pfb) ;
+/cmb10 (font_path:cmb10.pfa) ;
+/cmbsy10 (font_path:cmbsy10.pfa) ;
+/cmbx10 (font_path:cmbx10.pfa) ;
+/cmbx12 (font_path:cmbx12.pfa) ;
+/cmbx5 (font_path:cmbx5.pfa) ;
+/cmbx6 (font_path:cmbx6.pfa) ;
+/cmbx7 (font_path:cmbx7.pfa) ;
+/cmbx8 (font_path:cmbx8.pfa) ;
+/cmbx9 (font_path:cmbx9.pfa) ;
+/cmbxsl10 (font_path:cmbxsl10.pfa) ;
+/cmbxti10 (font_path:cmbxti10.pfa) ;
+/cmcb10 (font_path:cmcb10.pfa) ;
+/cmcbx10 (font_path:cmcbx10.pfa) ;
+/cmcbx12 (font_path:cmcbx12.pfa) ;
+/cmcbx5 (font_path:cmcbx5.pfa) ;
+/cmcbx6 (font_path:cmcbx6.pfa) ;
+/cmcbx7 (font_path:cmcbx7.pfa) ;
+/cmcbx8 (font_path:cmcbx8.pfa) ;
+/cmcbx9 (font_path:cmcbx9.pfa) ;
+/cmcbxsl10 (font_path:cmcbxsl1.pfa) ;
+/cmcbxti10 (font_path:cmcbxti1.pfa) ;
+/cmccsc10 (font_path:cmccsc10.pfa) ;
+/cmccsc8 (font_path:cmccsc8.pfa) ;
+/cmccsc9 (font_path:cmccsc9.pfa) ;
+/cmcitt10 (font_path:cmcitt10.pfa) ;
+/cmcsc10 (font_path:cmcsc10.pfa) ;
+/cmcsc8 (font_path:cmcsc8.pfa) ;
+/cmcsc9 (font_path:cmcsc9.pfa) ;
+/cmcsl10 (font_path:cmcsl10.pfa) ;
+/cmcsl12 (font_path:cmcsl12.pfa) ;
+/cmcsl8 (font_path:cmcsl8.pfa) ;
+/cmcsl9 (font_path:cmcsl9.pfa) ;
+/cmcsltt10 (font_path:cmcsltt1.pfa) ;
+/cmcss10 (font_path:cmcss10.pfa) ;
+/cmcss12 (font_path:cmcss12.pfa) ;
+/cmcss17 (font_path:cmcss17.pfa) ;
+/cmcss8 (font_path:cmcss8.pfa) ;
+/cmcss9 (font_path:cmcss9.pfa) ;
+/cmcssbx10 (font_path:cmcssbx1.pfa) ;
+/cmcssdc10 (font_path:cmcssdc1.pfa) ;
+/cmcssi10 (font_path:cmcssi10.pfa) ;
+/cmcssi12 (font_path:cmcssi12.pfa) ;
+/cmcssi17 (font_path:cmcssi17.pfa) ;
+/cmcssi8 (font_path:cmcssi8.pfa) ;
+/cmcssi9 (font_path:cmcssi9.pfa) ;
+/cmcssq8 (font_path:cmcssq8.pfa) ;
+/cmcssqi8 (font_path:cmcssqi8.pfa) ;
+/cmcti10 (font_path:cmcti10.pfa) ;
+/cmcti12 (font_path:cmcti12.pfa) ;
+/cmcti7 (font_path:cmcti7.pfa) ;
+/cmcti8 (font_path:cmcti8.pfa) ;
+/cmcti9 (font_path:cmcti9.pfa) ;
+/cmctt10 (font_path:cmctt10.pfa) ;
+/cmctt12 (font_path:cmctt12.pfa) ;
+/cmctt8 (font_path:cmctt8.pfa) ;
+/cmctt9 (font_path:cmctt9.pfa) ;
+/cmcu10 (font_path:cmcu10.pfa) ;
+/cmcyr10 (font_path:cmcyr10.pfa) ;
+/cmcyr12 (font_path:cmcyr12.pfa) ;
+/cmcyr17 (font_path:cmcyr17.pfa) ;
+/cmcyr5 (font_path:cmcyr5.pfa) ;
+/cmcyr6 (font_path:cmcyr6.pfa) ;
+/cmcyr7 (font_path:cmcyr7.pfa) ;
+/cmcyr8 (font_path:cmcyr8.pfa) ;
+/cmcyr9 (font_path:cmcyr9.pfa) ;
+/cmdunh10 (font_path:cmdunh10.pfa) ;
+/cmex10 (font_path:cmex10.pfa) ;
+/cmff10 (font_path:cmff10.pfa) ;
+/cmfi10 (font_path:cmfi10.pfa) ;
+/cmfib8 (font_path:cmfib8.pfa) ;
+/cminch (font_path:cminch.pfa) ;
+/cmitt10 (font_path:cmitt10.pfa) ;
+/cmmi10 (font_path:cmmi10.pfa) ;
+/cmmi12 (font_path:cmmi12.pfa) ;
+/cmmi5 (font_path:cmmi5.pfa) ;
+/cmmi6 (font_path:cmmi6.pfa) ;
+/cmmi7 (font_path:cmmi7.pfa) ;
+/cmmi8 (font_path:cmmi8.pfa) ;
+/cmmi9 (font_path:cmmi9.pfa) ;
+/cmmib10 (font_path:cmmib10.pfa) ;
+/cmr10 (font_path:cmr10.pfa) ;
+/cmr12 (font_path:cmr12.pfa) ;
+/cmr17 (font_path:cmr17.pfa) ;
+/cmr5 (font_path:cmr5.pfa) ;
+/cmr6 (font_path:cmr6.pfa) ;
+/cmr7 (font_path:cmr7.pfa) ;
+/cmr8 (font_path:cmr8.pfa) ;
+/cmr9 (font_path:cmr9.pfa) ;
+/cmsl10 (font_path:cmsl10.pfa) ;
+/cmsl12 (font_path:cmsl12.pfa) ;
+/cmsl8 (font_path:cmsl8.pfa) ;
+/cmsl9 (font_path:cmsl9.pfa) ;
+/cmsltt10 (font_path:cmsltt10.pfa) ;
+/cmss10 (font_path:cmss10.pfa) ;
+/cmss12 (font_path:cmss12.pfa) ;
+/cmss17 (font_path:cmss17.pfa) ;
+/cmss8 (font_path:cmss8.pfa) ;
+/cmss9 (font_path:cmss9.pfa) ;
+/cmssbx10 (font_path:cmssbx10.pfa) ;
+/cmssdc10 (font_path:cmssdc10.pfa) ;
+/cmssi10 (font_path:cmssi10.pfa) ;
+/cmssi12 (font_path:cmssi12.pfa) ;
+/cmssi17 (font_path:cmssi17.pfa) ;
+/cmssi8 (font_path:cmssi8.pfa) ;
+/cmssi9 (font_path:cmssi9.pfa) ;
+/cmssq8 (font_path:cmssq8.pfa) ;
+/cmssqi8 (font_path:cmssqi8.pfa) ;
+/cmsy10 (font_path:cmsy10.pfa) ;
+/cmsy5 (font_path:cmsy5.pfa) ;
+/cmsy6 (font_path:cmsy6.pfa) ;
+/cmsy7 (font_path:cmsy7.pfa) ;
+/cmsy8 (font_path:cmsy8.pfa) ;
+/cmsy9 (font_path:cmsy9.pfa) ;
+/cmtcsc10 (font_path:cmtcsc10.pfa) ;
+/cmtex10 (font_path:cmtex10.pfa) ;
+/cmtex8 (font_path:cmtex8.pfa) ;
+/cmtex9 (font_path:cmtex9.pfa) ;
+/cmti10 (font_path:cmti10.pfa) ;
+/cmti12 (font_path:cmti12.pfa) ;
+/cmti7 (font_path:cmti7.pfa) ;
+/cmti8 (font_path:cmti8.pfa) ;
+/cmti9 (font_path:cmti9.pfa) ;
+/cmtt10 (font_path:cmtt10.pfa) ;
+/cmtt12 (font_path:cmtt12.pfa) ;
+/cmtt8 (font_path:cmtt8.pfa) ;
+/cmtt9 (font_path:cmtt9.pfa) ;
+/cmu10 (font_path:cmu10.pfa) ;
+/cmvtt10 (font_path:cmvtt10.pfa) ;
+/euex10 (font_path:euex10.pfa) ;
+/eufb10 (font_path:eufb10.pfa) ;
+/eufb5 (font_path:eufb5.pfa) ;
+/eufb7 (font_path:eufb7.pfa) ;
+/eufm10 (font_path:eufm10.pfa) ;
+/eufm5 (font_path:eufm5.pfa) ;
+/eufm7 (font_path:eufm7.pfa) ;
+/eurb10 (font_path:eurb10.pfa) ;
+/eurb5 (font_path:eurb5.pfa) ;
+/eurb7 (font_path:eurb7.pfa) ;
+/eurm10 (font_path:eurm10.pfa) ;
+/eurm5 (font_path:eurm5.pfa) ;
+/eurm7 (font_path:eurm7.pfa) ;
+/eusb10 (font_path:eusb10.pfa) ;
+/eusb5 (font_path:eusb5.pfa) ;
+/eusb7 (font_path:eusb7.pfa) ;
+/eusm10 (font_path:eusm10.pfa) ;
+/eusm5 (font_path:eusm5.pfa) ;
+/eusm7 (font_path:eusm7.pfa) ;
+/lasy10 (font_path:lasy10.pfa) ;
+/lasy5 (font_path:lasy5.pfa) ;
+/lasy6 (font_path:lasy6.pfa) ;
+/lasy7 (font_path:lasy7.pfa) ;
+/lasy8 (font_path:lasy8.pfa) ;
+/lasy9 (font_path:lasy9.pfa) ;
+/lasyb10 (font_path:lasyb10.pfa) ;
+/lcircle10 (font_path:lcircle1.pfa) ;
+/lcirclew10 (font_path:lcirclew.pfa) ;
+/line10 (font_path:line10.pfa) ;
+/linew10 (font_path:linew10.pfa) ;
+/logo10 (font_path:logo10.pfa) ;
+/logo8 (font_path:logo8.pfa) ;
+/logo9 (font_path:logo9.pfa) ;
+/logobf10 (font_path:logobf10.pfa) ;
+/logosl10 (font_path:logosl10.pfa) ;
+/msam10 (font_path:msam10.pfa) ;
+/msbm10 (font_path:msbm10.pfa) ;
diff --git a/fonts/utilities/fontload/vms/init.com b/fonts/utilities/fontload/vms/init.com
new file mode 100644
index 0000000000..53208b4209
--- /dev/null
+++ b/fonts/utilities/fontload/vms/init.com
@@ -0,0 +1,7 @@
+$!
+$! Determine directory in which all programs are ...
+$ cf = F$ENV("PROCEDURE")
+$ root=f$parse(cf,,,"DEVICE") + f$parse(cf,,,"DIRECTORY")
+$ fload == "@" + root + "fload.com"
+$ subfont == "$" + root + "subfont.exe-" + f$getsy("ARCH_NAME")
+$ exit
diff --git a/fonts/utilities/fontload/vms/install.txt b/fonts/utilities/fontload/vms/install.txt
new file mode 100644
index 0000000000..53e72c7d5b
--- /dev/null
+++ b/fonts/utilities/fontload/vms/install.txt
@@ -0,0 +1,77 @@
+
+To install Partial font downloading utility for VMS make following:
+
+1. Copy system independent file from distribution subdirectory 'lib'
+ into any one directory (For example USER$PLUS:[MINUS]).
+
+2. Copy system dependent files from distribution subdirectory 'vms'
+ into the same directory.
+
+3. Edit head of the file fload.com.
+ Have attension for following items:
+
+ $ gs="$usr_local:[exe]gs.exe"
+ It symbol which must call ghostscript interpreter.
+ Not command file, which call interpreter !
+
+ $ define/nolog gs_path usr_local:[lib.gs]
+ This logical name must refer to directory with standard
+ GhostScript library files.
+
+ $ define/nolog font_path disk$et:[tex.newtex.xps],disk$et:[tex.newtex.ps]
+ This logical name must contains list of directories with
+ fonts which are required by your documents.
+
+ Note, that variable 'fload_lib' is determined automatically.
+ However old versions of VMS system do not supports F$ENV("PROCEDURE")
+ call. In this case you must correct definition of the 'fload_lib'
+ variable.
+
+4. SET DEFAULT USER$PLUS:[MINUS]
+
+5. Issue command
+ $ @INIT.COM
+ This command will define symbols for calling commands 'fload' & 'subfont'
+
+6. Issue command
+ $ FLOAD -updatefontmap
+ This command will scans all fonts in 'font_path' and build map.
+ Map will be saved in file 'Fontmap.t1'.
+
+Currently installation is completed.
+
+System command 'DIR' must shows following :
+
+Directory USER$PLUS:[MINUS]
+
+35.FS;1 2/4 27-JAN-1995 15:16:29.56 (RWED,RWED,RE,RE)
+CVTMAP.PS;1 1/4 27-JAN-1995 15:16:33.52 (RWED,RWED,RE,RE)
+FLOAD.COM;6 9/12 27-JAN-1995 16:37:13.91 (RWED,RWED,RE,RE)
+FONTMAP.T1;2 18/20 27-JAN-1995 16:37:22.75 (RWED,RWED,RE,RE)
+INIT.COM;2 1/4 27-JAN-1995 15:29:28.43 (RWED,RWED,RE,RE)
+INSTALL.TXT;1 6/8 27-JAN-1995 16:43:02.32 (RWED,RWED,RE,RE)
+MAKE.COM;4 1/4 27-JAN-1995 15:39:38.98 (RWED,RWED,RE,RE)
+PSFSTAT.PS;3 26/28 27-JAN-1995 16:18:38.18 (RWED,RWED,RE,RE)
+STANDARD.FS;1 1/4 27-JAN-1995 15:16:32.87 (RWED,RWED,RE,RE)
+SUBFONT.EXE-ALPHA;2
+ 94/96 27-JAN-1995 15:39:58.43 (RWED,RWED,RE,RE)
+SUBFONT.EXE-VAX;2 175/176 27-JAN-1995 15:41:01.54 (RWED,RWED,RE,RE)
+
+Total of 11 files, 333/360 blocks.
+
+To use program one must:
+
+1. issue command
+ $ @USER$PLUS:[MINUS]INIT.COM
+ At start of him session.
+ It will be more conviniently to add this line into user's 'LOGIN.COM'.
+
+2. Issue command
+ fload <source-PS-file> <destination-PS-file>
+ To make PS file with partially preloaded Type1 fonts.
+
+NOTE: Program will preloads only those fonts which are not in your source
+ PS file. So, you must configurate your software so that it will
+ write PS files without font preloading.
+
+Basil K. Malyshev, 27-Jan-1995.
diff --git a/fonts/utilities/fontload/vms/make.com b/fonts/utilities/fontload/vms/make.com
new file mode 100644
index 0000000000..5162ef2837
--- /dev/null
+++ b/fonts/utilities/fontload/vms/make.com
@@ -0,0 +1,11 @@
+$! This file compiles SUBFONT program on VMS system.
+$ arch = f$getsy("ARCH_NAME")
+$ if ( arch .eqs. "Alpha" )
+$ then
+$ cc subfont
+$ link/exe=subfont.exe-Alpha subfont
+$ else
+$ cc subfont
+$ link/exe=subfont.exe-vax subfont,sys$library:vaxcrtl/lib
+$ endif
+$ exit
diff --git a/fonts/utilities/fontload/vms/subfont.exe-alpha b/fonts/utilities/fontload/vms/subfont.exe-alpha
new file mode 100644
index 0000000000..03cc848756
--- /dev/null
+++ b/fonts/utilities/fontload/vms/subfont.exe-alpha
Binary files differ
diff --git a/fonts/utilities/fontload/vms/subfont.exe-vax b/fonts/utilities/fontload/vms/subfont.exe-vax
new file mode 100644
index 0000000000..19f6382972
--- /dev/null
+++ b/fonts/utilities/fontload/vms/subfont.exe-vax
Binary files differ
diff --git a/fonts/utilities/fontools/GPLv2.txt b/fonts/utilities/fontools/GPLv2.txt
new file mode 100644
index 0000000000..1972a88212
--- /dev/null
+++ b/fonts/utilities/fontools/GPLv2.txt
@@ -0,0 +1,341 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/fonts/utilities/fontools/README b/fonts/utilities/fontools/README
new file mode 100644
index 0000000000..4ceee70eff
--- /dev/null
+++ b/fonts/utilities/fontools/README
@@ -0,0 +1,83 @@
+
+ -=- FONTOOLS -=-
+
+
+This package provides tools to simplify using OpenType fonts with LaTeX.
+
+By far the most important program in this bundle is autoinst:
+
+ AUTOINST - a wrapper script around Eddie Kohler's LCDF TypeTools.
+ Autoinst aims to automate the installation of OpenType fonts in LaTeX
+ by calling the LCDF TypeTools (with the correct options) for all fonts
+ you wish to install, and generating the necessary .fd and .sty files.
+
+In addition, this bundle contains a few other, less important utilities:
+
+ AFM2AFM - re-encode .afm files
+
+ OT2KPX - extract kerning pairs from OpenType fonts
+
+ SPLITTTC - split an OpenType Collection file (ttc or otc) into
+ individual fonts
+
+
+
+PREREQUISITES
+=============
+
+Perl
+
+ The Fontools are written in Perl; any remotely recent version should work.
+ Perl is usually installed on Linux and Unix systems;
+ for Windows, try ActivePerl (http://www.activestate.com)
+ or Strawberry Perl (http://strawberryperl.com).
+
+LCDF TypeTools
+ Of course, Autoinst needs the LCDF TypeTools;
+ they should be installed in a directory on your PATH.
+
+Kpathsea
+ Automatically installing the fonts into a suitable TEXMF tree
+ (as Autoinst does by default) requires a TeX-installation that uses
+ the kpathsea library; with TeX distributions that implement their
+ own directory searching (such as MiKTeX), Autoinst will complain that
+ it cannot find the kpsewhich program and install all generated files
+ into subdirectories of the current directory.
+
+ If you use such a TeX distribution, either move these files to their
+ destinations by hand, or use the -target command line option
+ (please see the manual for more information).
+
+
+Installation
+------------
+When installing manually, the encoding files in the "share/" directory
+should be moved to a "standard" location where otftotfm can find them.
+What this location is depends on your TeX installation;
+in TeXLive, it should be $TEXMFLOCAL/fonts/enc/dvips/fontools/ or,
+if you don't have write permissions in $TEXMFLOCAL,
+$TEXMFHOME/fonts/enc/dvips/fontools/.
+
+The scripts in the "bin/" directory should be placed in a directory
+on your PATH (or else you have to call them with their full path name).
+
+Of course, when using a package manager (such as tlmgr) to do
+the installation, all files will automatically be put in the right
+location.
+
+
+DISCLAIMER
+==========
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+
+LICENSE & COPYRIGHT
+===================
+
+This software is copyright (C) 2005-2019 Marc Penninga.
+It is released under the terms of the GNU General Public Licence;
+see the file GPLv2.txt for the license conditions.
diff --git a/fonts/utilities/fontools/bin/afm2afm b/fonts/utilities/fontools/bin/afm2afm
new file mode 100755
index 0000000000..8f5eec2ed3
--- /dev/null
+++ b/fonts/utilities/fontools/bin/afm2afm
@@ -0,0 +1,500 @@
+#! /usr/bin/env perl
+
+=begin COPYRIGHT
+
+----------------------------------------------------------------------------
+
+ Copyright (C) 2005-2019 Marc Penninga.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to
+ Free Software Foundation, Inc.,
+ 59 Temple Place,
+ Suite 330,
+ Boston, MA 02111-1307,
+ USA
+
+----------------------------------------------------------------------------
+
+=end COPYRIGHT
+
+=cut
+
+use strict;
+use warnings;
+
+use File::Basename;
+use Getopt::Long;
+use Pod::Usage;
+
+my $VERSION = "20190712";
+
+parse_commandline();
+
+my $afm = read_afm($ARGV[0]);
+$afm->{kernpairs} = read_kpx($ARGV{kpx}, $afm->{kernpairs}) if $ARGV{kpx};
+
+if ($ARGV{output}) {
+ $ARGV{output} .= '.afm' unless $ARGV{output} =~ m/[.]afm\z/xms;
+ open my $output, '>', $ARGV{output}
+ or die "[ERROR] can't open '$ARGV{output}': $!";
+ select $output;
+}
+
+# If user specified encoding, use that; else, use encoding from .afm file
+my $enc = $ARGV{encoding} ? read_enc($ARGV{encoding})
+ : get_enc($afm)
+ ;
+# Make lookup table to quickly see if a character is present in the encoding
+my %char_in_enc = map { ($_ => 1) } @{$enc->{vector}};
+
+print_fontinfo($afm->{fontinfo}, $enc->{scheme});
+print_charmetrics($afm->{metrics}, $enc->{vector});
+print_kerndata($afm->{kernpairs}, $afm->{trackkerns}, \%char_in_enc);
+print_composites($afm->{composites}, \%char_in_enc);
+print "EndFontMetrics\n";
+
+close select *STDOUT if $ARGV{output};
+
+print_mapentry($afm->{fontinfo}, , $enc->{scheme})
+ if $ARGV{encoding} && $ARGV{output};
+
+#-----------------------------------------------------------------------
+# Read the command-line options
+#-----------------------------------------------------------------------
+sub parse_commandline {
+ Getopt::Long::GetOptions(
+ 'help|?' => sub { pod2usage(-verbose => 1) },
+ 'version' => sub { print "$VERSION\n"; exit },
+ 'encoding=s' => \$ARGV{encoding},
+ 'kpx=s' => \$ARGV{kpx},
+ 'output=s' => \$ARGV{output},
+ )
+ or pod2usage(-verbose => 0);
+
+ pod2usage(-verbose => 0) if @ARGV != 1;
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Read the input afm file
+#-----------------------------------------------------------------------
+sub read_afm {
+ my $filename = shift;
+ open my $afmfile, '<', $filename
+ or die "[ERROR] can't open '$filename': $!";
+
+ my %afm = (
+ fontinfo => [],
+ metrics => [],
+ kernpairs => [],
+ trackkerns => [],
+ composites => [],
+ );
+
+ until ((my $line = <$afmfile>) =~ m/StartCharMetrics/xms) {
+ push @{$afm{fontinfo}}, $line;
+ }
+
+ for (<$afmfile>) {
+ if (m/\A\s* C \s/xms) { push @{$afm{metrics}}, $_; next }
+ if (m/\A\s* KPX \s/xms) { push @{$afm{kernpairs}}, $_; next }
+ if (m/\A\s* TrackKern \s/xms) { push @{$afm{trackkerns}}, $_; next }
+ if (m/\A\s* CC \s/xms) { push @{$afm{composites}}, $_; next }
+ }
+
+ close $afmfile;
+
+ return \%afm;
+}
+
+#-----------------------------------------------------------------------
+# Read additional kerning pairs from the kpx file
+#-----------------------------------------------------------------------
+sub read_kpx {
+ my ($filename, $kpx) = @_;
+ open my $kpxfile, '<', $filename
+ or die "[ERROR] can't open '$filename': $!";
+
+ my %seen = map { ($_ => 1) } @$kpx;
+ for (<$kpxfile>) {
+ if (m/\A\s* KPX \s/xms) { push @$kpx, $_ unless $seen{$_}++ }
+ }
+
+ close $kpxfile;
+
+ return $kpx;
+}
+
+#-----------------------------------------------------------------------
+# Get encoding name and vector from the specified .enc file
+#-----------------------------------------------------------------------
+sub read_enc {
+ my $filename = shift;
+
+ open my $encfile, '<', $filename
+ or die "[ERROR] can't open '$filename': $!";
+ my $data = join ' ', map { s/%.+|\n//xmsg; $_ } <$encfile>;
+ close $encfile;
+
+ my ($scheme, $encoding)
+ = $data =~ m{ /([-\w]+) \s* [[] (.+) []] \s* def }xms
+ or die "[ERROR] parsing encoding file '$filename' failed";
+
+ return { scheme => $scheme,
+ vector => [ $encoding =~ m{ /([.\w]+) }xmsg ],
+ };
+}
+
+#-----------------------------------------------------------------------
+# Get encoding from the input .afm file
+#-----------------------------------------------------------------------
+sub get_enc {
+ my $afm = shift;
+
+ my %enc = ( scheme => 'FontSpecific', vector => [ ('/.undef') x 256 ] );
+
+ for my $line (@{$afm->{fontinfo}}) {
+ if ($line =~ m/EncodingScheme \s+ ([-\w]+)/xms) {
+ $enc{scheme} = $1;
+ last;
+ }
+ }
+ for my $line (@{$afm->{metrics}}) {
+ my ($pos, $name)
+ = $line =~ m/C \s+ ([-]?\d+) .+? N \s+ ([.\w]+)/xms
+ or die;
+ $enc{vector}[$pos] = $name unless $pos == -1;
+ }
+
+ return \%enc;
+}
+
+#-----------------------------------------------------------------------
+# Print the 'fontinfo' part of the output afm file
+#-----------------------------------------------------------------------
+sub print_fontinfo {
+ my ($fontinfo, $scheme) = @_;
+
+ for my $line (@$fontinfo) {
+ $line = "EncodingScheme $scheme\n"
+ if $line =~ m/EncodingScheme/xms;
+ print $line;
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Print character metrics for characters in specified encoding
+#-----------------------------------------------------------------------
+sub print_charmetrics {
+ my ($metrics, $vector) = @_;
+
+ my %metrics = map { m/(WX .+? N \s+ ([.\w]+) .+)/xms; ($2 => $1) }
+ @$metrics;
+
+ print "StartCharMetrics @{[ scalar grep { $metrics{$_} } @$vector ]}\n";
+ for my $i (0 .. 255) {
+ next unless $metrics{$vector->[$i]};
+ print "C $i ; $metrics{$vector->[$i]}";
+ }
+ print "EndCharMetrics\n";
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Print kerning data for characters in specified encoding
+#-----------------------------------------------------------------------
+sub print_kerndata {
+ my ($kernpairs, $trackkerns, $char_in_enc) = @_;
+
+ my @kernpairs = grep { m/\A\s* KPX \s+ ([.\w]+) \s+ ([.\w]+)/xms
+ and $char_in_enc->{$1}
+ and $char_in_enc->{$2}
+ }
+ @$kernpairs;
+
+ if (@kernpairs || @$trackkerns) {
+ print "StartKernData\n";
+ if (@kernpairs) {
+ print "StartKernPairs @{[ scalar @kernpairs ]}\n";
+ print @kernpairs;
+ print "EndKernPairs\n";
+ }
+ if (@$trackkerns) {
+ print "StartTrackKern @{[ scalar @$trackkerns ]}\n";
+ print @$trackkerns;
+ print "EndTrackKern\n";
+ }
+ print "EndKernData\n";
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Print "composite" info for characters in specified encoding
+#-----------------------------------------------------------------------
+sub print_composites {
+ my ($composites, $char_in_enc) = @_;
+
+ # Each line mentions several characters: the composite and two or more
+ # 'base' characters. We only print the line if all characters are
+ # present in the specified encoding
+ my @composites;
+ COMPOSITE:
+ for my $composite (@$composites) {
+ my @chars = $composite =~ m/(?:CC \s+ ([.\w]+))/xmsg;
+ for my $char (@chars) {
+ next COMPOSITE unless $char_in_enc->{$char};
+ }
+ push @composites, $composite;
+ }
+
+ if (@composites) {
+ print "StartComposites @{[ scalar @composites ]}\n";
+ print @composites;
+ print "EndComposites\n";
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Print a mapfile entry for this re-encoded font
+#-----------------------------------------------------------------------
+sub print_mapentry {
+ my ($fontinfo, $scheme) = @_;
+
+ my $fontname = '';
+ (my $fontfile = basename($ARGV[0] // '')) =~ s/[.]afm\z//xms;
+ (my $output = basename($ARGV{output} // '')) =~ s/[.]afm\z//xms;
+
+ for my $line (@$fontinfo) {
+ if ($line =~ m/FontName \s+ ([-\w]+)/xms) {
+ $fontname = $1;
+ last;
+ }
+ }
+
+ print {*STDOUT} qq(${output} ${fontname} <${fontfile}.pfb ),
+ qq(<[$ARGV{encoding} "${scheme} ReEncodeFont"\n);
+
+ return;
+
+}
+
+__END__
+
+
+############################################################################
+
+ To create the documentation:
+
+ pod2man --center="Marc Penninga" --release="fontools" --section=1 \
+ afm2afm - | groff -Tps -man - | ps2pdf - afm2afm.pdf
+
+=pod
+
+=head1 NAME
+
+afm2afm - reencode an F<afm> file
+
+=head1 SYNOPSIS
+
+=over 8
+
+=item B<afm2afm>
+
+[B<-help>]
+[B<-version>]
+[B<-encoding>=I<< <encodingfile> >>]
+[B<-kpx>=I<< <kpxfile> >>]
+[B<-output>=I<< <outputfile> >>]
+B<< <afmfile> >>
+
+=back
+
+
+=head1 DESCRIPTION
+
+B<afm2afm> re-encodes an F<afm> file.
+
+Metrics (including kerning data) for characters not present in the
+chosen encoding are excluded from the output, which resuls in
+(potentially much) smaller files.
+
+Additional kerning pairs can be added to the output file.
+If you don't specify an encoding file,
+the F<afm> file isn't re-encoded;
+however, all unused (unencoded) data is still pruned.
+
+The program also generates an entry for a F<dvips>-style map file,
+but only if the F<afm> file has been re-encoded and
+the output was written to file
+(i.e., if both the I<-encoding> and I<-output> options were specified).
+
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 4
+
+=item B<-help>
+
+Print a short description of the syntax
+
+=item B<-version>
+
+Print version number and exit
+
+=item B<-encoding>=I<< <encodingfile> >>
+
+Re-encode to the enconding in I<< <encodingfile> >>
+
+=item B<-kpx>=I<< <kpxfile> >>
+
+Read additional kerning pairs from I<< <kpxfile> >> and add these to the output.
+This option cannot be used to override values from the input F<afm> file,
+since B<afm2afm> will write both old and new values to the output!
+
+The I<< <kpxfile> >> should contain kerning data in standard F<afm> format,
+i.e. for each kerning pair there should be a line
+
+ KPX <left_glyph> <right_glyph> <amount>
+
+All other lines in the I<< <kpxfile> >> are ignored.
+
+=item B<-output>=I<< <outputfile> >>
+
+Write the result to I<< <outputfile> >> instead of C<stdout>.
+
+=item B<< <afmfile> >>
+
+The F<afm> file to be re-encoded.
+
+=back
+
+You may use either one or two dashes before options,
+and option names may be shortened to a unique prefix.
+
+
+=head1 AUTHOR
+
+Marc Penninga <marcpenninga@gmail.com>
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2005-2019 Marc Penninga.
+
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published
+by the Free Software Foundation, either version 2 of the License,
+or (at your option) any later version.
+A copy of the GNU General Public License is included with B<afm2afm>;
+see the file F<GPLv2.txt>.
+
+
+=head1 DISCLAIMER
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+
+=head1 VERSION
+
+This document describes B<afm2afm> version 20190712.
+
+
+=head1 RECENT CHANGES
+
+(See the source code for the rest of the story.)
+
+=over 12
+
+=item I<2019-05-20>
+
+Added the I<-version> option.
+
+=back
+
+
+=begin Really_old_history
+
+=over 12
+
+=item I<2013-08-07>
+
+Added the I<-kpx> command-line option.
+Replaced all C<given/when> constructions in the source code by C<if>'s,
+to avoid warnings about experimental features in Perl 5.18 and later.
+
+=item I<2012-02-01>
+
+Refactored the code; added the "no re-encoding, only pruning"
+functionality.
+
+=item I<2005-01-10>
+
+First version
+
+=item I<2005-01-25>
+
+Added printing of mapfile entry
+
+=item I<2005-02-18>
+
+Rewrote some of the code
+
+=item I<2005-03-08>
+
+Input files searched via B<kpsewhich> (where available)
+
+=item I<2005-03-15>
+
+Input files searched using B<kpsewhich> or B<findtexmf> (if available)
+
+=item I<2005-04-15>
+
+Updated creation of mapfile entry; look for font file to deduce the correct
+font file format (pfb, pfa, ttf). If no font file is found,
+pfb is assumed.
+
+=item I<2005-04-20>
+
+Program quits if the specified output file exists
+
+=item I<2005-04-29>
+
+Improved the documentation
+
+=item I<2005-07-29>
+
+Some updates to the documentation
+
+=item I<2006-01-12>
+
+A few minor changes to the code
+
+=back
+
+=cut
+
diff --git a/fonts/utilities/fontools/bin/autoinst b/fonts/utilities/fontools/bin/autoinst
new file mode 100755
index 0000000000..fb295700f9
--- /dev/null
+++ b/fonts/utilities/fontools/bin/autoinst
@@ -0,0 +1,3220 @@
+#! /usr/bin/env perl
+
+=begin COPYRIGHT
+
+----------------------------------------------------------------------------
+
+ Copyright (C) 2005-2019 Marc Penninga.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to
+ Free Software Foundation, Inc.,
+ 59 Temple Place,
+ Suite 330,
+ Boston, MA 02111-1307,
+ USA
+
+----------------------------------------------------------------------------
+
+=end COPYRIGHT
+
+=cut
+
+use strict;
+use warnings;
+
+use Cwd ();
+use File::Path ();
+use File::Spec ();
+use Getopt::Long ();
+use Pod::Usage ();
+use POSIX ();
+
+my $VERSION = '20190712';
+
+my ($d, $m, $y) = (localtime time)[3 .. 5];
+my $TODAY = sprintf "%04d/%02d/%02d", $y + 1900, $m + 1, $d;
+
+=begin Comment
+
+ Some fontnames contain abbreviated words for width, weight and/or shape;
+ we unabbreviate these using the following table.
+
+ To avoid having to have this information in multiple places,
+ we also build a reversed table %ABBREV that maps 'full' forms
+ to all known abbreviations; we then inject these abbreviations into
+ the %NFSS_WEIGHT, %NFSS_WIDTH and %NFSS_SHAPE tables below,
+ so that they recognise the abbreviated forms as well as the full ones.
+
+=end Comment
+
+=cut
+
+my %UNABBREVIATE = (
+ cmp => 'compressed',
+ comp => 'compressed',
+ cond => 'condensed',
+ demi => 'demibold',
+ extcond => 'extracondensed',
+ hair => 'hairline',
+ incline => 'inclined',
+ it => 'italic',
+ ita => 'italic',
+ md => 'medium',
+ slant => 'slanted',
+ ultra => 'ultrablack',
+);
+my %ABBREV;
+while ( my ($k, $v) = each %UNABBREVIATE ) {
+ push @{$ABBREV{$v}}, $k;
+}
+for my $full (keys %ABBREV) {
+ push @{$ABBREV{$full}}, $full;
+}
+
+=begin Comment
+
+ LaTeX's NFSS contains a number of standard codes for weight and width:
+ - weight: ul, el, l, sl, m, sb, b, eb, ub
+ - width: uc, ec, c, sc, m, sx, x, ex, ux
+
+ These codes are not always a perfect match with the weights and widths
+ present in a font family; some families (especially sanserif ones)
+ contain more or different weights and widths, and the naming of those
+ weights and widths isn't always consistent between font families.
+ To handle this situation, we use a two-tiered approach:
+ 1. We install all fonts using a "series" name that is the concatenation
+ of whatever the font designer has chosen to call the weight and width
+ (but in all *lower*case).
+ 2. We add "ssub" rules to the .fd files that map the standard NFSS codes
+ to actual fonts.
+
+ In step 1, we follow NFSS in leaving out any occurrence of
+ the word "regular" unless *both* weight and width are Regular;
+ in that case, the 'series' attribute becomes "regular".
+
+ The two tables NFSS_WEIGHT and NFSS_WIDTH are used to control step 2.
+ It contains several entries of the form
+
+ sc => [ qw( semicondensed narrow ) ],
+
+ This should be read as follows: the NFSS code "sc" is mapped to
+ the *first* width on the right hand side present in the current family.
+
+ Please note that the tables contain empty keys instead of "m" for the
+ regular weight and width. NFSS actually combines weight and width into
+ a single "series" attribute; a weight or width of "m" is left out of
+ this combination (unless *both* weight and width are equal to "m"; then
+ the series becomes "m", but that's a special case we deal with later on).
+
+ In addition to the mapping of NFSS codes, the two mentioned tables are
+ also used in parsing the font's metadata to determine its weight and
+ width: any string that occurs on the right hand side is considered a
+ possible name to be searched for.
+
+ These tables can be extended to teach autoinst about new weights or
+ widths. Suppose your font family contains a "Hemibold" weight, that
+ you want mapped to the "sb" code. Then add the name "hemibold" to
+ the right hand side of the "sb" entry in the NFSS_WEIGHT table:
+
+ sb => [ qw( semibold demi demibold medium hemibold ) ],
+
+ In this case, since it's in last position, it's only mapped to "sb"
+ if none of the other fonts are present. Put it earlier in the list
+ to give it higher priority.
+
+ Note that autoinst converts all metadata to lowercase to avoid
+ inconsistent capitalization; so all entries in these tables should
+ be *lowercase* as well.
+
+ Technical notes:
+ - We define NFSS_WEIGHT and NFSS_WIDTH first as arrays
+ and then as hashtables; this allows us to use the array-variants
+ as an *ordered* (by weight/width) list of values.
+ - We exclude the Medium and Regular weights and widths
+ from the @WEIGHTS and @WIDTHS arrays to avoid false positives;
+ see the comments in the parse_basicinfo() function.
+
+=end Comment
+
+=cut
+
+my @NFSS_WEIGHT = (
+ ul => [ qw( ultralight thin hairline eight four two ) ],
+ el => [ qw( extralight ) ],
+ l => [ qw( light ) ],
+ sl => [ qw( semilight blond ) ],
+ '' => [ qw( regular text book ) ],
+ sb => [ qw( semibold demibold medium ) ],
+ b => [ qw( bold ) ],
+ eb => [ qw( extrabold ) ],
+ ub => [ qw( ultrabold black heavy extrablack ultrablack
+ ultraheavy poster super ) ],
+);
+my %NFSS_WEIGHT = @NFSS_WEIGHT;
+@NFSS_WEIGHT = grep { !ref } @NFSS_WEIGHT;
+
+# Add abbreviated forms, using the %ABBREV table constructed earlier
+for my $code (@NFSS_WEIGHT) {
+ $NFSS_WEIGHT{$code}
+ = [ map { @{ $ABBREV{$_} // [$_] } } @{$NFSS_WEIGHT{$code}} ];
+}
+
+my @WEIGHTS = grep { $_ !~ m/ regular | medium /xms }
+ map { @{$_} } values %NFSS_WEIGHT;
+
+my @NFSS_WIDTH = (
+ uc => [ qw( ultracondensed extracompressed ultracompressed ) ],
+ ec => [ qw( extracondensed compressed compact ) ],
+ c => [ qw( condensed ) ],
+ sc => [ qw( semicondensed narrow ) ],
+ '' => [ qw( regular ) ],
+ sx => [ qw( semiextended semiexpanded ) ],
+ x => [ qw( extended expanded wide ) ],
+ ex => [ ],
+ ux => [ ],
+);
+my %NFSS_WIDTH = @NFSS_WIDTH;
+@NFSS_WIDTH = grep { !ref } @NFSS_WIDTH;
+
+# Add abbreviated forms, using the %ABBREV table constructed earlier
+for my $code (@NFSS_WIDTH) {
+ $NFSS_WIDTH{$code}
+ = [ map { @{ $ABBREV{$_} // [$_] } } @{$NFSS_WIDTH{$code}} ];
+}
+
+my @WIDTHS = grep { $_ ne 'regular' } map { @{$_} } values %NFSS_WIDTH;
+
+=begin Comment
+
+ The NFSS_SHAPE table maps various shape names to NFSS codes.
+
+ Note that this table works the other way around compared to
+ the two previous tables; it directly maps shape names to NFSS codes.
+ The reason the other tables are a bit contorted is that there,
+ we might have multiple weighs or widths mapping to the same code,
+ and we need a way to prioritise some weights/widths over others.
+
+ For shapes, that's not the case; font families don't have both Slanted
+ and Oblique shapes, since these are different names for the same thing.
+
+ Like in the other NFSS_* tables, entries may be added to teach autoinst
+ about new shapes.
+
+=end Comment
+
+=cut
+
+my @NFSS_SHAPE = (
+ roman => 'n',
+ upright => 'n',
+ italic => 'it',
+ cursive => 'it',
+ kursiv => 'it',
+ inclined => 'sl',
+ oblique => 'sl',
+ slanted => 'sl',
+ romani => 'n', # Silentium has two roman shapes, but no italic;
+ romanii => 'it', # so we cheat by mapping the second roman to 'it'
+);
+my %NFSS_SHAPE = @NFSS_SHAPE;
+for my $full (keys %ABBREV) {
+ if (defined $NFSS_SHAPE{$full}) {
+ for my $abbrev ( @{$ABBREV{$full}} ) {
+ $NFSS_SHAPE{$abbrev} = $NFSS_SHAPE{$full};
+ }
+ }
+}
+
+=begin Comment
+
+ The %SHAPE table is used in deciding which font shapes
+ (normal, small caps, swash or textcomp) to generate.
+
+ Each key in this table names a shape; the corresponding value
+ is an anonymous hash with several key/value pairs:
+ code An anonymous hash with three possible keys:
+ 'n' -> the NFSS code to use for this variant shape
+ if the 'basic shape' is upright;
+ 'it' -> the NFSS code to use for this variant shape
+ if the 'basic shape' is italic
+ 'sl' -> the NFSS code to use for this variant shape
+ if the 'basic shape' is slanted (aka oblique);
+ If any entry is missing, the corresponding version
+ of this variant shape will not be built.
+ reqd A list of required OpenType features;
+ this shape is built if the font supports at least *one*
+ of these features.
+ nice A list of optional OpenType features;
+ these are used if the font supports them, but don't
+ prevent this shape from being built when missing.
+ extra Extra options passed to otftotfm when creating this shape.
+ name A string added to the name of the generated font,
+ to make it unique.
+
+ Textcomp is treated as a 'shape' even though it is technically
+ an encoding; that is just the easiest way to do things.
+
+=end Comment
+
+=cut
+
+my %SHAPE = (
+ normal => {
+ code => { n => 'n', it => 'it', sl => 'sl' },
+ reqd => [ ],
+ nice => [ 'kern', 'liga' ],
+ extra => '',
+ name => '',
+ },
+ smallcaps => {
+ code => { n => 'sc', it => 'scit', sl => 'scsl' },
+ reqd => [ 'smcp' ],
+ nice => [ 'kern', 'liga' ],
+ extra => '--unicoding="germandbls =: SSsmall"',
+ name => 'sc',
+ },
+ # '--feature=aalt' is in 'extra' instead of 'nice' because 'extra'
+ # comes last in the command line; else 'aalt' might be overridden
+ swash => {
+ code => { n => 'nw', it => 'sw' },
+ reqd => [ 'swsh' ],
+ nice => [ 'kern', 'liga', 'dlig' ],
+ extra => '--include-alternates="*.swash" --feature=aalt',
+ name => 'swash',
+ },
+ textcomp => {
+ code => { n => 'n', it => 'it', sl => 'sl' },
+ reqd => [ ],
+ nice => [ 'onum' ],
+ extra => '',
+ name => '',
+ },
+);
+
+=begin Comment
+
+ The next table is used to generate extra ssub rules in the .fd files
+ to map missing Slanted shapes to Italic and vice versa.
+
+=end Comment
+
+=cut
+
+my %SSUB_SHAPE = (
+ sl => 'it',
+ scsl => 'scit',
+ it => 'sl',
+ scit => 'scsl',
+);
+
+=begin Comment
+
+ The %STYLE table is used in deciding which figure styles to generate.
+ Each figure style (lining, oldstyle, tabular, proportional, superior,
+ inferior etc.) becomes a separate font family. We also treat Ornaments
+ as a figure style here; that's just the easiest way to handle them.
+
+ Each key in this table names a figure style; the corresponding
+ value is an anonymous hash with four key/value pairs:
+ reqd A list of required OpenType features; this style is built
+ if the font supports *all* these features.
+ nice A list of optional OpenType features;
+ these are used if the font supports them, but don't
+ prevent this style from being built when missing.
+ extra Extra options passed to otftotfm when creating this style.
+ shape An anonymous array of 'variant' shapes to build with
+ this figure style.
+
+ The 'reqd' and 'nice' subtables for the TLF, LF, TOsF and OsF styles
+ are empty; these are filled in at run time, depending on
+ which figure style is default for the current font.
+
+ The 'reqd' subtable for the Inf style is also empty; this may be filled
+ with 'subs', 'sinf' or 'dnom' depending on the -inferiors options.
+
+=end Comment
+
+=cut
+
+my %STYLE = (
+ TLF => {
+ reqd => [ ],
+ nice => [ ],
+ extra => '',
+ shapes => [ 'normal', 'smallcaps', 'swash', 'textcomp' ],
+ },
+ LF => {
+ reqd => [ ],
+ nice => [ ],
+ extra => '',
+ shapes => [ 'normal', 'smallcaps', 'swash', 'textcomp' ],
+ },
+ TOsF => {
+ reqd => [ ],
+ nice => [ ],
+ extra => '',
+ shapes => [ 'normal', 'smallcaps', 'swash', 'textcomp' ],
+ },
+ OsF => {
+ reqd => [ ],
+ nice => [ ],
+ extra => '',
+ shapes => [ 'normal', 'smallcaps', 'swash', 'textcomp' ],
+ },
+ Sup => {
+ reqd => [ 'sups' ],
+ nice => [ ],
+ extra => '--ligkern="* {KL} *"',
+ shapes => [ 'normal' ],
+ },
+ Inf => {
+ reqd => [ ],
+ nice => [ ],
+ extra => '--ligkern="* {KL} *"',
+ shapes => [ 'normal' ],
+ },
+ Numr => {
+ reqd => [ 'numr'],
+ nice => [ ],
+ extra => '--ligkern="* {KL} *"',
+ shapes => [ 'normal' ],
+ },
+ Dnom => {
+ reqd => [ 'dnom' ],
+ nice => [ ],
+ extra => '--ligkern="* {KL} *"',
+ shapes => [ 'normal' ],
+ },
+ Titl => {
+ reqd => [ 'titl' ],
+ nice => [ 'kern', 'liga' ],
+ extra => '',
+ shapes => [ 'normal' ],
+ },
+ Orn => {
+ reqd => [ 'ornm' ],
+ nice => [ ],
+ extra => '--ligkern="* {KL} *"',
+ shapes => [ 'normal' ],
+ },
+);
+
+=begin Comment
+
+ The %STYLE_DEFAULTS table is used to populate the 'reqd' and 'nice'
+ subtables of the %STYLE table, depending on the default figure style
+ for the current font. This is needed because some font families
+ provide only features for the non-default figure styles.
+
+ We therefore make the OpenType features that correspond
+ to the default figure style 'nice' (optional), so that this figure style
+ is always generated, even without OpenType features in the font;
+ the other figure style are only generated when the corresponding
+ features are present in the font.
+
+=end Comment
+
+=cut
+
+my %STYLE_DEFAULTS = (
+ lnum =>
+ sub {
+ push @{$STYLE{TLF}{nice}}, 'lnum';
+ push @{$STYLE{LF}{nice}}, 'lnum';
+ push @{$STYLE{TOsF}{reqd}}, 'onum';
+ push @{$STYLE{OsF}{reqd}}, 'onum';
+ },
+ onum =>
+ sub {
+ push @{$STYLE{TLF}{reqd}}, 'lnum';
+ push @{$STYLE{LF}{reqd}}, 'lnum';
+ push @{$STYLE{TOsF}{nice}}, 'onum';
+ push @{$STYLE{OsF}{nice}}, 'onum';
+ },
+ tnum =>
+ sub {
+ push @{$STYLE{TLF}{nice}}, 'tnum';
+ push @{$STYLE{TOsF}{nice}}, 'tnum';
+ push @{$STYLE{LF}{reqd}}, 'pnum';
+ push @{$STYLE{OsF}{reqd}}, 'pnum';
+ },
+ pnum =>
+ sub {
+ push @{$STYLE{TLF}{reqd}}, 'tnum';
+ push @{$STYLE{TOsF}{reqd}}, 'tnum';
+ push @{$STYLE{LF}{nice}}, 'pnum';
+ push @{$STYLE{OsF}{nice}}, 'pnum';
+ },
+);
+
+
+############################################################################
+
+
+sub main {
+ ARGV::parse_options();
+
+ my @fonts = map { Fontinfo::parse_fontinfo($_) } @ARGV;
+
+ create_logfile(@fonts);
+ Fontinfo::assert_unique(@fonts);
+
+ # We can only handle the '-inferiors=auto' option now,
+ # since this requires knowing which inferior figures this font supports;
+ # so we have to do the font info parsing first.
+ if ($ARGV{inferiors} eq 'auto') {
+ Fontinfo::handle_auto_inferiors(@fonts);
+ }
+
+ # For each font, figure out the styles, shapes and encodings to generate
+ my @worklist
+ = cleanup(expand_encodings(expand_shapes(expand_styles(@fonts))));
+
+ # Organize the worklist by family, encoding, style, series and shape
+ my %fddata;
+ for my $item (@worklist) {
+ my $family = $item->{font}{family};
+ my $encoding = $item->{encoding}[1];
+ my $style = $item->{style};
+ my $series = $item->{font}{series};
+ my $shape = $item->{fdshape};
+ my $minsize = $item->{font}{minsize};
+ my $maxsize = $item->{font}{maxsize};
+
+ push @{$fddata{$family}{$encoding}{$style}{$series}{$shape}},
+ [ $minsize, $maxsize, $item->{fontname} ];
+ }
+
+ # Decide to which weights and widths we'll map the standard NFSS codes
+ decide_nfss_mappings(@fonts);
+
+ log_worklist(@worklist);
+
+ if (!$ARGV{dryrun}) {
+ # Create the LaTeX support files
+ while (my ($fam, $famdata) = each %fddata) {
+ LaTeX::write_stylefile($fam, $famdata);
+ while (my ($enc, $encdata) = each %$famdata) {
+ while (my ($sty, $stydata) = each %$encdata) {
+ LaTeX::write_fdfile($fam, $enc, $sty, $stydata);
+ }
+ }
+ }
+
+ # Create (and execute) commands for otftotfm
+ make_commands(@worklist);
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Return a list with all unique entries from the input
+#-----------------------------------------------------------------------
+sub uniq {
+ my %seen;
+ return grep { !$seen{$_}++ } @_;
+}
+
+#-----------------------------------------------------------------------
+# Determine which figure styles to create for each font;
+# return a list of (font, style) tuples
+#-----------------------------------------------------------------------
+sub expand_styles {
+ return map { my $font = $_;
+ map { { font => $font, style => $_ } }
+ grep { has_all_reqd_features($font, $STYLE{$_}) }
+ keys %STYLE
+ }
+ @_;
+}
+
+#-----------------------------------------------------------------------
+# Check if $font has all features mentioned in the 'reqd' subtable of $target
+#-----------------------------------------------------------------------
+sub has_all_reqd_features {
+ my ($font, $target) = @_;
+
+ return 0 unless defined $target;
+ for my $prereq (@{$target->{reqd}}) {
+ return 0 if !$font->{feature}{$prereq};
+ }
+ return 1;
+}
+
+#-----------------------------------------------------------------------
+# Determine which shapes to create for each (font, style) combination;
+# return a list of (font, style, shape) tuples
+#-----------------------------------------------------------------------
+sub expand_shapes {
+ return map { my ($font, $style) = @{$_}{qw(font style)};
+ map { { font => $font, style => $style, shape => $_ } }
+ grep { has_some_reqd_shapes($font, $SHAPE{$_}) }
+ @{$STYLE{$style}{shapes}};
+ }
+ @_;
+}
+
+#-----------------------------------------------------------------------
+# Check if $font has at least one of the features mentioned
+# in the 'reqd' subtable of $target
+#-----------------------------------------------------------------------
+sub has_some_reqd_shapes {
+ my ($font, $target) = @_;
+
+ return 0 unless defined $target->{code}{$font->{basicshape}};
+ return 1 unless @{$target->{reqd}};
+ return grep { $font->{feature}{$_} } @{$target->{reqd}};
+}
+
+#-----------------------------------------------------------------------
+# Determine which encodings to use for each (font, style, shape) combi;
+# return a list of (font, style, shape, encoding) tuples
+#-----------------------------------------------------------------------
+sub expand_encodings {
+ return
+ map { my ($font, $style, $shape) = @{$_}{qw(font style shape)};
+ my @encodings
+ = $shape eq 'textcomp' ? (['fontools_ts1', 'ts1'])
+ : $style eq 'Orn' ? ([Fontinfo::get_orn($font), 'u'])
+ : map { [lc $_, lc $_] } @{$ARGV{encoding}}
+ ;
+ map { { font => $font,
+ style => $style,
+ shape => $shape,
+ encoding => $_,
+ }
+ }
+ @encodings;
+ }
+ @_;
+}
+
+#-----------------------------------------------------------------------
+# Add some finishing touches to the work list
+#-----------------------------------------------------------------------
+sub cleanup {
+ my @worklist = @_;
+
+ WORKITEM:
+ for my $item (@worklist) {
+ my ($font, $style, $shape, $encoding)
+ = @{$item}{qw(font style shape encoding)};
+
+ # don't generate smallcaps version of TS1-encoded fonts,
+ # as these contain the same glyphs as the regular version
+ if ($font->{is_smallcaps}) {
+ if ($shape eq 'textcomp') {
+ $item = 0;
+ next WORKITEM;
+ }
+ else {
+ $shape = 'smallcaps';
+ }
+ }
+
+ # generate unique name for this font
+ $item->{fontname} = join '-', grep { $_ } $font->{name},
+ lc $style,
+ lc $SHAPE{$shape}{name},
+ lc $encoding->[1];
+
+ # look up NFSS code for font's shape
+ $item->{fdshape} = $SHAPE{$shape}{code}{$font->{basicshape}};
+
+ # compile list of OpenType features to use with this font
+ my %feature = map { ($_ => 1) }
+ grep { $font->{feature}{$_} }
+ ( @{$STYLE{$style}{reqd}},
+ @{$STYLE{$style}{nice}},
+ @{$SHAPE{$shape}{reqd}},
+ @{$SHAPE{$shape}{nice}},
+ );
+ if ($feature{lnum} && $feature{onum}) {
+ delete $feature{lnum};
+ }
+ $item->{features} = [ sort keys %feature ];
+
+ # add finishing touches to name and NFSS code of encoding
+ $item->{encoding}[0]
+ =~ s/\A (ot1|t1|ly1|lgr|t2[abc]|t3|ts3) \z/fontools_$1/xms;
+ $item->{encoding}[1] = uc $item->{encoding}[1];
+
+ $item->{cmdline} = make_cmdline($item);
+ }
+
+ return grep { $_ } @worklist;
+}
+
+#-----------------------------------------------------------------------
+# Modify NFSS_WEIGHT and _WIDTH tables: pick one choice for each NFSS code
+#-----------------------------------------------------------------------
+sub decide_nfss_mappings {
+ my ( %weight, %width );
+ for my $font (@_) {
+ $weight{ $font->{weight} } //= $font->{weight_class};
+ $width{ $font->{width} } //= $font->{width_class};
+ }
+
+ NFSSWEIGHT:
+ for my $nfssweight (@NFSS_WEIGHT) {
+ $NFSS_WEIGHT{$nfssweight}
+ = [ grep { $weight{$_} } @{$NFSS_WEIGHT{$nfssweight}} ];
+ }
+
+ # Some trickery to handle the case where the ul/ub codes are mapped
+ # but the el/eb codes are still empty. We try two things:
+ # 1. if there is a Thin (Heavy) weight and this is less extreme
+ # than the weight mapped to ul (ub), we map Thin (Heavy) to ul (ub)
+ # 2. otherwise we move the ul/ub weight to the el/eb position,
+ # unless that weight is the Ultralight/Ultrabold weight
+ if ( !$ARGV{el} and !$ARGV{ul} ) {
+ if ( @{$NFSS_WEIGHT{ul}} and !@{$NFSS_WEIGHT{el}} ) {
+ if ( $weight{thin}
+ and $weight{thin} > $weight{$NFSS_WEIGHT{ul}[0]} ) {
+ $NFSS_WEIGHT{el} = [ 'thin', ];
+ }
+ elsif ( $NFSS_WEIGHT{ul}[0] ne 'ultralight' ) {
+ $NFSS_WEIGHT{el} = [ shift @{$NFSS_WEIGHT{ul}} ];
+ }
+ }
+ }
+ if ( !$ARGV{eb} and !$ARGV{ub} ) {
+ if ( @{$NFSS_WEIGHT{ub}} and !@{$NFSS_WEIGHT{eb}} ) {
+ if ( $weight{heavy}
+ and $weight{heavy} < $weight{$NFSS_WEIGHT{ub}[0]}
+ ) {
+ $NFSS_WEIGHT{eb} = [ 'heavy', ]
+ unless @{$NFSS_WEIGHT{b}}
+ and $weight{$NFSS_WEIGHT{b}[0]} > $weight{heavy};
+ }
+ elsif ( $NFSS_WEIGHT{ub}[0] ne 'ultrabold' ) {
+ $NFSS_WEIGHT{eb} = [ shift @{$NFSS_WEIGHT{ub}} ];
+ }
+ }
+ }
+
+ # Special case: if we don't have Regular but we *do* have Medium,
+ # move Medium from the "sb" list to the "m" (i.e., Regular) one.
+ if ( !@{$NFSS_WEIGHT{''}} and $weight{medium} ) {
+ $NFSS_WEIGHT{''} = [ 'medium' ];
+ $NFSS_WEIGHT{sb}
+ = [ grep { $_ ne 'medium' } @{$NFSS_WEIGHT{medium}} ];
+ }
+
+ # Some more trickery to map the sl code to Book or Text (but of course
+ # only if sl is empty and Book/Text is lighter than Regular)
+ if ( !@{$NFSS_WEIGHT{sl}} ) {
+ $NFSS_WEIGHT{sl}
+ = [ grep { $weight{$_} < $weight{$NFSS_WEIGHT{''}[0]} }
+ @{$NFSS_WEIGHT{''}}
+ ];
+ }
+
+ NFSSWIDTH:
+ for my $nfsswidth (@NFSS_WIDTH) {
+ for my $width ( @{$NFSS_WIDTH{$nfsswidth}} ) {
+ if ( $width{$width} ) {
+ $NFSS_WIDTH{$nfsswidth} = [ $width ];
+ next NFSSWIDTH;
+ }
+ }
+ $NFSS_WIDTH{$nfsswidth} = [];
+ }
+}
+
+#-----------------------------------------------------------------------
+# Log all fonts, styles, encodings etc. we're going to create
+#-----------------------------------------------------------------------
+sub create_logfile {
+ my @fonts = @_;
+
+ if (-e $ARGV{logfile}) {
+ print "[INFO] file '$ARGV{logfile}' already exists;\n" .
+ " appending new log data to end\n\n";
+ }
+ open my $LOG, '>>', $ARGV{logfile}
+ or die "$0: cannot create $ARGV{logfile}: $!";
+
+ print {$LOG} <<"END_ARGUMENTS";
+
+
+############################################################################
+
+
+@{[ POSIX::strftime("[%F %T]", localtime time) ]} $0, version $VERSION
+
+ "$ARGV{cmdline}"
+
+----------------------------------------------------------------------------
+
+I'm using the following options:
+
+ encoding(s): @{[ join ', ', @{$ARGV{encoding}} ]}
+ NFSS: $ARGV{nfss} @{[ $ARGV{nfss} eq 'rm' ? '(serif)'
+ : $ARGV{nfss} eq 'sf' ? '(sanserif)'
+ : $ARGV{nfss} eq 'tt' ? '(typewriter)'
+ : '(unknown)'
+ ]}
+
+ lining: @{[ $ARGV{lining} ? 'yes' : 'no' ]}
+ oldstyle: @{[ $ARGV{oldstyle} ? 'yes' : 'no' ]}
+ proportional: @{[ $ARGV{proportional} ? 'yes' : 'no' ]}
+ tabular: @{[ $ARGV{tabular} ? 'yes' : 'no' ]}
+ ts1: @{[ $SHAPE{textcomp} ? 'yes' : 'no' ]}
+ smallcaps: @{[ $ARGV{smallcaps} ? 'yes' : 'no' ]}
+ swash: @{[ $ARGV{swash} ? 'yes' : 'no' ]}
+ titling: @{[ $ARGV{titling} ? 'yes' : 'no' ]}
+ superiors: @{[ $ARGV{superiors} ? 'yes' : 'no' ]}
+ inferiors: $ARGV{inferiors}
+ ornaments: @{[ $ARGV{ornaments} ? 'yes' : 'no' ]}
+ fractions: @{[ $ARGV{fractions} ? 'yes' : 'no' ]}
+ ligatures: @{[ $ARGV{ligatures} ? 'yes' : 'no' ]}
+
+ dry run/real: @{[ $ARGV{dryrun} ? 'dry run' : 'real' ]}
+ auto/manual: @{[ $ARGV{manual} ? 'manual' : 'auto' ]}
+ target: $ARGV{target}
+ extra: @{[ $ARGV{extra} || '<empty>' ]}
+
+ figurekern: @{[ $ARGV{figurekern} ? 'keep' : 'remove' ]}
+ mergewidths: @{[ $ARGV{mergewidths} ? 'yes' : 'no' ]}
+ mergeweights: @{[ $ARGV{mergeweights} ? 'yes' : 'no' ]}
+ mergeshapes: @{[ $ARGV{mergeshapes} ? 'yes' : 'no' ]}
+
+ nfssweight: @{[ join q{, }, @{$ARGV{nfssweight}} or '-' ]}
+ nfsswidth: @{[ join q{, }, @{$ARGV{nfsswidth}} or '-' ]}
+
+END_ARGUMENTS
+
+ my %fontfamilies = map { ( $_->{family} => 1 ) } @fonts;
+ my @fontfamilies = keys %fontfamilies;
+ if (scalar @fontfamilies > 1) {
+ warn <<"END_WARNING_MULTIPLE_FAMILIES";
+[WARNING] Your fonts seem to belong to multiple families:
+
+ @{[ join( "\n" . q{ } x 10, sort @fontfamilies ) ]}
+
+ "autoinst" performs best when installing one family at a time.
+ If you think your fonts should all be in the same family,
+ you might have found a bug in autoinst's font info parsing.
+
+ Please see the log file $ARGV{logfile} for details on how
+ the fonts' families, weights, widths and shapes were parsed.
+
+END_WARNING_MULTIPLE_FAMILIES
+
+ # increase verbosity if necessary, to log all relevant info
+ if ($ARGV{verbose} < 1) {
+ $ARGV{verbose} = 1;
+ }
+ }
+
+ $ARGV{logfile} = $LOG;
+
+ return if $ARGV{verbose} < 1;
+
+ print {$LOG} '-' x 76 . "\n\nResults of font info parsing:\n";
+
+ for my $font (@fonts) {
+ print {$LOG} <<"END_PARSE_FONT";
+
+ $font->{filename}
+ Name: $font->{name}
+ Family: $font->{family}
+ Weight: $font->{weight} ($font->{weight_class})
+ Width: $font->{width}
+ Shape: $font->{shape} @{[ $font->{is_smallcaps}
+ ? '(smallcaps)' : '' ]}
+ Size: $font->{minsize}-$font->{maxsize}
+ Features: @{[ join ', ', sort keys %{$font->{feature}} ]}
+END_PARSE_FONT
+ }
+}
+
+#-----------------------------------------------------------------------
+# Log all fonts, styles, encodings etc. we're going to create
+#-----------------------------------------------------------------------
+sub log_worklist {
+ my @worklist
+ = sort { $a->{font}{filename} cmp $b->{font}{filename}
+ || $a->{encoding}[1] cmp $b->{encoding}[1]
+ || $a->{style} cmp $b->{style}
+ } @_;
+
+ my $LOG = $ARGV{logfile};
+
+ print {$LOG} "\n" . '-' x 76 . "\n\nNFSS mappings:\n\n";
+ for my $weight (@NFSS_WEIGHT) {
+ printf {$LOG} " %-3s => %s\n",
+ $weight || 'm', $NFSS_WEIGHT{$weight}[0] || '';
+ }
+ printf {$LOG} "\n";
+ for my $width (@NFSS_WIDTH) {
+ printf {$LOG} " %-3s => %s\n",
+ $width || 'm', $NFSS_WIDTH{$width}[0] || '';
+ }
+ printf {$LOG} "\n";
+
+ return if $ARGV{verbose} < 1;
+
+ my ($prevfn, $prevsty, $prevenc) = ('') x 3;
+ my @cmds;
+ for my $item (@worklist) {
+ if ($prevfn ne $item->{font}{filename}) {
+ print {$LOG} <<"END_FONTINFO";
+
+ ------------------------------------------------------------------------
+
+ $item->{font}{filename}
+
+ Generating these encodings, figure styles and shapes:
+
+ ENC STYLE SHAPE FEATURES USED
+END_FONTINFO
+ }
+ if ($prevenc ne $item->{encoding}[1]
+ || $prevsty ne $item->{style}) {
+ print {$LOG} "\n";
+ }
+ printf {$LOG} " %-3s %-4s %-4s %s\n",
+ $item->{encoding}[1],
+ $item->{style},
+ $item->{fdshape},
+ join(', ', @{$item->{features}}),
+ ;
+ $prevfn = $item->{font}{filename};
+ $prevsty = $item->{style};
+ $prevenc = $item->{encoding}[1];
+
+ push @cmds, $item->{cmdline};
+ }
+
+ return if $ARGV{verbose} < 2;
+ print {$LOG} join "\n\n", @cmds;
+ print {$LOG} "\n";
+ close $LOG;
+}
+
+#-----------------------------------------------------------------------
+# Generate all otftotfm commands, and either save or execute them
+#-----------------------------------------------------------------------
+sub make_commands {
+ my @worklist = @_;
+
+ my @commands = map { $_->{cmdline} } @worklist;
+
+ # make sure the last command *does* call updmap
+ $commands[-1] =~ s/--no-updmap//xms if $ARGV{updmap};
+
+ if ($ARGV{manual}) {
+ open my $BAT, '>', 'autoinst.bat'
+ or die "[ERROR] Can't create 'autoinst.bat': $!";
+ print {$BAT} "$_\n" for @commands;
+ close $BAT;
+ }
+ else {
+ if (grep { system $_ } @commands) {
+ warn <<"END_OTFTOTFM_WARNING";
+[WARNING] one or more calls to 'otftotfm' failed;
+ please see the messages above.
+
+ Note that you can safely ignore any warnings
+ "bad UNICODING (‘germandbls’ has no encoding)"
+ or "bad ligature (‘ff’ has no encoding)"
+END_OTFTOTFM_WARNING
+ }
+ }
+
+ return;
+}
+
+# The official names for various coding schemes
+my %SCHEME = (
+ fontools_ot1 => 'TEX TEXT',
+ fontools_t1 => 'EXTENDED TEX FONT ENCODING - LATIN',
+ fontools_ts1 => 'TEX TEXT COMPANION SYMBOLS 1---TS1',
+ fontools_ly1 => 'TEX TYPEWRITER AND WINDOWS ANSI',
+ fontools_lgr => 'GREEK FONT ENCODING - LGR',
+ fontools_t2a => 'TEX CYRILLIC FONT ENCODING - T2A',
+ fontools_t2b => 'TEX CYRILLIC FONT ENCODING - T2B',
+ fontools_t2c => 'TEX CYRILLIC FONT ENCODING - T2C',
+ fontools_t3 => 'TEX IPA ENCODING',
+ fontools_ts3 => 'TEX IPA SYMBOL ENCODING',
+);
+
+#-----------------------------------------------------------------------
+# Generate a command line for otftotfm
+#-----------------------------------------------------------------------
+sub make_cmdline {
+ my $item = shift;
+
+ if ( !$ARGV{ligatures} ) {
+ @{$item->{features}} = grep { $_ ne 'liga' } @{$item->{features}};
+ }
+ return join ' ', 'otftotfm',
+ ($ARGV{manual} ? '--pl' : '--automatic'),
+ "--encoding=$item->{encoding}[0]",
+ set_targetdirs($item->{font}{family}),
+ '--no-updmap',
+ ($item->{font}{filename} =~ m/[.]ttf\z/xms
+ ? '--no-type1'
+ : ''),
+ ($SCHEME{$item->{encoding}[0]}
+ ? qq(--coding-scheme="$SCHEME{$item->{encoding}[0]}")
+ : ''),
+ (map { "--feature=$_" } @{$item->{features}}),
+ ($ARGV{ligatures}
+ ? ( '--ligkern="f i =: fi"',
+ '--ligkern="f l =: fl"',
+ '--ligkern="f f =: ff"',
+ '--ligkern="ff i =: ffi"',
+ '--ligkern="ff l =: ffl"' )
+ : ''),
+ $STYLE{$item->{style}}{extra},
+ $SHAPE{$item->{shape}}{extra},
+ $ARGV{extra},
+ qq("$item->{font}{filename}"),
+ $item->{fontname},
+ ;
+}
+
+#-----------------------------------------------------------------------
+# Return a string with all "directory" options for otftotfm set
+#-----------------------------------------------------------------------
+my @FILETYPES = qw(tfm vf type1 truetype);
+
+sub set_targetdirs {
+ my $family = shift;
+
+ my %dir = map { ($_ => File::Spec->catdir(
+ $ARGV{target},
+ 'fonts',
+ $_,
+ $ARGV{vendor},
+ $ARGV{typeface} || $family))
+ }
+ @FILETYPES;
+
+ $dir{$_} = File::Spec->catdir(
+ $ARGV{target}, 'fonts', $_, 'dvips', $ARGV{typeface} || $family)
+ for qw(enc map);
+
+ File::Path::make_path(values %dir) unless $ARGV{dryrun};
+
+ my $result = join ' ', map { "--${_}-directory=$dir{$_}" } @FILETYPES;
+ $result .= " --encoding-directory=$dir{enc} --map-file="
+ . File::Spec->catfile($dir{map}, "${family}.map");
+
+ return $result;
+}
+
+
+############################################################################
+
+
+package ARGV;
+
+my $USAGE =<<'END_USAGE';
+
+'autoinst' is a wrapper around Eddie Kohler's TypeTools
+(http://www.lcdf.org/type/), for installing OpenType fonts in LaTeX.
+
+Usage: autoinst [options] font[s]
+
+Possible options:
+ -encoding=ENC[,ENC]* Specify text encoding(s) (default: OT1,T1,LY1)
+
+ -(no)lining Toggle creation of lining digits
+ -(no)oldstyle Toggle creation of oldstyle digits
+ -(no)proportional Toggle creation of proportional digits
+ -(no)tabular Toggle creation of tabular digits
+ -(no)ts1 Toggle creation of TS1 fonts
+ -(no)smallcaps Toggle creation of smallcaps shape
+ -(no)swash Toggle creation of swash shape
+ -(no)titling Toggle creation of titling shape
+ -(no)superiors Toggle creation of fonts with superior characters
+ -noinferiors
+ -inferiors=[none|auto|subs|sinf|dnom]
+ Use this style for subscripts (see docs)
+ -(no)ornaments Toggle creation of ornament fonts
+ -(no)fractions Toggle creation of fonts with digits for fractions
+ -(no)ligatures Toggle manual addition of f-ligatures to font
+
+ -serif Install font as serif font
+ -sanserif Install font as sanserif font
+ -typewriter Install font as typewriter font
+
+ -defaultlining
+ -defaultoldstyle Specify which figure style should be
+ -defaulttabular considered 'default' for this font; see docs
+ -defaultproportional
+
+ -extra="TEXT" Add TEXT to the command for 'otftotfm'
+ -target="DIRECTORY" Install files into specified TEXMF tree
+ -vendor="VENDOR" Only used for naming directories
+ -typeface="TYPEFACE" Only used for naming directories
+ -(no)updmap Toggle running of updmap
+ -manual Manual mode (see documentation)
+
+ -(no)figurekern Keep or remove kerns between tabular figures
+ -(no)mergewidths Merge Condended/Extended subfamilies with main
+ -(no)mergeweights Merge separate weights with main family
+ -(no)mergeshapes Merge separate shapes with main family
+
+ -nfssweight=xx=yyyy Map the "xx" NFSS code to the "yyyy" weight
+ -nfsswidth=xx=yyyy Map the "xx" NFSS code to the "yyyy" width
+
+ -help Print this text and exit
+ -doc Print the complete documentation and exit
+ -dryrun Don't generate fonts, only log what would be done
+ -logfile="FILE" Write log to "FILE" (default: <fontfamily>.log)
+ -verbose Print more data to log file
+ (repeat for even higher verbosity)
+ -version Print version number and exit
+ font[s] The fonts (.otf or .ttf format) to install.
+
+Please report any bugs or suggestions to <marcpenninga@gmail.com>.
+END_USAGE
+
+# Default values for the command-line arguments
+%ARGV = (
+ encoding => 'OT1,T1,LY1',
+ textcomp => '2', # 0 = no, 1 = yes, 2 = ('T1' ? yes : no)
+ lining => '1', # 0 = no, 1 = yes
+ oldstyle => '1', # 0 = no, 1 = yes
+ proportional => '1', # 0 = no, 1 = yes
+ tabular => '1', # 0 = no, 1 = yes
+ smallcaps => '1', # 0 = no, 1 = yes
+ swash => '1', # 0 = no, 1 = yes
+ titling => '1', # 0 = no, 1 = yes
+ superiors => '1', # 0 = no, 1 = yes
+ inferiors => 'none', # values: none, auto, subs, sinf, dnom
+ ornaments => '1', # 0 = no, 1 = yes
+ fractions => '0', # 0 = no, 1 = yes
+ ligatures => '2', # 0 = no, 1 = yes, 2 = ('tt' ? no : yes)
+ nfss => '',
+ fig_height => 'lnum',
+ fig_width => 'tnum',
+ extra => '',
+ target => '',
+ vendor => 'lcdftools',
+ typeface => '',
+ updmap => '1', # 0 = no, 1 = yes
+ manual => '0', # 0 = no, 1 = yes
+ dryrun => '0', # 0 = no, 1 = yes
+ logfile => '',
+ figurekern => '1', # 0 = no, 1 = yes
+ mergewidths => '1', # 0 = no, 1 = yes
+ mergeweights => '1', # 0 = no, 1 = yes
+ mergeshapes => '1', # 0 = no, 1 = yes
+ verbose => 0,
+ nfsswidth => [],
+ nfssweight => [],
+);
+
+#-----------------------------------------------------------------------
+# Process command-line arguments
+#-----------------------------------------------------------------------
+sub parse_options {
+ $ARGV{cmdline} = join ' ', ($0, @ARGV);
+
+ Getopt::Long::GetOptions(
+ 'help|?' => sub { print $USAGE; exit },
+ 'version' => sub { print "$VERSION\n"; exit },
+ 'doc' => sub { Pod::Usage::pod2usage(-verbose => 2) },
+ 'encoding=s' => \$ARGV{encoding},
+ 'ts1!' => \$ARGV{textcomp},
+ 'lining!' => \$ARGV{lining},
+ 'oldstyle!' => \$ARGV{oldstyle},
+ 'proportional!' => \$ARGV{proportional},
+ 'tabular!' => \$ARGV{tabular},
+ 'smallcaps!' => \$ARGV{smallcaps},
+ 'swash!' => \$ARGV{swash},
+ 'titling!' => \$ARGV{titling},
+ 'superiors!' => \$ARGV{superiors},
+ 'noinferiors' => sub { $ARGV{inferiors} = 'none' },
+ 'inferiors:s' => \$ARGV{inferiors},
+ 'ornaments!' => \$ARGV{ornaments},
+ 'fractions!' => \$ARGV{fractions},
+ 'ligatures!' => \$ARGV{ligatures},
+ 'serif' => sub { $ARGV{nfss} = 'rm' },
+ 'sanserif' => sub { $ARGV{nfss} = 'sf' },
+ 'typewriter' => sub { $ARGV{nfss} = 'tt' },
+ 'defaultlining' => sub { $ARGV{fig_height} = 'lnum' },
+ 'defaultoldstyle' => sub { $ARGV{fig_height} = 'onum' },
+ 'defaulttabular' => sub { $ARGV{fig_width} = 'tnum' },
+ 'defaultproportional' => sub { $ARGV{fig_width} = 'pnum' },
+ 'extra=s' => \$ARGV{extra},
+ 'target=s' => \$ARGV{target},
+ 'vendor=s' => \$ARGV{vendor},
+ 'typeface=s' => \$ARGV{typeface},
+ 'updmap!' => \$ARGV{updmap},
+ 'dryrun' => \$ARGV{dryrun},
+ 'manual' => \$ARGV{manual},
+ 'figurekern!' => \$ARGV{figurekern},
+ 'mergewidths!' => \$ARGV{mergewidths},
+ 'mergeweights!' => \$ARGV{mergeweights},
+ 'mergeshapes!' => \$ARGV{mergeshapes},
+ 'mergesmallcaps!' => \$ARGV{mergeshapes},
+ 'logfile=s' => \$ARGV{logfile},
+ 'verbose+' => \$ARGV{verbose},
+ 'nfssweight=s%' => sub {
+ my ( $ignored, $key, $values ) = @_;
+ push @{$ARGV{nfssweight}},
+ "$key=$values";
+ my @values = split m/,/, lc $values;
+ $key = q{} if $key eq 'm';
+ $NFSS_WEIGHT{$key}
+ = [ @values, @{$NFSS_WEIGHT{$key}} ];
+ $ARGV{$key} = 'user-defined';
+ },
+ 'nfsswidth=s%' => sub {
+ my ( $ignored, $key, $values ) = @_;
+ my @values = split m/,/, lc $values;
+ push @{$ARGV{nfsswidth}},
+ "$key=$values";
+ $key = q{} if $key eq 'm';
+ $NFSS_WIDTH{$key}
+ = [ @values, @{$NFSS_WIDTH{$key}} ];
+ $ARGV{$key} = 'user-defined';
+ },
+ )
+ or die "$USAGE";
+
+ die "$USAGE" unless @ARGV;
+
+ delete $SHAPE{smallcaps} unless $ARGV{smallcaps};
+ delete $SHAPE{swash} unless $ARGV{swash};
+
+ delete $STYLE{Titl} unless $ARGV{titling};
+ delete $STYLE{Sup} unless $ARGV{superiors};
+ delete $STYLE{Orn} unless $ARGV{ornaments};
+ delete @STYLE{qw(Numr Dnom)} unless $ARGV{fractions};
+ $ARGV{inferiors} ||= 'auto';
+ if ($ARGV{inferiors} eq 'auto') { $STYLE{Inf}{reqd} = ['auto'] }
+ elsif ($ARGV{inferiors} eq 'subs') { $STYLE{Inf}{reqd} = ['subs'] }
+ elsif ($ARGV{inferiors} eq 'sinf') { $STYLE{Inf}{reqd} = ['sinf'] }
+ elsif ($ARGV{inferiors} eq 'dnom') { $STYLE{Inf}{reqd} = ['dnom'] }
+ else {
+ $ARGV{inferiors} = 'none';
+ delete $STYLE{Inf}
+ }
+
+ $ARGV{encoding} =~ s/\s+//xmsg;
+ my @textencodings = grep { $_ ne 'TS1' }
+ map { uc }
+ split /,/, $ARGV{encoding};
+ $ARGV{encoding} = \@textencodings;
+
+ # TS1-encoded fonts are generated if:
+ # - the user explicitly asked for TS1, or
+ # - the text encodings contain T1 and the user didn't turn off TS1
+ unless ( (grep { $_ eq 'T1' } @{$ARGV{encoding}} and $ARGV{textcomp})
+ or $ARGV{textcomp} == 1 )
+ {
+ delete $SHAPE{textcomp};
+ }
+
+ # Determine NFSS classification of this family, if the user
+ # didn't explicitly specify it
+ eval {
+ if ( !$ARGV{nfss} ) {
+ # EXPERIMENTAL: parse "post" table to see if font is fixed-width
+ my $cmd = qq(otfinfo --dump-table "post" "$ARGV[0]");
+ open my $otfinfo, '-|:raw', $cmd
+ or die "could not fork(): $!";
+ my $post_table = do { local $/; <$otfinfo> };
+ close $otfinfo
+ or die "'$cmd' failed";
+
+ my $is_fixed_pitch = unpack '@12N', $post_table;
+
+ $ARGV{nfss} = $is_fixed_pitch ? 'tt'
+ : $ARGV[0] =~ m/mono(?!type)/xmsi ? 'tt'
+ : $ARGV[0] =~ m/sans/xmsi ? 'sf'
+ : 'rm'
+ ;
+ }
+ } or warn "[WARNING] $@";
+
+ # If the user didn't explicitly say anything about ligatures,
+ # activate them unless the font is a typewriter font.
+ if ($ARGV{ligatures} == 2) {
+ $ARGV{ligatures} = $ARGV{nfss} ne 'tt' ? 1 : 0;
+ }
+ # Fix the %STYLE table to take 'default' figure styles into account.
+ $STYLE_DEFAULTS{$ARGV{fig_height}}();
+ $STYLE_DEFAULTS{$ARGV{fig_width}}();
+
+ delete @STYLE{qw(LF TLF)} unless $ARGV{lining};
+ delete @STYLE{qw(OsF TOsF)} unless $ARGV{oldstyle};
+ delete @STYLE{qw(LF OsF)} unless $ARGV{proportional};
+ delete @STYLE{qw(TLF TOsF)} unless $ARGV{tabular};
+
+ my $localtarget = File::Spec->catdir( Cwd->getcwd(), 'autoinst_output' );
+ if ($ARGV{manual}) {
+ warn "[WARNING] option '-target' overridden by '-manual'!\n"
+ if $ARGV{target};
+ $ARGV{target} = $localtarget;
+ $ARGV{updmap} = 0;
+ }
+ elsif (!$ARGV{target}) {
+ my $kpsepath = eval {
+ qx( kpsewhich -expand-var='\$TEXMFLOCAL:\$TEXMFHOME' );
+ };
+ if (!$kpsepath) {
+ warn <<"END_WARNING_KPSEWHICH";
+[WARNING] Call to "kpsewhich" failed.
+ Maybe your TeX system doesn't use the kpathsea library?
+
+ Consider using the "-target" command line option
+ to specify a TEXMF tree where autoinst should install all files.
+
+END_WARNING_KPSEWHICH
+ }
+ else {
+ for my $dir ( split m/[:;]/xms, substr $kpsepath, 0, -1 ) {
+ if (-w $dir) { $ARGV{target} = $dir; last }
+ if (-e $dir) { next }
+ my $par = File::Spec->catdir( $dir, File::Spec->updir() );
+ if (-w $par) { $ARGV{target} = $dir; last }
+ }
+ }
+ }
+
+ if (!$ARGV{target}) {
+ $ARGV{target} = $localtarget;
+ $ARGV{updmap} = 0;
+ warn <<"END_WARNING_DUMPING_FILES";
+[WARNING] No user-writable TEXMF-tree found!
+
+ I'm putting all generated files in "$ARGV{target}".
+
+ Please install these files into a suitable TEXMF directory,
+ update the filename database and run 'updmap' (or similar);
+ see your TeX installation's documentation.
+END_WARNING_DUMPING_FILES
+ }
+
+ if (!$ARGV{figurekern}) {
+ my @digits = qw(zero one two three four five six seven eight nine);
+ my $tkern
+ = join ' ', map { my $left = $_;
+ map { qq(--ligkern="$left {} $_") } @digits
+ }
+ @digits;
+
+ $STYLE{TLF}{extra} = $tkern;
+ $STYLE{TOsF}{extra} = $tkern;
+ }
+}
+
+
+############################################################################
+
+
+package Fontinfo;
+
+#-----------------------------------------------------------------------
+# Return ref to hash with all relevant info about this font
+#-----------------------------------------------------------------------
+sub parse_fontinfo {
+ my ($filename) = @_;
+
+ my $info = {
+ filename => $filename,
+ width => 'regular',
+ weight => 'regular',
+ shape => 'roman',
+ minsize => 0,
+ maxsize => 0,
+ is_smallcaps => 0,
+ weight_class => 0,
+ width_class => 0,
+ };
+
+ parse_basicinfo($info);
+ parse_sizeinfo($info);
+ parse_features($info);
+
+ return $info;
+}
+
+# table for converting digits in font names to text (safer for LaTeX)
+my @DIGITS = qw(Zero One Two Three Four Five Six Seven Eight Nine);
+
+#-----------------------------------------------------------------------
+# Get some basic info (family, weight, width, shape) about this font
+#-----------------------------------------------------------------------
+sub parse_basicinfo {
+ my $info = shift;
+
+ my $cmd = qq(otfinfo --info "$info->{filename}");
+ open my $otfinfo, '-|', $cmd
+ or die "[ERROR] could not fork(): $!";
+ my %data = map { my ($k,$v) = m/\A\s* ([^:]+?) \s*:\s* ([^\r\n]+)/xms;
+ $k =~ s/\s+//xmsg;
+ $v =~ s/\s+//xmsg;
+ (lc $k => $v);
+ }
+ grep { m/\A\s* [^:]+? \s*:\s* [^\r\n]+/xms } <$otfinfo>;
+ close $otfinfo
+ or die "[ERROR] '$cmd' failed";
+
+ $data{family} = $data{preferredfamily} || $data{family};
+ $data{subfamily} = $data{preferredsubfamily} || $data{subfamily};
+ $data{fullname} =~ s/\A$data{family}//xms;
+ $data{fullname} = lc $data{fullname};
+
+ # clean up family name (it's used in LaTeX command names)
+ $data{family} =~ s/\A(?: Adobe | DTL | FF | ITC | LT | MT)//xms;
+ $data{family} =~ s/(?: LT | MT)(?: Std | Pro )\z//xms;
+ $data{family} =~ s/(?<= Kievit ) OT//xms;
+ $data{family} =~ s/ Std \z//xms;
+ $data{family} =~ s/(\d)/$DIGITS[$1]/xmsge;
+ $data{family} =~ s/[^A-Za-z]+//xmsg;
+
+ # Sometimes the relevant info is in Fullname, sometimes in Subfamily;
+ # so we need to test against both
+ my $fullinfo = lc "$data{subfamily} | $data{fullname}";
+
+ # We need to be careful when parsing the font info; in particular
+ # we must parse 'UltraCondensed' as 'Regular' weight
+ # and 'UltraCondensed' width, not as 'Ultra' weight and 'Condensed' width.
+ # The following rules should prevent accidents:
+ # 1. Search for matching widths before matching weights
+ # (as none of the widths is a proper substring of some weight)
+ # 2. Remove any recognised search string from the 'fullinfo'
+ # 3. Test the weights 'medium' and 'regular' *last*, since these strings
+ # may also occur in Subfamily without indicating the weight;
+ # so we only take them to mean weight if we find no other hit.
+ for my $width ( mqrs(@WIDTHS) ) {
+ if ($fullinfo =~ m/${width}/xms) {
+ $info->{width} = $width;
+ my $widths = join '|', mqrs(@WIDTHS);
+ $fullinfo =~ s/${widths}//gxmsi;
+ last;
+ }
+ }
+ for my $weight ( mqrs(@WEIGHTS), qw(medium regular) ) {
+ if ($fullinfo =~ m/${weight}/xms) {
+ $info->{weight} = $weight;
+ my $weights = join '|', mqrs(@WEIGHTS), qw(medium regular);
+ $fullinfo =~ s/${weights}//gxmsi;
+ last;
+ }
+ }
+ for my $shape ( mqrs( keys %NFSS_SHAPE ) ) {
+ if ($fullinfo =~ m/${shape}/xms) {
+ $info->{shape} = $shape;
+ my $shapes = join '|', mqrs( keys %NFSS_SHAPE );
+ $fullinfo =~ s/${shapes}//gxmsi;
+ last;
+ }
+ }
+
+ # In many font families, each font is in a subfamily of its own;
+ # so we remove width, weight and shape from the 'subfamily' value.
+ my $subst;
+ $data{subfamily} =~ s/$info->{width}//xmsi;
+ $data{subfamily} =~ s/$info->{weight}//xmsi;
+ $data{subfamily} =~ s/$info->{shape}//xmsi;
+
+ $info->{name} = $data{postscriptname};
+ $info->{family} = $data{family};
+ $info->{subfamily} = $data{subfamily};
+
+ # Take care to unabbreviate weight and width; CondensedUltra fonts
+ # might end up as 'ultracondensed' instead of 'ultrablackcondensed'!
+ if (exists $UNABBREVIATE{ $info->{width} }) {
+ $info->{width} = $UNABBREVIATE{ $info->{width} };
+ }
+ if (exists $UNABBREVIATE{ $info->{weight} }) {
+ $info->{weight} = $UNABBREVIATE{ $info->{weight} };
+ }
+ if (exists $UNABBREVIATE{ $info->{shape} }) {
+ $info->{shape} = $UNABBREVIATE{ $info->{shape} };
+ }
+
+ if ($ARGV{mergeshapes}) {
+ my $shapes = join '|', mqrs( qw(it italic) );
+ if ( $info->{family} =~ m/(.+?) (${shapes}) \z/xmsi
+ and ( $info->{shape} eq 'regular'
+ or $info->{shape} eq ( $UNABBREVIATE{ lc($2) } // lc($2) )
+ )
+ ) {
+ $info->{family} = $1;
+ $info->{shape} = $UNABBREVIATE{ lc($2) } // lc($2);
+ }
+
+ $shapes = join '|', mqrs( qw(sc smallcaps) );
+ if ( $info->{family} =~ m/(.+?) (${shapes}) \z/xmsi ) {
+ $info->{family} = $1;
+ $info->{is_smallcaps} = 1;
+ }
+ }
+
+ # Some font families put different widths into separate families;
+ # we provide an option to merge these with the 'main' font family.
+ if ($ARGV{mergewidths}) {
+ my $widths = join '|', mqrs(@WIDTHS);
+ if ( $info->{family} =~ m/(.+?) (${widths}) \z/xmsi
+ and ( $info->{width} eq 'regular'
+ or $info->{width} eq ( $UNABBREVIATE{ lc($2) } // lc($2) )
+ )
+ ) {
+ $info->{family} = $1;
+ $info->{width} = $UNABBREVIATE{ lc($2) } // lc($2);
+ }
+ }
+
+ # Some font families put extreme weights into separate families;
+ # we provide an option to merge these with the 'main' font family.
+ if ($ARGV{mergeweights}) {
+ my $weights = join '|', mqrs(@WEIGHTS), qw(medium regular);
+ if ( $info->{family} =~ m/(.+?) (${weights}) \z/xmsi
+ and ( $info->{weight} eq 'regular'
+ or $info->{weight} eq ( $UNABBREVIATE{ lc($2) } // lc($2) )
+ )
+ ) {
+ $info->{family} = $1;
+ $info->{weight} = $UNABBREVIATE{ lc($2) } // lc($2);
+ }
+ }
+
+ # Fix confusion about "Text": weight vs part of familyname.
+ # In the latter case, we strip it off anyway.
+ $info->{family} =~ s/text \z//xmsi;
+
+ if ( !$ARGV{logfile} ) {
+ $ARGV{logfile} = sprintf "%s.log", lc $info->{family}
+ }
+
+ $info->{basicshape} = $NFSS_SHAPE{$info->{shape}};
+
+ # We define 'series' as 'weight + width'. This matches NFSS,
+ # but contradicts how most fonts are named (which is 'width + weight').
+ $info->{series}
+ = ($info->{width} eq 'regular') ? $info->{weight}
+ : ($info->{weight} eq 'regular') ? $info->{width}
+ : $info->{weight} . $info->{width}
+ ;
+
+ # EXPERIMENTAL: we extract the usWeightClass and usWidthClass
+ # properties from the font's OS/2 table
+ eval {
+ my $cmd = qq(otfinfo --dump-table "OS/2" "$info->{filename}");
+ open $otfinfo, '-|:raw', $cmd
+ or die "could not fork(): $!";
+ my $os2_table = do { local $/; <$otfinfo> };
+ close $otfinfo
+ or die "'$cmd' failed";
+ @{$info}{qw(weight_class width_class)} = unpack '@4n @6n', $os2_table;
+ } or warn "[WARNING] $@";
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Re-order argument list so that longer strings come before shorter ones
+#
+# This is needed when matching a string against a list of patterns
+# where some of the patterns may be substrings of other patterns;
+# then we want the *longest* matching pattern, so we test the patterns
+# in descending order of length.
+#-----------------------------------------------------------------------
+sub mqrs {
+ return map { quotemeta } reverse sort { length($a) <=> length($b) } @_;
+}
+
+#-----------------------------------------------------------------------
+# Fill the 'feature' field in the 'info' struct with a list of
+# all features this font supports
+#-----------------------------------------------------------------------
+sub parse_features {
+ my $info = shift;
+
+ my $cmd = qq(otfinfo --features "$info->{filename}");
+ open my $otfinfo, '-|', $cmd
+ or die "[ERROR] could not fork(): $!";
+ %{$info->{feature}} = map { (substr($_, 0, 4) => 1) } <$otfinfo>;
+ close $otfinfo
+ or die "[ERROR] '$cmd' failed";
+
+ $cmd = qq(otfinfo --tables "$info->{filename}");
+ open $otfinfo, '-|', $cmd
+ or die "[ERROR] could not fork(): $!";
+ $info->{feature}{kern} = 1 if grep { m/\d+ \s+ kern/xms } <$otfinfo>;
+ close $otfinfo
+ or die "[ERROR] '$cmd' failed";
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Fill the 'minsize' and 'maxsize' fields in the 'info' struct
+# with limits of optical design size range of this font
+#-----------------------------------------------------------------------
+sub parse_sizeinfo {
+ my $info = shift;
+
+ my $cmd = qq(otfinfo --optical-size "$info->{filename}");
+ open my $otfinfo, '-|', $cmd
+ or die "[ERROR] could not fork(): $!";
+
+ if (my ($minsize, $maxsize)
+ = <$otfinfo> =~ m/[(] ([\d.]+) \s* pt, \s*
+ ([\d.]+) \s* pt \s* []]/xms
+ ) {
+ # fix some known bugs
+ if ($info->{name} eq 'GaramondPremrPro-It'
+ && $minsize == 6 && $maxsize == 8.9)
+ {
+ ($minsize, $maxsize) = (8.9, 14.9);
+ }
+ elsif ($info->{family} eq 'KeplerStd'
+ && $info->{subfamily} =~ m/Caption/xms
+ && $minsize == 8.9 && $maxsize == 13.9)
+ {
+ ($minsize, $maxsize) = (6, 8.9);
+ }
+ elsif ($info->{family} eq 'KeplerStd'
+ && $info->{subfamily} =~ m/Subhead/xms
+ && $minsize == 8.9 && $maxsize == 13.9)
+ {
+ ($minsize, $maxsize) = (13.9, 23);
+ }
+ elsif ($info->{family} eq 'KeplerStd'
+ && $info->{subfamily} =~ m/Display/xms
+ && $minsize == 8.9 && $maxsize == 13.9)
+ {
+ ($minsize, $maxsize) = (23, 72);
+ }
+
+ @{$info}{qw(minsize maxsize)} = ($minsize, $maxsize);
+ }
+ close $otfinfo
+ or die "[ERROR] '$cmd' failed";
+
+ return;
+}
+
+
+# Error messages, used in assert_unique()
+my $ERR_DETAIL =<<'END_ERR_DETAIL';
+[ERROR] I've parsed both %s
+ and %s as
+
+ Family: %s
+ Weight: %s
+ Width: %s
+ Shape: %s
+ Size: %s-%s
+
+END_ERR_DETAIL
+
+my $ERR_PARSE =<<'END_ERR_PARSE';
+[ERROR] I failed to parse all fonts in a unique way;
+ presumably some fonts have unusual widths, weights or shapes.
+
+ Try one of the following:
+ - Run 'autoinst' on a smaller set of fonts,
+ omitting the ones that weren't parsed correctly;
+ - Add the missing widths, weights or shapes to the tables
+ 'NFSS_WIDTH', 'NFSS_WEIGHT' or 'NFSS_SHAPE' near the top
+ of the source code;
+
+ Please also send a bug report to the author.
+
+END_ERR_PARSE
+
+#-----------------------------------------------------------------------
+# Assert all parsed font infos are unique
+#-----------------------------------------------------------------------
+sub assert_unique {
+ my @fonts = @_;
+
+ # These attributes should uniquely identify each font
+ my @attributes
+ = qw(family weight width shape minsize maxsize is_smallcaps);
+
+ my (%seen, $err_details);
+ for my $font (@fonts) {
+ my $key = join "\x00", @{$font}{ @attributes };
+
+ if ($seen{$key}) {
+ $err_details .= sprintf $ERR_DETAIL,
+ $seen{$key}{filename},
+ $font->{filename},
+ @{$font}{ @attributes };
+ }
+ else {
+ $seen{$key} = $font;
+ }
+ }
+
+ # Die with detailed error message if the font infos aren't unique
+ if ($err_details) {
+ die $err_details, $ERR_PARSE;
+ }
+
+ return 1;
+}
+
+#-----------------------------------------------------------------------
+# Generate (font-specific) encoding vector for ornament glyphs
+#-----------------------------------------------------------------------
+sub get_orn {
+ my ($font) = @_;
+
+ my $fontfile = $font->{filename};
+ my $enc_name = $font->{family} . '_orn';
+
+ if (not -e "$enc_name.enc") {
+ # Default ornament names: 'orn.' plus three digits
+ my @encoding = map { sprintf "orn.%03d", $_ } 1 .. 256;
+
+ my $cmd = qq(otfinfo --glyphs "$font->{filename}");
+ open my $otfinfo, '-|', $cmd
+ or die "[ERROR] could not fork(): $!";
+ chop(my @glyphnames = <$otfinfo>);
+ close $otfinfo
+ or die "[ERROR] '$cmd' failed";
+
+ # Test for some known alternative names (probably not exhaustive)
+ my @ornaments
+ = sort grep { m/\A (?: orn|u2022[.]|word[.]|hand|bullet[.])
+ | [.]orn \z/xms
+ }
+ @glyphnames;
+
+ @encoding[0 .. $#ornaments] = @ornaments;
+
+ open my $ORN, '>', "$enc_name.enc"
+ or die "[ERROR] Can't create '$enc_name.enc': $!";
+
+ print {$ORN} "/$font->{family}OrnamentEncoding [\n";
+ map { print {$ORN} " /$_\n" } @encoding[0 .. 255];
+ print {$ORN} "] def\n";
+ close $ORN;
+ }
+
+ return $enc_name;
+}
+
+#-----------------------------------------------------------------------
+# Handle the -inferiors=auto option
+#-----------------------------------------------------------------------
+sub handle_auto_inferiors {
+ FONT:
+ for my $font (@_) {
+ for my $inf (qw(subs sinf dnom)) {
+ if (exists $font->{feature}{$inf}) {
+ $ARGV{inferiors} = $inf;
+ $STYLE{Inf}{reqd} = [$inf];
+ last FONT;
+ }
+ }
+ }
+
+ # If we didn't find any inferior figures, delete the 'Inf' entry
+ # from the %STYLE table to indicate we don't want to generate this style.
+ delete $STYLE{Inf} if $ARGV{inferiors} eq 'auto';
+}
+
+
+############################################################################
+
+
+package LaTeX;
+
+#-----------------------------------------------------------------------
+# Create a LaTeX style file
+#-----------------------------------------------------------------------
+sub write_stylefile {
+ my ($fam, $data) = @_;
+
+ my %seen = %{ get_keys($data) };
+
+ my $fn = sprintf "%s.sty", $fam;
+ my $dir = File::Spec->catdir(
+ $ARGV{target}, 'tex', 'latex', $ARGV{typeface} || $fam);
+ File::Path::make_path($dir);
+ $fn = File::Spec->catfile($dir, $fn);
+ open my $STY, '>', $fn
+ or die "[ERROR] Can't create '$fn': $!";
+
+ print {$STY} <<"END_STY_HEADER";
+%% Generated by autoinst on $TODAY
+%%
+\\NeedsTeXFormat{LaTeX2e}
+\\ProvidesPackage{$fam}
+ [$TODAY (autoinst) Style file for $fam.]
+
+END_STY_HEADER
+
+ my $enc = join ',', grep { $_ ne 'OT1' } @{$ARGV{encoding}};
+
+ print {$STY} "\\RequirePackage[$enc]{fontenc}\n" if $enc;
+ print {$STY} "\\RequirePackage{textcomp}\n" if $seen{TS1};
+
+ print {$STY} <<'END_STY_FONTAXES_START';
+\IfFileExists{mweights.sty}{\RequirePackage{mweights}}{}
+\IfFileExists{fontaxes.sty}{
+ \RequirePackage{fontaxes}
+END_STY_FONTAXES_START
+
+
+ if ($seen{nw} or $seen{sw}) {
+ print {$STY} <<'END_STY_FONTAXES_SW';
+ \DeclareRobustCommand\swshape{\not@math@alphabet\swshape\relax
+ \fontprimaryshape\itdefault\fontsecondaryshape\swdefault\selectfont}
+ \fa@naming@exception{shape}{{n}{sw}}{nw}
+ \fa@naming@exception{shape}{{it}{sw}}{sw}
+
+END_STY_FONTAXES_SW
+ }
+
+ if ($seen{Sup}) {
+ print {$STY} <<'END_STY_FONTAXES_SUP';
+ \fa@naming@exception{figures}{{superior}{proportional}}{Sup}
+ \fa@naming@exception{figures}{{superior}{tabular}}{Sup}
+ \def\sufigures{\@nomath\sufigures
+ \fontfigurestyle{superior}\selectfont}
+ \DeclareTextFontCommand{\textsu}{\sufigures}
+ \let\textsuperior\textsu
+
+END_STY_FONTAXES_SUP
+ }
+
+ if ($seen{Inf}) {
+ print {$STY} <<'END_STY_FONTAXES_INF';
+ \fa@naming@exception{figures}{{inferior}{proportional}}{Inf}
+ \fa@naming@exception{figures}{{inferior}{tabular}}{Inf}
+ \def\infigures{\@nomath\infigures
+ \fontfigurestyle{inferior}\selectfont}
+ \DeclareTextFontCommand{\textin}{\infigures}
+ \let\textinferior\textin
+
+END_STY_FONTAXES_INF
+ }
+
+ if ($seen{Titl}) {
+ print {$STY} <<'END_STY_FONTAXES_TITL';
+ \fa@naming@exception{figures}{{titlingshape}{proportional}}{Titl}
+ \fa@naming@exception{figures}{{titlingshape}{tabular}}{Titl}
+ \def\tlshape{\@nomath\tlshape
+ \fontfigurestyle{titlingshape}\selectfont}
+ \DeclareTextFontCommand{\texttl}{\tlshape}
+ \let\texttitling\texttl
+
+END_STY_FONTAXES_TITL
+ }
+
+ if ($seen{Orn}) {
+ print {$STY} <<'END_STY_FONTAXES_ORN';
+ \fa@naming@exception{figures}{{ornament}{proportional}}{Orn}
+ \fa@naming@exception{figures}{{ornament}{tabular}}{Orn}
+ \def\ornaments{\@nomath\ornaments
+ \fontencoding{U}\fontfigurestyle{ornament}\selectfont}
+ \DeclareTextFontCommand{\textornaments}{\ornaments}
+ \providecommand{\ornament}[1]{\textornaments{\char##1}}
+
+END_STY_FONTAXES_ORN
+ }
+
+ if ($seen{Numr}) {
+ print {$STY} <<'END_STY_FONTAXES_NUMR';
+ \fa@naming@exception{figures}{{numerators}{proportional}}{Numr}
+ \fa@naming@exception{figures}{{numerators}{tabular}}{Numr}
+
+END_STY_FONTAXES_NUMR
+ }
+
+ if ($seen{Dnom}) {
+ print {$STY} <<'END_STY_FONTAXES_DNOM';
+ \fa@naming@exception{figures}{{denominators}{proportional}}{Dnom}
+ \fa@naming@exception{figures}{{denominators}{tabular}}{Dnom}
+
+END_STY_FONTAXES_DNOM
+ }
+
+ print {$STY} "}{}\n\n";
+
+ print {$STY} <<"END_STY_XKEYVAL";
+\\IfFileExists{xkeyval.sty}{
+ \\newcommand*{\\$fam\@scale}{1}
+ \\RequirePackage{xkeyval}
+ \\DeclareOptionX{scale}{\\renewcommand*{\\$fam\@scale}{##1}}
+ \\DeclareOptionX{scaled}{\\renewcommand*{\\$fam\@scale}{##1}}
+}{
+ \\let\\DeclareOptionX\\DeclareOption
+ \\let\\ExecuteOptionsX\\ExecuteOptions
+ \\let\\ProcessOptionsX\\ProcessOptions
+}
+
+END_STY_XKEYVAL
+
+ if ($seen{LF} or $seen{TLF}) {
+ print {$STY}
+ "\\DeclareOptionX{lining}{\\edef\\$fam\@figurestyle{LF}}\n";
+ }
+ if ($seen{OsF} or $seen{TOsF}) {
+ print {$STY}
+ "\\DeclareOptionX{oldstyle}{\\edef\\$fam\@figurestyle{OsF}}\n";
+ }
+ if ($seen{TLF} or $seen{TOsF}) {
+ print {$STY}
+ "\\DeclareOptionX{tabular}{\\edef\\$fam\@figurealign{T}}\n";
+ }
+ if ($seen{LF} or $seen{OsF}) {
+ print {$STY}
+ "\\DeclareOptionX{proportional}{\\edef\\$fam\@figurealign{}}\n";
+ }
+
+ print {$STY} <<"END_STY_MAINFONT";
+\\DeclareOptionX{mainfont}{
+ \\renewcommand{\\familydefault}{\\$ARGV{nfss}default}
+}
+END_STY_MAINFONT
+
+ my $defaults
+ = $seen{OsF} ? 'oldstyle,proportional'
+ : $seen{TOsF} ? 'oldstyle,tabular'
+ : $seen{LF} ? 'lining,proportional'
+ : $seen{TLF} ? 'lining,tabular'
+ : die "[ERROR] Internal bug, please report!";
+
+ my $default_bold;
+ for my $series (qw(heavy black extrabold demibold semibold bold)) {
+ if ( $seen{$series} ) {
+ print {$STY}
+ "\\DeclareOptionX{$series}{\\edef\\bfseries\@$ARGV{nfss}",
+ "{$series}}\n";
+ $default_bold = $series;
+ }
+ }
+ $defaults .= ",$default_bold" if $default_bold;
+
+ my $default_regular;
+ for my $series (qw(medium book text regular)) {
+ if ( $seen{$series} ) {
+ print {$STY}
+ "\\DeclareOptionX{$series}{\\edef\\mdseries\@$ARGV{nfss}",
+ "{$series}}\n";
+ $default_regular = $series;
+ }
+ }
+ $defaults .= ",$default_regular" if $default_regular;
+
+ print {$STY} <<"END_STYLE_REST";
+\\ExecuteOptionsX{$defaults}
+\\ProcessOptionsX\\relax
+
+\\renewcommand*
+ {\\$ARGV{nfss}default}
+ {$fam-\\$fam\@figurealign\\$fam\@figurestyle}
+
+\\endinput
+END_STYLE_REST
+
+ close $STY;
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Walk a nested dictionary, return lookup table with all keys
+#-----------------------------------------------------------------------
+sub get_keys {
+ my $dict = shift;
+ my $seen = shift || {};
+
+ while (my ($k, $v) = each %$dict) {
+ $seen->{$k} = 1;
+ get_keys($v, $seen) if ref $v eq 'HASH';
+ }
+
+ return $seen;
+}
+
+#-----------------------------------------------------------------------
+# Create a .fd file for NFSS
+#-----------------------------------------------------------------------
+sub write_fdfile {
+ my ($fam, $enc, $sty, $data) = @_;
+
+ my $fn = sprintf "%s%s-%s.fd", $enc, $fam, $sty;
+ my $dir = File::Spec->catdir(
+ $ARGV{target}, 'tex', 'latex', $ARGV{typeface} || $fam);
+ File::Path::make_path($dir);
+ $fn = File::Spec->catfile($dir, $fn);
+ open my $FD, '>', $fn
+ or die "[ERROR] Can't create '$fn': $!";
+
+ print {$FD} <<"END_FD_HEADER";
+%% Generated by autoinst on $TODAY
+%%
+\\ProvidesFile{${enc}${fam}-${sty}.fd}
+ [$TODAY (autoinst) Font definitions for ${enc}/${fam}-${sty}.]
+
+\\expandafter\\ifx\\csname ${fam}\@scale\\endcsname\\relax
+ \\let\\${fam}\@\@scale\\\@empty
+\\else
+ \\edef\\${fam}\@\@scale{s*[\\csname ${fam}\@scale\\endcsname]}%
+\\fi
+
+\\DeclareFontFamily{${enc}}{${fam}-${sty}}{@{[
+ $ARGV{nfss} eq 'tt' ? '\hyphenchar\font=-1' : ""
+]}}
+
+END_FD_HEADER
+
+ while (my ($series, $fdseries) = each %$data) {
+ print {$FD} "\n% ---- $series ----\n\n";
+ while (my ($shape, $fdshape) = each %$fdseries) {
+ print {$FD}
+ "\\DeclareFontShape{$enc}{${fam}-${sty}}{$series}{$shape}{\n";
+ my @sizes = sort { $a->[0] <=> $b->[0] }
+ @{$fdshape};
+ $sizes[0][0] = $sizes[-1][1] = '';
+ $sizes[$_][0] = $sizes[$_ - 1][1] for (1 .. $#sizes);
+ for my $size (@sizes) {
+ print {$FD} " <$size->[0]-$size->[1]> ",
+ "\\${fam}\@\@scale $size->[2]\n";
+ }
+ print {$FD} "}{}\n\n";
+ }
+
+ # ssub italic for missing slanted, or vice versa
+ while (my ($shape, $replace) = each %SSUB_SHAPE) {
+ if (!exists $fdseries->{$shape} && exists $fdseries->{$replace}) {
+ print {$FD} <<"END_SSUB_SHAPE";
+\\DeclareFontShape{$enc}{${fam}-${sty}}{$series}{$shape}{
+ <-> ssub * ${fam}-${sty}/${series}/${replace}
+}{}
+
+END_SSUB_SHAPE
+ $fdseries->{$shape} = 1;
+ }
+ }
+ }
+
+ print {$FD} <<"END_COMMENT";
+%
+% Extra 'ssub' rules to map the standard NFSS codes to our fancy names
+%
+END_COMMENT
+ my %seen;
+ NFSSWEIGHT:
+ for my $nfssweight (@NFSS_WEIGHT) {
+ NFSSWIDTH:
+ for my $nfsswidth (@NFSS_WIDTH) {
+ my $nfssseries = ( $nfssweight . $nfsswidth) || 'm';
+
+ for my $weight ( @{$NFSS_WEIGHT{$nfssweight}} ) {
+ $weight = '' if $weight eq 'regular';
+ for my $width ( @{$NFSS_WIDTH{$nfsswidth}} ) {
+ $width = '' if $width eq 'regular';
+ my $series = ( $weight . $width ) || 'regular';
+ if ( exists $data->{$series} ) {
+ print {$FD} "\n% $nfssseries --> $series\n\n";
+ for my $shape ( keys %{$data->{$series}} ) {
+ print {$FD} <<"END_SSUB_SERIES";
+\\DeclareFontShape{$enc}{${fam}-${sty}}{$nfssseries}{$shape}{
+ <-> ssub * ${fam}-${sty}/${series}/${shape}
+}{}
+
+END_SSUB_SERIES
+ $seen{$nfssseries}{$shape} = 1;
+ }
+ next NFSSWIDTH;
+ }
+ }
+ }
+ }
+ }
+
+ # Add ssub rules to map bx to b
+ for my $shape ( keys %{$seen{b}} ) {
+ if ( !exists $seen{bx}{$shape} ) {
+ print {$FD} <<"END_SSUB_BX";
+\\DeclareFontShape{$enc}{${fam}-${sty}}{bx}{$shape}{
+ <-> ssub * ${fam}-${sty}/b/${shape}
+}{}
+
+END_SSUB_BX
+ }
+ }
+
+ print {$FD} "\\endinput\n";
+ close $FD;
+
+ return;
+}
+
+
+############################################################################
+
+
+package main;
+
+main();
+
+
+__END__
+
+
+############################################################################
+
+
+ To create the documentation:
+
+ pod2man --center="Marc Penninga" --release="fontools" --section=1 \
+ autoinst - | groff -Tps -man - | ps2pdf - autoinst.pdf
+
+
+=pod
+
+=head1 NAME
+
+autoinst - wrapper around the F<LCDF TypeTools>,
+for installing and using OpenType fonts in LaTeX.
+
+
+=head1 SYNOPSIS
+
+B<autoinst> [I<options>] B<fontfile(s)>
+
+
+=head1 DESCRIPTION
+
+Eddie Kohler's I<LCDF TypeTools> are superb tools for installing
+OpenType fonts in LaTeX, but they can be hard to use:
+they need many, often long, command lines
+and don't generate the F<fd> and F<sty> files LaTeX needs.
+B<autoinst> simplifies the use of the I<TypeTools> for font installation
+by generating and executing all commands for I<otftotfm>
+and by creating and installing all necessary F<fd> and F<sty> files.
+
+Given a family of font files (in F<otf> or F<ttf> format),
+B<autoinst> will create several LaTeX font families:
+
+=over 2
+
+=over 3
+
+=item -
+
+Four text families (with lining and oldstyle digits,
+each in both tabular and proportional variants),
+all with the following shapes:
+
+=over 2
+
+=over 8
+
+=item I<n>
+
+Roman (i.e., upright) text
+
+=item I<it>, I<sl>
+
+Italic and slanted (sometimes called oblique) text
+
+=item I<sc>
+
+Small caps
+
+=item I<scit>, I<scsl>
+
+Italic and slanted small caps
+
+=item I<sw>
+
+Swash
+
+=item I<nw>
+
+"Upright swash"
+
+=back
+
+=back
+
+=item -
+
+For each T1-encoded text family:
+a family of TS1-encoded symbol fonts, in roman, italic and slanted shapes.
+
+=item -
+
+Families with superiors, inferiors, numerators and denominators,
+in roman, italic and slanted shapes.
+
+=item -
+
+Families with "Titling" characters;
+these "... replace the default glyphs
+with corresponding forms designed specifically for titling.
+These may be all-capital and/or larger on the body,
+and adjusted for viewing at larger sizes"
+(according to the OpenType Specification).
+
+=item -
+
+An ornament family, also in roman, italic and slanted shapes.
+
+=back
+
+=back
+
+Of course, if your fonts don't contain italics, oldstyle digits, small caps
+etc., the corresponding shapes and families are not created.
+In addition, the creation of most families and shapes can be controlled
+by the user (see L</"COMMAND-LINE OPTIONS"> below).
+
+These families use the I<FontPro> project's naming scheme:
+I<< <FontFamily>-<Suffix> >>, where I<< <Suffix> >> is:
+
+=over 8
+
+=item I<LF>
+
+proportional (i.e., figures have varying widths) lining figures
+
+=item I<TLF>
+
+tabular (i.e., all figures have the same width) lining figures
+
+=item I<OsF>
+
+proportional oldstyle figures
+
+=item I<TOsF>
+
+tabular oldstyle figures
+
+=item I<Sup>
+
+superior characters (note that most fonts have only an incomplete set of
+superior characters: digits, some punctuation and the letters I<abdeilmnorst>;
+normal forms are used for other characters)
+
+=item I<Inf>
+
+inferior characters; usually only digits and some punctuation,
+normal forms for other characters
+
+=item I<Titl>
+
+Titling characters; see above.
+
+=item I<Orn>
+
+ornaments
+
+=item I<Numr>
+
+numerators
+
+=item I<Dnom>
+
+denominators
+
+=back
+
+The individual fonts are named I<< <FontName>-<suffix>-<shape>-<enc> >>,
+where I<< <suffix> >> is the same as above (but in lowercase),
+I<< <shape> >> is either empty, "sc" or "swash",
+and I<< <enc> >> is the encoding (also in lowercase).
+A typical name in this scheme would be "FiraSans-Light-osf-sc-ly1".
+
+
+=head2 About the log file
+
+B<autoinst> writes some info about what it thinks it's doing to a log file.
+By default this is called F<< <fontfamily>.log >>,
+but this choice can be overridden by the user;
+see the I<-logfile> command-line option in L</"COMMAND-LINE OPTIONS"> below.
+If this log file already exists, B<autoinst> will append its data to the end
+rather than overwrite it.
+Use the I<-verbose> command-line option to ask for more detailed info.
+
+
+=head2 A note for MiKTeX users
+
+Automatically installing the fonts into a suitable TEXMF tree
+(as B<autoinst> tries to do by default) only works for TeX-installations
+that use the F<kpathsea> library; with TeX distributions that implement
+their own directory searching (such as MiKTeX), B<autoinst> will complain
+that it cannot find the F<kpsewhich> program and move all generated files
+into a subdirectory C<./autoinst_output/> of the current directory.
+If you use such a TeX distribution, you should either move these files
+to their correct destinations by hand, or use the I<-target> option
+(see L</"COMMAND-LINE OPTIONS"> below) to manually specify a TEXMF tree.
+
+Also, some OpenType fonts contain so many kerning pairs that the resulting
+F<pl> and F<vpl> files are too big for MiKTeX's F<pltotf> and F<vptovf>;
+the versions that come with W32TeX (F<http://www.w32tex.org>)
+and TeXLive (F<http://tug.org/texlive>) don't seem to have this problem.
+
+
+=head2 A note for MacTeX users
+
+By default, B<autoinst> will try to install all generated files into
+the $TEXMFLOCAL tree; when this directory isn't user-writable,
+it will use the $TEXMFHOME tree instead. Unfortunately, MacTeX's version
+of C<updmap-sys> (which is called behind the scenes) doesn't search
+in $TEXMFHOME, and hence MacTeX will not find the new fonts.
+
+To remedy this, either run B<autoinst> as root (so that it can install
+everything into $TEXMFLOCAL) or manually run C<updmap -user> to tell
+TeX about the files in $TEXMFHOME.
+The latter option does, however, have some caveats;
+see F<https://tug.org/texlive/scripts-sys-user.html>.
+
+
+=head2 Using the fonts in your LaTeX documents
+
+B<autoinst> generates a style file for using the fonts in LaTeX documents,
+named F<< <FontFamily>.sty >>. This style file also takes care of loading
+the F<fontenc> and F<textcomp> packages.
+To use the fonts, add the command C<<< \usepackage{I<< <FontFamily> >>} >>>
+to the preamble of your document.
+
+This style file defines a number of options:
+
+=over 4
+
+=item C<mainfont>
+
+Redefine C<\familydefault> to make this font the main font
+for the document.
+This is a no-op if the font is installed as a serif font;
+but if the font is installed as a sanserif or typewriter font,
+this option saves you from having to redefine C<\familydefault>
+yourself.
+
+=item C<lining>, C<oldstyle>, C<tabular>, C<proportional>
+
+Choose which figure style to use.
+The defaults are "oldstyle" and "proportional" (if available).
+
+=item C<<< scale=I<< <number> >> >>>
+
+Scale the font by a factor of I<< <number> >>.
+E.g., to increase the size of the font by 5%, use
+C<<< \usepackage[scale=1.05]{I<< <FontFamily> >>} >>>.
+May also be spelled C<scaled>.
+
+This option is only available when you have the F<xkeyval> package installed.
+
+=item C<medium>, C<book>, C<text>, C<regular>
+
+Select the weight that LaTeX will use as the "regular" weight;
+the default is C<regular>.
+
+=item C<heavy>, C<black>, C<extrabold>, C<demibold>, C<semibold>, C<bold>
+
+Select the weight that LaTeX will use as the "bold" weight;
+the default is C<bold>.
+
+=back
+
+The previous two groups of options will only work if
+you have the F<mweights> package installed.
+
+The style file will also try to load the F<fontaxes> package
+(on CTAN), which gives easy access to various font shapes and styles.
+Using the machinery set up by F<fontaxes>, the generated style file
+defines a number of commands (which take the text to be typeset as argument)
+and declarations (which don't take arguments, but affect all text up to
+the end of the current group) to access titling, superior and inferior
+characters:
+
+
+ DECLARATION COMMAND SHORT FORM OF COMMAND
+
+ \tlshape \texttitling \texttl
+ \sufigures \textsuperior \textsu
+ \infigures \textinferior \textin
+
+
+In addition, the C<\swshape> and C<\textsw> commands are redefined to place
+swash on F<fontaxes>' secondary shape axis (F<fontaxes> places it on the
+primary shape axis) to make them behave properly when nested, so that
+C<\swshape\upshape> will give upright swash.
+
+There are no commands for accessing the numerator and denominator
+fonts; these can be selected using F<fontaxes>' standard commands,
+e.g., C<\fontfigurestyle{numerator}\selectfont>.
+
+The style file also provides a command C<<< \ornament{I<< <number> >>} >>>,
+where C<<< I<< <number> >> >>> is a number from 0 to the total number of
+ornaments minus one. Ornaments are always typeset using the current family,
+series and shape. A list of all ornaments in a font can be created by
+running LaTeX on the file F<nfssfont.tex> (part of a standard
+LaTeX installation) and supplying the name of the ornament font.
+
+To access ornament glyphs, B<autoinst> creates a font-specific encoding file
+F<< <FontFamily>_orn.enc >>,
+but only if that file doesn't yet exist in the current directory.
+This is a deliberate feature that allows you to provide your own encoding
+vector, e.g. if your fonts use non-standard glyph names for ornaments.
+
+These commands are only generated for existing shapes and number styles;
+no commands are generated for shapes and styles that don't exist,
+or whose generation was turned off by the user.
+Also these commands are built on top of F<fontaxes>, so if that package
+cannot be found, you're limited to using the lower-level commands from
+standard NFSS (C<\fontfamily>, C<\fontseries>, C<\fontshape> etc.).
+
+
+=head2 On the choice of text encoding
+
+By default, B<autoinst> generates text fonts with OT1, T1 and LY1
+encodings, and the generated style files use LY1 as the default text encoding.
+LY1 has been chosen over T1 because it has some empty slots to accommodate
+the additional ligatures found in many OpenType fonts.
+Other encodings can be chosen using the I<-encoding> option
+(see L</"COMMAND-LINE OPTIONS"> below).
+
+
+=head2 NFSS codes
+
+LaTeX's New Font Selection System (NFSS)
+identifies fonts by a combination of family,
+series (the concatenation of weight and width), shape and size.
+B<autoinst> parses the font's metadata
+(more precisely: the output of C<otfinfo --info>)
+to determine these parameters.
+When this fails (usually because the font family contains uncommon weights,
+widths or shapes),
+B<autoinst> ends up with different fonts having the I<same> values
+for these font parameters; such fonts cannot be used in NFSS,
+since there's no way distinguish them.
+When B<autoinst> detects such a situation, it will print an error message
+and abort.
+If that happens, either rerun B<autoinst> on a smaller set of fonts,
+or add the missing widths, weights and shapes to the tables C<NFSS_WIDTH>,
+C<NFSS_WEIGHT> and C<NFSS_SHAPE>, near the top of the source code.
+Please also send a bug report (see L<AUTHOR> below).
+
+The mapping of shapes to NFSS codes is done using the following table:
+
+ SHAPE CODE
+ -------------------------------- ----
+ Roman, Upright n
+ Italic, Cursive, Kursive it
+ Oblique, Slant(ed), Incline(d) sl
+
+(I<Exception:> Adobe Silentium Pro contains two Roman shapes;
+we map the first of these to "n", for the second one we (ab)use the "it" code
+as this family doesn't contain an Italic shape.)
+
+The mapping of weights and widths to NFSS codes is a more complex,
+two-step proces.
+In the first step, all fonts are assigned a "series" name that is simply
+the concatenation of its weight and width
+(after expanding any abbreviations and converting to lowercase).
+A font with "Cond" width and "Ultra" weight will then be known
+as "ultrablackcondensed".
+
+In the second step, B<autoinst> tries to map all combinations of NFSS codes
+(ul, el, l, sl, m, sb, b, eb and ub for weights;
+uc, ec, c, sc, m, sx, x, ex and ux for widths) to actual fonts.
+Of course, not all 81 combinations of these NFSS weights and widths will map
+to existing fonts;
+and conversely it may not be possible to assign every existing font
+a unique code in a sane way (especially for the weights, some font families
+offer more choices or finer granularity than NFSS's codes can handle;
+e.g., Fira Sans contains fifteen(!) different weights,
+including an additional "Medium" weight between Regular and Semibold).
+
+B<autoinst> tries hard to ensure that the most common NFSS codes
+(and high-level commands such as C<\bfseries>,
+which are built on top of those codes) will "just work".
+
+To see exactly which NFSS codes map to which fonts, see the log file
+(pro tip: run B<autoinst> with the I<-dryrun> option
+to check the chosen mapping beforehand).
+The I<-nfssweight> and I<-nfsswidth> command-line options can be used
+to finetune the mapping between NFSS codes and fonts.
+
+To access specific weights or widths,
+one can always use the C<\fontseries> command with the full series name
+(i.e., C<\fontseries{demibold}\selectfont>).
+
+
+=head1 COMMAND-LINE OPTIONS
+
+B<autoinst> tries hard to do The Right Thing (TM) by default,
+so you usually won't really need these options;
+but most aspects of its operation can be fine-tuned if you want to.
+
+You may use either one or two dashes before options,
+and option names may be shortened to a unique prefix
+(e.g., B<-encoding> may be abbreviated to B<-enc> or even B<-en>,
+but B<-e> is ambiguous (it may mean either B<-encoding> or B<-extra>)).
+
+
+=over 4
+
+=item B<-version>
+
+Print B<autoinst>'s version number and exit.
+
+=item B<-help>
+
+Print a (relatively) short help text and exit.
+
+=item B<-dryrun>
+
+Don't generate output; just parse input fonts and write
+a log file saying what B<autoinst> would have done.
+
+=item B<-logfile>=I<filename>
+
+Write log data to F<filename> instead of the default F<< <fontfamily>.log >>.
+If the file already exists, B<autoinst> appends to it;
+it doesn't overwrite an existing file.
+
+=item B<-verbose>
+
+Add more details to the log file. Repeat this option for even more info.
+
+=item B<-encoding>=I<encoding[,encoding]>
+
+Generate the specified encoding(s) for the text fonts.
+Multiple encodings may be specified as a comma-separated list:
+C<-encoding=OT1,T1,LY1> (without spaces!).
+The style file passes these to F<fontenc> in the specified order,
+so the I<last> one will become the default text encoding of your document.
+
+The default choice of encodings is "OT1,T1,LY1".
+For each encoding, a file F<< <encoding>.enc >> (in all I<lowercase>!)
+should be somewhere where F<otftotfm> can find it. Suitable encoding files
+for OT1, T1/TS1, LY1, LGR, T2A/B/C and T3/TS3 come with B<autoinst>.
+(These files are called F<fontools_ot1.enc> etc. to avoid name clashes
+with other packages; the "fontools_" prefix may be omitted.)
+
+=item B<-ts1>/B<-nots1>
+
+Control the creation of TS1-encoded fonts. The default is B<-ts1>
+if the text encodings (see I<-encoding> above) include T1,
+B<-nots1> otherwise.
+
+=item B<-serif>/B<-sanserif>/B<-typewriter>
+
+Install the font as a serif, sanserif or typewriter font, respectively.
+This changes how you access the font in LaTeX:
+with C<\rmfamily>/C<\textrm>, C<\sffamily>/C<\textsf>
+or C<\ttfamily>/C<\texttt>.
+
+Installing the font as a typewriter font will cause two further changes:
+it will - by default - turn off the use of f-ligatures
+(though this can be overridden with the I<-ligatures> option),
+and it will disable hyphenation for this font.
+This latter effect cannot be disabled in B<autoinst>;
+if you want typewriter text to be hyphenated, use the F<hyphenat> package.
+
+If none of these options is specified, B<autoinst> tries to guess:
+if the font's filename contains the string "mono"
+or if the field C<isFixedPitch> in the font's I<post> table is True,
+it will select B<-typewriter>;
+else if the filename contains "sans" it selects B<-sanserif>;
+and otherwise it will opt for B<-serif>.
+
+=item B<-lining>/B<-nolining>
+
+Control the creation of fonts with lining figures. The default is
+B<-lining>.
+
+=item B<-oldstyle>/B<-nooldstyle>
+
+Control the creation of fonts with oldstyle figures. The default is
+B<-oldstyle>.
+
+=item B<-proportional>/B<-noproportional>
+
+Control the creation of fonts with proportional figures. The default is
+B<-proportional>.
+
+=item B<-tabular>/B<-notabular>
+
+Control the creation of fonts with tabular figures. The default is
+B<-tabular>.
+
+=item B<-smallcaps>/B<-nosmallcaps>
+
+Control the creation of small caps fonts. The default is
+B<-smallcaps>.
+
+=item B<-swash>/B<-noswash>
+
+Control the creation of swash fonts. The default is B<-swash>.
+
+=item B<-titling>/B<-notitling>
+
+Control the creation of titling families. The default is B<-titling>.
+
+=item B<-superiors>/B<-nosuperiors>
+
+Control the creation of fonts with superior characters.
+The default is B<-superiors>.
+
+=item B<-noinferiors>
+
+=item B<-inferiors> [= B<none> | B<auto> | B<subs> | B<sinf> | B<dnom> ]
+
+The OpenType standard defines several kinds of digits that might be used
+as inferiors or subscripts: "Subscripts" (OpenType feature "subs"),
+"Scientific Inferiors" ("sinf"), and "Denominators" ("dnom").
+This option allows the user to determine which of these styles B<autoinst>
+should use for the inferior characters.
+Alternatively, the value "auto" tells B<autoinst> to use the first value
+in "subs", "sinf" or "dnom" that is supported by the font.
+Saying just B<-inferiors> is equivalent to B<-inferiors=auto>;
+otherwise the default is B<-noinferiors>.
+
+I<< If you specify a style of inferiors that isn't present in the font,
+B<autoinst> will fall back to its default behaviour of not creating fonts
+with inferiors at all; it won't try to substitute one of the other styles. >>
+
+=item B<-fractions>/B<-nofractions>
+
+Control the creation of fonts with numerators and denominators.
+The default is B<-nofractions>.
+
+=item B<-ligatures>/B<-noligatures>
+
+Some fonts create glyphs for the standard f-ligatures (ff, fi, fl, ffi, ffl),
+but don't provide a "liga" feature to access these.
+This option tells B<autoinst> to add extra C<LIGKERN> rules to
+the generated fonts to enable the use of these ligatures.
+The default is B<-ligatures>,
+unless the user specified the I<ligatures> option.
+
+Specify B<-noligatures> to disable the generation of ligatures even for fonts
+that do contain a "liga" feature.
+
+=item B<-defaultlining>/B<-defaultoldstyle>
+
+=item B<-defaulttabular>/B<-defaultproportional>
+
+Tell B<autoinst> which figure style is the current font family's default
+(i.e., which figures you get when you don't specify any OpenType features).
+
+I<Don't use these options unless you are certain you need them!>
+They are only needed for fonts that don't provide OpenType features
+for their default figure style; and even in that case,
+B<autoinst>'s default values (B<-defaultlining> and B<-defaulttabular>)
+are usually correct.
+
+=item B<-nofigurekern>
+
+Some fonts provide kerning pairs for tabular figures.
+This is very probably not what you want
+(e.g., numbers in tables won't line up exactly).
+This option adds extra I< --ligkern> options
+to the commands for I<otftotfm> to suppress such kerns.
+Note that this option leads to very long commands (it adds
+one hundred I< --ligkern> options), which may cause problems on some systems.
+
+=item B<-mergewidths>/B<-nomergewidths>,
+B<-mergeweights>/B<-nomergeweights>,
+B<-mergeshapes>/B<-nomergeshapes>
+
+Some font put different widths, weights or shapes (e.g., small caps)
+in separate families.
+These options tell B<autoinst> to merge those separate families into
+the main family.
+Since this is usually desirable, they are all enabled by default.
+
+In earlier versions, B<-mergeshapes> was called B<-mergesmallcaps>;
+for reasons of backward compatibility, that option is still supported.
+
+=item B<-nfssweight>=I<code>=I<weight>, B<-nfsswidth>=I<code>=I<width>
+
+Map the NFSS code I<code> to the given weight or width,
+overriding the built-in tables.
+Each of these options may be given multiple times,
+to override more than one NFSS code.
+Example: to map the "ul" code to the "Thin" weight,
+use C<-nfssweight=ul=thin>.
+To inhibit the use of the "ul" code completely,
+use C<-nfssweight=ul=>.
+
+=item B<-extra>=I<text>
+
+Append I<text> as extra options to the command lines for I<otftotfm>.
+To prevent I<text> from accidentily being interpreted as options
+to B<autoinst>, it should be properly quoted.
+
+=item B<-manual>
+
+Manual mode; for users who want to post-process the generated files
+and commands. By default, B<autoinst> immediately executes all
+F<otftotfm> commands it generates;
+in manual mode, these are instead written to a file F<autoinst.bat>.
+Furthermore it tells F<otftotfm> to generate human readable (and editable)
+F<pl/vpl> files instead of the default F<tfm/vf> ones,
+and to place all generated files in a subdirectory C<./autoinst_output/>
+of the current directory, rather than install them into your TeX installation.
+
+When using this option, you need to execute the following manual steps after
+B<autoinst> has finished:
+
+=over 2
+
+=item - run F<pltotf> and F<vptovf> on the generated F<pl> and F<vf> files,
+to convert them to F<tfm/vf> format;
+
+=item - move all generated files to a proper TEXMF tree,
+and, if necessary, update the filename database;
+
+=item - tell TeX about the new F<map> file
+(usually by running C<updmap> or similar).
+
+=back
+
+Note that some options (I<-target>, I<-vendor> and I<-typeface>,
+I<-[no]updmap>) are meaningless, and hence ignored, in manual mode.
+
+=item B<-target>=I<DIRECTORY>
+
+Install all generated files into the TEXMF tree at I<DIRECTORY>.
+
+By default, B<autoinst> searches the $TEXMFLOCAL and $TEXMFHOME trees
+and installs all files into the first user-writable TEXMF tree it finds.
+If B<autoinst> cannot find such a user-writable directory
+(which shouldn't happen, since $TEXMFHOME is supposed to be user-writable)
+it will print a warning message and put all files into the subdirectory
+C<./autoinst_output/> of the current directory.
+It's then up to the user to move the generated files to a better location
+and update all relevant databases
+(usually by calling F<texhash> and F<updmap>).
+
+=item B<-vendor>=I<VENDOR>
+
+=item B<-typeface>=I<TYPEFACE>
+
+These options are equivalent to F<otftotfm>'s I< --vendor> and I< --typeface>
+options: they change the "vendor" and "typeface" parts of the names of the
+subdirectories in the TEXMF tree where generated files will be stored.
+The default values are "lcdftools" and the font's FontFamily name.
+
+Note that these options change I<only> directory names,
+not the names of any generated files.
+
+=item B<-updmap>/B<-noupdmap>
+
+Control whether or not F<updmap> is called after the last call to F<otftotfm>.
+The default is B<-updmap>.
+
+=back
+
+
+=head1 SEE ALSO
+
+Eddie Kohler's B<TypeTools> (F<http://www.lcdf.org/type>).
+
+B<Perl> can be obtained from F<http://www.perl.org>;
+it is included in most Linux distributions.
+For Windows, try ActivePerl (F<http://www.activestate.com>)
+or Strawberry Perl (F<http://strawberryperl.com>).
+
+B<XeTeX> (F<http://www.tug.org/xetex>) and
+B<LuaTeX> (F<http://www.luatex.org>)
+are Unicode-aware TeX engines that can use OpenType fonts directly,
+without any (La)TeX-specific support files.
+
+The B<FontPro> project (F<https://github.com/sebschub/FontPro>)
+offers very complete LaTeX support (even for typesetting maths) for
+Adobe's Minion Pro, Myriad Pro and Cronos Pro font families.
+
+
+=head1 AUTHOR
+
+Marc Penninga (F<marcpenninga@gmail.com>)
+
+When sending a bug report, please give as much relevant information as
+possible; this usually includes (but may not be limited to) the log file
+(please add the I<-verbose> command-line option, for extra info).
+If you see any error messages, please include these I<verbatim>;
+don't paraphase.
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2005-2019 Marc Penninga.
+
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published
+by the Free Software Foundation, either version 2 of the License,
+or (at your option) any later version.
+A copy of the text of the GNU General Public License is included in
+the I<fontools> distribution; see the file F<GPLv2.txt>.
+
+
+=head1 DISCLAIMER
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+
+=head1 VERSION
+
+This document describes B<autoinst> version 20190712.
+
+
+=head1 RECENT CHANGES
+
+(See the source for the full story, all the way back to 2005.)
+
+=over 12
+
+=item I<2019-07-12>
+
+Replaced single quotes in calls to F<otfinfo> with double quotes,
+as they caused problems on Windows 10.
+
+=item I<2019-06-25>
+
+=over 3
+
+=item -
+
+Added the I<-mergeweights> and I<-mergeshapes> options,
+and improved I<-mergewidths>.
+
+=item -
+
+Improved the parsing of fonts' widths and weights.
+
+=item -
+
+Improved the mapping of widths and weights to NFSS codes.
+
+=item -
+
+Changed logging code so that that results of font info parsing
+are always logged, even (especially!) when parsing fails.
+
+=item -
+
+Added a warning when installing fonts from multiple families.
+
+=item -
+
+Added simple recognition for sanserif and typewriter fonts.
+
+=item -
+
+Fixed error checking after calls to F<otfinfo>
+(B<autoinst> previously only checked whether C<fork()> was successful,
+not whether the actual call to F<otfinfo> worked).
+
+=item -
+
+Fixed a bug in the I<-inferiors> option;
+when used without a (supposedly optional) value,
+it would silently gobble the next option instead.
+
+=back
+
+=item I<2019-05-22>
+
+Added the I<mainfont> option to the generated F<sty> files.
+Prevented hyphenation for typewriter fonts
+(added C<\hyphenchar\font=-1> to the C<\DeclareFontFamily> declarations).
+Added the I<-version> option.
+
+=item I<2019-05-17>
+
+Changed the way the F<-ligatures> option works:
+F<-ligatures> enables f-ligatures (even without a "liga" feature),
+F<-noligatures> now disables f-ligatures (overriding a "liga" feature).
+
+=item I<2019-05-11>
+
+Separate small caps families are now also recognised when the family name
+ends with "SC" (previously B<autoinst> only looked for "SmallCaps").
+
+=item I<2019-04-22>
+
+Fixed a bug in the generation of swash shapes.
+
+=item I<2019-04-19>
+
+Fixed a bug that affected -mergesmallcaps with multiple encodings.
+
+=item I<2019-04-16>
+
+Added the <-mergesmallcaps> option, to handle cases where
+the small caps fonts are in separate font families.
+Titling shape is now treated as a separate family instead of a distinct shape;
+it is generated only for fonts with the 'titl' feature.
+Only add f-ligatures to fonts when explicitly asked to (I<-ligatures>).
+
+=item I<2019-04-11>
+
+Tried to make the log file more relevant.
+Added the I<-nfssweight> and I<-nfsswidth> options,
+and finetuned the automatic mapping between fonts and NFSS codes.
+Changed the name of the generated log file to F<< <fontfamily>.log >>,
+and revived the I<-logfile> option to allow overriding this choice.
+Made I<-mergewidths> the default (instead of I<-nomergewidths>).
+
+=item I<2019-04-01>
+
+Fine-tuned the decision where to put generated files;
+in particular, create $TEXMFHOME if it doesn't already exist
+and $TEXMFLOCAL isn't user-writable.
+
+In manual mode, or when we can't find a user-writable TEXMF tree,
+put all generated files into a subdirectory C<./autoinst_output/>
+instead of all over the current working directory.
+
+Added "auto" value to the I<inferiors> option,
+to tell B<autoinst> to use whatever inferior characters are available.
+
+=item I<2019-03-14>
+
+Overhauled the mapping of fonts (more specifically of weights and widths;
+the mapping of shapes didn't change) to NFSS codes.
+Instead of inventing our own codes to deal with every possible weight
+and width out there, we now create "long" codes based on the names
+in the font metadata.
+Then we add "ssub" rules to the F<fd> files to map the standard NFSS codes
+to our fancy names (see the section B<NFSS codes>;
+based on discussions with Frank Mittelbach and Bob Tennent).
+
+=back
+
+
+=begin Really_old_history
+
+=over 12
+
+=item I<2018-08-10>
+
+Added encoding files for LGR and T2A/B/C to I<fontools>.
+
+=item I<2018-03-26>
+
+Added the I<-(no)mergewidths> option; tried to improve the documentation.
+
+=item I<2018-03-26>
+
+Added the "Text" weight and the I<-(no)mergewidths> option.
+Changed the NFSS codes for "Thin" and "Book" to "i" and "o", respectively.
+Tried to improve the documentation.
+
+=item I<2018-01-09>
+
+Added the "sl" weight for font families (such as Fira Sans) that contain both
+"Book" and "Regular" weights (reported by Bob Tennent).
+Added the "Two", "Four", "Eight" and "Hair" weights (for Fira Sans).
+
+=item I<2017-06-16>
+
+Changed the I<-inferiors> option from a binary yes-or-no choice to allow
+the user to choose one of the "subs", "sinf" and "dnom" features.
+B<autoinst> now always creates a log file.
+
+=item I<2017-03-21>
+
+Updated the F<fontools_ot1.enc> encoding file to include the "Lslash"
+and "lslash" glyphs (thanks to Bob Tennent).
+
+=item I<2015-11-22>
+
+Bugfix: LaTeX doesn't like command names with dashes in it.
+
+=item I<2015-05-13>
+
+Fixed an error message that mixed up width and weight.
+
+=item I<2014-04-04>
+
+Fixed a bug in the font info parsing code.
+
+=item I<2014-01-21>
+
+"Oblique" or "slanted" fonts are now mapped to NFSS code "sl" instead
+of "it"; added "ssub" rules to the F<fd> files to substitute slanted fonts
+for italic ones if the latter are missing. Fixed a few bugs.
+
+=item I<2014-01-03>
+
+Added the I<-dryrun> and I<-logfile> options; changed which info is logged.
+Added the I<-lining>, I<-oldstyle>, I<-tabular> and I<-proportional>
+options; the old options with those names have been renamed to
+I<-defaultlining>, I<-defaultoldstyle> etc.
+
+=item I<2013-10-31>
+
+The previous change required Perl v5.14 or newer;
+now it also works with older versions.
+
+=item I<2013-10-01>
+
+Added the I<-lining>, I<-oldstyle>, I<-tabular> and I<-proportional>
+command line options.
+
+=item I<2013-07-25>
+
+The generated F<sty> files now use the I<mweights> package instead of
+redefining C<\mddefault> and C<\bfdefault>.
+Added C<scale> as an alias for the package option C<scaled>.
+
+=item I<2013-02-06>
+
+Bugfix: the directory names for map and encoding files contained
+the "vendor" instead of the "typeface".
+
+=item I<2013-01-03>
+
+Added extra "ssub" rules to the F<fd> files that substitute "b" for "bx".
+Verbose mode now also prints all generated commands before they're executed.
+
+=item I<2012-10-25>
+
+Added extra "ssub" rules to the F<fd> files that substitute italic
+shapes for slanted ones.
+
+=item I<2012-09-25>
+
+Added the I<-vendor>, I<-typeface> and I<-(no)updmap> command line options.
+
+=item I<2012-07-06>
+
+Documentation update.
+
+=item I<2012-03-06>
+
+Implemented the "splitting the font family into multiple subfamilies"
+emergency strategy when font info parsing fails.
+Added recognition for a number of unusual widths, weights and shapes.
+
+=item I<2012-02-29>
+
+Fixed a bug in the font parsing code,
+where possible widths, weights and shapes where tested in the wrong order;
+this led to "ExtraLight" fonts being recognised as "Light".
+Added recognition for "Narrow" and "Wide" widths.
+Also added the I<-(no)figurekern> command-line option.
+
+=item I<2012-02-01>
+
+Reorganised the code, and fixed some bugs in the process.
+Added the I<-target> command-line option.
+Made B<autoinst> install the F<fd> and F<sty> files in
+the same TEXMF tree as the other generated files.
+Generate OT1, T1 and LY1 encoded text fonts by default.
+Made I<-titling> a default option (instead of I<-notitling>).
+Updated the documentation.
+
+=item I<2011-06-15>
+
+Fixed the font info parsing code for some fonts that are
+too lazy to spell out "Italic" in full.
+
+=item I<2010-04-29>
+
+The I< --feature=kern> option is only used for fonts that
+contain either a I<kern> feature or a I<kern> table.
+Font feature selection commands in the F<sty> file are only
+generated for shapes and figure styles that are supported
+by the current font, and whose generation has not been
+turned off using the command-line options.
+Fixed the font info parsing to work with the Condensed fonts
+in the Minion Pro family.
+
+=item I<2010-04-23>
+
+Always provide the I< --feature=kern> option to F<otftotfm>,
+even if the font doesn't have a I<kern> feature;
+this will make F<otftotfm> use the I<kern> table if present.
+For fonts without a I<liga> feature, add I< --ligkern>
+options for the common f-ligatures to the F<otftotfm> command line,
+so that any ligatures present in the font will still be used.
+Bug fix: the generated F<sty> files now work for font families
+with names containing digits.
+
+=item I<2009-04-09>
+
+Prefixed the filenames of the included encoding files with
+I<fontools_>, to prevent name clashes with other packages.
+
+=item I<2009-04-06>
+
+A small patch to the C<get_orn> subroutine:
+it now also recognises the I<bullet.xxx> ornament glyphs
+in Adobe Kepler Pro.
+
+=item I<2007-08-07>
+
+Fixed a small bug with filename quoting on Windows.
+
+=item I<2007-07-31>
+
+Changed the tables that map weights and widths to NFSS codes:
+in some extended families, different combinations of
+weight and width were mapped to the same series.
+Added a work-around for incorrect size info in some Kepler fonts.
+Fixed a small bug in the generated commands for otftotfm
+(sometimes, the "onum" feature was included twice).
+Added encoding file for OT1 to the I<fontools> collection.
+
+=item I<2007-07-27>
+
+Two bugfixes: a closing brace was missing in the generated style file,
+and the NFSS series was formed as "width plus weight" instead of the reverse.
+
+=item I<2007-06-10>
+
+Bugfix: silently replacing \DeclareOption, \ProcessOptions and
+\ExecuteOptions with their counterparts from the xkeyval package
+caused problems for some other packages.
+
+=item I<2007-06-04>
+
+Added the I< --no-updmap> option to all generated commands for F<otftotfm>
+(except the last); this should yield a significant speed-up for large
+families (suggested by Steven E. Harris).
+Tweaked the font info parsing to work around a bug in the naming of
+some FontFont fonts, where every font is in a family of its own.
+Added the "scaled" option (including the loading of F<xkeyval>)
+to the generated style file.
+Extended the output of the I<-verbose> option.
+
+=item I<2007-02-08>
+
+Yet Another Complete Rewrite.
+The code is now much more readable and more flexible;
+the program can now handle fonts from different families,
+as well as multiple text encodings.
+Rewrote the font info parsing code to work for Arno Pro.
+
+=item I<2006-10-11>
+
+The program determines the fonts' weights, widths and shapes by parsing
+the output from C<otfinfo --info> instead of the font filename.
+This should make B<autoinst> work for non-Adobe fonts.
+Filenames with spaces now work as well.
+
+=item I<2006-08-31>
+
+Made the generated style files try to include "fontaxes.sty";
+changed the names of the generated fonts and families
+(to make the previous change possible);
+added command-line options for most font styles and shapes;
+tweaked the filename parsing code for Cronos Pro and Gill Sans Pro;
+added runtime generation of encoding vectors for ornament fonts
+(because GaramondPremier's ornament names differ from other fonts);
+changed the NFSS-code for italic small caps and titling to "scit" and "tlit"
+(to work with F<fontaxes>);
+and edited (and hopefully improved) the documentation.
+
+=item I<2005-10-03>
+
+When creating LY1, T1, OT1 or TS1 encoded fonts, the I<-coding-scheme>
+option is added to the commands for F<otftotfm>; this should make the
+generated F<pl> and F<vpl> files acceptable to I<fontinst>.
+Also elaborated the documentation somewhat and fixed a small bug.
+
+=item I<2005-09-22>
+
+Added check to see if filename parsing succeeded;
+updated the filename parsing code to cater for GaramondPremier Pro,
+Silentium Pro and some non-Adobe fonts;
+added the I<-sanserif> and I<-typewriter> options and hacked the
+style files to support using several different font families in one document.
+
+=item I<2005-09-12>
+
+Cleaned up the code (it now runs under the F<strict> and F<warnings> pragmas);
+fixed a (rather obscure) bug that occurred when creating TS1-encoded
+fonts for families with multiple optical masters and oldstyle digits;
+added the I<medium, semibold> etc. options to the style file;
+and improved the layout of the generated files.
+
+=item I<2005-08-11>
+
+The generated commands weren't actually executed, only printed...
+Also added a small hack to cater for fonts
+(such as some recent versions of MinionPro)
+that contain swash characters but don't provide a "swsh" feature.
+
+=item I<2005-08-10>
+
+Dropped the "fontname" scheme in favor of a more verbose naming scheme,
+since many filenames were still more than eight characters long anyway.
+Added F<nfssext.sty>-like commands to the generated style file.
+Changed the default encoding to LY1 and added the "inferior" shape.
+
+=item I<2005-08-01>
+
+Rewrote (and hopefully improved) the user interface;
+changed the program to by default execute the generated F<otftotfm> command
+lines rather than writing them to a file;
+added automatic determination of the "fontname" code for the font family;
+changed the NFSS code for italic small caps to "si"; added titling shapes;
+changed the generated style
+file to include an interface for the ornaments and to load Lehman's NFSS
+extensions F<nfssext.sty> if this is installed; corrected the "fontname" codes
+for OT1, T1, LY1 and user-specific encodings; extended the output generated by
+the I<-verbose> option; and rewrote and extended the documentation.
+
+=item I<2005-06-16>
+
+Did some more finetuning to the filename-parsing code.
+
+=item I<2005-05-31>
+
+Generate correct fontname for OT1-encoded fonts.
+
+=item I<2005-05-18>
+
+Tried to make the filename-parsing code a bit more robust by adding several
+weights and widths; changed the error that's displayed when filename parsing
+fails; commented the code.
+
+=item I<2005-04-29>
+
+Rewrote large parts of the code (yes it I<was> even worse).
+
+=item I<2005-04-18>
+
+Changed default text-encoding to T1, added TS1.
+
+=item I<2005-03-29>
+
+Added support for font families with multiple widths.
+
+=item I<2005-03-15>
+
+First version.
+
+=back
+
+=end Really_old_history
diff --git a/fonts/utilities/fontools/bin/ot2kpx b/fonts/utilities/fontools/bin/ot2kpx
new file mode 100755
index 0000000000..2073d6b6d3
--- /dev/null
+++ b/fonts/utilities/fontools/bin/ot2kpx
@@ -0,0 +1,932 @@
+#! /usr/bin/env perl
+
+=begin COPYRIGHT
+
+----------------------------------------------------------------------------
+
+ Copyright (C) 2005-2019 Marc Penninga.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to
+ Free Software Foundation, Inc.,
+ 59 Temple Place,
+ Suite 330,
+ Boston, MA 02111-1307,
+ USA
+
+----------------------------------------------------------------------------
+
+=end COPYRIGHT
+
+=cut
+
+use strict;
+use warnings;
+
+use integer;
+use Getopt::Long ();
+use List::Util @List::Util::EXPORT_OK;
+use Pod::Usage;
+
+my $VERSION = "20190712";
+
+our ($NUM_GLYPHS, $UNITS_PER_EM, %kern);
+
+sub main {
+ %ARGV = (
+ print_func => \&print_kpx,
+ );
+
+ Getopt::Long::GetOptions(
+ 'help|?' => sub { pod2usage(-verbose => 0) },
+ 'version' => sub { print "$VERSION\n"; exit },
+ 'doc' => sub { pod2usage(-verbose => 2) },
+ 'afm' => sub { $ARGV{print_func} = \&print_kpx },
+ 'kpx' => sub { $ARGV{print_func} = \&print_kpx },
+ 'lua' => sub { $ARGV{print_func} = \&print_lua },
+ ) or pod2usage(-verbose => 0);
+ pod2usage(-verbose => 0) if @ARGV != 1;
+
+ my %font = OTF::get_tables($ARGV[0]);
+
+ $NUM_GLYPHS = unpack '@4n', $font{maxp};
+ $UNITS_PER_EM = unpack '@18n', $font{head};
+
+ my @glyph_name = map { sprintf "index%d", $_ } 0 .. $NUM_GLYPHS - 1;
+ if (defined $font{CFF}) {
+ OTF::CFF::get_glyph_names($font{CFF}, \@glyph_name);
+ }
+
+ if (defined $font{kern}) {
+ OTF::Kern::parse_kerntable($font{kern});
+ }
+
+ if (defined $font{GPOS}) {
+ my @lookup_list_indices
+ = OTF::GPOS::get_lookup_list_indices($font{GPOS});
+ my @all_lookups = OTF::GPOS::get_lookups($font{GPOS});
+ my @lookups = @all_lookups[@lookup_list_indices];
+ my @subtables = map { OTF::GPOS::get_subtables($_) } @lookups;
+
+ for my $subtable (@subtables) {
+ my $pos_format = unpack 'n', $subtable;
+ if ($pos_format == 1) {
+ OTF::GPOS::parse_pos_format_1($subtable);
+ }
+ elsif ($pos_format == 2) {
+ OTF::GPOS::parse_pos_format_2($subtable);
+ }
+ else {
+ warn "[ERROR] invalid PosFormat $pos_format ignored";
+ }
+ }
+ }
+
+ &{$ARGV{print_func}}( \%kern, \@glyph_name );
+ return;
+}
+
+# ------------------------------------------------------------------------
+# Print kerning data in Adobe's KPX format
+# ------------------------------------------------------------------------
+sub print_kpx {
+ my %kern = %{ shift @_ };
+ my @glyph = @{ shift @_ };
+
+ my $num_kernpairs = sum map { scalar keys %{$kern{$_}} } keys %kern;
+ print "StartKernData\nStartKernPairs $num_kernpairs\n";
+ for my $l (sort { $glyph[$a] cmp $glyph[$b] } keys %kern) {
+ my $l_glyph = $glyph[$l];
+ for my $r (sort { $glyph[$a] cmp $glyph[$b] } keys %{$kern{$l}}) {
+ print "KPX $l_glyph $glyph[$r] ",
+ "$kern{$l}{$r}\n";
+ }
+ }
+ print "EndKernPairs\nEndKernData\n";
+}
+
+# ------------------------------------------------------------------------
+# Print kerning data as a Luatex custom font feature
+# ------------------------------------------------------------------------
+sub print_lua {
+ my %kern = %{ shift @_ };
+ my @glyph = @{ shift @_ };
+
+ print <<'END_FEATURE_PREFIX';
+fonts.handlers.otf.addfeature {
+ name = 'kern',
+ type = 'kern',
+ data = {
+END_FEATURE_PREFIX
+
+ for my $l ( sort { $glyph[$a] cmp $glyph[$b] } keys %kern ) {
+ print ' ' x 8, "[ '$glyph[$l]' ] = {";
+ for my $r ( sort { $glyph[$a] cmp $glyph[$b] } keys %{$kern{$l}} ) {
+ print "\n", ' ' x 12, "[ '$glyph[$r]' ] = $kern{$l}{$r},";
+ }
+ print " },\n";
+ }
+
+ print <<'END_FEATURE_POSTFIX';
+ }
+}
+END_FEATURE_POSTFIX
+}
+
+########################################################################
+
+
+package OTF;
+
+#-----------------------------------------------------------------------
+# Return a hash with all tables (as strings) from the font
+#-----------------------------------------------------------------------
+sub get_tables {
+ my $filename = shift;
+
+ open my $fontfile, '<:raw', $filename
+ or die "[ERROR] can't open $filename: $!";
+ my $fontdata = do { local $/; <$fontfile> };
+ close $fontfile;
+
+ my ($sfnt_version, @tables) = unpack 'a4nx6/(a16)', $fontdata;
+
+ die "[ERROR] $filename: unknown font type"
+ unless $sfnt_version eq "\x00\x01\x00\x00"
+ || $sfnt_version eq 'OTTO';
+
+ my %table = map { my ($tag, $offset, $length) = unpack 'A4@8N@12N', $_;
+ ($tag => substr $fontdata, $offset, $length);
+ }
+ @tables;
+
+ return %table;
+}
+
+
+########################################################################
+
+
+package OTF::CFF;
+
+my @STANDARD_STRINGS = qw(
+ .notdef space exclam quotedbl
+ numbersign dollar percent ampersand
+ quoteright parenleft parenright asterisk
+ plus comma hyphen period
+
+ slash zero one two
+ three four five six
+ seven eight nine colon
+ semicolon less equal greater
+
+ question at A B
+ C D E F
+ G H I J
+ K L M N
+
+ O P Q R
+ S T U V
+ W X Y Z
+ bracketleft backslash bracketright asciicircum
+
+ underscore quoteleft a b
+ c d e f
+ g h i j
+ k l m n
+
+ o p q r
+ s t u v
+ w x y z
+ braceleft bar braceright asciitilde
+
+ exclamdown cent sterling fraction
+ yen florin section currency
+ quotesingle quotedblleft guillemotleft guilsinglleft
+ guilsinglright fi fl endash
+
+ dagger daggerdbl periodcentered paragraph
+ bullet quotesinglbase quotedblbase quotedblright
+ guillemotright ellipsis perthousand questiondown
+ grave acute circumflex tilde
+
+ macron breve dotaccent dieresis
+ ring cedilla hungarumlaut ogonek
+ caron emdash AE ordfeminine
+ Lslash Oslash OE ordmasculine
+
+ ae dotlessi lslash oslash
+ oe germandbls onesuperior logicalnot
+ mu trademark Eth onehalf
+ plusminus Thorn onequarter divide
+
+ brokenbar degree thorn threequarters
+ twosuperior registered minus eth
+ multiply threesuperior copyright Aacute
+ Acircumflex Adieresis Agrave Aring
+
+ Atilde Ccedilla Eacute Ecircumflex
+ Edieresis Egrave Iacute Icircumflex
+ Idieresis Igrave Ntilde Oacute
+ Ocircumflex Odieresis Ograve Otilde
+
+ Scaron Uacute Ucircumflex Udieresis
+ Ugrave Yacute Ydieresis Zcaron
+ aacute acircumflex adieresis agrave
+ aring atilde ccedilla eacute
+
+ ecircumflex edieresis egrave iacute
+ icircumflex idieresis igrave ntilde
+ oacute ocircumflex odieresis ograve
+ otilde scaron uacute ucircumflex
+
+ udieresis ugrave yacute ydieresis
+ zcaron exclamsmall Hungarumlautsmall dollaroldstyle
+ dollarsuperior ampersandsmall Acutesmall parenleftsuperior
+ parenrightsuperior twodotenleader onedotenleader zerooldstyle
+
+ oneoldstyle twooldstyle threeoldstyle fouroldstyle
+ fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle
+ nineoldstyle commasuperior threequartersemdash periodsuperior
+ questionsmall asuperior bsuperior centsuperior
+
+ dsuperior esuperior isuperior lsuperior
+ msuperior nsuperior osuperior rsuperior
+ ssuperior tsuperior ff ffi
+ ffl parenleftinferior parenrightinferior Circumflexsmall
+
+ hyphensuperior Gravesmall Asmall Bsmall
+ Csmall Dsmall Esmall Fsmall
+ Gsmall Hsmall Ismall Jsmall
+ Ksmall Lsmall Msmall Nsmall
+
+ Osmall Psmall Qsmall Rsmall
+ Ssmall Tsmall Usmall Vsmall
+ Wsmall Xsmall Ysmall Zsmall
+ colonmonetary onefitted rupiah Tildesmall
+
+ exclamdownsmall centoldstyle Lslashsmall Scaronsmall
+ Zcaronsmall Dieresissmall Brevesmall Caronsmall
+ Dotaccentsmall Macronsmall figuredash hypheninferior
+ Ogoneksmall Ringsmall Cedillasmall questiondownsmall
+
+ oneeighth threeeighths fiveeighths seveneighths
+ onethird twothirds zerosuperior foursuperior
+ fivesuperior sixsuperior sevensuperior eightsuperior
+ ninesuperior zeroinferior oneinferior twoinferior
+
+ threeinferior fourinferior fiveinferior sixinferior
+ seveninferior eightinferior nineinferior centinferior
+ dollarinferior periodinferior commainferior Agravesmall
+ Aacutesmall Acircumflexsmall Atildesmall Adieresissmall
+
+ Aringsmall AEsmall Ccedillasmall Egravesmall
+ Eacutesmall Ecircumflexsmall Edieresissmall Igravesmall
+ Iacutesmall Icircumflexsmall Idieresissmall Ethsmall
+ Ntildesmall Ogravesmall Oacutesmall Ocircumflexsmall
+
+ Otildesmall Odieresissmall OEsmall Oslashsmall
+ Ugravesmall Uacutesmall Ucircumflexsmall Udieresissmall
+ Yacutesmall Thornsmall Ydieresissmall 001.000
+ 001.001 001.002 001.003 Black
+
+ Bold Book Light Medium
+ Regular Roman Semibold
+);
+
+#-----------------------------------------------------------------------
+#
+#-----------------------------------------------------------------------
+sub get_glyph_names {
+ my ($CFF, $glyph_name) = @_;
+
+ # skip header; parse (and ignore) NAME index
+ my ($rest) = _parse_index(substr $CFF, unpack '@2C', $CFF);
+
+ # parse TopDict index
+ ($rest, my @top_dict) = _parse_index($rest);
+ if (@top_dict > 1) {
+ warn "[WARNING] multiple fonts in single file not supported";
+ }
+ my %top_dict = _parse_dict($top_dict[0]);
+ if ($NUM_GLYPHS != unpack 'n', substr($CFF, $top_dict{17}, 2)) {
+ die "[ERROR] NumGlyphs different in 'maxp' and 'CFF' tables";
+ }
+
+ # parse String index
+ ($rest, my @strings) = _parse_index($rest);
+ @strings = (@STANDARD_STRINGS, @strings);
+
+ my $charset = substr $CFF, $top_dict{15};
+ my $format = unpack 'C', $charset;
+ if ($format == 0) {
+ my @codes = unpack "\@1n@{[ $NUM_GLYPHS - 1 ]}", $charset;
+ @$glyph_name = @strings[0, @codes];
+ }
+ elsif ($format == 1) {
+ my $i = 0;
+ $glyph_name->[$i++] = $strings[0];
+ for (my $j = 0; $i < $NUM_GLYPHS; $j++) {
+ my ($first, $n_left)
+ = unpack "\@@{[ 1 + 3*$j ]}nC", $charset;
+ $glyph_name->[$i + $_] = $strings[$first + $_]
+ for 0 .. $n_left;
+ $i += 1 + $n_left;
+ }
+ }
+ elsif ($format == 2) {
+ my $i = 0;
+ $glyph_name->[$i++] = $strings[0];
+ for (my $j = 0; $i < $NUM_GLYPHS; $j++) {
+ my ($first, $n_left)
+ = unpack "\@@{[ 1 + 4*$j ]}nn", $charset;
+ $glyph_name->[$i + $_] = $strings[$first + $_]
+ for 0 .. $n_left;
+ $i += 1 + $n_left;
+ }
+ }
+ else {
+ warn "[ERROR] invalid CharsetFormat '$format' ignored";
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Parse Adobe's INDEX format (see CFF spec); return "rest" plus data array
+#-----------------------------------------------------------------------
+sub _parse_index {
+ my $index = shift;
+
+ my ($count, $off_size) = unpack 'nC', $index;
+ my @offsets = unpack "\@3(a$off_size)@{[ $count + 1 ]}", $index;
+ if ($off_size == 1) { $_ = unpack 'C', $_ for @offsets }
+ elsif ($off_size == 2) { $_ = unpack 'n', $_ for @offsets }
+ elsif ($off_size == 4) { $_ = unpack 'N', $_ for @offsets }
+ elsif ($off_size == 3) {
+ for my $offset (@offsets) {
+ my @bytes = map 'C3', $offset;
+ $offset = ($bytes[0] << 16) + ($bytes[1] << 8) + $bytes[2];
+ }
+ }
+ else {
+ warn "[ERROR] invalid OffSize $off_size ignored";
+ }
+ $_ += 2 + $off_size * ($count + 1) for @offsets;
+
+ my @data;
+ for my $i (0 .. $count - 1) {
+ $data[$i]
+ = substr $index, $offsets[$i], $offsets[$i + 1] - $offsets[$i];
+ }
+
+ return substr($index, $offsets[$count]), @data;
+}
+
+#-----------------------------------------------------------------------
+# Parse Adobe's DICT format (see CFF spec); return data hash
+#-----------------------------------------------------------------------
+sub _parse_dict {
+ my $dict = shift;
+
+ my @bytes = unpack 'C*', $dict;
+ my (@operands, %dict);
+ while (@bytes) {
+ if (( 0 <= $bytes[0] && $bytes[0] <= 11)
+ || (13 <= $bytes[0] && $bytes[0] <= 22))
+ {
+ my $operator = shift @bytes;
+ ($dict{$operator} = join q{ }, @operands) =~ s/^\s+//xms;
+ @operands = ();
+ }
+ elsif ($bytes[0] == 12) {
+ my $operator = join q{ }, splice @bytes, 0, 2;
+ ($dict{$operator} = join q{ }, @operands) =~ s/^\s+//xms;
+ @operands = ();
+ }
+ elsif ($bytes[0] == 28
+ || $bytes[0] == 29
+ || $bytes[0] == 30
+ || (32 <= $bytes[0] && $bytes[0] <= 254))
+ {
+ push @operands, _get_number(\@bytes);
+ }
+ else {
+ warn "[ERROR] invalid byte $bytes[0] in DICT ignored";
+ shift @bytes;
+ }
+ }
+
+ return %dict;
+}
+
+#-----------------------------------------------------------------------
+# Parse Adobe's variable-length numbers (see CFF spec); shorten arg array
+#-----------------------------------------------------------------------
+sub _get_number {
+ my $bytes = shift;
+
+ my $b0 = shift @$bytes;
+ if ($b0 == 28) {
+ my ($b1, $b2) = splice @$bytes, 0, 2;
+ return ($b1 << 8) | $b2;
+ }
+ elsif ($b0 == 29) {
+ my ($b1, $b2, $b3, $b4) = splice @$bytes, 0, 4;
+ return ((((($b1 << 8) + $b2) << 8) + $b3) << 8) + $b4;
+ }
+ elsif ($b0 == 30) {
+ # Reals not implemented; just dump appropriate number of bytes
+ until (($b0 & 0xf0) == 0xf0 || ($b0 & 0xf) == 0xf) {
+ $b0 = shift @$bytes;
+ }
+ }
+ elsif (32 <= $b0 && $b0 <= 246) {
+ return $b0 - 139;
+ }
+ elsif (247 <= $b0 && $b0 <= 250) {
+ my $b1 = shift @$bytes;
+ return 256 * ($b0 - 247) + $b1 + 108;
+ }
+ elsif (251 <= $b0 && $b0 <= 254) {
+ my $b1 = shift @$bytes;
+ return -256 * ($b0 - 251) - $b1 - 108;
+ }
+}
+
+
+########################################################################
+
+
+package OTF::GPOS;
+
+#-----------------------------------------------------------------------
+# Return list of all Lookups from the GPOS table
+#-----------------------------------------------------------------------
+sub get_lookups {
+ my $GPOS = shift;
+
+ my $lookup_list = substr $GPOS, unpack '@8n', $GPOS;
+ my @lookup_offsets = unpack 'n/n', $lookup_list;
+
+ return map { substr $lookup_list, $_ } @lookup_offsets;
+}
+
+#-----------------------------------------------------------------------
+# Return list of all LookupListIndices pointed to by 'kern' feature
+#-----------------------------------------------------------------------
+sub get_lookup_list_indices {
+ my $GPOS = shift;
+
+ my $feature_list = substr $GPOS, unpack '@6n', $GPOS;
+ my %lookup_list_index;
+ for my $feature_record (unpack 'n/(a6)', $feature_list) {
+ my ($tag, $offset) = unpack 'a4n', $feature_record;
+ next if $tag ne 'kern';
+
+ my $feature = substr $feature_list, $offset;
+ my @lookup_list_indices = unpack '@2n/n', $feature;
+ $lookup_list_index{$_} = 1 for @lookup_list_indices;
+ }
+
+ return keys %lookup_list_index;
+}
+
+#-----------------------------------------------------------------------
+# Return list of all subtables in Lookup table
+#-----------------------------------------------------------------------
+sub get_subtables {
+ my $lookup = shift;
+
+ my ($lookup_type, @subtable_offsets) = unpack 'n@4n/n', $lookup;
+ if ($lookup_type != 2) {
+ warn "[WARNING] LookupType $lookup_type not implemented";
+ return;
+ }
+
+ return map { substr $lookup, $_ } @subtable_offsets;
+}
+
+#-----------------------------------------------------------------------
+# Parse subtable in PairPosFormat 1, store kern pairs in global %kern
+#-----------------------------------------------------------------------
+sub parse_pos_format_1 {
+ my $subtable = shift;
+
+ my ($coverage_offset, $value_format_1, $value_format_2, @pair_set_offsets)
+ = unpack '@2nnnn/n', $subtable;
+
+ my @coverage = _get_coverage(substr $subtable, $coverage_offset);
+ my @pair_sets = map { substr $subtable, $_ } @pair_set_offsets;
+ if (@coverage != @pair_sets) {
+ warn "[ERROR] Coverage table doesn't match PairSet table";
+ return;
+ }
+
+ my ($record_size, $value_offset)
+ = _parse_value_formats($value_format_1, $value_format_2, 2, 2);
+
+ while (1) {
+ my $pair_set = shift @pair_sets or last;
+ my $first = shift @coverage;
+
+ my @pair_value_records = unpack "n/(a$record_size)", $pair_set;
+
+ for my $pair_value_record (@pair_value_records) {
+ my ($second, $value)
+ = unpack "n\@${value_offset}s>", $pair_value_record;
+ next if $value == 0;
+ $kern{$first}{$second} ||= 1000 * $value / $UNITS_PER_EM;
+ }
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Parse subtable in PairPosFormat 2, store kern pairs in global %kern
+#-----------------------------------------------------------------------
+sub parse_pos_format_2 {
+ my $subtable = shift;
+
+ my ($coverage_offset, $value_format_1, $value_format_2,
+ $class_def_1, $class_def_2, $class_1_count, $class_2_count)
+ = unpack '@2nnnnnnn', $subtable;
+
+ my @coverage = _get_coverage(substr $subtable, $coverage_offset);
+
+ my ($class_2_record_size, $value_offset)
+ = _parse_value_formats($value_format_1, $value_format_2, 0, 0);
+
+ my @class_1 = _get_class(substr $subtable, $class_def_1);
+ my @class_2 = _get_class(substr $subtable, $class_def_2);
+
+ my $class_1_record_size = $class_2_count * $class_2_record_size;
+ my @class_1_records
+ = unpack "\@16(a$class_1_record_size)$class_1_count", $subtable;
+
+ for my $class_1 (0 .. $class_1_count - 1) {
+ my $class_1_record = $class_1_records[$class_1];
+ my @class_2_records
+ = unpack "(a$class_2_record_size)$class_2_count", $class_1_record;
+
+ for my $class_2 (0 .. $class_2_count - 1) {
+ my $class_2_record = $class_2_records[$class_2];
+ my $value = unpack "\@${value_offset}s>", $class_2_record;
+ next if $value == 0;
+ $value = 1000 * $value / $UNITS_PER_EM;
+
+ my @first = grep { $class_1[$_] == $class_1 } @coverage;
+ my @second = grep { $class_2[$_] == $class_2 } 0 .. $#class_2;
+
+ for my $first (@first) {
+ for my $second (@second) {
+ $kern{$first}{$second} ||= $value;
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+#-----------------------------------------------------------------------
+# Get class number for all glyphs
+#-----------------------------------------------------------------------
+sub _get_class {
+ my $class = shift;
+
+ my @class = (0) x $NUM_GLYPHS;
+
+ my $class_format = unpack 'n', $class;
+ if ($class_format == 1) {
+ my ($start_glyph, @class_value) = unpack '@2nn/n', $class;
+ @class[$start_glyph .. $start_glyph + $#class_value]
+ = @class_value;
+ }
+ elsif ($class_format == 2) {
+ my @class_ranges = unpack '@2n/(a6)', $class;
+ for my $class_range (@class_ranges) {
+ my ($start, $end, $class) = unpack 'nnn', $class_range;
+ @class[$start .. $end] = ($class) x ($end - $start + 1);
+ }
+ }
+ else {
+ warn "[ERROR] invalid ClassFormat '$class_format' ignored";
+ return;
+ }
+
+ return @class;
+}
+
+
+#-----------------------------------------------------------------------
+# Determine size of ValueRecord and offset of XAdvance value in it
+#-----------------------------------------------------------------------
+sub _parse_value_formats {
+ my ($value_format_1, $value_format_2, $record_size, $value_offset) = @_;
+
+ unless ($value_format_1 & 0x4 && $value_format_2 == 0) {
+ warn "[WARNING] ValueFormat ($value_format_1, ",
+ "$value_format_2) not implemented";
+ return;
+ }
+
+ for my $bit ((0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80)) {
+ $record_size += 2 if $value_format_1 & $bit;
+ }
+ for my $bit ((0x1, 0x2)) {
+ $value_offset += 2 if $value_format_1 & $bit;
+ }
+
+ return ($record_size, $value_offset);
+}
+
+#-----------------------------------------------------------------------
+# Return a list of GlyphIDs in a Coverage table
+#-----------------------------------------------------------------------
+sub _get_coverage {
+ my $coverage = shift;
+
+ my $coverage_format = unpack 'n', $coverage;
+ if ($coverage_format == 1) {
+ return unpack '@2n/n', $coverage;
+ }
+ elsif ($coverage_format == 2) {
+ my @range_records = unpack '@2n/(a6)', $coverage;
+
+ return map { my ($start, $end) = unpack 'nn', $_;
+ $start .. $end;
+ }
+ @range_records;
+ }
+ else {
+ warn "[WARNING] unknown CoverageFormat $coverage_format ignored";
+ }
+}
+
+
+########################################################################
+
+
+package OTF::Kern;
+
+#-----------------------------------------------------------------------
+# Parse "kern"table, store kern pairs in global %kern
+#-----------------------------------------------------------------------
+sub parse_kerntable {
+ my $kern = shift;
+
+ my $num_tables = unpack '@2n', $kern;
+ my $start_subtable = 4;
+ for my $i (0 .. $num_tables - 1) {
+ my $subtable = substr $kern, $start_subtable;
+ my ($length, $coverage) = unpack '@2nn', $subtable;
+ $start_subtable += $length;
+
+ if ($coverage != 0x1) {
+ warn "[WARNING] kern table format '$coverage' not implemented";
+ next;
+ }
+
+ my @kern_pairs = unpack '@6nx6/(a6)', $subtable;
+ for my $kern_pair (@kern_pairs) {
+ my ($first, $second, $value) = unpack 'nns>', $kern_pair;
+ next if $value == 0;
+
+ $kern{$first}{$second} ||= 1000 * $value / $UNITS_PER_EM;
+ }
+ }
+
+ return;
+}
+
+
+########################################################################
+
+
+package main;
+
+main();
+
+__END__
+
+
+########################################################################
+
+
+ To create the documentation:
+
+ pod2man --center="Marc Penninga" --release="fontools" --section=1 \
+ ot2kpx - | groff -Tps -man - | ps2pdf - ot2kpx.pdf
+
+=pod
+
+=head1 NAME
+
+ot2kpx - extract kerning information from OpenType fonts
+
+
+=head1 SYNOPSIS
+
+B<ot2kpx> [ I<-afm> | I<-kpx> | I<-lua> ] B<< <fontfile> >>
+
+
+=head1 DESCRIPTION
+
+B<ot2kpx> extract the kerning data from OpenType fonts and prints it
+to C<stdout>, either in Adobe's KPX format (for adding to an F<afm> file)
+or as a Luatex custom feature, for use with the C<\directlua> command.
+
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 4
+
+=item B<-help>
+
+Print a short help text and exit.
+
+=item B<-version>
+
+Print B<ot2kpx>'s version and exit.
+
+=item B<-afm>, B<-kpx>
+
+Output the kerning data in Adobe's KPX format, as used in F<afm> files.
+This is the default output format.
+
+=item B<-lua>
+
+Output the kerning data as a Luatex custom font feature,
+to be included in a C<\directlua> command.
+
+=item B<< <fontfile> >>
+
+The OpenType font (both F<otf> and F<ttf> format are supported).
+
+=back
+
+
+=head1 RESTRICTIONS
+
+=over 4
+
+=item B<->
+
+B<ot2kpx> doesn't implement all of the OpenType specification.
+Things that are missing include: support for font files containing
+multiple fonts, LookupTables with LookupTypes other than 2,
+"kern" tables with format other than 0 and ValueRecords with
+other types of data than just XAdvance data.
+
+Most of these limitations won't matter, since the missing features
+are rare (the only fonts I know of that use them are the non-western fonts
+that come with Adobe Reader). Furthermore, many of these features define
+(according to the OpenType specification) I<"subtle, device-dependent
+adjustments at specific font sizes or device resolutions">;
+since there's no way to express such adjustments in F<afm> format,
+ignoring them seems to be the only option anyway.
+
+=item B<->
+
+B<ot2kpx> collects kerning data first from the "kern" table, then from
+all LookupTables associated with the "kern" feature; if a kerning pair
+occurs multiple times, the first value seen is chosen.
+There are (or may be) several issues with this approach:
+
+=over 4
+
+=item -
+
+The OpenType specification says that fonts in F<otf> format shouldn't
+use the "kern" table at all, just the lookups from the "GPOS" table.
+Many such fonts do, however, contain a "kern" table, but no "GPOS" table;
+so we use the "kern" table anyway.
+
+=item -
+
+Instead of reading all LookupTables, it might be better to let the user
+specify a script and language and process only the LookupTables for
+those values.
+However, at least in the fonts I checked, all script/language combinations
+eventually point to the I<same> "kern" LookupTables, so this approach
+wouldn't make any difference (apart from further complicating the code).
+
+=back
+
+=back
+
+
+=head1 AUTHOR
+
+Marc Penninga <marcpenninga@gmail.com>
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2005-2019 Marc Penninga.
+
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published
+by the Free Software Foundation, either version 2 of the License,
+or (at your option) any later version.
+A copy of the GNU General Public License is included with B<ot2kpx>;
+see the file F<GPLv2.txt>.
+
+
+=head1 DISCLAIMER
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+
+=head1 VERSION
+
+This document describes B<ot2kpx> version 20190712.
+
+
+=head1 RECENT CHANGES
+
+(See the source code for the rest of the story.)
+
+=over 12
+
+=item I<2019-05-20>
+
+Added the I<-version> option.
+
+=item I<2019-04-15>
+
+Added the I<-lua> command-line option to get output in Luatex's
+custom feature format.
+
+=back
+
+
+=begin Really_old_history
+
+=over 12
+
+=item I<2013-08-07>
+
+Replaced all C<given/when> constructions in the source code by C<if>'s,
+to avoid warnings about experimental features in Perl 5.18 and later.
+
+=item I<2012-02-01>
+
+Refactored the code, and fixed a number of bugs in the process.
+Updated the documentation.
+
+=item I<2005-01-10>
+
+First version
+
+=item I<2005-02-18>
+
+Rewrote some of the code
+
+=item I<2005-03-08>
+
+Input files searched via B<kpsewhich> (where available)
+
+=item I<2005-03-15>
+
+Input files searched using B<kpsewhich> or B<findtexmf>
+
+=item I<2005-03-21>
+
+Test if GPOS table is present before trying to read it
+
+=item I<2005-04-29>
+
+Improved the documentation
+
+=item I<2005-05-25>
+
+Changed warning that's given when the font contains no GPOS table, to an
+informational message.
+
+=item I<2005-07-29>
+
+A few updates to the documentation
+
+=back
+
+=cut
+
diff --git a/fonts/utilities/fontools/bin/splitttc b/fonts/utilities/fontools/bin/splitttc
new file mode 100755
index 0000000000..a31a2f02d2
--- /dev/null
+++ b/fonts/utilities/fontools/bin/splitttc
@@ -0,0 +1,271 @@
+#! /usr/bin/env perl
+
+=begin COPYRIGHT
+
+----------------------------------------------------------------------------
+
+ Copyright (C) 2019 Marc Penninga.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to
+ Free Software Foundation, Inc.,
+ 59 Temple Place,
+ Suite 330,
+ Boston, MA 02111-1307,
+ USA
+
+----------------------------------------------------------------------------
+
+=end COPYRIGHT
+
+=cut
+
+use strict;
+use warnings;
+
+use File::Basename;
+use Getopt::Long;
+use Pod::Usage;
+
+my $VERSION = "20190712";
+
+parse_commandline();
+
+use constant {
+ SIZEOF_OFFSET_TABLE => 12,
+ SIZEOF_TABLE_RECORD => 16,
+};
+
+my $filename_in = $ARGV[0];
+my ($basename_out, undef, undef) = fileparse($filename_in, qw(.ttc .otc));
+my $output_prefix = $ARGV{output_prefix} // $basename_out;
+
+open my $fh, '<:raw', $filename_in
+ or die "[ERROR] cannot open $filename_in: $!";
+my $ttc = do { local $/; <$fh> };
+close $fh
+ or die "[ERROR] something went wrong when closing $filename_in: $!";
+
+# unpack TTC header; we ignore the DSIG fields in version 2.0 headers
+my ($ttc_tag, $major_version, $minor_version, $num_fonts)
+ = unpack 'A4 nnN', $ttc;
+my $ttc_header_version = sprintf "%d.%d", $major_version, $minor_version;
+die "$ARGV[0] is not an OpenType Collection file" if $ttc_tag ne 'ttcf';
+die "$ARGV[0]: unknown TTC Header Version $ttc_header_version"
+ if $ttc_header_version !~ m/\A [12] [.] 0 \z/xms;
+
+my $offsets_template = sprintf "\@%d N%d", SIZEOF_OFFSET_TABLE, $num_fonts;
+my @offsets_of_offset_table = unpack $offsets_template, $ttc;
+
+# collect the data for each font and write to separate file
+for my $i_font (1..$num_fonts) {
+ my $offset_of_offset_table = $offsets_of_offset_table[$i_font - 1];
+ my $offset_table
+ = substr $ttc, $offset_of_offset_table, SIZEOF_OFFSET_TABLE;
+
+ # unpack relevant fields from Offset Table
+ my ($sfnt_version, $num_tables) = unpack 'a4 n', $offset_table;
+ my $file_ext = $sfnt_version eq 'OTTO' ? 'otf'
+ : $sfnt_version eq "\x00\x01\x00\x00" ? 'ttf'
+ : die
+ ;
+ my $filename_out = sprintf "%s%d.%s", $output_prefix, $i_font, $file_ext;
+
+ # unpack Table Records and create list of tables
+ my $table_records
+ = substr $ttc,
+ $offset_of_offset_table + SIZEOF_OFFSET_TABLE,
+ $num_tables * SIZEOF_TABLE_RECORD,
+ ;
+ my $table_records_template
+ = sprintf "(a%d)%d", SIZEOF_TABLE_RECORD, $num_tables;
+ my @table_records = unpack $table_records_template, $table_records;
+ for my $table_record (@table_records) {
+ my ($table_tag, $checksum, $offset, $length)
+ = unpack 'a4 N3', $table_record;
+ my $padding = "\x00" x ((4 - ($length % 4)) % 4);
+ my $table = substr($ttc, $offset, $length) . $padding;
+ $table_record = {
+ table_tag => $table_tag,
+ checksum => $checksum,
+ offset => $offset,
+ length => $length,
+ table => $table,
+ };
+ }
+
+ my $file_pos = SIZEOF_OFFSET_TABLE + length $table_records;
+ for my $table_record (@table_records) {
+ $table_record->{offset} = $file_pos;
+ $file_pos += length $table_record->{table};
+ }
+
+ open my $filehandle_out, '>:raw', $filename_out
+ or die "[ERROR] Cannot create $filename_out: $!";
+ print {$filehandle_out} $offset_table;
+ for my $table_record (@table_records) {
+ print {$filehandle_out}
+ pack 'a4 N3',
+ @{$table_record}{ qw(table_tag checksum offset length) }
+ ;
+ }
+ for my $table_record (@table_records) {
+ print {$filehandle_out} $table_record->{table};
+ }
+ close $filehandle_out
+ or die "[ERROR] something went wrong when closing $filename_out: $!";
+}
+
+#-----------------------------------------------------------------------
+# Read the command-line options
+#-----------------------------------------------------------------------
+sub parse_commandline {
+ Getopt::Long::GetOptions(
+ 'help|?' => sub { pod2usage(-verbose => 1) },
+ 'version' => sub { print "$VERSION\n"; exit },
+ 'output-prefix=s' => \$ARGV{output_prefix},
+ )
+ or pod2usage(-verbose => 0);
+
+ pod2usage(-verbose => 0) if @ARGV != 1;
+
+ return;
+}
+
+
+__END__
+
+
+############################################################################
+
+ To create the documentation:
+
+ pod2man --center="Marc Penninga" --release="fontools" --section=1 \
+ splitttc - | groff -Tps -man - | ps2pdf - splitttc.pdf
+
+=pod
+
+=head1 NAME
+
+splitttc - split an OpenType Collection F<ttc> or F<otc> file
+
+=head1 SYNOPSIS
+
+=over 8
+
+=item B<splitttc>
+[B<-help>]
+[B<-version>]
+[B<-output-prefix>=I<< <prefix> >>]
+B<< <ttc-or-otc-file> >>
+
+=back
+
+
+=head1 DESCRIPTION
+
+B<splitttc> splits an OpenType Collection file.
+
+The OpenType specification allows for multiple fonts to be contained
+in the same file. This might be advantageous if fonts share a lot of data,
+as this then needs to be stored only once. Probably the best known
+example of an OpenType Collection file is Microsoft's Cambria,
+where the Regular weight shares a file with the Math font.
+
+Unfortunately some tools (including Eddie Kohler's LCDF TypeTools)
+cannot handle such OpenType Collections; they only work for individual fonts.
+B<splitttc> takes an OpenType Collection file
+and splits it into its constituent parts.
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 4
+
+=item B<-help>
+
+Print a short description of the syntax and exit.
+
+=item B<-version>
+
+Print version number and exit.
+
+=item B<-output-prefix>=I<< <prefix> >>
+
+Write the individual fonts to files named I<< <prefix> >>1.ttf,
+I<< <prefix> >>2.ttf etc.
+The default is to take the prefix from the filename of the input file.
+
+=item B<< <ttc-or-otc-file> >>
+
+The F<ttc> or F<otc> file to be split.
+
+=back
+
+You may use either one or two dashes before options,
+and option names may be shortened to a unique prefix.
+
+
+=head1 AUTHOR
+
+Marc Penninga <marcpenninga@gmail.com>
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2019 Marc Penninga.
+
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published
+by the Free Software Foundation, either version 2 of the License,
+or (at your option) any later version.
+A copy of the GNU General Public License is included with B<splitttc>;
+see the file F<GPLv2.txt>.
+
+
+=head1 DISCLAIMER
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+
+=head1 VERSION
+
+This document describes B<splitttc> version 20190712.
+
+
+=head1 RECENT CHANGES
+
+(See the source code for the rest of the story.)
+
+=over 12
+
+=item I<2019-06-25>
+
+First release.
+
+=back
+
+
+=begin Really_old_history
+
+=over 12
+
+=back
+
+=cut
+
diff --git a/fonts/utilities/fontools/doc/afm2afm.pdf b/fonts/utilities/fontools/doc/afm2afm.pdf
new file mode 100644
index 0000000000..cf63cba67b
--- /dev/null
+++ b/fonts/utilities/fontools/doc/afm2afm.pdf
Binary files differ
diff --git a/fonts/utilities/fontools/doc/autoinst.pdf b/fonts/utilities/fontools/doc/autoinst.pdf
new file mode 100644
index 0000000000..2da37ab4e1
--- /dev/null
+++ b/fonts/utilities/fontools/doc/autoinst.pdf
Binary files differ
diff --git a/fonts/utilities/fontools/doc/ot2kpx.pdf b/fonts/utilities/fontools/doc/ot2kpx.pdf
new file mode 100644
index 0000000000..27d6ca6440
--- /dev/null
+++ b/fonts/utilities/fontools/doc/ot2kpx.pdf
Binary files differ
diff --git a/fonts/utilities/fontools/doc/splitttc.pdf b/fonts/utilities/fontools/doc/splitttc.pdf
new file mode 100644
index 0000000000..7a00de7925
--- /dev/null
+++ b/fonts/utilities/fontools/doc/splitttc.pdf
Binary files differ
diff --git a/fonts/utilities/fontools/share/fontools_lgr.enc b/fonts/utilities/fontools/share/fontools_lgr.enc
new file mode 100644
index 0000000000..8732270bbb
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_lgr.enc
@@ -0,0 +1,381 @@
+% A version of the T1 encoding, intended for use with otftotfm.
+% CODINGSCHEME GREEK FONT ENCODING - LGR
+/otftotfmLGREncoding [
+% 0x00
+/endash
+/uni032F
+/u10144
+/u10145
+/u10146
+/u10147
+/uni03DB
+/uni03DB.alt
+% 0x08
+/uni1FBE
+/uni1FBC
+/uni1FCC
+/uni1FFC
+/Alpha
+/Upsilondieresis
+/alpha
+/upsilondieresis
+% 0x10
+/uni0316
+/uni0317
+/uni03DF
+/uni03D9
+/uni032E
+/uni03D8
+/uni03DA
+/uni03E0
+% 0x18
+/Euro
+/perthousand
+/uni0259
+/uni03E1
+/quoteleft
+/quoteright
+/breve
+/macron
+% 0x20
+/uni1FC1
+/exclam
+/dieresis
+/dieresistonos
+/uni1FED
+/percent
+/periodcentered
+/tonos
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/anoteleia
+/uni1FFE
+/equal
+/uni1FBF
+/semicolon
+% 0x40
+/uni1FDF
+/Alpha
+/Beta
+/uni1FDD
+/Delta
+/Epsilon
+/Phi
+/Gamma
+% 0x48
+/Eta
+/Iota
+/Theta
+/Kappa
+/Lambda
+/Mu
+/Nu
+/Omicron
+% 0x50
+/Pi
+/Chi
+/Rho
+/Sigma
+/Tau
+/Upsilon
+/uni1FDE
+/Omega
+% 0x58
+/Xi
+/Psi
+/Zeta
+/bracketleft
+/uni1FCF
+/bracketright
+/uni1FCE
+/uni1FCD
+% 0x60
+/uni1FEF
+/alpha
+/beta
+/sigma1
+/delta
+/epsilon
+/phi
+/gamma
+% 0x68
+/eta
+/iota
+/theta
+/kappa
+/lambda
+/mu
+/nu
+/omicron
+% 0x70
+/pi
+/chi
+/rho
+/sigma
+/tau
+/upsilon
+/cwm
+/omega
+% 0x78
+/xi
+/psi
+/zeta
+/guillemotleft
+/uni037A
+/guillemotright
+/uni1FC0
+/emdash
+% 0x80
+/uni1F70
+/uni1F01
+/uni1F00
+/uni1F03
+/uni1FB2
+/uni1F81
+/uni1F80
+/uni1F83
+% 0x88
+/alphatonos
+/uni1F05
+/uni1F04
+/uni1F02
+/uni1FB4
+/uni1F85
+/uni1F84
+/uni1F82
+% 0x90
+/uni1FB6
+/uni1F07
+/uni1F06
+/uni03DD
+/uni1FB7
+/uni1F87
+/uni1F86
+/.notdef
+% 0x98
+/uni1F74
+/uni1F21
+/uni1F20
+/.notdef
+/uni1FC2
+/uni1F91
+/uni1F90
+/.notdef
+% 0xA0
+/etatonos
+/uni1F25
+/uni1F24
+/uni1F23
+/uni1FC4
+/uni1F95
+/uni1F94
+/uni1F93
+% 0xA8
+/uni1FC6
+/uni1F27
+/uni1F26
+/uni1F22
+/uni1FC7
+/uni1F97
+/uni1F96
+/uni1F92
+% 0xB0
+/uni1F7C
+/uni1F61
+/uni1F60
+/uni1F63
+/uni1FF2
+/uni1FA1
+/uni1FA0
+/uni1FA3
+% 0xB8
+/omegatonos
+/uni1F65
+/uni1F64
+/uni1F62
+/uni1FF4
+/uni1FA5
+/uni1FA4
+/uni1FA2
+% 0xC0
+/uni1FF6
+/uni1F67
+/uni1F66
+/uni03DC
+/uni1FF7
+/uni1FA7
+/uni1FA6
+/.notdef
+% 0xC8
+/uni1F76
+/uni1F31
+/uni1F30
+/uni1F33
+/uni1F7A
+/uni1F51
+/uni1F50
+/uni1F53
+% 0xD0
+/iotatonos
+/uni1F35
+/uni1F34
+/uni1F32
+/upsilontonos
+/uni1F55
+/uni1F54
+/uni1F52
+% 0xD8
+/uni1FD6
+/uni1F37
+/uni1F36
+/Iotadieresis
+/uni1FE6
+/uni1F57
+/uni1F56
+/Upsilondieresis
+% 0xE0
+/uni1F72
+/uni1F11
+/uni1F10
+/uni1F13
+/uni1F78
+/uni1F41
+/uni1F40
+/uni1F43
+% 0xE8
+/epsilontonos
+/uni1F15
+/uni1F14
+/uni1F12
+/omicrontonos
+/uni1F45
+/uni1F44
+/uni1F42
+% 0xF0
+/iotadieresis
+/uni1FD2
+/iotadieresistonos
+/uni1FD7
+/upsilondieresis
+/uni1FE2
+/upsilondieresistonos
+/uni1FE7
+% 0xF8
+/uni1FB3
+/uni1FC3
+/uni1FF3
+/uni1FE5
+/uni1FE4
+/.notdef
+/uni0374
+/uni0375
+] def
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN parenleft parenleft =: guillemotleft ;
+% LIGKERN parenright parenright =: guillemotright ;
+% LIGKERN dieresis tonos =: dieresistonos
+% LIGKERN tonos dieresis =: dieresistonos
+% LIGKERN tonos alpha =: alphatonos ;
+% LIGKERN tonos epsilon =: epsilontonos ;
+% LIGKERN tonos eta =: etatonos ;
+% LIGKERN tonos iota =: iotatonos ;
+% LIGKERN tonos omicron =: omicrontonos ;
+% LIGKERN tonos upsilon =: upsilontonos ;
+% LIGKERN tonos omega =: omegatonos ;
+% LIGKERN tonos Alpha =: Alphatonos ;
+% LIGKERN tonos Epsilon =: Epsilontonos ;
+% LIGKERN tonos Eta =: Etatonos ;
+% LIGKERN tonos Iota =: Iotatonos ;
+% LIGKERN tonos Omicron =: Omicrontonos ;
+% LIGKERN tonos Upsilon =: Upsilontonos ;
+% LIGKERN tonos Omega =: Omegatonos ;
+% LIGKERN dieresis iota =: iotadieresis ; dieresis Iota =: Iotadieresis ;
+% LIGKERN dieresis upsilon =: upsilondieresis ;
+% LIGKERN dieresis Upsilon =: Upsilondieresis ;
+% LIGKERN dieresistonos iota =: iotadieresistonos ;
+% LIGKERN dieresistonos upsilon =: upsilondieresistonos ;
+% LIGKERN tonos tonos =: quoteright ; uni1FEF uni1FEF =: quoteleft ;
+% LIGKERN uni1FBF tonos =: uni1FCE ; uni1FBF uni1FEF =: uni1FCD ;
+% LIGKERN uni1FBF uni1FC0 =: uni1FCF ; uni1FC0 uni1FBF =: uni1FCF ;
+% LIGKERN uni1FFE tonos =: uni1FDE ; uni1FFE uni1FEF =: uni1FDD ;
+% LIGKERN uni1FFE uni1FC0 =: uni1FDF ; uni1FC0 uni1FFE =: uni1FDF ;
+% LIGKERN dieresis uni1FC0 =: uni1FC1 ; uni1FC0 dieresis =: uni1FC1 ;
+% LIGKERN dieresis uni1FEF =: uni1FED ; uni1FEF dieresis =: uni1FED ;
+% LIGKERN uni1FCE alpha =: uni1F04 ; uni1FCF alpha =: uni1F06 ; uni1FBF alpha =: uni1F00 ;
+% LIGKERN uni1FCD alpha =: uni1F02 ; uni1FDF alpha =: uni1F07 ; uni1FFE alpha =: uni1F01 ;
+% LIGKERN uni1FDE alpha =: uni1F05 ; uni1FEF alpha =: uni1F70 ;
+% LIGKERN uni1FDD alpha =: uni1F03 ; uni1FC0 alpha =: uni1FB6 ;
+% LIGKERN alpha uni037A =: uni1FB3 ; alphatonos uni037A =: uni1FB4 ;
+% LIGKERN uni1F00 uni037A =: uni1F80 ; uni1F01 uni037A =: uni1F81 ;
+% LIGKERN uni1F02 uni037A =: uni1F82 ; uni1F03 uni037A =: uni1F83 ;
+% LIGKERN uni1F04 uni037A =: uni1F84 ; uni1F05 uni037A =: uni1F85 ;
+% LIGKERN uni1F06 uni037A =: uni1F86 ; uni1F07 uni037A =: uni1F87 ;
+% LIGKERN uni1F70 uni037A =: uni1FB2 ; uni1FB6 uni037A =: uni1FB7 ;
+% LIGKERN uni1FCE epsilon =: uni1F14 ; uni1FBF epsilon =: uni1F10 ;
+% LIGKERN uni1FCD epsilon =: uni1F12 ; uni1FFE epsilon =: uni1F11 ;
+% LIGKERN uni1FDE epsilon =: uni1F15 ; uni1FEF epsilon =: uni1F72 ;
+% LIGKERN uni1FDD epsilon =: uni1F13 ;
+% LIGKERN uni1FCE eta =: uni1F24 ; uni1FCF eta =: uni1F26 ; uni1FBF eta =: uni1F20 ;
+% LIGKERN uni1FCD eta =: uni1F22 ; uni1FDF eta =: uni1F27 ; uni1FFE eta =: uni1F21 ;
+% LIGKERN uni1FDE eta =: uni1F25 ; uni1FEF eta =: uni1F74 ;
+% LIGKERN uni1FDD eta =: uni1F23 ; uni1FC0 eta =: uni1FC6 ;
+% LIGKERN eta uni037A =: uni1FC3 ; etatonos uni037A =: uni1FC4 ;
+% LIGKERN uni1F20 uni037A =: uni1F90 ; uni1F21 uni037A =: uni1F91 ;
+% LIGKERN uni1F22 uni037A =: uni1F92 ; uni1F23 uni037A =: uni1F93 ;
+% LIGKERN uni1F24 uni037A =: uni1F94 ; uni1F25 uni037A =: uni1F95 ;
+% LIGKERN uni1F26 uni037A =: uni1F96 ; uni1F27 uni037A =: uni1F97 ;
+% LIGKERN uni1F74 uni037A =: uni1FC2 ; uni1FC6 uni037A =: uni1FC7 ;
+% LIGKERN uni1FCE iota =: uni1F34 ; uni1FBF iota =: uni1F30 ;
+% LIGKERN uni1FCD iota =: uni1F32 ; uni1FFE iota =: uni1F31 ;
+% LIGKERN uni1FDE iota =: uni1F35 ; uni1FEF iota =: uni1F76 ;
+% LIGKERN uni1FDD iota =: uni1F33 ; uni1FED iota =: uni1FD2 ;
+% LIGKERN uni1FC1 iota =: uni1FD7 ; uni1FC0 iota =: uni1FD6 ;
+% LIGKERN uni1FCF iota =: uni1F36 ; uni1FDF iota =: uni1F37 ;
+% LIGKERN uni1FCE omicron =: uni1F44 ; uni1FBF omicron =: uni1F40 ;
+% LIGKERN uni1FCD omicron =: uni1F42 ; uni1FFE omicron =: uni1F41 ;
+% LIGKERN uni1FDE omicron =: uni1F45 ; uni1FEF omicron =: uni1F78 ;
+% LIGKERN uni1FDD omicron =: uni1F43 ;
+% LIGKERN uni1FCE upsilon =: uni1F54 ; uni1FBF upsilon =: uni1F50 ;
+% LIGKERN uni1FCD upsilon =: uni1F52 ; uni1FFE upsilon =: uni1F51 ;
+% LIGKERN uni1FDE upsilon =: uni1F55 ; uni1FEF upsilon =: uni1F7A ;
+% LIGKERN uni1FDD upsilon =: uni1F53 ; uni1FED upsilon =: uni1FE2 ;
+% LIGKERN uni1FC1 upsilon =: uni1FE7 ; uni1FC0 upsilon =: uni1FE6 ;
+% LIGKERN uni1FCF upsilon =: uni1F56 ; uni1FDF upsilon =: uni1F57 ;
+% LIGKERN uni1FCE omega =: uni1F64 ; uni1FCF omega =: uni1F66 ; uni1FBF omega =: uni1F60 ;
+% LIGKERN uni1FCD omega =: uni1F62 ; uni1FDF omega =: uni1F67 ; uni1FFE omega =: uni1F61 ;
+% LIGKERN uni1FDE omega =: uni1F65 ; uni1FEF omega =: uni1F7C ;
+% LIGKERN uni1FDD omega =: uni1F63 ; uni1FC0 omega =: uni1FF6 ;
+% LIGKERN omega uni037A =: uni1FF3 ; omegatonos uni037A =: uni1FF4 ;
+% LIGKERN uni1F60 uni037A =: uni1FA0 ; uni1F61 uni037A =: uni1FA1 ;
+% LIGKERN uni1F62 uni037A =: uni1FA2 ; uni1F63 uni037A =: uni1FA3 ;
+% LIGKERN uni1F64 uni037A =: uni1FA4 ; uni1F65 uni037A =: uni1FA5 ;
+% LIGKERN uni1F66 uni037A =: uni1FA6 ; uni1F67 uni037A =: uni1FA7 ;
+% LIGKERN uni1F7C uni037A =: uni1FF2 ; uni1FF6 uni037A =: uni1FF7 ;
+% LIGKERN uni1FBF rho =: uni1FE4 ; uni1FFE rho =: uni1FE5 ;
+% LIGKERN || = 01 ; sigma || =:| sigma1 ; sigma guillemotright =:| sigma1 ;
+% LIGKERN sigma parenright =:| sigma1 ; sigma period =:| sigma1 ;
+% LIGKERN sigma comma =:| sigma1 ; sigma exclam =:| sigma1 ;
+% LIGKERN sigma semicolon =:| sigma1 ; sigma anoteleia =:| sigma1 ;
+% LIGKERN Alpha uni1FBE =: uni1FBC ;
+% LIGKERN Eta uni1FBE =: uni1FCC ;
+% LIGKERN Omega uni1FBE =: uni1FFC ;
diff --git a/fonts/utilities/fontools/share/fontools_ly1.enc b/fonts/utilities/fontools/share/fontools_ly1.enc
new file mode 100644
index 0000000000..70133cc9c0
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_ly1.enc
@@ -0,0 +1,306 @@
+% A version of the LY1 encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX TYPEWRITER AND WINDOWS ANSI
+/otftotfmLY1Encoding [
+% 0x00
+/.notdef
+/Euro
+/.notdef
+/.notdef
+/fraction
+/dotaccent
+/hungarumlaut
+/ogonek
+% 0x08
+/.notdef
+/.notdef
+/cwm
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x10
+/dotlessi
+/dotlessj
+/grave
+/acute
+/caron
+/breve
+/macron
+/ring
+% 0x18
+/cedilla
+/germandbls
+/ae
+/oe
+/oslash
+/AE
+/OE
+/Oslash
+% 0x20
+/space
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/circumflex
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/tilde
+/dieresis
+% 0x80
+/Lslash
+/quotesingle
+/quotesinglbase
+/florin
+/quotedblbase
+/ellipsis
+/dagger
+/daggerdbl
+% 0x88
+/circumflex
+/perthousand
+/Scaron
+/guilsinglleft
+/OE
+/Zcaron
+/asciicircum
+/minus
+% 0x90
+/lslash
+/quoteleft
+/quoteright
+/quotedblleft
+/quotedblright
+/bullet
+/endash
+/emdash
+% 0x98
+/tilde
+/trademark
+/scaron
+/guilsinglright
+/oe
+/zcaron
+/asciitilde
+/Ydieresis
+% 0xA0
+/cwm
+/exclamdown
+/cent
+/sterling
+/currency
+/yen
+/brokenbar
+/section
+% 0xA8
+/dieresis
+/copyright
+/ordfeminine
+/guillemotleft
+/logicalnot
+/sfthyphen
+/registered
+/macron
+% 0xB0
+/degree
+/plusminus
+/twosuperior
+/threesuperior
+/acute
+/mu
+/paragraph
+/periodcentered
+% 0xB8
+/cedilla
+/onesuperior
+/ordmasculine
+/guillemotright
+/onequarter
+/onehalf
+/threequarters
+/questiondown
+% 0xC0
+/Agrave
+/Aacute
+/Acircumflex
+/Atilde
+/Adieresis
+/Aring
+/AE
+/Ccedilla
+% 0xC8
+/Egrave
+/Eacute
+/Ecircumflex
+/Edieresis
+/Igrave
+/Iacute
+/Icircumflex
+/Idieresis
+% 0xD0
+/Eth
+/Ntilde
+/Ograve
+/Oacute
+/Ocircumflex
+/Otilde
+/Odieresis
+/multiply
+% 0xD8
+/Oslash
+/Ugrave
+/Uacute
+/Ucircumflex
+/Udieresis
+/Yacute
+/Thorn
+/germandbls
+% 0xE0
+/agrave
+/aacute
+/acircumflex
+/atilde
+/adieresis
+/aring
+/ae
+/ccedilla
+% 0xE8
+/egrave
+/eacute
+/ecircumflex
+/edieresis
+/igrave
+/iacute
+/icircumflex
+/idieresis
+% 0xF0
+/eth
+/ntilde
+/ograve
+/oacute
+/ocircumflex
+/otilde
+/odieresis
+/divide
+% 0xF8
+/oslash
+/ugrave
+/uacute
+/ucircumflex
+/udieresis
+/yacute
+/thorn
+/ydieresis
+] def
+%
+% LIGKERN question quoteleft =: questiondown;
+% LIGKERN exclam quoteleft =: exclamdown;
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+% LIGKERN comma comma =: quotedblbase;
+% LIGKERN less less =: guillemotleft;
+% LIGKERN greater greater =: guillemotright;
+%
+% LIGKERN || = 32;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_ot1.enc b/fonts/utilities/fontools/share/fontools_ot1.enc
new file mode 100644
index 0000000000..47a0fbc2f5
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_ot1.enc
@@ -0,0 +1,303 @@
+% A version of the OT1 encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX TEXT
+/otftotfmOT1Encoding [
+% 0x00
+/Gamma
+/Delta
+/Theta
+/Lambda
+/Xi
+/Pi
+/Sigma
+/Upsilon
+% 0x08
+/Phi
+/Psi
+/Omega
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x10
+/dotlessi
+/dotlessj
+/grave
+/acute
+/caron
+/breve
+/macron
+/ring
+% 0x18
+/cedilla
+/germandbls
+/ae
+/oe
+/oslash
+/AE
+/OE
+/Oslash
+% 0x20
+/space
+/exclam
+/quotedblright
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/exclamdown
+/equal
+/questiondown
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/quotedblleft
+/bracketright
+/circumflex
+/dotaccent
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/endash
+/emdash
+/hungarumlaut
+/tilde
+/dieresis
+% 0x80
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x88
+/.notdef
+/.notdef
+/Lslash
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x90
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x98
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xA0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xA8
+/.notdef
+/.notdef
+/lslash
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xB0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xB8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xC0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xC8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xD0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xD8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xE0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xE8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xF0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xF8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+] def
+%
+% LIGKERN question quoteleft =: questiondown;
+% LIGKERN exclam quoteleft =: exclamdown;
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+%
+% LIGKERN || = 32;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_t1.enc b/fonts/utilities/fontools/share/fontools_t1.enc
new file mode 100644
index 0000000000..6376b6f028
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_t1.enc
@@ -0,0 +1,306 @@
+% A version of the T1 encoding, intended for use with otftotfm.
+% CODINGSCHEME EXTENDED TEX FONT ENCODING - LATIN
+/otftotfmT1Encoding [
+% 0x00
+/grave
+/acute
+/circumflex
+/tilde
+/dieresis
+/hungarumlaut
+/ring
+/caron
+% 0x08
+/breve
+/macron
+/dotaccent
+/cedilla
+/ogonek
+/quotesinglbase
+/guilsinglleft
+/guilsinglright
+% 0x10
+/quotedblleft
+/quotedblright
+/quotedblbase
+/guillemotleft
+/guillemotright
+/endash
+/emdash
+/cwm
+% 0x18
+/perthousandzero
+/dotlessi
+/dotlessj
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x20
+/space
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/asciicircum
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/asciitilde
+/hyphenchar
+% 0x80
+/Abreve
+/Aogonek
+/Cacute
+/Ccaron
+/Dcaron
+/Ecaron
+/Eogonek
+/Gbreve
+% 0x88
+/Lacute
+/Lcaron
+/Lslash
+/Nacute
+/Ncaron
+/Eng
+/Ohungarumlaut
+/Racute
+% 0x90
+/Rcaron
+/Sacute
+/Scaron
+/Scedilla
+/Tcaron
+/Tcedilla
+/Uhungarumlaut
+/Uring
+% 0x98
+/Ydieresis
+/Zacute
+/Zcaron
+/Zdotaccent
+/IJ
+/Idotaccent
+/dbar
+/section
+% 0xA0
+/abreve
+/aogonek
+/cacute
+/ccaron
+/dcaron
+/ecaron
+/eogonek
+/gbreve
+% 0xA8
+/lacute
+/lcaron
+/lslash
+/nacute
+/ncaron
+/eng
+/ohungarumlaut
+/racute
+% 0xB0
+/rcaron
+/sacute
+/scaron
+/scedilla
+/tcaron
+/tcedilla
+/uhungarumlaut
+/uring
+% 0xB8
+/ydieresis
+/zacute
+/zcaron
+/zdotaccent
+/ij
+/exclamdown
+/questiondown
+/sterling
+% 0xC0
+/Agrave
+/Aacute
+/Acircumflex
+/Atilde
+/Adieresis
+/Aring
+/AE
+/Ccedilla
+% 0xC8
+/Egrave
+/Eacute
+/Ecircumflex
+/Edieresis
+/Igrave
+/Iacute
+/Icircumflex
+/Idieresis
+% 0xD0
+/Eth
+/Ntilde
+/Ograve
+/Oacute
+/Ocircumflex
+/Otilde
+/Odieresis
+/OE
+% 0xD8
+/Oslash
+/Ugrave
+/Uacute
+/Ucircumflex
+/Udieresis
+/Yacute
+/Thorn
+/SS
+% 0xE0
+/agrave
+/aacute
+/acircumflex
+/atilde
+/adieresis
+/aring
+/ae
+/ccedilla
+% 0xE8
+/egrave
+/eacute
+/ecircumflex
+/edieresis
+/igrave
+/iacute
+/icircumflex
+/idieresis
+% 0xF0
+/eth
+/ntilde
+/ograve
+/oacute
+/ocircumflex
+/otilde
+/odieresis
+/oe
+% 0xF8
+/oslash
+/ugrave
+/uacute
+/ucircumflex
+/udieresis
+/yacute
+/thorn
+/germandbls
+] def
+%
+% LIGKERN question quoteleft =: questiondown;
+% LIGKERN exclam quoteleft =: exclamdown;
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+% LIGKERN comma comma =: quotedblbase;
+% LIGKERN less less =: guillemotleft;
+% LIGKERN greater greater =: guillemotright;
+%
+% LIGKERN || = 32 ;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_t2a.enc b/fonts/utilities/fontools/share/fontools_t2a.enc
new file mode 100644
index 0000000000..418cb4990a
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_t2a.enc
@@ -0,0 +1,304 @@
+% A version of the T2A encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX CYRILLIC FONT ENCODING - T2A
+/otftotfmT2AEncoding [
+% 0x00
+/grave
+/acute
+/circumflex
+/tilde
+/dieresis
+/hungarumlaut
+/ring
+/caron
+% 0x08
+/breve
+/macron
+/dotaccent
+/cedilla
+/ogonek
+/uni04C0
+/angleleft
+/angleright
+% 0x10
+/quotedblleft
+/quotedblright
+/cyrflex
+/dblgrave
+/cyrbreve
+/endash
+/emdash
+/.notdef
+% 0x18
+/perthousandzero
+/dotlessi
+/dotlessj
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x20
+/space
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/asciicircum
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/asciitilde
+/hyphen
+% 0x80
+/afii10050
+/uni0492
+/afii10051
+/afii10060
+/uni04BA
+/uni0496
+/uni0498
+/afii10058
+% 0x88
+/afii10056
+/uni049A
+/uni04A0
+/uni049C
+/uni04D4
+/uni04A2
+/uni04A4
+/afii10054
+% 0x90
+/uni04E8
+/uni04AA
+/afii10062
+/uni04AE
+/uni04B0
+/uni04B2
+/afii10145
+/uni04B8
+% 0x98
+/uni04B6
+/afii10053
+/uni04D8
+/afii10059
+/afii10023
+/afii61352
+/currency
+/section
+% 0xA0
+/afii10098
+/uni0493
+/afii10099
+/afii10108
+/uni04BB
+/uni0497
+/uni0499
+/afii10106
+% 0xA8
+/afii10104
+/uni049B
+/uni04A1
+/uni049D
+/uni04D5
+/uni04A3
+/uni04A5
+/afii10102
+% 0xB0
+/uni04E9
+/uni04AB
+/afii10110
+/uni04AF
+/uni04B1
+/uni04B3
+/afii10193
+/uni04B9
+% 0xB8
+/uni04B7
+/afii10101
+/afii10846
+/afii10107
+/afii10071
+/quotedblbase
+/guillemotleft
+/guillemotright
+% 0xC0
+/afii10017
+/afii10018
+/afii10019
+/afii10020
+/afii10021
+/afii10022
+/afii10024
+/afii10025
+% 0xC8
+/afii10026
+/afii10027
+/afii10028
+/afii10029
+/afii10030
+/afii10031
+/afii10032
+/afii10033
+% 0xD0
+/afii10034
+/afii10035
+/afii10036
+/afii10037
+/afii10038
+/afii10039
+/afii10040
+/afii10041
+% 0xD8
+/afii10042
+/afii10043
+/afii10044
+/afii10045
+/afii10046
+/afii10047
+/afii10048
+/afii10049
+% 0xE0
+/afii10065
+/afii10066
+/afii10067
+/afii10068
+/afii10069
+/afii10070
+/afii10072
+/afii10073
+% 0xE8
+/afii10074
+/afii10075
+/afii10076
+/afii10077
+/afii10078
+/afii10079
+/afii10080
+/afii10081
+% 0xF0
+/afii10082
+/afii10083
+/afii10084
+/afii10085
+/afii10086
+/afii10087
+/afii10088
+/afii10089
+% 0xF8
+/afii10090
+/afii10091
+/afii10092
+/afii10093
+/afii10094
+/afii10095
+/afii10096
+/afii10097
+] def
+%
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+% LIGKERN comma comma =: quotedblbase;
+% LIGKERN less less =: guillemotleft;
+% LIGKERN greater greater =: guillemotright4;
+%
+% LIGKERN || = 32 ;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_t2b.enc b/fonts/utilities/fontools/share/fontools_t2b.enc
new file mode 100644
index 0000000000..3ae126d6c4
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_t2b.enc
@@ -0,0 +1,304 @@
+% A version of the T2B encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX CYRILLIC FONT ENCODING - T2B
+/otftotfmT2BEncoding [
+% 0x00
+/grave
+/acute
+/circumflex
+/tilde
+/dieresis
+/hungarumlaut
+/ring
+/caron
+% 0x08
+/breve
+/macron
+/dotaccent
+/cedilla
+/ogonek
+/uni04C0
+/angleleft
+/angleright
+% 0x10
+/quotedblleft
+/quotedblright
+/cyrflex
+/dblgrave
+/cyrbreve
+/endash
+/emdash
+/.notdef
+% 0x18
+/perthousandzero
+/dotlessi
+/dotlessj
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x20
+/space
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/asciicircum
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/asciitilde
+/hyphen
+% 0x80
+/CYRGDSCHCRS % CYRILLIC CAPITAL LETTER GHE WITH STROKE AND DESCENDER
+/uni0492
+/CYRGDSC % CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+/uni0494
+/uni04BA
+/uni0496
+/CYRDELTA % CYRILLIC CAPITAL LETTER DELTA
+/uni04E0
+% 0x88
+/afii10058
+/uni049A
+/CYRLDSC % CYRILLIC CAPITAL LETTER EL WITH DESCENDER
+/uni04C3
+/CYRLHK % CYRILLIC CAPITAL LETTER EL WITH HOOK
+/uni04A2
+/uni04A4
+/uni04C7
+% 0x90
+/uni04E8
+/CYRSACRS % CYRILLIC CAPITAL LETTER ES WITH STROKE
+/afii10062
+/uni04AE
+/CYRHHCRS % CYRILLIC CAPITAL LETTER HA WITH STROKE
+/uni04B2
+/CYRHHK % CYRILLIC CAPITAL LETTER HA WITH HOOK
+/uni04CB
+% 0x98
+/uni04B6
+/afii10059
+/uni04D8
+/CYREPS % CYRILLIC CAPITAL LETTER EPSILON
+/afii10023
+/afii61352
+/currency
+/section
+% 0xA0
+/cyrgdschcrs % CYRILLIC SMALL LETTER GHE WITH STROKE AND DESCENDER
+/uni0493
+/cyrgdsc % CYRILLIC SMALL LETTER GHE WITH DESCENDER
+/uni0495
+/uni04BB
+/uni0497
+/cyrdelta % CYRILLIC SMALL LETTER DELTA
+/uni04E1
+% 0xA8
+/afii10106
+/uni049B
+/cyrldsc % CYRILLIC SMALL LETTER EL WITH DESCENDER
+/uni04C4
+/cyrlhk % CYRILLIC SMALL LETTER EL WITH HOOK
+/uni04A3
+/uni04A5
+/uni04C8
+% 0xB0
+/uni04E9
+/cyrsacrs % CYRILLIC SMALL LETTER ES WITH STROKE
+/afii10110
+/uni04AF
+/cyrhhcrs % CYRILLIC SMALL LETTER HA WITH STROKE
+/uni04B3
+/cyrhhk % CYRILLIC SMALL LETTER HA WITH HOOK
+/uni04CC
+% 0xB8
+/uni04B7
+/afii10107
+/afii10846
+/cyreps % CYRILLIC SMALL LETTER EPSILON
+/afii10071
+/quotedblbase
+/guillemotleft
+/guillemotright
+% 0xC0
+/afii10017
+/afii10018
+/afii10019
+/afii10020
+/afii10021
+/afii10022
+/afii10024
+/afii10025
+% 0xC8
+/afii10026
+/afii10027
+/afii10028
+/afii10029
+/afii10030
+/afii10031
+/afii10032
+/afii10033
+% 0xD0
+/afii10034
+/afii10035
+/afii10036
+/afii10037
+/afii10038
+/afii10039
+/afii10040
+/afii10041
+% 0xD8
+/afii10042
+/afii10043
+/afii10044
+/afii10045
+/afii10046
+/afii10047
+/afii10048
+/afii10049
+% 0xE0
+/afii10065
+/afii10066
+/afii10067
+/afii10068
+/afii10069
+/afii10070
+/afii10072
+/afii10073
+% 0xE8
+/afii10074
+/afii10075
+/afii10076
+/afii10077
+/afii10078
+/afii10079
+/afii10080
+/afii10081
+% 0xF0
+/afii10082
+/afii10083
+/afii10084
+/afii10085
+/afii10086
+/afii10087
+/afii10088
+/afii10089
+% 0xF8
+/afii10090
+/afii10091
+/afii10092
+/afii10093
+/afii10094
+/afii10095
+/afii10096
+/afii10097
+] def
+%
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+% LIGKERN comma comma =: quotedblbase;
+% LIGKERN less less =: guillemotleft;
+% LIGKERN greater greater =: guillemotright4;
+%
+% LIGKERN || = 32 ;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_t2c.enc b/fonts/utilities/fontools/share/fontools_t2c.enc
new file mode 100644
index 0000000000..52f5d1cf96
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_t2c.enc
@@ -0,0 +1,304 @@
+% A version of the T2C encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX CYRILLIC FONT ENCODING - T2C
+/otftotfmT2CEncoding [
+% 0x00
+/grave
+/acute
+/circumflex
+/tilde
+/dieresis
+/hungarumlaut
+/ring
+/caron
+% 0x08
+/breve
+/macron
+/dotaccent
+/cedilla
+/ogonek
+/uni04C0
+/angleleft
+/angleright
+% 0x10
+/quotedblleft
+/quotedblright
+/cyrflex
+/dblgrave
+/cyrbreve
+/endash
+/emdash
+/.notdef
+% 0x10
+/perthousandzero
+/dotlessi
+/dotlessj
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x20
+/space
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+% 0x28
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+% 0x38
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+% 0x48
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+% 0x58
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/asciicircum
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+% 0x68
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+% 0x78
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/asciitilde
+/hyphen
+% 0x80
+/uni04A6
+/uni04B4
+/uni04AC
+/uni0494
+/uni04BA
+/CYRRDSC % CYRILLIC CAPITAL LETTER ER WITH DESCENDER
+/uni048E
+/uni04E0
+% 0x88
+/CYRMDSC % CYRILLIC CAPITAL LETTER EM WITH DESCENDER
+/uni049A
+/CYRLDSC % CYRILLIC CAPITAL LETTER EL WITH DESCENDER
+/uni049E
+/CYRLHK % CYRILLIC CAPITAL LETTER EL WITH HOOK
+/uni04A2
+/CYRMHK % CYRILLIC CAPITAL LETTER EM WITH HOOK
+/uni04C7
+% 0x90
+/uni04E8
+/uni04BC
+/uni04BE
+/uni048C
+/CYRISHRTDSC % CYRILLIC CAPITAL LETTER SHORT I WITH DESCENDER
+/uni04B2
+/afii10145
+/uni04A8
+% 0x98
+/uni04B6
+/CYRNLHK % CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
+/uni04D8
+/CYRRHK % CYRILLIC CAPITAL LETTER ER WITH HOOK
+/afii10023
+/afii61352
+/currency
+/section
+% 0xA0
+/uni04A7
+/uni04B5
+/uni04AD
+/uni0495
+/uni04BB
+/cyrrdsc % CYRILLIC SMALL LETTER ER WITH DESCENDER
+/uni048F
+/uni04E1
+% 0xA8
+/cyrmdsc % CYRILLIC SMALL LETTER EM WITH DESCENDER
+/uni049B
+/cyrldsc % CYRILLIC SMALL LETTER EL WITH DESCENDER
+/uni049F
+/cyrlhk % CYRILLIC SMALL LETTER EL WITH HOOK
+/uni04A3
+/cyrmhk % CYRILLIC SMALL LETTER EM WITH HOOK
+/uni04C8
+% 0xB0
+/uni04E9
+/uni04BD
+/uni04BF
+/uni048D
+/cyrishrtdsc % CYRILLIC SMALL LETTER SHORT I WITH DESCENDER
+/uni04B3
+/afii10193
+/uni04A9
+% 0xB8
+/uni04B7
+/cyrnlhk % CYRILLIC SMALL LETTER EN WITH LEFT HOOK
+/afii10846
+/cyrrhk % CYRILLIC SMALL LETTER ER WITH HOOK
+/afii10071
+/quotedblbase
+/guillemotleft
+/guillemotright
+% 0xC0
+/afii10017
+/afii10018
+/afii10019
+/afii10020
+/afii10021
+/afii10022
+/afii10024
+/afii10025
+% 0xC8
+/afii10026
+/afii10027
+/afii10028
+/afii10029
+/afii10030
+/afii10031
+/afii10032
+/afii10033
+% 0xD0
+/afii10034
+/afii10035
+/afii10036
+/afii10037
+/afii10038
+/afii10039
+/afii10040
+/afii10041
+% 0xD8
+/afii10042
+/afii10043
+/afii10044
+/afii10045
+/afii10046
+/afii10047
+/afii10048
+/afii10049
+% 0xE0
+/afii10065
+/afii10066
+/afii10067
+/afii10068
+/afii10069
+/afii10070
+/afii10072
+/afii10073
+% 0xE8
+/afii10074
+/afii10075
+/afii10076
+/afii10077
+/afii10078
+/afii10079
+/afii10080
+/afii10081
+% 0xF0
+/afii10082
+/afii10083
+/afii10084
+/afii10085
+/afii10086
+/afii10087
+/afii10088
+/afii10089
+% 0xF8
+/afii10090
+/afii10091
+/afii10092
+/afii10093
+/afii10094
+/afii10095
+/afii10096
+/afii10097
+] def
+%
+% LIGKERN hyphen hyphen =: endash;
+% LIGKERN endash hyphen =: emdash;
+% LIGKERN quoteleft quoteleft =: quotedblleft;
+% LIGKERN quoteright quoteright =: quotedblright;
+% LIGKERN comma comma =: quotedblbase;
+% LIGKERN less less =: guillemotleft;
+% LIGKERN greater greater =: guillemotright4;
+%
+% LIGKERN || = 32 ;
+%
+% UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
diff --git a/fonts/utilities/fontools/share/fontools_t3.enc b/fonts/utilities/fontools/share/fontools_t3.enc
new file mode 100644
index 0000000000..443073dcdf
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_t3.enc
@@ -0,0 +1,276 @@
+% A version of the T3 encoding, intended for use with otftotfm.
+% CODINGSCHEME IPA ENCODING
+/otftotfmT3Encoding [
+% 0x00
+/uni02CB
+/uni02CA
+/uni02C6
+/uni02DC
+/dieresis
+/uni02BA
+/uni02DA
+/uni02C7
+/uni02D8
+/uni02C9
+/uni02D9
+/cedilla
+/uni02DB
+/space_uni030F
+/subgrave
+/subacute
+% 0x10
+/space_uni0311
+/space_uni032A
+/space_uni033A
+/space_uni033B
+/uni02BE
+/uni02BF
+/space_uni032B
+/space_uni033C
+/uni02DF
+/dotlessi
+/dotlessj
+/uni02D6
+/uni02D4
+/uni02D5
+/advancing
+/retracting
+% 0x20
+/celpal
+/uni01C3
+/uni02C8
+/hooktop
+/space_uni0322
+/space_uni0321
+/uni0360
+/quoteright
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/uni0289
+/uni0268
+/uni028C
+/uni025C
+/uni0265
+/uni0250
+/uni0252
+/uni0264
+/uni0275
+/uni0258
+/uni02D0
+/uni02D1
+/uni203F
+/equal
+/uni2322
+/question
+% 0x40
+/uni0259
+/uni0251
+/beta.ipa
+/uni0255
+/eth
+/uni025B
+/uni0278
+/uni0263
+/uni0266
+/uni026A
+/uni029D
+/uni0281
+/uni028E
+/uni0271
+/eng.ipa
+/uni0254
+% 0x50
+/uni0294
+/uni0295
+/uni027E
+/uni0283
+/theta.ipa
+/uni028A
+/uni028B
+/uni026F
+/chi.ipa
+/uni028F
+/uni0292
+/bracketleft
+/uni02BD
+/bracketright
+/uni02FA
+/uni02F9
+% 0x60
+/uni02BB
+/a
+/b
+/c
+/d
+/e
+/f
+/uni0261
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+/x
+/y
+/z
+/uni01C1
+/uni01C0
+/uni01C2
+/uni02DE
+/uni02CC
+% 0x80
+/longleveltone
+/longfallingtone1
+/longfallingtone2
+/longfallingtone3
+/longfallingtone4
+/longrisingtone1
+/longrisingtone2
+/longrisingtone3
+/longrisingtone4
+/shortleveltone
+/shortfallingtone1
+/shortfallingtone2
+/shortfallingtone3
+/shortfallingtone4
+/shortrisingtone1
+/shortrisingtone2
+% 0x90
+/shortrisingtone3
+/shortrisingtone4
+/uni2502
+/uni2551
+/uniA71C
+/uniA71B
+/uni2197
+/uni2198
+/uni1DC4
+/uni1DC5
+/uni1DC8
+/uni1DC9
+/space_uni030D
+/space_uni030E
+/gravedot
+/dotacute
+% 0xa0
+/uni0180
+/uni0111
+/uni0221
+/uni1D91
+/uni1D07
+/g
+/longilefthook
+/uni0285
+/uni1D0A
+/uni029E
+/uni019A
+/lambda.ipa
+/uni019b
+/lyogh.old
+/uni0235
+/turnce
+% 0xb0
+/omega.ipa
+/omega.sc.ipa
+/uni0286
+/uni01AB
+/uni0236
+/uni02A6
+/uni02AE
+/uni02AF
+/uni0293
+/uni01B9
+/afii10094
+/afii10092
+/uni02C0
+/uni02C2
+/uni02C3
+/pipe.var
+% 0xc0
+/uni1D00
+/uni0188
+/uni0297
+/uni02A4
+/uni025A
+/uni029A
+/uni025E
+/uni025D
+/babygamma.old
+/uni029B
+/uni0267
+/uni029C
+/uni0269
+/bardotlessjold
+/uni0199
+/uni029F
+% 0xd0
+/uni026E
+/uni0277
+/uni01A5
+/uni02A0
+/uni027C
+/uni027A
+/uni01AD
+/uni0276
+/uni0287
+/uni02A7
+/uni1D1C
+/uni0296
+/uni02A1
+/uni02A2
+/uni0225
+/uni01BF
+% 0xe0
+/uni0299
+/uni0253
+/uni0257
+/uni0256
+/uni0260
+/uni0262
+/uni00E6
+/uni00E7
+/uni0127
+/uni025F
+/uni0284
+/uni026B
+/uni026C
+/uni026D
+/uni0270
+/uni0273
+% 0xf0
+/uni0274
+/uni0272
+/uni0298
+/uni027D
+/uni0279
+/uni027B
+/uni0280
+/uni0153
+/uni00F8
+/uni0282
+/uni0288
+/uni028D
+/uni0290
+/uni0291
+/uni00FE
+/uni0195
+] def
diff --git a/fonts/utilities/fontools/share/fontools_ts1.enc b/fonts/utilities/fontools/share/fontools_ts1.enc
new file mode 100644
index 0000000000..6905d2ff60
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_ts1.enc
@@ -0,0 +1,293 @@
+% A version of the TS1 encoding, intended for use with otftotfm.
+% CODINGSCHEME TEX TEXT COMPANION SYMBOLS 1---TS1
+/otftotfmTS1Encoding [
+% 0x00
+/capitalgrave
+/capitalacute
+/capitalcircumflex
+/capitaltilde
+/capitaldieresis
+/capitalhungarumlaut
+/capitalring
+/capitalcaron
+% 0x08
+/capitalbreve
+/capitalmacron
+/capitaldotaccent
+/cedilla
+/ogonek
+/quotesinglbase
+/.notdef
+/.notdef
+% 0x10
+/.notdef
+/.notdef
+/quotedblbase
+/.notdef
+/.notdef
+/twelveudash
+/threequartersemdash
+/capitalcompwordmark
+% 0x18
+/arrowleft
+/arrowright
+/tieaccentlowercase
+/tieaccentcapital
+/newtieaccentlowercase
+/newtieaccentcapital
+/.notdef
+/ascendercompwordmark
+% 0x20
+/blank
+/.notdef
+/.notdef
+/.notdef
+/dollar
+/.notdef
+/.notdef
+/quotesingle
+% 0x28
+/.notdef
+/.notdef
+/asteriskcentered
+/.notdef
+/comma
+/hyphendbl
+/period
+/fraction
+% 0x30
+/zerooldstyle
+/oneoldstyle
+/twooldstyle
+/threeoldstyle
+/fouroldstyle
+/fiveoldstyle
+/sixoldstyle
+/sevenoldstyle
+% 0x38
+/eightoldstyle
+/nineoldstyle
+/.notdef
+/.notdef
+/angbracketleft
+/minus
+/angbracketright
+/.notdef
+% 0x40
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x48
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Omegainv
+/.notdef
+/bigcircle
+% 0x50
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Omega
+% 0x58
+/.notdef
+/.notdef
+/.notdef
+/openbracketleft
+/.notdef
+/openbracketright
+/arrowup
+/arrowdown
+% 0x60
+/asciigrave
+/.notdef
+/born
+/divorced
+/died
+/.notdef
+/.notdef
+/.notdef
+% 0x68
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/leaf
+/married
+/musicalnote
+/.notdef
+% 0x70
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x78
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/tildelow
+/hyphendblchar
+% 0x80
+/asciibreve
+/asciicaron
+/asciiacutedbl
+/asciigravedbl
+/dagger
+/daggerdbl
+/bardbl
+/perthousand
+% 0x88
+/bullet
+/centigrade
+/dollaroldstyle
+/centoldstyle
+/florin
+/colonmonetary
+/won
+/naira
+% 0x90
+/guarani
+/peso
+/lira
+/recipe
+/interrobang
+/interrobangdown
+/dong
+/trademark
+% 0x98
+/pertenthousand
+/pilcrow
+/baht
+/numero
+/discount
+/estimated
+/openbullet
+/servicemark
+% 0xA0
+/quillbracketleft
+/quillbracketright
+/cent
+/sterling
+/currency
+/yen
+/brokenbar
+/section
+% 0xA8
+/asciidieresis
+/copyright
+/ordfeminine
+/copyleft
+/logicalnot
+/circledP
+/registered
+/asciimacron
+% 0xB0
+/degree
+/plusminus
+/twosuperior
+/threesuperior
+/asciiacute
+/mu
+/paragraph
+/periodcentered
+% 0xB8
+/referencemark
+/onesuperior
+/ordmasculine
+/radical
+/onequarter
+/onehalf
+/threequarters
+/euro
+% 0xC0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xC8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xD0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/multiply
+/.notdef
+% 0xD8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xE0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xE8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xF0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/divide
+/.notdef
+% 0xF8
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+] def
+
diff --git a/fonts/utilities/fontools/share/fontools_ts3.enc b/fonts/utilities/fontools/share/fontools_ts3.enc
new file mode 100644
index 0000000000..15ebbb33d0
--- /dev/null
+++ b/fonts/utilities/fontools/share/fontools_ts3.enc
@@ -0,0 +1,276 @@
+% A version of the TS3 encoding, intended for use with otftotfm.
+% CODINGSCHEME IPA SYMBOL ENCODING
+/otftotfmTS3Encoding [
+% 0x00
+/revpolhook
+/rhooklong
+/palhooklong
+/palhookvar
+/rectanglesuperscript
+/leftarrowsuperscript
+/uni02D7
+/arrowdown.ipa
+/uparrow.ipa
+/uni0362
+/space_uni034D
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x10
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x20
+/uni1D90
+/scriptainverted
+/uniA735
+/uniA72D
+/uni0297.var
+/stretchccurl
+/stretchcvarcurl
+/dfronthook
+/dfronthook.var
+/uni0238
+/uni1D92
+/uni1D93
+/gamma.ipa
+/gammafronttail
+/gammabacktail
+/hhookrtail
+% 0x30
+/uniA727
+/uni027F
+/jcrossedtailvar
+/uni0284.var
+/hm
+/nfrontbar
+/uni019E
+/female
+/uni26B2
+/uni0298.old
+/uni1D97
+/omegainverted
+/plhook
+/uni0239
+/uni01AA
+/tfronthook
+% 0x40
+/invertedtcurl
+/twoturned
+/uni01BA
+/threeturned
+/invertedglotstopcurl
+/glotstopturned
+/pipe.var
+/uni01C1.var
+/uni01C2.var
+/lr
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x50
+/thorn.var1
+/thorn.var2
+/thorn.var3
+/thorn.var4
+/uni0294.var1
+/uni0294.var2
+/uni0294.var3
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x60
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x70
+/ascinverted
+/ao.sc
+/delta.sc.ipa
+/uniA730
+/uni1D0B
+/kscturned
+/lscreversed
+/uni1D0D
+/uni1D18
+/q.sc.ipa
+/uni1D19
+/uscturned
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x80
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x90
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xa0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xb0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xc0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xd0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xe0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xf0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+] def
diff --git a/fonts/utilities/jfmutil/LICENSE b/fonts/utilities/jfmutil/LICENSE
new file mode 100644
index 0000000000..534324b756
--- /dev/null
+++ b/fonts/utilities/jfmutil/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2019 Takayuki YATO (aka. "ZR")
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/fonts/utilities/jfmutil/README-ja.md b/fonts/utilities/jfmutil/README-ja.md
new file mode 100644
index 0000000000..87f5a30c88
--- /dev/null
+++ b/fonts/utilities/jfmutil/README-ja.md
@@ -0,0 +1,498 @@
+jfmutil
+=======
+
+Perl: pTeX ã® TFM/VF ã‚’æ“作ã™ã‚‹ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£
+
+(u)pTeX ã®è«–ç†ãƒ•ã‚©ãƒ³ãƒˆã«é–¢ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆJFM ãŠã‚ˆã³ VF)をæ“作ã™ã‚‹
+種々ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹ãƒ„ールã§ã‚る。ç¾åœ¨ã®ã¨ã“ã‚ã€æ¬¡ã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãる。
+
+ - 和文ã®ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆï¼ˆVF・JFM ã®çµ„)ã«å¯¾å¿œã™ã‚‹ç‹¬è‡ªä»•æ§˜ã®ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã§
+ ã‚る「ZVP å½¢å¼ã€ã¨ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã¨ã®é–“ã®ç›¸äº’変æ›ã€‚今ã¾ã§ã€å’Œæ–‡ VF ã®
+ 生æˆãƒ»ç·¨é›†ã¯ãã‚Œã«å¯¾å¿œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ãŒãªã‹ã£ãŸãŸã‚éžå¸¸ã«é¢å€’ã§
+ ã‚ã£ãŸã€‚ZVP å½¢å¼ã‚’使ã†ã“ã¨ã§ã€å’Œæ–‡ VF ã®æ–°è¦ä½œæˆã‚„編集ãŒå®¹æ˜“ã«ãªã‚‹
+ ã“ã¨ãŒæœŸå¾…ã§ãる。
+ - ZVP 中㮠VF ã«ç›´æŽ¥å¯¾å¿œã™ã‚‹éƒ¨åˆ†ã‚’抜ã出ã—ãŸã€ŒZVP0 å½¢å¼ã€ã¨ VF (和文/
+ 欧文)ã¨ã®é–“ã®ç›¸äº’変æ›ã€‚
+ - 仮想フォントã®åˆ¥åã§ã®è¤‡è£½ã€‚ã“ã®å ´åˆã€VF 中ã«è¨˜éŒ²ã•ã‚ŒãŸå‚ç…§ TFM åã‚‚
+ é©åˆ‡ã«å¤‰æ›´ã•ã‚Œã‚‹ã€‚
+
+### å‰æ環境
+
+ - Perl 処ç†ç³»: v5.8.1 以é™
+ - pTeX ã®é…布ã«å«ã¾ã‚Œã‚‹ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰
+ - kpsewhich
+ - ppltotf, ptftopl
+
+### å‚考サイト
+
+ - PXutil パッケージ
+ En toi Pythmeni tes TeXnopoleos ~電脳世界ã®å¥¥åº•ã«ã¦ï½ž
+ <http://zrbabbler.sp.land.to/pxutil.html>
+ pxutil を用ã„ãŸå’Œæ–‡ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã®æ”¹å¤‰ã®æ–¹æ³•ã«ã¤ã„ã¦è§£èª¬ã•ã‚Œã¦ã„る。
+ jfmutil 㯠pxutil ã®ä¸Šä½äº’æ›ãªã®ã§ã€ã“ã®è¨˜äº‹ã®å†…容ã¯å˜ã«ã‚³ãƒžãƒ³ãƒ‰åã‚’
+ `pxutil` ã‹ã‚‰ `jfmutil` ã«å¤‰ãˆã‚‹ã“ã¨ã§ãã®ã¾ã¾é€šç”¨ã™ã‚‹ã€‚
+
+ - PXcopyfont パッケージ
+ En toi Pythmeni tes TeXnopoleos ~電脳世界ã®å¥¥åº•ã«ã¦ï½ž
+ <http://zrbabbler.sp.land.to/pxcopyfont.html>
+ pxcopyfont を用ã„ãŸä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã®è¤‡è£½ã®æ–¹æ³•ã«ã¤ã„ã¦è§£èª¬ã•ã‚Œã¦ã„る。
+ pxcopyfont 㨠jfmutil ã®é–¢ä¿‚ã«ã¤ã„ã¦ã¯å¾Œè¿°ã€‚
+
+### pxutil ã¨ã®é–¢ä¿‚
+
+jfmutil ã® ZVP 関連ã®æ©Ÿèƒ½ã¯ [pxutil] ã¨ç­‰ä¾¡ã§ã‚る。pxutil ã®å‹•ä½œã®ãŸã‚ã«ã¯
+ZRTeXtor モジュールを別途インストールã™ã‚‹å¿…è¦ãŒã‚ã£ãŸã€‚CTAN ã«ç™»éŒ²ã™ã‚‹ã«
+ã‚ãŸã£ã¦å˜ä½“ã§å‹•ä½œã™ã‚‹ãƒ—ログラムã®æ–¹ãŒã‚ˆã„ã¨è€ƒãˆã€pxutil ã« ZRTeXtor ã®
+コードã®ä¸€éƒ¨ã‚’ä½µåˆã—ãŸã‚‚ã®ãŒå½“åˆã® jfmutil ã§ã‚る。
+
+[pxutil]: https://github.com/zr-tex8r/PXutil
+
+jfmutil 㨠pxutil ã®ç›¸é•ç‚¹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã‚る:
+
+ - jfmutil 㯠ZRTeXtor ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆ`ZRTeXtor.cfg`)をå‚ç…§ã—ãªã„。
+ 設定対象ã®å€¤ã¯å…¨ã¦æ—¢å®šå€¤ãŒä½¿ã‚れる。
+ - ãŸã ã—ã€æ¼¢å­—コードã¯å¤–部・内部ã¨ã‚‚ã«â€œç„¡åŠ¹â€(`none`)を指定ã—ã¦ã„る。
+ ã“ã®ãŸã‚ã€`-E` オプション指定ãŒæ—¢å®šã®çŠ¶æ…‹ã¨ãªã‚‹ã€‚
+ - ãªãŠã€ZRTeXtor ã® 1.4.0 版よりã€è¨­å®šé …ç›® `tftopl`/`pltotf` ã®æ—¢å®šå€¤ã¯
+ `ptftopl`/`ppltotf` ã¨ãªã£ã¦ã„る。
+
+### pxcopyfont ã¨ã®é–¢ä¿‚
+
+jfmutil ã®ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆè¤‡è£½ã®æ©Ÿèƒ½ã¯ [pxcopyfont] ã‹ã‚‰ç§»æ¤ã—ãŸã‚‚ã®ã§ã‚る。
+
+ - `jfmutil vfinfo in[.vf]`(VF ファイルã®æƒ…報出力)ã¯
+ `pxcopyfont in` ã¨æƒ…報を出力ã™ã‚‹ã€‚ãŸã ã—出力形å¼ã¯ä¸¡è€…ã§ç•°ãªã‚‹ã€‚
+ - `jfmutil vfcopy in[.vf] out[.vf] base[.tfm]...`(VF 複製)ã¯
+ `pxcopyfont in out base...` ã¨ç­‰ä¾¡ã§ã‚る。
+
+### ライセンス
+
+MIT ライセンス
+
+
+機能解説:VF 複製
+-----------------
+
+仮想フォント(VF 㨠TFM ã®çµ„)ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’別ã®åå‰ã§ã‚³ãƒ”ーã™ã‚‹ã€‚一般ã«ã€
+VF ファイルã®ä¸­ã«ã¯å‚ç…§ã™ã‚‹ TFM ã®åå‰ãŒè¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ãŒã€ã‚³ãƒ”ーã®éš›ã«ã¯
+ã“ã® TFM åã¯ã‚³ãƒ”ー先もã®ã«å¤‰æ›´ã•ã‚Œã‚‹ã€‚(従ã£ã¦ã€VF ファイルã«ã¤ã„ã¦ã¯ã€
+コピー元ã¨ã‚³ãƒ”ー先ã¯ãƒã‚¤ãƒŠãƒªåŒä¸€ã«ã¯ãªã‚‰ãªã„。)
+
+### 使用法
+
+ jfmutil vfcopy [<オプション>] <入力.vf> <出力.vf> <出力.tfm>...
+ jfmutil vfinfo [<オプション>] <入力.vf>
+
+※既定ã®æ‹¡å¼µå­ã¯çœç•¥å¯èƒ½ã€‚
+
+`vfinfo` サブコマンド㯠`入力.vf` ã®å‚ç…§ TFM ã®æƒ…報を出力ã™ã‚‹ã€‚例ãˆã°ã€
+upTeX 標準㮠`upjpnrm-h.vf` ã®å ´åˆã€ä»¥ä¸‹ã®å‡ºåŠ›ã«ãªã‚‹ï¼š
+
+ 0=uprml-h
+ 2=upjisr-hq
+
+`vfcopy` サブコマンド㯠`入力.vf` ã¨ãã‚ŒãŒå‚ç…§ã™ã‚‹ TFM 群ã®çµ„ã‚’ã€
+`出力.vf` ã¨ãã®å¾Œã®å¼•æ•°ã§æŒ‡å®šã—㟠TFM 群ã«ã‚³ãƒ”ーã™ã‚‹ã€‚例ãˆã°
+
+ jfmutil vfcopy upjpnrm-h myjpnrm-h myrml-h myjisr-hq
+
+ã¯ä»¥ä¸‹ã®å‹•ä½œã‚’è¡Œã†ï¼š
+
+ - `upjpnrm-h.vf` ã‚’ `myjpnrm-h.vf` ã«æ”¹å¤‰ä»˜ã§ã‚³ãƒ”ーã™ã‚‹ã€‚
+ - `uprml-h.tfm` ã‚’ `myrml-h.tfm` ã«ã‚³ãƒ”ーã™ã‚‹ã€‚
+ - `upjisr-hq.tfm` ã‚’ `myjisr-hq.tfm` ã«ã‚³ãƒ”ーã™ã‚‹ã€‚
+
+引数中ã®å‡ºåŠ› TFM ファイルåã®åˆ—ã¯é€”中㫠`...` を書ã„ã¦ä»¥é™ã‚’çœç•¥ã§ãる。
+ã“ã®å ´åˆã€å¯¾å¿œã™ã‚‹å…¥åŠ› TFM ファイル(入力 VF ã«è¨˜éŒ²ã•ã‚ŒãŸã‚‚ã®ï¼‰ã¨åŒã˜åå‰
+ãŒä½¿ã‚れる。
+
+※TFM ã«ã¤ã„ã¦å…¥åŠ›ã¨å‡ºåŠ›ã®åå‰ãŒåŒã˜å ´åˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚³ãƒ”ーã¯è¡Œã‚ãªã„。
+
+
+機能解説:ZVP 変æ›
+------------------
+
+### TeX ã®ãƒ•ã‚©ãƒ³ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®å½¢å¼
+
+<pre>
+ 使用法ã«ã¤ã„ã¦è¿°ã¹ã‚‹å‰ã«ã€ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŒæ‰±ã†ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã«ã¤ã„ã¦
+ 説明ã—ã¦ãŠã。
+
+ ・ãƒã‚¤ãƒŠãƒªå½¢å¼
+ TeXã€ãŠã‚ˆã³ dvipdfmx 等㮠DVI ウェアãŒå®Ÿéš›ã«ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®å½¢å¼
+ ã§ã‚る。
+
+ TFM (欧文 TFM; æ‹¡å¼µå­ .tfm)
+ フォントã®ãƒ¡ãƒˆãƒªãƒƒã‚¯ãƒ‡ãƒ¼ã‚¿ãŒè¨˜è¼‰ã•ã‚Œã¦ã„る。
+ JFM (和文 TFM; æ‹¡å¼µå­ .tfm)
+ 和文フォントã®ç‚ºã® TFM å½¢å¼ã€‚
+ VF (æ‹¡å¼µå­ .vf)
+ TeX システムãŒç”¨ã„る仮想フォントã®å½¢å¼ã€‚実際ã«ã¯ã€VF ã«ã¯å¿…ãšå¯¾å¿œ
+ ã™ã‚‹ TFM (ベースåãŒä¸€è‡´ã™ã‚‹)ãŒã‚ã‚Šã€ã“ã® 2 ã¤ãŒä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã‚’
+ 構æˆã—ã¦ã„る。VF å½¢å¼ã¯æ¬§æ–‡ã¨å’Œæ–‡ã®ä¸¡æ–¹ã§ç”¨ã„られる。
+
+ ・テキスト形å¼
+ 上記ã®ãƒã‚¤ãƒŠãƒªå½¢å¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’人間ãŒèª­ã‚るよã†ã«ãƒ†ã‚­ã‚¹ãƒˆã§è¡¨ã—ãŸã‚‚ã®ã€‚
+ テキスト形å¼ã¨ãƒã‚¤ãƒŠãƒªå½¢å¼ã®é–“ã®ç›¸äº’変æ›ã‚’ã™ã‚‹ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŒ TeX
+ システムã«ã¯ç”¨æ„ã•ã‚Œã¦ã„る。(*) å°ã¯ä½œè€…(ZR)ãŒæå”±ã™ã‚‹ç‹¬è‡ªã®å½¢å¼ã§
+ ã“れを扱ã†ã®ã« pxutil ãŒå¿…è¦ã§ã‚る。
+
+ PL (æ‹¡å¼µå­ .pl)
+ (欧文) TFM ã«å¯¾å¿œã™ã‚‹å½¢å¼ã€‚
+ JPL (和文 PL; æ‹¡å¼µå­ .pl)
+ JFM ã«å¯¾å¿œã™ã‚‹å½¢å¼ã€‚
+ VPL (æ‹¡å¼µå­ .vpl)
+ 欧文仮想フォント(欧文 TFM 㨠VF ã®çµ„)ã«å¯¾å¿œã™ã‚‹å½¢å¼ã€‚å½¢å¼ã®ç›¸äº’
+ 変æ›ã¯å¿…ãš TFM 㨠VF ã¨ã®çµ„ã®é–“ã§è¡Œã†ã€‚
+ ZPL (æ‹¡å¼µå­ .zpl) (*)
+ JPL ã‚’å°‘ã—æ‹¡å¼µã—ãŸå½¢å¼ã€‚ã‚„ã¯ã‚Š JFM ã¨å¯¾å¿œã™ã‚‹ã€‚
+ ZVP0 (æ‹¡å¼µå­ .zvp0) (*)
+ VF ã¨ç›´æŽ¥å¯¾å¿œã™ã‚‹å½¢å¼ã€‚VPL ã¨ç•°ãªã‚Šã€TFM ã«ç›¸å½“ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’æŒã£ã¦
+ ã„ãªã„。ã ã‹ã‚‰æ¬§æ–‡ã¨å’Œæ–‡ã§å…±é€šã—ã¦ç”¨ã„られる。
+ ZVP (æ‹¡å¼µå­ .zvp)
+ 和文仮想フォント(JFM 㨠VF ã®çµ„)ã«å¯¾å¿œã™ã‚‹å½¢å¼ã€‚ZPL 㨠ZVP0 ã‚’
+ çµ±åˆã—ãŸå½¢ã‚’ã‚‚ã¤ã€‚
+</pre>
+
+### 使用法
+
+<pre>
+ pxutil vf2zvp [<オプション>] <入力.vf> [<入力.tfm> <出力.zvp>]
+ VF 㨠JFM ã‹ã‚‰ ZVP ã¸å¤‰æ›ã€‚
+ pxutil zvp2vf [<オプション>] <入力.zvp> [<出力.vf> <出力.tfm>]
+ ZVP ã‹ã‚‰ VF 㨠JFM ã¸å¤‰æ›ã€‚
+ pxutil vf2zvp0 [<オプション>] <入力.vf> [<出力.zvp0>]
+ VF ã‹ã‚‰ ZVP0 ã¸å¤‰æ›ã€‚
+ pxutil zvp02vf [<オプション>] <入力.zvp0> [<出力.vf>]
+ ZVP0 ã‹ã‚‰ VF ã¸å¤‰æ›ã€‚
+ pxutil zpl2tfm [<オプション>] <入力.zpl> [<出力.tfm>]
+ ZPL ã‹ã‚‰ TFM ã¸å¤‰æ›ã€‚
+ pxutil tfm2zpl [<オプション>] <入力.tfm> [<出力.zpl>]
+ TFM ã‹ã‚‰ ZPL ã¸å¤‰æ›ã€‚
+
+ - TFM 㨠VF å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€kpathsearch ã®æŽ¢ç´¢ã®å¯¾è±¡ã¨ãªã‚‹ã€‚
+ - 出力ファイルåã‚’çœç•¥ã—ãŸå ´åˆã¯ã€å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ã‚’変更ã—ãŸã‚‚ã®
+ ãŒä½¿ã‚れる。tftopl ã®ã‚ˆã†ã«æ¨™æº–出力ã«æ›¸ã出ã™ã“ã¨ã¯ãªã„。
+</pre>
+
+### オプション
+
+<pre>
+ ・出力整数値形å¼ã®é¸æŠž
+
+ テキスト形å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’出力ã™ã‚‹æ™‚ã«ã€æ•´æ•°å€¤ã®å½¢å¼ã¨ã—㦠'H' (16進)
+ 㨠'O' (8進) ãŒé¸æŠžã§ãる箇所ãŒã‚ã‚‹(主ã«æ–‡å­—コードを表ã™æ•°å€¤ã€‚)
+ ã“ã“ã§ã©ã¡ã‚‰ã®å½¢å¼ã‚’用ã„ã‚‹ã‹ã‚’指定ã™ã‚‹ã€‚
+
+ --hex (既定値)
+ 'H'(16進) å½¢å¼ã‚’指定ã™ã‚‹ã€‚
+ --octal / -o
+ 'O'(8進) å½¢å¼ã‚’指定ã™ã‚‹ã€‚
+
+ 注æ„事項:
+ - å½¢å¼ãŒ 'H' ã‹ 'O' ã®ä¸€æ–¹ã«å›ºå®šã•ã‚ŒãŸç®‡æ‰€ã‚‚ã‚る。例ãˆã° CHECKSUM
+ ã¯å¿…ãš 'O' å½¢å¼ã‚’用ã„る。
+ - 入力ã®éš›ã«ã¯ã€è«–ç†çš„ã«å¯èƒ½ãªå…¨ã¦ã®å½¢å¼ãŒå—ç†ã•ã‚Œã‚‹ã€‚'D'(10 進)ã§
+ 256 以上ã®å€¤ã‚’指定ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚ãŸã ã—ã€å†…部㧠pltotf を呼ã³å‡ºã—
+ ã¦ã„る関係ã§å½¢å¼ãŒåˆ¶é™ã•ã‚Œã‚‹ã“ã¨ã‚‚ã‚る。
+
+ ・漢字コード指定
+
+ --kanji=<値>
+ 外部漢字コードを指定ã™ã‚‹ã€‚<値>ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã€‚
+ jis ISO-2022-JP (既定値)
+ sjis Shift_JIS
+ euc EUC-JP
+ utf8 UTF-8
+ none 無効(詳細ã¯å¾Œè¿°)
+ --kanji-internal=<値>
+ 内部漢字コードを指定ã™ã‚‹ã€‚<値>ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã€‚
+ jis JIS X 0208 (既定値)
+ unicode Unicode
+ none 無効(詳細ã¯å¾Œè¿°)
+ --unicode / -u
+ --kanji=utf8 --kanji-internal=unicode ã¨ç­‰ä¾¡ã€‚Unicode 和文
+ フォントを扱ã†å ´åˆã®è¨­å®šã€‚
+ --no-encoding / -E
+ --kanji=none --kanji-internal=none ã¨ç­‰ä¾¡ã€‚
+
+ テキスト形å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã€Œæ–‡å­—コード値ã®æŒ‡å®šã‚’文字を直接書ã„ã¦è¡Œã†
+ å ´åˆã€ãŒå­˜åœ¨ã™ã‚‹ã€‚例ãˆã°ã€æ•´æ•°å€¤ã® 'K' å½¢å¼ã‚„ã€JPL ã® CHARSINTYPE
+ ã®æŒ‡å®šç­‰ã§ã‚る。「外部漢字コードã€ã¯ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—を読む
+ ã®ã«ä½¿ã‚れる漢字コードã§ã‚ã‚Šã€ã€Œå†…部漢字コードã€ã¯æ–‡å­—ã‚’ãƒã‚¤ãƒŠãƒª
+ å½¢å¼ã§ç”¨ã„るコード値ã«å¤‰æ›ã™ã‚‹æ™‚ã«ä½¿ã‚れる漢字コードã§ã‚る。
+
+ 例ãˆã°ã€--kanji=sjis --kanji-internal=unicode ã¨è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆ
+ を考ãˆã‚‹ã€‚ã“ã®å ´åˆã€'K' å½¢å¼ã‚’å«ã‚€ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã®å…¥åŠ›ã‚’扱ã†ã«ã¯ã€
+ ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ¼¢å­—コードを Shift_JIS ã«ã™ã‚‹å¿…è¦ãŒã‚る。ãã—ã¦ã€
+ 'K ã‚' ã¨ã„ã†æ•´æ•°å€¤ãŒã‚ã£ãŸå ´åˆã€<ã‚> ã® Unicode 値ã§ã‚ã‚‹ 0x3042
+ ãŒæŒ‡å®šã•ã‚ŒãŸ(ã¤ã¾ã‚Š 'H 3042' ã¨ç­‰ä¾¡)ã¨ã¿ãªã•ã‚Œã‚‹ã€‚
+
+ ã“ã®ã‚ˆã†ã«ã€æ¼¢å­—コードã®æŒ‡å®šãŒæ„味をもã¤ã®ã¯ã€ã€Œæ–‡å­—ã®ç›´æŽ¥æŒ‡å®šã€
+ を入力ã®ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ç”¨ã„ã‚‹å ´åˆã«é™ã‚‰ã‚Œã‚‹ã€‚(pxutil ã¯å‡ºåŠ›ä¸­ã§æ–‡å­—
+ ã®ç›´æŽ¥æŒ‡å®šã‚’用ã„ã‚‹ã“ã¨ã¯ãªã„。) --kanji ãŠã¨ã³ --kanji-internal
+ ã®å€¤ none ã¯ã€Œæ–‡å­—ã®ç›´æŽ¥æŒ‡å®šã€ã‚’無効ã«ã™ã‚‹è¨­å®šã§ã‚ã‚Šã€ç‰‡æ–¹ãŒ none
+ ã«è¨­å®šã—ã¦ã„ã‚‹å ´åˆã€è‡ªå‹•çš„ã«ä»–方も none ã«ãªã‚‹(ã¤ã¾ã‚Š --no-encoding
+ ã¨åŒã˜)。ã“ã®æŒ‡å®šã®å ´åˆã«ã€Œæ–‡å­—ã®ç›´æŽ¥æŒ‡å®šã€ã‚’使ãŠã†ã¨ã™ã‚‹ã¨ã‚¨ãƒ©ãƒ¼
+ ã«ãªã‚‹ã€‚
+
+ 注æ„事項:
+ - 当然ãªãŒã‚‰ã€'K' 以外ã®æ•´æ•°å€¤å½¢å¼ã¯æ–‡å­—コード指定ã®å½±éŸ¿ã‚’å—ã‘ãªã„。
+ 例ãˆã°ã€'H 3042' ã¯å¸¸ã«æ•°å€¤ 0x3042 を表ã™ã€‚
+ - JIS X 0208 㨠Unicode ã®é–“ã®æ–‡å­—ã®å¯¾å¿œã¯ JIS X 0221 ã®è¦å®šã«å¾“ã†ã€‚
+ ãŸã ã€TeX 関係ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§åˆ¥ã®æ–¹å¼ã‚’用ã„ã‚‹ã‚‚ã®ã‚‚ã‚ã‚‹ã®ã§ã€
+ 両者ã®é–“ã®ã‚³ãƒ¼ãƒ‰å¤‰æ›ã¯é¿ã‘ãŸæ–¹ãŒç„¡é›£ã§ã‚る。
+
+ ・ãã®ä»–
+ --uptool
+ ppltotf/ptftopl ã«ä»£ã‚ã‚Šã« uppltotf/uptftopl を用ã„る。
+ --lenient
+ VF 解æžæ™‚ã«ç”Ÿã˜ãŸè»½å¾®ãªå•é¡Œã‚’エラーã¨æ‰±ã‚ãªã„。
+</pre>
+
+### ZPL å½¢å¼ã®ä»•æ§˜
+
+<pre>
+ ・概è¦
+
+ ZPL å½¢å¼ã¯ JPL å½¢å¼ã‚’å°‘ã—ã ã‘æ‹¡å¼µã—ãŸã‚‚ã®ã§ã€å…ƒã® JPL å½¢å¼ã¨åŒã˜ã
+ JFM å½¢å¼ã«å¯¾å¿œã™ã‚‹ã€‚開発経緯ã®ä¸Šã§ã¯ã€ZVP å½¢å¼ã® JFM ã«ç›¸å½“ã™ã‚‹éƒ¨åˆ†
+ を抜ã出ã—ãŸã‚‚ã®ã«ç›¸å½“ã™ã‚‹ã€‚以下ã§ã¯ã€JPL å½¢å¼ã¨ã®ç›¸é•ç‚¹ã®ã¿ã‚’説明
+ ã™ã‚‹ã€‚
+
+ ・CHARSINTYPE ã®æ‹¡å¼µ
+
+ (CHARSINTYPE <整数t> <文字リスト>)
+ CHARSINTYPE ã¯ä¸Šè¨˜ã®æ›¸å¼ã‚’ã‚‚ã¡ã€TYPE t ã«å±žã™ã‚‹æ–‡å­—コードã®é›†åˆã‚’
+ è¦å®šã™ã‚‹è¦ç´ ã§ã‚る。<文字リスト> 㯠1 ã¤ä»¥ä¸Šã®ã€Œæ–‡å­—ã€ã‚’空白ã§
+ 区切ã£ã¦é€£ã­ãŸã‚‚ã®ã§ã€ã€Œæ–‡å­—ã€ã¯ä»¥ä¸‹ã®å½¢å¼ã§æŒ‡å®šã§ãる。
+
+ 文字を直接書ã: ASCII 以外ã®æ–‡å­—を書ãã¨ã€æ•´æ•°å€¤ã® 'K' å½¢å¼ã¨åŒæ§˜
+ ã«ãã®æ–‡å­—ã®å†…部漢字コード値を指定ã—ãŸã“ã¨ã«ãªã‚‹ã€‚外部ãŠã‚ˆã³å†…部
+ 漢字コードã®è¨­å®šã«ä¾å­˜ã™ã‚‹ã€‚
+ Jxxxx å½¢å¼: 'J' ã®å¾Œã« 4 æ¡ã® 16 進数字を書ã„ãŸæ–‡å­—列ã¯ã€ãã®æ•°å­—ãŒ
+ 表ã™æ•°å€¤ã‚’ JIS コード値ã¨ã™ã‚‹æ–‡å­—ã®å†…部漢字コード値を表ã™ã€‚
+ Uxxxx å½¢å¼: 'U' ã®å¾Œã« 4 æ¡ã® 16 進数字を書ã„ãŸæ–‡å­—列ã¯ã€ãã®æ•°å­—ãŒ
+ 表ã™æ•°å€¤ã‚’ Unicode 値ã¨ã™ã‚‹æ–‡å­—ã®å†…部漢字コード値を表ã™ã€‚
+ Xxxxx å½¢å¼: 'X' ã®å¾Œã« 4 æ¡ã® 16 進数字を書ã„ãŸæ–‡å­—列ã¯ã€ãã®æ•°å­—ãŒ
+ 表ã™æ•°å€¤ãã®ã‚‚ã®ã‚’表ã™ã€‚(内部漢字コードã®è¨­å®šã¨ç„¡é–¢ä¿‚。)
+ PL ã®æ•´æ•°å€¤æŒ‡å®šã®å½¢å¼: PL ã®ä»–ã®å ´æ‰€ã§ä½¿ã‚れる 'H 1234' ç­‰ã®æ›¸å¼ãŒ
+ 使ãˆã€è¡¨ã™æ•°å€¤ã‚‚åŒã˜ã§ã‚る。
+ CTRANGE è¦ç´ : 次ã®æ›¸å¼ã‚’ã‚‚ã¡ã€a 以上 b 以下ã®å…¨ã¦ã®æ•´æ•°ã‚’表ã™ã€‚
+ (CTRANGE <æ•´æ•°a> <æ•´æ•°b>)
+
+ 例: --kanji-internal=unicode ã®ä¸‹ã§ã€
+ (CHARSINTYPE D 2 ã‚ J3021 D 200 U1234 X5678
+ (CTRANGE H FF11 H FF13))
+ ã¨ã„ã†æŒ‡å®šã§ Type 2 ã«æŒ‡å®šã•ã‚Œã‚‹æ–‡å­—コードã¯
+ 0x3042 (<ã‚> = Unicode 0x3042),
+ 0x4E9C (JIS 0x3021 = <亜> = Unicode 0x4E9C), 0xC8 (= 200),
+ 0x1234 ('U' ã¯ãã®ã¾ã¾), 0x5678, 0xFF11, 0xFF12, 0xFF13
+ ã§ã‚る。
+
+ å‚考ã¾ã§ã«ã€JPL å½¢å¼ã¨æ¯”較ã™ã‚‹ã¨ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚‹ã€‚「~㮠JPLã€ã¯
+ 「~付属㮠pltotf (実際ã®ã‚³ãƒžãƒ³ãƒ‰åã¯ç•°ãªã‚‹å¯èƒ½æ€§ã‚ã‚Š)ã§å‡¦ç†ã§ãã‚‹
+ JPL å½¢å¼ã€ã‚’指ã™ã€‚upTeX ã«ãŠã„㦠JFM å½¢å¼ã¯æ‹¡å¼µã•ã‚Œã¦ãŠã‚‰ãš pTeX
+ ã®ãã‚Œã¨åŒã˜ä»•æ§˜ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„。
+
+ ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ ç›´æŽ¥ Jxxxx Uxxxx ã»ã‹
+ pTeX 㮠JPL ○ ○ × ×
+ upTeX 㮠JPL ○ ○ ○ ×
+ ZPL â—‹ â—‹ â—‹ â—‹
+</pre>
+
+### ZVP0 å½¢å¼ã®ä»•æ§˜
+
+<pre>
+ ・概è¦
+
+ ZVP0 å½¢å¼ã¯ã€ãƒã‚¤ãƒŠãƒªã® VF å½¢å¼ã«ç›´æŽ¥å¯¾å¿œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã§ã€VPL
+ å½¢å¼ã®ã†ã¡ã® VF ã«è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹é …ç›®ã ã‘を抜ã出ã—ãŸæ ¼å¥½ã‚’ã—ã¦ã„る。
+ 具体的ã«ã¯ã€VPL ã§ç¾ã‚Œã‚‹è¦ç´ ã®ã†ã¡æ¬¡ã®ã‚‚ã®ã‹ã‚‰ãªã‚‹ã€‚
+
+ VTITLE
+ DESIGNSIZE
+ CHECKSUM
+ MAPFONT
+ CHARACTER
+
+ ã“ã®ã†ã¡ã€CHARACTER ã®ä¸­ã® MAP ã«è‹¥å¹²ã®æ‹¡å¼µã‚’å«ã‚“ã§ã„ã‚‹ã®ã§ã€ãã‚Œ
+ ã«ã¤ã„ã¦ä»¥ä¸‹ã§èª¬æ˜Žã™ã‚‹ã€‚残りã®è¦ç´ ã®ä»•æ§˜ã¯ VPL ã¨åŒã˜ã§ã‚る。
+
+ ・MAP 中ã®æ–‡å­—出力命令ã«å¯¾ã™ã‚‹æ‹¡å¼µ
+
+ MAP è¦ç´ ã¯ã€ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã® 1 ã¤ã®æ–‡å­—ã«å¯¾ã—ã¦ã€ãれを表ç¾ã™ã‚‹ DVI
+ 命令ã®åˆ—を指定ã™ã‚‹ã‚‚ã®ã§ã‚る。ã“ã®ä¸­ã§ä½¿ã‚れる SETCHAR è¦ç´ (DVI
+ ã® setchar/set1~4 命令ã¨å¯¾å¿œã™ã‚‹)ã¯æ¬¡ã®æ›¸å¼ã‚’ã‚‚ã¡ã€ã€Œæ–‡å­—コード
+ c ã®æ–‡å­—を出力ã™ã‚‹ã€ã“ã¨ã‚’æ„味ã™ã‚‹ã€‚
+ (SETCHAR <æ•´æ•° c>)
+ ZVP0 å½¢å¼ã§ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªå¼•æ•°ã®ãªã„å½¢å¼ãŒè¨±ã•ã‚Œã‚‹ã€‚
+ (SETCHAR)
+ ã“ã®å ´åˆã€å‡ºåŠ›ã™ã‚‹æ–‡å­—ã¯ã€ã€Œå½“該㮠SETCHAR ã‚’å«ã‚€ CHARACTER è¦ç´ 
+ ã®å¯¾è±¡ã®æ–‡å­—ã€ã«ãªã‚‹ã€‚
+
+ 例ãˆã°ã€ä»¥ä¸‹ã®è¨˜è¿°ã§ã€"(SETCHAR)" 㯠"(SETCHAR H 2122)" ã¨åŒå€¤ã¨
+ 解釈ã•ã‚Œã‚‹ã€‚
+
+ (CHARACTER H 2122
+ (CHARWD R 0.5)
+ (MAP
+ (SETCHAR)
+ )
+ )
+</pre>
+
+### ZVP å½¢å¼ã®ä»•æ§˜
+
+<pre>
+ ・概è¦
+
+ ZVP å½¢å¼ã¯å’Œæ–‡ã®ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã«å¯¾å¿œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã§ã€
+ è¦ç´  JFM VF
+ DIRECTION â—‹ ï¼
+ VTITLE ï¼ â—‹
+ FAMILY â—‹ ï¼
+ FACE â—‹ ï¼
+ HEADER â—‹ ï¼
+ CODINGSCHEME â—‹ ï¼
+ DESIGNUNITS â—‹ ï¼
+ DESIGNSIZE â—‹ â—‹
+ CHECKSUM â—‹ â—‹
+ SEVENBITSAFEFLAG â—‹ ï¼
+ FONTDIMEN â—‹ ï¼
+ BOUNDARYCHAR â—‹ ï¼
+ MAPFONT ï¼ â—‹
+ LIGTABLE â—‹ ï¼
+ GLUEKERN â—‹ ï¼
+ CODESPACE ï¼ â—‹ 新設
+ CHARSINTYPE â—‹ â—‹ æ‹¡å¼µ
+ CHARSINSUBTYPE ï¼ â—‹ 新設
+ TYPE â—‹ â—‹ æ‹¡å¼µ
+ SUBTYPE ï¼ â—‹ 新設
+ CHARACTER ○ ○ 新設
+
+ 以下ã§ã€æ–°è¨­ã¾ãŸã¯æ‹¡å¼µã•ã‚ŒãŸè¦ç´ ã®èª¬æ˜Žã‚’è¡Œã†ãŒã€ãã®å‰ã«æ–°ãŸã«å°Žå…¥
+ ã•ã‚ŒãŸæ¦‚念ã«ã¤ã„ã¦èª¬æ˜Žã™ã‚‹ã€‚
+
+ ・Subtype
+
+ ZVP0 å½¢å¼ã®ã¨ã“ã‚ã§èª¬æ˜Žã—㟠SETFONT ã®æ‹¡å¼µæ›¸å¼ã‚’使ã†ã¨ã€å…¨ãåŒä¸€ã®
+ MAP 指定をもã¤æ–‡å­—ãŒå¤šã出るã“ã¨ã«ãªã‚‹ã€‚例ãˆã°ã€æœ€ã‚‚é »ç¹ã«ç™ºç”Ÿã™ã‚‹
+ 「既定ã®ãƒ•ã‚©ãƒ³ãƒˆã«ã¤ã„ã¦è¦æ±‚ã•ã‚ŒãŸæ–‡å­—を出ã™ã€ã¨ã„ã†ã®ã¯
+ (MAP (SETCHAR) )
+ ã¨è¡¨ã™ã“ã¨ãŒã§ãる。ãã“ã§ã€1 ã¤ã® Type ã®ä¸­ã§åŒä¸€ã® MAP 指定をもã¤
+ 文字を Subtype ã¨ã—ã¦ã¾ã¨ã‚ã‚‹ã“ã¨ã«ã™ã‚‹ã€‚ã™ãªã‚ã¡ã€Type ãŒåŒã˜ã§
+ Subtype ãŒç•°ãªã‚‹æ–‡å­—ã¯ã€JFM ã§ã¯å…¨ãåŒã˜æŒ¯ã‚‹èˆžã„ã‚’ã™ã‚‹(ã¤ã¾ã‚ŠåŒã˜
+ メトリックをæŒã¡ GLUEKERN ã§ã®æ‰±ã„ã‚‚åŒã˜)ãŒã€MAP 指定ã ã‘ãŒç•°ãªã‚‹ã€‚
+ ã“ã†ã™ã‚‹ã“ã¨ã§ã€VPL ã§ã® CHARACTER ã®æŒ‡å®šã‚’ Subtype 毎ã«ã¾ã¨ã‚ã¦
+ è¡Œã†ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹ã€‚
+
+ ãªãŠã€Subtype 㯠ZVP ã®ä¸­ã ã‘ã«å­˜åœ¨ã™ã‚‹æ¦‚念ã§ã€ãã®å€¤ã¯ JFM ã‚„ VF
+ ã®ä¸­ã®ã©ã®æƒ…å ±ã¨ã‚‚対応ã—ãªã„。MAP 指定ãŒåŒã˜ã‚‚ã®ã¯åŒã˜ Subtype 値
+ ã‚’æŒã¤ã¨ã„ã†ç‚¹ã ã‘ã«æ„味ãŒã‚る。Subtype ã®æœ‰åŠ¹ãªå€¤ã¯ 0~255 ã§ã‚る。
+
+ ・コード空間
+
+ JPL (JFM ã§ã‚‚åŒæ§˜)ã§ã¯ã€Type ㌠0 以外ã®æ–‡å­—を列挙ã—ã¦ã€ãれ以外ã®
+ 文字を Type 0 ã®æ–‡å­—ã¨æ‰±ã£ã¦ã„る。従ã£ã¦ã€ãã®ãƒ•ã‚©ãƒ³ãƒˆã«ãŠã„ã¦ã©ã®
+ コードãŒæœ‰åŠ¹ã‹ã¨ã„ã†ã“ã¨ã¯æ˜Žç¤ºã•ã‚Œã¦ã„ãªã„。ã“ã‚Œã«å¯¾ã—ã¦ã€VPL (VF)
+ ã§ã¯ä»®æƒ³ãƒ•ã‚©ãƒ³ãƒˆã§æœ‰åŠ¹ãªæ–‡å­—ã®å…¨ã¦ã«ã¤ã„㦠CHARACTER è¦ç´ ãŒå¿…è¦ã¨
+ ã•ã‚Œã‚‹ã€‚従ã£ã¦ã€ä¸Šã§è¿°ã¹ãŸã‚ˆã†ã« Type 㨠Subtype を用ã„㦠CHARACTER
+ を一括指定ã—よã†ã¨ã™ã‚‹ã¨ã€æœ‰åŠ¹ãªæ–‡å­—ã®é›†åˆ(コード空間)ã®æƒ…å ±ãŒå¿…è¦
+ ã¨ãªã‚‹ã€‚
+
+ 引ã続ã„ã¦ã€æ–°è¨­ã¾ãŸã¯æ‹¡å¼µã•ã‚ŒãŸè¦ç´ ã®èª¬æ˜Žã‚’è¡Œã†ã€‚
+
+ ・(CODESPACE <文字リスト>)
+ (CODESPACE <コード空間識別å­>)
+
+ コード空間を指定ã™ã‚‹ã€‚<文字リスト> ã®æ›¸å¼ã¯ ZPL ã® CHARSINTYPE ã¨
+ åŒã˜ã€‚特定ã®ã‚³ãƒ¼ãƒ‰ç©ºé–“ã®è¨­å®šã«å¯¾ã—ã¦ã¯ä¸‹è¨˜ã® <コード空間識別å­>
+ ã«ã‚ˆã‚‹æŒ‡å®šã‚‚å¯èƒ½ã§ã‚る。
+ - GL94DB: 上ä½ãƒã‚¤ãƒˆã€ä¸‹ä½ãƒã‚¤ãƒˆã¨ã‚‚ã« 0x21~0x7E ã® 2 ãƒã‚¤ãƒˆå€¤
+ 全体。pTeX ã®å’Œæ–‡ãƒ•ã‚©ãƒ³ãƒˆã§é€šå¸¸ä½¿ã‚れる設定。(CODESPACE ã®
+ 既定値ã¯ã“ã‚Œã§ã‚ã‚‹)
+ - UNICODE-BMP: 0~0xFFFF。Unicode ã® BMP ã®å…¨ä½“。
+
+ ・(CHARSINTYPE <整数t> <文字リスト>)
+
+ Type t ã®æ–‡å­—ã®é›†åˆã‚’指定ã™ã‚‹ã€‚t 㯠1~255 ã®æ•´æ•°ã€‚
+
+ ・(CHARSINSUBTYPE <整数t> <整数s> <文字リスト>)
+
+ Type tã€Subtype s ã®æ–‡å­—ã®é›†åˆã‚’指定ã™ã‚‹ã€‚t 㯠0~255 ã®æ•´æ•°ã€‚
+ s 㯠1~255 ã®æ•´æ•°ã€‚
+
+ ・(TYPE <æ•´æ•°t> <è¦ç´ >...)
+
+ Type t ã®æ–‡å­—ã«å¯¾ã™ã‚‹æƒ…報を記述ã™ã‚‹ã€‚t 㯠0~255 ã®æ•´æ•°ã€‚
+
+ è¦ç´ ã¨ã—ã¦ä»¥ä¸‹ã®ã‚‚ã®ãŒæŒ‡å®šã§ãる。
+ - CHARWD, CHARHT, CHARDP, CHARIC : ã“れ㯠Type t ã®æ–‡å­—全体ã«
+ 対ã—ã¦é©ç”¨ã•ã‚Œã‚‹ã€‚
+ - MAP : ã“れ㯠Type tã€Subtype 0 ã®æ–‡å­—ã«é©ç”¨ã•ã‚Œã‚‹ã€‚
+
+ ・(SUBTYPE <æ•´æ•°t> <æ•´æ•°s> <MAPè¦ç´ >)
+
+ Type tã€Subtype ã®æ–‡å­—ã«å¯¾ã™ã‚‹ MAP を記述ã™ã‚‹ã€‚t 㯠0~255 ã®æ•´æ•°ã€‚
+ s 㯠1~255 ã®æ•´æ•°ã€‚
+
+ ・(CHARACTER <æ•´æ•°c> <MAPè¦ç´ >)
+
+ コード値 c ã®æ–‡å­—ã«å¯¾ã™ã‚‹ MAP を記述ã™ã‚‹ã€‚文字 c ã® Type ã¯ã“ã®
+ è¦ç´ ã®è¨˜è¿°ã«å½±éŸ¿ã—ãªã„。(ã¤ã¾ã‚Šã€CHARSINTYPE ã§æŒ‡å®šã—ãŸå€¤ã€ã©ã“ã«
+ ã‚‚ãªã„å ´åˆã¯ 0。)文字 c ã ã‘ã‹ã‚‰ãªã‚‹ Subtype を仮想的ã«ä½œã£ãŸã®
+ ã¨åŒã˜ã§ã‚る。
+
+ å„ Subtype ã®æ–‡å­—ã®æƒ…å ±ãŒã©ã“ã«ã‚ã‚‹ã‹ã‚’ã¾ã¨ã‚ãŸã€‚以下ã®è¡¨ã§ã€t ã¯
+ 0 以外㮠Typeã€s 㯠0 以外㮠Subtype を表ã™ã€‚煩雑ãªã‚ˆã†ã«è¦‹ãˆã‚‹ãŒã€
+ 「本則を Type/Subtype 0 ã«æ›¸ãã€ä¾‹å¤–ã‚’ãれ以外ã«æ›¸ãã€ã¨ã„ã†è¨­è¨ˆ
+ 上ã“ã®ã‚ˆã†ãªçµæžœã«ãªã£ã¦ã„る。ã“ã‚Œã«ã‚ˆã‚Šã€æ–‡å­—リストを書ãã¨ãã«
+ CTRANGE ãŒæœ€å¤§é™æ´»ç”¨ã§ãるよã†ã«ãªã‚Šã€ã¾ãŸå¾“æ¥ã® JPL ã‹ã‚‰ã®å¤‰æ›´ç‚¹
+ ãŒæœ€å°é™ã«ãªã‚‹ã¨è€ƒãˆã¦ã„る。
+
+ Type Subtype æ–‡å­—é›†åˆ ãƒ¡ãƒˆãƒªãƒƒã‚¯ MAP指定
+ 0 0 (CODESPACE)ã‹ã‚‰ (TYPE 0) (TYPE 0)
+ å…¨ã¦ã®(CHARSINTYPE t)ã¨
+ å…¨ã¦ã®(CHARSINSUBTYPE 0 s)
+ を除ã„ãŸã‚‚ã®
+ 0 s (CHARSINSUBTYPE 0 s) (TYPE 0) (SUBTYPE 0 s)
+ t 0 (CHARSINTYPE t)ã‹ã‚‰ (TYPE t) (TYPE t)
+ å…¨ã¦ã®(CHARSINSUBTYPE t s)
+ を除ã„ãŸã‚‚ã®ã€‚
+ t s (CHARSINSUBTYPE t s) (TYPE t) (SUBTYPE t s)
+</pre>
+
+更新履歴
+--------
+
+ * Version 1.2.2 〈2019/02/09〉
+ - ãƒã‚°ä¿®æ­£ã€‚
+
+ * Version 1.2.1 〈2019/02/08〉
+ - (試験的) `jodel` コマンドを追加。
+
+ * Version 1.2.0 〈2019/02/02〉
+ - `--lenient` オプションを追加。
+
+ * Version 1.1.2 〈2018/01/21〉
+ - ZRTeXtor 1.5.0 版ã«åŒæœŸã€‚変更点ã¯ï¼š
+ + JFM å½¢å¼ã«ã¤ã„ã¦æœ€è¿‘è¡Œã‚ã‚ŒãŸã€Œéž BMP 文字をéžæ—¢å®šæ–‡å­—クラスã«
+ å«ã‚ã‚‹ã“ã¨ã‚’å¯èƒ½ã«ã™ã‚‹ã€æ‹¡å¼µã‚’サãƒãƒ¼ãƒˆã—ãŸã€‚
+
+ * Version 1.1.1 〈2018/01/20〉
+ - ãƒã‚°ä¿®æ­£ã€‚
+
+ * Version 1.1.0 〈2017/09/16〉
+ - pxcopyfont ç”±æ¥ã®æ©Ÿèƒ½ï¼ˆ`vfinfo`ã€`vfcopy` サブコマンド)を追加。
+
+ * Version 1.0.1 〈2017/07/21〉
+ - shebang 行を追加。
+
+ * Version 1.0.0 〈2017/07/17〉
+ - (jfmutil ã¨ã—ã¦ï¼‰æœ€åˆã®å…¬é–‹ç‰ˆã€‚
+ - ZRTeXtor 㯠v1.4.0 相当。
+
+--------------------
+Takayuki YATO (aka. "ZR")
+https://github.com/zr-tex8r
diff --git a/fonts/utilities/jfmutil/README.md b/fonts/utilities/jfmutil/README.md
new file mode 100644
index 0000000000..cdb6a2bb7c
--- /dev/null
+++ b/fonts/utilities/jfmutil/README.md
@@ -0,0 +1,117 @@
+jfmutil
+=======
+
+Perl: Utility to process pTeX-extended TFM and VF
+
+This program provides functionality to process data files (JFM and VF)
+that form logical fonts used in (u)pTeX. The functions currently
+available include:
+
+ - The mutual conversion between Japanese virtual fonts (pairs of VF
+ and JFM) and files in the “ZVP formatâ€, which is an original text
+ format representing data in virtual fonts. This function can be seen
+ as counterpart to vftovp/vptovf programs.
+ - The mutual conversion between VF files alone and files in the “ZVP0
+ formatâ€, which is a subset of the ZVP format.
+ - The replication of virtual fonts with different names, where the
+ referred TFM names in the VF will be suitably revised.
+
+### SYSTEM REQUIREMENTS
+
+ - Perl interpreter: v5.8.1 or later.
+ - The following commands from pTeX distribution:
+ - kpsewhich
+ - ppltotf, ptftopl
+
+### LICENSE
+
+This package is distributed under the MIT License.
+
+### USAGE
+
+ This is jfmutil v1.x.x <20xx/xx/xx> by 'ZR'.
+ [ZRTeXtor library v1.x.x <20xx/xx/xx> by 'ZR']
+
+ * ZVP Conversion
+ Usage: jfmutil vf2zvp0 [<options>] <in.vf> [<out.zvp0>]
+ jfmutil zvp02vf [<options>] <in.zvp0> [<out.vf>]
+ jfmutil vf2zvp [<options>] <in.vf> [<in.tfm> <out.zvp>]
+ jfmutil zvp2vf [<options>] <in.zvp> [<out.vf> <out.tfm>]
+ jfmutil zpl2tfm [<options>] <in.zvp0> [<out.vf>]
+ jfmutil tfm2zpl [<options>] <in.zvp0> [<out.vf>]
+ Arguments:
+ <in.xxx> input files
+ N.B. Input TFM/VF files are searched by Kpathsea. (ZVP/ZVP9 are not.)
+ <out.xxx> output files
+ Options:
+ --hex output charcode in 'H' form [default]
+ -o / --octal output charcode in 'O' form
+ --uptool use upTeX tools (uppltotf etc.)
+ --lenient ignore non-fatal error on VFs
+ The following options affect interpretation of 'K' form.
+ --kanji=ENC set source encoding: ENC=jis/sjis/euc/utf8/none
+ --kanji-internal=ENC set internal encoding: ENC=jis/unicode/none
+ -j / --jis == --kanji=jis --kanji-internal=jis
+ -u / --unicode == --kanji=utf8 --kanji-internal=unicode
+ -E / --no-encoding == --kanji=none --kanji-internal=none
+
+ * VF Replication
+ Usage: jfmutil vfcopy [<options>] <in.vf> <out.vf> <out_base.tfm>...
+ jfmutil vfinfo [<options>] <in.vf>
+ jfmutil jodel [<options>] <in.vf> <prefix>
+ Arguments:
+ <in.vf> input virtual font name
+ N.B. Input TFM/VF files are searched by Kpathsea.
+ <out.vf> output virtual font name
+ <out_base.tfm> names of raw TFMs referred by the output virtual font;
+ each entry replaces a font mapping in the input font in
+ the given order, so the exactly same number of entries
+ must be given as font mappings
+ <prefix> prefix of output font names (only for jodel)
+ Options:
+ -z / --zero change first fontmap id in vf to zero
+ --uptex assume input font to be for upTeX (only for jodel)
+ --unicode generate VF for 'direct-unicode' mode imposed by pxufont
+ package; this option is supported only for upTeX fonts and
+ thus implies '--uptex' (only for jodel)
+
+ * Common Options
+ -h / --help show this help message and exit
+ -V / --version show version
+
+C>jfmutil --version
+Please refer to README-ja.md (in Japanese) for detail.
+
+Revision History
+----------------
+
+ * Version 1.2.2 〈2019/02/09〉
+ - Bug fix.
+
+ * Version 1.2.1 〈2019/02/08〉
+ - (experimental) Add `jodel` subcommand.
+
+ * Version 1.2.0 〈2019/02/02〉
+ - Add option `--lenient`.
+
+ * Version 1.1.2 〈2018/01/21〉
+ - Use ZRTeXtor v1.5.0. The changes are:
+ + Support for the recent extension of JFM format, which allows
+ non-default character classes to contain non-BMP characters.
+
+ * Version 1.1.1 〈2018/01/20〉
+ - Bug fix.
+
+ * Version 1.1.0 〈2017/09/16〉
+ - Add subcommands `vfinfo` and `vfcopy`.
+
+ * Version 1.0.1 〈2017/07/21〉
+ - Add shebang line.
+
+ * Version 1.0.0 〈2017/07/17〉
+ - The first public version (as jfmutil).
+ - ZRTeXtor is of v1.4.0.
+
+--------------------
+Takayuki YATO (aka. "ZR")
+https://github.com/zr-tex8r
diff --git a/fonts/utilities/jfmutil/jfmutil.pl b/fonts/utilities/jfmutil/jfmutil.pl
new file mode 100644
index 0000000000..179275068c
--- /dev/null
+++ b/fonts/utilities/jfmutil/jfmutil.pl
@@ -0,0 +1,3343 @@
+#!/usr/bin/env perl
+#
+# This is file 'jfmutil.pl'.
+#
+# Copyright (c) 2019 Takayuki YATO (aka. "ZR")
+# GitHub: https://github.com/zr-tex8r
+# Twitter: @zr_tex8r
+#
+# This software is distributed under the MIT License.
+#
+use strict;
+
+#------------------------------------------------- ZRTeXtor module
+package ZRTeXtor;
+our $VERSION = 1.005_00;
+our $mod_date = "2018/01/21";
+use Encode qw(encode decode);
+
+# Here follows excerpt from ZRTeXtor.pm
+#================================================= BEGIN
+######## general ########
+
+our $binmode = 0; # always read/write in binary mode
+our $errmsg; # last error message
+use constant { HUGE => 1e20, EPS => 1e-7 };
+ # TU = TFM factor, DU = DVI factor
+use constant { TU => 1 << 20, DU => 1 << 16, B31 => 1 << 31 };
+use constant { M32 => 0xFFFFFFFF, M31 => 0x7FFFFFFF };
+use constant { # kanji encoding names
+ K_JIS => 'iso-2022-jp', K_EUC => 'euc-jp',
+ K_SJIS => 'shiftjis', K_UTF8 => 'UTF-8',
+ KI_JIS => 'jis0208-raw', KI_UNI => 'UTF-16BE',
+ KI_XJIS => '*xjis*', K_XJIS => '*xjis*',
+};
+# for get_temp_name
+our $get_temp_base = '__zrtx';
+our (@get_temp_id);
+
+## error($msg, ...)
+# Sets the error message and returns nothing (undef in scalar).
+# Usually a defined value is returned in success.
+sub error
+{
+ $errmsg = join('', map { (ref $_) ? '[obj]' : $_ } (@_));
+ return;
+}
+
+## fatal($msg, ...)
+# Intended for internal errors....
+sub fatal
+{
+ return error("!!FATAL(", @_, ")");
+}
+
+##<*> textool_error()
+# Obtains the error message of the last error. This string
+# can be used in error handling of your own style.
+sub textool_error
+{
+ return $errmsg;
+}
+
+##<*> textool_version()
+# Returns the version information on this library.
+sub textool_version
+{
+ my ($t, @fs);
+ $t = sprintf("%.5f", $VERSION);
+ (@fs = $t =~ m|^(\d+)\.(\d\d\d)(\d\d)$|)
+ or return fatal("textool_version");
+ $t = sprintf("%d.%d.%d", @fs);
+ return ("$t", $mod_date);
+}
+
+## get_temp_name()
+# Returns a temporary file name which is unique in the process.
+# Note: Trailing digits in font names can have special meaning
+# in some TeX tools.
+sub get_temp_name
+{
+ ++$get_temp_id[0];
+ return join('', $get_temp_base, $$, @get_temp_id[1, 0, 2]);
+}
+
+## get_temp_anme_init()
+# Initializer for get_temp_name.
+sub get_temp_name_init
+{
+ my ($t); $get_temp_id[0] = 0;
+ $t = join('', map { ('a' .. 'z')[int(rand() * 26)] } (0 .. 5));
+ @get_temp_id[1, 2] = map { substr($t, $_, 3) } (0, 3);
+}
+
+##<*> read_whole_file($fnam, $swbin)
+# Reads in file $fnam and returns its content as a string.
+# If $swbin or the global flag $binmode is true the file is read
+# in binary mode.
+sub read_whole_file
+{
+ my ($fnam, $swbin) = @_; my ($hf, $txt); local ($/);
+ (defined $fnam) or return;
+ open($hf, '<', $fnam)
+ or return error("cannot open for read: $fnam");
+ if ($binmode || $swbin) { binmode($hf); }
+ $txt = readline($hf);
+ close($hf);
+ return $txt;
+}
+
+##<*> write_whole_file($fnam, $txt, $swbin)
+# Creates (or crobbers) the file $fnam and write $txt to it.
+# If $swbin or the global flag $binmode is true it writes in
+# binary mode.
+sub write_whole_file
+{
+ my ($fnam, $txt, $swbin) = @_; my ($hf);
+ open($hf, '>', $fnam)
+ or return error("cannot open for write: $fnam");
+ if ($binmode || $swbin) { binmode($hf); }
+ print $hf ($txt);
+ close($hf);
+ return 1;
+}
+
+## unpack_num($s)
+# Decodes a unsigned number in big-endian string.
+sub unpack_num
+{
+ my ($s) = @_;
+ return unpack("N", substr("\0\0\0\0$s", length($s)));
+}
+
+## unpack_snum($s)
+# Decodes a signed number in big-endian string.
+my @snum_bound = (0, 0x80, 0x8000, 0x800000, B31);
+sub unpack_snum
+{
+ my ($s) = @_; my ($b, $v);
+ $b = $snum_bound[length($s)];
+ $v = unpack("N", substr("\0\0\0\0$s", length($s)));
+ return ($v >= $b) ? ($v - $b - $b) : $v;
+}
+
+## pack_num($v)
+# Encodes a unsigned number in big-endian string, with the length
+# prefix. In scalar context the returned values are concatenated.
+sub pack_num
+{
+ my ($v) = @_; my ($t, $l);
+ ($t = pack('N', $v)) =~ s/^\0{1,3}//; $l = length($t);
+ return (wantarray) ? ($l, $t) : (chr($l) . $t);
+}
+
+## pack_snum($v)
+# Signed version of pack_num.
+sub pack_snum
+{
+ my ($v) = @_; my ($t, $l);
+ ($t = pack('N', $v)) =~
+ s/^\0{1,3}([\x00-\x7f])|^\xff{1,3}([\x80-\xff])/$+/;
+ $l = length($t);
+ return (wantarray) ? ($l, $t) : (chr($l) . $t);
+}
+
+## signed($v)
+# Converts 'unsigned long' to 'signed long'.
+sub signed
+{
+ my ($v) = @_; $v &= M32;
+ return ($v >= B31) ? ($v - B31 - B31) : $v;
+}
+
+## round($v)
+# Rounds a real value to an integer.
+sub round
+{
+ my ($v) = @_;
+ return int($v + (($v < 0) ? -0.5 : +0.5));
+}
+
+##<*> arraymap($map, $swmm)
+# Converts a code map in hash form into array form.
+sub arraymap
+{
+ my ($map, $swmm) = @_; my ($sc, $dc, @u, @amap);
+ if (ref $map eq 'HASH') {
+ @u = sort { $a <=> $b } (keys %$map);
+ foreach $sc (@u) {
+ $dc = $map->{$sc};
+ if (ref $dc eq 'ARRAY') {
+ if ($swmm) {
+ foreach (@$dc) { push(@amap, [$sc, $_]); }
+ } else { push(@amap, [$sc, $dc->[0]]); }
+ } elsif (defined $dc) { push(@amap, [$sc, $dc]); }
+ }
+ return \@amap;
+ } elsif (ref $map eq 'ARRAY') { return $map; }
+ else { return; }
+}
+
+## squote($str)
+# S-quotes a string.
+sub squote
+{
+ my ($str) = @_; $str =~ s/([\\\'])/\\$1/g;
+ return "'$str'";
+}
+
+## zdquote($str)
+# ZD-quotes a string.
+sub zdquote
+{
+ my ($str) = @_; $str =~ s/([\\\"])/\\$1/g;
+ $str =~ s/([^\x20-\x7e])/sprintf("\\%02X",$1)/ge;
+ return "\"$str\"";
+}
+
+######## 'x' section ########
+
+use IPC::Open3; # for open3()
+our %cmd_name = (
+ kpsewhich => 'kpsewhich',
+ tftopl => 'ptftopl',
+ pltotf => 'ppltotf',
+ uptftopl => 'uptftopl',
+ uppltotf => 'uppltotf',
+ vftovp => 'vftovp',
+ vptovf => 'vptovf',
+ opl2ofm => 'opl2ofm',
+);
+
+##<*> x_captured_exec(@cmd);
+# Spawns the command @cmd, captures its stdout and stderr into
+# strings, and returns them.
+# --- Am I doing right?
+sub x_captured_exec
+{
+ my (@cmd) = @_; my ($pid, @fs, @ds);
+ local(*CHIN, *CHOUT, *CHERR, $/);
+ L1:{
+ @fs = (get_temp_name(), get_temp_name());
+ open(CHOUT, '+>', $fs[0]) or last;
+ open(CHERR, '+>', $fs[1]) or last;
+ ($pid = open3(\*CHIN, '>&CHOUT', '>&CHERR', @cmd)) or last;
+ waitpid($pid, 0);
+ seek(CHOUT, 0, 0); $ds[0] = <CHOUT>;
+ seek(CHERR, 0, 0); $ds[1] = <CHERR>;
+ }
+ close(CHIN); close(CHOUT); close(CHERR);
+ unlink(@fs);
+ return (@ds);
+}
+
+##<*> x_tftopl
+# Wrapper for 'tftopl' command.
+sub x_tftopl
+{
+ my ($tfm, $cmd) = @_; my ($ftmp, $ftfm, $cout, $cerr);
+ if (!defined $cmd) { $cmd = $cmd_name{tftopl}; }
+ if ($tfm =~ m/\.tfm$/i && $tfm !~ /\0/) { $ftfm = $tfm; }
+ else {
+ $ftfm = $ftmp = get_temp_name() . ".tfm";
+ (write_whole_file($ftmp, $tfm, 1)) or return;
+ }
+ ($cout, $cerr) = x_captured_exec("$cmd $ftfm");
+ if (defined $ftmp) { unlink($ftmp); }
+ if ($cout eq '' || $cout =~ /CHANGED!\)\s*$/) {
+ return error("tftopl failed: $ftfm");
+ }
+ return pl_parse($cout);
+}
+
+##<*> x_uptftopl
+# Wrapper for 'uptftopl' command.
+# Use of x_tftopl($tfm, "uptftopl") does not seem to work right.
+# Perhaps getting uptftopl to 'output to terminal' confuses
+# uptftopl as to handling UTF-8 strings....
+sub x_uptftopl
+{
+ my ($tfm, $cmd) = @_; my ($ftmp, $ftfm, $fpl, $cout, $cerr);
+ if (!defined $cmd) { $cmd = $cmd_name{uptftopl}; }
+ if ($tfm =~ m/\.tfm$/i && $tfm !~ /\0/) { $ftfm = $tfm; }
+ else {
+ $ftfm = $ftmp = get_temp_name() . ".tfm";
+ (write_whole_file($ftmp, $tfm, 1)) or return;
+ }
+ $fpl = get_temp_name() . ".pl";
+ ($cout, $cerr) = x_captured_exec("$cmd $ftfm $fpl");
+ if (defined $ftmp) { unlink($ftmp); }
+ $cout = read_whole_file($fpl); unlink($fpl);
+ if ($cout eq '' || $cout =~ /CHANGED!\)\s*$/) {
+ return error("tftopl failed: $ftfm");
+ }
+ if ($cout =~ m/CHARSINTYPE/) { $cout = pl_adjust_lit_paren($cout); }
+ return pl_parse($cout);
+}
+
+##<*> x_pltotf
+# Wrapper for 'pltotf' command.
+sub x_pltotf
+{
+ my ($pl, $cmd) = @_;
+ my ($ftmp, $fpl, $cout, $ftfm, $tfm, $tn);
+ if (!defined $cmd) { $cmd = $cmd_name{pltotf}; }
+ $tn = get_temp_name(); $ftfm = "$tn.tfm";
+ if (ref $pl eq 'ARRAY') { $pl = pl_form($pl); }
+ if ($pl =~ m/\.pl$/i) { $fpl = $pl; }
+ else {
+ $fpl = $ftmp = "$tn.pl";
+ (write_whole_file($ftmp, $pl)) or return;
+ }
+ $cout = `$cmd $fpl $ftfm`; # no output to stderr
+ if (defined $ftmp) { unlink($ftmp); }
+ (-f $ftfm) or return error("pltotf failed: $fpl");
+ $tfm = read_whole_file($ftfm, 1); unlink($ftfm);
+ foreach (split(/\n/, $cout)) {
+ if (m/^\s*$/ || m/^I had to round some / ||
+ m/Input file is in kanji /) { next; }
+ return error("pltotf failed: $fpl");
+ }
+ return $tfm;
+}
+
+##<*> x_vptovf
+# Wrapper for 'vptovf' command.
+sub x_vptovf
+{
+ my ($pl, $cmd) = @_;
+ my ($ftmp, $fpl, $cout, $ftfm, $tfm, $fvf, $vf, $tn);
+ if (!defined $cmd) { $cmd = $cmd_name{vptovf}; }
+ $tn = get_temp_name(); $ftfm = "$tn.tfm"; $fvf = "$tn.vf";
+ if (ref $pl eq 'ARRAY') { $pl = pl_form($pl); }
+ if ($pl =~ m/\.vpl$/i) { $fpl = $pl; }
+ else {
+ $fpl = $ftmp = "$tn.vpl";
+ (write_whole_file($ftmp, $pl)) or return;
+ }
+ $cout = `$cmd $fpl $fvf $ftfm`; # no output to stderr
+ if (defined $ftmp) { unlink($ftmp); }
+ (-f $ftfm && -f $fvf) or return error("vptovf failed: $fpl");
+ $tfm = read_whole_file($ftfm, 1); unlink($ftfm);
+ $vf = read_whole_file($fvf, 1); unlink($fvf);
+ foreach (split(/\n/, $cout)) {
+ if (m/^\s*$/ || m/^I had to round some / ||
+ m/Input file is in kanji / || m/LIG/) { next; }
+ return error("vptovf failed: $fpl");
+ }
+ return ($vf, $tfm);
+}
+
+##<*> x_opl2ofm
+# Wrapper for 'opl2ofm' command.
+sub x_opl2ofm
+{
+ my ($pl) = @_; my ($cmd, $ftmp, $fpl, $cout, $ftfm, $tfm, $tn);
+ $tn = get_temp_name(); $ftfm = "$tn.ofm";
+ if (ref $pl eq 'ARRAY') { $pl = pl_form($pl); }
+ if ($pl =~ m/\.opl$/i) { $fpl = $pl; }
+ else {
+ $fpl = $ftmp = "$tn.opl";
+ (write_whole_file($ftmp, $pl)) or return;
+ }
+ $cmd = $cmd_name{opl2ofm};
+ $cout = `$cmd $fpl $ftfm`; # no output to stderr
+ if (defined $ftmp) { unlink($ftmp); }
+ (-f $ftfm) or return error("opl2ofm failed: $fpl");
+ $tfm = read_whole_file($ftfm, 1); unlink($ftfm);
+ foreach (split(m/\n/, $cout)) {
+ if (m/^\s*$/ || m/^I had to round some / ||
+ m/Input file is in kanji /) { next; }
+ return error("opl2ofm failed: $fpl");
+ }
+ return $tfm;
+}
+
+
+######## 'pl' section ########
+
+####---- Handling General Property Lists
+
+# * Data structure: pl-list, pl-struct
+# A PL Text consists of a sequence of Lispish lists (without the
+# outermost parentheses). In 'raw' structures, Lispish lists are
+# represented by Perl arrays with straightforward conversion
+# (all atomic elements are strings). Such an array is called
+# 'pl-list' here. The entire PL is represented as an array of
+# pl-lists, called 'pl-struct' here.
+# However, in 'cooked' structures, some numerical data are
+# interpreted. For example, raw data
+# 'D', '0100' (a part of a pl-list)
+# are cooked they change to
+# [ CNUM, 100, 'D' ], '0100'
+# and moreover the assignment of 500 to this part results in
+# [ CNUM, 500, 'D' ], undef
+# And its conversion back into text is 'O 764', because 500 cannot
+# be expressed in 'D' notation.
+
+use constant CNUM => ' '; # flag signifying a cooked number
+our $freenum = 0;
+
+my %pl_facecode = ( # 'F' notation
+ MRR => 0, MIR => 1, BRR => 2, BIR => 3, LRR => 4, LIR => 5,
+ MRC => 6, MIC => 7, BRC => 8, BIC => 9, LRC => 10, LIC => 11,
+ MRE => 12, MIE => 13, BRE => 14, BIE => 15, LRE => 16, LIE => 17
+);
+my %pl_facecode_rev = (reverse %pl_facecode);
+
+##<*> pl_parse($txt)
+# Converts a PL text $txt to a 'cooked' pl-struct.
+sub pl_parse
+{
+ my ($txt) = @_; my ($pl, $ent);
+ (defined($pl = pl_parse_list("($txt)"))) or return;
+ (pl_cook_list($pl)) or return;
+ foreach $ent (@$pl) {
+ if (!ref $ent) { return error("bareword found: ", $ent); }
+ }
+ return $pl;
+}
+
+##<*> pl_parse_list($txt)
+# Converts a text $txt of a Lispish list to a 'raw' pl-list.
+sub pl_parse_list
+{
+ my ($txt) = @_; my (@toks, $pp, $t, $swjis);
+ if (($swjis = $txt =~ m/\x1B\x24/)) { $txt = pl_conv_jis_out($txt); }
+ @toks = grep { $_ ne "" } (split(/(\()|(\))|\s+/, $txt));
+ if ($swjis) {
+ foreach (@toks) {
+ if (m/[\x80-\xff]/) { $_ = pl_conv_jis_in($_); }
+ }
+ }
+ if ($toks[0] ne '(') { return error("missing paren at top"); }
+ $pp = pl_corres_paren(\@toks, 0);
+ if ($pp == $#toks) {
+ return pl_parse_sub(\@toks, 1, $pp - 1);
+ } elsif ($pp < 0) {
+ return error("unmatched parens (end at level ", -$pp, ")");
+ } else {
+ return error("unmatched parens (extra tokens)");
+ }
+}
+sub pl_conv_jis_out {
+ my ($txt) = @_; my ($t, $pos, @cnks);
+ $pos = pos($txt) = 0;
+ while ($txt =~
+ m/(\x1B\x24[\x42\x40]([\x21-\x7E]+)\x1B\x28[\x42\x4A])/g) {
+ ($t = $2) =~ tr/\x21-\x7E/\xA1-\xFE/;
+ push(@cnks, substr($txt, $pos, pos($txt) - length($1) - $pos), $t);
+ $pos = pos($txt);
+ }
+ return join('', @cnks, substr($txt, $pos));
+}
+sub pl_conv_jis_in {
+ my ($txt) = @_; my ($t, $pos, @cnks);
+ $pos = pos($txt) = 0;
+ while ($txt =~ m/([\xA1-\xFE]+)/g) {
+ ($t = $1) =~ tr/\xA1-\xFE/\x21-\x7E/;
+ push(@cnks, substr($txt, $pos, pos($txt) - length($1) - $pos),
+ "\x1B\x24\x42$t\x1B\x28\x42");
+ $pos = pos($txt);
+ }
+ return join('', @cnks, substr($txt, $pos));
+}
+
+## pl_adjust_lit_paren($pl)
+sub pl_adjust_lit_paren
+{
+ my ($pl) = @_; my ($mod, $repl, $lin, @lins);
+ @lins = split(m/\n/, $pl);
+ foreach (0 .. $#lins) {
+ $lin = $lins[$_];
+ if ($mod == 2) {
+ if ($lin =~ m/^\s*\)\s*$/) {
+ $lins[$_ - 1] =~ s/\)/X0029/; $repl = 1;
+ }
+ $mod = 0;
+ } elsif ($mod == 1) {
+ if ($lin =~ m/^\s*\)\s*$/) { $mod = 2; }
+ else {
+ if ($lin =~ m/\(/) { $lins[$_] =~ s/\(/X0028/g; $repl = 1; }
+ if ($lin =~ m/\)/) { $lins[$_] =~ s/\)/X0029/g; $repl = 1; }
+ }
+ }
+ if ($lin =~ m/^\(CHARSINTYPE /) { $mod = 1; }
+ }
+ return ($repl) ? join("\n", @lins) : $pl;
+}
+
+## pl_parse_sub(...)
+# Subcontractor of pl_parse_list.
+sub pl_parse_sub
+{
+ my ($toks, $sp, $ep) = @_; my (@pl, $tok, $p, $pp, $pl2);
+ for ($p = $sp; $p <= $ep; $p++) {
+ $tok = $toks->[$p];
+ if ($tok eq '(') {
+ $pp = pl_corres_paren($toks, $p);
+ ($p < $pp && $pp <= $ep) or return fatal(0);
+ (defined($pl2 = pl_parse_sub($toks, $p + 1, $pp - 1))) or return;
+ push(@pl, $pl2); $p = $pp;
+ } else {
+ push(@pl, $tok);
+ }
+ }
+ return \@pl;
+}
+
+## pl_corres_paren($toks, $p)
+# Returns the index of the ')' token which corresponds with the
+# '(' token at index $p in an array $toks.
+sub pl_corres_paren
+{
+ my ($toks, $p) = @_; my ($tok, $lv);
+ for ($lv = 1, ++$p; $p <= $#$toks; $p++) {
+ $tok = $toks->[$p];
+ if ($tok eq '(') { ++$lv; }
+ elsif ($tok eq ')') { --$lv; }
+ if ($lv == 0) { last; }
+ }
+ return ($lv > 0) ? -$lv : $p;
+}
+
+##<*> pl_cook_list($pl)
+# Makes a raw pl-list $pl cooked.
+sub pl_cook_list
+{
+ my ($pl) = @_; my ($k, $ent, $res);
+ for ($k = 0; $k <= $#$pl; $k++) {
+ $ent = $pl->[$k];
+ if (ref $ent) {
+ if ($ent->[0] eq 'COMMENT') {
+ splice(@$pl, $k, 1); redo;
+ } elsif ($ent->[0] ne CNUM) {
+ (pl_cook_list($ent)) or return;
+ }
+ } elsif ($ent =~ /^[CKDFOHR]$/ && $k < $#$pl) {
+ (defined pl_proc_num($pl, $k)) or return;
+ ++$k;
+ }
+ }
+ return $pl;
+}
+
+##<*> pl_form($pl, $ind)
+# Converts a pl-struct $pl into a PL text. Here $ind is the amount
+# of indent: if negative the result is in in-line form.
+sub pl_form
+{
+ my ($pl, $ind) = @_; my (@cnks, $ent, $txt);
+ foreach $ent (@$pl) {
+ (defined($txt = pl_form_list($ent, $ind))) or return;
+ push(@cnks, $txt);
+ }
+ if ($ind >= 0) { return join("\n", @cnks, ''); }
+ else { return join(' ', @cnks); }
+}
+
+# for pl_form_list
+my $pl_rx_kent = qr/^[^\x20-\x7e]|^[JUX][0-9A-Fa-f]{4,6}$/;
+
+##<*> pl_form_list($pl, $ind)
+# Converts a pl-list $pl into a Lispish list.
+sub pl_form_list
+{
+ my ($pl, $ind) = @_; my (@cnks, @lins, @toks);
+ my ($k, $t, $lsepp, $lsep, $ent, $tok, $txt);
+ if ($ind >= 0) {
+ push(@cnks, '('); $ind += 3;
+ $lsepp = $lsep = "\n" . ' ' x $ind;
+ } else { push(@cnks, '('); $lsepp = $lsep = ' '; }
+ for ($k = 0; $k <= $#$pl; $k++) {
+ $ent = $pl->[$k];
+ if (ref $ent) {
+ if ($ent->[0] eq CNUM) {
+ $tok = $pl->[$k + 1]; ++$k;
+ if (defined $tok) { push(@lins, $ent->[2], $tok); }
+ else {
+ (@toks = pl_form_num($ent->[2], $ent->[1])) or return;
+ push(@lins, @toks);
+ }
+ } else {
+ if (@lins) { push(@cnks, join(' ', @lins), $lsepp); }
+ (defined($txt = pl_form_list($ent, $ind))) or return;
+ @lins = (); push(@cnks, $txt, $lsep);
+ }
+ } elsif ($k > 0 && $ind >= 0 && $ent =~ m/$pl_rx_kent/) {
+ if (@lins) { push(@cnks, join(' ', @lins), $lsepp); }
+ $t = '';
+ while ($pl->[$k] =~ m/$pl_rx_kent/) {
+ if (length($t) + length($pl->[$k]) + $ind > 72) { last; }
+ $t .= $pl->[$k] . ' '; ++$k;
+ }
+ --$k; chop($t); @lins = (); push(@cnks, $t, $lsep);
+ } else { push(@lins, $ent); }
+ }
+ push(@cnks, join(' ', @lins), ')');
+ if ($ind < 0 && $cnks[-3] eq $lsep) { $cnks[-3] = ''; }
+ return join('', @cnks);
+}
+
+##<*> pl_value($pl, $k, $sw)
+# Reads the number at position $k in pl-list $pl. Note that
+# $k is the position of form prefix and not the string represeting
+# the nubmer itself.
+# The value will be rounded to integers unless $sw is true.
+sub pl_value
+{
+ my ($pl, $k, $sw) = @_; my ($ent);
+ $ent = $pl->[$k];
+ if (ref $ent && $ent->[0] eq CNUM) {
+ return ($sw) ? $ent->[1] : round($ent->[1]);
+ }
+ return pl_proc_num($pl, $k);
+}
+
+## pl_proc_num($pl, $k)
+# Converts the number token at position $k in pl-list $pl to
+# cooked form.
+sub pl_proc_num
+{
+ my ($pl, $k) = @_; my ($v, $fl, $tok);
+ ($fl, $tok) = ($pl->[$k], $pl->[$k + 1]);
+ if (defined($v = pl_parse_num($fl, $tok))) {
+ $pl->[$k] = [ CNUM, $v, $fl ]; return $v;
+ } else {
+ return error("malformed number (", $fl, " ", $tok, ")");
+ }
+}
+
+##<*> pl_set_value($pl, $k, $v)
+# Changes the number at position $k in pl-list $pl to $v.
+sub pl_set_value
+{
+ my ($pl, $k, $v) = @_; my ($ent);
+ $ent = $pl->[$k];
+ (ref $ent && $ent->[0] eq CNUM)
+ or return error("illegal assignment", $ent);
+ $pl->[$k + 1] = undef; $ent->[1] = $v;
+ return 1;
+}
+
+##<*> pl_set_real($pl, $k)
+# Changes the 'R'-form number at position $k in pl-list $pl to
+# $v, which is a non-scaled value.
+sub pl_set_real
+{
+ my ($pl, $k, $v) = @_; my ($ent);
+ $ent = $pl->[$k];
+ (ref $ent && $ent->[0] eq CNUM && $ent->[2] eq 'R')
+ or return error("illegal assignment", $ent);
+ $pl->[$k + 1] = undef; $ent->[1] = $v * TU;
+ return 1;
+}
+
+##<*> pl_set_value($pl, $k, $v)
+# Changes the form prefix of the number at position $k in
+# pl-list $pl to $v.
+sub pl_set_numtype
+{
+ my ($pl, $k, $v) = @_; my ($ent);
+ $ent = $pl->[$k];
+ (ref $ent && $ent->[0] eq CNUM)
+ or return error("illegal assignment", $ent);
+ $pl->[$k + 1] = undef; $ent->[2] = $v;
+ return 1;
+}
+
+
+##<*> pl_prefer_hex($sw)
+# Sets the value of the global flag $pl_prefer_hex. If its value is
+# true, then 'H' (instead of 'O') is used as a fallback of 'D'/'C'.
+our $pl_prefer_hex = 0;
+sub pl_prefer_hex { $pl_prefer_hex = $_[0]; }
+
+## pl_parse_num($fl, $tok)
+# Converts a number token to the number it expresses. Here $fl is
+# a form prefix and $tok is a token,
+sub pl_parse_num
+{
+ my ($fl, $tok) = @_; my ($ll, $ul, $v);
+ $ll = 0; $ul = M32;
+ if (ref $tok) { return; }
+ if ($fl eq 'C') {
+ $v = ($tok =~ /^[\x21-\x7e]$/ && ord($tok));
+ } elsif ($fl eq 'K') {
+ $v = jcode_ord($tok);
+ } elsif ($fl eq 'D') {
+ $v = ($tok =~ /^-?\d+$/ && $tok); $ul = 255;
+ } elsif ($fl eq 'F') {
+ $v = (exists $pl_facecode{$tok} && $pl_facecode{$tok});
+ } elsif ($fl eq 'O') {
+ $v = ($tok =~ /^[0-7]+$/ && oct($tok)); $ul = M32;
+ } elsif ($fl eq 'H' || $fl eq 'I') {
+ $v = ($tok =~ /^[\da-f]+$/i && hex($tok)); $ul = M32;
+ } elsif ($fl eq 'R') {
+ $v = ($tok =~ /^[\+\-]?(\d*\.)?\d+$/ && pl_scale_real($tok));
+ $ll = - B31; $ul = M31;
+ }
+ if ($freenum && $fl ne 'R') { $ul = M32; $ll = -$ul; }
+ if (!($ll <= $v && $v <= $ul)) { $v = undef; }
+ return $v;
+}
+
+## pl_form_num($fl, $v)
+# Expresses the number $v in form $fl. If the number cannot (or
+# should not) be expressed in form $fl, then $fl is fallen back
+# to another suitable value. It returns ($fl, $tok) where $tok
+# is the resulted expression and $fl is the possibly adapted
+# value of form prefix.
+sub pl_form_num
+{
+ my ($fl, $v) = @_; my ($tok);
+ $tok = $fl;
+ if ($fl eq 'F' && $v > 17) { $fl = 'D'; }
+ if ($fl eq 'C' && !pl_isprint($v)) { $fl = 'I'; }
+ if ($fl eq 'K' && (!pl_isjprint($v))) { $fl = 'H'; }
+ if ($fl eq 'D' && $v > 255) { $fl = 'I'; }
+ if ($fl eq 'I') { $fl = ($pl_prefer_hex) ? 'H' : 'O'; }
+ if (($fl eq 'R' && !(- B31 <= $v && $v <= M31))
+ || ($fl ne 'R' && !(0 <= $v && $v <= M32))) {
+ return error("number is out of range ($v for $tok)");
+ }
+ if ($fl eq 'C') { $tok = chr($v); }
+ elsif ($fl eq 'K') { $tok = jcode_chr($v); }
+ elsif ($fl eq 'D') { $tok = $v; }
+ elsif ($fl eq 'F') { $tok = $pl_facecode_rev{$v}; }
+ elsif ($fl eq 'O') { $tok = sprintf("%o", $v); }
+ elsif ($fl eq 'H') { $tok = sprintf("%X", $v); }
+ elsif ($fl eq 'R') { $tok = pl_form_real($v / TU); }
+ return ($fl, $tok);
+}
+
+# Note: In PL, big numbers (>255) in decimal are not allowed,
+# whereas they are allowed in VPL.
+
+## pl_form_real($a)
+# Expresses a real number in the same way as in PL.
+sub pl_form_real
+{
+ my ($a) = @_; my ($d, @t);
+ if ($a < -0.5 / TU) { $a = -$a; @t = ("-"); }
+ $a = int($a * TU + 0.5);
+ { use integer;
+ push(@t, $a / TU, "."); $a %= TU;
+ $a = $a * 10 + 5; $d = 10;
+ do {
+ if ($d > 0x100000) { $a = $a + 0x80000 - $d / 2; }
+ push(@t, $a / 0x100000); $a = $a % 0x100000 * 10; $d *= 10;
+ } until ($a <= $d);
+ }
+ return join('', @t);
+}
+
+## pl_scale_real($a)
+# Returns a real value scaled to tfm-unit, rounded to integer.
+sub pl_scale_real
+{
+ my ($a) = @_;
+ return int($a * TU + (($a < 0) ? -0.5 : +0.5));
+}
+
+
+## pl_isprint($c)
+# Tests if the number $c is to output really in 'C' form.
+sub pl_isprint
+{
+ my ($c) = @_;
+ return (0 <= $c && $c <= 255 && chr($c) =~ /^\w/);
+}
+
+## pl_isjprint($c)
+# Tests if the number $c is to output in 'K' form.
+sub pl_isjprint
+{
+ my ($c) = @_;
+ return defined(jcode_chr($c));
+}
+
+####---- Rearranging pl-structs
+
+##<*> pl_rearrange($pl)
+# Sorts the pl-lists in a pl-struct $pl so that they are in
+# 'usual' order.
+sub pl_rearrange
+{
+ my ($pl) = @_;
+ @$pl = sort { pl_prop_pos($a) <=> pl_prop_pos($b) } (@$pl);
+ return $pl;
+}
+
+# for pl_prop_pos
+my %pl_prop_pos_base = (
+# 0xZ0001 --> 0xZXXXXXX
+# 0xZ0002 --> 0xZXX0000
+# 0xZ0003 --> 0xZXXYYYY
+ DIRECTION => 0x0000010,
+ VTITLE => 0x0000011,
+ FAMILY => 0x0000012,
+ FACE => 0x0000013,
+ HEADER => 0x1000001,
+ CODINGSCHEME => 0x2000010,
+ DESIGNUNITS => 0x2000011,
+ DESIGNSIZE => 0x2000012,
+ CHECKSUM => 0x2000013,
+ SEVENBITSAFEFLAG => 0x2000014,
+ FONTDIMEN => 0x2000015,
+ BOUNDARYCHAR => 0x2000016,
+ MAPFONT => 0x3000001,
+ LIGTABLE => 0x4000010,
+ GLUEKERN => 0x4000010,
+ CODESPACE => 0x5000000,
+ CHARSINTYPE => 0x5000002,
+ CHARSINSUBTYPE => 0x5000003,
+ TYPE => 0x6000002,
+ SUBTYPE => 0x6000003,
+ CHARACTER => 0x7000001,
+);
+
+## pl_prop_pos($pl)
+# Subcontractor for pl_rearrange.
+sub pl_prop_pos
+{
+ my ($pl) = @_; my ($v, $u);
+ $v = $pl_prop_pos_base{$pl->[0]};
+ if (!defined $v) { return 0xFFFFFFF; }
+ $u = ($v & 0xffffff);
+ if ($u == 1) {
+ return ($v & 0xf000000) | pl_value($pl, 1);
+ } elsif ($u == 2) {
+ return ($v & 0xf000000) | (pl_value($pl, 1) << 16);
+ } elsif ($u == 3) {
+ return ($v & 0xf000000) | (pl_value($pl, 1) << 16) | pl_value($pl, 3);
+ } else { return $v; }
+}
+
+####---- Rearranging pl-lists
+
+##<*> pl_clone($pl)
+# Returns a deep clone of a pl-list, where the original and the
+# clone share no reference.
+sub pl_clone
+{
+ my ($pl) = @_;
+ if (ref $pl eq "ARRAY") {
+ return [ map { pl_clone($_) } (@$pl) ];
+ } else { return $pl; }
+}
+
+##<*> pl_sclone($pl)
+# Returns a one-level clone of a pl-list, considering cooked
+# number forms which should be uniquified.
+sub pl_sclone
+{
+ my ($pl) = @_;;
+ if (ref $pl eq "ARRAY") {
+ return [ map {
+ (ref $_ eq "ARRAY" && $_->[0] eq CNUM) ? [ @$_ ] : $_
+ } (@$pl) ];
+ } else { return $pl; }
+}
+
+
+####---- Handling PL/JPL/OPL/VPL Structs
+
+# The three functions below generate a header part (stuffs before
+# FONTDIMEN and optionally FONTDIMEN). Here $in is a hash ref with
+# the following effective keys:
+# direction, family, vtitle, face, codingscheme, designunits,
+# designsize, checksum, sevenbitsafeflag, boundarychar
+# they each correspond with the property of the same name. Of them
+# 'designsize' has the default value 10, but it can be cancelled
+# by 'designsize' key with the explicit undef value.
+# If $fd is not undef, it specifies FONTDIMEN list: if $fd is an
+# array ref it is seen as pl-list of FONTDIMEN and placed inside
+# the output pl-list; if $fd is a hash ref then pl_fontdimen($fd)
+# is placed instead.
+# Note: currently these three functions give the same result.
+
+##<*> pl_header($in, $fd)
+sub pl_header
+{ return pl_header_gen($_[0], $_[1], 0); }
+
+##<*> pl_header_vpl($in, $fd)
+sub pl_header_vpl
+{ return pl_header_gen($_[0], $_[1], 8); }
+
+##<*> pl_header_opl($in, $fd, $swl1)
+sub pl_header_opl
+{ return pl_header_gen($_[0], $_[1], ($_[2]) ? 2 : 1); }
+
+## pl_header_gen($in, $fd, $sw)
+# Subcontractor for the above three pl_header_* functions.
+sub pl_header_gen
+{
+ my ($in, $fd, $sw) = @_; my ($t, $pe, $dsiz, $ol, @pl);
+ if (exists $in->{ofmlevel}) { $ol = $in->{ofmlevel}; }
+ elsif ($sw == 1 || $sw == 2) { $ol = $sw - 1; }
+ $dsiz = (exists $in->{designsize}) ? $in->{designsize} : 10;
+ if (defined $ol) {
+ $pe = pl_cook(['OFMLEVEL', 'H', $ol]);
+ pl_set_value($pe, 1, $ol); push(@pl, $pe);
+ }
+ if (defined $in->{direction}) {
+ push(@pl, ['DIRECTION', $in->{direction}]);
+ }
+ if (defined $in->{family}) {
+ push(@pl, ['FAMILY', $in->{family}]);
+ }
+ if (defined $in->{vtitle}) {
+ push(@pl, ['VTITLE', $in->{vtitle}]);
+ }
+ if (defined $in->{face}) {
+ $pe = pl_cook(['FACE', 'F', 0]);
+ pl_set_value($pe, 1, $in->{face}); push(@pl, $pe);
+ }
+ if (defined $in->{codingscheme}) {
+ push(@pl, ['CODINGSCHEME', $in->{codingscheme}]);
+ }
+ if (defined $in->{designunits}) {
+ $pe = pl_cook(['DESIGNUNITS', 'R', 0]);
+ pl_set_real($pe, 1, $in->{designunits}); push(@pl, $pe);
+ }
+ if (defined $dsiz) {
+ $pe = pl_cook(['DESIGNSIZE', 'R', 0]);
+ pl_set_real($pe, 1, $dsiz); push(@pl, $pe);
+ }
+ if (defined $in->{checksum}) {
+ $pe = pl_cook(['CHECKSUM', 'O', 0]);
+ pl_set_value($pe, 1, $in->{checksum}); push(@pl, $pe);
+ }
+ if (defined $in->{sevenbitsafeflag}) {
+ push(@pl, ['SEVENBITSAFEFLAG', $in->{sevenbitsafeflag}]);
+ }
+ if (ref $fd eq 'ARRAY') {
+ push(@pl, $fd);
+ }
+ if (ref $fd eq 'HASH') {
+ push(@pl, pl_fontdimen($fd));
+ }
+ if (defined $in->{boundarychar}) {
+ $pe = pl_cook(['BOUNDARYCHAR', 'C', 0]);
+ pl_set_value($pe, 1, $in->{boundarychar}); push(@pl, $pe);
+ }
+ return \@pl;
+}
+
+##<*> pl_fontdimen($in)
+# Generates a FONTDIMEN list. $in is a hash ref with the following
+# effective keys:
+# slant, space, stretch, shrink, xheight, quad, extraspace;
+# they each correspond with the property of the same name. All
+# of them have a default value.
+sub pl_fontdimen
+{
+ my ($in) = @_; my ($q, $t, $pl);
+ (defined $in) or $in = { };
+ $pl = pl_cook(['FONTDIMEN',
+ ['SLANT', 'R', 0], ['SPACE', 'R', 0],
+ ['STRETCH', 'R', 0], ['SHRINK', 'R', 0],
+ ['XHEIGHT', 'R', 0], ['QUAD', 'R', 0],
+ ['EXTRASPACE', 'R', 0]]);
+ $q = $in->{quad}; (defined $q) or $q = 1;
+ pl_set_real($pl->[6], 1, $q);
+ $t = $in->{slant}; (defined $t) or $t = 0;
+ pl_set_real($pl->[1], 1, $t);
+ $t = $in->{space}; (defined $t) or $t = $q / 3;
+ pl_set_real($pl->[2], 1, $t);
+ $t = $in->{stretch}; (defined $t) or $t = $q / 6;
+ pl_set_real($pl->[3], 1, $t);
+ $t = $in->{shrink}; (defined $t) or $t = $q / 9;
+ pl_set_real($pl->[4], 1, $t);
+ $t = $in->{xheight}; (defined $t) or $t = $q / 2;
+ pl_set_real($pl->[5], 1, $t);
+ $t = $in->{extraspace}; (defined $t) or $t = $q / 9;
+ pl_set_real($pl->[7], 1, $t);
+ return $pl;
+}
+
+##<*> pl_fontdimen_jpl($in)
+# Generates a FONTDIMEN list of JPL. Here $in is the same as in
+# pl_fontdimen, except that two additional keys 'extrastretch'
+# and 'extrashrink' are used and default setting is different.
+sub pl_fontdimen_jpl
+{
+ my ($in) = @_; my ($q, $t, $pl);
+ (defined $in) or $in = { };
+ $pl = pl_cook(['FONTDIMEN',
+ ['SLANT', 'R', 0], ['SPACE', 'R', 0],
+ ['STRETCH', 'R', 0], ['SHRINK', 'R', 0],
+ ['XHEIGHT', 'R', 0], ['QUAD', 'R', 0],
+ ['EXTRASPACE', 'R', 0], ['EXTRASTRETCH', 'R', 0],
+ ['EXTRASHRINK', 'R', 0]]);
+ $q = $in->{quad}; (defined $q) or $q = 1;
+ pl_set_real($pl->[6], 1, $q);
+ $t = $in->{slant}; (defined $t) or $t = 0;
+ pl_set_real($pl->[1], 1, $t);
+ $t = $in->{space}; (defined $t) or $t = 0;
+ pl_set_real($pl->[2], 1, $t);
+ $t = $in->{stretch}; (defined $t) or $t = $q / 10;
+ pl_set_real($pl->[3], 1, $t);
+ $t = $in->{shrink}; (defined $t) or $t = 0;
+ pl_set_real($pl->[4], 1, $t);
+ $t = $in->{xheight}; (defined $t) or $t = $q;
+ pl_set_real($pl->[5], 1, $t);
+ $t = $in->{extraspace}; (defined $t) or $t = $q / 4;
+ pl_set_real($pl->[7], 1, $t);
+ $t = $in->{extrastretch}; (defined $t) or $t = $q / 5;
+ pl_set_real($pl->[8], 1, $t);
+ $t = $in->{extrashrink}; (defined $t) or $t = $q / 8;
+ pl_set_real($pl->[9], 1, $t);
+ return $pl;
+}
+
+# for pl_fonrdimen_?pl_rmt
+our @pl_keys_quad_u_jpl = (
+ 0x4E00, 0x3042, 0x306E, 0xFF2D, 0x004D, 0x2014
+);
+our @pl_keys_quad_u_opl = (
+ 0x2001, 0x2003, 0x004D, 0x2014
+);
+our @pl_keys_space_u_opl = (
+ 0x0020, 0x00A0
+);
+
+##<*> pl_fontdimen_opl_rmt($rmt)
+# Generates a FONTDIMEN list of OPL with values estimated from
+# the glyph metric $rmt.
+sub pl_fontdimen_opl_rmt
+{
+ my ($rmt) = @_; my ($t, $in);
+ $in = { };
+ (defined($t = pl_key_width($rmt, \@pl_keys_quad_u_opl)))
+ and $in->{quad} = $t;
+ (defined($t = pl_key_width($rmt, \@pl_keys_space_u_opl)))
+ and $in->{space} = $t;
+ return pl_fontdimen($in);
+}
+
+##<*> pl_fontdimen_jpl_rmt($rmt)
+# Generates a FONTDIMEN list of JPL with values estimated from
+# the glyph metric $rmt.
+sub pl_fontdimen_jpl_rmt
+{
+ my ($rmt) = @_; my ($t, $in);
+ $in = { };
+ (defined($t = pl_key_width($rmt, \@pl_keys_quad_u_jpl)))
+ and $in->{quad} = $t;
+ return pl_fontdimen($in);
+}
+
+## pl_key_width($rmt)
+# Subcontractor of pl_fontdimen_?pl_rmt.
+sub pl_key_width
+{
+ my ($rmt, $keys) = @_; my ($t, %hsh);
+ foreach (@$rmt) { $hsh{$_->[0]} = $_; }
+ foreach (@$keys) {
+ (defined($t = $hsh{$_})) or next;
+ return $t->[1];
+ }
+ return;
+}
+
+## pl_cook($pl)
+# Cooks a pl-list $pl and returns it. (Sometimes more convenient
+# than pl_cook_list.)
+*pl_cook = \&pl_cook_list;
+
+# for pl_get_metric
+my %pl_char_part_pos = (
+ CHARWD => 1, CHARHT => 2, CHARDP => 3, CHARIC => 4
+);
+
+##<*> pl_get_metric($pl)
+# Reads the metric data from the CHARACTER set of pl-struct $pl
+# and converts them to a raw metric array.
+sub pl_get_metric
+{
+ my ($pl) = @_; my ($t, $p, $pe, $pe2, $ent, @rmt);
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'CHARACTER') {
+ (defined($t = pl_value($pe, 1))) or return;
+ $ent = [ $t ];
+ foreach $pe2 (@{$pe}[3 .. $#$pe]) {
+ if (defined($p = $pl_char_part_pos{$pe2->[0]})) {
+ (defined($t = pl_value($pe2, 1))) or return;
+ $ent->[$p] = $t / TU;
+ }
+ }
+ push(@rmt, $ent);
+ }
+ }
+ return \@rmt;
+}
+
+# for pl_char_part
+my @pl_char_part_name = qw( * CHARWD CHARHT CHARDP CHARIC );
+
+##<*> pl_char_part
+# Converts a raw metric array to an array of CHARACTER lists.
+# Partial inverse of pl_get_metric
+sub pl_char_part
+{
+ my ($rmt) = @_; my ($ent, $pe, $pe2, $pl);
+ $pl = [ ];
+ foreach $ent (@$rmt) {
+ $pe = pl_cook(['CHARACTER', 'C', 0]);
+ pl_set_value($pe, 1, $ent->[0]);
+ foreach (1 .. 4) {
+ if (defined($ent->[$_])) {
+ $pe2 = pl_cook([$pl_char_part_name[$_], 'R', 0]);
+ pl_set_real($pe2, 1, $ent->[$_]); push(@$pe, $pe2);
+ }
+ }
+ push(@$pl, $pe);
+ }
+ return $pl;
+}
+
+##<*> pl_char_part_jpl($imt, $vmt, $swu)
+# ...
+sub pl_char_part_jpl
+{
+ my ($imt, $vmt, $swu) = @_; my ($t, $cc, $ti, $jp);
+ my (@cit, $pl, $pe, @u);
+ $jp = ($swu) ? 'U' : 'J';
+ foreach $cc (keys %$imt) {
+ push(@{$cit[$imt->{$cc}]}, $cc);
+ }
+ foreach $ti (1 .. $#cit) {
+ @u = map { sprintf("%s%04X", $jp, $_) }
+ (sort { $a <=> $b } (@{$cit[$ti]}));
+ $pe = pl_cook(['CHARSINTYPE', 'D', 0, @u]);
+ pl_set_value($pe, 1, $ti); push(@$pl, $pe);
+ }
+ foreach $ti (0 .. $#$vmt) {
+ $pe = pl_cook(['TYPE', 'D', 0, ['CHARWD', 'R', 0],
+ ['CHARHT', 'R', 0], ['CHARDP', 'R', 0]]);
+ pl_set_value($pe, 1, $ti);
+ pl_set_real($pe->[3], 1, $vmt->[$ti][0]);
+ pl_set_real($pe->[4], 1, $vmt->[$ti][1]);
+ pl_set_real($pe->[5], 1, $vmt->[$ti][2]);
+ push(@$pl, $pe);
+ }
+ return $pl;
+}
+
+
+######## 'jcode' section ########
+
+our $jcode_ex = K_JIS;
+our $jcode_in = KI_JIS;
+our $jfm_forced_prefix;
+
+my %jcode_ex_sym = ( jis => K_JIS, euc => K_EUC,
+ sjis => K_SJIS, utf8 => K_UTF8,
+ none => undef, xjis => K_XJIS );
+my %jcode_in_sym = ( jis => KI_JIS, unicode => KI_UNI,
+ none => undef, xjis => KI_XJIS );
+ # 'xjis' is for internal use
+
+##<*> jcode_set($xjc, $ijc)
+# Declares external [internal] Japanese code to be $xjc [$ijc],
+# which is a key of %jcode_ex_sym [%jcode_in_sym].
+sub jcode_set
+{
+ my ($xjc, $ijc) = @_; my ($t);
+ if (defined $xjc) {
+ (exists $jcode_ex_sym{$xjc}) or return;
+ $jcode_ex = $jcode_ex_sym{$xjc};
+ }
+ if (defined $ijc) {
+ (exists $jcode_in_sym{$ijc}) or return;
+ $jcode_in = $jcode_in_sym{$ijc};
+ }
+ #if (!defined $jcode_ex || !defined $jcode_in) {
+ # $jcode_ex = $jcode_in = undef;
+ #}
+ return 1;
+}
+
+##<*> jcode_chr($cod)
+# Converts a code value of the internal code to a string containing
+# the character encoded in the external code.
+sub jcode_chr
+{
+ my ($cod) = @_; my ($xs, $is);
+ (defined $jcode_in && defined $jcode_ex) or return;
+ (0 <= $cod && $cod <= 0xFFFF) or return;
+ $xs = chr($cod >> 8) . chr($cod & 0xFF);
+ eval {
+ $is = decode($jcode_in, $xs, Encode::FB_CROAK);
+ $xs = encode($jcode_ex, $is, Encode::FB_CROAK);
+ };
+ ($@ eq '' && length($is) == 1) or return;
+ return $xs;
+}
+
+##<*> jcode_ord($xs)
+# Inverse of jcode_chr.
+sub jcode_ord
+{
+ my ($xs) = @_; my ($is, $cod, $f);
+ (defined $jcode_in && defined $jcode_ex) or return;
+ if ($jcode_in eq KI_XJIS && $jcode_ex eq K_XJIS) {
+ $xs =~ m/\x1B\x24\x42(..)\x1B\x28\x42/ or return;
+ return unpack('n', $1);
+ }
+ eval {
+ $is = decode($jcode_ex, $xs, Encode::FB_CROAK);
+ (length($is) == 1) or die;
+ };
+ ($@ eq '') or return;
+ if ($jcode_in eq KI_UNI) { return ord($is); }
+ eval {
+ $xs = encode($jcode_in, $is, Encode::FB_CROAK);
+ };
+ ($@ eq '' && $xs =~ m/^(.)(.)$/s) or return;
+ return (ord($1) << 8 | ord($2));
+}
+
+######## 'kpse' section ########
+
+our $kpse_init_done;
+our $kpse_delim;
+our %kpse_format_alias = (
+ cmap => 'cmap files',
+);
+
+##<*> kpse($fnam, $opt)
+# Executes 'kpsewhich' for filename $fnam with option $opt.
+# If $opt is a scalar, it means the value for 'format' option.
+# If $opt is a hash ref, then the value for keys 'dpi', 'engine',
+# 'mode', 'progname' and 'format' corresponds with the value of the
+# option with same name and the boolean value for key 'mustexist'
+# corresponds with existence of 'must-exist' option. For 'option'
+# value, aliasing specified with %kpse_format_alias is done.
+sub kpse
+{
+ my ($fnam, $opt) = @_; my ($cmd, $res);
+ ($kpse_init_done || kpse_init()) or return undef;
+ $opt = kpse_parse_option($opt, $fnam); $cmd = $cmd_name{kpsewhich};
+ if (ref $opt eq 'ARRAY') { return kpse_manual($fnam, $opt); }
+ $res = `$cmd $opt "$fnam"`; chomp($res);
+ if (-f $res) { return $res; }
+ else { # returns undef, not nothing
+ error("kpse failed to find a file: $fnam"); return undef;
+ }
+}
+
+##<*> kpse_init()
+# Initializes the kpse section of this module.
+sub kpse_init
+{
+ my ($res, $cmd);
+ (!defined $kpse_init_done)
+ or return error("kpsewhich failure");
+ $cmd = $cmd_name{kpsewhich};
+ if (($res = `$cmd -show-path=tex`) eq '') {
+ $kpse_init_done = 0;
+ return error("kpsewhich failure");
+ }
+ if ($res =~ m/^\.\:/) { $kpse_delim = ':'; }
+ elsif ($res =~ m/;/) { $kpse_delim = ';'; }
+ else { $kpse_delim = ':'; }
+ $kpse_init_done = 1;
+ return 1;
+}
+
+## kpse_parse_option($opt)
+# Subcontractor of kpse.
+sub kpse_parse_option
+{
+ my ($opt, $fnam) = @_; my ($o, $t, @copts);
+ if (ref $opt eq 'ARRAY') { return $opt; } # for future extension
+ elsif (ref $opt eq 'HASH') {
+ foreach $o (qw(dpi engine mode progname)) {
+ if (exists $opt->{$o}) {
+ push(@copts, "-$o=" . $opt->{$o});
+ }
+ }
+ if ($opt->{mustexist}) { push(@copts, '-must-exist'); }
+ $opt = $opt->{format};
+ }
+ if ($opt eq '' && $fnam =~ m/\.vf$/i) { $opt = "vf"; }
+ if ($opt ne '') {
+ if (defined($t = $kpse_format_alias{$opt})) { $opt = $t; }
+ push(@copts, "-format=\"$opt\"");
+ }
+ return join(' ', @copts);
+}
+
+######## 'vf' section ########
+
+##<*> vf_strict($sw)
+# Sets strict mode in parsing or forming VF.
+our $vf_strict = 1;
+sub vf_strict { $vf_strict = $_[0]; }
+
+## vf_simple_move_code($sw)
+# Sets the value of $vf_simple_move_code. If it is true, then
+# vf_form does not exploit w, x, y, z registers in compiling
+# move operations in DVI code.
+our $vf_simple_move_code = 0;
+sub vf_simple_move_code { $vf_simple_move_code = $_[0]; }
+
+##-------- Procedures on ZVP0 format
+
+##<*> vf_parse($dat, $swdh)
+# Converts a (binary) VF data $dat to a pl-struct describing
+# ZPL0 data. If something invalid is found in DVI code and $swdh
+# is true, then DVI is written with a DIRECTHEX entry.
+sub vf_parse
+{
+ my ($dat, $swdh) = @_;
+ my ($t, $u, @fs, $pos, $pl, $pe, $stg);
+ (defined $swdh) or $swdh = !$vf_strict;
+ (length($dat) >= 3) or return vf_synerror("in preamble");
+ @fs = unpack("CCC/a*NN", $dat); $pos = length($fs[2]) + 11;
+ ($#fs == 4 && $fs[0] == 247 && $fs[1] == 202)
+ or return vf_synerror("in preamble");
+ $pl = pl_header_vpl({ vtitle => $fs[2], checksum => $fs[3],
+ designsize => $fs[4] / TU });
+ for (;;) {
+ $t = ord(substr($dat, $pos, 1));
+ if ($stg <= 2 && 0 <= $t && $t <= 241) { # short_charN
+ @fs = unpack("CCa3a$t", substr($dat, $pos, $t + 5)); $pos += $t + 5;
+ ($#fs == 3 && length($fs[3]) == $t)
+ or return vf_synerror("premature end");
+ $pe = pl_cook(['CHARACTER', 'C', 0,
+ ['CHARWD', 'R', 0], undef]);
+ if (defined($t = vf_dvi_parse($fs[3]))) { $pe->[4] = $t; }
+ elsif (!$swdh) {
+ return vf_synerror("illegal dvi code (char $fs[1])");
+ } else { $pe->[4] = vf_dvi_dumb_parse($u); }
+ pl_set_value($pe->[3], 1, unpack_num($fs[2])); # (unsigned)
+ pl_set_value($pe, 1, $fs[1]);
+ $stg = 2; push(@$pl, $pe);
+ } elsif ($stg <= 2 && $t == 242) { # long_char
+ @fs = unpack("CNNN", substr($dat, $pos, 13)); $pos += 13;
+ $u = substr($dat, $pos, $fs[1]); $pos += $fs[1];
+ #-- give a cooked list for efficiency
+ #$pe = pl_cook(['CHARACTER', 'C', 0,
+ # ['CHARWD', 'R', 0], undef]);
+ $pe = (['CHARACTER', [CNUM, 0, 'C'], 0,
+ ['CHARWD', [CNUM, 0, 'R'], 0], undef]);
+ if (defined($t = vf_dvi_parse($u))) { $pe->[4] = $t; }
+ elsif (!$swdh) {
+ return vf_synerror("illegal dvi code (char $fs[2])");
+ } else { $pe->[4] = vf_dvi_dumb_parse($u); }
+ pl_set_value($pe->[3], 1, signed($fs[3]));
+ pl_set_value($pe, 1, $fs[2]);
+ $stg = 2; push(@$pl, $pe);
+ } elsif ($stg <= 1 && 243 <= $t && $t <= 246) { # fnt_defN
+ $t -= 242;
+ @fs = unpack("Ca${t}NNNCC", substr($dat, $pos, $t + 15)); $pos += $t + 15;
+ ($#fs == 6) or return vf_synerror("premature end");;
+ $t = $fs[5] + $fs[6]; $u = substr($dat, $pos, $t); $pos += $t;
+ (length($u) == $t) or return vf_synerror("premature end");;
+ $fs[6] = substr($u, $fs[5]); $fs[5] = substr($u, 0, $fs[5]);
+ $pe = pl_cook(['MAPFONT', 'D', 0, ['FONTAREA', 0],
+ ['FONTNAME', 0],, ['FONTCHECKSUM', 'O', 0],
+ ['FONTAT', 'R', 0], ['FONTDSIZE', 'R', 0]]);
+ $pe->[3][1] = $fs[5]; $pe->[4][1] = $fs[6];
+ pl_set_value($pe->[5], 1, $fs[2]);
+ pl_set_value($pe->[6], 1, $fs[3]);
+ pl_set_value($pe->[7], 1, $fs[4]);
+ pl_set_value($pe, 1, unpack_num($fs[1]));
+ if ($fs[5] eq '') { splice(@$pe, 3, 1); }
+ $stg = 1; push(@$pl, $pe);
+ } elsif ($stg == 2 && $t == 248) { # post
+ (($u = substr($dat, $pos, $t)) =~ /^\xf8+$/)
+ or return vf_synerror("in postamble");
+ last;
+ } else { return vf_synerror("unexpected byte $t"); }
+ }
+ return $pl;
+}
+
+## vf_dvi_parse($dat)
+# Subcontractor of vf_parse.
+sub vf_dvi_parse
+{
+ my ($dat) = @_;
+ my ($t, $u, @fs, $pos, $pl, $pe, $stk, $stg);
+ $pl = ['MAP']; $stk = [{}];
+ for ($pos = 0; $pos < length($dat); ) {
+ $t = ord(substr($dat, $pos, 1));
+ if (0 <= $t && $t <= 127) { # set_charN
+ $pe = pl_cook(['SETCHAR', 'C', 0]); $pos += 1;
+ pl_set_value($pe, 1, $t); push(@$pl, $pe);
+ } elsif (128 <= $t && $t <= 131) { # setN
+ $t -= 127; @fs = unpack("Ca$t", substr($dat, $pos));
+ $pos += $t + 1; ($#fs == 1) or return;
+ $pe = pl_cook(['SETCHAR', 'C', 0]);
+ pl_set_value($pe, 1, unpack_num($fs[1])); push(@$pl, $pe);
+ } elsif ($t == 132) { # setrule
+ @fs = unpack("CNN", substr($dat, $pos));
+ $pos += 9; ($#fs == 2) or return;
+ $pe = pl_cook(['SETRULE', 'R', 0, 'R', 0]);
+ pl_set_value($pe, 1, signed($fs[1]));
+ pl_set_value($pe, 3, signed($fs[2])); push(@$pl, $pe);
+ } elsif ($t == 141) { # push
+ $pos += 1; push(@$pl, ['PUSH']); push(@$stk, {});
+ } elsif ($t == 142) { # pop
+ $pos += 1; push(@$pl, ['POP']); pop(@$stk);
+ (@$stk) or return;
+ } elsif (143 <= $t && $t <= 146) { # rightN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'r', $t - 142);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif ($t == 147) { # w0
+ ($pe, $pos) = vf_dvi_move0($dat, $pos, $stk, 'w');
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (148 <= $t && $t <= 151) { # wN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'w', $t - 147);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif ($t == 152) { # x0
+ ($pe, $pos) = vf_dvi_move0($dat, $pos, $stk, 'x');
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (153 <= $t && $t <= 156) { # xN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'x', $t - 152);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (157 <= $t && $t <= 160) { # downN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'd', $t - 156);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif ($t == 161) { # y0
+ ($pe, $pos) = vf_dvi_move0($dat, $pos, $stk, 'y');
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (162 <= $t && $t <= 165) { # yN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'y', $t - 161);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif ($t == 166) { # z0
+ ($pe, $pos) = vf_dvi_move0($dat, $pos, $stk, 'z');
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (167 <= $t && $t <= 170) { # zN
+ ($pe, $pos) = vf_dvi_move1($dat, $pos, $stk, 'z', $t - 166);
+ (defined $pe) or return; push(@$pl, $pe);
+ } elsif (171 <= $t && $t <= 234) { # fnt_numN
+ $t -= 171; $pe = pl_cook(['SELECTFONT', 'D', 0]); $pos += 1;
+ pl_set_value($pe, 1, $t); push(@$pl, $pe);
+ } elsif (235 <= $t && $t <= 238) { # fntN
+ $t -= 234; @fs = unpack("Ca$t", substr($dat, $pos));
+ $pos += $t + 1; ($#fs == 1) or return;
+ $pe = pl_cook(['SELECTFONT', 'D', 0]);
+ pl_set_value($pe, 1, unpack_num($fs[1])); push(@$pl, $pe);
+ } elsif (239 <= $t && $t <= 242) { # xxxN
+ $t -= 238; @fs = unpack("Ca$t", substr($dat, $pos));
+ $pos += $t + 1; ($#fs == 1) or return;
+ $t = unpack_num($fs[1]); $u = substr($dat, $pos, $t);
+ $pos += $t; ($t == length($u)) or return;
+ $pe = vf_dvi_special($u); push(@$pl, $pe);
+ } elsif ($t == 255) { # dir (JVF)
+ @fs = unpack("CC", substr($dat, $pos));
+ $pos += 2; ($#fs == 1) or return;
+ $pe = pl_cook(['DIR', 'D', 0]);
+ pl_set_value($pe, 1, $fs[1]); push(@$pl, $pe);
+ } else { return; }
+ }
+ return $pl;
+}
+
+## vf_synerror($msg)
+# Error messages in vf_parse.
+sub vf_synerror
+{
+ return error("VF syntax error: $_[0]");
+}
+
+# for vf_dvi_move1 / vf_dvi_move0
+my %vf_dvi_move = (
+ r => 'MOVERIGHT', w => 'MOVERIGHT', x => 'MOVERIGHT',
+ d => 'MOVEDOWN', y => 'MOVEDOWN', z => 'MOVEDOWN',
+);
+
+## vf_dvi_move1(...)
+# Subcontractor of vf_dvi_parse.
+sub vf_dvi_move1
+{
+ my ($dat, $pos, $stk, $r, $l) = @_; my ($t, $pe, @fs);
+ @fs = unpack("Ca$l", substr($dat, $pos));
+ $pos += $l + 1; ($#fs == 1) or return;
+ $stk->[-1]{$r} = $t = unpack_snum($fs[1]);
+ $pe = pl_cook([$vf_dvi_move{$r}, 'R', 0]);
+ pl_set_value($pe, 1, $t);
+ return ($pe, $pos);
+}
+
+## vf_dvi_move0(...)
+# Subcontractor of vf_dvi_parse.
+sub vf_dvi_move0
+{
+ my ($dat, $pos, $stk, $r) = @_; my ($t, $pe);
+ (defined($t = $stk->[-1]{$r})) or return;
+ $pe = pl_cook([$vf_dvi_move{$r}, 'R', 0]);
+ pl_set_value($pe, 1, $t);
+ return ($pe, $pos + 1);
+}
+
+## vf_dvi_special($dat)
+# Subcontractor of vf_dvi_parse.
+sub vf_dvi_special
+{
+ my ($dat) = @_; my ($t, $u, $pl); local ($errmsg);
+ L1:{
+ $t = "($dat)"; ($t !~ m/[^\x20-\x7e]/) or last;
+ (defined($pl = pl_parse_list($t))) or last;
+ (vf_issafe_list($pl)) or last;
+ $u = pl_form_list($pl, -1);
+ return ['SPECIAL', $dat];
+ }
+ return ['SPEICALHEX', uc(unpack('H*', $dat))];
+}
+
+## vf_issafe_list($pl)
+# Subcontractor of vf_dvi_special.
+sub vf_issafe_list
+{
+ my ($pl) = @_; my ($ent);
+ foreach $ent (@$pl) {
+ if (ref $ent) {
+ (vf_issafe_list($ent)) or return 0;
+ } elsif ($ent =~ /^[CKDFOHR]$/ || $ent eq 'COMMENT') {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+## vf_dvi_dumb_parse($dat)
+# Subcontractor of dvi_parse.
+sub vf_dvi_dumb_parse
+{
+ my ($dat) = @_;
+ my ($t);
+ $t = uc(unpack("H*", $dat));
+ return ['MAP', ['DIRECTHEX', $t]];
+}
+
+##<*> vf_form($pl)
+# Inverse of vf_parse.
+sub vf_form
+{
+ my ($pl) = @_;
+ my ($t, $u, $v, $pe, @fs, @chds, @cfds, @ccps);
+ @chds = (247, 202, "", 0, 10 * TU);
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'VTITLE') {
+ ($#$pe <= 1) or return vf_fsynerror("bad argument", $pe);
+ (length($pe->[1]) <= 255)
+ or return vf_fsynerror("VTITLE string too long", $pe->[1]);
+ $chds[2] = $pe->[1];
+ } elsif ($pe->[0] eq 'CHECKSUM') {
+ ($#$pe == 2 && defined($t = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ $chds[3] = $t;
+ } elsif ($pe->[0] eq 'DESIGNSIZE') {
+ ($#$pe == 2 && defined($t = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ $chds[4] = $t;
+ } elsif ($pe->[0] eq 'MAPFONT') {
+ ($#$pe >= 2 && defined($t = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ ($u, $t) = pack_num($t);
+ @fs = ($u + 242, $t, 0, TU, 10 * TU, 0, 0, '', '');
+ foreach $pe (@{$pe}[3 .. $#$pe]) {
+ if (!ref $pe) {
+ return vf_fsynerror("unexpected bareword", $pe);
+ } elsif ($pe->[0] eq 'FONTCHECKSUM') {
+ ($#$pe == 2 && defined($fs[2] = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ } elsif ($pe->[0] eq 'FONTAT') {
+ ($#$pe == 2 && defined($fs[3] = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ } elsif ($pe->[0] eq 'FONTDSIZE') {
+ ($#$pe == 2 && defined($fs[4] = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ } elsif ($pe->[0] eq 'FONTAREA') {
+ ($#$pe == 1 && length($pe->[1]) <= 255)
+ or return vf_fsynerror("bad argument", $pe);
+ $fs[7] = $pe->[1]; $fs[5] = length($pe->[1]);
+ } elsif ($pe->[0] eq 'FONTNAME') {
+ ($#$pe == 1 && length($pe->[1]) <= 255)
+ or return vf_fsynerror("bad argument", $pe);
+ $fs[8] = $pe->[1]; $fs[6] = length($pe->[1]);
+ } elsif (!$vf_strict) {
+ return vf_fsynerror("unknown property", $pe);
+ }
+ }
+ push(@cfds, pack("Ca*NNNCCa*a*", @fs));
+ } elsif ($pe->[0] eq 'CHARACTER') {
+ ($#$pe >= 2 && defined($t = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ $v = 0; $u = undef;
+ foreach $pe (@{$pe}[3 .. $#$pe]) {
+ if (!ref $pe) {
+ return vf_fsynerror("unexpected bareword", $pe);
+ } elsif ($pe->[0] eq 'CHARWD') {
+ ($#$pe == 2 && defined($v = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ } elsif ($pe->[0] eq 'MAP') {
+ (defined($u = vf_dvi_form($pe, $t))) or return;
+ } elsif (!$vf_strict) {
+ return vf_fsynerror("unknown property", $pe);
+ }
+ }
+ if (!defined $u) {
+ $u = pl_cook(['MAP', ['SETCHAR']]);
+ (defined($u = vf_dvi_form($u, $t))) or return;
+ }
+ if (0 <= $t && $t <= 255 && 0 <= $v && $v <= 0xFFFFFF &&
+ length($u) <= 241) { # short form
+ @fs = (length($u), $t, substr(pack('N', $v), 1), $u);
+ push(@ccps, pack("CCa3a*", @fs));
+ } else {
+ @fs = (242, length($u), $t, $v, $u);
+ push(@ccps, pack("CNNNa*", @fs));
+ }
+ } elsif ($vf_strict) {
+ return vf_fsynerror("unknown property", $pe);
+ }
+ }
+ $t = pack("CCC/a*NN", @chds);
+ $t = join('', $t, @cfds, @ccps);
+ $t .= "\xf8" x (4 - length($t) % 4);
+ return $t;
+}
+
+## vf_dvi_form($pl, $cc)
+# Subcontractor of vf_form
+sub vf_dvi_form
+{
+ my ($pl, $cc) = @_;
+ my ($t, $u, $v, $l, $pe, $stk, @cnks);
+ $stk = [{}];
+ foreach $pe (@{$pl}[1 .. $#$pl]) {
+ if ($pe->[0] eq 'SETCHAR') {
+ if ($#$pe == 0) { $t = $cc; }
+ elsif ($#$pe == 2 && defined($t = pl_value($pe, 1))) {
+ } else { return vf_fsynerror("bad argument", $pe); }
+ if (0 <= $t && $t <= 127) {
+ push(@cnks, chr($t));
+ } else {
+ ($l, $t) = pack_num($t);
+ push(@cnks, pack("Ca*", $l + 127, $t));
+ }
+ } elsif ($pe->[0] eq 'SETRULE') {
+ ($#$pe == 4 && defined($t = pl_value($pe, 1)) &&
+ defined($u = pl_value($pe, 3)))
+ or return vf_fsynerror("bad argument", $pe);
+ push(@cnks, pack("CNN", 132, $t, $u));
+ } elsif ($pe->[0] eq 'PUSH') {
+ push(@$stk, {}); push(@cnks, chr(141));
+ } elsif ($pe->[0] eq 'POP') {
+ pop(@$stk); (@$stk) or vf_fsynerror("cannot POP (char $cc)");
+ push(@cnks, chr(142));
+ } elsif ($pe->[0] eq 'MOVERIGHT') {
+ (defined($t = vf_dvi_f_move($pe, $stk->[-1], 'r',+1))) or return;
+ push(@cnks, $t);
+ } elsif ($pe->[0] eq 'MOVELEFT') {
+ (defined($t = vf_dvi_f_move($pe, $stk->[-1], 'r',-1))) or return;
+ push(@cnks, $t);
+ } elsif ($pe->[0] eq 'MOVEDOWN') {
+ (defined($t = vf_dvi_f_move($pe, $stk->[-1], 'd',+1))) or return;
+ push(@cnks, $t);
+ } elsif ($pe->[0] eq 'MOVEUP') {
+ (defined($t = vf_dvi_f_move($pe, $stk->[-1], 'd',-1))) or return;
+ push(@cnks, $t);
+ } elsif ($pe->[0] eq 'SELECTFONT') {
+ ($#$pe == 2 && defined($t = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ if (0 <= $t && $t <= 63) {
+ push(@cnks, chr($t + 171));
+ } else {
+ ($l, $t) = pack_num($t);
+ push(@cnks, pack("Ca*", $l + 234, $t));
+ }
+ } elsif ($pe->[0] eq 'SPECIAL') {
+ $t = pl_form_list($pe, -1);
+ ($t =~ m|^\(SPECIAL\s?(.*)\)$|) or return fatal("vf_dvi_form");
+ $u = $1; ($l, $t) = pack_num(length($u));
+ push(@cnks, pack("Ca*a*", 238 + $l, $t, $u));
+ } elsif ($pe->[0] eq 'SPECIALHEX') {
+ ($u = join('', @{$pe}[1 .. $#$pl])) =~ s/\s+//g;
+ ($u =~ m/^([0-9A-Fa-f]{2})+$/)
+ or return vf_fsynerror("bad arguments", $pe);
+ $u = pack("H*", $u); ($l, $t) = pack_num(length($u));
+ push(@cnks, pack("Ca*a*", 238 + $l, $t, $u));
+ } elsif ($pe->[0] eq 'DIR') {
+ ($#$pe == 2 && defined($t = pl_value($pe, 1)) && $t <= 1)
+ or return vf_fsynerror("bad argument", $pe);
+ push(@cnks, pack("CC", 255, $t));
+ } elsif ($pe->[0] eq 'DIRECTHEX') {
+ ($u = join('', @{$pe}[1 .. $#$pl])) =~ s/\s+//g;
+ ($u =~ m/^([0-9A-Fa-f]{2})+$/)
+ or return vf_fsynerror("bad arguments", $pe);
+ $u = pack("H*", $u); push(@cnks, $u);
+ } else {
+ return vf_fsynerror("unknown DVI operator: ", $pe);
+ }
+ }
+ return join('', @cnks);
+}
+
+## vf_dvi_f_move($pe, $stk, $r, $sgn)
+# Subcontractor of vf_dvi_form.
+sub vf_dvi_f_move
+{
+ my ($pe, $stk, $r, $sgn) = @_; my ($v, $l, $t, $w, $x, $b);
+ ($#$pe == 2 && defined($v = pl_value($pe, 1)))
+ or return vf_fsynerror("bad argument", $pe);
+ if ($sgn < 0) { $v = -$v; }
+ ($l, $t) = pack_snum($v);
+ ($w, $x, $b) = ($r eq 'r') ? ('w', 'x', 142) : ('y', 'z', 156);
+ if ($vf_simple_move_code) { $t = pack("Ca*", $b + $l, $t); }
+ elsif (!exists $stk->{$w}) {
+ $stk->{$w} = $v; $t = pack("Ca*", $b + $l + 5, $t);
+ } elsif ($stk->{$w} == $v) { $t = chr($b + 5); }
+ elsif (!exists $stk->{$x}) {
+ $stk->{$x} = $v; $t = pack("Ca*", $b + $l + 10, $t);
+ } elsif ($stk->{$x} == $v) { $t = chr($b + 10); }
+ else { $t = pack("Ca*", $b + $l, $t); }
+ return $t;
+}
+
+## vf_fsynerror($msg)
+# Error messages in vf_form.
+sub vf_fsynerror
+{
+ my ($msg, $pl) = @_;
+ if (ref $pl) { $pl = pl_form_list($pl, -1); }
+ return error("VPL syntax error: $msg: $pl");
+}
+
+##<*> vf_for_mapping($map, $fn, $rmt)
+#
+sub vf_for_mapping
+{
+ my ($map, $fn, $rmt) = @_; my ($e, $pe, $pe2, $pl, %hrmt);
+ if (defined $rmt) {
+ foreach (@$rmt) { $hrmt{$_->[0]} = $_; }
+ }
+ (defined($map = arraymap($map))) or return;
+ $pl = pl_header_vpl({});
+ push(@$pl, pl_cook(['MAPFONT', 'D', 0, ['FONTNAME', $fn]]));
+ foreach $e (@$map) {
+ if (defined $rmt && !defined $hrmt{$e->[0]}) { next; }
+ $pe = pl_cook(['CHARACTER', 'C', 0,
+ ['MAP', ['SETCHAR', 'C', 0]]]);
+ pl_set_value($pe, 1, $e->[0]);
+ pl_set_value($pe->[3][1], 1, $e->[1]);
+ if (defined $rmt) {
+ $pe2 = pl_cook(['CHARWD', 'R', 0]);
+ pl_set_real($pe2, 1, $hrmt{$e->[0]}[1]);
+ splice(@$pe, 3, 0, $pe2);
+ }
+ push(@$pl, $pe);
+ }
+ return $pl;
+}
+
+##<*> vf_mapfont($pl, $fn)
+# Returns the FONTNAME value of MAPFONT id $fn in VPL $pl.
+# If $fn is undef then it returns ref to the hash that maps
+# id to fontmame.
+sub vf_mapfont
+{
+ my ($pl, $fn) = @_; my ($t, $pe, $pe2, %hsh);
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'MAPFONT') {
+ ($pe2) = grep { $_->[0] eq 'FONTNAME' } (@{$pe}[3 .. $#$pe]);
+ (defined $pe2) or next;
+ if (!defined $fn) {
+ $hsh{pl_value($pe, 1)} = $pe2->[1];
+ } elsif (defined($t = pl_value($pe, 1)) && $t == $fn) {
+ return $pe2->[1];
+ }
+ }
+ }
+ return (defined $fn) ? () : \%hsh;
+}
+
+##<*> vf_set_mapfont($pl, $fn, $fnam)
+# Sets the FONTNAME value of MAPFONT id $fn to $fname
+# in VPL $pl.
+sub vf_set_mapfont
+{
+ my ($pl, $fn, $fnam) = @_; my ($t, $pe, $pe2, %hsh);
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'MAPFONT' &&
+ defined($t = pl_value($pe, 1)) && $t == $fn) {
+ ($pe2) = grep { $_->[0] eq 'FONTNAME' } (@{$pe}[3 .. $#$pe]);
+ (defined $pe2) or return 0;
+ $pe2->[1] = $fnam; return 1;
+ }
+ }
+ return 0;
+}
+
+##-------- Procedures on ZVP format
+
+my %vf_zvp_category = (
+# 1: to JPL, 2: to ZVP0, 3: both, 0: special
+ DIRECTION => 1,
+ VTITLE => 2,
+ FAMILY => 1,
+ FACE => 1,
+ HEADER => 1,
+ CODINGSCHEME => 1,
+ DESIGNUNITS => 1,
+ DESIGNSIZE => 3,
+ CHECKSUM => 3,
+ SEVENBITSAFEFLAG => 1,
+ FONTDIMEN => 1,
+ BOUNDARYCHAR => 1,
+ MAPFONT => 2,
+ LIGTABLE => 1,
+ GLUEKERN => 0,
+ CODESPACE => 0,
+ CHARSINTYPE => 0,
+ CHARSINSUBTYPE => 0,
+ TYPE => 0,
+ SUBTYPE => 0,
+ CHARACTER => 0,
+);
+my %vf_zvp_category_char = (
+ CHARWD => 0,
+ CHARHT => 2,
+ CHARDP => 3,
+ CHARIC => 4,
+);
+
+##<*> debug_vf_form($val)
+our ($debug_vf_form);
+sub debug_vf_form { $debug_vf_form = $_[0]; }
+
+##<*> vf_form_ex($pl)
+# Converts ZPL $pl to VF $vf and TFM $tfm and returns pair
+# ($vf, $tfm).
+sub vf_form_ex
+{
+ my ($pl) = @_; my ($plv, $plt, $vf, $tfm);
+ (($plv, $plt) = vf_divide_zvp($pl)) or return;
+ if ($debug_vf_form) {
+ return (pl_form($plv), pl_form($plt));
+ }
+ (defined($vf = vf_form($plv))) or return;
+ (defined($tfm = jfm_form($plt))) or return;
+ return ($vf, $tfm);
+}
+
+
+## vf_divide_zvp($pl)
+# Subcontractor of vf_form_ex. Divides $pl into ZVP0 part
+# $plv and ZPL part $plt and returns ($plv, $plt).
+sub vf_divide_zvp
+{
+ my ($pl) = @_; my ($t, $u, $k, $pe, $pe2, @v);
+ my ($tyd1, $zcat, $rpe, $cspc, @cit, @cist, $glkrn);
+ my (@plv, @plt, @tydsc, @stydsc, %char, %type, %stype);
+ # First I classify each enry in $pl into @plv (ZVP0 part)
+ # and @plt (ZPL part) and extract necessary information
+ # to @cit, @tydsc, etc.
+ # $cspc is charlist describing codespace
+ # $cit[$t] is charlist of type $t
+ # $cist[$t][$u] is charlist of subtype $t $u
+ # $tydsc[$t] is 'description' of type $t
+ # $stydsc[$t][$u] is 'description' of subtype $t $u
+ # $char{$cc} is 'description' of char $cc
+ # Here 'description' is the pair of CHARWD and MAP.
+ # Currenetly CHARWD specified for subtypes and characters
+ # are ignored (values set for corresponding types are
+ # used), thus CHARWD entry of descriptions of subtypes
+ # and chars are unused.
+ foreach $pe (@$pl) {
+ (defined($zcat = $vf_zvp_category{$pe->[0]})) or next;
+ if ($zcat & 2) { push(@plv, $pe); }
+ if ($zcat & 1) { push(@plt, $pe); }
+ if ($zcat == 0) {
+ if ($pe->[0] eq 'GLUEKERN') {
+ $glkrn = $pe;
+ } elsif ($pe->[0] eq 'CODESPACE') {
+ if ($#$pe == 1 && !ref $pe->[1]
+ && $pe->[1] =~ m/^[\w\-]{6,}$/) {
+ $t = uc($pe->[1]);
+ (defined($cspc = jfm_charlist($t)))
+ or return error("unknown charlist name '$t'");
+ } else {
+ $cspc = jfm_grab_charlist($pe, 1);
+ }
+ } elsif ($pe->[0] eq 'CHARSINTYPE') {
+ (defined($t = pl_value($pe ,1))) or return;
+ (0 < $t && $t < 256)
+ or return error("CIT with invalid type number ($t)");
+ $cit[$t] = jfm_grab_charlist($pe, 3);
+ } elsif ($pe->[0] eq 'CHARSINSUBTYPE') {
+ (defined($t = pl_value($pe, 1))) or return;
+ (0 <= $t && $t < 256)
+ or return error("CIST with invalid type number ($t)");
+ (defined($u = pl_value($pe, 3))) or return;
+ (0 < $u && $u < 0x10000)
+ or return error("CIST with invalid subtype number ($u)");
+ $cist[$t][$u] = jfm_grab_charlist($pe, 5);
+ } elsif ($pe->[0] eq 'TYPE') {
+ (defined($t = pl_value($pe, 1))) or return;
+ (0 <= $t && $t < 256)
+ or return error("TYPE with invalid type number ($t)");
+ $tyd1 = $tydsc[$t] = [ ];
+ for ($k = 3; $k <= $#$pe; $k++) {
+ $pe2 = $pe->[$k];
+ if (defined($u = $vf_zvp_category_char{$pe2->[0]})) {
+ $tyd1->[$u] = $pe2;
+ } elsif ($pe2->[0] eq 'MAP') { $tyd1->[1] = $pe2; }
+ }
+ } elsif ($pe->[0] eq 'SUBTYPE') {
+ (defined($t = pl_value($pe, 1))) or return;
+ (0 <= $t && $t < 256)
+ or return error("SUBTYPE with invalid type number ($t)");
+ (defined($u = pl_value($pe, 3))) or return;
+ (0 < $u && $u < 0x10000)
+ or return error("SUBTYPE with invalid subtype number ($u)");
+ $tyd1 = $stydsc[$t][$u] = [ ];
+ for ($k = 5; $k <= $#$pe; $k++) {
+ $pe2 = $pe->[$k];
+ if (defined($u = $vf_zvp_category_char{$pe2->[0]})) {
+ $tyd1->[$u] = $pe2;
+ } elsif ($pe2->[0] eq 'MAP') { $tyd1->[1] = $pe2; }
+ }
+ } elsif ($pe->[0] eq 'CHARACTER') {
+ (defined($t = pl_value($pe ,1))) or return;
+ (0 <= $t && $t <= 0xFFFFFF)
+ or return error("char code out of range ($t)");
+ $tyd1 = $char{$t} = [ ];
+ for ($k = 3; $k <= $#$pe; $k++) {
+ $pe2 = $pe->[$k];
+ # only MAP is significant
+ if ($pe2->[0] eq 'MAP') { $tyd1->[1] = $pe2; }
+ # tyd1->[0] is currently unused
+ }
+ }
+ }
+ }
+ # default codespace is GL94DB
+ (defined $cspc) or $cspc = jfm_charlist('GL94DB');
+ # Next I check consistency about existence of entries
+ # (e.g. CIT 4 should exist iff TYPE 4 exists).
+ (defined $tydsc[0])
+ or return error("no TYPE for type 0");
+ (vf_check_match("TYPE", \@tydsc, "CIT", \@cit, 1, "type"))
+ or return;
+ foreach (0 .. $#tydsc) {
+ (vf_check_match("SUBTYPE", $stydsc[$_], "CIST", $cist[$_],
+ 1, "subtype $_")) or return;
+ }
+ # Next I recompile JFM properties for support of subtypes with different
+ # CHARWD values; then I output the resulted GLUEKERN, CHARSIN... lists,
+ # and TYPE lists.
+ vf_recompile_gluekern($glkrn, \@cit, \@cist, \@tydsc, \@stydsc);
+ if (defined $glkrn) { push(@plt, $glkrn); }
+ foreach $t (0 .. $#cit) {
+ (defined $cit[$t]) or next;
+ local $jfm_forced_prefix = 'X';
+ push(@plt, jfm_form_cit($t, $cit[$t]));
+ }
+ @v = sort { $a <=> $b } (values %vf_zvp_category_char);
+ foreach $t (0 .. $#tydsc) {
+ (defined($tyd1 = $tydsc[$t])) or next;
+ $rpe = pl_cook(['TYPE', 'D', 0]); pl_set_value($rpe, 1, $t);
+ push(@$rpe, grep { defined $_ } (@{$tyd1}[@v]));
+ push(@plt, $rpe); #qq
+ }
+ # Next I make hash %type from charcode to type and %stype
+ # from charcode to subtype, converting from $cspc, @cit,
+ # and @cist. The key set of %type is equal to codespace.
+ # $type{$cc} is type of char $cc (can be 0)
+ # $stype{$cc} is subtype of char $cc (cannot be 0)
+ (vf_assign_type($cspc, \%type, \%stype, 0)) or return;
+ foreach $t (1 .. $#cit) {
+ (vf_assign_type($cit[$t], \%type, \%stype, $t)) or return;
+ }
+ foreach $t (0 .. $#cit) {
+ foreach $u (1 .. $#{$cist[$t]}) {
+ (vf_assign_type($cist[$t][$u], \%type, \%stype, $t, $u))
+ or return;
+ }
+ }
+ # Last I generate the char packet part of ZVP0, using
+ # information gathered so far.
+ $t = vf_generate_char_packet(\@tydsc, \@stydsc,
+ \%char, \%type, \%stype);
+ push(@plv, @$t);
+#print(pl_form(\@plv), ('-') x 60, "\n", pl_form(\@plt));exit;
+ return (\@plv, \@plt);
+}
+
+## vf_generate_char_packet(...)
+# Subcontractor of vf_divide_zvp. Generates the char packet
+# part of ZVP0.
+sub vf_generate_char_packet
+{
+ my ($tydsc, $stydsc, $char, $type, $stype) = @_;
+ my ($t, $pe, $ty, $cc, @ccs, @pl);
+ @ccs = sort { $a <=> $b } (keys %$type);
+ foreach $cc (@ccs) {
+ $pe = pl_cook(['CHARACTER', 'C', 0]);
+ pl_set_value($pe, 1, $cc);
+ $ty = $type->{$cc};
+ push(@$pe, $tydsc->[$ty][0]); # CHARWD entry
+ # add MAP entry
+ if (defined($t = $char->{$cc})) {
+ push(@$pe, $t->[1]);
+ } elsif (defined($t = $stype->{$cc})) {
+ push(@$pe, $stydsc->[$ty][$t][1]);
+ } else {
+ push(@$pe, $tydsc->[$ty][1]);
+ }
+ push(@pl, $pe);
+ }
+ return \@pl;
+}
+
+sub vf_recompile_gluekern
+{
+ my ($glkrn, $cit, $cist, $tydsc, $stydsc) = @_;
+ my ($t, $u, $tyd0, $tyd, $ty, $nty, $sty, $nsty);
+ my (@tyrel, @tygrp, $orgnty, @glkrn1);
+ $orgnty = $#$tydsc;
+ # type migration
+ for ($ty = 0; $ty <= $#$tydsc; $ty++) {
+ (defined $tydsc->[$ty]) or next;
+ undef $nty; $tyd0 = $tydsc->[$ty];
+ foreach $sty (1 .. $#{$stydsc->[$ty]}) {
+ (defined $stydsc->[$ty][$sty]) or next;
+ $tyd = $stydsc->[$ty][$sty];
+ (defined $tyd->[1]) or $tyd->[1] = pl_clone($tyd0->[1]);
+ if (vf_resolve_metric($tyd0, $tyd)) { next; }
+ if (defined $nty) {
+ $nsty = ($#{$stydsc->[$nty]} + 1 || 1);
+ $stydsc->[$nty][$nsty] = $stydsc->[$ty][$sty];
+#print("move $ty/$sty to $nty/$nsty\n");
+#print("CIT/$nty ", dumpp($cit->[$nty]), " -> ");
+ vf_clist_add($cit->[$nty], $cist->[$ty][$sty]);
+ $cist->[$nty][$nsty] = $cist->[$ty][$sty];
+#print(dumpp($cit->[$nty]), "\n");
+ } else {
+ $nty = $#$tydsc + 1; $tyrel[$ty] = $nty;
+ $tydsc->[$nty] = $stydsc->[$ty][$sty];
+#print("move $ty/$sty to $nty\n");
+ $cit->[$nty] = $cist->[$ty][$sty];
+ }
+#print("CIT/$ty ", dumpp($cit->[$ty]), " -> ");
+ vf_clist_remove($cit->[$ty], $cist->[$ty][$sty]);
+#print(dumpp($cit->[$ty]), "\n");
+ undef $stydsc->[$ty][$sty]; undef $cist->[$ty][$sty];
+ }
+ }
+ # compile @tygrp from @tyrel
+ foreach $ty (0 .. $orgnty) {
+ $tygrp[$ty] = $u = [$ty]; $t = $ty;
+ while (defined $tyrel[$t]) { $t = $tyrel[$t]; push(@$u, $t); }
+ }
+ # create new GLUEKERN list
+ foreach $u (@$glkrn) {
+ if (ref $u &&
+ ($u->[0] eq 'KRN' || $u->[0] eq 'GLUE' || $u->[0] eq 'LABEL')) {
+ foreach $ty (@{$tygrp[pl_value($u, 1)]}) {
+ $t = pl_sclone($u); pl_set_value($t, 1, $ty);
+ push(@glkrn1, $t);
+ }
+ } else { push(@glkrn1, $u); }
+ }
+ @$glkrn = @glkrn1;
+}
+## vf_clise_remove(...)
+# Subcontractor of vf_recompile_gluekern.
+sub vf_clist_remove {
+ my ($lst1, $lst2) = @_; my (%hs);
+ vf_clist_check(\%hs, $lst1, 1); vf_clist_check(\%hs, $lst2);
+ @$lst1 = sort { $a <=> $b } (keys %hs);
+}
+
+## vf_clise_add(...)
+# Subcontractor of vf_recompile_gluekern.
+sub vf_clist_add {
+ my ($lst1, $lst2) = @_; my (%hs);
+ vf_clist_check(\%hs, $lst1, 1); vf_clist_check(\%hs, $lst2, 1);
+ @$lst1 = sort { $a <=> $b } (keys %hs);
+}
+
+## vf_clist_check(...)
+# Subcontractor of vf_recompile_gluekern.
+sub vf_clist_check {
+ my ($hs, $clst, $val) = @_; my ($e, $sc, $ec);
+ foreach $e (@$clst) {
+ ($sc, $ec) = (ref $e) ? @$e : ($e, $e);
+ foreach ($sc .. $ec) {
+ if (defined $val) { $hs->{$_} = $val; } else { delete $hs->{$_}; }
+ }
+ }
+}
+
+## vf_resolve_metric(...)
+# Subcontractor of vf_recompile_gluekern.
+sub vf_resolve_metric {
+ my ($tyd1, $tyd2) = @_; my ($wd1, $nam, $idx, $same);
+ $same = 1;
+ foreach $nam (keys %vf_zvp_category_char) {
+ $idx = $vf_zvp_category_char{$nam};
+ $wd1 = (defined $tyd1->[$idx]) ? pl_value($tyd1->[$idx], 1) : 0;
+ if (defined $tyd2->[$idx]) {
+ if ($wd1 != pl_value($tyd2->[$idx], 1)) { undef $same; }
+ } else {
+ $tyd2->[$idx] = pl_cook([$nam, 'R', 0]);
+ pl_set_value($tyd2->[$idx], 1, $wd1);
+ }
+ }
+ return $same;
+}
+
+## vf_assign_type($cl, $type, $stype, $ty, $sty)
+# Subcontractor of vf_divide_zvp. If $sty is defined, it maps
+# chars in $cl to $sty in hash $stype->[$ty]; otherwise it maps
+# chars in$cl to $ty in hash $type.
+sub vf_assign_type
+{
+ my ($cl, $type, $stype, $ty, $sty) = @_;
+ my ($t, $c, $s, $e);
+ foreach $c (@$cl) {
+ ($s, $e) = (ref $c) ? @$c : ($c, $c);
+ foreach ($s .. $e) {
+ if (defined $sty) { # set subtype
+ ($type->{$_} == $ty) or return error(
+ sprintf("inconsistent subtype assignment to char %04X" .
+ " (subtype %s %s vs type %s)",
+ $_, $ty, $sty, $type->{$_}));
+ (!defined $stype->{$_}) or return error(
+ sprintf("subtype reassignment to char %04X" .
+ " (subtype %s vs %s)",
+ $_, $sty, $stype->{$_}));
+ $stype->{$_} = $sty;
+ } elsif ($ty != 0) { # set type >0
+ (defined $type->{$_}) or return error(
+ sprintf("type assignment (%s) to char out of codespace:" .
+ "char %04X",
+ $ty, $_));
+ ($type->{$_} == 0) or return error(
+ sprintf("type reassignment to char %04X" .
+ " (type %s vs %s)",
+ $_, $ty, $type->{$_}));
+ $type->{$_} = $ty;
+ } else { # set type 0
+ $type->{$_} = $ty;
+ }
+ }
+ }
+ return 1;
+}
+
+## vf_check_match($lbla, $lsta, $lblb, $lstb, $pos, $srt)
+# Subcontractor of vf_divide_zvp.
+sub vf_check_match
+{
+ my ($lbla, $lsta, $lblb, $lstb, $pos, $srt) = @_; my ($mpos);
+ $mpos = ($#$lsta > $#$lstb) ? $#$lsta : $#$lstb;
+ foreach ($pos .. $mpos) {
+ if (defined $lsta->[$_] && !defined $lstb->[$_]) {
+ return error("$lbla entry without matching $lblb ($srt $_)");
+ } elsif (defined $lstb->[$_] && !defined $lsta->[$_]) {
+ return error("$lblb entry without matching $lbla ($srt $_)");
+ }
+ }
+ return 1;
+}
+
+
+##<*> vf_parse_ex($vf, $jfm)
+sub vf_parse_ex
+{
+ my ($vf, $jfm) = @_; my ($plv, $plt, $cit, $typ);
+ my ($pl, $tydsc, $chdsc, $cspc, $cist, $stydsc, $chdsc);
+ $plv = vf_parse($vf) or return;
+ ($plt, $cit, $typ) = jfm_half_parse($jfm) or return;
+ ($pl, $tydsc, $chdsc) = vf_restructure($plv, $plt) or return;
+ ($cspc, $cist, $stydsc, $chdsc) =
+ vf_analyze_dimap($chdsc, $tydsc, $typ, $cit) or return;
+ $pl = vf_compose_zvp($pl, $cspc, $cist, $stydsc, $chdsc);
+ return $pl;
+}
+
+sub vf_restructure
+{
+ my ($plv, $plt) = @_; my ($t, $u, $pe, $zcat, %chk);
+ my (@pl, @tydsc, %chdsc);
+ # ZPL
+ foreach $pe (@$plt) {
+ $zcat = $vf_zvp_category{$pe->[0]};
+ if ($zcat == 1) {
+ push(@pl, $pe);
+ } elsif ($zcat == 3) {
+ push(@pl, $pe); $chk{$pe->[0]} = pl_value($pe, 1);
+ } elsif ($zcat == 0) {
+ if ($pe->[0] eq 'CHARSINTYPE' || $pe->[0] eq 'GLUEKERN') {
+ push(@pl, $pe);
+ } elsif ($pe->[0] eq 'TYPE') {
+ push(@pl, $pe); $t = pl_value($pe, 1);
+ $u = pl_cook(['MAP']); push(@$pe, $u);
+ $tydsc[$t] = [$pe->[3], $u];
+ }
+ } elsif (!defined $zcat) {
+ return fatal("vf_restructure");
+ }
+ }
+ # ZVP0
+ foreach $pe (@$plv) {
+ $zcat = $vf_zvp_category{$pe->[0]};
+ if ($zcat == 2) {
+ push(@pl, $pe);
+ } elsif ($zcat == 3 && $vf_strict) {
+ $t = pl_value($pe, 1); $u = $chk{$pe->[0]};
+ ($t == $u ||
+ ($pe->[0] eq 'CHECKSUM' && ($t == 0 || $u == 0)))
+ or return error("inconsistent value: ", $pe->[0]);
+ } elsif ($zcat == 0) {
+ if ($pe->[0] eq 'CHARACTER') {
+ $t = pl_value($pe, 1);
+ $chdsc{$t} = [$pe->[3], $pe->[4]];
+ }
+ } elsif (!defined $zcat) {
+ return fatal("vf_restructure");
+ }
+ }
+ return (\@pl, \@tydsc, \%chdsc);
+}
+
+## vf_analyze_dimap
+sub vf_analyze_dimap
+{
+ my ($chdsc, $tydsc, $typ, $citpe) = @_;
+ my ($t, $u, $k, $cc, @ccs, $pe, @fs, $ty, $chd, @dmaps, %cnt);
+ my ($cspc, @cit, @cist, @stydsc, %chdsc2);
+ #@dmaps = ({}) x scalar(@$tydsc);
+ # coderange consistency
+ @fs = sort { $a <=> $b } (keys %$typ);
+ foreach $cc (@fs) {
+ (defined $chdsc->{$cc}) or return error(
+ sprintf("charpacket missing in VF: code %04X", $cc));
+ }
+ #
+ @ccs = sort { $a <=> $b } (keys %$chdsc);
+ foreach $cc (@ccs) {
+ $ty = $typ->{$cc}; $chd = $chdsc->{$cc};
+ push(@{$cit[$ty]}, $cc);
+ if ($vf_strict) {
+ (pl_value($tydsc->[$ty][0], 1) == pl_value($chd->[0], 1))
+ or return error(
+ sprintf("CHARWD value mismatch: code %04X", $cc));
+ }
+ $pe = vf_contract_selfcode($chd->[1], $cc);
+ $t = pl_form_list($pe, -1);
+ push(@{$dmaps[$ty]{$t}}, $cc);
+ }
+ #
+ if (defined($t = jfm_charlist_name(\@ccs))) {
+ $cspc = [ $t ];
+ } else { $cspc = jfm_form_charlist(\@ccs); }
+ foreach $ty (0 .. $#dmaps) {
+ (defined($u = $dmaps[$ty])) or next;
+ foreach (keys %$u) { $cnt{$_} = scalar(@{$u->{$_}}); }
+ @fs = sort {
+ $cnt{$b} <=> $cnt{$a} || $u->{$a}[0] <=> $u->{$b}[0]
+ } (keys %$u);
+ foreach $k (0 .. $#fs) {
+ $u = $dmaps[$ty]{$fs[$k]};
+ if ($k == 0 || ($cnt{$fs[$k]} > 1 && $k < 256)) {
+ $cist[$ty][$k] = jfm_form_charlist($u);
+ $stydsc[$ty][$k][1] =
+ vf_contract_selfcode($chdsc->{$u->[0]}[1], $u->[0]);
+ } else {
+ foreach (@$u) {
+ $chdsc2{$_}[1] = $chdsc->{$_}[1];
+ }
+ }
+ }
+ @{$tydsc->[$ty][1]} = @{$stydsc[$ty][0][1]};
+ undef $cist[$ty][0]; undef $stydsc[$ty][0];
+ if ($ty > 0) {
+ $t = jfm_form_charlist($cit[$ty]);
+ push(@{$citpe->[$ty]}, @$t);
+ }
+ }
+ return ($cspc, \@cist, \@stydsc, \%chdsc2);
+}
+
+sub vf_compose_zvp
+{
+ my ($pl, $cspc, $cist, $stydsc, $chdsc) = @_;
+ my ($t, $u, $ty, $sty, $cc, $pe);
+ $pe = pl_cook(['CODESPACE']); push(@$pl, $pe);
+ push(@$pe, @$cspc);
+ foreach $ty (0 .. $#$stydsc) {
+ foreach $sty (0 .. $#{$stydsc->[$ty]}) {
+ if (defined($t = $cist->[$ty][$sty])) {
+ $pe = pl_cook(['CHARSINSUBTYPE', 'D', 0, 'D', 0]);
+ pl_set_value($pe, 1, $ty); pl_set_value($pe, 3, $sty);
+ push(@$pe, @$t); push(@$pl, $pe);
+ }
+ if (defined($t = $stydsc->[$ty][$sty])) {
+ $pe = pl_cook(['SUBTYPE', 'D', 0, 'D', 0]);
+ pl_set_value($pe, 1, $ty); pl_set_value($pe, 3, $sty);
+ push(@$pe, $t->[1]); push(@$pl, $pe);
+ }
+ }
+ }
+ foreach $cc (keys %$chdsc) {
+ $pe = pl_cook(['CHARACTER', 'C', 0]);
+ pl_set_value($pe, 1, $cc);
+ push(@$pe, $chdsc->{$cc}[1]); push(@$pl, $pe);
+ }
+ pl_rearrange($pl);
+ return $pl;
+}
+
+## vf_contract_selfcode
+sub vf_contract_selfcode
+{
+ my ($pl, $cc) = @_; my ($k, $pe, $pl2);
+ $pl2 = pl_sclone($pl);
+ foreach $k (1 .. $#$pl2) {
+ $pe = $pl2->[$k];
+ if ($pe->[0] eq 'SETCHAR' &&
+ $#$pe > 0 && pl_value($pe, 1) == $cc) {
+ $pl2->[$k] = pl_cook(['SETCHAR']);
+ }
+ }
+ return $pl2;
+}
+
+##<*> vf_expand_named_charlist
+#
+sub vf_expand_named_charlist {
+ my ($pl) = @_; my ($t);
+ ($pl->[0] eq 'CODESPACE') or return;
+ (defined($t = jfm_charlist($pl->[1]))) or return;
+ $t = jfm_form_charlist($t, 0);
+ splice(@$pl, 1, 1, @$t);
+}
+
+
+######## 'jfm' section ########
+
+# jfm_form (ZPL -> JFM)
+# Jx --[jc(x)=Ic(i)]-> i (!uptex?)--> Ji --[ppltotf]--> (JFM)
+# Ux --[uc(x)=Ic(i)]-> (uptex?)---> Ui --[uppltotf]->
+# Xx --[x=i]--------->
+# K $ --[Ee($)=Ic(i)]->
+# jfm_parse (JFM -> ZPL)
+# (JFM) (!uptex?)--[ptftopl]-> $ --[je($)=Ic(x)]-> Jx/Ux/Xx
+# (uptex?)--[uptftopl]-> $ --[ue($)=Ic(x)]->
+
+# for jfm_injcode
+my %jfm_pfx_ijc = ( J => KI_JIS, U => KI_UNI, X => undef );
+my %jfm_ijc_pfx = ( reverse %jfm_pfx_ijc );
+
+##<*> jfm_use_uptex_tool($sw)
+# Decides if upTeX tools are used to do jfm_parse. Here truth
+# value of $sw means upTeX-pltotf should/shouldn't be used.
+our $jfm_use_uptex_tool = 0;
+sub jfm_use_uptex_tool
+{
+ my ($sw) = @_; my ($t);
+ $t = ($cmd_name{uptftopl} eq '' || $cmd_name{uppltotf} eq '');
+ if ($sw && $t) { return error("upTeX tools disabled"); }
+ $jfm_use_uptex_tool = $sw;
+ return 1;
+}
+
+##<*> jfm_parse($jfm)
+# Converts JFM data $jfm to a pl-struct describing ZPL.
+sub jfm_parse
+{
+ my ($jfm) = @_; my ($pl, $cit, $typ);
+ ($pl, $cit, $typ) = jfm_half_parse($jfm) or return;
+ return jfm_record_cit($pl, $cit, $typ);
+}
+
+## jfm_half_parse($jfm)
+# Converts JFM data $jfm to a 'half-parsed' form.
+sub jfm_half_parse
+{
+ my ($jfm) = @_; my ($cmd, $pl, $map, $cit, $typ);
+ if ($jfm_use_uptex_tool) {
+ $pl = x_uptftopl($jfm) or return;
+ jfm_interprocess($pl) or return;
+ return jfm_grab_cit($pl, 'utf8', 'unicode');
+ } else {
+ $cmd = $cmd_name{tftopl} . ' -kanji=jis';
+ (($jfm, $map) = jfm_parse_preprocess($jfm)) or return;
+ $pl = x_tftopl($jfm, $cmd) or return;
+ jfm_interprocess($pl) or return;
+ return jfm_parse_postprocess($pl, $map);
+ }
+}
+
+##<*> jfm_form($pl)
+# Converts a pl-struct $pl describing a JPLZ to JFM data.
+sub jfm_form
+{
+ my ($pl) = @_; my ($cmd, $map, $jfm);
+ if ($jfm_use_uptex_tool) {
+ local $jfm_forced_prefix = 'U';
+ (defined($pl = jfm_normalize($pl))) or return;
+ return x_pltotf($pl, $cmd_name{uppltotf});
+ } else {
+ $cmd = $cmd_name{pltotf} . ' -kanji=jis';
+ ((($pl, $map) = jfm_form_preprocess($pl))) or return;
+ $jfm = x_pltotf($pl, $cmd) or return;
+ return jfm_form_postprocess($jfm, $map);
+ }
+}
+
+## jfm_grab_cit($pl)
+sub jfm_grab_cit
+{
+ my ($pl, $xjc, $ijc) = @_; my ($t, $cl, $ty, $pe);
+ my (@pl2, %typ, @cit, @ccs);
+ local ($jcode_ex) =
+ (defined $xjc) ? $jcode_ex_sym{$xjc} : $jcode_ex;
+ local ($jcode_in) =
+ (defined $ijc) ? $jcode_in_sym{$ijc} : $jcode_in;
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'CHARSINTYPE') {
+ pl_cook_list($pe);
+ (defined($ty = pl_value($pe, 1))) or return;
+ $cl = jfm_grab_charlist($pe, 3) or return;
+ foreach $t (@$cl) {
+ if (ref $t) {
+ foreach ($t->[0] .. $t->[1]) { $typ{$_} = $ty; }
+ } else { $typ{$t} = $ty; }
+ }
+ $cit[$ty] = $t = pl_cook(['CHARSINTYPE', 'D', 0]);
+ pl_set_value($t, 1, $ty); push(@pl2, $t);
+ } else { push(@pl2, $pe); }
+ }
+ return (\@pl2, \@cit, \%typ);
+}
+
+## jfm_normalize($pl, $xjc, $ijc)
+# Normalizes pl-struct $pl, i.e., converts ZPL to ordinary PL.
+# Here $xjc and $ijc mean source and internal kanji codes that
+# are effective in this process (unchanged if undef).
+sub jfm_normalize
+{
+ my ($pl, $xjc, $ijc) = @_; my ($citpe, $typ);
+ (($pl, $citpe, $typ) = jfm_grab_cit($pl, $xjc, $ijc)) or return;
+ (defined($pl = jfm_record_cit($pl, $citpe, $typ))) or return;
+ return $pl;
+}
+
+## jfm_record_cit($pl, $citpe, $typ)
+# Assembles a half-parsed form to get a complete ZPL.
+sub jfm_record_cit
+{
+ my ($pl, $citpe, $typ) = @_; my ($t, $u, $cc, @ccs, @cit);
+ @ccs = sort { $a <=> $b } (keys %$typ);
+ foreach $cc (@ccs) {
+ push(@{$cit[$typ->{$cc}]}, $cc);
+ }
+ foreach $t (1 .. $#cit) {
+ (defined $cit[$t]) or next;
+ $u = jfm_form_charlist($cit[$t]);
+ push(@{$citpe->[$t]}, @$u);
+ }
+ return $pl;
+}
+
+## jfm_form_preprocess
+# Subcontactor of jfm_form.
+sub jfm_form_preprocess
+{
+ my ($pl) = @_; my ($pl2, $cit, $typ, $jc, $cc, @ccs, %map);
+ ((($pl2, $cit, $typ) = jfm_grab_cit($pl))) or return;
+ @ccs = sort { $a <=> $b } (keys %$typ);
+ $jc = 0x2121;
+ foreach $cc (@ccs) {
+ push(@{$cit->[$typ->{$cc}]}, sprintf("J%04X", $jc));
+ $map{$jc} = $cc; $jc = jfm_nextcode($jc) or return;
+ }
+ return ($pl2, \%map);
+}
+ # Valid codespace in pltotf: [21-28|30-74][21-7F] (7238 chars)
+
+## jfm_form_postprocess
+# Subcontactor of jfm_form.
+sub jfm_form_postprocess
+{
+ my ($jfm, $map) = @_; my ($k, $pct, $lct, $ct, @fs);
+ @fs = unpack('nnnn', $jfm);
+ ($#fs == 3 && $fs[2] * 4 == length($jfm) &&
+ ($fs[0] == 9 || $fs[0] == 11)) or return;
+ $pct = $fs[3] * 4 + 28; $lct = $fs[1] * 4;
+ $ct = substr($jfm, $pct, $lct); @fs = unpack('n*', $ct);
+ for ($k = 2; $k <= $#fs; $k += 2) {
+ my $cc = $map->{$fs[$k]};
+ $fs[$k] = ($cc & 0xFFFF); $fs[$k+1] |= ($cc >> 16 << 8);
+ }
+ $ct = pack('n*', @fs);
+ return substr($jfm, 0, $pct) . $ct . substr($jfm, $pct + $lct);
+}
+
+## jfm_parse_preprocess
+# Subcontactor of jfm_half_parse.
+sub jfm_parse_preprocess
+{
+ my ($jfm) = @_; my ($k, $pct, $lct, $ct, @fs, $jc, %map);
+ @fs = unpack('nnnn', $jfm);
+ ($#fs == 3 && $fs[2] * 4 == length($jfm) &&
+ ($fs[0] == 9 || $fs[0] == 11)) or return;
+ $pct = $fs[3] * 4 + 28; $lct = $fs[1] * 4;
+ $ct = substr($jfm, $pct, $lct); @fs = unpack('n*', $ct);
+ for ($jc = 0x2121, $k = 2; $k <= $#fs; $k += 2) {
+ $map{$jc} = ($fs[$k] | $fs[$k+1] >> 8 << 16);
+ $fs[$k] = $jc; $fs[$k+1] &= 0xFF;
+ $jc = jfm_nextcode($jc) or return;
+ }
+ $ct = pack('n*', @fs);
+ $jfm = substr($jfm, 0, $pct) . $ct . substr($jfm, $pct + $lct);
+ return ($jfm, \%map);
+}
+
+## jfm_parse_postprocess
+# Subcontactor of jfm_half_parse.
+sub jfm_parse_postprocess
+{
+ my ($pl, $map, $pfx) = @_; my ($cit, $typ, %typ2, $cc);
+ ($pl, $cit, $typ) = jfm_grab_cit($pl, 'xjis', 'xjis') or return;
+ foreach $cc (keys %$typ) {
+ $typ2{$map->{$cc}} = $typ->{$cc};
+ }
+ return ($pl, $cit, \%typ2);
+}
+
+## jfm_nextcode($jc)
+# Subcontactor of jfm_form_preprocess and jfm_parse_preprocess.
+sub jfm_nextcode
+{
+ my ($jc) = @_;
+ if ((++$jc & 0xFF) < 0x7F) { return $jc; }
+ if ($jc == 0x747F) {
+ return error("too many chars have non-zero type");
+ } elsif ($jc == 0x287F) { $jc = 0x3021; }
+ else { $jc += 162; }
+ return $jc;
+}
+
+## jfm_injcode($f, $xc)
+# Subcontactor of jfm_form_preprocess.
+sub jfm_injcode
+{
+ my ($pfx, $xc) = @_; local ($jcode_ex);
+ # Note: here encodings meant for 'internal' use are
+ # used as 'external' excoding.
+ (defined($jcode_ex = $jfm_pfx_ijc{$pfx})) or return;
+ if ($jcode_ex eq $jcode_in) { return $xc; }
+ return jcode_ord(chr($xc >> 8) . chr($xc & 0xff));
+}
+
+
+## jfm_interprocess($pl)
+sub jfm_interprocess
+{
+ my ($pl) = @_; my ($pe, $pe2, $ok);
+ foreach $pe (@$pl) {
+ if ($pe->[0] eq 'TYPE') {
+ $ok = 1; pl_set_numtype($pe, 1, 'D') or return;
+ } elsif ($pe->[0] eq 'CHARSINTYPE') {
+ $ok = 1; pl_set_numtype($pe, 1, 'D') or return;
+ } elsif ($pe->[0] eq 'GLUEKERN') {
+ foreach $pe2 (@$pe) {
+ (ref $pe2) or next;
+ ($pe2->[0] eq 'LABEL' ||
+ $pe2->[0] eq 'GLUE' || $pe2->[0] eq 'KRN') or next;
+ pl_set_numtype($pe2, 1, 'D') or return;
+ }
+ }
+ }
+ ($ok) or return error("input TFM is not JFM");
+ return 1;
+}
+
+##-------- Procedures on charlist
+
+# A charlist is an array, each entry of which is either a code
+# value or a array-ref consisting of two values, which means
+# a code range. For example,
+# [ 0x50, [ 0x100, 0x1FF ], 0x234 ]
+# is a charlist consisting of 258 code values.
+
+our %jfm_charlist_registry = (
+ 'UNICODE-BMP' => [ [0x0000, 0xFFFF] ],
+ 'GL94DB' => [ map { [ ($_ << 8) | 0x21, ($_ << 8) | 0x7E ] }
+ (0x21 .. 0x7E) ],
+);
+
+##<*> jfm_use_charlist_name()
+our $jfm_use_charlist_name = 1;
+sub jfm_use_charlist_name { $jfm_use_charlist_name = $_[0]; }
+
+## jfm_charlist($name)
+sub jfm_charlist
+{
+ return $jfm_charlist_registry{$_[0]};
+}
+
+## jfm_charlist_name($cl)
+sub jfm_charlist_name
+{
+ my ($cl) = @_;
+ my ($k, $f1, $f2, $l1, $l2, $cl2, $nam, @nams, $res);
+ (@$cl && $jfm_use_charlist_name) or return;
+ $f1 = (ref $cl->[0]) ? $cl->[0][0] : $cl->[0];
+ @nams = sort { $a cmp $b } (keys %jfm_charlist_registry);
+ L1:foreach $nam (@nams) {
+ $cl2 = $jfm_charlist_registry{$nam};
+ $f2 = (ref $cl2->[0]) ? $cl2->[0][0] : $cl2->[0];
+ ($f1 == $f2) or next;
+ if (!defined $l1) { $l1 = jfm_length_charlist($cl); }
+ $l2 = jfm_length_charlist($cl2);
+ ($l1 == $l2) or next;
+ $cl = jfm_rangify_charlist($cl);
+ ($#$cl == $#$cl2) or next;
+ foreach $k (0 .. $#$cl) {
+ if (ref $cl->[$k] && ref $cl2->[$k]) {
+ ($cl->[$k][0] == $cl2->[$k][0] &&
+ $cl->[$k][1] == $cl2->[$k][1]) or next L1;
+ } elsif (!ref $cl->[$k] && !ref $cl2->[$k]) {
+ ($cl->[$k] == $cl2->[$k]) or next L1;
+ } else { next L1; }
+ }
+ $res = $nam; last L1;
+ }
+ return $res;
+}
+
+sub jfm_length_charlist
+{
+ my ($cl) = @_; my ($s);
+ $s = 0;
+ foreach (@$cl) {
+ if (ref $_) { $s += $_->[1] - $_->[0] + 1; }
+ else { $s += 1; }
+ }
+ return $s;
+}
+
+## for jfm_rangify_charlist()
+our $jfm_rangify_threshold = 8;
+
+## jfm_rangify_charlist($cl)
+sub jfm_rangify_charlist
+{
+ my ($cl) = @_; my ($cc, $scc, $ecc,@cl2);
+ foreach $cc (@$cl, []) {
+ if (defined $scc && !ref $cc && $cc == $ecc + 1) {
+ $ecc = $cc;
+ } else {
+ if (!defined $scc) { # do nothing
+ } elsif ($ecc - $scc < $jfm_rangify_threshold) {
+ push(@cl2, $scc .. $ecc);
+ } else {
+ push(@cl2, [$scc, $ecc]);
+ }
+ if (ref $cc) {
+ push(@cl2, $cc); $scc = $ecc = undef;
+ } else {
+ $scc = $ecc = $cc;
+ }
+ }
+ }
+ pop(@cl2);
+ return \@cl2;
+}
+
+## jfm_form_cit($ty, $cl, $sym)
+sub jfm_form_cit
+{
+ my ($ty, $cl) = @_; my ($t, $pe);
+ $pe = pl_cook(['CHARSINTYPE', 'D', 0]);
+ pl_set_value($pe, 1, $ty);
+ $t = jfm_form_charlist($cl, 0); push(@$pe, @$t);
+ return $pe;
+}
+
+## jfm_form_charlist($cl, $swrng)
+sub jfm_form_charlist
+{
+ my ($cl, $swrng) = @_; my ($cc, $pe, @cl2, $nf, $pfx);
+ $pfx = $jfm_ijc_pfx{$jcode_in};
+ $nf = ($pl_prefer_hex) ? 'H' : 'O';
+ if (defined $jfm_forced_prefix) { $pfx = $jfm_forced_prefix; }
+ (defined $swrng)
+ or $swrng = (!defined $jcode_in && !defined $jfm_forced_prefix);
+ if ($swrng) { $cl = jfm_rangify_charlist($cl); }
+ foreach $cc (@$cl) {
+ if (ref $cc) {
+ $pe = pl_cook(['CTRANGE', $nf, 0, $nf, 0]);
+ pl_set_value($pe, 1, $cc->[0]);
+ pl_set_value($pe, 3, $cc->[1]);
+ push(@cl2, $pe);
+ } else {
+ push(@cl2, sprintf("%s%04X", $pfx, $cc));
+ }
+ }
+ return \@cl2;
+}
+
+## jfm_grab_charlist($pe, $pos)
+sub jfm_grab_charlist
+{
+ my ($pe, $pos) = @_; my ($k, $e, $t, $u, $cc, @cl);
+ for ($k = $pos; $k <= $#$pe; $k++) {
+ $e = $pe->[$k];
+ if (ref $e && $e->[0] eq CNUM) {
+ (defined($cc = pl_value($pe, $k))) or return;
+ push(@cl, $cc); ++$k;
+ } elsif ($e =~ m/^([JUX])([0-9A-Fa-f]{1,6})$/) {
+ if (!defined $jcode_in || $1 eq 'X') {
+ push(@cl, hex($2));
+ } else {
+ (defined($cc = jfm_injcode($1, hex($2)))) or return;
+ push(@cl, $cc);
+ }
+ } elsif ($e =~ m/^[^\x21-\x7e]/) {
+ (defined($cc = jcode_ord($e)))
+ or return error("malformed $cc kanji character: ",
+ unpack('H*', $e));
+ push(@cl, $cc);
+ } elsif (ref $e && $e->[0] eq 'CTRANGE') {
+ (defined($t = pl_value($e, 1)) &&
+ defined($u = pl_value($e, 3))) or return;
+ push(@cl, [$t, $u]);
+ } else {
+ return error("illegal element in CHARSINTYPE: ", $e);
+ }
+ }
+ return \@cl;
+}
+
+#================================================= END
+($jcode_in, $jcode_ex) = (undef, undef);
+get_temp_name_init();
+if (defined $errmsg) { error("initialization failed"); }
+
+#------------------------------------------------- dumb importer
+package main;
+{
+ no strict;
+ foreach (qw(
+ textool_error textool_version
+ read_whole_file write_whole_file
+ pl_parse pl_form pl_prefer_hex
+ jcode_set
+ kpse
+ vf_parse vf_form vf_parse_ex vf_form_ex vf_strict
+ jfm_use_uptex_tool jfm_parse jfm_form
+ )) {
+ *{$_} = *{"ZRTeXtor::".$_};
+ }
+}
+
+#------------------------------------------------- pxutil stuffs
+# Here follows excerpt from pxutil.pl
+#================================================= BEGIN
+use Encode qw(encode decode);
+my $prog_name = 'jfmutil';
+my $version = '1.2.2';
+my $mod_date = '2019/02/09';
+#use Data::Dump 'dump';
+#
+my ($sw_hex, $sw_uptool, $sw_noencout, $inenc, $exenc, $sw_lenient);
+my ($proc_name, $infile, $in2file ,$outfile, $out2file);
+
+#### main procedure
+
+my %procs = (
+ vf2zvp0 => \&main_vf2zvp0,
+ zvp02vf => \&main_zvp02vf,
+ vf2zvp => \&main_vf2zvp,
+ zvp2vf => \&main_zvp2vf,
+ tfm2zpl => \&main_tfm2zpl,
+ zpl2tfm => \&main_zpl2tfm,
+);
+
+sub main {
+ if (defined textool_error()) { error(); }
+ local $_ = shift(@ARGV);
+ if (!defined $_) {
+ show_usage();
+ } elsif (($proc_name) = m/^:?(\w+)$/) {
+ my $proc = $procs{$proc_name};
+ (defined $proc) or error("unknown subcommand name", $proc_name);
+ $proc->();
+ } elsif (m/^-/) {
+ if (m/^--?h(?:elp)?$/) {
+ show_usage();
+ } elsif (m/^-(?:V|-version)$/) {
+ show_version();
+ } else { error("unknown (or invalid usage of) option", $_); }
+ } else { error("invalid argument", $_); }
+}
+
+sub main_vf2zvp0 {
+ my ($t);
+ read_option();
+ $t = read_whole_file(kpse($infile), 1) or error();
+ $t = vf_parse($t) or error();
+ $t = pl_form($t) or error();
+ write_whole_file($outfile, $t) or error();
+}
+
+sub main_zvp02vf {
+ my ($t);
+ read_option();
+ $t = read_whole_file(kpse($infile)) or error();
+ $t = pl_parse($t) or error();
+ $t = vf_form($t) or error();
+ write_whole_file($outfile, $t, 1) or error();
+}
+
+sub main_zvp2vf {
+ my ($t, $u);
+ read_option();
+ if ($sw_uptool) { jfm_use_uptex_tool(1); }
+ $t = read_whole_file(kpse($infile)) or error();
+ $t = pl_parse($t) or error();
+ ($t, $u) = vf_form_ex($t) or error();
+ write_whole_file($outfile, $t, 1) or error();
+ write_whole_file($out2file, $u, 1) or error();
+}
+sub main_vf2zvp {
+ my ($t, $vf, $tfm);
+ read_option();
+ if ($sw_uptool) { jfm_use_uptex_tool(1); }
+ $vf = read_whole_file(kpse($infile), 1) or error();
+ $tfm = read_whole_file(kpse($in2file), 1) or error();
+ $t = vf_parse_ex($vf, $tfm) or error();
+ $t = pl_form($t) or error();
+ write_whole_file($outfile, $t) or error();
+}
+
+sub main_tfm2zpl {
+ my ($t);
+ read_option();
+ if ($sw_uptool) { jfm_use_uptex_tool(1); }
+ $t = read_whole_file(kpse($infile), 1) or error();
+ $t = jfm_parse($t) or error();
+ $t = pl_form($t) or error();
+ write_whole_file($outfile, $t) or error();
+}
+
+
+sub main_zpl2tfm {
+ my ($t);
+ read_option();
+ if ($sw_uptool) { jfm_use_uptex_tool(1); }
+ $t = read_whole_file(kpse($infile)) or error();
+ $t = pl_parse($t) or error();
+ $t = jfm_form($t) or error();
+ write_whole_file($outfile, $t, 1) or error();
+}
+
+sub show_usage {
+ print(usage_message());
+ exit;
+}
+sub show_version {
+ print("$prog_name version $version\n");
+ exit;
+}
+sub usage_message {
+ my ($v, $m);
+ ($v, $m) = textool_version() or error();
+ return <<"EOT1", <<"EOT2";
+This is $prog_name v$version <$mod_date> by 'ZR'.
+[ZRTeXtor library v$v <$m> by 'ZR']
+Usage: $prog_name vf2zvp0 [<options>] <in.vf> [<out.zvp0>]
+ $prog_name zvp02vf [<options>] <in.zvp0> [<out.vf>]
+ $prog_name vf2zvp [<options>] <in.vf> [<in.tfm> <out.zvp>]
+ $prog_name zvp2vf [<options>] <in.zvp> [<out.vf> <out.tfm>]
+ $prog_name zpl2tfm [<options>] <in.zvp0> [<out.vf>]
+ $prog_name tfm2zpl [<options>] <in.zvp0> [<out.vf>]
+Arguments:
+ <in.xxx> input files
+ N.B. Input TFM/VF files are searched by Kpathsea. (ZVP/ZVP9 are not.)
+ <out.xxx> output files
+Options:
+ --hex output charcode in 'H' form [default]
+ -o / --octal output charcode in 'O' form
+ --uptool use upTeX tools (uppltotf etc.)
+ --lenient ignore non-fatal error on VFs
+ The following options affect interpretation of 'K' form.
+ --kanji=ENC set source encoding: ENC=jis/sjis/euc/utf8/none
+ --kanji-internal=ENC set internal encoding: ENC=jis/unicode/none
+ -j / --jis == --kanji=jis --kanji-internal=jis
+ -u / --unicode == --kanji=utf8 --kanji-internal=unicode
+ -E / --no-encoding == --kanji=none --kanji-internal=none
+EOT1
+ -h / --help show this help message and exit
+ -V / --version show version
+EOT2
+}
+
+#### command-line options
+
+sub read_option {
+ my ($opt, $arg);
+ $sw_hex = 1; $sw_uptool = 0;
+ while ($ARGV[0] =~ m/^-/) {
+ $opt = shift(@ARGV);
+ if ($opt =~ m/^--?h(elp)?$/) {
+ show_usage();
+ } elsif ($opt =~ m/^-(?:V|-version)?$/) {
+ show_version();
+ } elsif ($opt eq '--hex') {
+ $sw_hex = 1;
+ } elsif ($opt eq '--octal' || $opt eq '-o') {
+ $sw_hex = 0;
+ } elsif ($opt eq '--uptool') {
+ $sw_uptool = 1;
+ } elsif ($opt eq '--lenient') {
+ $sw_lenient = 1;
+ } elsif ($opt eq '--no-encoding' || $opt eq '-E') {
+ ($exenc, $inenc) = ('none', 'none');
+ } elsif ($opt eq '--jis' || $opt eq '-j') {
+ ($exenc, $inenc) = ('jis', 'jis');
+ } elsif ($opt eq '--unicode' || $opt eq '-u') {
+ ($exenc, $inenc) = ('utf8', 'unicode');
+ } elsif (($arg) = $opt =~ m/^--kanji[=:](.*)$/) {
+ $exenc = $arg;
+ } elsif (($arg) = $opt =~ m/^--kanji-internal[=:](.*)$/) {
+ $inenc = $arg;
+ } else {
+ error("invalid option", $opt);
+ }
+ }
+ jcode_set($exenc)
+ or error("unknown source kanji code: $exenc");
+ jcode_set(undef, $inenc)
+ or error("unknown internal kanji code: $inenc");
+ #if ($inenc eq 'unicode') { $sw_uptool = 1; }
+ if ($sw_hex) { pl_prefer_hex(1); }
+ if ($sw_lenient) { vf_strict(0); }
+ (0 <= $#ARGV && $#ARGV <= 1)
+ or error("wrong number of arguments");
+ if ($proc_name eq 'vf2zvp0') {
+ ($infile, $outfile) = fix_pathname(".vf", ".zvp0");
+ } elsif ($proc_name eq 'zvp02vf') {
+ ($infile, $outfile) = fix_pathname(".zvp0", ".vf");
+ } elsif ($proc_name eq 'vf2zvp') {
+ ($infile, $in2file, $outfile) =
+ fix_pathname(".vf", ".tfm", ".zvp");
+ } elsif ($proc_name eq 'zvp2vf') {
+ ($infile, $outfile, $out2file) =
+ fix_pathname(".zvp", ".vf", ".tfm");
+ } elsif ($proc_name eq 'tfm2zpl') {
+ ($infile, $outfile) = fix_pathname(".tfm", ".zpl");
+ } elsif ($proc_name eq 'zpl2tfm') {
+ ($infile, $outfile) = fix_pathname(".zpl", ".tfm");
+ }
+ ($infile ne $outfile)
+ or error("input and output file have same name", $infile);
+}
+
+sub fix_pathname {
+ my (@ext) = @_; my (@path);
+ @{$path[0]} = split_path($ARGV[0]);
+ (defined $path[0][2]) or $path[0][2] = $ext[0];
+ foreach (1 .. $#ext) {
+ if (defined $ARGV[$_]) {
+ @{$path[$_]} = split_path($ARGV[$_]);
+ (defined $path[$_][2]) or $path[$_][2] = $ext[$_];
+ } else {
+ @{$path[$_]} = (undef, $path[0][1], $ext[$_]);
+ }
+ }
+ return map { join('', @{$path[$_]}) } (0 .. $#_);
+}
+
+sub split_path {
+ my ($pnam) = @_; my ($dnam, $fbas, $ext);
+ ($dnam, $fbas) = ($pnam =~ m|^(.*/)(.*)$|) ? ($1, $2) :
+ (undef, $pnam);
+ ($fbas, $ext) = ($fbas =~ m|^(.+)(\..*)$|) ? ($1, $2) :
+ ($fbas, undef);
+ return ($dnam, $fbas, $ext);
+}
+
+#### user interface
+
+sub show_info {
+ print STDERR (join(": ", $prog_name, @_), "\n");
+}
+
+sub alert {
+ show_info("warning", @_);
+}
+
+sub error {
+ show_info((@_) ? (@_) : textool_error());
+ exit(-1);
+}
+
+#================================================= END
+
+#------------------------------------------------- pxcopyfont interfaces
+
+*usage_message_org = \&usage_message;
+
+*usage_message = sub {
+ local ($_) = usage_message_org();
+ my ($part1, $part2) = (<<"EOT1", <<"EOT2");
+
+* ZVP Conversion
+EOT1
+
+* VF Replication
+Usage: $prog_name vfcopy [<options>] <in.vf> <out.vf> <out_base.tfm>...
+ $prog_name vfinfo [<options>] <in.vf>
+ $prog_name jodel [<options>] <in.vf> <prefix>
+Arguments:
+ <in.vf> input virtual font name
+ N.B. Input TFM/VF files are searched by Kpathsea.
+ <out.vf> output virtual font name
+ <out_base.tfm> names of raw TFMs referred by the output virtual font;
+ each entry replaces a font mapping in the input font in
+ the given order, so the exactly same number of entries
+ must be given as font mappings
+ <prefix> prefix of output font names (only for jodel)
+Options:
+ -z / --zero change first fontmap id in vf to zero
+ --uptex assume input font to be for upTeX (only for jodel)
+ --unicode generate VF for 'direct-unicode' mode imposed by pxufont
+ package; this option is supported only for upTeX fonts and
+ thus implies '--uptex' (only for jodel)
+
+* Common Options
+ -h / --help show this help message and exit
+ -V / --version show version
+EOT2
+ s/(Usage:)/$part1$1/; s/\z/$part2/;
+ return $_;
+};
+
+%procs = (%procs,
+ vfinfo => \&main_vfinfo,
+ vfcopy => \&main_vfcopy,
+ jodel => \&main_jodel,
+);
+
+sub main_vfinfo {
+ PXCopyFont::read_option('vfinfo');
+ PXCopyFont::info_vf();
+}
+
+sub main_vfcopy {
+ PXCopyFont::read_option('vfcopy');
+ PXCopyFont::copy_vf();
+}
+
+sub main_jodel {
+ PXCopyFont::read_option('jodel');
+ PXCopyFont::jodel();
+}
+
+#------------------------------------------------- pxcopyfont stuffs
+package PXCopyFont;
+
+*error = *main::error;
+*read_whole_file = *main::read_whole_file;
+*write_whole_file = *main::write_whole_file;
+
+our ($src_main, $dst_main, @dst_base, $op_zero, $op_uptex, $op_quiet);
+
+sub info {
+ ($op_quiet) or main::show_info(@_);
+}
+
+sub copy_vf {
+ local $_ = read_whole_file(main::kpse("$src_main.vf"), 1) or error();
+ my $vfc = parse_vf($_);
+ my ($nb, $nb1) = (scalar(@{$vfc->[0]}), scalar(@dst_base));
+ info("number of base TFMs in '$src_main'", $nb);
+ if ($dst_base[-1] eq '...' && $nb1 <= $nb) {
+ foreach ($nb1-1 .. $nb-1) { $dst_base[$_] = $vfc->[0][$_][1]; }
+ } elsif ($nb != $nb1) {
+ error("wrong number of base TFMs given", $nb1);
+ }
+ write_whole_file("$dst_main.vf", form_vf($vfc), 1) or error();
+ write_whole_file("$dst_main.tfm",
+ read_whole_file(main::kpse("$src_main.tfm"), 1), 1) or error();
+ foreach my $k (0 .. $#dst_base) {
+ my $sfn = $vfc->[0][$k][1]; my $dfn = $dst_base[$k];
+ ($sfn ne $dfn) or next;
+ write_whole_file("$dfn.tfm",
+ read_whole_file(main::kpse("$sfn.tfm"), 1), 1) or error();
+ }
+}
+
+sub parse_vf {
+ my ($vf) = @_; my (@fs, @lst, $pos);
+ @fs = unpack("CCC", $vf);
+ ($fs[0] == 0xf7 && $fs[1] == 0xca) or return;
+ $pos = $fs[2] + 11; my $hd = substr($vf, 0, $pos);
+ while (1) {
+ @fs = unpack("CC", substr($vf, $pos, 2));
+ (243 <= $fs[0] && $fs[0] <= 246) or last;
+ my $fid = ($fs[0] == 243) ? $fs[1] : 999;
+ my $t = $fs[0] - 242 + 13;
+ @fs = unpack("a${t}CC", substr($vf, $pos, 260));
+ my $l = $fs[1] + $fs[2]; my $n = substr($vf, $pos + $t + 2, $l);
+ $pos += $t + 2 + $l; push(@lst, [ $fs[0], $n, $fid ]);
+ if ($n !~ m/^[\x21-\x7e]+$/) {
+ $n =~ s/([^\x21-\x5b\x5d-\x7e])/sprintf("\\x%02x", ord($1))/g;
+ error("bad tfm name recorded in VF", $n);
+ }
+ }
+ my $ft = substr($vf, $pos); $ft =~ s/\xf8+\z//g;
+ return [ \@lst, $hd, $ft ];
+}
+
+sub info_vf {
+ local $_ = read_whole_file(main::kpse("$src_main.vf"), 1) or error();
+ my $vfc = parse_vf($_);
+ foreach (@{$vfc->[0]}) {
+ printf("%d=%s\n", $_->[2], $_->[1]);
+ }
+}
+
+sub form_vf {
+ my ($vfc) = @_; my (@lst);
+ if ($op_zero) {{
+ my $t = $vfc->[0][0] or last;
+ ($t->[2] == 0) and last; # already zero
+ info("change first fontmap id to zero (from " . $t->[2] . ")");
+ substr($t->[0], 1, 1) = "\0"; $t->[2] = 0;
+ }}
+ foreach my $k (0 .. $#{$vfc->[0]}) {
+ my $t = $vfc->[0][$k]; my $sfn = $t->[1];
+ my $dfn = $dst_base[$k];
+ (length($dfn) < 256) or error("TFM name too long", $dfn);
+ info("id=".$t->[2], $sfn, $dfn);
+ push(@lst, $t->[0], "\0" . chr(length($dfn)), $dfn);
+ }
+ my $tfm = join('', $vfc->[1], @lst, $vfc->[2]);
+ return $tfm . ("\xf8" x (4 - length($tfm) % 4));
+}
+
+sub read_option {
+ my ($proc) = @_;
+ $op_zero = 0; $op_uptex = 0; $op_quiet = 0;
+ while ($ARGV[0] =~ m/^-/) {
+ my $opt = shift(@ARGV);
+ if ($opt =~ m/^--?h(elp)?$/) {
+ main::show_usage();
+ } elsif ($opt =~ m/^-(?:V|-version)?$/) {
+ main::show_version();
+ } elsif ($opt eq '-z' || $opt eq '--zero') {
+ $op_zero = 1;
+ } elsif ($opt eq '--uptex') {
+ $op_uptex = 1;
+ } elsif ($opt eq '--unicode') {
+ $op_uptex = 2;
+ } elsif ($opt eq '--quiet') { # undocumented
+ $op_quiet = 2;
+ } else {
+ error("invalid option", $opt);
+ }
+ }
+ ($src_main, $dst_main, @dst_base) = @ARGV;
+ $src_main =~ s/\.vf$//;
+ (defined $src_main) or error("no argument given");
+ (($proc eq 'vfinfo') ? (!defined $dst_main) :
+ ($proc eq 'vfcopy') ? (defined $dst_main) :
+ ($proc eq 'jodel') ? (defined $dst_main && $#dst_base == -1) : 1)
+ or error("wrong number of arguments");
+ if ($proc eq 'vfcopy') {
+ $dst_main =~ s/\.vf$//;
+ foreach (@dst_base) { s/\.tfm$//; }
+ ($src_main ne $dst_main)
+ or error("output vf name is same as input");
+ (@dst_base) or error("no base tfm name given");
+ }
+ if ($proc eq 'jodel') {
+ (!$op_zero) or error("invalid in jodel command", "-z/--zero");
+ ($dst_main =~ m/^\w+$/)
+ or error("bad characters in prefix", $dst_main);
+ (length($dst_main) <= 100) or error("prefix too long", $dst_main);
+ } else {
+ (!$op_uptex) or error("invalid except in jodel command", "--uptex");
+ }
+}
+
+#------------------------------- jodel
+
+our %standard_vf = (
+ 'rml' => [1, 'hXXXN-h'],
+ 'rmlv' => [1, 'hXXXN-v'],
+ 'uprml-h' => [2, 'uphXXXN-h'],
+ 'uprml-hq' => [2, 'jodhXXX-hq'],
+ 'uprml-v' => [2, 'uphXXXN-v'],
+ 'gbm' => [1, 'hXXXN-h'],
+ 'gbmv' => [1, 'hXXXN-v'],
+ 'upgbm-h' => [2, 'uphXXXN-h'],
+ 'upgbm-hq' => [2, 'jodhXXX-hq'],
+ 'upgbm-v' => [2, 'uphXXXN-v'],
+);
+our @shape = (
+ 'minl', 'minr', 'minb', 'gothr', 'gothb', 'gotheb', 'mgothr'
+);
+
+our ($jengine, $jtate, @jvfname, %jvfidx, %jvfparsed);
+
+sub jodel {
+ jodel_analyze();
+ if ($op_uptex == 2) {
+ ($jengine == 2)
+ or error("direct-unicode mode is only supported for pure upTeX fonts");
+ foreach (values %standard_vf) {
+ ($_->[1] =~ m/^jod/) and $_->[1] =~ s/jod/zu-jod/;
+ }
+ }
+ foreach (@shape) {
+ jodel_generate($_, '');
+ jodel_generate($_, 'n');
+ }
+}
+
+sub jodel_vf_name {
+ my ($shp, $nn, $idx) = @_;
+ my $zu = ($op_uptex == 2) ? 'zu-' : '';
+ my $i = ($idx > 0) ? "$idx" : '';
+ my $up = (jodel_for_uptex()) ? 'up' : '';
+ my $hv = ($jtate) ? 'v' : 'h';
+ return "$zu$dst_main-$i-${up}nml$shp$nn-$hv";
+}
+sub jodel_tfm_name {
+ my ($shp, $nn, $nam) = @_;
+ $nam =~ s/XXX/\Q$shp\E/; $nam =~ s/N/\Q$nn\E/;
+ return $nam;
+}
+sub jodel_for_uptex {
+ return ($jengine == 2 || ($jengine == 3 && $op_uptex));
+}
+
+{
+ my (%jkpse);
+ sub jodel_kpse {
+ my ($in) = @_;
+ if (exists $jkpse{$in}) { return $jkpse{$in}; }
+ my $out = main::kpse($in); $jkpse{$in} = $out;
+ return $out;
+ }
+}
+
+sub jodel_clone {
+ my ($val) = @_;
+ if (ref($val) eq '') {
+ return $val;
+ } elsif (ref($val) eq 'ARRAY') {
+ return [ map { jodel_clone($_) } (@$val) ];
+ } else { error("OOPS", 98, ref($val)); }
+}
+
+sub jodel_analyze {
+ local ($_);
+ info("**** Analyze VF '$src_main'");
+ $_ = read_whole_file(jodel_kpse("$src_main.tfm"), 1) or error();
+ $jtate = (unpack('n', $_) == 9);
+ info("direction", ($jtate) ? 'tate' : 'yoko');
+ @jvfname = ($src_main); $jengine = 0;
+ info("base TFMs", "");
+ for (my $i = 0; $i <= $#jvfname; $i++) {
+ my $nvf = $jvfname[$i];
+ $_ = read_whole_file(jodel_kpse("$nvf.vf"), 1)
+ or error(($i > 0) ? ("non-standard raw TFM", $nvf) : ());
+ $_ = parse_vf($_) or error();
+ $jvfidx{$nvf} = $i; $jvfparsed{$nvf} = $_;
+ my @lst = map { $_->[1] } @{$_->[0]};
+ info(" $nvf -> @lst");
+ foreach (@lst) {
+ if (exists $standard_vf{$_}) {
+ $jengine |= $standard_vf{$_}[0];
+ next;
+ }
+ (exists $jvfidx{$_}) and next;
+ push(@jvfname, $_);
+ }
+ }
+ my $eng = (jodel_for_uptex()) ? 'upTeX' : 'pTeX';
+ ($jengine == 3) and $eng .= ' (mixed)';
+ info("engine", $eng);
+}
+
+sub jodel_generate {
+ my ($shp, $nn) = @_; local ($_);
+ my $dnvf0 = jodel_vf_name($shp, $nn, 0);
+ info("*** Generate VF '$dnvf0'");
+ foreach my $i (0 .. $#jvfname) {
+ my $snvf = $jvfname[$i];
+ my $dnvf = jodel_vf_name($shp, $nn, $i);
+ my $vfc = jodel_clone($jvfparsed{$snvf});
+ my (@slst, @dlst);
+ foreach my $e (@{$vfc->[0]}) {
+ my $sbas = $e->[1]; my $dbas;
+ if (exists $standard_vf{$sbas}) {
+ $dbas = jodel_tfm_name($shp, $nn, $standard_vf{$sbas}[1]);
+ } elsif (exists $jvfidx{$sbas}) {
+ $dbas = jodel_vf_name($shp, $nn, $jvfidx{$sbas});
+ } else { error("OOPS", 95, "$sbas"); }
+ push(@slst, $sbas); push(@dlst, $dbas);
+ $e->[1] = $dbas;
+ }
+ info("from", "$snvf -> @slst");
+ info(" to", "$dnvf -> @dlst");
+ write_whole_file("$dnvf.vf", jodel_form_vf($vfc), 1) or error();
+ write_whole_file("$dnvf.tfm",
+ read_whole_file(jodel_kpse("$snvf.tfm"), 1), 1) or error();
+ }
+}
+
+sub jodel_form_vf {
+ my ($vfc) = @_; my (@lst);
+ foreach my $k (0 .. $#{$vfc->[0]}) {
+ my $t = $vfc->[0][$k]; my $dfn = $t->[1];
+ push(@lst, $t->[0], "\0" . chr(length($dfn)), $dfn);
+ }
+ my $tfm = join('', $vfc->[1], @lst, $vfc->[2]);
+ return $tfm . ("\xf8" x (4 - length($tfm) % 4));
+}
+
+#------------------------------------------------- go to main
+package main;
+main();
+## EOF
diff --git a/fonts/utilities/lcdf-typetools/README b/fonts/utilities/lcdf-typetools/README
new file mode 100644
index 0000000000..048fa151f6
--- /dev/null
+++ b/fonts/utilities/lcdf-typetools/README
@@ -0,0 +1,144 @@
+LCDF-TYPETOOLS 2.91
+===================
+
+USAGE
+-----
+ The LCDF Typetools package contains several programs for manipulating
+PostScript Type 1, Type 1 multiple master, and PostScript-flavored OpenType
+fonts. LCDF Typetools includes the mmafm and mmpfb programs, which were
+formerly distributed as part of a different package (mminstance).
+
+ Cfftot1 translates a Compact Font Format (CFF) font, or a PostScript-
+flavored OpenType font, into PostScript Type 1 format. It correctly
+handles subroutines and hints. See the manual page 'cfftot1/cfftot1.1' for
+more information.
+
+ Mmafm creates an AFM file (font metrics) corresponding to an instance of
+a multiple-master font. It reads the AMFM and AFM files distributed with
+the font. See MMINSTANCE NOTES, below, and the manual page 'mmafm/mmafm.1'
+for more information.
+
+ Mmpfb creates a normal, single-master font program which looks like an
+instance of a multiple-master font. It reads the multiple master font
+program in PFA or PFB format. See MMINSTANCE NOTES, below, and the manual
+page 'mmpfb/mmpfb.1' for more information.
+
+ Otfinfo reports information about OpenType fonts, such as the features
+they support and the contents of their 'size' optical size features. See
+the manual page 'otfinfo/otfinfo.1' for more information.
+
+ Otftotfm creates TeX font metrics and encodings that correspond to a
+PostScript-flavored OpenType font. It will interpret glyph positionings,
+substitutions, and ligatures as far as it is able. You can say which
+OpenType features should be activated. See the manual page
+'otftotfm/otftotfm.1' for more information.
+
+ T1dotlessj reads a Type 1 font, then creates a new Type 1 font whose
+only character is a dotless "j" matching the input font's design. See the
+manual page 't1dotlessj/t1dotlessj.1' for more information.
+
+ T1lint checks Type 1 fonts for correctness. It tests most of the
+requirements listed in Adobe Systems' Black Book ("Adobe Type 1 Font
+Format"), and some others. See the manual page 't1lint/t1lint.1' for more
+information.
+
+ T1reencode reencodes a Type 1 font, replacing its internal encoding with
+one you specify. See the manual page 't1reencode/t1reencode.1' for more
+information.
+
+ Ttftotype42 creates a Type 42 wrapper for a TrueType or
+TrueType-flavored OpenType font. See the manual page
+'ttftotype42/ttftotype42.1' for more information.
+
+ The final program is preliminary: t1testpage creates a PostScript test
+page for a given font file. See the manual page 't1testpage/t1testpage.1'
+for more information.
+
+ Please write me with problems, patches, and suggestions at the address
+below.
+
+
+REQUIREMENTS
+------------
+ UNIX; gmake; C & C++ compilers. To build, just run ./configure, then
+gmake. See 'INSTALL' in this directory for more detailed information about
+'./configure'.
+
+ Some programs can link with additional libraries. Otftotfm can use the
+Kpathsea TeX-related path searching library; if your kpathsea library is in
+a nonstandard place, supply 'configure' with the '--with-kpathsea=PREFIX'
+option to find it.
+
+ You can also disable individual programs by supplying 'configure' with
+'--disable-PROGNAME' options. See './configure --help' for more
+information.
+
+
+MMINSTANCE NOTES
+----------------
+
+Examples
+........
+ % mmafm MyriadMM.amfm --weight=300 --width=585 > MyriadMM_300_585_.afm
+ % mmpfb MyriadMM.pfb --weight=300 --width=585 > MyriadMM_300_585_.pfb
+
+ Run `mmafm --help' and `mmpfb --help' for a full option summary.
+
+Running mmafm
+.............
+ Mmafm expects the name of an AMFM file on the command line. It also
+needs to find an AFM file for each master (these should have been
+distributed with the AMFM file). You can give the AFM files' names on the
+command line, along with the AMFM file, or you let mmafm find the AFM files
+automatically. For the automatic method, you must follow one of these 2
+conventions:
+
+ 1) The AFM files are in the same directory as the AMFM file. They are
+named `FONTNAME.afm' -- `MyriadMM-LightCn.afm', for example.
+
+ 2) There is a `PSres.upr' file that lists the AFMs by font name, and the
+`PSRESOURCEPATH' environment variable contains the directory with that
+`PSres.upr' file. (`ps2pk' comes with a sample `PSres.upr' file.)
+
+Intermediate masters
+....................
+ Mmpfb can handle intermediate-master fonts transparently. If you use
+`PSres.upr' files, as described above, mmafm will also work transparently
+on intermediate-master fonts: it'll call mmpfb to get the information it
+needs. If you don't use `PSres.upr' files, you need to use mmpfb ahead of
+time to set up some auxiliary files. Say you want to use an intermediate
+master font `FONT', and FONT's AMFM file is in the `DIR' directory. Here's
+what you need to do:
+
+ % mmpfb FONT.pfb --amcp-info > DIR/FONT.amcp
+
+ When you run mmafm on 'DIR/FONT.amfm', it will automatically look for
+'DIR/FONT.amcp'. An example using Adobe Jenson:
+
+ % cd ~/Fonts/AJensonMM
+ % mmpfb AJensonMM.pfb --amcp-info > AJensonMM.amcp
+
+ Most multiple master fonts don't have intermediate masters, so you won't
+usually need to make '.amcp' files. Mmafm will tell you if it is necessary
+for a particular font.
+
+
+COPYRIGHT/LICENSE
+-----------------
+ All source code is Copyright (c) 1997-2011 Eddie Kohler.
+
+ This code is distributed under the GNU General Public License, Version 2
+(and only Version 2). The GNU General Public License is available via the
+Web at <http://www.gnu.org/licenses/gpl.html>, or in the COPYING file in
+this directory.
+
+
+AUTHOR
+------
+ Eddie Kohler, <kohler@cs.ucla.edu>
+ http://www.lcdf.org/
+
+ The current version of the lcdf-typetools package is available on the
+Web at 'http://www.lcdf.org/type/'.
+
+ LCDF stands for Little Cambridgeport Design Factory.
diff --git a/fonts/utilities/macfont/COPYING b/fonts/utilities/macfont/COPYING
new file mode 100644
index 0000000000..c7aea1896f
--- /dev/null
+++ b/fonts/utilities/macfont/COPYING
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/fonts/utilities/macfont/Makefile b/fonts/utilities/macfont/Makefile
new file mode 100644
index 0000000000..74a380bb0e
--- /dev/null
+++ b/fonts/utilities/macfont/Makefile
@@ -0,0 +1,21 @@
+RM=rm -f
+CC=gcc
+CFLAGS=-g
+MACFONT=macfont
+
+all: macfont
+
+macfont: macfont.o macio.o mac2bdf.o
+ $(CC) $(CFLAGS) -o $(MACFONT) macfont.o macio.o mac2bdf.o
+
+mac2bdf.o: mac2bdf.c
+ $(CC) $(CFLAGS) -c mac2bdf.c
+
+macfont.o: applestd.h macio.h mactypes.h macio.o macfont.c
+ $(CC) $(CFLAGS) -c macfont.c
+
+macio.o: macio.h mactypes.h macio.c
+ $(CC) $(CFLAGS) -c macio.c
+
+clean:
+ $(RM) *.o core *~
diff --git a/fonts/utilities/macfont/README b/fonts/utilities/macfont/README
new file mode 100644
index 0000000000..031fea8180
--- /dev/null
+++ b/fonts/utilities/macfont/README
@@ -0,0 +1,60 @@
+README for MacFont 1.1 20 Aug 1993
+
+This is a beta test release.
+
+No warranty of any kind is offered with this software. See the file `COPYING'
+for more information.
+
+MacFont converts Macintosh Type 1 fonts into standard ASCII format. In order
+to use MacFont, you must transfer the `resource forks' of the Macintosh font
+onto your PC or workstation. This can generally be accomplished by archiving
+the font on the Macintosh and extracting the archive with `macunpack' or a
+similar non-Mac tool on your workstation.
+
+MacFont creates PFA files from the `POST' resource and AFM files from the FOND
+resource(s). It can also create BDF files from the NFNT resource(s). The AFM
+and BDF files will be named appropriately based upon the font name extracted
+from the FOND resource. If your file system cannot create long names, use the
+`-s' option to name the AFM files sequentially and the BDF files with short
+names. The PFA file name must be specified with the -p option. Note: the
+FontName, FontFullName, and FamilyName in the AFM file may not match the
+corresponding lines in the PFA file. You should edit one or the other to make
+them the same.
+
+Note: starting with version 1.1, there are no default output files. In version
+1.0, if you didn't specify -a or -p, you got both. That is no longer the
+case.
+
+Options supported by v1.1:
+
+ -a Extract AFM files from FOND resources
+
+ -b Extract BDF files from NFNT resources
+
+ -p file Extract a PFA file from the POST resources. The PFA file will
+ have the name `file'.
+
+ -d Dump the Mac resource data. This is basically a debugging option.
+
+ -e file Load the encoding vector from `file'. The encoding vector is
+ a plain text file with 256 names, one per line. These names will
+ be used in the AFM file. If the `-d' option is used, the encoding
+ vector actually loaded will be displayed on the screen.
+
+ -E name Change EncodingScheme name in AFM file. The default scheme is
+ `AppleStandard'. If you specify an encoding file with `-e', the
+ default scheme name becomes `FontSpecific'. In either case, you
+ can specify a particular name with `-E'.
+
+ -s Extract AFM files with sequential names. Rather than using the
+ font name from the FOND resource, use the names `macfont.1',
+ `macfont.2', etc.
+
+ -w wght Change Weight to `wght' in the AFM file. The default weight is
+ `Normal'.
+
+Please report any problems that you have to Norman Walsh <walsh@cs.umass.edu>.
+
+ Be seeing you...
+ norm
+
diff --git a/fonts/utilities/macfont/applestd.h b/fonts/utilities/macfont/applestd.h
new file mode 100644
index 0000000000..358056d422
--- /dev/null
+++ b/fonts/utilities/macfont/applestd.h
@@ -0,0 +1,276 @@
+/* This file is applestd.h
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+char *encoding[256] = {
+"NUL",
+"SOH",
+"STX",
+"ETX",
+"EOT",
+"ENQ",
+"ACK",
+"BEL",
+"BS",
+"HT",
+"LF",
+"VT",
+"FF",
+"CR",
+"SO",
+"SI",
+"DLE",
+"DC1",
+"DC2",
+"DC3",
+"DC4",
+"NAK",
+"SYN",
+"ETB",
+"CAN",
+"EM",
+"SUB",
+"ESC",
+"FS",
+"GS",
+"RS",
+"US",
+"space",
+"exclam",
+"quotedbl",
+"numbersign",
+"dollar",
+"percent",
+"ampersand",
+"quotesingle",
+"parenleft",
+"parenright",
+"asterisk",
+"plus",
+"comma",
+"hyphen",
+"period",
+"slash",
+"zero",
+"one",
+"two",
+"three",
+"four",
+"five",
+"six",
+"seven",
+"eight",
+"nine",
+"colon",
+"semicolon",
+"less",
+"equal",
+"greater",
+"question",
+"at",
+"A",
+"B",
+"C",
+"D",
+"E",
+"F",
+"G",
+"H",
+"I",
+"J",
+"K",
+"L",
+"M",
+"N",
+"O",
+"P",
+"Q",
+"R",
+"S",
+"T",
+"U",
+"V",
+"W",
+"X",
+"Y",
+"Z",
+"bracketleft",
+"backslash",
+"bracketright",
+"asciicircum",
+"underscore",
+"grave",
+"a",
+"b",
+"c",
+"d",
+"e",
+"f",
+"g",
+"h",
+"i",
+"j",
+"k",
+"l",
+"m",
+"n",
+"o",
+"p",
+"q",
+"r",
+"s",
+"t",
+"u",
+"v",
+"w",
+"x",
+"y",
+"z",
+"braceleft",
+"bar",
+"braceright",
+"asciitilde",
+"DEL",
+"Adieresis",
+"Aring",
+"Ccedilla",
+"Eacute",
+"Ntilde",
+"Odieresis",
+"Udieresis",
+"aacute",
+"agrave",
+"acircumflex",
+"adieresis",
+"atilde",
+"aring",
+"ccedilla",
+"eacute",
+"egrave",
+"ecircumflex",
+"edieresis",
+"iacute",
+"igrave",
+"icircumflex",
+"idieresis",
+"ntilde",
+"oacute",
+"ograve",
+"ocircumflex",
+"odieresis",
+"otilde",
+"uacute",
+"ugrave",
+"ucircumflex",
+"udieresis",
+"dagger",
+"degree",
+"cent",
+"sterling",
+"section",
+"bullet",
+"paragraph",
+"germandbls",
+"registered",
+"copyright",
+"trademark",
+"acute",
+"dieresis",
+"notequal",
+"AE",
+"Oslash",
+"infinity",
+"plusminus",
+"lessequal",
+"greaterequal",
+"yen",
+"mu",
+"partialdiff",
+"summation",
+"product",
+"pi",
+"integral",
+"ordfeminine",
+"ordmasculine",
+"Omega",
+"ae",
+"oslash",
+"questiondown",
+"exclamdown",
+"logicalnot",
+"radical",
+"florin",
+"approxequal",
+"Delta",
+"guillemotleft",
+"guillemotright",
+"ellipsis",
+"nbspace",
+"Agrave",
+"Atilde",
+"Otilde",
+"OE",
+"oe",
+"endash",
+"emdash",
+"quotedblleft",
+"quotedblright",
+"quoteleft",
+"quoteright",
+"divide",
+"lozenge",
+"ydieresis",
+"Ydieresis",
+"fraction",
+"currency",
+"guilsinglleft",
+"guilsinglright",
+"fi",
+"fl",
+"daggerdbl",
+"periodcentered",
+"quotesinglbase",
+"quotedblbase",
+"perthousand",
+"Acircumflex",
+"Ecircumflex",
+"Aacute",
+"Edieresis",
+"Egrave",
+"Iacute",
+"Icircumflex",
+"Idieresis",
+"Igrave",
+"Oacute",
+"Ocircumflex",
+"apple",
+"Ograve",
+"Uacute",
+"Ucircumflex",
+"Ugrave",
+"dotlessi",
+"circumflex",
+"tilde",
+"macron",
+"breve",
+"dotaccent",
+"ring",
+"cedilla",
+"hungarumlaut",
+"ogonek",
+"caron"};
diff --git a/fonts/utilities/macfont/getbits.c b/fonts/utilities/macfont/getbits.c
new file mode 100644
index 0000000000..1ee0d39d59
--- /dev/null
+++ b/fonts/utilities/macfont/getbits.c
@@ -0,0 +1,108 @@
+void show_bits (unsigned char *baseptr, int bitwidth, int bitheight)
+{
+ int row,col;
+ unsigned char mask, *ch;
+
+ ch = baseptr;
+ mask = 0x80;
+ for (row = 0; row < bitheight; row++)
+ {
+ for (col = 0; col < bitwidth; col++)
+ {
+ if (*ch & mask == mask)
+ printf("*");
+ else
+ printf(".");
+
+ mask >>= 1;
+ if (mask == 0)
+ {
+ mask = 0x80;
+ ch++;
+ }
+ }
+ if (mask != 0x80)
+ ch++;
+ }
+}
+
+unsigned char *get_bits(unsigned char *baseptr,
+ int rowbytes,
+ int bitofs,
+ int bitwidth,
+ int bitheight,
+ int *firstrow,
+ int *lastrow)
+{
+ int width, maplen;
+ unsigned char *rect, *rowptr, *sourceptr, *destptr;
+ int row, col;
+ char mask, sourcemask, destmask;
+
+ rowptr = baseptr + (bitofs / 8);
+ *firstrow = -1;
+ *lastrow = -1;
+ for (row = 0; row < bitheight; row++)
+ {
+ sourceptr = rowptr;
+ mask = (bitofs % 8);
+ for (col = 0; col < bitwidth; col++)
+ {
+ if (*sourceptr & mask == mask)
+ {
+ if (*firstrow < 0)
+ *firstrow = row;
+ *lastrow = row;
+ }
+ mask >>= 1;
+ if (mask == 0)
+ {
+ mask = 0x80;
+ sourceptr++;
+ }
+ }
+ rowptr += rowbytes;
+ }
+
+ width = (bitwidth + 7) / 8;
+ maplen = width * (*lastrow - *firstrow + 1);
+
+ rect = (unsigned char *) malloc(maplen);
+ bzero(rect, maplen);
+
+ rowptr = baseptr + (bitofs / 8);
+ rowptr += (rowbytes * (*firstrow));
+ destptr = rect;
+ for (row = *firstrow; row <= *lastrow; row++)
+ {
+ sourceptr = rowptr;
+ sourcemask = (bitofs % 8);
+ destmask = 0x80;
+
+ for (col = 0; col < bitwidth; col++)
+ {
+ if (*sourceptr & sourcemask == sourcemask)
+ *destptr |= destmask;
+
+ sourcemask >>= 1;
+ if (sourcemask == 0)
+ {
+ sourcemask = 0x80;
+ sourceptr++;
+ }
+
+ destmask >>= 1;
+ if (destmask == 0)
+ {
+ destmask = 0x80;
+ destptr++;
+ }
+ }
+
+ if (destmask != 0x80)
+ destptr++;
+ rowptr += rowbytes;
+ }
+
+
+}
diff --git a/fonts/utilities/macfont/mac2bdf.c b/fonts/utilities/macfont/mac2bdf.c
new file mode 100644
index 0000000000..73988de8d3
--- /dev/null
+++ b/fonts/utilities/macfont/mac2bdf.c
@@ -0,0 +1,554 @@
+/*
+ *
+ * THIS CODE WAS STOLEN FROM 'mac2bdf' BY GLENN ADAMS. THE FOLLOWING COMMENTS
+ * DOCUMENT THE ORIGINAL VERSION OF THIS MODULE AND NOT MY HACKS. BUT I DIDN'T
+ * CHANGE MUCH.
+ * Norm Walsh <walsh@cs.umass.edu>
+ *
+ * Copyright (C) 1992, 1993, Metis Technology, Inc.
+ *
+ * @(#)mac2bdf.c 1.2 3/20/93
+ *
+ * STANDARD DISCLAIMERS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the Metis General Public License as published
+ * by Metis Technology, Inc.; either version 2, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Metis Library General Public License for more details.
+ *
+ * In order to receive a copy of the Metis General Public License,
+ * write to Metis Technology, Inc., 358 Windsor St, Cambridge, MA 02141, USA.
+ * This license may also be retrieved by anonymous FTP from the file
+ * "pub/PublicLicense" on the host METIS.COM [140.186.33.40].
+ *
+ * PROGRAM DESCRIPTION
+ *
+ * Name: MAC2BDF
+ * Summary: Utility for extracting bitmap fonts in Macintosh files,
+ * and converting these fonts to Adobe Bitmap Distribution
+ * Format (BDF) files. The resulting BDF files can then
+ * be converted into X11 Font Formats, e.g., by using bdftosnf.
+ * Both FONT and NFNT resources are extracted. FOND resources
+ * are used to select the appropriate font and font file name;
+ * however, FONT and NFNT resources which are orphaned (i.e.,
+ * have no governing FOND) are extracted to temporary font
+ * names.
+ * Usage: mac2bdf [-n] [-q] [-v] file
+ * Options: -n Don't do anything, just report what would be done.
+ * -q Don't report dumped fonts.
+ * -v Enable verbose reporting.
+ * Input: A Macintosh file in MacBinary format.
+ * Output: Zero or more Adobe BDF files, one for each font resource. The
+ * names chosen for output font files are generated based on the
+ * font family, style, and size. Existing files with the same names
+ * are silently replaced. If you wish to know which files will be
+ * produced, use the [-n] option prior to doing the real conversion.
+ * Comments: The Mac font format does not have all of the information one
+ * would normally place in a BDF file; e.g., glyph names are not
+ * specified in the Mac font resources. Consequently, the names
+ * given to glyphs in the BDF file are dynamically assigned in a
+ * unique manner.
+ * History: 11/04/92 -- Created
+ * 11/27/92 -- Modified to find font resources from FONDs.
+ * 11/27/92 -- Modified to load one font resource at a time.
+ * 12/08/92 -- Fixed bug with locTab & owTab indexing; this
+ * -- corrected the Ajmer core dump problem. Change
+ * -- font name handling to substitute hyphens for
+ * -- whitespace. Handle overflows of OWTLoc offset
+ * -- field for large bitmaps.
+ * Notes: 1. Orphaned font resources are not yet handled.
+ * 2. Prefixes B,I,BI,Sb,SbI need to be removed.
+ * 3. Add option to specify family, size, style to dump.
+ * Author: Glenn Adams <glenn@metis.com>
+ *
+ * WARNINGS
+ *
+ * 1. This program was quickly hacked together to get its job done quickly
+ * with little error checking or view towards portability.
+ * 2. This program has only been compiled and run on SunOS 4.1.1. It may not
+ * compile on other platforms, let alone even run.
+ * 3. The only input this program accepts is a MacBinary format file which
+ * was created by using NCSA Telnet to FTP standard Mac files (containing
+ * both data and resource forks) to a Sun system. It may also work with
+ * MacBinary files as transferred by other terminal emulator programs;
+ * however, this has not been tested.
+ * 4. This program is being released in this form in the hope that it will
+ * be useful to someone without all the frills one would expect from a
+ * robust program; this program does not make any claims to robustness.
+ */
+
+#include <alloca.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define DEVXRES 72 /* Macintosh X-Resolution */
+#define DEVYRES 72 /* Macintosh Y-Resolution */
+
+typedef char INT8;
+typedef short INT16;
+typedef long INT32;
+
+typedef unsigned char CARD8;
+typedef unsigned short CARD16;
+typedef unsigned long CARD32;
+
+typedef struct _MacBinHdrRec MacBinHdrRec, *MacBinHdr;
+struct _MacBinHdrRec {
+ CARD8 fnLen [ 2 ];
+ CARD8 fnName [ 63 ];
+ CARD8 fnType [ 4 ];
+ CARD8 fnCreator [ 4 ];
+ CARD8 fnFlags [ 2 ];
+ CARD8 pad1 [ 2 ];
+ CARD8 pad2 [ 2 ];
+ CARD8 pad3 [ 4 ];
+ CARD8 fnDataLen [ 4 ];
+ CARD8 pad4 [ 41 ];
+};
+
+#define RHDRLEN 256 /* total header length */
+
+typedef struct _RsrcHdrRec RsrcHdrRec, *RsrcHdr;
+struct _RsrcHdrRec {
+ CARD8 rhDataOffset [ 4 ];
+ CARD8 rhMapOffset [ 4 ];
+ CARD8 rhDataLen [ 4 ];
+ CARD8 rhMapLen [ 4 ];
+};
+
+typedef struct _RsrcMapRec RsrcMapRec, *RsrcMap;
+struct _RsrcMapRec {
+ RsrcHdrRec rmHdrCopy;
+ CARD8 rmNextMap [ 4 ];
+ CARD8 rmFileRef [ 2 ];
+ CARD8 rmFileAttr [ 2 ];
+ CARD8 rmTypeOffset [ 2 ];
+ CARD8 rmNameOffset [ 2 ];
+};
+
+typedef struct _RsrcTypeRec RsrcTypeRec, *RsrcType;
+struct _RsrcTypeRec {
+ CARD8 rtName [ 4 ];
+ CARD8 rtCount [ 2 ];
+ CARD8 rtRefOffset [ 2 ];
+};
+
+typedef struct _RsrcRefRec RsrcRefRec, *RsrcRef;
+struct _RsrcRefRec {
+ CARD8 rrIdent [ 2 ];
+ CARD8 rrNameOffset [ 2 ];
+ CARD8 rrAttr [ 1 ];
+ CARD8 rrDataOffset [ 3 ];
+ CARD8 rrReserved [ 4 ];
+};
+
+typedef struct _FontRsrcRec FontRsrcRec, *FontRsrc;
+struct _FontRsrcRec {
+ CARD8 ftFontType [ 2 ];
+ CARD8 ftFirstChar [ 2 ];
+ CARD8 ftLastChar [ 2 ];
+ CARD8 ftWidMax [ 2 ];
+ CARD8 ftKernMax [ 2 ];
+ CARD8 ftNDescent [ 2 ];
+ CARD8 ftFRectWidth [ 2 ];
+ CARD8 ftFRectHeight[ 2 ];
+ CARD8 ftOWTLoc [ 2 ];
+ CARD8 ftAscent [ 2 ];
+ CARD8 ftDescent [ 2 ];
+ CARD8 ftLeading [ 2 ];
+ CARD8 ftRowWords [ 2 ];
+};
+
+typedef struct _FondRsrcRec FondRsrcRec, *FondRsrc;
+struct _FondRsrcRec {
+ CARD8 fdFlags [ 2 ];
+ CARD8 fdFamID [ 2 ];
+ CARD8 fdFirst [ 2 ];
+ CARD8 fdLast [ 2 ];
+ CARD8 fdAscent [ 2 ];
+ CARD8 fdDescent [ 2 ];
+ CARD8 fdLeading [ 2 ];
+ CARD8 fdWidMax [ 2 ];
+ CARD8 fdWTabOff [ 4 ];
+ CARD8 fdKernOff [ 4 ];
+ CARD8 fdStylOff [ 4 ];
+ CARD8 fdProperty [ 18 ];
+ CARD8 fdIntl [ 4 ];
+ CARD8 fdVersion [ 2 ];
+};
+
+typedef struct _FontNameRec FontNameRec, *FontName;
+struct _FontNameRec {
+ char * name;
+ int resource_id;
+ int size;
+ int style;
+ FontName next;
+};
+
+char * progname;
+int nodump;
+int quiet;
+int verbose;
+FontName fontnames;
+
+char *
+strdup (s)
+ char *s;
+{
+ char *news = (char *) malloc (strlen (s) + 1);
+ strcpy (news, s);
+ return news;
+}
+
+CARD16
+ toushort ( p )
+CARD8 *p;
+{
+ return (CARD16) ( ( p[0] << 8 ) | p [ 1 ] );
+}
+
+INT16
+ toshort ( p )
+CARD8 *p;
+{
+ return (INT16) toushort ( p );
+}
+
+CARD32
+ toulong ( p )
+CARD8 *p;
+{
+ return (CARD32) ( ( p[0] << 24 ) | ( p[1] << 16 ) | ( p[2] << 8 ) | p[3] );
+}
+
+INT32
+ tolong ( p )
+CARD8 *p;
+{
+ return (INT32) toulong ( p );
+}
+
+/*
+ * Find font bounding box and total number of glyphs.
+ */
+void
+ FontInfo ( fp, ret_top, ret_left, ret_bottom, ret_right, ret_ng )
+register FontRsrc fp;
+INT16 *ret_top;
+INT16 *ret_left;
+INT16 *ret_bottom;
+INT16 *ret_right;
+INT16 *ret_ng;
+{
+ register int i, j, bit;
+ register CARD16 *bp;
+ register CARD8 *gp;
+ CARD16 g, fg, lg, coff0, coff1, ow, wo;
+ INT16 mk, wd, ht, rw, xoff, top, bot, left, right, ng;
+ CARD8 * bitImage;
+ CARD8 * locTable;
+ CARD8 * owTable;
+
+ top = bot = left = right = 0;
+
+ fg = toushort ( fp->ftFirstChar );
+ lg = toushort ( fp->ftLastChar );
+ mk = toshort ( fp->ftKernMax );
+ wd = toshort ( fp->ftFRectWidth );
+ ht = toshort ( fp->ftFRectHeight );
+ wo = toushort ( fp->ftOWTLoc );
+ rw = toshort ( fp->ftRowWords );
+
+ bitImage = (CARD8 * ) & fp [ 1 ];
+ locTable = & bitImage [ ( rw * ht ) << 1 ];
+#ifdef notdef
+ owTable = & fp->ftOWTLoc [ wo << 1 ];
+#else
+ owTable = & locTable [ ( lg - fg + 3 ) << 1 ];
+#endif
+
+ if ( lg == fg )
+ return;
+
+ if ( (CARD32) bitImage & 0x1 ) {
+ bp = (CARD16 *) alloca ( ht * rw * 2 );
+ (void) memcpy ( (char *) bp, (char *) bitImage, ht * rw * 2 );
+ } else
+ bp = (CARD16 *) bitImage;
+
+ gp = (CARD8 *) alloca ( wd * ht );
+ (void) memset ( (char *) gp, 0, wd * ht );
+
+ for ( g = fg, ng = 0; g <= lg; g++ ) {
+
+ /*
+ * Get starting and ending offset columns in bit image.
+ */
+ coff0 = toushort ( & locTable [ ( ( g - fg ) + 0 ) << 1 ] );
+ coff1 = toushort ( & locTable [ ( ( g - fg ) + 1 ) << 1 ] );
+ if ( coff0 == coff1 )
+ continue;
+
+ /*
+ * Get basepoint offset and escapement.
+ */
+ ow = toushort ( & owTable [ ( g - fg ) << 1 ] );
+ xoff = ( ( ow >> 8 ) & 0xff ) + mk;
+
+ /*
+ * Overlay glyph image.
+ */
+ for ( i = 0; i < ht; i++ ) {
+ for ( j = coff0; j < coff1; j++ ) {
+ if ( (int) ( ( j - coff0 ) + xoff ) < 0 )
+ continue;
+ gp [ i * wd + ( j - coff0 ) + xoff ] |=
+ ( bp [ i * rw + ( j / 16 ) ] >> ( 15 - ( j % 16 ) ) ) & 1;
+ }
+ }
+
+ ng++;
+ }
+
+ /*
+ * Find top and bottom of bounding box.
+ */
+ top = ht;
+ bot = 0;
+ for ( i = 0; i < ht; i++ ) {
+ for ( j = 0; j < wd; j++ ) {
+ bit = gp [ i * wd + j ];
+ if ( bit && ( i < top ) )
+ top = i;
+ if ( bit && ( i > bot ) )
+ bot = i;
+ }
+ }
+
+ /*
+ * Find left and right of bounding box.
+ */
+ left = wd;
+ right = 0;
+ for ( i = 0; i < ht; i++ ) {
+ for ( j = 0; j < wd; j++ ) {
+ bit = gp [ i * wd + j ];
+ if ( bit && ( j < left ) )
+ left = j;
+ if ( bit && ( j > right ) )
+ right = j;
+ }
+ }
+
+#ifdef notdef
+ if ( ( ( right - left ) + 1 ) != wd )
+ (void) fprintf ( stderr,
+ "%s: warning: bbox width mismatch, got %d, expected %d\n",
+ progname, ( right - left ) + 1, wd );
+ if ( ( ( bot - top ) + 1 ) != ht )
+ (void) fprintf ( stderr,
+ "%s: warning: bbox height mismatch, got %d, expected %d\n",
+ progname, ( bot - top ) + 1, ht );
+#endif
+
+ *ret_top = top;
+ *ret_left = left + mk;
+ *ret_bottom = bot;
+ *ret_right = right + mk;
+ *ret_ng = ng;
+}
+
+char *
+ FontStyleName ( style )
+int style;
+{
+ static char sname [ 128 ];
+ char *retsname;
+
+ sname [ 0 ] = '\0';
+ if ( style & 0001 )
+ (void) strcat ( sname, "Bold" );
+ if ( style & 0002 )
+ (void) strcat ( sname, "Italic" );
+ if ( style & 0004 )
+ (void) strcat ( sname, "Underlined" );
+ if ( style & 0010 )
+ (void) strcat ( sname, "Outlined" );
+ if ( style & 0020 )
+ (void) strcat ( sname, "Shadowed" );
+ if ( style & 0040 )
+ (void) strcat ( sname, "Condensed" );
+ if ( style & 0100 )
+ (void) strcat ( sname, "Extended" );
+
+ retsname = (char *) malloc (strlen(sname+1));
+ strcpy(retsname, sname);
+ return retsname;
+}
+
+int
+ FontDump ( fp, name, style, size )
+FontRsrc fp;
+char * name;
+int style;
+int size;
+{
+ register int i, j, bit, bits;
+ register CARD16 *bp;
+ register CARD8 *gp;
+ CARD16 g, fg, lg, coff0, coff1, ow, wo;
+ INT16 mk, wd, ht, rw, top, bot, left, right, ng;
+ CARD8 * bitImage;
+ CARD8 * locTable;
+ CARD8 * owTable;
+ FILE * fout;
+ char fname [ 128 ];
+
+ if ( ! fp || ! name || ! size )
+ return 1;
+
+ fg = toushort ( fp->ftFirstChar );
+ lg = toushort ( fp->ftLastChar );
+ mk = toshort ( fp->ftKernMax );
+ wd = toshort ( fp->ftFRectWidth );
+ ht = toshort ( fp->ftFRectHeight );
+ wo = toushort ( fp->ftOWTLoc );
+ rw = toshort ( fp->ftRowWords );
+
+ bitImage = (CARD8 *) & fp [ 1 ];
+ locTable = & bitImage [ ( rw * ht ) << 1 ];
+#ifdef notdef
+ owTable = & fp->ftOWTLoc [ wo << 1 ];
+#else
+ owTable = & locTable [ ( lg - fg + 3 ) << 1 ];
+#endif
+
+ /*
+ * If no glyphs are present, don't dump anything.
+ */
+ if ( lg == fg )
+ return 1;
+
+ /*
+ * At least one glyph is present; create BDF file.
+ */
+ (void) sprintf ( fname, "%s%s-%d.bdf", name, FontStyleName ( style ), size );
+ if ( ! ( fout = fopen ( fname, "w+" ) ) ) {
+ (void) fprintf ( stderr, "%s: can't create output file \"%s\"\n",
+ progname, fname );
+ return 0;
+ }
+
+ /*
+ * Obtain per-font information and dump BDF font header.
+ */
+ FontInfo ( fp, & top, & left, & bot, & right, & ng );
+
+ if ( ! quiet )
+ (void) printf ( "Dumping %d glyphs to \"%s%s-%d.bdf\"\n",
+ ng, name, FontStyleName ( style ), size );
+
+ (void) fprintf ( fout, "STARTFONT 2.1\n" );
+ (void) fprintf ( fout, "FONT %s%s-%d\n",
+ name, FontStyleName ( style ), size );
+ (void) fprintf ( fout, "SIZE %d %d %d\n", size, DEVXRES, DEVYRES );
+ (void) fprintf ( fout, "FONTBOUNDINGBOX %d %d %d %d\n",
+ ( right - left ) + 1,
+ ( bot - top ) + 1,
+ mk,
+ ( ht - toshort ( fp->ftDescent ) ) - ( bot + 1 ) );
+ (void) fprintf ( fout, "STARTPROPERTIES 2\n" );
+ (void) fprintf ( fout, "FONT_ASCENT %d\n", toshort ( fp->ftAscent ) );
+ (void) fprintf ( fout, "FONT_DESCENT %d\n", toshort ( fp->ftDescent ) );
+ (void) fprintf ( fout, "ENDPROPERTIES\n" );
+ (void) fprintf ( fout, "CHARS %d\n", ng );
+
+ if ( (CARD32) bitImage & 0x1 ) {
+ bp = (CARD16 *) alloca ( ht * rw * 2 );
+ (void) memcpy ( (char *) bp, (char *) bitImage, ht * rw * 2 );
+ } else
+ bp = (CARD16 *) bitImage;
+
+ gp = (CARD8 *) alloca ( wd * ht );
+ (void) memset ( (char *) gp, 0, wd * ht );
+
+ for ( g = fg; g <= lg; g++ ) {
+
+ /*
+ * Get starting and ending offset columns in bit image.
+ */
+ coff0 = toushort ( & locTable [ ( ( g - fg ) + 0 ) << 1 ] );
+ coff1 = toushort ( & locTable [ ( ( g - fg ) + 1 ) << 1 ] );
+ if ( coff0 == coff1 )
+ continue;
+
+ /*
+ * Get basepoint offset and escapement.
+ */
+ ow = toushort ( & owTable [ ( g - fg ) << 1 ] );
+
+ /*
+ * Extract glyph image.
+ */
+ (void) memset ( (char *) gp, 0, wd * ht );
+ for ( i = 0; i < ht; i++ ) {
+ for ( j = coff0; j < coff1; j++ ) {
+ bit = ( bp [ i * rw + ( j / 16 ) ] >> ( 15 - ( j % 16 ) ) ) & 1;
+ gp [ i * wd + ( j - coff0 ) ] = bit;
+ }
+ }
+
+ /*
+ * Find top and bottom of bounding box.
+ */
+ top = ht;
+ bot = 0;
+ for ( i = 0; i < ht; i++ ) {
+ for ( j = 0; j < wd; j++ ) {
+ bit = gp [ i * wd + j ];
+ if ( bit && ( i < top ) )
+ top = i;
+ if ( bit && ( i > bot ) )
+ bot = i;
+ }
+ }
+
+ (void) fprintf ( fout, "STARTCHAR GCID%02X\n", g );
+ (void) fprintf ( fout, "ENCODING %d\n", g );
+ (void) fprintf ( fout, "SWIDTH %d %d\n", ( ow & 0xff ) * 720, 0 );
+ (void) fprintf ( fout, "DWIDTH %d %d\n", ( ow & 0xff ), 0 );
+ (void) fprintf ( fout, "BBX %d %d %d %d\n",
+ ( coff1 - coff0 ),
+ ( bot - top ) + 1,
+ ( ( ow >> 8 ) & 0xff ) + mk,
+ ( ht - toshort ( fp->ftDescent ) ) - ( bot + 1 ) );
+ (void) fprintf ( fout, "BITMAP\n" );
+ for ( i = top; i <= bot; i++ ) {
+ for ( j = 0, bits = 0; j < ( coff1 - coff0 ); j++, bits <<= 1 ) {
+ bits |= gp [ i * wd + j ];
+ if ( ( j & 7 ) == 7 ) {
+ (void) fprintf ( fout, "%02x", bits );
+ bits = 0;
+ }
+ }
+ bits <<= 7 - ( j % 8 );
+ if ( j & 7 )
+ (void) fprintf ( fout, "%02x\n", bits );
+ else
+ (void) fprintf ( fout, "\n" );
+ }
+ (void) fprintf ( fout, "ENDCHAR\n" );
+ }
+ (void) fprintf ( fout, "ENDFONT\n" );
+ (void) fclose ( fout );
+ return 1;
+}
+
diff --git a/fonts/utilities/macfont/mac2bdf.h b/fonts/utilities/macfont/mac2bdf.h
new file mode 100644
index 0000000000..eee2aab9cb
--- /dev/null
+++ b/fonts/utilities/macfont/mac2bdf.h
@@ -0,0 +1,26 @@
+/* This file is mac2bdf.h
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+#ifndef MAC_to_BDF_H
+#define MAC_to_BDF_H
+
+char *FontStyleName();
+int FontDump();
+
+#endif /* not MAC_to_BDF_H */
diff --git a/fonts/utilities/macfont/macfont.c b/fonts/utilities/macfont/macfont.c
new file mode 100644
index 0000000000..260769fdf1
--- /dev/null
+++ b/fonts/utilities/macfont/macfont.c
@@ -0,0 +1,828 @@
+/* This file is macfont.h
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+#include <stdio.h>
+#include "mactypes.h"
+#include "macio.h"
+#include "mac2bdf.h"
+#include "applestd.h"
+
+#define PTRSIZE 4
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define Vers "1.1"
+
+extern char *optarg;
+extern int optind, opterr;
+
+int Mac_typeCount;
+int POSTnum, FONDnum, NFNTnum;
+RsrcHdrStruct Mac_header;
+RsrcMapStruct Mac_map;
+RsrcTypeStruct *Mac_types;
+RsrcRefStruct **Mac_refs;
+
+FILE *input;
+FILE *output;
+int rc;
+
+char **style_names;
+char **style_longnames;
+char *familyname;
+
+char *weight;
+char *encoding_scheme;
+
+int debug = 0;
+
+void dump_mac_header(RsrcHdrStruct h, RsrcMapStruct m)
+{
+ printf("Mac header:\t\tMac map:\n");
+ printf("DataOffset (4): 0x%04x\tNextMap (4) : 0x%04x\n",
+ h.DataOffset, m.NextMap);
+ printf("MapOffset (4): 0x%04x\tFileRef (2) : %4d\n",
+ h.MapOffset, m.FileRef);
+ printf("DataLen (4): %4d\tFileAttr (2) : %4d\n",
+ h.DataLen, m.FileAttr);
+ printf("MapLen (4): %4d\tTypeOffset (2) : %4d\n",
+ h.MapLen, m.TypeOffset);
+ printf("\t\t\tNameOffset (2) : %4d\n",
+ m.NameOffset);
+ printf("\n");
+}
+
+void dump_mac_info(RsrcTypeStruct t, RsrcRefStruct r)
+{
+ printf("Mac type:\t\tMac ref:\n");
+ printf("Name (4) : %c%c%c%c\tIdent (2) : %6d\n",
+ t.Name[0], t.Name[1], t.Name[2], t.Name[3], r.Ident);
+ printf("Count (2) : %4d\tNameOffset (2) : 0x%04x\n",
+ t.Count, r.NameOffset);
+ printf("RefOffset (2) : 0x%04x\tAttr (1) : %d\n",
+ t.RefOffset, r.Attr);
+ printf("\t\t\tDataOffset (2) : 0x%04x\n",
+ r.DataOffset);
+ printf("\n");
+}
+
+void dump_mac_info2(RsrcRefStruct r)
+{
+ printf("\t\t\tMac ref:\n");
+ printf("\t\t\tIdent (2) : %6d\n", r.Ident);
+ printf("\t\t\tNameOffset (2) : 0x%04x\n", r.NameOffset);
+ printf("\t\t\tAttr (1) : %d\n", r.Attr);
+ printf("\t\t\tDataOffset (2) : 0x%04x\n", r.DataOffset);
+ printf("\n");
+}
+
+void dump_mac_nfnt(RsrcNfntStruct n, int id)
+{
+ printf("Mac NFNT (%d)\n", id);
+ printf("FontType : %6d\n", n.FontType);
+ printf("FirstChar : %6d\n", n.FirstChar);
+ printf("LastChar : %6d\n", n.LastChar);
+ printf("WidMax : %6d\n", n.WidMax);
+ printf("KernMax : %6d\n", n.KernMax);
+ printf("NDescent : %6d\n", n.NDescent);
+ printf("FRectWidth : %6d\n", n.FRectWidth);
+ printf("FRectHeight : %6d\n", n.FRectHeight);
+ printf("OWTLoc : 0x%04x\n", n.OWTLoc);
+ printf("Ascent : %6d\n", n.Ascent);
+ printf("Descent : %6d\n", n.Descent);
+ printf("Leading : %6d\n", n.Leading);
+ printf("RowWords : %6d\n\n", n.RowWords);
+}
+
+void dump_mac_fond(RsrcFondStruct f, int id)
+{
+ int count;
+
+ printf("Mac FOND (%d)\n", id);
+ printf("Flag : %6d\n", f.Flag);
+ printf("FamilyId : %6d\n", f.FamilyId);
+ printf("FirstChar : %6d\n", f.FirstChar);
+ printf("LastChar : %6d\n", f.LastChar);
+ printf("Ascent : %6d\n", f.Ascent);
+ printf("Descent : %6d\n", f.Descent);
+ printf("Leading : %6d\n", f.Leading);
+ printf("WidMax : %6d\n", f.WidMax);
+ printf("WidTblOfs (4) : 0x%04x\n", f.WidTblOfs);
+ printf("KrnTblOfs (4) : 0x%04x\n", f.KrnTblOfs);
+ printf("StyTblOfs (4) : 0x%04x\n", f.StyTblOfs);
+
+ for (count = 0; count < 9; count++)
+ printf(" FamStyProp %d: %6d\n", count, f.FamStyProp[count]);
+
+ printf("Intrnatnl (4) : %6d\n", f.Intrnatnl);
+ printf("FontVers : %6d\n", f.FontVers);
+
+ for (count = 0; count < f.NumFonts; count++)
+ {
+ printf(" ResourceId : %6d\n", f.AssocTable[count].ResourceNumber);
+ printf(" StyleCode : %6d\n", f.AssocTable[count].StyleCode);
+ printf(" PointSize : %6d\n", f.AssocTable[count].PointSize);
+ }
+
+ printf("\n");
+}
+
+void write_post(int count, int offset)
+{
+ int datalen,post_type,filler;
+ int place,hexplace,rowlen,newplace;
+ unsigned char *buffer, *newbuf;
+ char hexdigits[16] = "0123456789ABCDEF";
+
+ fseek (input, offset, 0);
+ datalen = read_macint() - 2;
+ post_type = read_macchar();
+ filler = read_macchar();
+ while (count > 0 && post_type != 5)
+ {
+ buffer = (char *) malloc(datalen);
+ fread (buffer, 1, datalen, input);
+
+ switch (post_type)
+ {
+ case 0: /* comment */
+ break;
+ case 1: /* ASCII text */
+ newbuf = (char *) malloc(2*datalen); /* 2 is a guesstimate */
+ for (place = 0, newplace=0; place < datalen; place++)
+ {
+ switch (buffer[place])
+ {
+ case 13:
+ newbuf[newplace++] = 10;
+ break;
+ case 0251:
+ newbuf[newplace++] = '(';
+ newbuf[newplace++] = 'C';
+ newbuf[newplace++] = ')';
+ break;
+ default:
+ newbuf[newplace++] = buffer[place];
+ break;
+ }
+ }
+ fwrite (newbuf, 1, newplace, output);
+ free(newbuf);
+ break;
+ case 2: /* hexidecimal data */
+ newbuf = (char *) malloc(3*datalen); /* 3 is overkill */
+ for (place = 0, hexplace = 0, rowlen = 0;
+ place < datalen;
+ place++)
+ {
+ newbuf[hexplace++] = hexdigits[(buffer[place] >> 4) & 0x0F];
+ newbuf[hexplace++] = hexdigits[buffer[place] & 0x0F];
+ rowlen += 2;
+ if (rowlen > 63)
+ {
+ newbuf[hexplace++] = 10;
+ rowlen = 0;
+ }
+ }
+ if (rowlen != 0)
+ newbuf[hexplace++] = 10;
+ fwrite(newbuf, 1, hexplace, output);
+ free(newbuf);
+ break;
+ case 3: /* end-of-file marker */
+ break;
+ case 4: /* font program is in data fork */
+ printf("Can't handle POST resources in the data fork.\n");
+ exit(1);
+ break;
+ case 5: /* end of font program */
+ break;
+ }
+
+ free (buffer);
+ datalen = read_macint() - 2;
+ post_type = read_macchar();
+ filler = read_macchar();
+ count--;
+ }
+}
+
+float frac2real(int W)
+{
+ float R;
+ int I;
+
+ R = (W & 0x0FFF);
+ R = R / 4096.0;
+
+ W = (W >> 12) & 0x0F;
+ if (W >= 0x08)
+ {
+ W = W ^ 0xFFFF;
+ W = (W + 1) & 0x0F;
+ I = -W;
+ }
+ else
+ I = W;
+
+ R = R + I;
+
+ return R;
+}
+
+void get_style_names (int offset, int num_styles)
+{
+ int count, place, actual, strcnt, namecnt;
+ unsigned char SNT[4096];
+ unsigned short int SNPos[64];
+ char *SPtr;
+ char *EncStr;
+ unsigned short int Class;
+ int EncTblOfs;
+ unsigned char StyIdxTbl[48];
+ char **strings;
+
+ fseek (input, offset, 0);
+ count = read_macint();
+ Class = read_macshortint();
+ EncTblOfs = read_macint();
+ read_macint(); /* skip the reserved word */
+ for (count = 0; count < 48; count++)
+ StyIdxTbl[count] = read_macchar() - 1;
+
+ if (EncTblOfs != 0)
+ {
+ printf("Info: This file contains an encoding table...\n");
+ }
+
+ strcnt = read_macshortint();
+ fread (SNT+2, 1, 126, input);
+ place = 2;
+ SNPos[0] = place;
+ for (count = 1; count < 64; count++)
+ {
+ place = place + SNT[SNPos[count-1]] + 1;
+ SNPos[count] = place;
+ }
+
+ strings = (char **) malloc (strcnt * PTRSIZE);
+
+ for (count = 0; count < strcnt; count++)
+ {
+ int slen;
+ char *sptr;
+
+ slen = SNT[SNPos[count]];
+ sptr = (char *) malloc(slen+1);
+ strncpy(sptr,&SNT[SNPos[count]+1],slen);
+ *(sptr+slen) = 0;
+
+ strings[count] = sptr;
+ }
+
+ familyname = strings[0];
+ style_names = (char **) malloc((num_styles+1) * PTRSIZE);
+ style_longnames = (char **) malloc((num_styles+1) * PTRSIZE);
+
+ for (count = 0; count < num_styles; count++)
+ {
+ int slen;
+ char *sptr,*strnum;
+ char *nptr,*lnptr;
+
+ sptr = strings[0];
+ slen = strlen(sptr);
+
+ if (strcnt > 1)
+ {
+ strnum = strings[StyIdxTbl[count]];
+ while (*strnum)
+ {
+ sptr = strings[*strnum-1];
+ slen += strlen(sptr);
+ strnum++;
+ }
+ }
+
+ style_names[count] = (char *) malloc(slen+1);
+ style_longnames[count] = (char *) malloc(slen+1);
+
+ nptr = style_names[count];
+ lnptr = style_longnames[count];
+
+ sptr = strings[0];
+ slen = strlen(sptr);
+
+ strncpy (nptr, sptr, MIN(slen,5));
+ nptr += MIN(slen,5);
+ *nptr = 0;
+
+ strcpy (lnptr, sptr);
+ lnptr += slen;
+ *lnptr = 0;
+
+ if (strcnt > 1)
+ {
+ strnum = strings[StyIdxTbl[count]];
+ while (*strnum)
+ {
+ sptr = strings[*strnum-1];
+ slen = strlen(sptr);
+
+ strncpy (nptr, sptr, MIN(slen,3));
+ nptr += MIN(slen,3);
+ *nptr = 0;
+
+ strcpy (lnptr, sptr);
+ lnptr += slen;
+ *lnptr = 0;
+
+ strnum++;
+ }
+ }
+ }
+
+ style_names[num_styles] = 0;
+ style_longnames[num_styles] = 0;
+}
+
+void write_kerns(int offset, FILE *afm)
+{
+ int NumKernTbls, StyleCode, NumKernPairs;
+ int count;
+ unsigned char L1, L2;
+ int Frac;
+
+ fseek(input, offset, 0);
+
+ read_macint(); /* skip length, or something? */
+
+ NumKernTbls = read_macshortint();
+ StyleCode = read_macshortint();
+ NumKernPairs = read_macshortint();
+
+ fprintf(afm, "StartKernData\n");
+ fprintf(afm, "StartKernPairs %d\n", NumKernPairs);
+
+ for (count = 0; count < NumKernPairs; count++)
+ {
+ L1 = read_macchar();
+ L2 = read_macchar();
+ Frac = read_macshortint();
+
+ if (encoding[L1] != 0 && encoding[L2] != 0)
+ fprintf(afm, "KPX %s %s %d\n",
+ encoding[L1],
+ encoding[L2],
+ (int) (frac2real(Frac)*1000));
+ }
+
+ fprintf(afm, "EndKernPairs\n");
+ fprintf(afm, "EndKernData\n");
+}
+
+void write_nfnt(int offset,
+ FontEntryFormat font_entry,
+ char *name,int id,
+ int sequential)
+{
+ RsrcNfntStruct Nfnt;
+ int datalen;
+ unsigned char *buf;
+
+ fseek (input, offset, 0);
+ datalen = read_macint();
+
+ Nfnt = read_mac_nfnt();
+
+ if (debug)
+ dump_mac_nfnt(Nfnt, id);
+
+ fseek (input, offset, 0);
+ datalen = read_macint();
+
+ buf = (char *) malloc (datalen);
+ fread (buf, 1, datalen, input);
+
+ if (sequential)
+ name = "mf";
+
+ FontDump(buf, name, font_entry.StyleCode, font_entry.PointSize);
+
+ free(buf);
+
+ return;
+}
+
+void write_fond(int offset, int id, int afmopt, int bdfopt, int sequential)
+{
+ int fonddatalen,datalen,count,tblcount;
+ unsigned char *buffer;
+ RsrcFondStruct Fond;
+ unsigned short int TableCount, Style, Width;
+ unsigned short int **Widths;
+ unsigned short int *curWidths;
+ FILE *afm;
+
+ fseek (input, offset, 0);
+ fonddatalen = read_macint();
+
+ Fond = read_mac_fond();
+
+ if (debug)
+ dump_mac_fond(Fond, id);
+
+ fseek (input, offset+Fond.WidTblOfs, 0);
+
+ datalen = read_macshortint();
+ datalen = read_macshortint();
+
+ TableCount = read_macshortint()+1;
+
+ Widths = (unsigned short int **) malloc (TableCount * PTRSIZE);
+
+ for (tblcount = 0; tblcount < TableCount; tblcount++)
+ {
+ Style = read_macshortint();
+
+ Widths[tblcount] = (unsigned short int *) malloc(256 * 2);
+ curWidths = Widths[tblcount];
+
+ for (count = 0; count < 256; count++)
+ {
+ Width = read_macshortint();
+ curWidths[count] = (frac2real(Width) * 1000);
+ }
+
+ read_macshortint(); /* discard unused word */
+ count = read_macshortint();
+
+ if (count != 0)
+ printf("Warning: table doesn't conform to spec.\n");
+ }
+
+ get_style_names (offset + Fond.StyTblOfs, TableCount);
+
+ for (tblcount = 0; afmopt && tblcount < TableCount; tblcount++)
+ {
+ char *filename;
+ char *ch;
+
+ if (sequential)
+ {
+ filename = (char *) malloc(12);
+ sprintf(filename, "macfont.%d", sequential++);
+ }
+ else
+ {
+ filename = (char *) malloc(strlen(style_names[tblcount])+5);
+ strcpy(filename, style_names[tblcount]);
+ strcpy(filename+strlen(style_names[tblcount]),".afm");
+
+ for (ch = filename;
+ *ch;
+ ch++)
+ if (*ch < 32 || *ch > 126)
+ *ch = '-';
+ }
+
+ fprintf (stderr, "Writing AFM file to %s.\n", filename);
+ afm = fopen(filename, "w");
+
+ fprintf (afm, "StartFontMetrics 3.0\n");
+ fprintf (afm, "Comment Created by MacFont vers %s.\n", Vers);
+ fprintf (afm, "Comment MacFont Copyright (C) 1993 by Norman Walsh\n");
+ fprintf (afm, "Comment Free software. No warranty.\n");
+ fprintf (afm, "FontName %s\n", style_names[tblcount]);
+ fprintf (afm, "FullName %s\n", style_longnames[tblcount]);
+ fprintf (afm, "FamilyName %s\n", familyname);
+ fprintf (afm, "Weight %s\n", weight);
+ fprintf (afm, "FontBBox 0 %d %d %d\n",
+ (int) (frac2real(Fond.Descent)*1000),
+ (int) (frac2real(Fond.WidMax)*1000),
+ (int) (frac2real(Fond.Ascent)*1000));
+ fprintf (afm, "EncodingScheme %s\n", encoding_scheme);
+
+ fprintf (afm, "StartCharMetrics %d\n",
+ Fond.LastChar-Fond.FirstChar+1);
+
+ curWidths = Widths[tblcount];
+ for (count = Fond.FirstChar; count <= Fond.LastChar; count++)
+ {
+ fprintf(afm,"C %3d ; WX %d ; N %s ; B 0 %d %d %d ;\n",
+ count,
+ curWidths[count],
+ encoding[count],
+ (int) (frac2real(Fond.Descent) * 1000),
+ curWidths[count],
+ (int) (frac2real(Fond.Ascent) * 1000));
+ }
+
+ fprintf (afm, "EndCharMetrics\n");
+
+ if (Fond.KrnTblOfs == 0)
+ {
+ fprintf(afm, "StartKernData\n");
+ fprintf(afm, "StartKernPairs 0\n");
+ fprintf(afm, "EndKernPairs\n");
+ fprintf(afm, "EndKernData\n");
+ }
+ else
+ write_kerns(offset+Fond.KrnTblOfs,afm);
+
+ fprintf(afm, "EndFontMetrics\n");
+ fclose(afm);
+ }
+
+ if (bdfopt)
+ {
+ RsrcRefStruct *curRef;
+ int refcount;
+
+ for (count = 0; count < Fond.NumFonts; count++)
+ {
+ curRef = Mac_refs[NFNTnum];
+ for (refcount = 0; refcount < Mac_types[NFNTnum].Count; refcount++)
+ {
+ if (curRef->Ident == Fond.AssocTable[count].ResourceNumber)
+ write_nfnt(Mac_header.DataOffset + curRef->DataOffset,
+ Fond.AssocTable[count],
+ style_names[Fond.AssocTable[count].StyleCode],
+ curRef->Ident,
+ sequential);
+ curRef++;
+ }
+ }
+ }
+}
+
+int main (int argc, char **argv)
+{
+ int dump_input = 1;
+ int Mac_typeCount;
+ int count;
+ char outputname[80];
+ int outputcount = 1;
+ FILE *encinput;
+
+ char opt;
+ char *optstring = "ap:e:E:dsw:b";
+ char *pfafile = 0;
+ char *encfile = 0;
+ char *rsrcfile = 0;
+ int pfaopt = 0;
+ int afmopt = 0;
+ int bdfopt = 0;
+ int encopt = 0;
+ int sequential = 0;
+
+ fprintf (stderr,"MacFont vers %s. Copyright (C) 1993 by Norman Walsh.\n",
+ Vers);
+ fprintf (stderr,"Portions Copyright (C) 1992, 1993, Metis Technology, Inc.\n");
+
+ /* ********************************************************************** */
+ /* Read the command line arguments. This is really crudely done! */
+
+ weight = 0;
+
+ opterr = 0;
+ while ((opt = getopt (argc, argv, optstring)) != EOF)
+ {
+ switch (opt)
+ {
+ case '?':
+ fprintf(stderr,"Invalid option.\n");
+ exit(1);
+ break;
+
+ case 'a':
+ afmopt = 1;
+ break;
+
+ case 'b':
+ bdfopt = 1;
+ break;
+
+ case 's':
+ sequential = 1;
+ break;
+
+ case 'p':
+ pfaopt = 1;
+ pfafile = optarg;
+ break;
+
+ case 'e':
+ encopt = 1;
+ encfile = optarg;
+ break;
+
+ case 'E':
+ encoding_scheme = optarg;
+ break;
+
+ case 'w':
+ weight = optarg;
+ break;
+
+ case 'd':
+ debug = 1;
+ break;
+ }
+ }
+
+ rsrcfile = argv[optind];
+
+ if (!rsrcfile)
+ {
+ fprintf(stderr, "You must supply a resource file.\n");
+ fprintf(stderr, "\nUsage : %s <opts> macfile\n", argv[0]);
+ fprintf(stderr, "Where : macfile is a Macintosh resource fork.\n");
+ fprintf(stderr, "Options: -a = extract AFM file from FOND.\n");
+ fprintf(stderr, " -b = extract BDF bitmap fonts from NFNT.\n");
+ fprintf(stderr, " -p file = extract PFA file from POST into `file'.\n");
+ fprintf(stderr, " -d = dump resource data (debugging).\n");
+ fprintf(stderr, " -e file = load encoding vector from `file'.\n");
+ fprintf(stderr, " -E name = change EncodingScheme name in AFM.\n");
+ fprintf(stderr, " -s = extract AFM files with sequential names.\n");
+ fprintf(stderr, " -w wght = change Weight to `wght' in AFM.\n");
+ exit(1);
+ }
+
+ if (!weight)
+ weight = "Normal";
+
+ input = fopen(rsrcfile,"r");
+ if (!input)
+ {
+ fprintf (stderr, "Can't open resource file: %s\n", rsrcfile);
+ exit(1);
+ }
+
+ if (encopt && encfile)
+ {
+ char line[80];
+
+ if (!encoding_scheme)
+ encoding_scheme = "FontSpecific";
+
+ encinput = fopen(encfile,"r");
+ if (!encinput)
+ {
+ fprintf (stderr, "Can't open encoding file: %s\n", encfile);
+ exit(1);
+ }
+
+ for (count = 0; count < 256; count++)
+ {
+ fgets(line, 80, encinput);
+ line[strlen(line)-1] = 0;
+
+ if (strncmp(line, ".notdef", 7) == 0)
+ encoding[count] = NULL;
+ else
+ {
+ encoding[count] = (char *) malloc(strlen(line)+1);
+ strcpy(encoding[count], line);
+ }
+ }
+
+ if (debug)
+ {
+ printf("Encoding:\n");
+ for (count = 0; count < 256; count++)
+ if (encoding[count])
+ printf("\t%3d `%s'\n", count, encoding[count]);
+ else
+ printf("\t%3d `.notdef'\n", count);
+ }
+ }
+
+ if (!encoding_scheme)
+ encoding_scheme = "AppleStandard";
+
+ /* ********************************************************************** */
+ /* Read the Mac resource file ... */
+
+ Mac_header = read_mac_header();
+
+ fseek(input, Mac_header.MapOffset, 0);
+
+ Mac_map = read_mac_map();
+
+ if (debug)
+ dump_mac_header(Mac_header, Mac_map);
+
+ fseek(input, Mac_header.MapOffset + Mac_map.TypeOffset, 0);
+
+ Mac_typeCount = read_macshortint()+1;
+ Mac_types = (RsrcTypeStruct *) malloc (Mac_typeCount*sizeof(RsrcTypeStruct));
+ Mac_refs = (RsrcRefStruct **) malloc (Mac_typeCount*sizeof(RsrcRefStruct));
+
+ POSTnum = -1;
+ FONDnum = -1;
+ NFNTnum = -1;
+ for (count = 0; count < Mac_typeCount; count++)
+ {
+ Mac_types[count] = read_mac_type();
+ if (strncmp (Mac_types[count].Name, "POST", 4) == 0)
+ POSTnum = count;
+ if (strncmp (Mac_types[count].Name, "FOND", 4) == 0)
+ FONDnum = count;
+ if (strncmp (Mac_types[count].Name, "NFNT", 4) == 0)
+ NFNTnum = count;
+ }
+
+ for (count = 0; count < Mac_typeCount; count++)
+ {
+ RsrcRefStruct *curRef;
+ int ref_count;
+
+ curRef = (RsrcRefStruct *) malloc(Mac_types[count].Count
+ * sizeof(RsrcRefStruct));
+
+ Mac_refs[count] = curRef;
+
+ fseek(input,
+ Mac_header.MapOffset
+ + Mac_map.TypeOffset
+ + Mac_types[count].RefOffset,
+ 0);
+
+ for (ref_count = 0; ref_count < Mac_types[count].Count; ref_count++)
+ {
+ *curRef = read_mac_ref();
+ curRef++;
+ }
+ }
+
+ if (debug)
+ for (count = 0; count < Mac_typeCount; count++)
+ {
+ RsrcRefStruct *curRef;
+ int ref_count;
+
+ curRef = Mac_refs[count];
+ dump_mac_info(Mac_types[count], *curRef++);
+ for (ref_count = 1; ref_count < Mac_types[count].Count; ref_count++)
+ dump_mac_info2(*curRef++);
+ }
+
+ /* ********************************************************************** */
+ /* Dump out the POST and FOND resources, as requested */
+
+ if (pfaopt)
+ {
+ if (POSTnum >= 0)
+ {
+ RsrcRefStruct *curRef = Mac_refs[POSTnum];
+
+ fprintf (stderr, "Writing PFA file to %s.\n", pfafile);
+ sprintf(outputname, pfafile);
+ output = fopen(outputname, "w");
+ write_post(Mac_types[POSTnum].Count,
+ Mac_header.DataOffset + curRef->DataOffset);
+ fclose(output);
+ }
+ else
+ fprintf (stderr, "No POST found in %s.\n", rsrcfile);
+ }
+
+ if (afmopt || bdfopt)
+ {
+ if (FONDnum >= 0)
+ {
+ RsrcRefStruct *curRef = Mac_refs[FONDnum];
+ int refcount;
+
+ for (refcount = 0; refcount < Mac_types[FONDnum].Count; refcount++)
+ {
+ write_fond(Mac_header.DataOffset + curRef->DataOffset,
+ curRef->Ident,
+ afmopt, bdfopt,
+ sequential);
+ curRef++;
+ }
+ }
+ else
+ fprintf (stderr, "No metrics or bitmaps found in %s.\n", rsrcfile);
+ }
+
+ exit (0);
+}
+
+
diff --git a/fonts/utilities/macfont/macio.c b/fonts/utilities/macfont/macio.c
new file mode 100644
index 0000000000..7d68d46f0c
--- /dev/null
+++ b/fonts/utilities/macfont/macio.c
@@ -0,0 +1,201 @@
+/* This file is macio.c
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+#include <stdio.h>
+#include "macio.h"
+#include "mactypes.h"
+
+int read_int()
+{
+ int datum;
+ rc = fread(&datum, sizeof (datum), 1, input);
+ return datum;
+}
+
+short int read_shortint()
+{
+ short int datum;
+ rc = fread(&datum, sizeof (datum), 1, input);
+ return datum;
+}
+
+unsigned char read_char()
+{
+ unsigned char datum;
+ rc = fread(&datum, sizeof (datum), 1, input);
+ return datum;
+}
+
+int read_macint()
+{
+ unsigned char Ca[4];
+ int datum;
+
+ rc = fread(&Ca, 1, 4, input);
+ datum = (Ca[0] << 24) + (Ca[1] << 16) + (Ca[2] << 8) + (Ca[3]);
+ return datum;
+}
+
+int read_macint3()
+{
+ unsigned char Ca[3];
+ int datum;
+
+ rc = fread(&Ca, 1, 3, input);
+ datum = (Ca[0] << 16) + (Ca[1] << 8) + (Ca[2]);
+ return datum;
+}
+
+short int read_macshortint()
+{
+ unsigned char Ca[2];
+ int datum;
+
+ rc = fread(&Ca, 1, 2, input);
+ datum = (Ca[0] << 8) + (Ca[1]);
+ return datum;
+}
+
+unsigned char read_macchar()
+{
+ return read_char();
+}
+
+RsrcHdrStruct read_mac_header()
+{
+ RsrcHdrStruct Header;
+ int count;
+
+ Header.DataOffset = read_macint();
+ Header.MapOffset = read_macint();
+ Header.DataLen = read_macint();
+ Header.MapLen = read_macint();
+
+ for (count = 0; count < 96; count++)
+ Header.OSReserved[count] = read_macchar();
+
+ for (count = 0; count < 128; count++)
+ Header.AppReserved[count] = read_macchar();
+
+ return Header;
+}
+
+RsrcMapStruct read_mac_map()
+{
+ RsrcMapStruct Map;
+ int count;
+
+ for (count = 0; count < 4; count++)
+ Map.MapCopy[count] = read_macint();
+
+ Map.NextMap = read_macint();
+ Map.FileRef = read_macshortint();
+ Map.FileAttr = read_macshortint();
+ Map.TypeOffset = read_macshortint();
+ Map.NameOffset = read_macshortint();
+
+ return Map;
+}
+
+RsrcTypeStruct read_mac_type()
+{
+ RsrcTypeStruct Type;
+ int count;
+
+ for (count = 0; count < 4; count++)
+ Type.Name[count] = read_macchar();
+
+ Type.Count = read_macshortint() + 1; /* ofs from zero */
+ Type.RefOffset = read_macshortint();
+
+ return Type;
+}
+
+RsrcRefStruct read_mac_ref()
+{
+ RsrcRefStruct Ref;
+ int count;
+
+ Ref.Ident = read_macshortint();
+ Ref.NameOffset = read_macshortint();
+ Ref.Attr = read_macchar();
+ Ref.DataOffset = read_macint3();
+ Ref.Unknown = read_macint();
+
+ return Ref;
+}
+
+RsrcFondStruct read_mac_fond()
+{
+ RsrcFondStruct Fond;
+ int count;
+
+ Fond.Flag = read_macshortint();
+ Fond.FamilyId = read_macshortint();
+ Fond.FirstChar = read_macshortint();
+ Fond.LastChar = read_macshortint();
+ Fond.Ascent = read_macshortint();
+ Fond.Descent = read_macshortint();
+ Fond.Leading = read_macshortint();
+ Fond.WidMax = read_macshortint();
+ Fond.WidTblOfs = read_macint();
+ Fond.KrnTblOfs = read_macint();
+ Fond.StyTblOfs = read_macint();
+
+ for (count = 0; count < 9; count++)
+ Fond.FamStyProp[count] = read_macshortint();
+
+ Fond.Intrnatnl = read_macint();
+ Fond.FontVers = read_macshortint();
+
+ Fond.NumFonts = read_macshortint() + 1;
+ Fond.AssocTable = (FontEntryFormat *) malloc(Fond.NumFonts *
+ sizeof(FontEntryFormat));
+ for (count = 0; count < Fond.NumFonts; count++)
+ {
+ Fond.AssocTable[count].PointSize = read_macshortint();
+ Fond.AssocTable[count].StyleCode = read_macshortint();
+ Fond.AssocTable[count].ResourceNumber = read_macshortint();
+ }
+
+ return Fond;
+}
+
+RsrcNfntStruct read_mac_nfnt()
+{
+ RsrcNfntStruct Nfnt;
+ int count;
+
+ Nfnt.FontType = read_macshortint();
+ Nfnt.FirstChar = read_macshortint();
+ Nfnt.LastChar = read_macshortint();
+ Nfnt.WidMax = read_macshortint();
+ Nfnt.KernMax = read_macshortint();
+ Nfnt.NDescent = read_macshortint();
+ Nfnt.FRectWidth = read_macshortint();
+ Nfnt.FRectHeight = read_macshortint();
+ Nfnt.OWTLoc = read_macshortint();
+ Nfnt.Ascent = read_macshortint();
+ Nfnt.Descent = read_macshortint();
+ Nfnt.Leading = read_macshortint();
+ Nfnt.RowWords = read_macshortint();
+
+ return Nfnt;
+}
+
diff --git a/fonts/utilities/macfont/macio.h b/fonts/utilities/macfont/macio.h
new file mode 100644
index 0000000000..4c7939dd60
--- /dev/null
+++ b/fonts/utilities/macfont/macio.h
@@ -0,0 +1,44 @@
+/* This file is macio.h
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+#ifndef MACIO_H
+#define MACIO_H
+
+#include "mactypes.h"
+
+extern FILE *input;
+extern FILE *output;
+extern int rc;
+
+int read_int();
+short int read_shortint();
+unsigned char read_char();
+int read_macint();
+int read_macint3();
+short int read_macshortint();
+unsigned char read_macchar();
+
+RsrcHdrStruct read_mac_header();
+RsrcMapStruct read_mac_map();
+RsrcTypeStruct read_mac_type();
+RsrcRefStruct read_mac_ref();
+RsrcFondStruct read_mac_fond();
+RsrcNfntStruct read_mac_nfnt();
+
+#endif /* not MACIO_H */
diff --git a/fonts/utilities/macfont/mactypes.h b/fonts/utilities/macfont/mactypes.h
new file mode 100644
index 0000000000..8eb4dec8bb
--- /dev/null
+++ b/fonts/utilities/macfont/mactypes.h
@@ -0,0 +1,115 @@
+/* This file is mactypes.h
+ *
+ * Copyright (C) 1993 by Norman Walsh
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************/
+
+#ifndef MACTYPES_H
+#define MACTYPES_H
+
+#ifndef SKIPTYPES
+typedef unsigned short int USHORT;
+typedef unsigned char BYTE;
+typedef unsigned long int ULONG;
+typedef short int SHORT;
+typedef int LONG;
+#endif /* not SKIPTYPES */
+
+typedef struct _RsrcHdrStruct {
+ ULONG DataOffset;
+ ULONG MapOffset;
+ ULONG DataLen;
+ ULONG MapLen;
+ BYTE OSReserved[96];
+ BYTE AppReserved[128];
+} RsrcHdrStruct;
+
+typedef struct _RsrcMapStruct {
+ ULONG MapCopy[4];
+ ULONG NextMap;
+ USHORT FileRef;
+ USHORT FileAttr;
+ USHORT TypeOffset;
+ USHORT NameOffset;
+} RsrcMapStruct;
+
+typedef struct _RsrcTypeStruct {
+ char Name[4];
+ USHORT Count;
+ USHORT RefOffset;
+} RsrcTypeStruct;
+
+typedef struct _RsrcRefStruct {
+ USHORT Ident;
+ USHORT NameOffset;
+ BYTE Attr;
+ ULONG DataOffset;
+ ULONG Unknown;
+} RsrcRefStruct;
+
+typedef struct _MacDataStruct {
+ ULONG size;
+ BYTE *map;
+} MacDataStruct;
+
+typedef struct _FontEntryFormat {
+ USHORT PointSize;
+ USHORT StyleCode;
+ USHORT ResourceNumber;
+} FontEntryFormat;
+
+typedef struct _RsrcFondStruct {
+ USHORT Flag;
+ USHORT FamilyId;
+ USHORT FirstChar;
+ USHORT LastChar;
+ SHORT Ascent;
+ SHORT Descent;
+ SHORT Leading;
+ SHORT WidMax;
+ ULONG WidTblOfs;
+ ULONG KrnTblOfs;
+ ULONG StyTblOfs;
+ USHORT FamStyProp[9];
+ ULONG Intrnatnl;
+ USHORT FontVers;
+ int NumFonts;
+ FontEntryFormat *AssocTable;
+} RsrcFondStruct;
+
+typedef struct _RsrcNfntStruct {
+ USHORT FontType;
+ USHORT FirstChar;
+ USHORT LastChar;
+ SHORT WidMax;
+ SHORT KernMax;
+ SHORT NDescent;
+ SHORT FRectWidth;
+ SHORT FRectHeight;
+ USHORT OWTLoc;
+ SHORT Ascent;
+ SHORT Descent;
+ SHORT Leading;
+ SHORT RowWords;
+} RsrcNfntStruct;
+
+typedef struct _NfntCharInfoStruct {
+ BYTE ofs;
+ BYTE width;
+} NfntCharInfoStruct;
+
+#endif /* not MACTYPES_H */
+
diff --git a/fonts/utilities/makefonts/00previous/FontInstall b/fonts/utilities/makefonts/00previous/FontInstall
new file mode 100755
index 0000000000..eeab77a339
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/FontInstall
@@ -0,0 +1,56 @@
+#!/bin/tcsh -f
+#
+# This shell script installs font bitmaps (./*.tfm, ./*pk)
+# which have been created with mk_xxxx.
+#
+# Usage: FontInstall METAFONT-MODE SUPPLIER TYPEFACE
+#
+# VK 21 Jul 94, 1 Jan 95, 7 Jan 95, 8 Apr 95; 29 Sep 95; 08 Apr 96
+#
+
+if ($#argv < 3) then
+ echo '\
+Usage: '"$0:t"' METAFONT-MODE SUPPLIER TYPEFACE [PATTERN]\
+ Copies ./*pk to $FONTS/pk/METAFONT-MODE/SUPPLIER/TYPEFACE/\
+ Copies ./*.tfm to $FONTS/tfm/SUPPLIER/TYPEFACE/\
+ (METAFONT-MODE: e.g. cx, ljfour)\
+ (SUPPLIER: e.g. public, ams; TYPEFACE: e.g. cm, latex)\
+ (PATTERN: name pattern, e.g. "eu*" for ams euler fonts. Must be quoted!\!)\
+ $FONTS defaults to $TEXMF/fonts/\
+ $TEXMF must be set\
+'
+ exit 1
+endif
+
+if ( ! $?TEXMF ) then
+ echo '$TEXMF is not set. Please set and re-run.'
+ exit 5
+endif
+
+if ( ! $?FONTS ) then
+ echo '$FONTS is not set - set to '"$TEXMF/fonts"
+ setenv FONTS $TEXMF/fonts
+endif
+
+set mfmode="$1"
+set supplier="$2"
+set typeface="$3"
+set pattern="$4"
+if ( "$pattern" == "" ) set pattern='*'
+
+
+set dirname="$FONTS/pk/$mfmode/$supplier/$typeface"
+if ( ! -e $dirname ) then
+ echo "Creating $dirname"
+ mkdir -p $dirname
+endif
+echo "Copying ./*pk files to $dirname"
+cp -p {$pattern}pk $dirname
+
+set dirname="$FONTS/tfm/$supplier/$typeface"
+if ( ! -e $dirname ) then
+ echo "Creating $dirname"
+ mkdir -p $dirname
+endif
+echo "Copying ./*.tfm files to $dirname"
+cp -p {$pattern}.tfm $dirname
diff --git a/fonts/utilities/makefonts/00previous/FontMetricInstall b/fonts/utilities/makefonts/00previous/FontMetricInstall
new file mode 100755
index 0000000000..9493bcbf3c
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/FontMetricInstall
@@ -0,0 +1,63 @@
+#!/bin/tcsh -f
+#
+# A little shell script to install font metrics (afm, tfm, vf, sty, fd)
+# from CTAN:fonts/psfonts/...
+#
+# Usage: FontMetricInstall NAME-OF-SUPPLIER TYPEFACE-TO-INSTALL [...]
+#
+# Note: a) it is necessary to read the psnfss documentation!
+# b) *.map might have to be added to psfonts.map (for dvips)
+#
+# VK 22 Jun 94, 08 Jul 94, 30 Dec 94, 7 Jan 95; 29 Sep 95; 07,08 Apr 96
+#
+
+if ($#argv < 2) then
+ echo '\
+Usage: '"$0"' SUPPLIER TYPEFACE [TYPEFACE ...]\
+ Copies TYPEFACE/{afm,tfm,vf}/* to $FONTS/{afm,tfm,vf}/SUPPLIER/TYPEFACE/\
+ TYPEFACE/type1/* to $FONTS/type1/SUPPLIER/\
+ TYPEFACE/tex/* to $TEXMF/tex/inputs/psnfss/SUPPLIER/\
+ TYPEFACE/dvips/* to $TEXMF/dvips/SUPPLIER/\
+ (SUPPLIER: e.g. adobe, bitstream; TYPEFACE: e.g. palatino, charter)\
+ $FONTS defaults to $TEXMF/fonts/\
+ $TEXMF must be set\
+'
+ exit 1
+endif
+
+if ( ! $?TEXMF ) then
+ echo '$TEXMF is not set. Please set and re-run.'
+ exit 5
+endif
+
+if ( ! $?FONTS ) then
+ echo '$FONTS is not set - set to '"$TEXMF/fonts"
+ setenv FONTS $TEXMF/fonts
+endif
+
+set supplier=$1
+
+foreach typeface ( $argv[2-] )
+
+echo ""
+echo "Installing font $typeface in $FONTS/[afm|tfm|vf|type1]/$supplier"
+echo " (tex/* to ~/tex/inputs/psnfss/$supplier)"
+echo " (dvips/* to ~/dvips/$supplier)"
+
+if ( ! -e $FONTS/afm/$supplier/$typeface ) mkdir -p $FONTS/afm/$supplier/$typeface
+cp -p $typeface/afm/* $FONTS/afm/$supplier/$typeface
+if ( ! -e $FONTS/tfm/$supplier/$typeface ) mkdir -p $FONTS/tfm/$supplier/$typeface
+cp -p $typeface/tfm/* $FONTS/tfm/$supplier/$typeface
+if ( ! -e $FONTS/vf/$supplier/$typeface ) mkdir -p $FONTS/vf/$supplier/$typeface
+cp -p $typeface/vf/* $FONTS/vf/$supplier/$typeface
+
+if ( ! -e $FONTS/type1/$supplier ) mkdir -p $FONTS/type1/$supplier
+cp -p $typeface/type1/* $FONTS/type1/$supplier
+
+if ( ! -e ~/tex/inputs/psnfss/$supplier ) mkdir -p ~/tex/inputs/psnfss/$supplier
+cp -p $typeface/tex/* ~/tex/inputs/psnfss/$supplier
+
+if ( ! -e ~/dvips/$supplier ) mkdir -p ~/dvips/$supplier
+cp -p $typeface/dvips/* ~/dvips/$supplier
+
+end
diff --git a/fonts/utilities/makefonts/00previous/README b/fonts/utilities/makefonts/00previous/README
new file mode 100644
index 0000000000..a83f682a67
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/README
@@ -0,0 +1,77 @@
+ GENERATING/INSTALLING FONTS FOR TeX/LaTeX
+ =========================================
+
+[This is makefonts release 1.5, 12 Aug 1998]
+
+When installing the TeX/LaTeX typesetting system, it is necessary to
+make the basic computer modern (cm) fonts available. To do this there
+are 2 principally different approaches:
+
+1) Create the .pk file for a particular font and size, automatically
+ when needed.
+ The .tfm file must already be available to LaTeX.
+2) Generate the basic .tfm and .pk files all at once.
+ No .tfm files are needed.
+
+The UNIX shell scripts provided here are for approach 2) and generate
+various fonts, and install them. They take care of the question: Which
+fonts and at which sizes do I generate for my TeX/LaTeX installation?
+
+The files in the distribution are:
+
+ mk_cm Generate all cm fonts. It generates all fonts
+ which can be called up by LaTeX (as of LaTeX2e's
+ cmfonts.fdd) without explicitly loading a particular
+ font. It also generates a few fonts which are
+ distributed with TeX.
+ mk_cmmore Generates a few rare sizes of cm sometimes used (by
+ plain TeX?).
+ mk_latex Generates the LaTeX specific fonts.
+ mk_ams Generates all AMS fonts.
+ mk_* Generates other fonts which are available from CTAN.
+ FontInstall Moves the .tfm and .pk files generated to the directory
+ specified. Before you use this, call it without
+ parameters and see whether it fits your directory
+ structure!
+ FontMetricInstall
+ Helps with installing PostScript fonts. It copies
+ required files from CTAN:fonts/metrics to target
+ directories. Again, call it without parameters and see
+ whether it fits your directory structure!
+
+For a basic set of fonts for a LaTeX installation, use mk_cm,
+mk_latex. AMS-LaTeX requires mk_ams. Before running any of the mk_*
+scripts, create an empty subdirectory, cd to it, and make sure all your
+.mf files are found by metafont (environment variable $MFINPUTS).
+
+The mk_* scripts call metafont with mode=localfont, unless the metafont
+mode is given as first argument. The metafont base needs to be set
+correctly. Metafont is called as "mf" for the metafont plain base, and
+as "cmmf" for the metafont plain+computer modern base. If any of these
+names or parameters do not suit your installation plans, it should be
+easy to make adaptations to the shell scripts with a search/replace.
+
+If you are unsure about how to handle metafont, get Geoffrey Tobin's
+excellent metafont-for-beginners.tex from any CTAN archive. This is
+sufficient reading to install the above fonts. For details about the
+CTAN archives, finger ctan@ctan.org.
+
+BUGS:
+ Currently none known.
+
+AUTHOR:
+ Volker Kuhlmann
+ University of Canterbury
+ Dept of Electrical and Electronic Engineering
+ Private Bag
+ Christchurch, New Zealand
+
+ Email: v.kuhlmann@elec.canterbury.ac.nz
+
+This material is not copyrighted. It is provided with the hope that it
+will be useful. Any feedback, positive, negative, (non-)constructive,
+is appreciated.
+
+Have fun, and good luck!
+
+Volker
diff --git a/fonts/utilities/makefonts/00previous/mk_ams b/fonts/utilities/makefonts/00previous/mk_ams
new file mode 100755
index 0000000000..11f8ee134f
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_ams
@@ -0,0 +1,257 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ AMS (AMS symbols, euler, cyrillic, dummy)\
+ Note: the extracm fonts are made by mk_cm.\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 9 July 94; 1 Jan 95; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+# 1 Jan 95 (VK)
+# Added cyrillic fonts.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# AMS SYMBOL A
+cmmf "$MFARG"' \mag=magstep(0);' input msam5
+cmmf "$MFARG"' \mag=magstep(0);' input msam6
+cmmf "$MFARG"' \mag=magstep(0);' input msam7
+cmmf "$MFARG"' \mag=magstep(0);' input msam8
+cmmf "$MFARG"' \mag=magstep(0);' input msam9
+cmmf "$MFARG"' \mag=magstep(0);' input msam10
+cmmf "$MFARG"' \mag=magstep(0.5);' input msam10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input msam10 # 12pt
+cmmf "$MFARG"' \mag=magstep(2);' input msam10 # 14.4pt
+cmmf "$MFARG"' \mag=magstep(3);' input msam10 # 17.28pt
+cmmf "$MFARG"' \mag=magstep(4);' input msam10 # 20.74pt
+cmmf "$MFARG"' \mag=magstep(5);' input msam10 # 24.88pt
+
+# AMS SYMBOL B
+cmmf "$MFARG"' \mag=magstep(0);' input msbm5
+cmmf "$MFARG"' \mag=magstep(0);' input msbm6
+cmmf "$MFARG"' \mag=magstep(0);' input msbm7
+cmmf "$MFARG"' \mag=magstep(0);' input msbm8
+cmmf "$MFARG"' \mag=magstep(0);' input msbm9
+cmmf "$MFARG"' \mag=magstep(0);' input msbm10
+cmmf "$MFARG"' \mag=magstep(0.5);' input msbm10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input msbm10 # 12pt
+cmmf "$MFARG"' \mag=magstep(2);' input msbm10 # 14.4pt
+cmmf "$MFARG"' \mag=magstep(3);' input msbm10 # 17.28pt
+cmmf "$MFARG"' \mag=magstep(4);' input msbm10 # 20.74pt
+cmmf "$MFARG"' \mag=magstep(5);' input msbm10 # 24.88pt
+
+# AMS EULER FRAKTUR
+mf "$MFARG"' \mag=magstep(0);' input eufm5
+mf "$MFARG"' \mag=magstep(0);' input eufm6
+mf "$MFARG"' \mag=magstep(0);' input eufm7
+mf "$MFARG"' \mag=magstep(0);' input eufm8
+mf "$MFARG"' \mag=magstep(0);' input eufm9
+mf "$MFARG"' \mag=magstep(0);' input eufm10
+mf "$MFARG"' \mag=magstep(0.5);' input eufm10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eufm10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eufm10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eufm10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eufm10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eufm10 # 24.88pt
+
+# AMS EULER FRAKTUR BOLD
+mf "$MFARG"' \mag=magstep(0);' input eufb5
+mf "$MFARG"' \mag=magstep(0);' input eufb6
+mf "$MFARG"' \mag=magstep(0);' input eufb7
+mf "$MFARG"' \mag=magstep(0);' input eufb8
+mf "$MFARG"' \mag=magstep(0);' input eufb9
+mf "$MFARG"' \mag=magstep(0);' input eufb10
+mf "$MFARG"' \mag=magstep(0.5);' input eufb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eufb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eufb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eufb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eufb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eufb10 # 24.88pt
+
+# AMS EULER SCRIPT
+mf "$MFARG"' \mag=magstep(0);' input eusm5
+mf "$MFARG"' \mag=magstep(0);' input eusm6
+mf "$MFARG"' \mag=magstep(0);' input eusm7
+mf "$MFARG"' \mag=magstep(0);' input eusm8
+mf "$MFARG"' \mag=magstep(0);' input eusm9
+mf "$MFARG"' \mag=magstep(0);' input eusm10
+mf "$MFARG"' \mag=magstep(0.5);' input eusm10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eusm10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eusm10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eusm10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eusm10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eusm10 # 24.88pt
+
+# AMS EULER SCRIPT BOLD
+mf "$MFARG"' \mag=magstep(0);' input eusb5
+mf "$MFARG"' \mag=magstep(0);' input eusb6
+mf "$MFARG"' \mag=magstep(0);' input eusb7
+mf "$MFARG"' \mag=magstep(0);' input eusb8
+mf "$MFARG"' \mag=magstep(0);' input eusb9
+mf "$MFARG"' \mag=magstep(0);' input eusb10
+mf "$MFARG"' \mag=magstep(0.5);' input eusb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eusb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eusb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eusb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eusb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eusb10 # 24.88pt
+
+# AMS EULER MATH EXTENSION
+mf "$MFARG"' \mag=magstep(0);' input euex7
+mf "$MFARG"' \mag=magstep(0);' input euex8
+mf "$MFARG"' \mag=magstep(0);' input euex9
+mf "$MFARG"' \mag=magstep(0);' input euex10
+mf "$MFARG"' \mag=magstep(0.5);' input euex10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input euex10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input euex10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input euex10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input euex10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input euex10 # 24.88pt
+
+# AMS EULER MATH ROMAN
+# AMS EULER ROMAN
+mf "$MFARG"' \mag=magstep(0);' input eurm5
+mf "$MFARG"' \mag=magstep(0);' input eurm6
+mf "$MFARG"' \mag=magstep(0);' input eurm7
+mf "$MFARG"' \mag=magstep(0);' input eurm8
+mf "$MFARG"' \mag=magstep(0);' input eurm9
+mf "$MFARG"' \mag=magstep(0);' input eurm10
+mf "$MFARG"' \mag=magstep(0.5);' input eurm10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eurm10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eurm10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eurm10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eurm10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eurm10 # 24.88pt
+
+# AMS EULER MATH ROMAN BOLD
+# AMS EULER ROMAN BOLD
+mf "$MFARG"' \mag=magstep(0);' input eurb5
+mf "$MFARG"' \mag=magstep(0);' input eurb6
+mf "$MFARG"' \mag=magstep(0);' input eurb7
+mf "$MFARG"' \mag=magstep(0);' input eurb8
+mf "$MFARG"' \mag=magstep(0);' input eurb9
+mf "$MFARG"' \mag=magstep(0);' input eurb10
+mf "$MFARG"' \mag=magstep(0.5);' input eurb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input eurb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input eurb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input eurb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input eurb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input eurb10 # 24.88pt
+
+# AMS CYRILLIC
+mf "$MFARG"' \mag=magstep(0);' input wncyr5
+mf "$MFARG"' \mag=magstep(0);' input wncyr6
+mf "$MFARG"' \mag=magstep(0);' input wncyr7
+mf "$MFARG"' \mag=magstep(0);' input wncyr8
+mf "$MFARG"' \mag=magstep(0);' input wncyr9
+mf "$MFARG"' \mag=magstep(0);' input wncyr10
+mf "$MFARG"' \mag=magstep(0.5);' input wncyr10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input wncyr10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input wncyr10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input wncyr10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input wncyr10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input wncyr10 # 24.88pt
+
+# AMS CYRILLIC BOLD
+mf "$MFARG"' \mag=magstep(0);' input wncyb5
+mf "$MFARG"' \mag=magstep(0);' input wncyb6
+mf "$MFARG"' \mag=magstep(0);' input wncyb7
+mf "$MFARG"' \mag=magstep(0);' input wncyb8
+mf "$MFARG"' \mag=magstep(0);' input wncyb9
+mf "$MFARG"' \mag=magstep(0);' input wncyb10
+mf "$MFARG"' \mag=magstep(0.5);' input wncyb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input wncyb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input wncyb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input wncyb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input wncyb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input wncyb10 # 24.88pt
+
+# AMS CYRILLIC ITALICS
+mf "$MFARG"' \mag=magstep(0);' input wncyi5
+mf "$MFARG"' \mag=magstep(0);' input wncyi6
+mf "$MFARG"' \mag=magstep(0);' input wncyi7
+mf "$MFARG"' \mag=magstep(0);' input wncyi8
+mf "$MFARG"' \mag=magstep(0);' input wncyi9
+mf "$MFARG"' \mag=magstep(0);' input wncyi10
+mf "$MFARG"' \mag=magstep(0.5);' input wncyi10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input wncyi10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input wncyi10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input wncyi10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input wncyi10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input wncyi10 # 24.88pt
+
+# AMS CYRILLIC SANS SERIF
+mf "$MFARG"' \mag=magstep(0);' input wncyss8
+mf "$MFARG"' \mag=magstep(0);' input wncyss9
+mf "$MFARG"' \mag=magstep(0);' input wncyss10
+mf "$MFARG"' \mag=magstep(0.5);' input wncyss10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input wncyss10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input wncyss10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input wncyss10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input wncyss10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input wncyss10 # 24.88pt
+
+# AMS CYRILLIC SMALL CAPS
+mf "$MFARG"' \mag=magstep(0);' input wncysc10
+mf "$MFARG"' \mag=magstep(0.5);' input wncysc10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input wncysc10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input wncysc10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input wncysc10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input wncysc10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input wncysc10 # 24.88pt
+
+# AMS DUMMY
+mf "$MFARG"' \mag=magstep(0);' input dummy
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_cc b/fonts/utilities/makefonts/00previous/mk_cc
new file mode 100755
index 0000000000..37ed6d5c98
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_cc
@@ -0,0 +1,93 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ concrete\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Michael Cree, Volker Kuhlmann\
+ 9 July 94; Volker 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# CONCRETE ROMAN
+cmmf "$MFARG"' \mag=magstep(0);' input ccr5
+cmmf "$MFARG"' \mag=magstep(0);' input ccr6
+cmmf "$MFARG"' \mag=magstep(0);' input ccr7
+cmmf "$MFARG"' \mag=magstep(0);' input ccr8
+cmmf "$MFARG"' \mag=magstep(0);' input ccr9
+cmmf "$MFARG"' \mag=magstep(0);' input ccr10
+cmmf "$MFARG"' \mag=magstep(0.5);' input ccr10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input ccr10 # 12pt
+cmmf "$MFARG"' \mag=magstep(2);' input ccr10 # 14.4pt
+cmmf "$MFARG"' \mag=magstep(3);' input ccr10 # 17.28pt
+cmmf "$MFARG"' \mag=magstep(4);' input ccr10 # 20.74pt
+cmmf "$MFARG"' \mag=magstep(5);' input ccr10 # 24.88pt
+
+# CONCRETE CONDENSED SLANTED
+cmmf "$MFARG"' \mag=magstep(0);' input ccslc9
+
+# CONCRETE ITALICS
+cmmf "$MFARG"' \mag=magstep(0);' input ccti10
+cmmf "$MFARG"' \mag=magstep(0.5);' input ccti10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input ccti10 # 12pt
+
+# CONCRETE SMALL CAPS
+cmmf "$MFARG"' \mag=magstep(0);' input cccsc10
+cmmf "$MFARG"' \mag=magstep(0.5);' input cccsc10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input cccsc10 # 12pt
+
+# CONCRETE MATH ITALICS
+cmmf "$MFARG"' \mag=magstep(0);' input ccmi10
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_cm b/fonts/utilities/makefonts/00previous/mk_cm
new file mode 100755
index 0000000000..5fbb311cfc
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_cm
@@ -0,0 +1,441 @@
+#!/bin/csh -f
+# Will also work with tcsh
+
+cat <<EOF
+This script runs metafont and gftopk to produce the
+following fonts / families / shapes:
+
+ *********************************************************
+ computer modern, as to LaTeX2e's cmfonts.fdd
+ Also required:
+ extracm, from the amsfonts distribution
+ *********************************************************
+
+Give metafont mode as first argument (default = localfont)
+
+Note: some fonts are needed from the AMSfonts distribution.
+
+Michael Cree, Volker Kuhlmann
+ 9 July 94
+ Volker 1 Jan 95; 8 Apr 95; 26 Mar 96; 8 Apr 96; 12 Aug 98
+v.kuhlmann@elec.canterbury.ac.nz
+
+EOF
+
+# CHANGELOG
+#
+# 12 Aug 98 (VK)
+# Changed cmmf to mf.
+# Replaced echo with cat, introduced $MF.
+# 22 Oct 96 (VK)
+# Removed comment about missing LaTeX slide fonts.
+# Added cmtex fonts.
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 26 Mar 96 (VK)
+# Added cmex10 magstep 2 (needed for amsldoc.tex).
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+# 1 Jan 95 (VK)
+# Checked that all cm fonts are generated.
+# (Also generated are the AMSfonts extracm fonts.)
+#
+# 8 Dec 94 (VK)
+# Added cmssq8, cmssqi8 because make of TeX 3.1415 C version 6.1
+# failed to create the plain format.
+# These 2 fonts are preloaded by plain, but not by LaTeX.
+#
+# 21 Nov 94 (VK)
+# Added cminch because it is a standard TeX font. Other standard
+# TeX fonts probably missing as well.
+
+
+if ( $#argv > 0 ) set MODE="$1"
+if ( ! $?MODE ) set MODE=localfont
+set MF="cmmf \mode=$MODE; \scrollmode; "
+set MF="mf \mode=$MODE; \scrollmode; "
+cat <<EOF
+
+**********************************
+metafont mode is set to: $MODE
+running metafont as: $MF
+**********************************
+
+EOF
+
+
+# COMPUTER MODERN ROMAN
+$MF '\mag=magstep(0);' input cmr5
+$MF '\mag=magstep(0);' input cmr6
+$MF '\mag=magstep(0);' input cmr7
+$MF '\mag=magstep(0);' input cmr8
+$MF '\mag=magstep(0);' input cmr9
+$MF '\mag=magstep(0);' input cmr10
+$MF '\mag=magstep(0.5);' input cmr10 # 10.95pt
+$MF '\mag=magstep(0);' input cmr12
+$MF '\mag=magstep(1);' input cmr12 # 14.4pt
+$MF '\mag=magstep(0);' input cmr17
+$MF '\mag=magstep(1);' input cmr17 # 20.74pt
+$MF '\mag=magstep(2);' input cmr17 # 24.88pt
+
+# COMPUTER MODERN SLANTED
+$MF '\mag=magstep(-2.58);' input cmsl8 # 5pt
+$MF '\mag=magstep(-1.58);' input cmsl8 # 6pt
+$MF '\mag=magstep(-0.732);' input cmsl8 # 7pt
+$MF '\mag=magstep(0);' input cmsl8
+$MF '\mag=magstep(0);' input cmsl9
+$MF '\mag=magstep(0);' input cmsl10
+$MF '\mag=magstep(0.5);' input cmsl10 # 10.95pt
+$MF '\mag=magstep(0);' input cmsl12
+$MF '\mag=magstep(1);' input cmsl12 # 14.4pt
+$MF '\mag=magstep(2);' input cmsl12 # 17.28pt
+$MF '\mag=magstep(3);' input cmsl12 # 20.74pt
+$MF '\mag=magstep(4);' input cmsl12 # 24.88pt
+
+# COMPUTER MODERN ITALICS
+$MF '\mag=magstep(-1.85);' input cmti7 # 5pt
+$MF '\mag=magstep(-0.845);' input cmti7 # 6pt
+$MF '\mag=magstep(0);' input cmti7
+$MF '\mag=magstep(0);' input cmti8
+$MF '\mag=magstep(0);' input cmti9
+$MF '\mag=magstep(0);' input cmti10
+$MF '\mag=magstep(0.5);' input cmti10 # 10.95pt
+$MF '\mag=magstep(0);' input cmti12
+$MF '\mag=magstep(1);' input cmti12 # 14.4pt
+$MF '\mag=magstep(2);' input cmti12 # 17.28pt
+$MF '\mag=magstep(3);' input cmti12 # 20.74pt
+$MF '\mag=magstep(4);' input cmti12 # 24.88pt
+
+# COMPUTER MODERN SMALL CAPS
+$MF '\mag=magstep(-3.8);' input cmcsc10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmcsc10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmcsc10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmcsc10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmcsc10 # 9pt
+$MF '\mag=magstep(0);' input cmcsc10
+$MF '\mag=magstep(0.5);' input cmcsc10 # 10.95pt
+$MF '\mag=magstep(1);' input cmcsc10 # 12pt
+$MF '\mag=magstep(2);' input cmcsc10 # 14.4pt
+$MF '\mag=magstep(3);' input cmcsc10 # 17.28pt
+$MF '\mag=magstep(4);' input cmcsc10 # 20.74pt
+$MF '\mag=magstep(5);' input cmcsc10 # 24.88pt
+# (size 8-9 come from the AMSfonts! not loaded by standard fd file)
+$MF '\mag=magstep(0);' input cmcsc8
+$MF '\mag=magstep(0);' input cmcsc9
+
+# COMPUTER MODERN UPRIGHT
+# (this is to get the pound symbol)
+$MF '\mag=magstep(-3.8);' input cmu10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmu10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmu10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmu10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmu10 # 9pt
+$MF '\mag=magstep(0);' input cmu10
+$MF '\mag=magstep(0.5);' input cmu10 # 10.95pt
+$MF '\mag=magstep(1);' input cmu10 # 12pt
+$MF '\mag=magstep(2);' input cmu10 # 14.4pt
+$MF '\mag=magstep(3);' input cmu10 # 17.28pt
+$MF '\mag=magstep(4);' input cmu10 # 20.74pt
+$MF '\mag=magstep(5);' input cmu10 # 24.88pt
+
+# COMPUTER MODERN BOLD
+$MF '\mag=magstep(-3.8);' input cmb10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmb10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmb10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmb10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmb10 # 9pt
+$MF '\mag=magstep(0);' input cmb10
+$MF '\mag=magstep(0.5);' input cmb10 # 10.95pt
+$MF '\mag=magstep(1);' input cmb10 # 12pt
+$MF '\mag=magstep(2);' input cmb10 # 14.4pt
+$MF '\mag=magstep(3);' input cmb10 # 17.28pt
+$MF '\mag=magstep(4);' input cmb10 # 20.74pt
+$MF '\mag=magstep(5);' input cmb10 # 24.88pt
+
+# COMPUTER MODERN BOLD EXTENDED
+$MF '\mag=magstep(0);' input cmbx5
+$MF '\mag=magstep(0);' input cmbx6
+$MF '\mag=magstep(0);' input cmbx7
+$MF '\mag=magstep(0);' input cmbx8
+$MF '\mag=magstep(0);' input cmbx9
+$MF '\mag=magstep(0);' input cmbx10
+$MF '\mag=magstep(0.5);' input cmbx10 # 10.95pt
+$MF '\mag=magstep(0);' input cmbx12
+$MF '\mag=magstep(1);' input cmbx12 # 14.4pt
+$MF '\mag=magstep(2);' input cmbx12 # 17.28pt
+$MF '\mag=magstep(3);' input cmbx12 # 20.74pt
+$MF '\mag=magstep(4);' input cmbx12 # 24.88pt
+
+# COMPUTER MODERN BOLD EXTENDED SLANTED
+$MF '\mag=magstep(-3.8);' input cmbxsl10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmbxsl10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmbxsl10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmbxsl10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmbxsl10 # 9pt
+$MF '\mag=magstep(0);' input cmbxsl10
+$MF '\mag=magstep(0.5);' input cmbxsl10 # 10.95pt
+$MF '\mag=magstep(1);' input cmbxsl10 # 12pt
+$MF '\mag=magstep(2);' input cmbxsl10 # 14.4pt
+$MF '\mag=magstep(3);' input cmbxsl10 # 17.28pt
+$MF '\mag=magstep(4);' input cmbxsl10 # 20.74pt
+$MF '\mag=magstep(5);' input cmbxsl10 # 24.88pt
+
+# COMPUTER MODERN BOLD EXTENDED ITALICS
+$MF '\mag=magstep(-3.8);' input cmbxti10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmbxti10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmbxti10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmbxti10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmbxti10 # 9pt
+$MF '\mag=magstep(0);' input cmbxti10
+$MF '\mag=magstep(0.5);' input cmbxti10 # 10.95pt
+$MF '\mag=magstep(1);' input cmbxti10 # 12pt
+$MF '\mag=magstep(2);' input cmbxti10 # 14.4pt
+$MF '\mag=magstep(3);' input cmbxti10 # 17.28pt
+$MF '\mag=magstep(4);' input cmbxti10 # 20.74pt
+$MF '\mag=magstep(5);' input cmbxti10 # 24.88pt
+
+# COMPUTER MODERN SANS SERIF
+$MF '\mag=magstep(-2.58);' input cmss8 # 5pt
+$MF '\mag=magstep(-1.58);' input cmss8 # 6pt
+$MF '\mag=magstep(-0.732);' input cmss8 # 7pt
+$MF '\mag=magstep(0);' input cmss8
+$MF '\mag=magstep(0);' input cmss9
+$MF '\mag=magstep(0);' input cmss10
+$MF '\mag=magstep(0.5);' input cmss10 # 10.95pt
+$MF '\mag=magstep(0);' input cmss12
+$MF '\mag=magstep(1);' input cmss12 # 14.4pt
+$MF '\mag=magstep(0);' input cmss17
+$MF '\mag=magstep(1);' input cmss17 # 20.74pt
+$MF '\mag=magstep(2);' input cmss17 # 24.88pt
+
+# COMPUTER MODERN SANS SERIF ITALICS (SLANTED as of OT1cmss.fd?)
+$MF '\mag=magstep(-2.58);' input cmssi8 # 5pt
+$MF '\mag=magstep(-1.58);' input cmssi8 # 6pt
+$MF '\mag=magstep(-0.732);' input cmssi8 # 7pt
+$MF '\mag=magstep(0);' input cmssi8
+$MF '\mag=magstep(0);' input cmssi9
+$MF '\mag=magstep(0);' input cmssi10
+$MF '\mag=magstep(0.5);' input cmssi10 # 10.95pt
+$MF '\mag=magstep(0);' input cmssi12
+$MF '\mag=magstep(1);' input cmssi12 # 14.4pt
+$MF '\mag=magstep(0);' input cmssi17
+$MF '\mag=magstep(1);' input cmssi17 # 20.74pt
+$MF '\mag=magstep(2);' input cmssi17 # 24.88pt
+
+# COMPUTER MODERN SANS SERIF SEMI BOLD CONDENSED
+# Note: cmssdc10 at 5pt bombs out metafont!
+$MF '\mag=magstep(-3.8);' input cmssdc10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmssdc10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmssdc10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmssdc10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmssdc10 # 9pt
+$MF '\mag=magstep(0);' input cmssdc10
+$MF '\mag=magstep(0.5);' input cmssdc10 # 10.95pt
+$MF '\mag=magstep(1);' input cmssdc10 # 12pt
+$MF '\mag=magstep(2);' input cmssdc10 # 14.4pt
+$MF '\mag=magstep(3);' input cmssdc10 # 17.28pt
+$MF '\mag=magstep(4);' input cmssdc10 # 20.74pt
+$MF '\mag=magstep(5);' input cmssdc10 # 24.88pt
+
+# COMPUTER MODERN SANS SERIF BOLD EXTENDED
+$MF '\mag=magstep(-3.8);' input cmssbx10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmssbx10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmssbx10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmssbx10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmssbx10 # 9pt
+$MF '\mag=magstep(0);' input cmssbx10
+$MF '\mag=magstep(0.5);' input cmssbx10 # 10.95pt
+$MF '\mag=magstep(1);' input cmssbx10 # 12pt
+$MF '\mag=magstep(2);' input cmssbx10 # 14.4pt
+$MF '\mag=magstep(3);' input cmssbx10 # 17.28pt
+$MF '\mag=magstep(4);' input cmssbx10 # 20.74pt
+$MF '\mag=magstep(5);' input cmssbx10 # 24.88pt
+
+# COMPUTER MODERN TYPEWRITER
+$MF '\mag=magstep(-2.58);' input cmtt8 # 5pt
+$MF '\mag=magstep(-1.58);' input cmtt8 # 6pt
+$MF '\mag=magstep(-0.732);' input cmtt8 # 7pt
+$MF '\mag=magstep(0);' input cmtt8
+$MF '\mag=magstep(0);' input cmtt9
+$MF '\mag=magstep(0);' input cmtt10
+$MF '\mag=magstep(0.5);' input cmtt10 # 10.95pt
+$MF '\mag=magstep(0);' input cmtt12
+$MF '\mag=magstep(1);' input cmtt12 # 14.4pt
+$MF '\mag=magstep(2);' input cmtt12 # 17.28pt
+$MF '\mag=magstep(3);' input cmtt12 # 20.74pt
+$MF '\mag=magstep(4);' input cmtt12 # 24.88pt
+
+# COMPUTER MODERN TYPEWRITER SLANTED
+$MF '\mag=magstep(-3.8);' input cmsltt10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmsltt10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmsltt10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmsltt10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmsltt10 # 9pt
+$MF '\mag=magstep(0);' input cmsltt10
+$MF '\mag=magstep(0.5);' input cmsltt10 # 10.95pt
+$MF '\mag=magstep(1);' input cmsltt10 # 12pt
+$MF '\mag=magstep(2);' input cmsltt10 # 14.4pt
+$MF '\mag=magstep(3);' input cmsltt10 # 17.28pt
+$MF '\mag=magstep(4);' input cmsltt10 # 20.74pt
+$MF '\mag=magstep(5);' input cmsltt10 # 24.88pt
+
+# COMPUTER MODERN TYPEWRITER ITALICS
+$MF '\mag=magstep(-3.8);' input cmitt10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmitt10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmitt10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmitt10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmitt10 # 9pt
+$MF '\mag=magstep(0);' input cmitt10
+$MF '\mag=magstep(0.5);' input cmitt10 # 10.95pt
+$MF '\mag=magstep(1);' input cmitt10 # 12pt
+$MF '\mag=magstep(2);' input cmitt10 # 14.4pt
+$MF '\mag=magstep(3);' input cmitt10 # 17.28pt
+$MF '\mag=magstep(4);' input cmitt10 # 20.74pt
+$MF '\mag=magstep(5);' input cmitt10 # 24.88pt
+
+# COMPUTER MODERN TYPEWRITER SMALL CAPS
+$MF '\mag=magstep(-3.8);' input cmtcsc10 # 5pt
+$MF '\mag=magstep(-2.8);' input cmtcsc10 # 6pt
+$MF '\mag=magstep(-1.96);' input cmtcsc10 # 7pt
+$MF '\mag=magstep(-1.22);' input cmtcsc10 # 8pt
+$MF '\mag=magstep(-0.578);' input cmtcsc10 # 9pt
+$MF '\mag=magstep(0);' input cmtcsc10
+$MF '\mag=magstep(0.5);' input cmtcsc10 # 10.95pt
+$MF '\mag=magstep(1);' input cmtcsc10 # 12pt
+$MF '\mag=magstep(2);' input cmtcsc10 # 14.4pt
+$MF '\mag=magstep(3);' input cmtcsc10 # 17.28pt
+$MF '\mag=magstep(4);' input cmtcsc10 # 20.74pt
+$MF '\mag=magstep(5);' input cmtcsc10 # 24.88pt
+
+# COMPUTER MODERN MATH ITALICS
+$MF '\mag=magstep(0);' input cmmi5
+$MF '\mag=magstep(0);' input cmmi6
+$MF '\mag=magstep(0);' input cmmi7
+$MF '\mag=magstep(0);' input cmmi8
+$MF '\mag=magstep(0);' input cmmi9
+$MF '\mag=magstep(0);' input cmmi10
+$MF '\mag=magstep(0.5);' input cmmi10 # 10.95pt
+$MF '\mag=magstep(0);' input cmmi12
+$MF '\mag=magstep(1);' input cmmi12 # 14.4pt
+$MF '\mag=magstep(2);' input cmmi12 # 17.28pt
+$MF '\mag=magstep(3);' input cmmi12 # 20.74pt
+$MF '\mag=magstep(4);' input cmmi12 # 24.88pt
+
+# COMPUTER MODERN MATH BOLD ITALICS
+# (size 5-9 come from the AMSfonts!)
+# N.B. Size 5-9 are required by LaTeX2e.
+# If not available they could be scaled down from cmmib10, but
+# better is to get the AMSfonts distribution.
+$MF '\mag=magstep(0);' input cmmib5
+$MF '\mag=magstep(0);' input cmmib6
+$MF '\mag=magstep(0);' input cmmib7
+$MF '\mag=magstep(0);' input cmmib8
+$MF '\mag=magstep(0);' input cmmib9
+$MF '\mag=magstep(0);' input cmmib10
+$MF '\mag=magstep(0.5);' input cmmib10 # 10.95pt
+$MF '\mag=magstep(1);' input cmmib10 # 12pt
+$MF '\mag=magstep(2);' input cmmib10 # 14.4pt
+$MF '\mag=magstep(3);' input cmmib10 # 17.28pt
+$MF '\mag=magstep(4);' input cmmib10 # 20.74pt
+$MF '\mag=magstep(5);' input cmmib10 # 24.88pt
+
+# COMPUTER MODERN MATH SYMBOLS
+$MF '\mag=magstep(0);' input cmsy5
+$MF '\mag=magstep(0);' input cmsy6
+$MF '\mag=magstep(0);' input cmsy7
+$MF '\mag=magstep(0);' input cmsy8
+$MF '\mag=magstep(0);' input cmsy9
+$MF '\mag=magstep(0);' input cmsy10
+$MF '\mag=magstep(0.5);' input cmsy10 # 10.95pt
+$MF '\mag=magstep(1);' input cmsy10 # 12pt
+$MF '\mag=magstep(2);' input cmsy10 # 14.4pt
+$MF '\mag=magstep(3);' input cmsy10 # 17.28pt
+$MF '\mag=magstep(4);' input cmsy10 # 20.74pt
+$MF '\mag=magstep(5);' input cmsy10 # 24.88pt
+
+# COMPUTER MODERN MATH BOLD SYMBOLS
+# (size 5-9 come from the AMSfonts!)
+# N.B. Size 5-9 are required by LaTeX2e.
+# If not available they could be scaled down from cmbsy10, but
+# better is to get the AMSfonts distribution.
+$MF '\mag=magstep(0);' input cmbsy5
+$MF '\mag=magstep(0);' input cmbsy6
+$MF '\mag=magstep(0);' input cmbsy7
+$MF '\mag=magstep(0);' input cmbsy8
+$MF '\mag=magstep(0);' input cmbsy9
+$MF '\mag=magstep(0);' input cmbsy10
+$MF '\mag=magstep(0.5);' input cmbsy10 # 10.95pt
+$MF '\mag=magstep(1);' input cmbsy10 # 12pt
+$MF '\mag=magstep(2);' input cmbsy10 # 14.4pt
+$MF '\mag=magstep(3);' input cmbsy10 # 17.28pt
+$MF '\mag=magstep(4);' input cmbsy10 # 20.74pt
+$MF '\mag=magstep(5);' input cmbsy10 # 24.88pt
+
+# COMPUTER MODERN LARGE SYMBOLS
+# (size 7-9 come from the AMSfonts! not loaded by standard fd file)
+$MF '\mag=magstep(0);' input cmex7
+$MF '\mag=magstep(0);' input cmex8
+$MF '\mag=magstep(0);' input cmex9
+$MF '\mag=magstep(0);' input cmex10
+$MF '\mag=magstep(2);' input cmex10
+ # the last is needed to typeset the amslatex documentation (amsldoc.tex)
+
+# COMPUTER MODERN FUNNY
+# The fd file only defines 10pt!
+$MF '\mag=magstep(0);' input cmff10
+$MF '\mag=magstep(0.5);' input cmff10 # 10.95pt
+$MF '\mag=magstep(1);' input cmff10 # 12pt
+
+# COMPUTER MODERN FUNNY ITALICS
+# The fd file only defines 10pt!
+$MF '\mag=magstep(0);' input cmfi10
+$MF '\mag=magstep(0.5);' input cmfi10 # 10.95pt
+$MF '\mag=magstep(1);' input cmfi10 # 12pt
+
+# COMPUTER MODERN DUNHILL
+# The fd file only defines 10pt!
+$MF '\mag=magstep(0);' input cmdunh10
+$MF '\mag=magstep(0.5);' input cmdunh10 # 10.95pt
+$MF '\mag=magstep(1);' input cmdunh10 # 12pt
+
+# COMPUTER MODERN FIBONACCI
+# The fd file only defines 8pt!
+$MF '\mag=magstep(0);' input cmfib8
+$MF '\mag=magstep(1.22);' input cmfib8 # 10pt
+
+# COMPUTER MODERN OTHER STUFF
+#
+$MF '\mag=magstep(0);' input cminch
+$MF '\mag=magstep(0);' input cmssq8
+$MF '\mag=magstep(0);' input cmssqi8
+
+# COMPUTER MODERN TeX extended ASCII
+#
+$MF '\mag=magstep(0);' input cmtex8
+$MF '\mag=magstep(0);' input cmtex9
+$MF '\mag=magstep(0);' input cmtex10
+
+
+echo "\
+Metafont finished.\
+"
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file ( *gf )
+ gftopk $file
+end
+
+cat <<EOF
+GFtoPK finished."
+
+To complete the font installation, do the following:
+ copy all .tfm-files into the tfm directory
+ copy all .pk-files into the pk-directory
+ delete all .gf files.
+
+Have a nice day."
+
+EOF
diff --git a/fonts/utilities/makefonts/00previous/mk_cmextrabold b/fonts/utilities/makefonts/00previous/mk_cmextrabold
new file mode 100755
index 0000000000..10f1f27af1
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_cmextrabold
@@ -0,0 +1,76 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ cm-extra-bold (CTAN:fonts/cm/mf-extra/bold/)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 1 Jan 95; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# COMPUTER MODERN EXTRA BOLD
+cmmf "$MFARG"' \mag=magstep(0);' input cmbcsc10
+
+cmmf "$MFARG"' \mag=magstep(0);' input cmbtex10
+
+cmmf "$MFARG"' \mag=magstep(0);' input cmbtt8
+cmmf "$MFARG"' \mag=magstep(0);' input cmbtt9
+cmmf "$MFARG"' \mag=magstep(0);' input cmbtt10
+
+cmmf "$MFARG"' \mag=magstep(0);' input cmttb10
+
+cmmf "$MFARG"' \mag=magstep(0);' input cmexb10
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_cmmore b/fonts/utilities/makefonts/00previous/mk_cmmore
new file mode 100755
index 0000000000..f8636093dd
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_cmmore
@@ -0,0 +1,76 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ computer modern, extra magsteps\
+ (these sizes might not be pre-defined; used by plain?)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Michael Cree, Volker Kuhlmann\
+ 16 August 94; Volker 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# COMPUTER MODERN ROMAN
+cmmf "$MFARG"' \mag=magstep(1);' input cmr10
+cmmf "$MFARG"' \mag=magstep(2);' input cmr10
+cmmf "$MFARG"' \mag=magstep(3);' input cmr10
+cmmf "$MFARG"' \mag=magstep(4);' input cmr10
+cmmf "$MFARG"' \mag=magstep(5);' input cmr10
+
+# COMPUTER MODERN BOLD EXTENDED
+cmmf "$MFARG"' \mag=magstep(1);' input cmbx10
+cmmf "$MFARG"' \mag=magstep(2);' input cmbx10
+cmmf "$MFARG"' \mag=magstep(3);' input cmbx10
+cmmf "$MFARG"' \mag=magstep(4);' input cmbx10
+cmmf "$MFARG"' \mag=magstep(5);' input cmbx10
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_etc b/fonts/utilities/makefonts/00previous/mk_etc
new file mode 100755
index 0000000000..322a1dde1d
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_etc
@@ -0,0 +1,150 @@
+#!/bin/csh -f
+
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ etc - see what you get :-)\
+ capbas package (7 fonts in here)\
+ duerer package (6 fonts in here)\
+ twcal package\
+ va package\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann \
+ 28 March 1997\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+# CHANGELOG
+#
+# 28 Mar 97 (VK)
+# Created.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# ASCII package (does not actually have any .mf files with it)
+if ( 0 && "$2" == "" || `echo $argv[2-] | grep -w ascii` != "" ) then
+mf "$MFARG"' \mag=magstep(0);' input ascii-10
+mf "$MFARG"' \mag=magstep(0.5);' input ascii-10
+mf "$MFARG"' \mag=magstep(1);' input ascii-10
+mf "$MFARG"' \mag=magstep(2);' input ascii-10
+mf "$MFARG"' \mag=magstep(3);' input ascii-10
+mf "$MFARG"' \mag=magstep(4);' input ascii-10
+mf "$MFARG"' \mag=magstep(5);' input ascii-10
+endif
+
+# CAPBAS package
+if ( "$2" == "" || `echo $argv[2-] | grep -w capbas` != "" ) then
+mf "$MFARG"' \mag=magstep(0);' input capbas
+mf "$MFARG"' \mag=magstep(0);' input capbasd
+mf "$MFARG"' \mag=magstep(0);' input d7seg
+mf "$MFARG"' \mag=magstep(0);' input deseg
+mf "$MFARG"' \mag=magstep(0);' input flyspec
+mf "$MFARG"' \mag=magstep(0);' input necker
+mf "$MFARG"' \mag=magstep(0);' input simfon
+endif
+
+# DUERER package
+if ( "$2" == "" || `echo $argv[2-] | grep -w duerer` != "" ) then
+mf "$MFARG"' \mag=magstep(0);' input cdb10
+mf "$MFARG"' \mag=magstep(0);' input cdi10
+mf "$MFARG"' \mag=magstep(0);' input cdr10
+mf "$MFARG"' \mag=magstep(0);' input cdsl10
+mf "$MFARG"' \mag=magstep(0);' input cdss10
+mf "$MFARG"' \mag=magstep(0);' input cdtt10
+endif
+
+# HERSHEY package
+# script, and 3 styles of gothic
+if ( "$2" == "" || `echo $argv[2-] | grep -w hershey` != "" ) then
+echo "NOTE: need to make hgoe.mf, hgog.mf, hgoi.mf first\!\!\!"
+echo " Use the patch for the makefile, and run:"
+echo " make"
+echo " ./xhershey -X hgoe.spec > hgoe.mf [for each {hgoe,hgog,hgoi}]"
+cmmf "$MFARG"' \mag=magstep(0);' input hscs10
+cmmf "$MFARG"' \mag=magstep(0);' input hgoe10
+cmmf "$MFARG"' \mag=magstep(0);' input hgog10
+cmmf "$MFARG"' \mag=magstep(0);' input hgoi10
+endif
+
+# TWCAL package
+if ( "$2" == "" || `echo $argv[2-] | grep -w twcal` != "" ) then
+mf "$MFARG"' \mag=magstep(0);' input twcal14
+mf "$MFARG"' \mag=magstep(0.5);' input twcal14
+mf "$MFARG"' \mag=magstep(1);' input twcal14
+mf "$MFARG"' \mag=magstep(2);' input twcal14
+mf "$MFARG"' \mag=magstep(3);' input twcal14
+mf "$MFARG"' \mag=magstep(4);' input twcal14
+mf "$MFARG"' \mag=magstep(5);' input twcal14
+endif
+
+# VA package
+if ( "$2" == "" || `echo $argv[2-] | grep -w va` != "" ) then
+# The magsteps -3, -2.5, -2, -1.5, -1, 0, 1, 2, 3 are for making the
+# standard TeX sizes from a 14.4pt font.
+# ca/vacal are 14pt - calculate again...
+mf "$MFARG"' \mag=343/600;' input va14 # 8.33pt
+mf "$MFARG"' \mag=386/600;' input va14 # 9.13pt
+mf "$MFARG"' \mag=429/600;' input va14 # 10pt
+mf "$MFARG"' \mag=469/600;' input va14 # 10.95pt
+mf "$MFARG"' \mag=514/600;' input va14 # 12pt
+mf "$MFARG"' \mag=617/600;' input va14 # 14.4pt [14pt!]
+mf "$MFARG"' \mag=741/600;' input va14 # 17.28pt
+mf "$MFARG"' \mag=889/600;' input va14 # 20.74pt
+mf "$MFARG"' \mag=1066/600;' input va14 # 24.88pt
+#
+mf "$MFARG"' \mag=343/600;' input vacal14 # 8.33pt
+mf "$MFARG"' \mag=386/600;' input vacal14 # 9.13pt
+mf "$MFARG"' \mag=429/600;' input vacal14 # 10pt
+mf "$MFARG"' \mag=469/600;' input vacal14 # 10.95pt
+mf "$MFARG"' \mag=514/600;' input vacal14 # 12pt
+mf "$MFARG"' \mag=617/600;' input vacal14 # 14.4pt [14pt!]
+mf "$MFARG"' \mag=741/600;' input vacal14 # 17.28pt
+mf "$MFARG"' \mag=889/600;' input vacal14 # 20.74pt
+mf "$MFARG"' \mag=1066/600;' input vacal14 # 24.88pt
+endif
+
+#
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ echo $file
+ gftopk $file
+end
+#ls *gf | xargs -n 1 gftopk
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_gothic b/fonts/utilities/makefonts/00previous/mk_gothic
new file mode 100755
index 0000000000..b1ebcc5f15
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_gothic
@@ -0,0 +1,118 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ gothic: ygoth, yfrak, yswab, yinit (as of oldgerm.dtx)\
+ gothic: suet14, schwell\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann \
+ 9, 16, 21 July 94; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added sueterlin, schwell.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1. Using \scrollmode;.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# INITIAL
+mf "$MFARG"' \mag=magstep(0);' input yinitas # 38.6pt
+mf "$MFARG"' \mag=magstep(1);' input yinitas # 46.5pt
+mf "$MFARG"' \mag=magstep(2);' input yinitas # 55.7pt
+mf "$MFARG"' \mag=magstep(3);' input yinitas # 66.9pt
+mf "$MFARG"' \mag=magstep(4);' input yinitas # 80.0pt
+mf "$MFARG"' \mag=magstep(5);' input yinitas # 96.4pt
+
+# GOTHIC, also TEXTUR
+mf "$MFARG"' \mag=magstep(0);' input ygoth
+mf "$MFARG"' \mag=magstep(1);' input ygoth # 12pt
+mf "$MFARG"' \mag=magstep(2);' input ygoth # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input ygoth # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input ygoth # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input ygoth # 24.88pt
+
+# FRAKTUR
+mf "$MFARG"' \mag=magstep(0);' input yfrak
+mf "$MFARG"' \mag=magstep(1);' input yfrak # 12pt
+mf "$MFARG"' \mag=magstep(2);' input yfrak # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input yfrak # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input yfrak # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input yfrak # 24.88pt
+
+# SCHWABACHER
+mf "$MFARG"' \mag=magstep(0);' input yswab
+mf "$MFARG"' \mag=magstep(1);' input yswab # 12pt
+mf "$MFARG"' \mag=magstep(2);' input yswab # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input yswab # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input yswab # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input yswab # 24.88pt
+
+# SUETERLIN
+# (only some sizes)
+mf "$MFARG"' \mag=magstep(0);' input suet14
+mf "$MFARG"' \mag=magstep(1);' input suet14 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input suet14 # 14.4pt
+#mf "$MFARG"' \mag=magstep(3);' input suet14 # 17.28pt
+#mf "$MFARG"' \mag=magstep(4);' input suet14 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input suet14 # 24.88pt
+
+# SCHWELL
+# (only some sizes)
+mf "$MFARG"' \mag=magstep(0);' input schwell
+mf "$MFARG"' \mag=magstep(1);' input schwell # 12pt
+mf "$MFARG"' \mag=magstep(2);' input schwell # 14.4pt
+#mf "$MFARG"' \mag=magstep(3);' input schwell # 17.28pt
+#mf "$MFARG"' \mag=magstep(4);' input schwell # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input schwell # 24.88pt
+
+# CMFRAK
+# (only gothic font in dc encoding)
+# ... left for later ...
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_karta b/fonts/utilities/makefonts/00previous/mk_karta
new file mode 100755
index 0000000000..01a1089695
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_karta
@@ -0,0 +1,65 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ karta\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Created.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# KARTA
+mf "$MFARG"' \mag=magstep(0);' input karta15 # 15pt
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_latex b/fonts/utilities/makefonts/00previous/mk_latex
new file mode 100755
index 0000000000..51e863b674
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_latex
@@ -0,0 +1,109 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ lcircle, lcirclew, line, linew, lasy, lasyb\
+ (required by LaTeX2e)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Michael Cree, Volker Kuhlmann\
+ 9 July 94; Volker 1 Jan 94; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 22 ct 96 (VK)
+# Added comments about missing slide fonts.
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# LaTeX font: lcircle
+mf "$MFARG"' \mag=magstep(0);' input lcircle10
+
+# LaTeX font: lcirclew
+mf "$MFARG"' \mag=magstep(0);' input lcirclew10
+
+# LaTeX font: line
+mf "$MFARG"' \mag=magstep(0);' input line10
+
+# LaTeX font: linew
+mf "$MFARG"' \mag=magstep(0);' input linew10
+
+# LaTeX font: lasy
+mf "$MFARG"' \mag=magstep(0);' input lasy5
+mf "$MFARG"' \mag=magstep(0);' input lasy6
+mf "$MFARG"' \mag=magstep(0);' input lasy7
+mf "$MFARG"' \mag=magstep(0);' input lasy8
+mf "$MFARG"' \mag=magstep(0);' input lasy9
+mf "$MFARG"' \mag=magstep(0);' input lasy10
+mf "$MFARG"' \mag=magstep(0.5);' input lasy10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input lasy10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input lasy10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input lasy10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input lasy10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input lasy10 # 24.88pt
+
+# LaTeX font: lasyb
+mf "$MFARG"' \mag=magstep(0);' input lasyb10
+mf "$MFARG"' \mag=magstep(0.5);' input lasyb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input lasyb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input lasyb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input lasyb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input lasyb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input lasyb10 # 24.88pt
+
+# LaTeX fonts: sans serif, sans serif bold, sans serif italics
+mf "$MFARG"' \mag=magstep(0);' input lcmss8
+mf "$MFARG"' \mag=magstep(0);' input lcmssb8
+mf "$MFARG"' \mag=magstep(0);' input lcmssi8
+
+# LaTeX slide fonts missing (and prob others too)
+# Who can tell me which fonts are actually used by LaTeX?
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_musixtex0.63 b/fonts/utilities/makefonts/00previous/mk_musixtex0.63
new file mode 100755
index 0000000000..1fee113ac0
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_musixtex0.63
@@ -0,0 +1,56 @@
+#!/bin/tcsh -f
+# need csh because of foreach used for running gftopk
+
+echo ""
+echo "This script runs metafont and gftopk to produce the "
+echo "following fonts / family / shapes:"
+echo " musixtex"
+echo ""
+echo "Volker Kuhlmann 15 Mar 95"
+echo "volker@elec.canterbury.ac.nz"
+echo ""
+
+
+# Fonts for MusixTeX
+mf '\mode=localfont; \mag=magstep(0);' input musix11
+mf '\mode=localfont; \mag=magstep(0);' input musix13
+mf '\mode=localfont; \mag=magstep(0);' input musix16
+mf '\mode=localfont; \mag=magstep(0);' input musix20
+mf '\mode=localfont; \mag=magstep(0);' input musixsps
+mf '\mode=localfont; \mag=magstep(0);' input xsld16
+mf '\mode=localfont; \mag=magstep(0);' input xsld20
+mf '\mode=localfont; \mag=magstep(0);' input xslhd16
+mf '\mode=localfont; \mag=magstep(0);' input xslhd20
+mf '\mode=localfont; \mag=magstep(0);' input xslhu16
+mf '\mode=localfont; \mag=magstep(0);' input xslhu20
+mf '\mode=localfont; \mag=magstep(0);' input xslhz20
+mf '\mode=localfont; \mag=magstep(0);' input xslu16
+mf '\mode=localfont; \mag=magstep(0);' input xslu20
+mf '\mode=localfont; \mag=magstep(0);' input xslz20
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_musixtex0.631 b/fonts/utilities/makefonts/00previous/mk_musixtex0.631
new file mode 100755
index 0000000000..83cd09fabe
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_musixtex0.631
@@ -0,0 +1,56 @@
+#!/bin/tcsh -f
+# need csh because of foreach used for running gftopk
+
+echo ""
+echo "This script runs metafont and gftopk to produce the "
+echo "following fonts / family / shapes:"
+echo " musixtex 0.631"
+echo ""
+echo "Volker Kuhlmann 21 Mar 95"
+echo "volker@elec.canterbury.ac.nz"
+echo ""
+
+
+# Fonts for MusixTeX 0.631
+mf '\mode=localfont; \mag=magstep(0);' input musix11
+mf '\mode=localfont; \mag=magstep(0);' input musix13
+mf '\mode=localfont; \mag=magstep(0);' input musix16
+mf '\mode=localfont; \mag=magstep(0);' input musix20
+mf '\mode=localfont; \mag=magstep(0);' input musixsps
+mf '\mode=localfont; \mag=magstep(0);' input xhsld16
+mf '\mode=localfont; \mag=magstep(0);' input xhsld20
+mf '\mode=localfont; \mag=magstep(0);' input xhslu16
+mf '\mode=localfont; \mag=magstep(0);' input xhslu20
+mf '\mode=localfont; \mag=magstep(0);' input xsld16
+mf '\mode=localfont; \mag=magstep(0);' input xsld20
+mf '\mode=localfont; \mag=magstep(0);' input xslu16
+mf '\mode=localfont; \mag=magstep(0);' input xslu20
+mf '\mode=localfont; \mag=magstep(0);' input xslz20
+mf '\mode=localfont; \mag=magstep(0);' input xtie20
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_musixtexT.58 b/fonts/utilities/makefonts/00previous/mk_musixtexT.58
new file mode 100755
index 0000000000..7458f65834
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_musixtexT.58
@@ -0,0 +1,111 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+#
+# mk_musixtexT.58 METAFONTMODE
+#
+# This shell script is part of the makefonts package, which is a set of
+# shell scripts used for running metafont to generate fonts (tfm and pk
+# files) for use with TeX/LaTeX.
+# Please refer to the makefonts README file.
+# Volker Kuhlmann
+#
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ musixtex T.58\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Michael Cree, Volker Kuhlmann\
+ 15, 21 Mar 95; 20,24 Sep 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 24 Sep 96 (VK)
+# Corrected and added some comments.
+# 20 Sep 96 (VK)
+# Updated for musixtex T.58.
+# 21 Mar 95 (VK)
+# Updated for musixtex 0.631.
+# 15 Mar 95 (VK)
+# Created for musixtex 0.63.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# musixtex fonts
+mf "$MFARG"' \mag=magstep(0);' input musix11
+mf "$MFARG"' \mag=magstep(0);' input musix13
+mf "$MFARG"' \mag=magstep(0);' input musix16
+mf "$MFARG"' \mag=magstep(0);' input musix20
+#
+mf "$MFARG"' \mag=magstep(0);' input musixsps
+mf "$MFARG"' \mag=magstep(0);' input musixspx
+#
+mf "$MFARG"' \mag=magstep(0);' input xsld11
+mf "$MFARG"' \mag=magstep(0);' input xsld13
+mf "$MFARG"' \mag=magstep(0);' input xsld16
+mf "$MFARG"' \mag=magstep(0);' input xsld20
+#
+mf "$MFARG"' \mag=magstep(0);' input xslhd11
+mf "$MFARG"' \mag=magstep(0);' input xslhd13
+mf "$MFARG"' \mag=magstep(0);' input xslhd16
+mf "$MFARG"' \mag=magstep(0);' input xslhd20
+#
+mf "$MFARG"' \mag=magstep(0);' input xslhu11
+mf "$MFARG"' \mag=magstep(0);' input xslhu13
+mf "$MFARG"' \mag=magstep(0);' input xslhu16
+mf "$MFARG"' \mag=magstep(0);' input xslhu20
+#
+mf "$MFARG"' \mag=magstep(0);' input xslhz20
+#
+mf "$MFARG"' \mag=magstep(0);' input xslu11
+mf "$MFARG"' \mag=magstep(0);' input xslu13
+mf "$MFARG"' \mag=magstep(0);' input xslu16
+mf "$MFARG"' \mag=magstep(0);' input xslu20
+#
+mf "$MFARG"' \mag=magstep(0);' input xslz20
+#
+mf "$MFARG"' \mag=magstep(0);' input xtie20
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into your tfm directory"
+echo " copy all .pk-files into your pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_pandora b/fonts/utilities/makefonts/00previous/mk_pandora
new file mode 100755
index 0000000000..ee62778c2f
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_pandora
@@ -0,0 +1,154 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ mfnfss: pandora (as of pandora.dtx)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 9 July 94; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# Added pntt 10,11,12pt. Note: no fd files for pntt!
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# PANDORA ROMAN
+mf "$MFARG"' \mag=magstep(-3.8);' input pnr10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnr10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnr10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnr10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnr10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnr10
+mf "$MFARG"' \mag=magstep(0.5);' input pnr10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnr10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnr10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnr10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnr10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnr10 # 24.88pt
+
+# PANDORA ROMAN BOLD
+mf "$MFARG"' \mag=magstep(-3.8);' input pnb10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnb10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnb10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnb10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnb10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnb10
+mf "$MFARG"' \mag=magstep(0.5);' input pnb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnb10 # 24.88pt
+
+# PANDORA ROMAN SLANTED
+mf "$MFARG"' \mag=magstep(-3.8);' input pnsl10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnsl10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnsl10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnsl10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnsl10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnsl10
+mf "$MFARG"' \mag=magstep(0.5);' input pnsl10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnsl10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnsl10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnsl10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnsl10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnsl10 # 24.88pt
+
+# PANDORA SANS
+mf "$MFARG"' \mag=magstep(-3.8);' input pnss10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnss10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnss10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnss10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnss10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnss10
+mf "$MFARG"' \mag=magstep(0.5);' input pnss10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnss10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnss10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnss10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnss10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnss10 # 24.88pt
+
+# PANDORA SANS BOLD
+mf "$MFARG"' \mag=magstep(-3.8);' input pnssb10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnssb10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnssb10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnssb10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnssb10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnssb10
+mf "$MFARG"' \mag=magstep(0.5);' input pnssb10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnssb10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnssb10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnssb10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnssb10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnssb10 # 24.88pt
+
+# PANDORA SANS SLANTED
+mf "$MFARG"' \mag=magstep(-3.8);' input pnssi10 # 5pt
+mf "$MFARG"' \mag=magstep(-2.8);' input pnssi10 # 6pt
+mf "$MFARG"' \mag=magstep(-1.96);' input pnssi10 # 7pt
+mf "$MFARG"' \mag=magstep(-1.22);' input pnssi10 # 8pt
+mf "$MFARG"' \mag=magstep(-0.578);' input pnssi10 # 9pt
+mf "$MFARG"' \mag=magstep(0);' input pnssi10
+mf "$MFARG"' \mag=magstep(0.5);' input pnssi10 # 10.95pt
+mf "$MFARG"' \mag=magstep(1);' input pnssi10 # 12pt
+mf "$MFARG"' \mag=magstep(2);' input pnssi10 # 14.4pt
+mf "$MFARG"' \mag=magstep(3);' input pnssi10 # 17.28pt
+mf "$MFARG"' \mag=magstep(4);' input pnssi10 # 20.74pt
+mf "$MFARG"' \mag=magstep(5);' input pnssi10 # 24.88pt
+
+# PANDORA TYPEWRITER
+mf "$MFARG"' \mag=magstep(0);' input pntt9
+mf "$MFARG"' \mag=magstep(0.182);' input pntt9 # 10pt
+mf "$MFARG"' \mag=magstep(1.076);' input pntt9 # 10.95pt
+mf "$MFARG"' \mag=magstep(1.578);' input pntt9 # 12pt
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_rsfs b/fonts/utilities/makefonts/00previous/mk_rsfs
new file mode 100755
index 0000000000..7883b5e857
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_rsfs
@@ -0,0 +1,69 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ rsfs (Ralph Smith's Formal Script Symbol Fonts)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 16 Mar 95; 8 Apr 95; 12 Oct 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# Ralph Smith's Formal Script Symbol Fonts
+cmmf "$MFARG"' \mag=magstep(0);' input rsfs5
+cmmf "$MFARG"' \mag=magstep(0);' input rsfs7
+cmmf "$MFARG"' \mag=magstep(0);' input rsfs10
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_stmaryrd b/fonts/utilities/makefonts/00previous/mk_stmaryrd
new file mode 100755
index 0000000000..abd90c9804
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_stmaryrd
@@ -0,0 +1,74 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ stmaryrd (St Mary Road)\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 05 Feb 95; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# St Mary Road
+cmmf "$MFARG"' \mag=magstep(0);' input stmary5
+cmmf "$MFARG"' \mag=magstep(0);' input stmary6
+cmmf "$MFARG"' \mag=magstep(0);' input stmary7
+cmmf "$MFARG"' \mag=magstep(0);' input stmary8
+cmmf "$MFARG"' \mag=magstep(0);' input stmary9
+cmmf "$MFARG"' \mag=magstep(0);' input stmary10
+cmmf "$MFARG"' \mag=magstep(0.5);' input stmary10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input stmary10 # 12pt
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_utility b/fonts/utilities/makefonts/00previous/mk_utility
new file mode 100755
index 0000000000..1c750053d1
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_utility
@@ -0,0 +1,106 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ utilityfonts\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 21 July 94; 8 Jan 95; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1. Using \scrollmode.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# LOGO
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input logo8
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input logo9
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input logo10
+mf "$MFARG"' \scrollmode; \mag=magstep(0.5);' input logo10 # 10.95pt
+mf "$MFARG"' \scrollmode; \mag=magstep(1);' input logo10 # 12pt
+mf "$MFARG"' \scrollmode; \mag=magstep(2);' input logo10 # 14.4pt
+mf "$MFARG"' \scrollmode; \mag=magstep(3);' input logo10 # 17.28pt
+mf "$MFARG"' \scrollmode; \mag=magstep(4);' input logo10 # 20.74pt
+mf "$MFARG"' \scrollmode; \mag=magstep(5);' input logo10 # 24.88pt
+
+# LOGO BOLD
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input logobf10
+mf "$MFARG"' \scrollmode; \mag=magstep(0.5);' input logobf10 # 10.95pt
+mf "$MFARG"' \scrollmode; \mag=magstep(1);' input logobf10 # 12pt
+mf "$MFARG"' \scrollmode; \mag=magstep(2);' input logobf10 # 14.4pt
+mf "$MFARG"' \scrollmode; \mag=magstep(3);' input logobf10 # 17.28pt
+mf "$MFARG"' \scrollmode; \mag=magstep(4);' input logobf10 # 20.74pt
+mf "$MFARG"' \scrollmode; \mag=magstep(5);' input logobf10 # 24.88pt
+
+# LOGO SLANTED
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input logosl10
+mf "$MFARG"' \scrollmode; \mag=magstep(0.5);' input logosl10 # 10.95pt
+mf "$MFARG"' \scrollmode; \mag=magstep(1);' input logosl10 # 12pt
+mf "$MFARG"' \scrollmode; \mag=magstep(2);' input logosl10 # 14.4pt
+mf "$MFARG"' \scrollmode; \mag=magstep(3);' input logosl10 # 17.28pt
+mf "$MFARG"' \scrollmode; \mag=magstep(4);' input logosl10 # 20.74pt
+mf "$MFARG"' \scrollmode; \mag=magstep(5);' input logosl10 # 24.88pt
+
+# MANFNT
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input manfnt
+
+# GRAY
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input grayf
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input gresp
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input lgresp
+
+# BLACK
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input blesp
+
+# HALF
+mf "$MFARG"' \scrollmode; \mag=magstep(0);' input halftone
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/00previous/mk_wasy b/fonts/utilities/makefonts/00previous/mk_wasy
new file mode 100755
index 0000000000..9bbad904f2
--- /dev/null
+++ b/fonts/utilities/makefonts/00previous/mk_wasy
@@ -0,0 +1,87 @@
+#!/bin/csh -f
+# need csh because of foreach used for running gftopk
+
+echo "\
+This script runs metafont and gftopk to produce the \
+following fonts / family / shapes:\
+\
+ *********************************************************\
+ wasy2\
+ *********************************************************\
+\
+Give metafont mode as first argument (default = localfont)\
+\
+Volker Kuhlmann\
+ 7 Jan 95; 8 Apr 95; 8 Apr 96\
+v.kuhlmann@elec.canterbury.ac.nz\
+"
+
+
+# CHANGELOG
+#
+# 8 Apr 96 (VK)
+# Added \scrollmode. Fixed docs.
+# 8 Apr 95 (VK)
+# Metafont mode can now be given as $1.
+
+
+if ( $#argv > 0 ) set MODE=$1
+if ( ! $?MODE ) set MODE=localfont
+echo ""
+echo "**********************************"
+echo 'metafont mode is set to: '$MODE
+echo "**********************************"
+echo ""
+
+set MFARG='\mode='"$MODE"'; \scrollmode;'
+
+
+# WASY
+cmmf "$MFARG"' \mag=magstep(0);' input wasy5
+cmmf "$MFARG"' \mag=magstep(0);' input wasy6
+cmmf "$MFARG"' \mag=magstep(0);' input wasy7
+cmmf "$MFARG"' \mag=magstep(0);' input wasy8
+cmmf "$MFARG"' \mag=magstep(0);' input wasy9
+cmmf "$MFARG"' \mag=magstep(0);' input wasy10
+cmmf "$MFARG"' \mag=magstep(0.5);' input wasy10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input wasy10 # 12pt
+cmmf "$MFARG"' \mag=magstep(2);' input wasy10 # 14.4pt
+cmmf "$MFARG"' \mag=magstep(3);' input wasy10 # 17.28pt
+cmmf "$MFARG"' \mag=magstep(4);' input wasy10 # 20.74pt
+cmmf "$MFARG"' \mag=magstep(5);' input wasy10 # 24.88pt
+
+# WASY BOLD
+cmmf "$MFARG"' \mag=magstep(0);' input wasyb10
+cmmf "$MFARG"' \mag=magstep(0.5);' input wasyb10 # 10.95pt
+cmmf "$MFARG"' \mag=magstep(1);' input wasyb10 # 12pt
+cmmf "$MFARG"' \mag=magstep(2);' input wasyb10 # 14.4pt
+cmmf "$MFARG"' \mag=magstep(3);' input wasyb10 # 17.28pt
+cmmf "$MFARG"' \mag=magstep(4);' input wasyb10 # 20.74pt
+cmmf "$MFARG"' \mag=magstep(5);' input wasyb10 # 24.88pt
+
+
+
+echo ""
+echo "Metafont finished."
+echo ""
+
+
+
+echo "Now running GFtoPK."
+
+# note this requires csh or tcsh
+foreach file (*gf)
+ gftopk $file
+end
+
+echo "GFtoPK finished."
+echo ""
+
+echo ""
+echo "To complete the font installation, do the following:"
+echo " copy all .tfm-files into the tfm directory"
+echo " copy all .pk-files into the pk-directory"
+echo " delete all .gf files."
+echo ""
+echo "Have a nice day."
+echo ""
diff --git a/fonts/utilities/makefonts/README b/fonts/utilities/makefonts/README
new file mode 100644
index 0000000000..149a8bd53b
--- /dev/null
+++ b/fonts/utilities/makefonts/README
@@ -0,0 +1,58 @@
+ GENERATING TFM/PK FONTS FOR TeX/LaTeX
+ =====================================
+
+[This is makefonts release 2.0, 07 Nov 1999]
+
+Although contemporary TeX-systems support automatic generation of tfm and pk
+files from metafont sources, which is a very convenient feature indeed, I still
+prefer to have a set of basic fonts already on a system. I find this useful in
+a server-client environment where I do not want to make the texmf tree
+writable, and where I would like to avoid fonts being generated in /tmp/ on
+each individual client.
+
+This package contains a set of Unix shell scripts which generate a LaTeX
+document and run dvips on it, causing all fonts used to be generated. Files are
+derived from a script called allcm, which may have come from teTeX (there is no
+author in there), and which is not on CTAN. allcm misses some fonts, so I
+include it for convenience/reference, but make_cm should be used instead.
+
+The files in the distribution are:
+
+ 00previous The previous makefonts distribution. Not all scripts have been
+ converted, so the info therein might still be useful.
+ README This file
+ allcm As I got it
+ allec -> allcm As I got it
+
+ make_ams AMS symbol and euler
+ make_cm cm
+ make_cm -ec cm with T1 encoding (ec fonts)
+ make_concrete -ec cc with T1 encoding
+ make_gothic gothic type fonts - not finished yet
+ make_latex latex
+ make_mflogo metafont/metapost logo
+ make_pandora pandora
+ make_rsfs rsfs (uppercase script)
+ make_slitex latex slide
+ make_stmaryrd stmaryrd (a symbol font)
+ make_wasy wasy (a symbol font)
+
+AUTHOR:
+ Volker Kuhlmann
+ University of Canterbury
+ Dept of Electrical and Electronic Engineering
+ Private Bag
+ Christchurch, New Zealand
+
+ Email: v.kuhlmann@elec.canterbury.ac.nz
+
+COPYRIGHT:
+ none
+
+This material is not copyrighted. It is provided with the hope that it will be
+useful. Any feedback (positive, negative, constructive preferred) is
+appreciated.
+
+Have fun, and good luck!
+
+Volker
diff --git a/fonts/utilities/makefonts/allcm b/fonts/utilities/makefonts/allcm
new file mode 100755
index 0000000000..45975ce798
--- /dev/null
+++ b/fonts/utilities/makefonts/allcm
@@ -0,0 +1,106 @@
+#!/bin/sh
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+progname=`basename $0`
+
+case "$progname" in
+ allec)
+ encoding=T1;;
+ *)
+ encoding=OT1;;
+esac
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c}
+ \newcommand{\mytext}{text $\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+
+ \newcommand{\TestSizes}{{%
+ \tiny \mytext\scriptsize \mytext\footnotesize \mytext\small \mytext
+ \normalsize \mytext
+ \large \mytext\Large \mytext\LARGE \mytext\huge \mytext\Huge \mytext}}
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\TestRM\TestSF\TestTT\newline}
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC}
+ \begin{document}
+ \TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$encoding']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+head 10 > allcm10.tex
+head 11 > allcm11.tex
+head 12 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/allec b/fonts/utilities/makefonts/allec
new file mode 100755
index 0000000000..45975ce798
--- /dev/null
+++ b/fonts/utilities/makefonts/allec
@@ -0,0 +1,106 @@
+#!/bin/sh
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+progname=`basename $0`
+
+case "$progname" in
+ allec)
+ encoding=T1;;
+ *)
+ encoding=OT1;;
+esac
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c}
+ \newcommand{\mytext}{text $\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+
+ \newcommand{\TestSizes}{{%
+ \tiny \mytext\scriptsize \mytext\footnotesize \mytext\small \mytext
+ \normalsize \mytext
+ \large \mytext\Large \mytext\LARGE \mytext\huge \mytext\Huge \mytext}}
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\TestRM\TestSF\TestTT\newline}
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC}
+ \begin{document}
+ \TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$encoding']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+head 10 > allcm10.tex
+head 11 > allcm11.tex
+head 12 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_ams b/fonts/utilities/makefonts/make_ams
new file mode 100755
index 0000000000..1a4b2538de
--- /dev/null
+++ b/fonts/utilities/makefonts/make_ams
@@ -0,0 +1,143 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# ams with packages amssymb, euscript
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 5, 6 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+case "$1" in
+ -ec|-t1)
+ encoding=T1
+ shift
+ ;;
+ *)
+ encoding=OT1
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \usepackage{amssymb}
+ %\usepackage{eufrak}
+ \usepackage[mathscr]{euscript}
+
+ \begin{document}
+ \renewcommand{\myformula}{\mathfrak{A}\mathscr{A}%
+ \mathbb{A}\Cup\hbar\sum}
+ \TestShapes
+ \boldmath\TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 $encoding > allcm10.tex
+head 11 $encoding > allcm11.tex
+head 12 $encoding > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_cm b/fonts/utilities/makefonts/make_cm
new file mode 100755
index 0000000000..60593e41a2
--- /dev/null
+++ b/fonts/utilities/makefonts/make_cm
@@ -0,0 +1,149 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# cm
+# Based on the script allcm (allec) from an unknown source (teTeX?).
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+progname=`basename $0`
+
+case "$progname" in
+ allec)
+ encoding=T1;;
+ *)
+ encoding=OT1;;
+esac
+
+case "$1" in
+ -ec|-t1)
+ encoding=T1
+ shift
+ ;;
+ *)
+ true; # encoding=OT1
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ %\usepackage{}
+
+ \begin{document}
+ \TestShapes
+ \boldmath\TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 $encoding > allcm10.tex
+head 11 $encoding > allcm11.tex
+head 12 $encoding > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_concrete b/fonts/utilities/makefonts/make_concrete
new file mode 100755
index 0000000000..ee2ec90a9d
--- /dev/null
+++ b/fonts/utilities/makefonts/make_concrete
@@ -0,0 +1,138 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# concrete, concmath with package ccfonts
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+case "$1" in
+ -ec|-t1)
+ encoding=T1
+ shift
+ ;;
+ *)
+ encoding=OT1
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \usepackage{ccfonts}
+
+ \begin{document}
+ \TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 $encoding > allcm10.tex
+head 11 $encoding > allcm11.tex
+head 12 $encoding > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_gothic b/fonts/utilities/makefonts/make_gothic
new file mode 100755
index 0000000000..9d73a1a997
--- /dev/null
+++ b/fonts/utilities/makefonts/make_gothic
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# ygoth, yfrak, yswap with package mfnfss/oldgerm
+# #yinit
+# #cmfrak (no package available)
+# #sueterlin with package fundus/sueterl
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 7 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c}
+ \newcommand{\mytext}{text}
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ %\usepackage{pandora} % bundle mfnfss
+ \usepackage{oldgerm} % bundle mfnfss
+
+ \begin{document}
+ %\TestShapes
+ \let\rmfamily=\frakfamily\TextShapes
+ \let\rmfamily=\gothfamily\TextShapes
+ \let\rmfamily=\swabfamily\TextShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Calling latex... <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_latex b/fonts/utilities/makefonts/make_latex
new file mode 100755
index 0000000000..43db5b7f26
--- /dev/null
+++ b/fonts/utilities/makefonts/make_latex
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# latex, latex symbol with package latexsym
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \newcommand{\mylatexformula}{\lhd\hbox{\boldmath$\lhd$}\ }
+ \newcommand{\latexpict}{\begin{picture}(10,10)(0,0)
+ \vector(3,1){4.8}\circle{5}\end{picture}}
+ \newcommand{\mylatextext}{\par Az
+ \thinlines\latexpict \thicklines\latexpict}
+ \newcommand{\LatexShapes}{%
+ \let\myformula=\mylatexformula \let\mytext=\mylatextext \TestShapes}
+
+ \usepackage{latexsym}
+
+ \begin{document}
+ %\TestShapes
+ \LatexShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ #echo '\documentclass['$1'pt]{slides}'
+ # slides must be separate fromlatex because it interferes with lasy, lasyb
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_mflogo b/fonts/utilities/makefonts/make_mflogo
new file mode 100755
index 0000000000..9384fe171a
--- /dev/null
+++ b/fonts/utilities/makefonts/make_mflogo
@@ -0,0 +1,148 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# logo with package mflogo
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 7 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+progname=`basename $0`
+
+case "$progname" in
+ allec)
+ encoding=T1;;
+ *)
+ encoding=OT1;;
+esac
+
+case "$1" in
+ -ec|-t1)
+ encoding=T1
+ shift
+ ;;
+ *)
+ true; # encoding=OT1
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \usepackage{mflogo}
+
+ \begin{document}
+ \let\mytext=\MF
+ \TestShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 $encoding > allcm10.tex
+head 11 $encoding > allcm11.tex
+head 12 $encoding > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_pandora b/fonts/utilities/makefonts/make_pandora
new file mode 100755
index 0000000000..e6973144fb
--- /dev/null
+++ b/fonts/utilities/makefonts/make_pandora
@@ -0,0 +1,131 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# pandora with package mfnfss
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \usepackage{pandora} % package mfnfss
+ %\usepackage{oldgerm} % package mfnfss
+
+ \begin{document}
+ %\TestShapes
+ \TextShapes
+ %\gothfamily\TextShapes \swabfamily\TextShapes \frakfamily\TextShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_rsfs b/fonts/utilities/makefonts/make_rsfs
new file mode 100755
index 0000000000..5bc4dfd060
--- /dev/null
+++ b/fonts/utilities/makefonts/make_rsfs
@@ -0,0 +1,141 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# rsfs with package jknappen/mathrsfs
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par \TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \newcommand{\mylatexformula}{\lhd\hbox{\boldmath$\lhd$}\ }
+ \newcommand{\latexpict}{\begin{picture}(10,10)(0,0)
+ \vector(3,1){4.8}\circle{5}\end{picture}}
+ \newcommand{\mylatextext}{\par Az
+ \thinlines\latexpict \thicklines\latexpict}
+ \newcommand{\LatexShapes}{%
+ \let\myformula=\mylatexformula \let\mytext=\mylatextext \TestShapes}
+
+ \usepackage{mathrsfs}
+
+ \begin{document}
+ %\renewcommand{\bfdefault}{b}
+ %\renewcommand{\mytext}{\clock}
+ \renewcommand{\myformula}{\mathscr{ABC}}
+ %\TestShapes
+ %\LatexShapes
+ \TestSizes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_slitex b/fonts/utilities/makefonts/make_slitex
new file mode 100755
index 0000000000..bb097ab486
--- /dev/null
+++ b/fonts/utilities/makefonts/make_slitex
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# slitex: lcmss, lcmssb, lcmssi
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 4, 5 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c\ }
+ \newcommand{\mytext}{text\ }
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\par\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \newcommand{\mylatexformula}{\lhd\hbox{\boldmath$\lhd$}\ }
+ \newcommand{\latexpict}{\begin{picture}(10,10)(0,0)
+ \vector(3,1){4.8}\circle{5}\end{picture}}
+ \newcommand{\mylatextext}{\par Az
+ \thinlines\latexpict \thicklines\latexpict}
+ \newcommand{\LatexShapes}{%
+ \let\myformula=\mylatexformula \let\mytext=\mylatextext \TestShapes}
+
+ %\usepackage{latexsym}
+
+ \begin{document}
+ \TestShapes
+ %\LatexShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ #echo '\documentclass['$1'pt]{article}'
+ echo '\documentclass['$1'pt]{slides}'
+ # slides must be separate fromlatex because it interferes with lasy, lasyb
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_stmaryrd b/fonts/utilities/makefonts/make_stmaryrd
new file mode 100755
index 0000000000..c5e2020be8
--- /dev/null
+++ b/fonts/utilities/makefonts/make_stmaryrd
@@ -0,0 +1,141 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# stmaryrd with package stmaryrd
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 04 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c}
+ \newcommand{\mytext}{text}
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \newcommand{\mylatexformula}{\lhd\hbox{\boldmath$\lhd$}\ }
+ \newcommand{\latexpict}{\begin{picture}(10,10)(0,0)
+ \vector(3,1){4.8}\circle{5}\end{picture}}
+ \newcommand{\mylatextext}{\par Az
+ \thinlines\latexpict \thicklines\latexpict}
+ \newcommand{\LatexShapes}{%
+ \let\myformula=\mylatexformula \let\mytext=\mylatextext \TestShapes}
+
+ \usepackage{stmaryrd}
+
+ \begin{document}
+ %\renewcommand{\bfdefault}{b}
+ %\renewcommand{\mytext}{\clock}
+ \renewcommand{\myformula}{\Yup}
+ \TestShapes
+ %\LatexShapes
+ %\TestSizes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/makefonts/make_wasy b/fonts/utilities/makefonts/make_wasy
new file mode 100755
index 0000000000..36c18f093e
--- /dev/null
+++ b/fonts/utilities/makefonts/make_wasy
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Generate pk fonts for:
+# wasy with package wasysym
+# Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# 04 Nov 1999
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+case "$1" in
+ -r)
+ DVIPS=dvired
+ shift
+ ;;
+ *)
+ DVIPS=dvips
+ ;;
+esac
+
+body()
+{
+ cat <<-'eof'
+ \pagestyle{empty}
+ \parindent0in
+ \hfuzz=\maxdimen
+ \hbadness=10000
+ \textheight9.5in
+ \textwidth6.5in
+
+ \newcommand{\myformula}{\sum a_{b_{c_d}} = c}
+ \newcommand{\mytext}{text}
+ \newcommand{\mymath}{$\mathcal{\myformula}\mathrm{\myformula}
+ \mathbf{\myformula}\mathsf{\myformula}\mathtt{\myformula}
+ \mathnormal{\myformula}\mathit{\myformula}$}
+ \newcommand{\mytextmath}{\mytext\mymath}
+
+ \newcommand{\TestSizesSmaller}{{%
+ \tiny\mytextmath \scriptsize\mytextmath
+ \footnotesize\mytextmath \small\mytextmath}}
+ \newcommand{\TestSizesLarger}{{%
+ \normalsize\mytextmath
+ \large\mytextmath \Large\mytextmath \LARGE\mytextmath
+ \huge\mytextmath \Huge\mytextmath}}
+ \newcommand{\TestSizes}{\TestSizesSmaller\TestSizesLarger}
+
+ \newcommand{\TextSmaller}{{%
+ \tiny\mytext \scriptsize\mytext
+ \footnotesize\mytext \small\mytext}}
+ \newcommand{\TextLarger}{{%
+ \normalsize\mytext
+ \large\mytext \Large\mytext \LARGE\mytext
+ \huge\mytext \Huge\mytext}}
+ \newcommand{\TextSizes}{\TextSmaller\TextLarger}
+
+ \newcommand{\TestRM}{rm-family: {\rmfamily\TestSizes}\newline}
+ \newcommand{\TestSF}{sf-family: {\sffamily\TestSizes}\newline}
+ \newcommand{\TestTT}{tt-family: {\ttfamily\TestSizes}\newline}
+ \newcommand{\TestFamilies}{\TestRM\TestSF\TestTT\par}
+
+ \newcommand{\TestMD}{md-series: {\mdseries\TestFamilies}}
+ \newcommand{\TestBF}{bf-series: {\bfseries\TestFamilies}}
+ \newcommand{\TestSeries}{\TestBF\TestMD\par}
+
+ \newcommand{\TestUP}{up-shape: {\upshape\TestSeries}\par}
+ \newcommand{\TestIT}{it-shape: {\itshape\TestSeries}\par}
+ \newcommand{\TestSL}{sl-shape: {\slshape\TestSeries}\par}
+ \newcommand{\TestSC}{sc-shape: {\scshape\TestSeries}\par}
+ \newcommand{\TestShapes}{\TestUP\TestIT\TestSL\TestSC\par}
+
+ \newcommand{\TextShapes}{\let\TestSizes=\TextSizes \TestShapes}
+
+ \newcommand{\mylatexformula}{\lhd\hbox{\boldmath$\lhd$}\ }
+ \newcommand{\latexpict}{\begin{picture}(10,10)(0,0)
+ \vector(3,1){4.8}\circle{5}\end{picture}}
+ \newcommand{\mylatextext}{\par Az
+ \thinlines\latexpict \thicklines\latexpict}
+ \newcommand{\LatexShapes}{%
+ \let\myformula=\mylatexformula \let\mytext=\mylatextext \TestShapes}
+
+ \usepackage{wasysym}
+
+ \begin{document}
+ \renewcommand{\bfdefault}{b}
+ \renewcommand{\mytext}{\clock}
+ \TestShapes
+ %\LatexShapes
+ \end{document}
+eof
+}
+
+head()
+{
+ echo '\documentclass['$1'pt]{article}'
+ echo '\usepackage['$2']{fontenc}'
+}
+
+cd /tmp
+mkdir tmp$$ && cd tmp$$ || exit
+trap "cd / ; rm -rf /tmp/tmp$$; trap '' 0; exit 0" 0 1 2 15
+
+cat <<-'EOF' >&2
+
+---------------------------------------------------------------------
+>>>>>>>>>>> Generating testfiles for 10pt, 11pt and 12pt. <<<<<<<<<<
+---------------------------------------------------------------------
+EOF
+head 10 OT1 > allcm10.tex
+head 11 OT1 > allcm11.tex
+head 12 OT1 > allcm12.tex
+body >> allcm10.tex
+body >> allcm11.tex
+body >> allcm12.tex
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Calling latex... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+latex allcm10 >/dev/null
+latex allcm11 >/dev/null
+latex allcm12 >/dev/null
+
+echo >&2
+echo "---------------------------------------------------------------------" >&2
+echo ">>>>>>>>>>> Now, calling $DVIPS to make missing fonts... <<<<<<<<<<" >&2
+echo "---------------------------------------------------------------------" >&2
+$DVIPS ${1+"$@"} -f allcm10 > /dev/null
+$DVIPS ${1+"$@"} -f allcm11 > /dev/null
+$DVIPS ${1+"$@"} -f allcm12 > /dev/null
+
+cd /
+rm -rf /tmp/tmp$$
diff --git a/fonts/utilities/mathinst/INSTALL b/fonts/utilities/mathinst/INSTALL
new file mode 100644
index 0000000000..2d1e713a36
--- /dev/null
+++ b/fonts/utilities/mathinst/INSTALL
@@ -0,0 +1,37 @@
+Installing and Running Mathinst (August 1998)
+=============================================
+
+Make sure your version of TeX understands virtual fonts and has been
+configured to read files from both the current directory and parent
+directory.
+
+You'll also need Perl and fontinst.sty.
+
+Your text fonts must have been installed either using the current
+author's vfinst utility or Sebastian Rahtz's psnfss using the fontname
+conventions.
+
+The raw math fonts---either MathTime, Euler, Lucida New Math, or
+Mathematica---need to have been installed.
+
+1. Create a mathinst directory some place on your disk, and place all
+the mathinst files here.
+
+2. Create a work directory below this, and go here to do all yor work.
+
+3. Issue the command
+ perl ../mathinst <math-fam> <text-fam>
+where <math-fam> is one of mt, eu, lu, or ma (for MathTime, Euler,
+Lucida New Math, or Mathematica) and where <text-fam> is the fontname
+3-character designation for the text fonts. (Examples:
+ perl ../mathinst mt ptm
+creates math fonts combining MathTime and Adobe times Romanl;
+ perl ../mathinst eu ppl
+creates math fonts combining Euler with Palatino.)
+
+4. Follow the instructions on your console.
+
+Enjoy!
+
+---Alan Hoenig (author)
+ ajhjj@cunyvm.cuny.edu
diff --git a/fonts/utilities/mathinst/MTMI.etx b/fonts/utilities/mathinst/MTMI.etx
new file mode 100644
index 0000000000..d5b06d83c7
--- /dev/null
+++ b/fonts/utilities/mathinst/MTMI.etx
@@ -0,0 +1,519 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file MTMI.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file is based on Alan Jeffrey's OML.etx file.
+
+\encoding
+
+\needsfontinstversion{1.305}
+
+\setstr{codingscheme}{TEX MATH ITALIC}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\setslot{alpha}
+ \comment{The greek letter `$\alpha$'.}
+\endsetslot
+
+\setslot{beta}
+ \comment{The greek letter `$\beta$'.}
+\endsetslot
+
+\setslot{gamma}
+ \comment{The greek letter `$\gamma$'.}
+\endsetslot
+
+\setslot{delta}
+ \comment{The greek letter `$\delta$'.}
+\endsetslot
+
+\setslot{epsilon1}
+ \comment{The greek letter `$\epsilon$'.}
+\endsetslot
+
+\setslot{zeta}
+ \comment{The greek letter `$\zeta$'.}
+\endsetslot
+
+\setslot{eta}
+ \comment{The greek letter `$\eta$'.}
+\endsetslot
+
+\setslot{theta}
+ \comment{The greek letter `$\theta$'.}
+\endsetslot
+
+\setslot{iota}
+ \comment{The greek letter `$\iota$'.}
+\endsetslot
+
+\setslot{kappa}
+ \comment{The greek letter `$\kappa$'.}
+\endsetslot
+
+\setslot{lambda}
+ \comment{The greek letter `$\lambda$'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The greek letter `$\mu$'.}
+\endsetslot
+
+\setslot{nu}
+ \comment{The greek letter `$\nu$'.}
+\endsetslot
+
+\setslot{xi}
+ \comment{The greek letter `$\xi$'.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The greek letter `$\pi$'.}
+\endsetslot
+
+\setslot{rho}
+ \comment{The greek letter `$\rho$'.}
+\endsetslot
+
+\setslot{sigma}
+ \comment{The greek letter `$\sigma$'.}
+\endsetslot
+
+\setslot{tau}
+ \comment{The greek letter `$\tau$'.}
+\endsetslot
+
+\setslot{upsilon}
+ \comment{The greek letter `$\upsilon$'.}
+\endsetslot
+
+\setslot{phi}
+ \comment{The greek letter `$\phi$'.}
+\endsetslot
+
+\setslot{chi}
+ \comment{The greek letter `$\chi$'.}
+\endsetslot
+
+\setslot{psi}
+ \comment{The greek letter `$\psi$'.}
+\endsetslot
+
+\setslot{omega}
+ \comment{The greek letter `$\omega$'.}
+\endsetslot
+
+\setslot{epsilon}
+ \comment{The greek letter `$\varepsilon$'.}
+\endsetslot
+
+\setslot{theta1}
+ \comment{The greek letter `$\vartheta$'.}
+\endsetslot
+
+\setslot{pi1}
+ \comment{The greek letter `$\varpi$', rather unfortunately named
+ `omega1' by Adobe.}
+\endsetslot
+
+\setslot{rho1}
+ \comment{The greek letter `$\varrho$'.}
+\endsetslot
+
+\setslot{sigma1}
+ \comment{The greek letter `$\varsigma$'.}
+\endsetslot
+
+\setslot{phi1}
+ \comment{The greek letter `$\varphi$'.}
+\endsetslot
+
+\setslot{harpoonleftup}
+ \comment{The harpoon symbol `$\leftharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonleftdown}
+ \comment{The harpoon symbol `$\leftharpoondown$'.}
+\endsetslot
+
+\setslot{harpoonrightup}
+ \comment{The harpoon symbol `$\rightharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonrightdown}
+ \comment{The harpoon symbol `$\rightharpoondown$'.}
+\endsetslot
+
+\setslot{hookrightchar}
+ \comment{The building block for `$\hookrightarrow$'.}
+\endsetslot
+
+\setslot{hookleftchar}
+ \comment{The building block for `$\hookleftarrow$'.}
+\endsetslot
+
+%% We insert here the first group of special MTMI glyphs.
+
+\setslot{parenleft}\endsetslot
+\setslot{parenright}\endsetslot
+\setslot{Gamma1}\endsetslot
+\setslot{Delta1}\endsetslot
+\setslot{Theta1}\endsetslot
+\setslot{Lambda1}\endsetslot
+\setslot{Xi1}\endsetslot
+\setslot{Pi1}\endsetslot
+\setslot{Sigma1}\endsetslot
+\setslot{Upsilon1}\endsetslot
+\setslot{Phi1}\endsetslot
+\setslot{Psi1}\endsetslot
+
+%% Returning to the regular encoding...
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forwards oblique `/'.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\setslot{star}
+ \comment{The star symbol `$\star$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differentiation symbol `$\partial$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{flat}
+ \comment{The flat musical symbol `$\flat$'.}
+\endsetslot
+
+\setslot{sharp}
+ \comment{The sharp musical symbol `$\sharp$'.}
+\endsetslot
+
+\setslot{natural}
+ \comment{The natural musical symbol `$\natural$'.}
+\endsetslot
+
+\setslot{slurbelow}
+ \comment{The slur symbol `$\smile$'.}
+\endsetslot
+
+\setslot{slurabove}
+ \comment{The slur symbol `$\frown$'.}
+\endsetslot
+
+\setslot{lscript}
+ \comment{The calligraphic letter l `$\ell$'.}
+\endsetslot
+
+\setslot{a}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{b}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{c}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{d}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{e}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{f}
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{g}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{h}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{i}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{j}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{k}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{l}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{m}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{n}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{o}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{p}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{q}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{r}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{s}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{t}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{u}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{v}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{w}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{x}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{y}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{z}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\setslot{dotlessi}
+ \comment{The letter `{\i}'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \comment{The letter `{\j}'.}
+\endsetslot
+
+\setslot{weierstrass}
+ \comment{The Weierstrass P symbol `$\wp$'.}
+\endsetslot
+
+%% More MTMI variation...
+
+\setslot{kappa1}\endsetslot
+\setslot{Omega1}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/mathinst/MTSY.etx b/fonts/utilities/mathinst/MTSY.etx
new file mode 100644
index 0000000000..9e3995f2b6
--- /dev/null
+++ b/fonts/utilities/mathinst/MTSY.etx
@@ -0,0 +1,494 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file MTSY.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file is based on the original file OMS.etx by Alan Jeffrey.
+
+\encoding
+
+\needsfontinstversion{1.305}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from MTSY.}
+
+\setint{fontdimen(8)}{701}
+\setint{fontdimen(9)}{404}
+\setint{fontdimen(10)}{454}
+\setint{fontdimen(11)}{710}
+\setint{fontdimen(12)}{355}
+\setint{fontdimen(13)}{413}
+\setint{fontdimen(14)}{363}
+\setint{fontdimen(15)}{289}
+\setint{fontdimen(16)}{150}
+\setint{fontdimen(17)}{269}
+\setint{fontdimen(18)}{386}
+\setint{fontdimen(19)}{50}
+\setint{fontdimen(20)}{2390}
+\setint{fontdimen(21)}{1010}
+\setint{fontdimen(22)}{250}
+
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{minus}
+ \comment{The subtraction symbol `$-$'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered dot symbol `$\cdot$'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication symbol `$\times$'.}
+\endsetslot
+
+\setslot{asteriskmath}
+ \comment{The centered asterisk symbol `$*$'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division symbol `$\div$'.}
+\endsetslot
+
+\setslot{diamondmath}
+ \comment{The diamond symbol `$\diamond$'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus symbol `$\pm$'.}
+\endsetslot
+
+\setslot{minusplus}
+ \comment{The minus or plus symbol `$\mp$'.}
+\endsetslot
+
+\setslot{circleplus}
+ \comment{The circled plus symbol `$\oplus$'.}
+\endsetslot
+
+\setslot{circleminus}
+ \comment{The circled minus symbol `$\ominus$'.}
+\endsetslot
+
+\setslot{circlemultiply}
+ \comment{The circled multiplication symbol `$\otimes$'.}
+\endsetslot
+
+\setslot{circledivide}
+ \comment{The circled oblique symbol `$\oslash$'.}
+\endsetslot
+
+\setslot{circledot}
+ \comment{The circled dot symbol `$\odot$'.}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \comment{The large circle symbol `$\bigcirc$' used for building the
+ copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The circle symbol `$\circ$'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The bullet symbol `$\bullet$'.}
+\endsetslot
+
+\setslot{equivasymptotic}
+ \comment{The asymptotic equals symbol `$\asymp$'.}
+\endsetslot
+
+\setslot{equivalence}
+ \comment{The equivalence symbol `$\equiv$'.}
+\endsetslot
+
+\setslot{reflexsubset}
+ \comment{The subset or equals symbol `$\subseteq$'.}
+\endsetslot
+
+\setslot{reflexsuperset}
+ \comment{The superset or equals symbol `$\supseteq$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The less or equals symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The greater or equals symbol `$\geq$'.}
+\endsetslot
+
+\setslot{precedesequal}
+ \comment{The precedes or equals symbol `$\preceq$'.}
+\endsetslot
+
+\setslot{followsequal}
+ \comment{The follows or equals symbol `$\succeq$'.}
+\endsetslot
+
+\setslot{similar}
+ \comment{The similar symbol `$\sim$'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The approximate equality symbol `$\approx$'.}
+\endsetslot
+
+\setslot{propersubset}
+ \comment{The subset symbol `$\subset$'.}
+\endsetslot
+
+\setslot{propersuperset}
+ \comment{The superset symbol `$\supset$'.}
+\endsetslot
+
+\setslot{lessmuch}
+ \comment{The much less symbol `$\ll$'.}
+\endsetslot
+
+\setslot{greatermuch}
+ \comment{The much greater symbol `$\gg$'.}
+\endsetslot
+
+\setslot{curlyless}
+ \comment{The precedes symbol `$\prec$'.}
+\endsetslot
+
+\setslot{curlygreater}
+ \comment{The follows symbol `$\succ$'.}
+\endsetslot
+
+\setslot{arrowleft}
+ \comment{The left arrow symbol `$\leftarrow$'.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{The right arrow symbol `$\rightarrow$'.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{The up arrow symbol `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{The down arrow symbol `$\downarrow$'.}
+\endsetslot
+
+\setslot{arrowboth}
+ \comment{The horizontal arrow symbol `$\leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownortheast}
+ \comment{The north-east arrow symbol `$\nearrow$'.}
+\endsetslot
+
+\setslot{arrowsoutheast}
+ \comment{The south-east arrow symbol `$\searrow$'.}
+\endsetslot
+
+\setslot{similarequal}
+ \comment{The similar or equal symbol `$\simeq$'.}
+\endsetslot
+
+\setslot{arrowdblleft}
+ \comment{The double left arrow symbol `$\Leftarrow$'.}
+\endsetslot
+
+\setslot{arrowdblright}
+ \comment{The double right arrow symbol `$\Rightarrow$'.}
+\endsetslot
+
+\setslot{arrowdblup}
+ \comment{The double up arrow symbol `$\Uparrow$'.}
+\endsetslot
+
+\setslot{arrowdbldown}
+ \comment{The double down arrow symbol `$\Downarrow$'.}
+\endsetslot
+
+\setslot{arrowdblboth}
+ \comment{The double horizontal arrow symbol `$\Leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownorthwest}
+ \comment{The north-west arrow symbol `$\nwarrow$'.}
+\endsetslot
+
+\setslot{arrowsouthwest}
+ \comment{The south-west arrow symbol `$\swarrow$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The proportional symbol `$\propto$'.}
+\endsetslot
+
+\setslot{prime}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{element}
+ \comment{The set membership symbol `$\in$'.}
+\endsetslot
+
+\setslot{owner}
+ \comment{The backwards set membership symbol `$\ni$'.}
+\endsetslot
+
+\setslot{triangle}
+ \comment{The upwards triangle symbol `$\bigtriangleup$'.}
+\endsetslot
+
+\setslot{triangleinv}
+ \comment{The downwards triangle symbol `$\bigtriangledown$'.}
+\endsetslot
+
+\setslot{negationslash}
+ \comment{The arrow negation symbol `$/$'.}
+\endsetslot
+
+\setslot{mapstochar}
+ \comment{The maps to building block symbol `$\mapstochar$', used to
+ build `$\mapsto$'.}
+\endsetslot
+
+\setslot{universal}
+ \comment{The universal quantification symbol `$\forall$'.}
+\endsetslot
+
+\setslot{existential}
+ \comment{The existential quantification symbol `$\exists$'.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The negation symbol `$\neg$'.}
+\endsetslot
+
+\setslot{emptysetstress}
+ \comment{The `stressed' empty set symbol `$\emptyset$', which should
+ look like a zero with a slash. The `emptyset' symbol is a circle
+ with a slash.}
+\endsetslot
+
+\setslot{Rfraktur}
+ \comment{The upper case Fraktur R symbol `$\Re$'.}
+\endsetslot
+
+\setslot{Ifraktur}
+ \comment{The upper case Fraktur I symbol `$\Im$'.}
+\endsetslot
+
+\setslot{latticetop}
+ \comment{The inverted perpendicular symbol `$\top$'.}
+\endsetslot
+
+\setslot{perpendicular}
+ \comment{The perpendicular symbol `$\perp$'.}
+\endsetslot
+
+\setslot{aleph}
+ \comment{The aleph symbol `$\aleph$'.}
+\endsetslot
+
+%% We interrupt this encoding for the special glyphs appearing in MTSY...
+
+\setslot{tie}\endsetslot
+\setslot{openbullet1}\endsetslot
+\setslot{plus}\endsetslot
+\setslot{equal}\endsetslot
+\setslot{vector}\endsetslot
+\setslot{triangleright}\endsetslot
+\setslot{triangleleft}\endsetslot
+\setslot{equal1}\endsetslot
+\setslot{semicolon}\endsetslot
+\setslot{grave}\endsetslot
+\setslot{acute}\endsetslot
+\setslot{caron}\endsetslot
+\setslot{breve}\endsetslot
+\setslot{macron}\endsetslot
+\setslot{circumflex}\endsetslot
+\setslot{dotaccent}\endsetslot
+\setslot{tilde}\endsetslot
+\setslot{dieresis}\endsetslot
+\setslot{overbar}\endsetslot
+
+%% We return you to your regularly scheduled encoding (OMS, in this case).
+
+\nextslot{91}
+\setslot{union}
+ \comment{The set union symbol `$\cup$'.}
+\endsetslot
+
+\setslot{intersection}
+ \comment{The set intersection symbol `$\cap$'.}
+\endsetslot
+
+\setslot{unionmulti}
+ \comment{The multiset union symbol `$\uplus$'.}
+\endsetslot
+
+\setslot{logicaland}
+ \comment{The meet symbol `$\wedge$'.}
+\endsetslot
+
+\setslot{logicalor}
+ \comment{The join symbol `$\vee$'.}
+\endsetslot
+
+\setslot{turnstileleft}
+ \comment{The turnstile symbol `$\vdash$'.}
+\endsetslot
+
+\setslot{turnstileright}
+ \comment{The backwards turnstile symbol `$\dashv$'.}
+\endsetslot
+
+\setslot{floorleft}
+ \comment{The left floor symbol `$\lfloor$'.}
+\endsetslot
+
+\setslot{floorright}
+ \comment{The right floor symbol `$\rfloor$'.}
+\endsetslot
+
+\setslot{ceilingleft}
+ \comment{The left ceiling symbol `$\lceil$'.}
+\endsetslot
+
+\setslot{ceilingright}
+ \comment{The right ceiling symbol `$\rceil$'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The left brace symbol `$\{$'.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The right brace symbol `$\}$'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The left angle bracket symbol `$\langle$'.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The right angle bracket symbol `$\rangle$'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The vertical bar symbol `$|$'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The parallel vertical bars symbol `$\parallel$'.}
+\endsetslot
+
+\setslot{arrowbothv}
+ \comment{The vertical arrows symbol `$\updownarrow$'.}
+\endsetslot
+
+\setslot{arrowdblbothv}
+ \comment{The double vertical arrows symbol `$\Updownarrow$'.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique symbol `$\backslash$'.}
+\endsetslot
+
+\setslot{wreathproduct}
+ \comment{The Wreath product symbol `$\wp$'.}
+\endsetslot
+
+\setslot{radicallow}
+ \comment{The lowered radical symbol `$\surd$'.}
+\endsetslot
+
+\setslot{coproduct}
+ \comment{The textstyle coproduct symbol `$\coprod$'.}
+\endsetslot
+
+\setslot{gradient}
+ \comment{The inverted Delta symbol `$\nabla$'.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The textstyle integral symbol `$\plainint$'.}
+\endsetslot
+
+\setslot{unionsq}
+ \comment{The square union symbol `$\sqcup$'.}
+\endsetslot
+
+\setslot{intersectionsq}
+ \comment{The square intersection symbol `$\sqcap$'.}
+\endsetslot
+
+\setslot{subsetsqequal}
+ \comment{The square subset or equal symbol `$\sqsubseteq$'.}
+\endsetslot
+
+\setslot{supersetsqequal}
+ \comment{The square superset or equal symbol `$\sqsupseteq$'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section symbol `$\S$'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The dagger symbol `$\dag$'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger symbol `$\ddag$'.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph symbol `$\P$'.}
+\endsetslot
+
+\setslot{club}
+ \comment{The club suit symbol `$\clubsuit$'.}
+\endsetslot
+
+\setslot{diamond}
+ \comment{The diamond suit symbol `$\diamondsuit$'.}
+\endsetslot
+
+\setslot{heart}
+ \comment{The heart suit symbol `$\heartsuit$'.}
+\endsetslot
+
+\setslot{spade}
+ \comment{The spade suit symbol `$\spadesuit$'.}
+\endsetslot
+
+\endencoding
+
+
diff --git a/fonts/utilities/mathinst/OMLlus.etx b/fonts/utilities/mathinst/OMLlus.etx
new file mode 100644
index 0000000000..3b95b15009
--- /dev/null
+++ b/fonts/utilities/mathinst/OMLlus.etx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMLlus.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\setint{letterspacing}{30}
+
+\inputetx{OML}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMLluss.etx b/fonts/utilities/mathinst/OMLluss.etx
new file mode 100644
index 0000000000..35c42588a4
--- /dev/null
+++ b/fonts/utilities/mathinst/OMLluss.etx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMLluss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\setint{letterspacing}{75}
+
+\inputetx{OML}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMLmt.etx b/fonts/utilities/mathinst/OMLmt.etx
new file mode 100644
index 0000000000..af780f7f05
--- /dev/null
+++ b/fonts/utilities/mathinst/OMLmt.etx
@@ -0,0 +1,588 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMLmt.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% This is file `OMLz.etx', version <1.0a>
+%%%
+%%% Copyright (C) 1994 Aloysius G. Helminck. All rights reserved.
+%%% Permission is granted to to customize the declarations in this
+%%% file to serve the needs of your installation. However, no permission
+%%% is granted to distribute a modified version of this file under
+%%% its original name.
+%%%
+%%% This file is essentially OML.etx, where we have added two glyphs
+%%% from the mathtime fonts mtmt and mtsy.
+%%%
+%%%
+
+\relax
+
+
+\encoding
+
+\needsfontinstversion{1.305}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX MATH ITALIC}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\setslot{alpha}
+ \comment{The greek letter `$\alpha$'.}
+\endsetslot
+
+\setslot{beta}
+ \comment{The greek letter `$\beta$'.}
+\endsetslot
+
+\setslot{gamma}
+ \comment{The greek letter `$\gamma$'.}
+\endsetslot
+
+\setslot{delta}
+ \comment{The greek letter `$\delta$'.}
+\endsetslot
+
+\setslot{epsilon1}
+ \comment{The greek letter `$\epsilon$'.}
+\endsetslot
+
+\setslot{zeta}
+ \comment{The greek letter `$\zeta$'.}
+\endsetslot
+
+\setslot{eta}
+ \comment{The greek letter `$\eta$'.}
+\endsetslot
+
+\setslot{theta}
+ \comment{The greek letter `$\theta$'.}
+\endsetslot
+
+\setslot{iota}
+ \comment{The greek letter `$\iota$'.}
+\endsetslot
+
+\setslot{kappa}
+ \comment{The greek letter `$\kappa$'.}
+\endsetslot
+
+\setslot{lambda}
+ \comment{The greek letter `$\lambda$'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The greek letter `$\mu$'.}
+\endsetslot
+
+\setslot{nu}
+ \comment{The greek letter `$\nu$'.}
+\endsetslot
+
+\setslot{xi}
+ \comment{The greek letter `$\xi$'.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The greek letter `$\pi$'.}
+\endsetslot
+
+\setslot{rho}
+ \comment{The greek letter `$\rho$'.}
+\endsetslot
+
+\setslot{sigma}
+ \comment{The greek letter `$\sigma$'.}
+\endsetslot
+
+\setslot{tau}
+ \comment{The greek letter `$\tau$'.}
+\endsetslot
+
+\setslot{upsilon}
+ \comment{The greek letter `$\upsilon$'.}
+\endsetslot
+
+\setslot{phi}
+ \comment{The greek letter `$\phi$'.}
+\endsetslot
+
+\setslot{chi}
+ \comment{The greek letter `$\chi$'.}
+\endsetslot
+
+\setslot{psi}
+ \comment{The greek letter `$\psi$'.}
+\endsetslot
+
+\setslot{omega}
+ \comment{The greek letter `$\omega$'.}
+\endsetslot
+
+\setslot{epsilon}
+ \comment{The greek letter `$\varepsilon$'.}
+\endsetslot
+
+\setslot{theta1}
+ \comment{The greek letter `$\vartheta$'.}
+\endsetslot
+
+\setslot{pi1}
+ \comment{The greek letter `$\varpi$', rather unfortunately named
+ `omega1' by Adobe.}
+\endsetslot
+
+\setslot{rho1}
+ \comment{The greek letter `$\varrho$'.}
+\endsetslot
+
+\setslot{sigma1}
+ \comment{The greek letter `$\varsigma$'.}
+\endsetslot
+
+\setslot{phi1}
+ \comment{The greek letter `$\varphi$'.}
+\endsetslot
+
+\setslot{harpoonleftup}
+ \comment{The harpoon symbol `$\leftharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonleftdown}
+ \comment{The harpoon symbol `$\leftharpoondown$'.}
+\endsetslot
+
+\setslot{harpoonrightup}
+ \comment{The harpoon symbol `$\rightharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonrightdown}
+ \comment{The harpoon symbol `$\rightharpoondown$'.}
+\endsetslot
+
+\setslot{hookrightchar}
+ \comment{The building block for `$\hookrightarrow$'.}
+\endsetslot
+
+\setslot{hookleftchar}
+ \comment{The building block for `$\hookleftarrow$'.}
+\endsetslot
+
+\setslot{triangleright}
+ \comment{The triangle symbol `$\triangleright$'.}
+\endsetslot
+
+\setslot{triangleleft}
+ \comment{The triangle symbol `$\triangleleft$'.}
+\endsetslot
+
+\setslot{zerooldstyle}
+ \comment{The oldstyle digit zero `0'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The oldstyle digit one `1'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The oldstyle digit two `2'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The oldstyle digit three `3'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The oldstyle digit four `4'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The oldstyle digit five `5'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The oldstyle digit six `6'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The oldstyle digit seven `7'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The oldstyle digit eight `8'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The oldstyle digit nine `9'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forwards oblique `/'.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\setslot{star}
+ \comment{The star symbol `$\star$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differentiation symbol `$\partial$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{flat}
+ \comment{The flat musical symbol `$\flat$'.}
+\endsetslot
+
+\setslot{sharp}
+ \comment{The sharp musical symbol `$\sharp$'.}
+\endsetslot
+
+\setslot{natural}
+ \comment{The natural musical symbol `$\natural$'.}
+\endsetslot
+
+\setslot{slurbelow}
+ \comment{The slur symbol `$\smile$'.}
+\endsetslot
+
+\setslot{slurabove}
+ \comment{The slur symbol `$\frown$'.}
+\endsetslot
+
+\setslot{lscript}
+ \comment{The calligraphic letter l `$\ell$'.}
+\endsetslot
+
+\setslot{a}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{b}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{c}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{d}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{e}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{f}
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{g}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{h}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{i}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{j}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{k}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{l}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{m}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{n}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{o}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{p}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{q}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{r}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{s}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{t}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{u}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{v}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{w}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{x}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{y}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{z}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\setslot{dotlessi}
+ \comment{The letter `{\i}'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \comment{The letter `{\j}'.}
+\endsetslot
+
+\setslot{weierstrass}
+ \comment{The Weierstrass P symbol `$\wp$'.}
+\endsetslot
+
+\setslot{vector}
+ \comment{The vector accent symbol `$\vec a$'.}
+\endsetslot
+
+\setslot{tie}
+ \comment{The tie accent symbol `\t oo'.}
+\endsetslot
+
+%%%
+%%% Here we add two extra symbols from the mathtime family:
+%%%
+
+\nextslot{"80}
+
+\setslot{varkappa}
+ \comment{varkappa symbol}
+\endsetslot
+
+\nextslot{"81}
+
+\setslot{openbullet1}
+ \comment{comp symbol}
+\endsetslot
+
+
+
+
+
+\endencoding
+
diff --git a/fonts/utilities/mathinst/OMLmts.etx b/fonts/utilities/mathinst/OMLmts.etx
new file mode 100644
index 0000000000..db677c558d
--- /dev/null
+++ b/fonts/utilities/mathinst/OMLmts.etx
@@ -0,0 +1,19 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMLmts.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets the script letterspacing for a Math Time
+set of script fonts.
+
+\encoding
+
+\setint{letterspacing}{40}
+\inputetx{OMLmt}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMLmtss.etx b/fonts/utilities/mathinst/OMLmtss.etx
new file mode 100644
index 0000000000..7dad237852
--- /dev/null
+++ b/fonts/utilities/mathinst/OMLmtss.etx
@@ -0,0 +1,19 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMLmtss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets the script letterspacing for a Math Time
+set of scriptscript fonts.
+
+\encoding
+
+\setint{letterspacing}{100}
+\inputetx{OMLmt}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMSeu.etx b/fonts/utilities/mathinst/OMSeu.etx
new file mode 100644
index 0000000000..0efe0544a6
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSeu.etx
@@ -0,0 +1,59 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSeu.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from eusm10.}
+
+\setint{fontdimen(8)}{378} % (NUM1 R 0.378113)
+\setint{fontdimen(9)}{270} % (NUM2 R 0.270081)
+\setint{fontdimen(10)}{297} % (NUM3 R 0.297089)
+\setint{fontdimen(11)}{378} % (DENOM1 R 0.378113)
+\setint{fontdimen(12)}{162} % (DENOM2 R 0.162048)
+\setint{fontdimen(13)}{405} % (SUP1 R 0.405121)
+\setint{fontdimen(14)}{378} % (SUP2 R 0.378113)
+\setint{fontdimen(15)}{324} % (SUP3 R 0.324097)
+\setint{fontdimen(16)}{189} % (SUB1 R 0.189056)
+\setint{fontdimen(17)}{243} % (SUB2 R 0.2430725)
+\setint{fontdimen(18)}{405} % (SUPDROP R 0.405121)
+\setint{fontdimen(19)}{27} % (SUBDROP R 0.027008)
+\setint{fontdimen(20)}{2198} % (DELIM1 R 2.198453)
+\setint{fontdimen(21)}{1000} % (DELIM2 R 0.999298)
+\setint{fontdimen(22)}{256} % (AXISHEIGHT R 0.256577)
+
+\inputetx{OMS}
+
+\endencoding
+
+
diff --git a/fonts/utilities/mathinst/OMSeus.etx b/fonts/utilities/mathinst/OMSeus.etx
new file mode 100644
index 0000000000..391a0370ce
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSeus.etx
@@ -0,0 +1,59 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSeus.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from eusm7.}
+
+\setint{fontdimen(8)}{378} % (NUM1 R 0.378418)
+\setint{fontdimen(9)}{270} % (NUM2 R 0.270299)
+\setint{fontdimen(10)}{297} % (NUM3 R 0.297328)
+\setint{fontdimen(11)}{378} % (DENOM1 R 0.378418)
+\setint{fontdimen(12)}{162} % (DENOM2 R 0.162179)
+\setint{fontdimen(13)}{405} % (SUP1 R 0.405448)
+\setint{fontdimen(14)}{378} % (SUP2 R 0.378418)
+\setint{fontdimen(15)}{324} % (SUP3 R 0.324358)
+\setint{fontdimen(16)}{189} % (SUB1 R 0.189209)
+\setint{fontdimen(17)}{243} % (SUB2 R 0.243269)
+\setint{fontdimen(18)}{405} % (SUPDROP R 0.405448)
+\setint{fontdimen(19)}{27} % (SUBDROP R 0.02703)
+\setint{fontdimen(20)}{2200} % (DELIM1 R 2.200228)
+\setint{fontdimen(21)}{1000} % (DELIM2 R 1.000105)
+\setint{fontdimen(22)}{256} % (AXISHEIGHT R 0.2567835)
+
+\inputetx{OMS}
+
+\endencoding
+
+
diff --git a/fonts/utilities/mathinst/OMSeuss.etx b/fonts/utilities/mathinst/OMSeuss.etx
new file mode 100644
index 0000000000..e2e44e1a0e
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSeuss.etx
@@ -0,0 +1,59 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSeuss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from eusm5.}
+
+\setint{fontdimen(8)}{380} % (NUM1 R 0.380249)
+\setint{fontdimen(9)}{271} % (NUM2 R 0.271606)
+\setint{fontdimen(10)}{299} % (NUM3 R 0.298767)
+\setint{fontdimen(11)}{380} % (DENOM1 R 0.380249)
+\setint{fontdimen(12)}{163} % (DENOM2 R 0.162964)
+\setint{fontdimen(13)}{407} % (SUP1 R 0.40741)
+\setint{fontdimen(14)}{380} % (SUP2 R 0.380249)
+\setint{fontdimen(15)}{326} % (SUP3 R 0.325928)
+\setint{fontdimen(16)}{190} % (SUB1 R 0.1901245)
+\setint{fontdimen(17)}{244} % (SUB2 R 0.244446)
+\setint{fontdimen(18)}{407} % (SUPDROP R 0.40741)
+\setint{fontdimen(19)}{27} % (SUBDROP R 0.027161)
+\setint{fontdimen(20)}{2109} % (DELIM1 R 2.210874)
+\setint{fontdimen(21)}{1005} % (DELIM2 R 1.004944)
+\setint{fontdimen(22)}{258} % (AXISHEIGHT R 0.258026)
+
+\inputetx{OMS}
+
+\endencoding
+
+
diff --git a/fonts/utilities/mathinst/OMSlu.etx b/fonts/utilities/mathinst/OMSlu.etx
new file mode 100644
index 0000000000..cd4e791d0e
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSlu.etx
@@ -0,0 +1,57 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSlu.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from lbms.}
+
+\setint{fontdimen(8)}{700} % (NUM1 R 0.7)
+\setint{fontdimen(9)}{500} % (NUM2 R 0.5)
+\setint{fontdimen(10)}{500} % (NUM3 R 0.5)
+\setint{fontdimen(11)}{720} % (DENOM1 R 0.72)
+\setint{fontdimen(12)}{360} % (DENOM2 R 0.36)
+\setint{fontdimen(13)}{420} % (SUP1 R 0.42)
+\setint{fontdimen(14)}{370} % (SUP2 R 0.37)
+\setint{fontdimen(15)}{290} % (SUP3 R 0.29)
+\setint{fontdimen(16)}{150} % (SUB1 R 0.15)
+\setint{fontdimen(17)}{250} % (SUB2 R 0.25)
+\setint{fontdimen(18)}{400} % (SUPDROP R 0.4)
+\setint{fontdimen(19)}{50} % (SUBDROP R 0.05)
+\setint{fontdimen(20)}{2500} % (DELIM1 R 2.5)
+\setint{fontdimen(21)}{1200} % (DELIM2 R 1.2)
+\setint{fontdimen(22)}{313} % (AXISHEIGHT R 0.313)
+
+\inputetx{OMS}
+
+\endencoding
+
+
diff --git a/fonts/utilities/mathinst/OMSlus.etx b/fonts/utilities/mathinst/OMSlus.etx
new file mode 100644
index 0000000000..5732217866
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSlus.etx
@@ -0,0 +1,56 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSlus.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\setint{letterspacing}{30}
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from lbms.}
+
+\setint{fontdimen(8)}{700} % (NUM1 R 0.7)
+\setint{fontdimen(9)}{500} % (NUM2 R 0.5)
+\setint{fontdimen(10)}{500} % (NUM3 R 0.5)
+\setint{fontdimen(11)}{720} % (DENOM1 R 0.72)
+\setint{fontdimen(12)}{360} % (DENOM2 R 0.36)
+\setint{fontdimen(13)}{420} % (SUP1 R 0.42)
+\setint{fontdimen(14)}{370} % (SUP2 R 0.37)
+\setint{fontdimen(15)}{290} % (SUP3 R 0.29)
+\setint{fontdimen(16)}{150} % (SUB1 R 0.15)
+\setint{fontdimen(17)}{250} % (SUB2 R 0.25)
+\setint{fontdimen(18)}{400} % (SUPDROP R 0.4)
+\setint{fontdimen(19)}{50} % (SUBDROP R 0.05)
+\setint{fontdimen(20)}{2500} % (DELIM1 R 2.5)
+\setint{fontdimen(21)}{1200} % (DELIM2 R 1.2)
+\setint{fontdimen(22)}{313} % (AXISHEIGHT R 0.313)
+
+\inputetx{OMS}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMSluss.etx b/fonts/utilities/mathinst/OMSluss.etx
new file mode 100644
index 0000000000..8ab2138d0f
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSluss.etx
@@ -0,0 +1,56 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSluss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from lbms.}
+
+\setint{fontdimen(8)}{700} % (NUM1 R 0.7)
+\setint{fontdimen(9)}{500} % (NUM2 R 0.5)
+\setint{fontdimen(10)}{500} % (NUM3 R 0.5)
+\setint{fontdimen(11)}{720} % (DENOM1 R 0.72)
+\setint{fontdimen(12)}{360} % (DENOM2 R 0.36)
+\setint{fontdimen(13)}{420} % (SUP1 R 0.42)
+\setint{fontdimen(14)}{370} % (SUP2 R 0.37)
+\setint{fontdimen(15)}{290} % (SUP3 R 0.29)
+\setint{fontdimen(16)}{150} % (SUB1 R 0.15)
+\setint{fontdimen(17)}{250} % (SUB2 R 0.25)
+\setint{fontdimen(18)}{400} % (SUPDROP R 0.4)
+\setint{fontdimen(19)}{50} % (SUBDROP R 0.05)
+\setint{fontdimen(20)}{2500} % (DELIM1 R 2.5)
+\setint{fontdimen(21)}{1200} % (DELIM2 R 1.2)
+\setint{fontdimen(22)}{313} % (AXISHEIGHT R 0.313)
+
+\setint{letterspacing}{75}
+
+\inputetx{OMS}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMSmt.etx b/fonts/utilities/mathinst/OMSmt.etx
new file mode 100644
index 0000000000..a3f9dfd02d
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSmt.etx
@@ -0,0 +1,600 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSmt.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\documentstyle[fontdoc,twocolumn]{article}
+
+\title{The \TeX\ math symbol encoding vector}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ math symbol (OMS) encoding.
+
+\encoding
+
+\needsfontinstversion{1.305}
+
+\comment{\section{Default values}}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from MTSY.}
+
+\setint{fontdimen(8)}{701} % (PARAMETER D 8 R 0.701)
+\setint{fontdimen(9)}{404} % (PARAMETER D 9 R 0.404)
+\setint{fontdimen(10)}{454} % (PARAMETER D 10 R 0.454)
+\setint{fontdimen(11)}{710} % (PARAMETER D 11 R 0.71)
+\setint{fontdimen(12)}{355} % (PARAMETER D 12 R 0.355)
+\setint{fontdimen(13)}{413} % (PARAMETER D 13 R 0.413)
+\setint{fontdimen(14)}{363} % (PARAMETER D 14 R 0.363)
+\setint{fontdimen(15)}{289} % (PARAMETER D 15 R 0.289)
+\setint{fontdimen(16)}{150} % (PARAMETER D 16 R 0.15)
+\setint{fontdimen(17)}{269} % (PARAMETER D 17 R 0.269)
+\setint{fontdimen(18)}{386} % (PARAMETER D 18 R 0.386)
+\setint{fontdimen(19)}{50} % (PARAMETER D 19 R 0.05)
+\setint{fontdimen(20)}{2390} % (PARAMETER D 20 R 2.39)
+\setint{fontdimen(21)}{1010} % (PARAMETER D 21 R 1.01)
+\setint{fontdimen(22)}{250} % (PARAMETER D 22 R 0.25)
+
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{minus}
+ \comment{The subtraction symbol `$-$'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered dot symbol `$\cdot$'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication symbol `$\times$'.}
+\endsetslot
+
+\setslot{asteriskmath}
+ \comment{The centered asterisk symbol `$*$'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division symbol `$\div$'.}
+\endsetslot
+
+\setslot{diamondmath}
+ \comment{The diamond symbol `$\diamond$'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus symbol `$\pm$'.}
+\endsetslot
+
+\setslot{minusplus}
+ \comment{The minus or plus symbol `$\mp$'.}
+\endsetslot
+
+\setslot{circleplus}
+ \comment{The circled plus symbol `$\oplus$'.}
+\endsetslot
+
+\setslot{circleminus}
+ \comment{The circled minus symbol `$\ominus$'.}
+\endsetslot
+
+\setslot{circlemultiply}
+ \comment{The circled multiplication symbol `$\otimes$'.}
+\endsetslot
+
+\setslot{circledivide}
+ \comment{The circled oblique symbol `$\oslash$'.}
+\endsetslot
+
+\setslot{circledot}
+ \comment{The circled dot symbol `$\odot$'.}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \comment{The large circle symbol `$\bigcirc$' used for building the
+ copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The circle symbol `$\circ$'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The bullet symbol `$\bullet$'.}
+\endsetslot
+
+\setslot{equivasymptotic}
+ \comment{The asymptotic equals symbol `$\asymp$'.}
+\endsetslot
+
+\setslot{equivalence}
+ \comment{The equivalence symbol `$\equiv$'.}
+\endsetslot
+
+\setslot{reflexsubset}
+ \comment{The subset or equals symbol `$\subseteq$'.}
+\endsetslot
+
+\setslot{reflexsuperset}
+ \comment{The superset or equals symbol `$\supseteq$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The less or equals symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The greater or equals symbol `$\geq$'.}
+\endsetslot
+
+\setslot{precedesequal}
+ \comment{The precedes or equals symbol `$\preceq$'.}
+\endsetslot
+
+\setslot{followsequal}
+ \comment{The follows or equals symbol `$\succeq$'.}
+\endsetslot
+
+\setslot{similar}
+ \comment{The similar symbol `$\sim$'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The approximate equality symbol `$\approx$'.}
+\endsetslot
+
+\setslot{propersubset}
+ \comment{The subset symbol `$\subset$'.}
+\endsetslot
+
+\setslot{propersuperset}
+ \comment{The superset symbol `$\supset$'.}
+\endsetslot
+
+\setslot{lessmuch}
+ \comment{The much less symbol `$\ll$'.}
+\endsetslot
+
+\setslot{greatermuch}
+ \comment{The much greater symbol `$\gg$'.}
+\endsetslot
+
+\setslot{curlyless}
+ \comment{The precedes symbol `$\prec$'.}
+\endsetslot
+
+\setslot{curlygreater}
+ \comment{The follows symbol `$\succ$'.}
+\endsetslot
+
+\setslot{arrowleft}
+ \comment{The left arrow symbol `$\leftarrow$'.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{The right arrow symbol `$\rightarrow$'.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{The up arrow symbol `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{The down arrow symbol `$\downarrow$'.}
+\endsetslot
+
+\setslot{arrowboth}
+ \comment{The horizontal arrow symbol `$\leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownortheast}
+ \comment{The north-east arrow symbol `$\nearrow$'.}
+\endsetslot
+
+\setslot{arrowsoutheast}
+ \comment{The south-east arrow symbol `$\searrow$'.}
+\endsetslot
+
+\setslot{similarequal}
+ \comment{The similar or equal symbol `$\simeq$'.}
+\endsetslot
+
+\setslot{arrowdblleft}
+ \comment{The double left arrow symbol `$\Leftarrow$'.}
+\endsetslot
+
+\setslot{arrowdblright}
+ \comment{The double right arrow symbol `$\Rightarrow$'.}
+\endsetslot
+
+\setslot{arrowdblup}
+ \comment{The double up arrow symbol `$\Uparrow$'.}
+\endsetslot
+
+\setslot{arrowdbldown}
+ \comment{The double down arrow symbol `$\Downarrow$'.}
+\endsetslot
+
+\setslot{arrowdblboth}
+ \comment{The double horizontal arrow symbol `$\Leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownorthwest}
+ \comment{The north-west arrow symbol `$\nwarrow$'.}
+\endsetslot
+
+\setslot{arrowsouthwest}
+ \comment{The south-west arrow symbol `$\swarrow$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The proportional symbol `$\propto$'.}
+\endsetslot
+
+\setslot{prime}
+ \comment{The prime symbol `$\prime$'.}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{element}
+ \comment{The set membership symbol `$\in$'.}
+\endsetslot
+
+\setslot{owner}
+ \comment{The backwards set membership symbol `$\ni$'.}
+\endsetslot
+
+\setslot{triangle}
+ \comment{The upwards triangle symbol `$\bigtriangleup$'.}
+\endsetslot
+
+\setslot{triangleinv}
+ \comment{The downwards triangle symbol `$\bigtriangledown$'.}
+\endsetslot
+
+\setslot{Negationslash}
+ \comment{The arrow negation symbol `$/$'.}
+\endsetslot
+
+\setslot{mapstochar}
+ \comment{The maps to building block symbol `$\mapstochar$', used to
+ build `$\mapsto$'.}
+\endsetslot
+
+\setslot{universal}
+ \comment{The universal quantification symbol `$\forall$'.}
+\endsetslot
+
+\setslot{existential}
+ \comment{The existential quantification symbol `$\exists$'.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The negation symbol `$\neg$'.}
+\endsetslot
+
+\setslot{emptysetstress}
+ \comment{The `stressed' empty set symbol `$\emptyset$', which should
+ look like a zero with a slash. The `emptyset' symbol is a circle
+ with a slash.}
+\endsetslot
+
+\setslot{Rfraktur}
+ \comment{The upper case Fraktur R symbol `$\Re$'.}
+\endsetslot
+
+\setslot{Ifraktur}
+ \comment{The upper case Fraktur I symbol `$\Im$'.}
+\endsetslot
+
+\setslot{latticetop}
+ \comment{The inverted perpendicular symbol `$\top$'.}
+\endsetslot
+
+\setslot{perpendicular}
+ \comment{The perpendicular symbol `$\perp$'.}
+\endsetslot
+
+\setslot{aleph}
+ \comment{The aleph symbol `$\aleph$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{union}
+ \comment{The set union symbol `$\cup$'.}
+\endsetslot
+
+\setslot{intersection}
+ \comment{The set intersection symbol `$\cap$'.}
+\endsetslot
+
+\setslot{unionmulti}
+ \comment{The multiset union symbol `$\uplus$'.}
+\endsetslot
+
+\setslot{logicaland}
+ \comment{The meet symbol `$\wedge$'.}
+\endsetslot
+
+\setslot{logicalor}
+ \comment{The join symbol `$\vee$'.}
+\endsetslot
+
+\setslot{turnstileleft}
+ \comment{The turnstile symbol `$\vdash$'.}
+\endsetslot
+
+\setslot{turnstileright}
+ \comment{The backwards turnstile symbol `$\dashv$'.}
+\endsetslot
+
+\setslot{floorleft}
+ \comment{The left floor symbol `$\lfloor$'.}
+\endsetslot
+
+\setslot{floorright}
+ \comment{The right floor symbol `$\rfloor$'.}
+\endsetslot
+
+\setslot{ceilingleft}
+ \comment{The left ceiling symbol `$\lceil$'.}
+\endsetslot
+
+\setslot{ceilingright}
+ \comment{The right ceiling symbol `$\rceil$'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The left brace symbol `$\{$'.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The right brace symbol `$\}$'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The left angle bracket symbol `$\langle$'.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The right angle bracket symbol `$\rangle$'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The vertical bar symbol `$|$'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The parallel vertical bars symbol `$\parallel$'.}
+\endsetslot
+
+\setslot{arrowbothv}
+ \comment{The vertical arrows symbol `$\updownarrow$'.}
+\endsetslot
+
+\setslot{arrowdblbothv}
+ \comment{The double vertical arrows symbol `$\Updownarrow$'.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique symbol `$\backslash$'.}
+\endsetslot
+
+\setslot{wreathproduct}
+ \comment{The Wreath product symbol `$\wp$'.}
+\endsetslot
+
+\setslot{radicallow}
+ \comment{The lowered radical symbol `$\surd$'.}
+\endsetslot
+
+\setslot{coproduct}
+ \comment{The textstyle coproduct symbol `$\coprod$'.}
+\endsetslot
+
+\setslot{gradient}
+ \comment{The inverted Delta symbol `$\nabla$'.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The textstyle integral symbol `$\plainint$'.}
+\endsetslot
+
+\setslot{unionsq}
+ \comment{The square union symbol `$\sqcup$'.}
+\endsetslot
+
+\setslot{intersectionsq}
+ \comment{The square intersection symbol `$\sqcap$'.}
+\endsetslot
+
+\setslot{subsetsqequal}
+ \comment{The square subset or equal symbol `$\sqsubseteq$'.}
+\endsetslot
+
+\setslot{supersetsqequal}
+ \comment{The square superset or equal symbol `$\sqsupseteq$'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section symbol `$\S$'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The dagger symbol `$\dag$'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger symbol `$\ddag$'.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph symbol `$\P$'.}
+\endsetslot
+
+\setslot{club}
+ \comment{The club suit symbol `$\clubsuit$'.}
+\endsetslot
+
+\setslot{diamond}
+ \comment{The diamond suit symbol `$\diamondsuit$'.}
+\endsetslot
+
+\setslot{heart}
+ \comment{The heart suit symbol `$\heartsuit$'.}
+\endsetslot
+
+\setslot{spade}
+ \comment{The spade suit symbol `$\spadesuit$'.}
+\endsetslot
+
+%% Now place some of the extra MathTime MTSY glyphs
+
+\nextslot{128}
+\setslot{equal1}
+ \comment{The extender equal sign.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The special math semicolon.}
+\endsetslot
+
+\endencoding
+
+\end{document}
+
diff --git a/fonts/utilities/mathinst/OMSmts.etx b/fonts/utilities/mathinst/OMSmts.etx
new file mode 100644
index 0000000000..f31018ea08
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSmts.etx
@@ -0,0 +1,58 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSmts.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets the script letterspacing for a Math Time
+set of script fonts.
+
+\encoding
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setint{letterspacing}{40}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1171} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from cmsy7.}
+
+\setint{fontdimen(8)}{732}
+\setint{fontdimen(9)}{384}
+\setint{fontdimen(10)}{471}
+\setint{fontdimen(11)}{752}
+\setint{fontdimen(12)}{344}
+\setint{fontdimen(13)}{503}
+\setint{fontdimen(14)}{431}
+\setint{fontdimen(15)}{286}
+\setint{fontdimen(16)}{143}
+\setint{fontdimen(17)}{286}
+\setint{fontdimen(18)}{353}
+\setint{fontdimen(19)}{71}
+\setint{fontdimen(20)}{1700}
+\setint{fontdimen(21)}{1157}
+\setint{fontdimen(22)}{250}
+
+\inputetx{OMSmt}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMSmtss.etx b/fonts/utilities/mathinst/OMSmtss.etx
new file mode 100644
index 0000000000..c65dabc06f
--- /dev/null
+++ b/fonts/utilities/mathinst/OMSmtss.etx
@@ -0,0 +1,58 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMSmtss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets the script letterspacing for a Math Time
+set of scriptscript fonts.
+
+\encoding
+
+\setint{letterspacing}{100}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1472} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from cmsy5.}
+
+\setint{fontdimen(8)}{925} % (NUM1 R 0.925241)
+\setint{fontdimen(9)}{387} % (NUM2 R 0.387464)
+\setint{fontdimen(10)}{504} % (NUM3 R 0.504132)
+\setint{fontdimen(11)}{1025}% (DENOM1 R 1.025241)
+\setint{fontdimen(12)}{532} % (DENOM2 R 0.531909)
+\setint{fontdimen(13)}{504} % (SUP1 R 0.503555)
+\setint{fontdimen(14)}{404} % (SUP2 R 0.403555)
+\setint{fontdimen(15)}{294} % (SUP3 R 0.294446)
+\setint{fontdimen(16)}{200} % (SUB1 R 0.2)
+\setint{fontdimen(17)}{400} % (SUB2 R 0.4)
+\setint{fontdimen(18)}{494} % (SUPDROP R 0.494446
+\setint{fontdimen(19)}{100} % (SUBDROP R 0.1)
+\setint{fontdimen(20)}{1980}% (DELIM1 R 1.979999)
+\setint{fontdimen(21)}{1420}% (DELIM2 R 1.420001)
+\setint{fontdimen(22)}{250} % (AXISHEIGHT R 0.25)
+
+\inputetx{OMSmt}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OMXlu.etx b/fonts/utilities/mathinst/OMXlu.etx
new file mode 100644
index 0000000000..6977a2bdc3
--- /dev/null
+++ b/fonts/utilities/mathinst/OMXlu.etx
@@ -0,0 +1,907 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMXlu.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{530} % x-height from lbme
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from lbme.}
+
+\setint{fontdimen(8)}{40} % (PARAMETER D 8 R 0.004)
+\setint{fontdimen(9)}{120} % (PARAMETER D 9 R 0.012)
+\setint{fontdimen(10)}{170} % (PARAMETER D 10 R 0.017)
+\setint{fontdimen(11)}{200} % (PARAMETER D 11 R 0.02)
+\setint{fontdimen(12)}{600} % (PARAMETER D 12 R 0.06)
+\setint{fontdimen(13)}{110} % (PARAMETER D 13 R 0.011)
+
+%\inputetx{OMX}
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{parenleftbig}
+ \nextlarger{parenleftBig}
+\endsetslot
+
+\setslot{parenrightbig}
+ \nextlarger{parenrightBig}
+\endsetslot
+
+\setslot{bracketleftbig}
+ \nextlarger{bracketleftBig}
+\endsetslot
+
+\setslot{bracketrightbig}
+ \nextlarger{bracketrightBig}
+\endsetslot
+
+\setslot{floorleftbig}
+ \nextlarger{floorleftBig}
+\endsetslot
+
+\setslot{floorrightbig}
+ \nextlarger{floorrightBig}
+\endsetslot
+
+\setslot{ceilingleftbig}
+ \nextlarger{ceilingleftBig}
+\endsetslot
+
+\setslot{ceilingrightbig}
+ \nextlarger{ceilingrightBig}
+\endsetslot
+
+\setslot{braceleftbig}
+ \nextlarger{braceleftBig}
+\endsetslot
+
+\setslot{bracerightbig}
+ \nextlarger{bracerightBig}
+\endsetslot
+
+\setslot{angleleftbig}
+ \nextlarger{angleleftBig}
+\endsetslot
+
+\setslot{anglerightbig}
+ \nextlarger{anglerightBig}
+\endsetslot
+
+\setslot{barex}
+ \varchar
+ \varrep{barex}
+ \endvarchar
+\endsetslot
+
+\setslot{bardblex}
+ \varchar
+ \varrep{bardblex}
+ \endvarchar
+\endsetslot
+
+\setslot{slashbig}
+ \nextlarger{slashBig}
+\endsetslot
+
+\setslot{backslashbig}
+ \nextlarger{backslashBig}
+\endsetslot
+
+\setslot{parenleftBig}
+ \nextlarger{parenleftbigg}
+\endsetslot
+
+\setslot{parenrightBig}
+ \nextlarger{parenrightbigg}
+\endsetslot
+
+\setslot{parenleftbigg}
+ \nextlarger{parenleftBigg}
+\endsetslot
+
+\setslot{parenrightbigg}
+ \nextlarger{parenrightBigg}
+\endsetslot
+
+\setslot{bracketleftbigg}
+ \nextlarger{bracketleftBigg}
+\endsetslot
+
+\setslot{bracketrightbigg}
+ \nextlarger{bracketrightBigg}
+\endsetslot
+
+\setslot{floorleftbigg}
+ \nextlarger{floorleftBigg}
+\endsetslot
+
+\setslot{floorrightbigg}
+ \nextlarger{floorrightBigg}
+\endsetslot
+
+\setslot{ceilingleftbigg}
+ \nextlarger{ceilingleftBigg}
+\endsetslot
+
+\setslot{ceilingrightbigg}
+ \nextlarger{ceilingrightBigg}
+\endsetslot
+
+\setslot{braceleftbigg}
+ \nextlarger{braceleftBigg}
+\endsetslot
+
+\setslot{bracerightbigg}
+ \nextlarger{bracerightBigg}
+\endsetslot
+
+\setslot{angleleftbigg}
+ \nextlarger{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightbigg}
+ \nextlarger{anglerightBigg}
+\endsetslot
+
+\setslot{slashbigg}
+ \nextlarger{slashBigg}
+\endsetslot
+
+\setslot{backslashbigg}
+ \nextlarger{backslashBigg}
+\endsetslot
+
+\setslot{parenleftBigg}
+ \nextlarger{parenlefttp}
+\endsetslot
+
+\setslot{parenrightBigg}
+ \nextlarger{parenrighttp}
+\endsetslot
+
+\setslot{bracketleftBigg}
+ \nextlarger{bracketlefttp}
+\endsetslot
+
+\setslot{bracketrightBigg}
+ \nextlarger{bracketrighttp}
+\endsetslot
+
+\setslot{floorleftBigg}
+ \nextlarger{bracketleftbt}
+\endsetslot
+
+\setslot{floorrightBigg}
+ \nextlarger{bracketrightbt}
+\endsetslot
+
+\setslot{ceilingleftBigg}
+ \nextlarger{bracketleftex}
+\endsetslot
+
+\setslot{ceilingrightBigg}
+ \nextlarger{bracketrightex}
+\endsetslot
+
+\setslot{braceleftBigg}
+ \nextlarger{bracelefttp}
+\endsetslot
+
+\setslot{bracerightBigg}
+ \nextlarger{bracerighttp}
+\endsetslot
+
+\setslot{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightBigg}
+\endsetslot
+
+\setslot{slashBigg}
+\endsetslot
+
+\setslot{backslashBigg}
+\endsetslot
+
+\setslot{slashBig}
+ \nextlarger{slashbigg}
+\endsetslot
+
+\setslot{backslashBig}
+ \nextlarger{backslashbigg}
+\endsetslot
+
+\setslot{parenlefttp}
+ \varchar
+ \vartop{parenlefttp}
+ \varbot{parenleftbt}
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrighttp}
+ \varchar
+ \vartop{parenrighttp}
+ \varbot{parenrightbt}
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketlefttp}
+ \varchar
+ \vartop{bracketlefttp}
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrighttp}
+ \varchar
+ \vartop{bracketrighttp}
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftbt}
+ \varchar
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightbt}
+ \varchar
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftex}
+ \varchar
+ \vartop{bracketlefttp}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightex}
+ \varchar
+ \vartop{bracketrighttp}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracelefttp}
+ \varchar
+ \vartop{bracelefttp}
+ \varmid{braceleftmid}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerighttp}
+ \varchar
+ \vartop{bracerighttp}
+ \varmid{bracerightmid}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftmid}
+ \varchar
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightmid}
+ \varchar
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceex}
+ \varchar
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowvertex}
+ \varchar
+ \vartop{arrowtp}
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{braceleftmid}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftex}
+ \varchar
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightex}
+ \varchar
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{angleleftBig}
+ \nextlarger{angleleftbigg}
+\endsetslot
+
+\setslot{anglerightBig}
+ \nextlarger{anglerightbigg}
+\endsetslot
+
+\setslot{unionsqtext}
+ \nextlarger{unionsqdisplay}
+\endsetslot
+
+\setslot{unionsqdisplay}
+\endsetslot
+
+\setslot{contintegraltext}
+ \nextlarger{contintegralmid}
+\endsetslot
+
+\setslot{contintegraldisplay}
+\endsetslot
+
+\setslot{circledottext}
+ \nextlarger{circledotdisplay}
+\endsetslot
+
+\setslot{circledotdisplay}
+\endsetslot
+
+\setslot{circleplustext}
+ \nextlarger{circleplusdisplay}
+\endsetslot
+
+\setslot{circleplusdisplay}
+\endsetslot
+
+\setslot{circlemultiplytext}
+ \nextlarger{circlemultiplydisplay}
+\endsetslot
+
+\setslot{circlemultiplydisplay}
+\endsetslot
+
+\setslot{summationtext}
+ \nextlarger{summationdisplay}
+\endsetslot
+
+\setslot{producttext}
+ \nextlarger{productdisplay}
+\endsetslot
+
+\setslot{integraltext}
+ \nextlarger{integralmid}
+\endsetslot
+
+\setslot{uniontext}
+ \nextlarger{uniondisplay}
+\endsetslot
+
+\setslot{intersectiontext}
+ \nextlarger{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultitext}
+ \nextlarger{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalandtext}
+ \nextlarger{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalortext}
+ \nextlarger{logicalordisplay}
+\endsetslot
+
+\setslot{summationdisplay}
+\endsetslot
+
+\setslot{productdisplay}
+\endsetslot
+
+\setslot{integraldisplay}
+ \nextlarger{integraltp}
+\endsetslot
+
+\setslot{uniondisplay}
+\endsetslot
+
+\setslot{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalordisplay}
+\endsetslot
+
+\setslot{coproducttext}
+ \nextlarger{coproductdisplay}
+\endsetslot
+
+\setslot{coproductdisplay}
+\endsetslot
+
+\setslot{hatwide}
+ \nextlarger{hatwider}
+\endsetslot
+
+\setslot{hatwider}
+ \nextlarger{hatwiderr}
+\endsetslot
+
+\setslot{hatwiderr}
+ \nextlarger{hatwide1}
+\endsetslot
+
+\setslot{tildewide}
+ \nextlarger{tildewider}
+\endsetslot
+
+\setslot{tildewider}
+ \nextlarger{tildewiderr}
+\endsetslot
+
+\setslot{tildewiderr}
+ \nextlarger{tildewide1}
+\endsetslot
+
+\setslot{bracketleftBig}
+ \nextlarger{bracketleftbigg}
+\endsetslot
+
+\setslot{bracketrightBig}
+ \nextlarger{bracketrightbigg}
+\endsetslot
+
+\setslot{floorleftBig}
+ \nextlarger{floorleftbigg}
+\endsetslot
+
+\setslot{floorrightBig}
+ \nextlarger{floorrightbigg}
+\endsetslot
+
+\setslot{ceilingleftBig}
+ \nextlarger{ceilingleftbigg}
+\endsetslot
+
+\setslot{ceilingrightBig}
+ \nextlarger{ceilingrightbigg}
+\endsetslot
+
+\setslot{braceleftBig}
+ \nextlarger{braceleftbigg}
+\endsetslot
+
+\setslot{bracerightBig}
+ \nextlarger{bracerightbigg}
+\endsetslot
+
+\setslot{radicalbig}
+ \nextlarger{radicalBig}
+\endsetslot
+
+\setslot{radicalBig}
+ \nextlarger{radicalbigg}
+\endsetslot
+
+\setslot{radicalbigg}
+ \nextlarger{radicalBigg}
+\endsetslot
+
+\setslot{radicalBigg}
+ \nextlarger{radicalbt}
+\endsetslot
+
+\setslot{radicalbt}
+ \varchar
+ \varbot{radicalbt}
+ \vartop{radicaltp}
+ \varrep{radicalvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{radicalvertex}
+\endsetslot
+
+\setslot{radicaltp}
+\endsetslot
+
+\setslot{arrowdblvertex}
+ \varchar
+ \vartop{arrowdbltp}
+ \varbot{arrowdblbt}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowtp}
+ \varchar
+ \vartop{arrowtp}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowbt}
+ \varchar
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracehtipdownleft}
+\endsetslot
+
+\setslot{bracehtipdownright}
+\endsetslot
+
+\setslot{bracehtipupleft}
+\endsetslot
+
+\setslot{bracehtipupright}
+\endsetslot
+
+\setslot{arrowdbltp}
+ \varchar
+ \vartop{arrowdbltp}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowdblbt}
+ \varchar
+ \varbot{arrowdblbt}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+%% This is new, and names the glyphs in the upper part of the font.
+
+\nextslot{130}
+\setslot{openbracketleftbig}
+ \nextlarger{openbracketleftBig}
+\endsetslot
+
+\nextslot{131}
+\setslot{openbracketrightbig}
+ \nextlarger{openbracketrightBig}
+\endsetslot
+
+\nextslot{132}
+\setslot{openbracketleftBig}
+ \nextlarger{openbracketleftbigg}
+\endsetslot
+
+\nextslot{133}
+\setslot{openbracketrightBig}
+ \nextlarger{openbracketrightbigg}
+\endsetslot
+
+\nextslot{134}
+\setslot{openbracketleftbigg}
+ \nextlarger{openbracketleftBigg}
+\endsetslot
+
+\nextslot{135}
+\setslot{openbracketrightbigg}
+ \nextlarger{openbracketrightBigg}
+\endsetslot
+
+\nextslot{136}
+\setslot{openbracketleftBigg}
+ \nextlarger{openbracketlefttp}
+\endsetslot
+
+\nextslot{137}
+\setslot{openbracketrightBigg}
+ \nextlarger{openbracketrighttp}
+\endsetslot
+
+\nextslot{138}
+\setslot{openbracketlefttp}
+ \varchar
+ \vartop{openbracketlefttp}
+ \varbot{openbracketleftbt}
+ \varrep{openbracketleftex}
+ \endvarchar
+\endsetslot
+
+\nextslot{139}
+\setslot{openbracketrighttp}
+ \varchar
+ \vartop{openbracketrighttp}
+ \varbot{openbracketrightbt}
+ \varrep{openbracketrightex}
+ \endvarchar
+\endsetslot
+
+\nextslot{140}
+\setslot{openbracketleftbt}
+\endsetslot
+
+\nextslot{141}
+\setslot{openbracketrightbt}
+\endsetslot
+
+\nextslot{142}
+\setslot{openbracketleftex}
+ \varchar
+ \varrep{openbracketleftex}
+ \endvarchar
+\endsetslot
+
+\nextslot{143}
+\setslot{openbracketrightex}
+ \varchar
+ \varrep{openbracketrightex}
+ \endvarchar
+\endsetslot
+
+\nextslot{144}
+\setslot{surfintegraltext}
+ \nextlarger{surfintegralmid}
+\endsetslot
+
+\nextslot{145}
+\setslot{surfintegraldisplay}
+\endsetslot
+
+\nextslot{146}
+\setslot{integralmid}
+ \nextlarger{integraldisplay}
+\endsetslot
+
+\nextslot{147}
+\setslot{contintegralmid}
+ \nextlarger{contintegraldisplay}
+\endsetslot
+
+\nextslot{148}
+\setslot{surfintegralmid}
+ \nextlarger{surfintegraldisplay}
+\endsetslot
+
+\nextslot{149}
+\setslot{integraltp}
+ \varchar
+ \vartop{integraltp}
+ \varbot{integralbt}
+ \varrep{integralex}
+ \endvarchar
+\endsetslot
+
+\nextslot{150}
+\setslot{integralbt}
+ \varchar
+ \vartop{integraltp}
+ \varbot{integralbt}
+ \varrep{integralex}
+ \endvarchar
+\endsetslot
+
+\nextslot{151}
+\setslot{integralex}
+ \varchar
+ \varrep{integralex}
+ \endvarchar
+\endsetslot
+
+\nextslot{160}
+\setslot{space}
+\endsetslot
+
+\nextslot{197}
+\setslot{hatwide1}
+ \nextlarger{hatwider1}
+\endsetslot
+
+\nextslot{198}
+\setslot{hatwider1}
+\endsetslot
+
+\nextslot{199}
+\setslot{tildewide1}
+ \nextlarger{tildewider1}
+\endsetslot
+
+\nextslot{200}
+\setslot{tildewider1}
+\endsetslot
+
+\nextslot{208}
+\setslot{Gamma}
+\endsetslot
+
+\nextslot{209}
+\setslot{Delta}
+\endsetslot
+
+\nextslot{210}
+\setslot{Theta}
+\endsetslot
+
+\nextslot{211}
+\setslot{Lambda}
+\endsetslot
+
+\nextslot{212}
+\setslot{Xi}
+\endsetslot
+
+\nextslot{213}
+\setslot{Pi}
+\endsetslot
+
+\nextslot{214}
+\setslot{Sigma}
+\endsetslot
+
+\nextslot{215}
+\setslot{Upsilon}
+\endsetslot
+
+\nextslot{216}
+\setslot{Phi}
+\endsetslot
+
+\nextslot{217}
+\setslot{Psi}
+\endsetslot
+
+\nextslot{218}
+\setslot{Omega}
+\endsetslot
+
+\nextslot{252}
+\setslot{negeighteenthem}
+\endsetslot
+
+\nextslot{253}
+\setslot{eighteenthem}
+\endsetslot
+
+\nextslot{254}
+\setslot{eighthem}
+\endsetslot
+
+\nextslot{255}
+\setslot{tenthem}
+\endsetslot
+
+\endencoding
+
+%% Comment WARNING: ascendible characters (92) % macro - PS charname
+%% Comment Ascending 0, 16, 18, 32, 48 % ( - parenleft
+%% Comment Ascending 1, 17, 19, 33, 49 % ) - parenright
+%% Comment Ascending 2, 104, 20, 34, 50 % [ - bracketleft
+%% Comment Ascending 3, 105, 21, 35, 51 % ] - bracketright
+%% Comment Ascending 4, 106, 22, 36, 52 % lfloor - floorleft
+%% Comment Ascending 5, 107, 23, 37, 53 % rfloor - floorright
+%% Comment Ascending 6, 108, 24, 38, 54 % lceil - ceilingleft
+%% Comment Ascending 7, 109, 25, 39, 55 % rceil - ceilingright
+%% Comment Ascending 8, 110, 26, 40, 56 % { - braceleft
+%% Comment Ascending 9, 111, 27, 41, 57 % } - braceright
+%% Comment Ascending 10, 68, 28, 42 % < - anglebracketleft
+%% Comment Ascending 11, 69, 29, 43 % > - anglebracketright
+%% Comment Ascending 14, 46, 30, 44 % / - slash
+%% Comment Ascending 15, 47, 31, 45 % \ - backslash
+%% Comment Ascending 70, 71 % bigsqcup - unionsq
+%% Comment Ascending 72, 73 % oint - contintegral
+%% Comment Ascending 74, 75 % bigodot - circledot
+%% Comment Ascending 76, 77 % bigoplus - circleplus
+%% Comment Ascending 78, 79 % bigotimes - circlemultiply
+%% Comment Ascending 80, 88 % sum - summation
+%% Comment Ascending 81, 89 % prod - product
+%% Comment Ascending 82, 90 % int - integral
+%% Comment Ascending 83, 91 % bigcup - union
+%% Comment Ascending 84, 92 % bigcap - intersection
+%% Comment Ascending 85, 93 % biguplus - unionmulti
+%% Comment Ascending 86, 94 % bigwedge - logicaland
+%% Comment Ascending 87, 95 % bigvee - logicalor
+%% Comment Ascending 96, 97 % coprod - coproduct
+%% Comment Ascending 98, 99, 100, 197, 198 % widehat - hatwide
+%% Comment Ascending 101, 102, 103, 199, 200 % widetilde - tildewide
+%% Comment Ascending 112, 113, 114, 115, 116 % radical - sqrt
+%% Comment Ascending 130, 132, 134, 136, 138 % [[ openbracketleft
+%% Comment Ascending 131, 133, 135, 137, 139 % ]] openbracketright
+%% Comment Ascending 144, 145 % surfint - surfintegral
+%% Comment WARNING: extensible characters (31)
+%% Comment Extensible 12 top 0 mid 0 bot 0 rep 12 % vert - thin bar
+%% Comment Extensible 13 top 0 mid 0 bot 0 rep 13 % Vert - thin double bar
+%% Comment Extensible 48 top 48 mid 0 bot 64 rep 66 % ( - parenleft
+%% Comment Extensible 49 top 49 mid 0 bot 65 rep 67 % ) - parenright
+%% Comment Extensible 50 top 50 mid 0 bot 52 rep 54 % [ - bracketleft
+%% Comment Extensible 51 top 51 mid 0 bot 53 rep 55 % ] - bracketright
+%% Comment Extensible 52 top 0 mid 0 bot 52 rep 54 % lfloor - floorleft
+%% Comment Extensible 53 top 0 mid 0 bot 53 rep 55 % rfloor - floorright
+%% Comment Extensible 54 top 50 mid 0 bot 0 rep 54 % lceil - ceilingleft
+%% Comment Extensible 55 top 51 mid 0 bot 0 rep 55 % rceil - ceilingright
+%% Comment Extensible 56 top 56 mid 60 bot 58 rep 62 % { - braceleft
+%% Comment Extensible 57 top 57 mid 61 bot 59 rep 62 % } - braceright
+%% Comment Extensible 58 top 56 mid 0 bot 58 rep 62 % lgroup
+%% Comment Extensible 59 top 57 mid 0 bot 59 rep 62 % rgroup
+%% Comment Extensible 60 top 0 mid 0 bot 0 rep 63 % arrowvert
+%% Comment Extensible 61 top 0 mid 0 bot 0 rep 119 % Arrowvert
+%% Comment Extensible 62 top 0 mid 0 bot 0 rep 62 % bracevert
+%% Comment Extensible 63 top 120 mid 0 bot 121 rep 63 % updownarrow
+%% Comment Extensible 64 top 56 mid 0 bot 59 rep 62 % lmoustache
+%% Comment Extensible 65 top 57 mid 0 bot 58 rep 62 % rmoustache
+%% Comment Extensible 66 top 0 mid 0 bot 0 rep 66 % - parenleftexten
+%% Comment Extensible 67 top 0 mid 0 bot 0 rep 67 % - parenrightexten
+%% Comment Extensible 116 top 118 mid 0 bot 116 rep 117 % radical
+%% Comment Extensible 119 top 126 mid 0 bot 127 rep 119 % Updownarrow
+%% Comment Extensible 120 top 120 mid 0 bot 0 rep 63 % uparrow
+%% Comment Extensible 121 top 0 mid 0 bot 121 rep 63 % downarrow
+%% Comment Extensible 126 top 126 mid 0 bot 0 rep 119 % Uparrow
+%% Comment Extensible 127 top 0 mid 0 bot 127 rep 119 % Downarrow
+%% Comment Extensible 138 top 138 mid 0 bot 140 rep 142 % openbracketleft
+%% Comment Extensible 139 top 139 mid 0 bot 141 rep 143 % openbracketright
+%% Comment Extensible 149 top 149 mid 0 bot 150 rep 151 % largeintegral
+
+
diff --git a/fonts/utilities/mathinst/OMXmt.etx b/fonts/utilities/mathinst/OMXmt.etx
new file mode 100644
index 0000000000..dd815904bc
--- /dev/null
+++ b/fonts/utilities/mathinst/OMXmt.etx
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OMXmt.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.301}
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{440} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{The following font dimensions are taken from MTEX.}
+
+\setint{fontdimen(8)}{46} % (PARAMETER D 8 R 0.046)
+\setint{fontdimen(9)}{117} % (PARAMETER D 9 R 0.116667)
+\setint{fontdimen(10)}{178} % (PARAMETER D 10 R 0.177777)
+\setint{fontdimen(11)}{211} % (PARAMETER D 11 R 0.211111)
+\setint{fontdimen(12)}{600} % (PARAMETER D 12 R 0.6)
+\setint{fontdimen(13)}{111} % (PARAMETER D 13 R 0.111111)
+
+\inputetx{OMX}
+
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OT1eu.etx b/fonts/utilities/mathinst/OT1eu.etx
new file mode 100644
index 0000000000..58db88c3b6
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1eu.etx
@@ -0,0 +1,858 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1eu.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%========================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey",
+%%% version = "1.327",
+%%% date = "01 June 1994",
+%%% time = "16:39:59 BST",
+%%% filename = "OT1.etx",
+%%% address = "School of Cognitive and Computing Sciences
+%%% University of Sussex
+%%% Brighton BN1 9QH
+%%% UK",
+%%% FAX = "+44 273 678188",
+%%% email = "alanje@cogs.sussex.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, Cork, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the TeX text encoding as a TeX font
+%%% encoding file, for use with the fontinst
+%%% font installation package.",
+%%% package = "fontinst",
+%%% dependencies = "fontdoc.sty, ltugboat.sty",
+%%% }
+%%%========================================================================
+
+\relax
+
+\documentstyle[fontdoc,twocolumn]{article}
+
+\title{The \TeX\ text encoding vector}
+\author{Alan Jeffrey}
+\date{01 June 1994}
+
+%\address{School of Cognitive and Computing Sciences \\
+% University of Sussex \\
+% Falmer \\
+% Brighton \\
+% BN1 9QH \\
+% UK}
+%\netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ text (OT1) encoding.
+
+To use this encoding, you should define the following macros:
+\begin{itemize}
+
+\item \verb|\lc{A}{a}| should return the name of a lower-case
+ glyph, for example `{\tt a}' or `{\tt Asmall}'.
+
+\item \verb|\uc{A}{a}| should return the name of an upper-case
+ glyph, for example `{\tt A}' or `{\tt Amedium}'.
+
+\item \verb|\lclig{FI}{fi}| should return the name of a lower-case
+ ligature, for example `{\tt fi}' or `{\tt FIsmall}'.
+
+\item \verb|\uclig{FI}{fi}| should return the name of an upper-case
+ ligature, for example `{\tt FI}' or `{\tt FImedium}'.
+
+\item \verb|\digit{zero}| should return the name of a digit, for
+ example `{\tt zero}' or `{\tt zerooldstyle}'.
+
+\item \verb|\tty| should be `y' if the encoding is \TeX\ typewriter
+ (cmtt) encoding, and `n' otherwise.
+
+\item \verb|\currency| should be the name of the currency glyph, either
+ `sterling' or `dollar'.
+
+\end{itemize}
+These should all expand in the mouth, otherwise you may get error
+messages!
+For example, to get the standard upper and lower case font, you should
+define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2}
+ \setcommand\uclig#1#2{#1}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get a caps and small caps font with old style digits and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1small}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2small}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1oldstyle}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get an all-caps font with medium-cap composite letters and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#1spaced}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+This document describes the upper and lower case encoding.
+
+\encoding
+
+\needsfontinstversion{1.327}
+
+\comment{\section{Default values}}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+\ifisint{monowidth}\then
+ \setcommand\tty{y}
+\else
+ \setcommand\tty{n}
+\fi
+\setcommand\currency{dollar}
+
+\if \tty y
+ \setstr{codingscheme}{TEX TYPEWRITER TEXT}
+\else
+ \setstr{codingscheme}{TEX TEXT}
+\fi
+
+\setint{italicslant}{0}
+
+\setint{xheight}{
+ \ifisglyph{x}\then
+ \height{x}
+ \else
+ 0
+ \fi
+}
+
+\setint{interword}{
+ \ifisglyph{space}\then
+ \width{space}
+ \else
+ 0
+ \fi
+}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{333}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{333}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{333}}% extra space after .
+\fi
+
+\comment{\section{The encoding}
+ There are 130 glyphs in this encoding. 128 of these are in Knuth's CM
+ encoding, and the other two are `\l' and `\L', which are composite
+ letters in CM, but are single glyphs in almost every other font.}
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `{\tt\char`\'}', for use
+ with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `{\tt\char`\ }'.}
+\endsetslot
+
+\else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `{\tt\char`\"}', included for
+ use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\else
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{\currency}
+ \comment{Either the dollar sign `\$' or the pound sign `\pounds',
+ depending on the font.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \if \tty y \else \ligature{LIG}{quoteright}{quotedblright} \fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \if \tty y \else \ligature{LIG}{hyphen}{rangedash} \fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\if \tty y
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\else
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{underscore}
+ \comment{The ASCII underline character `{\tt\char`\_}', usually set on
+ the baseline.}
+\endsetslot
+
+\else
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\fi
+
+\setslot{quoteleft}
+ \if \tty y \else \ligature{LIG}{quoteleft}{quotedblleft} \fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+\if \tty y \else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+\fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is
+ included for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\else
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `{\tt 1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `{\tt Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\comment{
+ \section{Non-standard ligatures}
+ The `\l' and `\L' glyphs are not usually in the OT1 encoding, but
+ they're needed for fonts which don't have a special `lslashslash'
+ glyph.
+}
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/mathinst/OT1eus.etx b/fonts/utilities/mathinst/OT1eus.etx
new file mode 100644
index 0000000000..6ad448472b
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1eus.etx
@@ -0,0 +1,858 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1eus.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%========================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey",
+%%% version = "1.327",
+%%% date = "01 June 1994",
+%%% time = "16:39:59 BST",
+%%% filename = "OT1.etx",
+%%% address = "School of Cognitive and Computing Sciences
+%%% University of Sussex
+%%% Brighton BN1 9QH
+%%% UK",
+%%% FAX = "+44 273 678188",
+%%% email = "alanje@cogs.sussex.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, Cork, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the TeX text encoding as a TeX font
+%%% encoding file, for use with the fontinst
+%%% font installation package.",
+%%% package = "fontinst",
+%%% dependencies = "fontdoc.sty, ltugboat.sty",
+%%% }
+%%%========================================================================
+
+\relax
+
+\documentstyle[fontdoc,twocolumn]{article}
+
+\title{The \TeX\ text encoding vector}
+\author{Alan Jeffrey}
+\date{01 June 1994}
+
+%\address{School of Cognitive and Computing Sciences \\
+% University of Sussex \\
+% Falmer \\
+% Brighton \\
+% BN1 9QH \\
+% UK}
+%\netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ text (OT1) encoding.
+
+To use this encoding, you should define the following macros:
+\begin{itemize}
+
+\item \verb|\lc{A}{a}| should return the name of a lower-case
+ glyph, for example `{\tt a}' or `{\tt Asmall}'.
+
+\item \verb|\uc{A}{a}| should return the name of an upper-case
+ glyph, for example `{\tt A}' or `{\tt Amedium}'.
+
+\item \verb|\lclig{FI}{fi}| should return the name of a lower-case
+ ligature, for example `{\tt fi}' or `{\tt FIsmall}'.
+
+\item \verb|\uclig{FI}{fi}| should return the name of an upper-case
+ ligature, for example `{\tt FI}' or `{\tt FImedium}'.
+
+\item \verb|\digit{zero}| should return the name of a digit, for
+ example `{\tt zero}' or `{\tt zerooldstyle}'.
+
+\item \verb|\tty| should be `y' if the encoding is \TeX\ typewriter
+ (cmtt) encoding, and `n' otherwise.
+
+\item \verb|\currency| should be the name of the currency glyph, either
+ `sterling' or `dollar'.
+
+\end{itemize}
+These should all expand in the mouth, otherwise you may get error
+messages!
+For example, to get the standard upper and lower case font, you should
+define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2}
+ \setcommand\uclig#1#2{#1}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get a caps and small caps font with old style digits and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1small}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2small}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1oldstyle}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get an all-caps font with medium-cap composite letters and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#1spaced}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+This document describes the upper and lower case encoding.
+
+\encoding
+
+\needsfontinstversion{1.327}
+
+\comment{\section{Default values}}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+\ifisint{monowidth}\then
+ \setcommand\tty{y}
+\else
+ \setcommand\tty{n}
+\fi
+\setcommand\currency{dollar}
+
+\if \tty y
+ \setstr{codingscheme}{TEX TYPEWRITER TEXT}
+\else
+ \setstr{codingscheme}{TEX TEXT}
+\fi
+
+\setint{italicslant}{0}
+
+\setint{xheight}{
+ \ifisglyph{x}\then
+ \height{x}
+ \else
+ 0
+ \fi
+}
+
+\setint{interword}{
+ \ifisglyph{space}\then
+ \width{space}
+ \else
+ 0
+ \fi
+}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{333}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{333}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{333}}% extra space after .
+\fi
+
+\comment{\section{The encoding}
+ There are 130 glyphs in this encoding. 128 of these are in Knuth's CM
+ encoding, and the other two are `\l' and `\L', which are composite
+ letters in CM, but are single glyphs in almost every other font.}
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `{\tt\char`\'}', for use
+ with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `{\tt\char`\ }'.}
+\endsetslot
+
+\else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `{\tt\char`\"}', included for
+ use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\else
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{\currency}
+ \comment{Either the dollar sign `\$' or the pound sign `\pounds',
+ depending on the font.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \if \tty y \else \ligature{LIG}{quoteright}{quotedblright} \fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \if \tty y \else \ligature{LIG}{hyphen}{rangedash} \fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\if \tty y
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\else
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{underscore}
+ \comment{The ASCII underline character `{\tt\char`\_}', usually set on
+ the baseline.}
+\endsetslot
+
+\else
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\fi
+
+\setslot{quoteleft}
+ \if \tty y \else \ligature{LIG}{quoteleft}{quotedblleft} \fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+\if \tty y \else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+\fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is
+ included for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\else
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `{\tt 1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `{\tt Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\comment{
+ \section{Non-standard ligatures}
+ The `\l' and `\L' glyphs are not usually in the OT1 encoding, but
+ they're needed for fonts which don't have a special `lslashslash'
+ glyph.
+}
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/mathinst/OT1euss.etx b/fonts/utilities/mathinst/OT1euss.etx
new file mode 100644
index 0000000000..1c9964d47e
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1euss.etx
@@ -0,0 +1,858 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1euss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%========================================================================
+%%% @TeX-font-encoding-file{
+%%% author = "Alan Jeffrey",
+%%% version = "1.327",
+%%% date = "01 June 1994",
+%%% time = "16:39:59 BST",
+%%% filename = "OT1.etx",
+%%% address = "School of Cognitive and Computing Sciences
+%%% University of Sussex
+%%% Brighton BN1 9QH
+%%% UK",
+%%% FAX = "+44 273 678188",
+%%% email = "alanje@cogs.sussex.ac.uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "encoding, Cork, TeX, PostScript",
+%%% supported = "yes",
+%%% abstract = "This is the TeX text encoding as a TeX font
+%%% encoding file, for use with the fontinst
+%%% font installation package.",
+%%% package = "fontinst",
+%%% dependencies = "fontdoc.sty, ltugboat.sty",
+%%% }
+%%%========================================================================
+
+\relax
+
+\documentstyle[fontdoc,twocolumn]{article}
+
+\title{The \TeX\ text encoding vector}
+\author{Alan Jeffrey}
+\date{01 June 1994}
+
+%\address{School of Cognitive and Computing Sciences \\
+% University of Sussex \\
+% Falmer \\
+% Brighton \\
+% BN1 9QH \\
+% UK}
+%\netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the \TeX\ text (OT1) encoding.
+
+To use this encoding, you should define the following macros:
+\begin{itemize}
+
+\item \verb|\lc{A}{a}| should return the name of a lower-case
+ glyph, for example `{\tt a}' or `{\tt Asmall}'.
+
+\item \verb|\uc{A}{a}| should return the name of an upper-case
+ glyph, for example `{\tt A}' or `{\tt Amedium}'.
+
+\item \verb|\lclig{FI}{fi}| should return the name of a lower-case
+ ligature, for example `{\tt fi}' or `{\tt FIsmall}'.
+
+\item \verb|\uclig{FI}{fi}| should return the name of an upper-case
+ ligature, for example `{\tt FI}' or `{\tt FImedium}'.
+
+\item \verb|\digit{zero}| should return the name of a digit, for
+ example `{\tt zero}' or `{\tt zerooldstyle}'.
+
+\item \verb|\tty| should be `y' if the encoding is \TeX\ typewriter
+ (cmtt) encoding, and `n' otherwise.
+
+\item \verb|\currency| should be the name of the currency glyph, either
+ `sterling' or `dollar'.
+
+\end{itemize}
+These should all expand in the mouth, otherwise you may get error
+messages!
+For example, to get the standard upper and lower case font, you should
+define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#2}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2}
+ \setcommand\uclig#1#2{#1}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get a caps and small caps font with old style digits and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1small}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#2small}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1oldstyle}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+To get an all-caps font with medium-cap composite letters and letter
+spacing, you should define:
+\begin{verbatim}
+ \setcommand\lc#1#2{#1}
+ \setcommand\uc#1#2{#1}
+ \setcommand\lclig#1#2{#1spaced}
+ \setcommand\uclig#1#2{#1spaced}
+ \setcommand\digit#1{#1}
+ \setcommand\tty{n}
+ \setcommand\currency{dollar}
+\end{verbatim}
+This document describes the upper and lower case encoding.
+
+\encoding
+
+\needsfontinstversion{1.327}
+
+\comment{\section{Default values}}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1}
+\ifisint{monowidth}\then
+ \setcommand\tty{y}
+\else
+ \setcommand\tty{n}
+\fi
+\setcommand\currency{dollar}
+
+\if \tty y
+ \setstr{codingscheme}{TEX TYPEWRITER TEXT}
+\else
+ \setstr{codingscheme}{TEX TEXT}
+\fi
+
+\setint{italicslant}{0}
+
+\setint{xheight}{
+ \ifisglyph{x}\then
+ \height{x}
+ \else
+ 0
+ \fi
+}
+
+\setint{interword}{
+ \ifisglyph{space}\then
+ \width{space}
+ \else
+ 0
+ \fi
+}
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{333}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{333}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{333}}% extra space after .
+\fi
+
+\comment{\section{The encoding}
+ There are 130 glyphs in this encoding. 128 of these are in Knuth's CM
+ encoding, and the other two are `\l' and `\L', which are composite
+ letters in CM, but are single glyphs in almost every other font.}
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `{\tt\char`\'}', for use
+ with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `{\tt\char`\ }'.}
+\endsetslot
+
+\else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `{\tt\char`\"}', included for
+ use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\else
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{\currency}
+ \comment{Either the dollar sign `\$' or the pound sign `\pounds',
+ depending on the font.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+\endsetslot
+
+\setslot{quoteright}
+ \if \tty y \else \ligature{LIG}{quoteright}{quotedblright} \fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \if \tty y \else \ligature{LIG}{hyphen}{rangedash} \fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\if \tty y
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\else
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{underscore}
+ \comment{The ASCII underline character `{\tt\char`\_}', usually set on
+ the baseline.}
+\endsetslot
+
+\else
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\fi
+
+\setslot{quoteleft}
+ \if \tty y \else \ligature{LIG}{quoteleft}{quotedblleft} \fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+\if \tty y \else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+\fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is
+ included for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\else
+
+\setslot{rangedash}
+ \ligature{LIG}{hyphen}{punctdash}
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `{\tt 1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `{\tt Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\comment{
+ \section{Non-standard ligatures}
+ The `\l' and `\L' glyphs are not usually in the OT1 encoding, but
+ they're needed for fonts which don't have a special `lslashslash'
+ glyph.
+}
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\endencoding
+
+\end{document}
diff --git a/fonts/utilities/mathinst/OT1lus.etx b/fonts/utilities/mathinst/OT1lus.etx
new file mode 100644
index 0000000000..451a39bd98
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1lus.etx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1lus.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\setint{letterspacing}{30}
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OT1luss.etx b/fonts/utilities/mathinst/OT1luss.etx
new file mode 100644
index 0000000000..688a5b8c88
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1luss.etx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1luss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+\encoding
+
+\setint{letterspacing}{75}
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OT1s.etx b/fonts/utilities/mathinst/OT1s.etx
new file mode 100644
index 0000000000..c58b524720
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1s.etx
@@ -0,0 +1,18 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1s.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets letterspacing for a script font.
+
+\encoding
+
+\setint{letterspacing}{25}
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/OT1ss.etx b/fonts/utilities/mathinst/OT1ss.etx
new file mode 100644
index 0000000000..e4cedc422e
--- /dev/null
+++ b/fonts/utilities/mathinst/OT1ss.etx
@@ -0,0 +1,18 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file OT1ss.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This sets letterspacing for a script font.
+
+\encoding
+
+\setint{letterspacing}{80}
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/README b/fonts/utilities/mathinst/README
new file mode 100644
index 0000000000..43d25fea7f
--- /dev/null
+++ b/fonts/utilities/mathinst/README
@@ -0,0 +1,44 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file readme, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If you've ever wanted to typeset proper mathematics using Caslon or
+Garamond or Baskerville or whatever types, MathInst may be of use to
+you. It allows you to create proper math fonts for use by TeX and
+LaTeX. You need to tell it the family of Roman types you want to use
+and the raw math fonts---MathTime, Euler, Lucida New Math, or
+Mathematica---you can supply, and this script does the rest. All of
+MathInst's fonts are properly scaled for compatibility with the Roman
+fonts.
+
+If you supply the name of a typewriter and sans serif font as well,
+MathInst will not only create fonts that respond to the NFSS commands
+\mathsf and \mathtt, it will also scale these fonts properly to match
+the Roman math fonts.
+
+If you supply the name of a calligraphic, fraktur, blackboard bold,
+and Greek bold font, MathInst will create matching fonts and commands
+for their use. In particular, if a Greek bold is present, MathInst
+will create bold math fonts.
+
+MathInst also creates two style files---one for use by NFSS (LaTeX)
+and one for plain TeX. There are also two matching test files, so you
+can not only test the fonts, but see how to access these fonts in a
+TeX document.
+
+At the end, MathInst places all your new fonts in their proper places,
+whether you use a traditional or a TDS TeX system.
+
+For many additional details, please read the (LaTeX) file
+`mathinst.tex' which accompanies this material, all of which can be
+found in the fonts/utilities/mathinst area of CTAN. Please forward
+comments and bug reports to me (Alan Hoenig) at
+ajhjj@cunyvm.cuny.edu.
+
+---Alan Hoenig
+ January 1998
+
diff --git a/fonts/utilities/mathinst/accsoff.mtx b/fonts/utilities/mathinst/accsoff.mtx
new file mode 100644
index 0000000000..220ae168a2
--- /dev/null
+++ b/fonts/utilities/mathinst/accsoff.mtx
@@ -0,0 +1,62 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file accsoff.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is file `accsoff.mtx', after work done by Aloysius G. Helminck.
+
+\relax
+
+This file unsets accents, operators, and the uppercase Greeks.
+
+\metrics
+
+\unsetglyph{equal}
+\unsetglyph{equal1}
+\unsetglyph{plus}
+\unsetglyph{semicolon}
+\unsetglyph{grave}
+\unsetglyph{acute}
+\unsetglyph{caron}
+\unsetglyph{breve}
+\unsetglyph{macron}
+\unsetglyph{circumflex}
+\unsetglyph{dotaccent}
+\unsetglyph{tilde}
+\unsetglyph{dieresis}
+\unsetglyph{overbar}
+\unsetglyph{tie}
+\unsetglyph{openbullet1}
+\unsetglyph{parenleft}
+\unsetglyph{parenright}
+
+\unsetglyph{Gamma}
+\unsetglyph{Delta}
+\unsetglyph{Theta}
+\unsetglyph{Lambda}
+\unsetglyph{Xi}
+\unsetglyph{Pi}
+\unsetglyph{Sigma}
+\unsetglyph{Upsilon}
+\unsetglyph{Phi}
+\unsetglyph{Psi}
+\unsetglyph{Omega}
+
+\unsetglyph{Gamma1}
+\unsetglyph{Delta1}
+\unsetglyph{Theta1}
+\unsetglyph{Lambda1}
+\unsetglyph{Xi1}
+\unsetglyph{Pi1}
+\unsetglyph{Sigma1}
+\unsetglyph{Upsilon1}
+\unsetglyph{Phi1}
+\unsetglyph{Psi1}
+\unsetglyph{Omega1}
+
+%% \unsetglyph{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/alphoff.mtx b/fonts/utilities/mathinst/alphoff.mtx
new file mode 100644
index 0000000000..572f4395f1
--- /dev/null
+++ b/fonts/utilities/mathinst/alphoff.mtx
@@ -0,0 +1,77 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file alphoff.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is file `alphoff.mtx', based on work by Aloysius G. Helminck.
+
+\relax
+
+This file unsets alphabets (U/c and l/c) and some parameters.
+
+\metrics
+
+\unsetint{xheight}
+\unsetint{ascender}
+\unsetint{descender}
+\unsetint{capheight}
+\unsetint{italicslant}
+
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/cm.par b/fonts/utilities/mathinst/cm.par
new file mode 100644
index 0000000000..7e765a4e1b
--- /dev/null
+++ b/fonts/utilities/mathinst/cm.par
@@ -0,0 +1,75 @@
+#############################################################
+##
+## This is the file cm.par, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## A MathInst bitmap parameter file.
+
+## Some places...
+
+## traditional...
+$texroot_ = "/usr/lib/tex";
+$psfonts_ = "/psfonts";
+$afm_ = $psfonts_ . "/afm";
+$vf_ = $texroot_ . "/fonts/vf";
+$tfm_ = $texroot_ . "/fonts/tfm";
+$inputs_ = $texroot_ . "/inputs";
+
+## TDS implementations...
+##$texmf_ = "/resource/mathinst/micur/lu"; # or wherever
+$installer_ = "vfinst"; # or psnfss; what has installed the fonts?
+
+## Everyone...
+$map_ = "$texroot_/ps";
+
+$encoding_ = "OT1"; # only OT1, ot1 are valid entries here
+
+## Some things...
+
+$ssize_ = 7;
+$sssize_ = 5;
+
+$tt_ = "cmtt10";
+$sansserif_ = "lssr7t";
+$cal_ = "pociii0"; # poetica chancery
+$fraktur_ = "eufm10"; # fraktur font for math
+$bbold_ = "pmp6"; # b'board bold (Adobe Math Pi font 6)
+
+# Greek bold may not be appropriate for bitmap fonts...
+
+## For TDS...
+
+$ttsupplier = "public"; $tttypeface = "cm"; # For TDS: tt
+$sssupplier = "adobe"; $sstypeface = "lusans"; #sans serif
+$casupplier = "adobe"; $catypeface = "poetica";#chancery
+$frsupplier = "ams"; $frtypeface = "euler"; #fraktur
+$bbsupplier = "adobe"; $bbtypeface = "pmp6"; #b'board bold
+$gbsupplier = "ams"; $gbtypeface = "euler";
+
+## Scale factors. Normally, MathInst calculates the scale factors
+## for itself, under the assumption that the roman ($fontfam_) types
+## should be at their natural size so that all other fonts are scaled to
+## fit. Form most fonts, `scaling to fit' means making sure that the
+## x-heights match. For the calligrpahic fonts, the capheights shall match.
+## However, in case any of the following scale factors (SF) are defined,
+## then MathInst will use the user defined value. In case the SF's are
+## defined and set to zero, then the font is used at the natural size.
+
+## $mathSF_ = # for Math fonts
+## $ttSF_ = # for typewriter font
+## $saSF_ = 00; # for sans serif fonts
+$caSF_ = 1330; # for calligraphic font
+## $frSF_ = # for fraktur font
+## $bbSF_ = # for blackboard bold
+## $gbSF_ # for uppercase Greek bold letters
+
+## SYSTEM PARAMETERS
+
+$sep = "/"; # Path separator for Unix
+#$sep = "\\"; # Path separator for DOS
+
+$mv = "mv"; # Unix move command
+#$mv = "move"; # DOS move command
diff --git a/fonts/utilities/mathinst/dotlessj.mtx b/fonts/utilities/mathinst/dotlessj.mtx
new file mode 100644
index 0000000000..08345bc2d2
--- /dev/null
+++ b/fonts/utilities/mathinst/dotlessj.mtx
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file dotlessj.mtx, part of the MathInst package
+%% (version 1.0, August 25, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This fontinst file sets a dotless j glyph for a TeX
+math italic font. The following code is due to Thierry Bouche,
+a paper of whose on virtual math fonts can be found at
+ftp://fourier.ujf-grenoble.fr/pub/contrib-tex/gut/mathfonts-pk.ps.gz
+
+\metrics
+
+\resetglyph{dotlessj}
+\glyphspecial{ps: gsave gsave}
+ \push
+ \moveup{\neg{\depth{j}}}
+ \movert{\neg{\width{j}}}
+ \glyphspecial{ps: currentpoint /JDepth exch def /JLeft exch def}
+ \moveup{\add{\depth{j}}{\height{dotlessi}}}
+ %\movert{\mul{\width{j}}{2}}
+ \movert{\scale{\width{j}}{2500}}
+ \glyphspecial{ps: currentpoint /IHeight exch def /JRight exch def grestore}
+ \glyphspecial{ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto
+ 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0
+ rlineto 0 JDepth neg IHeight add neg rlineto closepath clip}
+ \pop
+ \glyph{j}{1000}
+ \glyphspecial{ps: grestore}
+ \resetdepth{\depth{j}}
+ \resetwidth{\width{j}}
+ \resetitalic{\italic{j}}
+ \resetheight{\height{dotlessi}}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/eu.par b/fonts/utilities/mathinst/eu.par
new file mode 100644
index 0000000000..856ff316fb
--- /dev/null
+++ b/fonts/utilities/mathinst/eu.par
@@ -0,0 +1,85 @@
+#############################################################
+##
+## This is the file eu.par, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## A MathInst Euler parameter file.
+
+## Some places...
+
+## traditional...
+$texroot_ = "/usr/lib/tex";
+$psfonts_ = "/psfonts";
+$afm_ = $psfonts_ . "/afm";
+$vf_ = $texroot_ . "/fonts/vf";
+$tfm_ = $texroot_ . "/fonts/tfm";
+$inputs_ = "$texroot_/inputs";
+$map_ = "$texroot_/ps";
+
+## TDS implementations...
+$texmf_ = "e:/texmf"; # or wherever
+$installer_ = "vfinst"; # or psnfss; what has installed the fonts?
+
+$encoding_ = "OT1"; # only OT1, ot1 are valid entries here
+
+## Some things...
+
+## These values for script and scriptscript sizes make
+## tiny math a bit more readable for scalable fonts.
+## (scriptsize and scriptscriptsize)
+
+$ssize_ = 7.3;# for scalable fonts (for CMR, change to 7.0)
+$sssize_ = 5.5;# for scalable fonts (for CMR, change to 5.0)
+
+$tt_ = "cmtt10";
+$sansserif_ = "hlsr7t";
+$cal_ = "eusm10"; # Euler symbols
+$fraktur_ = "eufm10"; # fraktur font for math
+$bbold_ = "pmp6"; # b'board bold (Adobe Math Pi font 6)
+## (see also Adobe Math Pi font 6)
+
+## For TDS...
+
+$masup_ = "ams"; $matyp_ = "euler"; # math fonts
+$ttsup_ = "public"; $tttyp_ = "cm"; # tt
+$sssup_ = "bh"; $sstyp_ = "lucsans"; # sans serif
+$casup_ = "ams"; $catyp_ = "euler"; # Euler symbol
+$frsup_ = "ams"; $frtyp_ = "euler"; # fraktur
+$bbsup_ = "adobe"; $bbtyp_ = "pmp6"; # blackboard bold
+$gbsup_ = "monotype"; $gbtyp_ = "greekbf";# Greek Bold
+
+## Scale factors. Normally, MathInst calculates the scale factors
+## for itself, under the assumption that the roman ($fontfam_) types
+## should be at their natural size so that all other fonts are scaled to
+## fit. Form most fonts, `scaling to fit' means making sure that the
+## x-heights match. For the calligrpahic fonts, the capheights shall match.
+## However, in case any of the following scale factors (SF) are defined,
+## then MathInst will use the user defined value. In case the SF's are
+## defined and set to zero, then the font is used at the natural size.
+
+## $mathSF_ = # for math fonts
+## $ttSF_ = # for typewriter font
+## $saSF_ = 00; # for sans serif fonts
+$caSF_ = 1000; # for calligraphic font
+## $frSF_ = # for fraktur font
+$bbSF_ = 1000; # for blackboard bold
+## $gbSF_ # for uppercase Greek bold letters
+
+## SYSTEM PARAMETERS
+
+## Uncomment one group as appropriate...
+
+## For UNIX and Unix-like systems...
+
+$sep = "/"; # Path separator for Unix
+$mv = "mv"; # Unix move command
+$cp="cp"; # Unix copy command
+
+## For DOS, WIN-NT, and so on...
+
+#$sep = "\\"; # Path separator for DOS
+#$mv = "call domove"; # DOS move command
+#$cp="copy"; # DOS copy command
diff --git a/fonts/utilities/mathinst/eu_ihax.mtx b/fonts/utilities/mathinst/eu_ihax.mtx
new file mode 100644
index 0000000000..cf67b0ce23
--- /dev/null
+++ b/fonts/utilities/mathinst/eu_ihax.mtx
@@ -0,0 +1,136 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file eu_ihax.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+%% \shiftglyph{C}{-50}{0}{-25}
+%% \shiftglyph{E}{0}{50}{0}
+%% \shiftglyph{F}{0}{50}{-100}
+%% \shiftglyph{H}{0}{25}{-25}
+%% \shiftglyph{I}{0}{0}{-25}
+%% \shiftglyph{K}{0}{0}{-25}
+%% \shiftglyph{J}{0}{0}{-25}
+%% \shiftglyph{N}{0}{0}{-25}
+%% \shiftglyph{P}{0}{0}{-100}
+%% \shiftglyph{T}{0}{50}{-75}
+%% \shiftglyph{U}{-50}{50}{-25}
+%% \shiftglyph{V}{-50}{50}{-50}
+%% \shiftglyph{W}{-50}{50}{-50}
+%% \shiftglyph{X}{0}{50}{-25}
+%% \shiftglyph{Y}{-50}{50}{-50}
+%% \shiftglyph{b}{0}{-25}{0}
+%% \shiftglyph{d}{0}{25}{0}
+%% \shiftglyph{f}{190}{0}{25}
+%% \shiftglyph{g}{0}{-50}{0}
+%% \shiftglyph{j}{150}{25}{0}
+%% \shiftglyph{l}{0}{50}{0}
+%% \shiftglyph{o}{0}{-50}{0}
+%% \shiftglyph{p}{75}{-25}{0}
+%% \shiftglyph{t}{-25}{50}{0}
+%% \shiftglyph{Upsilon}{0}{0}{-50}
+%% \shiftglyph{Upsilon}{0}{0}{-100}
+%% \shiftglyph{weierstrass}{-100}{-200}{-150}
+%%
+
+\unfakable{rho1}
+
+\ifisglyph{omega1}\then
+ \setglyph{pi1}
+ \glyph{omega1}{1000}
+ \endsetglyph
+\fi
+
+\ifisglyph{epsilon}\then
+ \setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+ \endsetglyph
+\fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\div{\width{tie}}{2}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+\ifisglyph{vector}\then
+ \resetglyph{vector}
+ \moveup{1}
+ \glyph{vector}{1000}
+ \moveup{-1}
+ \endresetglyph
+\fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/eu_iskew.mtx b/fonts/utilities/mathinst/eu_iskew.mtx
new file mode 100644
index 0000000000..e5c0904c5a
--- /dev/null
+++ b/fonts/utilities/mathinst/eu_iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file eu_iskew.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+%% \skewkern{A}{75}
+%% \skewkern{B}{100}
+%% \skewkern{C}{100}
+%% \skewkern{D}{50}
+%% \skewkern{E}{75}
+%% \skewkern{F}{75}
+%% \skewkern{G}{100}
+%% \skewkern{H}{50}
+%% \skewkern{I}{100}
+%% \skewkern{J}{200}
+%% \skewkern{K}{75}
+%% \skewkern{M}{100}
+%% \skewkern{N}{25}
+%% \skewkern{O}{100}
+%% \skewkern{P}{100}
+%% \skewkern{Q}{100}
+%% \skewkern{R}{100}
+%% \skewkern{S}{100}
+%% \skewkern{T}{50}
+%% \skewkern{U}{50}
+%% \skewkern{X}{50}
+%% \skewkern{Z}{50}
+%% \skewkern{a}{75}
+%% \skewkern{c}{75}
+%% \skewkern{d}{200}
+%% \skewkern{e}{75}
+\skewkern{f}{100}
+%% \skewkern{g}{75}
+%% \skewkern{i}{75}
+%% \skewkern{j}{150}
+%% \skewkern{l}{100}
+%% \skewkern{m}{50}
+%% \skewkern{n}{50}
+%% \skewkern{o}{75}
+%% \skewkern{p}{100}
+%% \skewkern{q}{75}
+%% \skewkern{r}{50}
+%% \skewkern{s}{100}
+%% \skewkern{t}{50}
+%% \skewkern{u}{75}
+%% \skewkern{v}{75}
+%% \skewkern{w}{75}
+%% \skewkern{x}{75}
+%% \skewkern{y}{75}
+%% \skewkern{z}{50}
+%% \skewkern{dotlessi}{50}
+%% \skewkern{dotlessj}{50}
+%% \skewkern{upsilon}{25}
+%% \skewkern{iota}{-50}
+%% \skewkern{lambda}{-75}
+%% \skewkern{weierstrass}{175}
+%% \skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/euex.etx b/fonts/utilities/mathinst/euex.etx
new file mode 100644
index 0000000000..0273c3aadc
--- /dev/null
+++ b/fonts/utilities/mathinst/euex.etx
@@ -0,0 +1,89 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file euex.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst encoding file for the Euler euex10 font.
+
+\encoding
+
+\nextslot{8}
+\setslot{braceleftbig}\endsetslot
+\setslot{bracerightbig}\endsetslot
+\setslot{braceleftBig}\endsetslot
+\setslot{bracerightBig}\endsetslot
+\setslot{braceleftbigg}\endsetslot
+\setslot{bracerightbigg}\endsetslot
+\setslot{braceleftBigg}\endsetslot
+\setslot{bracerightBigg}\endsetslot
+
+\nextslot{24}
+\setslot{arrowlefttophalf}\endsetslot
+\setslot{arrowleftbothalf}\endsetslot
+\setslot{arrowrighttophalf}\endsetslot
+\setslot{arrowrightbothalf}\endsetslot
+
+\nextslot{32}
+\setslot{arrowleft}\endsetslot
+\setslot{arrowright}\endsetslot
+\setslot{arrowup}\endsetslot
+\setslot{arrowdown}\endsetslot
+\setslot{arrowboth}\endsetslot
+\setslot{arrownortheast}\endsetslot
+\setslot{arrowsoutheast}\endsetslot
+
+\nextslot{40}
+\setslot{arrowdblleft}\endsetslot
+\setslot{arrowdblright}\endsetslot
+\setslot{arrowdblup}\endsetslot
+\setslot{arrowdbldown}\endsetslot
+\setslot{arrowdblboth}\endsetslot
+\setslot{arrownorthwest}\endsetslot
+\setslot{arrowsouthwest}\endsetslot
+
+\nextslot{49}
+\setslot{infinity}\endsetslot
+
+\nextslot{56}
+\setslot{bracelefttp}\endsetslot
+\setslot{bracerighttp}\endsetslot
+\setslot{braceleftbt}\endsetslot
+\setslot{bracerightbt}\endsetslot
+\setslot{braceleftmid}\endsetslot
+\setslot{bracerightmid}\endsetslot
+\setslot{braceex}\endsetslot
+
+\nextslot{72}
+\setslot{contintegraltext}\endsetslot
+\setslot{contintegraldisplay}\endsetslot
+
+\nextslot{80}
+\setslot{summationtext}\endsetslot
+\setslot{producttext}\endsetslot
+\setslot{integraltext}\endsetslot
+
+\nextslot{88}
+\setslot{summationdisplay}\endsetslot
+\setslot{productdisplay}\endsetslot
+\setslot{integraldisplay}\endsetslot
+
+\nextslot{96}
+\setslot{coproducttext}\endsetslot
+\setslot{coproductdisplay}\endsetslot
+
+\nextslot{108}
+\setslot{arrowbothv}\endsetslot
+\setslot{arrowdblbothv}\endsetslot
+
+\nextslot{122}
+\setslot{bracehtipdownleft}\endsetslot
+\setslot{bracehtipdownright}\endsetslot
+\setslot{bracehtipupleft}\endsetslot
+\setslot{bracehtipupright}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/mathinst/euexs.mtx b/fonts/utilities/mathinst/euexs.mtx
new file mode 100644
index 0000000000..458ba45e0d
--- /dev/null
+++ b/fonts/utilities/mathinst/euexs.mtx
@@ -0,0 +1,33 @@
+\relax
+
+This file renames some symbol
+glyphs in accordance with the OMX encoding.
+
+\metrics
+
+\setcommand\rename#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+\fi}
+
+\rename{angbracketleftbig}{angleleftbig}%$ 10
+\rename{angbracketrightbig}{anglerightbig}
+\rename{vextendsingle}{barex}
+\rename{vextenddouble}{bardblex}
+
+\rename{angbracketleftbigg}{angleleftbigg}%$ 28
+\rename{angbracketrightbigg}{anglerightbigg}
+
+\rename{angbracketleftBigg}{angleleftBigg}%$ 42
+\rename{angbracketrightBigg}{anglerightBigg}
+
+\rename{angbracketleftBig}{angleleftBig}%$ 68
+\rename{angbracketrightBig}{anglerightBig}
+
+\rename{hatwidest}{hatwiderr}%$ 100
+\rename{tildewidest}{tildewiderr}%$ 103
+
+\rename{arrowvertexdbl}{arrowdblvertex}%$ 119
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/eufm.etx b/fonts/utilities/mathinst/eufm.etx
new file mode 100644
index 0000000000..e4217e302c
--- /dev/null
+++ b/fonts/utilities/mathinst/eufm.etx
@@ -0,0 +1,128 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file eufm.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst encoding file for Euler fraktur fonts.
+
+\encoding
+
+\setslot{dnos}\endsetslot
+\setslot{dalt}\endsetslot
+\setslot{fnos}\endsetslot
+\setslot{falt}\endsetslot
+\setslot{galt}\endsetslot
+\setslot{kalt}\endsetslot
+\setslot{talt}\endsetslot
+\setslot{ualt}\endsetslot
+
+\nextslot{18}
+\setslot{quoteleft}\endsetslot
+\setslot{quoteright}\endsetslot
+
+\nextslot{33}
+\setslot{exclam}\endsetslot
+
+\nextslot{38}
+\setslot{ampersand}\endsetslot
+\setslot{quotesingle}\endsetslot
+\setslot{parenleft}\endsetslot
+\setslot{parenright}\endsetslot
+\setslot{asterisk}\endsetslot
+\setslot{plus}\endsetslot
+\setslot{comma}\endsetslot
+\setslot{minus}\endsetslot
+\setslot{period}\endsetslot
+\setslot{slash}\endsetslot
+\setslot{zero}\endsetslot
+\setslot{one}\endsetslot
+\setslot{two}\endsetslot
+\setslot{three}\endsetslot
+\setslot{four}\endsetslot
+\setslot{five}\endsetslot
+\setslot{six}\endsetslot
+\setslot{seven}\endsetslot
+\setslot{eight}\endsetslot
+\setslot{nine}\endsetslot
+\setslot{colon}\endsetslot
+\setslot{semicolon}\endsetslot
+
+\nextslot{61}
+\setslot{equal}\endsetslot
+
+\nextslot{63}
+\setslot{question}\endsetslot
+
+\nextslot{65}
+\setslot{A}\endsetslot
+\setslot{B}\endsetslot
+\setslot{C}\endsetslot
+\setslot{D}\endsetslot
+\setslot{E}\endsetslot
+\setslot{F}\endsetslot
+\setslot{G}\endsetslot
+\setslot{H}\endsetslot
+\setslot{I}\endsetslot
+\setslot{J}\endsetslot
+\setslot{K}\endsetslot
+\setslot{L}\endsetslot
+\setslot{M}\endsetslot
+\setslot{N}\endsetslot
+\setslot{O}\endsetslot
+\setslot{P}\endsetslot
+\setslot{Q}\endsetslot
+\setslot{R}\endsetslot
+\setslot{S}\endsetslot
+\setslot{T}\endsetslot
+\setslot{U}\endsetslot
+\setslot{V}\endsetslot
+\setslot{W}\endsetslot
+\setslot{X}\endsetslot
+\setslot{Y}\endsetslot
+\setslot{Z}\endsetslot
+\setslot{bracketleft}\endsetslot
+
+\nextslot{93}
+\setslot{bracketright}\endsetslot
+\setslot{asciicircum}\endsetslot
+
+\nextslot{97}
+\setslot{a}\endsetslot
+\setslot{b}\endsetslot
+\setslot{c}\endsetslot
+\setslot{d}\endsetslot
+\setslot{e}\endsetslot
+\setslot{f}\endsetslot
+\setslot{g}\endsetslot
+\setslot{h}\endsetslot
+\setslot{i}\endsetslot
+\setslot{j}\endsetslot
+\setslot{k}\endsetslot
+\setslot{l}\endsetslot
+\setslot{m}\endsetslot
+\setslot{n}\endsetslot
+\setslot{o}\endsetslot
+\setslot{p}\endsetslot
+\setslot{q}\endsetslot
+\setslot{r}\endsetslot
+\setslot{s}\endsetslot
+\setslot{t}\endsetslot
+\setslot{u}\endsetslot
+\setslot{v}\endsetslot
+\setslot{w}\endsetslot
+\setslot{x}\endsetslot
+\setslot{y}\endsetslot
+\setslot{z}\endsetslot
+
+\nextslot{125}
+\setslot{quotedbl}\endsetslot
+
+\nextslot{127}
+\setslot{onealt}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/mathinst/eurm.etx b/fonts/utilities/mathinst/eurm.etx
new file mode 100644
index 0000000000..e18cb726a4
--- /dev/null
+++ b/fonts/utilities/mathinst/eurm.etx
@@ -0,0 +1,162 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file eurm.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst encoding file for the Euler Roman types.
+
+\encoding
+
+\needsfontinstversion{1.5}
+
+\setstr{codingscheme}{TEX MATH ITALIC SUBSET}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\comment{\section{Default font dimensions}}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{0} % interword space
+\setint{fontdimen(3)}{0} % interword stretch
+\setint{fontdimen(4)}{0} % interword shrink
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\setint{fontdimen(7)}{0} % extra space after .
+
+\comment{\section{The encoding}
+ There are 128 glyphs in this encoding.}
+
+\setslot{Gamma}\endsetslot
+\setslot{Delta}\endsetslot
+\setslot{Theta}\endsetslot
+\setslot{Lambda}\endsetslot
+\setslot{Xi}\endsetslot
+\setslot{Pi}\endsetslot
+\setslot{Sigma}\endsetslot
+\setslot{Upsilon}\endsetslot
+\setslot{Phi}\endsetslot
+\setslot{Psi}\endsetslot
+\setslot{Omega}\endsetslot
+\setslot{alpha}\endsetslot
+\setslot{beta}\endsetslot
+\setslot{gamma}\endsetslot
+\setslot{delta}\endsetslot
+\setslot{epsilon1}\endsetslot
+\setslot{zeta}\endsetslot
+\setslot{eta}\endsetslot
+\setslot{theta}\endsetslot
+\setslot{iota}\endsetslot
+\setslot{kappa}\endsetslot
+\setslot{lambda}\endsetslot
+\setslot{mu}\endsetslot
+\setslot{nu}\endsetslot
+\setslot{xi}\endsetslot
+\setslot{pi}\endsetslot
+\setslot{rho}\endsetslot
+\setslot{sigma}\endsetslot
+\setslot{tau}\endsetslot
+\setslot{upsilon}\endsetslot
+\setslot{phi}\endsetslot
+\setslot{chi}\endsetslot
+\setslot{psi}\endsetslot
+\setslot{omega}\endsetslot
+\setslot{epsilon}\endsetslot
+\setslot{theta1}\endsetslot
+\setslot{pi1}\endsetslot
+
+\nextslot{39}
+\setslot{phi1}\endsetslot
+
+\nextslot{48}
+\setslot{zero}\endsetslot
+\setslot{one}\endsetslot
+\setslot{two}\endsetslot
+\setslot{three}\endsetslot
+\setslot{four}\endsetslot
+\setslot{five}\endsetslot
+\setslot{six}\endsetslot
+\setslot{seven}\endsetslot
+\setslot{eight}\endsetslot
+\setslot{nine}\endsetslot
+\setslot{period}\endsetslot
+\setslot{comma}\endsetslot
+\setslot{less}\endsetslot
+\setslot{slash}\endsetslot
+\setslot{greater}\endsetslot
+
+\nextslot{64}
+\setslot{partialdiff}\endsetslot
+\setslot{A}\endsetslot
+\setslot{B}\endsetslot
+\setslot{C}\endsetslot
+\setslot{D}\endsetslot
+\setslot{E}\endsetslot
+\setslot{F}\endsetslot
+\setslot{G}\endsetslot
+\setslot{H}\endsetslot
+\setslot{I}\endsetslot
+\setslot{J}\endsetslot
+\setslot{K}\endsetslot
+\setslot{L}\endsetslot
+\setslot{M}\endsetslot
+\setslot{N}\endsetslot
+\setslot{O}\endsetslot
+\setslot{P}\endsetslot
+\setslot{Q}\endsetslot
+\setslot{R}\endsetslot
+\setslot{S}\endsetslot
+\setslot{T}\endsetslot
+\setslot{U}\endsetslot
+\setslot{V}\endsetslot
+\setslot{W}\endsetslot
+\setslot{X}\endsetslot
+\setslot{Y}\endsetslot
+\setslot{Z}\endsetslot
+
+\nextslot{96}
+\setslot{lscript}\endsetslot
+\setslot{a}\endsetslot
+\setslot{b}\endsetslot
+\setslot{c}\endsetslot
+\setslot{d}\endsetslot
+\setslot{e}\endsetslot
+\setslot{f}\endsetslot
+\setslot{g}\endsetslot
+\setslot{h}\endsetslot
+\setslot{i}\endsetslot
+\setslot{j}\endsetslot
+\setslot{k}\endsetslot
+\setslot{l}\endsetslot
+\setslot{m}\endsetslot
+\setslot{n}\endsetslot
+\setslot{o}\endsetslot
+\setslot{p}\endsetslot
+\setslot{q}\endsetslot
+\setslot{r}\endsetslot
+\setslot{s}\endsetslot
+\setslot{t}\endsetslot
+\setslot{u}\endsetslot
+\setslot{v}\endsetslot
+\setslot{w}\endsetslot
+\setslot{x}\endsetslot
+\setslot{y}\endsetslot
+\setslot{z}\endsetslot
+\setslot{dotlessi}\endsetslot
+\setslot{dotlessj}\endsetslot
+\setslot{weierstrass}\endsetslot
+
+\nextslot{127}
+\setslot{ghost}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/mathinst/eusm.etx b/fonts/utilities/mathinst/eusm.etx
new file mode 100644
index 0000000000..a36145de52
--- /dev/null
+++ b/fonts/utilities/mathinst/eusm.etx
@@ -0,0 +1,76 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file eusm.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst encoding file for the Euler symbol fonts.
+
+\encoding
+
+\setslot{minus}\endsetslot
+
+\nextslot{24}
+\setslot{similar}\endsetslot
+
+\nextslot{48}
+\setslot{ghost}\endsetslot
+
+\nextslot{58}
+\setslot{logicalnot}\endsetslot
+
+\nextslot{60}
+\setslot{Rfractur}\endsetslot
+\setslot{Ifractur}\endsetslot
+
+\nextslot{64}
+\setslot{aleph}\endsetslot
+\setslot{A}\endsetslot
+\setslot{B}\endsetslot
+\setslot{C}\endsetslot
+\setslot{D}\endsetslot
+\setslot{E}\endsetslot
+\setslot{F}\endsetslot
+\setslot{G}\endsetslot
+\setslot{H}\endsetslot
+\setslot{I}\endsetslot
+\setslot{J}\endsetslot
+\setslot{K}\endsetslot
+\setslot{L}\endsetslot
+\setslot{M}\endsetslot
+\setslot{N}\endsetslot
+\setslot{O}\endsetslot
+\setslot{P}\endsetslot
+\setslot{Q}\endsetslot
+\setslot{R}\endsetslot
+\setslot{S}\endsetslot
+\setslot{T}\endsetslot
+\setslot{U}\endsetslot
+\setslot{V}\endsetslot
+\setslot{W}\endsetslot
+\setslot{X}\endsetslot
+\setslot{Y}\endsetslot
+\setslot{Z}\endsetslot
+
+\nextslot{94}
+\setslot{logicaland}\endsetslot
+\setslot{logicalor}\endsetslot
+
+\nextslot{102}
+\setslot{braceleft}\endsetslot
+\setslot{braceright}\endsetslot
+
+\nextslot{106}
+\setslot{bar}\endsetslot
+
+\nextslot{110}
+\setslot{backslash}\endsetslot
+
+\nextslot{120}
+\setslot{section}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/mathinst/eusyms.mtx b/fonts/utilities/mathinst/eusyms.mtx
new file mode 100644
index 0000000000..2593a0ad26
--- /dev/null
+++ b/fonts/utilities/mathinst/eusyms.mtx
@@ -0,0 +1,27 @@
+\relax
+
+This file renames some symbol
+glyphs in accordance with the OMS encoding.
+
+\metrics
+
+\setcommand\rename#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+\fi}
+
+\rename{emptyset}{emptysetstress}
+\rename{Rfractur}{Rfraktur}
+\rename{Ifractur}{Ifraktur}
+
+\rename{precedes}{curlyless}
+\rename{follows}{curlygreater}
+\rename{mapsto}{mapstochar}
+\rename{angbracketleft}{angleleft}
+\rename{angbracketright}{angleright}
+\rename{radical}{radicallow}
+\rename{nabla}{gradient}
+
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/expert.etx b/fonts/utilities/mathinst/expert.etx
new file mode 100644
index 0000000000..d1c99b9f10
--- /dev/null
+++ b/fonts/utilities/mathinst/expert.etx
@@ -0,0 +1,183 @@
+\relax
+
+This is file expert.etx, part of mathinst.
+It specifies the standard Adobe expert encoding in
+fontinst terms.
+
+Author: Alan Hoenig
+Date: August 20, 1998
+
+\encoding
+
+\setcommand\NumberedSetSlot#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\NumberedSetSlot{33}{exclamsmall}
+\NumberedSetSlot{34}{Hungarumlautsmall}
+\NumberedSetSlot{36}{dollaroldstyle}
+\NumberedSetSlot{37}{dollarsuperior}
+\NumberedSetSlot{38}{ampersandsmall}
+\NumberedSetSlot{39}{Acutesmall}
+\NumberedSetSlot{40}{parenleftsuperior}
+\NumberedSetSlot{41}{parenrightsuperior}
+\NumberedSetSlot{42}{twodotenleader}
+\NumberedSetSlot{43}{onedotenleader}
+\NumberedSetSlot{44}{comma}
+\NumberedSetSlot{45}{hyphen}
+\NumberedSetSlot{46}{period}
+\NumberedSetSlot{47}{fraction}
+\NumberedSetSlot{48}{zerooldstyle}
+\NumberedSetSlot{49}{oneoldstyle}
+\NumberedSetSlot{50}{twooldstyle}
+\NumberedSetSlot{51}{threeoldstyle}
+\NumberedSetSlot{52}{fouroldstyle}
+\NumberedSetSlot{53}{fiveoldstyle}
+\NumberedSetSlot{54}{sixoldstyle}
+\NumberedSetSlot{55}{sevenoldstyle}
+\NumberedSetSlot{56}{eightoldstyle}
+\NumberedSetSlot{57}{nineoldstyle}
+\NumberedSetSlot{58}{colon}
+\NumberedSetSlot{59}{semicolon}
+\NumberedSetSlot{60}{commasuperior}
+\NumberedSetSlot{61}{threequartersemdash}
+\NumberedSetSlot{62}{periodsuperior}
+\NumberedSetSlot{63}{questionsmall}
+\NumberedSetSlot{65}{asuperior}
+\NumberedSetSlot{66}{bsuperior}
+\NumberedSetSlot{67}{centsuperior}
+\NumberedSetSlot{68}{dsuperior}
+\NumberedSetSlot{69}{esuperior}
+\NumberedSetSlot{73}{isuperior}
+\NumberedSetSlot{76}{lsuperior}
+\NumberedSetSlot{77}{msuperior}
+\NumberedSetSlot{78}{nsuperior}
+\NumberedSetSlot{79}{osuperior}
+\NumberedSetSlot{82}{rsuperior}
+\NumberedSetSlot{83}{ssuperior}
+\NumberedSetSlot{84}{tsuperior}
+\NumberedSetSlot{86}{ff}
+\NumberedSetSlot{87}{fi}
+\NumberedSetSlot{88}{fl}
+\NumberedSetSlot{89}{ffi}
+\NumberedSetSlot{90}{ffl}
+\NumberedSetSlot{91}{parenleftinferior}
+\NumberedSetSlot{93}{parenrightinferior}
+\NumberedSetSlot{94}{Circumflexsmall}
+\NumberedSetSlot{95}{hyphensuperior}
+\NumberedSetSlot{96}{Gravesmall}
+\NumberedSetSlot{97}{Asmall}
+\NumberedSetSlot{98}{Bsmall}
+\NumberedSetSlot{99}{Csmall}
+\NumberedSetSlot{100}{Dsmall}
+\NumberedSetSlot{101}{Esmall}
+\NumberedSetSlot{102}{Fsmall}
+\NumberedSetSlot{103}{Gsmall}
+\NumberedSetSlot{104}{Hsmall}
+\NumberedSetSlot{105}{Ismall}
+\NumberedSetSlot{106}{Jsmall}
+\NumberedSetSlot{107}{Ksmall}
+\NumberedSetSlot{108}{Lsmall}
+\NumberedSetSlot{109}{Msmall}
+\NumberedSetSlot{110}{Nsmall}
+\NumberedSetSlot{111}{Osmall}
+\NumberedSetSlot{112}{Psmall}
+\NumberedSetSlot{113}{Qsmall}
+\NumberedSetSlot{114}{Rsmall}
+\NumberedSetSlot{115}{Ssmall}
+\NumberedSetSlot{116}{Tsmall}
+\NumberedSetSlot{117}{Usmall}
+\NumberedSetSlot{118}{Vsmall}
+\NumberedSetSlot{119}{Wsmall}
+\NumberedSetSlot{120}{Xsmall}
+\NumberedSetSlot{121}{Ysmall}
+\NumberedSetSlot{122}{Zsmall}
+\NumberedSetSlot{123}{colonmonetary}
+\NumberedSetSlot{124}{onefitted}
+\NumberedSetSlot{125}{rupiah}
+\NumberedSetSlot{126}{Tildesmall}
+\NumberedSetSlot{161}{exclamdownsmall}
+\NumberedSetSlot{162}{centoldstyle}
+\NumberedSetSlot{163}{Lslashsmall}
+\NumberedSetSlot{166}{Scaronsmall}
+\NumberedSetSlot{167}{Zcaronsmall}
+\NumberedSetSlot{168}{Dieresissmall}
+\NumberedSetSlot{169}{Brevesmall}
+\NumberedSetSlot{170}{Caronsmall}
+\NumberedSetSlot{172}{Dotaccentsmall}
+\NumberedSetSlot{175}{Macronsmall}
+\NumberedSetSlot{178}{figuredash}
+\NumberedSetSlot{179}{hypheninferior}
+\NumberedSetSlot{182}{Ogoneksmall}
+\NumberedSetSlot{183}{Ringsmall}
+\NumberedSetSlot{184}{Cedillasmall}
+\NumberedSetSlot{188}{onequarter}
+\NumberedSetSlot{189}{onehalf}
+\NumberedSetSlot{190}{threequarters}
+\NumberedSetSlot{191}{questiondownsmall}
+\NumberedSetSlot{192}{oneeighth}
+\NumberedSetSlot{193}{threeeighths}
+\NumberedSetSlot{194}{fiveeighths}
+\NumberedSetSlot{195}{seveneighths}
+\NumberedSetSlot{196}{onethird}
+\NumberedSetSlot{197}{twothirds}
+\NumberedSetSlot{200}{zerosuperior}
+\NumberedSetSlot{201}{onesuperior}
+\NumberedSetSlot{202}{twosuperior}
+\NumberedSetSlot{203}{threesuperior}
+\NumberedSetSlot{204}{foursuperior}
+\NumberedSetSlot{205}{fivesuperior}
+\NumberedSetSlot{206}{sixsuperior}
+\NumberedSetSlot{207}{sevensuperior}
+\NumberedSetSlot{208}{eightsuperior}
+\NumberedSetSlot{209}{ninesuperior}
+\NumberedSetSlot{210}{zeroinferior}
+\NumberedSetSlot{211}{oneinferior}
+\NumberedSetSlot{212}{twoinferior}
+\NumberedSetSlot{213}{threeinferior}
+\NumberedSetSlot{214}{fourinferior}
+\NumberedSetSlot{215}{fiveinferior}
+\NumberedSetSlot{216}{sixinferior}
+\NumberedSetSlot{217}{seveninferior}
+\NumberedSetSlot{218}{eightinferior}
+\NumberedSetSlot{219}{nineinferior}
+\NumberedSetSlot{220}{centinferior}
+\NumberedSetSlot{221}{dollarinferior}
+\NumberedSetSlot{222}{periodinferior}
+\NumberedSetSlot{223}{commainferior}
+\NumberedSetSlot{224}{Agravesmall}
+\NumberedSetSlot{225}{Aacutesmall}
+\NumberedSetSlot{226}{Acircumflexsmall}
+\NumberedSetSlot{227}{Atildesmall}
+\NumberedSetSlot{228}{Adieresissmall}
+\NumberedSetSlot{229}{Aringsmall}
+\NumberedSetSlot{230}{AEsmall}
+\NumberedSetSlot{231}{Ccedillasmall}
+\NumberedSetSlot{232}{Egravesmall}
+\NumberedSetSlot{233}{Eacutesmall}
+\NumberedSetSlot{234}{Ecircumflexsmall}
+\NumberedSetSlot{235}{Edieresissmall}
+\NumberedSetSlot{236}{Igravesmall}
+\NumberedSetSlot{237}{Iacutesmall}
+\NumberedSetSlot{238}{Icircumflexsmall}
+\NumberedSetSlot{239}{Idieresissmall}
+\NumberedSetSlot{240}{Ethsmall}
+\NumberedSetSlot{241}{Ntildesmall}
+\NumberedSetSlot{242}{Ogravesmall}
+\NumberedSetSlot{243}{Oacutesmall}
+\NumberedSetSlot{244}{Ocircumflexsmall}
+\NumberedSetSlot{245}{Otildesmall}
+\NumberedSetSlot{246}{Odieresissmall}
+\NumberedSetSlot{247}{OEsmall}
+\NumberedSetSlot{248}{Oslashsmall}
+\NumberedSetSlot{249}{Ugravesmall}
+\NumberedSetSlot{250}{Uacutesmall}
+\NumberedSetSlot{251}{Ucircumflexsmall}
+\NumberedSetSlot{252}{Udieresissmall}
+\NumberedSetSlot{253}{Yacutesmall}
+\NumberedSetSlot{254}{Thornsmall}
+\NumberedSetSlot{255}{Ydieresissmall}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/harpoons.mtx b/fonts/utilities/mathinst/harpoons.mtx
new file mode 100644
index 0000000000..ec51f9449b
--- /dev/null
+++ b/fonts/utilities/mathinst/harpoons.mtx
@@ -0,0 +1,35 @@
+\relax
+
+This file renames harpoon-like glyphs in accordance with the OML encoding.
+
+\metrics
+
+%% example: \rename{arrowlefttophalf}{harpoonleftup}
+\setcommand\rename#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+\fi}
+
+\rename{arrowlefttophalf}{harpoonleftup}
+\rename{arrowleftbothalf}{harpoonleftdown}
+\rename{arrowrighttophalf}{harpoonrightup}
+\rename{arrowrightbothalf}{harpoonrightdown}
+\rename{arrowhookleft}{hookrightchar}
+\rename{arrowhookright}{hookleftchar}
+
+\endmetrics
+
+\setrawglyph{arrowlefttophalf}{cmmi10}{10pt}{40}{1000}{428}{-230}{0}
+\setrawglyph{arrowleftbothalf}{cmmi10}{10pt}{41}{1000}{270}{-72}{0}
+\setrawglyph{arrowrighttophalf}{cmmi10}{10pt}{42}{1000}{428}{-230}{0}
+\setrawglyph{arrowrightbothalf}{cmmi10}{10pt}{43}{1000}{270}{-72}{0}
+\setrawglyph{arrowhookleft}{cmmi10}{10pt}{44}{277}{464}{-230}{0}
+\setrawglyph{arrowhookright}{cmmi10}{10pt}{45}{277}{464}{-230}{0}
+
+\setslot{harpoonleftup}
+\setslot{harpoonleftdown}
+\setslot{harpoonrightup}
+\setslot{harpoonrightdown}
+\setslot{hookrightchar}
+\setslot{hookleftchar}
diff --git a/fonts/utilities/mathinst/lbma.etx b/fonts/utilities/mathinst/lbma.etx
new file mode 100644
index 0000000000..9a2ef51671
--- /dev/null
+++ b/fonts/utilities/mathinst/lbma.etx
@@ -0,0 +1,241 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lbma.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\setcommand\lucidachar#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\lucidachar{0}{circle}
+\lucidachar{1}{circlesolid}
+\lucidachar{2}{square}
+\lucidachar{3}{squaresolid}
+\lucidachar{4}{triangle}
+\lucidachar{5}{trianglesolid}
+\lucidachar{6}{triangleinv}
+\lucidachar{7}{triangleinvsolid}
+\lucidachar{8}{diamond}
+\lucidachar{9}{diamondsolid}
+\lucidachar{10}{diamondmathsolid}
+\lucidachar{11}{upslope}
+\lucidachar{12}{downslope}
+\lucidachar{13}{sqimageornotequal}
+\lucidachar{14}{sqoriginornotequal}
+\lucidachar{15}{unionsqdbl}
+\lucidachar{16}{intersectionsqdbl}
+\lucidachar{17}{domsubtract}
+\lucidachar{18}{rngsubtract}
+\lucidachar{19}{vertellipsis}
+\lucidachar{20}{midhorizellipsis}
+\lucidachar{21}{upslopeellipsis}
+\lucidachar{22}{downslopeellipsis}
+\lucidachar{23}{equalparallel}
+\lucidachar{24}{approxnotequal}
+\lucidachar{25}{pibond}
+\lucidachar{26}{starequal}
+\lucidachar{27}{planckover2pi1}
+\lucidachar{28}{elementmacron}
+\lucidachar{29}{notelement}
+\lucidachar{30}{ownermacron}
+\lucidachar{31}{notowner}
+\lucidachar{32}{notexistential}
+\lucidachar{33}{arrowlongboth}
+\lucidachar{34}{arrowlongbothv}
+\lucidachar{35}{dblarrowheadleft}
+\lucidachar{36}{dblarrowheadup}
+\lucidachar{37}{dblarrowheadright}
+\lucidachar{38}{ampersand}
+\lucidachar{39}{dblarrowheaddown}
+\lucidachar{40}{arrowtailleft}
+\lucidachar{41}{arrowtailright}
+\lucidachar{42}{arrowbarleft}
+\lucidachar{43}{arrowbarup}
+\lucidachar{44}{arrowbarright}
+\lucidachar{45}{arrowext}
+\lucidachar{46}{arrowbardown}
+\lucidachar{47}{arrowtableft}
+\lucidachar{48}{arrowtabright}
+\lucidachar{49}{arrowbothvbase}
+\lucidachar{50}{arrowleftnot}
+\lucidachar{51}{arrowrightnot}
+\lucidachar{52}{arrowbothnot}
+\lucidachar{53}{arrowlongbothnot}
+\lucidachar{54}{headleft}
+\lucidachar{55}{headright}
+\lucidachar{56}{arrowdashleft}
+\lucidachar{57}{arrowdashup}
+\lucidachar{58}{arrowdashright}
+\lucidachar{59}{arrowdashdown}
+\lucidachar{60}{arrowhookleft}
+\lucidachar{61}{arrowdblext}
+\lucidachar{62}{arrowhookright}
+\lucidachar{63}{arrowloopleft}
+\lucidachar{64}{arrowloopright}
+\lucidachar{65}{A}
+\lucidachar{66}{B}
+\lucidachar{67}{C}
+\lucidachar{68}{D}
+\lucidachar{69}{E}
+\lucidachar{70}{F}
+\lucidachar{71}{G}
+\lucidachar{72}{H}
+\lucidachar{73}{I}
+\lucidachar{74}{J}
+\lucidachar{75}{K}
+\lucidachar{76}{L}
+\lucidachar{77}{M}
+\lucidachar{78}{N}
+\lucidachar{79}{O}
+\lucidachar{80}{P}
+\lucidachar{81}{Q}
+\lucidachar{82}{R}
+\lucidachar{83}{S}
+\lucidachar{84}{T}
+\lucidachar{85}{U}
+\lucidachar{86}{V}
+\lucidachar{87}{W}
+\lucidachar{88}{X}
+\lucidachar{89}{Y}
+\lucidachar{90}{Z}
+\lucidachar{91}{brackettopnw}
+\lucidachar{92}{brackettopne}
+\lucidachar{93}{bracketbotsw}
+\lucidachar{94}{bracketbotse}
+\lucidachar{95}{arrowdblvext}
+\lucidachar{96}{arrowdbllongbothv}
+\lucidachar{97}{arrowdbllongboth}
+\lucidachar{98}{arrowdblnw}
+\lucidachar{99}{arrowdblne}
+\lucidachar{100}{arrowdblsw}
+\lucidachar{101}{arrowdblse}
+\lucidachar{102}{arrowdblleftnot}
+\lucidachar{103}{arrowdblbothnot}
+\lucidachar{104}{arrowdblrightnot}
+\lucidachar{105}{arrowdbllongbothnot}
+\lucidachar{106}{arrowtripleleft}
+\lucidachar{107}{k}
+\lucidachar{108}{arrowtripleright}
+\lucidachar{109}{arrowparrrightleft}
+\lucidachar{110}{arrowparrleftright}
+\lucidachar{111}{dblarrowupdown}
+\lucidachar{112}{dblarrowdownup}
+\lucidachar{113}{dblarrowleft}
+\lucidachar{114}{dblarrowup}
+\lucidachar{115}{dblarrowright}
+\lucidachar{116}{dblarrowdown}
+\lucidachar{117}{harpoonupright}
+\lucidachar{118}{harpoonupleft}
+\lucidachar{119}{harpoondownright}
+\lucidachar{120}{harpoondownleft}
+\lucidachar{121}{harpoonleftright}
+\lucidachar{122}{harpoonrightleft}
+\lucidachar{123}{arrowupleft}
+\lucidachar{124}{arrowvext}
+\lucidachar{125}{arrowupright}
+\lucidachar{126}{vectorleft}
+\lucidachar{127}{notlessgreater}
+\lucidachar{129}{arrowdownleft}
+\lucidachar{130}{arrowdownright}
+\lucidachar{131}{arrowrightdown}
+\lucidachar{132}{arrowleftdown}
+\lucidachar{133}{arrowrightup}
+\lucidachar{134}{arrowleftup}
+\lucidachar{135}{arrowsemanticlockw}
+\lucidachar{136}{arrowsemclockw}
+\lucidachar{137}{arrowsemanticlockwplus}
+\lucidachar{138}{arrowsemclockwminus}
+\lucidachar{139}{arrowanticlockw}
+\lucidachar{140}{arrowclockw}
+\lucidachar{141}{arrowsquiggleleft}
+\lucidachar{142}{arrowsquiggleright}
+\lucidachar{143}{arrowwaveleft}
+\lucidachar{144}{arrowwaveright}
+\lucidachar{145}{arrowwaveboth}
+\lucidachar{146}{arrowmidbarright}
+\lucidachar{147}{arrowzigzag}
+\lucidachar{148}{notequal}
+\lucidachar{149}{notequivalence}
+\lucidachar{150}{notsimilar}
+\lucidachar{151}{notasymptequal}
+\lucidachar{152}{notalmostequal}
+\lucidachar{153}{notapproxequal}
+\lucidachar{154}{notless}
+\lucidachar{155}{notgreater}
+\lucidachar{156}{notlessequal}
+\lucidachar{157}{notgreaterequal}
+\lucidachar{158}{notlessequivlnt}
+\lucidachar{159}{notgreaterequivlnt}
+\lucidachar{160}{space}
+\lucidachar{171}{star1}
+\lucidachar{172}{checkmark}
+\lucidachar{197}{notgreaterless}
+\lucidachar{198}{notpropersubset}
+\lucidachar{199}{notpropersuperset}
+\lucidachar{200}{notreflexsubset}
+\lucidachar{201}{notreflexsuperset}
+\lucidachar{202}{notsubsetdblequal}
+\lucidachar{203}{notsupersetdblequal}
+\lucidachar{204}{subsetnotequal}
+\lucidachar{205}{supersetnotequal}
+\lucidachar{206}{subsetornotequal1}
+\lucidachar{207}{supersetornotequal1}
+\lucidachar{208}{notsubsetorequal}
+\lucidachar{209}{notsupersetorequal}
+\lucidachar{210}{subsetornotequal}
+\lucidachar{211}{supersetornotequal}
+\lucidachar{212}{notsubsetsqequal}
+\lucidachar{213}{notsupersetsqequal}
+\lucidachar{214}{notlessequal1}
+\lucidachar{215}{notgreaterequal1}
+\lucidachar{216}{notlessdblequal}
+\lucidachar{217}{notgreaterdblequal}
+\lucidachar{218}{lessnotequal}
+\lucidachar{219}{greaternotequal}
+\lucidachar{220}{lessnotdblequal}
+\lucidachar{221}{greaternotdblequal}
+\lucidachar{222}{lessnotdblequal1}
+\lucidachar{223}{greaternotdblequal1}
+\lucidachar{224}{lessnotequivlnt}
+\lucidachar{225}{periodcenteredbold}
+\lucidachar{226}{greaternotequivlnt}
+\lucidachar{227}{lessnotdblequivlnt}
+\lucidachar{228}{greaternotdblequivlnt}
+\lucidachar{229}{notpreceeds}
+\lucidachar{230}{notfollows}
+\lucidachar{231}{notpreceedsequal}
+\lucidachar{232}{notfollowsequal}
+\lucidachar{233}{preceedsnotequal}
+\lucidachar{234}{followsnotequal}
+\lucidachar{235}{preceedsnotsimilar}
+\lucidachar{236}{followsnotsimilar}
+\lucidachar{237}{preceedsnotequivlnt}
+\lucidachar{238}{followsnotequivlnt}
+\lucidachar{239}{nottriangleleft}
+\lucidachar{240}{nottriangleright}
+\lucidachar{241}{nottriangleleftequal}
+\lucidachar{242}{nottrianglerightequal}
+\lucidachar{243}{notequivasymptotic}
+\lucidachar{244}{notbarshort}
+\lucidachar{245}{notparallelshort}
+\lucidachar{246}{notbar}
+\lucidachar{247}{notbardbl}
+\lucidachar{248}{notturnstileleft}
+\lucidachar{249}{notsatisfies}
+\lucidachar{250}{notforces}
+\lucidachar{251}{notforcesextra}
+\lucidachar{252}{negeighteenthem}
+\lucidachar{253}{eighteenthem}
+\lucidachar{254}{eighthem}
+\lucidachar{255}{tenthem}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/lbme.etx b/fonts/utilities/mathinst/lbme.etx
new file mode 100644
index 0000000000..ad2ae664a3
--- /dev/null
+++ b/fonts/utilities/mathinst/lbme.etx
@@ -0,0 +1,656 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lbme.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+%% This part comes from OMX.etx...
+
+\needsfontinstversion{1.5}
+
+\setstr{codingscheme}{TEX MATH EXTENSION}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setslot{parenleftbig}
+ \nextlarger{parenleftBig}
+\endsetslot
+
+\setslot{parenrightbig}
+ \nextlarger{parenrightBig}
+\endsetslot
+
+\setslot{bracketleftbig}
+ \nextlarger{bracketleftBig}
+\endsetslot
+
+\setslot{bracketrightbig}
+ \nextlarger{bracketrightBig}
+\endsetslot
+
+\setslot{floorleftbig}
+ \nextlarger{floorleftBig}
+\endsetslot
+
+\setslot{floorrightbig}
+ \nextlarger{floorrightBig}
+\endsetslot
+
+\setslot{ceilingleftbig}
+ \nextlarger{ceilingleftBig}
+\endsetslot
+
+\setslot{ceilingrightbig}
+ \nextlarger{ceilingrightBig}
+\endsetslot
+
+\setslot{braceleftbig}
+ \nextlarger{braceleftBig}
+\endsetslot
+
+\setslot{bracerightbig}
+ \nextlarger{bracerightBig}
+\endsetslot
+
+\setslot{angleleftbig}
+ \nextlarger{angleleftBig}
+\endsetslot
+
+\setslot{anglerightbig}
+ \nextlarger{anglerightBig}
+\endsetslot
+
+\setslot{barex}
+ \varchar
+ \varrep{barex}
+ \endvarchar
+\endsetslot
+
+\setslot{bardblex}
+ \varchar
+ \varrep{bardblex}
+ \endvarchar
+\endsetslot
+
+\setslot{slashbig}
+ \nextlarger{slashBig}
+\endsetslot
+
+\setslot{backslashbig}
+ \nextlarger{backslashBig}
+\endsetslot
+
+\setslot{parenleftBig}
+ \nextlarger{parenleftbigg}
+\endsetslot
+
+\setslot{parenrightBig}
+ \nextlarger{parenrightbigg}
+\endsetslot
+
+\setslot{parenleftbigg}
+ \nextlarger{parenleftBigg}
+\endsetslot
+
+\setslot{parenrightbigg}
+ \nextlarger{parenrightBigg}
+\endsetslot
+
+\setslot{bracketleftbigg}
+ \nextlarger{bracketleftBigg}
+\endsetslot
+
+\setslot{bracketrightbigg}
+ \nextlarger{bracketrightBigg}
+\endsetslot
+
+\setslot{floorleftbigg}
+ \nextlarger{floorleftBigg}
+\endsetslot
+
+\setslot{floorrightbigg}
+ \nextlarger{floorrightBigg}
+\endsetslot
+
+\setslot{ceilingleftbigg}
+ \nextlarger{ceilingleftBigg}
+\endsetslot
+
+\setslot{ceilingrightbigg}
+ \nextlarger{ceilingrightBigg}
+\endsetslot
+
+\setslot{braceleftbigg}
+ \nextlarger{braceleftBigg}
+\endsetslot
+
+\setslot{bracerightbigg}
+ \nextlarger{bracerightBigg}
+\endsetslot
+
+\setslot{angleleftbigg}
+ \nextlarger{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightbigg}
+ \nextlarger{anglerightBigg}
+\endsetslot
+
+\setslot{slashbigg}
+ \nextlarger{slashBigg}
+\endsetslot
+
+\setslot{backslashbigg}
+ \nextlarger{backslashBigg}
+\endsetslot
+
+\setslot{parenleftBigg}
+ \nextlarger{parenlefttp}
+\endsetslot
+
+\setslot{parenrightBigg}
+ \nextlarger{parenrighttp}
+\endsetslot
+
+\setslot{bracketleftBigg}
+ \nextlarger{bracketlefttp}
+\endsetslot
+
+\setslot{bracketrightBigg}
+ \nextlarger{bracketrighttp}
+\endsetslot
+
+\setslot{floorleftBigg}
+ \nextlarger{bracketleftbt}
+\endsetslot
+
+\setslot{floorrightBigg}
+ \nextlarger{bracketrightbt}
+\endsetslot
+
+\setslot{ceilingleftBigg}
+ \nextlarger{bracketleftex}
+\endsetslot
+
+\setslot{ceilingrightBigg}
+ \nextlarger{bracketrightex}
+\endsetslot
+
+\setslot{braceleftBigg}
+ \nextlarger{bracelefttp}
+\endsetslot
+
+\setslot{bracerightBigg}
+ \nextlarger{bracerighttp}
+\endsetslot
+
+\setslot{angleleftBigg}
+\endsetslot
+
+\setslot{anglerightBigg}
+\endsetslot
+
+\setslot{slashBigg}
+\endsetslot
+
+\setslot{backslashBigg}
+\endsetslot
+
+\setslot{slashBig}
+ \nextlarger{slashbigg}
+\endsetslot
+
+\setslot{backslashBig}
+ \nextlarger{backslashbigg}
+\endsetslot
+
+\setslot{parenlefttp}
+ \varchar
+ \vartop{parenlefttp}
+ \varbot{parenleftbt}
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrighttp}
+ \varchar
+ \vartop{parenrighttp}
+ \varbot{parenrightbt}
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketlefttp}
+ \varchar
+ \vartop{bracketlefttp}
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrighttp}
+ \varchar
+ \vartop{bracketrighttp}
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftbt}
+ \varchar
+ \varbot{bracketleftbt}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightbt}
+ \varchar
+ \varbot{bracketrightbt}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketleftex}
+ \varchar
+ \vartop{bracketlefttp}
+ \varrep{bracketleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracketrightex}
+ \varchar
+ \vartop{bracketrighttp}
+ \varrep{bracketrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracelefttp}
+ \varchar
+ \vartop{bracelefttp}
+ \varmid{braceleftmid}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerighttp}
+ \varchar
+ \vartop{bracerighttp}
+ \varmid{bracerightmid}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{braceleftbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceleftmid}
+ \varchar
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracerightmid}
+ \varchar
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{braceex}
+ \varchar
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowvertex}
+ \varchar
+ \vartop{arrowtp}
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftbt}
+ \varchar
+ \vartop{bracelefttp}
+ \varbot{bracerightbt}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightbt}
+ \varchar
+ \vartop{bracerighttp}
+ \varbot{braceleftmid}
+ \varrep{braceex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenleftex}
+ \varchar
+ \varrep{parenleftex}
+ \endvarchar
+\endsetslot
+
+\setslot{parenrightex}
+ \varchar
+ \varrep{parenrightex}
+ \endvarchar
+\endsetslot
+
+\setslot{angleleftBig}
+ \nextlarger{angleleftbigg}
+\endsetslot
+
+\setslot{anglerightBig}
+ \nextlarger{anglerightbigg}
+\endsetslot
+
+\setslot{unionsqtext}
+ \nextlarger{unionsqdisplay}
+\endsetslot
+
+\setslot{unionsqdisplay}
+\endsetslot
+
+\setslot{contintegraltext}
+ \nextlarger{contintegraldisplay}
+\endsetslot
+
+\setslot{contintegraldisplay}
+\endsetslot
+
+\setslot{circledottext}
+ \nextlarger{circledotdisplay}
+\endsetslot
+
+\setslot{circledotdisplay}
+\endsetslot
+
+\setslot{circleplustext}
+ \nextlarger{circleplusdisplay}
+\endsetslot
+
+\setslot{circleplusdisplay}
+\endsetslot
+
+\setslot{circlemultiplytext}
+ \nextlarger{circlemultiplydisplay}
+\endsetslot
+
+\setslot{circlemultiplydisplay}
+\endsetslot
+
+\setslot{summationtext}
+ \nextlarger{summationdisplay}
+\endsetslot
+
+\setslot{producttext}
+ \nextlarger{productdisplay}
+\endsetslot
+
+\setslot{integraltext}
+ \nextlarger{integraldisplay}
+\endsetslot
+
+\setslot{uniontext}
+ \nextlarger{uniondisplay}
+\endsetslot
+
+\setslot{intersectiontext}
+ \nextlarger{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultitext}
+ \nextlarger{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalandtext}
+ \nextlarger{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalortext}
+ \nextlarger{logicalordisplay}
+\endsetslot
+
+\setslot{summationdisplay}
+\endsetslot
+
+\setslot{productdisplay}
+\endsetslot
+
+\setslot{integraldisplay}
+\endsetslot
+
+\setslot{uniondisplay}
+\endsetslot
+
+\setslot{intersectiondisplay}
+\endsetslot
+
+\setslot{unionmultidisplay}
+\endsetslot
+
+\setslot{logicalanddisplay}
+\endsetslot
+
+\setslot{logicalordisplay}
+\endsetslot
+
+\setslot{coproducttext}
+ \nextlarger{coproductdisplay}
+\endsetslot
+
+\setslot{coproductdisplay}
+\endsetslot
+
+\setslot{hatwide}
+ \nextlarger{hatwider}
+\endsetslot
+
+\setslot{hatwider}
+ \nextlarger{hatwiderr}
+\endsetslot
+
+\setslot{hatwiderr}
+\endsetslot
+
+\setslot{tildewide}
+ \nextlarger{tildewider}
+\endsetslot
+
+\setslot{tildewider}
+ \nextlarger{tildewiderr}
+\endsetslot
+
+\setslot{tildewiderr}
+\endsetslot
+
+\setslot{bracketleftBig}
+ \nextlarger{bracketleftbigg}
+\endsetslot
+
+\setslot{bracketrightBig}
+ \nextlarger{bracketrightbigg}
+\endsetslot
+
+\setslot{floorleftBig}
+ \nextlarger{floorleftbigg}
+\endsetslot
+
+\setslot{floorrightBig}
+ \nextlarger{floorrightbigg}
+\endsetslot
+
+\setslot{ceilingleftBig}
+ \nextlarger{ceilingleftbigg}
+\endsetslot
+
+\setslot{ceilingrightBig}
+ \nextlarger{ceilingrightbigg}
+\endsetslot
+
+\setslot{braceleftBig}
+ \nextlarger{braceleftbigg}
+\endsetslot
+
+\setslot{bracerightBig}
+ \nextlarger{bracerightbigg}
+\endsetslot
+
+\setslot{radicalbig}
+ \nextlarger{radicalBig}
+\endsetslot
+
+\setslot{radicalBig}
+ \nextlarger{radicalbigg}
+\endsetslot
+
+\setslot{radicalbigg}
+ \nextlarger{radicalBigg}
+\endsetslot
+
+\setslot{radicalBigg}
+ \nextlarger{radicalbt}
+\endsetslot
+
+\setslot{radicalbt}
+ \varchar
+ \varbot{radicalbt}
+ \vartop{radicaltp}
+ \varrep{radicalvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{radicalvertex}
+\endsetslot
+
+\setslot{radicaltp}
+\endsetslot
+
+\setslot{arrowdblvertex}
+ \varchar
+ \vartop{arrowdbltp}
+ \varbot{arrowdblbt}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowtp}
+ \varchar
+ \vartop{arrowtp}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowbt}
+ \varchar
+ \varbot{arrowbt}
+ \varrep{arrowvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{bracehtipdownleft}
+\endsetslot
+
+\setslot{bracehtipdownright}
+\endsetslot
+
+\setslot{bracehtipupleft}
+\endsetslot
+
+\setslot{bracehtipupright}
+\endsetslot
+
+\setslot{arrowdbltp}
+ \varchar
+ \vartop{arrowdbltp}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+\setslot{arrowdblbt}
+ \varchar
+ \varbot{arrowdblbt}
+ \varrep{arrowdblvertex}
+ \endvarchar
+\endsetslot
+
+%% This is new, and names the glyphs in the upper part of the font.
+
+\setcommand\lucidachar#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\lucidachar{130}{openbracketleftbig}
+\lucidachar{131}{openbracketrightbig}
+\lucidachar{132}{openbracketleftBig}
+\lucidachar{133}{openbracketrightBig}
+\lucidachar{134}{openbracketleftbigg}
+\lucidachar{135}{openbracketrightbigg}
+\lucidachar{136}{openbracketleftBigg}
+\lucidachar{137}{openbracketrightBigg}
+\lucidachar{138}{openbracketlefttp}
+\lucidachar{139}{openbracketrighttp}
+\lucidachar{140}{openbracketleftbt}
+\lucidachar{141}{openbracketrightbt}
+\lucidachar{142}{openbracketleftex}
+\lucidachar{143}{openbracketrightex}
+\lucidachar{144}{surfintegraltext}
+\lucidachar{145}{surfintegraldisplay}
+\lucidachar{146}{integralmid}
+\lucidachar{147}{contintegralmid}
+\lucidachar{148}{surfintegralmid}
+\lucidachar{149}{integraltp}
+\lucidachar{150}{integralbt}
+\lucidachar{151}{integralex}
+\lucidachar{160}{space}
+\lucidachar{197}{hatwide1}
+\lucidachar{198}{hatwider1}
+\lucidachar{199}{tildewide1}
+\lucidachar{200}{tildewider1}
+\lucidachar{208}{Gamma}
+\lucidachar{209}{Delta}
+\lucidachar{210}{Theta}
+\lucidachar{211}{Lambda}
+\lucidachar{212}{Xi}
+\lucidachar{213}{Pi}
+\lucidachar{214}{Sigma}
+\lucidachar{215}{Upsilon}
+\lucidachar{216}{Phi}
+\lucidachar{217}{Psi}
+\lucidachar{218}{Omega}
+\lucidachar{252}{negeighteenthem}
+\lucidachar{253}{eighteenthem}
+\lucidachar{254}{eighthem}
+\lucidachar{255}{tenthem}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/lbmi.etx b/fonts/utilities/mathinst/lbmi.etx
new file mode 100644
index 0000000000..7c7f4a7e5b
--- /dev/null
+++ b/fonts/utilities/mathinst/lbmi.etx
@@ -0,0 +1,638 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lbmi.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+\needsfontinstversion{1.305}
+
+\setstr{codingscheme}{TEX MATH ITALIC}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\setslot{alpha}
+ \comment{The greek letter `$\alpha$'.}
+\endsetslot
+
+\setslot{beta}
+ \comment{The greek letter `$\beta$'.}
+\endsetslot
+
+\setslot{gamma}
+ \comment{The greek letter `$\gamma$'.}
+\endsetslot
+
+\setslot{delta}
+ \comment{The greek letter `$\delta$'.}
+\endsetslot
+
+\setslot{epsilon1}
+ \comment{The greek letter `$\epsilon$'.}
+\endsetslot
+
+\setslot{zeta}
+ \comment{The greek letter `$\zeta$'.}
+\endsetslot
+
+\setslot{eta}
+ \comment{The greek letter `$\eta$'.}
+\endsetslot
+
+\setslot{theta}
+ \comment{The greek letter `$\theta$'.}
+\endsetslot
+
+\setslot{iota}
+ \comment{The greek letter `$\iota$'.}
+\endsetslot
+
+\setslot{kappa}
+ \comment{The greek letter `$\kappa$'.}
+\endsetslot
+
+\setslot{lambda}
+ \comment{The greek letter `$\lambda$'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The greek letter `$\mu$'.}
+\endsetslot
+
+\setslot{nu}
+ \comment{The greek letter `$\nu$'.}
+\endsetslot
+
+\setslot{xi}
+ \comment{The greek letter `$\xi$'.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The greek letter `$\pi$'.}
+\endsetslot
+
+\setslot{rho}
+ \comment{The greek letter `$\rho$'.}
+\endsetslot
+
+\setslot{sigma}
+ \comment{The greek letter `$\sigma$'.}
+\endsetslot
+
+\setslot{tau}
+ \comment{The greek letter `$\tau$'.}
+\endsetslot
+
+\setslot{upsilon}
+ \comment{The greek letter `$\upsilon$'.}
+\endsetslot
+
+\setslot{phi}
+ \comment{The greek letter `$\phi$'.}
+\endsetslot
+
+\setslot{chi}
+ \comment{The greek letter `$\chi$'.}
+\endsetslot
+
+\setslot{psi}
+ \comment{The greek letter `$\psi$'.}
+\endsetslot
+
+\setslot{omega}
+ \comment{The greek letter `$\omega$'.}
+\endsetslot
+
+\setslot{epsilon}
+ \comment{The greek letter `$\varepsilon$'.}
+\endsetslot
+
+\setslot{theta1}
+ \comment{The greek letter `$\vartheta$'.}
+\endsetslot
+
+\setslot{pi1}
+ \comment{The greek letter `$\varpi$', rather unfortunately named
+ `omega1' by Adobe.}
+\endsetslot
+
+\setslot{rho1}
+ \comment{The greek letter `$\varrho$'.}
+\endsetslot
+
+\setslot{sigma1}
+ \comment{The greek letter `$\varsigma$'.}
+\endsetslot
+
+\setslot{phi1}
+ \comment{The greek letter `$\varphi$'.}
+\endsetslot
+
+\setslot{harpoonleftup}
+ \comment{The harpoon symbol `$\leftharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonleftdown}
+ \comment{The harpoon symbol `$\leftharpoondown$'.}
+\endsetslot
+
+\setslot{harpoonrightup}
+ \comment{The harpoon symbol `$\rightharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonrightdown}
+ \comment{The harpoon symbol `$\rightharpoondown$'.}
+\endsetslot
+
+\setslot{hookrightchar}
+ \comment{The building block for `$\hookrightarrow$'.}
+\endsetslot
+
+\setslot{hookleftchar}
+ \comment{The building block for `$\hookleftarrow$'.}
+\endsetslot
+
+\setslot{triangleright}
+ \comment{The triangle symbol `$\triangleright$'.}
+\endsetslot
+
+\setslot{triangleleft}
+ \comment{The triangle symbol `$\triangleleft$'.}
+\endsetslot
+
+\setslot{zerooldstyle}
+ \comment{The oldstyle digit zero `0'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The oldstyle digit one `1'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The oldstyle digit two `2'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The oldstyle digit three `3'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The oldstyle digit four `4'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The oldstyle digit five `5'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The oldstyle digit six `6'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The oldstyle digit seven `7'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The oldstyle digit eight `8'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The oldstyle digit nine `9'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forwards oblique `/'.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\setslot{star}
+ \comment{The star symbol `$\star$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differentiation symbol `$\partial$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{flat}
+ \comment{The flat musical symbol `$\flat$'.}
+\endsetslot
+
+\setslot{sharp}
+ \comment{The sharp musical symbol `$\sharp$'.}
+\endsetslot
+
+\setslot{natural}
+ \comment{The natural musical symbol `$\natural$'.}
+\endsetslot
+
+\setslot{slurbelow}
+ \comment{The slur symbol `$\smile$'.}
+\endsetslot
+
+\setslot{slurabove}
+ \comment{The slur symbol `$\frown$'.}
+\endsetslot
+
+\setslot{lscript}
+ \comment{The calligraphic letter l `$\ell$'.}
+\endsetslot
+
+\setslot{a}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{b}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{c}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{d}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{e}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{f}
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{g}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{h}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{i}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{j}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{k}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{l}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{m}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{n}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{o}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{p}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{q}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{r}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{s}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{t}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{u}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{v}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{w}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{x}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{y}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{z}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\setslot{dotlessi}
+ \comment{The letter `{\i}'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \comment{The letter `{\j}'.}
+\endsetslot
+
+\setslot{weierstrass}
+ \comment{The Weierstrass P symbol `$\wp$'.}
+\endsetslot
+
+\setslot{vector}
+ \comment{The vector accent symbol `$\vec a$'.}
+\endsetslot
+
+\setslot{tie}
+ \comment{The tie accent symbol `\t oo'.}
+\endsetslot
+
+\setcommand\lucidachar#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\lucidachar{129}{omicron}
+\lucidachar{130}{openbracketleft}
+\lucidachar{131}{openbracketright}
+\lucidachar{132}{parenleft}
+\lucidachar{133}{parenright}
+\lucidachar{134}{bracketleft}
+\lucidachar{135}{bracketright}
+\lucidachar{136}{integraldbl}
+\lucidachar{137}{integraltrpl}
+\lucidachar{138}{contintegral}
+\lucidachar{139}{surfintegral}
+\lucidachar{140}{volintegral}
+\lucidachar{141}{clwintegral}
+\lucidachar{142}{cclwcontintegral}
+\lucidachar{143}{clwcontintegral}
+\lucidachar{144}{Finv}
+\lucidachar{145}{Gmir}
+\lucidachar{146}{Omegainv}
+\lucidachar{147}{Euler}
+\lucidachar{148}{complement}
+\lucidachar{149}{beth}
+\lucidachar{150}{gimel}
+\lucidachar{151}{daleth}
+\lucidachar{152}{gscript}
+\lucidachar{153}{hscript}
+\lucidachar{154}{zscript}
+\lucidachar{155}{kappa1}
+\lucidachar{156}{zeroslash}
+\lucidachar{157}{planckover2pi}
+\lucidachar{158}{lambdabar}
+\lucidachar{159}{lscriptbar}
+\lucidachar{160}{space}
+\lucidachar{171}{primereverse1}
+\lucidachar{172}{forcesextra}
+\lucidachar{197}{original}
+\lucidachar{198}{image}
+\lucidachar{199}{multimap}
+\lucidachar{200}{primereverse}
+\lucidachar{201}{circleR}
+\lucidachar{202}{circleS}
+\lucidachar{203}{maltesecross}
+\lucidachar{204}{circleminus1}
+\lucidachar{205}{shortsolidus}
+\lucidachar{206}{multicloseleft}
+\lucidachar{207}{multicloseright}
+\lucidachar{208}{multiopenleft}
+\lucidachar{209}{multiopenright}
+\lucidachar{210}{xor}
+\lucidachar{211}{tacktrpl}
+\lucidachar{212}{assertion}
+\lucidachar{213}{notassertion}
+\lucidachar{214}{truestate}
+\lucidachar{215}{falsestate}
+\lucidachar{216}{shortsolidusback}
+\lucidachar{217}{intercal}
+\lucidachar{218}{lessdblequivlnt}
+\lucidachar{219}{greaterdblequivlnt}
+\lucidachar{220}{lessdot}
+\lucidachar{221}{greaterdot}
+\lucidachar{222}{verymuchless}
+\lucidachar{223}{verymuchgreater}
+\lucidachar{224}{lessequal1}
+\lucidachar{225}{greaterequal1}
+\lucidachar{226}{equalless}
+\lucidachar{227}{equalgreater}
+\lucidachar{228}{precedesequal1}
+\lucidachar{229}{followsequal1}
+\lucidachar{230}{equalprecedes1}
+\lucidachar{231}{equalfollows1}
+\lucidachar{232}{lessequalgreater}
+\lucidachar{233}{greaterequalless}
+\lucidachar{234}{lessdbleqlgreater}
+\lucidachar{235}{greaterdbleqlless}
+\lucidachar{236}{precedesequivlnt}
+\lucidachar{237}{followsequivlnt}
+\lucidachar{238}{subsetdblequal}
+\lucidachar{239}{supersetdblequal}
+\lucidachar{240}{triangleleftsld}
+\lucidachar{241}{trianglerightsld}
+\lucidachar{242}{between}
+\lucidachar{243}{fork}
+\lucidachar{244}{barshort}
+\lucidachar{245}{parallelshort}
+\lucidachar{246}{bowtie}
+\lucidachar{247}{divideonmultiply}
+\lucidachar{248}{revsimilar}
+\lucidachar{249}{revasymptequal}
+\lucidachar{250}{element}
+\lucidachar{251}{owner}
+\lucidachar{252}{negeighteenthem}
+\lucidachar{253}{eighteenthem}
+\lucidachar{254}{eighthem}
+\lucidachar{255}{tenthem}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/lbmo.etx b/fonts/utilities/mathinst/lbmo.etx
new file mode 100644
index 0000000000..29afb7dde6
--- /dev/null
+++ b/fonts/utilities/mathinst/lbmo.etx
@@ -0,0 +1,645 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lbmo.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+%% This part contains the information from OML.etx...
+
+\needsfontinstversion{1.5}
+
+\setstr{codingscheme}{TEX MATH ITALIC}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\setslot{alpha}
+ \comment{The greek letter `$\alpha$'.}
+\endsetslot
+
+\setslot{beta}
+ \comment{The greek letter `$\beta$'.}
+\endsetslot
+
+\setslot{gamma}
+ \comment{The greek letter `$\gamma$'.}
+\endsetslot
+
+\setslot{delta}
+ \comment{The greek letter `$\delta$'.}
+\endsetslot
+
+\setslot{epsilon1}
+ \comment{The greek letter `$\epsilon$'.}
+\endsetslot
+
+\setslot{zeta}
+ \comment{The greek letter `$\zeta$'.}
+\endsetslot
+
+\setslot{eta}
+ \comment{The greek letter `$\eta$'.}
+\endsetslot
+
+\setslot{theta}
+ \comment{The greek letter `$\theta$'.}
+\endsetslot
+
+\setslot{iota}
+ \comment{The greek letter `$\iota$'.}
+\endsetslot
+
+\setslot{kappa}
+ \comment{The greek letter `$\kappa$'.}
+\endsetslot
+
+\setslot{lambda}
+ \comment{The greek letter `$\lambda$'.}
+\endsetslot
+
+\setslot{mu}
+ \comment{The greek letter `$\mu$'.}
+\endsetslot
+
+\setslot{nu}
+ \comment{The greek letter `$\nu$'.}
+\endsetslot
+
+\setslot{xi}
+ \comment{The greek letter `$\xi$'.}
+\endsetslot
+
+\setslot{pi}
+ \comment{The greek letter `$\pi$'.}
+\endsetslot
+
+\setslot{rho}
+ \comment{The greek letter `$\rho$'.}
+\endsetslot
+
+\setslot{sigma}
+ \comment{The greek letter `$\sigma$'.}
+\endsetslot
+
+\setslot{tau}
+ \comment{The greek letter `$\tau$'.}
+\endsetslot
+
+\setslot{upsilon}
+ \comment{The greek letter `$\upsilon$'.}
+\endsetslot
+
+\setslot{phi}
+ \comment{The greek letter `$\phi$'.}
+\endsetslot
+
+\setslot{chi}
+ \comment{The greek letter `$\chi$'.}
+\endsetslot
+
+\setslot{psi}
+ \comment{The greek letter `$\psi$'.}
+\endsetslot
+
+\setslot{omega}
+ \comment{The greek letter `$\omega$'.}
+\endsetslot
+
+\setslot{epsilon}
+ \comment{The greek letter `$\varepsilon$'.}
+\endsetslot
+
+\setslot{theta1}
+ \comment{The greek letter `$\vartheta$'.}
+\endsetslot
+
+\setslot{pi1}
+ \comment{The greek letter `$\varpi$', rather unfortunately named
+ `omega1' by Adobe.}
+\endsetslot
+
+\setslot{rho1}
+ \comment{The greek letter `$\varrho$'.}
+\endsetslot
+
+\setslot{sigma1}
+ \comment{The greek letter `$\varsigma$'.}
+\endsetslot
+
+\setslot{phi1}
+ \comment{The greek letter `$\varphi$'.}
+\endsetslot
+
+\setslot{harpoonleftup}
+ \comment{The harpoon symbol `$\leftharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonleftdown}
+ \comment{The harpoon symbol `$\leftharpoondown$'.}
+\endsetslot
+
+\setslot{harpoonrightup}
+ \comment{The harpoon symbol `$\rightharpoonup$'.}
+\endsetslot
+
+\setslot{harpoonrightdown}
+ \comment{The harpoon symbol `$\rightharpoondown$'.}
+\endsetslot
+
+\setslot{hookrightchar}
+ \comment{The building block for `$\hookrightarrow$'.}
+\endsetslot
+
+\setslot{hookleftchar}
+ \comment{The building block for `$\hookleftarrow$'.}
+\endsetslot
+
+\setslot{triangleright}
+ \comment{The triangle symbol `$\triangleright$'.}
+\endsetslot
+
+\setslot{triangleleft}
+ \comment{The triangle symbol `$\triangleleft$'.}
+\endsetslot
+
+%%Change `oldstyle' to regular...
+
+\setslot{zerooldstyle}
+ \comment{The digit zero `0'.}
+\endsetslot
+
+\setslot{oneoldstyle}
+ \comment{The digit one `1'.}
+\endsetslot
+
+\setslot{twooldstyle}
+ \comment{The digit two `2'.}
+\endsetslot
+
+\setslot{threeoldstyle}
+ \comment{The digit three `3'.}
+\endsetslot
+
+\setslot{fouroldstyle}
+ \comment{The digit four `4'.}
+\endsetslot
+
+\setslot{fiveoldstyle}
+ \comment{The digit five `5'.}
+\endsetslot
+
+\setslot{sixoldstyle}
+ \comment{The digit six `6'.}
+\endsetslot
+
+\setslot{sevenoldstyle}
+ \comment{The digit seven `7'.}
+\endsetslot
+
+\setslot{eightoldstyle}
+ \comment{The digit eight `8'.}
+\endsetslot
+
+\setslot{nineoldstyle}
+ \comment{The digit nine `9'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forwards oblique `/'.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\setslot{star}
+ \comment{The star symbol `$\star$'.}
+\endsetslot
+
+\setslot{partialdiff}
+ \comment{The partial differentiation symbol `$\partial$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{flat}
+ \comment{The flat musical symbol `$\flat$'.}
+\endsetslot
+
+\setslot{sharp}
+ \comment{The sharp musical symbol `$\sharp$'.}
+\endsetslot
+
+\setslot{natural}
+ \comment{The natural musical symbol `$\natural$'.}
+\endsetslot
+
+\setslot{slurbelow}
+ \comment{The slur symbol `$\smile$'.}
+\endsetslot
+
+\setslot{slurabove}
+ \comment{The slur symbol `$\frown$'.}
+\endsetslot
+
+\setslot{lscript}
+ \comment{The calligraphic letter l `$\ell$'.}
+\endsetslot
+
+\setslot{a}
+ \comment{The letter `{a}'.}
+\endsetslot
+
+\setslot{b}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{c}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{d}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{e}
+ \comment{The letter `{e}'.}
+\endsetslot
+
+\setslot{f}
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{g}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{h}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{i}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{j}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{k}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{l}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{m}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{n}
+ \comment{The letter `{n}'.}
+\endsetslot
+
+\setslot{o}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{p}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{q}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{r}
+ \comment{The letter `{r}'.}
+\endsetslot
+
+\setslot{s}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{t}
+ \comment{The letter `{t}'.}
+\endsetslot
+
+\setslot{u}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{v}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{w}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{x}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{y}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{z}
+ \comment{The letter `{z}'.}
+\endsetslot
+
+\setslot{dotlessi}
+ \comment{The letter `{\i}'.}
+\endsetslot
+
+\setslot{dotlessj}
+ \comment{The letter `{\j}'.}
+\endsetslot
+
+\setslot{weierstrass}
+ \comment{The Weierstrass P symbol `$\wp$'.}
+\endsetslot
+
+\setslot{vector}
+ \comment{The vector accent symbol `$\vec a$'.}
+\endsetslot
+
+\setslot{tie}
+ \comment{The tie accent symbol `\t oo'.}
+\endsetslot
+
+%% This part contains slotting and naming information for the
+%% upper half of the math italic font.
+
+\setcommand\lucidachar#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\lucidachar{129}{omicron}
+\lucidachar{130}{openbracketleft}
+\lucidachar{131}{openbracketright}
+\lucidachar{132}{parenleft}
+\lucidachar{133}{parenright}
+\lucidachar{134}{bracketleft}
+\lucidachar{135}{bracketright}
+\lucidachar{136}{integraldbl}
+\lucidachar{137}{integraltrpl}
+\lucidachar{138}{contintegral}
+\lucidachar{139}{surfintegral}
+\lucidachar{140}{volintegral}
+\lucidachar{141}{clwintegral}
+\lucidachar{142}{cclwcontintegral}
+\lucidachar{143}{clwcontintegral}
+\lucidachar{144}{Finv}
+\lucidachar{145}{Gmir}
+\lucidachar{146}{Omegainv}
+\lucidachar{147}{Euler}
+\lucidachar{148}{complement}
+\lucidachar{149}{beth}
+\lucidachar{150}{gimel}
+\lucidachar{151}{daleth}
+\lucidachar{152}{gscript}
+\lucidachar{153}{hscript}
+\lucidachar{154}{zscript}
+\lucidachar{155}{kappa1}
+\lucidachar{156}{zeroslash}
+\lucidachar{157}{planckover2pi}
+\lucidachar{158}{lambdabar}
+\lucidachar{159}{lscriptbar}
+\lucidachar{160}{space}
+\lucidachar{171}{primereverse1}
+\lucidachar{172}{forcesextra}
+\lucidachar{197}{original}
+\lucidachar{198}{image}
+\lucidachar{199}{multimap}
+\lucidachar{200}{primereverse}
+\lucidachar{201}{circleR}
+\lucidachar{202}{circleS}
+\lucidachar{203}{maltesecross}
+\lucidachar{204}{circleminus1}
+\lucidachar{205}{shortsolidus}
+\lucidachar{206}{multicloseleft}
+\lucidachar{207}{multicloseright}
+\lucidachar{208}{multiopenleft}
+\lucidachar{209}{multiopenright}
+\lucidachar{210}{xor}
+\lucidachar{211}{tacktrpl}
+\lucidachar{212}{assertion}
+\lucidachar{213}{notassertion}
+\lucidachar{214}{truestate}
+\lucidachar{215}{falsestate}
+\lucidachar{216}{shortsolidusback}
+\lucidachar{217}{intercal}
+\lucidachar{218}{lessdblequivlnt}
+\lucidachar{219}{greaterdblequivlnt}
+\lucidachar{220}{lessdot}
+\lucidachar{221}{greaterdot}
+\lucidachar{222}{verymuchless}
+\lucidachar{223}{verymuchgreater}
+\lucidachar{224}{lessequal1}
+\lucidachar{225}{greaterequal1}
+\lucidachar{226}{equalless}
+\lucidachar{227}{equalgreater}
+\lucidachar{228}{precedesequal1}
+\lucidachar{229}{followsequal1}
+\lucidachar{230}{equalprecedes1}
+\lucidachar{231}{equalfollows1}
+\lucidachar{232}{lessequalgreater}
+\lucidachar{233}{greaterequalless}
+\lucidachar{234}{lessdbleqlgreater}
+\lucidachar{235}{greaterdbleqlless}
+\lucidachar{236}{precedesequivlnt}
+\lucidachar{237}{followsequivlnt}
+\lucidachar{238}{subsetdblequal}
+\lucidachar{239}{supersetdblequal}
+\lucidachar{240}{triangleleftsld}
+\lucidachar{241}{trianglerightsld}
+\lucidachar{242}{between}
+\lucidachar{243}{fork}
+\lucidachar{244}{barshort}
+\lucidachar{245}{parallelshort}
+\lucidachar{246}{bowtie}
+\lucidachar{247}{divideonmultiply}
+\lucidachar{248}{revsimilar}
+\lucidachar{249}{revasymptequal}
+\lucidachar{250}{element}
+\lucidachar{251}{owner}
+\lucidachar{252}{negeighteenthem}
+\lucidachar{253}{eighteenthem}
+\lucidachar{254}{eighthem}
+\lucidachar{255}{tenthem}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/lbms.etx b/fonts/utilities/mathinst/lbms.etx
new file mode 100644
index 0000000000..ad71c89b57
--- /dev/null
+++ b/fonts/utilities/mathinst/lbms.etx
@@ -0,0 +1,644 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lbms.etx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\encoding
+
+%% This part comes from OMS.etx...
+
+\needsfontinstversion{1.5}
+
+\setstr{codingscheme}{TEX MATH SYMBOLS}
+
+\setint{italicslant}{0}
+
+\ifisglyph{x}\then
+ \setint{xheight}{\height{x}}
+\else
+ \setint{xheight}{500}
+\fi
+
+\setslot{minus}
+ \comment{The subtraction symbol `$-$'.}
+\endsetslot
+
+\setslot{periodcentered}
+ \comment{The centered dot symbol `$\cdot$'.}
+\endsetslot
+
+\setslot{multiply}
+ \comment{The multiplication symbol `$\times$'.}
+\endsetslot
+
+\setslot{asteriskmath}
+ \comment{The centered asterisk symbol `$*$'.}
+\endsetslot
+
+\setslot{divide}
+ \comment{The division symbol `$\div$'.}
+\endsetslot
+
+\setslot{diamondmath}
+ \comment{The diamond symbol `$\diamond$'.}
+\endsetslot
+
+\setslot{plusminus}
+ \comment{The plus or minus symbol `$\pm$'.}
+\endsetslot
+
+\setslot{minusplus}
+ \comment{The minus or plus symbol `$\mp$'.}
+\endsetslot
+
+\setslot{circleplus}
+ \comment{The circled plus symbol `$\oplus$'.}
+\endsetslot
+
+\setslot{circleminus}
+ \comment{The circled minus symbol `$\ominus$'.}
+\endsetslot
+
+\setslot{circlemultiply}
+ \comment{The circled multiplication symbol `$\otimes$'.}
+\endsetslot
+
+\setslot{circledivide}
+ \comment{The circled oblique symbol `$\oslash$'.}
+\endsetslot
+
+\setslot{circledot}
+ \comment{The circled dot symbol `$\odot$'.}
+\endsetslot
+
+\setslot{circlecopyrt}
+ \comment{The large circle symbol `$\bigcirc$' used for building the
+ copyright symbol `\copyright'.}
+\endsetslot
+
+\setslot{openbullet}
+ \comment{The circle symbol `$\circ$'.}
+\endsetslot
+
+\setslot{bullet}
+ \comment{The bullet symbol `$\bullet$'.}
+\endsetslot
+
+\setslot{equivasymptotic}
+ \comment{The asymptotic equals symbol `$\asymp$'.}
+\endsetslot
+
+\setslot{equivalence}
+ \comment{The equivalence symbol `$\equiv$'.}
+\endsetslot
+
+\setslot{reflexsubset}
+ \comment{The subset or equals symbol `$\subseteq$'.}
+\endsetslot
+
+\setslot{reflexsuperset}
+ \comment{The superset or equals symbol `$\supseteq$'.}
+\endsetslot
+
+\setslot{lessequal}
+ \comment{The less or equals symbol `$\leq$'.}
+\endsetslot
+
+\setslot{greaterequal}
+ \comment{The greater or equals symbol `$\geq$'.}
+\endsetslot
+
+\setslot{precedesequal}
+ \comment{The precedes or equals symbol `$\preceq$'.}
+\endsetslot
+
+\setslot{followsequal}
+ \comment{The follows or equals symbol `$\succeq$'.}
+\endsetslot
+
+\setslot{similar}
+ \comment{The similar symbol `$\sim$'.}
+\endsetslot
+
+\setslot{approxequal}
+ \comment{The approximate equality symbol `$\approx$'.}
+\endsetslot
+
+\setslot{propersubset}
+ \comment{The subset symbol `$\subset$'.}
+\endsetslot
+
+\setslot{propersuperset}
+ \comment{The superset symbol `$\supset$'.}
+\endsetslot
+
+\setslot{lessmuch}
+ \comment{The much less symbol `$\ll$'.}
+\endsetslot
+
+\setslot{greatermuch}
+ \comment{The much greater symbol `$\gg$'.}
+\endsetslot
+
+\setslot{curlyless}
+ \comment{The precedes symbol `$\prec$'.}
+\endsetslot
+
+\setslot{curlygreater}
+ \comment{The follows symbol `$\succ$'.}
+\endsetslot
+
+\setslot{arrowleft}
+ \comment{The left arrow symbol `$\leftarrow$'.}
+\endsetslot
+
+\setslot{arrowright}
+ \comment{The right arrow symbol `$\rightarrow$'.}
+\endsetslot
+
+\setslot{arrowup}
+ \comment{The up arrow symbol `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{The down arrow symbol `$\downarrow$'.}
+\endsetslot
+
+\setslot{arrowboth}
+ \comment{The horizontal arrow symbol `$\leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownortheast}
+ \comment{The north-east arrow symbol `$\nearrow$'.}
+\endsetslot
+
+\setslot{arrowsoutheast}
+ \comment{The south-east arrow symbol `$\searrow$'.}
+\endsetslot
+
+\setslot{similarequal}
+ \comment{The similar or equal symbol `$\simeq$'.}
+\endsetslot
+
+\setslot{arrowdblleft}
+ \comment{The double left arrow symbol `$\Leftarrow$'.}
+\endsetslot
+
+\setslot{arrowdblright}
+ \comment{The double right arrow symbol `$\Rightarrow$'.}
+\endsetslot
+
+\setslot{arrowdblup}
+ \comment{The double up arrow symbol `$\Uparrow$'.}
+\endsetslot
+
+\setslot{arrowdbldown}
+ \comment{The double down arrow symbol `$\Downarrow$'.}
+\endsetslot
+
+\setslot{arrowdblboth}
+ \comment{The double horizontal arrow symbol `$\Leftrightarrow$'.}
+\endsetslot
+
+\setslot{arrownorthwest}
+ \comment{The north-west arrow symbol `$\nwarrow$'.}
+\endsetslot
+
+\setslot{arrowsouthwest}
+ \comment{The south-west arrow symbol `$\swarrow$'.}
+\endsetslot
+
+\setslot{proportional}
+ \comment{The proportional symbol `$\propto$'.}
+\endsetslot
+
+\setslot{prime}
+\endsetslot
+
+\setslot{infinity}
+ \comment{The infinity symbol `$\infty$'.}
+\endsetslot
+
+\setslot{element}
+ \comment{The set membership symbol `$\in$'.}
+\endsetslot
+
+\setslot{owner}
+ \comment{The backwards set membership symbol `$\ni$'.}
+\endsetslot
+
+\setslot{triangle}
+ \comment{The upwards triangle symbol `$\bigtriangleup$'.}
+\endsetslot
+
+\setslot{triangleinv}
+ \comment{The downwards triangle symbol `$\bigtriangledown$'.}
+\endsetslot
+
+\setslot{negationslash}
+ \comment{The arrow negation symbol `$/$'.}
+\endsetslot
+
+\setslot{mapstochar}
+ \comment{The maps to building block symbol `$\mapstochar$', used to
+ build `$\mapsto$'.}
+\endsetslot
+
+\setslot{universal}
+ \comment{The universal quantification symbol `$\forall$'.}
+\endsetslot
+
+\setslot{existential}
+ \comment{The existential quantification symbol `$\exists$'.}
+\endsetslot
+
+\setslot{logicalnot}
+ \comment{The negation symbol `$\neg$'.}
+\endsetslot
+
+\setslot{emptysetstress}
+ \comment{The `stressed' empty set symbol `$\emptyset$', which should
+ look like a zero with a slash. The `emptyset' symbol is a circle
+ with a slash.}
+\endsetslot
+
+\setslot{Rfraktur}
+ \comment{The upper case Fraktur R symbol `$\Re$'.}
+\endsetslot
+
+\setslot{Ifraktur}
+ \comment{The upper case Fraktur I symbol `$\Im$'.}
+\endsetslot
+
+\setslot{latticetop}
+ \comment{The inverted perpendicular symbol `$\top$'.}
+\endsetslot
+
+\setslot{perpendicular}
+ \comment{The perpendicular symbol `$\perp$'.}
+\endsetslot
+
+\setslot{aleph}
+ \comment{The aleph symbol `$\aleph$'.}
+\endsetslot
+
+\setslot{A}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{B}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{C}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{D}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{E}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{F}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{G}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{H}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{I}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{J}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{K}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{L}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{M}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{N}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{O}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{P}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{Q}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{R}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{S}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{T}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{U}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{V}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{W}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{X}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{Y}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{Z}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{union}
+ \comment{The set union symbol `$\cup$'.}
+\endsetslot
+
+\setslot{intersection}
+ \comment{The set intersection symbol `$\cap$'.}
+\endsetslot
+
+\setslot{unionmulti}
+ \comment{The multiset union symbol `$\uplus$'.}
+\endsetslot
+
+\setslot{logicaland}
+ \comment{The meet symbol `$\wedge$'.}
+\endsetslot
+
+\setslot{logicalor}
+ \comment{The join symbol `$\vee$'.}
+\endsetslot
+
+\setslot{turnstileleft}
+ \comment{The turnstile symbol `$\vdash$'.}
+\endsetslot
+
+\setslot{turnstileright}
+ \comment{The backwards turnstile symbol `$\dashv$'.}
+\endsetslot
+
+\setslot{floorleft}
+ \comment{The left floor symbol `$\lfloor$'.}
+\endsetslot
+
+\setslot{floorright}
+ \comment{The right floor symbol `$\rfloor$'.}
+\endsetslot
+
+\setslot{ceilingleft}
+ \comment{The left ceiling symbol `$\lceil$'.}
+\endsetslot
+
+\setslot{ceilingright}
+ \comment{The right ceiling symbol `$\rceil$'.}
+\endsetslot
+
+\setslot{braceleft}
+ \comment{The left brace symbol `$\{$'.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The right brace symbol `$\}$'.}
+\endsetslot
+
+\setslot{angleleft}
+ \comment{The left angle bracket symbol `$\langle$'.}
+\endsetslot
+
+\setslot{angleright}
+ \comment{The right angle bracket symbol `$\rangle$'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The vertical bar symbol `$|$'.}
+\endsetslot
+
+\setslot{bardbl}
+ \comment{The parallel vertical bars symbol `$\parallel$'.}
+\endsetslot
+
+\setslot{arrowbothv}
+ \comment{The vertical arrows symbol `$\updownarrow$'.}
+\endsetslot
+
+\setslot{arrowdblbothv}
+ \comment{The double vertical arrows symbol `$\Updownarrow$'.}
+\endsetslot
+
+\setslot{backslash}
+ \comment{The backwards oblique symbol `$\backslash$'.}
+\endsetslot
+
+\setslot{wreathproduct}
+ \comment{The Wreath product symbol `$\wp$'.}
+\endsetslot
+
+\setslot{radicallow}
+ \comment{The lowered radical symbol `$\surd$'.}
+\endsetslot
+
+\setslot{coproduct}
+ \comment{The textstyle coproduct symbol `$\coprod$'.}
+\endsetslot
+
+\setslot{gradient}
+ \comment{The inverted Delta symbol `$\nabla$'.}
+\endsetslot
+
+\setslot{integral}
+ \comment{The textstyle integral symbol `$\plainint$'.}
+\endsetslot
+
+\setslot{unionsq}
+ \comment{The square union symbol `$\sqcup$'.}
+\endsetslot
+
+\setslot{intersectionsq}
+ \comment{The square intersection symbol `$\sqcap$'.}
+\endsetslot
+
+\setslot{subsetsqequal}
+ \comment{The square subset or equal symbol `$\sqsubseteq$'.}
+\endsetslot
+
+\setslot{supersetsqequal}
+ \comment{The square superset or equal symbol `$\sqsupseteq$'.}
+\endsetslot
+
+\setslot{section}
+ \comment{The section symbol `$\S$'.}
+\endsetslot
+
+\setslot{dagger}
+ \comment{The dagger symbol `$\dag$'.}
+\endsetslot
+
+\setslot{daggerdbl}
+ \comment{The double dagger symbol `$\ddag$'.}
+\endsetslot
+
+\setslot{paragraph}
+ \comment{The paragraph symbol `$\P$'.}
+\endsetslot
+
+\setslot{club}
+ \comment{The club suit symbol `$\clubsuit$'.}
+\endsetslot
+
+\setslot{diamond}
+ \comment{The diamond suit symbol `$\diamondsuit$'.}
+\endsetslot
+
+\setslot{heart}
+ \comment{The heart suit symbol `$\heartsuit$'.}
+\endsetslot
+
+\setslot{spade}
+ \comment{The spade suit symbol `$\spadesuit$'.}
+\endsetslot
+
+%% This part names the upper half of the lucida symbol font...
+
+\setcommand\lucidachar#1#2{
+ \nextslot{#1}
+ \setslot{#2}
+ \endsetslot
+}
+
+\lucidachar{129}{radicalext}
+\lucidachar{130}{plus}
+\lucidachar{131}{equal}
+\lucidachar{132}{curland}
+\lucidachar{133}{curlor}
+\lucidachar{134}{increment}
+\lucidachar{135}{product}
+\lucidachar{136}{summation}
+\lucidachar{137}{dotplus}
+\lucidachar{138}{rightangle}
+\lucidachar{139}{angle}
+\lucidachar{140}{measuredangle}
+\lucidachar{141}{sphericalangle}
+\lucidachar{142}{rightanglearc}
+\lucidachar{143}{righttriangle}
+\lucidachar{144}{therefore}
+\lucidachar{145}{because}
+\lucidachar{146}{colon}
+\lucidachar{147}{proportion}
+\lucidachar{148}{dotminus}
+\lucidachar{149}{excess}
+\lucidachar{150}{geomproportion}
+\lucidachar{151}{homothetic}
+\lucidachar{152}{sine}
+\lucidachar{153}{minustilde}
+\lucidachar{154}{lessmuch1}
+\lucidachar{155}{approxorequal}
+\lucidachar{156}{greatermuch1}
+\lucidachar{157}{almostorequal}
+\lucidachar{158}{tildetrpl}
+\lucidachar{159}{allequal}
+\lucidachar{160}{space}
+\lucidachar{171}{prime1}
+\lucidachar{172}{radical1}
+\lucidachar{197}{lazys}
+\lucidachar{198}{lazysinv}
+\lucidachar{199}{geomequivalent}
+\lucidachar{200}{difference}
+\lucidachar{201}{approachlimit}
+\lucidachar{202}{geomequal}
+\lucidachar{203}{approxequalorimage}
+\lucidachar{204}{imageorapproxequal}
+\lucidachar{205}{colonequal}
+\lucidachar{206}{equalcolon}
+\lucidachar{207}{ringinequal}
+\lucidachar{208}{ringequal}
+\lucidachar{209}{corresponds}
+\lucidachar{210}{estimates}
+\lucidachar{211}{equiangular}
+\lucidachar{212}{perspcorrespond}
+\lucidachar{213}{deltaequal}
+\lucidachar{214}{definequal}
+\lucidachar{215}{measurequal}
+\lucidachar{216}{questionequal}
+\lucidachar{217}{strictequivalence}
+\lucidachar{218}{lessdblequal}
+\lucidachar{219}{greaterdblequal}
+\lucidachar{220}{lessequivlnt}
+\lucidachar{221}{greaterequivlnt}
+\lucidachar{222}{lessorgreater}
+\lucidachar{223}{greaterorless}
+\lucidachar{224}{precedequivlnt}
+\lucidachar{225}{followsequivlnt}
+\lucidachar{226}{multiset}
+\lucidachar{227}{multiplymultiset}
+\lucidachar{228}{squareimage}
+\lucidachar{229}{squareoriginal}
+\lucidachar{230}{circlering}
+\lucidachar{231}{circleasterisk}
+\lucidachar{232}{circleequal}
+\lucidachar{233}{circlebar}
+\lucidachar{234}{squareplus}
+\lucidachar{235}{squareminus}
+\lucidachar{236}{squaremultiply}
+\lucidachar{237}{squaredot}
+\lucidachar{238}{satisfy}
+\lucidachar{239}{satisfiedby}
+\lucidachar{240}{force}
+\lucidachar{241}{hermitconjmatrix}
+\lucidachar{242}{lowerrank}
+\lucidachar{243}{higherrank}
+\lucidachar{244}{triangleftequal}
+\lucidachar{245}{triangrightequal}
+\lucidachar{246}{nand}
+\lucidachar{247}{nor}
+\lucidachar{248}{subsetdbl}
+\lucidachar{249}{supersetdbl}
+\lucidachar{250}{uniondbl}
+\lucidachar{251}{intersectiondbl}
+\lucidachar{252}{negeighteenthem}
+\lucidachar{253}{eighteenthem}
+\lucidachar{254}{eighthem}
+\lucidachar{255}{tenthem}
+
+\endencoding
diff --git a/fonts/utilities/mathinst/lu.par b/fonts/utilities/mathinst/lu.par
new file mode 100644
index 0000000000..9a3ffdcf40
--- /dev/null
+++ b/fonts/utilities/mathinst/lu.par
@@ -0,0 +1,87 @@
+#############################################################
+##
+## This is the file lu.par, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## A MathInst Lucida parameter file.
+
+## Some places...
+
+## traditional...
+$texroot_ = "/usr/lib/tex";
+$psfonts_ = "/psfonts";
+$afm_ = $psfonts_ . "/afm";
+$vf_ = $texroot_ . "/fonts/vf";
+$tfm_ = "$texroot_/fonts/tfm";
+$inputs_ = "$texroot_/inputs";
+$map_ = "$texroot_/ps";
+
+
+## TDS implementations...
+$texmf_ = "e:/texmf"; # or wherever
+$installer_ = "vfinst"; # or psnfss; what has installed the fonts?
+
+$encoding_ = "OT1"; # only OT1, ot1 are valid entries here
+
+## Some things...
+
+## These values for script and scriptscript sizes make
+## tiny math a bit more readable for scalable fonts.
+
+$ssize_ = 7.3;# for scalable fonts (for CMR, change to 7.0)
+$sssize_ = 5.5;# for scalable fonts (for CMR, change to 5.0)
+
+$tt_ = "cmtt10";
+$sansserif_ = "hlsr7t";
+$cal_ = "lbms"; # Lucida calligraphic
+$fraktur_ = "eufm10"; # fraktur font for math
+$bbold_ = "pmp6"; # b'board bold
+
+# No greek bold is appropriate for Lucida...
+
+## For TDS...
+
+$masup_ = "bh"; $matyp_ = "lumath"; # math fonts
+$ttsup_ = "public"; $tttyp_ = "cm"; # tt
+$sssup_ = "bh"; $sstyp_ = "lucsans"; # sans serif
+$casup_ = "bh"; $catyp_ = "lumath"; # Lucida
+$frsup_ = "ams"; $frtyp_ = "euler"; # fraktur
+$bbsup_ = "adobe"; $bbtyp_ = "pmp6"; # b'board bold
+$gbsup_ = "ams"; $gbtyp_ = "euler"; # Greek bold
+
+## Scale factors. Normally, MathInst calculates the scale factors
+## for itself, under the assumption that the roman ($fontfam_) types
+## should be at their natural size so that all other fonts are scaled to
+## fit. Form most fonts, `scaling to fit' means making sure that the
+## x-heights match. For the calligrpahic fonts, the capheights shall match.
+## However, in case any of the following scale factors (SF) are defined,
+## then MathInst will use the user defined value. In case the SF's are
+## defined and set to zero, then the font is used at the natural size.
+
+## $mathSF_ = # for Math fonts
+## $ttSF_ = # for typewriter font
+## $saSF_ = 00; # for sans serif fonts
+$caSF_ = 900; # for calligraphic font
+## $frSF_ = # for fraktur font
+$bbSF_ = 1000; # for blackboard bold
+## $gbSF_ # for uppercase Greek bold letters
+
+## SYSTEM PARAMETERS
+
+## Uncomment one group as appropriate...
+
+## For UNIX and Unix-like systems...
+
+$sep = "/"; # Path separator for Unix
+$mv = "mv"; # Unix move command
+$cp="cp"; # Unix copy command
+
+## For DOS, WIN-NT, and so on...
+
+#$sep = "\\"; # Path separator for DOS
+#$mv = "call domove"; # DOS move command
+#$cp="copy"; # DOS copy command
+
diff --git a/fonts/utilities/mathinst/lu_ihax.mtx b/fonts/utilities/mathinst/lu_ihax.mtx
new file mode 100644
index 0000000000..f020362cf7
--- /dev/null
+++ b/fonts/utilities/mathinst/lu_ihax.mtx
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lu_ihax.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+\shiftglyph{C}{-50}{0}{-25}
+\shiftglyph{E}{0}{50}{0}
+\shiftglyph{F}{0}{50}{-100}
+\shiftglyph{H}{0}{25}{-25}
+\shiftglyph{I}{0}{0}{-25}
+\shiftglyph{K}{0}{0}{-25}
+\shiftglyph{J}{0}{0}{-25}
+\shiftglyph{N}{0}{0}{-25}
+\shiftglyph{P}{0}{0}{-100}
+\shiftglyph{T}{0}{50}{-75}
+\shiftglyph{U}{-50}{50}{-25}
+\shiftglyph{V}{-50}{50}{-50}
+\shiftglyph{W}{-50}{50}{-50}
+\shiftglyph{X}{0}{50}{-25}
+\shiftglyph{Y}{-50}{50}{-50}
+\shiftglyph{b}{0}{-25}{0}
+\shiftglyph{d}{0}{25}{0}
+\shiftglyph{f}{\scale{\depth{f}}{750}}{0}{25}
+\shiftglyph{g}{0}{-50}{0}
+\shiftglyph{j}{150}{25}{0}
+\shiftglyph{l}{0}{50}{0}
+\shiftglyph{o}{0}{-50}{0}
+\shiftglyph{p}{75}{-25}{0}
+\shiftglyph{t}{-25}{50}{0}
+\shiftglyph{Upsilon}{0}{0}{-50}
+\shiftglyph{Upsilon}{0}{0}{-100}
+\shiftglyph{weierstrass}{-100}{-200}{-150}
+
+\unfakable{rho1}
+
+\ifisglyph{omega1}\then
+ \setglyph{pi1}
+ \glyph{omega1}{1000}
+ \endsetglyph
+\fi
+
+\ifisglyph{epsilon}\then
+ \setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+ \endsetglyph
+\fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\div{\width{tie}}{2}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+\ifisglyph{vector}\then
+ \resetglyph{vector}
+ \moveup{1}
+ \glyph{vector}{1000}
+ \moveup{-1}
+ \endresetglyph
+\fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/lu_iskew.mtx b/fonts/utilities/mathinst/lu_iskew.mtx
new file mode 100644
index 0000000000..380ac58918
--- /dev/null
+++ b/fonts/utilities/mathinst/lu_iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file lu_iskew.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+\skewkern{A}{75}
+\skewkern{B}{100}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{100}
+\skewkern{J}{200}
+\skewkern{K}{75}
+\skewkern{M}{100}
+\skewkern{N}{25}
+\skewkern{O}{100}
+\skewkern{P}{100}
+\skewkern{Q}{100}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{X}{50}
+\skewkern{Z}{50}
+\skewkern{a}{75}
+\skewkern{c}{75}
+\skewkern{d}{200}
+\skewkern{e}{75}
+\skewkern{f}{100}
+\skewkern{g}{75}
+\skewkern{i}{75}
+\skewkern{j}{150}
+\skewkern{l}{100}
+\skewkern{m}{50}
+\skewkern{n}{50}
+\skewkern{o}{75}
+\skewkern{p}{100}
+\skewkern{q}{75}
+\skewkern{r}{50}
+\skewkern{s}{100}
+\skewkern{t}{50}
+\skewkern{u}{75}
+\skewkern{v}{75}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{75}
+\skewkern{z}{50}
+\skewkern{dotlessi}{50}
+\skewkern{dotlessj}{50}
+\skewkern{upsilon}{25}
+\skewkern{iota}{-50}
+\skewkern{lambda}{-75}
+\skewkern{weierstrass}{175}
+\skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/ma.par b/fonts/utilities/mathinst/ma.par
new file mode 100644
index 0000000000..ccf68162f2
--- /dev/null
+++ b/fonts/utilities/mathinst/ma.par
@@ -0,0 +1,87 @@
+#############################################################
+##
+## This is the file ma.par, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## A MathInst Mathematica parameter file.
+
+## Some places...
+
+## traditional...
+$texroot_ = "/usr/lib/tex";
+$psfonts_ = "/psfonts";
+$afm_ = $psfonts_ . "/afm";
+$vf_ = $texroot_ . "/fonts/vf";
+$tfm_ = $texroot_ . "/fonts/tfm";
+$inputs_ = "$texroot_/inputs";
+$map_ = "$texroot_/ps";
+
+## TDS implementations...
+$texmf_ = "e:/texmf"; # or wherever
+$installer_ = "vfinst"; # or psnfss; what has installed the fonts?
+
+$encoding_ = "OT1"; # only OT1, ot1 are valid entries here
+
+## Some things...
+
+## These values for script and scriptscript sizes make
+## tiny math a bit more readable for scalable fonts.
+
+$ssize_ = 7.3;# for scalable fonts (for CMR, change to 7.0)
+$sssize_ = 5.5;# for scalable fonts (for CMR, change to 5.0)
+
+
+## Here define the names of a Times Roman raw font from which
+## the digits can be plucked. (The idea is that we want to use
+## Times Roman digits inside math, since the digits from the
+## roman font may be too idiosyncratic, as in Baskerville.) If
+## this variable is undefined (commented out), MathInst will simply
+## use the standard digits from the Roman font.
+
+## $times_ = "ptmr0"; # this is Times-Roman, the resident Times font
+
+$tt_ = "cmtt10";
+$sansserif_ = "hlsr7t";
+$cal_ = "cmsy10"; # good ol' Computer Modern!
+$fraktur_ = "mmafra"; # fraktur font for math
+$bbold_ = "mmabbo"; # b'board bold
+$greekbold_ = "mmagrb"; # a font with bold Greek uppercase letters
+
+## For TDS...
+
+$masup_ = "wri"; $matyp_ = "mathemat"; # math fonts
+$ttsup_ = "public"; $tttyp_ = "cm"; # tt
+$sssup_ = "bh"; $sstyp_ = "lucsans"; # sans serif
+$casup_ = "public"; $catyp_ = "cm"; # CM calligraphics
+$frsup_ = "wri"; $frtyp_ = "mathemat"; # fraktur
+$bbsup_ = "wri"; $bbtyp_ = "mathemat"; # blackboard bold
+$gbsup_ = "wri"; $gbtyp_ = "mathemat"; # Greek Bold
+
+## Scale factors. Normally, MathInst calculates the scale factors
+## for itself, under the assumption that the roman ($fontfam_) types
+## should be at their natural size so that all other fonts are scaled to
+## fit. Form most fonts, `scaling to fit' means making sure that the
+## x-heights match. For the calligrpahic fonts, the capheights shall match.
+## However, in case any of the following scale factors (SF) are defined,
+## then MathInst will use the user defined value. In case the SF's are
+## defined and set to zero, then the font is used at the natural size.
+
+## $mathSF_ = # for math fonts
+## $ttSF_ = # for typewriter font
+## $saSF_ = 00; # for sans serif fonts
+$caSF_ = 1000; # for calligraphic font
+## $frSF_ = # for fraktur font
+## $bboldSF_ = # for blackboard bold
+## $gbSF_ # for uppercase Greek bold letters
+
+## SYSTEM PARAMETERS
+
+$sep = "/"; # Path separator for Unix
+#$sep = "\\"; # Path separator for DOS
+
+$mv = "mv"; # Unix move command
+#$mv = "call domove"; # DOS move command
+1;
diff --git a/fonts/utilities/mathinst/ma_ihax.mtx b/fonts/utilities/mathinst/ma_ihax.mtx
new file mode 100644
index 0000000000..15072c8e0e
--- /dev/null
+++ b/fonts/utilities/mathinst/ma_ihax.mtx
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma_ihax.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+\shiftglyph{C}{-50}{0}{-25}
+\shiftglyph{E}{0}{50}{0}
+\shiftglyph{F}{0}{50}{-100}
+\shiftglyph{H}{0}{25}{-25}
+\shiftglyph{I}{0}{0}{-25}
+\shiftglyph{K}{0}{0}{-25}
+\shiftglyph{J}{0}{0}{-25}
+\shiftglyph{N}{0}{0}{-25}
+\shiftglyph{P}{0}{0}{-100}
+\shiftglyph{T}{0}{50}{-75}
+\shiftglyph{U}{-50}{50}{-25}
+\shiftglyph{V}{-50}{50}{-50}
+\shiftglyph{W}{-50}{50}{-50}
+\shiftglyph{X}{0}{50}{-25}
+\shiftglyph{Y}{-50}{50}{-50}
+\shiftglyph{b}{0}{-25}{0}
+\shiftglyph{d}{0}{25}{0}
+\shiftglyph{f}{\scale{\depth{f}}{750}}{0}{25}
+\shiftglyph{g}{0}{-50}{0}
+\shiftglyph{j}{150}{25}{0}
+\shiftglyph{l}{0}{50}{0}
+\shiftglyph{o}{0}{-50}{0}
+\shiftglyph{p}{75}{-25}{0}
+\shiftglyph{t}{-25}{50}{0}
+\shiftglyph{Upsilon}{0}{0}{-50}
+\shiftglyph{Upsilon}{0}{0}{-100}
+\shiftglyph{weierstrass}{-100}{-200}{-150}
+
+\unfakable{rho1}
+
+\ifisglyph{omega1}\then
+ \setglyph{pi1}
+ \glyph{omega1}{1000}
+ \endsetglyph
+\fi
+
+\ifisglyph{epsilon}\then
+ \setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+ \endsetglyph
+\fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\div{\width{tie}}{2}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+\ifisglyph{vector}\then
+ \resetglyph{vector}
+ \moveup{1}
+ \glyph{vector}{1000}
+ \moveup{-1}
+ \endresetglyph
+\fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/ma_iskew.mtx b/fonts/utilities/mathinst/ma_iskew.mtx
new file mode 100644
index 0000000000..70f45cdf2c
--- /dev/null
+++ b/fonts/utilities/mathinst/ma_iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma_iskew.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+\skewkern{A}{75}
+\skewkern{B}{100}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{100}
+\skewkern{J}{200}
+\skewkern{K}{75}
+\skewkern{M}{100}
+\skewkern{N}{25}
+\skewkern{O}{100}
+\skewkern{P}{100}
+\skewkern{Q}{100}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{X}{50}
+\skewkern{Z}{50}
+\skewkern{a}{75}
+\skewkern{c}{75}
+\skewkern{d}{200}
+\skewkern{e}{75}
+\skewkern{f}{140}
+\skewkern{g}{75}
+\skewkern{i}{75}
+\skewkern{j}{150}
+\skewkern{l}{100}
+\skewkern{m}{50}
+\skewkern{n}{50}
+\skewkern{o}{75}
+\skewkern{p}{100}
+\skewkern{q}{75}
+\skewkern{r}{50}
+\skewkern{s}{100}
+\skewkern{t}{50}
+\skewkern{u}{75}
+\skewkern{v}{75}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{75}
+\skewkern{z}{50}
+\skewkern{dotlessi}{50}
+\skewkern{dotlessj}{50}
+\skewkern{upsilon}{25}
+\skewkern{iota}{-50}
+\skewkern{lambda}{-75}
+\skewkern{weierstrass}{175}
+\skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makegr.tex b/fonts/utilities/mathinst/makegr.tex
new file mode 100644
index 0000000000..8ba7d4546d
--- /dev/null
+++ b/fonts/utilities/mathinst/makegr.tex
@@ -0,0 +1,10 @@
+%&plain
+
+\input fontinst.sty
+
+\installfonts
+ \installfamily{OT1}{mntk}{}
+ \installfont{mntbk7t}{mntb8k,greek}{OT1}{OT1}{mntk}{m}{n}{}
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/mathinst/makemma/alphoff.mtx b/fonts/utilities/mathinst/makemma/alphoff.mtx
new file mode 100644
index 0000000000..ea3784b759
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/alphoff.mtx
@@ -0,0 +1,78 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file alphoff.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is file `alphoff.mtx', based on work by Aloysius G. Helminck.
+
+\relax
+
+This file unsets alphabets (U/c and l/c) and some parameters.
+
+\metrics
+
+\unsetint{xheight}
+\unsetint{ascender}
+\unsetint{descender}
+\unsetint{capheight}
+\unsetint{italicslant}
+
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/bbolds.mtx b/fonts/utilities/mathinst/makemma/bbolds.mtx
new file mode 100644
index 0000000000..32d7c90603
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/bbolds.mtx
@@ -0,0 +1,78 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bbolds.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames the Blackboard bold letters of the Mathematica font
+mma5 (Math5) into more acceptable names. It is a fontinst file.
+
+January 13, 1998. Alan Hoenig
+
+\metrics
+
+\setcommand\renameto#1#2{\ifisglyph{#2}\then
+ \resetglyph{#1saved}\glyph{#2}{1000}\endresetglyph %
+ \fi}
+
+%%The uppercase bb's occupy slots 192-217; lowercase goes from 218-243.
+
+\renameto{A}{questiondown}
+\renameto{B}{exclamdown}
+\renameto{C}{logicalnot}
+\renameto{D}{radical}
+\renameto{E}{florin}
+\renameto{F}{approxequal}
+\renameto{G}{Delta}
+\renameto{H}{guillemotleft}
+\renameto{I}{guillemotright}
+\renameto{J}{ellipsis}
+\renameto{K}{nbspace}
+\renameto{L}{Agrave}
+\renameto{M}{Atilde}
+\renameto{N}{Otilde}
+\renameto{O}{OE}
+\renameto{P}{oe}
+\renameto{Q}{endash}
+\renameto{R}{emdash}
+\renameto{S}{quotedblleft}
+\renameto{T}{quotedblright}
+\renameto{U}{quoteleft}
+\renameto{V}{quoteright}
+\renameto{W}{divide}
+\renameto{X}{lozenge}
+\renameto{Y}{ydieresis}
+\renameto{Z}{Ydieresis}
+\renameto{a}{fraction}
+\renameto{b}{currency}
+\renameto{c}{guilsinglleft}
+\renameto{d}{guilsinglright}
+\renameto{e}{fi}
+\renameto{f}{fl}
+\renameto{g}{daggerdbl}
+\renameto{h}{periodcentered}
+\renameto{i}{quotesinglbase}
+\renameto{j}{quotedblbase}
+\renameto{k}{perthousand}
+\renameto{l}{Acircumflex}
+\renameto{m}{Ecircumflex}
+\renameto{n}{Aacute}
+\renameto{o}{Edieresis}
+\renameto{p}{Egrave}
+\renameto{q}{Iacute}
+\renameto{r}{Icircumflex}
+\renameto{s}{Idieresis}
+\renameto{t}{Igrave}
+\renameto{u}{Oacute}
+\renameto{v}{Ocircumflex}
+\renameto{w}{apple}
+\renameto{x}{Ograve}
+\renameto{y}{Uacute}
+\renameto{z}{Ucircumflex}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/cmmi10.pl b/fonts/utilities/mathinst/makemma/cmmi10.pl
new file mode 100644
index 0000000000..19e9e239c5
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/cmmi10.pl
@@ -0,0 +1,1133 @@
+(FAMILY CMMI)
+(FACE O 352)
+(CODINGSCHEME TEX MATH ITALIC)
+(DESIGNSIZE R 10.0)
+(COMMENT DESIGNSIZE IS IN POINTS)
+(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)
+(CHECKSUM O 1350061076)
+(FONTDIMEN
+ (SLANT R 0.25)
+ (SPACE R 0.0)
+ (STRETCH R 0.0)
+ (SHRINK R 0.0)
+ (XHEIGHT R 0.430555)
+ (QUAD R 1.000003)
+ )
+(LIGTABLE
+ (LABEL C h)
+ (KRN O 177 R -0.027779)
+ (STOP)
+ (LABEL O 27)
+ (LABEL O 34)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (LABEL O 13)
+ (LABEL O 26)
+ (LABEL O 35)
+ (LABEL C L)
+ (LABEL C g)
+ (LABEL C u)
+ (LABEL C v)
+ (LABEL C x)
+ (LABEL O 173)
+ (KRN O 177 R 0.027779)
+ (STOP)
+ (LABEL C U)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 75 R -0.055555)
+ (KRN O 177 R 0.027779)
+ (STOP)
+ (LABEL O 11)
+ (LABEL C K)
+ (KRN O 75 R -0.055555)
+ (LABEL O 16)
+ (LABEL C r)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (LABEL O 17)
+ (LABEL O 21)
+ (LABEL O 23)
+ (LABEL O 37)
+ (LABEL C D)
+ (LABEL C c)
+ (LABEL C e)
+ (LABEL C o)
+ (LABEL C s)
+ (LABEL C y)
+ (LABEL C z)
+ (KRN O 177 R 0.055557)
+ (STOP)
+ (LABEL O 7)
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.055557)
+ (STOP)
+ (LABEL O 5)
+ (LABEL C H)
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ (STOP)
+ (LABEL C N)
+ (LABEL C X)
+ (KRN O 75 R -0.083334)
+ (LABEL C C)
+ (LABEL C T)
+ (KRN O 75 R -0.027779)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (LABEL O 2)
+ (LABEL O 4)
+ (LABEL O 6)
+ (LABEL O 10)
+ (LABEL O 12)
+ (LABEL O 14)
+ (LABEL O 20)
+ (LABEL O 22)
+ (LABEL O 32)
+ (LABEL O 36)
+ (LABEL O 42)
+ (LABEL O 43)
+ (LABEL O 45)
+ (LABEL O 46)
+ (LABEL O 47)
+ (LABEL O 100)
+ (LABEL C B)
+ (LABEL C E)
+ (LABEL C G)
+ (LABEL C O)
+ (LABEL C Q)
+ (LABEL C R)
+ (LABEL C l)
+ (LABEL C p)
+ (LABEL C q)
+ (LABEL C t)
+ (LABEL C w)
+ (LABEL O 174)
+ (KRN O 177 R 0.083336)
+ (STOP)
+ (LABEL C M)
+ (LABEL C S)
+ (LABEL C Z)
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ (STOP)
+ (LABEL O 0)
+ (LABEL C F)
+ (LABEL C P)
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.083336)
+ (STOP)
+ (LABEL O 30)
+ (LABEL O 40)
+ (LABEL C I)
+ (LABEL O 140)
+ (LABEL O 175)
+ (KRN O 177 R 0.1111145)
+ (STOP)
+ (LABEL C A)
+ (KRN O 177 R 0.138893)
+ (STOP)
+ (LABEL C d)
+ (KRN C Y R 0.055555)
+ (KRN C Z R -0.055555)
+ (KRN C j R -0.111112)
+ (KRN C f R -0.166667)
+ (LABEL O 1)
+ (LABEL O 3)
+ (KRN O 177 R 0.166672)
+ (STOP)
+ (LABEL C f)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.166672)
+ (STOP)
+ (LABEL C J)
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.166672)
+ (STOP)
+ (LABEL O 33)
+ (LABEL C j)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (STOP)
+ (LABEL C V)
+ (LABEL C W)
+ (LABEL C Y)
+ (KRN O 73 R -0.166667)
+ (KRN O 72 R -0.166667)
+ (KRN O 75 R -0.111112)
+ (STOP)
+ (LABEL O 75)
+ (KRN O 1 R -0.055555)
+ (KRN C A R -0.055555)
+ (KRN C M R -0.055555)
+ (KRN C N R -0.055555)
+ (KRN C Y R 0.055555)
+ (KRN C Z R -0.055555)
+ (STOP)
+ )
+(CHARACTER O 0
+ (CHARWD R 0.615278)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 1
+ (CHARWD R 0.833336)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.166672)
+ )
+ )
+(CHARACTER O 2
+ (CHARWD R 0.762776)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.027779)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 3
+ (CHARWD R 0.694446)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.166672)
+ )
+ )
+(CHARACTER O 4
+ (CHARWD R 0.742363)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.075694)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 5
+ (CHARWD R 0.831251)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.081248)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 6
+ (CHARWD R 0.779863)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.057638)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 7
+ (CHARWD R 0.583333)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 10
+ (CHARWD R 0.666667)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 11
+ (CHARWD R 0.612223)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.110001)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 12
+ (CHARWD R 0.772398)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.050173)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 13
+ (CHARWD R 0.639702)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.003702)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 14
+ (CHARWD R 0.565626)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.052778)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 15
+ (CHARWD R 0.517731)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.055555)
+ )
+(CHARACTER O 16
+ (CHARWD R 0.444445)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.037847)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 17
+ (CHARWD R 0.405904)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 20
+ (CHARWD R 0.437502)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.073784)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 21
+ (CHARWD R 0.4965315)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 22
+ (CHARWD R 0.469444)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.027779)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 23
+ (CHARWD R 0.353937)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 24
+ (CHARWD R 0.5761595)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER O 25
+ (CHARWD R 0.583336)
+ (CHARHT R 0.694445)
+ )
+(CHARACTER O 26
+ (CHARWD R 0.60255)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 27
+ (CHARWD R 0.493983)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.063658)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 30
+ (CHARWD R 0.437502)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.046007)
+ (COMMENT
+ (KRN O 177 R 0.1111145)
+ )
+ )
+(CHARACTER O 31
+ (CHARWD R 0.570027)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.035879)
+ )
+(CHARACTER O 32
+ (CHARWD R 0.517015)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 33
+ (CHARWD R 0.571414)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ )
+ )
+(CHARACTER O 34
+ (CHARWD R 0.437155)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.113195)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 35
+ (CHARWD R 0.54028)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 36
+ (CHARWD R 0.595835)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 37
+ (CHARWD R 0.625692)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 40
+ (CHARWD R 0.651392)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.1111145)
+ )
+ )
+(CHARACTER O 41
+ (CHARWD R 0.622455)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.035879)
+ )
+(CHARACTER O 42
+ (CHARWD R 0.466318)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 43
+ (CHARWD R 0.59144)
+ (CHARHT R 0.694445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 44
+ (CHARWD R 0.82813)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.027779)
+ )
+(CHARACTER O 45
+ (CHARWD R 0.517015)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 46
+ (CHARWD R 0.362848)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.097223)
+ (CHARIC R 0.07986)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 47
+ (CHARWD R 0.654167)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 50
+ (CHARWD R 1.000003)
+ (CHARHT R 0.366875)
+ (CHARDP R -0.133125)
+ )
+(CHARACTER O 51
+ (CHARWD R 1.000003)
+ (CHARHT R 0.366875)
+ (CHARDP R -0.133125)
+ )
+(CHARACTER O 52
+ (CHARWD R 1.000003)
+ (CHARHT R 0.366875)
+ (CHARDP R -0.133125)
+ )
+(CHARACTER O 53
+ (CHARWD R 1.000003)
+ (CHARHT R 0.366875)
+ (CHARDP R -0.133125)
+ )
+(CHARACTER O 54
+ (CHARWD R 0.277779)
+ (CHARHT R 0.463748)
+ (CHARDP R -0.036252)
+ )
+(CHARACTER O 55
+ (CHARWD R 0.277779)
+ (CHARHT R 0.463748)
+ (CHARDP R -0.036252)
+ )
+(CHARACTER O 56
+ (CHARWD R 0.500002)
+ (CHARHT R 0.465279)
+ (CHARDP R -0.034721)
+ )
+(CHARACTER O 57
+ (CHARWD R 0.500002)
+ (CHARHT R 0.465279)
+ (CHARDP R -0.034721)
+ )
+(CHARACTER C 0
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C 1
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C 2
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C 3
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER C 4
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER C 5
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER C 6
+ (CHARWD R 0.500002)
+ (CHARHT R 0.644444)
+ )
+(CHARACTER C 7
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER C 8
+ (CHARWD R 0.500002)
+ (CHARHT R 0.644444)
+ )
+(CHARACTER C 9
+ (CHARWD R 0.500002)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER O 72
+ (CHARWD R 0.277779)
+ (CHARHT R 0.105556)
+ )
+(CHARACTER O 73
+ (CHARWD R 0.277779)
+ (CHARHT R 0.105556)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER O 74
+ (CHARWD R 0.777781)
+ (CHARHT R 0.539098)
+ (CHARDP R 0.039098)
+ )
+(CHARACTER O 75
+ (CHARWD R 0.500002)
+ (CHARHT R 0.75)
+ (CHARDP R 0.25)
+ (COMMENT
+ (KRN O 1 R -0.055555)
+ (KRN C A R -0.055555)
+ (KRN C M R -0.055555)
+ (KRN C N R -0.055555)
+ (KRN C Y R 0.055555)
+ (KRN C Z R -0.055555)
+ )
+ )
+(CHARACTER O 76
+ (CHARWD R 0.777781)
+ (CHARHT R 0.539098)
+ (CHARDP R 0.039098)
+ )
+(CHARACTER O 77
+ (CHARWD R 0.500002)
+ (CHARHT R 0.465279)
+ (CHARDP R -0.034721)
+ )
+(CHARACTER O 100
+ (CHARWD R 0.530904)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.055555)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C A
+ (CHARWD R 0.750002)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.138893)
+ )
+ )
+(CHARACTER C B
+ (CHARWD R 0.75851)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.050173)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C C
+ (CHARWD R 0.714722)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.0715275)
+ (COMMENT
+ (KRN O 75 R -0.027779)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C D
+ (CHARWD R 0.827917)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.027779)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C E
+ (CHARWD R 0.738195)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.057638)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C F
+ (CHARWD R 0.643057)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C G
+ (CHARWD R 0.786249)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C H
+ (CHARWD R 0.831251)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.081248)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C I
+ (CHARWD R 0.439585)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.078471)
+ (COMMENT
+ (KRN O 177 R 0.1111145)
+ )
+ )
+(CHARACTER C J
+ (CHARWD R 0.554514)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.096181)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.166672)
+ )
+ )
+(CHARACTER C K
+ (CHARWD R 0.849307)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.0715275)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C L
+ (CHARWD R 0.680557)
+ (CHARHT R 0.683332)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C M
+ (CHARWD R 0.97014)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.109027)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C N
+ (CHARWD R 0.8034725)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.109027)
+ (COMMENT
+ (KRN O 75 R -0.083334)
+ (KRN O 75 R -0.027779)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C O
+ (CHARWD R 0.762776)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.027779)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C P
+ (CHARWD R 0.642014)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C Q
+ (CHARWD R 0.790555)
+ (CHARHT R 0.683332)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C R
+ (CHARWD R 0.75929)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.007726)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C S
+ (CHARWD R 0.613195)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.057638)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C T
+ (CHARWD R 0.584376)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 75 R -0.027779)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C U
+ (CHARWD R 0.682777)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.109027)
+ (COMMENT
+ (KRN O 73 R -0.111112)
+ (KRN O 72 R -0.111112)
+ (KRN O 75 R -0.055555)
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C V
+ (CHARWD R 0.583334)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.222223)
+ (COMMENT
+ (KRN O 73 R -0.166667)
+ (KRN O 72 R -0.166667)
+ (KRN O 75 R -0.111112)
+ )
+ )
+(CHARACTER C W
+ (CHARWD R 0.944446)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.13889)
+ (COMMENT
+ (KRN O 73 R -0.166667)
+ (KRN O 72 R -0.166667)
+ (KRN O 75 R -0.111112)
+ )
+ )
+(CHARACTER C X
+ (CHARWD R 0.828474)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.078471)
+ (COMMENT
+ (KRN O 75 R -0.083334)
+ (KRN O 75 R -0.027779)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C Y
+ (CHARWD R 0.580557)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.222223)
+ (COMMENT
+ (KRN O 73 R -0.166667)
+ (KRN O 72 R -0.166667)
+ (KRN O 75 R -0.111112)
+ )
+ )
+(CHARACTER C Z
+ (CHARWD R 0.68264)
+ (CHARHT R 0.683332)
+ (CHARIC R 0.0715275)
+ (COMMENT
+ (KRN O 75 R -0.055555)
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 133
+ (CHARWD R 0.38889)
+ (CHARHT R 0.75)
+ )
+(CHARACTER O 134
+ (CHARWD R 0.38889)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER O 135
+ (CHARWD R 0.38889)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ )
+(CHARACTER O 136
+ (CHARWD R 1.000003)
+ (CHARHT R 0.35764)
+ (CHARDP R -0.14236)
+ )
+(CHARACTER O 137
+ (CHARWD R 1.000003)
+ (CHARHT R 0.35764)
+ (CHARDP R -0.14236)
+ )
+(CHARACTER O 140
+ (CHARWD R 0.41667)
+ (CHARHT R 0.694445)
+ (COMMENT
+ (KRN O 177 R 0.1111145)
+ )
+ )
+(CHARACTER C a
+ (CHARWD R 0.52859)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C b
+ (CHARWD R 0.429167)
+ (CHARHT R 0.694445)
+ )
+(CHARACTER C c
+ (CHARWD R 0.432756)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C d
+ (CHARWD R 0.520488)
+ (CHARHT R 0.694445)
+ (COMMENT
+ (KRN C Y R 0.055555)
+ (KRN C Z R -0.055555)
+ (KRN C j R -0.111112)
+ (KRN C f R -0.166667)
+ (KRN O 177 R 0.166672)
+ )
+ )
+(CHARACTER C e
+ (CHARWD R 0.465627)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C f
+ (CHARWD R 0.489586)
+ (CHARHT R 0.694445)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.10764)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.166672)
+ )
+ )
+(CHARACTER C g
+ (CHARWD R 0.476969)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C h
+ (CHARWD R 0.5761595)
+ (CHARHT R 0.694445)
+ (COMMENT
+ (KRN O 177 R -0.027779)
+ )
+ )
+(CHARACTER C i
+ (CHARWD R 0.344513)
+ (CHARHT R 0.659525)
+ )
+(CHARACTER C j
+ (CHARWD R 0.411807)
+ (CHARHT R 0.659525)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.057243)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ )
+ )
+(CHARACTER C k
+ (CHARWD R 0.520604)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.031481)
+ )
+(CHARACTER C l
+ (CHARWD R 0.29838)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.019678)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C m
+ (CHARWD R 0.878014)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C n
+ (CHARWD R 0.600235)
+ (CHARHT R 0.430555)
+ )
+(CHARACTER C o
+ (CHARWD R 0.484723)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C p
+ (CHARWD R 0.503126)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C q
+ (CHARWD R 0.446414)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C r
+ (CHARWD R 0.4511595)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.027779)
+ (COMMENT
+ (KRN O 73 R -0.055555)
+ (KRN O 72 R -0.055555)
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C s
+ (CHARWD R 0.46875)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C t
+ (CHARWD R 0.361113)
+ (CHARHT R 0.61508)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C u
+ (CHARWD R 0.572458)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C v
+ (CHARWD R 0.484724)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C w
+ (CHARWD R 0.715918)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.026909)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER C x
+ (CHARWD R 0.571528)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER C y
+ (CHARWD R 0.490282)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (CHARIC R 0.035879)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER C z
+ (CHARWD R 0.46505)
+ (CHARHT R 0.430555)
+ (CHARIC R 0.043981)
+ (COMMENT
+ (KRN O 177 R 0.055557)
+ )
+ )
+(CHARACTER O 173
+ (CHARWD R 0.322456)
+ (CHARHT R 0.430555)
+ (COMMENT
+ (KRN O 177 R 0.027779)
+ )
+ )
+(CHARACTER O 174
+ (CHARWD R 0.38403)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.083336)
+ )
+ )
+(CHARACTER O 175
+ (CHARWD R 0.636459)
+ (CHARHT R 0.430555)
+ (CHARDP R 0.194445)
+ (COMMENT
+ (KRN O 177 R 0.1111145)
+ )
+ )
+(CHARACTER O 176
+ (CHARWD R 0.500002)
+ (CHARHT R 0.714444)
+ (CHARIC R 0.153819)
+ )
+(CHARACTER O 177
+ (CHARWD R 0.277779)
+ (CHARHT R 0.694445)
+ (CHARIC R 0.399462)
+ )
diff --git a/fonts/utilities/mathinst/makemma/fraks.mtx b/fonts/utilities/mathinst/makemma/fraks.mtx
new file mode 100644
index 0000000000..ccb35e6911
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/fraks.mtx
@@ -0,0 +1,79 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file fraks.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames the fraktur letters of the Mathematica font
+mma5 (Math5) into more acceptable names. It is a fontinst file.
+
+January 13, 1998. Alan Hoenig
+
+\metrics
+
+\setcommand\renameto#1#2{\ifisglyph{#2}\then
+ \resetglyph{#1saved}\glyph{#2}{1000}\endresetglyph
+ \fi}
+
+%% The frakturs occupy positions 128-153 (A-Z) and
+%% 154-179 (a-z).
+
+\renameto{A}{Adieresis}
+\renameto{B}{Aring}
+\renameto{C}{Ccedilla}
+\renameto{D}{Eacute}
+\renameto{E}{Ntilde}
+\renameto{F}{Odieresis}
+\renameto{G}{Udieresis}
+\renameto{H}{aacute}
+\renameto{I}{agrave}
+\renameto{J}{acircumflex}
+\renameto{K}{adieresis}
+\renameto{L}{atilde}
+\renameto{M}{aring}
+\renameto{N}{ccedilla}
+\renameto{O}{eacute}
+\renameto{P}{egrave}
+\renameto{Q}{ecircumflex}
+\renameto{R}{edieresis}
+\renameto{S}{iacute}
+\renameto{T}{igrave}
+\renameto{U}{icircumflex}
+\renameto{V}{idieresis}
+\renameto{W}{ntilde}
+\renameto{X}{oacute}
+\renameto{Y}{ograve}
+\renameto{Z}{ocircumflex}
+\renameto{a}{odieresis}
+\renameto{b}{otilde}
+\renameto{c}{uacute}
+\renameto{d}{ugrave}
+\renameto{e}{ucircumflex}
+\renameto{f}{udieresis}
+\renameto{g}{dagger}
+\renameto{h}{degree}
+\renameto{i}{cent}
+\renameto{j}{sterling}
+\renameto{k}{section}
+\renameto{l}{bullet}
+\renameto{m}{paragraph}
+\renameto{n}{germandbls}
+\renameto{o}{registered}
+\renameto{p}{copyright}
+\renameto{q}{trademark}
+\renameto{r}{acute}
+\renameto{s}{dieresis}
+\renameto{t}{notequal}
+\renameto{u}{AE}
+\renameto{v}{Oslash}
+\renameto{w}{infinity}
+\renameto{x}{plusminus}
+\renameto{y}{lessequal}
+\renameto{z}{greaterequal}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/greekoff.mtx b/fonts/utilities/mathinst/makemma/greekoff.mtx
new file mode 100644
index 0000000000..65415abb4e
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/greekoff.mtx
@@ -0,0 +1,34 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file greekoff.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+Here we unset UC greek letters before picking them up properly from
+the true math italic font.
+
+\metrics
+
+\setcommand\Unsetglyph#1{%
+ \ifisglyph{#1}\then
+ \unsetglyph{#1}%
+ \fi}
+
+\Unsetglyph{Gamma}
+\Unsetglyph{Delta}
+\Unsetglyph{Theta}
+\Unsetglyph{Lambda}
+\Unsetglyph{Xi}
+\Unsetglyph{Pi}
+\Unsetglyph{Sigma}
+\Unsetglyph{Upsilon1}
+\Unsetglyph{Phi}
+\Unsetglyph{Psi}
+\Unsetglyph{Omega}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/kernoff.mtx b/fonts/utilities/mathinst/makemma/kernoff.mtx
new file mode 100644
index 0000000000..609809191e
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/kernoff.mtx
@@ -0,0 +1,17 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file kernoff.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\let\savesetkern=\setkern
+\resetcommand\setkern#1#2#3{}% turn off kerning
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/kernon.mtx b/fonts/utilities/mathinst/makemma/kernon.mtx
new file mode 100644
index 0000000000..7f956f6bbf
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/kernon.mtx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file kernon.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\let\setkern=\savesetkern
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/ma1ex.mtx b/fonts/utilities/mathinst/makemma/ma1ex.mtx
new file mode 100644
index 0000000000..8c198a030a
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma1ex.mtx
@@ -0,0 +1,51 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma1ex.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma1ex.mtx'; it selects and renames Mathematica glyphs in the Math1 font
+to those in a traditional math extension font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{Uacute}{integraltext}
+\renameas{ecircumflex}{integraldisplay}
+\renameas{iacute}{summationtext}
+\renameas{igrave}{summationdisplay}
+\renameas{icircumflex}{producttext}
+\renameas{idieresis}{productdisplay}
+\renameas{ntilde}{uniontext}
+\renameas{oacute}{uniondisplay}
+\renameas{ograve}{intersectiontext}
+\renameas{ocircumflex}{intersectiondisplay}
+\renameas{odieresis}{logicalortext}
+\renameas{otilde}{logicalordisplay}
+\renameas{uacute}{logicalandtext}
+\renameas{ugrave}{logicalanddisplay}
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/ma1mi.mtx b/fonts/utilities/mathinst/makemma/ma1mi.mtx
new file mode 100644
index 0000000000..3d8249f1e4
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma1mi.mtx
@@ -0,0 +1,87 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma1mi.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma1mi.mtx'; it selects and renames Mathematica glyphs in the Math1 font
+to those in a traditional math italic font.
+
+(We'll get the uppercase Greeks by slanting the Math1 font, but we
+can't do that ahead of time since we don't know the proper italic
+angle to use. Nevertheless, let's incorporate them into this font,
+and it will be *this* font that we later slant.)
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+ \save{slash}
+ \save{greater}
+ \save{less}
+ \renameandsave{D}{Delta}
+ \renameas{F}{Phi}
+ \renameas{G}{Gamma}
+ \renameas{J}{theta1}% vartheta
+ \renameas{L}{Lambda}
+ \renameas{P}{Pi}
+ \renameas{Q}{Theta}
+ \renameas{S}{Sigma}
+ \renameas{U}{Upsilon1}
+ \renameas{V}{sigma1}% final sigma
+ \renameas{X}{Xi}
+ \renameandsave{W}{Omega}
+ \renameas{Y}{Psi}
+ \renameas{a}{alpha}
+ \renameas{b}{beta}
+ \renameas{c}{chi}
+ \renameas{d}{delta}
+ \renameas{e}{epsilon1}
+ \renameas{f}{phi}
+ \renameas{g}{gamma}
+ \renameas{h}{eta}
+ \renameas{i}{iota}
+ \renameas{j}{phi1}% varphi
+ \renameas{k}{kappa}
+ \renameas{l}{lambda}
+ \renameandsave{m}{mu}
+ \renameas{n}{nu}
+ \renameas{o}{omicron}
+ \renameandsave{p}{pi}
+ \renameas{q}{theta}
+ \renameas{r}{rho}
+ \renameas{s}{sigma}
+ \renameas{t}{tau}
+ \renameas{u}{upsilon}
+ \renameas{v}{pi1}% varpi
+ \renameas{w}{omega}
+ \renameas{x}{xi}
+ \renameas{y}{psi}
+ \renameas{z}{zeta}
+ \save{partialdiff}
+ \renameas{radical}{weierstrass}
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/makemma/ma1mitt.mtx b/fonts/utilities/mathinst/makemma/ma1mitt.mtx
new file mode 100644
index 0000000000..e44d3c9c93
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma1mitt.mtx
@@ -0,0 +1,23 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma1mitt.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+\endsetglyph
+
+\setglyph{pi1}
+ \glyph{omega1}{1000}
+\endsetglyph
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/makemma/ma1sy.mtx b/fonts/utilities/mathinst/makemma/ma1sy.mtx
new file mode 100644
index 0000000000..5f21287d70
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma1sy.mtx
@@ -0,0 +1,95 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma1sy.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma1sy.mtx'; it selects and renames Mathematica glyphs in the Math1 font
+to those in a traditional math symbol font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\save{plusminus}
+\save{greaterequal}
+\save{braceleft}
+\save{braceright}
+
+\renameandsave{ydieresis}{logicalnot}
+\renameandsave{product}{divide}
+
+\renameas{hyphen}{minus}
+\renameandsave{dagger}{periodcentered}
+\renameas{yen}{multiply}
+\renameas{asterisk}{asteriskmath}
+\renameas{daggerdbl}{diamondmath}
+\renameas{approxequal}{circleplus}
+\renameas{florin}{circlemultiply}
+\renameas{integral}{equivalence}
+\renameas{Otilde}{reflexsubset}
+\renameas{nbspace}{reflexsuperset}
+\renameandsave{sterling}{lessequal}
+\renameas{asciitilde}{similar}
+\renameandsave{ordfeminine}{approxequal}
+\renameas{Atilde}{propersubset}
+\renameas{ellipsis}{propersuperset}
+\renameas{Udieresis}{lessmuch}
+\renameas{aacute}{greatermuch}
+\renameas{at}{similarequal}
+\renameas{guilsinglleft}{arrowdblleft}
+\renameas{fi}{arrowdblright}
+\renameas{guilsinglright}{arrowdblup}
+\renameas{fl}{arrowdbldown}
+\renameas{currency}{arrowdblboth}
+\renameas{mu}{proportional}
+\renameas{cent}{prime}
+\renameandsave{bullet}{infinity}
+\renameas{OE}{element}
+\renameas{dotaccent}{mapstochar}
+\renameas{quotedbl}{universal}
+\renameas{dollar}{existential}
+\renameas{Delta}{emptysetstress}
+\renameas{logicalnot}{Rfraktur}
+\renameas{exclamdown}{Ifraktur}
+\renameas{asciicircum}{perpendicular}
+\renameas{questiondown}{aleph}
+\renameas{Ydieresis}{logicaland}
+\renameas{fraction}{logicalor}
+\renameas{periodcentered}{angleleft}
+\renameas{Ograve}{angleright}
+\renameas{divide}{radicallow}
+\renameas{emdash}{gradient}
+\renameas{germandbls}{club}
+\renameas{registered}{diamond}
+\renameas{copyright}{heart}
+\renameas{trademark}{spade}
+\renameas{dieresis}{arrowleft}
+\renameas{AE}{arrowright}
+\renameas{notequal}{arrowup}
+\renameas{Oslash}{arrowdown}
+\renameas{acute}{arrowboth}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma2ex.mtx b/fonts/utilities/mathinst/makemma/ma2ex.mtx
new file mode 100644
index 0000000000..c2896cf8b3
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma2ex.mtx
@@ -0,0 +1,159 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma2ex.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma2ex.mtx'; it selects and renames Mathematica glyphs in the Math2 font
+to those in a traditional math extension font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+% parentheses
+
+\renameas{H}{parenleftbig}
+\renameas{I}{parenleftBig}
+\renameas{J}{parenleftbigg}
+\renameas{K}{parenleftBigg}
+\renameas{L}{parenrightbig}
+\renameas{M}{parenrightBig}
+\renameas{N}{parenrightbigg}
+\renameas{O}{parenrightBigg}
+
+% brackets
+
+\renameas{at}{bracketleftbig}
+\renameas{A}{bracketleftBig}
+\renameas{B}{bracketleftbigg}
+\renameas{C}{bracketleftBigg}
+\renameas{D}{bracketrightbig}
+\renameas{E}{bracketrightBig}
+\renameas{F}{bracketrightbigg}
+\renameas{G}{bracketrightBigg}
+
+% braces
+
+\renameas{eight}{braceleftbig}
+\renameas{nine}{braceleftBig}
+\renameas{colon}{braceleftbigg}
+\renameas{semicolon}{braceleftBigg}
+\renameas{less}{bracerightbig}
+\renameas{equal}{bracerightBig}
+\renameas{greater}{bracerightbigg}
+\renameas{question}{bracerightBigg}
+
+% angles
+
+\renameas{X}{angleleftbig}
+\renameas{Y}{angleleftBig}
+\renameas{Z}{angleleftbigg}
+\renameas{bracketleft}{angleleftBigg}
+\renameas{backslash}{anglerightbig}
+\renameas{bracketright}{anglerightBig}
+\renameas{asciicircum}{anglerightbigg}
+\renameas{underscore}{anglerightBigg}
+
+% ceiling/floor left
+
+\renameas{grave}{ceilingleftbig}
+\renameas{a}{ceilingleftBig}
+\renameas{b}{ceilingleftbigg}
+\renameas{c}{ceilingleftBigg}
+\renameas{d}{floorleftbig}
+\renameas{e}{floorleftBig}
+\renameas{f}{floorleftbigg}
+\renameas{g}{floorleftBigg}
+
+% ceiling/floor right
+
+\renameas{p}{ceilingrightbig}
+\renameas{q}{ceilingrightBig}
+\renameas{r}{ceilingrightbigg}
+\renameas{s}{ceilingrightBigg}
+\renameas{t}{floorrightbig}
+\renameas{u}{floorrightBig}
+\renameas{v}{floorrightbigg}
+\renameas{w}{floorrightBigg}
+
+% slashes and backslashes
+
+\renameas{ecircumflex}{slashbig}
+\renameas{edieresis}{slashBig}
+\renameas{iacute}{slashbigg}
+\renameas{igrave}{slashBigg}
+\renameas{icircumflex}{backslashbig}
+\renameas{idieresis}{backslashBig}
+\renameas{ntilde}{backslashbigg}
+\renameas{oacute}{backslashBigg}
+
+% misc
+
+\renameas{florin}{barex}
+\renameas{approxequal}{bardblex}
+\renameas{i}{parenlefttp}
+\renameas{y}{parenrighttp}
+\renameas{Adieresis}{bracketlefttp}
+\renameas{Eacute}{bracketrighttp}
+\renameas{Ccedilla}{bracketleftbt}
+\renameas{Odieresis}{bracketrightbt}
+\renameas{Aring}{bracketleftex}
+\renameas{Ntilde}{bracketrightex}
+\renameas{l}{bracelefttp}
+\renameas{bar}{bracerighttp}
+\renameas{n}{braceleftbt}
+\renameas{asciitilde}{bracerightbt}
+\renameas{m}{braceleftmid}
+\renameas{braceright}{bracerightmid}
+\renameas{o}{braceex}
+\renameas{quoteleft}{arrowvertex}
+\renameas{k}{parenleftbt}
+\renameas{braceleft}{parenrightbt}
+\renameas{j}{parenleftex}
+\renameas{z}{parenrightex}
+\renameas{udieresis}{unionsqtext}
+\renameas{Oslash}{unionsqdisplay}
+\renameas{ograve}{contintegraltext}
+\renameas{registered}{contintegraldisplay}
+\renameas{ugrave}{unionmultitext}
+\renameas{notequal}{unionmultidisplay}
+\renameas{Ugrave}{tildewide}
+\renameas{dotlessi}{tildewider}
+\renameas{circumflex}{tildewiderr}
+\renameas{zero}{radicalbig}
+\renameas{one}{radicalBig}
+\renameas{two}{radicalbigg}
+\renameas{three}{radicalBigg}
+\renameas{four}{radicalbt}
+\renameas{five}{radicalvertex}
+\renameas{six}{radicaltp}
+\renameas{perthousand}{arrowdblvertex}
+\renameas{quoteright}{arrowtp}
+\renameas{divide}{arrowbt}
+\renameas{Acircumflex}{arrowdbltp}
+\renameas{Ecircumflex}{arrowdblbt}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma2sy.mtx b/fonts/utilities/mathinst/makemma/ma2sy.mtx
new file mode 100644
index 0000000000..4201f12c47
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma2sy.mtx
@@ -0,0 +1,48 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma2sy.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma2sy.mtx'; it selects and renames Mathematica glyphs in the Math2 font
+to those in a traditional math symbol font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{d}{floorleft}
+\renameas{t}{floorright}
+\renameas{grave}{ceilingleft}
+\renameas{p}{ceilingright}
+\renameandsave{ring}{bar}
+\renameas{cedilla}{bardbl}
+\renameas{lozenge}{arrowbothv}
+\renameas{Aacute}{arrowdblbothv}
+\renameandsave{icircumflex}{backslash}
+\renameas{fl}{coproduct}
+
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/ma3mi.mtx b/fonts/utilities/mathinst/makemma/ma3mi.mtx
new file mode 100644
index 0000000000..9fd1d91725
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma3mi.mtx
@@ -0,0 +1,47 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma3mi.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma3mi.mtx'; it selects and renames Mathematica glyphs in the Math3 font
+to those in a traditional math italic font.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{summation}{rho1}
+\renameas{at}{triangleright}
+\renameas{zero}{triangleleft}
+\renameas{macron}{star}
+\renameas{partialdiff}{epsilon}
+\renameas{Ydieresis}{flat}
+\renameas{fraction}{natural}
+\renameas{currency}{sharp}
+\renameandsave{quotedblright}{dotlessi}
+\renameas{quoteright}{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma3sy.mtx b/fonts/utilities/mathinst/makemma/ma3sy.mtx
new file mode 100644
index 0000000000..c6a9b5477f
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma3sy.mtx
@@ -0,0 +1,67 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma3sy.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma3sy.mtx'; it selects and renames Mathematica glyphs in the Math3 font
+to those in a traditional math symbol font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameandsave{exclam}{integral}
+\renameas{parenleft}{union}
+\renameas{quotesingle}{intersection}
+\renameas{parenright}{unionmulti}
+\renameas{asterisk}{intersectionsq}
+\renameas{plus}{unionsq}
+\renameas{asciicircum}{equivasymptotic}
+\renameas{m}{subsetsqequal}
+\renameas{braceright}{supersetsqequal}
+\renameas{Adieresis}{curlyless}
+\renameas{Aring}{precedesequal}
+\renameas{ecircumflex}{curlygreater}
+\renameas{edieresis}{followsequal}
+\renameas{degree}{minusplus}
+\renameas{cent}{turnstileleft}
+\renameas{section}{turnstileright}
+\renameas{registered}{latticetop}
+\renameas{trademark}{wreathproduct}
+\renameas{uacute}{owner}
+\renameas{ucircumflex}{circleminus}
+\renameas{udieresis}{circledot}
+\renameas{Egrave}{openbullet}
+\renameandsave{Edieresis}{bullet}
+\renameandsave{Otilde}{section}
+\renameandsave{OE}{paragraph}
+\renameandsave{divide}{dagger}
+\renameandsave{lozenge}{daggerdbl}
+\renameas{Ucircumflex}{triangle}
+\renameas{dotlessi}{triangleinv}
+
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/ma4ex.mtx b/fonts/utilities/mathinst/makemma/ma4ex.mtx
new file mode 100644
index 0000000000..a330f639cd
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma4ex.mtx
@@ -0,0 +1,44 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma4ex.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma2ex.mtx'; it selects and renames Mathematica glyphs in the Math2 font
+to those in a traditional math extension font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{infinity}{hatwide}
+\renameas{plusminus}{hatwider}
+\renameas{lessequal}{hatwiderr}
+\renameas{icircumflex}{bracehtipdownleft}
+\renameas{ntilde}{bracehtipdownright}
+\renameas{section}{bracehtipupleft}
+\renameas{paragraph}{bracehtipupright}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma4mi.mtx b/fonts/utilities/mathinst/makemma/ma4mi.mtx
new file mode 100644
index 0000000000..7813e2bbfc
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma4mi.mtx
@@ -0,0 +1,37 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma4mi.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma4mi.mtx'; it selects and renames Mathematica glyphs in the Math4 font
+to those in a traditional math italic font.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{zero}{harpoonleftup}
+\renameas{three}{harpoonleftdown}
+\renameas{one}{harpoonrightup}
+\renameas{four}{harpoonrightdown}
+\renameas{ydieresis}{hookrightchar}
+\renameas{lozenge}{hookleftchar}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma4sy.mtx b/fonts/utilities/mathinst/makemma/ma4sy.mtx
new file mode 100644
index 0000000000..bde5157834
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma4sy.mtx
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma4sy.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma1sy.mtx'; it selects and renames Mathematica glyphs in the Math1 font
+to those in a traditional math symbol font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{acircumflex}{arrownortheast}
+\renameas{adieresis}{arrowsoutheast}
+\renameas{agrave}{arrownorthwest}
+\renameas{aacute}{arrowsouthwest}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma5mi.mtx b/fonts/utilities/mathinst/makemma/ma5mi.mtx
new file mode 100644
index 0000000000..c6effde64e
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma5mi.mtx
@@ -0,0 +1,32 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma5mi.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma4mi.mtx'; it selects and renames Mathematica glyphs in the Math4 font
+to those in a traditional math italic font.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\renameas{l}{lscript}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/ma5sy.mtx b/fonts/utilities/mathinst/makemma/ma5sy.mtx
new file mode 100644
index 0000000000..df3da192d9
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/ma5sy.mtx
@@ -0,0 +1,63 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ma5sy.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file renames glyphs to a more standard name. This is file
+`ma3sy.mtx'; it selects and renames Mathematica glyphs in the Math3 font
+to those in a traditional math symbol font layout.
+
+\metrics
+
+\setcommand\renameas#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+
+%% Some glyphs are, by chance, properly named. We need to save them,
+%% and not unset them when we cancel the Adobe encoding.
+
+\setcommand\renameandsave#1#2{\ifisglyph{#1}\then
+ \setglyph{#2saved}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+\fi}
+\setcommand\save#1{\renameas{#1}{#1saved}}
+
+\save{A}
+\save{B}
+\save{C}
+\save{D}
+\save{E}
+\save{F}
+\save{G}
+\save{H}
+\save{I}
+\save{J}
+\save{K}
+\save{L}
+\save{M}
+\save{N}
+\save{O}
+\save{P}
+\save{Q}
+\save{R}
+\save{S}
+\save{T}
+\save{U}
+\save{V}
+\save{W}
+\save{X}
+\save{Y}
+\save{Z}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/makemapl.bat b/fonts/utilities/mathinst/makemma/makemapl.bat
new file mode 100644
index 0000000000..93d306f2e3
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/makemapl.bat
@@ -0,0 +1,20 @@
+tftopl mma1.tfm mma1.p
+tftopl mma2.tfm mma2.pl
+tftopl mma3.tfm mma3.pl
+tftopl mma4.tfm mma4.pl
+tftopl mma5.tfm mma5.pl
+tftopl mma1b.tfm mma1b.pl
+tftopl mma2b.tfm mma2b.pl
+tftopl mma3b.tfm mma3b.pl
+tftopl mma4b.tfm mma4b.pl
+tftopl mma5b.tfm mma5b.pl
+tftopl mma1tt.tfm mma1tt.pl
+tftopl mma2tt.tfm mma2tt.pl
+tftopl mma3tt.tfm mma3tt.pl
+tftopl mma4tt.tfm mma4tt.pl
+tftopl mma5tt.tfm mma5tt.pl
+tftopl mma1ttb.tfm mma1ttb.pl
+tftopl mma2ttb.tfm mma2ttb.pl
+tftopl mma3ttb.tfm mma3ttb.pl
+tftopl mma4ttb.tfm mma4ttb.pl
+tftopl mma5ttb.tfm mma5ttb.pl \ No newline at end of file
diff --git a/fonts/utilities/mathinst/makemma/makemma.tex b/fonts/utilities/mathinst/makemma/makemma.tex
new file mode 100644
index 0000000000..bf96f63daf
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/makemma.tex
@@ -0,0 +1,121 @@
+%&plain
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file makemma.tex, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\nopagenumbers
+
+\input fontinst.sty
+
+%% This script makes math fonts in two families---regular Mathematica
+%% and Mathematica tt. In each family, there are two series, regular and
+%% bold.
+%%
+%% The fonts so constructed shall serve as raw fonts for other math font
+%% families. Some limited succcess typesetting math can be obtained with
+%% these fonts, but note: the math italic fonts contain neither small cap
+%% fonts nor upper- and lowercase letters. Also the calligraphic
+%% capitals have been stripped out of the symbol fonts. (The Mathematica
+%% calligraphic alphabet is not well done, at least on the provisional
+%% fonts I was given. They don't even have the same cap heights!)
+%% Finally, the uppercase Greek letters in the math italic have not been
+%% slanted,s ince we do not yet know the slant of the text italic fonts.
+%% (This slanting will need to be done at virtual font time.)
+%%
+%% In order to create an oblique font from which to pluck slanted uppercase
+%% Greek letters, a stripped down mmamio (math italic oblique) has
+%% been created. We never use it for any direct typesetting, though.
+%%
+%% This script finished up on January 13, 1998, Alan Hoenig author.
+
+\transformfont{mma1o}{\slantfont{167}{\fromafm{mma1}}}
+\transformfont{mma2o}{\slantfont{167}{\fromafm{mma2}}}
+\transformfont{mma3o}{\slantfont{167}{\fromafm{mma3}}}
+\transformfont{mma4o}{\slantfont{167}{\fromafm{mma4}}}
+\transformfont{mma5o}{\slantfont{167}{\fromafm{mma5}}}
+
+
+\installfonts
+ \gdef\fontweight{}\gdef\fontvar{} % let's do regular fonts...
+ \installfamily{OML}{mma}{}
+ \installfamily{OMS}{mma}{}
+ \installfamily{OMX}{mma}{}
+ \installfont{mmami\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1mi\fontvar,unadobe,mma3\fontvar\fontweight,ma3mi,unadobe,%
+ mma4\fontvar\fontweight,ma4mi,unadobe,mma5\fontvar\fontweight,%
+ ma5mi,unadobe,unsave,kernoff,cmmi10,kernon,uncmmi}%
+ {OML}{OML}{mma}{m}{it}{}
+ \installfont{mmamio\fontvar\fontweight}{mma1o\fontvar\fontweight,%
+ ma1mi\fontvar,unadobe,mma3o\fontvar\fontweight,ma3mi,unadobe,%
+ %% mma4o\fontvar\fontweight,ma4mi,unadobe,mma5o\fontvar\fontweight,%
+ %% ma5mi,unadobe,
+ unsave,kernoff,cmmi10,kernon,uncmmi}%
+ {OML}{OML}{mma}{m}{ob}{}
+ \installfont{mmasy\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ negslash,ma1sy,unadobe,mma2\fontvar\fontweight,%
+ ma2sy,unadobe,mma3\fontvar\fontweight,ma3sy,unadobe,%
+ mma4\fontvar\fontweight,ma4sy,unadobe,mma5\fontvar\fontweight,%
+ ma5sy,unadobe,%
+ unsave,alphoff}{OMS}{OMS}{mma}{m}{n}{}
+ \installfont{mmaex\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1ex,unadobe,mma2\fontvar\fontweight,ma2ex,unadobe,%
+ mma4\fontvar\fontweight,ma4ex,unadobe}{OMX}{OMX}{mma}{m}{n}{}
+ \gdef\fontweight{b}\gdef\fontvar{} % let's do bold fonts...
+ \installfont{mmami\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1mi\fontvar,unadobe,mma3\fontvar\fontweight,ma3mi,unadobe,%
+ mma4\fontvar\fontweight,ma4mi,unadobe,mma5\fontvar\fontweight,%
+ ma5mi,unadobe,unsave,kernoff,cmmi10,kernon,uncmmi}%
+ {OML}{OML}{mma}{b}{it}{}
+ \installfont{mmasy\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ negslash,ma1sy,unadobe,mma2\fontvar\fontweight,%
+ ma2sy,unadobe,mma3\fontvar\fontweight,ma3sy,unadobe,%
+ mma4\fontvar\fontweight,ma4sy,unadobe,mma5\fontvar\fontweight,%
+ ma5sy,unadobe,%
+ unsave,alphoff}{OMS}{OMS}{mma}{b}{n}{}
+ \installfont{mmaex\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1ex,unadobe,mma2\fontvar\fontweight,ma2ex,unadobe,%
+ mma4\fontvar\fontweight,ma4ex,unadobe}{OMX}{OMX}{mma}{b}{n}{}
+ %% NOW FOR TT FONTS...
+ \gdef\fontweight{}\gdef\fontvar{tt} % let's do regular tt fonts...
+ \installfamily{OML}{mmatt}{}
+ \installfamily{OMS}{mmatt}{}
+ \installfamily{OMX}{mmatt}{}
+ \installfont{mmami\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1mi\fontvar,unadobe,mma3\fontvar\fontweight,ma3mi,unadobe,%
+ mma4\fontvar\fontweight,ma4mi,unadobe,mma5\fontvar\fontweight,%
+ ma5mi,unadobe,unsave,kernoff,cmmi10,kernon,uncmmi}%
+ {OML}{OML}{mmatt}{m}{it}{}
+ \installfont{mmasy\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ negslash,ma1sy,unadobe,mma2\fontvar\fontweight,%
+ ma2sy,unadobe,mma3\fontvar\fontweight,ma3sy,unadobe,%
+ mma4\fontvar\fontweight,ma4sy,unadobe,mma5\fontvar\fontweight,%
+ ma5sy,unadobe,%
+ unsave,alphoff}{OMS}{OMS}{mmatt}{m}{n}{}
+ \installfont{mmaex\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1ex,unadobe,mma2\fontvar\fontweight,ma2ex,unadobe,%
+ mma4\fontvar\fontweight,ma4ex,unadobe}{OMX}{OMX}{mmatt}{m}{n}{}
+ \gdef\fontweight{b}\gdef\fontvar{tt} % let's do bold fonts...
+ \installfont{mmami\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1mi\fontvar,unadobe,mma3\fontvar\fontweight,ma3mi,unadobe,%
+ mma4\fontvar\fontweight,ma4mi,unadobe,mma5\fontvar\fontweight,%
+ ma5mi,unadobe,unsave,kernoff,cmmi10,kernon,uncmmi}%
+ {OML}{OML}{mmatt}{b}{it}{}
+ \installfont{mmasy\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ negslash,ma1sy,unadobe,mma2\fontvar\fontweight,%
+ ma2sy,unadobe,mma3\fontvar\fontweight,ma3sy,unadobe,%
+ mma4\fontvar\fontweight,ma4sy,unadobe,mma5\fontvar\fontweight,%
+ ma5sy,unadobe,%
+ unsave,alphoff}{OMS}{OMS}{mmatt}{b}{n}{}
+ \installfont{mmaex\fontvar\fontweight}{mma1\fontvar\fontweight,%
+ ma1ex,unadobe,mma2\fontvar\fontweight,ma2ex,unadobe,%
+ mma4\fontvar\fontweight,ma4ex,unadobe}{OMX}{OMX}{mmatt}{b}{n}{}
+\endinstallfonts
+
+\bye
+
diff --git a/fonts/utilities/mathinst/makemma/makemmas.tex b/fonts/utilities/mathinst/makemma/makemmas.tex
new file mode 100644
index 0000000000..25f0266df5
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/makemmas.tex
@@ -0,0 +1,38 @@
+%&plain
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file makemmas.tex, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\nopagenumbers
+
+%% This is a script to make some special fonts out of the Mathematica
+%% math fonts. We construct a calligraphic, a fraktur, blackboard bold,
+%% and a Greek bold. See the remarks about these fonts in the docs.
+
+\input fontinst.sty
+
+\installfonts
+ \installfamily{OT1}{mc} % calligraphic
+ \installfamily{OT1}{mf} % fraktur
+ \installfamily{OT1}{mb} % blackboard bold
+ \installfamily{OML}{mg} % Greek bold
+ %% Calligraphic font first...
+ \installfont{mmacal}{mma5}{OT1}{OT1}{mc}{m}{it}{}
+ %% Fraktur
+ \installfont{mmafra}{mma5,fraks,unsave}{OT1}{OT1}{mf}{m}{n}{}
+ %% Blackboard Bold
+ \installfont{mmabbo}{mma5,bbolds,unsave}{OT1}{OT1}{mb}{m}{n}{}
+ %% Greek bold
+ \installfont{mmagrb}{mma1b,ma1mi,unadobe,mma3b,ma3mi,unadobe,unsave}%
+ {OML}{OML}{mg}{m}{n}{}
+\endinstallfonts
+
+\bye
+
+
diff --git a/fonts/utilities/mathinst/makemma/negslash.mtx b/fonts/utilities/mathinst/makemma/negslash.mtx
new file mode 100644
index 0000000000..cbaef471d7
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/negslash.mtx
@@ -0,0 +1,29 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file negslash.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+Here we trivially construct the negationslash from the usual slash.
+We also construct a raised period.
+
+\metrics
+
+\setglyph{negationslash}
+ \push
+ \glyph{slash}{1000}
+ \pop
+\endsetglyph
+
+\resetglyph{periodcenteredsaved}
+ \moveup{250}
+ \glyph{period}{1000}
+\endresetglyph
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/makemma/psfonts.mma b/fonts/utilities/mathinst/makemma/psfonts.mma
new file mode 100644
index 0000000000..74402902ca
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/psfonts.mma
@@ -0,0 +1,25 @@
+mma1 Math1 </psfonts/mma1.pfa
+mma2 Math2 </psfonts/mma2.pfa
+mma3 Math3 </psfonts/mma3.pfa
+mma4 Math4 </psfonts/mma4.pfa
+mma5 Math5 </psfonts/mma5.pfa
+mma1o Math1 ".167 SlantFont"
+mma2o Math2 ".167 SlantFont"
+mma3o Math3 ".167 SlantFont"
+mma4o Math4 ".167 SlantFont"
+mma5o Math5 ".167 SlantFont"
+mma1b Math1-Bold </psfonts/mma1b.pfa
+mma2b Math2-Bold </psfonts/mma2b.pfa
+mma3b Math3-Bold </psfonts/mma3b.pfa
+mma4b Math4-Bold </psfonts/mma4b.pfa
+mma5b Math5-Bold </psfonts/mma5b.pfa
+mma1tt Math1Mono </psfonts/mma1tt.pfa
+mma2tt Math2Mono </psfonts/mma2tt.pfa
+mma3tt Math3Mono </psfonts/mma3tt.pfa
+mma4tt Math4Mono </psfonts/mma4tt.pfa
+mma5tt Math5Mono </psfonts/mma5tt.pfa
+mma1ttb Math1Mono-Bold </psfonts/mma1ttb.pfa
+mma2ttb Math2Mono-Bold </psfonts/mma2ttb.pfa
+mma3ttb Math3Mono-Bold </psfonts/mma3ttb.pfa
+mma4ttb Math4Mono-Bold </psfonts/mma4ttb.pfa
+mma5ttb Math5Mono-Bold </psfonts/mma5ttb.pfa
diff --git a/fonts/utilities/mathinst/makemma/rename.bat b/fonts/utilities/mathinst/makemma/rename.bat
new file mode 100644
index 0000000000..077246b3dc
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/rename.bat
@@ -0,0 +1,42 @@
+mv Math1-Bold.afm mma1b.afm
+mv Math1.afm mma1.afm
+mv Math1Mono-Bold.afm mma1ttb.afm
+mv Math1Mono.afm mma1tt.afm
+mv Math2-Bold.afm mma2b.afm
+mv Math2.afm mma2.afm
+mv Math2Mono-Bold.afm mma2ttb.afm
+mv Math2Mono.afm mma2tt.afm
+mv Math3-Bold.afm mma3b.afm
+mv Math3.afm mma3.afm
+mv Math3Mono-Bold.afm mma3ttb.afm
+mv Math3Mono.afm mma3tt.afm
+mv Math4-Bold.afm mma4b.afm
+mv Math4.afm mma4.afm
+mv Math4Mono-Bold.afm mma4ttb.afm
+mv Math4Mono.afm mma4tt.afm
+mv Math5-Bold.afm mma5b.afm
+mv Math5.afm mma5.afm
+mv Math5Mono-Bold.afm mma5ttb.afm
+mv Math5Mono.afm mma5tt.afm
+
+mv Math1-Bold mma1b.pfa
+mv Math1 mma1.pfa
+mv Math1Mono-Bold mma1ttb.pfa
+mv Math1Mono mma1tt.pfa
+mv Math2-Bold mma2b.pfa
+mv Math2 mma2.pfa
+mv Math2Mono-Bold mma2ttb.pfa
+mv Math2Mono mma2tt.pfa
+mv Math3-Bold mma3b.pfa
+mv Math3 mma3.pfa
+mv Math3Mono-Bold mma3ttb.pfa
+mv Math3Mono mma3tt.pfa
+mv Math4-Bold mma4b.pfa
+mv Math4 mma4.pfa
+mv Math4Mono-Bold mma4ttb.pfa
+mv Math4Mono mma4tt.pfa
+mv Math5-Bold mma5b.pfa
+mv Math5 mma5.pfa
+mv Math5Mono-Bold mma5ttb.pfa
+mv Math5Mono mma5tt.pfa
+
diff --git a/fonts/utilities/mathinst/makemma/unadobe.mtx b/fonts/utilities/mathinst/makemma/unadobe.mtx
new file mode 100644
index 0000000000..a79da2c0e9
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/unadobe.mtx
@@ -0,0 +1,248 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file unadobe.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This fontinst file unsets glyphs named according to the Adobe Standard
+encoding. Why do such a thing? Commercial fonts prepared with
+Fontogrpaher, etc insist on using the ASE names regardless of the
+glyph shape. (Thus, in the Mathematica Math1 font, a glyph called `z'
+is really zeta, and `radical' is actually the weierstrass symbol.)
+Some glyhs have, by chance, been given their proper names.
+
+\metrics
+
+\setcommand\Unsetglyph#1{\ifisglyph{#1}\then\unsetglyph{#1}\fi}
+
+\Unsetglyph{space}
+\Unsetglyph{exclam}
+\Unsetglyph{quotedbl}
+\Unsetglyph{numbersign}
+\Unsetglyph{dollar}
+\Unsetglyph{percent}
+\Unsetglyph{ampersand}
+\Unsetglyph{quotesingle}
+\Unsetglyph{parenleft}
+\Unsetglyph{parenright}
+\Unsetglyph{asterisk}
+\Unsetglyph{plus}
+\Unsetglyph{comma}
+\Unsetglyph{hyphen}
+\Unsetglyph{period}
+\Unsetglyph{slash}
+\Unsetglyph{zero}
+\Unsetglyph{one}
+\Unsetglyph{two}
+\Unsetglyph{three}
+\Unsetglyph{four}
+\Unsetglyph{five}
+\Unsetglyph{six}
+\Unsetglyph{seven}
+\Unsetglyph{eight}
+\Unsetglyph{nine}
+\Unsetglyph{colon}
+\Unsetglyph{semicolon}
+\Unsetglyph{less}
+\Unsetglyph{equal}
+\Unsetglyph{greater}
+\Unsetglyph{question}
+\Unsetglyph{at}
+\Unsetglyph{A}
+\Unsetglyph{B}
+\Unsetglyph{C}
+\Unsetglyph{D}
+\Unsetglyph{E}
+\Unsetglyph{F}
+\Unsetglyph{G}
+\Unsetglyph{H}
+\Unsetglyph{I}
+\Unsetglyph{J}
+\Unsetglyph{K}
+\Unsetglyph{L}
+\Unsetglyph{M}
+\Unsetglyph{N}
+\Unsetglyph{O}
+\Unsetglyph{P}
+\Unsetglyph{Q}
+\Unsetglyph{R}
+\Unsetglyph{S}
+\Unsetglyph{T}
+\Unsetglyph{U}
+\Unsetglyph{V}
+\Unsetglyph{W}
+\Unsetglyph{X}
+\Unsetglyph{Y}
+\Unsetglyph{Z}
+\Unsetglyph{bracketleft}
+\Unsetglyph{backslash}
+\Unsetglyph{bracketright}
+\Unsetglyph{asciicircum}
+\Unsetglyph{underscore}
+\Unsetglyph{grave}
+\Unsetglyph{a}
+\Unsetglyph{b}
+\Unsetglyph{c}
+\Unsetglyph{d}
+\Unsetglyph{e}
+\Unsetglyph{f}
+\Unsetglyph{g}
+\Unsetglyph{h}
+\Unsetglyph{i}
+\Unsetglyph{j}
+\Unsetglyph{k}
+\Unsetglyph{l}
+\Unsetglyph{m}
+\Unsetglyph{n}
+\Unsetglyph{o}
+\Unsetglyph{p}
+\Unsetglyph{q}
+\Unsetglyph{r}
+\Unsetglyph{s}
+\Unsetglyph{t}
+\Unsetglyph{u}
+\Unsetglyph{v}
+\Unsetglyph{w}
+\Unsetglyph{x}
+\Unsetglyph{y}
+\Unsetglyph{z}
+\Unsetglyph{braceleft}
+\Unsetglyph{bar}
+\Unsetglyph{braceright}
+\Unsetglyph{asciitilde}
+\Unsetglyph{DEL}
+\Unsetglyph{Adieresis}
+\Unsetglyph{Aring}
+\Unsetglyph{Ccedilla}
+\Unsetglyph{Eacute}
+\Unsetglyph{Ntilde}
+\Unsetglyph{Odieresis}
+\Unsetglyph{Udieresis}
+\Unsetglyph{aacute}
+\Unsetglyph{agrave}
+\Unsetglyph{acircumflex}
+\Unsetglyph{adieresis}
+\Unsetglyph{atilde}
+\Unsetglyph{aring}
+\Unsetglyph{ccedilla}
+\Unsetglyph{eacute}
+\Unsetglyph{egrave}
+\Unsetglyph{ecircumflex}
+\Unsetglyph{edieresis}
+\Unsetglyph{iacute}
+\Unsetglyph{igrave}
+\Unsetglyph{icircumflex}
+\Unsetglyph{idieresis}
+\Unsetglyph{ntilde}
+\Unsetglyph{oacute}
+\Unsetglyph{ograve}
+\Unsetglyph{ocircumflex}
+\Unsetglyph{odieresis}
+\Unsetglyph{otilde}
+\Unsetglyph{uacute}
+\Unsetglyph{ugrave}
+\Unsetglyph{ucircumflex}
+\Unsetglyph{udieresis}
+\Unsetglyph{dagger}
+\Unsetglyph{degree}
+\Unsetglyph{cent}
+\Unsetglyph{sterling}
+\Unsetglyph{section}
+\Unsetglyph{bullet}
+\Unsetglyph{paragraph}
+\Unsetglyph{germandbls}
+\Unsetglyph{registered}
+\Unsetglyph{copyright}
+\Unsetglyph{trademark}
+\Unsetglyph{acute}
+\Unsetglyph{dieresis}
+\Unsetglyph{notequal}
+\Unsetglyph{AE}
+\Unsetglyph{Oslash}
+\Unsetglyph{infinity}
+\Unsetglyph{plusminus}
+\Unsetglyph{lessequal}
+\Unsetglyph{greaterequal}
+\Unsetglyph{yen}
+%\Unsetglyph{mu}
+%\Unsetglyph{partialdiff}
+\Unsetglyph{summation}
+\Unsetglyph{product}
+%\Unsetglyph{pi}
+\Unsetglyph{integral}
+\Unsetglyph{ordfeminine}
+\Unsetglyph{ordmasculine}
+%\Unsetglyph{Omega}
+\Unsetglyph{ae}
+\Unsetglyph{oslash}
+\Unsetglyph{questiondown}
+\Unsetglyph{exclamdown}
+\Unsetglyph{logicalnot}
+\Unsetglyph{radical}
+\Unsetglyph{florin}
+\Unsetglyph{approxequal}
+%\Unsetglyph{Delta}
+\Unsetglyph{guillemotleft}
+\Unsetglyph{guillemotright}
+\Unsetglyph{ellipsis}
+\Unsetglyph{nbspace}
+\Unsetglyph{Agrave}
+\Unsetglyph{Atilde}
+\Unsetglyph{Otilde}
+\Unsetglyph{OE}
+\Unsetglyph{oe}
+\Unsetglyph{endash}
+\Unsetglyph{emdash}
+\Unsetglyph{quotedblleft}
+\Unsetglyph{quotedblright}
+\Unsetglyph{quoteleft}
+\Unsetglyph{quoteright}
+\Unsetglyph{divide}
+\Unsetglyph{lozenge}
+\Unsetglyph{ydieresis}
+\Unsetglyph{Ydieresis}
+\Unsetglyph{fraction}
+\Unsetglyph{currency}
+\Unsetglyph{guilsinglleft}
+\Unsetglyph{guilsinglright}
+\Unsetglyph{fi}
+\Unsetglyph{fl}
+\Unsetglyph{daggerdbl}
+\Unsetglyph{periodcentered}
+\Unsetglyph{quotesinglbase}
+\Unsetglyph{quotedblbase}
+\Unsetglyph{perthousand}
+\Unsetglyph{Acircumflex}
+\Unsetglyph{Ecircumflex}
+\Unsetglyph{Aacute}
+\Unsetglyph{Edieresis}
+\Unsetglyph{Egrave}
+\Unsetglyph{Iacute}
+\Unsetglyph{Icircumflex}
+\Unsetglyph{Idieresis}
+\Unsetglyph{Igrave}
+\Unsetglyph{Oacute}
+\Unsetglyph{Ocircumflex}
+\Unsetglyph{apple}
+\Unsetglyph{Ograve}
+\Unsetglyph{Uacute}
+\Unsetglyph{Ucircumflex}
+\Unsetglyph{Ugrave}
+\Unsetglyph{dotlessi}
+\Unsetglyph{circumflex}
+\Unsetglyph{tilde}
+\Unsetglyph{macron}
+\Unsetglyph{breve}
+\Unsetglyph{dotaccent}
+\Unsetglyph{ring}
+\Unsetglyph{cedilla}
+\Unsetglyph{hungarumlaut}
+\Unsetglyph{ogonek}
+\Unsetglyph{caron}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/uncmmi.mtx b/fonts/utilities/mathinst/makemma/uncmmi.mtx
new file mode 100644
index 0000000000..8041cb652f
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/uncmmi.mtx
@@ -0,0 +1,79 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file uncmmi.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+We'll discard the alphabet and digit glyphs from cmmi10.
+
+\metrics
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+\unsetglyph{zerooldstyle}
+\unsetglyph{oneoldstyle}
+\unsetglyph{twooldstyle}
+\unsetglyph{threeoldstyle}
+\unsetglyph{fouroldstyle}
+\unsetglyph{fiveoldstyle}
+\unsetglyph{sixoldstyle}
+\unsetglyph{sevenoldstyle}
+\unsetglyph{eightoldstyle}
+\unsetglyph{nineoldstyle}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/makemma/unsave.mtx b/fonts/utilities/mathinst/makemma/unsave.mtx
new file mode 100644
index 0000000000..e427ed3b14
--- /dev/null
+++ b/fonts/utilities/mathinst/makemma/unsave.mtx
@@ -0,0 +1,246 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file unsave.mtx, part of the `makemma' subpackage
+%% of the MathInst package
+%% (version 0.8, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\Unsave#1{\ifisglyph{#1saved}\then
+ \resetglyph{#1}
+ \glyph{#1saved}{1000}
+ \endresetglyph
+ \unsetglyph{#1saved}
+\fi}
+
+\Unsave{space}
+\Unsave{exclam}
+\Unsave{quotedbl}
+\Unsave{numbersign}
+\Unsave{dollar}
+\Unsave{percent}
+\Unsave{ampersand}
+\Unsave{quotesingle}
+\Unsave{parenleft}
+\Unsave{parenright}
+\Unsave{asterisk}
+\Unsave{plus}
+\Unsave{comma}
+\Unsave{hyphen}
+\Unsave{period}
+\Unsave{slash}
+\Unsave{zero}
+\Unsave{one}
+\Unsave{two}
+\Unsave{three}
+\Unsave{four}
+\Unsave{five}
+\Unsave{six}
+\Unsave{seven}
+\Unsave{eight}
+\Unsave{nine}
+\Unsave{colon}
+\Unsave{semicolon}
+\Unsave{less}
+\Unsave{equal}
+\Unsave{greater}
+\Unsave{question}
+\Unsave{at}
+\Unsave{A}
+\Unsave{B}
+\Unsave{C}
+\Unsave{D}
+\Unsave{E}
+\Unsave{F}
+\Unsave{G}
+\Unsave{H}
+\Unsave{I}
+\Unsave{J}
+\Unsave{K}
+\Unsave{L}
+\Unsave{M}
+\Unsave{N}
+\Unsave{O}
+\Unsave{P}
+\Unsave{Q}
+\Unsave{R}
+\Unsave{S}
+\Unsave{T}
+\Unsave{U}
+\Unsave{V}
+\Unsave{W}
+\Unsave{X}
+\Unsave{Y}
+\Unsave{Z}
+\Unsave{bracketleft}
+\Unsave{backslash}
+\Unsave{bracketright}
+\Unsave{asciicircum}
+\Unsave{underscore}
+\Unsave{grave}
+\Unsave{a}
+\Unsave{b}
+\Unsave{c}
+\Unsave{d}
+\Unsave{e}
+\Unsave{f}
+\Unsave{g}
+\Unsave{h}
+\Unsave{i}
+\Unsave{j}
+\Unsave{k}
+\Unsave{l}
+\Unsave{m}
+\Unsave{n}
+\Unsave{o}
+\Unsave{p}
+\Unsave{q}
+\Unsave{r}
+\Unsave{s}
+\Unsave{t}
+\Unsave{u}
+\Unsave{v}
+\Unsave{w}
+\Unsave{x}
+\Unsave{y}
+\Unsave{z}
+\Unsave{braceleft}
+\Unsave{bar}
+\Unsave{braceright}
+\Unsave{asciitilde}
+\Unsave{DEL}
+\Unsave{Adieresis}
+\Unsave{Aring}
+\Unsave{Ccedilla}
+\Unsave{Eacute}
+\Unsave{Ntilde}
+\Unsave{Odieresis}
+\Unsave{Udieresis}
+\Unsave{aacute}
+\Unsave{agrave}
+\Unsave{acircumflex}
+\Unsave{adieresis}
+\Unsave{atilde}
+\Unsave{aring}
+\Unsave{ccedilla}
+\Unsave{eacute}
+\Unsave{egrave}
+\Unsave{ecircumflex}
+\Unsave{edieresis}
+\Unsave{iacute}
+\Unsave{igrave}
+\Unsave{icircumflex}
+\Unsave{idieresis}
+\Unsave{ntilde}
+\Unsave{oacute}
+\Unsave{ograve}
+\Unsave{ocircumflex}
+\Unsave{odieresis}
+\Unsave{otilde}
+\Unsave{uacute}
+\Unsave{ugrave}
+\Unsave{ucircumflex}
+\Unsave{udieresis}
+\Unsave{dagger}
+\Unsave{degree}
+\Unsave{cent}
+\Unsave{sterling}
+\Unsave{section}
+\Unsave{bullet}
+\Unsave{paragraph}
+\Unsave{germandbls}
+\Unsave{registered}
+\Unsave{copyright}
+\Unsave{trademark}
+\Unsave{acute}
+\Unsave{dieresis}
+\Unsave{notequal}
+\Unsave{AE}
+\Unsave{Oslash}
+\Unsave{infinity}
+\Unsave{plusminus}
+\Unsave{lessequal}
+\Unsave{greaterequal}
+\Unsave{yen}
+\Unsave{mu}
+\Unsave{partialdiff}
+\Unsave{summation}
+\Unsave{product}
+\Unsave{pi}
+\Unsave{integral}
+\Unsave{ordfeminine}
+\Unsave{ordmasculine}
+\Unsave{Omega}
+\Unsave{ae}
+\Unsave{oslash}
+\Unsave{questiondown}
+\Unsave{exclamdown}
+\Unsave{logicalnot}
+\Unsave{radical}
+\Unsave{florin}
+\Unsave{approxequal}
+\Unsave{Delta}
+\Unsave{guillemotleft}
+\Unsave{guillemotright}
+\Unsave{ellipsis}
+\Unsave{nbspace}
+\Unsave{Agrave}
+\Unsave{Atilde}
+\Unsave{Otilde}
+\Unsave{OE}
+\Unsave{oe}
+\Unsave{endash}
+\Unsave{emdash}
+\Unsave{quotedblleft}
+\Unsave{quotedblright}
+\Unsave{quoteleft}
+\Unsave{quoteright}
+\Unsave{divide}
+\Unsave{lozenge}
+\Unsave{ydieresis}
+\Unsave{Ydieresis}
+\Unsave{fraction}
+\Unsave{currency}
+\Unsave{guilsinglleft}
+\Unsave{guilsinglright}
+\Unsave{fi}
+\Unsave{fl}
+\Unsave{daggerdbl}
+\Unsave{periodcentered}
+\Unsave{quotesinglbase}
+\Unsave{quotedblbase}
+\Unsave{perthousand}
+\Unsave{Acircumflex}
+\Unsave{Ecircumflex}
+\Unsave{Aacute}
+\Unsave{Edieresis}
+\Unsave{Egrave}
+\Unsave{Iacute}
+\Unsave{Icircumflex}
+\Unsave{Idieresis}
+\Unsave{Igrave}
+\Unsave{Oacute}
+\Unsave{Ocircumflex}
+\Unsave{apple}
+\Unsave{Ograve}
+\Unsave{Uacute}
+\Unsave{Ucircumflex}
+\Unsave{Ugrave}
+\Unsave{dotlessi}
+\Unsave{circumflex}
+\Unsave{tilde}
+\Unsave{macron}
+\Unsave{breve}
+\Unsave{dotaccent}
+\Unsave{ring}
+\Unsave{cedilla}
+\Unsave{hungarumlaut}
+\Unsave{ogonek}
+\Unsave{caron}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/map.a2d b/fonts/utilities/mathinst/map.a2d
new file mode 100644
index 0000000000..c4115107c8
--- /dev/null
+++ b/fonts/utilities/mathinst/map.a2d
@@ -0,0 +1,434 @@
+#############################################################
+##
+## This is the file map.a2d, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## This is file map.a2d, version 0.9.
+## It maps font abbreviations (a) to directory names (d)
+## which may be useful in placing fonts in a TDS TeX system.
+## It was compiled in February 1997 from various *.map
+## files that accompany the fontname2.1 distribution by
+## Karl Berry.
+a1 arial
+a2 amasis
+a3 adlib
+a4 altgoth2
+a5 allegro
+a6 amelia
+a7 amertext
+a8 aurora
+a9 adsans
+aa aachen
+ab aboeckli
+ac acaslon
+ad agaramon
+ag avantgar
+ah ashleysc
+ai abadi
+al albertus
+am amercana
+an anna
+ao atqolive
+ap apollo
+aq antiqua
+ar arcadia
+as aldus
+at atypewri
+au auriol
+av avenir
+az azdzgrot
+b0 blackoak
+b1 blado
+b2 binnyos
+b3 braggado
+b4 bison
+b5 binghams
+b6 block
+b7 bernhard
+b8 blippo
+b9 bremen
+bb bembo
+bc banco
+bd bodoni
+be bell
+bf biffo
+bg benguiat
+bh bauhaus
+bi birch
+bk bookman
+bl belwe
+bm bulmer
+bn bernard
+bo balloon
+bp bodocamp
+br berling
+bs bakersig
+bt boton
+bu brush
+bv baskervi
+bw broadway
+by berkeley
+c0 carolina
+c1 calisto
+c2 casln224
+c3 caslon3
+c4 chicago
+c5 casln540
+c6 clarion
+c7 compacta
+c8 calvert
+c9 codex
+ca caslon
+cb cooper
+cc cascade
+cd clarendo
+ce centenni
+cf clearfac
+cg charlema
+ch charter
+ci candida
+cl cloister
+cn century
+co cochin
+cp copperpl
+cq cheq
+cr courier
+cs cntursbk
+ct cheltenh
+cu centuros
+cv clairvx
+cw cottonwd
+cx caxton
+cy city
+cz choc
+d0 davida
+dc domcasl
+dd ducberry
+de dellarob
+di diotima
+dl dolores
+dm delima
+dr doric
+ds dorchesc
+dt dante
+e0 embassy
+e1 empire
+ea lectra
+eb baskerbe
+ec applecha
+ee egyptian
+ef egyptien
+eg stgaramo
+eh engsft
+ei esprit
+ek eckmann
+el ellingtn
+en engraver
+eo amerigo
+er eras
+es eurostil
+et ehrhardt
+eu euler
+ex exclsior
+f0 flemishs
+f1 fournier
+f2 facade
+f3 festival
+f4 footligh
+f5 french
+fa formata
+fe forte
+ff fairfld
+fg frankgth
+fi figaro
+fl flora
+fn fenice
+fo folio
+fq frizquad
+fr frutiger
+fs falstaff
+ft fettefrk
+fu futura
+fx felixttl
+fy flyer
+g0 gando
+g1 gothic13
+g2 giddyup
+g3 garamon3
+g4 gymodern
+g5 gycatalg
+g6 gorilla
+g9 ugaramon
+gb gothicbb
+ge geneva
+gg garthgra
+gj granjon
+gl galliard
+gm garamond
+go gyoldsty
+gp glypha
+gq grotesq
+gr gloucest
+gs gillsans
+gt goudytxt
+gu guardi
+gv giovanni
+gy goudy
+h0 handelgo
+hb hobo
+hc herculnm
+hd headline
+hg hiroshig
+hi hvinsera
+hm charme
+hn hvneue
+ho horleyos
+hr hvround
+hs hnseati
+ht hoeflert
+hv helvetic
+hw schadow
+hx huxleyvr
+i0 commscr
+i1 impress
+i2 impuls
+ia insignia
+ib ibycus
+ic impact
+if inflex
+ig scgaramo
+ii imprint
+il caecilia
+im imago
+in industri
+io ionic
+ip impressm
+is italnos
+it italia
+iw ironwood
+iy iowanold
+jf jeffersn
+jn janson
+jo joanna
+jp juniper
+kb kabel
+kg bankgoth
+kl klang
+kn kino
+ko bookmano
+kr korinna
+ks kuenstsc
+ku kaufmann
+l1 liberty
+l2 libra
+l3 lucia
+l4 lucian
+lb lubaling
+lc lucida
+lf life
+lg lettrgth
+lh lubright
+li latin
+ln lino
+lo lithos
+ls lucsans
+lt lutetia
+lw leawood
+lx lucidfax
+ly lydian
+m0 monospac
+m1 monolisc
+m2 metro
+m3 mirarae
+m4 mrearl
+m5 murrayhl
+m6 mittlsft
+m7 matura
+m8 monotyos
+ma mandate
+mc monaco
+md meridien
+me mercursc
+mg marigold
+mh machine
+mi medici
+ml melior
+mn minion
+mo modern
+mp memphis
+mq mesquite
+mr madrone
+ms mistral
+mt minister
+mv malvern
+mx maximus
+mz amazone
+n0 normande
+n1 binner
+na newaster
+nb nbaskerv
+nc ncntrsbk
+nd ncaledon
+nf nofret
+ng newsgth
+ni nimrod
+nk neograph
+nl neuland
+nm nimbus
+nn nclarend
+np nsplanti
+nr nberolin
+ns timesnps
+nt timesnew
+nu nuptial
+nv novarese
+nz neuzeits
+o0 oldreadf
+o1 oranda
+o2 orbitb
+o3 colonna
+o4 oceansan
+o7 oldsty7
+oa ocra
+ob ocrb
+oc concorde
+oe oldengli
+oi ondine
+ol colmcill
+om omnia
+on corona
+op optima
+or orator
+os oldstyle
+ot coronet
+ov octavian
+ox onyx
+oy olympian
+oz ozhandcr
+p0 poplar
+p1 palacesc
+p2 pepita
+p3 palette
+p4 pioneer
+p5 piranesi
+p6 blueprin
+pa parkave
+pb ptbarnum
+pc poetica
+pd placard
+pe prestige
+pf profile
+pg peignot
+ph photina
+pi pi
+pl palatino
+pn plantin
+po ponderos
+pp perpetua
+pq postatqa
+ps parisian
+pt present
+pu popplaud
+pw perrywoo
+px popplpfx
+py playbill
+pz poliphil
+qr quorum
+qt boulevar
+r0 romana
+r1 rotis
+r2 cantoria
+ra raleigh
+rm carmina
+ro rotis
+rp reporter
+rq russelsq
+rs arrus
+rt carta
+ru runic
+rv revue
+rw rockwell
+ry ryumin
+s0 sanmarco
+s1 scotchro
+s2 script
+s3 seagull
+s4 shotgun
+s5 snell
+s6 stuyvesa
+s7 sassoon
+sb sabon
+sc slimbach
+sf serifa
+sg serifgth
+sh shannon
+sk skia
+sl stencil
+sm spectrum
+sn spartan
+so sonata
+sp serpenti
+sr snellrnd
+ss stschnei
+st stone
+sv souvenir
+sw swing
+sx syntax
+sy symbol
+t0 tango
+t1 thunderb
+t2 typo
+tb bebodoni
+te timeseur
+tf tiffany
+tg tradegth
+ti techphon
+tj trajan
+tk tekton
+tl castella
+tm times
+to torino
+tp tempo
+tv trumpmed
+tw twentyc
+ty typewrit
+u0 columbus
+ub babodoni
+ug bengugth
+uh cushing
+ul universa
+um umbra
+un univers
+ur centaur
+ut utopia
+uw usherwoo
+uy universi
+v0 vineta
+va activa
+vc vectora
+vd vandijck
+vi victoria
+vj veljovic
+vl versaill
+vr vagrnd
+w0 weddingt
+wb walbaum
+wd weideman
+wg wlklgth
+wi wingding
+wk wilke
+wn windsor
+wr wittenbe
+ws weiss
+ww willow
+yg centuryg
+yh strayhor
+ym stymie
+za zantiqua
+zc zapfchan
+zd zapfding
+zg neuzeitg
+zt zeitgeis
diff --git a/fonts/utilities/mathinst/map.sup b/fonts/utilities/mathinst/map.sup
new file mode 100644
index 0000000000..6e0f477199
--- /dev/null
+++ b/fonts/utilities/mathinst/map.sup
@@ -0,0 +1,32 @@
+#############################################################
+##
+## This is the file map.sup, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## This file map.sup, version 0.9. It was compiled on February 1, 1997
+## from information in the file supplier.map which accompanies the
+## fontname2.1 distribution by Karl Berry. The three fields in this file
+## represent a supplier abbreviation, a directory name appropriate for
+## TDS TeX system, and a long name of the supplier.
+##
+9 unknown ----------------------
+a autologi Autologic
+b bitstrea Bitstream
+c cg Compugraphic
+d dtc Digital Typeface
+e apple Apple
+g gnu Free Software
+h bh Bigelow & Holmes
+i itc International Typeface
+k softkey SoftKey
+l linotype Linotype
+m monotype Monotype
+n ibm IBM
+o corel Corel
+p adobe Adobe
+s sun Sun
+t paragrap ParaGraph
+u urw URW
diff --git a/fonts/utilities/mathinst/mathinst b/fonts/utilities/mathinst/mathinst
new file mode 100644
index 0000000000..b152615ccf
--- /dev/null
+++ b/fonts/utilities/mathinst/mathinst
@@ -0,0 +1,288 @@
+#!/usr/local/bin/perl
+## The main module for MathInst.
+
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "0.800",
+### date = "7 January 1998",
+### filename = "mathinst",
+### address = "Department of Mathematics,
+### John Jay College,
+### 445 West 59 Street,
+### New York, NY 10019, USA",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### keywords = "AFM, virtual fonts, fonts, PostScript, TeX",
+### supported = "yes",
+### abstract = "This is the Perl script for the mathinst
+### virtual math font installation utility.
+### It installs raw math fonts (MathTime, Lucida,
+### Euler, Mathematica) with text fonts for a
+### complete math typesetting style.
+### See accompanying file mathinst.tex for
+### additional details.",
+### package = "mathinst",
+### dependencies = "",
+### }
+### ====================================================================
+
+############################################################
+##
+## The main routine.
+##
+############################################################
+
+ $prelim_info =<<"Endprelim_info";
+
+This is MathInst, a utility for creating math fonts for use by TeX and LaTeX.
+To run it you need to supply 2 arguments at the command line:
+ 1. the name of the collection of raw math fonts you're using; and
+ 2. the name of the family of text fonts you'll be using with the math fonts.
+Currently, the math font names can be either `mt' (MathTime), `eu' (Euler),
+or `lu' (Lucida New Math). The text family name should be the Berry
+fontname---something like `pad' for Adobe Garamond, `pac' for Adobe Caslon,
+and so on. Thus, I would type something like
+ perl ../mathinst mt pad
+to create math fonts combining MathTime plus Adobe Garamond.
+
+MathInst itself is written in Perl5, so you'll need to place the
+Perl executable somewhere on your system's search path. MathInst depends
+on `fontinst' and `pdcfsel'; both packages are freely available from the
+CTAN archive of TeX software.
+
+The current versions of the MathInst scripts are available from the
+ fonts/utilities/mathinst
+area of the CTAN archive. Read the file `mathinst.tex' for additional
+information. (The info on this screen is stored in the file `mathinst.how'.)
+
+Endprelim_info
+
+sub die_from_ignorance{
+ open(TODO, ">mathinst.how");
+ print $prelim_info;
+ print TODO $prelim_info;
+ close TODO;
+ die;
+}
+
+## Let's verify that we were passed the proper number of args.
+die_from_ignorance unless $#ARGV == 1;
+
+$mathfam_ = $ARGV[0]; # $mathfam_="mt", "eu", etc.
+$fontfam_ = $ARGV[1]; # mbv, pac, pad, etc.
+
+require("../${mathfam_}.par"); # system dependent; get module params
+require("..${sep}mathinst.lib");
+
+sub DoIt{
+ ## Here are some constants we'll be using throughout.
+ ## $fontfam_ is something like "mbv" (eg, Monotype
+ ## Baskerville). $mathpkg_ is something like "zmtmbv", a
+ ## math package combining MathTime fonts + Monotype
+ ## Baskerville. $mathid will be "m", "l", or "e" for
+ ## mathTime, Lucida, or Euler. $shortmathpkg_ will be
+ ## something like "mtmbv", and should be used in file
+ ## naming contexts whenever the appearance of $mathpkg_
+ ## will make the file name exceed 8 characters.
+ local($s, $typefam) = split(//, $fontfam_, 2);
+ # Here, $s = m or p, etc and $typefam = 'bv', 'ac', and so on
+ $mathpkg_ = "z$mathfam_$fontfam_";
+ $shortmathpkg_ = "$mathfam_$fontfam_";
+ $mathid = $mathid_{$mathfam_};
+ &openlog;
+ ## Now begins an important verification process. We need to
+ ## verify that everything the user says is there really is there.
+ if (&isTDS) { # check TDS directories first
+ &dwlog("This is a TDS installation.");
+ $sup_ = &getTDSsupplier;
+ &dwlog("I am using <<$sup_>> as the supplier for $fontfam_.");
+ $typ_ = &getTDStypeface;
+ &dwlog("I am using <<$typ_>> as type directory for $fontfam_.");
+ ## Need to redefine $afm_, $tfm_, $vf_ to correspond to these
+ ## text fonts ONLY. They will not apply to special fonts (math,
+ ## fraktur, etc.).
+ $temp = "${mathfam_}_fonts";
+ ($mathsup_, $mathtyp_) = ($$temp[0], $$temp[1]);
+ $psfonts_ = "$texmf_${sep}fonts${sep}type1${sep}$sup_${sep}$typ_";
+ $afm_ = "$texmf_${sep}fonts${sep}afm${sep}$sup_${sep}$typ_";
+ $tfm_ = "$texmf_${sep}fonts${sep}tfm${sep}$sup_${sep}$typ_";
+ $vf_ = "$texmf_${sep}fonts${sep}vf${sep}$sup_${sep}$typ_";
+ $mathpsfonts_ =
+ "$texmf_${sep}fonts${sep}type1${sep}$mathsup_${sep}$mathtyp_";
+ $mathafm_ =
+ "$texmf_${sep}fonts${sep}afm${sep}$mathsup_${sep}$mathtyp_";
+ $mathtfm_ =
+ "$texmf_${sep}fonts${sep}tfm${sep}$mathsup_${sep}$mathtyp_";
+ $mathvf_ = "$texmf_${sep}fonts${sep}vf${sep}$mathsup_${sep}$mathtyp_";
+ $inputs_ = "$texmf_${sep}tex${sep}latex${sep}$installer_";
+ $map_ = "$texmf_${sep}dvips${sep}base";
+ } else { # non-TDS systems...
+ $mathpsfonts_ = $psfonts_;
+ $mathafm_ =$afm_;
+ $mathtfm_ = $tfm_;
+ $mathvf_ = $vf_;
+ &dwlog("This is a traditional installation.");
+ }
+ &verifydirs(
+ $psfonts_,
+ $afm_,
+ $vf_,
+ $tfm_,
+ $mathpsfonts_,
+ $mathafm_,
+ $mathvf_,
+ $mathtfm_,
+ $map_,
+ $inputs_,
+ );
+ &verifydirs(
+ "$texmf_${sep}fonts${sep}vf${sep}$installer_${sep}$mathpkg_",
+ "$texmf_${sep}fonts${sep}tfm${sep}$installer_${sep}$mathpkg_",
+ "$texmf_${sep}tex${sep}plain${sep}mathinst",
+ "$texmf_${sep}tex${sep}latex${sep}mathinst",
+ ) if &isTDS;
+ ## Now to verify encoding.
+ $lc_encoding_ =lc $encoding_;
+ if (($lc_encoding_ ne "ot1") and ($lc_encoding_ ne "t1")) {
+ &dwlog("Warning: I don't recognize the encoding $encoding_.");
+ &dwlog("(You may want to fix and re-run mathinst.)");
+ } else {
+ &dwlog("I will be using the encoding `$encoding_' in this run.");
+ }
+ ## We need a math encoding for use by the math roman font. It can only
+ ## be `OT1' or `ot1'.
+ $mathencoding_ = "ot1";
+ $mathencoding_ = "OT1" if $encoding_ =~ /T/;
+ $manname = "${mathfam_}_manifest";
+ *thismanifest = *$manname; # for later use...
+ &checkinstallation(@mathinstmanifest); # check everybody's files
+ &checkinstallation(@thismanifest); # check math stuff...
+ ## Regardless of how the text fonts have been installed, we will
+ ## use the OT1, OMX, OMS, and OML encodings for the math fonts.
+ ## We'll begin by getting characteristics of installed font.
+ undef $enc; undef $rreg; # initialize
+ TEST_ENC: foreach $testenc ("9t", "9o", "9d", "9e", "7t", "8t") {
+ $enc=$testenc;
+ foreach $testroman ("r", "k", "m", "l") {
+ $rreg=$testroman;
+ last TEST_ENC if -e "$vf_$sep${fontfam_}$rreg$enc.vf";
+ }
+ }
+ $enc = "99" unless $enc;
+ &Out("I HAVEN'T FOUND THE MATCHING ROMAN FONTS! Please help me.")
+ if $enc eq "99";
+ $osf = $true if $enc =~ /d|o/;# Old Style Figures exist
+ $osf = $true if $enc =~ /9/; # expert fonts exist
+ $latexfontfam_ = "nul"; $latex = $true; undef $foundfile;
+ $fdfile = "$inputs_$sep$encoding_${fontfam_}.fd";
+ $fdxfile = "$inputs_$sep$encoding_${fontfam_}x.fd";
+ $fd9file = "$inputs_$sep$encoding_${fontfam_}9.fd";
+ if (&isfile($fdxfile)) { # check for expert fonts first
+ $latex = $true;
+ $latexfontfam_ = "${fontfam_}x";
+ $foundfile = $fdxfile;
+ $textenc = "9"; $famvariant = "x";
+ } elsif (&isfile($fdfile)) {# then for non-expert fonts
+ $latex = $true;
+ $latexfontfam_ = "${fontfam_}";
+ $foundfile = $fdfile;
+ $famvariant = "";
+ } elsif (&isfile($fd9file)) { # finally for oldstyle fonts
+ $latex = $true;
+ $latexfontfam_ = "${fontfam_}9";
+ $foundfile = $fd9file;
+ $textenc = "9"; $famvariant = "9";
+ }
+ if ($latexfontfam_ eq "nul") {
+ &dwlog("I failed to find font descriptors like\n >>$fdfile.");
+ &dwlog("I assume you're not using NFSS & LaTeX so I won't either.");
+ $latex = $false;
+ } else {
+ &dwlog("I found font descriptor file\n >>$foundfile;");
+ &dwlog("the LaTeX font family for this run is $latexfontfam_.");
+ }
+ &verifytextfonts; # are text fonts present for $fontfam_?
+ &verifymathfonts; # are math fonts present?
+ ## Now to verify various specialty fonts.
+ &dwlog("\nNow we verify various specialty fonts.");
+ &verifyspecialfonts;
+ ## Whew, we've finished all the verification/calculation, and now it's
+ ## time to start creating the file makemath.tex.
+ $namedroutine = "make_${mathfam_}_math";
+ open(MAKEMATH, ">makemath.tex");
+ &$namedroutine;
+ close(MAKEMATH);
+ ## The file `makemath.tex' is certainly the most important, but not
+ ## the only file we need to create. First off among these others:
+ ## we need the file makevf.bat to transform .vpl files to .vf files.
+ ## Of course, Unix can do this within the foreach statement, but other
+ ## operating systems (such as MS-DOS), are less clever.
+ open(GETVF, ">makevf.bat");
+ &makevf;
+ close(GETVF);
+ ## We need a pair of files copies. From the template files
+ ## rhax.mtx and ihax.mtx
+ ## we create files $fontfam_rhax.mtx and $fontfam_ihax.mtx
+ ## unless they already exist, for it would be a deadly shame to
+ ## over-write files for which users had already done work.
+ ## (Eg: if $fontfam_ is `mbv', then we generate mbvrhax.mtx, etc.)
+ $target = "${fontfam_}rhax.mtx";
+ &safecopy("../rhax.mtx", "$target");
+ $target = "${fontfam_}ihax.mtx";
+ &safecopy("../${mathfam_}_ihax.mtx", "$target");
+ $target = "${fontfam_}iskew.mtx";
+ &safecopy("../${mathfam_}_iskew.mtx", "$target");
+ ## At this point everything is ready to create the math virtual fonts.
+ ## We still need to create the style files and the test files.
+ ## The 2 style files we create will essentially create a complete font
+ ## environment for typesetting. In addition to making the Roman and
+ ## accompanying math fonts the defaults, it will also enable the setup of
+ ## sans serif (for both math and text), and blackboard bold and fraktur
+ ## fonts (for math), provided these fonts have been specified.
+ local($myans) = "y"; # ensures font tables are printed in test files
+ ## The Latex style is only for LaTeX users ...
+ $mathSF_ = "${mathfam_}SF_";
+ &makelatexstyle($mathfam_, $$mathSF_) if $latex;
+ ## ... but everybody gets the plain style. Since the plain style is
+ ## much more concise than the LaTeX equivalent, it seemed to make sense
+ ## to use a template file plainsty.tpl to facilitate the creation.
+ &makeplainstyle($mathfam_, $$mathSF_);
+ ## Finally, we prepare the test files, which show off our fancy font
+ ## work, and show how to use the style files.
+ &makeLaTeXtestfile($mathfam_) if $latex;
+ &makeplaintestfile($mathfam_);
+ &makecleanupfile;
+ open (TODO, ">finish.mth");
+ print $todo_next; print TODO $todo_next;
+ close TODO;
+}
+
+ $todo_next =<<"End_todo_next";
+
+
+MathInst: finishing up
+======================
+
+The hard work is done. Please review the messages that appeared onscreen which
+were also stored in the file `z$mathfam_$fontfam_.mlg'. Unless some cries for help were
+uttered, here's what to do now:
+
+ 1. Execute `mkdirs.bat' to create any missing directories;
+ 2. Execute `makepl.bat' to create some needed property list files;
+ 3. Run the plain TeX file `makemath.tex' through TeX (this step may take
+ a short while...);
+ 4. Execute `makevf.bat' to create the actual virtual fonts TeX will use;
+ 5. Test the files, by typesetting either of `testmath.tex' (LaTeX + NFSS)
+ or `testmatp.tex' (plain TeX). Make any adjustments as outlined in
+ `mathinst.tex';
+ 6. When you are satisfied with your fonts, execute `putfonts.bat' to place
+ all fonts files, style files, and so on where they belong. (Any files
+ remaining in your work directory thereafter may safely be deleted.)
+ 7. TDS Only: Update the TDS data base by issuing a `texhash' or `configure'
+ command, or whatever is appropriate for your system.
+
+(This information can be found in the file `finish.mth'.)
+
+End_todo_next
+&DoIt; # just do it...
diff --git a/fonts/utilities/mathinst/mathinst.lib b/fonts/utilities/mathinst/mathinst.lib
new file mode 100644
index 0000000000..83f7a74b46
--- /dev/null
+++ b/fonts/utilities/mathinst/mathinst.lib
@@ -0,0 +1,1876 @@
+#############################################################
+##
+## This is the file mathinst.lib, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+#!/usr/local/bin/perl
+## This is a common file containing variables and common routines
+## used by all Perl modules in the MathInst package.
+
+## Begin by setting lots of environment-like variables.
+## NONE of these should end with a backslash.
+
+$mathinstver_ = 1.0;
+
+## Some misc constants and constructs ...
+
+$false = 0; # these are valid for numeric tests only.
+$true = 1;
+
+## Now for some common routines.
+
+## Let's get the date and time.
+
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+$curmonth =
+ (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)[$mon];
+$curday = (Sun, Mon, Tues, Wednes, Thurs, Fri, Satur)[$wday];
+$mday = "0$mday" if $mday < 10;
+$curdate = "$mday $curmonth $year";
+$today = $curdate;
+$hour = "0$hour" if $hour < 10;
+$min = "0$min" if $min < 10;
+$sec = "0$sec" if $sec < 10;
+$now = "$hour:$min:$sec";
+
+## Math font parameters...
+
+@mathinstmanifest = (
+ "mathinst",
+ "mathinst.tex",
+ "mathinst.lib",
+ "map.a2d",
+ "map.sup",
+ "mt_ihax.mtx",
+ "eu_ihax.mtx",
+ "lu_ihax.mtx",
+ "mt_iskew.mtx",
+ "eu_iskew.mtx",
+ "lu_iskew.mtx",
+ "rhax.mtx",
+ );
+
+%mathid_ = (
+ mt => "m",
+ eu => "e",
+ cm => "c",
+ lu => "l",
+ ma => "a",
+);
+
+%mathname_ = (
+ mt => "MathTime",
+ eu => "Euler",
+ cm => "Computer Modern",
+ lu => "Lucida New Math",
+ ma => "Mathematica",
+);
+
+%mathxheights_ = (
+ mt => 464,
+ eu => 459,
+ cm => 431,
+ lu => 530,
+ ma => 452,
+);
+
+%nfssencoding = (
+ t1 => "8t",
+ ot1 => "7t",
+ t1x => "9e",
+ ti9 => "9d",
+ ot1x => "9t",
+ ot19 => "9o",
+ );
+
+%bold2nfss = (
+ b => "b",
+ s => "sb",
+ d => "db",
+ );
+
+%reg2nfss = (
+ r => "m",
+ k => "bk",
+ l => "l",
+ m => "md",
+ );
+
+%ital2nfss = (
+ o => "sl",
+ i => "it",
+ );
+
+##############################################################################
+##
+## MATHTIME
+##
+##############################################################################
+
+@mt_manifest = (
+ "MTSY.etx",
+ "MTMI.etx",
+ "OMLmt.etx",
+ "OMLmts.etx",
+ "OMLmtss.etx",
+ "OMSmt.etx",
+ "OMSmts.etx",
+ "OMSmtss.etx",
+ "OMXmt.etx",
+ "OT1s.etx",
+ "OT1ss.etx",
+ "accsoff.mtx",
+ "alphoff.mtx",
+ "newmtsy.mtx",
+ "newrmtmi.mtx",
+ "newmtex.mtx",
+ "noslash.mtx",
+ "numoff.mtx",
+ "regreek.mtx",
+ "unfake.mtx",
+ "xdotless.mtx",
+);
+
+## In all arrays storing font name info for math font families,
+## the first two elements contain supplier and typeface info for
+## use by TDS (ignored totally by traditional systems). The remaining
+## elements contain raw font names.
+
+@mt_fonts = (
+ $masup_, $matyp_, # math fonts---supplier and typeface
+ "RMTMI", # the math italic
+ "MTSY", # the math symbols
+ "MTEX", # math extension (large operator) font
+ );
+
+if ($mathfam_ eq "mt") {
+%comment = (
+ accsoff => "unsets accents, operators, and uppercase Greeks",
+ alphoff => "unsets alphabets (U&l/c) and some metric parameters",
+ dotlessj => "constructs a virtual dotless j",
+ newmtsy => "renames some glyphs in conformance with 8r",
+ newrmtmi => "renames some glyphs in conformance with 8r",
+ newmtex => "renames some glyphs in conformance with 8r",
+ noslash => "unsets glyphs `less', `equal', `slash'; get from MathTime",
+ numoff => "discards digits",
+ regreek => "constructs Greek uppercase letters",
+ unfake => "declares some math glyphs unfakable",
+ xdotless => "discards dotless i and j",
+ mymathit => "MathTime math italic characters",
+ mymathsy => "MathTime math symbols characters",
+ mymathex => "MathTime math extension (large symbols) glyphs",
+ );
+}
+
+
+## Here is some special purpose stuff that needs to be added to
+## the beginning of the installation file.
+$mt_prelude_ = <<"End_mt_prelude";
+
+\\declareencoding{MTEX}{OMX}
+\\declareencoding{MTSY}{MTSY}
+\\declareencoding{MTMI}{MTMI}
+
+\\pltomtx{MTEX}{mymathex}
+\\pltomtx{MTSY}{mymathsy}
+\\pltomtx{RMTMI}{mymathit}
+%% \\pltomtx{cmmi10}{cmmi10}
+%% \\pltomtx{cmmi7}{cmmi7}
+%% \\pltomtx{cmmi5}{cmmi5}
+End_mt_prelude
+
+##############################################################################
+##
+## EULER
+##
+##############################################################################
+
+@eu_manifest = (
+ "euex.etx",
+ "eufm.etx",
+ "eurm.etx",
+ "OMSeu.etx",
+ "OMSeus.etx",
+ "OMSeuss.etx",
+ "OT1eu.etx",
+ "OT1eus.etx",
+ "OT1euss.etx",
+ "eusm.etx",
+ "dotlessj.mtx",
+ "notequal.mtx",
+ "numoff.mtx",
+ "ucgrkoff.mtx",
+ "upsilon.mtx",
+ );
+@eu_fonts = (
+ $masup_, $matyp_, # math fonts---supplier and typeface
+ "eurm", # math `roman'
+ "eusm", # math symbols
+ "euex", # math large symbols
+ "eufm", # fraktur
+ "eurb", # `roman' bold
+ );
+
+if ($mathfam_ eq "eu") {
+%comment = (
+ dotlessj => "creates a virtual dotless j",
+ notequal => "discards equal, asterisk, and plus",
+ numoff => "discards digits",
+ ucgrkoff => "discards U/C Greek letters",
+ upsilon => "renames the upsilon letter properly",
+ );
+}
+
+
+## Here is some special purpose stuff that needs to be added to
+## the beginning of the installation file.
+
+$eu_prelude_ = <<"End_eu_prelude";
+\\declareencoding{TEX MATH ITALIC SUBSET}{eurm}
+\\declareencoding{TEX MATH SYMBOLS SUBSET}{eusm}
+\\declareencoding{TEX TEXT SUBSET}{eufm}
+\\declareencoding{EULER SUBSTITUTIONS ONLY}{euex}
+
+\\pltomtx{euex10}{euex10}
+\\pltomtx{eurm10}{eurm10}
+\\pltomtx{eurm7}{eurm7}
+\\pltomtx{eurm5}{eurm5}
+\\pltomtx{eufm10}{eufm10}
+\\pltomtx{eufm7}{eufm7}
+\\pltomtx{eufm5}{eufm5}
+\\pltomtx{eusm10}{eusm10}
+\\pltomtx{eusm7}{eusm7}
+\\pltomtx{eusm5}{eusm5}
+
+End_eu_prelude
+
+##############################################################################
+##
+## LUCIDA
+##
+##############################################################################
+
+@lu_manifest = (
+ "lbmo.etx",
+ "lbma.etx",
+ "lbms.etx",
+ "lbme.etx",
+ "OMXlu.etx",
+ "OMLluss.etx",
+ "OMLlus.etx",
+ "OMSlu.etx",
+ "OMSlus.etx",
+ "OMSluss.etx",
+ "OT1lus.etx",
+ "OT1luss.etx",
+ "alphoff.mtx",
+ "newlbme.mtx",
+ "newlbmo.mtx",
+ "newlbms.mtx",
+ "notequa.mtx",
+ "numoff.mtx",
+ "ucgrkoff.mtx",
+ "upsilon.mtx",
+ );
+
+@lu_fonts = (
+ $masup_, $matyp_, # math fonts---supplier and typeface
+ "lbmo",
+ "lbms",
+ "lbme",
+ );
+
+if ($mathfam_ eq "lu") {
+%comment = (
+ lbme => "Lucida New Math large symbols",
+ lbms => "Lucida New Math math symbols",
+ lbmo => "Lucida New Math italics",
+ dotlessj => "virtually crafts the dotless j",
+ newlbme => "renames Lucida large symbols to OT1 standard",
+ newlbms => "renames Lucida symbols to OT1 standard",
+ newlbmo => "renames Lucida italic characters to OT1 standard",
+ ucgrkoff => "unsets eppercase Greek letters",
+ upsilon => "renames the upsilon letter properly",
+ notequa => "unsets equal and plus signs",
+ alphoff => "unsets alphabets (U&l/c) and some metric parameters",
+ );
+}
+
+$lu_prelude_ = <<"End_lu_prelude";
+\\declareencoding{TEX MATH ITALIC}{lbmo}
+\\declareencoding{TEX MATH SYMBOLS}{lbms}
+\\declareencoding{LUCIDA MATH EXTENSION}{lbme}
+\\declareencoding{LUCIDA MATH ARROWS}{lbma}
+
+\\pltomtx{lbmo}{lbmo}
+\\pltomtx{lbms}{lbms}
+\\pltomtx{lbme}{lbme}
+
+End_lu_prelude
+
+##############################################################################
+##
+## MATHEMATICA
+##
+##############################################################################
+
+@ma_manifest = (
+ "dotlessj.mtx",
+ "newxht.mtx",
+ "nodotles.mtx",
+ "notequal.mtx",
+ "ucgrkoff.mtx",
+ "unfake.mtx",
+);
+
+## In all arrays storing font name info for math font families,
+## the first two elements contain supplier and typeface info for
+## use by TDS (ignored totally by traditional systems). The remaining
+## elements contain raw font names.
+
+@ma_fonts = (
+ $masup_, $matyp_, # math fonts---supplier and typeface
+ "mmami", # the math italic
+ "mmasy", # the math symbols
+ "mmaex", # math extension (large operator) font
+ );
+
+if ($mathfam_ eq "ma") {
+%comment = (
+ dotlessj => "constructs a virtual dotless j",
+ mmaex => "Mathematica math extension (large symbols) glyphs",
+ mmami => "Mathematica math italic characters",
+ mmasy => "Mathematica math symbols characters",
+ newxht => "restores proper x-height to math italic font",
+ nodotles => "throws Mathematica's dotless i away!",
+ notequal => "discards equal, asterisk, and plus",
+ ucgrkoff => "discards U/C Greek letters",
+ unfake => "declares some math glyphs unfakable",
+ );
+}
+
+
+## Here is some special purpose stuff that needs to be added to
+## the beginning of the installation file.
+$ma_prelude_ = <<"End_ma_prelude";
+
+\\declareencoding{mmaex}{OMX}
+\\declareencoding{mmasy}{OMS}
+\\declareencoding{mmami}{OML}
+
+\\pltomtx{mmaex}{mmaex}
+\\pltomtx{mmasy}{mmasy}
+\\pltomtx{mmami}{mmami}
+
+End_ma_prelude
+
+##############################################################################
+##
+## COMMON MATERIAL FOLLOWS NOW...
+##
+##############################################################################
+
+## VARIOUS COMMON SUBROUTINES
+
+sub pv{# print variable name and value; eg &pv(font);
+ local($tmp) = $_[0];
+ local($var) = $$tmp;
+ print "\[\$$tmp = $var\] ";
+}
+
+sub mpv{ # print multiple variable values
+ foreach $var (@_) {
+ &pv($var);
+ }
+ print "\n";
+ }
+
+sub scale{# divides two numbers, multiplies by 1000, and int's it.
+ local($temp) = 1000 * $_[0]/$_[1] + 0.5;
+ int($temp);
+}
+
+sub smul{# scaled multiplication
+ local($temp) = $_[0]/1000 * $_[1];
+ int($temp);
+}
+
+sub isTDS{
+ defined($texmf_);
+}
+
+sub isfile{
+ -e $_[0];
+}
+
+sub isfileorlink{
+ -e $_[0] or -l $_[0];
+}
+
+sub isdir{
+ -d $_[0];
+}
+
+sub isvariable{
+ defined($_[0]);
+}
+
+sub iscmfont{# is a fontname a Computer Modern font?
+ $_[0] =~ /^cm/i;
+}
+
+sub wlog{# write to a log file only
+ print LOG "$_[0]\n";
+}
+sub display{# print to console only
+ print "$_[0]\n";
+}
+sub dwlog{# display on console and write to log file
+ &wlog($_[0]);
+ &display($_[0]);
+}
+
+sub openlog{#
+ open (LOG, ">$mathpkg_.mlg");
+ &dwlog
+ ("This is MathInst$mathinstver_ + Perl$], ${curday}day, $curdate $now.");
+ &dwlog("Called with options $mathfam_ and $fontfam_.");
+ &dwlog("This is log file $mathpkg_.mlg.");
+}
+sub closelog{
+ close LOG;
+}
+
+sub copy{
+ die "`copy' can't find file $_[0]" unless -e $_[0];
+ open(IN, $_[0]); # the source
+ open(OUT, ">$_[1]"); # the target
+ while (<IN>) {print OUT $_;}
+ close OUT;
+}
+
+sub safecopy{# copy source to target ONLY if target doesn't exist
+ if ((not -e $_[1]) and (not -e "..$sep$_[1]")) { # target doesn't exist
+ &copy(@_);
+ } else {
+ &display("Copy operation skipped; file $_[1] already exists.");
+ }
+}
+
+## Lines in map.sup look like this:
+## a autologi Autologic
+## b bitstrea Bitstream
+
+sub getTDSsupplier{
+ open (SUP, "..${sep}map.sup") or
+ die "Where is supplier file map.sup?";
+ while (<SUP>) {
+ next if /^\#/; # ignore comments
+ last if /^$s/; #
+ }
+ ($s, $supplier, $suppliername) = split(/\s+/, $_, 3);
+ $supplier;
+}
+
+## Lines in map.a2d look like
+## ac acaslon
+## ad agaramon
+## We don't load in the whole file as a hash in case this unduly
+## overloads certain systems.
+
+sub getTDStypeface{
+ open(ATOD, "..${sep}map.a2d") or
+ die "Cannot open map.a2d";
+ $directory = "unknown";
+ $upperbound = $typefam; $upperbound++;
+ $lowerbound = $typefam;
+ while (<ATOD>) {
+ next if /^\#/; # ignore comments
+ chomp $_;
+ last if $_ gt $upperbound;
+ next if $_ lt $lowerbound;
+ ($abb, $dir) = split(/ /, $_, 2);
+ last if $abb eq $typefam;
+ }
+ close ATOD;
+ $directory = $dir if $abb eq $typefam;
+ if ($directory eq "unknown") {
+ print "I couldn't figure out the directory for $fontfam_.\n";
+ print "Help me out by typing a directory name.>> ";
+ $directory = <STDIN>; chomp $directory;
+ while ($directory eq "" or length $directory > 8) {
+ print "$tmp is either too long or too short.";
+ print "Enter another name please.>> ";
+ $directory = <STDIN> ; chomp $directory;
+ }
+ }
+ $directory;
+}
+
+## This rtn takes the @missingdirlist and suggests a script for creating
+## the missing directories, which are stored in @neededdirs.
+$mkdir="mkdir"; # system dependent
+open(SCRIPT, ">mkdirs.bat");
+sub makemkdirs{
+ foreach $miss (@missingdirlist) { # check each missing path
+ $misss = "$miss$sep";
+ $Sep = $sep;
+ $Sep = "\\\\" if $sep eq "\\"; # special case for DOS
+ while ($misss =~ m/$Sep/g) {
+ if (($know_about{$`} == $false) and (not -d $`)) {
+ print SCRIPT "$mkdir $`\n" unless $` eq "";
+ $know_about{$`} = $true;
+ }
+ }
+ }
+ undef %know_about; # preserve resources
+}
+
+sub verifydir{
+ if (not &isdir($_[0])) {
+ $missingdirs++;
+ push(@missingdirlist,$_[0]);
+ }
+}
+sub verifydirs{
+ local($missingdirs)=0;
+ foreach $directory (@_) {
+ &verifydir($directory);
+ }
+ if ($missingdirs == 0) {
+ &display("All directories in place.");
+ } else { # something rotten...
+ &dwlog("Pardon me. Some directories are not present:");
+ foreach $directory (@missingdirlist) {
+ &dwlog(" $directory");
+ }
+ &dwlog("Use `mkdirs' to create them, and rerun your installation.");
+ &makemkdirs; # here's a script for missing directories
+ &dwlog("Use the `mkdirs' script to create them.");
+ }
+}
+sub checkinstallation{# checks that a file list exists in PARENT dir
+ local($missing, @missinglist, @presentlist); $missing = $false;
+ foreach $i (@_) {
+ if (&isfile("..${sep}$i") == $false) {
+ $missing = $true;
+ push(@missinglist, $i);
+ } else {
+ push(@presentlist, $i);
+ }
+ }
+ local($misslist) = join("\n",@missinglist);
+ local($preslist) = join("\n ",@presentlist);
+ &wlog("The files ");
+ &wlog(" $preslist");
+ &wlog("properly located.");
+ &dwlog("Can't find \n $misslist \nfiles...$!")
+ if $missing;
+}
+
+## Problem: bold face weights can be in any of several flavors---
+## bold (b), semibold (s), or demibold (d)---and we don't which we have.
+## We have to test for all of them, stopping as soon as we find something.
+## Similarly for roman-like fonts, which can actually be regular (r),
+## book (k), medium (m), or light (l).
+## The following tiny routine helps make this testing faster.
+
+sub testforfontflavor{
+ local($b) = $_[0];
+ $encvariant = "$lc_encoding_$famvariant";
+ $nfssvar = $nfssencoding{$encvariant};
+ $fullfontname = "$vf_${sep}$fontfam_$_[0]$nfssvar\.vf";
+ $flavor = $b if -e $fullfontname;
+ if ($flavor) { # test for matching italic...
+ TYPE_SEARCH: foreach $italic_type ("i", "o") {
+ $rit = $italic_type
+ if -e
+ "$vf_${sep}$fontfam_$flavor$italic_type$nfssvar\.vf";
+ last TYPE_SEARCH
+ if -e "$vf_${sep}$fontfam_$flavor$italic_type$nfssvar\.vf";
+ }
+ }
+}
+
+
+sub letterheight{# gets the height of the argument
+ local($ascii) = ord($_[0]); # the Ascii code of the glyph $_[0]
+ ## assumes the AFM file has previously been opened
+ while (<AFM>) {last if /C\s+$ascii\s;\s/;}# seeking the glyph
+ $_ =~
+ /[A-Za-z0-9\s]+;[A-Za-z0-9\s]+;[A-Za-z0-9\s]+;\sB\s[-0-9]+\s[-0-9]+\s[0-9]+\s([0-9]+)\s;/;
+ $1;
+}
+
+## This next routines verifies that some text fonts exist (at least
+## that their virtual fonts do) and extracts some metric info re the
+## heights of letters. (The scaling factors for later use by the
+## math fonts is determined here.)
+
+sub verifytextfont{ # eg., &verifytextfont("Roman", "r")
+ $encvariant = "$lc_encoding_$famvariant";
+ $nfssvar = $nfssencoding{$encvariant};
+ $fullfontname = "$vf_${sep}$fontfam_$_[1]$nfssvar\.vf";
+ if (&isfileorlink($fullfontname)) {
+ &display(" Font $fullfontname: found.");
+ } else { # font is missing!
+ &display(" Missing $_[0] $fullfontname ...$!");
+ push (@missingfonts, $fullfontname);
+ }
+}
+
+sub verifytextfonts{
+ local($var) = "r i";# will ident the weights/shapes of fonts
+ local($curfont, $fullfontname);
+ ## $foundfile contains the full path and name of the fd file. It was
+ ## set by the calling routine &DoIt in file 'mathinst'.
+ ## We read this file and examine the first \DeclareFontShape command
+ ## in order to learn the default series. This is usually 'm'
+ ## (medium), but can be something else. In ITC Garamond,eg, it is
+ ## 'bk' (book).
+ if ($foundfile) {
+ open (TMP, $foundfile) || die "Where is $foundfile?";
+ while ($_=<TMP>) {
+ next unless /\\DeclareFontShape/;
+ $_=~ /\\DeclareFontShape{.*T1}{[a-zA-Z0-9]+}{([a-z]+)}{([a-z]+)}/;
+ $thisseries=$1;
+ $thisshape=$2;
+ last;
+ }
+ close TMP;
+ }
+ &dwlog("\nNow verifying text fonts:");
+ undef $flavor; # initialize variable
+ foreach $variant ("r", "k", "m", "l") {
+ &testforfontflavor($variant);
+ last if $flavor;
+ }
+ # We also need the italic variant---italic (usually) or oblique.
+ if ($flavor) {
+ $rreg=$flavor;
+ &verifytextfont("Roman", "$flavor");
+ &verifytextfont("Italic", "${flavor}$rit");
+ } else { # font is missing!
+ &dwlog(" ROMAN-like fonts are all MISSING. Find them!");
+ push (@missingfonts, "Roman");
+ }
+ ## Now for bold fonts...
+ undef $flavor;
+ foreach $variant ("s", "b", "d") {
+ &testforfontflavor($variant);
+ last if $flavor;
+ }
+ if ($flavor) {
+ $rbold=$flavor; # save this variant for later use...
+ &verifytextfont("bold ($flavor)", $rbold);
+ &verifytextfont("bold italic(${rbold}$rit)", "${rbold}$rit");
+ } else { # font is missing...
+ &display(" BOLD-like fonts are all MISSING. Find them!");
+ push (@missingfonts, "Bold");
+ }
+ if (defined @missingfonts) {
+ &dwlog("\nThe following missing fonts NEED to be present:");
+ $tmp = " ".join("\n ", @missingfonts);
+ &dwlog("$tmp");
+ &dwlog("You may wish to find them and run me again.\n");
+ }
+ $nfssbold = $bold2nfss{$rbold};
+ &dwlog("Something wrong with the bold weight $rbold...")
+ unless $nfssbold;
+ &dwlog("My default NFSS weight for these fonts is $nfssbold.")
+ if $flavor ne "b";
+ ## Let's get some metric info we need from the roman .afm file.
+ local($afmfile) = "$afm_${sep}${fontfam_}${rreg}8a.afm";
+ if (&isfile($afmfile)) {# get some font info
+ # we can't rely on the `xheight' info at the top of file, since
+ # sometimes, as in the Bitstream fonts, these values are wrong.
+ open(AFM, $afmfile) || die
+ "Cannot open the file $afmfile. Help...";
+ $capheight = &letterheight("B");
+ $xheight = &letterheight("x");
+ close AFM;
+ &dwlog("\nText font cap height: $capheight units.");
+ &dwlog("Text font x-height: $xheight units.");
+ $textSF7 = &scale($ssize_, 7);
+ $textSF5 = &scale($sssize_, 5);
+ &dwlog("Text font scale factors:");
+ &dwlog(" script: $textSF7");
+ &dwlog(" sscript: $textSF5");
+ } else {
+ &dwlog("I can't find afm file $afmfile, and I desperately need help.");
+ }
+}
+
+sub verifymathfonts{# verify that math fonts are in place
+ local($mathname) = $mathname_{$mathfam_};
+ $mathxheight = $mathxheights_{$mathfam_};
+ local($fontlist) = "${mathfam_}fonts";
+ &dwlog("\nNow verifying math fonts:");
+ foreach $i (2.. $#$fontlist) {
+ if (&isfileorlink("$tfm_${sep}$$fontlist[$i].tfm")) {
+ &dwlog(" Math font: $$fontlist[$i] found.");
+ } else { # font missing
+ &dwlog(" Math font $$fontlist[$i] MISSING!!");
+ &dwlog(" Please find and re-run me!!!");
+ }
+ }
+ $mathSF_ = &scale($xheight, $mathxheight) unless &isvariable($mathSF_);
+ $mathSF7 = &smul($textSF7, $mathSF_);
+ $mathSF5 = &smul($textSF5, $mathSF_);
+ &dwlog("Math font scale factors:");
+ &dwlog(" text: $mathSF_");
+ &dwlog(" script: $mathSF7");
+ &dwlog(" sscript: $mathSF5");
+}
+
+## FOR SPECIAL FONTS: USERS ARE NOT ONLY RESPONSIBLE FOR PROPER NAMING
+## THESE FONTS, BUT ALSO FOR PLACING THEM IN PROPER DIRECTORIES IN TDS
+## SYSTEMS. THE SUPPLIER AND TYPEFACE DIRECTORIES SHOULD BE STORED, EG,
+## IN VARIABLES LIKE $ttsup_ AND $tttyp_.
+
+## The purpose of `verification' is basically to get the x-height of the
+## font from which to compute the scaling factor. As a side purpose,
+## we need to make sure that the font is placed where it's supposed to
+## be. If the font is a bitmap, we don't scale it at all.
+##
+## If the font is an `8r' font (ie, it's name ends in 8r), we look to make
+## sure the corresponding `8a' afm file exists, and then read it for the
+## x-heght. If it's not 8r, we check that an afm with the identical
+## font name exists. If it doesn't we assume it's a bitmap.
+##
+## Routine `verifyspecialfont' tkes 5 parameters---a string designating
+## the font type, the font name, a field to store the height of a given
+## special character, the special character whose height we want (usually
+## an `x'), and the variable to hold the new scale factor. The font types
+## should be drawn from this list:
+## tt (typewriter)
+## ss (sans serif)
+## ca (calligraphy)
+## fr (fraktur)
+## bb (blackboard bold)
+## gb (Greek bold)
+
+$specialfonttypes = "tt ss ca fr bb gb";
+
+## The special font is assumed installed according to
+## the Berry fontnaming scheme.
+## &verifyspecialfont("sans",$sansserif_, "x")
+## IT'S THE USERS RESPONSIBILITY TO MAKE SURE NAMING, INSTALLATION,
+## ETC. FOLLOW THE FONTNAME2.1 CONVENTIONS!!!! Caveat user!
+
+sub deduce_rawfont_from{
+ local($rawfont) = $_[0];
+ if ($rawfont =~ /(7t|8t|9e|9d|9t|9o)$/) {
+ substr($rawfont,-2,2) = "8r";
+ }
+ $rawfont;
+}
+
+sub checkmapfileforafmentry{
+ local($font) = $_[0];
+ local($mapfilepluspath) = "$map_${sep}psfonts.map";
+ open (MAP, $mapfilepluspath) or
+ die "Where the heck is $mapfilepluspath?";
+ while (<MAP>) {
+ $font_is_scalable = $true;
+ last if /$font\s+/;
+ $font_is_scalable = $false;
+ }
+ close MAP;
+}
+
+## The routine makeafmtest checks to see that both an afm file exists
+## for a special file _and_ that an entry exists for it in the map
+## file. If possible, it computes $specxheight as the height of $char.
+
+sub makeafmtest{
+ $rawfont = &deduce_rawfont_from($font);
+ if ($typestyle eq "ss") { # special treatment for sans serif,
+ ## since raw sans serif fonts may contain an `s' variant
+ if (&isfile($pathplusafm)) { # don't make any revisions
+ } else { # try these instead...
+ $pathplusafm =~ s/8a\.afm/s8a\.afm/;
+ $rawfont =~ s/r8r/rs8r/;
+ }
+ }
+ if (&isfile($pathplusafm)) { # afm file exists
+ &checkmapfileforafmentry($rawfont); # entry exist in psfonts.map?
+ if ($font_is_scalable) {
+ $rawfont =~ s/8r/8a/; # points now to un-reencoded font
+ open(AFM, "$pathplusafm") or
+ die "Can't open afm file $pathplusafm.";
+ $specxheight = &letterheight($char);
+ close AFM;
+ }
+ } else { # no afm file
+ $specSF_ = 1000;
+ }
+}
+
+sub deduce_afmname_from{
+ local($font) = $_[0];
+ local($afm) = $font; # default for bitmap and 8a fonts
+ if ($afm =~ /8r/) { # an 8r font
+ $afm =~ s/8r/8a/;
+ }
+ if ($afm =~ /(7t|8t|9e|9d|9t|9o)$/) { # for fontname fonts
+ $afm = substr($font,0,4) . "8a";
+ }
+ $afm;
+}
+
+sub verifyspecialfont{
+ $refheight = $xheight;
+ local($typestyle, $font, $char) = @_;
+ local($styleSFname) = "${typestyle}SF_";
+ while (not $specialfonttypes =~ /$typestyle/) {
+ print "The font type $typestyle must be one of: ";
+ print "$specialfonttypes\nPlease enter a font type>>> ";
+ $typestyle = <STDIN>; chomp $typestyle;
+ }
+ local($myafm_, $mytfm_) = ($afm_, $tfm_);
+ $font_is_scalable = $false; undef $specSF_; undef $specxheight;
+ if (&isTDS) {
+ local($supname, $typname) = ("${typestyle}sup_", "${typestyle}typ_");
+ &dwlog(
+ "WARNING ($supname): I need a TDS supplier directory for $typestyle.")
+ unless $$supname;
+ &dwlog(
+ "WARNING ($typname): I need a TDS typeface directory for $typestyle.")
+ unless $$typname;
+ local($pathname) = "$$supname${sep}$$typname";
+ local($postfix) = "$pathname";
+ $myafm_ = "$texmf_${sep}fonts${sep}afm$sep$postfix";
+ $mytfm_ = "$texmf_${sep}fonts${sep}tfm$sep$postfix";
+ }
+ ## Now to ascertain the nature of the font, and to verify the
+ ## existence of the font for use by TeX.
+ $afm = &deduce_afmname_from($font);
+ if (not &isfile("$mytfm_$sep$font.tfm")) {# no tfm file---BAD NEWS
+ &dwlog("Font $font NOT FOUND! Please install and run MathInst again.");
+ } else { # font found---check for afm
+ local($font_is_scalable) = $true; # just a guess...
+ local($pathplusafm) = "$myafm_$sep$afm.afm";
+ &makeafmtest;
+ }
+ ## We need to save the tfm location for the calligraphic font.
+ $ca_tfm_=$mytfm_ if $typestyle eq "ca";
+ $specSF_ = 1000 if $specSF_ == 0;
+ if ($specxheight) {
+ $specSF_ = &scale($refheight, $specxheight);
+ $$styleSFname = $specSF_ unless $$styleSFname;
+ &dwlog("$typestyle font $font scale factor: $$styleSFname.");
+ } else {# for non-scalable font
+ &dwlog("$typestyle font $font takes natural size.");
+ $$styleSFname = 1000;
+ }
+ $refheight = $xheight; # reset the default
+}
+
+sub verifyspecialfonts{
+ ## Verify tt font...
+ &verifyspecialfont("tt", $tt_, "x") if $tt_;
+ &dwlog("No tt font being installed today.") if not $tt_;
+ ## Blackboard bold...
+ if ($bbold_) {
+ $refheight = $capheight;
+ &verifyspecialfont("bb", $bbold_, "B");
+ } else {
+ &dwlog("No bboard bold font being installed today.");
+ }
+ ## the fraktur
+ &verifyspecialfont("fr", $fraktur_, "x") if $fraktur_;
+ &dwlog("No fraktur font being installed today.") if not $fraktur_;
+ ## the sans serif
+ &verifyspecialfont("ss",$sansserif_,"x") if $sansserif_;
+ &dwlog("No sans serif fonts being installed today.") if not $sansserif_;
+ ## the calligraphic
+ if ($cal_) {
+ $refheight = $xheight;
+ &verifyspecialfont("ca",$cal_,"B");
+ ## Need to recompute SF because cal uses cap heights.
+ $caSF7 = &smul($textSF7, $caSF_);
+ $caSF5 = &smul($textSF5, $caSF_);
+ &dwlog("Calligraphic font $cal_ scale factors:");
+ &dwlog(" text: $caSF_.");
+ &dwlog(" script: $caSF7.");
+ &dwlog(" sscript: $caSF5.");
+ } else {
+ &dwlog("No calligraphic font being installed today.");
+ }
+ ## Finally, uppercase greek font (used for bold math)
+ if (&isvariable($greekbold_)) {
+ &verifyspecialfont("gb", $greekbold_, "x");
+ $gbSF7 = &smul($textSF7, $gbSF_);# grb = Greek bold
+ $gbSF5 = &smul($textSF5, $gbSF_);
+ @gscale = (
+ " scaled $gbSF_",
+ " scaled $gbSF7",
+ " scaled $gbSF5",
+ );
+ &dwlog("Greek bold font $greekbold_ scale factors:");
+ &dwlog(" text: $gbSF_.");
+ &dwlog(" script: $gbSF7.");
+ &dwlog(" sscript: $gbSF5.");
+ } else {
+ &dwlog("No Greek bold font being installed today.");
+ }
+}
+
+
+$FH_ = "STDOUT"; # default value
+sub out{# same as Out, but no automatic \n
+ foreach $str (@_){
+ print $FH_ $str;
+ }
+}
+sub Out{
+ &out(@_, "\n");
+}
+
+open(MAKEPL, ">makepl.bat");
+print MAKEPL "echo \" \" >makepl.mlg\n"; # start things off
+
+## makepl now needs two arguments---the source of the tfm file is the first,
+## and the string giving the font name is the second.
+
+sub makepl{# some existing tfm fonts need a pl file
+ #eg., &makepl($tfm_, "mbvr7t")
+ print MAKEPL "echo \"$_[1]\" >> makepl.mlg\n";
+ print MAKEPL "tftopl $_[0]${sep}$_[1].tfm $_[1].pl >> makepl.mlg\n";
+}
+
+$linelength = 75; # max chars on a line
+sub fancyout{
+ local($tmp) = "%" x $linelength;
+ &Out($tmp);
+ &Out("%%");
+ &Out("%% $_[0]");
+ &Out("%%");
+ &Out($tmp);
+}
+
+## The format for each list of mtx files can have
+## ``arguments''. A number $n$ surrounded by colons
+## (eg, "this :1: is it") will have the colon'ed unit
+## replaced by the appropirate argument in the called
+## routine. (Note, though, the zeroth argument is
+## the format string.) Names surrounded by angle
+## brackets name the array that whose element is used
+## at each font size. For ex, if
+## $test = "This is <a> test:1:",
+## and we call
+## &makemtxlist($test,$wt),
+## then the text font file list becomes
+## "This is $a[0] test$wt"
+## while the script file list
+## becomes
+## "This is $a[1] test$wt"
+## and so on.
+
+## The addcomments routine is used by makemtxlist. It takes a key and a
+## a line. If a hash yields a comments for the key, it is added to
+## the line, padded to the right to make a line of length $linelength
+## characters.
+
+sub addcomments{
+ local($key, $line) = @_;
+ chomp $line; # get rid of newlines if any
+ if ($comment{$key}) {
+ local($comm) = $comment{$key};
+ local($lcomm, $lline) = (length($comm), length($line));
+ local($room) = $linelength - $lline;
+ if ($lcomm > $room) { # no room on line for full comment!
+ $comm = substr($comm, 0, $room);
+ $lcomm = $room;
+ }
+ $line = $line . " " x ($room-$lcomm) . "$comm";
+ }
+ $line .= "\n";
+ $_[1] = $line;
+}
+
+sub makemtxlist{
+ ## Some additional comments for makemath.tex...
+ $comment{"${fontfam_}${rreg}$enc"} = "the Roman glyphs";
+ $comment{"${fontfam_}${rreg}$rit$enc"} = "the italic glyphs";
+ $comment{"${fontfam_}$rbold$enc"} = "the boldface glyphs";
+ $comment{"${fontfam_}rhax"} = "adjustments to the roman math fonts";
+ $comment{"${fontfam_}ihax"} = "adjustments to the italic math glyphs";
+ $comment{"${fontfam_}iskew"} = "adjustments to accents for math italics";
+ $comment{"${fontfam_}${rreg}8r"} ="reencoded font supplies some characters";
+ $comment{"$times_"} = "a raw Times Roman font" if $times_;
+ $comment{"$greekbold_"} = "Greek boldface letters" if $greekbold_;
+ $comment{"$cal_"} = "the calligraphic font" if $cal_;
+ $comment{"${fontfam_}${rreg}8x"} = "the expert font contains oldstyle figs"
+ if $expert;
+ local($temp, $tmp);
+ foreach $i (0 .. 2) {
+ $mtxlist[$i] = $_[0];
+ foreach $j (1 .. $#_) {# deal with all fixed arguments
+ $mtxlist[$i] =~ s/:$j:/$_[$j]/g;
+ }
+ $temp = $mtxlist[$i];
+ while ( $temp =~ /(<([A-Za-z0-9]+)>)/ ) {# are there angle-bracketed args?
+ $tmp = eval "\$$2\[$i\]";
+ $temp =~ s/$1/$tmp/;
+ }
+ $temp =~ s/,/,\%\n /g; # make the list multiline
+ $temp = "\%\n $temp\%\n ";# add initial and final newlines
+ local(@pieces) = split(/\n/, $temp);
+ $temp = ""; # initialize
+ foreach $piece (@pieces) {
+ $piece =~ /\s+([A-Za-z0-9]+)[ ,\%]+/;
+ &addcomments($1, $piece);
+ $temp .= "$piece";
+ }
+ chomp $temp;
+ $mtxlist[$i] = $temp;
+ }
+}
+
+## The fontinst install commands need encoding files. Sometimes, we'll
+## use the defaults, but other times, we'll need special variations on
+## the default. As an example, consider OML. If OML*.etx are not
+## part of the manifest, we can assume the default is sufficient. On
+## the other hand, if there are 2 members, say OMLs.etx and OMLss.etx,
+## it is clear that we use OML for text, OMLs for script, and OMLss for
+## scriptscript. If there are 3 members, OMLmt, OMLmts, and OMLmtss,
+## then these 3 get applied to the text, script, and scriptscript
+## fonts. We use the routine getetx to do the decision work for us.
+## The results are stored in the array @etx_ (that is, $etx_[0], etc).
+## Ex: &getetx("OML",*EUmanifest);
+
+sub getetx{
+ @etx_ = ($_[0], $_[0], $_[0]); # default values
+ local(*tmp) = $_[1];
+ local(@temp);
+ foreach $i (0 .. $#tmp) {
+ if ($tmp[$i] =~ /$_[0]/) {
+ $tmp[$i] =~ s/(.+)\.etx$/$1/; # strip off file extension
+ push(@temp, $tmp[$i]);
+ }
+ }
+ @temp = sort @temp;
+ if ($#temp == 0) {# the case @temp has a single element
+ @etx_ = ($temp[0], $temp[0], $temp[0]);
+ }
+ if ($#temp == 1) {# the case @temp has 2 members
+ @etx_ = ($_[0],$temp[0], $temp[1]);
+ }
+ if ($#temp == 2) {# the case @temp has 3 members
+ @etx_ = @temp;
+ }
+}
+
+## The get_special_tfm routine takes a short string like "ma", "tt", etc
+## and determines the source. Use it as a function:
+## $math_tfm_ = &get_special_tfm("ma");
+
+sub get_special_tfm{
+ local($spec_sup_, $spec_typ_);
+ local($spec_tfm_)=$tfm_; # default; non-TDS system
+ if (&isTDS) {
+ ($spec_sup_, $spec_typ_)=("$_[0]sup_", "$_[0]typ_");
+ $spec_tfm_=
+ "$texmf_${sep}fonts${sep}tfm$sep$$spec_sup_$sep$$spec_typ_";
+ }
+ $spec_tfm_;
+}
+
+sub make_mt_math{# make the MathTime install file
+ ## Set up convenient variables...
+ $tmp = "${mathfam_}_fonts";
+ ($mathital, $mathsym, $mathext) = @$tmp[2,3,4];
+ $reencodedfont = $fontfam_ . "${rreg}8r";
+ $rawfont = $fontfam_ . "${rreg}8a";
+ #$rreg = "r";
+ $wt = $rreg; # the font's weight
+ $comment{"RMTMI"} = "MathTime raw math italic font";
+ $comment{"MTMI"} = "MathTime math italic font";
+ $comment{"MTSY"} = "MathTime math symbols font";
+ $comment{"MTEX"} = "MathTime math extension font";
+ $comment{"cmmi10"} = $comment{"cmmi7"} = $comment{"cmmi5"} =
+ "Computer Modern math italic (for O/S figs)";
+ local(@myexp);
+ # is an expert font available for oldstyle digits?
+ $expert = $false;
+ $expfont = "${fontfam_}r8x";
+ $pathplusexpfont = "$afm_${sep}$expfont.afm";
+ $expert = $true if &isfile($pathplusexpfont);
+ $myexp[0] = $myexp[1] = $myexp[2] = "";
+ @myexp = ("$expfont","$expfont scaled $textSF7","$expfont scaled $textSF5")
+ if $expert;
+ $math_tfm_=&get_special_tfm("ma");
+ $gb_tfm_=&get_special_tfm("gb");
+ $ca_tfm_=&get_special_tfm("ca");
+ $expert_font=$false; # no expert Roman font (default value)
+ $expert_font=$true if &isfile("$afm_${sep}${fontfam_}r8x.afm");
+ print MAKEPL "$cp $afm_${sep}${fontfam_}${rreg}8a.afm .\n"; # local copy
+ print MAKEPL "$cp $afm_${sep}${fontfam_}${rreg}8x.afm .\n" # expert font
+ if $expert_font; # if it exists...
+ &makepl($math_tfm_, "$mathital");
+ &makepl($math_tfm_, "$mathsym");
+ &makepl($math_tfm_, "$mathext");
+ &makepl($tfm_, "${fontfam_}$wt${enc}");
+ &makepl($tfm_, "${fontfam_}${wt}$rit${enc}");
+ if ($expert) {
+ ## &makepl($tfm_, "${fontfam_}${wt}8x");
+ } else {
+ $cmtfmplace = $tfm_; # for traditional systems
+ if (&isTDS) {
+ $cmtfmplace = "$texmf_${sep}fonts${sep}tfm${sep}public${sep}cm";
+ }
+ &makepl($cmtfmplace, "cmmi10");
+ &makepl($cmtfmplace, "cmmi7");
+ &makepl($cmtfmplace, "cmmi5");
+ }
+ if (&isvariable($greekbold_)) {
+ &makepl($gb_tfm_, "$greekbold_"); # pl for greek font
+ &makepl($tfm_, "${fontfam_}$rbold${enc}"); # pl for matching bold
+ }
+ #&makepl($gb_tfm_, "${fontfam_}$rbold${enc}") if &isvariable($greekbold_);
+ &makepl($ca_tfm_, $cal_) if $cal_;
+ local(@mtxlist,$romanmtx,$boldmtx,$italicmtx,$symbolmtx); # the mtx lists
+ @msize = (10,7,5);
+ @mscale = (# math scale factors
+ " scaled $mathSF_",
+ " scaled $mathSF7",
+ " scaled $mathSF5",
+ );
+ @tscale = (# text scale factors
+ "",
+ " scaled $textSF7",
+ " scaled $textSF5",
+ );
+ @calscale = (# Calligraphic scaling info
+ " scaled $caSF_",
+ " scaled $caSF7",
+ " scaled $caSF5",
+ );
+## MATH EXTENSION
+ $exmtx = "mymathex<mscale>,newmtex";
+## MATH ROMAN
+ $romanmtx = "${fontfam_}:1:${enc}<tscale>,accsoff,mymathit<mscale>,";
+ $romanmtx .= "mymathsy<mscale>,${fontfam_}rhax,regreek,";
+ $romanmtx .= "numoff,$times_<mscale>," if &isvariable($times_);
+ $romanmtx .= "unfake";
+## MATH BOLD (only if a greek bold font exists)
+ $boldmtx = "${fontfam_}:1:${enc}<tscale>,accsoff,$greekbold_<tscale>,";
+ $boldmtx .= "mymathit<mscale>,mymathsy<mscale>,";
+ $boldmtx .= "${fontfam_}rhax,unfake";
+## MATH ITALIC
+ $italicmtx = "${fontfam_}iskew,mymathit<mscale>,newrmtmi,alphoff,";
+ $italicmtx .= "${fontfam_}:1:$rit${enc}<tscale>,";
+ #$italicmtx .= "<myexp>," if $expert;
+ if ($expert) { # use expert fonts for oldstyle figs (preferable)
+ $italicmtx .= "<myexp>,";
+ } else { # no choice---get OSF from cmmi<nn>
+ $italicmtx .= "cmmi<msize><mscale>,";
+ }
+ $italicmtx .= "mymathsy<mscale>,dotlessj,${fontfam_}ihax";
+## MATH SYMBOL
+ $symbolmtx = "mymathsy<mscale>,newmtsy,${fontfam_}:1:8r<tscale>,";
+ $symbolmtx = "${symbolmtx}alphoff,$cal_<calscale>";
+ &makemakemath;
+}
+
+sub make_eu_math{
+ $tmp = "${mathfam_}_fonts";
+ ($mathital, $mathsym, $mathext, $mathfrak, $mathitalb) = @$tmp[2,3,4,5,6];
+ $comment{"euex10"} = "Euler large operators";
+ $comment{"cmex10"} = "Computer Modern large operators";
+ $comment{"eurm10"} = $comment{"eurm7"} = $comment{"eurm5"} =
+ "Euler math `italic'";
+ $comment{"eusm10"} = $comment{"eusm7"} = $comment{"eusm5"} =
+ "Euler math symbols";
+ $comment{"eufm10"} = $comment{"eufm7"} = $comment{"eufm5"} =
+ "Euler math fraktur";
+ $comment{"eurb10"} = $comment{"eurb7"} = $comment{"eurb5"} =
+ "Euler bold math `italic'";
+ $comment{"cmmi10"} = $comment{"cmmi7"} = $comment{"cmmi5"} =
+ "Computer Modern math italic";
+ $comment{"cmsy10"} = $comment{"cmsy7"} = $comment{"cmsy5"} =
+ "Computer Modern math symbols";
+ $comment{"cmr10"} = $comment{"cmr7"} = $comment{"cmr5"} =
+ "Computer Modern Roman font";
+ $comment{"harpoons"}="renames harpoon characters";
+ $comment{"euexs"}="renames some ext glyphs to agree with OMX encoding";
+ $comment{"eusyms"}="renames some symbol glyphs to agree with OMS encoding";
+ $reencodedfont = $fontfam_ . "${rreg}8r";
+ $rawfont = $fontfam_ . "${rreg}8a";
+ $wt = $rreg; # the font's weight
+ local(@myexp);
+ # is an expert font available for oldstyle digits?
+ $expert = $false;
+ $expfont = $fontfam_ . "r8x";
+ $fullexpfont = "$afm_${sep}$expfont.afm";
+ $expert = $true if &isfile($fullexpfont);
+ $myexp[0] = ""; $myexp[1] = ""; $myexp[2] = "";
+ $myexp[0] = "$expfont" if $expert == $true;
+ $myexp[1] = "$expfont scaled $textSF7" if $expert == $true;
+ $myexp[2] = "$expfont scaled $textSF5" if $expert == $true;
+ &makepl($tfm_, "${fontfam_}$wt${enc}");
+ &makepl($tfm_, "${fontfam_}${wt}$rit${enc}");
+ ## we use $italb for Greek bold, no matter what was set in eu.par...
+ $greekbold_ = $italb;
+ &makepl($tfm_, "${fontfam_}$rbold${enc}") if $greekbold_;
+ $cmtfmplace = $eutfmplace = $tfm_; # for traditional systems
+ if (&isTDS) {
+ $cmtfmplace = "$texmf_${sep}fonts${sep}tfm${sep}public${sep}cm";
+ $eutfmplace = "$texmf_${sep}fonts${sep}tfm${sep}ams${sep}euler";
+ }
+ $savetfm_ = $tfm_;
+ foreach $i ("10", "7", "5") {
+ $tfm_ = $cmtfmplace;
+ &makepl($tfm_, "cmr$i");
+ &makepl($tfm_, "cmmi$i");
+ &makepl($tfm_, "cmsy$i");
+ $tfm_=$eutfmplace;
+ &makepl($tfm_, "eurm$i");
+ &makepl($tfm_, "eurb$i");
+ &makepl($tfm_, "eufm$i");
+ &makepl($tfm_, "eusm$i");
+ }
+ $tfm_=$eutfmplace;
+ &makepl($tfm_, "euex10");
+ $tfm_=$cmtfmplace;
+ &makepl($tfm_, "cmex10");
+ $ca_tfm_=&get_special_tfm("ca");
+ &makepl($ca_tfm_, $cal_) if $cal_;
+ $tfm_ = $savetfm_; # restore default (if any)
+ local(@mtxlist,$romanmtx,$boldmtx,$italicmtx,$symbolmtx); # the mtx lists
+ local(@msize) = (10,7,5);
+ @mscale = (# math scale factors
+ " scaled $mathSF_",
+ " scaled $mathSF7",
+ " scaled $mathSF5",
+ );
+ @tscale = (# text scale factors
+ "",
+ " scaled $textSF7",
+ " scaled $textSF5",
+ );
+ @calscale = (# Calligraphic scaling info
+ " scaled $calSF_",
+ " scaled $calSF7",
+ " scaled $calSF5",
+ );
+ $exmtx = "$mathext<msize><mscale>,cmex<msize><mscale>,euexs";
+## MATH ROMAN
+ $romanmtx = "${fontfam_}:1:${enc}<tscale>,dotlessj,notequal,ucgrkoff,";
+ $romanmtx = "${romanmtx}numoff,$mathital<msize><mscale>,upsilon,";
+ $romanmtx = "${romanmtx}cmr<msize><mscale>,${fontfam_}rhax";
+## MATH BOLD (only if a greek bold font exists)
+ $boldmtx = "${fontfam_}:1:${enc}<tscale>,dotlessj,notequal,ucgrkoff,";
+ $boldmtx = "${boldmtx}numoff,$mathitalb<msize><mscale>,upsilon,";
+ $boldmtx = "${boldmtx}cmr<msize><mscale>,${fontfam_}rhax";
+## MATH ITALIC
+ $italicmtx = "${fontfam_}iskew,$mathital<msize><mscale>,upsilon,";
+ $italicmtx = "${italicmtx}$mathfrak<msize><mscale>,cmmi<msize><mscale>,";
+ $italicmtx = "${italicmtx}harpoons,${fontfam_}ihax";
+## MATH SYMBOL
+ $symbolmtx = "$mathsym<msize><mscale>,cmsy<msize><mscale>,eusyms";
+ &makemakemath;
+}
+
+sub make_lu_math{
+ ## Set up convenient variables...
+ $tmp = "${mathfam_}_fonts";
+ ($mathital, $mathsym, $mathext) = @$tmp[2,3,4];
+ $reencodedfont = $fontfam_ . "${rreg}8r";
+ $rawfont = $fontfam_ . "${rreg}8a";
+ #$rreg = "r";
+ $wt = $rreg; # the font's weight
+ local(@myexp);
+ # is an expert font available for oldstyle digits?
+ $expert = $false;
+ $expfont = "${fontfam_}r8x";
+ $fullexpfont = "$afm_${sep}$expfont.afm";
+ $expert = $true if &isfile($fullexpfont);
+ $myexp[0] = $myexp[1] = $myexp[2] = "";
+ @myexp = ("$expfont", "$expfont scaled $textSF7", "$expfont scaled $textSF5")
+ if $expert;
+ $math_tfm_=&get_special_tfm("ma");
+ $gb_tfm_=&get_special_tfm("gb");
+ &makepl($math_tfm_, "$mathext");
+ &makepl($math_tfm_, "$mathsym");
+ &makepl($math_tfm_, "$mathital");
+ &makepl($tfm_, "${fontfam_}$wt${enc}");
+ &makepl($tfm_, "${fontfam_}${wt}$rit${enc}");
+ &makepl($gb_tfm_, "${fontfam_}$rbold${enc}") if &isvariable($greekbold_);
+ local(@mtxlist,$exmtx,$romanmtx,$boldmtx,$italicmtx,$symbolmtx);
+ # the mtx lists
+ local(@msize) = (10,7,5);
+ @mscale = (# math scale factors
+ " scaled $mathSF_",
+ " scaled $mathSF7",
+ " scaled $mathSF5",
+ );
+ @tscale = (# text scale factors
+ "",
+ " scaled $textSF7",
+ " scaled $textSF5",
+ );
+ @calscale = (# Calligraphic scaling info
+ " scaled $calSF_",
+ " scaled $calSF7",
+ " scaled $calSF5",
+ );
+## MATH EXTENSION
+ $exmtx = "$mathext<mscale>,newlbme";
+## MATH ROMAN
+ $romanmtx =
+ "${fontfam_}:1:${enc}<tscale>,dotlessj,ucgrkoff,$mathext<mscale>,";
+ $romanmtx .= "upsilon,notequa,$mathsym<mscale>,newlbms,${fontfam_}rhax";
+## No Math Bold in Lucida...
+ undef $greekbold_; # just in case...
+## MATH ITALIC
+ $italicmtx = "${fontfam_}iskew,$mathital<mscale>,newlbmo,upsilon,alphoff,";
+ $italicmtx .= "${fontfam_}:1:$rit${enc}<tscale>,dotlessj,${fontfam_}ihax";
+## MATH SYMBOL
+ $symbolmtx = "$mathsym<mscale>,newlbms";
+ &makemakemath;
+}
+
+sub make_ma_math{# make the Mathematica install file
+ ## Set up convenient variables...
+ $tmp = "${mathfam_}_fonts";
+ ($mathital, $mathsym, $mathext) = @$tmp[2,3,4];
+ $reencodedfont = $fontfam_ . "${rreg}8r";
+ $rawfont = $fontfam_ . "${rreg}8a";
+ #$rreg = "r";
+ $wt = $rreg; # the font's weight
+ local(@myexp);
+ # is an expert font available for oldstyle digits?
+ $expert = $false;
+ $expfont = "${fontfam_}r8x";
+ $pathplusexpfont = "$afm_${sep}$expfont.afm";
+ $expert = $true if &isfile($pathplusexpfont);
+ $myexp[0] = $myexp[1] = $myexp[2] = "";
+ @myexp = ("$expfont", "$expfont scaled $textSF7", "$expfont scaled $textSF5")
+ if $expert;
+ $math_tfm_=&get_special_tfm("ma");
+ $gb_tfm_=&get_special_tfm("gb");
+ $ca_tfm_=&get_special_tfm("ca");
+ $cm_tfm_=$tfm_;
+ $cm_tfm_="$texmf_${sep}fonts${sep}tfm${sep}public${sep}cm" if &isTDS;
+ &makepl($math_tfm_, "$mathital");
+ &makepl($math_tfm_, "$mathsym");
+ &makepl($math_tfm_, "$mathext");
+ &makepl($math_tfm_, "mmamio");
+ &makepl($cm_tfm_, "cmex10");
+ &makepl($tfm_, "${fontfam_}$wt${enc}");
+ &makepl($tfm_, "${fontfam_}${wt}$rit${enc}");
+ &makepl($tfm_, "${fontfam_}${wt}8x") if $expert;
+ if (not $expert) { # if non-experts, pluck OSF from these fonts...
+ &makepl($cm_tfm_, "cmmi10");
+ &makepl($cm_tfm_, "cmmi7");
+ &makepl($cm_tfm_, "cmmi5");
+ }
+ if (&isvariable($greekbold_)) {
+ &makepl($tfm_, "${fontfam_}$rbold${enc}");
+ &makepl($gb_tfm_, $greekbold_);
+ &makepl($math_tfm_, "mmamib");
+ }
+ &makepl($ca_tfm_, $cal_) if $cal_;
+ local(@mtxlist,$romanmtx,$boldmtx,$italicmtx,$symbolmtx); # the mtx lists
+ @msize = (10,7,5); # canonical math sizes
+ @mscale = ( # math scale factors
+ " scaled $mathSF_",
+ " scaled $mathSF7",
+ " scaled $mathSF5",
+ );
+ @tscale = ( # text scale factors
+ "",
+ " scaled $textSF7",
+ " scaled $textSF5",
+ );
+ @calscale = ( # Calligraphic scaling info
+ " scaled $caSF_",
+ " scaled $caSF7",
+ " scaled $caSF5",
+ );
+ $comment{"mmamio"} = "obliqued math italic for UC Greek letters";
+ $comment{"cmex10"} = "get some symbols from CM large symbols font";
+ $comment{"cmmi10"} = $comment{"cmmi7"} = $comment{"cmmi5"} =
+ "Computer Modern math italic (for O/S figs)";
+ $comment{"mma1"} = "need a few symbols from the raw Mathematica font";
+ $comment{"mmagrb"} = "Mathematica's bold greek letters";
+ $comment{"mmamib"} = "Mathematica's bold math italic";
+## MATH EXTENSION
+ $exmtx = "mmaex<mscale>,cmex10";
+## MATH ROMAN
+ $romanmtx = "${fontfam_}:1:${enc}<tscale>,ucgrkoff,notequal,";
+ $romanmtx .= "mma1<mscale>,mmami<mscale>,${fontfam_}rhax,";
+ $romanmtx .= "numoff,$times_<mscale>," if &isvariable($times_);
+ $romanmtx .= "dotlessj,unfake";
+## MATH BOLD (only if a greek bold font exists)
+ $boldmtx = "${fontfam_}:1:${enc}<tscale>,$greekbold_<tscale>,";
+ $boldmtx .= "mmamib<mscale>,";
+ $boldmtx .= "${fontfam_}rhax,unfake";
+## MATH ITALIC
+ $italicmtx = "${fontfam_}iskew,mmami<mscale>,nodotles,";
+ $italicmtx .= "${fontfam_}:1:$rit${enc}<tscale>,ucgrkoff,mmamio,";
+ $italicmtx .= "<myexp>," if $expert;
+ $italicmtx .= "cmmi<msize><mscale>," unless $expert;
+ $italicmtx .= "newxht,dotlessj,${fontfam_}ihax";
+## MATH SYMBOL
+ $symbolmtx = "mmasy<mscale>,$cal_<calscale>";
+ &makemakemath;
+}
+
+## We include the possibility of 3 hooks. Anything to be added
+## at the begining of the makemath file (after \input fontinst.sty
+## but before the \installfonts command) should be stored in
+## a variable called $prelude_. Anything to be included at the end
+## of the file, after \endinstallfonts but before \bye, should
+## be in a variable called $postlude_. If the extension font needs to
+## be generated, create the variable $EX_ with the proper commands.
+## If these variables don't exist, nothing will be done.
+
+sub makemakemath{
+ $FH_ = "MAKEMATH";
+ ## Prelims...
+ &Out("%\&plain\n");
+ &fancyout("This is the file makemath.tex.");
+ &Out(" ");
+ &Out("% Created by MathInst$mathinstver_ on ${curday}day, $today, at $now.");
+ &Out("THIS FILE MAY BE DELETED.");
+ &Out("\n\\input fontinst.sty\n");
+ local($tmp, $curprelude); $tmp = "${mathfam_}_prelude_";
+ $curprelude = $$tmp;
+ &Out($curprelude) if $curprelude;
+ $tmp = "${mathfam_}_postlude_";
+ local($curpostlude) = $$tmp;
+ ## We need a raw font for some operators, etc...
+ &out("\\transformfont{$reencodedfont}{\\reencodefont{8r}");
+ &Out("{\\fromafm{$rawfont}}}");
+ if ($expert) {
+ &Out("\\afmtomtx{${fontfam_}r8x}{${fontfam_}r8x}\n");
+ }
+ &Out("\\installfonts");
+## MATH EXTENSION
+ &fancyout("MATH EXTENSION");
+ &makemtxlist($exmtx);
+ &getetx("OMX", *thismanifest);
+ &Out(" \\installfamily{OMX}{$shortmathpkg_}{}");
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7v}",
+ "{$mtxlist[0]}{$etx_[0]}{OMX}{$shortmathpkg_}{m}{n}{}");
+## MATH ROMAN
+ &makemtxlist($romanmtx,"$rreg");
+ &fancyout("MATH ROMAN");
+ &Out(" \\installfamily{$mathencoding_}{$shortmathpkg_}{}");
+## Math Roman 10pt (text size)
+ &getetx($mathencoding_, *thismanifest);
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7t}",
+ "{$mtxlist[0]}{$etx_[0]}",
+ "{$mathencoding_}{$shortmathpkg_}{m}{n}{<8->}");
+## Math Roman 7pt (script size)
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7t7}",
+ "{$mtxlist[1]}{$etx_[1]}",
+ "{$mathencoding_}{$shortmathpkg_}{m}{n}{<6-8>}");
+## Math Roman 5pt (scriptscript size)
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7t5}",
+ "{$mtxlist[2]}{$etx_[2]}",
+ "{$mathencoding_}{$shortmathpkg_}{m}{n}{<-6>}");
+ ## MATH BOLD? Only if a greek uppercase font exists...
+ if ($greekbold_) {
+ &makemtxlist($boldmtx,$rbold);
+ ## Math bold10pt (text size)
+ &fancyout("MATH BOLD");
+ &Out(" \\installfont{${fontfam_}${rbold}${mathid}7t}",
+ "{$mtxlist[0]}{$etx_[0]}{$mathencoding_}",
+ "{$shortmathpkg_}{${nfssbold}}{n}{<8->}");
+ ## Math bold 7pt (script size)
+ &Out(" \\installfont{${fontfam_}${rbold}${mathid}7t7}",
+ "{$mtxlist[1]}",
+ "{$etx_[1]}{$mathencoding_}{$shortmathpkg_}",
+ "{${nfssbold}}{n}{<6-8>}");
+ ## Math bold 5pt (scriptscript size)
+ &Out(" \\installfont{${fontfam_}${rbold}${mathid}7t5}",
+ "{$mtxlist[2]}{$etx_[2]}",
+ "{$mathencoding_}{$shortmathpkg_}{${nfssbold}}{n}{<-6>}");
+ }
+## MATH ITALIC
+ &makemtxlist($italicmtx,$rreg);
+ &getetx("OML", *thismanifest);
+ &fancyout("MATH ITALIC");
+ &Out("\\installfamily{OML}{$shortmathpkg_}{\\skewchar\\font=127}");
+## Math Italic 10pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7m}{$mtxlist[0]}",
+ "{$etx_[0]}{OML}{$shortmathpkg_}",
+ "{m}{it}{<8->}");
+## Math Italic 7pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7m7}",
+ "{$mtxlist[1]}",
+ "{$etx_[1]}{OML}{$shortmathpkg_}",
+ "{m}{it}{<6-8>}");
+## Math Italic 5pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7m5}",
+ "{$mtxlist[2]}",
+ "{$etx_[2]}{OML}{$shortmathpkg_}",
+ "{m}{it}{<-6>}");
+## MATH SYMBOL
+ &fancyout("MATH SYMBOLS");
+ &makemtxlist($symbolmtx,$rreg);
+ &getetx("OMS", *thismanifest);
+ &Out("\\installfamily{OMS}{$shortmathpkg_}{\\skewchar\\font=48}");
+## Mathsymbol 10pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7y}",
+ "{$mtxlist[0]}{$etx_[0]}{OMS}{$shortmathpkg_}{m}{n}{<8->}");
+## Mathsymbol 7pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7y7}",
+ "{$mtxlist[1]}{$etx_[1]}{OMS}{$shortmathpkg_}{m}{n}{<6-8>}");
+## Mathsymbol 5pt
+ &Out(" \\installfont{${fontfam_}$wt${mathid}7y5}",
+ "{$mtxlist[2]}{$etx_[2]}{OMS}{$shortmathpkg_}{m}{n}{<-6>}\n",
+ "\\endinstallfonts\n");
+## Winding down...
+ &Out($curpostlude) if $curpostlude;
+ &Out("\\bye");
+}
+
+sub makevf{
+ $FH_ = "GETVF";
+ local($prefix) = "${fontfam_}${rreg}${mathid}7";
+ local($mlg) = " > makevf.mlg";
+ &Out("echo \"${prefix}\"v$mlg");
+ local($mlg) = " >> makevf.mlg";
+ &Out("vptovf ${prefix}v.vpl ${prefix}v.vf ${prefix}v.tfm$mlg\n");
+ foreach $i ("t", "m", "y") {# text, italic, symbols
+ foreach $j ("", "7", "5") {
+ &Out("echo \"$prefix$i$j\" $mlg");
+ &Out("vptovf $prefix$i$j.vpl $prefix$i$j.vf $prefix$i$j.tfm$mlg");
+ }
+ &Out("");
+ }
+ if ($greekbold_) {# greek bold math font?
+ local($font_) = "${fontfam_}${rbold}${mathid}7t";
+ &Out("echo \"${font_}\"$mlg");
+ &Out("vptovf $font_.vpl $font_.vf $font_.tfm$mlg");
+ &Out("echo \"${font_}7\"$mlg");
+ &Out("vptovf ${font_}7.vpl ${font_}7.vf ${font_}7.tfm$mlg");
+ &Out("echo \"${font_}5\"$mlg");
+ &Out("vptovf ${font_}5.vpl ${font_}5.vf ${font_}5.tfm$mlg");
+ }
+}
+
+## This routine reads an fd file and discards comments, the `\endinput'
+## statement, and the `\ProvidesPackage' statement. It adds font scaling
+## info specified as an argument to the routine into all
+## `\DeclareFontShape' statements. One catch: scaling info may have
+## been placed in the fd file by fontinst, so we want to catch this and
+## replace it by our current scaling factor.
+
+sub get_fd_info_and_scale_it{
+ local($fdfile, $mysize) = @_;
+ local($pathandfdfile) = "$inputs_${sep}$fdfile.fd";
+ open(FD, $pathandfdfile) or die "Can't find $pathandfdfile. Help";
+ while (<FD>) { # skips comments and ProvidesPackage
+ last if /\\DeclareFontFamily/;
+ }
+ &Out("\n%% Extracting font info from file $fdfile.fd...");
+ FDLINE: for (;;) {
+ if ( $_ =~ /\[\d*\.\d+\]/ ) { # scaling factor found!
+ $_ =~ s/\[\d*\.\d+\]/\[$mysize\]/g;
+ } else { # no s.f. found
+ s/(>\s*)([^<\s])/\1\[$mysize\] \2/g; # AH 21 Mar 97
+ }
+ &out("$_") unless /^%/; # ignore comments
+ last FDLINE if eof(FD);
+ $_ = <FD>;
+ last FDLINE if /\\endinput/;
+ }
+ &Out("%% End of file $fdfile.fd.\n");
+ close FD;
+}
+
+## Sometimes, we have a font name from which we want to deduce the
+## fd file which describes it. This next routine helps.
+
+sub deduce_fdfile_from{
+ local($fam) = substr($_[0],0,3);
+ local($fdname) = "${encoding_}$fam";
+ $fdname;
+}
+
+## We often need the NFSS family from a font name. If it ends in 7t, 8t,
+## 9e,9d, 9t, 90, then the first 3 chars are the family. Otherwise,
+## replace all digits by nulls (cmtt10 --> cmtt)
+
+sub deduce_fontfam_from{
+ local($spfont) = $_[0]; local($fontfam);
+ if ($spfont =~ /(7t|8t|9e|9d|9t|9o)$/) { # a fontname font
+ $fontfam = substr($spfont,0,3);
+ } else { # a bitmap font
+ $fontfam = $spfont;
+ $fontfam =~ s/\d+//; # eliminate all digits
+ }
+ $fontfam;
+}
+
+## The plain macros use the next routine to get the four members
+## (up, up italic, bold, bold italic) of the sansserif.
+
+sub deduce_family_members_from_font{
+ local($spfont) = $_[0]; local($r,$ri,$b,$bi,$fam,$end);
+ local($tfmplace) = $tfm_;
+ if ( $spfont =~ /(8a|8r|7t|8t|9e|9d|9t|9o)$/ ) { # a fontname font
+ $fam = $`; chop $fam;
+ $end = $&;
+ $tfmplace = "$texmf_${sep}fonts${sep}tfm$sep$sssup_$sep$sstyp_"
+ if &isTDS;
+ $r = $spfont;
+ $ri = "${fam}ro$&"; # default is oblique
+ $ri = "${fam}ri$&" if -e "$tfmplace${sep}${fam}ri$&\.tfm";
+ $b = $r; $bi = $ri; # defaults: bold are same as regular
+ $b = "${fam}b$&" if -e "$tfmplace${sep}${fam}b$&\.tfm";
+ $bi = "${fam}bi$&" if -e "$tfmplace${sep}${fam}bi$&\.tfm";
+ } else { # cm, bitmap font
+ $fam = $spfont;
+ $fam =~ s/(\d+)$//;
+ $r = "$spfont";
+ $ri = "${fam}i$&";
+ $b = "${fam}b$&";
+ $bi = "${fam}bi$&";
+ }
+ ($r, $ri, $b, $bi);
+}
+
+sub makelatexstyle{
+ $fontfamx_ = $fontfam_;
+ $fontfamx_ = "${fontfam_}x"
+ if &isfile("$inputs_/$mathencoding_${fontfam_}x.fd");# expert fonts?
+ $stylefile = "z$_[0]$fontfam_.sty";
+ open(LTXSTY, ">$stylefile");
+ $FH_ = "LTXSTY";
+ &Out("%% Created by MathInst$mathinstver_ on $curday, $today at $now.");
+ &Out("%% This is a LaTeX style file for MathTime + $fontfam_ fonts.\n");
+ &Out("\\ProvidesPackage{z$_[0]$fontfam_}\n");
+ &Out("\n%% The gory details...");
+ &out("\\SetSymbolFont{operators}{normal}{$mathencoding_}");
+ &Out("{$shortmathpkg_}{$reg2nfss{$rreg}}{n}");
+ &out("\\SetSymbolFont{letters}{normal}{OML}");
+ &Out("{$shortmathpkg_}{m}{it}");
+ &out("\\SetSymbolFont{symbols}{normal}{OMS}");
+ &Out("{$shortmathpkg_}{m}{n}");
+ &Out("\\SetSymbolFont{largesymbols}{normal}{OMX}{$shortmathpkg_}{m}{n}\n");
+ &out("\n\\SetMathAlphabet{\\mathit}{normal}{$mathencoding_}");
+ &Out("{$fontfamx_}{$reg2nfss{$rreg}}{$ital2nfss{$rit}}");
+ &out("\\SetMathAlphabet{\\mathbf}{normal}{$mathencoding_}");
+ if (&isvariable($greekbold_)) {# real math bold font exists!
+ &Out("{$shortmathpkg_}{$nfssbold}{n}");
+ } else {# use standard text bold
+ &Out("{${fontfamx_}}{$nfssbold}{n}");
+ }
+ &out("\\SetSymbolFont{operators}{bold}{$mathencoding_}");
+ &Out("{$shortmathpkg_}{$nfssbold}{n}");
+ &out("\\SetSymbolFont{letters}{bold}{OML}");
+ &Out("{$shortmathpkg_}{$nfssbold}{it}");
+ &out("\n\\SetMathAlphabet{\\mathit}{bold}{$mathencoding_}");
+ &Out("{$fontfam_}{$nfssbold}{it}");
+ if (&isvariable($greekbold_)) {# greek bold => special math bold
+ &out("\\SetMathAlphabet{\\mathbf}{bold}{$mathencoding_}");
+ &Out("{$shortmathpkg_}{$nfssbold}{n}");
+ } else {
+ &out("\\SetMathAlphabet{\\mathbf}{bold}{$mathencoding_}");
+ &Out("{$fontfam_}{$nfssbold}{n}");
+ }
+ &Out("\n\\renewcommand{\\rmdefault}{$fontfamx_}");
+ &Out("\\renewcommand{\\encodingdefault}{$mathencoding_}");
+ &Out("\\renewcommand{\\seriesdefault}{$thisseries}")
+ unless $thisseries eq "m";
+ &Out("\\renewcommand{\\shapedefault}{$thisshape}")
+ unless $thisshape eq "n";
+ $nfssbold=$bold2nfss{$rbold};
+ &Out("\\renewcommand{\\bfdefault}{$nfssbold}");
+ # Now, the tt font.
+ if ($tt_) {
+ &Out("\n%% Typewriter fonts.");
+ local($ttsize) = sprintf("%5.3f", $ttSF_ / 1000);
+ local($ttfam) = &deduce_fontfam_from($tt_);
+ if (-e "$inputs_$sep${encoding_}$ttfam.fd") {
+ &get_fd_info_and_scale_it("${encoding_}$ttfam", $ttsize);
+ } else { # no fd file for tt...
+ &out("\\DeclareFontFamily\{$encoding_\}\{$ttfam\}");
+ &Out("\{\\hyphenchar \\font\\m\@ne\}");
+ &out(" \\DeclareFontShape{$encoding_}");
+ &Out("{$ttfam}{m}{n}{<-> [$ttsize] $tt_}{}\n");
+ }
+ &Out("\\renewcommand{\\ttdefault}{$ttfam}");
+ &out("\\SetMathAlphabet{\\mathtt}{normal}{$encoding_}");
+ &Out("{\\ttdefault}{m}{n}");
+ }
+ # Now, the sans serif info.
+ if ($sansserif_) {
+ &Out("\n%% Sans serif fonts.");
+ local($sssize) = sprintf("%5.3f", $ssSF_ / 1000);
+ local($ssfam) = &deduce_fontfam_from($sansserif_);
+ if (-e "$inputs_$sep${encoding_}$ssfam.fd") {
+ &get_fd_info_and_scale_it("${encoding_}$ssfam", $sssize);
+ } else { # no fd file for tt...
+ &Out("\\DeclareFontFamily\{$encoding_\}\{$ssfam\}\{\}");
+ &out(" \\DeclareFontShape{$encoding_}");
+ &Out("{$ssfam}{m}{n}{<-> [$sssize] $sansserif_}{}\n");
+ }
+ &Out("\\renewcommand{\\sfdefault}{$ssfam}");
+ &out("\\SetMathAlphabet{\\mathsf}{normal}{$encoding_}");
+ &Out("{\\sfdefault}{m}{n}");
+ }
+ if (&isvariable($cal_)) {
+ local($calsize) = sprintf("%5.3f", $caSF_ / 1000);
+ &Out("\n%% Math Calligraphic.");
+ &Out("\\DeclareFontFamily{$mathencoding_}{cal}{}");
+ &out("\\DeclareFontShape{$mathencoding_}");
+ &Out("{cal}{m}{it}{<-> [$calsize] $cal_}{}");
+ &Out("\\newcommand{\\caldefault}{cal}");
+ &out("\\SetMathAlphabet{\\mathcal}{normal}{$mathencoding_}");
+ &Out("{\\caldefault}{m}{it}");
+ }
+ if (&isvariable($fraktur_)) {
+ local($fraksize) = sprintf("%5.3f", $frSF_ / 1000);
+ &Out("\n%% Math Fraktur.");
+ &Out("\\DeclareFontFamily{$mathencoding_}{frak}{}");
+ &out("\\DeclareFontShape{$mathencoding_}");
+ &Out("{frak}{m}{n}{<-> [$fraksize] $fraktur_}{}");
+ &Out("\\newcommand{\\frakdefault}{frak}");
+ &out("\\DeclareMathAlphabet{\\mathfr}{$mathencoding_}");
+ &Out("{\\frakdefault}{m}{n}");
+ }
+ if (&isvariable($bbold_)) {
+ local($bbsize) = sprintf("%5.3f", $bbSF_ / 1000);
+ &Out("\n%% Math Blackboard Bold.");
+ &Out("\\DeclareFontFamily{$mathencoding_}{bbold}{}");
+ &out("\\DeclareFontShape{$mathencoding_}");
+ &Out("{bbold}{m}{n}{<-> [$bbsize] $bbold_}{}");
+ &Out("\\newcommand{\\bbdefault}{bbold}");
+ &out("\\DeclareMathAlphabet{\\mathbb}{$mathencoding_}");
+ &Out("{\\bbdefault}{m}{n}");
+ }
+ &out("\n\\renewcommand{\\l}{\\char170\\relax} "); # since lslashslash
+ &Out("\\renewcommand{\\L}{\\char138\\relax} "); # doesn't exist
+ &Out($mt_hax) if $_[0] eq "mt";
+ &Out($lu_hax) if $_[0] eq "lu";
+ &Out("\n\\endinput");
+ close LTXSTY;
+}
+
+$mt_hax = <<'EOMTHax';
+
+%% Now for some hacks...
+
+\mathchardef\varkappa="0180
+\mathchardef\comp="2181
+\def\vec{\mathaccent"717E }
+\mathchardef\Relbar="3280
+\mathcode`\;="6281
+EOMTHax
+
+$lu_hax = <<'EOLUHax';
+
+%% Now for some hacks...
+
+\def\joinrel{\mathrel{\mkern-6mu}}
+\mathchardef\Relbar="3280
+\mathcode`\;="6281
+
+\catcode`\@=11
+\def\Lbrack{\delimiter"4382384 }
+\def\Rbrack{\delimiter"5383385 }
+\mathchardef\surfint="1390 \mathchardef\lsurfint="1394
+\mathchardef\lointop="1393 \def\loint{\lointop\nolimits}
+\mathchardef\lintop="1392 \def\lint{\lintop\nolimits}
+\def\@intrad{\radical"352392 }% ``radicalized'' integral sign
+\def\@ointrad{\radical"348393 }% ``radicalized'' contour integral
+\def\@sintrad{\radical"390394 }% ``radicalized'' surface integral
+\newtoks\@subtoks \newtoks\@suptoks
+\def\varint{\@int{\@intrad}}
+\def\varoint{\@int{\@ointrad}}
+\def\varsint{\@int{\@sintrad}}
+\def\@int#1{\@subtoks={}\@suptoks={}\let\@limits=\nolimits
+ \let\@thisint=#1
+ \futurelet\@nextchar \@testnextchar}
+\def\@testnextchar{\let\next=\@getintegrand
+ \ifx\@nextchar_ \let\next=\@getsubscript\fi
+ \ifx\@nextchar^ \let\next=\@getsuperscript\fi
+ \next}
+\def\@getsubscript_#1{\@subtoks=\expandafter{#1}%
+ \futurelet\@nextchar \@testnextchar}
+\def\@getsuperscript^#1{\@suptoks=\expandafter{#1}%
+ \futurelet\@nextchar \@testnextchar}
+\def\@getintegrand{\mathpalette\@integrand}
+\def\@integrand#1#2{\setbox0=\hbox{$\m@th #1 #2$}\dimen@=\ht0
+ \advance\dimen@ by\dp0 \mathop{\vcenter{\hbox{$\@thisint{%
+ \vcenter to\dimen@{}}$}}}\@limits^{\the\@suptoks}_{\the\@subtoks}%
+ \box0}
+\def\setlimits{\global\let\@limits=\limits}
+\def\setnolimits{\global\let\@limits=\nolimits}
+\catcode`\@=12
+EOLUHax
+
+sub makeplainstyle{
+ $stylefile = "z$_[0]$fontfam_.tex";
+ local($mysize);
+ open(PLNSTY, ">$stylefile");
+ $FH_ = "PLNSTY";
+ require("..${sep}plainsty.tpl") or die "Where is the plain template?";
+ close PLNSTY;
+}
+
+sub makeLaTeXtestfile{
+ $q = q!"!;
+ $FH_ = "LTXTEST";
+ open($FH_, ">testmath.tex");
+ require("..${sep}testmath.tpl");
+ &out($Caltest) if $cal_;
+ &out($Sanstest) if $sansserif_;
+ &out($Fraktest) if $fraktur_;
+ &out($BBoldtest) if $bbold_;
+ &out($DD);
+ close $FH_;
+}
+
+sub makeplaintestfile{
+ $FH_ = "PLNTEST";
+ open($FH_, ">testmatp.tex");
+ require("..${sep}testmatp.tpl");
+ &out($GreekBoldTest) if $greekbold_;
+ &out($CalTest) if $cal_;
+ &out($SansTest) if $sansserif_;
+ &out($FrakTest) if $fraktur_;
+ &out($BBoldTest) if $bbold_;
+ &out($BBplain);
+ close $FH_;
+}
+
+sub makecleanupfile{
+ $FH_ = "PUTFONTS";
+ open($FH_, ">putfonts.bat");
+ if (&isTDS) {
+ &Out(
+ "$mv \*.vf $texmf_${sep}fonts${sep}vf${sep}$installer_${sep}$mathpkg_");
+ &Out(
+ "$mv \*.tfm $texmf_${sep}fonts${sep}tfm${sep}$installer_${sep}$mathpkg_");
+ &Out("$mv z\*.tex $texmf_${sep}tex${sep}plain${sep}mathinst");
+ &Out("$mv z\*.sty $texmf_${sep}tex${sep}latex${sep}mathinst");
+ } else { # traditional systems
+ &Out("$mv \*.vf $vf_");
+ &Out("$mv \*.tfm $tfm_");
+ &Out("$mv z\*.\* $inputs_");
+ }
+ ## Everyone...
+ &Out("$mv \*.fd $inputs_");
+ close $FH_;
+ ## Now to change executables to `execute' status for Unix systems...
+ if ($sep eq "/") {
+ chmod 0755, "mkdirs.bat" if -e "mkdirs.bat";
+ local($cnt) = chmod 0755, "makepl.bat", "makevf.bat", "putfonts.bat";
+ &Out("I couldn't make the .bat files executable. Check permissions.")
+ if $cnt == 0;
+ }
+}
+
diff --git a/fonts/utilities/mathinst/mathinst.tex b/fonts/utilities/mathinst/mathinst.tex
new file mode 100644
index 0000000000..f73cd90432
--- /dev/null
+++ b/fonts/utilities/mathinst/mathinst.tex
@@ -0,0 +1,664 @@
+%&latex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mathinst.tex, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+
+\newcommand{\mathinst}{{\it MathInst\/}}\let\MathInst=\mathinst
+\let\tex=\TeX \let\latex=\LaTeX
+\font\mffont=logo10
+\def\mf{{\mffont META}\-{\mffont FONT}}
+\newcommand{\vfinst}{{\it VFinst\/}}
+\def\ang<#1>{$\langle$\textnormal{\textit{#1}}$\rangle$}
+
+\title{The MathInst Package (version 1.0): New Math Fonts for \TeX}
+\author{Alan Hoenig}
+
+\begin{document}
+
+\maketitle
+
+If you've ever wanted to typeset proper mathematics using Caslon or
+Garamond or Baskerville or whatever types, \mathinst\ may be of use to
+you. It allows you to create proper math fonts for use by \TeX\ and
+\LaTeX. You need to tell it the family of Roman types you want to use
+and the raw math fonts---MathTime, Euler, Lucida New Math, or
+Mathematica---you can supply, and this script does the rest. All of
+\mathinst's fonts are properly scaled for compatibility with the Roman
+fonts.
+
+If you supply the name of a typewriter and sans serif font as well,
+MathInst will not only create fonts that respond to the \textsc{nfss}
+commands \verb+\mathsf+ and \verb+\mathtt+, it will also scale these
+fonts properly to match the Roman math fonts.
+
+If you supply the name of a calligraphic, fraktur, blackboard bold,
+and Greek bold font, \mathinst\ will create matching fonts and commands
+for their use. In particular, if a Greek bold is present, \mathinst\
+will create bold math fonts.
+
+\mathinst\ also creates two style files---one for use by \textsc{nfss}
+(\LaTeX) and one for plain \TeX. There are also two matching test
+files, so you can not only test the fonts, but see how to access these
+fonts in a \TeX\ document.
+
+At the end, \mathinst\ places all your new fonts in their proper places,
+whether you use a traditional or a \textsc{tds} \TeX\ system.
+
+For many additional details, please read the remainder of this
+document. All the \mathinst\ material can be found in the {\tt
+fonts/utilities/mathinst} area of \textsc{ctan}. Please forward
+comments and bug reports to me (Alan Hoenig) at {\tt
+ajhjj@cunyvm.cuny.edu}.
+
+This current version contains several bug fixes, and benefited
+immensely from some mighty bug-catchers, including David Ness, Karen
+Ettinger, Christian Burger, Erik Luijten, and Jens-Peer Kuska.
+
+\section{Background; purpose; description}
+Although there are hundreds of outline fonts that \tex\ can use to
+typeset non-technical material, it remains difficult to typeset
+technical documents using typefaces other than Computer Modern.
+Difficulties remain even when special math fonts are made available
+(such as Hermann Zapf's Euler fonts or the MathTime fonts), because
+specialized knowledge is needed to integrate the math fonts with the
+text fonts. It is the purpose of the \mathinst\ software to perform
+this integration for an author or typesetter. Providing the author is
+willing to make some reasonable compromises, hundreds of new math
+families are now available. The \mathinst\ software itself knows
+about four families of raw math fonts---MathTime, Lucida New Math,
+Euler, and Mathematica.
+
+Here's what will be the result of a proper \mathinst\ font generation:
+\begin{enumerate}
+ \item math fonts properly integrating raw math fonts with a given text
+ font family;
+ \item a macro file for users of plain \tex\ which properly integrates
+ the new fonts;
+ \item a style file for \latex\ users which integrates the new fonts
+ into the \textsc{nfss};
+ \item test files for both plain \tex\ and \latex\ users which
+ demonstrate the use of the new fonts;
+ \item several log files which record aspects of the installation; and
+ \item a script for placing all fonts and other files in their proper
+ locations.
+\end{enumerate}
+In addition, the software checks to see if all target directories have
+been created. If not, a script has
+been prepared which will create the missing directories for you. This
+might be useful, for example, in preparing the many directories
+required by the \textsc{tds} (\tex\ Directory Structure) standard.
+
+The \mathinst\ software will work for ``traditional'' \tex\ systems
+(where all tfm's go in one place, all vf's in another, and so on) or
+for the newer \textsc{tds} systems.
+
+Standard math font families consist of text fonts plus special math
+fonts. If you supply certain additional fonts, \mathinst\ will
+integrate these other fonts in the math superfamilies. These optional
+additions include:
+\begin{enumerate}
+ \item a typewriter font family;
+ \item a sans serif font family;
+ \item a fraktur font;
+ \item a Blackboard Bold font;
+ \item a calligraphic font; and
+ \item a Greek bold font (for proper bold math fonts)
+\end{enumerate}
+Commands to typeset with these fonts are part of the styles that
+\mathinst\ creates; the test files contain examples illustrating their use.
+\mathinst\ takes great care to scale all fonts so the final fonts have
+an $x$-height identical to the original text fonts. This way, we obtain
+the highest degree of visual compatibility
+between otherwise disparate fonts.
+
+\subsubsection{What you will need}
+Here's what you'll need to run the software.
+\begin{itemize}
+ \item The modules themselves have been written in Perl (Perl5,
+ actually), so you'll need a Perl executable placed somewhere on your
+ computer's search path. Perl is freely available for virtually every
+ computer platform; you'll need to check out software archives to get
+ hold of this language.
+ \item You'll also need a version~1.5 or greater of
+ {\it fontinst\/}, available from \textsc{ctan} in
+ the area \texttt{fonts/utilities/fontinst/inputs}. (Retrieve all
+ these files and place them in a \texttt{texinputs} directory.)
+ \item You'll need a copy of Damian
+ Cugley's {\tt pdcfsel} font selection scheme for plain \tex, which you
+ can get in the \texttt{macros/plain/contrib/pdcmac} section of
+ \textsc{ctan}. (Retrieve the two files \texttt{pdccode.tex} and
+ \texttt{pdcfsel.dtx} from that directory and place them in a work
+ directory. Run the \texttt{pdcfsel.dtx} through plain \TeX\ with a
+ command like {\tt tex \&plain pdcfsel.dtx}; this
+ generates the documentation file \texttt{pdcfsel.dvi} for
+ \texttt{pdcfsel} and the package itself \texttt{pdcfsel.tex} which
+ should be placed in a directory \TeX\ knows how to read from.)
+ \item You'll need to install your text fonts {\bf strictly\/}
+ according to the {\tt fontname2.1} standards. Information in the
+ \texttt{info/fontname} section of \textsc{ctan} explains this standard
+ in detail. Two freely available tools assist in this kind of
+ installation:
+ \begin{enumerate}
+ \item \texttt{psnfss} by Sebastian Rahtz, and
+ \item \vfinst\ by me; available in the {\tt
+ fonts/utilities/vfinst} area of \textsc{ctan}.
+ \end{enumerate}
+ \item You need a version of \TeX\ that understands virtual fonts.
+ Furthermore, you should configure your \TeX\ so that it knows to
+ read input from its current directory, and the parent directory to
+ this (as well as to other more conventional input directories).
+\end{itemize}
+
+\subsection{Platforms}
+The version supplied here runs under Unix and WindowsNT4.0.
+
+\subsection{Legal jargon and caveats}
+This software is distributed according to the terms of the GNU
+`copyleft' agreement. In addition, please note that if you make any
+alterations to any of the files in this package, you must change the
+names of the altered files. You are allowed to freely use this
+material and to pass it along (in the unaltered state!) provided you
+will not be using it to make money; otherwise, you must get in touch
+with me to secure permission.
+
+While the author hopes that it will prove useful, it is distributed
+with no guarantee or warranty whatsoever. Users should take
+\textsc{great care} to carefully back up their data before using.
+
+\section{Installing MathInst}
+Basic installation of this material involves placing files in proper
+directories. Thereafter, a few parameters need to be adjusted for
+your system.
+
+Create a separate directory with a name like {\tt mathinst} (say)
+somewhere on your system and place all the \mathinst\ software there.
+
+Create a working directory, with a name like {\tt work} directly below
+this directory. We'll call this directory the \mathinst\ working
+directory.
+
+\subsubsection*{Customizing the installation}Once the \mathinst\
+modules are in place, you'll need to make to adjustments to some or
+all of the \verb|par| parameter files that pertain to an installation.
+{\em\mathinst\ will not run properly---and may not run at all---if
+these parameters are not set properly.} The parameter files are
+\verb|mt.par|, \verb|lu.par|, \verb|eu.par|, or \verb|ma.par|
+depending on which math fonts---MathTime, Lucida, Euler, or
+Mathematica---you'll be using. Once these variables have been set,
+\mathinst\ has been completely installed.
+
+These \verb|par| files all follow the same format.
+Several variables at the beginning record the location of
+important files, and all these statements follow Perl
+syntax---variable names that begin with \verb|$|, double quotes around
+strings, and statements ending with semicolons. Use the
+existing statements in the distribution files as models.
+For a typical traditional
+system, these variables have the following values.
+\begin{verbatim}
+$psfonts_ = "/psfonts";
+$afm_ = "$psfonts_/afm";
+$vf_ = "/usr/lib/tex/fonts/vf";
+$tfm_ = "/usr/lib/tex/fonts/tfm";
+$map_ = "/usr/lib/tex/ps";
+$inputs_ = "/usr/lib/tex/inputs";
+$texmf_ = "/usr/local";
+$installer_ = "vfinst";
+\end{verbatim}
+Table~\ref{mathinst-places}\ lists these variables and their
+meanings. The variable \verb|$texmf_| must {\bf only} be defined if your
+\tex\ system conforms to the \textsc{tds} standard (in which case,
+\mathinst\ ignores \verb|$psfonts_|,
+\verb|$afm_|, \verb|$vf_|, and \verb|$tfm_|;
+and \verb|$inputs_| holds
+the path where the \verb|fd| files are). In a \textsc{tds} system,
+\mathinst\ also needs a value for \verb|$installer_|.
+
+\begin{table}
+ $$\vbox{\halign{\tt#\hfil\quad&\vtop{\hsize=2.75in
+ \noindent#\smallskip}\cr
+ \$psfonts\_&Where the outline font files are.\cr
+ \$afm\_&Where the outline font metric files are.\cr
+ \$vf\_&Where the \tex\ virtual font {\tt.vf} files are.\cr
+ \$tfm\_&Where the \tex\ font metric {\tt.tfm} files are.\cr
+ \$map\_&Where the {\tt dvips} map file {\tt psfonts.map} sits.\cr
+ \$inputs\_&Where is a \tex\ input directory?\cr
+ \$texmf\_&What is the root TDS directory?\cr
+ \$installer\_&What installed the text fonts (vfinst or psnfss)?\cr
+ }}
+ $$
+ \caption{\label{mathinst-places}Some variables and their meanings.}
+\end{table}
+
+Following these variables are a list of variables recording the names
+of the math fonts as they are on your system. Adjust them as
+necessary.
+
+For the moment, leave the next few variables:
+\begin{itemize}
+ \item \verb|$ssize_| and \verb|$sssize_|;
+ \item \verb|$encoding_|;
+ \item a collection of variables with names like \verb|$tt_|,
+ \verb|$sansserif_|, and so on; and
+ \item a set of variables, all of which end in \verb|...SF_|
+\end{itemize}
+commented out. In a
+Perl script, the
+comment character \verb|#| works in the same way as the percent character
+\verb|%| works in a \tex\ file. The default value for the
+\verb|$encoding_| variable is OT1; you may change it now to {\tt ot1}
+\begin{verbatim}
+$encoding_ = "ot1";
+\end{verbatim}
+if you know for sure you are using all lowercase file names.
+
+\subsection{Installing raw math fonts}%
+The {\em raw\/} math fonts consist of a series of outline font files plus the
+associated \verb|afm| and \verb|tfm|
+files. It's easy to install these fonts. Here
+are the steps appropriate for traditional systems.
+\begin{enumerate}
+ \item Place the math font files with the other scalable fonts.
+ \item Place the \verb|afm| files with your other \verb|afm| files.
+ \item Place the \verb|tfm| files where they belong.
+ \item Make sure a proper entry exists for each math font in the
+ \verb|map| file for your \verb|dvi| postprocessor.
+\end{enumerate}
+Only the last point requires additional comments.
+For example, for the {\tt dvips} \verb|psfonts.map| file,
+we need entries like
+{\fontsize{9}{10}\selectfont
+\begin{verbatim}
+%% MathTime fonts...
+ mtsy MTSY <mtsy.pfa
+ mtex MTEX <mtex.pfa
+ rmtmi RMTMI <rmtmi.pfa
+%% Lucida New Math fonts...
+ lbma LucidaNewMath-Arrows <lbma.pfb
+ lbme LucidaNewMath-Extension <lbme.pfb
+ lbms LucidaNewMath-Symbol <lbms.pfb
+ lbmi LucidaNewMath-Italic <lbmi.pfb
+ lbmo LucidaNewMath-AltItalic <lbmo.pfb
+%% Mathematica Math fonts...
+ Math1 Math1 <Math1.pfb
+ Math2 Math2 <Math2.pfb
+ Math3 Math3 <Math3.pfb
+ Math4 Math4 <Math4.pfb
+ Math5 Math5 <Math5.pfb
+\end{verbatim}
+}Note that these fonts are proprietary; please respect the licenses
+under which these fonts are sold or distributed.
+
+Alone of the special math fonts, the Euler fonts are in the public
+domain.
+These fonts were implemented by \mf, and proper installation consists
+in placing the \verb|tfm| and \verb|pk| files
+with their mates on your system.
+However, we will often be scaling these slightly to match various text fonts,
+and rather than regenerate many new bitmap fonts, it may be easier to
+use the scalable versions of these fonts, also available for free
+(courtesy of Basil Malyshev;
+they may be found in the \verb|fonts/postscript/bakoma|
+section of \textsc{ctan}).
+In this case, these fonts will also need entries in
+your \verb|map| file. These entries should look something like
+{\fontsize{9}{10}\selectfont
+\begin{verbatim}
+%% Euler fonts...
+ euex10 euex10 <euex10.pfb
+ eufb10 eufb10 <eufb10.pfb
+ eufb5 eufb5 <eufb5.pfb
+ eufb7 eufb7 <eufb7.pfb
+ eufm10 eufm10 <eufm10.pfb
+ eufm5 eufm5 <eufm5.pfb
+ eufm7 eufm7 <eufm7.pfb
+ eurb10 eurb10 <eurb10.pfb
+ eurb5 eurb5 <eurb5.pfb
+ eurb7 eurb7 <eurb7.pfb
+ eurm10 eurm10 <eurm10.pfb
+ eurm5 eurm5 <eurm5.pfb
+ eurm7 eurm7 <eurm7.pfb
+ eusb10 eusb10 <eusb10.pfb
+ eusb5 eusb5 <eusb5.pfb
+ eusb7 eusb7 <eusb7.pfb
+ eusm10 eusm10 <eusm10.pfb
+ eusm5 eusm5 <eusm5.pfb
+ eusm7 eusm7 <eusm7.pfb
+\end{verbatim}
+}Note that the Euler fonts come in a variety of weights and sizes; \verb|m|
+and \verb|b| represent medium and bold weights, and
+\verb|f|, \verb|r|, and \verb|s| the
+fraktur, roman, and symbol fonts.
+
+The installation for \textsc{tds} systems is similar, except that the
+directories containing the font files have more specialized names.
+The outline files go in directories like
+\[
+\hbox{\tt \ang<texmf>/fonts/type1/\ang<supplier>/\ang<typeface>}
+\]
+and the \texttt{.afm} and \texttt{.tfm} files go in places like
+\[
+\vbox{
+\hbox{\tt \ang<texmf>/fonts/afm/\ang<supplier>/\ang<typeface>}
+\hbox{\tt \ang<texmf>/fonts/tfm/\ang<supplier>/\ang<typeface>}
+}
+\]
+After you've added new fonts to your \textsc{tds}
+system, you will need to run a utility like {\tt texhash} or {\tt
+configure} or {\tt mktexlsr} (or
+something equivalent; it will have been supplied with your system) to
+make these fonts and their locations known to the \textsc{tds} search
+engine.
+Here, \ang<supplier> refers to the fontname
+abbreviation for the origin of the fonts, while \ang<typeface> is a
+fontname name for the font family. Also, \ang<texmf> is the root
+{texmf} directory. For example, the Euler fonts are
+provided courtesy of the American Mathematical Society ({\tt ams}), so
+scalable versions of these fonts belong in places named
+\[
+\vbox{%
+\hbox{\tt \ang<texmf>/fonts/type1/ams/euler}
+\hbox{\tt \ang<texmf>/fonts/afm/ams/euler}
+}
+\]
+
+\subsubsection*{MathTime: Additional Comments}
+If the digits for a roman family are too idiosyncratic for use with
+mathematics, you may wish instead to use Times Roman digits in math
+modes. If this is the case, there is an additional parameter you can
+set in file {\tt mt.par}. Set the Perl variable \verb|$times_| to
+point to a raw Times Roman font.
+
+MathTime fonts are available from Y\&Y, Inc.
+
+\subsubsection*{Euler fonts: Additional Comments}
+The Euler fonts need to fleshed out using some characters from
+Computer Modern fonts. It may be convenient to use scalable versions
+of these fonts, and these are now freely available from two
+\textsc{ctan} sources---the BaKoMa fonts discussed above, and the Blue
+Sky fonts, recently placed in the \textsc{ctan} archive. However,
+scalable Euler fonts are only found in the BaKoMa suite.
+
+One of the most pleasant surprises in this font work was how handsome
+the Euler fonts work in combination with text fonts. The Euler fonts
+are the only math fonts (other than Computer Modern) which are
+available for free.
+
+\subsubsection*{Lucida New Math: Additional Comments}
+There are no bold versions of these fonts, so it is never appropriate
+to include a Greek bold font.
+
+Lucida New Math fonts are available from Y\&Y, Inc.
+
+\subsubsection*{Mathematica Math Fonts: Additional Comments}
+Wolfram Research had graciously made available to me a set of
+provisional fonts they developed for inclusion with their current
+version of the program {\it Mathematica}. I have no idea how closely
+the actual fonts as distributed match the ones I worked with, nor the
+policy under which these fonts are being made available. (Typically,
+an installation of Mathematica3.0 on a Windows NT system has these
+fonts located in the directories
+\begin{verbatim}
+Program Files\Wolfram Research\Mathematica\3.0\Fonts\Afm
+Program Files\Wolfram Research\Mathematica\3.0\Fonts\Type1
+\end{verbatim}
+of a hard disk.)
+With these
+caveats, I detail the procedure for making these fonts usable by \TeX,
+which is more {\it ad hoc\/} than with other math fonts.
+The auxiliary files to assist in this task are in the {\tt makemma}
+directory in the \MathInst\ distribution. Here's the procedure.
+
+First, create and enter a {\tt work} subdirectory (below {\tt
+makemma}).
+
+I used the fonts named Math1 through Math5, each of which appears in
+regular and bold and mono and variable width variants. Use the file
+{\tt rename.bat} to rename these files and then (from the {\tt work}
+subdirectory) run the file {\tt makemma.tex} through \TeX. You'll
+need to make sure that the Mathematica {\tt.afm} files are in a place
+\TeX\ can read from.
+
+The output of the previous steps will be a bunch of {\tt.vpl} and
+{\tt.pl} files. Convert them to {\tt.vf} and {\tt.tfm} files, and
+move these files where they belong. Use commands like
+\begin{verbatim}
+ vptovf mmami.vpl mmami.vf mmami.tfm
+ pltotf mma1.pl mma1.tfm}
+\end{verbatim}
+to perform the conversions.
+
+Now you're ready to \MathInst\ using the Mathematica module.
+
+I found these fonts somewhat less satisfying than other math fonts.
+The characters seem to have been crafted with less care. For example,
+the cap heights of the calligraphic alphabet are not consistent.
+Also, the equal sign and double left- and right-arrows don't match, so
+they can't be used to generate long double arrows. (This can be fixed
+up with some kind of virtual mix-and-match scheme, but I have not yet
+done this.)
+
+\subsection{Installing the text fonts}
+The \mathinst\ utilities expect the text font family (and the sans
+serif fonts too) to be installed using the Berry font naming scheme.
+At the moment, \mathinst\ expects this to be done via the \vfinst\
+utility (by the current author) or by \texttt{psnfss} (by Sebastian
+Rahtz). The text fonts \textit{must} have been installed using the
+original \TeX\ encoding (that is, \texttt{OT1} or \texttt{ot1}).
+
+\subsection{Running MathInst}
+\begin{enumerate}
+\item Once the \mathinst\ software has been
+properly installed, you execute a module by switching to the working
+directory issuing a command like
+\begin{verbatim}
+../mathinst mt mbv
+\end{verbatim}
+(it would be \verb|..\mathinst mt mbv| in DOS). The double dots
+`\verb|..|' tell your
+computer to look for the \verb|mathinst| script in the parent of the
+current working directory and to
+use the the {\tt mt} (MathTime) math fonts and the
+text font family \verb|mbv| as arguments. At the moment, there are
+four allowable math abbreviations:
+\begin{itemize}
+\item \texttt{mt} (MathTime);
+\item \texttt{eu} (Euler);
+\item \texttt{lu} (Lucida); and
+\item \texttt{ma} (Mathematica).
+\end{itemize}
+The three-character font family must be the family name under which
+the text fonts have been installed.
+\mathinst\ produces the
+remainder of the scripts that you'll need to execute.
+
+\item Execute \texttt{mkdirs.bat} to create
+any missing directories.
+
+\item Execute \texttt{makepl.bat} to create certain property list
+files that fontinst will need.
+
+\item Run the file \texttt{makemath.tex} through \TeX. This is a
+plain \TeX\ file.
+
+\item Execute \texttt{makevf.bat} to create the binary font files that
+\TeX\ needs.
+
+\item Test the fonts, and make any changes (as described below).
+After making any adjustments, return to the `\TeX' step (step~4).
+
+\item When you are satisfied with the fonts, execute
+\texttt{putfonts.bat} to place all fonts, style files, and font
+descriptor files where they belong. Any files that remain in the
+working directory after this step can be safely deleted.
+\end{enumerate}
+
+All these steps take little time to execute.
+
+\subsection{Log files}
+\mathinst\ creates three log files with the extension \texttt{.mlg}.
+The files \texttt{makepl.mlg} and \texttt{makevf.mlg} contain
+information about the process used to create property files and font
+files. The name of the third log file begins with a `{\tt z}',
+followed by the 2-character math abbreviation, followed by the
+3-character font family name. Thus, if I create math fonts from
+Caslon ({\tt pac}) combined with Euler ({\tt eu}), the third log file
+is called {\tt zeupac.mlg}. This file records many of the decisions
+made by \mathinst\ as well as many of its findings as it prepares
+scripts for your fonts, and this information may sometimes be of
+interest.
+
+\subsection{Making adjustments}
+The fonts that the above process produces are at best good
+approximations to high quality fonts. Fine details pertaining to
+character spacing have to be made by hand. \mathinst\ tries to make
+this as easy as possible. For each run, it creates three ``fudge''
+files:
+\[\vbox{\tt\hbox{
+\ang<family>rhax.mtx}\hbox{
+\ang<family>ihax.mtx}\hbox{
+\ang<family>iskew.mtx}}
+\]
+So, if you run \mathinst\ on Monotype Baskerville fonts (family name
+{\tt mbv}), you get three files {\tt mbvrhax.mtx}, {\tt mbvihax.mtx},
+and {\tt mbviskew.mtx}. Once these files are present in the working
+directory or its parent \mathinst\ directory, \mathinst\ never
+overwrites them, since you may well have
+recorded changes in these files.
+
+The two {\tt...hax} files allow you to make changes to the math glyphs
+themselves in the math roman and math italic fonts. This is by means
+of a command \verb+\shiftglyph+, whose usage is described in these
+files. This command allows you to adjust the amount of space on
+either side of a character, and the related amount by which subscripts
+nestle against the character. The {\tt...skew} file makes it possible
+to adjust the positioning of accents on a math italic character, by
+means of a command called \verb+\skewkern+.
+
+In all cases, determining the numerical amounts to
+adjust various characters is a matter of trial and error.
+
+\section{%
+ Your new math virtual fonts%
+ }
+
+The new math font families use the {\em z naming
+convention}, whereby the font family name for the new math fonts uses
+the two character math designations together with the text font family
+designation. Suppose we combine MathTime (\verb|mt|) with
+Baskerville, whose family designation is \verb|mbv| in the Berry scheme.
+The new fonts will be described in macro files \verb|zmtmbv.tex| and
+\verb|zmtmbv.sty| (for users of plain \tex\ or of \latex). Baskerville plus
+Euler or Baskerville plus Lucida would form the $z$-names \verb|zeumbv| and
+\verb|zlumbv|.
+The $z$-name \verb|zmambv| describes a marriage between Baskerville
+and the {\it Mathematica\/} math fonts.
+
+The fonts themselves follow the Berry scheme, but you don't need to
+keep track of this, since the \mathinst\ style files load the fonts
+for you automatically and establish their correspondence either with
+familiar nicknames (\verb|\it|, \verb|\bf|) or with the \textsc{nfss}.
+But if you find yourself poking about your font directories, here's a
+quick key to the many new fonts you'll see.
+
+Additional font variants \verb|m|, \verb|e|, \verb|l|,
+or \verb|a| indicate a math font using MathTime, Euler,
+Lucida New Math or Mathematica fonts,
+while variants \verb|m|, \verb|y|, or \verb|v|
+denote the math italic,
+symbol, or extension fonts. For Baskerville, the four math fonts
+using MathTime fonts at text size have names
+\begin{itemize}
+ \item \verb|mbvrm7t|, the math Roman font;
+ \item \verb|mbvrm7m|, the math italic font;
+ \item \verb|mbvrm7y|, the symbol font; and
+ \item \verb|mbvrm7v|, the extension font.
+\end{itemize}
+A math
+Roman font connecting Baskerville and Euler or Baskerville and Lucida
+would be called \verb|mbvre7t| or \verb|mbvrl7t|. Baskerville $+$
+Mathematica gives rise to the math Roman font \verb|mbvra7t|, and so
+on.
+
+\mathinst\ does its best to `fake out' new fonts at the script and
+scriptscript sizes. Computer Modern fonts provide the r\^ole
+model---those fonts are subtly redesigned at different sizes. Smaller
+fonts sizes also display greater letterspacing (additional space
+between adjacent characters)at smaller sizes. We can't redesign a
+scalable font, but we can create virtual fonts which differ only in
+the letterspacing for use in various contexts. \mathinst\ creates
+installation files which take letterspacing into account. Therefore,
+you will see as many as three fonts for each of the above varieties
+listed above. In addition to \verb|mbvrm7t|, the math Roman font for text
+sizes, you'll see \verb|mbvrm7t7| and \verb|mbvrm7t5|, the same fonts
+fine-tuned for use in script and scriptscript
+contexts. (The suffixes
+`7' and `5' recall the design sizes of seven and five points that
+Computer Modern typesetting uses for these sizes.) There is only a
+single extension font for any family.
+
+\subsection{Using the new fonts}
+Whether you use \latex\
+or plain \tex, you'll only need to remember the $z$-name for your new
+fonts. One purpose of the \mathinst\ test files
+is to provide living examples showing just how the new fonts are
+invoked.
+
+In a \latex\ document, all the work is done by the package file whose
+first name is precisely the $z$-name for the math fonts. As with all
+package files, its extension is \verb|sty|. If you add a line like
+\begin{verbatim}
+\usepackage{zmtmbv}
+\end{verbatim}
+following {\tt\string\documentclass\string{...\string}}
+then all the usual \latex\ font
+switching mechanisms will now apply to the \verb|zmtmbv| fonts rather than
+to the default Computer Modern fonts.
+
+There is no font selection scheme for plain \tex\ quite
+all-encompassing as is the \latex\ NFSS, but Damian Cugley's
+\verb|pdcfsel| comes gratifyingly close, and does one or two
+things better than NFSS.
+Like the \latex\ package, the plain macro file has the font $z$-name
+as its first name, but the extension is \verb|tex|. To use these
+macros, simply place a statement like
+\begin{verbatim}
+\input zmtmbv
+\end{verbatim}
+very near the beginning of your file. Thereafter, all the usual plain
+font commands like \verb|\it|, \verb|\rm|, \verb|\tt|,
+\verb|$|, \verb|$$|, and so on refer to
+the new math fonts. The \verb|pdcfsel| package itself provides
+more flexibility than plain users are used to, and it would
+be well worth any reader's time to gain familiarity with this
+package.
+
+\smallskip
+
+For additional information regarding the installation and use of
+\mathinst{} (including an extensive display of sample output), please see
+the book {\it \tex\ Unbound: \latex\ and \tex\ Strategies for Fonts,
+Graphics and More\/} by Alan Hoenig (1998, Oxford University Press).
+
+\section{Communicating with the author}
+Please feel free to get in touch with me (Alan Hoenig) if you have any
+comments or bug reports.
+
+\begin{flushright}
+Alan Hoenig\\
+{\tt ajhjj@cunyvm.cuny.edu}\\
+John Jay College\\
+Department of Mathematics\\
+445 West 59th Street\\
+New York, NY 10019 USA\\[1pc]
+
+25 August 1998
+\end{flushright}
+
+\end{document}
diff --git a/fonts/utilities/mathinst/mt.par b/fonts/utilities/mathinst/mt.par
new file mode 100644
index 0000000000..6e5383e29a
--- /dev/null
+++ b/fonts/utilities/mathinst/mt.par
@@ -0,0 +1,102 @@
+#############################################################
+##
+## This is the file mt.par, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## A MathInst MathTime parameter file.
+
+## Some places...
+
+## traditional...
+$texroot_ = "e:/texmf/tdsoff"; # shorthand...
+$psfonts_ = "$texroot_/psfonts";
+$afm_ = "$texroot_/afm";
+$vf_ = "$texroot_/vf";
+$tfm_ = "$texroot_/tfm";
+$inputs_ = "$texroot_/inputs";
+$map_ = "e:/texmf/dvips/base";
+
+## TDS implementations...
+$texmf_ = "e:/texmf"; # or wherever
+$installer_ = "vfinst"; # or psnfss; what has installed the fonts?
+
+$encoding_ = "OT1"; # only OT1, ot1 are valid entries here
+
+## Some things...
+
+## These values for script and scriptscript sizes make
+## tiny math a bit more readable for scalable fonts.
+
+$ssize_ = 7.3; # for scalable fonts (for CMR, change to 7.0)
+$sssize_ = 5.5; # for scalable fonts (for CMR, change to 5.0)
+
+
+## Here define the names of a Times Roman raw font from which
+## the digits can be plucked. (The idea is that we want to use
+## Times Roman digits inside math, since the digits from the
+## roman font may be too idiosyncratic, as in Baskerville.) If
+## this variable is undefined (commented out), MathInst will simply
+## use the standard digits from the Roman font.
+
+#$times_="mntr8r"; # Monotype Times New Roman
+
+$tt_ = "cmtt10"; # Computer Modern tt
+#$tt_ = "pcrr7t"; # Courier
+$sansserif_ = "hlsr7t"; # Lucida sans serif---the author's favorite
+#$sansserif_ = "phvr7t"; # Helvetica
+$cal_ = "cmsy10"; # good ol' Computer Modern!
+#$cal_ = "shellan"; # Shelley-andante---a more cursive script
+$fraktur_ = "eufm10"; # fraktur font for math
+$bbold_ = "pmp6"; # b'board bold (Adobe Math Pi font 6)
+# $greekbold_ = "mntb8k"; # a font with bold Greek uppercase letters
+# (Here we use the bold Greek version of Monotype Times New Roman.)
+
+## For TDS (comment out what is necessary)...
+
+$masup_ = "texplora"; $matyp_ = "mathtime"; # math fonts
+$ttsup_ = "public"; $tttyp_ = "cm"; # tt
+$sssup_ = "bh"; $sstyp_ = "lucsans"; # sans serif
+$casup_ = "public"; $catyp_ = "cm"; # CM calligraphics
+## $ttsup_ = "adobe"; $tttyp_ = "courier";
+## $sssup_ = "adobe"; $sstyp_ = "helvetic";
+## $casup_ = "linotype"; $catyp_ = "shelley";
+$frsup_ = "ams"; $frtyp_ = "euler"; # fraktur
+$bbsup_ = "adobe"; $bbtyp_ = "pmp6"; # blackboard bold
+$gbsup_ = "monotype"; $gbtyp_ = "timesnew"; # Greek Bold
+
+## Scale factors. Normally, MathInst calculates the scale factors
+## for itself, under the assumption that the roman ($fontfam_) types
+## should be at their natural size so that all other fonts are scaled to
+## fit. Form most fonts, `scaling to fit' means making sure that the
+## x-heights match. For the calligrpahic fonts, the capheights shall match.
+## However, in case any of the following scale factors (SF) are defined,
+## then MathInst will use the user defined value. In case the SF's are
+## defined and set to zero, then the font is used at the natural size.
+
+## $mathSF_ = # for math fonts
+## $ttSF_ = # for typewriter font
+## $saSF_ = 00; # for sans serif fonts
+$caSF_ = 1000; # for calligraphic font
+## $frSF_ = # for fraktur font
+$bbSF_ = 1000; # for blackboard bold
+## $gbSF_ # for uppercase Greek bold letters
+
+## SYSTEM PARAMETERS
+
+## Uncomment one group as appropriate...
+
+## For UNIX and Unix-like systems...
+
+$sep = "/"; # Path separator for Unix
+$mv = "mv"; # Unix move command
+$cp="cp"; # Unix copy command
+
+## For DOS, WIN-NT, and so on...
+
+#$sep = "\\"; # Path separator for DOS
+#$mv = "call domove"; # DOS move command
+#$cp="copy"; # DOS copy command
+
diff --git a/fonts/utilities/mathinst/mt_ihax.mtx b/fonts/utilities/mathinst/mt_ihax.mtx
new file mode 100644
index 0000000000..b76f53d872
--- /dev/null
+++ b/fonts/utilities/mathinst/mt_ihax.mtx
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mt_ihax.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+\shiftglyph{C}{-50}{0}{-25}
+\shiftglyph{E}{0}{50}{0}
+\shiftglyph{F}{0}{50}{-100}
+\shiftglyph{H}{0}{25}{-25}
+\shiftglyph{I}{0}{0}{-25}
+\shiftglyph{K}{0}{0}{-25}
+\shiftglyph{J}{0}{0}{-25}
+\shiftglyph{N}{0}{0}{-25}
+\shiftglyph{P}{0}{0}{-100}
+\shiftglyph{T}{0}{50}{-75}
+\shiftglyph{U}{-50}{50}{-25}
+\shiftglyph{V}{-50}{50}{-50}
+\shiftglyph{W}{-50}{50}{-50}
+\shiftglyph{X}{0}{50}{-25}
+\shiftglyph{Y}{-50}{50}{-50}
+\shiftglyph{b}{0}{-25}{0}
+\shiftglyph{d}{0}{25}{0}
+\shiftglyph{f}{\scale{\depth{f}}{750}}{0}{25}
+\shiftglyph{g}{0}{-50}{0}
+\shiftglyph{j}{150}{25}{0}
+\shiftglyph{l}{0}{50}{0}
+\shiftglyph{o}{0}{-50}{0}
+\shiftglyph{p}{75}{-25}{0}
+\shiftglyph{t}{-25}{50}{0}
+\shiftglyph{Upsilon}{0}{0}{-50}
+\shiftglyph{Upsilon}{0}{0}{-100}
+\shiftglyph{weierstrass}{-100}{-200}{-150}
+
+\unfakable{rho1}
+
+\ifisglyph{omega1}\then
+ \setglyph{pi1}
+ \glyph{omega1}{1000}
+ \endsetglyph
+\fi
+
+\ifisglyph{epsilon}\then
+ \setglyph{epsilon1}
+ \glyph{epsilon}{1000}
+ \endsetglyph
+\fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\div{\width{tie}}{2}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+\ifisglyph{vector}\then
+ \resetglyph{vector}
+ \moveup{1}
+ \glyph{vector}{1000}
+ \moveup{-1}
+ \endresetglyph
+\fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/mt_iskew.mtx b/fonts/utilities/mathinst/mt_iskew.mtx
new file mode 100644
index 0000000000..12c40e431a
--- /dev/null
+++ b/fonts/utilities/mathinst/mt_iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mt_iskew.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+\skewkern{A}{75}
+\skewkern{B}{100}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{100}
+\skewkern{J}{200}
+\skewkern{K}{75}
+\skewkern{M}{100}
+\skewkern{N}{25}
+\skewkern{O}{100}
+\skewkern{P}{100}
+\skewkern{Q}{100}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{X}{50}
+\skewkern{Z}{50}
+\skewkern{a}{75}
+\skewkern{c}{75}
+\skewkern{d}{200}
+\skewkern{e}{75}
+\skewkern{f}{140}
+\skewkern{g}{75}
+\skewkern{i}{75}
+\skewkern{j}{150}
+\skewkern{l}{100}
+\skewkern{m}{50}
+\skewkern{n}{50}
+\skewkern{o}{75}
+\skewkern{p}{100}
+\skewkern{q}{75}
+\skewkern{r}{50}
+\skewkern{s}{100}
+\skewkern{t}{50}
+\skewkern{u}{75}
+\skewkern{v}{75}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{75}
+\skewkern{z}{50}
+\skewkern{dotlessi}{50}
+\skewkern{dotlessj}{50}
+\skewkern{upsilon}{25}
+\skewkern{iota}{-50}
+\skewkern{lambda}{-75}
+\skewkern{weierstrass}{175}
+\skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newlbme.mtx b/fonts/utilities/mathinst/newlbme.mtx
new file mode 100644
index 0000000000..6cce032869
--- /dev/null
+++ b/fonts/utilities/mathinst/newlbme.mtx
@@ -0,0 +1,36 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newlbme.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\renameas#1#2{
+ \ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \fi
+}
+
+\renameas{angbracketleftbig}{angleleftbig} % glyph 10
+\renameas{angbracketrightbig}{anglerightbig} % glyph 11
+\renameas{vextendsingle}{barex} % glyph 12
+\renameas{vextenddouble}{bardblex} % glyph 13
+\renameas{angbracketleftbigg}{angleleftbigg} % glyph 28
+\renameas{angbracktrightbigg}{anglerightbigg} % glyph 29
+\renameas{angbracketleftBigg}{angleleftBigg} % glyph 42
+\renameas{angbracketrightBigg}{anglerightBigg} % glyph 43
+\renameas{angbracketleftBig}{angleleftBig} % glyph 68
+\renameas{angbracketrightBig}{anglerightBig} % glyph 69
+\renameas{circlemultdisplay}{circlemultiplydisplay}% glyph 79
+\renameas{hatwidest}{hatwiderr} % glyph 100
+\renameas{tildewidest}{tildewiderr} % glyph 103
+\renameas{arrowvertexdbl}{arrowdblvertex} % glyph 119
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newlbmo.mtx b/fonts/utilities/mathinst/newlbmo.mtx
new file mode 100644
index 0000000000..73fd6873a3
--- /dev/null
+++ b/fonts/utilities/mathinst/newlbmo.mtx
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newlbmo.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\renameas#1#2{
+ \ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \fi
+}
+
+\renameas{Upsilon}{Upsilon1} % glyph 7
+\renameas{arrowlefttophalf}{harpoonleftup} % glyph 40
+\renameas{arrowleftbothalf}{harpoonleftdown} % glyph 41
+\renameas{arrowrighttophalf}{harpoonrightup} % glyph 42
+\renameas{arrowrightbothalf}{harpoonrightdown} % glyph 43
+\renameas{arrowhookleft}{hookrightchar} % glyph 44
+\renameas{arrowhookright}{hookleftchar} % glyph 45
+\renameas{zero}{zerooldstyle} % glyph 48
+\renameas{one}{oneoldstyle} % glyph 49
+\renameas{two}{twooldstyle} % glyph 50
+\renameas{three}{threeoldstyle} % glyph 51
+\renameas{four}{fouroldstyle} % glyph 52
+\renameas{five}{fiveoldstyle} % glyph 53
+\renameas{six}{sixoldstyle} % glyph 54
+\renameas{seven}{sevenoldstyle} % glyph 55
+\renameas{eight}{eightoldstyle} % glyph 56
+\renameas{nine}{nineoldstyle} % glyph 57
+\renameas{natural}{sharp} % glyph 92
+\renameas{sharp}{natural} % glyph 93
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newlbms.mtx b/fonts/utilities/mathinst/newlbms.mtx
new file mode 100644
index 0000000000..97ca31bba9
--- /dev/null
+++ b/fonts/utilities/mathinst/newlbms.mtx
@@ -0,0 +1,32 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newlbms.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\renameas#1#2{
+ \ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \fi
+}
+
+\renameas{precedes}{curlyless} % glyph 30
+\renameas{follows}{curlygreater} % glyph 31
+\renameas{mapsto}{mapstochar} % glyph 55
+\renameas{emptyset}{emptysetstress} % glyph 59
+\renameas{Rfractur}{Rfraktur} % glyph 60
+\renameas{Ifractur}{Ifraktur} % glyph 61
+\renameas{angbracketleft}{angleleft} % glyph 104
+\renameas{angbracketright}{angleright} % glyph 105
+\renameas{radical}{radicallow} % glyph 112
+\renameas{nabla}{gradient} % glyph 114
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newmtex.mtx b/fonts/utilities/mathinst/newmtex.mtx
new file mode 100644
index 0000000000..5d08f8b95e
--- /dev/null
+++ b/fonts/utilities/mathinst/newmtex.mtx
@@ -0,0 +1,34 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newmtex.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\renameas#1#2{
+ \ifisglyph{#1}\then
+ \setglyph{#2}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \fi
+}
+\renameas{angbracketleftbig}{angleleftbig} % glyph 10
+\renameas{angbracketrightbig}{anglerightbig} % glyph 11
+\renameas{vextendsingle}{barex} % glyph 12
+\renameas{vextenddouble}{bardblex} % glyph 13
+\renameas{angbracketleftbigg}{angleleftbigg} % glyph 28
+\renameas{angbracketrightbigg}{anglerightbigg} % glyph 29
+\renameas{angbracketleftBigg}{angleleftBigg} % glyph 42
+\renameas{angbracketrightBigg}{anglerightBigg} % glyph 43
+\renameas{angbracketleftBig}{angleleftBig} % glyph 68
+\renameas{angbracketrightBig}{anglerightBig} % glyph 69
+\renameas{hatwidest}{hatwiderr} % glyph 100
+\renameas{tildewidest}{tildewiderr} % glyph 103
+\renameas{arrowvertexdbl}{arrowdblvertex} % glyph 119
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newmtsy.mtx b/fonts/utilities/mathinst/newmtsy.mtx
new file mode 100644
index 0000000000..39c5b062e7
--- /dev/null
+++ b/fonts/utilities/mathinst/newmtsy.mtx
@@ -0,0 +1,38 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newmtsy.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+'\relax
+
+\metrics
+
+\setcommand\renameas#1#2{%
+ \ifisglyph{#1}\then
+ \resetglyph{#2}
+ \glyph{#1}{1000}
+ \endresetglyph
+ \fi
+}
+
+\renameas{precedes}{curlyless}
+\renameas{follows}{curlygreater}
+
+\renameas{negationslash}{Negationslash}
+\renameas{mapsto}{mapstochar}
+
+\renameas{emptyset}{emptysetstress}
+\renameas{Rfractur}{Rfraktur}
+\renameas{Ifractur}{Ifraktur}
+
+\renameas{angbracketleft}{angleleft}
+\renameas{angbracketright}{angleright}
+
+\renameas{radical}{radicallow}
+
+\renameas{nabla}{gradient}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/newmtx.prl b/fonts/utilities/mathinst/newmtx.prl
new file mode 100644
index 0000000000..1b294ade43
--- /dev/null
+++ b/fonts/utilities/mathinst/newmtx.prl
@@ -0,0 +1,78 @@
+#############################################################
+##
+## This is the file newmtx.prl, part of the MathInst package
+## (version 1.0, August, 1998) for math font
+## generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+# perl script to read to mtx files and relate bad and good names.
+
+# perl mtex.prl MTEX
+
+die "Wrong number of params, boss..." if $#ARGV != 0;
+
+$File = $ARGV[0];
+$file = $File;
+$file =~ tr/A-Z/a-z/;
+
+$goodfile = "${File}good.mtx";
+$baddfile = "${File}bad.mtx";
+open (GOOD, $goodfile) || die "Can't open good file $goodfile...";
+open (BAD, $baddfile) || die "Can't open bad file $baddfile...";
+
+$newfile = "new${file}.mtx";
+open (OUT, ">$newfile");
+
+sub min{
+ local($i);
+ local($Min_) = $_[0];
+ foreach $i (1 .. $#_) {
+ $Min_ = $_[$i] if $_[$i] < $Min_;
+ }
+ $Min_;
+}
+
+## &readmtxfile(*good);
+sub readmtxfile{
+ local(*foo) = @_;
+ while ($_ = <$fh>) {
+ last if /setrawglyph/;
+ }
+ while ($_ = <$fh>) {
+ last unless /setrawglyph/;
+ $_ =~ /^\\setrawglyph{([A-Za-z]+)}{$ARGV[0][a-z]*}{10[\.0]*pt}{([-0-9]+)}/;
+ $foo[$2] = $1;
+ }
+}
+
+$fh = "GOOD";
+&readmtxfile(*good);
+$fh = "BAD";
+&readmtxfile(*bad);
+
+$diffs = 0;
+$m = &min($#good, $#bad);
+foreach $i (0 .. $m) {
+ next if $bad[$i] eq $good[$i];
+ $A = "\\renameas{$bad[$i]}{$good[$i]}";
+ $A .= ' ' x (50-length($A))."% glyph $i\n";
+ $diff[$j] = $A; $j++; $diffs = 1;
+}
+
+if ($diffs == 1) {
+ print OUT "\\relax\n\n\\metrics\n\n";
+ print OUT "\\setcommand\\renameas\#1\#2{\n";
+ print OUT " \\ifisglyph{\#1}\\then\n";
+ print OUT " \\setglyph{\#2}\n";
+ print OUT " \\glyph{\#1}{1000}\n";
+ print OUT " \\endsetglyph\n";
+ print OUT " \\fi\n";
+ print OUT "}\n\n";
+ foreach $i (0 .. $#diff) {
+ print OUT $diff[$i];
+ }
+ print OUT "\n\\endmetrics\n";
+}
+
+close OUT;
diff --git a/fonts/utilities/mathinst/newrmtmi.mtx b/fonts/utilities/mathinst/newrmtmi.mtx
new file mode 100644
index 0000000000..9c952bb991
--- /dev/null
+++ b/fonts/utilities/mathinst/newrmtmi.mtx
@@ -0,0 +1,41 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newrmtmi.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+We need to rename some MathTime glyphs safely.
+
+\metrics
+
+\setcommand\renameas#1#2{%
+ \ifisglyph{#1}\then
+ \resetglyph{#2}
+ \glyph{#1}{1000}
+ \endresetglyph
+ \fi
+}
+
+\renameas{arrowlefttophalf}{harpoonleftup}
+\renameas{arrowleftbothalf}{harpoonleftdown}
+\renameas{arrowrighttophalf}{harpoonrightup}
+\renameas{arrowrightbothalf}{harpoonrightdown}
+\renameas{arrowhookleft}{hookrightchar}
+\renameas{arrowhookright}{hookleftchar}
+
+\renameas{kappa1}{varkappa}
+
+%% We want to unset the dotless glyphs, and recover/construct
+%% the dotlessi and dotlessj glyphs appropriate for the current font.
+
+\unsetglyph{dotlessi} % part of 8r encoding; this glyph normally present in
+ % T1 fonts
+\unsetglyph{dotlessj} % comment this line out if the MathTime dotlessj
+ % is OK for your needs.
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/newxht.mtx b/fonts/utilities/mathinst/newxht.mtx
new file mode 100644
index 0000000000..bb4e0bd952
--- /dev/null
+++ b/fonts/utilities/mathinst/newxht.mtx
@@ -0,0 +1,18 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file newxht.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+\ifisglyph{x}\then
+ \resetint{xheight}{\height{x}}
+\else
+ \resetint{xheight}{400}
+\fi
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/nodotles.mtx b/fonts/utilities/mathinst/nodotles.mtx
new file mode 100644
index 0000000000..79ab40d6b2
--- /dev/null
+++ b/fonts/utilities/mathinst/nodotles.mtx
@@ -0,0 +1,20 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file nodotles.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+\ifisglyph{x}\then
+ \resetint{xheight}{\height{x}}
+\else
+ \resetint{xheight}{400}
+\fi
+
+\unsetglyph{dotlessi}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/noslash.mtx b/fonts/utilities/mathinst/noslash.mtx
new file mode 100644
index 0000000000..9fd9f6d6fc
--- /dev/null
+++ b/fonts/utilities/mathinst/noslash.mtx
@@ -0,0 +1,21 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file noslash.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+% The following glyphs should come from true math rather than PS fonts.
+
+\unsetglyph{less}
+\unsetglyph{greater}
+\unsetglyph{slash}
+
+
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/notequa.mtx b/fonts/utilities/mathinst/notequa.mtx
new file mode 100644
index 0000000000..8aa0ac7977
--- /dev/null
+++ b/fonts/utilities/mathinst/notequa.mtx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file notequa.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\unsetglyph{equal}
+%\unsetglyph{asterisk}
+\unsetglyph{plus}
+\endmetrics
diff --git a/fonts/utilities/mathinst/notequal.mtx b/fonts/utilities/mathinst/notequal.mtx
new file mode 100644
index 0000000000..ddb5be0d99
--- /dev/null
+++ b/fonts/utilities/mathinst/notequal.mtx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file notequal.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\unsetglyph{equal}
+\unsetglyph{asterisk}
+\unsetglyph{plus}
+\endmetrics
diff --git a/fonts/utilities/mathinst/numoff.mtx b/fonts/utilities/mathinst/numoff.mtx
new file mode 100644
index 0000000000..2419270586
--- /dev/null
+++ b/fonts/utilities/mathinst/numoff.mtx
@@ -0,0 +1,25 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file numoff.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\unsetglyph{zero}
+\unsetglyph{one}
+\unsetglyph{two}
+\unsetglyph{three}
+\unsetglyph{four}
+\unsetglyph{five}
+\unsetglyph{six}
+\unsetglyph{seven}
+\unsetglyph{eight}
+\unsetglyph{nine}
+
+\endmetrics
+
diff --git a/fonts/utilities/mathinst/plainsty.tpl b/fonts/utilities/mathinst/plainsty.tpl
new file mode 100644
index 0000000000..425fef26c4
--- /dev/null
+++ b/fonts/utilities/mathinst/plainsty.tpl
@@ -0,0 +1,155 @@
+## This is a template to use in the creation of a plain TeX
+## style file.
+
+sub by100{
+ sprintf("%3.1f", $_[0] / 100);
+}
+
+$f = "\\f";
+
+$A = <<"EndA";
+\%\% This is a plain TeX macro file for using $fontfam_ fonts
+\%\% together with $_[0] math fonts.
+
+\%\% Created by MathInst$mathinstver_ on $today at $now.
+
+\\input pdcfsel % get Damian Cugley's macros
+
+\\newfam\\bifam
+
+\%\% Special purpose fonts and templates...
+
+EndA
+ &Out($A);
+
+$mysize = &by100($ssSF_);
+($ssr, $ssri, $ssb, $ssbi) = &deduce_family_members_from_font($sansserif_);
+if ($ssb) {} else { # in case bold fonts are not detected, use regular
+ $ssb=$ssr;
+ $ssbi=$ssri;
+}
+
+ $B = <<"EndB";
+\\def\\sanstemplate{%
+ \\\@\\m{rm}{$ssr}\\\@${f}{it}{$ssri}%
+ \\\@${f}{bf}{$ssb}\\\@${f}{bi}{$ssbi}%
+}
+\\fontset{sans}\\sanstemplate{$mysize}{12pt}{}{}
+\\newfam\\sffam
+\\def\\sf{\\fam\\sffam\\sansrm}\\textfont\\sffam=\\sansrm % for math
+
+EndB
+if ($sansserif_) {
+ &Out($B);
+}
+
+$mysize = &by100($ttSF_);
+$C = <<"EndC";
+\\def\\tttemplate{%
+ \\\@${f}{rm}{$tt_}%
+}
+\\fontset{tt}\\tttemplate{$mysize}{12pt}{}{}
+\\def\\tt{\\fam\\ttfam\\ttrm}\\textfont\\ttfam = \\ttrm % for math
+
+EndC
+if (tt_) {
+ &Out($C);
+}
+
+$mysize = &by100($caSF_);
+$D = <<"EndD";
+\\def\\caltemplate{
+ \\\@${f}{rm}{$cal_}%
+}
+\\fontset{cal}\\caltemplate{$mysize}{12pt}{}{}
+\\newfam\\calfam
+\\def\\cal{\\fam\\calfam\\calrm}\\textfont\\calfam = \\calrm % for math
+
+EndD
+if ($cal_) {
+ &Out($D);
+}
+
+$mysize = &by100($frSF_);
+$E = <<"EndE";
+\\def\\fraktemplate{
+ \\\@${f}{rm}{$fraktur_}%
+}
+\\fontset{frak}\\fraktemplate{$mysize}{12pt}{}{}
+\\newfam\\frakfam
+\\def\\frak{\\fam\\frakfam\\frakrm}\\textfont\\frakfam = \\frakrm % for math
+
+EndE
+if ($fraktur_) {
+ &Out($E);
+}
+
+$mysize = &by100($bbSF_);
+$F = <<"EndF";
+\\def\\bbtemplate{
+ \\\@${f}{rm}{$bbold_}%
+}
+\\fontset{bb}\\bbtemplate{$mysize}{12pt}{}{}
+\\newfam\\bbfam
+\\def\\bb{\\fam\\bbfam\\bbrm}\\textfont\\bbfam = \\bbrm % for math
+
+EndF
+if ($bbold_) {
+ &Out($F);
+}
+
+local(@m) = ($nfssvar, $nfssvar, $nfssvar); # default
+@m = ("${mathid}7t", "${mathid}7t7", "${mathid}7t5")
+ if &isvariable($greekbold_);
+$G = <<"EndG";
+%% Now for the usual stuff, math and roman.
+
+\\font\\tenex=${fontfam_}${rreg}${mathid}7v at 10 pt
+\\textfont3=\\tenex \\scriptfont3=\\tenex \\scriptscriptfont3=\\tenex
+
+\\def\\texttemplate{%
+ \\\@${f}{textrm}{${fontfam_}${rreg}${nfssvar}}%
+ \\\@\\M{rm}{${fontfam_}${rreg}${mathid}7t}\\\@\\M{mi}{${fontfam_}${rreg}${mathid}7m}%
+ \\\@\\M{sy}{${fontfam_}${rreg}${mathid}7y}% math fonts
+ \\\@\\M{it}{${fontfam_}${rreg}$rit${nfssvar}}\\\@\\m{bf}{${fontfam_}$rbold$m[0]}%
+ \\\@${f}{bi}{${fontfam_}${rbold}$rit${nfssvar}}}%
+\\def\\scripttemplate{%
+ \\\@\\M{rm}{${fontfam_}${rreg}${mathid}7t7}\\\@\\M{mi}{${fontfam_}${rreg}${mathid}7m7}%
+ \\\@\\M{sy}{${fontfam_}${rreg}${mathid}7y7}% math fonts
+ \\\@\\M{it}{${fontfam_}${rreg}$rit${nfssvar}}\\\@\\m{bf}{${fontfam_}$rbold$m[1]}%
+ \\\@${f}{bi}{${fontfam_}${rbold}$rit${nfssvar}}}%
+\\def\\sscripttemplate{%
+ \\\@\\M{rm}{${fontfam_}${rreg}${mathid}7t5}\\\@\\M{mi}{${fontfam_}${rreg}${mathid}7m5}%
+ \\\@\\M{sy}{${fontfam_}${rreg}${mathid}7y5}% math fonts
+ \\\@\\M{it}{${fontfam_}${rreg}$rit${nfssvar}}\\\@\\m{bf}{${fontfam_}$rbold$m[2]}%
+ \\\@${f}{bi}{${fontfam_}${rbold}$rit${nfssvar}}}%
+\\xfontset{scriptscript}\\sscripttemplate{5}
+\\xfontset{script}\\scripttemplate{7}
+\\fontset{body}\\texttemplate{10}{12pt}{script}{scriptscript}
+\\fontset{heading}\\texttemplate{12}{14pt}{body}{script}
+\\fontset{note}\\scripttemplate{8}{10pt}{scriptscript}{scriptscript}
+
+%% Some miscellaneous hacks...
+
+\\def\\l{\\char170\\relax}\\def\\L{\\char138\\relax}
+
+\\catcode`\\\@=11
+ \\setbox0=\\hbox{\\tenex B}\\p\@renwd=\\wd0 % for \\bordermatrix
+\\catcode`\\\@=12
+EndG
+&Out($G);
+$H = <<"EndH";
+\\mathchardef\\varkappa="0180
+\\mathchardef\\comp="2181
+\\def\\vec{\\mathaccent"717E }
+\\mathchardef\\Relbar="3280
+\\mathcode`\\;="6281
+EndH
+&Out($H) if $_[0] eq "mt";
+&Out("\\def\\joinrel{\\mathrel{\\mkern-4mu}}") if $_[0] eq "lu";
+&Out("\\bodyfonts");
+&Out("%% Assigning skewchars...");
+&Out("\\skewchar\\bodymi=127 \\skewchar\\scriptmi=127 \\skewchar\\scriptscriptmi=127");
+&Out("\\skewchar\\bodysy=48 \\skewchar\\scriptsy=48 \\skewchar\\scriptscriptmi=48");
+&Out("\n\\let\\tenrm=\\textrm \\textrm\n\n\\endinput");
+1;
diff --git a/fonts/utilities/mathinst/regreek.mtx b/fonts/utilities/mathinst/regreek.mtx
new file mode 100644
index 0000000000..cb7f7c4cbf
--- /dev/null
+++ b/fonts/utilities/mathinst/regreek.mtx
@@ -0,0 +1,47 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file regreek.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\resetglyph{Gamma}
+ \glyph{Gamma1}{1000}
+\endresetglyph
+\resetglyph{Delta}
+ \glyph{Delta1}{1000}
+\endresetglyph
+\resetglyph{Theta}
+ \glyph{Theta1}{1000}
+\endresetglyph
+\resetglyph{Lambda}
+ \glyph{Lambda1}{1000}
+\endresetglyph
+\resetglyph{Xi}
+ \glyph{Xi1}{1000}
+\endresetglyph
+\resetglyph{Pi}
+ \glyph{Pi1}{1000}
+\endresetglyph
+\resetglyph{Sigma}
+ \glyph{Sigma1}{1000}
+\endresetglyph
+\resetglyph{Upsilon}
+ \glyph{Upsilon1}{1000}
+\endresetglyph
+\resetglyph{Phi}
+ \glyph{Phi1}{1000}
+\endresetglyph
+\resetglyph{Psi}
+ \glyph{Psi1}{1000}
+\endresetglyph
+\resetglyph{Omega}
+ \glyph{Omega1}{1000}
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/rhax.mtx b/fonts/utilities/mathinst/rhax.mtx
new file mode 100644
index 0000000000..927a8cb2f1
--- /dev/null
+++ b/fonts/utilities/mathinst/rhax.mtx
@@ -0,0 +1,62 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file rhax.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Based on work by Aloysius G. Helminck. All rights reserved.
+
+\relax
+
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.315}
+
+%%% If you want the math to be less tight, then set the letterspacing.
+%%% The standard is 0.
+%\setint{letterspacing}{20}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount of extra space for subscripts
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+\shiftglyph{parenleft}{25}{10}{0}
+\shiftglyph{parenright}{40}{0}{0}
+\shiftglyph{grave}{1}{1}{0}
+\shiftglyph{acute}{1}{1}{0}
+\shiftglyph{caron}{1}{1}{0}
+\shiftglyph{breve}{1}{1}{0}
+\shiftglyph{macron}{1}{1}{0}
+\shiftglyph{circumflex}{1}{1}{0}
+\shiftglyph{dotaccent}{1}{1}{0}
+\shiftglyph{tilde}{1}{1}{0}
+\shiftglyph{dieresis}{1}{1}{0}
+\shiftglyph{overbar}{1}{1}{0}
+\shiftglyph{tie}{1}{1}{0}
+
+
+\endmetrics
+
+
+
+
+ \ No newline at end of file
diff --git a/fonts/utilities/mathinst/testmath.tpl b/fonts/utilities/mathinst/testmath.tpl
new file mode 100644
index 0000000000..1d2ad03528
--- /dev/null
+++ b/fonts/utilities/mathinst/testmath.tpl
@@ -0,0 +1,331 @@
+
+&Out("\%\&latex\n\\documentclass{article} ");
+&Out("");
+&Out("\\renewcommand{\\encodingdefault}{$encoding_}");
+&Out("");
+&Out("\\usepackage{z$_[0]$fontfam_}");
+&Out("");
+&Out("\\title{A math test document} ");
+&Out("");
+&Out("\\raggedbottom ");
+&Out("");
+&Out("\\font\\TTT=cmr7 \\newcount\\cno");
+&Out("\\def\\TT{\\T\\setbox0=\\hbox{\\char\\cno}\\ifdim\\wd0>0pt");
+&Out(" \\box0\\lower4pt\\hbox{\\TTT\\the\\cno}\\else");
+&Out(" \\ifdim\\ht0>0pt \\box0\\lower4pt\\hbox{\\TTT\\the\\cno}\\fi\\fi");
+&Out(" \\global\\advance\\cno by1");
+&Out("}");
+&Out("\\def\\showfont#1{\\font\\T=#1 at 10pt\\global\\cno=0");
+&Out(" \\tabskip1pt plus2pt minus1pt\\halign to\\textwidth{&\\hss\\TT ##\\hss\\cr");
+&Out(" \\multispan{16}\\hfil \\tt Font #1\\hfil\\cr\\noalign{\\smallskip}");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out("}}");
+&Out("\\newcommand{\\testsize}[1]{ ");
+&Out(" #1 \\texttt{\\string#1}: \\(a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2}, ");
+&Out(" a_{0_a}, 0_{a_0}, ");
+&Out(" \\sum_{i=0}^\\infty\\) \\\\ ");
+&Out("} ");
+&Out("");
+&Out("\\newcommand{\\testdelims}[3]{\\sqrt{ ");
+&Out(" #1|#1\\|#1\\uparrow ");
+&Out(" #1\\downarrow#1\\updownarrow#1\\Uparrow#1\\Downarrow ");
+&Out(" #1\\Updownarrow#1\\lfloor#1\\lceil ");
+&Out(" #1(#1\\{#1[#1\\langle ");
+&Out(" #3 ");
+&Out(" #2\\rangle#2]#2\\}#2) ");
+&Out(" #2\\rceil#2\\rfloor#2\\Updownarrow#2\\Downarrow ");
+&Out(" #2\\Uparrow#2\\updownarrow#2\\downarrow#2\\uparrow ");
+&Out(" #2\\|#2| ");
+&Out("}\\\\} ");
+&Out("");
+&Out("\\newcommand{\\testglyphs}[1]{ ");
+&Out("\\begin{quote} ");
+&Out(" #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m ");
+&Out(" #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z ");
+&Out(" #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M ");
+&Out(" #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z ");
+&Out(" #10#11#12#13#14#15#16#17#18#19 ");
+&Out(" #1\\Gamma#1\\Delta#1\\Theta#1\\Lambda#1\\Xi ");
+&Out(" #1\\Pi#1\\Sigma#1\\Upsilon#1\\Phi#1\\Psi#1\\Omega ");
+&Out(" #1\\alpha#1\\beta#1\\gamma#1\\delta#1\\epsilon ");
+&Out(" #1\\varepsilon#1\\zeta#1\\eta#1\\theta#1\\vartheta ");
+&Out(" #1\\iota#1\\kappa#1\\lambda#1\\mu#1\\nu#1\\xi#1\\omicron ");
+&Out(" #1\\pi#1\\varpi#1\\rho#1\\varrho ");
+&Out(" #1\\sigma#1\\varsigma#1\\tau#1\\upsilon#1\\phi ");
+&Out(" #1\\varphi#1\\chi#1\\psi#1\\omega ");
+&Out(" #1\\partial#1\\ell#1\\imath#1\\jmath#1\\wp ");
+&Out("\\end{quote} ");
+&Out("} ");
+&Out("");
+&Out("\\newcommand{\\sidebearings}[1]{ \\(|#1|\\) } ");
+&Out("\\newcommand{\\subscripts}[1]{ \\(#1_\\circ\\) } ");
+&Out("\\newcommand{\\supscripts}[1]{ \\(#1^\\circ\\) } ");
+&Out("\\newcommand{\\scripts}[1]{ \\(#1^\\circ_\\circ\\) } ");
+&Out("\\newcommand{\\vecaccents}[1]{ \\(\\vec#1\\) } ");
+&Out("\\newcommand{\\tildeaccents}[1]{ \\(\\tilde#1\\) } ");
+&Out("");
+&Out("\\ifx\\omicron\\undefined ");
+&Out(" \\let\\omicron=o ");
+&Out("\\fi ");
+&Out("");
+&Out("\\begin{document} ");
+&Out("");
+&Out("\\maketitle ");
+&Out("");
+&Out("\\subsection*{Introduction} ");
+&Out("");
+&Out("This document tests the math capabilities of a math package, and is ");
+&Out("strongly modelled after a similar document by Alan Jeffrey. ");
+&Out("This test exercises the {\\tt $fontfam_} text fonts.");
+&Out("");
+if ($myans =~ /^y/i) {
+ &Out("\\showfont{${fontfam_}$rreg${mathid}7t}");
+ &Out("\\smallskip ");
+ &Out("\\showfont{${fontfam_}$rreg${mathid}7m}");
+ &Out("\\smallskip ");
+ &Out("\\showfont{${fontfam_}$rreg${mathid}7y}");
+ &Out("\\smallskip ");
+ &Out("\\showfont{${fontfam_}$rreg${mathid}7v}");
+ &Out("\\newpage ");
+}
+&Out("\\subsection*{Fonts} ");
+&Out("");
+&Out("Math italic: ");
+&Out("\\[ ");
+&Out(" ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+&Out(" abcdefghijklmnopqrstuvwxyz ");
+&Out("\\] ");
+&Out("Text italic: ");
+&Out("\\[ ");
+&Out(" \\mathit{ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+&Out(" abcdefghijklmnopqrstuvwxyz} ");
+&Out("\\] ");
+&Out("Roman: ");
+&Out("\\[ ");
+&Out(" \\mathrm{ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+&Out(" abcdefghijklmnopqrstuvwxyz} ");
+&Out("\\] ");
+&Out("Bold: ");
+&Out("\\[ ");
+&Out(" \\mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+&Out(" abcdefghijklmnopqrstuvwxyz} ");
+&Out("\\] ");
+if (&isvariable($greekbold_)){
+ &Out("\\[\n \\mathbf{\\Gamma\\Delta\\Theta\\Lambda\\Xi\\Pi\\Sigma");
+ &Out(" \\Upsilon\\Phi\\Psi\\Omega}\n\\]");
+}&Out("Typewriter: ");
+&Out("\\[ ");
+&Out(" \\mathtt{ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+&Out(" abcdefghijklmnopqrstuvwxyz} ");
+&Out("\\] ");
+&Out("Greek: ");
+&Out("\\[ ");
+&Out(" \\Gamma\\Delta\\Theta\\Lambda\\Xi\\Pi\\Sigma\\Upsilon\\Phi\\Psi\\Omega ");
+&Out(" \\alpha\\beta\\gamma\\delta\\epsilon\\varepsilon\\zeta\\eta\\theta\\vartheta ");
+&Out(" \\iota\\kappa\\lambda\\mu\\nu\\xi\\omicron\\pi\\varpi\\rho\\varrho ");
+&Out(" \\sigma\\varsigma\\tau\\upsilon\\phi\\varphi\\chi\\psi\\omega ");
+&Out("\\] ");
+if (&isvariable(cal_)) {
+ &Out("Calligraphic:");
+ &Out("\\[A\\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\\]");
+}
+$Sanstest = <<EndSanstest;
+Sans:
+\\[
+ A\\mathsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \\quad
+ a\\mathsf{abcdefghijklmnopqrstuvwxyz}z
+\\]
+EndSanstest
+$Fraktest = <<EndFraktest;
+Fraktur:
+\\[
+ A\\mathfr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \\quad
+ a\\mathfr{abcdefghijklmnopqrstuvwxyz}z
+\\]
+EndFraktest
+$BBoldtest = <<EndBBoldtest;
+Blackboard Bold:
+\\[
+ A\\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+\\]
+EndBBoldtest
+$DD = <<EndD;
+Do these line up appropriately?
+\\[
+ \\forall \\mathcal{B} \\Gamma \\mathbf{D} \\exists \\mathtt{F}
+ G \\mathcal{H} \\Im \\mathbf{J} \\mathsf{K} \\Lambda
+ M \\aleph \\emptyset \\Pi \\mathit{Q} \\Re \\Sigma
+ \\mathtt{T} \\Upsilon \\mathcal{V} \\mathbf{W} \\Xi
+ \\mathsf{Y} Z
+ \\quad
+ a \\mathbf{c} \\epsilon \\mathtt{i}
+ \\kappa \\mathbf{m} \\nu o \\varpi \\mathsf{r}
+ s \\tau \\mathit{u} v \\mathsf{w} z
+ \\quad
+ \\mathtt{g} j \\mathsf{q} \\chi y
+ \\quad
+ b \\delta \\mathbf{f} \\mathtt{h} k \\mathsf{l} \\phi
+\\]
+
+\\subsection*{Accents}
+
+\\[
+\\hbox{%
+ \\'o \\`o \\^o \\${q}o \\~o \\=o \\.o \\u o \\v o
+ \\H o \\t oo \\c o \\d o \\b o \\t oo}
+ \\quad
+ \\hat o \\check o \\tilde o \\acute o \\grave o \\dot o
+ \\ddot o
+ \\breve o \\bar o \\vec o \\vec h \\hbar
+\\]
+
+\\subsection*{Glyph dimensions}
+
+These glyphs should be optically centered:
+ \\testglyphs\\sidebearings
+These subscripts should be correctly placed:
+ \\testglyphs\\subscripts
+These superscripts should be correctly placed:
+ \\testglyphs\\supscripts
+These subscripts and superscripts should be correctly placed:
+ \\testglyphs\\scripts
+These accents should be centered:
+ \\testglyphs\\vecaccents
+As should these:
+ \\testglyphs\\tildeaccents
+
+\\subsection*{Symbols}
+
+These arrows should join up properly:
+\\[
+ a \\hookrightarrow b \\hookleftarrow c \\longrightarrow d
+ \\longleftarrow e \\Longrightarrow f \\Longleftarrow g
+ \\longleftrightarrow h \\Longleftrightarrow i
+ \\mapsto j
+\\]
+\\[
+ g^\\circ \\mapsto g^\\bullet\\quad x\\equiv y\\not\\equiv z
+\\]
+These symbols should be of similar weights:
+\\[
+ \\pm + - \\mp = / \\backslash ( \\langle [ \\{ \\} ] \\rangle ) < \\leq > \\geq
+\\]
+Are these the same size?
+\\[\\textstyle
+ \\oint \\int \\quad
+ \\bigodot \\bigoplus \\bigotimes \\sum \\prod
+ \\bigcup \\bigcap \\biguplus \\bigwedge \\bigvee \\coprod
+\\]
+Are these?
+\\[
+ \\oint \\int \\quad
+ \\bigodot \\bigoplus \\bigotimes \\sum \\prod
+ \\bigcup \\bigcap \\biguplus \\bigwedge \\bigvee \\coprod
+\\]
+
+
+\\subsection*{Sizing}
+
+\\[
+ abcde + x^{abcde} + 2^{x^{abcde}}
+\\]
+
+The subscripts should be appropriately sized:
+\\begin{quote}
+%\\testsize\\tiny
+%\\testsize\\scriptsize
+%\\testsize\\footnotesize
+%\\testsize\\small
+\\testsize\\normalsize
+%\\testsize\\large
+%\\testsize\\Large
+%\\testsize\\LARGE
+%\\testsize\\huge
+%\\testsize\\Huge
+\\end{quote}
+
+\\subsection*{Delimiters}
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with \\verb|\\big|, etc:
+\\[\\begin{array}{c}
+ \\testdelims\\relax\\relax{a}
+ \\testdelims\\bigl\\bigr{a}
+ \\testdelims\\Bigl\\Bigr{a}
+ \\testdelims\\biggl\\biggr{a}
+ \\testdelims\\Biggl\\Biggr{a}
+\\end{array}\\]
+Then with \\verb|\\left| and \\verb|\\right|:
+\\[\\begin{array}{c}
+ \\testdelims\\left\\right{\\begin{array}{c} a \\end{array}}
+ \\testdelims\\left\\right{\\begin{array}{c} a\\\\a \\end{array}}
+ \\testdelims\\left\\right{\\begin{array}{c} a\\\\a\\\\a \\end{array}}
+ \\testdelims\\left\\right{\\begin{array}{c} a\\\\a\\\\a\\\\a \\end{array}}
+\\end{array}\\]
+
+\\subsection*{Spacing}
+
+This paragraph should appear to be a monotone grey texture. Suppose
+\\(f \\in \\mathcal{S}_n\\) and \\(g(x) = (-1)^{|\\alpha|}x^\\alpha
+f(x)\\). Then \\(g \\in \\mathcal{S}_n\\); now (\\emph{c}) implies
+that \\(\\hat g = D_\\alpha \\hat f\\) and \\(P \\cdot D_\\alpha\\hat
+f = P \\cdot \\hat g = (P(D)g)\\hat{}\\), which is a bounded function,
+since \\(P(D)g \\in L^1(R^n)\\). This proves that \\(\\hat f \\in
+\\mathcal S_n\\). If \\(f_i \\rightarrow f\\) in \\(\\mathcal S_n\\),
+then \\(f_i \\rightarrow f\\) in \\(L^1(R^n)\\). Therefore \\(\\hat
+f_i(t) \\rightarrow \\hat f(t)\\) for all \\(t \\in R^n\\). That \\(f
+\\rightarrow \\hat f\\) is a \\emph{continuous} mapping of
+\\(\\mathcal S_n\\) into \\(\\mathcal S_n\\) follows now from the
+closed graph theorem. \\emph{Functional Analysis}, W.~Rudin,
+McGraw--Hill, 1973. And thus for \\(x_1\\) through \\(x_i\\).
+
+{\\itshape This paragraph should appear to be a monotone grey texture.
+Suppose \\(f \\in \\mathcal{S}_n\\) and \\(g(x) =
+(-1)^{|\\alpha|}x^\\alpha f(x)\\). Then \\(g \\in \\mathcal{S}_n\\);
+now (\\emph{c}) implies that \\(\\hat g = D_\\alpha \\hat f\\) and
+\\(P \\cdot D_\\alpha\\hat f = P \\cdot \\hat g = (P(D)g)\\hat{}\\),
+which is a bounded function, since \\(P(D)g \\in L^1(R^n)\\). This
+proves that \\(\\hat f \\in \\mathcal S_n\\). If \\(f_i \\rightarrow
+f\\) in \\(\\mathcal S_n\\), then \\(f_i \\rightarrow f\\) in
+\\(L^1(R^n)\\). Therefore \\(\\hat f_i(t) \\rightarrow \\hat f(t)\\)
+for all \\(t \\in R^n\\). That \\(f \\rightarrow \\hat f\\) is a
+\\emph{continuous} mapping of \\(\\mathcal S_n\\) into \\(\\mathcal
+S_n\\) follows now from the closed graph theorem. \\emph{Functional
+Analysis}, W.~Rudin, McGraw--Hill, 1973.}
+
+The text in these boxes should spread out as much as the math does:
+\\[\\begin{array}{c}
+ \\framebox[.95\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[.975\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[1.025\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[1.05\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[1.075\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[1.1\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+ \\framebox[1.125\\width][s]{For example \\(x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\\) is a formula.} \\\\
+\\end{array}\\]
+\\end{document}
+EndD
+
diff --git a/fonts/utilities/mathinst/testmatp.tpl b/fonts/utilities/mathinst/testmatp.tpl
new file mode 100644
index 0000000000..6e9fab274a
--- /dev/null
+++ b/fonts/utilities/mathinst/testmatp.tpl
@@ -0,0 +1,325 @@
+&Out("\%\&plain");
+&Out("\n\\font\\TTT=cmr7 \\newcount\\cno");
+&Out("\\def\\TT{\\T\\setbox0=\\hbox{\\char\\cno}\\ifdim\\wd0>0pt");
+&Out(" \\box0\\lower4pt\\hbox{\\TTT\\the\\cno}\\else");
+&Out(" \\ifdim\\ht0>0pt \\box0\\lower4pt\\hbox{\\TTT\\the\\cno}\\fi\\fi");
+&Out(" \\global\\advance\\cno by1");
+&Out("}");
+&Out("\\def\\showfont#1{\\font\\T=#1 at 10pt\\global\\cno=0");
+&Out(" \\tabskip1pt plus2pt minus1pt\\halign to\\hsize{&\\hss\\TT ##\\hss\\cr");
+&Out(" \\multispan{16}\\hfil \\tt Font #1\\hfil\\cr\\noalign{\\smallskip}");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out(" &&&&&&&&&&&&&&&\\cr");
+&Out("}}");
+
+$testfonts = "";
+
+if ($myans =~ /^y/i) {
+ $testfonts = <<"endtestfonts"
+\\showfont{${fontfam_}$rreg${mathid}7t}
+\\smallskip
+\\showfont{${fontfam_}$rreg${mathid}7m}
+\\smallskip
+\\showfont{${fontfam_}$rreg${mathid}7y}
+\\smallskip
+\\showfont{${fontfam_}$rreg${mathid}7v}
+%% \\vfill \\eject
+endtestfonts
+}
+ $AA = <<"EndAA";
+
+%% This is a `plain tex-ified' version of Alan Jeffrey's
+%% testmath.tex.
+
+\\input z$_[0]$fontfam_
+\\advance\\hsize by -4pc
+
+
+\\centerline{\\headingfonts\\bf A Plain Math Test Document}
+\\centerline{\\it $today}
+
+\\raggedbottom
+
+\\def\\emph#1{{\\bf #1}}
+\\def\\framebox[#1]#2{%
+ \\setbox0=\\hbox{#2}\\dimen0=\\wd0
+ \\vbox{\\hrule\\hbox to#1\\dimen0{\\vrule\\vrule width0pt height8pt depth2pt
+ #2\\vrule}\\hrule}}
+\\def\\testsize#1{
+ {\\tt\\string#1}: \$a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2}, X^{X^X}_{X_X},
+ a_{0_a}, 0_{a_0}, E=mc^2, X_{E=mc^2}, X_{X_{E=mc^2}},
+ \\sum_{i=0}^\\infty\$
+}
+
+\\def\\testdelims#1#2#3{\\sqrt{
+ #1|#1\\|#1\\uparrow
+ #1\\downarrow#1\\updownarrow#1\\Uparrow#1\\Downarrow
+ #1\\Updownarrow#1\\lfloor#1\\lceil
+ #1(#1\\{#1[#1\\langle
+ #3
+ #2\\rangle#2]#2\\}#2)
+ #2\\rceil#2\\rfloor#2\\Updownarrow#2\\Downarrow
+ #2\\Uparrow#2\\updownarrow#2\\downarrow#2\\uparrow
+ #2\\|#2|
+}\\cr}
+
+\\def\\testglyphs#1{
+\\endgraf
+\\bgroup\\narrower\\noindent
+ #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m
+ #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z
+ #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M
+ #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z
+ #10#11#12#13#14#15#16#17#18#19
+ #1\\Gamma#1\\Delta#1\\Theta#1\\Lambda#1\\Xi
+ #1\\Pi#1\\Sigma#1\\Upsilon#1\\Phi#1\\Psi#1\\Omega
+ #1\\alpha#1\\beta#1\\gamma#1\\delta#1\\epsilon
+ #1\\varepsilon#1\\zeta#1\\eta#1\\theta#1\\vartheta
+ #1\\iota#1\\kappa#1\\lambda#1\\mu#1\\nu#1\\xi#1\\omicron
+ #1\\pi#1\\varpi#1\\rho#1\\varrho
+ #1\\sigma#1\\varsigma#1\\tau#1\\upsilon#1\\phi
+ #1\\varphi#1\\chi#1\\psi#1\\omega
+ #1\\partial#1\\ell#1\\imath#1\\jmath#1\\wp
+\\endgraf
+\\egroup
+}
+
+\\def\\sidebearings#1{ \$|#1|\$ }
+\\def\\subscripts#1{ \$#1_\\circ\$ }
+\\def\\supscripts#1{ \$#1^\\circ\$ }
+\\def\\scripts#1{ \$#1^\\circ_\\circ\$ }
+\\def\\vecaccents#1{ \$\\vec#1\$ }
+\\def\\tildeaccents#1{ \$\\tilde#1\$ }
+
+\\ifx\\omicron\\undefined
+ \\let\\omicron=o
+\\fi
+
+\\beginsection Introduction
+
+This document (based on a similar document created by Alan Jeffrey)
+tests the math capabilities of a math package for plain \\TeX. The math
+package combines the {\\tt $_[0]} math fonts with the {\\tt $fontfam_}
+text fonts.
+
+$testfonts
+
+\\beginsection Fonts
+
+Math italic:
+\$\$
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz
+\$\$
+Text italic:
+\$\$
+ {\\it ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\$\$
+Roman:
+\$\$
+ {\\rm ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\$\$
+Typewriter:
+\$\$
+ {\\tt ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\$\$
+Bold:
+\$\$
+ {\\bf ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\$\$
+EndAA
+&out($AA);
+$GreekBoldTest = <<"EndGreekBoldTest";
+\$\$
+ {\\bf\\Gamma\\Delta\\Theta\\Lambda\\Xi\\Pi\\Sigma\\Upsilon\\Phi\\Psi\\Omega}
+\$\$
+EndGreekBoldTest
+$CalTest = <<"EndCalTest";
+Calligraphic:
+\$\$
+ A{\\cal ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+\$\$
+EndCalTest
+$SansTest = "Sans:\n\$\$\n A{\\sf ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\\ ";
+$SansTest .= " a{\\sf abcdefghijklmnopqrstuvwxyz}z\n\$\$\n";
+$FrakTest = "Fraktur:\n\$\$\n A{\\frak ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\\ ";
+$FrakTest .= " a{\\frak abcdefghijklmnopqrstuvwxyz}z\n\$\$\n";
+$BBoldTest = "Blackboard Bold:\n\$\$\n";
+$BBoldTest .= " A{\\bb ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\n\$\$\n";
+$BBplain = <<EndBBplain;
+Greek:
+\$\$
+ \\Gamma\\Delta\\Theta\\Lambda\\Xi\\Pi\\Sigma\\Upsilon\\Phi\\Psi\\Omega
+ \\alpha\\beta\\gamma\\delta\\epsilon\\varepsilon\\zeta\\eta\\theta\\vartheta
+ \\iota\\kappa\\lambda\\mu\\nu\\xi\\omicron\\pi\\varpi\\rho\\varrho
+ \\sigma\\varsigma\\tau\\upsilon\\phi\\varphi\\chi\\psi\\omega
+\$\$
+Do these line up appropriately?
+\$\$
+ \\forall {\\cal B} \\Gamma {\\bf D} \\exists {\\tt F}
+ G {\\cal H} \\Im {\\bf J} {\\sf K} \\Lambda
+ M \\aleph \\emptyset \\Pi {\\it Q} \\Re \\Sigma
+ {\\tt T} \\Upsilon {\\cal V} {\\bf W} \\Xi
+ {\\sf Y} Z
+ \\quad
+ a {\\bf c} \\epsilon {\\tt i}
+ \\kappa {\\bf m} \\nu o \\varpi {\\sf r}
+ s \\tau {\\it u} v {\\sf w} z
+ \\quad
+ {\\tt g} j {\\sf q} \\chi y
+ \\quad
+ b \\delta {\\bf f} {\\tt h} k {\\sf l} \\phi
+\$\$
+
+\\beginsection Glyph dimensions
+
+These glyphs should be optically centered:
+ \\testglyphs\\sidebearings
+\\noindent These subscripts should be correctly placed:
+ \\testglyphs\\subscripts
+\\noindent These superscripts should be correctly placed:
+ \\testglyphs\\supscripts
+\\noindent These subscripts and superscripts should be correctly placed:
+ \\testglyphs\\scripts
+\\noindent These accents should be centered:
+ \\testglyphs\\vecaccents
+\\noindent As should these:
+ \\testglyphs\\tildeaccents
+\\noindent And here are accents in general:
+ \\'o \\`o \\^o \\"o \\~o \\=o \\.o \\u o \\v o \\H o
+ \\t oo \\c o \\d o \\b o \\quad
+ \$\\hat o \\check o \\tilde o \\acute o \\grave o \\dot o
+ \\ddot o \\breve o \\bar o \\vec o \\vec h \\hbar\$
+
+\\beginsection Symbols
+
+These arrows should join up properly:
+\$\$
+ a \\hookrightarrow b \\hookleftarrow c \\longrightarrow d
+ \\longleftarrow e \\Longrightarrow f \\Longleftarrow g
+ \\longleftrightarrow h \\Longleftrightarrow i
+ \\mapsto j
+\$\$
+These symbols should of similar weights:
+\$\$
+ \\pm + - \\mp = / \\backslash ( \\langle [ \\{ \\} ] \\rangle ) < \\leq > \\geq
+\$\$
+Are these the same size?
+\$\$\\textstyle
+ \\oint \\int \\quad
+ \\bigodot \\bigoplus \\bigotimes \\sum \\prod
+ \\bigcup \\bigcap \\biguplus \\bigwedge \\bigvee \\coprod
+\$\$
+Are these?
+\$\$
+ \\oint \\int \\quad
+ \\bigodot \\bigoplus \\bigotimes \\sum \\prod
+ \\bigcup \\bigcap \\biguplus \\bigwedge \\bigvee \\coprod
+\$\$
+
+
+\\beginsection Sizing
+
+\$\$
+ abcde + x^{abcde} + 2^{x^{abcde}}
+\$\$
+
+The subscripts should be appropriately sized:
+
+{\\narrower\\noindent\\headingfonts
+\\testsize\\headingfonts \\endgraf
+}
+
+{\\narrower\\noindent\\bodyfonts
+\\testsize\\bodyfonts \\endgraf
+}
+
+{\\narrower\\noindent\\notefonts
+\\testsize\\notefonts \\endgraf
+}
+
+\\beginsection Delimiters
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with {\\tt\\string\\big}, etc:
+\$\$\\vbox{\\halign{\\hfil\$#\$\\hfil\\cr
+ \\testdelims\\relax\\relax{a}
+ \\testdelims\\bigl\\bigr{a}
+ \\testdelims\\Bigl\\Bigr{a}
+ \\testdelims\\biggl\\biggr{a}
+ \\testdelims\\Biggl\\Biggr{a}
+}}\$\$
+Then with {\\tt\\string\\left} and {\\tt\\string\\right}:
+\$\$\\vbox{\\halign{\\hfil\$#\$\\hfil\\cr
+ \\testdelims\\left\\right{\\vcenter{{\\halign{\\hss\$#\$\\hss\\cr a \\cr}}}}
+ \\testdelims\\left\\right{\\vcenter{{\\halign{\\hss\$#\$\\hss\\cr a\\cr a \\cr}}}}
+ \\testdelims\\left\\right{\\vcenter{{\\halign{\\hss\$#\$\\hss\\cr a\\cr a\\cr a \\cr}}}}
+ \\testdelims\\left\\right{\\vcenter{{\\halign{\\hss\$#\$\\hss\\cr a\\cr a\\cr a\\cr a \\cr}}}}
+}}\$\$
+
+\\beginsection Spacing
+
+This paragraph should appear to be a monotone grey texture.
+Suppose \$f \\in {\\cal S}_n\$ and \$g(x) = (-1)^{|\\alpha|}x^\\alpha
+f(x)\$. Then \$g \\in {\\cal S}_n\$; now (\\emph{c}) implies that \$\\hat
+g = D_\\alpha \\hat f\$ and \$P \\cdot D_\\alpha\\hat f = P \\cdot \\hat g =
+(P(D)g)\\hat{}\$, which is a bounded function, since \$P(D)g \\in
+L^1(R^n)\$. This proves that \$\\hat f \\in {\\cal S}_n\$. If \$f_i
+\\rightarrow f\$ in \${\\cal S}_n\$, then \$f_i \\rightarrow f\$ in
+\$L^1(R^n)\$. Therefore \$\\hat f_i(t) \\rightarrow \\hat f(t)\$ for all \$t
+\\in R^n\$. That \$f \\rightarrow \\hat f\$ is a \\emph{continuous} mapping
+of \${\\cal S}_n\$ into \${\\cal S}_n\$ follows now from the closed
+graph theorem. \\emph{Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973. And thus for \$x_1\$ through \$x_i\$.
+
+{\\it This paragraph should appear to be a monotone grey texture.
+Suppose \$f \\in {\\cal S}_n\$ and \$g(x) = (-1)^{|\\alpha|}x^\\alpha
+f(x)\$. Then \$g \\in {\\cal S}_n\$; now (\\emph{c}) implies that \$\\hat
+g = D_\\alpha \\hat f\$ and \$P \\cdot D_\\alpha\\hat f = P \\cdot \\hat g =
+(P(D)g)\\hat{}\$, which is a bounded function, since \$P(D)g \\in
+L^1(R^n)\$. This proves that \$\\hat f \\in {\\cal S}_n\$. If \$f_i
+\\rightarrow f\$ in \${\\cal S}_n\$, then \$f_i \\rightarrow f\$ in
+\$L^1(R^n)\$. Therefore \$\\hat f_i(t) \\rightarrow \\hat f(t)\$ for all \$t
+\\in R^n\$. That \$f \\rightarrow \\hat f\$ is a \\emph{continuous} mapping
+of \${\\cal S}_n\$ into \${\\cal S}_n\$ follows now from the closed
+graph theorem. \\emph{Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973.}
+
+The text in these boxes should spread out as much as the math does:
+\$\$\\vbox{\\halign{\\hfil#\\hfil\\cr
+ \\framebox[.95]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[.975]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1.025]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1.05]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1.075]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1.1]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+ \\framebox[1.125]{For example \$x+y = \\min\\{x,y\\}
+ + \\max\\{x,y\\}\$ is a formula.} \\cr
+\\cr}}\$\$
+\\bye
+EndBBplain
diff --git a/fonts/utilities/mathinst/ucgrkoff.mtx b/fonts/utilities/mathinst/ucgrkoff.mtx
new file mode 100644
index 0000000000..ed5f598d6c
--- /dev/null
+++ b/fonts/utilities/mathinst/ucgrkoff.mtx
@@ -0,0 +1,28 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ucgrkoff.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst metrics file to free up the uppercase Greek letters.
+
+\metrics
+
+\unsetglyph{Gamma}
+\unsetglyph{Delta}
+\unsetglyph{Theta}
+\unsetglyph{Lambda}
+\unsetglyph{Xi}
+\unsetglyph{Pi}
+\unsetglyph{Sigma}
+\unsetglyph{Upsilon1}
+\unsetglyph{Upsilon}
+\unsetglyph{Phi}
+\unsetglyph{Psi}
+\unsetglyph{Omega}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/unfake.mtx b/fonts/utilities/mathinst/unfake.mtx
new file mode 100644
index 0000000000..39f66361cf
--- /dev/null
+++ b/fonts/utilities/mathinst/unfake.mtx
@@ -0,0 +1,67 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file unfake.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+\unfakable{equal}
+\unfakable{equal1}
+\unfakable{plus}
+\unfakable{semicolon}
+\unfakable{grave}
+\unfakable{acute}
+\unfakable{caron}
+\unfakable{breve}
+\unfakable{macron}
+\unfakable{circumflex}
+\unfakable{dotaccent}
+\unfakable{tilde}
+\unfakable{dieresis}
+\unfakable{overbar}
+\unfakable{tie}
+\unfakable{openbullet1}
+\unfakable{parenleft}
+\unfakable{parenright}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Upsilon}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+
+\unfakable{Gamma1}
+\unfakable{Delta1}
+\unfakable{Theta1}
+\unfakable{Lambda1}
+\unfakable{Xi1}
+\unfakable{Pi1}
+\unfakable{Sigma1}
+\unfakable{Upsilon1}
+\unfakable{Phi1}
+\unfakable{Psi1}
+\unfakable{Omega1}
+
+\unfakable{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/upsilon.mtx b/fonts/utilities/mathinst/upsilon.mtx
new file mode 100644
index 0000000000..0d4c8e7a45
--- /dev/null
+++ b/fonts/utilities/mathinst/upsilon.mtx
@@ -0,0 +1,19 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file upsilon.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\ifisglyph{Upsilon}\then
+ \resetglyph{Upsilon1}
+ \glyph{Upsilon}{1000}
+ \endresetglyph
+\fi
+
+\endmetrics
diff --git a/fonts/utilities/mathinst/xdotless.mtx b/fonts/utilities/mathinst/xdotless.mtx
new file mode 100644
index 0000000000..0901faf39c
--- /dev/null
+++ b/fonts/utilities/mathinst/xdotless.mtx
@@ -0,0 +1,16 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file xdotless.mtx, part of the MathInst package
+%% (version 1.0, August, 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\unsetglyph{dotlessi}
+\unsetglyph{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/.dir.tiff b/fonts/utilities/mathkit/.dir.tiff
new file mode 100644
index 0000000000..e0e3bfe193
--- /dev/null
+++ b/fonts/utilities/mathkit/.dir.tiff
Binary files differ
diff --git a/fonts/utilities/mathkit/alphoff.mtx b/fonts/utilities/mathkit/alphoff.mtx
new file mode 100644
index 0000000000..2adee97508
--- /dev/null
+++ b/fonts/utilities/mathkit/alphoff.mtx
@@ -0,0 +1,80 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file alphoff.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is file `alphoff.mtx', based on work by Aloysius G. Helminck.
+
+\relax
+
+This file unsets alphabets (U/c and l/c) and some parameters.
+
+\metrics
+
+\unsetint{xheight}
+\unsetint{ascender}
+\unsetint{descender}
+\unsetint{capheight}
+\unsetint{italicslant}
+
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\unsetglyph{dotlessi}
+\unsetglyph{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/bv.mkr b/fonts/utilities/mathkit/bv.mkr
new file mode 100644
index 0000000000..1778d23f23
--- /dev/null
+++ b/fonts/utilities/mathkit/bv.mkr
@@ -0,0 +1,50 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bv.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=504/75pt#; % height of tallest characters
+asc_height#:=507/75pt#; % height of lowercase ascenders
+cap_height#:=498/75pt#; % height of caps
+fig_height#:=483/75pt#; % height of numerals
+x_height#:=300/75pt#; % height of lowercase without ascenders
+math_axis#:=85/36pt#; % axis of symmetry for math symbols
+bar_height#:=200/75pt#; % height of crossbar in lowercase e
+comma_depth#:=144/75pt#; % depth of comma below baseline
+desc_depth#:=185/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=12/75pt#; % width of extrafine details
+hair#:=16/75pt#; % lowercase hairline breadth
+stem#:=53/75pt#; % lowercase stem breadth
+curve#:=60/75pt#; % lowercase curve breadth
+ess#:=53/75pt#; % breadth in middle of lowercase s
+flare#:=48/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=76/75pt#; % diameter of dots
+cap_hair#:=18/75pt#; % uppercase hairline breadth
+cap_stem#:=73/75pt#; % uppercase stem breadth
+cap_curve#:=81/75pt#; % uppercase curve breadth
+cap_ess#:=78/75pt#; % breadth in middle of uppercase s
+
+dish#:=0/75pt#; % amount erased at top or bottom of serifs
+bracket#:=85/75pt#; % vertical distance from serif base to tangent
+jut#:=52/75pt#; % protrusion of lowercase serifs
+cap_jut#:=78/75pt#; % protrusion of uppercase serifs
+beak_jut#:=51/75pt#; % horizontal protrusion of beak serifs
+beak#:=108/75pt#; % vertical protrusion of beak serifs
+vair#:=17/75pt#; % vertical diameter of hairlines
+bar#:=17/75pt#; % lowercase bar thickness
+slab#:=16/75pt#; % serif and arm thickness
+cap_bar#:=16/75pt#; % uppercase bar thickness
+cap_band#:=16/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=17/75pt#; % vertical drop of sloped serifs
+
+o#:=8/75pt#; % amount of overshoot for curves
+apex_o#:=11/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.123; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/bv.mks b/fonts/utilities/mathkit/bv.mks
new file mode 100644
index 0000000000..8c2951db6f
--- /dev/null
+++ b/fonts/utilities/mathkit/bv.mks
@@ -0,0 +1,48 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bv.mks, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=504/75pt#; % height of tallest characters
+asc_height#:=507/75pt#; % height of lowercase ascenders
+cap_height#:=498/75pt#; % height of caps
+fig_height#:=483/75pt#; % height of numerals
+x_height#:=300/75pt#; % height of lowercase without ascenders
+math_axis#:=85/36pt#; % axis of symmetry for math symbols
+bar_height#:=162/75pt#; % height of crossbar in lowercase e
+comma_depth#:=139/75pt#; % depth of comma below baseline
+desc_depth#:=176/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=28/75pt#; % width of extrafine details
+hair#:=26/75pt#; % lowercase hairline breadth
+stem#:=94/75pt#; % lowercase stem breadth
+curve#:=101/75pt#; % lowercase curve breadth
+flare#:=82/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=107/75pt#; % diameter of dots
+cap_hair#:=39/75pt#; % uppercase hairline breadth
+cap_stem#:=105/75pt#; % uppercase stem breadth
+cap_curve#:=119/75pt#; % uppercase curve breadth
+
+dish#:=0/75pt#; % amount erased at top or bottom of serifs
+bracket#:=85/75pt#; % vertical distance from serif base to tangent
+jut#:=52/75pt#; % protrusion of lowercase serifs
+cap_jut#:=78/75pt#; % protrusion of uppercase serifs
+beak_jut#:=71/75pt#; % horizontal protrusion of beak serifs
+beak#:=89/75pt#; % vertical protrusion of beak serifs
+vair#:=33/75pt#; % vertical diameter of hairlines
+bar#:=35/75pt#; % lowercase bar thickness
+slab#:=34/75pt#; % serif and arm thickness
+cap_bar#:=40/75pt#; % uppercase bar thickness
+cap_band#:=36/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=31/75pt#; % vertical drop of sloped serifs
+
+o#:=8/75pt#; % amount of overshoot for curves
+apex_o#:= 8/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.123; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/bvpacriw.mtx b/fonts/utilities/mathkit/bvpacriw.mtx
new file mode 100644
index 0000000000..860923c76f
--- /dev/null
+++ b/fonts/utilities/mathkit/bvpacriw.mtx
@@ -0,0 +1,83 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bvpacriw.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file is part of the MathKit package. It demonstrates how to
+set up an adjustment file, and is for actual use when installing a
+math font family marrying Baskerville-like math symbols with Adobe
+Caslon text fonts.
+
+These hacks help adjust the positioning of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+\skewkern{A}{230}
+\skewkern{B}{50}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{80}
+\skewkern{J}{80}
+\skewkern{K}{75}
+\skewkern{M}{100}
+\skewkern{N}{75}
+\skewkern{O}{75}
+\skewkern{P}{50}
+\skewkern{Q}{75}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{V}{25}
+\skewkern{W}{20}
+\skewkern{X}{50}
+\skewkern{Y}{20}
+\skewkern{Z}{25}
+\skewkern{a}{75}
+\skewkern{b}{35}
+\skewkern{c}{75}
+\skewkern{d}{100}
+\skewkern{e}{95}
+\skewkern{f}{220}
+\skewkern{g}{55}
+\skewkern{h}{30}
+\skewkern{i}{45}
+\skewkern{j}{55}
+\skewkern{k}{55}
+\skewkern{l}{85}
+\skewkern{m}{30}
+\skewkern{n}{50}
+\skewkern{o}{30}
+\skewkern{p}{50}
+\skewkern{q}{30}
+\skewkern{r}{50}
+\skewkern{s}{50}
+\skewkern{t}{50}
+\skewkern{u}{50}
+\skewkern{v}{50}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{25}
+% \skewkern{z}{50}
+\skewkern{zeta}{50}
+% \skewkern{dotlessi}{50}
+% \skewkern{dotlessj}{50}
+% \skewkern{upsilon}{25}
+% \skewkern{iota}{-50}
+% \skewkern{lambda}{-75}
+% \skewkern{weierstrass}{175}
+% \skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/bvpacrix.mtx b/fonts/utilities/mathkit/bvpacrix.mtx
new file mode 100644
index 0000000000..dda531e46b
--- /dev/null
+++ b/fonts/utilities/mathkit/bvpacrix.mtx
@@ -0,0 +1,144 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bvpacrix.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This file is part of the MathKit package. It demonstrates how to
+set up an adjustment file, and is for actual use when installing a
+math font family marrying Baskerville-like math symbols with Adobe
+Caslon text fonts.
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+\shiftglyph{C}{-75}{0}{0}
+% \shiftglyph{E}{0}{50}{0}
+% \shiftglyph{F}{0}{50}{-100}
+\shiftglyph{G}{-75}{0}{0}
+% \shiftglyph{H}{0}{25}{-25}
+% \shiftglyph{I}{0}{0}{-25}
+\shiftglyph{J}{80}{0}{0}
+% \shiftglyph{K}{0}{0}{-25}
+\shiftglyph{J}{30}{0}{0}
+% \shiftglyph{N}{0}{0}{-25}
+\shiftglyph{O}{-75}{0}{0}
+% \shiftglyph{P}{0}{0}{-100}
+% \shiftglyph{T}{0}{50}{-75}
+% \shiftglyph{U}{-50}{50}{-25}
+% \shiftglyph{V}{-50}{50}{-50}
+% \shiftglyph{W}{-50}{50}{-50}
+% \shiftglyph{X}{0}{50}{-25}
+% \shiftglyph{Y}{-50}{50}{-50}
+% \shiftglyph{b}{0}{-25}{0}
+% \shiftglyph{d}{0}{25}{0}
+\shiftglyph{f}{\scale{\depth{f}}{700}}{0}{25}
+% \shiftglyph{g}{0}{-50}{0}
+\shiftglyph{j}{150}{25}{0}
+% \shiftglyph{l}{0}{50}{0}
+% \shiftglyph{o}{0}{-50}{0}
+% \shiftglyph{p}{75}{-25}{0}
+% \shiftglyph{t}{-25}{50}{0}
+% \shiftglyph{Upsilon}{0}{0}{-50}
+% \shiftglyph{Upsilon}{0}{0}{-100}
+% \shiftglyph{weierstrass}{-100}{-200}{-150}
+\shiftglyph{dotlessj}{175}{0}{0}
+%
+% \unfakable{rho1}
+%
+% \ifisglyph{omega1}\then
+% \setglyph{pi1}
+% \glyph{omega1}{1000}
+% \endsetglyph
+% \fi
+%
+% \ifisglyph{epsilon}\then
+% \setglyph{epsilon1}
+% \glyph{epsilon}{1000}
+% \endsetglyph
+% \fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+% \zerodepth{acute}
+% \zerodepth{grave}
+% \zerodepth{caron}
+% \zerodepth{breve}
+% \zerodepth{macron}
+% \zerodepth{ring}
+% \zerodepth{circumflex}
+% \zerodepth{dotaccent}
+% \zerodepth{tilde}
+% \zerodepth{dieresis}
+%
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\add{\div{\width{tie}}{2}}{45}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+% \ifisglyph{vector}\then
+% \resetglyph{vector}
+% \moveup{1}
+% \glyph{vector}{1000}
+% \moveup{-1}
+% \endresetglyph
+% \fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathkit/dos/alphoff.mtx b/fonts/utilities/mathkit/dos/alphoff.mtx
new file mode 100644
index 0000000000..7f31039fe9
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/alphoff.mtx
@@ -0,0 +1,80 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file alphoff.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is file `alphoff.mtx', based on work by Aloysius G. Helminck.
+
+\relax
+
+This file unsets alphabets (U/c and l/c) and some parameters.
+
+\metrics
+
+\unsetint{xheight}
+\unsetint{ascender}
+\unsetint{descender}
+\unsetint{capheight}
+\unsetint{italicslant}
+
+\unsetglyph{A}
+\unsetglyph{B}
+\unsetglyph{C}
+\unsetglyph{D}
+\unsetglyph{E}
+\unsetglyph{F}
+\unsetglyph{G}
+\unsetglyph{H}
+\unsetglyph{I}
+\unsetglyph{J}
+\unsetglyph{K}
+\unsetglyph{L}
+\unsetglyph{M}
+\unsetglyph{N}
+\unsetglyph{O}
+\unsetglyph{P}
+\unsetglyph{Q}
+\unsetglyph{R}
+\unsetglyph{S}
+\unsetglyph{T}
+\unsetglyph{U}
+\unsetglyph{V}
+\unsetglyph{W}
+\unsetglyph{X}
+\unsetglyph{Y}
+\unsetglyph{Z}
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\unsetglyph{dotlessi}
+\unsetglyph{dotlessj}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/dos/bv.mkr b/fonts/utilities/mathkit/dos/bv.mkr
new file mode 100644
index 0000000000..ed302cae23
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/bv.mkr
@@ -0,0 +1,50 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bv.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=504/75pt#; % height of tallest characters
+asc_height#:=507/75pt#; % height of lowercase ascenders
+cap_height#:=498/75pt#; % height of caps
+fig_height#:=483/75pt#; % height of numerals
+x_height#:=300/75pt#; % height of lowercase without ascenders
+math_axis#:=85/36pt#; % axis of symmetry for math symbols
+bar_height#:=200/75pt#; % height of crossbar in lowercase e
+comma_depth#:=144/75pt#; % depth of comma below baseline
+desc_depth#:=185/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=12/75pt#; % width of extrafine details
+hair#:=16/75pt#; % lowercase hairline breadth
+stem#:=53/75pt#; % lowercase stem breadth
+curve#:=60/75pt#; % lowercase curve breadth
+ess#:=53/75pt#; % breadth in middle of lowercase s
+flare#:=48/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=76/75pt#; % diameter of dots
+cap_hair#:=18/75pt#; % uppercase hairline breadth
+cap_stem#:=73/75pt#; % uppercase stem breadth
+cap_curve#:=81/75pt#; % uppercase curve breadth
+cap_ess#:=78/75pt#; % breadth in middle of uppercase s
+
+dish#:=0/75pt#; % amount erased at top or bottom of serifs
+bracket#:=85/75pt#; % vertical distance from serif base to tangent
+jut#:=52/75pt#; % protrusion of lowercase serifs
+cap_jut#:=78/75pt#; % protrusion of uppercase serifs
+beak_jut#:=51/75pt#; % horizontal protrusion of beak serifs
+beak#:=108/75pt#; % vertical protrusion of beak serifs
+vair#:=17/75pt#; % vertical diameter of hairlines
+bar#:=17/75pt#; % lowercase bar thickness
+slab#:=16/75pt#; % serif and arm thickness
+cap_bar#:=16/75pt#; % uppercase bar thickness
+cap_band#:=16/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=17/75pt#; % vertical drop of sloped serifs
+
+o#:=8/75pt#; % amount of overshoot for curves
+apex_o#:=11/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.123; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/dos/bv.mks b/fonts/utilities/mathkit/dos/bv.mks
new file mode 100644
index 0000000000..ee0f294b90
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/bv.mks
@@ -0,0 +1,48 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bv.mks, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=504/75pt#; % height of tallest characters
+asc_height#:=507/75pt#; % height of lowercase ascenders
+cap_height#:=498/75pt#; % height of caps
+fig_height#:=483/75pt#; % height of numerals
+x_height#:=300/75pt#; % height of lowercase without ascenders
+math_axis#:=85/36pt#; % axis of symmetry for math symbols
+bar_height#:=162/75pt#; % height of crossbar in lowercase e
+comma_depth#:=139/75pt#; % depth of comma below baseline
+desc_depth#:=176/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=28/75pt#; % width of extrafine details
+hair#:=26/75pt#; % lowercase hairline breadth
+stem#:=94/75pt#; % lowercase stem breadth
+curve#:=101/75pt#; % lowercase curve breadth
+flare#:=82/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=107/75pt#; % diameter of dots
+cap_hair#:=39/75pt#; % uppercase hairline breadth
+cap_stem#:=105/75pt#; % uppercase stem breadth
+cap_curve#:=119/75pt#; % uppercase curve breadth
+
+dish#:=0/75pt#; % amount erased at top or bottom of serifs
+bracket#:=85/75pt#; % vertical distance from serif base to tangent
+jut#:=52/75pt#; % protrusion of lowercase serifs
+cap_jut#:=78/75pt#; % protrusion of uppercase serifs
+beak_jut#:=71/75pt#; % horizontal protrusion of beak serifs
+beak#:=89/75pt#; % vertical protrusion of beak serifs
+vair#:=33/75pt#; % vertical diameter of hairlines
+bar#:=35/75pt#; % lowercase bar thickness
+slab#:=34/75pt#; % serif and arm thickness
+cap_bar#:=40/75pt#; % uppercase bar thickness
+cap_band#:=36/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=31/75pt#; % vertical drop of sloped serifs
+
+o#:=8/75pt#; % amount of overshoot for curves
+apex_o#:= 8/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.123; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/dos/bvpacriw.mtx b/fonts/utilities/mathkit/dos/bvpacriw.mtx
new file mode 100644
index 0000000000..b368eef221
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/bvpacriw.mtx
@@ -0,0 +1,83 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bvpacriw.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file is part of the MathKit package. It demonstrates how to
+set up an adjustment file, and is for actual use when installing a
+math font family marrying Baskerville-like math symbols with Adobe
+Caslon text fonts.
+
+These hacks help adjust the positioning of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+\skewkern{A}{230}
+\skewkern{B}{50}
+\skewkern{C}{100}
+\skewkern{D}{50}
+\skewkern{E}{75}
+\skewkern{F}{75}
+\skewkern{G}{100}
+\skewkern{H}{50}
+\skewkern{I}{80}
+\skewkern{J}{80}
+\skewkern{K}{75}
+\skewkern{M}{100}
+\skewkern{N}{75}
+\skewkern{O}{75}
+\skewkern{P}{50}
+\skewkern{Q}{75}
+\skewkern{R}{100}
+\skewkern{S}{100}
+\skewkern{T}{50}
+\skewkern{U}{50}
+\skewkern{V}{25}
+\skewkern{W}{20}
+\skewkern{X}{50}
+\skewkern{Y}{20}
+\skewkern{Z}{25}
+\skewkern{a}{75}
+\skewkern{b}{35}
+\skewkern{c}{75}
+\skewkern{d}{100}
+\skewkern{e}{95}
+\skewkern{f}{220}
+\skewkern{g}{55}
+\skewkern{h}{30}
+\skewkern{i}{45}
+\skewkern{j}{55}
+\skewkern{k}{55}
+\skewkern{l}{85}
+\skewkern{m}{30}
+\skewkern{n}{50}
+\skewkern{o}{30}
+\skewkern{p}{50}
+\skewkern{q}{30}
+\skewkern{r}{50}
+\skewkern{s}{50}
+\skewkern{t}{50}
+\skewkern{u}{50}
+\skewkern{v}{50}
+\skewkern{w}{75}
+\skewkern{x}{75}
+\skewkern{y}{25}
+% \skewkern{z}{50}
+\skewkern{zeta}{50}
+% \skewkern{dotlessi}{50}
+% \skewkern{dotlessj}{50}
+% \skewkern{upsilon}{25}
+% \skewkern{iota}{-50}
+% \skewkern{lambda}{-75}
+% \skewkern{weierstrass}{175}
+% \skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/dos/bvpacrix.mtx b/fonts/utilities/mathkit/dos/bvpacrix.mtx
new file mode 100644
index 0000000000..4386b2a1ee
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/bvpacrix.mtx
@@ -0,0 +1,144 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file bvpacrix.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This file is part of the MathKit package. It demonstrates how to
+set up an adjustment file, and is for actual use when installing a
+math font family marrying Baskerville-like math symbols with Adobe
+Caslon text fonts.
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+\shiftglyph{C}{-75}{0}{0}
+% \shiftglyph{E}{0}{50}{0}
+% \shiftglyph{F}{0}{50}{-100}
+\shiftglyph{G}{-75}{0}{0}
+% \shiftglyph{H}{0}{25}{-25}
+% \shiftglyph{I}{0}{0}{-25}
+\shiftglyph{J}{80}{0}{0}
+% \shiftglyph{K}{0}{0}{-25}
+\shiftglyph{J}{30}{0}{0}
+% \shiftglyph{N}{0}{0}{-25}
+\shiftglyph{O}{-75}{0}{0}
+% \shiftglyph{P}{0}{0}{-100}
+% \shiftglyph{T}{0}{50}{-75}
+% \shiftglyph{U}{-50}{50}{-25}
+% \shiftglyph{V}{-50}{50}{-50}
+% \shiftglyph{W}{-50}{50}{-50}
+% \shiftglyph{X}{0}{50}{-25}
+% \shiftglyph{Y}{-50}{50}{-50}
+% \shiftglyph{b}{0}{-25}{0}
+% \shiftglyph{d}{0}{25}{0}
+\shiftglyph{f}{\scale{\depth{f}}{700}}{0}{25}
+% \shiftglyph{g}{0}{-50}{0}
+\shiftglyph{j}{150}{25}{0}
+% \shiftglyph{l}{0}{50}{0}
+% \shiftglyph{o}{0}{-50}{0}
+% \shiftglyph{p}{75}{-25}{0}
+% \shiftglyph{t}{-25}{50}{0}
+% \shiftglyph{Upsilon}{0}{0}{-50}
+% \shiftglyph{Upsilon}{0}{0}{-100}
+% \shiftglyph{weierstrass}{-100}{-200}{-150}
+\shiftglyph{dotlessj}{175}{0}{0}
+%
+% \unfakable{rho1}
+%
+% \ifisglyph{omega1}\then
+% \setglyph{pi1}
+% \glyph{omega1}{1000}
+% \endsetglyph
+% \fi
+%
+% \ifisglyph{epsilon}\then
+% \setglyph{epsilon1}
+% \glyph{epsilon}{1000}
+% \endsetglyph
+% \fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+% \zerodepth{acute}
+% \zerodepth{grave}
+% \zerodepth{caron}
+% \zerodepth{breve}
+% \zerodepth{macron}
+% \zerodepth{ring}
+% \zerodepth{circumflex}
+% \zerodepth{dotaccent}
+% \zerodepth{tilde}
+% \zerodepth{dieresis}
+%
+\ifisglyph{tie}\then
+ \resetglyph{tie}
+ \push
+ \movert{\add{\div{\width{tie}}{2}}{45}}
+ \glyph{tie}{1000}
+ \pop
+ \samesize{tie}
+ \endresetglyph
+\fi
+% \ifisglyph{vector}\then
+% \resetglyph{vector}
+% \moveup{1}
+% \glyph{vector}{1000}
+% \moveup{-1}
+% \endresetglyph
+% \fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathkit/dos/dotlessj.mtx b/fonts/utilities/mathkit/dos/dotlessj.mtx
new file mode 100644
index 0000000000..8c562aa156
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/dotlessj.mtx
@@ -0,0 +1,43 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file dotlessj.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This fontinst file sets a dotless j glyph for a TeX
+math italic font. The following code is due to Thierry Bouche,
+a paper of whose on virtual math fonts can be found at
+ftp://fourier.ujf-grenoble.fr/pub/contrib-tex/gut/mathfonts-pk.ps.gz
+
+(Alan Hoenig made a few very minor changes only.)
+
+\metrics
+
+\resetglyph{dotlessj}
+\glyphspecial{ps: gsave gsave}
+ \push
+ \moveup{\neg{\depth{j}}}
+ \movert{\neg{\width{j}}}
+ \glyphspecial{ps: currentpoint /JDepth exch def /JLeft exch def}
+ \moveup{\add{\depth{j}}{\height{dotlessi}}}
+ %\movert{\mul{\width{j}}{2}}
+ \movert{\scale{\width{j}}{2500}} %% AH
+ \glyphspecial{ps: currentpoint /IHeight exch def /JRight exch def grestore}
+ \glyphspecial{ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto
+ 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0
+ rlineto 0 JDepth neg IHeight add neg rlineto closepath clip}
+ \pop
+ \glyph{j}{1000}
+ \glyphspecial{ps: grestore}
+ \resetdepth{\depth{j}}
+ \resetwidth{\width{j}}
+ \resetitalic{\italic{j}}
+ \resetheight{\height{dotlessi}} %% AH
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/dos/greekoff.mtx b/fonts/utilities/mathkit/dos/greekoff.mtx
new file mode 100644
index 0000000000..ceaa49dcaa
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/greekoff.mtx
@@ -0,0 +1,45 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file greekoff.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\Unsetglyph#1{\ifisglyph{#1}\then
+ \unsetglyph{#1}\fi
+}
+
+\Unsetglyph{Gamma}
+\Unsetglyph{Delta}
+\Unsetglyph{Theta}
+\Unsetglyph{Lambda}
+\Unsetglyph{Xi}
+\Unsetglyph{Pi}
+\Unsetglyph{Sigma}
+\Unsetglyph{Upsilon}
+\Unsetglyph{Upsilon1}
+\Unsetglyph{Phi}
+\Unsetglyph{Psi}
+\Unsetglyph{Omega}
+
+%% We'll also unset other Adobe glyphs that are found in a CMR or CMBX font.
+
+\Unsetglyph{backslash}
+\Unsetglyph{braceleft}
+\Unsetglyph{braceright}
+\Unsetglyph{bracketleft}
+\Unsetglyph{bracketright}
+\Unsetglyph{equal}
+\Unsetglyph{greater}
+\Unsetglyph{less}
+\Unsetglyph{plusminus}
+\Unsetglyph{plus}
+\Unsetglyph{slash}
+
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/dos/ihax.mtx b/fonts/utilities/mathkit/dos/ihax.mtx
new file mode 100644
index 0000000000..a0a2d2e6a3
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/ihax.mtx
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ihax.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+% \shiftglyph{C}{-50}{0}{-25}
+% \shiftglyph{E}{0}{50}{0}
+% \shiftglyph{F}{0}{50}{-100}
+% \shiftglyph{H}{0}{25}{-25}
+% \shiftglyph{I}{0}{0}{-25}
+% \shiftglyph{K}{0}{0}{-25}
+% \shiftglyph{J}{0}{0}{-25}
+% \shiftglyph{N}{0}{0}{-25}
+% \shiftglyph{P}{0}{0}{-100}
+% \shiftglyph{T}{0}{50}{-75}
+% \shiftglyph{U}{-50}{50}{-25}
+% \shiftglyph{V}{-50}{50}{-50}
+% \shiftglyph{W}{-50}{50}{-50}
+% \shiftglyph{X}{0}{50}{-25}
+% \shiftglyph{Y}{-50}{50}{-50}
+% \shiftglyph{b}{0}{-25}{0}
+% \shiftglyph{d}{0}{25}{0}
+% \shiftglyph{f}{\scale{\depth{f}}{750}}{0}{25}
+% \shiftglyph{g}{0}{-50}{0}
+% \shiftglyph{j}{150}{25}{0}
+% \shiftglyph{l}{0}{50}{0}
+% \shiftglyph{o}{0}{-50}{0}
+% \shiftglyph{p}{75}{-25}{0}
+% \shiftglyph{t}{-25}{50}{0}
+% \shiftglyph{Upsilon}{0}{0}{-50}
+% \shiftglyph{Upsilon}{0}{0}{-100}
+% \shiftglyph{weierstrass}{-100}{-200}{-150}
+%
+% \unfakable{rho1}
+%
+% \ifisglyph{omega1}\then
+% \setglyph{pi1}
+% \glyph{omega1}{1000}
+% \endsetglyph
+% \fi
+%
+% \ifisglyph{epsilon}\then
+% \setglyph{epsilon1}
+% \glyph{epsilon}{1000}
+% \endsetglyph
+% \fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+% \zerodepth{acute}
+% \zerodepth{grave}
+% \zerodepth{caron}
+% \zerodepth{breve}
+% \zerodepth{macron}
+% \zerodepth{ring}
+% \zerodepth{circumflex}
+% \zerodepth{dotaccent}
+% \zerodepth{tilde}
+% \zerodepth{dieresis}
+%
+% \ifisglyph{tie}\then
+% \resetglyph{tie}
+% \push
+% \movert{\div{\width{tie}}{2}}
+% \glyph{tie}{1000}
+% \pop
+% \samesize{tie}
+% \endresetglyph
+% \fi
+% \ifisglyph{vector}\then
+% \resetglyph{vector}
+% \moveup{1}
+% \glyph{vector}{1000}
+% \moveup{-1}
+% \endresetglyph
+% \fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathkit/dos/iskew.mtx b/fonts/utilities/mathkit/dos/iskew.mtx
new file mode 100644
index 0000000000..7a68cd2b77
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file iskew.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+% \skewkern{A}{75}
+% \skewkern{B}{100}
+% \skewkern{C}{100}
+% \skewkern{D}{50}
+% \skewkern{E}{75}
+% \skewkern{F}{75}
+% \skewkern{G}{100}
+% \skewkern{H}{50}
+% \skewkern{I}{100}
+% \skewkern{J}{200}
+% \skewkern{K}{75}
+% \skewkern{M}{100}
+% \skewkern{N}{25}
+% \skewkern{O}{100}
+% \skewkern{P}{100}
+% \skewkern{Q}{100}
+% \skewkern{R}{100}
+% \skewkern{S}{100}
+% \skewkern{T}{50}
+% \skewkern{U}{50}
+% \skewkern{X}{50}
+% \skewkern{Z}{50}
+% \skewkern{a}{75}
+% \skewkern{c}{75}
+% \skewkern{d}{200}
+% \skewkern{e}{75}
+% \skewkern{f}{190}
+% \skewkern{g}{75}
+% \skewkern{i}{75}
+% \skewkern{j}{150}
+% \skewkern{l}{100}
+% \skewkern{m}{50}
+% \skewkern{n}{50}
+% \skewkern{o}{75}
+% \skewkern{p}{100}
+% \skewkern{q}{75}
+% \skewkern{r}{50}
+% \skewkern{s}{100}
+% \skewkern{t}{50}
+% \skewkern{u}{75}
+% \skewkern{v}{75}
+% \skewkern{w}{75}
+% \skewkern{x}{75}
+% \skewkern{y}{75}
+% \skewkern{z}{50}
+% \skewkern{dotlessi}{50}
+% \skewkern{dotlessj}{50}
+% \skewkern{upsilon}{25}
+% \skewkern{iota}{-50}
+% \skewkern{lambda}{-75}
+% \skewkern{weierstrass}{175}
+% \skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/dos/makevp.mk b/fonts/utilities/mathkit/dos/makevp.mk
new file mode 100644
index 0000000000..adcaf54811
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/makevp.mk
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file makevp.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% This template file for MathKit helps make the fontinst installation
+%%% script for creating virtual fonts.
+
+\input fontinst.sty
+
+%% AFMs we need...
+
+%% ROMAN: <fam>r8a <fam>r8x <fam>ri8a <fam>ri8x
+[b]%% BOLD: <fam>b8a <fam>b8x <fam>bi8a <fam>bi8x
+
+%% THE FONTINST COMMANDS FOLLOW...
+
+\transformfont{<fam>r8r}{\reencodefont{8r}{\fromafm{<fam>r8a}}}
+\transformfont{<fam>ri8r}{\reencodefont{8r}{\fromafm{<fam>ri8a}}}
+[b]\transformfont{<fam><b>8r}{\reencodefont{8r}{\fromafm{<fam><b>8a}}}
+[b]\transformfont{<fam><b>i8r}{\reencodefont{8r}{\fromafm{<fam><b>i8a}}}
+
+\installfonts
+ \installfamily{<encoding>}{<mock><fam>}{}
+ \installfamily{OML}{<mock><fam>}{\skewchar\font=127}
+%% Math Roman...
+ \installfont{<fam>r<m><enc>tc}{<fam>r<enct>,dotlessj,greekoff,<mock>r12,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<12>}
+ \installfont{<fam>r<m><enc>t}{<fam>r<enct>,dotlessj,greekoff,<mock>r10,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<10>}
+ \installfont{<fam>r<m><enc>t9}{<fam>r<enct>,dotlessj,greekoff,<mock>r9,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<9>}
+ \installfont{<fam>r<m><enc>t7}{<fam>r<enct>,dotlessj,greekoff,<mock>r7,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<7>}
+ \installfont{<fam>r<m><enc>t5}{<fam>r<enct>,dotlessj,greekoff,<mock>r5,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<5>}
+%% Math Italic...
+ \installfont{<fam>r<m>7mc}{<hax>riw,<mock>mi12,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<12>}
+ \installfont{<fam>r<m>7m}{<hax>riw,<mock>mi10,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<10>}
+ \installfont{<fam>r<m>7m9}{<hax>riw,<mock>mi9,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<9>}
+ \installfont{<fam>r<m>7m7}{<hax>riw,<mock>mi7,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<7>}
+ \installfont{<fam>r<m>7m5}{<hax>riw,<mock>mi5,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<5>}
+[b]%% Math Roman Bold...
+[b] \installfont{<fam><b><m><enc>tc}{<fam><b><enct>,dotlessj,greekoff,<mock>bx12,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<12>}
+[b] \installfont{<fam><b><m><enc>t}{<fam><b><enct>,dotlessj,greekoff,<mock>bx10,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<10>}
+[b] \installfont{<fam><b><m><enc>t7}{<fam><b><enct>,dotlessj,greekoff,<mock>bx7,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<7>}
+[b] \installfont{<fam><b><m><enc>t5}{<fam><b><enct>,dotlessj,greekoff,<mock>bx5,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<5>}
+[b]%% Math Bold Italic...
+[b] \installfont{<fam><b><m>7mc}{<hax>biw,<mock>mib12,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<12>}
+[b] \installfont{<fam><b><m>7m}{<hax>biw,<mock>mib10,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<10>}
+[b] \installfont{<fam><b><m>7m7}{<hax>biw,<mock>mib7,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<7>}
+[b] \installfont{<fam><b><m>7m5}{<hax>biw,<mock>mib5,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<5>}
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/mathkit/dos/mathkit b/fonts/utilities/mathkit/dos/mathkit
new file mode 100644
index 0000000000..522babe3d2
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mathkit
@@ -0,0 +1,1048 @@
+#!/usr/local/bin/perl
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "0.7",
+### date = "January 1998",
+### filename = "mathkit",
+### address = "Department of Mathematics
+### John Jay College
+### 445 West 59th Street
+### New York, NY 10019
+### USA",
+### telephone = "(516) 385-0736",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### supported = "yes",
+### abstract = "This script constructs the scripts for installing
+### math fonts combining outline letters and numerals
+### matching Metafont bitmaps for special symbols.",
+### package = "MathKit",
+### dependencies = "perl,"
+### }
+### ====================================================================
+
+## USAGE: perl mathkit <template> <font-fam> <encoding>
+## Examples of use (assumes presence of tm.mkr, tm.mkb):
+## perl ../mathkit tm mnt OT1
+## or simply (if the script is made executable)
+## ../mathkit tm mnt OT1;
+
+## Some system parameters...
+
+$version = "0.7";
+$noslant = 0;
+$slanted = 1;
+
+$true = 1;
+$false = 0;
+
+## Routines to make conversion between DOS and Unix simple..
+## $mv is the form of the `move' command.
+## $sep is the path separator for the system.
+## $q is the quote character to surround command line parameters and
+## prevent expansion by the operating system.
+## $comment is the string that begins a comment in a system file.
+
+sub UNIX{$mv="mv"; $sep="/"; $q="\'"; $comment="##";}
+sub DOS{$mv="domove"; $sep="\\"; $q=""; $comment="REM";}
+
+require("..\\mathkit.par"); # get parameters (system dependent)
+
+if (not $sans_font) {
+ $sans_font = "cmss";
+ $sans_supplier = "public";
+ $sans_typeface = "cm";
+ $sans_installer = "base";
+}
+
+$rm_tfm = $tfm; # where are roman tfm's?
+$cm_tfm = $tfm; # where are CM tfm's?
+$sf_tfm = $tfm; # where are sans serif tfm's?
+$plain_inputs = $inputs; # where do plain styles go?
+$rm_inputs = $inputs;
+
+$pkext = "pk"; $gfext = "gf"; # DOS defaults
+if ($sep ne "\\") {
+ $pkext = "${dpi}pk";
+ $gfext = "${dpi}gf";
+}
+
+if ($texmf) { # for TDS systems only...
+ $pk = "$texmf${sep}fonts${sep}pk${sep}$mode${sep}mathkit";
+ $pk = "$pk${sep}z$ARGV[0]$ARGV[1]${sep}dpi$dpi";
+ $vf = "$texmf${sep}fonts${sep}vf${sep}mathkit${sep}z$ARGV[0]$ARGV[1]";
+ $tfm = "$texmf${sep}fonts${sep}tfm${sep}mathkit${sep}z$ARGV[0]$ARGV[1]";
+ $mfinputs = "$texmf${sep}fonts${sep}source";
+ $rm_inputs = "$texmf${sep}tex${latex}${sep}$installer";
+ $inputs = "$texmf${sep}tex${sep}latex${sep}mathkit";
+ $plain_inputs = "$texmf${sep}tex${sep}plain${sep}mathkit";
+ $afm = "$texmf${sep}fonts${sep}afm${sep}$supplier$sep$typeface";
+ $rm_tfm = "$texmf${sep}fonts${sep}tfm${sep}$supplier$sep$typeface";
+ $cm_tfm = "$texmf${sep}fonts${sep}tfm${sep}public${sep}cm";
+ $sf_tfm =
+ "$texmf${sep}fonts${sep}tfm${sep}$sans_supplier$sep$sans_typeface";
+}
+
+open (MKDIR, ">mkdirs.bat");
+&banner("MKDIR", "mkdirs.bat");
+$mkdir = "mkdir"; # system dependent `mkdir' command
+sub check_dir{ # does a directory exist?
+ local($thisdir) = $_[0];
+ if (not -d $thisdir) {
+ push(@missingdirs, $thisdir);
+ }
+}
+
+sub check_dirs{ # does a list of directories exist?
+ foreach $dir (@_) {
+ &check_dir($dir);
+ }
+ foreach $miss (@missingdirs) {
+ $misss = "$miss$sep";
+ $Sep = "$sep";
+ $Sep = "\\\\" if $sep eq "\\"; # special case for DOS
+ while ($misss =~ m/$Sep/g) {
+ if (($know_about{$`} == $false) and (not -d $`)) {
+ print MKDIR "$mkdir $`\n" unless $` eq "";
+ $know_about{$`} = $true;
+ }
+ }
+ }
+ close MKDIR; undef %know_about;
+}
+&check_dirs(
+ $tfm,
+ $rm_tfm,
+ $cm_tfm,
+ $sf_tfm,
+ $afm,
+ $pk,
+ $vf,
+ $psfonts,
+ $mfinputs,
+ $inputs,
+ $plain_inputs,
+ $rm_inputs,
+ );
+
+## Some bookkeeping with respect to date and time...
+
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
+$thisday=(Sun,Mon,Tues,Wednes,Thurs,Fri,Satur)[$wday];
+$thisday="${thisday}day";
+$month=(January,February,March,April,May,June,July,August,
+ September,October,November,December)[$mon];
+$fullyear="19$year";
+if ($year<50) {$fullyear="20$year";}
+sub timestamp{
+ if ($min<10) {$min="0$min";}
+ $currtime="$hour:$min";
+ $currdate="$thisday, $month $mday, $fullyear";
+}
+&timestamp;
+
+## Some utility routines...
+
+sub display{ # prints its argument on screen
+ foreach $thingy (@_) {
+ print $thingy;
+ }
+}
+
+sub log{ # prints arguments in log file
+ foreach $thingy (@_) {
+ print LOG $thingy;
+ }
+}
+
+sub record{ # logs and prints arguments
+ foreach $thingy (@_) {
+ print $thingy;
+ print LOG $thingy;
+ }
+}
+
+$FH_ = "STDOUT"; # default value
+sub out{ # prints to a given file.
+ foreach $str (@_){
+ print $FH_ $str;
+ }
+}
+sub copy{
+ die "`copy' can't find file $_[0]" unless -e $_[0];
+ open(COPYIN, $_[0]); # the source
+ open(COPYOUT, ">$_[1]"); # the target
+ while (<COPYIN>) {print COPYOUT $_;}
+ close COPYOUT;
+}
+
+sub safecopy{# copy source to target ONLY if target doesn't exist either in
+ ## current dir or in parent dir
+ if ((not -e $_[1]) and (not -e "..$sep$_[1]")) { # target doesn't exist
+ &copy(@_);
+ } else {
+ &record("Copy operation skipped; file $_[1] already exists.\n");
+ }
+}
+
+## We need a routine to print a banner on files and scripts
+## that MathKit makes. Arguments are: filehandle, comment char,
+## file name. Usage: &printbanner("TEX", "%", "testmath.tex")
+
+sub printbanner{
+ local($fh_,$comment_,$filename)=($_[0],$_[1],$_[2]);
+ print $fh_ "$comment_ This is file $filename,";
+ print $fh_ " created by MathKit$version + Perl$].\n";
+ print $fh_ "$comment_ It was created at $currtime on $currdate.\n";
+ print $fh_ "$comment_ \n";
+ print $fh_ "$comment_ YOU MAY DELETE THIS FILE AFTER USE.\n";
+ print $fh_ "$comment_ \n";
+}
+
+sub banner{# prints banner in auxiliary files.
+ &printbanner($_[0], $comment, $_[1]);
+}
+
+## Get command line params...
+
+ $start_up =<<"EndStart";
+MathKit needs three arguments to work. Firstly, I need to know the name
+of the template I should use. At the moment, there are three templates
+to choose from:
+
+ 1. bv (Baskerville-like);
+ 2. tm (Times Roman-like); and
+ 3. pl (Palatino-like).
+
+I also need to know the name of the Roman font to use. This should be the
+three-character abbreviation under which this family was installed---some-
+thing like 'mbv' (Baskerville), 'pad' (Adobe Garamond), 'ppl' (Palatino),
+or 'ptm' (Times) is what I am looking for. Finally, I need an encoding
+scheme, either 'OT1' or 'ot1'. As a result, the command line to get me
+going should look something like this:
+
+ ../mathkit bv mbv OT1
+
+Please consider reading the file 'mathkit.tex' (a LaTeX file) for further
+important information. (These comments are stored in the file 'todo.1st'.)
+
+EndStart
+
+if ($#ARGV != 2) {
+ open (TODO, ">todo.1st");
+ print TODO $start_up;
+ print $start_up;
+ close TODO;
+ die "Fix me and start again.";
+}
+$tseries=$ARGV[0]; # the template series
+$tser=substr($tseries,0,1); # 1st char becomes $tseries abbreviation
+$fontfam=$ARGV[1]; # font family (using Berry name)
+open (LOG, ">z$tseries$fontfam.klg"); # open log file
+$encoding=$ARGV[2];# which encoding? (T1 or OT1 only)
+
+## Print banner, first off...
+
+&record("This is MathKit$version + Perl$] at $currtime on $currdate.\n\n");
+&record("We are using MathKit template $tseries.\n");
+&record("We are using font family $fontfam.\n");
+&record("The encoding is $encoding.\n");
+
+
+$enc = 8; # set the encoding `digit'
+$enc = 7 if $encoding =~ /o/i;
+
+## Checking and retrieving font template information...
+
+if (-e "..${sep}${tseries}.mkr") {# get template for Roman fonts
+ $template[0]="..${sep}${tseries}.mkr";
+} else {# template doesn't exist!
+ &record("Where's the template file $tseries? Dying...\n");
+ die "At least, I need to see $tseries.mkr in the parent directory.";
+}
+
+## We need only one bold template (if there is at least one). We try
+## bold first, but prefer the semibold...
+
+if (-e "..${sep}${tseries}.mkb") {# get bold template
+ $template[1]="..${sep}${tseries}.mkb";
+## $bld = "b";
+## $nfssbld = "b";
+}
+if (-e "..${sep}${tseries}.mks") {# get semibold template
+ $template[1]="..${sep}${tseries}.mks";
+## $bld = "s";
+## $nfssbld = "sb";
+}
+
+## We need to determine the proper boldweight to use...
+## The default:
+$bld = "b";
+$nfssbld = "b";
+## Now to test for the semibold (we prefer to use the semibold if the
+## Roman semibold fonts are present.)
+if (-e "$afm${sep}${fontfam}s8a.afm") {
+ $bld = "s";
+ $nfssbld = "sb";
+ &record("Text fonts: We are using semibold weights in this run.\n");
+} else {
+ &record("Text fonts: We are using bold weights in this run.\n");
+}
+
+## Now to check font info...
+
+$fullafm = "$afm${sep}${fontfam}r8a.afm";
+$expafm = "$afm${sep}${fontfam}r8x.afm";
+if (not -e $fullafm) {
+ &record("I'm missing font info in $fullafm. Help...\n");
+ die "I need font info to continue...";
+}
+$exp = 1 if -e $expafm; # Do real experts exist?
+
+## End of preliminary processing...
+
+## Subroutines follow...
+
+sub afm_metric_info{
+ local($target_char, $afm_file) = @_;
+ open (TMP, "$afm$sep$afm_file.afm") or
+ die "Can't find $afm$sep$afm_file.afm. Dying...";
+ local($h, $d) = (-999,999); # default values
+ while (<TMP>) {
+ chomp $_;
+ last if /EndCharMetrics/;
+ next unless /^C\s+\d+/;
+ /C\s+\d+\s+\; WX\s+\d+ \; N ([A-Za-z]+) \; B -?\d+ (-?\d+) \d+ (\d+) \;/;
+ if ($1 eq $target_char) {
+ $h = sprintf "%5.1f", 36*$3/100;
+ $d = sprintf "%5.1f", 36*$2/100;
+ $h =~ s/\.0$//; # strip off final `.0'
+ $d =~ s/\.0$//;
+ $h = "$h/36pt\#"; # add Metafont grammar
+ $d = "$d/36pt\#";
+ }
+ }
+ close TMP;
+ ($h, $d);
+}
+
+## The routine get_fontfam_parameters reads the afm file to get
+## values for seven properties of the font that enter into a
+## Metafont font description. (The only 2 we can't extract are
+## the bar height and math axis.) We only use this information, however,
+## if the parameter $should_try_to_match is set to a non-null, non-zero
+## value in the file `mathkit.par'.
+## The parameter for this routine is a the Berry weight---usually
+## `r', or `b', or `s'---of the scalable fonts we are matching.
+
+sub get_fontfam_parameters{
+ local($tmp);
+ local($afmfile) = "${fontfam}$_[0]8a";
+ ($body_height, $tmp) = &afm_metric_info("parenleft", $afmfile);
+ ($asc_height, $tmp) = &afm_metric_info("h", $afmfile);
+ ($cap_height, $tmp) = &afm_metric_info("B", $afmfile);
+ ($fig_height, $tmp) = &afm_metric_info("5", $afmfile);
+ ($x_height, $tmp) = &afm_metric_info("x", $afmfile);
+ ($tmp, $comma_depth) = &afm_metric_info(",", $afmfile);
+ ($tmp, $desc_depth) = &afm_metric_info("g", $afmfile);
+}
+
+sub adjust_font_parameters{
+ local(@tmp) = ("body_height", "asc_height", "cap_height", "fig_height",
+ "x_height", "comma_depth", "desc_depth");
+ local($temp);
+ foreach $strng (@tmp) {
+ $temp = "$str\#";
+ $param{$temp} = $$temp;
+ }
+}
+
+
+sub get_template_info{
+ open (IN, "$_[0]");
+ undef %param; # just in case
+ while ($_ = <IN>) {
+ if ($_ =~ /^([a-zA-Z_#]+):=([0-9a-z\/\.#]+);/) {
+ $param{$1} = "$2"; #
+
+ }
+ }
+ close IN;
+}
+
+## Some comments about the special fonts (cal, tt, frak, bb, sans serif):
+## Calligraphic is easiest---we pluck them from the cmsy font, and they
+## already have been properly scaled. Typewriter tt fonts come from
+## cmtt10 which we assume to exist in a scalable version.
+## Fraktur comes from the scalable version of eufm10 (BaKoMa font).
+## Blackboard bold will be generated only if the mf source exists;
+## bb comes from Alan Jeffrey's bbold10 font.
+##
+## Sans serif fonts are a very special case, as they are almost always
+## part of a family of sans serif fonts. MathKit examines the $ss_font
+## variable in the .par file. If it doesn't exist, no sans serif is taken.
+
+$cm_x_height = "155/36pt\#";
+$cm_xht_num = "155";
+$cmss_x_height = "160/36pt\#";
+$cmss_xht_num = "160";
+$frak_x_height = "169.6/36pt\#";
+$frak_xht_num = "169.6";
+ $newbbold =<<"endnewbbold";
+\% Font ${tseries}bb10 is modified Blackboard bold 10pt.
+mode_setup;
+input bbbase;
+% Hacks to make sure cmr doesn't generate the font, and doesn't load cmbase.
+cmbase := 1;
+def generate suffix t = enddef;
+% Input the cmr parameters.
+input ${tseries}r10;
+font_identifier := "${tseries}-BBOLD";
+font_coding_scheme := "Blackboard bold";
+% Then generate blackboard bold.
+input bbold;
+bye;
+endnewbbold
+
+sub get_font_fam{
+ local($fontfam, $fontenc) = ("cmss", "7t"); # default
+ local($font) = $_[0];
+ if (not $font =~ /^cmss/) {
+ $fontfam = substr $font, 0, 3;
+ $fontenc = substr $font, 4, 99;
+ }
+ ($fontfam, $fontenc);
+}
+
+## First, define some fudge factors for better visual compatibility
+## during the scaling process...
+$fudge_frak = 1.03;
+$fudge_tt = 1.0;
+$fudge_bb = 1.0;
+$fudge_sans = 1.03;
+
+sub do_special_fonts{
+ ($xht_num, $tmp) = split /\//, $x_height;
+ # Nothing special for calligraphic...
+ # Now for tt...
+ $ttplace = $psfonts; # traditional
+ $ttplace = "$texmf$sep$fonts${sep}type1${sep}public${sep}cm"
+ if $texmf; # TDS
+ $ttfont = "$ttplace${sep}cmtt10";
+ if ((-e "$ttfont.pfb") or (-e "$ttfont.pfa")) {
+ $tt = $true;
+ $tt_sf = $xht_num / $cm_xht_num;
+ $tt_sf *= $fudge_tt;
+ $tt_sf = sprintf "%4.2f", $tt_sf;
+ $ttsize = 10*$tt_sf;
+ $ttsize = sprintf "%4.1f", $ttsize;
+ $replace{"<ttsize>"} = $ttsize;
+ &record("Source file $ttfont found:\n ",
+ "scaling cmtt10 by a factor of $tt_sf.\n");
+ } else {
+ &record("No tt font source found; no tt font will be provided.\n");
+ }
+ # Now for fraktur...
+ $frakplace = $psfonts; # traditional
+ $frakplace = "$texmf$sep$fonts${sep}type1${sep}ams${sep}euler"
+ if $texmf; # TDS
+ $frakfont = "$frakplace${sep}eufm10";
+ if ((-e "$frakfont.pfb") or (-e "$frakfont.pfa")) {
+ $fr = $true;
+ $frak_sf = $xht_num / $frak_xht_num;
+ $frak_sf *= $fudge_frak;
+ $frak_sf = sprintf "%4.2f", $frak_sf;
+ $frsize = 10*$frak_sf;
+ $frsize = sprintf "%4.1f", $frsize;
+ $replace{"<frsize>"} = $frsize;
+ $replace{"<frsf>"} = $frak_sf;
+ &record("Source file $frakfont found:\n ",
+ "scaling eufm10 by a factor of $frak_sf.\n");
+ } else {
+ &record("No fraktur font found; and none will be provided.\n");
+ }
+ # Now for blackboard bold...
+ $bbplace = $mfinputs; # traditional
+ $bbplace = "$texmf$sep$fonts${sep}source${sep}public${sep}bbold"
+ if $texmf; # TDS
+ $bbsource = "$bbplace${sep}bbold10.mf";
+ if (-e $bbsource) {
+ $bb = $true;
+ $bb_sf = $tt_sf;
+ $bb_sf *= $fudge_bb;
+ $bb_sf = sprintf "%4.2f", $bb_sf;
+ &record("Source file $bbsource found:\n ",
+ "scaling bbold10 by a factor of $bb_sf.\n");
+ open (OUT, ">${tseries}bb10.mf");
+ &printbanner("OUT", "%", "${tseries}bb10.mf");
+ print OUT $newbbold;
+ close OUT;
+ print MF "$mf ${q}\\mode=$mode; scrollmode; input ${tseries}bb10$q\n";
+ print GFTOPK "gftopk ${tseries}bb10.$gfext ${tseries}bb10.$pkext\n";
+ } else {
+ &record("No bbold font found; and none will be provided.\n");
+ }
+ # Now for sans serif fonts...
+ if ($sans_font) {
+ $sa = $true;
+ ($sansfam, $sansencoding) = &get_font_fam($sans_font);
+ if ($sansfam eq "cmss") {
+ $sans_sf = $xht_num / $cmss_xht_num;
+ $sans_sf = sprintf "%4.2f", $sans_sf;
+ &record("CMSS sans serif scaled by $sans_sf will be used.\n");
+ } else { # compute sf for non-cm sans serif
+ $replace{"<ssr>"} = $sans_font;
+ $replace{"<ssri>"} = "${sansfam}ri$sansencoding";
+ $sansbold = "b";
+ $sansbold = "s" if -e "$sf_tfm$sep${sansfam}s$sansencoding.tfm";
+ $replace{"<ssb>"} = "$sansfam${sansbold}$sansencoding";
+ $replace{"<ssbi>"} = "$sansfam${sansbold}i$sansencoding";
+ ($sans_x_height, $tmp) = &afm_metric_info("x", "${sansfam}r8a");
+ ($sans_xht_num, $tmp) = split /\//, $sans_x_height;
+ $sans_sf = $xht_num / $sans_xht_num;
+ $sans_sf *= $fudge_sans;
+ $sans_sf = sprintf "%4.2f", $sans_sf;
+ $sasize = 10*$sans_sf;
+ $sasize = sprintf "%4.1f", $sasize;
+ $replace{"<sasize>"} = $sasize;
+ &record("Sans serif family $sansfam (contining font $sans_font) ",
+ "scaled by $sans_sf will be used.\n");
+ }
+ } else {
+ &record("No sans serif font found; and none will be provided.\n");
+ }
+}
+
+## Making Metafont source files...
+
+## When we make Metafont source files, the easiest case occurs
+## when there is a comparable cm file we can copy. For example,
+## in a times-like (tm) setting, we create tmmi7.mf by copying cmmi7.mf
+## and simply making suitable changes to the Metafont parameters.
+## In this case the Perl subroutine `makemffiles' calls upon the
+## routine `normalcopy' to perform this creation.
+
+sub normalcopy{
+ local($sf, $source) = @_;
+ open (IN, "$source") || die "Where is $source?";
+ while ($_=<IN>) {# read and digest template values
+ last if /font_size/; # discard 1st few lines
+ }
+ print OUT "SF_=$sf; % scale factor\n";
+ while ($_=<IN>) {# read rest of .mf file
+ if ( /^([a-zA-Z_#]+):=([0-9\.\/a-z#]+);/ ) {
+ $curparam=$1; $oldvalue=$2; # save these!
+ if (defined $param{$curparam}) {
+ $newvalue=$param{$curparam};
+ $newvalue="SF_*$newvalue" if /pt#/;
+ s/$oldvalue/$newvalue/;
+ }
+ }
+ if ($slantind==$noslant) {
+ if (/^slant:=([\.0-9]+);/) {# zero slant in roman files
+ s/$1/0/;
+ }
+ }
+ if (/generate/) { # have we reached the `generate' statement?
+ s/generate\s+/generate mk/;
+ }
+ print OUT $_;
+ }
+}
+
+## In case the source file (eg cmsy12.mf or cmmib7.mf) does NOT exist,
+## some handwaving is necessary. We'll read from the corresponding roman
+## file (eg cmr12 or cmbx7) which HAD better exist up through the
+## `generate' command, but then finish off with the corresponding
+## roman file. Thus, to create tmbsy7.mf, we will read cmbx7 up through
+## the `generate' command towards the end of that file, and then pick
+## up cmsy7.mf, using only the material following the `math_fitting'
+## parameter (this is the last parameter in the standard .mf files).
+## Final concern: the sy fonts need the parameter `rth#' defined as
+## either .4pt# or .6pt# (roman or bold), so we have to take
+## care to create this variable if need be.
+
+sub fudgecopy{
+ local($sf, $source) = @_;
+ ## redefine the source...
+ if ($doingbold == $true) {
+ $source="$mfinputs${sep}cmbx$size.mf";
+ } else {
+ $source="$mfinputs${sep}cmr$size.mf";
+ }
+ $nextsize=$size;
+ $nextsize=10 if $size>10; # unfortunate default
+ $nextmid=$midfix;
+ $nextmid =~ s/b//;
+ $nextsource="$mfinputs${sep}cm$nextmid$nextsize.mf";
+ open (IN, "$source") || die "Where is $source?";
+ while ($_=<IN>) {# read and digest template values
+ last if /font_size/; # discard 1st few lines
+ }
+ print OUT "SF_=$sf; % scale factor\n";
+ while ($_=<IN>) {# read rest of .mf file until `generate'
+ if ( /^([a-zA-Z_#]+):=([0-9\.\/a-z#]+);/ ) {
+ last if /^generate/;
+ $curparam=$1; $oldvalue=$2; # save these!
+ if (defined $param{$curparam}) {
+ $newvalue=$param{$curparam};
+ $newvalue="SF_*$newvalue" if /pt#/;
+ s/$oldvalue/$newvalue/;
+ }
+ }
+ if ($slantind==$noslant) {
+ if (/^slant:=([\.0-9]+);/) {# zero slant in roman files
+ s/$1/0/;
+ }
+ }
+ print OUT $_ unless /^generate/;
+ }
+ close IN;
+ open (IN, $nextsource) ||
+ die "Where is $nextsource?";
+ while (<IN>) {last if /^math_fitting/;} # discard front of file
+ $myrth=".4pt#";
+ if ($doingbold==$true) {$myrth=".6pt#";}
+ print OUT "\nrth#:=$myrth; % assume rules come from extension font\n";
+ while (<IN>) {
+ next if /^rth#/; # we generated this line already
+ s/rule_thickness#/rth#/g; # ensure references are to rth#
+ s/generate\s+/generate mk/;
+ print OUT $_;
+ }
+}
+
+## The actual mf files are created by the following routine.
+
+sub mf_file_header{
+ local($target, $midfix, $size) = @_;
+ print OUT "%% $tseries-like font, file $target $size point\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ print OUT "if unknown cmbase: input cmbase fi\n\n";
+ $fontid="$tseries$midfix";
+ $fontid =~ tr/a-z/A-Z/; # make everything uppercase
+ print OUT "font_identifier:=\"$fontid\"; font_size ${size}pt#;\n\n";
+}
+
+## &makemffiles(src prefix, target midfix, slant ind, list of sizes);
+sub makemffiles{# create and process Roman fonts
+ local($prefix,$midfix,$slantind)=($_[0],$_[1],$_[2]);
+ local(*sizes)=$_[3];
+ foreach $size (@sizes) {
+ $source="$mfinputs${sep}${prefix}${midfix}${size}.mf";
+ $targetfirst="${tseries}${midfix}${size}";
+ $target="$targetfirst.mf";
+ $tfmsource="$cm_tfm$sep${prefix}${midfix}${size}.tfm";
+ ## All gf and pk files will have been created, and we need pl files.
+ print PL "echo $targetfirst\n"; # system dependent
+ print PL "tftopl $targetfirst.tfm $targetfirst.pl\n";
+ print MF "$mf ${q}&cm \\mode=$mode; scrollmode; input $targetfirst$q\n";
+ print GFTOPK "gftopk $targetfirst.$gfext $targetfirst.$pkext\n";
+ open (OUT, ">$target") || die "Cannot open $target. Help!";
+ $sf=$size/10;
+ &mf_file_header($target, $midfix, $size);
+ if (-e $source) {
+ &normalcopy($sf, $source); # source exists--o joy, o rapture!
+ } else {
+ &fudgecopy($sf, $source); # no source---finagling follows
+ }
+ close IN; close OUT;
+ }
+}
+
+sub do_roman{
+ $doingbold=$false;
+ &makemffiles("cm","r",$noslant,*romans);
+}
+
+sub do_bold{
+ $doingbold=$true;
+ &makemffiles("cm","bx",$noslant,*bolds);
+}
+
+sub do_mathital{
+ $doingbold=$false;
+ &makemffiles("cm","mi",$slanted,*romans);
+}
+
+sub do_mathitalb{
+ $doingbold=$true;
+ &makemffiles("cm","mib",$slanted,*bolds);
+}
+
+sub do_mathsy{
+ $doingbold=$false;
+ &makemffiles("cm","sy",$slanted,*romans);
+}
+
+sub do_mathbsy{
+ $doingbold=$true;
+ &makemffiles("cm","bsy",$slanted,*bolds);
+}
+
+sub do_tenex{
+ $doingbold=$false;
+ &makemffiles("cm","ex",$noslant,*ex);
+}
+
+sub do_tenbex{
+ $doingbold=$true;
+ &makemffiles("cm","bex",$noslant,*ex);
+}
+
+sub get_encoding_sequence{
+ local($sequence) = "${enc}t";
+ if ($exp) { # expertised fonts?
+ $sequence = "9e"; # Cork (8t) + experts
+ $sequence = "9t" if $enc == 7; #
+ }
+ $replace{"<enct>"} = $sequence;
+ $sequence;
+}
+
+sub startpl{
+ local($e) = &get_encoding_sequence($enc);
+ print PL "tftopl $rm_tfm$sep${fontfam}r$e.tfm ${fontfam}r$e.pl\n";
+ print PL "tftopl $rm_tfm$sep${fontfam}ri$e.tfm ${fontfam}ri$e.pl\n";
+ if ($#template==1) {
+ print PL "tftopl $rm_tfm$sep$fontfam$bld$e.tfm $fontfam$bld$e.pl\n";
+ print PL
+ "tftopl $rm_tfm$sep$fontfam${bld}i$e.tfm $fontfam${bld}i$e.pl\n";
+ }
+}
+
+## This routine reads an fd file and discards comments, the `\endinput'
+## statement, and the `\ProvidesPackage' statement. It adds font scaling
+## info specified as an argument to the routine into all
+## `\DeclareFontShape' statements. One catch: scaling info may have
+## been placed in the fd file by fontinst, so we want to catch this and
+## replace it by our current scaling factor.
+
+sub get_fd_info_and_scale_it{
+ local($fdfile, $mysize, $inputs_) = @_;
+ local($pathandfdfile) = "$inputs_${sep}$fdfile.fd";
+ open(FD, $pathandfdfile) or die "Can't find $pathandfdfile. Help";
+ while (<FD>) { # skips comments and ProvidesPackage
+ last if /\\DeclareFontFamily/;
+ }
+ &out("\n%% Extracting font info from file $fdfile.fd...\n");
+ FDLINE: for (;;) {
+ if ( $_ =~ /\[\d*\.\d+\]/ ) { # scaling factor found!
+ $_ =~ s/\[\d*\.\d+\]/\[$mysize\]/g;
+ } else { # no scaling factor found
+ # we search for right angle, followed by 0 or more space,
+ # followed by fontname (which begins with alpha)
+ s/(>\s*)([^<\s])/\1 \[$mysize\] \2/g;
+ }
+ &out("$_") unless /^%/; # ignore comments
+ last FDLINE if eof(FD);
+ $_ = <FD>;
+ last FDLINE if /\\endinput/;
+ }
+ &out("%% End of extraction from file $fdfile.fd.\n\n");
+ close FD;
+}
+
+sub makestylefile{
+ $source="z$_[0].mk";
+ $pathsource="..$sep$source";
+ $target="z$tseries$fontfam.$_[0]";
+ close IN; close OUT; # just in case
+ open (IN, $pathsource)
+ || die "We are missing file $pathsource. HELP!";
+ open (OUT, ">$target")
+ || die "Cannot open file $target. Help!";
+ $FH_ = "OUT";
+ print OUT "%% This is file $target, containing ";
+ print OUT "TeX macros to typeset mock-MF fonts.\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ while ($_=<IN>) {
+ next if /^%%/; # strip out comment lines
+ while ( /(<[a-z]+>)/ ) { # parameters for replacement?
+ $a_ = $1; $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/g;
+ }
+ if ( /^\[([a-z]+)\]/ ) {# do we strip off special font indicators?
+ $ind = $1;
+ $_ =~ s/\[b\]// if defined $template[1];
+ $_ =~ s/\[$ind\]// if $$ind;
+ }
+ print OUT $_ unless /^\[/; # some special lines are not needed
+ }
+ if ($_[0] eq "tex") { # hook for the plain .tex file
+ }
+ if ($_[0] eq "sty") { # hook for the LaTeX (NFSS) .sty file
+ if ($template[1]) { # is there a bold series?
+ print OUT "\\DeclareMathAlphabet{\\mathbf}{$encoding}";
+ print OUT "{$fontfamx}{$nfss_bold}{n}\n";
+ }
+ if ($tt) { # for tt
+ $tt_inputs = $inputs;
+ $tt_inputs = "$texmf${sep}tex${sep}latex${sep}$tt_installer"
+ if $texmf;
+ &get_fd_info_and_scale_it("${encoding}cmtt", $tt_sf, $tt_inputs);
+ print OUT "\\DeclareMathAlphabet{\\mathtt}{$encoding}";
+ print OUT "{\\ttdefault}{m}{n}\n";
+ }
+ if ($sa) { # for sans serif
+ $sans_inputs = $inputs;
+ $sans_inputs = "$texmf${sep}tex${sep}latex${sep}$sans_installer"
+ if $texmf;
+ &get_fd_info_and_scale_it("${encoding}${sansfam}", $sans_sf,
+ $sans_inputs);
+ print OUT "\\newcommand{\\sansdefault}{$sansfam}\n";
+ print OUT "\\DeclareMathAlphabet{\\mathsf}{$encoding}";
+ print OUT "{\\sansdefault}{m}{n}\n";
+ }
+ }
+ print OUT "\\endinput\n";
+ close IN; close OUT;
+}
+
+sub create_hax_files{
+ $hackprefix = "$tseries$fontfam";
+ &safecopy("..${sep}rhax.mtx", "${hackprefix}rrx.mtx");
+ &safecopy("..${sep}ihax.mtx", "${hackprefix}rix.mtx");
+ &safecopy("..${sep}iskew.mtx", "${hackprefix}riw.mtx");
+ $replace{"<hax>"} = $hackprefix;
+ if (defined $template[1]) { # A bold? If so, we need bold versions...
+ &safecopy("..${sep}rhax.mtx", "${hackprefix}brx.mtx");
+ &safecopy("..${sep}ihax.mtx", "${hackprefix}bix.mtx");
+ &safecopy("..${sep}iskew.mtx", "${hackprefix}biw.mtx");
+ }
+}
+
+sub makemakevp{ # makes the file makevp.tex, the fontinst install file.
+ &create_hax_files; # files for fixing metric info
+ $source="makevp.mk";
+ $pathsource="..$sep$source";
+ $target="makevp.tex";
+ close IN; close OUT; # just in case
+ open (IN, $pathsource)
+ || die "We are missing file $pathsource. HELP!";
+ open (OUT, ">$target")
+ || die "Cannot open file $target. Help!";
+ print OUT "%&plain\n";
+ print OUT "%% This is file $target, containing ";
+ print OUT "fontinst install commands to create virtual fonts.\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ while ($_=<IN>) {
+ next if /^%%/; # strip off comment lines
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) {# do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ print OUT $_ unless /^\[b\]/; # bold lines are not needed
+ }
+ close IN; close OUT;
+ open (IN, "makevp.tex");
+ open (OUT, ">makevf.bat");
+ &banner("OUT", "makevf.bat");
+ while ($_ = <IN>) {
+ next unless $_ =~ /\\installfont\{/;
+ $_ =~ /\s+\\installfont\{([a-z0-9]+)\}\{/;
+ print OUT "vptovf $1.vpl $1.vf $1.tfm\n";
+ }
+ close IN; close OUT;
+}
+
+## This routine prints $_ to output filehandle TEX provided there
+## are no bracketed qualifiers at the line beginning. It tests
+## for 2-char qualifiers; "b" is handled separately.
+
+sub printTEXlines {m
+ if ($_ =~ /^\[([a-z]+)\]/) {
+ local($ind_)=$1;
+ $_=~s/^\[$ind_\]// if $$ind_;
+ }
+ print TEX $_ unless /^\[/;m
+}
+
+sub makeLaTeXtest{
+ open(TEX, ">testmath.tex");
+ &printbanner("TEX", "%", "testmath.tex");
+ local($infile) = "..${sep}testmath.mk";
+ open(TEMPLATE, $infile) or
+ die "Where is the template $infile?";
+ while ($_ = <TEMPLATE>) {
+ next if /^%/; # strip comments away
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) { # do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ &printTEXlines;
+ }
+ close TEX; close TEMPLATE;
+}
+
+sub makeplaintest{
+ open(TEX, ">testmatp.tex");
+ &printbanner("TEX", "%", "testmatp.tex");
+ local($infile) = "..${sep}testmatp.mk";
+ open(TEMPLATE, $infile) or
+ die "Where is the template $infile?";
+ while ($_ = <TEMPLATE>) {
+ next if /^%/; # strip comments away
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) { # do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ &printTEXlines;
+ }
+ close TEX; close TEMPLATE;
+}
+
+ $finish_up =<<"EndFinish";
+
+Now to finish up. Perform the following tasks:
+0. Execute 'mkdirs.bat' to create any missing directories.
+1. Execute the file 'makegf.bat'. (This may take some time...)
+2. Create the packed pixel .pk files. On some (Unix) systems, you do this
+ via commands like:
+localhost>>foreach X (*.300gf)
+localhost>>gftopk \$X \$X:r.300pk
+localhost>>end
+ but many systems do not permit this. Therefore, you will need to examine
+ the accompanying file 'makepk.bat' and EDIT it accordingly to conform
+ to your system standards and syntax. Thereafter, execute this file;
+ make sure you EDIT it first!
+3. Execute the file 'makepl.bat'.
+4. Execute the command 'tex makevp'. (This may take some time...)
+5. Execute the file 'makevf.bat'.
+6. Run the files 'testmath.tex' (LaTeX) or 'testmatp.tex' (plain TeX)
+ through TeX to test the files. [Consult the documentation 'mathkit.tex'
+ for advice on adjusting these new math fonts.]
+7. When you are satisfied with the results, execute 'putfonts.bat' to store
+ the fonts and files where they belong.
+(This advice appears in the Ascii file 'todo.nxt' and in the log file
+'z$tseries$fontfam.klg' which contains other information about this run.)
+EndFinish
+
+## Now let's record the remaining tasks...
+sub finish{
+ ## first, make bat files executable...
+ @batch_files =
+ ("putfonts.bat", "mkdirs.bat", "makegf.bat",
+ "makepk.bat", "makepl.bat", "makevf.bat");
+ chmod 0755, @batch_files;
+ ## Putting files where they belong...
+ print PUT "$mv *.mf $mfinputs\n";
+ print PUT "$mv *.vf $vf\n";
+ print PUT "$mv *.tfm $tfm\n";
+ ## $pkext = "pk"; # DOS default
+ ## if ($sep ne "\\") {
+ ## print "I need the extension for the pixel files you created.\n";
+ ## print "This extension is something like '300pk' or '600pk'.\n";
+ ## print "Please enter it now: ";
+ ## $pkext = <STDIN>; chomp $pkext;
+ ## }
+ ## $pkext =~ s/^\.//; # just in case user added a `dot'
+ &record("I am using the extension `.$pkext' for pixel files.\n");
+ print PUT "$mv *.$pkext $pk\n";
+ print PUT "$mv *.fd $inputs\n";
+ print PUT "$mv z$tseries$fontfam.sty $inputs\n";
+ print PUT "$mv z$tseries$fontfam.tex $plain_inputs\n";
+ ## User instructions...
+ &record($finish_up);
+ open (TODO, ">todo.nxt");
+ &banner("TODO", "todo.nxt");
+ print TODO $finish_up;
+ close TODO;
+}
+
+## For each point size <n> we create roman, mi, sy
+
+@romans=(12,10,9,7,5); # point sizes for Roman fonts
+@bolds=(12,10,7,5); # point sizes for bold fonts
+@ex=(10); # point sizes for extension fonts
+
+## The following replacements will be used to personalize the templates.
+
+$replace{"<currdate>"} = $currdate;
+$replace{"<fam>"} = $fontfam;
+$replace{"<famx>"} = $fontfam; # expert family?
+$replace{"<famx>"} = "${fontfam}x"
+ if -e "$rm_inputs$sep$encoding${fontfam}x.fd";
+$fontfamx = $replace{"<famx>"};
+$replace{"<mock>"} = $tseries;
+$replace{"<m>"} = $tser;
+$replace{"<enc>"} = $enc;
+$replace{"<enx>"} = $replace{"<enc>"};
+$replace{"<enx>"} = "9"
+ if -e "$rm_inputs$sep$encoding${fontfam}x.fd";
+$replace{"<encoding>"} = $encoding;
+$replace{"<b>"} = $bld;
+$replace{"<nfssb>"} = $nfssbld;
+$replace{"<bseries>"} = "b"; ## change to "bx" if appropriate
+## but...
+$replace{"<bseries>"} = "sb" if $bld eq "s";
+$nfss_bold = $replace{"<bseries>"};
+
+## Some defaults for the special fonts...
+
+$replace{"<ssr>"} = "cmss10"; # sans serif stuff
+$replace{"<ssb>"} = "cmssbx10";
+$replace{"<ssri>"} = "cmssi10";
+$replace{"<ssbi>"} = "cmssbx10";
+$replace{"<sasize>"} = "10";
+$replace{"<ttsize>"} = "10"; # tt
+$replace{"<cal>"} = "${tseries}sy10"; # calligraphic
+$replace{"<calb>"} = "${tseries}bsy10"; # calligraphic
+$replace{"<casize>"} = "10";
+$replace{"<frsize>"} = "10"; # fraktur
+$replace{"<frsf>"} = "1";
+
+sub do_it_all{
+ open (PL, ">makepl.bat"); # script to create pl files fontinst needs
+ &banner("PL", "makepl.bat");
+ open (LTX, ">z${tseries}${fontfam}.sty"); # contains NFSS (LaTeX) macros
+ open (PLN, ">z${tseries}${fontfam}.tex"); # contains plain TeX macros
+ open (PUT, ">putfonts.bat"); # places completed fonts where they belong
+ &banner("PUT", "putfonts.bat");
+ open (MF, ">makegf.bat"); # script to execute Metafont
+ &banner("MF", "makegf.bat");
+ open (GFTOPK, ">makepk.bat"); # script to pack all pixels
+ &banner("GFTOPK", "makepk.bat");
+ &get_fontfam_parameters("r");
+ &get_template_info($template[0]);
+ &adjust_font_parameters if $I_should_try_to_match;
+ &startpl;
+ ## Do all roman fonts...
+ &do_roman;
+ &do_mathital;
+ &do_mathsy;
+ &do_tenex;
+ &do_special_fonts; # tt, frak, b'board bold, cal, sans serif
+ if (defined $template[1]) { # do bold fonts...
+ &get_template_info($template[1]);
+ &do_bold;
+ &do_mathitalb;
+ &do_mathbsy;
+ &do_tenbex;
+ }
+ &makestylefile("tex"); # make plain TeX macro file
+ &makestylefile("sty"); # make LaTeX NFSS package file
+ &makemakevp; # make the fontinst install file
+ close PL; close LTX; close PLN; close MF; close GFTOPK;
+ &makeLaTeXtest;
+ &makeplaintest;
+ &finish;
+}
+
+## Let 'er rip...
+
+&do_it_all;
+
diff --git a/fonts/utilities/mathkit/dos/mathkit.par b/fonts/utilities/mathkit/dos/mathkit.par
new file mode 100644
index 0000000000..388212a490
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mathkit.par
@@ -0,0 +1,97 @@
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "0.7",
+### date = "January 1998",
+### filename = "mathkit.par",
+### address = "Department of Mathematics
+### John Jay College
+### 445 West 59th Street
+### New York, NY 10019
+### USA",
+### telephone = "(516) 385-0736",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### supported = "yes",
+### abstract = "This is a parameter file. It sets parameters
+### needed by the MathKit utility."
+### package = "MathKit",
+### dependencies = "perl,"
+### }
+### ====================================================================
+
+####################################################################
+##
+## EVERYBODY WHO USES THIS SCRIPT MUST SET THE FOLLOWING PARAMETERS!!
+##
+####################################################################
+
+## Some parameters must be set:
+## 0. Is this part of a TDS (TeX Directory System)? If so, some
+## additional parameters need setting, and $mfinputs and $tfm
+## can be determined by MathKit.
+## 1. $mfinputs
+## 2. $tfm, $afm, and other font places
+## 3. $mode plus additional Metafont information
+## 4. &UNIX or &DOS;
+## 5. Shall we approximate the text font?
+## 6. Sans serif font?
+
+## Step 0... (UNCOMMENT ALL OF THESE STATEMENTS, and make sure they
+## are accurate, in case your system is TDS compliant.)
+## $texmf = "\\texmf"; # or whatever...
+ $supplier = "adobe"; # the TDS supplier for the scalable fonts
+ $typeface = "janson"; # TDS typeface for the scalable fonts
+ $installer = "vfinst"; # who installed your roman fonts?
+ $tt_installer = "base"; # who installed your tt fonts?
+ $sans_installer = "vfinst"; # who installed your sans serif fonts?
+
+
+## Step 1...
+
+$mfinputs = "\\mf\\inputs"; # where do we find Metafont files?
+## (NO trailing path separator!!)
+
+## Step 2 (only for NON-TDS systems) ...
+
+$tfm = "\\tex\\fonts\\tfm"; # where do tfm's for fonts live?
+$afm = "\\psfonts\\afm"; # where are the afm's for the ROMAN fonts?
+$pk = "\\tex\\fonts\\pk"; # where do pk pixel files belong?
+$vf = "\\tex\\fonts\\vf"; # where do I put the vf's I make?
+$psfonts = "\\psfonts"; # where are pfb's and pfa's stored?
+$inputs = "\\tex\\inputs"; # where are the fd files?
+$mfinputs = "\\mf\\inputs"; # where are mf source files kept?
+
+## Step 3...
+
+$mf = "mf"; # what's the name of the Metafont executable?
+$mode = "imagen"; # what's the Metafont mode?
+$dpi = "300"; # what's your printer's resolution?
+
+## Step 4...What's our operating system?
+
+&UNIX; # this statement invokes Unix conventions
+## &DOS; # uncomment this if using DOS!!
+
+## Step 5...Shall we approximate certain parameters by using
+## parameters belonging to the text fonts rather than those
+## belonging to the template files? (Comment this out if
+## otherwise.) That is, should we try to match the cm fonts
+## to the font family? If so, set this value to any non-null,
+## non-zero value.
+
+## $I_should_try_to_match = 1;
+
+## Step 6. Specify the sans serif font..
+## (If these are COMMENTED out, I will use Computer Modern
+## Sans Serif as default.)
+
+## $sans_font = "lssr7t";
+## $sans_supplier = "bh"; # We need this in case of TDS systems
+## $sans_typeface = "lucida"; # We need this in case of TDS systems
+
+####################################################################
+##
+## END OF PARAMETER SECTION
+##
+####################################################################
diff --git a/fonts/utilities/mathkit/dos/mathkit.tex b/fonts/utilities/mathkit/dos/mathkit.tex
new file mode 100644
index 0000000000..936f643466
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mathkit.tex
@@ -0,0 +1,605 @@
+%&latex
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mathkit.tex, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% THIS IS A STANDARD LATEX + NFSS DOCUMENT FILE.
+
+\documentclass{article}
+
+\newcommand{\MathKit}{\textit{MathKit}}\let\mk=\MathKit
+\font\logofont=logo10
+\newcommand{\mf}{{\logofont META}\-{\logofont FONT}}
+\def\fil|#1|{\texttt{#1}}
+\def\ext|#1|{\texttt{.#1}}
+\def\angles#1{$\langle${\normalfont\textit{#1}}$\rangle$}
+
+\title{Hundreds of New Math Fonts with MathKit (version 0.7)}
+\author{Alan Hoenig}
+\date{May 5, 1997}
+
+\begin{document}
+
+\maketitle
+
+\mk{} is an attempt to deal with typesetting mathematics
+using fonts {\em other\/} than Computer Modern. Till now, authors
+have had few alternatives:
+\begin{itemize}
+ \item They can use CM math together with a text font family like Times
+ Roman, but the result is not professional.
+ \item They can use proprietary math fonts, such as MathTime or Lucida
+ New Math, but that requires spending money.
+ \item They can use the Euler math fonts, but these letterforms are a
+ bit too idiosyncratic for some, and it is not well-known how to
+ properly implement them anyhow.
+\end{itemize}
+
+\mk{} aids in the creation of math fonts which are compatible with a
+text font family---that is, \mk{} can help you typeset a Baskerville
+math document where the equations really look Baskerville-ish.
+Depending on your choice of parameters, you also get {\bf bold} math
+fonts. \mk{} consists of a Perl script and some auxiliary files to
+help an author---even one ignorant of virtual fonts or of \mf---to
+perform these tasks. (In case you have MathTime, Lucida New Math,
+Euler, or Mathematica math fonts, you might wish to check out the
+author's {\it MathInst\/} tools for installing these fonts. This
+material is available from the {\tt fonts/utilities/mathinst} section
+of {\sc ctan}.)
+
+The current version fixes some bugs from the previous version. I am
+grateful to several excellent and vigilant bug-catchers, including
+David Ness, Dave Rebnord, Petr Sojka, Jose Iovino, and Richard
+Townsend.
+
+\section{What it does}
+\mk{} takes \mf{} parameters that are appropriate to an outline font
+family and uses these to create new math fonts with \mf. The symbols
+and other special characters in these new fonts look pretty good---and
+are compatible with your outline fonts---but the italics and numerals
+look ghastly. Fortunately, that's not a problem. Using virtual
+fonts, we manufacture math fonts that combine the new special symbols
+(done by \mf{} that look pretty good) with letters and numerals from
+the outline fonts while we throw away all the ghastly stuff. \mk{}
+does this work for you; it provides scripts for the remaining steps
+(all this is described below). It also provides style files for plain
+\TeX{} and for the NFSS of \LaTeX{} for you to use these fonts in your
+documents. {\em You don't need to know anything about \mf{} or
+virtual fonts to use \mk{} and the resulting fonts.}
+
+This version of \mk{} comes with three sets of font templates. Since
+Palatino and Times Roman are so common, I prepared templates for these
+fonts. For fun, I prepared a template for Monotype Baskerville.
+Times comes in regular and bold series, and Baskerville in regular and
+semibold; Palatino is regular only.
+
+However, I have had excellent luck matching one of the templates with
+a non-related text family. The Baskerville-like template matches
+Monotype Janson and Adobe Caslon very nicely, for example.
+Consequently, it's possible to generate not three new math font
+families, but {\it hundreds\/} of them, as the title to this document
+proclaims.
+
+\section{What you get as final output}
+\mk{} itself produces lots and lots of scripts and batch files. Once
+these are properly executed (see below for the exact procedure) you
+get the following:
+\begin{enumerate}
+ \item Virtual fonts for math and text typesetting. You will also
+ get fonts for
+ bold math if you have supplied a template containing bold parameters.
+ \item Style files for plain \TeX{} and \LaTeX{} (NFSS).
+ These files support bold math if bold parameter
+ templates were present.
+\end{enumerate}
+
+\section{What you'll need}
+\subsection{\TeX{} and MetaFont}
+You'll need current versions of \TeX{} and \mf, first off. They must
+be sufficiently recent to support virtual fonts.
+
+\subsection{\texttt{fontinst}}
+You'll need a version~1.5 of \texttt{fontinst}, available from any
+{\sc ctan} archive or mirror. To install this software, retrieve {\it all\/}
+files from the
+\begin{verbatim}
+fonts/utilities/fontinst/inputs
+\end{verbatim}
+area. If you
+have a traditional \TeX\ system, place these files with the other
+files that \TeX\ reads in a directory like `{\tt tex/inputs}'. In a
+{\sc tds} system, place them in
+\begin{verbatim}
+texmf/tex/generic/fontinst
+\end{verbatim}
+
+\subsection{pdcfsel}
+If you use plain \TeX, you'll need Damian Cudgley's \texttt{pdcfsel}
+font selection macros. These can be found in the
+\texttt{macros/plain/contrib/pdcmac} section of
+\textsc{ctan}. From this directory, fetch the files \fil|pdccode.tex|
+and \fil|pdcfsel.dtx| and place both files in a \TeX{} work directory.
+Then, issue a command like
+\begin{verbatim}
+tex pdcfsel.dtx
+\end{verbatim}
+In a moment, you'll get two new files---\fil|pdcfsel.dvi|, from which
+you can typeset documentation for this package, and \fil|pdcfsel.tex|,
+which you should
+place in a directory that
+\TeX{} can read from, a place like `{\tt tex/inputs}' in a
+traditional \TeX\ system, or a place like
+\begin{verbatim}
+texmf/tex/plain/pdcfsel
+\end{verbatim}
+in a {\sc tds} system.
+
+\subsection{Perl5}
+You'll need version~5 of Perl, a freely-available utility for all
+computer platforms and easily obtained from many computer archives and
+{\sc cd-rom} software collections. Perl needs installation as well.
+This is simply a matter of placing the Perl executable somewhere on
+your computer's search path.
+
+\subsection{\texttt{fontname}}
+Your text fonts need to have been installed using Karl Berry's
+fontnaming conventions. Furthermore,
+these fonts must have been installed following the original \TeX\
+encoding, often denoted {\tt OT1} or {\tt ot1}. Some ways to perform
+this installation are {\tt psnfss} or {\tt VFinst} (see the
+\begin{verbatim}
+fonts/utilities/vfinst/
+\end{verbatim}
+area of {\sc ctan}).
+
+\subsection{Other utilities}
+You'll need to insure you have working copies of the \TeX ware
+utilities \texttt{tftopl} and \texttt{vptovf} which should already be part of
+your \TeX{} installation. Make sure both these executables are
+in some part
+of your computer's search path.
+
+\section{Installation}
+Installation of \mk\ consists of three steps.
+\begin{enumerate}
+ \item Prepare a directory, called something like \texttt{mathkit}
+ perhaps, to hold all the \mk{} files. Place all the \mk{} files here.
+ \item Prepare a work directory below this. Switch to this directory
+ to do all your work. (The \mk{} package consists of this file
+ \fil|mathkit.tex|, a file \fil|readme|, the main Perl script
+ \fil|mathkit|, some files \fil|greekoff.mtx| and
+ \fil|alphoff.mtx| used by \texttt{fontinst}, some template files
+ \fil|ztex.mk|, \fil|zsty.mk|, \fil|makevp.mk|,
+ \fil|tm.mkr|, \fil|tm.mkb|, \fil|pl.mk|,
+ \fil|bv.mkr|, and \fil|bv.mks|, plus some miscellaneous other stuff.)
+
+(These instructions assume that your implementation of \TeX{} knows to
+search the parent directory to the current directory to look for files
+it may need to read. If this is not the case---and you'll know when
+you execute the `{\tt tex}' step, as \TeX\ won't be able to find files
+in the {\tt mathkit} directory---you'll need either to adjust \TeX's
+search path or to place copies of all the \mk{} files in the work
+directory.)
+
+\item Finally, there are a few parameters that need {\em careful\/}
+adjustment at the beginning of the file \fil|mathkit.par|. \mk{}
+needs to know some system things---where are the \ext|tfm|'s kept for
+this text font family, where are \mf{} input files kept, what is the
+\mf{} mode you require (that is, what printer will you be preparing
+fonts for?), and are you running under Unix or DOS? This file is
+self-documenting, so consult it for details. Briefly, it needs seven
+categories of information:
+\begin{enumerate}
+ \item Is this a {\sc tds} installation? If so, what are the
+ suppliers, typefaces, and installers for your fonts?
+ \item Where are the \mf{} source files found?
+ \item For {\it non}-{\sc tds} systems only, where are \TeX's special
+ file types ({\tt.tfm}, {\tt.vf}, etc.) found?
+ \item What's the name of of the \mf{} executable?
+ What is the \mf{} mode? How are \mf{} output files named?
+ Where do these files belong? This requires additional
+ discussion---see below.
+ \item Is this Unix or {\sc dos}? If you are using yet a different
+ operating system, you'll need to create a subroutine named for this
+ other system and modelled after the routines you'll find at about
+ line~46 in the file \fil|mathkit|.
+ \item Should \mk{} try to match \mf{} parameters to your text fonts?
+ The answer should almost assuredly be `no'.
+ See below for additional discussion.
+ \item What is the sans serif font you'll be using with your fonts? We
+ will also need the directory names for its supplier and typeface, in
+ case your system is a {\sc tds} system.
+\end{enumerate}
+\end{enumerate}
+
+\subsection{Mode and other Metafont information}
+Most of the time, the \mf{} executable is called `{\tt mf}'; in such
+cases, set the variable \texttt{\$mf} in the file {\tt mathkit.par}
+to the value \texttt{"mf"}. On some systems, it may have other names,
+such as \texttt{virmf}. Adjust the value of \texttt{\$mf}
+accordingly.
+
+The \mf{} mode refers to a group of parameters especially adjusted to
+match your computer's printer. Modes are named with strings that
+suggest their corresponding printer---for example, {\tt imagen}, {\tt
+hplaser}, and so on. If you don't know which \mf{} mode corresponds
+to your printer, you'll have to inspect (with an editor) the file
+\fil|local.mf| or some file like that that appears in your \mf{}
+inputs directory. Probably the most important of the mode parameters
+is one called \verb+pixels_per_inch+ which ensures that \mf's bitmaps
+match your printer's resolution. At the very least, you'll need to
+choose a mode whose value of \verb+pixels_per_inch+ matches your
+printer's resolution. The name of the mode is the string following the
+command \verb+mode_def+ which appears a few lines above.
+
+In case, no mode is useful, you'll have to create your own mode.
+Duplicate one of the modes in \fil|local.mf|, and just change the name
+of the mode and the value of \verb+pixels_per_inch+. Then, you'll
+have to re-install \mf{} using {\tt inimf}.
+
+You'll also need to supply your printer's resolution. In \mk, this is
+called {\tt\$dpi} in the file \fil|mathkit.par|. It corresponds to
+the \mf{} variable \verb+pixels_per_inch+.
+
+\subsection{Matching (additional information)}
+All but super-power-users should keep the parameter
+\begin{verbatim}
+$I_should_try_to_match
+\end{verbatim}
+commented out at
+all times. Otherwise, it is easy to generate successively different
+copies of \mf{} source files, all with the same name. Consequently,
+the most recent creation obliterates its predecessors and will make it
+well-nigh impossible to regenerate early versions of your new pixel
+fonts.
+
+For those with intestinal fortitude of the first rank, here's an
+explanation. Although only three font templates currently accompany
+\mk, it is possible to use a template with another text font family.
+I have had good results, for example, using the {\tt bv}
+Baskerville-like template with both Monotype Janson and Adobe Caslon
+fonts. Of course, the $x$-height, cap-height, and so on of the Janson
+or Caslon fonts won't math the corresponding parameters for the
+Baskerville fonts. However, if the parameter
+\begin{verbatim}
+$I_should_try_to_match
+\end{verbatim}
+is set to a non-zero, non-null value, then \mk{} will use all the
+template parameters together with the $x$-height, etc.\ of the text
+fonts. This may ensure even closer compatibility between the math and
+text fonts. In case it doesn't, you can always re-generate the math fonts
+with this parameter turned off. Although it probably sounds like a
+good idea to keep this parameter switched on, it leads to a
+proliferation of \mf\ files that are slightly different but have the same
+filenames (see above; any readers with suggestions for dealing with
+impasse should please get in touch with me).
+
+\subsection{Special fonts}
+\mk{} also makes it possible to typeset with some special font types,
+including blackboard bold, calligraphic, fraktur, typewriter
+mono-spaced, and sans serif, and will provide typesetting commands for
+these fonts provided they exist. Except for sans serif, though, you
+have relatively little choice in which kinds of fonts to install.
+Here's what \mk{} expects:
+
+\begin{itemize}
+ \item \mk{} uses the calligraphic alphabet in the Computer Modern
+ symbol fonts.
+ \item The typewriter font must be installed under the name {\tt
+ cmtt10}, and you will need an outline form of this font.
+ \item You'll need the {\tt eufm10} Euler Fraktur font in outline form
+ for Fraktur typesetting.
+ \item You'll need the \mf{} source for Alan Jeffrey's blackboard bold
+ fonts for blackboard bold typesetting.
+ \item You have much greater freedom for sans serif fonts, as discussed
+ above.
+\end{itemize}
+These fonts and font sources are all available on \textsc{ctan}.
+
+In non-\textsc{tds}, installation means placing the {\tt.afm} files in
+a directory like {\tt/psfonts/afm} and the outline files in a place
+like {\tt /psfonts}. \mf{} sources belong somewhere named like {\tt
+/mf/inputs}. In a \textsc{tds} system, locations are more carefully
+defined. Computer Modern--math symbols and typewriter---belongs
+in a place like
+$$\hbox{\tt\angles{texmf}/fonts/\angles{type1-or-afm}/public/cm}$$
+The Euler Fraktur fonts belong in
+$$\hbox{\tt\angles{texmf}/fonts/\angles{type1-or-afm}/ams/euler}$$
+Finally, the blackboard bold source fonts belong in
+$$\hbox{\tt\angles{texmf}/fonts/source/public/bbold}$$
+
+\section{Executing the software}
+The main \mk{} script requires three parameters at the command line.
+These are:
+\begin{enumerate}
+ \item The name of the parameter template. `{\tt tm}' refers to Times-like
+ parameters, `{\tt pl}' to Palatino-like, and `{\tt bv}' to Baskerville-like.
+ \item The name under which text fonts are installed. This is apt to
+ be something like \texttt{ptm} or \texttt{mnt} for Adobe Times or
+ Monotype Times New Roman, \texttt{ppl} for Palatino, and \texttt{mbv}
+ for Monotype Baskerville (which is {\em quite\/} different from
+ ITC New Baskerville). As mentioned above, though, you are welcome
+ to any properly installed text font family as well. Simply specify
+ its {\tt fontname} abbreviation at the command line.
+ \item The encoding your fonts follow. Only \texttt{OT1} (original
+ \TeX{} encoding) or maybe \texttt{ot1} are currently allowed. Use
+ {\tt ot1} if your system doesn't allow uppercase file names.
+\end{enumerate}
+For example, I type
+$$\hbox{\tt perl ../mathkit tm ptm OT1}$$
+in my work directory
+to create Times-like fonts following the original \TeX{} encoding.
+(If your system supports the \verb1#!1 syntax for specifying the name
+of an interpreter, then adjust the proper path at the very top of
+the \fil|mathkit| script, make sure the execute bit is set, and type the
+simpler injunction \texttt{../mathkit tm ptm OT1} from the work
+directory.) To create my Janson/Baskerville fonts, I typed
+\begin{verbatim}
+../mathkit bv mjn OT1
+\end{verbatim}
+at the command line.
+
+Currently, you get bold math fonts {\em except} if you choose the
+Palatino-like {\tt pl} template.
+
+\section{Making the fonts}
+The following steps complete the font creation. Perform them all
+within the \mk{} work directory.
+\begin{enumerate}
+\item Execute the file \fil|makegf.bat| to have \mf{}
+create the pixel fonts for
+your fonts. This step will take some time.
+\item You'll need to pack all the pixel files. Inside Unix, you can
+do this via a series of commands like
+\begin{verbatim}
+foreach X (*.600gf)
+foreach? gftopk $X $X:r.600pk
+foreach? end
+\end{verbatim}
+Not all operating systems are so accommodating, so there is a file
+called \fil|makepk.bat| which may be helpful in this regard. {\bf Caution:}
+before executing this script, it will almost surely be necessary to edit it.
+\item Execute the script \fil|makepl.bat| to create some property list
+files needed by \TeX.
+\item Run the file \fil|makevp.tex| through \TeX. That is, execute
+the command \texttt{tex makevp} or something appropriate for your
+system. This step will take lots of time. Along with lots of
+superfluous files, this creates many `virtual property list' files
+with extension \ext|vpl|.
+\item Create the actual virtual files by running every \ext|vpl| file
+through the program \texttt{vptovf}. You can do this easily in Unix
+with commands like
+\begin{verbatim}
+foreach X (*.vpl)
+foreach? vptovf $X $X:r.vf $X:r.tfm
+foreach? end
+\end{verbatim}
+Even easier---execute the file \fil|makevf.bat| that \mk{} creates for
+you.
+\item Test your fonts by running the files \fil|testmath.tex|
+(for \LaTeX\ users) or \fil|testmatp.tex| (plain \TeX) through \TeX\
+and then printing it.
+If adjustments are necessary,
+return to the `{\tt tex makevp}' step (step~4), and proceed from that point
+onward. Adjustments to your fonts will be discussed below.
+\item Only when you are completely satisfied with your new fonts
+should you execute the script {\tt putfonts.bat} to place font files
+and style files to their proper places.
+\end{enumerate}
+
+That leaves behind still files with extensions \ext|log|, \ext|mtx|,
+\ext|pl|, \ext|vpl|, \ext|bat|, \ext|300gf| (or something similar) and
+several other miscellaneous other files. You may safely
+delete all these.
+
+\subsection{Fine tuning and character adjustment}
+The only adjustment that should be necessary are spacing adjustments
+to improve the appearance of over-the-character accents, subscripts, and
+character placement. The two test files that enable you test this are
+\fil|testmath.tex| (for \LaTeX) and \fil|testmatp.tex| (plain).
+Run one of these files through \TeX, and examine the printed output
+carefully.
+
+\mk{} will have made two or more adjustment files for you
+that facilitate making changes to
+character spacing. These files are named following this mysterious
+convention:
+$$\hbox{\tt\angles{mock}\angles{text-fonts}\angles{weight}%
+ \angles{r-or-i}\angles{w-or-x}.mtx}$$
+Here, \angles{mock} should be replaced by the template type (currently
+{\tt bv},
+{\tt tm}, or {\tt pl}); \angles{text-fonts} should be replaced by the
+three-character text font family designation; \angles{weight} will be
+{\tt r} or {\tt b} (regular or bold weight); \angles{r-or-i}
+will be {\tt r} or {\tt i} as the changes are to be applied to math
+roman or math italic fonts; and \angles{w-or-x} makes changes to
+(skew) over-character accents or to glyph widths and subscript
+placement. (In an earlier incarnation of this package, the metric
+adjustment files contained these and other ha\texttt{x} (hacks);
+hence the `x'. The `w' should suggest the ske\texttt{w} adjustments
+for accents. It's necessary to put this material in two distinct
+files so that the virtual font making mechanism reads the
+adjustment information at different points in its cycle.)
+For example, for my Janson-compatible ({\tt mjn})
+math fonts using the
+{\tt bv} template, I use file
+\begin{verbatim}
+bvmjnriw.mtx
+\end{verbatim}
+to adjust the positioning of the skew-type overhead accents like the
+vector arrow and tilde for the math italic font, while I use
+\begin{verbatim}
+bvmjnbrx.mtx
+\end{verbatim}
+to make changes to glyph widths and to subscript placement for math
+roman fonts used in the math bold series.
+
+Even if you re-install math fonts, \mk{} takes care not to overwrite
+pre-existing adjustment files.
+
+Changes are mostly a trial-and-error affair. The first time you
+create a set of math fonts, \mk{} creates a set of adjustment files in
+which all the change commands are commented out. To make changes,
+enter the appropriate file and read what each file has to say about
+the \verb+\shiftglyph+ or \verb+\skewkern+ commands which are found
+there.
+
+Once you've made all your changes, re-run the steps from `{\tt tex
+makevp}' (step~4) to the point where you print a copy of the test file
+(step~6), and
+then make additional changes as needed.
+
+Of course, it's always possible to settle for fine-tuning your
+manuscripts, but it's better to spend the time tuning the fonts
+instead. It's nevertheless a good idea to get familiar with \TeX's
+\verb+\skew+ command (see page~136 of {\it The \TeX book}) which is
+helpful in this regard, as are the many math space commands.
+
+Font mongers note: you may be able to fine tune the characters
+themselves by adjusting
+the parameter values in the {\it template\/} files to other than what I've
+provided. Feel free! If you find a particularly fine bunch of values
+different from what I've provided, I'd be grateful if you passed them
+along to me.
+
+\subsection{Names of the new fonts}
+\mf{} will make many new fonts with names like the usual Computer
+Modern fonts, except the first two letters will be replaced by the
+abbreviation you specified in the \mk{} command. Thus, when making
+Times-like fonts, you'll be making new fonts {\tt tmr10}, {\tt
+tmbx10}, and so on for other varieties and sizes. There will be some
+bold variants of these if you've provided a bold parameter template.
+Palatino-like variants would be named {\tt plr10}, and so on, while
+Baskerville-like variants are {\tt bvr10}, etc. Some of these new
+bitmaps will be raw fonts for new virtual fonts that \mk{} creates.
+
+There will be lots of new virtual fonts for Math roman and italic (and
+perhaps in bold variants). These fonts have names beginning with the
+font family indicator (such as {\tt ptm} or {\tt mbv}), a weight
+indicator ({\tt r} or {\tt b} for regular or
+bold), a single letter referring to the bitmaps that have been
+incorporated (this will be the first of the two letter abbreviation
+for the bitmap family; that is, {\tt b}, {\tt t}, or {\tt p} for
+Baskerville, Times, or Palatino), an encoding digit (7 for {\tt OT1} or {\tt
+ot1} encoding), a further encoding symbol (either {\tt t} or {\tt m}
+for text or math italic), and a character for the font size (no digit
+for ten-point, a single digit for smaller design sizes, and a `c',
+hexadecimal digit representing `12', for the 12-point size). Thus, my
+Janson/Baskerville math italic fonts have names {\tt mjnrb7mc}, {\tt
+mjnrb7m}, {\tt mjnrb7m9}, {\tt mjnrb7m7}, and {\tt mjnrb7m5} for the
+fonts at 12\thinspace pt, 10\thinspace pt, 9\thinspace pt, 7\thinspace
+pt, and 5\thinspace pt.
+
+All font
+names are eight characters long or less.
+
+\section{Using your new fonts}
+\mk{} produces two style files, one for \LaTeX{} and one for plain.
+Their file names are formed according the naming scheme
+ $$\hbox{\tt z\angles{mock-family}\angles{font-family}}$$
+Here, \angles{mock-family} is the two-character designation for
+one of the font parameter templates (such as \texttt{tm}, \texttt{pl},
+or \texttt{bv}); the word `mock' refers to the fact that these fonts
+imitate but don't equal the actual fonts in this family.
+\angles{font-family} is the Berry family
+desgnation. Thus, if I create a Times-like set of fonts for use with
+font family \texttt{ptm}, I would find files \fil|ztmptm.sty| (\LaTeX)
+and \fil|ztmptm.tex| (plain). In the same way, the style files for
+mock-Palatino and mock-Baskerville fonts are named \texttt{zplppl} and
+\texttt{zbvmbv} (with the appropriate extensions). Style files for my
+Baskerville/Janson math fonts have names beginning with {\tt zbvmjn}.
+
+\subsection{Plain \TeX{}}
+At the top of your file, include the statement
+\begin{verbatim}
+\input ztmmnt
+\end{verbatim}
+(or whatever the style file name is). Then, standard font nicknames
+like {\tt\string\it} and {\tt\string\bf} and math toggles {\tt\$} and
+{\tt\$\$} will refer to these new fonts.
+
+If bold fonts have been generated, a command \verb!\boldface! typesets
+everything in its way in boldface---prose, mathematics, whatever.
+Bold math may be appropriate for bold captions, sections heads, and
+the like. Like any other font changing command, this command should
+be placed within grouping symbols.
+
+\subsection{\protect\LaTeX{} and NFSS}
+You simply need to include the style name as part of the list of
+packages that you use in the document. Thus, a typical document would
+have a statement like
+\begin{verbatim}
+\usepackage{ztmptm,epsf,pstricks,...}
+\end{verbatim}
+at the outset.
+
+If \mk{} has created bold math fonts for you, a \texttt{boldface}
+environment will typeset everything in that environment as bold,
+including all mathematics.
+
+Occasionally, you will need to find tune a file or two by hand. If
+your outline fonts have been installed using expert fonts, you may
+need to alter the \verb+\rmdefault+ command. It might be necessary,
+say to type
+\begin{verbatim}
+\rmdefault{ptmx}
+\end{verbatim}
+instead of \verb!\rmdefault{ptm}!.
+
+In files named like \texttt{OT1\angles{whatever}.fd} it may be
+necessary to replace the \texttt{bx} series designation by \texttt{b}.
+Or it may be necessary to add entries at the bottom instructing NFSS
+to substitute fonts in the \texttt{bx} series with fonts in a {\tt b}
+or {\tt sb} (bold or semibold) series.
+
+\section{Math support for other font families}
+The parameters for the font families are contained in files with names
+like \fil|tm.mkr|, \fil|tm.mks|, or
+\fil|tm.mkb|. The extensions refer to `\mk{}
+regular', `\mk{} semibold', or `\mk{} bold' sets of parameters. The
+current \mk{} assumes that you will be creating at most
+one of the set of bold or semibold fonts but not both.
+
+It was surprisingly easy to prepare these parameter files. I prepared
+a test document in which individual characters are printed on a
+baseline at a size of 750\thinspace pt. It's (relatively) easy to
+measure the dimensions of such large characters, and \mf\ can be asked
+to divide by~75 to compute the proper dimension for ten point fonts.
+It was particularly easy for me to make these measurements, as I use Tom
+Rokicki's superior implementation of \TeX{} for NeXTStep. This
+package contains onscreen calipers which take all the work out of this
+chore.
+
+If you plan to create your own parameter files for other font
+families, please use the supplied files as models. Make sure all
+measurements are given in terms of sharped points
+`\texttt{pt\#}'; \mk{} looks for
+this string. And please
+consider placing this information in {\sc ctan}.
+
+\section{In conclusion...}
+For additional information, please see the book {\it \TeX\ Unbound:
+\LaTeX\ and \TeX\ Strategies for Fonts, Graphics, and More} (1998) by
+Alan Hoenig, published by Oxford University Press.
+
+This software is issued as is, subject to the usual Gnu copyleft
+agreement.
+
+If you have any questions, comments, or bug reports, please send them
+along to me.
+
+\begin{flushright}
+Alan Hoenig\\
+Department of Mathematics,\\ John Jay College\\
+445 West 59 St.\\
+New York, NY 10019\\
+(516) 385-0736 or (212) 237-8858; \texttt{ajhjj@cunyvm.cuny.edu}\\[9pt]
+January 1998
+\end{flushright}
+
+\end{document}
diff --git a/fonts/utilities/mathkit/dos/mkaccent.mf b/fonts/utilities/mathkit/dos/mkaccent.mf
new file mode 100644
index 0000000000..bbe25b9d91
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mkaccent.mf
@@ -0,0 +1,219 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkaccent.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% This file contains accents common to text roman and italic fonts.
+% Character codes \0022--\0030, \0040, \0136--\0137, \0175--\0177 are generated.
+
+% (Actually the accents in positions \0040, \0137, and \0175 are not generated
+% unless |ligs>0|, since other symbols are substituted
+% for those accents in non-ligature fonts.)
+
+cmchar "Grave accent";
+beginchar(oct"022",9u#,min(asc_height#,2x_height#),0);
+adjust_fit(0,0);
+if serifs: pickup crisp.nib; x1-.5stem=hround 2u; x2=2/3[x1,w-x1];
+ y1+.5stem=h+eps; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ filldraw circ_stroke z1e--z2e; % diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ lft x1l=hround 1.5u; rt x2r=hround(.5w+.25u+.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Acute accent";
+beginchar(oct"023",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant-if serifs: 1.5 fi u#;
+adjust_fit(0,0);
+if serifs: pickup crisp.nib; x1+.5stem=hround(w-2u); x2=2/3[x1,w-x1];
+ y1+.5stem=h+eps; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ filldraw circ_stroke z1e--z2e; % diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ rt x1r=hround(w-1.5u); lft x2l=hround(.5w-.25u-.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Hachek (check) accent";
+beginchar(oct"024",9u#,.75[x_height#,min(asc_height#,2x_height#)],0);
+h':=vround min(asc_height,2x_height); % height of circumflex being inverted
+if serifs: italcorr h#*slant+.5hair#-1.75u#;
+ adjust_fit(0,0);
+ pickup crisp.nib; pos2'(.5[vair,curve],90); top y2'r=h;
+ pos2(.5[vair,curve],90); x2=.5w;
+ x1=w-x3=good.x 2.25u; top y1=top y3=h; y1-y2=.5(y2'-x_height);
+ pos1(hair,angle(z2-z1)+90); pos3(hair,angle(z3-z2)+90);
+ filldraw stroke z1e--z2e--z3e; % diagonals
+else: italcorr h#*slant-.5stem#+.5vair#-.75u#;
+ adjust_fit(0,0);
+ pickup fine.nib; pos1(vair,0); pos3(vair,0); x1=w-x3;
+ pos2(stem,0); bot y2=vround(1/12[x_height,h']+o); x2=.5w;
+ top y1=top y3=h+o; lft x1l=hround(rt x2r-3.25u-.5vair);
+ z0=whatever[z1r,z2r]=whatever[z2l,z3l];
+ y4l=y4r=y2; x4l=good.x .2[x2l,x2]; x4r=w-x4l;
+ filldraw z4l--z1l--z1r--z0--z3l--z3r--z4r--cycle; fi % diagonals
+penlabels(0,1,2,3,4); endchar;
+
+cmchar "Breve accent";
+beginchar(oct"025",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant+.5vair#-1.5u#;
+adjust_fit(0,0);
+pickup crisp.nib; pos1(vair,-180); pos3(vair,0);
+top y1=top y3=h; lft x1r=w-rt x3r=hround(2u-.5vair);
+numeric mid_thickness; mid_thickness=vround 1/3[vair,stem];
+pos2(mid_thickness,-90); x2=.5w;
+bot y2r=vround max(x_height+o+tiny,1/3[x_height,h]+o-.5mid_thickness);
+filldraw stroke z1e{down}...z2e{right}...{up}z3e; % stroke
+penlabels(1,2,3); endchar;
+
+cmchar "Macron (bar) accent";
+numeric macron_breadth#; macron_breadth#=.2[vair#,stem#];
+beginchar(oct"026",9u#,.4[x_height#,asc_height#]+macron_breadth#,0);
+italcorr h#*slant-.75u#;
+adjust_fit(0,0);
+numeric macron_breadth; macron_breadth:=Vround .2[vair,stem];
+pickup if serifs: crisp.nib else: fine.nib fi;
+pos1(macron_breadth,90); pos2(macron_breadth,90);
+top y1r=top y2r=h+o; lft x1=w-rt x2=hround 1.25u;
+filldraw stroke z1e--z2e; % bar
+penlabels(1,2); endchar;
+
+cmchar "Scandinavian circle accent";
+beginchar(oct"027",13u#+4/3(asc_height#-x_height#)*slant,asc_height#,0);
+adjust_fit(cap_serif_fit#,cap_serif_fit#);
+numeric circ_hair,circ_vair;
+circ_hair=hround min(hair,u+.5); circ_vair=vround min(vair,(h-x_height)/6+.5);
+penpos1(circ_vair,90); penpos3(circ_vair,-90);
+penpos2(circ_hair,180); penpos4(circ_hair,0);
+x2r=hround(.5w-1.5u-.5circ_hair);
+x4r=w-x2r; x1=x3=.5w; y1r=h+apex_o; y2=y4=.5[y1,y3];
+y3r=vround(1/3[x_height,h]+apex_o);
+penstroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
+ & pulled_arc.e(3,4) & pulled_arc.e(4,1) & cycle; % bowl
+penlabels(1,2,3,4); endchar;
+
+cmchar "Cedilla accent";
+beginchar(oct"030",8u#,0,.875desc_depth#);
+adjust_fit(0,0);
+x1=.5w+.5u;
+if serifs: pickup crisp.nib; pos1(stem,0); pos2(stem,0);
+ pos3(vair,90); pos4(stem,0); pos5(vair,-90);
+ x1=x2; z3l=z2l; x4=x2+1.5u; x5=x3-1.5u;
+ bot y1=-o; bot y2=-vround 2/7d-o; y4=.5[y3,y5]; bot y5=-d-o;
+ filldraw stroke z1e--z2e; % stem
+ filldraw stroke z3e{right}...z4e{down}...{left}z5e; % hook
+else: pickup fine.nib; pos1(vair,0); top y1=-o-2;
+ pos2(.5[vair,stem],0); bot y2=-d-o; x2=x1-1.25u;
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2,3,4,5); endchar;
+
+iff ligs>0: cmchar "Cross for Polish l and L";
+if unknown l_width#:
+ l_width#:=5u#+2serif_fit#; fi % nominal width of `l'
+if unknown L_stem#:
+ L_stem#:=cap_serif_fit#+max(2u#+.5cap_stem#,3u#); fi % center of `L' stem
+%ligtable oct"040": "l" kern -l_width#-2letter_fit#,
+% "L" kern -.5l_width#-L_stem#-2letter_fit#;
+beginchar(oct"040",l_width#,x_height#,0);
+adjust_fit(stem_shift#,-stem_shift#);
+pickup crisp.nib; x2-x1=max(4u,2.8u+stem); .5[x1,x2]=.5w;
+y1-.5bar=.2[bar_height,x_height]; y2+.5bar=.8[bar_height,x_height];
+numeric theta; theta=angle(z2-z1)+90;
+pos1(bar,theta); pos2(bar,theta);
+filldraw stroke z1e--z2e; % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Circumflex (hat) accent";
+beginchar(oct"136",9u#,min(asc_height#,2x_height#),0);
+if serifs: italcorr .5[x_height#,h#]*slant+.5hair#-1.75u#;
+ adjust_fit(0,0);
+ pickup crisp.nib; pos2(.5[vair,curve],90); top y2r=h; x2=.5w;
+ x1=w-x3=good.x 2.25u; y1=y3=.5[x_height,y2];
+ pos1(hair,angle(z2-z1)+90); pos3(hair,angle(z3-z2)+90);
+ filldraw stroke z1e--z2e--z3e; % diagonals
+else: italcorr 2/3[x_height#,h#]*slant-.5stem#+.5vair#-.75u#;
+ adjust_fit(0,0);
+ pickup fine.nib; pos1(vair,0); pos3(vair,0); x1=w-x3;
+ pos2(stem,0); top y2=h; x2=.5w; bot y1=bot y3=vround 2/3[h,x_height]-eps;
+ lft x1l=hround(rt x2r-3.25u-.5vair); % same slope as in the acute accent
+ z0=whatever[z1r,z2r]=whatever[z2l,z3l];
+ y4l=y4r=y2; x4l=good.x .2[x2l,x2]; x4r=w-x4l;
+ filldraw z4l--z1l--z1r--z0--z3l--z3r--z4r--cycle; fi % diagonals
+penlabels(0,1,2,3,4); endchar;
+
+iff ligs>0: cmchar "Dot accent";
+numeric dot_diam#; dot_diam#=max(dot_size#,cap_curve#);
+beginchar(oct"137",5u#,min(asc_height#,10/7x_height#+.5dot_diam#),0);
+define_whole_blacker_pixels(dot_diam);
+italcorr h#*slant+.5dot_diam#-2u#;
+adjust_fit(0,0);
+pickup tiny.nib; pos1(dot_diam,0); pos2(dot_diam,90);
+x1=x2=.5w; top y2r=h+1;
+if bot y2l<x_height+o+slab: y2l:=min(y2r-eps,x_height+o+slab+.5tiny); fi
+y1=.5[y2l,y2r]; dot(1,2); % dot
+penlabels(1,2); endchar;
+
+iff ligs>0: cmchar "Long Hungarian umlaut accent";
+beginchar(oct"175",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant-u#;
+adjust_fit(0,0);
+x3-x1=x4-x2=hround 3u; y3=y1; y4=y2;
+if serifs: pickup crisp.nib; x3+.5stem=hround(w-1.5u); x2=2.5u;
+ y1+.5stem=h; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ pos3(stem,theta); pos4(hair,theta);
+ filldraw circ_stroke z1e--z2e; % left diagonal
+ filldraw circ_stroke z3e--z4e; % right diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ pos3(stem,0); pos4(vair,0);
+ rt x3r=hround(w-1.5u); lft x4l=hround(.5w+u-.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; % left diagonal
+ filldraw stroke z3e--z4e; fi % right diagonal
+penlabels(1,2,3,4); endchar;
+
+cmchar "Tilde (squiggle) accent";
+beginchar(oct"176",9u#,min(asc_height#,10/7x_height#+.5dot_size#),0);
+italcorr h#*slant-u#;
+adjust_fit(0,0);
+if serifs: numeric theta; theta=angle(1/6(6u-vair),1/4(h-x_height));
+ pickup crisp.nib; numeric mid_width; mid_width=.4[vair,stem];
+ pos1(vair,theta+90); pos2(vair,theta+90);
+ pos3(vair,theta+90); pos4(vair,theta+90);
+ z2-z1=z4-z3=(mid_width-crisp)*dir theta;
+ lft x1r=w-rt x4l=hround 1.5u; top y4r=h;
+ bot y1l=vround(bot y1l+min(2/3[x_height,h],y3l-.25vair)-top y1r);
+ pair delta; ypart delta=3(y3l-y1l); delta=whatever*dir theta;
+ filldraw z1l..controls(z1l+delta)and(z3l-delta)..z3l..z4l
+ --z4r..controls(z4r-delta)and(z2r+delta)..z2r..z1r--cycle; % stroke
+else: pickup fine.nib; pos1(vair,180); pos2(vair,90);
+ pos3(.5[vair,slab],90); pos4(vair,90); pos5(vair,180);
+ lft x1r=w-rt x5l=hround 1.5u; x2-x1=x3-x2=x4-x3=x5-x4;
+ bot y1=bot y4l=vround(.75[x_height,h]-vair);
+ top y2r=top y5=h; y3=.5[y2,y4];
+ filldraw stroke z1e{up}...z2e{right}..z3e..{right}z4e...{up}z5e; fi % stroke
+penlabels(1,2,3,4,5); endchar;
+
+cmchar "Umlaut (double dot) accent";
+numeric dot_diam#,dot_diam;
+dot_diam#=max(dot_size#,cap_curve#);
+beginchar(oct"177",9u#,min(asc_height#,10/7x_height#+.5dot_diam#),0);
+dot_diam=max(tiny.breadth,hround(max(dot_size,cap_curve)-2stem_corr));
+italcorr h#*slant+.5dot_diam#-2.25u#;
+adjust_fit(0,0);
+pickup tiny.nib; pos1(dot_diam,0); pos2(dot_diam,90);
+x1=x2=2.75u; top y2r=h+1;
+if bot y2l<x_height+o+slab: y2l:=min(y2r-eps,x_height+o+slab+.5tiny); fi
+y1=.5[y2l,y2r]; dot(1,2); % left dot
+pos3(dot_diam,0); penpos4(y2r-y2l,90); y3=y4=y1; x3=x4=w-x1;
+dot(3,4); % right dot
+penlabels(1,2,3,4); endchar;
diff --git a/fonts/utilities/mathkit/dos/mkmathex.mf b/fonts/utilities/mathkit/dos/mkmathex.mf
new file mode 100644
index 0000000000..6aeb7a5b32
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mkmathex.mf
@@ -0,0 +1,22 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathex.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathex.mf' modified from `mathex.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math extension";
+mode_setup; font_setup;
+
+input bigdel; % large delimiters
+input bigop; % large operators
+input bigacc; % large accents
+
+font_x_height x_height#;
+font_quad 18u#+4letter_fit#;
+% (The calling file should give the other math extension font parameters.)
+bye.
diff --git a/fonts/utilities/mathkit/dos/mkmathit.mf b/fonts/utilities/mathkit/dos/mkmathit.mf
new file mode 100644
index 0000000000..d2255b19d3
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mkmathit.mf
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathit.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathit.mf' modified from `mathit.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math italic";
+mode_setup; font_setup;
+
+%input romanu; % upper case (majuscules)
+%input itall; % lower case (minuscules)
+input greeku; % upper case greek letters
+input greekl; % lower case Greek letters
+input italms; % special symbols for math italic
+font_slant slant; font_x_height x_height#;
+font_quad 18u#+4letter_fit#;
+
+slant:=mono_charic#:=0; % the remaining characters will not be slanted
+currenttransform:=identity yscaled aspect_ratio scaled granularity;
+input olddig; % oldstyle numerals
+input romms; % roman math specials
+
+skewchar=oct"177"; skew#=.5u#;
+save comma;
+period=oct"72"; comma=oct"73"; slash=oct"75"; % non-ASCII positions
+%ligtable "h": skewchar kern -skew#;
+ligtable oct"027":oct"034": comma kern -u#, period kern -u#, % $\nu:\tau:$
+ "L":"g":"u":"v":"x": oct"013": oct"026": % $L:g:u:v:x:\alpha:\mu:$
+ oct"035":oct"173": skewchar kern skew#; % $\upsilon:\imath:$
+%ligtable "U": comma kern-2u#, period kern-2u#, % $U:$
+% slash kern-u#, skewchar kern skew#;
+%ligtable "K":oct"011": slash kern-u#, % $K:\it\Psi:$
+% oct"016":"r": comma kern-u#, period kern-u#, % $\delta:r:$
+% "D":"c":"e":"o":"s":"y":"z":oct"017": % $D:c:e:o:s:y:z:\epsilon:$
+% oct"021":oct"023":oct"037": skewchar kern 2skew#; % $\eta:\iota:\chi:$
+ligtable oct"007": slash kern-u#, % $\it\Upsilon:$
+ comma kern-2u#, period kern-2u#, skewchar kern 2skew#;
+ligtable oct"005":"H": slash kern-u#, % $\it\Pi:H:$
+ comma kern-u#, period kern-u#, skewchar kern 2skew#;
+%ligtable "N":"X": slash kern -1.5u#, % $N:X:$
+% "C":"T": slash kern -.5u#, comma kern -u#, period kern -u#, % $C:T:$
+% "B":"E":"G":"O":"Q":"R":oct"174": % $B:E:G:O:Q:R:\jmath:$
+% "l":"p":"q":"t":"w":oct"002":oct"004": % $l:p:q:t:w:\it\Theta:\Xi:$
+% oct"006":oct"010":oct"012":oct"014": % $\it\Sigma:\Phi:\Omega:\beta:$
+% oct"020":oct"022":oct"032":oct"036": % $\zeta:\theta:\rho:\phi:$
+% oct"042":oct"043":oct"045": % $\varepsilon:\vartheta:\varrho:$
+% oct"046":oct"047":oct"100": % $\varsigma:\varphi:\partial:$
+% skewchar kern 3skew#;
+%ligtable "M":"S":"Z": slash kern-u#, % $M:S:Z:$
+% comma kern-u#, period kern-u#, skewchar kern 3skew#;
+ligtable oct"000":"F":"P": slash kern -u#, % $\it\Gamma:F:P:$
+ comma kern-2u#, period kern-2u#, skewchar kern 3skew#;
+%ligtable "I":oct"030":oct"040":oct"140":oct"175": % $I:\xi:\psi:\ell:\wp:$
+% skewchar kern 4skew#;
+%ligtable "A": skewchar kern 5skew#; % $A:$
+%ligtable "d": "Y" kern u#, "Z" kern-u#, "j" kern-2u#, "f" kern-3u#, % $d:$
+% oct"001":oct"003": skewchar kern 6skew#; % $\it\Delta:\Lambda:$
+%ligtable "f": comma kern-u#, period kern-u#, skewchar kern 6skew#; % $f:$
+%ligtable "J": slash kern-u#, % $J:$
+% comma kern-2u#, period kern-2u#, skewchar kern 6skew#;
+%ligtable "j":oct"033": comma kern -u#, period kern -u#; % $j:\sigma:$
+%ligtable "V":"W":"Y":comma kern-3u#, period kern-3u#, % $V:W:Y:$
+% slash kern-2u#;
+%ligtable slash: oct"001" kern -u#, "A" kern -u#, "M" kern -u#, % $/:$
+% "N" kern -u#, "Y" kern +u#, "Z" kern -u#;
+bye.
diff --git a/fonts/utilities/mathkit/dos/mkmathsy.mf b/fonts/utilities/mathkit/dos/mkmathsy.mf
new file mode 100644
index 0000000000..62f98f61d0
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mkmathsy.mf
@@ -0,0 +1,38 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathsy.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathsy.mf' modified from `mathsy.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math symbols";
+mode_setup; font_setup;
+
+autorounding:=hair;
+input calu; % upper case calligraphic alphabet
+autorounding:=0;
+
+font_slant slant; font_x_height x_height#;
+font_quad 18u# if not monospace:+4letter_fit# fi;
+% (The spacing is zero so that \TeX\ will always add the italic correction.)
+% (The calling file should give the other math symbol font parameters.)
+
+slant:=mono_charic#:=0; % the remaining characters will not be slanted
+currenttransform:=identity yscaled aspect_ratio scaled granularity;
+input symbol; % the symbols
+
+if not monospace:
+ skewchar=oct"060"; skew#=.5u#;
+ ligtable "I": "T": "V": skewchar kern skew#;
+ ligtable "K": skewchar kern 2skew#;
+ ligtable "D": "N": "P": "R": "U": "W": "Y": skewchar kern 3skew#;
+ ligtable "E": "F": "G": "H": "O": "Q": skewchar kern 4skew#;
+ ligtable "B": "C": "L": "M": "S": "X": "Z": skewchar kern 5skew#;
+ ligtable "J": skewchar kern 6skew#;
+ ligtable "A": skewchar kern 7skew#;
+fi;
+bye.
diff --git a/fonts/utilities/mathkit/dos/mkroman.mf b/fonts/utilities/mathkit/dos/mkroman.mf
new file mode 100644
index 0000000000..2721e81c26
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/mkroman.mf
@@ -0,0 +1,73 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkroman.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file is modified from `roman.mf' to NOT generate
+%% letters. It is for use by MathKit.
+
+if ligs>1: font_coding_scheme:="TeX text";
+ spanish_shriek=oct"074"; spanish_query=oct"076";
+else: font_coding_scheme:=if ligs=0: "TeX typewriter text"
+ else: "TeX text without f-ligatures" fi;
+ spanish_shriek=oct"016"; spanish_query=oct"017"; fi
+
+mode_setup; font_setup;
+
+%input romanu; % upper case (majuscules)
+%input romanl; % lower case (minuscules)
+input greeku; % upper case Greek letters
+input romand; % numerals
+input romanp; % ampersand, question marks, currency sign
+%input romspl; % lowercase specials (dotless \i, ligature \ae, etc.)
+%input romspu; % uppercase specials (\AE, \OE, \O)
+input punct; % punctuation symbols common to roman and italic text
+input mkaccent; % accents common to roman and italic text
+%if ligs>1: input romlig; fi % letter ligatures
+%if ligs>0: input comlig; fi % ligatures common with italic text
+%if ligs<=1: input romsub; fi % substitutes for ligatures
+
+%ligtable "!": "`" =: spanish_shriek;
+%ligtable "?": "`" =: spanish_query;
+%font_slant slant; font_x_height x_height#;
+%if monospace: font_normal_space 9u#; % no stretching or shrinking
+% font_quad 18u#;
+% font_extra_space 9u#;
+%else: font_normal_space 6u#+2letter_fit#;
+% font_normal_stretch 3u#; font_normal_shrink 2u#;
+% font_quad 18u#+4letter_fit#;
+% font_extra_space 2u#;
+% k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
+% ligtable "k": if serifs: "v": "a" kern -u#, fi\\"w": "e" kern k#,
+% "a" kern k#, "o" kern k#, "c" kern k#;
+% ligtable "P": "A" kern kk#,
+% "y": "o" kern k#, "e" kern k#, "a" kern k#, "." kern kk#, "," kern kk#;
+% ligtable "F": "V": "W": if serifs: "o" kern kk#, "e" kern kk#, "u" kern kk#,
+% "r" kern kk#, "a" kern kk#, "A" kern kkk#,
+% else: "o" kern k#, "e" kern k#, "u" kern k#,
+% "r" kern k#, "a" kern k#, "A" kern kk#, fi
+% "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#;
+% ligtable "T": "y" kern if serifs: k# else: kk# fi,
+% "Y": "e" kern kk#, "o" kern kk#,
+% "r" kern kk#, "a" kern kk#, "A" kern kk#, "u" kern kk#;
+% ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#,
+% "V" kern k#, "Y" kern k#;
+% if serifs: ligtable "h": "m": "n":
+% "t" kern k#, "u" kern k#, "b" kern k#, "y" kern k#, "v" kern k#, "w" kern k#;
+% ligtable "c": "h" kern k#, "k" kern k#; fi
+% ligtable "o": "b": "p": "e" kern -k#, "o" kern -k#, "x" kern k#,
+% "d" kern -k#, "c" kern -k#, "q" kern -k#,
+% "a": if serifs: "v" kern k#, "j" kern u#, else: "r" kern k#, fi
+% "t": "y" kern k#,
+% "u": "w" kern k#;
+% ligtable "A": if serifs: "R": fi\\ "t" kern k#,
+% "C" kern k#, "O" kern k#, "G" kern k#, "U" kern k#, "Q" kern k#,
+% "L": "T" kern kk#, "Y" kern kk#, "V" kern kkk#, "W" kern kkk#;
+% ligtable "g": "j" kern -k#; % logjam
+% ligtable "I": "I" kern -k#; fi % Richard III
+% % there are ligature/kern programs for |"f"| in the {\tt romlig} file
+% % and for |"-"|, |"`"|, and |"'"| in the {\tt comlig} file
+bye.
diff --git a/fonts/utilities/mathkit/dos/pl.mkr b/fonts/utilities/mathkit/dos/pl.mkr
new file mode 100644
index 0000000000..477d0f6bc3
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/pl.mkr
@@ -0,0 +1,51 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file pl.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=545/75pt#; % height of tallest characters
+asc_height#:=546/75pt#; % height of lowercase ascenders
+cap_height#:=520/75pt#; % height of caps
+fig_height#:=514/75pt#; % height of numerals
+x_height#:=347/75pt#; % height of lowercase without ascenders
+math_axis#:=95/36pt#; % axis of symmetry for math symbols
+bar_height#:=175/75pt#; % height of crossbar in lowercase e
+comma_depth#:=116/75pt#; % depth of comma below baseline
+desc_depth#:=209/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=40/75pt#; % width of extrafine details
+hair#:=40/75pt#; % lowercase hairline breadth
+stem#:=64/75pt#; % lowercase stem breadth
+curve#:=66/75pt#; % lowercase curve breadth
+ess#:=69/75pt#; % breadth in middle of lowercase s
+flare#:=57/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=84/75pt#; % diameter of dots
+cap_hair#:=32/75pt#; % uppercase hairline breadth
+cap_stem#:=71/75pt#; % uppercase stem breadth
+cap_curve#:=82/75pt#; % uppercase curve breadth
+cap_ess#:=68/75pt#; % breadth in middle of uppercase s
+rule_thickness#:=.6pt#; % thickness of lines in math symbols
+
+dish#:=2.4/75pt#; % amount erased at top or bottom of serifs
+bracket#:=29/75pt#; % vertical distance from serif base to tangent
+jut#:=63/75pt#; % protrusion of lowercase serifs
+cap_jut#:=74/75pt#; % protrusion of uppercase serifs
+beak_jut#:=0/75pt#; % horizontal protrusion of beak serifs
+beak#:=85/75pt#; % vertical protrusion of beak serifs
+vair#:=40/75pt#; % vertical diameter of hairlines
+bar#:=37/75pt#; % lowercase bar thickness
+slab#:=23/75pt#; % serif and arm thickness
+cap_bar#:=32/75pt#; % uppercase bar thickness
+cap_band#:=29/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=27/75pt#; % vertical drop of sloped serifs
+
+o#:=14/75pt#; % amount of overshoot for curves
+apex_o#:=5/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.176; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/dos/readme b/fonts/utilities/mathkit/dos/readme
new file mode 100644
index 0000000000..0d5a4f4955
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/readme
@@ -0,0 +1,28 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file readme, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The _MathKit_ package (version 0.7) creates math fonts that match
+Type1 outline fonts (Times, Palatino, and others) for
+typesetting math with TeX. It constructs these fonts by
+combining letters and numerals from the outline
+fonts with other symbols drawn by Metafont using
+parameters that match the outline fonts. Detailed
+instructions are found in the file `mathkit.tex', part of
+the package. You don't need to know anything about
+Metafont or virtual fonts to use this package.
+
+The package includes parameter templates for building
+font families for Times Roman (regular and bold),
+Palatino (regular only), and Monotype Baskerville
+(regular and semibold). If you choose to make fonts
+using the bold templates, you will be able to typeset
+bold mathematics as well. MathKit produces style files
+for plain TeX and NFSS so you can use your new fonts.
+
+ ---Alan Hoenig (ajhjj@cunyvm.cuny.edu)
+ January, 1998
diff --git a/fonts/utilities/mathkit/dos/rhax.mtx b/fonts/utilities/mathkit/dos/rhax.mtx
new file mode 100644
index 0000000000..8191a59ba8
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/rhax.mtx
@@ -0,0 +1,61 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file rhax.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Based on work by Aloysius G. Helminck. All rights reserved.
+
+\relax
+
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.315}
+
+%%% If you want the math to be less tight, then set the letterspacing.
+%%% The standard is 0.
+%\setint{letterspacing}{20}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount of extra space for subscripts
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \shiftglyph{parenleft}{25}{10}{0}
+% \shiftglyph{parenright}{40}{0}{0}
+% \shiftglyph{grave}{1}{1}{0}
+% \shiftglyph{acute}{1}{1}{0}
+% \shiftglyph{caron}{1}{1}{0}
+% \shiftglyph{breve}{1}{1}{0}
+% \shiftglyph{macron}{1}{1}{0}
+% \shiftglyph{circumflex}{1}{1}{0}
+% \shiftglyph{dotaccent}{1}{1}{0}
+% \shiftglyph{tilde}{1}{1}{0}
+% \shiftglyph{dieresis}{1}{1}{0}
+% \shiftglyph{overbar}{1}{1}{0}
+% \shiftglyph{tie}{1}{1}{0}
+
+
+\endmetrics
+
+
+
+
diff --git a/fonts/utilities/mathkit/dos/testmath.mk b/fonts/utilities/mathkit/dos/testmath.mk
new file mode 100644
index 0000000000..7b5a1c749f
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/testmath.mk
@@ -0,0 +1,364 @@
+%&latex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file testmath.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+
+\renewcommand{\encodingdefault}{OT1}
+
+\usepackage{z<mock><fam>}
+
+\title{A \LaTeX\ math test document}
+\author{for fonts installed by MathKit}
+
+\raggedbottom
+
+\font\TTT=cmr7 \newcount\cno
+\def\TT{\T\setbox0=\hbox{\char\cno}\ifdim\wd0>0pt
+ \box0\lower4pt\hbox{\TTT\the\cno}\else
+ \ifdim\ht0>0pt \box0\lower4pt\hbox{\TTT\the\cno}\fi\fi
+ \global\advance\cno by1
+}
+\def\showfont#1{\font\T=#1 at 10pt\global\cno=0
+ \tabskip1pt plus2pt minus1pt\halign to\textwidth{&\hss\TT ##\hss\cr
+ \multispan{16}\hfil \tt Font #1\hfil\cr\noalign{\smallskip}
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+}}
+\newcommand{\testsize}[1]{
+ #1 \texttt{\string#1}: \(a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2},
+ a_{0_a}, 0_{a_0},
+ \sum_{i=0}^\infty\) \\
+}
+
+\newcommand{\testdelims}[3]{\sqrt{
+ #1|#1\|#1\uparrow
+ #1\downarrow#1\updownarrow#1\Uparrow#1\Downarrow
+ #1\Updownarrow#1\lfloor#1\lceil
+ #1(#1\{#1[#1\langle
+ #3
+ #2\rangle#2]#2\}#2)
+ #2\rceil#2\rfloor#2\Updownarrow#2\Downarrow
+ #2\Uparrow#2\updownarrow#2\downarrow#2\uparrow
+ #2\|#2|
+}\\}
+
+\newcommand{\testglyphs}[1]{
+\begin{quote}
+ #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m
+ #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z
+ #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M
+ #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z
+ #10#11#12#13#14#15#16#17#18#19
+ #1\Gamma#1\Delta#1\Theta#1\Lambda#1\Xi
+ #1\Pi#1\Sigma#1\Upsilon#1\Phi#1\Psi#1\Omega
+ #1\alpha#1\beta#1\gamma#1\delta#1\epsilon
+ #1\varepsilon#1\zeta#1\eta#1\theta#1\vartheta
+ #1\iota#1\kappa#1\lambda#1\mu#1\nu#1\xi#1\omicron
+ #1\pi#1\varpi#1\rho#1\varrho
+ #1\sigma#1\varsigma#1\tau#1\upsilon#1\phi
+ #1\varphi#1\chi#1\psi#1\omega
+ #1\partial#1\ell#1\imath#1\jmath#1\wp
+\end{quote}
+}
+
+\newcommand{\sidebearings}[1]{ \(|#1|\) }
+\newcommand{\subscripts}[1]{ \(#1_\circ\) }
+\newcommand{\supscripts}[1]{ \(#1^\circ\) }
+\newcommand{\scripts}[1]{ \(#1^\circ_\circ\) }
+\newcommand{\vecaccents}[1]{ \(\vec#1\) }
+\newcommand{\tildeaccents}[1]{ \(\tilde#1\) }
+
+\ifx\omicron\undefined
+ \let\omicron=o
+\fi
+
+\begin{document}
+
+\maketitle
+
+\subsection*{Introduction}
+
+This document tests the math capabilities of a math package, and is
+strongly modelled after a similar document by Alan Jeffrey.
+This test exercises the {\tt <mock>} math fonts combined with the
+{\tt <fam>} text fonts.
+
+\showfont{<fam>r<m>7t}
+\smallskip
+\showfont{<fam>r<m>7m}
+\smallskip
+\showfont{<mock>sy10}
+\smallskip
+\showfont{<mock>ex10}
+\smallskip
+
+\subsection*{Fonts}
+
+Math italic:
+\[
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz
+\]
+Text italic:
+\[
+ \mathit{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\]
+Roman:
+\[
+ \mathrm{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\]
+[b]Bold:
+[b]\[
+[b] \mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[b] abcdefghijklmnopqrstuvwxyz}
+[b]\]
+[b]{\mathversion{boldmath}
+[b]\[
+[b] \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma
+[b] \Upsilon\Phi\Psi\Omega
+[b]\]}
+[tt]Typewriter:
+[tt]\[
+[tt] \mathtt{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[tt] abcdefghijklmnopqrstuvwxyz}
+[tt]\]
+Greek:
+\[
+ \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+ \alpha\beta\gamma\delta\epsilon\varepsilon\zeta\eta\theta\vartheta
+ \iota\kappa\lambda\mu\nu\xi\omicron\pi\varpi\rho\varrho
+ \sigma\varsigma\tau\upsilon\phi\varphi\chi\psi\omega
+\]
+Calligraphic:
+\[A\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\]
+Sans:
+\[
+ A\mathsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \quad
+ a\mathsf{abcdefghijklmnopqrstuvwxyz}z
+\]
+[fr]Fraktur:
+[fr]\[
+[fr] A\mathfr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \quad
+[fr] a\mathfr{abcdefghijklmnopqrstuvwxyz}z
+[fr]\]
+[bb]Blackboard Bold:
+[bb]\[
+[bb] A\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+[bb]\]
+Do these line up appropriately?
+\[
+ \forall \mathcal{B} \Gamma
+[b]\mathbf{D}
+ \exists
+[tt]\mathtt{F}
+ G \mathcal{H} \Im
+[b]\mathbf{J}
+ \mathsf{K} \Lambda
+ M \aleph \emptyset \Pi \mathit{Q} \Re \Sigma
+[tt]\mathtt{T}
+ \Upsilon \mathcal{V}
+[b]\mathbf{W}
+ \Xi \mathsf{Y} Z
+ \quad
+ a
+[b]\mathbf{c}
+ \epsilon
+[tt]\mathtt{i}
+ \kappa
+[b]\mathbf{m}
+ \nu o \varpi \mathsf{r}
+ s \tau \mathit{u} v \mathsf{w} z
+ \quad
+[tt]\mathtt{g}
+ j \mathsf{q} \chi y
+ \quad
+ b \delta
+[b]\mathbf{f}
+[tt]\mathtt{h}
+ k \mathsf{l} \phi
+\]
+
+\subsection*{Accents}
+
+\[
+\hbox{%
+ \'o \`o \^o \"o \~o \=o \.o \u o \v o
+ \H o \t oo \c o \d o \b o \t oo}
+ \quad
+ \hat o \check o \tilde o \acute o \grave o \dot o
+ \ddot o
+ \breve o \bar o \vec o \vec h \hbar
+\]
+
+\subsection*{Glyph dimensions}
+
+These glyphs should be optically centered:
+ \testglyphs\sidebearings
+These subscripts should be correctly placed:
+ \testglyphs\subscripts
+These superscripts should be correctly placed:
+ \testglyphs\supscripts
+These subscripts and superscripts should be correctly placed:
+ \testglyphs\scripts
+These accents should be centered:
+ \testglyphs\vecaccents
+As should these:
+ \testglyphs\tildeaccents
+
+\subsection*{Symbols}
+
+These arrows should join up properly:
+\[
+ a \hookrightarrow b \hookleftarrow c \longrightarrow d
+ \longleftarrow e \Longrightarrow f \Longleftarrow g
+ \longleftrightarrow h \Longleftrightarrow i
+ \mapsto j
+\]
+\[
+ g^\circ \mapsto g^\bullet\quad x\equiv y\not\equiv z
+\]
+These symbols should be of similar weights:
+\[
+ \pm + - \mp = / \backslash ( \langle [ \{ \} ] \rangle ) < \leq > \geq
+\]
+Are these the same size?
+\[\textstyle
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+\]
+Are these?
+\[
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+\]
+
+
+\subsection*{Sizing}
+
+\[
+ abcde + x^{abcde} + 2^{x^{abcde}}
+\]
+
+The subscripts should be appropriately sized:
+\begin{quote}
+%\testsize\tiny
+%\testsize\scriptsize
+%\testsize\footnotesize
+%\testsize\small
+\testsize\normalsize
+%\testsize\large
+%\testsize\Large
+%\testsize\LARGE
+%\testsize\huge
+%\testsize\Huge
+\end{quote}
+
+\subsection*{Delimiters}
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with \verb|\big|, etc:
+\[\begin{array}{c}
+ \testdelims\relax\relax{a}
+ \testdelims\bigl\bigr{a}
+ \testdelims\Bigl\Bigr{a}
+ \testdelims\biggl\biggr{a}
+ \testdelims\Biggl\Biggr{a}
+\end{array}\]
+Then with \verb|\left| and \verb|\right|:
+\[\begin{array}{c}
+ \testdelims\left\right{\begin{array}{c} a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a\\a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a\\a\\a \end{array}}
+\end{array}\]
+
+\subsection*{Spacing}
+
+This paragraph should appear to be a monotone grey texture. Suppose
+\(f \in \mathcal{S}_n\) and \(g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)\). Then \(g \in \mathcal{S}_n\); now (\emph{c}) implies
+that \(\hat g = D_\alpha \hat f\) and \(P \cdot D_\alpha\hat
+f = P \cdot \hat g = (P(D)g)\hat{}\), which is a bounded function,
+since \(P(D)g \in L^1(R^n)\). This proves that \(\hat f \in
+\mathcal S_n\). If \(f_i \rightarrow f\) in \(\mathcal S_n\),
+then \(f_i \rightarrow f\) in \(L^1(R^n)\). Therefore \(\hat
+f_i(t) \rightarrow \hat f(t)\) for all \(t \in R^n\). That \(f
+\rightarrow \hat f\) is a \emph{continuous} mapping of
+\(\mathcal S_n\) into \(\mathcal S_n\) follows now from the
+closed graph theorem. And thus for \(x_1\) through \(x_i\).
+\emph{Functional Analysis}, W.~Rudin,
+McGraw--Hill, 1973.
+
+[b]\begin{boldface}
+[b]This paragraph should appear to be a monotone dark texture. Suppose
+[b]\(f \in \mathcal{S}_n\) and \(g(x) = (-1)^{|\alpha|}x^\alpha
+[b]f(x)\). Then \(g \in \mathcal{S}_n\); now (\emph{c}) implies
+[b]that \(\hat g = D_\alpha \hat f\) and \(P \cdot D_\alpha\hat
+[b]f = P \cdot \hat g = (P(D)g)\hat{}\), which is a bounded function,
+[b]since \(P(D)g \in L^1(R^n)\). This proves that \(\hat f \in
+[b]\mathcal S_n\). If \(f_i \rightarrow f\) in \(\mathcal S_n\),
+[b]then \(f_i \rightarrow f\) in \(L^1(R^n)\). Therefore \(\hat
+[b]f_i(t) \rightarrow \hat f(t)\) for all \(t \in R^n\). That \(f
+[b]\rightarrow \hat f\) is a \emph{continuous} mapping of
+[b]\(\mathcal S_n\) into \(\mathcal S_n\) follows now from the
+[b]closed graph theorem. And thus for \(x_1\) through \(x_i\).
+[b]\emph{Functional Analysis}, W.~Rudin, McGraw--Hill, 1973.
+[b]\end{boldface}
+
+{\itshape This paragraph should appear to be a monotone grey texture.
+Suppose \(f \in \mathcal{S}_n\) and \(g(x) =
+(-1)^{|\alpha|}x^\alpha f(x)\). Then \(g \in \mathcal{S}_n\);
+now (\emph{c}) implies that \(\hat g = D_\alpha \hat f\) and
+\(P \cdot D_\alpha\hat f = P \cdot \hat g = (P(D)g)\hat{}\),
+which is a bounded function, since \(P(D)g \in L^1(R^n)\). This
+proves that \(\hat f \in \mathcal S_n\). If \(f_i \rightarrow
+f\) in \(\mathcal S_n\), then \(f_i \rightarrow f\) in
+\(L^1(R^n)\). Therefore \(\hat f_i(t) \rightarrow \hat f(t)\)
+for all \(t \in R^n\). That \(f \rightarrow \hat f\) is a
+\emph{continuous} mapping of \(\mathcal S_n\) into \(\mathcal
+S_n\) follows now from the closed graph theorem. \emph{Functional
+Analysis}, W.~Rudin, McGraw--Hill, 1973.}
+
+The text in these boxes should spread out as much as the math does:
+\[\begin{array}{c}
+ \framebox[.95\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[.975\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.025\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.05\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.075\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.1\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.125\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+\end{array}\]
+\end{document}
diff --git a/fonts/utilities/mathkit/dos/testmatp.mk b/fonts/utilities/mathkit/dos/testmatp.mk
new file mode 100644
index 0000000000..f3e2383361
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/testmatp.mk
@@ -0,0 +1,338 @@
+%&plain
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file testmatp.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\font\TTT=cmr7 \newcount\cno
+\def\TT{\T\setbox0=\hbox{\char\cno}\ifdim\wd0>0pt
+ \box0\lower4pt\hbox{\TTT\the\cno}\else
+ \ifdim\ht0>0pt \box0\lower4pt\hbox{\TTT\the\cno}\fi\fi
+ \global\advance\cno by1
+}
+\def\showfont#1{\font\T=#1 at 10pt\global\cno=0
+ \tabskip1pt plus2pt minus1pt\halign to\hsize{&\hss\TT ##\hss\cr
+ \multispan{16}\hfil \tt Font #1\hfil\cr\noalign{\smallskip}
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+}}
+
+%% This is a `plain tex-ified' version of Alan Jeffrey's
+%% testmath.tex.
+
+\input z<mock><fam>
+\advance\hsize by -4pc
+
+
+\centerline{\bf A Plain Math Test Document}\medskip
+\centerline{for fonts installed by MathKit}\bigskip
+\centerline{\it <currdate>}
+
+\raggedbottom
+
+\def\framebox[#1]#2{%
+ \setbox0=\hbox{#2}\dimen0=\wd0
+ \vbox{\hrule\hbox to#1\dimen0{\vrule\vrule width0pt height8pt depth2pt
+ #2\vrule}\hrule}}
+\def\testsize#1{
+ {\tt\string#1}: $a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2}, X^{X^X}_{X_X},
+ a_{0_a}, 0_{a_0}, E=mc^2, X_{E=mc^2}, X_{X_{E=mc^2}},
+ \sum_{i=0}^\infty$
+}
+
+\def\testdelims#1#2#3{\sqrt{
+ #1|#1\|#1\uparrow
+ #1\downarrow#1\updownarrow#1\Uparrow#1\Downarrow
+ #1\Updownarrow#1\lfloor#1\lceil
+ #1(#1\{#1[#1\langle
+ #3
+ #2\rangle#2]#2\}#2)
+ #2\rceil#2\rfloor#2\Updownarrow#2\Downarrow
+ #2\Uparrow#2\updownarrow#2\downarrow#2\uparrow
+ #2\|#2|
+}\cr}
+
+\def\testglyphs#1{
+\endgraf
+\bgroup\narrower\noindent
+ #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m
+ #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z
+ #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M
+ #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z
+ #10#11#12#13#14#15#16#17#18#19
+ #1\Gamma#1\Delta#1\Theta#1\Lambda#1\Xi
+ #1\Pi#1\Sigma#1\Upsilon#1\Phi#1\Psi#1\Omega
+ #1\alpha#1\beta#1\gamma#1\delta#1\epsilon
+ #1\varepsilon#1\zeta#1\eta#1\theta#1\vartheta
+ #1\iota#1\kappa#1\lambda#1\mu#1\nu#1\xi#1\omicron
+ #1\pi#1\varpi#1\rho#1\varrho
+ #1\sigma#1\varsigma#1\tau#1\upsilon#1\phi
+ #1\varphi#1\chi#1\psi#1\omega
+ #1\partial#1\ell#1\imath#1\jmath#1\wp
+\endgraf
+\egroup
+}
+
+\def\sidebearings#1{ $|#1|$ }
+\def\subscripts#1{ $#1_\circ$ }
+\def\supscripts#1{ $#1^\circ$ }
+\def\scripts#1{ $#1^\circ_\circ$ }
+\def\vecaccents#1{ $\vec#1$ }
+\def\tildeaccents#1{ $\tilde#1$ }
+
+\ifx\omicron\undefined
+ \let\omicron=o
+\fi
+
+\beginsection Introduction
+
+This document (based on a similar document created by Alan Jeffrey)
+tests the math capabilities of a math package for plain \TeX. The math
+package combines the {\tt <mock>} math fonts with the {\tt <fam>}
+text fonts.
+
+\showfont{<fam>r<m>7t}
+\smallskip
+\showfont{<fam>r<m>7m}
+\smallskip
+\showfont{<mock>sy10}
+\smallskip
+\showfont{<mock>ex10}
+
+\beginsection Fonts
+
+Math italic:
+$$
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz
+$$
+Text italic:
+$$
+ {\it ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+Roman:
+$$
+ {\rm ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+[tt]Typewriter:
+[tt]$$
+[tt] {\tt ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[tt] abcdefghijklmnopqrstuvwxyz}
+[tt]$$
+Bold:
+$$
+ {\bf ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+[b]{\boldface
+[b]$$
+[b] \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+[b]$$
+[b]}
+Calligraphic:
+$$
+ A{\cal ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+$$
+Sans:
+$$
+ A{\sf ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\ a{\sf abcdefghijklmnopqrstuvwxyz}z
+$$
+[fr]Fraktur:
+[fr]$$
+[fr] A{\frak ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\ a{\frak abcdefghijklmnopqrstuvwxyz}z
+[fr]$$
+[bb]Blackboard Bold:
+[bb]$$
+[bb] A{\bb ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+[bb]$$
+Greek:
+$$
+ \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+ \alpha\beta\gamma\delta\epsilon\varepsilon\zeta\eta\theta\vartheta
+ \iota\kappa\lambda\mu\nu\xi\omicron\pi\varpi\rho\varrho
+ \sigma\varsigma\tau\upsilon\phi\varphi\chi\psi\omega
+$$
+Do these line up appropriately?
+$$
+ \forall {\cal B} \Gamma {\bf D} \exists
+[tt]{\tt F}
+ G {\cal H} \Im {\bf J} {\sf K} \Lambda
+ M \aleph \emptyset \Pi {\it Q} \Re \Sigma
+[tt]{\tt T}
+ \Upsilon {\cal V} {\bf W} \Xi
+ {\sf Y} Z
+ \quad
+ a {\bf c} \epsilon
+[tt]{\tt i}
+ \kappa {\bf m} \nu o \varpi {\sf r}
+ s \tau {\it u} v {\sf w} z
+ \quad
+[tt]{\tt g}
+ j {\sf q} \chi y
+ \quad
+ b \delta {\bf f}
+[tt]{\tt h}
+ k {\sf l} \phi
+$$
+
+\beginsection Glyph dimensions
+
+These glyphs should be optically centered:
+ \testglyphs\sidebearings
+\noindent These subscripts should be correctly placed:
+ \testglyphs\subscripts
+\noindent These superscripts should be correctly placed:
+ \testglyphs\supscripts
+\noindent These subscripts and superscripts should be correctly placed:
+ \testglyphs\scripts
+\noindent These accents should be centered:
+ \testglyphs\vecaccents
+\noindent As should these:
+ \testglyphs\tildeaccents
+\noindent And here are accents in general:
+ \'o \`o \^o \"o \~o \=o \.o \u o \v o \H o
+ \t oo \c o \d o \b o \quad
+ $\hat o \check o \tilde o \acute o \grave o \dot o
+ \ddot o \breve o \bar o \vec o \vec h \hbar$
+
+\beginsection Symbols
+
+These arrows should join up properly:
+$$
+ a \hookrightarrow b \hookleftarrow c \longrightarrow d
+ \longleftarrow e \Longrightarrow f \Longleftarrow g
+ \longleftrightarrow h \Longleftrightarrow i
+ \mapsto j
+$$
+These symbols should of similar weights:
+$$
+ \pm + - \mp = / \backslash ( \langle [ \{ \} ] \rangle ) < \leq > \geq
+$$
+Are these the same size?
+$$\textstyle
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+$$
+Are these?
+$$
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+$$
+
+
+\beginsection Sizing
+
+$$
+ abcde + x^{abcde} + 2^{x^{abcde}}
+$$
+
+The subscripts should be appropriately sized:
+
+{\narrower\noindent\bodyfonts
+\testsize\bodyfonts \endgraf
+}
+
+\beginsection Delimiters
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with {\tt\string\big}, etc:
+$$\vbox{\halign{\hfil$#$\hfil\cr
+ \testdelims\relax\relax{a}
+ \testdelims\bigl\bigr{a}
+ \testdelims\Bigl\Bigr{a}
+ \testdelims\biggl\biggr{a}
+ \testdelims\Biggl\Biggr{a}
+}}$$
+Then with {\tt\string\left} and {\tt\string\right}:
+$$\vbox{\halign{\hfil$#$\hfil\cr
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a\cr a\cr a \cr}}}}
+}}$$
+
+\beginsection Spacing
+
+This paragraph should appear to be a monotone grey texture.
+Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)$. Then $g \in {\cal S}_n$; now ({\bf c}) implies that $\hat
+g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+(P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+\in R^n$. That $f \rightarrow \hat f$ is a {\it continuous\/} mapping
+of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+graph theorem. And thus for $x_1$ through $x_i$.
+{\bf Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973.
+
+[b]{\boldface
+[b]This paragraph should appear to be a monotone dark texture.
+[b]Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+[b]f(x)$. Then $g \in {\cal S}_n$; now (c) implies that $\hat
+[b]g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+[b](P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+[b]L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+[b]\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+[b]$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+[b]\in R^n$. That $f \rightarrow \hat f$ is a {\it continuous} mapping
+[b]of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+[b]graph theorem. And thus for $x_1$ through $x_i$.
+[b]{\it Functional Analysis}, W.~Rudin, McGraw--Hill, 1973.
+[b]}
+[b]
+{\it This paragraph should appear to be a monotone grey texture.
+Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)$. Then $g \in {\cal S}_n$; now ({\bf c}) implies that $\hat
+g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+(P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+\in R^n$. That $f \rightarrow \hat f$ is a {\bi continuous} mapping
+of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+graph theorem. {\bi Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973.}
+
+The text in these boxes should spread out as much as the math does:
+$$\vbox{\halign{\hfil#\hfil\cr
+ \framebox[.95]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[.975]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.025]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.05]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.075]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.1]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.125]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+\cr}}$$
+\bye
diff --git a/fonts/utilities/mathkit/dos/tm.mkb b/fonts/utilities/mathkit/dos/tm.mkb
new file mode 100644
index 0000000000..65ab6d012f
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/tm.mkb
@@ -0,0 +1,56 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file tm.mkb, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=248/36pt#; % height of tallest characters
+asc_height#:=248/36pt#; % height of lowercase ascenders
+cap_height#:=248/36pt#; % height of caps
+fig_height#:=248/36pt#; % height of numerals
+x_height#:=167/36pt#; % height of lowercase without ascenders
+math_axis#:=90/36pt#; % axis of symmetry for math symbols
+bar_height#:=89/36pt#; % height of crossbar in lowercase e
+comma_depth#:=64/36pt#; % depth of comma below baseline
+desc_depth#:=77/36pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/36pt#; % diameter of rounded corners
+fine#:=0/36pt#; % diameter of sharply rounded corners
+thin_join#:=11/36pt#; % width of extrafine details
+hair#:=18/36pt#; % lowercase hairline breadth
+stem#:=48/36pt#; % lowercase stem breadth
+curve#:=51/36pt#; % lowercase curve breadth
+ess#:=51/36pt#; % breadth in middle of lowercase s
+flare#:=50/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=57/36pt#; % diameter of dots
+cap_hair#:=18/36pt#; % uppercase hairline breadth
+cap_stem#:=58/36pt#; % uppercase stem breadth
+cap_curve#:=51/36pt#; % uppercase curve breadth
+cap_ess#:=57/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.8pt#; % thickness of lines in math symbols
+
+dish#:=0/36pt#; % amount erased at top or bottom of serifs
+bracket#:=32/36pt#; % vertical distance from serif base to tangent
+jut#:=15/36pt#; % protrusion of lowercase serifs
+cap_jut#:=35/36pt#; % protrusion of uppercase serifs
+beak_jut#:= 0/36pt#; % horizontal protrusion of beak serifs
+beak#:=55/36pt#; % vertical protrusion of beak serifs
+vair#:=18/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=18/36pt#; % lowercase bar thickness
+slab#:= 7/36pt#; % serif and arm thickness
+cap_bar#:=13/36pt#; % uppercase bar thickness
+cap_band#:=13/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=0/36pt#; % vertical drop of sloped serifs
+stem_corr#:=2/36pt#; % for small refinements of stem breadth
+vair_corr#:=1.5/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=5/36pt#; % amount of overshoot for curves
+apex_o#:=4/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=.286; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/dos/tm.mkr b/fonts/utilities/mathkit/dos/tm.mkr
new file mode 100644
index 0000000000..d330ffb31d
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/tm.mkr
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file tm.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=258.8/36pt#; % height of tallest characters
+asc_height#:=259.2/36pt#; % height of lowercase ascenders
+cap_height#:=248/36pt#; % height of caps
+fig_height#:=248/36pt#; % height of numerals
+x_height#:=167.5/36pt#; % height of lowercase without ascenders
+math_axis#:=90/36pt#; % axis of symmetry for math symbols
+bar_height#:=104.2/36pt#; % height of crossbar in lowercase e
+comma_depth#:=60.8/36pt#; % depth of comma below baseline
+desc_depth#:=76.8/36pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % * diameter of serif corners
+tiny#:=0/36pt#; % diameter of rounded corners
+fine#:=0/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % * width of extrafine details
+hair#:=12.5/36pt#; % lowercase hairline breadth
+stem#:=29.2/36pt#; % lowercase stem breadth
+curve#:=32/36pt#; % lowercase curve breadth
+ess#:=31.5/36pt#; % breadth in middle of lowercase s
+flare#:=29.5/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=37.4/36pt#; % diameter of dots
+cap_hair#:=12.5/36pt#; % uppercase hairline breadth
+cap_stem#:=39.2/36pt#; % uppercase stem breadth
+cap_curve#:=45.2/36pt#; % uppercase curve breadth
+cap_ess#:=42.9/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.5pt#; % * thickness of lines in math symbols
+
+dish#:=0/36pt#; % amount erased at top or bottom of serifs
+bracket#:=34/36pt#; % vertical distance from serif base to tangent
+jut#:=26.2/36pt#; % protrusion of lowercase serifs
+cap_jut#:=34.6/36pt#; % protrusion of uppercase serifs
+beak_jut#:=2.4/36pt#; % horizontal protrusion of beak serifs
+beak#:=41.3/36pt#; % vertical protrusion of beak serifs
+vair#:=12.5/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % * maximum breadth above or below notches
+bar#:=11/36pt#; % * lowercase bar thickness
+slab#:=6.4/36pt#; % serif and arm thickness
+cap_bar#:=14/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % * uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % * max breadth above/below uppercase notches
+serif_drop#:=21.6/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % * for small refinements of stem breadth
+vair_corr#:=1/36pt#; % * for small refinements of hairline height
+apex_corr#:=0pt#; % * extra width at diagonal junctions
+
+o#:=10.5/36pt#; % amount of overshoot for curves
+apex_o#:=5.1/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=.286; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
diff --git a/fonts/utilities/mathkit/dos/zsty.mk b/fonts/utilities/mathkit/dos/zsty.mk
new file mode 100644
index 0000000000..659a48a464
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/zsty.mk
@@ -0,0 +1,75 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file zsty.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesPackage{z<mock><fam>}
+
+\renewcommand{\rmdefault}{<famx>}
+\renewcommand{\encodingdefault}{OT1}
+\renewcommand{\bfdefault}{<nfssb>}
+
+\DeclareFontFamily{OMX}{<mock><fam>}{}
+ \DeclareFontShape{OMX}{<mock><fam>}{m}{n}{<-> <mock>ex10}{}
+\DeclareFontFamily{OMS}{<mock><fam>}{\skewchar\font=48}
+ \DeclareFontShape{OMS}{<mock><fam>}{m}{n}{
+ <12> <mock>sy10
+ <10> <mock>sy10
+ <9> <mock>sy9
+ <8> <mock>sy8
+ <7> <mock>sy7
+ <6> <mock>sy6
+ <5> <mock>sy5
+ }{}
+
+\SetSymbolFont{operators}{normal}{OT1}{<mock><fam>}{m}{n}
+\SetSymbolFont{letters}{normal}{OML}{<mock><fam>}{m}{it}
+\SetSymbolFont{symbols}{normal}{OMS}{<mock><fam>}{m}{n}
+\SetSymbolFont{largesymbols}{normal}{OMX}{<mock><fam>}{m}{n}
+
+\SetMathAlphabet{\mathit}{normal}{OT1}{\rmdefault}{m}{it}
+\SetMathAlphabet{\mathbf}{normal}{OT1}{<mock><fam>}{\bfdefault}{n}
+
+
+%% Math Calligraphic.
+\DeclareFontFamily{OT1}{cal}{}
+\DeclareFontShape{OT1}{cal}{m}{it}{<-> <mock>sy10}{}
+\newcommand{\caldefault}{cal}
+\SetMathAlphabet{\mathcal}{normal}{OT1}{\caldefault}{m}{it}
+
+[fr]%% Math Fraktur.
+[fr]\DeclareFontFamily{OT1}{frak}{}
+[fr]\DeclareFontShape{OT1}{frak}{m}{n}{<-> [<frsf>] eufm10}{}
+[fr]\newcommand{\frakdefault}{frak}
+[fr]\DeclareMathAlphabet{\mathfr}{OT1}{\frakdefault}{m}{n}
+
+[bb]%% Math Blackboard Bold.
+[bb]\DeclareFontFamily{OT1}{bbold}{}
+[bb]\DeclareFontShape{OT1}{bbold}{m}{n}{<-> <mock>bb10}{}
+[bb]\newcommand{\bbdefault}{bbold}
+[bb]\DeclareMathAlphabet{\mathbb}{OT1}{\bbdefault}{m}{n}
+
+[b]\DeclareMathVersion{boldmath}
+[b] \DeclareFontShape{OMX}{<mock><fam>}{<bseries>}{n}{<-> <mock>bex10}{}
+[b] \DeclareFontShape{OMS}{<mock><fam>}{<bseries>}{n}{
+[b] <12> <mock>bsy12
+[b] <10> <mock>bsy10
+[b] <9> <mock>bsy9
+[b] <8> <mock>bsy8
+[b] <7> <mock>bsy7
+[b] <6> <mock>bsy6
+[b] <5> <mock>bsy5
+[b] }{}
+[b]
+[b]\SetSymbolFont{operators}{boldmath}{OT1}{<mock><fam>}{<bseries>}{n}
+[b]\SetSymbolFont{letters}{boldmath}{OML}{<mock><fam>}{<bseries>}{it}
+[b]\SetSymbolFont{symbols}{boldmath}{OMS}{<mock><fam>}{<bseries>}{n}
+[b]\SetSymbolFont{largesymbols}{boldmath}{OMX}{<mock><fam>}{<bseries>}{n}
+[b]\SetMathAlphabet{\mathcal}{boldmath}{OMS}{<mock><fam>}{<bseries>}{n}
+[b]
+[b]\newenvironment{boldface}{\bgroup\mathversion{boldmath}%
+[b] \def\it{\fontseries{<bseries>}\fontshape{it}\selectfont}%
+[b] \fontseries{<bseries>}\selectfont }{\egroup}
diff --git a/fonts/utilities/mathkit/dos/ztex.mk b/fonts/utilities/mathkit/dos/ztex.mk
new file mode 100644
index 0000000000..03b6fcb8d1
--- /dev/null
+++ b/fonts/utilities/mathkit/dos/ztex.mk
@@ -0,0 +1,115 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ztex.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is a template file for use with MathKit to create
+%% a plain TeX style file.
+
+\input pdcfsel % get Damian Cugley's macros
+\newfam\bifam
+
+\font\tenex=<mock>ex10 at 10.0 pt
+[b]\font\tenbex=<mock>bex10 % bold extension
+\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+
+\def\texttemplate{%
+ \@\f{textrm}{<fam>r<m><enc>t}%
+ \@\M{rm}{<fam>r<m><enc>t}\@\M{mi}{<fam>r<m>7m}%
+ \@\M{sy}{<mock>sy10}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\def\scripttemplate{%
+ \@\M{rm}{<fam>r<m><enc>t7}\@\M{mi}{<fam>r<m>7m7}%
+ \@\M{sy}{<mock>sy7}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\def\sscripttemplate{%
+ \@\M{rm}{<fam>r<m><enc>t5}\@\M{mi}{<fam>r<m>7m5}%
+ \@\M{sy}{<mock>sy5}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\xfontset{scriptscript}\sscripttemplate{5}
+\xfontset{script}\scripttemplate{7}
+
+[sa]\def\sanstemplate{%
+[sa] \@\m{rm}{<ssr>}\@\f{it}{<ssri>}%
+[sa] \@\f{bf}{<ssb>}\@\f{bi}{<ssbi>}%
+[sa]}
+[sa]\fontset{sans}\sanstemplate{<sasize>}{12pt}{}{}
+[sa]\newfam\sffam
+[sa]\def\sf{\fam\sffam\sansrm}\textfont\sffam=\sansrm % for math
+
+[tt]\def\tttemplate{%
+[tt] \@\f{rm}{cmtt10}%
+[tt]}
+[tt]\fontset{tt}\tttemplate{<ttsize>}{12pt}{}{}
+[tt]\def\tt{\fam\ttfam\ttrm}\textfont\ttfam = \ttrm % for math
+
+\def\caltemplate{
+ \@\f{rm}{<cal>}%
+}
+\fontset{cal}\caltemplate{<casize>}{12pt}{}{}
+\newfam\calfam
+\def\cal{\fam\calfam\calrm}\textfont\calfam = \calrm % for math
+
+[fr]\def\fraktemplate{
+[fr] \@\f{rm}{eufm10}%
+[fr]}
+[fr]\fontset{frak}\fraktemplate{<frsize>}{12pt}{}{}
+[fr]\newfam\frakfam
+[fr]\def\frak{\fam\frakfam\frakrm}\textfont\frakfam = \frakrm % for math
+
+[bb]\def\bbtemplate{
+[bb] \@\f{rm}{<mock>bb10}%
+[bb]}
+[bb]\fontset{bb}\bbtemplate{10}{12pt}{}{}
+[bb]\newfam\bbfam
+[bb]\def\bb{\fam\bbfam\bbrm}\textfont\bbfam = \bbrm % for math
+
+[b]\def\boldface{
+[b] \def\bftexttemplate{%
+[b] \@\f{textrm}{<fam><b><m><enc>t}%
+[b] \@\M{rm}{<fam><b><m><enc>t}\@\M{mi}{<fam><b><m>7m}%
+[b] \@\M{sy}{<mock>bsy10}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \def\bfscripttemplate{%
+[b] \@\M{rm}{<fam><b><m><enc>t7}\@\M{mi}{<fam><b><m>7m7}%
+[b] \@\M{sy}{<mock>bsy7}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \def\bfsscripttemplate{%
+[b] \@\M{rm}{<fam><b><m><enc>t5}\@\M{mi}{<fam><b><m>7m5}%
+[b] \@\M{sy}{<mock>bsy5}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \xfontset{bfscriptscript}\bfsscripttemplate{5}
+[b] \xfontset{bfscript}\bfscripttemplate{7}
+[b] \fontset{bfbody}\bftexttemplate{10}{12pt}{bfscript}{bfscriptscript}
+[b] \skewchar\bfbodymi=127 \skewchar\bfscriptmi=127
+[b] \skewchar\bfscriptscriptmi=127 \skewchar\bfbodysy=48
+[b] \skewchar\bfscriptsy=48 \skewchar\bfscriptscriptsy=48
+[b] \textfont3=\tenbex \scriptfont3=\tenbex \scriptscriptfont3=\tenbex
+[b] \def\caltemplate{
+[b] \@\f{bf}{<calb>}%
+[b] }
+[b] \fontset{cal}\caltemplate{<casize>}{12pt}{}{}
+[b] \def\cal{\fam\calfam\calbf}\textfont\calfam = \calbf % for math
+[b] \bfbodyfonts
+[b] \let\tenrm=\textrm \textrm
+[b]}
+
+\fontset{body}\texttemplate{10}{12pt}{script}{scriptscript}
+\skewchar\bodymi=127 \skewchar\scriptmi=127 \skewchar\scriptscriptmi=127
+\skewchar\bodysy=48 \skewchar\scriptsy=48 \skewchar\scriptscriptsy=48
+
+\bodyfonts
+\let\tenrm=\textrm \textrm
+
diff --git a/fonts/utilities/mathkit/dotlessj.mtx b/fonts/utilities/mathkit/dotlessj.mtx
new file mode 100644
index 0000000000..2617137e93
--- /dev/null
+++ b/fonts/utilities/mathkit/dotlessj.mtx
@@ -0,0 +1,43 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file dotlessj.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This fontinst file sets a dotless j glyph for a TeX
+math italic font. The following code is due to Thierry Bouche,
+a paper of whose on virtual math fonts can be found at
+ftp://fourier.ujf-grenoble.fr/pub/contrib-tex/gut/mathfonts-pk.ps.gz
+
+(Alan Hoenig made a few very minor changes only.)
+
+\metrics
+
+\resetglyph{dotlessj}
+\glyphspecial{ps: gsave gsave}
+ \push
+ \moveup{\neg{\depth{j}}}
+ \movert{\neg{\width{j}}}
+ \glyphspecial{ps: currentpoint /JDepth exch def /JLeft exch def}
+ \moveup{\add{\depth{j}}{\height{dotlessi}}}
+ %\movert{\mul{\width{j}}{2}}
+ \movert{\scale{\width{j}}{2500}} %% AH
+ \glyphspecial{ps: currentpoint /IHeight exch def /JRight exch def grestore}
+ \glyphspecial{ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto
+ 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0
+ rlineto 0 JDepth neg IHeight add neg rlineto closepath clip}
+ \pop
+ \glyph{j}{1000}
+ \glyphspecial{ps: grestore}
+ \resetdepth{\depth{j}}
+ \resetwidth{\width{j}}
+ \resetitalic{\italic{j}}
+ \resetheight{\height{dotlessi}} %% AH
+\endresetglyph
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/greekoff.mtx b/fonts/utilities/mathkit/greekoff.mtx
new file mode 100644
index 0000000000..55d3b99e3b
--- /dev/null
+++ b/fonts/utilities/mathkit/greekoff.mtx
@@ -0,0 +1,45 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file greekoff.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+\metrics
+
+\setcommand\Unsetglyph#1{\ifisglyph{#1}\then
+ \unsetglyph{#1}\fi
+}
+
+\Unsetglyph{Gamma}
+\Unsetglyph{Delta}
+\Unsetglyph{Theta}
+\Unsetglyph{Lambda}
+\Unsetglyph{Xi}
+\Unsetglyph{Pi}
+\Unsetglyph{Sigma}
+\Unsetglyph{Upsilon}
+\Unsetglyph{Upsilon1}
+\Unsetglyph{Phi}
+\Unsetglyph{Psi}
+\Unsetglyph{Omega}
+
+%% We'll also unset other Adobe glyphs that are found in a CMR or CMBX font.
+
+\Unsetglyph{backslash}
+\Unsetglyph{braceleft}
+\Unsetglyph{braceright}
+\Unsetglyph{bracketleft}
+\Unsetglyph{bracketright}
+\Unsetglyph{equal}
+\Unsetglyph{greater}
+\Unsetglyph{less}
+\Unsetglyph{plusminus}
+\Unsetglyph{plus}
+\Unsetglyph{slash}
+
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/ihax.mtx b/fonts/utilities/mathkit/ihax.mtx
new file mode 100644
index 0000000000..7f8ac24678
--- /dev/null
+++ b/fonts/utilities/mathkit/ihax.mtx
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ihax.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+\metrics
+
+\needsfontinstversion{1.315}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount to move in subscripts (should be -ve)
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \unfakable produces a missing glyph warning.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \glyphrule{500}{500}
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Zero the depth of a glyph.
+
+\setcommand\zerodepth#1{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+ \fi
+}
+
+% Values produced by trial and error...
+
+% \shiftglyph{C}{-50}{0}{-25}
+% \shiftglyph{E}{0}{50}{0}
+% \shiftglyph{F}{0}{50}{-100}
+% \shiftglyph{H}{0}{25}{-25}
+% \shiftglyph{I}{0}{0}{-25}
+% \shiftglyph{K}{0}{0}{-25}
+% \shiftglyph{J}{0}{0}{-25}
+% \shiftglyph{N}{0}{0}{-25}
+% \shiftglyph{P}{0}{0}{-100}
+% \shiftglyph{T}{0}{50}{-75}
+% \shiftglyph{U}{-50}{50}{-25}
+% \shiftglyph{V}{-50}{50}{-50}
+% \shiftglyph{W}{-50}{50}{-50}
+% \shiftglyph{X}{0}{50}{-25}
+% \shiftglyph{Y}{-50}{50}{-50}
+% \shiftglyph{b}{0}{-25}{0}
+% \shiftglyph{d}{0}{25}{0}
+% \shiftglyph{f}{\scale{\depth{f}}{750}}{0}{25}
+% \shiftglyph{g}{0}{-50}{0}
+% \shiftglyph{j}{150}{25}{0}
+% \shiftglyph{l}{0}{50}{0}
+% \shiftglyph{o}{0}{-50}{0}
+% \shiftglyph{p}{75}{-25}{0}
+% \shiftglyph{t}{-25}{50}{0}
+% \shiftglyph{Upsilon}{0}{0}{-50}
+% \shiftglyph{Upsilon}{0}{0}{-100}
+% \shiftglyph{weierstrass}{-100}{-200}{-150}
+%
+% \unfakable{rho1}
+%
+% \ifisglyph{omega1}\then
+% \setglyph{pi1}
+% \glyph{omega1}{1000}
+% \endsetglyph
+% \fi
+%
+% \ifisglyph{epsilon}\then
+% \setglyph{epsilon1}
+% \glyph{epsilon}{1000}
+% \endsetglyph
+% \fi
+
+% \resetglyph{vector}
+% \movert{-100}
+% \glyph{vector}{1000}
+% \movert{100}
+% \endresetglyph
+
+% Accents have to have zero depth.
+
+% \zerodepth{acute}
+% \zerodepth{grave}
+% \zerodepth{caron}
+% \zerodepth{breve}
+% \zerodepth{macron}
+% \zerodepth{ring}
+% \zerodepth{circumflex}
+% \zerodepth{dotaccent}
+% \zerodepth{tilde}
+% \zerodepth{dieresis}
+%
+% \ifisglyph{tie}\then
+% \resetglyph{tie}
+% \push
+% \movert{\div{\width{tie}}{2}}
+% \glyph{tie}{1000}
+% \pop
+% \samesize{tie}
+% \endresetglyph
+% \fi
+% \ifisglyph{vector}\then
+% \resetglyph{vector}
+% \moveup{1}
+% \glyph{vector}{1000}
+% \moveup{-1}
+% \endresetglyph
+% \fi
+
+\endmetrics
+
diff --git a/fonts/utilities/mathkit/iskew.mtx b/fonts/utilities/mathkit/iskew.mtx
new file mode 100644
index 0000000000..2094b441ea
--- /dev/null
+++ b/fonts/utilities/mathkit/iskew.mtx
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file iskew.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+These hacks help adjust the positionin of accents on italic characters.
+
+\metrics
+
+% \skewkern sets a skewchar kern, assuming that tie is the skewchar.
+\setcommand\skewkern#1#2{\setkern{#1}{tie}{#2}}
+
+% \skewkern{A}{75}
+% \skewkern{B}{100}
+% \skewkern{C}{100}
+% \skewkern{D}{50}
+% \skewkern{E}{75}
+% \skewkern{F}{75}
+% \skewkern{G}{100}
+% \skewkern{H}{50}
+% \skewkern{I}{100}
+% \skewkern{J}{200}
+% \skewkern{K}{75}
+% \skewkern{M}{100}
+% \skewkern{N}{25}
+% \skewkern{O}{100}
+% \skewkern{P}{100}
+% \skewkern{Q}{100}
+% \skewkern{R}{100}
+% \skewkern{S}{100}
+% \skewkern{T}{50}
+% \skewkern{U}{50}
+% \skewkern{X}{50}
+% \skewkern{Z}{50}
+% \skewkern{a}{75}
+% \skewkern{c}{75}
+% \skewkern{d}{200}
+% \skewkern{e}{75}
+% \skewkern{f}{190}
+% \skewkern{g}{75}
+% \skewkern{i}{75}
+% \skewkern{j}{150}
+% \skewkern{l}{100}
+% \skewkern{m}{50}
+% \skewkern{n}{50}
+% \skewkern{o}{75}
+% \skewkern{p}{100}
+% \skewkern{q}{75}
+% \skewkern{r}{50}
+% \skewkern{s}{100}
+% \skewkern{t}{50}
+% \skewkern{u}{75}
+% \skewkern{v}{75}
+% \skewkern{w}{75}
+% \skewkern{x}{75}
+% \skewkern{y}{75}
+% \skewkern{z}{50}
+% \skewkern{dotlessi}{50}
+% \skewkern{dotlessj}{50}
+% \skewkern{upsilon}{25}
+% \skewkern{iota}{-50}
+% \skewkern{lambda}{-75}
+% \skewkern{weierstrass}{175}
+% \skewkern{lscript}{125}
+
+\endmetrics
diff --git a/fonts/utilities/mathkit/makevp.mk b/fonts/utilities/mathkit/makevp.mk
new file mode 100644
index 0000000000..9780ef0c2b
--- /dev/null
+++ b/fonts/utilities/mathkit/makevp.mk
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file makevp.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% This template file for MathKit helps make the fontinst installation
+%%% script for creating virtual fonts.
+
+\input fontinst.sty
+
+%% AFMs we need...
+
+%% ROMAN: <fam>r8a <fam>r8x <fam>ri8a <fam>ri8x
+[b]%% BOLD: <fam>b8a <fam>b8x <fam>bi8a <fam>bi8x
+
+%% THE FONTINST COMMANDS FOLLOW...
+
+\transformfont{<fam>r8r}{\reencodefont{8r}{\fromafm{<fam>r8a}}}
+\transformfont{<fam>ri8r}{\reencodefont{8r}{\fromafm{<fam>ri8a}}}
+[b]\transformfont{<fam><b>8r}{\reencodefont{8r}{\fromafm{<fam><b>8a}}}
+[b]\transformfont{<fam><b>i8r}{\reencodefont{8r}{\fromafm{<fam><b>i8a}}}
+
+\installfonts
+ \installfamily{<encoding>}{<mock><fam>}{}
+ \installfamily{OML}{<mock><fam>}{\skewchar\font=127}
+%% Math Roman...
+ \installfont{<fam>r<m><enc>tc}{<fam>r<enct>,dotlessj,greekoff,<mock>r12,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<12>}
+ \installfont{<fam>r<m><enc>t}{<fam>r<enct>,dotlessj,greekoff,<mock>r10,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<10>}
+ \installfont{<fam>r<m><enc>t9}{<fam>r<enct>,dotlessj,greekoff,<mock>r9,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<9>}
+ \installfont{<fam>r<m><enc>t7}{<fam>r<enct>,dotlessj,greekoff,<mock>r7,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<7>}
+ \installfont{<fam>r<m><enc>t5}{<fam>r<enct>,dotlessj,greekoff,<mock>r5,<hax>rrx}%
+ {<encoding>}{<encoding>}{<mock><fam>}{m}{n}{<5>}
+%% Math Italic...
+ \installfont{<fam>r<m>7mc}{<hax>riw,<mock>mi12,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<12>}
+ \installfont{<fam>r<m>7m}{<hax>riw,<mock>mi10,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<10>}
+ \installfont{<fam>r<m>7m9}{<hax>riw,<mock>mi9,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<9>}
+ \installfont{<fam>r<m>7m7}{<hax>riw,<mock>mi7,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<7>}
+ \installfont{<fam>r<m>7m5}{<hax>riw,<mock>mi5,alphoff,<fam>ri<enct>,dotlessj,<hax>rix}%
+ {OML}{OML}{<mock><fam>}{m}{it}{<5>}
+[b]%% Math Roman Bold...
+[b] \installfont{<fam><b><m><enc>tc}{<fam><b><enct>,dotlessj,greekoff,<mock>bx12,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<12>}
+[b] \installfont{<fam><b><m><enc>t}{<fam><b><enct>,dotlessj,greekoff,<mock>bx10,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<10>}
+[b] \installfont{<fam><b><m><enc>t7}{<fam><b><enct>,dotlessj,greekoff,<mock>bx7,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<7>}
+[b] \installfont{<fam><b><m><enc>t5}{<fam><b><enct>,dotlessj,greekoff,<mock>bx5,<hax>brx}%
+[b] {<encoding>}{<encoding>}{<mock><fam>}{<bseries>}{n}{<5>}
+[b]%% Math Bold Italic...
+[b] \installfont{<fam><b><m>7mc}{<hax>biw,<mock>mib12,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<12>}
+[b] \installfont{<fam><b><m>7m}{<hax>biw,<mock>mib10,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<10>}
+[b] \installfont{<fam><b><m>7m7}{<hax>biw,<mock>mib7,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<7>}
+[b] \installfont{<fam><b><m>7m5}{<hax>biw,<mock>mib5,alphoff,<fam><b>i<enct>,dotlessj,<hax>bix}%
+[b] {OML}{OML}{<mock><fam>}{<bseries>}{it}{<5>}
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/mathkit/mathkit b/fonts/utilities/mathkit/mathkit
new file mode 100644
index 0000000000..e9b63d27b7
--- /dev/null
+++ b/fonts/utilities/mathkit/mathkit
@@ -0,0 +1,1048 @@
+#!/usr/local/bin/perl
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "0.7",
+### date = "January 1998",
+### filename = "mathkit",
+### address = "Department of Mathematics
+### John Jay College
+### 445 West 59th Street
+### New York, NY 10019
+### USA",
+### telephone = "(516) 385-0736",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### supported = "yes",
+### abstract = "This script constructs the scripts for installing
+### math fonts combining outline letters and numerals
+### matching Metafont bitmaps for special symbols.",
+### package = "MathKit",
+### dependencies = "perl,"
+### }
+### ====================================================================
+
+## USAGE: perl mathkit <template> <font-fam> <encoding>
+## Examples of use (assumes presence of tm.mkr, tm.mkb):
+## perl ../mathkit tm mnt OT1
+## or simply (if the script is made executable)
+## ../mathkit tm mnt OT1;
+
+## Some system parameters...
+
+$version = "0.7";
+$noslant = 0;
+$slanted = 1;
+
+$true = 1;
+$false = 0;
+
+## Routines to make conversion between DOS and Unix simple..
+## $mv is the form of the `move' command.
+## $sep is the path separator for the system.
+## $q is the quote character to surround command line parameters and
+## prevent expansion by the operating system.
+## $comment is the string that begins a comment in a system file.
+
+sub UNIX{$mv="mv"; $sep="/"; $q="\'"; $comment="##";}
+sub DOS{$mv="domove"; $sep="\\"; $q=""; $comment="REM";}
+
+require("../mathkit.par"); # get parameters (system dependent)
+
+if (not $sans_font) {
+ $sans_font = "cmss";
+ $sans_supplier = "public";
+ $sans_typeface = "cm";
+ $sans_installer = "base";
+}
+
+$rm_tfm = $tfm; # where are roman tfm's?
+$cm_tfm = $tfm; # where are CM tfm's?
+$sf_tfm = $tfm; # where are sans serif tfm's?
+$plain_inputs = $inputs; # where do plain styles go?
+$rm_inputs = $inputs;
+
+$pkext = "pk"; $gfext = "gf"; # DOS defaults
+if ($sep ne "\\") {
+ $pkext = "${dpi}pk";
+ $gfext = "${dpi}gf";
+}
+
+if ($texmf) { # for TDS systems only...
+ $pk = "$texmf${sep}fonts${sep}pk${sep}$mode${sep}mathkit";
+ $pk = "$pk${sep}z$ARGV[0]$ARGV[1]${sep}dpi$dpi";
+ $vf = "$texmf${sep}fonts${sep}vf${sep}mathkit${sep}z$ARGV[0]$ARGV[1]";
+ $tfm = "$texmf${sep}fonts${sep}tfm${sep}mathkit${sep}z$ARGV[0]$ARGV[1]";
+ $mfinputs = "$texmf${sep}fonts${sep}source";
+ $rm_inputs = "$texmf${sep}tex${latex}${sep}$installer";
+ $inputs = "$texmf${sep}tex${sep}latex${sep}mathkit";
+ $plain_inputs = "$texmf${sep}tex${sep}plain${sep}mathkit";
+ $afm = "$texmf${sep}fonts${sep}afm${sep}$supplier$sep$typeface";
+ $rm_tfm = "$texmf${sep}fonts${sep}tfm${sep}$supplier$sep$typeface";
+ $cm_tfm = "$texmf${sep}fonts${sep}tfm${sep}public${sep}cm";
+ $sf_tfm =
+ "$texmf${sep}fonts${sep}tfm${sep}$sans_supplier$sep$sans_typeface";
+}
+
+open (MKDIR, ">mkdirs.bat");
+&banner("MKDIR", "mkdirs.bat");
+$mkdir = "mkdir"; # system dependent `mkdir' command
+sub check_dir{ # does a directory exist?
+ local($thisdir) = $_[0];
+ if (not -d $thisdir) {
+ push(@missingdirs, $thisdir);
+ }
+}
+
+sub check_dirs{ # does a list of directories exist?
+ foreach $dir (@_) {
+ &check_dir($dir);
+ }
+ foreach $miss (@missingdirs) {
+ $misss = "$miss$sep";
+ $Sep = "$sep";
+ $Sep = "\\\\" if $sep eq "\\"; # special case for DOS
+ while ($misss =~ m/$Sep/g) {
+ if (($know_about{$`} == $false) and (not -d $`)) {
+ print MKDIR "$mkdir $`\n" unless $` eq "";
+ $know_about{$`} = $true;
+ }
+ }
+ }
+ close MKDIR; undef %know_about;
+}
+&check_dirs(
+ $tfm,
+ $rm_tfm,
+ $cm_tfm,
+ $sf_tfm,
+ $afm,
+ $pk,
+ $vf,
+ $psfonts,
+ $mfinputs,
+ $inputs,
+ $plain_inputs,
+ $rm_inputs,
+ );
+
+## Some bookkeeping with respect to date and time...
+
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
+$thisday=(Sun,Mon,Tues,Wednes,Thurs,Fri,Satur)[$wday];
+$thisday="${thisday}day";
+$month=(January,February,March,April,May,June,July,August,
+ September,October,November,December)[$mon];
+$fullyear="19$year";
+if ($year<50) {$fullyear="20$year";}
+sub timestamp{
+ if ($min<10) {$min="0$min";}
+ $currtime="$hour:$min";
+ $currdate="$thisday, $month $mday, $fullyear";
+}
+&timestamp;
+
+## Some utility routines...
+
+sub display{ # prints its argument on screen
+ foreach $thingy (@_) {
+ print $thingy;
+ }
+}
+
+sub log{ # prints arguments in log file
+ foreach $thingy (@_) {
+ print LOG $thingy;
+ }
+}
+
+sub record{ # logs and prints arguments
+ foreach $thingy (@_) {
+ print $thingy;
+ print LOG $thingy;
+ }
+}
+
+$FH_ = "STDOUT"; # default value
+sub out{ # prints to a given file.
+ foreach $str (@_){
+ print $FH_ $str;
+ }
+}
+sub copy{
+ die "`copy' can't find file $_[0]" unless -e $_[0];
+ open(COPYIN, $_[0]); # the source
+ open(COPYOUT, ">$_[1]"); # the target
+ while (<COPYIN>) {print COPYOUT $_;}
+ close COPYOUT;
+}
+
+sub safecopy{# copy source to target ONLY if target doesn't exist either in
+ ## current dir or in parent dir
+ if ((not -e $_[1]) and (not -e "..$sep$_[1]")) { # target doesn't exist
+ &copy(@_);
+ } else {
+ &record("Copy operation skipped; file $_[1] already exists.\n");
+ }
+}
+
+## We need a routine to print a banner on files and scripts
+## that MathKit makes. Arguments are: filehandle, comment char,
+## file name. Usage: &printbanner("TEX", "%", "testmath.tex")
+
+sub printbanner{
+ local($fh_,$comment_,$filename)=($_[0],$_[1],$_[2]);
+ print $fh_ "$comment_ This is file $filename,";
+ print $fh_ " created by MathKit$version + Perl$].\n";
+ print $fh_ "$comment_ It was created at $currtime on $currdate.\n";
+ print $fh_ "$comment_ \n";
+ print $fh_ "$comment_ YOU MAY DELETE THIS FILE AFTER USE.\n";
+ print $fh_ "$comment_ \n";
+}
+
+sub banner{# prints banner in auxiliary files.
+ &printbanner($_[0], $comment, $_[1]);
+}
+
+## Get command line params...
+
+ $start_up =<<"EndStart";
+MathKit needs three arguments to work. Firstly, I need to know the name
+of the template I should use. At the moment, there are three templates
+to choose from:
+
+ 1. bv (Baskerville-like);
+ 2. tm (Times Roman-like); and
+ 3. pl (Palatino-like).
+
+I also need to know the name of the Roman font to use. This should be the
+three-character abbreviation under which this family was installed---some-
+thing like 'mbv' (Baskerville), 'pad' (Adobe Garamond), 'ppl' (Palatino),
+or 'ptm' (Times) is what I am looking for. Finally, I need an encoding
+scheme, either 'OT1' or 'ot1'. As a result, the command line to get me
+going should look something like this:
+
+ ../mathkit bv mbv OT1
+
+Please consider reading the file 'mathkit.tex' (a LaTeX file) for further
+important information. (These comments are stored in the file 'todo.1st'.)
+
+EndStart
+
+if ($#ARGV != 2) {
+ open (TODO, ">todo.1st");
+ print TODO $start_up;
+ print $start_up;
+ close TODO;
+ die "Fix me and start again.";
+}
+$tseries=$ARGV[0]; # the template series
+$tser=substr($tseries,0,1); # 1st char becomes $tseries abbreviation
+$fontfam=$ARGV[1]; # font family (using Berry name)
+open (LOG, ">z$tseries$fontfam.klg"); # open log file
+$encoding=$ARGV[2];# which encoding? (T1 or OT1 only)
+
+## Print banner, first off...
+
+&record("This is MathKit$version + Perl$] at $currtime on $currdate.\n\n");
+&record("We are using MathKit template $tseries.\n");
+&record("We are using font family $fontfam.\n");
+&record("The encoding is $encoding.\n");
+
+
+$enc = 8; # set the encoding `digit'
+$enc = 7 if $encoding =~ /o/i;
+
+## Checking and retrieving font template information...
+
+if (-e "..${sep}${tseries}.mkr") {# get template for Roman fonts
+ $template[0]="..${sep}${tseries}.mkr";
+} else {# template doesn't exist!
+ &record("Where's the template file $tseries? Dying...\n");
+ die "At least, I need to see $tseries.mkr in the parent directory.";
+}
+
+## We need only one bold template (if there is at least one). We try
+## bold first, but prefer the semibold...
+
+if (-e "..${sep}${tseries}.mkb") {# get bold template
+ $template[1]="..${sep}${tseries}.mkb";
+## $bld = "b";
+## $nfssbld = "b";
+}
+if (-e "..${sep}${tseries}.mks") {# get semibold template
+ $template[1]="..${sep}${tseries}.mks";
+## $bld = "s";
+## $nfssbld = "sb";
+}
+
+## We need to determine the proper boldweight to use...
+## The default:
+$bld = "b";
+$nfssbld = "b";
+## Now to test for the semibold (we prefer to use the semibold if the
+## Roman semibold fonts are present.)
+if (-e "$afm${sep}${fontfam}s8a.afm") {
+ $bld = "s";
+ $nfssbld = "sb";
+ &record("Text fonts: We are using semibold weights in this run.\n");
+} else {
+ &record("Text fonts: We are using bold weights in this run.\n");
+}
+
+## Now to check font info...
+
+$fullafm = "$afm${sep}${fontfam}r8a.afm";
+$expafm = "$afm${sep}${fontfam}r8x.afm";
+if (not -e $fullafm) {
+ &record("I'm missing font info in $fullafm. Help...\n");
+ die "I need font info to continue...";
+}
+$exp = 1 if -e $expafm; # Do real experts exist?
+
+## End of preliminary processing...
+
+## Subroutines follow...
+
+sub afm_metric_info{
+ local($target_char, $afm_file) = @_;
+ open (TMP, "$afm$sep$afm_file.afm") or
+ die "Can't find $afm$sep$afm_file.afm. Dying...";
+ local($h, $d) = (-999,999); # default values
+ while (<TMP>) {
+ chomp $_;
+ last if /EndCharMetrics/;
+ next unless /^C\s+\d+/;
+ /C\s+\d+\s+\; WX\s+\d+ \; N ([A-Za-z]+) \; B -?\d+ (-?\d+) \d+ (\d+) \;/;
+ if ($1 eq $target_char) {
+ $h = sprintf "%5.1f", 36*$3/100;
+ $d = sprintf "%5.1f", 36*$2/100;
+ $h =~ s/\.0$//; # strip off final `.0'
+ $d =~ s/\.0$//;
+ $h = "$h/36pt\#"; # add Metafont grammar
+ $d = "$d/36pt\#";
+ }
+ }
+ close TMP;
+ ($h, $d);
+}
+
+## The routine get_fontfam_parameters reads the afm file to get
+## values for seven properties of the font that enter into a
+## Metafont font description. (The only 2 we can't extract are
+## the bar height and math axis.) We only use this information, however,
+## if the parameter $should_try_to_match is set to a non-null, non-zero
+## value in the file `mathkit.par'.
+## The parameter for this routine is a the Berry weight---usually
+## `r', or `b', or `s'---of the scalable fonts we are matching.
+
+sub get_fontfam_parameters{
+ local($tmp);
+ local($afmfile) = "${fontfam}$_[0]8a";
+ ($body_height, $tmp) = &afm_metric_info("parenleft", $afmfile);
+ ($asc_height, $tmp) = &afm_metric_info("h", $afmfile);
+ ($cap_height, $tmp) = &afm_metric_info("B", $afmfile);
+ ($fig_height, $tmp) = &afm_metric_info("5", $afmfile);
+ ($x_height, $tmp) = &afm_metric_info("x", $afmfile);
+ ($tmp, $comma_depth) = &afm_metric_info(",", $afmfile);
+ ($tmp, $desc_depth) = &afm_metric_info("g", $afmfile);
+}
+
+sub adjust_font_parameters{
+ local(@tmp) = ("body_height", "asc_height", "cap_height", "fig_height",
+ "x_height", "comma_depth", "desc_depth");
+ local($temp);
+ foreach $strng (@tmp) {
+ $temp = "$str\#";
+ $param{$temp} = $$temp;
+ }
+}
+
+
+sub get_template_info{
+ open (IN, "$_[0]");
+ undef %param; # just in case
+ while ($_ = <IN>) {
+ if ($_ =~ /^([a-zA-Z_#]+):=([0-9a-z\/\.#]+);/) {
+ $param{$1} = "$2"; #
+
+ }
+ }
+ close IN;
+}
+
+## Some comments about the special fonts (cal, tt, frak, bb, sans serif):
+## Calligraphic is easiest---we pluck them from the cmsy font, and they
+## already have been properly scaled. Typewriter tt fonts come from
+## cmtt10 which we assume to exist in a scalable version.
+## Fraktur comes from the scalable version of eufm10 (BaKoMa font).
+## Blackboard bold will be generated only if the mf source exists;
+## bb comes from Alan Jeffrey's bbold10 font.
+##
+## Sans serif fonts are a very special case, as they are almost always
+## part of a family of sans serif fonts. MathKit examines the $ss_font
+## variable in the .par file. If it doesn't exist, no sans serif is taken.
+
+$cm_x_height = "155/36pt\#";
+$cm_xht_num = "155";
+$cmss_x_height = "160/36pt\#";
+$cmss_xht_num = "160";
+$frak_x_height = "169.6/36pt\#";
+$frak_xht_num = "169.6";
+ $newbbold =<<"endnewbbold";
+\% Font ${tseries}bb10 is modified Blackboard bold 10pt.
+mode_setup;
+input bbbase;
+% Hacks to make sure cmr doesn't generate the font, and doesn't load cmbase.
+cmbase := 1;
+def generate suffix t = enddef;
+% Input the cmr parameters.
+input ${tseries}r10;
+font_identifier := "${tseries}-BBOLD";
+font_coding_scheme := "Blackboard bold";
+% Then generate blackboard bold.
+input bbold;
+bye;
+endnewbbold
+
+sub get_font_fam{
+ local($fontfam, $fontenc) = ("cmss", "7t"); # default
+ local($font) = $_[0];
+ if (not $font =~ /^cmss/) {
+ $fontfam = substr $font, 0, 3;
+ $fontenc = substr $font, 4, 99;
+ }
+ ($fontfam, $fontenc);
+}
+
+## First, define some fudge factors for better visual compatibility
+## during the scaling process...
+$fudge_frak = 1.03;
+$fudge_tt = 1.0;
+$fudge_bb = 1.0;
+$fudge_sans = 1.03;
+
+sub do_special_fonts{
+ ($xht_num, $tmp) = split /\//, $x_height;
+ # Nothing special for calligraphic...
+ # Now for tt...
+ $ttplace = $psfonts; # traditional
+ $ttplace = "$texmf$sep$fonts${sep}type1${sep}public${sep}cm"
+ if $texmf; # TDS
+ $ttfont = "$ttplace${sep}cmtt10";
+ if ((-e "$ttfont.pfb") or (-e "$ttfont.pfa")) {
+ $tt = $true;
+ $tt_sf = $xht_num / $cm_xht_num;
+ $tt_sf *= $fudge_tt;
+ $tt_sf = sprintf "%4.2f", $tt_sf;
+ $ttsize = 10*$tt_sf;
+ $ttsize = sprintf "%4.1f", $ttsize;
+ $replace{"<ttsize>"} = $ttsize;
+ &record("Source file $ttfont found:\n ",
+ "scaling cmtt10 by a factor of $tt_sf.\n");
+ } else {
+ &record("No tt font source found; no tt font will be provided.\n");
+ }
+ # Now for fraktur...
+ $frakplace = $psfonts; # traditional
+ $frakplace = "$texmf$sep$fonts${sep}type1${sep}ams${sep}euler"
+ if $texmf; # TDS
+ $frakfont = "$frakplace${sep}eufm10";
+ if ((-e "$frakfont.pfb") or (-e "$frakfont.pfa")) {
+ $fr = $true;
+ $frak_sf = $xht_num / $frak_xht_num;
+ $frak_sf *= $fudge_frak;
+ $frak_sf = sprintf "%4.2f", $frak_sf;
+ $frsize = 10*$frak_sf;
+ $frsize = sprintf "%4.1f", $frsize;
+ $replace{"<frsize>"} = $frsize;
+ $replace{"<frsf>"} = $frak_sf;
+ &record("Source file $frakfont found:\n ",
+ "scaling eufm10 by a factor of $frak_sf.\n");
+ } else {
+ &record("No fraktur font found; and none will be provided.\n");
+ }
+ # Now for blackboard bold...
+ $bbplace = $mfinputs; # traditional
+ $bbplace = "$texmf$sep$fonts${sep}source${sep}public${sep}bbold"
+ if $texmf; # TDS
+ $bbsource = "$bbplace${sep}bbold10.mf";
+ if (-e $bbsource) {
+ $bb = $true;
+ $bb_sf = $tt_sf;
+ $bb_sf *= $fudge_bb;
+ $bb_sf = sprintf "%4.2f", $bb_sf;
+ &record("Source file $bbsource found:\n ",
+ "scaling bbold10 by a factor of $bb_sf.\n");
+ open (OUT, ">${tseries}bb10.mf");
+ &printbanner("OUT", "%", "${tseries}bb10.mf");
+ print OUT $newbbold;
+ close OUT;
+ print MF "$mf ${q}\\mode=$mode; scrollmode; input ${tseries}bb10$q\n";
+ print GFTOPK "gftopk ${tseries}bb10.$gfext ${tseries}bb10.$pkext\n";
+ } else {
+ &record("No bbold font found; and none will be provided.\n");
+ }
+ # Now for sans serif fonts...
+ if ($sans_font) {
+ $sa = $true;
+ ($sansfam, $sansencoding) = &get_font_fam($sans_font);
+ if ($sansfam eq "cmss") {
+ $sans_sf = $xht_num / $cmss_xht_num;
+ $sans_sf = sprintf "%4.2f", $sans_sf;
+ &record("CMSS sans serif scaled by $sans_sf will be used.\n");
+ } else { # compute sf for non-cm sans serif
+ $replace{"<ssr>"} = $sans_font;
+ $replace{"<ssri>"} = "${sansfam}ri$sansencoding";
+ $sansbold = "b";
+ $sansbold = "s" if -e "$sf_tfm$sep${sansfam}s$sansencoding.tfm";
+ $replace{"<ssb>"} = "$sansfam${sansbold}$sansencoding";
+ $replace{"<ssbi>"} = "$sansfam${sansbold}i$sansencoding";
+ ($sans_x_height, $tmp) = &afm_metric_info("x", "${sansfam}r8a");
+ ($sans_xht_num, $tmp) = split /\//, $sans_x_height;
+ $sans_sf = $xht_num / $sans_xht_num;
+ $sans_sf *= $fudge_sans;
+ $sans_sf = sprintf "%4.2f", $sans_sf;
+ $sasize = 10*$sans_sf;
+ $sasize = sprintf "%4.1f", $sasize;
+ $replace{"<sasize>"} = $sasize;
+ &record("Sans serif family $sansfam (contining font $sans_font) ",
+ "scaled by $sans_sf will be used.\n");
+ }
+ } else {
+ &record("No sans serif font found; and none will be provided.\n");
+ }
+}
+
+## Making Metafont source files...
+
+## When we make Metafont source files, the easiest case occurs
+## when there is a comparable cm file we can copy. For example,
+## in a times-like (tm) setting, we create tmmi7.mf by copying cmmi7.mf
+## and simply making suitable changes to the Metafont parameters.
+## In this case the Perl subroutine `makemffiles' calls upon the
+## routine `normalcopy' to perform this creation.
+
+sub normalcopy{
+ local($sf, $source) = @_;
+ open (IN, "$source") || die "Where is $source?";
+ while ($_=<IN>) {# read and digest template values
+ last if /font_size/; # discard 1st few lines
+ }
+ print OUT "SF_=$sf; % scale factor\n";
+ while ($_=<IN>) {# read rest of .mf file
+ if ( /^([a-zA-Z_#]+):=([0-9\.\/a-z#]+);/ ) {
+ $curparam=$1; $oldvalue=$2; # save these!
+ if (defined $param{$curparam}) {
+ $newvalue=$param{$curparam};
+ $newvalue="SF_*$newvalue" if /pt#/;
+ s/$oldvalue/$newvalue/;
+ }
+ }
+ if ($slantind==$noslant) {
+ if (/^slant:=([\.0-9]+);/) {# zero slant in roman files
+ s/$1/0/;
+ }
+ }
+ if (/generate/) { # have we reached the `generate' statement?
+ s/generate\s+/generate mk/;
+ }
+ print OUT $_;
+ }
+}
+
+## In case the source file (eg cmsy12.mf or cmmib7.mf) does NOT exist,
+## some handwaving is necessary. We'll read from the corresponding roman
+## file (eg cmr12 or cmbx7) which HAD better exist up through the
+## `generate' command, but then finish off with the corresponding
+## roman file. Thus, to create tmbsy7.mf, we will read cmbx7 up through
+## the `generate' command towards the end of that file, and then pick
+## up cmsy7.mf, using only the material following the `math_fitting'
+## parameter (this is the last parameter in the standard .mf files).
+## Final concern: the sy fonts need the parameter `rth#' defined as
+## either .4pt# or .6pt# (roman or bold), so we have to take
+## care to create this variable if need be.
+
+sub fudgecopy{
+ local($sf, $source) = @_;
+ ## redefine the source...
+ if ($doingbold == $true) {
+ $source="$mfinputs${sep}cmbx$size.mf";
+ } else {
+ $source="$mfinputs${sep}cmr$size.mf";
+ }
+ $nextsize=$size;
+ $nextsize=10 if $size>10; # unfortunate default
+ $nextmid=$midfix;
+ $nextmid =~ s/b//;
+ $nextsource="$mfinputs${sep}cm$nextmid$nextsize.mf";
+ open (IN, "$source") || die "Where is $source?";
+ while ($_=<IN>) {# read and digest template values
+ last if /font_size/; # discard 1st few lines
+ }
+ print OUT "SF_=$sf; % scale factor\n";
+ while ($_=<IN>) {# read rest of .mf file until `generate'
+ if ( /^([a-zA-Z_#]+):=([0-9\.\/a-z#]+);/ ) {
+ last if /^generate/;
+ $curparam=$1; $oldvalue=$2; # save these!
+ if (defined $param{$curparam}) {
+ $newvalue=$param{$curparam};
+ $newvalue="SF_*$newvalue" if /pt#/;
+ s/$oldvalue/$newvalue/;
+ }
+ }
+ if ($slantind==$noslant) {
+ if (/^slant:=([\.0-9]+);/) {# zero slant in roman files
+ s/$1/0/;
+ }
+ }
+ print OUT $_ unless /^generate/;
+ }
+ close IN;
+ open (IN, $nextsource) ||
+ die "Where is $nextsource?";
+ while (<IN>) {last if /^math_fitting/;} # discard front of file
+ $myrth=".4pt#";
+ if ($doingbold==$true) {$myrth=".6pt#";}
+ print OUT "\nrth#:=$myrth; % assume rules come from extension font\n";
+ while (<IN>) {
+ next if /^rth#/; # we generated this line already
+ s/rule_thickness#/rth#/g; # ensure references are to rth#
+ s/generate\s+/generate mk/;
+ print OUT $_;
+ }
+}
+
+## The actual mf files are created by the following routine.
+
+sub mf_file_header{
+ local($target, $midfix, $size) = @_;
+ print OUT "%% $tseries-like font, file $target $size point\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ print OUT "if unknown cmbase: input cmbase fi\n\n";
+ $fontid="$tseries$midfix";
+ $fontid =~ tr/a-z/A-Z/; # make everything uppercase
+ print OUT "font_identifier:=\"$fontid\"; font_size ${size}pt#;\n\n";
+}
+
+## &makemffiles(src prefix, target midfix, slant ind, list of sizes);
+sub makemffiles{# create and process Roman fonts
+ local($prefix,$midfix,$slantind)=($_[0],$_[1],$_[2]);
+ local(*sizes)=$_[3];
+ foreach $size (@sizes) {
+ $source="$mfinputs${sep}${prefix}${midfix}${size}.mf";
+ $targetfirst="${tseries}${midfix}${size}";
+ $target="$targetfirst.mf";
+ $tfmsource="$cm_tfm$sep${prefix}${midfix}${size}.tfm";
+ ## All gf and pk files will have been created, and we need pl files.
+ print PL "echo $targetfirst\n"; # system dependent
+ print PL "tftopl $targetfirst.tfm $targetfirst.pl\n";
+ print MF "$mf ${q}&cm \\mode=$mode; scrollmode; input $targetfirst$q\n";
+ print GFTOPK "gftopk $targetfirst.$gfext $targetfirst.$pkext\n";
+ open (OUT, ">$target") || die "Cannot open $target. Help!";
+ $sf=$size/10;
+ &mf_file_header($target, $midfix, $size);
+ if (-e $source) {
+ &normalcopy($sf, $source); # source exists--o joy, o rapture!
+ } else {
+ &fudgecopy($sf, $source); # no source---finagling follows
+ }
+ close IN; close OUT;
+ }
+}
+
+sub do_roman{
+ $doingbold=$false;
+ &makemffiles("cm","r",$noslant,*romans);
+}
+
+sub do_bold{
+ $doingbold=$true;
+ &makemffiles("cm","bx",$noslant,*bolds);
+}
+
+sub do_mathital{
+ $doingbold=$false;
+ &makemffiles("cm","mi",$slanted,*romans);
+}
+
+sub do_mathitalb{
+ $doingbold=$true;
+ &makemffiles("cm","mib",$slanted,*bolds);
+}
+
+sub do_mathsy{
+ $doingbold=$false;
+ &makemffiles("cm","sy",$slanted,*romans);
+}
+
+sub do_mathbsy{
+ $doingbold=$true;
+ &makemffiles("cm","bsy",$slanted,*bolds);
+}
+
+sub do_tenex{
+ $doingbold=$false;
+ &makemffiles("cm","ex",$noslant,*ex);
+}
+
+sub do_tenbex{
+ $doingbold=$true;
+ &makemffiles("cm","bex",$noslant,*ex);
+}
+
+sub get_encoding_sequence{
+ local($sequence) = "${enc}t";
+ if ($exp) { # expertised fonts?
+ $sequence = "9e"; # Cork (8t) + experts
+ $sequence = "9t" if $enc == 7; #
+ }
+ $replace{"<enct>"} = $sequence;
+ $sequence;
+}
+
+sub startpl{
+ local($e) = &get_encoding_sequence($enc);
+ print PL "tftopl $rm_tfm$sep${fontfam}r$e.tfm ${fontfam}r$e.pl\n";
+ print PL "tftopl $rm_tfm$sep${fontfam}ri$e.tfm ${fontfam}ri$e.pl\n";
+ if ($#template==1) {
+ print PL "tftopl $rm_tfm$sep$fontfam$bld$e.tfm $fontfam$bld$e.pl\n";
+ print PL
+ "tftopl $rm_tfm$sep$fontfam${bld}i$e.tfm $fontfam${bld}i$e.pl\n";
+ }
+}
+
+## This routine reads an fd file and discards comments, the `\endinput'
+## statement, and the `\ProvidesPackage' statement. It adds font scaling
+## info specified as an argument to the routine into all
+## `\DeclareFontShape' statements. One catch: scaling info may have
+## been placed in the fd file by fontinst, so we want to catch this and
+## replace it by our current scaling factor.
+
+sub get_fd_info_and_scale_it{
+ local($fdfile, $mysize, $inputs_) = @_;
+ local($pathandfdfile) = "$inputs_${sep}$fdfile.fd";
+ open(FD, $pathandfdfile) or die "Can't find $pathandfdfile. Help";
+ while (<FD>) { # skips comments and ProvidesPackage
+ last if /\\DeclareFontFamily/;
+ }
+ &out("\n%% Extracting font info from file $fdfile.fd...\n");
+ FDLINE: for (;;) {
+ if ( $_ =~ /\[\d*\.\d+\]/ ) { # scaling factor found!
+ $_ =~ s/\[\d*\.\d+\]/\[$mysize\]/g;
+ } else { # no scaling factor found
+ # we search for right angle, followed by 0 or more space,
+ # followed by fontname (which begins with alpha)
+ s/(>\s*)([^<\s])/\1 \[$mysize\] \2/g;
+ }
+ &out("$_") unless /^%/; # ignore comments
+ last FDLINE if eof(FD);
+ $_ = <FD>;
+ last FDLINE if /\\endinput/;
+ }
+ &out("%% End of extraction from file $fdfile.fd.\n\n");
+ close FD;
+}
+
+sub makestylefile{
+ $source="z$_[0].mk";
+ $pathsource="..$sep$source";
+ $target="z$tseries$fontfam.$_[0]";
+ close IN; close OUT; # just in case
+ open (IN, $pathsource)
+ || die "We are missing file $pathsource. HELP!";
+ open (OUT, ">$target")
+ || die "Cannot open file $target. Help!";
+ $FH_ = "OUT";
+ print OUT "%% This is file $target, containing ";
+ print OUT "TeX macros to typeset mock-MF fonts.\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ while ($_=<IN>) {
+ next if /^%%/; # strip out comment lines
+ while ( /(<[a-z]+>)/ ) { # parameters for replacement?
+ $a_ = $1; $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/g;
+ }
+ if ( /^\[([a-z]+)\]/ ) {# do we strip off special font indicators?
+ $ind = $1;
+ $_ =~ s/\[b\]// if defined $template[1];
+ $_ =~ s/\[$ind\]// if $$ind;
+ }
+ print OUT $_ unless /^\[/; # some special lines are not needed
+ }
+ if ($_[0] eq "tex") { # hook for the plain .tex file
+ }
+ if ($_[0] eq "sty") { # hook for the LaTeX (NFSS) .sty file
+ if ($template[1]) { # is there a bold series?
+ print OUT "\\DeclareMathAlphabet{\\mathbf}{$encoding}";
+ print OUT "{$fontfamx}{$nfss_bold}{n}\n";
+ }
+ if ($tt) { # for tt
+ $tt_inputs = $inputs;
+ $tt_inputs = "$texmf${sep}tex${sep}latex${sep}$tt_installer"
+ if $texmf;
+ &get_fd_info_and_scale_it("${encoding}cmtt", $tt_sf, $tt_inputs);
+ print OUT "\\DeclareMathAlphabet{\\mathtt}{$encoding}";
+ print OUT "{\\ttdefault}{m}{n}\n";
+ }
+ if ($sa) { # for sans serif
+ $sans_inputs = $inputs;
+ $sans_inputs = "$texmf${sep}tex${sep}latex${sep}$sans_installer"
+ if $texmf;
+ &get_fd_info_and_scale_it("${encoding}${sansfam}", $sans_sf,
+ $sans_inputs);
+ print OUT "\\newcommand{\\sansdefault}{$sansfam}\n";
+ print OUT "\\DeclareMathAlphabet{\\mathsf}{$encoding}";
+ print OUT "{\\sansdefault}{m}{n}\n";
+ }
+ }
+ print OUT "\\endinput\n";
+ close IN; close OUT;
+}
+
+sub create_hax_files{
+ $hackprefix = "$tseries$fontfam";
+ &safecopy("..${sep}rhax.mtx", "${hackprefix}rrx.mtx");
+ &safecopy("..${sep}ihax.mtx", "${hackprefix}rix.mtx");
+ &safecopy("..${sep}iskew.mtx", "${hackprefix}riw.mtx");
+ $replace{"<hax>"} = $hackprefix;
+ if (defined $template[1]) { # A bold? If so, we need bold versions...
+ &safecopy("..${sep}rhax.mtx", "${hackprefix}brx.mtx");
+ &safecopy("..${sep}ihax.mtx", "${hackprefix}bix.mtx");
+ &safecopy("..${sep}iskew.mtx", "${hackprefix}biw.mtx");
+ }
+}
+
+sub makemakevp{ # makes the file makevp.tex, the fontinst install file.
+ &create_hax_files; # files for fixing metric info
+ $source="makevp.mk";
+ $pathsource="..$sep$source";
+ $target="makevp.tex";
+ close IN; close OUT; # just in case
+ open (IN, $pathsource)
+ || die "We are missing file $pathsource. HELP!";
+ open (OUT, ">$target")
+ || die "Cannot open file $target. Help!";
+ print OUT "%&plain\n";
+ print OUT "%% This is file $target, containing ";
+ print OUT "fontinst install commands to create virtual fonts.\n";
+ print OUT "%% Created by MathKit$version at $currtime on $currdate.\n";
+ while ($_=<IN>) {
+ next if /^%%/; # strip off comment lines
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) {# do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ print OUT $_ unless /^\[b\]/; # bold lines are not needed
+ }
+ close IN; close OUT;
+ open (IN, "makevp.tex");
+ open (OUT, ">makevf.bat");
+ &banner("OUT", "makevf.bat");
+ while ($_ = <IN>) {
+ next unless $_ =~ /\\installfont\{/;
+ $_ =~ /\s+\\installfont\{([a-z0-9]+)\}\{/;
+ print OUT "vptovf $1.vpl $1.vf $1.tfm\n";
+ }
+ close IN; close OUT;
+}
+
+## This routine prints $_ to output filehandle TEX provided there
+## are no bracketed qualifiers at the line beginning. It tests
+## for 2-char qualifiers; "b" is handled separately.
+
+sub printTEXlines {
+ if ($_ =~ /^\[([a-z]+)\]/) {
+ local($ind_)=$1;
+ $_=~s/^\[$ind_\]// if $$ind_;
+ }
+ print TEX $_ unless /^\[/;
+}
+
+sub makeLaTeXtest{
+ open(TEX, ">testmath.tex");
+ &printbanner("TEX", "%", "testmath.tex");
+ local($infile) = "..${sep}testmath.mk";
+ open(TEMPLATE, $infile) or
+ die "Where is the template $infile?";
+ while ($_ = <TEMPLATE>) {
+ next if /^%/; # strip comments away
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) { # do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ &printTEXlines;
+ }
+ close TEX; close TEMPLATE;
+}
+
+sub makeplaintest{
+ open(TEX, ">testmatp.tex");
+ &printbanner("TEX", "%", "testmatp.tex");
+ local($infile) = "..${sep}testmatp.mk";
+ open(TEMPLATE, $infile) or
+ die "Where is the template $infile?";
+ while ($_ = <TEMPLATE>) {
+ next if /^%/; # strip comments away
+ while ( /(<[a-z]+>)/ ) {# parameters for replacement?
+ $a_ = $1;
+ $b_ = $replace{$a_};
+ $_ =~ s/$a_/$b_/;
+ }
+ if ( /^\[b\]/ ) { # do we strip off bold indicator?
+ $_ =~ s/\[b\]// if defined $template[1];
+ }
+ &printTEXlines;
+ }
+ close TEX; close TEMPLATE;
+}
+
+ $finish_up =<<"EndFinish";
+
+Now to finish up. Perform the following tasks:
+0. Execute 'mkdirs.bat' to create any missing directories.
+1. Execute the file 'makegf.bat'. (This may take some time...)
+2. Create the packed pixel .pk files. On some (Unix) systems, you do this
+ via commands like:
+localhost>>foreach X (*.300gf)
+localhost>>gftopk \$X \$X:r.300pk
+localhost>>end
+ but many systems do not permit this. Therefore, you will need to examine
+ the accompanying file 'makepk.bat' and EDIT it accordingly to conform
+ to your system standards and syntax. Thereafter, execute this file;
+ make sure you EDIT it first!
+3. Execute the file 'makepl.bat'.
+4. Execute the command 'tex makevp'. (This may take some time...)
+5. Execute the file 'makevf.bat'.
+6. Run the files 'testmath.tex' (LaTeX) or 'testmatp.tex' (plain TeX)
+ through TeX to test the files. [Consult the documentation 'mathkit.tex'
+ for advice on adjusting these new math fonts.]
+7. When you are satisfied with the results, execute 'putfonts.bat' to store
+ the fonts and files where they belong.
+(This advice appears in the Ascii file 'todo.nxt' and in the log file
+'z$tseries$fontfam.klg' which contains other information about this run.)
+EndFinish
+
+## Now let's record the remaining tasks...
+sub finish{
+ ## first, make bat files executable...
+ @batch_files =
+ ("putfonts.bat", "mkdirs.bat", "makegf.bat",
+ "makepk.bat", "makepl.bat", "makevf.bat");
+ chmod 0755, @batch_files;
+ ## Putting files where they belong...
+ print PUT "$mv *.mf $mfinputs\n";
+ print PUT "$mv *.vf $vf\n";
+ print PUT "$mv *.tfm $tfm\n";
+ ## $pkext = "pk"; # DOS default
+ ## if ($sep ne "\\") {
+ ## print "I need the extension for the pixel files you created.\n";
+ ## print "This extension is something like '300pk' or '600pk'.\n";
+ ## print "Please enter it now: ";
+ ## $pkext = <STDIN>; chomp $pkext;
+ ## }
+ ## $pkext =~ s/^\.//; # just in case user added a `dot'
+ &record("I am using the extension `.$pkext' for pixel files.\n");
+ print PUT "$mv *.$pkext $pk\n";
+ print PUT "$mv *.fd $inputs\n";
+ print PUT "$mv z$tseries$fontfam.sty $inputs\n";
+ print PUT "$mv z$tseries$fontfam.tex $plain_inputs\n";
+ ## User instructions...
+ &record($finish_up);
+ open (TODO, ">todo.nxt");
+ &banner("TODO", "todo.nxt");
+ print TODO $finish_up;
+ close TODO;
+}
+
+## For each point size <n> we create roman, mi, sy
+
+@romans=(12,10,9,7,5); # point sizes for Roman fonts
+@bolds=(12,10,7,5); # point sizes for bold fonts
+@ex=(10); # point sizes for extension fonts
+
+## The following replacements will be used to personalize the templates.
+
+$replace{"<currdate>"} = $currdate;
+$replace{"<fam>"} = $fontfam;
+$replace{"<famx>"} = $fontfam; # expert family?
+$replace{"<famx>"} = "${fontfam}x"
+ if -e "$rm_inputs$sep$encoding${fontfam}x.fd";
+$fontfamx = $replace{"<famx>"};
+$replace{"<mock>"} = $tseries;
+$replace{"<m>"} = $tser;
+$replace{"<enc>"} = $enc;
+$replace{"<enx>"} = $replace{"<enc>"};
+$replace{"<enx>"} = "9"
+ if -e "$rm_inputs$sep$encoding${fontfam}x.fd";
+$replace{"<encoding>"} = $encoding;
+$replace{"<b>"} = $bld;
+$replace{"<nfssb>"} = $nfssbld;
+$replace{"<bseries>"} = "b"; ## change to "bx" if appropriate
+## but...
+$replace{"<bseries>"} = "sb" if $bld eq "s";
+$nfss_bold = $replace{"<bseries>"};
+
+## Some defaults for the special fonts...
+
+$replace{"<ssr>"} = "cmss10"; # sans serif stuff
+$replace{"<ssb>"} = "cmssbx10";
+$replace{"<ssri>"} = "cmssi10";
+$replace{"<ssbi>"} = "cmssbx10";
+$replace{"<sasize>"} = "10";
+$replace{"<ttsize>"} = "10"; # tt
+$replace{"<cal>"} = "${tseries}sy10"; # calligraphic
+$replace{"<calb>"} = "${tseries}bsy10"; # calligraphic
+$replace{"<casize>"} = "10";
+$replace{"<frsize>"} = "10"; # fraktur
+$replace{"<frsf>"} = "1";
+
+sub do_it_all{
+ open (PL, ">makepl.bat"); # script to create pl files fontinst needs
+ &banner("PL", "makepl.bat");
+ open (LTX, ">z${tseries}${fontfam}.sty"); # contains NFSS (LaTeX) macros
+ open (PLN, ">z${tseries}${fontfam}.tex"); # contains plain TeX macros
+ open (PUT, ">putfonts.bat"); # places completed fonts where they belong
+ &banner("PUT", "putfonts.bat");
+ open (MF, ">makegf.bat"); # script to execute Metafont
+ &banner("MF", "makegf.bat");
+ open (GFTOPK, ">makepk.bat"); # script to pack all pixels
+ &banner("GFTOPK", "makepk.bat");
+ &get_fontfam_parameters("r");
+ &get_template_info($template[0]);
+ &adjust_font_parameters if $I_should_try_to_match;
+ &startpl;
+ ## Do all roman fonts...
+ &do_roman;
+ &do_mathital;
+ &do_mathsy;
+ &do_tenex;
+ &do_special_fonts; # tt, frak, b'board bold, cal, sans serif
+ if (defined $template[1]) { # do bold fonts...
+ &get_template_info($template[1]);
+ &do_bold;
+ &do_mathitalb;
+ &do_mathbsy;
+ &do_tenbex;
+ }
+ &makestylefile("tex"); # make plain TeX macro file
+ &makestylefile("sty"); # make LaTeX NFSS package file
+ &makemakevp; # make the fontinst install file
+ close PL; close LTX; close PLN; close MF; close GFTOPK;
+ &makeLaTeXtest;
+ &makeplaintest;
+ &finish;
+}
+
+## Let 'er rip...
+
+&do_it_all;
+
diff --git a/fonts/utilities/mathkit/mathkit.par b/fonts/utilities/mathkit/mathkit.par
new file mode 100644
index 0000000000..577e5e94a7
--- /dev/null
+++ b/fonts/utilities/mathkit/mathkit.par
@@ -0,0 +1,97 @@
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "0.7",
+### date = "January 1998",
+### filename = "mathkit.par",
+### address = "Department of Mathematics
+### John Jay College
+### 445 West 59th Street
+### New York, NY 10019
+### USA",
+### telephone = "(516) 385-0736",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### supported = "yes",
+### abstract = "This is a parameter file. It sets parameters
+### needed by the MathKit utility."
+### package = "MathKit",
+### dependencies = "perl,"
+### }
+### ====================================================================
+
+####################################################################
+##
+## EVERYBODY WHO USES THIS SCRIPT MUST SET THE FOLLOWING PARAMETERS!!
+##
+####################################################################
+
+## Some parameters must be set:
+## 0. Is this part of a TDS (TeX Directory System)? If so, some
+## additional parameters need setting, and $mfinputs and $tfm
+## can be determined by MathKit.
+## 1. $mfinputs
+## 2. $tfm, $afm, and other font places
+## 3. $mode plus additional Metafont information
+## 4. &UNIX or &DOS;
+## 5. Shall we approximate the text font?
+## 6. Sans serif font?
+
+## Step 0... (UNCOMMENT ALL OF THESE STATEMENTS, and make sure they
+## are accurate, in case your system is TDS compliant.)
+## $texmf = "/resource/mathkit/mkcur/1work/texmf"; # or whatever...
+ $supplier = "adobe"; # the TDS supplier for the scalable fonts
+ $typeface = "janson"; # TDS typeface for the scalable fonts
+ $installer = "vfinst"; # who installed your roman fonts?
+ $tt_installer = "base"; # who installed your tt fonts?
+ $sans_installer = "vfinst"; # who installed your sans serif fonts?
+
+
+## Step 1...
+
+$mfinputs = "/usr/lib/mf/inputs"; # where do we find Metafont files?
+## (NO trailing path separator!!)
+
+## Step 2 (only for NON-TDS systems) ...
+
+$tfm = "/usr/lib/tex/fonts/tfm"; # where do tfm's for fonts live?
+$afm = "/psfonts/afm"; # where are the afm's for the ROMAN fonts?
+$pk = "/usr/lib/tex/fonts/pk"; # where do pk pixel files belong?
+$vf = "/usr/lib/tex/fonts/vf"; # where do I put the vf's I make?
+$psfonts = "/psfonts"; # where are pfb's and pfa's stored?
+$inputs = "/usr/lib/tex/inputs"; # where are the fd files?
+$mfinputs = "/usr/lib/mf/inputs"; # where are mf source files kept?
+
+## Step 3...
+
+$mf = "mf"; # what's the name of the Metafont executable?
+$mode = "imagen"; # what's the Metafont mode?
+$dpi = "300"; # what's your printer's resolution?
+
+## Step 4...What's our operating system?
+
+&UNIX; # this statement invokes Unix conventions
+## &DOS; # uncomment this if using DOS!!
+
+## Step 5...Shall we approximate certain parameters by using
+## parameters belonging to the text fonts rather than those
+## belonging to the template files? (Comment this out if
+## otherwise.) That is, should we try to match the cm fonts
+## to the font family? If so, set this value to any non-null,
+## non-zero value.
+
+## $I_should_try_to_match = 1;
+
+## Step 6. Specify the sans serif font..
+## (If these are COMMENTED out, I will use Computer Modern
+## Sans Serif as default.)
+
+## $sans_font = "lssr7t";
+## $sans_supplier = "bh"; # We need this in case of TDS systems
+## $sans_typeface = "lucida"; # We need this in case of TDS systems
+
+####################################################################
+##
+## END OF PARAMETER SECTION
+##
+####################################################################
diff --git a/fonts/utilities/mathkit/mathkit.tex b/fonts/utilities/mathkit/mathkit.tex
new file mode 100644
index 0000000000..88e026222d
--- /dev/null
+++ b/fonts/utilities/mathkit/mathkit.tex
@@ -0,0 +1,605 @@
+%&latex
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mathkit.tex, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% THIS IS A STANDARD LATEX + NFSS DOCUMENT FILE.
+
+\documentclass{article}
+
+\newcommand{\MathKit}{\textit{MathKit}}\let\mk=\MathKit
+\font\logofont=logo10
+\newcommand{\mf}{{\logofont META}\-{\logofont FONT}}
+\def\fil|#1|{\texttt{#1}}
+\def\ext|#1|{\texttt{.#1}}
+\def\angles#1{$\langle${\normalfont\textit{#1}}$\rangle$}
+
+\title{Hundreds of New Math Fonts with MathKit (version 0.7)}
+\author{Alan Hoenig}
+\date{May 5, 1997}
+
+\begin{document}
+
+\maketitle
+
+\mk{} is an attempt to deal with typesetting mathematics
+using fonts {\em other\/} than Computer Modern. Till now, authors
+have had few alternatives:
+\begin{itemize}
+ \item They can use CM math together with a text font family like Times
+ Roman, but the result is not professional.
+ \item They can use proprietary math fonts, such as MathTime or Lucida
+ New Math, but that requires spending money.
+ \item They can use the Euler math fonts, but these letterforms are a
+ bit too idiosyncratic for some, and it is not well-known how to
+ properly implement them anyhow.
+\end{itemize}
+
+\mk{} aids in the creation of math fonts which are compatible with a
+text font family---that is, \mk{} can help you typeset a Baskerville
+math document where the equations really look Baskerville-ish.
+Depending on your choice of parameters, you also get {\bf bold} math
+fonts. \mk{} consists of a Perl script and some auxiliary files to
+help an author---even one ignorant of virtual fonts or of \mf---to
+perform these tasks. (In case you have MathTime, Lucida New Math,
+Euler, or Mathematica math fonts, you might wish to check out the
+author's {\it MathInst\/} tools for installing these fonts. This
+material is available from the {\tt fonts/utilities/mathinst} section
+of {\sc ctan}.)
+
+The current version fixes some bugs from the previous version. I am
+grateful to several excellent and vigilant bug-catchers, including
+David Ness, Dave Rebnord, Petr Sojka, Jose Iovino, and Richard
+Townsend.
+
+\section{What it does}
+\mk{} takes \mf{} parameters that are appropriate to an outline font
+family and uses these to create new math fonts with \mf. The symbols
+and other special characters in these new fonts look pretty good---and
+are compatible with your outline fonts---but the italics and numerals
+look ghastly. Fortunately, that's not a problem. Using virtual
+fonts, we manufacture math fonts that combine the new special symbols
+(done by \mf{} that look pretty good) with letters and numerals from
+the outline fonts while we throw away all the ghastly stuff. \mk{}
+does this work for you; it provides scripts for the remaining steps
+(all this is described below). It also provides style files for plain
+\TeX{} and for the NFSS of \LaTeX{} for you to use these fonts in your
+documents. {\em You don't need to know anything about \mf{} or
+virtual fonts to use \mk{} and the resulting fonts.}
+
+This version of \mk{} comes with three sets of font templates. Since
+Palatino and Times Roman are so common, I prepared templates for these
+fonts. For fun, I prepared a template for Monotype Baskerville.
+Times comes in regular and bold series, and Baskerville in regular and
+semibold; Palatino is regular only.
+
+However, I have had excellent luck matching one of the templates with
+a non-related text family. The Baskerville-like template matches
+Monotype Janson and Adobe Caslon very nicely, for example.
+Consequently, it's possible to generate not three new math font
+families, but {\it hundreds\/} of them, as the title to this document
+proclaims.
+
+\section{What you get as final output}
+\mk{} itself produces lots and lots of scripts and batch files. Once
+these are properly executed (see below for the exact procedure) you
+get the following:
+\begin{enumerate}
+ \item Virtual fonts for math and text typesetting. You will also
+ get fonts for
+ bold math if you have supplied a template containing bold parameters.
+ \item Style files for plain \TeX{} and \LaTeX{} (NFSS).
+ These files support bold math if bold parameter
+ templates were present.
+\end{enumerate}
+
+\section{What you'll need}
+\subsection{\TeX{} and MetaFont}
+You'll need current versions of \TeX{} and \mf, first off. They must
+be sufficiently recent to support virtual fonts.
+
+\subsection{\texttt{fontinst}}
+You'll need a version~1.5 of \texttt{fontinst}, available from any
+{\sc ctan} archive or mirror. To install this software, retrieve {\it all\/}
+files from the
+\begin{verbatim}
+fonts/utilities/fontinst/inputs
+\end{verbatim}
+area. If you
+have a traditional \TeX\ system, place these files with the other
+files that \TeX\ reads in a directory like `{\tt tex/inputs}'. In a
+{\sc tds} system, place them in
+\begin{verbatim}
+texmf/tex/generic/fontinst
+\end{verbatim}
+
+\subsection{pdcfsel}
+If you use plain \TeX, you'll need Damian Cudgley's \texttt{pdcfsel}
+font selection macros. These can be found in the
+\texttt{macros/plain/contrib/pdcmac} section of
+\textsc{ctan}. From this directory, fetch the files \fil|pdccode.tex|
+and \fil|pdcfsel.dtx| and place both files in a \TeX{} work directory.
+Then, issue a command like
+\begin{verbatim}
+tex pdcfsel.dtx
+\end{verbatim}
+In a moment, you'll get two new files---\fil|pdcfsel.dvi|, from which
+you can typeset documentation for this package, and \fil|pdcfsel.tex|,
+which you should
+place in a directory that
+\TeX{} can read from, a place like `{\tt tex/inputs}' in a
+traditional \TeX\ system, or a place like
+\begin{verbatim}
+texmf/tex/plain/pdcfsel
+\end{verbatim}
+in a {\sc tds} system.
+
+\subsection{Perl5}
+You'll need version~5 of Perl, a freely-available utility for all
+computer platforms and easily obtained from many computer archives and
+{\sc cd-rom} software collections. Perl needs installation as well.
+This is simply a matter of placing the Perl executable somewhere on
+your computer's search path.
+
+\subsection{\texttt{fontname}}
+Your text fonts need to have been installed using Karl Berry's
+fontnaming conventions. Furthermore,
+these fonts must have been installed following the original \TeX\
+encoding, often denoted {\tt OT1} or {\tt ot1}. Some ways to perform
+this installation are {\tt psnfss} or {\tt VFinst} (see the
+\begin{verbatim}
+fonts/utilities/vfinst/
+\end{verbatim}
+area of {\sc ctan}).
+
+\subsection{Other utilities}
+You'll need to insure you have working copies of the \TeX ware
+utilities \texttt{tftopl} and \texttt{vptovf} which should already be part of
+your \TeX{} installation. Make sure both these executables are
+in some part
+of your computer's search path.
+
+\section{Installation}
+Installation of \mk\ consists of three steps.
+\begin{enumerate}
+ \item Prepare a directory, called something like \texttt{mathkit}
+ perhaps, to hold all the \mk{} files. Place all the \mk{} files here.
+ \item Prepare a work directory below this. Switch to this directory
+ to do all your work. (The \mk{} package consists of this file
+ \fil|mathkit.tex|, a file \fil|readme|, the main Perl script
+ \fil|mathkit|, some files \fil|greekoff.mtx| and
+ \fil|alphoff.mtx| used by \texttt{fontinst}, some template files
+ \fil|ztex.mk|, \fil|zsty.mk|, \fil|makevp.mk|,
+ \fil|tm.mkr|, \fil|tm.mkb|, \fil|pl.mk|,
+ \fil|bv.mkr|, and \fil|bv.mks|, plus some miscellaneous other stuff.)
+
+(These instructions assume that your implementation of \TeX{} knows to
+search the parent directory to the current directory to look for files
+it may need to read. If this is not the case---and you'll know when
+you execute the `{\tt tex}' step, as \TeX\ won't be able to find files
+in the {\tt mathkit} directory---you'll need either to adjust \TeX's
+search path or to place copies of all the \mk{} files in the work
+directory.)
+
+\item Finally, there are a few parameters that need {\em careful\/}
+adjustment at the beginning of the file \fil|mathkit.par|. \mk{}
+needs to know some system things---where are the \ext|tfm|'s kept for
+this text font family, where are \mf{} input files kept, what is the
+\mf{} mode you require (that is, what printer will you be preparing
+fonts for?), and are you running under Unix or DOS? This file is
+self-documenting, so consult it for details. Briefly, it needs seven
+categories of information:
+\begin{enumerate}
+ \item Is this a {\sc tds} installation? If so, what are the
+ suppliers, typefaces, and installers for your fonts?
+ \item Where are the \mf{} source files found?
+ \item For {\it non}-{\sc tds} systems only, where are \TeX's special
+ file types ({\tt.tfm}, {\tt.vf}, etc.) found?
+ \item What's the name of of the \mf{} executable?
+ What is the \mf{} mode? How are \mf{} output files named?
+ Where do these files belong? This requires additional
+ discussion---see below.
+ \item Is this Unix or {\sc dos}? If you are using yet a different
+ operating system, you'll need to create a subroutine named for this
+ other system and modelled after the routines you'll find at about
+ line~46 in the file \fil|mathkit|.
+ \item Should \mk{} try to match \mf{} parameters to your text fonts?
+ The answer should almost assuredly be `no'.
+ See below for additional discussion.
+ \item What is the sans serif font you'll be using with your fonts? We
+ will also need the directory names for its supplier and typeface, in
+ case your system is a {\sc tds} system.
+\end{enumerate}
+\end{enumerate}
+
+\subsection{Mode and other Metafont information}
+Most of the time, the \mf{} executable is called `{\tt mf}'; in such
+cases, set the variable \texttt{\$mf} in the file {\tt mathkit.par}
+to the value \texttt{"mf"}. On some systems, it may have other names,
+such as \texttt{virmf}. Adjust the value of \texttt{\$mf}
+accordingly.
+
+The \mf{} mode refers to a group of parameters especially adjusted to
+match your computer's printer. Modes are named with strings that
+suggest their corresponding printer---for example, {\tt imagen}, {\tt
+hplaser}, and so on. If you don't know which \mf{} mode corresponds
+to your printer, you'll have to inspect (with an editor) the file
+\fil|local.mf| or some file like that that appears in your \mf{}
+inputs directory. Probably the most important of the mode parameters
+is one called \verb+pixels_per_inch+ which ensures that \mf's bitmaps
+match your printer's resolution. At the very least, you'll need to
+choose a mode whose value of \verb+pixels_per_inch+ matches your
+printer's resolution. The name of the mode is the string following the
+command \verb+mode_def+ which appears a few lines above.
+
+In case, no mode is useful, you'll have to create your own mode.
+Duplicate one of the modes in \fil|local.mf|, and just change the name
+of the mode and the value of \verb+pixels_per_inch+. Then, you'll
+have to re-install \mf{} using {\tt inimf}.
+
+You'll also need to supply your printer's resolution. In \mk, this is
+called {\tt\$dpi} in the file \fil|mathkit.par|. It corresponds to
+the \mf{} variable \verb+pixels_per_inch+.
+
+\subsection{Matching (additional information)}
+All but super-power-users should keep the parameter
+\begin{verbatim}
+$I_should_try_to_match
+\end{verbatim}
+commented out at
+all times. Otherwise, it is easy to generate successively different
+copies of \mf{} source files, all with the same name. Consequently,
+the most recent creation obliterates its predecessors and will make it
+well-nigh impossible to regenerate early versions of your new pixel
+fonts.
+
+For those with intestinal fortitude of the first rank, here's an
+explanation. Although only three font templates currently accompany
+\mk, it is possible to use a template with another text font family.
+I have had good results, for example, using the {\tt bv}
+Baskerville-like template with both Monotype Janson and Adobe Caslon
+fonts. Of course, the $x$-height, cap-height, and so on of the Janson
+or Caslon fonts won't math the corresponding parameters for the
+Baskerville fonts. However, if the parameter
+\begin{verbatim}
+$I_should_try_to_match
+\end{verbatim}
+is set to a non-zero, non-null value, then \mk{} will use all the
+template parameters together with the $x$-height, etc.\ of the text
+fonts. This may ensure even closer compatibility between the math and
+text fonts. In case it doesn't, you can always re-generate the math fonts
+with this parameter turned off. Although it probably sounds like a
+good idea to keep this parameter switched on, it leads to a
+proliferation of \mf\ files that are slightly different but have the same
+filenames (see above; any readers with suggestions for dealing with
+impasse should please get in touch with me).
+
+\subsection{Special fonts}
+\mk{} also makes it possible to typeset with some special font types,
+including blackboard bold, calligraphic, fraktur, typewriter
+mono-spaced, and sans serif, and will provide typesetting commands for
+these fonts provided they exist. Except for sans serif, though, you
+have relatively little choice in which kinds of fonts to install.
+Here's what \mk{} expects:
+
+\begin{itemize}
+ \item \mk{} uses the calligraphic alphabet in the Computer Modern
+ symbol fonts.
+ \item The typewriter font must be installed under the name {\tt
+ cmtt10}, and you will need an outline form of this font.
+ \item You'll need the {\tt eufm10} Euler Fraktur font in outline form
+ for Fraktur typesetting.
+ \item You'll need the \mf{} source for Alan Jeffrey's blackboard bold
+ fonts for blackboard bold typesetting.
+ \item You have much greater freedom for sans serif fonts, as discussed
+ above.
+\end{itemize}
+These fonts and font sources are all available on \textsc{ctan}.
+
+In non-\textsc{tds}, installation means placing the {\tt.afm} files in
+a directory like {\tt/psfonts/afm} and the outline files in a place
+like {\tt /psfonts}. \mf{} sources belong somewhere named like {\tt
+/mf/inputs}. In a \textsc{tds} system, locations are more carefully
+defined. Computer Modern--math symbols and typewriter---belongs
+in a place like
+$$\hbox{\tt\angles{texmf}/fonts/\angles{type1-or-afm}/public/cm}$$
+The Euler Fraktur fonts belong in
+$$\hbox{\tt\angles{texmf}/fonts/\angles{type1-or-afm}/ams/euler}$$
+Finally, the blackboard bold source fonts belong in
+$$\hbox{\tt\angles{texmf}/fonts/source/public/bbold}$$
+
+\section{Executing the software}
+The main \mk{} script requires three parameters at the command line.
+These are:
+\begin{enumerate}
+ \item The name of the parameter template. `{\tt tm}' refers to Times-like
+ parameters, `{\tt pl}' to Palatino-like, and `{\tt bv}' to Baskerville-like.
+ \item The name under which text fonts are installed. This is apt to
+ be something like \texttt{ptm} or \texttt{mnt} for Adobe Times or
+ Monotype Times New Roman, \texttt{ppl} for Palatino, and \texttt{mbv}
+ for Monotype Baskerville (which is {\em quite\/} different from
+ ITC New Baskerville). As mentioned above, though, you are welcome
+ to any properly installed text font family as well. Simply specify
+ its {\tt fontname} abbreviation at the command line.
+ \item The encoding your fonts follow. Only \texttt{OT1} (original
+ \TeX{} encoding) or maybe \texttt{ot1} are currently allowed. Use
+ {\tt ot1} if your system doesn't allow uppercase file names.
+\end{enumerate}
+For example, I type
+$$\hbox{\tt perl ../mathkit tm ptm OT1}$$
+in my work directory
+to create Times-like fonts following the original \TeX{} encoding.
+(If your system supports the \verb1#!1 syntax for specifying the name
+of an interpreter, then adjust the proper path at the very top of
+the \fil|mathkit| script, make sure the execute bit is set, and type the
+simpler injunction \texttt{../mathkit tm ptm OT1} from the work
+directory.) To create my Janson/Baskerville fonts, I typed
+\begin{verbatim}
+../mathkit bv mjn OT1
+\end{verbatim}
+at the command line.
+
+Currently, you get bold math fonts {\em except} if you choose the
+Palatino-like {\tt pl} template.
+
+\section{Making the fonts}
+The following steps complete the font creation. Perform them all
+within the \mk{} work directory.
+\begin{enumerate}
+\item Execute the file \fil|makegf.bat| to have \mf{}
+create the pixel fonts for
+your fonts. This step will take some time.
+\item You'll need to pack all the pixel files. Inside Unix, you can
+do this via a series of commands like
+\begin{verbatim}
+foreach X (*.600gf)
+foreach? gftopk $X $X:r.600pk
+foreach? end
+\end{verbatim}
+Not all operating systems are so accommodating, so there is a file
+called \fil|makepk.bat| which may be helpful in this regard. {\bf Caution:}
+before executing this script, it will almost surely be necessary to edit it.
+\item Execute the script \fil|makepl.bat| to create some property list
+files needed by \TeX.
+\item Run the file \fil|makevp.tex| through \TeX. That is, execute
+the command \texttt{tex makevp} or something appropriate for your
+system. This step will take lots of time. Along with lots of
+superfluous files, this creates many `virtual property list' files
+with extension \ext|vpl|.
+\item Create the actual virtual files by running every \ext|vpl| file
+through the program \texttt{vptovf}. You can do this easily in Unix
+with commands like
+\begin{verbatim}
+foreach X (*.vpl)
+foreach? vptovf $X $X:r.vf $X:r.tfm
+foreach? end
+\end{verbatim}
+Even easier---execute the file \fil|makevf.bat| that \mk{} creates for
+you.
+\item Test your fonts by running the files \fil|testmath.tex|
+(for \LaTeX\ users) or \fil|testmatp.tex| (plain \TeX) through \TeX\
+and then printing it.
+If adjustments are necessary,
+return to the `{\tt tex makevp}' step (step~4), and proceed from that point
+onward. Adjustments to your fonts will be discussed below.
+\item Only when you are completely satisfied with your new fonts
+should you execute the script {\tt putfonts.bat} to place font files
+and style files to their proper places.
+\end{enumerate}
+
+That leaves behind still files with extensions \ext|log|, \ext|mtx|,
+\ext|pl|, \ext|vpl|, \ext|bat|, \ext|300gf| (or something similar) and
+several other miscellaneous other files. You may safely
+delete all these.
+
+\subsection{Fine tuning and character adjustment}
+The only adjustment that should be necessary are spacing adjustments
+to improve the appearance of over-the-character accents, subscripts, and
+character placement. The two test files that enable you test this are
+\fil|testmath.tex| (for \LaTeX) and \fil|testmatp.tex| (plain).
+Run one of these files through \TeX, and examine the printed output
+carefully.
+
+\mk{} will have made two or more adjustment files for you
+that facilitate making changes to
+character spacing. These files are named following this mysterious
+convention:
+$$\hbox{\tt\angles{mock}\angles{text-fonts}\angles{weight}%
+ \angles{r-or-i}\angles{w-or-x}.mtx}$$
+Here, \angles{mock} should be replaced by the template type (currently
+{\tt bv},
+{\tt tm}, or {\tt pl}); \angles{text-fonts} should be replaced by the
+three-character text font family designation; \angles{weight} will be
+{\tt r} or {\tt b} (regular or bold weight); \angles{r-or-i}
+will be {\tt r} or {\tt i} as the changes are to be applied to math
+roman or math italic fonts; and \angles{w-or-x} makes changes to
+(skew) over-character accents or to glyph widths and subscript
+placement. (In an earlier incarnation of this package, the metric
+adjustment files contained these and other ha\texttt{x} (hacks);
+hence the `x'. The `w' should suggest the ske\texttt{w} adjustments
+for accents. It's necessary to put this material in two distinct
+files so that the virtual font making mechanism reads the
+adjustment information at different points in its cycle.)
+For example, for my Janson-compatible ({\tt mjn})
+math fonts using the
+{\tt bv} template, I use file
+\begin{verbatim}
+bvmjnriw.mtx
+\end{verbatim}
+to adjust the positioning of the skew-type overhead accents like the
+vector arrow and tilde for the math italic font, while I use
+\begin{verbatim}
+bvmjnbrx.mtx
+\end{verbatim}
+to make changes to glyph widths and to subscript placement for math
+roman fonts used in the math bold series.
+
+Even if you re-install math fonts, \mk{} takes care not to overwrite
+pre-existing adjustment files.
+
+Changes are mostly a trial-and-error affair. The first time you
+create a set of math fonts, \mk{} creates a set of adjustment files in
+which all the change commands are commented out. To make changes,
+enter the appropriate file and read what each file has to say about
+the \verb+\shiftglyph+ or \verb+\skewkern+ commands which are found
+there.
+
+Once you've made all your changes, re-run the steps from `{\tt tex
+makevp}' (step~4) to the point where you print a copy of the test file
+(step~6), and
+then make additional changes as needed.
+
+Of course, it's always possible to settle for fine-tuning your
+manuscripts, but it's better to spend the time tuning the fonts
+instead. It's nevertheless a good idea to get familiar with \TeX's
+\verb+\skew+ command (see page~136 of {\it The \TeX book}) which is
+helpful in this regard, as are the many math space commands.
+
+Font mongers note: you may be able to fine tune the characters
+themselves by adjusting
+the parameter values in the {\it template\/} files to other than what I've
+provided. Feel free! If you find a particularly fine bunch of values
+different from what I've provided, I'd be grateful if you passed them
+along to me.
+
+\subsection{Names of the new fonts}
+\mf{} will make many new fonts with names like the usual Computer
+Modern fonts, except the first two letters will be replaced by the
+abbreviation you specified in the \mk{} command. Thus, when making
+Times-like fonts, you'll be making new fonts {\tt tmr10}, {\tt
+tmbx10}, and so on for other varieties and sizes. There will be some
+bold variants of these if you've provided a bold parameter template.
+Palatino-like variants would be named {\tt plr10}, and so on, while
+Baskerville-like variants are {\tt bvr10}, etc. Some of these new
+bitmaps will be raw fonts for new virtual fonts that \mk{} creates.
+
+There will be lots of new virtual fonts for Math roman and italic (and
+perhaps in bold variants). These fonts have names beginning with the
+font family indicator (such as {\tt ptm} or {\tt mbv}), a weight
+indicator ({\tt r} or {\tt b} for regular or
+bold), a single letter referring to the bitmaps that have been
+incorporated (this will be the first of the two letter abbreviation
+for the bitmap family; that is, {\tt b}, {\tt t}, or {\tt p} for
+Baskerville, Times, or Palatino), an encoding digit (7 for {\tt OT1} or {\tt
+ot1} encoding), a further encoding symbol (either {\tt t} or {\tt m}
+for text or math italic), and a character for the font size (no digit
+for ten-point, a single digit for smaller design sizes, and a `c',
+hexadecimal digit representing `12', for the 12-point size). Thus, my
+Janson/Baskerville math italic fonts have names {\tt mjnrb7mc}, {\tt
+mjnrb7m}, {\tt mjnrb7m9}, {\tt mjnrb7m7}, and {\tt mjnrb7m5} for the
+fonts at 12\thinspace pt, 10\thinspace pt, 9\thinspace pt, 7\thinspace
+pt, and 5\thinspace pt.
+
+All font
+names are eight characters long or less.
+
+\section{Using your new fonts}
+\mk{} produces two style files, one for \LaTeX{} and one for plain.
+Their file names are formed according the naming scheme
+ $$\hbox{\tt z\angles{mock-family}\angles{font-family}}$$
+Here, \angles{mock-family} is the two-character designation for
+one of the font parameter templates (such as \texttt{tm}, \texttt{pl},
+or \texttt{bv}); the word `mock' refers to the fact that these fonts
+imitate but don't equal the actual fonts in this family.
+\angles{font-family} is the Berry family
+desgnation. Thus, if I create a Times-like set of fonts for use with
+font family \texttt{ptm}, I would find files \fil|ztmptm.sty| (\LaTeX)
+and \fil|ztmptm.tex| (plain). In the same way, the style files for
+mock-Palatino and mock-Baskerville fonts are named \texttt{zplppl} and
+\texttt{zbvmbv} (with the appropriate extensions). Style files for my
+Baskerville/Janson math fonts have names beginning with {\tt zbvmjn}.
+
+\subsection{Plain \TeX{}}
+At the top of your file, include the statement
+\begin{verbatim}
+\input ztmmnt
+\end{verbatim}
+(or whatever the style file name is). Then, standard font nicknames
+like {\tt\string\it} and {\tt\string\bf} and math toggles {\tt\$} and
+{\tt\$\$} will refer to these new fonts.
+
+If bold fonts have been generated, a command \verb!\boldface! typesets
+everything in its way in boldface---prose, mathematics, whatever.
+Bold math may be appropriate for bold captions, sections heads, and
+the like. Like any other font changing command, this command should
+be placed within grouping symbols.
+
+\subsection{\protect\LaTeX{} and NFSS}
+You simply need to include the style name as part of the list of
+packages that you use in the document. Thus, a typical document would
+have a statement like
+\begin{verbatim}
+\usepackage{ztmptm,epsf,pstricks,...}
+\end{verbatim}
+at the outset.
+
+If \mk{} has created bold math fonts for you, a \texttt{boldface}
+environment will typeset everything in that environment as bold,
+including all mathematics.
+
+Occasionally, you will need to find tune a file or two by hand. If
+your outline fonts have been installed using expert fonts, you may
+need to alter the \verb+\rmdefault+ command. It might be necessary,
+say to type
+\begin{verbatim}
+\rmdefault{ptmx}
+\end{verbatim}
+instead of \verb!\rmdefault{ptm}!.
+
+In files named like \texttt{OT1\angles{whatever}.fd} it may be
+necessary to replace the \texttt{bx} series designation by \texttt{b}.
+Or it may be necessary to add entries at the bottom instructing NFSS
+to substitute fonts in the \texttt{bx} series with fonts in a {\tt b}
+or {\tt sb} (bold or semibold) series.
+
+\section{Math support for other font families}
+The parameters for the font families are contained in files with names
+like \fil|tm.mkr|, \fil|tm.mks|, or
+\fil|tm.mkb|. The extensions refer to `\mk{}
+regular', `\mk{} semibold', or `\mk{} bold' sets of parameters. The
+current \mk{} assumes that you will be creating at most
+one of the set of bold or semibold fonts but not both.
+
+It was surprisingly easy to prepare these parameter files. I prepared
+a test document in which individual characters are printed on a
+baseline at a size of 750\thinspace pt. It's (relatively) easy to
+measure the dimensions of such large characters, and \mf\ can be asked
+to divide by~75 to compute the proper dimension for ten point fonts.
+It was particularly easy for me to make these measurements, as I use Tom
+Rokicki's superior implementation of \TeX{} for NeXTStep. This
+package contains onscreen calipers which take all the work out of this
+chore.
+
+If you plan to create your own parameter files for other font
+families, please use the supplied files as models. Make sure all
+measurements are given in terms of sharped points
+`\texttt{pt\#}'; \mk{} looks for
+this string. And please
+consider placing this information in {\sc ctan}.
+
+\section{In conclusion...}
+For additional information, please see the book {\it \TeX\ Unbound:
+\LaTeX\ and \TeX\ Strategies for Fonts, Graphics, and More} (1998) by
+Alan Hoenig, published by Oxford University Press.
+
+This software is issued as is, subject to the usual Gnu copyleft
+agreement.
+
+If you have any questions, comments, or bug reports, please send them
+along to me.
+
+\begin{flushright}
+Alan Hoenig\\
+Department of Mathematics,\\ John Jay College\\
+445 West 59 St.\\
+New York, NY 10019\\
+(516) 385-0736 or (212) 237-8858; \texttt{ajhjj@cunyvm.cuny.edu}\\[9pt]
+January 1998
+\end{flushright}
+
+\end{document}
diff --git a/fonts/utilities/mathkit/mkaccent.mf b/fonts/utilities/mathkit/mkaccent.mf
new file mode 100644
index 0000000000..ae037d68b0
--- /dev/null
+++ b/fonts/utilities/mathkit/mkaccent.mf
@@ -0,0 +1,219 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkaccent.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% This file contains accents common to text roman and italic fonts.
+% Character codes \0022--\0030, \0040, \0136--\0137, \0175--\0177 are generated.
+
+% (Actually the accents in positions \0040, \0137, and \0175 are not generated
+% unless |ligs>0|, since other symbols are substituted
+% for those accents in non-ligature fonts.)
+
+cmchar "Grave accent";
+beginchar(oct"022",9u#,min(asc_height#,2x_height#),0);
+adjust_fit(0,0);
+if serifs: pickup crisp.nib; x1-.5stem=hround 2u; x2=2/3[x1,w-x1];
+ y1+.5stem=h+eps; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ filldraw circ_stroke z1e--z2e; % diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ lft x1l=hround 1.5u; rt x2r=hround(.5w+.25u+.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Acute accent";
+beginchar(oct"023",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant-if serifs: 1.5 fi u#;
+adjust_fit(0,0);
+if serifs: pickup crisp.nib; x1+.5stem=hround(w-2u); x2=2/3[x1,w-x1];
+ y1+.5stem=h+eps; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ filldraw circ_stroke z1e--z2e; % diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ rt x1r=hround(w-1.5u); lft x2l=hround(.5w-.25u-.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Hachek (check) accent";
+beginchar(oct"024",9u#,.75[x_height#,min(asc_height#,2x_height#)],0);
+h':=vround min(asc_height,2x_height); % height of circumflex being inverted
+if serifs: italcorr h#*slant+.5hair#-1.75u#;
+ adjust_fit(0,0);
+ pickup crisp.nib; pos2'(.5[vair,curve],90); top y2'r=h;
+ pos2(.5[vair,curve],90); x2=.5w;
+ x1=w-x3=good.x 2.25u; top y1=top y3=h; y1-y2=.5(y2'-x_height);
+ pos1(hair,angle(z2-z1)+90); pos3(hair,angle(z3-z2)+90);
+ filldraw stroke z1e--z2e--z3e; % diagonals
+else: italcorr h#*slant-.5stem#+.5vair#-.75u#;
+ adjust_fit(0,0);
+ pickup fine.nib; pos1(vair,0); pos3(vair,0); x1=w-x3;
+ pos2(stem,0); bot y2=vround(1/12[x_height,h']+o); x2=.5w;
+ top y1=top y3=h+o; lft x1l=hround(rt x2r-3.25u-.5vair);
+ z0=whatever[z1r,z2r]=whatever[z2l,z3l];
+ y4l=y4r=y2; x4l=good.x .2[x2l,x2]; x4r=w-x4l;
+ filldraw z4l--z1l--z1r--z0--z3l--z3r--z4r--cycle; fi % diagonals
+penlabels(0,1,2,3,4); endchar;
+
+cmchar "Breve accent";
+beginchar(oct"025",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant+.5vair#-1.5u#;
+adjust_fit(0,0);
+pickup crisp.nib; pos1(vair,-180); pos3(vair,0);
+top y1=top y3=h; lft x1r=w-rt x3r=hround(2u-.5vair);
+numeric mid_thickness; mid_thickness=vround 1/3[vair,stem];
+pos2(mid_thickness,-90); x2=.5w;
+bot y2r=vround max(x_height+o+tiny,1/3[x_height,h]+o-.5mid_thickness);
+filldraw stroke z1e{down}...z2e{right}...{up}z3e; % stroke
+penlabels(1,2,3); endchar;
+
+cmchar "Macron (bar) accent";
+numeric macron_breadth#; macron_breadth#=.2[vair#,stem#];
+beginchar(oct"026",9u#,.4[x_height#,asc_height#]+macron_breadth#,0);
+italcorr h#*slant-.75u#;
+adjust_fit(0,0);
+numeric macron_breadth; macron_breadth:=Vround .2[vair,stem];
+pickup if serifs: crisp.nib else: fine.nib fi;
+pos1(macron_breadth,90); pos2(macron_breadth,90);
+top y1r=top y2r=h+o; lft x1=w-rt x2=hround 1.25u;
+filldraw stroke z1e--z2e; % bar
+penlabels(1,2); endchar;
+
+cmchar "Scandinavian circle accent";
+beginchar(oct"027",13u#+4/3(asc_height#-x_height#)*slant,asc_height#,0);
+adjust_fit(cap_serif_fit#,cap_serif_fit#);
+numeric circ_hair,circ_vair;
+circ_hair=hround min(hair,u+.5); circ_vair=vround min(vair,(h-x_height)/6+.5);
+penpos1(circ_vair,90); penpos3(circ_vair,-90);
+penpos2(circ_hair,180); penpos4(circ_hair,0);
+x2r=hround(.5w-1.5u-.5circ_hair);
+x4r=w-x2r; x1=x3=.5w; y1r=h+apex_o; y2=y4=.5[y1,y3];
+y3r=vround(1/3[x_height,h]+apex_o);
+penstroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
+ & pulled_arc.e(3,4) & pulled_arc.e(4,1) & cycle; % bowl
+penlabels(1,2,3,4); endchar;
+
+cmchar "Cedilla accent";
+beginchar(oct"030",8u#,0,.875desc_depth#);
+adjust_fit(0,0);
+x1=.5w+.5u;
+if serifs: pickup crisp.nib; pos1(stem,0); pos2(stem,0);
+ pos3(vair,90); pos4(stem,0); pos5(vair,-90);
+ x1=x2; z3l=z2l; x4=x2+1.5u; x5=x3-1.5u;
+ bot y1=-o; bot y2=-vround 2/7d-o; y4=.5[y3,y5]; bot y5=-d-o;
+ filldraw stroke z1e--z2e; % stem
+ filldraw stroke z3e{right}...z4e{down}...{left}z5e; % hook
+else: pickup fine.nib; pos1(vair,0); top y1=-o-2;
+ pos2(.5[vair,stem],0); bot y2=-d-o; x2=x1-1.25u;
+ filldraw stroke z1e--z2e; fi % diagonal
+penlabels(1,2,3,4,5); endchar;
+
+iff ligs>0: cmchar "Cross for Polish l and L";
+if unknown l_width#:
+ l_width#:=5u#+2serif_fit#; fi % nominal width of `l'
+if unknown L_stem#:
+ L_stem#:=cap_serif_fit#+max(2u#+.5cap_stem#,3u#); fi % center of `L' stem
+%ligtable oct"040": "l" kern -l_width#-2letter_fit#,
+% "L" kern -.5l_width#-L_stem#-2letter_fit#;
+beginchar(oct"040",l_width#,x_height#,0);
+adjust_fit(stem_shift#,-stem_shift#);
+pickup crisp.nib; x2-x1=max(4u,2.8u+stem); .5[x1,x2]=.5w;
+y1-.5bar=.2[bar_height,x_height]; y2+.5bar=.8[bar_height,x_height];
+numeric theta; theta=angle(z2-z1)+90;
+pos1(bar,theta); pos2(bar,theta);
+filldraw stroke z1e--z2e; % diagonal
+penlabels(1,2); endchar;
+
+cmchar "Circumflex (hat) accent";
+beginchar(oct"136",9u#,min(asc_height#,2x_height#),0);
+if serifs: italcorr .5[x_height#,h#]*slant+.5hair#-1.75u#;
+ adjust_fit(0,0);
+ pickup crisp.nib; pos2(.5[vair,curve],90); top y2r=h; x2=.5w;
+ x1=w-x3=good.x 2.25u; y1=y3=.5[x_height,y2];
+ pos1(hair,angle(z2-z1)+90); pos3(hair,angle(z3-z2)+90);
+ filldraw stroke z1e--z2e--z3e; % diagonals
+else: italcorr 2/3[x_height#,h#]*slant-.5stem#+.5vair#-.75u#;
+ adjust_fit(0,0);
+ pickup fine.nib; pos1(vair,0); pos3(vair,0); x1=w-x3;
+ pos2(stem,0); top y2=h; x2=.5w; bot y1=bot y3=vround 2/3[h,x_height]-eps;
+ lft x1l=hround(rt x2r-3.25u-.5vair); % same slope as in the acute accent
+ z0=whatever[z1r,z2r]=whatever[z2l,z3l];
+ y4l=y4r=y2; x4l=good.x .2[x2l,x2]; x4r=w-x4l;
+ filldraw z4l--z1l--z1r--z0--z3l--z3r--z4r--cycle; fi % diagonals
+penlabels(0,1,2,3,4); endchar;
+
+iff ligs>0: cmchar "Dot accent";
+numeric dot_diam#; dot_diam#=max(dot_size#,cap_curve#);
+beginchar(oct"137",5u#,min(asc_height#,10/7x_height#+.5dot_diam#),0);
+define_whole_blacker_pixels(dot_diam);
+italcorr h#*slant+.5dot_diam#-2u#;
+adjust_fit(0,0);
+pickup tiny.nib; pos1(dot_diam,0); pos2(dot_diam,90);
+x1=x2=.5w; top y2r=h+1;
+if bot y2l<x_height+o+slab: y2l:=min(y2r-eps,x_height+o+slab+.5tiny); fi
+y1=.5[y2l,y2r]; dot(1,2); % dot
+penlabels(1,2); endchar;
+
+iff ligs>0: cmchar "Long Hungarian umlaut accent";
+beginchar(oct"175",9u#,min(asc_height#,2x_height#),0);
+italcorr h#*slant-u#;
+adjust_fit(0,0);
+x3-x1=x4-x2=hround 3u; y3=y1; y4=y2;
+if serifs: pickup crisp.nib; x3+.5stem=hround(w-1.5u); x2=2.5u;
+ y1+.5stem=h; y2=max(2/3[h,x_height],x_height+o+hair);
+ numeric theta; theta=angle(z2-z1)+90;
+ pos1(stem,theta); pos2(hair,theta);
+ pos3(stem,theta); pos4(hair,theta);
+ filldraw circ_stroke z1e--z2e; % left diagonal
+ filldraw circ_stroke z3e--z4e; % right diagonal
+else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
+ pos3(stem,0); pos4(vair,0);
+ rt x3r=hround(w-1.5u); lft x4l=hround(.5w+u-.5vair);
+ top y1=h; bot y2=vround 2/3[h,x_height];
+ filldraw stroke z1e--z2e; % left diagonal
+ filldraw stroke z3e--z4e; fi % right diagonal
+penlabels(1,2,3,4); endchar;
+
+cmchar "Tilde (squiggle) accent";
+beginchar(oct"176",9u#,min(asc_height#,10/7x_height#+.5dot_size#),0);
+italcorr h#*slant-u#;
+adjust_fit(0,0);
+if serifs: numeric theta; theta=angle(1/6(6u-vair),1/4(h-x_height));
+ pickup crisp.nib; numeric mid_width; mid_width=.4[vair,stem];
+ pos1(vair,theta+90); pos2(vair,theta+90);
+ pos3(vair,theta+90); pos4(vair,theta+90);
+ z2-z1=z4-z3=(mid_width-crisp)*dir theta;
+ lft x1r=w-rt x4l=hround 1.5u; top y4r=h;
+ bot y1l=vround(bot y1l+min(2/3[x_height,h],y3l-.25vair)-top y1r);
+ pair delta; ypart delta=3(y3l-y1l); delta=whatever*dir theta;
+ filldraw z1l..controls(z1l+delta)and(z3l-delta)..z3l..z4l
+ --z4r..controls(z4r-delta)and(z2r+delta)..z2r..z1r--cycle; % stroke
+else: pickup fine.nib; pos1(vair,180); pos2(vair,90);
+ pos3(.5[vair,slab],90); pos4(vair,90); pos5(vair,180);
+ lft x1r=w-rt x5l=hround 1.5u; x2-x1=x3-x2=x4-x3=x5-x4;
+ bot y1=bot y4l=vround(.75[x_height,h]-vair);
+ top y2r=top y5=h; y3=.5[y2,y4];
+ filldraw stroke z1e{up}...z2e{right}..z3e..{right}z4e...{up}z5e; fi % stroke
+penlabels(1,2,3,4,5); endchar;
+
+cmchar "Umlaut (double dot) accent";
+numeric dot_diam#,dot_diam;
+dot_diam#=max(dot_size#,cap_curve#);
+beginchar(oct"177",9u#,min(asc_height#,10/7x_height#+.5dot_diam#),0);
+dot_diam=max(tiny.breadth,hround(max(dot_size,cap_curve)-2stem_corr));
+italcorr h#*slant+.5dot_diam#-2.25u#;
+adjust_fit(0,0);
+pickup tiny.nib; pos1(dot_diam,0); pos2(dot_diam,90);
+x1=x2=2.75u; top y2r=h+1;
+if bot y2l<x_height+o+slab: y2l:=min(y2r-eps,x_height+o+slab+.5tiny); fi
+y1=.5[y2l,y2r]; dot(1,2); % left dot
+pos3(dot_diam,0); penpos4(y2r-y2l,90); y3=y4=y1; x3=x4=w-x1;
+dot(3,4); % right dot
+penlabels(1,2,3,4); endchar;
diff --git a/fonts/utilities/mathkit/mkmathex.mf b/fonts/utilities/mathkit/mkmathex.mf
new file mode 100644
index 0000000000..3e713bbec5
--- /dev/null
+++ b/fonts/utilities/mathkit/mkmathex.mf
@@ -0,0 +1,22 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathex.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathex.mf' modified from `mathex.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math extension";
+mode_setup; font_setup;
+
+input bigdel; % large delimiters
+input bigop; % large operators
+input bigacc; % large accents
+
+font_x_height x_height#;
+font_quad 18u#+4letter_fit#;
+% (The calling file should give the other math extension font parameters.)
+bye.
diff --git a/fonts/utilities/mathkit/mkmathit.mf b/fonts/utilities/mathkit/mkmathit.mf
new file mode 100644
index 0000000000..c9a07848fd
--- /dev/null
+++ b/fonts/utilities/mathkit/mkmathit.mf
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathit.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathit.mf' modified from `mathit.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math italic";
+mode_setup; font_setup;
+
+%input romanu; % upper case (majuscules)
+%input itall; % lower case (minuscules)
+input greeku; % upper case greek letters
+input greekl; % lower case Greek letters
+input italms; % special symbols for math italic
+font_slant slant; font_x_height x_height#;
+font_quad 18u#+4letter_fit#;
+
+slant:=mono_charic#:=0; % the remaining characters will not be slanted
+currenttransform:=identity yscaled aspect_ratio scaled granularity;
+input olddig; % oldstyle numerals
+input romms; % roman math specials
+
+skewchar=oct"177"; skew#=.5u#;
+save comma;
+period=oct"72"; comma=oct"73"; slash=oct"75"; % non-ASCII positions
+%ligtable "h": skewchar kern -skew#;
+ligtable oct"027":oct"034": comma kern -u#, period kern -u#, % $\nu:\tau:$
+ "L":"g":"u":"v":"x": oct"013": oct"026": % $L:g:u:v:x:\alpha:\mu:$
+ oct"035":oct"173": skewchar kern skew#; % $\upsilon:\imath:$
+%ligtable "U": comma kern-2u#, period kern-2u#, % $U:$
+% slash kern-u#, skewchar kern skew#;
+%ligtable "K":oct"011": slash kern-u#, % $K:\it\Psi:$
+% oct"016":"r": comma kern-u#, period kern-u#, % $\delta:r:$
+% "D":"c":"e":"o":"s":"y":"z":oct"017": % $D:c:e:o:s:y:z:\epsilon:$
+% oct"021":oct"023":oct"037": skewchar kern 2skew#; % $\eta:\iota:\chi:$
+ligtable oct"007": slash kern-u#, % $\it\Upsilon:$
+ comma kern-2u#, period kern-2u#, skewchar kern 2skew#;
+ligtable oct"005":"H": slash kern-u#, % $\it\Pi:H:$
+ comma kern-u#, period kern-u#, skewchar kern 2skew#;
+%ligtable "N":"X": slash kern -1.5u#, % $N:X:$
+% "C":"T": slash kern -.5u#, comma kern -u#, period kern -u#, % $C:T:$
+% "B":"E":"G":"O":"Q":"R":oct"174": % $B:E:G:O:Q:R:\jmath:$
+% "l":"p":"q":"t":"w":oct"002":oct"004": % $l:p:q:t:w:\it\Theta:\Xi:$
+% oct"006":oct"010":oct"012":oct"014": % $\it\Sigma:\Phi:\Omega:\beta:$
+% oct"020":oct"022":oct"032":oct"036": % $\zeta:\theta:\rho:\phi:$
+% oct"042":oct"043":oct"045": % $\varepsilon:\vartheta:\varrho:$
+% oct"046":oct"047":oct"100": % $\varsigma:\varphi:\partial:$
+% skewchar kern 3skew#;
+%ligtable "M":"S":"Z": slash kern-u#, % $M:S:Z:$
+% comma kern-u#, period kern-u#, skewchar kern 3skew#;
+ligtable oct"000":"F":"P": slash kern -u#, % $\it\Gamma:F:P:$
+ comma kern-2u#, period kern-2u#, skewchar kern 3skew#;
+%ligtable "I":oct"030":oct"040":oct"140":oct"175": % $I:\xi:\psi:\ell:\wp:$
+% skewchar kern 4skew#;
+%ligtable "A": skewchar kern 5skew#; % $A:$
+%ligtable "d": "Y" kern u#, "Z" kern-u#, "j" kern-2u#, "f" kern-3u#, % $d:$
+% oct"001":oct"003": skewchar kern 6skew#; % $\it\Delta:\Lambda:$
+%ligtable "f": comma kern-u#, period kern-u#, skewchar kern 6skew#; % $f:$
+%ligtable "J": slash kern-u#, % $J:$
+% comma kern-2u#, period kern-2u#, skewchar kern 6skew#;
+%ligtable "j":oct"033": comma kern -u#, period kern -u#; % $j:\sigma:$
+%ligtable "V":"W":"Y":comma kern-3u#, period kern-3u#, % $V:W:Y:$
+% slash kern-2u#;
+%ligtable slash: oct"001" kern -u#, "A" kern -u#, "M" kern -u#, % $/:$
+% "N" kern -u#, "Y" kern +u#, "Z" kern -u#;
+bye.
diff --git a/fonts/utilities/mathkit/mkmathsy.mf b/fonts/utilities/mathkit/mkmathsy.mf
new file mode 100644
index 0000000000..1ea37670a8
--- /dev/null
+++ b/fonts/utilities/mathkit/mkmathsy.mf
@@ -0,0 +1,38 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkmathsy.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file `mkmathsy.mf' modified from `mathsy.mf' to NOT pick
+%% up letters. It is for use by MathKit.
+
+font_coding_scheme:="TeX math symbols";
+mode_setup; font_setup;
+
+autorounding:=hair;
+input calu; % upper case calligraphic alphabet
+autorounding:=0;
+
+font_slant slant; font_x_height x_height#;
+font_quad 18u# if not monospace:+4letter_fit# fi;
+% (The spacing is zero so that \TeX\ will always add the italic correction.)
+% (The calling file should give the other math symbol font parameters.)
+
+slant:=mono_charic#:=0; % the remaining characters will not be slanted
+currenttransform:=identity yscaled aspect_ratio scaled granularity;
+input symbol; % the symbols
+
+if not monospace:
+ skewchar=oct"060"; skew#=.5u#;
+ ligtable "I": "T": "V": skewchar kern skew#;
+ ligtable "K": skewchar kern 2skew#;
+ ligtable "D": "N": "P": "R": "U": "W": "Y": skewchar kern 3skew#;
+ ligtable "E": "F": "G": "H": "O": "Q": skewchar kern 4skew#;
+ ligtable "B": "C": "L": "M": "S": "X": "Z": skewchar kern 5skew#;
+ ligtable "J": skewchar kern 6skew#;
+ ligtable "A": skewchar kern 7skew#;
+fi;
+bye.
diff --git a/fonts/utilities/mathkit/mkroman.mf b/fonts/utilities/mathkit/mkroman.mf
new file mode 100644
index 0000000000..8bc6c68e6b
--- /dev/null
+++ b/fonts/utilities/mathkit/mkroman.mf
@@ -0,0 +1,73 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file mkroman.mf, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This driver file is modified from `roman.mf' to NOT generate
+%% letters. It is for use by MathKit.
+
+if ligs>1: font_coding_scheme:="TeX text";
+ spanish_shriek=oct"074"; spanish_query=oct"076";
+else: font_coding_scheme:=if ligs=0: "TeX typewriter text"
+ else: "TeX text without f-ligatures" fi;
+ spanish_shriek=oct"016"; spanish_query=oct"017"; fi
+
+mode_setup; font_setup;
+
+%input romanu; % upper case (majuscules)
+%input romanl; % lower case (minuscules)
+input greeku; % upper case Greek letters
+input romand; % numerals
+input romanp; % ampersand, question marks, currency sign
+%input romspl; % lowercase specials (dotless \i, ligature \ae, etc.)
+%input romspu; % uppercase specials (\AE, \OE, \O)
+input punct; % punctuation symbols common to roman and italic text
+input mkaccent; % accents common to roman and italic text
+%if ligs>1: input romlig; fi % letter ligatures
+%if ligs>0: input comlig; fi % ligatures common with italic text
+%if ligs<=1: input romsub; fi % substitutes for ligatures
+
+%ligtable "!": "`" =: spanish_shriek;
+%ligtable "?": "`" =: spanish_query;
+%font_slant slant; font_x_height x_height#;
+%if monospace: font_normal_space 9u#; % no stretching or shrinking
+% font_quad 18u#;
+% font_extra_space 9u#;
+%else: font_normal_space 6u#+2letter_fit#;
+% font_normal_stretch 3u#; font_normal_shrink 2u#;
+% font_quad 18u#+4letter_fit#;
+% font_extra_space 2u#;
+% k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
+% ligtable "k": if serifs: "v": "a" kern -u#, fi\\"w": "e" kern k#,
+% "a" kern k#, "o" kern k#, "c" kern k#;
+% ligtable "P": "A" kern kk#,
+% "y": "o" kern k#, "e" kern k#, "a" kern k#, "." kern kk#, "," kern kk#;
+% ligtable "F": "V": "W": if serifs: "o" kern kk#, "e" kern kk#, "u" kern kk#,
+% "r" kern kk#, "a" kern kk#, "A" kern kkk#,
+% else: "o" kern k#, "e" kern k#, "u" kern k#,
+% "r" kern k#, "a" kern k#, "A" kern kk#, fi
+% "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#;
+% ligtable "T": "y" kern if serifs: k# else: kk# fi,
+% "Y": "e" kern kk#, "o" kern kk#,
+% "r" kern kk#, "a" kern kk#, "A" kern kk#, "u" kern kk#;
+% ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#,
+% "V" kern k#, "Y" kern k#;
+% if serifs: ligtable "h": "m": "n":
+% "t" kern k#, "u" kern k#, "b" kern k#, "y" kern k#, "v" kern k#, "w" kern k#;
+% ligtable "c": "h" kern k#, "k" kern k#; fi
+% ligtable "o": "b": "p": "e" kern -k#, "o" kern -k#, "x" kern k#,
+% "d" kern -k#, "c" kern -k#, "q" kern -k#,
+% "a": if serifs: "v" kern k#, "j" kern u#, else: "r" kern k#, fi
+% "t": "y" kern k#,
+% "u": "w" kern k#;
+% ligtable "A": if serifs: "R": fi\\ "t" kern k#,
+% "C" kern k#, "O" kern k#, "G" kern k#, "U" kern k#, "Q" kern k#,
+% "L": "T" kern kk#, "Y" kern kk#, "V" kern kkk#, "W" kern kkk#;
+% ligtable "g": "j" kern -k#; % logjam
+% ligtable "I": "I" kern -k#; fi % Richard III
+% % there are ligature/kern programs for |"f"| in the {\tt romlig} file
+% % and for |"-"|, |"`"|, and |"'"| in the {\tt comlig} file
+bye.
diff --git a/fonts/utilities/mathkit/pl.mkr b/fonts/utilities/mathkit/pl.mkr
new file mode 100644
index 0000000000..81673f142f
--- /dev/null
+++ b/fonts/utilities/mathkit/pl.mkr
@@ -0,0 +1,51 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file pl.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=545/75pt#; % height of tallest characters
+asc_height#:=546/75pt#; % height of lowercase ascenders
+cap_height#:=520/75pt#; % height of caps
+fig_height#:=514/75pt#; % height of numerals
+x_height#:=347/75pt#; % height of lowercase without ascenders
+math_axis#:=95/36pt#; % axis of symmetry for math symbols
+bar_height#:=175/75pt#; % height of crossbar in lowercase e
+comma_depth#:=116/75pt#; % depth of comma below baseline
+desc_depth#:=209/75pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/75pt#; % diameter of rounded corners
+fine#:=0/75pt#; % diameter of sharply rounded corners
+thin_join#:=40/75pt#; % width of extrafine details
+hair#:=40/75pt#; % lowercase hairline breadth
+stem#:=64/75pt#; % lowercase stem breadth
+curve#:=66/75pt#; % lowercase curve breadth
+ess#:=69/75pt#; % breadth in middle of lowercase s
+flare#:=57/75pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=84/75pt#; % diameter of dots
+cap_hair#:=32/75pt#; % uppercase hairline breadth
+cap_stem#:=71/75pt#; % uppercase stem breadth
+cap_curve#:=82/75pt#; % uppercase curve breadth
+cap_ess#:=68/75pt#; % breadth in middle of uppercase s
+rule_thickness#:=.6pt#; % thickness of lines in math symbols
+
+dish#:=2.4/75pt#; % amount erased at top or bottom of serifs
+bracket#:=29/75pt#; % vertical distance from serif base to tangent
+jut#:=63/75pt#; % protrusion of lowercase serifs
+cap_jut#:=74/75pt#; % protrusion of uppercase serifs
+beak_jut#:=0/75pt#; % horizontal protrusion of beak serifs
+beak#:=85/75pt#; % vertical protrusion of beak serifs
+vair#:=40/75pt#; % vertical diameter of hairlines
+bar#:=37/75pt#; % lowercase bar thickness
+slab#:=23/75pt#; % serif and arm thickness
+cap_bar#:=32/75pt#; % uppercase bar thickness
+cap_band#:=29/75pt#; % uppercase thickness above/below lobes
+serif_drop#:=27/75pt#; % vertical drop of sloped serifs
+
+o#:=14/75pt#; % amount of overshoot for curves
+apex_o#:=5/75pt#; % amount of overshoot for diagonal junctions
+
+slant:=.176; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/readme b/fonts/utilities/mathkit/readme
new file mode 100644
index 0000000000..8c2485654f
--- /dev/null
+++ b/fonts/utilities/mathkit/readme
@@ -0,0 +1,28 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file readme, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The _MathKit_ package (version 0.7) creates math fonts that match
+Type1 outline fonts (Times, Palatino, and others) for
+typesetting math with TeX. It constructs these fonts by
+combining letters and numerals from the outline
+fonts with other symbols drawn by Metafont using
+parameters that match the outline fonts. Detailed
+instructions are found in the file `mathkit.tex', part of
+the package. You don't need to know anything about
+Metafont or virtual fonts to use this package.
+
+The package includes parameter templates for building
+font families for Times Roman (regular and bold),
+Palatino (regular only), and Monotype Baskerville
+(regular and semibold). If you choose to make fonts
+using the bold templates, you will be able to typeset
+bold mathematics as well. MathKit produces style files
+for plain TeX and NFSS so you can use your new fonts.
+
+ ---Alan Hoenig (ajhjj@cunyvm.cuny.edu)
+ January, 1998
diff --git a/fonts/utilities/mathkit/rhax.mtx b/fonts/utilities/mathkit/rhax.mtx
new file mode 100644
index 0000000000..8ed49431bb
--- /dev/null
+++ b/fonts/utilities/mathkit/rhax.mtx
@@ -0,0 +1,62 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file rhax.mtx, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Based on work by Aloysius G. Helminck. All rights reserved.
+
+\relax
+
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.315}
+
+%%% If you want the math to be less tight, then set the letterspacing.
+%%% The standard is 0.
+%\setint{letterspacing}{20}
+
+% \shiftglyph takes four parameters:
+%
+% #1 the name of the glyph
+% #2 the amount of extra space at the left
+% #3 the amount of extra space at the right
+% #4 the amount of extra space for subscripts
+
+\setcommand\shiftglyph#1#2#3#4{
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \movert{#2}
+ \glyph{#1}{1000}
+ \movert{#4}
+ \resetitalic{\add{\italic{#1}}{\sub{#3}{#4}}}
+ \endresetglyph
+ \fi
+}
+
+% \shiftglyph{parenleft}{25}{10}{0}
+% \shiftglyph{parenright}{40}{0}{0}
+% \shiftglyph{grave}{1}{1}{0}
+% \shiftglyph{acute}{1}{1}{0}
+% \shiftglyph{caron}{1}{1}{0}
+% \shiftglyph{breve}{1}{1}{0}
+% \shiftglyph{macron}{1}{1}{0}
+% \shiftglyph{circumflex}{1}{1}{0}
+% \shiftglyph{dotaccent}{1}{1}{0}
+% \shiftglyph{tilde}{1}{1}{0}
+% \shiftglyph{dieresis}{1}{1}{0}
+% \shiftglyph{overbar}{1}{1}{0}
+% \shiftglyph{tie}{1}{1}{0}
+
+
+\endmetrics
+
+
+
+
+ \ No newline at end of file
diff --git a/fonts/utilities/mathkit/testmath.mk b/fonts/utilities/mathkit/testmath.mk
new file mode 100644
index 0000000000..65b060866b
--- /dev/null
+++ b/fonts/utilities/mathkit/testmath.mk
@@ -0,0 +1,364 @@
+%&latex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file testmath.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+
+\renewcommand{\encodingdefault}{OT1}
+
+\usepackage{z<mock><fam>}
+
+\title{A \LaTeX\ math test document}
+\author{for fonts installed by MathKit}
+
+\raggedbottom
+
+\font\TTT=cmr7 \newcount\cno
+\def\TT{\T\setbox0=\hbox{\char\cno}\ifdim\wd0>0pt
+ \box0\lower4pt\hbox{\TTT\the\cno}\else
+ \ifdim\ht0>0pt \box0\lower4pt\hbox{\TTT\the\cno}\fi\fi
+ \global\advance\cno by1
+}
+\def\showfont#1{\font\T=#1 at 10pt\global\cno=0
+ \tabskip1pt plus2pt minus1pt\halign to\textwidth{&\hss\TT ##\hss\cr
+ \multispan{16}\hfil \tt Font #1\hfil\cr\noalign{\smallskip}
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+}}
+\newcommand{\testsize}[1]{
+ #1 \texttt{\string#1}: \(a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2},
+ a_{0_a}, 0_{a_0},
+ \sum_{i=0}^\infty\) \\
+}
+
+\newcommand{\testdelims}[3]{\sqrt{
+ #1|#1\|#1\uparrow
+ #1\downarrow#1\updownarrow#1\Uparrow#1\Downarrow
+ #1\Updownarrow#1\lfloor#1\lceil
+ #1(#1\{#1[#1\langle
+ #3
+ #2\rangle#2]#2\}#2)
+ #2\rceil#2\rfloor#2\Updownarrow#2\Downarrow
+ #2\Uparrow#2\updownarrow#2\downarrow#2\uparrow
+ #2\|#2|
+}\\}
+
+\newcommand{\testglyphs}[1]{
+\begin{quote}
+ #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m
+ #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z
+ #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M
+ #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z
+ #10#11#12#13#14#15#16#17#18#19
+ #1\Gamma#1\Delta#1\Theta#1\Lambda#1\Xi
+ #1\Pi#1\Sigma#1\Upsilon#1\Phi#1\Psi#1\Omega
+ #1\alpha#1\beta#1\gamma#1\delta#1\epsilon
+ #1\varepsilon#1\zeta#1\eta#1\theta#1\vartheta
+ #1\iota#1\kappa#1\lambda#1\mu#1\nu#1\xi#1\omicron
+ #1\pi#1\varpi#1\rho#1\varrho
+ #1\sigma#1\varsigma#1\tau#1\upsilon#1\phi
+ #1\varphi#1\chi#1\psi#1\omega
+ #1\partial#1\ell#1\imath#1\jmath#1\wp
+\end{quote}
+}
+
+\newcommand{\sidebearings}[1]{ \(|#1|\) }
+\newcommand{\subscripts}[1]{ \(#1_\circ\) }
+\newcommand{\supscripts}[1]{ \(#1^\circ\) }
+\newcommand{\scripts}[1]{ \(#1^\circ_\circ\) }
+\newcommand{\vecaccents}[1]{ \(\vec#1\) }
+\newcommand{\tildeaccents}[1]{ \(\tilde#1\) }
+
+\ifx\omicron\undefined
+ \let\omicron=o
+\fi
+
+\begin{document}
+
+\maketitle
+
+\subsection*{Introduction}
+
+This document tests the math capabilities of a math package, and is
+strongly modelled after a similar document by Alan Jeffrey.
+This test exercises the {\tt <mock>} math fonts combined with the
+{\tt <fam>} text fonts.
+
+\showfont{<fam>r<m>7t}
+\smallskip
+\showfont{<fam>r<m>7m}
+\smallskip
+\showfont{<mock>sy10}
+\smallskip
+\showfont{<mock>ex10}
+\smallskip
+
+\subsection*{Fonts}
+
+Math italic:
+\[
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz
+\]
+Text italic:
+\[
+ \mathit{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\]
+Roman:
+\[
+ \mathrm{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+\]
+[b]Bold:
+[b]\[
+[b] \mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[b] abcdefghijklmnopqrstuvwxyz}
+[b]\]
+[b]{\mathversion{boldmath}
+[b]\[
+[b] \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma
+[b] \Upsilon\Phi\Psi\Omega
+[b]\]}
+[tt]Typewriter:
+[tt]\[
+[tt] \mathtt{ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[tt] abcdefghijklmnopqrstuvwxyz}
+[tt]\]
+Greek:
+\[
+ \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+ \alpha\beta\gamma\delta\epsilon\varepsilon\zeta\eta\theta\vartheta
+ \iota\kappa\lambda\mu\nu\xi\omicron\pi\varpi\rho\varrho
+ \sigma\varsigma\tau\upsilon\phi\varphi\chi\psi\omega
+\]
+Calligraphic:
+\[A\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\]
+Sans:
+\[
+ A\mathsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \quad
+ a\mathsf{abcdefghijklmnopqrstuvwxyz}z
+\]
+[fr]Fraktur:
+[fr]\[
+[fr] A\mathfr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z \quad
+[fr] a\mathfr{abcdefghijklmnopqrstuvwxyz}z
+[fr]\]
+[bb]Blackboard Bold:
+[bb]\[
+[bb] A\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+[bb]\]
+Do these line up appropriately?
+\[
+ \forall \mathcal{B} \Gamma
+[b]\mathbf{D}
+ \exists
+[tt]\mathtt{F}
+ G \mathcal{H} \Im
+[b]\mathbf{J}
+ \mathsf{K} \Lambda
+ M \aleph \emptyset \Pi \mathit{Q} \Re \Sigma
+[tt]\mathtt{T}
+ \Upsilon \mathcal{V}
+[b]\mathbf{W}
+ \Xi \mathsf{Y} Z
+ \quad
+ a
+[b]\mathbf{c}
+ \epsilon
+[tt]\mathtt{i}
+ \kappa
+[b]\mathbf{m}
+ \nu o \varpi \mathsf{r}
+ s \tau \mathit{u} v \mathsf{w} z
+ \quad
+[tt]\mathtt{g}
+ j \mathsf{q} \chi y
+ \quad
+ b \delta
+[b]\mathbf{f}
+[tt]\mathtt{h}
+ k \mathsf{l} \phi
+\]
+
+\subsection*{Accents}
+
+\[
+\hbox{%
+ \'o \`o \^o \"o \~o \=o \.o \u o \v o
+ \H o \t oo \c o \d o \b o \t oo}
+ \quad
+ \hat o \check o \tilde o \acute o \grave o \dot o
+ \ddot o
+ \breve o \bar o \vec o \vec h \hbar
+\]
+
+\subsection*{Glyph dimensions}
+
+These glyphs should be optically centered:
+ \testglyphs\sidebearings
+These subscripts should be correctly placed:
+ \testglyphs\subscripts
+These superscripts should be correctly placed:
+ \testglyphs\supscripts
+These subscripts and superscripts should be correctly placed:
+ \testglyphs\scripts
+These accents should be centered:
+ \testglyphs\vecaccents
+As should these:
+ \testglyphs\tildeaccents
+
+\subsection*{Symbols}
+
+These arrows should join up properly:
+\[
+ a \hookrightarrow b \hookleftarrow c \longrightarrow d
+ \longleftarrow e \Longrightarrow f \Longleftarrow g
+ \longleftrightarrow h \Longleftrightarrow i
+ \mapsto j
+\]
+\[
+ g^\circ \mapsto g^\bullet\quad x\equiv y\not\equiv z
+\]
+These symbols should be of similar weights:
+\[
+ \pm + - \mp = / \backslash ( \langle [ \{ \} ] \rangle ) < \leq > \geq
+\]
+Are these the same size?
+\[\textstyle
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+\]
+Are these?
+\[
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+\]
+
+
+\subsection*{Sizing}
+
+\[
+ abcde + x^{abcde} + 2^{x^{abcde}}
+\]
+
+The subscripts should be appropriately sized:
+\begin{quote}
+%\testsize\tiny
+%\testsize\scriptsize
+%\testsize\footnotesize
+%\testsize\small
+\testsize\normalsize
+%\testsize\large
+%\testsize\Large
+%\testsize\LARGE
+%\testsize\huge
+%\testsize\Huge
+\end{quote}
+
+\subsection*{Delimiters}
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with \verb|\big|, etc:
+\[\begin{array}{c}
+ \testdelims\relax\relax{a}
+ \testdelims\bigl\bigr{a}
+ \testdelims\Bigl\Bigr{a}
+ \testdelims\biggl\biggr{a}
+ \testdelims\Biggl\Biggr{a}
+\end{array}\]
+Then with \verb|\left| and \verb|\right|:
+\[\begin{array}{c}
+ \testdelims\left\right{\begin{array}{c} a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a\\a \end{array}}
+ \testdelims\left\right{\begin{array}{c} a\\a\\a\\a \end{array}}
+\end{array}\]
+
+\subsection*{Spacing}
+
+This paragraph should appear to be a monotone grey texture. Suppose
+\(f \in \mathcal{S}_n\) and \(g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)\). Then \(g \in \mathcal{S}_n\); now (\emph{c}) implies
+that \(\hat g = D_\alpha \hat f\) and \(P \cdot D_\alpha\hat
+f = P \cdot \hat g = (P(D)g)\hat{}\), which is a bounded function,
+since \(P(D)g \in L^1(R^n)\). This proves that \(\hat f \in
+\mathcal S_n\). If \(f_i \rightarrow f\) in \(\mathcal S_n\),
+then \(f_i \rightarrow f\) in \(L^1(R^n)\). Therefore \(\hat
+f_i(t) \rightarrow \hat f(t)\) for all \(t \in R^n\). That \(f
+\rightarrow \hat f\) is a \emph{continuous} mapping of
+\(\mathcal S_n\) into \(\mathcal S_n\) follows now from the
+closed graph theorem. And thus for \(x_1\) through \(x_i\).
+\emph{Functional Analysis}, W.~Rudin,
+McGraw--Hill, 1973.
+
+[b]\begin{boldface}
+[b]This paragraph should appear to be a monotone dark texture. Suppose
+[b]\(f \in \mathcal{S}_n\) and \(g(x) = (-1)^{|\alpha|}x^\alpha
+[b]f(x)\). Then \(g \in \mathcal{S}_n\); now (\emph{c}) implies
+[b]that \(\hat g = D_\alpha \hat f\) and \(P \cdot D_\alpha\hat
+[b]f = P \cdot \hat g = (P(D)g)\hat{}\), which is a bounded function,
+[b]since \(P(D)g \in L^1(R^n)\). This proves that \(\hat f \in
+[b]\mathcal S_n\). If \(f_i \rightarrow f\) in \(\mathcal S_n\),
+[b]then \(f_i \rightarrow f\) in \(L^1(R^n)\). Therefore \(\hat
+[b]f_i(t) \rightarrow \hat f(t)\) for all \(t \in R^n\). That \(f
+[b]\rightarrow \hat f\) is a \emph{continuous} mapping of
+[b]\(\mathcal S_n\) into \(\mathcal S_n\) follows now from the
+[b]closed graph theorem. And thus for \(x_1\) through \(x_i\).
+[b]\emph{Functional Analysis}, W.~Rudin, McGraw--Hill, 1973.
+[b]\end{boldface}
+
+{\itshape This paragraph should appear to be a monotone grey texture.
+Suppose \(f \in \mathcal{S}_n\) and \(g(x) =
+(-1)^{|\alpha|}x^\alpha f(x)\). Then \(g \in \mathcal{S}_n\);
+now (\emph{c}) implies that \(\hat g = D_\alpha \hat f\) and
+\(P \cdot D_\alpha\hat f = P \cdot \hat g = (P(D)g)\hat{}\),
+which is a bounded function, since \(P(D)g \in L^1(R^n)\). This
+proves that \(\hat f \in \mathcal S_n\). If \(f_i \rightarrow
+f\) in \(\mathcal S_n\), then \(f_i \rightarrow f\) in
+\(L^1(R^n)\). Therefore \(\hat f_i(t) \rightarrow \hat f(t)\)
+for all \(t \in R^n\). That \(f \rightarrow \hat f\) is a
+\emph{continuous} mapping of \(\mathcal S_n\) into \(\mathcal
+S_n\) follows now from the closed graph theorem. \emph{Functional
+Analysis}, W.~Rudin, McGraw--Hill, 1973.}
+
+The text in these boxes should spread out as much as the math does:
+\[\begin{array}{c}
+ \framebox[.95\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[.975\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.025\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.05\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.075\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.1\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+ \framebox[1.125\width][s]{For example \(x+y = \min\{x,y\}
+ + \max\{x,y\}\) is a formula.} \\
+\end{array}\]
+\end{document}
diff --git a/fonts/utilities/mathkit/testmatp.mk b/fonts/utilities/mathkit/testmatp.mk
new file mode 100644
index 0000000000..70ae6c551d
--- /dev/null
+++ b/fonts/utilities/mathkit/testmatp.mk
@@ -0,0 +1,338 @@
+%&plain
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file testmatp.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\font\TTT=cmr7 \newcount\cno
+\def\TT{\T\setbox0=\hbox{\char\cno}\ifdim\wd0>0pt
+ \box0\lower4pt\hbox{\TTT\the\cno}\else
+ \ifdim\ht0>0pt \box0\lower4pt\hbox{\TTT\the\cno}\fi\fi
+ \global\advance\cno by1
+}
+\def\showfont#1{\font\T=#1 at 10pt\global\cno=0
+ \tabskip1pt plus2pt minus1pt\halign to\hsize{&\hss\TT ##\hss\cr
+ \multispan{16}\hfil \tt Font #1\hfil\cr\noalign{\smallskip}
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+ &&&&&&&&&&&&&&&\cr
+}}
+
+%% This is a `plain tex-ified' version of Alan Jeffrey's
+%% testmath.tex.
+
+\input z<mock><fam>
+\advance\hsize by -4pc
+
+
+\centerline{\bf A Plain Math Test Document}\medskip
+\centerline{for fonts installed by MathKit}\bigskip
+\centerline{\it <currdate>}
+
+\raggedbottom
+
+\def\framebox[#1]#2{%
+ \setbox0=\hbox{#2}\dimen0=\wd0
+ \vbox{\hrule\hbox to#1\dimen0{\vrule\vrule width0pt height8pt depth2pt
+ #2\vrule}\hrule}}
+\def\testsize#1{
+ {\tt\string#1}: $a_{c_e}, b_{d_f}, C_{E_G}, 0_{1_2}, X^{X^X}_{X_X},
+ a_{0_a}, 0_{a_0}, E=mc^2, X_{E=mc^2}, X_{X_{E=mc^2}},
+ \sum_{i=0}^\infty$
+}
+
+\def\testdelims#1#2#3{\sqrt{
+ #1|#1\|#1\uparrow
+ #1\downarrow#1\updownarrow#1\Uparrow#1\Downarrow
+ #1\Updownarrow#1\lfloor#1\lceil
+ #1(#1\{#1[#1\langle
+ #3
+ #2\rangle#2]#2\}#2)
+ #2\rceil#2\rfloor#2\Updownarrow#2\Downarrow
+ #2\Uparrow#2\updownarrow#2\downarrow#2\uparrow
+ #2\|#2|
+}\cr}
+
+\def\testglyphs#1{
+\endgraf
+\bgroup\narrower\noindent
+ #1a#1b#1c#1d#1e#1f#1g#1h#1i#1j#1k#1l#1m
+ #1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z
+ #1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M
+ #1N#1O#1P#1Q#1R#1S#1T#1U#1V#1W#1X#1Y#1Z
+ #10#11#12#13#14#15#16#17#18#19
+ #1\Gamma#1\Delta#1\Theta#1\Lambda#1\Xi
+ #1\Pi#1\Sigma#1\Upsilon#1\Phi#1\Psi#1\Omega
+ #1\alpha#1\beta#1\gamma#1\delta#1\epsilon
+ #1\varepsilon#1\zeta#1\eta#1\theta#1\vartheta
+ #1\iota#1\kappa#1\lambda#1\mu#1\nu#1\xi#1\omicron
+ #1\pi#1\varpi#1\rho#1\varrho
+ #1\sigma#1\varsigma#1\tau#1\upsilon#1\phi
+ #1\varphi#1\chi#1\psi#1\omega
+ #1\partial#1\ell#1\imath#1\jmath#1\wp
+\endgraf
+\egroup
+}
+
+\def\sidebearings#1{ $|#1|$ }
+\def\subscripts#1{ $#1_\circ$ }
+\def\supscripts#1{ $#1^\circ$ }
+\def\scripts#1{ $#1^\circ_\circ$ }
+\def\vecaccents#1{ $\vec#1$ }
+\def\tildeaccents#1{ $\tilde#1$ }
+
+\ifx\omicron\undefined
+ \let\omicron=o
+\fi
+
+\beginsection Introduction
+
+This document (based on a similar document created by Alan Jeffrey)
+tests the math capabilities of a math package for plain \TeX. The math
+package combines the {\tt <mock>} math fonts with the {\tt <fam>}
+text fonts.
+
+\showfont{<fam>r<m>7t}
+\smallskip
+\showfont{<fam>r<m>7m}
+\smallskip
+\showfont{<mock>sy10}
+\smallskip
+\showfont{<mock>ex10}
+
+\beginsection Fonts
+
+Math italic:
+$$
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz
+$$
+Text italic:
+$$
+ {\it ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+Roman:
+$$
+ {\rm ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+[tt]Typewriter:
+[tt]$$
+[tt] {\tt ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[tt] abcdefghijklmnopqrstuvwxyz}
+[tt]$$
+Bold:
+$$
+ {\bf ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyz}
+$$
+[b]{\boldface
+[b]$$
+[b] \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+[b]$$
+[b]}
+Calligraphic:
+$$
+ A{\cal ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+$$
+Sans:
+$$
+ A{\sf ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\ a{\sf abcdefghijklmnopqrstuvwxyz}z
+$$
+[fr]Fraktur:
+[fr]$$
+[fr] A{\frak ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z\ a{\frak abcdefghijklmnopqrstuvwxyz}z
+[fr]$$
+[bb]Blackboard Bold:
+[bb]$$
+[bb] A{\bb ABCDEFGHIJKLMNOPQRSTUVWXYZ}Z
+[bb]$$
+Greek:
+$$
+ \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega
+ \alpha\beta\gamma\delta\epsilon\varepsilon\zeta\eta\theta\vartheta
+ \iota\kappa\lambda\mu\nu\xi\omicron\pi\varpi\rho\varrho
+ \sigma\varsigma\tau\upsilon\phi\varphi\chi\psi\omega
+$$
+Do these line up appropriately?
+$$
+ \forall {\cal B} \Gamma {\bf D} \exists
+[tt]{\tt F}
+ G {\cal H} \Im {\bf J} {\sf K} \Lambda
+ M \aleph \emptyset \Pi {\it Q} \Re \Sigma
+[tt]{\tt T}
+ \Upsilon {\cal V} {\bf W} \Xi
+ {\sf Y} Z
+ \quad
+ a {\bf c} \epsilon
+[tt]{\tt i}
+ \kappa {\bf m} \nu o \varpi {\sf r}
+ s \tau {\it u} v {\sf w} z
+ \quad
+[tt]{\tt g}
+ j {\sf q} \chi y
+ \quad
+ b \delta {\bf f}
+[tt]{\tt h}
+ k {\sf l} \phi
+$$
+
+\beginsection Glyph dimensions
+
+These glyphs should be optically centered:
+ \testglyphs\sidebearings
+\noindent These subscripts should be correctly placed:
+ \testglyphs\subscripts
+\noindent These superscripts should be correctly placed:
+ \testglyphs\supscripts
+\noindent These subscripts and superscripts should be correctly placed:
+ \testglyphs\scripts
+\noindent These accents should be centered:
+ \testglyphs\vecaccents
+\noindent As should these:
+ \testglyphs\tildeaccents
+\noindent And here are accents in general:
+ \'o \`o \^o \"o \~o \=o \.o \u o \v o \H o
+ \t oo \c o \d o \b o \quad
+ $\hat o \check o \tilde o \acute o \grave o \dot o
+ \ddot o \breve o \bar o \vec o \vec h \hbar$
+
+\beginsection Symbols
+
+These arrows should join up properly:
+$$
+ a \hookrightarrow b \hookleftarrow c \longrightarrow d
+ \longleftarrow e \Longrightarrow f \Longleftarrow g
+ \longleftrightarrow h \Longleftrightarrow i
+ \mapsto j
+$$
+These symbols should of similar weights:
+$$
+ \pm + - \mp = / \backslash ( \langle [ \{ \} ] \rangle ) < \leq > \geq
+$$
+Are these the same size?
+$$\textstyle
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+$$
+Are these?
+$$
+ \oint \int \quad
+ \bigodot \bigoplus \bigotimes \sum \prod
+ \bigcup \bigcap \biguplus \bigwedge \bigvee \coprod
+$$
+
+
+\beginsection Sizing
+
+$$
+ abcde + x^{abcde} + 2^{x^{abcde}}
+$$
+
+The subscripts should be appropriately sized:
+
+{\narrower\noindent\bodyfonts
+\testsize\bodyfonts \endgraf
+}
+
+\beginsection Delimiters
+
+Each row should be a different size, but within each row the delimiters
+should be the same size. First with {\tt\string\big}, etc:
+$$\vbox{\halign{\hfil$#$\hfil\cr
+ \testdelims\relax\relax{a}
+ \testdelims\bigl\bigr{a}
+ \testdelims\Bigl\Bigr{a}
+ \testdelims\biggl\biggr{a}
+ \testdelims\Biggl\Biggr{a}
+}}$$
+Then with {\tt\string\left} and {\tt\string\right}:
+$$\vbox{\halign{\hfil$#$\hfil\cr
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a\cr a \cr}}}}
+ \testdelims\left\right{\vcenter{{\halign{\hss$#$\hss\cr a\cr a\cr a\cr a \cr}}}}
+}}$$
+
+\beginsection Spacing
+
+This paragraph should appear to be a monotone grey texture.
+Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)$. Then $g \in {\cal S}_n$; now ({\bf c}) implies that $\hat
+g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+(P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+\in R^n$. That $f \rightarrow \hat f$ is a {\it continuous\/} mapping
+of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+graph theorem. And thus for $x_1$ through $x_i$.
+{\bf Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973.
+
+[b]{\boldface
+[b]This paragraph should appear to be a monotone dark texture.
+[b]Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+[b]f(x)$. Then $g \in {\cal S}_n$; now (c) implies that $\hat
+[b]g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+[b](P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+[b]L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+[b]\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+[b]$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+[b]\in R^n$. That $f \rightarrow \hat f$ is a {\it continuous} mapping
+[b]of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+[b]graph theorem. And thus for $x_1$ through $x_i$.
+[b]{\it Functional Analysis}, W.~Rudin, McGraw--Hill, 1973.
+[b]}
+[b]
+{\it This paragraph should appear to be a monotone grey texture.
+Suppose $f \in {\cal S}_n$ and $g(x) = (-1)^{|\alpha|}x^\alpha
+f(x)$. Then $g \in {\cal S}_n$; now ({\bf c}) implies that $\hat
+g = D_\alpha \hat f$ and $P \cdot D_\alpha\hat f = P \cdot \hat g =
+(P(D)g)\hat{}$, which is a bounded function, since $P(D)g \in
+L^1(R^n)$. This proves that $\hat f \in {\cal S}_n$. If $f_i
+\rightarrow f$ in ${\cal S}_n$, then $f_i \rightarrow f$ in
+$L^1(R^n)$. Therefore $\hat f_i(t) \rightarrow \hat f(t)$ for all $t
+\in R^n$. That $f \rightarrow \hat f$ is a {\bi continuous} mapping
+of ${\cal S}_n$ into ${\cal S}_n$ follows now from the closed
+graph theorem. {\bi Functional Analysis}, W.~Rudin, McGraw--Hill,
+1973.}
+
+The text in these boxes should spread out as much as the math does:
+$$\vbox{\halign{\hfil#\hfil\cr
+ \framebox[.95]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[.975]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.025]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.05]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.075]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.1]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+ \framebox[1.125]{For example $x+y = \min\{x,y\}
+ + \max\{x,y\}$ is a formula.} \cr
+\cr}}$$
+\bye
diff --git a/fonts/utilities/mathkit/tm.mkb b/fonts/utilities/mathkit/tm.mkb
new file mode 100644
index 0000000000..aba9ef70c7
--- /dev/null
+++ b/fonts/utilities/mathkit/tm.mkb
@@ -0,0 +1,56 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file tm.mkb, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=248/36pt#; % height of tallest characters
+asc_height#:=248/36pt#; % height of lowercase ascenders
+cap_height#:=248/36pt#; % height of caps
+fig_height#:=248/36pt#; % height of numerals
+x_height#:=167/36pt#; % height of lowercase without ascenders
+math_axis#:=90/36pt#; % axis of symmetry for math symbols
+bar_height#:=89/36pt#; % height of crossbar in lowercase e
+comma_depth#:=64/36pt#; % depth of comma below baseline
+desc_depth#:=77/36pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=0/36pt#; % diameter of rounded corners
+fine#:=0/36pt#; % diameter of sharply rounded corners
+thin_join#:=11/36pt#; % width of extrafine details
+hair#:=18/36pt#; % lowercase hairline breadth
+stem#:=48/36pt#; % lowercase stem breadth
+curve#:=51/36pt#; % lowercase curve breadth
+ess#:=51/36pt#; % breadth in middle of lowercase s
+flare#:=50/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=57/36pt#; % diameter of dots
+cap_hair#:=18/36pt#; % uppercase hairline breadth
+cap_stem#:=58/36pt#; % uppercase stem breadth
+cap_curve#:=51/36pt#; % uppercase curve breadth
+cap_ess#:=57/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.8pt#; % thickness of lines in math symbols
+
+dish#:=0/36pt#; % amount erased at top or bottom of serifs
+bracket#:=32/36pt#; % vertical distance from serif base to tangent
+jut#:=15/36pt#; % protrusion of lowercase serifs
+cap_jut#:=35/36pt#; % protrusion of uppercase serifs
+beak_jut#:= 0/36pt#; % horizontal protrusion of beak serifs
+beak#:=55/36pt#; % vertical protrusion of beak serifs
+vair#:=18/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=18/36pt#; % lowercase bar thickness
+slab#:= 7/36pt#; % serif and arm thickness
+cap_bar#:=13/36pt#; % uppercase bar thickness
+cap_band#:=13/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=0/36pt#; % vertical drop of sloped serifs
+stem_corr#:=2/36pt#; % for small refinements of stem breadth
+vair_corr#:=1.5/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=5/36pt#; % amount of overshoot for curves
+apex_o#:=4/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=.286; % tilt ratio $(\Delta x/\Delta y)$
diff --git a/fonts/utilities/mathkit/tm.mkr b/fonts/utilities/mathkit/tm.mkr
new file mode 100644
index 0000000000..9c5f724bb0
--- /dev/null
+++ b/fonts/utilities/mathkit/tm.mkr
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file tm.mkr, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+body_height#:=258.8/36pt#; % height of tallest characters
+asc_height#:=259.2/36pt#; % height of lowercase ascenders
+cap_height#:=248/36pt#; % height of caps
+fig_height#:=248/36pt#; % height of numerals
+x_height#:=167.5/36pt#; % height of lowercase without ascenders
+math_axis#:=90/36pt#; % axis of symmetry for math symbols
+bar_height#:=104.2/36pt#; % height of crossbar in lowercase e
+comma_depth#:=60.8/36pt#; % depth of comma below baseline
+desc_depth#:=76.8/36pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % * diameter of serif corners
+tiny#:=0/36pt#; % diameter of rounded corners
+fine#:=0/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % * width of extrafine details
+hair#:=12.5/36pt#; % lowercase hairline breadth
+stem#:=29.2/36pt#; % lowercase stem breadth
+curve#:=32/36pt#; % lowercase curve breadth
+ess#:=31.5/36pt#; % breadth in middle of lowercase s
+flare#:=29.5/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=37.4/36pt#; % diameter of dots
+cap_hair#:=12.5/36pt#; % uppercase hairline breadth
+cap_stem#:=39.2/36pt#; % uppercase stem breadth
+cap_curve#:=45.2/36pt#; % uppercase curve breadth
+cap_ess#:=42.9/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.5pt#; % * thickness of lines in math symbols
+
+dish#:=0/36pt#; % amount erased at top or bottom of serifs
+bracket#:=34/36pt#; % vertical distance from serif base to tangent
+jut#:=26.2/36pt#; % protrusion of lowercase serifs
+cap_jut#:=34.6/36pt#; % protrusion of uppercase serifs
+beak_jut#:=2.4/36pt#; % horizontal protrusion of beak serifs
+beak#:=41.3/36pt#; % vertical protrusion of beak serifs
+vair#:=12.5/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % * maximum breadth above or below notches
+bar#:=11/36pt#; % * lowercase bar thickness
+slab#:=6.4/36pt#; % serif and arm thickness
+cap_bar#:=14/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % * uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % * max breadth above/below uppercase notches
+serif_drop#:=21.6/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % * for small refinements of stem breadth
+vair_corr#:=1/36pt#; % * for small refinements of hairline height
+apex_corr#:=0pt#; % * extra width at diagonal junctions
+
+o#:=10.5/36pt#; % amount of overshoot for curves
+apex_o#:=5.1/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=.286; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
diff --git a/fonts/utilities/mathkit/zsty.mk b/fonts/utilities/mathkit/zsty.mk
new file mode 100644
index 0000000000..22cbecb537
--- /dev/null
+++ b/fonts/utilities/mathkit/zsty.mk
@@ -0,0 +1,75 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file zsty.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesPackage{z<mock><fam>}
+
+\renewcommand{\rmdefault}{<famx>}
+\renewcommand{\encodingdefault}{OT1}
+\renewcommand{\bfdefault}{<nfssb>}
+
+\DeclareFontFamily{OMX}{<mock><fam>}{}
+ \DeclareFontShape{OMX}{<mock><fam>}{m}{n}{<-> <mock>ex10}{}
+\DeclareFontFamily{OMS}{<mock><fam>}{\skewchar\font=48}
+ \DeclareFontShape{OMS}{<mock><fam>}{m}{n}{
+ <12> <mock>sy10
+ <10> <mock>sy10
+ <9> <mock>sy9
+ <8> <mock>sy8
+ <7> <mock>sy7
+ <6> <mock>sy6
+ <5> <mock>sy5
+ }{}
+
+\SetSymbolFont{operators}{normal}{OT1}{<mock><fam>}{m}{n}
+\SetSymbolFont{letters}{normal}{OML}{<mock><fam>}{m}{it}
+\SetSymbolFont{symbols}{normal}{OMS}{<mock><fam>}{m}{n}
+\SetSymbolFont{largesymbols}{normal}{OMX}{<mock><fam>}{m}{n}
+
+\SetMathAlphabet{\mathit}{normal}{OT1}{\rmdefault}{m}{it}
+\SetMathAlphabet{\mathbf}{normal}{OT1}{<mock><fam>}{\bfdefault}{n}
+
+
+%% Math Calligraphic.
+\DeclareFontFamily{OT1}{cal}{}
+\DeclareFontShape{OT1}{cal}{m}{it}{<-> <mock>sy10}{}
+\newcommand{\caldefault}{cal}
+\SetMathAlphabet{\mathcal}{normal}{OT1}{\caldefault}{m}{it}
+
+[fr]%% Math Fraktur.
+[fr]\DeclareFontFamily{OT1}{frak}{}
+[fr]\DeclareFontShape{OT1}{frak}{m}{n}{<-> [<frsf>] eufm10}{}
+[fr]\newcommand{\frakdefault}{frak}
+[fr]\DeclareMathAlphabet{\mathfr}{OT1}{\frakdefault}{m}{n}
+
+[bb]%% Math Blackboard Bold.
+[bb]\DeclareFontFamily{OT1}{bbold}{}
+[bb]\DeclareFontShape{OT1}{bbold}{m}{n}{<-> <mock>bb10}{}
+[bb]\newcommand{\bbdefault}{bbold}
+[bb]\DeclareMathAlphabet{\mathbb}{OT1}{\bbdefault}{m}{n}
+
+[b]\DeclareMathVersion{boldmath}
+[b] \DeclareFontShape{OMX}{<mock><fam>}{<bseries>}{n}{<-> <mock>bex10}{}
+[b] \DeclareFontShape{OMS}{<mock><fam>}{<bseries>}{n}{
+[b] <12> <mock>bsy12
+[b] <10> <mock>bsy10
+[b] <9> <mock>bsy9
+[b] <8> <mock>bsy8
+[b] <7> <mock>bsy7
+[b] <6> <mock>bsy6
+[b] <5> <mock>bsy5
+[b] }{}
+[b]
+[b]\SetSymbolFont{operators}{boldmath}{OT1}{<mock><fam>}{<bseries>}{n}
+[b]\SetSymbolFont{letters}{boldmath}{OML}{<mock><fam>}{<bseries>}{it}
+[b]\SetSymbolFont{symbols}{boldmath}{OMS}{<mock><fam>}{<bseries>}{n}
+[b]\SetSymbolFont{largesymbols}{boldmath}{OMX}{<mock><fam>}{<bseries>}{n}
+[b]\SetMathAlphabet{\mathcal}{boldmath}{OMS}{<mock><fam>}{<bseries>}{n}
+[b]
+[b]\newenvironment{boldface}{\bgroup\mathversion{boldmath}%
+[b] \def\it{\fontseries{<bseries>}\fontshape{it}\selectfont}%
+[b] \fontseries{<bseries>}\selectfont }{\egroup}
diff --git a/fonts/utilities/mathkit/ztex.mk b/fonts/utilities/mathkit/ztex.mk
new file mode 100644
index 0000000000..b2498a39f6
--- /dev/null
+++ b/fonts/utilities/mathkit/ztex.mk
@@ -0,0 +1,115 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file ztex.mk, part of the MathKit package
+%% (version 0.7, January , 1998) for math font
+%% generation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% This is a template file for use with MathKit to create
+%% a plain TeX style file.
+
+\input pdcfsel % get Damian Cugley's macros
+\newfam\bifam
+
+\font\tenex=<mock>ex10 at 10.0 pt
+[b]\font\tenbex=<mock>bex10 % bold extension
+\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+
+\def\texttemplate{%
+ \@\f{textrm}{<fam>r<m><enc>t}%
+ \@\M{rm}{<fam>r<m><enc>t}\@\M{mi}{<fam>r<m>7m}%
+ \@\M{sy}{<mock>sy10}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\def\scripttemplate{%
+ \@\M{rm}{<fam>r<m><enc>t7}\@\M{mi}{<fam>r<m>7m7}%
+ \@\M{sy}{<mock>sy7}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\def\sscripttemplate{%
+ \@\M{rm}{<fam>r<m><enc>t5}\@\M{mi}{<fam>r<m>7m5}%
+ \@\M{sy}{<mock>sy5}% math fonts
+ \@\M{it}{<fam>ri<enx>t}\@\m{bf}{<fam><b><enx>t}%
+ \@\f{bi}{<fam><b>i<enx>t}
+}%
+\xfontset{scriptscript}\sscripttemplate{5}
+\xfontset{script}\scripttemplate{7}
+
+[sa]\def\sanstemplate{%
+[sa] \@\m{rm}{<ssr>}\@\f{it}{<ssri>}%
+[sa] \@\f{bf}{<ssb>}\@\f{bi}{<ssbi>}%
+[sa]}
+[sa]\fontset{sans}\sanstemplate{<sasize>}{12pt}{}{}
+[sa]\newfam\sffam
+[sa]\def\sf{\fam\sffam\sansrm}\textfont\sffam=\sansrm % for math
+
+[tt]\def\tttemplate{%
+[tt] \@\f{rm}{cmtt10}%
+[tt]}
+[tt]\fontset{tt}\tttemplate{<ttsize>}{12pt}{}{}
+[tt]\def\tt{\fam\ttfam\ttrm}\textfont\ttfam = \ttrm % for math
+
+\def\caltemplate{
+ \@\f{rm}{<cal>}%
+}
+\fontset{cal}\caltemplate{<casize>}{12pt}{}{}
+\newfam\calfam
+\def\cal{\fam\calfam\calrm}\textfont\calfam = \calrm % for math
+
+[fr]\def\fraktemplate{
+[fr] \@\f{rm}{eufm10}%
+[fr]}
+[fr]\fontset{frak}\fraktemplate{<frsize>}{12pt}{}{}
+[fr]\newfam\frakfam
+[fr]\def\frak{\fam\frakfam\frakrm}\textfont\frakfam = \frakrm % for math
+
+[bb]\def\bbtemplate{
+[bb] \@\f{rm}{<mock>bb10}%
+[bb]}
+[bb]\fontset{bb}\bbtemplate{10}{12pt}{}{}
+[bb]\newfam\bbfam
+[bb]\def\bb{\fam\bbfam\bbrm}\textfont\bbfam = \bbrm % for math
+
+[b]\def\boldface{
+[b] \def\bftexttemplate{%
+[b] \@\f{textrm}{<fam><b><m><enc>t}%
+[b] \@\M{rm}{<fam><b><m><enc>t}\@\M{mi}{<fam><b><m>7m}%
+[b] \@\M{sy}{<mock>bsy10}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \def\bfscripttemplate{%
+[b] \@\M{rm}{<fam><b><m><enc>t7}\@\M{mi}{<fam><b><m>7m7}%
+[b] \@\M{sy}{<mock>bsy7}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \def\bfsscripttemplate{%
+[b] \@\M{rm}{<fam><b><m><enc>t5}\@\M{mi}{<fam><b><m>7m5}%
+[b] \@\M{sy}{<mock>bsy5}% math fonts
+[b] \@\M{it}{<fam><b>i<enx>t}
+[b] }%
+[b] \xfontset{bfscriptscript}\bfsscripttemplate{5}
+[b] \xfontset{bfscript}\bfscripttemplate{7}
+[b] \fontset{bfbody}\bftexttemplate{10}{12pt}{bfscript}{bfscriptscript}
+[b] \skewchar\bfbodymi=127 \skewchar\bfscriptmi=127
+[b] \skewchar\bfscriptscriptmi=127 \skewchar\bfbodysy=48
+[b] \skewchar\bfscriptsy=48 \skewchar\bfscriptscriptsy=48
+[b] \textfont3=\tenbex \scriptfont3=\tenbex \scriptscriptfont3=\tenbex
+[b] \def\caltemplate{
+[b] \@\f{bf}{<calb>}%
+[b] }
+[b] \fontset{cal}\caltemplate{<casize>}{12pt}{}{}
+[b] \def\cal{\fam\calfam\calbf}\textfont\calfam = \calbf % for math
+[b] \bfbodyfonts
+[b] \let\tenrm=\textrm \textrm
+[b]}
+
+\fontset{body}\texttemplate{10}{12pt}{script}{scriptscript}
+\skewchar\bodymi=127 \skewchar\scriptmi=127 \skewchar\scriptscriptmi=127
+\skewchar\bodysy=48 \skewchar\scriptsy=48 \skewchar\scriptscriptsy=48
+
+\bodyfonts
+\let\tenrm=\textrm \textrm
+
diff --git a/fonts/utilities/metatype1/README b/fonts/utilities/metatype1/README
new file mode 100644
index 0000000000..47026bc48b
--- /dev/null
+++ b/fonts/utilities/metatype1/README
@@ -0,0 +1,266 @@
+=== === === === === === === === === === === === === === === === === === ===
+ ENGLISH:
+=== === === === === === === === === === === === === === === === === === ===
+This is METATYPE1 package -- a tool for creating Type 1 fonts using
+METAPOST. The package belongs to public domain (no copyrights, copylefts,
+copyups, copydowns, etc.).
+
+Version: 0.56 (27.04.2015; a tentative version, released along with
+ the sources of the Latin Modern fonts ver. 2.003)
+Author: JNS team <JNSteam@gust.org.pl>
+
+Warning: package is still under development, upwards incompatible
+changes are likely to occur.
+
+The METATYPE1 package consist of:
+ mt1set.bat -- a batch file that sets the system variable METATYPE1
+ (it should point to the directory where reside
+ the working files of the METATYPE1 package);
+ it is exploited by other batches of the package
+ mkfont.bat -- a batch file for the generation of a font; it should be
+ called with the font file name without an extension
+ (there are two batches more related to mkfont.bat,
+ namely: mkt1.bat generates a Type 1 font without
+ generating a tfm metric file and mktfm.bat that
+ generates only a tfm file)
+ fontbase.mp -- a set of METAPOST macros for creating Type 1 fonts
+ plain_ex.mp -- an extension of plain.mp, useful not only for
+ creating fonts; it is input by fontbase.mp;
+ plain_e_.mp -- the set of illustrations to plain_ex.mp documentation
+ mp2pf.awk -- an AWK script that creates Type1 font (in a text form)
+ out of METAPOST generated EPSes
+ pfcommon.dat -- data for mp2pf.awk script (fixed elements of font)
+ e-*.mp -- the set of encoding files (used for preparing
+ the Latin Modern and TeX Gyre font packages):
+ e-ase.mp -- Adobe Standard Encoding
+ e-cs.mp -- TeX encoding for the Czech language
+ e-cscsc.mp -- TeX encoding for the Czech language altered
+ for the compatibility with Computer Modern cmcsc10
+ e-cssc.mp -- TeX encoding for the Czech language containing small caps
+ (*.sc glyps; TeX Gyre fonts)
+ e-cstt.mp -- TeX encoding for the Czech language altered for
+ the compatibility with Computer Modern cmtt10
+ e-csttsc.mp -- TeX encoding for the Czech language altered
+ for the compatibility with Computer Modern cmtcsc10
+ e-ec.mp -- TeX EC (Cork; T1 in LaTeX lingo) encoding
+ e-ecsc.mp -- TeX EC (Cork; T1 in LaTeX lingo) encoding
+ containing small caps (*.sc glyps; TeX Gyre fonts)
+ e-l7x.mp -- TeX encoding for the Lithuanian language
+ e-l7xsc.mp -- TeX encoding for the Lithuanian language
+ containing small caps (*.sc glyps; TeX Gyre fonts)
+ e-qx.mp -- TeX encoding for the Polish language
+ e-qxcsc.mp -- TeX encoding for the Polish language altered for
+ the compatibility with Computer Modern cmcsc10
+ e-qxsc.mp -- TeX encoding for the Polish language containing small caps
+ (*.sc glyps; TeX Gyre fonts)
+ e-qxtt.mp -- TeX encoding for the Polish language altered for
+ the compatibility with Computer Modern cmtt10
+ e-qxttsc.mp -- TeX encoding for the Polish language altered
+ for the compatibility with Computer Modern cmtcsc10
+ e-qxwin.mp -- Windows encoding for the Polish language
+ e-rm.mp -- TeX RM encoding (``roman math'')
+ e-rmcsc.mp -- TeX RM encoding (``roman math'') altered for the
+ compatibility with Computer Modern cmcsc10
+ e-rmsc.mp -- TeX RM encoding (``roman math'') containing small caps
+ (*.sc glyps; TeX Gyre fonts)
+ e-rmtt.mp -- TeX RM encoding (``roman math'') altered
+ for the compatibility with Computer Modern cmtt10
+ e-rmttsc.mp -- TeX RM encoding (``roman math'') altered
+ for the compatibility with Computer Modern cmtcsc10
+ e-t2a.mp, e-t2b.mp, e-t2c.mp -- Cyrillic encodings
+ e-t5.mp -- TeX Vietnamese encoding (T5 in LaTeX lingo)
+ e-t5sc.mp -- TeX Vietnamese encoding containing small caps
+ (*.sc glyps; TeX Gyre fonts)
+ e-ts1.mp -- TeX text companion encoding (TS1 in LaTeX lingo)
+ e-yy.mp -- TeX Y&Y encoding (aka LY1, aka TeX'n'ANSI)
+ e-yysc.mp -- TeX Y&Y encoding (aka LY1, aka TeX'n'ANSI) for fonts
+ containing small caps (*.sc glyps; TeX Gyre fonts)
+ packsubr.awk -- AWK script for making subroutines out of the repeating
+ fragments of PostScript code in a font file
+ afm2pfm.bat -- a batch file that converts an AFM file (Adobe font
+ metric) into a PFM (printer font metric) one
+ afm2pfm.pl -- a Perl script for the above conversion
+ mkproof.bat -- a batch file for running mft (METAFONT nad METAPOST
+ formatting) program; the usage is described in the file
+ mt1form.mft -- formatting data, necessary for mft program
+ mt1form.sty -- TeX (plain) macros for formatting documentation
+ README -- this file
+
+Additionally, the METATYPE1 distribution contains the pf2mt1 package for
+converting converting a Type 1 font into a METATYPE1 form. The conversion
+preserves as much as possible font parameters; the resulting font generated
+by METATYPE1 is, in normal circumstances, almost identical with the
+original one. The package pf2mt1 consists of three files:
+ pf2mt1.bat -- batch file; its parameter is the name of the font
+ (without an extension); the font must consist of
+ PFB and AFM files
+ pf2mt1.awk -- AWK script; the main engine
+ pf2mt1.exc -- a sample file defining ``exception chars,'' i.e.,
+ excluded from the conversion or renamed during it
+This package is useful for beginners who would like to see how METATYPE1
+works. The fonts generated by pf2mt1 are a good example of using
+the METATYPE1 package, although they do not make use of all possibilities
+it offers (in particular, the resulting fonts are not parameterized).
+
+The METATYPE1 package requires the following external programs (in
+parentheses are given the versions which we use):
+ Metapost (0.641/Web2c 7.5.2)
+ Gawk (3.1.3)
+ t1utils (t1asm and t1disasm, 1.28)
+The package also employs:
+ Perl (5.8.0) -- for generating PFM files (afm2pfm.bat)
+ MFT (Web2C 7.5.2, 2.0) -- for formatting documentation (mkproof.bat)
+ EPSINCL (0.43) -- for including stencil EPSes into documentation;
+ this package is attached in the subdirectory ``extra''
+
+In order to install the package, you should copy batch files into an
+appropriate subdirectory searched by system (environment variable PATH),
+copy the other files into a user-chosen directory and change the setting
+of the METATYPE1 enviroment variable in the batch mt1set.bat -- the variable
+should contain the name of the chosen directory.
+
+The subdirectory ``samples'' contains examples of METATYPE1 sources
+of a few trivial fonts. They may be treated as a part of the documentation
+of the METATYPE1 package.
+
+We suggest familiarising with a METATYPE1 version of D. E. Knuth's
+logo font (the file logomp03.zip)---alike pf2mt1 package, it may
+prove useful useful during the first steps in METATYPE1.
+
+=== === === === === === === === === === === === === === === === === === ===
+ POLSKI:
+=== === === === === === === === === === === === === === === === === === ===
+To jest pakiet METATYPE1 -- narz/edzie do tworzenia font/ow Type 1
+za pomoc/a systemu METAPOST. Pakiet stanowi dobro wsp/olne
+(/zadnych copyright/ow, copyleft/ow, copyup/ow, copydown/ow, etc.).
+Wersja: 0.55 (16.09.2009 -- wersja opublikowana wraz z wersj/a /xr/od/low/a
+ 2.003 pakietu font/ow Latin Modern)
+Autorstwo: JNS team <JNSteam@gust.org.pl>
+
+Uwaga: pakiet znajduje si/e w fazie rozwoju, mo/zliwe s/a jeszcze
+ zmiany niekompatybilne wstecz.
+
+W sk/lad pakietu METATYPE1 wchodz/a:
+ mt1set.bat -- plik wsadowy ustawiaj/acy zmienn/a systemow/a METATYPE1
+ tak by wskazywa/la kartotek/e, w kt/orej umieszczone
+ zosta/ly pliki robocze pakiety METATYPE1; pozosta/le
+ pliki wsadowe pakietu odwo/luj/a si/e do mt1set.bat
+ mkfont.bat -- plik wsadowy uruchamiaj/acy proces tworzenia fontu;
+ parametrem jest nazwa fontu bez rozszerzenia
+ fontbase.mp -- zestaw makr METAPOST-owych, umo/zliwiaj/acych
+ generowanie font/ow Type 1
+ plain_ex.mp -- rozszerzenie formatu plain.mp, przydatne nie tylko
+ przy generowaniu font/ow, wczytywane przez fontbase.mp
+ plain_e_.mp -- ilustracje do dokumentacji plain_ex.mp
+ mp2pf.awk -- podstawowy skrypt AWK-owy, tworz/acy font Type 1
+ (w postaci tekstowej) na podstawie EPS-/ow generowanych
+ przez METAPOST-a
+ pfcommon.dat -- dane dla skryptu mp2pf.awk (sta/le elementy fontu)
+ e-*.mp -- podstawowy zestaw plik/ow definiuj/acych przypisanie
+ nazwom znak/ow odpowiednich kod/ow (encoding):
+ e-ase.mp -- Adobe Standard Encoding
+ e-cs.mp -- TeX-owe kodowanie dla j/ezyka czeskiego
+ e-cscsc.mp -- TeX-owe kodowanie dla j/ezyka czeskiego,
+ zgodne kodowaniem cmcsc10
+ e-cssc.mp -- TeX-owe kodowanie dla j/ezyka czeskiego,
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-cstt.mp -- TeX-owe kodowanie dla j/ezyka czeskiego,
+ zgodne kodowaniem cmtt10
+ e-csttsc.mp -- TeX-owe kodowanie dla j/ezyka czeskiego,
+ zgodne kodowaniem cmtcsc10
+ e-ec.mp -- TeX-owe kodowanie EC (Cork; T1 w /zargonie LaTeX-owym)
+ e-ecsc.mp -- TeX-owe kodowanie EC (Cork; T1 w /zargonie LaTeX-owym)
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-l7x.mp -- TeX-owe kodowanie dla j/ezyka litewskiego
+ e-l7xsc.mp -- TeX-owe kodowanie dla j/ezyka litewskiego,
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-qx.mp -- TeX-owe kodowanie dla j/ezyka polskiego
+ e-qxcsc.mp -- TeX-owe kodowanie dla j/ezyka polskiego
+ zgodne kodowaniem cmcsc10
+ e-qxsc.mp -- TeX-owe kodowanie dla j/ezyka polskiego
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-qxtt.mp -- TeX-owe kodowanie dla j/ezyka polskiego
+ zgodne kodowaniem cmtt10
+ e-qxttsc.mp -- TeX-owe kodowanie dla j/ezyka polskiego
+ zgodne kodowaniem cmtcsc10
+ e-qxwin.mp -- windowsowne kodowanie dla j/ezyka polskiego
+ e-rm.mp -- TeX-owe kodowanie RM (,,roman math'')
+ e-rmcsc.mp -- TeX-owe kodowanie RM (,,roman math'')
+ zgodne kodowaniem cmcsc10
+ e-rmsc.mp -- TeX-owe kodowanie RM (,,roman math'')
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-rmtt.mp -- TeX-owe kodowanie RM (,,roman math'')
+ zgodne kodowaniem cmtt10
+ e-rmttsc.mp -- TeX-owe kodowanie RM (,,roman math'')
+ zgodne kodowaniem cmtcsc10
+ e-t2a.mp, e-t2b.mp, e-t2c.mp -- kodowania cyryliczne
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ e-t5.mp -- TeX-owe kodowanie dla j/ezyka wietnamskiego
+ (T5 w /zargonie LaTeX-owym) zawieraj/ace kapitaliki
+ (*.sc glyps; fonty TeX Gyre)
+ e-t5sc.mp -- TeX-owe kodowanie dla j/ezyka wietnamskiego
+ (T5 w /zargonie LaTeX-owym)
+ e-ts1.mp -- TeX-owe kodowanie ,,Text companion'' (TS1 w /zargonie
+ LaTeX-owym)
+ e-yy.mp -- TeX-owe kodowanie Y&Y (zwane te/z LY1 lub TeX'n'ANSI)
+ e-yysc.mp -- TeX-owe kodowanie Y&Y (zwane te/z LY1 lub TeX'n'ANSI)
+ zawieraj/ace kapitaliki (*.sc glyps; fonty TeX Gyre)
+ packsubr.awk -- skrypt AWK-owy u/zywany do znajdowania w foncie
+ powtarzaj/acych si/e fragment/ow kodu postscriptowego
+ i zast/epowania ich odwo/laniami do procedur
+ afm2pfm.bat -- plik wsadowy uruchamiaj/acy skrypt do generowania
+ plik/ow PFM (Printer Font Metrics) na podstawie danych
+ metrycznych zawartych w pliku AFM (Adobe font metric)
+ afm2pfm.pl -- skrypt w Perlu, realizuj/acy proces opisany powy/zej
+ mkproof.bat -- plik wsadowy uruchamiaj/acy program mft (formater plik/ow
+ METAFONT-owych i METAPOST-owych); spos/ob wywo/lania tego
+ pliku zosta/l opisany w komentarzach na jego pocz/atku
+ mt1form.mft -- dane steruj/ace formatowaniem, wymagane przez program mft
+ mt1form.sty -- makra TeX-owe (plain), u/zywane do formatowania
+ dokumentacji
+ README -- niniejszy plik
+
+Dodatkowo w zestawie znajduje si/e pakiet pf2mt1, umo/zliwiaj/acy
+przekszta/lcenie fontu PostScript-owego w formacie Type1 na posta/c
+METAPOST-ow/a zgodn/a z konwencjami METATYPE1. W trakcie konwersji
+praktycznie wszystkie parametry fontu /xr/od/lowego s/a zachowywane,
+co umo/zliwia (w normalnych warunkach) odtworzenie niemal/ze bez zmian
+fontu wynikowego). W sk/lad tego pakietu wchodz/a:
+ pf2mt1.bat -- plik wsadowy uruchamiaj/acy proces konwersji fontu
+ do postaci METATYPE1; jego parametrem jest nazwa
+ fontu bez rozszerzenia (font musi sk/lada/c si/e
+ z pliku PFB oraz AFM)
+ pf2mt1.awk -- podstawowy skrypt AWK-owy, dokonuj/acy konwersji
+ pf2mt1.exc -- przyk/ladowy plik zawieraj/acy definincj/e ,,znak/ow
+ wyj/atkowych'', tzn. b/ad/x nie podlegaj/acych konwersji,
+ b/ad/x przenazwowywanych w trakcie konwersji.
+Pakiet pf2mt1 mo/ze by/c przydatny dla pocz/atkuj/acych u/zytkownik/ow
+METATYPE1. Fonty wygenerowane przez pf2mt1 stanowi/a dobry przyk/lad
+u/zycia pakietu METATYPE1, cho/c oczywi/scie nie wykorzystuj/a jego
+wszystkich mo/zliwo/si (np. parametryzacji).
+
+Do dzia/lania pakietu METATYPE1 niezb/edne s/a nast/epuj/ace
+zewn/etrzne programy (w nawiasach numery wersji kt/orych u/zywamy):
+ Metapost (0.641/Web2c 7.5.2)
+ Gawk (3.1.3)
+ t1utils (t1asm and t1disasm, 1.28)
+U/zywane s/a r/ownie/z:
+ Perl (5.8.0) -- do generowania PFM-/ow (afm2pfm.bat)
+ MFT (Web2C 7.5.2, 2.0) -- do formatowania dokumentacji (mkproof.bat)
+ EPSINCL (0.43) -- do ewentualnego do/l/aczania EPS-/ow podk/ladowych
+ (stencils) do tworzonej dokumentacji; pakiet
+ ten znajduje si/e w katalogu ,,extra''
+
+Instalacja sprowadza si/e do skopiowania plik/ow wsadowych do katalogu
+znajduj/acego si/e w /sciezce przeszukiwania (PATH), umieszczenia
+pozosta/lych plik/ow w ustalonej przez u/zytkownika kartotece
+oraz uaktalnienia w pliku mt1set.bat ustawienia zmiennej
+systemowej METATYPE1 -- zmienna powinna wskazywa/c t/e kartotek/e.
+
+W katalogu ,,samples'' znajduj/a si/e przyk/lady u/zycia pakietu METATYPE1;
+mo/zna je traktowa/c jako dodatkow/a dokumentacj/e.
+
+Polecamy zapoznanie si/e z wersj/a METATYPE1 fontu LOGO zawart/a w pliku
+logomp03.zip -- podobnie jak pakiet ,,pf2mt1'' mo/ze okaza/c si/e
+przydatny podczas pierwszych pr/ob tworzenia font/ow.
+
diff --git a/fonts/utilities/metatype1/metatype1-ver056.inf b/fonts/utilities/metatype1/metatype1-ver056.inf
new file mode 100644
index 0000000000..b7300a387d
--- /dev/null
+++ b/fonts/utilities/metatype1/metatype1-ver056.inf
@@ -0,0 +1,3 @@
+This is the version of the METATYPE1 package
+prepared for the MT1 workshop during Bachotek 2015
+(a few amendments acumulated since 16.09.2009, v. 0.55)
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/README b/fonts/utilities/mf2ps/MFfonts/bases/README
new file mode 100644
index 0000000000..6dbe588d1e
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/README
@@ -0,0 +1,9 @@
+To prevent tarring from clobbering your original, I have renamed the plain*
+files here to myplain*.. but to run them, they have to be renamed back to
+plain*.. do so after moving the originals some place out of the way
+
+the shell script move does this..
+
+all the plain* files are the ones I used
+plain.base and other plain.* file were generated by
+inimf running on plain.mf
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/move b/fonts/utilities/mf2ps/MFfonts/bases/move
new file mode 100644
index 0000000000..8f3d5a571b
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/move
@@ -0,0 +1,9 @@
+mkdir originals
+mv plain.base originals
+mv plain.log originals
+mv plain.mf originals
+mv plain.tfm originals
+mv myplain.base plain.base
+mv myplain.log plain.log
+mv myplain.mf plain.mf
+mv myplain.tfm plain.tfm
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.base b/fonts/utilities/mf2ps/MFfonts/bases/myplain.base
new file mode 100644
index 0000000000..25d669be59
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.base
@@ -0,0 +1,184 @@
+€HÿÿŠÐu04ñVÀÎ !$'*-0369<?BEHKNQTWZ]`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÂÍÖçê24pœ³Çÿ"+6@CJv¦Øü&aŽŽœ¿ë!\¶ñý?js†™ÔF|‹¢Ö
+"%2b}³ÃÛú,16=DSYgjuƒ–¥®²¿È×Þéóý  $ ( - 8 ? F P Y f i n u x  † Ž •   £ ¦ « ¯ µ Â Ç Ì Ò Ø Þ ä è ì ð ô ø ý
+
+
+
+
+!
+#
+&
+(
+*
+,
+3
+:
+@
+G
+R
+Y
+`
+g
+x
+
+•
+ô  ) 6 B O [ h l q t x € ‡ “ ™ Ÿ ¥ « µ ¹ ½ Ä Ë Ò Þ è ð ù    " . 7 E G O U [ h q w y ~ € ‡ ‘ ™ ¡ « ² º À Ë Ï × Þ á ì î ø       % ' , 1 6 @ K W [ ] b i n p s { Ž ˜   § ª ¬ ® ° ² º ¿ Å Ð Ô Û å è î ø ý
+)@n£¬º¾Àß>hš©¶¿ÔÞö  #&)7BDex£ÇÙIqš­¸ÁÅÕâTl§Ýíöý  29<>R‡½ì #2BT±ÈËÓßáëö).1ARZ‰¼ö/dnƒ“¼ð!To™¨Õçõú#+0;@gœÌô)[‹«ß8]_bhr~‰Œ—ž£¥§Æú+gšÌ3`‹•™ ©±Ú.\¤²ÚEzÃü3?h˜›±¼ð ) ` t ¤ Ú ñ!'!_!’!—!Ð!Ò!Ö!Ü" """ "K"T"z"¥"Ü##D#w# #Ò#Ù#å#ò#û$*$Z$e$t$‡$ž$ $£$·$ä$æ$ë$ï$ñ%%%%@%n%“%Æ%É%ã%ð%ú%ý&&& &&2&l&&È&ú'!'Q'ƒ'¹'ô(
+((N(}((¸(ä))U)Œ)•)ª)à**@*s*§*Ú++L+P++¨+Û+æ+ð,,/,1,b,“,½,í-->-k-ž-Ë-þ./.V.z.¥.Ó.÷/$/F/{/©/Ù0
+0?0m0¢0Ò0ú111&1a1–1Ì1Î1ì2#2S2e2ž2Ø3 33?3{3¶3ß3â44S4s4¡4È4í5%5O5n5Ÿ5Ð5à66/6b6œ6Ô77B7^7™7Ô8 88D8v8¢8Æ8ü9.919D9`9˜9Î9ì:&:]::·:é:þ;8;A;q;©;Ü<<A<o<¨<Ó==7=G=s=v=z=¨=Å=õ> >->:>?>D>{>³>¾>Þ??:?e?o?‹?Â?ð@'@:@C@L@P@\@l@n@v@y@}@–@™@¡@§@°@Á@Î@ß@ì@ó@õA-A4A>ABAIASA[AbAoA¥AÜB B3BGBtB™B°BíC'CbCrC¨CÖCáDD@DkD DÉDüE E7ELE€E¹EÌEøEÿF FF>F^F‘F¼FïGG!G2GbGjGrG|G†GG²GèHH)H.H:HGHTH‡H˜HÃHõI-I:IOIuIwI{I”IÉIÖJ J0JGJMJvJyJ¨J¬JÆJÞJöK K"K3K6K8KKK~K…KK¤KßKåK÷LLL LL,LWLgLxL}L‹L¥L»LÎL×LçMM<MQMXMbMmMvM‚M‡MŠMŽM”MžM£M¥M§M©M¬M´M·M½MÄMÆMÊMÍMÑMÙMãMíMøMûNNN N NNN$N.N8NBNJNVN_NdNoNxN€NˆNN“N˜NžN¤N¦N©N°N´N·NÁNÈNÊNÚNãNæNéNðNòNûO OOO%O'OBOSOUOWOpOxOzO…O‡O‹OOOªO¶O¹O»OÀOÂOÅOÉOËOÍOÐOÜOåOêOðO÷OúOýPPPP P"P$P&P(P*P,P.P:PAPMPZPmP‰PP¡PµPÊPåQ Q QBQLQQQVQ`QdQiQyQQˆQ‹Q•Q Q§Q­Q²Q¹QÁQÐQÕQÛQáQæQëQñQ÷RR RRR!R(R/R2R5R9R=R@RCRGRKRTR^RmR{R}RR•R™R¡R¨RµR»RÁRËRÔRÙRäRêRñR÷RüSSS SSSS.S9S=SHSPSXS_SgSoSxS‚S‰S™SœSžS¡S¤SªS³S¸SÄSÍSÓSØSÚSÜSÞSàSâSäSæSèSêSðSùSûTTT
+TTT!T(T0T5T:TCTMTVT`ThTqTzT„TT•T§T´T½TÄTËTÒTÙTèTðT÷UU
+UUU#U,U6UGUZUlUyU‚U’U¡U±UÃUÖUáUìU÷VV
+VVV#V0V:VNVWVyVƒV‘VV VÀ^^@^^A^^B^^C^^D^^E^^F^^G^^H^^I^^J^^K^^L^^M^^N^^O^^P^^Q^^R^^S^^T^^U^^V^^W^^X^^Y^^Z^^[^^\^^]^^^^^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^^?buffer sizepool sizenumber of strings???End of file on the terminal!! (That makes 100 errors; please try again.)? Type <return> to proceed, S to scroll future error messages,R to run without stopping, Q to run quietly,I to insert something, E to edit your file,1 or ... or 9 to ignore the next 1 to 9 tokens of input,H for help, X to quit.OK, entering batchmodenonstopmodescrollmode...insert>I have just deleted some text, as you asked.You can now delete more, or insert, or whatever.Sorry, I don't know how to help in this situation.Maybe you should try asking a human?Sorry, I already gave what help I could...An error might have occurred before I noticed any problems.``If all else fails, read the instructions.''Emergency stopMETAFONT capacity exceeded, sorry [If you really absolutely need more capacity,you can ask a wizard to enlarge me.This can't happen (I'm broken. Please show this to someone who can fix can fixI can't go on meeting you like thisOne of your faux pas seems to have wounded me deeply...in fact, I'm barely conscious. Please fix it and try again.InterruptionYou rang?Try to insert some instructions for me (e.g.,`I show x'),unless you just want to quit by typing `X'.Missing `' has been insertedArithmetic overflowUh, oh. A little while ago one of the quantities that I wascomputing got too large, so I'm afraid your answers will besomewhat askew. You'll probably have to adopt differenttactics next time. But I shall try to carry on anyway.Square root of has been replaced by 0Since I don't take square roots of negative numbers,I'm zeroing this one. Proceed, with fingers crossed.Pythagorean subtraction +-+Logarithm of Since I don't take logs of non-positive numbers,angle(0,0) is taken as zeroThe `angle' between two identical points is undefined.main memory sizeAVAIL list clobbered at Double-AVAIL list clobbered at Doubly free location at Bad flag at New busy locs:LINK(INFO(vacuousbooleanunknown booleanstringunknown stringpenunknown penfuture penpathunknown pathpictureunknown picturetransformpairknown numericdependentproto-dependentnumericindependenttoken liststructuredunsuffixed macrosuffixed macroundefinedtruefalsenullpicturenullpenjobnamereadstringpencirclenormaldeviateoddknownunknownnotdecimalreversemakepathmakepentotalweightocthexASCIIcharlengthturningnumberxpartypartxxpartxypartyxpartyypartsqrtmexpmlogsindcosdflooruniformdeviatecharexistsanglecycle++orand<=>=<>rotatedslantedscaledshiftedtransformedxscaledyscaledzscaledintersectiontimessubstringsubpathdirectiontimepointprecontrolpostcontrolpenoffset..tracingtitlestracingequationstracingcapsulestracingchoicestracingspecstracingpenstracingcommandstracingrestorestracingmacrostracingedgestracingoutputtracingstatstracingonlineyearmonthdaytimecharcodecharextcharwdcharhtchardpcharicchardxchardydesignsizehpppvpppxoffsetyoffsetpausingshowstoppingfontmakingproofingsmoothingautoroundinggranularityfillinturningcheckwarningcheck at line a bad variablefiendgroupenddefendfor INACCESSIBLEhash sizeEQUIV(:=addtoatatleastbegingroupcontrolscullcurldelimitersdisplayeveryjobexitifexpandafterfrominwindowinterimletnewinternalofopenwindowrandomseedsavescantokensshipoutstepstrtensiontountiltoken ETC. CLOBBERED IMPOSSIBLE NONEXISTENT BAD[](EXPR(SUFFIX(TEXT->>-><expr>-><expr>of<primary>-><suffix>-><text>->(SAVED)varxxxyyxyy%CAPSULEpart struct{restoring Path{open?}..control? ..{curl ..tension and ..controls ??, before choices, after choicesSome number got too bigThe path that I just computed is out of range.So it will probably look funny. Proceed, for a laugh.path sizeEdge structurerow |Scaled picture would be too bigI can't yscale the picture as requested---it wouldmake some coordinates too large or too small.Proceed, and I'll omit the transformation.I can't xscale the picture as requested---it wouldmove table sizeTracing edges (weight (No new edges added.)Cycle spec % beginning in octant `% entering octant ` & cycleENENNENNWWNWWSWSSWSSEESE ..controls % segment (, before subdivision into octants, after subdivision, after subdivision and double autorounding, after subdivision and autoroundingCurve out of rangeAt least one of the coordinates in the path I'm about todigitize was really huge (potentially bigger than 4095).So I've cut it back to the maximum size.The results will probably be pretty wild.rounding table sizePen polygon .. cycle .. (newly created)Pen too largeThe cycle you specified has a coordinate of 4095.5 or more.So I've replaced it by the trivial path `(0,0)..cycle'.Pen cycle must be convexThe cycle you specified either has consecutive equal pointsor turns right or turns through more than 360 degrees.pen polygon size@ Octant offset), from to @ retrograde line from @ transition line , from dep*4Value is too large (The equation I just processed has given some variablea value of 4096 or more. Continue and I'll try to copewith that big value; but it might be dangerous.(Set warningcheck:=0 to suppress this message.)#### ## Bad PREVDEP at Out of order at Redundant equationI already knew that this equation was true.But perhaps no harm has been done; let's continue.[unknown command code!]<*><insert><scantokens>l.<forever> <argument> <recently read> <to be read again> <inserted text> <for()> input stack sizetext input levelsendinputIncomplete if; all text was ignored after line A forbidden `outer' token occurred in skipped text.This kind of error happens when you say `if...' and forgetthe matching `fi'. I've inserted a `fi'; this might work.The file ended while I was skipping conditional text.File endedForbidden token found while scanning I suspect you have forgotten an `enddef',causing me to read past where you wanted me to stop.I'll try to recover; but if the error is serious,you'd better type `E' or `X' now and fix your file.to the end of the statementA previous error seems to have propagated,a text argumentIt seems that a right delimiter was left out,the definition of the text of a loopI suspect you have forgotten an `endfor',Runaway text?definition?loop?Text line contains an invalid characterA funny symbol that I can't read has just been input.Continue, and I'll forget that it ever happened.Incomplete string token has been flushedStrings should finish on the same line as they began.I've deleted the partial string; you might want toinsert another by typing, e.g., `I"new string"'.Enormous number has been reducedI can't handle numbers bigger than about 4095.99998;so I've changed your constant to that maximum amount.(Please type a command or say `end')*** (job aborted, no legal end found)=>defvardefprimarydefsecondarydeftertiarydefforforsuffixesforeverquote#@@#Missing symbolic token insertedSorry: You can't redefine a number, string, or expr.I've inserted an inaccessible symbol so that yourdefinition will be completed without mixing me up too badly.Sorry: You can't redefine my error-recovery tokens.The next thing in this `def' should have been `=',because I've already looked at the definition heading.But don't worry; I'll pretend that an equals signwas present. Everything from here to `enddef'will be the replacement text of this macro.exprsuffixtextprimarysecondarytertiaryThis variable already starts with a macroAfter `vardef a' you can't say `vardef a.b'.So I'll have to discard this definition.Missing parameter type; `expr' will be assumedYou should've had `expr' or `suffix' or `text' here.parameter stack sizeExtra `endfor'I'm not currently working on a for loop,so I had better not try to end anything.inputLost loopI'm confused; after exiting from a loop, I still seemto want to repeat it. I'll try to forget the problem.No loop is in progressWhy say `exitif' when there's nothing to exit from?After `exitif <boolean exp>' I expect to see a semicolon.I shall pretend that one was there.*** (loop confusion)Not a stringI'm going to flush this expression, sincescantokens should be followed by a known string.)<-Too many arguments to Missing `I'm going to assume that the comma I just read was aright delimiter, and then I'll begin expanding the macro.You might want to delete some tokens before continuing.Missing argument to That macro has more parameters than you thought.I'll continue by pretending that each missing argumentis either zero or null.I've finished reading a macro argument and am about toread another; the arguments weren't delimited correctly.I've gotten to the end of the macro parameter list. for I've got the first argument; will look now for the other.ifelseelseifThere should've been a colon after the condition.{true}{false}Extra I'm ignoring this; it doesn't match any if.Improper When you say `for x=a step b until c',the initial value `a' and the step size `b'and the final value `c' must have known numeric values.The next thing in this loop should have been `=' or `:='.was present, and I'll look for the values next.The next thing in this loop should have been a `:'.So I'll pretend that a colon was present;everything from here to `endfor' will be iterated. ENDFOR{loop value=initial valuestep sizeI assume you meant to say `until' after `step'.So I'll look for the final value and colon next.final valueinput file nameI can't find file `I can't write on file `'..mfPlease type another *** (job aborted, file error in nonstop mode): mfput.log**transcript file name file name for outputFile names can't appear within macrosSorry...I've converted what follows to tokens,possibly garbaging the name you gave.Please delete the tokens and insert the name again.exp (see the transcript file) (future pen)linearform>> recycle### = A primary expression can't begin with `I'm afraid I need some sort of value in order to continue,so I've tentatively inserted `0'. You may want todelete this zero and insert something else;see Chapter 27 of The METAFONTbook for an example.Nonnumeric ypart has been replaced by 0I thought you were giving me a pair `(x,y)'; butafter finding a nice xpart `x' I found a ypart `y'that isn't of numeric type. So I've changed y to zero.(The y that I didn't like appears above the error message.)A group begun on line never endedI saw a `begingroup' back there that hasn't been matchedby `endgroup'. So I've inserted `endgroup' now.Division by zeroI'll pretend that you meant to divide by 1.Improper subscript has been replaced by zeroA bracketed subscript must have a known numeric value;unfortunately, what I found was the value that appears justabove this error message. So I'll try a zero subscript.Variable has been obliteratedIt seems you did a nasty thing---probably by accident,but nevertheless you nearly hornswoggled me...While I was evaluating the right-hand side of thiscommand, something happened, and the left-hand sideis no longer a variable! So I won't change anything.While I was evaluating the suffix of this variable,something was redefined, and it's no longer a variable!In order to get back on my feet, I've inserted `0' instead.copyI've scanned an expression of the form `a[b,c',so a right bracket should have come next.I've seen a `[' and a subscript value, in a suffix,A secondaryA tertiaryPen path must be a cycleI can't make a pen from the given path.AnUndefined coordinates have been replaced by (0,0)I need x and y numbers for this part of the path.The value I found (see above) was no good;so I'll try to keep going by using zero instead.(Chapter 27 of The METAFONTbook explains thatyou might want to type `I ???' now.)Undefined x coordinate has been replaced by 0I need a `known' x value for this part of the path.Undefined y coordinate has been replaced by 0I need a `known' y value for this part of the path.I've scanned a direction spec for part of a path,so a right brace should have come next.Improper curl has been replaced by 1A curl must be a known, nonnegative number.I've got the x coordinate of a path direction;will look for the y coordinate next.A path join command should end with two dots.Improper tension has been set to 1The expression above should have been a number > 3/4.Paths don't touch; `&' will be changed to `..'When you join paths `p&q', the ending point of pmust be exactly equal to the starting point of q.So I'm going to pretend that you said `p..q' instead.Undefined condition will be treated as `false'The expression shown above should have had a definitetrue-or-false value. I'm changing it to `false'.*** (cannot readstring in nonstop modes)unknown pairunknown numericNot implemented: I'm afraid I don't know how to apply that operation to thatparticular type. Continue, and I'll simply return theargument (shown above) as the result of the operation.)}String contains illegal digitsI zeroed out characters that weren't in the range 0..7.I zeroed out characters that weren't hex digits.Number too large (I have trouble with numbers greater than 4095; watch out.combination of types. Continue, and I'll return the secondargument (see above) as the result of the operation.{(The quantities shown above have not been equated.Oh dear. I can't decide if the expression above is positive,negative, or zero. So this comparison test won't be `true'.Unknown relation will be considered false)*(You're trying to divide the quantity shown above the errormessage by zero. I'm going to divide it by one instead.Improper transformation argumentThe expression shown above has the wrong type,so I can't transform anything using it.Transform components aren't all knownI'm unable to apply a partially specified transformationexcept to a fully known pair or transform.That transformation is too hardI can apply complicated transformations to paths,but I can only do integer operations on pictures.Too far to shiftI can't shift the picture as requested---it wouldA statement can't begin with `I was looking for the beginning of a new statement.If you just proceed without changing anything, I'll ignoreeverything up to the next `;'. Please insert a semicolonnow in front of anything that you don't want me to delete.(See Chapter 27 of The METAFONTbook for an example.)Extra tokens will be flushedI've just read as much of that statement as I could fathom,so a semicolon should have been next. It's very puzzling...but I'll try to get myself back together, by ignoringIsolated expressionI couldn't find an `=' or `:=' after theexpression that is shown above this error message,so I guess I'll just ignore it and carry on.Improper `:=' will be changed to `='I didn't find a variable name at the left of the `:=',so I'm going to pretend that you said `=' instead.)=(Internal quantity `' must receive a known valueI can't set an internal quantity to anything but a knownnumeric value, so I'll have to ignore this assignment.Equation cannot be performed (I'm sorry, but I don't know how to make such things equal.(See the two expressions just above the error message.)Redundant or inconsistent equationAn equation between already-known quantities can't help.But don't worry; continue and I'll just ignore it.Inconsistent equationThe equation I just read contradicts what was said before. (off by Declared variable conflicts with previous vardefYou can't use, e.g., `numeric foo[]' after `vardef foo'.Proceed, and I'll ignore the illegal redeclaration.Illegal suffix of declared variable will be flushedVariables in declarations must consist entirely ofnames and collective subscripts, e.g., `x[]a'.Are you trying to use a reserved word in a variable name?I'm going to discard the junk I found here,up to the next comma or the end of the declaration.Explicit subscripts like `x15a' aren't permitted.Extra `endgroup'I'm not currently working on a `begingroup',enddumpAlways say `randomseed:=<numeric expression>'.Unknown value will be ignoredYour expression was too random for me to handle,so I won't change the random seed just now.{randomseed:=errorstopmodeinnerouterI found no right delimiter to match a left one. So I'veput one in, behind the scenes; this may fix the problem.The token `' is no longer a right delimiterStrange: This token has lost its former meaning!I'll read it as a right delimiter this time;but watch out, I'll probably miss it later.(%CAPSULE)' isn't an internal quantitySomething like `tracingonline' should follow `interim'.You should have said `let symbol = something'.was present. The next token I read will be `something'.number of internalsshowtokenshowstatsshowshowvariableshowdependencies> (outer) lefright delimiter that matches tagvariablemacro:'d macro:[repeat the loop]Memory usage still untouched)String usage =macro:OKThis isn't an error message; I'm just showing something.contourdoublepathalsowithpenwithweightdroppingkeepingImproper typeNext time say `withweight <known numeric expression>';I'll ignore the bad `with' clause and look for another.Next time say `withpen <known pen expression>';Weight must be -3, -2, -1, +1, +2, or +3 is the wrong type (I was looking for a "known" picture variable.So I'll not change anything just now.Not a suitable variableAt this point I needed to see the name of a picture variable.(Or perhaps you have indeed presented me with one; I mighthave missed it, if it wasn't followed by the proper token.)Improper `addto'This expression should have specified a known picture.This expression should have been a known path.Not a cycleThat contour should have ended with `..cycle' or `&cycle'.Strange path (turning number is zero)Backwards path (turning number is negative)The path doesn't have a counterclockwise orientation,so I'll probably have trouble drawing it.(See Chapter 27 of The METAFONTbook for more help.)Bad window numberIt should be the number of an open window.Improper `openwindow'Say `openwindow k from (r0,c0) to (r1,c1) at (x,y)',where all quantities are known and k is between 0 and 15.Bad culling amountsAlways cull by known amounts that exclude 0.messageerrmessageerrhelpA message should be a known string expression.(That was another `errmessage'.)This error message was generated by an `errmessage'command, so I can't give any explicit help.Pretend that you're Miss Marple, examine all clues,and deduce the truth by inspired guesses.Enormous has been reducedFont metric dimensions must be less than 2048pt.charlistligtableextensibleheaderbytefontdimenInvalid code has been replaced by 0I was looking for a number between 0 and 255, or for astring of length 1. Didn't find it; will use 0 instead.Character code is already in a ligtablein a charlistIt's not legal to label a character more than once.Improper locationI was looking for a known, positive number.For safety's sake I'll ignore the present command.A colon should follow a headerbyte or fontinfo location.ligtable sizeIllegal ligtable stepI was looking for `=:' or `kern' here.=:kernLigature program too longAfter 256 ligtable steps, no more colons are allowed.Improper kernThe amount of kern should be a known numeric value.I'm processing `extensible c: t,m,b,r'.Improper font parameter(some values had to be adjusted by as much as pt)(illegal design size has been changed to 128pt).tfmfile name for font metricsFont metrics written on (a font metric dimension font metric dimensions had to be decreased) METAFONT output .gfgf (just shipped out)(There's unbounded black in character shipped out!)specialnumspecialUnsuitable expressionThe expression shown above has the wrong type to be output.title Output written on character, bytes). (INIMF) strings of total length memory locations dumped; current usage is symbolic tokens (preloaded base=.basebase file nameBeginning to dump on file Transcript written on (end occurred when on line was incomplete)(see the transcript file for additional information)(dump is performed only by INIMF)debug # (-1 to exit):myplainmyplain.mfmyplain.logbase_namebase_versionplain1.0uptodowntoexitunlessrelax\\]]-----infinity...gobblegobbledgghide???stopinteractloggingalltracingalltracingnoneepsepsilonrightleftupdownoriginquartercirclehalfcirclefullcircleunitsquareidentityblankpictureunitpixeldittocapsule_defpensquarepenrazorpenspeckwhateverabsroundhroundvroundo__o_ceilingbytedirunitvectorinverseT_counterclockwisetensepathmoddivdotprod**takepowerUndefined power: **directiondirectionpointa_The direction doesn't occurintersectionpointx_y_The paths don't intersectsoftjoinc_join_radiusb_incrdecrreflectedaboutrotatedaroundrotatedaboutminu_setu_uumaxflexn_z_dz_superellipseinterpathsolvetrue_xfalse_xtx_fx_tolerancefix_unitsmmpixels_per_inchcmptpcddccbpinaspect_ratioblackero_correctiondefine_pixelsdefine_whole_pixelsdefine_whole_vertical_pixelsdefine_good_x_pixelsgooddefine_good_y_pixelsdefine_blacker_pixelsdefine_whole_blacker_pixelsdefine_whole_vertical_blacker_pixelsdefine_corrected_pixelsdefine_horizontal_corrected_pixelslowres_fixratiofirstmode_setupmodeproofcurrenttransforminput mode_namemagdisplayingextra_setupclearitpickupsmodemagstepmode_defnumber_of_modesproofproof_proof_smokesmokesmoke_smoke_grayfont blackmakeboxmaketickslowreslowreslowres_lowres_midmidmid_mid_sunsunsun_sun_localfontcurrentpencurrentpen_pathcurrentpicturet_filladdto_currentpicturedrawfilldrawdrawdotdef_pen_path_unfillundrawunfilldrawundrawdoterasedefault_wt_cullitcutdrawcutoffthetapic_cut_pen_lftpen_rtpen_toppen_botnumeric_pickup_pen_pickup_pen_Unknown penclearpenpen_lft_pen_rt_pen_top_pen_bot_pen_path_pen_count_savepenclear_pen_memorylftrttopbotpenpospenstrokepath_cyclestroke_makelabellcode_nodot 1 2 3 4 0 5 6 7 8labelspenlabels$$rangenumtokthruproofrulerulescreenrulerulepenmakegridxlistylisttitlefonttitlefont labelfontlabelfont grayfontgrayfont slantfontslantfont proofoffsetoffsetproofrulethicknessrulethicknessbegincharw_sharph_sharpd_sharpclearxyextra_begincharitalcorrx_sharpchange_widthendcharextra_endcharshipitshowitfont_sizefont_slantfont_normal_spacefont_normal_stretchfont_normal_shrinkfont_x_heightfont_quadfont_extra_spacefont_identifierfont_identifier_font_coding_schemefont_coding_scheme_UNSPECIFIEDscreen_rowsscreen_colscurrentwindowopenitshowit_screencharsshowit;screenstrokesimagerulesmakebox(screenrule);gfcornerslet makebox=maketicks;proofing:=1;nodisplaysdisplaying:=0;notransformsbye (preloaded base=myplain 89.3.8)ÿÿ’·ÿÿŠîŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÐŠÝŠÐŠÐŠÝ ÿÿÿŠÐÂ@ÀŽ7ŽoŠî‹ r³rµ ÿ‹’¡r½¦
+ÿÿŠÐrÔ rÞ rå ré rë s s ÿ‹ Šîs €s ós" ÿ‹4‹—Šç‹s> ïsA Šç‹ ‹4kk ÄsO”s\sb ësf ês~ s‚ s‹ s s s” s  k‡ k s° ÿ‹T‹ k¿ €sí sñ kÌ €Vsøsü t kÓ @t…tt£t%¤t0!t:t< €ÿ‹Z‹4)tEtF €ÿ‹Ã‹TZtNt` €kî<tltw‹i‹iÿÿÿà‹f‹fÿÿÿà‹o‹o ÿÿÿð‹l‹l ÿÿÿð‹u‹xÿÿÿà‹x‹r‹r‹uÿÿÿà‹‹~ ÿÿÿð‹{‹ ÿÿÿð‹~‹{ÿÿÿð‹‡‹‡ÿÿÿà‹„‹„ÿÿÿà‹‹ ÿÿÿð‹Š‹Š ÿÿÿð‹“‹–ÿÿÿà‹–‹‹‹“ÿÿÿà‹Ÿ‹œ ÿÿÿð‹™‹Ÿ ÿÿÿð‹œ‹™ÿÿÿðŠÑŠÐ‹Ÿ‹‡‹i‹‹“‹‹o‹ukô Œøk…k…k…y,òYk…‹®k…ÿþ”{òYÿþ”{k…ÿÿ†Ô‹µÿþ”{ÿÿ†Ôy,ÿþ”{ÿ‹á‹Z’¢Ó×ÿÿ‹¢ŠÐ ÿÿ‹Õ‹Õ€*«*«‹Îÿÿ€ÿÿÕUÿÿÕU’–„Ó[l ÿ‹ê‹ÃŒlŒ([l l" ÿ‹ó‹áŠál2Œ(Ÿl8 lD ÿŒ‹ê‹ãlTŒ(ÙlZ ŠÐ ÿÿŒŒÿÿ€€ÿÿÕU€ÿÿ€*«‹ü€€€*«*«€Œ€ÿÿ€*«ÿÿ€€ÿÿÕUŒ
+ÿÿ€ÿÿ€ÿÿ€ÿÿÕUÿÿÕUÿÿ€lf ÿŒ.‹ó‹ìlvŒ(q‹õl‚Œ(zŒlŽŒ(yŒ"y,Œ(·Œ%Œ*Œ%ÿÿl• ÿŒCŒŽ ÿÿ‹¼Œ2Œ2ÿÿŒ2?"ŒŒu0tz’ŸƒÓÙ[l l§ ÿŒUŒ.Ÿl²l· Ê ÿÿŒ2m¿ mÀ m× mç më ÿŒeŒCÙlÄìmôn n  ´n lÉ ŠÐ ÿŒÃŒUnr qlÖ¬ ÿÿ‘6 ÿÿ‘
+ÿÿŠÐ¬ÿÿkŸn| ffn 33n‚ ¦fn… vnˆ n‹ n‘ +Llö ’n“ ffn– 33n™ ¦fŒ:Œ:Œÿnœ ,nŸ n¢ n¨ ŒžŒžÿÿŒž’¨‚ÓqŒƒHlþ  ÿÿŒÄ ÿÿŒžŒÚŠÐŠÐŠÐŠÐ ŠÐ
+’±ÓŸJm<mœ lÿŒØŒeknª ffn­ 33n° ¦fn³ Èn¶ n¹ n¿ Œ§DÿŒÃø ÿÿŒ°ŒñUUª«ŒÜª«ª«Œãª«UUŒêUUUU‹¼k…y,k…y,”nÆ ?nÌ ŒÕ=ÿŒØnÒ nÕ nØ nÛ
+)¸RnÞ ná nç 9ÿ# nð _ÿ'o .¬ ÿ~#\oŠáÿÿŠÐf_Zƒÿÿ¥}B‚ÿÿ|r„ÿÿ½~.ÿÿ€ÿÿÞ ÿÿ€!óÿÿ€5ÿÿ¥}ÿÿ¥}ÿÿ|ÿÿ½~ÿÿ½~ÿÿ|<ÿÿ€ÿÿ€!óÿÿ€ÿÿÞ Cÿÿ¥}Zƒÿÿ½~r„ÿÿ|B‚J€!ó€ÿÿÞ €QZƒZƒr„B‚B‚r„X€€ÿÿÞ €!ó†h+€g›o o ffoI oX o` oq -o‡ p p" ÿ„'p< p? ÿÑ~ŠáHEŒ$†ÿŒÁ‰Ž‰
+)¸RŠá ×–$ÿ–ª“˜“Î>@Šá  $šÿ Ä¢¯ÿàŠásèª$¤ ª´§¬§MKÊÿÿ€ÿÿ€!ó @®ÿÿ¥}Zƒÿÿ½~r„ÿÿ|B‚µ€!ó€ÿÿÞ €¼ZƒZƒr„B‚B‚r„À Ž9ŽG€!óÿŽ&„‹ÇÕ‹Ç…ŠáöÝ$×ÿݵÚßÚ$"Šáìç$áÿç­äéä&…0Šáñ$ëÿñÕîóî$ŠáØdû$õ€ûÈøŽŽ €!ó€ @ýZƒZƒr„B‚B‚r„Ž€ Ž9ŽG€!óøfnpÕ HpÛ pß …pà Öpã Ãpè HEpí Š=pò ffq €ÿŽMÑŒkh9q*qC qI qj qn Šá
+ÿÿŠÐ‹sŽ4
+ÿÿŠÐ‹mqxdÿÿŠÐŠáÿÿŠÐŽQµ ÿÿŒñ] ÿÿ_¿ ÿÿÊ¥ ÿÿŽ ŽÿÿŠÐÿŽgŽ&ÔŽ>ŽSŽ>ŽQŽgr r
+ r  ŽŠÐŽ{ŠÐÿÿr r& ÿŽoŽMŸr]urzr« ÿŽÏŽgŽ}ŠÐŽyŠÐÒÿÿŽu¹ÿÿŽ_ÛÿÿŽqµÿÿŽIØÿÿŽ[tƒ t† t‰ tŒ t t’ t• t˜ t› tž t¡ t¤ t§ tª t° t³ t¸ t» t¾ tÁ tÄ tÇ tÊ tÍ tÐ tÓ tÖ tÙ tÞ tá tñ u u u u% u* R®(­ÿ<uŽoÿ÷ ÿ÷ ÿöÿö 
+ÿú ÿù
+ÿú ÿù&,ÿö)#ÿû,&ÿ÷#)ÿö82
+ÿü/5
+ÿú28 ÿù5/ÿùA>ÿ÷;Dÿ÷D;ÿö>AÿöPM
+ÿúMP ÿùGJ
+ÿúJG ÿùV\ÿöYSÿû\Vÿ÷SYÿöhb
+ÿü_e
+ÿúbh ÿùe_ÿùŠÑŠÐh>8VP &ÿiåŽÏŠÐÿ"‘ u‘‘ÿÿ‘ÿ
+‘#åŒkŠÐŠÐŠÐŠÐ ŠÐ
+ÿ,‘Q‘ —ÿÿŠÐÿ‘Y‘#˜ÿÿŠÐÿ‘‘QŠá
+ÿÿŠÐ‘`*‘]‘b‘]ŠáÿÿŠÐ‘gБd‘i‘dŠáÿÿŠÐ‘ne‘k‘p‘kŠáÿÿŠÐ‘uí‘r‘w‘rŠáÿÿŠÐ‘|q‘y‘~‘yŠáÿÿŠÐ‘ƒ‘‘€‘…‘€ŽÏ‘ŠÐ ÊŠÐ ÈŠÐ ÆŠÐ ÃhÔ hý ,hþ 2{iÿ¼ ¼i$ ÿ‘¡‘Yi) ÿ‘¥‘i. ÿ‘©‘¡i3 ÿ‘­‘¥i8 ÿ‘±‘©i= ÿ‘µ‘­iB ÿ‘É‘±iY
+if it
+iŠ
+i’ i¡
+i«
+i° i» ÿ‘Õ‘µiÇ €iÜ iõ j j ÿ‘ã‘É[›’›j j/ ŠÐ jM ÿ‘é‘Õj\ j‡ ÿ‘ó‘ãj› ¢ÿ‘ù‘é€j j¨  ÿ‘ý‘ój® žÿ’‘ùÎj³j¶ œÿ’ ‘ýNj»j¾ šÿ’’ÐjÃjÆ ˜ÿ’Y’ íjË’’ÿþ’’ÿþ’’ÿÿ’’ÿÿ’"’%ÿþ’%’’’"ÿþ’.’+ÿÿ’(’.ÿÿ’+’(ÿÿ’4’4ÿþ’1’1ÿþ’:’:ÿÿ’7’7ÿÿ’@’Cÿþ’C’=’=’@ÿþ’L’Iÿÿ’F’Lÿÿ’I’FÿÿŠÑŠÐ’L’4’’.’@’:’’"ÿ’{’ùÿÿ’Ojë ‘ÿ’ƒ’Yjù jú ÿ’‰’{k( ÿ’’ƒÑk0kB ÿŠî’‰-kIŠá‰’™‹’“’™’«’–‹ÜÓ[Šáˆ’¢‹’œ’¢’™’ŸŒ<Óيᇒ«‹’¥’«’´’¨Œ¤ÓqŠá†’´‹’®’´Šá’±Œ¼ÓŸŠÐŠÐh¤h§ŠÐØh¤¬h¥h¦—ŠÐ]h¨>h©‘hªoh«h¬ŠÐ‘‡'h®gh¯2h°gh±h²ŠÐ‘‰'h´ghµ2h¶gh·h¸ŠÐ‘‹'hº’h»2h¼’h½h¾ŠÐŠÐ<hÀhÁ…hÂ<hÃuhÄ6hŧhÆ>hÇuhÈhÉšhÊAhËh̊Б'hÎ[hÏ2hÐ[hÑhҊЊÐ*‘-hÕ'hÖ.h×)hØ)hÙ6hÚ±hÛh܊ЊÐ6hÞÔhßhàŠÐŠÐhâ2hã6hähåŠÐŠÐzhç-hèyhéîhêhëŠÐŠÐhí'hî6hï¥hðhñŠÐŠÐ…hó<hô=hõ>hö…h÷ohø<hùhúhûŠÐŠÐ*‘‘-‘“.hÿ)i·i*ici-i‚i)iØiÒiÄi i
+÷i i ŠÐi*i Zizi-i Ziyi)ŠÐéiniiŠÐŠÐÂi2iÿiiŠÐŠÐÂi2i i i!ŠÐŠÐÂi#;‘›7i%i&ŠÐŠÐÂi(;‘Ÿ7i*i+ŠÐŠÐÂi-;‘£7i/i0ŠÐŠÐÂi2;‘§7i4i5ŠÐŠÐÂi7;‘«7i9i:ŠÐŠÐÂi<;‘¯7i>i?ŠÐŠÐÂiA;‘³7iCiDŠÐŠÐÂiF2iG iHiIŠÐŠÐ¶iK<iL*iM*iN¾iOiiP-iQÑiR+iS“iT,iUxiV)iW-iX*‘·.iZ¾i[ii\-i]Ñi^+i_“i`,iaxib)ic)id îie;‘¹7ig“ih¹ii6ij<ik*il*im¾iniio-ipyiq)ir-is*‘».iu¾iviiw-ixyiy)iz)i{ îi|<i}*i~*i¾i€ei.i‚-iƒyi„)i…-i†*i‡¾iˆei‰.‘½-i‹yiŒ)i)iŽ îi;ixi‘-‘¿>i“yi”ii•6i–<i—*i˜*i™ziš-i›xiœ)i-iž*iŸzi -‘Á.i¢xi£)i¤)i¥ îi¦<i§*i¨*i©ziª-‘Ã)i¬-i­*i®zi¯-‘Å)i±)i² îi³;i´¾iµei¶.i·-i¸¾i¹iiº-‘Ç>i¼zi½ii¾i¿ îiÀŠÐŠÐ¶iÂ<iÃ*iÄ*ižiÆi‘Ë-iÈÑiÉ+iÊ“iË,iÌxiÍ)iÎ-iÏ*iоiÑiiÒ-iÓÑiÔ+iÕ“iÖ,i×xiØ)iÙ)iÚ îiÛ;‘Í7iÝ“iÞ¹iß6ià<iá*iâ*iã¾iäiiå-iæyiç)iè-ié*iê¾iëeiì.ií-iîyiï)ið)iñ îiò;ióxiô-‘Ï>iöyi÷iiø6iù<iú*iû*iüziý-iþxiÿ)j-j*jzj-‘Ñ)j)j îj;j¾j ej
+.j -j ¾j ij-‘Ó>jzjijj îjŠÐŠÐéj¶j<j…j<j*j“j)jj;‘Û?j Äj!¹j"<j#Üj$<j%xj&2j'žj(¶j)<j**j+j,)j-j.;‘Ý?j0Øj1¹j2<j3[j4Îj5j6ŠÐ‘߶j8,j9;j:¤j;.j<;j=Ñj>+j?°j@?jAxjB¹jCxjD2jExjFjGŠÐŠÐ¶jIÂjJ2jK“jL;‘á?jNÂjO¹jPjQŠÐŠÐ<jS’jTÎjU<jV jW<jXjY<jZ³j[<‘å2j]“j^<j_*j`Ñja+jb–jc)jd)je2jfejg<jh*jiÑjj+jk¢jl)jm)jn2joijp<jq*jrÑjs+jt°ju)jvZjw2jxxjy<jzÅj{2j|–j}<j~Äj2j€¢j<j‚Ãjƒ2j„°j…<j†¶‘ç;jˆ¤j‰ÂjŠ¤j‹;jŒÂjÈjŽ¹j2jj‘nj’j“Åj”Äj•Ãj–Âj—ŠÐjÄj™»jš<‘ñäŠÐéjœnjžjŸŠÐŠÐÂj¡‹j¢»j£<j¤Âj¥lj¦»j§<‘÷äj©jªŠÐj° Zj¬§j­'‘ûäŠÐéj¯nj±j²ŠÐj¸ Zj´§jµ'’äŠÐéj·nj¹jºŠÐjÀ Zj¼§j½'’äŠÐéj¿njÁjŠÐjÈ ZjħjÅ'’ äŠÐéjÇnjÉjʊЊÐjÌ ïjÏŠÐjÍ îŠÐùjÐQjÑÃjÒjÓÂjÔ)jÕ6jÖ§j×jØÃjÙÂjڊЊÐÃjÜ‹jÝ»jÞ<jßÃjàljá»jâ<jãÂjä‹jå»jæ<jçÂjèljé»jê<’yäjìjíÃjîÂjïŠÐŠÐ6jñ^jòyjó\jô?jõ-jö;j÷Ãjø^’#’,jûÂjü>jýyjþijÿÂkkŠÐŠÐ XkkŠÐŠÐ^kÂk\k?k k
+ŠÐk,¶k 6k 6k<k*kík%k{k-kík%k§k)k ZkŒk;k ñk>k%kûk;k sk!-k"-k#mk$>k%ík&ûk';’‡?k)Øk*¹ŠÐék+nk-k. ñk/ŠÐkF¶k16k2<k3*k4%k5{k6-k7%k8§k9)k: Zk;Œk<;k= ñk>>k?%k@ûkA;’?kCØkD¹ŠÐékEnkGkJŠÐkH ñkc¶kK*kL‘kMÆkN)kO‹kP»kQ<kR*kS‘kTÆkU)kVlkW»kX<kYÅkZ'k[ Zk\k]äk^;k_Æk`Èka¹ŠÐékbnkdkeÆkfÅkgŠÐŠÐ<kiékj<‹.kl2kmkn<kokp2kqÊkr<ksÊktŽkuškv<kwèkx¨kyÒkz)k{Êk|±k}<k~`k¨k€‘ksk‚—kƒ"k„Êk…§k†<‹.¨kˆ‘k‰mkŠ—k‹"kŒÊk§kŽ<‹02kk‘Yk’nk“k”ŠÐŠÐ¶k–Qk—k˜sk™—kš¥k›kœmk—kž™kŸ;k ¤k¡ëk¢;k£mk¤—k¥Qk¦¹k§6k¨<k© îkª2k«fk¬—k­;k®sk¯-k°mk±>k²fk³ûk´kµŠÐké*k·sk¸ Zk¹zkº,k»mk¼ Zk½zk¾)‹6>kÀ ZkÁzkÂ<kÃ*kÄskÅ ZkÆykÇ,kÈmkÉ ZkÊykË)‹<>kÍ ZkÎykÏ<kÐÆkÑŸkÒ*‹D-kÔÅkÕ)kÖ>k×*kØmkÙ ZkÚzkÛ.kÜskÝ ZkÞzkß-kàmká Zkâykã.käskå Zkæykç)ŠÐékènkêkëÆkìÅkíŠÐl Ôkï<kð*kñ‘kò*kó*‹¬-kõ<kö)k÷,køÄkù)kú)kû<kü>ký‘kþ*kÿ*‹ß-l<l)l,lÔl)l<lÔlÉl <l
+Ôl îŠÐél nllŠÐl/Ôl<l*l‘l*l*‹æ-l€l)l,lÄl)l)l<l>l‘l *l!*‹è-l#€l$)l%,l&Ôl')l(<l)Ôl*Él+<l,Ôl-îŠÐél.nl0l1ŠÐlQÔl3<l4*l5‘l6*l7*‹ï-l9Bl:)l;,l<Äl=)l>)l?<l@>lA‘lB*lC*‹ñ-lEBlF)lG,lHÔlI)lJ<lKÔlLÉlM<lNÔlOîŠÐélPnlRlSŠÐlsÔlU<lV*lW‘lX*lY*‹ø-l[Rl\)l],l^Äl_)l`)la<lb>lc‘ld*le*Œ-lgRlh)li,ljÔlk)ll<lmÔlnÉlo<lpÔlqîŠÐélrnltluŠÐl€lw.lx*ly€lz,l{Äl|)l})ŠÐél~nl€lŠÐl‹Rlƒ.l„*l…Rl†,l‡Älˆ)l‰ZŠÐélŠnlŒlŠÐl¶l<l;l‘¤l’*l“<l”-Œ,)l–;l—Äl˜Él™¹lš,l›ÄŠÐélœnlžlŸŠÐl¯¶l¡€l¢;l£¤l¤*l¥€l¦-ŒA)l¨;l©ÄlªÉl«¹l¬,l­ÄŠÐél®nl°l±ŠÐlÁ¶l³Bl´;lµ¤l¶*ŒG-l¸Bl¹)lº;l»Äl¼Él½¹l¾,l¿ÄŠÐélÀnlÂlÊÐlÓ¶lÅRlÆ;lǤlÈ*Œa-lÊRlË)lÌ;lÍÄlÎÉlϹlÐ,lÑÄŠÐélÒnlÔlՊЊÐ<l×^lØ\lÙ*lÚ-lÛlÜÕlÝ<lÞ^lß\làÐlá-lâ¬lãylä<lå^læ\lçelè-lé^lê\lëílì-lí^lî\lïqlð-lñ^lò\ló‘lôÿlõ<Œ†2l÷ËlølùŠÐŠÐ<lûlüÕlý<Œª2lÿ<m2m€m2mBm2mRm<m"m2m ¬m
+m ŠÐm9Ëm <mm>m^mËm\m*m<m<m>m^mËm\mem<m€m>m^mËm \m!ím"<m#Bm$>m%^m&Ëm'\m(qm)<m*Rm+>m,^m-Ëm.\m/‘m0<m1¬m2>m3^m4Ëm5¡m6\m7ЊÐém8nm:m;ŠÐŠÐ<m=m>Õm?<m@:mA*mB¬mCÅmDØmEÌmF‹mG)mH2mI<mJ<mK:mL*mM¬mNÅmOµmPÌmQ‹mR)mS2mT€mU<mV¬mWÅmXÛmYÌmZlm[2m\Bm]<m^¬m_Åm`¹maÌmblmc2mdRme<mfmg¯mhÂmi2mj¬mkmlŠÐŠÐ<mn¶mo^mpÂmq\mr*ms2mtmu<mv^mwÂmx\myemz2m{<m|<m}^m~Âm\m€ím2m‚€mƒ<m„^m…Âm†\m‡qmˆ2m‰BmŠ<m‹^mŒÂm\mŽ‘m2mRm‘<m’^m“Âm”\m•Ðm–2m—¬m˜;m™¤mš m›<ŒÁsm;mž^mŸÂm \m¡Ðm¢1m£¹m¤m¥ŠÐŠÐÂm§¶m¨m©;mª¤m«žm¬;m­Âm®ÿm¯¹m°m±ŠÐmïm³2m´Êmµ<m¶Êm·Žm¸6m¹§mº<m»èm¼.m½¨m¾*ŒK-ŒM)mÁmÂÊmñmÄ<mÅ*mÆÄmÇhmÈÅmÉŸmÊ‘mË*mÌ*mÍ<mÎ-mÏ€mÐ-mÑBmÒ-mÓRmÔ)mÕŸmÖ,ŒO)mØ$mÙŽmÚ)mÛ"mÜÊmݧmÞ<m߬màQmá‘mâÄmã)mäÊmå§mæ<ŒQ2mèèméYmê<ŒS2mìmíYŠÐémînmðmñÅmòÄmóŠÐŠÐÂmõ¢mö<m÷*møÂmùÅmú'mû”müémý-mþÂmÿÅn'nün)nìn<n*nÂnÅŒ[”n én
+,Œ]-n Ân ÅŒ_ün)nìnnŠÐŒc.n2nn<nén<n´n<n`n¨n în<n´n <n!`n"2n#èn$Yn%nn&n'ŠÐŠÐ`n)¨n*Ân+Ôn,n-ŠÐŠÐ`n/¨n0Ân1ôn2n3ŠÐŠÐ`n5¨n6Ân7¢n8n9ŠÐŠÐ`n;¨n<Ân=™n>n?ŠÐŠÐ*nA¬nB&nCVnD>nEnF)nG’nHnIŠÐŠÐ×nKQnL‘nMÂnNhnOnP"nQšnR¶nS˜nT;nUnV1nW¹nXnYŠÐŠÐ¬n[Qn\Ân]@n^™n_n`ŠÐŠÐ¬nbQnc‘ndÂne)nfšngnhŠÐŠÐ6nj§nknlŠÐŠÐ‘nnÂno"npšnq<Œg.ns2ntànunvŠÐŠÐ¬n{nyŠÐnxòŠÐ<Œu2n}žn~<Œw2n€Nn<Œy2nƒún„<Œ{2n†Mn‡<Œ}2n‰ínŠ<nØŒ2nnŒŒ2nŽ<nŠÐŠÐ<ŒŠ2n”žn•<ŒŒ2n—Nn˜<ŒŽ2nšún›<Œ–2nMnž<Œ˜2n ín¡<n§ØŒš2n¤n£Œœ2n¥<n¦ŠÐŠÐ<ŒÇ2n«žn¬<ŒÉ2n®Nn¯<ŒË2n±ún²<ŒÍ2n´Mnµ<ŒÏ2n·ín¸<n¾ØŒÑ2n»nºŒÓ2n¼<n½ŠÐŠÐ<nÁ€nÂ>nÃnÄonÅ<'nÇgnÈ2nÉgnÏ-nÊ<2nËnÐ<nÍØnΊЊÐ< 2nÓžnÔ<2nÖNn×<2nÙúnÚ<2nÜMnÝ<2nßínà<næØ2nãnâ2nä<nåŠÐŠÐ^né Xnê\në†nìÎníAnî‚nï<!'nñ Xnò§nó2nô^nõ Xnö\n÷†nø<nùÑnú¡nû2nü XnýnþŠÐo*oÄ%)oÝŠÐéonoŠÐoŠÐ˜o<o ˜o
+Ôo o ŠÐŠÐ<l2o–o<o*oúo,oÕn)o$o›o–o<oo<oo¯o¶o¬o ;o!¤o"øo#;o$¬o%1o&¹o'2o(¬o)<o*go+Îo,<o-bo.<o/¶o0o1o20o3>o4:o5Ao6<o7o8o9+o:>o;¾o<Ao=;o>¤o?]o@>oA:oBooC<oD]oE>oF¾oGooH;p>oJoK¹oL<oM—oN+oOMoP2oQMoR<oSØoT2oUÄoV¶oW<r>oYoZ;o[o\1o]¹o^¶o_<t>oa—ob;oc—od1oe¹of<og¶oh^oi˜oj\ok†ol;om¤on*oo˜op'v)or;os˜otÔou¹ovÎow<ox¬oy­oz<o{o|ÿo}¶o~<o o€>o˜o‚;oƒ˜o„1o…¹o†<x2oˆ–o‰oŠŠÐŠÐéoŒ¶o6oŽ<o™o2o‘%o’;o“ îo”>o•%o–ûo—;o˜$o™uoš0o›$oœŸo+ožÃoŸ?o uo¡0o¢Ÿo£¹o¤6o¥¶o¦<o§$o¨%o©2oª$o«Ÿo¬<o­%o®2o¯Ÿo°;o±$o²Ÿo³?o´$oµ%o¶ro·<o¸$o¹%oº2o»$o¼uo½<o¾%o¿2oÀuoÁ;oÂ$oÃuoÄ=oÅ$oÆ%oÇroÈ<oÉ$oÊ%oË>oÌ$oÍŸoÎ>oÏ$oÐuoÑ<oÒ%oÓ>oÔ™oÕ>oÖŸo×>oØuoÙ;oÚuoÛ1oܹoÝ;oÞ îoß>oà%oáûoâ<oã™oä-oåŸoæ-oçuoèîoénoêoë îoìŠÐŠÐ6oî<oïhoð,oñ*oòžoó+oôÑoõ+oö$o÷%oø)oùZoú2oû%oü;oý îoþ>oÿ%pûpp îpŠÐŠÐ6p<php,p*p žp
++p Ñp +p $p%p)p)p2p%p;p îp>p%pûpp îpŠÐŠÐ6p¶p<p:z2p %p!;|6p#%p$¹p%<p&*p'úp(,p)Ñp*+p+$p,%p-)p.)p/2p0%p1;p2 îp3>p4%p5ûp6p7 îp8ŠÐŠÐ6p:¶p;<€2p=%p>;‚6p@%pA¹pB<pC*pDúpE,pFÑpG+pH$pI%pJ)pKZpL2pM%pN;pO îpP>pQ%pRûpSpT îpUŠÐŠÐ6pW<pXúpY,pZÑp[+p\$p]%p^2p_%p`;pa îpb>pc%pdûpepf îpgŠÐŠÐ6pi<pj*pkÑpl+pm$pn%po)ppzpq·pr2ps%pt;pu îpv>pw%pxûpypz îp{ŠÐŠÐ6p}<p~*pÑp€+p$p‚%pƒ)p„yp…·p†2p‡%pˆ;p‰ îpŠ>p‹%pŒûppŽ îpŠÐŠÐ6p‘<p’*p“Ñp”+p•$p–%p—)p˜)p™2pš%p›;pœ îp>pž%pŸûp p¡ îp¢ŠÐŠÐ6p¤<p¥*p¦Ñp§+p¨$p©%pª)p«Zp¬2p­%p®;p¯ îp°>p±%p²ûp³p´ îpµŠÐŠÐ6p·<p¸Ñp¹+pº$p»%p¼2p½%p¾;p¿ îpÀ>pÁ%pÂûpÃpÄ îpŊЊÐ<pÇÑpÈ+pÉpÊ2pËApÌ<pÍÕpÎ2pÏÑpÐ<pÑMpÒ2pÓÁpÔ<Ž0pÖMp×2pصpÙ<pÚ­Ž2pܪpÝ<pÞÕŽ0Ž2pá­pâ<Ž0päMpå2pæÄpç<Ž0péMpê2pëÕpì<Ž 0pîMpï2pð´pñ<Ž"0póMpô2põÈpöp÷ŠÐq%Ðpù6pú<pûÐpü2pý¶pþœpÿ;q¤q q;q*qÐq)q Zq¹q<q Œq
+6q *q œq .q q)q<qq<q^qœq-q q\Ž$2qÐq;q¦q<qÆq2qœq <q!Åq"2q# ŠÐéq$nq&q'Æq(Åq)ŠÐqr¶q+^q,Æq-Åq.'q/üq0-q1Åq2Åq3'q4üq5\q6Äq7;q8¤q9Qq:;q;Åq<Qq=¹q>6q? q@^qAÆqBÅŽ,,qDuqEäqF-qGÅqHÅŽ.,qJuqKäqL\qMÄqNEqO^qPÆqQÅqRuqS3qT-qUÅqVÅqWuqX3qY\qZÄq[9q\ q]^q^Æq_Åq`uqaüqb-qcÅqdÅqeuqfüqg\qhÄqi;Ž0.qkÅqlÚqm@Ž2>qouqpiŠÐéqqnqsqtÆquÅqvÄqwŠÐŠÐQqyÃqz~q{Åq|.q}Âq~|q*q€^qÅq‚‹qƒ-q„Âq…‹q†\q‡Æqˆ-q‰^qŠÂq‹lqŒ-qÅqŽlq\qÆq‘)q’Ãq“~q”Øq•|q–Åq—Ãq˜~q™Äqš.q›Åqœ|q*qž^qŸÅq ‹q¡-q¢Äq£‹q¤\q¥Æq¦-q§^q¨Äq©lqª-q«Åq¬lq­\q®Æq¯)q°Ãq±~q²¹q³|q´ÄqµÃq¶~q·Ãq¸.q¹Äqº|q»*q¼^q½Ãq¾‹q¿-qÀÄqÁ‹qÂ\qÃÆqÄ-qÅ^qÆÄqÇlqÈ-qÉÃqÊlqË\qÌÆqÍ)qÎÃqÏ~qеqÑ|qÒÃqÓÃqÔ~qÕÂqÖ.q×ÃqØ|qÙ*qÚ^qÛÃqÜ‹qÝ-qÞÂqß‹qà\qáÆqâ-qã^qäÂqålqæ-qçÃqèlqé\qêÆqë)qìÃqí~qîÛqï|qðÂqñqòÆqóÅqôÄqõÃqöÂq÷ŠÐŠÐ^qùžqú\qûÔqüÃqý6qþ~qÿdr|r^rlr\rÔrÃr;ŽU.ržr @ŽW>r lr iŽYÔr*ŽcÔr.r^ržr\rÔr2rdr6r<r{r2r^ržr¡r\rÔr ;r! îr">r#{r$ir%<Že2r'žr()r)’r*r+ îr,ŠÐŠÐÂr.>r/Êr0<r1¶r2Êr3Ôr4;r5Âr6Ôr7rr8Êr9Ér:;r;Âr<Ér=¹r>r?ŠÐrXÊrA6rB¶rC<rDàrE2rFÊrG;rHÊrI?rJàrK¹rL;rM ñrN>rOàrPirQ<rRÄrSrT<rUÊrVîŠÐérWnrYrZ ñr[Är\ŠÐruÊr^6r_¶r`<raàrb2rcÊrd;reÊrf=rgàrh¹ri;rj ñrk>rlàrmirn<roÄrprq<rrÊrsîŠÐértnrvrw ñrxÄryŠÐŠÐÂr{hr|Ãr}Ÿr~Âr.r€hrr‚ÃrƒÂr„ŠÑŠÐér†ˆr‡<rˆˆr‰²rŠ>r‹ˆrŒ©r<rŽˆrÉr.r‘>r’ˆr“™r”<r•Ãr–>r—ˆr˜òr™Ãrš<r›Ârœ>rˆržòrŸÂr <r¡ˆr¢­r£nr¤òr¥r¦Ãr§Âr¨ŠÐr° Zrª<Žm.r¬ Zr­2r® ZŠÐér¯nr±r²ŠÐrº Zr´<Šì,r¶ Zr·2r¸ ZŠÐér¹nr»r¼ŠÐŠÐér¾¶r¿ÃrÀÅrÁ*rÂ'rÃ-rĤrÅ)rÆÍrÇ;rȤrÉÃrÊÅrË'rÌürÍ~rÎÃrÏÅrÐ'rÑ”rÒ|rÓ;Šô=rÕ¤rÖ¹r×ÃrضrÙÂrÚÅrÛ*rÜ¢rÝ-Šö)rßÍrà;rá¤râ~rãÂräÅŠø”ræ|rçÂrèÅŠúürê;Šü=rì¢rí¹rî<rï*rðÃrñ®rò¦ró)rô‹rõ2rö¤r÷<rø*rùÂrú®rû¦rü)rý‹rþ2rÿ¢s<sÃsÅŠþüshsç‹$s]s2s ¦s
+ns s ŠÐŠÐés¶s^sÃsÅsÒsüs-sÂsÅsÐsüs\‹;s¤sÒs<s*‹)s ss!;‹
+=s#Ðs$¹s%<s&Ãs'®s(Âs)>s**s+Òs,-s-Ðs.)s/<s0Òs1-s2Ðs3îs4ns5s6ŠÐsLÅs8Ås9¢s:üs;¶s<<s=*‹)s?ss@;‹=sB¢sC¹sD<sEÅsFÅsGÄsHèsI2sJ¢ŠÐésKnsMsNŠÐsYÅsPÅsQÄsRäsS.sTÅsUÅsVÄsW3ŠÐésXnsZs[ŠÐŠÐ¶s]¶s^*s_Âs`äsa'‹'scÃsdäse'‹ssg)sh’si;sj¤sk¶sl6smÃsn0so;spÂsqåsr`ss>stosuisv;sw¤sx6syÃsz+s{;s|Âs}@‹ >sos€is;‹":sƒÂs„¹s…;s†Âs‡\sˆ>s‰ÂsŠ¹‹$;sŒ¤‹&;sŽ*‹(?sÂs‘)s’Es“*‹*>s•Ãs–)s—rs˜*s™Ãsš±s›+sœÂs)sžÝsŸ;‹,?s¡Ãs¢¹s£s¤ŠÐŠÐ¶s¦Âs§Ås¨Ãs©Âsª;s«¤s¬Âs­+s®Âs¯;‹2>s±Ãs²¹s³s´ŠÐŠÐ*s¶Ãs·‹s¸+s¹Âsº‹s»,s¼Ãs½ls¾+s¿ÂsÀlsÁ)sÂsÊЊÐ*sÅÃsÆ0sÇÂsÈ)sÉ\sÊsˊЊÐ*sÍ*sÎÃsÏ0sÐÂsÑ)sÒ\sÓ+sÔÃsÕ.sÖÂs×)sØsÙŠÐsõ¶sÛÄsÜÅsÝ'sÞüsß;sà¤sáQsâ;sãÄsäQså¹sæ6sç¼sèÄséÅsêlsëüsì;‹8.sîÄsïÚsð@‹:>sòlsóiŠÐésônsös÷ŠÐtÄsù¶sú¥sû;‹@6sýÄsþ‹sÿ¹t<‹B2ttYŠÐétnttŠÐtˆt <t
+øt >t Ät òtˆt<tˆt­ŠÐétnttŠÐtÄt<t0tÄŠÐétnttŠÐt"ÄtŸt ØŠÐét!nt#t$ŠÐt-Ät&¶t't(;t)Ät*Ôt+¹ŠÐét,nt.t/ŠÐt7*t1Ät2.t3)t4\t5.ŠÐét6nt8t9ŠÐtB:t;*‹R,t=¾t>Ät?)t@\ŠÐétAntCtDŠÐtK*‹X,tGÄtH)tI\ŠÐétJntLtMŠÐti¶tOÄtP;tQ¤tR*tSÄtT‹tU)tV-tWÄtXltYZtZ)t[;t\Ät]Ét^rt_*‹^,taÄtb)tc\td;teÄtfÿtg¹ŠÐéthntjtkŠÐtq@tm<tn@toîŠÐétpn‹ÌtrtsŠÐ‹úttŠÐt>ŠÑ tyt€ŠÐt}t~Atx Xt‚Ãt| XtvŠÐŠÐŠÐ<Žƒ2t„Gt…<Ž…2t‡1tˆ<Ž‡2tŠ>t‹<Ž‰2ttŽ<Ž‹2tït‘<Ž2t“Tt”<Ž2t–Þt—<Ž‘2t™`tš<Ž“2tœÆt<Ž•2tŸít <Ž—2t¢ªt£<Ž™2t¥Wt¦<Ž›2t¨Ut©<Ž2t«†t¬t­ŠÐŠÐTt¯<ŽŸ2t±Wt²<Ž¡2t´Utµt¶ŠÐŠÐ<Ž£2t¹Gtº<Ž¥2t¼1t½<Ž§2t¿>tÀ<Ž©2tÂtÃ<Ž«2tÅïtÆ<Ž­2tÈTtÉ<Ž¯2tËÞtÌ<Ž±2tÎ`tÏ<Ž³2tÑÆtÒ<Žµ2tÔítÕ<Ž·2tתtØ<Ž¹2tÚ†tÛt܊ЊÐ*Ž»2tßUtà<Ž½2tâWtã)tä’tåtæŠÐŠÐºtèSté<têÂtëItìtíŠÐŠÐ*tï6tð<Ž¿2tòWtóYtô)tõ’töt÷ŠÐŠÐ<tùétú<tû îtüntýÿtþtÿu îuŠÐŠÐuŠÐŠÐuŠÐŠÐ ŽÁpuòu  u
+u ŠÐŠÐ u 'uòu uuŠÐŠÐ~ŽÃ½u|u u~ŽÅ½u|uuŠÐŠÐ^u^uuŠÐŠÐÂu ‹u!u"u#ŠÐŠÐ^ŽÇ.u&#u'u(ŠÐŠÐ^ŽÉ#u-ŠÐu+h«ŠÐñŠÐŠÐÿR ‰~$#ŠÐ)%$ŠÐ)'&S0)(**))>+*G7,+E+-,O.-F+0/H6;:N<;P=<M2>=Q3?>O2@?ŠÐ)A@=UTŠÐ)\[?]\^]@`_,(baŠÐ)cbŠÐ)dcŠÐ)edŠÐ)feŠÐ)hgŠÐ)ihŠÐ)lkŠÐ)mlŠÐ)nmŠÐ)onŠÐ)qpŠÐ)rqŠÐ)srŠÐ)tsŠÐ)utŠÐ)vuŠÐ)xwŠÐ)yxŠÐ)zyŠÐ){z‘•)|{.~}A‹ò6"Öˆ‹d)“’jÛ
+˜XnJ
+›à›$!žim¦
+ŸT7ºß#!¿ËŽE)Ä08(Í_%Ï ŠÐ)Ñ‹’‹)ÔÅØ9"(æúr©
+팊Ð)ù“’w)ýôs 1ÿèsµ5jmm
+I-=µ‰u
+ / <%($p
+Z p|
+$=&è,")Ú‹V)1ä("2IM5yL6N27R29N9:P2G·i'
+Q7BX±iE
+o Y7p±u$
+s4(Át·
+ˆâŠÐ)•³˜´u
+™ó7"šTnm
+ž7(¢î.(¤÷/(¦õŠò)©ôŒ8"ª–)¬,Œk)­ç)¯ Z7° ²µJ-³5(´ª)µÝ)¶B¨·KH¹G²¼¶žu
+¾Û¿ðs7,ÁŒ)øu
+Ä )Å[EÆ(È‘û)Éö:"ÊþŠÐ)Ì®d%Ðñ4(ÑK-ÒòŠÐ)ÔŽQ)Õñ)ØdGÙwŒW)ÛÇŽ})àŠÐ)äæ*"í—’)ï¯(ú6(jð
+8!(  1 1(Ü !¦ŠÐ)à‹J)¿B(í1"!Ý‹P)'·+()9C-]6QŒm):½tø
+B*(K\n.
+M5(N›’)S!8`f„bpø
+€AiÁ
+‹ð4"Œ 1(e2hæ
+’¨‘Ù)™ür…
+¤Òt{
+¬
+ŠÐ)³§hì
+µÍŽA)»‘Âés¥
+Äí‹)Î_°ÒSà"pV
+çö-(è:#(ë}k•
+ì©jR
+÷\³û Xÿ»‘—)
+²i@
+¥ŠÐ)PŒo)¬j7
+*6nÿ
+7Ót
+:Ü<×3">pÆ
+@ã‹F)AEL4L'(R¬ŽË)T(U£¥YæsÌ5[yŒ?)^ç`~(cì0"dŽ<)eq‘n)hÃœ)(i ´ÂkFŒÅ)m"oYŸpL;qvŒi)sYuýŽk)vþB"wë¢/"yÇ€¿tç
+‚U ƒ‘‹å)"‘n‘ƒ)˜ºu5šÅh¿
+ŸxŒE)  2(¥R’ §b#¨8B¬OŒq)®qø
+¿Ëh­
+ÄÏŒ®)ÔWnZ
+Ü&oí
+â[n4
+äb%è^:(íp‘u)ï ,ò X7@j
+:C)(é-""4D'WI)5D5¶i,
+7hH°iJ
+Q«jH
+\5))]ÌŽC)qdx^%ÐŒ¬)€¡‘õ)“.(”çsÄ5–-(Þ"!ž/¦(Ÿ0(¢,(£¦««`n
+°+(ÂÔtu
+ÊÄhÍ
+×Õ‹Ê)äulú
+è`% ºi
+ mm
+ Éh³
+D$-Š’‘)1 (6E<h>(G(IXN=&(Oá%!Re;(S¹u
+YX qo‘|)rI€g=(…á‹H)†(Ó)”ì‹)ŸNŒs)§Jª!
+(´_hÝ
+Αÿ)Й’ )Ñ79(Ù6(Úï3"âQå°u)
+éÿC"ìaŒY)óÛ!÷Ì¥  ûr…
+;$(‘U)T$ V7(«ŽÍ)0´i6
+?ÑŒ8)Bf<(JtŒ¿)Q‡D$U$ (Vä‹>)ZÙ™‹\)\ü–@"_p¶
+c¾A(g1j)h
+ªW7mî 2"nM qp£
+{Ÿj«
+z‹`)„†.f)‹%p
+Ž6D’¼u
+–?((—|‹)™Snw
+Ÿû€?"¢Uni
+£“r-
+¤H¥ç+"¨U7®,±O´IŽn©
+µÆŽ)¶)o‹
+·Œ()¹È¡Ž{)º
+5½P<¾³i;
+¿ ©R²¤ÄVFÈã'"ÉÏšÊc‹ŒI)Ës?(Î Ðk‘g)Ñ2(ÒɘŽy)Ô`ÕÊ ÖØÅŽ)Û”Â8Ü®há
+Ýø<"Þ±(à&(äéCQí(î^ ñâ‚òc:ôVna
+øÎŒÚ)üa%ýú>"þ#p9
+ÿÓÿr@
+ 8(( ¹‘™)>¬'(#ƒ (%•(ªŠÐ)!ph
+ î8k1;
+) +)"Ý!!#aJ(M…n’
+*r‘`)+>nÑ
+-:nè
+3c%45÷;"6#7¾tî
+8Ú!9Ž*)<Ø‹b)=Áhò
+>" (?Žk
+@¯u,
+A3(FYn@
+K"8OZn:
+Q=TÀtÝ
+W7 ([­‘×)^eKlñ5"n•ŠÐ)p X8~Ì¥Çh¹
+ÂhÓ
+Ài
+½@(¸i"
+µi1
+¯hü
+¤ŠÐ)£j˜
+–ŠÐ)”jÎ
+k
+€ŠÐ)~Ž(){k¶
+dŒ0)bŠÐ)]n(
+Rnz
+JŒˆ)EŠnÀ
+BŒÿ)4o
+3m²
+/‘O)*†‘W)(ŠÐ)'ŠÐ)p
+ 3(Ž:)0(Ži)ùŠê)øŠð)åsÚ5ß‹L)Þ‹N)ÊŽG)Ä*(—t®
+»ŠÐ)z€LgZ!Î \-[7ý­A"ù="õ9"ê."â&"FŠÐ)XŠÐX)ŠÐ>[?/H6:N;PEDBCQAŠå)ŠÐ)íB !"#$Å%&'×()*+,-./01$2$3456789:;<=>? ÃÄÿÿÿ·ÿÿ_öî÷š   ñ
+)¸R07^ÿùefgÿùhs½ô¾¿Íné>À Í
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.log b/fonts/utilities/mf2ps/MFfonts/bases/myplain.log
new file mode 100644
index 0000000000..89ef087e3b
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.log
@@ -0,0 +1,17 @@
+This is METAFONT, Version 1.0 for Berkeley UNIX (INIMF) 8 MAR 1989 16:23
+**\input myplain;dump;end.
+(myplain.mf
+Preloading the plain base, version 1.0: preliminaries,
+ basic constants and mathematical macros,
+ macros for converting from device-independent units to pixels,
+ macros and tables for various modes of operation,
+ macros for drawing and filling,
+ macros for proof labels and rules,
+ macros for character and font administration,
+and a few last-minute items.)
+Beginning to dump on file myplain.base
+ (preloaded base=myplain 89.3.8)
+1230 strings of total length 22208
+4690 memory locations dumped; current usage is 1362&3209
+493 symbolic tokens
+Font metrics written on myplain.tfm
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf b/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf
new file mode 100644
index 0000000000..9c85b7e622
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf
@@ -0,0 +1,622 @@
+% This is the plain METAFONT base that's described in The METAFONTbook.
+% N.B.: Please change "base_version" whenever this file is modified!
+% And don't modify the file under any circumstances.
+string base_name, base_version; base_name="plain"; base_version="1.0";
+
+message "Preloading the plain base, version "&base_version&": preliminaries,";
+
+delimiters (); % this makes parentheses behave like parentheses
+def upto = step 1 until enddef; % syntactic sugar
+def downto = step -1 until enddef;
+def exitunless expr c = exitif not c enddef;
+let relax = \; % ignore the word `relax', as in TeX
+let \\ = \; % double relaxation is like single
+def ]] = ] ] enddef; % right brackets should be loners
+def -- = {curl 1}..{curl 1} enddef;
+def --- = .. tension infinity .. enddef;
+def ... = .. tension atleast 1 .. enddef;
+
+def gobble primary g = enddef;
+primarydef g gobbled gg = enddef;
+def hide(text t) = exitif numeric begingroup t;endgroup; enddef;
+def ??? = hide(interim showstopping:=1; showdependencies) enddef;
+def stop expr s = message s; gobble readstring enddef;
+
+smoothing:=1; autorounding:=2; % this adjusts curves to the raster
+turningcheck:=2; % this will warn about a "strange path"
+granularity:=1; % this says that pixels are pixels
+
+def interact = % sets up to make "show" commands stop
+ hide(showstopping:=1; tracingonline:=1) enddef;
+
+def loggingall = % puts tracing info into the log
+ tracingcommands:=3; tracingedges:=2; tracingtitles:=1; tracingequations:=1;
+ tracingcapsules:=1; tracingspecs:=1; tracingpens:=1; tracingchoices:=1;
+ tracingstats:=1; tracingoutput:=1; tracingmacros:=1; tracingrestores:=1;
+ enddef;
+
+def tracingall = % turns on every form of tracing
+ tracingonline:=1; showstopping:=1; loggingall enddef;
+
+def tracingnone = % turns off every form of tracing
+ tracingcommands:=0; tracingonline:=0; showstopping:=0;
+ tracingedges:=0; tracingtitles:=0; tracingequations:=0;
+ tracingcapsules:=0; tracingspecs:=0; tracingpens:=0; tracingchoices:=0;
+ tracingstats:=0; tracingoutput:=0; tracingmacros:=0; tracingrestores:=0;
+ enddef;
+
+message " basic constants and mathematical macros,";
+
+% numeric constants
+newinternal eps,epsilon,infinity,_;
+eps := .00049; % this is a pretty small positive number
+epsilon := 1/256/256; % but this is the smallest
+infinity := 4095.99998; % and this is the largest
+_ := -1; % internal constant to make macros unreadable but shorter
+
+% pair constants
+pair right,left,up,down,origin;
+origin=(0,0); up=-down=(0,1); right=-left=(1,0);
+
+% path constants
+path quartercircle,halfcircle,fullcircle,unitsquare;
+quartercircle=(right{up}..(right+up)/sqrt2..up{left}) scaled .5;
+halfcircle=quartercircle & quartercircle rotated 90;
+fullcircle=halfcircle & halfcircle rotated 180 & cycle;
+unitsquare=(0,0)--(1,0)--(1,1)--(0,1)--cycle;
+
+% transform constants
+transform identity;
+for z=origin,right,up: z transformed identity = z; endfor
+
+% picture constants
+picture blankpicture,unitpixel;
+blankpicture=nullpicture; % `display blankpicture...'
+unitpixel=nullpicture; addto unitpixel contour unitsquare;
+
+% string constants
+string ditto; ditto = char 34; % ASCII double-quote mark
+
+% pen constants
+def capsule_def(suffix s) primary u = def s = u enddef enddef;
+capsule_def(pensquare) makepen(unitsquare shifted -(.5,.5));
+capsule_def(penrazor) makepen((-.5,0)--(.5,0)--cycle);
+pen penspeck; penspeck=pensquare scaled eps;
+
+% nullary operators
+vardef whatever = save ?; ? enddef;
+
+% unary operators
+let abs = length;
+
+vardef round primary u =
+ if numeric u: floor(u+.5)
+ elseif pair u: (hround xpart u, vround ypart u)
+ else: u fi enddef;
+
+vardef hround primary x = floor(x+.5) enddef;
+vardef vround primary y = floor(y.o_+.5)_o_ enddef;
+
+vardef ceiling primary x = -floor(-x) enddef;
+
+vardef byte primary s =
+ if string s: ASCII fi s enddef;
+
+vardef dir primary d = right rotated d enddef;
+
+vardef unitvector primary z = z/abs z enddef;
+
+vardef inverse primary T =
+ transform T_; T_ transformed T = identity; T_ enddef;
+
+vardef counterclockwise primary c =
+ interim autorounding:=0;
+ if turningnumber c <= 0: reverse fi c enddef;
+
+vardef tensepath expr r =
+ for k=0 upto length r - 1: point k of r --- endfor
+ if cycle r: cycle else: point infinity of r fi enddef;
+
+% binary operators
+
+primarydef x mod y = (x-y*floor(x/y)) enddef;
+primarydef x div y = floor(x/y) enddef;
+primarydef w dotprod z = (xpart w * xpart z + ypart w * ypart z) enddef;
+
+primarydef x**y = if y=2: x*x else: takepower y of x fi enddef;
+def takepower expr y of x =
+ if x>0: mexp(y*mlog x)
+ elseif (x=0) and (y>0): 0
+ else: 1
+ if y=floor y:
+ if y>=0: for n=1 upto y: *x endfor
+ else: for n=_ downto y: /x endfor
+ fi
+ else: hide(errmessage "Undefined power: " & decimal x&"**"&decimal y)
+ fi fi enddef;
+
+vardef direction expr t of p =
+ postcontrol t of p - precontrol t of p enddef;
+
+vardef directionpoint expr z of p =
+ a_:=directiontime z of p;
+ if a_<0: errmessage("The direction doesn't occur"); fi
+ point a_ of p enddef;
+
+secondarydef p intersectionpoint q =
+ begingroup save x_,y_; (x_,y_)=p intersectiontimes q;
+ if x_<0: errmessage("The paths don't intersect"); origin
+ else: .5[point x_ of p, point y_ of q] fi endgroup
+enddef;
+
+tertiarydef p softjoin q =
+ begingroup c_:=fullcircle scaled 2join_radius shifted point 0 of q;
+ a_:=ypart(c_ intersectiontimes p); b_:=ypart(c_ intersectiontimes q);
+ if a_<0:point 0 of p{direction 0 of p} else: subpath(0,a_) of p fi
+ ... if b_<0:{direction infinity of q}point infinity of q
+ else: subpath(b_,infinity) of q fi endgroup enddef;
+newinternal join_radius,a_,b_; path c_;
+
+% special operators
+vardef incr suffix $ = $:=$+1; $ enddef;
+vardef decr suffix $ = $:=$-1; $ enddef;
+
+def reflectedabout(expr w,z) = % reflects about the line w..z
+ transformed
+ begingroup transform T_;
+ w transformed T_ = w; z transformed T_ = z;
+ xxpart T_ = -yypart T_; xypart T_ = yxpart T_; % T_ is a reflection
+ T_ endgroup enddef;
+
+def rotatedaround(expr z, d) = % rotates d degrees around z
+ shifted -z rotated d shifted z enddef;
+let rotatedabout = rotatedaround; % for roundabout people
+
+vardef min(expr u)(text t) = % t is a list of numerics, pairs, or strings
+ save u_; setu_ u; for uu = t: if uu<u_: u_:=uu; fi endfor
+ u_ enddef;
+
+vardef max(expr u)(text t) = % t is a list of numerics, pairs, or strings
+ save u_; setu_ u; for uu = t: if uu>u_: u_:=uu; fi endfor
+ u_ enddef;
+
+def setu_ primary u =
+ if pair u: pair u_ elseif string u: string u_ fi;
+ u_=u enddef;
+
+def flex(text t) = % t is a list of pairs
+ hide(n_:=0; for z=t: z_[incr n_]:=z; endfor
+ dz_:=z_[n_]-z_1)
+ z_1 for k=2 upto n_-1: ...z_[k]{dz_} endfor ...z_[n_] enddef;
+newinternal n_; pair z_[],dz_;
+
+def superellipse(expr r,t,l,b,s)=
+ r{up}...(s[xpart t,xpart r],s[ypart r,ypart t]){t-r}...
+ t{left}...(s[xpart t,xpart l],s[ypart l,ypart t]){l-t}...
+ l{down}...(s[xpart b,xpart l],s[ypart l,ypart b]){b-l}...
+ b{right}...(s[xpart b,xpart r],s[ypart r,ypart b]){r-b}...cycle enddef;
+
+vardef interpath(expr a,p,q) =
+ for t=0 upto length p-1: a[point t of p, point t of q]
+ ..controls a[postcontrol t of p, postcontrol t of q]
+ and a[precontrol t+1 of p, precontrol t+1 of q] .. endfor
+ if cycle p: cycle
+ else: a[point infinity of p, point infinity of q] fi enddef;
+
+vardef solve@#(expr true_x,false_x)= % @#(true_x)=true, @#(false_x)=false
+ tx_:=true_x; fx_:=false_x;
+ forever: x_:=.5[tx_,fx_]; exitif abs(tx_-fx_)<=tolerance;
+ if @#(x_): tx_ else: fx_ fi :=x_; endfor
+ x_ enddef; % now x_ is near where @# changes from true to false
+newinternal tolerance, tx_,fx_,x_; tolerance:=.1;
+
+message " macros for converting from device-independent units to pixels,";
+
+def fix_units = % define the conversion factors, given pixels_per_inch
+ mm:=pixels_per_inch/25.4; cm:=pixels_per_inch/2.54;
+ pt:=pixels_per_inch/72.27; pc:=pixels_per_inch/6.0225;
+ dd:=1238/1157pt; cc:=12dd;
+ bp:=pixels_per_inch/72; in:=pixels_per_inch;
+ hppp:=pt; % horizontal pixels per point
+ vppp:=aspect_ratio*hppp; % vertical pixels per point
+ enddef;
+
+mm#=2.84528; pt#=1; dd#=1.07001; bp#:=1.00375;
+cm#=28.45276; pc#=12; cc#=12.84010; in#:=72.27;
+
+newinternal pixels_per_inch; % the given resolution
+newinternal blacker, o_correction; % device-oriented corrections
+
+def define_pixels(text t) =
+ forsuffixes $=t: $:=$.#*hppp; endfor enddef;
+def define_whole_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp); endfor enddef;
+def define_whole_vertical_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp); endfor enddef;
+def define_good_x_pixels(text t) =
+ forsuffixes $=t: $:=good.x($.#*hppp); endfor enddef;
+def define_good_y_pixels(text t) =
+ forsuffixes $=t: $:=good.y($.#*hppp); endfor enddef;
+def define_blacker_pixels(text t) =
+ forsuffixes $=t: $:=$.#*hppp+blacker; endfor enddef;
+def define_whole_blacker_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp+blacker);
+ if $<=0: $:=1; fi endfor enddef;
+def define_whole_vertical_blacker_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp+blacker);
+ if $<=0: $:=1_o_; fi endfor enddef;
+def define_corrected_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp*o_correction)+eps; endfor enddef;
+def define_horizontal_corrected_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp*o_correction)+eps; endfor enddef;
+
+def lowres_fix(text t) expr ratio =
+ begingroup save min,max,first;
+ forsuffixes $=t: if unknown min: min=max=first=$; min#=max#=$.#;
+ elseif $.#<min#: min:=$; min#:=$.#;
+ elseif $.#>max#: max:=$; max#:=$.#; fi endfor
+ if max/min>ratio*max#/min#: forsuffixes $=t: $:=first; endfor fi
+ endgroup enddef;
+
+message " macros and tables for various modes of operation,";
+
+def mode_setup =
+ warningcheck:=0;
+ if unknown mode: mode=proof; fi
+ numeric aspect_ratio; transform currenttransform;
+ scantokens if string mode:("input "&mode) else: mode_name[mode] fi;
+ if unknown mag: mag=1; fi
+ if unknown aspect_ratio: aspect_ratio=1; fi
+ displaying:=proofing;
+ pixels_per_inch:=pixels_per_inch*mag;
+ if aspect_ratio=1: let o_=\; let _o_=\
+ else: def o_=*aspect_ratio enddef; def _o_=/aspect_ratio enddef fi;
+ fix_units;
+ scantokens extra_setup; % the user's special last-minute adjustments
+ currenttransform:=
+ if unknown currenttransform: identity else: currenttransform fi
+ yscaled aspect_ratio;
+ clearit;
+ pickup pencircle scaled (.4pt+blacker);
+ warningcheck:=1; enddef;
+def smode = string mode; mode enddef;
+string extra_setup, mode_name[];
+extra_setup=""; % usually there's nothing special to do
+newinternal displaying; % if positive, endchar will `showit'
+
+vardef magstep primary m = mexp(46.67432m) enddef;
+
+def mode_def suffix $ =
+ $:=incr number_of_modes;
+ mode_name[$]:=str$ & "_";
+ expandafter quote def scantokens mode_name[$] enddef;
+newinternal number_of_modes;
+
+% proof mode: for initial design of characters
+mode_def proof =
+ proofing:=2; % yes, we're making full proofs
+ fontmaking:=1; % no, we're not making a font
+ tracingtitles:=1; % yes, show titles online
+ pixels_per_inch:=2601.72; % that's 36 pixels per pt
+ blacker:=0; % no additional blackness
+ fillin:=0; % no compensation for fillin
+ o_correction:=1; % no reduction in overshoot
+ enddef;
+
+% smoke mode: for label-free proofs to mount on the wall
+mode_def smoke =
+ proof_; % same as proof mode, except:
+ proofing:=1; % yes, we're making unlabeled proofs
+ extra_setup:=extra_setup&"grayfont black"; % with solid black pixels
+ let makebox=maketicks; % make the boxes less obtrusive
+ enddef;
+
+% lowres mode: for certain devices that print 200 pixels per inch
+mode_def lowres =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=200; % that's the meaning of lowres
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+% mid mode: for certain devices that print 300 pixels per inch
+mode_def mid =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=300; % Laser printer resolution
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+% sun mode: for SUN screen with 118 pixels_per_inch
+mode_def sun =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=118; % Sun's screen resolution
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+localfont:=lowres; % the mode most commonly used to make fonts
+
+% It is customary to input another file to supplement the PLAIN base.
+% This supplementary file adds analogous modes, corresponding to
+% local output devices, and it redefines `localfont' as appropriate.
+% The values of screen_rows and screen_cols should also be updated.
+% The auxiliary file should set base_version:=base_version&"/localname".
+% Remember that the present file PLAIN.MF should not be changed;
+% all local changes should be confined to a separate file.
+
+message " macros for drawing and filling,";
+
+pen currentpen;
+path currentpen_path;
+picture currentpicture;
+transform currenttransform;
+def t_ = transformed currenttransform enddef;
+
+def fill expr c =
+%----------------
+month := -1;
+%----------------
+addto_currentpicture contour c.t_ enddef;
+def addto_currentpicture = addto currentpicture enddef;
+def draw expr p =
+ addto_currentpicture doublepath p.t_ withpen currentpen enddef;
+def filldraw expr c = fill counterclockwise c withpen currentpen enddef;
+def drawdot expr z = if unknown currentpen_path: def_pen_path_ fi
+ addto_currentpicture contour
+ currentpen_path shifted z.t_ withpen penspeck enddef;
+def def_pen_path_ =
+ hide(currentpen_path=tensepath makepath currentpen) enddef;
+
+def unfill expr c = fill c withweight _ enddef;
+def undraw expr p = draw p withweight _ enddef;
+def unfilldraw expr c = filldraw c withweight _ enddef;
+def undrawdot expr z = drawdot z withweight _ enddef;
+def erase text t =
+ begingroup
+ interim default_wt_:=_;
+ cullit; t withweight _; cullit; endgroup;
+% ----------------------------
+ year := -2 % visiting Erase
+%----------------------------
+enddef;
+newinternal default_wt_; default_wt_:=1;
+
+def cutdraw expr p =
+ cutoff(point 0 of p, 180+angle direction 0 of p);
+ cutoff(point infinity of p, angle direction infinity of p);
+ draw p enddef;
+vardef cutoff(expr z,theta) =
+ interim autorounding := 0; interim smoothing := 0;
+ addto pic_ doublepath z.t_ withpen currentpen;
+ addto pic_ contour
+ (cut_ scaled (1+max(pen_lft,pen_rt,pen_top,pen_bot))t_
+ rotated theta shifted z);
+ cull pic_ keeping (2,2) withweight -default_wt_;
+ addto currentpicture also pic_;
+ pic_:=nullpicture enddef;
+picture pic_; pic_:=nullpicture;
+path cut_; cut_ = ((0,_)--(1,_)--(1,1)--(0,1)--cycle) scaled 1.42;
+
+def pickup secondary q =
+ if numeric q: numeric_pickup_ else: pen_pickup_ fi q enddef;
+def numeric_pickup_ primary q =
+ if unknown pen_[q]: errmessage "Unknown pen"; clearpen
+ else: currentpen:=pen_[q];
+ pen_lft:=pen_lft_[q];
+ pen_rt:=pen_rt_[q];
+ pen_top:=pen_top_[q];
+ pen_bot:=pen_bot_[q];
+ currentpen_path:=pen_path_[q] fi; enddef;
+def pen_pickup_ primary q =
+ currentpen:=q yscaled aspect_ratio;
+ pen_lft:=xpart penoffset down of currentpen;
+ pen_rt:=xpart penoffset up of currentpen;
+ pen_top:=(ypart penoffset left of currentpen)_o_;
+ pen_bot:=(ypart penoffset right of currentpen)_o_;
+ path currentpen_path; enddef;
+newinternal pen_lft,pen_rt,pen_top,pen_bot,pen_count_;
+
+vardef savepen = pen_[incr pen_count_]=currentpen;
+ pen_lft_[pen_count_]=pen_lft;
+ pen_rt_[pen_count_]=pen_rt;
+ pen_top_[pen_count_]=pen_top;
+ pen_bot_[pen_count_]=pen_bot;
+ pen_path_[pen_count_]=currentpen_path;
+ pen_count_ enddef;
+
+def clearpen = currentpen:=nullpen;
+ pen_lft:=pen_rt:=pen_top:=pen_bot:=0;
+ path currentpen_path;
+ enddef;
+def clear_pen_memory =
+ pen_count_:=0;
+ numeric pen_lft_[],pen_rt_[],pen_top_[],pen_bot_[];
+ pen currentpen,pen_[];
+ path currentpen_path, pen_path_[];
+ enddef;
+
+vardef lft primary x = x + if pair x: (pen_lft,0) else: pen_lft fi enddef;
+vardef rt primary x = x + if pair x: (pen_rt,0) else: pen_rt fi enddef;
+vardef top primary y = y + if pair y: (0,pen_top) else: pen_top fi enddef;
+vardef bot primary y = y + if pair y: (0,pen_bot) else: pen_bot fi enddef;
+vardef good.x primary x = hround(x+pen_lft)-pen_lft enddef;
+vardef good.y primary y = vround(y+pen_top)-pen_top enddef;
+vardef good.lft primary z = save z_; pair z_;
+ (z_+(pen_lft,0))t_=round((z+(pen_lft,0))t_); z_ enddef;
+vardef good.rt primary z = save z_; pair z_;
+ (z_+(pen_rt,0))t_=round((z+(pen_rt,0))t_); z_ enddef;
+vardef good.top primary z = save z_; pair z_;
+ (z_+(pen_top,0))t_=round((z+(pen_top,0))t_); z_ enddef;
+vardef good.bot primary z = save z_; pair z_;
+ (z_+(pen_bot,0))t_=round((z+(pen_bot,0))t_); z_ enddef;
+
+vardef penpos@#(expr b,d) =
+ (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
+ x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
+
+def penstroke text t =
+ forsuffixes e = l,r: path_.e:=t; endfor
+ if cycle path_.l: cyclestroke_
+ else: fill path_.l -- reverse path_.r -- cycle fi enddef;
+def cyclestroke_ =
+ begingroup interim turningcheck:=0;
+ addto pic_ contour path_.l.t_ withweight 1;
+ addto pic_ contour path_.r.t_ withweight _;
+ cull pic_ dropping origin withweight default_wt_;
+ addto_currentpicture also pic_;
+ pic_:=nullpicture;
+%-----------------------------------------
+ year := -1; % visiting Cycle_stroke
+%-----------------------------------------
+ endgroup;
+enddef;
+path path_.l,path_.r;
+
+message " macros for proof labels and rules,";
+
+vardef makelabel@#(expr s,z) = % puts string s at point z
+ if known z: special lcode_@# & s;
+ numspecial xpart(z.t_); numspecial ypart(z.t_) fi enddef;
+string lcode_,lcode_.top,lcode_.lft,lcode_.rt,lcode_.bot,
+ lcode_.top.nodot,lcode_.lft.nodot,lcode_.rt.nodot,lcode_.bot.nodot;
+lcode_.top=" 1"; lcode_.lft=" 2"; lcode_.rt=" 3"; lcode_.bot=" 4";
+lcode_=" 0"; % change to " /" to avoid listing in overflow column
+lcode_.top.nodot=" 5"; lcode_.lft.nodot=" 6";
+lcode_.rt.nodot=" 7"; lcode_.bot.nodot=" 8";
+
+vardef labels@#(text t) =
+ if proofing>1: forsuffixes $=t:
+ makelabel@#(str$,z$); endfor
+ fi enddef;
+vardef penlabels@#(text t) =
+ if proofing>1: forsuffixes $$=l,,r: forsuffixes $=t:
+ makelabel@#(str$.$$,z$.$$); endfor endfor
+ fi enddef;
+
+def range expr x = numtok[x] enddef;
+def numtok suffix x=x enddef;
+tertiarydef m thru n =
+ m for x=m+1 step 1 until n: , numtok[x] endfor enddef;
+
+def proofrule(expr w,z) =
+ special "rule"; numspecial xpart w; numspecial ypart w;
+ numspecial xpart z; numspecial ypart z enddef;
+def screenrule(expr w,z) =
+ addto currentpicture doublepath w--z withpen rulepen enddef;
+pen rulepen; rulepen = pensquare scaled 2;
+
+def makegrid(text xlist,ylist) =
+% xmin_ := min(xlist); xmax_ := max(xlist);
+% ymin_ := min(ylist); ymax_ := max(ylist);
+% for x=xlist: proofrule((x,ymin_), (x,ymax_)); endfor
+% for y=ylist: proofrule((xmin_,y), (xmax_,y)); endfor
+ enddef;
+
+vardef titlefont suffix $ = special "titlefont "&str$ enddef;
+vardef labelfont suffix $ = special "labelfont "&str$ enddef;
+vardef grayfont suffix $ = special "grayfont "&str$ enddef;
+vardef slantfont suffix $ = special "slantfont "&str$ enddef;
+def proofoffset primary z = % shifts proof output by z
+ special "offset"; numspecial xpart z; numspecial ypart z enddef;
+vardef proofrulethickness expr x =
+ special "rulethickness"; numspecial x enddef;
+
+message " macros for character and font administration,";
+
+def beginchar(expr c,w_sharp,h_sharp,d_sharp) =
+ begingroup
+ charcode:=if known c: byte c else: 0 fi;
+ charwd:=w_sharp; charht:=h_sharp; chardp:=d_sharp;
+ w:=hround(charwd*hppp); h:=vround(charht*hppp); d:=vround(chardp*hppp);
+ charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar;
+ enddef;
+
+def italcorr expr x_sharp = if x_sharp>0: charic:=x_sharp fi enddef;
+
+def change_width =
+ w:=w if w>charwd*hppp:- else:+ fi 1 enddef;
+
+def endchar =
+ scantokens extra_endchar;
+ if proofing>0: makebox(proofrule); fi
+ chardx:=w; % desired width of the character in pixels
+ shipit;
+ if displaying>0: makebox(screenrule); showit; fi
+ endgroup enddef;
+
+string extra_beginchar, extra_endchar;
+extra_beginchar=extra_endchar="";
+
+def makebox(text r) =
+ for y=0,h.o_,-d.o_: r((0,y),(w,y)); endfor % horizontals
+ for x=0,w: r((x,-d.o_),(x,h.o_)); endfor % verticals
+ if charic<>0: r((w+charic*hppp,h.o_),(w+charic*hppp,.5h.o_)); fi
+ enddef;
+
+def maketicks(text r) =
+ for y=0,h.o_,-d.o_: r((0,y),(10,y)); r((w-10,y),(w,y)); endfor
+ for x=0,w: r((x,10-d.o_),(x,-d.o_)); r((x,h.o_-10),(x,h.o_)); endfor
+ if charic<>0: r((w+charic*hppp,h.o_-10),(w+charic*hppp,h.o_)); fi
+ enddef;
+
+def font_size expr x = designsize:=x enddef;
+def font_slant expr x = fontdimen 1: x enddef;
+def font_normal_space expr x = fontdimen 2: x enddef;
+def font_normal_stretch expr x = fontdimen 3: x enddef;
+def font_normal_shrink expr x = fontdimen 4: x enddef;
+def font_x_height expr x = fontdimen 5: x enddef;
+def font_quad expr x = fontdimen 6: x enddef;
+def font_extra_space expr x = fontdimen 7: x enddef;
+
+def font_identifier expr x = font_identifier_:=x enddef;
+def font_coding_scheme expr x = font_coding_scheme_:=x enddef;
+string font_identifier_, font_coding_scheme_;
+font_identifier_=font_coding_scheme_="UNSPECIFIED";
+
+message "and a few last-minute items.";
+
+vardef z@#=(x@#,y@#) enddef;
+
+newinternal screen_rows, screen_cols, currentwindow;
+screen_rows:=400; % these values should be corrected,
+screen_cols:=500; % by reading in a separate file after PLAIN.MF
+
+def openit = openwindow currentwindow
+ from origin to (screen_rows,screen_cols) at (-50,300) enddef;
+def showit = openit; let showit=showit_; showit enddef; % first time only
+def showit_ = display currentpicture inwindow currentwindow enddef;
+
+def clearxy = save x,y enddef;
+def clearit = currentpicture:=nullpicture enddef;
+def shipit = shipout currentpicture enddef;
+def cullit = cull currentpicture dropping (-infinity,0) enddef;
+
+def screenchars = % endchar should `showit'
+ extra_endchar:=extra_endchar&"showit;" enddef;
+def screenstrokes = % every stroke should `showit'
+ def addto_currentpicture text t=
+ addto currentpicture t; showit enddef; enddef;
+def imagerules = % a box should be part of the character image
+ extra_beginchar:=extra_beginchar & "makebox(screenrule);" enddef;
+def gfcorners = % `maketicks' should send rules to the GF file
+ extra_setup:=extra_setup & "let makebox=maketicks;proofing:=1;" enddef;
+def nodisplays = % endchar shouldn't `showit'
+ extra_setup:=extra_setup & "displaying:=0;" enddef;
+def notransforms = % currenttransform should not be used
+ let t_ = \ enddef;
+
+let bye = end; outer end,bye;
+
+clear_pen_memory; % initialize the `savepen' mechanism
+mode_setup; % establish proof mode as the default
+numeric mode,mag; % but leave mode and mag undefined
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm b/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm
new file mode 100644
index 0000000000..b7c73d6384
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm
@@ -0,0 +1 @@
+ ÿÿ
diff --git a/fonts/utilities/mf2ps/READ.ME b/fonts/utilities/mf2ps/READ.ME
new file mode 100644
index 0000000000..9455be68ea
--- /dev/null
+++ b/fonts/utilities/mf2ps/READ.ME
@@ -0,0 +1,37 @@
+It has come to my attention that our assumption that the MFlib that we had
+was the current standard is NOT true. The problem is that I am sitting here
+in Pittsburgh and cannot get to the machine in Israel with the original
+version. I will be back there in a week and a half (23 December) and will be
+back to Pittsburgh, where I can easily rebuild this archive only by 1
+February 1991. If someone has the correct mflib.a and would inform me where
+I can snarf it from, I will attempt to build the mf2ps here and if that
+works I will post it here.
+
+I am sorry to cause this inconvenience; this is a problem living in a place
+that does not quite get everything up to date and from which telnet and ftp
+are expensive propositions.
+******************************************************
+Note that mf2ps is built out of mf84 for the sun. It uses suntools. So it
+will not work directly on other machines. However, I suspect that by making
+the changes we made to mf84 modules to those on another machine, you will
+come up with an mf2ps for another machine.
+::::::::::::::
+doc
+::::::::::::::
+This directory contains the troff sources for the mf2ps paper
+Environment for Translating \f(LGMETAFONT\fP to PostSscript
+published in TUGboat 11:4, pages 525-541 at the end of 1990.
+
+::::::::::::::
+mf2ps
+::::::::::::::
+This directory contains almost all the modules to make mf2ps. This
+directory should be installed parallel to mf84 so that the includes will
+work.
+
+::::::::::::::
+MFfonts/bases
+::::::::::::::
+all the plain* files are the ones I used
+plain.base and other plain.* file were generated by
+inimf running on plain.mf
diff --git a/fonts/utilities/mf2ps/doc/Fig8.ps b/fonts/utilities/mf2ps/doc/Fig8.ps
new file mode 100644
index 0000000000..4f1f96813b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/Fig8.ps
@@ -0,0 +1,287 @@
+%! Simon font
+%%BoundingBox: 0 -10 40 50
+%%Was: 0 -5 40 40
+%%Was: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+%was: 0 -180
+ 0 -200
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+%was: /FontBBox [186 fudge sub 180 552 490] def
+ /FontBBox [186 fudge sub 200 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/Makefile b/fonts/utilities/mf2ps/doc/Makefile
new file mode 100644
index 0000000000..dd388b5747
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/Makefile
@@ -0,0 +1,17 @@
+F=paper
+PAGES=
+QUEUE=
+/usr/users/dberry/.refsidx.ia: /usr/users/dberry/.refs
+ mkey /usr/users/dberry/.refs | inv -n /usr/users/dberry/.refsidx
+
+$F.ref: $F /usr/users/dberry/.refsidx.ia
+ refer -e -n -p /usr/users/dberry/.refsidx -sADT $F > $F.ref
+
+psroff: $F.ref
+ psfig $F.ref | tbl | eqn | psroff $(PAGES) -ILG -mXP -mpsfig
+
+$F.dt: $F.ref
+ psfig -d $F.ref | tbl | eqn | dtroff $(PAGES) -mXP -mpsfig > $F.dt
+
+$F.ps: $F.ref
+ psfig $F.ref | tbl | eqn | psroff $(PAGES) -ILG -mXP -mpsfig -t > $F.ps
diff --git a/fonts/utilities/mf2ps/doc/README b/fonts/utilities/mf2ps/doc/README
new file mode 100644
index 0000000000..813d51ae37
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/README
@@ -0,0 +1,10 @@
+This directory contains the troff sources for the mf2ps paper
+Environment for Translating \f(LGMETAFONT\fP to PostSscript
+published in TUGboat 11:4, pages 525-541 at the end of 1990.
+
+The refer database addressed by the makefile to make paper.ref from
+paper is too big to include here.. So I have left paper.ref here.
+Also you may not have the tmac.X macro package to run troff. So I have
+left paper.ps in PostScript form here
+To get the pieces of the paper, send paper.ps figure.pages.ps and
+the *.ps pages of the printsamples through your favorite PS printer.
diff --git a/fonts/utilities/mf2ps/doc/fig1.ps b/fonts/utilities/mf2ps/doc/fig1.ps
new file mode 100644
index 0000000000..07ee55dffa
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig1.ps
@@ -0,0 +1,29 @@
+%!
+%%Title: N
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:03 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 -12 108 174
+%%Was: 0 0 108 162
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-72 72 translate
+0.000000 162.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Polyline
+newpath 179 79 moveto 199 79 lineto 199 259 lineto 179 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 159 219 moveto 179 219 lineto 179 239 lineto 159 239 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 139 179 moveto 159 179 lineto 159 219 lineto 139 219 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 119 139 moveto 139 139 lineto 139 179 lineto 119 179 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 99 99 moveto 119 99 lineto 119 139 lineto 99 139 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 79 79 moveto 99 79 lineto 99 259 lineto 79 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig10.ps b/fonts/utilities/mf2ps/doc/fig10.ps
new file mode 100644
index 0000000000..c4dedc6357
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig10.ps
@@ -0,0 +1,283 @@
+%! Simon font
+%%BoundingBox: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 0.8 add M
+ 22 -2 0.8 add 44 -2 0.8 add 66 -2 0.8 add c
+ 0 2 0.8 add l
+ 28 0 0.8 add 54 0 0.8 add 82 2 0.8 add c
+ -2 -2 0.8 add l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 0.8 sub M
+ 146 0 0.8 sub l
+ -22 2 0.8 sub -44 2 0.8 sub -66 2 0.8 sub c
+ 0 -2 0.8 sub l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 0.8 add M
+ 24 -2 0.8 add 48 -2 0.8 add 72 -2 0.8 add c
+ 0 2 0.8 add l
+ 20 0 0.8 add 38 0 0.8 add 58 2 0.8 add c
+ -2 -2 0.8 add l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 0.8 sub M
+ 128 0 0.8 sub l
+ -24 2 0.8 sub -48 2 0.8 sub -72 2 0.8 sub c
+ 0 -2 0.8 sub l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/fig2.ps b/fonts/utilities/mf2ps/doc/fig2.ps
new file mode 100644
index 0000000000..9e1e4a2721
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig2.ps
@@ -0,0 +1,138 @@
+%!
+%%Title: bezier
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:07 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 0 205 419
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ /DrawSplineSection { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /xa x1 x2 x1 sub 0.666667 mul add def /ya y1 y2 y1 sub 0.666667 mul add def /xb x3 x2 x3 sub 0.666667 mul add def /yb y3 y2 y3 sub 0.666667 mul add def x1 y1 lineto xa ya xb yb x3 y3 curveto } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-77 80 translate
+0.000000 419.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Ellipse
+newpath 299 434 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 259 354 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 199 394 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 179 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 159 534 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 99 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 119 387 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+ [1 3.200000] 0 setdash
+% Polyline
+newpath 99 199 moveto 179 119 lineto 239 299 lineto 299 199 lineto stroke
+stroke
+ [] 0 setdash
+% Open spline
+newpath 99.000 474.000 moveto 109.000 431.500 lineto
+ 109.000 431.500 119.000 389.000 139.000 461.500 DrawSplineSection
+ 139.000 461.500 159.000 534.000 169.000 504.000 DrawSplineSection
+ 169.000 504.000 179.000 474.000 189.000 434.000 DrawSplineSection
+ 189.000 434.000 199.000 394.000 229.000 374.000 DrawSplineSection
+ 229.000 374.000 259.000 354.000 279.000 394.000 DrawSplineSection
+ 299.000 434.000 lineto stroke
+% Open spline
+newpath 99.000 199.000 moveto 139.000 159.000 lineto
+ 139.000 159.000 179.000 119.000 209.000 209.000 DrawSplineSection
+ 209.000 209.000 239.000 299.000 269.000 249.000 DrawSplineSection
+ 299.000 199.000 lineto stroke
+/Times-Italic findfont 12.000 scalefont setfont
+299 184 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+304 189 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+309 429 moveto
+1 -1 scale
+(7)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+269 349 moveto
+1 -1 scale
+(6)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+209 384 moveto
+1 -1 scale
+(5)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+159 554 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+154 549 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+94 469 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+89 464 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+130 379 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+125 374 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+204 379 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+189 494 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+184 489 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+304 424 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+264 344 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+99 179 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+104 184 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+179 104 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+184 109 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+239 314 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+244 319 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig4.ps b/fonts/utilities/mf2ps/doc/fig4.ps
new file mode 100644
index 0000000000..fd6a94666b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig4.ps
@@ -0,0 +1,283 @@
+%! Simon font
+%%BoundingBox: 0 0 70 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%end path
+%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%end path
+%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%end path
+eofill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q) show
diff --git a/fonts/utilities/mf2ps/doc/fig5.ps b/fonts/utilities/mf2ps/doc/fig5.ps
new file mode 100644
index 0000000000..bb868ba57c
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig5.ps
@@ -0,0 +1,236 @@
+%! Simon font
+%%BoundingBox: 0 0 70 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 180 670 0.5 add M
+ 28 -2 0.5 add 58 -2 0.5 add 88 -2 0.5 add c
+ 0 2 0.5 add l
+ 38 0 0.5 add 74 0 0.5 add 110 2 0.5 add c
+ -2 -2 0.5 add l
+-198 0 l
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.5 add M
+ 28 -2 0.5 add 56 -2 0.5 add 84 -2 0.5 add c
+ 0 2 0.5 add l
+ 24 0 0.5 add 46 0 0.5 add 68 2 0.5 add c
+ -2 -2 0.5 add l
+-152 0 l
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.5 sub M
+ 208 0 0.5 sub l
+ -34 2 0.5 sub -70 2 0.5 sub -104 2 0.5 sub c
+ 0 -2 0.5 sub l
+-106 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%end path
+%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%end path
+%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%end path
+%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%end path
+%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%end path
+%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Y) show
diff --git a/fonts/utilities/mf2ps/doc/fig6.ps b/fonts/utilities/mf2ps/doc/fig6.ps
new file mode 100644
index 0000000000..a2c6f548c8
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig6.ps
@@ -0,0 +1,30 @@
+%!
+%%Title: O
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:06 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 -12 217 234
+%%Was: 0 0 217 222
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-71 68 translate
+0.000000 222.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Ellipse
+newpath 199 199 121 121 0 360 DrawEllipse gsave 0.750 setgray fill grestore stroke
+% Ellipse
+newpath 199 199 61 61 0 360 DrawEllipse gsave 1.000 setgray fill grestore stroke
+% Polyline
+newpath 189 316 moveto 217 319 lineto 189 322 lineto 189 316 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 210 262 moveto 186 259 lineto 210 256 lineto 210 262 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 188 137 moveto 212 139 lineto 188 143 lineto 188 137 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 210 82 moveto 182 79 lineto 210 75 lineto 210 82 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig7.ps b/fonts/utilities/mf2ps/doc/fig7.ps
new file mode 100644
index 0000000000..7681203441
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig7.ps
@@ -0,0 +1,447 @@
+%! Simon font
+%%BoundingBox: 0 0 158 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%end path
+%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%end path
+eofill
+%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%end path
+fill
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 180 670 0.8 add M
+ 28 -2 0.8 add 58 -2 0.8 add 88 -2 0.8 add c
+ 0 2 0.8 add l
+ 38 0 0.8 add 74 0 0.8 add 110 2 0.8 add c
+ -2 -2 0.8 add l
+-198 0 l
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.8 add M
+ 28 -2 0.8 add 56 -2 0.8 add 84 -2 0.8 add c
+ 0 2 0.8 add l
+ 24 0 0.8 add 46 0 0.8 add 68 2 0.8 add c
+ -2 -2 0.8 add l
+-152 0 l
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.8 sub M
+ 208 0 0.8 sub l
+ -34 2 0.8 sub -70 2 0.8 sub -104 2 0.8 sub c
+ 0 -2 0.8 sub l
+-106 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%end path
+fill
+%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%end path
+fill
+%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%end path
+fill
+%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%end path
+fill
+%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%end path
+fill
+%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q Y) show
diff --git a/fonts/utilities/mf2ps/doc/fig8.ps b/fonts/utilities/mf2ps/doc/fig8.ps
new file mode 100644
index 0000000000..7ece37f42a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig8.ps
@@ -0,0 +1,292 @@
+%! Simon font
+%%BoundingBox: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+%for fake line
+newpath
+160 180 M
+360 0 l
+0 .5 l
+-360 0 l
+0 -.5 l
+closepath
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/fig9.ps b/fonts/utilities/mf2ps/doc/fig9.ps
new file mode 100644
index 0000000000..f2934f6579
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig9.ps
@@ -0,0 +1,114 @@
+%! Simon font
+%%BoundingBox: 0 0 40 52
+%%Was: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_square
+(
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_square put
+
+Metrics
+ begin
+/The_square 1000 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/figure.pages b/fonts/utilities/mf2ps/doc/figure.pages
new file mode 100644
index 0000000000..107f981e65
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/figure.pages
@@ -0,0 +1,89 @@
+.en
+.pl 11.125i
+.LL 6.5i
+.ls 1
+.ds BL ''%''
+.hy 14
+\
+.sp 8.25i
+.ce
+Figure 3
+.bp
+.ta .2i +.2i
+.nf
+R M \07:
+ 10:
+ 12:
+
+ P \07:
+ 10:
+ 12:
+
+T M \08:
+ 10:
+ 12:
+
+ P \08:
+ 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-LW300
+.sp 3
+.nf
+R M 10:
+ 12:
+
+ P 10:
+ 12:
+
+T M 10:
+ 12:
+
+ P 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-VT600
+.bp
+.nf
+R M 10:
+ 12:
+
+ P 10:
+ 12:
+
+T M 10:
+ 12:
+
+ P 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-LT1270
+.sp 2
+.nf
+LW300:
+.sp 8v
+VT600:
+.sp 8v
+LT1270:
+.sp 8v
+.sp
+.ce
+Figure 12
diff --git a/fonts/utilities/mf2ps/doc/figure.pages.ps b/fonts/utilities/mf2ps/doc/figure.pages.ps
new file mode 100644
index 0000000000..57a0330a5d
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/figure.pages.ps
@@ -0,0 +1,508 @@
+%!PS-Adobe-1.0
+%%Creator: ah.sei.cmu.edu:dberry (Daniel Berry)
+%%Title: stdin (ditroff)
+%%CreationDate: Wed Oct 17 22:20:03 1990
+%%EndComments
+/PageLength 11 def
+% lib/psdit.pro -- prolog for psdit (ditroff) files
+% Copyright (c) 1984, 1985 Adobe Systems, Inc. All Rights Reserved.
+
+/PageLength 11 def
+% psfig additions
+/DocumentInitState [ matrix currentmatrix currentlinewidth currentlinecap
+currentlinejoin currentdash currentgray currentmiterlimit ] cvx def
+
+/startFig {
+ /SavedState save def
+ userdict maxlength dict begin
+ currentpoint transform
+
+ DocumentInitState setmiterlimit setgray setdash setlinejoin setlinecap
+ setlinewidth setmatrix
+
+ itransform moveto
+
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /y exch 72 mul resolution div def
+ /x exch 72 mul resolution div def
+
+ currentpoint /cy exch def /cx exch def
+
+ /sx x urx llx sub div def
+ /sy y ury lly sub div def
+
+ sx sy scale
+
+ cx sx div llx sub
+ cy sy div ury sub translate
+
+ /DefFigCTM matrix currentmatrix def
+
+ /initmatrix {
+ DefFigCTM setmatrix
+ } def
+ /defaultmatrix {
+ DefFigCTM exch copy
+ } def
+
+ /initgraphics {
+ DocumentInitState setmiterlimit setgray setdash
+ setlinejoin setlinecap setlinewidth setmatrix
+ DefFigCTM setmatrix
+ } def
+
+ /showpage {
+ initgraphics
+ } def
+
+} def
+/clipFig {
+ currentpoint 6 2 roll
+ newpath 4 copy
+ 4 2 roll moveto
+ 6 -1 roll exch lineto
+ exch lineto
+ exch lineto
+ closepath clip
+ newpath
+ moveto
+} def
+/doclip { llx lly urx ury clipFig } def
+/endFig {
+ end SavedState restore
+} def
+/globalstart {
+ fontnum fontsize fontslant fontheight
+ mh my resolution slotno currentpoint
+ pagesave restore gsave
+} def
+/globalend {
+ grestore moveto
+ /slotno exch def /resolution exch def /my exch def
+ /mh exch def
+ /fontheight exch def
+ /fontslant exch def /fontsize exch def /fontnum exch def
+ F
+ /pagesave save def
+} def
+% end of psfig additions
+
+/$DITroff 140 dict def $DITroff begin
+/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+/xi
+ {0 72 PageLength mul translate 72 resolution div dup neg scale 0 0 moveto
+ /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+ F /firstpage true def /pagesave save def}def
+/PB{save /psv exch def currentpoint translate
+ resolution 72 div dup neg scale 0 0 moveto}def
+/PE{psv restore}def
+/arctoobig 90 def /arctoosmall .05 def
+/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
+/tan{dup sin exch cos div}def
+/point{.1 resolution add 72 div mul}def
+/dround {transform round exch round exch itransform}def
+/xT{/devname exch def}def
+/xr{/mh exch def /my exch def /resolution exch def}def
+/xp{}def
+/xs{docsave restore end}def
+/xt{showpage}def
+/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
+ {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
+/xH{/fontheight exch def}def
+/xS{/fontslant exch def}def
+/s{/fontsize exch def /fontheight fontsize def}def
+/f{/fontnum exch def}def
+/F {fontheight 0 le {/fontheight fontsize def}if
+ fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
+ fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
+ makefont setfont .04 fontsize point mul 0 dround pop setlinewidth
+ } def
+/X{exch currentpoint exch pop moveto show}def
+/N{3 1 roll moveto show}def
+/Y{exch currentpoint pop exch moveto show}def
+/S{show}def
+/MX{currentpoint exch pop moveto}def
+/MY{currentpoint pop exch moveto}def
+/MXY{moveto}def
+/cb{pop}def % action on unknown char -- nothing for now
+/n{}def /w{}def
+/p{pop firstpage not{showpage}if pagesave restore /pagesave save def
+ /firstpage false def}def
+/abspoint{currentpoint exch pop add exch currentpoint pop add exch}def
+/distance{dup mul exch dup mul add sqrt}def
+/dstroke{currentpoint stroke moveto}def
+/Dl{2 copy gsave rlineto stroke grestore rmoveto}def
+/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
+ currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
+ currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
+/Dc{dup arcellipse dstroke}def
+/De{arcellipse dstroke}def
+/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
+ /cradius centerv centerv mul centerh centerh mul add sqrt def
+ /eradius endv endv mul endh endh mul add sqrt def
+ /endang endv endh atan def
+ /startang centerv neg centerh neg atan def
+ /sweep startang endang sub dup 0 lt{360 add}if def
+ sweep arctoobig gt
+ {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
+ /midh midang cos midrad mul def /midv midang sin midrad mul def
+ midh neg midv neg endh endv centerh centerv midh midv Da
+ currentpoint moveto Da}
+ {sweep arctoosmall ge
+ {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
+ centerv neg controldelt mul centerh controldelt mul
+ endv neg controldelt mul centerh add endh add
+ endh controldelt mul centerv add endv add
+ centerh endh add centerv endv add rcurveto dstroke}
+ {centerh endh add centerv endv add rlineto dstroke}ifelse}ifelse}def
+
+/Barray 200 array def % 200 values in a wiggle
+/D~{mark}def
+/D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop
+ /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and
+ {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def
+ Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put
+ Bcontrol Blen 2 sub 2 copy get 2 mul put
+ Bcontrol Blen 1 sub 2 copy get 2 mul put
+ /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub
+ {/i exch def
+ Bcontrol i get 3 div Bcontrol i 1 add get 3 div
+ Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div
+ Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div
+ /Xbi Xcont Bcontrol i 2 add get 2 div add def
+ /Ybi Ycont Bcontrol i 3 add get 2 div add def
+ /Xcont Xcont Bcontrol i 2 add get add def
+ /Ycont Ycont Bcontrol i 3 add get add def
+ Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto
+ }for dstroke}if}def
+end
+/ditstart{$DITroff begin
+ /nfonts 49 def
+ /fonts[nfonts{0}repeat]def
+ /fontnames[nfonts{()}repeat]def
+/docsave save def
+}def
+
+% character outcalls
+/oc
+ {/pswid exch def /cc exch def /name exch def
+ /ditwid pswid fontsize mul resolution mul 72000 div def
+ /ditsiz fontsize resolution mul 72 div def
+ ocprocs name known{ocprocs name get exec}{name cb}
+ ifelse}def
+/fractm [.65 0 0 .6 0 0] def
+/fraction
+ {/fden exch def /fnum exch def gsave /cf currentfont def
+ cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
+ fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
+ grestore ditwid 0 rmoveto} def
+
+/ocb
+ {/s2 .5 dm def /s4 .25 dm def
+ 2 setlinejoin gsave currentpoint newpath dround translate 0 0 moveto}def
+/oce {grestore ditwid 0 rmoveto}def
+/occ {grestore}def
+/dm {ditsiz mul}def
+/4p {pop pop pop pop}def
+
+/ocprocs 25 dict def ocprocs begin
+(X0) {ocb oce}def %room for building special characters with X names
+(X1) {ocb oce}def %all these do is move the width of the char which is 1 em
+(X2) {ocb oce}def
+(X3) {ocb oce}def
+(X4) {ocb oce}def
+(X5) {ocb oce}def
+(X6) {ocb oce}def
+(X7) {ocb oce}def
+(X8) {ocb oce}def
+(X9) {ocb oce}def
+(XX) {ocb oce}def
+
+(MD) {ocb 0 -.25 dm moveto .4333 dm -1 dm lineto .8666 dm -.25 dm lineto
+ 0 -.25 dm lineto closepath stroke occ
+ ocb 0 -.75 dm moveto .8666 dm -.75 dm lineto .4333 dm 0 dm lineto
+ 0 -.75 dm lineto closepath stroke oce}def
+(OU) { ocb .5 dm -.35 dm moveto currentpoint newpath .35 dm 0 360 arc closepath
+ stroke occ
+ ocb .3 dm -.50 dm moveto .3 dm -.3 dm lineto
+ .5 dm -.3 dm .2 dm 180 360 arcn .7 dm -.50 dm lineto stroke oce}def
+
+(14) {(1)(4)fraction}def
+(12) {(1)(2)fraction}def
+(34) {(3)(4)fraction}def
+(18) {(1)(8)fraction}def
+(38) {(3)(8)fraction}def
+(58) {(5)(8)fraction}def
+(78) {(7)(8)fraction}def
+(13) {(1)(3)fraction}def
+(23) {(2)(3)fraction}def
+
+(ff) {gsave (f) show -.06 dm 0 rmoveto (f) show oce}def
+(Fl) {gsave (f) show -.06 dm 0 rmoveto (\257) show oce}def
+(Fi) {gsave (f) show -.06 dm 0 rmoveto (\256) show oce}def
+end
+
+% DIThacks fonts for some special chars
+50 dict dup begin
+/FontType 3 def
+/FontName /DIThacks def
+/FontMatrix [.001 0.0 0.0 .001 0.0 0.0] def
+/FontBBox [-220 -280 900 900] def% a lie but ...
+/Encoding 256 array def
+0 1 255{Encoding exch /.notdef put}for
+Encoding
+ dup 8#040/space put %space
+ dup 8#110/rc put %right ceil
+ dup 8#111/lt put %left top curl
+ dup 8#112/bv put %bold vert
+ dup 8#113/lk put %left mid curl
+ dup 8#114/lb put %left bot curl
+ dup 8#115/rt put %right top curl
+ dup 8#116/rk put %right mid curl
+ dup 8#117/rb put %right bot curl
+ dup 8#120/rf put %right floor
+ dup 8#121/lf put %left floor
+ dup 8#122/lc put %left ceil
+ dup 8#140/sq put %square
+ dup 8#141/bx put %box
+ dup 8#142/ci put %circle
+ dup 8#143/br put %box rule
+ dup 8#144/rn put %root extender
+ dup 8#145/vr put %vertical rule
+ dup 8#146/ob put %outline bullet
+ dup 8#147/bu put %bullet
+ dup 8#150/ru put %rule
+ dup 8#151/ul put %underline
+ pop
+/DITfd 100 dict def
+/BuildChar{0 begin
+ /cc exch def /fd exch def
+ /charname fd /Encoding get cc get def
+ /charwid fd /Metrics get charname get def
+ /charproc fd /CharProcs get charname get def
+ charwid 0 fd /FontBBox get aload pop setcachedevice
+ 40 setlinewidth
+ newpath 0 0 moveto gsave charproc grestore
+ end}def
+/BuildChar load 0 DITfd put
+%/UniqueID 5 def
+/CharProcs 50 dict def
+CharProcs begin
+/space{}def
+/.notdef{}def
+/ru{500 0 rls}def
+/rn{-55 725 moveto 500 0 rlineto 25 setlinewidth stroke}def
+/vr{125 800 moveto 0 -770 rls}def
+/bv{125 800 moveto 0 -1000 rls}def
+/br{0 770 moveto 0 -1040 rls}def
+/ul{0 -250 moveto 500 0 rls}def
+/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
+/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
+/sq{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
+/bx{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
+/ci{355 333 rmoveto currentpoint newpath 333 0 360 arc
+ 50 setlinewidth stroke}def
+
+/lt{125 -200 moveto 125 400 lineto 125 550 260 780 375 800 curveto stroke}def
+/lb{125 800 moveto 125 200 lineto 125 50 260 -180 375 -200 curveto stroke}def
+/rt{125 -200 moveto 125 400 lineto 125 550 -10 780 -125 800 curveto stroke}def
+/rb{125 800 moveto 125 200 lineto 125 50 -10 -180 -125 -200 curveto stroke}def
+/lk{125 800 moveto 125 700 lineto 125 550 125 320 -125 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 -125 300 curveto stroke}def
+/rk{125 800 moveto 125 700 lineto 125 550 125 320 375 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 375 300 curveto stroke}def
+/lf{125 800 moveto 0 -1000 rlineto s4 0 rls}def
+/rf{125 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
+/lc{125 -200 moveto 0 1000 rlineto s4 0 rls}def
+/rc{125 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
+end
+
+/Metrics 50 dict def Metrics begin
+/.notdef 0 def
+/space 500 def
+/ru 500 def
+/br 0 def
+/lt 250 def
+/lb 250 def
+/rt 250 def
+/rb 250 def
+/lk 250 def
+/rk 250 def
+/rc 250 def
+/lc 250 def
+/rf 250 def
+/lf 250 def
+/bv 250 def
+/ob 350 def
+/bu 350 def
+/ci 750 def
+/bx 750 def
+/sq 750 def
+/rn 500 def
+/ul 500 def
+/vr 0 def
+end
+
+DITfd begin
+/s2 500 def /s4 250 def /s3 333 def
+/a4p{arcto pop pop pop pop}def
+/2cx{2 copy exch}def
+/rls{rlineto stroke}def
+/currx{currentpoint pop}def
+/dround{transform round exch round exch itransform} def
+end
+end
+/DIThacks exch definefont pop
+ditstart
+(psc)xT
+576 1 1 xr
+1(Times-Roman)xf 1 f F
+2(Times-Italic)xf 2 f F
+3(Times-Bold)xf 3 f F
+4(Times-BoldItalic)xf 4 f F
+5(Courier)xf 5 f F
+6(Courier-Oblique)xf 6 f F
+7(Courier-Bold)xf 7 f F
+8(Courier-BoldOblique)xf 8 f F
+9(Helvetica)xf 9 f F
+10(Helvetica-Oblique)xf 10 f F
+11(Helvetica-Bold)xf 11 f F
+12(Helvetica-BoldOblique)xf 12 f F
+13(Hebrew-Frank-Ruehl)xf 13 f F
+14(Hebrew-Gam)xf 14 f F
+15(Hebrew-Gam-Bold)xf 15 f F
+16(Hebrew-Yuval)xf 16 f F
+17(Hebrew-David)xf 17 f F
+18(Hebrew-Tel-Aviv)xf 18 f F
+19(Hebrew-OldJaffa)xf 19 f F
+20(AvantGarde-Book)xf 20 f F
+21(AvantGarde-BookOblique)xf 21 f F
+22(AvantGarde-Demi)xf 22 f F
+23(AvantGarde-DemiOblique)xf 23 f F
+24(NewCenturySchlbk-Roman)xf 24 f F
+25(NewCenturySchlbk-Italic)xf 25 f F
+26(NewCenturySchlbk-Bold)xf 26 f F
+27(NewCenturySchlbk-BoldItalic)xf 27 f F
+28(Palatino-Roman)xf 28 f F
+29(Palatino-Italic)xf 29 f F
+30(Palatino-Bold)xf 30 f F
+31(Palatino-BoldItalic)xf 31 f F
+32(ZapfChancery-MediumItalic)xf 32 f F
+33(ZapfDingbats)xf 33 f F
+34(Bookman-Light)xf 34 f F
+35(Bookman-LightItalic)xf 35 f F
+36(Bookman-Demi)xf 36 f F
+37(Bookman-DemiItalic)xf 37 f F
+38(Helvetica-Narrow)xf 38 f F
+39(Helvetica-Narrow-Oblique)xf 39 f F
+40(Helvetica-Narrow-Bold)xf 40 f F
+41(Helvetica-Narrow-BoldOblique)xf 41 f F
+42(Nescii-Initial-Stroke)xf 42 f F
+43(Nescii-Middle-Stroke)xf 43 f F
+44(Nescii-Final-Stroke)xf 44 f F
+45(Nescii-Standalone-Stroke)xf 45 f F
+46(Arabic-Naskh)xf 46 f F
+47(Symbol)xf 47 f F
+48(DIThacks)xf 48 f F
+xi
+%%EndProlog
+
+%%Page: 1 1
+1 p
+10 s 10 xH 0 xS 1 f F
+10 s 10 xH 0 xS 1 f F
+2313 5520(Figure)N
+2542(3)X
+2428 6084(7)N
+
+%%Page: 2 2
+2 p
+10 s 10 xH 0 xS 1 f F
+576 672(R)N
+691(M)X
+846(7:)X
+806 768(10:)N
+806 864(12:)N
+691 1056(P)N
+846(7:)X
+806 1152(10:)N
+806 1248(12:)N
+576 1440(T)N
+691(M)X
+846(8:)X
+806 1536(10:)N
+806 1632(12:)N
+691 1824(P)N
+846(8:)X
+806 1920(10:)N
+806 2016(12:)N
+576 2208(L)N
+691(M)X
+806(10:)X
+691 2400(P)N
+806(10:)X
+2157 2688(Figure)N
+2386(11-LW300)X
+576 3072(R)N
+691(M)X
+806(10:)X
+806 3168(12:)N
+691 3360(P)N
+806(10:)X
+806 3456(12:)N
+576 3648(T)N
+691(M)X
+806(10:)X
+806 3744(12:)N
+691 3936(P)N
+806(10:)X
+806 4032(12:)N
+576 4224(L)N
+691(M)X
+806(10:)X
+691 4416(P)N
+806(10:)X
+2166 4704(Figure)N
+2395(11-VT600)X
+2428 6084(14)N
+
+%%Page: 3 3
+3 p
+10 s 10 xH 0 xS 1 f F
+576 672(R)N
+691(M)X
+806(10:)X
+806 768(12:)N
+691 960(P)N
+806(10:)X
+806 1056(12:)N
+576 1248(T)N
+691(M)X
+806(10:)X
+806 1344(12:)N
+691 1536(P)N
+806(10:)X
+806 1632(12:)N
+576 1824(L)N
+691(M)X
+806(10:)X
+691 2016(P)N
+806(10:)X
+2151 2304(Figure)N
+2380(11-LT1270)X
+576 2592(LW300:)N
+576 3456(VT600:)N
+576 4320(LT1270:)N
+2293 5280(Figure)N
+2522(12)X
+2428 6084(15)N
+
+%%Trailer
+xt
+
+xs
diff --git a/fonts/utilities/mf2ps/doc/paper b/fonts/utilities/mf2ps/doc/paper
new file mode 100644
index 0000000000..d93f426299
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper
@@ -0,0 +1,1755 @@
+.pl 11.125i
+.de rb
+.ta 2m +5m +5m
+.nr t1\\n(.i
+.ls \\n(sq
+.in \\n(sem
+..
+.de rf
+.br
+.ne \\n(scu+\\n(sdu
+.sp \\n(sdu
+.ti -2m
+..
+.de LE
+.sp .5v
+..
+.de SU
+.ne 2v
+.br
+.ti 1.66P
+\f3\\$1\fP
+..
+.de Su
+.ne 2v
+.sp 1v
+\fB\&\\$1\fP
+..
+.de su
+.ne 3v
+.sp 1v
+.na
+\fB\&\\$1\fP
+.br
+.ad
+..
+.de PP
+.sp .5v
+..
+.de qb
+.in +\\n(sju
+.LL -\\n(sju
+.sp .5v
+..
+.de qe
+.in -\\n(sju
+.LL +\\n(sju
+.sp .5v
+..
+.de cl
+.ta\\n(sou +5m +5m
+.in+\\n(snu
+..
+.de dl
+.br
+.in-\\n(snu
+..
+.de ES
+.ft C
+.sp
+.nf
+.in +1.66P
+..
+.de EE
+.fi
+.ft R
+.sp
+.in -1.66P
+..
+.dehd
+.HS
+.nrhe+1
+.ie\\n(cn>1\{\
+.ie\\nc>\\n(cn\{\
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu
+.nrc 1 1
+.mkmx\}
+.el\{\
+.po+\\n(cwu+\\n(csu
+'sp|\\n(mxu\}\}
+.el\{\
+.if\\n(f5\{\
+.nr% +\\n(f5
+.nrf50 1\}
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu\}
+.chfx -\\n(tfu
+.chfo -\\n(tfu
+.if\\n(z1 .fz
+.chfo -\\n(tfu
+.if!\\n(f0 .ns
+.if\\n(f0\{\
+.nrf5\\n(f6
+.nrf6\\n(f7
+.nrf70
+.Ff
+.ie\\n(fa\{\
+.nrfa0
+.nrh21\}
+.el\{\
+.ie\\nx\{.if (\\n(nlu+5v)>(\\n(.p+\\nyu) .nr h1 1\}
+.el\{.if \\n(.tu<6v .nr h1 1\}\}\}
+.if\\n(h1=1\{\
+.nrh10
+'bp\}
+.if\\n(h2=1\{\
+.nrh20
+.fo\}
+.chfo (\\nyu-1v)
+.nrhe-1
+.HE
+..
+.defo
+.FS
+.if!\\n(he\{.if \\nx .xf\}
+.nrfa0
+.ie\\n(fg\{\
+.nrfa1
+.diGA\}
+.el\{\
+.ie\\n(cn<2\{\
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+.el.mf\}
+.FE
+..
+.demf
+.ie\\n+c<=\\n(cn .hd
+.el\{\
+.po\\n(cou
+.lt 6.63i
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+..
+.defn
+.ie\\nx .ne \\n(rcv-2v
+.el.ne \\n(rcv
+.if\\n(fn .AB"Nesting of footnotes is a no no"
+.nrfn1
+.daFN
+.ev1
+.ie\\n+x=1\{\
+.sp 10p
+\s-5\l'5P\(ul'\s+5
+.br\}
+.el.sp \\n(srv
+.fi
+.ad
+..
+.\" REFER macros .... citations
+.nr se 3u \" space to indent in emms
+.de []
+.][ \\$1
+..
+.de ][
+.if \\$1>5 .tm Bad arg to []
+.if !"\\*([O"" .if !\\n([O .as [O .
+.[\\$1
+..
+.ds RB ".RE
+.ds [. " [
+.ds .] ]
+.if n .ds [o ""
+.if n .ds [c ""
+.if t .ds [o \(lq
+.if t .ds [c \(rq
+.\" the next lines deal with the problem of .[1] or [1].
+.\" refer will write "linexxx\*(<.[1]\*(>.
+.\" and either "<." or ">." should produce the .;
+.\" similarly for ,
+.ds >. .
+.ds >, ,
+.de [5 \" tm style
+\\*([A, \\f2\\*([T\\f1,
+.ie \\n(TN \\*([M.
+.el UCLA Computer Science Department internal memorandum (\\*([D).
+.br
+..
+.de [0 \" other
+.if !"\\*([A"" \\*([A,
+.if !"\\*([O"" \\*([O
+.if !"\\*([D"" \& (\\*([D).
+.br
+..
+.de [1 \" journal article
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+\\f2\\*([J\\f1\c
+.if !"\\*([V"" .if n \& Vol.\&\c
+.if !"\\*([V"" \& \\f3\\*([V\\f1\c
+.if !"\\*([N"" (\\*([N)\c
+.if !"\\*([P"" \{\
+.ie \\n([P>0 , pp.\c
+.el , p.\c
+\& \\*([P\c\}
+.if !"\\*([I"" .if "\\*([R"" , \\*([I\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [2 \" book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\f2\\*([T,\\f1
+\\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([G"" Gov't. ordering no. \\*([G.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [4 \" report
+.if !"\\*([A"" \\*([A,
+\\*([o\\*([T,\\*([c
+\\*([R\c
+.if !"\\*([G"" \& (\\*([G)\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [3 \" article in book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+.if !"\\*([P"" pp. \\*([P
+in \\f2\\*([B\\f1\c
+.if !"\\*([E"" , ed. \\*([E\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.\" define warning that mX does not support references as footnotes
+.de ]-
+.AB"Can't do references as footnotes. Use '-e' or '-s' option with 'refer'
+..
+.de ]<
+.\" define the real ]- next-reference macro
+. de ]-
+. rm [V [P [A [T
+. rm [N [C [B [O
+. rm [R [I [E [D
+. rf
+\\\\*([F. \c
+\\..
+.\"now start the reference subsection
+\\*(RB
+.rb
+..
+.de ]>
+.re
+..
+.de ]]
+this is never
+executed
+and just
+uses up an end-of-file
+bug.
+..
+.de TS
+.sp
+..
+.de TE
+.sp .25v
+.ce
+\\$1
+.sp .5v
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i
+..
+.de ca
+.sp .5v
+.ce
+\&\\$1
+.sp 8p
+..
+.de CT
+.if \\n(ff .F0 "\\$1" "\\n%"
+..
+.nr sd 1i/24u \" # of inches to space between references (used as u).
+.nr sf 1.66P \" space to indent for paragraph (used as u).
+.nr sg 1u \" # of spaces needed before trap to start paragraph(used as v).
+.nr sh 0u \" # of spaces done to start a new paragraph (used as v).
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sj 1.66P \" space to indent for an example (used as u);
+.nr sn 1.66P \" amount of space to indent for list (used as u).
+.nr so 1P \" amount of space to temp indent for each list entry (used as u).
+.nr sp 1i/12u \" spacing for each element of list (or sublist) (used as u).
+.nr sa 1v \" # of spaces to do before subtitles (used as u).
+.nr se 3u \" # of spaces to indent for a reference (used as ems).
+.nr sm 1i \" # of spaces of need to do a subtitle (used as u).
+.nr fv 3 \" set font variable for subtitles to Helvetica
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sk 1u \" # of spaces left at the end of an example (used as v);
+.deRT
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i
+..
+.RT
+.EQ
+delim $$
+.EN
+.ds MF \f(LGMETA\%FONT\fP
+.ds TB \fITUG\%boat\fP
+.ds BZ B\o'e\(aa'zier
+.ds TX T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X
+.ds LT L\v'-.15m'\h'-.3m'\s-2A\s+2\v'.15m'\h'-.1m'T\v'.2m'\h'-.10m'E\h'-.10m'\v'-.2m'X
+.ds BT B\\h'-0.05m'\\s-2I\\h'-0.025m'B\\s0\\h'-0.08m'\\*(TX
+.ds pS P\s-2OST\%\s0S\s-2CRIPT\s0
+.ds P1 \f2P\fP\v'.2m'\s-3\f11\fP\s+3\^\v'-.2m'
+.ds P2 \f2P\fP\v'.2m'\s-3\f12\fP\s+3\^\v'-.2m'
+.ds P3 \f2P\fP\v'.2m'\s-3\f13\fP\s+3\^\v'-.2m'
+.ds P4 \f2P\fP\v'.2m'\s-3\f14\fP\s+3\^\v'-.2m'
+.en
+.LL 39.00P
+.ls 1
+.ds BL ''%''
+.hy 14
+The next page begins the paper. The macro package I use cannot start
+double columning until AFTER some text is printed..
+.pn 1
+.bp
+.MC 2 18.75P 1.5P 1i
+.mk xx
+\v'-1v'\l'18.7P'
+.sp |\n(xxu
+\s+2Environment for Translating
+.br
+\*(MF to \*(pS\s0
+.sp 3p
+.ti 1.66P
+Shimon Yanai and Daniel M. Berry
+.sp 8p
+\fBAbstract\fP
+.PP
+This paper describes a program, \fHmf2ps\fP, that translates a
+\*(MF font definition into a definition for the same font in the
+\*(pS language. \fHmf2ps\fP is constructed out
+of the part of the \*(MF program that extracts the envelopes of the
+letters; these envelopes are converted into \*(pS outlines.
+.su "1\ \ \ Introduction"
+.PP
+This paper describes a program, \fHmf2ps\fP,
+that takes from a \*(MF
+.[
+knu86
+.]
+.[
+knu87
+.]
+program for a font all the necessary information in order to
+create an equivalent \*(pS
+.[
+PostScript language reference manual
+.]
+font definition. The program makes use of the front end of the
+\*(MF program to extract the envelopes of the letters to produce the
+\*(pS outlines. What makes this process natural is that both \*(MF and
+\*(pS make liberal use of \*(BZ curves to describe non-circular
+curves.
+.pp
+By producing this translator, it is hoped to be able to produce from
+\*(MF fonts \*(pS outline fonts which are more compact than the
+bitmapped fonts produced by the \*(MF program. Certainly the outline
+fonts are more easily scaled to other magnifications and possibly even
+other design sizes than are bitmaps. Moreover, doing so makes fonts
+heretofore available only on \*(TX
+.[
+knu84
+.]
+and other DVI-based formatters,
+available on \fHditroff\fR
+.[
+Ker82
+.]
+and other formatters which have evolved,
+or have been designed, for use with \*(pS printers. This paper, which is
+typeset by \fHditroff\fR, uses a \*(pS version of the
+logo font in order to print the word \(lq\*(MF\|\(rq in the same appearance as
+in \*(TX-generated documents.
+Moreover, these new \*(pS outline fonts can be used in \*(TX also! One
+needs only the
+T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X\v'+.2m'\h'-.1m'P\h'-.1m'\v'-.2m'S
+.[
+bechtolsheim
+.]
+software.
+.pp
+The organization of this paper is as follows. Section 2 presents the
+background of this work. Section 3 explains the rationale behind
+building the translator and describes a previous attempt at writing the
+translator and an approach to avoid. The software engineering aspect of
+the translator is described also in Section 3. The details of the
+implementation are exposed in Section 4. Section 5 describes the
+operation of the program. Section 6 evaluates the results. Finally
+Section 7 describes improvements to the translator that are left for
+future work.
+.su "2\ \ \ Background"
+.PP
+Typesetter formatting systems such as \*(TX and \fHditroff\fP use fonts
+as raw material. The formatters accept mixed text and commands as input
+and produce output, which, if sent to the laser printers or typesetters,
+yields formatted text printed on pages. The laser printers and
+typesetters use fonts, i.e., sets of printable patterns, one per
+character, in various representations in order to cause the desired
+characters to appear on the printed form. For some printers, bitmaps
+are used, with 1's representing inked dots and 0's representing
+non-inked dots. Other printers accept commands that cause drawing of
+the characters, the printer providing the inked dots according to the
+drawing commands. One such popular command language is \*(pS, and its
+usual use is to specify the outline of the character with the
+interpreting printer filling in the outline with ink. One popular
+method of describing fonts is with the \*(MF language, in which
+declarative definitions of how to paint the characters are given in
+terms of pen path and pen shape. Another popular method is the same
+\*(pS that many printers accept. The prime difference is that the \*(MF
+program translates the font definitions into bitmaps prior to sending
+the font to the printer while a \*(pS printer translates the outlines
+into bitmaps at the time of printing. Interestingly, both the \*(MF
+language and the \*(pS language use \*(BZ curves for describing the
+curves followed by the pen or the outlines. As usually configured
+these days, \*(TX uses bitmapped fonts in the Computer Modern family
+generated by \*(MF, and \fHditroff\fP uses \*(pS outline fonts supplied
+by Adobe.
+.pp
+The subsequent subsections delve deeper into these issues in order to
+be able to state the goal of this paper in the next section.
+.Su "2.1\ \ \ Fonts, design sizes, and magnifications."
+As mentioned, fonts are the raw material of typesetting. A font is a
+set of printable patterns, one for each character, that causes printing
+of that character in a particular recognizable style on the page. As
+mentioned, these patterns can be represented by bitmaps or drawing
+instructions.
+.pp
+Characters come in various sizes. There are two independent notions of
+sizing for fonts, point size or design size and magnification. The
+\fIdesign size\fP is the size at which the character is designed to be used
+and is, in well-designed text, the size in which the character appears
+in final, printed copy. Design size is
+usually expressed in units of points, which are each approximately 1/72
+of an inch. Most normal text in books, newspapers, and magazines is
+printed in 10 point type. Headlines are larger, perhaps as large as 30
+points. The \fImagnification\fP of a font is the inverse of the ratio
+between the design size of the character and the size of the
+character as it emerges on the printer, the assumption being that the
+final copy is a photo reduction of the printed copy. Thus, if photo
+reduction halves linear dimensions, one prints with magnification 2.
+If everything is done right, then after reduction, the letter appears at
+its design size.
+.pp
+A 10 point design sized font printed at mag\%ni\%fi\%ca\%tion 2 is similar to
+but not quite the same as a 20 point version of the same font.
+For example, the serifs on a large point size are smaller than they would
+be if strict linear magnification were used. Other proportions, e.g., of
+x-height to cap-height and of width to height, are also
+different. While many purists, Knuth
+included, insist on using a different pattern for each design size,
+many people accept magnification as yielding acceptable fonts at other
+point sizes. If the unit of magnification is not too big the results
+are acceptable even to many purists.
+.Su "2.2\ \ \ Problems with bitmapped fonts."
+A bitmap for a character is a rectangular array of bits covering the
+so-called bounding box or frame that exactly contains a letter. Figure
+1 shows a low resolution bit map for the letter \(lqN\(rq in a sans
+serif font. The inked squares or pixels are denoted by \(lq1\(rq bits
+and the uninked pixels are denoted by \(lq0\(rq bits.
+.fs
+.F+
+figure fig1.ps
+.F-
+.ca "Figure 1"
+.fe
+The low resolution example of Figure 1 illustrates a major problem
+with bitmapped fonts. Curved lines and straight lines that are neither
+vertical nor horizontal cannot be represented exactly by a rectangular
+pattern of pixels. One is forced to approximate them with rectangular
+steps. At high resolution, e.g. above 1000 or so, the human eye cannot
+see the steps, but at low resolution the steps are quite apparent.
+Visible steps are called \(lqjaggies\(rq after the jagged edges.
+.pp
+Bitmaps for a font must be built for each design size, magnification,
+and resolution. If the resolution is fixed, as is the case on most
+printers, a bitmap must be built for each design size and
+magnification. An attempt to use a given bitmap at a larger design
+size or magnification by just enlarging the area of each dot yields a
+bad case of jaggies.
+.Su "2.3\ \ \ \*(MF and its environment."
+.ft 1
+\*(MF, a language for the specification of fonts or typefaces, has been
+used to provide fonts for the \*(TX family of typesetting systems. A
+\*(MF user writes a program for each letter or symbol of an alphabet.
+These programs are different from the usual computer programs, because
+they are essentially declarative rather than imperative, using an
+algebraic language to describe the center stroke or edges of the characters. The
+description of a letter in \*(MF is a set of equations describing the
+strokes. When combined with parameters describing the pen shape and
+size, one gets a full description of a letter. Sizes and shapes of pen
+nibs can be varied in \*(MF and the characters can be built up in such
+a way that the outlines of each stroke are precisely controlled. Herein
+lies the advantage of \*(MF; a font is easily specified and variations
+are obtained by varying parameters.
+.pp
+Currently, the program that converts a set of \*(MF font descriptions
+into a bitmapped font translates the description of a letter combined
+with a point size and a magnification into a bitmap. This bitmap can be
+sent to the printer to get a letter on the page. Herein lies a
+disadvantage of \*(MF; a bit map must be kept for each point size and
+magnification, and this can require a lot of space.
+.Su "2.4\ \ \ The \*(pS language."
+The \*(pS language is an interpretive programming language with
+graphics capabilities. \*(pS's extensive page description capabilities
+are embedded into a general-purpose programming language framework. The
+language includes a conventional set of data types such as numbers,
+arrays, and strings, control primitives such as conditionals, loops and
+procedures, and some unusual features such as dictionaries. In most
+\*(pS fonts, each letter is described by an imperative program tracing
+the outline of the letter. This tracing may include curves given as
+\*(BZ curves, straight lines, arcs, etc. A \*(pS printer interprets
+this outline program to draw and fill in the letters on the page. Some
+consider the imperative nature of \*(pS to be a disadvantage in
+comparison to \*(MF's declarative nature. The main advantage of \*(pS
+relative to \*(MF is that one needs to keep only the outline. If, as in
+the usual case, the outline is specified in terms of a fixed path
+through Euclidean two-space, this outline may be scaled arbitrarily to
+yield any magnification. The scaling is done by the \*(pS interpreter
+at the printer. Thus the different magnifications do not require any
+additional storage space. Actually, the outlines are kept as if they
+were for the Adobe-standard 1000 dots
+per emm, which at a design size of 10 points amounts to 7200 dpi.
+Because a typical phototypesetter has a maximum resolution of
+about 2500 dpi, the outlines are said to be arbitrarily
+scaleable. If the outlines are kept, as are many \*(MF definitions, as
+paths through points calculated by the outline program, then it is
+possible to, say, make serifs grow more slowly than linearly. It would
+then be possible to have one \*(pS font scaleable to all design sizes.
+Generally, outline fonts are not written this way, so that strictly
+speaking they are scaleable only to all magnifications.
+.pp
+In addition, the \*(pS language has a way to work with bitmapped fonts.
+While the \*(pS printer can scale them before printing, the end result
+is that each of the fixed number of dots in the bitmap is made larger
+or smaller. Since the human will see larger dots as jagged lines, such
+fonts are not really considered scaleable.
+.Su "2.5\ \ \ \*(BZ curves."
+Both \*(MF and \*(pS use \*(BZ cubics to specify curves. For the \*(BZ
+form, four points are used, the start point, the end point, and two
+control points, as shown in the top half of Figure 2.
+The tangent vectors of the
+endpoints are determined from the line segments \*(P1\*(P2 and
+\*(P3\*(P4. The mathematical introduction of the \*(BZ form
+when given four points \*(P1, \*(P2, \*(P3, and \*(P4 is
+.sp
+.in +.125i
+$z(t)~=~(1-t) sup 3 "\*(P1" ~+~3t(t-1) sup 2 "\*(P2" ~+~3t sup 2 (1-t) "\*(P3" ~+~t sup 3 "\*(P4" ,$
+.sp
+.in -.125i
+for $0~<=~t~<=~1$.
+.pp
+Two characteristics of the \*(BZ form tend to make it widely used in
+graphics. First, by choosing the control points one can easily mold the
+curve to a desired shape. Second, the four control points taken in another
+order define a convex polygon, \*(P1 \*(P2 \*(P4 \*(P3 \*(P1 in this case,
+the \fIconvex hull\fR\h'-.05m', which bounds the \*(BZ
+curve. The convex hull is useful in clipping a curve against a window.
+.pp
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves.
+If the user has not specified the control points explicitly, \*(MF
+itself finds some for the splines of a curve, while \*(pS requires all
+the four points to be explicitly given.
+.fs
+.F+
+figure fig2.ps
+.F-
+.ca "Figure 2"
+.fe
+.su "3\ \ \ \*(MF to \*(pS compiler\(em why\ and\ how"
+.ft 1
+.PP
+This section describes a major performance problem with \*(MF-generated
+fonts that perhaps can be solved by translating them into \*(pS fonts.
+The goals of this translation are established. Based on these goals, a
+particular approach is adopted to engineer the software largely from
+existing components.
+.Su "3.1\ \ \ A problem with \*(MF-generated bitmapped fonts."
+.ft 1
+In \*(MF, one gets one bitmap per point size and magnification. The
+size of these bitmaps grows as the square of product of the design size
+and
+the magnification and requires a large storage space. Files that are
+sent to the printer will be large, especially if lots of different
+point sizes or magnifications are used. In \*(pS with outline fonts,
+there is one outline per character which can be scaled arbitrarily to
+any magnification that might be needed. Moreover, \*(pS outline fonts
+are generally more compact than bitmapped fonts. For example, an
+enclosed rectangle is represented by its four corner points rather than
+by all the bits enclosed by the rectangle.
+.pp
+Certainly the outline fonts are more easily scaled to other
+magnifications. By scaling the bitmapped fonts downward, too much
+information is lost, and scaling upward introduces the jaggies.
+Moreover, the pixel array is device dependent; it is valid for output
+devices of only one particular resolution and one choice of possible
+data values per pixel. Scaleable fonts have a great advantage \(em you
+need only one font description file for all magnifications of that font.
+Actually, \*(pS outline fonts are more scaleable even than the \*(MF
+originals for another reason. In,
+.[
+Knu84
+.]
+it is said, \(lqCaution:
+before using this `\fBat\fR' feature (i.e. scaling downward or upward) you
+should check to make sure that your typesetter supports the font at the
+size in question; \*(TX will accept any \(L<desired size\(L> that is positive
+and less than 2048 points, but the final output will not be right
+unless the scaled font really is available on your printing
+device.\(rq Getting \*(pS outline versions of \*(MF fonts is possible
+since both are based on \*(BZ curves. Doing so makes fonts heretofore
+available only on \*(TX and other DVI-based formatters available on
+\fHditroff\fR and other formatters which have evolved to or have been
+designed for use with \*(pS printers.
+.Su "3.2\ \ \ Goals."
+Based on the observations of Section 3.1,
+the goal of this research is to produce a \*(MF to
+\*(pS compiler, \fHmf2ps\fP. Its operational requirements are items 1
+through 5:
+.l1 1
+.le
+It must be possible to translate any legitimate \*(MF font definition
+at any given design size into a \*(pS outline font.
+.le
+The resulting \*(pS outline font should be arbitrarily scaleable.
+.le
+The resulting fonts should look like the bitmapped fonts when printed
+on the same printer.
+.le
+The resulting \*(pS outline font should be more compact \fIwhen sent to
+the printer\fP than a \*(pS version of the \*(MF-generated bitmapped
+font.
+.e1
+.sp .5v
+The fourth requirement deserves a bit of explanation and qualification.
+First note that what is compared is what is sent to the printer.
+Certainly there are compressed versions of the bitmapped fonts that
+reduce the disk storage requirements of the bitmapped fonts. However,
+they must be uncompressed before sending them to most printers. It is the
+printer's storage that is limited; generally disk space is in
+abundance. However, since printers these days are general purpose
+computers, what a printer accepts may in fact be a compression that it
+has been programmed to undo.
+.pp
+Now for the case in which disk space is of concern, the comparison
+should still be relative to printable versions. There exist algorithms,
+e.g. that of Lempel and Ziv
+.[
+lempel ziv
+.]
+that can be used to compress \*(pS outline fonts which are, after all,
+just ASCII files. Therefore, in order not to have a contest between
+compression algorithms, the uncompressed versions are compared. Furthermore,
+in order not to have a contest between different kinds of printers that may
+have differing font representations, \*(pS outline fonts are compared to
+\*(pS bitmapped fonts. When
+considering disk space, the fact that one bitmapped font is needed for
+each magnification is taken into account. Thus, the interest is in
+comparing the size of a scaleable outline font to the total storage for
+the bitmapped fonts for all magnifications of a given design size.
+.cl
+.le
+The resulting \*(pS outline font should be more compact than the total
+of the sizes of the \*(pS versions of the \*(MF-generated bitmapped
+fonts at each available magnification. Even this comparison is not
+completely fair since only specific magnifications are provided, while
+the \*(pS font is arbitrarily scaleable.
+.dl
+.sp .5v
+.pp
+Observe finally, that the comparison is against mag\%ni\%fi\%ca\%tions
+of a single design size since purists would argue that there should
+be a different outline font for each design size.
+Since there are those that do not
+require this purity, the various design sizes will be compared also.
+.pp
+The software engineering goal is item 6.
+.cl
+.le
+\fHmf2ps\fP should be written as much as possible using the existing
+\*(MF program both to save work and to ensure that all \*(MF-acceptable
+font definitions are handled.
+.dl
+.sp .5v
+The evaluation of the results will be
+done relative to these goals.
+.Su "3.3\ \ \ Previous attempts."
+Leslie Carr wrote a collection of programs to produce \*(pS outline
+fonts from \*(MF fonts in 1987. Carr's programs take as input the
+\fIlog\fR output file of \*(MF which contains a description of all
+the paths that \*(MF traces out in drawing a character.
+.pp
+Carr has problems of information loss as a result of not having entered
+into the \*(MF program. This is the reason why Carr's characters are
+poor looking. In,
+.[
+Car87
+.]
+Carr observes, \(lqIn the \&\fCcmr10\fP font,
+the \fIcrisp\fP pen has diameter zero, so serifs have square corners. In
+the \&\fCcmtt10\fP font, \fIcrisp\fP is set to a larger value and the serifs
+end in semicircles. Because the shape of the current pen can NOT be
+taken into account in \*(pS, these differences in the characters shapes
+will not be seen. This is a \fBfundamental\fR problem: given a path $p$
+and a pen $q$ (whose shape is also an arbitrary path), \*(MF
+effectively envelopes $p$ with respect to the shape of $q$; \*(pS can
+do nothing other than stroke it to produce a line of constant width.
+This incompatibility comes to light when the width of the pen is
+significant to the shape of the character\(rq.
+.pp
+In order to avoid this problem, \fHmf2ps\fP finds the internally
+generated envelope, which is used as the boundaries of the inked
+region, and uses this envelope as the outline. It does not matter, then,
+what the pen path and the pen shape are.
+.pp
+More recently, during the time that the work described herein was being
+done, there were other efforts with similar goals.
+.pp
+Doug Henderson
+.[
+henderson outline fonts
+.]
+obtained outline font characters by modifying the \&\fCendchar\fP macro,
+which is called for each character after the bitmap is generated, to take
+the bitmap for the character and white out all but the bits on the edge.
+The number of bits left on the edge is varied according to the resolution
+of the bitmap. These outlines, being bitmapped, are just as unscaleable as
+are the bitmaps for the filled-in characters.
+.pp
+Neil Raine and Graham Toal
+.[
+toal private
+.]
+have developed software that takes the bitmaps and rediscovers the
+outlines by tracing the pixels. The outlines that are used as the basis
+for \*(pS fonts are, for the most part, generated from bitmaps at 2400
+dpi. They first generate RISC OS outline fonts which are screen fonts
+for Acorn's Archimedes RISC computer. These are true scaleable
+outlines. Then, these outlines are converted into \*(pS format. Toal
+says that the the quality of the fonts produced is not too great at low
+resolutions because of shortcomings in Adobe's rendering algorithm. He
+adds that at 1200 dpi on a phototypesetter, they are indistinguishable
+from \*(MF-generated bitmapped fonts. These authors suspect that
+information that is critical for good appearance is lost when tracing
+an outline on a bitmap generated from a mathematically described
+envelope. Better results should be obtainable using the original
+envelope.
+.pp
+John Hobby
+.[
+hobby postscript output system
+.]
+has developed a program called MetaPost, which translates from an extension
+of \*(MF into \*(pS cubic splines and commands.
+His goal was to turn \*(MF into a system for
+typesetting general graphics, including embedded text. His approach,
+similar to ours, was to modify the \*(MF program into what he desired.
+Befitting his more general goals, besides modifying the output, he has
+added new commands to the input language. Moreover, his translation appears
+to be a direct mapping from a \*(MF command sequence to a
+\*(pS command sequence.
+The result is a program more powerful than \fHmf2ps\fP.
+It will be interesting to compare fonts produced by MetaPost and
+\fHmf2ps\fP for appearance and performance.
+.Su "3.4\ \ \ Methodology."
+There are a number of ways to build the compiler. They include
+.l1 1
+.le
+writing the whole compiler from \*(MF to \*(pS from scratch: This has
+the advantage that one does not have to get into another person's
+software, which is not very pleasant when the software is so big. On
+the other hand, one would have to treat the whole job of turning
+mathematical equations and any arbitrary pen shape into outlines.
+.le
+using the \*(MF output as was done by Leslie Carr:
+.[
+Carr
+.]
+This has the advantage of not requiring delving into another's
+software, but the generated information is not enough if one wants no
+deviations from the originals.
+.le
+getting into the \*(MF program: This requires examining the internals
+of the \*(MF program. However, \*(MF and \*(pS make liberal use of
+\*(BZ curves to describe non-circular curves. This fact makes the
+translation process natural. For each specified path, \*(MF creates
+control points for the associated cubic spline curves before
+calculating the bit map. \*(MF also calculates the edge offsets implied
+by the pen shape. Using the necessary information one can get a new set
+of control points that define \*(BZ curves and lines that are needed to
+build the \*(pS outline fonts.
+.e1
+.Su "3.5\ \ \ Software engineering of solution."
+The idea is to split the \*(MF program into front end and back end. The
+front end takes \*(MF specification of a character, magnification, and
+point size, and produces the envelope, i.e., the outline of the
+character, and the back end fills the envelope with bits. Taking the
+existing front end and writing a new back end that converts the
+envelope into a \*(pS specification of an outline is our method of
+producing \fHmf2ps\fP. The bit-filling process will be done by the
+printer.
+.pp
+In order to make \*(pS fonts arbitrarily scaleable, we have to ask the
+\fHmf2ps\fP program to use a very large magnification, at least to try to
+match the grid on which Adobe plots the points of its outlines. Adobe plots
+its characters on a $1000~times~1000$ grid. Thus, Adobe's resolution is
+1000 dpm (dots per em), which for design size 10 points is 7200 dpi.
+Unfortunately, \*(MF, and thus \fHmf2ps\fP accepts resolutions only up to
+3000 dpi. The results should be sufficient to produce fonts scaleable
+up to magnification 7 or 8, which is a reasonable range in
+typesetting.
+.pp
+This approach helps meet goal 6 because the original unchanged \*(MF
+program is used. Thus, exactly the same input is accepted as in the
+\*(MF program. There is some extra frosting obtained by the chosen
+approach. The program for translating \*(MF to \*(pS is actually a bit
+of an interactive environment because the new back end is an extension
+of the existing one. This existing back-end provides an interpreter
+that executes a \*(MF character definition and displays the defined
+character on the screen. Figure 3
+shows the dump of a screen containing several windows, one showing a
+\*(MF definition, another showing the result of its interpretation, and
+a third containing the \*(pS translation of the definition in the first
+window. If software to interpret \*(pS definitions were available here,
+a fourth window could be set up showing the result of interpreting the
+translation of the third window. This would allow comparison of the
+character's appearances without having to print them on paper.
+.su "4\ \ \ The program"
+.PP
+In the following discussion, the \*(MF program is often called just
+\(lq\*(MF\|\(rq.
+.pp
+The \*(MF program has been written so that it can be made to run
+efficiently in a wide variety of operating environments by making
+comparatively few changes. Such flexibility is possible because the
+program is written in the \&\fCWEB\fR language which is at a higher level
+than Pascal. The preprocessing step that converts \&\fCWEB\fR to Pascal
+is able to introduce most of the necessary refinements. Semiautomatic
+translation to other languages is also feasible, because the program
+does not make extensive use of features that are peculiar to Pascal.
+.pp
+The program has two important variations: First, there is a long and slow
+version called \s-1\fHINIMF\fR\s0, which does the extra calculations needed to
+initialize \*(MF's internal tables. It has to be run first. It
+initializes everything from scratch without reading a base file, and it
+has the capability of dumping a base file. Secondly, there is a shorter and
+faster production version called \s-1\fHVIRMF\fR\s0, which cuts the
+initialization to a bare minimum. It is a virgin program that needs
+to input a base file in order to get started. \s-1\fHVIRMF\fR\s0 typically has
+more memory capacity than \s-1\fHINIMF\fR\s0, because it does not need the
+space consumed by the dumping and undumping routines, etc.
+.pp
+In order to generate a compiler that translates \*(MF to \*(pS,
+additional external procedures and functions were added to the \*(MF
+program so that it runs exactly the same except that when it asks for
+an output file name, it asks for an additional name, for the extra
+output file that is to contain the \*(pS outlines. Those changes were
+made on the Pascal version of the \s-1\fHVIRMF\fR\s0, and were compiled later
+with \*(MF's library files.
+(It was a complete oversight on our part not to have modified the
+\&\fCWEB\fP version of \s-1\fHVIRMF\fP\s0.)
+A few extra lines were added to the
+macro file, \&\fCplain.mf\fR. These act as flags, identifying that
+\*(MF has entered some of the macros.
+.Su "4.1\ \ \ Basic idea."
+To specify a character in \*(MF, one specifies either
+an envelope (outline) or
+a center-line path and a pen head.
+For the former, \*(MF just fills the envelope with bits.
+For the latter, \*(MF pretends that it is drawing the character
+with a pen of specified
+head shape following the specified path, i.e., the center of the head
+stays on the path. The distance from the center-line path and outer
+edge of ink trail left by pen head is called the \fIoffset\fR\h'-.1m'.
+So, for a character, \*(MF follows the center-line path to calculate the path
+of offset points, i.e., the envelope, and then fills the envelope with
+bits.
+In either case, \*(MF ends up filling an envelope.
+.pp
+We need to break \*(MF into a front end and a back end at the point
+just after the envelope has been calculated. Then we provide a new back
+end that converts the envelope into \*(pS instead of filling the
+envelope with bits. Note then that the \*(pS printer will fill in the
+envelope with bits as it fills the path obtained from the envelope.
+.pp
+The following subsections describe the data and the calculations
+involved in the new back end.
+.Su "4.2\ \ \ Data structures."
+The main data structures that \*(MF keeps for a character are the
+center-line path, the pen shape, and the envelope path. There are a few
+operations that can be performed on paths, called transformations.
+.SU "4.2.1\ \ \ \*(MF's path representation."
+.ft 1
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves. If the knots are
+$z sub 0 ,~z sub 1 ,...,~z sub n$, there are control points $z sub k
+sup +$ and $z sub k+1 sup -$ such that the cubic splines between the
+knots $z sub k$ and $z sub {k+1}$ are defined by the \*(BZ formula
+.sp
+.in +.4375i
+$z(t)~=~B(z sub k, z sub k sup + , z sub k+1 sup - , z sub k+1 ;t)$
+.sp .2v
+\h'\w'$z(t)~$'u'$=~(1~-~t) sup 3 z sub k ~+~ 3t(t~-~1) sup 2 z sub k sup +$
+.sp .2v
+\h'5P'$+~ 3t sup 2 (1~-~t)z sub k+1 sup - ~+~ t sup 3 z sub k+1$,
+.sp
+.in -.4375i
+for $0~<=~t~<=~1$.
+.pp
+There is a 7-word node for each knot $z sub k$, containing one word of
+control information and six words for the $x$ and $y$ coordinates of $z
+sub k sup -$ and $z sub k$ and $z sub k sup +$. The control
+information appears in the \fIleft_type\fR and \fIright_type\fR
+fields and they specify properties of the curve as it enters and leaves
+the knot. There is also a \fIlink\fR field, which points to the
+following knot. Before the \*(BZ control points have been calculated,
+the memory space they will ultimately occupy is taken up by information
+that can be used to compute them. The \*(MF \fImake_choices\fR
+procedure chooses angles and control points for the splines of a curve
+when the user has not specified them explicitly.
+.SU "4.2.2\ \ \ \*(MF's path transformation."
+.ft 1
+When \*(MF digitizes a path, it reduces the problem to the special case
+of paths that travel in the \fIfirst octant\fR directions; i.e., each
+cubic $z(t)~=~(x(t),y(t))$ being digitized will have the property that
+$0~<=~y prime (t)~<=~x prime (t)$. This assumption makes digitizing
+simpler and faster than if the direction of motion has to be tested
+repeatedly. When $z(t)$ is cubic, $x prime (t)$ and $y prime (t)$ are
+quadratic, hence each of the four polynomials, $x prime (t)$, $y prime (t)$, $x
+prime (t) - y prime (t)$, and $x prime (t) + y prime (t)$, crosses
+through $0$ at most twice. If we subdivide the given cubic at these
+places, we get at most nine subintervals. In each of these intervals
+each of $x prime (t)$, $y prime (t)$, $x prime (t) - y prime (t)$, and
+$x prime (t) + y prime (t)$ has a constant sign. The curve can be
+transformed in each of these subintervals so that it travels entirely
+in first octant directions, if we exchange $x$ and $- x$, $y$ and $-
+y$, and $x$ and $y$ as necessary.
+.Su "4.3\ \ \ Pens and envelopes."
+There are two kinds of pen heads that may be used, polygonal and
+elliptic. There are a number of trade-offs involved in their use. The
+first subsection treats the case of an $n$-vertex polygonal pen shape
+and the second treats the case of an elliptical pen shape. Both
+describe the influence of pen shape on the envelope of the font.
+.SU "4.3.1\ \ \ Polygonal pens."
+Suppose that the vertices of a polygon are $w sub 0 ,~w sub 1 ,...,~w
+sub n-1 , ~w sub n ~=~ w sub 0$ in counterclockwise order. A convexity
+condition requires that each vertex turns left when one proceeds from
+$w sub 0$ to $w sub 1$ $...$ to $w sub n$. The envelope is obtained if we
+offset a given curve $z(t)$ by $w sub k$ when that curve is traveling
+in a direction $z prime (t)$ lying between the directions $w sub k - w
+sub k-1$ and $w sub k+1 - w sub k$. At times $t$ when the curve
+direction $z prime (t)$ increases past $w sub k+1 - w sub k$, \*(MF
+temporarily stops plotting the offset curve and inserts a straight line
+from $z(t) + w sub k$ to $z(t) + w sub k+1$; notice that this straight
+line is tangent to the offset curve. Similarly, when the curve
+direction decreases past $w sub k - w sub k-1$, \*(MF stops plotting
+and inserts a straight line from $z(t) + w sub k$ to $z(t) + w sub
+k-1$; the latter line is actually a retrograde step, which will not be
+part of the final envelope under \*(MF's assumptions. The result of
+this consideration is a continuous path that consists of alternating
+curves and straight line segments. The segments are usually so short,
+in practice, that they blend with the curves.
+.SU "4.3.2\ \ \ Elliptical pens."
+To get the envelope of a cyclic path with respect to an ellipse, \*(MF
+calculates the envelope with respect to a polygonal approximation to
+the ellipse. This has two important advantages over trying to obtain
+the exact envelope:
+.l1 1
+.le
+Polygonal envelopes give better results, because the polygon has
+been designed to counteract problems that arise from digitization; the
+polygon includes sub-pixel corrections to an exact ellipse that make
+the results essentially independent of where the path falls on the
+raster.
+.le
+Polygonal envelopes of cubic splines are cubic splines. Hence it is
+not necessary to introduce completely different routines. By contrast,
+exact envelopes of cubic splines with respect to ellipses are
+complicated curves, more difficult to plot than cubics.
+.e1
+.Su "4.4\ \ \ Taking out data."
+After \*(MF has calculated the paths and the offsets, it is ready to
+send the values to the \fImake_moves\fR procedure which generates
+discrete moves for any four points that represent a \*(BZ curve. This
+is done for each one of the cyclic paths from which the letter is built.
+When the offsets are zero, this is done by the \fIfill_spec\fR
+procedure. Otherwise this is done by the \fIfill_envelope\fR
+procedure. In the latter case, the line segments, which were discussed
+earlier, should be taken out also in order to get smooth connections
+between the different curves that the cyclic path is built from.
+Because \*(pS describes any shape in terms of curves and lines, this is
+the point to take advantage of \*(MF's calculations, i.e., when \*(MF
+calls the \fImake_moves\fR procedure and when \*(MF draws line
+segments for offset corrections.
+.Su "4.5\ \ \ Processing the data."
+The generated data are not ready yet to be used. First, we should
+unskew, i.e., transform from the first octant back to the original, the
+paths according to the octant that the paths were traveled in before
+they were skewed. This unskewing is done by taking out the octant
+number at the moment that the \fImake_moves\fR procedure is called
+and then using \*(MF's \fIunskew\fR procedure that sets values $x
+prime$ and $y prime$ to the original coordinate values of a point,
+given an octant code and coordinates $(x,y)$ after they have been
+mapped into the first octant and skewed; the new values are sent to the
+\fIsend_p_s\fR procedure. This procedure has eight formal parameters
+that are all used when sending a curve. When sending a line,
+only four parameters are used, two to denote the start point and two to
+denote the end point; the remaining four parameters are sent as zeros
+so \fIsend_p_s\fR can distinguish whether a line was sent or a curve.
+In the next step, \fIsend_p_s\fR unscales the numbers because \*(MF
+works with units of scaled points, of which there are $2 sup 16$ in an
+ordinary point. While unscaling, the values are
+transformed in order to send them to the \*(pS dictionary
+\&\fCFontBBox\fP command. After this pre-processing,
+the data are sent to a temporary file.
+.SU "4.5.1\ \ \ Getting more information."
+When \*(MF calls the \fImake_moves\fR procedure, it does not have any
+information on the role that this path is going to play, whether the
+current cyclic path is going to be \fIfilled\fP or whether it will act as
+a boundary of a region to be \fIerased\fP.
+.pp
+In order to distinguish between the cases, more information has to be
+taken. This is done by copying the \&\fCplain.mf\fR file into a new
+file named \&\fCmyplain.mf\fR and adding a few lines to it. The
+additional code was added in order to identify \*(MF's use of the
+macros. \*(MF uses the variables for date only once, when the program
+is started, so it was decided to use them in the rest of the
+program.
+The \&\fCyear\fR is changed to $-1$ when \*(MF's \&\fCpen_stroke\fR
+macro is applied on a cyclic path, i.e., in the characters such as
+\(lqo\(rq, \(lqO\(rq, and \(lqQ\(rq, and to $-2$ when the \&\fCerase\fR
+macro is called. The \&\fCmonth\fR is changed when the \&\fCfill\fR
+macro is called. There are three kinds of paths:
+.l1 1
+.le
+paths to be \fIfilled\fP are processed using the \*(pS \&\fCfill\fR
+command.
+.le
+paths to be \fIstroked\fP are processed using the \*(pS \&\fCeofill\fR
+command.
+.le
+paths to be \fIerased\fP are processed using specialized procedures
+which will be discussed later.
+.e1
+.sp .5v
+.pp
+A letter cannot always be treated as one unit by means of the
+\&\fCfill\fR and \&\fCeofill\fR commands. For instance, the letter
+\(lqQ\(rq is built of two different paths, the first of which is
+stroked and the second of which is filled. Generating the letter
+using the \*(pS \&\fCeofill\fR command causes a hole in the image (see
+Figure 4).
+.fs
+.F+
+figure fig4.ps
+.F-
+.ca "Figure 4"
+.fe
+So while generating a letter, fill mode can be changed for each cyclic
+path. Moreover, when generating a letter whose paths should be filled,
+it is not always possible to use just one \&\fCfill\fR command (see
+Figure 5).
+.fs
+.F+
+figure fig5.ps
+.F-
+.ca "Figure 5"
+.fe
+When a \*(pS \&\fCfill\fR command is applied to a path that is composed
+of more than one subpath, say two for the sake of simplicity, and one
+subpath is inside the other and is drawn in a direction opposite to the
+external one, the internal path is considered a hole and is not filled
+(see Figure 6).
+.fs
+.F+
+figure fig6.ps
+.F-
+.ca "Figure 6"
+.fe
+So, if several paths are to be filled in this manner, the description
+of each one of them should be ended with the \&\fCfill\fR command.
+There is one more benefit to using this strategy: The \*(pS \fCcurrent
+path\fR stack becomes empty after encountering any kind of \&\fCfill\fR
+command. Therefore, using the \&\fCfill\fR command after each path can
+help avoid \&\fCstack overflow error\fRs if all paths together are too
+long.
+.SU "4.5.2\ \ \ Treating erasing paths."
+There are three methods of handling the problem of paths that should be
+erased by \fHmf2ps\fP itself:
+.l1 1
+.le
+filling with white: Because erasing paths are built in order to erase
+an existing filled area and \*(pS overlaps paths (i.e., a region is
+shown in the color that was drawn last), erasing paths can be
+implemented by filling those paths with white. This solution is the
+easiest, but it works only if the background is white and the letter is
+drawn in some level of gray. If one wants to draw a letter with
+background other than white, the resulting appearance will not be correct.
+.pp
+.le
+calculating new paths resulting from subtracting the erasing paths from
+the previous filled paths: Such a solution can be global. However, it
+costs a lot in terms of processing time and accuracy, because paths are
+given implicitly by four points, and in order to calculate the new
+paths, one should find the intersection points of \*(BZ curves, i.e.,
+to find points that lie on both \*(BZ curves, and then calculate new
+curves, which are difficult to calculate from those points.
+.pp
+.le
+using the \*(pS \&\fCeoclip\fR command: Be\%cause the letters are bounded
+in a $1000~times 1000$ box, a primary square path whose segments are
+$1000$ units long should be declared and after it all the erasing paths
+should be listed. After relocating the erasing paths we are ready to
+declare \&\fCeoclip\fR, which means that the clipping path is the
+external primary one and the internal paths, the erasing paths, are
+holes. This is an elegant solution that uses the power of the language
+and is available in simple situations in which there is no intersection
+between the erasing paths (see Figure 7).
+If there were intersections, a little more
+sophisticated use of the \&\fCeoclip\fR command would be needed. Relocation
+of the erasing paths is done by the procedure \&\fCdoarrange\fR.
+.e1
+.fs
+.F+
+figure fig7.ps
+.F-
+.ca "Figure 7"
+.fe
+.pp
+There are other problems caused by the erasing paths. Because the
+erasing paths have segments in common with paths to be filled, \*(pS must
+decide whether the common segments are in the clipping path or not.
+\*(pS does not seem to have a consistent policy on that and it seems to
+be that the decision is taken arbitrarily (see Figure 8).
+.fs
+.F+
+figure fig8.ps
+.F-
+.ca "Figure 8"
+.fe
+An attempt to resolve the clipping path problem led to the first author
+sending the following electronic message (obviously, not as nicely
+formatted as herein) to Glenn Reid of Adobe Systems, Inc.
+.qb
+.nf
+From simon Tue Mar 21 13:22:32 1989
+To: greid@adobe.com
+Subject: Problem in PostScript
+.fi
+.sp
+Dear Mr. Reid
+.sp
+I have got a problem in understanding the PostScript
+policy in determining \(lqwhat is in the clipping path\(rq.
+I think there is a problem in the boundaries.
+Here is an example that shows that problem:
+.es
+.ft C
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+.ee
+.ft R
+As you see, the problem is that on top of the shape, the line
+which belongs to the upper \(lqhole\(rq in the clipping path and to the
+current path ( to be filled ) is drawn, and on bottom of the
+shape it is not.
+.sp
+This is happening both on the Apple Laser printer and on the
+QMS-80.
+.sp
+I would be glad to have a reply from you.
+.sp
+.nf
+Thanks in advance
+Shimon Yanai
+C.S Dep.
+Technion
+.fi
+.qe
+What Mr. Reid saw when he printed the \*(pS commands contained in the
+message is reproduced in Figure 9.
+.fs
+.F+
+figure fig9.ps
+.F-
+.ca "Figure 9"
+.fe
+Mr. Reid replied with the following:
+.qb
+.nf
+From: greid@adobe.com (Glenn Reid)
+To: Shimon Yanai <simon@techunix>
+Cc: greid@adobe.com
+Subject: Re: Problem in PostScript
+In-Reply-To: Your message of Wed, 22 Mar 89 ...
+Date: Wed, 22 Mar 89 11:41:35 PST
+.fi
+.sp
+The problem is that the path you are filling falls exactly on the edge
+of the clipping path. This produces a zero-width area to fill, and
+unfortunately it sometimes fills and sometimes does not with the
+current fill algorithm. I believe that it is related to the direction
+of the paths; if the paths are going in opposite directions along the
+same line, it will fill with a one-pixel area, but if they are going in
+the same direction, it will not fill.
+I believe this has been fixed to be more consistent in Display
+PostScript, for what it's worth.
+.sp
+Glenn Reid
+.br
+Adobe Systems
+.qe
+.pp
+The idea of using opposite directions had been checked before sending
+the letter, so the problem had to be solved within the back end of
+\fHmf2ps\fP. The
+erasing paths near the top of the letter had their $y$ coordinates
+increased by 0.8 points, and those near the bottom had their $y$
+coordinates decreased by the same amount. This shift is invisible to
+the human eye because the font definitions are in terms of hundreds of
+points (see Figure 10). This solution was designed to work with most
+existing \*(MF fonts. It is possible that there will be fonts that are not
+treated well by this solution.
+.fs
+.F+
+figure fig10.ps
+.F-
+.ca "Figure 10"
+.fe
+.Su "4.6\ \ \ Optimization."
+Optimization is done in order to make the description of the fonts
+shorter and to save work in the \*(pS interpreter. This is done in
+three ways:
+.l1 1
+.le
+not printing lines with length zero. As was said earlier, the \*(MF
+program prints lines to connect offset points. There are times that
+after rounding or truncating the output data, the start point and the
+end point are equal. In such cases, the lines are eliminated.
+.le
+checking if the \*(BZ curve acts as a line. From the definition of the
+\*(BZ curve, it is known that if the two control points lie on the line
+that connects the start point and the end point, the curve is of degree
+one. In such cases \fHmf2ps\fP generates a command to print a line from
+the start point to the end point, thus saving space and avoiding
+redundant calculations for the \*(pS interpreter.
+.le
+checking if a series of consecutive line segments are in the same line.
+This is done by storing the segments in a buffer and checking whether a
+new segment is collinear with the last stored.
+.e1
+.Su "4.7\ \ \ Changed or added routines."
+The following is a list of routines that were changed or added in order
+to build \fHmf2ps\fP from \*(MF.
+.in +1P
+.LE
+\fIprintchar\fP was modified to get character names.
+.LE
+\fIfixdateandtime\fP was modified to initialize variables that were used as flags in the macros.
+.LE
+\fIfillspec\fP was modified to send out data on splines.
+.LE
+\fIskewlineedges\fP was modified to send out offset lines.
+.LE
+\fIdualmoves\fP was modified to send out offset lines.
+.LE
+\fIfillenvelope\fP was modified to send out data on splines.
+.LE
+\fIdostatement\fP was modified to identify tokens that are strings.
+.LE
+\fImain\fP was modified to call the \fHmf2ps\fP procedure in the beginning and ending of the program.
+.LE
+\fIsendcurve\fP was added to unskew spline values and to send them to the next process.
+.LE
+\fIsendline\fP was added to unskew line values and to send them to the next process.
+.LE
+\fIok\fP was added to check if two lines are collinear.
+.LE
+\fIrestore\fP was added to restore the parameters of the last line.
+.LE
+\fIrecall\fP was added to recall values from the buffer.
+.LE
+\fIus\fP was added to convert the \*(MF scale so that a letter would fit the
+Adobe standard $1000~times~1000$ bounding box.
+.LE
+\fIsend_p_s\fP was added to create a \*(pS file of lines and curves.
+.LE
+\fImakemoves\fP was modified to send out spline data.
+.LE
+\fIdump\fP was added to append information from the file named \&\fCf\fP to the file named \&\fCg\fP.
+.LE
+\fIcheckerase\fP was added to identify the file that contains \(lqerase\(rq commands, and their position within the file.
+.LE
+\fIdoarrange\fP was added to put erasing paths at the beginning of the file.
+.LE
+\fIprint_start\fP was added to signal the beginning of a new cyclic path to be processed.
+.LE
+\fIprint_end\fP was added to signal the end of the current cyclic path.
+.LE
+\fIinit_ps\fP was added to make initializations.
+.LE
+\fImakenewdef\fP was added to make initializations when more than one character
+occurs in the input.
+.LE
+\fIcloseolddef\fP was added to close the last definition.
+.LE
+\fItini_ps\fP was added to handle the ending of the process.
+.LE
+\fIauxprintchar\fP was added to print characters.
+.LE
+\fIauxprint\fP was added to print strings.
+.in -1P
+.su "5\ \ \ Operation of \fHmf2ps\fP in a \fHU\s-2NIX\s0\fP environment"
+.ft 1
+.PP
+When invoked,
+\fHmf2ps\fP
+first asks for an output file name. For the example this file is called
+\&\fCex1\fP. \fHmf2ps\fP then asks,
+.ES
+.fi
+.na
+\(lq\&\fCAre you creating the whole dictionary (y/n)?\fP\(rq.
+.EE
+.ad
+If the answer is other than \(lq\&\fCy\fP\(rq
+or \(lq\&\fCY\fP\(rq, it is considered \(lq\&\fCno\fP\(rq. If the
+answer is \(lq\&\fCy\fP\(rq or \(lq\&\fCY\fP\(rq, then the whole
+dictionary is created. This means that \fHmf2ps\fP creates a \*(pS
+dictionary that includes entries for all the characters that are in
+the input, e.g., \&\fCcmr10\fP set. This dictionary needs additional
+definitions such as \fIleft side bearing, width, bounding box\fP, etc.
+These definitions need information on character features that must be
+calculated within the program. Otherwise, the whole dictionary is not
+created and the program treats the input as a single character
+definition that is to be translated into a \*(pS outline definition.
+After \fHmf2ps\fP prompts \(lq\&\fC**\fP\(rq, we are in the \*(MF
+environment. Now the user inputs
+.ES
+\s-1\\mode=hires;\\nodisplays;\\input cmr10;\(cr\s0
+.EE
+After \fHmf2ps\fP has finished, the resulting \*(pS font dictionary can
+be used to print text. In order to print text, the font dictionary
+should be installed in some formatter's font source directory, and then
+it can be loaded through the formatter's commands. The dictionary
+followed by appropriate \fHshow\fP and \fHshowpage\fP commands can also
+be sent directly to the printer.
+.su "6\ \ \ Evaluation of results"
+.PP
+This section evaluates the \fHmf2ps\fP program relative to goals
+established in section 3.2. The program was produced as a variation of
+\*(MF and it accepts any \*(MF font definition and produces a \*(pS
+outline font scaleable up to magnification 8, or to point size 80 if
+you are not a purist. Thus goals 6 and 1 have been entirely met and
+goal 2 is partially met. To meet goal 2 fully the program must be
+modified to allow large enough arrays to handle magnifications up to
+7200; this is left to future work.
+.pp
+It remains to evaluate the appearance and sizes of the outline fonts
+relative to the bitmapped fonts to see if goals 3, 4, and 5 have been
+met.
+.Su "6.1\ \ \ Appearance."
+In order to compare appearances, the outline font (Sub\%sub\%fi\%gure P)
+and and the 300 dpi bitmapped font (Sub\%sub\%fi\%gure M) generated from
+the same \*(MF definition are used to
+print similar sentences at one, two, or three different sizes or
+magnifications on three devices of differing resolutions.
+The sentences are printed in the \&\fCcmr\fP (Sub\%fi\%gure R),
+\&\fCcmtt\fP (Sub\%fi\%gure T), and \&\fClasy\fP (Sub\%fi\%gure S) typefaces.
+The bitmapped fonts may be printed at design sizes 7, 8, 10, or 12, and
+the outline fonts may be printed at magnifications .7, .8, 1.0, or 1.2.
+Finally, the three devices are the 300 dpi LaserWriterII (Figure
+11-LW300), the 600 dpi Varityper (Figure 11-VT600), and the 1270 dpi
+Linotronic 300 (Figure 11-LT1270). The bitmapped font examples are
+formatted with \*(TX while the outline font examples are hand-coded \*(pS
+files sent directly to the printer. Since the
+formatter with which this paper is printed can use arbitrary \*(pS
+fonts, half of the examples could have been done in-line without
+pasting in. However, for fairness in the comparison, all examples were
+cut out and pasted in.
+.pp
+There are visible differences due to differences in the formatting
+software. \*(TX squeezes the letters closer together than does the \*(pS
+engine. Moreover, the interword space is constant in the \*(pS
+dictionary but is varied by \*(TX according to the line structure.
+These differences are not the differences that are at issue here.
+.pp
+On the 300 dpi device, the characters from the bitmapped fonts print thinner
+than are those of the outline fonts. However, the edges of both sets are
+equally smooth or jagged as the case may be in all sizes. Overall, then,
+the appearance of the characters of the bitmapped fonts is crisper than
+that of the outline fonts.
+On the higher resolution devices,
+the thicknesses of the characters are closer to being
+equal at all sizes. Thus, the \*(MF program does a better job of building a
+correctly sized bitmap at 300 dpi than does the 300 dpi \*(pS engine of the
+LaserWriterII. The latter seems to round up too much. However, both
+seem to get the edges equally smooth even at low sizes and low resolutions.
+.pp
+At the two higher resolutions, the outline fonts are significantly better
+than the outline fonts at lower resolutions and are significantly better
+than the bitmapped fonts at the same resolution of printing. However, this
+latter is true because the bitmapped fonts were generated by the \*(MF
+program specifically to be printed at 300 dpi.
+When a 300-dpi bitmap is printed with no scaling at 600 or 1270 dpi, it
+remains a 300-dpi bitmap. As expected, the 300-dpi bitmapped fonts print better
+at 300 dpi than they do at the two higher resolutions.
+.pp
+The generated outlines are not fine-tuned for printing at low resolutions,
+such as 300 dpi,
+as are the \*(MF-generated bitmaps. It might be useful to make use of
+the \*(pS facilities for hinting to improve the appearance of the
+characters printed from the outlines at low resolutions.
+.pp
+Figure 12 shows samples of similar sentences printed on the same three
+devices using the standard Helvetica, Times
+Roman, and Courier \*(pS outline fonts built into most \*(pS-executing
+laser printers.
+It appears to these authors that the standard \*(pS fonts are
+significantly better than those generated from \*(MF fonts. However,
+this is not surprising. Adobe uses a grid of $1000~times~1000$ for its
+character definitions, resulting in a resolution of 7200 dpi for characters
+printed at point size 10.
+Because of size limitations of the
+\*(MF program the \*(MF outline fonts are using a resolution of 3,000
+points per inch. However, when using the letters in small sizes such as
+from 10 to 70,
+quality differences are hardly visible especially when working
+with printers that have a resolution of 300 points per inch such as the
+Apple LaserWriter.
+Moreover, Adobe makes liberal use of hinting to
+improve the appearance of its fonts at low resolutions.
+We completely ignored hinting, as we did not see any way to
+automatically generate the hints.
+.Su "6.2\ \ \ Sizes of fonts."
+Recall that it is necessary to compare the size of the \*(pS outline
+font for a particular \*(MF definition to the sizes of the bitmapped
+fonts in \*(pS fonts for the individual and all magnifications.
+.pp
+This comparison is made in this section for the \&\fCcmr10\fP font at the
+standard set of six magnifications 1, 1.095, 1.2, 1.44, 1.728, and 2.07
+(which are approximations of 1.2 raised to the powers 0, .5, 1, 2, 3,
+and 4, respectively). In addition, as a gesture to those who are not
+purists and accept magnifications of the 10 point design size as
+different point sizes, the comparison includes the \&\fCcmr\fP font at
+point size 5, 6, 7, 8, 9, 10, 12, and 17, the standard eight design
+sizes maintained for use with \*(TX.
+.pp
+Table 1 shows the sizes in bytes. Thus it is clear that the
+\*(pS outline font is bigger than any bitmapped font and that goal 4
+fails. Moreover, it is clear that the outline font is bigger than the
+sum over all magnifications of one design size and than the sum over
+all standard design sizes. Thus goal 5 fails. In fact, this failure is the
+reason that the samples of Figure 11 involve only upper case letters. Samples
+with complete fonts with both cases often overloaded the printer available
+to the students at the time this work was done.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 245,000
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 245,000
+.TE "Table 1"
+.br
+.RT
+.pp
+However, do note that the outline font is smaller than the sum over all
+design sizes and magnifications thereof.
+.pp
+So in terms of disk space for the non-purists, the outline font
+represents a savings. Again notice that not all magnifications of the
+bitmapped fonts are maintained and the outline font is arbitrarily
+scaleable. Moreover, as the magnification grows the size of the bitmap
+grows even more rapidly.
+.pp
+The disappointment with respect to saving printer and disk memory says
+that it is important to spend more effort to optimize the outline
+font.
+.pp
+All is not lost, though! As this paper was being prepared for publication
+in \*(TB,
+one reviewer, Nelson Beebe, pointed out something that we can only kick
+ourselves for not noticing. The \*(pS outline fonts that are generated by
+\fHmf2ps\fP are horrendously wasteful in space. They use original, built-in
+command names and absolute coordinates. A significant reduction in size can
+be obtained by definition and use in the outlines of single-character
+command names, e.g., \(lq\fCM\fP\(rq for \(lq\fCmoveto\fP\(rq, and by use
+of relative versions of these commands with operands of fewer digits after
+the initial absolute \&\fCmoveto\fP of any character. A simple filter was
+written to obtain new compressed versions of the \*(pS outline fonts. The
+appearances of the output when printing with these new versions is
+unchanged, but what is sent to the printer is significantly smaller, about
+37.7% smaller. The reduction on a per-letter basis is about 45%.
+Table 2 shows the information of Table 1 for the new versions of the
+outline fonts.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 152,670
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 152,670
+.TE "Table 2"
+.br
+.RT
+.pp
+There are still better compressions that can be achieved. According to
+Beebe,
+.[
+beebe private
+.]
+Toal and Raine's outline representation of \&\fCcmr\fP at 10 points
+requires about twice the space needed for bitmaps of the same; at 14 to
+16 points, the outlines and the bitmaps occupy about the same amount of
+space; above 16 points, the outlines are smaller than the bitmaps. It
+is clear that better encodings exist than we explored and these must be
+explored for any future version of \fHmf2ps\fP.
+.pp
+One such better encoding appears to be that used by Adobe for its own
+proprietary fonts; fonts encoded this way have a FontType of 1.
+User defined fonts have a FontType of 3. Beebe
+.[
+beebe private
+.]
+says that type 1 fonts are handled with greater efficiency than type 3
+fonts on most existing \*(pS interpreters, especially those that are based
+on Adobe-licensed code.
+Adobe has recently published specifications for the type 1 font encoding,
+.[
+adobe type 1
+.]
+thus allowing anyone to produced type 1 fonts. Beebe believes that the
+market forces will drive other companies to encode their fonts as type 1.
+Moreover, as more and more windowing systems based on \*(pS, e.g., NeWS
+and NeXT, appear, the attraction of \*(pS outline fonts will increase, as
+then the same font can be used for both printing and previewing. Thus, the
+incentive will be to convert \*(MF fonts into type 1 \*(pS outline fonts.
+.pp
+Ultimately, the tradeoff is between the size of the font sent to the
+printer, and the time it takes for the printer to decode the program
+for the characters. However, with proper cacheing, a big enough cache,
+and a not very fancy document, the decoding is done only once per
+character for the document!
+.su "7\ \ \ Future work"
+.PP
+For the future, there are a number of improvements that can be made.
+Currently, each letter of the \*(pS outline fonts is described as a set
+of cyclic paths. When all are filled or stroked, one gets the desired
+letter. Some of those cyclic paths have a common boundary that is
+inside the letter and is not necessary for the outline description of
+the letter as a whole. Eliminating these paths and creating one
+outline for the letter will save space. Today this can be done
+manually, and is worth the effort because the translation process is
+done only once. From that time on, the font is used the way it is.
+.pp
+As was demonstrated by Beebe's rescue of our result, closer attention
+should be paid to obtaining more compact representations of character
+outlines, representations for which \*(pS routines can be written to
+interpret them into standard outline drawing commands.
+Collapsing commands into single characters and using relative movements
+saved significant amounts of space. Perhaps, even more dramatic savings can
+be obtained by giving coordinates and distances in hexadecimal.
+.pp
+More effort can be spent on modifying the program in order to allow
+magnifications up to 7200 points. Thus, no jaggies will be seen, as
+occasionally happens when using higher magnifications, e.g., in our
+translated fonts at magnification 8. This could be done by enlarging
+the program arrays to handle characters based on 7200 points. A
+sophisticated solution is required if one wants to save room while
+compiling the input font. In such a case, any linear translation which
+is done within the \*(pS program is with a factor less than 1.
+.pp
+\*(MF was changed for \*(TX 3.0. It is necessary to build a new version of
+\fHmf2ps\fP based on this latest version of \*(MF. As the changes to the
+\*(MF program deal mainly with ligatures and kerning, the calculation of
+envelopes is probably not affected. Therefore, it is likely that
+the portion of \*(MF up to the calculation of the envelope can still be
+used as a front end for \fHmf2ps\fP with very little change in the
+portion of the program we wrote.
+.pp
+Finally, it might be worthwhile, for the sake of portability to other
+systems and enhanceability by \pother
+.sp
+humans, to rewrite or to write the next
+version of \fHmf2ps\fP with \&\fCWEB\fP.
+.su "Acknowledgments"
+.PP
+The authors thank the
+\*(TB editors, and Nelson Beebe for their help, sharp comments, and
+result-saving ideas.
+Dealing with their comments made this a better paper.
+.su "References"
+.[
+$LIST$
+.]
+.RT
+.sp 2
+.ta 1P +1P
+.in +6P
+.ps 9
+.vs 11
+.nf
+.ti -1P
+\(dm Shimon Yanai
+IBM Science and Technology
+ Center
+Technion City
+.sp
+Haifa 32000
+Israel
+yanai@israearn.bitnet
+.sp
+.ti -1P
+\(dm Daniel M. Berry
+Computer Science
+Technion
+Haifa 32000
+Israel
+dberry@cs.technion.ac.il
+.fi
+.in -6P
+.RT
diff --git a/fonts/utilities/mf2ps/doc/paper.pdf b/fonts/utilities/mf2ps/doc/paper.pdf
new file mode 100644
index 0000000000..343d5ecc7a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.pdf
Binary files differ
diff --git a/fonts/utilities/mf2ps/doc/paper.ps b/fonts/utilities/mf2ps/doc/paper.ps
new file mode 100644
index 0000000000..8803b81c31
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.ps
@@ -0,0 +1,16427 @@
+%!PS-Adobe-1.0
+%%Creator: ah.sei.cmu.edu:dberry (Daniel Berry)
+%%Title: stdin (ditroff)
+%%CreationDate: Wed Oct 17 22:08:40 1990
+%%EndComments
+/PageLength 11 def
+% lib/psdit.pro -- prolog for psdit (ditroff) files
+% Copyright (c) 1984, 1985 Adobe Systems, Inc. All Rights Reserved.
+
+/PageLength 11 def
+% psfig additions
+/DocumentInitState [ matrix currentmatrix currentlinewidth currentlinecap
+currentlinejoin currentdash currentgray currentmiterlimit ] cvx def
+
+/startFig {
+ /SavedState save def
+ userdict maxlength dict begin
+ currentpoint transform
+
+ DocumentInitState setmiterlimit setgray setdash setlinejoin setlinecap
+ setlinewidth setmatrix
+
+ itransform moveto
+
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /y exch 72 mul resolution div def
+ /x exch 72 mul resolution div def
+
+ currentpoint /cy exch def /cx exch def
+
+ /sx x urx llx sub div def
+ /sy y ury lly sub div def
+
+ sx sy scale
+
+ cx sx div llx sub
+ cy sy div ury sub translate
+
+ /DefFigCTM matrix currentmatrix def
+
+ /initmatrix {
+ DefFigCTM setmatrix
+ } def
+ /defaultmatrix {
+ DefFigCTM exch copy
+ } def
+
+ /initgraphics {
+ DocumentInitState setmiterlimit setgray setdash
+ setlinejoin setlinecap setlinewidth setmatrix
+ DefFigCTM setmatrix
+ } def
+
+ /showpage {
+ initgraphics
+ } def
+
+} def
+/clipFig {
+ currentpoint 6 2 roll
+ newpath 4 copy
+ 4 2 roll moveto
+ 6 -1 roll exch lineto
+ exch lineto
+ exch lineto
+ closepath clip
+ newpath
+ moveto
+} def
+/doclip { llx lly urx ury clipFig } def
+/endFig {
+ end SavedState restore
+} def
+/globalstart {
+ fontnum fontsize fontslant fontheight
+ mh my resolution slotno currentpoint
+ pagesave restore gsave
+} def
+/globalend {
+ grestore moveto
+ /slotno exch def /resolution exch def /my exch def
+ /mh exch def
+ /fontheight exch def
+ /fontslant exch def /fontsize exch def /fontnum exch def
+ F
+ /pagesave save def
+} def
+% end of psfig additions
+
+/$DITroff 140 dict def $DITroff begin
+/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+/xi
+ {0 72 PageLength mul translate 72 resolution div dup neg scale 0 0 moveto
+ /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+ F /firstpage true def /pagesave save def}def
+/PB{save /psv exch def currentpoint translate
+ resolution 72 div dup neg scale 0 0 moveto}def
+/PE{psv restore}def
+/arctoobig 90 def /arctoosmall .05 def
+/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
+/tan{dup sin exch cos div}def
+/point{.1 resolution add 72 div mul}def
+/dround {transform round exch round exch itransform}def
+/xT{/devname exch def}def
+/xr{/mh exch def /my exch def /resolution exch def}def
+/xp{}def
+/xs{docsave restore end}def
+/xt{showpage}def
+/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
+ {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
+/xH{/fontheight exch def}def
+/xS{/fontslant exch def}def
+/s{/fontsize exch def /fontheight fontsize def}def
+/f{/fontnum exch def}def
+/F {fontheight 0 le {/fontheight fontsize def}if
+ fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
+ fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
+ makefont setfont .04 fontsize point mul 0 dround pop setlinewidth
+ } def
+/X{exch currentpoint exch pop moveto show}def
+/N{3 1 roll moveto show}def
+/Y{exch currentpoint pop exch moveto show}def
+/S{show}def
+/MX{currentpoint exch pop moveto}def
+/MY{currentpoint pop exch moveto}def
+/MXY{moveto}def
+/cb{pop}def % action on unknown char -- nothing for now
+/n{}def /w{}def
+/p{pop firstpage not{showpage}if pagesave restore /pagesave save def
+ /firstpage false def}def
+/abspoint{currentpoint exch pop add exch currentpoint pop add exch}def
+/distance{dup mul exch dup mul add sqrt}def
+/dstroke{currentpoint stroke moveto}def
+/Dl{2 copy gsave rlineto stroke grestore rmoveto}def
+/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
+ currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
+ currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
+/Dc{dup arcellipse dstroke}def
+/De{arcellipse dstroke}def
+/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
+ /cradius centerv centerv mul centerh centerh mul add sqrt def
+ /eradius endv endv mul endh endh mul add sqrt def
+ /endang endv endh atan def
+ /startang centerv neg centerh neg atan def
+ /sweep startang endang sub dup 0 lt{360 add}if def
+ sweep arctoobig gt
+ {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
+ /midh midang cos midrad mul def /midv midang sin midrad mul def
+ midh neg midv neg endh endv centerh centerv midh midv Da
+ currentpoint moveto Da}
+ {sweep arctoosmall ge
+ {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
+ centerv neg controldelt mul centerh controldelt mul
+ endv neg controldelt mul centerh add endh add
+ endh controldelt mul centerv add endv add
+ centerh endh add centerv endv add rcurveto dstroke}
+ {centerh endh add centerv endv add rlineto dstroke}ifelse}ifelse}def
+
+/Barray 200 array def % 200 values in a wiggle
+/D~{mark}def
+/D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop
+ /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and
+ {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def
+ Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put
+ Bcontrol Blen 2 sub 2 copy get 2 mul put
+ Bcontrol Blen 1 sub 2 copy get 2 mul put
+ /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub
+ {/i exch def
+ Bcontrol i get 3 div Bcontrol i 1 add get 3 div
+ Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div
+ Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div
+ /Xbi Xcont Bcontrol i 2 add get 2 div add def
+ /Ybi Ycont Bcontrol i 3 add get 2 div add def
+ /Xcont Xcont Bcontrol i 2 add get add def
+ /Ycont Ycont Bcontrol i 3 add get add def
+ Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto
+ }for dstroke}if}def
+end
+/ditstart{$DITroff begin
+ /nfonts 49 def
+ /fonts[nfonts{0}repeat]def
+ /fontnames[nfonts{()}repeat]def
+/docsave save def
+}def
+
+% character outcalls
+/oc
+ {/pswid exch def /cc exch def /name exch def
+ /ditwid pswid fontsize mul resolution mul 72000 div def
+ /ditsiz fontsize resolution mul 72 div def
+ ocprocs name known{ocprocs name get exec}{name cb}
+ ifelse}def
+/fractm [.65 0 0 .6 0 0] def
+/fraction
+ {/fden exch def /fnum exch def gsave /cf currentfont def
+ cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
+ fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
+ grestore ditwid 0 rmoveto} def
+
+/ocb
+ {/s2 .5 dm def /s4 .25 dm def
+ 2 setlinejoin gsave currentpoint newpath dround translate 0 0 moveto}def
+/oce {grestore ditwid 0 rmoveto}def
+/occ {grestore}def
+/dm {ditsiz mul}def
+/4p {pop pop pop pop}def
+
+/ocprocs 25 dict def ocprocs begin
+(X0) {ocb oce}def %room for building special characters with X names
+(X1) {ocb oce}def %all these do is move the width of the char which is 1 em
+(X2) {ocb oce}def
+(X3) {ocb oce}def
+(X4) {ocb oce}def
+(X5) {ocb oce}def
+(X6) {ocb oce}def
+(X7) {ocb oce}def
+(X8) {ocb oce}def
+(X9) {ocb oce}def
+(XX) {ocb oce}def
+
+(MD) {ocb 0 -.25 dm moveto .4333 dm -1 dm lineto .8666 dm -.25 dm lineto
+ 0 -.25 dm lineto closepath stroke occ
+ ocb 0 -.75 dm moveto .8666 dm -.75 dm lineto .4333 dm 0 dm lineto
+ 0 -.75 dm lineto closepath stroke oce}def
+(OU) { ocb .5 dm -.35 dm moveto currentpoint newpath .35 dm 0 360 arc closepath
+ stroke occ
+ ocb .3 dm -.50 dm moveto .3 dm -.3 dm lineto
+ .5 dm -.3 dm .2 dm 180 360 arcn .7 dm -.50 dm lineto stroke oce}def
+
+(14) {(1)(4)fraction}def
+(12) {(1)(2)fraction}def
+(34) {(3)(4)fraction}def
+(18) {(1)(8)fraction}def
+(38) {(3)(8)fraction}def
+(58) {(5)(8)fraction}def
+(78) {(7)(8)fraction}def
+(13) {(1)(3)fraction}def
+(23) {(2)(3)fraction}def
+
+(ff) {gsave (f) show -.06 dm 0 rmoveto (f) show oce}def
+(Fl) {gsave (f) show -.06 dm 0 rmoveto (\257) show oce}def
+(Fi) {gsave (f) show -.06 dm 0 rmoveto (\256) show oce}def
+end
+
+% DIThacks fonts for some special chars
+50 dict dup begin
+/FontType 3 def
+/FontName /DIThacks def
+/FontMatrix [.001 0.0 0.0 .001 0.0 0.0] def
+/FontBBox [-220 -280 900 900] def% a lie but ...
+/Encoding 256 array def
+0 1 255{Encoding exch /.notdef put}for
+Encoding
+ dup 8#040/space put %space
+ dup 8#110/rc put %right ceil
+ dup 8#111/lt put %left top curl
+ dup 8#112/bv put %bold vert
+ dup 8#113/lk put %left mid curl
+ dup 8#114/lb put %left bot curl
+ dup 8#115/rt put %right top curl
+ dup 8#116/rk put %right mid curl
+ dup 8#117/rb put %right bot curl
+ dup 8#120/rf put %right floor
+ dup 8#121/lf put %left floor
+ dup 8#122/lc put %left ceil
+ dup 8#140/sq put %square
+ dup 8#141/bx put %box
+ dup 8#142/ci put %circle
+ dup 8#143/br put %box rule
+ dup 8#144/rn put %root extender
+ dup 8#145/vr put %vertical rule
+ dup 8#146/ob put %outline bullet
+ dup 8#147/bu put %bullet
+ dup 8#150/ru put %rule
+ dup 8#151/ul put %underline
+ pop
+/DITfd 100 dict def
+/BuildChar{0 begin
+ /cc exch def /fd exch def
+ /charname fd /Encoding get cc get def
+ /charwid fd /Metrics get charname get def
+ /charproc fd /CharProcs get charname get def
+ charwid 0 fd /FontBBox get aload pop setcachedevice
+ 40 setlinewidth
+ newpath 0 0 moveto gsave charproc grestore
+ end}def
+/BuildChar load 0 DITfd put
+%/UniqueID 5 def
+/CharProcs 50 dict def
+CharProcs begin
+/space{}def
+/.notdef{}def
+/ru{500 0 rls}def
+/rn{-55 725 moveto 500 0 rlineto 25 setlinewidth stroke}def
+/vr{125 800 moveto 0 -770 rls}def
+/bv{125 800 moveto 0 -1000 rls}def
+/br{0 770 moveto 0 -1040 rls}def
+/ul{0 -250 moveto 500 0 rls}def
+/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
+/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
+/sq{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
+/bx{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
+/ci{355 333 rmoveto currentpoint newpath 333 0 360 arc
+ 50 setlinewidth stroke}def
+
+/lt{125 -200 moveto 125 400 lineto 125 550 260 780 375 800 curveto stroke}def
+/lb{125 800 moveto 125 200 lineto 125 50 260 -180 375 -200 curveto stroke}def
+/rt{125 -200 moveto 125 400 lineto 125 550 -10 780 -125 800 curveto stroke}def
+/rb{125 800 moveto 125 200 lineto 125 50 -10 -180 -125 -200 curveto stroke}def
+/lk{125 800 moveto 125 700 lineto 125 550 125 320 -125 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 -125 300 curveto stroke}def
+/rk{125 800 moveto 125 700 lineto 125 550 125 320 375 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 375 300 curveto stroke}def
+/lf{125 800 moveto 0 -1000 rlineto s4 0 rls}def
+/rf{125 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
+/lc{125 -200 moveto 0 1000 rlineto s4 0 rls}def
+/rc{125 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
+end
+
+/Metrics 50 dict def Metrics begin
+/.notdef 0 def
+/space 500 def
+/ru 500 def
+/br 0 def
+/lt 250 def
+/lb 250 def
+/rt 250 def
+/rb 250 def
+/lk 250 def
+/rk 250 def
+/rc 250 def
+/lc 250 def
+/rf 250 def
+/lf 250 def
+/bv 250 def
+/ob 350 def
+/bu 350 def
+/ci 750 def
+/bx 750 def
+/sq 750 def
+/rn 500 def
+/ul 500 def
+/vr 0 def
+end
+
+DITfd begin
+/s2 500 def /s4 250 def /s3 333 def
+/a4p{arcto pop pop pop pop}def
+/2cx{2 copy exch}def
+/rls{rlineto stroke}def
+/currx{currentpoint pop}def
+/dround{transform round exch round exch itransform} def
+end
+end
+/DIThacks exch definefont pop
+%! MF-logo font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/MF-logoFont 10 dict def
+/fudge 110 def
+MF-logoFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+/hyphen
+(
+newpath
+%new path
+200 350 moveto
+596 350 lineto
+596 396 lineto
+200 396 lineto
+200 350 lineto
+closepath
+%end path
+fill
+) def
+
+/M
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 238 590 lineto
+ 306 470 376 348 446 228 curveto
+ 444 230 lineto
+ 448 224 lineto
+ 452 220 lineto
+ 458 216 lineto
+ 462 216 lineto
+ 468 214 lineto
+ 474 216 lineto
+ 476 216 lineto
+ 482 220 lineto
+ 488 224 lineto
+ 490 230 lineto
+ 492 230 lineto
+ 560 350 630 472 700 592 curveto
+ 698 590 lineto
+ 700 596 lineto
+ 700 600 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 682 576 lineto
+ 684 578 lineto
+ 690 580 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 660 580 lineto
+ 666 578 lineto
+ 670 576 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 652 590 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 652 600 lineto
+ 650 598 lineto
+ 650 194 lineto
+ 652 194 lineto
+ 652 186 lineto
+ 656 180 lineto
+ 660 178 lineto
+ 666 174 lineto
+ 670 174 lineto
+ 676 172 lineto
+ 682 174 lineto
+ 684 174 lineto
+ 690 178 lineto
+ 696 180 lineto
+ 698 186 lineto
+ 700 190 lineto
+ 700 600 lineto
+ 698 604 lineto
+ 696 610 lineto
+ 690 614 lineto
+ 684 618 lineto
+ 682 618 lineto
+ 676 620 lineto
+ 670 618 lineto
+ 666 618 lineto
+ 660 614 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 582 484 512 362 444 242 curveto
+ 444 234 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 462 258 lineto
+ 458 256 lineto
+ 452 254 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 482 254 lineto
+ 476 256 lineto
+ 474 258 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 492 238 lineto
+ 490 244 lineto
+ 420 364 350 486 282 606 curveto
+ 282 604 lineto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+fill
+) def
+
+/E
+(
+newpath
+%new path
+ 556 224 moveto
+ 554 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 222 lineto
+ 244 218 lineto
+ 240 214 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 274 218 lineto
+ 268 222 lineto
+ 266 222 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 282 208 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 280 190 lineto
+ 282 194 lineto
+ 284 200 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 202 lineto
+ 236 204 lineto
+ 236 194 lineto
+ 240 190 lineto
+ 244 184 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 562 180 lineto
+ 564 182 lineto
+ 570 184 lineto
+ 576 190 lineto
+ 578 194 lineto
+ 580 200 lineto
+ 580 204 lineto
+ 578 208 lineto
+ 576 214 lineto
+ 570 218 lineto
+ 564 222 lineto
+ 562 222 lineto
+ 556 224 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/T
+(
+newpath
+%new path
+ 202 568 moveto
+ 578 568 lineto
+ 580 570 lineto
+ 586 572 lineto
+ 592 578 lineto
+ 594 582 lineto
+ 596 588 lineto
+ 596 592 lineto
+ 594 596 lineto
+ 592 602 lineto
+ 586 606 lineto
+ 580 610 lineto
+ 578 610 lineto
+ 572 612 lineto
+ 570 610 lineto
+ 202 610 lineto
+ 202 612 lineto
+ 196 610 lineto
+ 194 610 lineto
+ 188 606 lineto
+ 182 602 lineto
+ 180 596 lineto
+ 180 582 lineto
+ 182 578 lineto
+ 188 572 lineto
+ 194 570 lineto
+ 196 568 lineto
+ 202 568 lineto
+closepath
+%end path
+%new path
+ 368 602 moveto
+ 364 596 lineto
+ 364 592 lineto
+ 362 590 lineto
+ 362 194 lineto
+ 364 194 lineto
+ 364 186 lineto
+ 368 180 lineto
+ 372 178 lineto
+ 378 174 lineto
+ 382 174 lineto
+ 388 172 lineto
+ 394 174 lineto
+ 396 174 lineto
+ 402 178 lineto
+ 408 180 lineto
+ 410 186 lineto
+ 412 190 lineto
+ 412 592 lineto
+ 410 596 lineto
+ 408 602 lineto
+ 402 606 lineto
+ 396 610 lineto
+ 394 610 lineto
+ 388 612 lineto
+ 382 610 lineto
+ 378 610 lineto
+ 372 606 lineto
+ 368 602 lineto
+closepath
+%end path
+fill
+) def
+
+/A
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 376 lineto
+ 280 362 lineto
+ 260 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 556 366 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 560 386 lineto
+ 556 380 lineto
+ 556 376 lineto
+ 554 374 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+ 602 186 lineto
+ 604 190 lineto
+ 604 376 lineto
+ 602 380 lineto
+ 600 386 lineto
+ 594 390 lineto
+ 588 394 lineto
+ 586 394 lineto
+ 580 396 lineto
+ 578 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 376 lineto
+ 234 374 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 280 362 moveto
+ 282 366 lineto
+ 284 372 lineto
+ 284 410 284 452 292 490 curveto
+ 290 488 lineto
+ 290 484 lineto
+ 294 504 300 522 310 538 curveto
+ 306 532 lineto
+ 308 534 lineto
+ 308 536 310 538 312 542 curveto
+ 314 546 318 548 322 552 curveto
+ 320 552 lineto
+ 324 556 lineto
+ 324 566 lineto
+ 320 552 lineto
+ 300 542 lineto
+ 306 542 lineto
+ 310 544 lineto
+ 316 546 lineto
+ 316 548 lineto
+ 324 554 332 560 340 564 curveto
+ 334 560 lineto
+ 334 562 lineto
+ 340 564 346 566 350 568 curveto
+ 346 566 lineto
+ 348 568 lineto
+ 356 570 364 572 374 574 curveto
+ 372 572 lineto
+ 368 572 lineto
+ 384 576 402 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 438 574 456 574 472 570 curveto
+ 472 572 lineto
+ 466 572 lineto
+ 476 570 484 568 492 566 curveto
+ 488 568 lineto
+ 490 566 lineto
+ 494 564 500 562 506 560 curveto
+ 504 560 lineto
+ 498 564 lineto
+ 500 562 lineto
+ 508 558 516 552 524 546 curveto
+ 522 546 lineto
+ 528 544 lineto
+ 532 542 lineto
+ 538 542 lineto
+ 518 552 lineto
+ 514 562 lineto
+ 514 556 lineto
+ 518 552 lineto
+ 518 550 lineto
+ 522 546 526 544 528 540 curveto
+ 530 536 532 534 532 532 curveto
+ 528 538 lineto
+ 530 536 lineto
+ 540 520 546 502 550 482 curveto
+ 548 484 lineto
+ 548 488 lineto
+ 556 450 556 408 556 370 curveto
+ 556 366 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 602 366 lineto
+ 604 372 lineto
+ 604 376 lineto
+ 602 376 lineto
+ 602 414 602 456 594 494 curveto
+ 596 492 lineto
+ 594 498 lineto
+ 590 518 584 536 574 552 curveto
+ 572 556 lineto
+ 570 558 lineto
+ 570 560 568 562 566 566 curveto
+ 564 570 560 572 556 576 curveto
+ 558 576 lineto
+ 552 580 lineto
+ 552 582 lineto
+ 544 588 536 594 528 598 curveto
+ 522 600 lineto
+ 522 602 lineto
+ 516 604 510 606 506 608 curveto
+ 504 608 lineto
+ 502 610 lineto
+ 494 612 486 614 476 616 curveto
+ 478 614 lineto
+ 472 616 lineto
+ 470 616 lineto
+ 454 620 436 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 400 618 382 618 366 614 curveto
+ 366 616 lineto
+ 360 614 lineto
+ 350 612 342 610 334 608 curveto
+ 332 608 lineto
+ 330 606 lineto
+ 326 604 320 602 314 600 curveto
+ 316 600 lineto
+ 310 598 lineto
+ 308 596 lineto
+ 300 592 292 586 284 580 curveto
+ 286 580 lineto
+ 280 576 lineto
+ 280 574 lineto
+ 276 570 272 568 270 564 curveto
+ 268 560 266 558 266 556 curveto
+ 264 552 lineto
+ 262 550 lineto
+ 252 534 246 516 242 496 curveto
+ 244 498 lineto
+ 242 492 lineto
+ 234 454 234 412 234 374 curveto
+ 236 376 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 274 356 lineto
+ 280 362 lineto
+closepath
+%end path
+fill
+) def
+
+/F
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/O
+(
+newpath
+%new path
+ 248 362 moveto
+ 250 366 lineto
+ 252 372 lineto
+ 252 408 252 446 258 480 curveto
+ 256 474 lineto
+ 258 476 lineto
+ 262 494 268 514 278 530 curveto
+ 276 528 lineto
+ 274 524 lineto
+ 278 530 282 536 286 542 curveto
+ 288 544 290 546 292 546 curveto
+ 290 546 lineto
+ 294 550 lineto
+ 294 560 lineto
+ 290 546 lineto
+ 270 536 lineto
+ 276 536 lineto
+ 280 538 lineto
+ 286 540 lineto
+ 286 542 lineto
+ 296 550 306 558 316 562 curveto
+ 314 562 lineto
+ 308 558 lineto
+ 310 560 lineto
+ 316 562 322 564 328 566 curveto
+ 326 566 lineto
+ 324 564 lineto
+ 324 566 lineto
+ 334 568 344 570 352 572 curveto
+ 346 570 lineto
+ 346 572 lineto
+ 370 576 396 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 444 574 470 574 494 570 curveto
+ 492 570 lineto
+ 486 572 lineto
+ 488 570 lineto
+ 496 568 506 566 516 564 curveto
+ 514 564 lineto
+ 512 566 lineto
+ 512 564 lineto
+ 518 562 524 560 530 558 curveto
+ 524 562 lineto
+ 524 560 lineto
+ 534 556 544 548 554 540 curveto
+ 552 540 lineto
+ 558 538 lineto
+ 562 536 lineto
+ 568 536 lineto
+ 548 546 lineto
+ 544 556 lineto
+ 544 550 lineto
+ 548 546 lineto
+ 548 544 lineto
+ 550 544 552 542 554 540 curveto
+ 558 534 562 528 566 522 curveto
+ 564 524 lineto
+ 562 528 lineto
+ 572 512 578 492 582 474 curveto
+ 580 480 lineto
+ 582 478 lineto
+ 588 444 588 406 588 370 curveto
+ 588 366 lineto
+ 592 362 lineto
+ 596 356 lineto
+ 602 354 lineto
+ 606 352 lineto
+ 618 352 lineto
+ 620 354 lineto
+ 626 356 lineto
+ 632 362 lineto
+ 634 366 lineto
+ 636 372 lineto
+ 636 376 lineto
+ 634 376 lineto
+ 634 412 634 450 628 484 curveto
+ 628 488 lineto
+ 626 490 lineto
+ 622 508 616 528 606 544 curveto
+ 608 542 lineto
+ 604 548 lineto
+ 600 554 596 560 592 566 curveto
+ 590 568 588 570 586 570 curveto
+ 588 570 lineto
+ 582 574 lineto
+ 582 576 lineto
+ 572 584 562 592 552 596 curveto
+ 554 596 lineto
+ 548 598 lineto
+ 546 600 lineto
+ 540 602 534 604 528 606 curveto
+ 526 606 lineto
+ 526 608 lineto
+ 516 610 506 612 498 614 curveto
+ 492 614 lineto
+ 492 616 lineto
+ 468 620 442 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 394 618 368 618 344 614 curveto
+ 340 614 lineto
+ 338 612 lineto
+ 330 610 320 608 310 606 curveto
+ 308 606 lineto
+ 308 604 lineto
+ 302 602 296 600 290 598 curveto
+ 284 596 lineto
+ 284 594 lineto
+ 274 590 264 582 254 574 curveto
+ 256 574 lineto
+ 250 570 lineto
+ 250 568 lineto
+ 248 568 246 566 244 564 curveto
+ 240 558 236 552 232 546 curveto
+ 234 548 lineto
+ 230 542 lineto
+ 220 526 214 506 210 488 curveto
+ 210 484 lineto
+ 208 482 lineto
+ 202 448 202 410 202 374 curveto
+ 204 376 lineto
+ 204 366 lineto
+ 208 362 lineto
+ 212 356 lineto
+ 218 354 lineto
+ 222 352 lineto
+ 234 352 lineto
+ 236 354 lineto
+ 242 356 lineto
+ 248 362 lineto
+closepath
+%end path
+%new path
+ 204 372 moveto
+ 204 370 lineto
+ 204 344 204 316 210 292 curveto
+ 208 292 lineto
+ 210 288 lineto
+ 210 286 lineto
+ 214 272 218 256 226 244 curveto
+ 228 240 lineto
+ 230 238 lineto
+ 234 232 238 224 244 218 curveto
+ 244 220 lineto
+ 248 214 lineto
+ 250 214 lineto
+ 250 212 250 212 252 212 curveto
+ 260 204 268 198 278 194 curveto
+ 276 194 lineto
+ 282 192 lineto
+ 284 190 lineto
+ 290 188 296 186 302 184 curveto
+ 304 184 lineto
+ 304 182 lineto
+ 314 180 322 180 332 178 curveto
+ 338 178 lineto
+ 338 176 lineto
+ 364 172 394 172 420 172 curveto
+ 420 174 lineto
+ 446 174 476 174 502 178 curveto
+ 506 178 lineto
+ 508 180 lineto
+ 518 180 526 182 536 184 curveto
+ 538 184 lineto
+ 538 186 lineto
+ 544 188 550 190 556 192 curveto
+ 562 194 lineto
+ 562 196 lineto
+ 572 200 580 206 588 214 curveto
+ 590 214 590 214 590 216 curveto
+ 590 214 lineto
+ 594 220 lineto
+ 596 220 lineto
+ 602 226 606 234 610 240 curveto
+ 612 244 lineto
+ 614 246 lineto
+ 622 258 626 274 630 288 curveto
+ 628 288 lineto
+ 630 292 lineto
+ 630 294 lineto
+ 636 318 636 346 636 372 curveto
+ 636 376 lineto
+ 634 380 lineto
+ 632 386 lineto
+ 626 390 lineto
+ 620 394 lineto
+ 618 394 lineto
+ 612 396 lineto
+ 606 394 lineto
+ 602 394 lineto
+ 596 390 lineto
+ 592 386 lineto
+ 588 380 lineto
+ 588 376 lineto
+ 586 374 lineto
+ 586 348 586 320 580 296 curveto
+ 582 296 lineto
+ 582 300 lineto
+ 578 286 574 270 566 258 curveto
+ 570 264 lineto
+ 568 262 lineto
+ 564 256 560 248 554 242 curveto
+ 554 244 lineto
+ 552 238 lineto
+ 550 234 lineto
+ 550 230 lineto
+ 554 244 lineto
+ 574 254 lineto
+ 568 252 lineto
+ 566 252 lineto
+ 560 248 lineto
+ 558 248 lineto
+ 558 246 558 246 556 246 curveto
+ 548 238 540 232 530 228 curveto
+ 532 228 lineto
+ 538 232 lineto
+ 536 230 lineto
+ 530 228 524 226 518 224 curveto
+ 520 224 lineto
+ 522 226 lineto
+ 522 224 lineto
+ 512 222 504 220 494 218 curveto
+ 500 220 lineto
+ 500 218 lineto
+ 474 214 444 214 418 214 curveto
+ 420 216 lineto
+ 414 214 lineto
+ 410 214 lineto
+ 404 210 lineto
+ 400 206 lineto
+ 420 216 lineto
+ 440 206 lineto
+ 434 210 lineto
+ 428 214 lineto
+ 426 214 lineto
+ 420 216 lineto
+ 418 216 lineto
+ 392 216 362 216 336 220 curveto
+ 338 220 lineto
+ 344 218 lineto
+ 342 220 lineto
+ 332 222 324 224 314 226 curveto
+ 316 226 lineto
+ 318 224 lineto
+ 318 226 lineto
+ 312 228 306 230 300 232 curveto
+ 306 228 lineto
+ 306 230 lineto
+ 296 234 288 240 280 248 curveto
+ 278 248 278 248 278 250 curveto
+ 278 248 lineto
+ 272 252 lineto
+ 270 252 lineto
+ 264 254 lineto
+ 284 244 lineto
+ 288 234 lineto
+ 286 238 lineto
+ 284 244 lineto
+ 282 244 lineto
+ 276 250 272 258 268 264 curveto
+ 272 258 lineto
+ 270 260 lineto
+ 262 272 258 288 254 302 curveto
+ 256 302 lineto
+ 256 298 lineto
+ 250 322 250 350 250 376 curveto
+ 252 376 lineto
+ 250 380 lineto
+ 248 386 lineto
+ 242 390 lineto
+ 236 394 lineto
+ 234 394 lineto
+ 228 396 lineto
+ 222 394 lineto
+ 218 394 lineto
+ 212 390 lineto
+ 208 386 lineto
+ 204 380 lineto
+ 204 372 lineto
+closepath
+%end path
+fill
+) def
+
+/N
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 240 586 lineto
+ 240 584 lineto
+ 346 464 454 344 560 224 curveto
+ 564 220 lineto
+ 570 216 lineto
+ 574 216 lineto
+ 580 214 lineto
+ 586 216 lineto
+ 588 216 lineto
+ 594 220 lineto
+ 600 224 lineto
+ 602 230 lineto
+ 604 234 lineto
+ 604 238 lineto
+ 602 244 lineto
+ 600 248 lineto
+ 598 250 lineto
+ 492 370 384 490 278 610 curveto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 600 180 moveto
+ 602 186 lineto
+ 604 190 lineto
+ 604 600 lineto
+ 602 604 lineto
+ 600 610 lineto
+ 594 614 lineto
+ 588 618 lineto
+ 586 618 lineto
+ 580 620 lineto
+ 574 618 lineto
+ 570 618 lineto
+ 564 614 lineto
+ 560 610 lineto
+ 556 604 lineto
+ 556 600 lineto
+ 554 598 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 77 /M put
+Encoding 69 /E put
+Encoding 84 /T put
+Encoding 65 /A put
+Encoding 70 /F put
+Encoding 79 /O put
+Encoding 78 /N put
+Encoding 45 /hyphen put
+
+Metrics
+ begin
+/.notdef 0 def
+/M 520 fudge add def
+/E 400 fudge add def
+/T 416 fudge add def
+/A 424 fudge add def
+/F 346 fudge add def
+/O 434 fudge add def
+/N 424 fudge add def
+/hyphen 416 fudge add def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ % bounding box : [180 180 700 700]
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 80 add 1000
+ setcachedevice
+ -182 fudge add -230 translate
+ 1.1 1.3 scale
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [182 fudge sub 180 700 620] def
+
+ end
+
+ /MF-logo MF-logoFont definefont pop
+
+%/MF-logo findfont 11 scalefont setfont
+%100 210 moveto (METAFONT) show
+%1 2 scale (METAFONT) show
+%1 2 scale (METAFONT) show
+%showpage
+ditstart
+(psc)xT
+576 1 1 xr
+1(Times-Roman)xf 1 f F
+2(Times-Italic)xf 2 f F
+3(Times-Bold)xf 3 f F
+4(Times-BoldItalic)xf 4 f F
+5(Courier)xf 5 f F
+6(Courier-Oblique)xf 6 f F
+7(Courier-Bold)xf 7 f F
+8(Courier-BoldOblique)xf 8 f F
+9(Helvetica)xf 9 f F
+10(Helvetica-Oblique)xf 10 f F
+11(Helvetica-Bold)xf 11 f F
+12(Helvetica-BoldOblique)xf 12 f F
+13(Hebrew-Frank-Ruehl)xf 13 f F
+14(Hebrew-Gam)xf 14 f F
+15(Hebrew-Gam-Bold)xf 15 f F
+16(Hebrew-Yuval)xf 16 f F
+17(Hebrew-David)xf 17 f F
+18(Hebrew-Tel-Aviv)xf 18 f F
+19(Hebrew-OldJaffa)xf 19 f F
+20(AvantGarde-Book)xf 20 f F
+21(AvantGarde-BookOblique)xf 21 f F
+22(AvantGarde-Demi)xf 22 f F
+23(AvantGarde-DemiOblique)xf 23 f F
+24(NewCenturySchlbk-Roman)xf 24 f F
+25(NewCenturySchlbk-Italic)xf 25 f F
+26(NewCenturySchlbk-Bold)xf 26 f F
+27(NewCenturySchlbk-BoldItalic)xf 27 f F
+28(Palatino-Roman)xf 28 f F
+29(Palatino-Italic)xf 29 f F
+30(Palatino-Bold)xf 30 f F
+31(Palatino-BoldItalic)xf 31 f F
+32(ZapfChancery-MediumItalic)xf 32 f F
+33(ZapfDingbats)xf 33 f F
+34(Bookman-Light)xf 34 f F
+35(Bookman-LightItalic)xf 35 f F
+36(Bookman-Demi)xf 36 f F
+37(Bookman-DemiItalic)xf 37 f F
+38(Helvetica-Narrow)xf 38 f F
+39(Helvetica-Narrow-Oblique)xf 39 f F
+40(Helvetica-Narrow-Bold)xf 40 f F
+41(Helvetica-Narrow-BoldOblique)xf 41 f F
+42(Nescii-Initial-Stroke)xf 42 f F
+43(Nescii-Middle-Stroke)xf 43 f F
+44(Nescii-Final-Stroke)xf 44 f F
+45(Nescii-Standalone-Stroke)xf 45 f F
+46(Arabic-Naskh)xf 46 f F
+47(Symbol)xf 47 f F
+48(DIThacks)xf 48 f F
+xi
+%%EndProlog
+
+%%Page: 1 2
+1 p
+10 s 10 xH 0 xS 1 f F
+48 f F
+576 576(h)N
+611(h)X
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+12 s 12 xH 1 f F
+576 672(Environment)N
+1103(for)X
+1239(Translating)X
+0(MF-logo)xf 0 f F
+576 768(METAFONT)N
+1 f F
+1007(to)X
+1106(P)X
+10 s 10 xH F
+1159(OST)X
+12 s 12 xH F
+1310(S)X
+10 s 10 xH F
+1363(CRIPT)X
+735 888(Shimon)N
+1003(Yanai)X
+1215(and)X
+1351(Daniel)X
+1585(M.)X
+1696(Berry)X
+3 f F
+576 1048(Abstract)N
+1 f F
+576 1192(This)N
+745(paper)X
+951(describes)X
+1277(a)X
+1340(program,)X
+9 f F
+1661(mf2ps)X
+1 f F
+1878(,)X
+1925(that)X
+2073(translates)X
+576 1288(a)N
+0 f F
+654(METAFONT)X
+1 f F
+1037(font)X
+1207(de\256nition)X
+1554(into)X
+1719(a)X
+1796(de\256nition)X
+2143(for)X
+2278(the)X
+576 1384(same)N
+769(font)X
+926(in)X
+1017(the)X
+1144(P)X
+8 s 8 xH F
+1188(OST)X
+10 s 10 xH F
+1309(S)X
+8 s 8 xH F
+1353(CRIPT)X
+10 s 10 xH F
+1564(language.)X
+9 f F
+1905(mf2ps)X
+1 f F
+2151(is)X
+2233(con-)X
+576 1480(structed)N
+859(out)X
+990(of)X
+1086(the)X
+1213(part)X
+1366(of)X
+1461(the)X
+0 f F
+1587(METAFONT)X
+1 f F
+1956(program)X
+2256(that)X
+576 1576(extracts)N
+846(the)X
+964(envelopes)X
+1305(of)X
+1392(the)X
+1510(letters;)X
+1749(these)X
+1935(envelopes)X
+2277(are)X
+576 1672(converted)N
+913(into)X
+1057(P)X
+8 s 8 xH F
+1101(OST)X
+10 s 10 xH F
+1222(S)X
+8 s 8 xH F
+1266(CRIPT)X
+10 s 10 xH F
+1468(outlines.)X
+3 f F
+576 1864(1)N
+676(Introduction)X
+1 f F
+576 2008(This)N
+739(paper)X
+939(describes)X
+1259(a)X
+1316(program,)X
+9 f F
+1632(mf2ps)X
+1 f F
+1849(,)X
+1891(that)X
+2033(takes)X
+2220(from)X
+576 2104(a)N
+0 f F
+641(METAFONT)X
+1 f F
+1011([10,)X
+1151(11])X
+1287(program)X
+1588(for)X
+1711(a)X
+1776(font)X
+1934(all)X
+2043(the)X
+2170(neces-)X
+576 2200(sary)N
+735(information)X
+1138(in)X
+1225(order)X
+1421(to)X
+1509(create)X
+1728(an)X
+1830(equivalent)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 2296(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+834([1])X
+959(font)X
+1119(de\256nition.)X
+1476(The)X
+1632(program)X
+1935(makes)X
+2171(use)X
+2309(of)X
+576 2392(the)N
+704(front)X
+890(end)X
+1036(of)X
+1133(the)X
+0 f F
+1261(METAFONT)X
+1 f F
+1632(program)X
+1935(to)X
+2028(extract)X
+2278(the)X
+576 2488(envelopes)N
+920(of)X
+1010(the)X
+1131(letters)X
+1349(to)X
+1433(produce)X
+1714(the)X
+1834(P)X
+8 s 8 xH F
+1878(OST)X
+10 s 10 xH F
+1999(S)X
+8 s 8 xH F
+2043(CRIPT)X
+10 s 10 xH F
+2247(out-)X
+576 2584(lines.)N
+791(What)X
+1009(makes)X
+1258(this)X
+1417(process)X
+1703(natural)X
+1971(is)X
+2069(that)X
+2234(both)X
+0 f F
+576 2680(METAFONT)N
+1 f F
+944(and)X
+1087(P)X
+8 s 8 xH F
+1131(OST)X
+10 s 10 xH F
+1252(S)X
+8 s 8 xH F
+1296(CRIPT)X
+10 s 10 xH F
+1505(make)X
+1706(liberal)X
+1938(use)X
+2072(of)X
+2165(Be)X
+2223(\302zier)X
+576 2776(curves)N
+806(to)X
+888(describe)X
+1176(non-circular)X
+1589(curves.)X
+735 2872(By)N
+852(producing)X
+1201(this)X
+1340(translator,)X
+1687(it)X
+1755(is)X
+1833(hoped)X
+2054(to)X
+2141(be)X
+2242(able)X
+576 2968(to)N
+673(produce)X
+967(from)X
+0 f F
+1158(METAFONT)X
+1 f F
+1534(fonts)X
+1729(P)X
+8 s 8 xH F
+1773(OST)X
+10 s 10 xH F
+1894(S)X
+8 s 8 xH F
+1938(CRIPT)X
+10 s 10 xH F
+2154(outline)X
+576 3064(fonts)N
+757(which)X
+974(are)X
+1095(more)X
+1282(compact)X
+1576(than)X
+1736(the)X
+1856(bitmapped)X
+2216(fonts)X
+576 3160(produced)N
+899(by)X
+1003(the)X
+0 f F
+1125(METAFONT)X
+1 f F
+1490(program.)X
+1805(Certainly)X
+2126(the)X
+2247(out-)X
+576 3256(line)N
+717(fonts)X
+898(are)X
+1018(more)X
+1204(easily)X
+1412(scaled)X
+1634(to)X
+1718(other)X
+1905(magni\256cations)X
+576 3352(and)N
+721(possibly)X
+1016(even)X
+1196(other)X
+1389(design)X
+1626(sizes)X
+1810(than)X
+1976(are)X
+2103(bitmaps.)X
+576 3448(Moreover,)N
+950(doing)X
+1169(so)X
+1277(makes)X
+1519(fonts)X
+1717(heretofore)X
+2086(available)X
+576 3544(only)N
+741(on)X
+843(T)X
+884 3560(E)N
+925 3544(X)N
+1005([9])X
+1121(and)X
+1259(other)X
+1446(DVI-based)X
+1821(formatters,)X
+2193(avail-)X
+576 3640(able)N
+751(on)X
+9 f F
+874(ditroff)X
+1 f F
+1114([8])X
+1249(and)X
+1407(other)X
+1614(formatters)X
+1986(which)X
+2224(have)X
+576 3736(evolved,)N
+891(or)X
+998(have)X
+1190(been)X
+1382(designed,)X
+1727(for)X
+1861(use)X
+2008(with)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 3832(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+825(printers.)X
+1114(This)X
+1280(paper,)X
+1503(which)X
+1723(is)X
+1800(typeset)X
+2051(by)X
+9 f F
+2157(ditroff)X
+1 f F
+2356(,)X
+576 3928(uses)N
+741(a)X
+804(P)X
+8 s 8 xH F
+848(OST)X
+10 s 10 xH F
+969(S)X
+8 s 8 xH F
+1013(CRIPT)X
+10 s 10 xH F
+1222(version)X
+1485(of)X
+1579(the)X
+1704(logo)X
+1873(font)X
+2029(in)X
+2118(order)X
+2314(to)X
+576 4024(print)N
+752(the)X
+875(word)X
+1065(\252)X
+0 f F
+1101(METAFONT)X
+1 f F
+1455(\272)X
+1517(in)X
+1605(the)X
+1729(same)X
+1920(appearance)X
+2309(as)X
+576 4120(in)N
+685(T)X
+726 4136(E)N
+767 4120(X-generated)N
+1212(documents.)X
+1646(Moreover,)X
+2030(these)X
+2242(new)X
+576 4216(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+989(outline)X
+1233(fonts)X
+1415(can)X
+1549(be)X
+1647(used)X
+1816(in)X
+1900(T)X
+1941 4232(E)N
+1982 4216(X)N
+2063(also!)X
+2242(One)X
+576 4312(needs)N
+779(only)X
+941(the)X
+1059(T)X
+1100 4328(E)N
+1141 4312(X)N
+1191 4328(P)N
+1227 4312(S)N
+1291([3])X
+1405(software.)X
+735 4408(The)N
+888(organization)X
+1318(of)X
+1414(this)X
+1558(paper)X
+1766(is)X
+1848(as)X
+1944(follows.)X
+2233(Sec-)X
+576 4504(tion)N
+728(2)X
+796(presents)X
+1087(the)X
+1213(background)X
+1620(of)X
+1715(this)X
+1857(work.)X
+2069(Section)X
+2336(3)X
+576 4600(explains)N
+864(the)X
+984(rationale)X
+1287(behind)X
+1527(building)X
+1815(the)X
+1935(translator)X
+2260(and)X
+576 4696(describes)N
+912(a)X
+985(previous)X
+1298(attempt)X
+1575(at)X
+1670(writing)X
+1938(the)X
+2073(translator)X
+576 4792(and)N
+730(an)X
+845(approach)X
+1179(to)X
+1280(avoid.)X
+1517(The)X
+1681(software)X
+1997(engineering)X
+576 4888(aspect)N
+808(of)X
+906(the)X
+1035(translator)X
+1369(is)X
+1453(described)X
+1792(also)X
+1952(in)X
+2045(Section)X
+2316(3.)X
+576 4984(The)N
+730(details)X
+968(of)X
+1064(the)X
+1191(implementation)X
+1722(are)X
+1850(exposed)X
+2142(in)X
+2233(Sec-)X
+576 5080(tion)N
+738(4.)X
+836(Section)X
+1114(5)X
+1192(describes)X
+1528(the)X
+1663(operation)X
+2003(of)X
+2107(the)X
+2242(pro-)X
+576 5176(gram.)N
+786(Section)X
+1051(6)X
+1116(evaluates)X
+1440(the)X
+1563(results.)X
+1818(Finally)X
+2070(Section)X
+2336(7)X
+576 5272(describes)N
+895(improvements)X
+1373(to)X
+1455(the)X
+1573(translator)X
+1896(that)X
+2036(are)X
+2155(left)X
+2282(for)X
+576 5368(future)N
+788(work.)X
+3 f F
+576 5560(2)N
+676(Background)X
+1 f F
+576 5704(Typesetter)N
+943(formatting)X
+1309(systems)X
+1590(such)X
+1765(as)X
+1861(T)X
+1902 5720(E)N
+1943 5704(X)N
+2030(and)X
+9 f F
+2177(ditroff)X
+1 f F
+2520 672(use)N
+2653(fonts)X
+2838(as)X
+2930(raw)X
+3076(material.)X
+3384(The)X
+3534(formatters)X
+3889(accept)X
+4120(mixed)X
+2520 768(text)N
+2661(and)X
+2798(commands)X
+3166(as)X
+3254(input)X
+3439(and)X
+3577(produce)X
+3858(output,)X
+4104(which,)X
+2520 864(if)N
+2592(sent)X
+2744(to)X
+2829(the)X
+2950(laser)X
+3125(printers)X
+3392(or)X
+3481(typesetters,)X
+3866(yields)X
+4079(format-)X
+2520 960(ted)N
+2672(text)X
+2846(printed)X
+3127(on)X
+3261(pages.)X
+3518(The)X
+3697(laser)X
+3904(printers)X
+4204(and)X
+2520 1056(typesetters)N
+2887(use)X
+3018(fonts,)X
+3222(i.e.,)X
+3364(sets)X
+3508(of)X
+3599(printable)X
+3907(patterns,)X
+4204(one)X
+2520 1152(per)N
+2666(character,)X
+3025(in)X
+3130(various)X
+3409(representations)X
+3938(in)X
+4044(order)X
+4258(to)X
+2520 1248(cause)N
+2735(the)X
+2869(desired)X
+3136(characters)X
+3498(to)X
+3595(appear)X
+3845(on)X
+3960(the)X
+4093(printed)X
+2520 1344(form.)N
+2736(For)X
+2887(some)X
+3096(printers,)X
+3401(bitmaps)X
+3694(are)X
+3833(used,)X
+4040(with)X
+4222(1's)X
+2520 1440(representing)N
+2943(inked)X
+3147(dots)X
+3306(and)X
+3448(0's)X
+3572(representing)X
+3995(non-inked)X
+2520 1536(dots.)N
+2698(Other)X
+2906(printers)X
+3176(accept)X
+3408(commands)X
+3781(that)X
+3927(cause)X
+4132(draw-)X
+2520 1632(ing)N
+2658(of)X
+2761(the)X
+2895(characters,)X
+3278(the)X
+3412(printer)X
+3662(providing)X
+4009(the)X
+4142(inked)X
+2520 1728(dots)N
+2692(according)X
+3049(to)X
+3151(the)X
+3289(drawing)X
+3592(commands.)X
+3999(One)X
+4173(such)X
+2520 1824(popular)N
+2814(command)X
+3179(language)X
+3518(is)X
+3620(P)X
+8 s 8 xH F
+3664(OST)X
+10 s 10 xH F
+3785(S)X
+8 s 8 xH F
+3829(CRIPT)X
+10 s 10 xH F
+4011(,)X
+4080(and)X
+4245(its)X
+2520 1920(usual)N
+2714(use)X
+2846(is)X
+2924(to)X
+3011(specify)X
+3268(the)X
+3391(outline)X
+3639(of)X
+3732(the)X
+3856(character)X
+4178(with)X
+2520 2016(the)N
+2653(interpreting)X
+3062(printer)X
+3311(\256lling)X
+3536(in)X
+3633(the)X
+3766(outline)X
+4022(with)X
+4198(ink.)X
+2520 2112(One)N
+2694(popular)X
+2980(method)X
+3261(of)X
+3369(describing)X
+3744(fonts)X
+3945(is)X
+4039(with)X
+4222(the)X
+0 f F
+2520 2208(METAFONT)N
+1 f F
+2884(language,)X
+3217(in)X
+3301(which)X
+3519(declarative)X
+3894(de\256nitions)X
+4253(of)X
+2520 2304(how)N
+2689(to)X
+2782(paint)X
+2973(the)X
+3102(characters)X
+3460(are)X
+3591(given)X
+3801(in)X
+3895(terms)X
+4105(of)X
+4204(pen)X
+2520 2400(path)N
+2699(and)X
+2856(pen)X
+3013(shape.)X
+3257(Another)X
+3561(popular)X
+3847(method)X
+4128(is)X
+4222(the)X
+2520 2496(same)N
+2708(P)X
+8 s 8 xH F
+2752(OST)X
+10 s 10 xH F
+2873(S)X
+8 s 8 xH F
+2917(CRIPT)X
+10 s 10 xH F
+3122(that)X
+3265(many)X
+3466(printers)X
+3734(accept.)X
+3984(The)X
+4133(prime)X
+2520 2592(di)N
+2582 MX
+(ff)138 606 oc
+2630(erence)X
+2869(is)X
+2950(that)X
+3098(the)X
+0 f F
+3224(METAFONT)X
+1 f F
+3593(program)X
+3892(translates)X
+4222(the)X
+2520 2688(font)N
+2671(de\256nitions)X
+3030(into)X
+3176(bitmaps)X
+3451(prior)X
+3629(to)X
+3713(sending)X
+3985(the)X
+4106(font)X
+4258(to)X
+2520 2784(the)N
+2657(printer)X
+2910(while)X
+3126(a)X
+3200(P)X
+8 s 8 xH F
+3244(OST)X
+10 s 10 xH F
+3365(S)X
+8 s 8 xH F
+3409(CRIPT)X
+10 s 10 xH F
+3629(printer)X
+3881(translates)X
+4222(the)X
+2520 2880(outlines)N
+2806(into)X
+2963(bitmaps)X
+3249(at)X
+3340(the)X
+3471(time)X
+3646(of)X
+3746(printing.)X
+4052(Interest-)X
+2520 2976(ingly,)N
+2724(both)X
+2886(the)X
+0 f F
+3004(METAFONT)X
+1 f F
+3365(language)X
+3675(and)X
+3811(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 3072(language)N
+2845(use)X
+2987(Be)X
+3045(\302zier)X
+3233(curves)X
+3478(for)X
+3607(describing)X
+3976(the)X
+4110(curves)X
+2520 3168(followed)N
+2863(by)X
+3001(the)X
+3157(pen)X
+3331(or)X
+3456(the)X
+3612(outlines.)X
+3943(As)X
+4089(usually)X
+2520 3264(con\256gured)N
+2886(these)X
+3074(days,)X
+3264(T)X
+3305 3280(E)N
+3346 3264(X)N
+3428(uses)X
+3590(bitmapped)X
+3952(fonts)X
+4136(in)X
+4222(the)X
+2520 3360(Computer)N
+2865(Modern)X
+3144(family)X
+3378(generated)X
+3715(by)X
+0 f F
+3819(METAFONT)X
+1 f F
+4160(,)X
+4204(and)X
+9 f F
+2520 3456(ditroff)N
+1 f F
+2775(uses)X
+2969(P)X
+8 s 8 xH F
+3013(OST)X
+10 s 10 xH F
+3134(S)X
+8 s 8 xH F
+3178(CRIPT)X
+10 s 10 xH F
+3416(outline)X
+3695(fonts)X
+3912(supplied)X
+4240(by)X
+2520 3552(Adobe.)N
+2679 3648(The)N
+2859(subsequent)X
+3270(subsections)X
+3695(delve)X
+3925(deeper)X
+4196(into)X
+2520 3744(these)N
+2712(issues)X
+2929(in)X
+3017(order)X
+3213(to)X
+3301(be)X
+3403(able)X
+3563(to)X
+3651(state)X
+3824(the)X
+3948(goal)X
+4112(of)X
+4205(this)X
+2520 3840(paper)N
+2719(in)X
+2801(the)X
+2919(next)X
+3077(section.)X
+3 f F
+2520 4032(2.1)N
+2680(Fonts,)X
+2947(design)X
+3220(sizes,)X
+3452(and)X
+3637(magni\256cations.)X
+1 f F
+4231(As)X
+2520 4128(mentioned,)N
+2904(fonts)X
+3090(are)X
+3215(the)X
+3339(raw)X
+3486(material)X
+3774(of)X
+3866(typesetting.)X
+4262(A)X
+2520 4224(font)N
+2676(is)X
+2756(a)X
+2819(set)X
+2935(of)X
+3029(printable)X
+3341(patterns,)X
+3642(one)X
+3785(for)X
+3906(each)X
+4082(charac-)X
+2520 4320(ter,)N
+2650(that)X
+2795(causes)X
+3030(printing)X
+3308(of)X
+3400(that)X
+3545(character)X
+3866(in)X
+3952(a)X
+4012(particular)X
+2520 4416(recognizable)N
+2970(style)X
+3160(on)X
+3279(the)X
+3416(page.)X
+3628(As)X
+3757(mentioned,)X
+4155(these)X
+2520 4512(patterns)N
+2821(can)X
+2980(be)X
+3102(represented)X
+3519(by)X
+3645(bitmaps)X
+3944(or)X
+4057(drawing)X
+2520 4608(instructions.)N
+2679 4704(Characters)N
+3057(come)X
+3265(in)X
+3361(various)X
+3632(sizes.)X
+3843(There)X
+4066(are)X
+4200(two)X
+2520 4800(independent)N
+2948(notions)X
+3219(of)X
+3322(sizing)X
+3549(for)X
+3679(fonts,)X
+3894(point)X
+4093(size)X
+4253(or)X
+2520 4896(design)N
+2764(size)X
+2924(and)X
+3075(magni\256cation.)X
+3571(The)X
+2 f F
+3732(design)X
+3977(size)X
+1 f F
+4133(is)X
+4222(the)X
+2520 4992(size)N
+2674(at)X
+2761(which)X
+2986(the)X
+3113(character)X
+3438(is)X
+3520(designed)X
+3834(to)X
+3925(be)X
+4029(used)X
+4204(and)X
+2520 5088(is,)N
+2615(in)X
+2699(well-designed)X
+3171(text,)X
+3333(the)X
+3453(size)X
+3600(in)X
+3684(which)X
+3903(the)X
+4024(character)X
+2520 5184(appears)N
+2803(in)X
+2902(\256nal,)X
+3101(printed)X
+3364(copy.)X
+3576(Design)X
+3839(size)X
+4000(is)X
+4089(usually)X
+2520 5280(expressed)N
+2870(in)X
+2965(units)X
+3153(of)X
+3254(points,)X
+3503(which)X
+3733(are)X
+3866(each)X
+4048(approxi-)X
+2520 5376(mately)N
+2778(1/72)X
+2960(of)X
+3067(an)X
+3183(inch.)X
+3380(Most)X
+3583(normal)X
+3849(text)X
+4008(in)X
+4109(books,)X
+2520 5472(newspapers,)N
+2940(and)X
+3081(magazines)X
+3446(is)X
+3525(printed)X
+3778(in)X
+3866(10)X
+3972(point)X
+4162(type.)X
+2520 5568(Headlines)N
+2864(are)X
+2986(larger,)X
+3217(perhaps)X
+3490(as)X
+3580(large)X
+3764(as)X
+3854(30)X
+3957(points.)X
+4195(The)X
+2 f F
+2520 5664(magni\256cation)N
+1 f F
+3008(of)X
+3123(a)X
+3207(font)X
+3384(is)X
+3485(the)X
+3631(inverse)X
+3911(of)X
+4026(the)X
+4173(ratio)X
+2465 6084(1)N
+
+%%Page: 2 3
+2 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(between)N
+868(the)X
+990(design)X
+1223(size)X
+1371(of)X
+1461(the)X
+1582(character)X
+1901(and)X
+2040(the)X
+2161(size)X
+2309(of)X
+576 768(the)N
+701(character)X
+1024(as)X
+1119(it)X
+1191(emerges)X
+1487(on)X
+1595(the)X
+1721(printer,)X
+1983(the)X
+2109(assump-)X
+576 864(tion)N
+723(being)X
+923(that)X
+1065(the)X
+1185(\256nal)X
+1349(copy)X
+1527(is)X
+1602(a)X
+1660(photo)X
+1864(reduction)X
+2189(of)X
+2278(the)X
+576 960(printed)N
+845(copy.)X
+1063(Thus,)X
+1285(if)X
+1376(photo)X
+1600(reduction)X
+1945(halves)X
+2193(linear)X
+576 1056(dimensions,)N
+988(one)X
+1132(prints)X
+1342(with)X
+1512(magni\256cation)X
+1980(2.)X
+2088(If)X
+2170(every-)X
+576 1152(thing)N
+788(is)X
+889(done)X
+1093(right,)X
+1312(then)X
+1498(after)X
+1694(reduction,)X
+2065(the)X
+2211(letter)X
+576 1248(appears)N
+842(at)X
+920(its)X
+1015(design)X
+1244(size.)X
+735 1344(A)N
+819(10)X
+925(point)X
+1115(design)X
+1350(sized)X
+1541(font)X
+1696(printed)X
+1949(at)X
+2033(magni\256ca-)X
+576 1440(tion)N
+725(2)X
+790(is)X
+868(similar)X
+1115(to)X
+1202(but)X
+1329(not)X
+1456(quite)X
+1641(the)X
+1764(same)X
+1954(as)X
+2046(a)X
+2107(20)X
+2212(point)X
+576 1536(version)N
+839(of)X
+933(the)X
+1058(same)X
+1250(font.)X
+1446(For)X
+1584(example,)X
+1904(the)X
+2030(serifs)X
+2232(on)X
+2340(a)X
+576 1632(large)N
+763(point)X
+953(size)X
+1104(are)X
+1229(smaller)X
+1490(than)X
+1653(they)X
+1816(would)X
+2041(be)X
+2142(if)X
+2216(strict)X
+576 1728(linear)N
+783(magni\256cation)X
+1247(were)X
+1428(used.)X
+1619(Other)X
+1826(proportions,)X
+2240(e.g.,)X
+576 1824(of)N
+679(x-height)X
+982(to)X
+1080(cap-height)X
+1455(and)X
+1606(of)X
+1708(width)X
+1925(to)X
+2022(height,)X
+2277(are)X
+576 1920(also)N
+751(di)X
+813 MX
+(ff)138 606 oc
+861(erent.)X
+1088(While)X
+1330(many)X
+1554(purists,)X
+1833(Knuth)X
+2080(included,)X
+576 2016(insist)N
+773(on)X
+881(using)X
+1082(a)X
+1146(di)X
+1208 MX
+(ff)138 606 oc
+1256(erent)X
+1445(pattern)X
+1696(for)X
+1818(each)X
+1994(design)X
+2231(size,)X
+576 2112(many)N
+787(people)X
+1034(accept)X
+1273(magni\256cation)X
+1746(as)X
+1847(yielding)X
+2143(accept-)X
+576 2208(able)N
+777(fonts)X
+1004(at)X
+1129(other)X
+1361(point)X
+1592(sizes.)X
+1835(If)X
+1955(the)X
+2119(unit)X
+2309(of)X
+576 2304(magni\256cation)N
+1047(is)X
+1132(not)X
+1266(too)X
+1400(big)X
+1534(the)X
+1664(results)X
+1905(are)X
+2036(acceptable)X
+576 2400(even)N
+748(to)X
+830(many)X
+1028(purists.)X
+3 f F
+576 2592(2.2)N
+736(Problems)X
+1086(with)X
+1262(bitmapped)X
+1655(fonts.)X
+1 f F
+1889(A)X
+1972(bitmap)X
+2220(for)X
+2340(a)X
+576 2688(character)N
+898(is)X
+977(a)X
+1039(rectangular)X
+1426(array)X
+1617(of)X
+1709(bits)X
+1849(covering)X
+2155(the)X
+2278(so-)X
+576 2784(called)N
+802(bounding)X
+1138(box)X
+1292(or)X
+1393(frame)X
+1616(that)X
+1771(exactly)X
+2038(contains)X
+2340(a)X
+576 2880(letter.)N
+789(Figure)X
+1026(1)X
+1094(shows)X
+1322(a)X
+1386(low)X
+1534(resolution)X
+1881(bit)X
+1992(map)X
+2157(for)X
+2278(the)X
+576 2976(letter)N
+762(\252N\272)X
+913(in)X
+996(a)X
+1053(sans)X
+1212(serif)X
+1377(font.)X
+1548(The)X
+1695(inked)X
+1895(squares)X
+2158(or)X
+2247(pix-)X
+576 3072(els)N
+694(are)X
+822(denoted)X
+1105(by)X
+1214(\2521\272)X
+1355(bits)X
+1499(and)X
+1644(the)X
+1771(uninked)X
+2058(pixels)X
+2277(are)X
+576 3168(denoted)N
+850(by)X
+950(\2520\272)X
+1082(bits.)X
+1044 3264 MXY
+864
+1488
+0.00
+-12.00
+108.00
+174.00
+startFig
+%!
+%%%Title: N
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:03 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 -12 108 174
+%%%Was: 0 0 108 162
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-72 72 translate
+0.000000 162.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Polyline
+newpath 179 79 moveto 199 79 lineto 199 259 lineto 179 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 159 219 moveto 179 219 lineto 179 239 lineto 159 239 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 139 179 moveto 159 179 lineto 159 219 lineto 139 219 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 119 139 moveto 139 139 lineto 139 179 lineto 119 179 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 99 99 moveto 119 99 lineto 119 139 lineto 99 139 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 79 79 moveto 99 79 lineto 99 259 lineto 79 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
+endFig
+1341 4896(Figure)N
+1570(1)X
+576 5056(The)N
+738(low)X
+895(resolution)X
+1252(example)X
+1561(of)X
+1666(Figure)X
+1913(1)X
+1991(illustrates)X
+2340(a)X
+576 5152(major)N
+790(problem)X
+1083(with)X
+1251(bitmapped)X
+1615(fonts.)X
+1821(Curved)X
+2083(lines)X
+2260(and)X
+576 5248(straight)N
+858(lines)X
+1051(that)X
+1213(are)X
+1354(neither)X
+1619(vertical)X
+1902(nor)X
+2051(horizontal)X
+576 5344(cannot)N
+820(be)X
+926(represented)X
+1327(exactly)X
+1588(by)X
+1697(a)X
+1762(rectangular)X
+2153(pattern)X
+576 5440(of)N
+669(pixels.)X
+906(One)X
+1066(is)X
+1145(forced)X
+1377(to)X
+1466(approximate)X
+1894(them)X
+2081(with)X
+2250(rec-)X
+576 5536(tangular)N
+872(steps.)X
+1085(At)X
+1198(high)X
+1373(resolution,)X
+1745(e.g.)X
+1893(above)X
+2117(1000)X
+2309(or)X
+576 5632(so,)N
+707(the)X
+845(human)X
+1103(eye)X
+1255(cannot)X
+1510(see)X
+1654(the)X
+1793(steps,)X
+2014(but)X
+2157(at)X
+2256(low)X
+2520 672(resolution)N
+2877(the)X
+3012(steps)X
+3209(are)X
+3344(quite)X
+3540(apparent.)X
+3893(Visible)X
+4160(steps)X
+2520 768(are)N
+2639(called)X
+2851(\252jaggies\272)X
+3170(after)X
+3338(the)X
+3456(jagged)X
+3690(edges.)X
+2679 864(Bitmaps)N
+2977(for)X
+3103(a)X
+3171(font)X
+3332(must)X
+3519(be)X
+3627(built)X
+3805(for)X
+3931(each)X
+4111(design)X
+2520 960(size,)N
+2696(magni\256cation,)X
+3187(and)X
+3334(resolution.)X
+3705(If)X
+3789(the)X
+3917(resolution)X
+4267(is)X
+2520 1056(\256xed,)N
+2724(as)X
+2816(is)X
+2894(the)X
+3017(case)X
+3181(on)X
+3286(most)X
+3466(printers,)X
+3756(a)X
+3817(bitmap)X
+4064(must)X
+4244(be)X
+2520 1152(built)N
+2687(for)X
+2802(each)X
+2971(design)X
+3201(size)X
+3346(and)X
+3482(magni\256cation.)X
+3962(An)X
+4080(attempt)X
+2520 1248(to)N
+2633(use)X
+2791(a)X
+2878(given)X
+3107(bitmap)X
+3380(at)X
+3489(a)X
+3576(larger)X
+3815(design)X
+4076(size)X
+4253(or)X
+2520 1344(magni\256cation)N
+2999(by)X
+3118(just)X
+3272(enlarging)X
+3614(the)X
+3751(area)X
+3925(of)X
+4031(each)X
+4218(dot)X
+2520 1440(yields)N
+2731(a)X
+2787(bad)X
+2923(case)X
+3082(of)X
+3169(jaggies.)X
+3 f F
+2520 1632(2.3)N
+0 f F
+2680(METAFONT)X
+3 f F
+3064(and)X
+3235(its)X
+3359(environment.)X
+0 f F
+3879(METAFONT)X
+1 f F
+4220(,)X
+4284(a)X
+2520 1728(language)N
+2834(for)X
+2952(the)X
+3074(speci\256cation)X
+3503(of)X
+3593(fonts)X
+3776(or)X
+3866(typefaces,)X
+4213(has)X
+2520 1824(been)N
+2719(used)X
+2913(to)X
+3022(provide)X
+3314(fonts)X
+3521(for)X
+3662(the)X
+3808(T)X
+3849 1840(E)N
+3890 1824(X)N
+3996(family)X
+4253(of)X
+2520 1920(typesetting)N
+2911(systems.)X
+3224(A)X
+0 f F
+3322(METAFONT)X
+1 f F
+3703(user)X
+3876(writes)X
+4111(a)X
+4186(pro-)X
+2520 2016(gram)N
+2716(for)X
+2841(each)X
+3020(letter)X
+3216(or)X
+3314(symbol)X
+3580(of)X
+3678(an)X
+3785(alphabet.)X
+4128(These)X
+2520 2112(programs)N
+2862(are)X
+2999(di)X
+3061 MX
+(ff)138 606 oc
+3109(erent)X
+3308(from)X
+3502(the)X
+3638(usual)X
+3845(computer)X
+4186(pro-)X
+2520 2208(grams,)N
+2771(because)X
+3061(they)X
+3234(are)X
+3369(essentially)X
+3743(declarative)X
+4132(rather)X
+2520 2304(than)N
+2726(imperative,)X
+3156(using)X
+3396(an)X
+3539(algebraic)X
+3901(language)X
+4258(to)X
+2520 2400(describe)N
+2822(the)X
+2955(center)X
+3187(stroke)X
+3418(or)X
+3520(edges)X
+3738(of)X
+3840(the)X
+3973(characters.)X
+2520 2496(The)N
+2666(description)X
+3043(of)X
+3131(a)X
+3188(letter)X
+3373(in)X
+0 f F
+3455(METAFONT)X
+1 f F
+3816(is)X
+3889(a)X
+3945(set)X
+4054(of)X
+4141(equa-)X
+2520 2592(tions)N
+2727(describing)X
+3113(the)X
+3264(strokes.)X
+3564(When)X
+3809(combined)X
+4178(with)X
+2520 2688(parameters)N
+2900(describing)X
+3261(the)X
+3385(pen)X
+3527(shape)X
+3736(and)X
+3878(size,)X
+4049(one)X
+4191(gets)X
+2520 2784(a)N
+2588(full)X
+2731(description)X
+3119(of)X
+3219(a)X
+3288(letter.)X
+3506(Sizes)X
+3708(and)X
+3857(shapes)X
+4104(of)X
+4204(pen)X
+2520 2880(nibs)N
+2678(can)X
+2815(be)X
+2916(varied)X
+3142(in)X
+0 f F
+3229(METAFONT)X
+1 f F
+3595(and)X
+3735(the)X
+3857(characters)X
+4208(can)X
+2520 2976(be)N
+2635(built)X
+2820(up)X
+2939(in)X
+3040(such)X
+3226(a)X
+3301(way)X
+3474(that)X
+3634(the)X
+3772(outlines)X
+4065(of)X
+4172(each)X
+2520 3072(stroke)N
+2748(are)X
+2879(precisely)X
+3201(controlled.)X
+3578(Herein)X
+3829(lies)X
+3972(the)X
+4101(advan-)X
+2520 3168(tage)N
+2680(of)X
+0 f F
+2774(METAFONT)X
+1 f F
+3115(;)X
+3164(a)X
+3227(font)X
+3383(is)X
+3463(easily)X
+3677(speci\256ed)X
+3989(and)X
+4132(varia-)X
+2520 3264(tions)N
+2695(are)X
+2814(obtained)X
+3110(by)X
+3210(varying)X
+3475(parameters.)X
+2679 3360(Currently,)N
+3057(the)X
+3206(program)X
+3529(that)X
+3700(converts)X
+4024(a)X
+4112(set)X
+4253(of)X
+0 f F
+2520 3456(METAFONT)N
+1 f F
+2914(font)X
+3096(descriptions)X
+3536(into)X
+3713(a)X
+3801(bitmapped)X
+4191(font)X
+2520 3552(translates)N
+2858(the)X
+2991(description)X
+3382(of)X
+3484(a)X
+3555(letter)X
+3755(combined)X
+4106(with)X
+4284(a)X
+2520 3648(point)N
+2714(size)X
+2869(and)X
+3015(a)X
+3080(magni\256cation)X
+3549(into)X
+3702(a)X
+3767(bitmap.)X
+4038(This)X
+4209(bit-)X
+2520 3744(map)N
+2678(can)X
+2810(be)X
+2906(sent)X
+3055(to)X
+3137(the)X
+3255(printer)X
+3489(to)X
+3571(get)X
+3689(a)X
+3745(letter)X
+3930(on)X
+4030(the)X
+4148(page.)X
+2520 3840(Herein)N
+2780(lies)X
+2932(a)X
+3009(disadvantage)X
+3469(of)X
+0 f F
+3577(METAFONT)X
+1 f F
+3918(;)X
+3981(a)X
+4058(bit)X
+4182(map)X
+2520 3936(must)N
+2698(be)X
+2797(kept)X
+2958(for)X
+3075(each)X
+3246(point)X
+3433(size)X
+3581(and)X
+3720(magni\256cation,)X
+4204(and)X
+2520 4032(this)N
+2655(can)X
+2787(require)X
+3035(a)X
+3091(lot)X
+3195(of)X
+3282(space.)X
+3 f F
+2520 4224(2.4)N
+2680(The)X
+2869(P)X
+8 s 8 xH F
+2918(OST)X
+10 s 10 xH F
+3047(S)X
+8 s 8 xH F
+3091(CRIPT)X
+10 s 10 xH F
+3346(language.)X
+1 f F
+3748(The)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4320(language)N
+2834(is)X
+2911(an)X
+3011(interpretive)X
+3405(programming)X
+3865(language)X
+4178(with)X
+2520 4416(graphics)N
+2851(capabilities.)X
+3296(P)X
+8 s 8 xH F
+3340(OST)X
+10 s 10 xH F
+3461(S)X
+8 s 8 xH F
+3505(CRIPT)X
+10 s 10 xH F
+3687('s)X
+3805(extensive)X
+4168(page)X
+2520 4512(description)N
+2914(capabilities)X
+3317(are)X
+3454(embedded)X
+3822(into)X
+3983(a)X
+4056(general-)X
+2520 4608(purpose)N
+2854(programming)X
+3370(language)X
+3741(framework.)X
+4195(The)X
+2520 4704(language)N
+2834(includes)X
+3125(a)X
+3185(conventional)X
+3622(set)X
+3734(of)X
+3824(data)X
+3981(types)X
+4173(such)X
+2520 4800(as)N
+2611(numbers,)X
+2931(arrays,)X
+3173(and)X
+3314(strings,)X
+3572(control)X
+3824(primitives)X
+4173(such)X
+2520 4896(as)N
+2650(conditionals,)X
+3124(loops)X
+3360(and)X
+3538(procedures,)X
+3973(and)X
+4151(some)X
+2520 4992(unusual)N
+2809(features)X
+3104(such)X
+3291(as)X
+3398(dictionaries.)X
+3832(In)X
+3939(most)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 5088(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2774(fonts,)X
+2982(each)X
+3158(letter)X
+3351(is)X
+3432(described)X
+3767(by)X
+3874(an)X
+3977(imperative)X
+2520 5184(program)N
+2825(tracing)X
+3081(the)X
+3213(outline)X
+3469(of)X
+3570(the)X
+3702(letter.)X
+3921(This)X
+4097(tracing)X
+2520 5280(may)N
+2700(include)X
+2978(curves)X
+3230(given)X
+3449(as)X
+3557(Be)X
+3615(\302zier)X
+3809(curves,)X
+4080(straight)X
+2520 5376(lines,)N
+2731(arcs,)X
+2921(etc.)X
+3075(A)X
+3174(P)X
+8 s 8 xH F
+3218(OST)X
+10 s 10 xH F
+3339(S)X
+8 s 8 xH F
+3383(CRIPT)X
+10 s 10 xH F
+3606(printer)X
+3861(interprets)X
+4205(this)X
+2520 5472(outline)N
+2777(program)X
+3084(to)X
+3181(draw)X
+3377(and)X
+3528(\256ll)X
+3650(in)X
+3746(the)X
+3878(letters)X
+4108(on)X
+4222(the)X
+2520 5568(page.)N
+2731(Some)X
+2953(consider)X
+3265(the)X
+3403(imperative)X
+3786(nature)X
+4027(of)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 5664(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2780(to)X
+2875(be)X
+2984(a)X
+3053(disadvantage)X
+3505(in)X
+3600(comparison)X
+4007(to)X
+0 f F
+4102(META-)X
+1 f F
+2465 6084(2)N
+
+%%Page: 3 4
+3 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+576 672(FONT)N
+1 f F
+741('s)X
+853(declarative)X
+1260(nature.)X
+1535(The)X
+1714(main)X
+1928(advantage)X
+2309(of)X
+576 768(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+996(relative)X
+1266(to)X
+0 f F
+1357(METAFONT)X
+1 f F
+1727(is)X
+1809(that)X
+1958(one)X
+2103(needs)X
+2314(to)X
+576 864(keep)N
+756(only)X
+926(the)X
+1052(outline.)X
+1322(If,)X
+1424(as)X
+1519(in)X
+1609(the)X
+1735(usual)X
+1932(case,)X
+2120(the)X
+2247(out-)X
+576 960(line)N
+747(is)X
+851(speci\256ed)X
+1186(in)X
+1298(terms)X
+1526(of)X
+1643(a)X
+1729(\256xed)X
+1939(path)X
+2127(through)X
+576 1056(Euclidean)N
+929(two-space,)X
+1307(this)X
+1455(outline)X
+1710(may)X
+1881(be)X
+1990(scaled)X
+2224(arbi-)X
+576 1152(trarily)N
+803(to)X
+896(yield)X
+1087(any)X
+1234(magni\256cation.)X
+1725(The)X
+1880(scaling)X
+2137(is)X
+2220(done)X
+576 1248(by)N
+687(the)X
+816(P)X
+8 s 8 xH F
+860(OST)X
+10 s 10 xH F
+981(S)X
+8 s 8 xH F
+1025(CRIPT)X
+10 s 10 xH F
+1238(interpreter)X
+1604(at)X
+1693(the)X
+1822(printer.)X
+2087(Thus)X
+2278(the)X
+576 1344(di)N
+638 MX
+(ff)138 606 oc
+686(erent)X
+883(magni\256cations)X
+1390(do)X
+1505(not)X
+1642(require)X
+1905(any)X
+2056(additional)X
+576 1440(storage)N
+833(space.)X
+1057(Actually,)X
+1378(the)X
+1502(outlines)X
+1781(are)X
+1906(kept)X
+2070(as)X
+2163(if)X
+2238(they)X
+576 1536(were)N
+754(for)X
+869(the)X
+988(Adobe-standard)X
+1522(1000)X
+1703(dots)X
+1857(per)X
+1980(emm,)X
+2180(which)X
+576 1632(at)N
+675(a)X
+752(design)X
+1002(size)X
+1168(of)X
+1276(10)X
+1398(points)X
+1635(amounts)X
+1948(to)X
+2052(7200)X
+2254(dpi.)X
+576 1728(Because)N
+867(a)X
+926(typical)X
+1166(phototypesetter)X
+1682(has)X
+1811(a)X
+1869(maximum)X
+2215(reso-)X
+576 1824(lution)N
+799(of)X
+903(about)X
+1118(2500)X
+1315(dpi,)X
+1474(the)X
+1609(outlines)X
+1899(are)X
+2035(said)X
+2201(to)X
+2300(be)X
+576 1920(arbitrarily)N
+939(scaleable.)X
+1296(If)X
+1392(the)X
+1532(outlines)X
+1827(are)X
+1968(kept,)X
+2168(as)X
+2277(are)X
+576 2016(many)N
+0 f F
+794(METAFONT)X
+1 f F
+1175(de\256nitions,)X
+1573(as)X
+1681(paths)X
+1891(through)X
+2181(points)X
+576 2112(calculated)N
+925(by)X
+1028(the)X
+1149(outline)X
+1394(program,)X
+1709(then)X
+1869(it)X
+1935(is)X
+2010(possible)X
+2294(to,)X
+576 2208(say,)N
+744(make)X
+959(serifs)X
+1174(grow)X
+1380(more)X
+1586(slowly)X
+1840(than)X
+2020(linearly.)X
+2327(It)X
+576 2304(would)N
+811(then)X
+984(be)X
+1094(possible)X
+1390(to)X
+1486(have)X
+1672(one)X
+1822(P)X
+8 s 8 xH F
+1866(OST)X
+10 s 10 xH F
+1987(S)X
+8 s 8 xH F
+2031(CRIPT)X
+10 s 10 xH F
+2247(font)X
+576 2400(scaleable)N
+905(to)X
+1001(all)X
+1115(design)X
+1358(sizes.)X
+1588(Generally,)X
+1959(outline)X
+2216(fonts)X
+576 2496(are)N
+705(not)X
+837(written)X
+1094(this)X
+1239(way,)X
+1423(so)X
+1524(that)X
+1673(strictly)X
+1924(speaking)X
+2238(they)X
+576 2592(are)N
+695(scaleable)X
+1010(only)X
+1172(to)X
+1254(all)X
+1354(magni\256cations.)X
+735 2688(In)N
+823(addition,)X
+1126(the)X
+1246(P)X
+8 s 8 xH F
+1290(OST)X
+10 s 10 xH F
+1411(S)X
+8 s 8 xH F
+1455(CRIPT)X
+10 s 10 xH F
+1659(language)X
+1971(has)X
+2100(a)X
+2158(way)X
+2314(to)X
+576 2784(work)N
+786(with)X
+973(bitmapped)X
+1356(fonts.)X
+1601(While)X
+1842(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 2880(printer)N
+815(can)X
+952(scale)X
+1138(them)X
+1323(before)X
+1554(printing,)X
+1853(the)X
+1977(end)X
+2119(result)X
+2323(is)X
+576 2976(that)N
+726(each)X
+904(of)X
+1001(the)X
+1129(\256xed)X
+1319(number)X
+1594(of)X
+1691(dots)X
+1854(in)X
+1945(the)X
+2072(bitmap)X
+2323(is)X
+576 3072(made)N
+772(larger)X
+983(or)X
+1073(smaller.)X
+1352(Since)X
+1553(the)X
+1674(human)X
+1915(will)X
+2062(see)X
+2188(larger)X
+576 3168(dots)N
+752(as)X
+862(jagged)X
+1119(lines,)X
+1332(such)X
+1521(fonts)X
+1723(are)X
+1864(not)X
+2008(really)X
+2233(con-)X
+576 3264(sidered)N
+828(scaleable.)X
+3 f F
+576 3456(2.5)N
+736(Be)X
+794(\302zier)X
+986(curves.)X
+1 f F
+1280(Both)X
+0 f F
+1466(METAFONT)X
+1 f F
+1838(and)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 3552(use)N
+725(Be)X
+783(\302zier)X
+978(cubics)X
+1225(to)X
+1329(specify)X
+1603(curves.)X
+1874(For)X
+2026(the)X
+2165(Be)X
+2223(\302zier)X
+576 3648(form,)N
+773(four)X
+928(points)X
+1144(are)X
+1264(used,)X
+1452(the)X
+1571(start)X
+1730(point,)X
+1935(the)X
+2054(end)X
+2192(point,)X
+576 3744(and)N
+716(two)X
+860(control)X
+1111(points,)X
+1350(as)X
+1441(shown)X
+1674(in)X
+1759(the)X
+1880(top)X
+2005(half)X
+2153(of)X
+2243(Fig-)X
+576 3840(ure)N
+708(2.)X
+817(The)X
+971(tangent)X
+1236(vectors)X
+1497(of)X
+1593(the)X
+1720(endpoints)X
+2060(are)X
+2188(deter-)X
+576 3936(mined)N
+818(from)X
+1016(the)X
+1156(line)X
+1318(segments)X
+2 f F
+1658(P)X
+7 s 7 xH 1 f F
+1707 3952(1)N
+10 s 10 xH 2 f F
+1741 3936(P)N
+7 s 7 xH 1 f F
+1790 3952(2)N
+10 s 10 xH F
+1866 3936(and)N
+2 f F
+2024(P)X
+7 s 7 xH 1 f F
+2073 3952(3)N
+10 s 10 xH 2 f F
+2107 3936(P)N
+7 s 7 xH 1 f F
+2156 3952(4)N
+10 s 10 xH F
+2190 3936(.)N
+2251(The)X
+576 4032(mathematical)N
+1053(introduction)X
+1489(of)X
+1601(the)X
+1744(Be)X
+1802(\302zier)X
+2000(form)X
+2202(when)X
+576 4128(given)N
+774(four)X
+928(points)X
+2 f F
+1143(P)X
+7 s 7 xH 1 f F
+1192 4144(1)N
+10 s 10 xH F
+1226 4128(,)N
+2 f F
+1266(P)X
+7 s 7 xH 1 f F
+1315 4144(2)N
+10 s 10 xH F
+1349 4128(,)N
+2 f F
+1389(P)X
+7 s 7 xH 1 f F
+1438 4144(3)N
+10 s 10 xH F
+1472 4128(,)N
+1512(and)X
+2 f F
+1648(P)X
+7 s 7 xH 1 f F
+1697 4144(4)N
+10 s 10 xH F
+1751 4128(is)N
+2 f F
+648 4320(z)N
+1 f F
+692(\()X
+2 f F
+719(t)X
+1 f F
+747(\))X
+47 f F
+794(=)X
+1 f F
+858(\(1)X
+47 f F
+925(-)X
+2 f F
+969(t)X
+1 f F
+997(\))X
+7 s 7 xH F
+1024 4288(3)N
+10 s 10 xH 2 f F
+1058 4320(P)N
+7 s 7 xH 1 f F
+1107 4336(1)N
+10 s 10 xH 47 f F
+1161 4320(+)N
+1 f F
+1225(3)X
+2 f F
+(t)S
+1 f F
+1300(\()X
+2 f F
+1327(t)X
+47 f F
+1362(-)X
+1 f F
+1406(1\))X
+7 s 7 xH F
+1473 4288(2)N
+10 s 10 xH 2 f F
+1507 4320(P)N
+7 s 7 xH 1 f F
+1556 4336(2)N
+10 s 10 xH 47 f F
+1610 4320(+)N
+1 f F
+1674(3)X
+2 f F
+(t)S
+7 s 7 xH 1 f F
+1745 4288(2)N
+10 s 10 xH F
+1779 4320(\(1)N
+47 f F
+1846(-)X
+2 f F
+1890(t)X
+1 f F
+1918(\))X
+2 f F
+1945(P)X
+7 s 7 xH 1 f F
+1994 4336(3)N
+10 s 10 xH 47 f F
+2048 4320(+)N
+2 f F
+2112(t)X
+7 s 7 xH 1 f F
+2143 4288(3)N
+10 s 10 xH 2 f F
+2177 4320(P)N
+7 s 7 xH 1 f F
+2226 4336(4)N
+10 s 10 xH F
+2260 4320(,)N
+576 4512(for)N
+690(0)X
+47 f F
+750(\243)X
+2 f F
+814(t)X
+47 f F
+862(\243)X
+1 f F
+926(1.)X
+735 4608(Two)N
+925(characteristics)X
+1428(of)X
+1538(the)X
+1679(Be)X
+1737(\302zier)X
+1933(form)X
+2132(tend)X
+2314(to)X
+576 4704(make)N
+776(it)X
+846(widely)X
+1090(used)X
+1263(in)X
+1351(graphics.)X
+1668(First,)X
+1859(by)X
+1964(choosing)X
+2278(the)X
+576 4800(control)N
+850(points)X
+1092(one)X
+1255(can)X
+1414(easily)X
+1648(mold)X
+1859(the)X
+2004(curve)X
+2230(to)X
+2340(a)X
+576 4896(desired)N
+836(shape.)X
+1067(Second,)X
+1351(the)X
+1476(four)X
+1637(control)X
+1891(points)X
+2113(taken)X
+2314(in)X
+576 4992(another)N
+839(order)X
+1031(de\256ne)X
+1250(a)X
+1309(convex)X
+1564(polygon,)X
+2 f F
+1869(P)X
+7 s 7 xH 1 f F
+1918 5008(1)N
+10 s 10 xH 2 f F
+1975 4992(P)N
+7 s 7 xH 1 f F
+2024 5008(2)N
+10 s 10 xH 2 f F
+2081 4992(P)N
+7 s 7 xH 1 f F
+2130 5008(4)N
+10 s 10 xH 2 f F
+2187 4992(P)N
+7 s 7 xH 1 f F
+2236 5008(3)N
+10 s 10 xH 2 f F
+2293 4992(P)N
+7 s 7 xH 1 f F
+2342 5008(1)N
+10 s 10 xH F
+576 5088(in)N
+668(this)X
+813(case,)X
+1002(the)X
+2 f F
+1130(convex)X
+1384(hull)X
+1 f F
+1504(,)X
+1553(which)X
+1778(bounds)X
+2038(the)X
+2165(Be)X
+2223(\302zier)X
+576 5184(curve.)N
+811(The)X
+973(convex)X
+1242(hull)X
+1403(is)X
+1493(useful)X
+1726(in)X
+1825(clipping)X
+2124(a)X
+2197(curve)X
+576 5280(against)N
+823(a)X
+879(window.)X
+735 5376(When)N
+962(a)X
+0 f F
+1033(METAFONT)X
+1 f F
+1410(user)X
+1580(speci\256es)X
+1892(a)X
+1964(path,)X
+0 f F
+2158(META-)X
+576 5472(FONT)N
+1 f F
+772(creates)X
+1027(a)X
+1094(list)X
+1222(of)X
+1320(knots)X
+1524(and)X
+1671(control)X
+1929(points)X
+2154(for)X
+2278(the)X
+576 5568(associated)N
+951(cubic)X
+1170(spline)X
+1406(curves.)X
+1701(If)X
+1800(the)X
+1943(user)X
+2122(has)X
+2274(not)X
+576 5664(speci\256ed)N
+890(the)X
+1017(control)X
+1273(points)X
+1497(explicitly,)X
+0 f F
+1847(METAFONT)X
+1 f F
+2216(itself)X
+2520 672(\256nds)N
+2696(some)X
+2886(for)X
+3001(the)X
+3120(splines)X
+3363(of)X
+3451(a)X
+3508(curve,)X
+3729(while)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 768(requires)N
+2799(all)X
+2899(the)X
+3017(four)X
+3171(points)X
+3386(to)X
+3468(be)X
+3564(explicitly)X
+3886(given.)X
+2600 864 MXY
+1640
+3352
+0.00
+0.00
+205.00
+419.00
+startFig
+%!
+%%%Title: bezier
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:07 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 0 205 419
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ /DrawSplineSection { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /xa x1 x2 x1 sub 0.666667 mul add def /ya y1 y2 y1 sub 0.666667 mul add def /xb x3 x2 x3 sub 0.666667 mul add def /yb y3 y2 y3 sub 0.666667 mul add def x1 y1 lineto xa ya xb yb x3 y3 curveto } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-77 80 translate
+0.000000 419.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Ellipse
+newpath 299 434 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 259 354 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 199 394 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 179 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 159 534 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 99 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 119 387 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+ [1 3.200000] 0 setdash
+%% Polyline
+newpath 99 199 moveto 179 119 lineto 239 299 lineto 299 199 lineto stroke
+stroke
+ [] 0 setdash
+%% Open spline
+newpath 99.000 474.000 moveto 109.000 431.500 lineto
+ 109.000 431.500 119.000 389.000 139.000 461.500 DrawSplineSection
+ 139.000 461.500 159.000 534.000 169.000 504.000 DrawSplineSection
+ 169.000 504.000 179.000 474.000 189.000 434.000 DrawSplineSection
+ 189.000 434.000 199.000 394.000 229.000 374.000 DrawSplineSection
+ 229.000 374.000 259.000 354.000 279.000 394.000 DrawSplineSection
+ 299.000 434.000 lineto stroke
+%% Open spline
+newpath 99.000 199.000 moveto 139.000 159.000 lineto
+ 139.000 159.000 179.000 119.000 209.000 209.000 DrawSplineSection
+ 209.000 209.000 239.000 299.000 269.000 249.000 DrawSplineSection
+ 299.000 199.000 lineto stroke
+/Times-Italic findfont 12.000 scalefont setfont
+299 184 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+304 189 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+309 429 moveto
+1 -1 scale
+(7)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+269 349 moveto
+1 -1 scale
+(6)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+209 384 moveto
+1 -1 scale
+(5)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+159 554 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+154 549 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+94 469 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+89 464 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+130 379 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+125 374 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+204 379 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+189 494 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+184 489 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+304 424 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+264 344 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+99 179 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+104 184 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+179 104 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+184 109 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+239 314 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+244 319 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+$F2psEnd
+endFig
+3285 4360(Figure)N
+3514(2)X
+3 f F
+2520 4616(3)N
+0 f F
+2620(METAFONT)X
+3 f F
+2981(to)X
+3068(P)X
+8 s 8 xH F
+3117(OST)X
+10 s 10 xH F
+3246(S)X
+8 s 8 xH F
+3290(CRIPT)X
+10 s 10 xH F
+3509(compiler\320)X
+2520 4712(why)N
+2682(and)X
+2830(how)X
+1 f F
+2520 4856(This)N
+2701(section)X
+2967(describes)X
+3305(a)X
+3380(major)X
+3606(performance)X
+4053(problem)X
+2520 4952(with)N
+0 f F
+2706(METAFONT)X
+1 f F
+3047(-generated)X
+3430(fonts)X
+3633(that)X
+3796(perhaps)X
+4089(can)X
+4244(be)X
+2520 5048(solved)N
+2753(by)X
+2857(translating)X
+3220(them)X
+3405(into)X
+3554(P)X
+8 s 8 xH F
+3598(OST)X
+10 s 10 xH F
+3719(S)X
+8 s 8 xH F
+3763(CRIPT)X
+10 s 10 xH F
+3970(fonts.)X
+4195(The)X
+2520 5144(goals)N
+2714(of)X
+2806(this)X
+2946(translation)X
+3308(are)X
+3431(established.)X
+3831(Based)X
+4051(on)X
+4155(these)X
+2520 5240(goals,)N
+2737(a)X
+2801(particular)X
+3137(approach)X
+3460(is)X
+3542(adopted)X
+3825(to)X
+3916(engineer)X
+4222(the)X
+2520 5336(software)N
+2817(largely)X
+3060(from)X
+3236(existing)X
+3509(components.)X
+3 f F
+2520 5528(3.1)N
+2680(A)X
+2816(problem)X
+3184(with)X
+0 f F
+3414(METAFONT)X
+3 f F
+3755(-generated)X
+4200(bit-)X
+2520 5624(mapped)N
+2821(fonts.)X
+1 f F
+3056(In)X
+0 f F
+3148(METAFONT)X
+1 f F
+3489(,)X
+3534(one)X
+3675(gets)X
+3829(one)X
+3970(bitmap)X
+4217(per)X
+2520 5720(point)N
+2709(size)X
+2859(and)X
+3000(magni\256cation.)X
+3485(The)X
+3635(size)X
+3785(of)X
+3877(these)X
+4067(bitmaps)X
+2465 6084(3)N
+
+%%Page: 4 5
+4 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(grows)N
+803(as)X
+901(the)X
+1029(square)X
+1269(of)X
+1366(product)X
+1641(of)X
+1738(the)X
+1866(design)X
+2105(size)X
+2260(and)X
+576 768(the)N
+711(magni\256cation)X
+1188(and)X
+1341(requires)X
+1637(a)X
+1710(large)X
+1908(storage)X
+2177(space.)X
+576 864(Files)N
+754(that)X
+896(are)X
+1017(sent)X
+1168(to)X
+1252(the)X
+1372(printer)X
+1608(will)X
+1754(be)X
+1852(large,)X
+2055(especially)X
+576 960(if)N
+667(lots)X
+824(of)X
+933(di)X
+995 MX
+(ff)138 606 oc
+1043(erent)X
+1247(point)X
+1454(sizes)X
+1653(or)X
+1763(magni\256cations)X
+2277(are)X
+576 1056(used.)N
+781(In)X
+886(P)X
+8 s 8 xH F
+930(OST)X
+10 s 10 xH F
+1051(S)X
+8 s 8 xH F
+1095(CRIPT)X
+10 s 10 xH F
+1315(with)X
+1495(outline)X
+1755(fonts,)X
+1972(there)X
+2170(is)X
+2260(one)X
+576 1152(outline)N
+824(per)X
+953(character)X
+1275(which)X
+1497(can)X
+1635(be)X
+1738(scaled)X
+1966(arbitrarily)X
+2314(to)X
+576 1248(any)N
+739(magni\256cation)X
+1225(that)X
+1391(might)X
+1623(be)X
+1745(needed.)X
+2039(Moreover,)X
+576 1344(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+999(outline)X
+1253(fonts)X
+1445(are)X
+1576(generally)X
+1907(more)X
+2104(compact)X
+576 1440(than)N
+737(bitmapped)X
+1098(fonts.)X
+1301(For)X
+1435(example,)X
+1750(an)X
+1849(enclosed)X
+2152(rectan-)X
+576 1536(gle)N
+703(is)X
+785(represented)X
+1185(by)X
+1294(its)X
+1398(four)X
+1561(corner)X
+1796(points)X
+2020(rather)X
+2238(than)X
+576 1632(by)N
+676(all)X
+776(the)X
+894(bits)X
+1029(enclosed)X
+1330(by)X
+1430(the)X
+1548(rectangle.)X
+735 1728(Certainly)N
+1063(the)X
+1191(outline)X
+1443(fonts)X
+1633(are)X
+1762(more)X
+1957(easily)X
+2175(scaled)X
+576 1824(to)N
+662(other)X
+851(magni\256cations.)X
+1366(By)X
+1483(scaling)X
+1734(the)X
+1855(bitmapped)X
+2216(fonts)X
+576 1920(downward,)N
+971(too)X
+1109(much)X
+1323(information)X
+1737(is)X
+1826(lost,)X
+1997(and)X
+2149(scaling)X
+576 2016(upward)N
+862(introduces)X
+1240(the)X
+1382(jaggies.)X
+1693(Moreover,)X
+2074(the)X
+2216(pixel)X
+576 2112(array)N
+766(is)X
+843(device)X
+1078(dependent;)X
+1455(it)X
+1524(is)X
+1602(valid)X
+1787(for)X
+1906(output)X
+2135(devices)X
+576 2208(of)N
+666(only)X
+831(one)X
+969(particular)X
+1299(resolution)X
+1641(and)X
+1779(one)X
+1917(choice)X
+2149(of)X
+2238(pos-)X
+576 2304(sible)N
+750(data)X
+907(values)X
+1135(per)X
+1261(pixel.)X
+1464(Scaleable)X
+1795(fonts)X
+1979(have)X
+2155(a)X
+2215(great)X
+576 2400(advantage)N
+923(\320)X
+1024(you)X
+1165(need)X
+1337(only)X
+1499(one)X
+1635(font)X
+1784(description)X
+2160(\256le)X
+2282(for)X
+576 2496(all)N
+690(magni\256cations)X
+1195(of)X
+1296(that)X
+1450(font.)X
+1654(Actually,)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 2592(outline)N
+830(fonts)X
+1022(are)X
+1153(more)X
+1350(scaleable)X
+1677(even)X
+1860(than)X
+2029(the)X
+0 f F
+2158(META-)X
+576 2688(FONT)N
+1 f F
+781(originals)X
+1101(for)X
+1235(another)X
+1516(reason.)X
+1786(In)X
+1893([9],)X
+2048(it)X
+2133(is)X
+2227(said,)X
+576 2784(\252Caution:)N
+930(before)X
+1179(using)X
+1395(this)X
+1553(`)X
+3 f F
+1580(at)X
+1 f F
+1647(')X
+1716(feature)X
+1982(\(i.e.)X
+2149(scaling)X
+576 2880(downward)N
+944(or)X
+1040(upward\))X
+1337(you)X
+1486(should)X
+1728(check)X
+1946(to)X
+2038(make)X
+2242(sure)X
+576 2976(that)N
+717(your)X
+885(typesetter)X
+1218(supports)X
+1510(the)X
+1629(font)X
+1779(at)X
+1857(the)X
+1975(size)X
+2120(in)X
+2202(ques-)X
+576 3072(tion;)N
+747(T)X
+788 3088(E)N
+829 3072(X)N
+913(will)X
+1063(accept)X
+1295(any)X
+47 f F
+1437(\341)X
+1 f F
+1463(desired)X
+1721(size)X
+47 f F
+1846(\361)X
+1 f F
+1898(that)X
+2044(is)X
+2123(positive)X
+576 3168(and)N
+720(less)X
+868(than)X
+1034(2048)X
+1222(points,)X
+1465(but)X
+1595(the)X
+1721(\256nal)X
+1891(output)X
+2123(will)X
+2274(not)X
+576 3264(be)N
+689(right)X
+877(unless)X
+1114(the)X
+1250(scaled)X
+1489(font)X
+1656(really)X
+1877(is)X
+1968(available)X
+2296(on)X
+576 3360(your)N
+749(printing)X
+1027(device.\272)X
+1318(Getting)X
+1583(P)X
+8 s 8 xH F
+1627(OST)X
+10 s 10 xH F
+1748(S)X
+8 s 8 xH F
+1792(CRIPT)X
+10 s 10 xH F
+1999(outline)X
+2246(ver-)X
+576 3456(sions)N
+783(of)X
+0 f F
+893(METAFONT)X
+1 f F
+1277(fonts)X
+1480(is)X
+1576(possible)X
+1882(since)X
+2091(both)X
+2277(are)X
+576 3552(based)N
+788(on)X
+897(Be)X
+955(\302zier)X
+1137(curves.)X
+1396(Doing)X
+1625(so)X
+1725(makes)X
+1959(fonts)X
+2148(hereto-)X
+576 3648(fore)N
+738(available)X
+1061(only)X
+1236(on)X
+1349(T)X
+1390 3664(E)N
+1431 3648(X)N
+1522(and)X
+1671(other)X
+1869(DVI-based)X
+2255(for-)X
+576 3744(matters)N
+839(available)X
+1156(on)X
+9 f F
+1265(ditroff)X
+1 f F
+1491(and)X
+1633(other)X
+1824(formatters)X
+2180(which)X
+576 3840(have)N
+765(evolved)X
+1056(to)X
+1155(or)X
+1259(have)X
+1448(been)X
+1637(designed)X
+1959(for)X
+2090(use)X
+2234(with)X
+576 3936(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+987(printers.)X
+3 f F
+576 4128(3.2)N
+736(Goals.)X
+1 f F
+999(Based)X
+1223(on)X
+1331(the)X
+1457(observations)X
+1891(of)X
+1987(Section)X
+2256(3.1,)X
+576 4224(the)N
+704(goal)X
+872(of)X
+969(this)X
+1114(research)X
+1413(is)X
+1496(to)X
+1588(produce)X
+1877(a)X
+0 f F
+1943(METAFONT)X
+1 f F
+2314(to)X
+576 4320(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1000(compiler,)X
+9 f F
+1341(mf2ps)X
+1 f F
+1558(.)X
+1612(Its)X
+1726(operational)X
+2121(require-)X
+576 4416(ments)N
+787(are)X
+906(items)X
+1099(1)X
+1159(through)X
+1428(5:)X
+639 4560(1.)N
+735(It)X
+831(must)X
+1033(be)X
+1156(possible)X
+1465(to)X
+1574(translate)X
+1893(any)X
+2056(legitimate)X
+0 f F
+735 4656(METAFONT)N
+1 f F
+1102(font)X
+1257(de\256nition)X
+1589(at)X
+1673(any)X
+1814(given)X
+2017(design)X
+2251(size)X
+735 4752(into)N
+879(a)X
+935(P)X
+8 s 8 xH F
+979(OST)X
+10 s 10 xH F
+1100(S)X
+8 s 8 xH F
+1144(CRIPT)X
+10 s 10 xH F
+1346(outline)X
+1588(font.)X
+639 4896(2.)N
+735(The)X
+894(resulting)X
+1208(P)X
+8 s 8 xH F
+1252(OST)X
+10 s 10 xH F
+1373(S)X
+8 s 8 xH F
+1417(CRIPT)X
+10 s 10 xH F
+1633(outline)X
+1889(font)X
+2052(should)X
+2300(be)X
+735 4992(arbitrarily)N
+1076(scaleable.)X
+639 5136(3.)N
+735(The)X
+883(resulting)X
+1186(fonts)X
+1369(should)X
+1606(look)X
+1772(like)X
+1916(the)X
+2038(bitmapped)X
+735 5232(fonts)N
+915(when)X
+1109(printed)X
+1356(on)X
+1456(the)X
+1574(same)X
+1759(printer.)X
+639 5376(4.)N
+735(The)X
+894(resulting)X
+1208(P)X
+8 s 8 xH F
+1252(OST)X
+10 s 10 xH F
+1373(S)X
+8 s 8 xH F
+1417(CRIPT)X
+10 s 10 xH F
+1633(outline)X
+1889(font)X
+2052(should)X
+2300(be)X
+735 5472(more)N
+944(compact)X
+2 f F
+1260(when)X
+1473(sent)X
+1646(to)X
+1752(the)X
+1894(printer)X
+1 f F
+2159(than)X
+2340(a)X
+735 5568(P)N
+8 s 8 xH F
+779(OST)X
+10 s 10 xH F
+900(S)X
+8 s 8 xH F
+944(CRIPT)X
+10 s 10 xH F
+1168(version)X
+1446(of)X
+1555(the)X
+0 f F
+1695(METAFONT)X
+1 f F
+2036(-generated)X
+735 5664(bitmapped)N
+1093(font.)X
+2520 672(The)N
+2681(fourth)X
+2913(requirement)X
+3337(deserves)X
+3650(a)X
+3722(bit)X
+3842(of)X
+3946(explanation)X
+2520 768(and)N
+2669(quali\256cation.)X
+3142(First)X
+3321(note)X
+3492(that)X
+3645(what)X
+3833(is)X
+3918(compared)X
+4267(is)X
+2520 864(what)N
+2737(is)X
+2851(sent)X
+3041(to)X
+3164(the)X
+3323(printer.)X
+3638(Certainly)X
+3998(there)X
+4221(are)X
+2520 960(compressed)N
+2922(versions)X
+3212(of)X
+3301(the)X
+3421(bitmapped)X
+3781(fonts)X
+3963(that)X
+4105(reduce)X
+2520 1056(the)N
+2651(disk)X
+2817(storage)X
+3082(requirements)X
+3535(of)X
+3636(the)X
+3768(bitmapped)X
+4140(fonts.)X
+2520 1152(However,)N
+2869(they)X
+3041(must)X
+3230(be)X
+3340(uncompressed)X
+3832(before)X
+4071(sending)X
+2520 1248(them)N
+2708(to)X
+2798(most)X
+2981(printers.)X
+3274(It)X
+3351(is)X
+3432(the)X
+3558(printer's)X
+3858(storage)X
+4118(that)X
+4267(is)X
+2520 1344(limited;)N
+2789(generally)X
+3109(disk)X
+3263(space)X
+3463(is)X
+3537(in)X
+3620(abundance.)X
+4005(However,)X
+2520 1440(since)N
+2716(printers)X
+2992(these)X
+3188(days)X
+3367(are)X
+3498(general)X
+3767(purpose)X
+4053(comput-)X
+2520 1536(ers,)N
+2655(what)X
+2832(a)X
+2889(printer)X
+3124(accepts)X
+3382(may)X
+3540(in)X
+3622(fact)X
+3763(be)X
+3859(a)X
+3915(compression)X
+2520 1632(that)N
+2660(it)X
+2724(has)X
+2851(been)X
+3023(programmed)X
+3453(to)X
+3535(undo.)X
+2679 1728(Now)N
+2867(for)X
+2993(the)X
+3123(case)X
+3294(in)X
+3388(which)X
+3616(disk)X
+3781(space)X
+3992(is)X
+4077(of)X
+4177(con-)X
+2520 1824(cern,)N
+2701(the)X
+2821(comparison)X
+3217(should)X
+3452(still)X
+3593(be)X
+3690(relative)X
+3952(to)X
+4035(printable)X
+2520 1920(versions.)N
+2844(There)X
+3069(exist)X
+3258(algorithms,)X
+3658(e.g.)X
+3812(that)X
+3970(of)X
+4075(Lempel)X
+2520 2016(and)N
+2662(Ziv)X
+2799([13])X
+2959(that)X
+3104(can)X
+3241(be)X
+3342(used)X
+3514(to)X
+3601(compress)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 2112(outline)N
+2789(fonts)X
+2996(which)X
+3239(are,)X
+3405(after)X
+3600(all,)X
+3747(just)X
+3910(ASCII)X
+4167(\256les.)X
+2520 2208(Therefore,)N
+2906(in)X
+3016(order)X
+3234(not)X
+3384(to)X
+3494(have)X
+3694(a)X
+3778(contest)X
+4052(between)X
+2520 2304(compression)N
+2947(algorithms,)X
+3331(the)X
+3451(uncompressed)X
+3932(versions)X
+4221(are)X
+2520 2400(compared.)N
+2886(Furthermore,)X
+3336(in)X
+3427(order)X
+3626(not)X
+3757(to)X
+3848(have)X
+4029(a)X
+4093(contest)X
+2520 2496(between)N
+2840(di)X
+2902 MX
+(ff)138 606 oc
+2950(erent)X
+3163(kinds)X
+3388(of)X
+3507(printers)X
+3804(that)X
+3977(may)X
+4168(have)X
+2520 2592(di)N
+2582 MX
+(ff)138 606 oc
+2630(ering)X
+2819(font)X
+2972(representations,)X
+3501(P)X
+8 s 8 xH F
+3545(OST)X
+10 s 10 xH F
+3666(S)X
+8 s 8 xH F
+3710(CRIPT)X
+10 s 10 xH F
+3915(outline)X
+4160(fonts)X
+2520 2688(are)N
+2655(compared)X
+3009(to)X
+3108(P)X
+8 s 8 xH F
+3152(OST)X
+10 s 10 xH F
+3273(S)X
+8 s 8 xH F
+3317(CRIPT)X
+10 s 10 xH F
+3536(bitmapped)X
+3911(fonts.)X
+4128(When)X
+2520 2784(considering)N
+2916(disk)X
+3071(space,)X
+3292(the)X
+3412(fact)X
+3554(that)X
+3695(one)X
+3832(bitmapped)X
+4191(font)X
+2520 2880(is)N
+2600(needed)X
+2855(for)X
+2976(each)X
+3151(magni\256cation)X
+3618(is)X
+3698(taken)X
+3899(into)X
+4050(account.)X
+2520 2976(Thus,)N
+2721(the)X
+2840(interest)X
+3097(is)X
+3171(in)X
+3254(comparing)X
+3618(the)X
+3737(size)X
+3882(of)X
+3969(a)X
+4025(scaleable)X
+2520 3072(outline)N
+2767(font)X
+2921(to)X
+3008(the)X
+3131(total)X
+3298(storage)X
+3555(for)X
+3674(the)X
+3797(bitmapped)X
+4160(fonts)X
+2520 3168(for)N
+2634(all)X
+2734(magni\256cations)X
+3225(of)X
+3312(a)X
+3368(given)X
+3566(design)X
+3795(size.)X
+2583 3312(5.)N
+2679(The)X
+2838(resulting)X
+3152(P)X
+8 s 8 xH F
+3196(OST)X
+10 s 10 xH F
+3317(S)X
+8 s 8 xH F
+3361(CRIPT)X
+10 s 10 xH F
+3577(outline)X
+3833(font)X
+3996(should)X
+4244(be)X
+2679 3408(more)N
+2882(compact)X
+3192(than)X
+3368(the)X
+3504(total)X
+3684(of)X
+3789(the)X
+3925(sizes)X
+4118(of)X
+4222(the)X
+2679 3504(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3104(versions)X
+3405(of)X
+3506(the)X
+0 f F
+3639(METAFONT)X
+1 f F
+3980(-generated)X
+2679 3600(bitmapped)N
+3055(fonts)X
+3253(at)X
+3348(each)X
+3533(available)X
+3860(magni\256cation.)X
+2679 3696(Even)N
+2872(this)X
+3015(comparison)X
+3417(is)X
+3498(not)X
+3629(completely)X
+4014(fair)X
+4155(since)X
+2679 3792(only)N
+2862(speci\256c)X
+3147(magni\256cations)X
+3658(are)X
+3797(provided,)X
+4142(while)X
+2679 3888(the)N
+2797(P)X
+8 s 8 xH F
+2841(OST)X
+10 s 10 xH F
+2962(S)X
+8 s 8 xH F
+3006(CRIPT)X
+10 s 10 xH F
+3208(font)X
+3357(is)X
+3430(arbitrarily)X
+3771(scaleable.)X
+2679 4032(Observe)N
+2993(\256nally,)X
+3263(that)X
+3429(the)X
+3573(comparison)X
+3993(is)X
+4093(against)X
+2520 4128(magni\256cations)N
+3038(of)X
+3151(a)X
+3233(single)X
+3470(design)X
+3725(size)X
+3896(since)X
+4107(purists)X
+2520 4224(would)N
+2741(argue)X
+2941(that)X
+3082(there)X
+3264(should)X
+3498(be)X
+3596(a)X
+3654(di)X
+3716 MX
+(ff)138 606 oc
+3764(erent)X
+3947(outline)X
+4191(font)X
+2520 4320(for)N
+2642(each)X
+2818(design)X
+3055(size.)X
+3248(Since)X
+3454(there)X
+3642(are)X
+3768(those)X
+3964(that)X
+4111(do)X
+4218(not)X
+2520 4416(require)N
+2768(this)X
+2903(purity,)X
+3134(the)X
+3252(various)X
+3508(design)X
+3737(sizes)X
+3913(will)X
+4058(be)X
+4155(com-)X
+2520 4512(pared)N
+2719(also.)X
+2679 4608(The)N
+2824(software)X
+3121(engineering)X
+3520(goal)X
+3678(is)X
+3751(item)X
+3913(6.)X
+2583 4752(6.)N
+9 f F
+2679(mf2ps)X
+1 f F
+2916(should)X
+3149(be)X
+3245(written)X
+3492(as)X
+3579(much)X
+3777(as)X
+3864(possible)X
+4147(using)X
+2679 4848(the)N
+2801(existing)X
+0 f F
+3078(METAFONT)X
+1 f F
+3443(program)X
+3739(both)X
+3904(to)X
+3989(save)X
+4155(work)X
+2679 4944(and)N
+2831(to)X
+2929(ensure)X
+3175(that)X
+3331(all)X
+0 f F
+3447(METAFONT)X
+1 f F
+3788(-acceptable)X
+4191(font)X
+2679 5040(de\256nitions)N
+3036(are)X
+3155(handled.)X
+2520 5184(The)N
+2679(evaluation)X
+3047(of)X
+3148(the)X
+3280(results)X
+3523(will)X
+3681(be)X
+3791(done)X
+3982(relative)X
+4258(to)X
+2520 5280(these)N
+2705(goals.)X
+3 f F
+2520 5472(3.3)N
+2680(Previous)X
+2999(attempts.)X
+1 f F
+3359(Leslie)X
+3576(Carr)X
+3741(wrote)X
+3946(a)X
+4004(collection)X
+2520 5568(of)N
+2613(programs)X
+2942(to)X
+3030(produce)X
+3315(P)X
+8 s 8 xH F
+3359(OST)X
+10 s 10 xH F
+3480(S)X
+8 s 8 xH F
+3524(CRIPT)X
+10 s 10 xH F
+3732(outline)X
+3979(fonts)X
+4164(from)X
+0 f F
+2520 5664(METAFONT)N
+1 f F
+2884(fonts)X
+3067(in)X
+3152(1987.)X
+3355(Carr's)X
+3580(programs)X
+3907(take)X
+4065(as)X
+4156(input)X
+2465 6084(4)N
+
+%%Page: 5 6
+5 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(the)N
+2 f F
+723(log)X
+1 f F
+874(output)X
+1127(\256le)X
+1277(of)X
+0 f F
+1392(METAFONT)X
+1 f F
+1781(which)X
+2025(contains)X
+2340(a)X
+576 768(description)N
+956(of)X
+1047(all)X
+1151(the)X
+1273(paths)X
+1466(that)X
+0 f F
+1610(METAFONT)X
+1 f F
+1975(traces)X
+2187(out)X
+2314(in)X
+576 864(drawing)N
+859(a)X
+915(character.)X
+735 960(Carr)N
+908(has)X
+1045(problems)X
+1373(of)X
+1470(information)X
+1878(loss)X
+2033(as)X
+2131(a)X
+2198(result)X
+576 1056(of)N
+666(not)X
+791(having)X
+1032(entered)X
+1291(into)X
+1437(the)X
+0 f F
+1557(METAFONT)X
+1 f F
+1920(program.)X
+2234(This)X
+576 1152(is)N
+650(the)X
+769(reason)X
+1001(why)X
+1161(Carr's)X
+1384(characters)X
+1733(are)X
+1854(poor)X
+2023(looking.)X
+2309(In)X
+576 1248([5],)N
+721(Carr)X
+895(observes,)X
+1227(\252In)X
+1361(the)X
+5 f F
+1490(cmr10)X
+1 f F
+1761(font,)X
+1941(the)X
+2 f F
+2070(crisp)X
+1 f F
+2260(pen)X
+576 1344(has)N
+707(diameter)X
+1013(zero,)X
+1197(so)X
+1293(serifs)X
+1492(have)X
+1669(square)X
+1904(corners.)X
+2186(In)X
+2278(the)X
+5 f F
+576 1440(cmtt10)N
+1 f F
+903(font,)X
+2 f F
+1091(crisp)X
+1 f F
+1290(is)X
+1382(set)X
+1510(to)X
+1611(a)X
+1686(larger)X
+1912(value)X
+2124(and)X
+2278(the)X
+576 1536(serifs)N
+794(end)X
+954(in)X
+1060(semicircles.)X
+1485(Because)X
+1797(the)X
+1939(shape)X
+2166(of)X
+2278(the)X
+576 1632(current)N
+839(pen)X
+989(can)X
+1135(NOT)X
+1334(be)X
+1444(taken)X
+1652(into)X
+1810(account)X
+2094(in)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 1728(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+802(,)X
+852(these)X
+1047(di)X
+1109 MX
+(ff)138 606 oc
+1157(erences)X
+1429(in)X
+1521(the)X
+1649(characters)X
+2007(shapes)X
+2252(will)X
+576 1824(not)N
+711(be)X
+820(seen.)X
+1015(This)X
+1189(is)X
+1274(a)X
+3 f F
+1342(fundamental)X
+1 f F
+1809(problem:)X
+2130(given)X
+2340(a)X
+576 1920(path)N
+2 f F
+747(p)X
+1 f F
+820(and)X
+969(a)X
+1038(pen)X
+2 f F
+1187(q)X
+1 f F
+1260(\(whose)X
+1525(shape)X
+1741(is)X
+1827(also)X
+1989(an)X
+2099(arbitrary)X
+576 2016(path\),)N
+0 f F
+782(METAFONT)X
+1 f F
+1144(e)X
+1180 MX
+(ff)138 606 oc
+1228(ectively)X
+1503(envelopes)X
+2 f F
+1844(p)X
+1 f F
+1904(with)X
+2066(respect)X
+2314(to)X
+576 2112(the)N
+702(shape)X
+914(of)X
+2 f F
+1010(q)X
+1 f F
+(;)S
+1101(P)X
+8 s 8 xH F
+1145(OST)X
+10 s 10 xH F
+1266(S)X
+8 s 8 xH F
+1310(CRIPT)X
+10 s 10 xH F
+1521(can)X
+1662(do)X
+1771(nothing)X
+2044(other)X
+2238(than)X
+576 2208(stroke)N
+815(it)X
+902(to)X
+1007(produce)X
+1309(a)X
+1388(line)X
+1551(of)X
+1661(constant)X
+1970(width.)X
+2234(This)X
+576 2304(incompatibility)N
+1099(comes)X
+1339(to)X
+1436(light)X
+1617(when)X
+1826(the)X
+1959(width)X
+2176(of)X
+2278(the)X
+576 2400(pen)N
+712(is)X
+785(signi\256cant)X
+1138(to)X
+1220(the)X
+1338(shape)X
+1541(of)X
+1628(the)X
+1746(character\272.)X
+735 2496(In)N
+838(order)X
+1044(to)X
+1142(avoid)X
+1356(this)X
+1507(problem,)X
+9 f F
+1832(mf2ps)X
+1 f F
+2086(\256nds)X
+2278(the)X
+576 2592(internally)N
+928(generated)X
+1285(envelope,)X
+1639(which)X
+1879(is)X
+1976(used)X
+2167(as)X
+2278(the)X
+576 2688(boundaries)N
+955(of)X
+1049(the)X
+1174(inked)X
+1380(region,)X
+1633(and)X
+1777(uses)X
+1943(this)X
+2086(envelope)X
+576 2784(as)N
+678(the)X
+811(outline.)X
+1087(It)X
+1170(does)X
+1351(not)X
+1487(matter,)X
+1746(then,)X
+1938(what)X
+2128(the)X
+2260(pen)X
+576 2880(path)N
+734(and)X
+870(the)X
+988(pen)X
+1124(shape)X
+1327(are.)X
+735 2976(More)N
+959(recently,)X
+1289(during)X
+1549(the)X
+1698(time)X
+1891(that)X
+2062(the)X
+2211(work)X
+576 3072(described)N
+931(herein)X
+1179(was)X
+1351(being)X
+1576(done,)X
+1799(there)X
+2007(were)X
+2211(other)X
+576 3168(e)N
+612 MX
+(ff)138 606 oc
+660(orts)X
+800(with)X
+962(similar)X
+1204(goals.)X
+735 3264(Doug)N
+939(Henderson)X
+1313([6])X
+1433(obtained)X
+1735(outline)X
+1983(font)X
+2138(charac-)X
+576 3360(ters)N
+714(by)X
+816(modifying)X
+1171(the)X
+5 f F
+1291(endchar)X
+1 f F
+1649(macro,)X
+1892(which)X
+2110(is)X
+2184(called)X
+576 3456(for)N
+693(each)X
+864(character)X
+1183(after)X
+1354(the)X
+1476(bitmap)X
+1722(is)X
+1799(generated,)X
+2156(to)X
+2242(take)X
+576 3552(the)N
+706(bitmap)X
+960(for)X
+1086(the)X
+1216(character)X
+1544(and)X
+1692(white)X
+1901(out)X
+2034(all)X
+2145(but)X
+2278(the)X
+576 3648(bits)N
+713(on)X
+815(the)X
+935(edge.)X
+1150(The)X
+1298(number)X
+1566(of)X
+1656(bits)X
+1794(left)X
+1924(on)X
+2027(the)X
+2148(edge)X
+2323(is)X
+576 3744(varied)N
+803(according)X
+1146(to)X
+1234(the)X
+1357(resolution)X
+1702(of)X
+1794(the)X
+1917(bitmap.)X
+2184(These)X
+576 3840(outlines,)N
+870(being)X
+1069(bitmapped,)X
+1448(are)X
+1568(just)X
+1704(as)X
+1792(unscaleable)X
+2188(as)X
+2277(are)X
+576 3936(the)N
+694(bitmaps)X
+967(for)X
+1081(the)X
+1199(\256lled-in)X
+1472(characters.)X
+735 4032(Neil)N
+898(Raine)X
+1110(and)X
+1251(Graham)X
+1535(Toal)X
+1708([12])X
+1868(have)X
+2046(developed)X
+576 4128(software)N
+876(that)X
+1019(takes)X
+1206(the)X
+1326(bitmaps)X
+1601(and)X
+1739(rediscovers)X
+2127(the)X
+2247(out-)X
+576 4224(lines)N
+749(by)X
+851(tracing)X
+1096(the)X
+1216(pixels.)X
+1450(The)X
+1598(outlines)X
+1874(that)X
+2017(are)X
+2139(used)X
+2309(as)X
+576 4320(the)N
+706(basis)X
+898(for)X
+1024(P)X
+8 s 8 xH F
+1068(OST)X
+10 s 10 xH F
+1189(S)X
+8 s 8 xH F
+1233(CRIPT)X
+10 s 10 xH F
+1447(fonts)X
+1639(are,)X
+1790(for)X
+1916(the)X
+2045(most)X
+2231(part,)X
+576 4416(generated)N
+911(from)X
+1089(bitmaps)X
+1364(at)X
+1444(2400)X
+1626(dpi.)X
+1770(They)X
+1957(\256rst)X
+2103(generate)X
+576 4512(RISC)N
+801(OS)X
+951(outline)X
+1221(fonts)X
+1429(which)X
+1673(are)X
+1820(screen)X
+2074(fonts)X
+2282(for)X
+576 4608(Acorn's)N
+874(Archimedes)X
+1301(RISC)X
+1517(computer.)X
+1880(These)X
+2112(are)X
+2251(true)X
+576 4704(scaleable)N
+907(outlines.)X
+1216(Then,)X
+1437(these)X
+1637(outlines)X
+1925(are)X
+2059(converted)X
+576 4800(into)N
+728(P)X
+8 s 8 xH F
+772(OST)X
+10 s 10 xH F
+893(S)X
+8 s 8 xH F
+937(CRIPT)X
+10 s 10 xH F
+1147(format.)X
+1409(Toal)X
+1584(says)X
+1751(that)X
+1900(the)X
+2027(the)X
+2154(quality)X
+576 4896(of)N
+666(the)X
+787(fonts)X
+970(produced)X
+1292(is)X
+1368(not)X
+1493(too)X
+1618(great)X
+1802(at)X
+1883(low)X
+2025(resolutions)X
+576 4992(because)N
+871(of)X
+978(shortcomings)X
+1449(in)X
+1551(Adobe's)X
+1863(rendering)X
+2211(algo-)X
+576 5088(rithm.)N
+802(He)X
+929(adds)X
+1109(that)X
+1262(at)X
+1353(1200)X
+1546(dpi)X
+1681(on)X
+1794(a)X
+1862(phototypesetter,)X
+576 5184(they)N
+759(are)X
+903(indistinguishable)X
+1494(from)X
+0 f F
+1695(METAFONT)X
+1 f F
+2036(-generated)X
+576 5280(bitmapped)N
+934(fonts.)X
+1134(These)X
+1346(authors)X
+1602(suspect)X
+1858(that)X
+1998(information)X
+576 5376(that)N
+720(is)X
+797(critical)X
+1044(for)X
+1163(good)X
+1348(appearance)X
+1736(is)X
+1814(lost)X
+1954(when)X
+2153(tracing)X
+576 5472(an)N
+673(outline)X
+916(on)X
+1017(a)X
+1074(bitmap)X
+1317(generated)X
+1650(from)X
+1826(a)X
+1882(mathematically)X
+576 5568(described)N
+909(envelope.)X
+1244(Better)X
+1466(results)X
+1701(should)X
+1940(be)X
+2042(obtainable)X
+576 5664(using)N
+769(the)X
+887(original)X
+1156(envelope.)X
+2679 672(John)N
+2864(Hobby)X
+3116([7])X
+3244(has)X
+3385(developed)X
+3750(a)X
+3821(program)X
+4128(called)X
+2520 768(MetaPost,)N
+2865(which)X
+3083(translates)X
+3408(from)X
+3586(an)X
+3684(extension)X
+4013(of)X
+0 f F
+4102(META-)X
+2520 864(FONT)N
+1 f F
+2725(into)X
+2889(P)X
+8 s 8 xH F
+2933(OST)X
+10 s 10 xH F
+3054(S)X
+8 s 8 xH F
+3098(CRIPT)X
+10 s 10 xH F
+3320(cubic)X
+3534(splines)X
+3796(and)X
+3953(commands.)X
+2520 960(His)N
+2678(goal)X
+2863(was)X
+3035(to)X
+3144(turn)X
+0 f F
+3319(METAFONT)X
+1 f F
+3706(into)X
+3876(a)X
+3958(system)X
+4226(for)X
+2520 1056(typesetting)N
+2900(general)X
+3166(graphics,)X
+3488(including)X
+3820(embedded)X
+4180(text.)X
+2520 1152(His)N
+2653(approach,)X
+2990(similar)X
+3234(to)X
+3318(ours,)X
+3498(was)X
+3645(to)X
+3729(modify)X
+3982(the)X
+0 f F
+4102(META-)X
+2520 1248(FONT)N
+1 f F
+2709(program)X
+3005(into)X
+3154(what)X
+3335(he)X
+3436(desired.)X
+3733(Be\256tting)X
+4037(his)X
+4155(more)X
+2520 1344(general)N
+2800(goals,)X
+3032(besides)X
+3311(modifying)X
+3687(the)X
+3828(output,)X
+4095(he)X
+4213(has)X
+2520 1440(added)N
+2734(new)X
+2890(commands)X
+3259(to)X
+3343(the)X
+3463(input)X
+3650(language.)X
+3983(Moreover,)X
+2520 1536(his)N
+2646(translation)X
+3017(appears)X
+3296(to)X
+3391(be)X
+3500(a)X
+3569(direct)X
+3784(mapping)X
+4096(from)X
+4284(a)X
+0 f F
+2520 1632(METAFONT)N
+1 f F
+2893(command)X
+3241(sequence)X
+3568(to)X
+3662(a)X
+3731(P)X
+8 s 8 xH F
+3775(OST)X
+10 s 10 xH F
+3896(S)X
+8 s 8 xH F
+3940(CRIPT)X
+10 s 10 xH F
+4155(com-)X
+2520 1728(mand)N
+2719(sequence.)X
+3075(The)X
+3221(result)X
+3420(is)X
+3494(a)X
+3551(program)X
+3844(more)X
+4030(powerful)X
+2520 1824(than)N
+9 f F
+2680(mf2ps)X
+1 f F
+2897(.)X
+2957(It)X
+3026(will)X
+3170(be)X
+3266(interesting)X
+3624(to)X
+3707(compare)X
+4005(fonts)X
+4186(pro-)X
+2520 1920(duced)N
+2736(by)X
+2840(MetaPost)X
+3166(and)X
+9 f F
+3308(mf2ps)X
+1 f F
+3548(for)X
+3665(appearance)X
+4051(and)X
+4190(per-)X
+2520 2016(formance.)N
+3 f F
+2520 2208(3.4)N
+2680(Methodology.)X
+1 f F
+3210(There)X
+3439(are)X
+3579(a)X
+3656(number)X
+3942(of)X
+4051(ways)X
+4258(to)X
+2520 2304(build)N
+2704(the)X
+2822(compiler.)X
+3147(They)X
+3332(include)X
+2583 2448(1.)N
+2679(writing)X
+2955(the)X
+3098(whole)X
+3339(compiler)X
+3669(from)X
+0 f F
+3871(METAFONT)X
+1 f F
+4258(to)X
+2679 2544(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3099(from)X
+3284(scratch:)X
+3563(This)X
+3733(has)X
+3868(the)X
+3994(advantage)X
+2679 2640(that)N
+2822(one)X
+2961(does)X
+3131(not)X
+3256(have)X
+3431(to)X
+3516(get)X
+3637(into)X
+3784(another)X
+4048(person's)X
+2679 2736(software,)N
+3021(which)X
+3262(is)X
+3360(not)X
+3507(very)X
+3695(pleasant)X
+4003(when)X
+4222(the)X
+2679 2832(software)N
+2985(is)X
+3067(so)X
+3167(big.)X
+3318(On)X
+3445(the)X
+3573(other)X
+3768(hand,)X
+3974(one)X
+4120(would)X
+2679 2928(have)N
+2860(to)X
+2950(treat)X
+3121(the)X
+3247(whole)X
+3471(job)X
+3601(of)X
+3696(turning)X
+3955(mathemati-)X
+2679 3024(cal)N
+2795(equations)X
+3124(and)X
+3262(any)X
+3400(arbitrary)X
+3699(pen)X
+3838(shape)X
+4044(into)X
+4191(out-)X
+2679 3120(lines.)N
+2583 3264(2.)N
+2679(using)X
+2877(the)X
+0 f F
+3000(METAFONT)X
+1 f F
+3366(output)X
+3595(as)X
+3687(was)X
+3837(done)X
+4018(by)X
+4124(Leslie)X
+2679 3360(Carr)N
+2853([5]:)X
+3000(This)X
+3173(has)X
+3311(the)X
+3440(advantage)X
+3797(of)X
+3894(not)X
+4026(requiring)X
+2679 3456(delving)N
+2947(into)X
+3099(another's)X
+3426(software,)X
+3751(but)X
+3881(the)X
+4007(generated)X
+2679 3552(information)N
+3087(is)X
+3170(not)X
+3302(enough)X
+3568(if)X
+3647(one)X
+3793(wants)X
+4010(no)X
+4119(devia-)X
+2679 3648(tions)N
+2854(from)X
+3030(the)X
+3148(originals.)X
+2583 3792(3.)N
+2679(getting)X
+2927(into)X
+3078(the)X
+0 f F
+3203(METAFONT)X
+1 f F
+3571(program:)X
+3892(This)X
+4061(requires)X
+2679 3888(examining)N
+3039(the)X
+3159(internals)X
+3457(of)X
+3546(the)X
+0 f F
+3666(METAFONT)X
+1 f F
+4028(program.)X
+2679 3984(However,)N
+0 f F
+3070(METAFONT)X
+1 f F
+3487(and)X
+3679(P)X
+8 s 8 xH F
+3723(OST)X
+10 s 10 xH F
+3844(S)X
+8 s 8 xH F
+3888(CRIPT)X
+10 s 10 xH F
+4146(make)X
+2679 4080(liberal)N
+2936(use)X
+3095(of)X
+3214(Be)X
+3272(\302zier)X
+3477(curves)X
+3739(to)X
+3853(describe)X
+4173(non-)X
+2679 4176(circular)N
+2968(curves.)X
+3241(This)X
+3426(fact)X
+3591(makes)X
+3840(the)X
+3982(translation)X
+2679 4272(process)N
+2960(natural.)X
+3243(For)X
+3394(each)X
+3581(speci\256ed)X
+3905(path,)X
+0 f F
+4102(META-)X
+2679 4368(FONT)N
+1 f F
+2895(creates)X
+3170(control)X
+3448(points)X
+3694(for)X
+3840(the)X
+3990(associated)X
+2679 4464(cubic)N
+2877(spline)X
+3092(curves)X
+3326(before)X
+3556(calculating)X
+3932(the)X
+4054(bit)X
+4162(map.)X
+0 f F
+2679 4560(METAFONT)N
+1 f F
+3045(also)X
+3199(calculates)X
+3541(the)X
+3664(edge)X
+3842(o)X
+(ff)138 606 oc
+3930(sets)X
+4076(implied)X
+2679 4656(by)N
+2783(the)X
+2905(pen)X
+3045(shape.)X
+3271(Using)X
+3485(the)X
+3606(necessary)X
+3942(information)X
+2679 4752(one)N
+2820(can)X
+2957(get)X
+3080(a)X
+3141(new)X
+3300(set)X
+3414(of)X
+3506(control)X
+3758(points)X
+3978(that)X
+4124(de\256ne)X
+2679 4848(Be)N
+2737(\302zier)X
+2911(curves)X
+3142(and)X
+3278(lines)X
+3449(that)X
+3589(are)X
+3708(needed)X
+3956(to)X
+4038(build)X
+4222(the)X
+2679 4944(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3090(outline)X
+3332(fonts.)X
+3 f F
+2520 5136(3.5)N
+2680(Software)X
+3013(engineering)X
+3439(of)X
+3532(solution.)X
+1 f F
+3868(The)X
+4019(idea)X
+4179(is)X
+4258(to)X
+2520 5232(split)N
+2693(the)X
+0 f F
+2827(METAFONT)X
+1 f F
+3204(program)X
+3512(into)X
+3672(front)X
+3864(end)X
+4016(and)X
+4168(back)X
+2520 5328(end.)N
+2687(The)X
+2843(front)X
+3030(end)X
+3178(takes)X
+0 f F
+3375(METAFONT)X
+1 f F
+3748(speci\256cation)X
+4185(of)X
+4284(a)X
+2520 5424(character,)N
+2869(magni\256cation,)X
+3361(and)X
+3509(point)X
+3705(size,)X
+3882(and)X
+4030(produces)X
+2520 5520(the)N
+2646(envelope,)X
+2984(i.e.,)X
+3131(the)X
+3258(outline)X
+3509(of)X
+3605(the)X
+3732(character,)X
+4077(and)X
+4222(the)X
+2520 5616(back)N
+2700(end)X
+2844(\256lls)X
+2990(the)X
+3115(envelope)X
+3432(with)X
+3601(bits.)X
+3763(Taking)X
+4017(the)X
+4142(exist-)X
+2520 5712(ing)N
+2646(front)X
+2827(end)X
+2968(and)X
+3109(writing)X
+3365(a)X
+3426(new)X
+3585(back)X
+3762(end)X
+3903(that)X
+4048(converts)X
+2465 6084(5)N
+
+%%Page: 6 7
+6 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(the)N
+697(envelope)X
+1010(into)X
+1157(a)X
+1216(P)X
+8 s 8 xH F
+1260(OST)X
+10 s 10 xH F
+1381(S)X
+8 s 8 xH F
+1425(CRIPT)X
+10 s 10 xH F
+1630(speci\256cation)X
+2058(of)X
+2148(an)X
+2247(out-)X
+576 768(line)N
+723(is)X
+804(our)X
+939(method)X
+1207(of)X
+1302(producing)X
+9 f F
+1657(mf2ps)X
+1 f F
+1874(.)X
+1922(The)X
+2075(bit-\256lling)X
+576 864(process)N
+837(will)X
+981(be)X
+1077(done)X
+1253(by)X
+1353(the)X
+1471(printer.)X
+735 960(In)N
+851(order)X
+1070(to)X
+1181(make)X
+1404(P)X
+8 s 8 xH F
+1448(OST)X
+10 s 10 xH F
+1569(S)X
+8 s 8 xH F
+1613(CRIPT)X
+10 s 10 xH F
+1845(fonts)X
+2055(arbitrarily)X
+576 1056(scaleable,)N
+919(we)X
+1041(have)X
+1221(to)X
+1311(ask)X
+1446(the)X
+9 f F
+1574(mf2ps)X
+1 f F
+1818(program)X
+2117(to)X
+2206(use)X
+2340(a)X
+576 1152(very)N
+755(large)X
+952(magni\256cation,)X
+1448(at)X
+1542(least)X
+1725(to)X
+1823(try)X
+1948(to)X
+2046(match)X
+2278(the)X
+576 1248(grid)N
+741(on)X
+857(which)X
+1089(Adobe)X
+1338(plots)X
+1528(the)X
+1661(points)X
+1891(of)X
+1993(its)X
+2103(outlines.)X
+576 1344(Adobe)N
+812(plots)X
+989(its)X
+1086(characters)X
+1435(on)X
+1538(a)X
+1597(1000)X
+47 f F
+1777(\264)X
+1 f F
+1841(1000)X
+2024(grid.)X
+2196(Thus,)X
+576 1440(Adobe's)N
+880(resolution)X
+1231(is)X
+1315(1000)X
+1506(dpm)X
+1679(\(dots)X
+1870(per)X
+2004(em\),)X
+2180(which)X
+576 1536(for)N
+704(design)X
+947(size)X
+1106(10)X
+1220(points)X
+1449(is)X
+1536(7200)X
+1730(dpi.)X
+1906(Unfortunately,)X
+0 f F
+576 1632(METAFONT)N
+1 f F
+917(,)X
+960(and)X
+1099(thus)X
+9 f F
+1257(mf2ps)X
+1 f F
+1497(accepts)X
+1757(resolutions)X
+2131(only)X
+2296(up)X
+576 1728(to)N
+662(3000)X
+846(dpi.)X
+992(The)X
+1141(results)X
+1374(should)X
+1611(be)X
+1712(su)X
+1783 MX
+(Fi)139 825 oc
+(cient)S
+2030(to)X
+2117(produce)X
+576 1824(fonts)N
+768(scaleable)X
+1094(up)X
+1205(to)X
+1298(magni\256cation)X
+1769(7)X
+1840(or)X
+1938(8,)X
+2029(which)X
+2256(is)X
+2340(a)X
+576 1920(reasonable)N
+940(range)X
+1139(in)X
+1221(typesetting.)X
+735 2016(This)N
+898(approach)X
+1214(helps)X
+1404(meet)X
+1581(goal)X
+1740(6)X
+1801(because)X
+2078(the)X
+2198(origi-)X
+576 2112(nal)N
+731(unchanged)X
+0 f F
+1136(METAFONT)X
+1 f F
+1534(program)X
+1863(is)X
+1973(used.)X
+2196(Thus,)X
+576 2208(exactly)N
+834(the)X
+958(same)X
+1149(input)X
+1339(is)X
+1418(accepted)X
+1727(as)X
+1821(in)X
+1910(the)X
+0 f F
+2035(METAFONT)X
+1 f F
+576 2304(program.)N
+898(There)X
+1116(is)X
+1198(some)X
+1396(extra)X
+1586(frosting)X
+1864(obtained)X
+2169(by)X
+2278(the)X
+576 2400(chosen)N
+834(approach.)X
+1185(The)X
+1346(program)X
+1654(for)X
+1784(translating)X
+0 f F
+2158(META-)X
+576 2496(FONT)N
+1 f F
+772(to)X
+865(P)X
+8 s 8 xH F
+909(OST)X
+10 s 10 xH F
+1030(S)X
+8 s 8 xH F
+1074(CRIPT)X
+10 s 10 xH F
+1287(is)X
+1370(actually)X
+1654(a)X
+1720(bit)X
+1834(of)X
+1931(an)X
+2037(interactive)X
+576 2592(environment)N
+1006(because)X
+1286(the)X
+1409(new)X
+1568(back)X
+1746(end)X
+1888(is)X
+1967(an)X
+2069(extension)X
+576 2688(of)N
+669(the)X
+793(existing)X
+1072(one.)X
+1234(This)X
+1401(existing)X
+1679(back-end)X
+1999(provides)X
+2300(an)X
+576 2784(interpreter)N
+990(that)X
+1189(executes)X
+1545(a)X
+0 f F
+1660(METAFONT)X
+1 f F
+2080(character)X
+576 2880(de\256nition)N
+926(and)X
+1086(displays)X
+1392(the)X
+1534(de\256ned)X
+1814(character)X
+2154(on)X
+2278(the)X
+576 2976(screen.)N
+824(Figure)X
+1055(3)X
+1117(shows)X
+1339(the)X
+1459(dump)X
+1663(of)X
+1752(a)X
+1810(screen)X
+2038(containing)X
+576 3072(several)N
+833(windows,)X
+1171(one)X
+1316(showing)X
+1616(a)X
+0 f F
+1681(METAFONT)X
+1 f F
+2050(de\256nition,)X
+576 3168(another)N
+850(showing)X
+1154(the)X
+1285(result)X
+1496(of)X
+1596(its)X
+1704(interpretation,)X
+2190(and)X
+2340(a)X
+576 3264(third)N
+781(containing)X
+1172(the)X
+1323(P)X
+8 s 8 xH F
+1367(OST)X
+10 s 10 xH F
+1488(S)X
+8 s 8 xH F
+1532(CRIPT)X
+10 s 10 xH F
+1767(translation)X
+2158(of)X
+2278(the)X
+576 3360(de\256nition)N
+915(in)X
+1010(the)X
+1141(\256rst)X
+1298(window.)X
+1609(If)X
+1697(software)X
+2008(to)X
+2104(interpret)X
+576 3456(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1006(de\256nitions)X
+1382(were)X
+1578(available)X
+1907(here,)X
+2105(a)X
+2180(fourth)X
+576 3552(window)N
+856(could)X
+1057(be)X
+1156(set)X
+1268(up)X
+1371(showing)X
+1665(the)X
+1786(result)X
+1987(of)X
+2077(interpret-)X
+576 3648(ing)N
+719(the)X
+858(translation)X
+1237(of)X
+1345(the)X
+1484(third)X
+1676(window.)X
+1994(This)X
+2176(would)X
+576 3744(allow)N
+821(comparison)X
+1262(of)X
+1396(the)X
+1561(character's)X
+1982(appearances)X
+576 3840(without)N
+840(having)X
+1078(to)X
+1160(print)X
+1331(them)X
+1511(on)X
+1611(paper.)X
+3 f F
+576 4032(4)N
+676(The)X
+829(program)X
+1 f F
+576 4176(In)N
+672(the)X
+799(following)X
+1139(discussion,)X
+1522(the)X
+0 f F
+1650(METAFONT)X
+1 f F
+2021(program)X
+2323(is)X
+576 4272(often)N
+761(called)X
+973(just)X
+1108(\252)X
+0 f F
+1144(METAFONT)X
+1 f F
+1498(\272.)X
+735 4368(The)N
+0 f F
+882(METAFONT)X
+1 f F
+1245(program)X
+1540(has)X
+1670(been)X
+1845(written)X
+2095(so)X
+2189(that)X
+2332(it)X
+576 4464(can)N
+729(be)X
+846(made)X
+1061(to)X
+1164(run)X
+1312(e)X
+1348 MX
+(Fi)139 825 oc
+(ciently)S
+1672(in)X
+1774(a)X
+1850(wide)X
+2046(variety)X
+2309(of)X
+576 4560(operating)N
+911(environments)X
+1379(by)X
+1491(making)X
+1763(comparatively)X
+2255(few)X
+576 4656(changes.)N
+891(Such)X
+1087(\257exibility)X
+1433(is)X
+1522(possible)X
+1819(because)X
+2109(the)X
+2242(pro-)X
+576 4752(gram)N
+782(is)X
+876(written)X
+1145(in)X
+1249(the)X
+5 f F
+1389(WEB)X
+1 f F
+1575(language)X
+1907(which)X
+2145(is)X
+2240(at)X
+2340(a)X
+576 4848(higher)N
+818(level)X
+1011(than)X
+1186(Pascal.)X
+1448(The)X
+1609(preprocessing)X
+2091(step)X
+2256(that)X
+576 4944(converts)N
+5 f F
+872(WEB)X
+1 f F
+1040(to)X
+1126(Pascal)X
+1355(is)X
+1432(able)X
+1591(to)X
+1678(introduce)X
+2006(most)X
+2186(of)X
+2278(the)X
+576 5040(necessary)N
+943(re\256nements.)X
+1390(Semiautomatic)X
+1923(translation)X
+2314(to)X
+576 5136(other)N
+774(languages)X
+1129(is)X
+1216(also)X
+1379(feasible,)X
+1683(because)X
+1972(the)X
+2104(program)X
+576 5232(does)N
+751(not)X
+881(make)X
+1083(extensive)X
+1414(use)X
+1548(of)X
+1642(features)X
+1924(that)X
+2071(are)X
+2197(pecu-)X
+576 5328(liar)N
+703(to)X
+785(Pascal.)X
+735 5424(The)N
+893(program)X
+1198(has)X
+1339(two)X
+1493(important)X
+1838(variations:)X
+2210(First,)X
+576 5520(there)N
+771(is)X
+858(a)X
+928(long)X
+1104(and)X
+1253(slow)X
+1437(version)X
+1706(called)X
+9 s 9 xH 9 f F
+1931(INIMF)X
+10 s 10 xH 1 f F
+2127(,)X
+2180(which)X
+576 5616(does)N
+754(the)X
+884(extra)X
+1077(calculations)X
+1492(needed)X
+1752(to)X
+1846(initialize)X
+0 f F
+2158(META-)X
+576 5712(FONT)N
+1 f F
+741('s)X
+821(internal)X
+1088(tables.)X
+1317(It)X
+1388(has)X
+1517(to)X
+1601(be)X
+1699(run)X
+1828(\256rst.)X
+1994(It)X
+2065(initializes)X
+2520 672(everything)N
+2884(from)X
+3061(scratch)X
+3310(without)X
+3575(reading)X
+3837(a)X
+3895(base)X
+4060(\256le,)X
+4204(and)X
+2520 768(it)N
+2594(has)X
+2731(the)X
+2859(capability)X
+3205(of)X
+3301(dumping)X
+3614(a)X
+3679(base)X
+3851(\256le.)X
+4002(Secondly,)X
+2520 864(there)N
+2713(is)X
+2798(a)X
+2866(shorter)X
+3121(and)X
+3269(faster)X
+3480(production)X
+3859(version)X
+4128(called)X
+9 s 9 xH 9 f F
+2520 960(VIRMF)N
+10 s 10 xH 1 f F
+2744(,)X
+2785(which)X
+3002(cuts)X
+3151(the)X
+3269(initialization)X
+3693(to)X
+3775(a)X
+3831(bare)X
+3990(minimum.)X
+2520 1056(It)N
+2596(is)X
+2676(a)X
+2739(virgin)X
+2957(program)X
+3256(that)X
+3403(needs)X
+3613(to)X
+3702(input)X
+3893(a)X
+3957(base)X
+4128(\256le)X
+4258(in)X
+2520 1152(order)N
+2715(to)X
+2801(get)X
+2923(started.)X
+9 s 9 xH 9 f F
+3181(VIRMF)X
+10 s 10 xH 1 f F
+3429(typically)X
+3733(has)X
+3864(more)X
+4053(memory)X
+2520 1248(capacity)N
+2810(than)X
+9 s 9 xH 9 f F
+2970(INIMF)X
+10 s 10 xH 1 f F
+3166(,)X
+3208(because)X
+3485(it)X
+3551(does)X
+3720(not)X
+3845(need)X
+4020(the)X
+4141(space)X
+2520 1344(consumed)N
+2865(by)X
+2965(the)X
+3083(dumping)X
+3387(and)X
+3523(undumping)X
+3907(routines,)X
+4205(etc.)X
+2679 1440(In)N
+2792(order)X
+3008(to)X
+3116(generate)X
+3435(a)X
+3518(compiler)X
+3850(that)X
+4017(translates)X
+0 f F
+2520 1536(METAFONT)N
+1 f F
+2916(to)X
+3033(P)X
+8 s 8 xH F
+3077(OST)X
+10 s 10 xH F
+3198(S)X
+8 s 8 xH F
+3242(CRIPT)X
+10 s 10 xH F
+3424(,)X
+3499(additional)X
+3873(external)X
+4186(pro-)X
+2520 1632(cedures)N
+2807(and)X
+2964(functions)X
+3303(were)X
+3501(added)X
+3735(to)X
+3839(the)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 1728(program)N
+2829(so)X
+2937(that)X
+3094(it)X
+3175(runs)X
+3350(exactly)X
+3619(the)X
+3753(same)X
+3954(except)X
+4200(that)X
+2520 1824(when)N
+2715(it)X
+2780(asks)X
+2939(for)X
+3054(an)X
+3151(output)X
+3376(\256le)X
+3499(name,)X
+3715(it)X
+3781(asks)X
+3941(for)X
+4057(an)X
+4155(addi-)X
+2520 1920(tional)N
+2732(name,)X
+2956(for)X
+3080(the)X
+3208(extra)X
+3398(output)X
+3631(\256le)X
+3762(that)X
+3911(is)X
+3993(to)X
+4084(contain)X
+2520 2016(the)N
+2642(P)X
+8 s 8 xH F
+2686(OST)X
+10 s 10 xH F
+2807(S)X
+8 s 8 xH F
+2851(CRIPT)X
+10 s 10 xH F
+3057(outlines.)X
+3354(Those)X
+3575(changes)X
+3859(were)X
+4041(made)X
+4240(on)X
+2520 2112(the)N
+2654(Pascal)X
+2894(version)X
+3165(of)X
+3267(the)X
+9 s 9 xH 9 f F
+3400(VIRMF)X
+10 s 10 xH 1 f F
+3624(,)X
+3679(and)X
+3830(were)X
+4022(compiled)X
+2520 2208(later)N
+2687(with)X
+0 f F
+2853(METAFONT)X
+1 f F
+3194('s)X
+3277(library)X
+3516(\256les.)X
+3714(\(It)X
+3815(was)X
+3965(a)X
+4026(complete)X
+2520 2304(oversight)N
+2840(on)X
+2942(our)X
+3071(part)X
+3218(not)X
+3342(to)X
+3426(have)X
+3600(modi\256ed)X
+3906(the)X
+5 f F
+4025(WEB)X
+1 f F
+4190(ver-)X
+2520 2400(sion)N
+2683(of)X
+9 s 9 xH 9 f F
+2781(VIRMF)X
+10 s 10 xH 1 f F
+3005(.\))X
+3103(A)X
+3192(few)X
+3344(extra)X
+3536(lines)X
+3718(were)X
+3906(added)X
+4129(to)X
+4222(the)X
+2520 2496(macro)N
+2750(\256le,)X
+5 f F
+2901(plain.mf)X
+1 f F
+(.)S
+3333(These)X
+3553(act)X
+3675(as)X
+3770(\257ags,)X
+3969(identifying)X
+2520 2592(that)N
+0 f F
+2660(METAFONT)X
+1 f F
+3021(has)X
+3148(entered)X
+3405(some)X
+3594(of)X
+3681(the)X
+3799(macros.)X
+3 f F
+2520 2784(4.1)N
+2680(Basic)X
+2890(idea.)X
+1 f F
+3100(To)X
+3217(specify)X
+3478(a)X
+3543(character)X
+3868(in)X
+0 f F
+3959(METAFONT)X
+1 f F
+4300(,)X
+2520 2880(one)N
+2668(speci\256es)X
+2976(either)X
+3191(an)X
+3299(envelope)X
+3621(\(outline\))X
+3929(or)X
+4028(a)X
+4096(center-)X
+2520 2976(line)N
+2672(path)X
+2842(and)X
+2990(a)X
+3058(pen)X
+3207(head.)X
+3432(For)X
+3576(the)X
+3707(former,)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 3072(just)N
+2665(\256lls)X
+2814(the)X
+2942(envelope)X
+3262(with)X
+3434(bits.)X
+3619(For)X
+3760(the)X
+3888(latter,)X
+0 f F
+4102(META-)X
+2520 3168(FONT)N
+1 f F
+2719(pretends)X
+3025(that)X
+3179(it)X
+3257(is)X
+3345(drawing)X
+3643(the)X
+3776(character)X
+4107(with)X
+4284(a)X
+2520 3264(pen)N
+2680(of)X
+2791(speci\256ed)X
+3119(head)X
+3314(shape)X
+3540(following)X
+3894(the)X
+4035(speci\256ed)X
+2520 3360(path,)N
+2704(i.e.,)X
+2848(the)X
+2972(center)X
+3195(of)X
+3288(the)X
+3412(head)X
+3591(stays)X
+3778(on)X
+3885(the)X
+4010(path.)X
+4195(The)X
+2520 3456(distance)N
+2806(from)X
+2984(the)X
+3104(center-line)X
+3470(path)X
+3630(and)X
+3768(outer)X
+3955(edge)X
+4129(of)X
+4218(ink)X
+2520 3552(trail)N
+2671(left)X
+2800(by)X
+2902(pen)X
+3040(head)X
+3215(is)X
+3291(called)X
+3506(the)X
+2 f F
+3627(o)X
+(ff)138 495 oc
+3707(set)X
+1 f F
+3788(.)X
+3851(So,)X
+3978(for)X
+4095(a)X
+4154(char-)X
+2520 3648(acter,)N
+0 f F
+2726(METAFONT)X
+1 f F
+3096(follows)X
+3365(the)X
+3492(center-line)X
+3865(path)X
+4032(to)X
+4123(calcu-)X
+2520 3744(late)N
+2656(the)X
+2775(path)X
+2934(of)X
+3022(o)X
+(ff)138 606 oc
+3110(set)X
+3220(points,)X
+3456(i.e.,)X
+3595(the)X
+3714(envelope,)X
+4045(and)X
+4182(then)X
+2520 3840(\256lls)N
+2670(the)X
+2799(envelope)X
+3120(with)X
+3293(bits.)X
+3479(In)X
+3577(either)X
+3790(case,)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 3936(ends)N
+2687(up)X
+2787(\256lling)X
+2997(an)X
+3093(envelope.)X
+2679 4032(We)N
+2812(need)X
+2985(to)X
+3068(break)X
+0 f F
+3268(METAFONT)X
+1 f F
+3630(into)X
+3775(a)X
+3832(front)X
+4009(end)X
+4146(and)X
+4284(a)X
+2520 4128(back)N
+2703(end)X
+2850(at)X
+2938(the)X
+3066(point)X
+3260(just)X
+3405(after)X
+3583(the)X
+3711(envelope)X
+4031(has)X
+4168(been)X
+2520 4224(calculated.)N
+2893(Then)X
+3085(we)X
+3206(provide)X
+3479(a)X
+3543(new)X
+3705(back)X
+3885(end)X
+4029(that)X
+4177(con-)X
+2520 4320(verts)N
+2713(the)X
+2848(envelope)X
+3175(into)X
+3336(P)X
+8 s 8 xH F
+3380(OST)X
+10 s 10 xH F
+3501(S)X
+8 s 8 xH F
+3545(CRIPT)X
+10 s 10 xH F
+3764(instead)X
+4027(of)X
+4130(\256lling)X
+2520 4416(the)N
+2647(envelope)X
+2966(with)X
+3137(bits.)X
+3301(Note)X
+3486(then)X
+3653(that)X
+3802(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4512(printer)N
+2765(will)X
+2920(\256ll)X
+3039(in)X
+3132(the)X
+3261(envelope)X
+3582(with)X
+3755(bits)X
+3901(as)X
+3999(it)X
+4073(\256lls)X
+4222(the)X
+2520 4608(path)N
+2678(obtained)X
+2974(from)X
+3150(the)X
+3268(envelope.)X
+2679 4704(The)N
+2840(following)X
+3187(subsections)X
+3593(describe)X
+3898(the)X
+4033(data)X
+4204(and)X
+2520 4800(the)N
+2638(calculations)X
+3041(involved)X
+3341(in)X
+3423(the)X
+3541(new)X
+3695(back)X
+3867(end.)X
+3 f F
+2520 4992(4.2)N
+2680(Data)X
+2884(structures.)X
+1 f F
+3311(The)X
+3475(main)X
+3674(data)X
+3848(structures)X
+4200(that)X
+0 f F
+2520 5088(METAFONT)N
+1 f F
+2906(keeps)X
+3133(for)X
+3271(a)X
+3351(character)X
+3691(are)X
+3834(the)X
+3976(center-line)X
+2520 5184(path,)N
+2702(the)X
+2824(pen)X
+2964(shape,)X
+3191(and)X
+3331(the)X
+3453(envelope)X
+3767(path.)X
+3949(There)X
+4161(are)X
+4284(a)X
+2520 5280(few)N
+2672(operations)X
+3036(that)X
+3186(can)X
+3328(be)X
+3434(performed)X
+3799(on)X
+3909(paths,)X
+4128(called)X
+2520 5376(transformations.)N
+3 f F
+2679 5472(4.2.1)N
+0 f F
+2899(METAFONT)X
+3 f F
+3240('s)X
+3323(path)X
+3503(representation.)X
+1 f F
+4067(When)X
+4284(a)X
+0 f F
+2520 5568(METAFONT)N
+1 f F
+2898(user)X
+3069(speci\256es)X
+3381(a)X
+3453(path,)X
+0 f F
+3647(METAFONT)X
+1 f F
+4024(creates)X
+4284(a)X
+2520 5664(list)N
+2642(of)X
+2734(knots)X
+2932(and)X
+3073(control)X
+3325(points)X
+3546(for)X
+3666(the)X
+3790(associated)X
+4146(cubic)X
+2465 6084(6)N
+
+%%Page: 7 8
+7 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(spline)N
+793(curves.)X
+1049(If)X
+1129(the)X
+1252(knots)X
+1450(are)X
+2 f F
+1574(z)X
+7 s 7 xH 1 f F
+1614 688(0)N
+10 s 10 xH F
+1648 672(,)N
+2 f F
+1694(z)X
+7 s 7 xH 1 f F
+1734 688(1)N
+10 s 10 xH F
+1768 672(,)N
+1808(.)X
+1848(.)X
+1888(.)X
+1928(,)X
+2 f F
+1981(z)X
+7 s 7 xH F
+2012 688(n)N
+10 s 10 xH 1 f F
+2046 672(,)N
+2091(there)X
+2277(are)X
+576 768(control)N
+835(points)X
+2 f F
+1062(z)X
+7 s 7 xH F
+1097 783(k)N
+47 f F
+1097 736(+)N
+10 s 10 xH 1 f F
+1167 768(and)N
+2 f F
+1316(z)X
+7 s 7 xH F
+1351 783(k)N
+47 f F
+1385(+)X
+1 f F
+1416(1)X
+47 f F
+1351 736(-)N
+10 s 10 xH 1 f F
+1483 768(such)N
+1663(that)X
+1816(the)X
+1947(cubic)X
+2154(splines)X
+576 864(between)N
+867(the)X
+988(knots)X
+2 f F
+1184(z)X
+7 s 7 xH F
+1215 880(k)N
+10 s 10 xH 1 f F
+1269 864(and)N
+2 f F
+1408(z)X
+7 s 7 xH F
+1439 880(k)N
+47 f F
+1473(+)X
+1 f F
+1504(1)X
+10 s 10 xH F
+1561 864(are)N
+1683(de\256ned)X
+1942(by)X
+2045(the)X
+2165(Be)X
+2223(\302zier)X
+576 960(formula)N
+2 f F
+828 1152(z)N
+1 f F
+872(\()X
+2 f F
+899(t)X
+1 f F
+927(\))X
+47 f F
+974(=)X
+2 f F
+1038(B)X
+1 f F
+1100(\()X
+2 f F
+1127(z)X
+7 s 7 xH F
+1158 1168(k)N
+1 f F
+1183(,)X
+10 s 10 xH 2 f F
+1207 1152(z)N
+7 s 7 xH F
+1242 1167(k)N
+47 f F
+1242 1120(+)N
+10 s 10 xH 1 f F
+1279 1152(,)N
+2 f F
+1305(z)X
+7 s 7 xH F
+1340 1167(k)N
+47 f F
+1374(+)X
+1 f F
+1405(1)X
+47 f F
+1340 1120(-)N
+10 s 10 xH 1 f F
+1439 1152(,)N
+2 f F
+1465(z)X
+7 s 7 xH F
+1496 1168(k)N
+47 f F
+1530(+)X
+1 f F
+1561(1)X
+10 s 10 xH F
+1595 1152(;)N
+2 f F
+1617(t)X
+1 f F
+1645(\))X
+47 f F
+974 1267(=)N
+1 f F
+1038(\(1)X
+47 f F
+1125(-)X
+2 f F
+1189(t)X
+1 f F
+1217(\))X
+7 s 7 xH F
+1244 1235(3)N
+10 s 10 xH 2 f F
+1278 1267(z)N
+7 s 7 xH F
+1309 1283(k)N
+10 s 10 xH 47 f F
+1360 1267(+)N
+1 f F
+1424(3)X
+2 f F
+(t)S
+1 f F
+1499(\()X
+2 f F
+1526(t)X
+47 f F
+1574(-)X
+1 f F
+1638(1\))X
+7 s 7 xH F
+1705 1235(2)N
+10 s 10 xH 2 f F
+1739 1267(z)N
+7 s 7 xH F
+1774 1282(k)N
+47 f F
+1774 1235(+)N
+10 s 10 xH F
+1308 1382(+)N
+1 f F
+1372(3)X
+2 f F
+(t)S
+7 s 7 xH 1 f F
+1443 1350(2)N
+10 s 10 xH F
+1477 1382(\(1)N
+47 f F
+1564(-)X
+2 f F
+1628(t)X
+1 f F
+1656(\))X
+2 f F
+1683(z)X
+7 s 7 xH F
+1718 1397(k)N
+47 f F
+1752(+)X
+1 f F
+1783(1)X
+47 f F
+1718 1350(-)N
+10 s 10 xH F
+1843 1382(+)N
+2 f F
+1907(t)X
+7 s 7 xH 1 f F
+1938 1350(3)N
+10 s 10 xH 2 f F
+1972 1382(z)N
+7 s 7 xH F
+2003 1398(k)N
+47 f F
+2037(+)X
+1 f F
+2068(1)X
+10 s 10 xH F
+2102 1382(,)N
+576 1574(for)N
+690(0)X
+47 f F
+750(\243)X
+2 f F
+814(t)X
+47 f F
+862(\243)X
+1 f F
+926(1.)X
+735 1670(There)N
+950(is)X
+1030(a)X
+1093(7-word)X
+1352(node)X
+1535(for)X
+1657(each)X
+1833(knot)X
+2 f F
+2003(z)X
+7 s 7 xH F
+2034 1686(k)N
+10 s 10 xH 1 f F
+2065 1670(,)N
+2113(contain-)X
+576 1766(ing)N
+706(one)X
+850(word)X
+1043(of)X
+1137(control)X
+1391(information)X
+1796(and)X
+1939(six)X
+2059(words)X
+2282(for)X
+576 1862(the)N
+2 f F
+696(x)X
+1 f F
+754(and)X
+2 f F
+892(y)X
+1 f F
+950(coordinates)X
+1342(of)X
+2 f F
+1431(z)X
+7 s 7 xH F
+1466 1877(k)N
+47 f F
+1466 1830(-)N
+10 s 10 xH 1 f F
+1525 1862(and)N
+2 f F
+1663(z)X
+7 s 7 xH F
+1694 1878(k)N
+10 s 10 xH 1 f F
+1747 1862(and)N
+2 f F
+1886(z)X
+7 s 7 xH F
+1921 1877(k)N
+47 f F
+1921 1830(+)N
+10 s 10 xH 1 f F
+1958 1862(.)N
+2001(The)X
+2149(control)X
+576 1958(information)N
+1004(appears)X
+1299(in)X
+1410(the)X
+2 f F
+1557(left_type)X
+1 f F
+1882(and)X
+2 f F
+2047(right_type)X
+1 f F
+576 2054(\256elds)N
+789(and)X
+945(they)X
+1123(specify)X
+1395(properties)X
+1757(of)X
+1865(the)X
+2004(curve)X
+2224(as)X
+2332(it)X
+576 2150(enters)N
+803(and)X
+954(leaves)X
+1190(the)X
+1322(knot.)X
+1518(There)X
+1740(is)X
+1827(also)X
+1990(a)X
+2 f F
+2060(link)X
+1 f F
+2214(\256eld,)X
+576 2246(which)N
+803(points)X
+1029(to)X
+1122(the)X
+1251(following)X
+1593(knot.)X
+1786(Before)X
+2036(the)X
+2165(Be)X
+2223(\302zier)X
+576 2342(control)N
+830(points)X
+1052(have)X
+1230(been)X
+1408(calculated,)X
+1780(the)X
+1904(memory)X
+2197(space)X
+576 2438(they)N
+741(will)X
+892(ultimately)X
+1243(occupy)X
+1502(is)X
+1582(taken)X
+1783(up)X
+1890(by)X
+1998(information)X
+576 2534(that)N
+742(can)X
+899(be)X
+1020(used)X
+1212(to)X
+1319(compute)X
+1640(them.)X
+1865(The)X
+0 f F
+2035(METAFONT)X
+2 f F
+576 2630(make_choices)N
+1 f F
+1072(procedure)X
+1439(chooses)X
+1738(angles)X
+1988(and)X
+2149(control)X
+576 2726(points)N
+798(for)X
+919(the)X
+1044(splines)X
+1293(of)X
+1387(a)X
+1450(curve)X
+1656(when)X
+1857(the)X
+1981(user)X
+2141(has)X
+2274(not)X
+576 2822(speci\256ed)N
+881(them)X
+1061(explicitly.)X
+3 f F
+735 2918(4.2.2)N
+0 f F
+955(METAFONT)X
+3 f F
+1296('s)X
+1392(path)X
+1585(transformation.)X
+1 f F
+2184(When)X
+0 f F
+576 3014(METAFONT)N
+1 f F
+952(digitizes)X
+1258(a)X
+1329(path,)X
+1522(it)X
+1601(reduces)X
+1881(the)X
+2013(problem)X
+2314(to)X
+576 3110(the)N
+705(special)X
+959(case)X
+1129(of)X
+1228(paths)X
+1429(that)X
+1581(travel)X
+1796(in)X
+1890(the)X
+2 f F
+2020(\256rst)X
+2176(octant)X
+1 f F
+576 3206(directions;)N
+938(i.e.,)X
+1080(each)X
+1252(cubic)X
+2 f F
+1449(z)X
+1 f F
+1493(\()X
+2 f F
+1520(t)X
+1 f F
+1548(\))X
+47 f F
+1595(=)X
+1 f F
+1659(\()X
+2 f F
+1686(x)X
+1 f F
+1735(\()X
+2 f F
+1762(t)X
+1 f F
+1790(\),)X
+2 f F
+1843(y)X
+1 f F
+1892(\()X
+2 f F
+1919(t)X
+1 f F
+1947(\)\))X
+2024(being)X
+2225(digi-)X
+576 3302(tized)N
+763(will)X
+918(have)X
+1101(the)X
+1230(property)X
+1534(that)X
+1686(0)X
+47 f F
+1746(\243)X
+2 f F
+1810(y)X
+47 f F
+1852(\242)X
+1 f F
+1872(\()X
+2 f F
+1899(t)X
+1 f F
+1927(\))X
+47 f F
+1974(\243)X
+2 f F
+2038(x)X
+47 f F
+2080(\242)X
+1 f F
+2100(\()X
+2 f F
+2127(t)X
+1 f F
+2155(\).)X
+2234(This)X
+576 3398(assumption)N
+969(makes)X
+1203(digitizing)X
+1538(simpler)X
+1807(and)X
+1952(faster)X
+2160(than)X
+2327(if)X
+576 3494(the)N
+716(direction)X
+1043(of)X
+1152(motion)X
+1420(has)X
+1569(to)X
+1673(be)X
+1791(tested)X
+2021(repeatedly.)X
+576 3590(When)N
+2 f F
+793(z)X
+1 f F
+837(\()X
+2 f F
+864(t)X
+1 f F
+892(\))X
+944(is)X
+1022(cubic,)X
+2 f F
+1241(x)X
+47 f F
+1283(\242)X
+1 f F
+1303(\()X
+2 f F
+1330(t)X
+1 f F
+1358(\))X
+1410(and)X
+2 f F
+1551(y)X
+47 f F
+1593(\242)X
+1 f F
+1613(\()X
+2 f F
+1640(t)X
+1 f F
+1668(\))X
+1720(are)X
+1844(quadratic,)X
+2188(hence)X
+576 3686(each)N
+760(of)X
+864(the)X
+999(four)X
+1170(polynomials,)X
+2 f F
+1622(x)X
+47 f F
+1664(\242)X
+1 f F
+1684(\()X
+2 f F
+1711(t)X
+1 f F
+1739(\),)X
+2 f F
+1823(y)X
+47 f F
+1865(\242)X
+1 f F
+1885(\()X
+2 f F
+1912(t)X
+1 f F
+1940(\),)X
+2 f F
+2024(x)X
+47 f F
+2066(\242)X
+1 f F
+2086(\()X
+2 f F
+2113(t)X
+1 f F
+2141(\))X
+47 f F
+2168(-)X
+2 f F
+2212(y)X
+47 f F
+2254(\242)X
+1 f F
+2274(\()X
+2 f F
+2301(t)X
+1 f F
+2329(\),)X
+576 3782(and)N
+2 f F
+721(x)X
+47 f F
+763(\242)X
+1 f F
+783(\()X
+2 f F
+810(t)X
+1 f F
+838(\))X
+47 f F
+865(+)X
+2 f F
+909(y)X
+47 f F
+951(\242)X
+1 f F
+971(\()X
+2 f F
+998(t)X
+1 f F
+1026(\),)X
+1102(crosses)X
+1363(through)X
+1641(0)X
+1709(at)X
+1795(most)X
+1978(twice.)X
+2200(If)X
+2282(we)X
+576 3878(subdivide)N
+925(the)X
+1061(given)X
+1277(cubic)X
+1489(at)X
+1585(these)X
+1788(places,)X
+2048(we)X
+2181(get)X
+2318(at)X
+576 3974(most)N
+760(nine)X
+927(subintervals.)X
+1363(In)X
+1459(each)X
+1636(of)X
+1731(these)X
+1924(intervals)X
+2228(each)X
+576 4070(of)N
+2 f F
+667(x)X
+47 f F
+709(\242)X
+1 f F
+729(\()X
+2 f F
+756(t)X
+1 f F
+784(\),)X
+2 f F
+855(y)X
+47 f F
+897(\242)X
+1 f F
+917(\()X
+2 f F
+944(t)X
+1 f F
+972(\),)X
+2 f F
+1043(x)X
+47 f F
+1085(\242)X
+1 f F
+1105(\()X
+2 f F
+1132(t)X
+1 f F
+1160(\))X
+47 f F
+1187(-)X
+2 f F
+1231(y)X
+47 f F
+1273(\242)X
+1 f F
+1293(\()X
+2 f F
+1320(t)X
+1 f F
+1348(\),)X
+1419(and)X
+2 f F
+1559(x)X
+47 f F
+1601(\242)X
+1 f F
+1621(\()X
+2 f F
+1648(t)X
+1 f F
+1676(\))X
+47 f F
+1703(+)X
+2 f F
+1747(y)X
+47 f F
+1789(\242)X
+1 f F
+1809(\()X
+2 f F
+1836(t)X
+1 f F
+1864(\))X
+1916(has)X
+2048(a)X
+2109(constant)X
+576 4166(sign.)N
+766(The)X
+927(curve)X
+1142(can)X
+1290(be)X
+1402(transformed)X
+1826(in)X
+1924(each)X
+2108(of)X
+2211(these)X
+576 4262(subintervals)N
+1005(so)X
+1118(that)X
+1280(it)X
+1366(travels)X
+1622(entirely)X
+1909(in)X
+2013(\256rst)X
+2180(octant)X
+576 4358(directions,)N
+933(if)X
+1003(we)X
+1118(exchange)X
+2 f F
+1443(x)X
+1 f F
+1500(and)X
+47 f F
+1636(-)X
+2 f F
+1680(x)X
+1 f F
+1716(,)X
+2 f F
+1756(y)X
+1 f F
+1812(and)X
+47 f F
+1948(-)X
+2 f F
+1992(y)X
+1 f F
+2028(,)X
+2068(and)X
+2 f F
+2204(x)X
+1 f F
+2260(and)X
+2 f F
+576 4454(y)N
+1 f F
+632(as)X
+719(necessary.)X
+3 f F
+576 4646(4.3)N
+736(Pens)X
+923(and)X
+1078(envelopes.)X
+1 f F
+1474(There)X
+1689(are)X
+1816(two)X
+1964(kinds)X
+2165(of)X
+2260(pen)X
+576 4742(heads)N
+791(that)X
+943(may)X
+1112(be)X
+1219(used,)X
+1417(polygonal)X
+1768(and)X
+1915(elliptic.)X
+2188(There)X
+576 4838(are)N
+708(a)X
+778(number)X
+1057(of)X
+1158(trade-o)X
+1386 MX
+(ff)138 606 oc
+1434(s)X
+1499(involved)X
+1813(in)X
+1909(their)X
+2090(use.)X
+2251(The)X
+576 4934(\256rst)N
+725(subsection)X
+1088(treats)X
+1287(the)X
+1410(case)X
+1573(of)X
+1664(an)X
+2 f F
+1764(n)X
+1 f F
+(-vertex)S
+2056(polygonal)X
+576 5030(pen)N
+715(shape)X
+921(and)X
+1060(the)X
+1181(second)X
+1427(treats)X
+1624(the)X
+1745(case)X
+1907(of)X
+1997(an)X
+2096(elliptical)X
+576 5126(pen)N
+717(shape.)X
+945(Both)X
+1125(describe)X
+1418(the)X
+1540(in\257uence)X
+1858(of)X
+1949(pen)X
+2089(shape)X
+2296(on)X
+576 5222(the)N
+694(envelope)X
+1004(of)X
+1091(the)X
+1209(font.)X
+3 f F
+735 5318(4.3.1)N
+955(Polygonal)X
+1322(pens.)X
+1 f F
+1547(Suppose)X
+1848(that)X
+1998(the)X
+2126(vertices)X
+576 5414(of)N
+672(a)X
+737(polygon)X
+1028(are)X
+2 f F
+1156(w)X
+7 s 7 xH 1 f F
+1218 5430(0)N
+10 s 10 xH F
+1252 5414(,)N
+2 f F
+1298(w)X
+7 s 7 xH 1 f F
+1360 5430(1)N
+10 s 10 xH F
+1394 5414(,)N
+1434(.)X
+1474(.)X
+1514(.)X
+1554(,)X
+2 f F
+1607(w)X
+7 s 7 xH F
+1660 5430(n)N
+47 f F
+1697(-)X
+1 f F
+1728(1)X
+10 s 10 xH F
+1762 5414(,)N
+2 f F
+1808(w)X
+7 s 7 xH F
+1861 5430(n)N
+10 s 10 xH 47 f F
+1915 5414(=)N
+2 f F
+1979(w)X
+7 s 7 xH 1 f F
+2041 5430(0)N
+10 s 10 xH F
+2103 5414(in)N
+2193(coun-)X
+576 5510(terclockwise)N
+1006(order.)X
+1221(A)X
+1304(convexity)X
+1645(condition)X
+1972(requires)X
+2256(that)X
+576 5606(each)N
+757(vertex)X
+991(turns)X
+1184(left)X
+1324(when)X
+1531(one)X
+1680(proceeds)X
+1998(from)X
+2 f F
+2186(w)X
+7 s 7 xH 1 f F
+2248 5622(0)N
+10 s 10 xH F
+2314 5606(to)N
+2 f F
+576 5702(w)N
+7 s 7 xH 1 f F
+638 5718(1)N
+10 s 10 xH F
+718 5678(.)N
+758(.)X
+798(.)X
+864 5702(to)N
+2 f F
+953(w)X
+7 s 7 xH F
+1006 5718(n)N
+10 s 10 xH 1 f F
+1040 5702(.)N
+1087(The)X
+1239(envelope)X
+1556(is)X
+1636(obtained)X
+1939(if)X
+2015(we)X
+2136(o)X
+(ff)138 606 oc
+2224(set)X
+2340(a)X
+2520 672(given)N
+2721(curve)X
+2 f F
+2923(z)X
+1 f F
+2967(\()X
+2 f F
+2994(t)X
+1 f F
+3022(\))X
+3071(by)X
+2 f F
+3173(w)X
+7 s 7 xH F
+3226 688(k)N
+10 s 10 xH 1 f F
+3279 672(when)N
+3475(that)X
+3617(curve)X
+3818(is)X
+3893(traveling)X
+4200(in)X
+4284(a)X
+2520 768(direction)N
+2 f F
+2846(z)X
+47 f F
+2883(\242)X
+1 f F
+2903(\()X
+2 f F
+2930(t)X
+1 f F
+2958(\))X
+3026(lying)X
+3232(between)X
+3542(the)X
+3682(directions)X
+2 f F
+4040(w)X
+7 s 7 xH F
+4093 784(k)N
+10 s 10 xH 47 f F
+4124 768(-)N
+2 f F
+4168(w)X
+7 s 7 xH F
+4221 784(k)N
+47 f F
+4255(-)X
+1 f F
+4286(1)X
+10 s 10 xH F
+2520 864(and)N
+2 f F
+2662(w)X
+7 s 7 xH F
+2715 880(k)N
+47 f F
+2749(+)X
+1 f F
+2780(1)X
+10 s 10 xH 47 f F
+2814 864(-)N
+2 f F
+2858(w)X
+7 s 7 xH F
+2911 880(k)N
+10 s 10 xH 1 f F
+2942 864(.)N
+2988(At)X
+3094(times)X
+2 f F
+3293(t)X
+1 f F
+3341(when)X
+3541(the)X
+3665(curve)X
+3870(direction)X
+2 f F
+4181(z)X
+47 f F
+4218(\242)X
+1 f F
+4238(\()X
+2 f F
+4265(t)X
+1 f F
+4293(\))X
+2520 960(increases)N
+2854(past)X
+2 f F
+3022(w)X
+7 s 7 xH F
+3075 976(k)N
+47 f F
+3109(+)X
+1 f F
+3140(1)X
+10 s 10 xH 47 f F
+3174 960(-)N
+2 f F
+3218(w)X
+7 s 7 xH F
+3271 976(k)N
+10 s 10 xH 1 f F
+3302 960(,)N
+0 f F
+3361(METAFONT)X
+1 f F
+3742(temporarily)X
+4156(stops)X
+2520 1056(plotting)N
+2793(the)X
+2916(o)X
+(ff)138 606 oc
+3004(set)X
+3118(curve)X
+3322(and)X
+3463(inserts)X
+3696(a)X
+3756(straight)X
+4020(line)X
+4164(from)X
+2 f F
+2520 1152(z)N
+1 f F
+2564(\()X
+2 f F
+2591(t)X
+1 f F
+2619(\))X
+47 f F
+2646(+)X
+2 f F
+2690(w)X
+7 s 7 xH F
+2743 1168(k)N
+10 s 10 xH 1 f F
+2811 1152(to)N
+2 f F
+2910(z)X
+1 f F
+2954(\()X
+2 f F
+2981(t)X
+1 f F
+3009(\))X
+47 f F
+3036(+)X
+2 f F
+3080(w)X
+7 s 7 xH F
+3133 1168(k)N
+47 f F
+3167(+)X
+1 f F
+3198(1)X
+10 s 10 xH F
+3232 1152(;)N
+3291(notice)X
+3524(that)X
+3681(this)X
+3833(straight)X
+4110(line)X
+4267(is)X
+2520 1248(tangent)N
+2789(to)X
+2884(the)X
+3015(o)X
+(ff)138 606 oc
+3103(set)X
+3225(curve.)X
+3456(Similarly,)X
+3805(when)X
+4011(the)X
+4141(curve)X
+2520 1344(direction)N
+2825(decreases)X
+3154(past)X
+2 f F
+3303(w)X
+7 s 7 xH F
+3356 1360(k)N
+10 s 10 xH 47 f F
+3387 1344(-)N
+2 f F
+3431(w)X
+7 s 7 xH F
+3484 1360(k)N
+47 f F
+3518(-)X
+1 f F
+3549(1)X
+10 s 10 xH F
+3583 1344(,)N
+0 f F
+3623(METAFONT)X
+1 f F
+3984(stops)X
+4169(plot-)X
+2520 1440(ting)N
+2705(and)X
+2882(inserts)X
+3152(a)X
+3248(straight)X
+3548(line)X
+3728(from)X
+2 f F
+3944(z)X
+1 f F
+3988(\()X
+2 f F
+4015(t)X
+1 f F
+4043(\))X
+47 f F
+4070(+)X
+2 f F
+4114(w)X
+7 s 7 xH F
+4167 1456(k)N
+10 s 10 xH 1 f F
+4258 1440(to)N
+2 f F
+2520 1536(z)N
+1 f F
+2564(\()X
+2 f F
+2591(t)X
+1 f F
+2619(\))X
+47 f F
+2646(+)X
+2 f F
+2690(w)X
+7 s 7 xH F
+2743 1552(k)N
+47 f F
+2777(-)X
+1 f F
+2808(1)X
+10 s 10 xH F
+2842 1536(;)N
+2895(the)X
+3024(latter)X
+3220(line)X
+3371(is)X
+3455(actually)X
+3740(a)X
+3808(retrograde)X
+4171(step,)X
+2520 1632(which)N
+2761(will)X
+2929(not)X
+3075(be)X
+3195(part)X
+3364(of)X
+3475(the)X
+3617(\256nal)X
+3803(envelope)X
+4137(under)X
+0 f F
+2520 1728(METAFONT)N
+1 f F
+2861('s)X
+2946(assumptions.)X
+3388(The)X
+3541(result)X
+3747(of)X
+3842(this)X
+3985(considera-)X
+2520 1824(tion)N
+2684(is)X
+2777(a)X
+2853(continuous)X
+3243(path)X
+3420(that)X
+3579(consists)X
+3871(of)X
+3977(alternating)X
+2520 1920(curves)N
+2769(and)X
+2924(straight)X
+3203(line)X
+3362(segments.)X
+3719(The)X
+3883(segments)X
+4221(are)X
+2520 2016(usually)N
+2785(so)X
+2890(short,)X
+3104(in)X
+3200(practice,)X
+3509(that)X
+3663(they)X
+3835(blend)X
+4047(with)X
+4222(the)X
+2520 2112(curves.)N
+3 f F
+2679 2208(4.3.2)N
+2899(Elliptical)X
+3243(pens.)X
+1 f F
+3472(To)X
+3595(get)X
+3727(the)X
+3859(envelope)X
+4183(of)X
+4284(a)X
+2520 2304(cyclic)N
+2737(path)X
+2900(with)X
+3067(respect)X
+3319(to)X
+3405(an)X
+3505(ellipse,)X
+0 f F
+3758(METAFONT)X
+1 f F
+4123(calcu-)X
+2520 2400(lates)N
+2692(the)X
+2815(envelope)X
+3130(with)X
+3298(respect)X
+3552(to)X
+3640(a)X
+3702(polygonal)X
+4048(approxi-)X
+2520 2496(mation)N
+2779(to)X
+2878(the)X
+3012(ellipse.)X
+3277(This)X
+3455(has)X
+3598(two)X
+3754(important)X
+4101(advan-)X
+2520 2592(tages)N
+2705(over)X
+2868(trying)X
+3079(to)X
+3161(obtain)X
+3381(the)X
+3499(exact)X
+3689(envelope:)X
+2583 2736(1.)N
+2679(Polygonal)X
+3041(envelopes)X
+3400(give)X
+3576(better)X
+3797(results,)X
+4065(because)X
+2679 2832(the)N
+2801(polygon)X
+3087(has)X
+3218(been)X
+3394(designed)X
+3703(to)X
+3788(counteract)X
+4146(prob-)X
+2679 2928(lems)N
+2882(that)X
+3054(arise)X
+3259(from)X
+3468(digitization;)X
+3907(the)X
+4058(polygon)X
+2679 3024(includes)N
+2980(sub-pixel)X
+3312(corrections)X
+3703(to)X
+3799(an)X
+3908(exact)X
+4111(ellipse)X
+2679 3120(that)N
+2839(make)X
+3053(the)X
+3191(results)X
+3441(essentially)X
+3820(independent)X
+4253(of)X
+2679 3216(where)N
+2896(the)X
+3014(path)X
+3172(falls)X
+3330(on)X
+3430(the)X
+3548(raster.)X
+2583 3360(2.)N
+2679(Polygonal)X
+3046(envelopes)X
+3410(of)X
+3520(cubic)X
+3737(splines)X
+4003(are)X
+4146(cubic)X
+2679 3456(splines.)N
+2967(Hence)X
+3218(it)X
+3307(is)X
+3405(not)X
+3552(necessary)X
+3910(to)X
+4017(introduce)X
+2679 3552(completely)N
+3074(di)X
+3136 MX
+(ff)138 606 oc
+3184(erent)X
+3385(routines.)X
+3703(By)X
+3836(contrast,)X
+4150(exact)X
+2679 3648(envelopes)N
+3027(of)X
+3121(cubic)X
+3322(splines)X
+3570(with)X
+3738(respect)X
+3992(to)X
+4080(ellipses)X
+2679 3744(are)N
+2804(complicated)X
+3222(curves,)X
+3478(more)X
+3669(di)X
+3731 MX
+(Fi)139 825 oc
+(cult)S
+3943(to)X
+4031(plot)X
+4182(than)X
+2679 3840(cubics.)N
+3 f F
+2520 4032(4.4)N
+2680(Taking)X
+2948(out)X
+3084(data.)X
+1 f F
+3300(After)X
+0 f F
+3495(METAFONT)X
+1 f F
+3861(has)X
+3994(calculated)X
+2520 4128(the)N
+2639(paths)X
+2828(and)X
+2964(the)X
+3082(o)X
+(ff)138 606 oc
+3170(sets,)X
+3330(it)X
+3394(is)X
+3467(ready)X
+3666(to)X
+3748(send)X
+3915(the)X
+4033(values)X
+4258(to)X
+2520 4224(the)N
+2 f F
+2661(make_moves)X
+1 f F
+3116(procedure)X
+3482(which)X
+3722(generates)X
+4070(discrete)X
+2520 4320(moves)N
+2751(for)X
+2867(any)X
+3004(four)X
+3159(points)X
+3375(that)X
+3516(represent)X
+3832(a)X
+3889(Be)X
+3947(\302zier)X
+4121(curve.)X
+2520 4416(This)N
+2702(is)X
+2796(done)X
+2993(for)X
+3128(each)X
+3317(one)X
+3474(of)X
+3582(the)X
+3721(cyclic)X
+3954(paths)X
+4164(from)X
+2520 4512(which)N
+2740(the)X
+2861(letter)X
+3049(is)X
+3125(built.)X
+3334(When)X
+3549(the)X
+3670(o)X
+(ff)138 606 oc
+3758(sets)X
+3901(are)X
+4023(zero,)X
+4205(this)X
+2520 4608(is)N
+2611(done)X
+2805(by)X
+2923(the)X
+2 f F
+3059(\256ll_spec)X
+1 f F
+3364(procedure.)X
+3744(Otherwise)X
+4113(this)X
+4267(is)X
+2520 4704(done)N
+2705(by)X
+2813(the)X
+2 f F
+2939(\256ll_envelope)X
+1 f F
+3377(procedure.)X
+3747(In)X
+3842(the)X
+3968(latter)X
+4161(case,)X
+2520 4800(the)N
+2641(line)X
+2784(segments,)X
+3125(which)X
+3345(were)X
+3526(discussed)X
+3857(earlier,)X
+4107(should)X
+2520 4896(be)N
+2631(taken)X
+2840(out)X
+2977(also)X
+3140(in)X
+3236(order)X
+3440(to)X
+3536(get)X
+3668(smooth)X
+3937(connections)X
+2520 4992(between)N
+2810(the)X
+2931(di)X
+2993 MX
+(ff)138 606 oc
+3041(erent)X
+3225(curves)X
+3458(that)X
+3601(the)X
+3722(cyclic)X
+3937(path)X
+4098(is)X
+4174(built)X
+2520 5088(from.)N
+2764(Because)X
+3080(P)X
+8 s 8 xH F
+3124(OST)X
+10 s 10 xH F
+3245(S)X
+8 s 8 xH F
+3289(CRIPT)X
+10 s 10 xH F
+3519(describes)X
+3865(any)X
+4028(shape)X
+4258(in)X
+2520 5184(terms)N
+2741(of)X
+2851(curves)X
+3104(and)X
+3263(lines,)X
+3477(this)X
+3635(is)X
+3731(the)X
+3872(point)X
+4080(to)X
+4186(take)X
+2520 5280(advantage)N
+2909(of)X
+0 f F
+3039(METAFONT)X
+1 f F
+3380('s)X
+3501(calculations,)X
+3966(i.e.,)X
+4146(when)X
+0 f F
+2520 5376(METAFONT)N
+1 f F
+2892(calls)X
+3071(the)X
+2 f F
+3201(make_moves)X
+1 f F
+3644(procedure)X
+3998(and)X
+4146(when)X
+0 f F
+2520 5472(METAFONT)N
+1 f F
+2881(draws)X
+3093(line)X
+3233(segments)X
+3551(for)X
+3665(o)X
+(ff)138 606 oc
+3753(set)X
+3862(corrections.)X
+3 f F
+2520 5664(4.5)N
+2680(Processing)X
+3074(the)X
+3210(data.)X
+1 f F
+3430(The)X
+3584(generated)X
+3926(data)X
+4089(are)X
+4218(not)X
+2465 6084(8)N
+
+%%Page: 8 9
+8 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(ready)N
+796(yet)X
+935(to)X
+1037(be)X
+1153(used.)X
+1360(First,)X
+1566(we)X
+1700(should)X
+1953(unskew,)X
+2258(i.e.,)X
+576 768(transform)N
+914(from)X
+1096(the)X
+1220(\256rst)X
+1370(octant)X
+1592(back)X
+1770(to)X
+1858(the)X
+1982(original,)X
+2278(the)X
+576 864(paths)N
+775(according)X
+1121(to)X
+1212(the)X
+1339(octant)X
+1564(that)X
+1713(the)X
+1840(paths)X
+2038(were)X
+2224(trav-)X
+576 960(eled)N
+747(in)X
+846(before)X
+1089(they)X
+1264(were)X
+1459(skewed.)X
+1758(This)X
+1938(unskewing)X
+2323(is)X
+576 1056(done)N
+766(by)X
+880(taking)X
+1114(out)X
+1250(the)X
+1382(octant)X
+1612(number)X
+1891(at)X
+1983(the)X
+2114(moment)X
+576 1152(that)N
+718(the)X
+2 f F
+838(make_moves)X
+1 f F
+1271(procedure)X
+1615(is)X
+1690(called)X
+1904(and)X
+2042(then)X
+2203(using)X
+0 f F
+576 1248(METAFONT)N
+1 f F
+917('s)X
+2 f F
+1007(unskew)X
+1 f F
+1275(procedure)X
+1629(that)X
+1780(sets)X
+1931(values)X
+2 f F
+2167(x)X
+47 f F
+2209(\242)X
+1 f F
+2260(and)X
+2 f F
+576 1344(y)N
+47 f F
+618(\242)X
+1 f F
+662(to)X
+748(the)X
+870(original)X
+1143(coordinate)X
+1506(values)X
+1735(of)X
+1827(a)X
+1888(point,)X
+2097(given)X
+2300(an)X
+576 1440(octant)N
+800(code)X
+980(and)X
+1123(coordinates)X
+1520(\()X
+2 f F
+1547(x)X
+1 f F
+1583(,)X
+2 f F
+1609(y)X
+1 f F
+1651(\))X
+1705(after)X
+1880(they)X
+2045(have)X
+2224(been)X
+576 1536(mapped)N
+850(into)X
+995(the)X
+1114(\256rst)X
+1259(octant)X
+1476(and)X
+1613(skewed;)X
+1897(the)X
+2016(new)X
+2171(values)X
+576 1632(are)N
+701(sent)X
+855(to)X
+942(the)X
+2 f F
+1065(send_p_s)X
+1 f F
+1388(procedure.)X
+1755(This)X
+1922(procedure)X
+2269(has)X
+576 1728(eight)N
+761(formal)X
+1000(parameters)X
+1378(that)X
+1523(are)X
+1648(all)X
+1754(used)X
+1927(when)X
+2127(sending)X
+576 1824(a)N
+637(curve.)X
+861(When)X
+1078(sending)X
+1352(a)X
+1412(line,)X
+1576(only)X
+1742(four)X
+1900(parameters)X
+2277(are)X
+576 1920(used,)N
+763(two)X
+903(to)X
+985(denote)X
+1219(the)X
+1338(start)X
+1497(point)X
+1682(and)X
+1819(two)X
+1960(to)X
+2043(denote)X
+2278(the)X
+576 2016(end)N
+729(point;)X
+952(the)X
+1087(remaining)X
+1449(four)X
+1620(parameters)X
+2009(are)X
+2144(sent)X
+2309(as)X
+576 2112(zeros)N
+778(so)X
+2 f F
+881(send_p_s)X
+1 f F
+1211(can)X
+1355(distinguish)X
+1737(whether)X
+2029(a)X
+2098(line)X
+2251(was)X
+576 2208(sent)N
+728(or)X
+818(a)X
+877(curve.)X
+1119(In)X
+1209(the)X
+1330(next)X
+1491(step,)X
+2 f F
+1663(send_p_s)X
+1 f F
+1984(unscales)X
+2278(the)X
+576 2304(numbers)N
+875(because)X
+0 f F
+1154(METAFONT)X
+1 f F
+1519(works)X
+1739(with)X
+1905(units)X
+2084(of)X
+2175(scaled)X
+576 2400(points,)N
+832(of)X
+940(which)X
+1177(there)X
+1379(are)X
+1519(2)X
+7 s 7 xH F
+2368(16)Y
+10 s 10 xH F
+1662 2400(in)N
+1764(an)X
+1880(ordinary)X
+2192(point.)X
+576 2496(While)N
+796(unscaling,)X
+1147(the)X
+1269(values)X
+1498(are)X
+1621(transformed)X
+2033(in)X
+2119(order)X
+2314(to)X
+576 2592(send)N
+762(them)X
+961(to)X
+1062(the)X
+1199(P)X
+8 s 8 xH F
+1243(OST)X
+10 s 10 xH F
+1364(S)X
+8 s 8 xH F
+1408(CRIPT)X
+10 s 10 xH F
+1629(dictionary)X
+5 f F
+1992(FontBBox)X
+1 f F
+576 2688(command.)N
+932(After)X
+1122(this)X
+1257(pre-processing,)X
+1770(the)X
+1889(data)X
+2044(are)X
+2164(sent)X
+2314(to)X
+576 2784(a)N
+632(temporary)X
+982(\256le.)X
+3 f F
+735 2880(4.5.1)N
+955(Getting)X
+1244(more)X
+1454(information.)X
+1 f F
+1934(When)X
+0 f F
+2158(META-)X
+576 2976(FONT)N
+1 f F
+765(calls)X
+936(the)X
+2 f F
+1058(make_moves)X
+1 f F
+1493(procedure,)X
+1859(it)X
+1927(does)X
+2098(not)X
+2224(have)X
+576 3072(any)N
+725(information)X
+1136(on)X
+1249(the)X
+1380(role)X
+1538(that)X
+1691(this)X
+1839(path)X
+2011(is)X
+2098(going)X
+2314(to)X
+576 3168(play,)N
+774(whether)X
+1073(the)X
+1211(current)X
+1478(cyclic)X
+1709(path)X
+1886(is)X
+1978(going)X
+2199(to)X
+2300(be)X
+2 f F
+576 3264(\256lled)N
+1 f F
+759(or)X
+849(whether)X
+1131(it)X
+1198(will)X
+1345(act)X
+1462(as)X
+1552(a)X
+1611(boundary)X
+1937(of)X
+2027(a)X
+2086(region)X
+2314(to)X
+576 3360(be)N
+2 f F
+672(erased)X
+1 f F
+886(.)X
+735 3456(In)N
+840(order)X
+1048(to)X
+1149(distinguish)X
+1538(between)X
+1845(the)X
+1982(cases,)X
+2211(more)X
+576 3552(information)N
+987(has)X
+1127(to)X
+1222(be)X
+1331(taken.)X
+1558(This)X
+1733(is)X
+1818(done)X
+2006(by)X
+2118(copying)X
+576 3648(the)N
+5 f F
+760(plain.mf)X
+1 f F
+1230(\256le)X
+1418(into)X
+1629(a)X
+1752(new)X
+1973(\256le)X
+2162(named)X
+5 f F
+576 3744(myplain.mf)N
+1 f F
+1086(and)X
+1231(adding)X
+1478(a)X
+1543(few)X
+1693(lines)X
+1873(to)X
+1964(it.)X
+2057(The)X
+2211(addi-)X
+576 3840(tional)N
+783(code)X
+961(was)X
+1112(added)X
+1330(in)X
+1418(order)X
+1614(to)X
+1702(identify)X
+0 f F
+1977(METAFONT)X
+1 f F
+2318('s)X
+576 3936(use)N
+704(of)X
+791(the)X
+909(macros.)X
+0 f F
+1181(METAFONT)X
+1 f F
+1542(uses)X
+1700(the)X
+1818(variables)X
+2128(for)X
+2242(date)X
+576 4032(only)N
+764(once,)X
+982(when)X
+1202(the)X
+1346(program)X
+1664(is)X
+1763(started,)X
+2043(so)X
+2160(it)X
+2251(was)X
+576 4128(decided)N
+861(to)X
+958(use)X
+1100(them)X
+1294(in)X
+1390(the)X
+1522(rest)X
+1672(of)X
+1773(the)X
+1905(program.)X
+2251(The)X
+5 f F
+576 4224(year)N
+1 f F
+862(is)X
+1009(changed)X
+1372(to)X
+47 f F
+1529(-)X
+1 f F
+1573(1)X
+1708(when)X
+0 f F
+1977(METAFONT)X
+1 f F
+2318('s)X
+5 f F
+576 4320(pen_stroke)N
+1 f F
+1077(macro)X
+1299(is)X
+1373(applied)X
+1630(on)X
+1730(a)X
+1786(cyclic)X
+1998(path,)X
+2176(i.e.,)X
+2314(in)X
+576 4416(the)N
+709(characters)X
+1071(such)X
+1253(as)X
+1355(\252o\272,)X
+1522(\252O\272,)X
+1707(and)X
+1858(\252Q\272,)X
+2043(and)X
+2194(to)X
+47 f F
+2292(-)X
+1 f F
+2336(2)X
+576 4512(when)N
+801(the)X
+5 f F
+950(erase)X
+1 f F
+1241(macro)X
+1493(is)X
+1596(called.)X
+1858(The)X
+5 f F
+2033(month)X
+1 f F
+2323(is)X
+576 4608(changed)N
+883(when)X
+1096(the)X
+5 f F
+1233(fill)X
+1 f F
+1464(macro)X
+1704(is)X
+1797(called.)X
+2049(There)X
+2277(are)X
+576 4704(three)N
+757(kinds)X
+950(of)X
+1037(paths:)X
+639 4848(1.)N
+735(paths)X
+941(to)X
+1040(be)X
+2 f F
+1153(\256lled)X
+1 f F
+1351(are)X
+1488(processed)X
+1843(using)X
+2054(the)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+735 4944(S)N
+8 s 8 xH F
+779(CRIPT)X
+10 s 10 xH 5 f F
+981(fill)X
+1 f F
+1193(command.)X
+639 5088(2.)N
+735(paths)X
+932(to)X
+1022(be)X
+2 f F
+1126(stroked)X
+1 f F
+1390(are)X
+1517(processed)X
+1862(using)X
+2063(the)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+735 5184(S)N
+8 s 8 xH F
+779(CRIPT)X
+10 s 10 xH 5 f F
+981(eofill)X
+1 f F
+1289(command.)X
+639 5328(3.)N
+735(paths)X
+928(to)X
+1015(be)X
+2 f F
+1116(erased)X
+1 f F
+1355(are)X
+1479(processed)X
+1821(using)X
+2019(specialized)X
+735 5424(procedures)N
+1108(which)X
+1324(will)X
+1468(be)X
+1564(discussed)X
+1891(later.)X
+735 5568(A)N
+826(letter)X
+1024(cannot)X
+1271(always)X
+1527(be)X
+1636(treated)X
+1888(as)X
+1988(one)X
+2138(unit)X
+2296(by)X
+576 5664(means)N
+832(of)X
+950(the)X
+5 f F
+1099(fill)X
+1 f F
+1342(and)X
+5 f F
+1509(eofill)X
+1 f F
+1848(commands.)X
+2265(For)X
+2520 672(instance,)N
+2833(the)X
+2962(letter)X
+3158(\252Q\272)X
+3319(is)X
+3403(built)X
+3580(of)X
+3678(two)X
+3829(di)X
+3891 MX
+(ff)138 606 oc
+3939(erent)X
+4131(paths,)X
+2520 768(the)N
+2643(\256rst)X
+2792(of)X
+2884(which)X
+3105(is)X
+3183(stroked)X
+3444(and)X
+3585(the)X
+3708(second)X
+3956(of)X
+4047(which)X
+4267(is)X
+2520 864(\256lled.)N
+2759(Generating)X
+3171(the)X
+3325(letter)X
+3546(using)X
+3775(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH 5 f F
+2520 960(eofill)N
+1 f F
+2830(command)X
+3168(causes)X
+3400(a)X
+3458(hole)X
+3617(in)X
+3700(the)X
+3819(image)X
+4036(\(see)X
+4187(Fig-)X
+2520 1056(ure)N
+2643(4\).)X
+3140 1152 MXY
+560
+560
+0.00
+0.00
+70.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 70 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%%end path
+%%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%%end path
+%%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%%end path
+eofill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q) show
+endFig
+3285 1856(Figure)N
+3514(4)X
+2520 2016(So)N
+2632(while)X
+2838(generating)X
+3205(a)X
+3269(letter,)X
+3482(\256ll)X
+3599(mode)X
+3806(can)X
+3947(be)X
+4052(changed)X
+2520 2112(for)N
+2660(each)X
+2854(cyclic)X
+3092(path.)X
+3296(Moreover,)X
+3679(when)X
+3899(generating)X
+4284(a)X
+2520 2208(letter)N
+2707(whose)X
+2934(paths)X
+3126(should)X
+3362(be)X
+3461(\256lled,)X
+3668(it)X
+3735(is)X
+3811(not)X
+3936(always)X
+4182(pos-)X
+2520 2304(sible)N
+2691(to)X
+2773(use)X
+2900(just)X
+3035(one)X
+5 f F
+3171(fill)X
+1 f F
+3383(command)X
+3719(\(see)X
+3869(Figure)X
+4098(5\).)X
+3140 2400 MXY
+560
+560
+0.00
+0.00
+70.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 70 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 180 670 0.5 add M
+ 28 -2 0.5 add 58 -2 0.5 add 88 -2 0.5 add c
+ 0 2 0.5 add l
+ 38 0 0.5 add 74 0 0.5 add 110 2 0.5 add c
+ -2 -2 0.5 add l
+-198 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 550 670 0.5 add M
+ 28 -2 0.5 add 56 -2 0.5 add 84 -2 0.5 add c
+ 0 2 0.5 add l
+ 24 0 0.5 add 46 0 0.5 add 68 2 0.5 add c
+ -2 -2 0.5 add l
+-152 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 334 180 0.5 sub M
+ 208 0 0.5 sub l
+ -34 2 0.5 sub -70 2 0.5 sub -104 2 0.5 sub c
+ 0 -2 0.5 sub l
+-106 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%%end path
+%%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%%end path
+%%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%%end path
+%%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%%end path
+%%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+%%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%%end path
+%%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Y) show
+endFig
+3285 3104(Figure)N
+3514(5)X
+2520 3264(When)N
+2747(a)X
+2818(P)X
+8 s 8 xH F
+2862(OST)X
+10 s 10 xH F
+2983(S)X
+8 s 8 xH F
+3027(CRIPT)X
+10 s 10 xH 5 f F
+3245(fill)X
+1 f F
+3473(command)X
+3825(is)X
+3914(applied)X
+4186(to)X
+4284(a)X
+2520 3360(path)N
+2692(that)X
+2846(is)X
+2933(composed)X
+3292(of)X
+3393(more)X
+3591(than)X
+3762(one)X
+3911(subpath,)X
+4213(say)X
+2520 3456(two)N
+2661(for)X
+2776(the)X
+2895(sake)X
+3059(of)X
+3147(simplicity,)X
+3507(and)X
+3645(one)X
+3783(subpath)X
+4054(is)X
+4129(inside)X
+2520 3552(the)N
+2654(other)X
+2855(and)X
+3007(is)X
+3095(drawn)X
+3331(in)X
+3428(a)X
+3499(direction)X
+3819(opposite)X
+4125(to)X
+4222(the)X
+2520 3648(external)N
+2804(one,)X
+2966(the)X
+3090(internal)X
+3361(path)X
+3525(is)X
+3604(considered)X
+3978(a)X
+4040(hole)X
+4204(and)X
+2520 3744(is)N
+2593(not)X
+2715(\256lled)X
+2899(\(see)X
+3049(Figure)X
+3279(6\).)X
+3407(So,)X
+3532(if)X
+3602(several)X
+3851(paths)X
+4041(are)X
+4161(to)X
+4244(be)X
+2520 3840(\256lled)N
+2723(in)X
+2824(this)X
+2978(manner,)X
+3278(the)X
+3414(description)X
+3808(of)X
+3913(each)X
+4099(one)X
+4253(of)X
+2520 3936(them)N
+2702(should)X
+2938(be)X
+3037(ended)X
+3252(with)X
+3417(the)X
+5 f F
+3538(fill)X
+1 f F
+3753(command.)X
+4132(There)X
+2520 4032(is)N
+2608(one)X
+2759(more)X
+2959(bene\256t)X
+3212(to)X
+3309(using)X
+3516(this)X
+3665(strategy:)X
+3975(The)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 4128(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH 5 f F
+2806(current)X
+3202(path)X
+1 f F
+3427(stack)X
+3625(becomes)X
+3939(empty)X
+4172(after)X
+2520 4224(encountering)N
+2971(any)X
+3119(kind)X
+3293(of)X
+5 f F
+3392(fill)X
+1 f F
+3615(command.)X
+3982(Therefore,)X
+2520 4320(using)N
+2735(the)X
+5 f F
+2875(fill)X
+1 f F
+3109(command)X
+3467(after)X
+3657(each)X
+3847(path)X
+4027(can)X
+4182(help)X
+2520 4416(avoid)N
+5 f F
+2761(stack)X
+3091(overflow)X
+3565(error)X
+1 f F
+(s)S
+3898(if)X
+4009(all)X
+4151(paths)X
+2520 4512(together)N
+2803(are)X
+2922(too)X
+3044(long.)X
+3 f F
+2679 4608(4.5.2)N
+2899(Treating)X
+3237(erasing)X
+3526(paths.)X
+1 f F
+3792(There)X
+4020(are)X
+4159(three)X
+2520 4704(methods)N
+2822(of)X
+2920(handling)X
+3231(the)X
+3360(problem)X
+3658(of)X
+3756(paths)X
+3956(that)X
+4107(should)X
+2520 4800(be)N
+2616(erased)X
+2842(by)X
+9 f F
+2944(mf2ps)X
+1 f F
+3181(itself:)X
+2583 4944(1.)N
+2679(\256lling)X
+2896(with)X
+3066(white:)X
+3294(Because)X
+3590(erasing)X
+3850(paths)X
+4047(are)X
+4174(built)X
+2679 5040(in)N
+2769(order)X
+2967(to)X
+3057(erase)X
+3251(an)X
+3355(existing)X
+3636(\256lled)X
+3828(area)X
+3991(and)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2679 5136(S)N
+8 s 8 xH F
+2723(CRIPT)X
+10 s 10 xH F
+2938(overlaps)X
+3243(paths)X
+3445(\(i.e.,)X
+3623(a)X
+3692(region)X
+3930(is)X
+4016(shown)X
+4258(in)X
+2679 5232(the)N
+2798(color)X
+2984(that)X
+3125(was)X
+3271(drawn)X
+3493(last\),)X
+3671(erasing)X
+3923(paths)X
+4112(can)X
+4244(be)X
+2679 5328(implemented)N
+3142(by)X
+3268(\256lling)X
+3504(those)X
+3719(paths)X
+3934(with)X
+4122(white.)X
+2679 5424(This)N
+2844(solution)X
+3124(is)X
+3200(the)X
+3321(easiest,)X
+3578(but)X
+3703(it)X
+3769(works)X
+3987(only)X
+4151(if)X
+4222(the)X
+2679 5520(background)N
+3100(is)X
+3195(white)X
+3415(and)X
+3573(the)X
+3713(letter)X
+3920(is)X
+4015(drawn)X
+4258(in)X
+2679 5616(some)N
+2879(level)X
+3066(of)X
+3164(gray.)X
+3358(If)X
+3443(one)X
+3589(wants)X
+3806(to)X
+3898(draw)X
+4089(a)X
+4155(letter)X
+2679 5712(with)N
+2861(background)X
+3280(other)X
+3485(than)X
+3663(white,)X
+3901(the)X
+4040(resulting)X
+2465 6084(9)N
+
+%%Page: 9 10
+9 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+608 672 MXY
+1736
+1968
+0.00
+-12.00
+217.00
+234.00
+startFig
+%!
+%%%Title: O
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:06 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 -12 217 234
+%%%Was: 0 0 217 222
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-71 68 translate
+0.000000 222.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Ellipse
+newpath 199 199 121 121 0 360 DrawEllipse gsave 0.750 setgray fill grestore stroke
+%% Ellipse
+newpath 199 199 61 61 0 360 DrawEllipse gsave 1.000 setgray fill grestore stroke
+%% Polyline
+newpath 189 316 moveto 217 319 lineto 189 322 lineto 189 316 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 210 262 moveto 186 259 lineto 210 256 lineto 210 262 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 188 137 moveto 212 139 lineto 188 143 lineto 188 137 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 210 82 moveto 182 79 lineto 210 75 lineto 210 82 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
+endFig
+1 f F
+1341 2784(Figure)N
+1570(6)X
+735 2944(appearance)N
+1118(will)X
+1262(not)X
+1384(be)X
+1480(correct.)X
+639 3088(2.)N
+735(calculating)X
+1125(new)X
+1298(paths)X
+1506(resulting)X
+1825(from)X
+2020(subtracting)X
+735 3184(the)N
+870(erasing)X
+1139(paths)X
+1345(from)X
+1538(the)X
+1673(previous)X
+1985(\256lled)X
+2185(paths:)X
+735 3280(Such)N
+920(a)X
+981(solution)X
+1263(can)X
+1400(be)X
+1501(global.)X
+1746(However,)X
+2086(it)X
+2155(costs)X
+2340(a)X
+735 3376(lot)N
+868(in)X
+979(terms)X
+1206(of)X
+1322(processing)X
+1714(time)X
+1905(and)X
+2069(accuracy,)X
+735 3472(because)N
+1018(paths)X
+1215(are)X
+1343(given)X
+1550(implicitly)X
+1889(by)X
+1998(four)X
+2161(points,)X
+735 3568(and)N
+873(in)X
+957(order)X
+1149(to)X
+1233(calculate)X
+1541(the)X
+1661(new)X
+1816(paths,)X
+2026(one)X
+2163(should)X
+735 3664(\256nd)N
+879(the)X
+997(intersection)X
+1391(points)X
+1606(of)X
+1693(Be)X
+1751(\302zier)X
+1924(curves,)X
+2175(i.e.,)X
+2314(to)X
+735 3760(\256nd)N
+882(points)X
+1100(that)X
+1243(lie)X
+1346(on)X
+1449(both)X
+1614(Be)X
+1672(\302zier)X
+1848(curves,)X
+2100(and)X
+2238(then)X
+735 3856(calculate)N
+1048(new)X
+1209(curves,)X
+1466(which)X
+1689(are)X
+1815(di)X
+1877 MX
+(Fi)139 825 oc
+(cult)S
+2090(to)X
+2179(calcu-)X
+735 3952(late)N
+871(from)X
+1047(those)X
+1236(points.)X
+639 4096(3.)N
+735(using)X
+955(the)X
+1100(P)X
+8 s 8 xH F
+1144(OST)X
+10 s 10 xH F
+1265(S)X
+8 s 8 xH F
+1309(CRIPT)X
+10 s 10 xH 5 f F
+1538(eoclip)X
+1 f F
+1874(command:)X
+2260(Be-)X
+735 4192(cause)N
+936(the)X
+1056(letters)X
+1274(are)X
+1394(bounded)X
+1691(in)X
+1774(a)X
+1831(1000)X
+47 f F
+2011(\264)X
+1 f F
+2055(1000)X
+2236(box,)X
+735 4288(a)N
+805(primary)X
+1093(square)X
+1337(path)X
+1509(whose)X
+1749(segments)X
+2082(are)X
+2216(1000)X
+735 4384(units)N
+923(long)X
+1098(should)X
+1344(be)X
+1453(declared)X
+1759(and)X
+1908(after)X
+2089(it)X
+2166(all)X
+2278(the)X
+735 4480(erasing)N
+991(paths)X
+1184(should)X
+1421(be)X
+1521(listed.)X
+1738(After)X
+1932(relocating)X
+2278(the)X
+735 4576(erasing)N
+1005(paths)X
+1212(we)X
+1344(are)X
+1481(ready)X
+1698(to)X
+1798(declare)X
+5 f F
+2068(eoclip)X
+1 f F
+(,)S
+735 4672(which)N
+957(means)X
+1188(that)X
+1334(the)X
+1458(clipping)X
+1747(path)X
+1912(is)X
+1992(the)X
+2117(external)X
+735 4768(primary)N
+1031(one)X
+1189(and)X
+1347(the)X
+1487(internal)X
+1774(paths,)X
+2005(the)X
+2144(erasing)X
+735 4864(paths,)N
+959(are)X
+1093(holes.)X
+1317(This)X
+1494(is)X
+1583(an)X
+1695(elegant)X
+1963(solution)X
+2256(that)X
+735 4960(uses)N
+899(the)X
+1023(power)X
+1250(of)X
+1342(the)X
+1465(language)X
+1780(and)X
+1921(is)X
+1999(available)X
+2314(in)X
+735 5056(simple)N
+976(situations)X
+1310(in)X
+1400(which)X
+1624(there)X
+1813(is)X
+1894(no)X
+2002(intersection)X
+735 5152(between)N
+1030(the)X
+1155(erasing)X
+1414(paths)X
+1610(\(see)X
+1767(Figure)X
+2002(7\).)X
+2135(If)X
+2215(there)X
+735 5248(were)N
+923(intersections,)X
+1379(a)X
+1446(little)X
+1623(more)X
+1819(sophisticated)X
+2269(use)X
+735 5344(of)N
+827(the)X
+5 f F
+950(eoclip)X
+1 f F
+1262(command)X
+1602(would)X
+1826(be)X
+1926(needed.)X
+2198(Relo-)X
+735 5440(cation)N
+970(of)X
+1076(the)X
+1214(erasing)X
+1486(paths)X
+1695(is)X
+1788(done)X
+1984(by)X
+2104(the)X
+2242(pro-)X
+735 5536(cedure)N
+5 f F
+970(doarrange)X
+1 f F
+(.)S
+2788 672 MXY
+1264
+560
+0.00
+0.00
+158.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 158 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%%end path
+%%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%%end path
+eofill
+%%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%%end path
+fill
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 180 670 0.8 add M
+ 28 -2 0.8 add 58 -2 0.8 add 88 -2 0.8 add c
+ 0 2 0.8 add l
+ 38 0 0.8 add 74 0 0.8 add 110 2 0.8 add c
+ -2 -2 0.8 add l
+-198 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 550 670 0.8 add M
+ 28 -2 0.8 add 56 -2 0.8 add 84 -2 0.8 add c
+ 0 2 0.8 add l
+ 24 0 0.8 add 46 0 0.8 add 68 2 0.8 add c
+ -2 -2 0.8 add l
+-152 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 334 180 0.8 sub M
+ 208 0 0.8 sub l
+ -34 2 0.8 sub -70 2 0.8 sub -104 2 0.8 sub c
+ 0 -2 0.8 sub l
+-106 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%%end path
+fill
+%%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%%end path
+fill
+%%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%%end path
+fill
+%%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%%end path
+fill
+%%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q Y) show
+endFig
+3285 1376(Figure)N
+3514(7)X
+2679 1536(There)N
+2904(are)X
+3040(other)X
+3242(problems)X
+3577(caused)X
+3834(by)X
+3952(the)X
+4088(erasing)X
+2520 1632(paths.)N
+2730(Because)X
+3019(the)X
+3138(erasing)X
+3391(paths)X
+3581(have)X
+3754(segments)X
+4073(in)X
+4155(com-)X
+2520 1728(mon)N
+2695(with)X
+2870(paths)X
+3072(to)X
+3168(be)X
+3278(\256lled,)X
+3496(P)X
+8 s 8 xH F
+3540(OST)X
+10 s 10 xH F
+3661(S)X
+8 s 8 xH F
+3705(CRIPT)X
+10 s 10 xH F
+3921(must)X
+4110(decide)X
+2520 1824(whether)N
+2805(the)X
+2929(common)X
+3235(segments)X
+3559(are)X
+3684(in)X
+3772(the)X
+3895(clipping)X
+4182(path)X
+2520 1920(or)N
+2611(not.)X
+2777(P)X
+8 s 8 xH F
+2821(OST)X
+10 s 10 xH F
+2942(S)X
+8 s 8 xH F
+2986(CRIPT)X
+10 s 10 xH F
+3192(does)X
+3363(not)X
+3489(seem)X
+3678(to)X
+3764(have)X
+3940(a)X
+4000(consistent)X
+2520 2016(policy)N
+2754(on)X
+2868(that)X
+3022(and)X
+3172(it)X
+3250(seems)X
+3479(to)X
+3574(be)X
+3683(that)X
+3836(the)X
+3967(decision)X
+4267(is)X
+2520 2112(taken)N
+2714(arbitrarily)X
+3055(\(see)X
+3205(Figure)X
+3434(8\).)X
+3260 2208 MXY
+320
+320
+0.00
+0.00
+40.00
+40.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%%end path
+fill
+%%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%%end path
+fill
+%%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%%end path
+fill
+%%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%%end path
+fill
+%%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%%end path
+fill
+%%for fake line
+newpath
+160 180 M
+360 0 l
+0 .5 l
+-360 0 l
+0 -.5 l
+closepath
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+3285 2672(Figure)N
+3514(8)X
+2520 2832(An)N
+2645(attempt)X
+2912(to)X
+3001(resolve)X
+3260(the)X
+3385(clipping)X
+3674(path)X
+3839(problem)X
+4133(led)X
+4258(to)X
+2520 2928(the)N
+2653(\256rst)X
+2812(author)X
+3052(sending)X
+3336(the)X
+3468(following)X
+3813(electronic)X
+4164(mes-)X
+2520 3024(sage)N
+2695(\(obviously,)X
+3089(not)X
+3223(as)X
+3323(nicely)X
+3552(formatted)X
+3897(as)X
+3997(herein\))X
+4258(to)X
+2520 3120(Glenn)N
+2736(Reid)X
+2907(of)X
+2994(Adobe)X
+3228(Systems,)X
+3534(Inc.)X
+2679 3264(From)N
+2872(simon)X
+3087(Tue)X
+3232(Mar)X
+3386(21)X
+3486(13:22:32)X
+3790(1989)X
+2679 3360(To:)N
+2810(greid@adobe.com)X
+2679 3456(Subject:)N
+2961(Problem)X
+3252(in)X
+3334(PostScript)X
+2679 3648(Dear)N
+2856(Mr.)X
+2994(Reid)X
+2679 3840(I)N
+2746(have)X
+2938(got)X
+3080(a)X
+3157(problem)X
+3465(in)X
+3568(understanding)X
+4063(the)X
+2679 3936(PostScript)N
+3040(policy)X
+3273(in)X
+3368(determining)X
+3788(\252what)X
+4013(is)X
+4099(in)X
+2679 4032(the)N
+2802(clipping)X
+3089(path\272.)X
+3328(I)X
+3380(think)X
+3569(there)X
+3755(is)X
+3833(a)X
+3894(problem)X
+2679 4128(in)N
+2777(the)X
+2911(boundaries.)X
+3339(Here)X
+3532(is)X
+3621(an)X
+3733(example)X
+4041(that)X
+2679 4224(shows)N
+2899(that)X
+3039(problem:)X
+5 f F
+2886 4416(gsave)N
+2886 4512(initclip)N
+2886 4608(newpath)N
+2886 4800(0)N
+2982(0)X
+3078(moveto)X
+2886 4896(0)N
+2982(1000)X
+3222(lineto)X
+2886 4992(1000)N
+3126(1000)X
+3366(lineto)X
+2886 5088(1000)N
+3126(0)X
+3222(lineto)X
+2886 5184(0)N
+2982(0)X
+3078(lineto)X
+2886 5376(300)N
+3078(100)X
+3270(moveto)X
+2886 5472(700)N
+3078(100)X
+3270(lineto)X
+2886 5568(700)N
+3078(300)X
+3270(lineto)X
+2886 5664(300)N
+3078(300)X
+3270(lineto)X
+1 f F
+2465 6084(10)N
+
+%%Page: 10 11
+10 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+5 f F
+942 672(300)N
+1134(100)X
+1326(lineto)X
+942 864(700)N
+1134(900)X
+1326(moveto)X
+942 960(300)N
+1134(900)X
+1326(lineto)X
+942 1056(300)N
+1134(700)X
+1326(lineto)X
+942 1152(700)N
+1134(700)X
+1326(lineto)X
+942 1248(700)N
+1134(900)X
+1326(lineto)X
+942 1440(eoclip)N
+942 1632(newpath)N
+942 1728(100)N
+1134(100)X
+1326(moveto)X
+942 1824(900)N
+1134(100)X
+1326(lineto)X
+942 1920(900)N
+1134(900)X
+1326(lineto)X
+942 2016(100)N
+1134(900)X
+1326(lineto)X
+942 2112(100)N
+1134(100)X
+1326(lineto)X
+942 2208(fill)N
+942 2304(grestore)N
+1 f F
+735 2496(As)N
+850(you)X
+996(see,)X
+1145(the)X
+1269(problem)X
+1562(is)X
+1642(that)X
+1789(on)X
+1896(top)X
+2025(of)X
+2119(the)X
+735 2592(shape,)N
+977(the)X
+1114(line)X
+1273(which)X
+1508(belongs)X
+1796(to)X
+1897(the)X
+2034(upper)X
+735 2688(\252hole\272)N
+971(in)X
+1059(the)X
+1183(clipping)X
+1471(path)X
+1635(and)X
+1777(to)X
+1865(the)X
+1989(current)X
+735 2784(path)N
+894(\()X
+942(to)X
+1025(be)X
+1122(\256lled)X
+1307(\))X
+1354(is)X
+1427(drawn,)X
+1668(and)X
+1804(on)X
+1904(bottom)X
+2150(of)X
+735 2880(the)N
+853(shape)X
+1056(it)X
+1120(is)X
+1193(not.)X
+735 3072(This)N
+913(is)X
+1003(happening)X
+1374(both)X
+1553(on)X
+1670(the)X
+1805(Apple)X
+2038(Laser)X
+735 3168(printer)N
+969(and)X
+1105(on)X
+1205(the)X
+1323(QMS-80.)X
+735 3360(I)N
+782(would)X
+1002(be)X
+1098(glad)X
+1256(to)X
+1338(have)X
+1510(a)X
+1566(reply)X
+1751(from)X
+1927(you.)X
+735 3552(Thanks)N
+991(in)X
+1073(advance)X
+735 3648(Shimon)N
+1003(Yanai)X
+735 3744(C.S)N
+872(Dep.)X
+735 3840(Technion)N
+576 3984(What)N
+783(Mr.)X
+934(Reid)X
+1118(saw)X
+1276(when)X
+1483(he)X
+1592(printed)X
+1853(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 4080(commands)N
+957(contained)X
+1302(in)X
+1397(the)X
+1528(message)X
+1833(is)X
+1919(reproduced)X
+2314(in)X
+576 4176(Figure)N
+805(9.)X
+1316 4272 MXY
+320
+416
+0.00
+0.00
+40.00
+52.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 52
+%%%Was: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_square
+(
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_square put
+
+Metrics
+ begin
+/The_square 1000 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+1341 4832(Figure)N
+1570(9)X
+576 4992(Mr.)N
+714(Reid)X
+885(replied)X
+1128(with)X
+1290(the)X
+1408(following:)X
+735 5136(From:)N
+950(greid@adobe.com)X
+1559(\(Glenn)X
+1802(Reid\))X
+735 5232(To:)N
+866(Shimon)X
+1134(Yanai)X
+1346(<simon@techunix>)X
+735 5328(Cc:)N
+866(greid@adobe.com)X
+735 5424(Subject:)N
+1017(Re:)X
+1148(Problem)X
+1439(in)X
+1521(PostScript)X
+735 5520(In-Reply-To:)N
+1178(Your)X
+1363(message)X
+1655(of)X
+1742(Wed,)X
+1934(22)X
+2034(Mar)X
+2188(89)X
+2288(...)X
+735 5616(Date:)N
+929(Wed,)X
+1121(22)X
+1221(Mar)X
+1375(89)X
+1475(11:41:35)X
+1779(PST)X
+2679 672(The)N
+2838(problem)X
+3139(is)X
+3226(that)X
+3380(the)X
+3512(path)X
+3684(you)X
+3838(are)X
+3971(\256lling)X
+2679 768(falls)N
+2842(exactly)X
+3099(on)X
+3204(the)X
+3327(edge)X
+3504(of)X
+3595(the)X
+3717(clipping)X
+4003(path.)X
+2679 864(This)N
+2856(produces)X
+3181(a)X
+3252(zero-width)X
+3635(area)X
+3805(to)X
+3902(\256ll,)X
+4045(and)X
+2679 960(unfortunately)N
+3158(it)X
+3249(sometimes)X
+3638(\256lls)X
+3803(and)X
+3965(some-)X
+2679 1056(times)N
+2876(does)X
+3047(not)X
+3174(with)X
+3341(the)X
+3464(current)X
+3717(\256ll)X
+3830(algorithm.)X
+2679 1152(I)N
+2737(believe)X
+3000(that)X
+3151(it)X
+3226(is)X
+3310(related)X
+3559(to)X
+3651(the)X
+3779(direction)X
+4094(of)X
+2679 1248(the)N
+2809(paths;)X
+3033(if)X
+3115(the)X
+3246(paths)X
+3448(are)X
+3580(going)X
+3795(in)X
+3890(opposite)X
+2679 1344(directions)N
+3019(along)X
+3221(the)X
+3343(same)X
+3531(line,)X
+3694(it)X
+3761(will)X
+3908(\256ll)X
+4019(with)X
+2679 1440(a)N
+2743(one-pixel)X
+3074(area,)X
+3257(but)X
+3388(if)X
+3466(they)X
+3633(are)X
+3761(going)X
+3972(in)X
+4063(the)X
+2679 1536(same)N
+2874(direction,)X
+3209(it)X
+3283(will)X
+3437(not)X
+3569(\256ll.)X
+3727(I)X
+3784(believe)X
+4046(this)X
+2679 1632(has)N
+2840(been)X
+3046(\256xed)X
+3260(to)X
+3376(be)X
+3506(more)X
+3725(consistent)X
+4099(in)X
+2679 1728(Display)N
+2948(PostScript,)X
+3316(for)X
+3430(what)X
+3606(it's)X
+3728(worth.)X
+2679 1920(Glenn)N
+2895(Reid)X
+2679 2016(Adobe)N
+2913(Systems)X
+2679 2160(The)N
+2845(idea)X
+3020(of)X
+3128(using)X
+3342(opposite)X
+3654(directions)X
+4011(had)X
+4168(been)X
+2520 2256(checked)N
+2805(before)X
+3032(sending)X
+3302(the)X
+3421(letter,)X
+3626(so)X
+3717(the)X
+3835(problem)X
+4122(had)X
+4258(to)X
+2520 2352(be)N
+2627(solved)X
+2867(within)X
+3102(the)X
+3231(back)X
+3414(end)X
+3561(of)X
+9 f F
+3662(mf2ps)X
+1 f F
+3879(.)X
+3931(The)X
+4088(erasing)X
+2520 2448(paths)N
+2719(near)X
+2888(the)X
+3016(top)X
+3147(of)X
+3243(the)X
+3370(letter)X
+3564(had)X
+3709(their)X
+2 f F
+3885(y)X
+1 f F
+3950(coordinates)X
+2520 2544(increased)N
+2850(by)X
+2956(0.8)X
+3082(points,)X
+3323(and)X
+3465(those)X
+3660(near)X
+3826(the)X
+3951(bottom)X
+4204(had)X
+2520 2640(their)N
+2 f F
+2690(y)X
+1 f F
+2749(coordinates)X
+3142(decreased)X
+3483(by)X
+3586(the)X
+3707(same)X
+3895(amount.)X
+4178(This)X
+2520 2736(shift)N
+2701(is)X
+2793(invisible)X
+3108(to)X
+3210(the)X
+3348(human)X
+3606(eye)X
+3758(because)X
+4053(the)X
+4191(font)X
+2520 2832(de\256nitions)N
+2884(are)X
+3010(in)X
+3099(terms)X
+3304(of)X
+3397(hundreds)X
+3717(of)X
+3810(points)X
+4031(\(see)X
+4187(Fig-)X
+2520 2928(ure)N
+2649(10\).)X
+2802(This)X
+2970(solution)X
+3253(was)X
+3404(designed)X
+3715(to)X
+3804(work)X
+3996(with)X
+4165(most)X
+2520 3024(existing)N
+0 f F
+2794(METAFONT)X
+1 f F
+3155(fonts.)X
+3355(It)X
+3424(is)X
+3497(possible)X
+3779(that)X
+3919(there)X
+4100(will)X
+4244(be)X
+2520 3120(fonts)N
+2700(that)X
+2840(are)X
+2959(not)X
+3081(treated)X
+3320(well)X
+3478(by)X
+3578(this)X
+3713(solution.)X
+3260 3216 MXY
+320
+320
+0.00
+0.00
+40.00
+40.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 192 488 0.8 add M
+ 22 -2 0.8 add 44 -2 0.8 add 66 -2 0.8 add c
+ 0 2 0.8 add l
+ 28 0 0.8 add 54 0 0.8 add 82 2 0.8 add c
+ -2 -2 0.8 add l
+-148 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 404 180 0.8 sub M
+ 146 0 0.8 sub l
+ -22 2 0.8 sub -44 2 0.8 sub -66 2 0.8 sub c
+ 0 -2 0.8 sub l
+-82 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 410 488 0.8 add M
+ 24 -2 0.8 add 48 -2 0.8 add 72 -2 0.8 add c
+ 0 2 0.8 add l
+ 20 0 0.8 add 38 0 0.8 add 58 2 0.8 add c
+ -2 -2 0.8 add l
+-130 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 188 180 0.8 sub M
+ 128 0 0.8 sub l
+ -24 2 0.8 sub -48 2 0.8 sub -72 2 0.8 sub c
+ 0 -2 0.8 sub l
+-58 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%%end path
+fill
+%%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%%end path
+fill
+%%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%%end path
+fill
+%%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%%end path
+fill
+%%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+3265 3680(Figure)N
+3494(10)X
+3 f F
+2520 3936(4.6)N
+2680(Optimization.)X
+1 f F
+3210(Optimization)X
+3669(is)X
+3759(done)X
+3952(in)X
+4051(order)X
+4258(to)X
+2520 4032(make)N
+2728(the)X
+2860(description)X
+3250(of)X
+3351(the)X
+3483(fonts)X
+3677(shorter)X
+3933(and)X
+4082(to)X
+4177(save)X
+2520 4128(work)N
+2724(in)X
+2825(the)X
+2962(P)X
+8 s 8 xH F
+3006(OST)X
+10 s 10 xH F
+3127(S)X
+8 s 8 xH F
+3171(CRIPT)X
+10 s 10 xH F
+3392(interpreter.)X
+3787(This)X
+3969(is)X
+4062(done)X
+4258(in)X
+2520 4224(three)N
+2701(ways:)X
+2583 4368(1.)N
+2679(not)X
+2817(printing)X
+3106(lines)X
+3293(with)X
+3471(length)X
+3707(zero.)X
+3903(As)X
+4029(was)X
+4191(said)X
+2679 4464(earlier,)N
+2929(the)X
+0 f F
+3051(METAFONT)X
+1 f F
+3416(program)X
+3712(prints)X
+3918(lines)X
+4092(to)X
+4177(con-)X
+2679 4560(nect)N
+2834(o)X
+(ff)138 606 oc
+2922(set)X
+3032(points.)X
+3268(There)X
+3478(are)X
+3599(times)X
+3794(that)X
+3936(after)X
+4106(round-)X
+2679 4656(ing)N
+2818(or)X
+2922(truncating)X
+3284(the)X
+3418(output)X
+3658(data,)X
+3848(the)X
+3982(start)X
+4156(point)X
+2679 4752(and)N
+2815(the)X
+2933(end)X
+3069(point)X
+3253(are)X
+3372(equal.)X
+3586(In)X
+3673(such)X
+3840(cases,)X
+4050(the)X
+4169(lines)X
+2679 4848(are)N
+2798(eliminated.)X
+2583 4992(2.)N
+2679(checking)X
+2999(if)X
+3078(the)X
+3206(Be)X
+3264(\302zier)X
+3447(curve)X
+3656(acts)X
+3811(as)X
+3909(a)X
+3976(line.)X
+4147(From)X
+2679 5088(the)N
+2803(de\256nition)X
+3135(of)X
+3227(the)X
+3350(Be)X
+3408(\302zier)X
+3586(curve,)X
+3810(it)X
+3879(is)X
+3957(known)X
+4200(that)X
+2679 5184(if)N
+2759(the)X
+2888(two)X
+3039(control)X
+3297(points)X
+3523(lie)X
+3634(on)X
+3745(the)X
+3874(line)X
+4025(that)X
+4177(con-)X
+2679 5280(nects)N
+2868(the)X
+2990(start)X
+3151(point)X
+3338(and)X
+3477(the)X
+3598(end)X
+3737(point,)X
+3944(the)X
+4065(curve)X
+4267(is)X
+2679 5376(of)N
+2781(degree)X
+3031(one.)X
+3202(In)X
+3304(such)X
+3486(cases)X
+9 f F
+3693(mf2ps)X
+1 f F
+3945(generates)X
+4284(a)X
+2679 5472(command)N
+3019(to)X
+3105(print)X
+3280(a)X
+3340(line)X
+3484(from)X
+3664(the)X
+3786(start)X
+3948(point)X
+4136(to)X
+4222(the)X
+2679 5568(end)N
+2825(point,)X
+3039(thus)X
+3202(saving)X
+3442(space)X
+3652(and)X
+3799(avoiding)X
+4110(redun-)X
+2679 5664(dant)N
+2837(calculations)X
+3240(for)X
+3354(the)X
+3472(P)X
+8 s 8 xH F
+3516(OST)X
+10 s 10 xH F
+3637(S)X
+8 s 8 xH F
+3681(CRIPT)X
+10 s 10 xH F
+3883(interpreter.)X
+2445 6084(11)N
+
+%%Page: 11 12
+11 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+639 672(3.)N
+735(checking)X
+1056(if)X
+1136(a)X
+1203(series)X
+1417(of)X
+1515(consecutive)X
+1926(line)X
+2078(segments)X
+735 768(are)N
+865(in)X
+958(the)X
+1087(same)X
+1283(line.)X
+1474(This)X
+1647(is)X
+1730(done)X
+1916(by)X
+2026(storing)X
+2278(the)X
+735 864(segments)N
+1060(in)X
+1149(a)X
+1212(bu)X
+(ff)138 606 oc
+1340(er)X
+1430(and)X
+1573(checking)X
+1891(whether)X
+2178(a)X
+2242(new)X
+735 960(segment)N
+1022(is)X
+1095(collinear)X
+1396(with)X
+1558(the)X
+1676(last)X
+1807(stored.)X
+3 f F
+576 1152(4.7)N
+736(Changed)X
+1071(or)X
+1176(added)X
+1413(routines.)X
+1 f F
+1762(The)X
+1916(following)X
+2257(is)X
+2340(a)X
+576 1248(list)N
+701(of)X
+796(routines)X
+1082(that)X
+1230(were)X
+1415(changed)X
+1711(or)X
+1806(added)X
+2026(in)X
+2116(order)X
+2314(to)X
+576 1344(build)N
+9 f F
+762(mf2ps)X
+1 f F
+999(from)X
+0 f F
+1175(METAFONT)X
+1 f F
+1516(.)X
+2 f F
+672 1488(printchar)N
+1 f F
+994(was)X
+1139(modi\256ed)X
+1443(to)X
+1525(get)X
+1643(character)X
+1959(names.)X
+2 f F
+672 1632(\256xdateandtime)N
+1 f F
+1182(was)X
+1345(modi\256ed)X
+1667(to)X
+1767(initialize)X
+2086(variables)X
+672 1728(that)N
+812(were)X
+989(used)X
+1156(as)X
+1243(\257ags)X
+1414(in)X
+1496(the)X
+1614(macros.)X
+2 f F
+672 1872(\256llspec)N
+1 f F
+919(was)X
+1064(modi\256ed)X
+1368(to)X
+1450(send)X
+1617(out)X
+1739(data)X
+1893(on)X
+1993(splines.)X
+2 f F
+672 2016(skewlineedges)N
+1 f F
+1151(was)X
+1296(modi\256ed)X
+1600(to)X
+1682(send)X
+1849(out)X
+1971(o)X
+(ff)138 606 oc
+2059(set)X
+2168(lines.)X
+2 f F
+672 2160(dualmoves)N
+1 f F
+1035(was)X
+1180(modi\256ed)X
+1484(to)X
+1566(send)X
+1733(out)X
+1855(o)X
+(ff)138 606 oc
+1943(set)X
+2052(lines.)X
+2 f F
+672 2304(\256llenvelope)N
+1 f F
+1099(was)X
+1281(modi\256ed)X
+1622(to)X
+1741(send)X
+1945(out)X
+2104(data)X
+2296(on)X
+672 2400(splines.)N
+2 f F
+672 2544(dostatement)N
+1 f F
+1083(was)X
+1232(modi\256ed)X
+1540(to)X
+1626(identify)X
+1899(tokens)X
+2132(that)X
+2277(are)X
+672 2640(strings.)N
+2 f F
+672 2784(main)N
+1 f F
+864(was)X
+1021(modi\256ed)X
+1337(to)X
+1431(call)X
+1579(the)X
+9 f F
+1711(mf2ps)X
+1 f F
+1960(procedure)X
+2314(in)X
+672 2880(the)N
+790(beginning)X
+1130(and)X
+1266(ending)X
+1504(of)X
+1591(the)X
+1709(program.)X
+2 f F
+672 3024(sendcurve)N
+1 f F
+1020(was)X
+1167(added)X
+1381(to)X
+1465(unskew)X
+1733(spline)X
+1947(values)X
+2175(and)X
+2314(to)X
+672 3120(send)N
+839(them)X
+1019(to)X
+1101(the)X
+1219(next)X
+1377(process.)X
+2 f F
+672 3264(sendline)N
+1 f F
+977(was)X
+1140(added)X
+1371(to)X
+1472(unskew)X
+1756(line)X
+1915(values)X
+2159(and)X
+2314(to)X
+672 3360(send)N
+839(them)X
+1019(to)X
+1101(the)X
+1219(next)X
+1377(process.)X
+2 f F
+672 3504(ok)N
+1 f F
+768(was)X
+913(added)X
+1125(to)X
+1207(check)X
+1415(if)X
+1484(two)X
+1624(lines)X
+1795(are)X
+1914(collinear.)X
+2 f F
+672 3648(restore)N
+1 f F
+931(was)X
+1089(added)X
+1314(to)X
+1409(restore)X
+1661(the)X
+1792(parameters)X
+2178(of)X
+2278(the)X
+672 3744(last)N
+803(line.)X
+2 f F
+672 3888(recall)N
+1 f F
+879(was)X
+1024(added)X
+1236(to)X
+1318(recall)X
+1517(values)X
+1742(from)X
+1918(the)X
+2036(bu)X
+(ff)138 606 oc
+2164(er.)X
+2 f F
+672 4032(us)N
+1 f F
+767(was)X
+916(added)X
+1132(to)X
+1219(convert)X
+1485(the)X
+0 f F
+1608(METAFONT)X
+1 f F
+1974(scale)X
+2160(so)X
+2256(that)X
+672 4128(a)N
+744(letter)X
+945(would)X
+1181(\256t)X
+1283(the)X
+1416(Adobe)X
+1665(standard)X
+1972(1000)X
+47 f F
+2152(\264)X
+1 f F
+2216(1000)X
+672 4224(bounding)N
+994(box.)X
+2 f F
+672 4368(send_p_s)N
+1 f F
+999(was)X
+1153(added)X
+1375(to)X
+1467(create)X
+1690(a)X
+1756(P)X
+8 s 8 xH F
+1800(OST)X
+10 s 10 xH F
+1921(S)X
+8 s 8 xH F
+1965(CRIPT)X
+10 s 10 xH F
+2177(\256le)X
+2309(of)X
+672 4464(lines)N
+843(and)X
+979(curves.)X
+2 f F
+672 4608(makemoves)N
+1 f F
+1063(was)X
+1208(modi\256ed)X
+1512(to)X
+1594(send)X
+1761(out)X
+1883(spline)X
+2094(data.)X
+2 f F
+672 4752(dump)N
+1 f F
+872(was)X
+1019(added)X
+1233(to)X
+1318(append)X
+1573(information)X
+1974(from)X
+2153(the)X
+2274(\256le)X
+672 4848(named)N
+5 f F
+906(f)X
+1 f F
+974(to)X
+1056(the)X
+1174(\256le)X
+1296(named)X
+5 f F
+1530(g)X
+1 f F
+(.)S
+2 f F
+672 4992(checkerase)N
+1 f F
+1061(was)X
+1218(added)X
+1442(to)X
+1536(identify)X
+1817(the)X
+1947(\256le)X
+2081(that)X
+2233(con-)X
+672 5088(tains)N
+861(\252erase\272)X
+1137(commands,)X
+1541(and)X
+1694(their)X
+1878(position)X
+2172(within)X
+672 5184(the)N
+790(\256le.)X
+2 f F
+672 5328(doarrange)N
+1 f F
+1051(was)X
+1217(added)X
+1450(to)X
+1553(put)X
+1696(erasing)X
+1969(paths)X
+2179(at)X
+2278(the)X
+672 5424(beginning)N
+1012(of)X
+1099(the)X
+1217(\256le.)X
+2 f F
+672 5568(print_start)N
+1 f F
+1047(was)X
+1206(added)X
+1432(to)X
+1528(signal)X
+1753(the)X
+1885(beginning)X
+2239(of)X
+2340(a)X
+672 5664(new)N
+826(cyclic)X
+1038(path)X
+1196(to)X
+1278(be)X
+1374(processed.)X
+2 f F
+2616 672(print_end)N
+1 f F
+2951(was)X
+3100(added)X
+3316(to)X
+3402(signal)X
+3617(the)X
+3739(end)X
+3879(of)X
+3970(the)X
+4092(current)X
+2616 768(cyclic)N
+2828(path.)X
+2 f F
+2616 912(init_ps)N
+1 f F
+2853(was)X
+2998(added)X
+3210(to)X
+3292(make)X
+3486(initializations.)X
+2 f F
+2616 1056(makenewdef)N
+1 f F
+3037(was)X
+3186(added)X
+3402(to)X
+3488(make)X
+3686(initializations)X
+4146(when)X
+2616 1152(more)N
+2801(than)X
+2959(one)X
+3095(character)X
+3411(occurs)X
+3641(in)X
+3723(the)X
+3841(input.)X
+2 f F
+2616 1296(closeolddef)N
+1 f F
+3001(was)X
+3146(added)X
+3358(to)X
+3440(close)X
+3625(the)X
+3743(last)X
+3874(de\256nition.)X
+2 f F
+2616 1440(tini_ps)N
+1 f F
+2864(was)X
+3020(added)X
+3243(to)X
+3336(handle)X
+3581(the)X
+3710(ending)X
+3959(of)X
+4057(the)X
+4186(pro-)X
+2616 1536(cess.)N
+2 f F
+2616 1680(auxprintchar)N
+1 f F
+3054(was)X
+3199(added)X
+3411(to)X
+3493(print)X
+3664(characters.)X
+2 f F
+2616 1824(auxprint)N
+1 f F
+2907(was)X
+3052(added)X
+3264(to)X
+3346(print)X
+3517(strings.)X
+3 f F
+2520 2016(5)N
+2620(Operation)X
+2991(of)X
+9 f F
+3080(mf2ps)X
+3 f F
+3317(in)X
+3403(a)X
+9 f F
+3465(U)X
+8 s 8 xH F
+3523(NIX)X
+10 s 10 xH 3 f F
+3650(environment)X
+1 f F
+2520 2160(When)N
+2758(invoked,)X
+9 f F
+3084(mf2ps)X
+1 f F
+3347(\256rst)X
+3518(asks)X
+3703(for)X
+3844(an)X
+3967(output)X
+4218(\256le)X
+2520 2256(name.)N
+2746(For)X
+2888(the)X
+3017(example)X
+3320(this)X
+3466(\256le)X
+3599(is)X
+3683(called)X
+5 f F
+3906(ex1)X
+1 f F
+(.)S
+9 f F
+4103(mf2ps)X
+1 f F
+2520 2352(then)N
+2678(asks,)X
+5 f F
+2679 2544(\252Are)N
+2919(you)X
+3111(creating)X
+3543(the)X
+3735(whole)X
+4023(dic-)X
+2679 2640(tionary)N
+3063(\(y/n\)?\272.)X
+1 f F
+2520 2832(If)N
+2600(the)X
+2724(answer)X
+2978(is)X
+3057(other)X
+3248(than)X
+3413(\252)X
+5 f F
+3449(y)X
+1 f F
+(\272)S
+3560(or)X
+3654(\252)X
+5 f F
+3690(Y)X
+1 f F
+(\272,)S
+3821(it)X
+3892(is)X
+3972(considered)X
+2520 2928(\252)N
+5 f F
+2556(no)X
+1 f F
+(\272.)S
+2735(If)X
+2816(the)X
+2941(answer)X
+3196(is)X
+3276(\252)X
+5 f F
+3312(y)X
+1 f F
+(\272)S
+3423(or)X
+3517(\252)X
+5 f F
+3553(Y)X
+1 f F
+(\272,)S
+3684(then)X
+3849(the)X
+3973(whole)X
+4195(dic-)X
+2520 3024(tionary)N
+2787(is)X
+2880(created.)X
+3173(This)X
+3355(means)X
+3600(that)X
+9 f F
+3762(mf2ps)X
+1 f F
+4019(creates)X
+4284(a)X
+2520 3120(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2942(dictionary)X
+3297(that)X
+3447(includes)X
+3744(entries)X
+3988(for)X
+4112(all)X
+4222(the)X
+2520 3216(characters)N
+2878(that)X
+3029(are)X
+3159(in)X
+3252(the)X
+3381(input,)X
+3597(e.g.,)X
+5 f F
+3765(cmr10)X
+1 f F
+4037(set.)X
+4178(This)X
+2520 3312(dictionary)N
+2873(needs)X
+3083(additional)X
+3430(de\256nitions)X
+3794(such)X
+3968(as)X
+2 f F
+4062(left)X
+4191(side)X
+2520 3408(bearing,)N
+2827(width,)X
+3063(bounding)X
+3404(box)X
+1 f F
+3520(,)X
+3579(etc.)X
+3752(These)X
+3983(de\256nitions)X
+2520 3504(need)N
+2693(information)X
+3092(on)X
+3193(character)X
+3510(features)X
+3786(that)X
+3927(must)X
+4103(be)X
+4199(cal-)X
+2520 3600(culated)N
+2781(within)X
+3014(the)X
+3141(program.)X
+3462(Otherwise,)X
+3841(the)X
+3969(whole)X
+4195(dic-)X
+2520 3696(tionary)N
+2777(is)X
+2860(not)X
+2991(created)X
+3253(and)X
+3398(the)X
+3525(program)X
+3826(treats)X
+4029(the)X
+4156(input)X
+2520 3792(as)N
+2618(a)X
+2685(single)X
+2907(character)X
+3234(de\256nition)X
+3571(that)X
+3722(is)X
+3806(to)X
+3900(be)X
+4008(translated)X
+2520 3888(into)N
+2693(a)X
+2778(P)X
+8 s 8 xH F
+2822(OST)X
+10 s 10 xH F
+2943(S)X
+8 s 8 xH F
+2987(CRIPT)X
+10 s 10 xH F
+3218(outline)X
+3489(de\256nition.)X
+3883(After)X
+9 f F
+4103(mf2ps)X
+1 f F
+2520 3984(prompts)N
+2815(\252)X
+5 f F
+2851(**)X
+1 f F
+(\272,)S
+3036(we)X
+3163(are)X
+3295(in)X
+3390(the)X
+0 f F
+3521(METAFONT)X
+1 f F
+3895(environment.)X
+2520 4080(Now)N
+2696(the)X
+2814(user)X
+2968(inputs)X
+9 s 9 xH 5 f F
+2679 4272(\\mode=hires;\\nodisplays;\\input)N
+4012(cmr10;)X
+47 f F
+4270(\277)X
+10 s 10 xH 1 f F
+2520 4464(After)N
+9 f F
+2735(mf2ps)X
+1 f F
+2995(has)X
+3146(\256nished,)X
+3463(the)X
+3605(resulting)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4560(font)N
+2685(dictionary)X
+3046(can)X
+3194(be)X
+3306(used)X
+3489(to)X
+3587(print)X
+3774(text.)X
+3950(In)X
+4053(order)X
+4258(to)X
+2520 4656(print)N
+2712(text,)X
+2894(the)X
+3034(font)X
+3205(dictionary)X
+3572(should)X
+3827(be)X
+3945(installed)X
+4258(in)X
+2520 4752(some)N
+2716(formatter's)X
+3100(font)X
+3256(source)X
+3493(directory,)X
+3830(and)X
+3973(then)X
+4138(it)X
+4208(can)X
+2520 4848(be)N
+2623(loaded)X
+2864(through)X
+3140(the)X
+3265(formatter's)X
+3649(commands.)X
+4043(The)X
+4195(dic-)X
+2520 4944(tionary)N
+2776(followed)X
+3090(by)X
+3199(appropriate)X
+9 f F
+3596(show)X
+1 f F
+3811(and)X
+9 f F
+3958(showpage)X
+1 f F
+2520 5040(commands)N
+2887(can)X
+3019(also)X
+3168(be)X
+3264(sent)X
+3413(directly)X
+3678(to)X
+3760(the)X
+3878(printer.)X
+3 f F
+2520 5232(6)N
+2620(Evaluation)X
+3012(of)X
+3099(results)X
+1 f F
+2520 5376(This)N
+2696(section)X
+2957(evaluates)X
+3290(the)X
+9 f F
+3424(mf2ps)X
+1 f F
+3675(program)X
+3982(relative)X
+4258(to)X
+2520 5472(goals)N
+2716(established)X
+3099(in)X
+3187(section)X
+3440(3.2.)X
+3586(The)X
+3737(program)X
+4035(was)X
+4186(pro-)X
+2520 5568(duced)N
+2745(as)X
+2845(a)X
+2914(variation)X
+3232(of)X
+0 f F
+3332(METAFONT)X
+1 f F
+3706(and)X
+3855(it)X
+3933(accepts)X
+4204(any)X
+0 f F
+2520 5664(METAFONT)N
+1 f F
+2893(font)X
+3054(de\256nition)X
+3392(and)X
+3540(produces)X
+3862(a)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2445 6084(12)N
+
+%%Page: 12 13
+12 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(outline)N
+822(font)X
+975(scaleable)X
+1294(up)X
+1398(to)X
+1484(magni\256cation)X
+1948(8,)X
+2033(or)X
+2125(to)X
+2212(point)X
+576 768(size)N
+725(80)X
+829(if)X
+902(you)X
+1046(are)X
+1169(not)X
+1295(a)X
+1355(purist.)X
+1581(Thus)X
+1765(goals)X
+1958(6)X
+2022(and)X
+2161(1)X
+2224(have)X
+576 864(been)N
+756(entirely)X
+1029(met)X
+1177(and)X
+1321(goal)X
+1487(2)X
+1555(is)X
+1637(partially)X
+1933(met.)X
+2102(To)X
+2220(meet)X
+576 960(goal)N
+753(2)X
+832(fully)X
+1022(the)X
+1159(program)X
+1469(must)X
+1662(be)X
+1776(modi\256ed)X
+2098(to)X
+2198(allow)X
+576 1056(large)N
+782(enough)X
+1063(arrays)X
+1305(to)X
+1412(handle)X
+1671(magni\256cations)X
+2188(up)X
+2314(to)X
+576 1152(7200;)N
+778(this)X
+913(is)X
+986(left)X
+1113(to)X
+1195(future)X
+1407(work.)X
+735 1248(It)N
+810(remains)X
+1090(to)X
+1178(evaluate)X
+1472(the)X
+1596(appearance)X
+1985(and)X
+2127(sizes)X
+2309(of)X
+576 1344(the)N
+695(outline)X
+938(fonts)X
+1119(relative)X
+1381(to)X
+1464(the)X
+1583(bitmapped)X
+1942(fonts)X
+2122(to)X
+2204(see)X
+2327(if)X
+576 1440(goals)N
+765(3,)X
+845(4,)X
+925(and)X
+1061(5)X
+1121(have)X
+1293(been)X
+1465(met.)X
+3 f F
+576 1632(6.1)N
+736(Appearance.)X
+1 f F
+1229(In)X
+1335(order)X
+1544(to)X
+1645(compare)X
+1962(appearances,)X
+576 1728(the)N
+705(outline)X
+958(font)X
+1118(\(Subsub\256gure)X
+1598(P\))X
+1700(and)X
+1847(and)X
+1994(the)X
+2123(300)X
+2274(dpi)X
+576 1824(bitmapped)N
+950(font)X
+1115(\(Subsub\256gure)X
+1600(M\))X
+1735(generated)X
+2085(from)X
+2278(the)X
+576 1920(same)N
+0 f F
+763(METAFONT)X
+1 f F
+1126(de\256nition)X
+1454(are)X
+1575(used)X
+1744(to)X
+1827(print)X
+1999(similar)X
+2242(sen-)X
+576 2016(tences)N
+844(at)X
+970(one,)X
+1174(two,)X
+1382(or)X
+1517(three)X
+1746(di)X
+1808 MX
+(ff)138 606 oc
+1856(erent)X
+2085(sizes)X
+2309(or)X
+576 2112(magni\256cations)N
+1070(on)X
+1173(three)X
+1356(devices)X
+1619(of)X
+1708(di)X
+1770 MX
+(ff)138 606 oc
+1818(ering)X
+2005(resolutions.)X
+576 2208(The)N
+738(sentences)X
+1083(are)X
+1219(printed)X
+1483(in)X
+1582(the)X
+5 f F
+1718(cmr)X
+1 f F
+1900(\(Sub\256gure)X
+2276(R\),)X
+5 f F
+576 2304(cmtt)N
+1 f F
+845(\(Sub\256gure)X
+1259(T\),)X
+1431(and)X
+5 f F
+1623(lasy)X
+1 f F
+1891(\(Sub\256gure)X
+2305(S\))X
+576 2400(typefaces.)N
+967(The)X
+1139(bitmapped)X
+1525(fonts)X
+1733(may)X
+1919(be)X
+2043(printed)X
+2318(at)X
+576 2496(design)N
+814(sizes)X
+999(7,)X
+1088(8,)X
+1177(10,)X
+1306(or)X
+1402(12,)X
+1530(and)X
+1674(the)X
+1800(outline)X
+2050(fonts)X
+2238(may)X
+576 2592(be)N
+678(printed)X
+931(at)X
+1015(magni\256cations)X
+1512(.7,)X
+1618(.8,)X
+1724(1.0,)X
+1870(or)X
+1963(1.2.)X
+2130(Finally,)X
+576 2688(the)N
+700(three)X
+887(devices)X
+1153(are)X
+1277(the)X
+1400(300)X
+1545(dpi)X
+1672(LaserWriterII)X
+2140(\(Figure)X
+576 2784(11-LW300\),)N
+1001(the)X
+1125(600)X
+1271(dpi)X
+1399(Varityper)X
+1733(\(Figure)X
+1995(11-VT600\),)X
+576 2880(and)N
+724(the)X
+853(1270)X
+1044(dpi)X
+1177(Linotronic)X
+1546(300)X
+1697(\(Figure)X
+1964(11-LT1270\).)X
+576 2976(The)N
+731(bitmapped)X
+1099(font)X
+1258(examples)X
+1591(are)X
+1720(formatted)X
+2063(with)X
+2236(T)X
+2277 2992(E)N
+2318 2976(X)N
+576 3072(while)N
+784(the)X
+912(outline)X
+1164(font)X
+1323(examples)X
+1656(are)X
+1785(hand-coded)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 3168(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+832(\256les)X
+995(sent)X
+1154(directly)X
+1430(to)X
+1523(the)X
+1652(printer.)X
+1917(Since)X
+2126(the)X
+2255(for-)X
+576 3264(matter)N
+802(with)X
+965(which)X
+1182(this)X
+1318(paper)X
+1518(is)X
+1592(printed)X
+1840(can)X
+1972(use)X
+2099(arbitrary)X
+576 3360(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1010(fonts,)X
+1233(half)X
+1402(of)X
+1513(the)X
+1655(examples)X
+2002(could)X
+2224(have)X
+576 3456(been)N
+751(done)X
+930(in-line)X
+1161(without)X
+1427(pasting)X
+1680(in.)X
+1784(However,)X
+2121(for)X
+2237(fair-)X
+576 3552(ness)N
+742(in)X
+832(the)X
+958(comparison,)X
+1380(all)X
+1488(examples)X
+1819(were)X
+2004(cut)X
+2130(out)X
+2260(and)X
+576 3648(pasted)N
+801(in.)X
+735 3744(There)N
+951(are)X
+1078(visible)X
+1319(di)X
+1381 MX
+(ff)138 606 oc
+1429(erences)X
+1699(due)X
+1843(to)X
+1933(di)X
+1995 MX
+(ff)138 606 oc
+2043(erences)X
+2314(in)X
+576 3840(the)N
+697(formatting)X
+1057(software.)X
+1376(T)X
+1417 3856(E)N
+1458 3840(X)N
+1538(squeezes)X
+1846(the)X
+1966(letters)X
+2184(closer)X
+576 3936(together)N
+871(than)X
+1041(does)X
+1220(the)X
+1350(P)X
+8 s 8 xH F
+1394(OST)X
+10 s 10 xH F
+1515(S)X
+8 s 8 xH F
+1559(CRIPT)X
+10 s 10 xH F
+1773(engine.)X
+2039(Moreover,)X
+576 4032(the)N
+701(interword)X
+1040(space)X
+1246(is)X
+1326(constant)X
+1620(in)X
+1709(the)X
+1834(P)X
+8 s 8 xH F
+1878(OST)X
+10 s 10 xH F
+1999(S)X
+8 s 8 xH F
+2043(CRIPT)X
+10 s 10 xH F
+2251(dic-)X
+576 4128(tionary)N
+824(but)X
+947(is)X
+1021(varied)X
+1244(by)X
+1346(T)X
+1387 4144(E)N
+1428 4128(X)N
+1508(according)X
+1847(to)X
+1931(the)X
+2051(line)X
+2193(struc-)X
+576 4224(ture.)N
+769(These)X
+989(di)X
+1051 MX
+(ff)138 606 oc
+1099(erences)X
+1369(are)X
+1496(not)X
+1626(the)X
+1751(di)X
+1813 MX
+(ff)138 606 oc
+1861(erences)X
+2130(that)X
+2277(are)X
+576 4320(at)N
+654(issue)X
+834(here.)X
+735 4416(On)N
+855(the)X
+975(300)X
+1117(dpi)X
+1241(device,)X
+1494(the)X
+1615(characters)X
+1965(from)X
+2144(the)X
+2265(bit-)X
+576 4512(mapped)N
+854(fonts)X
+1038(print)X
+1213(thinner)X
+1464(than)X
+1626(are)X
+1749(those)X
+1942(of)X
+2033(the)X
+2154(outline)X
+576 4608(fonts.)N
+801(However,)X
+1161(the)X
+1304(edges)X
+1532(of)X
+1644(both)X
+1831(sets)X
+1996(are)X
+2140(equally)X
+576 4704(smooth)N
+856(or)X
+968(jagged)X
+1227(as)X
+1339(the)X
+1482(case)X
+1666(may)X
+1849(be)X
+1970(in)X
+2076(all)X
+2200(sizes.)X
+576 4800(Overall,)N
+869(then,)X
+1060(the)X
+1191(appearance)X
+1587(of)X
+1687(the)X
+1818(characters)X
+2178(of)X
+2278(the)X
+576 4896(bitmapped)N
+937(fonts)X
+1120(is)X
+1196(crisper)X
+1438(than)X
+1599(that)X
+1742(of)X
+1832(the)X
+1952(outline)X
+2196(fonts.)X
+576 4992(On)N
+697(the)X
+818(higher)X
+1047(resolution)X
+1391(devices,)X
+1676(the)X
+1798(thicknesses)X
+2187(of)X
+2278(the)X
+576 5088(characters)N
+934(are)X
+1064(closer)X
+1287(to)X
+1380(being)X
+1588(equal)X
+1792(at)X
+1880(all)X
+1990(sizes.)X
+2196(Thus,)X
+576 5184(the)N
+0 f F
+702(METAFONT)X
+1 f F
+1071(program)X
+1371(does)X
+1546(a)X
+1610(better)X
+1821(job)X
+1951(of)X
+2046(building)X
+2340(a)X
+576 5280(correctly)N
+887(sized)X
+1077(bitmap)X
+1323(at)X
+1405(300)X
+1549(dpi)X
+1675(than)X
+1837(does)X
+2008(the)X
+2130(300)X
+2274(dpi)X
+576 5376(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1013(engine)X
+1273(of)X
+1386(the)X
+1530(LaserWriterII.)X
+2039(The)X
+2211(latter)X
+576 5472(seems)N
+805(to)X
+900(round)X
+1120(up)X
+1232(too)X
+1366(much.)X
+1596(However,)X
+1943(both)X
+2117(seem)X
+2314(to)X
+576 5568(get)N
+696(the)X
+816(edges)X
+1022(equally)X
+1281(smooth)X
+1539(even)X
+1714(at)X
+1795(low)X
+1938(sizes)X
+2117(and)X
+2256(low)X
+576 5664(resolutions.)N
+2679 672(At)N
+2782(the)X
+2903(two)X
+3046(higher)X
+3274(resolutions,)X
+3669(the)X
+3791(outline)X
+4037(fonts)X
+4221(are)X
+2520 768(signi\256cantly)N
+2941(better)X
+3150(than)X
+3313(the)X
+3436(outline)X
+3683(fonts)X
+3868(at)X
+3951(lower)X
+4159(reso-)X
+2520 864(lutions)N
+2767(and)X
+2914(are)X
+3044(signi\256cantly)X
+3470(better)X
+3684(than)X
+3853(the)X
+3982(bitmapped)X
+2520 960(fonts)N
+2709(at)X
+2796(the)X
+2923(same)X
+3117(resolution)X
+3466(of)X
+3561(printing.)X
+3862(However,)X
+4205(this)X
+2520 1056(latter)N
+2723(is)X
+2814(true)X
+2977(because)X
+3270(the)X
+3406(bitmapped)X
+3782(fonts)X
+3981(were)X
+4177(gen-)X
+2520 1152(erated)N
+2762(by)X
+2886(the)X
+0 f F
+3028(METAFONT)X
+1 f F
+3413(program)X
+3729(speci\256cally)X
+4138(to)X
+4244(be)X
+2520 1248(printed)N
+2777(at)X
+2865(300)X
+3015(dpi.)X
+3187(When)X
+3409(a)X
+3476(300-dpi)X
+3756(bitmap)X
+4009(is)X
+4093(printed)X
+2520 1344(with)N
+2684(no)X
+2786(scaling)X
+3035(at)X
+3115(600)X
+3257(or)X
+3346(1270)X
+3528(dpi,)X
+3672(it)X
+3738(remains)X
+4014(a)X
+4071(300-dpi)X
+2520 1440(bitmap.)N
+2785(As)X
+2898(expected,)X
+3228(the)X
+3350(300-dpi)X
+3623(bitmapped)X
+3985(fonts)X
+4169(print)X
+2520 1536(better)N
+2729(at)X
+2813(300)X
+2958(dpi)X
+3085(than)X
+3248(they)X
+3411(do)X
+3516(at)X
+3599(the)X
+3722(two)X
+3867(higher)X
+4097(resolu-)X
+2520 1632(tions.)N
+2679 1728(The)N
+2825(generated)X
+3159(outlines)X
+3434(are)X
+3555(not)X
+3679(\256ne-tuned)X
+4026(for)X
+4142(print-)X
+2520 1824(ing)N
+2641(at)X
+2718(low)X
+2857(resolutions,)X
+3247(such)X
+3413(as)X
+3499(300)X
+3638(dpi,)X
+3779(as)X
+3865(are)X
+3984(the)X
+0 f F
+4102(META-)X
+2520 1920(FONT)N
+1 f F
+2685(-generated)X
+3046(bitmaps.)X
+3340(It)X
+3410(might)X
+3617(be)X
+3715(useful)X
+3933(to)X
+4017(make)X
+4213(use)X
+2520 2016(of)N
+2615(the)X
+2741(P)X
+8 s 8 xH F
+2785(OST)X
+10 s 10 xH F
+2906(S)X
+8 s 8 xH F
+2950(CRIPT)X
+10 s 10 xH F
+3160(facilities)X
+3464(for)X
+3586(hinting)X
+3839(to)X
+3928(improve)X
+4222(the)X
+2520 2112(appearance)N
+2913(of)X
+3010(the)X
+3138(characters)X
+3495(printed)X
+3752(from)X
+3938(the)X
+4067(outlines)X
+2520 2208(at)N
+2598(low)X
+2738(resolutions.)X
+2679 2304(Figure)N
+2937(12)X
+3066(shows)X
+3315(samples)X
+3623(of)X
+3740(similar)X
+4012(sentences)X
+2520 2400(printed)N
+2783(on)X
+2899(the)X
+3033(same)X
+3234(three)X
+3431(devices)X
+3707(using)X
+3915(the)X
+4048(standard)X
+2520 2496(Helvetica,)N
+2871(Times)X
+3094(Roman,)X
+3368(and)X
+3507(Courier)X
+3776(P)X
+8 s 8 xH F
+3820(OST)X
+10 s 10 xH F
+3941(S)X
+8 s 8 xH F
+3985(CRIPT)X
+10 s 10 xH F
+4191(out-)X
+2520 2592(line)N
+2676(fonts)X
+2872(built)X
+3054(into)X
+3213(most)X
+3403(P)X
+8 s 8 xH F
+3447(OST)X
+10 s 10 xH F
+3568(S)X
+8 s 8 xH F
+3612(CRIPT)X
+10 s 10 xH F
+3794(-executing)X
+4168(laser)X
+2520 2688(printers.)N
+2838(It)X
+2920(appears)X
+3199(to)X
+3294(these)X
+3492(authors)X
+3762(that)X
+3916(the)X
+4048(standard)X
+2520 2784(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2956(fonts)X
+3160(are)X
+3303(signi\256cantly)X
+3742(better)X
+3969(than)X
+4151(those)X
+2520 2880(generated)N
+2865(from)X
+0 f F
+3053(METAFONT)X
+1 f F
+3426(fonts.)X
+3638(However,)X
+3985(this)X
+4132(is)X
+4218(not)X
+2520 2976(surprising.)N
+2898(Adobe)X
+3150(uses)X
+3326(a)X
+3400(grid)X
+3567(of)X
+3672(1000)X
+47 f F
+3852(\264)X
+1 f F
+3916(1000)X
+4114(for)X
+4245(its)X
+2520 3072(character)N
+2847(de\256nitions,)X
+3235(resulting)X
+3547(in)X
+3641(a)X
+3709(resolution)X
+4061(of)X
+4160(7200)X
+2520 3168(dpi)N
+2650(for)X
+2772(characters)X
+3127(printed)X
+3382(at)X
+3468(point)X
+3659(size)X
+3811(10.)X
+3958(Because)X
+4253(of)X
+2520 3264(size)N
+2679(limitations)X
+3054(of)X
+3155(the)X
+0 f F
+3287(METAFONT)X
+1 f F
+3662(program)X
+3969(the)X
+0 f F
+4102(META-)X
+2520 3360(FONT)N
+1 f F
+2706(outline)X
+2949(fonts)X
+3130(are)X
+3249(using)X
+3442(a)X
+3498(resolution)X
+3838(of)X
+3925(3,000)X
+4125(points)X
+2520 3456(per)N
+2644(inch.)X
+2823(However,)X
+3159(when)X
+3354(using)X
+3548(the)X
+3667(letters)X
+3885(in)X
+3969(small)X
+4164(sizes)X
+2520 3552(such)N
+2702(as)X
+2804(from)X
+2995(10)X
+3110(to)X
+3206(70,)X
+3340(quality)X
+3596(di)X
+3658 MX
+(ff)138 606 oc
+3706(erences)X
+3982(are)X
+4115(hardly)X
+2520 3648(visible)N
+2756(especially)X
+3100(when)X
+3298(working)X
+3589(with)X
+3755(printers)X
+4024(that)X
+4168(have)X
+2520 3744(a)N
+2588(resolution)X
+2940(of)X
+3039(300)X
+3190(points)X
+3416(per)X
+3550(inch)X
+3719(such)X
+3897(as)X
+3995(the)X
+4124(Apple)X
+2520 3840(LaserWriter.)N
+2988(Moreover,)X
+3364(Adobe)X
+3617(makes)X
+3861(liberal)X
+4106(use)X
+4253(of)X
+2520 3936(hinting)N
+2780(to)X
+2876(improve)X
+3177(the)X
+3309(appearance)X
+3706(of)X
+3807(its)X
+3916(fonts)X
+4109(at)X
+4200(low)X
+2520 4032(resolutions.)N
+2937(We)X
+3075(completely)X
+3458(ignored)X
+3730(hinting,)X
+4003(as)X
+4097(we)X
+4218(did)X
+2520 4128(not)N
+2642(see)X
+2765(any)X
+2901(way)X
+3055(to)X
+3137(automatically)X
+3593(generate)X
+3886(the)X
+4004(hints.)X
+3 f F
+2520 4320(6.2)N
+2680(Sizes)X
+2874(of)X
+2967(fonts.)X
+1 f F
+3202(Recall)X
+3433(that)X
+3579(it)X
+3649(is)X
+3728(necessary)X
+4067(to)X
+4155(com-)X
+2520 4416(pare)N
+2687(the)X
+2812(size)X
+2964(of)X
+3058(the)X
+3183(P)X
+8 s 8 xH F
+3227(OST)X
+10 s 10 xH F
+3348(S)X
+8 s 8 xH F
+3392(CRIPT)X
+10 s 10 xH F
+3601(outline)X
+3850(font)X
+4006(for)X
+4127(a)X
+4190(par-)X
+2520 4512(ticular)N
+0 f F
+2769(METAFONT)X
+1 f F
+3154(de\256nition)X
+3504(to)X
+3610(the)X
+3753(sizes)X
+3954(of)X
+4066(the)X
+4209(bit-)X
+2520 4608(mapped)N
+2811(fonts)X
+3008(in)X
+3107(P)X
+8 s 8 xH F
+3151(OST)X
+10 s 10 xH F
+3272(S)X
+8 s 8 xH F
+3316(CRIPT)X
+10 s 10 xH F
+3535(fonts)X
+3732(for)X
+3862(the)X
+3996(individual)X
+2520 4704(and)N
+2656(all)X
+2756(magni\256cations.)X
+2679 4800(This)N
+2858(comparison)X
+3269(is)X
+3360(made)X
+3572(in)X
+3672(this)X
+3825(section)X
+4090(for)X
+4222(the)X
+5 f F
+2520 4896(cmr10)N
+1 f F
+2785(font)X
+2939(at)X
+3022(the)X
+3145(standard)X
+3442(set)X
+3556(of)X
+3648(six)X
+3765(magni\256cations)X
+4260(1,)X
+2520 4992(1.095,)N
+2741(1.2,)X
+2882(1.44,)X
+3063(1.728,)X
+3284(and)X
+3422(2.07)X
+3584(\(which)X
+3829(are)X
+3950(approxima-)X
+2520 5088(tions)N
+2706(of)X
+2804(1.2)X
+2935(raised)X
+3158(to)X
+3251(the)X
+3380(powers)X
+3643(0,)X
+3734(.5,)X
+3844(1,)X
+3934(2,)X
+4024(3,)X
+4114(and)X
+4260(4,)X
+2520 5184(respectively\).)N
+2978(In)X
+3068(addition,)X
+3373(as)X
+3464(a)X
+3524(gesture)X
+3780(to)X
+3866(those)X
+4059(who)X
+4221(are)X
+2520 5280(not)N
+2658(purists)X
+2907(and)X
+3059(accept)X
+3300(magni\256cations)X
+3806(of)X
+3908(the)X
+4041(10)X
+4156(point)X
+2520 5376(design)N
+2774(size)X
+2944(as)X
+3056(di)X
+3118 MX
+(ff)138 606 oc
+3166(erent)X
+3372(point)X
+3581(sizes,)X
+3802(the)X
+3946(comparison)X
+2520 5472(includes)N
+2812(the)X
+5 f F
+2935(cmr)X
+1 f F
+3104(font)X
+3257(at)X
+3339(point)X
+3527(size)X
+3676(5,)X
+3760(6,)X
+3844(7,)X
+3928(8,)X
+4012(9,)X
+4096(10,)X
+4220(12,)X
+2520 5568(and)N
+2665(17,)X
+2795(the)X
+2923(standard)X
+3225(eight)X
+3415(design)X
+3654(sizes)X
+3840(maintained)X
+4226(for)X
+2520 5664(use)N
+2647(with)X
+2809(T)X
+2850 5680(E)N
+2891 5664(X.)N
+2445 6084(13)N
+
+%%Page: 13 14
+13 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+735 672(Table)N
+947(1)X
+1017(shows)X
+1247(the)X
+1375(sizes)X
+1561(in)X
+1653(bytes.)X
+1872(Thus)X
+2062(it)X
+2136(is)X
+2219(clear)X
+576 768(that)N
+721(the)X
+843(P)X
+8 s 8 xH F
+887(OST)X
+10 s 10 xH F
+1008(S)X
+8 s 8 xH F
+1052(CRIPT)X
+10 s 10 xH F
+1258(outline)X
+1504(font)X
+1657(is)X
+1734(bigger)X
+1963(than)X
+2125(any)X
+2265(bit-)X
+576 864(mapped)N
+855(font)X
+1009(and)X
+1150(that)X
+1295(goal)X
+1458(4)X
+1523(fails.)X
+1707(Moreover,)X
+2070(it)X
+2140(is)X
+2219(clear)X
+576 960(that)N
+735(the)X
+871(outline)X
+1131(font)X
+1298(is)X
+1389(bigger)X
+1632(than)X
+1808(the)X
+1944(sum)X
+2115(over)X
+2296(all)X
+576 1056(magni\256cations)N
+1067(of)X
+1154(one)X
+1290(design)X
+1519(size)X
+1664(and)X
+1801(than)X
+1960(the)X
+2079(sum)X
+2233(over)X
+576 1152(all)N
+681(standard)X
+978(design)X
+1212(sizes.)X
+1413(Thus)X
+1597(goal)X
+1759(5)X
+1823(fails.)X
+2005(In)X
+2096(fact,)X
+2261(this)X
+576 1248(failure)N
+830(is)X
+927(the)X
+1069(reason)X
+1323(that)X
+1487(the)X
+1629(samples)X
+1931(of)X
+2042(Figure)X
+2296(11)X
+576 1344(involve)N
+841(only)X
+1008(upper)X
+1216(case)X
+1380(letters.)X
+1621(Samples)X
+1916(with)X
+2082(complete)X
+576 1440(fonts)N
+757(with)X
+920(both)X
+1083(cases)X
+1274(often)X
+1460(overloaded)X
+1838(the)X
+1957(printer)X
+2193(avail-)X
+576 1536(able)N
+730(to)X
+812(the)X
+930(students)X
+1212(at)X
+1290(the)X
+1408(time)X
+1570(this)X
+1705(work)X
+1890(was)X
+2035(done.)X
+650 1728(Font)N
+939(Design)X
+1286(Magni-)X
+1676(Bitmap)X
+2031(Outlines)X
+1041 1824(size)N
+1286(\256cation)X
+1677(\(size)X
+1849(in)X
+2031(\(size)X
+2203(in)X
+1715 1920(bytes\))N
+2031(bytes\))X
+48 f F
+650 1936(i)N
+662(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+5 f F
+650 2032(cmr)N
+1 f F
+1086(10)X
+1286(1.0)X
+1691(22,812)X
+2031(245,000)X
+690 2128(")N
+1086(10)X
+1286(1.095)X
+1691(24,231)X
+2111(")X
+690 2224(")N
+1086(10)X
+1286(1.2)X
+1691(26,044)X
+2111(")X
+690 2320(")N
+1086(10)X
+1286(1.44)X
+1691(31,892)X
+2111(")X
+690 2416(")N
+1086(10)X
+1286(1.728)X
+1691(39,614)X
+2111(")X
+690 2512(")N
+1086(10)X
+1286(2.07)X
+1691(50,578)X
+2111(")X
+5 f F
+650 2608(cmr)N
+1 f F
+1126(5)X
+1286(1.0)X
+1691(16,729)X
+2111(")X
+690 2704(")N
+1126(6)X
+1286(1.0)X
+1691(17,757)X
+2111(")X
+690 2800(")N
+1126(7)X
+1286(1.0)X
+1691(18,820)X
+2111(")X
+690 2896(")N
+1126(8)X
+1286(1.0)X
+1691(20,041)X
+2111(")X
+690 2992(")N
+1126(9)X
+1286(1.0)X
+1691(21,580)X
+2111(")X
+690 3088(")N
+1086(12)X
+1286(1.0)X
+1691(25,658)X
+2111(")X
+690 3184(")N
+1086(17)X
+1286(1.0)X
+1691(37,140)X
+2111(")X
+48 f F
+650 3200(i)N
+662(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+1 f F
+650 3296(Total)N
+1651(352,896)X
+2031(245,000)X
+1354 3416(Table)N
+1557(1)X
+735 3560(However,)N
+1081(do)X
+1192(note)X
+1361(that)X
+1512(the)X
+1641(outline)X
+1894(font)X
+2055(is)X
+2140(smaller)X
+576 3656(than)N
+746(the)X
+876(sum)X
+1041(over)X
+1216(all)X
+1328(design)X
+1569(sizes)X
+1757(and)X
+1905(magni\256cations)X
+576 3752(thereof.)N
+735 3848(So)N
+848(in)X
+939(terms)X
+1147(of)X
+1244(disk)X
+1407(space)X
+1616(for)X
+1740(the)X
+1868(non-purists,)X
+2278(the)X
+576 3944(outline)N
+825(font)X
+981(represents)X
+1334(a)X
+1397(savings.)X
+1684(Again)X
+1906(notice)X
+2128(that)X
+2274(not)X
+576 4040(all)N
+698(magni\256cations)X
+1212(of)X
+1322(the)X
+1463(bitmapped)X
+1844(fonts)X
+2047(are)X
+2189(main-)X
+576 4136(tained)N
+822(and)X
+988(the)X
+1136(outline)X
+1408(font)X
+1587(is)X
+1690(arbitrarily)X
+2061(scaleable.)X
+576 4232(Moreover,)N
+947(as)X
+1048(the)X
+1180(magni\256cation)X
+1654(grows)X
+1884(the)X
+2016(size)X
+2176(of)X
+2278(the)X
+576 4328(bitmap)N
+818(grows)X
+1034(even)X
+1206(more)X
+1391(rapidly.)X
+735 4424(The)N
+888(disappointment)X
+1409(with)X
+1579(respect)X
+1835(to)X
+1925(saving)X
+2162(printer)X
+576 4520(and)N
+713(disk)X
+867(memory)X
+1155(says)X
+1314(that)X
+1454(it)X
+1518(is)X
+1591(important)X
+1922(to)X
+2004(spend)X
+2211(more)X
+576 4616(e)N
+612 MX
+(ff)138 606 oc
+660(ort)X
+769(to)X
+851(optimize)X
+1151(the)X
+1269(outline)X
+1511(font.)X
+735 4712(All)N
+871(is)X
+959(not)X
+1096(lost,)X
+1266(though!)X
+1550(As)X
+1674(this)X
+1824(paper)X
+2038(was)X
+2198(being)X
+576 4808(prepared)N
+902(for)X
+1040(publication)X
+1444(in)X
+2 f F
+1550(TUGboat)X
+1 f F
+1852(,)X
+1915(one)X
+2074(reviewer,)X
+576 4904(Nelson)N
+829(Beebe,)X
+1076(pointed)X
+1342(out)X
+1470(something)X
+1829(that)X
+1975(we)X
+2095(can)X
+2234(only)X
+576 5000(kick)N
+735(ourselves)X
+1059(for)X
+1174(not)X
+1296(noticing.)X
+1598(The)X
+1743(P)X
+8 s 8 xH F
+1787(OST)X
+10 s 10 xH F
+1908(S)X
+8 s 8 xH F
+1952(CRIPT)X
+10 s 10 xH F
+2154(outline)X
+576 5096(fonts)N
+777(that)X
+938(are)X
+1078(generated)X
+1432(by)X
+9 f F
+1555(mf2ps)X
+1 f F
+1813(are)X
+1953(horrendously)X
+576 5192(wasteful)N
+873(in)X
+960(space.)X
+1184(They)X
+1374(use)X
+1506(original,)X
+1800(built-in)X
+2060(command)X
+576 5288(names)N
+802(and)X
+939(absolute)X
+1227(coordinates.)X
+1638(A)X
+1718(signi\256cant)X
+2073(reduction)X
+576 5384(in)N
+661(size)X
+809(can)X
+944(be)X
+1043(obtained)X
+1342(by)X
+1445(de\256nition)X
+1774(and)X
+1913(use)X
+2043(in)X
+2127(the)X
+2247(out-)X
+576 5480(lines)N
+752(of)X
+844(single-character)X
+1383(command)X
+1724(names,)X
+1974(e.g.,)X
+2136(\252)X
+5 f F
+2172(M)X
+1 f F
+(\272)S
+2282(for)X
+576 5576(\252)N
+5 f F
+612(moveto)X
+1 f F
+(\272,)S
+995(and)X
+1150(by)X
+1269(use)X
+1415(of)X
+1521(relative)X
+1801(versions)X
+2106(of)X
+2211(these)X
+576 5672(commands)N
+943(with)X
+1105(operands)X
+1415(of)X
+1502(fewer)X
+1706(digits)X
+1903(after)X
+2071(the)X
+2190(initial)X
+2520 672(absolute)N
+5 f F
+2812(moveto)X
+1 f F
+3125(of)X
+3217(any)X
+3358(character.)X
+3699(A)X
+3782(simple)X
+4020(\256lter)X
+4195(was)X
+2520 768(written)N
+2769(to)X
+2853(obtain)X
+3075(new)X
+3231(compressed)X
+3633(versions)X
+3923(of)X
+4013(the)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 864(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2787(outline)X
+3050(fonts.)X
+3271(The)X
+3437(appearances)X
+3871(of)X
+3978(the)X
+4116(output)X
+2520 960(when)N
+2728(printing)X
+3016(with)X
+3193(these)X
+3393(new)X
+3562(versions)X
+3864(is)X
+3952(unchanged,)X
+2520 1056(but)N
+2654(what)X
+2842(is)X
+2927(sent)X
+3087(to)X
+3180(the)X
+3309(printer)X
+3554(is)X
+3638(signi\256cantly)X
+4064(smaller,)X
+2520 1152(about)N
+2718(37.7%)X
+2945(smaller.)X
+3221(The)X
+3366(reduction)X
+3689(on)X
+3789(a)X
+3845(per-letter)X
+4160(basis)X
+2520 1248(is)N
+2599(about)X
+2803(45%.)X
+3016(Table)X
+3225(2)X
+3291(shows)X
+3517(the)X
+3641(information)X
+4045(of)X
+4137(Table)X
+2520 1344(1)N
+2580(for)X
+2694(the)X
+2812(new)X
+2966(versions)X
+3253(of)X
+3340(the)X
+3458(outline)X
+3700(fonts.)X
+2594 1536(Font)N
+2883(Design)X
+3230(Magni-)X
+3620(Bitmap)X
+3975(Outlines)X
+2985 1632(size)N
+3230(\256cation)X
+3621(\(size)X
+3793(in)X
+3975(\(size)X
+4147(in)X
+3659 1728(bytes\))N
+3975(bytes\))X
+48 f F
+2594 1744(i)N
+2606(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+5 f F
+2594 1840(cmr)N
+1 f F
+3030(10)X
+3230(1.0)X
+3635(22,812)X
+3975(152,670)X
+2634 1936(")N
+3030(10)X
+3230(1.095)X
+3635(24,231)X
+4055(")X
+2634 2032(")N
+3030(10)X
+3230(1.2)X
+3635(26,044)X
+4055(")X
+2634 2128(")N
+3030(10)X
+3230(1.44)X
+3635(31,892)X
+4055(")X
+2634 2224(")N
+3030(10)X
+3230(1.728)X
+3635(39,614)X
+4055(")X
+2634 2320(")N
+3030(10)X
+3230(2.07)X
+3635(50,578)X
+4055(")X
+5 f F
+2594 2416(cmr)N
+1 f F
+3070(5)X
+3230(1.0)X
+3635(16,729)X
+4055(")X
+2634 2512(")N
+3070(6)X
+3230(1.0)X
+3635(17,757)X
+4055(")X
+2634 2608(")N
+3070(7)X
+3230(1.0)X
+3635(18,820)X
+4055(")X
+2634 2704(")N
+3070(8)X
+3230(1.0)X
+3635(20,041)X
+4055(")X
+2634 2800(")N
+3070(9)X
+3230(1.0)X
+3635(21,580)X
+4055(")X
+2634 2896(")N
+3030(12)X
+3230(1.0)X
+3635(25,658)X
+4055(")X
+2634 2992(")N
+3030(17)X
+3230(1.0)X
+3635(37,140)X
+4055(")X
+48 f F
+2594 3008(i)N
+2606(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+1 f F
+2594 3104(Total)N
+3595(352,896)X
+3975(152,670)X
+3298 3224(Table)N
+3501(2)X
+2679 3368(There)N
+2911(are)X
+3054(still)X
+3217(better)X
+3444(compressions)X
+3924(that)X
+4088(can)X
+4244(be)X
+2520 3464(achieved.)N
+2865(According)X
+3243(to)X
+3344(Beebe)X
+3584([4],)X
+3736(Toal)X
+3921(and)X
+4075(Raine's)X
+2520 3560(outline)N
+2787(representation)X
+3287(of)X
+5 f F
+3400(cmr)X
+1 f F
+3590(at)X
+3694(10)X
+3820(points)X
+4061(requires)X
+2520 3656(about)N
+2726(twice)X
+2927(the)X
+3052(space)X
+3258(needed)X
+3513(for)X
+3634(bitmaps)X
+3914(of)X
+4008(the)X
+4133(same;)X
+2520 3752(at)N
+2603(14)X
+2708(to)X
+2795(16)X
+2900(points,)X
+3140(the)X
+3264(outlines)X
+3543(and)X
+3685(the)X
+3809(bitmaps)X
+4088(occupy)X
+2520 3848(about)N
+2728(the)X
+2856(same)X
+3051(amount)X
+3321(of)X
+3418(space;)X
+3648(above)X
+3869(16)X
+3978(points,)X
+4222(the)X
+2520 3944(outlines)N
+2809(are)X
+2944(smaller)X
+3216(than)X
+3390(the)X
+3524(bitmaps.)X
+3833(It)X
+3918(is)X
+4007(clear)X
+4200(that)X
+2520 4040(better)N
+2727(encodings)X
+3076(exist)X
+3251(than)X
+3413(we)X
+3531(explored)X
+3836(and)X
+3976(these)X
+4165(must)X
+2520 4136(be)N
+2616(explored)X
+2917(for)X
+3031(any)X
+3167(future)X
+3379(version)X
+3635(of)X
+9 f F
+3724(mf2ps)X
+1 f F
+3941(.)X
+2679 4232(One)N
+2842(such)X
+3018(better)X
+3230(encoding)X
+3553(appears)X
+3828(to)X
+3919(be)X
+4024(that)X
+4173(used)X
+2520 4328(by)N
+2629(Adobe)X
+2872(for)X
+2995(its)X
+3099(own)X
+3266(proprietary)X
+3652(fonts;)X
+3863(fonts)X
+4052(encoded)X
+2520 4424(this)N
+2655(way)X
+2809(have)X
+2981(a)X
+3037(FontType)X
+3368(of)X
+3456(1.)X
+3557(User)X
+3730(de\256ned)X
+3987(fonts)X
+4168(have)X
+2520 4520(a)N
+2587(FontType)X
+2929(of)X
+3027(3.)X
+3118(Beebe)X
+3350([4])X
+3475(says)X
+3643(that)X
+3793(type)X
+3961(1)X
+4031(fonts)X
+4221(are)X
+2520 4616(handled)N
+2813(with)X
+2994(greater)X
+3257(e)X
+3293 MX
+(Fi)139 825 oc
+(ciency)S
+3608(than)X
+3785(type)X
+3962(3)X
+4041(fonts)X
+4240(on)X
+2520 4712(most)N
+2700(existing)X
+2978(P)X
+8 s 8 xH F
+3022(OST)X
+10 s 10 xH F
+3143(S)X
+8 s 8 xH F
+3187(CRIPT)X
+10 s 10 xH F
+3394(interpreters,)X
+3805(especially)X
+4151(those)X
+2520 4808(that)N
+2683(are)X
+2825(based)X
+3051(on)X
+3174(Adobe-licensed)X
+3721(code.)X
+3956(Adobe)X
+4213(has)X
+2520 4904(recently)N
+2822(published)X
+3175(speci\256cations)X
+3653(for)X
+3789(the)X
+3929(type)X
+4109(1)X
+4191(font)X
+2520 5000(encoding)N
+2840([2],)X
+2980(thus)X
+3139(allowing)X
+3445(anyone)X
+3703(to)X
+3791(produced)X
+4116(type)X
+4280(1)X
+2520 5096(fonts.)N
+2729(Beebe)X
+2959(believes)X
+3251(that)X
+3400(the)X
+3527(market)X
+3778(forces)X
+4003(will)X
+4155(drive)X
+2520 5192(other)N
+2708(companies)X
+3074(to)X
+3159(encode)X
+3410(their)X
+3580(fonts)X
+3763(as)X
+3853(type)X
+4015(1.)X
+4119(More-)X
+2520 5288(over,)N
+2714(as)X
+2812(more)X
+3008(and)X
+3155(more)X
+3351(windowing)X
+3742(systems)X
+4026(based)X
+4240(on)X
+2520 5384(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2911(,)X
+2954(e.g.,)X
+3113(NeWS)X
+3350(and)X
+3489(NeXT,)X
+3733(appear,)X
+3992(the)X
+4114(attrac-)X
+2520 5480(tion)N
+2672(of)X
+2767(P)X
+8 s 8 xH F
+2811(OST)X
+10 s 10 xH F
+2932(S)X
+8 s 8 xH F
+2976(CRIPT)X
+10 s 10 xH F
+3186(outline)X
+3436(fonts)X
+3624(will)X
+3776(increase,)X
+4088(as)X
+4182(then)X
+2520 5576(the)N
+2651(same)X
+2849(font)X
+3012(can)X
+3158(be)X
+3268(used)X
+3449(for)X
+3577(both)X
+3753(printing)X
+4040(and)X
+4190(pre-)X
+2520 5672(viewing.)N
+2827(Thus,)X
+3036(the)X
+3163(incentive)X
+3486(will)X
+3639(be)X
+3743(to)X
+3833(convert)X
+0 f F
+4102(META-)X
+1 f F
+2445 6084(16)N
+
+%%Page: 14 15
+14 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+576 672(FONT)N
+1 f F
+761(fonts)X
+941(into)X
+1085(type)X
+1243(1)X
+1303(P)X
+8 s 8 xH F
+1347(OST)X
+10 s 10 xH F
+1468(S)X
+8 s 8 xH F
+1512(CRIPT)X
+10 s 10 xH F
+1714(outline)X
+1956(fonts.)X
+735 768(Ultimately,)N
+1124(the)X
+1250(tradeo)X
+1451 MX
+(ff)138 606 oc
+1527(is)X
+1608(between)X
+1904(the)X
+2030(size)X
+2183(of)X
+2278(the)X
+576 864(font)N
+741(sent)X
+906(to)X
+1004(the)X
+1138(printer,)X
+1408(and)X
+1560(the)X
+1693(time)X
+1870(it)X
+1949(takes)X
+2149(for)X
+2278(the)X
+576 960(printer)N
+815(to)X
+902(decode)X
+1155(the)X
+1278(program)X
+1576(for)X
+1696(the)X
+1820(characters.)X
+2193(How-)X
+576 1056(ever,)N
+764(with)X
+934(proper)X
+1172(cacheing,)X
+1506(a)X
+1570(big)X
+1700(enough)X
+1964(cache,)X
+2196(and)X
+2340(a)X
+576 1152(not)N
+715(very)X
+895(fancy)X
+1111(document,)X
+1484(the)X
+1619(decoding)X
+1950(is)X
+2040(done)X
+2234(only)X
+576 1248(once)N
+748(per)X
+871(character)X
+1187(for)X
+1301(the)X
+1419(document!)X
+3 f F
+576 1440(7)N
+676(Future)X
+932(work)X
+1 f F
+576 1584(For)N
+708(the)X
+827(future,)X
+1060(there)X
+1242(are)X
+1362(a)X
+1420(number)X
+1687(of)X
+1776(improvements)X
+2256(that)X
+576 1680(can)N
+714(be)X
+816(made.)X
+1055(Currently,)X
+1407(each)X
+1580(letter)X
+1770(of)X
+1862(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 1776(outline)N
+820(fonts)X
+1002(is)X
+1077(described)X
+1407(as)X
+1496(a)X
+1555(set)X
+1667(of)X
+1757(cyclic)X
+1972(paths.)X
+2184(When)X
+576 1872(all)N
+698(are)X
+839(\256lled)X
+1045(or)X
+1154(stroked,)X
+1452(one)X
+1609(gets)X
+1779(the)X
+1918(desired)X
+2191(letter.)X
+576 1968(Some)N
+789(of)X
+887(those)X
+1087(cyclic)X
+1310(paths)X
+1510(have)X
+1693(a)X
+1761(common)X
+2073(boundary)X
+576 2064(that)N
+721(is)X
+799(inside)X
+1015(the)X
+1138(letter)X
+1327(and)X
+1467(is)X
+1544(not)X
+1670(necessary)X
+2007(for)X
+2125(the)X
+2247(out-)X
+576 2160(line)N
+733(description)X
+1126(of)X
+1230(the)X
+1365(letter)X
+1567(as)X
+1671(a)X
+1745(whole.)X
+1999(Eliminating)X
+576 2256(these)N
+772(paths)X
+972(and)X
+1118(creating)X
+1407(one)X
+1553(outline)X
+1805(for)X
+1929(the)X
+2057(letter)X
+2252(will)X
+576 2352(save)N
+753(space.)X
+986(Today)X
+1225(this)X
+1374(can)X
+1520(be)X
+1630(done)X
+1820(manually,)X
+2172(and)X
+2323(is)X
+576 2448(worth)N
+789(the)X
+912(e)X
+948 MX
+(ff)138 606 oc
+996(ort)X
+1110(because)X
+1390(the)X
+1513(translation)X
+1876(process)X
+2142(is)X
+2220(done)X
+576 2544(only)N
+738(once.)X
+930(From)X
+1123(that)X
+1263(time)X
+1426(on,)X
+1547(the)X
+1666(font)X
+1816(is)X
+1890(used)X
+2058(the)X
+2177(way)X
+2332(it)X
+576 2640(is.)N
+735 2736(As)N
+863(was)X
+1027(demonstrated)X
+1498(by)X
+1617(Beebe's)X
+1916(rescue)X
+2162(of)X
+2269(our)X
+576 2832(result,)N
+796(closer)X
+1010(attention)X
+1312(should)X
+1547(be)X
+1645(paid)X
+1805(to)X
+1888(obtaining)X
+2211(more)X
+576 2928(compact)N
+869(representations)X
+1376(of)X
+1464(character)X
+1781(outlines,)X
+2076(represen-)X
+576 3024(tations)N
+811(for)X
+927(which)X
+1145(P)X
+8 s 8 xH F
+1189(OST)X
+10 s 10 xH F
+1310(S)X
+8 s 8 xH F
+1354(CRIPT)X
+10 s 10 xH F
+1557(routines)X
+1836(can)X
+1969(be)X
+2066(written)X
+2314(to)X
+576 3120(interpret)N
+868(them)X
+1048(into)X
+1192(standard)X
+1484(outline)X
+1726(drawing)X
+2009(commands.)X
+576 3216(Collapsing)N
+952(commands)X
+1329(into)X
+1482(single)X
+1702(characters)X
+2058(and)X
+2203(using)X
+576 3312(relative)N
+839(movements)X
+1231(saved)X
+1437(signi\256cant)X
+1793(amounts)X
+2087(of)X
+2177(space.)X
+576 3408(Perhaps,)N
+882(even)X
+1066(more)X
+1263(dramatic)X
+1576(savings)X
+1848(can)X
+1992(be)X
+2100(obtained)X
+576 3504(by)N
+676(giving)X
+900(coordinates)X
+1290(and)X
+1426(distances)X
+1740(in)X
+1822(hexadecimal.)X
+735 3600(More)N
+945(e)X
+981 MX
+(ff)138 606 oc
+1029(ort)X
+1154(can)X
+1302(be)X
+1414(spent)X
+1620(on)X
+1737(modifying)X
+2107(the)X
+2242(pro-)X
+576 3696(gram)N
+790(in)X
+901(order)X
+1120(to)X
+1231(allow)X
+1458(magni\256cations)X
+1978(up)X
+2106(to)X
+2216(7200)X
+576 3792(points.)N
+824(Thus,)X
+1037(no)X
+1150(jaggies)X
+1410(will)X
+1567(be)X
+1677(seen,)X
+1874(as)X
+1975(occasionally)X
+576 3888(happens)N
+866(when)X
+1067(using)X
+1267(higher)X
+1499(magni\256cations,)X
+2017(e.g.,)X
+2180(in)X
+2269(our)X
+576 3984(translated)N
+915(fonts)X
+1102(at)X
+1187(magni\256cation)X
+1654(8.)X
+1741(This)X
+1910(could)X
+2116(be)X
+2220(done)X
+576 4080(by)N
+692(enlarging)X
+1031(the)X
+1164(program)X
+1471(arrays)X
+1703(to)X
+1800(handle)X
+2049(characters)X
+576 4176(based)N
+812(on)X
+945(7200)X
+1159(points.)X
+1428(A)X
+1540(sophisticated)X
+2012(solution)X
+2323(is)X
+576 4272(required)N
+867(if)X
+939(one)X
+1078(wants)X
+1288(to)X
+1373(save)X
+1539(room)X
+1731(while)X
+1932(compiling)X
+2278(the)X
+576 4368(input)N
+767(font.)X
+943(In)X
+1037(such)X
+1211(a)X
+1274(case,)X
+1460(any)X
+1603(linear)X
+1814(translation)X
+2180(which)X
+576 4464(is)N
+652(done)X
+831(within)X
+1058(the)X
+1179(P)X
+8 s 8 xH F
+1223(OST)X
+10 s 10 xH F
+1344(S)X
+8 s 8 xH F
+1388(CRIPT)X
+10 s 10 xH F
+1593(program)X
+1888(is)X
+1964(with)X
+2129(a)X
+2188(factor)X
+576 4560(less)N
+716(than)X
+874(1.)X
+0 f F
+735 4656(METAFONT)N
+1 f F
+1106(was)X
+1261(changed)X
+1559(for)X
+1684(T)X
+1725 4672(E)N
+1766 4656(X)N
+1855(3.0.)X
+2006(It)X
+2086(is)X
+2170(neces-)X
+576 4752(sary)N
+747(to)X
+846(build)X
+1047(a)X
+1120(new)X
+1291(version)X
+1564(of)X
+9 f F
+1670(mf2ps)X
+1 f F
+1924(based)X
+2144(on)X
+2261(this)X
+576 4848(latest)N
+790(version)X
+1071(of)X
+0 f F
+1183(METAFONT)X
+1 f F
+1524(.)X
+1589(As)X
+1723(the)X
+1866(changes)X
+2170(to)X
+2278(the)X
+0 f F
+576 4944(METAFONT)N
+1 f F
+967(program)X
+1289(deal)X
+1473(mainly)X
+1744(with)X
+1935(ligatures)X
+2260(and)X
+576 5040(kerning,)N
+877(the)X
+1011(calculation)X
+1400(of)X
+1504(envelopes)X
+1862(is)X
+1952(probably)X
+2274(not)X
+576 5136(a)N
+612 MX
+(ff)138 606 oc
+660(ected.)X
+869(Therefore,)X
+1226(it)X
+1289(is)X
+1361(likely)X
+1562(that)X
+1702(the)X
+1820(portion)X
+2071(of)X
+0 f F
+2158(META-)X
+576 5232(FONT)N
+1 f F
+769(up)X
+877(to)X
+967(the)X
+1093(calculation)X
+1473(of)X
+1568(the)X
+1694(envelope)X
+2012(can)X
+2152(still)X
+2300(be)X
+576 5328(used)N
+746(as)X
+836(a)X
+894(front)X
+1072(end)X
+1210(for)X
+9 f F
+1328(mf2ps)X
+1 f F
+1567(with)X
+1731(very)X
+1896(little)X
+2064(change)X
+2314(in)X
+576 5424(the)N
+694(portion)X
+945(of)X
+1032(the)X
+1150(program)X
+1442(we)X
+1556(wrote.)X
+735 5520(Finally,)N
+1018(it)X
+1099(might)X
+1323(be)X
+1437(worthwhile,)X
+1860(for)X
+1992(the)X
+2128(sake)X
+2309(of)X
+576 5616(portability)N
+932(to)X
+1017(other)X
+1205(systems)X
+1481(and)X
+1619(enhanceability)X
+2109(by)X
+2211(other)X
+2520 672(humans,)N
+2834(to)X
+2941(rewrite)X
+3214(or)X
+3326(to)X
+3433(write)X
+3643(the)X
+3787(next)X
+3971(version)X
+4253(of)X
+9 f F
+2520 768(mf2ps)N
+1 f F
+2757(with)X
+5 f F
+2919(WEB)X
+1 f F
+(.)S
+3 f F
+2520 960(Acknowledgments)N
+1 f F
+2520 1104(The)N
+2685(authors)X
+2961(thank)X
+3179(the)X
+2 f F
+3317(TUGboat)X
+1 f F
+3659(editors,)X
+3937(and)X
+4093(Nelson)X
+2520 1200(Beebe)N
+2742(for)X
+2857(their)X
+3025(help,)X
+3204(sharp)X
+3399(comments,)X
+3769(and)X
+3906(result-saving)X
+2520 1296(ideas.)N
+2751(Dealing)X
+3032(with)X
+3201(their)X
+3375(comments)X
+3731(made)X
+3932(this)X
+4074(a)X
+4137(better)X
+2520 1392(paper.)N
+3 f F
+2520 1584(References)N
+1 f F
+2600 1704(1.)N
+2 f F
+2760(P)X
+8 s 8 xH F
+2809(OST)X
+10 s 10 xH F
+2923(S)X
+8 s 8 xH F
+(CRIPT)S
+10 s 10 xH F
+3230(Language)X
+3639(Reference)X
+4051(Manual,)X
+1 f F
+2760 1800(Adobe)N
+3004(Systems)X
+3300(Incorporated,)X
+3761(Addison-Wesley,)X
+2760 1896(Reading,)N
+3067(MA)X
+3216(\(1985\).)X
+2600 2016(2.)N
+2760(\252Adobe)X
+3080(Type)X
+3316(1)X
+3427(Font)X
+3644(Format,\272)X
+4002(Part)X
+4202(No.)X
+2760 2112(LPS0064,)N
+3097(Adobe)X
+3331(Systems,)X
+3637(Inc.)X
+3780(\(March,)X
+4057(1990\).)X
+2600 2232(3.)N
+2760(S.)X
+2844(von)X
+2984(Bechtolsheim,)X
+3526(\252The)X
+3769(T)X
+3810 2248(E)N
+3851 2232(X)N
+3992(PostScript)X
+2760 2328(Software)N
+3088(Package,\272)X
+2 f F
+3450(TUGboat)X
+3 f F
+3790(10)X
+1 f F
+(\(1\),)S
+4022(p.)X
+4120(25\26127)X
+2760 2424(\(1989\).)N
+2600 2544(4.)N
+2760(N.)X
+2858(Beebe,)X
+3099(Private)X
+3346(communication,)X
+3884(via)X
+4003(electronic)X
+2760 2640(mail.)N
+2982(\(1990\).)X
+2600 2760(5.)N
+2760(L.)X
+2849(Carr,)X
+3110(\252Of)X
+3329(Metafont)X
+3721(and)X
+3936(PostScript,\272)X
+2 f F
+2760 2856(T)N
+2796 2872(E)N
+2845 2856(Xniques)N
+3 f F
+3123(5)X
+1 f F
+(,)S
+3203(p.)X
+3283(141\261152)X
+3583(\(August,)X
+3881(1987\).)X
+2600 2976(6.)N
+2760(D.)X
+2858(Henderson,)X
+3255(\252Outline)X
+3561(fonts)X
+3751(with)X
+0 f F
+3923(METAFONT)X
+1 f F
+4264(,\272)X
+2 f F
+2760 3072(TUGboat)N
+3 f F
+3082(10)X
+1 f F
+(\(1\),)S
+3296(p.)X
+3376(36\26138)X
+3596(\(1989\).)X
+2600 3192(7.)N
+2760(J.D.)X
+2909(Hobby,)X
+3200(\252A)X
+0 f F
+3347(METAFONT)X
+1 f F
+3688(-like)X
+3889(System)X
+4178(with)X
+2760 3288(PostScript)N
+3112(Output,\272)X
+2 f F
+3414(TUGboat)X
+3 f F
+3740(10)X
+1 f F
+(\(4\),)S
+3957(p.)X
+4040(505\261512)X
+2760 3384(\(1989\).)N
+2600 3504(8.)N
+2760(B.W.)X
+2949(Kernighan,)X
+3388(\252A)X
+3562(Typesetter-independent)X
+2760 3600(TROFF,\272)N
+3092(Computing)X
+3479(Science)X
+3757(Technical)X
+4102(Report)X
+2760 3696(No.)N
+2929(97,)X
+3080(Bell)X
+3264(Laboratories,)X
+3742(Murray)X
+4035(Hill,)X
+4231(NJ)X
+2760 3792(07974)N
+2980(\(March,)X
+3257(1982\).)X
+2600 3912(9.)N
+2760(D.E.)X
+2927(Knuth,)X
+2 f F
+3208(The)X
+3389(T)X
+3425 3928(E)N
+3474 3912(Xbook,)N
+1 f F
+3761(Addison-Wesley,)X
+2760 4008(Reading,)N
+3067(MA)X
+3216(\(1984\).)X
+2600 4128(10.)N
+2760(D.E.)X
+2927(Knuth,)X
+2 f F
+3226(The)X
+0 f F
+3425(METAFONT)X
+2 f F
+3766(book,)X
+1 f F
+4022(Addison-)X
+2760 4224(Wesley,)N
+3041(Reading,)X
+3348(MA)X
+3497(\(1986\).)X
+2600 4344(11.)N
+2760(D.E.)X
+2927(Knuth,)X
+0 f F
+3272(METAFONT)X
+2 f F
+3613(:)X
+3765(The)X
+4011(Program,)X
+1 f F
+2760 4440(Addison-Wesley,)N
+3339(Reading,)X
+3646(MA)X
+3795(\(1987\).)X
+2600 4560(12.)N
+2760(G.)X
+2858(Toal,)X
+3058(Private)X
+3319(communication,)X
+3871(via)X
+4003(electronic)X
+2760 4656(mail.)N
+2982(\(1990\).)X
+2600 4776(13.)N
+2760(J.)X
+2831(Ziv)X
+2974(and)X
+3122(A.)X
+3220(Lempel,)X
+3517(\252A)X
+3643(Universal)X
+3987(Algorithm)X
+2760 4872(for)N
+2877(Sequential)X
+3237(Data)X
+3411(Compression,\272)X
+2 f F
+3911(IEEE)X
+4107(Trans-)X
+2760 4968(actions)N
+3031(on)X
+3151(Information)X
+3573(Theory)X
+3 f F
+3840(3)X
+1 f F
+(,)S
+3940(p.)X
+4040(337\261343)X
+2760 5064(\(May,)N
+2974(1977\).)X
+9 s 9 xH 47 f F
+3000 5344(\340)N
+1 f F
+3096(Shimon)X
+3338(Yanai)X
+3096 5432(IBM)N
+3250(Science)X
+3492(and)X
+3614(Technology)X
+3192 5520(Center)N
+3096 5608(Technion)N
+3386(City)X
+10 s 10 xH F
+2445 6084(17)N
+
+%%Page: 15 16
+15 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+9 s 9 xH 1 f F
+1152 664(Haifa)N
+1330(32000)X
+1152 752(Israel)N
+1152 840(yanai@israearn.bitnet)N
+47 f F
+1056 1016(\340)N
+1 f F
+1152(Daniel)X
+1362(M.)X
+1462(Berry)X
+1152 1104(Computer)N
+1458(Science)X
+1152 1192(Technion)N
+1152 1280(Haifa)N
+1330(32000)X
+1152 1368(Israel)N
+1152 1456(dberry@cs.technion.ac.il)N
+10 s 10 xH F
+2445 6084(18)N
+
+%%Trailer
+xt
+
+xs
diff --git a/fonts/utilities/mf2ps/doc/paper.ref b/fonts/utilities/mf2ps/doc/paper.ref
new file mode 100644
index 0000000000..bbc5117845
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.ref
@@ -0,0 +1,1890 @@
+.nr [W \w'10'
+.nr [W \w'10'
+.pl 11.125i
+.de rb
+.ta 2m +5m +5m
+.nr t1\\n(.i
+.ls \\n(sq
+.in \\n(sem
+..
+.de rf
+.br
+.ne \\n(scu+\\n(sdu
+.sp \\n(sdu
+.ti -2m
+..
+.de LE
+.sp .5v
+..
+.de SU
+.ne 2v
+.br
+.ti 1.66P
+\f3\\$1\fP
+..
+.de Su
+.ne 2v
+.sp 1v
+\fB\&\\$1\fP
+..
+.de su
+.ne 3v
+.sp 1v
+.na
+\fB\&\\$1\fP
+.br
+.ad
+..
+.de PP
+.sp .5v
+..
+.de qb
+.in +\\n(sju
+.LL -\\n(sju
+.sp .5v
+..
+.de qe
+.in -\\n(sju
+.LL +\\n(sju
+.sp .5v
+..
+.de cl
+.ta\\n(sou +5m +5m
+.in+\\n(snu
+..
+.de dl
+.br
+.in-\\n(snu
+..
+.de ES
+.ft C
+.sp
+.nf
+.in +1.66P
+..
+.de EE
+.fi
+.ft R
+.sp
+.in -1.66P
+..
+.dehd
+.HS
+.nrhe+1
+.ie\\n(cn>1\{\
+.ie\\nc>\\n(cn\{\
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu
+.nrc 1 1
+.mkmx\}
+.el\{\
+.po+\\n(cwu+\\n(csu
+'sp|\\n(mxu\}\}
+.el\{\
+.if\\n(f5\{\
+.nr% +\\n(f5
+.nrf50 1\}
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu\}
+.chfx -\\n(tfu
+.chfo -\\n(tfu
+.if\\n(z1 .fz
+.chfo -\\n(tfu
+.if!\\n(f0 .ns
+.if\\n(f0\{\
+.nrf5\\n(f6
+.nrf6\\n(f7
+.nrf70
+.Ff
+.ie\\n(fa\{\
+.nrfa0
+.nrh21\}
+.el\{\
+.ie\\nx\{.if (\\n(nlu+5v)>(\\n(.p+\\nyu) .nr h1 1\}
+.el\{.if \\n(.tu<6v .nr h1 1\}\}\}
+.if\\n(h1=1\{\
+.nrh10
+'bp\}
+.if\\n(h2=1\{\
+.nrh20
+.fo\}
+.chfo (\\nyu-1v)
+.nrhe-1
+.HE
+..
+.defo
+.FS
+.if!\\n(he\{.if \\nx .xf\}
+.nrfa0
+.ie\\n(fg\{\
+.nrfa1
+.diGA\}
+.el\{\
+.ie\\n(cn<2\{\
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+.el.mf\}
+.FE
+..
+.demf
+.ie\\n+c<=\\n(cn .hd
+.el\{\
+.po\\n(cou
+.lt 6.63i
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+..
+.defn
+.ie\\nx .ne \\n(rcv-2v
+.el.ne \\n(rcv
+.if\\n(fn .AB"Nesting of footnotes is a no no"
+.nrfn1
+.daFN
+.ev1
+.ie\\n+x=1\{\
+.sp 10p
+\s-5\l'5P\(ul'\s+5
+.br\}
+.el.sp \\n(srv
+.fi
+.ad
+..
+.\" REFER macros .... citations
+.nr se 3u \" space to indent in emms
+.de []
+.][ \\$1
+..
+.de ][
+.if \\$1>5 .tm Bad arg to []
+.if !"\\*([O"" .if !\\n([O .as [O .
+.[\\$1
+..
+.ds RB ".RE
+.ds [. " [
+.ds .] ]
+.if n .ds [o ""
+.if n .ds [c ""
+.if t .ds [o \(lq
+.if t .ds [c \(rq
+.\" the next lines deal with the problem of .[1] or [1].
+.\" refer will write "linexxx\*(<.[1]\*(>.
+.\" and either "<." or ">." should produce the .;
+.\" similarly for ,
+.ds >. .
+.ds >, ,
+.de [5 \" tm style
+\\*([A, \\f2\\*([T\\f1,
+.ie \\n(TN \\*([M.
+.el UCLA Computer Science Department internal memorandum (\\*([D).
+.br
+..
+.de [0 \" other
+.if !"\\*([A"" \\*([A,
+.if !"\\*([O"" \\*([O
+.if !"\\*([D"" \& (\\*([D).
+.br
+..
+.de [1 \" journal article
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+\\f2\\*([J\\f1\c
+.if !"\\*([V"" .if n \& Vol.\&\c
+.if !"\\*([V"" \& \\f3\\*([V\\f1\c
+.if !"\\*([N"" (\\*([N)\c
+.if !"\\*([P"" \{\
+.ie \\n([P>0 , pp.\c
+.el , p.\c
+\& \\*([P\c\}
+.if !"\\*([I"" .if "\\*([R"" , \\*([I\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [2 \" book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\f2\\*([T,\\f1
+\\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([G"" Gov't. ordering no. \\*([G.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [4 \" report
+.if !"\\*([A"" \\*([A,
+\\*([o\\*([T,\\*([c
+\\*([R\c
+.if !"\\*([G"" \& (\\*([G)\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [3 \" article in book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+.if !"\\*([P"" pp. \\*([P
+in \\f2\\*([B\\f1\c
+.if !"\\*([E"" , ed. \\*([E\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.\" define warning that mX does not support references as footnotes
+.de ]-
+.AB"Can't do references as footnotes. Use '-e' or '-s' option with 'refer'
+..
+.de ]<
+.\" define the real ]- next-reference macro
+. de ]-
+. rm [V [P [A [T
+. rm [N [C [B [O
+. rm [R [I [E [D
+. rf
+\\\\*([F. \c
+\\..
+.\"now start the reference subsection
+\\*(RB
+.rb
+..
+.de ]>
+.re
+..
+.de ]]
+this is never
+executed
+and just
+uses up an end-of-file
+bug.
+..
+.de TS
+.sp
+..
+.de TE
+.sp .25v
+.ce
+\\$1
+.sp .5v
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i
+..
+.de ca
+.sp .5v
+.ce
+\&\\$1
+.sp 8p
+..
+.de CT
+.if \\n(ff .F0 "\\$1" "\\n%"
+..
+.nr sd 1i/24u \" # of inches to space between references (used as u).
+.nr sf 1.66P \" space to indent for paragraph (used as u).
+.nr sg 1u \" # of spaces needed before trap to start paragraph(used as v).
+.nr sh 0u \" # of spaces done to start a new paragraph (used as v).
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sj 1.66P \" space to indent for an example (used as u);
+.nr sn 1.66P \" amount of space to indent for list (used as u).
+.nr so 1P \" amount of space to temp indent for each list entry (used as u).
+.nr sp 1i/12u \" spacing for each element of list (or sublist) (used as u).
+.nr sa 1v \" # of spaces to do before subtitles (used as u).
+.nr se 3u \" # of spaces to indent for a reference (used as ems).
+.nr sm 1i \" # of spaces of need to do a subtitle (used as u).
+.nr fv 3 \" set font variable for subtitles to Helvetica
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sk 1u \" # of spaces left at the end of an example (used as v);
+.deRT
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i
+..
+.RT
+.EQ
+delim $$
+.EN
+.ds MF \f(LGMETA\%FONT\fP
+.ds TB \fITUG\%boat\fP
+.ds BZ B\o'e\(aa'zier
+.ds TX T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X
+.ds LT L\v'-.15m'\h'-.3m'\s-2A\s+2\v'.15m'\h'-.1m'T\v'.2m'\h'-.10m'E\h'-.10m'\v'-.2m'X
+.ds BT B\\h'-0.05m'\\s-2I\\h'-0.025m'B\\s0\\h'-0.08m'\\*(TX
+.ds pS P\s-2OST\%\s0S\s-2CRIPT\s0
+.ds P1 \f2P\fP\v'.2m'\s-3\f11\fP\s+3\^\v'-.2m'
+.ds P2 \f2P\fP\v'.2m'\s-3\f12\fP\s+3\^\v'-.2m'
+.ds P3 \f2P\fP\v'.2m'\s-3\f13\fP\s+3\^\v'-.2m'
+.ds P4 \f2P\fP\v'.2m'\s-3\f14\fP\s+3\^\v'-.2m'
+.en
+.LL 39.00P
+.ls 1
+.ds BL ''%''
+.hy 14
+The next page begins the paper. The macro package I use cannot start
+double columning until AFTER some text is printed..
+.pn 1
+.bp
+.MC 2 18.75P 1.5P 1i
+.mk xx
+\v'-1v'\l'18.7P'
+.sp |\n(xxu
+\s+2Environment for Translating
+.br
+\*(MF to \*(pS\s0
+.sp 3p
+.ti 1.66P
+Shimon Yanai and Daniel M. Berry
+.sp 8p
+\fBAbstract\fP
+.PP
+This paper describes a program, \fHmf2ps\fP, that translates a
+\*(MF font definition into a definition for the same font in the
+\*(pS language. \fHmf2ps\fP is constructed out
+of the part of the \*(MF program that extracts the envelopes of the
+letters; these envelopes are converted into \*(pS outlines.
+.su "1\ \ \ Introduction"
+.PP
+This paper describes a program, \fHmf2ps\fP,
+that takes from a \*(MF\*([.10,\|11\*(.]
+program for a font all the necessary information in order to
+create an equivalent \*(pS\*([.1\*(.]
+font definition. The program makes use of the front end of the
+\*(MF program to extract the envelopes of the letters to produce the
+\*(pS outlines. What makes this process natural is that both \*(MF and
+\*(pS make liberal use of \*(BZ curves to describe non-circular
+curves.
+.pp
+By producing this translator, it is hoped to be able to produce from
+\*(MF fonts \*(pS outline fonts which are more compact than the
+bitmapped fonts produced by the \*(MF program. Certainly the outline
+fonts are more easily scaled to other magnifications and possibly even
+other design sizes than are bitmaps. Moreover, doing so makes fonts
+heretofore available only on \*(TX\*([.9\*(.]
+and other DVI-based formatters,
+available on \fHditroff\fR\*([.8\*(.]
+and other formatters which have evolved,
+or have been designed, for use with \*(pS printers. This paper, which is
+typeset by \fHditroff\fR, uses a \*(pS version of the
+logo font in order to print the word \(lq\*(MF\|\(rq in the same appearance as
+in \*(TX-generated documents.
+Moreover, these new \*(pS outline fonts can be used in \*(TX also! One
+needs only the
+T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X\v'+.2m'\h'-.1m'P\h'-.1m'\v'-.2m'S\*([.3\*(.]
+software.
+.pp
+The organization of this paper is as follows. Section 2 presents the
+background of this work. Section 3 explains the rationale behind
+building the translator and describes a previous attempt at writing the
+translator and an approach to avoid. The software engineering aspect of
+the translator is described also in Section 3. The details of the
+implementation are exposed in Section 4. Section 5 describes the
+operation of the program. Section 6 evaluates the results. Finally
+Section 7 describes improvements to the translator that are left for
+future work.
+.su "2\ \ \ Background"
+.PP
+Typesetter formatting systems such as \*(TX and \fHditroff\fP use fonts
+as raw material. The formatters accept mixed text and commands as input
+and produce output, which, if sent to the laser printers or typesetters,
+yields formatted text printed on pages. The laser printers and
+typesetters use fonts, i.e., sets of printable patterns, one per
+character, in various representations in order to cause the desired
+characters to appear on the printed form. For some printers, bitmaps
+are used, with 1's representing inked dots and 0's representing
+non-inked dots. Other printers accept commands that cause drawing of
+the characters, the printer providing the inked dots according to the
+drawing commands. One such popular command language is \*(pS, and its
+usual use is to specify the outline of the character with the
+interpreting printer filling in the outline with ink. One popular
+method of describing fonts is with the \*(MF language, in which
+declarative definitions of how to paint the characters are given in
+terms of pen path and pen shape. Another popular method is the same
+\*(pS that many printers accept. The prime difference is that the \*(MF
+program translates the font definitions into bitmaps prior to sending
+the font to the printer while a \*(pS printer translates the outlines
+into bitmaps at the time of printing. Interestingly, both the \*(MF
+language and the \*(pS language use \*(BZ curves for describing the
+curves followed by the pen or the outlines. As usually configured
+these days, \*(TX uses bitmapped fonts in the Computer Modern family
+generated by \*(MF, and \fHditroff\fP uses \*(pS outline fonts supplied
+by Adobe.
+.pp
+The subsequent subsections delve deeper into these issues in order to
+be able to state the goal of this paper in the next section.
+.Su "2.1\ \ \ Fonts, design sizes, and magnifications."
+As mentioned, fonts are the raw material of typesetting. A font is a
+set of printable patterns, one for each character, that causes printing
+of that character in a particular recognizable style on the page. As
+mentioned, these patterns can be represented by bitmaps or drawing
+instructions.
+.pp
+Characters come in various sizes. There are two independent notions of
+sizing for fonts, point size or design size and magnification. The
+\fIdesign size\fP is the size at which the character is designed to be used
+and is, in well-designed text, the size in which the character appears
+in final, printed copy. Design size is
+usually expressed in units of points, which are each approximately 1/72
+of an inch. Most normal text in books, newspapers, and magazines is
+printed in 10 point type. Headlines are larger, perhaps as large as 30
+points. The \fImagnification\fP of a font is the inverse of the ratio
+between the design size of the character and the size of the
+character as it emerges on the printer, the assumption being that the
+final copy is a photo reduction of the printed copy. Thus, if photo
+reduction halves linear dimensions, one prints with magnification 2.
+If everything is done right, then after reduction, the letter appears at
+its design size.
+.pp
+A 10 point design sized font printed at mag\%ni\%fi\%ca\%tion 2 is similar to
+but not quite the same as a 20 point version of the same font.
+For example, the serifs on a large point size are smaller than they would
+be if strict linear magnification were used. Other proportions, e.g., of
+x-height to cap-height and of width to height, are also
+different. While many purists, Knuth
+included, insist on using a different pattern for each design size,
+many people accept magnification as yielding acceptable fonts at other
+point sizes. If the unit of magnification is not too big the results
+are acceptable even to many purists.
+.Su "2.2\ \ \ Problems with bitmapped fonts."
+A bitmap for a character is a rectangular array of bits covering the
+so-called bounding box or frame that exactly contains a letter. Figure
+1 shows a low resolution bit map for the letter \(lqN\(rq in a sans
+serif font. The inked squares or pixels are denoted by \(lq1\(rq bits
+and the uninked pixels are denoted by \(lq0\(rq bits.
+.fs
+.F+
+figure fig1.ps
+.F-
+.ca "Figure 1"
+.fe
+The low resolution example of Figure 1 illustrates a major problem
+with bitmapped fonts. Curved lines and straight lines that are neither
+vertical nor horizontal cannot be represented exactly by a rectangular
+pattern of pixels. One is forced to approximate them with rectangular
+steps. At high resolution, e.g. above 1000 or so, the human eye cannot
+see the steps, but at low resolution the steps are quite apparent.
+Visible steps are called \(lqjaggies\(rq after the jagged edges.
+.pp
+Bitmaps for a font must be built for each design size, magnification,
+and resolution. If the resolution is fixed, as is the case on most
+printers, a bitmap must be built for each design size and
+magnification. An attempt to use a given bitmap at a larger design
+size or magnification by just enlarging the area of each dot yields a
+bad case of jaggies.
+.Su "2.3\ \ \ \*(MF and its environment."
+.ft 1
+\*(MF, a language for the specification of fonts or typefaces, has been
+used to provide fonts for the \*(TX family of typesetting systems. A
+\*(MF user writes a program for each letter or symbol of an alphabet.
+These programs are different from the usual computer programs, because
+they are essentially declarative rather than imperative, using an
+algebraic language to describe the center stroke or edges of the characters. The
+description of a letter in \*(MF is a set of equations describing the
+strokes. When combined with parameters describing the pen shape and
+size, one gets a full description of a letter. Sizes and shapes of pen
+nibs can be varied in \*(MF and the characters can be built up in such
+a way that the outlines of each stroke are precisely controlled. Herein
+lies the advantage of \*(MF; a font is easily specified and variations
+are obtained by varying parameters.
+.pp
+Currently, the program that converts a set of \*(MF font descriptions
+into a bitmapped font translates the description of a letter combined
+with a point size and a magnification into a bitmap. This bitmap can be
+sent to the printer to get a letter on the page. Herein lies a
+disadvantage of \*(MF; a bit map must be kept for each point size and
+magnification, and this can require a lot of space.
+.Su "2.4\ \ \ The \*(pS language."
+The \*(pS language is an interpretive programming language with
+graphics capabilities. \*(pS's extensive page description capabilities
+are embedded into a general-purpose programming language framework. The
+language includes a conventional set of data types such as numbers,
+arrays, and strings, control primitives such as conditionals, loops and
+procedures, and some unusual features such as dictionaries. In most
+\*(pS fonts, each letter is described by an imperative program tracing
+the outline of the letter. This tracing may include curves given as
+\*(BZ curves, straight lines, arcs, etc. A \*(pS printer interprets
+this outline program to draw and fill in the letters on the page. Some
+consider the imperative nature of \*(pS to be a disadvantage in
+comparison to \*(MF's declarative nature. The main advantage of \*(pS
+relative to \*(MF is that one needs to keep only the outline. If, as in
+the usual case, the outline is specified in terms of a fixed path
+through Euclidean two-space, this outline may be scaled arbitrarily to
+yield any magnification. The scaling is done by the \*(pS interpreter
+at the printer. Thus the different magnifications do not require any
+additional storage space. Actually, the outlines are kept as if they
+were for the Adobe-standard 1000 dots
+per emm, which at a design size of 10 points amounts to 7200 dpi.
+Because a typical phototypesetter has a maximum resolution of
+about 2500 dpi, the outlines are said to be arbitrarily
+scaleable. If the outlines are kept, as are many \*(MF definitions, as
+paths through points calculated by the outline program, then it is
+possible to, say, make serifs grow more slowly than linearly. It would
+then be possible to have one \*(pS font scaleable to all design sizes.
+Generally, outline fonts are not written this way, so that strictly
+speaking they are scaleable only to all magnifications.
+.pp
+In addition, the \*(pS language has a way to work with bitmapped fonts.
+While the \*(pS printer can scale them before printing, the end result
+is that each of the fixed number of dots in the bitmap is made larger
+or smaller. Since the human will see larger dots as jagged lines, such
+fonts are not really considered scaleable.
+.Su "2.5\ \ \ \*(BZ curves."
+Both \*(MF and \*(pS use \*(BZ cubics to specify curves. For the \*(BZ
+form, four points are used, the start point, the end point, and two
+control points, as shown in the top half of Figure 2.
+The tangent vectors of the
+endpoints are determined from the line segments \*(P1\*(P2 and
+\*(P3\*(P4. The mathematical introduction of the \*(BZ form
+when given four points \*(P1, \*(P2, \*(P3, and \*(P4 is
+.sp
+.in +.125i
+$z(t)~=~(1-t) sup 3 "\*(P1" ~+~3t(t-1) sup 2 "\*(P2" ~+~3t sup 2 (1-t) "\*(P3" ~+~t sup 3 "\*(P4" ,$
+.sp
+.in -.125i
+for $0~<=~t~<=~1$.
+.pp
+Two characteristics of the \*(BZ form tend to make it widely used in
+graphics. First, by choosing the control points one can easily mold the
+curve to a desired shape. Second, the four control points taken in another
+order define a convex polygon, \*(P1 \*(P2 \*(P4 \*(P3 \*(P1 in this case,
+the \fIconvex hull\fR\h'-.05m', which bounds the \*(BZ
+curve. The convex hull is useful in clipping a curve against a window.
+.pp
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves.
+If the user has not specified the control points explicitly, \*(MF
+itself finds some for the splines of a curve, while \*(pS requires all
+the four points to be explicitly given.
+.fs
+.F+
+figure fig2.ps
+.F-
+.ca "Figure 2"
+.fe
+.su "3\ \ \ \*(MF to \*(pS compiler\(em why\ and\ how"
+.ft 1
+.PP
+This section describes a major performance problem with \*(MF-generated
+fonts that perhaps can be solved by translating them into \*(pS fonts.
+The goals of this translation are established. Based on these goals, a
+particular approach is adopted to engineer the software largely from
+existing components.
+.Su "3.1\ \ \ A problem with \*(MF-generated bitmapped fonts."
+.ft 1
+In \*(MF, one gets one bitmap per point size and magnification. The
+size of these bitmaps grows as the square of product of the design size
+and
+the magnification and requires a large storage space. Files that are
+sent to the printer will be large, especially if lots of different
+point sizes or magnifications are used. In \*(pS with outline fonts,
+there is one outline per character which can be scaled arbitrarily to
+any magnification that might be needed. Moreover, \*(pS outline fonts
+are generally more compact than bitmapped fonts. For example, an
+enclosed rectangle is represented by its four corner points rather than
+by all the bits enclosed by the rectangle.
+.pp
+Certainly the outline fonts are more easily scaled to other
+magnifications. By scaling the bitmapped fonts downward, too much
+information is lost, and scaling upward introduces the jaggies.
+Moreover, the pixel array is device dependent; it is valid for output
+devices of only one particular resolution and one choice of possible
+data values per pixel. Scaleable fonts have a great advantage \(em you
+need only one font description file for all magnifications of that font.
+Actually, \*(pS outline fonts are more scaleable even than the \*(MF
+originals for another reason. In\*(<,\*([.9\*(.]\*(>,
+it is said, \(lqCaution:
+before using this `\fBat\fR' feature (i.e. scaling downward or upward) you
+should check to make sure that your typesetter supports the font at the
+size in question; \*(TX will accept any \(L<desired size\(L> that is positive
+and less than 2048 points, but the final output will not be right
+unless the scaled font really is available on your printing
+device.\(rq Getting \*(pS outline versions of \*(MF fonts is possible
+since both are based on \*(BZ curves. Doing so makes fonts heretofore
+available only on \*(TX and other DVI-based formatters available on
+\fHditroff\fR and other formatters which have evolved to or have been
+designed for use with \*(pS printers.
+.Su "3.2\ \ \ Goals."
+Based on the observations of Section 3.1,
+the goal of this research is to produce a \*(MF to
+\*(pS compiler, \fHmf2ps\fP. Its operational requirements are items 1
+through 5:
+.l1 1
+.le
+It must be possible to translate any legitimate \*(MF font definition
+at any given design size into a \*(pS outline font.
+.le
+The resulting \*(pS outline font should be arbitrarily scaleable.
+.le
+The resulting fonts should look like the bitmapped fonts when printed
+on the same printer.
+.le
+The resulting \*(pS outline font should be more compact \fIwhen sent to
+the printer\fP than a \*(pS version of the \*(MF-generated bitmapped
+font.
+.e1
+.sp .5v
+The fourth requirement deserves a bit of explanation and qualification.
+First note that what is compared is what is sent to the printer.
+Certainly there are compressed versions of the bitmapped fonts that
+reduce the disk storage requirements of the bitmapped fonts. However,
+they must be uncompressed before sending them to most printers. It is the
+printer's storage that is limited; generally disk space is in
+abundance. However, since printers these days are general purpose
+computers, what a printer accepts may in fact be a compression that it
+has been programmed to undo.
+.pp
+Now for the case in which disk space is of concern, the comparison
+should still be relative to printable versions. There exist algorithms,
+e.g. that of Lempel and Ziv\*([.13\*(.]
+that can be used to compress \*(pS outline fonts which are, after all,
+just ASCII files. Therefore, in order not to have a contest between
+compression algorithms, the uncompressed versions are compared. Furthermore,
+in order not to have a contest between different kinds of printers that may
+have differing font representations, \*(pS outline fonts are compared to
+\*(pS bitmapped fonts. When
+considering disk space, the fact that one bitmapped font is needed for
+each magnification is taken into account. Thus, the interest is in
+comparing the size of a scaleable outline font to the total storage for
+the bitmapped fonts for all magnifications of a given design size.
+.cl
+.le
+The resulting \*(pS outline font should be more compact than the total
+of the sizes of the \*(pS versions of the \*(MF-generated bitmapped
+fonts at each available magnification. Even this comparison is not
+completely fair since only specific magnifications are provided, while
+the \*(pS font is arbitrarily scaleable.
+.dl
+.sp .5v
+.pp
+Observe finally, that the comparison is against mag\%ni\%fi\%ca\%tions
+of a single design size since purists would argue that there should
+be a different outline font for each design size.
+Since there are those that do not
+require this purity, the various design sizes will be compared also.
+.pp
+The software engineering goal is item 6.
+.cl
+.le
+\fHmf2ps\fP should be written as much as possible using the existing
+\*(MF program both to save work and to ensure that all \*(MF-acceptable
+font definitions are handled.
+.dl
+.sp .5v
+The evaluation of the results will be
+done relative to these goals.
+.Su "3.3\ \ \ Previous attempts."
+Leslie Carr wrote a collection of programs to produce \*(pS outline
+fonts from \*(MF fonts in 1987. Carr's programs take as input the
+\fIlog\fR output file of \*(MF which contains a description of all
+the paths that \*(MF traces out in drawing a character.
+.pp
+Carr has problems of information loss as a result of not having entered
+into the \*(MF program. This is the reason why Carr's characters are
+poor looking. In\*(<,\*([.5\*(.]\*(>,
+Carr observes, \(lqIn the \&\fCcmr10\fP font,
+the \fIcrisp\fP pen has diameter zero, so serifs have square corners. In
+the \&\fCcmtt10\fP font, \fIcrisp\fP is set to a larger value and the serifs
+end in semicircles. Because the shape of the current pen can NOT be
+taken into account in \*(pS, these differences in the characters shapes
+will not be seen. This is a \fBfundamental\fR problem: given a path $p$
+and a pen $q$ (whose shape is also an arbitrary path), \*(MF
+effectively envelopes $p$ with respect to the shape of $q$; \*(pS can
+do nothing other than stroke it to produce a line of constant width.
+This incompatibility comes to light when the width of the pen is
+significant to the shape of the character\(rq.
+.pp
+In order to avoid this problem, \fHmf2ps\fP finds the internally
+generated envelope, which is used as the boundaries of the inked
+region, and uses this envelope as the outline. It does not matter, then,
+what the pen path and the pen shape are.
+.pp
+More recently, during the time that the work described herein was being
+done, there were other efforts with similar goals.
+.pp
+Doug Henderson\*([.6\*(.]
+obtained outline font characters by modifying the \&\fCendchar\fP macro,
+which is called for each character after the bitmap is generated, to take
+the bitmap for the character and white out all but the bits on the edge.
+The number of bits left on the edge is varied according to the resolution
+of the bitmap. These outlines, being bitmapped, are just as unscaleable as
+are the bitmaps for the filled-in characters.
+.pp
+Neil Raine and Graham Toal\*([.12\*(.]
+have developed software that takes the bitmaps and rediscovers the
+outlines by tracing the pixels. The outlines that are used as the basis
+for \*(pS fonts are, for the most part, generated from bitmaps at 2400
+dpi. They first generate RISC OS outline fonts which are screen fonts
+for Acorn's Archimedes RISC computer. These are true scaleable
+outlines. Then, these outlines are converted into \*(pS format. Toal
+says that the the quality of the fonts produced is not too great at low
+resolutions because of shortcomings in Adobe's rendering algorithm. He
+adds that at 1200 dpi on a phototypesetter, they are indistinguishable
+from \*(MF-generated bitmapped fonts. These authors suspect that
+information that is critical for good appearance is lost when tracing
+an outline on a bitmap generated from a mathematically described
+envelope. Better results should be obtainable using the original
+envelope.
+.pp
+John Hobby\*([.7\*(.]
+has developed a program called MetaPost, which translates from an extension
+of \*(MF into \*(pS cubic splines and commands.
+His goal was to turn \*(MF into a system for
+typesetting general graphics, including embedded text. His approach,
+similar to ours, was to modify the \*(MF program into what he desired.
+Befitting his more general goals, besides modifying the output, he has
+added new commands to the input language. Moreover, his translation appears
+to be a direct mapping from a \*(MF command sequence to a
+\*(pS command sequence.
+The result is a program more powerful than \fHmf2ps\fP.
+It will be interesting to compare fonts produced by MetaPost and
+\fHmf2ps\fP for appearance and performance.
+.Su "3.4\ \ \ Methodology."
+There are a number of ways to build the compiler. They include
+.l1 1
+.le
+writing the whole compiler from \*(MF to \*(pS from scratch: This has
+the advantage that one does not have to get into another person's
+software, which is not very pleasant when the software is so big. On
+the other hand, one would have to treat the whole job of turning
+mathematical equations and any arbitrary pen shape into outlines.
+.le
+using the \*(MF output as was done by Leslie Carr\*([.5\*(.]:
+This has the advantage of not requiring delving into another's
+software, but the generated information is not enough if one wants no
+deviations from the originals.
+.le
+getting into the \*(MF program: This requires examining the internals
+of the \*(MF program. However, \*(MF and \*(pS make liberal use of
+\*(BZ curves to describe non-circular curves. This fact makes the
+translation process natural. For each specified path, \*(MF creates
+control points for the associated cubic spline curves before
+calculating the bit map. \*(MF also calculates the edge offsets implied
+by the pen shape. Using the necessary information one can get a new set
+of control points that define \*(BZ curves and lines that are needed to
+build the \*(pS outline fonts.
+.e1
+.Su "3.5\ \ \ Software engineering of solution."
+The idea is to split the \*(MF program into front end and back end. The
+front end takes \*(MF specification of a character, magnification, and
+point size, and produces the envelope, i.e., the outline of the
+character, and the back end fills the envelope with bits. Taking the
+existing front end and writing a new back end that converts the
+envelope into a \*(pS specification of an outline is our method of
+producing \fHmf2ps\fP. The bit-filling process will be done by the
+printer.
+.pp
+In order to make \*(pS fonts arbitrarily scaleable, we have to ask the
+\fHmf2ps\fP program to use a very large magnification, at least to try to
+match the grid on which Adobe plots the points of its outlines. Adobe plots
+its characters on a $1000~times~1000$ grid. Thus, Adobe's resolution is
+1000 dpm (dots per em), which for design size 10 points is 7200 dpi.
+Unfortunately, \*(MF, and thus \fHmf2ps\fP accepts resolutions only up to
+3000 dpi. The results should be sufficient to produce fonts scaleable
+up to magnification 7 or 8, which is a reasonable range in
+typesetting.
+.pp
+This approach helps meet goal 6 because the original unchanged \*(MF
+program is used. Thus, exactly the same input is accepted as in the
+\*(MF program. There is some extra frosting obtained by the chosen
+approach. The program for translating \*(MF to \*(pS is actually a bit
+of an interactive environment because the new back end is an extension
+of the existing one. This existing back-end provides an interpreter
+that executes a \*(MF character definition and displays the defined
+character on the screen. Figure 3
+shows the dump of a screen containing several windows, one showing a
+\*(MF definition, another showing the result of its interpretation, and
+a third containing the \*(pS translation of the definition in the first
+window. If software to interpret \*(pS definitions were available here,
+a fourth window could be set up showing the result of interpreting the
+translation of the third window. This would allow comparison of the
+character's appearances without having to print them on paper.
+.su "4\ \ \ The program"
+.PP
+In the following discussion, the \*(MF program is often called just
+\(lq\*(MF\|\(rq.
+.pp
+The \*(MF program has been written so that it can be made to run
+efficiently in a wide variety of operating environments by making
+comparatively few changes. Such flexibility is possible because the
+program is written in the \&\fCWEB\fR language which is at a higher level
+than Pascal. The preprocessing step that converts \&\fCWEB\fR to Pascal
+is able to introduce most of the necessary refinements. Semiautomatic
+translation to other languages is also feasible, because the program
+does not make extensive use of features that are peculiar to Pascal.
+.pp
+The program has two important variations: First, there is a long and slow
+version called \s-1\fHINIMF\fR\s0, which does the extra calculations needed to
+initialize \*(MF's internal tables. It has to be run first. It
+initializes everything from scratch without reading a base file, and it
+has the capability of dumping a base file. Secondly, there is a shorter and
+faster production version called \s-1\fHVIRMF\fR\s0, which cuts the
+initialization to a bare minimum. It is a virgin program that needs
+to input a base file in order to get started. \s-1\fHVIRMF\fR\s0 typically has
+more memory capacity than \s-1\fHINIMF\fR\s0, because it does not need the
+space consumed by the dumping and undumping routines, etc.
+.pp
+In order to generate a compiler that translates \*(MF to \*(pS,
+additional external procedures and functions were added to the \*(MF
+program so that it runs exactly the same except that when it asks for
+an output file name, it asks for an additional name, for the extra
+output file that is to contain the \*(pS outlines. Those changes were
+made on the Pascal version of the \s-1\fHVIRMF\fR\s0, and were compiled later
+with \*(MF's library files.
+(It was a complete oversight on our part not to have modified the
+\&\fCWEB\fP version of \s-1\fHVIRMF\fP\s0.)
+A few extra lines were added to the
+macro file, \&\fCplain.mf\fR. These act as flags, identifying that
+\*(MF has entered some of the macros.
+.Su "4.1\ \ \ Basic idea."
+To specify a character in \*(MF, one specifies either
+an envelope (outline) or
+a center-line path and a pen head.
+For the former, \*(MF just fills the envelope with bits.
+For the latter, \*(MF pretends that it is drawing the character
+with a pen of specified
+head shape following the specified path, i.e., the center of the head
+stays on the path. The distance from the center-line path and outer
+edge of ink trail left by pen head is called the \fIoffset\fR\h'-.1m'.
+So, for a character, \*(MF follows the center-line path to calculate the path
+of offset points, i.e., the envelope, and then fills the envelope with
+bits.
+In either case, \*(MF ends up filling an envelope.
+.pp
+We need to break \*(MF into a front end and a back end at the point
+just after the envelope has been calculated. Then we provide a new back
+end that converts the envelope into \*(pS instead of filling the
+envelope with bits. Note then that the \*(pS printer will fill in the
+envelope with bits as it fills the path obtained from the envelope.
+.pp
+The following subsections describe the data and the calculations
+involved in the new back end.
+.Su "4.2\ \ \ Data structures."
+The main data structures that \*(MF keeps for a character are the
+center-line path, the pen shape, and the envelope path. There are a few
+operations that can be performed on paths, called transformations.
+.SU "4.2.1\ \ \ \*(MF's path representation."
+.ft 1
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves. If the knots are
+$z sub 0 ,~z sub 1 ,...,~z sub n$, there are control points $z sub k
+sup +$ and $z sub k+1 sup -$ such that the cubic splines between the
+knots $z sub k$ and $z sub {k+1}$ are defined by the \*(BZ formula
+.sp
+.in +.4375i
+$z(t)~=~B(z sub k, z sub k sup + , z sub k+1 sup - , z sub k+1 ;t)$
+.sp .2v
+\h'\w'$z(t)~$'u'$=~(1~-~t) sup 3 z sub k ~+~ 3t(t~-~1) sup 2 z sub k sup +$
+.sp .2v
+\h'5P'$+~ 3t sup 2 (1~-~t)z sub k+1 sup - ~+~ t sup 3 z sub k+1$,
+.sp
+.in -.4375i
+for $0~<=~t~<=~1$.
+.pp
+There is a 7-word node for each knot $z sub k$, containing one word of
+control information and six words for the $x$ and $y$ coordinates of $z
+sub k sup -$ and $z sub k$ and $z sub k sup +$. The control
+information appears in the \fIleft_type\fR and \fIright_type\fR
+fields and they specify properties of the curve as it enters and leaves
+the knot. There is also a \fIlink\fR field, which points to the
+following knot. Before the \*(BZ control points have been calculated,
+the memory space they will ultimately occupy is taken up by information
+that can be used to compute them. The \*(MF \fImake_choices\fR
+procedure chooses angles and control points for the splines of a curve
+when the user has not specified them explicitly.
+.SU "4.2.2\ \ \ \*(MF's path transformation."
+.ft 1
+When \*(MF digitizes a path, it reduces the problem to the special case
+of paths that travel in the \fIfirst octant\fR directions; i.e., each
+cubic $z(t)~=~(x(t),y(t))$ being digitized will have the property that
+$0~<=~y prime (t)~<=~x prime (t)$. This assumption makes digitizing
+simpler and faster than if the direction of motion has to be tested
+repeatedly. When $z(t)$ is cubic, $x prime (t)$ and $y prime (t)$ are
+quadratic, hence each of the four polynomials, $x prime (t)$, $y prime (t)$, $x
+prime (t) - y prime (t)$, and $x prime (t) + y prime (t)$, crosses
+through $0$ at most twice. If we subdivide the given cubic at these
+places, we get at most nine subintervals. In each of these intervals
+each of $x prime (t)$, $y prime (t)$, $x prime (t) - y prime (t)$, and
+$x prime (t) + y prime (t)$ has a constant sign. The curve can be
+transformed in each of these subintervals so that it travels entirely
+in first octant directions, if we exchange $x$ and $- x$, $y$ and $-
+y$, and $x$ and $y$ as necessary.
+.Su "4.3\ \ \ Pens and envelopes."
+There are two kinds of pen heads that may be used, polygonal and
+elliptic. There are a number of trade-offs involved in their use. The
+first subsection treats the case of an $n$-vertex polygonal pen shape
+and the second treats the case of an elliptical pen shape. Both
+describe the influence of pen shape on the envelope of the font.
+.SU "4.3.1\ \ \ Polygonal pens."
+Suppose that the vertices of a polygon are $w sub 0 ,~w sub 1 ,...,~w
+sub n-1 , ~w sub n ~=~ w sub 0$ in counterclockwise order. A convexity
+condition requires that each vertex turns left when one proceeds from
+$w sub 0$ to $w sub 1$ $...$ to $w sub n$. The envelope is obtained if we
+offset a given curve $z(t)$ by $w sub k$ when that curve is traveling
+in a direction $z prime (t)$ lying between the directions $w sub k - w
+sub k-1$ and $w sub k+1 - w sub k$. At times $t$ when the curve
+direction $z prime (t)$ increases past $w sub k+1 - w sub k$, \*(MF
+temporarily stops plotting the offset curve and inserts a straight line
+from $z(t) + w sub k$ to $z(t) + w sub k+1$; notice that this straight
+line is tangent to the offset curve. Similarly, when the curve
+direction decreases past $w sub k - w sub k-1$, \*(MF stops plotting
+and inserts a straight line from $z(t) + w sub k$ to $z(t) + w sub
+k-1$; the latter line is actually a retrograde step, which will not be
+part of the final envelope under \*(MF's assumptions. The result of
+this consideration is a continuous path that consists of alternating
+curves and straight line segments. The segments are usually so short,
+in practice, that they blend with the curves.
+.SU "4.3.2\ \ \ Elliptical pens."
+To get the envelope of a cyclic path with respect to an ellipse, \*(MF
+calculates the envelope with respect to a polygonal approximation to
+the ellipse. This has two important advantages over trying to obtain
+the exact envelope:
+.l1 1
+.le
+Polygonal envelopes give better results, because the polygon has
+been designed to counteract problems that arise from digitization; the
+polygon includes sub-pixel corrections to an exact ellipse that make
+the results essentially independent of where the path falls on the
+raster.
+.le
+Polygonal envelopes of cubic splines are cubic splines. Hence it is
+not necessary to introduce completely different routines. By contrast,
+exact envelopes of cubic splines with respect to ellipses are
+complicated curves, more difficult to plot than cubics.
+.e1
+.Su "4.4\ \ \ Taking out data."
+After \*(MF has calculated the paths and the offsets, it is ready to
+send the values to the \fImake_moves\fR procedure which generates
+discrete moves for any four points that represent a \*(BZ curve. This
+is done for each one of the cyclic paths from which the letter is built.
+When the offsets are zero, this is done by the \fIfill_spec\fR
+procedure. Otherwise this is done by the \fIfill_envelope\fR
+procedure. In the latter case, the line segments, which were discussed
+earlier, should be taken out also in order to get smooth connections
+between the different curves that the cyclic path is built from.
+Because \*(pS describes any shape in terms of curves and lines, this is
+the point to take advantage of \*(MF's calculations, i.e., when \*(MF
+calls the \fImake_moves\fR procedure and when \*(MF draws line
+segments for offset corrections.
+.Su "4.5\ \ \ Processing the data."
+The generated data are not ready yet to be used. First, we should
+unskew, i.e., transform from the first octant back to the original, the
+paths according to the octant that the paths were traveled in before
+they were skewed. This unskewing is done by taking out the octant
+number at the moment that the \fImake_moves\fR procedure is called
+and then using \*(MF's \fIunskew\fR procedure that sets values $x
+prime$ and $y prime$ to the original coordinate values of a point,
+given an octant code and coordinates $(x,y)$ after they have been
+mapped into the first octant and skewed; the new values are sent to the
+\fIsend_p_s\fR procedure. This procedure has eight formal parameters
+that are all used when sending a curve. When sending a line,
+only four parameters are used, two to denote the start point and two to
+denote the end point; the remaining four parameters are sent as zeros
+so \fIsend_p_s\fR can distinguish whether a line was sent or a curve.
+In the next step, \fIsend_p_s\fR unscales the numbers because \*(MF
+works with units of scaled points, of which there are $2 sup 16$ in an
+ordinary point. While unscaling, the values are
+transformed in order to send them to the \*(pS dictionary
+\&\fCFontBBox\fP command. After this pre-processing,
+the data are sent to a temporary file.
+.SU "4.5.1\ \ \ Getting more information."
+When \*(MF calls the \fImake_moves\fR procedure, it does not have any
+information on the role that this path is going to play, whether the
+current cyclic path is going to be \fIfilled\fP or whether it will act as
+a boundary of a region to be \fIerased\fP.
+.pp
+In order to distinguish between the cases, more information has to be
+taken. This is done by copying the \&\fCplain.mf\fR file into a new
+file named \&\fCmyplain.mf\fR and adding a few lines to it. The
+additional code was added in order to identify \*(MF's use of the
+macros. \*(MF uses the variables for date only once, when the program
+is started, so it was decided to use them in the rest of the
+program.
+The \&\fCyear\fR is changed to $-1$ when \*(MF's \&\fCpen_stroke\fR
+macro is applied on a cyclic path, i.e., in the characters such as
+\(lqo\(rq, \(lqO\(rq, and \(lqQ\(rq, and to $-2$ when the \&\fCerase\fR
+macro is called. The \&\fCmonth\fR is changed when the \&\fCfill\fR
+macro is called. There are three kinds of paths:
+.l1 1
+.le
+paths to be \fIfilled\fP are processed using the \*(pS \&\fCfill\fR
+command.
+.le
+paths to be \fIstroked\fP are processed using the \*(pS \&\fCeofill\fR
+command.
+.le
+paths to be \fIerased\fP are processed using specialized procedures
+which will be discussed later.
+.e1
+.sp .5v
+.pp
+A letter cannot always be treated as one unit by means of the
+\&\fCfill\fR and \&\fCeofill\fR commands. For instance, the letter
+\(lqQ\(rq is built of two different paths, the first of which is
+stroked and the second of which is filled. Generating the letter
+using the \*(pS \&\fCeofill\fR command causes a hole in the image (see
+Figure 4).
+.fs
+.F+
+figure fig4.ps
+.F-
+.ca "Figure 4"
+.fe
+So while generating a letter, fill mode can be changed for each cyclic
+path. Moreover, when generating a letter whose paths should be filled,
+it is not always possible to use just one \&\fCfill\fR command (see
+Figure 5).
+.fs
+.F+
+figure fig5.ps
+.F-
+.ca "Figure 5"
+.fe
+When a \*(pS \&\fCfill\fR command is applied to a path that is composed
+of more than one subpath, say two for the sake of simplicity, and one
+subpath is inside the other and is drawn in a direction opposite to the
+external one, the internal path is considered a hole and is not filled
+(see Figure 6).
+.fs
+.F+
+figure fig6.ps
+.F-
+.ca "Figure 6"
+.fe
+So, if several paths are to be filled in this manner, the description
+of each one of them should be ended with the \&\fCfill\fR command.
+There is one more benefit to using this strategy: The \*(pS \fCcurrent
+path\fR stack becomes empty after encountering any kind of \&\fCfill\fR
+command. Therefore, using the \&\fCfill\fR command after each path can
+help avoid \&\fCstack overflow error\fRs if all paths together are too
+long.
+.SU "4.5.2\ \ \ Treating erasing paths."
+There are three methods of handling the problem of paths that should be
+erased by \fHmf2ps\fP itself:
+.l1 1
+.le
+filling with white: Because erasing paths are built in order to erase
+an existing filled area and \*(pS overlaps paths (i.e., a region is
+shown in the color that was drawn last), erasing paths can be
+implemented by filling those paths with white. This solution is the
+easiest, but it works only if the background is white and the letter is
+drawn in some level of gray. If one wants to draw a letter with
+background other than white, the resulting appearance will not be correct.
+.pp
+.le
+calculating new paths resulting from subtracting the erasing paths from
+the previous filled paths: Such a solution can be global. However, it
+costs a lot in terms of processing time and accuracy, because paths are
+given implicitly by four points, and in order to calculate the new
+paths, one should find the intersection points of \*(BZ curves, i.e.,
+to find points that lie on both \*(BZ curves, and then calculate new
+curves, which are difficult to calculate from those points.
+.pp
+.le
+using the \*(pS \&\fCeoclip\fR command: Be\%cause the letters are bounded
+in a $1000~times 1000$ box, a primary square path whose segments are
+$1000$ units long should be declared and after it all the erasing paths
+should be listed. After relocating the erasing paths we are ready to
+declare \&\fCeoclip\fR, which means that the clipping path is the
+external primary one and the internal paths, the erasing paths, are
+holes. This is an elegant solution that uses the power of the language
+and is available in simple situations in which there is no intersection
+between the erasing paths (see Figure 7).
+If there were intersections, a little more
+sophisticated use of the \&\fCeoclip\fR command would be needed. Relocation
+of the erasing paths is done by the procedure \&\fCdoarrange\fR.
+.e1
+.fs
+.F+
+figure fig7.ps
+.F-
+.ca "Figure 7"
+.fe
+.pp
+There are other problems caused by the erasing paths. Because the
+erasing paths have segments in common with paths to be filled, \*(pS must
+decide whether the common segments are in the clipping path or not.
+\*(pS does not seem to have a consistent policy on that and it seems to
+be that the decision is taken arbitrarily (see Figure 8).
+.fs
+.F+
+figure fig8.ps
+.F-
+.ca "Figure 8"
+.fe
+An attempt to resolve the clipping path problem led to the first author
+sending the following electronic message (obviously, not as nicely
+formatted as herein) to Glenn Reid of Adobe Systems, Inc.
+.qb
+.nf
+From simon Tue Mar 21 13:22:32 1989
+To: greid@adobe.com
+Subject: Problem in PostScript
+.fi
+.sp
+Dear Mr. Reid
+.sp
+I have got a problem in understanding the PostScript
+policy in determining \(lqwhat is in the clipping path\(rq.
+I think there is a problem in the boundaries.
+Here is an example that shows that problem:
+.es
+.ft C
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+.ee
+.ft R
+As you see, the problem is that on top of the shape, the line
+which belongs to the upper \(lqhole\(rq in the clipping path and to the
+current path ( to be filled ) is drawn, and on bottom of the
+shape it is not.
+.sp
+This is happening both on the Apple Laser printer and on the
+QMS-80.
+.sp
+I would be glad to have a reply from you.
+.sp
+.nf
+Thanks in advance
+Shimon Yanai
+C.S Dep.
+Technion
+.fi
+.qe
+What Mr. Reid saw when he printed the \*(pS commands contained in the
+message is reproduced in Figure 9.
+.fs
+.F+
+figure fig9.ps
+.F-
+.ca "Figure 9"
+.fe
+Mr. Reid replied with the following:
+.qb
+.nf
+From: greid@adobe.com (Glenn Reid)
+To: Shimon Yanai <simon@techunix>
+Cc: greid@adobe.com
+Subject: Re: Problem in PostScript
+In-Reply-To: Your message of Wed, 22 Mar 89 ...
+Date: Wed, 22 Mar 89 11:41:35 PST
+.fi
+.sp
+The problem is that the path you are filling falls exactly on the edge
+of the clipping path. This produces a zero-width area to fill, and
+unfortunately it sometimes fills and sometimes does not with the
+current fill algorithm. I believe that it is related to the direction
+of the paths; if the paths are going in opposite directions along the
+same line, it will fill with a one-pixel area, but if they are going in
+the same direction, it will not fill.
+I believe this has been fixed to be more consistent in Display
+PostScript, for what it's worth.
+.sp
+Glenn Reid
+.br
+Adobe Systems
+.qe
+.pp
+The idea of using opposite directions had been checked before sending
+the letter, so the problem had to be solved within the back end of
+\fHmf2ps\fP. The
+erasing paths near the top of the letter had their $y$ coordinates
+increased by 0.8 points, and those near the bottom had their $y$
+coordinates decreased by the same amount. This shift is invisible to
+the human eye because the font definitions are in terms of hundreds of
+points (see Figure 10). This solution was designed to work with most
+existing \*(MF fonts. It is possible that there will be fonts that are not
+treated well by this solution.
+.fs
+.F+
+figure fig10.ps
+.F-
+.ca "Figure 10"
+.fe
+.Su "4.6\ \ \ Optimization."
+Optimization is done in order to make the description of the fonts
+shorter and to save work in the \*(pS interpreter. This is done in
+three ways:
+.l1 1
+.le
+not printing lines with length zero. As was said earlier, the \*(MF
+program prints lines to connect offset points. There are times that
+after rounding or truncating the output data, the start point and the
+end point are equal. In such cases, the lines are eliminated.
+.le
+checking if the \*(BZ curve acts as a line. From the definition of the
+\*(BZ curve, it is known that if the two control points lie on the line
+that connects the start point and the end point, the curve is of degree
+one. In such cases \fHmf2ps\fP generates a command to print a line from
+the start point to the end point, thus saving space and avoiding
+redundant calculations for the \*(pS interpreter.
+.le
+checking if a series of consecutive line segments are in the same line.
+This is done by storing the segments in a buffer and checking whether a
+new segment is collinear with the last stored.
+.e1
+.Su "4.7\ \ \ Changed or added routines."
+The following is a list of routines that were changed or added in order
+to build \fHmf2ps\fP from \*(MF.
+.in +1P
+.LE
+\fIprintchar\fP was modified to get character names.
+.LE
+\fIfixdateandtime\fP was modified to initialize variables that were used as flags in the macros.
+.LE
+\fIfillspec\fP was modified to send out data on splines.
+.LE
+\fIskewlineedges\fP was modified to send out offset lines.
+.LE
+\fIdualmoves\fP was modified to send out offset lines.
+.LE
+\fIfillenvelope\fP was modified to send out data on splines.
+.LE
+\fIdostatement\fP was modified to identify tokens that are strings.
+.LE
+\fImain\fP was modified to call the \fHmf2ps\fP procedure in the beginning and ending of the program.
+.LE
+\fIsendcurve\fP was added to unskew spline values and to send them to the next process.
+.LE
+\fIsendline\fP was added to unskew line values and to send them to the next process.
+.LE
+\fIok\fP was added to check if two lines are collinear.
+.LE
+\fIrestore\fP was added to restore the parameters of the last line.
+.LE
+\fIrecall\fP was added to recall values from the buffer.
+.LE
+\fIus\fP was added to convert the \*(MF scale so that a letter would fit the
+Adobe standard $1000~times~1000$ bounding box.
+.LE
+\fIsend_p_s\fP was added to create a \*(pS file of lines and curves.
+.LE
+\fImakemoves\fP was modified to send out spline data.
+.LE
+\fIdump\fP was added to append information from the file named \&\fCf\fP to the file named \&\fCg\fP.
+.LE
+\fIcheckerase\fP was added to identify the file that contains \(lqerase\(rq commands, and their position within the file.
+.LE
+\fIdoarrange\fP was added to put erasing paths at the beginning of the file.
+.LE
+\fIprint_start\fP was added to signal the beginning of a new cyclic path to be processed.
+.LE
+\fIprint_end\fP was added to signal the end of the current cyclic path.
+.LE
+\fIinit_ps\fP was added to make initializations.
+.LE
+\fImakenewdef\fP was added to make initializations when more than one character
+occurs in the input.
+.LE
+\fIcloseolddef\fP was added to close the last definition.
+.LE
+\fItini_ps\fP was added to handle the ending of the process.
+.LE
+\fIauxprintchar\fP was added to print characters.
+.LE
+\fIauxprint\fP was added to print strings.
+.in -1P
+.su "5\ \ \ Operation of \fHmf2ps\fP in a \fHU\s-2NIX\s0\fP environment"
+.ft 1
+.PP
+When invoked,
+\fHmf2ps\fP
+first asks for an output file name. For the example this file is called
+\&\fCex1\fP. \fHmf2ps\fP then asks,
+.ES
+.fi
+.na
+\(lq\&\fCAre you creating the whole dictionary (y/n)?\fP\(rq.
+.EE
+.ad
+If the answer is other than \(lq\&\fCy\fP\(rq
+or \(lq\&\fCY\fP\(rq, it is considered \(lq\&\fCno\fP\(rq. If the
+answer is \(lq\&\fCy\fP\(rq or \(lq\&\fCY\fP\(rq, then the whole
+dictionary is created. This means that \fHmf2ps\fP creates a \*(pS
+dictionary that includes entries for all the characters that are in
+the input, e.g., \&\fCcmr10\fP set. This dictionary needs additional
+definitions such as \fIleft side bearing, width, bounding box\fP, etc.
+These definitions need information on character features that must be
+calculated within the program. Otherwise, the whole dictionary is not
+created and the program treats the input as a single character
+definition that is to be translated into a \*(pS outline definition.
+After \fHmf2ps\fP prompts \(lq\&\fC**\fP\(rq, we are in the \*(MF
+environment. Now the user inputs
+.ES
+\s-1\\mode=hires;\\nodisplays;\\input cmr10;\(cr\s0
+.EE
+After \fHmf2ps\fP has finished, the resulting \*(pS font dictionary can
+be used to print text. In order to print text, the font dictionary
+should be installed in some formatter's font source directory, and then
+it can be loaded through the formatter's commands. The dictionary
+followed by appropriate \fHshow\fP and \fHshowpage\fP commands can also
+be sent directly to the printer.
+.su "6\ \ \ Evaluation of results"
+.PP
+This section evaluates the \fHmf2ps\fP program relative to goals
+established in section 3.2. The program was produced as a variation of
+\*(MF and it accepts any \*(MF font definition and produces a \*(pS
+outline font scaleable up to magnification 8, or to point size 80 if
+you are not a purist. Thus goals 6 and 1 have been entirely met and
+goal 2 is partially met. To meet goal 2 fully the program must be
+modified to allow large enough arrays to handle magnifications up to
+7200; this is left to future work.
+.pp
+It remains to evaluate the appearance and sizes of the outline fonts
+relative to the bitmapped fonts to see if goals 3, 4, and 5 have been
+met.
+.Su "6.1\ \ \ Appearance."
+In order to compare appearances, the outline font (Sub\%sub\%fi\%gure P)
+and and the 300 dpi bitmapped font (Sub\%sub\%fi\%gure M) generated from
+the same \*(MF definition are used to
+print similar sentences at one, two, or three different sizes or
+magnifications on three devices of differing resolutions.
+The sentences are printed in the \&\fCcmr\fP (Sub\%fi\%gure R),
+\&\fCcmtt\fP (Sub\%fi\%gure T), and \&\fClasy\fP (Sub\%fi\%gure S) typefaces.
+The bitmapped fonts may be printed at design sizes 7, 8, 10, or 12, and
+the outline fonts may be printed at magnifications .7, .8, 1.0, or 1.2.
+Finally, the three devices are the 300 dpi LaserWriterII (Figure
+11-LW300), the 600 dpi Varityper (Figure 11-VT600), and the 1270 dpi
+Linotronic 300 (Figure 11-LT1270). The bitmapped font examples are
+formatted with \*(TX while the outline font examples are hand-coded \*(pS
+files sent directly to the printer. Since the
+formatter with which this paper is printed can use arbitrary \*(pS
+fonts, half of the examples could have been done in-line without
+pasting in. However, for fairness in the comparison, all examples were
+cut out and pasted in.
+.pp
+There are visible differences due to differences in the formatting
+software. \*(TX squeezes the letters closer together than does the \*(pS
+engine. Moreover, the interword space is constant in the \*(pS
+dictionary but is varied by \*(TX according to the line structure.
+These differences are not the differences that are at issue here.
+.pp
+On the 300 dpi device, the characters from the bitmapped fonts print thinner
+than are those of the outline fonts. However, the edges of both sets are
+equally smooth or jagged as the case may be in all sizes. Overall, then,
+the appearance of the characters of the bitmapped fonts is crisper than
+that of the outline fonts.
+On the higher resolution devices,
+the thicknesses of the characters are closer to being
+equal at all sizes. Thus, the \*(MF program does a better job of building a
+correctly sized bitmap at 300 dpi than does the 300 dpi \*(pS engine of the
+LaserWriterII. The latter seems to round up too much. However, both
+seem to get the edges equally smooth even at low sizes and low resolutions.
+.pp
+At the two higher resolutions, the outline fonts are significantly better
+than the outline fonts at lower resolutions and are significantly better
+than the bitmapped fonts at the same resolution of printing. However, this
+latter is true because the bitmapped fonts were generated by the \*(MF
+program specifically to be printed at 300 dpi.
+When a 300-dpi bitmap is printed with no scaling at 600 or 1270 dpi, it
+remains a 300-dpi bitmap. As expected, the 300-dpi bitmapped fonts print better
+at 300 dpi than they do at the two higher resolutions.
+.pp
+The generated outlines are not fine-tuned for printing at low resolutions,
+such as 300 dpi,
+as are the \*(MF-generated bitmaps. It might be useful to make use of
+the \*(pS facilities for hinting to improve the appearance of the
+characters printed from the outlines at low resolutions.
+.pp
+Figure 12 shows samples of similar sentences printed on the same three
+devices using the standard Helvetica, Times
+Roman, and Courier \*(pS outline fonts built into most \*(pS-executing
+laser printers.
+It appears to these authors that the standard \*(pS fonts are
+significantly better than those generated from \*(MF fonts. However,
+this is not surprising. Adobe uses a grid of $1000~times~1000$ for its
+character definitions, resulting in a resolution of 7200 dpi for characters
+printed at point size 10.
+Because of size limitations of the
+\*(MF program the \*(MF outline fonts are using a resolution of 3,000
+points per inch. However, when using the letters in small sizes such as
+from 10 to 70,
+quality differences are hardly visible especially when working
+with printers that have a resolution of 300 points per inch such as the
+Apple LaserWriter.
+Moreover, Adobe makes liberal use of hinting to
+improve the appearance of its fonts at low resolutions.
+We completely ignored hinting, as we did not see any way to
+automatically generate the hints.
+.Su "6.2\ \ \ Sizes of fonts."
+Recall that it is necessary to compare the size of the \*(pS outline
+font for a particular \*(MF definition to the sizes of the bitmapped
+fonts in \*(pS fonts for the individual and all magnifications.
+.pp
+This comparison is made in this section for the \&\fCcmr10\fP font at the
+standard set of six magnifications 1, 1.095, 1.2, 1.44, 1.728, and 2.07
+(which are approximations of 1.2 raised to the powers 0, .5, 1, 2, 3,
+and 4, respectively). In addition, as a gesture to those who are not
+purists and accept magnifications of the 10 point design size as
+different point sizes, the comparison includes the \&\fCcmr\fP font at
+point size 5, 6, 7, 8, 9, 10, 12, and 17, the standard eight design
+sizes maintained for use with \*(TX.
+.pp
+Table 1 shows the sizes in bytes. Thus it is clear that the
+\*(pS outline font is bigger than any bitmapped font and that goal 4
+fails. Moreover, it is clear that the outline font is bigger than the
+sum over all magnifications of one design size and than the sum over
+all standard design sizes. Thus goal 5 fails. In fact, this failure is the
+reason that the samples of Figure 11 involve only upper case letters. Samples
+with complete fonts with both cases often overloaded the printer available
+to the students at the time this work was done.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 245,000
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 245,000
+.TE "Table 1"
+.br
+.RT
+.pp
+However, do note that the outline font is smaller than the sum over all
+design sizes and magnifications thereof.
+.pp
+So in terms of disk space for the non-purists, the outline font
+represents a savings. Again notice that not all magnifications of the
+bitmapped fonts are maintained and the outline font is arbitrarily
+scaleable. Moreover, as the magnification grows the size of the bitmap
+grows even more rapidly.
+.pp
+The disappointment with respect to saving printer and disk memory says
+that it is important to spend more effort to optimize the outline
+font.
+.pp
+All is not lost, though! As this paper was being prepared for publication
+in \*(TB,
+one reviewer, Nelson Beebe, pointed out something that we can only kick
+ourselves for not noticing. The \*(pS outline fonts that are generated by
+\fHmf2ps\fP are horrendously wasteful in space. They use original, built-in
+command names and absolute coordinates. A significant reduction in size can
+be obtained by definition and use in the outlines of single-character
+command names, e.g., \(lq\fCM\fP\(rq for \(lq\fCmoveto\fP\(rq, and by use
+of relative versions of these commands with operands of fewer digits after
+the initial absolute \&\fCmoveto\fP of any character. A simple filter was
+written to obtain new compressed versions of the \*(pS outline fonts. The
+appearances of the output when printing with these new versions is
+unchanged, but what is sent to the printer is significantly smaller, about
+37.7% smaller. The reduction on a per-letter basis is about 45%.
+Table 2 shows the information of Table 1 for the new versions of the
+outline fonts.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 152,670
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 152,670
+.TE "Table 2"
+.br
+.RT
+.pp
+There are still better compressions that can be achieved. According to
+Beebe\*(<,\*([.4\*(.]\*(>,
+Toal and Raine's outline representation of \&\fCcmr\fP at 10 points
+requires about twice the space needed for bitmaps of the same; at 14 to
+16 points, the outlines and the bitmaps occupy about the same amount of
+space; above 16 points, the outlines are smaller than the bitmaps. It
+is clear that better encodings exist than we explored and these must be
+explored for any future version of \fHmf2ps\fP.
+.pp
+One such better encoding appears to be that used by Adobe for its own
+proprietary fonts; fonts encoded this way have a FontType of 1.
+User defined fonts have a FontType of 3. Beebe\*([.4\*(.]
+says that type 1 fonts are handled with greater efficiency than type 3
+fonts on most existing \*(pS interpreters, especially those that are based
+on Adobe-licensed code.
+Adobe has recently published specifications for the type 1 font encoding\*(<,\*([.2\*(.]\*(>,
+thus allowing anyone to produced type 1 fonts. Beebe believes that the
+market forces will drive other companies to encode their fonts as type 1.
+Moreover, as more and more windowing systems based on \*(pS, e.g., NeWS
+and NeXT, appear, the attraction of \*(pS outline fonts will increase, as
+then the same font can be used for both printing and previewing. Thus, the
+incentive will be to convert \*(MF fonts into type 1 \*(pS outline fonts.
+.pp
+Ultimately, the tradeoff is between the size of the font sent to the
+printer, and the time it takes for the printer to decode the program
+for the characters. However, with proper cacheing, a big enough cache,
+and a not very fancy document, the decoding is done only once per
+character for the document!
+.su "7\ \ \ Future work"
+.PP
+For the future, there are a number of improvements that can be made.
+Currently, each letter of the \*(pS outline fonts is described as a set
+of cyclic paths. When all are filled or stroked, one gets the desired
+letter. Some of those cyclic paths have a common boundary that is
+inside the letter and is not necessary for the outline description of
+the letter as a whole. Eliminating these paths and creating one
+outline for the letter will save space. Today this can be done
+manually, and is worth the effort because the translation process is
+done only once. From that time on, the font is used the way it is.
+.pp
+As was demonstrated by Beebe's rescue of our result, closer attention
+should be paid to obtaining more compact representations of character
+outlines, representations for which \*(pS routines can be written to
+interpret them into standard outline drawing commands.
+Collapsing commands into single characters and using relative movements
+saved significant amounts of space. Perhaps, even more dramatic savings can
+be obtained by giving coordinates and distances in hexadecimal.
+.pp
+More effort can be spent on modifying the program in order to allow
+magnifications up to 7200 points. Thus, no jaggies will be seen, as
+occasionally happens when using higher magnifications, e.g., in our
+translated fonts at magnification 8. This could be done by enlarging
+the program arrays to handle characters based on 7200 points. A
+sophisticated solution is required if one wants to save room while
+compiling the input font. In such a case, any linear translation which
+is done within the \*(pS program is with a factor less than 1.
+.pp
+\*(MF was changed for \*(TX 3.0. It is necessary to build a new version of
+\fHmf2ps\fP based on this latest version of \*(MF. As the changes to the
+\*(MF program deal mainly with ligatures and kerning, the calculation of
+envelopes is probably not affected. Therefore, it is likely that
+the portion of \*(MF up to the calculation of the envelope can still be
+used as a front end for \fHmf2ps\fP with very little change in the
+portion of the program we wrote.
+.pp
+Finally, it might be worthwhile, for the sake of portability to other
+systems and enhanceability by \pother
+.sp
+humans, to rewrite or to write the next
+version of \fHmf2ps\fP with \&\fCWEB\fP.
+.su "Acknowledgments"
+.PP
+The authors thank the
+\*(TB editors, and Nelson Beebe for their help, sharp comments, and
+result-saving ideas.
+Dealing with their comments made this a better paper.
+.su "References"
+.]<
+.\"1985-P\s-2OST\s0S\s-2CRIP-3
+.ds [F 1
+.]-
+.ds [L Adb85
+.ds [K PostScript
+.ds [T P\s-2OST\s0S\s-2CRIPT\s0 Language Reference Manual
+.ds [I Adobe Systems Incorporated, Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1985
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"1990-Adobe-Type-1-Font-Fo-13
+.ds [F 2
+.]-
+.ds [L Adb90
+.ds [T Adobe Type 1 Font Format
+.ds [I Adobe Systems, Inc.
+.ds [D March, 1990
+.ds [R Part No. LPS0064
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 4 tech-report
+.\"Bechtolsheim.S.v.-1989-T\v'+.2m'\h'-.1m'E\h-6
+.ds [F 3
+.]-
+.ds [L Bec89
+.ds [A S.\ von\ Bechtolsheim
+.ds [T The T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X PostScript Software Package
+.ds [J TUGboat
+.ds [V 10
+.ds [N 1
+.ds [P 25\(en27
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Beebe.N.-1990-12
+.ds [F 4
+.]-
+.ds [L Bee90
+.ds [A N.\ Beebe
+.ds [O Private communication, via electronic mail
+.ds [D 1990
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 0 other
+.\"Carr.L.-1987-Of-Metafont-and-Post-8
+.ds [F 5
+.]-
+.ds [L Car87
+.ds [A L.\ Carr
+.ds [T Of Metafont and PostScript
+.ds [J T\h'-.1m'\v'+.2m'E\v'-.2m'Xniques
+.ds [V 5
+.ds [P 141\(en152
+.nr [P 0
+.ds [C Seattle, WA
+.ds [D August, 1987
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Henderson.D.-1989-Outline-fonts-with-\-9
+.ds [F 6
+.]-
+.ds [L Hen89
+.ds [A D.\ Henderson
+.ds [T Outline fonts with \f(LGMETAFONT\fP
+.ds [J TUGboat
+.ds [V 10
+.ds [N 1
+.ds [P 36\(en38
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Hobby.J.D.-1989-\f(LGMETAFONT\fP-lik-11
+.ds [F 7
+.]-
+.ds [L Hob89
+.ds [A J.D.\ Hobby
+.ds [T A \f(LGMETAFONT\fP-like System with PostScript Output
+.ds [J TUGboat
+.ds [V 10
+.ds [N 4
+.ds [P 505\(en512
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Kernighan.B.W.-1982-Typesetter-independe-5
+.ds [F 8
+.]-
+.ds [L Ker82
+.ds [A B.W.\ Kernighan
+.ds [T A Typesetter-independent TROFF
+.ds [R Computing Science Technical Report No. 97
+.ds [I Bell Laboratories
+.ds [C Murray Hill, NJ 07974
+.ds [D March, 1982
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 4 tech-report
+.\"Knuth.D.E.-1984-T\h'-.1m'\v'+.2m'E\v-4
+.ds [F 9
+.]-
+.ds [L Knu84
+.ds [K T\dE\u\(*xbook
+.ds [A D.E.\ Knuth
+.ds [T The T\h'-.1m'\v'+.2m'E\v'-.2m'Xbook
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1984
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Knuth.D.E.-1986-\f(LGMETAFONT\fPbook-1
+.ds [F 10
+.]-
+.ds [L Knu86
+.ds [A D.E.\ Knuth
+.ds [T The \f(LGMETAFONT\fPbook
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1986
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Knuth.D.E.-1987-\f(LGMETAFONT\fP:-Th-2
+.ds [F 11
+.]-
+.ds [L Knu87
+.ds [A D.E.\ Knuth
+.ds [T \f(LGMETAFONT\fP: The Program
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1987
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Toal.G.-1990-10
+.ds [F 12
+.]-
+.ds [L Toa90
+.ds [A G.\ Toal
+.ds [O Private communication, via electronic mail
+.ds [D 1990
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 0 other
+.\"Ziv.J.-1977-Universal-Algorithm--7
+.ds [F 13
+.]-
+.ds [L ZL77
+.ds [A J.\ Ziv
+.as [A " and A.\ Lempel
+.ds [T A Universal Algorithm for Sequential Data Compression
+.ds [J IEEE Trans\%actions on Information Theory
+.ds [V IT-23
+.ds [V 3
+.ds [P 337\(en343
+.nr [P 0
+.ds [D May, 1977
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.]>
+.RT
+.sp 2
+.ta 1P +1P
+.in +6P
+.ps 9
+.vs 11
+.nf
+.ti -1P
+\(dm Shimon Yanai
+IBM Science and Technology
+ Center
+Technion City
+.sp
+Haifa 32000
+Israel
+yanai@israearn.bitnet
+.sp
+.ti -1P
+\(dm Daniel M. Berry
+Computer Science
+Technion
+Haifa 32000
+Israel
+dberry@cs.technion.ac.il
+.fi
+.in -6P
+.RT
diff --git a/fonts/utilities/mf2ps/doc/printsamples/README b/fonts/utilities/mf2ps/doc/printsamples/README
new file mode 100644
index 0000000000..a3c13aecac
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/README
@@ -0,0 +1,15 @@
+builtins.ps - to make figure 12 samples
+cm.ps - to make Figure 11 R M examples
+cm.tex - to make Figure 11 R M examples
+cm7.ps - to make Figure 11 7 R M examples
+cm7.tex - to make Figure 11 7 R M examples
+cmr.ps - to make Figure 11 R P examples
+cmtt.ps - to make Figure 11 T P examples
+lasy.ps - to make Figure 11 L P examples
+logo.ps - to make a sample of METAFONT in its own font
+sy.ps - to make Figure 11 L M examples
+sy.tex - to make Figure 11 L M examples
+tt.ps - to make Figure 11 T M examples
+tt.tex - to make Figure 11 T M examples
+tt7.ps - to make Figure 11 8 T M examples
+tt7.tex - to make Figure 11 8 T M examples
diff --git a/fonts/utilities/mf2ps/doc/printsamples/builtins.ps b/fonts/utilities/mf2ps/doc/printsamples/builtins.ps
new file mode 100644
index 0000000000..0b70fc607a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/builtins.ps
@@ -0,0 +1,16 @@
+%!
+ /Helvetica findfont 10 scalefont setfont
+ 100 710 moveto (THIS IS HELVETICA TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Helvetica findfont 12 scalefont setfont
+ 100 698 moveto (THIS IS HELVETICA TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+
+ /Times-Roman findfont 10 scalefont setfont
+ 100 674 moveto (THIS IS TIMES-ROMAN TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Times-Roman findfont 12 scalefont setfont
+ 100 662 moveto (THIS IS TIMES-ROMAN TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+
+ /Courier findfont 10 scalefont setfont
+ 100 638 moveto (THIS IS COURIER TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Courier findfont 12 scalefont setfont
+ 100 626 moveto (THIS IS COURIER TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm.ps b/fonts/utilities/mf2ps/doc/printsamples/cm.ps
new file mode 100644
index 0000000000..e6c141fad0
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm.ps
@@ -0,0 +1,211 @@
+%!PS-Adobe-2.0
+%%Creator: dvips by Radical Eye Software
+%%Title: cm.dvi
+%%Pages: 1 -1
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%%BeginDocument: tex.pro
+/TeXDict 200 dict def TeXDict begin /bdf{bind def}def /Inch{Resolution mul}
+bdf /Dots{72 div Resolution mul}bdf /dopage{72 Resolution div dup neg scale
+translate}bdf /@letter{Resolution dup -10 mul dopage}bdf /@note{@letter}bdf
+/@a4{Resolution dup -10.6929133858 mul dopage}bdf /@translate{translate}bdf
+/@scale{scale}bdf /@rotate{rotate}bdf /@landscape{[0 1 -1 0 0 0]concat
+Resolution dup dopage}bdf /@legal{Resolution dup -13 mul dopage}bdf
+/@manualfeed{statusdict /manualfeed true put}bdf /@copies{/#copies exch def}
+bdf /@FontMatrix[1 0 0 -1 0 0]def /@FontBBox[0 0 1 1]def /dmystr(ZZf@@)def
+/newname{dmystr cvn}bdf /df{/fontname exch def dmystr 2 fontname cvx(@@@)cvs
+putinterval newname 7 dict def newname load begin /FontType 3 def /FontMatrix
+@FontMatrix def /FontBBox @FontBBox def /BitMaps 256 array def /BuildChar{
+CharBuilder}def /Encoding TeXEncoding def end fontname{/foo setfont}2 array
+copy cvx def fontname load 0 dmystr 5 string copy cvn cvx put}bdf /dfe{
+newname newname load definefont setfont}bdf /ch-image{ch-data 0 get}bdf
+/ch-width{ch-data 1 get}bdf /ch-height{ch-data 2 get}bdf /ch-xoff{ch-data 3
+get}bdf /ch-yoff{ch-data 4 get}bdf /ch-tfmw{ch-data 5 get}bdf /CharBuilder{
+save 3 1 roll exch /BitMaps get exch get /ch-data exch def ch-data null ne{
+ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+setcachedevice ch-width ch-height true[1 0 0 1 ch-xoff .1 sub ch-yoff .1 sub]{
+ch-image}imagemask}if restore}bdf /dc{/ch-code exch def dup 0 get length 1 lt{
+pop[<00>1 1 0 0 8.00]}if /ch-data exch def newname load /BitMaps get ch-code
+ch-data put}bdf /bop{gsave /SaveImage save def 0 0 moveto}bdf /eop{clear
+SaveImage restore showpage grestore}bdf /@start{/Resolution exch def
+/TeXEncoding 256 array def 0 1 255{TeXEncoding exch 1 string dup 0 3 index put
+cvn put}for}bdf /p{show}bdf /RuleMatrix[1 0 0 -1 -.1 -.1]def /BlackDots 8
+string def /v{gsave currentpoint translate false RuleMatrix{BlackDots}
+imagemask grestore}bdf /a{moveto}bdf /delta 0 def /tail{dup /delta exch def 0
+rmoveto}bdf /b{exch p tail}bdf /c{p delta 4 sub tail}bdf /d{p delta 3 sub tail
+}bdf /e{p delta 2 sub tail}bdf /f{p delta 1 sub tail}bdf /g{p delta 0 rmoveto}
+bdf /h{p delta 1 add tail}bdf /i{p delta 2 add tail}bdf /j{p delta 3 add tail}
+bdf /k{p delta 4 add tail}bdf /l{p -4 0 rmoveto}bdf /m{p -3 0 rmoveto}bdf /n{
+p -2 0 rmoveto}bdf /o{p -1 0 rmoveto}bdf /q{p 1 0 rmoveto}bdf /r{p 2 0 rmoveto
+}bdf /s{p 3 0 rmoveto}bdf /t{p 4 0 rmoveto}bdf /w{0 rmoveto}bdf /x{0 exch
+rmoveto}bdf /y{3 -1 roll p moveto}bdf /bos{/section save def}bdf /eos{clear
+section restore}bdf /SDict 200 dict def SDict begin /@SpecialDefaults{/hs 8.5
+Inch def /vs 11 Inch def /ho 0 def /vo 0 def /hsc 1 def /vsc 1 def /ang 0 def
+/CLIP false def /BBcalc false def}bdf /@hsize{/hs exch def /CLIP true def}bdf
+/@vsize{/vs exch def /CLIP true def}bdf /@hoffset{/ho exch def}bdf /@voffset{
+/vo exch def}bdf /@hscale{@scaleunit div /hsc exch def}bdf /@vscale{
+@scaleunit div /vsc exch def}bdf /@angle{/ang exch def}bdf /@scaleunit 100 def
+/@rwi{10 div /rwi exch def}bdf /@llx{/llx exch def}bdf /@lly{/lly exch def}
+bdf /@urx{/urx exch def}bdf /@ury{/ury exch def /BBcalc true def}bdf
+/@setclipper{BBcalc{rwi urx llx sub div dup scale llx neg lly neg translate}{
+hsc vsc scale}ifelse CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg
+0 rlineto closepath clip}{initclip}ifelse}bdf end /@MacSetUp{userdict /md
+known{userdict /md get type /dicttype eq{md begin /letter{}def /note{}def
+/legal{}def /od{txpose 1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark{transform{itransform moveto}}{transform{itransform
+lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}def /txpose{pxs pys
+scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if xflip yflip
+not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}
+if}{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{
+translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2
+get ppr 0 get neg sub neg translate}if xflip yflip not and{translate pop pop
+90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{
+translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}
+if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2
+copy translate .96 dup scale neg exch neg exch translate}if}def /cp{pop pop
+showpage pm restore}def end}if}if}def /psf$TeXscale{65536 div}def /startTexFig
+{/psf$SavedState save def userdict maxlength dict begin Resolution 72 div dup
+neg scale currentpoint translate /psf$ury exch psf$TeXscale def /psf$urx exch
+psf$TeXscale def /psf$lly exch psf$TeXscale def /psf$llx exch psf$TeXscale def
+/psf$y exch psf$TeXscale def /psf$x exch psf$TeXscale def currentpoint /psf$cy
+exch def /psf$cx exch def /psf$sx psf$x psf$urx psf$llx sub div def /psf$sy
+psf$y psf$ury psf$lly sub div def psf$sx psf$sy scale psf$cx psf$sx div
+psf$llx sub psf$cy psf$sy div psf$ury sub translate /showpage{}def /erasepage{
+}def /copypage{}def @MacSetUp}def /doclip{psf$llx psf$lly psf$urx psf$ury
+currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll exch lineto
+exch lineto exch lineto closepath clip newpath moveto}def /endTexFig{end
+psf$SavedState restore}def /@beginspecial{SDict begin /SpecialSave save def
+gsave Resolution 72 div dup neg scale currentpoint translate @SpecialDefaults}
+bdf /@setspecial{ho vo translate @setclipper ang rotate /showpage{}def newpath
+}bdf /@endspecial{grestore clear SpecialSave restore end}bdf /@defspecial{
+SDict begin}bdf /@fedspecial{end}bdf /li{lineto}bdf /rl{rlineto}bdf /rc{
+rcurveto}bdf /np{/SaveX currentpoint /SaveY exch def def newpath}bdf /st{
+stroke SaveX SaveY moveto}bdf /fil{fill SaveX SaveY moveto}bdf /ellipse{
+/endangle exch def /startangle exch def /yrad exch def /xrad exch def
+/savematrix matrix currentmatrix def translate xrad yrad scale 0 0 1
+startangle endangle arc savematrix setmatrix}bdf end
+%%EndDocument
+TeXDict begin 300 @start /fa df[<FF800FFFFF800FFF1E0001F00C0001F0040001E00400
+01E0060003E0020003C0020003C0010007800100078001FFFF8000FFFF0000800F0000801F0000
+401E0000401E0000603E0000203C0000203C000010780000107800001078000008F0000008F000
+0009F0000005E0000005E0000007E0000003C0000003C000000180000001800000018000>32 34
+-2 0 37]65 dc[<000FF000003FFC0000FC0E0001E0010007C000800F8000400F0000201E0000
+203E0000103C0000107C0000107C00001078000000F8000000F8000000F8000000F8000000F800
+0000F8000000F8000000F8000000780000107C0000107C0000103C0000303E0000301E0000300F
+0000700F8000F007C001F001E0037000FC0E70003FF830000FE010>28 34 -3 0 35]67 dc[<FF
+FFFFE0FFFFFFE0078003E0078000F0078000700780003007800030078000100780001007800010
+0780000807802008078020080780200007802000078060000780E00007FFE00007FFE0000780E0
+000780600007802000078020200780202007802020078000200780006007800060078000400780
+00C0078001C0078007C0FFFFFFC0FFFFFFC0>29 34 -2 0 33]69 dc[<FFFE0000FFFE00000780
+000007800000078000000780000007800000078000000780000007800000078020000780200007
+80200007802000078060000780E00007FFE00007FFE0000780E000078060000780200007802000
+07802020078020200780002007800020078000600780006007800040078000C0078001C0078007
+C0FFFFFFC0FFFFFFC0>27 34 -2 0 32]70 dc[<FFFC3FFFFFFC3FFF078001E0078001E0078001
+E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00780
+01E0078001E0078001E007FFFFE007FFFFE0078001E0078001E0078001E0078001E0078001E007
+8001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0FFFC3FFFFFFC3FFF
+>32 34 -2 0 37]72 dc[<FFFCFFFC078007800780078007800780078007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780FFFCFF
+FC>14 34 -2 0 18]73 dc[<FFFFFF00FFFFFF0007803F0007800F000780030007800300078001
+000780018007800180078000800780008007800080078000800780000007800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000000780000007
+8000000780000007800000078000000780000007800000FFFE0000FFFE0000>25 34 -2 0 30]
+76 dc[<FFE0203FFFFFE0703FFF1F007001E004007001E00400F801E00400F801E00400F801E0
+0401E401E00401E401E00401E401E00403C201E00403C201E004078101E004078101E004078101
+E0040F0081E0040F0081E0040F0081E0041E0041E0041E0041E0043C0021E0043C0021E0043C00
+21E004780011E004780011E004780011E004F00009E004F00009E004F00009E005E00005E005E0
+0005E007C00003E0FFC00003FFFFC00003FF>40 34 -2 0 45]77 dc[<FFE00020FFE000601F00
+0060040000E0040001E0040001E0040003E0040003E0040007A004000F2004000F2004001E2004
+003E2004003C20040078200400F8200400F0200401E0200401E0200403C0200407802004078020
+040F0020041F0020041E0020043C0020047C00200478002004F0002004F0002005E0002007C000
+F8FFC007FFFF8007FF>32 34 -2 0 37]78 dc[<000FE00000783C0001E00F0003C00780078003
+C00F0001E01E0000F01E0000F03C0000783C0000787C00007C7C00007C7800003CF800003EF800
+003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7800003C7C00007C3C
+0000783C0000781E0000F01E0000F00F0001E0078003C00380038001E00F0000783C00000FE000
+>31 34 -3 0 38]79 dc[<FFFC0000FFFC00000780000007800000078000000780000007800000
+07800000078000000780000007800000078000000780000007800000078000000780000007FFF8
+0007803E0007800F0007800780078003C0078003C0078003E0078003E0078003E0078003E00780
+03E0078003C0078003C00780078007800F8007803F00FFFFFC00FFFFF000>27 34 -2 0 33]80
+dc[<FFFC007C00FFFC01E300078007C100078007C08007800F808007800F800007800F80000780
+0F800007800F000007800F000007800F000007800F000007800E000007801E000007801C000007
+80380000078070000007FFE0000007803C000007800F00000780078000078007C000078003C000
+078003E000078003E000078003E000078003E000078003E000078007C000078007800007800F00
+0007803E0000FFFFF80000FFFFE00000>33 34 -2 0 36]82 dc[<81FC00C7FF00FE0380F001C0
+E000E0C000E0C000708000708000708000700000700000F00000F00001E00003E0003FC003FF80
+0FFF001FFE003FF0007F0000780000F00000F00000E00020E00020E00020E000606000607000E0
+3801E01C0FE00FFC6003F020>20 34 -3 0 27]83 dc[<03FFFF0003FFFF000007800000078000
+000780000007800000078000000780000007800000078000000780000007800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000800780048007
+80048007800480078004C007800CC007800C400780084007800860078018780780787FFFFFF87F
+FFFFF8>30 34 -2 0 35]84 dc[<0000C000000000C000000001E000000001E000000001E00000
+0003D000000003D000000003D0000000078800000007880000000F840000000F040000000F0400
+00001E020000001E020000003E030000003C010000003C0100000078008000007800800000F800
+C00000F000400000F000400001E000200001E000200001E000200003C000100003C000100007C0
+00080007800008000780000C000F80001E00FFF0007FC0FFF0007FC0>34 34 -1 0 37]86 dc[<
+00020000800000030001800000070001C00000070001C00000070001C000000F8003E000000F80
+03E000000F8003E000001E40079000001E40079000001E40079000003C200F0800003C200F0800
+003C200F08000078101E04000078101E04000078101E040000F0083C020000F0083C020000F008
+3C020001E00478010001E00478010001E00478010003C002F0008003C002F0008003C002F00080
+078001E00040078001E00040078001E000400F8003E000200F0003C000600F0003C000F0FFF03F
+FC03FEFFF03FFC03FE>47 34 -1 0 50]87 dc dfe /fb df[<FFF80F80070007000700070007
+000700070007000700070007000700070007000700070007000700070007000700C7003F000700
+0300>13 27 -4 0 21]49 dc[<FF80FFF01E001F000C001F0004001E0004001E0002003C000200
+3C0002003C000100780001FFF800010078000080F0000080F0000080F0000041E0000041E00000
+43E0000023C0000023C0000037C0000017800000178000000F0000000F0000000F000000060000
+0006000000060000>28 28 -1 0 31]65 dc[<001FC00000E0300003800800070004000E000200
+1C0001003C000100380000807800008070000080F0000000F0000000F0000000F0000000F00000
+00F0000000F0000000F00000007000008078000080380000803C0001801C0001800E0003800700
+078003800B8000E03180001FC080>25 28 -2 0 30]67 dc[<FFFFFC0F003C0F000C0F00060F00
+060F00020F00020F00020F00010F02010F02000F02000F02000F06000FFE000F06000F02000F02
+000F02000F02020F00020F00020F00060F00040F00040F000C0F003CFFFFFC>24 28 -2 0 28]
+69 dc[<FFF8000F80000F00000F00000F00000F00000F00000F00000F00000F02000F02000F02
+000F02000F06000FFE000F06000F02000F02000F02000F02040F00040F00040F000C0F00080F00
+080F00180F0078FFFFF8>22 28 -2 0 27]70 dc[<FFF3FFC00F003C000F003C000F003C000F00
+3C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F
+FFFC000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00
+0F003C000F003C000F003C00FFF3FFC0>26 28 -2 0 31]72 dc[<FFF00F000F000F000F000F00
+0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F
+000F00FFF0>12 28 -1 0 15]73 dc[<FF8307FF801C0300780008030078000807807800080780
+78000807807800080F407800080F407800081E207800081E207800081E207800083C107800083C
+107800083C10780008780878000878087800087808780008F004780008F004780008F004780009
+E002780009E00278000BC00178000BC00178000BC00178000F8000F8000F8000F800FF8000FF80
+>33 28 -2 0 38]77 dc[<FF8004001C000C0008000C0008001C0008003C0008003C0008007C00
+08007C000800F4000801E4000801E4000803C4000807C40008078400080F0400080F0400081E04
+00083C0400083C04000878040008F8040008F0040009E0040009E004000BC004000F8004000F80
+0E00FF007FC0>26 28 -2 0 31]78 dc[<003F800001E0F0000380380007001C000E000E001C00
+07003C00078038000380780003C0780003C0F00001E0F00001E0F00001E0F00001E0F00001E0F0
+0001E0F00001E0F00001E0700001C0780003C038000380380003801C0007000E000E0007001C00
+0380380001E0F000003F8000>27 28 -2 0 32]79 dc[<FFF0000F00000F00000F00000F00000F
+00000F00000F00000F00000F00000F00000F00000F00000FFF800F00E00F00780F003C0F001C0F
+001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E0FFFF80>23 28 -2 0 28]80 dc
+[<FFF007C00F001C200F0038100F0078100F0078100F0078000F0078000F0078000F0078000F00
+78000F0078000F00F0000F00E0000F03C0000FFF00000F01E0000F0078000F003C000F001C000F
+001E000F001E000F001E000F001E000F001C000F003C000F0078000F01E000FFFF0000>28 28
+-2 0 31]82 dc[<83F800CC0E00F00300C00300C001808001C08001C08001C00001C00003C000
+03C0000F8000FF8007FF001FFE003FF8007FC0007C0000F00000F00000E00080E00080E0008060
+01807003803007801C198007E080>18 28 -2 0 23]83 dc[<03FFFC00001F8000000F0000000F
+0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
+0F0000000F0000000F0000000F0000000F0000000F0000800F0020800F0020800F0020C00F0020
+400F0040400F0040600F00C0700F01C07FFFFFC0>27 28 -1 0 30]84 dc[<0018001800001800
+18000018001800003C003C00003C003C00003C003C00007E007E00007A007A00007A007A000079
+00F20000F100F10000F100F10000F081E10001E081E08001E081E08001E043E08003C043C04003
+C043C04003C027C0400780278020078027802007803F80200F001F00100F001F00100F001F0010
+1E001E00181F001F003CFFE0FFE0FF>40 28 -1 0 43]87 dc dfe end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+ TeXDict begin @letter
+%%EndSetup
+%%Page: 1 1
+ bop 83 42 a fb(THIS)14 b(IS)g(CMR)f(TEN)i(POINTS)f(WRITTEN)f(IN)h(MET)m(AF)o
+(ONT)83 91 y fa(THIS)i(IS)g(CMR)g(TWEL)-5 b(VE)16 b(POINTS)g(WRITTEN)g(IN)g
+(MET)l(AF)o(ONT)965 2770 y fb(1)g eop
+%%Trailer
+ end
+%%EOF
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm.tex b/fonts/utilities/mf2ps/doc/printsamples/cm.tex
new file mode 100644
index 0000000000..abdfdc1922
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm.tex
@@ -0,0 +1,8 @@
+\font\test=cmr10
+\test
+THIS IS CMR TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr12
+\test
+THIS IS CMR TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm7.ps b/fonts/utilities/mf2ps/doc/printsamples/cm7.ps
new file mode 100644
index 0000000000..916a98ccf9
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm7.ps
@@ -0,0 +1,503 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /BitMaps 128 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 128 array def
+ 0 1 127 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: cm7.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 1500 ] /cmr7.1500 @newfont
+cmr7.1500 @sf
+[<07FF000070000070000070000070000070000070000070000070000070000070000070000070008070088070088070084070
+ 104070106070307FFFF0> 24 20 -1 0 23.695] 84 @dc
+[<FF87FC1C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01FFFE01C00E01C00E01C00E01C00E01C00E01C00
+ E01C00E01C00E0FF87FC> 24 20 -1 0 24.503] 72 @dc
+[<FF801C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80> 16 20 -1 0 11.992] 73 @dc
+[<8FC0F060C0308018801880180018003800F00FF03FC07F007000E000C010C010C030603030F01F10> 16 20 -2 0 18.334] 83 @dc
+[<00FC000703000C0080180040300020700020600020E00000E00000E00000E00000E00000E000006000207000203000601800
+ 600C00E007036000FC20> 24 20 -2 0 23.695] 67 @dc
+[<FE083FE0381C0700101C0700101C0700103A0700103A0700107107001071070010E0870010E0870010E0870011C0470011C0
+ 470013802700138027001700170017001700170017001E000F00FE000FE0> 32 20 -1 0 29.864] 77 @dc
+[<FF80F81C01CC1C03841C03841C03801C03801C03801C03801C07001C0E001FF8001C07001C03801C01C01C01C01C01C01C01
+ C01C03801C0700FFF800> 24 20 -1 0 24.099] 82 @dc
+[<FFFFC01C01C01C00C01C00401C00601C00201C00201C08201C08001C18001FF8001C18001C08001C08401C00401C00401C00
+ 801C00801C0380FFFF80> 24 20 -1 0 22.312] 69 @dc
+[<00300000300000780000780000FC0000E40000E40001C20001C2000381000381000781800700800700800E00400E00401C00
+ 201C00203C0030FF00FC> 24 20 -1 0 24.503] 86 @dc
+[<FE00203800601000E01000E01001E01003A0100720100F20100E20101C2010382010702010702010E02011C0201380201780
+ 201700201E0070FC01FC> 24 20 -1 0 24.503] 78 @dc
+[<FF80001C00001C00001C00001C00001C00001C00001C00001C00001FFC001C07001C03801C01C01C01C01C01C01C01C01C01
+ C01C03801C0700FFFC00> 24 20 -1 0 22.312] 80 @dc
+[<01F800070E001C03803801C03000C07000E07000E0E00070E00070E00070E00070E00070E000706000607000E03000C03801
+ C01C0380070E0001F800> 24 20 -2 0 25.483] 79 @dc
+[<00C00C0000C00C0000C00C0001E01E0001E01E0001F03E0003903900039039000388710007087080070870800704E0800E04
+ E0400E04E0401E03C0601C03C0201C03C0203803803038038030FF1FF0FC> 32 20 -1 0 33.439] 87 @dc
+[<FE07FC3800E01000E00801C00801C004038007FF80040380020700020700010E00010E00011E00009C00009C000078000078
+ 00007800003000003000> 24 20 -1 0 24.503] 65 @dc
+[<FFC0001C00001C00001C00001C00001C00001C00001C10001C10001C30001FF0001C30001C10001C10401C00401C00401C00
+ 801C00801C0380FFFF80> 24 20 -1 0 21.418] 70 @dc
+[ 1500 ] /cmr10.1500 @newfont
+cmr10.1500 @sf
+[<03FFFC00001F8000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F
+ 0000000F0000000F0000000F0000000F0000000F0000000F0000800F0020800F0020800F0020C00F0020400F0040400F0040
+ 600F00C0700F01C07FFFFFC0> 32 28 -1 0 29.979] 84 @dc
+[<FFF3FFC00F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F00
+ 3C000F003C000FFFFC000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00
+ 0F003C000F003C00FFF3FFC0> 32 28 -2 0 31.133] 72 @dc
+[<FFF00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00
+ 0F000F00FFF0> 16 28 -1 0 14.990] 73 @dc
+[<83F800CC0E00F00300C00300C001808001C08001C08001C00001C00003C00003C0000F8000FF8007FF001FFE003FF8007FC0
+ 007C0000F00000F00000E00080E00080E000806001807003803007801C198007E080> 24 28 -2 0 23.061] 83 @dc
+[<001FC00000E0300003800800070004000E0002001C0001003C000100380000807800008070000080F0000000F0000000F000
+ 0000F0000000F0000000F0000000F0000000F00000007000008078000080380000803C0001801C0001800E00038007000780
+ 03800B8000E03180001FC080> 32 28 -2 0 29.979] 67 @dc
+[<FF8307FF801C030078000803007800080780780008078078000807807800080F407800080F407800081E207800081E207800
+ 081E207800083C107800083C107800083C10780008780878000878087800087808780008F004780008F004780008F0047800
+ 09E002780009E00278000BC00178000BC00178000BC00178000F8000F8000F8000F800FF8000FF80> 40 28 -2 0 38.051] 77 @dc
+[<FFF007C00F001C200F0038100F0078100F0078100F0078000F0078000F0078000F0078000F0078000F0078000F00F0000F00
+ E0000F03C0000FFF00000F01E0000F0078000F003C000F001C000F001E000F001E000F001E000F001E000F001C000F003C00
+ 0F0078000F01E000FFFF0000> 32 28 -2 0 30.556] 82 @dc
+[<FFFFFC0F003C0F000C0F00060F00060F00020F00020F00020F00010F02010F02000F02000F02000F06000FFE000F06000F02
+ 000F02000F02000F02020F00020F00020F00060F00040F00040F000C0F003CFFFFFC> 24 28 -2 0 28.250] 69 @dc
+[<FF8004001C000C0008000C0008001C0008003C0008003C0008007C0008007C000800F4000801E4000801E4000803C4000807
+ C40008078400080F0400080F0400081E0400083C0400083C04000878040008F8040008F0040009E0040009E004000BC00400
+ 0F8004000F800E00FF007FC0> 32 28 -2 0 31.133] 78 @dc
+[<FFF0000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFF800F00E00F00780F00
+ 3C0F001C0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E0FFFF80> 24 28 -2 0 28.250] 80 @dc
+[<003F800001E0F0000380380007001C000E000E001C0007003C00078038000380780003C0780003C0F00001E0F00001E0F000
+ 01E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C038000380380003801C0007000E000E0007001C00
+ 0380380001E0F000003F8000> 32 28 -2 0 32.286] 79 @dc
+[<001800180000180018000018001800003C003C00003C003C00003C003C00007E007E00007A007A00007A007A00007900F200
+ 00F100F10000F100F10000F081E10001E081E08001E081E08001E043E08003C043C04003C043C04003C027C0400780278020
+ 078027802007803F80200F001F00100F001F00100F001F00101E001E00181F001F003CFFE0FFE0FF> 40 28 -1 0 42.663] 87 @dc
+[<FF80FFF01E001F000C001F0004001E0004001E0002003C0002003C0002003C000100780001FFF800010078000080F0000080
+ F0000080F0000041E0000041E0000043E0000023C0000023C0000037C0000017800000178000000F0000000F0000000F0000
+ 000600000006000000060000> 32 28 -1 0 31.133] 65 @dc
+[<FFF8000F80000F00000F00000F00000F00000F00000F00000F00000F02000F02000F02000F02000F06000FFE000F06000F02
+ 000F02000F02000F02040F00040F00040F000C0F00080F00080F00180F0078FFFFF8> 24 28 -2 0 27.097] 70 @dc
+[ 1500 ] /cmr12.1500 @newfont
+cmr12.1500 @sf
+[<03FFFF00000FC000000780000007800000078000000780000007800000078000000780000007800000078000000780000007
+ 8000000780000007800000078000000780000007800000078000000780000007800000078000000780008007800480078004
+ 8007800480078004C007800C40078008400780084007800860078018780780787FFFFFF8> 32 34 -2 0 35.225] 84 @dc
+[<FFFC3FFF0FC003F0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00780
+ 01E0078001E0078001E0078001E0078001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0
+ 078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF> 32 34 -2 0 36.563] 72 @dc
+[<FFFC0FC007800780078007800780078007800780078007800780078007800780078007800780078007800780078007800780
+ 07800780078007800780078007800FC0FFFC> 16 34 -2 0 17.595] 73 @dc
+[<81FC00C60300F80180E000C0C000E0C000608000708000708000708000700000700000F00000F00001E00007E0003FC003FF
+ 800FFF001FFE003FF0007F0000780000F00000F00000E00020E00020E00020E000606000607000E03000E01803E00C0C6003
+ F020> 24 34 -3 0 27.097] 83 @dc
+[<000FF00000380C0000E0020001C00100078000800F0000400E0000201E0000203C0000103C0000107C000010780000107800
+ 0000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800000078000010780000107C0000103C000030
+ 3C0000301E0000300E0000700F000070078000F001C0017000E0067000381830000FE010> 32 34 -3 0 35.225] 67 @dc
+[<FFE0203FFF1F007003F00E007001E004007001E00400F801E00400F801E00400F801E00401E401E00401E401E00401E401E0
+ 0403C201E00403C201E004078101E004078101E004078101E0040F0081E0040F0081E0040F0081E0041E0041E0041E0041E0
+ 043C0021E0043C0021E0043C0021E004780011E004780011E004780011E004F00009E004F00009E004F00009E005E00005E0
+ 05E00005E007C00003E00FC00003F0FFC00003FF> 40 34 -2 0 44.692] 77 @dc
+[<FFFC007C000FC001E300078007C100078007C08007800F808007800F800007800F800007800F800007800F000007800F0000
+ 07800F000007800F000007800E000007801E000007801C00000780380000078070000007FFE0000007803C000007800E0000
+ 0780078000078007C000078003C000078003E000078003E000078003E000078003E000078003E000078003C000078007C000
+ 078007800007800E00000F803C0000FFFFE00000> 40 34 -2 0 35.894] 82 @dc
+[<00020000800000030001800000070001C00000070001C00000070001C000000F8003E000000F8003E000000F8003E000001E
+ 40079000001E40079000001E40079000003C200F0800003C200F0800003C200F08000078101E04000078101E04000078101E
+ 040000F0083C020000F0083C020000F0083C020001E00478010001E00478010001E00478010003C002F0008003C002F00080
+ 03C002F00080078001E00040078001E00040078001E000400F8003E000200F0003C000200F0003C000701F8007E000F8FFF0
+ 3FFC03FE> 48 34 -1 0 50.111] 87 @dc
+[<FFFFFFE00F8003E0078000E00780007007800030078000300780001007800010078000100780000807800008078020080780
+ 20000780200007802000078060000780E00007FFE0000780E000078060000780200007802000078020000780202007800020
+ 0780002007800020078000600780004007800040078000C0078001C00F8007C0FFFFFFC0> 32 34 -2 0 33.185] 69 @dc
+[<FFFFFF000F803F0007800F000780030007800300078001000780018007800180078000800780008007800080078000800780
+ 0000078000000780000007800000078000000780000007800000078000000780000007800000078000000780000007800000
+ 078000000780000007800000078000000780000007800000078000000FC00000FFFE0000> 32 34 -2 0 30.475] 76 @dc
+[<0000C000000000C000000001E000000001E000000001E000000003D000000003D000000003D0000000078800000007880000
+ 000F840000000F040000000F040000001E020000001E020000003E030000003C010000003C01000000780080000078008000
+ 00F800C00000F000400000F000400001E000200001E000200001E000200003C000100003C000100007C00008000780000800
+ 07800008000F80000C001F80001F00FFF0007FC0> 40 34 -1 0 36.563] 86 @dc
+[<FFFC00000FC00000078000000780000007800000078000000780000007800000078000000780000007800000078000000780
+ 000007800000078000000780000007FFF00007803C0007800F0007800780078007C0078003C0078003E0078003E0078003E0
+ 078003E0078003E0078003E0078003C0078007C00780078007800F000F803C00FFFFF000> 32 34 -2 0 33.185] 80 @dc
+[<000FE00000783C0001E00F0003C00780078003C00F0001E01E0000F01E0000F03C0000783C0000787C00007C7C00007C7800
+ 003CF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7800003C7C00007C3C000078
+ 3C0000781E0000F01E0000F00F0001E0078003C00380038001E00F0000783C00000FE000> 32 34 -3 0 37.935] 79 @dc
+[<FFE000201F0000600E000060040000E0040001E0040001E0040003E0040003E0040007A004000F2004000F2004001E200400
+ 3E2004003C20040078200400F8200400F0200401E0200401E0200403C0200407802004078020040F0020041F0020041E0020
+ 043C0020047C00200478002004F0002004F0002005E0002007C0007007C000F8FF8007FF> 32 34 -2 0 36.563] 78 @dc
+[<FF800FFF3E0001F80C0000F00C0001F0040001E0040001E0060003E0020003C0020003C0010007800100078001FFFF800080
+ 0F0000800F0000801F0000401E0000401E0000603E0000203C0000203C000010780000107800001078000008F0000008F000
+ 0009F0000005E0000005E0000007E0000003C0000003C000000180000001800000018000> 32 34 -2 0 36.563] 65 @dc
+[<FFFE00000FC00000078000000780000007800000078000000780000007800000078000000780000007800000078020000780
+ 20000780200007802000078060000780E00007FFE0000780E000078060000780200007802000078020000780202007800020
+ 0780002007800020078000600780004007800040078000C0078001C00F8007C0FFFFFFC0> 32 34 -2 0 31.830] 70 @dc
+cmr10.1500 @sf
+[<FFF80F80070007000700070007000700070007000700070007000700070007000700070007000700070007000700C7003F00
+ 07000300> 16 27 -4 0 20.755] 49 @dc
+1 @bop1
+cmr7.1500 @sf
+83 42 p (THIS) s
+11 r (IS) s
+11 r (CMR) s
+12 r (SEVEN) s
+11 r (POINTS) s
+11 r (WRITTEN) s
+11 r (IN) s
+11 r (MET) s
+-1 r (AF) s
+-1 r (ONT) s
+cmr10.1500 @sf
+83 91 p (THIS) s
+14 r (IS) s
+14 r (CMR) s
+14 r (TEN) s
+13 r (POINTS) s
+14 r (WRITTEN) s
+14 r (IN) s
+14 r (MET) s
+-3 r (AF) s
+-1 r (ONT) s
+cmr12.1500 @sf
+83 141 p (THIS) s
+16 r (IS) s
+17 r (CMR) s
+16 r (TWEL) s
+-5 r (VE) s
+16 r (POINTS) s
+16 r (WRITTEN) s
+16 r (IN) s
+16 r (MET) s
+-3 r (AF) s
+-1 r (ONT) s
+cmr10.1500 @sf
+965 2770 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm7.tex b/fonts/utilities/mf2ps/doc/printsamples/cm7.tex
new file mode 100644
index 0000000000..d2a275b95a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm7.tex
@@ -0,0 +1,12 @@
+\font\test=cmr7
+\test
+THIS IS CMR SEVEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr10
+\test
+THIS IS CMR TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr12
+\test
+THIS IS CMR TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cmr.ps b/fonts/utilities/mf2ps/doc/printsamples/cmr.ps
new file mode 100644
index 0000000000..6237342ee7
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cmr.ps
@@ -0,0 +1,4555 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 40 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_A
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 346 180 0.5 sub lineto
+ 318 182 0.5 sub 290 182 0.5 sub 262 182 0.5 sub curveto
+ 262 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 488 180 0.5 sub moveto
+ 684 180 0.5 sub lineto
+ 654 182 0.5 sub 624 182 0.5 sub 594 182 0.5 sub curveto
+ 594 180 0.5 sub lineto
+ 486 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 418 600 moveto
+ 466 462 514 324 562 186 curveto
+ 562 184 564 182 566 182 curveto
+ 568 180 570 180 574 180 curveto
+ 622 180 lineto
+ 624 180 626 180 626 182 curveto
+ 628 182 628 184 628 186 curveto
+ 626 186 lineto
+ 626 188 lineto
+ 568 354 510 522 452 688 curveto
+ 452 690 450 692 450 692 curveto
+ 448 694 444 696 442 696 curveto
+ 442 694 lineto
+ 434 694 lineto
+ 432 694 428 692 426 690 curveto
+ 426 690 424 688 424 686 curveto
+ 366 520 308 352 250 186 curveto
+ 250 184 lineto
+ 252 184 lineto
+ 252 182 252 180 254 180 curveto
+ 264 180 lineto
+ 268 180 270 182 272 184 curveto
+ 274 184 274 186 276 188 curveto
+ 324 326 370 464 418 602 curveto
+closepath
+%end path
+fill
+%new path
+ 318 344 moveto
+ 538 344 lineto
+ 536 352 534 360 532 366 curveto
+ 532 364 lineto
+ 324 364 lineto
+ 322 358 318 350 316 342 curveto
+closepath
+%end path
+fill
+%new path
+ 270 246 moveto
+ 268 236 262 228 256 222 curveto
+ 252 218 248 214 242 212 curveto
+ 228 202 210 200 192 200 curveto
+ 192 180 lineto
+ 264 180 lineto
+ 270 202 278 226 284 248 curveto
+ 282 246 lineto
+ 270 246 lineto
+closepath
+%end path
+fill
+%new path
+ 294 246 moveto
+ 282 246 lineto
+ 276 224 268 200 262 180 curveto
+ 348 180 lineto
+ 348 202 lineto
+ 346 202 lineto
+ 332 202 316 206 304 216 curveto
+ 302 216 302 216 302 218 curveto
+ 296 224 292 232 292 240 curveto
+ 294 240 lineto
+ 294 242 294 246 296 248 curveto
+closepath
+%end path
+fill
+%new path
+ 548 226 moveto
+ 550 224 550 224 550 222 curveto
+ 548 222 lineto
+ 548 218 546 214 542 210 curveto
+ 540 210 538 208 536 206 curveto
+ 522 200 504 200 486 200 curveto
+ 486 180 lineto
+ 594 180 lineto
+ 588 196 584 212 580 228 curveto
+ 580 226 lineto
+ 546 226 lineto
+closepath
+%end path
+fill
+%new path
+ 612 226 moveto
+ 582 226 lineto
+ 586 210 590 194 596 180 curveto
+ 686 180 lineto
+ 686 202 lineto
+ 684 202 lineto
+ 666 202 642 202 630 206 curveto
+ 626 208 624 210 622 212 curveto
+ 618 216 614 222 612 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_B
+(
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 326 180 lineto
+ 328 184 lineto
+ 330 186 lineto
+ 330 664 lineto
+ 328 668 lineto
+ 326 670 lineto
+ 322 672 lineto
+ 320 672 lineto
+ 320 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 650 moveto
+ 460 650 lineto
+ 460 648 lineto
+ 482 648 504 638 520 622 curveto
+ 522 622 522 620 524 618 curveto
+ 542 600 550 574 550 548 curveto
+ 548 548 lineto
+ 548 520 536 494 518 474 curveto
+ 516 474 516 474 516 472 curveto
+ 494 452 466 442 438 442 curveto
+ 298 442 lineto
+ 298 432 lineto
+ 300 434 lineto
+ 460 434 lineto
+ 500 434 540 444 574 468 curveto
+ 578 472 584 476 590 480 curveto
+ 608 500 620 524 620 550 curveto
+ 618 550 lineto
+ 618 578 604 604 584 624 curveto
+ 580 628 576 632 572 636 curveto
+ 538 660 498 672 458 672 curveto
+ 458 670 lineto
+ 298 670 lineto
+ 298 648 lineto
+closepath
+%end path
+fill
+%new path
+ 300 428 moveto
+ 470 428 lineto
+ 470 426 lineto
+ 494 426 516 416 534 398 curveto
+ 536 396 538 394 540 392 curveto
+ 558 370 568 340 568 310 curveto
+ 566 310 lineto
+ 566 280 554 252 534 232 curveto
+ 514 212 486 200 458 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 480 180 lineto
+ 522 180 562 192 594 218 curveto
+ 596 222 600 224 604 228 curveto
+ 626 250 640 280 640 312 curveto
+ 638 312 lineto
+ 638 342 624 370 604 390 curveto
+ 600 394 596 398 592 402 curveto
+ 560 426 518 438 478 438 curveto
+ 478 436 lineto
+ 298 436 lineto
+ 298 426 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 330 624 moveto
+ 330 632 330 640 334 644 curveto
+ 336 644 336 646 336 646 curveto
+ 342 650 356 650 368 650 curveto
+ 368 672 lineto
+ 366 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 330 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 328 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 368 180 lineto
+ 368 202 lineto
+ 366 202 lineto
+ 354 202 340 202 334 206 curveto
+ 334 206 334 208 332 208 curveto
+ 328 212 328 220 328 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_C
+(
+newpath
+%new path
+ 642 482 moveto
+ 656 482 lineto
+ 658 484 lineto
+ 660 486 lineto
+ 660 490 lineto
+ 658 492 lineto
+ 654 532 640 570 620 602 curveto
+ 618 604 lineto
+ 618 606 lineto
+ 610 616 602 626 592 636 curveto
+ 592 636 lineto
+ 592 638 lineto
+ 572 656 550 670 524 678 curveto
+ 522 678 lineto
+ 522 680 lineto
+ 506 686 490 688 472 688 curveto
+ 470 688 lineto
+ 470 686 lineto
+ 444 686 418 682 394 674 curveto
+ 392 674 lineto
+ 392 672 lineto
+ 356 660 324 640 296 614 curveto
+ 296 614 lineto
+ 296 612 lineto
+ 294 612 294 610 292 610 curveto
+ 282 598 272 586 264 574 curveto
+ 264 576 lineto
+ 262 572 lineto
+ 234 528 218 478 218 426 curveto
+ 220 428 lineto
+ 220 422 lineto
+ 220 370 236 320 264 276 curveto
+ 262 278 lineto
+ 264 274 lineto
+ 266 274 lineto
+ 274 262 284 250 294 238 curveto
+ 296 238 296 236 298 236 curveto
+ 298 236 lineto
+ 298 234 lineto
+ 326 208 358 188 394 178 curveto
+ 396 178 lineto
+ 396 176 lineto
+ 420 168 446 164 472 164 curveto
+ 472 164 lineto
+ 474 166 lineto
+ 494 166 512 170 530 176 curveto
+ 530 174 lineto
+ 532 176 lineto
+ 534 176 lineto
+ 560 184 584 198 604 218 curveto
+ 602 216 lineto
+ 604 218 lineto
+ 614 228 620 236 628 246 curveto
+ 626 246 lineto
+ 628 248 lineto
+ 630 250 lineto
+ 648 278 660 314 660 352 curveto
+ 660 354 lineto
+ 658 358 lineto
+ 656 358 lineto
+ 654 360 lineto
+ 652 360 lineto
+ 650 358 lineto
+ 646 358 lineto
+ 646 360 lineto
+ 644 358 lineto
+ 642 358 lineto
+ 640 354 lineto
+ 640 316 630 282 610 254 curveto
+ 612 256 lineto
+ 614 258 lineto
+ 612 258 lineto
+ 606 248 598 238 590 230 curveto
+ 592 232 lineto
+ 590 228 lineto
+ 590 224 lineto
+ 592 232 lineto
+ 598 234 lineto
+ 596 234 lineto
+ 592 232 lineto
+ 574 214 552 200 526 192 curveto
+ 528 192 lineto
+ 530 194 lineto
+ 530 192 lineto
+ 514 186 496 184 478 184 curveto
+ 478 186 lineto
+ 476 184 lineto
+ 474 184 lineto
+ 480 186 lineto
+ 484 184 lineto
+ 480 186 lineto
+ 460 186 440 190 422 196 curveto
+ 424 194 lineto
+ 426 194 lineto
+ 398 204 374 218 354 240 curveto
+ 354 238 lineto
+ 352 240 lineto
+ 356 238 lineto
+ 358 234 lineto
+ 356 238 lineto
+ 354 238 lineto
+ 350 244 344 250 340 256 curveto
+ 336 260 334 264 330 268 curveto
+ 332 266 lineto
+ 334 264 lineto
+ 332 264 lineto
+ 302 312 292 370 292 428 curveto
+ 294 428 lineto
+ 292 430 lineto
+ 294 428 lineto
+ 292 420 lineto
+ 294 424 lineto
+ 294 482 304 540 334 588 curveto
+ 334 586 lineto
+ 332 584 lineto
+ 336 588 338 592 342 596 curveto
+ 346 602 352 608 356 614 curveto
+ 358 616 lineto
+ 358 620 lineto
+ 356 614 lineto
+ 350 612 lineto
+ 354 612 lineto
+ 356 614 lineto
+ 376 634 400 648 428 658 curveto
+ 426 656 lineto
+ 424 656 lineto
+ 442 662 462 666 480 666 curveto
+ 482 666 lineto
+ 484 668 lineto
+ 478 666 lineto
+ 474 668 lineto
+ 474 666 lineto
+ 478 666 lineto
+ 478 664 lineto
+ 494 664 510 662 524 656 curveto
+ 522 658 lineto
+ 520 658 lineto
+ 542 650 562 638 580 620 curveto
+ 578 622 lineto
+ 582 620 lineto
+ 578 622 lineto
+ 576 626 lineto
+ 578 622 lineto
+ 588 612 594 604 602 592 curveto
+ 600 594 lineto
+ 598 596 lineto
+ 600 596 lineto
+ 620 564 634 526 638 486 curveto
+ 636 486 lineto
+ 638 484 lineto
+ 640 482 lineto
+ 642 482 lineto
+closepath
+%end path
+fill
+%new path
+ 658 484 moveto
+ 660 486 lineto
+ 660 682 lineto
+ 658 686 lineto
+ 656 686 lineto
+ 654 688 lineto
+ 652 688 lineto
+ 650 686 lineto
+ 648 686 lineto
+ 648 688 lineto
+ 646 686 lineto
+ 644 686 lineto
+ 644 684 lineto
+ 628 660 612 636 596 614 curveto
+ 594 612 lineto
+ 594 608 lineto
+ 596 604 lineto
+ 598 604 lineto
+ 600 600 604 596 606 590 curveto
+ 606 592 lineto
+ 604 594 lineto
+ 624 562 638 524 642 486 curveto
+ 640 486 lineto
+ 642 484 lineto
+ 644 482 lineto
+ 656 482 lineto
+ 658 484 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_D
+(
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 442 650 lineto
+ 442 648 lineto
+ 484 648 524 632 552 602 curveto
+ 558 596 564 590 568 584 curveto
+ 602 536 608 478 608 420 curveto
+ 606 420 lineto
+ 606 364 600 306 566 262 curveto
+ 562 256 558 250 554 246 curveto
+ 524 216 482 200 440 200 curveto
+ 300 200 lineto
+ 300 180 lineto
+ 460 180 lineto
+ 516 180 568 204 608 244 curveto
+ 610 246 614 248 616 250 curveto
+ 658 298 680 358 680 422 curveto
+ 678 422 lineto
+ 678 486 656 550 614 598 curveto
+ 610 602 606 606 604 610 curveto
+ 564 648 512 672 458 672 curveto
+ 458 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_E
+(
+newpath
+%new path
+ 268 666 moveto
+ 268 662 lineto
+ 266 662 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 662 lineto
+ 330 666 lineto
+ 328 668 lineto
+ 324 670 lineto
+ 322 670 lineto
+ 322 668 lineto
+ 274 668 lineto
+ 274 670 lineto
+ 272 668 lineto
+ 268 666 lineto
+closepath
+%end path
+fill
+%new path
+ 602 508 moveto
+ 618 508 lineto
+ 612 562 604 616 598 670 curveto
+ 598 668 lineto
+ 298 668 lineto
+ 298 646 lineto
+ 300 648 lineto
+ 442 648 lineto
+ 442 646 lineto
+ 484 646 532 646 562 620 curveto
+ 562 620 564 618 566 618 curveto
+ 592 590 598 546 602 506 curveto
+closepath
+%end path
+fill
+%new path
+ 472 528 moveto
+ 472 504 472 476 456 460 curveto
+ 440 444 410 444 386 444 curveto
+ 298 444 lineto
+ 298 422 lineto
+ 300 424 lineto
+ 492 424 lineto
+ 492 530 lineto
+ 490 528 lineto
+ 472 528 lineto
+closepath
+%end path
+fill
+%new path
+ 474 340 moveto
+ 492 340 lineto
+ 492 446 lineto
+ 490 444 lineto
+ 298 444 lineto
+ 298 422 lineto
+ 300 424 lineto
+ 388 424 lineto
+ 388 422 lineto
+ 412 422 442 422 458 406 curveto
+ 474 390 474 362 474 338 curveto
+closepath
+%end path
+fill
+%new path
+ 620 364 moveto
+ 612 318 604 262 574 234 curveto
+ 574 232 572 232 572 230 curveto
+ 538 200 490 200 446 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 610 180 lineto
+ 620 242 630 304 640 366 curveto
+ 638 364 lineto
+ 620 364 lineto
+closepath
+%end path
+fill
+%new path
+ 268 622 moveto
+ 300 622 lineto
+ 300 670 lineto
+ 298 668 lineto
+ 192 668 lineto
+ 192 646 lineto
+ 194 646 lineto
+ 214 646 244 646 256 642 curveto
+ 258 640 260 640 262 638 curveto
+ 266 634 268 626 268 620 curveto
+closepath
+%end path
+fill
+%new path
+ 332 622 moveto
+ 332 630 332 638 336 642 curveto
+ 338 642 338 644 338 644 curveto
+ 344 648 358 648 370 648 curveto
+ 370 670 lineto
+ 368 668 lineto
+ 298 668 lineto
+ 298 620 lineto
+ 300 622 lineto
+ 332 622 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_F
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 422 180 0.5 sub lineto
+ 382 182 0.5 sub 340 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 666 moveto
+ 268 662 lineto
+ 266 662 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 662 lineto
+ 330 666 lineto
+ 328 668 lineto
+ 324 670 lineto
+ 322 670 lineto
+ 322 668 lineto
+ 274 668 lineto
+ 274 670 lineto
+ 272 668 lineto
+ 268 666 lineto
+closepath
+%end path
+fill
+%new path
+ 592 508 moveto
+ 608 508 lineto
+ 602 562 594 616 588 670 curveto
+ 588 668 lineto
+ 298 668 lineto
+ 298 646 lineto
+ 300 648 lineto
+ 438 648 lineto
+ 438 646 lineto
+ 478 646 524 646 552 620 curveto
+ 554 620 554 618 556 618 curveto
+ 582 592 588 546 592 506 curveto
+closepath
+%end path
+fill
+%new path
+ 468 518 moveto
+ 468 494 468 464 452 450 curveto
+ 436 434 408 434 384 434 curveto
+ 298 434 lineto
+ 298 412 lineto
+ 300 414 lineto
+ 488 414 lineto
+ 488 520 lineto
+ 486 518 lineto
+ 468 518 lineto
+closepath
+%end path
+fill
+%new path
+ 470 330 moveto
+ 488 330 lineto
+ 488 436 lineto
+ 486 434 lineto
+ 298 434 lineto
+ 298 412 lineto
+ 300 414 lineto
+ 386 414 lineto
+ 386 412 lineto
+ 410 412 438 412 454 396 curveto
+ 470 382 470 352 470 328 curveto
+closepath
+%end path
+fill
+%new path
+ 268 622 moveto
+ 300 622 lineto
+ 300 670 lineto
+ 298 668 lineto
+ 192 668 lineto
+ 192 646 lineto
+ 194 646 lineto
+ 214 646 244 646 256 642 curveto
+ 258 640 260 640 262 638 curveto
+ 266 634 268 626 268 620 curveto
+closepath
+%end path
+fill
+%new path
+ 332 622 moveto
+ 332 630 332 638 336 642 curveto
+ 338 642 338 644 338 644 curveto
+ 344 648 358 648 370 648 curveto
+ 370 670 lineto
+ 368 668 lineto
+ 298 668 lineto
+ 298 620 lineto
+ 300 622 lineto
+ 332 622 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 424 180 lineto
+ 424 202 lineto
+ 422 202 lineto
+ 396 202 360 202 346 206 curveto
+ 342 208 340 210 336 212 curveto
+ 332 216 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_G
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 508 376 0.5 add moveto
+ 548 374 0.5 add 590 374 0.5 add 630 374 0.5 add curveto
+ 630 376 0.5 add lineto
+ 658 376 0.5 add 684 376 0.5 add 712 378 0.5 add curveto
+ 710 376 0.5 add lineto
+ 506 376 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 596 264 moveto
+ 598 264 lineto
+ 598 248 604 234 612 220 curveto
+ 610 222 lineto
+ 612 218 lineto
+ 614 218 lineto
+ 618 210 624 204 632 196 curveto
+ 630 198 lineto
+ 632 196 lineto
+ 638 190 644 184 652 180 curveto
+ 658 180 lineto
+ 660 182 lineto
+ 662 184 lineto
+ 662 268 lineto
+ 660 272 lineto
+ 658 272 lineto
+ 656 274 lineto
+ 654 274 lineto
+ 652 272 lineto
+ 602 272 lineto
+ 602 274 lineto
+ 600 272 lineto
+ 598 272 lineto
+ 596 268 lineto
+ 596 264 lineto
+closepath
+%end path
+fill
+%new path
+ 644 482 moveto
+ 658 482 lineto
+ 660 484 lineto
+ 662 486 lineto
+ 662 490 lineto
+ 660 492 lineto
+ 656 532 642 570 622 602 curveto
+ 622 600 lineto
+ 620 604 lineto
+ 612 616 604 626 594 636 curveto
+ 596 634 lineto
+ 594 636 lineto
+ 574 656 552 670 526 678 curveto
+ 524 678 lineto
+ 524 680 lineto
+ 508 686 490 688 472 688 curveto
+ 472 688 lineto
+ 470 686 lineto
+ 444 686 420 682 396 674 curveto
+ 394 674 lineto
+ 392 672 lineto
+ 356 660 324 640 296 614 curveto
+ 296 614 lineto
+ 296 612 lineto
+ 294 612 294 610 292 610 curveto
+ 282 598 272 586 264 574 curveto
+ 262 572 lineto
+ 262 570 lineto
+ 234 528 218 478 218 426 curveto
+ 220 428 lineto
+ 220 422 lineto
+ 220 370 236 320 264 278 curveto
+ 262 278 lineto
+ 264 276 lineto
+ 266 274 lineto
+ 274 262 284 250 294 238 curveto
+ 296 238 296 236 298 236 curveto
+ 298 236 lineto
+ 298 234 lineto
+ 326 208 358 188 394 178 curveto
+ 396 178 lineto
+ 398 176 lineto
+ 422 168 446 164 472 164 curveto
+ 474 164 lineto
+ 474 166 lineto
+ 498 166 520 170 540 176 curveto
+ 542 176 lineto
+ 542 178 lineto
+ 562 182 580 192 594 204 curveto
+ 594 204 lineto
+ 594 206 lineto
+ 598 210 602 214 606 220 curveto
+ 604 218 lineto
+ 606 222 lineto
+ 608 222 lineto
+ 616 234 620 248 620 266 curveto
+ 620 268 lineto
+ 618 272 lineto
+ 616 272 lineto
+ 614 274 lineto
+ 612 274 lineto
+ 610 272 lineto
+ 602 272 lineto
+ 602 274 lineto
+ 600 272 lineto
+ 598 272 lineto
+ 596 268 lineto
+ 596 252 592 238 584 226 curveto
+ 584 228 lineto
+ 586 230 lineto
+ 582 226 580 222 576 218 curveto
+ 574 216 lineto
+ 574 212 lineto
+ 576 218 lineto
+ 582 220 lineto
+ 578 220 lineto
+ 576 218 lineto
+ 564 206 548 198 530 192 curveto
+ 532 192 lineto
+ 534 194 lineto
+ 534 192 lineto
+ 518 186 500 184 482 184 curveto
+ 482 186 lineto
+ 480 184 lineto
+ 478 184 lineto
+ 484 186 lineto
+ 488 184 lineto
+ 484 186 lineto
+ 464 186 444 190 424 196 curveto
+ 426 194 lineto
+ 428 194 lineto
+ 400 204 374 220 354 240 curveto
+ 352 240 lineto
+ 356 238 lineto
+ 358 236 lineto
+ 356 238 lineto
+ 354 240 lineto
+ 350 244 344 250 340 256 curveto
+ 336 260 334 264 330 268 curveto
+ 332 268 lineto
+ 334 264 lineto
+ 332 266 lineto
+ 302 312 292 370 292 428 curveto
+ 294 428 lineto
+ 292 430 lineto
+ 294 428 lineto
+ 292 420 lineto
+ 294 424 lineto
+ 294 482 304 540 334 588 curveto
+ 334 586 lineto
+ 332 584 lineto
+ 336 588 338 592 342 596 curveto
+ 346 602 352 608 356 614 curveto
+ 356 612 lineto
+ 358 616 lineto
+ 358 620 lineto
+ 356 612 lineto
+ 350 610 lineto
+ 352 610 lineto
+ 354 612 lineto
+ 356 612 lineto
+ 376 634 400 648 428 658 curveto
+ 428 656 lineto
+ 426 656 lineto
+ 444 662 462 666 482 666 curveto
+ 484 666 lineto
+ 484 668 lineto
+ 478 666 lineto
+ 474 668 lineto
+ 476 666 lineto
+ 478 666 lineto
+ 480 664 lineto
+ 496 664 510 662 524 656 curveto
+ 524 658 lineto
+ 522 658 lineto
+ 544 650 564 638 582 620 curveto
+ 580 622 lineto
+ 584 620 lineto
+ 580 622 lineto
+ 578 626 lineto
+ 580 622 lineto
+ 590 612 598 602 604 592 curveto
+ 604 594 lineto
+ 602 596 lineto
+ 622 564 636 526 640 486 curveto
+ 638 486 lineto
+ 640 484 lineto
+ 642 482 lineto
+ 644 482 lineto
+closepath
+%end path
+fill
+%new path
+ 660 484 moveto
+ 662 486 lineto
+ 662 682 lineto
+ 660 686 lineto
+ 658 686 lineto
+ 656 688 lineto
+ 654 688 lineto
+ 652 686 lineto
+ 650 686 lineto
+ 650 688 lineto
+ 648 686 lineto
+ 646 686 lineto
+ 646 684 lineto
+ 630 660 614 636 598 614 curveto
+ 596 612 lineto
+ 596 608 lineto
+ 598 604 lineto
+ 600 604 lineto
+ 602 600 606 594 608 590 curveto
+ 608 592 lineto
+ 606 594 lineto
+ 626 562 640 524 644 486 curveto
+ 642 486 lineto
+ 644 484 lineto
+ 646 482 lineto
+ 658 482 lineto
+ 660 484 lineto
+closepath
+%end path
+fill
+%new path
+ 598 374 moveto
+ 596 370 lineto
+ 596 266 lineto
+ 598 262 lineto
+ 600 260 lineto
+ 604 258 lineto
+ 606 258 lineto
+ 606 260 lineto
+ 656 260 lineto
+ 654 258 lineto
+ 658 260 lineto
+ 660 262 lineto
+ 662 266 lineto
+ 662 370 lineto
+ 660 374 lineto
+ 658 376 lineto
+ 654 378 lineto
+ 652 378 lineto
+ 652 376 lineto
+ 602 376 lineto
+ 604 378 lineto
+ 600 376 lineto
+ 598 374 lineto
+closepath
+%end path
+fill
+%new path
+ 598 330 moveto
+ 630 330 lineto
+ 630 378 lineto
+ 628 376 lineto
+ 506 376 lineto
+ 506 354 lineto
+ 508 354 lineto
+ 534 354 568 354 582 350 curveto
+ 586 348 590 346 592 344 curveto
+ 596 340 598 334 598 328 curveto
+closepath
+%end path
+fill
+%new path
+ 662 330 moveto
+ 662 338 662 344 668 350 curveto
+ 668 350 670 352 670 352 curveto
+ 678 356 698 356 712 356 curveto
+ 712 378 lineto
+ 710 376 lineto
+ 628 376 lineto
+ 628 328 lineto
+ 630 330 lineto
+ 662 330 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_H
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 194 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 368 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 474 670 0.5 add moveto
+ 510 668 0.5 add 544 668 0.5 add 580 668 0.5 add curveto
+ 580 670 0.5 add lineto
+ 616 670 0.5 add 650 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 472 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 474 180 0.5 sub moveto
+ 684 180 0.5 sub lineto
+ 648 182 0.5 sub 614 182 0.5 sub 578 182 0.5 sub curveto
+ 578 180 0.5 sub lineto
+ 472 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 548 668 moveto
+ 546 664 lineto
+ 546 186 lineto
+ 548 184 lineto
+ 550 180 lineto
+ 608 180 lineto
+ 610 184 lineto
+ 612 186 lineto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 552 670 lineto
+ 554 672 lineto
+ 550 670 lineto
+ 548 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 424 moveto
+ 580 424 lineto
+ 580 446 lineto
+ 578 444 lineto
+ 298 444 lineto
+ 298 422 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+%new path
+ 548 624 moveto
+ 580 624 lineto
+ 580 672 lineto
+ 578 670 lineto
+ 472 670 lineto
+ 472 648 lineto
+ 474 648 lineto
+ 494 648 524 648 536 644 curveto
+ 538 642 540 642 542 640 curveto
+ 546 636 548 628 548 622 curveto
+closepath
+%end path
+fill
+%new path
+ 612 624 moveto
+ 612 630 614 638 618 642 curveto
+ 620 644 622 644 624 646 curveto
+ 636 650 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 578 670 lineto
+ 578 622 lineto
+ 580 624 lineto
+ 612 624 lineto
+closepath
+%end path
+fill
+%new path
+ 546 226 moveto
+ 546 220 544 212 540 208 curveto
+ 538 206 536 206 534 204 curveto
+ 522 200 492 200 472 200 curveto
+ 472 180 lineto
+ 580 180 lineto
+ 580 228 lineto
+ 578 226 lineto
+ 546 226 lineto
+closepath
+%end path
+fill
+%new path
+ 610 226 moveto
+ 578 226 lineto
+ 578 180 lineto
+ 686 180 lineto
+ 686 202 lineto
+ 684 202 lineto
+ 664 202 634 202 622 206 curveto
+ 620 208 618 208 616 210 curveto
+ 612 214 610 222 610 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_I
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 190 670 0.5 add moveto
+ 226 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 374 670 0.5 add 410 672 0.5 add curveto
+ 408 670 0.5 add lineto
+ 188 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 190 180 0.5 sub moveto
+ 408 180 0.5 sub lineto
+ 372 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 188 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 188 670 lineto
+ 188 648 lineto
+ 190 648 lineto
+ 212 648 242 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 358 650 388 650 410 650 curveto
+ 410 672 lineto
+ 408 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 240 200 210 200 188 200 curveto
+ 188 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 410 180 lineto
+ 410 202 lineto
+ 408 202 lineto
+ 386 202 356 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_J
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 302 670 0.5 add moveto
+ 344 668 0.5 add 386 668 0.5 add 428 668 0.5 add curveto
+ 428 670 0.5 add lineto
+ 458 670 0.5 add 486 670 0.5 add 516 672 0.5 add curveto
+ 514 670 0.5 add lineto
+ 300 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 398 668 moveto
+ 396 664 lineto
+ 396 282 lineto
+ 396 266 394 250 388 236 curveto
+ 390 238 lineto
+ 390 240 lineto
+ 386 228 380 216 374 206 curveto
+ 370 202 368 198 364 196 curveto
+ 364 196 lineto
+ 372 200 lineto
+ 368 200 lineto
+ 366 198 lineto
+ 358 190 348 184 338 180 curveto
+ 338 182 lineto
+ 340 182 lineto
+ 334 180 328 180 322 180 curveto
+ 320 180 lineto
+ 316 176 lineto
+ 316 174 lineto
+ 314 172 lineto
+ 316 174 lineto
+ 316 168 lineto
+ 320 166 lineto
+ 322 164 lineto
+ 324 164 lineto
+ 326 166 lineto
+ 342 166 356 168 372 174 curveto
+ 370 172 lineto
+ 374 174 lineto
+ 390 180 406 186 418 198 curveto
+ 420 200 422 202 424 202 curveto
+ 426 204 lineto
+ 428 206 lineto
+ 440 218 448 232 454 248 curveto
+ 452 248 lineto
+ 454 250 lineto
+ 454 252 lineto
+ 458 262 460 272 460 282 curveto
+ 460 664 lineto
+ 458 668 lineto
+ 456 670 lineto
+ 452 672 lineto
+ 450 672 lineto
+ 450 670 lineto
+ 402 670 lineto
+ 404 672 lineto
+ 400 670 lineto
+ 398 668 lineto
+closepath
+%end path
+fill
+%new path
+ 398 624 moveto
+ 428 624 lineto
+ 428 672 lineto
+ 426 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+ 302 648 lineto
+ 328 648 366 648 382 644 curveto
+ 386 642 388 640 392 638 curveto
+ 396 634 398 628 398 622 curveto
+closepath
+%end path
+fill
+%new path
+ 460 624 moveto
+ 460 632 462 638 466 644 curveto
+ 466 644 468 644 470 646 curveto
+ 478 650 500 650 516 650 curveto
+ 516 672 lineto
+ 514 670 lineto
+ 426 670 lineto
+ 426 622 lineto
+ 428 624 lineto
+ 460 624 lineto
+closepath
+%end path
+fill
+%new path
+ 330 176 moveto
+ 328 180 lineto
+ 324 180 lineto
+ 312 180 300 182 288 186 curveto
+ 290 184 lineto
+ 292 184 lineto
+ 276 190 262 198 252 210 curveto
+ 252 208 lineto
+ 250 210 lineto
+ 256 206 lineto
+ 256 206 lineto
+ 254 206 lineto
+ 244 216 238 228 234 240 curveto
+ 234 238 lineto
+ 236 236 lineto
+ 234 236 lineto
+ 232 246 230 254 230 264 curveto
+ 232 262 lineto
+ 230 266 lineto
+ 228 268 lineto
+ 224 270 lineto
+ 222 270 lineto
+ 222 268 lineto
+ 214 268 lineto
+ 216 270 lineto
+ 212 268 lineto
+ 210 266 lineto
+ 208 262 lineto
+ 208 260 lineto
+ 210 260 lineto
+ 210 250 212 242 214 234 curveto
+ 214 232 lineto
+ 216 230 lineto
+ 220 218 226 208 236 198 curveto
+ 234 200 lineto
+ 238 196 lineto
+ 250 184 264 176 282 172 curveto
+ 284 172 lineto
+ 284 170 lineto
+ 296 166 310 164 324 164 curveto
+ 324 164 lineto
+ 328 166 lineto
+ 330 168 lineto
+ 332 172 lineto
+ 332 174 lineto
+ 330 176 lineto
+closepath
+%end path
+fill
+%new path
+ 290 262 moveto
+ 288 264 lineto
+ 288 268 288 272 286 274 curveto
+ 288 274 lineto
+ 286 276 lineto
+ 286 278 lineto
+ 284 282 282 286 278 288 curveto
+ 280 288 lineto
+ 276 290 lineto
+ 276 292 lineto
+ 272 296 268 298 264 300 curveto
+ 264 298 lineto
+ 262 300 lineto
+ 260 300 lineto
+ 256 302 252 302 248 302 curveto
+ 248 302 lineto
+ 246 300 lineto
+ 244 300 240 300 236 298 curveto
+ 236 300 lineto
+ 234 298 lineto
+ 232 298 lineto
+ 228 296 224 294 220 290 curveto
+ 222 290 lineto
+ 218 288 lineto
+ 218 286 lineto
+ 214 284 212 280 210 276 curveto
+ 212 276 lineto
+ 210 274 lineto
+ 210 272 lineto
+ 208 270 208 266 208 262 curveto
+ 208 260 lineto
+ 210 258 lineto
+ 210 256 lineto
+ 214 248 218 240 220 232 curveto
+ 220 234 lineto
+ 222 230 lineto
+ 224 230 lineto
+ 226 226 230 224 234 222 curveto
+ 234 224 lineto
+ 236 222 lineto
+ 238 222 lineto
+ 242 220 246 220 248 220 curveto
+ 250 220 lineto
+ 250 222 lineto
+ 254 222 258 222 262 224 curveto
+ 262 222 lineto
+ 264 224 lineto
+ 266 224 lineto
+ 270 226 274 228 278 232 curveto
+ 276 232 lineto
+ 280 234 lineto
+ 280 236 lineto
+ 284 238 286 242 288 246 curveto
+ 286 246 lineto
+ 288 248 lineto
+ 288 250 lineto
+ 290 252 290 256 290 262 curveto
+ 290 262 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_K
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 194 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 368 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 538 670 0.5 add moveto
+ 572 668 0.5 add 604 668 0.5 add 636 668 0.5 add curveto
+ 636 670 0.5 add lineto
+ 654 670 0.5 add 672 670 0.5 add 690 672 0.5 add curveto
+ 688 670 0.5 add lineto
+ 536 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 516 180 0.5 sub moveto
+ 698 180 0.5 sub lineto
+ 672 182 0.5 sub 646 182 0.5 sub 620 182 0.5 sub curveto
+ 620 180 0.5 sub lineto
+ 514 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 332 moveto
+ 416 442 532 554 650 664 curveto
+ 650 668 lineto
+ 648 668 lineto
+ 648 670 lineto
+ 646 672 646 672 644 672 curveto
+ 644 670 lineto
+ 636 670 lineto
+ 632 670 628 668 626 666 curveto
+ 516 562 408 458 298 354 curveto
+ 298 330 lineto
+closepath
+%end path
+fill
+%new path
+ 410 448 moveto
+ 470 358 530 270 590 182 curveto
+ 590 182 590 182 592 180 curveto
+ 654 180 lineto
+ 654 180 656 180 658 182 curveto
+ 658 186 lineto
+ 656 186 lineto
+ 656 188 lineto
+ 588 288 520 390 452 490 curveto
+ 452 488 lineto
+ 438 474 422 460 408 448 curveto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+%new path
+ 560 604 moveto
+ 574 604 lineto
+ 594 626 616 650 636 672 curveto
+ 634 670 lineto
+ 536 670 lineto
+ 536 648 lineto
+ 538 648 lineto
+ 548 648 558 646 564 638 curveto
+ 566 638 568 636 570 632 curveto
+ 570 630 572 626 572 624 curveto
+ 570 624 lineto
+ 570 616 566 608 560 602 curveto
+ 558 602 lineto
+closepath
+%end path
+fill
+%new path
+ 690 650 moveto
+ 690 672 lineto
+ 688 670 lineto
+ 634 670 lineto
+ 614 648 592 624 572 602 curveto
+ 574 604 lineto
+ 586 604 lineto
+ 602 618 618 630 636 638 curveto
+ 654 646 672 650 690 650 curveto
+closepath
+%end path
+fill
+%new path
+ 546 246 moveto
+ 552 238 558 230 558 222 curveto
+ 556 222 lineto
+ 556 218 554 214 552 212 curveto
+ 552 210 552 210 550 208 curveto
+ 542 200 526 200 514 200 curveto
+ 514 180 lineto
+ 620 180 lineto
+ 608 202 594 226 580 248 curveto
+ 580 246 lineto
+ 544 246 lineto
+closepath
+%end path
+fill
+%new path
+ 616 246 moveto
+ 582 246 lineto
+ 596 224 610 200 622 180 curveto
+ 700 180 lineto
+ 700 202 lineto
+ 698 202 lineto
+ 682 202 664 202 650 210 curveto
+ 646 212 640 216 636 220 curveto
+ 628 228 622 238 616 248 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_L
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 342 670 0.5 add 384 670 0.5 add 424 672 0.5 add curveto
+ 422 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 570 364 moveto
+ 566 318 560 268 528 236 curveto
+ 502 208 462 200 426 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 570 180 lineto
+ 576 242 584 304 590 366 curveto
+ 588 364 lineto
+ 570 364 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 636 338 640 curveto
+ 342 642 344 644 348 646 curveto
+ 362 650 398 650 424 650 curveto
+ 424 672 lineto
+ 422 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_M
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 198 180 0.5 sub moveto
+ 364 180 0.5 sub lineto
+ 336 182 0.5 sub 308 182 0.5 sub 280 182 0.5 sub curveto
+ 280 180 0.5 sub lineto
+ 196 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 596 180 0.5 sub moveto
+ 800 180 0.5 sub lineto
+ 766 182 0.5 sub 732 182 0.5 sub 696 182 0.5 sub curveto
+ 696 180 0.5 sub lineto
+ 594 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 272 668 moveto
+ 272 664 lineto
+ 270 664 lineto
+ 270 188 lineto
+ 272 188 lineto
+ 272 184 lineto
+ 276 180 lineto
+ 288 180 lineto
+ 290 184 lineto
+ 292 186 lineto
+ 292 664 lineto
+ 290 668 lineto
+ 288 670 lineto
+ 284 672 lineto
+ 282 672 lineto
+ 282 670 lineto
+ 278 670 lineto
+ 278 672 lineto
+ 276 670 lineto
+ 272 668 lineto
+closepath
+%end path
+fill
+%new path
+ 670 668 moveto
+ 668 664 lineto
+ 668 186 lineto
+ 670 184 lineto
+ 672 180 lineto
+ 724 180 lineto
+ 726 184 lineto
+ 728 186 lineto
+ 728 664 lineto
+ 726 668 lineto
+ 724 670 lineto
+ 720 672 lineto
+ 718 672 lineto
+ 718 670 lineto
+ 674 670 lineto
+ 676 672 lineto
+ 672 670 lineto
+ 670 668 lineto
+closepath
+%end path
+fill
+%new path
+ 282 670 moveto
+ 344 508 406 348 468 186 curveto
+ 470 184 470 182 472 182 curveto
+ 474 180 478 180 480 180 curveto
+ 480 180 lineto
+ 482 180 486 182 488 184 curveto
+ 490 184 490 186 492 188 curveto
+ 554 350 616 510 678 672 curveto
+ 676 670 lineto
+ 668 670 lineto
+ 666 670 662 668 660 666 curveto
+ 658 666 658 664 656 662 curveto
+ 604 524 550 388 498 250 curveto
+ 498 252 lineto
+ 446 390 392 526 340 664 curveto
+ 338 666 338 668 336 668 curveto
+ 334 670 330 672 328 672 curveto
+ 328 670 lineto
+ 280 670 lineto
+closepath
+%end path
+fill
+%new path
+ 272 624 moveto
+ 282 624 lineto
+ 282 672 lineto
+ 280 670 lineto
+ 196 670 lineto
+ 196 648 lineto
+ 198 648 lineto
+ 218 648 248 648 260 644 curveto
+ 262 642 264 642 266 640 curveto
+ 270 636 272 628 272 622 curveto
+closepath
+%end path
+fill
+%new path
+ 270 246 moveto
+ 270 234 266 224 258 216 curveto
+ 256 214 254 214 252 212 curveto
+ 236 202 216 200 196 200 curveto
+ 196 180 lineto
+ 282 180 lineto
+ 282 248 lineto
+ 280 246 lineto
+ 270 246 lineto
+closepath
+%end path
+fill
+%new path
+ 290 246 moveto
+ 280 246 lineto
+ 280 180 lineto
+ 366 180 lineto
+ 366 202 lineto
+ 364 202 lineto
+ 344 202 324 204 308 214 curveto
+ 306 216 304 216 302 218 curveto
+ 294 226 290 236 290 248 curveto
+closepath
+%end path
+fill
+%new path
+ 728 624 moveto
+ 728 630 730 638 734 642 curveto
+ 736 644 738 644 740 646 curveto
+ 752 650 782 650 802 650 curveto
+ 802 672 lineto
+ 800 670 lineto
+ 696 670 lineto
+ 696 622 lineto
+ 698 624 lineto
+ 728 624 lineto
+closepath
+%end path
+fill
+%new path
+ 668 226 moveto
+ 668 220 666 212 662 208 curveto
+ 660 206 658 206 656 204 curveto
+ 644 200 614 200 594 200 curveto
+ 594 180 lineto
+ 698 180 lineto
+ 698 228 lineto
+ 696 226 lineto
+ 668 226 lineto
+closepath
+%end path
+fill
+%new path
+ 726 226 moveto
+ 696 226 lineto
+ 696 180 lineto
+ 802 180 lineto
+ 802 202 lineto
+ 800 202 lineto
+ 780 202 750 202 738 206 curveto
+ 736 208 734 208 732 210 curveto
+ 728 214 726 222 726 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_N
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 360 180 0.5 sub lineto
+ 332 182 0.5 sub 304 182 0.5 sub 276 182 0.5 sub curveto
+ 276 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 518 670 0.5 add moveto
+ 546 668 0.5 add 574 668 0.5 add 602 668 0.5 add curveto
+ 602 670 0.5 add lineto
+ 630 670 0.5 add 658 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 516 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 284 180 lineto
+ 286 184 lineto
+ 288 186 lineto
+ 288 664 lineto
+ 286 668 lineto
+ 284 670 lineto
+ 280 672 lineto
+ 278 672 lineto
+ 278 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 592 668 moveto
+ 590 664 lineto
+ 590 186 lineto
+ 592 184 lineto
+ 594 180 lineto
+ 608 180 lineto
+ 610 184 lineto
+ 612 186 lineto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 596 670 lineto
+ 598 672 lineto
+ 594 670 lineto
+ 592 668 lineto
+closepath
+%end path
+fill
+%new path
+ 268 662 moveto
+ 268 660 lineto
+ 270 658 lineto
+ 376 500 484 340 592 182 curveto
+ 592 184 lineto
+ 594 180 lineto
+ 602 180 lineto
+ 606 184 lineto
+ 606 186 lineto
+ 608 188 lineto
+ 608 262 lineto
+ 606 260 lineto
+ 606 266 lineto
+ 604 266 lineto
+ 514 400 422 534 332 668 curveto
+ 330 670 lineto
+ 326 672 lineto
+ 324 672 lineto
+ 324 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+ 268 662 lineto
+closepath
+%end path
+fill
+%new path
+ 294 624 moveto
+ 326 624 lineto
+ 318 640 308 656 300 672 curveto
+ 300 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 218 648 248 648 266 644 curveto
+ 274 642 280 638 286 632 curveto
+ 288 628 292 626 294 622 curveto
+closepath
+%end path
+fill
+%new path
+ 266 246 moveto
+ 266 234 262 224 254 216 curveto
+ 252 214 250 214 248 212 curveto
+ 232 202 212 200 192 200 curveto
+ 192 180 lineto
+ 278 180 lineto
+ 278 248 lineto
+ 276 246 lineto
+ 266 246 lineto
+closepath
+%end path
+fill
+%new path
+ 286 246 moveto
+ 276 246 lineto
+ 276 180 lineto
+ 362 180 lineto
+ 362 202 lineto
+ 360 202 lineto
+ 340 202 320 204 304 214 curveto
+ 302 216 300 216 298 218 curveto
+ 290 226 286 236 286 248 curveto
+closepath
+%end path
+fill
+%new path
+ 592 604 moveto
+ 602 604 lineto
+ 602 672 lineto
+ 600 670 lineto
+ 516 670 lineto
+ 516 648 lineto
+ 518 648 lineto
+ 538 648 558 646 574 636 curveto
+ 576 634 578 634 580 632 curveto
+ 588 624 592 614 592 602 curveto
+closepath
+%end path
+fill
+%new path
+ 612 604 moveto
+ 612 616 616 626 624 634 curveto
+ 626 636 628 636 630 638 curveto
+ 646 648 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 600 670 lineto
+ 600 602 lineto
+ 602 604 lineto
+ 612 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_O
+(
+newpath
+%new path
+ 458 668 moveto
+ 418 668 382 650 356 624 curveto
+ 348 616 342 608 336 600 curveto
+ 302 552 292 492 292 434 curveto
+ 294 434 lineto
+ 294 370 304 306 338 252 curveto
+ 346 242 354 232 362 224 curveto
+ 388 198 422 180 460 180 curveto
+ 460 182 lineto
+ 498 182 532 200 558 226 curveto
+ 566 234 574 244 582 254 curveto
+ 616 308 626 372 626 436 curveto
+ 624 436 lineto
+ 624 494 614 554 580 602 curveto
+ 574 610 568 618 560 626 curveto
+ 534 652 498 670 458 670 curveto
+closepath
+%end path
+%new path
+ 458 686 moveto
+ 398 686 340 660 296 618 curveto
+ 294 614 290 612 288 608 curveto
+ 242 558 218 490 218 422 curveto
+ 220 422 lineto
+ 220 354 244 288 290 238 curveto
+ 292 236 294 234 298 232 curveto
+ 340 188 398 164 460 164 curveto
+ 460 166 lineto
+ 522 166 580 190 622 234 curveto
+ 626 236 628 238 630 240 curveto
+ 676 290 700 356 700 424 curveto
+ 698 424 lineto
+ 698 492 674 560 628 610 curveto
+ 626 614 622 616 620 620 curveto
+ 576 662 518 688 458 688 curveto
+closepath
+%end path
+eofill
+) def
+
+/The_letter_P
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 180 0.5 sub moveto
+ 406 180 0.5 sub lineto
+ 370 182 0.5 sub 336 182 0.5 sub 300 182 0.5 sub curveto
+ 300 180 0.5 sub lineto
+ 194 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 330 180 lineto
+ 332 184 lineto
+ 334 186 lineto
+ 334 416 lineto
+ 332 420 lineto
+ 330 422 lineto
+ 326 424 lineto
+ 324 424 lineto
+ 324 422 lineto
+ 322 422 lineto
+ 322 424 lineto
+ 320 422 lineto
+ 316 420 lineto
+ 324 424 lineto
+ 330 420 lineto
+ 328 422 lineto
+ 324 424 lineto
+ 330 420 lineto
+ 332 416 lineto
+ 330 420 lineto
+ 332 416 lineto
+ 330 412 lineto
+ 332 414 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 432 650 lineto
+ 432 648 lineto
+ 464 648 498 640 522 618 curveto
+ 544 596 546 566 546 536 curveto
+ 544 536 lineto
+ 544 506 542 476 520 456 curveto
+ 520 454 lineto
+ 496 432 462 424 430 424 curveto
+ 300 424 lineto
+ 300 406 lineto
+ 302 408 lineto
+ 450 408 lineto
+ 494 408 536 418 570 446 curveto
+ 576 450 580 454 584 458 curveto
+ 606 480 620 508 620 538 curveto
+ 618 538 lineto
+ 618 570 604 598 582 622 curveto
+ 578 626 572 630 568 632 curveto
+ 534 660 492 672 448 672 curveto
+ 448 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 332 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 408 180 lineto
+ 408 202 lineto
+ 406 202 lineto
+ 386 202 356 202 344 206 curveto
+ 342 208 340 208 338 210 curveto
+ 334 214 332 222 332 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 moveto
+ 420 668 384 650 356 624 curveto
+ 348 616 342 606 334 598 curveto
+ 300 546 290 484 290 422 curveto
+ 292 422 lineto
+ 292 362 302 300 336 250 curveto
+ 344 240 350 232 358 226 curveto
+ 386 198 420 180 460 180 curveto
+ 460 182 lineto
+ 500 182 534 200 562 228 curveto
+ 570 234 576 242 584 252 curveto
+ 618 302 628 364 628 424 curveto
+ 626 424 lineto
+ 626 486 616 548 582 600 curveto
+ 574 608 568 618 560 626 curveto
+ 532 652 496 670 458 670 curveto
+closepath
+%end path
+%new path
+ 458 686 moveto
+ 398 686 340 660 296 618 curveto
+ 294 614 290 612 288 608 curveto
+ 242 558 218 490 218 422 curveto
+ 220 422 lineto
+ 220 354 244 288 290 238 curveto
+ 292 236 294 234 298 232 curveto
+ 340 188 398 164 460 164 curveto
+ 460 166 lineto
+ 522 166 580 190 622 234 curveto
+ 626 236 628 238 630 240 curveto
+ 676 290 700 356 700 424 curveto
+ 698 424 lineto
+ 698 492 674 560 628 610 curveto
+ 626 614 622 616 620 620 curveto
+ 576 662 518 688 458 688 curveto
+closepath
+%end path
+eofill
+%new path
+ 466 178 moveto
+ 464 180 lineto
+ 460 180 lineto
+ 454 180 448 182 444 184 curveto
+ 444 182 lineto
+ 446 182 lineto
+ 440 184 432 190 428 194 curveto
+ 426 194 lineto
+ 432 190 lineto
+ 432 190 lineto
+ 430 192 lineto
+ 424 198 420 204 418 212 curveto
+ 420 208 lineto
+ 418 210 lineto
+ 416 214 416 220 416 226 curveto
+ 418 226 lineto
+ 416 228 lineto
+ 418 226 lineto
+ 416 220 lineto
+ 418 224 lineto
+ 418 230 418 236 420 242 curveto
+ 420 240 lineto
+ 418 238 lineto
+ 420 238 lineto
+ 422 246 426 254 432 260 curveto
+ 432 258 lineto
+ 424 254 lineto
+ 426 254 lineto
+ 428 256 lineto
+ 430 256 lineto
+ 434 262 442 266 448 268 curveto
+ 444 266 lineto
+ 446 268 lineto
+ 450 270 456 270 462 270 curveto
+ 460 268 lineto
+ 464 270 lineto
+ 466 272 lineto
+ 458 268 lineto
+ 452 272 lineto
+ 456 270 lineto
+ 458 268 lineto
+ 460 268 lineto
+ 468 268 476 266 482 264 curveto
+ 480 266 lineto
+ 478 266 lineto
+ 488 262 494 258 500 252 curveto
+ 500 254 lineto
+ 502 252 lineto
+ 496 256 lineto
+ 496 256 lineto
+ 498 256 lineto
+ 506 246 514 232 518 218 curveto
+ 518 220 lineto
+ 516 222 lineto
+ 518 222 lineto
+ 530 184 532 138 544 100 curveto
+ 542 102 lineto
+ 544 98 lineto
+ 550 84 556 70 566 60 curveto
+ 564 62 lineto
+ 568 58 lineto
+ 574 52 582 48 590 44 curveto
+ 590 46 lineto
+ 592 44 lineto
+ 594 44 lineto
+ 600 42 608 40 616 40 curveto
+ 618 40 lineto
+ 618 42 lineto
+ 626 42 632 44 638 46 curveto
+ 638 44 lineto
+ 640 46 lineto
+ 642 46 lineto
+ 650 50 658 54 666 62 curveto
+ 664 60 lineto
+ 668 64 lineto
+ 678 74 686 90 692 106 curveto
+ 692 108 lineto
+ 694 110 lineto
+ 700 130 704 156 704 180 curveto
+ 702 184 lineto
+ 700 186 lineto
+ 696 188 lineto
+ 694 188 lineto
+ 694 186 lineto
+ 692 186 lineto
+ 694 188 lineto
+ 690 186 lineto
+ 688 184 lineto
+ 686 180 lineto
+ 686 172 684 164 682 158 curveto
+ 684 158 lineto
+ 684 160 lineto
+ 680 150 674 140 666 132 curveto
+ 666 132 lineto
+ 674 136 lineto
+ 670 136 lineto
+ 668 134 lineto
+ 660 126 650 120 640 116 curveto
+ 640 118 lineto
+ 642 118 lineto
+ 636 116 628 114 620 114 curveto
+ 618 114 lineto
+ 614 110 lineto
+ 622 114 lineto
+ 628 110 lineto
+ 626 114 lineto
+ 622 114 lineto
+ 622 116 lineto
+ 614 116 608 116 602 118 curveto
+ 606 116 lineto
+ 604 118 lineto
+ 594 122 588 126 580 132 curveto
+ 578 132 lineto
+ 584 128 lineto
+ 586 126 lineto
+ 584 128 lineto
+ 584 130 lineto
+ 550 164 542 230 510 264 curveto
+ 510 262 lineto
+ 508 266 lineto
+ 506 266 lineto
+ 500 274 492 278 482 282 curveto
+ 484 280 lineto
+ 480 282 lineto
+ 474 284 466 286 460 286 curveto
+ 458 286 lineto
+ 458 284 lineto
+ 452 284 446 284 442 282 curveto
+ 440 282 lineto
+ 438 280 lineto
+ 432 278 424 274 420 268 curveto
+ 420 270 lineto
+ 418 266 lineto
+ 416 266 lineto
+ 410 260 406 252 404 244 curveto
+ 404 242 lineto
+ 402 242 lineto
+ 400 236 400 230 400 224 curveto
+ 402 226 lineto
+ 402 222 lineto
+ 402 216 402 210 404 206 curveto
+ 404 204 lineto
+ 406 202 lineto
+ 408 194 412 188 418 182 curveto
+ 420 180 lineto
+ 422 180 lineto
+ 426 176 434 170 440 168 curveto
+ 440 170 lineto
+ 442 168 lineto
+ 444 168 lineto
+ 448 166 454 164 460 164 curveto
+ 458 166 lineto
+ 464 166 lineto
+ 466 170 lineto
+ 468 172 lineto
+ 468 174 lineto
+ 466 178 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_R
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 370 182 0.5 sub 334 182 0.5 sub 300 182 0.5 sub curveto
+ 300 180 0.5 sub lineto
+ 194 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 410 650 lineto
+ 410 648 lineto
+ 446 648 482 642 508 618 curveto
+ 510 618 510 616 512 616 curveto
+ 532 596 536 568 536 540 curveto
+ 534 540 lineto
+ 534 512 530 484 510 466 curveto
+ 508 464 508 462 506 462 curveto
+ 480 438 444 432 408 432 curveto
+ 300 432 lineto
+ 300 416 lineto
+ 302 418 lineto
+ 420 418 lineto
+ 468 418 514 428 554 454 curveto
+ 564 460 572 466 578 474 curveto
+ 598 492 610 516 610 542 curveto
+ 608 542 lineto
+ 608 570 594 596 574 616 curveto
+ 568 622 560 628 552 634 curveto
+ 514 660 466 672 418 672 curveto
+ 418 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 412 430 moveto
+ 410 426 lineto
+ 410 424 lineto
+ 412 420 lineto
+ 414 418 lineto
+ 418 416 lineto
+ 430 416 440 414 450 410 curveto
+ 450 412 lineto
+ 448 412 lineto
+ 462 406 476 398 486 388 curveto
+ 486 390 lineto
+ 488 388 lineto
+ 482 392 lineto
+ 482 392 lineto
+ 484 392 lineto
+ 494 380 502 368 506 354 curveto
+ 506 356 lineto
+ 504 358 lineto
+ 506 358 lineto
+ 508 348 510 338 510 328 curveto
+ 510 330 lineto
+ 508 330 lineto
+ 508 266 lineto
+ 510 268 lineto
+ 510 264 lineto
+ 510 252 512 242 514 232 curveto
+ 514 230 lineto
+ 516 228 lineto
+ 520 216 526 206 536 196 curveto
+ 534 198 lineto
+ 538 194 lineto
+ 550 184 562 178 578 172 curveto
+ 576 174 lineto
+ 580 172 lineto
+ 596 166 614 164 632 164 curveto
+ 634 164 lineto
+ 634 166 lineto
+ 640 166 644 166 650 168 curveto
+ 652 168 lineto
+ 652 170 lineto
+ 660 172 666 176 672 180 curveto
+ 670 180 lineto
+ 674 182 lineto
+ 682 190 688 200 692 212 curveto
+ 690 210 lineto
+ 692 214 lineto
+ 696 224 698 236 698 246 curveto
+ 698 248 lineto
+ 696 250 lineto
+ 694 254 lineto
+ 682 254 lineto
+ 680 250 lineto
+ 678 248 lineto
+ 678 246 lineto
+ 678 236 676 224 672 214 curveto
+ 674 214 lineto
+ 674 216 lineto
+ 670 206 664 196 656 188 curveto
+ 658 188 lineto
+ 656 186 lineto
+ 656 184 lineto
+ 658 188 lineto
+ 666 192 lineto
+ 660 192 lineto
+ 660 190 lineto
+ 654 186 648 182 642 180 curveto
+ 646 182 lineto
+ 644 180 lineto
+ 628 180 lineto
+ 626 176 lineto
+ 634 180 lineto
+ 640 176 lineto
+ 636 180 lineto
+ 632 180 lineto
+ 626 180 622 180 618 182 curveto
+ 622 180 lineto
+ 620 182 lineto
+ 614 184 610 186 606 190 curveto
+ 604 190 lineto
+ 610 186 lineto
+ 610 186 lineto
+ 608 188 lineto
+ 602 194 596 204 592 216 curveto
+ 594 214 lineto
+ 594 212 lineto
+ 588 228 586 248 582 268 curveto
+ 582 268 572 332 572 332 curveto
+ 572 338 570 342 568 348 curveto
+ 570 346 lineto
+ 568 350 lineto
+ 562 364 554 378 544 388 curveto
+ 544 386 lineto
+ 542 390 lineto
+ 540 390 lineto
+ 526 406 508 416 486 422 curveto
+ 484 422 lineto
+ 484 424 lineto
+ 464 430 442 434 418 434 curveto
+ 418 434 lineto
+ 414 432 lineto
+ 412 430 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_S
+(
+newpath
+%new path
+ 360 688 moveto
+ 358 688 lineto
+ 356 686 lineto
+ 342 686 328 684 314 680 curveto
+ 312 680 lineto
+ 312 678 lineto
+ 292 672 274 660 260 646 curveto
+ 260 646 lineto
+ 258 646 lineto
+ 252 638 248 632 242 624 curveto
+ 244 626 lineto
+ 242 622 lineto
+ 240 622 lineto
+ 226 600 218 574 218 548 curveto
+ 220 550 lineto
+ 220 544 lineto
+ 220 518 228 492 242 472 curveto
+ 244 470 lineto
+ 244 468 lineto
+ 250 460 254 454 260 448 curveto
+ 262 446 lineto
+ 276 432 294 422 314 414 curveto
+ 312 416 lineto
+ 316 414 lineto
+ 320 412 324 412 328 410 curveto
+ 328 410 422 388 422 388 curveto
+ 424 386 426 386 428 386 curveto
+ 424 388 lineto
+ 426 386 lineto
+ 440 382 454 374 464 362 curveto
+ 464 364 lineto
+ 466 362 lineto
+ 462 364 lineto
+ 460 368 lineto
+ 462 364 lineto
+ 464 364 lineto
+ 468 358 472 354 476 348 curveto
+ 474 352 lineto
+ 474 350 lineto
+ 488 332 494 308 494 286 curveto
+ 492 286 lineto
+ 494 284 lineto
+ 492 286 lineto
+ 494 294 lineto
+ 492 290 lineto
+ 492 266 486 244 472 224 curveto
+ 474 226 lineto
+ 476 228 lineto
+ 474 228 lineto
+ 472 222 468 218 464 214 curveto
+ 464 214 462 212 462 212 curveto
+ 460 210 lineto
+ 460 206 lineto
+ 462 212 lineto
+ 468 214 lineto
+ 464 214 lineto
+ 462 212 lineto
+ 452 200 438 192 424 188 curveto
+ 428 190 lineto
+ 426 188 lineto
+ 418 186 408 184 398 184 curveto
+ 398 186 lineto
+ 396 184 lineto
+ 394 184 lineto
+ 392 180 lineto
+ 392 170 lineto
+ 394 166 lineto
+ 396 166 lineto
+ 398 164 lineto
+ 400 164 lineto
+ 402 166 lineto
+ 414 166 428 168 440 172 curveto
+ 442 172 lineto
+ 444 174 lineto
+ 462 180 480 188 494 204 curveto
+ 494 204 lineto
+ 496 204 lineto
+ 496 206 498 206 500 208 curveto
+ 504 214 510 220 514 226 curveto
+ 512 224 lineto
+ 514 228 lineto
+ 516 228 lineto
+ 532 254 540 282 540 312 curveto
+ 540 314 lineto
+ 538 316 lineto
+ 538 346 530 374 514 398 curveto
+ 512 400 lineto
+ 512 402 lineto
+ 506 410 500 416 494 422 curveto
+ 492 424 lineto
+ 478 438 462 448 442 456 curveto
+ 442 454 lineto
+ 440 456 lineto
+ 438 456 lineto
+ 436 458 432 458 428 460 curveto
+ 428 460 334 482 334 482 curveto
+ 332 484 330 484 328 484 curveto
+ 332 482 lineto
+ 330 484 lineto
+ 314 488 302 498 290 508 curveto
+ 288 508 lineto
+ 292 506 lineto
+ 294 504 lineto
+ 292 506 lineto
+ 292 508 lineto
+ 286 512 282 518 280 522 curveto
+ 282 518 lineto
+ 282 520 lineto
+ 270 536 264 556 264 576 curveto
+ 266 574 lineto
+ 264 578 lineto
+ 266 574 lineto
+ 264 568 lineto
+ 266 570 lineto
+ 266 572 lineto
+ 266 592 272 612 284 628 curveto
+ 282 628 lineto
+ 280 624 lineto
+ 282 626 lineto
+ 284 630 288 636 294 640 curveto
+ 292 640 lineto
+ 294 642 lineto
+ 294 646 lineto
+ 292 640 lineto
+ 286 638 lineto
+ 292 638 lineto
+ 292 640 lineto
+ 304 650 318 658 332 664 curveto
+ 332 662 lineto
+ 330 662 lineto
+ 340 666 350 668 360 668 curveto
+ 362 668 lineto
+ 364 670 lineto
+ 366 672 lineto
+ 366 682 lineto
+ 364 686 lineto
+ 362 686 lineto
+ 360 688 lineto
+closepath
+%end path
+fill
+%new path
+ 520 518 moveto
+ 518 520 lineto
+ 514 560 504 594 486 622 curveto
+ 486 620 lineto
+ 484 624 lineto
+ 478 632 472 640 466 646 curveto
+ 464 648 lineto
+ 450 662 434 672 414 680 curveto
+ 414 678 lineto
+ 412 680 lineto
+ 410 680 lineto
+ 394 686 378 688 358 688 curveto
+ 358 688 lineto
+ 354 686 lineto
+ 352 682 lineto
+ 350 682 lineto
+ 350 676 lineto
+ 352 676 lineto
+ 352 672 lineto
+ 354 670 lineto
+ 354 668 lineto
+ 358 668 lineto
+ 358 666 lineto
+ 378 666 394 664 410 658 curveto
+ 408 660 lineto
+ 406 660 lineto
+ 426 652 442 642 456 628 curveto
+ 456 630 lineto
+ 458 628 lineto
+ 454 630 lineto
+ 452 634 lineto
+ 454 630 lineto
+ 456 630 lineto
+ 462 624 468 616 472 608 curveto
+ 472 610 lineto
+ 470 612 lineto
+ 488 586 498 552 502 514 curveto
+ 500 514 lineto
+ 502 512 lineto
+ 504 510 lineto
+ 516 510 lineto
+ 518 512 lineto
+ 520 514 lineto
+ 520 518 lineto
+closepath
+%end path
+fill
+%new path
+ 404 184 moveto
+ 400 186 lineto
+ 374 186 350 190 330 196 curveto
+ 332 196 lineto
+ 334 194 lineto
+ 334 196 lineto
+ 310 204 290 216 274 230 curveto
+ 272 230 lineto
+ 276 228 lineto
+ 278 226 lineto
+ 276 228 lineto
+ 276 230 lineto
+ 270 236 264 242 258 250 curveto
+ 260 250 lineto
+ 262 246 lineto
+ 260 248 lineto
+ 244 272 236 302 236 338 curveto
+ 238 336 lineto
+ 236 340 lineto
+ 234 340 lineto
+ 232 342 lineto
+ 230 342 lineto
+ 228 340 lineto
+ 224 340 lineto
+ 226 342 lineto
+ 222 340 lineto
+ 220 336 lineto
+ 220 332 lineto
+ 220 294 230 260 246 236 curveto
+ 248 234 lineto
+ 248 232 lineto
+ 254 224 260 218 266 210 curveto
+ 264 212 lineto
+ 266 210 lineto
+ 284 194 304 182 328 176 curveto
+ 330 176 lineto
+ 330 174 lineto
+ 350 168 374 164 400 164 curveto
+ 400 164 lineto
+ 404 166 lineto
+ 406 170 lineto
+ 408 170 lineto
+ 408 178 lineto
+ 406 178 lineto
+ 406 180 lineto
+ 404 184 lineto
+closepath
+%end path
+fill
+%new path
+ 518 512 moveto
+ 520 514 lineto
+ 520 682 lineto
+ 518 686 lineto
+ 516 686 lineto
+ 514 688 lineto
+ 512 688 lineto
+ 510 686 lineto
+ 508 686 lineto
+ 508 688 lineto
+ 506 686 lineto
+ 504 686 lineto
+ 502 682 lineto
+ 490 662 478 642 466 624 curveto
+ 466 620 lineto
+ 468 618 lineto
+ 470 616 lineto
+ 472 614 472 612 474 610 curveto
+ 472 612 lineto
+ 470 614 lineto
+ 472 614 lineto
+ 490 586 500 552 504 514 curveto
+ 502 514 lineto
+ 504 512 lineto
+ 506 510 lineto
+ 516 510 lineto
+ 518 512 lineto
+closepath
+%end path
+fill
+%new path
+ 222 340 moveto
+ 220 336 lineto
+ 218 336 lineto
+ 218 172 lineto
+ 220 174 lineto
+ 220 170 lineto
+ 222 166 lineto
+ 226 164 lineto
+ 228 164 lineto
+ 228 166 lineto
+ 230 166 lineto
+ 230 164 lineto
+ 232 166 lineto
+ 234 166 lineto
+ 236 170 lineto
+ 248 188 260 208 272 226 curveto
+ 272 230 lineto
+ 270 232 lineto
+ 268 234 lineto
+ 264 238 260 242 258 248 curveto
+ 258 246 lineto
+ 260 244 lineto
+ 244 270 234 300 234 338 curveto
+ 236 336 lineto
+ 234 340 lineto
+ 232 340 lineto
+ 230 342 lineto
+ 228 342 lineto
+ 226 340 lineto
+ 224 340 lineto
+ 226 342 lineto
+ 222 340 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_T
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 304 180 0.5 sub moveto
+ 574 180 0.5 sub lineto
+ 530 182 0.5 sub 484 182 0.5 sub 438 182 0.5 sub curveto
+ 438 180 0.5 sub lineto
+ 302 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 408 664 moveto
+ 408 660 lineto
+ 406 660 lineto
+ 406 188 lineto
+ 408 188 lineto
+ 408 184 lineto
+ 412 180 lineto
+ 468 180 lineto
+ 470 184 lineto
+ 472 186 lineto
+ 472 660 lineto
+ 470 664 lineto
+ 468 666 lineto
+ 464 668 lineto
+ 462 668 lineto
+ 462 666 lineto
+ 414 666 lineto
+ 414 668 lineto
+ 412 666 lineto
+ 408 664 lineto
+closepath
+%end path
+fill
+%new path
+ 656 506 moveto
+ 672 506 lineto
+ 668 560 662 614 658 668 curveto
+ 658 666 lineto
+ 438 666 lineto
+ 438 644 lineto
+ 440 646 lineto
+ 542 646 lineto
+ 542 644 lineto
+ 572 644 606 640 628 618 curveto
+ 648 598 652 544 656 504 curveto
+closepath
+%end path
+fill
+%new path
+ 224 506 moveto
+ 228 546 232 600 252 620 curveto
+ 274 642 308 646 338 646 curveto
+ 440 646 lineto
+ 440 668 lineto
+ 438 666 lineto
+ 218 666 lineto
+ 214 612 208 558 204 504 curveto
+ 206 506 lineto
+ 224 506 lineto
+closepath
+%end path
+fill
+%new path
+ 406 226 moveto
+ 406 220 404 214 400 210 curveto
+ 396 208 392 206 388 204 curveto
+ 372 200 330 200 302 200 curveto
+ 302 180 lineto
+ 440 180 lineto
+ 440 228 lineto
+ 438 226 lineto
+ 406 226 lineto
+closepath
+%end path
+fill
+%new path
+ 470 226 moveto
+ 438 226 lineto
+ 438 180 lineto
+ 576 180 lineto
+ 576 202 lineto
+ 574 202 lineto
+ 546 202 504 202 488 206 curveto
+ 484 208 480 210 476 212 curveto
+ 472 216 470 222 470 228 curveto
+closepath
+%end path
+fill
+%new path
+ 408 620 moveto
+ 440 620 lineto
+ 440 668 lineto
+ 438 666 lineto
+ 370 666 lineto
+ 370 644 lineto
+ 372 644 lineto
+ 382 644 396 644 402 640 curveto
+ 402 640 402 638 404 638 curveto
+ 408 634 408 626 408 618 curveto
+closepath
+%end path
+fill
+%new path
+ 472 620 moveto
+ 472 628 472 636 476 640 curveto
+ 478 640 478 642 478 642 curveto
+ 484 646 498 646 510 646 curveto
+ 510 668 lineto
+ 508 666 lineto
+ 438 666 lineto
+ 438 618 lineto
+ 440 620 lineto
+ 472 620 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_U
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 516 670 0.5 add moveto
+ 544 668 0.5 add 572 668 0.5 add 600 668 0.5 add curveto
+ 600 670 0.5 add lineto
+ 630 670 0.5 add 658 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 514 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 344 lineto
+ 268 344 lineto
+ 268 340 lineto
+ 272 336 lineto
+ 328 336 lineto
+ 330 340 lineto
+ 332 342 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 324 352 moveto
+ 322 352 lineto
+ 322 350 lineto
+ 274 350 lineto
+ 274 352 lineto
+ 272 350 lineto
+ 268 348 lineto
+ 268 342 lineto
+ 268 322 272 304 276 288 curveto
+ 276 286 lineto
+ 278 284 lineto
+ 286 260 300 236 320 218 curveto
+ 318 218 lineto
+ 322 216 lineto
+ 322 214 lineto
+ 324 214 lineto
+ 342 194 366 180 390 174 curveto
+ 390 176 lineto
+ 392 174 lineto
+ 394 174 lineto
+ 412 168 430 164 450 164 curveto
+ 450 164 lineto
+ 452 166 lineto
+ 466 166 482 168 496 174 curveto
+ 494 172 lineto
+ 498 174 lineto
+ 520 180 540 192 556 208 curveto
+ 558 210 lineto
+ 560 212 lineto
+ 562 214 564 216 566 218 curveto
+ 582 236 594 258 602 280 curveto
+ 600 278 lineto
+ 602 282 lineto
+ 608 302 612 322 612 344 curveto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 594 670 lineto
+ 596 672 lineto
+ 592 670 lineto
+ 590 668 lineto
+ 588 664 lineto
+ 588 344 lineto
+ 588 322 584 302 578 282 curveto
+ 580 284 lineto
+ 580 286 lineto
+ 572 264 562 244 546 228 curveto
+ 544 226 542 224 540 222 curveto
+ 542 222 lineto
+ 540 220 lineto
+ 540 218 lineto
+ 542 222 lineto
+ 550 226 lineto
+ 544 226 lineto
+ 544 224 lineto
+ 528 208 508 198 488 190 curveto
+ 488 192 lineto
+ 490 192 lineto
+ 478 186 462 184 448 184 curveto
+ 448 186 lineto
+ 446 184 lineto
+ 442 182 lineto
+ 450 186 lineto
+ 456 182 lineto
+ 454 184 lineto
+ 450 186 lineto
+ 436 186 424 188 412 192 curveto
+ 414 190 lineto
+ 416 190 lineto
+ 398 196 382 206 368 220 curveto
+ 366 220 lineto
+ 372 216 lineto
+ 374 214 lineto
+ 372 216 lineto
+ 372 218 lineto
+ 368 222 364 226 360 230 curveto
+ 352 242 344 256 340 270 curveto
+ 340 268 lineto
+ 342 266 lineto
+ 340 266 lineto
+ 332 292 330 318 330 346 curveto
+ 332 344 lineto
+ 330 348 lineto
+ 328 350 lineto
+ 324 352 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 590 604 moveto
+ 600 604 lineto
+ 600 672 lineto
+ 598 670 lineto
+ 514 670 lineto
+ 514 648 lineto
+ 516 648 lineto
+ 536 648 556 646 572 636 curveto
+ 574 634 576 634 578 632 curveto
+ 586 624 590 614 590 602 curveto
+closepath
+%end path
+fill
+%new path
+ 612 604 moveto
+ 612 616 616 626 624 634 curveto
+ 626 636 628 636 630 638 curveto
+ 646 648 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 598 670 lineto
+ 598 602 lineto
+ 600 604 lineto
+ 612 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_V
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 184 670 0.5 add moveto
+ 212 668 0.5 add 242 668 0.5 add 272 668 0.5 add curveto
+ 272 670 0.5 add lineto
+ 308 670 0.5 add 342 670 0.5 add 378 672 0.5 add curveto
+ 376 670 0.5 add lineto
+ 182 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 544 670 0.5 add moveto
+ 572 668 0.5 add 602 668 0.5 add 630 668 0.5 add curveto
+ 630 670 0.5 add lineto
+ 652 670 0.5 add 674 670 0.5 add 696 672 0.5 add curveto
+ 694 670 0.5 add lineto
+ 542 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 252 moveto
+ 514 388 566 526 618 664 curveto
+ 618 666 620 668 620 668 curveto
+ 624 670 626 672 630 672 curveto
+ 636 672 lineto
+ 636 670 lineto
+ 638 670 640 670 640 668 curveto
+ 642 668 642 666 642 664 curveto
+ 640 664 lineto
+ 640 662 lineto
+ 578 498 516 334 452 172 curveto
+ 452 170 452 168 450 168 curveto
+ 448 166 444 164 442 164 curveto
+ 434 164 lineto
+ 434 166 lineto
+ 432 166 428 168 426 170 curveto
+ 424 170 424 172 424 174 curveto
+ 360 336 298 500 236 664 curveto
+ 236 666 lineto
+ 238 666 lineto
+ 238 668 238 670 240 670 curveto
+ 240 672 242 672 244 672 curveto
+ 294 672 lineto
+ 294 670 lineto
+ 296 670 300 668 302 666 curveto
+ 304 666 304 664 304 662 curveto
+ 358 524 410 386 462 250 curveto
+closepath
+%end path
+fill
+%new path
+ 254 624 moveto
+ 284 624 lineto
+ 280 640 274 656 270 672 curveto
+ 270 670 lineto
+ 182 670 lineto
+ 182 648 lineto
+ 184 648 lineto
+ 202 648 224 648 236 644 curveto
+ 238 642 242 640 244 638 curveto
+ 248 634 252 628 254 622 curveto
+closepath
+%end path
+fill
+%new path
+ 318 624 moveto
+ 318 628 lineto
+ 320 628 lineto
+ 320 632 320 636 324 640 curveto
+ 326 642 328 642 330 644 curveto
+ 344 650 362 650 378 650 curveto
+ 378 672 lineto
+ 376 670 lineto
+ 272 670 lineto
+ 276 654 282 638 286 622 curveto
+ 286 624 lineto
+ 320 624 lineto
+closepath
+%end path
+fill
+%new path
+ 596 604 moveto
+ 606 604 lineto
+ 614 626 622 650 630 672 curveto
+ 628 670 lineto
+ 542 670 lineto
+ 542 648 lineto
+ 544 648 lineto
+ 560 648 576 644 586 634 curveto
+ 588 634 lineto
+ 594 628 598 620 598 612 curveto
+ 596 612 lineto
+ 596 608 594 606 594 602 curveto
+closepath
+%end path
+fill
+%new path
+ 618 604 moveto
+ 622 614 628 622 634 628 curveto
+ 638 632 642 636 646 638 curveto
+ 662 648 680 650 696 650 curveto
+ 696 672 lineto
+ 694 670 lineto
+ 628 670 lineto
+ 620 648 612 624 604 602 curveto
+ 606 604 lineto
+ 618 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_W
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 450 670 0.5 add moveto
+ 478 668 0.5 add 506 668 0.5 add 534 668 0.5 add curveto
+ 534 670 0.5 add lineto
+ 570 670 0.5 add 606 670 0.5 add 640 672 0.5 add curveto
+ 638 670 0.5 add lineto
+ 448 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 184 670 0.5 add moveto
+ 210 668 0.5 add 238 668 0.5 add 268 668 0.5 add curveto
+ 268 670 0.5 add lineto
+ 302 670 0.5 add 338 670 0.5 add 374 672 0.5 add curveto
+ 372 670 0.5 add lineto
+ 182 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 746 670 0.5 add moveto
+ 776 668 0.5 add 806 668 0.5 add 836 668 0.5 add curveto
+ 836 670 0.5 add lineto
+ 856 670 0.5 add 876 670 0.5 add 896 672 0.5 add curveto
+ 894 670 0.5 add lineto
+ 744 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 398 168 moveto
+ 400 166 402 164 406 164 curveto
+ 406 166 lineto
+ 408 166 lineto
+ 410 166 414 168 416 170 curveto
+ 416 170 418 172 418 174 curveto
+ 458 296 500 422 540 546 curveto
+ 540 544 lineto
+ 580 420 622 294 662 172 curveto
+ 662 170 664 168 664 168 curveto
+ 666 166 670 164 672 164 curveto
+ 672 166 lineto
+ 674 166 lineto
+ 678 166 680 168 682 170 curveto
+ 684 170 686 172 686 174 curveto
+ 740 336 792 500 846 664 curveto
+ 846 666 lineto
+ 844 666 lineto
+ 844 668 844 670 842 670 curveto
+ 842 672 840 672 838 672 curveto
+ 838 670 lineto
+ 836 670 lineto
+ 832 670 830 668 828 666 curveto
+ 826 666 826 664 824 662 curveto
+ 782 528 738 396 694 262 curveto
+ 694 264 lineto
+ 652 398 608 530 566 664 curveto
+ 564 666 564 668 562 668 curveto
+ 560 670 558 672 554 672 curveto
+ 554 670 lineto
+ 506 670 lineto
+ 504 670 502 670 502 668 curveto
+ 500 668 500 666 500 664 curveto
+ 502 664 lineto
+ 502 662 lineto
+ 512 632 520 604 530 574 curveto
+ 528 574 lineto
+ 494 470 462 366 428 262 curveto
+ 428 264 lineto
+ 384 398 340 530 298 664 curveto
+ 298 666 296 668 294 668 curveto
+ 292 670 290 672 286 672 curveto
+ 286 670 lineto
+ 238 670 lineto
+ 236 670 234 670 234 668 curveto
+ 232 668 232 666 232 664 curveto
+ 234 664 lineto
+ 234 662 lineto
+ 288 498 340 334 394 172 curveto
+ 394 170 396 168 398 168 curveto
+closepath
+%end path
+fill
+%new path
+ 562 668 moveto
+ 560 670 558 672 554 672 curveto
+ 554 670 lineto
+ 506 670 lineto
+ 504 670 502 670 502 668 curveto
+ 500 668 500 666 500 664 curveto
+ 502 664 lineto
+ 502 662 lineto
+ 528 580 556 498 582 416 curveto
+ 582 418 lineto
+ 644 418 lineto
+ 618 500 592 582 566 664 curveto
+ 564 666 564 668 562 668 curveto
+closepath
+%end path
+fill
+%new path
+ 514 624 moveto
+ 546 624 lineto
+ 542 640 536 656 532 672 curveto
+ 532 670 lineto
+ 448 670 lineto
+ 448 648 lineto
+ 450 648 lineto
+ 466 648 488 648 498 644 curveto
+ 502 642 504 640 506 638 curveto
+ 510 634 512 628 514 622 curveto
+closepath
+%end path
+fill
+%new path
+ 578 624 moveto
+ 578 628 lineto
+ 580 628 lineto
+ 580 632 582 636 584 640 curveto
+ 586 640 588 642 590 644 curveto
+ 606 650 624 650 640 650 curveto
+ 640 672 lineto
+ 638 670 lineto
+ 534 670 lineto
+ 538 654 544 638 548 622 curveto
+ 548 624 lineto
+ 580 624 lineto
+closepath
+%end path
+fill
+%new path
+ 248 624 moveto
+ 278 624 lineto
+ 274 640 270 656 266 672 curveto
+ 266 670 lineto
+ 182 670 lineto
+ 182 648 lineto
+ 184 648 lineto
+ 200 648 220 648 232 644 curveto
+ 234 642 236 640 238 638 curveto
+ 242 634 246 628 248 622 curveto
+closepath
+%end path
+fill
+%new path
+ 310 624 moveto
+ 310 628 lineto
+ 312 628 lineto
+ 312 632 314 636 316 640 curveto
+ 318 640 320 642 324 644 curveto
+ 338 650 356 650 374 650 curveto
+ 374 672 lineto
+ 372 670 lineto
+ 268 670 lineto
+ 272 654 276 638 280 622 curveto
+ 280 624 lineto
+ 312 624 lineto
+closepath
+%end path
+fill
+%new path
+ 808 604 moveto
+ 816 604 lineto
+ 824 626 830 650 836 672 curveto
+ 834 670 lineto
+ 744 670 lineto
+ 744 648 lineto
+ 746 648 lineto
+ 764 648 780 644 794 634 curveto
+ 796 634 798 632 798 630 curveto
+ 804 624 808 618 808 610 curveto
+ 806 610 lineto
+ 806 602 lineto
+closepath
+%end path
+fill
+%new path
+ 826 604 moveto
+ 830 614 834 624 842 632 curveto
+ 844 634 848 636 852 638 curveto
+ 864 648 880 650 896 650 curveto
+ 896 672 lineto
+ 894 670 lineto
+ 834 670 lineto
+ 828 648 822 624 814 602 curveto
+ 816 604 lineto
+ 826 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_X
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 670 0.5 add moveto
+ 226 668 0.5 add 256 668 0.5 add 286 668 0.5 add curveto
+ 286 670 0.5 add lineto
+ 322 670 0.5 add 360 670 0.5 add 396 672 0.5 add curveto
+ 394 670 0.5 add lineto
+ 194 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 494 180 0.5 sub moveto
+ 692 180 0.5 sub lineto
+ 662 182 0.5 sub 632 182 0.5 sub 602 182 0.5 sub curveto
+ 602 180 0.5 sub lineto
+ 492 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 492 670 0.5 add moveto
+ 522 668 0.5 add 554 668 0.5 add 586 668 0.5 add curveto
+ 586 670 0.5 add lineto
+ 612 670 0.5 add 638 670 0.5 add 662 672 0.5 add curveto
+ 660 670 0.5 add lineto
+ 490 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 188 180 0.5 sub moveto
+ 356 180 0.5 sub lineto
+ 326 182 0.5 sub 294 182 0.5 sub 262 182 0.5 sub curveto
+ 262 180 0.5 sub lineto
+ 186 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 318 670 moveto
+ 316 672 314 672 310 672 curveto
+ 310 670 lineto
+ 254 670 lineto
+ 252 670 250 670 250 668 curveto
+ 248 668 248 666 248 664 curveto
+ 250 664 lineto
+ 250 662 lineto
+ 358 502 464 342 570 182 curveto
+ 570 180 lineto
+ 634 180 lineto
+ 636 180 638 180 638 182 curveto
+ 640 182 640 184 640 186 curveto
+ 638 186 lineto
+ 638 188 lineto
+ 530 348 424 508 318 668 curveto
+ 318 670 lineto
+closepath
+%end path
+fill
+%new path
+ 248 180 moveto
+ 262 180 lineto
+ 266 180 272 182 274 186 curveto
+ 276 186 276 188 276 188 curveto
+ 386 348 494 508 602 668 curveto
+ 602 670 lineto
+ 600 670 lineto
+ 600 672 lineto
+ 598 672 lineto
+ 598 670 lineto
+ 586 670 lineto
+ 582 670 576 668 574 664 curveto
+ 572 664 572 662 572 662 curveto
+ 462 502 354 342 246 182 curveto
+ 246 180 lineto
+closepath
+%end path
+fill
+%new path
+ 278 624 moveto
+ 312 624 lineto
+ 302 640 294 656 284 672 curveto
+ 284 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 240 648 252 644 curveto
+ 258 642 264 638 268 634 curveto
+ 272 630 274 626 278 622 curveto
+closepath
+%end path
+fill
+%new path
+ 348 624 moveto
+ 346 626 346 626 346 628 curveto
+ 348 628 lineto
+ 348 630 350 634 352 636 curveto
+ 354 638 356 640 358 642 curveto
+ 370 648 382 650 396 650 curveto
+ 396 672 lineto
+ 394 670 lineto
+ 286 670 lineto
+ 296 654 304 638 314 622 curveto
+ 314 624 lineto
+ 350 624 lineto
+closepath
+%end path
+fill
+%new path
+ 540 226 moveto
+ 542 224 542 224 542 222 curveto
+ 540 222 lineto
+ 540 220 538 216 536 214 curveto
+ 534 212 532 210 530 208 curveto
+ 518 202 506 200 492 200 curveto
+ 492 180 lineto
+ 602 180 lineto
+ 592 196 584 212 574 228 curveto
+ 574 226 lineto
+ 538 226 lineto
+closepath
+%end path
+fill
+%new path
+ 610 226 moveto
+ 576 226 lineto
+ 586 210 594 194 604 180 curveto
+ 694 180 lineto
+ 694 202 lineto
+ 692 202 lineto
+ 672 202 648 202 636 206 curveto
+ 630 208 624 212 620 216 curveto
+ 616 220 614 224 610 228 curveto
+closepath
+%end path
+fill
+%new path
+ 532 604 moveto
+ 546 604 lineto
+ 560 626 572 650 586 672 curveto
+ 584 670 lineto
+ 490 670 lineto
+ 490 648 lineto
+ 492 648 lineto
+ 504 648 518 644 528 634 curveto
+ 528 632 lineto
+ 534 628 536 622 536 614 curveto
+ 534 614 lineto
+ 534 610 532 606 530 602 curveto
+closepath
+%end path
+fill
+%new path
+ 558 604 moveto
+ 562 610 566 614 570 618 curveto
+ 580 626 590 634 600 638 curveto
+ 620 648 642 650 662 650 curveto
+ 662 672 lineto
+ 660 670 lineto
+ 584 670 lineto
+ 570 648 558 624 544 602 curveto
+ 546 604 lineto
+ 558 604 lineto
+closepath
+%end path
+fill
+%new path
+ 290 246 moveto
+ 286 240 282 236 278 232 curveto
+ 268 224 258 216 248 212 curveto
+ 228 202 206 200 186 200 curveto
+ 186 180 lineto
+ 264 180 lineto
+ 278 202 290 226 304 248 curveto
+ 302 246 lineto
+ 290 246 lineto
+closepath
+%end path
+fill
+%new path
+ 316 246 moveto
+ 302 246 lineto
+ 288 224 276 200 262 180 curveto
+ 358 180 lineto
+ 358 202 lineto
+ 356 202 lineto
+ 344 202 330 206 320 216 curveto
+ 320 218 lineto
+ 314 222 312 228 312 236 curveto
+ 314 236 lineto
+ 314 240 316 244 318 248 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 180 670 0.5 add moveto
+ 208 668 0.5 add 238 668 0.5 add 268 668 0.5 add curveto
+ 268 670 0.5 add lineto
+ 306 670 0.5 add 342 670 0.5 add 378 672 0.5 add curveto
+ 376 670 0.5 add lineto
+ 178 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.5 add moveto
+ 578 668 0.5 add 606 668 0.5 add 634 668 0.5 add curveto
+ 634 670 0.5 add lineto
+ 658 670 0.5 add 680 670 0.5 add 702 672 0.5 add curveto
+ 700 670 0.5 add lineto
+ 548 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.5 sub moveto
+ 542 180 0.5 sub lineto
+ 508 182 0.5 sub 472 182 0.5 sub 438 182 0.5 sub curveto
+ 438 180 0.5 sub lineto
+ 332 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 moveto
+ 516 492 568 578 622 664 curveto
+ 622 666 624 666 624 668 curveto
+ 628 670 632 672 636 672 curveto
+ 644 672 lineto
+ 644 670 lineto
+ 644 670 646 670 646 668 curveto
+ 648 668 648 666 648 664 curveto
+ 646 664 lineto
+ 646 662 lineto
+ 586 566 528 470 468 374 curveto
+ 468 186 lineto
+ 468 184 468 182 466 180 curveto
+ 414 180 lineto
+ 412 180 410 180 408 182 curveto
+ 406 184 406 186 406 188 curveto
+ 408 188 lineto
+ 408 376 lineto
+ 406 376 lineto
+ 348 472 288 568 230 664 curveto
+ 230 666 lineto
+ 232 666 lineto
+ 232 668 232 670 234 670 curveto
+ 234 672 236 672 236 672 curveto
+ 290 672 lineto
+ 290 670 lineto
+ 296 670 300 668 302 666 curveto
+ 304 664 304 664 306 662 curveto
+ 358 576 410 490 462 404 curveto
+closepath
+%end path
+fill
+%new path
+ 256 624 moveto
+ 292 624 lineto
+ 284 640 274 656 266 672 curveto
+ 266 670 lineto
+ 178 670 lineto
+ 178 648 lineto
+ 180 648 lineto
+ 196 648 220 648 234 644 curveto
+ 238 642 244 638 248 634 curveto
+ 250 630 254 626 256 622 curveto
+closepath
+%end path
+fill
+%new path
+ 328 624 moveto
+ 326 626 326 630 326 632 curveto
+ 328 632 lineto
+ 328 636 328 640 330 642 curveto
+ 332 642 332 642 334 644 curveto
+ 346 650 362 650 378 650 curveto
+ 378 672 lineto
+ 376 670 lineto
+ 268 670 lineto
+ 276 654 286 638 294 622 curveto
+ 294 624 lineto
+ 330 624 lineto
+closepath
+%end path
+fill
+%new path
+ 584 604 moveto
+ 598 604 lineto
+ 610 626 622 650 634 672 curveto
+ 632 670 lineto
+ 548 670 lineto
+ 548 648 lineto
+ 550 648 lineto
+ 562 648 574 646 582 638 curveto
+ 584 636 584 636 586 634 curveto
+ 588 630 590 626 590 620 curveto
+ 588 620 lineto
+ 588 614 586 608 582 602 curveto
+closepath
+%end path
+fill
+%new path
+ 610 604 moveto
+ 614 610 620 616 624 622 curveto
+ 632 628 638 634 648 638 curveto
+ 664 646 682 650 702 650 curveto
+ 702 672 lineto
+ 700 670 lineto
+ 632 670 lineto
+ 620 648 608 624 596 602 curveto
+ 598 604 lineto
+ 610 604 lineto
+closepath
+%end path
+fill
+%new path
+ 406 226 moveto
+ 406 220 404 212 400 208 curveto
+ 398 206 396 206 394 204 curveto
+ 382 200 352 200 332 200 curveto
+ 332 180 lineto
+ 440 180 lineto
+ 440 228 lineto
+ 438 226 lineto
+ 406 226 lineto
+closepath
+%end path
+fill
+%new path
+ 468 226 moveto
+ 438 226 lineto
+ 438 180 lineto
+ 544 180 lineto
+ 544 202 lineto
+ 542 202 lineto
+ 522 202 492 202 480 206 curveto
+ 478 208 476 208 474 210 curveto
+ 470 214 468 222 468 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Z
+(
+newpath
+%new path
+ 512 670 moveto
+ 514 666 514 662 514 660 curveto
+ 512 660 lineto
+ 512 660 220 198 220 198 curveto
+ 218 196 218 196 218 194 curveto
+ 218 186 lineto
+ 220 186 lineto
+ 220 184 220 182 222 180 curveto
+ 286 180 lineto
+ 284 184 284 188 284 192 curveto
+ 286 192 lineto
+ 286 192 578 654 580 654 curveto
+ 580 664 lineto
+ 578 664 lineto
+ 578 666 578 668 576 670 curveto
+ 574 672 572 672 570 672 curveto
+ 570 670 lineto
+ 510 670 lineto
+closepath
+%end path
+fill
+%new path
+ 248 510 moveto
+ 250 548 256 590 284 616 curveto
+ 284 618 286 618 286 618 curveto
+ 316 646 360 650 400 650 curveto
+ 546 650 lineto
+ 546 672 lineto
+ 544 670 lineto
+ 236 670 lineto
+ 234 616 230 562 228 508 curveto
+ 230 510 lineto
+ 248 510 lineto
+closepath
+%end path
+fill
+%new path
+ 564 370 moveto
+ 562 322 558 268 526 236 curveto
+ 494 206 446 202 402 202 curveto
+ 252 202 lineto
+ 252 180 lineto
+ 572 180 lineto
+ 576 244 580 308 584 372 curveto
+ 582 370 lineto
+ 564 370 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /The_letter_A put
+Encoding 66 /The_letter_B put
+Encoding 67 /The_letter_C put
+Encoding 68 /The_letter_D put
+Encoding 69 /The_letter_E put
+Encoding 70 /The_letter_F put
+Encoding 71 /The_letter_G put
+Encoding 72 /The_letter_H put
+Encoding 73 /The_letter_I put
+Encoding 74 /The_letter_J put
+Encoding 75 /The_letter_K put
+Encoding 76 /The_letter_L put
+Encoding 77 /The_letter_M put
+Encoding 78 /The_letter_N put
+Encoding 79 /The_letter_O put
+Encoding 80 /The_letter_P put
+Encoding 81 /The_letter_Q put
+Encoding 82 /The_letter_R put
+Encoding 83 /The_letter_S put
+Encoding 84 /The_letter_T put
+Encoding 85 /The_letter_U put
+Encoding 86 /The_letter_V put
+Encoding 87 /The_letter_W put
+Encoding 88 /The_letter_X put
+Encoding 89 /The_letter_Y put
+Encoding 90 /The_letter_Z put
+
+Metrics
+ begin
+/The_letter_A 509 fudge add def
+/The_letter_B 463 fudge add def
+/The_letter_C 483 fudge add def
+/The_letter_D 503 fudge add def
+/The_letter_E 463 fudge add def
+/The_letter_F 433 fudge add def
+/The_letter_G 535 fudge add def
+/The_letter_H 509 fudge add def
+/The_letter_I 233 fudge add def
+/The_letter_J 339 fudge add def
+/The_letter_K 523 fudge add def
+/The_letter_L 413 fudge add def
+/The_letter_M 625 fudge add def
+/The_letter_N 509 fudge add def
+/The_letter_O 523 fudge add def
+/The_letter_P 443 fudge add def
+/The_letter_Q 527 fudge add def
+/The_letter_R 521 fudge add def
+/The_letter_S 363 fudge add def
+/The_letter_T 497 fudge add def
+/The_letter_U 509 fudge add def
+/The_letter_V 519 fudge add def
+/The_letter_W 719 fudge add def
+/The_letter_X 517 fudge add def
+/The_letter_Y 525 fudge add def
+/The_letter_Z 407 fudge add def
+/.notdef 450 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.5 1.5 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 896 696] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 7 scalefont setfont
+ 100 710 moveto (THIS IS CMR SEVEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 10 scalefont setfont
+ 100 698 moveto (THIS IS CMR TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 12 scalefont setfont
+ 100 686 moveto (THIS IS CMR TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps b/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps
new file mode 100644
index 0000000000..de9f6624d3
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps
@@ -0,0 +1,6993 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 80 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_A
+(
+newpath
+%new path
+ 370 568 moveto
+ 370 542 422 322 450 198 curveto
+ 450 194 454 188 456 186 curveto
+ 462 180 468 180 476 180 curveto
+ 486 180 lineto
+ 490 180 494 182 496 184 curveto
+ 500 188 502 192 502 196 curveto
+ 500 196 lineto
+ 500 200 lineto
+ 468 336 436 474 404 610 curveto
+ 404 614 400 620 398 622 curveto
+ 392 628 386 630 380 630 curveto
+ 380 628 lineto
+ 354 628 lineto
+ 348 628 342 626 336 620 curveto
+ 334 618 330 612 330 608 curveto
+ 298 472 266 334 234 198 curveto
+ 234 194 lineto
+ 236 194 lineto
+ 236 190 238 186 242 182 curveto
+ 244 180 248 180 252 180 curveto
+ 262 180 lineto
+ 270 180 276 182 282 188 curveto
+ 284 190 288 196 288 200 curveto
+ 316 324 368 544 368 570 curveto
+ 370 570 lineto
+closepath
+%end path
+fill
+%new path
+ 286 298 moveto
+ 450 298 lineto
+ 448 314 444 328 440 342 curveto
+ 440 340 lineto
+ 294 340 lineto
+ 290 326 286 312 284 296 curveto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 270 180 lineto
+ 274 182 lineto
+ 278 186 lineto
+ 280 190 lineto
+ 282 196 lineto
+ 282 198 284 200 284 202 curveto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 258 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 206 lineto
+ 242 204 240 202 240 200 curveto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 186 lineto
+ 250 182 lineto
+ 252 180 lineto
+ 322 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 322 222 lineto
+ 316 224 lineto
+ 310 224 lineto
+ 310 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+%new path
+ 406 216 moveto
+ 404 212 lineto
+ 402 206 lineto
+ 402 196 lineto
+ 404 190 lineto
+ 406 186 lineto
+ 410 182 lineto
+ 414 180 lineto
+ 484 180 lineto
+ 486 182 lineto
+ 490 186 lineto
+ 492 190 lineto
+ 494 196 lineto
+ 494 202 lineto
+ 494 204 492 206 492 208 curveto
+ 494 206 lineto
+ 492 212 lineto
+ 490 216 lineto
+ 486 220 lineto
+ 482 222 lineto
+ 476 224 lineto
+ 470 224 lineto
+ 470 222 lineto
+ 418 222 lineto
+ 420 224 lineto
+ 414 222 lineto
+ 410 220 lineto
+ 406 216 lineto
+closepath
+%end path
+fill
+%new path
+ 458 216 moveto
+ 456 212 lineto
+ 454 206 lineto
+ 454 200 lineto
+ 454 198 456 196 456 194 curveto
+ 454 196 lineto
+ 456 190 lineto
+ 458 186 lineto
+ 462 182 lineto
+ 466 180 lineto
+ 526 180 lineto
+ 530 182 lineto
+ 534 186 lineto
+ 536 190 lineto
+ 538 196 lineto
+ 538 206 lineto
+ 536 212 lineto
+ 534 216 lineto
+ 530 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 514 222 lineto
+ 470 222 lineto
+ 470 224 lineto
+ 464 222 lineto
+ 462 220 lineto
+ 458 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_B
+(
+newpath
+%new path
+ 250 612 moveto
+ 248 608 lineto
+ 246 602 lineto
+ 244 602 lineto
+ 244 202 lineto
+ 246 202 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 188 lineto
+ 254 184 lineto
+ 256 182 lineto
+ 262 180 lineto
+ 278 180 lineto
+ 284 182 lineto
+ 288 184 lineto
+ 292 188 lineto
+ 294 190 lineto
+ 296 196 lineto
+ 296 602 lineto
+ 294 608 lineto
+ 292 612 lineto
+ 288 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 272 618 lineto
+ 262 618 lineto
+ 262 620 lineto
+ 256 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+closepath
+%end path
+fill
+%new path
+ 272 576 moveto
+ 392 576 lineto
+ 392 574 lineto
+ 410 574 428 566 442 554 curveto
+ 454 540 462 524 462 506 curveto
+ 460 506 lineto
+ 460 486 452 468 438 454 curveto
+ 438 454 436 452 436 452 curveto
+ 418 436 396 428 374 428 curveto
+ 270 428 lineto
+ 270 402 lineto
+ 272 404 lineto
+ 392 404 lineto
+ 422 404 454 414 476 434 curveto
+ 478 436 480 438 482 440 curveto
+ 500 458 512 482 512 508 curveto
+ 510 508 lineto
+ 510 536 498 564 478 584 curveto
+ 476 586 476 586 474 588 curveto
+ 452 608 422 620 390 620 curveto
+ 390 618 lineto
+ 270 618 lineto
+ 270 574 lineto
+closepath
+%end path
+fill
+%new path
+ 272 386 moveto
+ 400 386 lineto
+ 400 384 lineto
+ 420 384 438 376 452 362 curveto
+ 454 362 454 360 454 360 curveto
+ 470 344 478 322 478 300 curveto
+ 476 300 lineto
+ 476 280 468 262 454 248 curveto
+ 452 246 452 246 450 244 curveto
+ 434 230 412 222 390 222 curveto
+ 270 222 lineto
+ 270 180 lineto
+ 406 180 lineto
+ 440 180 470 192 492 216 curveto
+ 516 238 528 270 528 302 curveto
+ 526 302 lineto
+ 526 330 514 358 494 378 curveto
+ 492 380 492 380 490 382 curveto
+ 468 402 436 414 404 414 curveto
+ 404 412 lineto
+ 270 412 lineto
+ 270 384 lineto
+closepath
+%end path
+fill
+%new path
+ 286 584 moveto
+ 288 586 lineto
+ 290 592 lineto
+ 292 594 lineto
+ 292 598 lineto
+ 290 596 lineto
+ 290 602 lineto
+ 288 608 lineto
+ 286 612 lineto
+ 282 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 266 618 lineto
+ 212 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 204 616 lineto
+ 200 612 lineto
+ 198 608 lineto
+ 196 602 lineto
+ 196 592 lineto
+ 198 586 lineto
+ 200 584 lineto
+ 204 580 lineto
+ 208 578 lineto
+ 214 576 lineto
+ 274 576 lineto
+ 280 578 lineto
+ 282 580 lineto
+ 286 584 lineto
+closepath
+%end path
+fill
+%new path
+ 316 584 moveto
+ 318 586 lineto
+ 320 592 lineto
+ 320 602 lineto
+ 318 608 lineto
+ 316 612 lineto
+ 312 616 lineto
+ 308 618 lineto
+ 302 620 lineto
+ 296 620 lineto
+ 296 618 lineto
+ 266 618 lineto
+ 268 620 lineto
+ 262 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+ 252 608 lineto
+ 250 602 lineto
+ 250 592 lineto
+ 252 586 lineto
+ 254 584 lineto
+ 258 580 lineto
+ 262 578 lineto
+ 268 576 lineto
+ 302 576 lineto
+ 308 578 lineto
+ 312 580 lineto
+ 316 584 lineto
+closepath
+%end path
+fill
+%new path
+ 200 216 moveto
+ 198 212 lineto
+ 196 206 lineto
+ 196 196 lineto
+ 198 190 lineto
+ 200 186 lineto
+ 204 182 lineto
+ 208 180 lineto
+ 280 180 lineto
+ 282 182 lineto
+ 286 186 lineto
+ 288 190 lineto
+ 290 196 lineto
+ 292 196 lineto
+ 292 202 lineto
+ 290 200 lineto
+ 290 206 lineto
+ 288 212 lineto
+ 286 216 lineto
+ 282 220 lineto
+ 280 222 lineto
+ 274 224 lineto
+ 268 224 lineto
+ 266 222 lineto
+ 212 222 lineto
+ 214 224 lineto
+ 208 222 lineto
+ 204 220 lineto
+ 200 216 lineto
+closepath
+%end path
+fill
+%new path
+ 254 216 moveto
+ 252 212 lineto
+ 250 206 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 186 lineto
+ 258 182 lineto
+ 262 180 lineto
+ 308 180 lineto
+ 312 182 lineto
+ 316 186 lineto
+ 318 190 lineto
+ 320 196 lineto
+ 320 206 lineto
+ 318 212 lineto
+ 316 216 lineto
+ 312 220 lineto
+ 308 222 lineto
+ 302 224 lineto
+ 296 224 lineto
+ 296 222 lineto
+ 266 222 lineto
+ 268 224 lineto
+ 262 222 lineto
+ 258 220 lineto
+ 254 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_C
+(
+newpath
+%new path
+ 494 468 moveto
+ 510 468 lineto
+ 516 470 lineto
+ 520 472 lineto
+ 524 476 lineto
+ 526 478 lineto
+ 528 484 lineto
+ 528 490 lineto
+ 526 492 lineto
+ 524 502 522 512 520 522 curveto
+ 520 520 lineto
+ 518 526 lineto
+ 518 528 lineto
+ 514 540 508 550 502 560 curveto
+ 500 562 lineto
+ 500 564 lineto
+ 494 570 488 578 482 584 curveto
+ 484 582 lineto
+ 480 586 lineto
+ 478 588 lineto
+ 472 594 466 600 460 604 curveto
+ 460 602 lineto
+ 458 604 lineto
+ 456 606 lineto
+ 448 612 438 616 428 620 curveto
+ 428 618 lineto
+ 422 620 lineto
+ 422 622 lineto
+ 410 626 396 628 384 628 curveto
+ 378 628 lineto
+ 378 626 lineto
+ 364 626 352 624 342 620 curveto
+ 342 622 lineto
+ 336 620 lineto
+ 336 618 lineto
+ 324 614 314 610 304 602 curveto
+ 306 604 lineto
+ 302 602 lineto
+ 302 600 lineto
+ 294 596 286 588 278 582 curveto
+ 280 582 lineto
+ 276 578 lineto
+ 274 578 lineto
+ 268 572 262 564 256 558 curveto
+ 254 554 254 552 252 550 curveto
+ 250 548 lineto
+ 250 546 lineto
+ 238 530 230 512 224 494 curveto
+ 222 488 lineto
+ 212 460 208 430 208 402 curveto
+ 210 402 lineto
+ 210 396 lineto
+ 210 366 214 336 224 308 curveto
+ 222 310 lineto
+ 224 304 lineto
+ 226 302 lineto
+ 232 284 240 266 252 250 curveto
+ 250 250 lineto
+ 252 248 lineto
+ 254 246 lineto
+ 256 244 256 242 258 238 curveto
+ 264 232 270 224 276 218 curveto
+ 276 220 lineto
+ 280 216 lineto
+ 280 214 lineto
+ 288 208 296 200 304 196 curveto
+ 302 196 lineto
+ 306 194 lineto
+ 316 186 326 182 338 180 curveto
+ 336 180 lineto
+ 342 178 lineto
+ 344 178 lineto
+ 354 174 366 172 380 172 curveto
+ 384 172 lineto
+ 386 174 lineto
+ 400 174 416 176 428 180 curveto
+ 434 180 lineto
+ 446 184 456 190 466 196 curveto
+ 468 198 lineto
+ 470 198 lineto
+ 476 202 482 208 488 214 curveto
+ 486 212 lineto
+ 490 216 lineto
+ 492 218 lineto
+ 498 222 502 228 506 234 curveto
+ 508 236 lineto
+ 508 238 lineto
+ 514 246 518 254 520 264 curveto
+ 520 262 lineto
+ 522 268 lineto
+ 522 270 lineto
+ 526 280 528 292 528 304 curveto
+ 528 308 lineto
+ 526 314 lineto
+ 524 318 lineto
+ 520 322 lineto
+ 516 324 lineto
+ 510 326 lineto
+ 504 326 lineto
+ 504 324 lineto
+ 492 324 lineto
+ 494 326 lineto
+ 488 324 lineto
+ 484 322 lineto
+ 480 318 lineto
+ 478 314 lineto
+ 476 308 lineto
+ 476 294 474 284 470 272 curveto
+ 472 274 lineto
+ 474 280 lineto
+ 472 278 lineto
+ 470 270 466 260 460 252 curveto
+ 460 254 lineto
+ 462 256 lineto
+ 458 250 454 244 448 238 curveto
+ 448 240 lineto
+ 446 236 lineto
+ 444 230 lineto
+ 444 224 lineto
+ 448 240 lineto
+ 468 248 lineto
+ 462 248 lineto
+ 456 246 lineto
+ 452 244 lineto
+ 452 242 lineto
+ 446 238 442 232 434 228 curveto
+ 436 230 lineto
+ 438 232 lineto
+ 438 230 lineto
+ 430 226 420 220 412 218 curveto
+ 418 220 lineto
+ 406 216 394 214 382 214 curveto
+ 382 216 lineto
+ 376 214 lineto
+ 374 212 lineto
+ 370 208 lineto
+ 388 216 lineto
+ 402 208 lineto
+ 398 212 lineto
+ 394 214 lineto
+ 388 216 lineto
+ 376 216 364 218 354 222 curveto
+ 354 220 lineto
+ 360 218 lineto
+ 360 220 lineto
+ 350 224 340 228 330 234 curveto
+ 332 234 lineto
+ 334 232 lineto
+ 326 238 318 244 310 250 curveto
+ 312 250 lineto
+ 308 252 lineto
+ 302 254 lineto
+ 316 246 lineto
+ 320 236 lineto
+ 318 242 lineto
+ 316 246 lineto
+ 314 246 lineto
+ 308 254 302 260 296 268 curveto
+ 296 270 294 272 292 274 curveto
+ 294 272 lineto
+ 296 270 lineto
+ 294 270 lineto
+ 284 288 276 304 270 324 curveto
+ 270 322 lineto
+ 272 316 lineto
+ 272 318 lineto
+ 262 344 258 374 258 404 curveto
+ 260 402 lineto
+ 258 408 lineto
+ 256 412 lineto
+ 260 402 lineto
+ 256 388 lineto
+ 258 390 lineto
+ 260 396 lineto
+ 260 398 lineto
+ 260 426 264 456 274 482 curveto
+ 272 482 lineto
+ 270 476 lineto
+ 272 476 lineto
+ 278 496 286 514 296 530 curveto
+ 296 528 lineto
+ 294 526 lineto
+ 296 528 298 530 298 532 curveto
+ 304 540 310 546 316 554 curveto
+ 316 552 lineto
+ 318 556 lineto
+ 320 562 lineto
+ 320 568 lineto
+ 316 552 lineto
+ 296 544 lineto
+ 302 544 lineto
+ 308 546 lineto
+ 312 548 lineto
+ 312 550 lineto
+ 320 556 328 562 336 568 curveto
+ 334 566 lineto
+ 332 564 lineto
+ 332 566 lineto
+ 342 572 352 578 362 580 curveto
+ 360 580 lineto
+ 354 578 lineto
+ 356 578 lineto
+ 366 582 378 584 390 584 curveto
+ 388 584 lineto
+ 394 586 lineto
+ 398 588 lineto
+ 402 592 lineto
+ 382 584 lineto
+ 370 592 lineto
+ 374 588 lineto
+ 376 586 lineto
+ 382 584 lineto
+ 384 582 lineto
+ 394 582 404 580 414 576 curveto
+ 414 578 lineto
+ 408 580 lineto
+ 408 578 lineto
+ 418 576 426 572 432 566 curveto
+ 432 568 lineto
+ 428 570 lineto
+ 430 568 lineto
+ 436 564 442 560 448 554 curveto
+ 446 556 lineto
+ 450 554 lineto
+ 456 552 lineto
+ 442 560 lineto
+ 438 568 lineto
+ 440 562 lineto
+ 442 560 lineto
+ 444 558 lineto
+ 448 554 454 546 458 540 curveto
+ 456 544 lineto
+ 456 542 lineto
+ 464 532 470 522 474 510 curveto
+ 472 510 lineto
+ 470 516 lineto
+ 472 516 lineto
+ 474 504 476 494 478 484 curveto
+ 476 484 lineto
+ 478 478 lineto
+ 480 476 lineto
+ 484 472 lineto
+ 488 470 lineto
+ 494 468 lineto
+closepath
+%end path
+fill
+%new path
+ 524 476 moveto
+ 526 478 lineto
+ 528 484 lineto
+ 528 610 lineto
+ 526 616 lineto
+ 524 620 lineto
+ 520 624 lineto
+ 516 626 lineto
+ 510 628 lineto
+ 504 628 lineto
+ 504 626 lineto
+ 500 626 lineto
+ 500 628 lineto
+ 494 626 lineto
+ 492 624 lineto
+ 488 620 lineto
+ 486 616 lineto
+ 484 616 lineto
+ 476 596 468 578 460 560 curveto
+ 460 562 lineto
+ 458 556 lineto
+ 458 550 lineto
+ 460 544 lineto
+ 462 540 lineto
+ 464 540 lineto
+ 464 538 lineto
+ 462 542 lineto
+ 462 540 lineto
+ 470 530 474 520 478 508 curveto
+ 476 514 lineto
+ 480 504 482 494 482 484 curveto
+ 484 478 lineto
+ 486 476 lineto
+ 490 472 lineto
+ 492 470 lineto
+ 498 468 lineto
+ 510 468 lineto
+ 516 470 lineto
+ 520 472 lineto
+ 524 476 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_D
+(
+newpath
+%new path
+ 242 612 moveto
+ 240 608 lineto
+ 238 602 lineto
+ 236 602 lineto
+ 236 202 lineto
+ 238 202 lineto
+ 238 196 lineto
+ 240 190 lineto
+ 242 188 lineto
+ 246 184 lineto
+ 248 182 lineto
+ 254 180 lineto
+ 270 180 lineto
+ 276 182 lineto
+ 280 184 lineto
+ 284 188 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 254 618 lineto
+ 254 620 lineto
+ 248 618 lineto
+ 246 616 lineto
+ 242 612 lineto
+closepath
+%end path
+fill
+%new path
+ 264 576 moveto
+ 364 576 lineto
+ 364 574 lineto
+ 388 574 410 562 426 544 curveto
+ 434 538 440 530 446 522 curveto
+ 470 484 480 438 480 394 curveto
+ 478 394 lineto
+ 478 350 468 308 444 272 curveto
+ 438 264 434 258 426 252 curveto
+ 410 234 386 222 362 222 curveto
+ 262 222 lineto
+ 262 180 lineto
+ 376 180 lineto
+ 410 180 442 196 466 220 curveto
+ 472 228 480 236 484 244 curveto
+ 516 288 530 342 530 396 curveto
+ 528 396 lineto
+ 528 452 514 508 482 554 curveto
+ 476 564 470 572 462 580 curveto
+ 438 604 408 620 374 620 curveto
+ 374 618 lineto
+ 262 618 lineto
+ 262 574 lineto
+closepath
+%end path
+fill
+%new path
+ 278 584 moveto
+ 280 586 lineto
+ 282 592 lineto
+ 284 594 lineto
+ 284 598 lineto
+ 282 596 lineto
+ 282 602 lineto
+ 280 608 lineto
+ 278 612 lineto
+ 274 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 258 618 lineto
+ 208 618 lineto
+ 208 620 lineto
+ 202 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 190 602 lineto
+ 190 598 lineto
+ 192 598 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 202 578 lineto
+ 208 576 lineto
+ 266 576 lineto
+ 272 578 lineto
+ 274 580 lineto
+ 278 584 lineto
+closepath
+%end path
+fill
+%new path
+ 306 584 moveto
+ 308 586 lineto
+ 310 592 lineto
+ 310 602 lineto
+ 308 608 lineto
+ 306 612 lineto
+ 302 616 lineto
+ 298 618 lineto
+ 292 620 lineto
+ 286 620 lineto
+ 286 618 lineto
+ 258 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+ 244 608 lineto
+ 242 602 lineto
+ 242 592 lineto
+ 244 586 lineto
+ 246 584 lineto
+ 250 580 lineto
+ 254 578 lineto
+ 260 576 lineto
+ 292 576 lineto
+ 298 578 lineto
+ 302 580 lineto
+ 306 584 lineto
+closepath
+%end path
+fill
+%new path
+ 196 216 moveto
+ 194 212 lineto
+ 192 206 lineto
+ 190 206 lineto
+ 190 200 lineto
+ 192 202 lineto
+ 192 196 lineto
+ 194 190 lineto
+ 196 186 lineto
+ 200 182 lineto
+ 202 180 lineto
+ 272 180 lineto
+ 274 182 lineto
+ 278 186 lineto
+ 280 190 lineto
+ 282 196 lineto
+ 284 196 lineto
+ 284 202 lineto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 258 222 lineto
+ 208 222 lineto
+ 208 224 lineto
+ 202 222 lineto
+ 200 220 lineto
+ 196 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 206 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 186 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 298 180 lineto
+ 302 182 lineto
+ 306 186 lineto
+ 308 190 lineto
+ 310 196 lineto
+ 310 206 lineto
+ 308 212 lineto
+ 306 216 lineto
+ 302 220 lineto
+ 298 222 lineto
+ 292 224 lineto
+ 286 224 lineto
+ 286 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_E
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 202 lineto
+ 250 202 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 188 lineto
+ 258 184 lineto
+ 260 182 lineto
+ 266 180 lineto
+ 282 180 lineto
+ 288 182 lineto
+ 292 184 lineto
+ 296 188 lineto
+ 298 190 lineto
+ 300 196 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 492 506 moveto
+ 498 506 lineto
+ 498 508 lineto
+ 510 508 lineto
+ 508 506 lineto
+ 514 508 lineto
+ 518 510 lineto
+ 522 514 lineto
+ 524 518 lineto
+ 526 524 lineto
+ 526 602 lineto
+ 524 608 lineto
+ 522 612 lineto
+ 518 616 lineto
+ 514 618 lineto
+ 508 620 lineto
+ 502 620 lineto
+ 502 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 582 lineto
+ 262 578 lineto
+ 266 576 lineto
+ 272 574 lineto
+ 278 574 lineto
+ 278 576 lineto
+ 498 576 lineto
+ 498 574 lineto
+ 504 576 lineto
+ 506 578 lineto
+ 510 582 lineto
+ 492 574 lineto
+ 478 582 lineto
+ 482 578 lineto
+ 486 576 lineto
+ 492 574 lineto
+ 478 582 lineto
+ 474 592 lineto
+ 476 586 lineto
+ 478 582 lineto
+ 474 592 lineto
+ 478 606 lineto
+ 476 604 lineto
+ 474 598 lineto
+ 474 524 lineto
+ 476 518 lineto
+ 478 514 lineto
+ 482 510 lineto
+ 486 508 lineto
+ 492 506 lineto
+closepath
+%end path
+fill
+%new path
+ 396 462 moveto
+ 394 458 lineto
+ 392 452 lineto
+ 392 406 lineto
+ 396 422 lineto
+ 416 430 lineto
+ 410 430 lineto
+ 408 428 lineto
+ 270 428 lineto
+ 272 430 lineto
+ 266 428 lineto
+ 262 426 lineto
+ 258 422 lineto
+ 256 418 lineto
+ 254 412 lineto
+ 254 402 lineto
+ 256 396 lineto
+ 258 392 lineto
+ 262 388 lineto
+ 266 386 lineto
+ 272 384 lineto
+ 278 384 lineto
+ 278 386 lineto
+ 428 386 lineto
+ 426 384 lineto
+ 432 386 lineto
+ 436 388 lineto
+ 440 392 lineto
+ 442 396 lineto
+ 444 402 lineto
+ 444 452 lineto
+ 442 458 lineto
+ 440 462 lineto
+ 436 466 lineto
+ 432 468 lineto
+ 426 470 lineto
+ 420 470 lineto
+ 420 468 lineto
+ 408 468 lineto
+ 410 470 lineto
+ 404 468 lineto
+ 400 466 lineto
+ 396 462 lineto
+closepath
+%end path
+fill
+%new path
+ 410 344 moveto
+ 416 344 lineto
+ 416 346 lineto
+ 428 346 lineto
+ 426 344 lineto
+ 432 346 lineto
+ 436 348 lineto
+ 440 352 lineto
+ 442 356 lineto
+ 444 362 lineto
+ 444 412 lineto
+ 442 418 lineto
+ 440 422 lineto
+ 436 426 lineto
+ 432 428 lineto
+ 426 430 lineto
+ 420 430 lineto
+ 420 428 lineto
+ 270 428 lineto
+ 272 430 lineto
+ 266 428 lineto
+ 262 426 lineto
+ 258 422 lineto
+ 256 418 lineto
+ 254 412 lineto
+ 254 402 lineto
+ 256 396 lineto
+ 258 392 lineto
+ 262 388 lineto
+ 266 386 lineto
+ 272 384 lineto
+ 278 384 lineto
+ 278 386 lineto
+ 416 386 lineto
+ 416 384 lineto
+ 422 386 lineto
+ 424 388 lineto
+ 428 392 lineto
+ 410 384 lineto
+ 396 392 lineto
+ 400 388 lineto
+ 404 386 lineto
+ 410 384 lineto
+ 396 392 lineto
+ 392 402 lineto
+ 394 396 lineto
+ 396 392 lineto
+ 392 402 lineto
+ 396 416 lineto
+ 394 414 lineto
+ 392 408 lineto
+ 392 362 lineto
+ 394 356 lineto
+ 396 352 lineto
+ 400 348 lineto
+ 404 346 lineto
+ 410 344 lineto
+closepath
+%end path
+fill
+%new path
+ 494 296 moveto
+ 492 292 lineto
+ 490 286 lineto
+ 490 200 lineto
+ 494 216 lineto
+ 514 224 lineto
+ 508 224 lineto
+ 506 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 188 lineto
+ 262 184 lineto
+ 266 182 lineto
+ 272 180 lineto
+ 524 180 lineto
+ 530 182 lineto
+ 534 184 lineto
+ 538 188 lineto
+ 540 190 lineto
+ 542 196 lineto
+ 542 286 lineto
+ 540 292 lineto
+ 538 296 lineto
+ 534 300 lineto
+ 530 302 lineto
+ 524 304 lineto
+ 518 304 lineto
+ 518 302 lineto
+ 506 302 lineto
+ 508 304 lineto
+ 502 302 lineto
+ 498 300 lineto
+ 494 296 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 284 180 lineto
+ 286 182 lineto
+ 290 186 lineto
+ 292 190 lineto
+ 294 196 lineto
+ 296 196 lineto
+ 296 202 lineto
+ 294 200 lineto
+ 294 206 lineto
+ 292 212 lineto
+ 290 216 lineto
+ 286 220 lineto
+ 284 222 lineto
+ 278 224 lineto
+ 272 224 lineto
+ 270 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 258 216 moveto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 186 lineto
+ 262 182 lineto
+ 266 180 lineto
+ 314 180 lineto
+ 316 182 lineto
+ 320 186 lineto
+ 322 190 lineto
+ 324 196 lineto
+ 326 196 lineto
+ 326 202 lineto
+ 324 200 lineto
+ 324 206 lineto
+ 322 212 lineto
+ 320 216 lineto
+ 316 220 lineto
+ 314 222 lineto
+ 308 224 lineto
+ 302 224 lineto
+ 300 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_F
+(
+newpath
+%new path
+ 258 612 moveto
+ 256 608 lineto
+ 254 602 lineto
+ 252 602 lineto
+ 252 202 lineto
+ 254 202 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 188 lineto
+ 262 184 lineto
+ 264 182 lineto
+ 270 180 lineto
+ 286 180 lineto
+ 292 182 lineto
+ 296 184 lineto
+ 300 188 lineto
+ 302 190 lineto
+ 304 196 lineto
+ 304 602 lineto
+ 302 608 lineto
+ 300 612 lineto
+ 296 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 280 618 lineto
+ 270 618 lineto
+ 270 620 lineto
+ 264 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+closepath
+%end path
+fill
+%new path
+ 500 506 moveto
+ 506 506 lineto
+ 506 508 lineto
+ 518 508 lineto
+ 516 506 lineto
+ 522 508 lineto
+ 526 510 lineto
+ 530 514 lineto
+ 532 518 lineto
+ 534 524 lineto
+ 534 602 lineto
+ 532 608 lineto
+ 530 612 lineto
+ 526 616 lineto
+ 522 618 lineto
+ 516 620 lineto
+ 510 620 lineto
+ 510 618 lineto
+ 274 618 lineto
+ 276 620 lineto
+ 270 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+ 260 608 lineto
+ 258 602 lineto
+ 258 592 lineto
+ 260 586 lineto
+ 262 582 lineto
+ 266 578 lineto
+ 270 576 lineto
+ 276 574 lineto
+ 282 574 lineto
+ 282 576 lineto
+ 506 576 lineto
+ 506 574 lineto
+ 512 576 lineto
+ 514 578 lineto
+ 518 582 lineto
+ 500 574 lineto
+ 486 582 lineto
+ 490 578 lineto
+ 494 576 lineto
+ 500 574 lineto
+ 486 582 lineto
+ 482 592 lineto
+ 484 586 lineto
+ 486 582 lineto
+ 482 592 lineto
+ 486 606 lineto
+ 484 604 lineto
+ 482 598 lineto
+ 482 524 lineto
+ 484 518 lineto
+ 486 514 lineto
+ 490 510 lineto
+ 494 508 lineto
+ 500 506 lineto
+closepath
+%end path
+fill
+%new path
+ 404 454 moveto
+ 402 450 lineto
+ 400 444 lineto
+ 400 398 lineto
+ 404 414 lineto
+ 424 422 lineto
+ 418 422 lineto
+ 416 420 lineto
+ 274 420 lineto
+ 276 422 lineto
+ 270 420 lineto
+ 266 418 lineto
+ 262 414 lineto
+ 260 410 lineto
+ 258 404 lineto
+ 258 394 lineto
+ 260 388 lineto
+ 262 384 lineto
+ 266 380 lineto
+ 270 378 lineto
+ 276 376 lineto
+ 282 376 lineto
+ 282 378 lineto
+ 436 378 lineto
+ 434 376 lineto
+ 440 378 lineto
+ 444 380 lineto
+ 448 384 lineto
+ 450 388 lineto
+ 452 394 lineto
+ 452 444 lineto
+ 450 450 lineto
+ 448 454 lineto
+ 444 458 lineto
+ 440 460 lineto
+ 434 462 lineto
+ 428 462 lineto
+ 428 460 lineto
+ 416 460 lineto
+ 418 462 lineto
+ 412 460 lineto
+ 408 458 lineto
+ 404 454 lineto
+closepath
+%end path
+fill
+%new path
+ 418 336 moveto
+ 424 336 lineto
+ 424 338 lineto
+ 436 338 lineto
+ 434 336 lineto
+ 440 338 lineto
+ 444 340 lineto
+ 448 344 lineto
+ 450 348 lineto
+ 452 354 lineto
+ 452 404 lineto
+ 450 410 lineto
+ 448 414 lineto
+ 444 418 lineto
+ 440 420 lineto
+ 434 422 lineto
+ 428 422 lineto
+ 428 420 lineto
+ 274 420 lineto
+ 276 422 lineto
+ 270 420 lineto
+ 266 418 lineto
+ 262 414 lineto
+ 260 410 lineto
+ 258 404 lineto
+ 258 394 lineto
+ 260 388 lineto
+ 262 384 lineto
+ 266 380 lineto
+ 270 378 lineto
+ 276 376 lineto
+ 282 376 lineto
+ 282 378 lineto
+ 424 378 lineto
+ 424 376 lineto
+ 430 378 lineto
+ 432 380 lineto
+ 436 384 lineto
+ 418 376 lineto
+ 404 384 lineto
+ 408 380 lineto
+ 412 378 lineto
+ 418 376 lineto
+ 404 384 lineto
+ 400 394 lineto
+ 402 388 lineto
+ 404 384 lineto
+ 400 394 lineto
+ 404 408 lineto
+ 402 406 lineto
+ 400 400 lineto
+ 400 354 lineto
+ 402 348 lineto
+ 404 344 lineto
+ 408 340 lineto
+ 412 338 lineto
+ 418 336 lineto
+closepath
+%end path
+fill
+%new path
+ 294 584 moveto
+ 296 586 lineto
+ 298 592 lineto
+ 300 594 lineto
+ 300 598 lineto
+ 298 596 lineto
+ 298 602 lineto
+ 296 608 lineto
+ 294 612 lineto
+ 290 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 274 618 lineto
+ 216 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 208 616 lineto
+ 204 612 lineto
+ 202 608 lineto
+ 200 602 lineto
+ 198 602 lineto
+ 198 598 lineto
+ 200 598 lineto
+ 200 592 lineto
+ 202 586 lineto
+ 204 584 lineto
+ 208 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 282 576 lineto
+ 288 578 lineto
+ 290 580 lineto
+ 294 584 lineto
+closepath
+%end path
+fill
+%new path
+ 326 584 moveto
+ 328 586 lineto
+ 330 592 lineto
+ 330 602 lineto
+ 328 608 lineto
+ 326 612 lineto
+ 322 616 lineto
+ 318 618 lineto
+ 312 620 lineto
+ 306 620 lineto
+ 306 618 lineto
+ 274 618 lineto
+ 276 620 lineto
+ 270 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+ 260 608 lineto
+ 258 602 lineto
+ 258 592 lineto
+ 260 586 lineto
+ 262 584 lineto
+ 266 580 lineto
+ 270 578 lineto
+ 276 576 lineto
+ 312 576 lineto
+ 318 578 lineto
+ 322 580 lineto
+ 326 584 lineto
+closepath
+%end path
+fill
+%new path
+ 204 216 moveto
+ 202 212 lineto
+ 200 206 lineto
+ 198 206 lineto
+ 198 200 lineto
+ 200 202 lineto
+ 200 196 lineto
+ 202 190 lineto
+ 204 186 lineto
+ 208 182 lineto
+ 210 180 lineto
+ 288 180 lineto
+ 290 182 lineto
+ 294 186 lineto
+ 296 190 lineto
+ 298 196 lineto
+ 300 196 lineto
+ 300 202 lineto
+ 298 200 lineto
+ 298 206 lineto
+ 296 212 lineto
+ 294 216 lineto
+ 290 220 lineto
+ 288 222 lineto
+ 282 224 lineto
+ 276 224 lineto
+ 274 222 lineto
+ 216 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 208 220 lineto
+ 204 216 lineto
+closepath
+%end path
+fill
+%new path
+ 262 216 moveto
+ 260 212 lineto
+ 258 206 lineto
+ 258 196 lineto
+ 260 190 lineto
+ 262 186 lineto
+ 266 182 lineto
+ 270 180 lineto
+ 358 180 lineto
+ 362 182 lineto
+ 366 186 lineto
+ 368 190 lineto
+ 370 196 lineto
+ 370 206 lineto
+ 368 212 lineto
+ 366 216 lineto
+ 362 220 lineto
+ 358 222 lineto
+ 352 224 lineto
+ 346 224 lineto
+ 346 222 lineto
+ 274 222 lineto
+ 276 224 lineto
+ 270 222 lineto
+ 266 220 lineto
+ 262 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_G
+(
+newpath
+%new path
+ 470 468 moveto
+ 486 468 lineto
+ 492 470 lineto
+ 496 472 lineto
+ 500 476 lineto
+ 502 478 lineto
+ 504 484 lineto
+ 504 490 lineto
+ 502 492 lineto
+ 500 502 498 514 494 524 curveto
+ 496 524 lineto
+ 494 530 lineto
+ 492 530 lineto
+ 488 544 484 554 476 564 curveto
+ 478 564 lineto
+ 476 566 lineto
+ 474 568 lineto
+ 470 576 464 582 458 588 curveto
+ 460 586 lineto
+ 456 590 lineto
+ 454 592 lineto
+ 448 598 442 602 436 606 curveto
+ 438 606 lineto
+ 434 608 lineto
+ 426 614 418 618 408 620 curveto
+ 410 620 lineto
+ 404 622 lineto
+ 402 622 lineto
+ 392 626 380 628 370 628 curveto
+ 364 628 lineto
+ 364 626 lineto
+ 352 626 342 624 332 620 curveto
+ 334 622 lineto
+ 328 620 lineto
+ 326 618 lineto
+ 318 616 308 612 300 606 curveto
+ 298 604 lineto
+ 296 604 lineto
+ 290 598 282 592 276 586 curveto
+ 276 588 lineto
+ 272 584 lineto
+ 272 582 lineto
+ 264 574 258 566 252 558 curveto
+ 250 556 250 556 250 556 curveto
+ 252 558 lineto
+ 250 554 lineto
+ 248 554 lineto
+ 238 536 228 518 222 498 curveto
+ 224 500 lineto
+ 222 494 lineto
+ 220 492 lineto
+ 210 464 206 432 206 402 curveto
+ 208 402 lineto
+ 208 396 lineto
+ 208 364 212 332 222 304 curveto
+ 224 298 lineto
+ 230 278 240 260 250 242 curveto
+ 250 244 lineto
+ 252 240 lineto
+ 252 240 252 240 254 238 curveto
+ 260 230 266 222 274 214 curveto
+ 272 214 lineto
+ 276 210 lineto
+ 278 210 lineto
+ 284 204 292 198 298 192 curveto
+ 298 194 lineto
+ 300 192 lineto
+ 302 190 lineto
+ 310 184 320 180 328 180 curveto
+ 334 178 lineto
+ 344 174 354 172 366 172 curveto
+ 370 172 lineto
+ 372 174 lineto
+ 382 174 392 176 402 178 curveto
+ 400 178 lineto
+ 406 180 lineto
+ 408 180 lineto
+ 416 182 422 186 430 190 curveto
+ 428 188 lineto
+ 432 190 lineto
+ 432 192 lineto
+ 438 196 444 200 448 204 curveto
+ 452 208 lineto
+ 458 214 464 222 468 228 curveto
+ 470 230 lineto
+ 470 232 lineto
+ 478 244 486 258 490 272 curveto
+ 492 278 lineto
+ 500 302 504 328 504 354 curveto
+ 504 358 lineto
+ 502 364 lineto
+ 500 368 lineto
+ 496 372 lineto
+ 492 374 lineto
+ 486 376 lineto
+ 480 376 lineto
+ 480 374 lineto
+ 468 374 lineto
+ 470 376 lineto
+ 464 374 lineto
+ 460 372 lineto
+ 456 368 lineto
+ 454 364 lineto
+ 452 358 lineto
+ 452 330 448 302 440 276 curveto
+ 440 278 lineto
+ 442 284 lineto
+ 442 282 lineto
+ 438 268 432 256 424 244 curveto
+ 424 246 lineto
+ 426 248 lineto
+ 422 242 416 236 412 230 curveto
+ 412 232 lineto
+ 410 228 lineto
+ 408 222 lineto
+ 408 216 lineto
+ 412 232 lineto
+ 432 240 lineto
+ 426 240 lineto
+ 420 238 lineto
+ 416 236 lineto
+ 416 234 lineto
+ 412 230 406 226 402 224 curveto
+ 404 224 lineto
+ 406 226 lineto
+ 400 222 392 218 386 216 curveto
+ 388 218 lineto
+ 394 220 lineto
+ 392 218 lineto
+ 384 216 376 214 366 214 curveto
+ 366 216 lineto
+ 360 214 lineto
+ 358 212 lineto
+ 354 208 lineto
+ 372 216 lineto
+ 386 208 lineto
+ 382 212 lineto
+ 378 214 lineto
+ 372 216 lineto
+ 362 216 352 218 344 220 curveto
+ 350 218 lineto
+ 342 222 332 226 326 230 curveto
+ 330 228 lineto
+ 328 228 lineto
+ 322 234 314 240 308 246 curveto
+ 310 244 lineto
+ 306 246 lineto
+ 300 248 lineto
+ 314 240 lineto
+ 318 232 lineto
+ 316 238 lineto
+ 314 240 lineto
+ 312 242 lineto
+ 304 248 298 258 292 266 curveto
+ 294 262 lineto
+ 294 264 lineto
+ 292 264 lineto
+ 282 282 274 298 268 316 curveto
+ 270 316 lineto
+ 272 310 lineto
+ 270 310 lineto
+ 260 340 256 372 256 404 curveto
+ 258 402 lineto
+ 256 408 lineto
+ 254 412 lineto
+ 258 402 lineto
+ 254 388 lineto
+ 256 390 lineto
+ 258 396 lineto
+ 258 398 lineto
+ 258 428 262 460 272 488 curveto
+ 270 482 lineto
+ 276 502 284 518 296 536 curveto
+ 294 536 lineto
+ 292 532 lineto
+ 294 534 lineto
+ 300 542 306 550 314 558 curveto
+ 316 560 lineto
+ 318 566 lineto
+ 318 572 lineto
+ 314 558 lineto
+ 294 550 lineto
+ 300 550 lineto
+ 306 552 lineto
+ 310 554 lineto
+ 316 560 324 566 330 570 curveto
+ 326 568 lineto
+ 328 568 lineto
+ 336 574 344 578 352 582 curveto
+ 352 580 lineto
+ 346 578 lineto
+ 346 580 lineto
+ 356 582 364 584 374 584 curveto
+ 380 586 lineto
+ 382 588 lineto
+ 386 592 lineto
+ 368 584 lineto
+ 354 592 lineto
+ 358 588 lineto
+ 362 586 lineto
+ 368 584 lineto
+ 368 582 lineto
+ 378 582 388 580 396 578 curveto
+ 394 578 lineto
+ 388 580 lineto
+ 390 580 lineto
+ 398 578 404 574 410 570 curveto
+ 406 572 lineto
+ 408 572 lineto
+ 414 568 418 564 424 558 curveto
+ 422 560 lineto
+ 426 558 lineto
+ 432 556 lineto
+ 418 564 lineto
+ 414 572 lineto
+ 416 566 lineto
+ 418 564 lineto
+ 420 562 lineto
+ 424 558 430 552 434 544 curveto
+ 432 546 lineto
+ 430 548 lineto
+ 432 548 lineto
+ 438 538 444 526 448 514 curveto
+ 446 520 lineto
+ 450 508 452 496 454 484 curveto
+ 452 484 lineto
+ 454 478 lineto
+ 456 476 lineto
+ 460 472 lineto
+ 464 470 lineto
+ 470 468 lineto
+closepath
+%end path
+fill
+%new path
+ 500 476 moveto
+ 502 478 lineto
+ 504 484 lineto
+ 504 610 lineto
+ 502 616 lineto
+ 500 620 lineto
+ 496 624 lineto
+ 492 626 lineto
+ 486 628 lineto
+ 480 628 lineto
+ 480 626 lineto
+ 476 626 lineto
+ 476 628 lineto
+ 470 626 lineto
+ 468 624 lineto
+ 464 620 lineto
+ 462 616 lineto
+ 460 616 lineto
+ 452 598 444 580 436 562 curveto
+ 436 564 lineto
+ 434 558 lineto
+ 434 552 lineto
+ 436 546 lineto
+ 438 544 lineto
+ 444 534 450 524 454 512 curveto
+ 452 512 lineto
+ 450 518 lineto
+ 452 518 lineto
+ 456 506 458 494 458 484 curveto
+ 460 478 lineto
+ 462 476 lineto
+ 466 472 lineto
+ 468 470 lineto
+ 474 468 lineto
+ 486 468 lineto
+ 492 470 lineto
+ 496 472 lineto
+ 500 476 lineto
+closepath
+%end path
+fill
+%new path
+ 456 368 moveto
+ 454 364 lineto
+ 452 358 lineto
+ 452 196 lineto
+ 454 190 lineto
+ 456 188 lineto
+ 460 184 lineto
+ 464 182 lineto
+ 470 180 lineto
+ 486 180 lineto
+ 492 182 lineto
+ 496 184 lineto
+ 500 188 lineto
+ 502 190 lineto
+ 504 196 lineto
+ 504 358 lineto
+ 502 364 lineto
+ 500 368 lineto
+ 496 372 lineto
+ 492 374 lineto
+ 486 376 lineto
+ 480 376 lineto
+ 480 374 lineto
+ 468 374 lineto
+ 470 376 lineto
+ 464 374 lineto
+ 460 372 lineto
+ 456 368 lineto
+closepath
+%end path
+fill
+%new path
+ 494 340 moveto
+ 496 342 lineto
+ 498 348 lineto
+ 498 358 lineto
+ 496 364 lineto
+ 494 368 lineto
+ 490 372 lineto
+ 486 374 lineto
+ 480 376 lineto
+ 474 376 lineto
+ 474 374 lineto
+ 408 374 lineto
+ 410 376 lineto
+ 404 374 lineto
+ 400 372 lineto
+ 396 368 lineto
+ 394 364 lineto
+ 392 358 lineto
+ 392 348 lineto
+ 394 342 lineto
+ 396 340 lineto
+ 400 336 lineto
+ 404 334 lineto
+ 410 332 lineto
+ 480 332 lineto
+ 486 334 lineto
+ 490 336 lineto
+ 494 340 lineto
+closepath
+%end path
+fill
+%new path
+ 532 340 moveto
+ 534 342 lineto
+ 536 348 lineto
+ 538 350 lineto
+ 538 354 lineto
+ 536 352 lineto
+ 536 358 lineto
+ 534 364 lineto
+ 532 368 lineto
+ 528 372 lineto
+ 526 374 lineto
+ 520 376 lineto
+ 514 376 lineto
+ 512 374 lineto
+ 474 374 lineto
+ 474 376 lineto
+ 468 374 lineto
+ 466 372 lineto
+ 462 368 lineto
+ 460 364 lineto
+ 458 358 lineto
+ 456 358 lineto
+ 456 354 lineto
+ 458 354 lineto
+ 458 348 lineto
+ 460 342 lineto
+ 462 340 lineto
+ 466 336 lineto
+ 468 334 lineto
+ 474 332 lineto
+ 520 332 lineto
+ 526 334 lineto
+ 528 336 lineto
+ 532 340 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_H
+(
+newpath
+%new path
+ 246 612 moveto
+ 244 608 lineto
+ 242 602 lineto
+ 240 602 lineto
+ 240 202 lineto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 188 lineto
+ 250 184 lineto
+ 252 182 lineto
+ 258 180 lineto
+ 274 180 lineto
+ 280 182 lineto
+ 284 184 lineto
+ 288 188 lineto
+ 290 190 lineto
+ 292 196 lineto
+ 292 602 lineto
+ 290 608 lineto
+ 288 612 lineto
+ 284 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 268 618 lineto
+ 258 618 lineto
+ 258 620 lineto
+ 252 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+closepath
+%end path
+fill
+%new path
+ 448 612 moveto
+ 446 608 lineto
+ 444 602 lineto
+ 444 196 lineto
+ 446 190 lineto
+ 448 188 lineto
+ 452 184 lineto
+ 456 182 lineto
+ 462 180 lineto
+ 478 180 lineto
+ 484 182 lineto
+ 488 184 lineto
+ 492 188 lineto
+ 494 190 lineto
+ 496 196 lineto
+ 496 602 lineto
+ 494 608 lineto
+ 492 612 lineto
+ 488 616 lineto
+ 484 618 lineto
+ 478 620 lineto
+ 472 620 lineto
+ 472 618 lineto
+ 460 618 lineto
+ 462 620 lineto
+ 456 618 lineto
+ 452 616 lineto
+ 448 612 lineto
+closepath
+%end path
+fill
+%new path
+ 268 386 moveto
+ 470 386 lineto
+ 470 430 lineto
+ 468 428 lineto
+ 266 428 lineto
+ 266 384 lineto
+closepath
+%end path
+fill
+%new path
+ 282 584 moveto
+ 284 586 lineto
+ 286 592 lineto
+ 288 594 lineto
+ 288 598 lineto
+ 286 596 lineto
+ 286 602 lineto
+ 284 608 lineto
+ 282 612 lineto
+ 278 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 262 618 lineto
+ 210 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 202 616 lineto
+ 198 612 lineto
+ 196 608 lineto
+ 194 602 lineto
+ 192 602 lineto
+ 192 598 lineto
+ 194 598 lineto
+ 194 592 lineto
+ 196 586 lineto
+ 198 584 lineto
+ 202 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 278 580 lineto
+ 282 584 lineto
+closepath
+%end path
+fill
+%new path
+ 334 584 moveto
+ 336 586 lineto
+ 338 592 lineto
+ 340 594 lineto
+ 340 598 lineto
+ 338 596 lineto
+ 338 602 lineto
+ 336 608 lineto
+ 334 612 lineto
+ 330 616 lineto
+ 328 618 lineto
+ 322 620 lineto
+ 316 620 lineto
+ 314 618 lineto
+ 262 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+ 248 608 lineto
+ 246 602 lineto
+ 246 592 lineto
+ 248 586 lineto
+ 250 584 lineto
+ 254 580 lineto
+ 258 578 lineto
+ 264 576 lineto
+ 322 576 lineto
+ 328 578 lineto
+ 330 580 lineto
+ 334 584 lineto
+closepath
+%end path
+fill
+%new path
+ 198 216 moveto
+ 196 212 lineto
+ 194 206 lineto
+ 192 206 lineto
+ 192 200 lineto
+ 194 202 lineto
+ 194 196 lineto
+ 196 190 lineto
+ 198 186 lineto
+ 202 182 lineto
+ 204 180 lineto
+ 276 180 lineto
+ 278 182 lineto
+ 282 186 lineto
+ 284 190 lineto
+ 286 196 lineto
+ 288 196 lineto
+ 288 202 lineto
+ 286 200 lineto
+ 286 206 lineto
+ 284 212 lineto
+ 282 216 lineto
+ 278 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 262 222 lineto
+ 210 222 lineto
+ 210 224 lineto
+ 204 222 lineto
+ 202 220 lineto
+ 198 216 lineto
+closepath
+%end path
+fill
+%new path
+ 250 216 moveto
+ 248 212 lineto
+ 246 206 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 186 lineto
+ 254 182 lineto
+ 258 180 lineto
+ 328 180 lineto
+ 330 182 lineto
+ 334 186 lineto
+ 336 190 lineto
+ 338 196 lineto
+ 340 196 lineto
+ 340 202 lineto
+ 338 200 lineto
+ 338 206 lineto
+ 336 212 lineto
+ 334 216 lineto
+ 330 220 lineto
+ 328 222 lineto
+ 322 224 lineto
+ 316 224 lineto
+ 314 222 lineto
+ 262 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 254 220 lineto
+ 250 216 lineto
+closepath
+%end path
+fill
+%new path
+ 486 584 moveto
+ 488 586 lineto
+ 490 592 lineto
+ 490 602 lineto
+ 488 608 lineto
+ 486 612 lineto
+ 482 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 466 618 lineto
+ 414 618 lineto
+ 414 620 lineto
+ 408 618 lineto
+ 406 616 lineto
+ 402 612 lineto
+ 400 608 lineto
+ 398 602 lineto
+ 396 602 lineto
+ 396 598 lineto
+ 398 598 lineto
+ 398 592 lineto
+ 400 586 lineto
+ 402 584 lineto
+ 406 580 lineto
+ 408 578 lineto
+ 414 576 lineto
+ 472 576 lineto
+ 478 578 lineto
+ 482 580 lineto
+ 486 584 lineto
+closepath
+%end path
+fill
+%new path
+ 538 584 moveto
+ 540 586 lineto
+ 542 592 lineto
+ 544 594 lineto
+ 544 598 lineto
+ 542 596 lineto
+ 542 602 lineto
+ 540 608 lineto
+ 538 612 lineto
+ 534 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 518 618 lineto
+ 466 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 458 616 lineto
+ 454 612 lineto
+ 452 608 lineto
+ 450 602 lineto
+ 448 602 lineto
+ 448 598 lineto
+ 450 598 lineto
+ 450 592 lineto
+ 452 586 lineto
+ 454 584 lineto
+ 458 580 lineto
+ 460 578 lineto
+ 466 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 534 580 lineto
+ 538 584 lineto
+closepath
+%end path
+fill
+%new path
+ 402 216 moveto
+ 400 212 lineto
+ 398 206 lineto
+ 396 206 lineto
+ 396 200 lineto
+ 398 202 lineto
+ 398 196 lineto
+ 400 190 lineto
+ 402 186 lineto
+ 406 182 lineto
+ 408 180 lineto
+ 478 180 lineto
+ 482 182 lineto
+ 486 186 lineto
+ 488 190 lineto
+ 490 196 lineto
+ 490 206 lineto
+ 488 212 lineto
+ 486 216 lineto
+ 482 220 lineto
+ 478 222 lineto
+ 472 224 lineto
+ 466 224 lineto
+ 466 222 lineto
+ 414 222 lineto
+ 414 224 lineto
+ 408 222 lineto
+ 406 220 lineto
+ 402 216 lineto
+closepath
+%end path
+fill
+%new path
+ 454 216 moveto
+ 452 212 lineto
+ 450 206 lineto
+ 448 206 lineto
+ 448 200 lineto
+ 450 202 lineto
+ 450 196 lineto
+ 452 190 lineto
+ 454 186 lineto
+ 458 182 lineto
+ 460 180 lineto
+ 532 180 lineto
+ 534 182 lineto
+ 538 186 lineto
+ 540 190 lineto
+ 542 196 lineto
+ 544 196 lineto
+ 544 202 lineto
+ 542 200 lineto
+ 542 206 lineto
+ 540 212 lineto
+ 538 216 lineto
+ 534 220 lineto
+ 532 222 lineto
+ 526 224 lineto
+ 520 224 lineto
+ 518 222 lineto
+ 466 222 lineto
+ 466 224 lineto
+ 460 222 lineto
+ 458 220 lineto
+ 454 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_I
+(
+newpath
+%new path
+ 348 612 moveto
+ 346 608 lineto
+ 344 602 lineto
+ 342 602 lineto
+ 342 202 lineto
+ 344 202 lineto
+ 344 196 lineto
+ 346 190 lineto
+ 348 188 lineto
+ 352 184 lineto
+ 354 182 lineto
+ 360 180 lineto
+ 376 180 lineto
+ 382 182 lineto
+ 386 184 lineto
+ 390 188 lineto
+ 392 190 lineto
+ 394 196 lineto
+ 394 602 lineto
+ 392 608 lineto
+ 390 612 lineto
+ 386 616 lineto
+ 382 618 lineto
+ 376 620 lineto
+ 370 620 lineto
+ 370 618 lineto
+ 360 618 lineto
+ 360 620 lineto
+ 354 618 lineto
+ 352 616 lineto
+ 348 612 lineto
+closepath
+%end path
+fill
+%new path
+ 384 584 moveto
+ 386 586 lineto
+ 388 592 lineto
+ 390 594 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 252 618 lineto
+ 252 620 lineto
+ 246 618 lineto
+ 244 616 lineto
+ 240 612 lineto
+ 238 608 lineto
+ 236 602 lineto
+ 234 602 lineto
+ 234 598 lineto
+ 236 598 lineto
+ 236 592 lineto
+ 238 586 lineto
+ 240 584 lineto
+ 244 580 lineto
+ 246 578 lineto
+ 252 576 lineto
+ 372 576 lineto
+ 378 578 lineto
+ 380 580 lineto
+ 384 584 lineto
+closepath
+%end path
+fill
+%new path
+ 496 584 moveto
+ 498 586 lineto
+ 500 592 lineto
+ 502 594 lineto
+ 502 598 lineto
+ 500 596 lineto
+ 500 602 lineto
+ 498 608 lineto
+ 496 612 lineto
+ 492 616 lineto
+ 490 618 lineto
+ 484 620 lineto
+ 478 620 lineto
+ 476 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 584 lineto
+ 356 580 lineto
+ 360 578 lineto
+ 366 576 lineto
+ 484 576 lineto
+ 490 578 lineto
+ 492 580 lineto
+ 496 584 lineto
+closepath
+%end path
+fill
+%new path
+ 240 216 moveto
+ 238 212 lineto
+ 236 206 lineto
+ 234 206 lineto
+ 234 200 lineto
+ 236 202 lineto
+ 236 196 lineto
+ 238 190 lineto
+ 240 186 lineto
+ 244 182 lineto
+ 246 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 252 222 lineto
+ 252 224 lineto
+ 246 222 lineto
+ 244 220 lineto
+ 240 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 490 180 lineto
+ 492 182 lineto
+ 496 186 lineto
+ 498 190 lineto
+ 500 196 lineto
+ 502 196 lineto
+ 502 202 lineto
+ 500 200 lineto
+ 500 206 lineto
+ 498 212 lineto
+ 496 216 lineto
+ 492 220 lineto
+ 490 222 lineto
+ 484 224 lineto
+ 478 224 lineto
+ 476 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_J
+(
+newpath
+%new path
+ 426 612 moveto
+ 424 608 lineto
+ 422 602 lineto
+ 422 274 lineto
+ 422 266 420 260 418 252 curveto
+ 420 254 lineto
+ 422 260 lineto
+ 420 258 lineto
+ 418 252 416 248 412 242 curveto
+ 414 244 lineto
+ 416 246 lineto
+ 414 246 lineto
+ 412 240 408 236 404 234 curveto
+ 406 234 lineto
+ 404 232 lineto
+ 402 226 lineto
+ 402 220 lineto
+ 406 234 lineto
+ 424 242 lineto
+ 418 242 lineto
+ 412 240 lineto
+ 410 238 lineto
+ 408 238 lineto
+ 406 236 406 234 404 232 curveto
+ 400 230 398 228 396 226 curveto
+ 396 228 lineto
+ 400 230 lineto
+ 398 228 lineto
+ 392 224 384 220 376 218 curveto
+ 382 220 lineto
+ 370 216 360 214 348 214 curveto
+ 348 216 lineto
+ 342 214 lineto
+ 340 212 lineto
+ 336 208 lineto
+ 334 204 lineto
+ 332 198 lineto
+ 330 198 lineto
+ 330 192 lineto
+ 332 194 lineto
+ 332 188 lineto
+ 334 182 lineto
+ 336 180 lineto
+ 340 176 lineto
+ 342 174 lineto
+ 348 172 lineto
+ 354 172 lineto
+ 356 174 lineto
+ 370 174 382 176 396 180 curveto
+ 402 180 lineto
+ 410 184 418 188 426 192 curveto
+ 428 194 lineto
+ 430 194 lineto
+ 432 196 434 198 436 200 curveto
+ 440 202 442 204 444 206 curveto
+ 442 206 lineto
+ 446 210 lineto
+ 448 210 lineto
+ 452 214 456 218 458 222 curveto
+ 460 224 lineto
+ 460 226 lineto
+ 464 232 466 236 468 242 curveto
+ 470 248 lineto
+ 472 256 474 262 474 270 curveto
+ 474 602 lineto
+ 472 608 lineto
+ 470 612 lineto
+ 466 616 lineto
+ 462 618 lineto
+ 456 620 lineto
+ 450 620 lineto
+ 450 618 lineto
+ 438 618 lineto
+ 440 620 lineto
+ 434 618 lineto
+ 430 616 lineto
+ 426 612 lineto
+closepath
+%end path
+fill
+%new path
+ 464 584 moveto
+ 466 586 lineto
+ 468 592 lineto
+ 468 602 lineto
+ 466 608 lineto
+ 464 612 lineto
+ 460 616 lineto
+ 456 618 lineto
+ 450 620 lineto
+ 444 620 lineto
+ 444 618 lineto
+ 350 618 lineto
+ 352 620 lineto
+ 346 618 lineto
+ 342 616 lineto
+ 338 612 lineto
+ 336 608 lineto
+ 334 602 lineto
+ 334 592 lineto
+ 336 586 lineto
+ 338 584 lineto
+ 342 580 lineto
+ 346 578 lineto
+ 352 576 lineto
+ 450 576 lineto
+ 456 578 lineto
+ 460 580 lineto
+ 464 584 lineto
+closepath
+%end path
+fill
+%new path
+ 520 584 moveto
+ 522 586 lineto
+ 524 592 lineto
+ 524 602 lineto
+ 522 608 lineto
+ 520 612 lineto
+ 516 616 lineto
+ 512 618 lineto
+ 506 620 lineto
+ 500 620 lineto
+ 500 618 lineto
+ 444 618 lineto
+ 444 620 lineto
+ 438 618 lineto
+ 436 616 lineto
+ 432 612 lineto
+ 430 608 lineto
+ 428 602 lineto
+ 426 602 lineto
+ 426 598 lineto
+ 428 598 lineto
+ 428 592 lineto
+ 430 586 lineto
+ 432 584 lineto
+ 436 580 lineto
+ 438 578 lineto
+ 444 576 lineto
+ 506 576 lineto
+ 512 578 lineto
+ 516 580 lineto
+ 520 584 lineto
+closepath
+%end path
+fill
+%new path
+ 368 208 moveto
+ 364 212 lineto
+ 360 214 lineto
+ 354 216 lineto
+ 338 216 322 218 308 224 curveto
+ 308 222 lineto
+ 314 220 lineto
+ 314 222 lineto
+ 306 224 298 228 292 232 curveto
+ 292 230 lineto
+ 296 228 lineto
+ 294 230 lineto
+ 292 232 288 234 286 236 curveto
+ 284 238 lineto
+ 278 240 lineto
+ 290 232 lineto
+ 294 222 lineto
+ 292 228 lineto
+ 290 232 lineto
+ 288 236 286 238 284 240 curveto
+ 286 236 lineto
+ 286 238 lineto
+ 284 240 282 244 280 248 curveto
+ 282 246 lineto
+ 284 240 lineto
+ 282 242 lineto
+ 280 246 280 252 280 256 curveto
+ 282 256 lineto
+ 280 262 lineto
+ 278 264 lineto
+ 274 268 lineto
+ 270 270 lineto
+ 264 272 lineto
+ 248 272 lineto
+ 242 270 lineto
+ 238 268 lineto
+ 234 264 lineto
+ 232 262 lineto
+ 230 256 lineto
+ 230 250 lineto
+ 232 248 lineto
+ 232 242 232 238 234 232 curveto
+ 234 234 lineto
+ 236 228 lineto
+ 236 226 lineto
+ 238 222 240 220 242 216 curveto
+ 240 216 lineto
+ 242 214 lineto
+ 244 212 lineto
+ 246 210 248 208 250 204 curveto
+ 250 206 lineto
+ 254 202 lineto
+ 254 200 lineto
+ 258 198 260 196 264 192 curveto
+ 264 194 lineto
+ 266 192 lineto
+ 268 190 lineto
+ 274 186 282 182 290 180 curveto
+ 296 180 lineto
+ 312 174 332 172 350 172 curveto
+ 354 172 lineto
+ 360 174 lineto
+ 364 176 lineto
+ 368 180 lineto
+ 370 182 lineto
+ 372 188 lineto
+ 372 198 lineto
+ 370 204 lineto
+ 368 208 lineto
+closepath
+%end path
+fill
+%new path
+ 296 256 moveto
+ 294 256 lineto
+ 294 260 lineto
+ 292 266 lineto
+ 292 268 290 268 290 270 curveto
+ 292 268 lineto
+ 290 272 lineto
+ 288 272 lineto
+ 288 272 288 274 286 274 curveto
+ 288 272 lineto
+ 284 276 lineto
+ 282 278 lineto
+ 282 278 lineto
+ 280 280 lineto
+ 278 282 lineto
+ 276 282 lineto
+ 270 284 lineto
+ 268 286 266 286 264 286 curveto
+ 266 284 lineto
+ 258 284 lineto
+ 258 284 256 284 254 282 curveto
+ 256 284 lineto
+ 250 282 lineto
+ 248 280 lineto
+ 246 280 lineto
+ 244 278 lineto
+ 242 278 lineto
+ 242 276 lineto
+ 238 272 lineto
+ 236 272 236 270 236 270 curveto
+ 236 272 lineto
+ 234 268 lineto
+ 234 266 232 266 232 264 curveto
+ 234 266 lineto
+ 232 260 lineto
+ 230 258 lineto
+ 230 250 lineto
+ 232 244 lineto
+ 234 240 lineto
+ 236 240 lineto
+ 240 236 244 232 248 228 curveto
+ 246 228 lineto
+ 250 224 lineto
+ 254 222 lineto
+ 260 220 lineto
+ 266 220 lineto
+ 266 222 lineto
+ 270 222 lineto
+ 276 224 lineto
+ 278 224 lineto
+ 278 224 280 224 280 226 curveto
+ 280 224 lineto
+ 282 226 lineto
+ 284 228 lineto
+ 288 232 lineto
+ 290 234 290 234 290 234 curveto
+ 292 236 lineto
+ 292 238 lineto
+ 292 238 294 240 294 240 curveto
+ 292 240 lineto
+ 294 246 lineto
+ 296 246 lineto
+ 296 256 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_K
+(
+newpath
+%new path
+ 248 612 moveto
+ 246 608 lineto
+ 244 602 lineto
+ 242 602 lineto
+ 242 202 lineto
+ 244 202 lineto
+ 244 196 lineto
+ 246 190 lineto
+ 248 188 lineto
+ 252 184 lineto
+ 254 182 lineto
+ 260 180 lineto
+ 266 180 lineto
+ 272 182 lineto
+ 276 184 lineto
+ 280 188 lineto
+ 282 190 lineto
+ 284 196 lineto
+ 284 602 lineto
+ 282 608 lineto
+ 280 612 lineto
+ 276 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 252 616 lineto
+ 248 612 lineto
+closepath
+%end path
+fill
+%new path
+ 264 294 moveto
+ 346 396 426 498 508 600 curveto
+ 510 602 510 606 510 608 curveto
+ 508 608 lineto
+ 508 610 506 614 504 616 curveto
+ 502 618 500 620 496 620 curveto
+ 496 618 lineto
+ 484 618 lineto
+ 476 618 470 616 464 610 curveto
+ 464 610 464 608 462 608 curveto
+ 396 524 328 440 262 356 curveto
+ 262 292 lineto
+closepath
+%end path
+fill
+%new path
+ 340 422 moveto
+ 384 344 428 266 472 188 curveto
+ 474 186 474 186 476 184 curveto
+ 480 180 484 180 490 180 curveto
+ 502 180 lineto
+ 506 180 508 182 510 184 curveto
+ 514 186 514 190 514 194 curveto
+ 512 194 lineto
+ 512 200 lineto
+ 462 286 414 372 366 456 curveto
+ 366 454 lineto
+ 356 444 348 432 338 422 curveto
+closepath
+%end path
+fill
+%new path
+ 280 584 moveto
+ 282 586 lineto
+ 284 592 lineto
+ 284 598 lineto
+ 282 600 lineto
+ 282 604 lineto
+ 284 602 lineto
+ 282 608 lineto
+ 280 612 lineto
+ 276 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 260 618 lineto
+ 214 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 196 602 lineto
+ 196 598 lineto
+ 198 598 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 208 578 lineto
+ 214 576 lineto
+ 266 576 lineto
+ 272 578 lineto
+ 276 580 lineto
+ 280 584 lineto
+closepath
+%end path
+fill
+%new path
+ 324 584 moveto
+ 326 586 lineto
+ 328 592 lineto
+ 330 594 lineto
+ 330 598 lineto
+ 328 596 lineto
+ 328 602 lineto
+ 326 608 lineto
+ 324 612 lineto
+ 320 616 lineto
+ 318 618 lineto
+ 312 620 lineto
+ 306 620 lineto
+ 304 618 lineto
+ 260 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 252 616 lineto
+ 248 612 lineto
+ 246 608 lineto
+ 244 602 lineto
+ 242 602 lineto
+ 242 598 lineto
+ 244 598 lineto
+ 244 592 lineto
+ 246 586 lineto
+ 248 584 lineto
+ 252 580 lineto
+ 254 578 lineto
+ 260 576 lineto
+ 312 576 lineto
+ 318 578 lineto
+ 320 580 lineto
+ 324 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 196 206 lineto
+ 196 200 lineto
+ 198 202 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 208 180 lineto
+ 272 180 lineto
+ 276 182 lineto
+ 280 186 lineto
+ 282 190 lineto
+ 284 196 lineto
+ 284 206 lineto
+ 282 212 lineto
+ 280 216 lineto
+ 276 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 260 222 lineto
+ 214 222 lineto
+ 214 224 lineto
+ 208 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 248 216 moveto
+ 246 212 lineto
+ 244 206 lineto
+ 244 196 lineto
+ 246 190 lineto
+ 248 186 lineto
+ 252 182 lineto
+ 254 180 lineto
+ 318 180 lineto
+ 320 182 lineto
+ 324 186 lineto
+ 326 190 lineto
+ 328 196 lineto
+ 330 196 lineto
+ 330 202 lineto
+ 328 200 lineto
+ 328 206 lineto
+ 326 212 lineto
+ 324 216 lineto
+ 320 220 lineto
+ 318 222 lineto
+ 312 224 lineto
+ 306 224 lineto
+ 304 222 lineto
+ 260 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 252 220 lineto
+ 248 216 lineto
+closepath
+%end path
+fill
+%new path
+ 494 584 moveto
+ 496 586 496 586 498 588 curveto
+ 496 588 lineto
+ 498 590 lineto
+ 500 596 lineto
+ 500 602 lineto
+ 498 608 lineto
+ 496 612 lineto
+ 492 616 lineto
+ 490 618 lineto
+ 484 620 lineto
+ 478 620 lineto
+ 476 618 lineto
+ 422 618 lineto
+ 424 620 lineto
+ 418 618 lineto
+ 414 616 lineto
+ 410 612 lineto
+ 408 608 lineto
+ 406 602 lineto
+ 406 592 lineto
+ 408 586 lineto
+ 410 584 lineto
+ 414 580 lineto
+ 418 578 lineto
+ 424 576 lineto
+ 480 576 lineto
+ 486 578 lineto
+ 490 580 lineto
+ 494 584 lineto
+closepath
+%end path
+fill
+%new path
+ 524 584 moveto
+ 526 586 lineto
+ 528 592 lineto
+ 530 594 lineto
+ 530 598 lineto
+ 528 596 lineto
+ 528 602 lineto
+ 526 608 lineto
+ 524 612 lineto
+ 520 616 lineto
+ 518 618 lineto
+ 512 620 lineto
+ 506 620 lineto
+ 504 618 lineto
+ 476 618 lineto
+ 478 620 lineto
+ 472 618 lineto
+ 468 616 lineto
+ 464 612 lineto
+ 464 610 lineto
+ 462 608 462 608 460 606 curveto
+ 462 608 lineto
+ 460 604 lineto
+ 458 598 lineto
+ 458 592 lineto
+ 460 586 lineto
+ 462 584 lineto
+ 466 580 lineto
+ 468 578 lineto
+ 474 576 lineto
+ 512 576 lineto
+ 518 578 lineto
+ 520 580 lineto
+ 524 584 lineto
+closepath
+%end path
+fill
+%new path
+ 428 216 moveto
+ 426 212 lineto
+ 424 206 lineto
+ 422 206 lineto
+ 422 200 lineto
+ 424 202 lineto
+ 424 196 lineto
+ 426 190 lineto
+ 428 186 lineto
+ 432 182 lineto
+ 434 180 lineto
+ 498 180 lineto
+ 500 182 lineto
+ 504 186 lineto
+ 506 190 lineto
+ 508 196 lineto
+ 508 202 lineto
+ 506 208 lineto
+ 506 210 504 212 504 214 curveto
+ 504 212 lineto
+ 502 216 lineto
+ 498 220 lineto
+ 496 222 lineto
+ 490 224 lineto
+ 484 224 lineto
+ 482 222 lineto
+ 440 222 lineto
+ 440 224 lineto
+ 434 222 lineto
+ 432 220 lineto
+ 428 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 216 moveto
+ 468 212 lineto
+ 466 206 lineto
+ 466 200 lineto
+ 468 194 lineto
+ 470 194 lineto
+ 470 192 472 190 472 188 curveto
+ 470 190 lineto
+ 472 186 lineto
+ 476 182 lineto
+ 480 180 lineto
+ 526 180 lineto
+ 528 182 lineto
+ 532 186 lineto
+ 534 190 lineto
+ 536 196 lineto
+ 538 196 lineto
+ 538 202 lineto
+ 536 200 lineto
+ 536 206 lineto
+ 534 212 lineto
+ 532 216 lineto
+ 528 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 512 222 lineto
+ 482 222 lineto
+ 484 224 lineto
+ 478 222 lineto
+ 474 220 lineto
+ 470 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_L
+(
+newpath
+%new path
+ 262 612 moveto
+ 260 608 lineto
+ 258 602 lineto
+ 256 602 lineto
+ 256 202 lineto
+ 258 202 lineto
+ 258 196 lineto
+ 260 190 lineto
+ 262 188 lineto
+ 266 184 lineto
+ 268 182 lineto
+ 274 180 lineto
+ 290 180 lineto
+ 296 182 lineto
+ 300 184 lineto
+ 304 188 lineto
+ 306 190 lineto
+ 308 196 lineto
+ 308 602 lineto
+ 306 608 lineto
+ 304 612 lineto
+ 300 616 lineto
+ 296 618 lineto
+ 290 620 lineto
+ 284 620 lineto
+ 284 618 lineto
+ 274 618 lineto
+ 274 620 lineto
+ 268 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+closepath
+%end path
+fill
+%new path
+ 484 294 moveto
+ 482 292 lineto
+ 480 286 lineto
+ 480 200 lineto
+ 484 216 lineto
+ 504 224 lineto
+ 498 224 lineto
+ 496 222 lineto
+ 278 222 lineto
+ 280 224 lineto
+ 274 222 lineto
+ 270 220 lineto
+ 266 216 lineto
+ 264 212 lineto
+ 262 206 lineto
+ 262 196 lineto
+ 264 190 lineto
+ 266 188 lineto
+ 270 184 lineto
+ 274 182 lineto
+ 280 180 lineto
+ 514 180 lineto
+ 520 182 lineto
+ 524 184 lineto
+ 528 188 lineto
+ 530 190 lineto
+ 532 196 lineto
+ 532 286 lineto
+ 530 292 lineto
+ 528 294 lineto
+ 524 298 lineto
+ 520 300 lineto
+ 514 302 lineto
+ 498 302 lineto
+ 492 300 lineto
+ 488 298 lineto
+ 484 294 lineto
+closepath
+%end path
+fill
+%new path
+ 298 584 moveto
+ 300 586 lineto
+ 302 592 lineto
+ 304 594 lineto
+ 304 598 lineto
+ 302 596 lineto
+ 302 602 lineto
+ 300 608 lineto
+ 298 612 lineto
+ 294 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 278 618 lineto
+ 218 618 lineto
+ 218 620 lineto
+ 212 618 lineto
+ 210 616 lineto
+ 206 612 lineto
+ 204 608 lineto
+ 202 602 lineto
+ 200 602 lineto
+ 200 598 lineto
+ 202 598 lineto
+ 202 592 lineto
+ 204 586 lineto
+ 206 584 lineto
+ 210 580 lineto
+ 212 578 lineto
+ 218 576 lineto
+ 286 576 lineto
+ 292 578 lineto
+ 294 580 lineto
+ 298 584 lineto
+closepath
+%end path
+fill
+%new path
+ 372 584 moveto
+ 374 586 lineto
+ 376 592 lineto
+ 378 594 lineto
+ 378 598 lineto
+ 376 596 lineto
+ 376 602 lineto
+ 374 608 lineto
+ 372 612 lineto
+ 368 616 lineto
+ 366 618 lineto
+ 360 620 lineto
+ 354 620 lineto
+ 352 618 lineto
+ 278 618 lineto
+ 280 620 lineto
+ 274 618 lineto
+ 270 616 lineto
+ 266 612 lineto
+ 264 608 lineto
+ 262 602 lineto
+ 262 592 lineto
+ 264 586 lineto
+ 266 584 lineto
+ 270 580 lineto
+ 274 578 lineto
+ 280 576 lineto
+ 360 576 lineto
+ 366 578 lineto
+ 368 580 lineto
+ 372 584 lineto
+closepath
+%end path
+fill
+%new path
+ 206 216 moveto
+ 204 212 lineto
+ 202 206 lineto
+ 200 206 lineto
+ 200 200 lineto
+ 202 202 lineto
+ 202 196 lineto
+ 204 190 lineto
+ 206 186 lineto
+ 210 182 lineto
+ 212 180 lineto
+ 292 180 lineto
+ 294 182 lineto
+ 298 186 lineto
+ 300 190 lineto
+ 302 196 lineto
+ 304 196 lineto
+ 304 202 lineto
+ 302 200 lineto
+ 302 206 lineto
+ 300 212 lineto
+ 298 216 lineto
+ 294 220 lineto
+ 292 222 lineto
+ 286 224 lineto
+ 280 224 lineto
+ 278 222 lineto
+ 218 222 lineto
+ 218 224 lineto
+ 212 222 lineto
+ 210 220 lineto
+ 206 216 lineto
+closepath
+%end path
+fill
+%new path
+ 266 216 moveto
+ 264 212 lineto
+ 262 206 lineto
+ 262 196 lineto
+ 264 190 lineto
+ 266 186 lineto
+ 270 182 lineto
+ 274 180 lineto
+ 324 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 336 196 lineto
+ 336 202 lineto
+ 334 200 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 324 222 lineto
+ 318 224 lineto
+ 312 224 lineto
+ 310 222 lineto
+ 278 222 lineto
+ 280 224 lineto
+ 274 222 lineto
+ 270 220 lineto
+ 266 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_M
+(
+newpath
+%new path
+ 234 612 moveto
+ 232 608 lineto
+ 230 602 lineto
+ 228 602 lineto
+ 228 202 lineto
+ 230 202 lineto
+ 230 196 lineto
+ 232 190 lineto
+ 234 188 lineto
+ 238 184 lineto
+ 240 182 lineto
+ 246 180 lineto
+ 252 180 lineto
+ 258 182 lineto
+ 262 184 lineto
+ 266 188 lineto
+ 268 190 lineto
+ 270 196 lineto
+ 270 602 lineto
+ 268 608 lineto
+ 266 612 lineto
+ 262 616 lineto
+ 258 618 lineto
+ 252 620 lineto
+ 246 620 lineto
+ 246 620 lineto
+ 240 618 lineto
+ 238 616 lineto
+ 234 612 lineto
+closepath
+%end path
+fill
+%new path
+ 470 612 moveto
+ 468 608 lineto
+ 466 602 lineto
+ 466 196 lineto
+ 468 190 lineto
+ 470 188 lineto
+ 474 184 lineto
+ 478 182 lineto
+ 484 180 lineto
+ 490 180 lineto
+ 496 182 lineto
+ 500 184 lineto
+ 504 188 lineto
+ 506 190 lineto
+ 508 196 lineto
+ 508 602 lineto
+ 506 608 lineto
+ 504 612 lineto
+ 500 616 lineto
+ 496 618 lineto
+ 490 620 lineto
+ 484 620 lineto
+ 484 618 lineto
+ 482 618 lineto
+ 484 620 lineto
+ 478 618 lineto
+ 474 616 lineto
+ 470 612 lineto
+closepath
+%end path
+fill
+%new path
+ 248 618 moveto
+ 242 612 240 604 240 598 curveto
+ 242 598 lineto
+ 242 590 246 582 252 576 curveto
+ 256 572 264 568 272 568 curveto
+ 272 552 318 418 342 344 curveto
+ 344 340 346 336 350 332 curveto
+ 354 328 362 324 370 324 curveto
+ 370 326 lineto
+ 372 326 lineto
+ 370 324 lineto
+ 364 324 lineto
+ 366 326 lineto
+ 368 326 lineto
+ 376 326 384 330 388 334 curveto
+ 392 338 394 342 396 346 curveto
+ 420 420 466 554 466 570 curveto
+ 474 570 482 574 486 578 curveto
+ 492 584 496 592 496 600 curveto
+ 494 600 lineto
+ 494 606 492 614 486 620 curveto
+ 486 618 lineto
+ 468 618 lineto
+ 460 618 452 614 446 610 curveto
+ 444 606 440 602 440 598 curveto
+ 414 524 368 386 368 374 curveto
+ 366 374 lineto
+ 366 376 lineto
+ 366 388 320 526 294 600 curveto
+ 294 604 290 608 288 612 curveto
+ 282 616 274 620 266 620 curveto
+ 266 618 lineto
+ 248 618 lineto
+closepath
+%end path
+fill
+%new path
+ 266 584 moveto
+ 268 586 lineto
+ 270 592 lineto
+ 270 598 lineto
+ 268 600 lineto
+ 268 604 lineto
+ 270 602 lineto
+ 268 608 lineto
+ 266 612 lineto
+ 262 616 lineto
+ 258 618 lineto
+ 252 620 lineto
+ 246 620 lineto
+ 246 618 lineto
+ 206 618 lineto
+ 208 620 lineto
+ 202 618 lineto
+ 198 616 lineto
+ 194 612 lineto
+ 192 608 lineto
+ 190 602 lineto
+ 190 592 lineto
+ 192 586 lineto
+ 194 584 lineto
+ 198 580 lineto
+ 202 578 lineto
+ 208 576 lineto
+ 252 576 lineto
+ 258 578 lineto
+ 262 580 lineto
+ 266 584 lineto
+closepath
+%end path
+fill
+%new path
+ 194 216 moveto
+ 192 212 lineto
+ 190 206 lineto
+ 190 196 lineto
+ 192 190 lineto
+ 194 186 lineto
+ 198 182 lineto
+ 202 180 lineto
+ 258 180 lineto
+ 262 182 lineto
+ 266 186 lineto
+ 268 190 lineto
+ 270 196 lineto
+ 270 206 lineto
+ 268 212 lineto
+ 266 216 lineto
+ 262 220 lineto
+ 258 222 lineto
+ 252 224 lineto
+ 246 224 lineto
+ 246 222 lineto
+ 206 222 lineto
+ 208 224 lineto
+ 202 222 lineto
+ 198 220 lineto
+ 194 216 lineto
+closepath
+%end path
+fill
+%new path
+ 234 216 moveto
+ 232 212 lineto
+ 230 206 lineto
+ 230 196 lineto
+ 232 190 lineto
+ 234 186 lineto
+ 238 182 lineto
+ 240 180 lineto
+ 296 180 lineto
+ 300 182 lineto
+ 304 186 lineto
+ 306 190 lineto
+ 308 196 lineto
+ 308 206 lineto
+ 306 212 lineto
+ 304 216 lineto
+ 300 220 lineto
+ 296 222 lineto
+ 290 224 lineto
+ 284 224 lineto
+ 284 222 lineto
+ 246 222 lineto
+ 246 224 lineto
+ 240 222 lineto
+ 238 220 lineto
+ 234 216 lineto
+closepath
+%end path
+fill
+%new path
+ 542 584 moveto
+ 544 586 lineto
+ 546 592 lineto
+ 546 602 lineto
+ 544 608 lineto
+ 542 612 lineto
+ 538 616 lineto
+ 534 618 lineto
+ 528 620 lineto
+ 522 620 lineto
+ 522 618 lineto
+ 482 618 lineto
+ 484 620 lineto
+ 478 618 lineto
+ 474 616 lineto
+ 470 612 lineto
+ 468 608 lineto
+ 466 602 lineto
+ 466 592 lineto
+ 468 586 lineto
+ 470 584 lineto
+ 474 580 lineto
+ 478 578 lineto
+ 484 576 lineto
+ 528 576 lineto
+ 534 578 lineto
+ 538 580 lineto
+ 542 584 lineto
+closepath
+%end path
+fill
+%new path
+ 432 216 moveto
+ 430 212 lineto
+ 428 206 lineto
+ 428 196 lineto
+ 430 190 lineto
+ 432 186 lineto
+ 436 182 lineto
+ 440 180 lineto
+ 496 180 lineto
+ 498 182 lineto
+ 502 186 lineto
+ 504 190 lineto
+ 506 196 lineto
+ 508 196 lineto
+ 508 206 lineto
+ 506 212 lineto
+ 504 216 lineto
+ 500 220 lineto
+ 496 222 lineto
+ 490 224 lineto
+ 484 224 lineto
+ 484 222 lineto
+ 444 222 lineto
+ 446 224 lineto
+ 440 222 lineto
+ 436 220 lineto
+ 432 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 216 moveto
+ 468 212 lineto
+ 466 206 lineto
+ 466 200 lineto
+ 468 200 lineto
+ 468 194 lineto
+ 466 196 lineto
+ 468 190 lineto
+ 470 186 lineto
+ 474 182 lineto
+ 478 180 lineto
+ 534 180 lineto
+ 538 182 lineto
+ 542 186 lineto
+ 544 190 lineto
+ 546 196 lineto
+ 546 206 lineto
+ 544 212 lineto
+ 542 216 lineto
+ 538 220 lineto
+ 534 222 lineto
+ 528 224 lineto
+ 522 224 lineto
+ 522 222 lineto
+ 482 222 lineto
+ 484 224 lineto
+ 478 222 lineto
+ 474 220 lineto
+ 470 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_N
+(
+newpath
+%new path
+ 252 612 moveto
+ 250 608 lineto
+ 248 602 lineto
+ 246 602 lineto
+ 246 202 lineto
+ 248 202 lineto
+ 248 196 lineto
+ 250 190 lineto
+ 252 188 lineto
+ 256 184 lineto
+ 258 182 lineto
+ 264 180 lineto
+ 270 180 lineto
+ 276 182 lineto
+ 280 184 lineto
+ 284 188 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 256 616 lineto
+ 252 612 lineto
+closepath
+%end path
+fill
+%new path
+ 452 612 moveto
+ 450 608 lineto
+ 448 602 lineto
+ 448 196 lineto
+ 450 190 lineto
+ 452 188 lineto
+ 456 184 lineto
+ 460 182 lineto
+ 466 180 lineto
+ 472 180 lineto
+ 478 182 lineto
+ 482 184 lineto
+ 486 188 lineto
+ 488 190 lineto
+ 490 196 lineto
+ 490 602 lineto
+ 488 608 lineto
+ 486 612 lineto
+ 482 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 466 618 lineto
+ 464 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 456 616 lineto
+ 452 612 lineto
+closepath
+%end path
+fill
+%new path
+ 266 618 moveto
+ 260 612 258 604 258 598 curveto
+ 260 598 lineto
+ 260 590 264 582 270 576 curveto
+ 274 572 282 568 290 568 curveto
+ 290 558 376 322 422 198 curveto
+ 424 194 426 190 430 186 curveto
+ 436 182 444 180 452 180 curveto
+ 470 180 lineto
+ 476 186 478 194 478 200 curveto
+ 476 200 lineto
+ 476 208 472 216 466 222 curveto
+ 462 226 454 230 446 230 curveto
+ 446 240 360 476 314 600 curveto
+ 312 604 310 608 306 612 curveto
+ 300 616 292 620 284 620 curveto
+ 284 618 lineto
+ 266 618 lineto
+closepath
+%end path
+fill
+%new path
+ 284 584 moveto
+ 286 586 lineto
+ 288 592 lineto
+ 288 598 lineto
+ 286 600 lineto
+ 286 604 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 216 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 208 616 lineto
+ 204 612 lineto
+ 202 608 lineto
+ 200 602 lineto
+ 198 602 lineto
+ 198 598 lineto
+ 200 598 lineto
+ 200 592 lineto
+ 202 586 lineto
+ 204 584 lineto
+ 208 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 280 580 lineto
+ 284 584 lineto
+closepath
+%end path
+fill
+%new path
+ 204 216 moveto
+ 202 212 lineto
+ 200 206 lineto
+ 198 206 lineto
+ 198 200 lineto
+ 200 202 lineto
+ 200 196 lineto
+ 202 190 lineto
+ 204 186 lineto
+ 208 182 lineto
+ 210 180 lineto
+ 276 180 lineto
+ 280 182 lineto
+ 284 186 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 206 lineto
+ 286 212 lineto
+ 284 216 lineto
+ 280 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 264 222 lineto
+ 216 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 208 220 lineto
+ 204 216 lineto
+closepath
+%end path
+fill
+%new path
+ 252 216 moveto
+ 250 212 lineto
+ 248 206 lineto
+ 248 196 lineto
+ 250 190 lineto
+ 252 186 lineto
+ 256 182 lineto
+ 258 180 lineto
+ 324 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 336 196 lineto
+ 336 202 lineto
+ 334 200 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 324 222 lineto
+ 318 224 lineto
+ 312 224 lineto
+ 310 222 lineto
+ 264 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 256 220 lineto
+ 252 216 lineto
+closepath
+%end path
+fill
+%new path
+ 486 584 moveto
+ 488 586 lineto
+ 490 592 lineto
+ 490 598 lineto
+ 488 600 lineto
+ 488 602 lineto
+ 486 608 lineto
+ 484 612 lineto
+ 480 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 464 618 lineto
+ 418 618 lineto
+ 418 620 lineto
+ 412 618 lineto
+ 410 616 lineto
+ 406 612 lineto
+ 404 608 lineto
+ 402 602 lineto
+ 400 602 lineto
+ 400 598 lineto
+ 402 598 lineto
+ 402 592 lineto
+ 404 586 lineto
+ 406 584 lineto
+ 410 580 lineto
+ 412 578 lineto
+ 418 576 lineto
+ 472 576 lineto
+ 478 578 lineto
+ 482 580 lineto
+ 486 584 lineto
+closepath
+%end path
+fill
+%new path
+ 532 584 moveto
+ 534 586 lineto
+ 536 592 lineto
+ 538 594 lineto
+ 538 598 lineto
+ 536 596 lineto
+ 536 602 lineto
+ 534 608 lineto
+ 532 612 lineto
+ 528 616 lineto
+ 526 618 lineto
+ 520 620 lineto
+ 514 620 lineto
+ 512 618 lineto
+ 464 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 456 616 lineto
+ 452 612 lineto
+ 450 608 lineto
+ 448 602 lineto
+ 448 592 lineto
+ 450 586 lineto
+ 452 584 lineto
+ 456 580 lineto
+ 460 578 lineto
+ 466 576 lineto
+ 520 576 lineto
+ 526 578 lineto
+ 528 580 lineto
+ 532 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_O
+(
+newpath
+%new path
+ 368 582 moveto
+ 340 582 308 582 292 564 curveto
+ 288 562 286 558 284 554 curveto
+ 268 526 268 458 268 406 curveto
+ 270 406 lineto
+ 270 352 270 276 286 244 curveto
+ 288 240 290 236 294 234 curveto
+ 312 216 342 214 370 214 curveto
+ 370 216 lineto
+ 396 216 426 218 444 236 curveto
+ 448 238 450 242 452 246 curveto
+ 468 278 468 354 468 408 curveto
+ 466 408 lineto
+ 466 460 466 528 450 556 curveto
+ 448 560 446 564 442 566 curveto
+ 426 584 394 584 368 584 curveto
+closepath
+%end path
+%new path
+ 368 626 moveto
+ 324 626 276 626 250 600 curveto
+ 246 596 244 594 242 590 curveto
+ 218 554 218 464 218 398 curveto
+ 220 398 lineto
+ 220 332 220 242 244 206 curveto
+ 246 202 248 200 252 196 curveto
+ 278 172 326 172 370 172 curveto
+ 370 174 lineto
+ 412 174 460 174 486 198 curveto
+ 490 202 492 204 494 208 curveto
+ 518 244 518 334 518 400 curveto
+ 516 400 lineto
+ 516 466 516 556 492 592 curveto
+ 490 596 488 598 484 602 curveto
+ 458 628 410 628 368 628 curveto
+closepath
+%end path
+eofill
+) def
+
+/The_letter_P
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 202 lineto
+ 250 202 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 188 lineto
+ 258 184 lineto
+ 260 182 lineto
+ 266 180 lineto
+ 282 180 lineto
+ 288 182 lineto
+ 292 184 lineto
+ 296 188 lineto
+ 298 190 lineto
+ 300 196 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 276 576 moveto
+ 380 576 lineto
+ 380 574 lineto
+ 406 574 430 566 448 548 curveto
+ 448 548 450 546 450 546 curveto
+ 466 530 476 508 476 486 curveto
+ 474 486 lineto
+ 474 464 464 442 448 426 curveto
+ 448 426 446 424 446 424 curveto
+ 428 406 404 398 378 398 curveto
+ 274 398 lineto
+ 274 354 lineto
+ 276 356 lineto
+ 392 356 lineto
+ 428 356 462 370 486 394 curveto
+ 488 394 488 394 488 396 curveto
+ 512 420 526 454 526 488 curveto
+ 524 488 lineto
+ 524 522 510 556 486 580 curveto
+ 486 582 486 582 484 582 curveto
+ 460 606 426 620 390 620 curveto
+ 390 618 lineto
+ 274 618 lineto
+ 274 574 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 284 180 lineto
+ 286 182 lineto
+ 290 186 lineto
+ 292 190 lineto
+ 294 196 lineto
+ 296 196 lineto
+ 296 202 lineto
+ 294 200 lineto
+ 294 206 lineto
+ 292 212 lineto
+ 290 216 lineto
+ 286 220 lineto
+ 284 222 lineto
+ 278 224 lineto
+ 272 224 lineto
+ 270 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 258 216 moveto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 186 lineto
+ 262 182 lineto
+ 266 180 lineto
+ 340 180 lineto
+ 342 182 lineto
+ 346 186 lineto
+ 348 190 lineto
+ 350 196 lineto
+ 352 196 lineto
+ 352 202 lineto
+ 350 200 lineto
+ 350 206 lineto
+ 348 212 lineto
+ 346 216 lineto
+ 342 220 lineto
+ 340 222 lineto
+ 334 224 lineto
+ 328 224 lineto
+ 326 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Q
+(
+newpath
+%new path
+ 368 582 moveto
+ 340 582 310 580 292 564 curveto
+ 288 560 286 556 284 552 curveto
+ 268 524 268 450 268 398 curveto
+ 270 398 lineto
+ 270 346 270 272 286 244 curveto
+ 288 240 290 236 294 232 curveto
+ 312 216 342 214 370 214 curveto
+ 370 216 lineto
+ 396 216 426 218 444 234 curveto
+ 448 238 450 242 452 246 curveto
+ 468 274 468 348 468 400 curveto
+ 466 400 lineto
+ 466 452 466 526 450 554 curveto
+ 448 558 446 562 442 566 curveto
+ 424 582 394 584 368 584 curveto
+closepath
+%end path
+%new path
+ 368 626 moveto
+ 324 626 276 626 250 600 curveto
+ 246 596 244 594 242 590 curveto
+ 218 554 218 464 218 398 curveto
+ 220 398 lineto
+ 220 332 220 242 244 206 curveto
+ 246 202 248 200 252 196 curveto
+ 278 172 326 172 370 172 curveto
+ 370 174 lineto
+ 412 174 460 174 486 198 curveto
+ 490 202 492 204 494 208 curveto
+ 518 244 518 334 518 400 curveto
+ 516 400 lineto
+ 516 466 516 556 492 592 curveto
+ 490 596 488 598 484 602 curveto
+ 458 628 410 628 368 628 curveto
+closepath
+%end path
+eofill
+%new path
+ 396 302 moveto
+ 394 302 392 304 390 304 curveto
+ 390 302 lineto
+ 362 302 lineto
+ 358 302 354 300 352 298 curveto
+ 350 296 348 292 348 288 curveto
+ 350 288 lineto
+ 350 286 350 284 352 282 curveto
+ 386 218 418 154 452 90 curveto
+ 454 88 454 86 456 86 curveto
+ 460 82 464 80 470 80 curveto
+ 470 82 lineto
+ 496 82 lineto
+ 500 82 502 84 504 86 curveto
+ 508 88 508 92 508 96 curveto
+ 506 96 lineto
+ 506 102 lineto
+ 470 168 434 232 398 300 curveto
+ 398 300 396 300 396 302 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_R
+(
+newpath
+%new path
+ 246 612 moveto
+ 244 608 lineto
+ 242 602 lineto
+ 240 602 lineto
+ 240 202 lineto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 188 lineto
+ 250 184 lineto
+ 252 182 lineto
+ 258 180 lineto
+ 274 180 lineto
+ 280 182 lineto
+ 284 184 lineto
+ 288 188 lineto
+ 290 190 lineto
+ 292 196 lineto
+ 292 602 lineto
+ 290 608 lineto
+ 288 612 lineto
+ 284 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 268 618 lineto
+ 258 618 lineto
+ 258 620 lineto
+ 252 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+closepath
+%end path
+fill
+%new path
+ 268 576 moveto
+ 348 576 lineto
+ 348 574 lineto
+ 372 574 396 566 414 552 curveto
+ 416 550 418 548 420 546 curveto
+ 434 532 442 516 442 498 curveto
+ 440 498 lineto
+ 440 478 432 462 418 448 curveto
+ 416 446 414 444 412 442 curveto
+ 394 428 370 420 346 420 curveto
+ 266 420 lineto
+ 266 376 lineto
+ 268 378 lineto
+ 354 378 lineto
+ 390 378 424 390 452 414 curveto
+ 454 416 456 418 458 418 curveto
+ 478 440 492 468 492 500 curveto
+ 490 500 lineto
+ 490 530 476 558 456 580 curveto
+ 454 580 452 582 450 584 curveto
+ 422 608 388 620 352 620 curveto
+ 352 618 lineto
+ 266 618 lineto
+ 266 574 lineto
+closepath
+%end path
+fill
+%new path
+ 338 414 moveto
+ 336 410 lineto
+ 334 404 lineto
+ 332 404 lineto
+ 332 398 lineto
+ 334 400 lineto
+ 334 394 lineto
+ 336 388 lineto
+ 338 384 lineto
+ 342 380 lineto
+ 344 378 lineto
+ 350 376 lineto
+ 352 376 lineto
+ 362 376 372 374 382 372 curveto
+ 376 374 lineto
+ 384 370 392 366 398 362 curveto
+ 398 364 lineto
+ 394 366 lineto
+ 396 364 lineto
+ 400 362 404 358 408 354 curveto
+ 410 352 lineto
+ 416 350 lineto
+ 404 358 lineto
+ 400 368 lineto
+ 402 362 lineto
+ 404 358 lineto
+ 408 354 412 350 414 346 curveto
+ 412 346 lineto
+ 410 350 lineto
+ 412 348 lineto
+ 416 344 418 338 420 332 curveto
+ 418 338 lineto
+ 420 330 422 322 422 316 curveto
+ 424 310 lineto
+ 426 308 lineto
+ 422 316 lineto
+ 426 332 lineto
+ 424 328 lineto
+ 422 322 lineto
+ 420 322 lineto
+ 420 268 lineto
+ 422 268 lineto
+ 422 262 lineto
+ 422 248 424 234 428 222 curveto
+ 426 224 lineto
+ 428 218 lineto
+ 430 216 lineto
+ 432 210 434 206 436 202 curveto
+ 438 200 lineto
+ 438 198 lineto
+ 440 196 442 192 444 190 curveto
+ 444 192 lineto
+ 448 188 lineto
+ 448 186 lineto
+ 450 184 454 182 456 182 curveto
+ 454 182 lineto
+ 458 180 lineto
+ 462 180 464 178 468 176 curveto
+ 468 178 lineto
+ 474 176 lineto
+ 474 174 lineto
+ 480 172 484 172 492 172 curveto
+ 496 172 lineto
+ 498 174 lineto
+ 500 174 504 174 508 176 curveto
+ 506 174 lineto
+ 512 176 lineto
+ 514 178 lineto
+ 516 178 520 180 522 180 curveto
+ 524 180 lineto
+ 526 182 lineto
+ 528 184 530 184 532 186 curveto
+ 530 186 lineto
+ 534 190 lineto
+ 536 190 lineto
+ 538 192 540 196 540 198 curveto
+ 540 196 lineto
+ 542 200 lineto
+ 546 206 548 210 550 216 curveto
+ 548 214 lineto
+ 550 220 lineto
+ 552 222 lineto
+ 554 230 556 238 556 248 curveto
+ 556 252 lineto
+ 554 258 lineto
+ 552 262 lineto
+ 548 266 lineto
+ 544 268 lineto
+ 538 270 lineto
+ 532 270 lineto
+ 532 268 lineto
+ 520 268 lineto
+ 522 270 lineto
+ 516 268 lineto
+ 512 266 lineto
+ 508 262 lineto
+ 506 258 lineto
+ 504 252 lineto
+ 504 240 502 230 500 222 curveto
+ 502 228 lineto
+ 500 224 498 220 496 216 curveto
+ 498 216 lineto
+ 500 220 lineto
+ 498 218 lineto
+ 496 216 496 214 494 214 curveto
+ 492 212 lineto
+ 490 206 lineto
+ 490 200 lineto
+ 494 214 lineto
+ 514 222 lineto
+ 508 222 lineto
+ 502 220 lineto
+ 498 218 lineto
+ 496 216 496 216 494 214 curveto
+ 494 216 lineto
+ 498 218 lineto
+ 496 216 lineto
+ 496 214 494 214 492 214 curveto
+ 498 216 lineto
+ 494 214 492 214 490 214 curveto
+ 490 216 lineto
+ 484 214 lineto
+ 482 212 lineto
+ 478 208 lineto
+ 496 216 lineto
+ 510 208 lineto
+ 506 212 lineto
+ 502 214 lineto
+ 496 216 lineto
+ 490 216 486 216 482 218 curveto
+ 482 216 lineto
+ 488 214 lineto
+ 488 216 lineto
+ 484 216 482 218 480 220 curveto
+ 482 218 lineto
+ 484 216 lineto
+ 484 218 lineto
+ 482 218 480 220 478 222 curveto
+ 480 220 lineto
+ 476 222 lineto
+ 470 224 lineto
+ 484 216 lineto
+ 488 208 lineto
+ 486 214 lineto
+ 484 216 lineto
+ 482 218 lineto
+ 480 220 478 222 478 224 curveto
+ 478 222 lineto
+ 480 220 lineto
+ 476 224 474 228 474 234 curveto
+ 474 232 lineto
+ 476 226 lineto
+ 476 228 lineto
+ 472 240 470 254 470 270 curveto
+ 472 268 lineto
+ 470 274 lineto
+ 468 278 lineto
+ 472 268 lineto
+ 468 254 lineto
+ 470 256 lineto
+ 472 262 lineto
+ 472 322 lineto
+ 470 324 lineto
+ 470 332 468 338 466 346 curveto
+ 468 344 lineto
+ 466 350 lineto
+ 464 352 lineto
+ 462 358 460 364 456 370 curveto
+ 456 368 lineto
+ 454 372 lineto
+ 450 376 448 380 444 384 curveto
+ 440 388 lineto
+ 436 392 430 396 426 400 curveto
+ 424 402 lineto
+ 422 402 lineto
+ 416 408 406 412 398 414 curveto
+ 392 416 lineto
+ 380 420 368 422 356 422 curveto
+ 350 422 lineto
+ 344 420 lineto
+ 342 418 lineto
+ 338 414 lineto
+closepath
+%end path
+fill
+%new path
+ 282 584 moveto
+ 284 586 lineto
+ 286 592 lineto
+ 288 594 lineto
+ 288 598 lineto
+ 286 596 lineto
+ 286 602 lineto
+ 284 608 lineto
+ 282 612 lineto
+ 278 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 262 618 lineto
+ 210 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 202 616 lineto
+ 198 612 lineto
+ 196 608 lineto
+ 194 602 lineto
+ 192 602 lineto
+ 192 598 lineto
+ 194 598 lineto
+ 194 592 lineto
+ 196 586 lineto
+ 198 584 lineto
+ 202 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 278 580 lineto
+ 282 584 lineto
+closepath
+%end path
+fill
+%new path
+ 310 584 moveto
+ 312 586 lineto
+ 314 592 lineto
+ 316 594 lineto
+ 316 598 lineto
+ 314 596 lineto
+ 314 602 lineto
+ 312 608 lineto
+ 310 612 lineto
+ 306 616 lineto
+ 304 618 lineto
+ 298 620 lineto
+ 292 620 lineto
+ 290 618 lineto
+ 262 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+ 248 608 lineto
+ 246 602 lineto
+ 246 592 lineto
+ 248 586 lineto
+ 250 584 lineto
+ 254 580 lineto
+ 258 578 lineto
+ 264 576 lineto
+ 298 576 lineto
+ 304 578 lineto
+ 306 580 lineto
+ 310 584 lineto
+closepath
+%end path
+fill
+%new path
+ 198 216 moveto
+ 196 212 lineto
+ 194 206 lineto
+ 192 206 lineto
+ 192 200 lineto
+ 194 202 lineto
+ 194 196 lineto
+ 196 190 lineto
+ 198 186 lineto
+ 202 182 lineto
+ 204 180 lineto
+ 276 180 lineto
+ 278 182 lineto
+ 282 186 lineto
+ 284 190 lineto
+ 286 196 lineto
+ 288 196 lineto
+ 288 202 lineto
+ 286 200 lineto
+ 286 206 lineto
+ 284 212 lineto
+ 282 216 lineto
+ 278 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 262 222 lineto
+ 210 222 lineto
+ 210 224 lineto
+ 204 222 lineto
+ 202 220 lineto
+ 198 216 lineto
+closepath
+%end path
+fill
+%new path
+ 250 216 moveto
+ 248 212 lineto
+ 246 206 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 186 lineto
+ 254 182 lineto
+ 258 180 lineto
+ 328 180 lineto
+ 330 182 lineto
+ 334 186 lineto
+ 336 190 lineto
+ 338 196 lineto
+ 340 196 lineto
+ 340 202 lineto
+ 338 200 lineto
+ 338 206 lineto
+ 336 212 lineto
+ 334 216 lineto
+ 330 220 lineto
+ 328 222 lineto
+ 322 224 lineto
+ 316 224 lineto
+ 314 222 lineto
+ 262 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 254 220 lineto
+ 250 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_S
+(
+newpath
+%new path
+ 352 628 moveto
+ 346 628 lineto
+ 346 626 lineto
+ 332 626 318 624 306 620 curveto
+ 300 618 lineto
+ 290 614 280 610 272 604 curveto
+ 272 606 lineto
+ 270 604 lineto
+ 268 602 lineto
+ 264 600 260 596 256 594 curveto
+ 256 592 254 590 252 588 curveto
+ 252 590 lineto
+ 248 586 lineto
+ 248 584 lineto
+ 244 580 240 574 236 570 curveto
+ 234 568 lineto
+ 234 566 lineto
+ 228 560 226 552 222 544 curveto
+ 224 546 lineto
+ 222 540 lineto
+ 220 538 lineto
+ 218 530 216 520 216 510 curveto
+ 218 512 lineto
+ 218 504 lineto
+ 218 496 220 486 222 478 curveto
+ 224 472 lineto
+ 228 464 230 456 236 450 curveto
+ 234 450 lineto
+ 236 448 lineto
+ 238 446 lineto
+ 240 440 244 436 250 432 curveto
+ 248 432 lineto
+ 252 428 lineto
+ 254 428 lineto
+ 258 422 264 418 270 414 curveto
+ 272 412 lineto
+ 274 412 lineto
+ 282 406 292 402 302 398 curveto
+ 300 398 lineto
+ 306 396 lineto
+ 308 396 lineto
+ 312 394 314 394 318 392 curveto
+ 318 392 410 372 410 372 curveto
+ 412 370 416 370 418 368 curveto
+ 418 370 lineto
+ 412 372 lineto
+ 412 370 lineto
+ 422 368 430 364 438 358 curveto
+ 438 360 lineto
+ 434 362 lineto
+ 436 360 lineto
+ 440 356 446 352 450 348 curveto
+ 452 346 lineto
+ 458 344 lineto
+ 446 352 lineto
+ 442 362 lineto
+ 444 356 lineto
+ 446 352 lineto
+ 452 346 456 342 460 336 curveto
+ 458 338 lineto
+ 456 340 lineto
+ 458 340 lineto
+ 462 332 466 324 470 316 curveto
+ 468 316 lineto
+ 466 322 lineto
+ 468 322 lineto
+ 470 312 472 302 472 292 curveto
+ 470 292 lineto
+ 472 286 lineto
+ 474 284 lineto
+ 470 292 lineto
+ 474 308 lineto
+ 472 304 lineto
+ 470 298 lineto
+ 470 286 468 276 466 266 curveto
+ 466 268 lineto
+ 468 274 lineto
+ 468 272 lineto
+ 464 264 460 256 456 250 curveto
+ 458 254 lineto
+ 458 252 lineto
+ 454 246 450 242 444 236 curveto
+ 446 238 lineto
+ 444 234 lineto
+ 442 228 lineto
+ 442 222 lineto
+ 446 238 lineto
+ 464 246 lineto
+ 458 246 lineto
+ 452 244 lineto
+ 450 242 lineto
+ 448 240 lineto
+ 444 236 438 232 434 228 curveto
+ 438 230 lineto
+ 436 230 lineto
+ 428 224 420 220 412 218 curveto
+ 418 220 lineto
+ 406 216 394 214 382 214 curveto
+ 384 216 lineto
+ 378 214 lineto
+ 374 212 lineto
+ 370 208 lineto
+ 368 204 lineto
+ 366 198 lineto
+ 366 188 lineto
+ 368 182 lineto
+ 370 180 lineto
+ 374 176 lineto
+ 378 174 lineto
+ 384 172 lineto
+ 390 172 lineto
+ 390 174 lineto
+ 404 174 416 176 428 180 curveto
+ 426 178 lineto
+ 432 180 lineto
+ 434 180 lineto
+ 444 184 452 188 460 194 curveto
+ 460 192 lineto
+ 462 194 lineto
+ 464 196 lineto
+ 470 198 474 202 480 208 curveto
+ 480 208 lineto
+ 484 212 lineto
+ 484 214 lineto
+ 490 218 494 224 498 230 curveto
+ 498 228 lineto
+ 500 232 lineto
+ 506 240 510 248 512 258 curveto
+ 512 256 lineto
+ 514 262 lineto
+ 514 264 lineto
+ 518 274 520 286 520 296 curveto
+ 520 302 lineto
+ 518 302 lineto
+ 518 314 516 324 512 334 curveto
+ 514 334 lineto
+ 512 340 lineto
+ 510 340 lineto
+ 508 350 504 358 498 366 curveto
+ 500 364 lineto
+ 498 368 lineto
+ 496 368 lineto
+ 492 374 488 380 482 386 curveto
+ 484 384 lineto
+ 480 388 lineto
+ 478 390 lineto
+ 474 394 468 400 462 404 curveto
+ 462 402 lineto
+ 460 404 lineto
+ 458 406 lineto
+ 450 410 442 416 432 418 curveto
+ 426 420 lineto
+ 422 422 418 422 416 424 curveto
+ 416 424 324 444 324 444 curveto
+ 320 446 318 446 314 448 curveto
+ 316 446 lineto
+ 322 444 lineto
+ 320 446 lineto
+ 310 448 302 452 294 458 curveto
+ 296 458 lineto
+ 298 456 lineto
+ 292 460 286 464 282 468 curveto
+ 280 470 lineto
+ 274 472 lineto
+ 286 464 lineto
+ 290 454 lineto
+ 288 460 lineto
+ 286 464 lineto
+ 282 470 278 474 274 478 curveto
+ 276 478 lineto
+ 278 474 lineto
+ 276 476 lineto
+ 272 482 268 488 266 496 curveto
+ 268 496 lineto
+ 270 490 lineto
+ 268 490 lineto
+ 266 498 264 506 264 516 curveto
+ 266 514 lineto
+ 264 520 lineto
+ 262 524 lineto
+ 266 514 lineto
+ 262 500 lineto
+ 264 502 lineto
+ 266 508 lineto
+ 266 510 lineto
+ 266 518 268 528 270 536 curveto
+ 270 534 lineto
+ 268 528 lineto
+ 268 530 lineto
+ 270 536 274 544 278 550 curveto
+ 278 548 lineto
+ 276 546 lineto
+ 280 552 284 556 288 560 curveto
+ 286 560 lineto
+ 288 562 lineto
+ 290 568 lineto
+ 290 574 lineto
+ 286 560 lineto
+ 268 552 lineto
+ 274 552 lineto
+ 280 554 lineto
+ 282 556 lineto
+ 284 556 lineto
+ 286 558 286 560 288 562 curveto
+ 292 564 296 568 300 570 curveto
+ 298 568 lineto
+ 296 566 lineto
+ 296 568 lineto
+ 304 572 312 578 322 580 curveto
+ 316 578 lineto
+ 328 582 340 584 354 584 curveto
+ 352 584 lineto
+ 358 586 lineto
+ 362 588 lineto
+ 366 592 lineto
+ 368 594 lineto
+ 370 600 lineto
+ 370 610 lineto
+ 368 616 lineto
+ 366 620 lineto
+ 362 624 lineto
+ 358 626 lineto
+ 352 628 lineto
+closepath
+%end path
+fill
+%new path
+ 502 498 moveto
+ 500 500 lineto
+ 498 510 496 520 494 530 curveto
+ 492 536 lineto
+ 488 546 482 556 478 566 curveto
+ 478 564 lineto
+ 476 568 lineto
+ 472 574 466 580 462 584 curveto
+ 458 588 lineto
+ 452 594 448 598 442 602 curveto
+ 440 604 lineto
+ 438 604 lineto
+ 430 610 420 614 410 618 curveto
+ 404 620 lineto
+ 388 626 370 628 352 628 curveto
+ 346 628 lineto
+ 340 626 lineto
+ 338 624 lineto
+ 334 620 lineto
+ 332 616 lineto
+ 330 610 lineto
+ 328 610 lineto
+ 328 606 lineto
+ 330 606 lineto
+ 330 600 lineto
+ 332 594 lineto
+ 334 592 lineto
+ 338 588 lineto
+ 340 586 lineto
+ 346 584 lineto
+ 348 582 lineto
+ 364 582 380 580 394 574 curveto
+ 392 576 lineto
+ 386 578 lineto
+ 388 576 lineto
+ 398 574 406 570 414 564 curveto
+ 414 566 lineto
+ 410 568 lineto
+ 412 566 lineto
+ 416 562 422 558 426 554 curveto
+ 428 552 lineto
+ 434 550 lineto
+ 422 558 lineto
+ 418 568 lineto
+ 420 562 lineto
+ 422 558 lineto
+ 428 552 432 548 436 542 curveto
+ 434 542 lineto
+ 432 546 lineto
+ 434 544 lineto
+ 440 536 444 526 448 516 curveto
+ 446 518 lineto
+ 444 524 lineto
+ 446 522 lineto
+ 448 512 450 502 452 492 curveto
+ 450 492 lineto
+ 452 486 lineto
+ 454 484 lineto
+ 458 480 lineto
+ 462 478 lineto
+ 468 476 lineto
+ 484 476 lineto
+ 490 478 lineto
+ 494 480 lineto
+ 498 484 lineto
+ 500 486 lineto
+ 502 492 lineto
+ 502 498 lineto
+closepath
+%end path
+fill
+%new path
+ 402 208 moveto
+ 398 212 lineto
+ 396 214 lineto
+ 390 216 lineto
+ 388 216 lineto
+ 364 216 342 220 322 226 curveto
+ 324 224 lineto
+ 330 222 lineto
+ 328 224 lineto
+ 318 228 306 232 298 238 curveto
+ 302 236 lineto
+ 300 236 lineto
+ 296 240 290 244 286 248 curveto
+ 284 250 lineto
+ 278 252 lineto
+ 290 244 lineto
+ 294 234 lineto
+ 292 240 lineto
+ 290 244 lineto
+ 286 250 282 254 278 258 curveto
+ 280 254 lineto
+ 280 256 lineto
+ 276 262 272 270 270 278 curveto
+ 270 276 lineto
+ 272 270 lineto
+ 272 272 lineto
+ 268 282 266 294 266 308 curveto
+ 268 306 lineto
+ 266 312 lineto
+ 264 316 lineto
+ 260 320 lineto
+ 256 322 lineto
+ 250 324 lineto
+ 244 324 lineto
+ 244 322 lineto
+ 234 322 lineto
+ 234 324 lineto
+ 228 322 lineto
+ 226 320 lineto
+ 222 316 lineto
+ 220 312 lineto
+ 218 306 lineto
+ 218 300 lineto
+ 218 286 220 274 224 262 curveto
+ 222 264 lineto
+ 224 258 lineto
+ 226 256 lineto
+ 228 248 232 242 236 234 curveto
+ 236 236 lineto
+ 238 232 lineto
+ 242 226 246 222 250 218 curveto
+ 254 214 lineto
+ 258 208 264 204 270 200 curveto
+ 268 202 lineto
+ 272 200 lineto
+ 272 198 lineto
+ 282 192 294 186 306 182 curveto
+ 304 184 lineto
+ 310 182 lineto
+ 312 180 lineto
+ 334 176 358 172 384 172 curveto
+ 390 172 lineto
+ 396 174 lineto
+ 398 176 lineto
+ 402 180 lineto
+ 404 182 lineto
+ 406 188 lineto
+ 408 188 lineto
+ 408 194 lineto
+ 406 192 lineto
+ 406 198 lineto
+ 404 204 lineto
+ 402 208 lineto
+closepath
+%end path
+fill
+%new path
+ 498 484 moveto
+ 500 486 lineto
+ 502 492 lineto
+ 502 610 lineto
+ 500 616 lineto
+ 498 620 lineto
+ 494 624 lineto
+ 490 626 lineto
+ 484 628 lineto
+ 478 628 lineto
+ 478 626 lineto
+ 474 626 lineto
+ 474 628 lineto
+ 468 626 lineto
+ 466 624 lineto
+ 462 620 lineto
+ 460 616 lineto
+ 458 610 lineto
+ 456 610 lineto
+ 450 590 444 570 438 552 curveto
+ 438 546 lineto
+ 440 540 lineto
+ 442 540 lineto
+ 446 532 450 524 452 516 curveto
+ 452 518 lineto
+ 450 524 lineto
+ 450 522 lineto
+ 454 512 456 502 456 492 curveto
+ 458 486 lineto
+ 460 484 lineto
+ 464 480 lineto
+ 466 478 lineto
+ 472 476 lineto
+ 484 476 lineto
+ 490 478 lineto
+ 494 480 lineto
+ 498 484 lineto
+closepath
+%end path
+fill
+%new path
+ 222 316 moveto
+ 220 312 lineto
+ 218 306 lineto
+ 216 306 lineto
+ 216 192 lineto
+ 218 194 lineto
+ 218 188 lineto
+ 220 182 lineto
+ 222 180 lineto
+ 226 176 lineto
+ 228 174 lineto
+ 234 172 lineto
+ 240 172 lineto
+ 242 174 lineto
+ 244 174 lineto
+ 244 172 lineto
+ 250 174 lineto
+ 252 176 lineto
+ 256 180 lineto
+ 258 182 lineto
+ 260 188 lineto
+ 262 188 lineto
+ 266 208 272 226 278 244 curveto
+ 278 248 lineto
+ 276 254 lineto
+ 274 256 lineto
+ 270 262 268 270 264 278 curveto
+ 266 276 lineto
+ 268 270 lineto
+ 266 272 lineto
+ 262 282 262 294 262 308 curveto
+ 262 306 lineto
+ 260 312 lineto
+ 258 316 lineto
+ 254 320 lineto
+ 252 322 lineto
+ 246 324 lineto
+ 240 324 lineto
+ 238 322 lineto
+ 234 322 lineto
+ 234 324 lineto
+ 228 322 lineto
+ 226 320 lineto
+ 222 316 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_T
+(
+newpath
+%new path
+ 348 612 moveto
+ 346 608 lineto
+ 344 602 lineto
+ 342 602 lineto
+ 342 202 lineto
+ 344 202 lineto
+ 344 196 lineto
+ 346 190 lineto
+ 348 188 lineto
+ 352 184 lineto
+ 354 182 lineto
+ 360 180 lineto
+ 376 180 lineto
+ 382 182 lineto
+ 386 184 lineto
+ 390 188 lineto
+ 392 190 lineto
+ 394 196 lineto
+ 394 602 lineto
+ 392 608 lineto
+ 390 612 lineto
+ 386 616 lineto
+ 382 618 lineto
+ 376 620 lineto
+ 370 620 lineto
+ 370 618 lineto
+ 360 618 lineto
+ 360 620 lineto
+ 354 618 lineto
+ 352 616 lineto
+ 348 612 lineto
+closepath
+%end path
+fill
+%new path
+ 506 506 moveto
+ 512 506 lineto
+ 512 508 lineto
+ 524 508 lineto
+ 522 506 lineto
+ 528 508 lineto
+ 532 510 lineto
+ 536 514 lineto
+ 538 518 lineto
+ 540 524 lineto
+ 540 602 lineto
+ 538 608 lineto
+ 536 612 lineto
+ 532 616 lineto
+ 528 618 lineto
+ 522 620 lineto
+ 516 620 lineto
+ 516 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 582 lineto
+ 356 578 lineto
+ 360 576 lineto
+ 366 574 lineto
+ 372 574 lineto
+ 372 576 lineto
+ 512 576 lineto
+ 512 574 lineto
+ 518 576 lineto
+ 520 578 lineto
+ 524 582 lineto
+ 506 574 lineto
+ 492 582 lineto
+ 496 578 lineto
+ 500 576 lineto
+ 506 574 lineto
+ 492 582 lineto
+ 488 592 lineto
+ 490 586 lineto
+ 492 582 lineto
+ 488 592 lineto
+ 492 606 lineto
+ 490 604 lineto
+ 488 598 lineto
+ 488 524 lineto
+ 490 518 lineto
+ 492 514 lineto
+ 496 510 lineto
+ 500 508 lineto
+ 506 506 lineto
+closepath
+%end path
+fill
+%new path
+ 244 514 moveto
+ 246 518 lineto
+ 248 524 lineto
+ 248 598 lineto
+ 244 582 lineto
+ 224 574 lineto
+ 230 574 lineto
+ 232 576 lineto
+ 372 576 lineto
+ 372 574 lineto
+ 378 576 lineto
+ 380 578 lineto
+ 384 582 lineto
+ 386 586 lineto
+ 388 592 lineto
+ 390 592 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 214 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 196 602 lineto
+ 196 528 lineto
+ 198 530 lineto
+ 198 524 lineto
+ 200 518 lineto
+ 202 514 lineto
+ 206 510 lineto
+ 208 508 lineto
+ 214 506 lineto
+ 220 506 lineto
+ 222 508 lineto
+ 232 508 lineto
+ 230 506 lineto
+ 236 508 lineto
+ 240 510 lineto
+ 244 514 lineto
+closepath
+%end path
+fill
+%new path
+ 280 216 moveto
+ 278 212 lineto
+ 276 206 lineto
+ 276 196 lineto
+ 278 190 lineto
+ 280 186 lineto
+ 284 182 lineto
+ 288 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 292 222 lineto
+ 294 224 lineto
+ 288 222 lineto
+ 284 220 lineto
+ 280 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 448 180 lineto
+ 452 182 lineto
+ 456 186 lineto
+ 458 190 lineto
+ 460 196 lineto
+ 460 206 lineto
+ 458 212 lineto
+ 456 216 lineto
+ 452 220 lineto
+ 448 222 lineto
+ 442 224 lineto
+ 436 224 lineto
+ 436 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+%new path
+ 384 584 moveto
+ 386 586 lineto
+ 388 592 lineto
+ 390 594 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 336 618 lineto
+ 336 620 lineto
+ 330 618 lineto
+ 328 616 lineto
+ 324 612 lineto
+ 322 608 lineto
+ 320 602 lineto
+ 318 602 lineto
+ 318 598 lineto
+ 320 598 lineto
+ 320 592 lineto
+ 322 586 lineto
+ 324 584 lineto
+ 328 580 lineto
+ 330 578 lineto
+ 336 576 lineto
+ 372 576 lineto
+ 378 578 lineto
+ 380 580 lineto
+ 384 584 lineto
+closepath
+%end path
+fill
+%new path
+ 412 584 moveto
+ 414 586 lineto
+ 416 592 lineto
+ 418 594 lineto
+ 418 598 lineto
+ 416 596 lineto
+ 416 602 lineto
+ 414 608 lineto
+ 412 612 lineto
+ 408 616 lineto
+ 406 618 lineto
+ 400 620 lineto
+ 394 620 lineto
+ 392 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 584 lineto
+ 356 580 lineto
+ 360 578 lineto
+ 366 576 lineto
+ 400 576 lineto
+ 406 578 lineto
+ 408 580 lineto
+ 412 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_U
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 328 lineto
+ 250 328 lineto
+ 250 322 lineto
+ 252 316 lineto
+ 254 314 lineto
+ 258 310 lineto
+ 260 308 lineto
+ 266 306 lineto
+ 282 306 lineto
+ 288 308 lineto
+ 292 310 lineto
+ 296 314 lineto
+ 298 316 lineto
+ 300 322 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 282 346 moveto
+ 276 346 lineto
+ 276 344 lineto
+ 266 344 lineto
+ 266 346 lineto
+ 260 344 lineto
+ 258 342 lineto
+ 254 338 lineto
+ 252 334 lineto
+ 250 328 lineto
+ 250 322 lineto
+ 250 304 252 288 258 272 curveto
+ 256 274 lineto
+ 258 268 lineto
+ 260 266 lineto
+ 264 254 270 244 276 234 curveto
+ 278 232 lineto
+ 278 230 lineto
+ 282 226 284 222 288 218 curveto
+ 290 216 292 212 294 210 curveto
+ 294 212 lineto
+ 298 208 lineto
+ 298 206 lineto
+ 304 200 310 196 316 192 curveto
+ 318 190 lineto
+ 320 190 lineto
+ 328 184 336 180 344 180 curveto
+ 350 178 lineto
+ 360 174 372 172 382 172 curveto
+ 388 172 lineto
+ 388 174 lineto
+ 398 174 410 176 420 180 curveto
+ 418 178 lineto
+ 424 180 lineto
+ 426 180 lineto
+ 434 182 442 186 450 192 curveto
+ 450 190 lineto
+ 452 192 lineto
+ 454 194 lineto
+ 460 198 466 202 472 208 curveto
+ 470 208 lineto
+ 474 212 lineto
+ 476 212 lineto
+ 478 214 480 218 482 220 curveto
+ 486 224 488 228 492 232 curveto
+ 490 232 lineto
+ 492 234 lineto
+ 494 236 lineto
+ 500 246 506 256 510 268 curveto
+ 512 274 lineto
+ 518 290 520 306 520 324 curveto
+ 520 602 lineto
+ 518 608 lineto
+ 516 612 lineto
+ 512 616 lineto
+ 508 618 lineto
+ 502 620 lineto
+ 496 620 lineto
+ 496 618 lineto
+ 484 618 lineto
+ 486 620 lineto
+ 480 618 lineto
+ 476 616 lineto
+ 472 612 lineto
+ 470 608 lineto
+ 468 602 lineto
+ 468 328 lineto
+ 468 310 466 294 460 278 curveto
+ 462 278 lineto
+ 464 284 lineto
+ 462 284 lineto
+ 458 272 452 260 446 250 curveto
+ 448 252 lineto
+ 450 254 lineto
+ 448 254 lineto
+ 446 250 444 248 442 244 curveto
+ 438 242 436 238 432 236 curveto
+ 434 236 lineto
+ 432 234 lineto
+ 430 228 lineto
+ 430 222 lineto
+ 434 236 lineto
+ 452 244 lineto
+ 446 244 lineto
+ 440 242 lineto
+ 438 240 lineto
+ 436 240 lineto
+ 432 234 426 230 420 226 curveto
+ 422 226 lineto
+ 424 228 lineto
+ 416 222 408 220 400 216 curveto
+ 402 218 lineto
+ 408 220 lineto
+ 406 218 lineto
+ 398 216 390 214 380 214 curveto
+ 382 216 lineto
+ 376 214 lineto
+ 372 212 lineto
+ 368 208 lineto
+ 388 216 lineto
+ 400 208 lineto
+ 396 212 lineto
+ 394 214 lineto
+ 388 216 lineto
+ 386 216 lineto
+ 376 216 368 218 360 220 curveto
+ 366 218 lineto
+ 358 222 350 224 342 230 curveto
+ 344 228 lineto
+ 346 226 lineto
+ 346 228 lineto
+ 340 232 334 236 330 242 curveto
+ 330 240 lineto
+ 328 242 lineto
+ 322 244 lineto
+ 334 236 lineto
+ 338 228 lineto
+ 336 234 lineto
+ 334 236 lineto
+ 334 238 lineto
+ 330 240 328 244 324 246 curveto
+ 322 250 320 252 318 256 curveto
+ 318 254 lineto
+ 320 252 lineto
+ 314 262 308 274 304 286 curveto
+ 304 284 lineto
+ 306 278 lineto
+ 306 280 lineto
+ 300 296 298 312 298 330 curveto
+ 300 328 lineto
+ 298 334 lineto
+ 296 338 lineto
+ 292 342 lineto
+ 288 344 lineto
+ 282 346 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 346 584 moveto
+ 348 586 lineto
+ 350 592 lineto
+ 352 594 lineto
+ 352 598 lineto
+ 350 596 lineto
+ 350 602 lineto
+ 348 608 lineto
+ 346 612 lineto
+ 342 616 lineto
+ 340 618 lineto
+ 334 620 lineto
+ 328 620 lineto
+ 326 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 334 576 lineto
+ 340 578 lineto
+ 342 580 lineto
+ 346 584 lineto
+closepath
+%end path
+fill
+%new path
+ 510 584 moveto
+ 512 586 lineto
+ 514 592 lineto
+ 514 602 lineto
+ 512 608 lineto
+ 510 612 lineto
+ 506 616 lineto
+ 502 618 lineto
+ 496 620 lineto
+ 490 620 lineto
+ 490 618 lineto
+ 434 618 lineto
+ 434 620 lineto
+ 428 618 lineto
+ 426 616 lineto
+ 422 612 lineto
+ 420 608 lineto
+ 418 602 lineto
+ 416 602 lineto
+ 416 598 lineto
+ 418 598 lineto
+ 418 592 lineto
+ 420 586 lineto
+ 422 584 lineto
+ 426 580 lineto
+ 428 578 lineto
+ 434 576 lineto
+ 496 576 lineto
+ 502 578 lineto
+ 506 580 lineto
+ 510 584 lineto
+closepath
+%end path
+fill
+%new path
+ 566 584 moveto
+ 568 586 lineto
+ 570 592 lineto
+ 570 602 lineto
+ 568 608 lineto
+ 566 612 lineto
+ 562 616 lineto
+ 558 618 lineto
+ 552 620 lineto
+ 546 620 lineto
+ 546 618 lineto
+ 490 618 lineto
+ 490 620 lineto
+ 484 618 lineto
+ 482 616 lineto
+ 478 612 lineto
+ 476 608 lineto
+ 474 602 lineto
+ 472 602 lineto
+ 472 598 lineto
+ 474 598 lineto
+ 474 592 lineto
+ 476 586 lineto
+ 478 584 lineto
+ 482 580 lineto
+ 484 578 lineto
+ 490 576 lineto
+ 552 576 lineto
+ 558 578 lineto
+ 562 580 lineto
+ 566 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_V
+(
+newpath
+%new path
+ 370 230 moveto
+ 370 252 428 476 458 600 curveto
+ 460 604 462 608 466 612 curveto
+ 470 618 478 620 484 620 curveto
+ 494 620 lineto
+ 494 618 lineto
+ 500 618 504 616 506 614 curveto
+ 510 610 510 606 510 602 curveto
+ 508 602 lineto
+ 508 598 lineto
+ 474 462 440 328 404 192 curveto
+ 404 188 402 184 398 180 curveto
+ 394 176 386 174 380 174 curveto
+ 354 174 lineto
+ 354 176 lineto
+ 348 176 340 178 336 182 curveto
+ 332 186 330 190 330 194 curveto
+ 294 330 260 464 226 600 curveto
+ 226 604 lineto
+ 228 604 lineto
+ 228 608 228 612 232 616 curveto
+ 234 618 238 620 244 620 curveto
+ 254 620 lineto
+ 254 618 lineto
+ 260 618 268 616 272 610 curveto
+ 276 606 278 602 280 598 curveto
+ 310 474 368 250 368 228 curveto
+ 368 230 lineto
+ 370 230 lineto
+closepath
+%end path
+fill
+%new path
+ 270 584 moveto
+ 272 586 lineto
+ 274 592 lineto
+ 274 598 lineto
+ 272 600 lineto
+ 272 602 lineto
+ 270 608 lineto
+ 268 612 lineto
+ 264 616 lineto
+ 262 618 lineto
+ 256 620 lineto
+ 250 620 lineto
+ 248 618 lineto
+ 208 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 256 576 lineto
+ 262 578 lineto
+ 266 580 lineto
+ 270 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 248 618 lineto
+ 250 620 lineto
+ 244 618 lineto
+ 240 616 lineto
+ 236 612 lineto
+ 234 608 lineto
+ 232 602 lineto
+ 232 596 lineto
+ 234 596 lineto
+ 234 592 lineto
+ 236 586 lineto
+ 238 584 lineto
+ 242 580 lineto
+ 244 578 lineto
+ 250 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 498 584 moveto
+ 500 586 lineto
+ 502 592 lineto
+ 504 594 lineto
+ 504 602 lineto
+ 502 608 lineto
+ 500 612 lineto
+ 496 616 lineto
+ 492 618 lineto
+ 486 620 lineto
+ 480 620 lineto
+ 480 618 lineto
+ 428 618 lineto
+ 428 620 lineto
+ 422 618 lineto
+ 420 616 lineto
+ 416 612 lineto
+ 414 608 lineto
+ 412 602 lineto
+ 410 602 lineto
+ 410 598 lineto
+ 412 598 lineto
+ 412 592 lineto
+ 414 586 lineto
+ 416 584 lineto
+ 420 580 lineto
+ 422 578 lineto
+ 428 576 lineto
+ 486 576 lineto
+ 492 578 lineto
+ 494 580 lineto
+ 498 584 lineto
+closepath
+%end path
+fill
+%new path
+ 540 584 moveto
+ 542 586 lineto
+ 544 592 lineto
+ 544 602 lineto
+ 542 608 lineto
+ 540 612 lineto
+ 536 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 520 618 lineto
+ 480 618 lineto
+ 480 620 lineto
+ 474 618 lineto
+ 472 616 lineto
+ 468 612 lineto
+ 466 608 lineto
+ 464 602 lineto
+ 462 602 lineto
+ 462 592 lineto
+ 464 586 lineto
+ 466 584 lineto
+ 470 580 lineto
+ 474 578 lineto
+ 480 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 536 580 lineto
+ 540 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_W
+(
+newpath
+%new path
+ 274 180 moveto
+ 280 176 284 174 292 174 curveto
+ 292 176 lineto
+ 300 176 lineto
+ 308 176 314 178 320 182 curveto
+ 322 184 324 190 326 194 curveto
+ 342 260 368 376 368 394 curveto
+ 370 394 lineto
+ 370 392 lineto
+ 370 374 396 258 412 192 curveto
+ 414 188 416 182 418 180 curveto
+ 424 176 430 174 438 174 curveto
+ 438 176 lineto
+ 446 176 lineto
+ 454 176 458 178 464 180 curveto
+ 466 184 470 188 470 194 curveto
+ 488 330 508 464 526 600 curveto
+ 526 602 lineto
+ 524 602 lineto
+ 524 608 522 612 520 614 curveto
+ 516 618 512 620 506 620 curveto
+ 506 618 lineto
+ 500 618 494 616 490 612 curveto
+ 486 608 484 604 484 598 curveto
+ 466 474 438 262 438 228 curveto
+ 436 228 lineto
+ 436 230 lineto
+ 436 260 412 360 398 424 curveto
+ 396 428 394 434 390 436 curveto
+ 386 442 380 444 372 444 curveto
+ 372 442 lineto
+ 362 442 lineto
+ 354 442 348 440 344 434 curveto
+ 340 432 338 426 336 422 curveto
+ 322 358 298 258 298 228 curveto
+ 296 228 lineto
+ 296 230 lineto
+ 296 264 268 476 250 600 curveto
+ 250 606 248 610 244 614 curveto
+ 240 618 234 620 228 620 curveto
+ 228 618 lineto
+ 222 618 218 616 214 612 curveto
+ 212 610 210 606 210 600 curveto
+ 212 600 lineto
+ 212 598 lineto
+ 230 462 250 328 268 192 curveto
+ 268 186 272 182 274 180 curveto
+closepath
+%end path
+fill
+%new path
+ 248 584 moveto
+ 250 586 lineto
+ 252 592 lineto
+ 252 598 lineto
+ 250 600 lineto
+ 250 604 lineto
+ 252 602 lineto
+ 250 608 lineto
+ 248 612 lineto
+ 244 616 lineto
+ 240 618 lineto
+ 234 620 lineto
+ 228 620 lineto
+ 228 618 lineto
+ 204 618 lineto
+ 204 620 lineto
+ 198 618 lineto
+ 196 616 lineto
+ 192 612 lineto
+ 190 608 lineto
+ 188 602 lineto
+ 186 602 lineto
+ 186 598 lineto
+ 188 598 lineto
+ 188 592 lineto
+ 190 586 lineto
+ 192 584 lineto
+ 196 580 lineto
+ 198 578 lineto
+ 204 576 lineto
+ 234 576 lineto
+ 240 578 lineto
+ 244 580 lineto
+ 248 584 lineto
+closepath
+%end path
+fill
+%new path
+ 298 584 moveto
+ 300 586 lineto
+ 302 592 lineto
+ 304 594 lineto
+ 304 598 lineto
+ 302 596 lineto
+ 302 602 lineto
+ 300 608 lineto
+ 298 612 lineto
+ 294 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 278 618 lineto
+ 228 618 lineto
+ 228 620 lineto
+ 222 618 lineto
+ 220 616 lineto
+ 216 612 lineto
+ 214 608 lineto
+ 212 602 lineto
+ 212 592 lineto
+ 214 586 lineto
+ 216 584 lineto
+ 220 580 lineto
+ 222 578 lineto
+ 228 576 lineto
+ 286 576 lineto
+ 292 578 lineto
+ 294 580 lineto
+ 298 584 lineto
+closepath
+%end path
+fill
+%new path
+ 520 584 moveto
+ 522 586 lineto
+ 524 592 lineto
+ 526 594 lineto
+ 526 598 lineto
+ 524 596 lineto
+ 524 602 lineto
+ 522 608 lineto
+ 520 612 lineto
+ 516 616 lineto
+ 514 618 lineto
+ 508 620 lineto
+ 502 620 lineto
+ 500 618 lineto
+ 450 618 lineto
+ 450 620 lineto
+ 444 618 lineto
+ 442 616 lineto
+ 438 612 lineto
+ 436 608 lineto
+ 434 602 lineto
+ 432 602 lineto
+ 432 598 lineto
+ 434 598 lineto
+ 434 592 lineto
+ 436 586 lineto
+ 438 584 lineto
+ 442 580 lineto
+ 444 578 lineto
+ 450 576 lineto
+ 508 576 lineto
+ 514 578 lineto
+ 516 580 lineto
+ 520 584 lineto
+closepath
+%end path
+fill
+%new path
+ 544 584 moveto
+ 546 586 lineto
+ 548 592 lineto
+ 550 594 lineto
+ 550 598 lineto
+ 548 596 lineto
+ 548 602 lineto
+ 546 608 lineto
+ 544 612 lineto
+ 540 616 lineto
+ 538 618 lineto
+ 532 620 lineto
+ 526 620 lineto
+ 524 618 lineto
+ 500 618 lineto
+ 502 620 lineto
+ 496 618 lineto
+ 492 616 lineto
+ 488 612 lineto
+ 486 608 lineto
+ 484 602 lineto
+ 484 592 lineto
+ 486 586 lineto
+ 488 584 lineto
+ 492 580 lineto
+ 496 578 lineto
+ 502 576 lineto
+ 532 576 lineto
+ 538 578 lineto
+ 540 580 lineto
+ 544 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_X
+(
+newpath
+%new path
+ 286 614 moveto
+ 282 618 278 620 272 620 curveto
+ 272 618 lineto
+ 250 618 lineto
+ 246 618 244 616 240 614 curveto
+ 238 612 236 608 236 604 curveto
+ 238 604 lineto
+ 238 602 240 600 240 598 curveto
+ 274 536 306 474 340 412 curveto
+ 338 412 lineto
+ 302 340 266 270 230 198 curveto
+ 230 192 lineto
+ 232 192 lineto
+ 232 188 232 184 236 182 curveto
+ 238 180 242 180 244 180 curveto
+ 268 180 lineto
+ 272 180 276 182 280 186 curveto
+ 280 186 282 188 282 190 curveto
+ 310 248 338 306 366 364 curveto
+ 366 362 lineto
+ 394 304 424 246 454 188 curveto
+ 454 186 456 184 458 184 curveto
+ 460 180 466 180 470 180 curveto
+ 492 180 lineto
+ 496 180 500 182 502 184 curveto
+ 504 186 506 190 506 194 curveto
+ 504 194 lineto
+ 504 196 504 198 502 200 curveto
+ 464 272 426 342 388 414 curveto
+ 390 414 lineto
+ 422 476 452 538 484 600 curveto
+ 484 602 486 604 486 606 curveto
+ 484 606 lineto
+ 484 610 482 614 478 616 curveto
+ 476 618 474 620 470 620 curveto
+ 470 618 lineto
+ 448 618 lineto
+ 442 618 438 616 434 612 curveto
+ 434 612 432 610 432 608 curveto
+ 408 562 386 516 364 470 curveto
+ 364 472 lineto
+ 338 518 314 564 290 610 curveto
+ 288 612 288 614 286 614 curveto
+closepath
+%end path
+fill
+%new path
+ 286 584 moveto
+ 288 586 lineto
+ 290 592 lineto
+ 290 598 lineto
+ 288 604 lineto
+ 286 606 lineto
+ 286 606 286 608 284 610 curveto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 222 618 lineto
+ 224 620 lineto
+ 218 618 lineto
+ 214 616 lineto
+ 210 612 lineto
+ 208 608 lineto
+ 206 602 lineto
+ 206 592 lineto
+ 208 586 lineto
+ 210 584 lineto
+ 214 580 lineto
+ 218 578 lineto
+ 224 576 lineto
+ 272 576 lineto
+ 278 578 lineto
+ 282 580 lineto
+ 286 584 lineto
+closepath
+%end path
+fill
+%new path
+ 336 584 moveto
+ 338 586 lineto
+ 340 592 lineto
+ 342 594 lineto
+ 342 598 lineto
+ 340 596 lineto
+ 340 602 lineto
+ 338 608 lineto
+ 336 612 lineto
+ 332 616 lineto
+ 330 618 lineto
+ 324 620 lineto
+ 318 620 lineto
+ 316 618 lineto
+ 264 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 256 616 lineto
+ 252 612 lineto
+ 250 608 lineto
+ 248 602 lineto
+ 248 596 lineto
+ 250 590 lineto
+ 252 588 252 586 252 586 curveto
+ 254 584 lineto
+ 258 580 lineto
+ 260 578 lineto
+ 266 576 lineto
+ 324 576 lineto
+ 330 578 lineto
+ 332 580 lineto
+ 336 584 lineto
+closepath
+%end path
+fill
+%new path
+ 408 216 moveto
+ 406 212 lineto
+ 404 206 lineto
+ 402 206 lineto
+ 402 200 lineto
+ 404 202 lineto
+ 404 196 lineto
+ 406 190 lineto
+ 408 186 lineto
+ 412 182 lineto
+ 414 180 lineto
+ 484 180 lineto
+ 488 182 lineto
+ 492 186 lineto
+ 494 190 lineto
+ 496 196 lineto
+ 496 202 lineto
+ 494 208 lineto
+ 492 208 lineto
+ 492 210 492 212 490 214 curveto
+ 492 212 lineto
+ 490 216 lineto
+ 486 220 lineto
+ 482 222 lineto
+ 476 224 lineto
+ 470 224 lineto
+ 470 222 lineto
+ 420 222 lineto
+ 420 224 lineto
+ 414 222 lineto
+ 412 220 lineto
+ 408 216 lineto
+closepath
+%end path
+fill
+%new path
+ 458 216 moveto
+ 456 212 lineto
+ 454 206 lineto
+ 454 200 lineto
+ 456 194 lineto
+ 458 192 458 190 458 188 curveto
+ 458 190 lineto
+ 460 186 lineto
+ 464 182 lineto
+ 466 180 lineto
+ 526 180 lineto
+ 528 182 lineto
+ 532 186 lineto
+ 534 190 lineto
+ 536 196 lineto
+ 538 196 lineto
+ 538 202 lineto
+ 536 200 lineto
+ 536 206 lineto
+ 534 212 lineto
+ 532 216 lineto
+ 528 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 512 222 lineto
+ 470 222 lineto
+ 470 224 lineto
+ 464 222 lineto
+ 462 220 lineto
+ 458 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 584 moveto
+ 472 586 lineto
+ 472 588 lineto
+ 472 588 474 590 474 592 curveto
+ 472 590 lineto
+ 474 596 lineto
+ 474 602 lineto
+ 472 608 lineto
+ 470 612 lineto
+ 466 616 lineto
+ 464 618 lineto
+ 458 620 lineto
+ 452 620 lineto
+ 450 618 lineto
+ 398 618 lineto
+ 400 620 lineto
+ 394 618 lineto
+ 390 616 lineto
+ 386 612 lineto
+ 384 608 lineto
+ 382 602 lineto
+ 382 592 lineto
+ 384 586 lineto
+ 386 584 lineto
+ 390 580 lineto
+ 394 578 lineto
+ 400 576 lineto
+ 456 576 lineto
+ 462 578 lineto
+ 466 580 lineto
+ 470 584 lineto
+closepath
+%end path
+fill
+%new path
+ 512 584 moveto
+ 514 586 lineto
+ 516 592 lineto
+ 516 602 lineto
+ 514 608 lineto
+ 512 612 lineto
+ 508 616 lineto
+ 504 618 lineto
+ 498 620 lineto
+ 492 620 lineto
+ 492 618 lineto
+ 450 618 lineto
+ 452 620 lineto
+ 446 618 lineto
+ 442 616 lineto
+ 438 612 lineto
+ 436 608 lineto
+ 436 606 434 604 434 604 curveto
+ 436 604 lineto
+ 434 598 lineto
+ 434 592 lineto
+ 436 586 lineto
+ 438 584 lineto
+ 442 580 lineto
+ 444 578 lineto
+ 450 576 lineto
+ 498 576 lineto
+ 504 578 lineto
+ 508 580 lineto
+ 512 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 268 180 lineto
+ 272 182 lineto
+ 276 186 lineto
+ 278 190 lineto
+ 278 192 280 194 280 196 curveto
+ 280 194 lineto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 270 222 lineto
+ 264 224 lineto
+ 258 224 lineto
+ 258 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 212 lineto
+ 242 210 240 208 240 206 curveto
+ 242 208 lineto
+ 240 202 lineto
+ 240 196 lineto
+ 242 190 lineto
+ 244 186 lineto
+ 248 182 lineto
+ 250 180 lineto
+ 320 180 lineto
+ 324 182 lineto
+ 328 186 lineto
+ 330 190 lineto
+ 332 196 lineto
+ 332 206 lineto
+ 330 212 lineto
+ 328 216 lineto
+ 324 220 lineto
+ 320 222 lineto
+ 314 224 lineto
+ 308 224 lineto
+ 308 222 lineto
+ 258 222 lineto
+ 258 224 lineto
+ 252 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Y
+(
+newpath
+%new path
+ 370 406 moveto
+ 370 422 424 536 456 600 curveto
+ 458 604 460 606 462 610 curveto
+ 470 616 478 620 488 620 curveto
+ 500 620 lineto
+ 500 618 lineto
+ 502 618 506 616 508 614 curveto
+ 512 612 512 608 512 604 curveto
+ 510 604 lineto
+ 510 598 lineto
+ 470 516 432 436 392 354 curveto
+ 392 198 lineto
+ 392 192 390 188 386 184 curveto
+ 382 180 378 180 372 180 curveto
+ 362 180 lineto
+ 356 180 352 182 348 186 curveto
+ 344 190 342 194 342 200 curveto
+ 344 200 lineto
+ 344 356 lineto
+ 342 356 lineto
+ 302 438 264 518 224 600 curveto
+ 224 602 222 604 222 606 curveto
+ 224 606 lineto
+ 224 610 226 614 230 616 curveto
+ 232 618 236 620 238 620 curveto
+ 250 620 lineto
+ 250 618 lineto
+ 260 618 268 614 276 608 curveto
+ 278 604 280 602 282 598 curveto
+ 314 534 368 420 368 404 curveto
+ 368 406 lineto
+ 370 406 lineto
+closepath
+%end path
+fill
+%new path
+ 272 584 moveto
+ 274 586 lineto
+ 276 592 lineto
+ 276 598 lineto
+ 274 604 lineto
+ 272 606 lineto
+ 272 606 270 608 270 610 curveto
+ 272 608 lineto
+ 270 612 lineto
+ 266 616 lineto
+ 262 618 lineto
+ 256 620 lineto
+ 250 620 lineto
+ 250 618 lineto
+ 208 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 258 576 lineto
+ 264 578 lineto
+ 268 580 lineto
+ 272 584 lineto
+closepath
+%end path
+fill
+%new path
+ 322 584 moveto
+ 324 586 lineto
+ 326 592 lineto
+ 326 602 lineto
+ 324 608 lineto
+ 322 612 lineto
+ 318 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 302 618 lineto
+ 250 618 lineto
+ 250 620 lineto
+ 244 618 lineto
+ 242 616 lineto
+ 238 612 lineto
+ 236 608 lineto
+ 234 602 lineto
+ 234 596 lineto
+ 236 590 lineto
+ 236 588 238 586 238 586 curveto
+ 240 584 lineto
+ 244 580 lineto
+ 246 578 lineto
+ 252 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 318 580 lineto
+ 322 584 lineto
+closepath
+%end path
+fill
+%new path
+ 496 584 moveto
+ 498 586 lineto
+ 500 588 lineto
+ 500 588 502 590 502 592 curveto
+ 500 590 lineto
+ 502 596 lineto
+ 502 602 lineto
+ 500 608 lineto
+ 498 612 lineto
+ 494 616 lineto
+ 492 618 lineto
+ 486 620 lineto
+ 480 620 lineto
+ 478 618 lineto
+ 426 618 lineto
+ 428 620 lineto
+ 422 618 lineto
+ 418 616 lineto
+ 414 612 lineto
+ 412 608 lineto
+ 410 602 lineto
+ 410 592 lineto
+ 412 586 lineto
+ 414 584 lineto
+ 418 580 lineto
+ 422 578 lineto
+ 428 576 lineto
+ 484 576 lineto
+ 490 578 lineto
+ 492 580 lineto
+ 496 584 lineto
+closepath
+%end path
+fill
+%new path
+ 540 584 moveto
+ 542 586 lineto
+ 544 592 lineto
+ 544 602 lineto
+ 542 608 lineto
+ 540 612 lineto
+ 536 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 520 618 lineto
+ 478 618 lineto
+ 480 620 lineto
+ 474 618 lineto
+ 470 616 lineto
+ 466 612 lineto
+ 464 608 lineto
+ 464 606 462 604 462 604 curveto
+ 460 598 lineto
+ 460 592 lineto
+ 462 586 lineto
+ 464 584 lineto
+ 468 580 lineto
+ 472 578 lineto
+ 478 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 536 580 lineto
+ 540 584 lineto
+closepath
+%end path
+fill
+%new path
+ 300 216 moveto
+ 298 212 lineto
+ 296 206 lineto
+ 294 206 lineto
+ 294 200 lineto
+ 296 202 lineto
+ 296 196 lineto
+ 298 190 lineto
+ 300 186 lineto
+ 304 182 lineto
+ 306 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 312 222 lineto
+ 312 224 lineto
+ 306 222 lineto
+ 304 220 lineto
+ 300 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 430 180 lineto
+ 432 182 lineto
+ 436 186 lineto
+ 438 190 lineto
+ 440 196 lineto
+ 442 196 lineto
+ 442 202 lineto
+ 440 200 lineto
+ 440 206 lineto
+ 438 212 lineto
+ 436 216 lineto
+ 432 220 lineto
+ 430 222 lineto
+ 424 224 lineto
+ 418 224 lineto
+ 416 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Z
+(
+newpath
+%new path
+ 474 618 moveto
+ 474 612 476 606 478 600 curveto
+ 476 600 lineto
+ 476 600 216 220 216 220 curveto
+ 214 216 212 212 212 208 curveto
+ 212 198 lineto
+ 214 198 lineto
+ 214 192 216 188 220 184 curveto
+ 224 180 228 180 234 180 curveto
+ 262 180 lineto
+ 262 186 260 192 258 198 curveto
+ 260 198 lineto
+ 260 198 520 578 520 578 curveto
+ 522 582 524 586 524 590 curveto
+ 524 600 lineto
+ 522 600 lineto
+ 522 606 520 610 516 614 curveto
+ 512 618 508 620 502 620 curveto
+ 502 618 lineto
+ 472 618 lineto
+closepath
+%end path
+fill
+%new path
+ 268 514 moveto
+ 270 518 lineto
+ 272 524 lineto
+ 272 598 lineto
+ 268 582 lineto
+ 248 574 lineto
+ 254 574 lineto
+ 256 576 lineto
+ 502 576 lineto
+ 500 574 lineto
+ 506 576 lineto
+ 510 578 lineto
+ 514 582 lineto
+ 516 586 lineto
+ 518 592 lineto
+ 518 602 lineto
+ 516 608 lineto
+ 514 612 lineto
+ 510 616 lineto
+ 506 618 lineto
+ 500 620 lineto
+ 494 620 lineto
+ 494 618 lineto
+ 238 618 lineto
+ 238 620 lineto
+ 232 618 lineto
+ 230 616 lineto
+ 226 612 lineto
+ 224 608 lineto
+ 222 602 lineto
+ 220 602 lineto
+ 220 528 lineto
+ 222 530 lineto
+ 222 524 lineto
+ 224 518 lineto
+ 226 514 lineto
+ 230 510 lineto
+ 232 508 lineto
+ 238 506 lineto
+ 244 506 lineto
+ 246 508 lineto
+ 256 508 lineto
+ 254 506 lineto
+ 260 508 lineto
+ 264 510 lineto
+ 268 514 lineto
+closepath
+%end path
+fill
+%new path
+ 480 298 moveto
+ 478 294 lineto
+ 476 288 lineto
+ 476 200 lineto
+ 480 216 lineto
+ 500 224 lineto
+ 494 224 lineto
+ 492 222 lineto
+ 234 222 lineto
+ 236 224 lineto
+ 230 222 lineto
+ 226 220 lineto
+ 222 216 lineto
+ 220 212 lineto
+ 218 206 lineto
+ 218 196 lineto
+ 220 190 lineto
+ 222 188 lineto
+ 226 184 lineto
+ 230 182 lineto
+ 236 180 lineto
+ 510 180 lineto
+ 516 182 lineto
+ 520 184 lineto
+ 524 188 lineto
+ 526 190 lineto
+ 528 196 lineto
+ 528 288 lineto
+ 526 294 lineto
+ 524 298 lineto
+ 520 302 lineto
+ 516 304 lineto
+ 510 306 lineto
+ 504 306 lineto
+ 504 304 lineto
+ 492 304 lineto
+ 494 306 lineto
+ 488 304 lineto
+ 484 302 lineto
+ 480 298 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /The_letter_A put
+Encoding 66 /The_letter_B put
+Encoding 67 /The_letter_C put
+Encoding 68 /The_letter_D put
+Encoding 69 /The_letter_E put
+Encoding 70 /The_letter_F put
+Encoding 71 /The_letter_G put
+Encoding 72 /The_letter_H put
+Encoding 73 /The_letter_I put
+Encoding 74 /The_letter_J put
+Encoding 75 /The_letter_K put
+Encoding 76 /The_letter_L put
+Encoding 77 /The_letter_M put
+Encoding 78 /The_letter_N put
+Encoding 79 /The_letter_O put
+Encoding 80 /The_letter_P put
+Encoding 81 /The_letter_Q put
+Encoding 82 /The_letter_R put
+Encoding 83 /The_letter_S put
+Encoding 84 /The_letter_T put
+Encoding 85 /The_letter_U put
+Encoding 86 /The_letter_V put
+Encoding 87 /The_letter_W put
+Encoding 88 /The_letter_X put
+Encoding 89 /The_letter_Y put
+Encoding 90 /The_letter_Z put
+
+Metrics
+ begin
+/The_letter_A 353 fudge add def
+/The_letter_B 343 fudge add def
+/The_letter_C 343 fudge add def
+/The_letter_D 345 fudge add def
+/The_letter_E 357 fudge add def
+/The_letter_F 349 fudge add def
+/The_letter_G 353 fudge add def
+/The_letter_H 359 fudge add def
+/The_letter_I 317 fudge add def
+/The_letter_J 339 fudge add def
+/The_letter_K 353 fudge add def
+/The_letter_L 347 fudge add def
+/The_letter_M 361 fudge add def
+/The_letter_N 353 fudge add def
+/The_letter_O 333 fudge add def
+/The_letter_P 341 fudge add def
+/The_letter_Q 333 fudge add def
+/The_letter_R 371 fudge add def
+/The_letter_S 335 fudge add def
+/The_letter_T 355 fudge add def
+/The_letter_U 385 fudge add def
+/The_letter_V 359 fudge add def
+/The_letter_W 365 fudge add def
+/The_letter_X 353 fudge add def
+/The_letter_Y 359 fudge add def
+/The_letter_Z 343 fudge add def
+/.notdef 450 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.5 1.5 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add -180 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 80 570 630] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 8 scalefont setfont
+ 100 710 moveto (THIS IS CMTT EIGHT POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 10 scalefont setfont
+ 100 698 moveto (THIS IS CMTT TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 12 scalefont setfont
+ 100 686 moveto (THIS IS CMTT TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/lasy.ps b/fonts/utilities/mf2ps/doc/printsamples/lasy.ps
new file mode 100644
index 0000000000..294ddac973
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/lasy.ps
@@ -0,0 +1,1715 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/Leftward_arrowhead
+(
+newpath
+%new path
+ 220 356 moveto
+ 224 354 lineto
+ 224 352 lineto
+ 250 342 274 326 294 306 curveto
+ 292 308 lineto
+ 296 306 lineto
+ 290 310 lineto
+ 288 314 lineto
+ 290 310 lineto
+ 310 288 328 264 338 234 curveto
+ 338 236 lineto
+ 340 232 lineto
+ 354 232 lineto
+ 358 236 lineto
+ 358 244 lineto
+ 356 244 lineto
+ 344 274 328 300 306 322 curveto
+ 304 324 lineto
+ 302 326 lineto
+ 286 342 266 358 244 368 curveto
+ 244 366 lineto
+ 242 368 lineto
+ 248 364 lineto
+ 248 358 lineto
+ 250 360 lineto
+ 248 360 lineto
+ 248 356 lineto
+ 240 352 lineto
+ 242 352 lineto
+ 244 354 lineto
+ 246 354 lineto
+ 268 364 288 380 304 396 curveto
+ 306 398 lineto
+ 308 400 lineto
+ 330 422 346 448 358 478 curveto
+ 358 484 lineto
+ 354 488 lineto
+ 340 488 lineto
+ 338 484 lineto
+ 336 484 lineto
+ 326 454 308 430 288 408 curveto
+ 290 410 lineto
+ 288 406 lineto
+ 288 404 lineto
+ 290 410 lineto
+ 298 414 lineto
+ 296 414 lineto
+ 292 412 lineto
+ 272 392 248 376 222 366 curveto
+ 224 368 lineto
+ 220 364 lineto
+ 220 356 lineto
+closepath
+%end path
+fill
+) def
+
+/Rightward_arrowhead
+(
+newpath
+%new path
+ 378 364 moveto
+ 376 368 lineto
+ 374 368 lineto
+ 348 378 324 394 304 414 curveto
+ 306 412 lineto
+ 302 414 lineto
+ 308 410 lineto
+ 310 406 lineto
+ 308 410 lineto
+ 288 432 270 456 260 486 curveto
+ 260 484 lineto
+ 258 488 lineto
+ 244 488 lineto
+ 240 484 lineto
+ 240 476 lineto
+ 242 476 lineto
+ 254 446 270 420 292 398 curveto
+ 294 396 lineto
+ 296 394 lineto
+ 312 378 332 362 354 352 curveto
+ 354 354 lineto
+ 356 352 lineto
+ 350 356 lineto
+ 350 362 lineto
+ 348 360 lineto
+ 350 360 lineto
+ 350 364 lineto
+ 358 368 lineto
+ 356 368 lineto
+ 354 366 lineto
+ 352 366 lineto
+ 330 356 310 340 294 324 curveto
+ 292 322 lineto
+ 290 320 lineto
+ 268 298 252 272 240 242 curveto
+ 240 236 lineto
+ 244 232 lineto
+ 258 232 lineto
+ 260 236 lineto
+ 262 236 lineto
+ 272 266 290 290 310 312 curveto
+ 308 310 lineto
+ 310 314 lineto
+ 310 316 lineto
+ 308 310 lineto
+ 300 306 lineto
+ 302 306 lineto
+ 306 308 lineto
+ 326 328 350 344 376 354 curveto
+ 378 356 lineto
+ 380 360 lineto
+ 380 362 lineto
+ 378 364 lineto
+closepath
+%end path
+fill
+) def
+
+/Upward_arrowhead
+(
+newpath
+%new path
+ 352 176 moveto
+ 340 150 324 126 306 106 curveto
+ 306 108 lineto
+ 314 112 lineto
+ 312 112 lineto
+ 310 110 lineto
+ 308 110 lineto
+ 288 90 262 72 234 62 curveto
+ 232 60 lineto
+ 230 56 lineto
+ 230 48 lineto
+ 232 46 lineto
+ 234 42 lineto
+ 242 42 lineto
+ 244 44 lineto
+ 274 56 300 72 322 94 curveto
+ 320 94 lineto
+ 324 96 lineto
+ 324 98 lineto
+ 342 114 356 134 366 156 curveto
+ 366 156 lineto
+ 358 152 lineto
+ 364 152 lineto
+ 366 156 lineto
+ 358 152 lineto
+ 352 156 lineto
+ 356 152 lineto
+ 358 152 lineto
+ 352 156 lineto
+ 352 156 lineto
+ 354 154 lineto
+ 364 132 378 112 396 96 curveto
+ 394 96 lineto
+ 398 94 lineto
+ 398 92 lineto
+ 420 70 446 54 476 42 curveto
+ 484 42 lineto
+ 486 46 lineto
+ 488 48 lineto
+ 488 56 lineto
+ 486 60 lineto
+ 484 62 lineto
+ 482 64 lineto
+ 454 74 428 92 408 112 curveto
+ 408 110 lineto
+ 406 112 lineto
+ 412 108 lineto
+ 412 108 lineto
+ 410 108 lineto
+ 392 128 376 152 366 178 curveto
+ 366 176 lineto
+ 364 180 lineto
+ 356 180 lineto
+ 352 176 lineto
+closepath
+%end path
+fill
+) def
+
+/Downward_arrowhead
+(
+newpath
+%new path
+ 366 184 moveto
+ 368 184 lineto
+ 378 210 394 234 412 254 curveto
+ 412 252 lineto
+ 404 248 lineto
+ 406 248 lineto
+ 408 250 lineto
+ 410 250 lineto
+ 430 270 456 288 484 298 curveto
+ 486 300 lineto
+ 488 304 lineto
+ 488 312 lineto
+ 486 314 lineto
+ 484 318 lineto
+ 476 318 lineto
+ 474 316 lineto
+ 444 304 418 288 396 266 curveto
+ 398 266 lineto
+ 394 264 lineto
+ 394 262 lineto
+ 376 246 362 226 352 204 curveto
+ 352 204 lineto
+ 360 208 lineto
+ 354 208 lineto
+ 352 204 lineto
+ 360 208 lineto
+ 366 204 lineto
+ 362 208 lineto
+ 360 208 lineto
+ 366 204 lineto
+ 366 204 lineto
+ 364 206 lineto
+ 354 228 340 248 322 264 curveto
+ 324 264 lineto
+ 320 266 lineto
+ 320 268 lineto
+ 298 290 272 306 242 318 curveto
+ 234 318 lineto
+ 232 314 lineto
+ 230 312 lineto
+ 230 304 lineto
+ 232 300 lineto
+ 234 298 lineto
+ 236 296 lineto
+ 264 286 290 268 310 248 curveto
+ 310 250 lineto
+ 312 248 lineto
+ 306 252 lineto
+ 306 252 lineto
+ 308 252 lineto
+ 326 232 342 208 354 182 curveto
+ 352 184 lineto
+ 356 180 lineto
+ 364 180 lineto
+ 366 184 lineto
+closepath
+%end path
+fill
+) def
+
+/Square_subset_sign
+(
+newpath
+%new path
+ 682 570 moveto
+ 678 570 lineto
+ 676 568 lineto
+ 260 568 lineto
+ 260 570 lineto
+ 254 568 lineto
+ 250 564 lineto
+ 248 560 lineto
+ 248 556 lineto
+ 246 556 lineto
+ 246 168 lineto
+ 248 170 lineto
+ 248 162 lineto
+ 250 158 lineto
+ 254 154 lineto
+ 260 152 lineto
+ 264 152 lineto
+ 266 154 lineto
+ 682 154 lineto
+ 682 152 lineto
+ 688 154 lineto
+ 692 158 lineto
+ 694 162 lineto
+ 694 174 lineto
+ 692 176 lineto
+ 688 180 lineto
+ 254 180 lineto
+ 250 176 lineto
+ 264 180 lineto
+ 274 176 lineto
+ 270 180 lineto
+ 264 180 lineto
+ 274 176 lineto
+ 278 170 lineto
+ 276 174 lineto
+ 274 176 lineto
+ 278 170 lineto
+ 274 158 lineto
+ 276 162 lineto
+ 278 166 lineto
+ 278 556 lineto
+ 274 546 lineto
+ 260 540 lineto
+ 682 540 lineto
+ 688 542 lineto
+ 692 546 lineto
+ 694 548 lineto
+ 694 560 lineto
+ 692 564 lineto
+ 688 568 lineto
+ 682 570 lineto
+closepath
+%end path
+fill
+) def
+
+/Square_superset_sign
+(
+newpath
+%new path
+ 236 540 moveto
+ 658 540 lineto
+ 664 542 lineto
+ 668 546 lineto
+ 654 540 lineto
+ 644 546 lineto
+ 648 542 lineto
+ 654 540 lineto
+ 644 546 lineto
+ 642 552 lineto
+ 642 548 lineto
+ 644 546 lineto
+ 642 552 lineto
+ 644 564 lineto
+ 642 560 lineto
+ 642 556 lineto
+ 640 556 lineto
+ 640 168 lineto
+ 642 170 lineto
+ 642 166 lineto
+ 644 176 lineto
+ 658 180 lineto
+ 230 180 lineto
+ 226 176 lineto
+ 224 174 lineto
+ 224 162 lineto
+ 226 158 lineto
+ 230 154 lineto
+ 236 152 lineto
+ 240 152 lineto
+ 242 154 lineto
+ 660 154 lineto
+ 658 152 lineto
+ 664 154 lineto
+ 668 158 lineto
+ 670 162 lineto
+ 672 166 lineto
+ 672 556 lineto
+ 670 560 lineto
+ 668 564 lineto
+ 664 568 lineto
+ 658 570 lineto
+ 654 570 lineto
+ 654 568 lineto
+ 236 568 lineto
+ 236 570 lineto
+ 230 568 lineto
+ 226 564 lineto
+ 224 560 lineto
+ 224 548 lineto
+ 226 546 lineto
+ 230 542 lineto
+ 236 540 lineto
+closepath
+%end path
+fill
+) def
+
+/Diamond
+(
+newpath
+%new path
+ 678 424 moveto
+ 682 434 lineto
+ 680 434 lineto
+ 604 356 528 280 452 204 curveto
+ 450 202 lineto
+ 450 194 lineto
+ 452 204 lineto
+ 466 210 lineto
+ 462 210 lineto
+ 456 208 lineto
+ 452 204 lineto
+ 466 210 lineto
+ 476 204 lineto
+ 472 208 lineto
+ 466 210 lineto
+ 476 204 lineto
+ 480 198 lineto
+ 478 202 lineto
+ 476 204 lineto
+ 476 206 lineto
+ 398 282 322 358 246 436 curveto
+ 248 434 lineto
+ 250 428 lineto
+ 248 416 lineto
+ 248 418 lineto
+ 324 494 400 570 478 648 curveto
+ 476 646 lineto
+ 478 650 lineto
+ 480 654 lineto
+ 480 658 lineto
+ 476 646 lineto
+ 462 640 lineto
+ 466 640 lineto
+ 472 642 lineto
+ 476 646 lineto
+ 462 640 lineto
+ 452 646 lineto
+ 456 642 lineto
+ 462 640 lineto
+ 452 646 lineto
+ 450 654 lineto
+ 450 650 lineto
+ 452 646 lineto
+ 454 646 lineto
+ 530 568 606 492 682 416 curveto
+ 678 424 lineto
+closepath
+%end path
+%new path
+ 708 428 moveto
+ 708 432 lineto
+ 706 434 lineto
+ 704 436 lineto
+ 628 512 552 588 476 666 curveto
+ 476 664 lineto
+ 472 668 lineto
+ 466 670 lineto
+ 462 670 lineto
+ 456 668 lineto
+ 452 664 lineto
+ 374 586 298 510 222 434 curveto
+ 224 434 lineto
+ 222 432 lineto
+ 220 428 lineto
+ 220 424 lineto
+ 222 420 lineto
+ 224 416 lineto
+ 300 338 376 262 454 186 curveto
+ 452 186 lineto
+ 456 182 lineto
+ 462 180 lineto
+ 466 180 lineto
+ 472 182 lineto
+ 476 186 lineto
+ 478 188 lineto
+ 554 264 630 340 706 418 curveto
+ 706 416 lineto
+ 708 420 lineto
+ 708 428 lineto
+closepath
+%end path
+fill
+) def
+
+/Square
+(
+newpath
+%new path
+ 272 606 moveto
+ 258 600 lineto
+ 262 600 lineto
+ 264 602 lineto
+ 644 602 lineto
+ 642 600 lineto
+ 648 602 lineto
+ 652 606 lineto
+ 638 600 lineto
+ 628 606 lineto
+ 632 602 lineto
+ 638 600 lineto
+ 628 606 lineto
+ 626 614 lineto
+ 626 610 lineto
+ 628 606 lineto
+ 626 614 lineto
+ 628 624 lineto
+ 626 622 lineto
+ 626 618 lineto
+ 624 616 lineto
+ 624 236 lineto
+ 626 238 lineto
+ 626 234 lineto
+ 628 244 lineto
+ 642 250 lineto
+ 258 250 lineto
+ 252 248 lineto
+ 248 244 lineto
+ 262 250 lineto
+ 272 244 lineto
+ 268 248 lineto
+ 262 250 lineto
+ 272 244 lineto
+ 276 238 lineto
+ 274 242 lineto
+ 272 244 lineto
+ 276 238 lineto
+ 272 226 lineto
+ 274 230 lineto
+ 276 234 lineto
+ 276 618 lineto
+ 272 606 lineto
+closepath
+%end path
+%new path
+ 248 624 moveto
+ 246 622 lineto
+ 246 618 lineto
+ 244 616 lineto
+ 244 236 lineto
+ 246 238 lineto
+ 246 230 lineto
+ 248 226 lineto
+ 252 222 lineto
+ 258 220 lineto
+ 262 220 lineto
+ 264 222 lineto
+ 644 222 lineto
+ 642 220 lineto
+ 648 222 lineto
+ 652 226 lineto
+ 654 230 lineto
+ 656 234 lineto
+ 656 618 lineto
+ 654 622 lineto
+ 652 624 lineto
+ 648 628 lineto
+ 642 630 lineto
+ 258 630 lineto
+ 252 628 lineto
+ 248 624 lineto
+closepath
+%end path
+fill
+) def
+
+/Bowtie_operator
+(
+newpath
+%new path
+ 252 218 moveto
+ 254 218 lineto
+ 386 352 518 484 652 618 curveto
+ 650 618 lineto
+ 652 620 lineto
+ 654 624 lineto
+ 654 628 lineto
+ 650 618 lineto
+ 636 612 lineto
+ 640 612 lineto
+ 646 614 lineto
+ 650 618 lineto
+ 636 612 lineto
+ 626 618 lineto
+ 630 614 lineto
+ 636 612 lineto
+ 626 618 lineto
+ 624 624 lineto
+ 624 620 lineto
+ 626 618 lineto
+ 624 624 lineto
+ 626 636 lineto
+ 624 632 lineto
+ 624 628 lineto
+ 622 628 lineto
+ 622 228 lineto
+ 624 228 lineto
+ 624 224 lineto
+ 626 236 lineto
+ 640 242 lineto
+ 636 242 lineto
+ 630 240 lineto
+ 626 236 lineto
+ 640 242 lineto
+ 650 236 lineto
+ 646 240 lineto
+ 640 242 lineto
+ 650 236 lineto
+ 654 228 lineto
+ 652 232 lineto
+ 650 236 lineto
+ 516 370 384 502 252 636 curveto
+ 248 640 lineto
+ 242 642 lineto
+ 238 642 lineto
+ 232 640 lineto
+ 228 636 lineto
+ 226 632 lineto
+ 226 628 lineto
+ 224 628 lineto
+ 224 228 lineto
+ 226 228 lineto
+ 226 220 lineto
+ 228 218 lineto
+ 232 214 lineto
+ 238 212 lineto
+ 242 212 lineto
+ 248 214 lineto
+ 252 218 lineto
+closepath
+%end path
+%new path
+ 256 228 moveto
+ 252 218 lineto
+ 254 220 lineto
+ 256 224 lineto
+ 256 628 lineto
+ 252 618 lineto
+ 238 612 lineto
+ 242 612 lineto
+ 248 614 lineto
+ 252 618 lineto
+ 238 612 lineto
+ 228 618 lineto
+ 232 614 lineto
+ 238 612 lineto
+ 228 618 lineto
+ 226 624 lineto
+ 226 620 lineto
+ 228 618 lineto
+ 230 616 lineto
+ 362 482 494 350 628 216 curveto
+ 626 218 lineto
+ 630 214 lineto
+ 636 212 lineto
+ 640 212 lineto
+ 646 214 lineto
+ 650 218 lineto
+ 652 220 lineto
+ 654 224 lineto
+ 654 628 lineto
+ 652 632 lineto
+ 650 636 lineto
+ 646 640 lineto
+ 640 642 lineto
+ 636 642 lineto
+ 630 640 lineto
+ 626 636 lineto
+ 626 634 lineto
+ 492 500 360 368 228 234 curveto
+ 228 236 lineto
+ 226 232 lineto
+ 226 224 lineto
+ 228 236 lineto
+ 242 242 lineto
+ 238 242 lineto
+ 232 240 lineto
+ 228 236 lineto
+ 242 242 lineto
+ 252 236 lineto
+ 248 240 lineto
+ 242 242 lineto
+ 252 236 lineto
+ 256 228 lineto
+ 254 232 lineto
+ 252 236 lineto
+ 256 228 lineto
+closepath
+%end path
+fill
+) def
+
+/Upside-down_Uppercase_Greek_Omega
+(
+newpath
+%new path
+ 510 662 moveto
+ 510 624 518 590 530 556 curveto
+ 528 558 lineto
+ 530 554 lineto
+ 544 516 558 480 572 442 curveto
+ 570 444 lineto
+ 570 446 lineto
+ 582 412 590 378 590 342 curveto
+ 588 342 lineto
+ 590 340 lineto
+ 588 342 lineto
+ 590 348 lineto
+ 588 344 lineto
+ 588 320 584 300 578 278 curveto
+ 578 280 lineto
+ 580 282 lineto
+ 578 282 lineto
+ 572 260 562 240 546 224 curveto
+ 544 222 542 222 542 220 curveto
+ 542 220 lineto
+ 550 224 lineto
+ 546 224 lineto
+ 544 222 lineto
+ 528 206 506 192 484 186 curveto
+ 488 188 lineto
+ 486 186 lineto
+ 470 180 454 180 438 180 curveto
+ 436 180 lineto
+ 432 176 lineto
+ 440 180 lineto
+ 446 176 lineto
+ 444 180 lineto
+ 440 180 lineto
+ 422 180 406 182 390 188 curveto
+ 394 186 lineto
+ 392 188 lineto
+ 370 194 348 208 332 224 curveto
+ 330 224 lineto
+ 336 220 lineto
+ 336 220 lineto
+ 334 222 lineto
+ 334 224 332 224 330 226 curveto
+ 314 242 304 262 298 284 curveto
+ 298 282 lineto
+ 300 280 lineto
+ 298 280 lineto
+ 292 302 288 322 288 346 curveto
+ 290 344 lineto
+ 288 348 lineto
+ 290 344 lineto
+ 288 340 lineto
+ 290 342 lineto
+ 290 344 lineto
+ 290 380 298 414 310 448 curveto
+ 308 446 lineto
+ 308 444 lineto
+ 322 482 336 518 350 556 curveto
+ 348 554 lineto
+ 350 558 lineto
+ 362 592 370 626 370 664 curveto
+ 370 664 lineto
+ 368 668 lineto
+ 366 670 lineto
+ 362 672 lineto
+ 360 672 lineto
+ 360 670 lineto
+ 358 670 lineto
+ 360 672 lineto
+ 356 670 lineto
+ 354 668 lineto
+ 352 664 lineto
+ 352 644 348 626 342 608 curveto
+ 344 608 lineto
+ 344 610 lineto
+ 318 536 254 476 228 402 curveto
+ 230 402 lineto
+ 228 400 lineto
+ 228 398 lineto
+ 222 380 218 362 218 344 curveto
+ 220 344 lineto
+ 220 342 lineto
+ 220 326 222 310 228 296 curveto
+ 226 298 lineto
+ 228 294 lineto
+ 236 270 250 248 268 230 curveto
+ 270 228 lineto
+ 272 226 lineto
+ 276 222 282 218 286 214 curveto
+ 306 196 330 184 356 178 curveto
+ 358 178 lineto
+ 358 176 lineto
+ 384 168 412 164 440 164 curveto
+ 440 164 lineto
+ 442 166 lineto
+ 468 166 496 170 522 178 curveto
+ 524 178 lineto
+ 524 180 lineto
+ 550 186 574 198 594 216 curveto
+ 598 220 604 224 608 228 curveto
+ 610 230 lineto
+ 612 232 lineto
+ 630 250 644 272 652 296 curveto
+ 650 294 lineto
+ 652 298 lineto
+ 658 312 660 328 660 344 curveto
+ 660 344 lineto
+ 658 346 lineto
+ 658 364 654 382 648 400 curveto
+ 650 400 lineto
+ 648 402 lineto
+ 648 404 lineto
+ 622 478 558 538 532 612 curveto
+ 534 612 lineto
+ 534 610 lineto
+ 528 628 524 646 524 666 curveto
+ 526 664 lineto
+ 524 668 lineto
+ 522 670 lineto
+ 518 672 lineto
+ 516 672 lineto
+ 516 672 lineto
+ 514 670 lineto
+ 510 668 lineto
+ 510 662 lineto
+closepath
+%end path
+fill
+%new path
+ 656 558 moveto
+ 664 558 lineto
+ 666 562 lineto
+ 668 564 lineto
+ 668 566 lineto
+ 666 568 lineto
+ 658 600 650 632 642 666 curveto
+ 644 664 lineto
+ 642 668 lineto
+ 640 670 lineto
+ 636 672 lineto
+ 634 672 lineto
+ 634 670 lineto
+ 516 670 lineto
+ 516 672 lineto
+ 514 670 lineto
+ 510 668 lineto
+ 510 662 lineto
+ 510 652 512 642 512 632 curveto
+ 512 630 lineto
+ 516 628 lineto
+ 518 626 lineto
+ 520 626 lineto
+ 522 628 lineto
+ 582 628 lineto
+ 580 626 lineto
+ 584 628 lineto
+ 586 630 lineto
+ 578 626 lineto
+ 572 630 lineto
+ 576 628 lineto
+ 578 626 lineto
+ 580 626 lineto
+ 596 626 620 626 630 622 curveto
+ 630 624 lineto
+ 628 624 lineto
+ 630 622 632 622 632 620 curveto
+ 634 620 lineto
+ 632 622 lineto
+ 636 620 lineto
+ 630 624 lineto
+ 628 628 lineto
+ 630 624 lineto
+ 634 620 636 614 638 606 curveto
+ 636 610 lineto
+ 638 608 lineto
+ 642 594 646 576 650 564 curveto
+ 648 564 lineto
+ 650 562 lineto
+ 652 558 lineto
+ 656 558 lineto
+closepath
+%end path
+fill
+%new path
+ 228 562 moveto
+ 230 564 lineto
+ 230 566 lineto
+ 234 578 238 596 242 610 curveto
+ 240 606 lineto
+ 242 608 lineto
+ 244 616 246 622 250 626 curveto
+ 248 624 lineto
+ 250 628 lineto
+ 250 630 lineto
+ 248 624 lineto
+ 240 620 lineto
+ 242 620 lineto
+ 246 622 lineto
+ 248 622 lineto
+ 248 624 250 624 252 626 curveto
+ 252 624 lineto
+ 250 624 lineto
+ 260 628 284 628 300 628 curveto
+ 360 628 lineto
+ 360 626 lineto
+ 362 628 lineto
+ 366 630 lineto
+ 366 634 lineto
+ 368 634 lineto
+ 368 644 370 654 370 664 curveto
+ 368 662 lineto
+ 368 668 lineto
+ 364 670 lineto
+ 362 672 lineto
+ 360 672 lineto
+ 358 670 lineto
+ 242 670 lineto
+ 242 672 lineto
+ 240 670 lineto
+ 236 668 lineto
+ 236 664 lineto
+ 234 664 lineto
+ 226 630 218 598 210 566 curveto
+ 212 566 lineto
+ 212 562 lineto
+ 216 558 lineto
+ 226 558 lineto
+ 228 562 lineto
+closepath
+%end path
+fill
+) def
+
+/Leads_to_character_extension
+(
+newpath
+%new path
+ 192 352 moveto
+ 202 366 214 380 226 392 curveto
+ 226 390 lineto
+ 228 394 lineto
+ 228 402 lineto
+ 226 390 lineto
+ 212 384 lineto
+ 216 384 lineto
+ 222 386 lineto
+ 222 388 lineto
+ 240 404 258 418 278 426 curveto
+ 278 424 lineto
+ 272 422 lineto
+ 272 424 lineto
+ 282 426 292 428 302 428 curveto
+ 308 430 lineto
+ 312 434 lineto
+ 298 428 lineto
+ 288 434 lineto
+ 292 430 lineto
+ 298 428 lineto
+ 298 426 lineto
+ 308 426 318 424 328 422 curveto
+ 326 422 lineto
+ 320 424 lineto
+ 322 424 lineto
+ 342 416 360 402 378 386 curveto
+ 376 386 lineto
+ 382 384 lineto
+ 372 390 lineto
+ 370 398 lineto
+ 370 394 lineto
+ 372 390 lineto
+ 374 390 lineto
+ 386 378 398 364 408 350 curveto
+ 418 336 430 322 442 310 curveto
+ 442 312 lineto
+ 446 308 lineto
+ 446 306 lineto
+ 464 290 482 276 502 268 curveto
+ 502 270 lineto
+ 508 268 lineto
+ 508 266 lineto
+ 518 264 528 262 538 262 curveto
+ 538 264 lineto
+ 542 264 lineto
+ 552 264 562 266 572 268 curveto
+ 570 268 lineto
+ 576 270 lineto
+ 578 270 lineto
+ 598 278 616 292 634 308 curveto
+ 632 308 lineto
+ 636 312 lineto
+ 638 312 lineto
+ 650 324 662 338 672 352 curveto
+ 674 354 lineto
+ 674 366 lineto
+ 672 370 lineto
+ 668 374 lineto
+ 662 376 lineto
+ 658 376 lineto
+ 652 374 lineto
+ 648 370 lineto
+ 646 368 lineto
+ 636 354 624 340 612 328 curveto
+ 612 330 lineto
+ 610 326 lineto
+ 610 318 lineto
+ 612 330 lineto
+ 626 336 lineto
+ 622 336 lineto
+ 616 334 lineto
+ 616 332 lineto
+ 598 316 580 302 560 294 curveto
+ 560 296 lineto
+ 566 298 lineto
+ 566 296 lineto
+ 556 294 546 292 536 292 curveto
+ 538 294 lineto
+ 532 292 lineto
+ 528 288 lineto
+ 542 294 lineto
+ 552 288 lineto
+ 548 292 lineto
+ 542 294 lineto
+ 540 294 lineto
+ 530 294 520 296 510 298 curveto
+ 512 298 lineto
+ 518 296 lineto
+ 516 296 lineto
+ 496 304 478 318 460 334 curveto
+ 462 334 lineto
+ 456 336 lineto
+ 466 330 lineto
+ 468 322 lineto
+ 468 326 lineto
+ 466 330 lineto
+ 464 330 lineto
+ 452 342 440 356 430 370 curveto
+ 420 384 408 398 396 410 curveto
+ 396 408 lineto
+ 392 412 lineto
+ 392 414 lineto
+ 374 430 356 444 336 452 curveto
+ 336 450 lineto
+ 330 452 lineto
+ 330 454 lineto
+ 320 456 310 458 300 458 curveto
+ 298 458 lineto
+ 296 456 lineto
+ 286 456 276 454 266 452 curveto
+ 268 452 lineto
+ 262 450 lineto
+ 260 450 lineto
+ 240 442 222 428 204 412 curveto
+ 206 412 lineto
+ 202 408 lineto
+ 200 408 lineto
+ 188 396 178 382 168 368 curveto
+ 168 370 lineto
+ 166 366 lineto
+ 166 354 lineto
+ 168 352 lineto
+ 172 348 lineto
+ 178 346 lineto
+ 182 346 lineto
+ 188 348 lineto
+ 192 352 lineto
+closepath
+%end path
+fill
+) def
+
+/Leads_to_character_with_arrowhead
+(
+newpath
+%new path
+ 858 364 moveto
+ 856 368 lineto
+ 854 368 lineto
+ 828 378 804 394 784 414 curveto
+ 786 412 lineto
+ 782 414 lineto
+ 788 410 lineto
+ 790 406 lineto
+ 788 410 lineto
+ 768 432 750 456 740 486 curveto
+ 740 484 lineto
+ 738 488 lineto
+ 724 488 lineto
+ 720 484 lineto
+ 720 476 lineto
+ 722 476 lineto
+ 734 446 750 420 772 398 curveto
+ 774 396 lineto
+ 776 394 lineto
+ 792 378 812 362 834 352 curveto
+ 834 354 lineto
+ 836 352 lineto
+ 830 356 lineto
+ 830 362 lineto
+ 828 360 lineto
+ 830 360 lineto
+ 830 364 lineto
+ 838 368 lineto
+ 836 368 lineto
+ 834 366 lineto
+ 832 366 lineto
+ 810 356 790 340 774 324 curveto
+ 772 322 lineto
+ 770 320 lineto
+ 748 298 732 272 720 242 curveto
+ 720 236 lineto
+ 724 232 lineto
+ 738 232 lineto
+ 740 236 lineto
+ 742 236 lineto
+ 752 266 770 290 790 312 curveto
+ 788 310 lineto
+ 790 314 lineto
+ 790 316 lineto
+ 788 310 lineto
+ 780 306 lineto
+ 782 306 lineto
+ 786 308 lineto
+ 806 328 830 344 856 354 curveto
+ 858 356 lineto
+ 860 360 lineto
+ 860 362 lineto
+ 858 364 lineto
+closepath
+%end path
+%new path
+ 192 352 moveto
+ 202 366 214 380 226 392 curveto
+ 226 390 lineto
+ 228 394 lineto
+ 228 402 lineto
+ 226 390 lineto
+ 212 384 lineto
+ 216 384 lineto
+ 222 386 lineto
+ 222 388 lineto
+ 240 404 258 418 278 426 curveto
+ 278 424 lineto
+ 272 422 lineto
+ 272 424 lineto
+ 282 426 292 428 302 428 curveto
+ 308 430 lineto
+ 312 434 lineto
+ 298 428 lineto
+ 288 434 lineto
+ 292 430 lineto
+ 298 428 lineto
+ 298 426 lineto
+ 308 426 318 424 328 422 curveto
+ 326 422 lineto
+ 320 424 lineto
+ 322 424 lineto
+ 342 416 360 402 378 386 curveto
+ 376 386 lineto
+ 382 384 lineto
+ 372 390 lineto
+ 370 398 lineto
+ 370 394 lineto
+ 372 390 lineto
+ 374 390 lineto
+ 386 378 398 364 408 350 curveto
+ 418 336 430 322 442 310 curveto
+ 442 312 lineto
+ 446 308 lineto
+ 446 306 lineto
+ 464 290 482 276 502 268 curveto
+ 502 270 lineto
+ 508 268 lineto
+ 508 266 lineto
+ 518 264 528 262 538 262 curveto
+ 538 264 lineto
+ 542 264 lineto
+ 552 264 562 266 570 268 curveto
+ 576 270 lineto
+ 620 286 654 328 698 344 curveto
+ 696 342 lineto
+ 690 340 lineto
+ 692 342 lineto
+ 700 344 710 346 720 346 curveto
+ 824 346 lineto
+ 830 348 lineto
+ 834 352 lineto
+ 836 354 lineto
+ 838 358 lineto
+ 838 362 lineto
+ 836 366 lineto
+ 834 370 lineto
+ 830 374 lineto
+ 824 376 lineto
+ 820 376 lineto
+ 820 374 lineto
+ 714 374 lineto
+ 704 374 694 372 686 370 curveto
+ 680 368 lineto
+ 636 352 602 310 558 294 curveto
+ 560 296 lineto
+ 566 298 lineto
+ 564 296 lineto
+ 556 294 546 292 536 292 curveto
+ 538 294 lineto
+ 532 292 lineto
+ 528 288 lineto
+ 542 294 lineto
+ 552 288 lineto
+ 548 292 lineto
+ 542 294 lineto
+ 540 294 lineto
+ 530 294 520 296 510 298 curveto
+ 512 298 lineto
+ 518 296 lineto
+ 516 296 lineto
+ 496 304 478 318 460 334 curveto
+ 462 334 lineto
+ 456 336 lineto
+ 466 330 lineto
+ 468 322 lineto
+ 468 326 lineto
+ 466 330 lineto
+ 464 330 lineto
+ 452 342 440 356 430 370 curveto
+ 420 384 408 398 396 410 curveto
+ 396 408 lineto
+ 392 412 lineto
+ 392 414 lineto
+ 374 430 356 444 336 452 curveto
+ 336 450 lineto
+ 330 452 lineto
+ 330 454 lineto
+ 320 456 310 458 300 458 curveto
+ 298 458 lineto
+ 296 456 lineto
+ 286 456 276 454 266 452 curveto
+ 268 452 lineto
+ 262 450 lineto
+ 260 450 lineto
+ 240 442 222 428 204 412 curveto
+ 206 412 lineto
+ 202 408 lineto
+ 200 408 lineto
+ 188 396 178 382 168 368 curveto
+ 168 370 lineto
+ 166 366 lineto
+ 166 354 lineto
+ 168 352 lineto
+ 172 348 lineto
+ 178 346 lineto
+ 182 346 lineto
+ 188 348 lineto
+ 192 352 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_lhd_triangle
+(
+newpath
+%new path
+ 666 570 moveto
+ 662 570 lineto
+ 656 568 lineto
+ 656 566 lineto
+ 518 502 382 436 244 372 curveto
+ 246 374 lineto
+ 242 370 lineto
+ 240 366 lineto
+ 238 362 lineto
+ 238 358 lineto
+ 240 354 lineto
+ 242 352 lineto
+ 246 348 lineto
+ 246 346 lineto
+ 384 282 520 216 658 154 curveto
+ 656 154 lineto
+ 662 152 lineto
+ 666 152 lineto
+ 672 154 lineto
+ 676 158 lineto
+ 678 162 lineto
+ 680 166 lineto
+ 680 556 lineto
+ 678 560 lineto
+ 676 564 lineto
+ 672 568 lineto
+ 666 570 lineto
+closepath
+%end path
+%new path
+ 650 552 moveto
+ 652 564 lineto
+ 650 560 lineto
+ 650 556 lineto
+ 648 556 lineto
+ 648 168 lineto
+ 650 170 lineto
+ 650 166 lineto
+ 652 176 lineto
+ 666 180 lineto
+ 656 180 lineto
+ 652 176 lineto
+ 666 180 lineto
+ 676 176 lineto
+ 672 180 lineto
+ 534 244 398 310 260 374 curveto
+ 262 374 lineto
+ 256 376 lineto
+ 266 370 lineto
+ 268 362 lineto
+ 268 366 lineto
+ 266 370 lineto
+ 268 362 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 268 362 lineto
+ 266 352 lineto
+ 252 346 lineto
+ 256 346 lineto
+ 262 348 lineto
+ 400 412 536 478 674 542 curveto
+ 672 542 lineto
+ 676 546 lineto
+ 662 540 lineto
+ 652 546 lineto
+ 656 542 lineto
+ 662 540 lineto
+ 652 546 lineto
+ 650 552 lineto
+ 650 548 lineto
+ 652 546 lineto
+ 650 552 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_unlhd_triangle
+(
+newpath
+%new path
+ 666 638 moveto
+ 662 638 lineto
+ 656 636 lineto
+ 656 634 lineto
+ 518 570 382 504 244 440 curveto
+ 246 440 lineto
+ 242 436 lineto
+ 240 434 lineto
+ 238 430 lineto
+ 238 426 lineto
+ 240 422 lineto
+ 242 418 lineto
+ 246 414 lineto
+ 384 350 520 284 658 220 curveto
+ 656 220 lineto
+ 662 218 lineto
+ 666 218 lineto
+ 672 220 lineto
+ 676 224 lineto
+ 678 228 lineto
+ 680 232 lineto
+ 680 624 lineto
+ 678 628 lineto
+ 676 632 lineto
+ 672 636 lineto
+ 666 638 lineto
+closepath
+%end path
+%new path
+ 650 620 moveto
+ 652 632 lineto
+ 650 628 lineto
+ 650 624 lineto
+ 648 624 lineto
+ 648 234 lineto
+ 650 236 lineto
+ 650 232 lineto
+ 652 242 lineto
+ 666 248 lineto
+ 662 248 lineto
+ 656 246 lineto
+ 652 242 lineto
+ 666 248 lineto
+ 676 242 lineto
+ 672 246 lineto
+ 672 248 lineto
+ 534 312 398 378 260 442 curveto
+ 262 440 lineto
+ 256 442 lineto
+ 266 436 lineto
+ 268 430 lineto
+ 268 434 lineto
+ 266 436 lineto
+ 268 430 lineto
+ 266 418 lineto
+ 268 422 lineto
+ 268 430 lineto
+ 266 418 lineto
+ 252 412 lineto
+ 256 412 lineto
+ 262 414 lineto
+ 262 416 lineto
+ 400 480 536 546 674 610 curveto
+ 672 610 lineto
+ 676 614 lineto
+ 662 608 lineto
+ 652 614 lineto
+ 656 610 lineto
+ 662 608 lineto
+ 652 614 lineto
+ 650 620 lineto
+ 650 616 lineto
+ 652 614 lineto
+ 650 620 lineto
+closepath
+%end path
+%new path
+ 666 110 moveto
+ 252 110 lineto
+ 246 108 lineto
+ 242 104 lineto
+ 240 102 lineto
+ 238 98 lineto
+ 238 94 lineto
+ 240 90 lineto
+ 242 86 lineto
+ 246 82 lineto
+ 252 80 lineto
+ 256 80 lineto
+ 256 82 lineto
+ 668 82 lineto
+ 666 80 lineto
+ 672 82 lineto
+ 676 86 lineto
+ 678 90 lineto
+ 680 94 lineto
+ 680 98 lineto
+ 678 102 lineto
+ 676 104 lineto
+ 672 108 lineto
+ 666 110 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_rhd_triangle
+(
+newpath
+%new path
+ 252 540 moveto
+ 242 546 lineto
+ 246 542 lineto
+ 246 540 lineto
+ 384 476 520 410 658 346 curveto
+ 656 348 lineto
+ 662 346 lineto
+ 652 352 lineto
+ 650 358 lineto
+ 650 354 lineto
+ 652 352 lineto
+ 650 358 lineto
+ 652 370 lineto
+ 650 366 lineto
+ 650 358 lineto
+ 652 370 lineto
+ 666 376 lineto
+ 662 376 lineto
+ 656 374 lineto
+ 656 372 lineto
+ 518 308 382 242 244 180 curveto
+ 246 180 lineto
+ 242 176 lineto
+ 256 180 lineto
+ 266 176 lineto
+ 262 180 lineto
+ 256 180 lineto
+ 266 176 lineto
+ 268 170 lineto
+ 268 174 lineto
+ 266 176 lineto
+ 268 170 lineto
+ 266 158 lineto
+ 268 162 lineto
+ 268 166 lineto
+ 270 166 lineto
+ 270 554 lineto
+ 268 552 lineto
+ 268 556 lineto
+ 266 546 lineto
+ 252 540 lineto
+ 256 540 lineto
+ 262 542 lineto
+ 266 546 lineto
+ 252 540 lineto
+closepath
+%end path
+%new path
+ 242 564 moveto
+ 240 560 lineto
+ 238 556 lineto
+ 238 166 lineto
+ 240 162 lineto
+ 242 158 lineto
+ 246 154 lineto
+ 252 152 lineto
+ 256 152 lineto
+ 262 154 lineto
+ 262 156 lineto
+ 400 218 536 284 674 348 curveto
+ 672 348 lineto
+ 676 352 lineto
+ 678 354 lineto
+ 680 358 lineto
+ 680 362 lineto
+ 678 366 lineto
+ 676 370 lineto
+ 672 374 lineto
+ 534 438 398 504 260 568 curveto
+ 262 568 lineto
+ 256 570 lineto
+ 252 570 lineto
+ 246 568 lineto
+ 242 564 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_unrhd_triangle
+(
+newpath
+%new path
+ 252 608 moveto
+ 242 614 lineto
+ 246 610 lineto
+ 246 608 lineto
+ 384 544 520 478 658 414 curveto
+ 656 414 lineto
+ 662 412 lineto
+ 652 418 lineto
+ 650 426 lineto
+ 650 422 lineto
+ 652 418 lineto
+ 650 426 lineto
+ 652 436 lineto
+ 650 434 lineto
+ 650 426 lineto
+ 652 436 lineto
+ 666 442 lineto
+ 662 442 lineto
+ 656 440 lineto
+ 518 376 382 310 244 246 curveto
+ 246 246 lineto
+ 242 242 lineto
+ 256 248 lineto
+ 266 242 lineto
+ 262 246 lineto
+ 256 248 lineto
+ 266 242 lineto
+ 268 236 lineto
+ 268 240 lineto
+ 266 242 lineto
+ 268 236 lineto
+ 266 224 lineto
+ 268 228 lineto
+ 268 232 lineto
+ 270 232 lineto
+ 270 622 lineto
+ 268 620 lineto
+ 268 624 lineto
+ 266 614 lineto
+ 252 608 lineto
+ 256 608 lineto
+ 262 610 lineto
+ 266 614 lineto
+ 252 608 lineto
+closepath
+%end path
+%new path
+ 242 632 moveto
+ 240 628 lineto
+ 238 624 lineto
+ 238 232 lineto
+ 240 228 lineto
+ 242 224 lineto
+ 246 220 lineto
+ 252 218 lineto
+ 256 218 lineto
+ 262 220 lineto
+ 262 222 lineto
+ 400 286 536 352 674 416 curveto
+ 672 414 lineto
+ 676 418 lineto
+ 678 422 lineto
+ 680 426 lineto
+ 680 430 lineto
+ 678 434 lineto
+ 676 436 lineto
+ 672 440 lineto
+ 672 442 lineto
+ 534 506 398 572 260 636 curveto
+ 262 636 lineto
+ 256 638 lineto
+ 252 638 lineto
+ 246 636 lineto
+ 242 632 lineto
+closepath
+%end path
+%new path
+ 252 80 moveto
+ 256 80 lineto
+ 256 82 lineto
+ 668 82 lineto
+ 666 80 lineto
+ 672 82 lineto
+ 676 86 lineto
+ 678 90 lineto
+ 680 94 lineto
+ 680 98 lineto
+ 678 102 lineto
+ 676 104 lineto
+ 672 108 lineto
+ 666 110 lineto
+ 252 110 lineto
+ 246 108 lineto
+ 242 104 lineto
+ 240 102 lineto
+ 238 98 lineto
+ 238 94 lineto
+ 240 90 lineto
+ 242 86 lineto
+ 246 82 lineto
+ 252 80 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /Leftward_arrowhead put
+Encoding 66 /Rightward_arrowhead put
+Encoding 67 /Upward_arrowhead put
+Encoding 68 /Downward_arrowhead put
+Encoding 69 /Square_subset_sign put
+Encoding 70 /Square_superset_sign put
+Encoding 71 /Diamond put
+Encoding 72 /Square put
+Encoding 73 /Bowtie_operator put
+Encoding 74 /Upside-down_Uppercase_Greek_Omega put
+Encoding 75 /Leads_to_character_extension put
+Encoding 76 /Leads_to_character_with_arrowhead put
+Encoding 77 /LASY_lhd_triangle put
+Encoding 78 /LASY_unlhd_triangle put
+Encoding 79 /LASY_rhd_triangle put
+Encoding 80 /LASY_unrhd_triangle put
+
+Metrics
+ begin
+/Leftward_arrowhead 139 fudge add def
+/Rightward_arrowhead 141 fudge add def
+/Upward_arrowhead 259 fudge add def
+/Downward_arrowhead 259 fudge add def
+/Square_subset_sign 449 fudge add def
+/Square_superset_sign 449 fudge add def
+/Diamond 489 fudge add def
+/Square 413 fudge add def
+/Bowtie_operator 431 fudge add def
+/Upside-down_Uppercase_Greek_Omega 459 fudge add def
+/Leads_to_character_extension 509 fudge add def
+/Leads_to_character_with_arrowhead 695 fudge add def
+/LASY_lhd_triangle 443 fudge add def
+/LASY_unlhd_triangle 443 fudge add def
+/LASY_rhd_triangle 443 fudge add def
+/LASY_unrhd_triangle 443 fudge add def
+/.notdef 225 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 10
+ 0 -100
+ charwdth 1000
+ setcachedevice
+ -166 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [166 fudge sub 42 860 672]
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 13 scalefont setfont
+ 100 710 moveto (EF GH IKL M N O P) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/logo.ps b/fonts/utilities/mf2ps/doc/printsamples/logo.ps
new file mode 100644
index 0000000000..fbd242302b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/logo.ps
@@ -0,0 +1,1096 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 150 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+/M
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 238 590 lineto
+ 306 470 376 348 446 228 curveto
+ 444 230 lineto
+ 448 224 lineto
+ 452 220 lineto
+ 458 216 lineto
+ 462 216 lineto
+ 468 214 lineto
+ 474 216 lineto
+ 476 216 lineto
+ 482 220 lineto
+ 488 224 lineto
+ 490 230 lineto
+ 492 230 lineto
+ 560 350 630 472 700 592 curveto
+ 698 590 lineto
+ 700 596 lineto
+ 700 600 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 682 576 lineto
+ 684 578 lineto
+ 690 580 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 660 580 lineto
+ 666 578 lineto
+ 670 576 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 652 590 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 652 600 lineto
+ 650 598 lineto
+ 650 194 lineto
+ 652 194 lineto
+ 652 186 lineto
+ 656 180 lineto
+ 660 178 lineto
+ 666 174 lineto
+ 670 174 lineto
+ 676 172 lineto
+ 682 174 lineto
+ 684 174 lineto
+ 690 178 lineto
+ 696 180 lineto
+ 698 186 lineto
+ 700 190 lineto
+ 700 600 lineto
+ 698 604 lineto
+ 696 610 lineto
+ 690 614 lineto
+ 684 618 lineto
+ 682 618 lineto
+ 676 620 lineto
+ 670 618 lineto
+ 666 618 lineto
+ 660 614 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 582 484 512 362 444 242 curveto
+ 444 234 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 462 258 lineto
+ 458 256 lineto
+ 452 254 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 482 254 lineto
+ 476 256 lineto
+ 474 258 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 492 238 lineto
+ 490 244 lineto
+ 420 364 350 486 282 606 curveto
+ 282 604 lineto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+fill
+) def
+
+/E
+(
+newpath
+%new path
+ 556 224 moveto
+ 554 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 222 lineto
+ 244 218 lineto
+ 240 214 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 274 218 lineto
+ 268 222 lineto
+ 266 222 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 282 208 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 280 190 lineto
+ 282 194 lineto
+ 284 200 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 202 lineto
+ 236 204 lineto
+ 236 194 lineto
+ 240 190 lineto
+ 244 184 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 562 180 lineto
+ 564 182 lineto
+ 570 184 lineto
+ 576 190 lineto
+ 578 194 lineto
+ 580 200 lineto
+ 580 204 lineto
+ 578 208 lineto
+ 576 214 lineto
+ 570 218 lineto
+ 564 222 lineto
+ 562 222 lineto
+ 556 224 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/T
+(
+newpath
+%new path
+ 202 568 moveto
+ 578 568 lineto
+ 580 570 lineto
+ 586 572 lineto
+ 592 578 lineto
+ 594 582 lineto
+ 596 588 lineto
+ 596 592 lineto
+ 594 596 lineto
+ 592 602 lineto
+ 586 606 lineto
+ 580 610 lineto
+ 578 610 lineto
+ 572 612 lineto
+ 570 610 lineto
+ 202 610 lineto
+ 202 612 lineto
+ 196 610 lineto
+ 194 610 lineto
+ 188 606 lineto
+ 182 602 lineto
+ 180 596 lineto
+ 180 582 lineto
+ 182 578 lineto
+ 188 572 lineto
+ 194 570 lineto
+ 196 568 lineto
+ 202 568 lineto
+closepath
+%end path
+%new path
+ 368 602 moveto
+ 364 596 lineto
+ 364 592 lineto
+ 362 590 lineto
+ 362 194 lineto
+ 364 194 lineto
+ 364 186 lineto
+ 368 180 lineto
+ 372 178 lineto
+ 378 174 lineto
+ 382 174 lineto
+ 388 172 lineto
+ 394 174 lineto
+ 396 174 lineto
+ 402 178 lineto
+ 408 180 lineto
+ 410 186 lineto
+ 412 190 lineto
+ 412 592 lineto
+ 410 596 lineto
+ 408 602 lineto
+ 402 606 lineto
+ 396 610 lineto
+ 394 610 lineto
+ 388 612 lineto
+ 382 610 lineto
+ 378 610 lineto
+ 372 606 lineto
+ 368 602 lineto
+closepath
+%end path
+fill
+) def
+
+/A
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 376 lineto
+ 280 362 lineto
+ 260 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 556 366 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 560 386 lineto
+ 556 380 lineto
+ 556 376 lineto
+ 554 374 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+ 602 186 lineto
+ 604 190 lineto
+ 604 376 lineto
+ 602 380 lineto
+ 600 386 lineto
+ 594 390 lineto
+ 588 394 lineto
+ 586 394 lineto
+ 580 396 lineto
+ 578 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 376 lineto
+ 234 374 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 280 362 moveto
+ 282 366 lineto
+ 284 372 lineto
+ 284 410 284 452 292 490 curveto
+ 290 488 lineto
+ 290 484 lineto
+ 294 504 300 522 310 538 curveto
+ 306 532 lineto
+ 308 534 lineto
+ 308 536 310 538 312 542 curveto
+ 314 546 318 548 322 552 curveto
+ 320 552 lineto
+ 324 556 lineto
+ 324 566 lineto
+ 320 552 lineto
+ 300 542 lineto
+ 306 542 lineto
+ 310 544 lineto
+ 316 546 lineto
+ 316 548 lineto
+ 324 554 332 560 340 564 curveto
+ 334 560 lineto
+ 334 562 lineto
+ 340 564 346 566 350 568 curveto
+ 346 566 lineto
+ 348 568 lineto
+ 356 570 364 572 374 574 curveto
+ 372 572 lineto
+ 368 572 lineto
+ 384 576 402 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 438 574 456 574 472 570 curveto
+ 472 572 lineto
+ 466 572 lineto
+ 476 570 484 568 492 566 curveto
+ 488 568 lineto
+ 490 566 lineto
+ 494 564 500 562 506 560 curveto
+ 504 560 lineto
+ 498 564 lineto
+ 500 562 lineto
+ 508 558 516 552 524 546 curveto
+ 522 546 lineto
+ 528 544 lineto
+ 532 542 lineto
+ 538 542 lineto
+ 518 552 lineto
+ 514 562 lineto
+ 514 556 lineto
+ 518 552 lineto
+ 518 550 lineto
+ 522 546 526 544 528 540 curveto
+ 530 536 532 534 532 532 curveto
+ 528 538 lineto
+ 530 536 lineto
+ 540 520 546 502 550 482 curveto
+ 548 484 lineto
+ 548 488 lineto
+ 556 450 556 408 556 370 curveto
+ 556 366 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 602 366 lineto
+ 604 372 lineto
+ 604 376 lineto
+ 602 376 lineto
+ 602 414 602 456 594 494 curveto
+ 596 492 lineto
+ 594 498 lineto
+ 590 518 584 536 574 552 curveto
+ 572 556 lineto
+ 570 558 lineto
+ 570 560 568 562 566 566 curveto
+ 564 570 560 572 556 576 curveto
+ 558 576 lineto
+ 552 580 lineto
+ 552 582 lineto
+ 544 588 536 594 528 598 curveto
+ 522 600 lineto
+ 522 602 lineto
+ 516 604 510 606 506 608 curveto
+ 504 608 lineto
+ 502 610 lineto
+ 494 612 486 614 476 616 curveto
+ 478 614 lineto
+ 472 616 lineto
+ 470 616 lineto
+ 454 620 436 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 400 618 382 618 366 614 curveto
+ 366 616 lineto
+ 360 614 lineto
+ 350 612 342 610 334 608 curveto
+ 332 608 lineto
+ 330 606 lineto
+ 326 604 320 602 314 600 curveto
+ 316 600 lineto
+ 310 598 lineto
+ 308 596 lineto
+ 300 592 292 586 284 580 curveto
+ 286 580 lineto
+ 280 576 lineto
+ 280 574 lineto
+ 276 570 272 568 270 564 curveto
+ 268 560 266 558 266 556 curveto
+ 264 552 lineto
+ 262 550 lineto
+ 252 534 246 516 242 496 curveto
+ 244 498 lineto
+ 242 492 lineto
+ 234 454 234 412 234 374 curveto
+ 236 376 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 274 356 lineto
+ 280 362 lineto
+closepath
+%end path
+fill
+) def
+
+/F
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/O
+(
+newpath
+%new path
+ 248 362 moveto
+ 250 366 lineto
+ 252 372 lineto
+ 252 408 252 446 258 480 curveto
+ 256 474 lineto
+ 258 476 lineto
+ 262 494 268 514 278 530 curveto
+ 276 528 lineto
+ 274 524 lineto
+ 278 530 282 536 286 542 curveto
+ 288 544 290 546 292 546 curveto
+ 290 546 lineto
+ 294 550 lineto
+ 294 560 lineto
+ 290 546 lineto
+ 270 536 lineto
+ 276 536 lineto
+ 280 538 lineto
+ 286 540 lineto
+ 286 542 lineto
+ 296 550 306 558 316 562 curveto
+ 314 562 lineto
+ 308 558 lineto
+ 310 560 lineto
+ 316 562 322 564 328 566 curveto
+ 326 566 lineto
+ 324 564 lineto
+ 324 566 lineto
+ 334 568 344 570 352 572 curveto
+ 346 570 lineto
+ 346 572 lineto
+ 370 576 396 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 444 574 470 574 494 570 curveto
+ 492 570 lineto
+ 486 572 lineto
+ 488 570 lineto
+ 496 568 506 566 516 564 curveto
+ 514 564 lineto
+ 512 566 lineto
+ 512 564 lineto
+ 518 562 524 560 530 558 curveto
+ 524 562 lineto
+ 524 560 lineto
+ 534 556 544 548 554 540 curveto
+ 552 540 lineto
+ 558 538 lineto
+ 562 536 lineto
+ 568 536 lineto
+ 548 546 lineto
+ 544 556 lineto
+ 544 550 lineto
+ 548 546 lineto
+ 548 544 lineto
+ 550 544 552 542 554 540 curveto
+ 558 534 562 528 566 522 curveto
+ 564 524 lineto
+ 562 528 lineto
+ 572 512 578 492 582 474 curveto
+ 580 480 lineto
+ 582 478 lineto
+ 588 444 588 406 588 370 curveto
+ 588 366 lineto
+ 592 362 lineto
+ 596 356 lineto
+ 602 354 lineto
+ 606 352 lineto
+ 618 352 lineto
+ 620 354 lineto
+ 626 356 lineto
+ 632 362 lineto
+ 634 366 lineto
+ 636 372 lineto
+ 636 376 lineto
+ 634 376 lineto
+ 634 412 634 450 628 484 curveto
+ 628 488 lineto
+ 626 490 lineto
+ 622 508 616 528 606 544 curveto
+ 608 542 lineto
+ 604 548 lineto
+ 600 554 596 560 592 566 curveto
+ 590 568 588 570 586 570 curveto
+ 588 570 lineto
+ 582 574 lineto
+ 582 576 lineto
+ 572 584 562 592 552 596 curveto
+ 554 596 lineto
+ 548 598 lineto
+ 546 600 lineto
+ 540 602 534 604 528 606 curveto
+ 526 606 lineto
+ 526 608 lineto
+ 516 610 506 612 498 614 curveto
+ 492 614 lineto
+ 492 616 lineto
+ 468 620 442 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 394 618 368 618 344 614 curveto
+ 340 614 lineto
+ 338 612 lineto
+ 330 610 320 608 310 606 curveto
+ 308 606 lineto
+ 308 604 lineto
+ 302 602 296 600 290 598 curveto
+ 284 596 lineto
+ 284 594 lineto
+ 274 590 264 582 254 574 curveto
+ 256 574 lineto
+ 250 570 lineto
+ 250 568 lineto
+ 248 568 246 566 244 564 curveto
+ 240 558 236 552 232 546 curveto
+ 234 548 lineto
+ 230 542 lineto
+ 220 526 214 506 210 488 curveto
+ 210 484 lineto
+ 208 482 lineto
+ 202 448 202 410 202 374 curveto
+ 204 376 lineto
+ 204 366 lineto
+ 208 362 lineto
+ 212 356 lineto
+ 218 354 lineto
+ 222 352 lineto
+ 234 352 lineto
+ 236 354 lineto
+ 242 356 lineto
+ 248 362 lineto
+closepath
+%end path
+%new path
+ 204 372 moveto
+ 204 370 lineto
+ 204 344 204 316 210 292 curveto
+ 208 292 lineto
+ 210 288 lineto
+ 210 286 lineto
+ 214 272 218 256 226 244 curveto
+ 228 240 lineto
+ 230 238 lineto
+ 234 232 238 224 244 218 curveto
+ 244 220 lineto
+ 248 214 lineto
+ 250 214 lineto
+ 250 212 250 212 252 212 curveto
+ 260 204 268 198 278 194 curveto
+ 276 194 lineto
+ 282 192 lineto
+ 284 190 lineto
+ 290 188 296 186 302 184 curveto
+ 304 184 lineto
+ 304 182 lineto
+ 314 180 322 180 332 178 curveto
+ 338 178 lineto
+ 338 176 lineto
+ 364 172 394 172 420 172 curveto
+ 420 174 lineto
+ 446 174 476 174 502 178 curveto
+ 506 178 lineto
+ 508 180 lineto
+ 518 180 526 182 536 184 curveto
+ 538 184 lineto
+ 538 186 lineto
+ 544 188 550 190 556 192 curveto
+ 562 194 lineto
+ 562 196 lineto
+ 572 200 580 206 588 214 curveto
+ 590 214 590 214 590 216 curveto
+ 590 214 lineto
+ 594 220 lineto
+ 596 220 lineto
+ 602 226 606 234 610 240 curveto
+ 612 244 lineto
+ 614 246 lineto
+ 622 258 626 274 630 288 curveto
+ 628 288 lineto
+ 630 292 lineto
+ 630 294 lineto
+ 636 318 636 346 636 372 curveto
+ 636 376 lineto
+ 634 380 lineto
+ 632 386 lineto
+ 626 390 lineto
+ 620 394 lineto
+ 618 394 lineto
+ 612 396 lineto
+ 606 394 lineto
+ 602 394 lineto
+ 596 390 lineto
+ 592 386 lineto
+ 588 380 lineto
+ 588 376 lineto
+ 586 374 lineto
+ 586 348 586 320 580 296 curveto
+ 582 296 lineto
+ 582 300 lineto
+ 578 286 574 270 566 258 curveto
+ 570 264 lineto
+ 568 262 lineto
+ 564 256 560 248 554 242 curveto
+ 554 244 lineto
+ 552 238 lineto
+ 550 234 lineto
+ 550 230 lineto
+ 554 244 lineto
+ 574 254 lineto
+ 568 252 lineto
+ 566 252 lineto
+ 560 248 lineto
+ 558 248 lineto
+ 558 246 558 246 556 246 curveto
+ 548 238 540 232 530 228 curveto
+ 532 228 lineto
+ 538 232 lineto
+ 536 230 lineto
+ 530 228 524 226 518 224 curveto
+ 520 224 lineto
+ 522 226 lineto
+ 522 224 lineto
+ 512 222 504 220 494 218 curveto
+ 500 220 lineto
+ 500 218 lineto
+ 474 214 444 214 418 214 curveto
+ 420 216 lineto
+ 414 214 lineto
+ 410 214 lineto
+ 404 210 lineto
+ 400 206 lineto
+ 420 216 lineto
+ 440 206 lineto
+ 434 210 lineto
+ 428 214 lineto
+ 426 214 lineto
+ 420 216 lineto
+ 418 216 lineto
+ 392 216 362 216 336 220 curveto
+ 338 220 lineto
+ 344 218 lineto
+ 342 220 lineto
+ 332 222 324 224 314 226 curveto
+ 316 226 lineto
+ 318 224 lineto
+ 318 226 lineto
+ 312 228 306 230 300 232 curveto
+ 306 228 lineto
+ 306 230 lineto
+ 296 234 288 240 280 248 curveto
+ 278 248 278 248 278 250 curveto
+ 278 248 lineto
+ 272 252 lineto
+ 270 252 lineto
+ 264 254 lineto
+ 284 244 lineto
+ 288 234 lineto
+ 286 238 lineto
+ 284 244 lineto
+ 282 244 lineto
+ 276 250 272 258 268 264 curveto
+ 272 258 lineto
+ 270 260 lineto
+ 262 272 258 288 254 302 curveto
+ 256 302 lineto
+ 256 298 lineto
+ 250 322 250 350 250 376 curveto
+ 252 376 lineto
+ 250 380 lineto
+ 248 386 lineto
+ 242 390 lineto
+ 236 394 lineto
+ 234 394 lineto
+ 228 396 lineto
+ 222 394 lineto
+ 218 394 lineto
+ 212 390 lineto
+ 208 386 lineto
+ 204 380 lineto
+ 204 372 lineto
+closepath
+%end path
+fill
+) def
+
+/N
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 240 586 lineto
+ 240 584 lineto
+ 346 464 454 344 560 224 curveto
+ 564 220 lineto
+ 570 216 lineto
+ 574 216 lineto
+ 580 214 lineto
+ 586 216 lineto
+ 588 216 lineto
+ 594 220 lineto
+ 600 224 lineto
+ 602 230 lineto
+ 604 234 lineto
+ 604 238 lineto
+ 602 244 lineto
+ 600 248 lineto
+ 598 250 lineto
+ 492 370 384 490 278 610 curveto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 600 180 moveto
+ 602 186 lineto
+ 604 190 lineto
+ 604 600 lineto
+ 602 604 lineto
+ 600 610 lineto
+ 594 614 lineto
+ 588 618 lineto
+ 586 618 lineto
+ 580 620 lineto
+ 574 618 lineto
+ 570 618 lineto
+ 564 614 lineto
+ 560 610 lineto
+ 556 604 lineto
+ 556 600 lineto
+ 554 598 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 77 /M put
+Encoding 69 /E put
+Encoding 84 /T put
+Encoding 65 /A put
+Encoding 70 /F put
+Encoding 79 /O put
+Encoding 78 /N put
+
+Metrics
+ begin
+/.notdef 0 def
+/M 466 fudge add def
+/E 346 fudge add def
+/T 414 fudge 80 sub add def
+/A 370 fudge add def
+/F 346 fudge add def
+/O 434 fudge add def
+/N 370 fudge add def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.1 1.3 scale
+ % bounding box : [180 180 700 700]
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 10
+ 0 -100
+ charwdth 80 add 1000
+ setcachedevice
+ -182 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [182 fudge sub 180 700 620] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 11 scalefont setfont
+ 100 210 moveto (METAFONT) show
+ showpage
+
diff --git a/fonts/utilities/mf2ps/doc/printsamples/sy.ps b/fonts/utilities/mf2ps/doc/printsamples/sy.ps
new file mode 100644
index 0000000000..1e020e5833
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/sy.ps
@@ -0,0 +1,415 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+% pam 5-Jan-1988
+% Expanded arrays for 256 character gf fonts.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+% pam 5-Jan-1988 array enlarged for gf fonts
+ /BitMaps 256 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: sy.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 360 ] /lasy10.360 @newfont
+lasy10.360 @sf
+[<7FFFFFFCFFFFFFFEC0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C000
+ 0000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000
+ C0000000C0000000C0000000FFFFFFFE7FFFFFFC> 32 30 -4 3 38.743] 60 @dc
+[<7FFFFFFCFFFFFFFE000000060000000600000006000000060000000600000006000000060000000600000006000000060000
+ 0006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006
+ 000000060000000600000006FFFFFFFE7FFFFFFC> 32 30 -3 3 38.743] 61 @dc
+[<000020000000007000000000D8000000018C000000030600000006030000000C018000001800C00000300060000060003000
+ 00C00018000180000C00030000060006000003000C0000018018000000C03000000060600000003060000000303000000060
+ 18000000C00C00000180060000030003000006000180000C0000C000180000600030000030006000001800C000000C018000
+ 0006030000000306000000018C00000000D8000000007000000000200000> 40 36 -1 1 39.435] 51 @dc
+[<FFFFFFE0FFFFFFE0C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C000
+ 0060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060
+ FFFFFFE07FFFFFC0> 32 27 -5 -4 37.221] 50 @dc
+[<40000018E0000038F0000078D80000D8CC000198C6000318C3000618C1800C18C0C01818C0603018C0306018C018C018C00D
+ 8018C0070018C0070018C00D8018C018C018C0306018C0603018C0C01818C1800C18C3000618C6000318CC000198D80000D8
+ F0000078E000003840000018> 32 28 -3 -3 35.975] 49 @dc
+[ 360 ] /cmsy10.360 @newfont
+cmsy10.360 @sf
+[<800007E00080001FF00080003FF800C000781C00C001E00E006003C006007007800300381E0003001FFC0001000FF8000100
+ 07E0000100> 40 11 -3 -7 38.743] 24 @dc
+lasy10.360 @sf
+[<000000000600000000000300000000000300000001F00180000007FC018000000E0F00C000001803806000003000E0384000
+ 60007FFCC000C0001FFE7001800000383803000000600E0E000000C007FC0000018001F00000018000000000030000000000
+ 0300000000000600> 48 18 1 -3 49.812] 59 @dc
+[ 300 ] /cmmi12.300 @newfont
+cmmi12.300 @sf
+[<0000001800000078000001E00000078000001E00000078000003E000000F8000003C000000F0000003C000000F0000003C00
+ 0000F0000000F00000003C0000000F00000003C0000000F00000003C0000000F80000003E0000000780000001E0000000780
+ 000001E00000007800000018> 32 28 -4 2 37.935] 60 @dc
+cmsy10.360 @sf
+[<FFFFFFFC7FFFFFF800000000000000000000000000000000000000000000000000000000000000000000000C0000003C0000
+ 00F0000003C000000F0000003C000000F0000007C000001F00000078000001E00000078000001E00000078000000E0000000
+ 780000001E0000000780000001E0000000780000001F00000007C0000000F00000003C0000000F00000003C0000000F00000
+ 003C0000000C> 32 39 -4 7 38.743] 20 @dc
+cmmi12.300 @sf
+[<C0000000F00000003C0000000F00000003C0000000F00000003E0000000F80000001E0000000780000001E00000007800000
+ 01E00000007800000078000001E00000078000001E00000078000001E000000F8000003E000000F0000003C000000F000000
+ 3C000000F0000000C0000000> 32 28 -4 2 37.935] 62 @dc
+cmsy10.360 @sf
+[<FFFFFFFC7FFFFFF80000000000000000000000000000000000000000000000000000000000000000C0000000700000003C00
+ 00000F00000003C0000000F00000003C0000000F80000003E0000000780000001E0000000780000001E0000000780000001C
+ 00000078000001E00000078000001E00000078000003E000000F8000003C000000F0000003C000000F0000003C000000F000
+ 0000C0000000> 32 39 -4 7 38.743] 21 @dc
+[ 300 ] /cmr12.300 @newfont
+cmr12.300 @sf
+[<FFFE07C003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380
+ 0380038003800380F3800F8003800080> 16 33 -4 0 24.387] 49 @dc
+1 @bop1
+lasy10.360 @sf
+73 45 p (<=) s
+14 r (32) s
+14 r 49 c
+cmsy10.360 @sf
+0 r 24 c
+lasy10.360 @sf
+0 r 59 c
+cmmi12.300 @sf
+14 r 60 c
+424 48 p 3 29 ru
+cmsy10.360 @sf
+448 45 p 20 c
+480 41 p 3 27 ru
+518 48 p 3 29 ru
+cmmi12.300 @sf
+514 45 p 62 c
+567 41 p 3 27 ru
+cmsy10.360 @sf
+563 45 p 21 c
+cmr12.300 @sf
+963 2828 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/sy.tex b/fonts/utilities/mf2ps/doc/printsamples/sy.tex
new file mode 100644
index 0000000000..7cb83ed5f3
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/sy.tex
@@ -0,0 +1,11 @@
+\documentstyle [12pt] {article}
+
+\oddsidemargin 0in
+\evensidemargin 0in
+\topmargin -0.5in
+\textheight 9.0in
+\textwidth 6.5in
+
+\begin{document}
+$ \sqsubset \sqsupset \Diamond \Box \Join \sim \leadsto \lhd \unlhd \rhd \unrhd $
+\end{document}
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt.ps b/fonts/utilities/mf2ps/doc/printsamples/tt.ps
new file mode 100644
index 0000000000..3989da772a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt.ps
@@ -0,0 +1,180 @@
+%!PS-Adobe-2.0
+%%Creator: dvips by Radical Eye Software
+%%Title: tt.dvi
+%%Pages: 1 -1
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%%BeginDocument: tex.pro
+/TeXDict 200 dict def TeXDict begin /bdf{bind def}def /Inch{Resolution mul}
+bdf /Dots{72 div Resolution mul}bdf /dopage{72 Resolution div dup neg scale
+translate}bdf /@letter{Resolution dup -10 mul dopage}bdf /@note{@letter}bdf
+/@a4{Resolution dup -10.6929133858 mul dopage}bdf /@translate{translate}bdf
+/@scale{scale}bdf /@rotate{rotate}bdf /@landscape{[0 1 -1 0 0 0]concat
+Resolution dup dopage}bdf /@legal{Resolution dup -13 mul dopage}bdf
+/@manualfeed{statusdict /manualfeed true put}bdf /@copies{/#copies exch def}
+bdf /@FontMatrix[1 0 0 -1 0 0]def /@FontBBox[0 0 1 1]def /dmystr(ZZf@@)def
+/newname{dmystr cvn}bdf /df{/fontname exch def dmystr 2 fontname cvx(@@@)cvs
+putinterval newname 7 dict def newname load begin /FontType 3 def /FontMatrix
+@FontMatrix def /FontBBox @FontBBox def /BitMaps 256 array def /BuildChar{
+CharBuilder}def /Encoding TeXEncoding def end fontname{/foo setfont}2 array
+copy cvx def fontname load 0 dmystr 5 string copy cvn cvx put}bdf /dfe{
+newname newname load definefont setfont}bdf /ch-image{ch-data 0 get}bdf
+/ch-width{ch-data 1 get}bdf /ch-height{ch-data 2 get}bdf /ch-xoff{ch-data 3
+get}bdf /ch-yoff{ch-data 4 get}bdf /ch-tfmw{ch-data 5 get}bdf /CharBuilder{
+save 3 1 roll exch /BitMaps get exch get /ch-data exch def ch-data null ne{
+ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+setcachedevice ch-width ch-height true[1 0 0 1 ch-xoff .1 sub ch-yoff .1 sub]{
+ch-image}imagemask}if restore}bdf /dc{/ch-code exch def dup 0 get length 1 lt{
+pop[<00>1 1 0 0 8.00]}if /ch-data exch def newname load /BitMaps get ch-code
+ch-data put}bdf /bop{gsave /SaveImage save def 0 0 moveto}bdf /eop{clear
+SaveImage restore showpage grestore}bdf /@start{/Resolution exch def
+/TeXEncoding 256 array def 0 1 255{TeXEncoding exch 1 string dup 0 3 index put
+cvn put}for}bdf /p{show}bdf /RuleMatrix[1 0 0 -1 -.1 -.1]def /BlackDots 8
+string def /v{gsave currentpoint translate false RuleMatrix{BlackDots}
+imagemask grestore}bdf /a{moveto}bdf /delta 0 def /tail{dup /delta exch def 0
+rmoveto}bdf /b{exch p tail}bdf /c{p delta 4 sub tail}bdf /d{p delta 3 sub tail
+}bdf /e{p delta 2 sub tail}bdf /f{p delta 1 sub tail}bdf /g{p delta 0 rmoveto}
+bdf /h{p delta 1 add tail}bdf /i{p delta 2 add tail}bdf /j{p delta 3 add tail}
+bdf /k{p delta 4 add tail}bdf /l{p -4 0 rmoveto}bdf /m{p -3 0 rmoveto}bdf /n{
+p -2 0 rmoveto}bdf /o{p -1 0 rmoveto}bdf /q{p 1 0 rmoveto}bdf /r{p 2 0 rmoveto
+}bdf /s{p 3 0 rmoveto}bdf /t{p 4 0 rmoveto}bdf /w{0 rmoveto}bdf /x{0 exch
+rmoveto}bdf /y{3 -1 roll p moveto}bdf /bos{/section save def}bdf /eos{clear
+section restore}bdf /SDict 200 dict def SDict begin /@SpecialDefaults{/hs 8.5
+Inch def /vs 11 Inch def /ho 0 def /vo 0 def /hsc 1 def /vsc 1 def /ang 0 def
+/CLIP false def /BBcalc false def}bdf /@hsize{/hs exch def /CLIP true def}bdf
+/@vsize{/vs exch def /CLIP true def}bdf /@hoffset{/ho exch def}bdf /@voffset{
+/vo exch def}bdf /@hscale{@scaleunit div /hsc exch def}bdf /@vscale{
+@scaleunit div /vsc exch def}bdf /@angle{/ang exch def}bdf /@scaleunit 100 def
+/@rwi{10 div /rwi exch def}bdf /@llx{/llx exch def}bdf /@lly{/lly exch def}
+bdf /@urx{/urx exch def}bdf /@ury{/ury exch def /BBcalc true def}bdf
+/@setclipper{BBcalc{rwi urx llx sub div dup scale llx neg lly neg translate}{
+hsc vsc scale}ifelse CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg
+0 rlineto closepath clip}{initclip}ifelse}bdf end /@MacSetUp{userdict /md
+known{userdict /md get type /dicttype eq{md begin /letter{}def /note{}def
+/legal{}def /od{txpose 1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark{transform{itransform moveto}}{transform{itransform
+lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}def /txpose{pxs pys
+scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if xflip yflip
+not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}
+if}{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{
+translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2
+get ppr 0 get neg sub neg translate}if xflip yflip not and{translate pop pop
+90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{
+translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}
+if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2
+copy translate .96 dup scale neg exch neg exch translate}if}def /cp{pop pop
+showpage pm restore}def end}if}if}def /psf$TeXscale{65536 div}def /startTexFig
+{/psf$SavedState save def userdict maxlength dict begin Resolution 72 div dup
+neg scale currentpoint translate /psf$ury exch psf$TeXscale def /psf$urx exch
+psf$TeXscale def /psf$lly exch psf$TeXscale def /psf$llx exch psf$TeXscale def
+/psf$y exch psf$TeXscale def /psf$x exch psf$TeXscale def currentpoint /psf$cy
+exch def /psf$cx exch def /psf$sx psf$x psf$urx psf$llx sub div def /psf$sy
+psf$y psf$ury psf$lly sub div def psf$sx psf$sy scale psf$cx psf$sx div
+psf$llx sub psf$cy psf$sy div psf$ury sub translate /showpage{}def /erasepage{
+}def /copypage{}def @MacSetUp}def /doclip{psf$llx psf$lly psf$urx psf$ury
+currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll exch lineto
+exch lineto exch lineto closepath clip newpath moveto}def /endTexFig{end
+psf$SavedState restore}def /@beginspecial{SDict begin /SpecialSave save def
+gsave Resolution 72 div dup neg scale currentpoint translate @SpecialDefaults}
+bdf /@setspecial{ho vo translate @setclipper ang rotate /showpage{}def newpath
+}bdf /@endspecial{grestore clear SpecialSave restore end}bdf /@defspecial{
+SDict begin}bdf /@fedspecial{end}bdf /li{lineto}bdf /rl{rlineto}bdf /rc{
+rcurveto}bdf /np{/SaveX currentpoint /SaveY exch def def newpath}bdf /st{
+stroke SaveX SaveY moveto}bdf /fil{fill SaveX SaveY moveto}bdf /ellipse{
+/endangle exch def /startangle exch def /yrad exch def /xrad exch def
+/savematrix matrix currentmatrix def translate xrad yrad scale 0 0 1
+startangle endangle arc savematrix setmatrix}bdf end
+%%EndDocument
+TeXDict begin 300 @start /fa df[<7F01FCFF83FE7F01FC1C00700E00E00E00E00E00E00E
+00E00FFFE007FFC007FFC00701C00701C003838003838003838003838001C70001C70001C70001
+C70000C60000C60000EE0000EE0000EE00006C00007C00007C00003800>23 30 -1 0 26]65 dc
+[<00FE0003FF8007FFC00F83E01E00F01C00703C0078780038700038700038F00000E00000E000
+00E00000E00000E00000E00000E00000E00000F000007000387000387800383C00781C00781E00
+F80F83F807FFF803FFB800FE38>21 30 -2 0 26]67 dc[<FFFFFCFFFFFCFFFFFC1C001C1C001C
+1C001C1C001C1C001C1C00001C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E00
+1C0E001C0E001C00001C00001C00001C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8>22 30
+-2 0 26]69 dc[<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E
+00000E03800E03800E03800FFF800FFF800FFF800E03800E03800E03800E00000E00000E00000E
+001C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC>22 30 -1 0 26]70 dc[<FF83FEFF83FEFF83
+FE1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701FFFF01FFF
+F01FFFF01C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070FF83FEFF83
+FEFF83FE>23 30 -1 0 26]72 dc[<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80>17 30 -4 0 26]73 dc[<7F
+FFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E00000E00000E00000E
+00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+00007FE000FFF0007FE000>22 30 -1 0 26]76 dc[<7F007F00FF80FF807F007F001C001C001C
+001C001C001C001C001C001C001C001C001C001C001C001C1C1C001C1C1C001C3E1C001C361C00
+1C361C001C771C001C771C001C631C001CE39C001CE39C001CC19C001CC19C001DC1DC001DC1DC
+001D80DC001D80DC001D80DC007F007F00FF007F807E003F00>25 30 0 0 26]77 dc[<FF80F0
+FF81F0FF81F01C03701C03701C07701C06701C06701C0E701C0E701C0C701C1C701C1C701C1870
+1C38701C38701C30701C70701C70701C60701CE0701CE0701CC0701CC0701DC0701D80701D8070
+FF03FEFF03FEFE03FE>23 30 -1 0 26]78 dc[<0FFE003FFF807FFFC07C07C07001C0F001E0F0
+01E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E0
+00E0E000E0E000E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00>19 30 -3 0 26
+]79 dc[<FF8000FF8000FF80001C00001C00001C00001C00001C00001C00001C00001C00001C00
+001FFE001FFF801FFFC01C03E01C00F01C00701C00781C00381C00381C00381C00381C00781C00
+701C00F01C03E0FFFFC0FFFF80FFFE00>21 30 -2 0 26]80 dc[<FF803CFF807EFF80FF1C00E7
+1C00E71C00E71C00E21C00E01C00E01C00E01C00E01C00E01C01E01C07C01FFF801FFF001FFF80
+1C07C01C01E01C00F01C00701C00701C00701C00701C00F01C01E01C07C0FFFF80FFFF00FFFC00
+>24 30 -1 0 26]82 dc[<E3FC00FFFE00FFFF80FE0780F003C0F001E0E000E0E000E06000E000
+00E00001E00001C00003C0000F8001FF000FFE001FF8003F0000780000F00000E00000E001C0E0
+01C0E001C0F003C07007C07C1FC03FFFC01FFDC007F1C0>19 30 -3 0 26]83 dc[<03FF8003FF
+8003FF800038000038000038000038000038000038000038000038000038000038000038000038
+00003800003800003800003800003800003800003800003800E0380EE0380EE0380EE0380EFFFF
+FEFFFFFE7FFFFE>23 30 -1 0 26]84 dc[<003800007C00007C00006C0000EE0000EE0000EE00
+00C60001C70001C70001C70001C7000383800383800383800383800701C00701C00701C00701C0
+0E00E00E00E00E00E01E00F01C00701C00701C0070FF01FEFF01FEFF01FE>23 30 -1 0 26]86
+dc[<0701C00F83E00F83E00D83600D83600D83600DC7600DC7600DC7601CC6701CC6701CEE701C
+EE701CEE701CEE701CEE701C7C70387C3838003838003838003838003838003838003838003878
+003C70001CFE00FEFF01FEFE00FE>23 30 -1 0 26]87 dc dfe /fb df[<7F1FC0FF1FE07F1F
+C01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C
+0003180003B80003B80003B80001B00001B00001F00001F00000E000>19 25 -1 0 22]65 dc[<
+01F00007FC000FFE001F0F003C0780780380780380700380F00000E00000E00000E00000E00000
+E00000E00000E00000F000007003807803807807803C07801F0F800FFF8007FF8001F180>17 25
+-2 0 22]67 dc[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C
+1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C01C01C01C01C01C01C01C07FFFC0FF
+FFC07FFFC0>19 25 -1 0 22]69 dc[<FF8000FFC000FF80001C00001C00001C00001C00001C00
+001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C00E01C00E01C00
+E01C00E0FFFFE0FFFFE0FFFFE0>19 25 -1 0 22]70 dc[<7F1FC0FFBFE07F1FC01C07001C0700
+1C07001C07001C07001C07001C07001C07001C07001FFF001FFF001FFF001C07001C07001C0700
+1C07001C07001C07001C07007F1FC0FFBFE07F1FC0>19 25 -1 0 22]72 dc[<FFFEFFFEFFFE03
+80038003800380038003800380038003800380038003800380038003800380038003800380FFFE
+FFFEFFFE>15 25 -3 0 22]73 dc[<FE0FE0FE0FE0FE0FE0380380380380380380380380380380
+38E38038E38039F38039B38039B38039B38039B3803BBB803BBB803B1B803B1B803B1B803B1B80
+3A0B80FE0FE0FE0FE0FC07E0>19 25 -1 0 22]77 dc[<7F0F00FF9F007F1F001C17001C37001C
+37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7001DC7001D
+87001D87001D87001D07007F1FC0FF3FE07E1FC0>19 25 -1 0 22]78 dc[<1FFC003FFE007FFF
+00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E003
+80E00380E00380E00380E00380F00780780F007FFF003FFE001FFC00>17 25 -2 0 22]79 dc[<
+7F0000FF80007F00001C00001C00001C00001C00001C00001C00001C00001FF8001FFE001FFF00
+1C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F807FFF00FFFE007FF800>18 25
+-1 0 22]80 dc[<7F03C0FF87E07F0FF01C0E701C0E701C0E201C0E001C0E001C0E001C0E001C
+3E001FFC001FF8001FFC001C1E001C0F001C07001C07001C07001C07001C0F001C1E007FFC00FF
+F8007FE000>20 25 -1 0 22]82 dc[<C7F000FFFC00FFFE00F80F00F00780E00380E003800003
+80000380000780000F0000FE0007FC001FF0007F8000780000F00000E00000E00700E00700F00F
+00781F007FFF001FFF0007E300>17 25 -2 0 22]83 dc[<07FC000FFE0007FC0000E00000E000
+00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
+E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0>19 25 -1 0 22]84 dc[<0E0E000F1E000F
+1E001B1B0019130019B30019B30019B30019B30019B30019B30039B38039F38039F38038E38038
+03803803803803803001807001C07001C07001C0FC07E0FE0FE0FC07E0>19 25 -1 0 22]87 dc
+dfe /fc df[<FFF80F800700070007000700070007000700070007000700070007000700070007
+00070007000700070007000700C7003F0007000300>13 27 -4 0 21]49 dc dfe end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+ TeXDict begin @letter
+%%EndSetup
+%%Page: 1 1
+ bop 83 42 a fb(THIS)21 b(IS)g(CMTT)g(TEN)h(POINTS)e(WRITTEN)g(IN)i(METAFONT)
+83 91 y fa(THIS)i(IS)h(CMTT)f(TWELVE)g(POINTS)f(WRITTEN)g(IN)i(METAFONT)965
+2770 y fc(1)g eop
+%%Trailer
+ end
+%%EOF
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt.tex b/fonts/utilities/mf2ps/doc/printsamples/tt.tex
new file mode 100644
index 0000000000..9eaad5ce86
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt.tex
@@ -0,0 +1,8 @@
+\font\test=cmtt10
+\test
+THIS IS CMTT TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt12
+\test
+THIS IS CMTT TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt7.ps b/fonts/utilities/mf2ps/doc/printsamples/tt7.ps
new file mode 100644
index 0000000000..a61024be70
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt7.ps
@@ -0,0 +1,457 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /BitMaps 128 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 128 array def
+ 0 1 127 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: tt7.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 1500 ] /cmtt8.1500 @newfont
+cmtt8.1500 @sf
+[<1FF01FF00380038003800380038003800380038003800380038003800380E38EE38EE38EFFFEFFFE> 16 20 -1 0 17.642] 84 @dc
+[<FEFEFEFE38383838383838383838383838383FF83FF83838383838383838383838383838FEFEFEFE> 16 20 -1 0 17.642] 72 @dc
+[<FFF8FFF80700070007000700070007000700070007000700070007000700070007000700FFF8FFF8> 16 20 -2 0 17.642] 73 @dc
+[<CF80FFE0F070F078E038E0380038007800F00FF03FE07F00F000F000E070E070E0F070F03FF01F30> 16 20 -2 0 17.642] 83 @dc
+[<03E00FF81C3C381E780E700EF00EE000E000E000E000E000E000F00E700E781E381E1C3E0FFE03E6> 16 20 -1 0 17.642] 67 @dc
+[<FE3F80FE3F80380E00380E00380E00380E00380E0039CE0039CE003BEE003B6E003B6E003B6E003B6E003B6E003B6E003A2E
+ 003A2E00FE3F80FE3F80> 24 20 0 0 17.642] 77 @dc
+[<FFFEFFFE380E380E380E380E380038E038E03FE03FE038E038E038003800380E380E380EFFFEFFFE> 16 20 -1 0 17.642] 69 @dc
+[<07B81FF83CF8387870787038F038E038E1FEE1FEE000E000E000F0387038703838783CF81FF80798> 16 20 -1 0 17.642] 71 @dc
+[<FE00FE003800380038003800380038003FE03FF8383C381C380E380E380E380E381C383CFFF8FFE0> 16 20 -1 0 17.642] 80 @dc
+[<3FE07FF07070E038E038E038E038E038E038E038E038E038E038E038E038E038E03870707FF03FE0> 16 20 -2 0 17.642] 79 @dc
+[<FEF8FEF838B838B839B839B839B839B839B839B83B383B383B383B383B383B383A383A38FEFEFEFE> 16 20 -1 0 17.642] 78 @dc
+[<0E38001E3C001F7C001B6C001B6C001B6C001B6C001B6C001B6C001BEC003BEE003BEE00380E00380E00380E00380E00380E
+ 00380E00FE3F80FE3F80> 24 20 0 0 17.642] 87 @dc
+[<FE1CFE3F38773877387038703870387038F03FE03FE038F03878383838383838387838F0FFE0FF80> 16 20 -1 0 17.642] 82 @dc
+[<FEFEFEFE3838383838381FF01FF01C701C701C700C600EE00EE00EE00EE006C006C007C007C00380> 16 20 -1 0 17.642] 65 @dc
+[<FF00FF003800380038003800380038E038E03FE03FE038E038E038003800380E380E380EFFFEFFFE> 16 20 -1 0 17.642] 70 @dc
+[ 1500 ] /cmtt10.1500 @newfont
+cmtt10.1500 @sf
+[<07FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+ 0000E000E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0> 24 25 -1 0 21.793] 84 @dc
+[<7F1FC0FFBFE07F1FC01C07001C07001C07001C07001C07001C07001C07001C07001C07001FFF001FFF001FFF001C07001C07
+ 001C07001C07001C07001C07001C07007F1FC0FFBFE07F1FC0> 24 25 -1 0 21.793] 72 @dc
+[<FFFEFFFEFFFE0380038003800380038003800380038003800380038003800380038003800380038003800380FFFEFFFEFFFE> 16 25 -3 0 21.793] 73 @dc
+[<C7F000FFFC00FFFE00F80F00F00780E00380E00380000380000380000780000F0000FE0007FC001FF0007F8000780000F000
+ 00E00000E00700E00700F00F00781F007FFF001FFF0007E300> 24 25 -2 0 21.793] 83 @dc
+[<01F00007FC000FFE001F0F003C0780780380780380700380F00000E00000E00000E00000E00000E00000E00000E00000F000
+ 007003807803807807803C07801F0F800FFF8007FF8001F180> 24 25 -2 0 21.793] 67 @dc
+[<FE0FE0FE0FE0FE0FE038038038038038038038038038038038E38038E38039F38039B38039B38039B38039B3803BBB803B1B
+ 803B1B803B1B803B1B803B1B803A0B80FE0FE0FE0FE0FC07E0> 24 25 -1 0 21.793] 77 @dc
+[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00
+ 001C00001C01C01C01C01C01C01C01C07FFFC0FFFFC07FFFC0> 24 25 -1 0 21.793] 69 @dc
+[<7F0F00FF9F007F1F001C17001C37001C37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7
+ 001DC7001D87001D87001D87001D07007F1FC0FF3FE07E1FC0> 24 25 -1 0 21.793] 78 @dc
+[<7F0000FF80007F00001C00001C00001C00001C00001C00001C00001C00001FF8001FFE001FFF001C0F801C03801C03C01C01
+ C01C01C01C01C01C03C01C03801C0F807FFF00FFFE007FF800> 24 25 -1 0 21.793] 80 @dc
+[<1FFC003FFE007FFF00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E003
+ 80E00380E00380E00380F00780780F007FFF003FFE001FFC00> 24 25 -2 0 21.793] 79 @dc
+[<0E0E000F1E000F1E001B1B0019130019B30019B30019B30019B30019B30019B30039B38039F38039F38038E3803803803803
+ 803803803001807001C07001C07001C0FC07E0FE0FE0FC07E0> 24 25 -1 0 21.793] 87 @dc
+[<7F03C0FF87E07F0FF01C0E701C0E701C0E201C0E001C0E001C0E001C0E001C3E001FFC001FF8001FFC001C1E001C0F001C07
+ 001C07001C07001C07001C0F001C1E007FFC00FFF8007FE000> 24 25 -1 0 21.793] 82 @dc
+[<7F1FC0FF1FE07F1FC01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C000318
+ 0003B80003B80003B80001B00001B00001F00001F00000E000> 24 25 -1 0 21.793] 65 @dc
+[<FF8000FFC000FF80001C00001C00001C00001C00001C00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00
+ 001C00001C00E01C00E01C00E01C00E0FFFFE0FFFFE0FFFFE0> 24 25 -1 0 21.793] 70 @dc
+[ 1500 ] /cmtt12.1500 @newfont
+cmtt12.1500 @sf
+[<03FF8003FF8003FF800038000038000038000038000038000038000038000038000038000038000038000038000038000038
+ 00003800003800003800003800003800003800E0380EE0380EE0380EE0380EFFFFFEFFFFFE7FFFFE> 24 30 -1 0 25.632] 84 @dc
+[<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701FFFF01FFFF01FFF
+ F01C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070FF83FEFF83FEFF83FE> 24 30 -1 0 25.632] 72 @dc
+[<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
+ 0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80> 24 30 -4 0 25.632] 73 @dc
+[<E3FC00FFFE00FFFF80FE0780F003C0F001E0E000E0E000E06000E00000E00001E00001C00003C0000F8001FF000FFE001FF8
+ 003F0000780000F00000E00000E001C0E001C0E001C0F003C07007C07C1FC03FFFC01FFDC007F1C0> 24 30 -3 0 25.632] 83 @dc
+[<00FE0003FF8007FFC00F83E01E00F01C00703C0078780038700038700038F00000E00000E00000E00000E00000E00000E000
+ 00E00000E00000F000007000387000387800383C00781C00781E00F80F83F807FFF803FFB800FE38> 24 30 -2 0 25.632] 67 @dc
+[<7F007F00FF80FF807F007F001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C1C1C001C1C1C001C3E
+ 1C001C361C001C361C001C771C001C771C001C631C001CE39C001CE39C001CC19C001CC19C001DC1DC001DC1DC001D80DC00
+ 1D80DC001D80DC007F007F00FF007F807E003F00> 32 30 0 0 25.632] 77 @dc
+[<0701C00F83E00F83E00D83600D83600D83600DC7600DC7600DC7601CC6701CC6701CEE701CEE701CEE701CEE701CEE701C7C
+ 70387C3838003838003838003838003838003838003838003878003C70001CFE00FEFF01FEFE00FE> 24 30 -1 0 25.632] 87 @dc
+[<FFFFFCFFFFFCFFFFFC1C001C1C001C1C001C1C001C1C001C1C00001C00001C00001C0E001C0E001C0E001FFE001FFE001FFE
+ 001C0E001C0E001C0E001C00001C00001C00001C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8> 24 30 -2 0 25.632] 69 @dc
+[<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E00000E00000E00000E00000E00000E00000E00
+ 000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00007FE000FFF0007FE000> 24 30 -1 0 25.632] 76 @dc
+[<003800007C00007C00006C0000EE0000EE0000EE0000C60001C70001C70001C70001C7000383800383800383800383800701
+ C00701C00701C00701C00E00E00E00E00E00E01E00F01C00701C00701C0070FF01FEFF01FEFF01FE> 24 30 -1 0 25.632] 86 @dc
+[<FF8000FF8000FF80001C00001C00001C00001C00001C00001C00001C00001C00001C00001FFE001FFF801FFFC01C03E01C00
+ F01C00701C00781C00381C00381C00381C00381C00781C00701C00F01C03E0FFFFC0FFFF80FFFE00> 24 30 -2 0 25.632] 80 @dc
+[<0FFE003FFF807FFFC07C07C07001C0F001E0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000
+ E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00> 24 30 -3 0 25.632] 79 @dc
+[<FF80F0FF81F0FF81F01C03701C03701C07701C06701C06701C0E701C0E701C0C701C1C701C1C701C18701C38701C38701C30
+ 701C70701C70701C60701CE0701CE0701CC0701CC0701DC0701D80701D8070FF03FEFF03FEFE03FE> 24 30 -1 0 25.632] 78 @dc
+[<FF803CFF807EFF80FF1C00E71C00E71C00E71C00E21C00E01C00E01C00E01C00E01C00E01C01E01C07C01FFF801FFF001FFF
+ 801C07C01C01E01C00F01C00701C00701C00701C00701C00F01C01E01C07C0FFFF80FFFF00FFFC00> 24 30 -1 0 25.632] 82 @dc
+[<7F01FCFF83FE7F01FC1C00700E00E00E00E00E00E00E00E00FFFE007FFC007FFC00701C00701C00383800383800383800383
+ 8001C70001C70001C70001C70000C60000C60000EE0000EE0000EE00006C00007C00007C00003800> 24 30 -1 0 25.632] 65 @dc
+[<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E00000E03800E03800E03800FFF800FFF800FFF
+ 800E03800E03800E03800E00000E00000E00000E001C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC> 24 30 -1 0 25.632] 70 @dc
+[ 1500 ] /cmr10.1500 @newfont
+cmr10.1500 @sf
+[<FFF80F80070007000700070007000700070007000700070007000700070007000700070007000700070007000700C7003F00
+ 07000300> 16 27 -4 0 20.755] 49 @dc
+1 @bop1
+cmtt8.1500 @sf
+83 42 p (THIS) s
+18 r (IS) s
+17 r (CMTT) s
+18 r (EIGHT) s
+18 r (POINTS) s
+17 r (WRITTEN) s
+18 r (IN) s
+18 r (METAFONT) s
+cmtt10.1500 @sf
+83 91 p (THIS) s
+22 r (IS) s
+22 r (CMTT) s
+21 r (TEN) s
+22 r (POINTS) s
+22 r (WRITTEN) s
+22 r (IN) s
+22 r (METAFONT) s
+cmtt12.1500 @sf
+83 141 p (THIS) s
+26 r (IS) s
+25 r (CMTT) s
+26 r (TWELVE) s
+26 r (POINTS) s
+25 r (WRITTEN) s
+26 r (IN) s
+25 r (METAFONT) s
+cmr10.1500 @sf
+965 2770 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt7.tex b/fonts/utilities/mf2ps/doc/printsamples/tt7.tex
new file mode 100644
index 0000000000..093783b32b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt7.tex
@@ -0,0 +1,12 @@
+\font\test=cmtt8
+\test
+THIS IS CMTT EIGHT POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt10
+\test
+THIS IS CMTT TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt12
+\test
+THIS IS CMTT TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/mf2ps/.make b/fonts/utilities/mf2ps/mf2ps/.make
new file mode 100644
index 0000000000..8f75a458be
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/.make
@@ -0,0 +1,3 @@
+date
+make
+date
diff --git a/fonts/utilities/mf2ps/mf2ps/Makefile b/fonts/utilities/mf2ps/mf2ps/Makefile
new file mode 100644
index 0000000000..521429e821
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/Makefile
@@ -0,0 +1,24 @@
+MFLIB = ../MFlib/mflib.a
+LIBS = -lsuntool -lsunwindow -lpixrect
+#
+mf2psv : mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB}
+# pc -g -w -o mf2psv mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB} ${LIBS}
+ pc -w -o mf2psv mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB} ${LIBS}
+mf2ps :mf2psv
+ strip mf2psv
+ mv mf2psv mf2ps
+#
+mf2psv.o : mf2psv.p mf2ps1.h
+ pc -g -w -c mf2psv.p
+#
+mf2ps1.o : mf2ps1.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps1.p
+#
+mf2ps2.o : mf2ps2.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps2.p
+#
+mf2ps3.o : mf2ps3.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps3.p
+#
+../MFfonts/bases/myplain.base : ../MFfonts/bases/myplain.mf
+ ../inimf < ini.put
diff --git a/fonts/utilities/mf2ps/mf2ps/README b/fonts/utilities/mf2ps/mf2ps/README
new file mode 100644
index 0000000000..4d702ebd9a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/README
@@ -0,0 +1,8 @@
+This directory contains almost all the modules to make mf2ps. If you have
+METAFONT84, you will see that these modules are modifications of those of
+mf84. This directory should be put parallel to that of mf84 so that the
+include of the ../MFlib/mflib.a works. Also it works only on the sun
+because of the use of suntool.
+
+The version of mf2ps here is after the modifications that yield more compact
+output. The directory uncompressing contains the old versions of these modules.
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps1.h b/fonts/utilities/mf2ps/mf2ps/mf2ps1.h
new file mode 100644
index 0000000000..ee416b3464
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps1.h
@@ -0,0 +1,388 @@
+label
+ 1, 9998, 9999;
+{:6} {11:}
+const
+ memmax = 30000;
+ maxinternal = 100;
+ bufsize = 500;
+ errorline = 79;
+ halferrorline = 50;
+ maxprintline = 79;
+ screenwidth = 1024;
+ screendepth = 1024;
+ stacksize = 30;
+ maxstrings = 2000;
+ stringvacancies = 8000;
+ poolsize = 32000;
+ movesize = 5000;
+ maxwiggle = 300;
+ gfbufsize = 800;
+ filenamesize = 256;
+ poolname = 'mf.pool';
+ pathsize = 300;
+ bistacksize = 785;
+ headersize = 100;
+ ligtablesize = 300;
+ maxfontdimen = 50; {:11} {18:}
+type
+ ASCIIcode = 0..127; {:18}
+{24:}
+ eightbits = 0..255;
+ alphafile = text;
+ {------------------}
+ postscript = text;
+ {------------------}
+ UNIXfilename = packed array [1..filenamesize] of char;
+ bytefile =
+ record
+ stdioptr: ^ integer;
+ locptr: ^ integer;
+ filename: UNIXfilename
+ end; {:24} {37:}
+ poolpointer = 0..poolsize;
+ strnumber = 0..maxstrings; {:37}
+{101:}
+ scaled = integer;
+ smallnumber = 0..63; {:101} {105:}
+ fraction = integer;
+{:105}
+ {106:}
+ angle = integer; {:106} {156:}
+ quarterword = -128..127;
+ halfword = -32768..32767;
+ twochoices = 1..2;
+ threechoices = 1..3;
+ twohalves = packed
+ record
+ rh: halfword;
+ case twochoices of
+ 1: (
+ lh: halfword
+ );
+ 2: (
+ b0: quarterword;
+ b1: quarterword
+ )
+ end;
+ fourquarters = packed
+ record
+ b0: quarterword;
+ b1: quarterword;
+ b2: quarterword;
+ b3: quarterword
+ end;
+ memoryword =
+ record
+ case threechoices of
+ 1: (
+ int: integer
+ );
+ 2: (
+ hh: twohalves
+ );
+ 3: (
+ qqqq: fourquarters
+ )
+ end;
+ wordfile = file of memoryword; {:156} {186:}
+ commandcode = 1..82; {:186} {565:}
+ screenrow = 0..screendepth;
+ screencol = 0..screenwidth;
+ transspec = array [screencol] of screencol;
+ pixelcolor = 0..1; {:565} {571:}
+ windownumber = 0..15; {:571} {627:}
+ instaterecord =
+ record
+ indexfield: quarterword;
+ startfield, locfield, limitfield, namefield: halfword
+ end; {:627} {1151:}
+ gfindex = 0..gfbufsize;
+ gfbuftype = array [gfindex] of eightbits; {:1151} {13:}
+var
+ bad: integer; {:13} {20:}
+ xord: array [char] of ASCIIcode;
+ xchr: array [ASCIIcode] of char; {:20} {25:}
+ nameoffile, realnameoffile: UNIXfilename;
+ namelength: 0..filenamesize; {:25}
+{29:}
+ buffer: array [0..bufsize] of ASCIIcode;
+ first: 0..bufsize;
+ last: 0..bufsize;
+ maxbufstack: 0..bufsize; {:29} {38:}
+ strpool: packed array [poolpointer] of ASCIIcode;
+ strstart: array [strnumber] of poolpointer;
+ poolptr: poolpointer;
+ strptr: strnumber;
+ initpoolptr: poolpointer;
+ initstrptr: strnumber;
+ maxpoolptr: poolpointer;
+ maxstrptr: strnumber; {:38} {42:}
+ strref: array [strnumber] of 0..127; {:42} {50:}
+ poolfile: alphafile; {:50} {54:}
+ logfile: alphafile;
+ {-------------------------------------------------------------}
+ psfile :postscript; { the PostScript code }
+ g :postscript; { holds the character information after re-arrange}
+ lastx0 , lasty0 :real ; { last point in sunpath }
+ lastx3 , lasty3 :real ; { make optimization on commands }
+ prevtox3 , prevtoy3 :real;
+ lastyearval , { mark entering to macros }
+ lastmonthval :integer; { STROKE , FILL , and ERASE }
+ { in MY plain.mf }
+ my_xx , my_yy :integer; { hold the values of xx & yy }
+ LineSource : integer; { Identifier for sendline source }
+ CurveSource : integer; { Identifier for makemoves source }
+ foundnew : boolean; { true while xchr[s]='[' until ']' }
+ ascval : integer; { holds the ascii of curr. letter }
+ ascii_on : boolean; { reading ascval is 'on' }
+ {-------------------------------------------------------------}
+ selector: 0..5;
+ dig: array [0..22] of 0..15;
+ tally: integer;
+ termoffset: 0..maxprintline;
+ fileoffset: 0..maxprintline;
+ trickbuf: array [0..errorline] of ASCIIcode;
+ trickcount: integer;
+ firstcount: integer; {:54} {68:}
+ interaction: 0..3; {:68} {71:}
+ deletionsallowed: boolean;
+ history: 0..3;
+ errorcount: -1..100; {:71} {74:}
+ helpline: array [0..5] of strnumber;
+ helpptr: 0..6;
+ useerrhelp: boolean;
+ errhelp: strnumber; {:74} {91:}
+ interrupt: integer;
+ OKtointerrupt: boolean;
+{:91}
+ {97:}
+ aritherror: boolean; {:97} {129:}
+ twotothe: array [0..30] of integer;
+ speclog: array [1..28] of integer; {:129} {137:}
+ specatan: array [1..26] of angle; {:137} {144:}
+ nsin, ncos: fraction; {:144}
+{148:}
+ randoms: array [0..54] of fraction;
+ jrandom: 0..54; {:148} {158:}
+ tempptr: halfword; {:158} {159:}
+ mem: array [-30000..memmax] of memoryword;
+ lomemmax: halfword;
+ himemmin: halfword; {:159} {160:}
+ varused, dynused: integer;
+{:160}
+ {161:}
+ avail: halfword;
+ memend: halfword; {:161} {166:}
+ rover: halfword;
+{:166}
+ {178:}
+ freearr: packed array [-30000..memmax] of boolean;
+ wasfree: packed array [-30000..memmax] of boolean;
+ wasmemend, waslomax, washimin: halfword;
+ panicking: boolean; {:178} {190:}
+ internal: array [1..maxinternal] of scaled;
+ intname: array [1..maxinternal] of strnumber;
+ intptr: 40..maxinternal; {:190}
+{196:}
+ oldsetting: 0..5; {:196} {198:}
+ charclass: array [ASCIIcode] of 0..20;
+{:198}
+ {200:}
+ hashused: halfword;
+ stcount: integer; {:200} {201:}
+ hash: array [1..2241] of twohalves;
+ eqtb: array [1..2241] of twohalves; {:201}
+{225:}
+ gpointer: halfword; {:225} {230:}
+ bignodesize: array [13..14] of smallnumber; {:230} {250:}
+ saveptr: halfword;
+{:250}
+ {267:}
+ pathtail: halfword; {:267} {279:}
+ deltax, deltay, delta: array [0..pathsize] of scaled;
+ psi: array [1..pathsize] of angle; {:279} {283:}
+ theta: array [0..pathsize] of angle;
+ uu: array [0..pathsize] of fraction;
+ vv: array [0..pathsize] of angle;
+ ww: array [0..pathsize] of fraction; {:283}
+{298:}
+ st, ct, sf, cf: fraction; {:298} {308:}
+ move: array [0..movesize] of integer;
+ moveptr: 0..movesize; {:308} {309:}
+ bisectstack: array [0..bistacksize] of integer;
+ bisectptr: 0..bistacksize;
+{:309}
+ {327:}
+ curedges: halfword;
+ curwt: integer; {:327} {371:}
+ tracex: integer;
+ tracey: integer;
+ traceyy: integer; {:371} {379:}
+ octant: 1..8; {:379} {389:}
+ curx, cury: scaled; {:389} {395:}
+ octantdir: array [1..8] of strnumber; {:395}
+{403:}
+ curspec: halfword;
+ turningnumber: integer;
+ curpen: halfword;
+ curpathtype: 0..2;
+ maxallowed: scaled; {:403} {427:}
+ before, after: array [0..maxwiggle] of scaled;
+ nodetoround: array [0..maxwiggle] of halfword;
+ curroundingptr: 0..maxwiggle;
+ maxroundingptr: 0..maxwiggle; {:427} {430:}
+ curgran: scaled; {:430} {448:}
+ octantnumber: array [1..8] of 1..8;
+ octantcode: array [1..8] of 1..8; {:448}
+{455:}
+ revturns: boolean; {:455} {461:}
+ ycorr, xycorr, zcorr: array [1..8] of 0..1;
+ xcorr: array [1..8] of -1..1; {:461}
+{464:}
+ m0, n0, m1, n1: integer;
+ d0, d1: 0..1; {:464} {507:}
+ envmove: array [0..movesize] of integer; {:507} {552:}
+ tolstep: 0..6; {:552}
+{555:}
+ curt, curtt: integer;
+ timetogo: integer;
+ maxt: integer; {:555} {557:}
+ delx, dely: integer;
+ tol: integer;
+ uv, xy: 0..bistacksize;
+ threel: integer;
+ apprt, apprtt: integer; {:557} {566:}
+{screenpixel:array[screenrow,screencol]of pixelcolor;}
+ {:566}
+ {569:}
+ screenstarted: boolean;
+ screenOK: boolean; {:569} {572:}
+ windowopen: array [windownumber] of boolean;
+ leftcol: array [windownumber] of screencol;
+ rightcol: array [windownumber] of screencol;
+ toprow: array [windownumber] of screenrow;
+ botrow: array [windownumber] of screenrow;
+ mwindow: array [windownumber] of integer;
+ nwindow: array [windownumber] of integer;
+ windowtime: array [windownumber] of integer; {:572} {579:}
+ rowtransition: transspec; {:579} {585:}
+ serialno: integer; {:585} {592:}
+ fixneeded: boolean;
+ watchcoefs: boolean;
+ depfinal: halfword; {:592} {624:}
+ curcmd: eightbits;
+ curmod: integer;
+ cursym: halfword; {:624} {628:}
+ inputstack: array [0..stacksize] of instaterecord;
+ inputptr: 0..stacksize;
+ maxinstack: 0..stacksize;
+ curinput: instaterecord; {:628} {631:}
+ inopen: 0..6;
+ inputfile: array [1..6] of alphafile;
+ line: integer;
+ linestack: array [1..6] of integer; {:631} {633:}
+ paramstack: array [0..150] of halfword;
+ paramptr: 0..150;
+ maxparamstack: integer; {:633} {634:}
+ fileptr: 0..stacksize; {:634} {659:}
+ scannerstatus: 0..6;
+ warninginfo: integer; {:659} {680:}
+ forceeof: boolean;
+{:680}
+ {699:}
+ bgloc, egloc: 1..2241; {:699} {738:}
+ condptr: halfword;
+ iflimit: 0..4;
+ curif: smallnumber;
+ ifline: integer; {:738} {752:}
+ loopptr: halfword; {:752} {767:}
+ curname: strnumber;
+ curarea: strnumber;
+ curext: strnumber; {:767} {768:}
+ areadelimiter: poolpointer;
+ extdelimiter: poolpointer; {:768} {775:}
+ MFbasedefault: packed array [1..10] of char; {:775} {782:}
+ jobname: strnumber;
+ logname: strnumber; {:782} {785:}
+ gfext: strnumber; {:785} {791:}
+ gffile: bytefile;
+ outputfilename: strnumber; {:791} {796:}
+ curtype: smallnumber;
+ curexp: integer; {:796} {813:}
+ maxc: array [17..18] of integer;
+ maxptr: array [17..18] of halfword;
+ maxlink: array [17..18] of halfword; {:813} {821:}
+ varflag: 0..82; {:821} {954:}
+ txx, txy, tyx, tyy, tx, ty: scaled; {:954} {1077:}
+ startsym: halfword; {:1077}
+{1084:}
+ longhelpseen: boolean; {:1084} {1087:}
+ tfmfile: bytefile;
+ metricfilename: strnumber; {:1087} {1096:}
+ bc, ec: eightbits;
+ tfmwidth: array [eightbits] of scaled;
+ tfmheight: array [eightbits] of scaled;
+ tfmdepth: array [eightbits] of scaled;
+ tfmitalcorr: array [eightbits] of scaled;
+ charexists: array [eightbits] of boolean;
+ chartag: array [eightbits] of 0..3;
+ charremainder: array [eightbits] of eightbits;
+ headerbyte: array [1..headersize] of -1..255;
+ ligkern: array [0..ligtablesize] of fourquarters;
+ nl: 0..ligtablesize;
+ kern: array [eightbits] of scaled;
+ nk: 0..256;
+ exten: array [eightbits] of fourquarters;
+ ne: 0..256;
+ param: array [1..maxfontdimen] of scaled;
+ np: 0..maxfontdimen;
+ nw, nh, nd, ni: 0..256; {:1096} {1119:}
+ perturbation: scaled; {:1119} {1125:}
+ dimenhead: array [1..4] of halfword; {:1125} {1130:}
+ maxtfmdimen: scaled;
+ tfmchanged: integer; {:1130} {1149:}
+ gfminm, gfmaxm, gfminn, gfmaxn: integer;
+ gfprevptr: integer;
+ totalchars: integer;
+ charptr: array [eightbits] of integer;
+ gfdx, gfdy: array [eightbits] of integer; {:1149} {1152:}
+ gfbuf: gfbuftype;
+ halfbuf: gfindex;
+ gflimit: gfindex;
+ gfptr: gfindex;
+ gfoffset: integer; {:1152}
+{1162:}
+ bocc, bocp: integer; {:1162} {1183:}
+ baseident: strnumber; {:1183}
+{1188:}
+ basefile: wordfile; {:1188} {1203:}
+ readyalready: integer; {:1203}
+{1214:}
+ editnamestart: poolpointer;
+ editnamelength, editline: integer; {:1214}
+
+procedure unskew(x, y: scaled; octant: smallnumber);external;
+
+procedure sendcurve(x0,x1,x2,x3,y0,y1,y2,y3,octant:integer);external;
+
+procedure sendline(x0,y0,x1,y1,octant,LineSource:integer);external;
+
+procedure confusion(s: strnumber);external;
+
+function abvscd(a, b, c, d: integer): integer;external;
+
+procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber;CurveSource:integer;oc:smallnumber);external;
+
+procedure print_start(var f:postscript);external;
+
+procedure print_end(var f:postscript);external;
+
+procedure init_ps(var f:postscript);external;
+
+procedure tini_ps(var f:postscript);external;
+
+procedure auxslowprint(s: integer);external;
+
+procedure auxprintnl(s: strnumber);external;
+
+procedure sendascii(asc: integer);external;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps1.p b/fonts/utilities/mf2ps/mf2ps/mf2ps1.p
new file mode 100644
index 0000000000..f5e4ac033a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps1.p
@@ -0,0 +1,95 @@
+#include "mf2ps1.h" {contain the declarations}
+#include "mf2ps2.h" {contain external for send_p_s}
+
+procedure unskew;
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x + y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y;
+ cury := x + y
+ end;
+ 6:
+ begin
+ curx := -y;
+ cury := x + y
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) - y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := -y;
+ cury := (-x) - y
+ end;
+ 7:
+ begin
+ curx := y;
+ cury := (-x) - y
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+end; { unskew }
+{:388}
+ {473:}
+
+procedure sendcurve;
+{ unskews the values and sends a curve to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ unskew(x2,y2,octant);
+ x2s := curx;
+ y2s := cury;
+ unskew(x3,y3,octant);
+ x3s := curx;
+ y3s := cury;
+ curx := tmpx;
+ cury := tmpy;
+ send_p_s(x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s);
+end;
+
+procedure sendline;
+{ unskews the values and sends a line to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ if (LineSource = 510)
+ or (LineSource = 515)
+ or (LineSource = 521)
+ then send_p_s(x0s,y0s,x1s,y1s,0,0,0,0);
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps2.h b/fonts/utilities/mf2ps/mf2ps/mf2ps2.h
new file mode 100644
index 0000000000..728d18f93c
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps2.h
@@ -0,0 +1,25 @@
+const maxletters = 150;
+type currentletter = array [0..64] of char;
+ C = (x,y);
+ XandYval = array [x..y] of real;
+var new , fillexist : boolean;
+ lastfill : char; { marks last kind of filling stroke, fill or erase }
+ ans : char;
+ dict : 0..1; { 1 ==> creating dictionary }
+ direction : char; { for optimization of connected ( horizontals, verticals ) lines. }
+ lastwasline : boolean; { true if last line in the beffer}
+ erasein : boolean; { marks existing of path to be erased }
+ fout : packed array [1..15] of char; { output file name }
+ curletter : currentletter;
+ all_letters : array [1..maxletters] of currentletter;
+ all_ascii : array [1..maxletters] of integer;
+ all_metrics : array [1..maxletters] of integer; { holds the width of each letter }
+ no_of_letter : integer;
+ name_length : integer;
+ minbox,maxbox : XandYval;
+ lmin_x,lmax_x : real; { local min and max for each letter }
+ doscale : XandYval;
+ dotranslate : XandYval;
+ needtransform : boolean; { true if cur_box <> 0,1000 }
+
+procedure send_p_s(x0,y0,x1,y1,x2,y2,x3,y3:integer);external;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps2.p b/fonts/utilities/mf2ps/mf2ps/mf2ps2.p
new file mode 100644
index 0000000000..3b219c5a26
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps2.p
@@ -0,0 +1,143 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+
+function ok (x,y : real):boolean;
+{ gives back true if direction is kept by x,y values }
+begin
+ if direction = 'h' then
+ if x = lastx3 then ok := true
+ else ok := false
+ else if direction = 'v' then
+ if y = lasty3 then ok := true
+ else ok := false
+ else ok := false;
+end;
+
+procedure restore (x,y : real);
+{ keeps direction if deals with lines, and last point values
+ for optimization on vertical and horizontal lines. }
+begin
+ if x = lastx3 then direction := 'h'
+ else if y = lasty3 then direction := 'v'
+ else direction := 'm';
+ lastx3 := x;
+ lasty3 := y;
+ lastwasline := true;
+end;
+
+procedure recall;
+{ taking values from the buffer. }
+const WORTH = 100;
+begin
+ if ((lastx3-prevtox3 < WORTH) or (lasty3-prevtoy3 < WORTH)) and
+ (prevtox3 <> -9999) and (prevtoy3 <> -9999) then
+ writeln(psfile, ' ', lastx3-prevtox3:3:0, ' ', lasty3-prevtoy3:3:0, ' l@')
+ else
+ writeln(psfile,' ', lastx3:3:0,' ',lasty3:3:0,' L@');
+ lastwasline := false;
+ prevtox3 := lastx3;
+ prevtoy3 := lasty3;
+end;
+
+
+function us(n: scaled;c:char): real;
+{ gets a number which every unit of it is 2 in the 16 power
+ and changes it to normal units.
+ in addition scales and transforms the number in order to
+ use it in PostScript dictionary.
+ it is also determining the bounding box. }
+const s = 2; { Scale & Translate before sending to PostScript file }
+ t = 180;
+var tmp : real;
+begin
+ tmp := trunc(n/65536)*s+t;
+ us := tmp;
+ if (c = 'x') and (tmp <> t) then
+ begin
+ if tmp>maxbox[x] then maxbox[x] := tmp
+ else if tmp<minbox[x] then minbox[x] := tmp;
+ if tmp>lmax_x then lmax_x := tmp
+ else if tmp<lmin_x then lmin_x := tmp;
+ end
+ else if tmp>maxbox[y] then maxbox[y] := tmp
+ else if tmp<minbox[y] then minbox[y] := tmp;
+end; { unscaled }
+
+
+procedure send_p_s;
+{ creates the PostScript file, by sending lines and curves,
+ using the optimization ability on lines. }
+const WORTH=100;
+
+var x0_,x1_,x2_,x3_,y0_,y1_,y2_,y3_:real;
+begin
+ x0_ := us(x0,'x');
+ x1_ := us(x1,'x');
+ x2_ := us(x2,'x');
+ x3_ := us(x3,'x');
+ y0_ := us(y0,'y');
+ y1_ := us(y1,'y');
+ y2_ := us(y2,'y');
+ y3_ := us(y3,'y');
+
+ if (x0_<>lastx0) or (y0_<>lasty0) then
+ begin
+ if new then
+ begin
+ writeln(psfile,' ', x0_:3:0,' ',y0_:3:0,' M@');
+ new := false;
+ lastwasline := false;
+ prevtox3 := x0_;
+ prevtoy3 := y0_;
+ lastx3 := x0_; lasty3 := y0_;
+ end
+ else begin
+ if (lastwasline) and (not ok(x0_,y0_)) then
+ begin
+ recall;
+ end;
+ restore(x0_,y0_);
+ end;
+ end;
+ if (x3=0) and (x2=0) and (y3=0) and (y2=0) then { line }
+ begin
+ if (x0_<>x1_) or (y0_<>y1_) then
+ begin
+ if (lastwasline) and (not ok(x1_,y1_)) then
+ begin
+ recall;
+ end;
+ restore(x1_,y1_);
+ end;
+ lastx0 := x1_; lasty0 := y1_;
+ end
+ else begin
+ if ((x0_=x1_) and (x1_=x2_) and (x2_=x3_)) or
+ ((y0_=y1_) and (y1_=y2_) and (y2_=y3_)) then
+ begin
+ if (x0_<>x3_) or (y0_<>y3_) then
+ begin
+ if (lastwasline) and (not ok(x3_,y3_)) then
+ begin
+ recall;
+ end;
+ restore(x3_,y3_);
+ end;
+ end
+ else begin
+ if lastwasline then recall;
+ if ((x1_-lastx3<WORTH) or (x2_-lastx3<WORTH) or (x3_-lastx3<WORTH) or (y1_-lasty3<WORTH) or (y2_-lasty3<WORTH) or (y3_-lasty3<WORTH)) and
+ (prevtox3 <> -9999) and (prevtoy3 <> -9999) then
+ writeln(psfile,' ', x1_-lastx3:3:0,' ',y1_-lasty3:3:0,' ',x2_-lastx3:3:0,' ',y2_-lasty3:3:0,' ',x3_-lastx3:3:0,' ',y3_-lasty3:3:0,' c@')
+ else
+ writeln(psfile,' ', x1_:3:0,' ',y1_:3:0,' ',x2_:3:0,' ',y2_:3:0,' ',x3_:3:0,' ',y3_:3:0,' C@');
+ prevtox3 := x3_;
+ prevtoy3 := y3_;
+ lastx3 := x3_; lasty3 := y3_;
+ end;
+ lastx0 := x3_; lasty0 := y3_;
+ end; { else curve }
+end; { send_p_s }
+
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps3.p b/fonts/utilities/mf2ps/mf2ps/mf2ps3.p
new file mode 100644
index 0000000000..f082b45f4f
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps3.p
@@ -0,0 +1,657 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+ procedure makemoves;
+ label
+ 22, 30, 10;
+ var
+ x1, x2, x3, m, r, y1, y2, y3, n, s, l: integer;
+ q, t, u, x2a, x3a, y2a, y3a: integer;
+ begin
+ {---------------------------------------------------------}
+ if (CurveSource=465) { from fillspec - no offset }
+ or (CurveSource=512) { from fillenvelope - with offset }
+ or (CurveSource=518) { -------- " -------- }
+ then
+ sendcurve(xx0,xx1,xx2,xx3,yy0,yy1,yy2,yy3,oc);
+ {---------------------------------------------------------}
+ if (xx3 < xx0) or (yy3 < yy0) then
+ confusion(109);
+ l := 16;
+ bisectptr := 0;
+ x1 := xx1 - xx0;
+ x2 := xx2 - xx1;
+ x3 := xx3 - xx2;
+ if xx0 >= xicorr then
+ r := (xx0 - xicorr) mod 65536
+ else
+ r := 65535 - ((((-xx0) + xicorr) - 1) mod 65536);
+ m := ((xx3 - xx0) + r) div 65536;
+ y1 := yy1 - yy0;
+ y2 := yy2 - yy1;
+ y3 := yy3 - yy2;
+ if yy0 >= etacorr then
+ s := (yy0 - etacorr) mod 65536
+ else
+ s := 65535 - ((((-yy0) + etacorr) - 1) mod 65536);
+ n := ((yy3 - yy0) + s) div 65536;
+ if ((xx3 - xx0) >= 268435456) or ((yy3 - yy0) >= 268435456) then begin {313:}
+ x1 := (x1 + xicorr) div 2;
+ x2 := (x2 + xicorr) div 2;
+ x3 := (x3 + xicorr) div 2;
+ r := (r + xicorr) div 2;
+ y1 := (y1 + etacorr) div 2;
+ y2 := (y2 + etacorr) div 2;
+ y3 := (y3 + etacorr) div 2;
+ s := (s + etacorr) div 2;
+ l := 15
+ end {:313};
+ while true do begin
+ 22: {314:}
+ if m = 0 then {315:}
+ while n > 0 do begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 1;
+ n := n - 1
+ end {:315}
+ else if n = 0 then {316:}
+ move[moveptr] := move[moveptr] + m {:316}
+ else if (m + n) = 2 then begin {317:}
+ r := twotothe[l] - r;
+ s := twotothe[l] - s;
+ while l < 30 do begin
+ x3a := x3;
+ x2a := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + x2a) + xicorr) div 2;
+ t := (x1 + x2) + x3;
+ r := (r + r) - xicorr;
+ y3a := y3;
+ y2a := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + y2a) + etacorr) div 2;
+ u := (y1 + y2) + y3;
+ s := (s + s) - etacorr;
+ if t < r then
+ if u < s then begin {318:}
+ x1 := x3;
+ x2 := x2a;
+ x3 := x3a;
+ r := r - t;
+ y1 := y3;
+ y2 := y2a;
+ y3 := y3a;
+ s := s - u
+ end else begin {:318} {320:}
+ begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ goto 30
+ end
+ else if u < s then begin {319:}
+ begin
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end {:319};
+ goto 30
+ end;
+ l := l + 1
+ end;
+ r := r - xicorr;
+ s := s - etacorr;
+ if (abvscd((x1 + x2) + x3, s, (y1 + y2) + y3, r) - xicorr) >= 0 then begin {319:}
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end else begin {:319} {320:}
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ 30: {:317}
+ null
+ end else begin
+ l := l + 1;
+ bisectstack[bisectptr + 10] := l;
+ bisectstack[bisectptr + 2] := x3;
+ bisectstack[bisectptr + 1] := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + bisectstack[bisectptr + 1]) + xicorr) div 2;
+ bisectstack[bisectptr] := x3;
+ r := (r + r) + xicorr;
+ t := ((x1 + x2) + x3) + r;
+ q := t div twotothe[l];
+ bisectstack[bisectptr + 3] := t mod twotothe[l];
+ bisectstack[bisectptr + 4] := m - q;
+ m := q;
+ bisectstack[bisectptr + 7] := y3;
+ bisectstack[bisectptr + 6] := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + bisectstack[bisectptr + 6]) + etacorr) div 2;
+ bisectstack[bisectptr + 5] := y3;
+ s := (s + s) + etacorr;
+ u := ((y1 + y2) + y3) + s;
+ q := u div twotothe[l];
+ bisectstack[bisectptr + 8] := u mod twotothe[l];
+ bisectstack[bisectptr + 9] := n - q;
+ n := q;
+ bisectptr := bisectptr + 11;
+ goto 22
+ end {:314};
+ if bisectptr = 0 then
+ goto 10; {312:}
+ bisectptr := bisectptr - 11;
+ x1 := bisectstack[bisectptr];
+ x2 := bisectstack[bisectptr + 1];
+ x3 := bisectstack[bisectptr + 2];
+ r := bisectstack[bisectptr + 3];
+ m := bisectstack[bisectptr + 4];
+ y1 := bisectstack[bisectptr + 5];
+ y2 := bisectstack[bisectptr + 6];
+ y3 := bisectstack[bisectptr + 7];
+ s := bisectstack[bisectptr + 8];
+ n := bisectstack[bisectptr + 9];
+ l := bisectstack[bisectptr + 10] {:312}
+ end;
+ 10:
+ null
+ end; {:311} {321:}
+
+
+ procedure dump(var f,g:text;ignore:boolean;addy:integer);
+ { dumps file named f to file named g. if ignore=true
+ then @ sign won't be copied to g.
+ addy=1, means this is "erase" path lower than 300
+ so 0.8 is subtracted from all y-s. if addy=2 it is
+ higher than 300, and 0.8 is added. }
+ var c : char;
+ even_n : boolean;
+ begin
+ reset(f);
+ while not eof(f) do
+ begin
+ even_n := true;
+ read(f,c);
+ case c of
+ ' ' : repeat
+ while c = ' ' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ even_n := not even_n;
+ while (c<>' ') and (c<>'@') do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ if even_n then
+ if addy = 2 then write(g,' 0.8 add')
+ else if addy = 1 then write(g,' 0.8 sub');
+ until c = '@';
+ otherwise while c<>'@' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ end; (* case *)
+ readln(f);
+ if ignore then writeln(g)
+ else writeln(g,'@');
+ end;
+ end;
+
+ function checkerase(var efile:text) : integer;
+ { this function checks files that contains "erase" paths.
+ if the path is higher than 300 its value is 2 else 1.
+ this value goes to 'dump' procedure, to determine if
+ 0.8 should be added or substracted. }
+ const limit = 300;
+ var no : real;
+ c : char;
+ begin
+ reset(efile);
+ checkerase := 1;
+ while not eof(efile) do
+ begin
+ read(efile,c);
+ case c of
+ ' ' : begin
+ read(efile,no);
+ read(efile,no);
+ if no > limit then checkerase := 2;
+ end;
+ otherwise ;
+ end;
+ readln(efile);
+ end;
+ end;
+
+
+ procedure doarrange(var f,g:text);
+ { gets file named f whose "fill" and "stroke" paths are mixed
+ together with "erase" paths, and gives back file named g
+ which has "erase" paths on top in order to determine the
+ clip path, and afterward the rest paths. }
+ var c : char;
+ tmp,fills : text;
+ erase_top : integer;
+
+ begin
+ if not erasein then begin
+ writeln(g,'newpath');
+ dump(f,g,true,0);
+ end
+ else begin
+ rewrite(fills);
+ writeln(g,'gsave');
+ writeln(g,'initclip');
+ writeln(g,'newpath');
+ writeln(g,'0 0 M');
+ writeln(g,'0 1000 L');
+ writeln(g,'1000 1000 L');
+ writeln(g,'1000 0 L');
+ writeln(g,'0 0 L');
+ rewrite(tmp);
+ reset(f);
+ while not eof(f) do
+ begin
+ read(f,c);
+ while (c<>'*') and (c<>'f') and (c<>'e') do
+ begin
+ while c<>'@' do
+ begin
+ write(tmp,c);
+ read(f,c);
+ end;
+ readln(f);
+ writeln(tmp,'@');
+ read(f,c);
+ end;
+ case c of
+ '*' : begin
+ erase_top := checkerase(tmp);
+ dump(tmp,g,true,erase_top);
+ writeln(g,'%erase');
+ end;
+ 'f' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'fill@');
+ end;
+ 'e' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'eofill@');
+ end;
+ end;
+ rewrite(tmp);
+ readln(f);
+ end;
+ writeln(g,'eoclip');
+ writeln(g,'newpath');
+ dump(fills,g,true,0);
+ writeln(g,'grestore');
+ end;
+ end;
+
+
+
+ procedure print_start;
+ { print_start is called when a new cyclic path is identified.
+ it checks if drawing status was kept, else it changes it
+ respectively. the values are changed when getting into
+ another drawing macro.
+ it is also resets values of lastx0 lasty0 for not being
+ horizonable, because we need a 'moveto' move in the
+ PostScript file in the beginning of the new path. }
+ begin
+ if (internal[14]<>lastyearval) or
+ (internal[15]<>lastmonthval) then
+ begin
+ if lastyearval<>internal[14] then
+ begin
+ if internal[14] = -65536 then
+ begin
+ writeln(f,'eofill@');
+ lastfill := 's';
+ end
+ else begin
+ writeln(f,'*erase@');
+ lastfill := 'e';
+ erasein := true;
+ end;
+ internal[14] := lastyearval ;
+ end
+ else begin
+ internal[15] := lastmonthval ;
+ if lastfill <> 'i' then writeln(f,'fill@');
+ lastfill := 'f';
+ end;
+ end;
+
+ writeln(f,'%new path@');
+ new := true;
+ lastx0 := -99999999; lasty0 := -99999999; { unhorizonable values }
+ end;
+
+ procedure print_end;
+ { print_end is called when end of cyclic path is identified.
+ it takes out the buffer values which were kept there for
+ optimization purposes.
+ In addition it writes 'closepath' in order to close
+ the current cyclic path. }
+ begin
+ if lastwasline then
+ writeln(f,lastx3-prevtox3:3:0,' ',lasty3-prevtoy3:3:0,' l@');
+ if not new then
+ writeln(f,'closepath@');
+ writeln(f,'%end path@');
+ end;
+
+ procedure init_ps;
+ { this procedure is called, right after entering the main loop
+ in METAFONT, and this is the place to give initial values
+ to variables, to open new files and ... to ask questions }
+ var i:integer;
+ begin
+ rewrite(f);
+ no_of_letter := 0;
+ ascii_on := false;
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ foundnew := false; { for new letter defs }
+ minbox[x] := 9999; { initial min. value of x }
+ minbox[y] := 9999; { -----"------- y }
+ maxbox[x] := -9999; { initial max. value of x }
+ maxbox[y] := -9999; { -----"------- y }
+ prevtox3 := -9999;
+ prevtoy3 := -9999;
+
+ write('Enter name of OUTPUT file: ');
+ i := 1;
+ while not eoln do
+ begin
+ read(fout[i]);
+ i := i+1;
+ end;
+ readln;
+ writeln;
+ write('Are you creating the whole dictionary (y/n) ?');
+ readln(ans);
+ if (ans='y') or (ans='Y') then dict := 1 else dict := 0;
+ writeln;
+ rewrite(g,fout);
+ if dict = 1 then
+ begin
+ writeln(g,'%! Simon font');
+ writeln(g,'%0 serverdict begin exitserver');
+ writeln(g,'/TBuildCharDict 10 dict def');
+ writeln(g,'/SimonFont 10 dict def');
+ writeln(g,'/fudge 110 def');
+ writeln(g,'SimonFont begin');
+ writeln(g,'%%');
+ writeln(g,' /FontType 3 def');
+ writeln(g,' /FontMatrix [0.001 0 0 0.001 0 0] def');
+ writeln(g,' /Encoding 256 array def');
+ writeln(g);
+ writeln(g,' 0 1 255 {Encoding exch /.notdef put} for');
+ writeln(g);
+ writeln(g,'% Character definitions');
+ writeln(g);
+ writeln(g,'/Metrics 130 dict def');
+ writeln(g);
+ writeln(g,'/CharDefs 130 dict def');
+ writeln(g,' ');
+ writeln(g,'CharDefs begin');
+ writeln(g);
+ writeln(g,'/.notdef');
+ writeln(g,' () def');
+ writeln(g);
+ end;
+ end;
+
+
+ procedure makenewdef;
+ { in case of several letters proccessing, while start
+ working on a new letter a few initials should be done }
+ var i : integer;
+ begin
+ rewrite(psfile);
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ if dict = 1 then
+ begin
+ lmin_x := 9999;
+ lmax_x := -9999;
+ writeln(g);
+ write(g,'/');
+ for i := 1 to ord(curletter[0]) do
+ if curletter[i]<>' ' then write(g,curletter[i])
+ else write(g,'_');
+ writeln(g);
+ writeln(g,'(');
+ end;
+ end;
+
+
+ procedure closeolddef(sub_n:integer);
+ { after one letter proccessing is finished, it gives the
+ last path the right kind of filling, and then call to
+ doarrange in order to make some order! }
+ begin
+ if internal[15] <> lastmonthval then
+ begin
+ writeln(psfile,'fill@');
+ internal[15] := lastmonthval;
+ end
+ else if internal[14] <> lastyearval then
+ begin
+ if internal[14] = -65536 then writeln(psfile,'eofill@')
+ else begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ internal[14] := lastyearval
+ end
+ else case lastfill of
+ 'e' : begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ 's' : writeln(psfile,'eofill@');
+ 'f','i' : writeln(psfile,'fill@');
+ end;
+ doarrange(psfile,g);
+ if dict = 1 then
+ begin
+ writeln(g,') def');
+ all_metrics[no_of_letter-sub_n] := trunc(lmax_x) + 1;
+ end;
+ end;
+
+
+ procedure tini_ps;
+ { prepares to leave... closing the last path, and in case
+ of creating a dictionary, entering all the necessary
+ information needed by the Postscript program }
+ const lowlimit = 50; { if need transform do it to }
+ highlimit = 900; { the box [50,50,900,900] }
+ fix2one = 1.3; { correction to one point size }
+ var j,jj : integer;
+ c_l : currentletter;
+ begin
+ closeolddef(0);
+ if dict = 1 then
+ begin
+ if (minbox[x] < 0) or (minbox[y] < 0) or
+ (maxbox[x] > 1000) or (maxbox[y] > 1000)
+ then begin
+ needtransform := true;
+ doscale[x] := ((highlimit-lowlimit)/(maxbox[x]-minbox[x]))/fix2one;
+ dotranslate[x] := lowlimit - minbox[x]*doscale[x];
+ doscale[y] := ((highlimit-lowlimit)/(maxbox[y]-minbox[y]))/fix2one;
+ dotranslate[y] := lowlimit - minbox[y]*doscale[y];
+ end
+ else needtransform := false;
+ writeln(f);
+ writeln(f,'end % of CharDefs dictionary');
+ writeln(f);
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'Encoding ',all_ascii[j],' /');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ writeln(f,' put');
+ end;
+ writeln(f);
+ writeln(f,'Metrics');
+ writeln(f,' begin');
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'/');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ if needtransform then writeln(f,' 1000 def')
+ else writeln(f,' ',all_metrics[j]-minbox[x]:3:0,' fudge add def');
+ end;
+ writeln(f,'/.notdef 0 def');
+ writeln(f,' end');
+ writeln(f);
+ writeln(f,' /BuildChar');
+ writeln(f,' { TBuildCharDict begin');
+ writeln(f,' %%');
+ writeln(f,' /char exch def');
+ writeln(f,' /fontdict exch def');
+ writeln(f);
+ writeln(f, ' /M {moveto} def');
+ writeln(f, ' /L {lineto} def');
+ writeln(f, ' /l {rlineto} def');
+ writeln(f, ' /C {curveto} def');
+ writeln(f, ' /c {rcurveto} def');
+ writeln(f);
+ writeln(f,' /charname fontdict /Encoding get');
+ writeln(f,' char get def');
+ writeln(f,' %%');
+ writeln(f,' /charproc fontdict /CharDefs get');
+ writeln(f,' charname get def');
+ writeln(f,' ');
+ writeln(f,' /charwdth fontdict /Metrics get charname get def');
+ writeln(f,' %%');
+ writeln(f,' gsave');
+ writeln(f,' ',fix2one:3:1,fix2one:10:1,' scale');
+ writeln(f,' 0.2 setflat');
+ writeln(f,' 0.2 setlinewidth');
+ writeln(f,' charwdth 0');
+ writeln(f,' 0 -180');
+ writeln(f,' charwdth 1000');
+ writeln(f,' setcachedevice');
+ if needtransform then
+ begin
+ writeln(f,' ',doscale[x]:7:3,doscale[y]:11:3,' scale');
+ writeln(f,' ',dotranslate[x]:7:3,dotranslate[y]:11:3,' translate');
+ end
+ else writeln(f,' -',minbox[x]:3:0,' fudge add 0 translate');
+ writeln(f,' charproc cvx exec');
+ writeln(f,' grestore');
+ writeln(f,' end');
+ writeln(f,' } def');
+ if needtransform then writeln(f,' /FontBBox [0 0 1000 1000] def')
+ else writeln(f,' /FontBBox [',minbox[x]:3:0,' fudge sub ',minbox[y]:3:0,' ',maxbox[x]:3:0,' ',maxbox[y]:3:0,'] def');
+ writeln(f);
+ writeln(f,' end ');
+ writeln(f);
+ writeln(f,' /Simon SimonFont definefont pop');
+ writeln(f);
+ writeln(f,' /Simon findfont 10 scalefont setfont');
+ writeln(f,' 100 210 moveto () show');
+ writeln(f,' showpage');
+ end;
+ end;
+
+
+
+ procedure auxprintchar(s: ASCIIcode);
+ { puts in string a character whose ascii is s }
+ begin
+ curletter[name_length] := xchr[s];
+ end;
+
+
+ procedure auxprint(s: integer);
+ { equivalent to METAFONT's print, accept changing global
+ variables, and writing is done into a local string.
+ it is also counts the string's length }
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ name_length := name_length + 1;
+ auxprintchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+
+ procedure auxslowprint;
+ { equivalent to METAFONT's slowprint, accept changing
+ global variables. }
+ var
+ j: poolpointer;
+ begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ auxprint(strpool[j]);
+ j := j + 1
+ end;
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+ end; {:60}
+{62:}
+
+
+procedure auxprintnl;
+begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ auxprint(s);
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+end; {:62} {63:}
+
+
+procedure sendascii;
+{ puts in array of ascii values the ascii of letter whose
+ number is no_of_letter. }
+begin
+ all_ascii[no_of_letter] := asc;
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2psv.p b/fonts/utilities/mf2ps/mf2ps/mf2psv.p
new file mode 100644
index 0000000000..14af0943a1
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2psv.p
@@ -0,0 +1,19049 @@
+{4:}
+{9:}
+(*$C-*)
+{(*$C+*)}
+{:9}
+
+program MF(input, output); {6:}
+
+{------------------------------}
+{ declarations are in mf2ps1.h }
+{------------------------------}
+#include "mf2ps1.h"
+{------------------------------}
+#include "mf_ext.h"
+#include "mf_window.h"
+
+ procedure initialize; {19:}
+ var
+ i: 0..127; {:19} {130:}
+ k: integer; {:130} {21:}
+ begin
+ xchr[32] := ' ';
+ xchr[33] := '!';
+ xchr[34] := '"';
+ xchr[35] := '#';
+ xchr[36] := '$';
+ xchr[37] := '%';
+ xchr[38] := '&';
+ xchr[39] := '''';
+ xchr[40] := '(';
+ xchr[41] := ')';
+ xchr[42] := '*';
+ xchr[43] := '+';
+ xchr[44] := ',';
+ xchr[45] := '-';
+ xchr[46] := '.';
+ xchr[47] := '/';
+ xchr[48] := '0';
+ xchr[49] := '1';
+ xchr[50] := '2';
+ xchr[51] := '3';
+ xchr[52] := '4';
+ xchr[53] := '5';
+ xchr[54] := '6';
+ xchr[55] := '7';
+ xchr[56] := '8';
+ xchr[57] := '9';
+ xchr[58] := ':';
+ xchr[59] := ';';
+ xchr[60] := '<';
+ xchr[61] := '=';
+ xchr[62] := '>';
+ xchr[63] := '?';
+ xchr[64] := '@';
+ xchr[65] := 'A';
+ xchr[66] := 'B';
+ xchr[67] := 'C';
+ xchr[68] := 'D';
+ xchr[69] := 'E';
+ xchr[70] := 'F';
+ xchr[71] := 'G';
+ xchr[72] := 'H';
+ xchr[73] := 'I';
+ xchr[74] := 'J';
+ xchr[75] := 'K';
+ xchr[76] := 'L';
+ xchr[77] := 'M';
+ xchr[78] := 'N';
+ xchr[79] := 'O';
+ xchr[80] := 'P';
+ xchr[81] := 'Q';
+ xchr[82] := 'R';
+ xchr[83] := 'S';
+ xchr[84] := 'T';
+ xchr[85] := 'U';
+ xchr[86] := 'V';
+ xchr[87] := 'W';
+ xchr[88] := 'X';
+ xchr[89] := 'Y';
+ xchr[90] := 'Z';
+ xchr[91] := '[';
+ xchr[92] := '\';
+ xchr[93] := ']';
+ xchr[94] := '^';
+ xchr[95] := '_';
+ xchr[96] := '`';
+ xchr[97] := 'a';
+ xchr[98] := 'b';
+ xchr[99] := 'c';
+ xchr[100] := 'd';
+ xchr[101] := 'e';
+ xchr[102] := 'f';
+ xchr[103] := 'g';
+ xchr[104] := 'h';
+ xchr[105] := 'i';
+ xchr[106] := 'j';
+ xchr[107] := 'k';
+ xchr[108] := 'l';
+ xchr[109] := 'm';
+ xchr[110] := 'n';
+ xchr[111] := 'o';
+ xchr[112] := 'p';
+ xchr[113] := 'q';
+ xchr[114] := 'r';
+ xchr[115] := 's';
+ xchr[116] := 't';
+ xchr[117] := 'u';
+ xchr[118] := 'v';
+ xchr[119] := 'w';
+ xchr[120] := 'x';
+ xchr[121] := 'y';
+ xchr[122] := 'z';
+ xchr[123] := '{';
+ xchr[124] := '|';
+ xchr[125] := '}';
+ xchr[126] := '~';
+ xchr[0] := ' ';
+ xchr[127] := ' '; {:21} {22:}
+ for i := 1 to 31 do
+ xchr[i] := ' ';
+ xchr[9] := chr(9);
+ xchr[12] := chr(12); {:22}
+{23:}
+ for i := 0 to 127 do
+ xord[chr(i)] := 127;
+ for i := 1 to 126 do
+ xord[xchr[i]] := i; {:23} {69:}
+ interaction := 3; {:69} {72:}
+ deletionsallowed := true;
+ errorcount := 0; {:72} {75:}
+ helpptr := 0;
+ useerrhelp := false;
+ errhelp := 0; {:75} {92:}
+ interrupt := 0;
+ OKtointerrupt := true;
+{:92}
+ {98:}
+ aritherror := false; {:98} {131:}
+ twotothe[0] := 1;
+ for k := 1 to 30 do
+ twotothe[k] := 2 * twotothe[k - 1];
+ speclog[1] := 93032640;
+ speclog[2] := 38612034;
+ speclog[3] := 17922280;
+ speclog[4] := 8662214;
+ speclog[5] := 4261238;
+ speclog[6] := 2113709;
+ speclog[7] := 1052693;
+ speclog[8] := 525315;
+ speclog[9] := 262400;
+ speclog[10] := 131136;
+ speclog[11] := 65552;
+ speclog[12] := 32772;
+ speclog[13] := 16385;
+ for k := 14 to 27 do
+ speclog[k] := twotothe[27 - k];
+ speclog[28] := 1; {:131}
+{138:}
+ specatan[1] := 27855475;
+ specatan[2] := 14718068;
+ specatan[3] := 7471121;
+ specatan[4] := 3750058;
+ specatan[5] := 1876857;
+ specatan[6] := 938658;
+ specatan[7] := 469357;
+ specatan[8] := 234682;
+ specatan[9] := 117342;
+ specatan[10] := 58671;
+ specatan[11] := 29335;
+ specatan[12] := 14668;
+ specatan[13] := 7334;
+ specatan[14] := 3667;
+ specatan[15] := 1833;
+ specatan[16] := 917;
+ specatan[17] := 458;
+ specatan[18] := 229;
+ specatan[19] := 115;
+ specatan[20] := 57;
+ specatan[21] := 29;
+ specatan[22] := 14;
+ specatan[23] := 7;
+ specatan[24] := 4;
+ specatan[25] := 2;
+ specatan[26] := 1; {:138} {179:}
+{wasmemend:=-30000;waslomax:=-30000;washimin:=memmax;panicking:=false;}
+{:179}
+ {191:}
+ for k := 1 to 40 do
+ internal[k] := 0;
+ intptr := 40; {:191} {199:}
+ for k := 48 to 57 do
+ charclass[k] := 0;
+ charclass[46] := 1;
+ charclass[32] := 2;
+ charclass[37] := 3;
+ charclass[34] := 4;
+ charclass[44] := 5;
+ charclass[59] := 6;
+ charclass[40] := 7;
+ charclass[41] := 8;
+ for k := 65 to 90 do
+ charclass[k] := 9;
+ for k := 97 to 122 do
+ charclass[k] := 9;
+ charclass[95] := 9;
+ charclass[60] := 10;
+ charclass[61] := 10;
+ charclass[62] := 10;
+ charclass[58] := 10;
+ charclass[124] := 10;
+ charclass[96] := 11;
+ charclass[39] := 11;
+ charclass[43] := 12;
+ charclass[45] := 12;
+ charclass[47] := 13;
+ charclass[42] := 13;
+ charclass[92] := 13;
+ charclass[33] := 14;
+ charclass[63] := 14;
+ charclass[35] := 15;
+ charclass[38] := 15;
+ charclass[64] := 15;
+ charclass[36] := 15;
+ charclass[94] := 16;
+ charclass[126] := 16;
+ charclass[91] := 17;
+ charclass[93] := 18;
+ charclass[123] := 19;
+ charclass[125] := 19;
+ for k := 0 to 31 do
+ charclass[k] := 20;
+ charclass[127] := 20;
+ charclass[9] := 2;
+ charclass[12] := 2; {:199} {202:}
+ hash[1].lh := 0;
+ hash[1].rh := 0;
+ eqtb[1].lh := 41;
+ eqtb[1].rh := -30000;
+ for k := 2 to 2241 do begin
+ hash[k] := hash[1];
+ eqtb[k] := eqtb[1]
+ end; {:202} {231:}
+ bignodesize[13] := 12;
+ bignodesize[14] := 4;
+{:231}
+ {251:}
+ saveptr := -30000; {:251} {396:}
+ octantdir[1] := 415;
+ octantdir[5] := 416;
+ octantdir[6] := 417;
+ octantdir[2] := 418;
+ octantdir[4] := 419;
+ octantdir[8] := 420;
+ octantdir[7] := 421;
+ octantdir[3] := 422; {:396} {428:}
+ maxroundingptr := 0; {:428} {449:}
+ octantcode[1] := 1;
+ octantcode[2] := 5;
+ octantcode[3] := 6;
+ octantcode[4] := 2;
+ octantcode[5] := 4;
+ octantcode[6] := 8;
+ octantcode[7] := 7;
+ octantcode[8] := 3;
+ for k := 1 to 8 do
+ octantnumber[octantcode[k]] := k; {:449} {456:}
+ revturns := false; {:456} {462:}
+ xcorr[1] := 0;
+ ycorr[1] := 0;
+ xycorr[1] := 0;
+ xcorr[5] := 0;
+ ycorr[5] := 0;
+ xycorr[5] := 1;
+ xcorr[6] := -1;
+ ycorr[6] := 1;
+ xycorr[6] := 0;
+ xcorr[2] := 1;
+ ycorr[2] := 0;
+ xycorr[2] := 1;
+ xcorr[4] := 0;
+ ycorr[4] := 1;
+ xycorr[4] := 1;
+ xcorr[8] := 0;
+ ycorr[8] := 1;
+ xycorr[8] := 0;
+ xcorr[7] := 1;
+ ycorr[7] := 0;
+ xycorr[7] := 1;
+ xcorr[3] := -1;
+ ycorr[3] := 1;
+ xycorr[3] := 0;
+ for k := 1 to 8 do
+ zcorr[k] := xycorr[k] - xcorr[k]; {:462} {570:}
+ screenstarted := false;
+ screenOK := false; {:570} {573:}
+ for k := 0 to 15 do begin
+ windowopen[k] := false;
+ windowtime[k] := 0
+ end; {:573}
+{593:}
+ fixneeded := false;
+ watchcoefs := true; {:593} {739:}
+ condptr := -30000;
+ iflimit := 0;
+ curif := 0;
+ ifline := 0; {:739} {753:}
+ loopptr := -30000; {:753} {776:}
+ MFbasedefault := 'plain.base'; {:776} {797:}
+ curexp := 0; {:797} {822:}
+ varflag := 0; {:822} {1078:}
+ startsym := 0; {:1078} {1085:}
+ longhelpseen := false;
+{:1085}
+ {1097:}
+ for k := 0 to 255 do begin
+ tfmwidth[k] := 0;
+ tfmheight[k] := 0;
+ tfmdepth[k] := 0;
+ tfmitalcorr[k] := 0;
+ charexists[k] := false;
+ chartag[k] := 0;
+ charremainder[k] := 0
+ end;
+ for k := 1 to headersize do
+ headerbyte[k] := -1;
+ bc := 255;
+ ec := 0;
+ nl := 0;
+ nk := 0;
+ ne := 0;
+ np := 0; {:1097} {1150:}
+ gfprevptr := 0;
+ totalchars := 0; {:1150} {1153:}
+ halfbuf := gfbufsize div 2;
+ gflimit := gfbufsize;
+ gfptr := 0;
+ gfoffset := 0; {:1153} {1184:}
+ baseident := 0; {:1184} {1215:}
+ editnamestart := 0
+ end; {:1215} {57:}
+
+ procedure println;
+ begin
+ case selector of
+ 3:
+ begin
+ writeln(output);
+ writeln(logfile);
+ termoffset := 0;
+ fileoffset := 0
+ end;
+ 2:
+ begin
+ writeln(logfile);
+ fileoffset := 0
+ end;
+ 1:
+ begin
+ writeln(output);
+ termoffset := 0
+ end;
+ 0, 4, 5:
+ null
+ end
+ end; {:57} {58:}
+
+ procedure printchar(s: ASCIIcode);
+ var tmp : integer;
+ begin
+ case selector of
+ 3:
+ begin
+ {----------------------------------}
+ if xchr[s] = '[' then
+ begin
+ ascii_on := true;
+ ascval := 0;
+ end
+ else if xchr[s] = ']' then
+ begin
+ ascii_on := false;
+ sendascii(ascval);
+ end
+ else if ascii_on then
+ begin
+ tmp := s - ord('0');
+ ascval := ascval*10+tmp;
+ end;
+ {-------------------------------------}
+ write(output, xchr[s]);
+ write(logfile, xchr[s]);
+ termoffset := termoffset + 1;
+ fileoffset := fileoffset + 1;
+ if termoffset = maxprintline then begin
+ writeln(output);
+ termoffset := 0
+ end;
+ if fileoffset = maxprintline then begin
+ writeln(logfile);
+ fileoffset := 0
+ end
+ end;
+ 2:
+ begin
+ write(logfile, xchr[s]);
+ fileoffset := fileoffset + 1;
+ if fileoffset = maxprintline then
+ println
+ end;
+ 1:
+ begin
+ write(output, xchr[s]);
+ termoffset := termoffset + 1;
+ if termoffset = maxprintline then
+ println
+ end;
+ 0:
+ null;
+ 4:
+ if tally < trickcount then
+ trickbuf[tally mod errorline] := s;
+ 5:
+ begin
+ if poolptr < poolsize then begin
+ strpool[poolptr] := s;
+ poolptr := poolptr + 1
+ end
+ end
+ end;
+ tally := tally + 1
+ end; {:58} {59:}
+
+ procedure print(s: integer);
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ printchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+ procedure slowprint(s: integer);
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ print(strpool[j]);
+ j := j + 1
+ end
+ end; {:60}
+{62:}
+
+ procedure printnl(s: strnumber);
+ begin
+ if ((termoffset > 0) and odd(selector)) or ((fileoffset > 0) and (selector >= 2)) then
+ println;
+ print(s)
+ end; {:62} {63:}
+
+ procedure printthedigs(k: eightbits);
+ begin
+ while k > 0 do begin
+ k := k - 1;
+ printchar(48 + dig[k])
+ end
+ end; {:63} {64:}
+
+ procedure printint(n: integer);
+ var
+ k: 0..23;
+ m: integer;
+ begin
+ k := 0;
+ if n < 0 then begin
+ printchar(45);
+ if n > (-100000000) then
+ n := -n
+ else begin
+ m := (-1) - n;
+ n := m div 10;
+ m := (m mod 10) + 1;
+ k := 1;
+ if m < 10 then
+ dig[0] := m
+ else begin
+ dig[0] := 0;
+ n := n + 1
+ end
+ end
+ end;
+ repeat
+ dig[k] := n mod 10;
+ n := n div 10;
+ k := k + 1
+ until n = 0;
+ printthedigs(k)
+ end; {:64} {103:}
+
+ procedure printscaled(s: scaled);
+ var
+ delta: scaled;
+ begin
+ if s < 0 then begin
+ printchar(45);
+ s := -s
+ end;
+ printint(s div 65536);
+ s := (10 * (s mod 65536)) + 5;
+ if s <> 5 then begin
+ delta := 10;
+ printchar(46);
+ repeat
+ if delta > 65536 then
+ s := (s + 32768) - (delta div 2);
+ printchar(48 + (s div 65536));
+ s := 10 * (s mod 65536);
+ delta := delta * 10
+ until s <= delta
+ end
+ end; {:103} {104:}
+
+ procedure printtwo(x, y: scaled);
+ begin
+ printchar(40);
+ printscaled(x);
+ printchar(44);
+ printscaled(y);
+ printchar(41)
+ end; {:104} {187:}
+
+ procedure printtype(t: smallnumber);
+ begin
+ if t in
+ [1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 16, 17,
+ 18, 15, 19, 20, 21, 22, 23] then
+ case t of
+ 1:
+ print(194);
+ 2:
+ print(195);
+ 3:
+ print(196);
+ 4:
+ print(197);
+ 5:
+ print(198);
+ 6:
+ print(199);
+ 7:
+ print(200);
+ 8:
+ print(201);
+ 9:
+ print(202);
+ 10:
+ print(203);
+ 11:
+ print(204);
+ 12:
+ print(205);
+ 13:
+ print(206);
+ 14:
+ print(207);
+ 16:
+ print(208);
+ 17:
+ print(209);
+ 18:
+ print(210);
+ 15:
+ print(211);
+ 19:
+ print(212);
+ 20:
+ print(213);
+ 21:
+ print(214);
+ 22:
+ print(215);
+ 23:
+ print(216)
+ end
+ else
+ print(217)
+ end; {:187} {195:}
+
+ procedure begindiagnostic;
+ begin
+ oldsetting := selector;
+ if (internal[13] <= 0) and (selector = 3) then begin
+ selector := selector - 1;
+ if history = 0 then
+ history := 1
+ end
+ end; { begindiagnostic }
+
+ procedure enddiagnostic(blankline: boolean);
+ begin
+ printnl(155);
+ if blankline then
+ println;
+ selector := oldsetting
+ end; {:195} {197:}
+
+ procedure printdiagnostic(s, t: strnumber; nuline: boolean);
+ begin
+ begindiagnostic;
+ if nuline then
+ printnl(s)
+ else
+ print(s);
+ print(320);
+ printint(line);
+ print(t);
+ printchar(58)
+ end; {:197} {773:}
+
+ procedure printfilename(n, a, e: integer);
+ begin
+ print(a);
+ print(n);
+ print(e)
+ end; {:773} {73:}
+
+ procedure normalizeselector;
+ forward;
+
+ procedure getnext;
+ forward;
+
+ procedure terminput;
+ forward;
+
+ procedure showcontext;
+ forward;
+
+ procedure beginfilereading;
+ forward;
+
+ procedure openlogfile;
+ forward;
+
+ procedure closefilesandtermina;
+ forward;
+
+ procedure clearforerrorprompt;
+ forward; {procedure debughelp;forward;} {43:}
+
+ procedure flushstring(s: strnumber);
+ begin
+ if s < (strptr - 1) then
+ strref[s] := 0
+ else
+ repeat
+ strptr := strptr - 1
+ until strref[strptr - 1] <> 0;
+ poolptr := strstart[strptr]
+ end; {:43} {:73} {76:}
+
+ procedure jumpout;
+ begin
+ goto 9998
+ end; {:76} {77:}
+
+ procedure error;
+ label
+ 22, 10;
+ var
+ c: ASCIIcode;
+ s1, s2, s3: integer;
+ j: poolpointer;
+ begin
+ if history < 2 then
+ history := 2;
+ printchar(46);
+ showcontext;
+ if interaction = 3 then {78:}
+ while true do begin
+ 22:
+ clearforerrorprompt;
+ begin
+ print(135);
+ terminput
+ end;
+ if last = first then
+ goto 10;
+ c := buffer[first];
+ if c >= 97 then
+ c := c - 32; {79:}
+ if c in
+ [48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 69, 72, 73, 81, 82, 83,
+ 88] then
+ case c of
+ 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57:
+ if deletionsallowed then begin {83:}
+ s1 := curcmd;
+ s2 := curmod;
+ s3 := cursym;
+ OKtointerrupt := false;
+ if ((last > (first + 1)) and (buffer[first + 1] >= 48)) and (buffer[first + 1] <= 57) then
+ c := ((c * 10) + buffer[first + 1]) - (48 * 11)
+ else
+ c := c - 48;
+ while c > 0 do begin
+ getnext;
+{743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743};
+ c := c - 1
+ end;
+ curcmd := s1;
+ curmod := s2;
+ cursym := s3;
+ OKtointerrupt := true;
+ begin
+ helpptr := 2;
+ helpline[1] := 148;
+ helpline[0] := 149
+ end;
+ showcontext;
+ goto 22
+ end {:83}; {68:begin debughelp;goto 22;end;}
+ 69:
+ if fileptr > 0 then begin
+ editnamestart := strstart[inputstack[fileptr].namefield];
+ editnamelength := strstart[inputstack[fileptr].namefield + 1] - strstart[inputstack[fileptr].namefield];
+ editline := line;
+ jumpout
+ end;
+ 72:
+ begin {84:}
+ if useerrhelp then begin {85:}
+ j := strstart[errhelp];
+ while j < strstart[errhelp + 1] do begin
+ if strpool[j] <> 37 then
+ print(strpool[j])
+ else if (j + 1) = strstart[errhelp + 1] then
+ println
+ else if strpool[j + 1] <> 37 then
+ println
+ else begin
+ j := j + 1;
+ printchar(37)
+ end;
+ j := j + 1
+ end {:85};
+ useerrhelp := false
+ end else begin
+ if helpptr = 0 then begin
+ helpptr := 2;
+ helpline[1] := 150;
+ helpline[0] := 151
+ end;
+ repeat
+ helpptr := helpptr - 1;
+ print(helpline[helpptr]);
+ println
+ until helpptr = 0
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 152;
+ helpline[2] := 151;
+ helpline[1] := 153;
+ helpline[0] := 154
+ end;
+ goto 22
+ end; {:84}
+ 73:
+ begin {82:}
+ beginfilereading;
+ if last > (first + 1) then begin
+ curinput.locfield := first + 1;
+ buffer[first] := 32
+ end else begin
+ begin
+ print(147);
+ terminput
+ end;
+ curinput.locfield := first
+ end;
+ first := last + 1;
+ curinput.limitfield := last;
+ goto 10
+ end; {:82}
+ 81, 82, 83:
+ begin {81:}
+ errorcount := 0;
+ interaction := (0 + c) - 81;
+ print(142);
+ case c of
+ 81:
+ begin
+ print(143);
+ selector := selector - 1
+ end;
+ 82:
+ print(144);
+ 83:
+ print(145)
+ end;
+ print(146);
+ println;
+ flush(output);
+ goto 10
+ end; {:81}
+ 88:
+ begin
+ interaction := 2;
+ jumpout
+ end
+ end
+ else
+ null; {80:}
+ begin
+ print(136);
+ printnl(137);
+ printnl(138);
+ if fileptr > 0 then
+ print(139);
+ if deletionsallowed then
+ printnl(140);
+ printnl(141)
+ end {:80} {:79}
+ end {:78};
+ errorcount := errorcount + 1;
+ if errorcount = 100 then begin
+ printnl(134);
+ history := 3;
+ jumpout
+ end; {86:}
+ if interaction > 0 then
+ selector := selector - 1;
+ if useerrhelp then begin
+ printnl(155); {85:}
+ j := strstart[errhelp];
+ while j < strstart[errhelp + 1] do begin
+ if strpool[j] <> 37 then
+ print(strpool[j])
+ else if (j + 1) = strstart[errhelp + 1] then
+ println
+ else if strpool[j + 1] <> 37 then
+ println
+ else begin
+ j := j + 1;
+ printchar(37)
+ end;
+ j := j + 1
+ end {:85}
+ end else
+ while helpptr > 0 do begin
+ helpptr := helpptr - 1;
+ printnl(helpline[helpptr])
+ end;
+ println;
+ if interaction > 0 then
+ selector := selector + 1; {:86}
+ println;
+ 10:
+ null
+ end; {:77}
+{88:}
+
+ procedure fatalerror(s: strnumber);
+ begin
+ normalizeselector;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(156)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := s
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:88} {89:}
+
+ procedure overflow(s: strnumber; n: integer);
+ begin
+ normalizeselector;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(157)
+ end;
+ print(s);
+ printchar(61);
+ printint(n);
+ printchar(93);
+ begin
+ helpptr := 2;
+ helpline[1] := 158;
+ helpline[0] := 159
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:89} {90:}
+
+ procedure confusion;
+ begin
+ normalizeselector;
+ if history < 2 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(160)
+ end;
+ print(s);
+ printchar(41);
+ begin
+ helpptr := 1;
+ helpline[0] := 161
+ end
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(162)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 163;
+ helpline[0] := 164
+ end
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:90} {:4}
+
+
+{26:}
+
+ function aopenin(var f: alphafile; pathspecifier: integer): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 4, pathspecifier) then begin
+ reset(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ aopenin := ok
+ end; { aopenin }
+
+ function aopenout(var f: alphafile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 2, 0) then begin
+ rewrite(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ aopenout := ok
+ end; { aopenout }
+
+ function wopenin(var f: wordfile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 4, 7) then begin
+ reset(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ wopenin := ok
+ end; { wopenin }
+
+ function wopenout(var f: wordfile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 2, 0) then begin
+ rewrite(f, nameoffile);
+ ok := true
+ end else
+ ok := false;
+ wopenout := ok
+ end; {:26} {27:}
+
+ procedure aclose(var f: alphafile);
+ begin
+ closea(f)
+ end; { aclose }
+
+ procedure wclose(var f: wordfile);
+ begin
+ closew(f)
+ end; {:27} {30:}
+
+ function inputln(var f: alphafile; bypasseoln: boolean): boolean;
+ var
+ lastnonblank: 0..bufsize;
+ begin
+ if bypasseoln then
+ if not eof(f) then
+ if eoln(f) then
+ get(f);
+ last := first;
+ if eof(f) then
+ inputln := false
+ else begin
+ lastnonblank := first;
+ while not eoln(f) do begin
+ if last >= maxbufstack then begin
+ maxbufstack := last + 1;
+ if maxbufstack = bufsize then
+ overflow(128, bufsize)
+ end;
+ buffer[last] := xord[f^];
+ get(f);
+ last := last + 1;
+ if buffer[last - 1] <> 32 then
+ lastnonblank := last
+ end;
+ last := lastnonblank;
+ inputln := true
+ end
+ end; {:30} {36:}
+
+ function initterminal: boolean;
+ label
+ 10;
+ var
+ dummy, i, j, k: integer;
+ arg: packed array [1..100] of char;
+ begin
+ if argc > 1 then begin
+ last := first;
+ for i := 1 to argc - 1 do begin
+ argv(i, arg);
+ j := 1;
+ k := 100;
+ while (k > 1) and (arg[k] = ' ') do
+ k := k - 1;
+ while j <= k do begin
+ buffer[last] := xord[arg[j]];
+ j := j + 1;
+ last := last + 1
+ end;
+ if k > 1 then begin
+ buffer[last] := xord[' '];
+ last := last + 1
+ end
+ end;
+ if last > first then begin
+ curinput.locfield := first;
+ initterminal := true;
+ goto 10
+ end
+ end;
+ while true do begin
+ write(output, '**');
+ flush(output);
+ if not inputln(input, true) then begin
+ writeln(output);
+ writeln(output, '! End of file on the terminal... why?');
+ initterminal := false;
+ goto 10
+ end;
+ curinput.locfield := first;
+ while (curinput.locfield < last) and (buffer[curinput.locfield] = 32) do
+ curinput.locfield := curinput.locfield + 1;
+ if curinput.locfield < last then begin
+ initterminal := true;
+ goto 10
+ end;
+ writeln(output, 'Please type the name of your input file.')
+ end;
+ 10:
+ null
+ end; { initterminal }
+{:36}
+ {44:}
+
+ function makestring: strnumber;
+ begin
+ if strptr = maxstrptr then begin
+ if strptr = maxstrings then
+ overflow(130, maxstrings - initstrptr);
+ maxstrptr := maxstrptr + 1
+ end;
+ strref[strptr] := 1;
+ strptr := strptr + 1;
+ strstart[strptr] := poolptr;
+ makestring := strptr - 1
+ end; { makestring }
+{:44}
+ {45:}
+
+ function streqbuf(s: strnumber; k: integer): boolean;
+ label
+ 45;
+ var
+ j: poolpointer;
+ result: boolean;
+ begin
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ if strpool[j] <> buffer[k] then begin
+ result := false;
+ goto 45
+ end;
+ j := j + 1;
+ k := k + 1
+ end;
+ result := true;
+ 45:
+ streqbuf := result
+ end; {:45} {46:}
+
+ function strvsstr(s, t: strnumber): integer;
+ label
+ 10;
+ var
+ j, k: poolpointer;
+ ls, lt: integer;
+ l: integer;
+ begin
+ ls := strstart[s + 1] - strstart[s];
+ lt := strstart[t + 1] - strstart[t];
+ if ls <= lt then
+ l := ls
+ else
+ l := lt;
+ j := strstart[s];
+ k := strstart[t];
+ while l > 0 do begin
+ if strpool[j] <> strpool[k] then begin
+ strvsstr := strpool[j] - strpool[k];
+ goto 10
+ end;
+ j := j + 1;
+ k := k + 1;
+ l := l - 1
+ end;
+ strvsstr := ls - lt;
+ 10:
+ null
+ end; {:46} {47:}
+ {function getstringsstarted:boolean;label 30,10;
+ var k,l:0..127;m,n:char;g:strnumber;a:integer;c:boolean;
+ begin poolptr:=0;strptr:=0;maxpoolptr:=0;maxstrptr:=0;strstart[0]:=0;
+ [48:]for k:=0 to 127 do begin if([49:](k<32)or(k>126)[:49])then begin
+ begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
+ begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
+ if k<64 then begin strpool[poolptr]:=k+64;poolptr:=poolptr+1;
+ end else begin strpool[poolptr]:=k-64;poolptr:=poolptr+1;end;
+ end else begin strpool[poolptr]:=k;poolptr:=poolptr+1;end;g:=makestring;
+ strref[g]:=127;end[:48];[51:]nameoffile:=poolname;
+ if aopenin(poolfile,8)then begin c:=false;
+ repeat[52:]begin if eof(poolfile)then begin;
+ writeln(output,'! mf.pool has no check sum.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end;read(poolfile,m,n);
+ if m='*'then[53:]begin a:=0;k:=1;
+ while true do begin if(xord[n]<48)or(xord[n]>57)then begin;
+ writeln(output,'! mf.pool check sum doesn''t have nine digits.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;
+ a:=10*a+xord[n]-48;if k=9 then goto 30;k:=k+1;read(poolfile,n);end;
+ 30:if a<>503742536 then begin;
+ writeln(output,'! mf.pool doesn''t match; tangle me again.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;c:=true;
+ end[:53]else begin if(xord[m]<48)or(xord[m]>57)or(xord[n]<48)or(xord[n]>
+ 57)then begin;
+ writeln(output,'! mf.pool line doesn''t begin with two digits.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;
+ l:=xord[m]*10+xord[n]-48*11;
+ if poolptr+l+stringvacancies>poolsize then begin;
+ writeln(output,'! You have to increase POOLSIZE.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end;
+ for k:=1 to l do begin if eoln(poolfile)then m:=' 'else read(poolfile,m)
+ ;begin strpool[poolptr]:=xord[m];poolptr:=poolptr+1;end;end;
+ readln(poolfile);g:=makestring;strref[g]:=127;end;end[:52];until c;
+ aclose(poolfile);getstringsstarted:=true;end else begin;
+ writeln(output,'! I can''t read mf.pool.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end[:51];10:end;}
+ {:47}
+ {65:}
+
+ procedure printdd(n: integer);
+ begin
+ n := abs(n) mod 100;
+ printchar(48 + (n div 10));
+ printchar(48 + (n mod 10))
+ end; {:65} {66:}
+
+ procedure terminput;
+ var
+ k: 0..bufsize;
+ begin
+ flush(output);
+ if not inputln(input, true) then
+ fatalerror(132);
+ termoffset := 0;
+ selector := selector - 1;
+ if last <> first then
+ for k := first to last - 1 do
+ print(buffer[k]);
+ println;
+ buffer[last] := 37;
+ selector := selector + 1
+ end; {:66} {87:}
+
+ procedure normalizeselector;
+ begin
+ if jobname > 0 then
+ selector := 3
+ else
+ selector := 1;
+ if jobname = 0 then
+ openlogfile;
+ if interaction = 0 then
+ selector := selector - 1
+ end; {:87} {93:}
+
+ procedure pauseforinstructions;
+ begin
+ if OKtointerrupt then begin
+ interaction := 3;
+ if (selector = 2) or (selector = 0) then
+ selector := selector + 1;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(165)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 166;
+ helpline[1] := 167;
+ helpline[0] := 168
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ interrupt := 0
+ end
+ end; {:93} {94:}
+
+ procedure missingerr(s: strnumber);
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(169)
+ end;
+ print(s);
+ print(170)
+ end; {:94} {99:}
+
+ procedure cleararith;
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(171)
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 172;
+ helpline[2] := 173;
+ helpline[1] := 174;
+ helpline[0] := 175
+ end;
+ error;
+ aritherror := false
+ end; {:99} {100:}
+
+ function slowadd(x, y: integer): integer;
+ begin
+ if x >= 0 then
+ if y <= (2147483647 - x) then
+ slowadd := x + y
+ else begin
+ aritherror := true;
+ slowadd := 2147483647
+ end
+ else if (-y) <= (2147483647 + x) then
+ slowadd := x + y
+ else begin
+ aritherror := true;
+ slowadd := -2147483647
+ end
+ end; {:100} {102:}
+
+ function rounddecimals(k: smallnumber): scaled;
+ var
+ a: integer;
+ begin
+ a := 0;
+ while k > 0 do begin
+ k := k - 1;
+ a := (a + (dig[k] * 131072)) div 10
+ end;
+ rounddecimals := (a + 1) div 2
+ end; {:102} {112:}
+
+ function takescaled(q: integer; f: scaled): integer;
+ var
+ p: integer;
+ negative: boolean;
+ n: integer;
+ becareful: integer; {110:}
+ begin
+ if f >= 0 then
+ negative := false
+ else begin
+ f := -f;
+ negative := true
+ end;
+ if q < 0 then begin
+ q := -q;
+ negative := not negative
+ end; {:110}
+ if f < 65536 then
+ n := 0
+ else begin
+ n := f div 65536;
+ f := f mod 65536;
+ if q <= (2147483647 div n) then
+ n := n * q
+ else begin
+ aritherror := true;
+ n := 2147483647
+ end
+ end;
+ f := f + 65536; {113:}
+ p := 32768;
+ if q < 1073741824 then
+ repeat
+ if odd(f) then
+ p := (p + q) div 2
+ else
+ p := p div 2;
+ f := f div 2
+ until f = 1
+ else
+ repeat
+ if odd(f) then
+ p := p + ((q - p) div 2)
+ else
+ p := p div 2;
+ f := f div 2
+ until f = 1 {:113};
+ becareful := n - 2147483647;
+ if (becareful + p) > 0 then begin
+ aritherror := true;
+ n := 2147483647 - p
+ end;
+ if negative then
+ takescaled := -(n + p)
+ else
+ takescaled := n + p
+ end; {:112} {114:}
+
+ function makescaled(p, q: integer): scaled;
+ var
+ f: integer;
+ n: integer;
+ negative: boolean;
+ becareful: integer;
+ begin
+ if p >= 0 then
+ negative := false
+ else begin
+ p := -p;
+ negative := true
+ end;
+ if q <= 0 then begin {if q=0 then confusion(47);}
+ q := -q;
+ negative := not negative
+ end;
+ n := p div q;
+ p := p mod q;
+ if n >= 32768 then begin
+ aritherror := true;
+ if negative then
+ makescaled := -2147483647
+ else
+ makescaled := 2147483647
+ end else begin
+ n := (n - 1) * 65536; {115:}
+ f := 1;
+ repeat
+ becareful := p - q;
+ p := becareful + p;
+ if p >= 0 then
+ f := (f + f) + 1
+ else begin
+ f := f + f;
+ p := p + q
+ end
+ until f >= 65536;
+ becareful := p - q;
+ if (becareful + p) >= 0 then
+ f := f + 1 {:115};
+ if negative then
+ makescaled := -(f + n)
+ else
+ makescaled := f + n
+ end
+ end; {:114}
+{116:}
+
+ function velocity(st, ct, sf, cf: fraction; t: scaled): fraction;
+ var
+ acc, num, denom: integer;
+ begin
+ acc := takefraction(st - (sf div 16), sf - (st div 16));
+ acc := takefraction(acc, ct - cf);
+ num := 536870912 + takefraction(acc, 379625062);
+ denom := (805306368 + takefraction(ct, 497706707)) + takefraction(cf, 307599661);
+ if t <> 65536 then
+ num := makescaled(num, t);
+ if (num div 4) >= denom then
+ velocity := 1073741824
+ else
+ velocity := makefraction(num, denom)
+ end; {:116} {117:}
+
+ function abvscd ;
+ label
+ 10;
+ var
+ q, r: integer; {118:}
+ begin
+ if a < 0 then begin
+ a := -a;
+ b := -b
+ end;
+ if c < 0 then begin
+ c := -c;
+ d := -d
+ end;
+ if d <= 0 then begin
+ if b >= 0 then
+ if ((a = 0) or (b = 0)) and ((c = 0) or (d = 0)) then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := 1;
+ goto 10
+ end;
+ if d = 0 then
+ if a = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end;
+ q := a;
+ a := c;
+ c := q;
+ q := -b;
+ b := -d;
+ d := q
+ end else if b <= 0 then begin
+ if b < 0 then
+ if a > 0 then begin
+ abvscd := -1;
+ goto 10
+ end;
+ if c = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end
+ end {:118};
+ while true do begin
+ q := a div d;
+ r := c div b;
+ if q <> r then
+ if q > r then begin
+ abvscd := 1;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end;
+ q := a mod d;
+ r := c mod b;
+ if r = 0 then
+ if q = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := 1;
+ goto 10
+ end;
+ if q = 0 then begin
+ abvscd := -1;
+ goto 10
+ end;
+ a := b;
+ b := q;
+ c := d;
+ d := r
+ end;
+ 10:
+ null
+ end; {:117} {119:}
+
+ function floorscaled(x: scaled): scaled;
+ var
+ becareful: integer;
+ begin
+ if x >= 0 then
+ floorscaled := x - (x mod 65536)
+ else begin
+ becareful := x + 1;
+ floorscaled := (x + ((-becareful) mod 65536)) - 65535
+ end
+ end; { floorscaled }
+
+ function floorunscaled(x: scaled): integer;
+ var
+ becareful: integer;
+ begin
+ if x >= 0 then
+ floorunscaled := x div 65536
+ else begin
+ becareful := x + 1;
+ floorunscaled := -(1 + ((-becareful) div 65536))
+ end
+ end; { floorunscaled }
+
+ function roundunscaled(x: scaled): integer;
+ var
+ becareful: integer;
+ begin
+ if x >= 32768 then
+ roundunscaled := 1 + ((x - 32768) div 65536)
+ else if x >= (-32768) then
+ roundunscaled := 0
+ else begin
+ becareful := x + 1;
+ roundunscaled := -(1 + (((-becareful) - 32768) div 65536))
+ end
+ end; { roundunscaled }
+
+ function roundfraction(x: fraction): scaled;
+ var
+ becareful: integer;
+ begin
+ if x >= 2048 then
+ roundfraction := 1 + ((x - 2048) div 4096)
+ else if x >= (-2048) then
+ roundfraction := 0
+ else begin
+ becareful := x + 1;
+ roundfraction := -(1 + (((-becareful) - 2048) div 4096))
+ end
+ end; {:119} {121:}
+
+ function squarert(x: scaled): scaled;
+ var
+ k: smallnumber;
+ y, q: integer;
+ begin
+ if x <= 0 then begin {122:}
+ if x < 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(176)
+ end;
+ printscaled(x);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 178;
+ helpline[0] := 179
+ end;
+ error
+ end;
+ squarert := 0
+ end else begin {:122}
+ k := 23;
+ q := 2;
+ while x < 536870912 do begin
+ k := k - 1;
+ x := ((x + x) + x) + x
+ end;
+ if x < 1073741824 then
+ y := 0
+ else begin
+ x := x - 1073741824;
+ y := 1
+ end; {123:}
+ repeat
+ x := x + x;
+ y := y + y;
+ if x >= 1073741824 then begin
+ x := x - 1073741824;
+ y := y + 1
+ end;
+ x := x + x;
+ y := (y + y) - q;
+ q := q + q;
+ if x >= 1073741824 then begin
+ x := x - 1073741824;
+ y := y + 1
+ end;
+ if y > q then begin
+ y := y - q;
+ q := q + 2
+ end else if y <= 0 then begin
+ q := q - 2;
+ y := y + q
+ end;
+ k := k - 1 {:123}
+ until k = 0;
+ squarert := q div 2
+ end
+ end; {:121}
+{124:}
+
+ function pythadd(a, b: integer): integer;
+ label
+ 30;
+ var
+ r: fraction;
+ big: boolean;
+ begin
+ a := abs(a);
+ b := abs(b);
+ if a < b then begin
+ r := b;
+ b := a;
+ a := r
+ end;
+ if a > 0 then begin
+ if a < 536870912 then
+ big := false
+ else begin
+ a := a div 4;
+ b := b div 4;
+ big := true
+ end; {125:}
+ while true do begin
+ r := makefraction(b, a);
+ r := takefraction(r, r);
+ if r = 0 then
+ goto 30;
+ r := makefraction(r, 1073741824 + r);
+ a := a + takefraction(a + a, r);
+ b := takefraction(b, r)
+ end;
+ 30: {:125}
+ null;
+ if big then
+ if a < 536870912 then
+ a := ((a + a) + a) + a
+ else begin
+ aritherror := true;
+ a := 2147483647
+ end
+ end;
+ pythadd := a
+ end; {:124} {126:}
+
+ function pythsub(a, b: integer): integer;
+ label
+ 30;
+ var
+ r: fraction;
+ big: boolean;
+ begin
+ a := abs(a);
+ b := abs(b);
+ if a <= b then begin {128:}
+ if a < b then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(180)
+ end;
+ printscaled(a);
+ print(181);
+ printscaled(b);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 178;
+ helpline[0] := 179
+ end;
+ error
+ end;
+ a := 0
+ end else begin {:128}
+ if a < 1073741824 then
+ big := false
+ else begin
+ a := a div 2;
+ b := b div 2;
+ big := true
+ end; {127:}
+ while true do begin
+ r := makefraction(b, a);
+ r := takefraction(r, r);
+ if r = 0 then
+ goto 30;
+ r := makefraction(r, 1073741824 - r);
+ a := a - takefraction(a + a, r);
+ b := takefraction(b, r)
+ end;
+ 30: {:127}
+ null;
+ if big then
+ a := a + a
+ end;
+ pythsub := a
+ end; {:126} {132:}
+
+ function mlog(x: scaled): scaled;
+ var
+ y, z: integer;
+ k: integer;
+ begin
+ if x <= 0 then begin {134:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(182)
+ end;
+ printscaled(x);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 183;
+ helpline[0] := 179
+ end;
+ error;
+ mlog := 0
+ end else begin {:134}
+ y := 1302456860;
+ z := 6581195;
+ while x < 1073741824 do begin
+ x := x + x;
+ y := y - 93032639;
+ z := z - 48782
+ end;
+ y := y + (z div 65536);
+ k := 2;
+ while x > 1073741828 do begin {133:}
+ z := ((x - 1) div twotothe[k]) + 1;
+ while x < (1073741824 + z) do begin
+ z := (z + 1) div 2;
+ k := k + 1
+ end;
+ y := y + speclog[k];
+ x := x - z
+ end {:133};
+ mlog := y div 8
+ end
+ end; {:132} {135:}
+
+ function mexp(x: scaled): scaled;
+ var
+ k: smallnumber;
+ y, z: integer;
+ begin
+ if x > 174436200 then begin
+ aritherror := true;
+ mexp := 2147483647
+ end else if x < (-197694359) then
+ mexp := 0
+ else begin
+ if x <= 0 then begin
+ z := -(8 * x);
+ y := 1048576
+ end else begin
+ if x <= 127919879 then
+ z := 1023359037 - (8 * x)
+ else
+ z := 8 * (174436200 - x);
+ y := 2147483647
+ end; {136:}
+ k := 1;
+ while z > 0 do begin
+ while z >= speclog[k] do begin
+ z := z - speclog[k];
+ y := (y - 1) - ((y - twotothe[k - 1]) div twotothe[k])
+ end;
+ k := k + 1
+ end {:136};
+ if x <= 127919879 then
+ mexp := (y + 8) div 16
+ else
+ mexp := y
+ end
+ end; {:135} {139:}
+
+ function narg(x, y: integer): angle;
+ var
+ z: angle;
+ t: integer;
+ k: smallnumber;
+ octant: 1..8;
+ begin
+ if x >= 0 then
+ octant := 1
+ else begin
+ x := -x;
+ octant := 2
+ end;
+ if y < 0 then begin
+ y := -y;
+ octant := octant + 2
+ end;
+ if x < y then begin
+ t := y;
+ y := x;
+ x := t;
+ octant := octant + 4
+ end;
+ if x = 0 then begin {140:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(184)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 185;
+ helpline[0] := 179
+ end;
+ error;
+ narg := 0
+ end else begin {:140} {142:}
+ while x >= 536870912 do begin
+ x := x div 2;
+ y := y div 2
+ end;
+ z := 0;
+ if y > 0 then begin
+ while x < 268435456 do begin
+ x := x + x;
+ y := y + y
+ end; {143:}
+ k := 0;
+ repeat
+ y := y + y;
+ k := k + 1;
+ if y > x then begin
+ z := z + specatan[k];
+ t := x;
+ x := x + (y div twotothe[k + k]);
+ y := y - t
+ end
+ until k = 15;
+ repeat
+ y := y + y;
+ k := k + 1;
+ if y > x then begin
+ z := z + specatan[k];
+ y := y - x
+ end
+ until k = 26 {:143}
+ end {:142}; {141:}
+ case octant of
+ 1:
+ narg := z;
+ 5:
+ narg := 94371840 - z;
+ 6:
+ narg := 94371840 + z;
+ 2:
+ narg := 188743680 - z;
+ 4:
+ narg := z - 188743680;
+ 8:
+ narg := (-z) - 94371840;
+ 7:
+ narg := z - 94371840;
+ 3:
+ narg := -z
+ end {:141}
+ end
+ end; {:139} {145:}
+
+ procedure nsincos(z: angle);
+ var
+ k: smallnumber;
+ q: 0..7;
+ r: fraction;
+ x, y, t: integer;
+ begin
+ while z < 0 do
+ z := z + 377487360;
+ z := z mod 377487360;
+ q := z div 47185920;
+ z := z mod 47185920;
+ x := 268435456;
+ y := x;
+ if not odd(q) then
+ z := 47185920 - z; {147:}
+ k := 1;
+ while z > 0 do begin
+ if z >= specatan[k] then begin
+ z := z - specatan[k];
+ t := x;
+ x := t + (y div twotothe[k]);
+ y := y - (t div twotothe[k])
+ end;
+ k := k + 1
+ end;
+ if y < 0 then
+ y := 0 {:147}; {146:}
+ case q of
+ 0:
+ null;
+ 1:
+ begin
+ t := x;
+ x := y;
+ y := t
+ end;
+ 2:
+ begin
+ t := x;
+ x := -y;
+ y := t
+ end;
+ 3:
+ x := -x;
+ 4:
+ begin
+ x := -x;
+ y := -y
+ end;
+ 5:
+ begin
+ t := x;
+ x := -y;
+ y := -t
+ end;
+ 6:
+ begin
+ t := x;
+ x := y;
+ y := -t
+ end;
+ 7:
+ y := -y
+ end {:146};
+ r := pythadd(x, y);
+ ncos := makefraction(x, r);
+ nsin := makefraction(y, r)
+ end; {:145} {149:}
+
+ procedure newrandoms;
+ var
+ k: 0..54;
+ x: fraction;
+ begin
+ for k := 0 to 23 do begin
+ x := randoms[k] - randoms[k + 31];
+ if x < 0 then
+ x := x + 268435456;
+ randoms[k] := x
+ end;
+ for k := 24 to 54 do begin
+ x := randoms[k] - randoms[k - 24];
+ if x < 0 then
+ x := x + 268435456;
+ randoms[k] := x
+ end;
+ jrandom := 54
+ end; {:149}
+{150:}
+
+ procedure initrandoms(seed: scaled);
+ var
+ j, jj, k: fraction;
+ i: 0..54;
+ begin
+ j := abs(seed);
+ while j >= 268435456 do
+ j := j div 2;
+ k := 1;
+ for i := 0 to 54 do begin
+ jj := k;
+ k := j - k;
+ j := jj;
+ if k < 0 then
+ k := k + 268435456;
+ randoms[(i * 21) mod 55] := j
+ end;
+ newrandoms;
+ newrandoms;
+ newrandoms
+ end; {:150}
+{151:}
+
+ function unifrand(x: scaled): scaled;
+ var
+ y: scaled;
+ begin
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ y := takefraction(abs(x), randoms[jrandom]);
+ if y = abs(x) then
+ unifrand := 0
+ else if x > 0 then
+ unifrand := y
+ else
+ unifrand := -y
+ end; {:151} {152:}
+
+ function normrand: scaled;
+ var
+ x, u, l: integer;
+ begin
+ repeat
+ repeat
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ x := takefraction(112429, randoms[jrandom] - 134217728);
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ u := randoms[jrandom]
+ until abs(x) < u;
+ x := makefraction(x, u);
+ l := 139548960 - mlog(u)
+ until abvscd(1024, l, x, x) >= 0;
+ normrand := x
+ end; {:152}
+{157:}
+ {procedure printword(w:memoryword);begin printint(w.int);
+ printchar(32);printscaled(w.int);printchar(32);
+ printscaled(w.int div 4096);println;printint(w.hh.lh);printchar(61);
+ printint(w.hh.b0);printchar(58);printint(w.hh.b1);printchar(59);
+ printint(w.hh.rh);printchar(32);printint(w.qqqq.b0);printchar(58);
+ printint(w.qqqq.b1);printchar(58);printint(w.qqqq.b2);printchar(58);
+ printint(w.qqqq.b3);end;}
+ {:157}
+ {162:}
+ {217:}
+
+ procedure printcapsule;
+ forward;
+
+ procedure showtokenlist(p, q: integer; l, nulltally: integer);
+ label
+ 10;
+ var
+ class, c: smallnumber;
+ r, v: integer;
+ begin
+ class := 3;
+ tally := nulltally;
+ while (p <> (-30000)) and (tally < l) do begin
+ if p = q then begin {646:}
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end {:646}; {218:}
+ c := 9;
+ if (p < (-30000)) or (p > memend) then begin
+ print(360);
+ goto 10
+ end;
+ if p < himemmin then {219:}
+ if mem[p].hh.b1 = 12 then
+ if mem[p].hh.b0 = 16 then begin {220:}
+ if class = 0 then
+ printchar(32);
+ v := mem[p + 1].int;
+ if v < 0 then begin
+ if class = 17 then
+ printchar(32);
+ printchar(91);
+ printscaled(v);
+ printchar(93);
+ c := 18
+ end else begin
+ printscaled(v);
+ c := 0
+ end
+ end else if mem[p].hh.b0 <> 4 then {:220}
+ print(363)
+ else begin
+ printchar(34);
+ slowprint(mem[p + 1].int);
+ printchar(34);
+ c := 4
+ end
+ else if ((mem[p].hh.b1 <> 11) or (mem[p].hh.b0 < 1)) or (mem[p].hh.b0 > 19) then
+ print(363)
+ else begin
+ gpointer := p;
+ printcapsule;
+ c := 8
+ end {:219}
+ else begin
+ r := mem[p].hh.lh;
+ if r >= 2242 then begin {222:}
+ if r < 2392 then begin
+ print(365);
+ r := r - 2242
+ end else if r < 2542 then begin
+ print(366);
+ r := r - 2392
+ end else begin
+ print(367);
+ r := r - 2542
+ end;
+ printint(r);
+ printchar(41);
+ c := 8
+ end else if r < 1 then {:222}
+ if r = 0 then begin {221:}
+ if class = 17 then
+ printchar(32);
+ print(364);
+ c := 18
+ end else {:221}
+ print(361)
+ else begin
+ r := hash[r].rh;
+ if (r < 0) or (r >= strptr) then
+ print(362) {223:}
+ else begin
+ c := charclass[strpool[strstart[r]]];
+ if c = class then
+ if c in
+ [9, 5, 6, 7, 8] then
+ case c of
+ 9:
+ printchar(46);
+ 5, 6, 7, 8:
+ null
+ end
+ else
+ printchar(32);
+ print(r)
+ end {:223}
+ end
+ end {:218};
+ class := c;
+ p := mem[p].hh.rh
+ end;
+ if p <> (-30000) then
+ print(359);
+ 10:
+ null
+ end; {:217} {665:}
+
+ procedure runaway;
+ begin
+ if scannerstatus > 2 then begin
+ printnl(503);
+ case scannerstatus of
+ 3:
+ print(504);
+ 4, 5:
+ print(505);
+ 6:
+ print(506)
+ end;
+ println;
+ showtokenlist(mem[29998].hh.rh, -30000, errorline - 10, 0)
+ end
+ end; { runaway }
+{:665}
+ {:162}
+ {163:}
+
+ function getavail: halfword;
+ var
+ p: halfword;
+ begin
+ p := avail;
+ if p <> (-30000) then
+ avail := mem[avail].hh.rh
+ else if memend < memmax then begin
+ memend := memend + 1;
+ p := memend
+ end else begin
+ himemmin := himemmin - 1;
+ p := himemmin;
+ if himemmin <= lomemmax then begin
+ runaway;
+ overflow(186, memmax + 30001)
+ end
+ end;
+ mem[p].hh.rh := -30000;
+{dynused:=dynused+1;}
+ getavail := p
+ end; {:163} {167:}
+
+ function getnode(s: integer): halfword;
+ label
+ 40, 10, 20;
+ var
+ p: halfword;
+ q: halfword;
+ r: integer;
+ t, tt: integer;
+ begin
+ 20:
+ p := rover; {169:}
+ repeat
+ q := p + mem[p].hh.lh;
+ while mem[q].hh.rh = 32767 do begin
+ t := mem[q + 1].hh.rh;
+ tt := mem[q + 1].hh.lh;
+ if q = rover then
+ rover := t;
+ mem[t + 1].hh.lh := tt;
+ mem[tt + 1].hh.rh := t;
+ q := q + mem[q].hh.lh
+ end;
+ r := q - s;
+ if r > (p + 1) then begin {170:}
+ mem[p].hh.lh := r - p;
+ rover := p;
+ goto 40
+ end {:170};
+ {171
+ :}
+ if r = p then
+ if (mem[p + 1].hh.rh <> rover) or (mem[p + 1].hh.lh <> rover) then begin
+ rover := mem[p + 1].hh.rh;
+ t := mem[p + 1].hh.lh;
+ mem[rover + 1].hh.lh := t;
+ mem[t + 1].hh.rh := rover;
+ goto 40
+ end {:171};
+ mem[p].hh.lh := q - p {:169};
+ p := mem[p + 1].hh.rh
+ until p = rover;
+ if s = 1073741824 then begin
+ getnode := 32767;
+ goto 10
+ end;
+ if (lomemmax + 2) < himemmin then
+ if (lomemmax + 2) <= 2767 then begin {168:}
+ if (lomemmax + 1000) < himemmin then
+ t := lomemmax + 1000
+ else
+ t := ((lomemmax + himemmin) + 2) div 2;
+ if t > 2767 then
+ t := 2767;
+ p := mem[rover + 1].hh.lh;
+ q := lomemmax;
+ mem[p + 1].hh.rh := q;
+ mem[rover + 1].hh.lh := q;
+ mem[q + 1].hh.rh := rover;
+ mem[q + 1].hh.lh := p;
+ mem[q].hh.rh := 32767;
+ mem[q].hh.lh := t - lomemmax;
+ lomemmax := t;
+ mem[lomemmax].hh.rh := -30000;
+ mem[lomemmax].hh.lh := -30000;
+ rover := q;
+ goto 20
+ end {:168};
+ overflow(186, memmax + 30001);
+ 40:
+ mem[r].hh.rh := -30000; {varused:=varused+s;}
+ getnode := r;
+ 10:
+ null
+ end; {:167} {172:}
+
+ procedure freenode(p: halfword; s: halfword);
+ var
+ q: halfword;
+ begin
+ mem[p].hh.lh := s;
+ mem[p].hh.rh := 32767;
+ q := mem[rover + 1].hh.lh;
+ mem[p + 1].hh.lh := q;
+ mem[p + 1].hh.rh := rover;
+ mem[rover + 1].hh.lh := p;
+ mem[q + 1].hh.rh := p
+ end; {varused:=varused-s;} {:172}
+{173:}
+ {procedure sortavail;var p,q,r:halfword;oldrover:halfword;
+ begin p:=getnode(1073741824);p:=mem[rover+1].hh.rh;
+ mem[rover+1].hh.rh:=32767;oldrover:=rover;
+ while p<>oldrover do[174:]if p<rover then begin q:=p;p:=mem[q+1].hh.rh;
+ mem[q+1].hh.rh:=rover;rover:=q;end else begin q:=rover;
+ while mem[q+1].hh.rh<p do q:=mem[q+1].hh.rh;r:=mem[p+1].hh.rh;
+ mem[p+1].hh.rh:=mem[q+1].hh.rh;mem[q+1].hh.rh:=p;p:=r;end[:174];
+ p:=rover;
+ while mem[p+1].hh.rh<>32767 do begin mem[mem[p+1].hh.rh+1].hh.lh:=p;
+ p:=mem[p+1].hh.rh;end;mem[p+1].hh.rh:=rover;mem[rover+1].hh.lh:=p;end;}
+{:173}
+ {177:}
+
+ procedure flushlist(p: halfword);
+ label
+ 30;
+ var
+ q, r: halfword;
+ begin
+ if p >= himemmin then
+ if p <> 30000 then begin
+ r := p;
+ repeat
+ q := r;
+ r := mem[r].hh.rh; {dynused:=dynused-1;}
+ if r < himemmin then
+ goto 30
+ until r = 30000;
+ 30:
+ mem[q].hh.rh := avail;
+ avail := p
+ end
+ end; { flushlist }
+
+ procedure flushnodelist(p: halfword);
+ var
+ q: halfword;
+ begin
+ while p <> (-30000) do begin
+ q := p;
+ p := mem[p].hh.rh;
+ if q < himemmin then
+ freenode(q, 2)
+ else begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end
+{dynused:=dynused-1;}
+ end
+ end; {:177} {180:}
+{procedure checkmem(printlocs:boolean);label 31,32;var p,q,r:halfword;
+clobbered:boolean;begin for p:=-30000 to lomemmax do freearr[p]:=false;
+for p:=himemmin to memend do freearr[p]:=false;[181:]p:=avail;q:=-30000;
+clobbered:=false;
+while p<>-30000 do begin if(p>memend)or(p<himemmin)then clobbered:=true
+else if freearr[p]then clobbered:=true;
+if clobbered then begin printnl(187);printint(q);goto 31;end;
+freearr[p]:=true;q:=p;p:=mem[q].hh.rh;end;31:[:181];[182:]p:=rover;
+q:=-30000;clobbered:=false;
+repeat if(p>=lomemmax)or(p<-30000)then clobbered:=true else if(mem[p+1].
+hh.rh>=lomemmax)or(mem[p+1].hh.rh<-30000)then clobbered:=true else if
+not((mem[p].hh.rh=32767))or(mem[p].hh.lh<2)or(p+mem[p].hh.lh>lomemmax)or
+(mem[mem[p+1].hh.rh+1].hh.lh<>p)then clobbered:=true;
+if clobbered then begin printnl(188);printint(q);goto 32;end;
+for q:=p to p+mem[p].hh.lh-1 do begin if freearr[q]then begin printnl(
+189);printint(q);goto 32;end;freearr[q]:=true;end;q:=p;
+p:=mem[p+1].hh.rh;until p=rover;32:[:182];[183:]p:=-30000;
+while p<=lomemmax do begin if(mem[p].hh.rh=32767)then begin printnl(190)
+;printint(p);end;while(p<=lomemmax)and not freearr[p]do p:=p+1;
+while(p<=lomemmax)and freearr[p]do p:=p+1;end[:183];[617:]q:=-29987;
+p:=mem[q].hh.rh;
+while p<>-29987 do begin if mem[p+1].hh.lh<>q then begin printnl(463);
+printint(p);end;p:=mem[p+1].hh.rh;r:=himemmin;
+repeat if mem[p].hh.lh>=r then begin printnl(464);printint(p);end;
+r:=mem[p].hh.lh;q:=p;p:=mem[q].hh.rh;until r=-30000;end[:617];
+if printlocs then[184:]begin printnl(191);
+for p:=-30000 to lomemmax do if not freearr[p]and((p>waslomax)or wasfree
+[p])then begin printchar(32);printint(p);end;
+for p:=himemmin to memend do if not freearr[p]and((p<washimin)or(p>
+wasmemend)or wasfree[p])then begin printchar(32);printint(p);end;
+end[:184];for p:=-30000 to lomemmax do wasfree[p]:=freearr[p];
+for p:=himemmin to memend do wasfree[p]:=freearr[p];wasmemend:=memend;
+waslomax:=lomemmax;washimin:=himemmin;end;}
+ {:180}
+ {185:}
+{procedure searchmem(p:halfword);var q:integer;
+begin for q:=-30000 to lomemmax do begin if mem[q].hh.rh=p then begin
+printnl(192);printint(q);printchar(41);end;
+if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
+end;
+for q:=himemmin to memend do begin if mem[q].hh.rh=p then begin printnl(
+192);printint(q);printchar(41);end;
+if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
+end;
+[209:]for q:=1 to 2241 do begin if eqtb[q].rh=p then begin printnl(328);
+printint(q);printchar(41);end;end[:209];end;}
+ {:185}
+ {189:}
+
+ procedure printop(c: quarterword);
+ begin
+ if c <= 15 then
+ printtype(c)
+ else
+ if c in
+ [30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45,
+ 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 94,
+ 95, 96, 97, 98, 99, 100] then
+ case c of
+ 30:
+ print(218);
+ 31:
+ print(219);
+ 32:
+ print(220);
+ 33:
+ print(221);
+ 34:
+ print(222);
+ 35:
+ print(223);
+ 36:
+ print(224);
+ 37:
+ print(225);
+ 38:
+ print(226);
+ 39:
+ print(227);
+ 40:
+ print(228);
+ 41:
+ print(229);
+ 42:
+ print(230);
+ 43:
+ print(231);
+ 44:
+ print(232);
+ 45:
+ print(233);
+ 46:
+ print(234);
+ 47:
+ print(235);
+ 48:
+ print(236);
+ 49:
+ print(237);
+ 50:
+ print(238);
+ 51:
+ print(239);
+ 52:
+ print(240);
+ 53:
+ print(241);
+ 54:
+ print(242);
+ 55:
+ print(243);
+ 56:
+ print(244);
+ 57:
+ print(245);
+ 58:
+ print(246);
+ 59:
+ print(247);
+ 60:
+ print(248);
+ 61:
+ print(249);
+ 62:
+ print(250);
+ 63:
+ print(251);
+ 64:
+ print(252);
+ 65:
+ print(253);
+ 66:
+ print(254);
+ 67:
+ print(255);
+ 68:
+ print(256);
+ 69:
+ printchar(43);
+ 70:
+ printchar(45);
+ 71:
+ printchar(42);
+ 72:
+ printchar(47);
+ 73:
+ print(257);
+ 74:
+ print(181);
+ 75:
+ print(258);
+ 76:
+ print(259);
+ 77:
+ printchar(60);
+ 78:
+ print(260);
+ 79:
+ printchar(62);
+ 80:
+ print(261);
+ 81:
+ printchar(61);
+ 82:
+ print(262);
+ 83:
+ print(38);
+ 84:
+ print(263);
+ 85:
+ print(264);
+ 86:
+ print(265);
+ 87:
+ print(266);
+ 88:
+ print(267);
+ 89:
+ print(268);
+ 90:
+ print(269);
+ 91:
+ print(270);
+ 92:
+ print(271);
+ 94:
+ print(272);
+ 95:
+ print(273);
+ 96:
+ print(274);
+ 97:
+ print(275);
+ 98:
+ print(276);
+ 99:
+ print(277);
+ 100:
+ print(278)
+ end
+ else
+ print(279)
+ end; { printop }
+{:189}
+ {194:}
+
+ procedure fixdateandtime;
+ begin
+ dateandtime(internal[17], internal[16], internal[15], internal[14]);
+ internal[17] := internal[17] * 65536;
+ internal[16] := internal[16] * 65536;
+ internal[15] := internal[15] * 65536;
+ internal[14] := internal[14] * 65536;
+ {----------------------------------}
+ lastyearval := internal[14];
+ lastmonthval:= internal[15];
+ {----------------------------------}
+ end; { fixdateandtime }
+{:194}
+ {205:}
+
+ function idlookup(j, l: integer): halfword;
+ label
+ 40;
+ var
+ h: integer;
+ p: halfword;
+ k: halfword;
+ begin
+ if l = 1 then begin {206:}
+ p := buffer[j] + 1;
+ hash[p].rh := p - 1;
+ goto 40
+ end {:206}; {208:}
+ h := buffer[j];
+ for k := j + 1 to (j + l) - 1 do begin
+ h := (h + h) + buffer[k];
+ while h >= 1777 do
+ h := h - 1777
+ end {:208};
+ p := h + 129;
+ while true do begin
+ if hash[p].rh > 0 then
+ if (strstart[hash[p].rh + 1] - strstart[hash[p].rh]) = l then
+ if streqbuf(hash[p].rh, j) then
+ goto 40;
+ if hash[p].lh = 0 then begin {207:}
+ if hash[p].rh > 0 then begin
+ repeat
+ if hashused = 1 then
+ overflow(327, 2100);
+ hashused := hashused - 1
+ until hash[hashused].rh = 0;
+ hash[p].lh := hashused;
+ p := hashused
+ end;
+ begin
+ if (poolptr + l) > maxpoolptr then begin
+ if (poolptr + l) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + l
+ end
+ end;
+ for k := j to (j + l) - 1 do begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ hash[p].rh := makestring;
+ strref[hash[p].rh] := 127;
+{stcount:=stcount+1;}
+ goto 40
+ end {:207};
+ p := hash[p].lh
+ end;
+ 40:
+ idlookup := p
+ end; {:205} {210:}
+ {procedure primitive(s:strnumber;c:halfword;o:halfword);
+ var k:poolpointer;j:smallnumber;l:smallnumber;begin k:=strstart[s];
+ l:=strstart[s+1]-k;for j:=0 to l-1 do buffer[j]:=strpool[k+j];
+ cursym:=idlookup(0,l);if s>=128 then begin flushstring(strptr-1);
+ hash[cursym].rh:=s;end;eqtb[cursym].lh:=c;eqtb[cursym].rh:=o;end;}
+ {:210}
+{215:}
+
+ function newnumtok(v: scaled): halfword;
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ mem[p + 1].int := v;
+ mem[p].hh.b0 := 16;
+ mem[p].hh.b1 := 12;
+ newnumtok := p
+ end; {:215} {216:}
+
+ procedure tokenrecycle;
+ forward;
+
+ procedure flushtokenlist(p: halfword);
+ var
+ q: halfword;
+ begin
+ while p <> (-30000) do begin
+ q := p;
+ p := mem[p].hh.rh;
+ if q >= himemmin then begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end else begin
+{dynused:=dynused-1;}
+ if mem[q].hh.b0 in
+ [1, 2, 16, 4, 3, 5, 7, 12,
+ 10, 6, 9, 8, 11, 14, 13, 17,
+ 18, 19] then
+ case mem[q].hh.b0 of
+ 1, 2, 16:
+ null;
+ 4:
+ begin
+ if strref[mem[q + 1].int] < 127 then
+ if strref[mem[q + 1].int] > 1 then
+ strref[mem[q + 1].int] := strref[mem[q + 1].int] - 1
+ else
+ flushstring(mem[q + 1].int)
+ end;
+ 3, 5, 7, 12, 10, 6, 9,
+ 8, 11, 14, 13, 17, 18, 19:
+ begin
+ gpointer := q;
+ tokenrecycle
+ end
+ end
+ else
+ confusion(358);
+ freenode(q, 2)
+ end
+ end
+ end; { flushtokenlist }
+{:216}
+ {226:}
+
+ procedure deletemacref(p: halfword);
+ begin
+ if mem[p].hh.lh = (-30000) then
+ flushtokenlist(p)
+ else
+ mem[p].hh.lh := mem[p].hh.lh - 1
+ end; {:226} {227:} {625:}
+
+ procedure printcmdmod(c, m: integer);
+ begin
+ if c in
+ [18, 77, 59, 72, 32, 78, 79, 57,
+ 19, 60, 27, 11, 81, 26, 6, 9,
+ 70, 73, 13, 46, 63, 14, 15, 69,
+ 28, 47, 24, 7, 65, 64, 12, 8,
+ 80, 17, 74, 35, 58, 71, 75, 16,
+ 4, 61, 56, 3, 1, 2, 33, 34,
+ 37, 55, 45, 50, 36, 43, 54, 48,
+ 51, 52, 30, 82, 23, 21, 22, 31,
+ 62, 41, 10, 53, 44, 49, 5, 40,
+ 68, 66, 67, 25, 20, 76, 29] then
+ case c of {212:}
+ 18:
+ print(330);
+ 77:
+ print(329);
+ 59:
+ print(332);
+ 72:
+ print(331);
+ 32:
+ print(333);
+ 78:
+ print(58);
+ 79:
+ print(44);
+ 57:
+ print(334);
+ 19:
+ print(335);
+ 60:
+ print(336);
+ 27:
+ print(337);
+ 11:
+ print(338);
+ 81:
+ print(323);
+ 26:
+ print(339);
+ 6:
+ print(340);
+ 9:
+ print(341);
+ 70:
+ print(342);
+ 73:
+ print(343);
+ 13:
+ print(344);
+ 46:
+ print(123);
+ 63:
+ print(91);
+ 14:
+ print(345);
+ 15:
+ print(346);
+ 69:
+ print(347);
+ 28:
+ print(348);
+ 47:
+ print(279);
+ 24:
+ print(349);
+ 7:
+ printchar(92);
+ 65:
+ print(125);
+ 64:
+ print(93);
+ 12:
+ print(350);
+ 8:
+ print(351);
+ 80:
+ print(59);
+ 17:
+ print(352);
+ 74:
+ print(353);
+ 35:
+ print(354);
+ 58:
+ print(355);
+ 71:
+ print(356);
+ 75:
+ print(357); {:212} {684:}
+ 16:
+ if m <= 2 then
+ if m = 1 then
+ print(520)
+ else if m < 1 then
+ print(324)
+ else
+ print(521)
+ else if m = 53 then
+ print(522)
+ else if m = 44 then
+ print(523)
+ else
+ print(524);
+ 4:
+ if m <= 1 then
+ if m = 1 then
+ print(527)
+ else
+ print(325)
+ else if m = 2242 then
+ print(525)
+ else
+ print(526); {:684} {689:}
+ 61:
+ if m in
+ [1, 2, 3] then
+ case m of
+ 1:
+ print(529);
+ 2:
+ printchar(64);
+ 3:
+ print(530)
+ end
+ else
+ print(528); {:689} {696:}
+ 56:
+ if m >= 2242 then
+ if m = 2242 then
+ print(541)
+ else if m = 2392 then
+ print(542)
+ else
+ print(543)
+ else if m < 2 then
+ print(544)
+ else if m = 2 then
+ print(545)
+ else
+ print(546); {:696} {710:}
+ 3:
+ if m = 0 then
+ print(556)
+ else
+ print(482);
+{:710}
+ {741:}
+ 1, 2:
+ if m in
+ [1, 2, 3] then
+ case m of
+ 1:
+ print(583);
+ 2:
+ print(322);
+ 3:
+ print(584)
+ end
+ else
+ print(585); {:741} {894:}
+ 33, 34, 37, 55, 45, 50, 36,
+ 43, 54, 48, 51, 52:
+ printop(m); {:894} {1014:}
+ 30:
+ printtype(m); {:1014} {1019:}
+ 82:
+ if m = 0 then
+ print(776)
+ else
+ print(777);
+{:1019}
+ {1025:}
+ 23:
+ if m in
+ [0, 1, 2] then
+ case m of
+ 0:
+ print(143);
+ 1:
+ print(144);
+ 2:
+ print(145)
+ end
+ else
+ print(783); {:1025} {1028:}
+ 21:
+ if m = 0 then
+ print(784)
+ else
+ print(785); {:1028} {1038:}
+ 22:
+ if m in
+ [0, 1, 2, 3] then
+ case m of
+ 0:
+ print(799);
+ 1:
+ print(800);
+ 2:
+ print(801);
+ 3:
+ print(802)
+ end
+ else
+ print(803); {:1038} {1043:}
+ 31, 62:
+ begin
+ if c = 31 then
+ print(806)
+ else
+ print(807);
+ print(808);
+ print(hash[m].rh)
+ end;
+ 41:
+ if m = (-30000) then
+ print(809)
+ else
+ print(810);
+ 10:
+ print(811);
+ 53, 44, 49:
+ begin
+ printcmdmod(16, c);
+ print(812);
+ println;
+ showtokenlist(mem[mem[m].hh.rh].hh.rh, -30000, 1000, 0)
+ end;
+ 5:
+ print(813);
+ 40:
+ print(intname[m]); {:1043} {1053:}
+ 68:
+ if m = 1 then
+ print(820)
+ else if m = 0 then
+ print(821)
+ else
+ print(822);
+ 66:
+ if m = 6 then
+ print(823)
+ else
+ print(824);
+ 67:
+ if m = 0 then
+ print(825)
+ else
+ print(826); {:1053} {1080:}
+ 25:
+ if m < 1 then
+ print(856)
+ else if m = 1 then
+ print(857)
+ else
+ print(858);
+{:1080}
+ {1102:}
+ 20:
+ if m in
+ [0, 1, 2, 3] then
+ case m of
+ 0:
+ print(868);
+ 1:
+ print(869);
+ 2:
+ print(870);
+ 3:
+ print(871)
+ end
+ else
+ print(872); {:1102} {1110:}
+ 76:
+ if m = 0 then
+ print(889)
+ else
+ print(890); {:1110} {1180:}
+ 29:
+ if m = 16 then
+ print(913)
+ else
+ print(912)
+ end
+ else {:1180}
+ print(468)
+ end; {:625}
+
+ procedure showmacro(p: halfword; q, l: integer);
+ label
+ 10;
+ var
+ r: halfword;
+ begin
+ p := mem[p].hh.rh;
+ while mem[p].hh.lh > 7 do begin
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := -30000;
+ showtokenlist(p, -30000, l, 0);
+ mem[p].hh.rh := r;
+ p := r;
+ if l > 0 then
+ l := l - tally
+ else
+ goto 10
+ end;
+ tally := 0;
+ case mem[p].hh.lh of
+ 0:
+ print(368);
+ 1, 2, 3:
+ begin
+ printchar(60);
+ printcmdmod(56, mem[p].hh.lh);
+ print(369)
+ end;
+ 4:
+ print(370);
+ 5:
+ print(371);
+ 6:
+ print(372);
+ 7:
+ print(373)
+ end;
+ showtokenlist(mem[p].hh.rh, q, l - tally, 0);
+ 10:
+ null
+ end; {:227} {232:}
+
+ procedure initbignode(p: halfword);
+ var
+ q: halfword;
+ s: smallnumber;
+ begin
+ s := bignodesize[mem[p].hh.b0];
+ q := getnode(s);
+ repeat
+ s := s - 2; {586:}
+ begin
+ mem[q + s].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[(q + s) + 1].int := serialno
+ end {:586};
+ mem[q + s].hh.b1 := (s div 2) + 5;
+ mem[q + s].hh.rh := -30000
+ until s = 0;
+ mem[q].hh.rh := p;
+ mem[p + 1].int := q
+ end; { initbignode }
+{:232}
+ {233:}
+
+ function idtransform: halfword;
+ var
+ p, q, r: halfword;
+ begin
+ p := getnode(2);
+ mem[p].hh.b0 := 13;
+ mem[p].hh.b1 := 11;
+ mem[p + 1].int := -30000;
+ initbignode(p);
+ q := mem[p + 1].int;
+ r := q + 12;
+ repeat
+ r := r - 2;
+ mem[r].hh.b0 := 16;
+ mem[r + 1].int := 0
+ until r = q;
+ mem[q + 5].int := 65536;
+ mem[q + 11].int := 65536;
+ idtransform := p
+ end; {:233} {234:}
+
+ procedure newroot(x: halfword);
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ mem[p].hh.b0 := 0;
+ mem[p].hh.b1 := 0;
+ mem[p].hh.rh := x;
+ eqtb[x].rh := p
+ end; {:234}
+{235:}
+
+ procedure printvariablename(p: halfword);
+ label
+ 40, 10;
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ while mem[p].hh.b1 >= 5 do begin {237:}
+ case mem[p].hh.b1 of
+ 5:
+ printchar(120);
+ 6:
+ printchar(121);
+ 7:
+ print(376);
+ 8:
+ print(377);
+ 9:
+ print(378);
+ 10:
+ print(379);
+ 11:
+ begin
+ print(380);
+ printint(p + 30000);
+ goto 10
+ end
+ end;
+ print(381);
+ p := mem[p - (2 * (mem[p].hh.b1 - 5))].hh.rh
+ end {:237};
+ q := -30000;
+ while mem[p].hh.b1 > 1 do begin {236:}
+ if mem[p].hh.b1 = 3 then begin
+ r := newnumtok(mem[p + 2].int);
+ repeat
+ p := mem[p].hh.rh
+ until mem[p].hh.b1 = 4
+ end else if mem[p].hh.b1 = 2 then begin
+ p := mem[p].hh.rh;
+ goto 40
+ end else begin
+ if mem[p].hh.b1 <> 4 then
+ confusion(375);
+ r := getavail;
+ mem[r].hh.lh := mem[p + 2].hh.lh
+ end;
+ mem[r].hh.rh := q;
+ q := r;
+ 40:
+ p := mem[p + 2].hh.rh
+ end {:236};
+ r := getavail;
+ mem[r].hh.lh := mem[p].hh.rh;
+ mem[r].hh.rh := q;
+ if mem[p].hh.b1 = 1 then
+ print(374);
+ showtokenlist(r, -30000, 2147483647, tally);
+ flushtokenlist(r);
+ 10:
+ null
+ end; {:235}
+{238:}
+
+ function interesting(p: halfword): boolean;
+ var
+ t: smallnumber;
+ begin
+ if internal[3] > 0 then
+ interesting := true
+ else begin
+ t := mem[p].hh.b1;
+ if t >= 5 then
+ if t <> 11 then
+ t := mem[mem[p - (2 * (t - 5))].hh.rh].hh.b1;
+ interesting := t <> 11
+ end
+ end; {:238} {239:}
+
+ function newstructure(p: halfword): halfword;
+ var
+ q, r: halfword;
+ begin
+ if mem[p].hh.b1 in
+ [0, 3, 4] then
+ case mem[p].hh.b1 of
+ 0:
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(2);
+ eqtb[q].rh := r
+ end;
+ 3:
+ begin {240:}
+ q := p;
+ repeat
+ q := mem[q].hh.rh
+ until mem[q].hh.b1 = 4;
+ q := mem[q + 2].hh.rh;
+ r := q + 1;
+ repeat
+ q := r;
+ r := mem[r].hh.rh
+ until r = p;
+ r := getnode(3);
+ mem[q].hh.rh := r;
+ mem[r + 2].int := mem[p + 2].int
+ end; {:240}
+ 4:
+ begin {241:}
+ q := mem[p + 2].hh.rh;
+ r := mem[q + 1].hh.lh;
+ repeat
+ q := r;
+ r := mem[r].hh.rh
+ until r = p;
+ r := getnode(3);
+ mem[q].hh.rh := r;
+ mem[r + 2] := mem[p + 2];
+ if mem[p + 2].hh.lh = 0 then begin
+ q := mem[p + 2].hh.rh + 1;
+ while mem[q].hh.rh <> p do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := r
+ end
+ end
+ end
+ else {:241}
+ confusion(382);
+ mem[r].hh.rh := mem[p].hh.rh;
+ mem[r].hh.b0 := 21;
+ mem[r].hh.b1 := mem[p].hh.b1;
+ mem[r + 1].hh.lh := p;
+ mem[p].hh.b1 := 2;
+ q := getnode(3);
+ mem[p].hh.rh := q;
+ mem[r + 1].hh.rh := q;
+ mem[q + 2].hh.rh := r;
+ mem[q].hh.b0 := 0;
+ mem[q].hh.b1 := 4;
+ mem[q].hh.rh := -29983;
+ mem[q + 2].hh.lh := 0;
+ newstructure := r
+ end; {:239} {242:}
+
+ function findvariable(t: halfword): halfword;
+ label
+ 10;
+ var
+ p, q, r, s: halfword;
+ pp, qq, rr, ss: halfword;
+ n: integer;
+ saveword: memoryword;
+ begin
+ p := mem[t].hh.lh;
+ t := mem[t].hh.rh;
+ if (eqtb[p].lh mod 83) <> 41 then begin
+ findvariable := -30000;
+ goto 10
+ end;
+ if eqtb[p].rh = (-30000) then
+ newroot(p);
+ p := eqtb[p].rh;
+ pp := p;
+ while t <> (-30000) do begin {243:}
+ if mem[pp].hh.b0 <> 21 then begin
+ if mem[pp].hh.b0 > 21 then begin
+ findvariable := -30000;
+ goto 10
+ end;
+ ss := newstructure(pp);
+ if p = pp then
+ p := ss;
+ pp := ss
+ end;
+ if mem[p].hh.b0 <> 21 then
+ p := newstructure(p) {:243};
+ if t < himemmin then begin {244:}
+ n := mem[t + 1].int;
+ pp := mem[mem[pp + 1].hh.lh].hh.rh;
+ q := mem[mem[p + 1].hh.lh].hh.rh;
+ saveword := mem[q + 2];
+ mem[q + 2].int := 2147483647;
+ s := p + 1;
+ repeat
+ r := s;
+ s := mem[s].hh.rh
+ until n <= mem[s + 2].int;
+ if n = mem[s + 2].int then
+ p := s
+ else begin
+ p := getnode(3);
+ mem[r].hh.rh := p;
+ mem[p].hh.rh := s;
+ mem[p + 2].int := n;
+ mem[p].hh.b1 := 3;
+ mem[p].hh.b0 := 0
+ end;
+ mem[q + 2] := saveword
+ end else begin {:244} {245:}
+ n := mem[t].hh.lh;
+ ss := mem[pp + 1].hh.lh;
+ repeat
+ rr := ss;
+ ss := mem[ss].hh.rh
+ until n <= mem[ss + 2].hh.lh;
+ if n < mem[ss + 2].hh.lh then begin
+ qq := getnode(3);
+ mem[rr].hh.rh := qq;
+ mem[qq].hh.rh := ss;
+ mem[qq + 2].hh.lh := n;
+ mem[qq].hh.b1 := 4;
+ mem[qq].hh.b0 := 0;
+ mem[qq + 2].hh.rh := pp;
+ ss := qq
+ end;
+ if p = pp then begin
+ p := ss;
+ pp := ss
+ end else begin
+ pp := ss;
+ s := mem[p + 1].hh.lh;
+ repeat
+ r := s;
+ s := mem[s].hh.rh
+ until n <= mem[s + 2].hh.lh;
+ if n = mem[s + 2].hh.lh then
+ p := s
+ else begin
+ q := getnode(3);
+ mem[r].hh.rh := q;
+ mem[q].hh.rh := s;
+ mem[q + 2].hh.lh := n;
+ mem[q].hh.b1 := 4;
+ mem[q].hh.b0 := 0;
+ mem[q + 2].hh.rh := p;
+ p := q
+ end
+ end
+ end {:245};
+ t := mem[t].hh.rh
+ end;
+ if mem[pp].hh.b0 >= 21 then
+ if mem[pp].hh.b0 = 21 then
+ pp := mem[pp + 1].hh.lh
+ else begin
+ findvariable := -30000;
+ goto 10
+ end;
+ if mem[p].hh.b0 = 21 then
+ p := mem[p + 1].hh.lh;
+ if mem[p].hh.b0 = 0 then begin
+ if mem[pp].hh.b0 = 0 then begin
+ mem[pp].hh.b0 := 15;
+ mem[pp + 1].int := -30000
+ end;
+ mem[p].hh.b0 := mem[pp].hh.b0;
+ mem[p + 1].int := -30000
+ end;
+ findvariable := p;
+ 10:
+ null
+ end; {:242} {246:} {257:}
+
+ procedure printpath(h: halfword; s: strnumber; nuline: boolean);
+ label
+ 30, 31;
+ var
+ p, q: halfword;
+ begin
+ printdiagnostic(384, s, nuline);
+ println;
+ p := h;
+ repeat
+ q := mem[p].hh.rh;
+ if (p = (-30000)) or (q = (-30000)) then begin
+ printnl(131);
+ goto 30
+ end; {258:}
+ printtwo(mem[p + 1].int, mem[p + 2].int);
+ if mem[p].hh.b1 in
+ [0, 1, 4, 3, 2] then
+ case mem[p].hh.b1 of
+ 0:
+ begin
+ if mem[p].hh.b0 = 4 then
+ print(385);
+ if (mem[q].hh.b0 <> 0) or (q <> h) then
+ q := -30000;
+ goto 31
+ end;
+ 1:
+ begin {261:}
+ print(391);
+ printtwo(mem[p + 5].int, mem[p + 6].int);
+ print(390);
+ if mem[q].hh.b0 <> 1 then
+ print(392)
+ else
+ printtwo(mem[q + 3].int, mem[q + 4].int);
+ goto 31
+ end; {:261}
+ 4: {262:}
+ if (mem[p].hh.b0 <> 1) and (mem[p].hh.b0 <> 4) then
+ print(385) {:262};
+ 3, 2:
+ begin {263:}
+ if mem[p].hh.b0 = 4 then
+ print(392);
+ if mem[p].hh.b1 = 3 then begin
+ print(388);
+ printscaled(mem[p + 5].int)
+ end else begin
+ nsincos(mem[p + 5].int);
+ printchar(123);
+ printscaled(ncos);
+ printchar(44);
+ printscaled(nsin)
+ end;
+ printchar(125)
+ end
+ end
+ else {:263}
+ print(131);
+ if mem[q].hh.b0 <= 1 then
+ print(386)
+ else if (mem[p + 6].int <> 65536) or (mem[q + 4].int <> 65536) then begin {260:}
+ print(389);
+ if mem[p + 6].int < 0 then
+ print(332);
+ printscaled(abs(mem[p + 6].int));
+ if mem[p + 6].int <> mem[q + 4].int then begin
+ print(390);
+ if mem[q + 4].int < 0 then
+ print(332);
+ printscaled(abs(mem[q + 4].int))
+ end
+ end {:260};
+ 31: {:258}
+ null;
+ p := q;
+ if (p <> h) or (mem[h].hh.b0 <> 0) then begin {259:}
+ printnl(387);
+ if mem[p].hh.b0 = 2 then begin
+ nsincos(mem[p + 3].int);
+ printchar(123);
+ printscaled(ncos);
+ printchar(44);
+ printscaled(nsin);
+ printchar(125)
+ end else if mem[p].hh.b0 = 3 then begin
+ print(388);
+ printscaled(mem[p + 3].int);
+ printchar(125)
+ end
+ end {:259}
+ until p = h;
+ if mem[h].hh.b0 <> 0 then
+ print(256);
+ 30:
+ enddiagnostic(true)
+ end; {:257}
+{332:}
+ {333:}
+
+ procedure printweight(q: halfword; xoff: integer);
+ var
+ w, m: integer;
+ d: integer;
+ begin
+ d := mem[q].hh.lh + 32768;
+ w := d mod 8;
+ m := (d div 8) - mem[curedges + 3].hh.lh;
+ if fileoffset > (maxprintline - 9) then
+ printnl(32)
+ else
+ printchar(32);
+ printint(m + xoff);
+ while w > 4 do begin
+ printchar(43);
+ w := w - 1
+ end;
+ while w < 4 do begin
+ printchar(45);
+ w := w + 1
+ end
+ end; {:333}
+
+ procedure printedges(s: strnumber; nuline: boolean; xoff, yoff: integer);
+ var
+ p, q, r: halfword;
+ n: integer;
+ begin
+ printdiagnostic(399, s, nuline);
+ p := mem[curedges].hh.lh;
+ n := mem[curedges + 1].hh.rh - 4096;
+ while p <> curedges do begin
+ q := mem[p + 1].hh.lh;
+ r := mem[p + 1].hh.rh;
+ if (q > (-29999)) or (r <> 30000) then begin
+ printnl(400);
+ printint(n + yoff);
+ printchar(58);
+ while q > (-29999) do begin
+ printweight(q, xoff);
+ q := mem[q].hh.rh
+ end;
+ print(401);
+ while r <> 30000 do begin
+ printweight(r, xoff);
+ r := mem[r].hh.rh
+ end
+ end;
+ p := mem[p].hh.lh;
+ n := n - 1
+ end;
+ enddiagnostic(true)
+ end; {:332} {388:}
+
+ {---------------------------------------------------
+ procedure unskew(x, y: scaled; octant: smallnumber);
+
+ moved to mf2ps1.p
+ ---------------------------------------------------}
+
+ procedure printpen(p: halfword; s: strnumber; nuline: boolean);
+ var
+ nothingprinted: boolean;
+ k: 1..8;
+ h: halfword;
+ m, n: integer;
+ w, ww: halfword;
+ begin
+ printdiagnostic(436, s, nuline);
+ nothingprinted := true;
+ println;
+ for k := 1 to 8 do begin
+ octant := octantcode[k];
+ h := p + octant;
+ n := mem[h].hh.lh;
+ w := mem[h].hh.rh;
+ if not odd(k) then
+ w := mem[w].hh.lh;
+ for m := 1 to n + 1 do begin
+ if odd(k) then
+ ww := mem[w].hh.rh
+ else
+ ww := mem[w].hh.lh;
+ if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {474:}
+ if nothingprinted then
+ nothingprinted := false
+ else
+ printnl(438);
+ unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
+ printtwo(curx, cury)
+ end {:474};
+ w := ww
+ end
+ end;
+ if nothingprinted then begin
+ w := mem[p + 1].hh.rh;
+ printtwo(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int)
+ end;
+ printnl(437);
+ enddiagnostic(true)
+ end; {:473} {589:}
+
+ procedure printdependency(p: halfword; t: smallnumber);
+ label
+ 10;
+ var
+ v: integer;
+ pp, q: halfword;
+ begin
+ pp := p;
+ while true do begin
+ v := abs(mem[p + 1].int);
+ q := mem[p].hh.lh;
+ if q = (-30000) then begin
+ if (v <> 0) or (p = pp) then begin
+ if mem[p + 1].int > 0 then
+ if p <> pp then
+ printchar(43);
+ printscaled(mem[p + 1].int)
+ end;
+ goto 10
+ end;
+{590:}
+ if mem[p + 1].int < 0 then
+ printchar(45)
+ else if p <> pp then
+ printchar(43);
+ if t = 17 then
+ v := roundfraction(v);
+ if v <> 65536 then
+ printscaled(v) {:590};
+ if mem[q].hh.b0 <> 19 then
+ confusion(454);
+ printvariablename(q);
+ v := mem[q + 1].int mod 64;
+ while v > 0 do begin
+ print(455);
+ v := v - 2
+ end;
+ p := mem[p].hh.rh
+ end;
+ 10:
+ null
+ end; {:589} {801:} {805:}
+
+ procedure printdp(t: smallnumber; p: halfword; verbosity: smallnumber);
+ var
+ q: halfword;
+ begin
+ q := mem[p].hh.rh;
+ if (mem[q].hh.lh = (-30000)) or (verbosity > 0) then
+ printdependency(p, t)
+ else
+ print(628)
+ end; {:805} {799:}
+
+ function stashcurexp: halfword;
+ var
+ p: halfword;
+ begin
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ p := curexp
+ end
+ else
+ begin
+ p := getnode(2);
+ mem[p].hh.b1 := 11;
+ mem[p].hh.b0 := curtype;
+ mem[p + 1].int := curexp
+ end;
+ curtype := 1;
+ mem[p].hh.rh := -29999;
+ stashcurexp := p
+ end; {:799} {800:}
+
+ procedure unstashcurexp(p: halfword);
+ begin
+ curtype := mem[p].hh.b0;
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ curexp := p
+ end
+ else
+ begin
+ curexp := mem[p + 1].int;
+ freenode(p, 2)
+ end
+ end; {:800}
+
+ procedure printexp(p: halfword; verbosity: smallnumber);
+ var
+ restorecurexp: boolean;
+ t: smallnumber;
+ v: integer;
+ q: halfword;
+ begin
+ if p <> (-30000) then
+ restorecurexp := false
+ else begin
+ p := stashcurexp;
+ restorecurexp := true
+ end;
+ t := mem[p].hh.b0;
+ if t < 17 then
+ v := mem[p + 1].int
+ else if t < 19 then
+ v := mem[p + 1].hh.rh; {802:}
+ if t in
+ [1, 2, 3, 5, 7, 12, 10, 15,
+ 4, 6, 8, 9, 11, 13, 14, 16,
+ 17, 18, 19] then
+ case t of
+ 1:
+ print(194);
+ 2:
+ if v = 30 then
+ print(218)
+ else
+ print(219);
+ 3, 5, 7, 12, 10, 15:
+ begin {806:}
+ printtype(t);
+ if v <> (-30000) then begin
+ printchar(32);
+ while (mem[v].hh.b1 = 11) and (v <> p) do
+ v := mem[v + 1].int;
+ printvariablename(v)
+ end
+ end; {:806}
+ 4:
+ begin
+ printchar(34);
+ slowprint(v);
+ printchar(34)
+ end;
+ 6, 8, 9, 11: {804:}
+ if verbosity <= 1 then
+ printtype(t)
+ else begin
+ if selector = 3 then
+ if internal[13] <= 0 then begin
+ selector := 1;
+ printtype(t);
+ print(626);
+ selector := 3
+ end;
+ case t of
+ 6:
+ printpen(v, 155, false);
+ 8:
+ printpath(v, 627, false);
+ 9:
+ printpath(v, 155, false);
+ 11:
+ begin
+ curedges := v;
+ printedges(155, false, 0, 0)
+ end
+ end
+ end {:804};
+ 13, 14:
+ if v = (-30000) then
+ printtype(t) {803:}
+ else begin
+ printchar(40);
+ q := v + bignodesize[t];
+ repeat
+ if mem[v].hh.b0 = 16 then
+ printscaled(mem[v + 1].int)
+ else if mem[v].hh.b0 = 19 then
+ printvariablename(v)
+ else
+ printdp(mem[v].hh.b0, mem[v + 1].hh.rh, verbosity);
+ v := v + 2;
+ if v <> q then
+ printchar(44)
+ until v = q;
+ printchar(41)
+ end {:803};
+ 16:
+ printscaled(v);
+ 17, 18:
+ printdp(t, v, verbosity);
+ 19:
+ printvariablename(p)
+ end
+ else
+ confusion(625) {:802};
+ if restorecurexp then
+ unstashcurexp(p)
+ end; {:801} {807:}
+
+ procedure disperr(p: halfword; s: strnumber);
+ begin
+ if interaction = 3 then
+ null;
+ printnl(629);
+ printexp(p, 1);
+ if s <> 155 then begin
+ printnl(133);
+ print(s)
+ end
+ end; {:807} {594:}
+
+ function pplusfq(p: halfword; f: integer; q: halfword; t, tt: smallnumber): halfword;
+ label
+ 30;
+ var
+ pp, qq: halfword;
+ r, s: halfword;
+ threshold: integer;
+ v: integer;
+ begin
+ if t = 17 then
+ threshold := 2685
+ else
+ threshold := 8;
+ r := 29999;
+ pp := mem[p].hh.lh;
+ qq := mem[q].hh.lh;
+ while true do
+ if pp = qq then
+ if pp = (-30000) then
+ goto 30 {595:}
+ else begin
+ if tt = 17 then
+ v := mem[p + 1].int + takefraction(f, mem[q + 1].int)
+ else
+ v := mem[p + 1].int + takescaled(f, mem[q + 1].int);
+ mem[p + 1].int := v;
+ s := p;
+ p := mem[p].hh.rh;
+ if abs(v) < threshold then
+ freenode(s, 2)
+ else begin
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ pp := mem[p].hh.lh;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end {:595}
+ else if mem[pp + 1].int < mem[qq + 1].int then begin {596:}
+ if tt = 17 then
+ v := takefraction(f, mem[q + 1].int)
+ else
+ v := takescaled(f, mem[q + 1].int);
+ if abs(v) > (threshold div 2) then begin
+ s := getnode(2);
+ mem[s].hh.lh := qq;
+ mem[s + 1].int := v;
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end else begin {:596}
+ mem[r].hh.rh := p;
+ r := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh
+ end;
+ 30:
+ if t = 17 then
+ mem[p + 1].int := slowadd(mem[p + 1].int, takefraction(mem[q + 1].int, f))
+ else
+ mem[p + 1].int := slowadd(mem[p + 1].int, takescaled(mem[q + 1].int, f));
+ mem[r].hh.rh := p;
+ depfinal := p;
+ pplusfq := mem[29999].hh.rh
+ end; {:594}
+{600:}
+
+ function poverv(p: halfword; v: scaled; t0, t1: smallnumber): halfword;
+ var
+ r, s: halfword;
+ w: integer;
+ threshold: integer;
+ scalingdown: boolean;
+ begin
+ if t0 <> t1 then
+ scalingdown := true
+ else
+ scalingdown := false;
+ if t1 = 17 then
+ threshold := 1342
+ else
+ threshold := 4;
+ r := 29999;
+ while mem[p].hh.lh <> (-30000) do begin
+ if scalingdown then
+ if abs(v) < 524288 then
+ w := makescaled(mem[p + 1].int, v * 4096)
+ else
+ w := makescaled(roundfraction(mem[p + 1].int), v)
+ else
+ w := makescaled(mem[p + 1].int, v);
+ if abs(w) <= threshold then begin
+ s := mem[p].hh.rh;
+ freenode(p, 2);
+ p := s
+ end else begin
+ if abs(w) >= 626349397 then begin
+ fixneeded := true;
+ mem[mem[p].hh.lh].hh.b0 := 0
+ end;
+ mem[r].hh.rh := p;
+ r := p;
+ mem[p + 1].int := w;
+ p := mem[p].hh.rh
+ end
+ end;
+ mem[r].hh.rh := p;
+ mem[p + 1].int := makescaled(mem[p + 1].int, v);
+ poverv := mem[29999].hh.rh
+ end; { poverv }
+{:600}
+ {602:}
+
+ procedure valtoobig(x: scaled);
+ begin
+ if internal[40] > 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(456)
+ end;
+ printscaled(x);
+ printchar(41);
+ begin
+ helpptr := 4;
+ helpline[3] := 457;
+ helpline[2] := 458;
+ helpline[1] := 459;
+ helpline[0] := 460
+ end;
+ error
+ end
+ end; {:602} {603:}
+
+ procedure makeknown(p, q: halfword);
+ var
+ t: 17..18;
+ begin
+ mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ t := mem[p].hh.b0;
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := mem[q + 1].int;
+ freenode(q, 2);
+ if abs(mem[p + 1].int) >= 268435456 then
+ valtoobig(mem[p + 1].int);
+ if internal[2] > 0 then
+ if interesting(p) then begin
+ begindiagnostic;
+ printnl(461);
+ printvariablename(p);
+ printchar(61);
+ printscaled(mem[p + 1].int);
+ enddiagnostic(false)
+ end;
+ if curexp = p then
+ if curtype = t then begin
+ curtype := 16;
+ curexp := mem[p + 1].int;
+ freenode(p, 2)
+ end
+ end; {:603} {604:}
+
+ procedure fixdependencies;
+ label
+ 30;
+ var
+ p, q, r, s, t: halfword;
+ x: halfword;
+ begin
+ r := mem[-29987].hh.rh;
+ s := -30000;
+ while r <> (-29987) do begin
+ t := r;
+{605:}
+ r := t + 1;
+ while true do begin
+ q := mem[r].hh.rh;
+ x := mem[q].hh.lh;
+ if x = (-30000) then
+ goto 30;
+ if mem[x].hh.b0 <= 1 then begin
+ if mem[x].hh.b0 < 1 then begin
+ p := getavail;
+ mem[p].hh.rh := s;
+ s := p;
+ mem[s].hh.lh := x;
+ mem[x].hh.b0 := 1
+ end;
+ mem[q + 1].int := mem[q + 1].int div 4;
+ if mem[q + 1].int = 0 then begin
+ mem[r].hh.rh := mem[q].hh.rh;
+ freenode(q, 2);
+ q := r
+ end
+ end;
+ r := q
+ end;
+ 30: {:605}
+ null;
+ r := mem[q].hh.rh;
+ if q = mem[t + 1].hh.rh then
+ makeknown(t, q)
+ end;
+ while s <> (-30000) do begin
+ p := mem[s].hh.rh;
+ x := mem[s].hh.lh;
+ begin
+ mem[s].hh.rh := avail;
+ avail := s
+ end {dynused:=dynused-1;};
+ s := p;
+ mem[x].hh.b0 := 19;
+ mem[x + 1].int := mem[x + 1].int + 2
+ end;
+ fixneeded := false
+ end; { fixdependencies }
+{:604}
+ {268:}
+
+ procedure tossknotlist(p: halfword);
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := p;
+ repeat
+ r := mem[q].hh.rh;
+ freenode(q, 7);
+ q := r
+ until q = p
+ end; {:268} {385:}
+
+ procedure tossedges(h: halfword);
+ var
+ p, q: halfword;
+ begin
+ q := mem[h].hh.rh;
+ while q <> h do begin
+ flushlist(mem[q + 1].hh.rh);
+ if mem[q + 1].hh.lh > (-29999) then
+ flushlist(mem[q + 1].hh.lh);
+ p := q;
+ q := mem[q].hh.rh;
+ freenode(p, 2)
+ end;
+ freenode(h, 6)
+ end; {:385} {487:}
+
+ procedure tosspen(p: halfword);
+ var
+ k: 1..8;
+ w, ww: halfword;
+ begin
+ if p <> (-29997) then begin
+ for k := 1 to 8 do begin
+ w := mem[p + k].hh.rh;
+ repeat
+ ww := mem[w].hh.rh;
+ freenode(w, 3);
+ w := ww
+ until w = mem[p + k].hh.rh
+ end;
+ freenode(p, 10)
+ end
+ end; {:487} {620:}
+
+ procedure ringdelete(p: halfword);
+ var
+ q: halfword;
+ begin
+ q := mem[p + 1].int;
+ if q <> (-30000) then
+ if q <> p then begin
+ while mem[q + 1].int <> p do
+ q := mem[q + 1].int;
+ mem[q + 1].int := mem[p + 1].int
+ end
+ end; {:620} {809:}
+
+ procedure recyclevalue(p: halfword);
+ label
+ 30;
+ var
+ t: smallnumber;
+ v: integer;
+ vv: integer;
+ q, r, s, pp: halfword;
+ begin
+ t := mem[p].hh.b0;
+ if t < 17 then
+ v := mem[p + 1].int;
+ case t of
+ 0, 1, 2, 16, 15:
+ null;
+ 3, 5, 7, 12, 10:
+ ringdelete(p);
+ 4:
+ begin
+ if strref[v] < 127 then
+ if strref[v] > 1 then
+ strref[v] := strref[v] - 1
+ else
+ flushstring(v)
+ end;
+ 6:
+ if mem[v].hh.lh = (-30000) then
+ tosspen(v)
+ else
+ mem[v].hh.lh := mem[v].hh.lh - 1;
+ 9, 8:
+ tossknotlist(v);
+ 11:
+ tossedges(v);
+ 14, 13: {810:}
+ if v <> (-30000) then begin
+ q := v + bignodesize[t];
+ repeat
+ q := q - 2;
+ recyclevalue(q)
+ until q = v;
+ freenode(v, bignodesize[t])
+ end {:810};
+ 17, 18:
+ begin {811:}
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.lh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[q].hh.rh := -30000;
+ flushnodelist(mem[p + 1].hh.rh)
+ end; {:811}
+ 19:
+ begin {812:}
+ maxc[17] := 0;
+ maxc[18] := 0;
+ maxlink[17] := -30000;
+ maxlink[18] := -30000;
+ q := mem[-29987].hh.rh;
+ while q <> (-29987) do begin
+ s := q + 1;
+ while true do begin
+ r := mem[s].hh.rh;
+ if mem[r].hh.lh = (-30000) then
+ goto 30;
+ if mem[r].hh.lh <> p then
+ s := r
+ else begin
+ t := mem[q].hh.b0;
+ mem[s].hh.rh := mem[r].hh.rh;
+ mem[r].hh.lh := q;
+ if abs(mem[r + 1].int) > maxc[t] then begin {814:}
+ if maxc[t] > 0 then begin
+ mem[maxptr[t]].hh.rh := maxlink[t];
+ maxlink[t] := maxptr[t]
+ end;
+ maxc[t] := abs(mem[r + 1].int);
+ maxptr[t] := r
+ end else begin {:814}
+ mem[r].hh.rh := maxlink[t];
+ maxlink[t] := r
+ end
+ end
+ end;
+ 30:
+ q := mem[r].hh.rh
+ end;
+ if (maxc[17] > 0) or (maxc[18] > 0) then begin {815:}
+ if (maxc[17] >= 268435456) or ((maxc[17] div 4096) >= maxc[18]) then
+ t := 17
+ else
+ t := 18; {816:}
+ s := maxptr[t];
+ pp := mem[s].hh.lh;
+ v := mem[s + 1].int;
+ if t = 17 then
+ mem[s + 1].int := -268435456
+ else
+ mem[s + 1].int := -65536;
+ r := mem[pp + 1].hh.rh;
+ mem[s].hh.rh := r;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ q := mem[r].hh.rh;
+ mem[r].hh.rh := -30000;
+ mem[q + 1].hh.lh := mem[pp + 1].hh.lh;
+ mem[mem[pp + 1].hh.lh].hh.rh := q;
+ begin
+ mem[pp].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[pp + 1].int := serialno
+ end;
+ if curexp = pp then
+ if curtype = t then
+ curtype := 19;
+ if internal[2] > 0 then {817:}
+ if interesting(p) then begin
+ begindiagnostic;
+ printnl(631);
+ if v > 0 then
+ printchar(45);
+ if t = 17 then
+ vv := roundfraction(maxc[17])
+ else
+ vv := maxc[18];
+ if vv <> 65536 then
+ printscaled(vv);
+ printvariablename(p);
+ while (mem[p + 1].int mod 64) > 0 do begin
+ print(455);
+ mem[p + 1].int := mem[p + 1].int - 2
+ end;
+ if t = 17 then
+ printchar(61)
+ else
+ print(632);
+ printdependency(s, t);
+ enddiagnostic(false)
+ end {:817} {:816};
+ t := 35 - t;
+ if maxc[t] > 0 then begin
+ mem[maxptr[t]].hh.rh := maxlink[t];
+ maxlink[t] := maxptr[t]
+ end;
+ if t <> 17 then {818:}
+ for t := 17 to 18 do begin
+ r := maxlink[t];
+ while r <> (-30000) do begin
+ q := mem[r].hh.lh;
+ mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makefraction(mem[r + 1].int, -v), s, t, 17);
+ if mem[q + 1].hh.rh = depfinal then
+ makeknown(q, depfinal);
+ q := r;
+ r := mem[r].hh.rh;
+ freenode(q, 2)
+ end
+ end {:818} {819:}
+ else
+ for t := 17 to 18 do begin
+ r := maxlink[t];
+ while r <> (-30000) do begin
+ q := mem[r].hh.lh;
+ if t = 17 then begin
+ if curexp = q then
+ if curtype = 17 then
+ curtype := 18;
+ mem[q + 1].hh.rh := poverv(mem[q + 1].hh.rh, 65536, 17, 18);
+ mem[q].hh.b0 := 18;
+ mem[r + 1].int := roundfraction(mem[r + 1].int)
+ end;
+ mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makescaled(mem[r + 1].int, -v), s, 18, 18);
+ if mem[q + 1].hh.rh = depfinal then
+ makeknown(q, depfinal);
+ q := r;
+ r := mem[r].hh.rh;
+ freenode(q, 2)
+ end
+ end {:819};
+ flushnodelist(s);
+ if fixneeded then
+ fixdependencies;
+ begin
+ if aritherror then
+ cleararith
+ end
+ end {:815}
+ end; {:812}
+ 20, 21:
+ confusion(630);
+ 22, 23:
+ deletemacref(mem[p + 1].int)
+ end;
+ mem[p].hh.b0 := 0
+ end; {:809} {808:}
+
+ procedure flushcurexp(v: scaled);
+ begin
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19, 6, 4, 8, 9, 11] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ begin
+ recyclevalue(curexp);
+ freenode(curexp, 2)
+ end;
+ 6:
+ if mem[curexp].hh.lh = (-30000) then
+ tosspen(curexp)
+ else
+ mem[curexp].hh.lh := mem[curexp].hh.lh - 1;
+ 4:
+ begin
+ if strref[curexp] < 127 then
+ if strref[curexp] > 1 then
+ strref[curexp] := strref[curexp] - 1
+ else
+ flushstring(curexp)
+ end;
+ 8, 9:
+ tossknotlist(curexp);
+ 11:
+ tossedges(curexp)
+ end
+ else
+ null;
+ curtype := 16;
+ curexp := v
+ end; {:808} {820:}
+
+ procedure flusherror(v: scaled);
+ begin
+ error;
+ flushcurexp(v)
+ end;
+
+ procedure backerror;
+ forward;
+
+ procedure getxnext;
+ forward;
+
+ procedure putgeterror;
+ begin
+ backerror;
+ getxnext
+ end; { putgeterror }
+
+ procedure putgetflusherror(v: scaled);
+ begin
+ putgeterror;
+ flushcurexp(v)
+ end; {:820} {247:}
+
+ procedure flushbelowvariable(p: halfword);
+ var
+ q, r: halfword;
+ begin
+ if mem[p].hh.b0 <> 21 then
+ recyclevalue(p)
+ else begin
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ flushbelowvariable(q);
+ r := q;
+ q := mem[q].hh.rh;
+ freenode(r, 3)
+ end;
+ r := mem[p + 1].hh.lh;
+ q := mem[r].hh.rh;
+ recyclevalue(r);
+ if mem[p].hh.b1 <= 1 then
+ freenode(r, 2)
+ else
+ freenode(r, 3);
+ repeat
+ flushbelowvariable(q);
+ r := q;
+ q := mem[q].hh.rh;
+ freenode(r, 3)
+ until q = (-29983);
+ mem[p].hh.b0 := 0
+ end
+ end; {:247}
+
+ procedure flushvariable(p, t: halfword; discardsuffixes: boolean);
+ label
+ 10;
+ var
+ q, r: halfword;
+ n: halfword;
+ begin
+ while t <> (-30000) do begin
+ if mem[p].hh.b0 <> 21 then
+ goto 10;
+ n := mem[t].hh.lh;
+ t := mem[t].hh.rh;
+ if n = 0 then begin
+ r := p + 1;
+ q := mem[r].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ flushvariable(q, t, discardsuffixes);
+ if t = (-30000) then
+ if mem[q].hh.b0 = 21 then
+ r := q
+ else begin
+ mem[r].hh.rh := mem[q].hh.rh;
+ freenode(q, 3)
+ end
+ else
+ r := q;
+ q := mem[r].hh.rh
+ end
+ end;
+ p := mem[p + 1].hh.lh;
+ repeat
+ r := p;
+ p := mem[p].hh.rh
+ until mem[p + 2].hh.lh >= n;
+ if mem[p + 2].hh.lh <> n then
+ goto 10
+ end;
+ if discardsuffixes then
+ flushbelowvariable(p)
+ else begin
+ if mem[p].hh.b0 = 21 then
+ p := mem[p + 1].hh.lh;
+ recyclevalue(p)
+ end;
+ 10:
+ null
+ end; {:246} {248:}
+
+ function undtype(p: halfword): smallnumber;
+ begin
+ case mem[p].hh.b0 of
+ 0, 1:
+ undtype := 0;
+ 2, 3:
+ undtype := 3;
+ 4, 5:
+ undtype := 5;
+ 6, 7, 8:
+ undtype := 7;
+ 9, 10:
+ undtype := 10;
+ 11, 12:
+ undtype := 12;
+ 13, 14, 15:
+ undtype := mem[p].hh.b0;
+ 16, 17, 18, 19:
+ undtype := 15
+ end
+ end; {:248}
+{249:}
+
+ procedure clearsymbol(p: halfword; saving: boolean);
+ var
+ q: halfword;
+ begin
+ q := eqtb[p].rh;
+ if eqtb[p].lh mod 83 in
+ [10, 53, 44, 49, 41] then
+ case eqtb[p].lh mod 83 of
+ 10, 53, 44, 49:
+ if not saving then
+ deletemacref(q);
+ 41:
+ if q <> (-30000) then
+ if saving then
+ mem[q].hh.b1 := 1
+ else begin
+ flushbelowvariable(q);
+ freenode(q, 2)
+ end
+ end
+ else
+ null;
+ eqtb[p] := eqtb[2241]
+ end; {:249} {252:}
+
+ procedure savevariable(q: halfword);
+ var
+ p: halfword;
+ begin
+ if saveptr <> (-30000) then begin
+ p := getnode(2);
+ mem[p].hh.lh := q;
+ mem[p].hh.rh := saveptr;
+ mem[p + 1].hh := eqtb[q];
+ saveptr := p
+ end;
+ clearsymbol(q, saveptr <> (-30000))
+ end; {:252} {253:}
+
+ procedure saveinternal(q: halfword);
+ var
+ p: halfword;
+ begin
+ if saveptr <> (-30000) then begin
+ p := getnode(2);
+ mem[p].hh.lh := 2241 + q;
+ mem[p].hh.rh := saveptr;
+ mem[p + 1].int := internal[q];
+ saveptr := p
+ end
+ end; { saveinternal }
+{:253}
+ {254:}
+
+ procedure unsave;
+ var
+ q: halfword;
+ p: halfword;
+ begin
+ while mem[saveptr].hh.lh <> 0 do begin
+ q := mem[saveptr].hh.lh;
+ if q > 2241 then begin
+ if internal[8] > 0 then begin
+ begindiagnostic;
+ printnl(383);
+ print(intname[q - 2241]);
+ printchar(61);
+ printscaled(mem[saveptr + 1].int);
+ printchar(125);
+ enddiagnostic(false)
+ end;
+ internal[q - 2241] := mem[saveptr + 1].int
+ end else begin
+ if internal[8] > 0 then begin
+ begindiagnostic;
+ printnl(383);
+ print(hash[q].rh);
+ printchar(125);
+ enddiagnostic(false)
+ end;
+ clearsymbol(q, false);
+ eqtb[q] := mem[saveptr + 1].hh;
+ if (eqtb[q].lh mod 83) = 41 then begin
+ p := eqtb[q].rh;
+ if p <> (-30000) then
+ mem[p].hh.b1 := 0
+ end
+ end;
+ p := mem[saveptr].hh.rh;
+ freenode(saveptr, 2);
+ saveptr := p
+ end;
+ p := mem[saveptr].hh.rh;
+ begin
+ mem[saveptr].hh.rh := avail;
+ avail := saveptr
+ end {dynused:=dynused-1;};
+ saveptr := p
+ end; {:254} {264:}
+
+ function copyknot(p: halfword): halfword;
+ var
+ q: halfword;
+ k: 0..6;
+ begin
+ q := getnode(7);
+ for k := 0 to 6 do
+ mem[q + k] := mem[p + k];
+ copyknot := q
+ end; {:264} {265:}
+
+ function copypath(p: halfword): halfword;
+ label
+ 10;
+ var
+ q, pp, qq: halfword;
+ begin
+ q := getnode(7);
+ qq := q;
+ pp := p;
+ while true do begin
+ mem[qq].hh.b0 := mem[pp].hh.b0;
+ mem[qq].hh.b1 := mem[pp].hh.b1;
+ mem[qq + 1].int := mem[pp + 1].int;
+ mem[qq + 2].int := mem[pp + 2].int;
+ mem[qq + 3].int := mem[pp + 3].int;
+ mem[qq + 4].int := mem[pp + 4].int;
+ mem[qq + 5].int := mem[pp + 5].int;
+ mem[qq + 6].int := mem[pp + 6].int;
+ if mem[pp].hh.rh = p then begin
+ mem[qq].hh.rh := q;
+ copypath := q;
+ goto 10
+ end;
+ mem[qq].hh.rh := getnode(7);
+ qq := mem[qq].hh.rh;
+ pp := mem[pp].hh.rh
+ end;
+ 10:
+ null
+ end; {:265} {266:}
+
+ function htapypoc(p: halfword): halfword;
+ label
+ 10;
+ var
+ q, pp, qq, rr: halfword;
+ begin
+ q := getnode(7);
+ qq := q;
+ pp := p;
+ while true do begin
+ mem[qq].hh.b1 := mem[pp].hh.b0;
+ mem[qq].hh.b0 := mem[pp].hh.b1;
+ mem[qq + 1].int := mem[pp + 1].int;
+ mem[qq + 2].int := mem[pp + 2].int;
+ mem[qq + 5].int := mem[pp + 3].int;
+ mem[qq + 6].int := mem[pp + 4].int;
+ mem[qq + 3].int := mem[pp + 5].int;
+ mem[qq + 4].int := mem[pp + 6].int;
+ if mem[pp].hh.rh = p then begin
+ mem[q].hh.rh := qq;
+ pathtail := pp;
+ htapypoc := q;
+ goto 10
+ end;
+ rr := getnode(7);
+ mem[rr].hh.rh := qq;
+ qq := rr;
+ pp := mem[pp].hh.rh
+ end;
+ 10:
+ null
+ end; {:266} {269:} {284:} {296:}
+
+ function curlratio(gamma, atension, btension: scaled): fraction;
+ var
+ alpha, beta, num, denom, ff: fraction;
+ begin
+ alpha := makefraction(65536, atension);
+ beta := makefraction(65536, btension);
+ if alpha <= beta then begin
+ ff := makefraction(alpha, beta);
+ ff := takefraction(ff, ff);
+ gamma := takefraction(gamma, ff);
+ beta := beta div 4096;
+ denom := (takefraction(gamma, alpha) + 196608) - beta;
+ num := takefraction(gamma, 805306368 - alpha) + beta
+ end else begin
+ ff := makefraction(beta, alpha);
+ ff := takefraction(ff, ff);
+ beta := takefraction(beta, ff) div 4096;
+ denom := (takefraction(gamma, alpha) + (ff div 1365)) - beta;
+ num := takefraction(gamma, 805306368 - alpha) + beta
+ end;
+ if num >= (((denom + denom) + denom) + denom) then
+ curlratio := 1073741824
+ else
+ curlratio := makefraction(num, denom)
+ end; {:296} {299:}
+
+ procedure setcontrols(p, q: halfword; k: integer);
+ var
+ rr, ss: fraction;
+ lt, rt: scaled;
+ sine: fraction;
+ begin
+ lt := abs(mem[q + 4].int);
+ rt := abs(mem[p + 6].int);
+ rr := velocity(st, ct, sf, cf, rt);
+ ss := velocity(sf, cf, st, ct, lt);
+ if (mem[p + 6].int < 0) or (mem[q + 4].int < 0) then {300:}
+ if ((st >= 0) and (sf >= 0)) or ((st <= 0) and (sf <= 0)) then begin
+ sine := takefraction(abs(st), cf) + takefraction(abs(sf), ct);
+ if sine > 0 then begin
+ sine := takefraction(sine, 268500992);
+ if mem[p + 6].int < 0 then
+ if abvscd(abs(sf), 268435456, rr, sine) < 0 then
+ rr := makefraction(abs(sf), sine);
+ if mem[q + 4].int < 0 then
+ if abvscd(abs(st), 268435456, ss, sine) < 0 then
+ ss := makefraction(abs(st), sine)
+ end
+ end {:300};
+ mem[p + 5].int := mem[p + 1].int + takefraction(takefraction(deltax[k], ct) - takefraction(deltay[k], st), rr);
+ mem[p + 6].int := mem[p + 2].int + takefraction(takefraction(deltay[k], ct) + takefraction(deltax[k], st), rr);
+ mem[q + 3].int := mem[q + 1].int - takefraction(takefraction(deltax[k], cf) + takefraction(deltay[k], sf), ss);
+ mem[q + 4].int := mem[q + 2].int - takefraction(takefraction(deltay[k], cf) - takefraction(deltax[k], sf), ss);
+ mem[p].hh.b1 := 1;
+ mem[q].hh.b0 := 1
+ end; { setcontrols }
+{:299}
+
+ procedure solvechoices(p, q: halfword; n: halfword);
+ label
+ 40, 10;
+ var
+ k: 0..pathsize;
+ r, s, t: halfword;
+ sine, cosine: fraction; {286:}
+ aa, bb, cc, ff, acc: fraction;
+ dd, ee: scaled;
+ lt, rt: scaled; {:286}
+ begin
+ k := 0;
+ s := p;
+ while true do begin
+ t := mem[s].hh.rh;
+ if k = 0 then {285:}
+ case mem[s].hh.b1 of
+ 2:
+ if mem[t].hh.b0 = 2 then begin {301:}
+ aa := narg(deltax[0], deltay[0]);
+ nsincos(mem[p + 5].int - aa);
+ ct := ncos;
+ st := nsin;
+ nsincos(mem[q + 3].int - aa);
+ cf := ncos;
+ sf := -nsin;
+ setcontrols(p, q, 0);
+ goto 10
+ end else begin {:301} {293:}
+ vv[0] := mem[s + 5].int - narg(deltax[0], deltay[0]);
+ if abs(vv[0]) > 188743680 then
+ if vv[0] > 0 then
+ vv[0] := vv[0] - 377487360
+ else
+ vv[0] := vv[0] + 377487360;
+ uu[0] := 0;
+ ww[0] := 0
+ end {:293};
+ 3:
+ if mem[t].hh.b0 = 3 then begin {302:}
+ mem[p].hh.b1 := 1;
+ mem[q].hh.b0 := 1;
+ lt := abs(mem[q + 4].int);
+ rt := abs(mem[p + 6].int);
+ if rt = 65536 then begin
+ if deltax[0] >= 0 then
+ mem[p + 5].int := mem[p + 1].int + ((deltax[0] + 1) div 3)
+ else
+ mem[p + 5].int := mem[p + 1].int + ((deltax[0] - 1) div 3);
+ if deltay[0] >= 0 then
+ mem[p + 6].int := mem[p + 2].int + ((deltay[0] + 1) div 3)
+ else
+ mem[p + 6].int := mem[p + 2].int + ((deltay[0] - 1) div 3)
+ end else begin
+ ff := makefraction(65536, 3 * rt);
+ mem[p + 5].int := mem[p + 1].int + takefraction(deltax[0], ff);
+ mem[p + 6].int := mem[p + 2].int + takefraction(deltay[0], ff)
+ end;
+ if lt = 65536 then begin
+ if deltax[0] >= 0 then
+ mem[q + 3].int := mem[q + 1].int - ((deltax[0] + 1) div 3)
+ else
+ mem[q + 3].int := mem[q + 1].int - ((deltax[0] - 1) div 3);
+ if deltay[0] >= 0 then
+ mem[q + 4].int := mem[q + 2].int - ((deltay[0] + 1) div 3)
+ else
+ mem[q + 4].int := mem[q + 2].int - ((deltay[0] - 1) div 3)
+ end else begin
+ ff := makefraction(65536, 3 * lt);
+ mem[q + 3].int := mem[q + 1].int - takefraction(deltax[0], ff);
+ mem[q + 4].int := mem[q + 2].int - takefraction(deltay[0], ff)
+ end;
+ goto 10
+ end else begin {:302} {294:}
+ cc := mem[s + 5].int;
+ lt := abs(mem[t + 4].int);
+ rt := abs(mem[s + 6].int);
+ if (rt = 65536) and (lt = 65536) then
+ uu[0] := makefraction((cc + cc) + 65536, cc + 131072)
+ else
+ uu[0] := curlratio(cc, rt, lt);
+ vv[0] := -takefraction(psi[1], uu[0]);
+ ww[0] := 0
+ end {:294};
+ 4:
+ begin
+ uu[0] := 0;
+ vv[0] := 0;
+ ww[0] := 268435456
+ end
+ end {:285}
+ else
+ case mem[s].hh.b0 of
+ 5, 4:
+ begin {287:} {288:}
+ if abs(mem[r + 6].int) = 65536 then begin
+ aa := 134217728;
+ dd := 2 * delta[k]
+ end else begin
+ aa := makefraction(65536, (3 * abs(mem[r + 6].int)) - 65536);
+ dd := takefraction(delta[k], 805306368 - makefraction(65536, abs(mem[r + 6].int)))
+ end;
+ if abs(mem[t + 4].int) = 65536 then begin
+ bb := 134217728;
+ ee := 2 * delta[k - 1]
+ end else begin
+ bb := makefraction(65536, (3 * abs(mem[t + 4].int)) - 65536);
+ ee := takefraction(delta[k - 1], 805306368 - makefraction(65536, abs(mem[t + 4].int)))
+ end;
+ cc := 268435456 - takefraction(uu[k - 1], aa) {:288}; {289:}
+ dd := takefraction(dd, cc);
+ lt := abs(mem[s + 4].int);
+ rt := abs(mem[s + 6].int);
+ if lt <> rt then
+ if lt < rt then begin
+ ff := makefraction(lt, rt);
+ ff := takefraction(ff, ff);
+ dd := takefraction(dd, ff)
+ end else begin
+ ff := makefraction(rt, lt);
+ ff := takefraction(ff, ff);
+ ee := takefraction(ee, ff)
+ end;
+ ff := makefraction(ee, ee + dd) {:289};
+ uu[k] := takefraction(ff, bb); {290:}
+ acc := -takefraction(psi[k + 1], uu[k]);
+ if mem[r].hh.b1 = 3 then begin
+ ww[k] := 0;
+ vv[k] := acc - takefraction(psi[1], 268435456 - ff)
+ end else begin
+ ff := makefraction(268435456 - ff, cc);
+ acc := acc - takefraction(psi[k], ff);
+ ff := takefraction(ff, aa);
+ vv[k] := acc - takefraction(vv[k - 1], ff);
+ if ww[k - 1] = 0 then
+ ww[k] := 0
+ else
+ ww[k] := -takefraction(ww[k - 1], ff)
+ end {:290};
+ if mem[s].hh.b0 = 5 then begin {291:}
+ aa := 0;
+ bb := 268435456;
+ repeat
+ k := k - 1;
+ if k = 0 then
+ k := n;
+ aa := vv[k] - takefraction(aa, uu[k]);
+ bb := ww[k] - takefraction(bb, uu[k])
+ until k = n;
+ aa := makefraction(aa, 268435456 - bb);
+ theta[n] := aa;
+ vv[0] := aa;
+ for k := 1 to n - 1 do
+ vv[k] := vv[k] + takefraction(aa, ww[k]);
+ goto 40
+ end {:291}
+ end; {:287}
+ 3:
+ begin {295:}
+ cc := mem[s + 3].int;
+ lt := abs(mem[s + 4].int);
+ rt := abs(mem[r + 6].int);
+ if (rt = 65536) and (lt = 65536) then
+ ff := makefraction((cc + cc) + 65536, cc + 131072)
+ else
+ ff := curlratio(cc, lt, rt);
+ theta[n] := -makefraction(takefraction(vv[n - 1], ff), 268435456 - takefraction(ff, uu[n - 1]));
+ goto 40
+ end; {:295}
+ 2:
+ begin {292:}
+ theta[n] := mem[s + 3].int - narg(deltax[n - 1], deltay[n - 1]);
+ if abs(theta[n]) > 188743680 then
+ if theta[n] > 0 then
+ theta[n] := theta[n] - 377487360
+ else
+ theta[n] := theta[n] + 377487360;
+ goto 40
+ end
+ end {:292};
+ r := s;
+ s := t;
+ k := k + 1
+ end;
+ 40: {297:}
+ for k := n - 1 downto 0 do
+ theta[k] := vv[k] - takefraction(theta[k + 1], uu[k]);
+ s := p;
+ k := 0;
+ repeat
+ t := mem[s].hh.rh;
+ nsincos(theta[k]);
+ st := nsin;
+ ct := ncos;
+ nsincos((-psi[k + 1]) - theta[k + 1]);
+ sf := nsin;
+ cf := ncos;
+ setcontrols(s, t, k);
+ k := k + 1;
+ s := t
+ until k = n {:297};
+ 10:
+ null
+ end; {:284}
+
+ procedure makechoices(knots: halfword);
+ label
+ 30;
+ var
+ h: halfword;
+ p, q: halfword; {280:}
+ k, n: 0..pathsize;
+ r, s, t: halfword;
+ delx, dely: scaled;
+ sine, cosine: fraction; {:280}
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[4] > 0 then
+ printpath(knots, 393, true); {271:}
+ p := knots;
+ repeat
+ q := mem[p].hh.rh;
+ if mem[p + 1].int = mem[q + 1].int then
+ if mem[p + 2].int = mem[q + 2].int then
+ if mem[p].hh.b1 > 1 then begin
+ mem[p].hh.b1 := 1;
+ if mem[p].hh.b0 = 4 then begin
+ mem[p].hh.b0 := 3;
+ mem[p + 3].int := 65536
+ end;
+ mem[q].hh.b0 := 1;
+ if mem[q].hh.b1 = 4 then begin
+ mem[q].hh.b1 := 3;
+ mem[q + 5].int := 65536
+ end;
+ mem[p + 5].int := mem[p + 1].int;
+ mem[q + 3].int := mem[p + 1].int;
+ mem[p + 6].int := mem[p + 2].int;
+ mem[q + 4].int := mem[p + 2].int
+ end;
+ p := q
+ until p = knots {:271}; {272:}
+ h := knots;
+ while true do begin
+ if mem[h].hh.b0 <> 4 then
+ goto 30;
+ if mem[h].hh.b1 <> 4 then
+ goto 30;
+ h := mem[h].hh.rh;
+ if h = knots then begin
+ mem[h].hh.b0 := 5;
+ goto 30
+ end
+ end;
+ 30: {:272}
+ null;
+ p := h; {273:}
+ repeat
+ q := mem[p].hh.rh;
+ if mem[p].hh.b1 >= 2 then begin
+ while (mem[q].hh.b0 = 4) and (mem[q].hh.b1 = 4) do
+ q := mem[q].hh.rh; {278:} {281:}
+ k := 0;
+ s := p;
+ n := pathsize;
+ repeat
+ t := mem[s].hh.rh;
+ deltax[k] := mem[t + 1].int - mem[s + 1].int;
+ deltay[k] := mem[t + 2].int - mem[s + 2].int;
+ delta[k] := pythadd(deltax[k], deltay[k]);
+ if k > 0 then begin
+ sine := makefraction(deltay[k - 1], delta[k - 1]);
+ cosine := makefraction(deltax[k - 1], delta[k - 1]);
+ psi[k] := narg(takefraction(deltax[k], cosine) + takefraction(deltay[k], sine), takefraction(deltay[k], cosine) - takefraction(deltax[k], sine))
+ end;
+ k := k + 1;
+ s := t;
+ if k = pathsize then
+ overflow(398, pathsize);
+ if s = q then
+ n := k
+ until (k >= n) and (mem[s].hh.b0 <> 5);
+ if k = n then
+ psi[n] := 0
+ else
+ psi[k] := psi[1] {:281}; {282:}
+ if mem[q].hh.b0 = 4 then begin
+ delx := mem[q + 5].int - mem[q + 1].int;
+ dely := mem[q + 6].int - mem[q + 2].int;
+ if (delx = 0) and (dely = 0) then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end else begin
+ mem[q].hh.b0 := 2;
+ mem[q + 3].int := narg(delx, dely)
+ end
+ end;
+ if (mem[p].hh.b1 = 4) and (mem[p].hh.b0 = 1) then begin
+ delx := mem[p + 1].int - mem[p + 3].int;
+ dely := mem[p + 2].int - mem[p + 4].int;
+ if (delx = 0) and (dely = 0) then begin
+ mem[p].hh.b1 := 3;
+ mem[p + 5].int := 65536
+ end else begin
+ mem[p].hh.b1 := 2;
+ mem[p + 5].int := narg(delx, dely)
+ end
+ end {:282};
+ solvechoices(p, q, n) {:278}
+ end;
+ p := q {:273}
+ until p = h;
+ if internal[4] > 0 then
+ printpath(knots, 394, true);
+ if aritherror then begin {270:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(395)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 396;
+ helpline[0] := 397
+ end;
+ putgeterror;
+ aritherror := false
+ end {:270}
+ end; {:269} {311:}
+
+ {-------------------------------------------------------------------
+ procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber);
+
+ moved to mf2ps3.p
+ -------------------------------------------------------------------}
+
+ procedure smoothmoves(b, t: integer);
+ var
+ k: 1..movesize;
+ a, aa, aaa: integer;
+ begin
+ if (t - b) >= 3 then begin
+ k := b + 2;
+ aa := move[k - 1];
+ aaa := move[k - 2];
+ repeat
+ a := move[k];
+ if abs(a - aa) > 1 then {322:}
+ if a > aa then begin
+ if aaa >= aa then
+ if a >= move[k + 1] then begin
+ move[k - 1] := move[k - 1] + 1;
+ move[k] := a - 1
+ end
+ end else begin
+ if aaa <= aa then
+ if a <= move[k + 1] then begin
+ move[k - 1] := move[k - 1] - 1;
+ move[k] := a + 1
+ end
+ end {:322};
+ k := k + 1;
+ aaa := aa;
+ aa := a
+ until k = t
+ end
+ end; {:321} {326:}
+
+ procedure initedges(h: halfword);
+ begin
+ mem[h].hh.lh := h;
+ mem[h].hh.rh := h;
+ mem[h + 1].hh.lh := 8191;
+ mem[h + 1].hh.rh := 1;
+ mem[h + 2].hh.lh := 8191;
+ mem[h + 2].hh.rh := 1;
+ mem[h + 3].hh.lh := 4096;
+ mem[h + 3].hh.rh := 0;
+ mem[h + 4].int := 0;
+ mem[h + 5].hh.rh := h;
+ mem[h + 5].hh.lh := 0
+ end; {:326} {328:}
+
+ procedure fixoffset;
+ var
+ p, q: halfword;
+ delta: integer;
+ begin
+ delta := 8 * (mem[curedges + 3].hh.lh - 4096);
+ mem[curedges + 3].hh.lh := 4096;
+ q := mem[curedges].hh.rh;
+ while q <> curedges do begin
+ p := mem[q + 1].hh.rh;
+ while p <> 30000 do begin
+ mem[p].hh.lh := mem[p].hh.lh - delta;
+ p := mem[p].hh.rh
+ end;
+ p := mem[q + 1].hh.lh;
+ while p > (-29999) do begin
+ mem[p].hh.lh := mem[p].hh.lh - delta;
+ p := mem[p].hh.rh
+ end;
+ q := mem[q].hh.rh
+ end
+ end; {:328} {329:}
+
+ procedure edgeprep(ml, mr, nl, nr: integer);
+ var
+ delta: halfword;
+ p, q: halfword;
+ begin
+ ml := ml + 4096;
+ mr := mr + 4096;
+ nl := nl + 4096;
+ nr := nr + 4095;
+ if ml < mem[curedges + 2].hh.lh then
+ mem[curedges + 2].hh.lh := ml;
+ if mr > mem[curedges + 2].hh.rh then
+ mem[curedges + 2].hh.rh := mr;
+ if (not (abs((mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 8192) < 4096)) or (not (abs((mem[curedges + 2].hh.rh + mem[curedges + 3].hh.lh) - 8192) < 4096)) then
+ fixoffset;
+ if mem[curedges].hh.rh = curedges then begin
+ mem[curedges + 1].hh.lh := nr + 1;
+ mem[curedges + 1].hh.rh := nr
+ end;
+ if nl < mem[curedges + 1].hh.lh then begin {330:}
+ delta := mem[curedges + 1].hh.lh - nl;
+ mem[curedges + 1].hh.lh := nl;
+ p := mem[curedges].hh.rh;
+ repeat
+ q := getnode(2);
+ mem[q + 1].hh.rh := 30000;
+ mem[q + 1].hh.lh := -29999;
+ mem[p].hh.lh := q;
+ mem[q].hh.rh := p;
+ p := q;
+ delta := delta - 1
+ until delta = 0;
+ mem[p].hh.lh := curedges;
+ mem[curedges].hh.rh := p;
+ if mem[curedges + 5].hh.rh = curedges then
+ mem[curedges + 5].hh.lh := nl - 1
+ end {:330};
+ if nr > mem[curedges + 1].hh.rh then begin {331:}
+ delta := nr - mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := nr;
+ p := mem[curedges].hh.lh;
+ repeat
+ q := getnode(2);
+ mem[q + 1].hh.rh := 30000;
+ mem[q + 1].hh.lh := -29999;
+ mem[p].hh.rh := q;
+ mem[q].hh.lh := p;
+ p := q;
+ delta := delta - 1
+ until delta = 0;
+ mem[p].hh.rh := curedges;
+ mem[curedges].hh.lh := p;
+ if mem[curedges + 5].hh.rh = curedges then
+ mem[curedges + 5].hh.lh := nr + 1
+ end {:331}
+ end; {:329} {334:}
+
+ function copyedges(h: halfword): halfword;
+ var
+ p, r: halfword;
+ hh, pp, qq, rr, ss: halfword;
+ begin
+ hh := getnode(6);
+ mem[hh + 1] := mem[h + 1];
+ mem[hh + 2] := mem[h + 2];
+ mem[hh + 3] := mem[h + 3];
+ mem[hh + 4] := mem[h + 4];
+ mem[hh + 5].hh.lh := mem[hh + 1].hh.rh + 1;
+ mem[hh + 5].hh.rh := hh;
+ p := mem[h].hh.rh;
+ qq := hh;
+ while p <> h do begin
+ pp := getnode(2);
+ mem[qq].hh.rh := pp;
+ mem[pp].hh.lh := qq;
+{335:}
+ r := mem[p + 1].hh.rh;
+ rr := pp + 1;
+ while r <> 30000 do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := 30000;
+ r := mem[p + 1].hh.lh;
+ rr := 29999;
+ while r > (-29999) do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := r;
+ mem[pp + 1].hh.lh := mem[29999].hh.rh {:335};
+ p := mem[p].hh.rh;
+ qq := pp
+ end;
+ mem[qq].hh.rh := hh;
+ mem[hh].hh.lh := qq;
+ copyedges := hh
+ end; {:334} {336:}
+
+ procedure yreflectedges;
+ var
+ p, q, r: halfword;
+ begin
+ p := mem[curedges + 1].hh.lh;
+ mem[curedges + 1].hh.lh := 8191 - mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := 8191 - p;
+ mem[curedges + 5].hh.lh := 8191 - mem[curedges + 5].hh.lh;
+ p := mem[curedges].hh.rh;
+ q := curedges;
+ repeat
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ mem[q].hh.lh := p;
+ q := p;
+ p := r
+ until q = curedges;
+ mem[curedges + 4].int := 0
+ end; {:336} {337:}
+
+ procedure xreflectedges;
+ var
+ p, q, r, s: halfword;
+ m: integer;
+ begin
+ p := mem[curedges + 2].hh.lh;
+ mem[curedges + 2].hh.lh := 8192 - mem[curedges + 2].hh.rh;
+ mem[curedges + 2].hh.rh := 8192 - p;
+ m := ((4096 + mem[curedges + 3].hh.lh) * 8) - 65528;
+ mem[curedges + 3].hh.lh := 4096;
+ p := mem[curedges].hh.rh; {339:}
+ repeat
+ q := mem[p + 1].hh.rh;
+ r := 30000;
+ while q <> 30000 do begin
+ s := mem[q].hh.rh;
+ mem[q].hh.rh := r;
+ r := q;
+ mem[r].hh.lh := m - mem[q].hh.lh;
+ q := s
+ end;
+ mem[p + 1].hh.rh := r {:339}; {338:}
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin
+ mem[q].hh.lh := m - mem[q].hh.lh;
+ q := mem[q].hh.rh
+ end {:338};
+ p := mem[p].hh.rh
+ until p = curedges;
+ mem[curedges + 4].int := 0
+ end; { xreflectedges }
+{:337}
+ {340:}
+
+ procedure yscaleedges(s: integer);
+ var
+ p, q, pp, r, rr, ss: halfword;
+ t: integer;
+ begin
+ if ((s * (mem[curedges + 1].hh.rh - 4095)) >= 4096) or ((s * (mem[curedges + 1].hh.lh - 4096)) <= (-4096)) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(402)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 403;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else begin
+ mem[curedges + 1].hh.rh := (s * (mem[curedges + 1].hh.rh - 4095)) + 4095;
+ mem[curedges + 1].hh.lh := (s * (mem[curedges + 1].hh.lh - 4096)) + 4096; {341:}
+ p := curedges;
+ repeat
+ q := p;
+ p := mem[p].hh.rh;
+ for t := 2 to s do begin
+ pp := getnode(2);
+ mem[q].hh.rh := pp;
+ mem[p].hh.lh := pp;
+ mem[pp].hh.rh := p;
+ mem[pp].hh.lh := q;
+ q := pp; {335:}
+ r := mem[p + 1].hh.rh;
+ rr := pp + 1;
+ while r <> 30000 do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := 30000;
+ r := mem[p + 1].hh.lh;
+ rr := 29999;
+ while r > (-29999) do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := r;
+ mem[pp + 1].hh.lh := mem[29999].hh.rh {:335}
+ end
+ until mem[p].hh.rh = curedges {:341};
+ mem[curedges + 4].int := 0
+ end
+ end; {:340}
+{342:}
+
+ procedure xscaleedges(s: integer);
+ var
+ p, q: halfword;
+ t: 0..65535;
+ w: 0..7;
+ delta: integer;
+ begin
+ if ((s * (mem[curedges + 2].hh.rh - 4096)) >= 4096) or ((s * (mem[curedges + 2].hh.lh - 4096)) <= (-4096)) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(402)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 406;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else if (mem[curedges + 2].hh.rh <> 4096) or (mem[curedges + 2].hh.lh <> 4096) then begin
+ mem[curedges + 2].hh.rh := (s * (mem[curedges + 2].hh.rh - 4096)) + 4096;
+ mem[curedges + 2].hh.lh := (s * (mem[curedges + 2].hh.lh - 4096)) + 4096;
+ delta := (8 * (4096 - (s * mem[curedges + 3].hh.lh))) - 32768;
+ mem[curedges + 3].hh.lh := 4096; {343:}
+ q := mem[curedges].hh.rh;
+ repeat
+ p := mem[q + 1].hh.rh;
+ while p <> 30000 do begin
+ t := mem[p].hh.lh + 32768;
+ w := t mod 8;
+ mem[p].hh.lh := (((t - w) * s) + w) + delta;
+ p := mem[p].hh.rh
+ end;
+ p := mem[q + 1].hh.lh;
+ while p > (-29999) do begin
+ t := mem[p].hh.lh + 32768;
+ w := t mod 8;
+ mem[p].hh.lh := (((t - w) * s) + w) + delta;
+ p := mem[p].hh.rh
+ end;
+ q := mem[q].hh.rh
+ until q = curedges {:343};
+ mem[curedges + 4].int := 0
+ end
+ end; { xscaleedges }
+{:342}
+ {344:}
+
+ procedure negateedges(h: halfword);
+ label
+ 30;
+ var
+ p, q, r, s, t, u: halfword;
+ begin
+ p := mem[h].hh.rh;
+ while p <> h do begin
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin
+ mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
+ q := mem[q].hh.rh
+ end;
+ q := mem[p + 1].hh.rh;
+ if q <> 30000 then begin
+ repeat
+ mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
+ q := mem[q].hh.rh
+ until q = 30000; {345:}
+ u := p + 1;
+ q := mem[u].hh.rh;
+ r := q;
+ s := mem[r].hh.rh;
+ while true do
+ if mem[s].hh.lh > mem[r].hh.lh then begin
+ mem[u].hh.rh := q;
+ if s = 30000 then
+ goto 30;
+ u := r;
+ q := s;
+ r := q;
+ s := mem[r].hh.rh
+ end else begin
+ t := s;
+ s := mem[t].hh.rh;
+ mem[t].hh.rh := q;
+ q := t
+ end;
+ 30:
+ mem[r].hh.rh := 30000 {:345}
+ end;
+ p := mem[p].hh.rh
+ end;
+ mem[h + 4].int := 0
+ end; {:344} {346:}
+
+ procedure sortedges(h: halfword);
+ label
+ 30;
+ var
+ k: halfword;
+ p, q, r, s: halfword;
+ begin
+ r := mem[h + 1].hh.lh;
+ mem[h + 1].hh.lh := -30000;
+ p := mem[r].hh.rh;
+ mem[r].hh.rh := 30000;
+ mem[29999].hh.rh := r;
+ while p > (-29999) do begin
+ k := mem[p].hh.lh;
+ q := 29999;
+ repeat
+ r := q;
+ q := mem[r].hh.rh
+ until k <= mem[q].hh.lh;
+ mem[r].hh.rh := p;
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ p := r
+ end; {347:}
+ begin
+ r := h + 1;
+ q := mem[r].hh.rh;
+ p := mem[29999].hh.rh;
+ while true do begin
+ k := mem[p].hh.lh;
+ while k > mem[q].hh.lh do begin
+ r := q;
+ q := mem[r].hh.rh
+ end;
+ mem[r].hh.rh := p;
+ s := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ if s = 30000 then
+ goto 30;
+ r := p;
+ p := s
+ end;
+ 30: {:347}
+ null
+ end
+ end; {:346} {348:}
+
+ procedure culledges(wlo, whi, wout, win: integer);
+ label
+ 30;
+ var
+ p, q, r, s: halfword;
+ w: integer;
+ d: integer;
+ m: integer;
+ mm: integer;
+ ww: integer;
+ prevw: integer;
+ n, minn, maxn: halfword;
+ mind, maxd: halfword;
+ begin
+ mind := 32767;
+ maxd := -32768;
+ minn := 32767;
+ maxn := -32768;
+ p := mem[curedges].hh.rh;
+ n := mem[curedges + 1].hh.lh;
+ while p <> curedges do begin
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p);
+ if mem[p + 1].hh.rh <> 30000 then begin {349:}
+ r := 29999;
+ q := mem[p + 1].hh.rh;
+ ww := 0;
+ m := 1000000;
+ prevw := 0;
+ while true do begin
+ if q = 30000 then
+ mm := 1000000
+ else begin
+ d := mem[q].hh.lh + 32768;
+ mm := d div 8;
+ ww := (ww + (d mod 8)) - 4
+ end;
+ if mm > m then begin {350:}
+ if w <> prevw then begin
+ s := getavail;
+ mem[r].hh.rh := s;
+ mem[s].hh.lh := (((8 * m) - 32764) + w) - prevw;
+ r := s;
+ prevw := w
+ end {:350};
+ if q = 30000 then
+ goto 30
+ end;
+ m := mm;
+ if ww >= wlo then
+ if ww <= whi then
+ w := win
+ else
+ w := wout
+ else
+ w := wout;
+ s := mem[q].hh.rh;
+ begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end {dynused:=dynused-1;};
+ q := s
+ end;
+ 30:
+ mem[r].hh.rh := 30000;
+ mem[p + 1].hh.rh := mem[29999].hh.rh;
+ if r <> 29999 then begin {351:}
+ if minn = 32767 then
+ minn := n;
+ maxn := n;
+ if mind > mem[mem[29999].hh.rh].hh.lh then
+ mind := mem[mem[29999].hh.rh].hh.lh;
+ if maxd < mem[r].hh.lh then
+ maxd := mem[r].hh.lh
+ end {:351}
+ end {:349};
+ p := mem[p].hh.rh;
+ n := n + 1
+ end; {352:}
+ if minn > maxn then begin {353:}
+ p := mem[curedges].hh.rh;
+ while p <> curedges do begin
+ q := mem[p].hh.rh;
+ freenode(p, 2);
+ p := q
+ end;
+ initedges(curedges)
+ end else begin {:353}
+ n := mem[curedges + 1].hh.lh;
+ mem[curedges + 1].hh.lh := minn;
+ while minn > n do begin
+ p := mem[curedges].hh.rh;
+ mem[curedges].hh.rh := mem[p].hh.rh;
+ mem[mem[p].hh.rh].hh.lh := curedges;
+ freenode(p, 2);
+ n := n + 1
+ end;
+ n := mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := maxn;
+ mem[curedges + 5].hh.lh := maxn + 1;
+ mem[curedges + 5].hh.rh := curedges;
+ while maxn < n do begin
+ p := mem[curedges].hh.lh;
+ mem[curedges].hh.lh := mem[p].hh.lh;
+ mem[mem[p].hh.lh].hh.rh := curedges;
+ freenode(p, 2);
+ n := n - 1
+ end;
+ mem[curedges + 2].hh.lh := (((mind + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096;
+ mem[curedges + 2].hh.rh := (((maxd + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096
+ end {:352};
+ mem[curedges + 4].int := 0
+ end; {:348} {354:}
+
+ procedure xyswapedges;
+ label
+ 30;
+ var
+ mmagic, nmagic: integer;
+ p, q, r, s: halfword; {357:}
+ mspread: integer;
+ j, jj: 0..movesize;
+ m, mm: integer;
+ pd, rd: integer;
+ pm, rm: integer;
+ w: integer;
+ ww: integer;
+ dw: integer; {:357} {363:}
+ extras: integer;
+ xw: -3..3;
+ k: integer; {:363} {356:}
+ begin
+ mspread := mem[curedges + 2].hh.rh - mem[curedges + 2].hh.lh;
+ if mspread > movesize then
+ overflow(407, movesize);
+ for j := 0 to mspread do
+ move[j] := 30000 {:356}; {355:}
+ p := getnode(2);
+ mem[p + 1].hh.rh := 30000;
+ mem[p + 1].hh.lh := -30000;
+ mem[p].hh.lh := curedges;
+ mem[mem[curedges].hh.rh].hh.lh := p;
+ p := getnode(2);
+ mem[p + 1].hh.rh := 30000;
+ mem[p].hh.lh := mem[curedges].hh.lh; {:355} {365:}
+ mmagic := (mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 4096;
+ nmagic := (8 * mem[curedges + 1].hh.rh) - 32756 {:365};
+ repeat
+ q := mem[p].hh.lh;
+ if mem[q + 1].hh.lh > (-29999) then
+ sortedges(q); {358:}
+ r := mem[p + 1].hh.rh;
+ freenode(p, 2);
+ p := r;
+ pd := mem[p].hh.lh + 32768;
+ pm := pd div 8;
+ r := mem[q + 1].hh.rh;
+ rd := mem[r].hh.lh + 32768;
+ rm := rd div 8;
+ w := 0;
+ while true do begin
+ if pm < rm then
+ mm := pm
+ else
+ mm := rm;
+ if w <> 0 then {362:}
+ if m <> mm then begin
+ if (mm - mmagic) >= movesize then
+ confusion(377);
+ extras := (abs(w) - 1) div 3;
+ if extras > 0 then begin
+ if w > 0 then
+ xw := +3
+ else
+ xw := -3;
+ ww := w - (extras * xw)
+ end else
+ ww := w;
+ repeat
+ j := m - mmagic;
+ for k := 1 to extras do begin
+ s := getavail;
+ mem[s].hh.lh := nmagic + xw;
+ mem[s].hh.rh := move[j];
+ move[j] := s
+ end;
+ s := getavail;
+ mem[s].hh.lh := nmagic + ww;
+ mem[s].hh.rh := move[j];
+ move[j] := s;
+ m := m + 1
+ until m = mm
+ end {:362};
+ if pd < rd then begin
+ dw := (pd mod 8) - 4; {360:}
+ s := mem[p].hh.rh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;};
+ p := s;
+ pd := mem[p].hh.lh + 32768;
+ pm := pd div 8 {:360}
+ end else begin
+ if r = 30000 then
+ goto 30;
+ dw := -((rd mod 8) - 4); {359:}
+ r := mem[r].hh.rh;
+ rd := mem[r].hh.lh + 32768;
+ rm := rd div 8 {:359}
+ end;
+ m := mm;
+ w := w + dw
+ end;
+ 30: {:358}
+ null;
+ p := q;
+ nmagic := nmagic - 8
+ until mem[p].hh.lh = curedges;
+ freenode(p, 2); {364:}
+ move[mspread] := 0;
+ j := 0;
+ while move[j] = 30000 do
+ j := j + 1;
+ if j = mspread then
+ initedges(curedges)
+ else begin
+ mm := mem[curedges + 2].hh.lh;
+ mem[curedges + 2].hh.lh := mem[curedges + 1].hh.lh;
+ mem[curedges + 2].hh.rh := mem[curedges + 1].hh.rh + 1;
+ mem[curedges + 3].hh.lh := 4096;
+ jj := mspread - 1;
+ while move[jj] = 30000 do
+ jj := jj - 1;
+ mem[curedges + 1].hh.lh := j + mm;
+ mem[curedges + 1].hh.rh := jj + mm;
+ q := curedges;
+ repeat
+ p := getnode(2);
+ mem[q].hh.rh := p;
+ mem[p].hh.lh := q;
+ mem[p + 1].hh.rh := move[j];
+ mem[p + 1].hh.lh := -30000;
+ j := j + 1;
+ q := p
+ until j > jj;
+ mem[q].hh.rh := curedges;
+ mem[curedges].hh.lh := q;
+ mem[curedges + 5].hh.lh := mem[curedges + 1].hh.rh + 1;
+ mem[curedges + 5].hh.rh := curedges;
+ mem[curedges + 4].int := 0
+ end
+ end; {:364}
+{:354}
+ {366:}
+
+ procedure mergeedges(h: halfword);
+ label
+ 30;
+ var
+ p, q, r, pp, qq, rr: halfword;
+ n: integer;
+ k: halfword;
+ delta: integer;
+ begin
+ if mem[h].hh.rh <> h then begin
+ if (((mem[h + 2].hh.lh < mem[curedges + 2].hh.lh) or (mem[h + 2].hh.rh > mem[curedges + 2].hh.rh)) or (mem[h + 1].hh.lh < mem[curedges + 1].hh.lh)) or (mem[h + 1].hh.rh > mem[curedges + 1].hh.rh) then
+ edgeprep(mem[h + 2].hh.lh - 4096, mem[h + 2].hh.rh - 4096, mem[h + 1].hh.lh - 4096, mem[h + 1].hh.rh - 4095);
+ if mem[h + 3].hh.lh <> mem[curedges + 3].hh.lh then begin {367:}
+ pp := mem[h].hh.rh;
+ delta := 8 * (mem[curedges + 3].hh.lh - mem[h + 3].hh.lh);
+ repeat
+ qq := mem[pp + 1].hh.rh;
+ while qq <> 30000 do begin
+ mem[qq].hh.lh := mem[qq].hh.lh + delta;
+ qq := mem[qq].hh.rh
+ end;
+ qq := mem[pp + 1].hh.lh;
+ while qq > (-29999) do begin
+ mem[qq].hh.lh := mem[qq].hh.lh + delta;
+ qq := mem[qq].hh.rh
+ end;
+ pp := mem[pp].hh.rh
+ until pp = h
+ end {:367};
+ n := mem[curedges + 1].hh.lh;
+ p := mem[curedges].hh.rh;
+ pp := mem[h].hh.rh;
+ while n < mem[h + 1].hh.lh do begin
+ n := n + 1;
+ p := mem[p].hh.rh
+ end; {368:}
+ repeat
+ qq := mem[pp + 1].hh.lh;
+ if qq > (-29999) then
+ if mem[p + 1].hh.lh <= (-29999) then
+ mem[p + 1].hh.lh := qq
+ else begin
+ while mem[qq].hh.rh > (-29999) do
+ qq := mem[qq].hh.rh;
+ mem[qq].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := mem[pp + 1].hh.lh
+ end;
+ mem[pp + 1].hh.lh := -30000;
+ qq := mem[pp + 1].hh.rh;
+ if qq <> 30000 then begin
+ if mem[p + 1].hh.lh = (-29999) then
+ mem[p + 1].hh.lh := -30000;
+ mem[pp + 1].hh.rh := 30000;
+ r := p + 1;
+ q := mem[r].hh.rh;
+ if q = 30000 then
+ mem[p + 1].hh.rh := qq
+ else
+ while true do begin
+ k := mem[qq].hh.lh;
+ while k > mem[q].hh.lh do begin
+ r := q;
+ q := mem[r].hh.rh
+ end;
+ mem[r].hh.rh := qq;
+ rr := mem[qq].hh.rh;
+ mem[qq].hh.rh := q;
+ if rr = 30000 then
+ goto 30;
+ r := qq;
+ qq := rr
+ end
+ end;
+ 30: {:368}
+ null;
+ pp := mem[pp].hh.rh;
+ p := mem[p].hh.rh
+ until pp = h
+ end
+ end; {:366} {369:}
+
+ function totalweight(h: halfword): integer;
+ var
+ p, q: halfword;
+ n: integer;
+ m: 0..65535;
+ begin
+ n := 0;
+ p := mem[h].hh.rh;
+ while p <> h do begin
+ q := mem[p + 1].hh.rh;
+ while q <> 30000 do begin {370:}
+ m := mem[q].hh.lh + 32768;
+ n := n - (((m mod 8) - 4) * (m div 8));
+ q := mem[q].hh.rh
+ end {:370};
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin {370:}
+ m := mem[q].hh.lh + 32768;
+ n := n - (((m mod 8) - 4) * (m div 8));
+ q := mem[q].hh.rh
+ end {:370};
+ p := mem[p].hh.rh
+ end;
+ totalweight := n
+ end; {:369}
+{372:}
+
+ procedure beginedgetracing;
+ begin
+ printdiagnostic(408, 155, true);
+ print(409);
+ printint(curwt);
+ printchar(41);
+ tracex := -4096
+ end; { beginedgetracing }
+
+ procedure traceacorner;
+ begin
+ if fileoffset > (maxprintline - 13) then
+ printnl(155);
+ printchar(40);
+ printint(tracex);
+ printchar(44);
+ printint(traceyy);
+ printchar(41);
+ tracey := traceyy
+ end;
+
+ procedure endedgetracing;
+ begin
+ if tracex = (-4096) then
+ printnl(410)
+ else begin
+ traceacorner;
+ printchar(46)
+ end;
+ enddiagnostic(true)
+ end; {:372} {373:}
+
+ procedure tracenewedge(r: halfword; n: integer);
+ var
+ d: integer;
+ w: -3..3;
+ m, n0, n1: integer;
+ begin
+ d := mem[r].hh.lh + 32768;
+ w := (d mod 8) - 4;
+ m := (d div 8) - mem[curedges + 3].hh.lh;
+ if w = curwt then begin
+ n0 := n + 1;
+ n1 := n
+ end else begin
+ n0 := n;
+ n1 := n + 1
+ end;
+ if m <> tracex then begin
+ if tracex = (-4096) then begin
+ printnl(155);
+ traceyy := n0
+ end else if traceyy <> n0 then
+ printchar(63)
+ else
+ traceacorner;
+ tracex := m;
+ traceacorner
+ end else begin
+ if n0 <> traceyy then
+ printchar(33);
+ if ((n0 < n1) and (tracey > traceyy)) or ((n0 > n1) and (tracey < traceyy)) then
+ traceacorner
+ end;
+ traceyy := n1
+ end; {:373} {374:}
+
+ procedure lineedges(x0, y0, x1, y1: scaled);
+ label
+ 30, 31;
+ var
+ m0, n0, m1, n1: integer;
+ delx, dely: scaled;
+ yt: scaled;
+ tx: scaled;
+ p, r: halfword;
+ base: integer;
+ n: integer;
+ begin
+ n0 := roundunscaled(y0);
+ n1 := roundunscaled(y1);
+ if n0 <> n1 then begin
+ m0 := roundunscaled(x0);
+ m1 := roundunscaled(x1);
+ delx := x1 - x0;
+ dely := y1 - y0;
+ yt := (n0 * 65536) - 32768;
+ y0 := y0 - yt;
+ y1 := y1 - yt;
+ if n0 < n1 then begin {375:}
+ base := ((8 * mem[curedges + 3].hh.lh) - 32764) - curwt;
+ if m0 <= m1 then
+ edgeprep(m0, m1, n0, n1)
+ else
+ edgeprep(m1, m0, n0, n1); {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ y0 := 65536 - y0;
+ while true do begin
+ r := getavail;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := r;
+ tx := takefraction(delx, makefraction(y0, dely));
+ if abvscd(delx, y0, dely, tx) < 0 then
+ tx := tx - 1;
+ mem[r].hh.lh := (8 * roundunscaled(x0 + tx)) + base;
+ y1 := y1 - 65536;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ if y1 < 65536 then
+ goto 30;
+ p := mem[p].hh.rh;
+ y0 := y0 + 65536;
+ n := n + 1
+ end;
+ 30: {:375}
+ null
+ end else begin {376:}
+ base := ((8 * mem[curedges + 3].hh.lh) - 32764) + curwt;
+ if m0 <= m1 then
+ edgeprep(m0, m1, n1, n0)
+ else
+ edgeprep(m1, m0, n1, n0);
+ n0 := n0 - 1;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ while true do begin
+ r := getavail;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := r;
+ tx := takefraction(delx, makefraction(y0, dely));
+ if abvscd(delx, y0, dely, tx) < 0 then
+ tx := tx + 1;
+ mem[r].hh.lh := (8 * roundunscaled(x0 - tx)) + base;
+ y1 := y1 + 65536;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ if y1 >= 0 then
+ goto 31;
+ p := mem[p].hh.lh;
+ y0 := y0 + 65536;
+ n := n - 1
+ end;
+ 31: {:376}
+ null
+ end;
+ mem[curedges + 5].hh.rh := p;
+ mem[curedges + 5].hh.lh := n + 4096
+ end
+ end; {:374}
+{378:}
+
+ procedure movetoedges(m0, n0, m1, n1: integer);
+ label
+ 60, 61, 62, 63, 30;
+ var
+ delta: 0..movesize;
+ k: 0..movesize;
+ p, r: halfword;
+ dx: integer;
+ edgeandweight: integer;
+ j: integer;
+ n: integer; {sum:integer;}
+ {sum:=move[0];
+ for k:=1 to delta do sum:=sum+abs(move[k]);
+ if sum<>m1-m0 then confusion(48);}
+ begin
+ delta := n1 - n0;
+ {380:}
+ case octant of
+ 1:
+ begin
+ dx := 8;
+ edgeprep(m0, m1, n0, n1);
+ goto 60
+ end;
+ 5:
+ begin
+ dx := 8;
+ edgeprep(n0, n1, m0, m1);
+ goto 62
+ end;
+ 6:
+ begin
+ dx := -8;
+ edgeprep(-n1, -n0, m0, m1);
+ n0 := -n0;
+ goto 62
+ end;
+ 2:
+ begin
+ dx := -8;
+ edgeprep(-m1, -m0, n0, n1);
+ m0 := -m0;
+ goto 60
+ end;
+ 4:
+ begin
+ dx := -8;
+ edgeprep(-m1, -m0, -n1, -n0);
+ m0 := -m0;
+ goto 61
+ end;
+ 8:
+ begin
+ dx := -8;
+ edgeprep(-n1, -n0, -m1, -m0);
+ n0 := -n0;
+ goto 63
+ end;
+ 7:
+ begin
+ dx := 8;
+ edgeprep(n0, n1, -m1, -m0);
+ goto 63
+ end;
+ 3:
+ begin
+ dx := 8;
+ edgeprep(m0, m1, -n1, -n0);
+ goto 61
+ end
+ end; {:380}
+ 60: {381:} {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ if delta > 0 then begin
+ k := 0;
+ edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
+ repeat
+ edgeandweight := edgeandweight + (dx * move[k]);
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.rh;
+ k := k + 1;
+ n := n + 1
+ until k = delta
+ end;
+ goto 30 {:381};
+ 61: {382:}
+ n0 := (-n0) - 1; {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ if delta > 0 then begin
+ k := 0;
+ edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
+ repeat
+ edgeandweight := edgeandweight + (dx * move[k]);
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.lh;
+ k := k + 1;
+ n := n - 1
+ until k = delta
+ end;
+ goto 30 {:382};
+ 62: {383:}
+ edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
+ n0 := m0;
+ k := 0;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ repeat
+ j := move[k];
+ while j > 0 do begin
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.rh;
+ j := j - 1;
+ n := n + 1
+ end;
+ edgeandweight := edgeandweight + dx;
+ k := k + 1
+ until k > delta;
+ goto 30 {:383};
+ 63: {384:}
+ edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
+ n0 := (-m0) - 1;
+ k := 0;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ repeat
+ j := move[k];
+ while j > 0 do begin
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.lh;
+ j := j - 1;
+ n := n - 1
+ end;
+ edgeandweight := edgeandweight + dx;
+ k := k + 1
+ until k > delta;
+ goto 30 {:384};
+ 30:
+ mem[curedges + 5].hh.lh := n + 4096;
+ mem[curedges + 5].hh.rh := p
+ end; {:378} {387:}
+
+ procedure skew(x, y: scaled; octant: smallnumber);
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x - y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y - x;
+ cury := x
+ end;
+ 6:
+ begin
+ curx := y + x;
+ cury := -x
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) + y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := (-y) + x;
+ cury := -x
+ end;
+ 7:
+ begin
+ curx := (-y) - x;
+ cury := x
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+ end; {:387} {390:}
+
+ procedure abnegate(x, y: scaled; octantbefore, octantafter: smallnumber);
+ begin
+ if odd(octantbefore) = odd(octantafter) then
+ curx := x
+ else
+ curx := -x;
+ if (octantbefore > 2) = (octantafter > 2) then
+ cury := y
+ else
+ cury := -y
+ end; {:390}
+{391:}
+
+ function crossingpoint(a, b, c: integer): fraction;
+ label
+ 10;
+ var
+ d: integer;
+ x, xx, x0, x1, x2: integer;
+ begin
+ if a < 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end;
+ if c >= 0 then begin
+ if b >= 0 then
+ if c > 0 then begin
+ crossingpoint := 268435457;
+ goto 10
+ end else if (a = 0) and (b = 0) then begin
+ crossingpoint := 268435457;
+ goto 10
+ end else begin
+ crossingpoint := 268435456;
+ goto 10
+ end;
+ if a = 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end
+ end else if a = 0 then
+ if b <= 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end;
+{392:}
+ d := 1;
+ x0 := a;
+ x1 := a - b;
+ x2 := b - c;
+ repeat
+ x := (x1 + x2) div 2;
+ if (x1 - x0) > x0 then begin
+ x2 := x;
+ x0 := x0 + x0;
+ d := d + d
+ end else begin
+ xx := (x1 + x) - x0;
+ if xx > x0 then begin
+ x2 := x;
+ x0 := x0 + x0;
+ d := d + d
+ end else begin
+ x0 := x0 - xx;
+ if x <= x0 then
+ if (x + x2) <= x0 then begin
+ crossingpoint := 268435457;
+ goto 10
+ end;
+ x1 := x;
+ d := (d + d) + 1
+ end
+ end
+ until d >= 268435456;
+ crossingpoint := d - 268435456 {:392};
+ 10:
+ null
+ end; {:391} {394:}
+
+ procedure printspec(s: strnumber);
+ label
+ 45, 30;
+ var
+ p, q: halfword;
+ octant: smallnumber;
+ begin
+ printdiagnostic(411, s, true);
+ p := curspec;
+ octant := mem[p + 3].int;
+ println;
+ unskew(mem[curspec + 1].int, mem[curspec + 2].int, octant);
+ printtwo(curx, cury);
+ print(412);
+ while true do begin
+ print(octantdir[octant]);
+ printchar(39);
+ while true do begin
+ q := mem[p].hh.rh;
+ if mem[p].hh.b1 = 0 then
+ goto 45;
+{397:}
+ begin
+ printnl(423);
+ unskew(mem[p + 5].int, mem[p + 6].int, octant);
+ printtwo(curx, cury);
+ print(390);
+ unskew(mem[q + 3].int, mem[q + 4].int, octant);
+ printtwo(curx, cury);
+ printnl(387);
+ unskew(mem[q + 1].int, mem[q + 2].int, octant);
+ printtwo(curx, cury);
+ print(424);
+ printint(mem[q].hh.b0 - 1)
+ end {:397};
+ p := q
+ end;
+ 45:
+ if q = curspec then
+ goto 30;
+ p := q;
+ octant := mem[p + 3].int;
+ printnl(413)
+ end;
+ 30:
+ printnl(414);
+ enddiagnostic(true)
+ end; {:394} {398:}
+
+ procedure printstrange(s: strnumber);
+ var
+ p: halfword;
+ f: halfword;
+ q: halfword;
+ t: integer;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(62); {399:}
+ p := curspec;
+ t := 128;
+ repeat
+ p := mem[p].hh.rh;
+ if mem[p].hh.b0 <> 0 then begin
+ if mem[p].hh.b0 < t then
+ f := p;
+ t := mem[p].hh.b0
+ end
+ until p = curspec {:399}; {400:}
+ p := curspec;
+ q := p;
+ repeat
+ p := mem[p].hh.rh;
+ if mem[p].hh.b0 = 0 then
+ q := p
+ until p = f {:400};
+ t := 0;
+ repeat
+ if mem[p].hh.b0 <> 0 then begin
+ if mem[p].hh.b0 <> t then begin
+ t := mem[p].hh.b0;
+ printchar(32);
+ printint(t - 1)
+ end;
+ if q <> (-30000) then begin {401:}
+ if mem[mem[q].hh.rh].hh.b0 = 0 then begin
+ print(425);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh;
+ while mem[mem[q].hh.rh].hh.b0 = 0 do begin
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh
+ end;
+ printchar(41)
+ end {:401};
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := -30000
+ end
+ end else if q = (-30000) then
+ q := p;
+ p := mem[p].hh.rh
+ until p = f;
+ printchar(32);
+ printint(mem[p].hh.b0 - 1);
+ if q <> (-30000) then {401:}
+ if mem[mem[q].hh.rh].hh.b0 = 0 then begin
+ print(425);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh;
+ while mem[mem[q].hh.rh].hh.b0 = 0 do begin
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh
+ end;
+ printchar(41)
+ end {:401};
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(s)
+ end
+ end; { printstrange }
+{:398}
+ {402:}
+ {405:}
+
+ procedure removecubic(p: halfword);
+ var
+ q: halfword;
+ begin
+ q := mem[p].hh.rh;
+ mem[p].hh.b1 := mem[q].hh.b1;
+ mem[p].hh.rh := mem[q].hh.rh;
+ mem[p + 1].int := mem[q + 1].int;
+ mem[p + 2].int := mem[q + 2].int;
+ mem[p + 5].int := mem[q + 5].int;
+ mem[p + 6].int := mem[q + 6].int;
+ freenode(q, 7)
+ end; {:405} {406:} {410:}
+
+ procedure splitcubic(p: halfword; t: fraction; xq, yq: scaled);
+ var
+ v: scaled;
+ q, r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(7);
+ mem[p].hh.rh := r;
+ mem[r].hh.rh := q;
+ mem[r].hh.b0 := mem[q].hh.b0;
+ mem[r].hh.b1 := mem[p].hh.b1;
+ v := mem[p + 5].int - takefraction(mem[p + 5].int - mem[q + 3].int, t);
+ mem[p + 5].int := mem[p + 1].int - takefraction(mem[p + 1].int - mem[p + 5].int, t);
+ mem[q + 3].int := mem[q + 3].int - takefraction(mem[q + 3].int - xq, t);
+ mem[r + 3].int := mem[p + 5].int - takefraction(mem[p + 5].int - v, t);
+ mem[r + 5].int := v - takefraction(v - mem[q + 3].int, t);
+ mem[r + 1].int := mem[r + 3].int - takefraction(mem[r + 3].int - mem[r + 5].int, t);
+ v := mem[p + 6].int - takefraction(mem[p + 6].int - mem[q + 4].int, t);
+ mem[p + 6].int := mem[p + 2].int - takefraction(mem[p + 2].int - mem[p + 6].int, t);
+ mem[q + 4].int := mem[q + 4].int - takefraction(mem[q + 4].int - yq, t);
+ mem[r + 4].int := mem[p + 6].int - takefraction(mem[p + 6].int - v, t);
+ mem[r + 6].int := v - takefraction(v - mem[q + 4].int, t);
+ mem[r + 2].int := mem[r + 4].int - takefraction(mem[r + 4].int - mem[r + 6].int, t)
+ end; {:410}
+
+ procedure quadrantsubdivide;
+ label
+ 22, 10;
+ var
+ p, q, r, s, pp, qq: halfword;
+ firstx, firsty: scaled;
+ del1, del2, del3, del, dmax: scaled;
+ t: fraction;
+ destx, desty: scaled;
+ constantx: boolean;
+ begin
+ p := curspec;
+ firstx := mem[curspec + 1].int;
+ firsty := mem[curspec + 2].int;
+ repeat
+ 22:
+ q := mem[p].hh.rh; {407:}
+ if q = curspec then begin
+ destx := firstx;
+ desty := firsty
+ end else begin
+ destx := mem[q + 1].int;
+ desty := mem[q + 2].int
+ end;
+ del1 := mem[p + 5].int - mem[p + 1].int;
+ del2 := mem[q + 3].int - mem[p + 5].int;
+ del3 := destx - mem[q + 3].int; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del = 0 then
+ constantx := true
+ else begin
+ constantx := false;
+ if del < 0 then begin {409:}
+ mem[p + 1].int := -mem[p + 1].int;
+ mem[p + 5].int := -mem[p + 5].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ destx := -destx;
+ mem[p].hh.b1 := 2
+ end {:409};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {411:}
+ splitcubic(p, t, destx, desty);
+ r := mem[p].hh.rh;
+ if mem[r].hh.b1 > 1 then
+ mem[r].hh.b1 := 1
+ else
+ mem[r].hh.b1 := 2;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int;
+ mem[r + 3].int := mem[r + 1].int;
+ mem[r + 1].int := -mem[r + 1].int;
+ mem[r + 5].int := mem[r + 1].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ destx := -destx;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {412:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 1].int < destx then
+ mem[s + 1].int := destx;
+ if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ mem[s].hh.b1 := mem[p].hh.b1;
+ mem[s + 3].int := mem[s + 1].int;
+ mem[s + 1].int := -mem[s + 1].int;
+ mem[s + 5].int := mem[s + 1].int;
+ mem[q + 3].int := -mem[q + 3].int
+ end else if mem[r + 1].int > destx then {:412}
+ mem[r + 1].int := destx
+ end {:411}
+ end {:407};
+{413:}
+ pp := p;
+ repeat
+ qq := mem[pp].hh.rh;
+ abnegate(mem[qq + 1].int, mem[qq + 2].int, mem[qq].hh.b1, mem[pp].hh.b1);
+ destx := curx;
+ desty := cury;
+ del1 := mem[pp + 6].int - mem[pp + 2].int;
+ del2 := mem[qq + 4].int - mem[pp + 6].int;
+ del3 := desty - mem[qq + 4].int; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del <> 0 then begin
+ if del < 0 then begin {414:}
+ mem[pp + 2].int := -mem[pp + 2].int;
+ mem[pp + 6].int := -mem[pp + 6].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := -desty;
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 2
+ end {:414};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {415:}
+ splitcubic(pp, t, destx, desty);
+ r := mem[pp].hh.rh;
+ if mem[r].hh.b1 > 2 then
+ mem[r].hh.b1 := mem[r].hh.b1 - 2
+ else
+ mem[r].hh.b1 := mem[r].hh.b1 + 2;
+ if mem[r + 1].int > destx then
+ mem[r + 1].int := destx
+ else if mem[r + 1].int < mem[pp + 1].int then
+ mem[r + 1].int := mem[pp + 1].int;
+ if mem[r + 2].int < mem[pp + 2].int then
+ mem[r + 2].int := mem[pp + 2].int;
+ mem[r + 4].int := mem[r + 2].int;
+ mem[r + 2].int := -mem[r + 2].int;
+ mem[r + 6].int := mem[r + 2].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ desty := -desty;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {416:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 1].int > destx then
+ mem[s + 1].int := destx
+ else if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ if mem[s + 2].int < desty then
+ mem[s + 2].int := desty;
+ if mem[s + 2].int < mem[r + 2].int then
+ mem[s + 2].int := mem[r + 2].int;
+ mem[s].hh.b1 := mem[pp].hh.b1;
+ mem[s + 4].int := mem[s + 2].int;
+ mem[s + 2].int := -mem[s + 2].int;
+ mem[s + 6].int := mem[s + 2].int;
+ mem[qq + 4].int := -mem[qq + 4].int
+ end else if mem[r + 2].int > desty then {:416}
+ mem[r + 2].int := desty
+ end {:415}
+ end else if constantx then begin {417:}
+ if q <> p then begin
+ removecubic(p);
+ if curspec <> q then
+ goto 22
+ else begin
+ curspec := p;
+ goto 10
+ end
+ end
+ end else if not odd(mem[pp].hh.b1) then begin {414:}
+ mem[pp + 2].int := -mem[pp + 2].int;
+ mem[pp + 6].int := -mem[pp + 6].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := -desty;
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 2
+ end {:414} {:417};
+ pp := qq
+ until pp = q;
+ if constantx then begin {418:}
+ pp := p;
+ repeat
+ qq := mem[pp].hh.rh;
+ if mem[pp].hh.b1 > 2 then begin
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 1;
+ mem[pp + 1].int := -mem[pp + 1].int;
+ mem[pp + 5].int := -mem[pp + 5].int;
+ mem[qq + 3].int := -mem[qq + 3].int
+ end;
+ pp := qq
+ until pp = q
+ end {:418} {:413};
+ p := q
+ until p = curspec;
+ 10:
+ null
+ end; {:406} {419:}
+
+ procedure octantsubdivide;
+ var
+ p, q, r, s: halfword;
+ del1, del2, del3, del, dmax: scaled;
+ t: fraction;
+ destx, desty: scaled;
+ begin
+ p := curspec;
+ repeat
+ q := mem[p].hh.rh;
+ mem[p + 1].int := mem[p + 1].int - mem[p + 2].int;
+ mem[p + 5].int := mem[p + 5].int - mem[p + 6].int;
+ mem[q + 3].int := mem[q + 3].int - mem[q + 4].int; {420:} {421:}
+ if q = curspec then begin
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ destx := curx;
+ desty := cury
+ end else begin
+ abnegate(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1, mem[p].hh.b1);
+ destx := curx - cury;
+ desty := cury
+ end;
+ del1 := mem[p + 5].int - mem[p + 1].int;
+ del2 := mem[q + 3].int - mem[p + 5].int;
+ del3 := destx - mem[q + 3].int {:421}; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del <> 0 then begin
+ if del < 0 then begin {423:}
+ mem[p + 2].int := mem[p + 1].int + mem[p + 2].int;
+ mem[p + 1].int := -mem[p + 1].int;
+ mem[p + 6].int := mem[p + 5].int + mem[p + 6].int;
+ mem[p + 5].int := -mem[p + 5].int;
+ mem[q + 4].int := mem[q + 3].int + mem[q + 4].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := destx + desty;
+ destx := -destx;
+ mem[p].hh.b1 := mem[p].hh.b1 + 4
+ end {:423};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {424:}
+ splitcubic(p, t, destx, desty);
+ r := mem[p].hh.rh;
+ if mem[r].hh.b1 > 4 then
+ mem[r].hh.b1 := mem[r].hh.b1 - 4
+ else
+ mem[r].hh.b1 := mem[r].hh.b1 + 4;
+ if mem[r + 2].int > desty then
+ mem[r + 2].int := desty
+ else if mem[r + 2].int < mem[p + 2].int then
+ mem[r + 2].int := mem[p + 2].int;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int;
+ mem[r + 3].int := mem[r + 1].int;
+ mem[r + 2].int := mem[r + 2].int + mem[r + 1].int;
+ mem[r + 1].int := -mem[r + 1].int;
+ mem[r + 5].int := mem[r + 1].int;
+ mem[r + 6].int := mem[r + 6].int - mem[r + 5].int;
+ mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ desty := desty + destx;
+ destx := -destx;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {425:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 2].int > desty then
+ mem[s + 2].int := desty
+ else if mem[s + 2].int < mem[r + 2].int then
+ mem[s + 2].int := mem[r + 2].int;
+ if mem[s + 1].int < destx then
+ mem[s + 1].int := destx;
+ if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ mem[s].hh.b1 := mem[p].hh.b1;
+ mem[s + 3].int := mem[s + 1].int;
+ mem[s + 2].int := mem[s + 2].int + mem[s + 1].int;
+ mem[s + 1].int := -mem[s + 1].int;
+ mem[s + 6].int := mem[s + 6].int - mem[s + 1].int;
+ mem[s + 5].int := mem[s + 1].int;
+ mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
+ mem[q + 3].int := -mem[q + 3].int
+ end else if mem[r + 1].int > destx then {:425}
+ mem[r + 1].int := destx {:424}
+ end
+ end {:420};
+ p := q
+ until p = curspec
+ end; {:419} {426:}
+
+ procedure makesafe;
+ var
+ k: 0..maxwiggle;
+ allsafe: boolean;
+ nexta: scaled;
+ deltaa, deltab: scaled;
+ begin
+ before[curroundingptr] := before[0];
+ nodetoround[curroundingptr] := nodetoround[0];
+ repeat
+ after[curroundingptr] := after[0];
+ allsafe := true;
+ nexta := after[0];
+ for k := 0 to curroundingptr - 1 do begin
+ deltab := before[k + 1] - before[k];
+ if deltab >= 0 then
+ deltaa := after[k + 1] - nexta
+ else
+ deltaa := nexta - after[k + 1];
+ nexta := after[k + 1];
+ if (deltaa < 0) or (deltaa > abs(deltab + deltab)) then begin
+ allsafe := false;
+ after[k] := before[k];
+ if k = (curroundingptr - 1) then
+ after[0] := before[0]
+ else
+ after[k + 1] := before[k + 1]
+ end
+ end
+ until allsafe
+ end; {:426} {429:}
+
+ procedure beforeandafter(b, a: scaled; p: halfword);
+ begin
+ if curroundingptr = maxroundingptr then
+ if maxroundingptr < maxwiggle then
+ maxroundingptr := maxroundingptr + 1
+ else
+ overflow(435, maxwiggle);
+ after[curroundingptr] := a;
+ before[curroundingptr] := b;
+ nodetoround[curroundingptr] := p;
+ curroundingptr := curroundingptr + 1
+ end; { beforeandafter }
+{:429}
+ {431:}
+
+ function goodval(b, o: scaled): scaled;
+ var
+ a: scaled;
+ begin
+ a := b + o;
+ if a >= 0 then
+ a := (a - (a mod curgran)) - o
+ else
+ a := (((a + ((-(a + 1)) mod curgran)) - curgran) + 1) - o;
+ if (b - a) < ((a + curgran) - b) then
+ goodval := a
+ else
+ goodval := a + curgran
+ end; {:431} {432:}
+
+ function compromise(u, v: scaled): scaled;
+ begin
+ compromise := goodval(u + u, (-u) - v) div 2
+ end; {:432} {433:}
+
+ procedure xyround;
+ var
+ p, q: halfword;
+ b, a: scaled;
+ penedge: scaled;
+ alpha: fraction;
+ begin
+ curgran := abs(internal[37]);
+ if curgran = 0 then
+ curgran := 65536;
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {434:}
+ if odd(mem[p].hh.b1) <> odd(mem[q].hh.b1) then begin
+ if odd(mem[q].hh.b1) then
+ b := mem[q + 1].int
+ else
+ b := -mem[q + 1].int;
+ if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {435:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then
+ penedge := compromise(mem[mem[curpen + 5].hh.rh + 2].int, mem[mem[curpen + 7].hh.rh + 2].int)
+ else if odd(mem[q].hh.b1) then
+ penedge := mem[mem[curpen + 7].hh.rh + 2].int
+ else
+ penedge := mem[mem[curpen + 5].hh.rh + 2].int;
+ a := goodval(b, penedge)
+ end else {:435}
+ a := b;
+ if abs(a) > maxallowed then
+ if a > 0 then
+ a := maxallowed
+ else
+ a := -maxallowed;
+ beforeandafter(b, a, q)
+ end {:434};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {436:}
+ makesafe;
+ repeat
+ curroundingptr := curroundingptr - 1;
+ if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
+ p := nodetoround[curroundingptr];
+ if odd(mem[p].hh.b1) then begin
+ b := before[curroundingptr];
+ a := after[curroundingptr]
+ end else begin
+ b := -before[curroundingptr];
+ a := -after[curroundingptr]
+ end;
+ if before[curroundingptr] = before[curroundingptr + 1] then
+ alpha := 268435456
+ else
+ alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
+ repeat
+ mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
+ mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
+ p := mem[p].hh.rh;
+ mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a
+ until p = nodetoround[curroundingptr + 1]
+ end
+ until curroundingptr = 0
+ end {:436};
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {437:}
+ if (mem[p].hh.b1 > 2) <> (mem[q].hh.b1 > 2) then begin
+ if mem[q].hh.b1 <= 2 then
+ b := mem[q + 2].int
+ else
+ b := -mem[q + 2].int;
+ if (abs(mem[q + 2].int - mem[q + 6].int) < 655) or (abs(mem[q + 2].int + mem[q + 4].int) < 655) then begin {438:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then
+ penedge := compromise(mem[mem[curpen + 2].hh.rh + 2].int, mem[mem[curpen + 1].hh.rh + 2].int)
+ else if mem[q].hh.b1 <= 2 then
+ penedge := mem[mem[curpen + 1].hh.rh + 2].int
+ else
+ penedge := mem[mem[curpen + 2].hh.rh + 2].int;
+ a := goodval(b, penedge)
+ end else {:438}
+ a := b;
+ if abs(a) > maxallowed then
+ if a > 0 then
+ a := maxallowed
+ else
+ a := -maxallowed;
+ beforeandafter(b, a, q)
+ end {:437};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {439:}
+ makesafe;
+ repeat
+ curroundingptr := curroundingptr - 1;
+ if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
+ p := nodetoround[curroundingptr];
+ if mem[p].hh.b1 <= 2 then begin
+ b := before[curroundingptr];
+ a := after[curroundingptr]
+ end else begin
+ b := -before[curroundingptr];
+ a := -after[curroundingptr]
+ end;
+ if before[curroundingptr] = before[curroundingptr + 1] then
+ alpha := 268435456
+ else
+ alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
+ repeat
+ mem[p + 2].int := takefraction(alpha, mem[p + 2].int - b) + a;
+ mem[p + 6].int := takefraction(alpha, mem[p + 6].int - b) + a;
+ p := mem[p].hh.rh;
+ mem[p + 4].int := takefraction(alpha, mem[p + 4].int - b) + a
+ until p = nodetoround[curroundingptr + 1]
+ end
+ until curroundingptr = 0
+ end {:439}
+ end; {:433} {440:}
+
+ procedure diaground;
+ var
+ p, q, pp: halfword;
+ b, a, bb, aa, d, c, dd, cc: scaled;
+ penedge: scaled;
+ alpha, beta: fraction;
+ nexta: scaled;
+ allsafe: boolean;
+ k: 0..maxwiggle;
+ firstx, firsty: scaled;
+ begin
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {441:}
+ if mem[p].hh.b1 <> mem[q].hh.b1 then begin
+ if mem[q].hh.b1 > 4 then
+ b := -mem[q + 1].int
+ else
+ b := mem[q + 1].int;
+ if abs(mem[q].hh.b1 - mem[p].hh.b1) = 4 then
+ if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {442:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then {443:}
+ case mem[q].hh.b1 of
+ 1, 5:
+ penedge := compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
+ 4, 8:
+ penedge := -compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
+ 6, 2:
+ penedge := compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int);
+ 7, 3:
+ penedge := -compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int)
+ end {:443}
+ else if mem[q].hh.b1 <= 4 then
+ penedge := mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int
+ else
+ penedge := -mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int;
+ if odd(mem[q].hh.b1) then
+ a := goodval(b, penedge + (curgran div 2))
+ else
+ a := goodval(b - 1, penedge + (curgran div 2))
+ end else {:442}
+ a := b
+ else
+ a := b;
+ beforeandafter(b, a, q)
+ end {:441};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {444:}
+ p := nodetoround[0];
+ firstx := mem[p + 1].int;
+ firsty := mem[p + 2].int; {446:}
+ before[curroundingptr] := before[0];
+ nodetoround[curroundingptr] := nodetoround[0];
+ repeat
+ after[curroundingptr] := after[0];
+ allsafe := true;
+ nexta := after[0];
+ for k := 0 to curroundingptr - 1 do begin
+ a := nexta;
+ b := before[k];
+ nexta := after[k + 1];
+ aa := nexta;
+ bb := before[k + 1];
+ if (a <> b) or (aa <> bb) then begin
+ p := nodetoround[k];
+ pp := nodetoround[k + 1];
+{445:}
+ if aa = bb then begin
+ if pp = nodetoround[0] then
+ unskew(firstx, firsty, mem[pp].hh.b1)
+ else
+ unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ bb := curx;
+ aa := bb;
+ dd := cury;
+ cc := dd;
+ if mem[p].hh.b1 > 4 then begin
+ b := -b;
+ a := -a
+ end
+ end else begin
+ if mem[p].hh.b1 > 4 then begin
+ bb := -bb;
+ aa := -aa;
+ b := -b;
+ a := -a
+ end;
+ if pp = nodetoround[0] then
+ dd := firsty - bb
+ else
+ dd := mem[pp + 2].int - bb;
+ if odd(aa - bb) then
+ if mem[p].hh.b1 > 4 then
+ cc := dd - (((aa - bb) + 1) div 2)
+ else
+ cc := dd - (((aa - bb) - 1) div 2)
+ else
+ cc := dd - ((aa - bb) div 2)
+ end;
+ d := mem[p + 2].int;
+ if odd(a - b) then
+ if mem[p].hh.b1 > 4 then
+ c := d - (((a - b) - 1) div 2)
+ else
+ c := d - (((a - b) + 1) div 2)
+ else
+ c := d - ((a - b) div 2) {:445};
+ if (((aa < a) or (cc < c)) or ((aa - a) > (2 * (bb - b)))) or ((cc - c) > (2 * (dd - d))) then begin
+ allsafe := false;
+ after[k] := before[k];
+ if k = (curroundingptr - 1) then
+ after[0] := before[0]
+ else
+ after[k + 1] := before[k + 1]
+ end
+ end
+ end
+ until allsafe {:446};
+ for k := 0 to curroundingptr - 1 do begin
+ a := after[k];
+ b := before[k];
+ aa := after[k + 1];
+ bb := before[k + 1];
+ if (a <> b) or (aa <> bb) then begin
+ p := nodetoround[k];
+ pp := nodetoround[k + 1];
+{445:}
+ if aa = bb then begin
+ if pp = nodetoround[0] then
+ unskew(firstx, firsty, mem[pp].hh.b1)
+ else
+ unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ bb := curx;
+ aa := bb;
+ dd := cury;
+ cc := dd;
+ if mem[p].hh.b1 > 4 then begin
+ b := -b;
+ a := -a
+ end
+ end else begin
+ if mem[p].hh.b1 > 4 then begin
+ bb := -bb;
+ aa := -aa;
+ b := -b;
+ a := -a
+ end;
+ if pp = nodetoround[0] then
+ dd := firsty - bb
+ else
+ dd := mem[pp + 2].int - bb;
+ if odd(aa - bb) then
+ if mem[p].hh.b1 > 4 then
+ cc := dd - (((aa - bb) + 1) div 2)
+ else
+ cc := dd - (((aa - bb) - 1) div 2)
+ else
+ cc := dd - ((aa - bb) div 2)
+ end;
+ d := mem[p + 2].int;
+ if odd(a - b) then
+ if mem[p].hh.b1 > 4 then
+ c := d - (((a - b) - 1) div 2)
+ else
+ c := d - (((a - b) + 1) div 2)
+ else
+ c := d - ((a - b) div 2) {:445};
+ if b = bb then
+ alpha := 268435456
+ else
+ alpha := makefraction(aa - a, bb - b);
+ if d = dd then
+ beta := 268435456
+ else
+ beta := makefraction(cc - c, dd - d);
+ repeat
+ mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
+ mem[p + 2].int := takefraction(beta, mem[p + 2].int - d) + c;
+ mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
+ mem[p + 6].int := takefraction(beta, mem[p + 6].int - d) + c;
+ p := mem[p].hh.rh;
+ mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a;
+ mem[p + 4].int := takefraction(beta, mem[p + 4].int - d) + c
+ until p = pp
+ end
+ end
+ end {:444}
+ end; {:440} {451:}
+
+ procedure newboundary(p: halfword; octant: smallnumber);
+ var
+ q, r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(7);
+ mem[r].hh.rh := q;
+ mem[p].hh.rh := r;
+ mem[r].hh.b0 := mem[q].hh.b0;
+ mem[r + 3].int := mem[q + 3].int;
+ mem[r + 4].int := mem[q + 4].int;
+ mem[r].hh.b1 := 0;
+ mem[q].hh.b0 := 0;
+ mem[r + 5].int := octant;
+ mem[q + 3].int := mem[q].hh.b1;
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, octant);
+ mem[r + 1].int := curx;
+ mem[r + 2].int := cury
+ end; {:451}
+
+ function makespec(h: halfword; safetymargin: scaled; tracing: integer): halfword;
+ label
+ 22, 30;
+ var
+ p, q, r, s: halfword;
+ k: integer;
+ chopped: boolean; {453:}
+ o1, o2: smallnumber;
+ clockwise: boolean;
+ dx1, dy1, dx2, dy2: integer;
+ dmax, del: integer; {:453}
+ begin
+ curspec := h;
+ if tracing > 0 then
+ printpath(curspec, 426, true);
+ maxallowed := 268402687 - safetymargin; {404:}
+ p := curspec;
+ k := 1;
+ chopped := false;
+ repeat
+ if abs(mem[p + 3].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 3].int > 0 then
+ mem[p + 3].int := maxallowed
+ else
+ mem[p + 3].int := -maxallowed
+ end;
+ if abs(mem[p + 4].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 4].int > 0 then
+ mem[p + 4].int := maxallowed
+ else
+ mem[p + 4].int := -maxallowed
+ end;
+ if abs(mem[p + 1].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 1].int > 0 then
+ mem[p + 1].int := maxallowed
+ else
+ mem[p + 1].int := -maxallowed
+ end;
+ if abs(mem[p + 2].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 2].int > 0 then
+ mem[p + 2].int := maxallowed
+ else
+ mem[p + 2].int := -maxallowed
+ end;
+ if abs(mem[p + 5].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 5].int > 0 then
+ mem[p + 5].int := maxallowed
+ else
+ mem[p + 5].int := -maxallowed
+ end;
+ if abs(mem[p + 6].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 6].int > 0 then
+ mem[p + 6].int := maxallowed
+ else
+ mem[p + 6].int := -maxallowed
+ end;
+ p := mem[p].hh.rh;
+ mem[p].hh.b0 := k;
+ if k < 127 then
+ k := k + 1
+ else
+ k := 1
+ until p = curspec;
+ if chopped then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(430)
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 431;
+ helpline[2] := 432;
+ helpline[1] := 433;
+ helpline[0] := 434
+ end;
+ putgeterror
+ end {:404};
+ quadrantsubdivide;
+ if internal[36] > 0 then
+ xyround;
+ octantsubdivide;
+ if internal[36] > 65536 then
+ diaground; {447:}
+ p := curspec;
+ repeat
+ 22:
+ q := mem[p].hh.rh;
+ if p <> q then begin
+ if mem[p + 1].int = mem[p + 5].int then
+ if mem[p + 2].int = mem[p + 6].int then
+ if mem[p + 1].int = mem[q + 3].int then
+ if mem[p + 2].int = mem[q + 4].int then begin
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ if mem[p + 1].int = curx then
+ if mem[p + 2].int = cury then begin
+ removecubic(p);
+ if q <> curspec then
+ goto 22;
+ curspec := p;
+ q := p
+ end
+ end
+ end;
+ p := q
+ until p = curspec; {:447} {450:}
+ turningnumber := 0;
+ p := curspec;
+ q := mem[p].hh.rh;
+ repeat
+ r := mem[q].hh.rh;
+ if (mem[p].hh.b1 <> mem[q].hh.b1) or (q = r) then begin {452:}
+ newboundary(p, mem[p].hh.b1);
+ s := mem[p].hh.rh;
+ o1 := octantnumber[mem[p].hh.b1];
+ o2 := octantnumber[mem[q].hh.b1];
+ case o2 - o1 of
+ 1, -7, 7, -1:
+ goto 30;
+ 2, -6:
+ clockwise := false;
+ 3, -5, 4, -4, 5, -3:
+ begin {454:} {457:}
+ dx1 := mem[s + 1].int - mem[s + 3].int;
+ dy1 := mem[s + 2].int - mem[s + 4].int;
+ if dx1 = 0 then
+ if dy1 = 0 then begin
+ dx1 := mem[s + 1].int - mem[p + 5].int;
+ dy1 := mem[s + 2].int - mem[p + 6].int;
+ if dx1 = 0 then
+ if dy1 = 0 then begin
+ dx1 := mem[s + 1].int - mem[p + 1].int;
+ dy1 := mem[s + 2].int - mem[p + 2].int
+ end
+ end;
+ dmax := abs(dx1);
+ if abs(dy1) > dmax then
+ dmax := abs(dy1);
+ while dmax < 268435456 do begin
+ dmax := dmax + dmax;
+ dx1 := dx1 + dx1;
+ dy1 := dy1 + dy1
+ end;
+ dx2 := mem[q + 5].int - mem[q + 1].int;
+ dy2 := mem[q + 6].int - mem[q + 2].int;
+ if dx2 = 0 then
+ if dy2 = 0 then begin
+ dx2 := mem[r + 3].int - mem[q + 1].int;
+ dy2 := mem[r + 4].int - mem[q + 2].int;
+ if dx2 = 0 then
+ if dy2 = 0 then begin
+ if mem[r].hh.b1 = 0 then begin
+ curx := mem[r + 1].int;
+ cury := mem[r + 2].int
+ end else begin
+ unskew(mem[r + 1].int, mem[r + 2].int, mem[r].hh.b1);
+ skew(curx, cury, mem[q].hh.b1)
+ end;
+ dx2 := curx - mem[q + 1].int;
+ dy2 := cury - mem[q + 2].int
+ end
+ end;
+ dmax := abs(dx2);
+ if abs(dy2) > dmax then
+ dmax := abs(dy2);
+ while dmax < 268435456 do begin
+ dmax := dmax + dmax;
+ dx2 := dx2 + dx2;
+ dy2 := dy2 + dy2
+ end {:457};
+ unskew(dx1, dy1, mem[p].hh.b1);
+ del := pythadd(curx, cury);
+ dx1 := makefraction(curx, del);
+ dy1 := makefraction(cury, del);
+ unskew(dx2, dy2, mem[q].hh.b1);
+ del := pythadd(curx, cury);
+ dx2 := makefraction(curx, del);
+ dy2 := makefraction(cury, del);
+ del := takefraction(dx1, dy2) - takefraction(dx2, dy1);
+ if del > 4684844 then
+ clockwise := false
+ else if del < (-4684844) then
+ clockwise := true
+ else
+ clockwise := revturns
+ end; {:454}
+ 6, -2:
+ clockwise := true;
+ 0:
+ clockwise := revturns
+ end; {458:}
+ while true do begin
+ if clockwise then
+ if o1 = 1 then
+ o1 := 8
+ else
+ o1 := o1 - 1
+ else if o1 = 8 then
+ o1 := 1
+ else
+ o1 := o1 + 1;
+ if o1 = o2 then
+ goto 30;
+ newboundary(s, octantcode[o1]);
+ s := mem[s].hh.rh;
+ mem[s + 3].int := mem[s + 5].int
+ end {:458};
+ 30:
+ if q = r then begin
+ q := mem[q].hh.rh;
+ r := q;
+ p := s;
+ mem[s].hh.rh := q;
+ mem[q + 3].int := mem[q + 5].int;
+ mem[q].hh.b0 := 0;
+ freenode(curspec, 7);
+ curspec := q
+ end; {459:}
+ p := mem[p].hh.rh;
+ repeat
+ s := mem[p].hh.rh;
+ o1 := octantnumber[mem[p + 5].int];
+ o2 := octantnumber[mem[s + 3].int];
+ if abs(o1 - o2) = 1 then begin
+ if o2 < o1 then
+ o2 := o1;
+ if odd(o2) then
+ mem[p + 6].int := 0
+ else
+ mem[p + 6].int := 1
+ end else begin
+ if o1 = 8 then
+ turningnumber := turningnumber + 1
+ else
+ turningnumber := turningnumber - 1;
+ mem[p + 6].int := 0
+ end;
+ mem[s + 4].int := mem[p + 6].int;
+ p := s
+ until p = q {:459}
+ end {:452};
+ p := q;
+ q := r
+ until p = curspec; {:450}
+ while mem[curspec].hh.b0 <> 0 do
+ curspec := mem[curspec].hh.rh;
+ if tracing > 0 then
+ if internal[36] <= 0 then
+ printspec(427)
+ else if internal[36] > 65536 then
+ printspec(428)
+ else
+ printspec(429);
+ makespec := curspec
+ end; { makespec }
+{:402}
+ {463:}
+
+ procedure endround(x, y: scaled);
+ begin
+ y := (y + 32768) - ycorr[octant];
+ x := (x + y) - xcorr[octant];
+ m1 := floorunscaled(x);
+ n1 := floorunscaled(y);
+ if (x - (65536 * m1)) >= ((y - (65536 * n1)) + zcorr[octant]) then
+ d1 := 1
+ else
+ d1 := 0
+ end; {:463}
+{465:}
+
+ procedure fillspec(h: halfword);
+ var
+ p, q, r, s: halfword;
+ begin
+ if internal[10] > 0 then
+ beginedgetracing;
+ p := h;
+ {------------------------------------}
+ print_start(psfile); { Start cycle }
+ {------------------------------------}
+ repeat
+ octant := mem[p + 3].int; {466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466};
+ if q <> p then begin {467:}
+ endround(mem[p + 1].int, mem[p + 2].int);
+ m0 := m1;
+ n0 := n1;
+ d0 := d1;
+ endround(mem[q + 1].int, mem[q + 2].int) {:467}; {468:}
+ if (n1 - n0) >= movesize then
+ overflow(407, movesize);
+ move[0] := d0;
+ moveptr := 0;
+ r := p;
+ repeat
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int, mem[r + 5].int, mem[s + 3].int, mem[s + 1].int, mem[r + 2].int + 32768, mem[r + 6].int + 32768, mem[s + 4].int + 32768, mem[s + 2].int + 32768, xycorr[octant], ycorr[octant],465,octant);
+ r := s
+ until r = q;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(0, moveptr) {:468};
+ movetoedges(m0, n0, m1, n1)
+ end;
+ p := mem[q].hh.rh
+ until p = h;
+ {------------------------------------}
+ print_end(psfile); { End cycle }
+ {------------------------------------}
+ tossknotlist(h);
+ if internal[10] > 0 then
+ endedgetracing
+ end; {:465} {476:}
+
+ procedure dupoffset(w: halfword);
+ var
+ r: halfword;
+ begin
+ r := getnode(3);
+ mem[r + 1].int := mem[w + 1].int;
+ mem[r + 2].int := mem[w + 2].int;
+ mem[r].hh.rh := mem[w].hh.rh;
+ mem[mem[w].hh.rh].hh.lh := r;
+ mem[r].hh.lh := w;
+ mem[w].hh.rh := r
+ end; {:476} {477:}
+
+ function makepen(h: halfword): halfword;
+ label
+ 30, 31, 45, 40;
+ var
+ o, oo, k: smallnumber;
+ p: halfword;
+ q, r, s, w, hh: halfword;
+ n: integer;
+ dx, dy: scaled;
+ mc: scaled; {479:}
+ begin
+ q := h;
+ r := mem[q].hh.rh;
+ mc := abs(mem[h + 1].int);
+ if q = r then begin
+ hh := h;
+ mem[h].hh.b1 := 0;
+ if mc < abs(mem[h + 2].int) then
+ mc := abs(mem[h + 2].int)
+ end else begin
+ o := 0;
+ hh := -30000;
+ while true do begin
+ s := mem[r].hh.rh;
+ if mc < abs(mem[r + 1].int) then
+ mc := abs(mem[r + 1].int);
+ if mc < abs(mem[r + 2].int) then
+ mc := abs(mem[r + 2].int);
+ dx := mem[r + 1].int - mem[q + 1].int;
+ dy := mem[r + 2].int - mem[q + 2].int;
+ if dx = 0 then
+ if dy = 0 then
+ goto 45;
+ if abvscd(dx, mem[s + 2].int - mem[r + 2].int, dy, mem[s + 1].int - mem[r + 1].int) < 0 then
+ goto 45; {480:}
+ if dx > 0 then
+ octant := 1
+ else if dx = 0 then
+ if dy > 0 then
+ octant := 1
+ else
+ octant := 2
+ else begin
+ dx := -dx;
+ octant := 2
+ end;
+ if dy < 0 then begin
+ dy := -dy;
+ octant := octant + 2
+ end else if dy = 0 then
+ if octant > 1 then
+ octant := 4;
+ if dx < dy then
+ octant := octant + 4 {:480};
+ mem[q].hh.b1 := octant;
+ oo := octantnumber[octant];
+ if o > oo then begin
+ if hh <> (-30000) then
+ goto 45;
+ hh := q
+ end;
+ o := oo;
+ if (q = h) and (hh <> (-30000)) then
+ goto 30;
+ q := r;
+ r := s
+ end;
+ 30: {:479}
+ null
+ end;
+ if mc >= 268402688 then
+ goto 45;
+ p := getnode(10);
+ q := hh;
+ mem[p + 9].int := mc;
+ mem[p].hh.lh := -30000;
+ if mem[q].hh.rh <> q then
+ mem[p].hh.rh := -29999;
+ for k := 1 to 8 do begin {481:}
+ octant := octantcode[k];
+ n := 0;
+ h := p + octant;
+ while true do begin
+ r := getnode(3);
+ skew(mem[q + 1].int, mem[q + 2].int, octant);
+ mem[r + 1].int := curx;
+ mem[r + 2].int := cury;
+ if n = 0 then
+ mem[h].hh.rh := r {482:}
+ else if odd(k) then begin
+ mem[w].hh.rh := r;
+ mem[r].hh.lh := w
+ end else begin
+ mem[w].hh.lh := r;
+ mem[r].hh.rh := w
+ end {:482};
+ w := r;
+ if mem[q].hh.b1 <> octant then
+ goto 31;
+ q := mem[q].hh.rh;
+ n := n + 1
+ end;
+ 31: {483:}
+ r := mem[h].hh.rh;
+ if odd(k) then begin
+ mem[w].hh.rh := r;
+ mem[r].hh.lh := w
+ end else begin
+ mem[w].hh.lh := r;
+ mem[r].hh.rh := w;
+ mem[h].hh.rh := w;
+ r := w
+ end;
+ if (mem[r + 2].int <> mem[mem[r].hh.rh + 2].int) or (n = 0) then begin
+ dupoffset(r);
+ n := n + 1
+ end;
+ r := mem[r].hh.lh;
+ {:
+ 483}
+ if mem[r + 1].int <> mem[mem[r].hh.lh + 1].int then
+ dupoffset(r)
+ else
+ n := n - 1;
+ if n >= 127 then
+ overflow(446, 127);
+ mem[h].hh.lh := n
+ end {:481};
+ goto 40;
+ 45:
+ p := -29997; {478:}
+ if mc >= 268402688 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(440)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 441;
+ helpline[0] := 442
+ end
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(443)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 444;
+ helpline[1] := 445;
+ helpline[0] := 442
+ end
+ end; {:478}
+ putgeterror;
+ 40:
+ if internal[6] > 0 then
+ printpen(p, 439, true);
+ makepen := p
+ end; {:477} {484:} {486:}
+
+ function trivialknot(x, y: scaled): halfword;
+ var
+ p: halfword;
+ begin
+ p := getnode(7);
+ mem[p].hh.b0 := 1;
+ mem[p].hh.b1 := 1;
+ mem[p + 1].int := x;
+ mem[p + 3].int := x;
+ mem[p + 5].int := x;
+ mem[p + 2].int := y;
+ mem[p + 4].int := y;
+ mem[p + 6].int := y;
+ trivialknot := p
+ end; {:486}
+
+ function makepath(penhead: halfword): halfword;
+ var
+ p: halfword;
+ k: 1..8;
+ h: halfword;
+ m, n: integer;
+ w, ww: halfword;
+ begin
+ p := 29999;
+ for k := 1 to 8 do begin
+ octant := octantcode[k];
+ h := penhead + octant;
+ n := mem[h].hh.lh;
+ w := mem[h].hh.rh;
+ if not odd(k) then
+ w := mem[w].hh.lh;
+ for m := 1 to n + 1 do begin
+ if odd(k) then
+ ww := mem[w].hh.rh
+ else
+ ww := mem[w].hh.lh;
+ if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {485:}
+ unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
+ mem[p].hh.rh := trivialknot(curx, cury);
+ p := mem[p].hh.rh
+ end {:485};
+ w := ww
+ end
+ end;
+ if p = 29999 then begin
+ w := mem[penhead + 1].hh.rh;
+ p := trivialknot(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int);
+ mem[29999].hh.rh := p
+ end;
+ mem[p].hh.rh := mem[29999].hh.rh;
+ makepath := mem[29999].hh.rh
+ end; {:484} {488:}
+
+ procedure findoffset(x, y: scaled; p: halfword);
+ label
+ 30, 10;
+ var
+ octant: 1..8;
+ s: -1..+1;
+ n: integer;
+ h, w, ww: halfword; {489:}
+ begin
+ if x > 0 then
+ octant := 1
+ else if x = 0 then
+ if y <= 0 then
+ if y = 0 then begin
+ curx := 0;
+ cury := 0;
+ goto 10
+ end else
+ octant := 2
+ else
+ octant := 1
+ else begin
+ x := -x;
+ if y = 0 then
+ octant := 4
+ else
+ octant := 2
+ end;
+ if y < 0 then begin
+ octant := octant + 2;
+ y := -y
+ end;
+ if x >= y then
+ x := x - y
+ else begin
+ octant := octant + 4;
+ x := y - x;
+ y := y - x
+ end {:489};
+ if odd(octantnumber[octant]) then
+ s := -1
+ else
+ s := +1;
+ h := p + octant;
+ w := mem[mem[h].hh.rh].hh.rh;
+ ww := mem[w].hh.rh;
+ n := mem[h].hh.lh;
+ while n > 1 do begin
+ if abvscd(x, mem[ww + 2].int - mem[w + 2].int, y, mem[ww + 1].int - mem[w + 1].int) <> s then
+ goto 30;
+ w := ww;
+ ww := mem[w].hh.rh;
+ n := n - 1
+ end;
+ 30:
+ unskew(mem[w + 1].int, mem[w + 2].int, octant);
+ 10:
+ null
+ end; {:488} {491:} {493:}
+
+ procedure splitforoffset(p: halfword; t: fraction);
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ splitcubic(p, t, mem[q + 1].int, mem[q + 2].int);
+ r := mem[p].hh.rh;
+ if mem[r + 2].int < mem[p + 2].int then
+ mem[r + 2].int := mem[p + 2].int
+ else if mem[r + 2].int > mem[q + 2].int then
+ mem[r + 2].int := mem[q + 2].int;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int
+ else if mem[r + 1].int > mem[q + 1].int then
+ mem[r + 1].int := mem[q + 1].int
+ end; {:493} {497:}
+
+ procedure finoffsetprep(p: halfword; k: halfword; w: halfword; x0, x1, x2, y0, y1, y2: integer; rising: boolean; n: integer);
+ label
+ 10;
+ var
+ q, ww: halfword;
+ du, dv: scaled;
+ t0, t1, t2: integer;
+ t: fraction;
+ s: fraction;
+ v: integer;
+ begin
+ while true do begin
+ q := mem[p].hh.rh;
+ mem[p].hh.b1 := k;
+ if rising then
+ if k = n then
+ goto 10
+ else
+ ww := mem[w].hh.rh
+ else if k = 1 then
+ goto 10
+ else
+ ww := mem[w].hh.lh; {498:}
+ du := mem[ww + 1].int - mem[w + 1].int;
+ dv := mem[ww + 2].int - mem[w + 2].int;
+ if abs(du) >= abs(dv) then begin
+ s := makefraction(dv, du);
+ t0 := takefraction(x0, s) - y0;
+ t1 := takefraction(x1, s) - y1;
+ t2 := takefraction(x2, s) - y2
+ end else begin
+ s := makefraction(du, dv);
+ t0 := x0 - takefraction(y0, s);
+ t1 := x1 - takefraction(y1, s);
+ t2 := x2 - takefraction(y2, s)
+ end {:498};
+ t := crossingpoint(t0, t1, t2);
+ if t >= 268435456 then
+ goto 10; {499:}
+ begin
+ splitforoffset(p, t);
+ mem[p].hh.b1 := k;
+ p := mem[p].hh.rh;
+ v := x0 - takefraction(x0 - x1, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x0 := v - takefraction(v - x1, t);
+ v := y0 - takefraction(y0 - y1, t);
+ y1 := y1 - takefraction(y1 - y2, t);
+ y0 := v - takefraction(v - y1, t);
+ t1 := t1 - takefraction(t1 - t2, t);
+ if t1 > 0 then
+ t1 := 0;
+ t := crossingpoint(0, -t1, -t2);
+ if t < 268435456 then begin
+ splitforoffset(p, t);
+ mem[mem[p].hh.rh].hh.b1 := k;
+ v := x1 - takefraction(x1 - x2, t);
+ x1 := x0 - takefraction(x0 - x1, t);
+ x2 := x1 - takefraction(x1 - v, t);
+ v := y1 - takefraction(y1 - y2, t);
+ y1 := y0 - takefraction(y0 - y1, t);
+ y2 := y1 - takefraction(y1 - v, t)
+ end
+ end {:499};
+ if rising then
+ k := k + 1
+ else
+ k := k - 1;
+ w := ww
+ end;
+ 10:
+ null
+ end; {:497}
+
+ procedure offsetprep(c, h: halfword);
+ label
+ 30, 45;
+ var
+ n: halfword;
+ p, q, r, lh, ww: halfword;
+ k: halfword;
+ w: halfword; {495:}
+ x0, x1, x2, y0, y1, y2: integer;
+ t0, t1, t2: integer;
+ du, dv, dx, dy: integer;
+ maxcoef: integer;
+ x0a, x1a, x2a, y0a, y1a, y2a: integer;
+ t: fraction;
+ s: fraction;
+{:495}
+ begin
+ p := c;
+ n := mem[h].hh.lh;
+ lh := mem[h].hh.rh;
+ while mem[p].hh.b1 <> 0 do begin
+ q := mem[p].hh.rh; {494:}
+ if n <= 1 then
+ mem[p].hh.b1 := 1
+ else begin {496:}
+ x0 := mem[p + 5].int - mem[p + 1].int;
+ x2 := mem[q + 1].int - mem[q + 3].int;
+ x1 := mem[q + 3].int - mem[p + 5].int;
+ y0 := mem[p + 6].int - mem[p + 2].int;
+ y2 := mem[q + 2].int - mem[q + 4].int;
+ y1 := mem[q + 4].int - mem[p + 6].int;
+ maxcoef := abs(x0);
+ if abs(x1) > maxcoef then
+ maxcoef := abs(x1);
+ if abs(x2) > maxcoef then
+ maxcoef := abs(x2);
+ if abs(y0) > maxcoef then
+ maxcoef := abs(y0);
+ if abs(y1) > maxcoef then
+ maxcoef := abs(y1);
+ if abs(y2) > maxcoef then
+ maxcoef := abs(y2);
+ if maxcoef = 0 then
+ goto 45;
+ while maxcoef < 268435456 do begin
+ maxcoef := maxcoef + maxcoef;
+ x0 := x0 + x0;
+ x1 := x1 + x1;
+ x2 := x2 + x2;
+ y0 := y0 + y0;
+ y1 := y1 + y1;
+ y2 := y2 + y2
+ end {:496}; {501:}
+ dx := x0;
+ dy := y0;
+ if dx = 0 then
+ if dy = 0 then begin
+ dx := x1;
+ dy := y1;
+ if dx = 0 then
+ if dy = 0 then begin
+ dx := x2;
+ dy := y2
+ end
+ end {:501};
+ if dx = 0 then {505:}
+ finoffsetprep(p, n, mem[mem[lh].hh.lh].hh.lh, -x0, -x1, -x2, -y0, -y1, -y2, false, n) {:505}
+ else begin {502:}
+ k := 1;
+ w := mem[lh].hh.rh;
+ while true do begin
+ if k = n then
+ goto 30;
+ ww := mem[w].hh.rh;
+ if abvscd(dy, abs(mem[ww + 1].int - mem[w + 1].int), dx, abs(mem[ww + 2].int - mem[w + 2].int)) >= 0 then begin
+ k := k + 1;
+ w := ww
+ end else
+ goto 30
+ end;
+ 30: {:502}
+ null;
+{503:}
+ if k = 1 then
+ t := 268435457
+ else begin
+ ww := mem[w].hh.lh; {498:}
+ du := mem[ww + 1].int - mem[w + 1].int;
+ dv := mem[ww + 2].int - mem[w + 2].int;
+ if abs(du) >= abs(dv) then begin
+ s := makefraction(dv, du);
+ t0 := takefraction(x0, s) - y0;
+ t1 := takefraction(x1, s) - y1;
+ t2 := takefraction(x2, s) - y2
+ end else begin
+ s := makefraction(du, dv);
+ t0 := x0 - takefraction(y0, s);
+ t1 := x1 - takefraction(y1, s);
+ t2 := x2 - takefraction(y2, s)
+ end {:498};
+ t := crossingpoint(-t0, -t1, -t2)
+ end;
+ if t >= 268435456 then
+ finoffsetprep(p, k, w, x0, x1, x2, y0, y1, y2, true, n)
+ else begin
+ splitforoffset(p, t);
+ r := mem[p].hh.rh;
+ x1a := x0 - takefraction(x0 - x1, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2a := x1a - takefraction(x1a - x1, t);
+ y1a := y0 - takefraction(y0 - y1, t);
+ y1 := y1 - takefraction(y1 - y2, t);
+ y2a := y1a - takefraction(y1a - y1, t);
+ finoffsetprep(p, k, w, x0, x1a, x2a, y0, y1a, y2a, true, n);
+ x0 := x2a;
+ y0 := y2a;
+ t1 := t1 - takefraction(t1 - t2, t);
+ if t1 < 0 then
+ t1 := 0;
+ t := crossingpoint(0, t1, t2);
+ if t < 268435456 then begin {504:}
+ splitforoffset(r, t);
+ x1a := x1 - takefraction(x1 - x2, t);
+ x1 := x0 - takefraction(x0 - x1, t);
+ x0a := x1 - takefraction(x1 - x1a, t);
+ y1a := y1 - takefraction(y1 - y2, t);
+ y1 := y0 - takefraction(y0 - y1, t);
+ y0a := y1 - takefraction(y1 - y1a, t);
+ finoffsetprep(mem[r].hh.rh, k, w, x0a, x1a, x2, y0a, y1a, y2, true, n);
+ x2 := x0a;
+ y2 := y0a
+ end {:504};
+ finoffsetprep(r, k - 1, ww, -x0, -x1, -x2, -y0, -y1, -y2, false, n)
+ end {:503}
+ end;
+ 45: {:494}
+ null
+ end; {492:}
+ repeat
+ r := mem[p].hh.rh;
+ if mem[p + 1].int = mem[p + 5].int then
+ if mem[p + 2].int = mem[p + 6].int then
+ if mem[p + 1].int = mem[r + 3].int then
+ if mem[p + 2].int = mem[r + 4].int then
+ if mem[p + 1].int = mem[r + 1].int then
+ if mem[p + 2].int = mem[r + 2].int then begin
+ removecubic(p);
+ if r = q then
+ q := p;
+ r := p
+ end;
+ p := r
+ until p = q {:492}
+ end
+ end; { offsetprep }
+{:491}
+ {506:}
+ {510:}
+
+ procedure skewlineedges(p, w, ww: halfword);
+ var
+ x0, y0, x1, y1: scaled;
+ begin
+ if (mem[w + 1].int <> mem[ww + 1].int) or (mem[w + 2].int <> mem[ww + 2].int) then begin
+ x0 := mem[p + 1].int + mem[w + 1].int;
+ y0 := mem[p + 2].int + mem[w + 2].int;
+ x1 := mem[p + 1].int + mem[ww + 1].int;
+ y1 := mem[p + 2].int + mem[ww + 2].int;
+ {-------------------------------------}
+ sendline(x0,y0,x1,y1,octant,510);
+ {-------------------------------------}
+ unskew(x0, y0, octant);
+ x0 := curx;
+ y0 := cury;
+ unskew(x1, y1, octant);
+{if internal[10]>65536 then begin printnl(451);printtwo(x0,y0);
+print(450);printtwo(curx,cury);printnl(155);end;}
+ lineedges(x0, y0, curx, cury)
+ end
+ end; {:510} {518:}
+
+ procedure dualmoves(h, p, q: halfword);
+ label
+ 30, 31;
+ var
+ r, s: halfword; {511:}
+ m, n: integer;
+ mm0, mm1: integer;
+ k: integer;
+ w, ww: halfword;
+ smoothbot, smoothtop: 0..movesize;
+ xx, yy, xp, yp, delx, dely, tx, ty: scaled;
+{:511} {519:}
+ begin
+ k := mem[h].hh.lh + 1;
+ ww := mem[h].hh.rh;
+ w := mem[ww].hh.lh;
+ mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
+ mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
+ for n := 1 to (n1 - n0) + 1 do
+ envmove[n] := mm1;
+ envmove[0] := mm0;
+ moveptr := 0;
+ m := mm0 {:519};
+ r := p;
+ while true do begin
+ if r = q then
+ smoothtop := moveptr;
+ while mem[r].hh.b1 <> k do begin {521:}
+ xx := mem[r + 1].int + mem[w + 1].int;
+ yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
+{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
+unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
+ {------------}
+ my_xx := xx;
+ my_yy := yy;
+ {------------}
+ if mem[r].hh.b1 < k then begin
+ k := k - 1;
+ w := mem[w].hh.lh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ if yp <> yy then begin {522:}
+ ty := floorscaled(yy - ycorr[octant]);
+ dely := yp - yy;
+ yy := yy - ty;
+ ty := (yp - ycorr[octant]) - ty;
+ if ty >= 65536 then begin
+ delx := xp - xx;
+ yy := 65536 - yy;
+ while true do begin
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m;
+ tx := takefraction(delx, makefraction(yy, dely));
+ if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
+ tx := tx - 1;
+ m := floorunscaled(xx + tx);
+ ty := ty - 65536;
+ moveptr := moveptr + 1;
+ if ty < 65536 then
+ goto 31;
+ yy := yy + 65536
+ end;
+ 31:
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m
+ end
+ end {:522}
+ end else begin
+ k := k + 1;
+ w := mem[w].hh.rh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ end;
+{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
+printtwo(curx,cury);printnl(155);end;}
+ {---------------------------------------------------}
+ sendline(my_xx,my_yy-32768,xp,yp-32768,octant,521);
+ {---------------------------------------------------}
+ m := floorunscaled(xp - xycorr[octant]);
+ moveptr := floorunscaled(yp - ycorr[octant]) - n0;
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m
+ end {:521};
+ if r = p then
+ smoothbot := moveptr;
+ if r = q then
+ goto 30;
+ move[moveptr] := 1;
+ n := moveptr;
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],518,octant); {520:}
+ repeat
+ if m < envmove[n] then
+ envmove[n] := m;
+ m := (m + move[n]) - 1;
+ n := n + 1
+ until n > moveptr {:520};
+ r := s
+ end;
+ 30: {523:}
+{if(m<>mm1)or(moveptr<>n1-n0)then confusion(50);}
+ move[0] := (d0 + envmove[1]) - mm0;
+ for n := 1 to moveptr do
+ move[n] := (envmove[n + 1] - envmove[n]) + 1;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(smoothbot, smoothtop);
+ movetoedges(m0, n0, m1, n1);
+ if mem[q + 6].int = 1 then begin
+ w := mem[h].hh.rh;
+ skewlineedges(q, w, mem[w].hh.lh)
+ end {:523}
+ end; {:518}
+
+ procedure fillenvelope(spechead: halfword);
+ label
+ 30, 31;
+ var
+ p, q, r, s: halfword;
+ h: halfword;
+ www: halfword; {511:}
+ m, n: integer;
+ mm0, mm1: integer;
+ k: integer;
+ w, ww: halfword;
+ smoothbot, smoothtop: 0..movesize;
+ xx, yy, xp, yp, delx, dely, tx, ty: scaled; {:511}
+ begin
+ if internal[10] > 0 then
+ beginedgetracing;
+ {------------------------------------}
+ print_start(psfile); { Start cycle }
+ {------------------------------------}
+ p := spechead;
+ repeat
+ octant := mem[p + 3].int;
+ h := curpen + octant; {466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466}; {508:}
+ w := mem[h].hh.rh;
+ if mem[p + 4].int = 1 then
+ w := mem[w].hh.lh;
+{if internal[10]>65536 then[509:]begin printnl(447);
+print(octantdir[octant]);print(425);printint(mem[h].hh.lh);print(448);
+if mem[h].hh.lh<>1 then printchar(115);print(449);
+unskew(mem[p+1].int+mem[w+1].int,mem[p+2].int+mem[w+2].int,octant);
+printtwo(curx,cury);ww:=mem[h].hh.rh;
+if mem[q+6].int=1 then ww:=mem[ww].hh.lh;print(450);
+unskew(mem[q+1].int+mem[ww+1].int,mem[q+2].int+mem[ww+2].int,octant);
+printtwo(curx,cury);end[:509];}
+ ww := mem[h].hh.rh;
+ www := ww;
+ if odd(octantnumber[octant]) then
+ www := mem[www].hh.lh
+ else
+ ww := mem[ww].hh.lh;
+ if w <> ww then
+ skewlineedges(p, w, ww);
+ endround(mem[p + 1].int + mem[ww + 1].int, mem[p + 2].int + mem[ww + 2].int);
+ m0 := m1;
+ n0 := n1;
+ d0 := d1;
+ endround(mem[q + 1].int + mem[www + 1].int, mem[q + 2].int + mem[www + 2].int);
+ if (n1 - n0) >= movesize then
+ overflow(407, movesize) {:508};
+ offsetprep(p, h);
+{466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466}; {512:}
+ if odd(octantnumber[octant]) then begin {513:}
+ k := 0;
+ w := mem[h].hh.rh;
+ ww := mem[w].hh.lh;
+ mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
+ mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
+ for n := 0 to n1 - n0 do
+ envmove[n] := mm0;
+ envmove[n1 - n0] := mm1;
+ moveptr := 0;
+ m := mm0 {:513};
+ r := p;
+ mem[q].hh.b1 := mem[h].hh.lh + 1;
+ while true do begin
+ if r = q then
+ smoothtop := moveptr;
+ while mem[r].hh.b1 <> k do begin {515:}
+ xx := mem[r + 1].int + mem[w + 1].int;
+ yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
+{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
+unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
+ {------------}
+ my_xx := xx;
+ my_yy := yy;
+ {------------}
+ if mem[r].hh.b1 > k then begin
+ k := k + 1;
+ w := mem[w].hh.rh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ if yp <> yy then begin {516:}
+ ty := floorscaled(yy - ycorr[octant]);
+ dely := yp - yy;
+ yy := yy - ty;
+ ty := (yp - ycorr[octant]) - ty;
+ if ty >= 65536 then begin
+ delx := xp - xx;
+ yy := 65536 - yy;
+ while true do begin
+ tx := takefraction(delx, makefraction(yy, dely));
+ if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
+ tx := tx - 1;
+ m := floorunscaled(xx + tx);
+ if m > envmove[moveptr] then
+ envmove[moveptr] := m;
+ ty := ty - 65536;
+ if ty < 65536 then
+ goto 31;
+ yy := yy + 65536;
+ moveptr := moveptr + 1
+ end;
+ 31:
+ null
+ end
+ end {:516}
+ end else begin
+ k := k - 1;
+ w := mem[w].hh.lh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ end;
+{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
+printtwo(curx,cury);printnl(155);end;}
+ {---------------------------------------------------}
+ sendline(my_xx,my_yy-32768,xp,yp-32768,octant,515);
+ {---------------------------------------------------}
+ m := floorunscaled(xp - xycorr[octant]);
+ moveptr := floorunscaled(yp - ycorr[octant]) - n0;
+ if m > envmove[moveptr] then
+ envmove[moveptr] := m
+ end {:515};
+ if r = p then
+ smoothbot := moveptr;
+ if r = q then
+ goto 30;
+ move[moveptr] := 1;
+ n := moveptr;
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],512,octant); {514:}
+ repeat
+ m := (m + move[n]) - 1;
+ if m > envmove[n] then
+ envmove[n] := m;
+ n := n + 1
+ until n > moveptr {:514};
+ r := s
+ end;
+ 30: {517:}
+{if(m<>mm1)or(moveptr<>n1-n0)then confusion(49);}
+ move[0] := (d0 + envmove[0]) - mm0;
+ for n := 1 to moveptr do
+ move[n] := (envmove[n] - envmove[n - 1]) + 1;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(smoothbot, smoothtop);
+ movetoedges(m0, n0, m1, n1);
+ if mem[q + 6].int = 0 then begin
+ w := mem[h].hh.rh;
+ skewlineedges(q, mem[w].hh.lh, w)
+ end {:517}
+ end else
+ dualmoves(h, p, q);
+ mem[q].hh.b1 := 0 {:512};
+ p := mem[q].hh.rh
+ until p = spechead;
+ {------------------------------------}
+ print_end(psfile); { End cycle }
+ {------------------------------------}
+ if internal[10] > 0 then
+ endedgetracing;
+ tossknotlist(spechead)
+ end; {:506}
+{527:}
+
+ function makeellipse(majoraxis, minoraxis: scaled; theta: angle): halfword;
+ label
+ 30, 31, 40;
+ var
+ p, q, r, s: halfword;
+ h: halfword;
+ alpha, beta, gamma, delta: integer;
+ c, d: integer;
+ u, v: integer;
+ symmetric: boolean; {528:}
+ begin {530:}
+ if (majoraxis = minoraxis) or ((theta mod 94371840) = 0) then begin
+ symmetric := true;
+ alpha := 0;
+ if odd(theta div 94371840) then begin
+ beta := majoraxis;
+ gamma := minoraxis;
+ nsin := 268435456;
+ ncos := 0
+ end else begin
+ beta := minoraxis;
+ gamma := majoraxis
+ end
+ end else begin
+ symmetric := false;
+ nsincos(theta);
+ gamma := takefraction(majoraxis, nsin);
+ delta := takefraction(minoraxis, ncos);
+ beta := pythadd(gamma, delta);
+ alpha := takefraction(takefraction(majoraxis, makefraction(gamma, beta)), ncos) - takefraction(takefraction(minoraxis, makefraction(delta, beta)), nsin);
+ alpha := (alpha + 32768) div 65536;
+ gamma := pythadd(takefraction(majoraxis, ncos), takefraction(minoraxis, nsin))
+ end;
+ beta := (beta + 32768) div 65536;
+ gamma := (gamma + 32768) div 65536 {:530};
+ p := getnode(7);
+ q := getnode(7);
+ r := getnode(7);
+ if symmetric then
+ s := -30000
+ else
+ s := getnode(7);
+ h := p;
+ mem[p].hh.rh := q;
+ mem[q].hh.rh := r;
+ mem[r].hh.rh := s; {529:}
+ if beta = 0 then
+ beta := 1;
+ if gamma = 0 then
+ gamma := 1;
+ if gamma <= abs(alpha) then
+ if alpha > 0 then
+ alpha := gamma - 1
+ else
+ alpha := 1 - gamma {:529};
+ mem[p + 1].int := -(alpha * 32768);
+ mem[p + 2].int := -(beta * 32768);
+ mem[q + 1].int := gamma * 32768;
+ mem[q + 2].int := mem[p + 2].int;
+ mem[r + 1].int := mem[q + 1].int;
+ mem[p + 5].int := 0;
+ mem[q + 3].int := -32768;
+ mem[q + 5].int := 32768;
+ mem[r + 3].int := 0;
+ mem[r + 5].int := 0;
+ mem[p + 6].int := beta;
+ mem[q + 6].int := gamma;
+ mem[r + 6].int := beta;
+ mem[q + 4].int := gamma + alpha;
+ if symmetric then begin
+ mem[r + 2].int := 0;
+ mem[r + 4].int := beta
+ end else begin
+ mem[r + 2].int := -mem[p + 2].int;
+ mem[r + 4].int := beta + beta;
+ mem[s + 1].int := -mem[p + 1].int;
+ mem[s + 2].int := mem[r + 2].int;
+ mem[s + 3].int := 32768;
+ mem[s + 4].int := gamma - alpha
+ end {:528}; {531:}
+ while true do begin
+ u := mem[p + 5].int + mem[q + 5].int;
+ v := mem[q + 3].int + mem[r + 3].int;
+ c := mem[p + 6].int + mem[q + 6].int; {533:}
+ delta := pythadd(u, v);
+ if majoraxis = minoraxis then
+ d := majoraxis
+ else begin
+ if theta = 0 then begin
+ alpha := u;
+ beta := v
+ end else begin
+ alpha := takefraction(u, ncos) + takefraction(v, nsin);
+ beta := takefraction(v, ncos) - takefraction(u, nsin)
+ end;
+ alpha := makefraction(alpha, delta);
+ beta := makefraction(beta, delta);
+ d := pythadd(takefraction(majoraxis, alpha), takefraction(minoraxis, beta))
+ end;
+ d := takefraction(d, delta);
+ alpha := abs(u);
+ beta := abs(v);
+ if alpha < beta then begin
+ delta := alpha;
+ alpha := beta;
+ beta := delta
+ end;
+ if internal[38] <> 0 then
+ d := d - takefraction(internal[38], beta + beta);
+ d := (d + 4) div 8;
+ alpha := alpha div 32768;
+ if d < alpha then
+ d := alpha {:533};
+ delta := c - d;
+ if delta > 0 then begin
+ if delta > mem[r + 4].int then
+ delta := mem[r + 4].int;
+ if delta >= mem[q + 4].int then begin {534:}
+ delta := mem[q + 4].int;
+ mem[p + 6].int := c - delta;
+ mem[p + 5].int := u;
+ mem[q + 3].int := v;
+ mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
+ mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
+ mem[r + 4].int := mem[r + 4].int - delta
+ end else begin {:534} {535:}
+ s := getnode(7);
+ mem[p].hh.rh := s;
+ mem[s].hh.rh := q;
+ mem[s + 1].int := mem[q + 1].int + (delta * mem[q + 3].int);
+ mem[s + 2].int := mem[q + 2].int - (delta * mem[p + 5].int);
+ mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
+ mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
+ mem[s + 3].int := mem[q + 3].int;
+ mem[s + 5].int := u;
+ mem[q + 3].int := v;
+ mem[s + 6].int := c - delta;
+ mem[s + 4].int := mem[q + 4].int - delta;
+ mem[q + 4].int := delta;
+ mem[r + 4].int := mem[r + 4].int - delta
+ end {:535}
+ end else
+ p := q; {532:}
+ while true do begin
+ q := mem[p].hh.rh;
+ if q = (-30000) then
+ goto 30;
+ if mem[q + 4].int = 0 then begin
+ mem[p].hh.rh := mem[q].hh.rh;
+ mem[p + 6].int := mem[q + 6].int;
+ mem[p + 5].int := mem[q + 5].int;
+ freenode(q, 7)
+ end else begin
+ r := mem[q].hh.rh;
+ if r = (-30000) then
+ goto 30;
+ if mem[r + 4].int = 0 then begin
+ mem[p].hh.rh := r;
+ freenode(q, 7);
+ p := r
+ end else
+ goto 40
+ end
+ end;
+ 40: {:532}
+ null
+ end;
+ 30: {:531}
+ null;
+ if symmetric then begin {536:}
+ s := -30000;
+ q := h;
+ while true do begin
+ r := getnode(7);
+ mem[r].hh.rh := s;
+ s := r;
+ mem[s + 1].int := mem[q + 1].int;
+ mem[s + 2].int := -mem[q + 2].int;
+ if q = p then
+ goto 31;
+ q := mem[q].hh.rh;
+ if mem[q + 2].int = 0 then
+ goto 31
+ end;
+ 31:
+ mem[p].hh.rh := s;
+ beta := -mem[h + 2].int;
+ while mem[p + 2].int <> beta do
+ p := mem[p].hh.rh;
+ q := mem[p].hh.rh
+ end {:536};
+{537:}
+ if q <> (-30000) then begin
+ if mem[h + 5].int = 0 then begin
+ p := h;
+ h := mem[h].hh.rh;
+ freenode(p, 7);
+ mem[q + 1].int := -mem[h + 1].int
+ end;
+ p := q
+ end else
+ q := p;
+ r := mem[h].hh.rh;
+ repeat
+ s := getnode(7);
+ mem[p].hh.rh := s;
+ p := s;
+ mem[p + 1].int := -mem[r + 1].int;
+ mem[p + 2].int := -mem[r + 2].int;
+ r := mem[r].hh.rh
+ until r = q;
+ mem[p].hh.rh := h {:537};
+ makeellipse := h
+ end; {:527} {539:}
+
+ function finddirectiontime(x, y: scaled; h: halfword): scaled;
+ label
+ 10, 40, 45, 30;
+ var
+ max: scaled;
+ p, q: halfword;
+ n: scaled;
+ tt: scaled; {542:}
+ x1, x2, x3, y1, y2, y3: scaled;
+ theta, phi: angle;
+ t: fraction; {:542} {540:}
+ begin
+ if abs(x) < abs(y) then begin
+ x := makefraction(x, abs(y));
+ if y > 0 then
+ y := 268435456
+ else
+ y := -268435456
+ end else if x = 0 then begin
+ finddirectiontime := 0;
+ goto 10
+ end else begin
+ y := makefraction(y, abs(x));
+ if x > 0 then
+ x := 268435456
+ else
+ x := -268435456
+ end {:540};
+ n := 0;
+ p := h;
+ while true do begin
+ if mem[p].hh.b1 = 0 then
+ goto 45;
+ q := mem[p].hh.rh;
+{541:}
+ tt := 0; {543:}
+ x1 := mem[p + 5].int - mem[p + 1].int;
+ x2 := mem[q + 3].int - mem[p + 5].int;
+ x3 := mem[q + 1].int - mem[q + 3].int;
+ y1 := mem[p + 6].int - mem[p + 2].int;
+ y2 := mem[q + 4].int - mem[p + 6].int;
+ y3 := mem[q + 2].int - mem[q + 4].int;
+ max := abs(x1);
+ if abs(x2) > max then
+ max := abs(x2);
+ if abs(x3) > max then
+ max := abs(x3);
+ if abs(y1) > max then
+ max := abs(y1);
+ if abs(y2) > max then
+ max := abs(y2);
+ if abs(y3) > max then
+ max := abs(y3);
+ if max = 0 then
+ goto 40;
+ while max < 134217728 do begin
+ max := max + max;
+ x1 := x1 + x1;
+ x2 := x2 + x2;
+ x3 := x3 + x3;
+ y1 := y1 + y1;
+ y2 := y2 + y2;
+ y3 := y3 + y3
+ end;
+ t := x1;
+ x1 := takefraction(x1, x) + takefraction(y1, y);
+ y1 := takefraction(y1, x) - takefraction(t, y);
+ t := x2;
+ x2 := takefraction(x2, x) + takefraction(y2, y);
+ y2 := takefraction(y2, x) - takefraction(t, y);
+ t := x3;
+ x3 := takefraction(x3, x) + takefraction(y3, y);
+ y3 := takefraction(y3, x) - takefraction(t, y) {:543};
+ if y1 = 0 then
+ if x1 >= 0 then
+ goto 40;
+ if n > 0 then begin {544:}
+ theta := narg(x1, y1);
+ if theta >= 0 then
+ if phi <= 0 then
+ if phi >= (theta - 188743680) then
+ goto 40;
+ {:
+ 544}
+ if theta <= 0 then
+ if phi >= 0 then
+ if phi <= (theta + 188743680) then
+ goto 40;
+ if p = h then
+ goto 45
+ end;
+ if (x3 <> 0) or (y3 <> 0) then
+ phi := narg(x3, y3);
+{546:}
+ if x1 < 0 then
+ if x2 < 0 then
+ if x3 < 0 then
+ goto 30;
+ if abvscd(y1, y3, y2, y2) = 0 then begin {548:}
+ if abvscd(y1, y2, 0, 0) < 0 then begin
+ t := makefraction(y1, y1 - y2);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end else if y3 = 0 then
+ if y1 = 0 then begin {549:}
+ t := crossingpoint(-x1, -x2, -x3);
+ if t <= 268435456 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end;
+ if abvscd(x1, x3, x2, x2) <= 0 then begin
+ t := makefraction(x1, x1 - x2);
+ begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end
+ end else if x3 >= 0 then begin {:549}
+ tt := 65536;
+ goto 40
+ end;
+ goto 30
+ end {:548};
+ if y1 <= 0 then
+ if y1 < 0 then begin
+ y1 := -y1;
+ y2 := -y2;
+ y3 := -y3
+ end else if y2 > 0 then begin
+ y2 := -y2;
+ y3 := -y3
+ end; {547:}
+ t := crossingpoint(y1, y2, y3);
+ if t > 268435456 then
+ goto 30;
+ y2 := y2 - takefraction(y2 - y3, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ if x1 >= 0 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end;
+ if y2 > 0 then
+ y2 := 0;
+ tt := t;
+ t := crossingpoint(0, -y2, -y3);
+ if t > 268435456 then
+ goto 30;
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
+ t := tt - takefraction(tt - 268435456, t);
+ begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end {:547};
+ 30: {:546}
+{:541}
+ null;
+ p := q;
+ n := n + 65536
+ end;
+ 45:
+ finddirectiontime := -65536;
+ goto 10;
+ 40:
+ finddirectiontime := n + tt;
+ 10:
+ null
+ end; {:539} {556:}
+
+ procedure cubicintersection(p, pp: halfword);
+ label
+ 22, 45, 10;
+ var
+ q, qq: halfword;
+ begin
+ timetogo := 5000;
+ maxt := 2; {558:}
+ q := mem[p].hh.rh;
+ qq := mem[pp].hh.rh;
+ bisectptr := 20;
+ bisectstack[bisectptr - 5] := mem[p + 5].int - mem[p + 1].int;
+ bisectstack[bisectptr - 4] := mem[q + 3].int - mem[p + 5].int;
+ bisectstack[bisectptr - 3] := mem[q + 1].int - mem[q + 3].int;
+ if bisectstack[bisectptr - 5] < 0 then
+ if bisectstack[bisectptr - 3] >= 0 then begin
+ if bisectstack[bisectptr - 4] < 0 then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end else begin
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end
+ else if bisectstack[bisectptr - 3] <= 0 then begin
+ if bisectstack[bisectptr - 4] > 0 then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end else begin
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end;
+ bisectstack[bisectptr - 10] := mem[p + 6].int - mem[p + 2].int;
+ bisectstack[bisectptr - 9] := mem[q + 4].int - mem[p + 6].int;
+ bisectstack[bisectptr - 8] := mem[q + 2].int - mem[q + 4].int;
+ if bisectstack[bisectptr - 10] < 0 then
+ if bisectstack[bisectptr - 8] >= 0 then begin
+ if bisectstack[bisectptr - 9] < 0 then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end else begin
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end
+ else if bisectstack[bisectptr - 8] <= 0 then begin
+ if bisectstack[bisectptr - 9] > 0 then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end else begin
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end;
+ bisectstack[bisectptr - 15] := mem[pp + 5].int - mem[pp + 1].int;
+ bisectstack[bisectptr - 14] := mem[qq + 3].int - mem[pp + 5].int;
+ bisectstack[bisectptr - 13] := mem[qq + 1].int - mem[qq + 3].int;
+ if bisectstack[bisectptr - 15] < 0 then
+ if bisectstack[bisectptr - 13] >= 0 then begin
+ if bisectstack[bisectptr - 14] < 0 then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end else begin
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end
+ else if bisectstack[bisectptr - 13] <= 0 then begin
+ if bisectstack[bisectptr - 14] > 0 then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end else begin
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end;
+ bisectstack[bisectptr - 20] := mem[pp + 6].int - mem[pp + 2].int;
+ bisectstack[bisectptr - 19] := mem[qq + 4].int - mem[pp + 6].int;
+ bisectstack[bisectptr - 18] := mem[qq + 2].int - mem[qq + 4].int;
+ if bisectstack[bisectptr - 20] < 0 then
+ if bisectstack[bisectptr - 18] >= 0 then begin
+ if bisectstack[bisectptr - 19] < 0 then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end else begin
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end
+ else if bisectstack[bisectptr - 18] <= 0 then begin
+ if bisectstack[bisectptr - 19] > 0 then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end else begin
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end;
+ delx := mem[p + 1].int - mem[pp + 1].int;
+ dely := mem[p + 2].int - mem[pp + 2].int;
+ tol := 0;
+ uv := bisectptr;
+ xy := bisectptr;
+ threel := 0;
+ curt := 1;
+ curtt := 1 {:558};
+ while true do begin
+ 22:
+ if (delx - tol) <= (bisectstack[xy - 11] - bisectstack[uv - 2]) then
+ if (delx + tol) >= (bisectstack[xy - 12] - bisectstack[uv - 1]) then
+ if (dely - tol) <= (bisectstack[xy - 16] - bisectstack[uv - 7]) then
+ if (dely + tol) >= (bisectstack[xy - 17] - bisectstack[uv - 6]) then begin
+ if curt >= maxt then begin
+ if maxt = 131072 then begin
+ curt := (curt + 1) div 2;
+ curtt := (curtt + 1) div 2;
+ goto 10
+ end;
+ maxt := maxt + maxt;
+ apprt := curt;
+ apprtt := curtt
+ end; {559:}
+ bisectstack[bisectptr] := delx;
+ bisectstack[bisectptr + 1] := dely;
+ bisectstack[bisectptr + 2] := tol;
+ bisectstack[bisectptr + 3] := uv;
+ bisectstack[bisectptr + 4] := xy;
+ bisectptr := bisectptr + 45;
+ curt := curt + curt;
+ curtt := curtt + curtt;
+ bisectstack[bisectptr - 25] := bisectstack[uv - 5];
+ bisectstack[bisectptr - 3] := bisectstack[uv - 3];
+ bisectstack[bisectptr - 24] := (bisectstack[bisectptr - 25] + bisectstack[uv - 4]) div 2;
+ bisectstack[bisectptr - 4] := (bisectstack[bisectptr - 3] + bisectstack[uv - 4]) div 2;
+ bisectstack[bisectptr - 23] := (bisectstack[bisectptr - 24] + bisectstack[bisectptr - 4]) div 2;
+ bisectstack[bisectptr - 5] := bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 25] < 0 then
+ if bisectstack[bisectptr - 23] >= 0 then begin
+ if bisectstack[bisectptr - 24] < 0 then
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
+ else
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 21] < 0 then
+ bisectstack[bisectptr - 21] := 0
+ end else begin
+ bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 22] > bisectstack[bisectptr - 25] then
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
+ if bisectstack[bisectptr - 21] < 0 then
+ bisectstack[bisectptr - 21] := 0
+ end
+ else if bisectstack[bisectptr - 23] <= 0 then begin
+ if bisectstack[bisectptr - 24] > 0 then
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
+ else
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 22] > 0 then
+ bisectstack[bisectptr - 22] := 0
+ end else begin
+ bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 21] < bisectstack[bisectptr - 25] then
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
+ if bisectstack[bisectptr - 22] > 0 then
+ bisectstack[bisectptr - 22] := 0
+ end;
+ if bisectstack[bisectptr - 5] < 0 then
+ if bisectstack[bisectptr - 3] >= 0 then begin
+ if bisectstack[bisectptr - 4] < 0 then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end else begin
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end
+ else if bisectstack[bisectptr - 3] <= 0 then begin
+ if bisectstack[bisectptr - 4] > 0 then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end else begin
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end;
+ bisectstack[bisectptr - 30] := bisectstack[uv - 10];
+ bisectstack[bisectptr - 8] := bisectstack[uv - 8];
+ bisectstack[bisectptr - 29] := (bisectstack[bisectptr - 30] + bisectstack[uv - 9]) div 2;
+ bisectstack[bisectptr - 9] := (bisectstack[bisectptr - 8] + bisectstack[uv - 9]) div 2;
+ bisectstack[bisectptr - 28] := (bisectstack[bisectptr - 29] + bisectstack[bisectptr - 9]) div 2;
+ bisectstack[bisectptr - 10] := bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 30] < 0 then
+ if bisectstack[bisectptr - 28] >= 0 then begin
+ if bisectstack[bisectptr - 29] < 0 then
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
+ else
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 26] < 0 then
+ bisectstack[bisectptr - 26] := 0
+ end else begin
+ bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 27] > bisectstack[bisectptr - 30] then
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
+ if bisectstack[bisectptr - 26] < 0 then
+ bisectstack[bisectptr - 26] := 0
+ end
+ else if bisectstack[bisectptr - 28] <= 0 then begin
+ if bisectstack[bisectptr - 29] > 0 then
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
+ else
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 27] > 0 then
+ bisectstack[bisectptr - 27] := 0
+ end else begin
+ bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 26] < bisectstack[bisectptr - 30] then
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
+ if bisectstack[bisectptr - 27] > 0 then
+ bisectstack[bisectptr - 27] := 0
+ end;
+ if bisectstack[bisectptr - 10] < 0 then
+ if bisectstack[bisectptr - 8] >= 0 then begin
+ if bisectstack[bisectptr - 9] < 0 then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end else begin
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end
+ else if bisectstack[bisectptr - 8] <= 0 then begin
+ if bisectstack[bisectptr - 9] > 0 then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end else begin
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end;
+ bisectstack[bisectptr - 35] := bisectstack[xy - 15];
+ bisectstack[bisectptr - 13] := bisectstack[xy - 13];
+ bisectstack[bisectptr - 34] := (bisectstack[bisectptr - 35] + bisectstack[xy - 14]) div 2;
+ bisectstack[bisectptr - 14] := (bisectstack[bisectptr - 13] + bisectstack[xy - 14]) div 2;
+ bisectstack[bisectptr - 33] := (bisectstack[bisectptr - 34] + bisectstack[bisectptr - 14]) div 2;
+ bisectstack[bisectptr - 15] := bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 35] < 0 then
+ if bisectstack[bisectptr - 33] >= 0 then begin
+ if bisectstack[bisectptr - 34] < 0 then
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
+ else
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 31] < 0 then
+ bisectstack[bisectptr - 31] := 0
+ end else begin
+ bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 32] > bisectstack[bisectptr - 35] then
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
+ if bisectstack[bisectptr - 31] < 0 then
+ bisectstack[bisectptr - 31] := 0
+ end
+ else if bisectstack[bisectptr - 33] <= 0 then begin
+ if bisectstack[bisectptr - 34] > 0 then
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
+ else
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 32] > 0 then
+ bisectstack[bisectptr - 32] := 0
+ end else begin
+ bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 31] < bisectstack[bisectptr - 35] then
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
+ if bisectstack[bisectptr - 32] > 0 then
+ bisectstack[bisectptr - 32] := 0
+ end;
+ if bisectstack[bisectptr - 15] < 0 then
+ if bisectstack[bisectptr - 13] >= 0 then begin
+ if bisectstack[bisectptr - 14] < 0 then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end else begin
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end
+ else if bisectstack[bisectptr - 13] <= 0 then begin
+ if bisectstack[bisectptr - 14] > 0 then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end else begin
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end;
+ bisectstack[bisectptr - 40] := bisectstack[xy - 20];
+ bisectstack[bisectptr - 18] := bisectstack[xy - 18];
+ bisectstack[bisectptr - 39] := (bisectstack[bisectptr - 40] + bisectstack[xy - 19]) div 2;
+ bisectstack[bisectptr - 19] := (bisectstack[bisectptr - 18] + bisectstack[xy - 19]) div 2;
+ bisectstack[bisectptr - 38] := (bisectstack[bisectptr - 39] + bisectstack[bisectptr - 19]) div 2;
+ bisectstack[bisectptr - 20] := bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 40] < 0 then
+ if bisectstack[bisectptr - 38] >= 0 then begin
+ if bisectstack[bisectptr - 39] < 0 then
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
+ else
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 36] < 0 then
+ bisectstack[bisectptr - 36] := 0
+ end else begin
+ bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 37] > bisectstack[bisectptr - 40] then
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
+ if bisectstack[bisectptr - 36] < 0 then
+ bisectstack[bisectptr - 36] := 0
+ end
+ else if bisectstack[bisectptr - 38] <= 0 then begin
+ if bisectstack[bisectptr - 39] > 0 then
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
+ else
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 37] > 0 then
+ bisectstack[bisectptr - 37] := 0
+ end else begin
+ bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 36] < bisectstack[bisectptr - 40] then
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
+ if bisectstack[bisectptr - 37] > 0 then
+ bisectstack[bisectptr - 37] := 0
+ end;
+ if bisectstack[bisectptr - 20] < 0 then
+ if bisectstack[bisectptr - 18] >= 0 then begin
+ if bisectstack[bisectptr - 19] < 0 then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end else begin
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end
+ else if bisectstack[bisectptr - 18] <= 0 then begin
+ if bisectstack[bisectptr - 19] > 0 then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end else begin
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end;
+ uv := bisectptr - 20;
+ xy := bisectptr - 20;
+ delx := delx + delx;
+ dely := dely + dely;
+ tol := (tol - threel) + tolstep;
+ tol := tol + tol;
+ threel := threel + tolstep {:559};
+ goto 22
+ end;
+ if timetogo > 0 then
+ timetogo := timetogo - 1
+ else begin
+ while apprt < 65536 do begin
+ apprt := apprt + apprt;
+ apprtt := apprtt + apprtt
+ end;
+ curt := apprt;
+ curtt := apprtt;
+ goto 10
+ end; {560:}
+ 45:
+ if odd(curtt) then
+ if odd(curt) then begin {561:}
+ curt := curt div 2;
+ curtt := curtt div 2;
+ if curt = 0 then
+ goto 10;
+ bisectptr := bisectptr - 45;
+ threel := threel - tolstep;
+ delx := bisectstack[bisectptr];
+ dely := bisectstack[bisectptr + 1];
+ tol := bisectstack[bisectptr + 2];
+ uv := bisectstack[bisectptr + 3];
+ xy := bisectstack[bisectptr + 4];
+ goto 45
+ end else begin {:561}
+ curt := curt + 1;
+ delx := ((delx + bisectstack[uv - 5]) + bisectstack[uv - 4]) + bisectstack[uv - 3];
+ dely := ((dely + bisectstack[uv - 10]) + bisectstack[uv - 9]) + bisectstack[uv - 8];
+ uv := uv + 20;
+ curtt := curtt - 1;
+ xy := xy - 20;
+ delx := ((delx + bisectstack[xy - 15]) + bisectstack[xy - 14]) + bisectstack[xy - 13];
+ dely := ((dely + bisectstack[xy - 20]) + bisectstack[xy - 19]) + bisectstack[xy - 18]
+ end
+ else begin
+ curtt := curtt + 1;
+ tol := tol + threel;
+ delx := ((delx - bisectstack[xy - 15]) - bisectstack[xy - 14]) - bisectstack[xy - 13];
+ dely := ((dely - bisectstack[xy - 20]) - bisectstack[xy - 19]) - bisectstack[xy - 18];
+ xy := xy + 20
+ end {:560}
+ end;
+ 10:
+ null
+ end; {:556} {562:}
+
+ procedure pathintersection(h, hh: halfword);
+ label
+ 10;
+ var
+ p, pp: halfword;
+ n, nn: integer; {563:}
+ begin
+ if mem[h].hh.b1 = 0 then begin
+ mem[h + 5].int := mem[h + 1].int;
+ mem[h + 3].int := mem[h + 1].int;
+ mem[h + 6].int := mem[h + 2].int;
+ mem[h + 4].int := mem[h + 2].int;
+ mem[h].hh.b1 := 1
+ end;
+ if mem[hh].hh.b1 = 0 then begin
+ mem[hh + 5].int := mem[hh + 1].int;
+ mem[hh + 3].int := mem[hh + 1].int;
+ mem[hh + 6].int := mem[hh + 2].int;
+ mem[hh + 4].int := mem[hh + 2].int;
+ mem[hh].hh.b1 := 1
+ end; {:563}
+ tolstep := 0;
+ repeat
+ n := -65536;
+ p := h;
+ repeat
+ if mem[p].hh.b1 <> 0 then begin
+ nn := -65536;
+ pp := hh;
+ repeat
+ if mem[pp].hh.b1 <> 0 then begin
+ cubicintersection(p, pp);
+ if curt > 0 then begin
+ curt := curt + n;
+ curtt := curtt + nn;
+ goto 10
+ end
+ end;
+ nn := nn + 65536;
+ pp := mem[pp].hh.rh
+ until pp = hh
+ end;
+ n := n + 65536;
+ p := mem[p].hh.rh
+ until p = h;
+ tolstep := tolstep + 3
+ until tolstep > 3;
+ curt := -65536;
+ curtt := -65536;
+ 10:
+ null
+ end; {:562} {574:}
+
+ procedure openawindow(k: windownumber; r0, c0, r1, c1: scaled; x, y: scaled);
+ var
+ m, n: integer; {575:}
+ begin
+ if r0 < 0 then
+ r0 := 0
+ else
+ r0 := roundunscaled(r0);
+ r1 := roundunscaled(r1);
+ if r1 > screendepth then
+ r1 := screendepth;
+ if r1 < r0 then
+ if r0 > screendepth then
+ r0 := r1
+ else
+ r1 := r0;
+ if c0 < 0 then
+ c0 := 0
+ else
+ c0 := roundunscaled(c0);
+ c1 := roundunscaled(c1);
+ if c1 > screenwidth then
+ c1 := screenwidth;
+ if c1 < c0 then
+ if c0 > screenwidth then
+ c0 := c1
+ else
+ c1 := c0 {:575};
+ windowopen[k] := true;
+ windowtime[k] := windowtime[k] + 1;
+ leftcol[k] := c0;
+ rightcol[k] := c1;
+ toprow[k] := r0;
+ botrow[k] := r1; {576:}
+ m := roundunscaled(x);
+ n := roundunscaled(y) - 1;
+ mwindow[k] := c0 - m;
+ nwindow[k] := r0 + n {:576};
+ begin
+ if not screenstarted then begin
+ screenOK := initscreen;
+ screenstarted := true
+ end
+ end;
+ if screenOK then begin
+ blankrectangle(c0, c1, r0, r1);
+ updatescreen
+ end
+ end; { openawindow }
+{:574}
+ {577:}
+
+ procedure dispedges(k: windownumber);
+ label
+ 30, 40;
+ var
+ p, q: halfword;
+ alreadythere: boolean;
+ r: integer; {580:}
+ n: screencol;
+ w, ww: integer;
+ b: pixelcolor;
+ m, mm: integer;
+ d: integer;
+ madjustment: integer;
+ rightedge: integer;
+ mincol: screencol; {:580}
+ begin
+ if screenOK then
+ if leftcol[k] < rightcol[k] then
+ if toprow[k] < botrow[k] then begin
+ alreadythere := false;
+ if mem[curedges + 3].hh.rh = k then
+ if mem[curedges + 4].int = windowtime[k] then
+ alreadythere := true;
+ if not alreadythere then
+ blankrectangle(leftcol[k], rightcol[k], toprow[k], botrow[k]); {581:}
+ madjustment := mwindow[k] - mem[curedges + 3].hh.lh;
+ rightedge := 8 * (rightcol[k] - madjustment);
+ mincol := leftcol[k] {:581};
+ p := mem[curedges].hh.rh;
+ r := nwindow[k] - (mem[curedges + 1].hh.lh - 4096);
+ while (p <> curedges) and (r >= toprow[k]) do begin
+ if r < botrow[k] then begin {578:}
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p)
+ else if mem[p + 1].hh.lh = (-29999) then
+ if alreadythere then
+ goto 30;
+ mem[p + 1].hh.lh := -29999; {582:}
+ n := 0;
+ ww := 0;
+ m := -1;
+ w := 0;
+ q := mem[p + 1].hh.rh;
+ rowtransition[0] := mincol;
+ while true do begin
+ if q = 30000 then
+ d := rightedge
+ else
+ d := mem[q].hh.lh + 32768;
+ mm := (d div 8) + madjustment;
+ if mm <> m then begin {583:}
+ if w <= 0 then begin
+ if ww > 0 then
+ if m > mincol then begin
+ if n = 0 then
+ if alreadythere then begin
+ b := 0;
+ n := n + 1
+ end else
+ b := 1
+ else
+ n := n + 1;
+ rowtransition[n] := m
+ end
+ end else if ww <= 0 then
+ if m > mincol then begin
+ if n = 0 then
+ b := 1;
+ n := n + 1;
+ rowtransition[n] := m
+ end {:583};
+ m := mm;
+ w := ww
+ end;
+ if d >= rightedge then
+ goto 40;
+ ww := (ww + (d mod 8)) - 4;
+ q := mem[q].hh.rh
+ end;
+ 40: {584:}
+ if alreadythere or (ww > 0) then begin
+ if n = 0 then
+ if ww > 0 then
+ b := 1
+ else
+ b := 0;
+ n := n + 1;
+ rowtransition[n] := rightcol[k]
+ end else if n = 0 then
+ goto 30 {:584}; {:582}
+ paintrow(r, b, rowtransition, n);
+ 30: {:578}
+ null
+ end;
+ p := mem[p].hh.rh;
+ r := r - 1
+ end;
+ updatescreen;
+ windowtime[k] := windowtime[k] + 1;
+ mem[curedges + 3].hh.rh := k;
+ mem[curedges + 4].int := windowtime[k]
+ end
+ end; {:577} {591:}
+
+ function maxcoef(p: halfword): fraction;
+ var
+ x: fraction;
+ begin
+ x := 0;
+ while mem[p].hh.lh <> (-30000) do begin
+ if abs(mem[p + 1].int) > x then
+ x := abs(mem[p + 1].int);
+ p := mem[p].hh.rh
+ end;
+ maxcoef := x
+ end; {:591} {597:}
+
+ function pplusq(p: halfword; q: halfword; t: smallnumber): halfword;
+ label
+ 30;
+ var
+ pp, qq: halfword;
+ r, s: halfword;
+ threshold: integer;
+ v: integer;
+ begin
+ if t = 17 then
+ threshold := 2685
+ else
+ threshold := 8;
+ r := 29999;
+ pp := mem[p].hh.lh;
+ qq := mem[q].hh.lh;
+ while true do
+ if pp = qq then
+ if pp = (-30000) then
+ goto 30 {598:}
+ else begin
+ v := mem[p + 1].int + mem[q + 1].int;
+ mem[p + 1].int := v;
+ s := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh;
+ if abs(v) < threshold then
+ freenode(s, 2)
+ else begin
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end {:598}
+ else if mem[pp + 1].int < mem[qq + 1].int then begin
+ s := getnode(2);
+ mem[s].hh.lh := qq;
+ mem[s + 1].int := mem[q + 1].int;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh;
+ mem[r].hh.rh := s;
+ r := s
+ end else begin
+ mem[r].hh.rh := p;
+ r := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh
+ end;
+ 30:
+ mem[p + 1].int := slowadd(mem[p + 1].int, mem[q + 1].int);
+ mem[r].hh.rh := p;
+ depfinal := p;
+ pplusq := mem[29999].hh.rh
+ end; {:597} {599:}
+
+ function ptimesv(p: halfword; v: integer; t0, t1: smallnumber; visscaled: boolean): halfword;
+ var
+ r, s: halfword;
+ w: integer;
+ threshold: integer;
+ scalingdown: boolean;
+ begin
+ if t0 <> t1 then
+ scalingdown := true
+ else
+ scalingdown := not visscaled;
+ if t1 = 17 then
+ threshold := 1342
+ else
+ threshold := 4;
+ r := 29999;
+ while mem[p].hh.lh <> (-30000) do begin
+ if scalingdown then
+ w := takefraction(v, mem[p + 1].int)
+ else
+ w := takescaled(v, mem[p + 1].int);
+ if abs(w) <= threshold then begin
+ s := mem[p].hh.rh;
+ freenode(p, 2);
+ p := s
+ end else begin
+ if abs(w) >= 626349397 then begin
+ fixneeded := true;
+ mem[mem[p].hh.lh].hh.b0 := 0
+ end;
+ mem[r].hh.rh := p;
+ r := p;
+ mem[p + 1].int := w;
+ p := mem[p].hh.rh
+ end
+ end;
+ mem[r].hh.rh := p;
+ if visscaled then
+ mem[p + 1].int := takescaled(mem[p + 1].int, v)
+ else
+ mem[p + 1].int := takefraction(mem[p + 1].int, v);
+ ptimesv := mem[29999].hh.rh
+ end; {:599}
+{601:}
+
+ function pwithxbecomingq(p, x, q: halfword; t: smallnumber): halfword;
+ var
+ r, s: halfword;
+ v: integer;
+ sx: integer;
+ begin
+ s := p;
+ r := 29999;
+ sx := mem[x + 1].int;
+ while mem[mem[s].hh.lh + 1].int > sx do begin
+ r := s;
+ s := mem[s].hh.rh
+ end;
+ if mem[s].hh.lh <> x then
+ pwithxbecomingq := p
+ else begin
+ mem[29999].hh.rh := p;
+ mem[r].hh.rh := mem[s].hh.rh;
+ v := mem[s + 1].int;
+ freenode(s, 2);
+ pwithxbecomingq := pplusfq(mem[29999].hh.rh, v, q, t, 17)
+ end
+ end; {:601} {606:}
+
+ procedure newdep(q, p: halfword);
+ var
+ r: halfword;
+ begin
+ mem[q + 1].hh.rh := p;
+ mem[q + 1].hh.lh := -29987;
+ r := mem[-29987].hh.rh;
+ mem[depfinal].hh.rh := r;
+ mem[r + 1].hh.lh := depfinal;
+ mem[-29987].hh.rh := q
+ end; {:606} {607:}
+
+ function constdependency(v: scaled): halfword;
+ begin
+ depfinal := getnode(2);
+ mem[depfinal + 1].int := v;
+ mem[depfinal].hh.lh := -30000;
+ constdependency := depfinal
+ end; {:607} {608:}
+
+ function singledependency(p: halfword): halfword;
+ var
+ q: halfword;
+ m: integer;
+ begin
+ m := mem[p + 1].int mod 64;
+ if m > 28 then
+ singledependency := constdependency(0)
+ else begin
+ q := getnode(2);
+ mem[q + 1].int := twotothe[28 - m];
+ mem[q].hh.lh := p;
+ mem[q].hh.rh := constdependency(0);
+ singledependency := q
+ end
+ end; {:608}
+{609:}
+
+ function copydeplist(p: halfword): halfword;
+ label
+ 30;
+ var
+ q: halfword;
+ begin
+ q := getnode(2);
+ depfinal := q;
+ while true do begin
+ mem[depfinal].hh.lh := mem[p].hh.lh;
+ mem[depfinal + 1].int := mem[p + 1].int;
+ if mem[depfinal].hh.lh = (-30000) then
+ goto 30;
+ mem[depfinal].hh.rh := getnode(2);
+ depfinal := mem[depfinal].hh.rh;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ copydeplist := q
+ end; {:609} {610:}
+
+ procedure lineareq(p: halfword; t: smallnumber);
+ var
+ q, r, s: halfword;
+ x: halfword;
+ n: integer;
+ v: integer;
+ prevr: halfword;
+ finalnode: halfword;
+ w: integer; {611:}
+ begin
+ q := p;
+ r := mem[p].hh.rh;
+ v := mem[q + 1].int;
+ while mem[r].hh.lh <> (-30000) do begin
+ if abs(mem[r + 1].int) > abs(v) then begin
+ q := r;
+ v := mem[r + 1].int
+ end;
+ r := mem[r].hh.rh
+ end {:611};
+ x := mem[q].hh.lh;
+ n := mem[x + 1].int mod 64; {612:}
+ s := 29999;
+ mem[s].hh.rh := p;
+ r := p;
+ repeat
+ if r = q then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ w := makefraction(mem[r + 1].int, v);
+ if abs(w) <= 1342 then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ mem[r + 1].int := -w;
+ s := r
+ end
+ end;
+ r := mem[s].hh.rh
+ until mem[r].hh.lh = (-30000);
+ if t = 18 then
+ mem[r + 1].int := -makescaled(mem[r + 1].int, v)
+ else if v <> (-268435456) then
+ mem[r + 1].int := -makefraction(mem[r + 1].int, v);
+ finalnode := r;
+ p := mem[29999].hh.rh {:612};
+ if internal[2] > 0 then {613:}
+ if interesting(x) then begin
+ begindiagnostic;
+ printnl(462);
+ printvariablename(x);
+ w := n;
+ while w > 0 do begin
+ print(455);
+ w := w - 2
+ end;
+ printchar(61);
+ printdependency(p, 17);
+ enddiagnostic(false)
+ end {:613};
+{614:}
+ prevr := -29987;
+ r := mem[-29987].hh.rh;
+ while r <> (-29987) do begin
+ s := mem[r + 1].hh.rh;
+ q := pwithxbecomingq(s, x, p, mem[r].hh.b0);
+ if mem[q].hh.lh = (-30000) then
+ makeknown(r, q)
+ else begin
+ mem[r + 1].hh.rh := q;
+ repeat
+ q := mem[q].hh.rh
+ until mem[q].hh.lh = (-30000);
+ prevr := q
+ end;
+ r := mem[prevr].hh.rh
+ end {:614}; {615:}
+ if n > 0 then begin {616:}
+ s := 29999;
+ mem[29999].hh.rh := p;
+ r := p;
+ repeat
+ if n > 30 then
+ w := 0
+ else
+ w := mem[r + 1].int div twotothe[n];
+ if (abs(w) <= 1342) and (mem[r].hh.lh <> (-30000)) then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ mem[r + 1].int := w;
+ s := r
+ end;
+ r := mem[s].hh.rh
+ until mem[s].hh.lh = (-30000);
+ p := mem[29999].hh.rh
+ end {:616};
+ if mem[p].hh.lh = (-30000) then begin
+ mem[x].hh.b0 := 16;
+ mem[x + 1].int := mem[p + 1].int;
+ if abs(mem[x + 1].int) >= 268435456 then
+ valtoobig(mem[x + 1].int);
+ freenode(p, 2);
+ if curexp = x then
+ if curtype = 19 then begin
+ curexp := mem[x + 1].int;
+ curtype := 16;
+ freenode(x, 2)
+ end
+ end else begin
+ mem[x].hh.b0 := 17;
+ depfinal := finalnode;
+ newdep(x, p);
+ if curexp = x then
+ if curtype = 19 then
+ curtype := 17
+ end {:615};
+ if fixneeded then
+ fixdependencies
+ end; {:610} {619:}
+
+ function newringentry(p: halfword): halfword;
+ var
+ q: halfword;
+ begin
+ q := getnode(2);
+ mem[q].hh.b1 := 11;
+ mem[q].hh.b0 := mem[p].hh.b0;
+ if mem[p + 1].int = (-30000) then
+ mem[q + 1].int := p
+ else
+ mem[q + 1].int := mem[p + 1].int;
+ mem[p + 1].int := q;
+ newringentry := q
+ end; {:619} {621:}
+
+ procedure nonlineareq(v: integer; p: halfword; flushp: boolean);
+ var
+ t: smallnumber;
+ q, r: halfword;
+ begin
+ t := mem[p].hh.b0 - 1;
+ q := mem[p + 1].int;
+ if flushp then
+ mem[p].hh.b0 := 1
+ else
+ p := q;
+ repeat
+ r := mem[q + 1].int;
+ mem[q].hh.b0 := t;
+ case t of
+ 2:
+ mem[q + 1].int := v;
+ 4:
+ begin
+ mem[q + 1].int := v;
+ begin
+ if strref[v] < 127 then
+ strref[v] := strref[v] + 1
+ end
+ end;
+ 6:
+ begin
+ mem[q + 1].int := v;
+ mem[v].hh.lh := mem[v].hh.lh + 1
+ end;
+ 9:
+ mem[q + 1].int := copypath(v);
+ 11:
+ mem[q + 1].int := copyedges(v)
+ end;
+ q := r
+ until q = p
+ end; {:621} {622:}
+
+ procedure ringmerge(p, q: halfword);
+ label
+ 10;
+ var
+ r: halfword;
+ begin
+ r := mem[p + 1].int;
+ while r <> p do begin
+ if r = q then begin {623:}
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ goto 10
+ end;
+ r := mem[r + 1].int
+ end;
+ r := mem[p + 1].int;
+ mem[p + 1].int := mem[q + 1].int;
+ mem[q + 1].int := r;
+ 10:
+ null
+ end; {:622} {626:}
+
+ procedure showcmdmod(c, m: integer);
+ begin
+ begindiagnostic;
+ printnl(123);
+ printcmdmod(c, m);
+ printchar(125);
+ enddiagnostic(false)
+ end; {:626} {635:}
+
+ procedure showcontext;
+ label
+ 30;
+ var
+ oldsetting: 0..5; {641:}
+ i: 0..bufsize;
+ l: integer;
+ m: integer;
+ n: 0..errorline;
+ p: integer;
+ q: integer; {:641}
+ begin
+ fileptr := inputptr;
+ inputstack[fileptr] := curinput;
+ while true do begin
+ curinput := inputstack[fileptr]; {636:}
+ if (((fileptr = inputptr) or (curinput.indexfield <= 6)) or (curinput.indexfield <> 10)) or (curinput.locfield <> (-30000)) then begin
+ tally := 0;
+ oldsetting := selector;
+ if curinput.indexfield <= 6 then begin {637:}
+ if curinput.namefield <= 1 then
+ if (curinput.namefield = 0) and (fileptr = 0) then
+ printnl(469)
+ else
+ printnl(470)
+ else if curinput.namefield = 2 then
+ printnl(471)
+ else begin
+ printnl(472);
+ printint(line)
+ end;
+ printchar(32) {:637};
+{644:}
+ begin
+ l := tally;
+ tally := 0;
+ selector := 4;
+ trickcount := 1000000
+ end;
+ if curinput.limitfield > 0 then
+ for i := curinput.startfield to curinput.limitfield - 1 do begin
+ if i = curinput.locfield then begin
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end;
+ print(buffer[i])
+ end {:644}
+ end else begin {638:}
+ if curinput.indexfield in
+ [7, 8, 9, 10, 11, 12] then
+ case curinput.indexfield of
+ 7:
+ printnl(473);
+ 8:
+ begin {639:}
+ printnl(478);
+ p := paramstack[curinput.limitfield];
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then
+ printexp(p, 0)
+ else
+ showtokenlist(p, -30000, 20, tally);
+ print(479)
+ end; {:639}
+ 9:
+ printnl(474);
+ 10:
+ if curinput.locfield = (-30000) then
+ printnl(475)
+ else
+ printnl(476);
+ 11:
+ printnl(477);
+ 12:
+ begin
+ println;
+ if curinput.namefield <> (-30000) then
+ print(hash[curinput.namefield].rh) {640:}
+ else begin
+ p := paramstack[curinput.limitfield];
+ if p = (-30000) then
+ showtokenlist(paramstack[curinput.limitfield + 1], -30000, 20, tally)
+ else begin
+ q := p;
+ while mem[q].hh.rh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := paramstack[curinput.limitfield + 1];
+ showtokenlist(p, -30000, 20, tally);
+ mem[q].hh.rh := -30000
+ end
+ end {:640};
+ print(368)
+ end
+ end
+ else
+ printnl(63) {:638}; {645:}
+ begin
+ l := tally;
+ tally := 0;
+ selector := 4;
+ trickcount := 1000000
+ end;
+ if curinput.indexfield <> 12 then
+ showtokenlist(curinput.startfield, curinput.locfield, 100000, 0)
+ else
+ showmacro(curinput.startfield, curinput.locfield, 100000) {:645}
+ end;
+ selector := oldsetting; {643:}
+ if trickcount = 1000000 then begin
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end;
+ if tally < trickcount then
+ m := tally - firstcount
+ else
+ m := trickcount - firstcount;
+ if (l + firstcount) <= halferrorline then begin
+ p := 0;
+ n := l + firstcount
+ end else begin
+ print(146);
+ p := ((l + firstcount) - halferrorline) + 3;
+ n := halferrorline
+ end;
+ for q := p to firstcount - 1 do
+ printchar(trickbuf[q mod errorline]);
+ println;
+ for q := 1 to n do
+ printchar(32);
+ if (m + n) <= errorline then
+ p := firstcount + m
+ else
+ p := firstcount + ((errorline - n) - 3);
+ for q := firstcount to p - 1 do
+ printchar(trickbuf[q mod errorline]);
+ if (m + n) > errorline then
+ print(146) {:643}
+ end {:636};
+ if curinput.indexfield <= 6 then
+ if (curinput.namefield > 2) or (fileptr = 0) then
+ goto 30;
+ fileptr := fileptr - 1
+ end;
+ 30:
+ curinput := inputstack[inputptr]
+ end; { showcontext }
+{:635}
+ {649:}
+
+ procedure begintokenlist(p: halfword; t: quarterword);
+ begin
+ begin
+ if inputptr > maxinstack then begin
+ maxinstack := inputptr;
+ if inputptr = stacksize then
+ overflow(480, stacksize)
+ end;
+ inputstack[inputptr] := curinput;
+ inputptr := inputptr + 1
+ end;
+ curinput.startfield := p;
+ curinput.indexfield := t;
+ curinput.limitfield := paramptr;
+ curinput.locfield := p
+ end; {:649} {650:}
+
+ procedure endtokenlist;
+ label
+ 30;
+ var
+ p: halfword;
+ begin
+ if curinput.indexfield >= 10 then
+ if curinput.indexfield <= 11 then begin
+ flushtokenlist(curinput.startfield);
+ goto 30
+ end else
+ deletemacref(curinput.startfield);
+ while paramptr > curinput.limitfield do begin
+ paramptr := paramptr - 1;
+ p := paramstack[paramptr];
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then begin
+ recyclevalue(p);
+ freenode(p, 2)
+ end else
+ flushtokenlist(p)
+ end;
+ 30:
+ begin
+ inputptr := inputptr - 1;
+ curinput := inputstack[inputptr]
+ end;
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end
+ end; {:650} {651:}
+{855:}
+ {856:}
+
+ procedure encapsulate(p: halfword);
+ begin
+ curexp := getnode(2);
+ mem[curexp].hh.b0 := curtype;
+ mem[curexp].hh.b1 := 11;
+ newdep(curexp, p)
+ end; { encapsulate }
+{:856}
+ {858:}
+
+ procedure install(r, q: halfword);
+ var
+ p: halfword;
+ begin
+ if mem[q].hh.b0 = 16 then begin
+ mem[r + 1].int := mem[q + 1].int;
+ mem[r].hh.b0 := 16
+ end else if mem[q].hh.b0 = 19 then begin
+ p := singledependency(q);
+ if p = depfinal then begin
+ mem[r].hh.b0 := 16;
+ mem[r + 1].int := 0;
+ freenode(p, 2)
+ end else begin
+ mem[r].hh.b0 := 17;
+ newdep(r, p)
+ end
+ end else begin
+ mem[r].hh.b0 := mem[q].hh.b0;
+ newdep(r, copydeplist(mem[q + 1].hh.rh))
+ end
+ end; {:858}
+
+ procedure makeexpcopy(p: halfword);
+ label
+ 20;
+ var
+ q, r, t: halfword;
+ begin
+ 20:
+ curtype := mem[p].hh.b0;
+ if curtype in
+ [1, 2, 16, 3, 5, 7, 12, 10,
+ 4, 6, 11, 9, 8, 13, 14, 17,
+ 18, 15, 19] then
+ case curtype of
+ 1, 2, 16:
+ curexp := mem[p + 1].int;
+ 3, 5, 7, 12, 10:
+ curexp := newringentry(p);
+ 4:
+ begin
+ curexp := mem[p + 1].int;
+ begin
+ if strref[curexp] < 127 then
+ strref[curexp] := strref[curexp] + 1
+ end
+ end;
+ 6:
+ begin
+ curexp := mem[p + 1].int;
+ mem[curexp].hh.lh := mem[curexp].hh.lh + 1
+ end;
+ 11:
+ curexp := copyedges(mem[p + 1].int);
+ 9, 8:
+ curexp := copypath(mem[p + 1].int);
+ 13, 14:
+ begin {857:}
+ if mem[p + 1].int = (-30000) then
+ initbignode(p);
+ t := getnode(2);
+ mem[t].hh.b1 := 11;
+ mem[t].hh.b0 := curtype;
+ initbignode(t);
+ q := mem[p + 1].int + bignodesize[curtype];
+ r := mem[t + 1].int + bignodesize[curtype];
+ repeat
+ q := q - 2;
+ r := r - 2;
+ install(r, q)
+ until q = mem[p + 1].int;
+ curexp := t
+ end; {:857}
+ 17, 18:
+ encapsulate(copydeplist(mem[p + 1].hh.rh));
+ 15:
+ begin
+ begin
+ mem[p].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[p + 1].int := serialno
+ end;
+ goto 20
+ end;
+ 19:
+ begin
+ q := singledependency(p);
+ if q = depfinal then begin
+ curtype := 16;
+ curexp := 0;
+ freenode(q, 2)
+ end else begin
+ curtype := 17;
+ encapsulate(q)
+ end
+ end
+ end
+ else
+ confusion(664)
+ end; {:855}
+
+ function curtok: halfword;
+ var
+ p: halfword;
+ savetype: smallnumber;
+ saveexp: integer;
+ begin
+ if cursym = 0 then
+ if curcmd = 38 then begin
+ savetype := curtype;
+ saveexp := curexp;
+ makeexpcopy(curmod);
+ p := stashcurexp;
+ mem[p].hh.rh := -30000;
+ curtype := savetype;
+ curexp := saveexp
+ end else begin
+ p := getnode(2);
+ mem[p + 1].int := curmod;
+ mem[p].hh.b1 := 12;
+ if curcmd = 42 then
+ mem[p].hh.b0 := 16
+ else
+ mem[p].hh.b0 := 4
+ end
+ else begin
+ begin
+ p := avail;
+ if p = (-30000) then
+ p := getavail
+ else begin
+ avail := mem[p].hh.rh;
+ mem[p].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[p].hh.lh := cursym
+ end;
+ curtok := p
+ end; {:651} {652:}
+
+ procedure backinput;
+ var
+ p: halfword;
+ s: 0..150;
+ begin
+ p := curtok;
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ begintokenlist(p, 10)
+ end; {:652} {653:}
+
+ procedure backerror;
+ begin
+ OKtointerrupt := false;
+ backinput;
+ OKtointerrupt := true;
+ error
+ end; { backerror }
+
+ procedure inserror;
+ begin
+ OKtointerrupt := false;
+ backinput;
+ curinput.indexfield := 11;
+ OKtointerrupt := true;
+ error
+ end; {:653} {654:}
+
+ procedure beginfilereading;
+ begin
+ if inopen = 6 then
+ overflow(481, 6);
+ if first = bufsize then
+ overflow(128, bufsize);
+ inopen := inopen + 1;
+ begin
+ if inputptr > maxinstack then begin
+ maxinstack := inputptr;
+ if inputptr = stacksize then
+ overflow(480, stacksize)
+ end;
+ inputstack[inputptr] := curinput;
+ inputptr := inputptr + 1
+ end;
+ curinput.indexfield := inopen;
+ linestack[curinput.indexfield] := line;
+ curinput.startfield := first;
+ curinput.namefield := 0
+ end; {:654} {655:}
+
+ procedure endfilereading;
+ begin
+ first := curinput.startfield;
+ line := linestack[curinput.indexfield];
+ if curinput.indexfield <> inopen then
+ confusion(482);
+ if curinput.namefield > 2 then
+ aclose(inputfile[curinput.indexfield]);
+ begin
+ inputptr := inputptr - 1;
+ curinput := inputstack[inputptr]
+ end;
+ inopen := inopen - 1
+ end; {:655} {656:}
+
+ procedure clearforerrorprompt;
+ begin
+ while (((curinput.indexfield <= 6) and (curinput.namefield = 0)) and (inputptr > 0)) and (curinput.locfield = curinput.limitfield) do
+ endfilereading;
+ println
+ end; {:656} {661:}
+
+ function checkoutervalidity: boolean;
+ var
+ p: halfword;
+ begin
+ if scannerstatus = 0 then
+ checkoutervalidity := true
+ else begin
+ deletionsallowed := false; {662:}
+ if cursym <> 0 then begin
+ p := getavail;
+ mem[p].hh.lh := cursym;
+ begintokenlist(p, 10)
+ end {:662};
+ if scannerstatus > 1 then begin {663:}
+ runaway;
+ if cursym = 0 then begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(488)
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(489)
+ end
+ end;
+ print(490);
+ begin
+ helpptr := 4;
+ helpline[3] := 491;
+ helpline[2] := 492;
+ helpline[1] := 493;
+ helpline[0] := 494
+ end;
+ case scannerstatus of {664:}
+ 2:
+ begin
+ print(495);
+ helpline[3] := 496;
+ cursym := 2235
+ end;
+ 3:
+ begin
+ print(497);
+ helpline[3] := 498;
+ if warninginfo = 0 then
+ cursym := 2239
+ else begin
+ cursym := 2231;
+ eqtb[2231].rh := warninginfo
+ end
+ end;
+ 4, 5:
+ begin
+ print(499);
+ if scannerstatus = 5 then
+ print(hash[warninginfo].rh)
+ else
+ printvariablename(warninginfo);
+ cursym := 2237
+ end;
+ 6:
+ begin
+ print(500);
+ print(hash[warninginfo].rh);
+ print(501);
+ helpline[3] := 502;
+ cursym := 2236
+ end
+ end {:664};
+ inserror
+ end else begin {:663}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(483)
+ end;
+ printint(warninginfo);
+ begin
+ helpptr := 3;
+ helpline[2] := 484;
+ helpline[1] := 485;
+ helpline[0] := 486
+ end;
+ if cursym = 0 then
+ helpline[2] := 487;
+ cursym := 2238;
+ inserror
+ end;
+ deletionsallowed := true;
+ checkoutervalidity := false
+ end
+ end; {:661} {666:}
+
+ procedure firmuptheline;
+ forward; {:666} {667:}
+
+ procedure getnext;
+ label
+ 20, 10, 40, 25, 85, 86, 87, 30;
+ var
+ k: 0..bufsize;
+ c: ASCIIcode;
+ class: ASCIIcode;
+ n, f: integer;
+ begin
+ 20:
+ cursym := 0;
+ if curinput.indexfield <= 6 then begin {669:}
+ 25:
+ c := buffer[curinput.locfield];
+ curinput.locfield := curinput.locfield + 1;
+ class := charclass[c];
+ if class in
+ [0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 20] then
+ case class of
+ 0:
+ goto 85;
+ 1:
+ begin
+ class := charclass[buffer[curinput.locfield]];
+ if class > 1 then
+ goto 25
+ else if class < 1 then begin
+ n := 0;
+ goto 86
+ end
+ end;
+ 2:
+ goto 25;
+ 3:
+ begin {679:}
+ if curinput.namefield > 2 then begin {681:}
+ line := line + 1;
+ first := curinput.startfield;
+ if not forceeof then begin
+ if inputln(inputfile[curinput.indexfield], true) then
+ firmuptheline
+ else
+ forceeof := true
+ end;
+ if forceeof then begin
+ printchar(41);
+ forceeof := false;
+ flush(output);
+ endfilereading;
+ if checkoutervalidity then
+ goto 20
+ else
+ goto 20
+ end;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield
+ end else begin {:681}
+ if inputptr > 0 then begin
+ endfilereading;
+ goto 20
+ end;
+ if selector < 2 then
+ openlogfile;
+ if interaction > 1 then begin
+ if curinput.limitfield = curinput.startfield then
+ printnl(517);
+ println;
+ first := curinput.startfield;
+ begin
+ print(42);
+ terminput
+ end;
+ curinput.limitfield := last;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield
+ end else
+ fatalerror(518)
+ end {:679};
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end;
+ goto 25
+ end;
+ 4:
+ begin {671:}
+ if buffer[curinput.locfield] = 34 then
+ curmod := 155
+ else begin
+ k := curinput.locfield;
+ buffer[curinput.limitfield + 1] := 34;
+ repeat
+ curinput.locfield := curinput.locfield + 1
+ until buffer[curinput.locfield] = 34;
+ if curinput.locfield > curinput.limitfield then begin {672:}
+ curinput.locfield := curinput.limitfield;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(510)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 511;
+ helpline[1] := 512;
+ helpline[0] := 513
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ goto 20
+ end {:672};
+ if curinput.locfield = (k + 1) then
+ curmod := buffer[k]
+ else begin
+ begin
+ if ((poolptr + curinput.locfield) - k) > maxpoolptr then begin
+ if ((poolptr + curinput.locfield) - k) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + curinput.locfield) - k
+ end
+ end;
+ repeat
+ begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ k := k + 1
+ until k = curinput.locfield;
+ curmod := makestring
+ end
+ end;
+ curinput.locfield := curinput.locfield + 1;
+ curcmd := 39;
+ goto 10
+ end; {:671}
+ 5, 6, 7, 8:
+ begin
+ k := curinput.locfield - 1;
+ goto 40
+ end;
+ 20:
+ begin {670:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(507)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 508;
+ helpline[0] := 509
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ goto 20
+ end
+ end
+ else
+ null {:670};
+ k := curinput.locfield - 1;
+ while charclass[buffer[curinput.locfield]] = class do
+ curinput.locfield := curinput.locfield + 1;
+ goto 40;
+ 85: {673:}
+ n := c - 48;
+ while charclass[buffer[curinput.locfield]] = 0 do begin
+ if n < 4096 then
+ n := ((10 * n) + buffer[curinput.locfield]) - 48;
+ curinput.locfield := curinput.locfield + 1
+ end;
+ if buffer[curinput.locfield] = 46 then
+ if charclass[buffer[curinput.locfield + 1]] = 0 then
+ goto 30;
+ f := 0;
+ goto 87;
+ 30:
+ curinput.locfield := curinput.locfield + 1 {:673};
+ 86: {674:}
+ k := 0;
+ repeat
+ if k < 17 then begin
+ dig[k] := buffer[curinput.locfield] - 48;
+ k := k + 1
+ end;
+ curinput.locfield := curinput.locfield + 1
+ until charclass[buffer[curinput.locfield]] <> 0;
+ f := rounddecimals(k);
+ if f = 65536 then begin
+ n := n + 1;
+ f := 0
+ end {:674};
+ 87: {675:}
+ if n < 4096 then
+ curmod := (n * 65536) + f
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(514)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 515;
+ helpline[0] := 516
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ curmod := 268435455
+ end;
+ curcmd := 42;
+ goto 10 {:675};
+ 40:
+ cursym := idlookup(k, curinput.locfield - k)
+ end else if curinput.locfield >= himemmin then begin {:669} {676:}
+ cursym := mem[curinput.locfield].hh.lh;
+ curinput.locfield := mem[curinput.locfield].hh.rh;
+ if cursym >= 2242 then
+ if cursym >= 2392 then begin {677:}
+ if cursym >= 2542 then
+ cursym := cursym - 150;
+ begintokenlist(paramstack[(curinput.limitfield + cursym) - 2392], 9);
+ goto 20
+ end else begin {:677}
+ curcmd := 38;
+ curmod := paramstack[(curinput.limitfield + cursym) - 2242];
+ cursym := 0;
+ goto 10
+ end
+ end else if curinput.locfield > (-30000) then begin {678:}
+ if mem[curinput.locfield].hh.b1 = 12 then begin
+ curmod := mem[curinput.locfield + 1].int;
+ if mem[curinput.locfield].hh.b0 = 16 then
+ curcmd := 42
+ else begin
+ curcmd := 39;
+ begin
+ if strref[curmod] < 127 then
+ strref[curmod] := strref[curmod] + 1
+ end
+ end
+ end else begin
+ curmod := curinput.locfield;
+ curcmd := 38
+ end;
+ curinput.locfield := mem[curinput.locfield].hh.rh;
+ goto 10
+ end else begin {:678}
+ endtokenlist;
+ goto 20
+ end {:676}; {668:}
+ curcmd := eqtb[cursym].lh;
+ curmod := eqtb[cursym].rh;
+ if curcmd >= 83 then
+ if checkoutervalidity then
+ curcmd := curcmd - 83
+ else
+ goto 20 {:668};
+ 10:
+ null
+ end; {:667} {682:}
+
+ procedure firmuptheline;
+ var
+ k: 0..bufsize;
+ begin
+ curinput.limitfield := last;
+ if internal[31] > 0 then
+ if interaction > 1 then begin
+ println;
+ if curinput.startfield < curinput.limitfield then
+ for k := curinput.startfield to curinput.limitfield - 1 do
+ print(buffer[k]);
+ first := curinput.limitfield;
+ begin
+ print(519);
+ terminput
+ end;
+ if last > first then begin
+ for k := first to last - 1 do
+ buffer[(k + curinput.startfield) - first] := buffer[k];
+ curinput.limitfield := (curinput.startfield + last) - first
+ end
+ end
+ end; {:682}
+{685:}
+
+ function scantoks(terminator: commandcode; substlist, tailend: halfword; suffixcount: smallnumber): halfword;
+ label
+ 30, 40;
+ var
+ p: halfword;
+ q: halfword;
+ balance: integer;
+ begin
+ p := 29998;
+ balance := 1;
+ mem[29998].hh.rh := -30000;
+ while true do begin
+ getnext;
+ if cursym > 0 then begin {686:}
+ begin
+ q := substlist;
+ while q <> (-30000) do begin
+ if mem[q].hh.lh = cursym then begin
+ cursym := mem[q + 1].int;
+ curcmd := 7;
+ goto 40
+ end;
+ q := mem[q].hh.rh
+ end;
+ 40: {:686}
+ null
+ end;
+ if curcmd = terminator then {687:}
+ if curmod > 0 then
+ balance := balance + 1
+ else begin
+ balance := balance - 1;
+ if balance = 0 then
+ goto 30
+ end {:687}
+ else if curcmd = 61 then begin {690:}
+ if curmod = 0 then
+ getnext
+ else if curmod <= suffixcount then
+ cursym := 2391 + curmod
+ end {:690}
+ end;
+ mem[p].hh.rh := curtok;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ mem[p].hh.rh := tailend;
+ flushnodelist(substlist);
+ scantoks := mem[29998].hh.rh
+ end; {:685} {691:}
+
+ procedure getsymbol;
+ label
+ 20;
+ begin
+ 20:
+ getnext;
+ if (cursym = 0) or (cursym > 2229) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(531)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 532;
+ helpline[1] := 533;
+ helpline[0] := 534
+ end;
+ if cursym > 0 then
+ helpline[2] := 535
+ else if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end;
+ cursym := 2229;
+ inserror;
+ goto 20
+ end
+ end; { getsymbol }
+{:691}
+ {692:}
+
+ procedure getclearsymbol;
+ begin
+ getsymbol;
+ clearsymbol(cursym, false)
+ end; {:692} {693:}
+
+ procedure checkequals;
+ begin
+ if curcmd <> 51 then
+ if curcmd <> 77 then begin
+ missingerr(61);
+ begin
+ helpptr := 5;
+ helpline[4] := 536;
+ helpline[3] := 537;
+ helpline[2] := 538;
+ helpline[1] := 539;
+ helpline[0] := 540
+ end;
+ backerror
+ end
+ end; {:693} {694:}
+
+ procedure makeopdef;
+ var
+ m: commandcode;
+ p, q, r: halfword;
+ begin
+ m := curmod;
+ getsymbol;
+ q := getnode(2);
+ mem[q].hh.lh := cursym;
+ mem[q + 1].int := 2242;
+ getclearsymbol;
+ warninginfo := cursym;
+ getsymbol;
+ p := getnode(2);
+ mem[p].hh.lh := cursym;
+ mem[p + 1].int := 2243;
+ mem[p].hh.rh := q;
+ getnext;
+ checkequals;
+ scannerstatus := 5;
+ q := getavail;
+ mem[q].hh.lh := -30000;
+ r := getavail;
+ mem[q].hh.rh := r;
+ mem[r].hh.lh := 0;
+ mem[r].hh.rh := scantoks(16, p, -30000, 0);
+ scannerstatus := 0;
+ eqtb[warninginfo].lh := m;
+ eqtb[warninginfo].rh := q;
+ getxnext
+ end; {:694}
+{697:}
+ {1032:}
+
+ procedure checkdelimiter(ldelim, rdelim: halfword);
+ label
+ 10;
+ begin
+ if curcmd = 62 then
+ if curmod = ldelim then
+ goto 10;
+ if cursym <> rdelim then begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 786;
+ helpline[0] := 787
+ end;
+ backerror
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(788)
+ end;
+ print(hash[rdelim].rh);
+ print(789);
+ begin
+ helpptr := 3;
+ helpline[2] := 790;
+ helpline[1] := 791;
+ helpline[0] := 792
+ end;
+ error
+ end;
+ 10:
+ null
+ end; {:1032} {1011:}
+
+ function scandeclaredvariable: halfword;
+ label
+ 30;
+ var
+ x: halfword;
+ h, t: halfword;
+ l: halfword;
+ begin
+ getsymbol;
+ x := cursym;
+ if curcmd <> 41 then
+ clearsymbol(x, false);
+ if eqtb[x].rh = (-30000) then
+ newroot(x);
+ h := getavail;
+ mem[h].hh.lh := x;
+ t := h;
+ while true do begin
+ getxnext;
+ if cursym = 0 then
+ goto 30;
+ if curcmd <> 41 then
+ if curcmd <> 40 then
+ if curcmd = 63 then begin {1012:}
+ l := cursym;
+ getxnext;
+ if curcmd <> 64 then begin
+ backinput;
+ cursym := l;
+ curcmd := 63;
+ goto 30
+ end else
+ cursym := 0
+ end else {:1012}
+ goto 30;
+ mem[t].hh.rh := getavail;
+ t := mem[t].hh.rh;
+ mem[t].hh.lh := cursym
+ end;
+ 30:
+ scandeclaredvariable := h
+ end; {:1011}
+
+ procedure scandef;
+ var
+ m: 1..2;
+ n: 0..3;
+ k: 0..150;
+ c: 0..7;
+ r: halfword;
+ q: halfword;
+ p: halfword;
+ base: halfword;
+ ldelim, rdelim: halfword;
+ begin
+ m := curmod;
+ c := 0;
+ mem[29998].hh.rh := -30000;
+ q := getavail;
+ mem[q].hh.lh := -30000;
+ r := -30000; {700:}
+ if m = 1 then begin
+ getclearsymbol;
+ warninginfo := cursym;
+ getnext;
+ scannerstatus := 5;
+ n := 0;
+ eqtb[warninginfo].lh := 10;
+ eqtb[warninginfo].rh := q
+ end else begin
+ p := scandeclaredvariable;
+ flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, true);
+ warninginfo := findvariable(p);
+ flushlist(p);
+ if warninginfo = (-30000) then begin {701:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(547)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 548;
+ helpline[0] := 549
+ end;
+ error;
+ warninginfo := -29979
+ end {:701};
+ scannerstatus := 4;
+ n := 2;
+ if curcmd = 61 then
+ if curmod = 3 then begin
+ n := 3;
+ getnext
+ end;
+ mem[warninginfo].hh.b0 := 20 + n;
+ mem[warninginfo + 1].int := q
+ end {:700};
+ k := n;
+ if curcmd = 31 then {703:}
+ repeat
+ ldelim := cursym;
+ rdelim := curmod;
+ getnext;
+ if (curcmd = 56) and (curmod >= 2242) then
+ base := curmod
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(550)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 551
+ end;
+ backerror;
+ base := 2242
+ end; {704:}
+ repeat
+ mem[q].hh.rh := getavail;
+ q := mem[q].hh.rh;
+ mem[q].hh.lh := base + k;
+ getsymbol;
+ p := getnode(2);
+ mem[p + 1].int := base + k;
+ mem[p].hh.lh := cursym;
+ if k = 150 then
+ overflow(552, 150);
+ k := k + 1;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext
+ until curcmd <> 79 {:704};
+ checkdelimiter(ldelim, rdelim);
+ getnext
+ until curcmd <> 31 {:703};
+ if curcmd = 56 then begin {705:}
+ p := getnode(2);
+ if curmod < 2242 then begin
+ c := curmod;
+ mem[p + 1].int := 2242 + k
+ end else begin
+ mem[p + 1].int := curmod + k;
+ if curmod = 2242 then
+ c := 4
+ else if curmod = 2392 then
+ c := 6
+ else
+ c := 7
+ end;
+ if k = 150 then
+ overflow(552, 150);
+ k := k + 1;
+ getsymbol;
+ mem[p].hh.lh := cursym;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext;
+ if c = 4 then
+ if curcmd = 69 then begin
+ c := 5;
+ p := getnode(2);
+ if k = 150 then
+ overflow(552, 150);
+ mem[p + 1].int := 2242 + k;
+ getsymbol;
+ mem[p].hh.lh := cursym;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext
+ end
+ end {:705};
+ checkequals;
+ p := getavail;
+ mem[p].hh.lh := c;
+ mem[q].hh.rh := p; {698:}
+ if m = 1 then
+ mem[p].hh.rh := scantoks(16, r, -30000, n)
+ else begin
+ q := getavail;
+ mem[q].hh.lh := bgloc;
+ mem[p].hh.rh := q;
+ p := getavail;
+ mem[p].hh.lh := egloc;
+ mem[q].hh.rh := scantoks(16, r, p, n)
+ end;
+ if warninginfo = (-29979) then
+ flushtokenlist(mem[-29978].int) {:698};
+ scannerstatus := 0;
+ getxnext
+ end; {:697} {706:}
+
+ procedure scanprimary;
+ forward;
+
+ procedure scansecondary;
+ forward;
+
+ procedure scantertiary;
+ forward;
+
+ procedure scanexpression;
+ forward;
+
+ procedure scansuffix;
+ forward; {720:}
+{722:}
+
+ procedure printmacroname(a, n: halfword);
+ var
+ p, q: halfword;
+ begin
+ if n <> (-30000) then
+ print(hash[n].rh)
+ else begin
+ p := mem[a].hh.lh;
+ if p = (-30000) then
+ print(hash[mem[mem[mem[a].hh.rh].hh.lh].hh.lh].rh)
+ else begin
+ q := p;
+ while mem[q].hh.rh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := mem[mem[a].hh.rh].hh.lh;
+ showtokenlist(p, -30000, 1000, 0);
+ mem[q].hh.rh := -30000
+ end
+ end
+ end; {:722} {723:}
+
+ procedure printarg(q: halfword; n: integer; b: halfword);
+ begin
+ if mem[q].hh.rh = (-29999) then
+ printnl(365)
+ else if (b < 2542) and (b <> 7) then
+ printnl(366)
+ else
+ printnl(367);
+ printint(n);
+ print(568);
+ if mem[q].hh.rh = (-29999) then
+ printexp(q, 1)
+ else
+ showtokenlist(q, -30000, 1000, 0)
+ end; {:723} {730:}
+
+ procedure scantextarg(ldelim, rdelim: halfword);
+ label
+ 30;
+ var
+ balance: integer;
+ p: halfword;
+ begin
+ warninginfo := ldelim;
+ scannerstatus := 3;
+ p := 29998;
+ balance := 1;
+ mem[29998].hh.rh := -30000;
+ while true do begin
+ getnext;
+ if ldelim = 0 then begin {732:}
+ if curcmd > 79 then begin
+ if balance = 1 then
+ goto 30
+ else if curcmd = 81 then
+ balance := balance - 1
+ end else if curcmd = 32 then
+ balance := balance + 1
+ end else begin {:732} {731:}
+ if curcmd = 62 then begin
+ if curmod = ldelim then begin
+ balance := balance - 1;
+ if balance = 0 then
+ goto 30
+ end
+ end else if curcmd = 31 then
+ if curmod = rdelim then
+ balance := balance + 1
+ end {:731};
+ mem[p].hh.rh := curtok;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ curexp := mem[29998].hh.rh;
+ curtype := 20;
+ scannerstatus := 0
+ end; {:730}
+
+ procedure macrocall(defref, arglist, macroname: halfword);
+ label
+ 40;
+ var
+ r: halfword;
+ p, q: halfword;
+ n: integer;
+ ldelim, rdelim: halfword;
+ tail: halfword;
+ begin
+ r := mem[defref].hh.rh;
+ mem[defref].hh.lh := mem[defref].hh.lh + 1;
+ if arglist = (-30000) then
+ n := 0 {724:}
+ else begin
+ n := 1;
+ tail := arglist;
+ while mem[tail].hh.rh <> (-30000) do begin
+ n := n + 1;
+ tail := mem[tail].hh.rh
+ end
+ end {:724};
+ if internal[9] > 0 then begin {721:}
+ begindiagnostic;
+ println;
+ printmacroname(arglist, macroname);
+ if n = 3 then
+ print(530);
+ showmacro(defref, -30000, 100000);
+ if arglist <> (-30000) then begin
+ n := 0;
+ p := arglist;
+ repeat
+ q := mem[p].hh.lh;
+ printarg(q, n, 0);
+ n := n + 1;
+ p := mem[p].hh.rh
+ until p = (-30000)
+ end;
+ enddiagnostic(false)
+ end {:721}; {725:}
+ curcmd := 80;
+ while mem[r].hh.lh >= 2242 do begin {726:}
+ if curcmd <> 79 then begin
+ getxnext;
+ if curcmd <> 31 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(574)
+ end;
+ printmacroname(arglist, macroname);
+ begin
+ helpptr := 3;
+ helpline[2] := 575;
+ helpline[1] := 576;
+ helpline[0] := 577
+ end;
+ if mem[r].hh.lh >= 2392 then begin
+ curexp := -30000;
+ curtype := 20
+ end else begin
+ curexp := 0;
+ curtype := 16
+ end;
+ backerror;
+ curcmd := 62;
+ goto 40
+ end;
+ ldelim := cursym;
+ rdelim := curmod
+ end; {729:}
+ if mem[r].hh.lh >= 2542 then
+ scantextarg(ldelim, rdelim)
+ else begin
+ getxnext;
+ if mem[r].hh.lh >= 2392 then
+ scansuffix
+ else
+ scanexpression
+ end {:729};
+ if curcmd <> 79 then {727:}
+ if (curcmd <> 62) or (curmod <> ldelim) then
+ if mem[mem[r].hh.rh].hh.lh >= 2242 then begin
+ missingerr(44);
+ begin
+ helpptr := 3;
+ helpline[2] := 578;
+ helpline[1] := 579;
+ helpline[0] := 573
+ end;
+ backerror;
+ curcmd := 79
+ end else begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 580;
+ helpline[0] := 573
+ end;
+ backerror
+ end {:727};
+ 40: {728:}
+ begin
+ p := getavail;
+ if curtype = 20 then
+ mem[p].hh.lh := curexp
+ else
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, mem[r].hh.lh);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1
+ end {:728} {:726};
+ r := mem[r].hh.rh
+ end;
+ if curcmd = 79 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(569)
+ end;
+ printmacroname(arglist, macroname);
+ printchar(59);
+ printnl(570);
+ print(hash[rdelim].rh);
+ print(170);
+ begin
+ helpptr := 3;
+ helpline[2] := 571;
+ helpline[1] := 572;
+ helpline[0] := 573
+ end;
+ error
+ end;
+ if mem[r].hh.lh <> 0 then begin {733:}
+ if mem[r].hh.lh < 7 then begin
+ getxnext;
+ if mem[r].hh.lh <> 6 then
+ if (curcmd = 51) or (curcmd = 77) then
+ getxnext
+ end;
+ case mem[r].hh.lh of
+ 1:
+ scanprimary;
+ 2:
+ scansecondary;
+ 3:
+ scantertiary;
+ 4:
+ scanexpression;
+ 5:
+ begin {734:}
+ scanexpression;
+ p := getavail;
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, 0);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1;
+ if curcmd <> 69 then begin
+ missingerr(347);
+ print(581);
+ printmacroname(arglist, macroname);
+ begin
+ helpptr := 1;
+ helpline[0] := 582
+ end;
+ backerror
+ end;
+ getxnext;
+ scanprimary
+ end; {:734}
+ 6:
+ begin {735:}
+ if curcmd <> 31 then
+ ldelim := -30000
+ else begin
+ ldelim := cursym;
+ rdelim := curmod;
+ getxnext
+ end;
+ scansuffix;
+ if ldelim <> (-30000) then begin
+ if (curcmd <> 62) or (curmod <> ldelim) then begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 580;
+ helpline[0] := 573
+ end;
+ backerror
+ end;
+ getxnext
+ end
+ end; {:735}
+ 7:
+ scantextarg(0, 0)
+ end;
+ backinput; {728:}
+ begin
+ p := getavail;
+ if curtype = 20 then
+ mem[p].hh.lh := curexp
+ else
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, mem[r].hh.lh);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1
+ end {:728}
+ end {:733};
+ r := mem[r].hh.rh {:725}; {736:}
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if (paramptr + n) > maxparamstack then begin
+ maxparamstack := paramptr + n;
+ if maxparamstack > 150 then
+ overflow(552, 150)
+ end;
+ begintokenlist(defref, 12);
+ curinput.namefield := macroname;
+ curinput.locfield := r;
+ if n > 0 then begin
+ p := arglist;
+ repeat
+ paramstack[paramptr] := mem[p].hh.lh;
+ paramptr := paramptr + 1;
+ p := mem[p].hh.rh
+ until p = (-30000);
+ flushlist(arglist)
+ end {:736}
+ end; {:720}
+
+ procedure getboolean;
+ forward;
+
+ procedure passtext;
+ forward;
+
+ procedure conditional;
+ forward;
+
+ procedure startinput;
+ forward;
+
+ procedure beginiteration;
+ forward;
+
+ procedure resumeiteration;
+ forward;
+
+ procedure stopiteration;
+ forward; {:706} {707:}
+
+ procedure expand;
+ var
+ p: halfword;
+ k: integer;
+ j: poolpointer;
+ begin
+ if internal[7] > 65536 then
+ if curcmd <> 10 then
+ showcmdmod(curcmd, curmod);
+ case curcmd of
+ 1:
+ conditional;
+ 2: {751:}
+ if curmod > iflimit then
+ if iflimit = 1 then begin
+ missingerr(58);
+ backinput;
+ cursym := 2234;
+ inserror
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(589)
+ end;
+ printcmdmod(2, curmod);
+ begin
+ helpptr := 1;
+ helpline[0] := 590
+ end;
+ error
+ end
+ else begin
+ while curmod <> 2 do
+ passtext;
+{745:}
+ begin
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end {:745}
+ end {:751};
+ 3: {711:}
+ if curmod > 0 then
+ forceeof := true
+ else {:711}
+ startinput;
+ 4:
+ if curmod = 0 then begin {708:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(553)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 554;
+ helpline[0] := 555
+ end;
+ error
+ end else {:708}
+ beginiteration;
+ 5:
+ begin {712:}
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if loopptr = (-30000) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(557)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 558;
+ helpline[0] := 559
+ end;
+ error
+ end else
+ resumeiteration
+ end; {:712}
+ 6:
+ begin {713:}
+ getboolean;
+ if internal[7] > 65536 then
+ showcmdmod(33, curexp);
+ if curexp = 30 then
+ if loopptr = (-30000) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(560)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 561
+ end;
+ if curcmd = 80 then
+ error
+ else
+ backerror
+ end else begin {714:}
+ p := -30000;
+ repeat
+ if curinput.indexfield <= 6 then
+ endfilereading
+ else begin
+ if curinput.indexfield <= 8 then
+ p := curinput.startfield;
+ endtokenlist
+ end
+ until p <> (-30000);
+ if p <> mem[loopptr].hh.lh then
+ fatalerror(564);
+ stopiteration
+ end {:714}
+ else if curcmd <> 80 then begin
+ missingerr(59);
+ begin
+ helpptr := 2;
+ helpline[1] := 562;
+ helpline[0] := 563
+ end;
+ backerror
+ end
+ end; {:713}
+ 7:
+ null;
+ 9:
+ begin {715:}
+ getnext;
+ p := curtok;
+ getnext;
+ if curcmd < 11 then
+ expand
+ else
+ backinput;
+ begintokenlist(p, 10)
+ end; {:715}
+ 8:
+ begin {716:}
+ getxnext;
+ scanprimary;
+ if curtype <> 4 then begin
+ disperr(-30000, 565);
+ begin
+ helpptr := 2;
+ helpline[1] := 566;
+ helpline[0] := 567
+ end;
+ putgetflusherror(0)
+ end else begin
+ backinput;
+ if (strstart[curexp + 1] - strstart[curexp]) > 0 then begin {717:}
+ beginfilereading;
+ curinput.namefield := 2;
+ k := first + (strstart[curexp + 1] - strstart[curexp]);
+ if k >= maxbufstack then begin
+ if k >= bufsize then begin
+ maxbufstack := bufsize;
+ overflow(128, bufsize)
+ end;
+ maxbufstack := k + 1
+ end;
+ j := strstart[curexp];
+ curinput.limitfield := k;
+ while first < curinput.limitfield do begin
+ buffer[first] := strpool[j];
+ j := j + 1;
+ first := first + 1
+ end;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield;
+ flushcurexp(0)
+ end {:717}
+ end
+ end; {:716}
+ 10:
+ macrocall(curmod, -30000, cursym)
+ end
+ end; {:707} {718:}
+
+ procedure getxnext;
+ var
+ saveexp: halfword;
+ begin
+ getnext;
+ if curcmd < 11 then begin
+ saveexp := stashcurexp;
+ repeat
+ if curcmd = 10 then
+ macrocall(curmod, -30000, cursym)
+ else
+ expand;
+ getnext
+ until curcmd >= 11;
+ unstashcurexp(saveexp)
+ end
+ end; {:718} {737:}
+
+ procedure stackargument(p: halfword);
+ begin
+ if paramptr = maxparamstack then begin
+ maxparamstack := maxparamstack + 1;
+ if maxparamstack > 150 then
+ overflow(552, 150)
+ end;
+ paramstack[paramptr] := p;
+ paramptr := paramptr + 1
+ end; {:737} {742:}
+
+ procedure passtext;
+ label
+ 30;
+ var
+ l: integer;
+ begin
+ scannerstatus := 1;
+ l := 0;
+ warninginfo := line;
+ while true do begin
+ getnext;
+ if curcmd <= 2 then
+ if curcmd < 2 then
+ l := l + 1
+ else begin
+ if l = 0 then
+ goto 30;
+ if curmod = 2 then
+ l := l - 1
+ end {743:}
+ else if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ end;
+ 30:
+ scannerstatus := 0
+ end; {:742} {746:}
+
+ procedure changeiflimit(l: smallnumber; p: halfword);
+ label
+ 10;
+ var
+ q: halfword;
+ begin
+ if p = condptr then
+ iflimit := l
+ else begin
+ q := condptr;
+ while true do begin
+ if q = (-30000) then
+ confusion(583);
+ if mem[q].hh.rh = p then begin
+ mem[q].hh.b0 := l;
+ goto 10
+ end;
+ q := mem[q].hh.rh
+ end
+ end;
+ 10:
+ null
+ end; {:746} {747:}
+
+ procedure checkcolon;
+ begin
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 2;
+ helpline[1] := 586;
+ helpline[0] := 563
+ end;
+ backerror
+ end
+ end; {:747} {748:}
+
+ procedure conditional;
+ label
+ 10, 30, 21, 40;
+ var
+ savecondptr: halfword;
+ newiflimit: 2..4;
+ p: halfword; {744:}
+ begin
+ begin
+ p := getnode(2);
+ mem[p].hh.rh := condptr;
+ mem[p].hh.b0 := iflimit;
+ mem[p].hh.b1 := curif;
+ mem[p + 1].int := ifline;
+ condptr := p;
+ iflimit := 1;
+ ifline := line;
+ curif := 1
+ end {:744};
+ savecondptr := condptr;
+ 21:
+ getboolean;
+ newiflimit := 4;
+ if internal[7] > 65536 then begin {750:}
+ begindiagnostic;
+ if curexp = 30 then
+ print(587)
+ else
+ print(588);
+ enddiagnostic(false)
+ end {:750};
+ 40:
+ checkcolon;
+ if curexp = 30 then begin
+ changeiflimit(newiflimit, savecondptr);
+ goto 10
+ end; {749:}
+ while true do begin
+ passtext;
+ if condptr = savecondptr then
+ goto 30
+ else if curmod = 2 then begin {745:}
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end {:745}
+ end {:749};
+ 30:
+ curif := curmod;
+ ifline := line;
+ if curmod = 2 then begin {745:}
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end else if curmod = 4 then {:745}
+ goto 21
+ else begin
+ curexp := 30;
+ newiflimit := 2;
+ getxnext;
+ goto 40
+ end;
+ 10:
+ null
+ end; {:748} {754:}
+
+ procedure badfor(s: strnumber);
+ begin
+ disperr(-30000, 591);
+ print(s);
+ print(177);
+ begin
+ helpptr := 4;
+ helpline[3] := 592;
+ helpline[2] := 593;
+ helpline[1] := 594;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end; {:754} {755:}
+
+ procedure beginiteration;
+ label
+ 22, 30, 40;
+ var
+ m: halfword;
+ n: halfword;
+ p, q, s, pp: halfword;
+ begin
+ m := curmod;
+ n := cursym;
+ s := getnode(2);
+ if m = 1 then begin
+ mem[s + 1].hh.lh := -29999;
+ p := -30000;
+ getxnext;
+ goto 40
+ end;
+ getsymbol;
+ p := getnode(2);
+ mem[p].hh.lh := cursym;
+ mem[p + 1].int := m;
+ getxnext;
+ if (curcmd <> 51) and (curcmd <> 77) then begin
+ missingerr(61);
+ begin
+ helpptr := 3;
+ helpline[2] := 595;
+ helpline[1] := 538;
+ helpline[0] := 596
+ end;
+ backerror
+ end;
+{764:}
+ mem[s + 1].hh.lh := -30000;
+ q := s + 1;
+ mem[q].hh.rh := -30000;
+ repeat
+ getxnext;
+ if m <> 2242 then
+ scansuffix
+ else begin
+ if curcmd >= 78 then
+ if curcmd <= 79 then
+ goto 22;
+ scanexpression;
+ if curcmd = 74 then
+ if q = (s + 1) then begin {765:}
+ if curtype <> 16 then
+ badfor(602);
+ pp := getnode(4);
+ mem[pp + 1].int := curexp;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badfor(603);
+ mem[pp + 2].int := curexp;
+ if curcmd <> 75 then begin
+ missingerr(357);
+ begin
+ helpptr := 2;
+ helpline[1] := 604;
+ helpline[0] := 605
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badfor(606);
+ mem[pp + 3].int := curexp;
+ mem[s + 1].hh.lh := pp;
+ goto 30
+ end {:765};
+ curexp := stashcurexp
+ end;
+ mem[q].hh.rh := getavail;
+ q := mem[q].hh.rh;
+ mem[q].hh.lh := curexp;
+ curtype := 1;
+ 22:
+ null
+ until curcmd <> 79;
+ 30: {:764}
+ null;
+ 40: {756:}
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 3;
+ helpline[2] := 597;
+ helpline[1] := 598;
+ helpline[0] := 599
+ end;
+ backerror
+ end {:756}; {758:}
+ q := getavail;
+ mem[q].hh.lh := 2230;
+ scannerstatus := 6;
+ warninginfo := n;
+ mem[s].hh.lh := scantoks(4, p, q, 0);
+ scannerstatus := 0;
+ mem[s].hh.rh := loopptr;
+ loopptr := s {:758};
+ resumeiteration
+ end; {:755} {760:}
+
+ procedure resumeiteration;
+ label
+ 45, 10;
+ var
+ p, q: halfword;
+ begin
+ p := mem[loopptr + 1].hh.lh;
+ if p > (-29999) then begin
+ curexp := mem[p + 1].int; {761:}
+ if ((mem[p + 2].int > 0) and (curexp > mem[p + 3].int)) or ((mem[p + 2].int < 0) and (curexp < mem[p + 3].int)) then {:761}
+ goto 45;
+ curtype := 16;
+ q := stashcurexp;
+ mem[p + 1].int := curexp + mem[p + 2].int
+ end else if p < (-29999) then begin
+ p := mem[loopptr + 1].hh.rh;
+ if p = (-30000) then
+ goto 45;
+ mem[loopptr + 1].hh.rh := mem[p].hh.rh;
+ q := mem[p].hh.lh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;}
+ end else begin
+ begintokenlist(mem[loopptr].hh.lh, 7);
+ goto 10
+ end;
+ begintokenlist(mem[loopptr].hh.lh, 8);
+ stackargument(q);
+ if internal[7] > 65536 then begin {762:}
+ begindiagnostic;
+ printnl(601);
+ if (q <> (-30000)) and (mem[q].hh.rh = (-29999)) then
+ printexp(q, 1)
+ else
+ showtokenlist(q, -30000, 50, 0);
+ printchar(125);
+ enddiagnostic(false)
+ end {:762};
+ goto 10;
+ 45:
+ stopiteration;
+ 10:
+ null
+ end; {:760} {763:}
+
+ procedure stopiteration;
+ var
+ p, q: halfword;
+ begin
+ p := mem[loopptr + 1].hh.lh;
+ if p > (-29999) then
+ freenode(p, 4)
+ else if p < (-29999) then begin
+ q := mem[loopptr + 1].hh.rh;
+ while q <> (-30000) do begin
+ p := mem[q].hh.lh;
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then begin
+ recyclevalue(p);
+ freenode(p, 2)
+ end else
+ flushtokenlist(p);
+ p := q;
+ q := mem[q].hh.rh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;}
+ end
+ end;
+ p := loopptr;
+ loopptr := mem[p].hh.rh;
+ flushtokenlist(mem[p].hh.lh);
+ freenode(p, 2)
+ end; {:763} {770:}
+
+ procedure beginname;
+ begin
+ areadelimiter := 0;
+ extdelimiter := 0
+ end; {:770} {771:}
+
+ function morename(c: ASCIIcode): boolean;
+ begin
+ if (c = 32) or (c = 9) then
+ morename := false
+ else begin
+ if c = 47 then begin
+ areadelimiter := poolptr;
+ extdelimiter := 0
+ end else if (c = 46) and (extdelimiter = 0) then
+ extdelimiter := poolptr;
+ begin
+ if (poolptr + 1) > maxpoolptr then begin
+ if (poolptr + 1) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + 1
+ end
+ end;
+ begin
+ strpool[poolptr] := c;
+ poolptr := poolptr + 1
+ end;
+ morename := true
+ end
+ end; { morename }
+{:771}
+ {772:}
+
+ procedure endname;
+ begin
+ if (strptr + 3) > maxstrptr then begin
+ if (strptr + 3) > maxstrings then
+ overflow(130, maxstrings - initstrptr);
+ maxstrptr := strptr + 3
+ end;
+ if areadelimiter = 0 then
+ curarea := 155
+ else begin
+ curarea := strptr;
+ strptr := strptr + 1;
+ strstart[strptr] := areadelimiter + 1
+ end;
+ if extdelimiter = 0 then begin
+ curext := 155;
+ curname := makestring
+ end else begin
+ curname := strptr;
+ strptr := strptr + 1;
+ strstart[strptr] := extdelimiter;
+ curext := makestring
+ end
+ end; {:772} {774:}
+
+ procedure packfilename(n, a, e: strnumber);
+ var
+ k: integer;
+ c: ASCIIcode;
+ j: poolpointer;
+ begin
+ k := 0;
+ for j := strstart[a] to strstart[a + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := strstart[n] to strstart[n + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := strstart[e] to strstart[e + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ if k <= filenamesize then
+ namelength := k
+ else
+ namelength := filenamesize;
+ for k := namelength + 1 to filenamesize do
+ nameoffile[k] := ' '
+ end; {:774}
+{778:}
+
+ procedure packbufferedname(n: smallnumber; a, b: integer);
+ var
+ k: integer;
+ c: ASCIIcode;
+ j: integer;
+ begin
+ if (((n + b) - a) + 6) > filenamesize then
+ b := ((a + filenamesize) - n) - 6;
+ k := 0;
+ for j := 1 to n do begin
+ c := xord[MFbasedefault[j]];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := a to b do begin
+ c := buffer[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := 6 to 10 do begin
+ c := xord[MFbasedefault[j]];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ if k <= filenamesize then
+ namelength := k
+ else
+ namelength := filenamesize;
+ for k := namelength + 1 to filenamesize do
+ nameoffile[k] := ' '
+ end; {:778}
+{780:}
+
+ function makenamestring: strnumber;
+ var
+ k, kstart: 1..filenamesize;
+ begin
+ k := 1;
+ while (k < filenamesize) and (xord[realnameoffile[k]] <> 32) do
+ k := k + 1;
+ namelength := k - 1;
+ if ((poolptr + namelength) > poolsize) or (strptr = maxstrings) then
+ makenamestring := 63
+ else begin
+ if (xord[realnameoffile[1]] = 46) and (xord[realnameoffile[2]] = 47) then
+ kstart := 3
+ else
+ kstart := 1;
+ for k := kstart to namelength do begin
+ strpool[poolptr] := xord[realnameoffile[k]];
+ poolptr := poolptr + 1
+ end;
+ makenamestring := makestring
+ end
+ end;
+
+ function amakenamestring(var f: alphafile): strnumber;
+ begin
+ amakenamestring := makenamestring
+ end; { amakenamestring }
+
+ function bmakenamestring(var f: bytefile): strnumber;
+ begin
+ bgetname(f, realnameoffile);
+ bmakenamestring := makenamestring
+ end; { bmakenamestring }
+
+ function wmakenamestring(var f: wordfile): strnumber;
+ begin
+ wmakenamestring := makenamestring
+ end; {:780} {781:}
+
+ procedure scanfilename;
+ label
+ 30;
+ begin
+ beginname;
+ while (buffer[curinput.locfield] = 32) or (buffer[curinput.locfield] = 9) do
+ curinput.locfield := curinput.locfield + 1;
+ while true do begin
+ if (buffer[curinput.locfield] = 59) or (buffer[curinput.locfield] = 37) then
+ goto 30;
+ if not morename(buffer[curinput.locfield]) then
+ goto 30;
+ curinput.locfield := curinput.locfield + 1
+ end;
+ 30:
+ endname
+ end; {:781} {784:}
+
+ procedure packjobname(s: strnumber);
+ begin
+ curarea := 155;
+ curext := s;
+ curname := jobname;
+ packfilename(curname, curarea, curext)
+ end; {:784} {786:}
+
+ procedure promptfilename(s, e: strnumber);
+ label
+ 30;
+ var
+ k: 0..bufsize;
+ begin
+ if interaction = 2 then
+ null;
+ if s = 607 then begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(608)
+ end else begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(609)
+ end;
+ printfilename(curname, curarea, curext);
+ print(610);
+ if e = 611 then
+ showcontext;
+ printnl(612);
+ print(s);
+ if interaction < 2 then
+ fatalerror(613);
+ begin
+ print(614);
+ terminput
+ end;
+{787:}
+ begin
+ beginname;
+ k := first;
+ while ((buffer[k] = 32) or (buffer[k] = 9)) and (k < last) do
+ k := k + 1;
+ while true do begin
+ if k = last then
+ goto 30;
+ if not morename(buffer[k]) then
+ goto 30;
+ k := k + 1
+ end;
+ 30:
+ endname
+ end {:787};
+ if curext = 155 then
+ curext := e;
+ packfilename(curname, curarea, curext)
+ end; { promptfilename }
+{:786}
+ {788:}
+
+ procedure openlogfile;
+ var
+ oldsetting: 0..5;
+ k: 0..bufsize;
+ l: 0..bufsize;
+ m: integer;
+ months: packed array [1..36] of char;
+ begin
+ oldsetting := selector;
+ if jobname = 0 then
+ jobname := 615;
+ packjobname(616);
+ while not aopenout(logfile) do begin {789:}
+ if interaction < 2 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(609)
+ end;
+ printfilename(curname, curarea, curext);
+ print(610);
+ jobname := 0;
+ history := 3;
+ jumpout
+ end;
+ promptfilename(618, 616)
+ end {:789};
+ logname := amakenamestring(logfile);
+ selector := 2; {790:}
+ begin
+ write(logfile, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
+ print(baseident);
+ print(619);
+ printint(roundunscaled(internal[16]));
+ printchar(32);
+ months := 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+ m := roundunscaled(internal[15]);
+ for k := (3 * m) - 2 to 3 * m do
+ write(logfile, months[k]);
+ printchar(32);
+ printint(roundunscaled(internal[14]));
+ printchar(32);
+ m := roundunscaled(internal[17]);
+ printdd(m div 60);
+ printchar(58);
+ printdd(m mod 60)
+ end {:790};
+ inputstack[inputptr] := curinput;
+ printnl(617);
+ l := inputstack[0].limitfield - 1;
+ for k := 1 to l do
+ print(buffer[k]);
+ println;
+ selector := oldsetting + 2
+ end; {:788} {793:}
+
+ procedure startinput;
+ label
+ 30; {795:}
+ begin
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if curinput.indexfield > 6 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(621)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 622;
+ helpline[1] := 623;
+ helpline[0] := 624
+ end;
+ error
+ end;
+ if curinput.indexfield <= 6 then
+ scanfilename
+ else begin
+ curname := 155;
+ curext := 155;
+ curarea := 155
+ end {:795};
+ if curext = 155 then
+ curext := 611;
+ packfilename(curname, curarea, curext);
+ while true do begin
+ beginfilereading;
+ if aopenin(inputfile[curinput.indexfield], 6) then
+ goto 30;
+ endfilereading;
+ promptfilename(607, 611)
+ end;
+ 30:
+ curinput.namefield := amakenamestring(inputfile[curinput.indexfield]);
+ strref[curname] := 127;
+ if jobname = 0 then begin
+ jobname := curname;
+ openlogfile
+ end;
+ if (termoffset + (strstart[curinput.namefield + 1] - strstart[curinput.namefield])) > (maxprintline - 2) then
+ println
+ else if (termoffset > 0) or (fileoffset > 0) then
+ printchar(32);
+ printchar(40);
+ print(curinput.namefield);
+ flush(output); {794:}
+ begin
+ if not inputln(inputfile[curinput.indexfield], false) then
+ null;
+ firmuptheline;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield;
+ line := 1
+ end {:794}
+ end; {:793} {824:}
+
+ procedure badexp(s: strnumber);
+ var
+ saveflag: 0..82;
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(s)
+ end;
+ print(634);
+ printcmdmod(curcmd, curmod);
+ printchar(39);
+ begin
+ helpptr := 4;
+ helpline[3] := 635;
+ helpline[2] := 636;
+ helpline[1] := 637;
+ helpline[0] := 638
+ end;
+ backinput;
+ cursym := 0;
+ curcmd := 42;
+ curmod := 0;
+ inserror;
+ saveflag := varflag;
+ varflag := 0;
+ getxnext;
+ varflag := saveflag
+ end; {:824} {827:}
+
+ procedure stashin(p: halfword);
+ var
+ q: halfword;
+ begin
+ mem[p].hh.b0 := curtype;
+ {
+ 829:}
+ if curtype = 16 then
+ mem[p + 1].int := curexp
+ else begin
+ if curtype = 19 then begin
+ q := singledependency(curexp);
+ if q = depfinal then begin
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := 0;
+ freenode(q, 2)
+ end else begin
+ mem[p].hh.b0 := 17;
+ newdep(p, q)
+ end;
+ recyclevalue(curexp)
+ end else begin {:829}
+ mem[p + 1] := mem[curexp + 1];
+ mem[mem[p + 1].hh.lh].hh.rh := p
+ end;
+ freenode(curexp, 2)
+ end;
+ curtype := 1
+ end; { stashin }
+{:827}
+ {848:}
+
+ procedure backexpr;
+ var
+ p: halfword;
+ begin
+ p := stashcurexp;
+ mem[p].hh.rh := -30000;
+ begintokenlist(p, 10)
+ end; {:848} {849:}
+
+ procedure badsubscript;
+ begin
+ disperr(-30000, 650);
+ begin
+ helpptr := 3;
+ helpline[2] := 651;
+ helpline[1] := 652;
+ helpline[0] := 653
+ end;
+ flusherror(0)
+ end; {:849} {851:}
+
+ procedure obliterated(q: halfword);
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(654)
+ end;
+ showtokenlist(q, -30000, 1000, 0);
+ print(655);
+ begin
+ helpptr := 5;
+ helpline[4] := 656;
+ helpline[3] := 657;
+ helpline[2] := 658;
+ helpline[1] := 659;
+ helpline[0] := 660
+ end
+ end; {:851} {863:}
+
+ procedure binarymac(p, c, n: halfword);
+ var
+ q, r: halfword;
+ begin
+ q := getavail;
+ r := getavail;
+ mem[q].hh.rh := r;
+ mem[q].hh.lh := p;
+ mem[r].hh.lh := stashcurexp;
+ macrocall(c, q, n)
+ end; {:863} {865:}
+
+ procedure materializepen;
+ label
+ 50;
+ var
+ aminusb, aplusb, majoraxis, minoraxis: scaled;
+ theta: angle;
+ p: halfword;
+ q: halfword;
+ begin
+ q := curexp;
+ if mem[q].hh.b0 = 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(670)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 671;
+ helpline[0] := 442
+ end;
+ putgeterror;
+ curexp := -29997;
+ goto 50
+ end else if mem[q].hh.b0 = 4 then begin {866:}
+ tx := mem[q + 1].int;
+ ty := mem[q + 2].int;
+ txx := mem[q + 3].int - tx;
+ tyx := mem[q + 4].int - ty;
+ txy := mem[q + 5].int - tx;
+ tyy := mem[q + 6].int - ty;
+ aminusb := pythadd(txx - tyy, tyx + txy);
+ aplusb := pythadd(txx + tyy, tyx - txy);
+ majoraxis := (aminusb + aplusb) div 2;
+ minoraxis := abs(aplusb - aminusb) div 2;
+ if majoraxis = minoraxis then
+ theta := 0
+ else
+ theta := (narg(txx - tyy, tyx + txy) + narg(txx + tyy, tyx - txy)) div 2;
+ freenode(q, 7);
+ q := makeellipse(majoraxis, minoraxis, theta);
+ if (tx <> 0) or (ty <> 0) then begin {867:}
+ p := q;
+ repeat
+ mem[p + 1].int := mem[p + 1].int + tx;
+ mem[p + 2].int := mem[p + 2].int + ty;
+ p := mem[p].hh.rh
+ until p = q
+ end {:867}
+ end {:866};
+ curexp := makepen(q);
+ 50:
+ tossknotlist(q);
+ curtype := 6
+ end; {:865}
+{871:}
+ {872:}
+
+ procedure knownpair;
+ var
+ p: halfword;
+ begin
+ if curtype <> 14 then begin
+ disperr(-30000, 673);
+ begin
+ helpptr := 5;
+ helpline[4] := 674;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0);
+ curx := 0;
+ cury := 0
+ end else begin
+ p := mem[curexp + 1].int; {873:}
+ if mem[p].hh.b0 = 16 then
+ curx := mem[p + 1].int
+ else begin
+ disperr(p, 679);
+ begin
+ helpptr := 5;
+ helpline[4] := 680;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgeterror;
+ recyclevalue(p);
+ curx := 0
+ end;
+ if mem[p + 2].hh.b0 = 16 then
+ cury := mem[p + 3].int
+ else begin
+ disperr(p + 2, 681);
+ begin
+ helpptr := 5;
+ helpline[4] := 682;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgeterror;
+ recyclevalue(p + 2);
+ cury := 0
+ end {:873};
+ flushcurexp(0)
+ end
+ end; {:872}
+
+ function newknot: halfword;
+ var
+ q: halfword;
+ begin
+ q := getnode(7);
+ mem[q].hh.b0 := 0;
+ mem[q].hh.b1 := 0;
+ mem[q].hh.rh := q;
+ knownpair;
+ mem[q + 1].int := curx;
+ mem[q + 2].int := cury;
+ newknot := q
+ end; {:871} {875:}
+
+ function scandirection: smallnumber;
+ var
+ t: 2..4;
+ x: scaled;
+ begin
+ getxnext;
+ if curcmd = 60 then begin {876:}
+ getxnext;
+ scanexpression;
+ if (curtype <> 16) or (curexp < 0) then begin
+ disperr(-30000, 685);
+ begin
+ helpptr := 1;
+ helpline[0] := 686
+ end;
+ putgetflusherror(65536)
+ end;
+ t := 3
+ end else begin {:876} {877:}
+ scanexpression;
+ if curtype > 14 then begin {878:}
+ if curtype <> 16 then begin
+ disperr(-30000, 679);
+ begin
+ helpptr := 5;
+ helpline[4] := 680;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0)
+ end;
+ x := curexp;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 2;
+ helpline[1] := 687;
+ helpline[0] := 688
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 681);
+ begin
+ helpptr := 5;
+ helpline[4] := 682;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0)
+ end;
+ cury := curexp;
+ curx := x
+ end else {:878}
+ knownpair;
+ if (curx = 0) and (cury = 0) then
+ t := 4
+ else begin
+ t := 2;
+ curexp := narg(curx, cury)
+ end
+ end {:877};
+ if curcmd <> 65 then begin
+ missingerr(125);
+ begin
+ helpptr := 3;
+ helpline[2] := 683;
+ helpline[1] := 684;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ getxnext;
+ scandirection := t
+ end; {:875} {895:}
+
+ procedure donullary(c: quarterword);
+ var
+ k: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then
+ showcmdmod(33, c);
+ case c of
+ 30, 31:
+ begin
+ curtype := 2;
+ curexp := c
+ end;
+ 32:
+ begin
+ curtype := 11;
+ curexp := getnode(6);
+ initedges(curexp)
+ end;
+ 33:
+ begin
+ curtype := 6;
+ curexp := -29997
+ end;
+ 37:
+ begin
+ curtype := 16;
+ curexp := normrand
+ end;
+ 36:
+ begin {896:}
+ curtype := 8;
+ curexp := getnode(7);
+ mem[curexp].hh.b0 := 4;
+ mem[curexp].hh.b1 := 4;
+ mem[curexp].hh.rh := curexp;
+ mem[curexp + 1].int := 0;
+ mem[curexp + 2].int := 0;
+ mem[curexp + 3].int := 65536;
+ mem[curexp + 4].int := 0;
+ mem[curexp + 5].int := 0;
+ mem[curexp + 6].int := 65536
+ end; {:896}
+ 34:
+ begin
+ if jobname = 0 then
+ openlogfile;
+ curtype := 4;
+ curexp := jobname
+ end;
+ 35:
+ begin {897:}
+ if interaction <= 1 then
+ fatalerror(699);
+ beginfilereading;
+ curinput.namefield := 1;
+ begin
+ print(155);
+ terminput
+ end;
+ begin
+ if ((poolptr + last) - curinput.startfield) > maxpoolptr then begin
+ if ((poolptr + last) - curinput.startfield) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + last) - curinput.startfield
+ end
+ end;
+ for k := curinput.startfield to last - 1 do begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ endfilereading;
+ curtype := 4;
+ curexp := makestring
+ end
+ end {:897};
+ begin
+ if aritherror then
+ cleararith
+ end
+ end; {:895} {898:}
+{899:}
+
+ function nicepair(p: integer; t: quarterword): boolean;
+ label
+ 10;
+ begin
+ if t = 14 then begin
+ p := mem[p + 1].int;
+ if mem[p].hh.b0 = 16 then
+ if mem[p + 2].hh.b0 = 16 then begin
+ nicepair := true;
+ goto 10
+ end
+ end;
+ nicepair := false;
+ 10:
+ null
+ end; {:899} {900:}
+
+ procedure printknownorunknownt(t: smallnumber; v: integer);
+ begin
+ printchar(40);
+ if t < 17 then
+ if t <> 14 then
+ printtype(t)
+ else if nicepair(v, 14) then
+ print(207)
+ else
+ print(700)
+ else
+ print(701);
+ printchar(41)
+ end; {:900} {901:}
+
+ procedure badunary(c: quarterword);
+ begin
+ disperr(-30000, 702);
+ printop(c);
+ printknownorunknownt(curtype, curexp);
+ begin
+ helpptr := 3;
+ helpline[2] := 703;
+ helpline[1] := 704;
+ helpline[0] := 705
+ end;
+ putgeterror
+ end; {:901} {904:}
+
+ procedure negatedeplist(p: halfword);
+ label
+ 10;
+ begin
+ while true do begin
+ mem[p + 1].int := -mem[p + 1].int;
+ if mem[p].hh.lh = (-30000) then
+ goto 10;
+ p := mem[p].hh.rh
+ end;
+ 10:
+ null
+ end; {:904}
+{908:}
+
+ procedure pairtopath;
+ begin
+ curexp := newknot;
+ curtype := 9
+ end; {:908}
+{910:}
+
+ procedure takepart(c: quarterword);
+ var
+ p: halfword;
+ begin
+ p := mem[curexp + 1].int;
+ mem[-29982].int := p;
+ mem[-29983].hh.b0 := curtype;
+ mem[p].hh.rh := -29983;
+ freenode(curexp, 2);
+ makeexpcopy(p + (2 * (c - 53)));
+ recyclevalue(-29983)
+ end; {:910} {913:}
+
+ procedure strtonum(c: quarterword);
+ var
+ n: integer;
+ m: ASCIIcode;
+ k: poolpointer;
+ b: 8..16;
+ badchar: boolean;
+ begin
+ if c = 49 then
+ if (strstart[curexp + 1] - strstart[curexp]) = 0 then
+ n := -1
+ else
+ n := strpool[strstart[curexp]]
+ else begin
+ if c = 47 then
+ b := 8
+ else
+ b := 16;
+ n := 0;
+ badchar := false;
+ for k := strstart[curexp] to strstart[curexp + 1] - 1 do begin
+ m := strpool[k];
+ if (m >= 48) and (m <= 57) then
+ m := m - 48
+ else if (m >= 65) and (m <= 70) then
+ m := m - 55
+ else if (m >= 97) and (m <= 102) then
+ m := m - 87
+ else begin
+ badchar := true;
+ m := 0
+ end;
+ if m >= b then begin
+ badchar := true;
+ m := 0
+ end;
+ if n < (32768 div b) then
+ n := (n * b) + m
+ else
+ n := 32767
+ end; {914:}
+ if badchar then begin
+ disperr(-30000, 707);
+ if c = 47 then begin
+ helpptr := 1;
+ helpline[0] := 708
+ end else begin
+ helpptr := 1;
+ helpline[0] := 709
+ end;
+ putgeterror
+ end;
+ if n > 4095 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(710)
+ end;
+ printint(n);
+ printchar(41);
+ begin
+ helpptr := 1;
+ helpline[0] := 711
+ end;
+ putgeterror
+ end {:914}
+ end;
+ flushcurexp(n * 65536)
+ end; { strtonum }
+{:913}
+ {916:}
+
+ function pathlength: scaled;
+ var
+ n: scaled;
+ p: halfword;
+ begin
+ p := curexp;
+ if mem[p].hh.b0 = 0 then
+ n := -65536
+ else
+ n := 0;
+ repeat
+ p := mem[p].hh.rh;
+ n := n + 65536
+ until p = curexp;
+ pathlength := n
+ end; { pathlength }
+{:916}
+ {919:}
+
+ procedure testknown(c: quarterword);
+ label
+ 30;
+ var
+ b: 30..31;
+ p, q: halfword;
+ begin
+ b := 31;
+ if curtype in
+ [1, 2, 4, 6, 8, 9, 11, 16,
+ 13, 14] then
+ case curtype of
+ 1, 2, 4, 6, 8, 9, 11,
+ 16:
+ b := 30;
+ 13, 14:
+ begin
+ p := mem[curexp + 1].int;
+ q := p + bignodesize[curtype];
+ repeat
+ q := q - 2;
+ if mem[q].hh.b0 <> 16 then
+ goto 30
+ until q = p;
+ b := 30;
+ 30:
+ null
+ end
+ end
+ else
+ null;
+ if c = 39 then
+ flushcurexp(b)
+ else
+ flushcurexp(61 - b);
+ curtype := 2
+ end; {:919}
+
+ procedure dounary(c: quarterword);
+ var
+ p, q: halfword;
+ x: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then begin {902:}
+ begindiagnostic;
+ printnl(123);
+ printop(c);
+ printchar(40);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:902};
+ case c of
+ 69:
+ if curtype < 14 then
+ if curtype <> 11 then
+ badunary(69);
+ 70: {903:}
+ if curtype in
+ [14, 19, 17, 18, 16, 11] then
+ case curtype of
+ 14, 19:
+ begin
+ q := curexp;
+ makeexpcopy(q);
+ if curtype = 17 then
+ negatedeplist(mem[curexp + 1].hh.rh)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ if mem[p].hh.b0 = 16 then
+ mem[p + 1].int := -mem[p + 1].int
+ else
+ negatedeplist(mem[p + 1].hh.rh);
+ if mem[p + 2].hh.b0 = 16 then
+ mem[p + 3].int := -mem[p + 3].int
+ else
+ negatedeplist(mem[p + 3].hh.rh)
+ end;
+ recyclevalue(q);
+ freenode(q, 2)
+ end;
+ 17, 18:
+ negatedeplist(mem[curexp + 1].hh.rh);
+ 16:
+ curexp := -curexp;
+ 11:
+ negateedges(curexp)
+ end
+ else
+ badunary(70) {:903}; {905:}
+ 41:
+ if curtype <> 2 then
+ badunary(41)
+ else
+ curexp := 61 - curexp; {:905} {906:}
+ 59, 60, 61, 62, 63, 64, 65,
+ 38, 66:
+ if curtype <> 16 then
+ badunary(c)
+ else
+ case c of
+ 59:
+ curexp := squarert(curexp);
+ 60:
+ curexp := mexp(curexp);
+ 61:
+ curexp := mlog(curexp);
+ 62, 63:
+ begin
+ nsincos((curexp mod 23592960) * 16);
+ if c = 62 then
+ curexp := roundfraction(nsin)
+ else
+ curexp := roundfraction(ncos)
+ end;
+ 64:
+ curexp := floorscaled(curexp);
+ 65:
+ curexp := unifrand(curexp);
+ 38:
+ begin
+ if odd(roundunscaled(curexp)) then
+ curexp := 30
+ else
+ curexp := 31;
+ curtype := 2
+ end;
+ 66:
+ begin {1181:}
+ curexp := roundunscaled(curexp) mod 256;
+ if curexp < 0 then
+ curexp := curexp + 256;
+ if charexists[curexp] then
+ curexp := 30
+ else
+ curexp := 31;
+ curtype := 2
+ end
+ end {:1181}; {:906} {907:}
+ 67:
+ if nicepair(curexp, curtype) then begin
+ p := mem[curexp + 1].int;
+ x := narg(mem[p + 1].int, mem[p + 3].int);
+ if x >= 0 then
+ flushcurexp((x + 8) div 16)
+ else
+ flushcurexp(-(((-x) + 8) div 16))
+ end else
+ badunary(67); {:907} {909:}
+ 53, 54:
+ if (curtype <= 14) and (curtype >= 13) then
+ takepart(c)
+ else
+ badunary(c);
+ 55, 56, 57, 58:
+ if curtype = 13 then
+ takepart(c)
+ else
+ badunary(c); {:909} {912:}
+ 50:
+ if curtype <> 16 then
+ badunary(50)
+ else begin
+ curexp := roundunscaled(curexp) mod 128;
+ curtype := 4;
+ if curexp < 0 then
+ curexp := curexp + 128;
+ if (strstart[curexp + 1] - strstart[curexp]) <> 1 then begin
+ begin
+ if (poolptr + 1) > maxpoolptr then begin
+ if (poolptr + 1) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + 1
+ end
+ end;
+ begin
+ strpool[poolptr] := curexp;
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring
+ end
+ end;
+ 42:
+ if curtype <> 16 then
+ badunary(42)
+ else begin
+ oldsetting := selector;
+ selector := 5;
+ printscaled(curexp);
+ curexp := makestring;
+ selector := oldsetting;
+ curtype := 4
+ end;
+ 47, 48, 49:
+ if curtype <> 4 then
+ badunary(c)
+ else
+ strtonum(c);
+{:912}
+ {915:}
+ 51:
+ if curtype = 4 then
+ flushcurexp((strstart[curexp + 1] - strstart[curexp]) * 65536)
+ else if curtype = 9 then
+ flushcurexp(pathlength)
+ else if curtype = 16 then
+ curexp := abs(curexp)
+ else if nicepair(curexp, curtype) then
+ flushcurexp(pythadd(mem[mem[curexp + 1].int + 1].int, mem[mem[curexp + 1].int + 3].int))
+ else
+ badunary(c); {:915} {917:}
+ 52:
+ if curtype = 14 then
+ flushcurexp(0)
+ else if curtype <> 9 then
+ badunary(52)
+ else if mem[curexp].hh.b0 = 0 then
+ flushcurexp(0)
+ else begin
+ curpen := -29997;
+ curpathtype := 1;
+ curexp := makespec(curexp, -1879080960, 0);
+ flushcurexp(turningnumber * 65536)
+ end; {:917} {918:}
+ 2:
+ begin
+ if (curtype >= 2) and (curtype <= 3) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 4:
+ begin
+ if (curtype >= 4) and (curtype <= 5) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 6:
+ begin
+ if (curtype >= 6) and (curtype <= 8) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 9:
+ begin
+ if (curtype >= 9) and (curtype <= 10) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 11:
+ begin
+ if (curtype >= 11) and (curtype <= 12) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 13, 14:
+ begin
+ if curtype = c then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 15:
+ begin
+ if (curtype >= 16) and (curtype <= 19) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 39, 40:
+ testknown(c); {:918} {920:}
+ 68:
+ begin
+ if curtype <> 9 then
+ flushcurexp(31)
+ else if mem[curexp].hh.b0 <> 0 then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end; {:920} {921:}
+ 45:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if curtype = 9 then
+ curtype := 8
+ else
+ badunary(45)
+ end;
+ 44:
+ begin
+ if curtype = 8 then
+ materializepen;
+ if curtype <> 6 then
+ badunary(44)
+ else begin
+ flushcurexp(makepath(curexp));
+ curtype := 9
+ end
+ end;
+ 46:
+ if curtype <> 11 then
+ badunary(46)
+ else
+ flushcurexp(totalweight(curexp));
+ 43:
+ if curtype = 9 then begin
+ p := htapypoc(curexp);
+ if mem[p].hh.b1 = 0 then
+ p := mem[p].hh.rh;
+ tossknotlist(curexp);
+ curexp := p
+ end else if curtype = 14 then
+ pairtopath
+ else
+ badunary(43)
+ end {:921};
+ begin
+ if aritherror then
+ cleararith
+ end
+ end; {:898} {922:} {923:}
+
+ procedure badbinary(p: halfword; c: quarterword);
+ begin
+ disperr(p, 155);
+ disperr(-30000, 702);
+ if c >= 94 then
+ printop(c);
+ printknownorunknownt(mem[p].hh.b0, p);
+ if c >= 94 then
+ print(347)
+ else
+ printop(c);
+ printknownorunknownt(curtype, curexp);
+ begin
+ helpptr := 3;
+ helpline[2] := 703;
+ helpline[1] := 712;
+ helpline[0] := 713
+ end;
+ putgeterror
+ end; {:923} {928:}
+
+ function tarnished(p: halfword): halfword;
+ label
+ 10;
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := mem[p + 1].int;
+ r := q + bignodesize[mem[p].hh.b0];
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 = 19 then begin
+ tarnished := -29999;
+ goto 10
+ end
+ until r = q;
+ tarnished := -30000;
+ 10:
+ null
+ end; {:928} {930:} {935:}
+
+ procedure depfinish(v, q: halfword; t: smallnumber);
+ var
+ p: halfword;
+ vv: scaled;
+ begin
+ if q = (-30000) then
+ p := curexp
+ else
+ p := q;
+ mem[p + 1].hh.rh := v;
+ mem[p].hh.b0 := t;
+ if mem[v].hh.lh = (-30000) then begin
+ vv := mem[v + 1].int;
+ if q = (-30000) then
+ flushcurexp(vv)
+ else begin
+ recyclevalue(p);
+ mem[q].hh.b0 := 16;
+ mem[q + 1].int := vv
+ end
+ end else if q = (-30000) then
+ curtype := t;
+ if fixneeded then
+ fixdependencies
+ end; {:935}
+
+ procedure addorsubtract(p, q: halfword; c: quarterword);
+ label
+ 30, 10;
+ var
+ s, t: smallnumber;
+ r: halfword;
+ v: integer;
+ begin
+ if q = (-30000) then begin
+ t := curtype;
+ if t < 17 then
+ v := curexp
+ else
+ v := mem[curexp + 1].hh.rh
+ end else begin
+ t := mem[q].hh.b0;
+ if t < 17 then
+ v := mem[q + 1].int
+ else
+ v := mem[q + 1].hh.rh
+ end;
+ if t = 16 then begin
+ if c = 70 then
+ v := -v;
+ if mem[p].hh.b0 = 16 then begin
+ v := slowadd(mem[p + 1].int, v);
+ if q = (-30000) then
+ curexp := v
+ else
+ mem[q + 1].int := v;
+ goto 10
+ end; {931:}
+ r := mem[p + 1].hh.rh;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ mem[r + 1].int := slowadd(mem[r + 1].int, v);
+ if q = (-30000) then begin
+ q := getnode(2);
+ curexp := q;
+ curtype := mem[p].hh.b0;
+ mem[q].hh.b1 := 11
+ end;
+ mem[q + 1].hh.rh := mem[p + 1].hh.rh;
+ mem[q].hh.b0 := mem[p].hh.b0;
+ mem[q + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[mem[p + 1].hh.lh].hh.rh := q;
+ mem[p].hh.b0 := 16
+ end else begin {:931}
+ if c = 70 then
+ negatedeplist(v); {932:}
+ if mem[p].hh.b0 = 16 then begin {933:}
+ while mem[v].hh.lh <> (-30000) do
+ v := mem[v].hh.rh;
+ mem[v + 1].int := slowadd(mem[p + 1].int, mem[v + 1].int)
+ end else begin {:933}
+ s := mem[p].hh.b0;
+ r := mem[p + 1].hh.rh;
+ if t = 17 then begin
+ if s = 17 then
+ if (maxcoef(r) + maxcoef(v)) < 626349397 then begin
+ v := pplusq(v, r, 17);
+ goto 30
+ end;
+ t := 18;
+ v := poverv(v, 65536, 17, 18)
+ end;
+ if s = 18 then
+ v := pplusq(v, r, 18)
+ else
+ v := pplusfq(v, 65536, r, 18, 17);
+ 30: {934:}
+ if q <> (-30000) then
+ depfinish(v, q, t)
+ else begin
+ curtype := t;
+ depfinish(v, -30000, t)
+ end {:934}
+ end {:932}
+ end;
+ 10:
+ null
+ end; {:930} {943:}
+
+ procedure depmult(p: halfword; v: integer; visscaled: boolean);
+ label
+ 10;
+ var
+ q: halfword;
+ s, t: smallnumber;
+ begin
+ if p = (-30000) then
+ q := curexp
+ else if mem[p].hh.b0 <> 16 then
+ q := p
+ else begin
+ if visscaled then
+ mem[p + 1].int := takescaled(mem[p + 1].int, v)
+ else
+ mem[p + 1].int := takefraction(mem[p + 1].int, v);
+ goto 10
+ end;
+ t := mem[q].hh.b0;
+ q := mem[q + 1].hh.rh;
+ s := t;
+ if t = 17 then
+ if visscaled then
+ if abvscd(maxcoef(q), abs(v), 626349396, 65536) >= 0 then
+ t := 18;
+ q := ptimesv(q, v, s, t, visscaled);
+ depfinish(q, p, t);
+ 10:
+ null
+ end; {:943} {946:}
+
+ procedure hardtimes(p: halfword);
+ var
+ q: halfword;
+ r: halfword;
+ u, v: scaled;
+ begin
+ if mem[p].hh.b0 = 14 then begin
+ q := stashcurexp;
+ unstashcurexp(p);
+ p := q
+ end;
+ r := mem[curexp + 1].int;
+ u := mem[r + 1].int;
+ v := mem[r + 3].int; {947:}
+ mem[r + 2].hh.b0 := mem[p].hh.b0;
+ newdep(r + 2, copydeplist(mem[p + 1].hh.rh));
+ mem[r].hh.b0 := mem[p].hh.b0;
+ mem[r + 1] := mem[p + 1];
+ mem[mem[p + 1].hh.lh].hh.rh := r;
+ freenode(p, 2) {:947};
+ depmult(r, u, true);
+ depmult(r + 2, v, true)
+ end; {:946} {949:}
+
+ procedure depdiv(p: halfword; v: scaled);
+ label
+ 10;
+ var
+ q: halfword;
+ s, t: smallnumber;
+ begin
+ if p = (-30000) then
+ q := curexp
+ else if mem[p].hh.b0 <> 16 then
+ q := p
+ else begin
+ mem[p + 1].int := makescaled(mem[p + 1].int, v);
+ goto 10
+ end;
+ t := mem[q].hh.b0;
+ q := mem[q + 1].hh.rh;
+ s := t;
+ if t = 17 then
+ if abvscd(maxcoef(q), 65536, 626349396, abs(v)) >= 0 then
+ t := 18;
+ q := poverv(q, v, s, t);
+ depfinish(q, p, t);
+ 10:
+ null
+ end; {:949} {953:}
+
+ procedure setuptrans(c: quarterword);
+ label
+ 30, 10;
+ var
+ p, q, r: halfword;
+ begin
+ if (c <> 88) or (curtype <> 13) then begin {955:}
+ p := stashcurexp;
+ curexp := idtransform;
+ curtype := 13;
+ q := mem[curexp + 1].int;
+ case c of {957:}
+ 84:
+ if mem[p].hh.b0 = 16 then begin {958:}
+ nsincos((mem[p + 1].int mod 23592960) * 16);
+ mem[q + 5].int := roundfraction(ncos);
+ mem[q + 9].int := roundfraction(nsin);
+ mem[q + 7].int := -mem[q + 9].int;
+ mem[q + 11].int := mem[q + 5].int;
+ goto 30
+ end {:958};
+ 85:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 6, p);
+ goto 30
+ end;
+ 86:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 4, p);
+ install(q + 10, p);
+ goto 30
+ end;
+ 87:
+ if mem[p].hh.b0 = 14 then begin
+ r := mem[p + 1].int;
+ install(q, r);
+ install(q + 2, r + 2);
+ goto 30
+ end;
+ 89:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 4, p);
+ goto 30
+ end;
+ 90:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 10, p);
+ goto 30
+ end;
+ 91:
+ if mem[p].hh.b0 = 14 then begin {959:}
+ r := mem[p + 1].int;
+ install(q + 4, r);
+ install(q + 10, r);
+ install(q + 8, r + 2);
+ if mem[r + 2].hh.b0 = 16 then
+ mem[r + 3].int := -mem[r + 3].int
+ else
+ negatedeplist(mem[r + 3].hh.rh);
+ install(q + 6, r + 2);
+ goto 30
+ end {:959};
+ 88:
+ null
+ end {:957};
+ disperr(p, 722);
+ begin
+ helpptr := 3;
+ helpline[2] := 723;
+ helpline[1] := 724;
+ helpline[0] := 405
+ end;
+ putgeterror;
+ 30:
+ recyclevalue(p);
+ freenode(p, 2)
+ end {:955}; {956:}
+ q := mem[curexp + 1].int;
+ r := q + 12;
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 <> 16 then
+ goto 10
+ until r = q;
+ txx := mem[q + 5].int;
+ txy := mem[q + 7].int;
+ tyx := mem[q + 9].int;
+ tyy := mem[q + 11].int;
+ tx := mem[q + 1].int;
+ ty := mem[q + 3].int;
+ flushcurexp(0) {:956};
+ 10:
+ null
+ end; {:953} {960:}
+
+ procedure setupknowntrans(c: quarterword);
+ begin
+ setuptrans(c);
+ if curtype <> 16 then begin
+ disperr(-30000, 725);
+ begin
+ helpptr := 3;
+ helpline[2] := 726;
+ helpline[1] := 727;
+ helpline[0] := 405
+ end;
+ putgetflusherror(0);
+ txx := 65536;
+ txy := 0;
+ tyx := 0;
+ tyy := 65536;
+ tx := 0;
+ ty := 0
+ end
+ end; {:960} {961:}
+
+ procedure trans(p, q: halfword);
+ var
+ v: scaled;
+ begin
+ v := (takescaled(mem[p].int, txx) + takescaled(mem[q].int, txy)) + tx;
+ mem[q].int := (takescaled(mem[p].int, tyx) + takescaled(mem[q].int, tyy)) + ty;
+ mem[p].int := v
+ end; {:961} {962:}
+
+ procedure pathtrans(p: halfword; c: quarterword);
+ label
+ 10;
+ var
+ q: halfword;
+ begin
+ setupknowntrans(c);
+ unstashcurexp(p);
+ if curtype = 6 then begin
+ if mem[curexp + 9].int = 0 then
+ if tx = 0 then
+ if ty = 0 then
+ goto 10;
+ flushcurexp(makepath(curexp));
+ curtype := 8
+ end;
+ q := curexp;
+ repeat
+ if mem[q].hh.b0 <> 0 then
+ trans(q + 3, q + 4);
+ trans(q + 1, q + 2);
+ if mem[q].hh.b1 <> 0 then
+ trans(q + 5, q + 6);
+ q := mem[q].hh.rh
+ until q = curexp;
+ 10:
+ null
+ end; {:962} {963:}
+
+ procedure edgestrans(p: halfword; c: quarterword);
+ label
+ 10;
+ begin
+ setupknowntrans(c);
+ unstashcurexp(p);
+ curedges := curexp;
+ if mem[curedges].hh.rh = curedges then
+ goto 10;
+ if txx = 0 then
+ if tyy = 0 then
+ if (txy mod 65536) = 0 then
+ if (tyx mod 65536) = 0 then begin
+ xyswapedges;
+ txx := txy;
+ tyy := tyx;
+ txy := 0;
+ tyx := 0;
+ if mem[curedges].hh.rh = curedges then
+ goto 10
+ end;
+ if txy = 0 then
+ if tyx = 0 then
+ if (txy mod 65536) = 0 then
+ if (tyy mod 65536) = 0 then begin {964:}
+ if (txx = 0) or (tyy = 0) then begin
+ tossedges(curedges);
+ curexp := getnode(6);
+ initedges(curexp)
+ end else begin
+ if txx < 0 then begin
+ xreflectedges;
+ txx := -txx
+ end;
+ if tyy < 0 then begin
+ yreflectedges;
+ tyy := -tyy
+ end;
+ if txx <> 65536 then
+ xscaleedges(txx div 65536);
+ if tyy <> 65536 then
+ yscaleedges(tyy div 65536); {965:}
+ tx := roundunscaled(tx);
+ ty := roundunscaled(ty);
+ if ((((((mem[curedges + 2].hh.lh + tx) <= 0) or ((mem[curedges + 2].hh.rh + tx) >= 8192)) or ((mem[curedges + 1].hh.lh + ty) <= 0)) or ((mem[curedges + 1].hh.rh + ty) >= 8191)) or (abs(tx) >= 4096)) or (abs(ty) >= 4096) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(731)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 732;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else begin
+ if tx <> 0 then begin
+ if not (abs((mem[curedges + 3].hh.lh - tx) - 4096) < 4096) then
+ fixoffset;
+ mem[curedges + 2].hh.lh := mem[curedges + 2].hh.lh + tx;
+ mem[curedges + 2].hh.rh := mem[curedges + 2].hh.rh + tx;
+ mem[curedges + 3].hh.lh := mem[curedges + 3].hh.lh - tx;
+ mem[curedges + 4].int := 0
+ end;
+ if ty <> 0 then begin
+ mem[curedges + 1].hh.lh := mem[curedges + 1].hh.lh + ty;
+ mem[curedges + 1].hh.rh := mem[curedges + 1].hh.rh + ty;
+ mem[curedges + 5].hh.lh := mem[curedges + 5].hh.lh + ty;
+ mem[curedges + 4].int := 0
+ end
+ end {:965}
+ end;
+ goto 10
+ end {:964};
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(728)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 729;
+ helpline[1] := 730;
+ helpline[0] := 405
+ end;
+ putgeterror;
+ 10:
+ null
+ end; {:963} {966:}
+{968:}
+
+ procedure bilin1(p: halfword; t: scaled; q: halfword; u, delta: scaled);
+ var
+ r: halfword;
+ begin
+ if t <> 65536 then
+ depmult(p, t, true);
+ if u <> 0 then
+ if mem[q].hh.b0 = 16 then
+ delta := delta + takescaled(mem[q + 1].int, u)
+ else begin {969:}
+ if mem[p].hh.b0 <> 18 then begin
+ if mem[p].hh.b0 = 16 then
+ newdep(p, constdependency(mem[p + 1].int))
+ else
+ mem[p + 1].hh.rh := ptimesv(mem[p + 1].hh.rh, 65536, 17, 18, true);
+ mem[p].hh.b0 := 18
+ end {:969};
+ mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, u, mem[q + 1].hh.rh, 18, mem[q].hh.b0)
+ end;
+ if mem[p].hh.b0 = 16 then
+ mem[p + 1].int := mem[p + 1].int + delta
+ else begin
+ r := mem[p + 1].hh.rh;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ delta := mem[r + 1].int + delta;
+ if r <> mem[p + 1].hh.rh then
+ mem[r + 1].int := delta
+ else begin
+ recyclevalue(p);
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := delta
+ end
+ end;
+ if fixneeded then
+ fixdependencies
+ end; {:968} {971:}
+
+ procedure addmultdep(p: halfword; v: scaled; r: halfword);
+ begin
+ if mem[r].hh.b0 = 16 then
+ mem[depfinal + 1].int := mem[depfinal + 1].int + takescaled(mem[r + 1].int, v)
+ else begin
+ mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, v, mem[r + 1].hh.rh, 18, mem[r].hh.b0);
+ if fixneeded then
+ fixdependencies
+ end
+ end; {:971} {972:}
+
+ procedure bilin2(p, t: halfword; v: scaled; u, q: halfword);
+ var
+ vv: scaled;
+ begin
+ vv := mem[p + 1].int;
+ mem[p].hh.b0 := 18;
+ newdep(p, constdependency(0));
+ if vv <> 0 then
+ addmultdep(p, vv, t);
+ if v <> 0 then
+ addmultdep(p, v, u);
+ if q <> (-30000) then
+ addmultdep(p, 65536, q);
+ if mem[p + 1].hh.rh = depfinal then begin
+ vv := mem[depfinal + 1].int;
+ recyclevalue(p);
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := vv
+ end
+ end; {:972} {974:}
+
+ procedure bilin3(p: halfword; t, v, u, delta: scaled);
+ begin
+ if t <> 65536 then
+ delta := delta + takescaled(mem[p + 1].int, t)
+ else
+ delta := delta + mem[p + 1].int;
+ if u <> 0 then
+ mem[p + 1].int := delta + takescaled(v, u)
+ else
+ mem[p + 1].int := delta
+ end; {:974}
+
+ procedure bigtrans(p: halfword; c: quarterword);
+ label
+ 10;
+ var
+ q, r, pp, qq: halfword;
+ s: smallnumber;
+ begin
+ s := bignodesize[mem[p].hh.b0];
+ q := mem[p + 1].int;
+ r := q + s;
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 <> 16 then begin {967:}
+ setupknowntrans(c);
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin1(r + 10, tyy, q + 6, tyx, 0);
+ bilin1(r + 8, tyy, q + 4, tyx, 0);
+ bilin1(r + 6, txx, q + 10, txy, 0);
+ bilin1(r + 4, txx, q + 8, txy, 0)
+ end;
+ bilin1(r + 2, tyy, q, tyx, ty);
+ bilin1(r, txx, q + 2, txy, tx);
+ goto 10
+ end {:967}
+ until r = q; {970:}
+ setuptrans(c);
+ if curtype = 16 then begin {973:}
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin3(r + 10, tyy, mem[q + 7].int, tyx, 0);
+ bilin3(r + 8, tyy, mem[q + 5].int, tyx, 0);
+ bilin3(r + 6, txx, mem[q + 11].int, txy, 0);
+ bilin3(r + 4, txx, mem[q + 9].int, txy, 0)
+ end;
+ bilin3(r + 2, tyy, mem[q + 1].int, tyx, ty);
+ bilin3(r, txx, mem[q + 3].int, txy, tx)
+ end else begin {:973}
+ pp := stashcurexp;
+ qq := mem[pp + 1].int;
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin2(r + 10, qq + 10, mem[q + 7].int, qq + 8, -30000);
+ bilin2(r + 8, qq + 10, mem[q + 5].int, qq + 8, -30000);
+ bilin2(r + 6, qq + 4, mem[q + 11].int, qq + 6, -30000);
+ bilin2(r + 4, qq + 4, mem[q + 9].int, qq + 6, -30000)
+ end;
+ bilin2(r + 2, qq + 10, mem[q + 1].int, qq + 8, qq + 2);
+ bilin2(r, qq + 4, mem[q + 3].int, qq + 6, qq);
+ recyclevalue(pp);
+ freenode(pp, 2)
+ end;
+{:970}
+ 10:
+ null
+ end; {:966} {976:}
+
+ procedure cat(p: halfword);
+ var
+ a, b: strnumber;
+ k: poolpointer;
+ begin
+ a := mem[p + 1].int;
+ b := curexp;
+ begin
+ if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > maxpoolptr then begin
+ if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])
+ end
+ end;
+ for k := strstart[a] to strstart[a + 1] - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ for k := strstart[b] to strstart[b + 1] - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring;
+ begin
+ if strref[b] < 127 then
+ if strref[b] > 1 then
+ strref[b] := strref[b] - 1
+ else
+ flushstring(b)
+ end
+ end; {:976} {977:}
+
+ procedure chopstring(p: halfword);
+ var
+ a, b: integer;
+ l: integer;
+ k: integer;
+ s: strnumber;
+ reversed: boolean;
+ begin
+ a := roundunscaled(mem[p + 1].int);
+ b := roundunscaled(mem[p + 3].int);
+ if a <= b then
+ reversed := false
+ else begin
+ reversed := true;
+ k := a;
+ a := b;
+ b := k
+ end;
+ s := curexp;
+ l := strstart[s + 1] - strstart[s];
+ if a < 0 then begin
+ a := 0;
+ if b < 0 then
+ b := 0
+ end;
+ if b > l then begin
+ b := l;
+ if a > l then
+ a := l
+ end;
+ begin
+ if ((poolptr + b) - a) > maxpoolptr then begin
+ if ((poolptr + b) - a) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + b) - a
+ end
+ end;
+ if reversed then
+ for k := (strstart[s] + b) - 1 downto strstart[s] + a do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end
+ else
+ for k := strstart[s] + a to (strstart[s] + b) - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring;
+ begin
+ if strref[s] < 127 then
+ if strref[s] > 1 then
+ strref[s] := strref[s] - 1
+ else
+ flushstring(s)
+ end
+ end; {:977} {978:}
+
+ procedure choppath(p: halfword);
+ var
+ q: halfword;
+ pp, qq, rr, ss: halfword;
+ a, b, k, l: scaled;
+ reversed: boolean;
+ begin
+ l := pathlength;
+ a := mem[p + 1].int;
+ b := mem[p + 3].int;
+ if a <= b then
+ reversed := false
+ else begin
+ reversed := true;
+ k := a;
+ a := b;
+ b := k
+ end; {979:}
+ if a < 0 then
+ if mem[curexp].hh.b0 = 0 then begin
+ a := 0;
+ if b < 0 then
+ b := 0
+ end else
+ repeat
+ a := a + l;
+ b := b + l
+ until a >= 0;
+ if b > l then
+ if mem[curexp].hh.b0 = 0 then begin
+ b := l;
+ if a > l then
+ a := l
+ end else
+ while a >= l do begin
+ a := a - l;
+ b := b - l
+ end {:979};
+ q := curexp;
+ while a >= 65536 do begin
+ q := mem[q].hh.rh;
+ a := a - 65536;
+ b := b - 65536
+ end;
+ if b = a then begin {981:}
+ if a > 0 then begin
+ qq := mem[q].hh.rh;
+ splitcubic(q, a * 4096, mem[qq + 1].int, mem[qq + 2].int);
+ q := mem[q].hh.rh
+ end;
+ pp := copyknot(q);
+ qq := pp
+ end else begin {:981} {980:}
+ pp := copyknot(q);
+ qq := pp;
+ repeat
+ q := mem[q].hh.rh;
+ rr := qq;
+ qq := copyknot(q);
+ mem[rr].hh.rh := qq;
+ b := b - 65536
+ until b <= 0;
+ if a > 0 then begin
+ ss := pp;
+ pp := mem[pp].hh.rh;
+ splitcubic(ss, a * 4096, mem[pp + 1].int, mem[pp + 2].int);
+ pp := mem[ss].hh.rh;
+ freenode(ss, 7);
+ if rr = ss then begin
+ b := makescaled(b, 65536 - a);
+ rr := pp
+ end
+ end;
+ if b < 0 then begin
+ splitcubic(rr, (b + 65536) * 4096, mem[qq + 1].int, mem[qq + 2].int);
+ freenode(qq, 7);
+ qq := mem[rr].hh.rh
+ end
+ end {:980};
+ mem[pp].hh.b0 := 0;
+ mem[qq].hh.b1 := 0;
+ mem[qq].hh.rh := pp;
+ tossknotlist(curexp);
+ if reversed then begin
+ curexp := mem[htapypoc(pp)].hh.rh;
+ tossknotlist(pp)
+ end else
+ curexp := pp
+ end; {:978} {982:}
+
+ procedure pairvalue(x, y: scaled);
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ flushcurexp(p);
+ curtype := 14;
+ mem[p].hh.b0 := 14;
+ mem[p].hh.b1 := 11;
+ initbignode(p);
+ p := mem[p + 1].int;
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := x;
+ mem[p + 2].hh.b0 := 16;
+ mem[p + 3].int := y
+ end; { pairvalue }
+{:982}
+ {984:}
+
+ procedure setupoffset(p: halfword);
+ begin
+ findoffset(mem[p + 1].int, mem[p + 3].int, curexp);
+ pairvalue(curx, cury)
+ end;
+
+ procedure setupdirectiontime(p: halfword);
+ begin
+ flushcurexp(finddirectiontime(mem[p + 1].int, mem[p + 3].int, curexp))
+ end; {:984} {985:}
+
+ procedure findpoint(v: scaled; c: quarterword);
+ var
+ p: halfword;
+ n: scaled;
+ vv: scaled;
+ q: halfword;
+ begin
+ vv := v;
+ p := curexp;
+ if mem[p].hh.b0 = 0 then
+ n := -65536
+ else
+ n := 0;
+ repeat
+ p := mem[p].hh.rh;
+ n := n + 65536
+ until p = curexp;
+ if n = 0 then
+ v := 0
+ else if v < 0 then
+ if mem[p].hh.b0 = 0 then
+ v := 0
+ else
+ v := (n - 1) - (((-v) - 1) mod n)
+ else if v > n then
+ if mem[p].hh.b0 = 0 then
+ v := n
+ else
+ v := v mod n;
+ p := curexp;
+ while v >= 65536 do begin
+ p := mem[p].hh.rh;
+ v := v - 65536
+ end;
+ if v <> 0 then begin {986:}
+ q := mem[p].hh.rh;
+ splitcubic(p, v * 4096, mem[q + 1].int, mem[q + 2].int);
+ p := mem[p].hh.rh
+ end {:986}; {987:}
+ case c of
+ 97:
+ pairvalue(mem[p + 1].int, mem[p + 2].int);
+ 98:
+ if mem[p].hh.b0 = 0 then
+ pairvalue(mem[p + 1].int, mem[p + 2].int)
+ else
+ pairvalue(mem[p + 3].int, mem[p + 4].int);
+ 99:
+ if mem[p].hh.b1 = 0 then
+ pairvalue(mem[p + 1].int, mem[p + 2].int)
+ else
+ pairvalue(mem[p + 5].int, mem[p + 6].int)
+ end {:987}
+ end; {:985}
+
+ procedure dobinary(p: halfword; c: quarterword);
+ label
+ 30, 31, 10;
+ var
+ q, r, rr: halfword;
+ oldp, oldexp: halfword;
+ v: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then begin {924:}
+ begindiagnostic;
+ printnl(714);
+ printexp(p, 0);
+ printchar(41);
+ printop(c);
+ printchar(40);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:924}; {926:}
+ if mem[p].hh.b0 in
+ [13, 14, 19] then
+ case mem[p].hh.b0 of
+ 13, 14:
+ oldp := tarnished(p);
+ 19:
+ oldp := -29999
+ end
+ else
+ oldp := -30000;
+ if oldp <> (-30000) then begin
+ q := stashcurexp;
+ oldp := p;
+ makeexpcopy(oldp);
+ p := stashcurexp;
+ unstashcurexp(q)
+ end; {:926}
+{927:}
+ if curtype in
+ [13, 14, 19] then
+ case curtype of
+ 13, 14:
+ oldexp := tarnished(curexp);
+ 19:
+ oldexp := -29999
+ end
+ else
+ oldexp := -30000;
+ if oldexp <> (-30000) then begin
+ oldexp := curexp;
+ makeexpcopy(oldexp)
+ end {:927};
+ case c of
+ 69, 70: {929:}
+ if (curtype < 14) or (mem[p].hh.b0 < 14) then
+ if (curtype = 11) and (mem[p].hh.b0 = 11) then begin
+ if c = 70 then
+ negateedges(curexp);
+ curedges := curexp;
+ mergeedges(mem[p + 1].int)
+ end else
+ badbinary(p, c)
+ else if curtype = 14 then
+ if mem[p].hh.b0 <> 14 then
+ badbinary(p, c)
+ else begin
+ q := mem[p + 1].int;
+ r := mem[curexp + 1].int;
+ addorsubtract(q, r, c);
+ addorsubtract(q + 2, r + 2, c)
+ end
+ else if mem[p].hh.b0 = 14 then
+ badbinary(p, c)
+ else
+ addorsubtract(p, -30000, c) {:929}; {936:}
+ 77, 78, 79, 80, 81, 82:
+ begin
+ if (curtype > 14) and (mem[p].hh.b0 > 14) then
+ addorsubtract(p, -30000, 70)
+ else if curtype <> mem[p].hh.b0 then begin
+ badbinary(p, c);
+ goto 30
+ end else if curtype = 4 then
+ flushcurexp(strvsstr(mem[p + 1].int, curexp))
+ else if (curtype = 5) or (curtype = 3) then begin {938:}
+ q := mem[curexp + 1].int;
+ while (q <> curexp) and (q <> p) do
+ q := mem[q + 1].int;
+ if q = p then
+ flushcurexp(0)
+ end else if (curtype = 14) or (curtype = 13) then begin {:938} {939:}
+ q := mem[p + 1].int;
+ r := mem[curexp + 1].int;
+ rr := (r + bignodesize[curtype]) - 2;
+ while true do begin
+ addorsubtract(q, r, 70);
+ if mem[r].hh.b0 <> 16 then
+ goto 31;
+ if mem[r + 1].int <> 0 then
+ goto 31;
+ if r = rr then
+ goto 31;
+ q := q + 2;
+ r := r + 2
+ end;
+ 31:
+ takepart(53 + ((r - mem[curexp + 1].int) div 2))
+ end else if curtype = 2 then {:939}
+ flushcurexp(curexp - mem[p + 1].int)
+ else begin
+ badbinary(p, c);
+ goto 30
+ end; {937:}
+ if curtype <> 16 then begin
+ if curtype < 16 then begin
+ disperr(p, 155);
+ begin
+ helpptr := 1;
+ helpline[0] := 715
+ end
+ end else begin
+ helpptr := 2;
+ helpline[1] := 716;
+ helpline[0] := 717
+ end;
+ disperr(-30000, 718);
+ putgetflusherror(31)
+ end else
+ case c of
+ 77:
+ if curexp < 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 78:
+ if curexp <= 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 79:
+ if curexp > 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 80:
+ if curexp >= 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 81:
+ if curexp = 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 82:
+ if curexp <> 0 then
+ curexp := 30
+ else
+ curexp := 31
+ end;
+ curtype := 2 {:937};
+ 30:
+ null
+ end; {:936} {940:}
+ 76, 75:
+ if (mem[p].hh.b0 <> 2) or (curtype <> 2) then
+ badbinary(p, c)
+ else if mem[p + 1].int = (c - 45) then
+ curexp := mem[p + 1].int; {:940} {941:}
+ 71:
+ if (curtype < 14) or (mem[p].hh.b0 < 14) then
+ badbinary(p, 71)
+ else if (curtype = 16) or (mem[p].hh.b0 = 16) then begin {942:}
+ if mem[p].hh.b0 = 16 then begin
+ v := mem[p + 1].int;
+ freenode(p, 2)
+ end else begin
+ v := curexp;
+ unstashcurexp(p)
+ end;
+ if curtype = 16 then
+ curexp := takescaled(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depmult(p, v, true);
+ depmult(p + 2, v, true)
+ end else
+ depmult(-30000, v, true);
+ goto 10
+ end else if (nicepair(p, mem[p].hh.b0) and (curtype > 14)) or (nicepair(curexp, curtype) and (mem[p].hh.b0 > 14)) then begin {:942}
+ hardtimes(p);
+ goto 10
+ end else
+ badbinary(p, 71); {:941} {948:}
+ 72:
+ if (curtype <> 16) or (mem[p].hh.b0 < 14) then
+ badbinary(p, 72)
+ else begin
+ v := curexp;
+ unstashcurexp(p);
+ if v = 0 then begin {950:}
+ disperr(-30000, 648);
+ begin
+ helpptr := 2;
+ helpline[1] := 720;
+ helpline[0] := 721
+ end;
+ putgeterror
+ end else begin {:950}
+ if curtype = 16 then
+ curexp := makescaled(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depdiv(p, v);
+ depdiv(p + 2, v)
+ end else
+ depdiv(-30000, v)
+ end;
+ goto 10
+ end; {:948} {951:}
+ 73, 74:
+ if (curtype = 16) and (mem[p].hh.b0 = 16) then
+ if c = 73 then
+ curexp := pythadd(mem[p + 1].int, curexp)
+ else
+ curexp := pythsub(mem[p + 1].int, curexp)
+ else
+ badbinary(p, c); {:951} {952:}
+ 84, 85, 86, 87, 88, 89, 90,
+ 91:
+ if ((mem[p].hh.b0 = 9) or (mem[p].hh.b0 = 8)) or (mem[p].hh.b0 = 6) then begin
+ pathtrans(p, c);
+ goto 10
+ end else if (mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 13) then
+ bigtrans(p, c)
+ else if mem[p].hh.b0 = 11 then begin
+ edgestrans(p, c);
+ goto 10
+ end else
+ badbinary(p, c); {:952} {975:}
+ 83:
+ if (curtype = 4) and (mem[p].hh.b0 = 4) then
+ cat(p)
+ else
+ badbinary(p, 83);
+ 94:
+ if nicepair(p, mem[p].hh.b0) and (curtype = 4) then
+ chopstring(mem[p + 1].int)
+ else
+ badbinary(p, 94);
+ 95:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if nicepair(p, mem[p].hh.b0) and (curtype = 9) then
+ choppath(mem[p + 1].int)
+ else
+ badbinary(p, 95)
+ end; {:975} {983:}
+ 97, 98, 99:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and (mem[p].hh.b0 = 16) then
+ findpoint(mem[p + 1].int, c)
+ else
+ badbinary(p, c)
+ end;
+ 100:
+ begin
+ if curtype = 8 then
+ materializepen;
+ if (curtype = 6) and nicepair(p, mem[p].hh.b0) then
+ setupoffset(mem[p + 1].int)
+ else
+ badbinary(p, 100)
+ end;
+ 96:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and nicepair(p, mem[p].hh.b0) then
+ setupdirectiontime(mem[p + 1].int)
+ else
+ badbinary(p, 96)
+ end; {:983} {988:}
+ 92:
+ begin
+ if mem[p].hh.b0 = 14 then begin
+ q := stashcurexp;
+ unstashcurexp(p);
+ pairtopath;
+ p := stashcurexp;
+ unstashcurexp(q)
+ end;
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and (mem[p].hh.b0 = 9) then begin
+ pathintersection(mem[p + 1].int, curexp);
+ pairvalue(curt, curtt)
+ end else
+ badbinary(p, 92)
+ end
+ end {:988};
+ recyclevalue(p);
+ freenode(p, 2);
+ 10:
+ begin
+ if aritherror then
+ cleararith
+ end; {925:}
+ if oldp <> (-30000) then begin
+ recyclevalue(oldp);
+ freenode(oldp, 2)
+ end;
+ if oldexp <> (-30000) then begin
+ recyclevalue(oldexp);
+ freenode(oldexp, 2)
+ end {:925}
+ end; {:922} {944:}
+
+ procedure fracmult(n, d: scaled);
+ var
+ p: halfword;
+ oldexp: halfword;
+ v: fraction;
+ begin
+ if internal[7] > 131072 then begin {945:}
+ begindiagnostic;
+ printnl(714);
+ printscaled(n);
+ printchar(47);
+ printscaled(d);
+ print(719);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:945};
+ if curtype in
+ [13, 14, 19] then
+ case curtype of
+ 13, 14:
+ oldexp := tarnished(curexp);
+ 19:
+ oldexp := -29999
+ end
+ else
+ oldexp := -30000;
+ if oldexp <> (-30000) then begin
+ oldexp := curexp;
+ makeexpcopy(oldexp)
+ end;
+ v := makefraction(n, d);
+ if curtype = 16 then
+ curexp := takefraction(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depmult(p, v, false);
+ depmult(p + 2, v, false)
+ end else
+ depmult(-30000, v, false);
+ if oldexp <> (-30000) then begin
+ recyclevalue(oldexp);
+ freenode(oldexp, 2)
+ end
+ end; {:944} {989:} {1155:}
+
+ procedure gfswap;
+ begin
+ if gflimit = gfbufsize then begin
+ bwritebuf(gffile, gfbuf, 0, halfbuf - 1);
+ gflimit := halfbuf;
+ gfoffset := gfoffset + gfbufsize;
+ gfptr := 0
+ end else begin
+ bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
+ gflimit := gfbufsize
+ end
+ end; {:1155} {1157:}
+
+ procedure gffour(x: integer);
+ begin
+ if x >= 0 then begin
+ gfbuf[gfptr] := x div 16777216;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ x := x + 1073741824;
+ x := x + 1073741824;
+ begin
+ gfbuf[gfptr] := (x div 16777216) + 128;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+ x := x mod 16777216;
+ begin
+ gfbuf[gfptr] := x div 65536;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ x := x mod 65536;
+ begin
+ gfbuf[gfptr] := x div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1157} {1158:}
+
+ procedure gftwo(x: integer);
+ begin
+ begin
+ gfbuf[gfptr] := x div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+
+ procedure gfthree(x: integer);
+ begin
+ begin
+ gfbuf[gfptr] := x div 65536;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := (x mod 65536) div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1158} {1159:}
+
+ procedure gfpaint(d: integer);
+ begin
+ if d < 64 then begin
+ gfbuf[gfptr] := 0 + d;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else if d < 256 then begin
+ begin
+ gfbuf[gfptr] := 64;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := d;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 65;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gftwo(d)
+ end
+ end; {:1159}
+{1160:}
+
+ procedure gfstring(s, t: strnumber);
+ var
+ k: poolpointer;
+ l: integer;
+ begin
+ if s <> 0 then begin
+ l := strstart[s + 1] - strstart[s];
+ if t <> 0 then
+ l := l + (strstart[t + 1] - strstart[t]);
+ if l <= 255 then begin
+ begin
+ gfbuf[gfptr] := 239;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := l;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 241;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gfthree(l)
+ end;
+ for k := strstart[s] to strstart[s + 1] - 1 do begin
+ gfbuf[gfptr] := strpool[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+ if t <> 0 then
+ for k := strstart[t] to strstart[t + 1] - 1 do begin
+ gfbuf[gfptr] := strpool[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1160}
+{1161:}
+
+ procedure gfboc(minm, maxm, minn, maxn: integer);
+ label
+ 10;
+ begin
+ if minm < gfminm then
+ gfminm := minm;
+ if maxn > gfmaxn then
+ gfmaxn := maxn;
+ if bocp = (-1) then
+ if bocc >= 0 then
+ if bocc < 256 then
+ if (maxm - minm) >= 0 then
+ if (maxm - minm) < 256 then
+ if maxm >= 0 then
+ if maxm < 256 then
+ if (maxn - minn) >= 0 then
+ if (maxn - minn) < 256 then
+ if maxn >= 0 then
+ if maxn < 256 then begin
+ begin
+ gfbuf[gfptr] := 68;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := bocc;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxm - minm;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxm;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxn - minn;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxn;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ goto 10
+ end;
+ begin
+ gfbuf[gfptr] := 67;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(bocc);
+ gffour(bocp);
+ gffour(minm);
+ gffour(maxm);
+ gffour(minn);
+ gffour(maxn);
+ 10:
+ null
+ end; {:1161} {1163:}
+
+ procedure initgf;
+ var
+ k: eightbits;
+ t: integer;
+ begin
+ gfminm := 4096;
+ gfmaxm := -4096;
+ gfminn := 4096;
+ gfmaxn := -4096;
+ for k := 0 to 255 do
+ charptr[k] := -1; {1164:}
+ if internal[27] <= 0 then
+ gfext := 908
+ else begin
+ oldsetting := selector;
+ selector := 5;
+ printchar(46);
+ printint(makescaled(internal[27], 59429463));
+ print(909);
+ gfext := makestring;
+ selector := oldsetting
+ end {:1164};
+ begin
+ if jobname = 0 then
+ openlogfile;
+ packjobname(gfext);
+ while not bopenout(gffile, nameoffile) do
+ promptfilename(620, gfext);
+ outputfilename := bmakenamestring(gffile)
+ end;
+ begin
+ gfbuf[gfptr] := 247;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := 131;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ oldsetting := selector;
+ selector := 5;
+ print(907);
+ printint(roundunscaled(internal[14]));
+ printchar(46);
+ printdd(roundunscaled(internal[15]));
+ printchar(46);
+ printdd(roundunscaled(internal[16]));
+ printchar(58);
+ t := roundunscaled(internal[17]);
+ printdd(t div 60);
+ printdd(t mod 60);
+ selector := oldsetting;
+ begin
+ gfbuf[gfptr] := poolptr - strstart[strptr];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ strstart[strptr + 1] := poolptr;
+ gfstring(0, strptr);
+ poolptr := strstart[strptr];
+ gfprevptr := gfoffset + gfptr
+ end; {:1163} {1165:}
+
+ procedure shipout(c: eightbits);
+ label
+ 30;
+ var
+ f: integer;
+ prevm, m, mm: integer;
+ prevn, n: integer;
+ p, q: halfword;
+ prevw, w, ww: integer;
+ d: integer;
+ delta: integer;
+ curminm: integer;
+ xoff, yoff: integer;
+ begin
+ if outputfilename = 0 then
+ initgf;
+ f := roundunscaled(internal[19]);
+ xoff := roundunscaled(internal[29]);
+ yoff := roundunscaled(internal[30]);
+ if termoffset > (maxprintline - 9) then
+ println
+ else if (termoffset > 0) or (fileoffset > 0) then
+ printchar(32);
+ printchar(91);
+ printint(c);
+ if f <> 0 then begin
+ printchar(46);
+ printint(f)
+ end;
+ flush(output);
+ bocc := (256 * f) + c;
+ bocp := charptr[c];
+ charptr[c] := gfprevptr;
+ if internal[34] > 0 then begin {1166:}
+ if xoff <> 0 then begin
+ gfstring(308, 0);
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(xoff * 65536)
+ end;
+ if yoff <> 0 then begin
+ gfstring(309, 0);
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(yoff * 65536)
+ end
+ end {:1166}; {1167:}
+ prevn := 4096;
+ p := mem[curedges].hh.lh;
+ n := mem[curedges + 1].hh.rh - 4096;
+ while p <> curedges do begin {1169:}
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p);
+ q := mem[p + 1].hh.rh;
+ w := 0;
+ prevm := -268435456;
+ ww := 0;
+ prevw := 0;
+ m := prevm;
+ repeat
+ if q = 30000 then
+ mm := 268435456
+ else begin
+ d := mem[q].hh.lh + 32768;
+ mm := d div 8;
+ ww := (ww + (d mod 8)) - 4
+ end;
+ if mm <> m then begin
+ if prevw <= 0 then begin
+ if w > 0 then begin {1170:}
+ if prevm = (-268435456) then begin {1172:}
+ if prevn = 4096 then begin
+ gfboc((mem[curedges + 2].hh.lh + xoff) - 4096, (mem[curedges + 2].hh.rh + xoff) - 4096, (mem[curedges + 1].hh.lh + yoff) - 4096, n + yoff);
+ curminm := (mem[curedges + 2].hh.lh - 4096) + mem[curedges + 3].hh.lh
+ end else if prevn > (n + 1) then begin {1174:}
+ delta := (prevn - n) - 1;
+ if delta < 256 then
+ if delta = 0 then begin
+ gfbuf[gfptr] := 70;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ begin
+ gfbuf[gfptr] := 71;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := delta;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end
+ else begin
+ begin
+ gfbuf[gfptr] := 72;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gftwo(delta)
+ end
+ end else begin {:1174} {1173:}
+ delta := m - curminm;
+ if delta > 164 then begin
+ gfbuf[gfptr] := 70;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ begin
+ gfbuf[gfptr] := 74 + delta;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ goto 30
+ end
+ end {:1173};
+ gfpaint(m - curminm);
+ 30:
+ prevn := n
+ end else {:1172}
+ gfpaint(m - prevm);
+ prevm := m;
+ prevw := w
+ end {:1170}
+ end else if w <= 0 then begin {1171:}
+ gfpaint(m - prevm);
+ prevm := m;
+ prevw := w
+ end {:1171};
+ m := mm
+ end;
+ w := ww;
+ q := mem[q].hh.rh
+ until mm = 268435456;
+ if w <> 0 then
+ printnl(911);
+ if ((prevm - mem[curedges + 3].hh.lh) + xoff) > gfmaxm then
+ gfmaxm := (prevm - mem[curedges + 3].hh.lh) + xoff {:1169};
+ p := mem[p].hh.lh;
+ n := n - 1
+ end;
+ if prevn = 4096 then begin {1168:}
+ gfboc(0, 0, 0, 0);
+ if gfmaxm < 0 then
+ gfmaxm := 0;
+ if gfminn > 0 then
+ gfminn := 0
+ end else if (prevn + yoff) < gfminn then {:1168}
+ gfminn := prevn + yoff {:1167};
+ begin
+ gfbuf[gfptr] := 69;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gfprevptr := gfoffset + gfptr;
+ totalchars := totalchars + 1;
+ printchar(93);
+ flush(output);
+ if internal[11] > 0 then
+ printedges(910, true, xoff, yoff)
+ end; { shipout }
+{:1165}
+ {995:}
+ {1006:}
+
+ procedure tryeq(l, r: halfword);
+ label
+ 30, 31;
+ var
+ p: halfword;
+ t: 16..19;
+ q: halfword;
+ pp: halfword;
+ tt: 17..19;
+ copied: boolean; {1007:}
+ begin
+ t := mem[l].hh.b0;
+ if t = 16 then begin
+ t := 17;
+ p := constdependency(-mem[l + 1].int);
+ q := p
+ end else if t = 19 then begin
+ t := 17;
+ p := singledependency(l);
+ mem[p + 1].int := -mem[p + 1].int;
+ q := depfinal
+ end else begin
+ p := mem[l + 1].hh.rh;
+ q := p;
+ while true do begin
+ mem[q + 1].int := -mem[q + 1].int;
+ if mem[q].hh.lh = (-30000) then
+ goto 30;
+ q := mem[q].hh.rh
+ end;
+ 30:
+ mem[mem[l + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ mem[mem[q].hh.rh + 1].hh.lh := mem[l + 1].hh.lh;
+ mem[l].hh.b0 := 16
+ end {:1007};
+{1009:}
+ if r = (-30000) then
+ if curtype = 16 then begin
+ mem[q + 1].int := mem[q + 1].int + curexp;
+ goto 31
+ end else begin
+ tt := curtype;
+ if tt = 19 then
+ pp := singledependency(curexp)
+ else
+ pp := mem[curexp + 1].hh.rh
+ end
+ else if mem[r].hh.b0 = 16 then begin
+ mem[q + 1].int := mem[q + 1].int + mem[r + 1].int;
+ goto 31
+ end else begin
+ tt := mem[r].hh.b0;
+ if tt = 19 then
+ pp := singledependency(r)
+ else
+ pp := mem[r + 1].hh.rh
+ end;
+ if tt <> 19 then
+ copied := false
+ else begin
+ copied := true;
+ tt := 17
+ end; {1010:}
+ watchcoefs := false;
+ if t = tt then
+ p := pplusq(p, pp, t)
+ else if t = 18 then
+ p := pplusfq(p, 65536, pp, 18, 17)
+ else begin
+ q := p;
+ while mem[q].hh.lh <> (-30000) do begin
+ mem[q + 1].int := roundfraction(mem[q + 1].int);
+ q := mem[q].hh.rh
+ end;
+ t := 18;
+ p := pplusq(p, pp, t)
+ end;
+ watchcoefs := true;
+{:1010}
+ if copied then
+ flushnodelist(pp);
+ 31: {:1009}
+ null;
+ if mem[p].hh.lh = (-30000) then begin {1008:}
+ if abs(mem[p + 1].int) > 64 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(761)
+ end;
+ print(763);
+ printscaled(mem[p + 1].int);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 762;
+ helpline[0] := 760
+ end;
+ putgeterror
+ end else if r = (-30000) then begin {623:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ freenode(p, 2)
+ end else begin {:1008}
+ lineareq(p, t);
+ if r = (-30000) then
+ if curtype <> 16 then
+ if mem[curexp].hh.b0 = 16 then begin
+ pp := curexp;
+ curexp := mem[curexp + 1].int;
+ curtype := 16;
+ freenode(pp, 2)
+ end
+ end
+ end; {:1006} {1001:}
+
+ procedure makeeq(lhs: halfword);
+ label
+ 20, 30, 45;
+ var
+ t: smallnumber;
+ v: integer;
+ p, q: halfword;
+ begin
+ 20:
+ t := mem[lhs].hh.b0;
+ if t <= 14 then
+ v := mem[lhs + 1].int;
+ case t of {1003:}
+ 2, 4, 6, 9, 11:
+ if curtype = (t + 1) then begin
+ nonlineareq(v, curexp, false);
+ goto 30
+ end else if curtype = t then begin {1004:}
+ if curtype <= 4 then begin
+ if curtype = 4 then begin
+ if strvsstr(v, curexp) <> 0 then
+ goto 45
+ end else if v <> curexp then
+ goto 45; {623:}
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ goto 30
+ end;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(758)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 759;
+ helpline[0] := 760
+ end;
+ putgeterror;
+ goto 30;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(761)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 762;
+ helpline[0] := 760
+ end;
+ putgeterror;
+ goto 30
+ end {:1004};
+ 3, 5, 7, 12, 10:
+ if curtype = (t - 1) then begin
+ nonlineareq(curexp, lhs, true);
+ goto 30
+ end else if curtype = t then begin
+ ringmerge(lhs, curexp);
+ goto 30
+ end else if curtype = 14 then
+ if t = 10 then begin
+ pairtopath;
+ goto 20
+ end;
+ 13, 14:
+ if curtype = t then begin {1005:}
+ p := v + bignodesize[t];
+ q := mem[curexp + 1].int + bignodesize[t];
+ repeat
+ p := p - 2;
+ q := q - 2;
+ tryeq(p, q)
+ until p = v;
+ goto 30
+ end {:1005};
+ 16, 17, 18, 19:
+ if curtype >= 16 then begin
+ tryeq(lhs, -30000);
+ goto 30
+ end;
+ 1:
+ null
+ end
+{:1003}; {1002:}
+ disperr(lhs, 155);
+ disperr(-30000, 755);
+ if mem[lhs].hh.b0 <= 14 then
+ printtype(mem[lhs].hh.b0)
+ else
+ print(211);
+ printchar(61);
+ if curtype <= 14 then
+ printtype(curtype)
+ else
+ print(211);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 756;
+ helpline[0] := 757
+ end; {:1002}
+ putgeterror;
+ 30:
+ begin
+ if aritherror then
+ cleararith
+ end;
+ recyclevalue(lhs);
+ freenode(lhs, 2)
+ end; {:1001}
+
+ procedure doassignment;
+ forward;
+
+ procedure doequation;
+ var
+ lhs: halfword;
+ p: halfword;
+ begin
+ lhs := stashcurexp;
+ getxnext;
+ varflag := 77;
+ scanexpression;
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment;
+ if internal[7] > 131072 then begin {997:}
+ begindiagnostic;
+ printnl(714);
+ printexp(lhs, 0);
+ print(750);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:997};
+ if curtype = 10 then
+ if mem[lhs].hh.b0 = 14 then begin
+ p := stashcurexp;
+ unstashcurexp(lhs);
+ lhs := p
+ end;
+ makeeq(lhs)
+ end; {:995} {996:}
+
+ procedure doassignment;
+ var
+ lhs: halfword;
+ p: halfword;
+ q: halfword;
+ begin
+ if curtype <> 20 then begin
+ disperr(-30000, 747);
+ begin
+ helpptr := 2;
+ helpline[1] := 748;
+ helpline[0] := 749
+ end;
+ error;
+ doequation
+ end else begin
+ lhs := curexp;
+ curtype := 1;
+ getxnext;
+ varflag := 77;
+ scanexpression;
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment;
+ if internal[7] > 131072 then begin {998:}
+ begindiagnostic;
+ printnl(123);
+ if mem[lhs].hh.lh > 2241 then
+ print(intname[mem[lhs].hh.lh - 2241])
+ else
+ showtokenlist(lhs, -30000, 1000, 0);
+ print(329);
+ printexp(-30000, 0);
+ printchar(125);
+ enddiagnostic(false)
+ end {:998};
+ if mem[lhs].hh.lh > 2241 then {999:}
+ if curtype = 16 then
+ internal[mem[lhs].hh.lh - 2241] := curexp
+ else begin
+ disperr(-30000, 751);
+ print(intname[mem[lhs].hh.lh - 2241]);
+ print(752);
+ begin
+ helpptr := 2;
+ helpline[1] := 753;
+ helpline[0] := 754
+ end;
+ putgeterror
+ end {:999} {1000:}
+ else begin
+ p := findvariable(lhs);
+ if p <> (-30000) then begin
+ q := stashcurexp;
+ curtype := undtype(p);
+ recyclevalue(p);
+ mem[p].hh.b0 := curtype;
+ mem[p + 1].int := -30000;
+ makeexpcopy(p);
+ p := stashcurexp;
+ unstashcurexp(q);
+ makeeq(p)
+ end else begin
+ obliterated(lhs);
+ putgeterror
+ end
+ end {:1000};
+ flushnodelist(lhs)
+ end
+ end; {:996} {1015:}
+
+ procedure dotypedeclaration;
+ var
+ t: smallnumber;
+ p: halfword;
+ q: halfword;
+ begin
+ if curmod >= 13 then
+ t := curmod
+ else
+ t := curmod + 1;
+ repeat
+ p := scandeclaredvariable;
+ flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, false);
+ q := findvariable(p);
+ if q <> (-30000) then begin
+ mem[q].hh.b0 := t;
+ mem[q + 1].int := -30000
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(764)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 765;
+ helpline[0] := 766
+ end;
+ putgeterror
+ end;
+ flushlist(p);
+ if curcmd < 79 then begin {1016:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(767)
+ end;
+ begin
+ helpptr := 5;
+ helpline[4] := 768;
+ helpline[3] := 769;
+ helpline[2] := 770;
+ helpline[1] := 771;
+ helpline[0] := 772
+ end;
+ if curcmd = 42 then
+ helpline[2] := 773;
+ putgeterror;
+ scannerstatus := 2;
+ repeat
+ getnext; {743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ until curcmd >= 79;
+ scannerstatus := 0
+ end {:1016}
+ until curcmd > 79
+ end; { dotypedeclaration }
+{:1015}
+ {1021:}
+
+ procedure dorandomseed;
+ begin
+ getxnext;
+ if curcmd <> 77 then begin
+ missingerr(329);
+ begin
+ helpptr := 1;
+ helpline[0] := 778
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 779);
+ begin
+ helpptr := 2;
+ helpline[1] := 780;
+ helpline[0] := 781
+ end;
+ putgetflusherror(0)
+ end else begin {1022:}
+ initrandoms(curexp);
+ if selector >= 2 then begin
+ oldsetting := selector;
+ selector := 2;
+ printnl(782);
+ printscaled(curexp);
+ printchar(125);
+ printnl(155);
+ selector := oldsetting
+ end
+ end {:1022}
+ end; {:1021} {1029:}
+
+ procedure doprotection;
+ var
+ m: 0..1;
+ t: halfword;
+ begin
+ m := curmod;
+ repeat
+ getsymbol;
+ t := eqtb[cursym].lh;
+ if m = 0 then begin
+ if t >= 83 then
+ eqtb[cursym].lh := t - 83
+ end else if t < 83 then
+ eqtb[cursym].lh := t + 83;
+ getxnext
+ until curcmd <> 79
+ end; {:1029} {1031:}
+
+ procedure defdelims;
+ var
+ ldelim, rdelim: halfword;
+ begin
+ getclearsymbol;
+ ldelim := cursym;
+ getclearsymbol;
+ rdelim := cursym;
+ eqtb[ldelim].lh := 31;
+ eqtb[ldelim].rh := rdelim;
+ eqtb[rdelim].lh := 62;
+ eqtb[rdelim].rh := ldelim;
+ getxnext
+ end; {:1031} {1034:}
+
+ procedure dostatement;
+ forward;
+
+ procedure dointerim;
+ begin
+ getxnext;
+ if curcmd <> 40 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(788)
+ end;
+ if cursym = 0 then
+ print(793)
+ else
+ print(hash[cursym].rh);
+ print(794);
+ begin
+ helpptr := 1;
+ helpline[0] := 795
+ end;
+ backerror
+ end else begin
+ saveinternal(curmod);
+ backinput
+ end;
+ dostatement
+ end; { dointerim }
+{:1034}
+ {1035:}
+
+ procedure dolet;
+ var
+ l: halfword;
+ begin
+ getsymbol;
+ l := cursym;
+ getxnext;
+ if curcmd <> 51 then
+ if curcmd <> 77 then begin
+ missingerr(61);
+ begin
+ helpptr := 3;
+ helpline[2] := 796;
+ helpline[1] := 538;
+ helpline[0] := 797
+ end;
+ backerror
+ end;
+ getsymbol;
+ if curcmd in
+ [10, 53, 44, 49] then
+ case curcmd of
+ 10, 53, 44, 49:
+ mem[curmod].hh.lh := mem[curmod].hh.lh + 1
+ end
+ else
+ null;
+ clearsymbol(l, false);
+ eqtb[l].lh := curcmd;
+ if curcmd = 41 then
+ eqtb[l].rh := -30000
+ else
+ eqtb[l].rh := curmod;
+ getxnext
+ end; {:1035} {1036:}
+
+ procedure donewinternal;
+ begin
+ repeat
+ if intptr = maxinternal then
+ overflow(798, maxinternal);
+ getclearsymbol;
+ intptr := intptr + 1;
+ eqtb[cursym].lh := 40;
+ eqtb[cursym].rh := intptr;
+ intname[intptr] := hash[cursym].rh;
+ internal[intptr] := 0;
+ getxnext
+ until curcmd <> 79
+ end; {:1036} {1040:}
+
+ procedure doshow;
+ begin
+ repeat
+ getxnext;
+ scanexpression;
+ printnl(629);
+ printexp(-30000, 2);
+ flushcurexp(0)
+ until curcmd <> 79
+ end; {:1040} {1041:}
+
+ procedure disptoken;
+ begin
+ printnl(804);
+ if cursym = 0 then begin {1042:}
+ if curcmd = 42 then
+ printscaled(curmod)
+ else if curcmd = 38 then begin
+ gpointer := curmod;
+ printcapsule
+ end else begin
+ printchar(34);
+ print(curmod);
+ printchar(34);
+ begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end
+ end
+ end else begin {:1042}
+ print(hash[cursym].rh);
+ printchar(61);
+ if eqtb[cursym].lh >= 83 then
+ print(805);
+ printcmdmod(curcmd, curmod);
+ if curcmd = 10 then begin
+ println;
+ showmacro(curmod, -30000, 100000)
+ end
+ end
+ end; {:1041} {1044:}
+
+ procedure doshowtoken;
+ begin
+ repeat
+ getnext;
+ disptoken;
+ getxnext
+ until curcmd <> 79
+ end; {:1044} {1045:}
+
+ procedure doshowstats;
+ {printint(varused);printchar(38);printint(dynused);
+ if false then}
+ begin
+ printnl(814);
+ print(228);
+ print(425);
+ printint((himemmin - lomemmax) - 1);
+ print(815);
+ println;
+ printnl(816);
+ printint(strptr - initstrptr);
+ printchar(38);
+ printint(poolptr - initpoolptr);
+ print(425);
+ printint(maxstrings - maxstrptr);
+ printchar(38);
+ printint(poolsize - maxpoolptr);
+ print(815);
+ println;
+ getxnext
+ end; {:1045}
+{1046:}
+
+ procedure dispvar(p: halfword);
+ var
+ q: halfword;
+ n: 0..maxprintline;
+ begin
+ if mem[p].hh.b0 = 21 then begin {1047:}
+ q := mem[p + 1].hh.lh;
+ repeat
+ dispvar(q);
+ q := mem[q].hh.rh
+ until q = (-29983);
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ dispvar(q);
+ q := mem[q].hh.rh
+ end
+ end else if mem[p].hh.b0 >= 22 then begin {:1047} {1048:}
+ printnl(155);
+ printvariablename(p);
+ if mem[p].hh.b0 > 22 then
+ print(530);
+ print(817);
+ if fileoffset >= (maxprintline - 20) then
+ n := 5
+ else
+ n := (maxprintline - fileoffset) - 15;
+ showmacro(mem[p + 1].int, -30000, n)
+ end else if mem[p].hh.b0 <> 0 then begin {:1048}
+ printnl(155);
+ printvariablename(p);
+ printchar(61);
+ printexp(p, 0)
+ end
+ end; {:1046} {1049:}
+
+ procedure doshowvar;
+ label
+ 30;
+ begin
+ repeat
+ getnext;
+ if cursym > 0 then
+ if cursym <= 2241 then
+ if curcmd = 41 then
+ if curmod <> (-30000) then begin
+ dispvar(curmod);
+ goto 30
+ end;
+ disptoken;
+ 30:
+ getxnext
+ until curcmd <> 79
+ end; {:1049} {1050:}
+
+ procedure doshowdependencies;
+ var
+ p: halfword;
+ begin
+ p := mem[-29987].hh.rh;
+ while p <> (-29987) do begin
+ if interesting(p) then begin
+ printnl(155);
+ printvariablename(p);
+ if mem[p].hh.b0 = 17 then
+ printchar(61)
+ else
+ print(632);
+ printdependency(mem[p + 1].hh.rh, mem[p].hh.b0)
+ end;
+ p := mem[p + 1].hh.rh;
+ while mem[p].hh.lh <> (-30000) do
+ p := mem[p].hh.rh;
+ p := mem[p].hh.rh
+ end;
+ getxnext
+ end; {:1050} {1051:}
+
+ procedure doshowwhatever;
+ begin
+ if interaction = 3 then
+ null;
+ case curmod of
+ 0:
+ doshowtoken;
+ 1:
+ doshowstats;
+ 2:
+ doshow;
+ 3:
+ doshowvar;
+ 4:
+ doshowdependencies
+ end;
+ if internal[32] > 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(818)
+ end;
+ if interaction < 3 then begin
+ helpptr := 0;
+ errorcount := errorcount - 1
+ end else begin
+ helpptr := 1;
+ helpline[0] := 819
+ end;
+ if curcmd = 80 then
+ error
+ else
+ putgeterror
+ end
+ end; {:1051} {1054:}
+
+ function scanwith: boolean;
+ var
+ t: smallnumber;
+ result: boolean;
+ begin
+ t := curmod;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ result := false;
+ if curtype <> t then begin {1055:}
+ disperr(-30000, 827);
+ begin
+ helpptr := 2;
+ helpline[1] := 828;
+ helpline[0] := 829
+ end;
+ if t = 6 then
+ helpline[1] := 830;
+ putgetflusherror(0)
+ end else if curtype = 6 then {:1055}
+ result := true {1056:}
+ else begin
+ curexp := roundunscaled(curexp);
+ if (abs(curexp) < 4) and (curexp <> 0) then
+ result := true
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(831)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 829
+ end;
+ putgetflusherror(0)
+ end
+ end {:1056};
+ scanwith := result
+ end; {:1054} {1057:}
+
+ procedure findedgesvar(t: halfword);
+ var
+ p: halfword;
+ begin
+ p := findvariable(t);
+ curedges := -30000;
+ if p = (-30000) then begin
+ obliterated(t);
+ putgeterror
+ end else if mem[p].hh.b0 <> 11 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(654)
+ end;
+ showtokenlist(t, -30000, 1000, 0);
+ print(832);
+ printtype(mem[p].hh.b0);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 833;
+ helpline[0] := 834
+ end;
+ putgeterror
+ end else
+ curedges := mem[p + 1].int;
+ flushnodelist(t)
+ end; {:1057} {1059:}
+
+ procedure doaddto;
+ label
+ 30, 45;
+ var
+ lhs, rhs: halfword;
+ t: smallnumber;
+ w: integer;
+ p: halfword;
+ q: halfword;
+ begin
+ getxnext;
+ varflag := 68;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ lhs := curexp;
+ curpathtype := curmod;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ if curpathtype = 2 then begin {1061:}
+ findedgesvar(lhs);
+ if curedges = (-30000) then
+ flushcurexp(0)
+ else if curtype <> 11 then begin
+ disperr(-30000, 839);
+ begin
+ helpptr := 2;
+ helpline[1] := 840;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin
+ mergeedges(curexp);
+ flushcurexp(0)
+ end
+ end else begin {:1061} {1062:}
+ if curtype = 14 then
+ pairtopath;
+ if curtype <> 9 then begin
+ disperr(-30000, 839);
+ begin
+ helpptr := 2;
+ helpline[1] := 841;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0);
+ flushtokenlist(lhs)
+ end else begin
+ rhs := curexp;
+ w := 1;
+ curpen := -29997;
+ {
+ 1063:}
+ while curcmd = 66 do
+ if scanwith then
+ if curtype = 16 then
+ w := curexp
+ else begin
+ if mem[curpen].hh.lh = (-30000) then
+ tosspen(curpen)
+ else
+ mem[curpen].hh.lh := mem[curpen].hh.lh - 1;
+ curpen := curexp
+ end {:1063}; {1064:}
+ findedgesvar(lhs);
+ if curedges = (-30000) then
+ tossknotlist(rhs)
+ else begin
+ lhs := -30000;
+ if mem[rhs].hh.b0 = 0 then
+ if curpathtype = 0 then {1065:}
+ if mem[rhs].hh.rh = rhs then begin {1066:}
+ mem[rhs + 5].int := mem[rhs + 1].int;
+ mem[rhs + 6].int := mem[rhs + 2].int;
+ mem[rhs + 3].int := mem[rhs + 1].int;
+ mem[rhs + 4].int := mem[rhs + 2].int;
+ mem[rhs].hh.b0 := 1;
+ mem[rhs].hh.b1 := 1
+ end else begin {:1066}
+ p := htapypoc(rhs);
+ q := mem[p].hh.rh;
+ mem[pathtail + 5].int := mem[q + 5].int;
+ mem[pathtail + 6].int := mem[q + 6].int;
+ mem[pathtail].hh.b1 := mem[q].hh.b1;
+ mem[pathtail].hh.rh := mem[q].hh.rh;
+ freenode(q, 7);
+ mem[p + 5].int := mem[rhs + 5].int;
+ mem[p + 6].int := mem[rhs + 6].int;
+ mem[p].hh.b1 := mem[rhs].hh.b1;
+ mem[p].hh.rh := mem[rhs].hh.rh;
+ freenode(rhs, 7);
+ rhs := p
+ end {:1065} {1067:}
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(842)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 843;
+ helpline[0] := 834
+ end;
+ putgeterror;
+ tossknotlist(rhs);
+ goto 45
+ end {:1067}
+ else if curpathtype = 0 then
+ lhs := htapypoc(rhs);
+ curwt := w;
+ rhs := makespec(rhs, mem[curpen + 9].int, internal[5]); {1068:}
+ if turningnumber <= 0 then
+ if curpathtype <> 0 then
+ if internal[39] > 0 then
+ if (turningnumber < 0) and (mem[curpen].hh.rh = (-30000)) then
+ curwt := -curwt
+ else begin
+ if turningnumber = 0 then
+ if (internal[39] <= 65536) and (mem[curpen].hh.rh = (-30000)) then
+ goto 30
+ else
+ printstrange(844)
+ else
+ printstrange(845);
+ begin
+ helpptr := 3;
+ helpline[2] := 846;
+ helpline[1] := 847;
+ helpline[0] := 848
+ end;
+ putgeterror
+ end;
+ 30: {:1068}
+ null;
+ if mem[curpen + 9].int = 0 then
+ fillspec(rhs)
+ else
+ fillenvelope(rhs);
+ if lhs <> (-30000) then begin
+ revturns := true;
+ lhs := makespec(lhs, mem[curpen + 9].int, internal[5]);
+ revturns := false;
+ if mem[curpen + 9].int = 0 then
+ fillspec(lhs)
+ else
+ fillenvelope(lhs)
+ end;
+ 45: {:1064}
+ null
+ end;
+ if mem[curpen].hh.lh = (-30000) then
+ tosspen(curpen)
+ else
+ mem[curpen].hh.lh := mem[curpen].hh.lh - 1
+ end
+ end {:1062}
+ end
+ end; {:1059} {1070:} {1098:}
+
+ function tfmcheck(m: smallnumber): scaled;
+ begin
+ if abs(internal[m]) >= 134217728 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(865)
+ end;
+ print(intname[m]);
+ print(866);
+ begin
+ helpptr := 1;
+ helpline[0] := 867
+ end;
+ putgeterror;
+ if internal[m] > 0 then
+ tfmcheck := 134217727
+ else
+ tfmcheck := -134217727
+ end else
+ tfmcheck := internal[m]
+ end; {:1098}
+
+ procedure doshipout;
+ label
+ 10;
+ var
+ c: integer;
+ begin
+ getxnext;
+ varflag := 80;
+ scanexpression;
+ {1060:
+ }
+ if curtype <> 20 then
+ if curtype = 11 then
+ curedges := curexp
+ else begin
+ begin
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end {:1060};
+ goto 10
+ end
+ else begin
+ findedgesvar(curexp);
+ curtype := 1
+ end;
+ if curedges <> (-30000) then begin
+ c := roundunscaled(internal[18]) mod 256;
+ if c < 0 then
+ c := c + 256; {1099:}
+ if c < bc then
+ bc := c;
+ if c > ec then
+ ec := c;
+ charexists[c] := true;
+ gfdx[c] := internal[24];
+ gfdy[c] := internal[25];
+ tfmwidth[c] := tfmcheck(20);
+ tfmheight[c] := tfmcheck(21);
+ tfmdepth[c] := tfmcheck(22);
+ tfmitalcorr[c] := tfmcheck(23) {:1099};
+ if internal[34] >= 0 then
+ shipout(c)
+ end;
+ flushcurexp(0);
+ 10:
+ null
+ end; {:1070}
+{1071:}
+
+ procedure dodisplay;
+ label
+ 45, 50, 10;
+ var
+ e: halfword;
+ begin
+ getxnext;
+ varflag := 73;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ e := curexp;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ goto 50;
+ curexp := roundunscaled(curexp);
+ if curexp < 0 then
+ goto 45;
+ if curexp > 15 then
+ goto 45;
+ if not windowopen[curexp] then
+ goto 45;
+ findedgesvar(e);
+ if curedges <> (-30000) then
+ dispedges(curexp);
+ goto 10;
+ 45:
+ curexp := curexp * 65536;
+ 50:
+ disperr(-30000, 849);
+ begin
+ helpptr := 1;
+ helpline[0] := 850
+ end;
+ putgetflusherror(0);
+ flushtokenlist(e)
+ end;
+ 10:
+ null
+ end; { dodisplay }
+{:1071}
+ {1072:}
+
+ function getpair(c: commandcode): boolean;
+ var
+ p: halfword;
+ b: boolean;
+ begin
+ if curcmd <> c then
+ getpair := false
+ else begin
+ getxnext;
+ scanexpression;
+ if nicepair(curexp, curtype) then begin
+ p := mem[curexp + 1].int;
+ curx := mem[p + 1].int;
+ cury := mem[p + 3].int;
+ b := true
+ end else
+ b := false;
+ flushcurexp(0);
+ getpair := b
+ end
+ end; {:1072} {1073:}
+
+ procedure doopenwindow;
+ label
+ 45, 10;
+ var
+ k: integer;
+ r0, c0, r1, c1: scaled;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ goto 45;
+ k := roundunscaled(curexp);
+ if k < 0 then
+ goto 45;
+ if k > 15 then
+ goto 45;
+ if not getpair(70) then
+ goto 45;
+ r0 := curx;
+ c0 := cury;
+ if not getpair(71) then
+ goto 45;
+ r1 := curx;
+ c1 := cury;
+ if not getpair(72) then
+ goto 45;
+ openawindow(k, r0, c0, r1, c1, curx, cury);
+ goto 10;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(851)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 852;
+ helpline[0] := 853
+ end;
+ putgeterror;
+ 10:
+ null
+ end; {:1073} {1074:}
+
+ procedure docull;
+ label
+ 45, 10;
+ var
+ e: halfword;
+ keeping: 0..1;
+ w, win, wout: integer;
+ begin
+ w := 1;
+ getxnext;
+ varflag := 67;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ e := curexp;
+ curtype := 1;
+ keeping := curmod;
+ if not getpair(67) then
+ goto 45;
+ while (curcmd = 66) and (curmod = 16) do
+ if scanwith then
+ w := curexp; {1075:}
+ if curx > cury then
+ goto 45;
+ if keeping = 0 then begin
+ if (curx > 0) or (cury < 0) then
+ goto 45;
+ wout := w;
+ win := 0
+ end else begin
+ if (curx <= 0) and (cury >= 0) then
+ goto 45;
+ wout := 0;
+ win := w
+ end {:1075};
+ findedgesvar(e);
+ if curedges <> (-30000) then
+ culledges(floorunscaled(curx + 65535), floorunscaled(cury), wout, win);
+ goto 10;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(854)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 855
+ end;
+ putgeterror;
+ flushtokenlist(e)
+ end;
+ 10:
+ null
+ end; {:1074} {1082:}
+
+ procedure domessage;
+ var
+ m: 0..2;
+ begin
+ m := curmod;
+ getxnext;
+ scanexpression;
+ if curtype <> 4 then begin
+ disperr(-30000, 565);
+ begin
+ helpptr := 1;
+ helpline[0] := 859
+ end;
+ putgeterror
+ end else
+ case m of
+ 0:
+ begin
+ printnl(155);
+ slowprint(curexp)
+ end;
+ 1:
+ begin {1086:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(155)
+ end;
+ slowprint(curexp);
+ if errhelp <> 0 then
+ useerrhelp := true
+ else if longhelpseen then begin
+ helpptr := 1;
+ helpline[0] := 860
+ end else begin
+ if interaction < 3 then
+ longhelpseen := true;
+ begin
+ helpptr := 4;
+ helpline[3] := 861;
+ helpline[2] := 862;
+ helpline[1] := 863;
+ helpline[0] := 864
+ end
+ end;
+ putgeterror;
+ useerrhelp := false
+ end; {:1086}
+ 2:
+ begin {1083:}
+ if errhelp <> 0 then begin
+ if strref[errhelp] < 127 then
+ if strref[errhelp] > 1 then
+ strref[errhelp] := strref[errhelp] - 1
+ else
+ flushstring(errhelp)
+ end;
+ if (strstart[curexp + 1] - strstart[curexp]) = 0 then
+ errhelp := 0
+ else begin
+ errhelp := curexp;
+ begin
+ if strref[errhelp] < 127 then
+ strref[errhelp] := strref[errhelp] + 1
+ end
+ end
+ end
+ end {:1083};
+ flushcurexp(0)
+ end; {:1082} {1103:}
+
+ function getcode: eightbits;
+ label
+ 40;
+ var
+ c: integer;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype = 16 then begin
+ c := roundunscaled(curexp);
+ if c >= 0 then
+ if c < 256 then
+ goto 40
+ end else if curtype = 4 then
+ if (strstart[curexp + 1] - strstart[curexp]) = 1 then begin
+ c := strpool[strstart[curexp]];
+ goto 40
+ end;
+ disperr(-30000, 873);
+ begin
+ helpptr := 2;
+ helpline[1] := 874;
+ helpline[0] := 875
+ end;
+ putgetflusherror(0);
+ c := 0;
+ 40:
+ getcode := c
+ end; {:1103} {1104:}
+
+ procedure settag(c: eightbits; t: smallnumber; r: eightbits);
+ begin
+ if chartag[c] = 0 then begin
+ chartag[c] := t;
+ charremainder[c] := r
+ end else begin {1105:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(876)
+ end;
+ if (c > 32) and (c < 128) then
+ print(c)
+ else begin
+ print(877);
+ printint(c)
+ end;
+ print(878);
+ case chartag[c] of
+ 1:
+ print(879);
+ 2:
+ print(880);
+ 3:
+ print(870)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 881;
+ helpline[0] := 834
+ end;
+ putgeterror
+ end {:1105}
+ end; {:1104} {1106:}
+
+ procedure dotfmcommand;
+ label
+ 22;
+ var
+ c, cc: eightbits;
+ k: 0..256;
+ j: integer;
+ begin
+ case curmod of
+ 0:
+ begin {1107:}
+ c := getcode;
+ while curcmd = 78 do begin
+ cc := getcode;
+ settag(c, 2, cc);
+ c := cc
+ end
+ end; {:1107}
+ 1:
+ begin {1108:}
+ 22:
+ c := getcode;
+ if curcmd = 78 then begin {1111:}
+ if nl < 256 then
+ settag(c, 1, nl)
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(891)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 892
+ end;
+ error
+ end;
+ goto 22
+ end {:1111};
+ if curcmd = 76 then begin {1112:}
+ ligkern[nl].b1 := c - 128;
+ ligkern[nl].b2 := curmod - 128;
+ ligkern[nl].b0 := -128;
+ if curmod = 0 then
+ ligkern[nl].b3 := getcode - 128
+ else begin
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 893);
+ begin
+ helpptr := 2;
+ helpline[1] := 894;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end;
+ kern[nk] := curexp;
+ k := 0;
+ while kern[k] <> curexp do
+ k := k + 1;
+ if k = nk then begin
+ if nk = 256 then
+ overflow(890, 256);
+ nk := nk + 1
+ end;
+ ligkern[nl].b3 := k - 128
+ end {:1112};
+ if nl = ligtablesize then
+ overflow(886, ligtablesize);
+ nl := nl + 1;
+ if curcmd = 79 then
+ goto 22
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(887)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 888
+ end;
+ backerror
+ end;
+ if nl > 0 then
+ ligkern[nl - 1].b0 := 0
+ end; {:1108}
+ 2:
+ begin {1113:}
+ if ne = 256 then
+ overflow(870, 256);
+ c := getcode;
+ settag(c, 3, ne);
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b0 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b1 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b2 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b3 := getcode - 128;
+ ne := ne + 1
+ end; {:1113}
+ 3, 4:
+ begin
+ c := curmod;
+ getxnext;
+ scanexpression;
+ if (curtype <> 16) or (curexp < 32768) then begin
+ disperr(-30000, 882);
+ begin
+ helpptr := 2;
+ helpline[1] := 883;
+ helpline[0] := 884
+ end;
+ putgeterror
+ end else begin
+ j := roundunscaled(curexp);
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 1;
+ helpline[0] := 885
+ end;
+ backerror
+ end;
+ if c = 3 then {1114:}
+ repeat
+ if j > headersize then
+ overflow(871, headersize);
+ headerbyte[j] := getcode;
+ j := j + 1
+ until curcmd <> 79 {:1114} {1115:}
+ else
+ repeat
+ if j > maxfontdimen then
+ overflow(872, maxfontdimen);
+ while j > np do begin
+ np := np + 1;
+ param[np] := 0
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 896);
+ begin
+ helpptr := 1;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end;
+ param[j] := curexp;
+ j := j + 1
+ until curcmd <> 79 {:1115}
+ end
+ end
+ end
+ end; {:1106} {1177:}
+
+ procedure dospecial;
+ var
+ m: smallnumber;
+ begin
+ m := curmod;
+ getxnext;
+ scanexpression;
+ if internal[34] >= 0 then
+ if curtype <> m then begin {1178:}
+ disperr(-30000, 914);
+ begin
+ helpptr := 1;
+ helpline[0] := 915
+ end;
+ putgeterror
+ end else begin {:1178}
+ if outputfilename = 0 then
+ initgf;
+ if m = 4 then
+ gfstring(curexp, 0)
+ else begin
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(curexp)
+ end
+ end;
+ flushcurexp(0)
+ end; {:1177} {1186:}
+ {procedure storebasefile;var k:integer;
+ p,q:halfword;x:integer;w:fourquarters;begin[1200:]selector:=5;
+ print(925);print(jobname);printchar(32);
+ printint(roundunscaled(internal[14])mod 100);printchar(46);
+ printint(roundunscaled(internal[15]));printchar(46);
+ printint(roundunscaled(internal[16]));printchar(41);
+ if interaction=0 then selector:=2 else selector:=3;
+ begin if poolptr+1>maxpoolptr then begin if poolptr+1>poolsize then
+ overflow(129,poolsize-initpoolptr);maxpoolptr:=poolptr+1;end;end;
+ baseident:=makestring;strref[baseident]:=127;packjobname(926);
+ while not wopenout(basefile)do promptfilename(927,926);printnl(928);
+ print(wmakenamestring(basefile));flushstring(strptr-1);
+ printnl(baseident)[:1200];[1190:]begin basefile^.int:=503742536;
+ put(basefile);end;begin basefile^.int:=-30000;put(basefile);end;
+ begin basefile^.int:=30000;put(basefile);end;begin basefile^.int:=2100;
+ put(basefile);end;begin basefile^.int:=1777;put(basefile);end;
+ begin basefile^.int:=6;put(basefile);end[:1190];
+ [1192:]begin basefile^.int:=poolptr;put(basefile);end;
+ begin basefile^.int:=strptr;put(basefile);end;
+ for k:=0 to strptr do begin basefile^.int:=strstart[k];put(basefile);
+ end;k:=0;while k+4<poolptr do begin w.b0:=strpool[k];w.b1:=strpool[k+1];
+ w.b2:=strpool[k+2];w.b3:=strpool[k+3];begin basefile^.qqqq:=w;
+ put(basefile);end;k:=k+4;end;k:=poolptr-4;w.b0:=strpool[k];
+ w.b1:=strpool[k+1];w.b2:=strpool[k+2];w.b3:=strpool[k+3];
+ begin basefile^.qqqq:=w;put(basefile);end;println;printint(strptr);
+ print(922);printint(poolptr)[:1192];[1194:]sortavail;varused:=0;
+ begin basefile^.int:=lomemmax;put(basefile);end;
+ begin basefile^.int:=rover;put(basefile);end;p:=-30000;q:=rover;x:=0;
+ repeat for k:=p to q+1 do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+q+2-p;varused:=varused+q-p;p:=q+mem[q].hh.lh;q:=mem[q+1].hh.rh;
+ until q=rover;varused:=varused+lomemmax-p;dynused:=memend+1-himemmin;
+ for k:=p to lomemmax do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+lomemmax+1-p;begin basefile^.int:=himemmin;put(basefile);end;
+ begin basefile^.int:=avail;put(basefile);end;
+ for k:=himemmin to memend do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+memend+1-himemmin;p:=avail;
+ while p<>-30000 do begin dynused:=dynused-1;p:=mem[p].hh.rh;end;
+ begin basefile^.int:=varused;put(basefile);end;
+ begin basefile^.int:=dynused;put(basefile);end;println;printint(x);
+ print(923);printint(varused);printchar(38);printint(dynused)[:1194];
+ [1196:]begin basefile^.int:=hashused;put(basefile);end;
+ stcount:=2228-hashused;
+ for p:=1 to hashused do if hash[p].rh<>0 then begin begin basefile^.int
+ :=p;put(basefile);end;begin basefile^.hh:=hash[p];put(basefile);end;
+ begin basefile^.hh:=eqtb[p];put(basefile);end;stcount:=stcount+1;end;
+ for p:=hashused+1 to 2241 do begin begin basefile^.hh:=hash[p];
+ put(basefile);end;begin basefile^.hh:=eqtb[p];put(basefile);end;end;
+ begin basefile^.int:=stcount;put(basefile);end;println;
+ printint(stcount);print(924)[:1196];[1198:]begin basefile^.int:=intptr;
+ put(basefile);end;
+ for k:=1 to intptr do begin begin basefile^.int:=internal[k];
+ put(basefile);end;begin basefile^.int:=intname[k];put(basefile);end;end;
+ begin basefile^.int:=startsym;put(basefile);end;
+ begin basefile^.int:=interaction;put(basefile);end;
+ begin basefile^.int:=baseident;put(basefile);end;
+ begin basefile^.int:=bgloc;put(basefile);end;begin basefile^.int:=egloc;
+ put(basefile);end;begin basefile^.int:=serialno;put(basefile);end;
+ begin basefile^.int:=69069;put(basefile);end;internal[12]:=0[:1198];
+ [1201:]wclose(basefile)[:1201];end;}
+ {:1186}
+
+ procedure dostatement;
+ begin
+ curtype := 1;
+ getxnext;
+ if curcmd > 43 then begin {990:}
+ if curcmd < 80 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(733)
+ end;
+ printcmdmod(curcmd, curmod);
+ printchar(39);
+ begin
+ helpptr := 5;
+ helpline[4] := 734;
+ helpline[3] := 735;
+ helpline[2] := 736;
+ helpline[1] := 737;
+ helpline[0] := 738
+ end;
+ backerror;
+ getxnext
+ end
+ end else if curcmd > 30 then begin {:990} {993:}
+ varflag := 77;
+ scanexpression;
+ if curcmd < 81 then begin
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment
+ else if curtype = 4 then begin {994:}
+ if internal[1] > 0 then begin
+ printnl(155);
+ slowprint(curexp);
+ {---------------------}
+ auxprintnl(155);
+ auxslowprint(curexp);
+ {---------------------}
+ flush(output)
+ end;
+ if internal[34] > 0 then begin {1179:}
+ if outputfilename = 0 then
+ initgf;
+ gfstring(916, curexp)
+ end {:1179}
+ end else if curtype <> 1 then begin {:994}
+ disperr(-30000, 743);
+ begin
+ helpptr := 3;
+ helpline[2] := 744;
+ helpline[1] := 745;
+ helpline[0] := 746
+ end;
+ putgeterror
+ end;
+ flushcurexp(0);
+ curtype := 1
+ end
+ end else begin {:993} {992:}
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod);
+ case curcmd of
+ 30:
+ dotypedeclaration;
+ 16:
+ if curmod > 2 then
+ makeopdef
+ else if curmod > 0 then
+ scandef; {1020:}
+ 24:
+ dorandomseed; {:1020} {1023:}
+ 23:
+ begin
+ println;
+ interaction := curmod; {70:}
+ if interaction = 0 then
+ selector := 0
+ else
+ selector := 1 {:70};
+ if jobname <> 0 then
+ selector := selector + 2;
+ getxnext
+ end; {:1023} {1026:}
+ 21:
+ doprotection; {:1026} {1030:}
+ 27:
+ defdelims; {:1030} {1033:}
+ 12:
+ repeat
+ getsymbol;
+ savevariable(cursym);
+ getxnext
+ until curcmd <> 79;
+ 13:
+ dointerim;
+ 14:
+ dolet;
+ 15:
+ donewinternal; {:1033} {1039:}
+ 22:
+ doshowwhatever;
+{:1039}
+ {1058:}
+ 18:
+ doaddto; {:1058} {1069:}
+ 17:
+ doshipout;
+ 11:
+ dodisplay;
+ 28:
+ doopenwindow;
+ 19:
+ docull; {:1069} {1076:}
+ 26:
+ begin
+ getsymbol;
+ startsym := cursym;
+ getxnext
+ end; {:1076} {1081:}
+ 25:
+ domessage; {:1081} {1100:}
+ 20:
+ dotfmcommand; {:1100} {1175:}
+ 29:
+ dospecial
+ end {:1175};
+ curtype := 1
+ end {:992};
+ if curcmd < 80 then begin {991:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(739)
+ end;
+ begin
+ helpptr := 6;
+ helpline[5] := 740;
+ helpline[4] := 741;
+ helpline[3] := 742;
+ helpline[2] := 736;
+ helpline[1] := 737;
+ helpline[0] := 738
+ end;
+ backerror;
+ scannerstatus := 2;
+ repeat
+ getnext; {743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ until curcmd > 79;
+ scannerstatus := 0
+ end {:991};
+ errorcount := 0
+ end; {:989}
+{1017:}
+
+ procedure maincontrol;
+ begin
+ repeat
+ dostatement;
+ if curcmd = 81 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(774)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 775;
+ helpline[0] := 555
+ end;
+ flusherror(0)
+ end
+ until curcmd = 82
+ end; {:1017} {1117:}
+
+ function sortin(v: scaled): halfword;
+ label
+ 40;
+ var
+ p, q, r: halfword;
+ begin
+ p := 29999;
+ while true do begin
+ q := mem[p].hh.rh;
+ if v <= mem[q + 1].int then
+ goto 40;
+ p := q
+ end;
+ 40:
+ if v < mem[q + 1].int then begin
+ r := getnode(2);
+ mem[r + 1].int := v;
+ mem[r].hh.rh := q;
+ mem[p].hh.rh := r
+ end;
+ sortin := mem[p].hh.rh
+ end; {:1117}
+{1118:}
+
+ function mincover(d: scaled): integer;
+ var
+ p: halfword;
+ l: scaled;
+ m: integer;
+ begin
+ m := 0;
+ p := mem[29999].hh.rh;
+ perturbation := 2147483647;
+ while p <> (-29981) do begin
+ m := m + 1;
+ l := mem[p + 1].int;
+ repeat
+ p := mem[p].hh.rh
+ until mem[p + 1].int > (l + d);
+ if (mem[p + 1].int - l) < perturbation then
+ perturbation := mem[p + 1].int - l
+ end;
+ mincover := m
+ end; {:1118} {1120:}
+
+ function threshold(m: integer): scaled;
+ var
+ d: scaled;
+ begin
+ if mincover(0) <= m then
+ threshold := 0
+ else begin
+ repeat
+ d := perturbation
+ until mincover(d + d) <= m;
+ while mincover(d) > m do
+ d := perturbation;
+ threshold := d
+ end
+ end; {:1120}
+{1121:}
+
+ function skimp(m: integer): integer;
+ var
+ d: scaled;
+ p, q, r: halfword;
+ l: scaled;
+ v: scaled;
+ begin
+ d := threshold(m);
+ perturbation := 0;
+ q := 29999;
+ m := 0;
+ p := mem[29999].hh.rh;
+ while p <> (-29981) do begin
+ m := m + 1;
+ l := mem[p + 1].int;
+ mem[p].hh.lh := m;
+ if mem[mem[p].hh.rh + 1].int <= (l + d) then begin {1122:}
+ repeat
+ p := mem[p].hh.rh;
+ mem[p].hh.lh := m
+ until mem[mem[p].hh.rh + 1].int > (l + d);
+ v := (l + mem[p + 1].int) div 2;
+ if (mem[p + 1].int - v) > perturbation then
+ perturbation := mem[p + 1].int - v;
+ r := q;
+ repeat
+ r := mem[r].hh.rh;
+ mem[r + 1].int := v
+ until r = p;
+ mem[q].hh.rh := p
+ end {:1122};
+ q := p;
+ p := mem[p].hh.rh
+ end;
+ skimp := m
+ end; {:1121} {1123:}
+
+ procedure tfmwarning(m: smallnumber);
+ begin
+ printnl(897);
+ print(intname[m]);
+ print(898);
+ printscaled(perturbation);
+ print(899)
+ end; { tfmwarning }
+{:1123}
+ {1128:}
+
+ procedure fixdesignsize;
+ var
+ d: scaled;
+ begin
+ d := internal[26];
+ if (d < 65536) or (d >= 134217728) then begin
+ if d <> 0 then
+ printnl(900);
+ d := 8388608;
+ internal[26] := d
+ end;
+ if headerbyte[5] < 0 then
+ if headerbyte[6] < 0 then
+ if headerbyte[7] < 0 then
+ if headerbyte[8] < 0 then begin
+ headerbyte[5] := d div 1048576;
+ headerbyte[6] := (d div 4096) mod 256;
+ headerbyte[7] := (d div 16) mod 256;
+ headerbyte[8] := (d mod 16) * 16
+ end;
+ maxtfmdimen := (16 * internal[26]) - (internal[26] div 2097152);
+ if maxtfmdimen >= 134217728 then
+ maxtfmdimen := 134217727
+ end; {:1128} {1129:}
+
+ function dimenout(x: scaled): integer;
+ begin
+ if abs(x) > maxtfmdimen then begin
+ tfmchanged := tfmchanged + 1;
+ if x > 0 then
+ x := 16777215
+ else
+ x := -16777215
+ end else
+ x := makescaled(x * 16, internal[26]);
+ dimenout := x
+ end; {:1129} {1131:}
+
+ procedure fixchecksum;
+ label
+ 10;
+ var
+ k: eightbits;
+ b1, b2, b3, b4: eightbits;
+ x: integer;
+ begin
+ if headerbyte[1] < 0 then
+ if headerbyte[2] < 0 then
+ if headerbyte[3] < 0 then
+ if headerbyte[4] < 0 then begin {1132:}
+ b1 := bc;
+ b2 := ec;
+ b3 := bc;
+ b4 := ec;
+ tfmchanged := 0;
+ for k := bc to ec do
+ if charexists[k] then begin
+ x := dimenout(mem[tfmwidth[k] + 1].int) + ((k + 4) * 4194304);
+ b1 := ((b1 + b1) + x) mod 255;
+ b2 := ((b2 + b2) + x) mod 253;
+ b3 := ((b3 + b3) + x) mod 251;
+ b4 := ((b4 + b4) + x) mod 247
+ end {:1132};
+ headerbyte[1] := b1;
+ headerbyte[2] := b2;
+ headerbyte[3] := b3;
+ headerbyte[4] := b4;
+ goto 10
+ end;
+ for k := 1 to 4 do
+ if headerbyte[k] < 0 then
+ headerbyte[k] := 0;
+ 10:
+ null
+ end; {:1131}
+{1133:}
+
+ procedure tfmqqqq(x: fourquarters);
+ begin
+ bwritebyte(tfmfile, x.b0 + 128);
+ bwritebyte(tfmfile, x.b1 + 128);
+ bwritebyte(tfmfile, x.b2 + 128);
+ bwritebyte(tfmfile, x.b3 + 128)
+ end; {:1133}
+{1187:}
+ {779:}
+
+ function openbasefile: boolean;
+ label
+ 40, 10;
+ var
+ j: 0..bufsize;
+ begin
+ j := curinput.locfield;
+ if buffer[curinput.locfield] = 38 then begin
+ curinput.locfield := curinput.locfield + 1;
+ j := curinput.locfield;
+ buffer[last] := 32;
+ while buffer[j] <> 32 do
+ j := j + 1;
+ packbufferedname(0, curinput.locfield, j - 1);
+ if wopenin(basefile) then
+ goto 40;
+ writeln(output, 'Sorry, I can''t find that base;', ' will try PLAIN.');
+ flush(output)
+ end;
+ packbufferedname(5, 1, 0);
+ if not wopenin(basefile) then begin
+ writeln(output, 'I can''t find the PLAIN base file!');
+ openbasefile := false;
+ goto 10
+ end;
+ 40:
+ curinput.locfield := j;
+ openbasefile := true;
+ 10:
+ null
+ end; {:779}
+
+ function loadbasefile: boolean;
+ label
+ 6666, 10;
+ var
+ k: integer;
+ p, q: halfword;
+ x: integer;
+ w: fourquarters; {1191:}
+ begin
+ x := basefile^.int;
+ if x <> 503742536 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> (-30000) then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 30000 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 2100 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 1777 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 6 then
+ goto 6666 {:1191};
+{1193:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x < 0 then
+ goto 6666;
+ if x > poolsize then begin
+ writeln(output, '---! Must increase the ', 'string pool size');
+ goto 6666
+ end else
+ poolptr := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x < 0 then
+ goto 6666;
+ if x > maxstrings then begin
+ writeln(output, '---! Must increase the ', 'max strings');
+ goto 6666
+ end else
+ strptr := x
+ end;
+ for k := 0 to strptr do begin
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > poolptr) then
+ goto 6666
+ else
+ strstart[k] := x
+ end;
+ strref[k] := 127
+ end;
+ k := 0;
+ while (k + 4) < poolptr do begin
+ begin
+ get(basefile);
+ w := basefile^.qqqq
+ end;
+ strpool[k] := w.b0;
+ strpool[k + 1] := w.b1;
+ strpool[k + 2] := w.b2;
+ strpool[k + 3] := w.b3;
+ k := k + 4
+ end;
+ k := poolptr - 4;
+ begin
+ get(basefile);
+ w := basefile^.qqqq
+ end;
+ strpool[k] := w.b0;
+ strpool[k + 1] := w.b1;
+ strpool[k + 2] := w.b2;
+ strpool[k + 3] := w.b3 {:1193}; {1195:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-28978)) or (x > 29997) then
+ goto 6666
+ else
+ lomemmax := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-29977)) or (x > lomemmax) then
+ goto 6666
+ else
+ rover := x
+ end;
+ p := -30000;
+ q := rover;
+ x := 0;
+ repeat
+ for k := p to q + 1 do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ p := q + mem[q].hh.lh;
+ if (p > lomemmax) or ((q >= mem[q + 1].hh.rh) and (mem[q + 1].hh.rh <> rover)) then
+ goto 6666;
+ q := mem[q + 1].hh.rh
+ until q = rover;
+ for k := p to lomemmax do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (lomemmax + 1)) or (x > 29998) then
+ goto 6666
+ else
+ himemmin := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-30000)) or (x > 30000) then
+ goto 6666
+ else
+ avail := x
+ end;
+ memend := 30000;
+ for k := himemmin to memend do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ begin
+ get(basefile);
+ varused := basefile^.int
+ end;
+ begin
+ get(basefile);
+ dynused := basefile^.int
+ end {:1195}; {1197:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2229) then
+ goto 6666
+ else
+ hashused := x
+ end;
+ p := 0;
+ repeat
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (p + 1)) or (x > hashused) then
+ goto 6666
+ else
+ p := x
+ end;
+ begin
+ get(basefile);
+ hash[p] := basefile^.hh
+ end;
+ begin
+ get(basefile);
+ eqtb[p] := basefile^.hh
+ end
+ until p = hashused;
+ for p := hashused + 1 to 2241 do begin
+ begin
+ get(basefile);
+ hash[p] := basefile^.hh
+ end;
+ begin
+ get(basefile);
+ eqtb[p] := basefile^.hh
+ end
+ end;
+ begin
+ get(basefile);
+ stcount := basefile^.int
+ end {:1197}; {1199:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 40) or (x > maxinternal) then
+ goto 6666
+ else
+ intptr := x
+ end;
+ for k := 1 to intptr do begin
+ begin
+ get(basefile);
+ internal[k] := basefile^.int
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > strptr) then
+ goto 6666
+ else
+ intname[k] := x
+ end
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > 2229) then
+ goto 6666
+ else
+ startsym := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > 3) then
+ goto 6666
+ else
+ interaction := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > strptr) then
+ goto 6666
+ else
+ baseident := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2241) then
+ goto 6666
+ else
+ bgloc := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2241) then
+ goto 6666
+ else
+ egloc := x
+ end;
+ begin
+ get(basefile);
+ serialno := basefile^.int
+ end;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x <> 69069) or eof(basefile) then
+ goto 6666 {:1199};
+ loadbasefile := true;
+ goto 10;
+ 6666:
+ null;
+ writeln(output, '(Fatal base file error; I''m stymied)');
+ loadbasefile := false;
+ 10:
+ null
+ end; {:1187} {1202:} {823:}
+
+ procedure scanprimary;
+ label
+ 20, 30, 31, 32;
+ var
+ p, q, r: halfword;
+ c: quarterword;
+ myvarflag: 0..82;
+ ldelim, rdelim: halfword; {831:}
+ groupline: integer; {:831} {836:}
+ num, denom: scaled; {:836} {843:}
+ prehead, posthead, tail: halfword;
+ tt: smallnumber;
+ t: halfword;
+ macroref: halfword; {:843}
+ begin
+ myvarflag := varflag;
+ varflag := 0;
+ 20:
+ begin
+ if aritherror then
+ cleararith
+ end; {825:}
+{if panicking then checkmem(false);}
+ if interrupt <> 0 then
+ if OKtointerrupt then begin
+ backinput;
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end;
+ getxnext
+ end {:825};
+ if curcmd in
+ [31, 32, 39, 42, 33, 34, 30, 36,
+ 43, 37, 35, 40, 38, 41] then
+ case curcmd of
+ 31:
+ begin {826:}
+ ldelim := cursym;
+ rdelim := curmod;
+ getxnext;
+ scanexpression;
+ if (curcmd = 79) and (curtype >= 16) then begin {830:}
+ p := getnode(2);
+ mem[p].hh.b0 := 14;
+ mem[p].hh.b1 := 11;
+ initbignode(p);
+ q := mem[p + 1].int;
+ stashin(q);
+ getxnext;
+ scanexpression;
+ if curtype < 16 then begin
+ disperr(-30000, 639);
+ begin
+ helpptr := 4;
+ helpline[3] := 640;
+ helpline[2] := 641;
+ helpline[1] := 642;
+ helpline[0] := 643
+ end;
+ putgetflusherror(0)
+ end;
+ stashin(q + 2);
+ checkdelimiter(ldelim, rdelim);
+ curtype := 14;
+ curexp := p
+ end else {:830}
+ checkdelimiter(ldelim, rdelim)
+ end; {:826}
+ 32:
+ begin {832:}
+ groupline := line;
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod);
+ begin
+ p := getavail;
+ mem[p].hh.lh := 0;
+ mem[p].hh.rh := saveptr;
+ saveptr := p
+ end;
+ repeat
+ dostatement
+ until curcmd <> 80;
+ if curcmd <> 81 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(644)
+ end;
+ printint(groupline);
+ print(645);
+ begin
+ helpptr := 2;
+ helpline[1] := 646;
+ helpline[0] := 647
+ end;
+ backerror;
+ curcmd := 81
+ end;
+ unsave;
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod)
+ end; {:832}
+ 39:
+ begin {833:}
+ curtype := 4;
+ curexp := curmod
+ end; {:833}
+ 42:
+ begin {837:}
+ curexp := curmod;
+ curtype := 16;
+ getxnext;
+ if curcmd <> 54 then begin
+ num := 0;
+ denom := 0
+ end else begin
+ getxnext;
+ if curcmd <> 42 then begin
+ backinput;
+ curcmd := 54;
+ curmod := 72;
+ cursym := 2233;
+ goto 30
+ end;
+ num := curexp;
+ denom := curmod;
+ if denom = 0 then begin {838:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(648)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 649
+ end;
+ error
+ end else {:838}
+ curexp := makescaled(num, denom);
+ begin
+ if aritherror then
+ cleararith
+ end;
+ getxnext
+ end;
+ if curcmd >= 30 then
+ if curcmd < 42 then begin
+ p := stashcurexp;
+ scanprimary;
+ if (abs(num) >= abs(denom)) or (curtype < 14) then
+ dobinary(p, 71)
+ else begin
+ fracmult(num, denom);
+ freenode(p, 2)
+ end
+ end;
+ goto 30
+ end; {:837}
+ 33: {834:}
+ donullary(curmod) {:834};
+ 34, 30, 36, 43:
+ begin {835:}
+ c := curmod;
+ getxnext;
+ scanprimary;
+ dounary(c);
+ goto 30
+ end; {:835}
+ 37:
+ begin {839:}
+ c := curmod;
+ getxnext;
+ scanexpression;
+ if curcmd <> 69 then begin
+ missingerr(347);
+ print(581);
+ printcmdmod(37, c);
+ begin
+ helpptr := 1;
+ helpline[0] := 582
+ end;
+ backerror
+ end;
+ p := stashcurexp;
+ getxnext;
+ scanprimary;
+ dobinary(p, c);
+ goto 30
+ end; {:839}
+ 35:
+ begin {840:}
+ getxnext;
+ scansuffix;
+ oldsetting := selector;
+ selector := 5;
+ showtokenlist(curexp, -30000, 100000, 0);
+ flushtokenlist(curexp);
+ curexp := makestring;
+ selector := oldsetting;
+ curtype := 4;
+ goto 30
+ end; {:840}
+ 40:
+ begin {841:}
+ q := curmod;
+ if myvarflag = 77 then begin
+ getxnext;
+ if curcmd = 77 then begin
+ curexp := getavail;
+ mem[curexp].hh.lh := q + 2241;
+ curtype := 20;
+ goto 30
+ end;
+ backinput
+ end;
+ curtype := 16;
+ curexp := internal[q]
+ end; {:841}
+ 38:
+ makeexpcopy(curmod);
+ 41:
+ begin {844:}
+ begin
+ prehead := avail;
+ if prehead = (-30000) then
+ prehead := getavail
+ else begin
+ avail := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ tail := prehead;
+ posthead := -30000;
+ tt := 1;
+ while true do begin
+ t := curtok;
+ mem[tail].hh.rh := t;
+ if tt <> 0 then begin {850:}
+ begin
+ p := mem[prehead].hh.rh;
+ q := mem[p].hh.lh;
+ tt := 0;
+ if (eqtb[q].lh mod 83) = 41 then begin
+ q := eqtb[q].rh;
+ if q = (-30000) then
+ goto 32;
+ while true do begin
+ p := mem[p].hh.rh;
+ if p = (-30000) then begin
+ tt := mem[q].hh.b0;
+ goto 32
+ end;
+ if mem[q].hh.b0 <> 21 then
+ goto 32;
+ q := mem[mem[q + 1].hh.lh].hh.rh;
+ if p >= himemmin then begin
+ repeat
+ q := mem[q].hh.rh
+ until mem[q + 2].hh.lh >= mem[p].hh.lh;
+ if mem[q + 2].hh.lh > mem[p].hh.lh then
+ goto 32
+ end
+ end
+ end;
+ 32: {:850}
+ null
+ end;
+ if tt >= 22 then begin {845:}
+ mem[tail].hh.rh := -30000;
+ if tt > 22 then begin
+ posthead := getavail;
+ tail := posthead;
+ mem[tail].hh.rh := t;
+ tt := 0;
+ macroref := mem[q + 1].int;
+ mem[macroref].hh.lh := mem[macroref].hh.lh + 1
+ end else begin {853:}
+ p := getavail;
+ mem[prehead].hh.lh := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := p;
+ mem[p].hh.lh := t;
+ macrocall(mem[q + 1].int, prehead, -30000);
+ getxnext;
+ goto 20
+ end {:853}
+ end {:845}
+ end;
+ getxnext;
+ tail := t;
+ if curcmd = 63 then begin {846:}
+ getxnext;
+ scanexpression;
+ if curcmd <> 64 then begin {847:}
+ backinput;
+ backexpr;
+ curcmd := 63;
+ curmod := 0;
+ cursym := 2232
+ end else begin {:847}
+ if curtype <> 16 then
+ badsubscript;
+ curcmd := 42;
+ curmod := curexp;
+ cursym := 0
+ end
+ end {:846};
+ if curcmd > 42 then
+ goto 31;
+ if curcmd < 40 then
+ goto 31
+ end;
+ 31: {852:}
+ if posthead <> (-30000) then begin {854:}
+ backinput;
+ p := getavail;
+ q := mem[posthead].hh.rh;
+ mem[prehead].hh.lh := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := posthead;
+ mem[posthead].hh.lh := q;
+ mem[posthead].hh.rh := p;
+ mem[p].hh.lh := mem[q].hh.rh;
+ mem[q].hh.rh := -30000;
+ macrocall(macroref, prehead, -30000);
+ mem[macroref].hh.lh := mem[macroref].hh.lh - 1;
+ getxnext;
+ goto 20
+ end {:854};
+ q := mem[prehead].hh.rh;
+ begin
+ mem[prehead].hh.rh := avail;
+ avail := prehead
+ end
+{dynused:=dynused-1;};
+ if curcmd = myvarflag then begin
+ curtype := 20;
+ curexp := q;
+ goto 30
+ end;
+ p := findvariable(q);
+ if p <> (-30000) then
+ makeexpcopy(p)
+ else begin
+ obliterated(q);
+ helpline[2] := 661;
+ helpline[1] := 662;
+ helpline[0] := 663;
+ putgetflusherror(0)
+ end;
+ flushnodelist(q);
+ goto 30 {:852}
+ end
+ end
+ else
+ begin {:844}
+ badexp(633);
+ goto 20
+ end;
+ getxnext;
+ 30:
+ if curcmd = 63 then
+ if curtype >= 16 then begin {859:}
+ p := stashcurexp;
+ getxnext;
+ scanexpression;
+ if curcmd <> 79 then begin {847:}
+ begin
+ backinput;
+ backexpr;
+ curcmd := 63;
+ curmod := 0;
+ cursym := 2232
+ end {:847};
+ unstashcurexp(p)
+ end else begin
+ q := stashcurexp;
+ getxnext;
+ scanexpression;
+ if curcmd <> 64 then begin
+ missingerr(93);
+ begin
+ helpptr := 3;
+ helpline[2] := 665;
+ helpline[1] := 666;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ r := stashcurexp;
+ makeexpcopy(q);
+ dobinary(r, 70);
+ dobinary(p, 71);
+ dobinary(q, 69);
+ getxnext
+ end
+ end {:859}
+ end; {:823} {860:}
+
+ procedure scansuffix;
+ label
+ 30;
+ var
+ h, t: halfword;
+ p: halfword;
+ begin
+ h := getavail;
+ t := h;
+ while true do begin
+ if curcmd = 63 then begin {861:}
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badsubscript;
+ if curcmd <> 64 then begin
+ missingerr(93);
+ begin
+ helpptr := 3;
+ helpline[2] := 667;
+ helpline[1] := 666;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ curcmd := 42;
+ curmod := curexp
+ end {:861};
+ if curcmd = 42 then
+ p := newnumtok(curmod)
+ else if (curcmd = 41) or (curcmd = 40) then begin
+ p := getavail;
+ mem[p].hh.lh := cursym
+ end else
+ goto 30;
+ mem[t].hh.rh := p;
+ t := p;
+ getxnext
+ end;
+ 30:
+ curexp := mem[h].hh.rh;
+ begin
+ mem[h].hh.rh := avail;
+ avail := h
+ end {dynused:=dynused-1;};
+ curtype := 20
+ end; {:860} {862:}
+
+ procedure scansecondary;
+ label
+ 20, 22;
+ var
+ p, q, r: halfword;
+ c, d: halfword;
+ macname: halfword;
+ begin
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(668);
+ scanprimary;
+ 22:
+ if curcmd <= 55 then
+ if curcmd >= 52 then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 53 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ getxnext;
+ scanprimary;
+ if d <> 53 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end;
+ goto 22
+ end
+ end; {:862}
+{864:}
+
+ procedure scantertiary;
+ label
+ 20, 22;
+ var
+ p: halfword;
+ c, d: halfword;
+ macname: halfword;
+ begin
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(669);
+ scansecondary;
+ if curtype = 8 then
+ materializepen;
+ 22:
+ if curcmd <= 45 then
+ if curcmd >= 43 then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 44 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ getxnext;
+ scansecondary;
+ if d <> 44 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end;
+ goto 22
+ end
+ end; {:864}
+{868:}
+
+ procedure scanexpression;
+ label
+ 20, 30, 22, 25, 26, 10;
+ var
+ p, q, r, pp, qq: halfword;
+ c, d: halfword;
+ myvarflag: 0..82;
+ macname: halfword;
+ cyclehit: boolean;
+ x, y: scaled;
+ t: 0..4;
+ begin
+ myvarflag := varflag;
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(672);
+ scantertiary;
+ 22:
+ if curcmd <= 51 then
+ if curcmd >= 46 then
+ if (curcmd <> 51) or (myvarflag <> 77) then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 49 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ if (d < 48) or ((d = 48) and ((mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 9))) then begin {869:}
+ cyclehit := false; {870:}
+ begin
+ unstashcurexp(p);
+ if curtype = 14 then
+ p := newknot
+ else if curtype = 9 then
+ p := curexp
+ else
+ goto 10;
+ q := p;
+ while mem[q].hh.rh <> p do
+ q := mem[q].hh.rh;
+ if mem[p].hh.b0 <> 0 then begin
+ r := copyknot(p);
+ mem[q].hh.rh := r;
+ q := r
+ end;
+ mem[p].hh.b0 := 4;
+ mem[q].hh.b1 := 4
+ end {:870};
+ 25: {874:}
+ if curcmd = 46 then begin {879:}
+ t := scandirection;
+ if t <> 4 then begin
+ mem[q].hh.b1 := t;
+ mem[q + 5].int := curexp;
+ if mem[q].hh.b0 = 4 then begin
+ mem[q].hh.b0 := t;
+ mem[q + 3].int := curexp
+ end
+ end
+ end {:879};
+ d := curcmd;
+ if d = 47 then begin {881:}
+ getxnext;
+ if curcmd = 58 then begin {882:}
+ getxnext;
+ y := curcmd;
+ if curcmd = 59 then
+ getxnext;
+ scanprimary; {883:}
+ if (curtype <> 16) or (curexp < 49152) then begin
+ disperr(-30000, 690);
+ begin
+ helpptr := 1;
+ helpline[0] := 691
+ end;
+ putgetflusherror(65536)
+ end {:883};
+ if y = 59 then
+ curexp := -curexp;
+ mem[q + 6].int := curexp;
+ if curcmd = 52 then begin
+ getxnext;
+ y := curcmd;
+ if curcmd = 59 then
+ getxnext;
+ scanprimary; {883:}
+ if (curtype <> 16) or (curexp < 49152) then begin
+ disperr(-30000, 690);
+ begin
+ helpptr := 1;
+ helpline[0] := 691
+ end;
+ putgetflusherror(65536)
+ end {:883};
+ if y = 59 then
+ curexp := -curexp
+ end;
+ y := curexp
+ end else if curcmd = 57 then begin {:882} {884:}
+ mem[q].hh.b1 := 1;
+ t := 1;
+ getxnext;
+ scanprimary;
+ knownpair;
+ mem[q + 5].int := curx;
+ mem[q + 6].int := cury;
+ if curcmd <> 52 then begin
+ x := mem[q + 5].int;
+ y := mem[q + 6].int
+ end else begin
+ getxnext;
+ scanprimary;
+ knownpair;
+ x := curx;
+ y := cury
+ end
+ end else begin {:884}
+ mem[q + 6].int := 65536;
+ y := 65536;
+ backinput;
+ goto 30
+ end;
+ if curcmd <> 47 then begin
+ missingerr(279);
+ begin
+ helpptr := 1;
+ helpline[0] := 689
+ end;
+ backerror
+ end;
+ 30: {:881}
+ null
+ end else if d <> 48 then
+ goto 26;
+ getxnext;
+ if curcmd = 46 then begin {880:}
+ t := scandirection;
+ if mem[q].hh.b1 <> 1 then
+ x := curexp
+ else
+ t := 1
+ end else if mem[q].hh.b1 <> 1 then begin {:880}
+ t := 4;
+ x := 0
+ end {:874};
+ if curcmd = 36 then begin {886:}
+ cyclehit := true;
+ getxnext;
+ pp := p;
+ qq := p;
+ if d = 48 then
+ if p = q then begin
+ d := 47;
+ mem[q + 6].int := 65536;
+ y := 65536
+ end
+ end else begin {:886}
+ scantertiary; {885:}
+ begin
+ if curtype <> 9 then
+ pp := newknot
+ else
+ pp := curexp;
+ qq := pp;
+ while mem[qq].hh.rh <> pp do
+ qq := mem[qq].hh.rh;
+ if mem[pp].hh.b0 <> 0 then begin
+ r := copyknot(pp);
+ mem[qq].hh.rh := r;
+ qq := r
+ end;
+ mem[pp].hh.b0 := 4;
+ mem[qq].hh.b1 := 4
+ end {:885}
+ end; {887:}
+ begin
+ if d = 48 then
+ if (mem[q + 1].int <> mem[pp + 1].int) or (mem[q + 2].int <> mem[pp + 2].int) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(692)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 693;
+ helpline[1] := 694;
+ helpline[0] := 695
+ end;
+ putgeterror;
+ d := 47;
+ mem[q + 6].int := 65536;
+ y := 65536
+ end;
+{889:}
+ if mem[pp].hh.b1 = 4 then
+ if (t = 3) or (t = 2) then begin
+ mem[pp].hh.b1 := t;
+ mem[pp + 5].int := x
+ end {:889};
+ if d = 48 then begin {890:}
+ if mem[q].hh.b0 = 4 then
+ if mem[q].hh.b1 = 4 then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end;
+ if mem[pp].hh.b1 = 4 then
+ if t = 4 then begin
+ mem[pp].hh.b1 := 3;
+ mem[pp + 5].int := 65536
+ end;
+ mem[q].hh.b1 := mem[pp].hh.b1;
+ mem[q].hh.rh := mem[pp].hh.rh;
+ mem[q + 5].int := mem[pp + 5].int;
+ mem[q + 6].int := mem[pp + 6].int;
+ freenode(pp, 7);
+ if qq = pp then
+ qq := q
+ end else begin {:890} {888:}
+ if mem[q].hh.b1 = 4 then
+ if (mem[q].hh.b0 = 3) or (mem[q].hh.b0 = 2) then begin
+ mem[q].hh.b1 := mem[q].hh.b0;
+ mem[q + 5].int := mem[q + 3].int
+ end {:888};
+ mem[q].hh.rh := pp;
+ mem[pp + 4].int := y;
+ if t <> 4 then begin
+ mem[pp + 3].int := x;
+ mem[pp].hh.b0 := t
+ end
+ end;
+ q := qq
+ end {:887};
+ if curcmd >= 46 then
+ if curcmd <= 48 then
+ if not cyclehit then
+ goto 25;
+ 26: {891:}
+ if cyclehit then begin
+ if d = 48 then
+ p := q
+ end else begin
+ mem[p].hh.b0 := 0;
+ if mem[p].hh.b1 = 4 then begin
+ mem[p].hh.b1 := 3;
+ mem[p + 5].int := 65536
+ end;
+ mem[q].hh.b1 := 0;
+ if mem[q].hh.b0 = 4 then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end;
+ mem[q].hh.rh := p
+ end;
+ makechoices(p);
+ curtype := 9;
+ curexp := p {:891}
+ end else begin {:869}
+ getxnext;
+ scantertiary;
+ if d <> 49 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end
+ end;
+ goto 22
+ end;
+ 10:
+ null
+ end; {:868} {892:}
+
+ procedure getboolean;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype <> 2 then begin
+ disperr(-30000, 696);
+ begin
+ helpptr := 2;
+ helpline[1] := 697;
+ helpline[0] := 698
+ end;
+ putgetflusherror(31);
+ curtype := 2
+ end
+ end; {:892} {224:}
+
+ procedure printcapsule;
+ begin
+ printchar(40);
+ printexp(gpointer, 0);
+ printchar(41)
+ end;
+
+ procedure tokenrecycle;
+ begin
+ recyclevalue(gpointer)
+ end; {:224} {1205:}
+
+ procedure closefilesandtermina;
+ var
+ k: integer;
+ lh: integer;
+ p: halfword;
+ x: scaled;
+ {if internal[12]>0 then[1208:]if jobname>0 then begin writeln(
+ logfile,' ');
+ writeln(logfile,'Here is how much of METAFONT''s memory',' you used:');
+ write(logfile,' ',maxstrptr-initstrptr:1,' string');
+ if maxstrptr<>initstrptr+1 then write(logfile,'s');
+ writeln(logfile,' out of ',maxstrings-initstrptr:1);
+ writeln(logfile,' ',maxpoolptr-initpoolptr:1,
+ ' string characters out of ',poolsize-initpoolptr:1);
+ writeln(logfile,' ',lomemmax+30000+memend-himemmin+2:1,
+ ' words of memory out of ',memend+30001:1);
+ writeln(logfile,' ',stcount:1,' symbolic tokens out of ',2100:1);
+ writeln(logfile,' ',maxinstack:1,'i,',intptr:1,'n,',maxroundingptr:1,
+ 'r,',maxparamstack:1,'p,',maxbufstack+1:1,'b stack positions out of ',
+ stacksize:1,'i,',maxinternal:1,'n,',maxwiggle:1,'r,',150:1,'p,',bufsize:
+ 1,'b');end[:1208];}
+ begin
+ {1206:}
+ if (gfprevptr > 0) or (internal[33] > 0) then begin {1207:}
+ rover := -29977;
+ mem[rover].hh.rh := 32767;
+ lomemmax := himemmin - 1;
+ if (lomemmax - rover) > 32767 then
+ lomemmax := 32767 + rover;
+ mem[rover].hh.lh := lomemmax - rover;
+ mem[rover + 1].hh.lh := rover;
+ mem[rover + 1].hh.rh := rover;
+ mem[lomemmax].hh.rh := -30000;
+ mem[lomemmax].hh.lh := -30000 {:1207}; {1124:}
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ tfmwidth[k] := sortin(tfmwidth[k]);
+ nw := skimp(255) + 1;
+ dimenhead[1] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(20) {:1124};
+ fixdesignsize;
+ fixchecksum;
+ if internal[33] > 0 then begin {1126:}
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmheight[k] = 0 then
+ tfmheight[k] := -29985
+ else
+ tfmheight[k] := sortin(tfmheight[k]);
+ nh := skimp(15) + 1;
+ dimenhead[2] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(21);
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmdepth[k] = 0 then
+ tfmdepth[k] := -29985
+ else
+ tfmdepth[k] := sortin(tfmdepth[k]);
+ nd := skimp(15) + 1;
+ dimenhead[3] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(22);
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmitalcorr[k] = 0 then
+ tfmitalcorr[k] := -29985
+ else
+ tfmitalcorr[k] := sortin(tfmitalcorr[k]);
+ ni := skimp(63) + 1;
+ dimenhead[4] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(23) {:1126}; {1134:}
+ if jobname = 0 then
+ openlogfile;
+ packjobname(901);
+ while not bopenout(tfmfile, nameoffile) do
+ promptfilename(902, 901);
+ metricfilename := bmakenamestring(tfmfile); {1135:}
+ k := headersize;
+ while headerbyte[k] < 0 do
+ k := k - 1;
+ lh := (k + 3) div 4;
+ if bc > ec then
+ bc := 1;
+ bwrite2bytes(tfmfile, (((((((((6 + lh) + ((ec - bc) + 1)) + nw) + nh) + nd) + ni) + nl) + nk) + ne) + np);
+ bwrite2bytes(tfmfile, lh);
+ bwrite2bytes(tfmfile, bc);
+ bwrite2bytes(tfmfile, ec);
+ bwrite2bytes(tfmfile, nw);
+ bwrite2bytes(tfmfile, nh);
+ bwrite2bytes(tfmfile, nd);
+ bwrite2bytes(tfmfile, ni);
+ bwrite2bytes(tfmfile, nl);
+ bwrite2bytes(tfmfile, nk);
+ bwrite2bytes(tfmfile, ne);
+ bwrite2bytes(tfmfile, np);
+ for k := 1 to 4 * lh do begin
+ if headerbyte[k] < 0 then
+ headerbyte[k] := 0;
+ bwritebyte(tfmfile, headerbyte[k])
+ end {:1135}; {1137:}
+ for k := bc to ec do
+ if not charexists[k] then
+ bwrite4bytes(tfmfile, 0)
+ else begin
+ bwritebyte(tfmfile, mem[tfmwidth[k]].hh.lh);
+ bwritebyte(tfmfile, (mem[tfmheight[k]].hh.lh * 16) + mem[tfmdepth[k]].hh.lh);
+ bwritebyte(tfmfile, (mem[tfmitalcorr[k]].hh.lh * 4) + chartag[k]);
+ bwritebyte(tfmfile, charremainder[k])
+ end {:1137}; {1138:}
+ tfmchanged := 0;
+ for k := 1 to 4 do begin
+ bwrite4bytes(tfmfile, 0);
+ p := dimenhead[k];
+ while p <> (-29981) do begin
+ bwrite4bytes(tfmfile, dimenout(mem[p + 1].int));
+ p := mem[p].hh.rh
+ end
+ end {:1138}; {1139:}
+ for k := 0 to nl - 1 do
+ tfmqqqq(ligkern[k]);
+ for k := 0 to nk - 1 do
+ bwrite4bytes(tfmfile, dimenout(kern[k])) {:1139};
+{1140:}
+ for k := 0 to ne - 1 do
+ tfmqqqq(exten[k]) {:1140}; {1141:}
+ for k := 1 to np do
+ if k = 1 then
+ if abs(param[1]) < 134217728 then
+ bwrite4bytes(tfmfile, param[1] * 16)
+ else begin
+ tfmchanged := tfmchanged + 1;
+ if param[1] > 0 then
+ bwrite4bytes(tfmfile, 2147483647)
+ else
+ bwrite4bytes(tfmfile, -2147483647)
+ end
+ else
+ bwrite4bytes(tfmfile, dimenout(param[k]));
+ if tfmchanged > 0 then begin
+ if tfmchanged = 1 then
+ printnl(904)
+ else begin
+ printnl(40);
+ printint(tfmchanged);
+ print(905)
+ end;
+ print(906)
+ end {:1141};
+{if internal[12]>0 then[1136:]begin writeln(logfile,' ');
+writeln(logfile,'(You used ',nw:1,'w,',nh:1,'h,',nd:1,'d,',ni:1,'i,',nl:
+1,'l,',nk:1,'k,',ne:1,'e,',np:1,'p metric file positions');
+writeln(logfile,' out of ','256w,16h,16d,64i,',ligtablesize:1,
+'l,256k,256e,',maxfontdimen:1,'p)');end[:1136];}
+ printnl(903);
+ print(metricfilename);
+ bclose(tfmfile) {:1134}
+ end;
+ if gfprevptr > 0 then begin {1182:}
+ begin
+ gfbuf[gfptr] := 248;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfprevptr);
+ gfprevptr := (gfoffset + gfptr) - 5;
+ gffour(internal[26] * 16);
+ for k := 1 to 4 do begin
+ gfbuf[gfptr] := headerbyte[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(internal[27]);
+ gffour(internal[28]);
+ gffour(gfminm);
+ gffour(gfmaxm);
+ gffour(gfminn);
+ gffour(gfmaxn);
+ for k := 0 to 255 do
+ if charexists[k] then begin
+ x := gfdx[k] div 65536;
+ if (((gfdy[k] = 0) and (x >= 0)) and (x < 256)) and (gfdx[k] = (x * 65536)) then begin
+ begin
+ gfbuf[gfptr] := 246;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := k;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 245;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := k;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfdx[k]);
+ gffour(gfdy[k])
+ end;
+ x := mem[tfmwidth[k] + 1].int;
+ if abs(x) > maxtfmdimen then
+ if x > 0 then
+ x := 16777215
+ else
+ x := -16777215
+ else
+ x := makescaled(x * 16, internal[26]);
+ gffour(x);
+ gffour(charptr[k])
+ end;
+ begin
+ gfbuf[gfptr] := 249;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfprevptr);
+ begin
+ gfbuf[gfptr] := 131;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ k := 4 + ((gfbufsize - gfptr) mod 4);
+ while k > 0 do begin
+ begin
+ gfbuf[gfptr] := 223;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ k := k - 1
+ end; {1156:}
+ if gflimit = halfbuf then
+ bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
+ if gfptr > 0 then
+ bwritebuf(gffile, gfbuf, 0, gfptr - 1) {:1156};
+ printnl(917);
+ print(outputfilename);
+ print(425);
+ printint(totalchars);
+ print(918);
+ if totalchars <> 1 then
+ printchar(115);
+ print(919);
+ printint(gfoffset + gfptr);
+ print(920);
+ bclose(gffile)
+ end {:1182}
+ end {:1206};
+ if jobname > 0 then begin
+ writeln(logfile);
+ aclose(logfile);
+ selector := selector - 2;
+ if selector = 1 then begin
+ printnl(929);
+ print(logname);
+ printchar(46)
+ end
+ end;
+ println;
+ if (editnamestart <> 0) and (interaction > 0) then
+ calledit(strpool[editnamestart], editnamelength, editline)
+ end; {:1205} {1209:}
+
+ procedure finalcleanup;
+ label
+ 10;
+ var
+ c: smallnumber;
+ begin
+ c := curmod;
+ if jobname = 0 then
+ openlogfile;
+ while condptr <> (-30000) do begin
+ printnl(930);
+ printcmdmod(2, curif);
+ if ifline <> 0 then begin
+ print(931);
+ printint(ifline)
+ end;
+ print(932);
+ ifline := mem[condptr + 1].int;
+ curif := mem[condptr].hh.b1;
+ condptr := mem[condptr].hh.rh
+ end;
+ if history <> 0 then
+ if (history = 1) or (interaction < 3) then
+ if selector = 3 then begin
+ selector := 1;
+ printnl(933);
+ selector := 3
+ end;
+ if c = 1 then begin {storebasefile;goto 10;}
+ printnl(934);
+ goto 10
+ end;
+ 10:
+ null
+ end; {:1209} {1210:}
+ {procedure initprim;begin[192:]primitive(280,40,1);
+ primitive(281,40,2);primitive(282,40,3);primitive(283,40,4);
+ primitive(284,40,5);primitive(285,40,6);primitive(286,40,7);
+ primitive(287,40,8);primitive(288,40,9);primitive(289,40,10);
+ primitive(290,40,11);primitive(291,40,12);primitive(292,40,13);
+ primitive(293,40,14);primitive(294,40,15);primitive(295,40,16);
+ primitive(296,40,17);primitive(297,40,18);primitive(298,40,19);
+ primitive(299,40,20);primitive(300,40,21);primitive(301,40,22);
+ primitive(302,40,23);primitive(303,40,24);primitive(304,40,25);
+ primitive(305,40,26);primitive(306,40,27);primitive(307,40,28);
+ primitive(308,40,29);primitive(309,40,30);primitive(310,40,31);
+ primitive(311,40,32);primitive(312,40,33);primitive(313,40,34);
+ primitive(314,40,35);primitive(315,40,36);primitive(316,40,37);
+ primitive(317,40,38);primitive(318,40,39);primitive(319,40,40);
+ [:192][211:]primitive(279,47,0);primitive(91,63,0);
+ eqtb[2232]:=eqtb[cursym];primitive(93,64,0);primitive(125,65,0);
+ primitive(123,46,0);primitive(58,78,0);eqtb[2234]:=eqtb[cursym];
+ primitive(329,77,0);primitive(44,79,0);primitive(59,80,0);
+ eqtb[2235]:=eqtb[cursym];primitive(92,7,0);primitive(330,18,0);
+ primitive(331,72,0);primitive(332,59,0);primitive(333,32,0);
+ bgloc:=cursym;primitive(334,57,0);primitive(335,19,0);
+ primitive(336,60,0);primitive(337,27,0);primitive(338,11,0);
+ primitive(323,81,0);eqtb[2239]:=eqtb[cursym];egloc:=cursym;
+ primitive(339,26,0);primitive(340,6,0);primitive(341,9,0);
+ primitive(342,70,0);primitive(343,73,0);primitive(344,13,0);
+ primitive(345,14,0);primitive(346,15,0);primitive(347,69,0);
+ primitive(348,28,0);primitive(349,24,0);primitive(350,12,0);
+ primitive(351,8,0);primitive(352,17,0);primitive(353,74,0);
+ primitive(354,35,0);primitive(355,58,0);primitive(356,71,0);
+ primitive(357,75,0);[:211][683:]primitive(520,16,1);primitive(521,16,2);
+ primitive(522,16,53);primitive(523,16,44);primitive(524,16,49);
+ primitive(324,16,0);eqtb[2237]:=eqtb[cursym];primitive(525,4,2242);
+ primitive(526,4,2392);primitive(527,4,1);primitive(325,4,0);
+ eqtb[2236]:=eqtb[cursym];[:683][688:]primitive(528,61,0);
+ primitive(529,61,1);primitive(64,61,2);primitive(530,61,3);
+ [:688][695:]primitive(541,56,2242);primitive(542,56,2392);
+ primitive(543,56,2542);primitive(544,56,1);primitive(545,56,2);
+ primitive(546,56,3);[:695][709:]primitive(556,3,0);primitive(482,3,1);
+ [:709][740:]primitive(583,1,1);primitive(322,2,2);
+ eqtb[2238]:=eqtb[cursym];primitive(584,2,3);primitive(585,2,4);
+ [:740][893:]primitive(218,33,30);primitive(219,33,31);
+ primitive(220,33,32);primitive(221,33,33);primitive(222,33,34);
+ primitive(223,33,35);primitive(224,33,36);primitive(225,33,37);
+ primitive(226,34,38);primitive(227,34,39);primitive(228,34,40);
+ primitive(229,34,41);primitive(230,34,42);primitive(231,34,43);
+ primitive(232,34,44);primitive(233,34,45);primitive(234,34,46);
+ primitive(235,34,47);primitive(236,34,48);primitive(237,34,49);
+ primitive(238,34,50);primitive(239,34,51);primitive(240,34,52);
+ primitive(241,34,53);primitive(242,34,54);primitive(243,34,55);
+ primitive(244,34,56);primitive(245,34,57);primitive(246,34,58);
+ primitive(247,34,59);primitive(248,34,60);primitive(249,34,61);
+ primitive(250,34,62);primitive(251,34,63);primitive(252,34,64);
+ primitive(253,34,65);primitive(254,34,66);primitive(255,34,67);
+ primitive(256,36,68);primitive(43,43,69);primitive(45,43,70);
+ primitive(42,55,71);primitive(47,54,72);eqtb[2233]:=eqtb[cursym];
+ primitive(257,45,73);primitive(181,45,74);primitive(259,52,76);
+ primitive(258,45,75);primitive(60,50,77);primitive(260,50,78);
+ primitive(62,50,79);primitive(261,50,80);primitive(61,51,81);
+ primitive(262,50,82);primitive(272,37,94);primitive(273,37,95);
+ primitive(274,37,96);primitive(275,37,97);primitive(276,37,98);
+ primitive(277,37,99);primitive(278,37,100);primitive(38,48,83);
+ primitive(263,55,84);primitive(264,55,85);primitive(265,55,86);
+ primitive(266,55,87);primitive(267,55,88);primitive(268,55,89);
+ primitive(269,55,90);primitive(270,55,91);primitive(271,45,92);
+ [:893][1013:]primitive(211,30,15);primitive(197,30,4);
+ primitive(195,30,2);primitive(202,30,9);primitive(199,30,6);
+ primitive(204,30,11);primitive(206,30,13);primitive(207,30,14);
+ [:1013][1018:]primitive(776,82,0);primitive(777,82,1);
+ [:1018][1024:]primitive(143,23,0);primitive(144,23,1);
+ primitive(145,23,2);primitive(783,23,3);
+ [:1024][1027:]primitive(784,21,0);primitive(785,21,1);
+ [:1027][1037:]primitive(799,22,0);primitive(800,22,1);
+ primitive(801,22,2);primitive(802,22,3);primitive(803,22,4);
+ [:1037][1052:]primitive(820,68,1);primitive(821,68,0);
+ primitive(822,68,2);primitive(823,66,6);primitive(824,66,16);
+ primitive(825,67,0);primitive(826,67,1);
+ [:1052][1079:]primitive(856,25,0);primitive(857,25,1);
+ primitive(858,25,2);[:1079][1101:]primitive(868,20,0);
+ primitive(869,20,1);primitive(870,20,2);primitive(871,20,3);
+ primitive(872,20,4);[:1101][1109:]primitive(889,76,0);
+ primitive(890,76,128);[:1109][1176:]primitive(912,29,4);
+ primitive(913,29,16);[:1176];end;procedure inittab;var k:integer;
+ begin[176:]rover:=-29977;mem[rover].hh.rh:=32767;mem[rover].hh.lh:=1000;
+ mem[rover+1].hh.lh:=rover;mem[rover+1].hh.rh:=rover;
+ lomemmax:=rover+1000;mem[lomemmax].hh.rh:=-30000;
+ mem[lomemmax].hh.lh:=-30000;
+ for k:=29998 to 30000 do mem[k]:=mem[lomemmax];avail:=-30000;
+ memend:=30000;himemmin:=29998;varused:=23;dynused:=-1;
+ [:176][193:]intname[1]:=280;intname[2]:=281;intname[3]:=282;
+ intname[4]:=283;intname[5]:=284;intname[6]:=285;intname[7]:=286;
+ intname[8]:=287;intname[9]:=288;intname[10]:=289;intname[11]:=290;
+ intname[12]:=291;intname[13]:=292;intname[14]:=293;intname[15]:=294;
+ intname[16]:=295;intname[17]:=296;intname[18]:=297;intname[19]:=298;
+ intname[20]:=299;intname[21]:=300;intname[22]:=301;intname[23]:=302;
+ intname[24]:=303;intname[25]:=304;intname[26]:=305;intname[27]:=306;
+ intname[28]:=307;intname[29]:=308;intname[30]:=309;intname[31]:=310;
+ intname[32]:=311;intname[33]:=312;intname[34]:=313;intname[35]:=314;
+ intname[36]:=315;intname[37]:=316;intname[38]:=317;intname[39]:=318;
+ intname[40]:=319;[:193][203:]hashused:=2229;stcount:=0;
+ hash[2240].rh:=321;hash[2238].rh:=322;hash[2239].rh:=323;
+ hash[2237].rh:=324;hash[2236].rh:=325;hash[2235].rh:=59;
+ hash[2234].rh:=58;hash[2233].rh:=47;hash[2232].rh:=91;hash[2231].rh:=41;
+ hash[2229].rh:=326;eqtb[2231].lh:=62;
+ [:203][229:]mem[-29981].hh.lh:=2242;mem[-29981].hh.rh:=-30000;
+ [:229][324:]mem[30000].hh.lh:=32767;
+ [:324][475:]mem[-29997].hh.lh:=-30000;mem[-29997].hh.rh:=-30000;
+ mem[-29996].hh.lh:=1;mem[-29996].hh.rh:=-30000;
+ for k:=-29995 to-29989 do mem[k]:=mem[-29996];mem[-29988].int:=0;
+ mem[-30000].hh.rh:=-30000;mem[-30000].hh.lh:=-30000;mem[-29999].int:=0;
+ mem[-29998].int:=0;[:475][587:]serialno:=0;mem[-29987].hh.rh:=-29987;
+ mem[-29986].hh.lh:=-29987;mem[-29987].hh.lh:=-30000;
+ mem[-29986].hh.rh:=-30000;[:587][702:]mem[-29979].hh.b1:=0;
+ mem[-29979].hh.rh:=2240;eqtb[2240].rh:=-29979;eqtb[2240].lh:=41;
+ [:702][759:]eqtb[2230].lh:=88;hash[2230].rh:=600;
+ [:759][911:]mem[-29983].hh.b1:=11;
+ [:911][1116:]mem[-29980].int:=1073741824;
+ [:1116][1127:]mem[-29984].int:=0;mem[-29985].hh.lh:=0;
+ [:1127][1185:]baseident:=921;[:1185]end;}
+{:1210}
+{1212:}
+{procedure debughelp;label 888,10;var k,l,m,n:integer;
+begin while true do begin;printnl(935);flush(output);read(input,m);
+if m<0 then goto 10 else if m=0 then begin goto 888;
+888:m:=0;
+['BREAKPOINT']
+end else begin read(input,n);case m of[1213:]1:printword(mem[n]);
+2:printint(mem[n].hh.lh);3:printint(mem[n].hh.rh);
+4:begin printint(eqtb[n].lh);printchar(58);printint(eqtb[n].rh);end;
+5:printvariablename(n);6:printint(internal[n]);7:doshowdependencies;
+9:showtokenlist(n,-30000,100000,0);10:print(n);11:checkmem(n>0);
+12:searchmem(n);13:begin read(input,l);printcmdmod(n,l);end;
+14:for k:=0 to n do print(buffer[k]);15:panicking:=not panicking;
+[:1213]others:print(63)end;end;end;10:end;}
+{:1212}
+{:1202}
+{1204:}
+
+begin
+{-----------------------------------}
+ init_ps(psfile);
+{-----------------------------------}
+ history := 3;
+ setpaths;
+ if readyalready = 314159 then
+ goto 1; {14:}
+ bad := 0;
+ if (halferrorline < 30) or (halferrorline > (errorline - 15)) then
+ bad := 1;
+ if maxprintline < 60 then
+ bad := 2;
+ if (gfbufsize mod 8) <> 0 then
+ bad := 3;
+ if (-28900) > 30000 then
+ bad := 4;
+ if 1777 > 2100 then
+ bad := 5;
+ if (headersize mod 4) <> 0 then
+ bad := 6; {:14} {154:}
+{if memmax<>30000 then bad:=10;}
+ if memmax < 30000 then
+ bad := 10;
+ if ((-128) > 0) or (127 < 127) then
+ bad := 11;
+ if ((-32768) > 0) or (32767 < 32767) then
+ bad := 12;
+ if ((-128) < (-32768)) or (127 > 32767) then
+ bad := 13;
+ if ((-30000) < (-32768)) or (memmax >= 32767) then
+ bad := 14;
+ if maxstrings > 32767 then
+ bad := 15;
+ if bufsize > 32767 then
+ bad := 16;
+ if (255 < 255) or (65535 < 65535) then
+ bad := 17; {:154} {204:}
+ if (2241 + maxinternal) > 32767 then
+ bad := 21; {:204} {214:}
+ if 2692 > 32767 then
+ bad := 22; {:214} {310:}
+ if (15 * 11) > bistacksize then
+ bad := 31; {:310} {553:}
+ if (20 + (17 * 45)) > bistacksize then
+ bad := 32; {:553} {777:}
+ if 10 > filenamesize then
+ bad := 41; {:777}
+ if bad > 0 then begin
+ writeln(output, 'Ouch---my internal constants have been clobbered!', '---case ', bad: 1);
+ {if not getstringsstarted then goto 9999;
+ inittab;initprim;}
+ goto 9999
+ end;
+ initialize;
+ readyalready := 314159;
+1: {55:}
+ selector := 1;
+ tally := 0;
+ termoffset := 0;
+ fileoffset := 0; {:55} {61:}
+ write(output, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
+ {-----------------------------------------------------------------}
+ writeln(output);
+ writeln(output,'*** embedded METAFONT to PostScript Compiler ***');
+ {-----------------------------------------------------------------}
+ if baseident = 0 then
+ writeln(output, ' (no base preloaded)')
+ else begin
+ print(baseident);
+ println
+ end;
+ flush(output); {:61} {783:}
+ jobname := 0; {:783}
+{792:}
+ outputfilename := 0; {:792} {1211:} {657:}
+ begin
+ begin
+ inputptr := 0;
+ maxinstack := 0;
+ inopen := 0;
+ maxbufstack := 0;
+ paramptr := 0;
+ maxparamstack := 0;
+ first := 1;
+ curinput.startfield := 1;
+ curinput.indexfield := 0;
+ line := 0;
+ curinput.namefield := 0;
+ forceeof := false;
+ if not initterminal then
+ goto 9999;
+ curinput.limitfield := last;
+ first := last + 1
+ end; {:657} {660:}
+ scannerstatus := 0; {:660}
+ if (baseident = 0) or (buffer[curinput.locfield] = 38) then begin
+ if baseident <> 0 then
+ initialize;
+ if not openbasefile then
+ goto 9999;
+ if not loadbasefile then begin
+ wclose(basefile);
+ goto 9999
+ end;
+ wclose(basefile);
+ while (curinput.locfield < curinput.limitfield) and (buffer[curinput.locfield] = 32) do
+ curinput.locfield := curinput.locfield + 1
+ end;
+ buffer[curinput.limitfield] := 37;
+ fixdateandtime;
+ initrandoms((internal[17] div 65536) + internal[16]); {70:}
+ if interaction = 0 then
+ selector := 0
+ else
+ selector := 1 {:70};
+ if curinput.locfield < curinput.limitfield then
+ if buffer[curinput.locfield] <> 92 then
+ startinput
+ end {:1211};
+ initstrptr := strptr;
+ initpoolptr := poolptr;
+ maxstrptr := strptr;
+ maxpoolptr := poolptr;
+ history := 0;
+ if startsym > 0 then begin
+ cursym := startsym;
+ backinput
+ end;
+ maincontrol;
+ finalcleanup;
+9998:
+ closefilesandtermina;
+9999:
+ readyalready := 0;
+{---------------------------------}
+tini_ps(g);
+{---------------------------------}
+ if (history <> 0) and (history <> 1) then
+ exit(1)
+ else
+ exit(0);
+end. {:1204}
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf_ext.h b/fonts/utilities/mf2ps/mf2ps/mf_ext.h
new file mode 100644
index 0000000000..a875583488
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf_ext.h
@@ -0,0 +1,54 @@
+{ $Header: mf_ext.h,v 1.0 86/01/31 16:42:56 richards Released $ }
+
+{ declarations for external C assist routines for MetaFont }
+
+procedure exit(x : integer);
+ external;
+
+procedure closea(var f:text);
+ external;
+
+procedure closew(var f:wordfile);
+ external;
+
+procedure dateandtime(var minutes, day, month, year : integer);
+ external;
+
+procedure setpaths;
+ external;
+
+function testaccess(var nameoffile, realnameoffile: UNIXfilename;
+ accessmode:integer; filepath:integer): boolean;
+ external;
+
+procedure calledit(var filename: ASCIIcode; fnlength, linenumber: integer);
+ external;
+
+function bopenout(var f: bytefile; var name: UNIXfilename): boolean;
+ external;
+
+procedure bclose(var f: bytefile);
+ external;
+
+procedure bgetname(var f: bytefile; var name: UNIXfilename);
+ external;
+
+procedure bwritebuf(var f: bytefile; var buf: gfbuftype;
+ first, last: integer);
+ external;
+
+procedure bwritebyte(var f: bytefile; b: integer);
+ external;
+
+procedure bwrite2bytes(var f: bytefile; b: integer);
+ external;
+
+procedure bwrite4bytes(var f: bytefile; b: integer);
+ external;
+
+function makefraction(p, q: integer): fraction;
+ external;
+
+function takefraction(q: integer; f: fraction): integer;
+ external;
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf_window.h b/fonts/utilities/mf2ps/mf2ps/mf_window.h
new file mode 100644
index 0000000000..761cf006c9
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf_window.h
@@ -0,0 +1,15 @@
+{ $Header: mf_window.h,v 0.999999 86/01/13 00:43:56 richards Released $ }
+
+{ External procedures for UNIX MetaFont VIRMF for display graphics }
+
+function initscreen: boolean;
+ external;
+
+procedure updatescreen;
+ external;
+
+procedure blankrectangle(leftcol, rightcol: screencol; toprow, botrow: screenrow);
+ external;
+
+procedure paintrow(r: screenrow; b: pixelcolor; var a: transspec; n: screencol);
+ external;
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/README b/fonts/utilities/mf2ps/mf2ps/uncompressing/README
new file mode 100644
index 0000000000..b7f9e732c4
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/README
@@ -0,0 +1,3 @@
+These are the versions of the modules that did not apply the compression
+in which commands are made single letters and all non-first commands
+are made relative rather than absolute
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p
new file mode 100644
index 0000000000..f5e4ac033a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p
@@ -0,0 +1,95 @@
+#include "mf2ps1.h" {contain the declarations}
+#include "mf2ps2.h" {contain external for send_p_s}
+
+procedure unskew;
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x + y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y;
+ cury := x + y
+ end;
+ 6:
+ begin
+ curx := -y;
+ cury := x + y
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) - y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := -y;
+ cury := (-x) - y
+ end;
+ 7:
+ begin
+ curx := y;
+ cury := (-x) - y
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+end; { unskew }
+{:388}
+ {473:}
+
+procedure sendcurve;
+{ unskews the values and sends a curve to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ unskew(x2,y2,octant);
+ x2s := curx;
+ y2s := cury;
+ unskew(x3,y3,octant);
+ x3s := curx;
+ y3s := cury;
+ curx := tmpx;
+ cury := tmpy;
+ send_p_s(x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s);
+end;
+
+procedure sendline;
+{ unskews the values and sends a line to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ if (LineSource = 510)
+ or (LineSource = 515)
+ or (LineSource = 521)
+ then send_p_s(x0s,y0s,x1s,y1s,0,0,0,0);
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p
new file mode 100644
index 0000000000..4b12b0f593
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p
@@ -0,0 +1,117 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+
+function ok (x,y : real):boolean;
+{ gives back true if direction is kept by x,y values }
+begin
+ if direction = 'h' then
+ if x = lastx3 then ok := true
+ else ok := false
+ else if direction = 'v' then
+ if y = lasty3 then ok := true
+ else ok := false
+ else ok := false;
+end;
+
+procedure restore (x,y : real);
+{ kepps direction, if dealing with lines and last point values
+ for optimaztion on vertical and horizontal lines. }
+begin
+ if x = lastx3 then direction := 'h'
+ else if y = lasty3 then direction := 'v'
+ else direction := 'm';
+ lastx3 := x;
+ lasty3 := y;
+ lastwasline := true;
+end;
+
+procedure recall;
+{ taking values from the buffer. }
+begin
+ writeln(psfile,lastx3:6:0,lasty3:6:0,' lineto@');
+ lastwasline := false;
+end;
+
+
+function us(n: scaled;c:char): real;
+{ gets a number which every unit of it is 2 in the 16 power
+ and changes it to normal units.
+ in addition scales and transforms the number in order to
+ use it in PostScript dictionary.
+ it is also determining the bounding box. }
+const s = 2; { Scale & Translate before sending to PostScript file }
+ t = 180;
+var tmp : real;
+begin
+ tmp := trunc(n/65536)*s+t;
+ us := tmp;
+ if (c = 'x') and (tmp <> t) then
+ begin
+ if tmp>maxbox[x] then maxbox[x] := tmp
+ else if tmp<minbox[x] then minbox[x] := tmp;
+ if tmp>lmax_x then lmax_x := tmp
+ else if tmp<lmin_x then lmin_x := tmp;
+ end
+ else if tmp>maxbox[y] then maxbox[y] := tmp
+ else if tmp<minbox[y] then minbox[y] := tmp;
+end; { unscaled }
+
+
+procedure send_p_s;
+{ creates the PostScript file, by sending lines and curves,
+ using the optimization ability on lines. }
+var x0_,x1_,x2_,x3_,y0_,y1_,y2_,y3_:real;
+begin
+ x0_ := us(x0,'x');
+ x1_ := us(x1,'x');
+ x2_ := us(x2,'x');
+ x3_ := us(x3,'x');
+ y0_ := us(y0,'y');
+ y1_ := us(y1,'y');
+ y2_ := us(y2,'y');
+ y3_ := us(y3,'y');
+
+ if (x0_<>lastx0) or (y0_<>lasty0) then
+ begin
+ if new then
+ begin
+ writeln(psfile,x0_:6:0,y0_:6:0,' moveto@');
+ new := false;
+ lastwasline := false;
+ lastx3 := x0_; lasty3 := y0_;
+ end
+ else begin
+ if (lastwasline) and (not ok(x0_,y0_)) then recall;
+ restore(x0_,y0_);
+ end;
+ end;
+ if (x3=0) and (x2=0) and (y3=0) and (y2=0) then { line }
+ begin
+ if (x0_<>x1_) or (y0_<>y1_) then
+ begin
+ if (lastwasline) and (not ok(x1_,y1_)) then recall;
+ restore(x1_,y1_);
+ end;
+ lastx0 := x1_; lasty0 := y1_;
+ end
+ else begin
+ if ((x0_=x1_) and (x1_=x2_) and (x2_=x3_)) or
+ ((y0_=y1_) and (y1_=y2_) and (y2_=y3_)) then
+ begin
+ if (x0_<>x3_) or (y0_<>y3_) then
+ begin
+ if (lastwasline) and (not ok(x3_,y3_)) then recall;
+ restore(x3_,y3_);
+ end;
+ end
+ else begin
+ if lastwasline then recall;
+ writeln(psfile,x1_:6:0,y1_:6:0,x2_:6:0,y2_:6:0,x3_:6:0,y3_:6:0,' curveto@');
+ lastx3 := x3_; lasty3 := y3_;
+ end;
+ lastx0 := x3_; lasty0 := y3_;
+ end; { else curve }
+end; { send_p_s }
+
+
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p
new file mode 100644
index 0000000000..324fac33fd
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p
@@ -0,0 +1,649 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+ procedure makemoves;
+ label
+ 22, 30, 10;
+ var
+ x1, x2, x3, m, r, y1, y2, y3, n, s, l: integer;
+ q, t, u, x2a, x3a, y2a, y3a: integer;
+ begin
+ {---------------------------------------------------------}
+ if (CurveSource=465) { from fillspec - no offset }
+ or (CurveSource=512) { from fillenvelope - with offset }
+ or (CurveSource=518) { -------- " -------- }
+ then
+ sendcurve(xx0,xx1,xx2,xx3,yy0,yy1,yy2,yy3,oc);
+ {---------------------------------------------------------}
+ if (xx3 < xx0) or (yy3 < yy0) then
+ confusion(109);
+ l := 16;
+ bisectptr := 0;
+ x1 := xx1 - xx0;
+ x2 := xx2 - xx1;
+ x3 := xx3 - xx2;
+ if xx0 >= xicorr then
+ r := (xx0 - xicorr) mod 65536
+ else
+ r := 65535 - ((((-xx0) + xicorr) - 1) mod 65536);
+ m := ((xx3 - xx0) + r) div 65536;
+ y1 := yy1 - yy0;
+ y2 := yy2 - yy1;
+ y3 := yy3 - yy2;
+ if yy0 >= etacorr then
+ s := (yy0 - etacorr) mod 65536
+ else
+ s := 65535 - ((((-yy0) + etacorr) - 1) mod 65536);
+ n := ((yy3 - yy0) + s) div 65536;
+ if ((xx3 - xx0) >= 268435456) or ((yy3 - yy0) >= 268435456) then begin {313:}
+ x1 := (x1 + xicorr) div 2;
+ x2 := (x2 + xicorr) div 2;
+ x3 := (x3 + xicorr) div 2;
+ r := (r + xicorr) div 2;
+ y1 := (y1 + etacorr) div 2;
+ y2 := (y2 + etacorr) div 2;
+ y3 := (y3 + etacorr) div 2;
+ s := (s + etacorr) div 2;
+ l := 15
+ end {:313};
+ while true do begin
+ 22: {314:}
+ if m = 0 then {315:}
+ while n > 0 do begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 1;
+ n := n - 1
+ end {:315}
+ else if n = 0 then {316:}
+ move[moveptr] := move[moveptr] + m {:316}
+ else if (m + n) = 2 then begin {317:}
+ r := twotothe[l] - r;
+ s := twotothe[l] - s;
+ while l < 30 do begin
+ x3a := x3;
+ x2a := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + x2a) + xicorr) div 2;
+ t := (x1 + x2) + x3;
+ r := (r + r) - xicorr;
+ y3a := y3;
+ y2a := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + y2a) + etacorr) div 2;
+ u := (y1 + y2) + y3;
+ s := (s + s) - etacorr;
+ if t < r then
+ if u < s then begin {318:}
+ x1 := x3;
+ x2 := x2a;
+ x3 := x3a;
+ r := r - t;
+ y1 := y3;
+ y2 := y2a;
+ y3 := y3a;
+ s := s - u
+ end else begin {:318} {320:}
+ begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ goto 30
+ end
+ else if u < s then begin {319:}
+ begin
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end {:319};
+ goto 30
+ end;
+ l := l + 1
+ end;
+ r := r - xicorr;
+ s := s - etacorr;
+ if (abvscd((x1 + x2) + x3, s, (y1 + y2) + y3, r) - xicorr) >= 0 then begin {319:}
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end else begin {:319} {320:}
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ 30: {:317}
+ null
+ end else begin
+ l := l + 1;
+ bisectstack[bisectptr + 10] := l;
+ bisectstack[bisectptr + 2] := x3;
+ bisectstack[bisectptr + 1] := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + bisectstack[bisectptr + 1]) + xicorr) div 2;
+ bisectstack[bisectptr] := x3;
+ r := (r + r) + xicorr;
+ t := ((x1 + x2) + x3) + r;
+ q := t div twotothe[l];
+ bisectstack[bisectptr + 3] := t mod twotothe[l];
+ bisectstack[bisectptr + 4] := m - q;
+ m := q;
+ bisectstack[bisectptr + 7] := y3;
+ bisectstack[bisectptr + 6] := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + bisectstack[bisectptr + 6]) + etacorr) div 2;
+ bisectstack[bisectptr + 5] := y3;
+ s := (s + s) + etacorr;
+ u := ((y1 + y2) + y3) + s;
+ q := u div twotothe[l];
+ bisectstack[bisectptr + 8] := u mod twotothe[l];
+ bisectstack[bisectptr + 9] := n - q;
+ n := q;
+ bisectptr := bisectptr + 11;
+ goto 22
+ end {:314};
+ if bisectptr = 0 then
+ goto 10; {312:}
+ bisectptr := bisectptr - 11;
+ x1 := bisectstack[bisectptr];
+ x2 := bisectstack[bisectptr + 1];
+ x3 := bisectstack[bisectptr + 2];
+ r := bisectstack[bisectptr + 3];
+ m := bisectstack[bisectptr + 4];
+ y1 := bisectstack[bisectptr + 5];
+ y2 := bisectstack[bisectptr + 6];
+ y3 := bisectstack[bisectptr + 7];
+ s := bisectstack[bisectptr + 8];
+ n := bisectstack[bisectptr + 9];
+ l := bisectstack[bisectptr + 10] {:312}
+ end;
+ 10:
+ null
+ end; {:311} {321:}
+
+
+ procedure dump(var f,g:text;ignore:boolean;addy:integer);
+ { dumps file named f to file named g. if ignore=true
+ then @ sign won't be copied to g.
+ addy=1, means this is "erase" path lower than 300
+ so 0.5 is subtracted from all y-s. if addy=2 it is
+ higher than 300, and 0.5 is added. }
+ var c : char;
+ even_n : boolean;
+ begin
+ reset(f);
+ while not eof(f) do
+ begin
+ even_n := true;
+ read(f,c);
+ case c of
+ ' ' : repeat
+ while c = ' ' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ even_n := not even_n;
+ while (c<>' ') and (c<>'@') do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ if even_n then
+ if addy = 2 then write(g,' 0.5 add')
+ else if addy = 1 then write(g,' 0.5 sub');
+ until c = '@';
+ otherwise while c<>'@' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ end; (* case *)
+ readln(f);
+ if ignore then writeln(g)
+ else writeln(g,'@');
+ end;
+ end;
+
+ function checkerase(var efile:text) : integer;
+ { this function checks files that contains "erase" paths.
+ if the path is higher than 300 its value is 2 else 1.
+ this value goes to 'dump' procedure, to determine if
+ 0.5 should be added or substracted. }
+ const limit = 300;
+ var no : real;
+ c : char;
+ begin
+ reset(efile);
+ checkerase := 1;
+ while not eof(efile) do
+ begin
+ read(efile,c);
+ case c of
+ ' ' : begin
+ read(efile,no);
+ read(efile,no);
+ if no > limit then checkerase := 2;
+ end;
+ otherwise ;
+ end;
+ readln(efile);
+ end;
+ end;
+
+
+ procedure doarrange(var f,g:text);
+ { gets file named f whose "fill" and "stroke" paths are mixed
+ together with "erase" paths, and gives back file named g
+ which has "erase" paths on top in order to determine the
+ clip path, and afterward the rest paths. }
+ var c : char;
+ tmp,fills : text;
+ erase_top : integer;
+
+ begin
+ if not erasein then begin
+ writeln(g,'newpath');
+ dump(f,g,true,0);
+ end
+ else begin
+ rewrite(fills);
+ writeln(g,'gsave');
+ writeln(g,'initclip');
+ writeln(g,'newpath');
+ writeln(g,'0 0 moveto');
+ writeln(g,'0 1000 lineto');
+ writeln(g,'1000 1000 lineto');
+ writeln(g,'1000 0 lineto');
+ writeln(g,'0 0 lineto');
+ rewrite(tmp);
+ reset(f);
+ while not eof(f) do
+ begin
+ read(f,c);
+ while (c<>'*') and (c<>'f') and (c<>'e') do
+ begin
+ while c<>'@' do
+ begin
+ write(tmp,c);
+ read(f,c);
+ end;
+ readln(f);
+ writeln(tmp,'@');
+ read(f,c);
+ end;
+ case c of
+ '*' : begin
+ erase_top := checkerase(tmp);
+ dump(tmp,g,true,erase_top);
+ writeln(g,'%erase');
+ end;
+ 'f' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'fill@');
+ end;
+ 'e' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'eofill@');
+ end;
+ end;
+ rewrite(tmp);
+ readln(f);
+ end;
+ writeln(g,'eoclip');
+ writeln(g,'newpath');
+ dump(fills,g,true,0);
+ writeln(g,'grestore');
+ end;
+ end;
+
+
+
+ procedure print_start;
+ { print_start is called when a new cyclic path is identified.
+ it checks if drawing status was kept, else it changes it
+ respectively. the values are changed when getting into
+ another drawing macro.
+ it is also resets values of lastx0 lasty0 for not being
+ horizonable, because we need a 'moveto' move in the
+ PostScript file in the beginning of the new path. }
+ begin
+ if (internal[14]<>lastyearval) or
+ (internal[15]<>lastmonthval) then
+ begin
+ if lastyearval<>internal[14] then
+ begin
+ if internal[14] = -65536 then
+ begin
+ writeln(f,'eofill@');
+ lastfill := 's';
+ end
+ else begin
+ writeln(f,'*erase@');
+ lastfill := 'e';
+ erasein := true;
+ end;
+ internal[14] := lastyearval ;
+ end
+ else begin
+ internal[15] := lastmonthval ;
+ if lastfill <> 'i' then writeln(f,'fill@');
+ lastfill := 'f';
+ end;
+ end;
+
+ writeln(f,'%new path@');
+ new := true;
+ lastx0 := -99999999; lasty0 := -99999999; { unhorizonable values }
+ end;
+
+ procedure print_end;
+ { print_end is called when end of cyclic path is identified.
+ it takes out the buffer values which were kept there for
+ optimization purposes.
+ In addition it writes 'closepath' in order to close
+ the current cyclic path. }
+ begin
+ if lastwasline then
+ writeln(f,lastx3:6:0,lasty3:6:0,' lineto@');
+ if not new then
+ writeln(f,'closepath@');
+ writeln(f,'%end path@');
+ end;
+
+ procedure init_ps;
+ { this procedure is called, right after entering the main loop
+ in METAFONT, and this is the place to give initial values
+ to variables, to open new files and ... to ask questions }
+ var i:integer;
+ begin
+ rewrite(f);
+ no_of_letter := 0;
+ ascii_on := false;
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ foundnew := false; { for new letter defs }
+ minbox[x] := 9999; { initial min. value of x }
+ minbox[y] := 9999; { -----"------- y }
+ maxbox[x] := -9999; { initial max. value of x }
+ maxbox[y] := -9999; { -----"------- y }
+
+ write('Enter name of OUTPUT file: ');
+ i := 1;
+ while not eoln do
+ begin
+ read(fout[i]);
+ i := i+1;
+ end;
+ readln;
+ writeln;
+ write('Are you creating the whole dictionary (y/n) ?');
+ readln(ans);
+ if (ans='y') or (ans='Y') then dict := 1 else dict := 0;
+ writeln;
+ rewrite(g,fout);
+ if dict = 1 then
+ begin
+ writeln(g,'%! Simon font');
+ writeln(g,'%0 serverdict begin exitserver');
+ writeln(g,'/TBuildCharDict 10 dict def');
+ writeln(g,'/SimonFont 10 dict def');
+ writeln(g,'/fudge 110 def');
+ writeln(g,'SimonFont begin');
+ writeln(g,'%%');
+ writeln(g,' /FontType 3 def');
+ writeln(g,' /FontMatrix [0.001 0 0 0.001 0 0] def');
+ writeln(g,' /Encoding 256 array def');
+ writeln(g);
+ writeln(g,' 0 1 255 {Encoding exch /.notdef put} for');
+ writeln(g);
+ writeln(g,'% Character definitions');
+ writeln(g);
+ writeln(g,'/Metrics 130 dict def');
+ writeln(g);
+ writeln(g,'/CharDefs 130 dict def');
+ writeln(g,' ');
+ writeln(g,'CharDefs begin');
+ writeln(g);
+ writeln(g,'/.notdef');
+ writeln(g,' () def');
+ writeln(g);
+ end;
+ end;
+
+
+ procedure makenewdef;
+ { in case of several letters proccessing, while start
+ working on a new letter a few initials should be done }
+ var i : integer;
+ begin
+ rewrite(psfile);
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ if dict = 1 then
+ begin
+ lmin_x := 9999;
+ lmax_x := -9999;
+ writeln(g);
+ write(g,'/');
+ for i := 1 to ord(curletter[0]) do
+ if curletter[i]<>' ' then write(g,curletter[i])
+ else write(g,'_');
+ writeln(g);
+ writeln(g,'(');
+ end;
+ end;
+
+
+ procedure closeolddef(sub_n:integer);
+ { after one letter proccessing is finished, it gives the
+ last path the right kind of filling, and then call to
+ doarrange in order to make some order! }
+ begin
+ if internal[15] <> lastmonthval then
+ begin
+ writeln(psfile,'fill@');
+ internal[15] := lastmonthval;
+ end
+ else if internal[14] <> lastyearval then
+ begin
+ if internal[14] = -65536 then writeln(psfile,'eofill@')
+ else begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ internal[14] := lastyearval
+ end
+ else case lastfill of
+ 'e' : begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ 's' : writeln(psfile,'eofill@');
+ 'f','i' : writeln(psfile,'fill@');
+ end;
+ doarrange(psfile,g);
+ if dict = 1 then
+ begin
+ writeln(g,') def');
+ all_metrics[no_of_letter-sub_n] := trunc(lmax_x) + 1;
+ end;
+ end;
+
+
+ procedure tini_ps;
+ { prepares to leave... closing the last path, and in case
+ of creating a dictionary, entering all the necessary
+ information needed by the Postscript program }
+ const lowlimit = 50; { if need transform do it to }
+ highlimit = 900; { the box [50,50,900,900] }
+ fix2one = 1.3; { correction to one point size }
+ var j,jj : integer;
+ c_l : currentletter;
+ begin
+ closeolddef(0);
+ if dict = 1 then
+ begin
+ if (minbox[x] < 0) or (minbox[y] < 0) or
+ (maxbox[x] > 1000) or (maxbox[y] > 1000)
+ then begin
+ needtransform := true;
+ doscale[x] := ((highlimit-lowlimit)/(maxbox[x]-minbox[x]))/fix2one;
+ dotranslate[x] := lowlimit - minbox[x]*doscale[x];
+ doscale[y] := ((highlimit-lowlimit)/(maxbox[y]-minbox[y]))/fix2one;
+ dotranslate[y] := lowlimit - minbox[y]*doscale[y];
+ end
+ else needtransform := false;
+ writeln(f);
+ writeln(f,'end % of CharDefs dictionary');
+ writeln(f);
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'Encoding ',all_ascii[j],' /');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ writeln(f,' put');
+ end;
+ writeln(f);
+ writeln(f,'Metrics');
+ writeln(f,' begin');
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'/');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ if needtransform then writeln(f,' 1000 def')
+ else writeln(f,' ',all_metrics[j]-minbox[x]:3:0,' fudge add def');
+ end;
+ writeln(f,'/.notdef 0 def');
+ writeln(f,' end');
+ writeln(f);
+ writeln(f,' /BuildChar');
+ writeln(f,' { TBuildCharDict begin');
+ writeln(f,' %%');
+ writeln(f,' /char exch def');
+ writeln(f,' /fontdict exch def');
+ writeln(f);
+ writeln(f,' /charname fontdict /Encoding get');
+ writeln(f,' char get def');
+ writeln(f,' %%');
+ writeln(f,' /charproc fontdict /CharDefs get');
+ writeln(f,' charname get def');
+ writeln(f,' ');
+ writeln(f,' /charwdth fontdict /Metrics get charname get def');
+ writeln(f,' %%');
+ writeln(f,' gsave');
+ writeln(f,' ',fix2one:3:1,fix2one:10:1,' scale');
+ writeln(f,' 0.2 setflat');
+ writeln(f,' 0.2 setlinewidth');
+ writeln(f,' charwdth 0');
+ writeln(f,' 0 -180');
+ writeln(f,' charwdth 1000');
+ writeln(f,' setcachedevice');
+ if needtransform then
+ begin
+ writeln(f,' ',doscale[x]:7:3,doscale[y]:11:3,' scale');
+ writeln(f,' ',dotranslate[x]:7:3,dotranslate[y]:11:3,' translate');
+ end
+ else writeln(f,' -',minbox[x]:3:0,' fudge add 0 translate');
+ writeln(f,' charproc cvx exec');
+ writeln(f,' grestore');
+ writeln(f,' end');
+ writeln(f,' } def');
+ if needtransform then writeln(f,' /FontBBox [0 0 1000 1000] def')
+ else writeln(f,' /FontBBox [',minbox[x]:3:0,' fudge sub ',minbox[y]:3:0,' ',maxbox[x]:3:0,' ',maxbox[y]:3:0,'] def');
+ writeln(f);
+ writeln(f,' end ');
+ writeln(f);
+ writeln(f,' /Simon SimonFont definefont pop');
+ writeln(f);
+ writeln(f,' /Simon findfont 10 scalefont setfont');
+ writeln(f,' 100 210 moveto () show');
+ writeln(f,' showpage');
+ end;
+ end;
+
+
+
+ procedure auxprintchar(s: ASCIIcode);
+ { puts in string a character whose ascii is s }
+ begin
+ curletter[name_length] := xchr[s];
+ end;
+
+
+ procedure auxprint(s: integer);
+ { equivalent to METAFONT's print, accept changing global
+ variables, and writing is done into a local string.
+ it is also counts the string's length }
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ name_length := name_length + 1;
+ auxprintchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+
+ procedure auxslowprint;
+ { equivalent to METAFONT's slowprint, accept changing
+ global variables. }
+ var
+ j: poolpointer;
+ begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ auxprint(strpool[j]);
+ j := j + 1
+ end;
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+ end; {:60}
+{62:}
+
+
+procedure auxprintnl;
+begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ auxprint(s);
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+end; {:62} {63:}
+
+
+procedure sendascii;
+{ puts in array of ascii values the ascii of letter whose
+ number is no_of_letter. }
+begin
+ all_ascii[no_of_letter] := asc;
+end;
diff --git a/fonts/utilities/mf2pt3/mf2pt3.html b/fonts/utilities/mf2pt3/mf2pt3.html
new file mode 100644
index 0000000000..49da72d433
--- /dev/null
+++ b/fonts/utilities/mf2pt3/mf2pt3.html
@@ -0,0 +1,577 @@
+<html><head><title>mf2pt3.nw</title></head><body><b>mf2pt3</b> (c) Copyright 1998 Apostolos Syropoulos
+<code>apostolo@obelix.ee.duth.gr</code> <p>
+This is program <code>mf2pt3</code> a Perl script that generates a PostScript
+<a name="NWD1">T</a>ype 3 font that corresponds to a METAFONT font description. In order
+to achieve its goal the program utilizes another program: mfplain
+(METAPOST with the mfplain base preloaded). This program generates EPSF
+files for each character. This document assumes that the reader is
+familiar with the Type 3 font terminology and its structure. For
+more information one should consult the ``PostScript User Manual'',
+or any good book on PostScript like ``Postscript by Example'',
+by Henry McGilton and Mary Campione, published by Addison-Wesley Pub Co.
+
+<a name="NWD2">W</a>e now describe the way the program operates. First of all, we
+generate for each character of a METAFONT font an EPSF file. Next
+we collect the <code>BoundingBox</code> information for each character, as this
+piece of information is vital to the construction of the Type 3 font.
+Now we can proceed with the construction of the font. Finally, we
+delete some unnecessary files and we output the line the user must
+add to his/her <code>psfonts.map</code> file in order to use the Type 3 font
+when he/she creates a PostScript file from a DVI file.
+
+<pre><a name="NWmf29-*-1" href="#NWD2"><dfn>&lt;*&gt;=</dfn></a>
+#!/usr/bin/perl
+#
+#(c) Copyright 1998 Apostolos Syropoulos
+# apostolo@obelix.ee.duth.gr
+#
+<a name="NWmf29-*-1-u1" href="#NWD3"><i>&lt;Initialization of constants&gt;</i></a>
+<a name="NWmf29-*-1-u2" href="#NWD8"><i>&lt;Command line argument handling&gt;</i></a>
+<a name="NWmf29-*-1-u3" href="#NWDD"><i>&lt;Generation of EPSF files&gt;</i></a>
+<a name="NWmf29-*-1-u4" href="#NWDE"><i>&lt;Construction of Type 3 font&gt;</i></a>
+<a name="NWmf29-*-1-u5" href="#NWDO"><i>&lt;Delete unnecessary files&gt;</i></a>
+print &quot;\n$MFfile $MFfile &lt;$MFfile.pt3\n&quot;;
+
+</pre><blockquote>This code is written to a file (or else not used).<p></blockquote><p><a name="NWD3">S</a>ince we don't know on what system the program will be used, we
+must make sure it calls the GhostScript and METAPOST programs in the proper
+way. Moreover, we supply to each command the proper command line switches.
+The magnification is set to 100 as the usual design size is 10 pt.
+The <code>BoundingBox</code> information are kept in a compact format in an array.
+
+<pre><a name="NWmf29-IniR-1" href="#NWD3"><dfn>&lt;Initialization of constants&gt;=</dfn></a>
+ $mfplain=&quot;mfplain \'\\mode=localfont; \\batchmode; &quot;;
+ <a name="NWmf29-IniR-1-u1" href="#NWD4"><i>&lt;BoundingBox initialization&gt;</i></a>
+ <a name="NWmf29-IniR-1-u2" href="#NWD5"><i>&lt;Encoding array initialization&gt;</i></a>
+
+</pre><blockquote>Used <a href="#NWD2">above</a>.<p>
+</blockquote><p><a name="NWmf29-IniR-1-u2">S</a>ince Perl does not provide record structures, we use the <code>pack</code>
+<a name="NWD4">f</a>unction to create a structure which will contain the <code>BoundingBox</code>
+information. Each <code>BoundingBox</code> corresponds to four numbers: <code>llx</code>,
+<code>lly</code>, <code>urx</code>, and <code>ury</code>. If any of the 256 character slots is
+undefined each of these four numbers is set to zero. For efficiency reasons
+each <code>BoundingBox</code> structure contains one more piece of information--- an
+ASCII character, which indicates whether the corresponding character is
+defined ("d") or undefined ("u"). All the <code>BoundingBox</code> information are
+kept in an array which is assumed to contain only undefined characters.
+
+<pre><a name="NWmf29-BouQ-1" href="#NWD4"><dfn>&lt;BoundingBox initialization&gt;=</dfn></a>
+$notdef=pack(&quot;ai4&quot;,&quot;u&quot;,0,0,0,0);
+for($i=0; $i&lt;=255; $i++){ $BoundingBox[$i]=$notdef }
+
+</pre><blockquote>Used <a href="#NWD3">above</a>.<p>
+</blockquote><p><a name="NWD5">T</a>he encoding vector is a vital part of a PostScript font. The internal
+name of each character is completely irrelevant to the final output. So,
+someone can choose any name it pleases him.
+
+<pre><a name="NWmf29-EncT-1" href="#NWD5"><dfn>&lt;Encoding array initialization&gt;=</dfn></a>
+@Encoding = (&quot;/_a0&quot;, &quot;/_a1&quot;, &quot;/_a2&quot;, &quot;/_a3&quot;, &quot;/_a4&quot;,
+ &quot;/_a5&quot;, &quot;/_a6&quot;, &quot;/_a7&quot;, &quot;/_a8&quot;,
+ &quot;/_a9&quot;, &quot;/_a10&quot;, &quot;/_a11&quot;, &quot;/_a12&quot;,
+ &quot;/_a13&quot;, &quot;/_a14&quot;, &quot;/_a15&quot;, &quot;/_a16&quot;,
+ &quot;/_a17&quot;, &quot;/_a18&quot;, &quot;/_a19&quot;, &quot;/_a20&quot;,
+ &quot;/_a21&quot;, &quot;/_a22&quot;, &quot;/_a23&quot;, &quot;/_a24&quot;,
+ &quot;/_a25&quot;, &quot;/_a26&quot;, &quot;/_a27&quot;, &quot;/_a28&quot;,
+ &quot;/_a29&quot;, &quot;/_a30&quot;, &quot;/_a31&quot;, &quot;/_a32&quot;,
+ &quot;/_a33&quot;, &quot;/_a34&quot;, &quot;/_a35&quot;, &quot;/_a36&quot;,
+ &quot;/_a37&quot;, &quot;/_a38&quot;, &quot;/_a39&quot;, &quot;/_a40&quot;,
+ &quot;/_a41&quot;, &quot;/_a42&quot;, &quot;/_a43&quot;, &quot;/_a44&quot;,
+ &quot;/_a45&quot;, &quot;/_a46&quot;, &quot;/_a47&quot;, &quot;/_a48&quot;,
+ &quot;/_a49&quot;, &quot;/_a50&quot;, &quot;/_a51&quot;, &quot;/_a52&quot;,
+ &quot;/_a53&quot;, &quot;/_a54&quot;, &quot;/_a55&quot;, &quot;/_a56&quot;,
+ &quot;/_a57&quot;, &quot;/_a58&quot;, &quot;/_a59&quot;, &quot;/_a60&quot;,
+ &quot;/_a61&quot;, &quot;/_a62&quot;, &quot;/_a63&quot;, &quot;/_a64&quot;,
+ &quot;/_a65&quot;, &quot;/_a66&quot;, &quot;/_a67&quot;, &quot;/_a68&quot;,
+ &quot;/_a69&quot;, &quot;/_a70&quot;, &quot;/_a71&quot;, &quot;/_a72&quot;,
+ &quot;/_a73&quot;, &quot;/_a74&quot;, &quot;/_a75&quot;, &quot;/_a76&quot;,
+ &quot;/_a77&quot;, &quot;/_a78&quot;, &quot;/_a79&quot;, &quot;/_a80&quot;,
+ &quot;/_a81&quot;, &quot;/_a82&quot;, &quot;/_a83&quot;, &quot;/_a84&quot;,
+ &quot;/_a85&quot;, &quot;/_a86&quot;, &quot;/_a87&quot;, &quot;/_a88&quot;,
+ &quot;/_a89&quot;, &quot;/_a90&quot;, &quot;/_a91&quot;, &quot;/_a92&quot;,
+ &quot;/_a93&quot;, &quot;/_a94&quot;, &quot;/_a95&quot;, &quot;/_a96&quot;,
+ &quot;/_a97&quot;, &quot;/_a98&quot;, &quot;/_a99&quot;, &quot;/_a100&quot;,
+ &quot;/_a101&quot;, &quot;/_a102&quot;, &quot;/_a103&quot;, &quot;/_a104&quot;,
+ &quot;/_a105&quot;, &quot;/_a106&quot;, &quot;/_a107&quot;, &quot;/_a108&quot;,
+ &quot;/_a109&quot;, &quot;/_a110&quot;, &quot;/_a111&quot;, &quot;/_a112&quot;,
+ &quot;/_a113&quot;, &quot;/_a114&quot;, &quot;/_a115&quot;, &quot;/_a116&quot;,
+ &quot;/_a117&quot;, &quot;/_a118&quot;, &quot;/_a119&quot;, &quot;/_a120&quot;,
+ &quot;/_a121&quot;, &quot;/_a122&quot;, &quot;/_a123&quot;, &quot;/_a124&quot;,
+ &quot;/_a125&quot;, &quot;/_a126&quot;, &quot;/_a127&quot;, &quot;/_a128&quot;,
+ &quot;/_a129&quot;, &quot;/_a130&quot;, &quot;/_a131&quot;, &quot;/_a132&quot;,
+ &quot;/_a133&quot;, &quot;/_a134&quot;, &quot;/_a135&quot;, &quot;/_a136&quot;,
+ &quot;/_a137&quot;, &quot;/_a138&quot;, &quot;/_a139&quot;, &quot;/_a140&quot;,
+ &quot;/_a141&quot;, &quot;/_a142&quot;, &quot;/_a143&quot;, &quot;/_a144&quot;,
+ &quot;/_a145&quot;, &quot;/_a146&quot;, &quot;/_a147&quot;, &quot;/_a148&quot;,
+ &quot;/_a149&quot;, &quot;/_a150&quot;, &quot;/_a151&quot;, &quot;/_a152&quot;,
+ &quot;/_a153&quot;, &quot;/_a154&quot;, &quot;/_a155&quot;, &quot;/_a156&quot;,
+ &quot;/_a157&quot;, &quot;/_a158&quot;, &quot;/_a159&quot;, &quot;/_a160&quot;,
+ &quot;/_a161&quot;, &quot;/_a162&quot;, &quot;/_a163&quot;, &quot;/_a164&quot;,
+ &quot;/_a165&quot;, &quot;/_a166&quot;, &quot;/_a167&quot;, &quot;/_a168&quot;,
+ &quot;/_a169&quot;, &quot;/_a170&quot;, &quot;/_a171&quot;, &quot;/_a172&quot;,
+ &quot;/_a173&quot;, &quot;/_a174&quot;, &quot;/_a175&quot;, &quot;/_a176&quot;,
+ &quot;/_a177&quot;, &quot;/_a178&quot;, &quot;/_a179&quot;, &quot;/_a180&quot;,
+ &quot;/_a181&quot;, &quot;/_a182&quot;, &quot;/_a183&quot;, &quot;/_a184&quot;,
+ &quot;/_a185&quot;, &quot;/_a186&quot;, &quot;/_a187&quot;, &quot;/_a188&quot;,
+ &quot;/_a189&quot;, &quot;/_a190&quot;, &quot;/_a191&quot;, &quot;/_a192&quot;,
+ &quot;/_a193&quot;, &quot;/_a194&quot;, &quot;/_a195&quot;, &quot;/_a196&quot;,
+ &quot;/_a197&quot;, &quot;/_a198&quot;, &quot;/_a199&quot;, &quot;/_a200&quot;,
+ &quot;/_a201&quot;, &quot;/_a202&quot;, &quot;/_a203&quot;, &quot;/_a204&quot;,
+ &quot;/_a205&quot;, &quot;/_a206&quot;, &quot;/_a207&quot;, &quot;/_a208&quot;,
+ &quot;/_a209&quot;, &quot;/_a210&quot;, &quot;/_a211&quot;, &quot;/_a212&quot;,
+ &quot;/_a213&quot;, &quot;/_a214&quot;, &quot;/_a215&quot;, &quot;/_a216&quot;,
+ &quot;/_a217&quot;, &quot;/_a218&quot;, &quot;/_a219&quot;, &quot;/_a220&quot;,
+ &quot;/_a221&quot;, &quot;/_a222&quot;, &quot;/_a223&quot;, &quot;/_a224&quot;,
+ &quot;/_a225&quot;, &quot;/_a226&quot;, &quot;/_a227&quot;, &quot;/_a228&quot;,
+ &quot;/_a229&quot;, &quot;/_a230&quot;, &quot;/_a231&quot;, &quot;/_a232&quot;,
+ &quot;/_a233&quot;, &quot;/_a234&quot;, &quot;/_a235&quot;, &quot;/_a236&quot;,
+ &quot;/_a237&quot;, &quot;/_a238&quot;, &quot;/_a239&quot;, &quot;/_a240&quot;,
+ &quot;/_a241&quot;, &quot;/_a242&quot;, &quot;/_a243&quot;, &quot;/_a244&quot;,
+ &quot;/_a245&quot;, &quot;/_a246&quot;, &quot;/_a247&quot;, &quot;/_a248&quot;,
+ &quot;/_a249&quot;, &quot;/_a250&quot;, &quot;/_a251&quot;, &quot;/_a252&quot;,
+ &quot;/_a253&quot;, &quot;/_a254&quot;, &quot;/_a255&quot;);
+
+</pre><blockquote>Used <a href="#NWD3">above</a>.<p>
+</blockquote><p>The program accepts at most five command line arguments:
+<ul>
+<li> <code>-d size</code> --- explicitly specify the <code>$design_size</code>.</li>
+<li> <code>-nodel</code> --- suppress deleting of intermediate files,
+ such as <code>foo.tfm</code> or <code>foo.ddd</code>.</li>
+<li> <code>-eofill</code> --- ignore <b>fill</b> commands that are not
+ immediately after <b>gsave</b>. If this happens
+ <a name="NWD6">p</a>ut <b>eofill</b> in the end of the character.
+<li> The UniqueID, i.e., a unique font identity number, if not specified the
+ program will automatically generate one</li>
+<li> The name of the METAFONT file with or without extension.</li>
+</ul>
+In case it is invoked without any command line arguments,
+it prints usage information. In order to properly use the program,
+one has to provide only the font name.
+
+ <a name="NWD7">C</a>ommand line processing is being done in a relatively standard way.
+A while loop goes through each command line argument, checks its form
+and sets special global variables. In the case of the UniqueID argument
+we make sure it lies within the valid range, i.e., it is a number
+greater or equal than 4,000,000 and less than 5,000,000.
+
+<a name="NWD8">O</a>nce we have finished with the scanning of the command line arguments
+we must further process certain pieces of information.
+
+<pre><a name="NWmf29-ComU-1" href="#NWD8"><dfn>&lt;Command line argument handling&gt;=</dfn></a>
+$argc = @ARGV;
+$design_size = -1;
+$nodel = 0;
+$eofill = 0;
+$noID = 1;
+SWITCHES: while($_ = $ARGV[0], /^-/)
+{
+ shift;
+ if(/^-d(\d+)/)
+ {
+ $design_size = $1;
+ }
+ elsif(/^-nodel$/)
+ {
+ $nodel = 1;
+ }
+ elsif(/^-eofill$/)
+ {
+ $eofill = 1;
+ }
+ elsif(/^-I(\d+)$/)
+ {
+ die &quot;UniqueID must lie in the range 4,000,000...4,999,999\n&quot;
+ if ($1 &gt; 4999999 || $1 &lt; 4000000);
+ $UniqueID = $1;
+ $noID = 0;
+ }
+ elsif (!@ARGV)
+ {
+ last SWITCHES;
+ }
+}
+if (!@ARGV)
+{
+ print &lt;&lt;Usage;
+This ``mf2pt3'' version 1.1
+Usage: mf2pt3 [-dsize] [-nodel] [-eofill] [-IUniqueID] &lt;METAFONT file name&gt;
+Usage
+exit(0);
+}
+else
+{
+ $MFfile = $ARGV[0];
+}
+<a name="NWmf29-ComU-1-u1" href="#NWD9"><i>&lt;Further command line argument processing&gt;</i></a>
+
+</pre><blockquote>Used <a href="#NWD2">above</a>.<p>
+</blockquote><p> <a name="NWD9">I</a>f the user has specified a Unique Font Identity number, the program
+must generate one. Moreover, if the user hasn't explicitly specified a
+design size, the program must extract it from the font name. Finally, we
+have to remove the file name extension in order to get the name of
+the new PostScript font.
+
+<pre><a name="NWmf29-Fure-1" href="#NWD9"><dfn>&lt;Further command line argument processing&gt;=</dfn></a>
+if ($noID)
+{
+ <a name="NWmf29-Fure-1-u1" href="#NWDA"><i>&lt;Generate UniqueID&gt;</i></a>
+}
+<a name="NWmf29-Fure-1-u2" href="#NWDB"><i>&lt;Get design size&gt;</i></a>
+<a name="NWmf29-Fure-1-u3" href="#NWDC"><i>&lt;Remove file extension&gt;</i></a>
+
+</pre><blockquote>Used <a href="#NWD8">above</a>.<p>
+</blockquote><p><a name="NWDA">I</a>n case the user hasn't specified a UniqueID we must generate one
+For this purpose we use function <code>rand</code> and the random number generator
+seed (<code>srand</code>), in order to ensure some sort of... randomness.
+Since <code>rand</code> produces a number in
+the range 0...1, we multiply the output of <code>rand</code> by 999999 so that
+we have a number number in the range 0...999999, and we add to this
+the number 4000000 so that the final random number is in the expected
+range.
+
+<pre><a name="NWmf29-GenH-1" href="#NWDA"><dfn>&lt;Generate UniqueID&gt;=</dfn></a>
+ srand();
+ $UniqueID = int(999999*rand())+4000000;
+
+</pre><blockquote>Used <a href="#NWD9">above</a>.<p>
+</blockquote><p> As it is know a METAFONT font name consists of two parts: a symbolic
+acronym, specifying its characteristics, and a number specifying its
+design size. The number can be either a two or a four digit number (compare
+<a name="NWDB">c</a>mr17 with ecsx1095.) In both cases we extract the number from the
+font name and then in the first case we divide it by 10 and in the second
+case we divide it by 1000 to get the magnification factor. Finally, we
+set the magnification. The number 100 is chosen because font data
+must be integers greater than 100. Of course, nn case the user has already
+given the design size, there is no reason to extract if from the font name.
+But, still we must process it in oder to ensure the generation of valid
+output.
+
+<pre><a name="NWmf29-GetF-1" href="#NWDB"><dfn>&lt;Get design size&gt;=</dfn></a>
+
+if ($design_size == -1)
+{
+ if ($MFfile =~ /\D+(\d+)$/)
+ {
+ $design_size=$1;
+ }
+ else
+ {
+ die &quot;$MFfile must be a PostScript font name: there is no design size.\n&quot;;
+ }
+}
+if($design_size &gt;100)
+{
+ $mag_factor=$design_size/1000;
+}
+else
+{
+ $mag_factor=$design_size/10;
+}
+$mag = 100 /$mag_factor;
+
+</pre><blockquote>Used <a href="#NWD9">above</a>.<p>
+</blockquote><p><a name="NWDC">I</a>f the user supplies the METAFONT file name with an extension
+we simple chop it off. This is done pretty simple by employing Perl's
+fantastic regular-expression mechanism.
+
+<pre><a name="NWmf29-RemL-1" href="#NWDC"><dfn>&lt;Remove file extension&gt;=</dfn></a>
+ $MFfile = $1 if $MFfile =~ /(\w+)\.\w*/;
+
+</pre><blockquote>Used <a href="#NWD9">above</a>.<p>
+</blockquote><p><a name="NWDD">W</a>e proceed now to the generation of the EPSF files. This task
+is performed by METAPOST. Initially, we create the EPSF files by executing
+<code>mfplain</code>. If for some reason there is no TFM file, the program
+stops and prints an error message. (It is most likely that the user has
+typed the name of non-existing METAFONT font.) The <code>$mfplain</code> command
+is augmented by the magnification factor and the input part.
+
+<pre><a name="NWmf29-GenO-1" href="#NWDD"><dfn>&lt;Generation of EPSF files&gt;=</dfn></a>
+ $mfplain .= &quot;mag=$mag; input $MFfile \'&quot;;
+ system($mfplain);
+ if (!(-e &quot;$MFfile.tfm&quot;))
+ {
+ $nodel || unlink &quot;mpout.log&quot;;
+ die &quot;$MFfile: no such font in system\n&quot;;
+ }
+
+</pre><blockquote>Used <a href="#NWD2">above</a>.<p>
+</blockquote><p>Since, the various EPSF files have been generated successfully, we
+can now start collecting the <code>BoundingBox</code> information. First, we
+<a name="NWDE">g</a>et the names of all EPSF files. Next, we must open each EPSF file,
+and find the line that contains the <code>BoundingBox</code> information.
+This is easy, since in an EPSF file the line that contains this
+piece of information look like the following one:
+<code>%%BoundingBox: 0 -1 6 6</code>. While doing this we must get the
+<code>FontBBox</code> information. We use four variables for this purpose.
+The next step is produce the first part of the font, i.e., the
+metrics section and the encoding information.
+
+<pre><a name="NWmf29-ConR-1" href="#NWDE"><dfn>&lt;Construction of Type 3 font&gt;=</dfn></a>
+ <a name="NWmf29-ConR-1-u1" href="#NWDF"><i>&lt;Get the file names of the EPSF files&gt;</i></a>
+ $Min_llx = $Min_lly = $Max_urx = $Max_ury = 0;
+ <a name="NWmf29-ConR-1-u2" href="#NWDG"><i>&lt;get bounding boxes&gt;</i></a>
+<a name="NWmf29-ConR-1-u3" href="#NWDH"><i>&lt;Generate Type 3 Font&gt;</i></a>
+
+
+</pre><blockquote>Used <a href="#NWD2">above</a>.<p>
+</blockquote><p><a name="NWDF">I</a>t could be easy to get the file names by a simple pipe, but
+since this program may be used in OS other that Unix, we prefer
+to do it in a more portable way--- we simply open the directory
+and store all the file names that fulfill with a name that is
+identical to <code>$MFfile</code>.
+
+<pre><a name="NWmf29-Geta-1" href="#NWDF"><dfn>&lt;Get the file names of the EPSF files&gt;=</dfn></a>
+ opendir(Dir, &quot;.&quot;);
+ $pattern = &quot;$MFfile&quot; . &quot;\\.\\d+&quot;;
+ @EPSFs = grep(/$pattern/, readdir(Dir));
+ closedir Dir;
+
+</pre><blockquote>Used <a href="#NWDE">above</a>.<p>
+</blockquote><p><a name="NWDG">I</a>n order to get the <code>BoundingBox</code> information we open each
+EPSF file and we get the line that contains these information. For
+this we simply employ the pattern matching capabilities of Perl. Then
+we store these information in a compact way to the appropriate index
+in the <code>BoundingBox</code> array. (Readers not familiar with regular
+expressions should consult the Perl manual.) As a side effect we calculate
+the total number of characters that the font will provide in variable
+<code>$total_chars</code> (plus one as there is always the <code>/.notdef</code> character).
+
+<pre><a name="NWmf29-getI-1" href="#NWDG"><dfn>&lt;get bounding boxes&gt;=</dfn></a>
+
+ $total_chars = @EPSFs+1;
+ foreach $file (@EPSFs)
+ {
+ open(EPSF_FILE,&quot;$file&quot;)||die &quot;Can't open file $file\n&quot;;
+ while (&lt;EPSF_FILE&gt;)
+ {
+ $BBox = pack(&quot;ai4&quot;,&quot;d&quot;,$1,$2,$3,$4)
+ if /%%BoundingBox: (-?\d+) (-?\d+) (-?\d+) (-?\d+)/;
+ }
+ close EPSF_FILE;
+ $_=$file;
+ /$MFfile\.(\d+)/;
+ $BoundingBox[$1] = $BBox;
+ ($_, $llx, $lly, $urx, $ury) = unpack(&quot;ai4&quot;, $BBox);
+ $Min_llx = $llx if $llx &lt; $Min_llx;
+ $Min_lly = $lly if $lly &lt; $Min_lly;
+ $Max_urx = $urx if $urx &gt; $Max_urx;
+ $Max_ury = $ury if $ury &gt; $Max_ury;
+ }
+
+</pre><blockquote>Used <a href="#NWDE">above</a>.<p>
+</blockquote><p><a name="NWDH">W</a>e now have all the information we need in order to generate the complete
+Type 3 font. We first, create the font file and then we print
+to it some information which are pretty standard, such as the <code>/FontType</code>,
+etc. Next, we let PostScript know which characters will the font provide,
+and then we generate the <code>BoundingBox</code> dictionary, the <code>Metrics</code>
+dictionary, and the <code>CharProcs</code> dictionary. Finally, we generate the
+<code>BuildGlyph</code> procedure and we define the font.
+
+
+<pre><a name="NWmf29-GenK-1" href="#NWDH"><dfn>&lt;Generate Type 3 Font&gt;=</dfn></a>
+ open(TYPE3, &quot;&gt;$MFfile.pt3&quot;)||die &quot;Can't create file $MFfile.pt3\n&quot;;
+ $date = localtime;
+ print TYPE3 &lt;&lt;DATA;
+%!PS-Adobe-2.0
+%%Creator: mf2pt3 1.1 Copyright 1998 Apostolos Syropoulos
+%%CreationDate: $date
+%%EndComments
+11 dict % 11 entries
+begin
+ /FontType 3 def
+ /UniqueID $UniqueID def
+ /FontName /$MFfile def
+ /FontBBox [ $Min_llx $Min_lly $Max_urx $Max_ury] def
+ /FontMatrix [ 0.001 0 0 0.001 0 0 ] def
+ /Encoding 256 array def
+ 0 1 255 { Encoding exch /.notdef put } for
+DATA
+ <a name="NWmf29-GenK-1-u1" href="#NWDI"><i>&lt;make known all the characters of the font&gt;</i></a>
+ <a name="NWmf29-GenK-1-u2" href="#NWDJ"><i>&lt;generate bounding box dictionary&gt;</i></a>
+ <a name="NWmf29-GenK-1-u3" href="#NWDK"><i>&lt;generate metrics dictionary&gt;</i></a>
+ <a name="NWmf29-GenK-1-u4" href="#NWDL"><i>&lt;generate CharProcs dictionary&gt;</i></a>
+<a name="NWmf29-GenK-1-u5" href="#NWDN"><i>&lt;generate BuildGlyph procedure&gt;</i></a>
+
+</pre><blockquote>Used <a href="#NWDE">above</a>.<p>
+</blockquote><p><a name="NWDI">A</a>fter initializing the Encoding vector, we must make all those
+assignments so that PostScript will know which characters are in this font.
+This is trivial--- we simply scan the <code>BoundingBox</code> array and for
+each defined character we print a line of the form <code>Encoding N Name</code>,
+where <code>N</code> is the number of the character and <code>Name</code> the <code>N</code>th
+entry in the Encoding array.
+
+<pre><a name="NWmf29-makf-1" href="#NWDI"><dfn>&lt;make known all the characters of the font&gt;=</dfn></a>
+ for($i=0; $i&lt;=256; $i++)
+ {
+ $_ = unpack(&quot;ai4&quot;, $BoundingBox[$i]);
+ print TYPE3 &quot;Encoding $i $Encoding[$i] put\n&quot; if $_ eq &quot;d&quot;;
+ }
+
+</pre><blockquote>Used <a href="#NWDH">above</a>.<p>
+</blockquote><p><a name="NWDJ">I</a>n general the bounding boxes dictionary consists of some of entries
+like the following one: <code>/A [ 0 -100 600 700 ] def</code>. Since, the numbers
+are stored in the <code>BoundingBox</code> array our task is simple. However we must
+print some data that let PostScript know the size of the dictionary.
+
+<pre><a name="NWmf29-genW-1" href="#NWDJ"><dfn>&lt;generate bounding box dictionary&gt;=</dfn></a>
+ print TYPE3 &quot;/BoundingBoxes $total_chars dict def\n&quot;;
+ print TYPE3 &quot;BoundingBoxes begin\n&quot;;
+ print TYPE3 &quot;/.notdef { 0 0 0 0 } def\n&quot;;
+ for($i=0; $i&lt;=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack(&quot;ai4&quot;,$BoundingBox[$i]);
+ print TYPE3 &quot;$Encoding[$i] [ $llx $lly $urx $ury ] def\n&quot;
+ if $_ eq &quot;d&quot;;
+ }
+ print TYPE3 &quot;end %BoundingBoxes\n&quot;;
+
+
+</pre><blockquote>Used <a href="#NWDH">above</a>.<p>
+</blockquote><p><a name="NWDK">T</a>he metrics dictionary is created in way similar to the bounding box
+dictionary. Generally it consists of lines of the form: <code>/A 600 def</code>
+where the number is the difference urx-llx. As usual we must first
+output some book-keeping information.
+
+<pre><a name="NWmf29-genR-1" href="#NWDK"><dfn>&lt;generate metrics dictionary&gt;=</dfn></a>
+ print TYPE3 &quot;/Metrics $total_chars dict def\n&quot;;
+ print TYPE3 &quot;Metrics begin\n&quot;;
+ print TYPE3 &quot;/.notdef 0 def\n&quot;;
+ for($i=0; $i&lt;=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack(&quot;ai4&quot;,$BoundingBox[$i]);
+ $diff = $urx - $llx;
+ print TYPE3 &quot;$Encoding[$i] $diff def\n&quot; if $_ eq &quot;d&quot;;
+ }
+ print TYPE3 &quot;end %Metrics\n&quot;;
+
+
+</pre><blockquote>Used <a href="#NWDH">above</a>.<p>
+</blockquote><p>Generating the CharProcs dictionary involves the extraction of
+the PostScript code from the various EPSF files. Moreover, we must
+be careful to avoid extracting comments and to delete the keyword
+<code><a name="NWDL">showpage</a></code> from the source code. Both, operations are getting done
+by making use of the regular expression facilities and operators that
+Perl provide. Apart from that we generation process is similar to
+the previous ones. First, we generate some standard code and then
+the PostScript code for each character. Please note, that after
+initial experimentation I have found that METAPOST generates
+a lot of strange <code>setgray</code> commands which actually confuse a
+PostScript interpreter, so the program eliminates all such commands.
+
+<pre><a name="NWmf29-genT-1" href="#NWDL"><dfn>&lt;generate CharProcs dictionary&gt;=</dfn></a>
+ print TYPE3 &quot;/CharProcs $total_chars dict def\n&quot;;
+ print TYPE3 &quot;CharProcs begin\n&quot;;
+ print TYPE3 &quot;/.notdef { } def\n&quot;;
+ for($i=0; $i&lt;=256; $i++)
+ {
+ $_ = unpack(&quot;ai4&quot;, $BoundingBox[$i]);
+ if ($_ eq &quot;d&quot;)
+ {
+ open(CHAR, &quot;$MFfile.$i&quot;)||
+ die &quot;Can't open file $MFfile.$i\n&quot;;
+ $code = &quot;&quot;; #&quot;100 100 scale\n&quot;;
+ while (&lt;CHAR&gt;)
+ {
+ $code .= $_ if $_ !~ /^%/;
+ }
+ close CHAR;
+ $code =~ s/showpage\n*//mg; #eliminate showpage
+ $code =~ s/\d setgray//mg; #eliminate setgray
+ $code =~ s/(\d*)\.\d+/$1/mg; #chop decimal digits
+ print TYPE3 $Encoding[$i], &quot; { %\n&quot;;
+ if ($eofill)
+ {
+ <a name="NWmf29-genT-1-u1" href="#NWDM"><i>&lt;Manipulate fills and newpaths&gt;</i></a>
+ }
+ else
+ {
+ print TYPE3 $code;
+ }
+ print TYPE3 &quot;} bind def\n&quot;;
+ }
+ }
+ print TYPE3 &quot;end %CharProcs\n&quot;;
+
+</pre><blockquote>Used <a href="#NWDH">above</a>.<p>
+</blockquote><p><a name="NWDM">I</a>n the <code>eofill</code> mode, we eliminate <b>newpath</b> calls and
+<b>fill</b> calls that are not following <b>gsave</b>.
+And in the end we call eofill.
+<pre><a name="NWmf29-ManT-1" href="#NWDM"><dfn>&lt;Manipulate fills and newpaths&gt;=</dfn></a>
+$code =~ s/gsave fill/GSAVE FILL/mg; # save for soon restore
+$code =~ s/fill//mg; # eliminate fill
+$code =~ s/newpath//mg; # eliminate fill
+$code =~ s/GSAVE FILL/gsave fill/mg; # restore
+print TYPE3 $code, &quot;eofill\n&quot;;
+
+</pre><blockquote>Used <a href="#NWDL">below</a>.<p>
+</blockquote><p><a name="NWDN">P</a>rocedure <code>BuildGlyph</code> is very important as it defines the way
+PostScript will be able to use the font. The generated code is
+pretty standard.
+
+<pre><a name="NWmf29-genT.2-1" href="#NWDN"><dfn>&lt;generate BuildGlyph procedure&gt;=</dfn></a>
+ print TYPE3 &lt;&lt;BUILDGLYPH;
+ /BuildGlyph {
+ exch
+ begin
+ dup
+ Metrics exch get % get x displacement
+ 0 % set y displacement
+ 2 index
+ BoundingBoxes
+ exch get aload pop
+ setcachedevice
+ CharProcs exch get
+ exec
+ fill
+ end
+ } def
+ currentdict
+end
+/$MFfile exch definefont
+pop
+BUILDGLYPH
+close TYPE3;
+
+</pre><blockquote>Used <a href="#NWDH">above</a>.<p>
+</blockquote><p><a name="NWDO">N</a>ow that we are done we must free some space on our hard disks, unless
+of course the user has decided the opposite. In case we are allowed to free
+space, we remove all the EPSF files, the log file and the TFM file, leaving
+only the Type 3 font file.
+
+<pre><a name="NWmf29-DelO-1" href="#NWDO"><dfn>&lt;Delete unnecessary files&gt;=</dfn></a>
+ if (!$nodel)
+ {
+ unlink @EPSFs;
+ unlink &quot;$MFfile.log&quot;, &quot;$MFfile.tfm&quot;;
+ }
+
+</pre><blockquote>Used <a href="#NWD2">above</a>.<p>
+</blockquote><p><a name="NWDP">*</a><b><h2>Acknowledgments</h2></b><br>
+John Hobby (the creator of METAPOST) and Yotam Medini
+had helped me in the development phase and the debugging phase
+correspondingly. Many thanks to both of you!
+
+
+<ul>
+<li><a href="#NWD2"><i>&lt;*&gt;</i></a>: <a href="#NWD2">D1</a>
+<li><a href="#NWD4"><i>&lt;BoundingBox initialization&gt;</i></a>: <a href="#NWD3">U1</a>, <a href="#NWD4">D2</a>
+<li><a href="#NWD8"><i>&lt;Command line argument handling&gt;</i></a>: <a href="#NWD2">U1</a>, <a href="#NWD8">D2</a>
+<li><a href="#NWDE"><i>&lt;Construction of Type 3 font&gt;</i></a>: <a href="#NWD2">U1</a>, <a href="#NWDE">D2</a>
+<li><a href="#NWDO"><i>&lt;Delete unnecessary files&gt;</i></a>: <a href="#NWD2">U1</a>, <a href="#NWDO">D2</a>
+<li><a href="#NWD5"><i>&lt;Encoding array initialization&gt;</i></a>: <a href="#NWD3">U1</a>, <a href="#NWD5">D2</a>
+<li><a href="#NWD9"><i>&lt;Further command line argument processing&gt;</i></a>: <a href="#NWD8">U1</a>, <a href="#NWD9">D2</a>
+<li><a href="#NWDH"><i>&lt;Generate Type 3 Font&gt;</i></a>: <a href="#NWDE">U1</a>, <a href="#NWDH">D2</a>
+<li><a href="#NWDA"><i>&lt;Generate UniqueID&gt;</i></a>: <a href="#NWD9">U1</a>, <a href="#NWDA">D2</a>
+<li><a href="#NWDD"><i>&lt;Generation of EPSF files&gt;</i></a>: <a href="#NWD2">U1</a>, <a href="#NWDD">D2</a>
+<li><a href="#NWDB"><i>&lt;Get design size&gt;</i></a>: <a href="#NWD9">U1</a>, <a href="#NWDB">D2</a>
+<li><a href="#NWDF"><i>&lt;Get the file names of the EPSF files&gt;</i></a>: <a href="#NWDE">U1</a>, <a href="#NWDF">D2</a>
+<li><a href="#NWD3"><i>&lt;Initialization of constants&gt;</i></a>: <a href="#NWD2">U1</a>, <a href="#NWD3">D2</a>
+<li><a href="#NWDM"><i>&lt;Manipulate fills and newpaths&gt;</i></a>: <a href="#NWDL">U1</a>, <a href="#NWDM">D2</a>
+<li><a href="#NWDC"><i>&lt;Remove file extension&gt;</i></a>: <a href="#NWD9">U1</a>, <a href="#NWDC">D2</a>
+<li><a href="#NWDN"><i>&lt;generate BuildGlyph procedure&gt;</i></a>: <a href="#NWDH">U1</a>, <a href="#NWDN">D2</a>
+<li><a href="#NWDL"><i>&lt;generate CharProcs dictionary&gt;</i></a>: <a href="#NWDH">U1</a>, <a href="#NWDL">D2</a>
+<li><a href="#NWDJ"><i>&lt;generate bounding box dictionary&gt;</i></a>: <a href="#NWDH">U1</a>, <a href="#NWDJ">D2</a>
+<li><a href="#NWDK"><i>&lt;generate metrics dictionary&gt;</i></a>: <a href="#NWDH">U1</a>, <a href="#NWDK">D2</a>
+<li><a href="#NWDG"><i>&lt;get bounding boxes&gt;</i></a>: <a href="#NWDE">U1</a>, <a href="#NWDG">D2</a>
+<li><a href="#NWDI"><i>&lt;make known all the characters of the font&gt;</i></a>: <a href="#NWDH">U1</a>, <a href="#NWDI">D2</a>
+</ul>
+</body></html>
+
diff --git a/fonts/utilities/mf2pt3/mf2pt3.nw b/fonts/utilities/mf2pt3/mf2pt3.nw
new file mode 100644
index 0000000000..a7393932c7
--- /dev/null
+++ b/fonts/utilities/mf2pt3/mf2pt3.nw
@@ -0,0 +1,530 @@
+<b>mf2pt3</b> (c) Copyright 1998 Apostolos Syropoulos
+[[apostolo@obelix.ee.duth.gr]] <p>
+This is program [[mf2pt3]] a Perl script that generates a PostScript
+Type 3 font that corresponds to a METAFONT font description. In order
+to achieve its goal the program utilizes another program: mfplain
+(METAPOST with the mfplain base preloaded). This program generates EPSF
+files for each character. This document assumes that the reader is
+familiar with the Type 3 font terminology and its structure. For
+more information one should consult the ``PostScript User Manual'',
+or any good book on PostScript like ``Postscript by Example'',
+by Henry McGilton and Mary Campione, published by Addison-Wesley Pub Co.
+
+@ We now describe the way the program operates. First of all, we
+generate for each character of a METAFONT font an EPSF file. Next
+we collect the [[BoundingBox]] information for each character, as this
+piece of information is vital to the construction of the Type 3 font.
+Now we can proceed with the construction of the font. Finally, we
+delete some unnecessary files and we output the line the user must
+add to his/her [[psfonts.map]] file in order to use the Type 3 font
+when he/she creates a PostScript file from a DVI file.
+
+<<*>>=
+#!/usr/bin/perl
+#
+#(c) Copyright 1998 Apostolos Syropoulos
+# apostolo@obelix.ee.duth.gr
+#
+<<Initialization of constants>>
+<<Command line argument handling>>
+<<Generation of EPSF files>>
+<<Construction of Type 3 font>>
+<<Delete unnecessary files>>
+print "\n$MFfile $MFfile <$MFfile.pt3\n";
+
+@ Since we don't know on what system the program will be used, we
+must make sure it calls the GhostScript and METAPOST programs in the proper
+way. Moreover, we supply to each command the proper command line switches.
+The magnification is set to 100 as the usual design size is 10 pt.
+The [[BoundingBox]] information are kept in a compact format in an array.
+
+<<Initialization of constants>>=
+ $mfplain="mfplain \'\\mode=localfont; \\batchmode; ";
+ <<BoundingBox initialization>>
+ <<Encoding array initialization>>
+
+@ Since Perl does not provide record structures, we use the [[pack]]
+function to create a structure which will contain the [[BoundingBox]]
+information. Each [[BoundingBox]] corresponds to four numbers: [[llx]],
+[[lly]], [[urx]], and [[ury]]. If any of the 256 character slots is
+undefined each of these four numbers is set to zero. For efficiency reasons
+each [[BoundingBox]] structure contains one more piece of information--- an
+ASCII character, which indicates whether the corresponding character is
+defined ("d") or undefined ("u"). All the [[BoundingBox]] information are
+kept in an array which is assumed to contain only undefined characters.
+
+<<BoundingBox initialization>>=
+$notdef=pack("ai4","u",0,0,0,0);
+for($i=0; $i<=255; $i++){ $BoundingBox[$i]=$notdef }
+
+@ The encoding vector is a vital part of a PostScript font. The internal
+name of each character is completely irrelevant to the final output. So,
+someone can choose any name it pleases him.
+
+<<Encoding array initialization>>=
+@Encoding = ("/_a0", "/_a1", "/_a2", "/_a3", "/_a4",
+ "/_a5", "/_a6", "/_a7", "/_a8",
+ "/_a9", "/_a10", "/_a11", "/_a12",
+ "/_a13", "/_a14", "/_a15", "/_a16",
+ "/_a17", "/_a18", "/_a19", "/_a20",
+ "/_a21", "/_a22", "/_a23", "/_a24",
+ "/_a25", "/_a26", "/_a27", "/_a28",
+ "/_a29", "/_a30", "/_a31", "/_a32",
+ "/_a33", "/_a34", "/_a35", "/_a36",
+ "/_a37", "/_a38", "/_a39", "/_a40",
+ "/_a41", "/_a42", "/_a43", "/_a44",
+ "/_a45", "/_a46", "/_a47", "/_a48",
+ "/_a49", "/_a50", "/_a51", "/_a52",
+ "/_a53", "/_a54", "/_a55", "/_a56",
+ "/_a57", "/_a58", "/_a59", "/_a60",
+ "/_a61", "/_a62", "/_a63", "/_a64",
+ "/_a65", "/_a66", "/_a67", "/_a68",
+ "/_a69", "/_a70", "/_a71", "/_a72",
+ "/_a73", "/_a74", "/_a75", "/_a76",
+ "/_a77", "/_a78", "/_a79", "/_a80",
+ "/_a81", "/_a82", "/_a83", "/_a84",
+ "/_a85", "/_a86", "/_a87", "/_a88",
+ "/_a89", "/_a90", "/_a91", "/_a92",
+ "/_a93", "/_a94", "/_a95", "/_a96",
+ "/_a97", "/_a98", "/_a99", "/_a100",
+ "/_a101", "/_a102", "/_a103", "/_a104",
+ "/_a105", "/_a106", "/_a107", "/_a108",
+ "/_a109", "/_a110", "/_a111", "/_a112",
+ "/_a113", "/_a114", "/_a115", "/_a116",
+ "/_a117", "/_a118", "/_a119", "/_a120",
+ "/_a121", "/_a122", "/_a123", "/_a124",
+ "/_a125", "/_a126", "/_a127", "/_a128",
+ "/_a129", "/_a130", "/_a131", "/_a132",
+ "/_a133", "/_a134", "/_a135", "/_a136",
+ "/_a137", "/_a138", "/_a139", "/_a140",
+ "/_a141", "/_a142", "/_a143", "/_a144",
+ "/_a145", "/_a146", "/_a147", "/_a148",
+ "/_a149", "/_a150", "/_a151", "/_a152",
+ "/_a153", "/_a154", "/_a155", "/_a156",
+ "/_a157", "/_a158", "/_a159", "/_a160",
+ "/_a161", "/_a162", "/_a163", "/_a164",
+ "/_a165", "/_a166", "/_a167", "/_a168",
+ "/_a169", "/_a170", "/_a171", "/_a172",
+ "/_a173", "/_a174", "/_a175", "/_a176",
+ "/_a177", "/_a178", "/_a179", "/_a180",
+ "/_a181", "/_a182", "/_a183", "/_a184",
+ "/_a185", "/_a186", "/_a187", "/_a188",
+ "/_a189", "/_a190", "/_a191", "/_a192",
+ "/_a193", "/_a194", "/_a195", "/_a196",
+ "/_a197", "/_a198", "/_a199", "/_a200",
+ "/_a201", "/_a202", "/_a203", "/_a204",
+ "/_a205", "/_a206", "/_a207", "/_a208",
+ "/_a209", "/_a210", "/_a211", "/_a212",
+ "/_a213", "/_a214", "/_a215", "/_a216",
+ "/_a217", "/_a218", "/_a219", "/_a220",
+ "/_a221", "/_a222", "/_a223", "/_a224",
+ "/_a225", "/_a226", "/_a227", "/_a228",
+ "/_a229", "/_a230", "/_a231", "/_a232",
+ "/_a233", "/_a234", "/_a235", "/_a236",
+ "/_a237", "/_a238", "/_a239", "/_a240",
+ "/_a241", "/_a242", "/_a243", "/_a244",
+ "/_a245", "/_a246", "/_a247", "/_a248",
+ "/_a249", "/_a250", "/_a251", "/_a252",
+ "/_a253", "/_a254", "/_a255");
+
+@ The program accepts at most five command line arguments:
+<ul>
+<li> [[-d size]] --- explicitly specify the [[$design_size]].</li>
+<li> [[-nodel]] --- suppress deleting of intermediate files,
+ such as [[foo.tfm]] or [[foo.ddd]].</li>
+<li> [[-eofill]] --- ignore <b>fill</b> commands that are not
+ immediately after <b>gsave</b>. If this happens
+ put <b>eofill</b> in the end of the character.
+<li> The UniqueID, i.e., a unique font identity number, if not specified the
+ program will automatically generate one</li>
+<li> The name of the METAFONT file with or without extension.</li>
+</ul>
+In case it is invoked without any command line arguments,
+it prints usage information. In order to properly use the program,
+one has to provide only the font name.
+
+@ Command line processing is being done in a relatively standard way.
+A while loop goes through each command line argument, checks its form
+and sets special global variables. In the case of the UniqueID argument
+we make sure it lies within the valid range, i.e., it is a number
+greater or equal than 4,000,000 and less than 5,000,000.
+
+@ Once we have finished with the scanning of the command line arguments
+we must further process certain pieces of information.
+
+<<Command line argument handling>>=
+$argc = @ARGV;
+$design_size = -1;
+$nodel = 0;
+$eofill = 0;
+$noID = 1;
+SWITCHES: while($_ = $ARGV[0], /^-/)
+{
+ shift;
+ if(/^-d(\d+)/)
+ {
+ $design_size = $1;
+ }
+ elsif(/^-nodel$/)
+ {
+ $nodel = 1;
+ }
+ elsif(/^-eofill$/)
+ {
+ $eofill = 1;
+ }
+ elsif(/^-I(\d+)$/)
+ {
+ die "UniqueID must lie in the range 4,000,000...4,999,999\n"
+ if ($1 > 4999999 || $1 < 4000000);
+ $UniqueID = $1;
+ $noID = 0;
+ }
+ elsif (!@ARGV)
+ {
+ last SWITCHES;
+ }
+}
+if (!@ARGV)
+{
+ print <<Usage;
+This ``mf2pt3'' version 1.1
+Usage: mf2pt3 [-dsize] [-nodel] [-eofill] [-IUniqueID] <METAFONT file name>
+Usage
+exit(0);
+}
+else
+{
+ $MFfile = $ARGV[0];
+}
+<<Further command line argument processing>>
+
+@ If the user has specified a Unique Font Identity number, the program
+must generate one. Moreover, if the user hasn't explicitly specified a
+design size, the program must extract it from the font name. Finally, we
+have to remove the file name extension in order to get the name of
+the new PostScript font.
+
+<<Further command line argument processing>>=
+if ($noID)
+{
+ <<Generate UniqueID>>
+}
+<<Get design size>>
+<<Remove file extension>>
+
+@ In case the user hasn't specified a UniqueID we must generate one
+For this purpose we use function [[rand]] and the random number generator
+seed ([[srand]]), in order to ensure some sort of... randomness.
+Since [[rand]] produces a number in
+the range 0...1, we multiply the output of [[rand]] by 999999 so that
+we have a number number in the range 0...999999, and we add to this
+the number 4000000 so that the final random number is in the expected
+range.
+
+<<Generate UniqueID>>=
+ srand();
+ $UniqueID = int(999999*rand())+4000000;
+
+@ As it is know a METAFONT font name consists of two parts: a symbolic
+acronym, specifying its characteristics, and a number specifying its
+design size. The number can be either a two or a four digit number (compare
+cmr17 with ecsx1095.) In both cases we extract the number from the
+font name and then in the first case we divide it by 10 and in the second
+case we divide it by 1000 to get the magnification factor. Finally, we
+set the magnification. The number 100 is chosen because font data
+must be integers greater than 100. Of course, nn case the user has already
+given the design size, there is no reason to extract if from the font name.
+But, still we must process it in oder to ensure the generation of valid
+output.
+
+<<Get design size>>=
+
+if ($design_size == -1)
+{
+ if ($MFfile =~ /\D+(\d+)$/)
+ {
+ $design_size=$1;
+ }
+ else
+ {
+ die "$MFfile must be a PostScript font name: there is no design size.\n";
+ }
+}
+if($design_size >100)
+{
+ $mag_factor=$design_size/1000;
+}
+else
+{
+ $mag_factor=$design_size/10;
+}
+$mag = 100 /$mag_factor;
+
+@ If the user supplies the METAFONT file name with an extension
+we simple chop it off. This is done pretty simple by employing Perl's
+fantastic regular-expression mechanism.
+
+<<Remove file extension>>=
+ $MFfile = $1 if $MFfile =~ /(\w+)\.\w*/;
+
+@ We proceed now to the generation of the EPSF files. This task
+is performed by METAPOST. Initially, we create the EPSF files by executing
+[[mfplain]]. If for some reason there is no TFM file, the program
+stops and prints an error message. (It is most likely that the user has
+typed the name of non-existing METAFONT font.) The [[$mfplain]] command
+is augmented by the magnification factor and the input part.
+
+<<Generation of EPSF files>>=
+ $mfplain .= "mag=$mag; input $MFfile \'";
+ system($mfplain);
+ if (!(-e "$MFfile.tfm"))
+ {
+ $nodel || unlink "mpout.log";
+ die "$MFfile: no such font in system\n";
+ }
+
+@ Since, the various EPSF files have been generated successfully, we
+can now start collecting the [[BoundingBox]] information. First, we
+get the names of all EPSF files. Next, we must open each EPSF file,
+and find the line that contains the [[BoundingBox]] information.
+This is easy, since in an EPSF file the line that contains this
+piece of information look like the following one:
+[[%%BoundingBox: 0 -1 6 6]]. While doing this we must get the
+[[FontBBox]] information. We use four variables for this purpose.
+The next step is produce the first part of the font, i.e., the
+metrics section and the encoding information.
+
+<<Construction of Type 3 font>>=
+ <<Get the file names of the EPSF files>>
+ $Min_llx = $Min_lly = $Max_urx = $Max_ury = 0;
+ <<get bounding boxes>>
+<<Generate Type 3 Font>>
+
+
+@ It could be easy to get the file names by a simple pipe, but
+since this program may be used in OS other that Unix, we prefer
+to do it in a more portable way--- we simply open the directory
+and store all the file names that fulfill with a name that is
+identical to [[$MFfile]].
+
+<<Get the file names of the EPSF files>>=
+ opendir(Dir, ".");
+ $pattern = "$MFfile" . "\\.\\d+";
+ @EPSFs = grep(/$pattern/, readdir(Dir));
+ closedir Dir;
+
+@ In order to get the [[BoundingBox]] information we open each
+EPSF file and we get the line that contains these information. For
+this we simply employ the pattern matching capabilities of Perl. Then
+we store these information in a compact way to the appropriate index
+in the [[BoundingBox]] array. (Readers not familiar with regular
+expressions should consult the Perl manual.) As a side effect we calculate
+the total number of characters that the font will provide in variable
+[[$total_chars]] (plus one as there is always the [[/.notdef]] character).
+
+<<get bounding boxes>>=
+
+ $total_chars = @EPSFs+1;
+ foreach $file (@EPSFs)
+ {
+ open(EPSF_FILE,"$file")||die "Can't open file $file\n";
+ while (<EPSF_FILE>)
+ {
+ $BBox = pack("ai4","d",$1,$2,$3,$4)
+ if /%%BoundingBox: (-?\d+) (-?\d+) (-?\d+) (-?\d+)/;
+ }
+ close EPSF_FILE;
+ $_=$file;
+ /$MFfile\.(\d+)/;
+ $BoundingBox[$1] = $BBox;
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4", $BBox);
+ $Min_llx = $llx if $llx < $Min_llx;
+ $Min_lly = $lly if $lly < $Min_lly;
+ $Max_urx = $urx if $urx > $Max_urx;
+ $Max_ury = $ury if $ury > $Max_ury;
+ }
+
+@ We now have all the information we need in order to generate the complete
+Type 3 font. We first, create the font file and then we print
+to it some information which are pretty standard, such as the [[/FontType]],
+etc. Next, we let PostScript know which characters will the font provide,
+and then we generate the [[BoundingBox]] dictionary, the [[Metrics]]
+dictionary, and the [[CharProcs]] dictionary. Finally, we generate the
+[[BuildGlyph]] procedure and we define the font.
+
+
+<<Generate Type 3 Font>>=
+ open(TYPE3, ">$MFfile.pt3")||die "Can't create file $MFfile.pt3\n";
+ $date = localtime;
+ print TYPE3 <<DATA;
+%!PS-Adobe-2.0
+%%Creator: mf2pt3 1.1 Copyright 1998 Apostolos Syropoulos
+%%CreationDate: $date
+%%EndComments
+11 dict % 11 entries
+begin
+ /FontType 3 def
+ /UniqueID $UniqueID def
+ /FontName /$MFfile def
+ /FontBBox [ $Min_llx $Min_lly $Max_urx $Max_ury] def
+ /FontMatrix [ 0.001 0 0 0.001 0 0 ] def
+ /Encoding 256 array def
+ 0 1 255 { Encoding exch /.notdef put } for
+DATA
+ <<make known all the characters of the font>>
+ <<generate bounding box dictionary>>
+ <<generate metrics dictionary>>
+ <<generate CharProcs dictionary>>
+<<generate BuildGlyph procedure>>
+
+@ After initializing the Encoding vector, we must make all those
+assignments so that PostScript will know which characters are in this font.
+This is trivial--- we simply scan the [[BoundingBox]] array and for
+each defined character we print a line of the form [[Encoding N Name]],
+where [[N]] is the number of the character and [[Name]] the [[N]]th
+entry in the Encoding array.
+
+<<make known all the characters of the font>>=
+ for($i=0; $i<=256; $i++)
+ {
+ $_ = unpack("ai4", $BoundingBox[$i]);
+ print TYPE3 "Encoding $i $Encoding[$i] put\n" if $_ eq "d";
+ }
+
+@ In general the bounding boxes dictionary consists of some of entries
+like the following one: [[/A [ 0 -100 600 700 ] def]]. Since, the numbers
+are stored in the [[BoundingBox]] array our task is simple. However we must
+print some data that let PostScript know the size of the dictionary.
+
+<<generate bounding box dictionary>>=
+ print TYPE3 "/BoundingBoxes $total_chars dict def\n";
+ print TYPE3 "BoundingBoxes begin\n";
+ print TYPE3 "/.notdef { 0 0 0 0 } def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]);
+ print TYPE3 "$Encoding[$i] [ $llx $lly $urx $ury ] def\n"
+ if $_ eq "d";
+ }
+ print TYPE3 "end %BoundingBoxes\n";
+
+
+@ The metrics dictionary is created in way similar to the bounding box
+dictionary. Generally it consists of lines of the form: [[/A 600 def]]
+where the number is the difference urx-llx. As usual we must first
+output some book-keeping information.
+
+<<generate metrics dictionary>>=
+ print TYPE3 "/Metrics $total_chars dict def\n";
+ print TYPE3 "Metrics begin\n";
+ print TYPE3 "/.notdef 0 def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]);
+ $diff = $urx - $llx;
+ print TYPE3 "$Encoding[$i] $diff def\n" if $_ eq "d";
+ }
+ print TYPE3 "end %Metrics\n";
+
+
+@ Generating the CharProcs dictionary involves the extraction of
+the PostScript code from the various EPSF files. Moreover, we must
+be careful to avoid extracting comments and to delete the keyword
+[[showpage]] from the source code. Both, operations are getting done
+by making use of the regular expression facilities and operators that
+Perl provide. Apart from that we generation process is similar to
+the previous ones. First, we generate some standard code and then
+the PostScript code for each character. Please note, that after
+initial experimentation I have found that METAPOST generates
+a lot of strange [[setgray]] commands which actually confuse a
+PostScript interpreter, so the program eliminates all such commands.
+
+<<generate CharProcs dictionary>>=
+ print TYPE3 "/CharProcs $total_chars dict def\n";
+ print TYPE3 "CharProcs begin\n";
+ print TYPE3 "/.notdef { } def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ $_ = unpack("ai4", $BoundingBox[$i]);
+ if ($_ eq "d")
+ {
+ open(CHAR, "$MFfile.$i")||
+ die "Can't open file $MFfile.$i\n";
+ $code = ""; #"100 100 scale\n";
+ while (<CHAR>)
+ {
+ $code .= $_ if $_ !~ /^%/;
+ }
+ close CHAR;
+ $code =~ s/showpage\n*//mg; #eliminate showpage
+ $code =~ s/\d setgray//mg; #eliminate setgray
+ $code =~ s/(\d*)\.\d+/$1/mg; #chop decimal digits
+ print TYPE3 $Encoding[$i], " { %\n";
+ if ($eofill)
+ {
+ <<Manipulate fills and newpaths>>
+ }
+ else
+ {
+ print TYPE3 $code;
+ }
+ print TYPE3 "} bind def\n";
+ }
+ }
+ print TYPE3 "end %CharProcs\n";
+
+@ In the [[eofill]] mode, we eliminate <b>newpath</b> calls and
+<b>fill</b> calls that are not following <b>gsave</b>.
+And in the end we call eofill.
+<<Manipulate fills and newpaths>>=
+$code =~ s/gsave fill/GSAVE FILL/mg; # save for soon restore
+$code =~ s/fill//mg; # eliminate fill
+$code =~ s/newpath//mg; # eliminate fill
+$code =~ s/GSAVE FILL/gsave fill/mg; # restore
+print TYPE3 $code, "eofill\n";
+
+@ Procedure [[BuildGlyph]] is very important as it defines the way
+PostScript will be able to use the font. The generated code is
+pretty standard.
+
+<<generate BuildGlyph procedure>>=
+ print TYPE3 <<BUILDGLYPH;
+ /BuildGlyph {
+ exch
+ begin
+ dup
+ Metrics exch get % get x displacement
+ 0 % set y displacement
+ 2 index
+ BoundingBoxes
+ exch get aload pop
+ setcachedevice
+ CharProcs exch get
+ exec
+ fill
+ end
+ } def
+ currentdict
+end
+/$MFfile exch definefont
+pop
+BUILDGLYPH
+close TYPE3;
+
+@ Now that we are done we must free some space on our hard disks, unless
+of course the user has decided the opposite. In case we are allowed to free
+space, we remove all the EPSF files, the log file and the TFM file, leaving
+only the Type 3 font file.
+
+<<Delete unnecessary files>>=
+ if (!$nodel)
+ {
+ unlink @EPSFs;
+ unlink "$MFfile.log", "$MFfile.tfm";
+ }
+
+@ <b><h2>Acknowledgments</h2></b><br>
+John Hobby (the creator of METAPOST) and Yotam Medini
+had helped me in the development phase and the debugging phase
+correspondingly. Many thanks to both of you!
diff --git a/fonts/utilities/mf2pt3/mf2pt3.pl b/fonts/utilities/mf2pt3/mf2pt3.pl
new file mode 100755
index 0000000000..46bc574e8e
--- /dev/null
+++ b/fonts/utilities/mf2pt3/mf2pt3.pl
@@ -0,0 +1,305 @@
+#!/usr/bin/perl
+#
+#(c) Copyright 1998 Apostolos Syropoulos
+# apostolo@obelix.ee.duth.gr
+#
+ $mfplain="mfplain \'\\mode=localfont; \\batchmode; ";
+ $notdef=pack("ai4","u",0,0,0,0);
+ for($i=0; $i<=255; $i++){ $BoundingBox[$i]=$notdef }
+
+ @Encoding = ("/_a0", "/_a1", "/_a2", "/_a3", "/_a4",
+ "/_a5", "/_a6", "/_a7", "/_a8",
+ "/_a9", "/_a10", "/_a11", "/_a12",
+ "/_a13", "/_a14", "/_a15", "/_a16",
+ "/_a17", "/_a18", "/_a19", "/_a20",
+ "/_a21", "/_a22", "/_a23", "/_a24",
+ "/_a25", "/_a26", "/_a27", "/_a28",
+ "/_a29", "/_a30", "/_a31", "/_a32",
+ "/_a33", "/_a34", "/_a35", "/_a36",
+ "/_a37", "/_a38", "/_a39", "/_a40",
+ "/_a41", "/_a42", "/_a43", "/_a44",
+ "/_a45", "/_a46", "/_a47", "/_a48",
+ "/_a49", "/_a50", "/_a51", "/_a52",
+ "/_a53", "/_a54", "/_a55", "/_a56",
+ "/_a57", "/_a58", "/_a59", "/_a60",
+ "/_a61", "/_a62", "/_a63", "/_a64",
+ "/_a65", "/_a66", "/_a67", "/_a68",
+ "/_a69", "/_a70", "/_a71", "/_a72",
+ "/_a73", "/_a74", "/_a75", "/_a76",
+ "/_a77", "/_a78", "/_a79", "/_a80",
+ "/_a81", "/_a82", "/_a83", "/_a84",
+ "/_a85", "/_a86", "/_a87", "/_a88",
+ "/_a89", "/_a90", "/_a91", "/_a92",
+ "/_a93", "/_a94", "/_a95", "/_a96",
+ "/_a97", "/_a98", "/_a99", "/_a100",
+ "/_a101", "/_a102", "/_a103", "/_a104",
+ "/_a105", "/_a106", "/_a107", "/_a108",
+ "/_a109", "/_a110", "/_a111", "/_a112",
+ "/_a113", "/_a114", "/_a115", "/_a116",
+ "/_a117", "/_a118", "/_a119", "/_a120",
+ "/_a121", "/_a122", "/_a123", "/_a124",
+ "/_a125", "/_a126", "/_a127", "/_a128",
+ "/_a129", "/_a130", "/_a131", "/_a132",
+ "/_a133", "/_a134", "/_a135", "/_a136",
+ "/_a137", "/_a138", "/_a139", "/_a140",
+ "/_a141", "/_a142", "/_a143", "/_a144",
+ "/_a145", "/_a146", "/_a147", "/_a148",
+ "/_a149", "/_a150", "/_a151", "/_a152",
+ "/_a153", "/_a154", "/_a155", "/_a156",
+ "/_a157", "/_a158", "/_a159", "/_a160",
+ "/_a161", "/_a162", "/_a163", "/_a164",
+ "/_a165", "/_a166", "/_a167", "/_a168",
+ "/_a169", "/_a170", "/_a171", "/_a172",
+ "/_a173", "/_a174", "/_a175", "/_a176",
+ "/_a177", "/_a178", "/_a179", "/_a180",
+ "/_a181", "/_a182", "/_a183", "/_a184",
+ "/_a185", "/_a186", "/_a187", "/_a188",
+ "/_a189", "/_a190", "/_a191", "/_a192",
+ "/_a193", "/_a194", "/_a195", "/_a196",
+ "/_a197", "/_a198", "/_a199", "/_a200",
+ "/_a201", "/_a202", "/_a203", "/_a204",
+ "/_a205", "/_a206", "/_a207", "/_a208",
+ "/_a209", "/_a210", "/_a211", "/_a212",
+ "/_a213", "/_a214", "/_a215", "/_a216",
+ "/_a217", "/_a218", "/_a219", "/_a220",
+ "/_a221", "/_a222", "/_a223", "/_a224",
+ "/_a225", "/_a226", "/_a227", "/_a228",
+ "/_a229", "/_a230", "/_a231", "/_a232",
+ "/_a233", "/_a234", "/_a235", "/_a236",
+ "/_a237", "/_a238", "/_a239", "/_a240",
+ "/_a241", "/_a242", "/_a243", "/_a244",
+ "/_a245", "/_a246", "/_a247", "/_a248",
+ "/_a249", "/_a250", "/_a251", "/_a252",
+ "/_a253", "/_a254", "/_a255");
+
+
+$argc = @ARGV;
+$design_size = -1;
+$nodel = 0;
+$eofill = 0;
+$noID = 1;
+SWITCHES: while($_ = $ARGV[0], /^-/)
+{
+ shift;
+ if(/^-d(\d+)/)
+ {
+ $design_size = $1;
+ }
+ elsif(/^-nodel$/)
+ {
+ $nodel = 1;
+ }
+ elsif(/^-eofill$/)
+ {
+ $eofill = 1;
+ }
+ elsif(/^-I(\d+)$/)
+ {
+ die "UniqueID must lie in the range 4,000,000...4,999,999\n"
+ if ($1 > 4999999 || $1 < 4000000);
+ $UniqueID = $1;
+ $noID = 0;
+ }
+ elsif (!@ARGV)
+ {
+ last SWITCHES;
+ }
+}
+if (!@ARGV)
+{
+ print <<Usage;
+This ``mf2pt3'' version 1.1
+Usage: mf2pt3 [-dsize] [-nodel] [-eofill] [-IUniqueID] <METAFONT file name>
+Usage
+exit(0);
+}
+else
+{
+ $MFfile = $ARGV[0];
+}
+if ($noID)
+{
+ srand();
+ $UniqueID = int(999999*rand())+4000000;
+
+}
+
+if ($design_size == -1)
+{
+ if ($MFfile =~ /\D+(\d+)$/)
+ {
+ $design_size=$1;
+ }
+ else
+ {
+ die "$MFfile must be a PostScript font name: there is no design size.\n";
+ }
+}
+if($design_size >100)
+{
+ $mag_factor=$design_size/1000;
+}
+else
+{
+ $mag_factor=$design_size/10;
+}
+$mag = 100 /$mag_factor;
+
+ $MFfile = $1 if $MFfile =~ /(\w+)\.\w*/;
+
+
+
+ $mfplain .= "mag=$mag; input $MFfile \'";
+ system($mfplain);
+ if (!(-e "$MFfile.tfm"))
+ {
+ $nodel || unlink "mpout.log";
+ die "$MFfile: no such font in system\n";
+ }
+
+ opendir(Dir, ".");
+ $pattern = "$MFfile" . "\\.\\d+";
+ @EPSFs = grep(/$pattern/, readdir(Dir));
+ closedir Dir;
+
+ $Min_llx = $Min_lly = $Max_urx = $Max_ury = 0;
+
+ $total_chars = @EPSFs+1;
+ foreach $file (@EPSFs)
+ {
+ open(EPSF_FILE,"$file")||die "Can't open file $file\n";
+ while (<EPSF_FILE>)
+ {
+ $BBox = pack("ai4","d",$1,$2,$3,$4)
+ if /%%BoundingBox: (-?\d+) (-?\d+) (-?\d+) (-?\d+)/;
+ }
+ close EPSF_FILE;
+ $_=$file;
+ /$MFfile\.(\d+)/;
+ $BoundingBox[$1] = $BBox;
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4", $BBox);
+ $Min_llx = $llx if $llx < $Min_llx;
+ $Min_lly = $lly if $lly < $Min_lly;
+ $Max_urx = $urx if $urx > $Max_urx;
+ $Max_ury = $ury if $ury > $Max_ury;
+ }
+
+ open(TYPE3, ">$MFfile.pt3")||die "Can't create file $MFfile.pt3\n";
+ $date = localtime;
+ print TYPE3 <<DATA;
+%!PS-Adobe-2.0
+%%Creator: mf2pt3 1.1 Copyright 1998 Apostolos Syropoulos
+%%CreationDate: $date
+%%EndComments
+11 dict % 11 entries
+begin
+ /FontType 3 def
+ /UniqueID $UniqueID def
+ /FontName /$MFfile def
+ /FontBBox [ $Min_llx $Min_lly $Max_urx $Max_ury] def
+ /FontMatrix [ 0.001 0 0 0.001 0 0 ] def
+ /Encoding 256 array def
+ 0 1 255 { Encoding exch /.notdef put } for
+DATA
+ for($i=0; $i<=256; $i++)
+ {
+ $_ = unpack("ai4", $BoundingBox[$i]);
+ print TYPE3 "Encoding $i $Encoding[$i] put\n" if $_ eq "d";
+ }
+
+ print TYPE3 "/BoundingBoxes $total_chars dict def\n";
+ print TYPE3 "BoundingBoxes begin\n";
+ print TYPE3 "/.notdef { 0 0 0 0 } def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]);
+ print TYPE3 "$Encoding[$i] [ $llx $lly $urx $ury ] def\n"
+ if $_ eq "d";
+ }
+ print TYPE3 "end %BoundingBoxes\n";
+
+
+ print TYPE3 "/Metrics $total_chars dict def\n";
+ print TYPE3 "Metrics begin\n";
+ print TYPE3 "/.notdef 0 def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ ($_, $llx, $lly, $urx, $ury) = unpack("ai4",$BoundingBox[$i]);
+ $diff = $urx - $llx;
+ print TYPE3 "$Encoding[$i] $diff def\n" if $_ eq "d";
+ }
+ print TYPE3 "end %Metrics\n";
+
+
+ print TYPE3 "/CharProcs $total_chars dict def\n";
+ print TYPE3 "CharProcs begin\n";
+ print TYPE3 "/.notdef { } def\n";
+ for($i=0; $i<=256; $i++)
+ {
+ $_ = unpack("ai4", $BoundingBox[$i]);
+ if ($_ eq "d")
+ {
+ open(CHAR, "$MFfile.$i")||
+ die "Can't open file $MFfile.$i\n";
+ $code = ""; #"100 100 scale\n";
+ while (<CHAR>)
+ {
+ $code .= $_ if $_ !~ /^%/;
+ }
+ close CHAR;
+ $code =~ s/showpage\n*//mg; #eliminate showpage
+ $code =~ s/\d setgray//mg; #eliminate setgray
+ $code =~ s/(\d*)\.\d+/$1/mg; #chop decimal digits
+ print TYPE3 $Encoding[$i], " { %\n";
+ if ($eofill)
+ {
+ $code =~ s/gsave fill/GSAVE FILL/mg; # save for soon restore
+ $code =~ s/fill//mg; # eliminate fill
+ $code =~ s/newpath//mg; # eliminate fill
+ $code =~ s/GSAVE FILL/gsave fill/mg; # restore
+ print TYPE3 $code, "eofill\n";
+
+ }
+ else
+ {
+ print TYPE3 $code;
+ }
+ print TYPE3 "} bind def\n";
+ }
+ }
+ print TYPE3 "end %CharProcs\n";
+
+ print TYPE3 <<BUILDGLYPH;
+ /BuildGlyph {
+ exch
+ begin
+ dup
+ Metrics exch get % get x displacement
+ 0 % set y displacement
+ 2 index
+ BoundingBoxes
+ exch get aload pop
+ setcachedevice
+ CharProcs exch get
+ exec
+ fill
+ end
+ } def
+ currentdict
+end
+/$MFfile exch definefont
+pop
+BUILDGLYPH
+close TYPE3;
+
+
+
+
+ if (!$nodel)
+ {
+ unlink @EPSFs;
+ unlink "$MFfile.log", "$MFfile.tfm";
+ }
+
+print "\n$MFfile $MFfile <$MFfile.pt3\n";
+
diff --git a/fonts/utilities/mff-29/CONTENTS b/fonts/utilities/mff-29/CONTENTS
new file mode 100644
index 0000000000..cb3d678d6d
--- /dev/null
+++ b/fonts/utilities/mff-29/CONTENTS
@@ -0,0 +1,69 @@
+total 238
+-rw-r--r-- 1 pdc 3686 Jul 6 14:08 CONTENTS
+-rw-r--r-- 1 pdc 1515 Jul 6 13:37 COPYING
+-rw-r--r-- 1 pdc 866 Oct 10 1991 DITKO
+-rw-r--r-- 1 pdc 392 Dec 11 1991 EBCDIC
+-r--r--r-- 1 pdc 2073 Jul 6 13:21 EXAMPLES
+-rw-r--r-- 1 pdc 1280 Jul 6 13:33 FCMFONTS
+-r--r--r-- 1 pdc 2261 Jul 6 13:21 INSTALL
+-r--r--r-- 1 pdc 5830 Jul 6 13:49 LIST
+-r--r--r-- 1 pdc 1022 Jul 6 13:21 MACHINES
+-rw-r--r-- 1 pdc 5103 Jul 6 13:57 MANIFEST
+-rw-r--r-- 1 pdc 833 Nov 21 1991 MFLOGO
+-r--r--r-- 1 pdc 5615 Jul 6 14:02 NEWS
+-rw-r--r-- 1 pdc 945 Jul 6 14:03 README
+-r--r--r-- 1 pdc 5875 Jul 6 13:21 SunPRO.mk
+-r--r--r-- 1 pdc 4837 Jul 6 13:21 TEST
+-r--r--r-- 1 pdc 4393 Jul 6 13:21 UNIX.mk
+-r--r--r-- 1 pdc 1172 Jul 6 13:21 al_file.c
+-r--r--r-- 1 pdc 2855 Jul 6 13:21 al_init.c
+-r--r--r-- 1 pdc 4017 Jul 6 13:21 argloop.c
+-r--r--r-- 1 pdc 2233 Jul 6 13:21 argloop.h
+-r--r--r-- 1 pdc 2266 Jul 6 13:21 assoc.c
+-r--r--r-- 1 pdc 1062 Jul 6 13:21 assoc.h
+-r--r--r-- 1 pdc 5009 Jul 6 13:21 config.x
+-rw-r--r-- 1 pdc 1540 Dec 5 1991 ditko.mff
+-rw-r--r-- 1 pdc 253 Apr 24 1991 ditko.tex
+-r--r--r-- 1 pdc 10169 Jul 6 13:23 dk.mf
+-rw-r--r-- 1 pdc 9999 Nov 5 1991 dkalpha.mf
+-rw-r--r-- 1 pdc 2401 Apr 24 1991 dkpunct.mf
+-rw-r--r-- 1 pdc 319 Apr 24 1991 dksym.mf
+-r--r--r-- 1 pdc 3640 Jul 6 13:21 error.c
+-rw-r--r-- 2 pdc 292 Aug 22 1991 example.mffrc
+-r--r--r-- 1 pdc 963 Jul 6 13:21 fatal.h
+-rw-r--r-- 1 pdc 1457 Jul 6 13:31 fcm.log
+-rw-rw-rw- 1 pdc 5376 Apr 23 21:46 fcm.mf
+-rw-r--r-- 1 pdc 1735 Apr 23 13:01 fcm.mff
+-r--r--r-- 1 pdc 1161 Jul 6 13:21 fgetword.c
+-r--r--r-- 1 pdc 1500 Jul 6 13:21 findfile.c
+-r--r--r-- 1 pdc 7830 Jul 6 13:21 fx.c
+-r--r--r-- 1 pdc 846 Jul 6 13:21 fx.h
+-rw-r--r-- 1 pdc 346 May 23 1991 gray.mf
+-r--r--r-- 1 pdc 1104 Jul 6 13:21 magstep.c
+-r--r--r-- 1 pdc 316 Jul 6 13:21 magstep.h
+-rw-r--r-- 1 pdc 851 Apr 24 1991 mf.mf
+-rw-r--r-- 1 pdc 1477 Jul 2 1989 mfbrackets.mf
+-rw-r--r-- 1 pdc 6152 Dec 16 1989 mfcaps.mf
+-rw-r--r-- 1 pdc 2123 Jul 2 1989 mfcommas.mf
+-rw-r--r-- 1 pdc 2077 Mar 12 1991 mfdigits.mf
+-rw-r--r-- 1 pdc 20539 Dec 2 1991 mff.1
+-r--r--r-- 1 pdc 31536 Jul 6 13:21 mff.c
+-rw-r--r-- 1 pdc 581 Sep 13 1991 mflogo.mff
+-rw-r--r-- 1 pdc 3282 Dec 16 1989 mfmacros.mf
+-rw-r--r-- 1 pdc 494 Mar 30 1990 mfparams.mf
+-rw-r--r-- 1 pdc 861 Apr 24 1991 mfpunct.mf
+-rw-r--r-- 1 pdc 2192 May 28 1991 searchpath.1
+-r--r--r-- 1 pdc 1037 Jul 6 13:21 searchpath.c
+-r--r--r-- 1 pdc 255 Jul 6 13:21 searchpath.h
+-r--r--r-- 1 pdc 1658 Jul 6 13:21 stdc.h
+-r--r--r-- 1 pdc 1283 Jul 6 13:21 strdup.c
+-r--r--r-- 1 pdc 937 Jul 6 13:21 stritem.c
+-r--r--r-- 1 pdc 2417 Jul 6 13:21 strmisc.h
+-r--r--r-- 1 pdc 1161 Jul 6 13:21 strword.c
+-rwxr-xr-x 1 pdc 2025 Apr 3 12:00 testfont
+-rw-r--r-- 1 pdc 3097 Aug 23 1991 testfont.1
+-rw-r--r-- 1 pdc 1524 Jul 6 13:32 tmp.dvi
+-rw-r--r-- 1 pdc 254 Jul 6 13:32 tmp.log
+-rw-r--r-- 1 pdc 263 Jul 6 13:32 tmp.tex
+-r--r--r-- 1 pdc 158 Jul 6 14:06 version.h
+-r--r--r-- 1 pdc 1637 Jul 6 13:21 xstdio.h
diff --git a/fonts/utilities/mff-29/COPYING b/fonts/utilities/mff-29/COPYING
new file mode 100644
index 0000000000..7de603b702
--- /dev/null
+++ b/fonts/utilities/mff-29/COPYING
@@ -0,0 +1,29 @@
+ = COPYING =
+
+The mff program and associated files are copyright (c) 1991/2 Damian Cugley.
+
+1. You can compile, use, copy and distribute this software without fee
+provided (a) this copyright notice and permissions are preserved and (b)
+neither my name nor the the name of Oxford University are used in any
+related promotion or publicity without prior, written permission.
+
+2. You can modify this software provided (a) you make no deletions; (b)
+you mark all changes clearly (including in the version number message);
+and (c) if you distribute it, you change the name.
+
+3. This software is provided for free, on an "as-is" basis, without
+express or implied warranty.
+
+The intention of (2) is to prevent a proliferation of incompatable
+versions with the same name. Commenting out code does not count as a
+deletion. If you have improvements or bug fixes, please forward them to
+me rather than distributing a new version.
+
+ /-------------------------\ "Share and enjoy."
+ | Damian Cugley |
+ | Computing Laboratory | /-----------------------------------------\
+ | 11 Keble Road | | JANet : pdc@uk.ac.oxford.prg |
+ | Oxford OX1 3QD | | Internet: pdc@prg.oxford.ac.uk |
+ | United Kingdom | | BITNET : PDC%UK.AC.OXFORD.PRG@UKACRL |
+ | +44 865 273838 x73199 | | UUCP : pdc%uk.ac.oxford.prg@ukc.uucp |
+ \-------------------------/ \-----------------------------------------/
diff --git a/fonts/utilities/mff-29/DITKO b/fonts/utilities/mff-29/DITKO
new file mode 100644
index 0000000000..283e4dd754
--- /dev/null
+++ b/fonts/utilities/mff-29/DITKO
@@ -0,0 +1,22 @@
+ = DITKO =
+
+Ditko is a METAFONT font designed and implemented by Damian Cugley. It
+is the logo font of the fanzine STOMPING SCENE -- this is why letters
+not in "cegimnopst" are unfinished or missing! I may add new letters
+when I have spare time and energy.
+
+The letters are designed to work stacked vertically as well as
+horizontally. The STOMPING SCENE logo is currently produced with code
+similar to that in ditko.tex.
+
+The name Ditko was suggested by Brendan McCarthy, after Steve Ditko (a
+comic-book artist whose Doctor Strange comics used a similar style of
+lettering).
+
+This software is supplied as a freebie with the mff program, and is
+copyright (c) 1991 Damian Cugley. See the file COPYING for more
+information.
+
+The {{{ and }}} symbols in the program files (dk*.mf) are used by a
+folding editor I use to make editing long, flat files easier.
+
diff --git a/fonts/utilities/mff-29/EBCDIC b/fonts/utilities/mff-29/EBCDIC
new file mode 100644
index 0000000000..4cc44d8a5c
--- /dev/null
+++ b/fonts/utilities/mff-29/EBCDIC
@@ -0,0 +1,12 @@
+If you have received this package via electronic mail routed through
+brain-damaged EBCDIC gateways, some characters may be altered.
+
+------------------------------------------------------------------------
+ { } curly braces
+ % percent
+ ~ tilde
+ ^ circumflex
+ | vertical bar
+ \ backslash
+ ` backquote
+------------------------------------------------------------------------
diff --git a/fonts/utilities/mff-29/EXAMPLES b/fonts/utilities/mff-29/EXAMPLES
new file mode 100644
index 0000000000..e9ce67731c
--- /dev/null
+++ b/fonts/utilities/mff-29/EXAMPLES
@@ -0,0 +1,59 @@
+EXAMPLES 2.9.0 92/07/06 -- random examples of mff use
+
+mff ma55a5 ma55a7 ma55a10 ma56a5 ma56a7 ma56a10 ma75a5 ma75a7 ma75a10
+mff ma{55,56,75}a{5,7,10}
+
+ This creates a simple family of 9 fonts. (The second line is equivalent
+ to the first if your command shell has C-shell's brace notation.)
+
+mff -S -m0,h,1,2,3,4,5 cmr10 cmmi10 cmsy10
+
+ Using mff to create non-"mffified" fonts.
+
+
+mff ma{3,5,7}{5,6}a18 && testfont \\text ma{3,5,7}{5,6}a18
+
+ I used commands like this when designing Malvern -- after proofing a new
+ glyph, I would try it out in different weights and styles. testfont is
+ a shellscript that runs TeX on testfont.tex. The && ensures that if one
+ of the fonts cannot be created, testfont is not invoked.
+
+
+mff -f ditko dk65s72 dk35s72 && tex ditko.tex
+
+ (ditko.tex produces the logo that the fonts were created for.)
+
+
+grep '^ma' somedoc.fonts | ( cd ~/mf/Malvern; mff -vf - )
+
+ somedoc.fonts is a file with the names of fonts used by somedoc.tex, one
+ per line. This command finds a list of the Malvern fonts and invokes
+ mff to create them. The file could be created by using TeX code along
+ these lines:
+
+ \newwrite\fontlistfile \openout\fontlistfile=\jobname.fonts
+ \def\ldfont#1#2%
+ {%
+ \write\fontlistfile{#2}%
+ \def\subfont{\font#1=cmr10 }%
+ \font#1=#2\relax
+ }
+
+ \ldfont is used instead of \font (either immediately or through
+ some sort of auto-loading system). If the font is unavailable the
+ user can type "i\subfont" to use cmr10 instead for this run.
+
+
+mff -d300 -zCanonCX gray300 -d118 -zbitgraph gray118
+
+ I use this to create "gray" fonts for viewing proofs using GFtoDVI.
+
+
+mff -vf-
+
+ I sometimes run this in an X window when I am TeX'ing a document
+ with lots of Malvern in it after I've rm'd all the font files.
+ Whenever I get a "missing font" error message I simply stuff the
+ name of the font in the mff window and i\subfont into the TeX
+ window. Next TeX run the font is available. (The -v is so that the
+ #{{{...#}}} lines tell me when it has finished.)
diff --git a/fonts/utilities/mff-29/FCMFONTS b/fonts/utilities/mff-29/FCMFONTS
new file mode 100644
index 0000000000..261729c4c6
--- /dev/null
+++ b/fonts/utilities/mff-29/FCMFONTS
@@ -0,0 +1,30 @@
+ mff fonts based on the CMR programs.
+
+ I have never been able to decide exactly what to call these fonts. I
+ have always thought of Computer Modern, CM Sans-Serif and CM Typewriter
+ as separate families in one CMR "meta-family", but that may or may not
+ jar with your understanding of Knuth's intent... :-)
+
+ From a Platonist's point of view, CM is a perfectly-formed concept of a
+ typeface, floating about "out there" and what I have here is merely a
+ new implemntation of it. So calling it (something)CM is reasonable. To
+ fit in with Karl Berry's naming system, they should all bre prefixed
+ with a foundry letter; I shall use "f" ("freeware") for now.
+
+ Thus we have
+ fcm Computer Modern very similar to cmr or cmti
+ fcm?s CM Sanserif very similar to cmss
+ fcm?t CM Typewriter very similar to cmtt
+ fcm?st CM Sanserif Typewriter
+
+ e.g., mff -ffcm fcmr12 fcmrs12 fcmrst12
+
+ There are two obvious ways to store these files:
+
+ -- put the mf file in /usr/local/lib/tex/mf/inputs and fcm.mff in
+ a global mff file directory such as /usr/local/lib/tex/mf/mff; or
+
+ -- put the the fcm.mf files in their own directory and put
+ the fcm.mff file there as mff.rc (then the -f option is not
+ needed so long as you cd there first).
+
diff --git a/fonts/utilities/mff-29/INSTALL b/fonts/utilities/mff-29/INSTALL
new file mode 100644
index 0000000000..3ba0b29bf2
--- /dev/null
+++ b/fonts/utilities/mff-29/INSTALL
@@ -0,0 +1,48 @@
+INSTALL 2.9.0 92/07/06
+
+ = INSTALLATION (UNIX systems) =
+
+0. mff is now distributed as a collection of files instead of placing
+ some files in subdirectories (to make it work with the Aston TeX
+ archive). You may want to re-organize them yourself.
+
+ If you received your copy via an archiver with strange ideas about
+ filenames, files without suffixes (e.g., README, MANIFEST) will have
+ been renamed to end in .txt (readme.txt, manifest.txt).
+
+1. Read the files with names in all-capitals (or ending .txt) first.
+
+2. Make a link/copy of one of the .mk files with the name Makefile.
+ Edit so that IBIN etc. are set to a reasonable values (such as
+ /usr/local/bin, if you have write access to that).
+
+ You will also want to alter RCDIR to specify a suitable
+ config_rc_dir, the name of a directory that mff.rc can go in (say
+ /usr/local/lib or /users/you/lib), and put mff.rc there.
+
+ If you are using SunPRO.mk, you will need to "mkdir `arch`" so that
+ there is a subdir to put binaries in.
+
+3. Edit the manual page mff.1 so that the strings RC and MJ are defined to
+ be the directories mff.rc and the source are in respectively.
+
+4. "make all" ought to compile mff and searchpath. "make install"
+ attempts to cp the binary to the directory $(IBIN) and also does
+ install-lib. "make install-lib" places a copy of the libary in the
+ $(ILIB) directory. "make install-lib-g" does the same, but with the
+ -g flag (producing a library suitable to be linked with a program
+ being debugged).
+
+5. A copy of mff.1 belongs in /usr/local/man/man1 or the equivalent on
+ your system. Depending on what you do with the libargloop.a
+ library, argloop.3 and findfile.3 are perhaps best left with the
+ source code.
+
+ The man pages have been proofed both using man(1) and [gt]roff(1).
+
+6. If you must modify mff, change the version number message by appending a
+ *lower case letter* to the version number and adding your (user)name and
+ date last modified. Please report bugs or suggestions for improvements
+ to me at the address in the COPYING file. If you successfully compile
+ and your system/machine is not in the MACHINES file, let be know so I
+ can celebrate :-). Thanks.
diff --git a/fonts/utilities/mff-29/LIST b/fonts/utilities/mff-29/LIST
new file mode 100644
index 0000000000..efe034dea6
--- /dev/null
+++ b/fonts/utilities/mff-29/LIST
@@ -0,0 +1,150 @@
+LIST 1.1.4 92/07/06 -*-text-*-
+
+
+ = MALVERN & MFF MAILING LIST =
+
+WHAT THIS LIST IS FOR
+
+ This list is for announcements, bug reports and discussion of two
+ interrelated software packages:
+
+ * Malvern, a METAFONT font definition, and
+
+ * mff, a simple wrapper about METAFONT that makes maintaining such a
+ family of font files more convenient.
+
+ (mff can be used to make other fonts, but Malvern is currently the only
+ publically-available, "real" font written to take full advantage of
+ mff's features.)
+
+ Malvern is still being developed, but is made available for interested
+ people to try it out and offer comments and suggestions. This list
+ might carry occasional discussions on the design of the face as a face
+ as well as as computer software.
+
+ The older releases of mff were called "mfjob". I have changed the
+ name to reduce confusion with Eberhard Mattes' MFjob (which is part
+ of his emTeX distribution for MS-DOS and OS/2 computers).
+
+HOW TO SUBSCRIBE OR UNSUBSCRIBE
+
+ Send a request to me, Damian Cugley, at the address
+
+ malvern-request@prg.ox.ac.uk
+
+
+HOW TO SEND MESSAGES TO THE LIST
+
+ Mail messages for everyone on the list to
+
+ malvern@prg.ox.ac.uk
+
+
+HOW TO GET THE PROGRAMS
+
+ At present they are on the Oxford archive-server (Oxford now has
+ Internet, and future releases will be placed on a local FTP server
+ in the usual manner which should need no further explanation). This
+ program will not send files of more than 100K and will not send two
+ shar files in one mail message, so you have to send N requests (in
+ separate mail messages) to get a N-part package.
+
+ Send a message of the form
+
+ send CATEGORY FILE
+
+ to <archive-server@prg.ox.ac.uk>, where CATEGORY is either "tex" for
+ Malvern or "prog" for mff, and FILE is one of:
+
+ mff-1.shar ) mff 2.8.2 (a C program for UNIX
+ mff-2.shar ) but mostly tested on Suns).
+ mff-3.shar ) Includes several sample meta-fonts.
+
+ malvern-0.3-1.shar ) Malvern 0.3 (*very* obselete)
+ malvern-0.3-2.shar )
+
+ The server also understands the messages "help" and "index CATEGORY".
+
+ The files are sent as "shell archives" -- ".shar" files. On UNIX
+ systems they are unpacked by running the Bourne shell (/bin/sh) on
+ them. Each part of the package unpacks into a directory named after
+ the version number to prevent clashes. (The Malvern files are old
+ and are still named according to a different system to the later
+ ones. Sorry.)
+
+
+WHAT MFF IS
+
+ mff grew out of a UNIX shellscript I had for running METAFONT and
+ installing the TFM and PK files. Its unique feature is that it will
+ parse a font name "mabi10" as "10pt Malvern bold italic" and run
+ METAFONT with variables like |weight| and |italicness| set appropriately
+ (all that is user-definable, of course). The driver file understands
+ these and sets stem widths etc. based on them. The practical upshot of
+ which is that I have *one* driver file ma.mf and a command like
+
+ mff ma{55,56,75}a{8,10,12}
+
+ creates 9 fonts automagically. mff isn't vital but it is *very*
+ convenient for creating fonts on the fly.
+
+ mff comes with sample meta-fonts thrown in for free!
+
+
+WHAT MALVERN IS
+
+ Malvern is a METAFONT font program; it can be used with the METAFONT
+ program to produce a font for use with Donald E Knuth's TeX
+ typesetting system (and some other systems as well).
+
+ Malvern grew out of my frustration with trying to get what I consider a
+ pleasing sanserif font out of the CM program files. Its design is
+ intended to be simple and elegant, a touch old-fashioned, and very
+ different from (say) CMSS or Helvetica (I consider this its main
+ attraction:-). It is intended to be used by itself as the main font of
+ a document, rather than being just another alphabet for mathematics!
+
+ It has at least the following eccentric features:
+
+ * rounded terminals and corners
+
+ * three sets of figures -- ranging, "text" (sort-of old-style) and
+ small figures for footnotes and fractions.
+
+ * four alphabets -- lower case, small, medium and large caps. Medium
+ caps can be used with a separate set of marks to make capital
+ composite letters.
+
+ * more currency signs and quote marks than anyone could want,
+ including the dubious PostScript florin sign and single guillemets.
+
+ * a raised "c" for writing names like "McDonald" (if you are feeling
+ like being eccentric).
+
+ Because it was developed with mff, it comes in any combination of
+ weights and widths, with roman and italic variations.
+
+ However, Malvern is UNFINISHED -- the italic corrections and kerning
+ table are half-done and I need to write some VF stuff to make fonts
+ with other encodings (e.g., the Cork encoding (TUGboat 11#4), which
+ includes various national letters). I'm making it available now so
+ interested people can try it out and offer advice.
+
+
+CURRENT STATE OF PLAY
+
+ Since Malvern release 0.3, I have started adding support for
+ creating fonts with the Cork encoding directly. I have support for
+ Karl Berry's name font system in the mff files, and my own eccentric
+ system which translates 12-pt Malvern 55 as ma55a12. (The names
+ suggested with the 0.3 distribution are obselete.)
+ I have revised the TeX macros that support malvern in the
+ process of documenting them. Experiments with "compression" (where
+ the chapes change cleverly when compressed rather thn just turning
+ into ellipses) have been discarded. Many character shapes have been
+ improved.
+ I can only work on Malvern during my scant spare time, however,
+ so these simple changes may take some time.
+ The next release will be "release 1".
+
+ I've installed mff 2.8.2 on the Oxford archive.
diff --git a/fonts/utilities/mff-29/MACHINES b/fonts/utilities/mff-29/MACHINES
new file mode 100644
index 0000000000..f83a03a8f8
--- /dev/null
+++ b/fonts/utilities/mff-29/MACHINES
@@ -0,0 +1,40 @@
+ = MACHINES ON WHICH mff HAS BEEN COMPILED =
+
+If you've got mff running and your system/machine isn't on this list,
+please let me know. Thanks.
+
+MACHINES 2.9.0 92/07/06
+
+------------------------------------------------------------------------
+ SYSTEMS
+
+BSD 4.1
+ Try setting BSD and NO_SIGLIST and see if it works
+
+BSD 4.2
+ Actually Sun UNIX 4.2 release 3.5+ (so far).
+
+TOS/GEMDOS/GNU C (Atari ST)
+ Atari STs with GNU C can compile and use mff. A collection of the
+ manual pages converted to plain text is separately available.
+
+SunOS 4.1+
+ This is what mff was developed on (under?).
+
+SysV R2
+ See Tardis under MACHINES below.
+
+------------------------------------------------------------------------
+ MACHINES
+
+Atari ST
+ See under TOS/GEMOS above.
+
+Sun-3 Sun UNIX 4.2 release 3.5+, and SunOS 4.1+
+
+Sun-4 SunOS 4.1+.
+
+Tardis
+ There's a GEC 63/30 called Tardis in Edinburgh running
+ heavily-modified SysVR2 that I have managed to bring mff 2.8.1
+ up on, but malloc(3) divirges unless I use -lmalloc??
diff --git a/fonts/utilities/mff-29/MANIFEST b/fonts/utilities/mff-29/MANIFEST
new file mode 100644
index 0000000000..651f57d373
--- /dev/null
+++ b/fonts/utilities/mff-29/MANIFEST
@@ -0,0 +1,187 @@
+ = MANIFEST =
+
+ This manifest is rather long because it includes brief descriptions of
+ what the files are for. CONTENTS is a shorter directory listing.
+
+ When archived on systems with braindead flle name conventions, such as
+ VMS, files with names in all-caps here may be renamed to end in ".TXT".
+
+
+ Documentation for installing mff
+
+README
+ A very short overview -- read this first...
+
+CONTENTS
+ Output of "ls -l" at some reasonable date.
+
+COPYING
+ Brief description when copies of these files may be made.
+
+EBCDIC
+ Sanity check -- BITNET gateways are known to corrupt e-mail.
+
+EXAMPLES
+ A few random examples of using mff, based on things I use it for.
+
+INSTALL
+ A brief description of how to install mff.
+
+MANIFEST
+ This list of what is in the distribution.
+
+NEWS
+ Summary of "visible" changes from previous versions.
+
+
+ Source code and makefiles
+
+SunPRO.mk
+UNIX.mk
+ Makefiles [SunPRO.mk works with Sun's extended make program, which
+ is needed to get around Sun's extended incompatabilities]. Either link
+ one of these to `Makefile' or use `make -f unix.mk ...'
+
+config.x
+ C header file with site- and system-specific stuff in it. Used to
+ make config.h. You may need to extend it to include your own
+ system.
+
+stdc.h
+ Attempts to make this package compile sanely on ANSI-C and
+ non-ANSI-C systems -- or at least gcc and Sun's cc -- including
+ prototypes and void* vs. char *. A mess, sorry.
+ Also declares a couple of miscellaneous functions -- our system
+ lacks stdlib.h or whatever and GNU stddef.h conflicts with types.h.
+
+xstdio.h
+ Declarations for standard I/O -- this #include's <stdio.h> and gives
+ prototypes for some functions if NEEDPROTO is defined -- this is
+ necessary on non-ANSI-C systems using gcc.
+ Also declares fgetword().
+
+argloop.h
+assoc.h
+fatal.h
+fx.h
+magstep.h
+searchpath.h
+strmisc.h
+ Miscellaneous C header files.
+
+al_file.c
+al_init.c
+argloop.c
+assoc.c
+error.c
+fgetword.c
+findfile.c
+fx.c
+magstep.c
+mff.c
+searchpath.c
+strdup.c
+stritem.c
+strword.c
+ C source code. mff.c and searchpath.c are programs. The rest are
+ modules that form part of them and are packed into libargloop.a.
+
+
+ Documentation for mff itself
+
+ I have a semi-completed TeX doc for mff, which is not in the
+ distribution (yet).
+
+numeric.t
+ Summary of numeric style descriptions in the style of Univers (65 is
+ demibold, 76 is bold oblique, etc.).
+
+argloop.3
+fatalf.3
+findfile.3
+mff.1
+mff.3
+searchpath.1
+shar.1
+stritem.3
+strword.3
+testfont.1
+xmalloc.3
+ Manual "pages" (in troff -man format) for the programs and some of
+ the modules in libargloop.a. You may want to create subdirs man1 and
+ man3 for these.
+
+mff.rc
+ A site startup file for mff. You might like to edit this to reflect
+ your site. [You shouldn't set -T and -P here unless those directories
+ are world-writable.] This might go in /usr/local/mff or /usr/local/lib,
+ say, and the rc_dir in config.h altered to match.
+
+example.mffrc
+ A copy of my ~/.mffrc. On some braindead systems you may find this
+ renamed EXAMPLE.MFF or worse, but on those systems .mffrc files are not
+ used anyway.
+
+
+testfont
+ Semi-useful shellscript. `testfont' is a wrapper around Knuth's
+ testfont.tex.
+
+
+ Example mff-based fonts
+
+ Since these come free I hope you don't expect too much of them ...
+ Each font set has a brief description of the font in a file with a
+ name in caps named after the family (or family group) name, a mff
+ startup file, and METAFONT files starting with the family
+ abbreviation.
+
+ These files are no longer split off into subdirectories of the
+ distribution, for the sake of some archivers. There are two obvious
+ ways to organize these files on your system:
+
+ -- put all the .mff files in some directory /usr/local/lib/tex/mf/mff,
+ say, and the METAFONT files in /usr/local/lib/tex/mf/inputs; then
+ (assuming that the .mff file directory is put in MFFPATH) you would
+ create fonts with command lines like "mff -f ditko dk65s72"; or
+
+ -- make subdirectories for each of the three font groups, and rename
+ the DITKO to Ditko/README, and ditko.mff to Ditko/mff.rc
+ and put the dk*.mf files there; then you would create fonts with
+ commands like "cd Ditko; mff -f dk65s72".
+
+FCM
+fcm.mff
+fcm.mf
+ Examples of generic driver files for three font families using the
+ Computer Modern character programs.
+
+MFLOGO
+mflogo.mff
+mf.mf
+mfbrackets.mf
+mfcaps.mf
+mfcommas.mf
+mfdigits.mf
+mfmacros.mf
+mfparams.mf
+mfpunct.mf
+ Example font which clones Knuth's METAFONT logo (logo10 etc.).
+
+DITKO
+ditko.mff
+ditko.tex
+dk.mf
+dkalpha.mf
+dkpunct.mf
+dksym.mf
+ Example (incomplete) logo font.
+
+gray.mf
+ A generic light-grey "grayfont" for use with GFtoDVI. You use mff's
+ concept of size as the resolution of the font -- thus gray300, gray118,
+ whatever. See EXAMPLES.
+
+------------------------------------------------------------------------
+These files copyright (C) 1991, 1992 Damian Cugley
+See file COPYING for details.
diff --git a/fonts/utilities/mff-29/MFLOGO b/fonts/utilities/mff-29/MFLOGO
new file mode 100644
index 0000000000..d0c6a991f3
--- /dev/null
+++ b/fonts/utilities/mff-29/MFLOGO
@@ -0,0 +1,20 @@
+METAFONT files starting "mf-" are used in my version of Knuth's METAFONT
+logo font, extended to cover the whole alphabet and a couple of
+punctuation characters. mflogo.mff is a corresponding mff startup file.
+Either put all of them in their own directory and rename it mff.rc, or
+put them in global mf and mff directories.
+
+It might be amusing to use this font to quote font names --
+
+ \font\tenmf=mf10 \newfam\mffam \def\mf{\fam\mffam\tenmf}
+ ...
+ The font {\mf CMR}10 has ...
+
+This code is old (mid/late 1989) and I have no particular
+wish to do anything much with it...
+
+I've called it "mf" (for METAFONT) rather than "logo" (a) because there
+might conceivably be the need for more than one "logo" font in the
+world, so "logo" was a rather silly name, and (b) to distinguish my
+(per)version of the logo font from the original.
+
diff --git a/fonts/utilities/mff-29/NEWS b/fonts/utilities/mff-29/NEWS
new file mode 100644
index 0000000000..718993569a
--- /dev/null
+++ b/fonts/utilities/mff-29/NEWS
@@ -0,0 +1,163 @@
+NEWS 2.9.0 92/07/06 -- list of changes to mff
+
+
+ = CHANGES SINCE MFF 2.8 =
+ pdc Mon. 6 July 1992
+
+
+You can install fonts on a different filesystem
+
+ Previously if the directory specified by -T or -P was on a different
+ filesystem, on some systems mff would fail with the message
+ "cross-device link". Now mff tries to make a copy of the file if
+ plain linking fails.
+
+
+A "m" can be used in the <size> part of font names to use mm
+
+ For example, ma55a3m5 is 3.5-mm Malvern 55 (about the same as ma55s10,
+ as it happens).
+
+
+"shar" dropped from the distribution
+
+
+-v options accumulate to increase verbosity
+
+ Just -v prints only the #{{{ and #}}} lines; more -v options cause
+ mff to be more verbose. I added this feature to make "mff -vf-"
+ more useful. The -n output is simplified.
+
+
+rejigged the Computer Modern clone fonts
+
+ The CM clones now all have names strating `fcm' to suit Karl Berry's
+ naming scheme: fcm? is like cm?, fcm?s is like cmss?, fcm?t is like
+ cmtt?, and fcm?st is like a cheap electric typewriter.
+
+
+renamed KM to CM
+
+ CM now stands for Computer Modern; it is very similar to Knuth's
+ Computer Modern Roman/Text Italic. I have also added the option of
+ numeric style names to the rc.mff file -- cm55s12 is roman, cm56s12 is
+ italic and cm75s12 is boldface.
+
+
+Facilities for brain-damaged filesystems
+
+ A friend of mine owns an Atari ST, which uses an MS-DOS-like
+ filesystem. When compiled on such a machine, mff uses
+ commas/semicolons in its searchpath(s) and understands backslashes
+ in file names (it also allows forward slashes, on the expectation
+ that something like the GNU library filename-mapping is being used).
+
+ Certain filesystems -- including the MS-DOS system one -- cannot
+ deal with filenames of the length needed by TeX fonts. mff
+ understands font templates like C:\FONTS\%f\%n.%p and now if the
+ subdirectory C:\FONTS\%f is missing it will attempt to create it.
+ Further, since FOO.300PK and FOO.300GF may no longer be distinct
+ names, the GFtoPK processor is requested to produce an intermediate
+ file called FOO.PK instead (which is then renamed to whatever the -P
+ template specifies, by default FOO/300.PK).
+
+ A proper ST distribution would also include plain-text documentation
+ rather than nroff manual pages, and a simpler makefile. I'm
+ part-way there.
+
+
+rc.mff changed to mff.rc
+
+ It seemed to make sense at the time for startup files to be named rc.mff
+ because other mff files end in ".mff". However, for consistency with
+ the MS-DOS-filenames versions, I have changed back to using "mff.rc" as
+ the name. (There is a CPP macro that canels this change.)
+
+
+many small internal changes
+
+ Less dependence on newer libary functions (an attempt to be more
+ portable). More syntax errors produce an error message instead of
+ mysterious behaviour. The association-list module has been
+ rewritten with a simpler, cleaner implementation. The code is more
+ portable than it was. Some subtle bugs have been fixed.
+
+
+more man pages
+
+
+
+ = CHANGES SINCE MFJOB 2.7.1 =
+
+Damian Cugley <pdc@prg.ox.ac.uk> Sat. 1 June 1991
+
+
+mfjob has been renamed mff
+
+ This is to prevent confusion with Eberhard Mattes' MFjob. MFjob does a
+ similar job to mff, and is part of the emTeX distribution for MS-DOS and
+ OS/2 personal computers.
+
+ This means that files named after the program -- such as .mfjobrc -- now
+ have new names. While I was at it I changed the per-project startup
+ file to rc.mff rather than .mffrc; this makes it a visible file which is
+ probably more sensible. The system startup file was renamed rc.mff to
+ match.
+
+
+the first input command -- a hack to get the name right -- is removed
+
+ This means that it does not produce empty <font name>.mf files.
+ Instead METAFONT/GFtoPK creates the TFM and GF files as <driver>.tfm and
+ <driver>.XXXpk (because jobname is set to the driver name not the font
+ name). These are renamed to <font name>.tfm and <font name>.XXXpk in
+ the appropriate directories.
+
+ To support this, the -T and -P options are now *filename* templates not
+ *directory* templates. %f.tfm and %f.%n%p are appended if necessary, so
+ directory names can still be used.
+
+ A side effect is that only one log file is produced per driver file,
+ instead of one per font. This is usually an advantage -- unless there
+ is some sort of error (in which case mff terminates and the log file is
+ preserved) the log files are not wanted. This results in a lot less
+ clutter.
+
+ Another consequence is that `mff cmr12' does not work any more --
+ formerly it would input cmr12.mf and because this ended in `bye' the
+ second (spurious) `input' was ignored! Now a new option has been added
+ to suppress the parsing step altogether -- so `mff -S cmr12' now ought
+ to work.
+
+
+Font sizes can include p for a decimal point
+
+ For those people that need such things, ma7p5 can be used to mean 7.5-pt
+ Malvern. Note that this means you can not have a suffix ending in
+ <digit>p.
+
+
+Configuration now all in Makefile -- -D directives override config.h
+
+
+man pages for shar and testfont
+
+
+gray.mf -- a simple hackette for making grayfonts easily
+
+
+a small program searchpath added
+
+ This is a "corollary" to the searchpath module that is used by mff. It is
+ only useful in shellscripts (in the style of dirname(1) and basename(1)).
+
+
+some bug fixes
+
+
+*
+Local Variables:
+mode: text
+fill-prefix: " "
+fill-column: 76
+End:
diff --git a/fonts/utilities/mff-29/README b/fonts/utilities/mff-29/README
new file mode 100644
index 0000000000..06d7519547
--- /dev/null
+++ b/fonts/utilities/mff-29/README
@@ -0,0 +1,21 @@
+mff -- simple METAFONT font-creation program -- distribution 2.9
+
+mff is a program for maintaining TeX font families using METAFONT. It
+is most useful when the font programs are written to take advantage of
+its special features; but even if they are not it still has its uses.
+
+MANIFEST is a list of files. INSTALL has installation hints.
+
+mff was developed on a SunOS system. I would appreciate suggestions on
+portability.
+
+NB: mff used to be called mfjob; the name was changed to distinguish it
+from the MFjob that is part of Eberhard Mattes' emTeX distribution for
+MS-DOS and OS/2 machines.
+
+If you find mff useful or amusing, please send me a postcard to the
+address in the file COPYING.
+------------------------------------------------------------------------
+ mff is copyright (C) 1991, 1992 Damian Cugley.
+ See the file COPYING for information about making copies.
+
diff --git a/fonts/utilities/mff-29/SunPRO.mk b/fonts/utilities/mff-29/SunPRO.mk
new file mode 100644
index 0000000000..5c5196e0b9
--- /dev/null
+++ b/fonts/utilities/mff-29/SunPRO.mk
@@ -0,0 +1,210 @@
+# SunPRO.mk 2.9.0 92/07/06 makefile for mff -- SunPRO version
+
+# This Makefile uses some of the features of SunPRO(tm) make.
+# This is because our network has a mixture of Sun-3s and Sun-4s,
+# and I need to keep the binaries produced for each type of machine
+# separate. With SunPRO make I can arrange for the binaries to be
+# produced in subdirectories named after the architecture types.
+# The predefined macro $(TARGET_ARCH) says which architecture is
+# being used.
+
+# make all
+# to create progs in the subdirectory `arch`
+
+# make install IBIN=/usr/local/bin OPT=-O4 LDFLAGS=-s
+# to do "make all" and then copy progs into $(IBIN).
+
+.KEEP_STATE:
+
+ARCH=$(TARGET_ARCH:-%=%)
+OBJ=$(ARCH)
+BIN=$(OBJ)
+
+SUFFIX=
+
+# MACROS THAT GO INTO THE cc COMMAND
+
+CC=gcc -Wall
+OPT=-O
+NDEBUG=-DNDEBUG
+CFLAGS=$(OPT)
+
+RCDIR=/mclab/pdc/lib
+# RCDIR is the directory in which the "system-wide" rc.mff file is
+# to be found.
+# The default -- if the above line is commented out --
+# is the value in config.h; by default /usr/local/lib.
+
+CPPFLAGS=$(NDEBUG) $(MORECPPFLAGS)
+LDFLAGS=
+
+CP=cp -p
+RM=rm -f
+
+# Tell "make" how to do compilations
+# -- removed Sun's silly -target option which confuses gcc.
+COMPILE.c=$(CC) $(CFLAGS) $(CPPFLAGS) -c
+LINK.c=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
+
+$(OBJ)/%$(SUFFIX).o: %.c
+ $(COMPILE.c) -o $@ $<
+$(OBJ)/%.o: %.c
+ $(COMPILE.c) -o $@ $<
+
+# Definitions used in maintaining the TeX file that will
+# eventually accompany this:
+
+MAKEINDEX=/usr/local/lib/tex/bin4/makeindex
+MAKEINDEXFLAGS=-rl -s /mclab/pdc/tex/idx.makeindex
+
+IBIN=/mclab/pdc/bin/$(ARCH)
+ILIB=/mclab/pdc/lib/$(ARCH)
+
+########################################################################
+# PROGS
+
+PROGS=mff.c searchpath.c
+# source files for executables
+
+LIBFILE=libargloop$(SUFFIX).a
+LIB=$(OBJ)/$(LIBFILE)
+.PRECIOUS: $(LIB)
+
+MODULES=argloop.c al_file.c al_init.c \
+ findfile.c \
+ strword.c stritem.c strdup.c fgetword.c error.c
+# source files for modules in the argloop library
+
+all: $(PROGS:%.c=$(BIN)/%)
+install: $(PROGS:%.c=$(IBIN)/%) install-lib
+install-lib: $(ILIB)/$(LIBFILE)
+# There is an implicit rule that cp's files into install directories
+
+# Keywords that give certain macros different values:
+debug:
+ $(MAKE) all SUFFIX=-g OPT=-g LDFLAGS= NDEBUG= "CC=gcc -Wall"
+install-lib-g:
+ $(MAKE) install-lib \
+ SUFFIX=-g OPT=-g LDFLAGS= NDEBUG= "CC=gcc -Wall"
+clean:
+ $(RM) *.ln *.o $(PROGS:.c=) $(OBJ)/* $(LIB)
+
+MFF.o=$(OBJ)/mff$(SUFFIX).o $(OBJ)/assoc$(SUFFIX).o \
+ $(OBJ)/fx$(SUFFIX).o $(OBJ)/magstep$(SUFFIX).o
+MFF.lib=$(LIB)
+$(BIN)/mff: $(MFF.o) $(LIB)
+ $(LINK.c) -o $@ $(MFF.o) $(MFF.lib)
+
+SEARCHPATH.o=$(OBJ)/searchpath$(SUFFIX).o
+SEARCHPATH.lib=$(LIB)
+$(BIN)/searchpath: $(SEARCHPATH.o) $(LIB)
+ $(LINK.c) -o $@ $(SEARCHPATH.o) $(SEARCHPATH.lib)
+
+$(OBJ)/mff$(SUFFIX).o: mff.c stdc.h config.h xstdio.h argloop.h fatal.h \
+ searchpath.h assoc.h fx.h strmisc.h magstep.h \
+ version.h
+$(OBJ)/assoc$(SUFFIX).o:assoc.c stdc.h config.h xstdio.h strmisc.h assoc.h
+$(OBJ)/fx$(SUFFIX).o: fx.c stdc.h config.h xstdio.h fatal.h strmisc.h fx.h
+$(OBJ)/magstep$(SUFFIX).o: magstep.c stdc.h config.h magstep.h
+$(OBJ)/searchpath$(SUFFIX).o: searchpath.c xstdio.h stdc.h config.h \
+ searchpath.h
+
+$(OBJ)/al_file.o: al_file.c config.h xstdio.h stdc.h strmisc.h argloop.h
+$(OBJ)/al_init.o: al_init.c config.h xstdio.h stdc.h strmisc.h argloop.h
+$(OBJ)/argloop.o: argloop.c config.h xstdio.h stdc.h strmisc.h argloop.h
+$(OBJ)/error.o: error.c stdc.h config.h xstdio.h argloop.h fatal.h
+$(OBJ)/fgetword.o: fgetword.c xstdio.h stdc.h config.h
+$(OBJ)/findfile.o: findfile.c config.h strmisc.h stdc.h searchpath.h
+$(OBJ)/strdup.o: strdup.c fatal.h stdc.h config.h strmisc.h
+$(OBJ)/stritem.o: stritem.c strmisc.h stdc.h config.h
+$(OBJ)/strword.o: strword.c strmisc.h stdc.h config.h
+
+config.h: config.x
+ sed 's%/usr/local/lib%$(RCDIR)%' config.x > config.h
+
+########################################################################
+# LIBRARY
+
+# source for modules that go in the library
+
+$(LIB): $(LIB)($(MODULES:%.c=$(OBJ)/%.o))
+
+# default rule
+$(LIB)($(OBJ)/%.o): %.c
+ $(COMPILE.c) -o $% $<
+ $(AR) $(ARFLAGS) $@ $%
+ $(RM) $%
+ ranlib $@
+
+# I can't get @#$%& make to reliably ranlib after adding one or more
+# modules, so I have to make it do so every time.
+
+########################################################################
+# LINT SECTION (moan, moan)
+#
+# sun's lint libraries often seem inconsistent with the manual pages
+# and with reality.
+#
+# -n -lbsd -lm (BSD-compatibility check)
+# -- sprintf is given return type int not char * (!!)
+# -- void functions are given return type int
+# -- toupper is not defined
+# -lm -q (SunOS check)
+# -- errno is not defined
+
+CFILES=$(PROGS)
+LINTFILES=$(PROGS:.c=.ln)
+LINTFLAGS=-abh
+LINTLIB=llib-lmff.ln
+LINTLIBS=-n -lbsd -lm
+#LINTLIBS=-q -lm
+LINTGREP=egrep -v 'constant (argument to NOT|in conditional context)'
+
+lint: lint-mff lint-searchpath
+
+lint-%: %.c $(LINTLIB)
+ $(LINT.c) $*.c $(LINTLIB) $(LINTLIBS) | $(LINTGREP)
+
+$(LINTLIB): $(MODULES:.c=.ln)
+ $(LINT.c) -Cmff $(MODULES)
+
+########################################################################
+
+# Mysterious definitions that manitain the (unfinished) docs:
+
+DOC=mffman
+
+$(DOC).dvi: $(DOC).ind $(DOC).tex
+ tex $(DOC)
+
+$(DOC).ind: $(DOC).idx
+ $(MAKEINDEX) $(MAKEINDEXFLAGS) $(DOC)
+
+$(DOC).idx: $(DOC).tex
+ tex $(DOC)
+
+########################################################################
+# implicit rules:
+
+.SUFFIXES: .1 .3
+
+$(IBIN)/%: $(BIN)/%
+ $(CP) $< $@
+
+$(ILIB)/%: $(OBJ)/%
+ $(CP) $< $@
+
+########################################################################
+atari: atari/mff.1 atari/searchpath.1 atari/shar.1 atari/testfont.1 \
+ atari/argloop.3 atari/fatalf.3 atari/mff.3 atari/strword.3 \
+ atari/findfile.3 atari/stritem.3 atari/xmalloc.3
+
+atari-clean:
+ rm atari/*.[13]
+
+atari/%.1: man1/%.1
+ man2cat $< > $@
+
+atari/%.3: man3/%.3
+ man2cat $< > $@
+
diff --git a/fonts/utilities/mff-29/TEST b/fonts/utilities/mff-29/TEST
new file mode 100644
index 0000000000..fdb598ee16
--- /dev/null
+++ b/fonts/utilities/mff-29/TEST
@@ -0,0 +1,145 @@
+TEST 2.9.0 92/07/06 -- some quick tests of a newly-compiled mff -*-text-*-
+
+
+Output from mff is occasionally given, between lines of hyphens,
+indented in a tab stop. Otherwise a quick description of what it is
+supposed to do is given.
+
+Hope this helps. Suggestions for usefully automating all this welcome.
+
+
+mff
+ does nothing
+
+mff -V
+ prints version number and exits
+
+mff -D
+ Checks that it is successfully reading the startup files -- the
+ Z table is set in /usr/local/lib/rc.mff. In this example, the
+ local devices appear twice, because I ran mff in the source
+ directory, and this has a copy of the /usr/local/lib/mff.rc file:
+------------------------------------------------------------------------
+ mff: This is mff.c v2.8.1 -- pdc Fri. 28 June 1991
+ Z = {
+ 118=bitgraph
+ 300=CanonCX
+ 118=bitgraph
+ 300=CanonCX
+ 200=lowres
+ }
+ W = {}
+ C = {}
+ I = {}
+ J = {}
+ template = { }
+ DPI(s) = 300.
+ mag(s) = 1.
+ METAFONT = "mf"
+ GFtoPK = "gfto%p"
+ TFM dir. = "/mclab/pdc/tex/tfm"
+ PK dir. = "/mclab/pdc/tex/%d%p"
+------------------------------------------------------------------------
+
+mff -f ditko -n dk76s30
+
+ Now we want to see if it interpreting those tables reasonably.
+ This ought to produce the following output (modulo linebreaks
+ and different directory names):
+------------------------------------------------------------------------
+ mf '\mode = CanonCX; mag = 1; font_size 30pt#; weight=1.25;
+ hratio=1.00; slant=1/5; ; input dk; bye.'
+ mv dk.tfm /mclab/pdc/tex/tfm/dk76s30.tfm
+ gftopk dk.300gf
+ mv dk.300pk /mclab/pdc/tex/pk/CanonCX/dk76s30.300pk
+ rm dk.300gf
+------------------------------------------------------------------------
+ You ought to be able to pipe this into /bin/sh to create the font!
+
+ Now try the same command without the -n, which ought to run
+ METAFONT (you will see METAFONT's output) as above to create the
+ font. Voila!
+
+Now to try out some variations
+
+mff -fmflogo -nm -1,-h,0,h,1 mf55a10
+
+ This checks that mff is parsing lists of magsteps properly.
+ I've deleted some of its output below for clarity. Note the GF
+ numbers and values of mag.
+------------------------------------------------------------------------
+ mf '\mode = CanonCX; mag = 0.833333; font_size 10pt#; input mf; bye.'
+ ...
+ rm mf.250gf
+ mf '\mode = CanonCX; mag = 0.912871; font_size 10pt#; input mf; bye.'
+ ...
+ rm mf.274gf
+ mf '\mode = CanonCX; mag = 1; font_size 10pt#; input mf; bye.'
+ ...
+ rm mf.300gf
+ mf '\mode = CanonCX; mag = 1.09545; font_size 10pt#; input mf; bye.'
+ ...
+ rm mf.329gf
+ mf '\mode = CanonCX; mag = 1.2; font_size 10pt#; input mf; bye.'
+ ...
+ rm mf.360gf
+------------------------------------------------------------------------
+
+mff -fmflogo -na 12,14,17 mf55a10
+
+ This verifies that the at-sizes feature is working reasonably.
+ The numbers 1.2, 1.44 and 1.728 are numbers Knuth likes... :-)
+------------------------------------------------------------------------
+ mf '\mode = CanonCX; mag = 1.2; font_size 10pt#; input mf; bye.'
+ ...
+ mf '\mode = CanonCX; mag = 1.44; font_size 10pt#; input mf; bye.'
+ ...
+ mf '\mode = CanonCX; mag = 1.728; font_size 10pt#; input mf; bye.'
+ ...
+------------------------------------------------------------------------
+
+mff -n -P '' -T '' mf55a10
+mff -n -P . -T . mf55a10
+mff -n -P - -T - mf55a10
+
+ This is a test of whether it reacts sensibly to weird templates.
+ As you might expect from the manual entry, the first two create
+ fonts with appropriate names in the current directory, e.g.:
+------------------------------------------------------------------------
+ mf '\mode = CanonCX; mag = 1; font_size 10pt#; input mf; bye.'
+-> mv mf.tfm mf10.tfm
+ gftopk mf.300gf
+-> mv mf.300pk mf10.300pk
+ rm mf.300gf
+------------------------------------------------------------------------
+
+ The third of these omits the renaming altogether, leaving files
+ like mf.tfm instead of mf55a10.tfm. This is also in accordance
+ with the manual entry:
+------------------------------------------------------------------------
+ mf '\mode = CanonCX; mag = 1; font_size 10pt#; input mf; bye.'
+ gftopk mf.300gf
+ rm mf.300gf
+------------------------------------------------------------------------
+
+
+mff -fmflogo -n -M '' mf55a10
+mff -fmflogo -M '' mf55a10
+mff -fmflogo -M - mf55a10
+
+ The first of these carries on as usual. The second form
+ complains that the command string is empty. The third omits the
+ METAFONTing stage, which is useful if you have the GF and TFM
+ files and are too lazy to type the appropriate mv commands!
+
+mff -fmflogo -n -m '' mf55a10
+mff -fmflogo -n -m a,b mf55a10
+
+ the first does nothing but print a warning -- it has been given
+ a list of length zero. The gives a fatal syntax error.
+
+mff -vfmflogo -f-
+
+ This puts mff into a sort of interactive mode. Type font names
+ (like mf55a10) to create them, and CTRL-D to finish.
+
diff --git a/fonts/utilities/mff-29/UNIX.mk b/fonts/utilities/mff-29/UNIX.mk
new file mode 100644
index 0000000000..416f8b817e
--- /dev/null
+++ b/fonts/utilities/mff-29/UNIX.mk
@@ -0,0 +1,155 @@
+# UNIX.mk 2.9.0 92/07/06 -- Makefile for mff -- UNIX version
+
+# make all
+# to create progs this directory
+
+# make install IBIN=/usr/local/bin OPT=-O4 LDFLAGS=-s
+# to do "make all" and then copy progs into $(IBIN).
+
+SUFFIX=
+# Suffix added to .o and .a file basenames
+
+# MACROS THAT GO INTO THE cc COMMAND
+
+OPT=-O
+NDEBUG=-DNDEBUG
+CFLAGS=$(OPT)
+
+RCDIR=/mclab/pdc/lib
+# RCDIR is the directory in which the "system-wide" rc.mff file is
+# to be found.
+# The default -- if the above line is commented out --
+# is the value in config.h; by default /usr/local/lib.
+
+CPPFLAGS=$(NDEBUG) $(MORECPPFLAGS)
+LDFLAGS=
+
+CP=cp -p
+RM=rm -f
+
+# Tell "make" how to do compilations
+# -- removed Sun's silly -target option which confuses gcc.
+COMPILE=$(CC) $(CFLAGS) $(CPPFLAGS) -c
+LINK=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
+
+.SUFFIXES: $(SUFFIX).o
+.c$(SUFFIX).o:
+ $(COMPILE) -o $@ $<
+.c.o:
+ $(COMPILE) -o $@ $<
+
+IBIN=/mclab/pdc/tmp
+ILIB=/mclab/pdc/tmp
+
+########################################################################
+#
+# TARGETS for the make command...
+
+PROGS=mff.c searchpath.c
+# source files for executables
+
+LIBFILE=libargloop$(SUFFIX).a
+LIB=$(LIBFILE)
+.PRECIOUS: $(LIB)
+
+MODULES=argloop.c al_file.c al_init.c findfile.c \
+ strword.c stritem.c strdup.c fgetword.c error.c
+# source files for modules in the argloop library
+
+all: $(PROGS:.c=)
+install: all install-lib
+ $(CP) $(PROGS:.c=) $(IBIN)
+install-lib: $(LIB)
+ $(CP) $(LIB) $(ILIB)
+
+debug:
+ $(MAKE) all SUFFIX=-g OPT=-g LDFLAGS= NDEBUG= "CC=gcc -Wall"
+install-lib-g:
+ $(MAKE) install-lib \
+ SUFFIX=-g OPT=-g LDFLAGS= NDEBUG= "CC=gcc -Wall"
+clean:
+ $(RM) *.ln *.o $(PROGS:.c=) *.a
+
+########################################################################
+
+
+MFF_o=mff$(SUFFIX).o assoc$(SUFFIX).o fx$(SUFFIX).o magstep$(SUFFIX).o
+MFF_lib=$(LIB)
+mff: $(MFF_o) $(LIB)
+ $(LINK) -o mff $(MFF_o) $(MFF_lib)
+
+SEARCHPATH_o=searchpath$(SUFFIX).o
+SEARCHPATH_lib=$(LIB)
+searchpath: $(SEARCHPATH_o) $(LIB)
+ $(LINK) -o searchpath $(SEARCHPATH_o) $(SEARCHPATH_lib)
+
+mff$(SUFFIX).o: mff.c stdc.h config.h xstdio.h argloop.h fatal.h searchpath.h \
+ assoc.h fx.h strmisc.h magstep.h
+assoc$(SUFFIX).o: assoc.c stdc.h config.h xstdio.h strmisc.h assoc.h
+fx$(SUFFIX).o: fx.c stdc.h config.h xstdio.h fatal.h strmisc.h fx.h
+magstep$(SUFFIX).o: magstep.c stdc.h config.h magstep.h
+searchpath$(SUFFIX).o: searchpath.c xstdio.h stdc.h config.h searchpath.h
+
+# semi-automatically-produced dependencies:
+
+al_file.o: al_file.c config.h xstdio.h stdc.h strmisc.h argloop.h
+al_init.o: al_init.c config.h xstdio.h stdc.h strmisc.h argloop.h
+argloop.o: argloop.c config.h xstdio.h stdc.h strmisc.h argloop.h
+error.o: error.c stdc.h config.h xstdio.h argloop.h fatal.h
+fgetword.o: fgetword.c xstdio.h stdc.h config.h
+findfile.o: findfile.c config.h strmisc.h stdc.h searchpath.h
+strdup.o: strdup.c fatal.h stdc.h config.h strmisc.h
+stritem.o: stritem.c strmisc.h stdc.h config.h
+strword.o: strword.c strmisc.h stdc.h config.h
+
+config.h: config.x
+ sed 's%/usr/local/lib%$(RCDIR)%' config.x > config.h
+
+########################################################################
+# LIBRARY
+
+# source for modules that go in the library
+
+$(LIB): $(LIB)(argloop.o) $(LIB)(al_file.o) $(LIB)(al_init.o) \
+ $(LIB)(findfile.o) $(LIB)(strword.o) $(LIB)(stritem.o) \
+ $(LIB)(strdup.o) $(LIB)(fgetword.o) $(LIB)(error.o)
+
+# default rule
+.c.a:
+ $(COMPILE) -o $% $<
+ $(AR) $(ARFLAGS) $@ $%
+ $(RM) $%
+ ranlib $@
+
+# I can't get @#$%& make to reliably ranlib after adding one or more
+# modules, so I have to make it do so every time.
+# COmment out this line on non-ranlib systems (Sys V?)
+
+########################################################################
+# LINT SECTION (moan, moan)
+#
+# sun's lint libraries often seem inconsistent with the manual pages
+# and with reality.
+#
+# -n -lbsd -lm (BSD-compatibility check)
+# -- sprintf is given return type int not char * (!!)
+# -- void functions are given return type int
+# -- toupper is not defined
+# -lm -q (SunOS check)
+# -- errno is not defined
+
+CFILES=$(PROGS)
+LINTFILES=$(PROGS:.c=.ln)
+LINTFLAGS=-abh
+LINTLIB=llib-lmff.ln
+LINTLIBS=-n -lbsd -lm
+#LINTLIBS=-q -lm
+LINTGREP=egrep -v 'constant (argument to NOT|in conditional context)'
+
+lint: lint-mff lint-searchpath
+
+lint-%: %.c $(LINTLIB)
+ $(LINT.c) $*.c $(LINTLIB) $(LINTLIBS) | $(LINTGREP)
+
+$(LINTLIB): $(MODULES:.c=.ln)
+ $(LINT.c) -Cmff $(MODULES)
diff --git a/fonts/utilities/mff-29/al_file.c b/fonts/utilities/mff-29/al_file.c
new file mode 100644
index 0000000000..220d709702
--- /dev/null
+++ b/fonts/utilities/mff-29/al_file.c
@@ -0,0 +1,50 @@
+/* al_file.c 2.9.0 92/07/06 -- split-off part of argloop.c
+ *
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+ See argloop(3) for more information on this software module.
+-----------------------------------------------------------------------
+ */
+
+#include "config.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "strmisc.h" /* inludes <string(s).h> */
+#include "argloop.h"
+
+struct file
+{
+ FILE *fp;
+ char buf[1024]; /* maximum sized word this allows */
+};
+
+static const char *
+file_word(st)
+ struct file *st;
+{
+ return fgetword(st->buf, st->fp);
+}
+
+void
+file_free(st)
+ struct file *st;
+{
+ fclose(st->fp);
+ xfree(st);
+}
+
+Argloop_context *
+al_file(fp)
+ FILE *fp;
+{
+ struct file *st = (struct file *)xmalloc(sizeof (struct file));
+ Argloop_context *cxt = (Argloop_context *)xmalloc(sizeof (Argloop_context));
+
+ st->fp = fp;
+ cxt->data = (char *)st;
+ cxt->word = file_word;
+ cxt->free = file_free;
+ cxt->first = (char *)0;
+ return cxt;
+}
diff --git a/fonts/utilities/mff-29/al_init.c b/fonts/utilities/mff-29/al_init.c
new file mode 100644
index 0000000000..a6114b7a2f
--- /dev/null
+++ b/fonts/utilities/mff-29/al_init.c
@@ -0,0 +1,106 @@
+/* al_init.c 2.9.0 92/07/06 -- split-off part of argloop.c
+ *
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+ See argloop(3) for more information on this software module.
+-----------------------------------------------------------------------
+ */
+
+#include <sys/types.h> /* ino_t */
+#include <sys/stat.h>
+#include <sys/param.h> /* MAXPATHLEN */
+#include <ctype.h>
+
+#include "config.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "strmisc.h" /* inludes <string(s).h> */
+#include "argloop.h"
+
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
+#ifndef dir_sep_ch
+# define dir_sep_ch '/'
+#endif
+
+const char *progname; /* this allocates real storage */
+
+void
+argloop_init_files(argv0, opts)
+ const char *argv0;
+ Argloop_options *opts;
+{
+ char *getenv ARGS((const char *));
+#ifndef toupper
+ /*
+ * on some Sun systems, toupper is an (undeclared) function, not macro:
+ */
+ int toupper ARGS((int));
+#endif
+
+ char *progname_uppercase;
+ register char *t;
+ FILE *fp;
+ char scratch[MAXPATHLEN];
+ struct stat s;
+ ino_t home_rc = 0;
+
+ progname = (progname = strrchr(argv0, dir_sep_ch)) ? progname + 1 : argv0;
+ /* skip any directory component */
+
+ /*
+ * "system" startup file
+ */
+#ifdef RCFIRST
+ sprintf(scratch, "%s%crc.%s", config_rc_dir, dir_sep_ch, progname);
+#else
+ sprintf(scratch, "%s%c%s.rc", config_rc_dir, dir_sep_ch, progname);
+#endif
+ if (fp = fopen(scratch, "r"))
+ argloop(al_file(fp), opts);
+
+#ifdef NO_DOTRC
+ /*
+ * Single-user systems have no need for a "user" rc file.
+ * Thus "project" rc file only
+ */
+ sprintf(scratch, "%s.rc", progname);
+ if (fp = fopen(scratch, "r")) argloop(al_file(fp), opts);
+#else
+ /*
+ * "user" rc file and "project" rc file.
+ * Check that these are not both the same file.
+ */
+ sprintf(scratch, "%s%c.%src", getenv("HOME"), dir_sep_ch, progname);
+ if (fp = fopen(scratch, "r"))
+ {
+ fstat(fileno(fp), &s); home_rc = s.st_ino;
+ argloop(al_file(fp), opts);
+ }
+
+#ifdef RCFIRST
+ sprintf(scratch, "rc.%s", progname);
+#else
+ sprintf(scratch, "%s.rc", progname);
+#endif
+ if (fp = fopen(scratch, "r"))
+ {
+ fstat(fileno(fp), &s);
+ if (s.st_ino != home_rc) /* check not the same file as ~/.foorc */
+ argloop(al_file(fp), opts);
+ }
+#endif
+
+ /*
+ * Read the PROGNAME environment variable, if set:
+ */
+ progname_uppercase = strdup(progname);
+ for (t = progname_uppercase; *t; t++)
+ if (isalpha(*t) && islower(*t)) *t = toupper(*t);
+ sprintf(scratch, "%sINIT", progname_uppercase);
+ if (t = getenv(scratch)) argloop(al_string(t), opts);
+ xfree(progname_uppercase);
+}
diff --git a/fonts/utilities/mff-29/argloop.c b/fonts/utilities/mff-29/argloop.c
new file mode 100644
index 0000000000..a523081eb6
--- /dev/null
+++ b/fonts/utilities/mff-29/argloop.c
@@ -0,0 +1,178 @@
+/* argloop.c 2.9.0 92/07/06 - interpret command-line arguments
+ *
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+ See argloop(3) for more information on this software module.
+-----------------------------------------------------------------------
+ * 2.0
+ * created - Damian Cugley <pdc@oxford.prg> Fri 12 Jan 1990
+ * 2.1
+ * files as well
+ * 2.2
+ * Standard initalisiation files
+ * 2.3 - pdc Sun 25 Feb 1990
+ * Added the global variable |verbose| to argloop rather than importing
+ * it from the main program.
+ * 2.4 - pdc Mon 2 Apr 1990
+ * Added argloop_verbatim
+ * 2.5 - pdc Mon 14 May 1990
+ * -vf+qz is same as -v -f +q +z
+ * 2.7 - pdc Sat. 2 Mar. 1991
+ * uses simpler file format (less shell-like)
+ * Made properly reentrant (!)
+ * 2.7.1 - pdc Tue. 12 Mar. 1991
+ * Put xmalloc in strword.c & added strmisc header file
+ * 2.7.2 - pdc Fri. 21 June 1991
+ * Added support for MS-DOS filenames
+ */
+
+#include "config.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "strmisc.h" /* inludes <string(s).h> */
+#include "argloop.h"
+
+#ifndef NDEBUG
+int argloop_debug = 0;
+# define log1(X,A) if (argloop_debug) fprintf(stderr, X,A)
+#else
+# define log1(X,A)
+#endif
+
+int argloop_verbatim = 0;
+
+typedef char *(*Argloop_next_fn)ARGS((void));
+
+void
+argloop(cxt, opts)
+ Argloop_context *cxt;
+ Argloop_options *opts;
+{
+ register const char *p;
+ int flag; /* Boolean */
+ const char *arg;
+
+ if (!cxt) return;
+ arg = (cxt->first ? cxt->first : cxt->word(cxt->data));
+
+ while (arg)
+ {
+ log1("%%%%%s\n", arg);
+
+ if (argloop_verbatim || !(*arg == '-' || *arg == '+'))
+ opts->arg(0, arg); /* unflagged argument */
+ else
+ {
+ flag = (*arg == '-');
+ while (*++arg)
+ {
+ for (p = opts->optstring; *p && *p != *arg; p++)
+ ; /* search for flag letter */
+ if (!*p)
+ {
+ if (*arg == '-' || *arg == '+')
+ flag = (*arg == '-');
+ else
+ {
+ opts->error(*arg); return;
+ }
+ }
+ else if (flag && *(p + 1) == ':')
+ { /* this flag wants an argument too */
+ if (*++arg)
+ { /* use the remainder of this cmd-line arg */
+ opts->arg(*p, arg);
+ }
+ else
+ { /* get new cmd-line arg */
+ const char *t = cxt->word(cxt->data);
+
+ log1("%%%%%%\"%s\"\n", (t ? t : "[NIL]") );
+ opts->arg(*p, t);
+ if (!t)
+ {
+ if (cxt->free) cxt->free(cxt->data);
+ return;
+ }
+ }
+ break; /* from inner while loop */
+ }
+ else
+ opts->flag(*p, flag);
+ }
+ }
+ arg = cxt->word(cxt->data);
+ }
+ if (cxt->free) cxt->free(cxt->data);
+ xfree((addr)cxt);
+}
+
+
+
+/*
+ * How to use the above to parse command-line arguments
+ */
+
+struct argv { int argc; const char **argv; };
+
+static const char *
+argv_word(st)
+ struct argv *st;
+{
+ return ((--st->argc > 0) ? *++st->argv : (char *)0);
+}
+
+static void
+argv_free(st)
+ struct argv *st;
+{
+ xfree(st);
+}
+
+Argloop_context *
+al_argv(argc, argv)
+ int argc;
+ const char *argv[];
+{
+ struct argv *av = (struct argv *)xmalloc(sizeof (struct argv));
+ Argloop_context *cxt = (Argloop_context *)xmalloc(sizeof (Argloop_context));
+
+ av->argc = argc; av->argv = argv;
+ cxt->data = (char *)av; cxt->first = (char *)0;
+ cxt->word = argv_word;
+ cxt->free = argv_free;
+ return cxt;
+}
+
+
+static const char *
+string_word(st)
+ char **st;
+{
+ return strword((char *)0, st);
+}
+
+static void
+string_free(st)
+ char **st;
+{
+ xfree(st);
+}
+
+Argloop_context *
+al_string(string)
+ char *string; /* will be destroyed */
+{
+ Argloop_context *cxt;
+
+ if (!string)
+ return (Argloop_context *)0;
+
+ cxt = (Argloop_context *)xmalloc(sizeof (Argloop_context));
+ cxt->word = string_word;
+ cxt->free = string_free;
+ cxt->data = xmalloc(sizeof (char *));
+ cxt->first = strword(string, (char **)cxt->data);
+ return cxt;
+}
diff --git a/fonts/utilities/mff-29/argloop.h b/fonts/utilities/mff-29/argloop.h
new file mode 100644
index 0000000000..833ca8587a
--- /dev/null
+++ b/fonts/utilities/mff-29/argloop.h
@@ -0,0 +1,66 @@
+/* argloop.h 2.9.0 92/07/06 - read command line arguments
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+ See argloop(3) for more information on this software module.
+-----------------------------------------------------------------------
+ */
+
+#include "stdc.h"
+
+typedef void (*Argloop_flag_fn) ARGS((int,int));
+typedef void (*Argloop_arg_fn) ARGS((int, const char *));
+typedef void (*Argloop_error_fn) ARGS((int));
+typedef const char *(*Argloop_word_fn) ARGS((char *));
+typedef void (*Argloop_free_fn) ARGS((char *));
+
+typedef struct
+{
+ const char *optstring;
+ Argloop_flag_fn flag;
+ Argloop_arg_fn arg;
+ Argloop_error_fn error;
+} Argloop_options;
+
+typedef struct
+{
+ char *data; /* pointer to data cast to char * */
+ char *first; /* first arg, or NULL
+ * (for when 1st arg needs special treatment) */
+ Argloop_word_fn word;
+ Argloop_free_fn free;
+} Argloop_context;
+
+void argloop ARGS((Argloop_context *, Argloop_options *));
+
+Argloop_context *al_argv ARGS((int argc, const char **argv));
+/*
+ * argc and argv are assumed to be as at the start of main(), i.e.,
+ * the 0th member of argv is ingored.
+ */
+
+Argloop_context *al_string ARGS((char *string));
+
+Argloop_context *al_file ARGS((FILE *fp));
+
+void argloop_init_files ARGS((const char *argv0, Argloop_options *));
+
+/*
+ * |argv0| is |argv[0]|, i.e., the name of the program, possibly
+ * with the directory prefix; or simply the name of the program.
+ * This reads arguments from the following files (in this order):
+ * LIB_DIR/progname.rc (site-wide startup)
+ * (LIB_DIR is defined in ~pdc/src/include/config.h)
+ * $HOME/.prognamerc (startup for one user)
+ * .prognamerc (startup for one project)
+ * PROGNAMEINIT (an environment variable, not a file)
+ *
+ * And, for convenience, sets the |extern| char pointer progname
+ * to after the last `/' in |argv0|, so it can be used in messages.
+ */
+
+extern const char *progname;
+
+extern int argloop_debug; /* nonzero after `-D', usually */
+extern int argloop_verbatim; /* used for progs like `env' */
diff --git a/fonts/utilities/mff-29/assoc.c b/fonts/utilities/mff-29/assoc.c
new file mode 100644
index 0000000000..60f57b3064
--- /dev/null
+++ b/fonts/utilities/mff-29/assoc.c
@@ -0,0 +1,102 @@
+/* assoc.c 2.9.0 92/07/06 - maintain association list alterable by the user
+ * Created by Damian Cugley <pdc@oxford.prg> Fri 12 Jan 1990
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990,1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+ */
+#include "stdc.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "strmisc.h"
+#include "assoc.h"
+
+#define NEW(t) ((t *)xmalloc(sizeof (t)))
+
+const char * /* NULL if no definition */
+assoc(al, s)
+ Assoclist al;
+ const char *s;
+{
+ const char *t, *u;
+
+ for (; al; al = al->next)
+ for (t = al->s, u = s; *t && *t++ == *u++; )
+ if (!*u && *t == '=')
+ return t + 1;
+ return (char *)0;
+}
+
+Assoclist /* always NULL */
+assoc_destroylist(al)
+ Assoclist al;
+{
+ Assoclist tnext;
+
+ for (; al; al = tnext)
+ {
+ tnext = al->next;
+ xfree(al->s);
+ xfree(al);
+ }
+ return (Assoclist)0;
+}
+
+Assoclist
+assoc_add(al, s)
+ Assoclist al;
+ char *s; /* must already be malloc'd string */
+{
+ Assoclist tal = al; /* temp copy of original value */
+ const char *t, *u;
+
+ for (; al; al = al->next)
+ for (t = al->s, u = s; *t && *t++ == *u++; )
+ if (!*u && *t == '=')
+ {
+ xfree(al->s); /* dispose old association */
+ al->s = s;
+ return tal;
+ }
+ /* new association */
+ al = NEW(struct assoc_node);
+ al->s = s;
+ al->next = tal;
+ return al;
+}
+
+void
+assoc_print(al)
+ Assoclist al;
+{
+ printf("{\n");
+ for (; al; al = al->next)
+ printf("\t%s\n", al->s);
+ printf("}\n");
+}
+
+const char *
+assoc_match_backwards(al, s, pe)
+ Assoclist al;
+ const char *s;
+ const char **pe;
+{
+ const char *t, /* scans back from "=" in al->s */
+ *u, /* scans back from *pe in s */
+ *v; /* pointer to after the "=" in al->s */
+
+ for (; al; al = al->next)
+ {
+ if (*al->s == '=') return al->s + 1; /* empty KEY matches anything */
+ for (t = al->s; *t && *t != '='; t++)
+ ;
+ v = t + 1;
+ for (u = *pe; u > s && *--t == *--u; )
+ if (t == al->s)
+ {
+ *pe = u;
+ return v;
+ }
+ }
+ return (char *)0;
+}
diff --git a/fonts/utilities/mff-29/assoc.h b/fonts/utilities/mff-29/assoc.h
new file mode 100644
index 0000000000..128919dec7
--- /dev/null
+++ b/fonts/utilities/mff-29/assoc.h
@@ -0,0 +1,39 @@
+/* assoc.h 2.9.0 92/07/06 - simple association list
+ * Created - Damian Cugley <pdc@oxford.prg> Fri 12 Jan 1990
+ */
+
+#include "stdc.h"
+
+typedef struct assoc_node
+{
+ struct assoc_node *next;
+ char *s;
+} *Assoclist;
+
+const char *assoc ARGS((Assoclist al, const char *s));
+ /* return the value associated with s, or (char*)0 if there is none. */
+
+Assoclist assoc_destroylist ARGS((Assoclist));
+
+Assoclist assoc_add ARGS((Assoclist al, char *s));
+ /*
+ * s is a malloc'd string of the form "KEY=VAL"
+ */
+
+const char *assoc_match_backwards ARGS((Assoclist al, const char *s,
+ const char **pe));
+/*
+ * Try to find a KEY=VAL in al such that KEY is a suffix
+ * of the string from s to just before *pe.
+ *
+ * Returns VAL, if found, otherwise (char *)0.
+ *
+ * If ne is non-NULL, then *pe is set to (*pe - length(KEY)),
+ * i.e., the start of the matching suffix ( s <= *pe < *pe0 ).
+ *
+ * If no match is found, then returns (char *)0, and *pe is unchanged.
+ */
+
+
+void assoc_print ARGS((Assoclist));
+ /* Print a list (for debugging purposes) */
diff --git a/fonts/utilities/mff-29/config.x b/fonts/utilities/mff-29/config.x
new file mode 100644
index 0000000000..835f390930
--- /dev/null
+++ b/fonts/utilities/mff-29/config.x
@@ -0,0 +1,174 @@
+/* config.x 2.9.0 92/07/06 - site-specific string constant(s) -*-c-*- */
+
+/* HOW TO USE THIS FILE
+ *
+ * * Copy config.dist to config.c:
+ * You can ediut config.c as much as you like so long as config.dist
+ * remains as DISTributed.
+ * * If your machine/system is not represented then edit config.c to add
+ * a section to the first part describing it as below.
+ * * Set the pathnames in the bottom third to suit your site.
+ *
+ * More than one program uses this config file; therefore some of the
+ * constants it defines don't apply to the program you got this file with!
+ */
+
+/*
+ * This file comes in 2 parts --
+ * (1) conditionals which try to guess
+ * what system this is & set other conditionals (e.g., BSD,
+ * SHORT_FILENAMES; and
+ * (2) setting various constants (e.g., dir_sep_ch) based on these,
+ * unless they are already set.
+ */
+
+/*
+ * Some cpp macros that might want to be set:
+ *
+ * BSD
+ * set on BSD-like systems
+ *
+ * USG
+ * set on systems based on System III or System IV
+ *
+ * SHORT_FILENAMES
+ * There is a foolish limit on the length of filenames.
+ *
+ * NO_DOTRC
+ * On single-user systems, there is no reason to have a separate
+ * ~/.progrc file, because all the system's owner's tailoring
+ * foes in the system rc file.
+ *
+ * NO_EXEC_USE_SPAWN
+ * On TOS systems (and perhaps MS-DOS?), to create a subprocess
+ * I must use spawnvp() rather than fork() and exec().
+ *
+ * NO_ARGV0
+ * It seems that on TOS, argv[0] is likely to have been left NULL.
+ *
+ * NEEDPROTO
+ * set on systems which don't have prototypes in the system
+ * header files but for which prototypes are needed -- such as
+ * GNU C on PCC-based systems. Functions that return int or void
+ * will need declarations to avoid "implicit declaration" warnings.
+ *
+ * NO_FLSBUF
+ * set this if (a) NEEDPROTO is set and (b) the stdio macros getc
+ * and putc are *NOT* defined in terms of functions _flsbuf and _filbuf.
+ * This is an unfortunate hack necessary in order to prototype those
+ * two function on PCC-based systems when using GNU C.
+ *
+ * NO_EXECVP
+ * There is no standard subroutine execvp (V7, 4.2BSD?)
+ *
+ * FANCY_MALLOC
+ * Has a fancy version of malloc that is optional on some System V
+ * systems and standard on Suns.
+ */
+
+/*
+ * dir_sep_ch
+ * A character constant. Names of files are assumed to be formed of
+ * name components separated by this character.
+ *
+ * dir_sep_ch2
+ * A character allowed as a synonym for dir_sep_ch
+ * (On gcc/TOS systems, / can be used as a synonym for \.)
+ * If there isn't one, it is undefined.
+ *
+ * path_sep_ch
+ * path_sep_ch2
+ * Character constants. Used to separate directories is a search path.
+ * The second of these used to give the user a choice of characters
+ * and is only for compatability with TOS progs which seem to choose
+ * either comma or semicolon at random. It is undefined if
+ * only one path-separating character is used.
+ *
+ * int absolute_path_p(const char *s)
+ * Macro which returns nonzero if it seems that filename s
+ * is an absolute name, i.e., should not be searched for.
+ * (Assuming s is a correctly-formed name.)
+ * In UNIX, this is a filename starting "/", "./" or "../"; on
+ * MS-DOS, starting "X:" or "\" or ".".
+ *
+ */
+
+
+#ifdef sun
+/* Sun workstation, Sun UNIX 3.x or SunOS 4.x */
+# define BSD
+# define NEEDPROTO
+# define FANCY_MALLOC
+# define default_vfontpath \
+ ".:vfont:/usr/lib/vfont:/usr/lib/fonts/fixedwidthfonts"
+#endif
+
+#ifdef atarist
+/*
+ * Adrian Cox's Atari ST, running gcc
+ * Probably applies to a gcc/MS-DOS system too.
+ */
+# define BSD
+# define NO_EXEC_USE_SPAWN
+# define NO_ARGV0
+# define config_rc_dir "C:\\LIB"
+# define dir_sep_ch '\\'
+# define dir_sep_ch2 '/' /* assume library does translation */
+# define absolute_path_p(s) \
+ ((isalpha(s[0]) && s[1] == ':') \
+ || s[0] == '\\' || s[0] == '/' || s[0] == '.')
+# define path_sep_ch ',' /* allow colons in filenames */
+# define path_sep_ch2 ';'
+# define NO_DOTRC
+# define SHORT_FILENAMES
+#endif
+
+#ifdef GEC
+/*
+ * TARDIS, a Sys V.2 box, now deceased
+ */
+# define USG
+# define SHORT_FILENAMES
+#endif
+
+
+/*
+ * Default syntax of filenames and searchpaths is UNIX-like:
+ */
+#ifndef dir_sep_ch
+# define dir_sep_ch '/'
+# define absolute_path_p(s) \
+ (s[0] == '/' \
+ || (s[0] == '.' && (s[1] == '/' \
+ || (s[1] == '.' && s[2] == '/'))))
+# define path_sep_ch ':'
+#endif
+
+#ifdef dir_sep_ch2
+# define isdirsep(x) ((x) == dir_sep_ch || (x) == dir_sep_ch2)
+#else
+# define isdirsep(x) ((x) == dir_sep_ch)
+#endif
+
+#ifdef path_sep_ch2
+# define ispathsep(x) ((x) == path_sep_ch || (x) == path_sep_ch2)
+#else
+# define ispathsep(x) ((x) == path_sep_ch)
+#endif
+
+#ifndef vfont_suffix
+# define vfont_suffix ".vfont"
+#endif
+
+#ifndef BSD
+# define NO_SIGLIST
+#endif
+
+#ifndef config_rc_dir
+# define config_rc_dir "/usr/local/lib"
+#endif
+/*
+ * Look for site-wide `rc' files here
+ * Should not end in slash.
+ */
+
diff --git a/fonts/utilities/mff-29/ditko.mff b/fonts/utilities/mff-29/ditko.mff
new file mode 100644
index 0000000000..9f3c56943c
--- /dev/null
+++ b/fonts/utilities/mff-29/ditko.mff
@@ -0,0 +1,52 @@
+# mff startup file for Ditko
+
+# font names are dk##s##
+# where first ## is face in the style of Univers
+# second ## is size in points
+# OR
+# fdkWVV##
+# where W is one of t, i, l, k, m, d, b, x, c
+# VV is one of <empty>, rn, re, o, on, oe
+
++W
+-W 1=weight=0.30 # ultra light
+-W 2=weight=0.55 # extra light
+-W 3=weight=0.75 # light
+-W 4=weight=0.90 # semi light/book :-)
+-W 5=weight=1.00 # medium
+-W 6=weight=1.10 # demi +10
+-W 7=weight=1.25 # bold +15
+-W 8=weight=1.45 # extra +20
+-W 9=weight=1.60 # ultra +25
+
+-W t=weight=0.30 # ultra light
+-W i=weight=0.55 # extra light
+-W l=weight=0.75 # light
+-W k=weight=0.90 # semi light/book :-)
+-W m=weight=1.00 # medium
+-W d=weight=1.10 # demi +10
+-W b=weight=1.25 # bold +15
+-W x=weight=1.45 # extra +20
+-W u=weight=1.60 # ultra +25
+
++C
+
++I
+-I "3=hratio=1.20" # expanded
+-I "4=hratio=1.20; slant=1/5" # expanded oblique
+-I "5=hratio=1.00" # regular
+-I "6=hratio=1.00; slant=1/5" # oblique
+-I "7=hratio=0.75" # condensed
+-I "8=hratio=0.75; slant=1/5" # condensed oblique
+
+-I "re=hratio=1.20" # expanded
+-I "oe=hratio=1.20; slant=1/5" # expanded oblique
+-I "o=hratio=1.00; slant=1/5" # oblique
+-I "rn=hratio=0.75" # condensed
+-I "on=hratio=0.75; slant=1/5" # condensed oblique
+
++J
+-J s=
+-J a= # "standard" Ditko encoding
+
+-g dk # this allows xdk as family name for KB's system
diff --git a/fonts/utilities/mff-29/ditko.tex b/fonts/utilities/mff-29/ditko.tex
new file mode 100644
index 0000000000..a3fb2397bf
--- /dev/null
+++ b/fonts/utilities/mff-29/ditko.tex
@@ -0,0 +1,13 @@
+
+\nopagenumbers
+
+\newdimen\size \size=72pt
+\newdimen\v \v=\size \divide\v18
+\font\f=dk65s72
+\font\g=dk35s72
+
+\halign{\vrule height 13\v depth 2\v width 0pt\hfil\g#\hfil\cr
+ \f S\hbox to 0pt{tom\kern-0.02em ping\hss}\cr
+ c\cr e\cr n\cr e\cr}
+
+\bye
diff --git a/fonts/utilities/mff-29/dk.mf b/fonts/utilities/mff-29/dk.mf
new file mode 100644
index 0000000000..9acaccd51e
--- /dev/null
+++ b/fonts/utilities/mff-29/dk.mf
@@ -0,0 +1,400 @@
+%{{{ dk.mf -- Top-level driver for Ditko, the STOMPING SCENE logo font
+% dk.mf 1.1.2 92/02/17
+% Copyright (C) 1990, 1991 Damian Cugley
+% - pdc Tue. 25 Sept. 1990
+
+% This is a "folded" file - likes starting % {{{ or % }}} indicate
+% start and end of sections. (I use a folding editor.)
+
+boolean testing; testing := unknown mode;
+
+%{{{ Print version info
+string font_version_string;
+font_version_string = "1.2 <pdc 92/02/17>";
+
+if tracingtitles > 0:
+ message "Ditko version " & font_version_string;
+ message "Copyright (C) 1990 Damian Cugley";
+fi
+%}}}
+%{{{ Macros
+%{{{ Utility macros
+
+vardef isalpha_p primary c =
+ save ch; ch = byte c;
+ (ch > 64) and (ch < 91) or (ch > 96) and (ch < 123)
+enddef;
+
+vardef isupper_p primary c = % must already be alpha
+ byte c < 96
+enddef;
+
+vardef isdigit_p primary c =
+ save ch; ch = byte c;
+ (ch > 47) and (ch < 58)
+enddef;
+
+def islower_p primary c = not isupper_p c enddef;
+%}}}
+%{{{ Macros to start characters with
+
+let Beginchar = beginchar;
+let elif = elseif;
+
+def beginchar(expr code, wd_u, ht, dp, lr, rr) =
+ Beginchar(code, wd_u * u# + (lr + rr)*space#, ht, dp);
+ if isalpha_p(code):
+ if islower_p(code):
+ "variant letter " & char(byte code - 32);
+ else:
+ "letter " & code;
+ fi
+ elif isdigit_p(code):
+ "figure " & code;
+ fi
+ save l, r;
+ l = hround(lr * space# * hppp); r = w - hround(rr * space# * hppp);
+ pickup round_pen;
+enddef;
+
+def stdchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, cap_ht#, 0v#, lr, rr)
+enddef;
+
+def tallchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, body_ht#, 0v#, lr, rr)
+enddef;
+
+def dipchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, cap_ht#, dip_dp#, lr, rr)
+enddef;
+
+def talldipchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, body_ht#, dip_dp#, lr, rr)
+enddef;
+
+def Dipchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, cap_ht#, body_dp#, lr, rr)
+enddef;
+
+def Talldipchar(expr code, wd_u, lr, rr) =
+ beginchar(code, wd_u, body_ht#, body_dp#, lr, rr)
+enddef;
+
+def change_width = % maybe something more sophisticated later
+ if l < (w - r):
+ r := r + 1;
+ else:
+ l := l - 1;
+ fi
+enddef;
+
+def ifcode suffix $ = if known code$ enddef;%}}}
+%{{{ Alter the way the bbox is drawn
+
+def makebox(text rule) =
+ for y = 0, body_ht, -body_dp, cap_ht, axis:
+ rule((l,y)t_, (r,y)t_);
+ endfor
+ for x = l, r: rule((x, -body_dp)t_, (x, body_ht)t_); endfor
+ for x = 0, w: rule((x, -dip_dp)t_, (x, dip_dp)t_); endfor
+ % indicate "reference points"
+ if charic <> 0:
+ rule((r + charic*pt, h o_), (r + chatic*pt, 1/2h o_));
+ fi
+enddef;
+
+
+
+%}}}
+%{{{ Bits of kit
+%{{{ Nomenclature
+
+% z h - point where curve has horiz tangent
+% z v - vertical tangent
+% z j - joins stem etc.
+% z f - foot
+
+%}}} Nomenclature
+%{{{ Curves
+
+vardef curve_qtr_path(expr zh, zv) =
+ zh{(xpart zv - xpart zh, 0)}
+ ... superosity[(xpart zh, ypart zv), (xpart zv, ypart zh)] {zv - zh}
+ ... zv{(0, ypart zv - ypart zh)}
+enddef;
+
+vardef curve_vhalf_path(expr zh, zv, zhh) =
+ curve_qtr_path(zh, zv) & reverse curve_qtr_path(zhh, zv)
+enddef;
+
+vardef curve_hhalf_path(expr zv, zh, zvv) =
+ reverse curve_qtr_path(zh, zv) & curve_qtr_path(zh, zvv)
+enddef;
+
+vardef curve_cycle(expr zv, zh, zvv, zhh) =
+ curve_vhalf_path(zh, zv, zhh) & curve_vhalf_path(zhh, zvv, zh) & cycle
+enddef;
+%}}} Curves
+%{{{ "i" stuff - also "j" and lefthand stems
+
+vardef istem_pts@#(expr leftx, topy, boty) =
+ lft x@#jut = leftx; lft x@#top = lft x@#bot = hround(leftx + jut);
+ top y@#jut = top y@#top = topy;
+ bot y@#bot = boty;
+ labels(@#jut, @#top, @#bot);
+enddef;
+
+% Add a "tail" to the bottom of an existing istem:
+vardef jtail_attach@#(suffix $$) =
+ z@#e = (lft x$$bot - jut, -d) + pen_adj; % end of tail
+ z@#j = (rt x$$bot, baseline) - pen_adj; % where tail joins stem
+ bot rt z@#bot' = z@#c; % z@#bot' is new end of stem
+ z@#c = z@#j + whatever * (z@#j - z@#e) rotated -90;
+ x@#c = rt x$$bot;
+ penlabels(@#e, @#j, @#c, @#bot')
+enddef;
+
+% draw these with the square pen:
+vardef istem_path@# = z@#jut -- z@#top -- z@#bot enddef;
+vardef jstem_path@# = z@#jut -- z@#top -- z@#bot' enddef;
+
+% cutdraw this with the round pen:
+vardef jtail_path@# = z@#e -- z@#j enddef;
+%}}}
+%{{{ "n" bowl - also makes "h"
+
+vardef nbowl_pts@#(expr leftx, rightx) =
+ z@#f = (r - nindent, baseline - 1/4penw); % foot
+ y@#v = 1/2h; y@#j = njoin;
+ rt x@#v = r; lft x@#j = leftx;
+ top y@#h = cap_ht + o; x@#h = 1/2[x@#j,x@#v]; % top of arch
+ labels(@#j, @#h, @#v, @#f)
+enddef;
+
+vardef njoin_path@# =
+ z@#j{(z@#h - z@#j) yscaled 2} ... {(z@#h - z@#j) yscaled 0}z@#h
+enddef;
+
+vardef nbowl_path@# =
+ njoin_path@# & curve_qtr_path(z@#h,z@#v) .. z@#f
+enddef;
+%}}}
+%{{{ "c" curve - also makes "G", "E" etc.
+
+vardef cbowl_pts@#(expr leftx, rightx) =
+ x@#1 = x@#5 = rightx - xpart pen_adj;
+ x@#2 = x@#4 = 0.55[leftx,rightx];
+ lft x@#3 = leftx - o;
+ cap_ht - y@#1 = baseline + y@#5 = cgap;
+ top y@#2 = cap_ht + o; bot y@#4 = baseline - o;
+ y@#3 = 1/2[y@#2,y@#4];
+ labels(@#1, @#2, @#3, @#4, @#5)
+enddef;
+
+vardef cbowl_path@# =
+ z@#1 ... curve_vhalf_path(z@#2,z@#3,z@#4) ... z@#5
+enddef;
+%}}}
+%{{{ "p" bowl - also for "B", "R", "D"
+
+vardef pbowl_pts@#(expr leftx, rightx, midy) =
+ lft x@#j = leftx; x@#e = hround(leftx + penw + 1/2u);
+ rt x@#v = rightx;
+ x@#h = x@#hh = 0.45[x@#j, x@#v];
+ top y@#h = cap_ht + o; y@#e = midy + 1/2v;
+ y@#hh = midy; y@#j = njoin;
+ y@#v = 0.5[y@#h, y@#hh];
+ labels(@#j, @#h, @#v, @#hh, @#e)
+enddef;
+
+vardef pbowl_path@# =
+ z@#j ... curve_vhalf_path(z@#h, z@#v, z@#hh) .. z@#e
+enddef;
+
+vardef pbowl_draw@# =
+ draw z@#j ... curve_vhalf_path(z@#h, z@#v, z@#hh) .. z@#e;
+ cutoff(z@#e, 180);
+enddef;
+%}}}
+%{{{ "u" bowl
+
+% Adapted from "n" -- pdc Tue. 5 Nov. 1991
+
+vardef ubowl_pts@#(expr leftx, rightx) =
+ z@#t = (leftx + nindent, cap_ht + 1/4penh);
+ y@#v = 1/2h; y@#j = cap_ht - njoin;
+ lft x@#v = leftx; rt x@#j = rightx;
+ bot y@#h = baseline - o; x@#h = 1/2[x@#j,x@#v];
+ top y@#jut1 = top y@#jut2 = cap_ht;
+ %%%% lft x@#jut1 = leftx; rt x@#jut2 = rt x@#t;
+ labels(@#j, @#h, @#v, @#t, @#jut1, @#jut2)
+enddef;
+
+vardef ujoin_path@# =
+ z@#j{(z@#h - z@#j) yscaled 2} ... {(z@#h - z@#j) yscaled 0}z@#h
+enddef;
+
+vardef ubowl_path@# =
+ ujoin_path@# & curve_qtr_path(z@#h,z@#v) .. z@#t
+enddef;
+
+%vardef ujut_path@# =
+% z@#jut1 -- z@#jut2
+%enddef;
+
+%}}}
+%}}} Bits of kit
+%}}} Macros
+%{{{ Setting up
+%{{{ Ensure that |weight| etc. have been given values
+def set_default(suffix $)(expr v) =
+ if unknown $: $ = v; fi
+enddef;
+
+set_default(weight, 1);
+set_default(hratio, 1);
+set_default(slant, 0);
+
+%}}}
+%{{{ Set various "ad-hoc" parameters
+
+v# = 1/18designsize;
+u# = v# * hratio;
+
+body_ht# = 14v#; % height of letters that go up
+cap_ht# = 12v#; % height of most letters
+shoulder_ht#= 10v#; % height of `0'
+axis# = 1/2[body_ht#, -body_dp#];
+dip_dp# = 2v#; % dip of most letters that dip
+body_dp# = 4v#; % dip of letters that dip a lot
+
+agap# = 4u#; % amount arch of "a" indented
+ajut# = 3.5u#; % amount arch hanges over (>= jut#)
+cgap# = 2.5v#; % amount ends of "c" curl in
+nindent# = 2.5u#; % indent of foot of "n" etc.
+njoin# = 9u#; % attatchment point for "n" etc to stem
+jut# = 2u#; % amount serifs stick out
+
+penw# = 2v# * weight;
+penh# = penw#; % might change this later
+o# = 1/6v#; % overshoot
+
+space# = 1v#; % standard sidebar
+
+superosity = 3/4; % bit squarer than ellipses
+%}}}
+%{{{ Convert to device units & create pens
+
+mode_setup;
+define_pixels(u, v, body_ht, body_dp, axis, cgap, nindent, njoin, space);
+define_whole_pixels(jut, agap, ajut);
+define_whole_vertical_pixels(shoulder_ht, cap_ht, dip_dp);
+define_whole_blacker_pixels(penw);
+define_whole_vertical_blacker_pixels(penh);
+define_corrected_pixels(o);
+
+baseline = 0pt;
+
+pickup pensquare xscaled penw yscaled penh; square_pen = savepen;
+pickup pencircle xscaled penw yscaled penh; round_pen = savepen;
+ % for doing cutdraw operations
+
+pair pen_adj; pen_adj = 1 / (2*sqrt2) * (penw, penh);
+
+currenttransform := identity slanted slant
+ yscaled aspect_ratio
+ scaled granularity;
+
+% If the result of asll that is the identity, economize on time somwhat:
+if currenttransform = identity:
+ let t_ = relax
+else:
+ def t_ = transformed currenttransform enddef
+fi;
+%}}}
+%}}}
+%{{{ Input program files
+
+% Allocate ligatures in 128..255:
+numeric next_lig; next_lig = 127; % one less than min code
+def set_codes text t =
+ forsuffixes $$$ = t:
+ code$$$ = incr next_lig;
+ endfor
+enddef;
+
+set_codes short_dash, long_dash, left_quote, right_quote, german_quote;
+input dkpunct
+
+input dksym
+
+set_codes ll, oo;
+input dkalpha % first pass - all uppercase
+if not testing: \input dkalpha fi
+ % second pass - lowercase with variants uppercase
+%input dkfigs
+%}}}
+%{{{ Ligtable
+
+ifcode.short_dash:
+ ligtable "-": "-" =: code.short_dash;
+ ligtable code.short_dash: "-" =: code.long_dash;
+fi
+
+ifcode.left_quote:
+ ligtable "`": "`" =: code.left_quote;
+ ligtable "'": "'" =: code.right_quote;
+fi
+
+ifcode.german_quote:
+ ligtable ",": "," =: code.german_quote;
+fi
+
+% Letters
+
+def tkern = "t" kern -(6u# - 1/2penw#) + 1/2space# enddef;
+
+ligtable "a": "A": tkern
+ ifcode.ae: , "e" =: code.ae fi
+;
+
+ifcode.ee:
+ ligtable "e": "e" =: code.ee;
+fi
+
+ligtable "l": "L": tkern
+ ifcode.ll: , "l" =: code.ll fi
+;
+
+ifcode.oo:
+ ligtable "o": "o" =: code.oo;
+fi
+
+ligtable "r": "R": "e" kern -u# ;
+
+ligtable "u": "U":
+ "l" kern -1/2jut#, "L" kern -1/2jut#,
+ "r" kern -1/2jut#, "R" kern -1/2jut#;
+
+ligtable "v": "V": "e" kern -u#;
+%}}} ligtable
+%{{{ Font metric info
+
+font_identifier = jobname;
+font_coding_scheme = "Font-specific";
+font_slant = slant;
+font_normal_space = 6u#;
+font_normal_stretch = 4u#;
+font_normal_shrink = 2u#;
+fotn_x_height = cap_ht#;
+font_quad = 18u#;
+font_extra_space = 4u#;
+
+
+%}}}
+%}}} dk.mf
+
+%Local variables:
+%fold-folded-p: t
+%End:
diff --git a/fonts/utilities/mff-29/dkalpha.mf b/fonts/utilities/mff-29/dkalpha.mf
new file mode 100644
index 0000000000..72085e0f33
--- /dev/null
+++ b/fonts/utilities/mff-29/dkalpha.mf
@@ -0,0 +1,351 @@
+%{{{ dkalpha.mf - alphabetic characters for Ditko
+% Copyright (C) 1990 Damian Cugley
+% - pdc Tue. 25 Sept. 1990
+
+%{{{ Macros
+% Macros to allow me to read this file twice, the second time filling in
+% any uppercase letters that aren't already defined.
+% pdc - 13-Dec-90
+
+% Given a character number or one-character string, return a
+% single-character string that is its uppercase equivalent:
+vardef toupper primary ch =
+ save __ch; __ch = byte ch;
+ if (__ch > 96) and (__ch < 123):
+ char(__ch - 32)
+ else:
+ char(__ch)
+ fi
+enddef;
+
+% The first time this file is read, force all letters created to be
+% uppercase. In the second pass, lowercase and/or uppercase will be
+% produced: any uppercase will override the glyph produced in the first
+% pass.
+if testing or (known __stalpha_loaded):
+ vardef uch primary ch = ch enddef;
+else:
+ vardef uch primary ch = toupper ch enddef;
+ __stalpha_loaded = 1;
+fi
+%}}} Macros
+
+%{{{ u
+
+stdchar(uch "u", 12 + jut#/u#, 1, 0);
+ pickup round_pen;
+ istem_pts.stem(r - 2jut - penw, h, -d);
+ ubowl_pts.bowl(l, r - jut);
+ cutdraw ubowl_path.bowl;
+ pickup square_pen;
+ draw z.stem.top -- z.stem.bot -- top lft (r, baseline);
+ %%%% draw ujut_path.bowl;
+endchar;
+
+%}}}
+
+if testing: endinput fi
+
+% - pdc Tue. 25 Sept. 1990
+%{{{ t
+
+stdchar(uch "t", 12, 1/2, 1/2);
+ pickup square_pen;
+ if 1/2[l,r] <> good.x 1/2[l,r]: change_width; fi
+ top y1 = top y2 = top y10 = h;
+ bot y0 = bot y3 = bot y10 - dip_dp;
+ lft x0 = lft x1 = l; rt x2 = rt x3 = r;
+ x10 = x11 = 1/2[x1, x2];
+ bot y11 = -d;
+ draw z0 -- z1 -- z2 -- z3;
+ draw z10 -- z11;
+ labels(0,1,2,3,10,11)
+endchar;
+%}}}
+% - pdc Wed. 26 Sept. 1990
+%{{{ s
+
+talldipchar(uch "s", 12, 1, 1);
+ save superosity; superosity = 0.8;
+ pickup round_pen;
+ top y1 = cap_ht; top y0 = h;
+ bot y5 = baseline; bot y6 = -d;
+ rt x1 = rt x0 = hround(r - 1/2u); % top right
+ lft x5 = lft x6 = hround(l + 1/2u); % bottom left
+ z3 = 1/2[z1, z5]; % middle
+ y2 = 1/2[y1, y3]; lft x2 = l;
+ y4 = 1/2[y3, y5]; rt x4 = r;
+ x1a = x5a = x3; y1a = y1; y5a = y5;
+ draw z1 --- curve_vhalf_path(z1a, z2, z3)
+ & curve_vhalf_path(z3, z4, z5a) --- z5;
+ pickup square_pen; draw z0 -- z1; draw z5 -- z6;
+ labels(0, 1, 1a, 2, 3, 4, 5a, 5, 6);
+endchar;
+%}}}
+%{{{ o
+stdchar(uch "o", 12, 1/2, 1/2);
+ pickup round_pen;
+ top y1 = h + o; bot y3 = -d - o;
+ y0 = y2 = 1/2[y1,y3];
+ lft x2 = l - o; rt x0 = r + o;
+ x1 = x3 = 1/2[x0,x2];
+ draw curve_cycle(z0, z1, z2, z3);
+ labels(0,1,2,3)
+endchar;
+%}}}
+%{{{ n
+stdchar(uch "n", 12 + jut#/u#, 0, 1);
+ pickup round_pen;
+ istem_pts.stem(l, h, -d);
+ nbowl_pts.bowl(l + jut, r);
+ cutdraw nbowl_path.bowl;
+ pickup square_pen; draw istem_path.stem;
+endchar;
+%}}}
+%{{{ m
+stdchar(uch "m", 16, 1, 1);
+ pickup round_pen;
+ if 1/2[l,r] <> good.x 1/2[l,r]: change_width; fi
+ nbowl_pts.bowl(1/2[l,r] - 1/2penw, r);
+ bot z.foot = (1/2[l,r], baseline);
+ cutdraw nbowl_path.bowl;
+ cutdraw nbowl_path.bowl reflectedabout (z.foot, z.bowl.j);
+ pickup square_pen; draw z.foot -- z.bowl.j;
+ labels(foot);
+endchar;
+%}}}
+%{{{ h
+tallchar(uch "h", 12 + jut#/u#, 0, 1);
+ pickup round_pen;
+ istem_pts.stem(l, h, -d);
+ nbowl_pts.bowl(l + jut, r);
+ cutdraw nbowl_path.bowl;
+ pickup square_pen; draw istem_path.stem;
+endchar;
+%}}} h
+%{{{ i
+stdchar(uch "i", (penw# + jut#)/u#, 0, 1);
+ pickup square_pen;
+ istem_pts(l, h, -d);
+ draw istem_path;
+endchar;
+%}}} i
+%{{{ c
+stdchar(uch "c", 11, 2/3, 1/2);
+ pickup round_pen;
+ cbowl_pts(l,r); cutdraw cbowl_path;
+endchar;
+%}}} c
+%{{{ e
+dipchar(uch "e", 11 + 1/2jut#/u#, 1/2, 1/2);
+ pickup round_pen;
+ cbowl_pts.curve(l + 1/2jut, r); cutdraw cbowl_path.curve;
+ pickup square_pen;
+ lft z1 = (l, 1/2[baseline, cap_ht]);
+ y2 = y1; x2 = x.curve1 - 2 * xpart pen_adj;
+ draw z1 -- z2;
+ labels(1,2);
+endchar;
+%}}}
+% - pdc 27th Sept. 1990.
+%{{{ j
+Dipchar(uch "j", (jut# + penw#)/u#, 0, 1);
+ pickup square_pen;
+ istem_pts(l, h, baseline); jtail_attach();
+ draw jstem_path;
+ pickup round_pen; cutdraw jtail_path;
+endchar;
+%}}}
+%{{{ g
+Dipchar(uch "g", 11, 1/2, 1/2);
+ pickup round_pen;
+ cbowl_pts(l,r); cutdraw cbowl_path;
+ istem_pts(r - jut - penw, vround(1/2[baseline,cap_ht]), -dip_dp);
+ jtail_attach(); cutdraw jtail_path;
+ pickup square_pen; draw jstem_path;
+endchar;
+%}}}
+%{{{ p
+stdchar(uch "p", 11 + jut#/u#, 0, 1);
+ pickup square_pen;
+ istem_pts.stem(l, h, -d); draw istem_path.stem;
+ pickup round_pen;
+ pbowl_pts.bowl(l + jut, r, 0.333[baseline, cap_ht]);
+ pbowl_draw.bowl;
+endchar;
+%}}}
+%{{{ d
+stdchar(uch "d", 11 + jut#/u#, 0, 1);
+ pickup square_pen;
+ istem_pts.stem(l, h, -d); draw istem_path.stem;
+ pickup round_pen;
+ pbowl_pts.bowl(l + jut, r, top baseline - o);
+ pbowl_draw.bowl;
+endchar;
+%}}}
+% - pdc Sun. 30 Sept. 1990
+%{{{ f
+Dipchar(uch "f", 10 + jut#/u#, 0, 1/2);
+ pickup square_pen;
+ istem_pts(l, h, -d); jtail_attach();
+ % Define points at right of top bar:
+ y1 = y.jut; rt x1 = rt x2 = r; bot y2 = bot y1 - dip_dp;
+ % Define points for bottom bar:
+ y3 = y4 = good.y 0.4cap_ht; bot y5 = bot y4 - dip_dp;
+ lft x3 = hround(lft x.top - 1/2jut); rt x4 = rt x5 = hround(r - jut);
+ draw jstem_path; draw z.jut -- z1 -- z2;
+ % draw z3 -- z4 -- z5;
+ draw z3 -- z4;
+ pickup round_pen; cutdraw jtail_path;
+ labels(range 1 thru 5);
+endchar;
+%}}}
+%{{{ L
+talldipchar("L", 12 + jut#/u#, 0, 1/2);
+ pickup square_pen;
+ istem_pts(l, h, baseline);
+ y1 = y.bot; rt x1 = rt x2 = r; bot y2 = -d;
+ draw istem_path -- z1 -- z2;
+ labels(1,2);
+endchar;
+%}}}
+%{{{ l
+tallchar(uch "l", 12 + jut#/u#, 0, 1/2);
+ pickup square_pen;
+ istem_pts(l, h, baseline);
+ y1 = y.bot; rt x1 = rt x2 = r; top y2 = top y1 + dip_dp;
+ draw istem_path -- z1 -- z2;
+ labels(1,2);
+endchar;
+%}}}
+% - pdc Sun. 30 Sept. 1990
+
+%{{{ a
+% Trying to get the spine to work in odd situations took some work:
+stdchar(uch "a", (15u# - agap# + jut#)/u#, 1, 0);
+ z1r = (l + agap, h); % where top corner goes
+ z2c = (r - jut, baseline + penh); % used to get angles right
+ z1l - z1r = z2l - z2r = 2 * penoffset (z2c - z1r) of currentpen;
+ z1 = 1/2[z1l, z1r]; z2 = 1/2[z2l, z2r];
+ z2r = z1r + whatever * (z1r - z2c); % where bot corner goes
+ y2l = baseline;
+ fill z1r -- z2r -- z2l -- z1l -- cycle; % draw spine
+
+ pickup round_pen;
+ z.centre = z.centre' + jut*right = 1/2[z1, z2];
+ bot lft z.botleft = bot lft z.botleft' - jut*right = (l, baseline);
+ draw curve_qtr_path(z.centre', z.botleft) ---
+ curve_qtr_path(z.botleft', z.centre) --- cycle;
+ pickup square_pen;
+ drawdot z.botleft;
+
+ top lft z1b + ajut*right = top rt z1a = z1r;
+ bot rt z2b = (r, baseline); bot lft z2a = z2l;
+ draw z1a -- z1b; draw z2a -- z2b;
+ labels(2c, forsuffixes $ = 1,2: $a, $b, $, $l, $r, endfor
+ centre, centre', botleft, botleft');
+endchar;
+%}}}
+%{{{ oo
+ifcode oo:
+ vardef circ@#(expr leftx, topy) =
+ top y@#h = vround topy + o; bot y@#hh = vround (topy - 9u) - o;
+ lft x@#v = hround leftx - o; rt x@#vv = hround (leftx + 9u) + o;
+ y@#v = y@#vv = 1/2[y@#h, y@#hh];
+ x@#h = x@#hh = 1/2[x@#v, x@#vv];
+ draw curve_cycle(z@#v, z@#h, z@#vv, z@#hh);
+ enddef;
+
+ stdchar(code.oo, 18 + 1/2space#/u#, 1/2, 1/2); "oo ligature";
+ pickup round_pen;
+ circ1(l, h); circ2(l + 9u + 1/2space, 9u);
+ endchar;
+fi
+%}}}
+%{{{ ll
+ifcode ll:
+ vardef elle@#(expr leftx) =
+ istem_pts@#(hround leftx, h, -d);
+ y@#a = y@#bot; rt x@#a = hround(leftx + 9u);
+ draw istem_path@# -- z@#a;
+ labels(@#a)
+ enddef;
+
+ tallchar(code.ll, 18 + (space# - jut#)/u#, 0, 1/2); "ligature LL";
+ pickup square_pen;
+ elle1(l); elle2(l + 9u + space - jut);
+ endchar;
+fi
+%}}}
+
+%{{{ R
+% I need a quick-&-dirty "R" to do the Fred & Daniel banner
+% Will do a better-looking one later
+% - pdc Mon. 8 Oct. 1990
+stdchar(uch "r", 12 + jut#/u#, 1/2, 1); "Hackjob R";
+ pickup square_pen;
+ istem_pts.stem(l, h, -d); draw istem_path.stem;
+ pickup round_pen;
+ pbowl_pts.t(l + jut, r - u, 0.5[baseline, cap_ht]);
+ pbowl_draw.t;
+ bot rt z.tail = (r, baseline); lft z.tj = lft z.tail + jut*left;
+ cutdraw z.t.hh -- z.tj -- rt z.tail;
+ labels(tj,tail);
+endchar;
+%}}}
+% - pdc Tue. 16 Oct. 1990
+%{{{ y
+Dipchar(uch "y", 12, 1/2, 1);
+ pickup round_pen;
+ z.t = (l + nindent, h); % top
+ y.v = 1/2h; y.j = h - njoin;
+ lft x.v = l; rt x.j = r;
+ bot y.h = baseline - o; x.h = 1/2[x.j,x.v]; % bot of bowl
+ labels(j, h, v, t);
+ cutdraw z.j{(z.h - z.j) yscaled 2} ... {(z.h - z.j) yscaled 0}z.h
+ & curve_qtr_path(z.h,z.v) .. z.t;
+ pickup square_pen;
+ top rt z.tl.t = (r, h);
+ bot rt z.tl.b = (r, -d);
+ bot lft z.tl.f = (1/2[r,l],-d);
+ draw z.tl.t -- z.tl.b -- z.tl.f;
+ labels(tl.t,tl.b,tl.f);
+endchar;
+%}}}
+
+%{{{ v
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% - pdc Sat. 12 Jan. 1991
+stdchar(uch "v", 12 + jut#/u#, 0, 1/2);
+ numeric mid; mid = l + 5.5u;
+
+ % points of the topleft serif:
+ z0 = z1 + penh*up = (l, h);
+ z2 = z1 + penw * right;
+ z5 = z0 + whatever * right;
+
+ % points on the diagonal:
+ z3 = (hround (mid - u), 0);
+ numeric theta; theta = angle(z2 - z3);
+ z5 - z5a = z3a - z3 = 1/2[penh, penw] * dir (theta - 90);
+ z5 - z3a = z5a - z3 = whatever * dir theta;
+
+ % points on curve to right:
+ z10 = z11 + penw * right = (r, h);
+ z13 = z13a + penh * down = (mid, 0);
+ numeric sup; sup = 0.7;
+ z14 = sup[(x13a, y11), (x11, y13a)];
+ z15 = sup[(x13, y10), (x10, y13)];
+
+ pickup pencircle scaled 2;
+ fill z5 -- z0 -- z1 -- z2 -- z3 -- z13 -- z3a -- cycle;
+ fill z10 -- z11{down} ... z14{z13a - z11} ... {left}z13a
+ -- z13{right} ... z15{z10 - z13} ... {up}cycle;
+ labels(0, 1, 2, 3, 3a, 5, 5a, 10, 11, 12, 13, 13a, 14, 15);
+endchar;
+%}}}
+%}}} dkalpha.mf
+
+%Local variables:
+%fold-folded-p:t
+%End:
diff --git a/fonts/utilities/mff-29/dkpunct.mf b/fonts/utilities/mff-29/dkpunct.mf
new file mode 100644
index 0000000000..7986c955fa
--- /dev/null
+++ b/fonts/utilities/mff-29/dkpunct.mf
@@ -0,0 +1,86 @@
+% dkpunct.mf - punctuation for Ditko
+% Copyright (C) 1990 Damian Cugley
+% - pdc Sun. 30 Sept. 1990
+
+if testing: endinput fi
+
+% - pdc Sun. 30 Sept. 1990
+
+def straight_line(expr code, wd_u) =
+ beginchar(code, wd_u, 1/2penh# + 1/2cap_ht#, 0v#, 1/3, 1/3);
+ pickup square_pen;
+ top lft z1 = (l, h); top rt z2 = (r, h);
+ draw z1--z2;
+ labels(1,2);
+ endchar;
+enddef;
+
+"hyphen"; straight_line("-", 6);
+ifcode short_dash: "short dash";
+ straight_line(code.short_dash, 12);
+fi
+ifcode long_dash: "long dash";
+ straight_line(code.long_dash, 18);
+fi
+
+%% Comma-like objects:
+
+vardef draw_comma@# =
+ fill top lft z@# -- bot lft z@# + dip_dp*down
+ -- bot rt z@# -- top rt z@# -- cycle;
+enddef;
+
+vardef draw_inverted_comma@# =
+ fill top lft z@# -- bot lft z@#
+ -- bot rt z@# -- top rt z@# + dip_dp*up -- cycle;
+enddef;
+
+def quotation_marks(expr code, double_b, left_b) =
+ stdchar(code, if double_b: 1 + 2penw#/u# else: penw#/u# fi, 1, 1);
+ pickup square_pen;
+ top lft z1 = (l, h if left_b: - dip_dp fi);
+ if left_b: draw_inverted_comma1; else: draw_comma1; fi
+ if double_b:
+ top rt z2 = (r, h if left_b: - dip_dp fi);
+ if left_b: draw_inverted_comma2; else: draw_comma2; fi
+ fi
+ labels(1 if double_b: , 2 fi);
+ endchar;
+enddef;
+
+"apostrophe"; quotation_marks("'", false, false);
+"inverted comma"; quotation_marks("`", false, true);
+ifcode left_quote: "left double quote";
+ quotation_marks(code.left_quote, true, true);
+fi
+ifcode right_quote: "right double quote";
+ quotation_marks(code.right_quote, true, false);
+fi
+
+ifcode german_quote: "german left quotation mark";
+ beginchar(code.german_quote, 1 + 2penw#/u#, penh#, 0v#, 1, 1);
+ pickup square_pen;
+ top lft z1 = (l, h); draw_comma1;
+ top rt z2 = (r, h); draw_comma2;
+ labels(1, 2);
+ endchar;
+fi
+
+def semicolon(expr code, dot_b, comma_b) =
+ beginchar(code, penw#/u#, if dot_b: cap_ht# else: penh# fi,
+ if comma_b: dip_dp# else: 0v# fi, 1, 1);
+ pickup square_pen;
+ if dot_b:
+ top lft z1 = (l, h); drawdot z1; labels(1);
+ fi
+ bot lft z2 = (l, baseline);
+ if comma_b: draw_comma2; else: drawdot z2; fi
+ labels(2);
+ endchar
+enddef;
+
+"full stop"; semicolon(".", false, false);
+"comma"; semicolon(",", false, true);
+"colon"; semicolon(":", true, false);
+"semicolon"; semicolon(";", true, true);
+
diff --git a/fonts/utilities/mff-29/dksym.mf b/fonts/utilities/mff-29/dksym.mf
new file mode 100644
index 0000000000..3833aae25c
--- /dev/null
+++ b/fonts/utilities/mff-29/dksym.mf
@@ -0,0 +1,13 @@
+% dksym.mf - symbols for Ditko
+% Copyright (C) 1990 Damian Cugley
+% - pdc Tue. 16 Oct. 1990
+
+stdchar("+", 12, 1, 1); "plus sign";
+ pickup square_pen;
+ x1 = x2 = 1/2[l,r]; y3 = y4 = 1/2[-d,h];
+ top y1 = h; bot y2 = -d;
+ lft x3 = l; rt x4 = r;
+ draw z1 -- z2; draw z3 -- z4;
+ labels(1,2,3,4);
+endchar;
+
diff --git a/fonts/utilities/mff-29/error.c b/fonts/utilities/mff-29/error.c
new file mode 100644
index 0000000000..a409bacc79
--- /dev/null
+++ b/fonts/utilities/mff-29/error.c
@@ -0,0 +1,217 @@
+/* error.c 2.9.0 92/07/06 -- print error message -- part of argloop */
+
+#include "stdc.h"
+#include "xstdio.h"
+#include "argloop.h"
+#include "fatal.h"
+
+#ifndef __STDC__
+#include <varargs.h>
+
+int vfprintf ARGS((FILE *, const char *, va_list));
+
+extern int errno, sys_nerr;
+extern const char *sys_errlist[];
+
+void NONRETURNING exit ARGS((int));
+#ifndef NDEBUG
+extern NONRETURNING void abort ARGS((void));
+# define EXIT(x) abort()
+#else
+# define EXIT(x) exit(x)
+#endif
+
+inline void
+verrorf(fmt, args)
+ const char *fmt;
+ va_list args;
+{
+ if (progname && *progname) fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmt, args);
+ putc('.', stderr);
+ putc('\n', stderr);
+}
+
+inline void
+vperrorf(fmt, args)
+ const char *fmt;
+ va_list args;
+{
+ if (progname && *progname) fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmt, args);
+ if (errno > 0 && errno < sys_nerr)
+ fprintf(stderr, ": %s.\n", sys_errlist[errno]);
+ else if (errno != 0)
+ fprintf(stderr, ", errno = %d.\n", errno);
+ else
+ fprintf(stderr, ".\n");
+}
+
+void
+perrorf(va_alist)
+ va_dcl
+{
+ va_list args;
+ const char *fmt;
+
+ va_start(args);
+ fmt = va_arg(args, const char *);
+ vperrorf(fmt, args);
+ va_end(args);
+}
+
+void
+errorf(va_alist)
+ va_dcl
+{
+ va_list args;
+ const char *fmt;
+
+ va_start(args);
+ fmt = va_arg(args, const char *);
+ verrorf(fmt, args);
+ fprintf(stderr, ".\n")
+ va_end(args);
+}
+
+void NONRETURNING
+pfatalf(va_alist)
+ va_dcl
+{
+ va_list args;
+ const char *fmt;
+
+ va_start(args);
+ fmt = va_arg(args, const char *);
+ vperrorf(fmt, args);
+ va_end(args);
+ EXIT(1);
+}
+
+void NONRETURNING
+fatalf(va_alist)
+ va_dcl
+{
+ va_list args;
+ const char *fmt;
+
+ va_start(args);
+ fmt = va_arg(args, const char *);
+ verrorf(fmt, args);
+ va_end(args);
+ EXIT(1);
+}
+
+void NONRETURNING
+syntaxf(va_alist)
+ va_dcl
+{
+ va_list args;
+ const char *fmt;
+
+ va_start(args);
+ fmt = va_arg(args, const char *);
+ verrorf(fmt, args);
+ va_end(args);
+ putc('\n', stderr);
+ EXIT(2);
+}
+
+#else
+#include <stdarg.h>
+
+int vfprintf ARGS((FILE *, const char *, va_list));
+
+extern int errno, sys_nerr;
+extern const char *sys_errlist[];
+
+void NONRETURNING exit ARGS((int));
+#ifndef NDEBUG
+extern NONRETURNING void abort ARGS((void));
+# define EXIT(x) abort()
+#else
+# define EXIT(x) exit(x)
+#endif
+
+inline void
+verrorf(fmt, args)
+ const char *fmt;
+ va_list args;
+{
+ if (progname && *progname) fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmt, args);
+ putc('.', stderr);
+ putc('\n', stderr);
+}
+
+inline void
+vperrorf(fmt, args)
+ const char *fmt;
+ va_list args;
+{
+ if (progname && *progname) fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmt, args);
+ if (errno > 0 && errno < sys_nerr)
+ fprintf(stderr, ": %s.\n", sys_errlist[errno]);
+ else if (errno != 0)
+ fprintf(stderr, ", errno = %d.\n", errno);
+ else
+ fprintf(stderr, ".\n");
+}
+
+void
+perrorf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vperrorf(fmt, args);
+ va_end(args);
+}
+
+void
+errorf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ verrorf(fmt, args);
+ fprintf(stderr, ".\n")
+ va_end(args);
+}
+
+void NONRETURNING
+pfatalf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vperrorf(fmt, args);
+ va_end(args);
+ EXIT(1);
+}
+
+void NONRETURNING
+fatalf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ verrorf(fmt, args);
+ va_end(args);
+ EXIT(1);
+}
+
+void NONRETURNING
+syntaxf(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ verrorf(fmt, args);
+ va_end(args);
+ putc('\n', stderr);
+ EXIT(2);
+}
+
+#endif
diff --git a/fonts/utilities/mff-29/example.mffrc b/fonts/utilities/mff-29/example.mffrc
new file mode 100644
index 0000000000..4f3d19be69
--- /dev/null
+++ b/fonts/utilities/mff-29/example.mffrc
@@ -0,0 +1,12 @@
+# my personal mff startup file
+# created - Damian Cugley <pdc@oxford.prg> Mon 15 Jan 1990
+
+# where my font directories are:
+-T /mclab/pdc/tex/tfm/
+
+# bitmap files are stored in directories named after the
+# printing engine rather than the resolution:
+
+-P /mclab/pdc/tex/pk/%z/
+
+-d 300
diff --git a/fonts/utilities/mff-29/fatal.h b/fonts/utilities/mff-29/fatal.h
new file mode 100644
index 0000000000..c79ab8a2a4
--- /dev/null
+++ b/fonts/utilities/mff-29/fatal.h
@@ -0,0 +1,38 @@
+/* fatal.h 2.9.0 92/07/06 */
+
+#ifndef __FATAL__H__
+#define __FATAL__H__
+
+#include "stdc.h"
+
+/*
+ * Can't use the STDC "..." notation because I am using varargs
+ * Whose silly idea was it to have an ellipsis in the syntax of
+ * a programming language anyway?
+ *
+ * pfatal(...) -- does perror(...) and exit(1)
+ * fatal(...) -- does error(...) and exit(1)
+ * syntax(...) -- does error(...) and exit(2)
+ *
+ * perror(...) -- does error(...), prints message for errno
+ * progname: ...: Not found\n or , errno = 567
+ * error(...) -- does ... message like
+ * progname: ... \n
+ */
+#ifdef __STDC__
+void NONRETURNING
+ pfatalf(const char *, ...),
+ fatalf(const char *, ...),
+ syntaxf(const char *, ...);
+void perrorf(const char *, ...),
+ errorf(const char *, ...);
+#else
+void NONRETURNING pfatalf(), fatalf(), syntaxf();
+void perrorf(), errorf();
+#endif
+/*
+void vperrorf ARGS((const char *, va_list));
+void verrorf ARGS((const char *, va_list));
+*/
+
+#endif
diff --git a/fonts/utilities/mff-29/fcm.mf b/fonts/utilities/mff-29/fcm.mf
new file mode 100644
index 0000000000..419154d6e8
--- /dev/null
+++ b/fonts/utilities/mff-29/fcm.mf
@@ -0,0 +1,158 @@
+% %M% 3.%I% %E% -- a clone of some of Knuth's Computer Modern faces
+% Copyright (c) 1992 Damian Cugley.
+
+% This is a generic driver file, intended for use with METAFONT
+% or with programs like mff (which acts as a front end to METAFONT).
+% Unlike most driver files, it is named for the family (or "super-family")
+% it describes rather than an individual font within that family.
+
+% It is intended to produce approximations to some of
+% Donald E Knuth's Computer Modern typefaces.
+
+% INITIALIZATION -- read in CMBASE.MF and set the meta-parameters
+% if they are not already set:
+
+if unknown cmbase:
+ SLANT := slant; input cmbase; slant := SLANT;
+fi
+
+if unknown hratio: hratio := 1; fi
+if unknown italicness: italicness := 0; fi
+if unknown weight: weight := 1; fi
+if unknown serifness: serifness := 1; fi
+if unknown monospaceness: monospaceness := 0; fi
+if unknown stress: stress := serifness * (1 - monospaceness); fi
+
+font_identifier:="Computer Modern"
+ if stress > 0: & " Bright" & decimal stress fi % use Lucida's term
+ if serifness = 0: & " Sanserif" fi
+ if monospaceness > 0: & " Typewriter" fi
+ if italicness > 0: & " italic"
+ elseif slant > 0: & " oblique" & decimal slant fi
+ if weight > 1: & " bold" & decimal weight
+ elseif weight < 1: & " light" & decimal weight fi
+ if hratio > 1: & " extended" & decimal hratio
+ elseif hratio < 1: & " condensed" & decimal hratio fi;
+message font_identifier_;
+
+v# := 1/18 designsize;
+u# := hratio * v# * italicness[1,0.92] *
+ if (designsize < 10 pt#): (0.75 + 2.5/(designsize/pt#))
+ elseif designsize > 10pt#: (0.88 + 1.2/(designsize/pt#))
+ else: 1 fi;
+
+% Spacing
+
+width_adj# := (weight - 1) * 0.77u#;
+serif_fit# := 0pt#;
+cap_serif_fit# := 0.25v# * 1/3[1,weight];
+letter_fit# := italicness[0v#,0.451v#];
+
+
+% heights of letters
+
+body_height# := monospaceness[13.5v#,12.5v#];
+asc_height# := monospaceness[12.5v#,11.0v#];
+cap_height# := monospaceness[12.3v#,11.0v#];
+fig_height# := monospaceness[11.6v#,11.0v#];
+x_height# := monospaceness[ 7.75v# * 1/20[1,weight], 8.0v#];
+math_axis# := monospaceness[ 4.50v#, 5.5v#];
+bar_height# := monospaceness[ 4.35v# * 1/25[1,weight], 3.95v#];
+comma_depth# := monospaceness[ 3.50v#, 2.5v#];
+desc_depth# := 3.50v#;
+
+
+% thickness of strokes
+
+% This is an abbrev for a complex mixture of sans and italic tendencies
+% turn_knob(S,BR,IT,WF) means that the medium-sanserif face has
+% dimension S, medium-bright has BR and medium-italic has IT;
+% the "weight factor" adjuusts the amout the difference due to weight
+% is exaggerated.
+
+def turn_knob(expr sans, br, it, wfact) =
+ stress[sans * weight, wfact[1,weight] * italicness[br, it] ]
+enddef;
+
+hair# := turn_knob(1.125v#,0.45v#, 0.55v#, 2);
+stem# := turn_knob(1.25v#, 1.25v#, 1.15v#, 1);
+curve# := turn_knob(1.25v#, 1.50v#, 1.40v#, 4/5);
+ess# := turn_knob(1.00v#, 1.35v#, 1.35v#, 2/3);
+cap_flare# := turn_knob(1.40v#, 1.65v#, 1.45v#, 2/3);
+flare# := turn_knob(1.40v#, 1.65v#, 1.45v#, 2/3);
+dot_size# := turn_knob(1.75v#, 1.90v#, 1.90v#, 4/5);
+cap_hair# := turn_knob(1.125v#,0.55v#, 0.55v#, 6/5);
+cap_stem# := turn_knob(1.25v#, 1.60v#, 1.45v#, 1);
+cap_curve# := turn_knob(1.25v#, 1.85v#, 1.70v#, 4/5);
+cap_ess# := turn_knob(1.25v#, 1.75v#, 1.55v#, 0.85);
+rule_thickness# := stress[1.125v#, 0.72v#];
+
+dish# := stress * 0.05v#;
+bracket# := stress * 1.00v# * 5/3[1,weight];
+jut# := turn_knob(monospaceness * 1.7u#, 1.40v#, 1.50v#, (-1/6));
+cap_jut# := turn_knob(monospaceness * 1.7u#, 1.85v#, 1.70v#, (-1/6));
+beak_jut# := turn_knob(0v#, 0.50v#, 0.45v#, 1/6);
+beak# := serifness * 3.50v#;
+cap_vair# :=
+vair# := turn_knob(1.00v#, 0.40v#, 0.40v#, 1);
+notch_cut# := 1.25v#;
+bar# :=
+cap_slab# :=
+slab# :=
+cap_bar# :=
+cap_band# := turn_knob(1.00v#, 0.55v#, 0.55v#, 9/10);
+cap_notch_cut# := 1.25v#;
+serif_drop# := turn_knob(0v#, 0.20v#, 0.20v#, 1/2);
+stem_corr# := turn_knob(0v#, 0.05v#, 0.05v#, 5/3);
+vair_corr# := turn_knob(0v#, 0.05v#, 0.05v#, 5/6);
+apex_corr# := 0v#;
+
+
+
+% size of pens
+
+crisp# := min(vair#, (monospaceness*serifness)
+ [italicness * 0.40v#, 0.88stem#]);
+tiny# := min(vair#, (monospaceness*serifness)
+ [0.40v# * weight, 0.88stem#]);
+fine# := min(vair#, (monospaceness*serifness)
+ [0.35v# * 2/3[1,weight], 0.84stem#]);
+thin_join# := min(vair#, stress[0.82stem#, 0.35v# * 2/3[1,weight] ]);
+
+
+% overshoots
+
+o# := turn_knob(0.2v#, 0.4v#, 0.4v#, (-5/6));
+apex_o# := turn_knob(0.15v#, 0.4v#, 0.4v#, (-5/6));
+
+
+% misc
+
+fudge := stress[0.81, 1];
+math_spread := max(0, weight - 2 + stress);
+if superness = 0:
+ superness := 1/sqrt2 if weight > 1: * 1/20[1,weight] fi;
+fi
+superpull := 1/6 * 1/20[1,weight];
+beak_darkness := stress * serifness * 11/30 * 1/6[1,weight];
+ligs := if monospaceness>0: 0
+ elseif designsize > 5.5pt#: 2 else: 1 fi;
+
+square_dots := stress < 0.5;
+hefty := stress < 0.5;
+serifs := serifness > 0;
+monospace := monospaceness > 0;
+variant_g := false;
+low_asterisk := monospaceness > 0;
+math_fitting := false;
+
+if hratio < 1:
+ scantokens "input cmchar";
+ % can't use input direct because cmchar is outer
+ dontwant "Per cent sign"; % doesn't work for hratio < 1
+fi
+
+string driver;
+if italicness > 0: driver = "textit"; else: driver = "roman"; fi
+scantokens ("input " & driver);
+% What can I say?
diff --git a/fonts/utilities/mff-29/fcm.mff b/fonts/utilities/mff-29/fcm.mff
new file mode 100644
index 0000000000..209d8dd9d5
--- /dev/null
+++ b/fonts/utilities/mff-29/fcm.mff
@@ -0,0 +1,56 @@
+# MFF startup file for CMR-based fonts
+
+# There are two obvious ways to store these files --
+# -- put the mf files in /usr/local/lib/tex/mf/inputs and mff file in
+# /usr/local/lib/tex/mf/mff/xcmfonts.mff; or
+# -- put the the .mf files in their own directory and put the .mff file
+# there as mff.rc.
+
+
+# Letter suffixes use Karl Berry's scheme (TUGboat 11#4 pp.518-519)
+#
+# Berry uses suffixes in the order weight-variant-expansion
+# mff was designed on the assumption of weight-expansion-variant1-variant2
+# (because this is what seemed most natural to me; there is no profound
+# reasoning behind it)
+
+# Number suffixes are in the style of Univers
+# pdc Thur. 12 Sept. 1991
+
+-M cmmf # use METAFONT with cmbase already loaded
+
++W
+-W a-weight=1/3 # hairline
+-W t=weight=0.55 # thin
+-W l=weight=0.75 # light
+-W k=weight=0.85 # book
+-W r= # regular weight
+-W d=weight=1.3 # demi
+-W b=weight=1.6 # bold
+-W x=weight=1.75 # extra bold
+-W u=weight=1.9 # ultra
+
++C
+-C n=serifness:=0.5;stress:=0.5 # informal
+-C r= # roman
+-C s=serifness=0 # sanserif
+-C t=monospaceness=1 # typewriter
+-C st=serifness=0;monospaceness=1 # sanserif typewriter
+-C bt=stress=1;monospaceness=1 # bright typewriter
+-C bs=stress=1;serifness=0 # bright sanserif
+-C bst=stress=monospaceness=1;serifness=0 # bright sanserif typewriter
+
++I
+-I o=slant:=1/6 # oblique
+-I i=italicness=1;slant:=1/4 # italic
+-I u=italicness=1 # unslanted italic
+
+# Karl Berry's system has expansion after variant rather than before,
+# so I have put them in the J table.
+
++J
+#-J o=hratio=0.5 # extra condensed
+-J c=hratio=0.75 # condensed
+-J r= # normal width
+-J x=hratio=1.15 # expanded
+#-J w=hratio=1.3 # wide (extra extpanded?)
diff --git a/fonts/utilities/mff-29/fgetword.c b/fonts/utilities/mff-29/fgetword.c
new file mode 100644
index 0000000000..7092af5ef8
--- /dev/null
+++ b/fonts/utilities/mff-29/fgetword.c
@@ -0,0 +1,45 @@
+/* fgetword.c 2.9.0 92/07/06 */
+/* see strword(3) */
+
+/* - Damian Cugley <pdc@prg.ox.ac.uk> Fri. 1 Mar. 1991
+-----------------------------------------------------------------------
+ This software module copyright (c) 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+*/
+
+#include <ctype.h>
+#include "xstdio.h"
+
+char *
+fgetword(buf, fp)
+ char *buf; /* result written here -- must be big enuf */
+ FILE *fp; /* read from this file */
+{
+ char *p; int ch;
+
+ /* Skip whitespace and '#' comments: */
+ while ((ch = getc(fp)) != EOF)
+ if (ch == '#')
+ while ((ch = getc(fp)) != EOF && ch != '\n')
+ ;
+ else if (!isspace(ch))
+ break;
+ if (ch == EOF) return (char *)0;
+ p = buf;
+ if (ch == '"')
+ {
+ while ((ch = getc(fp)) != EOF
+ && !(ch == '"' && (ch = getc(fp)) != '"'))
+ *p++ = ch;
+ if (ch != EOF && !isspace(ch)) ungetc(ch, fp);
+ }
+ else if (ch != EOF)
+ do
+ {
+ *p++ = ch;
+ } while ((ch = getc(fp)) != EOF && !isspace(ch));
+ *p = '\0';
+ return buf;
+}
diff --git a/fonts/utilities/mff-29/findfile.c b/fonts/utilities/mff-29/findfile.c
new file mode 100644
index 0000000000..b81f6a133d
--- /dev/null
+++ b/fonts/utilities/mff-29/findfile.c
@@ -0,0 +1,64 @@
+/* findfile.c 2.9.0 92/07/06 -- small routine to find a file using a searchpath
+ (Simplified from earlier version) */
+
+/* Copyright (c) 1991 Damian Cugley -- see file COPYING for details. */
+
+#include <errno.h>
+
+#include "config.h"
+#include "strmisc.h" /* includes <string(s).h> */
+#include "searchpath.h"
+
+extern int errno;
+
+#define OK_P(FNAME,SUFFIX) \
+ (access((FNAME), 04) == 0 || \
+ ((SUFFIX) && *(SUFFIX) && access(strcat((FNAME), (SUFFIX)), 04) == 0))
+
+#define TRUE 1
+#define FALSE 0
+
+int /* boolean */
+findfile(buf, fname, path, suffix)
+ char *buf;
+ const char *fname, *path, *suffix;
+{
+ int access ARGS((const char *, int));
+ const char *p;
+ char *q;
+ int ok = FALSE;
+
+ /*
+ * If no file name, give up:
+ */
+ if (!fname || !*fname || !buf) {errno = EINVAL; return FALSE;}
+
+ /*
+ * If no path, or file is absolute, then don't search:
+ */
+ if (!path || *path == '\0' || absolute_path_p(fname))
+ return OK_P(strcpy(buf, fname), suffix);
+
+ q = buf, p = path;
+ for ( ;; ) /* scan the path */
+ if ( !(*q++ = *p++) || *(q - 1) == path_sep_ch
+#ifdef path_sep_ch2
+ || *(q - 1) == path_sep_ch2
+#endif
+ )
+ {
+ if (--q != buf && (*(q - 1) != dir_sep_ch
+#ifdef dir_sep_ch2
+ || *(q - 1) != dir_sep_ch2
+#endif
+ ))
+ *q++ = dir_sep_ch;
+ /* append / iff nonempty dirname */
+ (void)strcpy(q, fname);
+ if ((ok = OK_P(buf, suffix)) || !*(p - 1)) break;
+ /* if match or end of path then break */
+ q = buf;
+ }
+
+ return ok;
+}
diff --git a/fonts/utilities/mff-29/fx.c b/fonts/utilities/mff-29/fx.c
new file mode 100644
index 0000000000..86935452e6
--- /dev/null
+++ b/fonts/utilities/mff-29/fx.c
@@ -0,0 +1,310 @@
+/* fx.c 2.9.0 92/07/06 - the simple fork-and-exec function used in mff.c
+ *
+ * The only f&x needed is calling up METAFONT and GFtoPK,
+ * and these programs take only one argument. It is convenient
+ * to allow the templates given to include spaces, e.g.,
+ * `-M "jobserver -q cmmf"' actually runs `jobserver'.
+ *
+ * I have ignored the "struct wait" nonsense -- Edition 7 all the way! :-)
+ *
+ * ATARI ST (and presumablu MS-DOS?) modification -- pdc 25 Jul 91
+ * There is no fork-&-exec in TOS; Use spawnvp instead.
+ *
+-----------------------------------------------------------------------
+ This software module copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+ * Created - pdc Mon 15 Jan 1990
+ */
+
+#include "config.h"
+
+#ifndef NO_EXEC_USE_SPAWN
+# include <signal.h> /* NSIG */
+#else
+# include <process.h> /* P_WAIT */
+#endif /* no_exec_use_spawn */
+
+#include <errno.h>
+
+#include "stdc.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "fatal.h" /* how to error messages */
+#include "strmisc.h" /* incl. <string(s).h> */
+#include "fx.h"
+
+NONRETURNING void exit ARGS((int));
+
+#define TRUE 1
+#define FALSE 0
+
+
+#ifndef lint
+addr realloc ARGS((addr, sizeof_t));
+#else
+# define realloc(P,S) 0
+#endif
+
+#define MORE 16
+/*
+ * generate more argv slots in batches of 16
+ * (I will be surprised if 16 are needed!)
+ */
+
+/*
+ * Construct an argv vector for the child process.
+ *
+ * |command| is pointer to zero-terminated string of characters;
+ * it is broken up as per strword(3) into separate arguments.
+ * |arg| is a final argument to append to the |argv| vector;
+ * it is *not* broken into words.
+ */
+static inline char **
+construct_args(command, argc, argv)
+ int argc;
+ char *command, **argv;
+{
+ int num_args = 0, max_args = MORE + argc;
+ char **nargv = (char **)xmalloc(max_args * sizeof(char *)),
+ *p, *strword_state;
+
+ if (!(p = strword(command, &strword_state)))
+ syntaxf("command string is empty!");
+ /* There should always be at least one word */
+ do
+ {
+ if (max_args - num_args == 1 + argc) /* always two spare arg slots */
+ {
+ /* try to make some more room */
+ nargv = (char **)
+ xrealloc(nargv, (max_args += MORE) * sizeof (char *));
+ }
+ nargv[num_args++] = p;
+ p = strword((char *)NULL, &strword_state);
+ } while (p);
+
+ /* There are always two free slots in the |nargv| array: */
+ while (argc-- > 0)
+ nargv[num_args++] = *argv++;
+
+ nargv[num_args] = (char *)NULL;
+ return nargv;
+}
+
+
+/*
+ * fx -- run a subprocess and wait for it to finish
+ */
+
+#ifdef NO_EXEC_USE_SPAWN
+
+void
+fx(char *command, int argc, char **argv)
+{
+ char **argv = construct_args(command, argc, argv);
+ int exit_code = spawnvp(P_WAIT, argv[0], argv);
+
+ xfree((addr)argv);
+ if (exit_code < 0) /* I am guessing positive exit codes are OK */
+ fatalf("%s terminated with exit code %d\n", command, exit_code);
+}
+
+#else /* EXEC is available: */
+
+#ifdef BSD
+# ifndef vfork
+# define fork vfork
+/*
+ * use vfork in preference to fork -- unless vfork has been #defined
+ * to fork (which might be expected on post-VM-problems UNIXes
+ */
+# endif
+#endif
+
+int wait ARGS((int *));
+int fork ARGS((void));
+int execvp ARGS((const char *, const char **));
+void NONRETURNING _exit ARGS((int));
+
+#ifdef NO_SIGLIST
+
+/*
+ * Must supply own list of signal names:
+ */
+static const char *sys_siglist[] =
+{
+ "shookum hip RALLO dine!", /* there is no signal 0 */
+ "hangup",
+ "interrupt",
+ "quit",
+ "illegal instruction",
+ "trace trap", /* 5 */
+ "IOT Trap",
+ "EMT trap",
+ "arithmetic exception",
+ "kill -KILL",
+ "bus error", /* 10 */
+ "violation of segments",
+ "bad argument to system call",
+ "unrequited pipe",
+ "alarm clock",
+ "software terminate -- from kill(2)", /* 15 */
+ /* that was the Edition 7 signals (0-15)... */
+#ifdef USG
+ "user-defined signal number 1", /* 16 */
+ "user-defined signal number 2", /* 17 */
+ "lonely child process", /* 18 */
+ "death! death! death!", /* 19 -- power failure */
+ /*
+ * For other systems (4.1 BSD?), signals > 15
+ * will be reported numerically.
+ */
+#endif /* USG */
+};
+
+/* define NSIG to be # of messages in above: */
+# undef NSIG
+# define NSIG ((sizeof sys_siglist)/sizeof (char *))
+
+#else /* have siglist */
+ extern const char *sys_siglist[];
+#endif
+
+extern char *sys_errlist[];
+extern int sys_nerr;
+
+
+/*
+ * classic fork and exec -- |command| and |arg| as above.
+ * Waits for child to finish.
+ */
+void /* aborts if can't exec */
+fx(command, argc, argv)
+ int argc;
+ char *command, **argv;
+{
+ int pid, t;
+ int status, /* status word from wait() */
+ exit_code; /* exit code of child */
+
+ argv = construct_args(command, argc, argv);
+
+ if ((pid = fork()) < 0) pfatalf("fork");
+ else if (pid == 0)
+ {
+ /* This is the child */
+ (void)execvp((const char *)argv[0], (const char **)argv);
+ /* If we get here, something's gone wrong: */
+ perrorf(argv[0]);
+ _exit(1); /* don't use exit() in child */
+ }
+
+ /* This is the parent process */
+#ifdef BSD
+ t = wait(&status);
+#else
+ while ((t = wait(&status)) < 0 && errno == EINTR)
+ ;
+#endif
+ if (t != pid) pfatalf("very surprised because wait returned %d", t);
+ xfree((addr)argv);
+
+ if ((status & 0xFF) != 0)
+ {
+ /* Terminated by signal: */
+ int sig = status & 0x7F;
+
+ fprintf(stderr, "%s killed by signal %d", command, sig);
+ if (sig < NSIG)
+ fprintf(stderr, " (%s)\n", sys_siglist[sig]);
+ if (status & 0x80)
+ fprintf(stderr, "Wow, coredump city.\n");
+ exit(1);
+ }
+ else if (exit_code = status >> 8 & 0xFF)
+ {
+ fprintf(stderr, "%s terminated with exit code %d.\n",
+ command, exit_code);
+ exit(1);
+ }
+}
+
+
+#ifdef NO_EXECVP
+/*
+ * This is intended as a version of execvp for systems that don't have it.
+ * (V7, BSD 4.2?)
+ *
+ * If an executable file is found for which execv() fails,
+ * it is assumed to be a shellscript and /bin/sh is invoked with
+ * its full pathname as first argument.
+ *
+ * pdc Thur. 27 June 1991
+ */
+
+#include <sys/param.h>
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+#include "strmisc.h"
+#include "searchpath.h" /* might as well use that */
+
+int /* returns -1 if fails */
+execvp(progname, argv)
+ const char *progname; /* name of prog to search for */
+ const char *argv[]; /* vector of arguments */
+{
+ const char *getenv ARGS((const char *));
+ int execv ARGS((const char *, const char *[]));
+
+ char scratch[MAXPATHLEN];
+ const char *path = getenv("PATH");
+
+ if (!path) path = ""; /* for mad people who like PATH-free shells */
+
+ if (findfile(scratch, progname, path, (char *)0))
+ {
+ if (execv(scratch, argv), errno == ENOEXEC)
+ {
+ /*
+ * a /bin/sh command file
+ * Substitute pathname of file as 1st argument to sh:
+ * execvp("fo", {"fo","arg","brg",0}) ->
+ * /bin/sh /usr/local/bin/fo arg brg
+ */
+ const char **nargv; /* ptr to vect of ptrs to vects of const char */
+ int argc;
+
+ /*
+ * count args:
+ */
+ {
+ register const char **t = argv;
+ while (*t) ++t;
+ argc = (t - argv);
+ }
+
+ /* allocate room for 1 more arg & the NULL */
+ /* copy the NULL and the args except the 0'th arg */
+ nargv = (const char **)xmalloc(sizeof (char *) * (argc + 2));
+ bcopy((addr)(argv + 1), (addr)(nargv + 2),
+ argc*(sizeof (char *)));
+ nargv[0] = "/bin/sh";
+ nargv[1] = scratch;
+ execv(nargv[0], nargv);
+
+ /* failed -- */
+ xfree((addr)nargv);
+ }
+ }
+ else
+ {
+ /* findfile returned FALSE */
+ errno = ENOENT;
+ }
+
+ return -1;
+}
+#endif /* NO_EXECVP */
+#endif /* NO_EXEC_USE_SPAWN */
diff --git a/fonts/utilities/mff-29/fx.h b/fonts/utilities/mff-29/fx.h
new file mode 100644
index 0000000000..01502a98b7
--- /dev/null
+++ b/fonts/utilities/mff-29/fx.h
@@ -0,0 +1,22 @@
+/* fx.h 2.9.0 92/07/06 - fork-and-execute a command
+ * Created - Damian Cugley <pdc@oxford.prg> Tue 16 Jan 1990
+ * Copyright (C) 1990 Damian Cugley
+ */
+
+void fx ARGS((char *command, int argc, char **argv));
+/*
+ * Fork and execute the |command| with final argument(s) |argv|.
+ * Normally the 0th element of argv is the 1st argument to the
+ * command being invoked. argc is the number of slots used.
+ *
+ * The |command| can include spaces (in the sense of |strword|),
+ * in which case the first word is the program to run and
+ * the other words are arguments inserted before |argv|.
+ * Members of |argv| can contain spaces, but always count as one argument
+ * each.
+ *
+ * e.g., fx("gftopk -v", "fog12.100gf")
+ * fx("cmmf", "\mode=this; input that; input theother; bye.")
+ *
+ * If it can't exec or child fails, it exit()s.
+ */
diff --git a/fonts/utilities/mff-29/gray.mf b/fonts/utilities/mff-29/gray.mf
new file mode 100644
index 0000000000..5ddd2ff812
--- /dev/null
+++ b/fonts/utilities/mff-29/gray.mf
@@ -0,0 +1,11 @@
+% gray.mf (or perhaps lightgrey.mf) - create a vanilla light grey file
+% Proofs charcters at N/4 pixels/inch (about N/100 pixels/mm),
+% where the printer has a resulution of N DPI.
+%
+% - Damian Cugley <pdc@oxford.prg> Tue 9 Jan 1990
+
+font_identifier "LIGHTGREY";
+boolean lightweight;
+input grayf;
+
+% See also Appendix H of the METAFONTbook.
diff --git a/fonts/utilities/mff-29/magstep.c b/fonts/utilities/mff-29/magstep.c
new file mode 100644
index 0000000000..ed3ad8a447
--- /dev/null
+++ b/fonts/utilities/mff-29/magstep.c
@@ -0,0 +1,48 @@
+/* magstep.c 2.9.0 92/07/06 -- simple magstep calculations -- avoids math.h */
+
+#include "stdc.h"
+#include "magstep.h"
+
+/* Copyright (c) 1991 Damian Cugley. */
+
+/*
+ * A faster routine (bit shifts, square if odd etc.) would
+ * be a waste of time & space as this'll never be used with i > 10:
+ */
+double
+magstep(i)
+ int i;
+{
+ double f = 1.0;
+
+ if (i < 0) return 1/magstep(-i);
+ while (i-- > 0)
+ f *= MAGSTEPONE;
+ return f;
+}
+
+/*
+ * Use e(x) for the difference between x and f. Want to minimize this.
+ * assume a < f < Ma ,
+ * e(a) < e(Ma) <=> f - a < Ma - f <=> 2f < (M + 1)a
+ */
+double
+stepmag(f)
+ double f;
+{
+ double twof = 2*f, result;
+
+ if (f <= 0.0) return 0.0;
+ if (f < 1.0) return 1/stepmag(1/f);
+
+ /* special cases for magstephalf (here M = m(1/2) ): */
+ if (twof < (1.0 + MAGSTEPHALF)) return 1.0;
+ if (f < MAGSTEPHALF || twof < (1.0 + MAGSTEPHALF)*MAGSTEPHALF)
+ return MAGSTEPHALF;
+
+ /* now M = m(1) */
+ for (result = MAGSTEPONE; result < f; result *= MAGSTEPONE)
+ if (twof < (1.0 + MAGSTEPONE)*result)
+ return result;
+ return result;
+}
diff --git a/fonts/utilities/mff-29/magstep.h b/fonts/utilities/mff-29/magstep.h
new file mode 100644
index 0000000000..50d08d7b90
--- /dev/null
+++ b/fonts/utilities/mff-29/magstep.h
@@ -0,0 +1,13 @@
+/* magstep.h 2.9.0 92/07/06
+ * Magstep calculation type function things
+ *
+ * magstep(i) is magstep i
+ * MAGSTEPHALF is magstep 1/2
+ * stepmag(f) is nearest magstep(n) to f
+ */
+
+#define MAGSTEPONE 1.2
+#define MAGSTEPHALF 1.09544511501033222690
+
+double magstep ARGS((int i));
+double stepmag ARGS((double f));
diff --git a/fonts/utilities/mff-29/mf.mf b/fonts/utilities/mff-29/mf.mf
new file mode 100644
index 0000000000..4aff095754
--- /dev/null
+++ b/fonts/utilities/mff-29/mf.mf
@@ -0,0 +1,30 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% A character font more than a little reminiscient of the
+% METAFONT logo font by D E Knuth. Bits of it are from the original
+% METAFONTbook METAFONT logo file
+% Damian Cugley, SEH <pdc@oxford.prg> Sat 24 Jun 1989
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+mode_setup;
+if unknown slant:
+ slant:=0
+else:
+ currenttransform:= identity slanted slant yscaled aspect_ratio
+fi;
+
+
+input mfparams;
+ % Set the various ad-hoc parameters based on |designsize| etc.
+
+input mfmacros; % define |beginlogochar| etc.
+
+input mfcaps;
+input mfpunct;
+input mfdigits;
+
+font_quad 18u#+2s#;
+font_normal_space 6u#+2s#;
+font_normal_stretch 3u#;
+font_normal_shrink 2u#;
+font_identifier jobname;
+font_coding_scheme "A-Z + some punctuation";
diff --git a/fonts/utilities/mff-29/mfbrackets.mf b/fonts/utilities/mff-29/mfbrackets.mf
new file mode 100644
index 0000000000..3a6093bcb1
--- /dev/null
+++ b/fonts/utilities/mff-29/mfbrackets.mf
@@ -0,0 +1,46 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Metafont programs for () [] <> {} in the style of the METAFONT logo
+% Damian Cugley, SEH <pdc@oxford.prg> Sun 2 Jul 1989
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def brackpoints(expr left_p) =
+ pair out;
+ if left_p:
+ w - x1 = w - x1' = x2 = x2' = x3 = leftstemloc;
+ out = left
+ else: x1 = x1' = w - x2 = w - x2' = w - x3 = leftstemloc ;
+ out = right
+ fi;
+ top y1 = top y2 = h + o;
+ y3 = 1/2[y1,y1'] = 1/2[y2,y2'] = barheight;
+enddef;
+
+def lbrack = brackpoints(true) enddef;
+def rbrack = brackpoints(false) enddef;
+
+def make_brackets(expr lcode, rcode, desc, u_width)(text t) =
+ beginlogochar(lcode,u_width); "Left " & desc & " " & lcode;
+ lbrack; t
+ endchar;
+ beginlogochar(rcode,u_width); "Right " & desc & " " & rcode;
+ rbrack; t
+ endchar;
+enddef;
+
+make_brackets("(",")","parenthesis",8,
+ half_super(1,3,1'); labels(1,3,1')
+);
+make_brackets("[","]","bracket",8,
+ draw z1 -- z2 -- z3 -- z2' -- z1'; labels(1,2,3,2',1')
+);
+make_brackets("<",">","angle bracket",12,
+ draw z1 -- z3 -- z1'; labels(1,3,1')
+);
+make_brackets("{","}","brace",10,
+ x4 = x4' = x5 = x5' = 1/2[x1,x2];
+ y4 = 2barheight - y4' = 0.8[y3,y1];
+ y5 = 2barheight - y5' = 0.2[y3,y1];
+ draw z1{out} ... z4{down} ... {down}z5 ... {out}z3 &
+ z3{-out} ... z5'{down} ... {down}z4' ... z1'{-out};
+ labels(1,4,5,3,5',4',1')
+);
diff --git a/fonts/utilities/mff-29/mfcaps.mf b/fonts/utilities/mff-29/mfcaps.mf
new file mode 100644
index 0000000000..eb0ee268f5
--- /dev/null
+++ b/fonts/utilities/mff-29/mfcaps.mf
@@ -0,0 +1,192 @@
+% Letters in the style of METAFONT logo font
+% Damian Cugley, SEH <pdc@oxford.prg> Fri 30 Jun 1989
+
+beginlogochar("A",15); "Knuth's letter A";
+x1=.5w; x2=x4=leftstemloc; x3=x5=w-x2;
+top y1=h+o; y2=y3=barheight;
+bot y4=bot y5=-o;
+draw z4--z2--z3--z5; super_half(2,1,3);
+labels(1,2,3,4,5);
+endchar;
+
+beginlogochar("B",15); "Capital B";
+ x1 = x2 = x6 = leftstemloc; x3 = x4 = x8 = 1/2 w;
+ x5 + xgap = x7 = w - 1.5 u - s;
+ top y1 = top y3 = h; bot y2 = bot y8 = 0; y4 = y6 = barheight;
+ y5 = 0.45[y6,y1]; y7 = 0.45[y2,y6];
+ draw z8 -- z2 -- z1 -- z3; draw z4 -- z6;
+ half_super(3,5,4); half_super(4,7,8);
+ labels(1,2,3,4,5,6); endchar;
+
+beginlogochar("C",15); "Capital C";
+ x1 = x4 = 1/2 w; top y1 = h + o; bot y4 = -o;
+ x2 = w - x3 = good.x(1.5u+s); y2 = y3 = barheight;
+ half_super(1,2,4); qtr_super(1,3); qtr_super(4,3);
+ labels(1,2,3,4); endchar;
+
+beginlogochar("D",15); "Capital D";
+ x1 = x3 = leftstemloc; w - x2 = good.x(1.5 u + s); x4 = x5 = 1/2 w;
+ top y1 = top y4 = h + o; bot y3 = bot y5 = -o; y2 = barheight;
+ half_super(4,2,5); draw z4; draw z4 -- z1 -- z3 -- z5;
+ labels(1,2,3,4,5); endchar;
+
+beginlogochar("E",14); "Capital E (Knuth's)";
+x1=x2=x3=leftstemloc;
+x4=x6=w-x1+ho; x5=x4-xgap;
+y1=y6; y2=y5; y3=y4;
+bot y1=0; top y3=h; y2=barheight;
+draw z6--z1--z3--z4; draw z2--z5;
+labels(1,2,3,4,5,6); endchar;
+
+beginlogochar("F",14); "Capital F (Knuth's)";
+x1=x2=x3=leftstemloc;
+x4=w-x1+ho; x5=x4-xgap;
+y2=y5; y3=y4; bot y1=-o;
+top y3=h; y2=barheight;
+draw z1--z3--z4; draw z2--z5;
+labels(1,2,3,4,5); endchar;
+
+beginlogochar("G",15); "Capital G";
+ x1 = x4 = x6 = 1/2 w; x2 = good.x(1.5u+s);
+ x3 = x5 = x7 = w - leftstemloc;
+ y2 = y3 = y6 = barheight; top y1 = h + o;
+ bot y4 = -o; bot y5 = 0; y7 = 0.8[y6,y1];
+ half_super(1,2,4);
+ draw z7{z1-z3} ... z1{left}; draw z6 -- z3 -- z5 .. z4{left};
+ labels(1,2,3,4,5,6,7); endchar;
+
+beginlogochar("H",16); "Capital H";
+ sixpoints;
+ draw z1 -- z3; draw z4 -- z6; draw z2 -- z5;
+ labels(1,2,3,4,5,6); endchar;
+
+beginlogochar("I",5); "Capital I";
+ x1 = x2 = leftstemloc;
+ top y1 = h + o; bot y2 = -o;
+ draw z1 -- z2;
+ labels(1,2); endchar;
+
+beginlogochar("J",12); "Capital J";
+ x1 = x2 = w - leftstemloc; x3 = 1/2[x1,x4]; x4 = leftstemloc;
+ top y1 = h + o; bot y3 = -o; y2 = y4 = 0.45 barheight;
+ super_half(2,3,4); draw z1 -- z2;
+ labels(1,2,3,4); endchar;
+
+beginlogochar("K",16); "Capital K";
+ sixpoints;
+ draw z1 -- z3; draw z4 -- z2 -- z6;
+ labels(1,2,3,4,6); endchar;
+
+beginlogochar("L",15); "Capital L";
+ x1 = x2 = w - x3 = leftstemloc;
+ top y1 = h + o; bot y2 = bot y3 = 0;
+ draw z1 -- z2 -- z3;
+ labels(1,2,3); endchar;
+
+beginlogochar("M",18);
+x1=x2=leftstemloc; x4=x5=w-x1; x3=w-x3;
+y1=y5; y2=y4; bot y1=-o;
+top y2=h+o; y3=y1+ygap;
+draw z1--z2--z3--z4--z5;
+labels(1,2,3,4,5); endchar;
+
+beginlogochar("N",15);
+x1=x2=leftstemloc; x3=x4=x5=w-x1;
+bot y1=bot y4=-o;
+top y2=top y5=h+o; y3=y4+ygap;
+draw z1--z2--z3; draw z4--z5;
+labels(1,2,3,4,5); endchar;
+
+beginlogochar("O",15);
+x1=x4=.5w; top y1=h+o; bot y4=-o;
+x2=w-x3=good.x(1.5u+s); y2=y3=barheight;
+super_half(2,1,3); super_half(2,4,3);
+labels(1,2,3,4); endchar;
+
+beginlogochar("P",15); "Capital P";
+ x1 = x2 = x6 = leftstemloc; x3 = x4 = 1/2 w; x5 = w - 1.5 u - s;
+ top y1 = top y3 = h; bot y2 = -o; y4 = y6 = barheight;
+ y5 = 0.45[y4,y3];
+ draw z2 -- z1 -- z3; draw z4 -- z6;
+ half_super(3,5,4);
+ labels(1,2,3,4,5,6); endchar;
+
+beginlogochar("Q",15); "Capital Q";
+ x1 = x4 = x5 = 1/2 w; top y1 = h + o; bot y4 = -o;
+ x2 = w - x3 = good.x(1.5u+s); y2 = y3 = barheight;
+ x6 = 1/2[x1,x3]; -y6 = ygap; y5 = 1/3 barheight;
+ super_half(2,1,3); super_half(2,4,3); draw z5 -- z6;
+ labels(1,2,3,4,5,6); endchar;
+
+beginlogochar("R",15); "Capital R";
+ x1 = x2 = x6 = leftstemloc; x3 = x4 = 1/2 w;
+ x5 = x7 = w - 1.5 u - s;
+ top y1 = top y3 = h; bot y2 = 0; bot y7 = -o;
+ y4 = y6 = barheight; y5 = 0.45[y6,y1];
+ draw z2 -- z1 -- z3; draw z7 .. z4{left} -- z6;
+ half_super(3,5,4);
+ labels(1,2,3,4,5,6,7); endchar;
+
+beginlogochar("S",14); "Capital S";
+ x1 = w - x1' = x2' = w - x2 = leftstemloc;
+ x3 = x4 = x5 = 1/2[x1,x2];
+ y1 = y1' = 0.45[y4,y3]; y2 = y2' = 0.45[y5,y4];
+ top y3 = h + o; y4 = barheight; bot y5 = -o;
+ half_super(3,1,4); half_super(4,2,5);
+ draw subpath (0,1.7) of
+ (z5{left} ... (.8[x5,x2'],.8[y2',y5]){z2'-z5} ... z2'{up});
+ draw subpath (0,1.7) of
+ (z3{right} .. (0.8[x3,x1'],0.8[y1',y3]){z1'-z3} ... z1'{down});
+ labels(1,2,3,4,5,1',2'); endchar;
+
+beginlogochar("T",13); "Knuth's T";
+italcorr ht#*slant + .5u#;
+if .5w<>good.x .5w: change_width; fi
+lft x1=-eps; x2=w-x1; x3=x4=.5w;
+y1=y2=y3; top y1=h; bot y4=-o;
+draw z1--z2; draw z3--z4;
+labels(1,2,3,4); endchar;
+
+beginlogochar("U",15); "Capital U";
+ sixpoints; z7 = 1/2[z3,z6];
+ draw z1 .. z2; draw z4 .. z5;
+ super_half(5,7,2);
+ labels(1,2,4,5,7); endchar;
+
+beginlogochar("V",15); "Capital V";
+ sixpoints; z7 = 1/2[z3,z6];
+ draw z1 --- z7 --- z4;
+ labels(1,7,4); endchar;
+
+beginlogochar("W",18); "Capital W";
+ x1 = w - x1' = good.x(1.5 u + s);
+ x2 = w - x2' = x1 + xgap; x3 = 0.5[x1,x1'];
+ top y1 = top y1' = h + o; bot y2 = bot y2' = -o;
+ y3 = y1 - 2ygap;
+ draw z1 -- z2 -- z3 -- z2' -- z1';
+ labels(1,2,3,2',1'); endchar;
+
+beginlogochar("X",15); "Capital X";
+ x2 = w - x2' = 1.5 u + s;
+ x1 = w - x1' = good.x(x2 + 0.5 xgap);
+ top y1 = top y1' = h + o; bot y2 = bot y2' = -o;
+ draw z1 -- z2'; draw z1' -- z2;
+ labels(1,2,1',2'); endchar;
+
+beginlogochar("Y",15); "Capital Y";
+ x2 = w - x2' = 1.5 u + s;
+ x1 = w - x1' = good.x(x2 + 0.5 xgap);
+ top y1 = top y1' = h + o; bot y2 = bot y2' = -o;
+ z3 = whatever[z1,z2'] = whatever[z1',z2];
+ x4 = x3; y4 = y2;
+ draw z1 -- z3 -- z1'; draw z3 -- z4;
+ labels(1,1',3,4); endchar;
+
+beginlogochar("Z",15); "Capital Z";
+ x1 = x2 = w - x1' = w - x2' = good.x(2 u + s);
+ top y1 = top y1' = h; bot y2 = bot y2' = 0;
+ draw z1 -- z1' -- z2 -- z2';
+ labels(1,2,1',2'); endchar;
+
+ligtable "T": "A" kern -.5u#;
+ligtable "F": "O" kern -u#;
diff --git a/fonts/utilities/mff-29/mfcommas.mf b/fonts/utilities/mff-29/mfcommas.mf
new file mode 100644
index 0000000000..908b1714a2
--- /dev/null
+++ b/fonts/utilities/mff-29/mfcommas.mf
@@ -0,0 +1,64 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Programs to make comma-like characters for mflogo
+% Damian Cugley, SEH <pdc@oxford.prg> Sun 2 Jul 1989
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def comma(suffix $)(text -+-) = % -+- should be `+' or `-'
+ pickup dot_pen; drawdot(z$);
+ x$a = x$b = x$ -+- 1/2(dot_pen_width - px); % Right edge
+ x$c = x$ -+- 1/2(px - dot_pen_width); % Left edge
+ y$a = y$; % Middle of blob
+ y$b = y$a -+- -1/2 dot_pen_height; % bottom of blob
+ y$c = y$b -+- -(ygap + o - 1/2 py); % Bottom of tail bit
+ pickup pencircle xscaled px yscaled 0.75 py;
+ draw z$a ... z$b ... z$c; labels($a,$b,$c)
+enddef;
+
+def semicolon_like(expr code, desc, updot, downtail) =
+ beginchar(code,6 u# + 2 s#,
+ if updot: xheight# else: dot_pen_height# - 2o# fi,
+ if downtail: ygap# else: 0 fi); desc;
+ pickup dot_pen;
+ lft x1 = lft x2 = leftstemloc;
+ top y1 = xheight + o; bot y2 = -o;
+ if updot: drawdot z1 fi;
+ if downtail: comma(2,+) else: drawdot(z2) fi;
+ labels(1,2);
+ endchar;
+enddef;
+
+semicolon_like(".","Full stop",false,false);
+semicolon_like(",","Comma",false,true);
+semicolon_like(":","Colon",true,false);
+semicolon_like(";","Semi-colon",true,true);
+
+beginlogochar("'",8); "Quote (')";
+ pickup dot_pen;
+ top y1 = h + o; lft x1 = leftstemloc - ho;
+ comma(1,+); labels(1);
+endchar;
+
+beginlogochar("`",8); "Backquote (`)";
+ pickup dot_pen;
+ top y1 = h - ygap +o; rt x1 = w - leftstemloc + ho;
+ comma(1,-); labels(1);
+endchar;
+
+open_quotes := nextcode;
+beginlogochar(open_quotes,12); "Double open-quotes (``)";
+ pickup dot_pen;
+ rt x1 = rt (x2 + 3.5 u) = w - leftstemloc + ho;
+ top y1 = top y2 = h - ygap + o;
+ comma(1,-); comma(2,-); labels(1);
+endchar;
+
+close_quotes := nextcode;
+beginlogochar(close_quotes,12); "Double close-quotes ('')";
+ pickup dot_pen;
+ lft x1 = lft (x2 - 3.5 u) = leftstemloc - ho;
+ top y1 = top y2 = h + o;
+ comma(1,+); comma(2,+); labels(1,2);
+endchar;
+
+ligtable "`": "`" =: open_quotes;
+ligtable "'": "'" =: close_quotes;
diff --git a/fonts/utilities/mff-29/mfdigits.mf b/fonts/utilities/mff-29/mfdigits.mf
new file mode 100644
index 0000000000..de5599d268
--- /dev/null
+++ b/fonts/utilities/mff-29/mfdigits.mf
@@ -0,0 +1,55 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% mfdigits.mf - a set of digits for the MFLOGO font
+%
+% This file is designed to be |input| by `mflogo.mf'.
+%
+% Damian Cugley <pdc@oxford.prg> Fri 15 Dec 1989
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+beginlogodigit("0");
+ x.O1=x.O3=.5w; top y.O1=h+o; bot y.O3=-o; % points at top and bottom
+ x.O4=w-x.O2=good.x(1.5u+s); y.O2=y.O4=barheight; % points in middle
+ super_points(O);
+ draw super_arc(O)(1,1',2,2',3,3',4,4',1) & cycle;
+ penlabels(O1,O1',O2,O2',O3,O3',O4,O4');
+endchar;
+
+beginlogodigit("1");
+ % Note that I am including serifs in this character...
+ if 1/2w <> good.x 1/2w: change_width; fi % Assure symmetry
+ x1 = x2 = 1/2w; top y1 = h + o; bot y2 = 0; % Points at ends of vertical
+ x3 = x4 = w - x5 = leftstemloc; % points at ends of serifs
+ y4 = y5 = y2; y3 = 2/3[barheight,h];
+ draw z3{right} .. z1{up} & z1 -- z2;
+ draw z4 -- z5;
+ penlabels(1,2,3,4,5);
+endchar;
+
+beginlogodigit("2");
+ % Define points on top part of curve:
+ x.T1 = x.T3 = 1/2w; top y.T1 = h+o; bot y.T3 = 0.8barheight;
+ x.T4 = w - x.T2 = good.x(1.5u + s); y.T2=y.T4=0.45[barheight,h];
+ super_points(T);
+ % define points on bottom part (B) and stroke(S):
+ z.B1 = z.T3;
+ x.B4 = w - x.B2 = x.T4; bot y.B4 = 0 = bot y.B2; super_points(B);
+ draw super_arc(T)(4,4',1,1',2,2',3) &
+ (reverse (super_arc(B)(4,4',1))) -- z.B2;
+;
+ penlabels(T1,T1',T2,T2',T3,T4',T4,B4',B4,B2);
+endchar;
+
+beginlogodigit("3");
+ % Define points on top part of curve:
+ x.T1 = x.T3 = 1/2w; top y.T1 = h+o; bot y.T3 = barheight;
+ x.T4 = w - x.T2 = good.x(1.5u + s); y.T2=y.T4=0.45[y.T3,y.T1];
+ super_points(T);
+ % define points on bottom part (B) and stroke(S):
+ z.B1 = z.T3; x.B3 = x.B1; bot y.B3 = 0;
+ x.B4 = w - x.B2 = x.T4; y.B4 = y.B2 = 0.45[y.B3,y.B1];
+ super_points(B);
+ draw super_arc(T)(4,4',1,1',2,2',3) &
+ super_arc(B)(1,1',2,2',3,3',4);
+ penlabels(T1,T1',T2,T2',T3,T4',T4,B1,B1',B2,B2',B3,B3',B4)
+endchar;
+
diff --git a/fonts/utilities/mff-29/mff.1 b/fonts/utilities/mff-29/mff.1
new file mode 100644
index 0000000000..8b51df5073
--- /dev/null
+++ b/fonts/utilities/mff-29/mff.1
@@ -0,0 +1,950 @@
+.TH MFF 1 "pdc Mon. 2 Dec. 1991" "mff 2.8.2" "CONTRIBUTED PROGRAMS"
+.SH NAME
+mff \- run METAFONT and GFtoPK to create members of TeX font families
+(formerly called mfjob)
+.SH SYNOPSIS
+.\"
+.\" mff.1 - manual page for mff - pdc Fri. 28 Sept. 1990
+.\" Copyright (C) 1990-1991 Damian Cugley
+.\" See file COPYING in the mff source for info on making copies.
+.\"
+.ds RC /mclab/pdc/lib
+.ds MJ /mclab/pdc/src/mff
+. \" **FIXME**
+. \" comment out above 2 lines and insert appropriate definitions
+. \" RC should the the the directory the system RC file is in
+. \" MJ should be the directory mff source is in
+.ie n \{\
+. ds Te TeX
+. ds gf GFtoPK
+. ds mf METAFONT\}
+.el \{\
+. ds Te T\v|0.25m|\h|-0.1m|E\v|-0.25m|X
+. ds gf \s-1GF\s0to\s-1PK\s0
+. ds mf \s-1METAFONT\s0\}
+.na
+.B mff
+[
+.B \-nvRS
+|
+.B \-MGTP
+.IR template
+|
+.B \-WCIJ
+.IB string = mftext
+.if n .RS
+|
+.B \-Z
+.IB dpi = modename
+.if t .RS
+|
+.B \-eE
+.IR mftext
+.if n .br
+|
+.B \-x
+|
+.B \-k
+.I factor(s)
+|
+.B \-p
+.I suffix
+.if n .br
+|
+.B \-a
+.I atsize(s)
+|
+.B \-s
+.I factor(s)
+|
+.B \-m
+.I magstep(s)
+.if n .br
+|
+.B \-wcij
+.I mftext
+|
+.B \-z
+.I modename
+|
+.B \-d
+.I dpi(s)
+|
+.B \-f
+.I file
+.if n .br
+|
+.B \-D
+|
+.I font
+].\|.\|.
+.RE
+.LP
+.B mff
+.B \-V
+|
+.B \-h
+.SH CONTENTS
+.TP
+.SM DESCRIPTION
+.PD 0v
+Family matters
+.br
+What
+.I mff
+does
+.br
+Using
+.I mff
+with conventional driver files
+.TP
+.SM OPTIONS
+Choosing which font to create
+.br
+Parsing the suffix
+.br
+Templates
+.br
+Miscellaneous
+.TP
+.SM ENVIRONMENT
+.TP
+.SM FILES
+.PD
+.SH DESCRIPTION
+.I mff
+is a front-end to the
+\*(mf
+program (see
+.IR mf (1)),
+and is intended to be useful for creating \*(Te fonts in batches. It will run
+\*(mf
+and \*(gf (see
+.IR gftopk (1))
+and then transfer the files to the correct directories.
+.SS "\*SFamily matters"
+.I mff
+supports conventions that can be used to maintain a family of fonts
+derived systematically from common program files. A family in this
+context is a group of related fonts designed together \(em for example,
+the Malvern family includes Malvern, Malvern bold extended and Malvern
+italic.
+.LP
+Instead of using one driver file for each variation within the family, a
+.I generic driver file
+named with the abbreviation of the family name (e.g.,
+.BR ma.mf )
+is read after the standard
+\*(mf
+parameter
+.B designsize
+and optionally others
+(such as
+.B weight
+or
+.BR slant )
+have already been assigned values. Usually other `ad hoc' parameters
+are calculated from these and then the character program files read in
+to create the font.
+.LP
+Fonts within the family will be given names formed from the family name
+abbreviation, a suffix indicating the variant type and size. The size
+goes at the end and can contain a
+.RB ` p '
+or
+.RB ` m '
+standing for a decimal point (there must be a digit before the `decimal
+point' and also after it if it is
+.RB ` p ').
+An
+.RB ` m '
+indicates that the size is in millimetres rather than \*(Te points. For
+example,
+.B ma35a10
+is `ten-point Malvern 35 light',
+.B ma55a7p5
+is `7.5-pt Malvern', and
+.B ma74a4m2
+is `4.2-mm Malvern 74 bold extended italic'. These do
+.I not
+have to have separate
+.B .mf
+driver files.
+.SS "\*SWhat mff does"
+For each
+.I font
+argument,
+.I mff
+removes the suffix giving a stub that should be the family name (and
+usually the generic driver name). For example,
+.B ma74a12
+would have 12\|pt design size and style suffix
+.BR 74a ;
+.B mabxi4m2
+has 4.2\|mm design size and suffix
+.BR bxi .
+Then it invokes \*(mf with a first line
+.if t .sp 0.5v
+.if n .sp
+.RS
+.BI \e\|mode= modename ;
+.B font_size
+.IB size ;
+.IB "assignments to parameters" ;
+.IB "extra mf text" ;
+.B input
+.IB driver ;
+.B bye.
+.RE
+.if n .sp
+.if t .sp 0.5v
+The
+.I modename
+tells
+\*(mf
+what sort of device the font is being created for.
+The
+.B font_size
+command sets the standard \*(mf variable
+.B designsize
+(see Appendix\ F of the
+.IR \*(mfbook ).
+The `assignments to parameters' are generated from the suffix and a
+lookup table (see under
+.I Parsing the suffix
+below).
+The `extra mf text' (set with
+the
+.B \-E
+option) might include
+more
+.B input
+commands
+(other
+.B input
+commands
+can't be used before the first
+.B input
+because it would give the font the wrong name).
+.LP
+After \*(mf has been run, the \*(gf program is invoked to create the
+bitmap file. The
+.SM PK
+and
+.SM TFM
+files are then renamed into the user's `font area' directories and the
+.SM GF
+file is removed.
+.LP
+The tables used to translate suffixes into
+\*(mf
+code and so on are all definable using command-line options. See under
+the
+.B \-f
+option and
+.SM
+.B FILES
+below for information on defining such tables sensibly.
+.LP
+Log files will be named after the generic driver file rather than the
+individual fonts, so that if there are many fonts from the same family
+in the command line only one log file is written \(em for the last font
+generated. Usually this is a good thing because it slows the
+accumulation of useless log files. If the font is made successfully
+then the log file usually is not wanted and if the font fails,
+.I mff
+terminates and leaves the log file with the error message in it.
+.SS "\*SUsing mff with conventional driver files"
+To use
+.I mff
+to create a font using non-generic driver files, use
+the
+.B \-S
+option to supress the parsing step.
+.LP
+To use
+.I mff
+with the
+.BR dc / ec
+fonts you might try using
+.B \-e
+.BR gensize=designsize ;
+the
+.B generate
+command they use is equivalent to
+.BR input .
+With the Sauter fonts there is the problem that the generic driver has
+.RB ` b\- '
+or
+.RB ` build\- '
+prepended to it; as well as using
+.B \-e
+.B design_size=designsize
+you will have to use the
+.B \-g
+option to get around this (or rename the files).
+(I would claim that using the
+.B font_size
+macro and builtin variable
+.B designsize
+is more `obvious' and sensible than making up a new name and using that.
+Also, why do neither of those systems appear to take any notice of the #
+convention for measurements in `sharp' units?)
+.SH OPTIONS
+The large number of options is a result of the admittedly eccentric
+decision to make the command language used to describe how to make fonts
+the same as the language of the command-line options.
+.PP
+Options and
+.I font
+arguments can be intermixed; they are read in left-to-right order. A
+plus replacing a hyphen is used to set something back to its default
+value. Flags that take an argument do not take an argument when used
+with a
+.BR + .
+(See
+.IR argloop (3)
+for more details.)
+.SS "\*SChoosing which font to create"
+An argument named
+.I foo(s)
+below can be a list of values (the list must still form one shell word,
+so should not include unquoted spaces). For example a valid
+.I dpi(s)
+would be
+.RB ` 118,300 '.
+Each font creation will be performed once for each value.
+.TP
+.BI \-a " atsize(s)"
+This is used to calculate the scaling of following fonts to match a
+\*(Te
+.RB ` at
+.IR size '
+specification. An
+.I atsize
+is a size which is interpreted as points or millimetres depending on
+whether the following font name has an
+.RB ` m '
+in the size. When the next font name is parsed,
+.I mff
+calculates the nearest magstep (see under
+.BR \-m )
+to the ratio
+.IR at-size \|/\| design-size
+and sets the scaling to that value.
+For example, if it appears as
+.RB ` "\-a 17 ma55a10" ',
+the scaling is set to
+magstep 3, which is 1.728, so it is equivalent to
+.RB ` "\-m 3 ma55a10" '.
+.B +a
+sets the scaling to 1 (same as
+.B +s
+or
+.BR +m ).
+.TP
+.BI \-d " dpi(s)"
+Sets the device for which fonts are being created. A
+.I dpi
+is the number of pixels per inch of the device, used to identify it in
+an table of `modenames' (see under
+.BR \-Z ).
+.B +d
+selects 200 DPI (the
+.I lowres
+device, which is defined in
+.BR plain.mf ).
+.TP
+.BI \-m " magstep(s)"
+Sets the magnification at which
+\*(mf
+will be run to be magstep
+.IR magstep ,
+that is, 1.2 raised to the
+.IR magstep th
+power. A
+.I magstep
+is either an integer, or
+.B h
+(meaning magstephalf = sqrt(1.2) = 1.095), or
+.B \-h
+(meaning 0.913).
+.B +m
+sets the magnification to be 1.0 (same as
+.B +a
+or
+.BR +s ).
+.TP
+.BI \-s " scale(s)"
+Sets the \*(mf magnification to
+.IR scale .
+A
+.I scale
+can either be a number (possibly including a decimal point) less than
+100.0, in which case it is taken as is, or over 100, in which case it is
+assumed to be a \*(Te
+.B scaled
+number and is divided by 1000.
+.B +s
+sets the magnification to 1.0 (same as
+.B +a
+or
+.BR +m ).
+.TP
+.BI \-Z " dpi=modename"
+Adds an entry to the `modename' table. This is used to map
+.I dpi
+values onto the \*(mf names for those devices. A modename is what goes
+after
+.RB ` \e\|mode= '
+in the \*(mf command line. If a modename starts with a double-quote
+character, as in
+.ie t .sp 0.5v
+.el .sp
+.B
+ mff \-Z \(fm500="zambo"\(fm .\|.\|.
+.ie t .sp 0.5v
+.el .sp
+then
+.RB ` \e\|smode= '
+is used instead (this causes \*(mf to read a file
+.B zambo.mf
+rather than attempt to use a predefined mode
+\(em see Section\ 4 of Appendix\ B of the
+.IR \*(mfbook ).
+.B \-Z \-
+discards the `modename' table.
+.B +Z
+restores the default `modename' table (which contains only Knuth's
+.I lowres
+device \(em not very useful).
+.TP
+.BI \-z " modename"
+Overrides the modename derived from the `modename' table and the
+.I dpi
+value.
+.B +z
+cancels
+.BR \-z.
+.SS "\*SParsing the suffix"
+Names are parsed from right-to-left. After the size has been stripped
+off, for each of four tables of
+.IR suffix = mftext
+pairs, if there is a match between a
+.I suffix
+and the end of the stub, then the
+.I mftext
+is inserted into the \*(mf command line and the
+.I suffix
+is stripped off. The
+.I mftext
+is expected to be an assignment or equation, such as
+.BR weight=1.25 .
+(Semicolons are automatically inserted between them.)
+.LP
+The resulting stub is taken to be the family name \(em and therefore the
+name of the generic driver file. If it ends in a hyphen, the hyphen is
+removed too \(em this is for when the basename would otherwise seem to end
+with a suffix. For example, if
+.B fab
+was a family name, you might use
+.RB ` fab\-12 '
+to avoid having it split as
+.B fa\ b\ 12 .
+The font created will still be called
+.BR fab12.tfm .
+(\*(Te font names should not contain hyphens.)
+.LP
+The tables are intended to provied three dimensions of `variant style'
+\- the
+.I weight
+(W) table gives an axis from `light' to `bold'; the
+.I condensedness
+(C) table gives an axis from `condensed' to `expanded'; and the
+.I italic
+(I) table chooses roman, italic or obliqued options. (Omitted suffixes
+standing for `regular'.)
+.LP
+The fourth table (J) has no fixed meaning, but might be used to select a
+subset of the possible characters in that style \(em for example, a full
+font might have programs for uppercase, lowercase, small-caps, math
+italic, accents, accented letters, punctuation and symbols: more than
+can be fitted into 256 characters. The J table might have entries for
+.B msy
+(mathematical symbols) and
+.B csc
+(caps-and-small-caps).
+.LP
+The tables are used in the order J, I, C, W;
+therefore they appear in the name in the order W, C, I, J. Thus
+.B madcicsc14
+might be `fourteen-point Malvern demibold condensed italic
+caps-and-small-caps'.
+.LP
+The meanings of the four tables are not cast in stone, of course.
+.TP
+.BI \-W " suffix=mftext"
+Adds an association to table W.
+.B +W
+discards table W.
+.TP
+.BI \-w " mftext"
+Overrides the text derived from the W table. The parsing is still
+performed.
+.B +w
+cancels
+.BR \-w.
+.LP
+The other three tables have corresponding option letters
+.BR \-C ,
+.BR \-c ,
+.BR \-I ,
+.BR \-J ,
+.B \-J
+and
+.BR \-j .
+.TP
+.BI \-g " file"
+This overrides the deduced `generic driver file' name. For example, to
+use a file
+.B malvern.mf
+for the generic driver rather than
+.BR ma.mf ,
+.I mff
+could be invoked with
+.B mff
+.B \-g
+.BR malvern .
+.B +g
+cancels
+.BR \-g .
+.TP
+.B \-S
+Indicates that this is a
+.RI fixed- S ize
+font
+\(em the
+.I font_size
+assignment is omitted from the \*(mf command line and the parsing of the
+W, C, I and J suffixes is not attempted. This is appropriate for
+standard fonts like
+.B cmr12
+which do not have the ability to be built at different sizes.
+.SS \*STemplates
+The following four options tell
+.I mff
+how to go about installing a font.
+.TP
+.BI \-G " template"
+Tells
+.I mff
+how to invoke \*(gf. If this is just a hyphen, the \s-1GF\s0-to-pixel
+step is omitted.
+.B +G
+sets the \*(gf template to
+.RB ` gfto%p '.
+The command is broken into words at whitespace. For example,
+.B mff \-g \(fmgfto%p \-v\(fm .\|.\|.
+will use \*(gf in its verbose mode.
+.TP
+.BI \-M " template"
+Tells how to invoke the
+\*(mf
+program.
+.B +M
+sets the
+\*(mf
+template to be
+.RB ` mf '.
+.TP
+.BI \-P " template"
+Tells where pixel files ought to be deposited once created. A value of
+just a hyphen means do not rename the pixel files.
+If there is no
+.B %f
+in this template, then it is assumed to be the name of a directory and
+.B %f.%n%p
+(and possibly a slash) is implicitly appended to it.
+.B +P
+resets the pixel directory template to
+.RB ` %f.%n%p '.
+(On systems with unreasonably short filenames, the default suffix is
+.RB ` %f/%n.%p '.)
+.TP
+.BI \-T " template"
+Tells where
+.SM TFM
+files ought to be deposited once created. A value of just a hyphen
+means to not move the
+.SM TFM
+files.
+If there is no
+.B %f
+then
+.B %f.tfm
+is implicitly appended.
+.B +T
+resets the
+.SM TFM
+directory template to
+.RB ` %f.tfm '.
+.LP
+The following %-substitutions are made in templates supplied by the
+above commands:
+.RS
+.TP
+.B %%
+A percent sign.
+.TP
+.B %b
+The basename of the current font.
+.TP
+.B %d
+The current
+.I dpi
+value.
+.TP
+.B %D
+The current
+.I dpi
+value multipled by the current magnification.
+.TP
+.B %f
+The current
+.I font
+name.
+.TP
+.B %g
+the current driver file name (usually the same as
+.BR %b ).
+.TP
+.B %k
+The current
+.I factor
+times 1000 (set with
+.BR \-k ).
+.TP
+.B %n
+The current
+.I dpi
+value multipled by the current
+.IR factor
+value
+times
+the current magnification
+\(em e.g., when making a
+300-dpi
+.SM PXL
+font, this will be 1500.
+.TP
+.B %p
+The pixel file suffix \(em usually
+.RB ` pk '.
+.TP
+.B %s
+The current magnification, times 1000.
+.TP
+.B %u
+Either
+.B pt
+or
+.B mm
+depending on which units the design size is assumed to be in.
+.TP
+.B %z
+The current modename \(em e.g.,
+.RB ` CanonCX '
+for a LaserWriter.
+.RE
+.SS \*SMiscellaneous
+.TP
+.B \-D
+Prints (`dumps') the current values of the table and other variables
+used to determine the
+\*(mf
+command line.
+.TP
+.BI \-e " mftext"
+Adds extra
+\*(mf
+text, which goes before the first
+.B input
+command. Multiple
+.B \-e
+options accumulate (semicolons are implied between them).
+.B +e
+discards the accumulated extra text.
+.TP
+.BI \-E " mftext"
+As
+.B \-e
+except it goes after the first
+.B input
+command.
+.TP
+.BI \-f " file"
+The
+.I file
+is searched for in the directories listed in the
+.SM MFFPATH
+environment variable and if a readable file is found, it is parsed for
+more options. An optional
+.B .mff
+suffix will be supplied if omitted. Files can be nested by using
+.B \-f
+inside a file.
+If the
+.I file
+is just a hyphen then the standard input stream is used.
+.B +f
+rereads the initialization files (see under
+.SM
+.B FILES
+below).
+See
+.IR argloop (3)
+for details about the format of the files.
+.TP
+.B \-h
+Prints a summary of the options.
+.TP
+.BI \-k " factor(s)"
+Uses
+.I factor(s)
+to construct pixel file names in the style of
+old-fashioned
+.SM PXL
+files. The number in the suffix of the pixel file is expected to be
+multiplied by the
+.IR factor ;
+presumably either \s-1GF\s0to\s-1PXL\s0 or something like
+.I mftobdf
+is being used which shrinks or magnifies pixel files in addition to the
+magnification
+\*(mf
+may be applying.
+This list of values is ignored unless
+.B \-x
+is used.
+.B +k
+sets the factor to 5.0 (which is correct for \s-1GF\s0to\s-1PXL\s0).
+.TP
+.BI \-n
+Does a dryrun \(em instead of running
+\*(mf
+and so on, the operations that would be performed are printed.
+Renaming of files is represented as
+.B mv
+.I oldname
+.IR newname ,
+and deletion of the
+.SM GF
+file as
+.B rm
+.IR gffile .
+(That is, the output resembles shell commands.)
+.B +n
+cancels
+.BR \-n .
+.TP
+.BI \-p " suffix"
+Sets the suffix that will be used for pixel files.
+.B +p
+sets the pixel suffix to
+.RB ` pxl '
+if
+.B \-x
+is in effect,
+.RB ` pk '
+otherwise.
+.TP
+.B \-R
+Retain (that is, do not delete) the
+.SM GF
+file after the \*(gf step is performed. This is useful if the \*(mf
+commands was something like
+.IR echo (1)
+which does not actually create a
+.SM GF
+file in the first place!
+.TP
+.BI \-v
+Set `verbose' mode. The parsing of options and reading of files will be
+described in detail. (Each line will start with a
+.RB ` # '
+so that if
+.B \-n
+is being used the result is still a reasonable shell script.)
+More
+.B \-v
+flags cause more verbosity (thus
+.B \-vv
+or
+.B \-vvv
+etc.). Often used but rarely useful.
+.B +v
+cancels any number of
+.B \-v
+options.
+.TP
+.BI \-V
+Print version number information.
+.TP
+.BI \-x
+Assume we are producing
+.SM PXL
+files or something equally unpleasant, and so multiply pixel file
+suffixes by
+.I factor(s)
+set by
+.B \-k
+above.
+.B +x
+turns off
+.BR \-x .
+.SH ENVIRONMENT
+.TP
+.SM MFFINIT
+This is parsed for options before the command-line is read.
+(Double-quotes can be used as in files.)
+.TP
+.SM MFFPATH
+This is a colon-separated list of directories in which files for the
+.B \-f
+option can be found. If this is not set, just the current directory is
+searched.
+.TP
+.SM PATH
+Used when searching for \*(mf and \*(gf executables.
+.SH FILES
+.TP
+.B \*(RC/mff.rc
+.PD 0v
+.TP
+.B $HOME/.mffrc
+.TP
+.B ./mff.rc
+.PD
+These files are read for options when
+.I mff
+starts up (or when requested with the
+.B +f
+option) before the
+.SM MFFINIT
+variable and the command-line arguments.
+The system
+.B mff.rc
+can contain system-wide setups, like the local printing devices and
+standard suffixes. The user `rc' files allow per-user and per-project
+tailoring.
+.TP
+.B \(**.mff
+Other files containing
+.I mff
+options.
+.TP
+.B \*(MJ/example.mffrc
+An example
+.I $\s-1HOME\s0/.mffrc
+file.
+(\*(MJ is the directory
+.I mff
+source is in).
+.TP
+.B \*(MJ/{cm,Ditko,mflogo}/*
+Examples of \*(mf fonts designed to be used with
+.IR mff .
+.TP
+.B \(**.mf
+\*(MF source files.
+.TP
+.IB driver .log
+Log file created by \*(mf.
+.TP
+.B \(**.tfm
+\*(Te font metric file, created by \*(mf and used by \*(Te.
+.TP
+.B \(**.\(**gf
+Generic font file, created by \*(mf and turned into a
+.SM PK
+file by \*(gf.
+.TP
+.B \(**.\(**pk
+Bitmap file, created from the
+.SM GF
+file
+and used by
+.SM DVI
+drivers such as
+.IR dvips (1).
+(On systems with short filenames, a file
+.IB driver .pk
+is used to store the output of \*(gf before it is renamed as per the
+.B \-P
+option.)
+.SH AUTHOR
+Damian Cugley <pdc@prg.ox.ac.uk>
+.LP
+Please send bug reports, fixes and comments to
+<malvern@prg.ox.ac.uk>
+\(em this is a mailing list that you can join by sending a request to me
+at the address
+<malvern-request@prg.ox.ac.uk>.
+The Malvern list is also for discussion
+of Malvern, a \*(mf font designed to take advantage of
+.IR mff 's
+special features; it ought to be available from the same archive that
+.I mff
+was obtained from.
+.LP
+If you find
+.I mff
+amusing or useful, please send a pretty postcard to Damian Cugley,
+Computing Laboratory, 11\ Keble Road, Oxford, UK OX1\ 3QD.
+.SH "SEE ALSO"
+mf(1), gftopk(1), argloop(3), findfile(3)
+.LP
+The
+.I mff
+source files.
+.LP
+Donald E. Knuth,
+.I The \*(mfbook.
+Addison-Wesley, 1986. ISBN 0\-201\-13444\-6.
+.LP
+Donald E. Knuth,
+.I The \*(Tebook.
+Addison-Wesley, 1984. ISBN 0\-201\-13448\-9.
+.SH LIMITATIONS
+The command-line passed to \*(mf is limited to 512 characters. The
+commands supplied with
+.B \-M
+and
+.B \-G
+are limited to 1024 characters when the %-substitutions are expanded.
+.SH NOTES
+This program used to be called
+.I mfjob
+but has been renamed (as of version 2.8) to prevent confusion with the
+MFjob program that is part of Eberhard Mattes' em\*(Te distribution for
+MS-DOS and OS/2 computers. An immediate consequence is that the default
+suffix for files of options, and the name of `rc' files, have changed.
+There are also some other minor incompatible changes incorportated at
+the same time.
+.PP
+For information on differences for
+.IR gcc -based
+Atari ST systems,
+see
+.IR argloop (3)
+and
+.IR findfile (3).
+.SH BUGS
+It seemed sensible at the time to indicate which mode to use with the
+dots-per-inch value because this number is generally much shorter than
+the corresponding mode name. Systems with printers with the same pixel
+density but otherwise different characteristics require the use of
+.BR \-z .
+This system also fails to make sense if a printer has a bizarre
+dots-per-inch value, such as 4000/3.
+
diff --git a/fonts/utilities/mff-29/mff.c b/fonts/utilities/mff-29/mff.c
new file mode 100644
index 0000000000..7f1521e21e
--- /dev/null
+++ b/fonts/utilities/mff-29/mff.c
@@ -0,0 +1,1172 @@
+/* mff.c 2.9.0 92/07/06 - run a METAFONT-GFtoPK job to make a font
+-----------------------------------------------------------------------
+ This program copyright (c) 1990, 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+ See mff(1) for more info on using this program
+-----------------------------------------------------------------------
+ *
+ * 2.0 - C version of shellscript
+ * Created Damian Cugley <pdc@oxford.prg> Sat 13 Jan 1990
+ * 2.1
+ * DPIs, magnification and factor can be lists of floats
+ * - pdc Sat 27 Jan 1990
+ * - pdc Mon 29 Jan 1990
+ * 2.2 - pdc Tue 30 Jan 1990
+ * Define size using font_size rather than design_size#
+ * (more "standard")
+ * 2.3 - pdc Fri 30 Mar 1990
+ * If the mode-def starts with `"', use `smode' rather than `mode'.
+ * 2.4 - pdc Mon 16 Jul 1990
+ * 2 new options: -J and -j; act like -I, -i: extra user-defined suffixes
+ * 2.5 - pdc Sun. 16 Sept. 1990
+ * Now uses a searchpath from env. var $MFFPATH (default = $MFINPUTS).
+ * 2.6 - pdc Fri. 1 Mar. 1991
+ * Wrapping up for export; removed some old junk code.
+ * 2.7 - pdc Wed. 24 Apr. 1991
+ * output from -n is /bin/sh commands; -v output has #
+ * 2.8 - pdc Tue. 21 May 1991
+ * Renamed mff.
+ * Can understand sizes with "p" as decimal point.
+ * -R option to retain GF file.
+ * The input of an empty file hack is removed.
+ * -S option to not parse size part [not needed before]
+ * some support for MS-DOS filesystems (Adrian's Atari ST)
+ */
+
+#include <sys/param.h> /* MAXPATHLEN */
+#include <sys/types.h> /* etc. */
+#include <errno.h>
+
+#include <ctype.h> /* isdigit */
+#include <math.h> /* to calculate magsteps */
+#ifdef BSD
+# include <sys/fcntl.h> /* O_RDONLY etc */
+#else
+# include <fcntl.h>
+#endif
+
+#include "stdc.h"
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+
+#include "config.h"
+#include "argloop.h"
+#include "fatal.h"
+#include "searchpath.h"
+#include "assoc.h"
+#include "fx.h"
+#include "strmisc.h" /* includes <string(s).h> */
+#include "magstep.h"
+
+#include "version.h" /* version number goes here */
+
+#ifdef FANCY_MALLOC
+# include <malloc.h>
+int mallopt ARGS((int, int));
+int mallocmap ARGS((void));
+#endif
+
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+#define MAX_MF_LINE 512
+#define MAX_BASENAME 256
+#define MAX_TEMPLATE 1024
+
+static const char
+ what[] = MFF_VERSION
+#ifdef __STDC__
+ " (compiled " __TIME__ " " __DATE__ ")"
+#endif
+ ,
+ *version = what + 5;
+
+#define TRUE 1
+#define FALSE 0
+
+
+/* GLOBAL VARIABLES */
+
+static const char
+ *mffpath, /* the MFFPATH environment variable */
+ suffix[] = ".mff";
+
+int dryrun = FALSE; /* if true, don't really do anything */
+int verbose = 0; /* print more messages */
+int retain_gf = FALSE; /* don't (attempt to) remove GF file */
+int no_parse = FALSE; /* don't parse size etc. at all */
+
+static Assoclist
+ mode_alist, /* given "300", return "mode:=CanonCX" */
+ weight_alist, /* given "m", return "weight:=1.25" */
+ cndnsd_alist, /* given "xc", return "hratio:=0.5" */
+ italic_alist, /* given "pi", return "slant:=1/5" */
+ extra_alist; /* Extra Alist for user's extra suffixes */
+
+/* Strings set by -z, -w, -h, -i, -g, -p options -- or NULL */
+static char
+ *ovr_mode, *ovr_weight, *ovr_cndnsd, *ovr_italic, *ovr_extra,
+ *ovr_driver, *ovr_pkpxl;
+
+struct float_node
+{
+ struct float_node *next;
+ float val;
+} *dpi_list, *atsize_list, *mag_list, *pxlfactor_list;
+
+static float design_sizeF = 10.0; /* design-size in pt */
+
+
+static int pxlB = FALSE; /* If true, multiply PK suffix by */
+ /* |pxlfactorF| */
+
+/* Templates */
+static char *mf_template, *gfto_template, *tfm_template, *pk_template;
+
+static const char *mode,
+ *driver, /* either |basename| or |ovr_driver| */
+ *weight, *cndnsd, *italic,
+ *extra, /* - pdc Mon 16 Jul 1990 */
+ *unit, /* either "pt" or "mm" */
+ *pkpxl; /* set by -p */
+static char basename[MAX_BASENAME];
+
+struct eqn_node
+{
+ struct eqn_node *next;
+ char *val;
+} *eqns, *eqns2; /* set with -e and -E resp. */
+
+
+/* Both of the following set their arg to NULL: */
+
+#define DISPOSE(L) do { char *t_; \
+ while (L) { t_ = (char *)(L); (L) = (L)->next; xfree(t_); } \
+} while (0)
+
+#define FREE_DISPOSE(L) do { struct eqn_node *t_; \
+ while (L) { t_ = (struct eqn_node *)(L); (L) = (L)->next; \
+ xfree((addr)(t_->val)); xfree((addr)t_); } \
+} while (0)
+
+/*
+ * The do .. while(0) idiom is intended to get around the fact
+ * that a compound statement can't be followed by a semicolon
+ * when it is the "then" part of an if-then-else.
+ *
+ * Unfortunately lint does not recognise this and produces
+ * spurious error messages.
+ */
+
+#ifndef lint
+# define NEW(T) ((T *)xmalloc(sizeof(T)))
+#else
+# define NEW(T) ((T *)0)
+#endif
+
+
+
+/*
+ * Simple template routine.
+ * This is the bit that handles %-substitutions.
+ *
+ * The table of substitution strings only has entries for u&lc letters
+ */
+static const char *table[52];
+
+/*
+ * These two lines will need changing if using a character
+ * encoding in which the letters aren't contiguous.
+ */
+#define lc_ord(X) ((X) - 'a')
+#define uc_ord(X) ((X) - 'A')
+
+/*
+ * Set entry in table -- X is a character, Y is a char *
+ */
+#define lc_set(X,Y) table[lc_ord(X)] = (Y)
+#define uc_set(X,Y) table[uc_ord(X) + 26] = (Y)
+
+/*
+ * Print string |format| into |buf|, making %-subs from |table|.
+ * If a %f substitution is made, the global variable |f_sub| is
+ * incremented. (What a hack!!)
+ */
+
+int f_sub = 0;
+
+char *
+template(buf, format)
+ char *buf, *format;
+{
+ char *b = buf;
+
+ for (; *format; format++)
+ if (*format != '%')
+ *b++ = *format;
+ else if (*++format == '%') /* % followed by %? */
+ *b++ = '%';
+ else if (isalpha(*format)) /* % followed by letter? */
+ {
+ const char *sub;
+
+ if (sub = table[islower(*format)
+ ? lc_ord(*format)
+ : uc_ord(*format) + 26])
+ {
+ if (*format == 'f') f_sub++;
+ while (*sub) *b++ = *sub++;
+ }
+ else
+ fprintf(stderr, "Warning -- %%%c ignored.\n", *format);
+ }
+ else if (!*format) /* % at end of string? */
+ {
+ fprintf(stderr, "Warning -- %% at end of string ignored.\n");
+ --format;
+ }
+ else /* % followed by non-letter */
+ fprintf(stderr, "Warning -- %%%c skipped.\n", *format);
+ *b++ = '\0';
+ return buf;
+}
+
+/*
+ * OPERATIONS ON FILES
+ */
+
+extern int unlink ARGS((const char *));
+
+static inline int /* return nonzero iff file exists */
+file_exists_p(s)
+ const char *s;
+{
+ int access ARGS((const char *name, int flags));
+
+ return (access((s), 0) >= 0);
+}
+
+static inline void /* errors are fatal */
+xmkdir(s)
+ const char *s;
+{
+ if (mkdir(s, 0777) < 0)
+ pfatalf("could not create directory %s", s);
+}
+
+/*
+ * Rename file called "old" to be called "new".
+ * Will copy to new name and unlink if "new" is on a different filesystem.
+ * (This suggested by Andrew Haylett <ajh@gec-mrc.co.uk> of
+ * GEC-Marconi Research.)
+ */
+static inline int /* return <0 iff unsuccessful */
+rename(old, new)
+ const char *old, *new;
+{
+ extern int link ARGS((const char *, const char *));
+
+ if (file_exists_p(old, 0) < 0)
+ pfatalf("%s should exist but does not", old);
+ else
+ {
+ unlink(new); /* ignore any error */
+ if (link(old, new) < 0)
+ {
+ if (errno != EXDEV)
+ pfatalf("%s cannot be linked to %s", old, new);
+ else
+ {
+ /* attempted to cross-link between devices; copy instead */
+ int read ARGS((int, void *, sizeof_t));
+ int write ARGS((int, void *, sizeof_t));
+ int open ARGS((const char *, int));
+ int creat ARGS((const char *, int));
+ int close ARGS((int));
+
+ int in, out; /* file descriptors */
+ char buf[2048]; /* a sort of beige */
+ int nbytes; /* byte count from read() */
+
+ if ((in = open(old, O_RDONLY)) < 0)
+ pfatalf("can't read %s", old);
+ if ((out = creat(new, 0666)) < 0)
+ pfatalf("can't create %s", new);
+ while ((nbytes = read(in, buf, sizeof buf)) > 0)
+ if (write(out, buf, nbytes) != nbytes)
+ pfatalf("could not write %d bytes to %s", nbytes, new);
+ if (nbytes < 0)
+ pfatalf("could not read from %s", old);
+ close(in);
+ close(out);
+ }
+ }
+ if (unlink(old) < 0)
+ pfatalf("%s cannot be removed", old);
+ }
+ return 0;
+}
+
+static void
+install_file(file, tplate, tplate2)
+ char *file, *tplate, *tplate2;
+{
+ char scratch[MAXPATHLEN];
+
+ f_sub = 0;
+ (void)template(scratch, tplate);
+ if (!f_sub)
+ {
+ char *t = scratch + strlen(scratch);
+ if (t > scratch && *(t - 1) != dir_sep_ch)
+ *t++ = dir_sep_ch;
+ (void)template(t, tplate2);
+ }
+
+ if (dryrun)
+ {
+ printf("mv %s %s\n", file, scratch);
+ return;
+ }
+ else if (rename(file, scratch) >= 0)
+ return;
+
+ if (errno != ENOENT)
+ pfatalf("can't rename %s to %s", file, scratch);
+ else
+ {
+ /*
+ * On some brain-damaged systems, names of the form foo.96pk
+ * can't be accomodated and so they are split into a directory/name
+ * pair -- on MS-DOS systems, either say 96PK\FOO or FOO\96PK.
+ * In this case, we attempt to create the missing directory part.
+ * This stuff may also be necessary for USG systems with their
+ * 14-character filenames; I don't know.
+ *
+ * Assume path in form "xxx/f/g" where f & g are
+ * simple filenames and xxx is a path.
+ * If s/f does not exist but xxx does, then create directory xxx/f
+ * and try again.
+ */
+
+ char *sl1 = (char *)0, *sl2 = (char *)0; /* positions of slashes */
+
+ {
+ register char *s;
+
+ for (s = scratch; *s; s++)
+ if (isdirsep(*s))
+ sl2 = sl1, sl1 = s;
+ }
+
+ if (sl2
+ && (*sl1 = '\0', !file_exists_p(scratch))
+ && (*sl2 = '\0', file_exists_p(scratch)))
+ {
+ /* xxx must be a directory, else would have got ENOTDIR earlier */
+ /* Not that this matters: mkdir would simply fail anyway */
+
+ *sl2 = dir_sep_ch; /* "xxx/f" */
+ if (verbose > 1)
+ printf("# creating directory %s\n", scratch);
+ xmkdir(scratch); /* create xxx/f */
+ *sl1 = dir_sep_ch; /* now "xxx/f/g" again */
+
+ if (rename(file, scratch) < 0)
+ {
+ *sl1 = '\0';
+ pfatalf("created %s but can't rename %s to %s",
+ scratch, file, sl1 + 1);
+ }
+ }
+ else
+ {
+ *sl1 = *sl2 = dir_sep_ch;
+ pfatalf("don't know how to install %s as %s", file, scratch);
+ }
+ }
+}
+
+static void
+remove_file(file)
+ const char *file;
+{
+ if (dryrun)
+ printf("rm %s\n", file);
+ else
+ if (unlink(file) < 0) pfatalf(file);
+}
+
+
+
+
+/*
+ * CREATE A FONT
+ */
+
+/* X is evaluated twice in fol. */
+#define is_one_char_string(X,C) (*(X) == (C) && !(X)[1])
+#define is_just_hyphen(X) is_one_char_string((X), '-')
+
+#define SEMI() (*s++ = ';', *s++ = ' ')
+#define APPEND(S) for (e = (S); *e; *s++ = *e++) ;
+#define ADDEQN(E) if (E) { APPEND(E); SEMI(); }
+
+static char *
+mf_script(mode_name, magF)
+ char *mode_name;
+ double magF;
+{
+ char *s;
+ const char *e;
+ static char the_line[MAX_MF_LINE];
+ struct eqn_node *p;
+
+ if (no_parse)
+ {
+ sprintf(the_line, "\\%s = %s; mag = %g; ",
+ (mode_name[0] == '"' ? "smode" : "mode"),
+ mode_name, magF);
+ s = the_line + strlen(the_line);
+ }
+ else
+ {
+ sprintf(the_line, "\\%s = %s; mag = %g; font_size %g%s#; ",
+ (mode_name[0] == '"' ? "smode" : "mode"),
+ mode_name, magF, design_sizeF, unit);
+ s = the_line + strlen(the_line);
+
+ ADDEQN(weight); ADDEQN(cndnsd); ADDEQN(italic); ADDEQN(extra);
+ }
+
+ for (p = eqns; p; p = p->next)
+ ADDEQN(p->val);
+ if (driver)
+ { APPEND("input "); APPEND(driver); SEMI(); }
+ for (p = eqns2; p; p = p->next)
+ ADDEQN(p->val);
+ APPEND("bye.");
+ *s = '\0';
+ return the_line;
+}
+
+
+#define int_round(X) ((int)((X) + 0.5))
+
+static void
+do_one_font(font_name, mode_name, dpiF, magF, pxlfactorF)
+ char *font_name;
+ double dpiF, magF, pxlfactorF;
+ char *mode_name;
+{
+ static char kdpiS[20], dpiS[20], mdpiS[20], scaleS[20], factorS[20];
+ /* These are static purely for the sake of -D */
+ char tfname[MAX_BASENAME]; /* place to generate non-directory filenames */
+ char scratch[MAX_TEMPLATE];
+
+ if (verbose) printf("#{{{ %s %s %g %g %g\n",
+ font_name, mode_name, dpiF, magF, pxlfactorF);
+ if (pxlB)
+ sprintf(kdpiS, "%d", int_round(pxlfactorF * magF * dpiF));
+ else
+ sprintf(kdpiS, "%d", int_round(magF * dpiF));
+
+ sprintf( dpiS, "%d", int_round( dpiF ));
+ sprintf( mdpiS, "%d", int_round( magF * dpiF ));
+ sprintf( scaleS, "%d", int_round( magF * 1000.0 ));
+ sprintf( factorS, "%d", int_round( pxlfactorF * 1000.0 ));
+
+ lc_set('b', basename);
+ uc_set('D', mdpiS); /* magnified DPI, yes? */
+ lc_set('d', dpiS);
+ lc_set('f', font_name);
+ lc_set('g', driver);
+ lc_set('k', factorS); /* pxl/gf ratio, times 1000 */
+ lc_set('n', kdpiS);
+ lc_set('p', pkpxl);
+ lc_set('s', scaleS);
+ lc_set('u', unit);
+ lc_set('z', mode_name);
+
+ if (mf_template)
+ {
+ if (dryrun)
+ printf("%s '%s'\n", template(scratch, mf_template),
+ mf_script(mode_name, magF));
+ else
+ {
+ char *t = mf_script(mode_name, magF);
+ fx(template(scratch, mf_template), 1, &t);
+ }
+ if (tfm_template)
+ {
+ sprintf(tfname, "%s.tfm", driver);
+ install_file(tfname, tfm_template, "%f.tfm");
+ }
+ }
+
+ if (gfto_template)
+ {
+ char gffilename[MAX_BASENAME], *gfargs[2];
+#ifdef SHORT_FILENAMES
+ /*
+ * On systems which truncate the part of a name follwoing a "."
+ * to something unreasonably short, the files FOO.300PK and FOO.300GF
+ * may not be distinct. Usually there will be some convention
+ * for splitting names into a directory+filename -- FOOBAR12/300PK,
+ * for example.
+ * I am assuming that GFtoPK will be willing to produce
+ * its output as FOO.PK. This is then renamed as per the
+ * PK file template (-P option).
+ */
+ char pkfilename[10];
+
+ sprintf(gffilename, "%s.%sgf", driver, mdpiS);
+ sprintf(pkfilename, "%s.%s", driver, pkpxl);
+ if (dryrun)
+ printf("%s %s %s\n", template(scratch, gfto_template),
+ gffilename, pkfilename);
+ else
+ {
+ gfargs[0] = gffilename, gfargs[1] = pkfilename;
+ fx(template(scratch, gfto_template), 2, gfargs);
+ }
+ if (pk_template)
+ {
+ static char tp[] = "%f?%n%p";
+ tp[2] = dir_sep_ch;
+ install_file(pkfilename, pk_template, tp);
+ }
+#else /* !SHORT_NAMES: */
+ sprintf(gffilename, "%s.%sgf", driver, mdpiS);
+
+ if (dryrun)
+ printf("%s %s\n", template(scratch, gfto_template), gffilename);
+ else
+ {
+ gfargs[0] = gffilename;
+ fx(template(scratch, gfto_template), 1, gfargs);
+ }
+ if (pk_template)
+ {
+ sprintf(tfname, "%s.%s%s", driver, kdpiS, pkpxl);
+ install_file(tfname, pk_template, "%f.%n%p");
+ }
+#endif /* SHORT_NAMES */
+ if (!retain_gf)
+ remove_file(gffilename);
+ }
+ if (verbose) printf("#}}}\n");
+}
+
+/*
+ * Set up everything (italicness etc etc) for one font name and
+ * make fonts. This is where the parsing is done.
+ */
+static void
+do_font(fn)
+ const char *fn;
+{
+ struct float_node *pxl, *mag, *dpi;
+ static double ascii2float ARGS((const char *s));
+
+ const char *p, *q; /* pointers into |fn| */
+ char *b; /* pointer into |basename| or |canonical| */
+ char *canonical; /* font name with any hyphen dealt with */
+ int had_decimal = FALSE; /* TRUE when had P or m representing
+ a decimal point. */
+ char size_scratch[20]; /* size suffix copied into here */
+
+ /*
+ * Find the design_size:
+ */
+ for (p = fn; *p; ++p)
+ ;
+ /* p now points to the NUL at the end of fn */
+ if (p == fn) syntaxf("font name is empty");
+ canonical = (char *)xmalloc(p - fn + 1);
+ q = p; /* get ready to scan from end of |fn| */
+
+ if (!no_parse)
+ {
+ /*
+ * scan the SIZE part.
+ * |b| points to last character added to size_scratch array
+ * |q| points after first unscanned char in fn
+ * For the sake of ANSI I avoid having |q| point to left of |fn|.
+ *
+ * A `p' is recognized as a decimal point iff there is a digit on
+ * side of it -- 10p5 but not 10p or p5.
+ * An `m' is recognized as a decimal point iff there is a digit
+ * to its left -- 10m5 or 10m but not m5.
+ * Note that this means that when using my Malvern font nmames,
+ * neither "m" nor "p" can be used as encoding codes. That's life.
+ */
+ b = size_scratch + sizeof size_scratch; *--b = '\0';
+ unit = "pt";
+ while (1)
+ {
+ if (verbose > 3) printf("## <<%s>> <<%s>> <<%s>>\n", fn, q, b);
+ if (b == size_scratch || q == fn)
+ break;
+ else if (!had_decimal &&
+ ((*(q - 1) == 'p' && *b)
+ /* (*b != 0) means at least 1 digit */
+ || *(q - 1) == 'm')
+ && q > fn + 1 && isdigit(*(q - 2)))
+ {
+ had_decimal = TRUE;
+ *--b = '.', --q;
+ unit = (*q == 'p' ? "pt" : "mm");
+ }
+ else if (isdigit(*(q - 1)))
+ *--b = *--q;
+ else
+ break;
+ }
+ if (q != p)
+ design_sizeF = ascii2float(b);
+ if (verbose > 1) printf("# design size: %g%s\n", design_sizeF, unit);
+
+ /*
+ * If the at-size list is non-empty, then construct a
+ * mag list from this list and the current design size:
+ */
+ if (atsize_list)
+ {
+ struct float_node *t = mag_list = atsize_list;
+ atsize_list = (struct float_node *)0;
+
+ if (verbose) printf("# calculating mag(s) from at-size(s)...\n");
+
+ for (; t; t = t->next)
+ t->val = stepmag(t->val / design_sizeF);
+ }
+
+ extra = assoc_match_backwards(extra_alist, fn, &q);
+ italic = assoc_match_backwards(italic_alist, fn, &q);
+ cndnsd = assoc_match_backwards(cndnsd_alist, fn, &q);
+ weight = assoc_match_backwards(weight_alist, fn, &q);
+
+ /*
+ * Having parsed the <substyle> part, all that's left is
+ * the basic font name.
+ */
+ }
+
+ /* Canonical version of font name */
+ if (q > fn && *(q - 1) == '-')
+ q--; /* drop hyphen at end of basename */
+ for (b = canonical, p = fn; p < q; *b++ = *p++)
+ ; /* copy up to before q */
+ if (*p == '-')
+ p++; /* skip hyphen */
+ while (*b++ = *p++)
+ ; /* copy suffix + size parts including */
+ /* final null */
+
+ /* Make copy of basename */
+ for (b = basename, p = fn; p < q; *b++ = *p++)
+ ;
+ *b = '\0';
+ if (verbose > 1)
+ printf("# full font name: \"%s\"\n# basic font name: \"%s\"\n",
+ canonical, basename);
+
+ /*
+ * Now allow values set by suer to over-ride derived values:
+ */
+ if (ovr_weight) weight = ovr_weight;
+ if (ovr_cndnsd) cndnsd = ovr_cndnsd;
+ if (ovr_italic) italic = ovr_italic;
+ if (ovr_extra) extra = ovr_extra;
+ if (ovr_driver)
+ {
+ if (is_just_hyphen(ovr_driver))
+ driver = (char *)NULL; /* `-g -' cancels driver altogether */
+ else
+ driver = ovr_driver;
+ }
+ else
+ driver = basename;
+ if (ovr_pkpxl)
+ pkpxl = ovr_pkpxl;
+ else
+ pkpxl = (pxlB ? "pxl" : "pk");
+
+ for (pxl = pxlfactor_list; pxl; pxl = pxl->next)
+ {
+ if (pxlB && verbose > 2)
+ printf("# - factor: %g\n", pxl->val);
+
+ for (mag = mag_list; mag; mag = mag->next)
+ {
+ if (verbose > 2) printf("# - mag: %g\n", mag->val);
+ for (dpi = dpi_list; dpi; dpi = dpi->next)
+ {
+ if (ovr_mode)
+ do_one_font(canonical, ovr_mode, dpi->val, mag->val, pxl->val);
+ else
+ {
+ char scratch[20];
+ sprintf(scratch, "%d", int_round(dpi->val));
+ mode = assoc(mode_alist, scratch);
+ if (verbose > 2)
+ printf("# - mode_def: \"%s\"\n", mode);
+ do_one_font(canonical, mode, dpi->val, mag->val, pxl->val);
+ }
+ }
+ }
+ }
+}
+
+
+
+/* FUNCTIONS FOR PROCESSING COMMAND-LINE ARGUMENTS */
+
+/* Lookup table for variables changed by options */
+
+typedef union
+{
+ struct float_node *floats;
+ struct eqn_node *eqns;
+ char *string;
+ int bool;
+ Assoclist alist;
+} Param;
+
+static Param *opt_obj[] =
+{
+ (Param *)&atsize_list, /* -a ATSIZEs */
+ 0,
+ (Param *)&ovr_cndnsd, /* -c MF-EQN */
+ (Param *)&dpi_list, /* -d DPIs */
+ (Param *)&eqns, /* -e MF-EQN */
+ 0, /* -f FILE */
+ (Param *)&ovr_driver, /* -g DRIVER */
+ 0,
+ (Param *)&ovr_italic, /* -i MF-EQN */
+ (Param *)&ovr_extra, /* -j MF-EQN */
+ (Param *)&pxlfactor_list, /* -k FACTORs */
+ 0,
+ (Param *)&mag_list, /* -m MAGSTEPs */
+ (Param *)&dryrun, /* -n, +n */
+ 0,
+ (Param *)&ovr_pkpxl, /* -p PIXEL */
+ 0, 0,
+ (Param *)&mag_list, /* -s SCALED */
+ 0, 0,
+ (Param *)&verbose, /* -v, +v */
+ (Param *)&ovr_weight, /* -w MF-EQNS */
+ (Param *)&pxlB, /* -x, +x */
+ 0,
+ (Param *)&ovr_mode, /* -z MODE */
+ 0, 0,
+ (Param *)&cndnsd_alist, /* -C SUFFIX=MF-EQN */
+ 0,
+ (Param *)&eqns2, /* -E MF-EQN */
+ 0,
+ (Param *)&gfto_template, /* -G TEMPLATE */
+ 0,
+ (Param *)&italic_alist, /* -I SUFFIX=MF-EQN */
+ (Param *)&extra_alist, /* -J SUFFIX=MF-EQN */
+ 0, 0,
+ (Param *)&mf_template, /* -M TEMPLATE */
+ 0, 0,
+ (Param *)&pk_template, /* -P TEMPLATE */
+ 0,
+ (Param *)&retain_gf, /* -R */
+ (Param *)&no_parse, /* -S */
+ (Param *)&tfm_template, /* -T TEMPLATE */
+ 0, 0,
+ (Param *)&weight_alist, /* -W SUFFIX=MFEQN */
+ 0, 0,
+ (Param *)&mode_alist /* -Z DPI=MODE */
+};
+
+#define PARAM(C) \
+ (opt_obj[isupper(C) ? uc_ord(C) + 26 : lc_ord(C)])
+
+static char optstring[] = "a:C:c:Dd:e:E:f:G:g:hI:i:J:j:k:M:m:nP:p:R\
+s:ST:VvW:w:xZ:z:?";
+ /* enough to be getting on with... */
+
+static Argloop_options opts;
+
+static void
+usage(c)
+ int c;
+{
+ syntaxf("Don't understand flag -%c.\n\
+USAGE:\t%s [ OPTION ... ] FONT ...\n\
+\t%s -V | -h\n\
+FONT is a TeX font name, such as \"cmbx12\".\n\
+For a list of options, use `%s -h'",
+ c, progname, progname, progname, progname);
+}
+
+/* before and after are brackets, first is format string for first element
+ * and rest is format string for each of the rest.
+ *
+ * This has to be a macro, because it accesses the basetype of the list
+ */
+
+#define LIST_PRINT(T, ll, before, first, rest, after)\
+ { T *l = ll; \
+ fputs(before, stdout);\
+ if (l)\
+ {\
+ printf(first, l->val);\
+ for (l = l->next; l; l = l->next)\
+ printf(rest, l->val);\
+ }\
+ fputs(after, stdout);\
+ }
+
+#define TEMPLATE_PRINT(S, T, U) \
+ if (T) printf(S, T); else puts(U);
+
+static void
+do_flag(c, val)
+ int c;
+ int val;
+{
+ Param *p = PARAM(c);
+
+ switch (c)
+ {
+ case '?':
+ case 'h':
+ printf( "%s [ OPTION ... FONT ] ... \n\
+%s -V | -h\n\
+\nFONT is a TeX font name, such as \"cmbx12\".\n\
+\nOPTIONS\n\
+ -V (version) -h (help) -D (dump tables) -v (verbose) -R (retain GF)\n\
+ -x (pXl) or +x (pk) -k FACTOR(S) -p PKSUFFIX\n\
+ -a ATSIZE(S) or -s SCALED(S) or -m MAGSTEP(S)\n\
+ -d DPI(S) -e EQN -E EQN\n\
+\nTEMPLATES\n\
+ -M METAFONT -G GFtoPK -T TFMdirectory -P PKdirectory\n\
+\t%%k = factor*1000 %%s = scaled*1000 %%p = pk or pxl\n\
+\t%%d = dpi %%D = scaled*dpi %%n = scaled*factor*dpi\n\
+\t%%z = mode %%b = basename %%g = driver %%f = font\n\
+\nTABLES\n\
+ -W STRING=EQN -C STRING=EQN -I STRING=EQN -J STRING=EQN \
+-Z DPI=MODENAME\n\
+ -w EQN -c EQN -i EQN -j EQN -z MODENAME\n\
+", progname, progname);
+ break;
+ case 'V':
+ printf("%s\n", version);
+ break;
+ case 'D':
+ printf("Z = "); assoc_print(mode_alist);
+ if (ovr_mode) printf("overridden by \"%s\".\n", ovr_mode);
+ printf("W = "); assoc_print(weight_alist);
+ if (ovr_weight) printf("overridden by \"%s\".\n", ovr_weight);
+ printf("C = "); assoc_print(cndnsd_alist);
+ if (ovr_cndnsd) printf("overridden by \"%s\".\n", ovr_cndnsd);
+ printf("I = "); assoc_print(italic_alist);
+ if (ovr_italic) printf("overridden by \"%s\".\n", ovr_italic);
+ printf("J = "); assoc_print(extra_alist);
+ if (ovr_extra) printf("overridden by \"%s\".\n", ovr_extra);
+ {
+ int i;
+
+ printf("template = {");
+ for (i = 0; i < 52; i++)
+ if (table[i])
+ printf("\n\t%%%c\t%s",
+ (i < 26 ? i + 'a' : i + 'A' - 26), /* assumes ASCII */
+ table[i]);
+ printf(" }\n");
+ }
+
+ if (eqns)
+ LIST_PRINT(struct eqn_node, eqns, "-e ", "%s", "; %s", ".\n");
+ if (eqns2)
+ LIST_PRINT(struct eqn_node, eqns2,"-E ", "%s", "; %s", ".\n");
+ LIST_PRINT(struct float_node, dpi_list,
+ "DPI(s) = ", "%g", ", %g", ".\n");
+ LIST_PRINT(struct float_node, mag_list,
+ "mag(s) = ", "%g", ", %g", ".\n");
+ if (atsize_list)
+ LIST_PRINT(struct float_node, atsize_list,
+ "atsize(s)= ", "%g", ", %g", ".\n");
+ if (pxlB)
+ LIST_PRINT(struct float_node, pxlfactor_list,
+ "factor(s)= ", "%g", ", %g", ".\n");
+ TEMPLATE_PRINT("METAFONT = \"%s\"\n", mf_template, "don't METAFONT");
+ TEMPLATE_PRINT("GFtoPK = \"%s\"\n", gfto_template, "don't GFtoPK");
+ TEMPLATE_PRINT("TFM dir. = \"%s\"\n", tfm_template, "no TFM directory");
+ TEMPLATE_PRINT("PK dir. = \"%s\"\n", pk_template, "no PK directory");
+ break;
+
+ case 'n': case 'x': case 'R': case 'S':
+ p->bool = val; break;
+
+ case 'v': /* -vv is more verbose than -v */
+ if (val) verbose++; else verbose = 0;
+ break;
+
+ /*
+ * Set the default value for certain flagged arguments:
+ * (+F type flags)
+ */
+ case 'd':
+ DISPOSE(dpi_list);
+ dpi_list = NEW(struct float_node);
+ dpi_list->next = (struct float_node *)0;
+ dpi_list->val = 200.0; /* only one defined in standard plain.mf */
+ break;
+
+ case 'Z': case 'W': case 'C': case 'I': case 'J':
+ p->alist = assoc_destroylist(p->alist);
+ if (c == 'Z')
+ {
+ mode_alist = assoc_add(mode_alist, strdup("200=lowres"));
+ }
+ break;
+
+ case 'z': case 'w': case 'c': case 'i': case 'j':
+ case 'p':
+ case 'g':
+ case 'M': case 'G': case 'T': case 'P':
+ if (p->string) xfree(p->string);
+ switch (c)
+ {
+ case 'M': mf_template = strdup("mf"); break;
+ case 'G': gfto_template = strdup("gfto%p"); break;
+ case 'T': tfm_template = strdup("%f.tfm"); break;
+ case 'P': pk_template = strdup("%f.%n%p"); break;
+ default:
+ p->string = (char *)NULL; break;
+ }
+ break;
+
+ case 'e': case 'E':
+ FREE_DISPOSE(p->eqns);
+ break;
+
+ case 'k':
+ DISPOSE(pxlfactor_list);
+ pxlfactor_list = NEW(struct float_node);
+ pxlfactor_list->next = (struct float_node *)0;
+ pxlfactor_list->val = 5.0;
+ break;
+
+ case 'a': case 's': case 'm':
+ DISPOSE(mag_list); DISPOSE(atsize_list);
+ mag_list = NEW(struct float_node);
+ mag_list->next = (struct float_node *)0;
+ mag_list->val = 1.0;
+ break;
+
+ default:
+ syntaxf("Unexpected %c%c!", (val ? '-' : '+'), c);
+ }
+}
+
+
+/*
+ * This func is used below when changing comma-separated list into
+ * a float_node list.
+ */
+
+static inline void
+build_list(p, s, f)
+ register struct float_node **p;
+ const char *s;
+ register double (*f) ARGS((const char *));
+{
+ struct float_node *cur = 0;
+ char *state, *t;
+ DISPOSE(*p);
+ s = stritem(t = strdup(s), ',', &state); /* s is now 1st item */
+ if (!s) errorf("warning: \"%s\" denotes the empty list", t);
+ for (; s; s = stritem((char *)NULL, ',', &state))
+ {
+ if (cur)
+ cur = cur->next = NEW(struct float_node);
+ else
+ cur = *p = NEW(struct float_node);
+ cur->val = f(s);
+ }
+ if (cur) cur->next = 0;
+ xfree((char *)t);
+}
+
+static double
+ascii2float(s) /* this version complains if invalid */
+ const char *s;
+{
+ const char *t = s;
+ double f = 0.0, denom = 10;
+ register int i = 0;
+
+ if (!s || !*s) syntaxf("the empty string is not a valid number");
+ if (*s == '-') return -ascii2float(s + 1);
+
+ /* This bit done in integer arithmetic for efficiency's sake: */
+ while (*s && isdigit(*s))
+ i = 10 * i + (*s++ - '0');
+ f = i;
+ if (*s == '.')
+ while (*++s && isdigit(*s))
+ f += (*s - '0')/denom, denom *= 10.0;
+ if (*s) syntaxf("%s: invalid number", t);
+ return f;
+}
+
+static double
+ascii2scale(s)
+ const char *s;
+{
+ register float f = ascii2float(s); /* aborts if invalid */
+
+ if (f <= 0.0)
+ syntaxf("%g: invalid scale (must be positive floating-point number)", f);
+ if (f > 100.0) return f/1000.0;
+ return f;
+}
+
+static double
+ascii2magstep(s)
+ const char *s;
+{
+ if (*s == '-')
+ return 1/ascii2magstep(s + 1);
+ if (*s == 'h' && !s[1])
+ return MAGSTEPHALF;
+ if (!isdigit(*s) || s[1])
+ syntaxf("%s: invalid magstep (must be h, -h or small integer)", s);
+ return magstep(*s - '0');
+}
+
+static void
+do_arg(c, s) /* Process one flagged argument */
+ int c; /* flag character */
+ const char *s; /* argument */
+{
+ Param *p = PARAM(c);
+
+ switch (c)
+ {
+
+ /*
+ * Options that store a string allow the special argument
+ * `-' to set its value to (char *)NULL, meaning don't use it:
+ */
+ case 'p':
+ case 'z': case 'w': case 'c': case 'i':
+ case 'j': /* - pdc Mon 16 Jul 1990 */
+ case 'M': case 'G': case 'T': case 'P':
+ if (p->string)
+ xfree(p->string);
+ p->string
+ = (!s || is_just_hyphen(s) ? (char *)NULL : strdup(s));
+ break;
+
+ /*
+ * ... except -g, which has to distinguish between NO driver
+ * file (-g -, ovr_driver = "-"), DEFAULT driver file (+g,
+ * ovr_driver = null) and SPECIAL driver file (-g string):
+ */
+ case 'g':
+ if (ovr_driver) xfree(ovr_driver);
+ ovr_driver = strdup(s); /* ...even if s is just a hyphen */
+ break;
+
+ case 'd': case 'a':
+ build_list(&p->floats, s, ascii2float);
+ break;
+
+ case 's':
+ DISPOSE(atsize_list);
+ /* FALL THROUGH */
+ case 'k':
+ build_list(&p->floats, s, ascii2scale);
+ break;
+
+ case 'm':
+ DISPOSE(atsize_list);
+ build_list(&p->floats, s, ascii2magstep);
+ break;
+
+ /* Add items to an alist: */
+ case 'Z': case 'W': case 'C': case 'I':
+ case 'J':
+ if (!s) syntaxf("expected argument after -%c", c);
+ p->alist = assoc_add(p->alist, strdup(s));
+ break;
+
+ /* Add strings to a list: */
+ case 'e': case 'E':
+ if (!s || is_just_hyphen(s))
+ FREE_DISPOSE(p->eqns);
+ else
+ {
+ struct eqn_node *new = NEW(struct eqn_node);
+ new->val = strdup(s);
+ new->next = p->eqns;
+ p->eqns = new;
+ }
+ break;
+
+ case 'f': /* read from file of commands */
+ {
+ char scratch[MAXPATHLEN];
+
+ if (!s || is_just_hyphen(s))
+ {
+ clearerr(stdin);
+ argloop(al_file(stdin), &opts);
+ }
+ else if (!findfile(scratch, s, mffpath, suffix))
+ pfatalf("can't find command file \"%s\"", s);
+ else
+ argloop(al_file(fopen(scratch, "r")), &opts);
+ }
+ break;
+
+ case '\0':
+ do_font(s);
+ break;
+
+ default:
+ syntaxf("Unexpected -%c %s!", c, s);
+ }
+}
+
+int
+main(argc, argv)
+ int argc;
+ const char **argv;
+{
+ const char *getenv();
+ char *t;
+
+#ifdef FANCY_MALLOC
+ mallopt(M_MXFAST, 32); /* blocks up to 32 bytes allocated in batches */
+#endif
+
+ if (!(mffpath = getenv("MFFPATH"))) mffpath = ".";
+
+ opts.optstring = optstring;
+ opts.flag = do_flag;
+ opts.arg = do_arg;
+ opts.error = usage;
+
+ argloop(al_string(t = strdup("+ZMGTPxdks")), &opts);
+ xfree(t); /* Set the default value for all except */
+ /* things must have NULL as default */
+
+#ifdef NO_ARGV0
+ argloop_init_files("mff", &opts);
+#else
+ argloop_init_files(argv[0], &opts);
+#endif
+ argloop(al_argv(argc, argv), &opts);
+
+ return 0;
+}
diff --git a/fonts/utilities/mff-29/mff.pdf b/fonts/utilities/mff-29/mff.pdf
new file mode 100644
index 0000000000..e9d5297d1d
--- /dev/null
+++ b/fonts/utilities/mff-29/mff.pdf
Binary files differ
diff --git a/fonts/utilities/mff-29/mflogo.mff b/fonts/utilities/mff-29/mflogo.mff
new file mode 100644
index 0000000000..424c1ef2a7
--- /dev/null
+++ b/fonts/utilities/mff-29/mflogo.mff
@@ -0,0 +1,41 @@
+# mff file for METAFONT logo font
+
+-W 2=weight=1/4
+-W 3=weight=1/2
+-W 4=weight=3/4
+-W 5=weight=1
+-W 6=weight=1.5
+-W 7=weight=2.0
+-W 8=weight=2.5
+
+-W i=weight=1/4
+-W l=weight=1/2
+-W k=weight=3/4
+-W r=weight=1
+-W d=weight=1.5
+-W b=weight=2.0
+-W u=weight=2.5
+
+-C 1=hratio=2
+-C 2=hratio=2;slant=1/4
+-C 3=hratio=1.5
+-C 4=hratio=1.5;slant=1/4
+-C 5=hratio=1
+-C 6=hratio=1;slant=1/4
+-C 7=hratio=1/2
+-C 8=hratio=1/2;slant=1/4
+-C 9=hratio=1/4
+-C 0=hratio=1/4;slant=1/4
+
+-I o=slant=1/4
+
+-J o=hratio=1/4
+-J n=hratio=1/2
+-J r=hratio=1
+-J e=hratio=1.5
+-J w=hratio=2
+-J ww=hratio=3
+
+-J s=
+
+-g mf
diff --git a/fonts/utilities/mff-29/mfmacros.mf b/fonts/utilities/mff-29/mfmacros.mf
new file mode 100644
index 0000000000..4cf35e9296
--- /dev/null
+++ b/fonts/utilities/mff-29/mfmacros.mf
@@ -0,0 +1,106 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% mfmacros.mf - macros used in drawing the MFLOGO font.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+let elif = elseif;
+
+ygap#:=(ht#/13.5u#)*xgap#; % vertical adjustment
+ho#:=o#; % horizontal overshoot
+leftstemloc#:=2.5u#+s#; % position of left stem
+barheight#:=.45ht#; % height of bar lines
+xheight# := 0.45[barheight#,ht#]; % Height of come characters
+py#:=.9px#; % vertical pen thickness
+dot_pen_width# := 3/2 px#; % A fatter pen used when drawing dots etc.
+dot_pen_height# := 3/2 py#;
+
+define_pixels(s,u);
+define_whole_pixels(xgap);
+define_whole_vertical_pixels(ygap);
+define_blacker_pixels(px,py,dot_pen_height,dot_pen_width);
+
+pickup pencircle xscaled px yscaled py;
+logo_pen := savepen;
+pickup pencircle xscaled dot_pen_width yscaled dot_pen_height;
+dot_pen := savepen;
+
+define_good_x_pixels(leftstemloc);
+define_good_y_pixels(barheight,xheight);
+define_corrected_pixels(o);
+define_horizontal_corrected_pixels(ho);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def beginlogochar(expr code, unit_width) =
+ beginchar(code,unit_width*u#+2s#,ht#,0pt#);
+ pickup logo_pen enddef;
+
+numeric digit_width#; digit_width# = 10u#;
+def beginlogodigit(expr code) =
+ beginchar(code, digit_width# + 2s#, ht#, 0pt#); % matched by |endchar|
+ "Numeral " & code;
+ pickup logo_pen
+enddef;
+
+def nextcode =
+ begingroup
+ if unknown next_charcode:
+ next_charcode := 0;
+ elif next_charcode <= 32:
+ next_charcode := next_charcode + 1
+ else: message("Too many fancy symbols!");
+ next_charcode := 128
+ fi;
+ next_charcode
+ endgroup
+enddef;
+
+% Given 4 points z$1,...,z$4 define intermediate points z$1',...,z$4'
+% on a superelipse (z$1...z$4 clockwise from top; z$1' from topright)
+% and z$[]dir and 'dir are the corresponding directions
+%
+def super_points(suffix $) =
+ z$5 = z$1; % hackette
+ for i = 1,3:
+ z$[i]' = ( 4/5[ x$[i],x$[i+1] ], 4/5[ y$[i+1],y$[i] ] );
+ z$[i]dir = (x$[i+1] - x$[i],0);
+ z$[i]'dir = z$[i+1] - z$[i];
+ endfor
+ for i = 2,4:
+ z$[i]' = ( 4/5[ x$[i+1],x$[i] ], 4/5[ y$[i],y$[i+1] ] );
+ z$[i]dir = (0, y$[i+1] - y$[i]);
+ z$[i]'dir = z$[i+1] - z$[i];
+ endfor
+enddef;
+
+def super_arc(suffix $)(suffix list_hd)(text list_tl) =
+ z$list_hd{z$list_hd.dir}
+ forsuffixes @ = list_tl:
+ ... {z$.@dir}z$.@
+ endfor
+enddef;
+
+def super_half(suffix i,j,k) =
+ draw z.i{0,y.j-y.i}
+ ... (.8[x.j,x.i],.8[y.i,y.j]){z.j-z.i}
+ ... z.j{x.k-x.i,0}
+ ... (.8[x.j,x.k],.8[y.k,y.j]){z.k-z.j}
+ ... z.k{0,y.k-y.j} enddef;
+
+def half_super(suffix i,j,k) =
+ draw z.i{x.j-x.i,0}
+ ... (.8[x.i,x.j],.8[y.j,y.i]){z.j-z.i}
+ ... z.j{0,y.k-y.i}
+ ... (.8[x.k,x.j],.8[y.j,y.k]){z.k-z.j}
+ ... z.k{x.k-x.j,0}
+ enddef;
+
+def qtr_super(suffix i,j) =
+ draw z.i{x.j-x.i,0} ... (.8[x.i,x.j],.8[y.j,y.i]){z.j-z.i}
+ enddef;
+
+def sixpoints =
+ x1 = x2 = x3 = leftstemloc; % Points on left stem
+ x4 = x5 = x6 = w - x1; % on right stem
+ top y1 = top y4 = h + o; % Points at top of letter
+ y2 = y5 = barheight; % points on the bar
+ bot y3 = bot y6 = -o; % points at bottom of letter
+ enddef;
diff --git a/fonts/utilities/mff-29/mfparams.mf b/fonts/utilities/mff-29/mfparams.mf
new file mode 100644
index 0000000000..c842ea053a
--- /dev/null
+++ b/fonts/utilities/mff-29/mfparams.mf
@@ -0,0 +1,13 @@
+% mflogo-params - set the ad-hoc parameters for generic METAFONT logo
+% altered for `mfjob' - Damian Cugley <pdc@oxford.prg> Tue 16 Jan 1990
+
+
+v# := designsize/18; % unit of vertical distance.
+
+ht# := 10.8 v#; % height of characters
+xgap# := 1.1 v#; % horizontal adjustment
+
+u# := if known hratio: hratio * fi 0.8 v#; % unit width
+s# := 0 v#; % extra space at the left and the right
+o# := 1/5 v#; % overshoot
+px# := if known weight: weight * fi 1.2 v#; % horizontal thickness of pen
diff --git a/fonts/utilities/mff-29/mfpunct.mf b/fonts/utilities/mff-29/mfpunct.mf
new file mode 100644
index 0000000000..219ed9139f
--- /dev/null
+++ b/fonts/utilities/mff-29/mfpunct.mf
@@ -0,0 +1,25 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Programs for punctuation in the METAFONT logo font
+% Damian Cugley, SEH <pdc@oxford.prg> Sun 2 Jul 1989
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+input mfbrackets;
+input mfcommas;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hyphen-like thingies
+%
+def hyphen_like(expr code,desc,u_wd) =
+ beginchar(code,u_wd*u#,barheight# + 1/2py#,0); desc;
+ pickup logo_pen;
+ x1 = w - x1' = good.x(1 u + s); y1 = y1' = barheight;
+ draw z1 -- z1'; labels(1,1');
+ endchar;
+enddef;
+
+hyphen_like("-","Hyphen (-)",6);
+short_dash := nextcode; hyphen_like(short_dash,"Short dash (--)",12);
+long_dash := nextcode; hyphen_like(long_dash,"Long dash (---)",18);
+
+ligtable "-": "-" =: short_dash;
+ligtable short_dash: "-" =: long_dash;
diff --git a/fonts/utilities/mff-29/searchpath.1 b/fonts/utilities/mff-29/searchpath.1
new file mode 100644
index 0000000000..14ac71515e
--- /dev/null
+++ b/fonts/utilities/mff-29/searchpath.1
@@ -0,0 +1,105 @@
+.TH SEARCHPATH 1 "pdc Wed. 22 May 1991" "mff 2.8" "CONTRIBUTED PROGRAMS"
+.SH NAME
+searchpath \- search for a file along a colon-separated list of
+directories
+.SH SYNOPSIS
+.\" searchpath.1 - man page for searchpath
+.\" Copyright (C) 1990 Damian Cugley
+.\" - pdc Wed. 19 Sept. 1990
+.B searchpath
+.I name
+.I path
+[
+.I suffix
+]
+.SH DESCRIPTION
+.I searchpath
+searches for
+.I name
+along a `searchpath', i.e., a string of directory names separated by
+colons, in the manner of
+.IR sh (1)
+(with
+.SM PATH\*S)
+and
+.IR tex (1)
+(with
+.SM TEXINPUTS\*S).
+This can be used in shellscripts that manipulate files usually kept in
+particular directories.
+.LP
+If
+.I name
+contains a
+.RB ` / ',
+or
+.I path
+is empty,
+.I name
+is not searched for and
+.I searchpath
+succeeds iff a file called
+.I name
+exists.
+Otherwise
+.I searchpath
+looks in each directory in the list for a file called
+.I name
+(or
+.I name.suffix
+if the
+.I suffix
+argument is supplied).
+.LP
+A null directory \(em represented by two consecutive colons
+.RB ( :: )
+or by a
+colon at the start or end of the path \(em stands for the current
+directory; this is for compatability with
+.IR sh .
+An optional trailing slash is allowed after a directory name, so
+.B ./:/bin/:/usr/bin/
+is equivalent to
+.B .:/bin:/usr/bin
+or
+.BR :/bin:/usr/bin .
+.LP
+If the search succeeds, the name of the found file is printed on the
+standard outut stream. Otherwise
+.I name
+is echoed verbatim and an error message is printed on the standard error
+stream, and
+.I searchpath
+exits with a nonzero status value.
+.SH EXAMPLE
+To mimic the
+.if t T\v|0.25m|\h|-0.1m|E\v|-0.25m|X
+.if n TeX
+file-searching algorithm in a shellscript you might use:
+.if t .sp 0.5v
+.if n .sp
+.RS
+.nf
+.ft B
+fullname=\(gasearchpath $1 ${TEXINPUTS\-.:/usr/local/tex/macros} .tex\(ga
+[ $? \-ne 0 ] && exit 1
+\&.\|.\|.
+.ft P
+.fi
+.RE
+.if t .sp 0.5v
+.if n .sp
+This succeeds whether $1 has a
+.B .tex
+at the end or not (however, if $1 is
+.BR foo ,
+say, and there is a file
+.I foo
+then this will be found instead of
+.IR foo.tex ).
+.SH AUTHOR
+Damian Cugley <pdc@prg.ox.ac.uk>. See the
+.IR mff (1)
+for information about reporting bugs.
+.SH "SEE ALSO"
+basename(1), dirname(1), sh(1), findfile(3)
diff --git a/fonts/utilities/mff-29/searchpath.c b/fonts/utilities/mff-29/searchpath.c
new file mode 100644
index 0000000000..b9939d1423
--- /dev/null
+++ b/fonts/utilities/mff-29/searchpath.c
@@ -0,0 +1,49 @@
+/* searchpath.c 2.9.0 92/07/06 - wrapper around library thingie
+ * - Damian Cugley <pdc@oxford.prg> Thu 15 Feb 1990
+ */
+
+#include <sys/param.h> /* for MAXPATHLEN */
+#include "xstdio.h" /* <stdio.h> plus prototypes */
+#include "searchpath.h"
+#include "stdc.h"
+
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
+void NONRETURNING exit ARGS((int));
+
+int
+main (ac, av)
+ int ac;
+ char **av;
+{
+ char scratch[MAXPATHLEN];
+
+ if (ac < 3)
+ {
+ fprintf(stderr, "%s: Not enough arguments\n\
+Usage: %s FILENAME PATH [ SUFFIX ]\n",
+ av[0], av[0]);
+ if (ac == 2)
+ puts(av[1]); /* The best we can do */
+ exit(2);
+ }
+
+ if (!findfile(scratch, av[1], av[2], (ac > 3 ? av[3] : (char *)NULL)))
+ {
+ if (ac > 3)
+ fprintf(stderr, "%s: Couldn't find \"%s\" or \"%s%s\" in path\n\
+\t\"%s\"\n",
+ av[0], av[1], av[1], av[3], av[2]);
+ else
+ fprintf(stderr, "%s: Couldn't find \"%s\" in path\n\
+\t\"%s\"\n",
+ av[0], av[1], av[2]);
+ puts(av[1]);
+ exit(1);
+ }
+
+ puts(scratch);
+ return(0);
+}
diff --git a/fonts/utilities/mff-29/searchpath.h b/fonts/utilities/mff-29/searchpath.h
new file mode 100644
index 0000000000..af4d2f0047
--- /dev/null
+++ b/fonts/utilities/mff-29/searchpath.h
@@ -0,0 +1,8 @@
+/* searchpath.h 2.9.0 92/07/06 newer simpler searchpath.h */
+
+/* - Damian Cugley <pdc@prg.ox.ac.uk> Mon. 29 Apr. 1991 */
+
+#include "stdc.h"
+
+int findfile ARGS((char *buf, const char *fname,
+ const char *searchpath, const char *optional_suffix));
diff --git a/fonts/utilities/mff-29/stdc.h b/fonts/utilities/mff-29/stdc.h
new file mode 100644
index 0000000000..b3e7483562
--- /dev/null
+++ b/fonts/utilities/mff-29/stdc.h
@@ -0,0 +1,84 @@
+/* stdc.h 2.9.0 92/07/06
+ * - some #define hacks to attempt to allow either stdc or tradc */
+
+/* Copyright (C) 1990 Damian Cugley */
+
+#ifndef __STDC_H
+#define __STDC_H
+
+#include "config.h"
+
+#ifndef __GNUC__
+# define inline
+# define NONRETURNING
+#else
+# define inline __inline__
+# define NONRETURNING __volatile__
+#endif
+
+#ifdef __STDC__
+typedef void *addr;
+typedef const void *const_addr;
+# define GLUE(x,y) x##y
+#else
+ typedef char *addr, *const_addr;
+# define GLUE(x,y) x/**/y
+# define const
+# define volitile
+#endif /* __STDC__ */
+
+/*
+ * ARGS is used so that when reading this file in trad C, the prototypes
+ * are ignored.
+ */
+#ifndef ARGS
+# ifdef __STDC__
+# define ARGS(X) X
+# else
+# define ARGS(X) ()
+# endif
+#endif
+
+
+/*
+ * OK. ANSI C has a type size_t that is used for sizes of things.
+ * In the GNU C header files, this is unsigned long.
+ * In BSD, it appears this should be
+ * unsigned int for malloc et al. and int otherwise
+ * In SunOS ditto
+ * In V.2, ditto
+ *
+ * So I have 2 type names -- card and sizeof_t, both #define macros
+ * Since C does not do range-checking, card (as in cardinal)
+ * should be *signed* int, so that -ve numbers dont go *completely* mad.
+ */
+
+#ifdef __SDTC__
+# ifndef NEEDPROTO
+ /* true STDC system */
+# include <stddef.h>
+# define sizeof_t size_t
+# define card size_t
+# define _SIZE_T
+# endif
+#endif
+
+#ifndef sizeof_t
+# define sizeof_t unsigned int
+#endif
+
+#ifndef card
+# define card int
+#endif
+
+/*
+ * e.g.,
+ * addr malloc ARGS((sizeof_t));
+ * as opposed to
+ * void *malloc(size_t);
+ * or
+ * char *malloc();
+ * in ANSI C and tradc respectively.
+ */
+
+#endif
diff --git a/fonts/utilities/mff-29/strdup.c b/fonts/utilities/mff-29/strdup.c
new file mode 100644
index 0000000000..784c762ace
--- /dev/null
+++ b/fonts/utilities/mff-29/strdup.c
@@ -0,0 +1,68 @@
+/* strdup.c 2.9.0 92/07/06 - a coupla convenience routines */
+
+/* - Damian Cugley <pdc@prg.ox.ac.uk> Fri. 1 Mar. 1991
+-----------------------------------------------------------------------
+ This software module copyright (c) 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+*/
+
+#include "fatal.h"
+#include "strmisc.h"
+
+addr malloc ARGS((sizeof_t));
+addr realloc ARGS((addr, sizeof_t));
+
+#ifndef xpg2
+void
+xfree(a)
+ addr a;
+{
+ int free ARGS((addr));
+
+ if (!free(a))
+ pfatalf("free(0x%lX)", (long)a);
+}
+#endif
+
+addr malloc ARGS((sizeof_t));
+addr realloc ARGS((addr, sizeof_t));
+
+addr
+xmalloc(siz)
+ sizeof_t siz;
+{
+ register addr t;
+
+ if (!(t = malloc(siz)))
+ pfatalf("malloc(%ld)", (long)siz);
+ return t;
+}
+
+addr
+xrealloc(oldptr, siz)
+ addr oldptr;
+ sizeof_t siz;
+{
+ register addr t;
+
+ if (!(t = realloc(oldptr, siz)))
+ pfatalf("realloc(*,%ld)", (long)siz);
+ return t;
+}
+
+char *
+strdup(s)
+ const char *s;
+{
+ int siz; char *t;
+
+ if (!s) return (char *)0;
+ siz = strlen(s) + 1;
+ if (!(t = malloc(siz)))
+ pfatalf("malloc(%ld)", (long)siz);
+ bcopy((addr)s, t, siz);
+ t[siz - 1] = 0;
+ return t;
+}
diff --git a/fonts/utilities/mff-29/stritem.c b/fonts/utilities/mff-29/stritem.c
new file mode 100644
index 0000000000..a6de73c236
--- /dev/null
+++ b/fonts/utilities/mff-29/stritem.c
@@ -0,0 +1,37 @@
+/* stritem.c 2.9.0 92/07/06 -- like strtok except different */
+
+/*
+ * This is a replacement for the SysV strtok(3C) function.
+ * (It has a different signature.) See stritem(3).
+ */
+
+/* - Damian Cugley <pdc@prg.ox.ac.uk> Thur. 20 June 1991
+-----------------------------------------------------------------------
+ This software module copyright (c) 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+*/
+
+#include "strmisc.h"
+
+char *
+stritem(s, c, state)
+ char *s;
+ int c;
+ char **state;
+{
+ char *result;
+ register char *p;
+
+ result = (s ? s : *state);
+ if (!result || !*result) return (char *)NULL;
+
+ for (p = result; *p && *p != c; p++)
+ ;
+ if (*p)
+ *state = p + 1, *p = '\0';
+ else
+ *state = (char *)NULL; /* next call will return NULL */
+ return result;
+}
diff --git a/fonts/utilities/mff-29/strmisc.h b/fonts/utilities/mff-29/strmisc.h
new file mode 100644
index 0000000000..ff6d53ebe1
--- /dev/null
+++ b/fonts/utilities/mff-29/strmisc.h
@@ -0,0 +1,88 @@
+/* strmisc.h 2.9.0 92/07/06 */
+/* Copyright (C) 1991 Damian Cugley */
+
+#ifndef strmisc_h_
+#define strmisc_h_
+
+#ifndef addr
+# include "stdc.h"
+#endif
+
+#ifdef BSD
+# define strchr index
+# define strrchr rindex
+#endif
+
+char * strcpy ARGS((char *, const char *));
+char * strncpy ARGS((char *, const char *, card));
+char * strcat ARGS((char *, const char *));
+char * strncat ARGS((char *, const char *, card));
+char * strchr ARGS((const char *, int));
+char * strrchr ARGS((const char *, int));
+int strcmp ARGS((const char *, const char *));
+int strncmp ARGS((const char *, const char *, card));
+card strlen ARGS((const char *));
+long strtol ARGS((const char *, char **, int));
+
+#ifdef BSD
+void bcopy ARGS((const_addr, addr, card));
+void bzero ARGS((addr, card));
+#else
+addr memcpy ARGS((addr, const_addr, card));
+addr memset ARGS((addr, int, card));
+#define bcopy(S,D,N) memcpy((D),(S),(N))
+#define bzero(D,N) memset((D),0,(N))
+#endif
+
+/*
+ * Now my string routines, which are much more fun
+ */
+
+char * stritem ARGS((char *str, int, char **sp));
+/*
+ * stritem is used to parse a string as a seq. of items
+ * separated by a particular character -- usually ','.
+ * State is stored into *sp.
+ */
+
+char * strword ARGS((char *str, char **sp));
+/*
+ * strword is used to parse a string as a seq. of words separated
+ * by whitespace characters.
+ *
+ * The first call should have |str| and |sp| both non-null. It starts
+ * scanning at str and stores state in |sp|. Subsequent calls
+ * should have |str| NULL so that the state stored in |sp| is used.
+ *
+ * Spaces are incorporated into words with double quote characters only.
+ * To incorporate a " char in a quoted word, use two:
+ * " wibble""wobble" -> [SPC]wibble"wobble
+ * Quote chars inside words *not* started with a quotes are ordinary
+ * characters.
+ *
+ * <string> ::= { <space> <word> } <space>.
+ * <space> ::= { <space-char> }.
+ * <word> ::= " { <space-char> | <ord-char> | "" } "
+ * | <ord-char> { <ord-char> | " }.
+ *
+ * <space-char> is space, tab, newline etc.
+ * <ord-char> is anything not a <space-char> or ".
+ */
+
+char * strdup ARGS((const char *));
+/* make a malloc'd copy of a string */
+
+addr xmalloc ARGS((sizeof_t));
+addr xrealloc ARGS((addr, sizeof_t));
+
+#ifndef xpg2
+void xfree ARGS((addr));
+#else
+#define xfree free
+#endif
+
+#ifndef NULL
+# define NULL 0 /* should always be cast */
+#endif
+
+#endif
diff --git a/fonts/utilities/mff-29/strword.c b/fonts/utilities/mff-29/strword.c
new file mode 100644
index 0000000000..795d783e67
--- /dev/null
+++ b/fonts/utilities/mff-29/strword.c
@@ -0,0 +1,42 @@
+/* strword.c 2.9.0 92/07/06 - new improved version of strword */
+
+/* - Damian Cugley <pdc@prg.ox.ac.uk> Fri. 1 Mar. 1991
+-----------------------------------------------------------------------
+ This software module copyright (c) 1991 Damian Cugley.
+ It is provided for free on an "as-is" basis.
+ See the file COPYING for more information.
+-----------------------------------------------------------------------
+*/
+
+#include <ctype.h>
+#include "strmisc.h"
+
+char *
+strword(str, sp)
+ char *str, /* if non-null, read from this string */
+ **sp; /* used to store state between calls */
+{
+ char *result,
+ *p, /* copy word to here */
+ *q; /* copy word from here */
+
+ for (result = (str ? str : *sp); *result && isspace(*result); ++result)
+ ;
+ p = result;
+ if (*p == '"')
+ { /* word starts with " char */
+ for (q = p + 1;
+ *q && !(*q == '"' && *++q != '"');
+ *p++ = *q++)
+ ;
+ *sp = q; /* at least 2 past p */
+ }
+ else
+ {
+ while (*p && !isspace(*p))
+ p++;
+ *sp = *p ? p + 1 : p;
+ }
+ *p = '\0'; /* chop returned string after end of word */
+ return *result ? result : (char *)0;
+}
diff --git a/fonts/utilities/mff-29/testfont b/fonts/utilities/mff-29/testfont
new file mode 100644
index 0000000000..3dfd26c105
--- /dev/null
+++ b/fonts/utilities/mff-29/testfont
@@ -0,0 +1,74 @@
+#! /bin/sh
+########################################################################
+# testfont - test a font (with a name like testfont, what do you exect?)
+# Damian Cugley <pdc@oxford.prg> Wed 6 Dec 1989
+# Added -h (help) - pdc Sun 15 Jul 1990
+# Copyright (C) 1990 Damian Cugley
+########################################################################
+
+PATH=/usr/local/bin:/usr/bin:/usr/ucb:/usr/local/bin/X11
+tmp=tmp.tex
+trap 'rm -f $tmp' 1 2 3 6 13 14 15 23
+
+cat > $tmp << @EOF
+% $tmp -- display some font samples
+%%Creator: $0
+%%For: ${USER-$LOGNAME}
+%%CreationDate: `date`
+%%EndComments
+%%BeginProlog
+\\let\\noinit!
+\\input testfont %% macros
+%%EndProlog
+@EOF
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ +m) mag= ; shift ;;
+ +s) mag= ; shift ;;
+ +c) cmd= ; shift ;;
+ -m) mag="scaled \\magstep$2"; shift 2 ;;
+ -m*) mag="scaled \\magstep`expr $1 : '-m\(.*\)'`"; shift ;;
+ -s) mag="scaled $2"; shift 2 ;;
+ -s*) mag="scaled `expr $1 : '-m\(.*\)'`"; shift ;;
+ -c) cmd=$2; shift 2 ;;
+ -c*) cmd=`expr $1 : '-c\(.*\)'`; shift ;;
+ -v) verbose=t; shift ;;
+ +v) verbose= ; shift ;;
+ [+-][h?]*) echo << @EOF
+USAGE
+ `basename $0` [ -v | [-c] COMMANDS | -m MAGSTEP | -s SCALE
+ | +m|s|c|v | FONT ]...
+
+FONT is the TeX name of a font - e.g, '"cmr12"'
+-c COMMANDS
+ Sets the TeX commands to be applied to each subsequent font. Default is
+ -c '"\names"'
+
+-m MAGSTEP
+-s SCALED
+ Use subsequent fonts at that magnification (MAGSTEP is either an integer
+ from -5 to 5 or is '"half"'; SCALED is 1000*desired magnification)
+ Default is -s 1000.
+
+-v
+ Verbose (well, verbosish).
+
++c, +s, +m or +v return things to default settings
+
+Options can be mixed in with FONT arguments.
+@EOF
+ exit 0 ;;
+ -* | +*) echo Don\'t understand $1, try `basename $0` -h. >&2
+ exit 1 ;;
+ \\*) cmd="$cmd $1"; shift ;;
+ *) echo >> $tmp '\def\fontname{'$1 $mag'}' \
+ '\startfont' ${cmd:-'\display\names'}
+ shift
+ esac
+done
+
+echo >> $tmp \\bye
+
+if [ -n "$verbose" ]; then cat $tmp; fi
+/usr/local/bin/tex tmp && [ $DISPLAY ] && xdvi tmp
diff --git a/fonts/utilities/mff-29/testfont.1 b/fonts/utilities/mff-29/testfont.1
new file mode 100644
index 0000000000..d9e8528430
--- /dev/null
+++ b/fonts/utilities/mff-29/testfont.1
@@ -0,0 +1,168 @@
+.TH TESTFONT 1 "pdc Tue. 28 May 1991" "mff 2.8" "CONTRIBUTED PROGRAMS"
+.SH NAME
+testfont \- a wrapper around testfont.tex, for testing and proofing TeX fonts
+.SH SYNOPSIS
+.ie n \{\
+. ds Te Te
+. ds gf GFtoPK
+. ds mf METAFONT\}
+.el \{\
+. ds Te T\v|0.25m|\h|-0.1m|E\v|-0.25m|
+. ds gf \s-1GF\s0to\s-1PK\s0
+. ds mf \s-1METAFONT\s0\}
+.na
+.B testfont
+[
+.B \-m
+.I magstep
+|
+.B \-s
+.I scale
+|
+.B \-v
+|
+.B +msv
+|
+[
+.B \-c
+]
+.I \*(TeX code
+|
+.I fontname
+].\|.\|.
+.SH DESCRIPTION
+.I testfont
+is a simple shellscript for trying out new \*(TeX fonts. It
+gives a slightly more convenient user-interface to
+.I testfont.tex.
+The fonts named by the
+.I font
+arguments each have the
+.I \*(TeX code
+applied to them.
+.LP
+Because
+\*(TeX
+cannot be driven easily from the standard
+input,
+a file
+.I tmp.tex
+is created as follows:
+.RS
+.if n .sp
+.if t .sp 0.5v
+.B \e\^let\|\e\^noinit!
+.B \e\^input testfont
+.br
+.BI \e\^def\|\e\^fontname{ fontname1 }
+.B \e\^startfont
+.I \*(TeX code
+.br
+\&.\|.\|.
+.br
+.BI \e\^def\|\e\^fontname{ fontnameN }
+.B \e\^startfont
+.I \*(TeX code
+.br
+.B \e\^bye
+.if n .sp
+.if t .sp 0.5v
+.RE
+\*(TeX is run on this file and if the environment variable
+.SM DISPLAY
+is set then the
+.SM DVI
+previewer
+.IR xdvi (1)
+is invoked on
+.IR tmp.dvi .
+.SH OPTIONS
+.TP
+.BI \-c " \*(TeX code"
+This sets the \*(TeX code to be used to try out the fonts. (The default
+is
+.BR \e\^names ).
+The \*(TeX code should usually be quoted to protect it from the shell.
+For example:
+.B testfont \-c \(fm\|\e\^table\|\e\^punct\(fm
+.BR cmr12 .
+Words starting with a backslash are assumed to be additional \*(TeX
+code and are appended to the code line.
+.RB ( \-c
+.I code
+discards the accumulated text and starts afresh).
+.TP
+.B +c
+Sets the \*(TeX code to be
+.BR \e\^names .
+.TP
+.B \-h
+.PD 0v
+.TP
+.B \-?
+.PD
+Prints a help message.
+.TP
+.BI \-m " number"
+Subsequent
+fonts will all be scaled by magstep
+.I number
+(that is, 1.2 raised to the
+.IR number th
+power).
+.TP
+.BI \-s " number"
+Subsequent fonts will be scaled by
+.I number
+divided by 1000.
+.TP
+.B +m
+.PD 0v
+.TP
+.B +s
+.PD
+Subsequent fonts will be loaded unscaled (that is, at magnification
+1.0).
+.TP
+.B \-v
+The temporary \*(TeX file is printed to standard output before \*(TeX is
+invoked. Cancelled by a subsequent
+.BR +v ).
+.SH FILES
+.TP
+.B testfont.tex
+A file of
+\*(TeX macros for testing fonts with (one is usually supplied with
+\*(TeX and is listed in Appendix H of the
+.IR \*(mfbook );
+a given font might have a different
+.I testfont.tex
+file which will be found by \*(TeX instead of the default one if
+.I testfont
+is run in that directory.
+.TP
+.B tmp.tex
+A temporary file of \*(TeX code.
+.TP
+.B tmp.dvi
+The DeVice Independent file which \*(TeX creates.
+.TP
+.B tmp.log
+Log file created by \*(TeX.
+.SH AUTHOR
+Damian Cugley
+<pdc@prg.ox.ac.uk>.
+See
+.IR mff (1)
+for information about reporting bugs.
+.SH "SEE ALSO"
+mf(1), mff(1), tex(1), xdvi(1)
+.LP
+Donald E. Knuth,
+.I The \*(mfbook
+(Appendix H, Section 4 `Font samples'). Addison-Wesley, 1986. ISBN
+0\-201\-13444\-6.
+.LP
+Donald E. Knuth,
+.I The \*(TeXbook.
+Addison-Wesley, 1984. ISBN 0\-201\-13448\-9.
diff --git a/fonts/utilities/mff-29/version.h b/fonts/utilities/mff-29/version.h
new file mode 100644
index 0000000000..6d8c8a3102
--- /dev/null
+++ b/fonts/utilities/mff-29/version.h
@@ -0,0 +1,3 @@
+/* version.h 2.9.0 92/07/06 */
+#define MFF_VERSION "@(#) This is mff release 2.9 <pdc 92/07/06>"
+/* Any "patchlevel" information to be inserted ^ here */
diff --git a/fonts/utilities/mff-29/xstdio.h b/fonts/utilities/mff-29/xstdio.h
new file mode 100644
index 0000000000..05f3c4aa65
--- /dev/null
+++ b/fonts/utilities/mff-29/xstdio.h
@@ -0,0 +1,62 @@
+/* xstdio.h 2.9.0 92/07/06 -- standard IO header file plus prototypes */
+
+/*
+ * This file is intended to get around the problem of
+ * using GNU C on a system that doesn't have ANSI C header files.
+ * I've taken it out of stdc.h because I want stdc.h to still be
+ * useful when I write non-stdio programs (as I very occasionally do).
+ * - Damian Cugley <pdc@prg.ox.ac.uk> Mon. 17 June 1991
+ */
+
+#ifndef MFF_xstdio_H
+#define MFF_xstdio_H
+
+/*
+ * attempt to avoid loading the system header file more than once
+ * -- on some systems this seems to cause an error because NULL is redefined.
+ */
+#ifndef BUFSIZ
+# include <stdio.h>
+#endif
+
+#ifndef ARGS
+# include "stdc.h"
+#endif
+
+#ifdef NEEDPROTO
+
+int printf ARGS((const char *, ...));
+int fprintf ARGS((FILE *, const char *, ...));
+int puts ARGS((const char *));
+int fputs ARGS((const char *, FILE *));
+int fputc ARGS((int, FILE *));
+int ungetc ARGS((int, FILE *));
+int fclose ARGS((FILE *));
+void rewind ARGS((FILE *));
+int fflush ARGS((FILE *)); /* EOF on error */
+int putw ARGS((int, FILE *));
+int getw ARGS((FILE *));
+int fwrite ARGS((addr, sizeof_t, int, FILE *));
+int fread ARGS((addr, sizeof_t, int, FILE *));
+int setvbuf ARGS((FILE *, char *, int, sizeof_t));
+
+/*
+ * functions used in the putc and getc macros in stdio.h
+ * I need to declare them if only to shut GCC up.
+ * I think they apply to BSD and System V systems at least.
+ */
+#ifndef NO_FLSBUF
+int _flsbuf ARGS((int, FILE *));
+int _filbuf ARGS((FILE *));
+#endif
+
+#endif /* NEEDPROTO */
+
+
+/*
+ * Plus one extra routine:
+ */
+char * fgetword ARGS((char *buf, FILE *fp));
+
+
+#endif /* MFF_xstdio_H */
diff --git a/fonts/utilities/mkpkfontdir/INSTALL b/fonts/utilities/mkpkfontdir/INSTALL
new file mode 100644
index 0000000000..2022234228
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/INSTALL
@@ -0,0 +1,16 @@
+To install mkpkfontdir, carefully read the customizable section of the
+Makefile and edit the variables to your needs and taste.
+
+The code is written in Perl, but with no Perl 5 specifics except for the
+use of the Getopt module with long options names. If you use Perl 4,
+please copy the lnggetopt.pl file that is supplied to your Perl library,
+and select the appropriate line in the Makefile.
+
+Then simply type make install.
+
+Please do not edit the resulting manual page and program. Instead,
+edit the templates in tmpl and make again. Send me any useful
+modifications, please.
+
+Yves Arrouye <Yves.Arrouye@imag.fr>, August 1995
+
diff --git a/fonts/utilities/mkpkfontdir/Makefile b/fonts/utilities/mkpkfontdir/Makefile
new file mode 100644
index 0000000000..19898a37c8
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/Makefile
@@ -0,0 +1,105 @@
+
+# Generation of texfontdir and texfontdir.1
+#
+# Customize variables here, not in the files themselves, if you want to keep
+# the manual and program in sync.
+#
+# Yves Arrouye <Yves.Arrouye@imag.fr>, 1995
+
+# Where to install
+
+BINDIR=$(VARTEXMF)/bin
+MANDIR=$(TEXMF)/doc/man/man1
+
+# Customization
+
+PERL = /usr/local/bin/perl
+
+# Choose one line depending on whether you use Perl 5 or 4
+# Perl 5:
+USE_GETOPTS = use Getopt'"'"'Long; \$$Getopt'"'"'Long'"'"'ignorecase = 0;
+# Perl 4:
+#USE_GETOPTS = require '"'"'lnggetopt.pl'"'"'; \$$lnggetopt'"'"'ignorecase = 0;
+
+# Use TDS names (dpi300/cmr10.pk) by default? (0 or 1.)
+
+TDS_DEFAULT = 0
+
+# Are such names required? If 1, then other options will not be
+# allowed. Note that if you distribute this script so that it is
+# shared among many systems, you should leave it to 0 and uncomment
+# the TEST_LONGNAMES expression below, or assign this variable to an
+# expresison depending on the system type (maybe the best solution).
+
+USE_TDSNAMES = 0
+
+# Test if system supports long filenames? The variable $opt_tds_names
+# will be set at this moment, we can use it (it is 1 if we use TDS names).
+
+# TEST_LONGNAMES = !\$opt_tds_names;
+TEST_LONGNAMES = 0
+
+# Default font dir and destination dir
+
+FONTDIR = \$$TEXMF/fonts
+DESTDIR = \$$VARTEXMF/fonts/tmp
+
+# Location of tfm and pk directories under these dirs
+
+LOC_TFMDIR = tfm
+LOC_PKDIR = pk
+
+LOC_TFMDIRBASE = `basename $(LOC_TFMDIR)`
+
+# Where to put unknown files
+
+LOC_UNKNOWNDIR = unknown
+LOC_UNKNOWNMODE = unknown
+
+# Location of the modes.mf database
+
+LOC_MODESMF = \$$TEXMF/metafont/misc/modes.mf
+
+# Set this variable if you want to use kpsewhich (recommended)
+
+USE_KPSEWHICH = yes
+
+# Do not modify what follows except for the installation target below
+
+%: tmpl/% Makefile
+ sed -e 's,@@TEXMF@@,$(TEXMF),' \
+ -e 's,@@PERL@@,$(PERL),' \
+ -e 's,@@TDS_DEFAULT@@,$(TDS_DEFAULT),' \
+ -e 's,@@USE_TDSNAMES@@,$(USE_TDSNAMES),' \
+ -e 's,@@TEST_LONGNAMES@@,$(TEST_LONGNAMES),' \
+ -e 's,@@FONTDIR@@,$(FONTDIR),' \
+ -e 's,@@DESTDIR@@,$(DESTDIR),' \
+ -e 's,@@LOC_TFMDIR@@,$(LOC_TFMDIR),' \
+ -e "s,@@LOC_TFMDIRBASE@@,$(LOC_TFMDIRBASE)," \
+ -e 's,@@LOC_PKDIR@@,$(LOC_PKDIR),' \
+ -e 's,@@LOC_UNKNOWNDIR@@,$(LOC_UNKNOWNDIR),' \
+ -e 's,@@LOC_UNKNOWNMODE@@,$(LOC_UNKNOWNMODE),' \
+ -e 's,@@LOC_MODESMF@@,$(LOC_MODESMF),' \
+ -e 's,@@USE_KPSEWHICH@@,$(USE_KPSEWHICH),' \
+ -e 's,@@USE_GETOPTS@@,$(USE_GETOPTS),' \
+ <$< >$@
+
+WHAT = mkpkfontdir mkpkfontdir.1
+
+all: $(WHAT)
+
+install: all
+ install -m 755 mkpkfontdir $(BINDIR)
+ install -m 644 mkpkfontdir.1 $(MANDIR)
+# Uncomment the following line if your man supports gzipped files
+# gzip -9 $(MANDIR)/mkpkfontdir.1
+
+clean:
+ $(RM) $(WHAT)
+
+uninstall:
+ $(RM) $(BINDIR)/mkpkfontdir
+ $(RM) $(MANDIR)/mkpkfontdir.1 $(MANDIR)/mkpkfontdir.1.gz \
+ $(MANDIR)/mkpkfontdir.1.* $(MANDIR)/../cat1/mkpkfontdir.1 \
+ $(MANDIR)/../cat1/mkpkfontdir.1.*
+
diff --git a/fonts/utilities/mkpkfontdir/README b/fonts/utilities/mkpkfontdir/README
new file mode 100644
index 0000000000..92969d3df1
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/README
@@ -0,0 +1,16 @@
+mkpkfontdir is a tool for manipulating TeX directories and
+reorganizing them in various ways mimicking (after some
+transformations) the organization of your tfm files tree.
+
+mkpkfontdir can generate TDS trees, or mirror and flatten them for
+efficient recursive subdirectories searching (by making a pool of
+symbolic links that will be searched, for example). It has been
+successfully used in a modified MakeTeXPK, for instance, to put
+generated pk files at their "right" place in a structure hierarchy.
+
+It is also a great help for keeping consistency between the tfm and
+the pk trees, or simply for putting newly got pk files at their right
+place.
+
+Yves Arrouye <Yves.Arrouye@imag.fr>, August 1995.
+
diff --git a/fonts/utilities/mkpkfontdir/lnggetopt.pl b/fonts/utilities/mkpkfontdir/lnggetopt.pl
new file mode 100644
index 0000000000..f3a1bc2988
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/lnggetopt.pl
@@ -0,0 +1,510 @@
+# newgetopt.pl -- new options parsing
+
+# SCCS Status : @(#)@ newgetopt.pl 1.14
+# Author : Johan Vromans
+# Created On : Tue Sep 11 15:00:12 1990
+# Last Modified By: Johan Vromans
+# Last Modified On: Sat Feb 12 18:24:02 1994
+# Update Count : 138
+# Status : Okay
+
+# Modified by Yves Arrouye under the name 'lnggetopt.pl' for use with Perl 4
+
+################ Introduction ################
+#
+# This package implements an extended getopt function. This function adheres
+# to the new syntax (long option names, no bundling).
+# It tries to implement the better functionality of traditional, GNU and
+# POSIX getopt functions.
+#
+# This program is Copyright 1990,1994 by Johan Vromans.
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# If you do not have a copy of the GNU General Public License write to
+# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+# MA 02139, USA.
+
+################ Description ################
+#
+# Usage:
+#
+# require "lnggetopt.pl";
+# ...change configuration values, if needed...
+# $result = &NGetOpt (...option-descriptions...);
+#
+# Each description should designate a valid perl identifier, optionally
+# followed by an argument specifier.
+#
+# Values for argument specifiers are:
+#
+# <none> option does not take an argument
+# ! option does not take an argument and may be negated
+# =s :s option takes a mandatory (=) or optional (:) string argument
+# =i :i option takes a mandatory (=) or optional (:) integer argument
+# =f :f option takes a mandatory (=) or optional (:) real number argument
+#
+# If option "name" is set, it will cause the perl variable $opt_name to
+# be set to the specified value. The calling program can use this
+# variable to detect whether the option has been set. Options that do
+# not take an argument will be set to 1 (one).
+#
+# Options that take an optional argument will be defined, but set to ''
+# if no actual argument has been supplied.
+#
+# If an "@" sign is appended to the argument specifier, the option is
+# treated as an array. Value(s) are not set, but pushed into array
+# @opt_name.
+#
+# Options that do not take a value may have an "!" argument spacifier to
+# indicate that they may be negated. E.g. "foo!" will allow -foo (which
+# sets $opt_foo to 1) and -nofoo (which will set $opt_foo to 0).
+#
+# The option name may actually be a list of option names, separated by
+# '|'s, e.g. "foo|bar|blech=s". In this example, options 'bar' and
+# 'blech' will set $opt_foo instead.
+#
+# Option names may be abbreviated to uniqueness, depending on
+# configuration variable $autoabbrev.
+#
+# Dashes in option names are allowed (e.g. pcc-struct-return) and will
+# be translated to underscores in the corresponding perl variable (e.g.
+# $opt_pcc_struct_return). Note that a lone dash "-" is considered an
+# option, corresponding perl identifier is $opt_ .
+#
+# A double dash "--" signals end of the options list.
+#
+# If the first option of the list consists of non-alphanumeric
+# characters only, it is interpreted as a generic option starter.
+# Everything starting with one of the characters from the starter will
+# be considered an option.
+#
+# The default values for the option starters are "-" (traditional), "--"
+# (POSIX) and "+" (GNU, being phased out).
+#
+# Options that start with "--" may have an argument appended, separated
+# with an "=", e.g. "--foo=bar".
+#
+# If configuration varaible $getopt_compat is set to a non-zero value,
+# options that start with "+" may also include their arguments,
+# e.g. "+foo=bar".
+#
+# A return status of 0 (false) indicates that the function detected
+# one or more errors.
+#
+################ Some examples ################
+#
+# If option "one:i" (i.e. takes an optional integer argument), then
+# the following situations are handled:
+#
+# -one -two -> $opt_one = '', -two is next option
+# -one -2 -> $opt_one = -2
+#
+# Also, assume "foo=s" and "bar:s" :
+#
+# -bar -xxx -> $opt_bar = '', '-xxx' is next option
+# -foo -bar -> $opt_foo = '-bar'
+# -foo -- -> $opt_foo = '--'
+#
+# In GNU or POSIX format, option names and values can be combined:
+#
+# +foo=blech -> $opt_foo = 'blech'
+# --bar= -> $opt_bar = ''
+# --bar=-- -> $opt_bar = '--'
+#
+################ Configuration values ################
+#
+# $autoabbrev Allow option names to be abbreviated to uniqueness.
+# Default is 1 unless environment variable
+# POSIXLY_CORRECT has been set.
+#
+# $getopt_compat Allow '+' to start options.
+# Default is 1 unless environment variable
+# POSIXLY_CORRECT has been set.
+#
+# $option_start Regexp with option starters.
+# Default is (--|-) if environment variable
+# POSIXLY_CORRECT has been set, (--|-|\+) otherwise.
+#
+# $order Whether non-options are allowed to be mixed with
+# options.
+# Default is $REQUIRE_ORDER if environment variable
+# POSIXLY_CORRECT has been set, $PERMUTE otherwise.
+#
+# $ignorecase Ignore case when matching options. Default is 1.
+#
+# $debug Enable debugging output. Default is 0.
+
+################ History ################
+#
+# 12-Feb-1994 Johan Vromans
+# Added "!" for negation.
+# Released to the net.
+#
+# 26-Aug-1992 Johan Vromans
+# More POSIX/GNU compliance.
+# Lone dash and double-dash are now independent of the option prefix
+# that is used.
+# Make errors in NGetOpt parameters fatal.
+# Allow options to be mixed with arguments.
+# Check $ENV{"POSIXLY_CORRECT"} to suppress this.
+# Allow --foo=bar and +foo=bar (but not -foo=bar).
+# Allow options to be abbreviated to minimum needed for uniqueness.
+# (Controlled by configuration variable $autoabbrev.)
+# Allow alias names for options (e.g. "foo|bar=s").
+# Allow "-" in option names (e.g. --pcc-struct-return). Dashes are
+# translated to "_" to form valid perl identifiers
+# (e.g. $opt_pcc_struct_return).
+#
+# 2-Jun-1992 Johan Vromans
+# Do not use //o to allow multiple NGetOpt calls with different delimeters.
+# Prevent typeless option from using previous $array state.
+# Prevent empty option from being eaten as a (negative) number.
+#
+# 25-May-1992 Johan Vromans
+# Add array options. "foo=s@" will return an array @opt_foo that
+# contains all values that were supplied. E.g. "-foo one -foo -two" will
+# return @opt_foo = ("one", "-two");
+# Correct bug in handling options that allow for a argument when followed
+# by another option.
+#
+# 4-May-1992 Johan Vromans
+# Add $ignorecase to match options in either case.
+# Allow '' option.
+#
+# 19-Mar-1992 Johan Vromans
+# Allow require from packages.
+# NGetOpt is now defined in the package that requires it.
+# @ARGV and $opt_... are taken from the package that calls it.
+# Use standard (?) option prefixes: -, -- and +.
+#
+# 20-Sep-1990 Johan Vromans
+# Set options w/o argument to 1.
+# Correct the dreadful semicolon/require bug.
+
+################ Configuration Section ################
+
+{
+ package lnggetopt;
+
+ # Values for $order. See GNU getopt.c for details.
+ $REQUIRE_ORDER = 0;
+ $PERMUTE = 1;
+ $RETURN_IN_ORDER = 2;
+
+ # Handle POSIX compliancy.
+ if ( defined $ENV{"POSIXLY_CORRECT"} ) {
+ $autoabbrev = 0; # no automatic abbrev of options (???)
+ $getopt_compat = 0; # disallow '+' to start options
+ $option_start = "(--|-)";
+ $order = $REQUIRE_ORDER;
+ }
+ else {
+ $autoabbrev = 1; # automatic abbrev of options
+ $getopt_compat = 1; # allow '+' to start options
+ $option_start = "(--|-|\\+)";
+ $order = $PERMUTE;
+ }
+
+ # Other configurable settings.
+ $debug = 0; # for debugging
+ $ignorecase = 1; # ignore case when matching options
+ $argv_end = "--"; # don't change this!
+}
+
+################ Subroutines ################
+
+sub GetOptions {
+
+ @lnggetopt'optionlist = @_; #';
+
+ package lnggetopt;
+
+ local ($[) = 0;
+ local ($genprefix) = $option_start;
+ local ($argend) = $argv_end;
+ local ($error) = 0;
+ local ($opt, $optx, $arg, $type, $mand, %opctl);
+ local ($pkg) = (caller)[0];
+ local ($optarg);
+ local (%aliases);
+ local (@ret) = ();
+
+ print STDERR "NGetOpt 1.14 -- called from $pkg\n" if $debug;
+
+ # See if the first element of the optionlist contains option
+ # starter characters.
+ if ( $optionlist[0] =~ /^\W+$/ ) {
+ $genprefix = shift (@optionlist);
+ # Turn into regexp.
+ $genprefix =~ s/(\W)/\\$1/g;
+ $genprefix = "[" . $genprefix . "]";
+ }
+
+ # Verify correctness of optionlist.
+ %opctl = ();
+ foreach $opt ( @optionlist ) {
+ $opt =~ tr/A-Z/a-z/ if $ignorecase;
+ if ( $opt !~ /^(\w+[-\w|]*)?(!|[=:][infse]@?)?$/ ) {
+ die ("Error in option spec: \"", $opt, "\"\n");
+ $error++;
+ next;
+ }
+ local ($o, $c, $a) = ($1, $2);
+
+ if ( ! defined $o ) {
+ $opctl{''} = defined $c ? $c : '';
+ }
+ else {
+ # Handle alias names
+ foreach ( split (/\|/, $o)) {
+ if ( defined $c && $c eq '!' ) {
+ $opctl{"no$_"} = $c;
+ $c = '';
+ }
+ $opctl{$_} = defined $c ? $c : '';
+ if ( defined $a ) {
+ # Note alias.
+ $aliases{$_} = $a;
+ }
+ else {
+ # Set primary name.
+ $a = $_;
+ }
+ }
+ }
+ }
+ @opctl = sort(keys (%opctl)) if $autoabbrev;
+
+ return 0 if $error;
+
+ if ( $debug ) {
+ local ($arrow, $k, $v);
+ $arrow = "=> ";
+ while ( ($k,$v) = each(%opctl) ) {
+ print STDERR ($arrow, "\$opctl{\"$k\"} = \"$v\"\n");
+ $arrow = " ";
+ }
+ }
+
+ # Process argument list
+
+ while ( $#ARGV >= 0 ) {
+
+ # >>> See also the continue block <<<
+
+ #### Get next argument ####
+
+ $opt = shift (@ARGV);
+ print STDERR ("=> option \"", $opt, "\"\n") if $debug;
+ $arg = undef;
+ $optarg = undef;
+ $array = 0;
+
+ #### Determine what we have ####
+
+ # Double dash is option list terminator.
+ if ( $opt eq $argend ) {
+ unshift (@ret, @ARGV) if $order == $PERMUTE;
+ return ($error == 0);
+ }
+ elsif ( $opt =~ /^$genprefix/ ) {
+ # Looks like an option.
+ $opt = $'; # option name (w/o prefix)
+ # If it is a long opt, it may include the value.
+ if (($+ eq "--" || ($getopt_compat && $+ eq "+")) &&
+ $opt =~ /^([^=]+)=/ ) {
+ $opt = $1;
+ $optarg = $';
+ print STDERR ("=> option \"", $opt,
+ "\", optarg = \"$optarg\"\n")
+ if $debug;
+ }
+
+ }
+ # Not an option. Save it if we may permute...
+ elsif ( $order == $PERMUTE ) {
+ push (@ret, $opt);
+ next;
+ }
+ # ...otherwise, terminate.
+ else {
+ # Push back and exit.
+ unshift (@ARGV, $opt);
+ return ($error == 0);
+ }
+
+ #### Look it up ###
+
+ $opt =~ tr/A-Z/a-z/ if $ignorecase;
+
+ local ($tryopt) = $opt;
+ if ( $autoabbrev ) {
+ local ($pat, @hits);
+
+ # Turn option name into pattern.
+ ($pat = $opt) =~ s/(\W)/\\$1/g;
+ # Look up in option names.
+ @hits = grep (/^$pat/, @opctl);
+ print STDERR ("=> ", 0+@hits, " hits (@hits) with \"$pat\" ",
+ "out of ", 0+@opctl, "\n")
+ if $debug;
+
+ # Check for ambiguous results.
+ unless ( (@hits <= 1) || (grep ($_ eq $opt, @hits) == 1) ) {
+ print STDERR ("Option ", $opt, " is ambiguous (",
+ join(", ", @hits), ")\n");
+ $error++;
+ next;
+ }
+
+ # Complete the option name, if appropriate.
+ if ( @hits == 1 && $hits[0] ne $opt ) {
+ $tryopt = $hits[0];
+ print STDERR ("=> option \"$opt\" -> \"$tryopt\"\n")
+ if $debug;
+ }
+ }
+
+ unless ( defined ( $type = $opctl{$tryopt} ) ) {
+ print STDERR ("Unknown option: ", $opt, "\n");
+ $error++;
+ next;
+ }
+ $opt = $tryopt;
+ print STDERR ("=> found \"$type\" for ", $opt, "\n") if $debug;
+
+ #### Determine argument status ####
+
+ # If it is an option w/o argument, we're almost finished with it.
+ if ( $type eq '' || $type eq '!' ) {
+ if ( defined $optarg ) {
+ print STDERR ("Option ", $opt, " does not take an argument\n");
+ $error++;
+ }
+ elsif ( $type eq '' ) {
+ $arg = 1; # supply explicit value
+ }
+ else {
+ substr ($opt, 0, 2) = ''; # strip NO prefix
+ $arg = 0; # supply explicit value
+ }
+ next;
+ }
+
+ # Get mandatory status and type info.
+ ($mand, $type, $array) = $type =~ /^(.)(.)(@?)$/;
+
+ # Check if there is an option argument available.
+ if ( defined $optarg ? ($optarg eq '') : ($#ARGV < 0) ) {
+
+ # Complain if this option needs an argument.
+ if ( $mand eq "=" ) {
+ print STDERR ("Option ", $opt, " requires an argument\n");
+ $error++;
+ }
+ if ( $mand eq ":" ) {
+ $arg = $type eq "s" ? '' : 0;
+ }
+ next;
+ }
+
+ # Get (possibly optional) argument.
+ $arg = defined $optarg ? $optarg : shift (@ARGV);
+
+ #### Check if the argument is valid for this option ####
+
+ if ( $type eq "s" ) { # string
+ # A mandatory string takes anything.
+ next if $mand eq "=";
+
+ # An optional string takes almost anything.
+ next if defined $optarg;
+ next if $arg eq "-";
+
+ # Check for option or option list terminator.
+ if ($arg eq $argend ||
+ $arg =~ /^$genprefix.+/) {
+ # Push back.
+ unshift (@ARGV, $arg);
+ # Supply empty value.
+ $arg = '';
+ }
+ next;
+ }
+
+ if ( $type eq "n" || $type eq "i" ) { # numeric/integer
+ if ( $arg !~ /^-?[0-9]+$/ ) {
+ if ( defined $optarg || $mand eq "=" ) {
+ print STDERR ("Value \"", $arg, "\" invalid for option ",
+ $opt, " (number expected)\n");
+ $error++;
+ undef $arg; # don't assign it
+ }
+ else {
+ # Push back.
+ unshift (@ARGV, $arg);
+ # Supply default value.
+ $arg = 0;
+ }
+ }
+ next;
+ }
+
+ if ( $type eq "f" ) { # fixed real number, int is also ok
+ if ( $arg !~ /^-?[0-9.]+$/ ) {
+ if ( defined $optarg || $mand eq "=" ) {
+ print STDERR ("Value \"", $arg, "\" invalid for option ",
+ $opt, " (real number expected)\n");
+ $error++;
+ undef $arg; # don't assign it
+ }
+ else {
+ # Push back.
+ unshift (@ARGV, $arg);
+ # Supply default value.
+ $arg = 0.0;
+ }
+ }
+ next;
+ }
+
+ die ("NGetOpt internal error (Can't happen)\n");
+ }
+
+ continue {
+ if ( defined $arg ) {
+ $opt = $aliases{$opt} if defined $aliases{$opt};
+ # Make sure a valid perl identifier results.
+ $opt =~ s/\W/_/g;
+ if ( $array ) {
+ print STDERR ('=> push (@', $pkg, '\'opt_', $opt, ", \"$arg\")\n")
+ if $debug;
+ eval ('push(@' . $pkg . '\'opt_' . $opt . ", \$arg);");
+ }
+ else {
+ print STDERR ('=> $', $pkg, '\'opt_', $opt, " = \"$arg\"\n")
+ if $debug;
+ eval ('$' . $pkg . '\'opt_' . $opt . " = \$arg;");
+ }
+ }
+ }
+
+ if ( $order == $PERMUTE && @ret > 0 ) {
+ unshift (@ARGV, @ret);
+ }
+ return ($error == 0);
+}
+
+################ Package return ################
+
+1;
+
+
diff --git a/fonts/utilities/mkpkfontdir/misc/MakeTeXPK.in b/fonts/utilities/mkpkfontdir/misc/MakeTeXPK.in
new file mode 100644
index 0000000000..eed34f27c3
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/misc/MakeTeXPK.in
@@ -0,0 +1,336 @@
+#!/bin/sh
+# original MakeTeXPK -- make a new PK font, because one wasn't found.
+# Version of 12dec94.
+#
+# (If you change or delete the word `original' on the previous line,
+# installation won't write this MakeTeXPK over yours.)
+#
+# Changed by Yves Arrouye to try to support the TDS structure. Now needs that
+# kpsewhich is installed if $TDSFONTS is defined to 'yes'. I do not recommend
+# daily use of a TDS fonts structure because of the search overhead that it
+# adds to searching: on my system, with only TeX, LaTeX and AMS pk files, the
+# starts of xdvi takes approx. 15 seconds with a true TDS structure and only
+# 2 or 3 with fonts just organized by suppliers. That's why there's the
+# mkpkfontdir stuff here (well, read the comment below near TDSFONTS...).
+#
+# This MakeTeXPK version supports running a command after the file has been
+# moved, so that it may be moved again. In this case, the command must set
+# the PKFILE variable to where the file has been moved.
+#
+# This script must echo the name of the generated PK file (and nothing
+# else) to standard output. Yes, this is different from the original dvips.
+#
+# Parameters:
+# name dpi bdpi magnification [mode [destdir]]
+#
+# `name' is the base name of the font, such as `cmr10'.
+# `dpi' is the resolution the font is needed at.
+# `bdpi' is the base resolution, used to intuit the mode to use.
+# `magnification' is a string to pass to MF as the value of `mag'.
+# `mode', if supplied, is the mode to use. Unless it's `default', in
+# which case we guess. (This is so people can specify a destdir
+# without a mode.)
+# `destdir', if supplied, is either the absolute directory name to use
+# (if it starts with a /) or relative to the default DESTDIR (if not).
+
+# Please specify whether you want to use dpiXXX directories or not
+: ${TDSFONTS=no}
+# If you do, maybe you want to also make a link to a pool of .pk files that
+# will be searched much more quickly than a TDS hierarchy. Well, now that I
+# have written mkpkfontdir, it looks like all the TDSFONTS stuff is not
+# necessary because we can just do a mkpkfontdir at the end of MakeTeXPK
+# to change the name of the font. So, should we keep both?
+#
+# If we keep TDS names ($TDSFONTS=yes) we van just make a symbolic link, which
+# is something fast.
+: ${POOLDIR=/usr/local/texmf/fonts/pool}
+#: ${MOVEFONT='name=`echo /$namepart | sed -e s,/tmp/,/, -e "s,^/,,"`; PKFILE=$POOLDIR/$name/$MODE/$PKOUTNAME; mkdirchain $POOLDIR/$name/$MODE && ln -s $DESTDIR$FROM$DPIDIR$PKNAME $PKFILE'}
+# On my system, I don't use TDS name but keep the files in a TDS-like
+# hierarchy organized by suppliers, which yields:
+# : ${MOVEFONT='PKDEST=`echo $DESTDIR | sed 's,/pk/.*,,'`; PKFILE=`mkpkfontdir -w -r 2 -d $PKDEST $DESTDIR$FROM$DPIDIR/$PKNAME`'}
+# It is possible to also keep the supplier typeface by removing the -r 2 args.
+# Note that all the following stuff does not work for types other than pk.
+
+# The root of where to put the new file. (Using the sh construct
+# ${var=value} is the tersest construct that lets an environment
+# variable `var' override the value given here.)
+: ${DESTROOT=${MTPK_DESTROOT-@fontdir@}}
+
+# Define to `gsftopk' or `ps2pk' or whatever to make PK files for
+# PostScript fonts. If this is defined, PSMAPFILE must also be defined to
+# be your psfonts.map file or some equivalent.
+: ${ps_to_pk=gsftopk}
+: ${PSMAPFILE=@psheaderdir@/psfonts.map}
+
+# Location of the files that map font name parts to directory names.
+: ${NAMEMAPDIR=@fontnamedir@}
+
+# This is needed only if all the font directories were not included in
+# the compile-time path for gsftopk.
+: ${DVIPSHEADERS=@datadir@/ghostscript/type1:}
+
+# If this directory doesn't exist, the DC fonts won't be attempted.
+: ${dcfontdir=@dcfontdir@}
+
+# If this directory doesn't exist, the Sauter stuff won't be attempted.
+: ${sauterdir=@sauterdir@}
+
+# If the true typeface directory cannot be determined from the fontname,
+# the files are installed here, relative to $DESTROOT.
+: ${default_namepart=tmp/pk}
+
+# TEMPDIR needs to be unique for each process because of the possibility
+# of processes simultaneously running this script.
+TEMPDIR=${TMPDIR-/tmp}/mtpk.$$
+
+if test $# -lt 4; then
+ echo "Usage: $0 name dpi bdpi mag [mode [destdir]]." >&2
+ exit 1
+fi
+
+mkdirchain() {
+for file in ${1+"$@"} ; do
+ oIFS="${IFS}"; IFS='/'; set - ${file}; IFS="${oIFS}"
+ test ".${1}" = "." && shift
+
+ pathcomp=''
+
+ while test $# -ne 0 ; do
+ pathcomp="${pathcomp}/${1}"
+ shift
+
+ if test ! -d "${pathcomp}"; then
+ mkdir "${pathcomp}" || exit 1
+ fi
+ done
+done
+}
+
+NAME=$1
+DPI=$2
+BDPI=$3
+MAG=$4
+MODE=$5
+
+# DESTDIR is harder.
+case "$6" in
+ "")
+ # Nothing specified, so try to intuit the directory from the
+ # fontname. First the special cases: either $NAME matches an entire
+ # name in special.map, or it matches the abbreviation in
+ # special.map and ends with a numeral (for the pointsize).
+ # We (painfully) use only the minimal features in original awk.
+ if test -r $NAMEMAPDIR/special.map; then
+ namepart=`awk \
+'{if ($1 == NAME || (substr (NAME, 1, length ($1)) == $1 \
+ && substr (NAME, length (NAME), 1) ~ /[0-9]/)) \
+ { print $2 "/" $3; exit; }}' NAME=$NAME $NAMEMAPDIR/special.map`
+
+ if test -z "$namepart"; then
+ # Try the normal case. Source first.
+ s_abbrev=`echo $NAME | cut -c 1-1`
+ sourcedir=`awk '{ if ($1 == s_abbrev) { print $2; exit; }}' \
+ s_abbrev=$s_abbrev $NAMEMAPDIR/source.map`
+
+ if test -n "$sourcedir"; then
+ # We found the source. Try for the typeface.
+ t_abbrev=`echo $NAME | cut -c 2-3`
+ typefacedir=`awk '{ if ($1 == t_abbrev) { print $2; exit; }}' \
+ t_abbrev=$t_abbrev $NAMEMAPDIR/typeface.map`
+
+ if test -n "$typefacedir"; then
+ # Found everything.
+ namepart=$sourcedir/$typefacedir
+
+ else
+ echo "$0: Could not map typeface abbreviation $t_abbrev." >&2
+ fi
+ else
+ echo "$0: Could not map source abbreviation $s_abbrev." >&2
+ fi
+ fi
+ else
+ # No map files.
+ :
+ fi
+ if test -z "$namepart"; then
+ # If we failed for whatever reason, default to a generic subdir.
+ namepart=$default_namepart
+ else
+ # Otherwise, get the `pk' in before we append the mode.
+ namepart=$namepart/pk
+ fi
+
+ # Finally, update the parent of the installation directory.
+ DESTROOT="$DESTROOT/$namepart"
+ ;;
+ /*) DESTDIR=$6;; # Absolute, explicit destdir => use it.
+ *) DESTDIR=$DESTROOT/$6;; # Relative destdir => append to the default.
+esac
+
+GFNAME=$NAME.$DPI'gf'
+PKOUTNAME=$NAME.$DPI'pk'
+if test "$TDSFONTS" = yes
+then
+ FROM=`kpsewhich $NAME.tfm | sed "s,.*/tfm/\(.*\)/$NAME.tfm,/\1,"`
+ DPIDIR=/dpi$DPI
+ PKNAME=$NAME.pk
+else
+ PKNAME=$PKOUTNAME
+fi
+
+# Clean up on normal or abnormal exit. DESTDIR changes, hence the eval.
+trap "cd /; eval rm -rf $TEMPDIR \$DESTDIR\$FROM\$DPIDIR/pktmp.$$" 0 1 2 15
+
+# Allow fonts to be read and written (especially in case we make
+# directories) by everyone.
+umask 0
+
+# Possible local customizations?
+test -r @web2cdir@/MakeTeXPK.site && . @web2cdir@/MakeTeXPK.site
+
+# Remember where we were for the paths. We'd most like to replace `.',
+# wherever it is in the path, with $SAVEPWD, but we don't have access to the
+# compile-time path. So we are conservative, and put this at the end.
+SAVEPWD=`pwd`
+
+# Go to the unique working directory.
+test -d $TEMPDIR || mkdir $TEMPDIR
+cd $TEMPDIR || exit 1
+
+# grep for the font in $PSMAPFILE, if some ps-to-pk is claimed to be supported.
+# We have to figure out the name of the base font -- $NAME is probably
+# something like pplr, but it's rpplr or pplr0 or pplr8r that's in psfonts.map.
+pattern="^r?$NAME"'(0|8r)?([ ]|$)'
+test -n "$ps_to_pk" && egrep "$pattern" $PSMAPFILE >psline
+if test -s psline; then
+ # This is a PostScript font.
+ MODE=$ps_to_pk
+ case $ps_to_pk in
+ ps2pk*) special_part=`cat psline | sed -e 's/^.*"//' -e 's/".*$//'`
+ # .167 SlantFont
+ slant=`echo $special_part \
+ | awk '{ if ($2 == SlantFont) print "-S" $1 }'`
+ extend=`echo $special_part \
+ | awk '{ if ($2 == ExtendFont) print "-E" $1 }'`
+ cmd="$ps_to_pk -v -X$DPI $slant $extend $NAME";;
+ *) cmd="$ps_to_pk $NAME $DPI";;
+ esac
+
+ # Update DESTDIR for new mode, and check if we were spuriously called.
+ test -z "$6" && DESTDIR="$DESTROOT/$MODE"
+ if test -r $DESTDIR$FROM$DPIDIR/$PKNAME; then # sigh, this is repeated below
+ echo "$0: $DESTDIR$FROM$DPIDIR/$PKNAME already exists." >&2
+ echo $DESTDIR$FROM$DPIDIR/$PKNAME
+ exit 0
+ fi
+
+ DVIPSHEADERS="$DVIPSHEADERS:$SAVEPWD"
+ export DVIPSHEADERS
+ echo "$0: Running $cmd" >&2
+ $cmd >&2 || { echo "$0: $ps_to_pk failed." >&2; exit 1; }
+
+else
+ # Try Metafont.
+ MFINPUTS="$MFINPUTS:$SAVEPWD"
+ export MFINPUTS
+
+ # If an explicit mode is not supplied, try to guess. You can get a
+ # list of extant modes from ftp.cs.umb.edu:pub/tex/modes.mf.
+ if test -z "$MODE" || test "$MODE" = default; then
+ case "$BDPI" in
+ 85) MODE=sun;;
+ 300) MODE=cx;;
+ 600) MODE=ljfour;;
+ 1270) MODE=linolo;;
+ *) echo "$0: Can't guess mode for $BDPI dpi devices." >&2
+ echo "$0: Use a config file, or update me." >&2
+ exit 1
+ esac
+ fi
+
+ # If no destination directory specified, install font in directory
+ # named for the mode.
+ test -z "$6" && DESTDIR="$DESTROOT/$MODE"
+
+ if test -r $DESTDIR$FROM$DPIDIR/$PKNAME; then # sigh, this is repeated above
+ echo "$0: $DESTDIR$FROM$DPIDIR/$PKNAME already exists." >&2
+ echo $DESTDIR$FROM$DPIDIR/$PKNAME
+ exit 0
+ fi
+
+ # Run Metafont. Always use plain Metafont, since reading cmbase.mf
+ # does not noticeably slow things down. Separate the filename from the
+ # rest, since we have to use ./$NAME if we generate something.
+ cmd="mf \mode:=$MODE; mag:=$MAG; scrollmode; input"
+ echo "$0: Running $cmd $NAME" >&2
+ if $cmd $NAME </dev/null >&2; then
+ : # Success already.
+
+ else
+ # These other cases should really be part of MakeTeXMF.
+ # First have to figure out the real magnification, which means
+ # extracting the point size from the name -- a trailing number.
+ rootname=`echo $NAME | sed 's/[0-9]*$//'`
+ pointsize=`echo $NAME | sed "s/^$rootname//"`
+ case "$pointsize" in
+ 11) realsize=10.95444;; # \magstephalf
+ 14) realsize=14.4;; # \magstep2
+ 17) realsize=17.28;; # \magstep3
+ 20) realsize=20.74;; # \magstep4
+ 25) realsize=24.88;; # \magstep5
+ *) realsize=$pointsize;;
+ esac
+ mfname=$NAME.mf
+ rm -f $mfname # We are in $TEMPDIR, so this is safe.
+
+ if test -z "$pointsize"; then
+ # No point size, so it can't be a DC or Sauter font. Give up.
+ :
+
+ elif echo $NAME | grep '^dc' >/dev/null; then
+ echo "$0: Trying DC font." >&2
+ echo "if unknown dxbase: input dxbase fi;" >$mfname
+ echo "gensize:=$realsize;" >>$mfname
+ echo "generate $rootname." >>$mfname
+ echo "$0: Running $cmd ./$NAME" >&2
+ $cmd ./$mfname </dev/null >&2
+
+ elif test -d $sauterdir; then
+ echo "$0: Trying interpolated/extrapolated (Sauter) font." >&2
+ echo "design_size:=$realsize;" >>$mfname
+ echo "input b-$rootname;" >>$mfname
+ echo "$0: Running $cmd ./$NAME" >&2
+ $cmd ./$mfname </dev/null >&2
+ # Result should go in the sauterdir, not the cm dir.
+ test -z "$6" && $DESTDIR=$sauterdir/pk/$MODE
+ fi # alternative mf sources
+ fi # first mf failed
+
+ # If we couldn't make the font, quit.
+ test -r $GFNAME || \
+ { echo "$0: Metafont failed to make $GFNAME." >&2; exit 1; }
+
+ # Success. Make the PK file.
+ gftopk ./$GFNAME $PKOUTNAME || exit 1
+fi
+
+# If we get here, we've succeeded; move the final font to $DESTDIR.
+test -d $DESTDIR$FROM$DPIDIR \
+ || mkdirchain $DESTDIR$FROM$DPIDIR \
+ || { echo "$0: Could not mkdir $DESTDIR$FROM$DPIDIR." >&2; exit 1; }
+
+# Install the PK file carefully, since others may be working simultaneously.
+mv $PKOUTNAME $DESTDIR$FROM$DPIDIR/pktmp.$$ \
+ || { echo "$0: Could not mv $PKOUTNAME $DESTDIR$FROM$DPIDIR/pktmp.$$." >&2; exit 1; }
+
+cd $DESTDIR$FROM$DPIDIR || exit 1
+mv pktmp.$$ $PKNAME
+
+PKFILE=$DESTDIR$FROM$DPIDIR/$PKNAME
+eval $MOVEFONT
+
+# If this line (or an equivalent) is not present, dvipsk/xdvik/dviljk
+# will think MakeTeXPK failed. Any other output to stdout will also lose.
+echo $PKFILE
+
diff --git a/fonts/utilities/mkpkfontdir/misc/README b/fonts/utilities/mkpkfontdir/misc/README
new file mode 100644
index 0000000000..92179f2b4d
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/misc/README
@@ -0,0 +1,12 @@
+This directory contains:
+
+ - A startup texmf.cnf.in for kpathsea (based on 2.6's), supporting
+ two font hierarchies.
+
+ - A sample MakeTeXPK.in replacement for web2c's one that uses
+ mkpkfontdir to move generated fonts, or can also generate fonts in
+ the right TDS locations (I least I hope it is correct for all kind
+ of fonts; tested only wit mf and gsftopk output).
+
+Yves Arrouye <Yves.Arrouye@imag.fr>, 1995
+
diff --git a/fonts/utilities/mkpkfontdir/misc/texmf.cnf.in b/fonts/utilities/mkpkfontdir/misc/texmf.cnf.in
new file mode 100644
index 0000000000..57768eaab0
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/misc/texmf.cnf.in
@@ -0,0 +1,124 @@
+% original texmf.cnf -- runtime path configuration file for kpathsea.
+%
+% (If you change or delete `original' on the previous line, the
+% distribution won't install its version over yours.)
+%
+% [Modified by Yves Arrouye to partially support two hierarchies.]
+%
+% What follows is a super-summary of what this .cnf file can
+% contain. Please read the Kpathsea manual for more information.
+%
+% texmf.cnf is generated from texmf.cnf.in, by replacing @var@ with the
+% value of the Make variable `var', via a sed file texmf.sed, generated
+% (once) by kpathsea/Makefile (itself generated from
+% kpathsea/Makefile.in by configure).
+%
+% Any identifier (sticking to A-Za-z_ for names is safest) can be assigned.
+% The `=' (and surrounding spaces) is optional.
+% No space, %, or @ in variable values, for the sake of autogeneration.
+% An environment variable foo overrides a definition of foo here.
+% $foo (or ${foo}) in a value expands to the envvar or cnf value of foo.
+%
+% All definitions are read before anything is expanded, so you can use
+% variables before they are defined.
+%
+% If a variable is qualified with `.<program>', it is ignored unless the
+% current executable (last component of argv[0]) is named <program>.
+%
+% Which file formats use which paths for searches is described in the
+% various programs' and the kpathsea documentation.
+%
+% // means to search subdirectories (recursively).
+% A leading !! means to look only in the ls-R db, never on the disk.
+% A leading/trailing/doubled : in the paths will be expanded into the
+% compile-time default. Probably not what you want.
+
+
+% Where the wild files are. You can set an environment variable to
+% override this if you're testing a new TeX tree, without changing
+% anything else.
+TEXMF = @texmf@
+% The VARTEXMF variable points to a texmf structure that can be modified,
+% while the TEXMF tree may not be writable. Note that this is just for the
+% example here: ls-R is still searched for in $TEXMF (it should be $VARTEXMF
+% in our case), TEXMFCNF is still $TEXMF/something, and only fonts are looked
+% for under $VARTEXMF. This whole file should be modified to take in
+% account the fact that there are two directories trees.
+VARTEXMF = /usr/local/texmf
+
+% TeX input files -- i.e., anything to be found by \input or \openin,
+% including .sty, .eps, etc. Things are confused by the many variants
+% of LaTeX, which all have the same filenames. The current
+% recommendation is to make `latex' be latex2e, and if you also want to
+% support latex 2.09, call it latex209. If you do the reverse, the
+% definitions below will need adjusting.
+%
+latex209_inputs = .:@texinputdir@/latex209//:@texinputdir@//
+latex2e_inputs = .:@texinputdir@/latex2e//:@texinputdir@//
+TEXINPUTS.latex209 = $latex209_inputs
+TEXINPUTS.latex2e = $latex2e_inputs
+TEXINPUTS.latex = $latex2e_inputs
+% Earlier entries override later ones, so put this last.
+TEXINPUTS = .:@texinputdir@//
+
+% Ditto for MF.
+MFINPUTS = .:@mfinputdir@//:@fontdir@/source//
+
+% Predigested formats and string pools for initex/inimf.
+TEXFORMATS = .:@fmtdir@
+MFBASES = .:@basedir@
+TEXPOOL = @texpooldir@
+MFPOOL = @mfpooldir@
+
+% Device-independent font metric files.
+VFFONTS = .:@fontdir@/vf//
+TFMFONTS = .:@fontdir@/tfm//
+
+% Just an abbreviation.
+pkdir = @fontdir@/pk
+% We suppose fonts are generated in directories that may be outside of $TEXMF,
+% hence the use of $VARTEXMF here ($TEXMF may not be writable while $VARTEXMF
+% is, so one can use a TDS CD-ROM in $TEXMF and local stuff in $VARTEXMF).
+% The $wrpkdir is where fonts are written by MakeTeXPK.
+wrpkdir = $VARTEXMF/fonts/tmp/pk
+% The $alpkdir is a pool of fonts that can searched quickly (for instance it
+% may be a pool of symbolic links to fonts in a TDS tree).
+alpkdir = $VARTEXMF/fonts/pool/pk/$MAKETEX_MODE
+
+% The $MAKETEX_MODE below means the drivers will not use a cx font when
+% the mode is ricoh. If no mode is explicitly specified, kpse_prog_init
+% sets MAKETEX_MODE to /, so all subdirectories are searched. See the manual.
+
+% xdvi needs to find bitmaps for PostScript fonts, which can be
+% generated by standalone programs gsftopk and ps2pk (ps2mf needs no
+% special treatment). See xdvik/INSTALL for more info.
+PKFONTS.xdvi = .:$alpkdir:$pkdir/$MAKETEX_MODE//:$wrpkdir/$MAKETEX_MODE//:$wrpkdir/gsftopk//:$wrpkdir/ps2pk//
+% Again, the standard definition must come after the program-specific one.
+% Don't use $pkdir since we can't do general variable expansion making paths.h.
+PKFONTS = .:/usr/local/texmf/fonts/pool/pk/$MAKETEX_MODE:$TEXMF/fonts/pk/$MAKETEX_MODE//:/usr/local/texmf/fonts/tmp/pk/$MAKETEX_MODE//
+
+% Similarly for the GF format, which only remains in existence because
+% Metafont outputs it (and MF isn't going to change).
+GFFONTS = .:@fontdir@//gf/$MAKETEX_MODE
+
+% Used to find texfonts.map; also a backup for PKFONTS and GFFONTS,
+% but normally that is irrelevant, so don't bother with all subdirectories.
+GLYPHFONTS = .:@fontdir@
+
+% BibTeX bibliographies and style files.
+BIBINPUTS = .:@texmf@/bibtex/bib
+BSTINPUTS = .:@texmf@/bibtex/bst
+
+% Dvips' config.* files.
+TEXCONFIG = .:~:@psheaderdir@//
+
+% Dvips' PostScript prologues (.pro) and .pfa/.pfb files.
+DVIPSHEADERS = .:@psheaderdir@//:@fontdir@//type1
+
+% Enable this (or set the environment variable) if you want kpathsea to
+% log names and times for all files found.
+% TEXMFLOG = @texmf@/web2c/kpathsea.log
+
+% This definition isn't used from this .cnf file itself (that would be
+% paradoxical), but the compile-time default in paths.h is built from it.
+TEXMFCNF = .:@web2cdir@
diff --git a/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir b/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir
new file mode 100644
index 0000000000..62dcced52a
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir
@@ -0,0 +1,730 @@
+#!@@PERL@@
+
+# mkpkfontdir: a simple tool for manipulation of TeX pk fonts directories.
+#
+# This utility can create various kind of pk fonts directories
+# structures: fully TDS-conformant, organized by supplier and type or
+# just by supplier, or not organized at all, as one wants...
+# The only assumption made by this program is that every pk file has
+# a corresponding tfm file somewhere, and that the tfm files are correctly
+# installed (i.e. if they are Not installed in a TDS-conformant structure,
+# you will not be able to obtain a TDS-conformant pk tree).
+#
+# To get usage, just 'mkpkfontdir --help'.
+#
+# Copyright (C) 1995, Yves Arrouye <Yves.Arrouye@imag.fr>
+#
+# (By the way, I don't write Perl usually, so please don't flame me
+# for bad use of it.)
+
+# Customize what follows if needed (or do it in the Makefile, it's better)
+
+# Known MetaFont modes that are not in modes.mf
+
+$knownmodes{'gsftopk'} = 'gsftopk';
+$knownmodes{'ps2pk'} = 'ps2pk';
+
+$TEXMF = $ENV{"TEXMF"};
+$TEXMF || ($TEXMF = '@@TEXMF@@');
+
+$VARTEXMF = $ENV{"VARTEXMF"};
+$VARTEXMF || ($VARTEXMF = $TEXMF);
+
+$dft_fontdir = "@@FONTDIR@@";
+$dft_destdir = "@@DESTDIR@@";
+
+$dpi_regexp = "s/^/dpi/"; # How to generate the dpi directory name.
+
+$loc_tfmdir = "@@LOC_TFMDIR@@"; # Location of tfm files under $opt_fontdir
+$loc_tfmdirname = &basename($loc_tfmdir);
+
+$loc_pkdir = "@@LOC_PKDIR@@"; # Location of pk directory under
+ # $opt_fontdir. We assume that this
+ # directory will contain only
+ # directories corresponding to modes.
+
+$loc_unknowndir = "@@LOC_UNKNOWNDIR@@";
+$loc_unknownmode = "@@LOC_UNKNOWNMODE@@";
+
+$loc_modesmf = "@@LOC_MODESMF@@"; # Where is modes.mf
+
+$use_kpsewhich = "@@USE_KPSEWHICH@@";
+
+$tds_default = @@TDS_DEFAULT@@;
+$tds_always = @@USE_TDSNAMES@@;
+
+$test_longnames = @@TEST_LONGNAMES@@;
+
+# Do not touch what is here!
+
+# normalname(filename)
+#
+# Return the name of a file without double slashs
+
+sub normalname {
+ local($file) = @_;
+
+ $file =~ s,/+,/,g;
+
+ return $file;
+}
+
+# basename(filename)
+# basename(filename, extregexp)
+#
+# Return the base name of a file.
+
+sub basename {
+ local($fullname, $ext) = @_;
+ local($basename) = $fullname;
+
+ $basename =~ s,(.*/)?([^/]+),$2,;
+ $ext && $basename =~ s,$ext$,,;
+
+ $basename;
+}
+
+# dirname(filename)
+#
+# Return the directory part of a file, with no trailing slash.
+#
+
+sub dirname {
+ local($fullname) = @_;
+
+ if (!($fullname =~ s,/[^/]+/*$,,)) {
+ $fullname = '.' unless $fullname eq '/';
+ }
+
+ return $fullname;
+}
+
+# mkdirs(path, mode)
+#
+# Makes all directories necessary to create path. Returns '' if
+# successful, the partial path otherwise (the last directory being
+# the one that produced the error).
+#
+# mkdirs2(path, mode)
+#
+# Makes all directories necessary to create path. Returns a list of
+# directories created.
+
+sub mkdirs {
+ local($path, $mode) = @_;
+ local($builded) = ($path =~ s/^\/// ? '' : '.');
+
+ foreach $dir (split('/', $path)) {
+ # There's a problem with mkdir returning 0 when there is no error on
+ # Linux, so we'll create and test.
+
+ mkdir("$builded/$dir", $mode);
+ if (! -d "$builded/$dir") {
+ return "$builded/$dir";
+ }
+ $builded .= "/$dir";
+ }
+
+ return '';
+}
+
+sub mkdirs2 {
+ local($path, $mode) = @_;
+ local($builded) = ($path =~ s/^\/// ? '' : '.');
+
+ local(@allpaths);
+
+ foreach $dir (split('/', $path)) {
+ # There's a problem with mkdir returning 0 when there is no error on
+ # Linux, so we'll create and test.
+
+ $builded .= "/$dir";
+
+ if (! -d "$builded") {
+ mkdir("$builded", $mode);
+ if (! -d "$builded") {
+ last;
+ }
+ $allpaths[$#allpaths + 1] = $builded;
+ }
+ }
+
+ return @allpaths;
+}
+
+# rmdirs(path)
+#
+# Recursively delete empty directories.
+
+sub rmdirs {
+ local($path) = @_;
+
+ while (rmdir($path)) {
+ $path = &dirname($path);
+ }
+}
+
+# mfmode(mode, modesmf)
+#
+# Return mode iff mode is present in modesmf, '' otherwise.
+
+sub mfmode {
+ local($mode, $modesmf) = @_;
+
+ if (! -r $modesmf) {
+ return '';
+ }
+
+ if (open(MODESMF, "<$modesmf")) {
+ while (<MODESMF>) {
+ if (/^$mode\s+:=/ || /^mode_def\s+$mode\s/) {
+ return $mode;
+ }
+ }
+ }
+
+ return '';
+}
+
+# tfmpath(fontname)
+#
+# Return the full path of the .tfm file for a given file (assuming it is a
+# font file, of course).
+# Quick hack: if $use_kpathsea is null, use a find, but the $tfmdir var
+# must be set!
+
+sub tfmpath {
+ local($name) = @_;
+ local($cmd, $path);
+
+ $name = &basename($name, '\.[^.]*');
+
+ if ($use_kpsewhich) {
+ $cmd = "kpsewhich $name.tfm";
+ } else {
+ if ($tfmdir eq '') {
+ $tfmdir = "$opt_fontdir/$loc_tfmdir";
+ }
+
+ # We could use locate first here, but on some systems it's find and
+ # the syntax varies, so I don't want to: please use kpsewhich!
+
+ $cmd = "2>/dev/null find $tfmdir -name $name.tfm -print";
+ }
+
+ $path=`$cmd`;
+ chop($path);
+
+ if ($path eq '') {
+ $path = $loc_unknowndir;
+ }
+
+ return $path;
+}
+
+# fontdirpath(filename)
+#
+# Return the path where a font should be installed. For example, on
+# my system the cmr10.tfm file is (logically) installed in public/cm
+# under $TEXMF/fonts/tfm, thus its fontpath is public/cm.
+
+sub fontdirpath {
+ local($name) = @_;
+ local($path) = &tfmpath($name);
+
+ $path =~ s,^(.*/)?$loc_tfmdirname/,,;
+ $path =~ s,/[^/]*$,,;
+
+ $path;
+}
+
+# pkfontnameparts(fontname)
+#
+# Return the components (base name and dpi) of a fontname:
+#
+# /some/path/font.300pk -> (font, 300)
+# /some/path/dpi329/font.pk -> (font, 329)
+
+sub pkfontnameparts {
+ local($fontname) = @_;
+ local($basename);
+ local($dpi);
+
+ if ($fontname =~ /dpi(\d+)\/([^\/]*)\.pk$/) {
+ $basename = $2;
+ $dpi = $1;
+ } else {
+ $basename = &basename($fontname);
+ ($dpi = $basename) =~ s,.*\.(\d+)pk,$1,;
+ $basename =~ s,\.${dpi}pk,,;
+ }
+
+ return ($basename, $dpi);
+}
+
+# strippath(path, level)
+#
+# Strip a path by removing a certain number of levels in it,
+# starting from the end:
+#
+# public/cm/cmbsy10.tfm, 1 -> public/cmbsy10.tfm
+# public/cm/cmbsy10.tfm, 2 -> cmbsy10.tfm
+#
+# restrictpath(path, level)
+#
+# Restrict path to level components.
+#
+# prunepath(path, level)
+#
+# Calls restrictpath if level is positive, strippath otherwise (after
+# making level positive). Note that level is decremented if positive,
+# so that prunepath($path, 1) means restrict to 0 components.
+
+sub strippath {
+ local($path, $level) = @_;
+
+ while ($level-- > 0 && $path =~ /\//) {
+ $path =~ s,[^/]*/([^/]*)$,$1,;
+ }
+
+ $path;
+}
+
+sub restrictpath {
+ local($path, $level) = @_;
+ local($pathcopy) = $path;
+
+ if ($pathcopy !~ m,^/,) {
+ $pathcopy = "/$pathcopy";
+ }
+ $pathcopy =~ s,/+,/,g;
+ $pathcopy =~ s,[^/],,g;
+
+ $level = length($pathcopy) - $level - 1;
+
+ while ($level-- > 0) {
+ $path =~ s,(.*/)?[^/]+/([^/]*),$1$2,;
+ }
+
+ return $path;
+}
+
+sub prunepath {
+ local($path, $level) = @_;
+
+ if ($level > 0) {
+ return &restrictpath($path, $level - 1);
+ } else {
+ return &strippath($path, -$level);
+ }
+}
+
+# pkfontpath(fontname, tds, level)
+#
+# Return where to install a font in a font tree.
+# The tds argument indicate whether we should generate a
+# TDS-conforming subdirectory level dpi$pkdpi.
+# The level argument is passed to prunepath.
+
+sub pkfontpath {
+ local($fontname, $tds, $level) = @_;
+ local($fontdirpath) = &prunepath(&fontdirpath($fontname) . "/", $level);
+ local($basename, $dpi) = &pkfontnameparts($fontname);
+ local($fontpath);
+
+ if ($tds) {
+ $dpi =~ $dpi_regexp;
+ $fontpath = "$fontdirpath" . "dpi$dpi/$basename.pk";
+ } else {
+ $fontpath = "$fontdirpath$basename.${dpi}pk";
+ }
+
+ return $fontpath;
+}
+
+#
+
+sub mkpkfontdir {
+ local($dir, $dftmode, $fontdir, $destdir, $replace, $link, $tds, $level,
+ $pktype, $usemodesmf, $guess, $writepaths, $verbose, $simulate) = @_;
+
+ local($pk) = &basename($loc_pkdir);
+
+ local($nwarns) = 0;
+
+ # Accept files too, because find is okay with that and we can use the
+ # tool in MakeTeXPK.
+
+ $tfmdir = "$fontdir/$loc_tfmdir";
+
+ $destdir = "$destdir/$loc_pkdir";
+
+ # Check for the kind of links we can make
+
+ if ($link eq 'symlink') {
+ if (eval 'symlink("","");', $@ ne '') {
+ $link = 'link';
+ }
+ }
+
+ local($move) = $link ? ($link eq 'link' ? "+>" : "->") : "=>";
+
+ # Now move or link each file
+
+ $dir = &normalname($dir);
+
+ foreach $file (`2>/dev/null find $dir -type f -print`) {
+ local($mode, $mfmode);
+ local($guessing) = 0;
+
+ chop($file);
+
+ if (!($file =~ /pk$/)) {
+ next;
+ }
+
+ if ($verbose) {
+ print "$file\n";
+ }
+
+ $mode = $dftmode;
+
+ # Get the mode from pktype is asked to
+
+ if ($pktype) {
+ $mfmode = `2>/dev/null pktype $file | grep "'mode=.*'"`;
+ chop($mfmode);
+ if ($mfmode =~ s/.*'mode=(.*).*'/$1/) {
+ $mode = $mfmode;
+ } else {
+ print STDERR &basename($0),
+ ": pktype does not know mode for $file",
+ ($guess ? ", guessing " : "");
+ $guessing = 1 unless !$guess;
+ }
+ }
+
+ # If no mode is specified, try to get it from the file path.
+ # Note that if the mode was affected on the command-line, there
+ # is no guess.
+
+ if ($mode eq '' && $guess) {
+ $mode = $file;
+ if (!($mode =~ s,(.*/)?$pk/([^/]+)/.*,$2,)) {
+ $mode = '';
+ }
+ }
+
+ $mfmode = $mode;
+
+ if ($mode && $usemodesmf && !$knownmodes{$mode}) {
+ $mode = &mfmode($mfmode, $loc_modesmf);
+ }
+
+ if ($guessing) {
+ print STDERR ($mode ? $mode : $loc_unknownmode), "\n";
+ }
+
+ if ($mode eq '') {
+ if ($guessing) {
+ print STDERR "\n";
+ }
+ print STDERR &basename($0),
+ ": unknown mode \"$mfmode\" for $file, using $loc_unknownmode\n";
+ $mfmode = $loc_unknownmode;
+ }
+
+ local($dest) = "$destdir/$mfmode/" . &pkfontpath($file, $tds, $level);
+
+ $dest = &normalname($dest);
+
+ if ($dest ne $file) {
+ local($built);
+
+ if ($verbose) {
+ print " $move $dest\n";
+ }
+
+ if (-f $dest) {
+ if (!$replace) {
+ print STDERR &basename($0),
+ ": will not overwrite $dest with $file\n";
+ ++$nwarns;
+ print "$file\n" if $writepaths;
+ next;
+ } else {
+ unlink($dest);
+ }
+ }
+
+ if ($dest =~ m,$destdir/$mfmode/$loc_unknowndir/,) {
+ print STDERR &basename($0),
+ ": $file has unknown font path (obtained $dest)\n";
+ }
+
+ if ($simulate) {
+ print "$dest\n" if $writepaths;
+ next;
+ }
+
+ if ($built = &mkdirs(&dirname($dest), 0777)) {
+ print STDERR &basename($0),
+ ": cannot create $built: $!\n";
+ ++$nwarns;
+ next;
+ }
+
+ if ($link) {
+ if (!(eval "$link(\"$file\", \"$dest\")")) {
+ print STDERR &basename($0),
+ ": cannot $link $file to $dest\n";
+ print "$file\n" if $writepaths;
+ ++$nwarns;
+ next;
+ }
+ } else {
+ if (system("cp $file $dest") == 0) {
+ unlink($file);
+ &rmdirs(&dirname($file));
+ } else {
+ print STDERR &basename($0),
+ ": cannot copy $file to $dest\n";
+ print "$file\n" if $writepaths;
+ ++$nwarns;
+ next;
+ }
+ }
+
+ } elsif ($verbose) {
+ print " == $dest\n";
+ }
+
+ print "$dest\n" if $writepaths;
+ }
+
+ return $nwarns;
+}
+
+# Now for the program
+
+@@USE_GETOPTS@@;
+
+# We do not use File'Basename because we supply the routines we want.
+
+sub usage {
+ local($code) = @_;
+ local($me) = &basename($0);
+
+ if ($code) {
+ select STDERR;
+ }
+
+ print "usage: $me";
+ print " [ --version ]";
+ print " [ -h, --help ]";
+ print " [ -v, --verbose ]";
+ print " [ -w, --write-paths ]";
+ print " [ -n, --noaction ]";
+ print " [ -m, --mode modespec ]";
+ print " [ -M, --use-modesmf [ f ] ]";
+ print " [ -P, --use-pktype ]";
+ print " [ -g, --guess-mode ]";
+ print " [ -f, --fontdir fontdir ]";
+ print " [ -d, --destdir destdir ]";
+ print " [ -o, --overwrite ]";
+ print " [ -l, --link | -s, --symbolic-link ]";
+ print " [ -t, --tds-names | -L, --long-names ]";
+ print " [ -p, --prune n | -P, -r, --restrict n ]";
+ print " directory-or-pkfile ...\n";
+
+ if (!$code) { # Give description
+ print <<DESCRIPTION_END;
+
+options: --version\t\tprint version information
+ -h, --help\t\tprint this help message
+ -v, --verbose\t\tprint actions as they are realized
+ -w, --write-names\t\tprint full paths of files moved
+ -n, --noaction\t\tdo not really act (but print if verbose)
+ -m, --mode modespec\tset mode to mode (see man)
+ -M, --use-modesmf f\tforce use of modes.mf, eventually naming it
+ -T, --use-pktype\tuse pktype to get the mode
+ -g, --guess-mode\tguess the mode (default except if -T)
+ -f, --fontdir fontdir\tspecify where the fonts are installed; tfm
+ \tand pk files are expected to be under this
+ \tdirectory (see man)
+ -d, --destdir destdir\tspecify the destination directory (defaults
+ \tto fontdir); pk files will be moved there (see
+ \tman)
+ -o, --overwrite\toverwrite existing files
+ -l, --link\t\tdo not move files, but create hard links
+ -s, --symbolic-link\tdo not move files, but create symbolic links
+ \tinstead (or hard ones if symbolic ones are
+ \tunavailable)
+ -t, --tds-names\tname files as specified by the TDS, i.e. put
+ \tthemin directories organized by resolution
+ -L, --long-names\tuse long file names instead of TDS-like ones
+ -p, --prune levels\tsuppress n directories components at the end
+ \tof the fonts paths
+ -P, -r, --restrict n\trestrict the number of components in fonts
+ \tpaths to n - 1
+DESCRIPTION_END
+ }
+
+ exit($code);
+}
+
+if (!&GetOptions("version", "help|h", "verbose|v", "fontdir|f=s",
+ "destdir|d=s", "link|l", "symbolic-link|s", "tds-names|t", "prune|p=i",
+ "restrict|r|P=i", "mode|m=s", "noaction|n", "overwrite|o",
+ "use-modesmf|M:s", "use-pktype|T", "guess-mode|g", "long-names|L",
+ "write-paths|w")) {
+ &usage(1);
+}
+
+if (($opt_link && $opt_symlink) || ($opt_prune && $opt_restrict) ||
+ ($opt_tds_names && $opt_long_names)) {
+ &usage(1);
+}
+
+if ($opt_version) {
+ print &basename($0),
+ " version 1.1, by Yves Arrouye <Yves.Arrouye\@imag.fr>\n";
+}
+
+if ($opt_help) {
+ &usage(0);
+}
+
+if ($opt_long_names) {
+ if ($tds_always) {
+ print STDERR &basename($0), ": only TDS names are allowed, do not use -L or --long-names\n";
+ exit 2;
+ }
+
+ if ($test_longnames) {
+ local($temp) = $ENV{"TMPDIR"} || $ENV{"TEMP"} || "/tmp";
+ local($ok) = 0;
+ local($oklong) = 0;
+
+ local(@builded) = mkdirs2($temp, 0777);
+
+ if ($ok = -d $temp) {
+ local($dummy) = "$temp/font.300pk";
+
+ if ($ok = open(DUMMY, ">$dummy")) {
+ close(DUMMY);
+ $oklong = -f $dummy;
+ unlink($dummy);
+ }
+ }
+
+ if ($ok == 0) {
+ print STDERR &basename($0), ": unable to test for long names; please contact your sysadmin\n";
+ for ($i = $#builded; $i >= 0; --$i) {
+ rmdir($builded[$i]);
+ }
+ exit(3);
+ }
+
+ for ($i = $#builded; $i >= 0; --$i) {
+ rmdir($builded[$i]);
+ }
+
+ if ($oklong == 0) {
+ print STDERR &basename($0), ": only TDS names are supported, do not use -L or --long-names\n";
+ }
+ }
+} else {
+ $opt_tds_names = $tds_default;
+}
+
+if ($opt_link) {
+ $opt_link = ($opt_symbolic ? 'symlink' : 'link');
+}
+
+if ($opt_prune) {
+ $opt_restrict = -$opt_prune;
+}
+
+if (defined($opt_use_modesmf)) {
+ if ($opt_use_modesmf) {
+ $loc_modesmf = $opt_use_modesmf;
+ }
+
+ if (! - e $loc_modesmf) {
+ print STDERR &basename($0), ": modes file $loc_modesmf does not exist\n";
+ exit(5);
+ }
+
+ $opt_use_modesmf = 1;
+}
+
+# Treat the modes specification if any
+
+local($default_mode);
+
+if ($opt_mode) {
+ foreach $modespec (split(',', $opt_mode)) {
+ local($change) = 0;
+ local($mode, $alias);
+
+ if ($modespec =~ /(.*)=(.*)/) {
+ $alias = $1;
+ $mode = $2;
+ } else {
+ $alias = $mode = $modespec;
+ $change = 1;
+ }
+
+ if ($knownmodes{$mode} || grep("^$mode\$", values %knownmodes)
+ || !$opt_use_modesmf || &mfmode($mode, $loc_modesmf)) {
+ $knownmodes{$alias} = $mode;
+
+ if ($change) {
+ $default_mode=$mode;
+ }
+ } else {
+ print STDERR &basename($0), ": unknown mode in specification $modespec, ignored\n";
+ }
+ }
+}
+
+# Arrange font and destination directories
+
+if (!$opt_fontdir) {
+ $opt_fontdir = $dft_fontdir;
+ if (!$opt_destdir) {
+ $opt_destdir = $dft_destdir;
+ }
+} elsif (!$opt_destdir) {
+ $opt_destdir = $opt_fontdir;
+}
+
+# Should we guess?
+
+if (!$opt_use_pktype) {
+ $opt_guess_mode = 1;
+}
+
+# Go for each directory
+
+foreach $dir (@ARGV) {
+ if (-e $dir) {
+ if ($dir !~ m,^/,) {
+ $dir = `cd $dir && pwd`;
+ chop($dir);
+ }
+ } else {
+ print STDERR &basename($0), ": $dir: no such file or directory, ignored\n";
+ next;
+ }
+
+ if (&mkpkfontdir($dir, $default_mode, $opt_fontdir, $opt_destdir,
+ $opt_overwrite, $opt_link, $opt_tds_names, $opt_restrict,
+ $opt_use_pktype, $opt_use_modesmf, $opt_guess_mode,
+ $opt_write_paths, $opt_verbose, $opt_noaction)) {
+ exit(2);
+ }
+
+ exit(0);
+}
diff --git a/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir.1 b/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir.1
new file mode 100644
index 0000000000..c5a23a9449
--- /dev/null
+++ b/fonts/utilities/mkpkfontdir/tmpl/mkpkfontdir.1
@@ -0,0 +1,407 @@
+.TH MKPKFONTDIR 1 "14 August 1995" "TeX Utilities" \" -*- nroff -*-
+.SH NAME
+mkpkfontdir \- reorganize TeX pk fonts directories
+.SH SYNOPSY
+.B mkpkfontdir
+[
+.BI "\-\-version"
+]
+[
+.BI "\-h\fR,\fP \-\-help"
+]
+[
+.BI "\-v\fR,\fP \-\-verbose"
+]
+[
+.BI "\-w\fR,\fP \-\-write-paths"
+]
+[
+.BI "\-n\fR,\fP \-\-noaction"
+]
+[
+.BI "\-m\fR,\fP \-\-mode " modespec
+]
+[
+.B "\-M\fR,\fP \-\-use-modesmf "
+[
+.I f
+]
+]
+[
+.BI "\-T\fR,\fP \-\-use-pktype "
+]
+[
+.BI "\-g\fR,\fP \-\-guess-mode"
+]
+[
+.BI "\-f\fR,\fP \-\-fontdir " fontdir
+]
+[
+.BI "\-d\fR,\fP \-\-destdir " destdir
+]
+[
+.BI "\-o\fR,\fP \-\-overwrite"
+]
+[
+.BI "\-l\fR,\fP \-\-link"
+|
+.BI "\-s\fR,\fP \-\-symbolic-link"
+]
+[
+.BI "\-t\fR,\fP \-\-tds-names"
+]
+[
+.BI "\-L\fR,\fP \-\-long-names"
+]
+[
+.BI "\-p\fR,\fP \-\-prune " n
+|
+.BI "\-P\fR,\fP \-r\fR,\fP \-\-restrict " n
+]
+.IR "directory-or-pkfile " ".\|.\|."
+.SH DESCRIPTION
+.BR mkpkfontdir
+rearranges TeX pk font files in directories, making them conform to a
+particular structure, such as the TeX Directory Structure (TDS) and
+variants of it. It can
+also make links to an existing directory structure that respect
+another kind of structure (this may be useful for example to optimize
+the search time of fonts that are located in a standard TDS on a
+readonly media, by making a pool of links to the files, the pool being
+the first directory searched by the programs needing the fonts).
+.PP
+.BR mkpkfontdir
+associates a
+.I "font path"
+to each font on the system, by looking where its tfm file is
+located. For instance, with the TDS, the metrics file for the American
+Mathematical Society (AMS) Euler font eurm10 is located in
+texmf/fonts/tfm/ams/euler/eurm10.tfm, which yields a font path of
+ams/euler.
+.PP
+Once a given font's font path is known,
+.BR texfondir
+uses it to relocate its pk files in a destination directory.
+The relocated files have a path that is the concatenation of the
+path for pk files in the destination directory, the mode corresponding
+to the font file, the (maybe modified)
+font path and the name of the pk file (henceforth
+.IR "pk name" ")."
+This name is a combination of
+the font name and its resolution: on a Unix system, for example, the
+pk name of the eur10 font at 300 dpi is eur10.300pk; in a TDS hierarchy,
+however, it is dpi300/eur10.pk because names are limited to 8
+characters plus a 3 characters extension.
+.PP
+.BR mkpkfontdir
+uses
+kpsewhich(1)
+to locate tfm files, or a
+find(1)
+under the
+.I fontdir
+directory if the former is not available on your
+system. Once the file has been located, it assumes that the font path
+starts after a component of the file path named
+@@LOC_TFMDIRBASE@@. (If
+kpswewhich(1)
+is not available on your system,
+.B mkpkfontdir
+assumes that your tfm files are located in a @@LOC_TFMDIR@@
+directory under the
+.I fontdir
+directory; this is to accelerate the
+search.)
+
+On this system,
+.BR mkpkfontdir
+has been configured to know that pk files are located
+in a @@LOC_PKDIR@@ directory under the fonts directory (this is
+actually the TDS hierarchy). This means that indvidual pk files will
+be moved to
+.IR destdir "/@@LOC_PKDIR@@."
+unless their tfm file have not been found, in which case they will go
+to
+.IR "/@@LOC_UNKNOWNDIR@@.:
+.PP
+The mode of a font file is determined with the following rules: first,
+get the user-supplied mode if there is one; if there isn't,
+try to get the mode from the font file itself, with
+pktype(1)
+(if the
+.B \-\-use-pktype
+option has been used); if this still does not yields a mode, look the
+file full path and try to guess it (by default or if the
+.B \-\-guess-mode
+option has been used together with the
+.B \-\-use-pktype
+one). Once we have found a mode, and if the
+.B \-\-use-modesmf
+option has been given, this
+mode is validated by looking into the modes.mf modes file. If the mode
+is there, keep it, otherwise try to guess the mode by looking at
+the file path (this is not done by default if pktype was called).
+If we finally do not have a mode, use @@LOC_UNKNOWNMODE@@.
+Note that the mode is only validated once, not each
+time one is found, i.e. if you specify an invalid mode on the
+command-line all files will effectively get @@LOC_UNKNOWNMODE@@ as mode.
+.PP
+Because
+.BR mkpkfontdir
+sort of mirror the hierarchy of the tfm files, it is a convenient
+tool for installing fonts: once the tfm files are correctly installed,
+the pk files can be installed as a pool first, and then be moved
+automatically by
+.B mkpkfontdir
+in order to use the fonts directory structure in force at the
+site.
+.PP
+.BR mkpkfontdir
+creates directories as needed, and does also remove them: after a file
+has been moved, it recursively destroys empties directories on the
+original path (which means that if you transform your pool structure
+in a TDS and then transform it back into a pool, you will not have
+unwanted empty directories; it also means that if you do not want some
+directories to be destroyed, you can put a dummy file whose name does not
+end in pk in them).
+.SH OPTIONS
+Unless told otherwise below, non-boolean
+options may be abbreviated to their first letter.
+In addition, if the POSIXLY_CORRECT environment variable is not set, they may
+be abbreviated to uniqueness.
+.TP
+.BI "\-\-version"
+Print the version of
+.BR mkpkfontdir
+on standard output and exit.
+.TP
+.BI "\-h\fR,\fP \-\-help"
+Print usage and a short explanantion of the different options on
+standard output and exit.
+.TP
+.BI "\-v\fR,\fP \-\-verbose"
+Print informations about what is done on standard output. For each
+font file, a line is printed indicating its path, then another line
+indicating its new path. The first characters of this second line
+indicate what is done: `=>' means that the file is moved, `->' means
+that a symbolic link is make and `+>' means that a hard link is made
+(when doing links,
+.BR mkpkfontdir
+does not remove the original file).
+.TP
+.BI "\-w\fR,\fP \-\-write-paths"
+Print the path of each font file to standard output. The path is written
+even if an error occurs (e.g. if the file cannot be moved, its old location
+will be printed). If the
+.B \-\-noaction
+option is used, of course, the path may be wrong because files are not
+effectively moved or linked, hence errors doing these actions cannot be
+discovered.
+.TP
+.BI "\-n\fR,\fP \-\-noaction"
+Do not do anything, really. But continue to fo verbose output if
+asked, and still issue warnings on standard error. Can be used to
+check for the correctness of the actions before doing them really.
+.TP
+.BI "\-m\fR,\fP \-\-mode " modespec
+Use the
+.I modespec
+string as modes definitions. This string is made of comma-separated
+modes definitions of the form
+.I alias\fR=[\fPmode\fR]\fP
+meaning that if a font has mode
+.I alias
+it will be moved under mode
+.I mode
+(which is useful if you always use mode cx, for example, and have fonts with
+CanonCX modes in them but want them to be under the cx hierarchy
+because the modes are identical). If
+.I mode
+is not supplied, then
+.I alias
+will be the default mode.
+Note that
+.I mode
+(or
+.I alias
+if
+.I mode
+was not supplied) must be present in the modes.mf modes file if the
+.B \-\-use-modesmf
+option has been given, or the
+directive will be ignored.
+.TP
+.BI "\-M\fR,\fP \-\-use-modesmf " f
+Use a modes.mf file; eventually specifiy that
+.I f
+is the modes.mf modes file to be used.
+.TP
+.BI "\-T\fR,\fP \-\-use-pktype"
+Use
+pktype(1)
+to determine the mode of a font file. This implies that the mode will
+not be guessed by looking at the font file full path.
+.TP
+.BI "\-g\fR,\fP \-\-guess-mode"
+Force guessing of the mode by looking at the font file full path.
+.TP
+.BI "\-f\fR,\fP \-\-fontdir " fontdir
+Specify the font directory under which the tfm files will be found.
+.TP
+.BI "\-d\fR,\fP \-\-destdir " destdir
+Specify the font directory under which the files will be moved (or
+where links will be created).
+.TP
+.BI "\-o\fR,\fP \-\-overwrite"
+Overwrite existing files. Default is to issue a warning and to go on
+to the next file.
+.TP
+.BI "\-l\fR,\fP \-\-link"
+Instead of moving files, create a link.
+.TP
+.BI "\-s\fR,\fP \-\-symbolic-link"
+Instead of moving files, create a symbolic link. (On systems that do
+not support symbolic links, a hard link will be created instead.)
+.TP
+.BI "\-t\fR,\fP \-\-tds-names"
+Use TDS names (e.g. dpi300/cmr10.pk) for pk files.
+.TP
+.BI "\-L\fR,\fP \-\-long-names"
+Use long names (e.g. cmr10.300pk) for pk files.
+.TP
+.BI "\-p\fR,\fP \-\-prune " n
+Removes
+.I n
+levels of subdirectories from the font path, starting from the
+end. (For example, removing one level of subdirectories from public/cm
+yields public).
+.TP
+.BI "\-P\fR,\fP \-R\fR,\fP \-\-restrict " n
+Restrict the depth of the font path to
+.I n
+- 1. (For example, if the argument is 2, public/cm yields public.) To
+remember this silly thing, you can think of the length of the font path
+plus the pk file name (and remember that still with an argument of 2,
+public/cm/dpi300/cmr10.pk will yield
+public/dpi300/cmr10.pk because dpi300/cmr10pk is the pk file name).
+.SH EXAMPLES
+To rearrange all your fonts in a TDS structure, simply say
+.PP
+.RS
+.BR mkpkfontdir
+\-t /path/to/pkfiles
+.RE
+.PP
+To get them classified only by supplier and typeface, say
+.PP
+.RS
+.BR mkpkfontdir
+/path/to/pkfiles
+.RE
+.PP
+To make a pool of all the pk files, say
+.PP
+.RS
+.BR mkpkfontdir
+-r 0 /path/to/pkfiles
+.RE
+.PP
+which suppresses all subdirectories.
+.PP
+To make pools of the pk files organized by suppliers, say
+.PP
+.RS
+.BR mkpkfontdir
+\-r 2 /path/to/pkfiles
+.RE
+.PP
+which suppresses all subdirectories but the supplier one (the 2 is
+here because we have the font path and the pk file name, and even if
+it is made of a directory and a file name in the TDS case, it is
+counted as just one level; this is good because it means that one
+cannot mistakenly move all font.pk files of different resolutions in a
+single directory, thus losing all resolutions but one for each pk
+file).
+.PP
+To move all fonts with mode CanonCX or unknown under the cx
+directories, say
+.PP
+.RS
+.BR mkpkfontdir
+-T -m CanonCX=cx,cx /path/to/pkfiles
+.RE
+.PP
+To make a pool of (symbolic) links optimizing recursive subdirectory
+search by offering at most one level of search (on a system limited to
+TDS names), say
+.PP
+.RS
+.BR mkpkfontdir
+-s -d /path/to/pool /path/to/pkfiles
+.RE
+.SH RESTRICTIONS
+Some systems do not support long file names ;-) This is why
+.B mkpkfontdir
+may have been configured to either refuse long names or guess if it is
+possible to create them. If long names are not available or not
+supported, the use of long names option will cause an error. On a
+correctly configured installation,
+.B mkpkfontdir
+should create by default files whose names respect the local naming
+conventions, and let anyone create files with TDS names.
+.SH CAVEATS AND BUGS
+Using a real TDS tree is somewhat penalizing: on the author's system,
+with only the TeX, LaTeX and AMS fonts installed, starting
+xdvi(1)
+(using kpathsea 2.6) takes
+approximatively 15 seconds, while when the files are organized in a
+pool (eventually of links) with only one level of subdirectories (the
+suppliers), it starts in 2 seconds.
+.PP
+The program asusmes that pk files have names ending in
+.IR pk "."
+Unless your installation has suffered from tortuous changes, this will
+never be a problem.
+.PP
+The argument to the
+.B \-\-restrict
+option is unnatural, it should be the number of directories levels we
+want, not this number plus one.
+.PP
+The
+.I directory
+argument can be a file. This is actually a feature (I just removed the
+test for a directory), that may be used for moving a single file.
+.SH AUTHOR
+Yves Arrouye <Yves.Arrouye@imag.fr>.
+.SH VERSION
+The
+.B mkpkfontdir
+utility described in this manual page has version 1.1 (August 1995).
+.SH ENVIRONMENT
+.TP 20
+$TEXMF
+Top directory of the main TDS-like hierarchy (defaults to @@TEXMF@@).
+.TP 20
+$VARTEXMF
+Top directory of a writable TDS-like hierarchy (defaults to $TEXMF).
+.SH FILES
+.TP 20
+@@LOC_MODESMF@@
+MetaFont modes descriptions.
+.SH SEE ALSO
+.TP 20
+TWG-TDS
+A Directory Structure for TeX files
+.TP 20
+MakeTeXPK(1)
+A tool for generated TeX pk files as needed
+.TP 20
+kpsewhich(1)
+A tool to locate files using kpathsea
+.TP 20
+pktype(1)
+A tool disassembling the contents of a .pk file
+.TP 20
+modes.mf(5)
+The database of MetaFont modes descriptions.
diff --git a/fonts/utilities/mm/makefile b/fonts/utilities/mm/makefile
new file mode 100644
index 0000000000..d05f9726cc
--- /dev/null
+++ b/fonts/utilities/mm/makefile
@@ -0,0 +1,9 @@
+build:
+ gcc -o mmafm mmafm.c parseAFM.c
+
+clean:
+ -rm *.pl *.vpl *.tfm *.vf _min*
+
+realclean: clean
+ -rm z*
+
diff --git a/fonts/utilities/mm/makeinstance.sh b/fonts/utilities/mm/makeinstance.sh
new file mode 100644
index 0000000000..8da29c3e5c
--- /dev/null
+++ b/fonts/utilities/mm/makeinstance.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+#
+# ===================================================================
+# M Goossens, S Rahtz. June 10 1995. revised December 5th 1995, March 1997
+#
+# Given a multiple master font, and values for up to 4 design space
+# variables (how many, depends on the font), create AFM instances by
+# creating normalized weight factors, and applying them to the master
+# AFM files.
+#
+# Procedure:
+# 1. create small PS file to invoke MM operators in PostScript
+# with right values
+# 2. run GhostScript on file to derive normalized weights
+# 3. run mmafm program to read master AFM files and write new one
+# 4. write map entry and .pro header file
+# ===================================================================
+#echo "usage makeinstance fontname instancename design-space-variables 1 to 4"
+X=$2.control
+cat > $$.instance <<FOOBAR
+/myfile (myfile) (w) file def
+/str 20 string def
+/MASTERFONT findfont dup begin [
+V1 V2 V3 V4 NormalizeDesignVector ConvertDesignVector
+counttomark 1 sub -1 0 {
+index str cvs myfile exch writestring
+myfile (\n) writestring} for
+myfile closefile
+] end
+FOOBAR
+#-----------------------------------
+MASTERFONT="$1"
+V1="$3"
+V2="$4"
+V3="$5"
+V4="$6"
+sed -e "s/MASTERFONT/$MASTERFONT/" \
+ -e "s/V1/$V1/" \
+ -e "s/V2/$V2/" \
+ -e "s/V3/$V3/" \
+ -e "s/V4/$V4/" \
+ < $$.instance > $$.ps
+rm $$.instance
+gs -dNODISPLAY `kpsewhich -format=.pfa $1.PFA` $$.ps quit.ps
+rm $$.ps
+#----------------------------------
+#
+# build control file for mmafm
+#
+#----------------------------------
+# number of weights
+wc -l myfile | awk '{print $1}' > $X
+# master AFM file names
+cat $1.afmnames >> $X
+# new name
+echo $2 >> $X
+# weights
+cat myfile >> $X
+#----------------------------------
+rm myfile
+mmafm $X | \
+ sed -e "/^FontName/s/^FontName .*$/FontName $1-$3-$4-$5-$6/" \
+ -e "/^FontName/s/-*$//" > $2.afm
+#----------------------------------
+echo "/$2 /$1 findfont dup begin [" > $2.pro
+echo " $V1 $V2 $V3 $V4 NormalizeDesignVector ConvertDesignVector" >>$2.pro
+echo " ] end makeblendedfont definefont pop " >>$2.pro
+#----------------------------------
+exit
+
diff --git a/fonts/utilities/mm/mmafm.c b/fonts/utilities/mm/mmafm.c
new file mode 100644
index 0000000000..dbdc73c8ef
--- /dev/null
+++ b/fonts/utilities/mm/mmafm.c
@@ -0,0 +1,493 @@
+/*
+
+mmafm.c
+
+M Goossens, S Rahtz June 10th 1995
+
+read multiple master AFM files, apply weight factor
+and write instance AFM
+
+derived from parseAFMclient.c:
+ * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+........
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' check in main
+ */
+
+#define lineterm EOL /* line terminating character */
+#define MAXMM 16
+#include <stdio.h>
+#include "parseAFM.h"
+static char *ident = NULL; /* storage buffer for keywords */
+
+
+/*************************** GLOBALS ***************************/
+FontInfo *fi, *otherfi;
+FLAGS myflags = 0;
+
+
+/*************************** printGlobals **********************/
+
+printGlobals()
+{
+ printf("StartFontMetrics %s\n", fi->gfi->afmVersion);
+ printf("FontName %s\n", fi->gfi->fontName);
+ printf("FullName %s\n", fi->gfi->fullName);
+ printf("FamilyName %s\n", fi->gfi->familyName);
+ printf("Weight %s\n", fi->gfi->weight);
+ printf("ItalicAngle %f\n", fi->gfi->italicAngle);
+ if (fi->gfi->isFixedPitch)
+ printf("IsFixedPitch true\n");
+ else
+ printf("IsFixedPitch false\n");
+ printf("UnderlinePosition %d\n", fi->gfi->underlinePosition);
+ printf("UnderlineThickness %d\n", fi->gfi->underlineThickness);
+ printf("Version %s\n", fi->gfi->version);
+ printf("FontBBox %d %d %d %d\n",
+ fi->gfi->fontBBox.llx, fi->gfi->fontBBox.lly,
+ fi->gfi->fontBBox.urx, fi->gfi->fontBBox.ury);
+ printf("Notice %s\n", fi->gfi->notice);
+ printf("EncodingScheme %s\n", fi->gfi->encodingScheme);
+ printf("CapHeight %d\n", fi->gfi->capHeight);
+ printf("XHeight %d\n", fi->gfi->xHeight);
+ printf("Descender %d\n", fi->gfi->descender);
+ printf("Ascender %d\n", fi->gfi->ascender);
+
+} /* printGlobals */
+
+
+/*************************** printCharWidths *********************/
+printCharWidths()
+{
+ int i = 0;
+ for (i = 0; i < 256; ++i)
+ printf(" code: %3d width: %4d\n", i, fi->cwi[i]);
+ printf("\n");
+
+} /* printCharWidths */
+
+
+/*************************** printAllCharMetrics *****************/
+printAllCharMetrics()
+{
+ int i = 0;
+ CharMetricInfo *temp = fi->cmi;
+ Ligature *node = temp->ligs;
+ printf("StartCharMetrics %d\n", fi->numOfChars);
+ for (i = 0; i < fi->numOfChars; ++i)
+ {
+ printf(
+ "C %d ; WX %d ; N %s ; B %d %d %d %d ;",
+ temp->code, temp->wx, temp->name, temp->charBBox.llx,
+ temp->charBBox.lly, temp->charBBox.urx, temp->charBBox.ury);
+ for (node = temp->ligs; node != NULL; node = node->next)
+ {
+ printf(" L %s %s ;", node->succ, node->lig);
+ }
+ printf("\n");
+ temp++;
+ } /* for */
+ printf("EndCharMetrics\n");
+
+} /* printAllCharMetrics */
+
+
+/*************************** printKernPairData ******************/
+printKernPairData()
+{
+ int i = 0;
+ PairKernData *pkd = fi->pkd;
+
+ if (fi->numOfPairs != 0)
+ {
+ printf("StartKernData\n");
+ printf("StartKernPairs %d\n",fi->numOfPairs);
+ for (i = 0; i < fi->numOfPairs; ++i)
+ printf(
+ "KPX %s %s %d\n",
+ pkd[i].name1, pkd[i].name2, pkd[i].xamt);
+/* "KPX %s %s %d %d\n",
+ pkd[i].name1, pkd[i].name2, pkd[i].xamt, pkd[i].yamt); */
+ printf("EndKernPairs\n");
+ printf("EndKernData\n");
+ }
+
+} /* printKernPairData */
+
+
+/*************************** printKernTrackData *******************/
+printKernTrackData()
+{
+ int i = 0;
+ TrackKernData *tkd = fi->tkd;
+
+ if (fi->numOfTracks != 0)
+ {
+ printf("StartTrackKern %d\n",fi->numOfTracks);
+ for (i = 0; i < fi->numOfTracks; ++i)
+ printf(
+ "TrackKern %d %d %d %d %d\n",
+ tkd[i].degree, tkd[i].minPtSize, tkd[i].minKernAmt,
+ tkd[i].maxPtSize, tkd[i].maxKernAmt);
+ printf("EndTrackKern\n");
+ }
+
+} /* printKernTrackData */
+
+
+/*************************** printCompCharData ********************/
+printCompCharData()
+{
+ int i = 0, j = 0;
+ CompCharData *ccd = fi->ccd;
+
+ if (fi->numOfComps != 0)
+ {
+ printf("StartComposites %d\n",fi->numOfComps);
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ printf("CC %s %d ;",
+ ccd[i].ccName, ccd[i].numOfPieces);
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ printf(
+ " PCC %s %d %d ;", ccd[i].pieces[j].pccName,
+ ccd[i].pieces[j].deltax, ccd[i].pieces[j].deltay);
+ printf("\n");
+ }
+ printf("EndComposites\n");
+ }
+
+} /* printCompCharData */
+
+
+
+/*************************** freeStorage ***********************/
+
+freeStorage()
+{
+ if (fi != NULL)
+ {
+ if (fi->gfi != NULL)
+ {
+ free(fi->gfi->afmVersion); fi->gfi->afmVersion = NULL;
+ free(fi->gfi->fontName); fi->gfi->fontName = NULL;
+ free(fi->gfi->fullName); fi->gfi->fullName = NULL;
+ free(fi->gfi->familyName); fi->gfi->familyName = NULL;
+ free(fi->gfi->weight); fi->gfi->weight = NULL;
+ free(fi->gfi->version); fi->gfi->version = NULL;
+ free(fi->gfi->notice); fi->gfi->notice = NULL;
+ free(fi->gfi->encodingScheme); fi->gfi->encodingScheme = NULL;
+ free(fi->gfi); fi->gfi = NULL;
+ }
+
+ if (fi->cwi != NULL)
+ { free(fi->cwi); fi->cwi = NULL; }
+
+ if (fi->cmi != NULL)
+ {
+ int i = 0;
+ CharMetricInfo *temp = fi->cmi;
+ Ligature *node = temp->ligs;
+
+ for (i = 0; i < fi->numOfChars; ++i)
+ {
+ for (node = temp->ligs; node != NULL; node = node->next)
+ {
+ free(node->succ); node->succ = NULL;
+ free(node->lig); node->lig = NULL;
+ }
+
+ free(temp->name); temp->name = NULL;
+ temp++;
+ }
+
+ free(fi->cmi); fi->cmi = NULL;
+ }
+
+ if (fi->tkd != NULL)
+ { free(fi->tkd); fi->tkd = NULL; }
+
+ if (fi->pkd != NULL)
+ {
+ free(fi->pkd->name1); fi->pkd->name1 = NULL;
+ free(fi->pkd->name2); fi->pkd->name2 = NULL;
+ free(fi->pkd); fi->pkd = NULL;
+ }
+
+ if (fi->ccd != NULL)
+ {
+ int i = 0, j = 0;
+ CompCharData *ccd = fi->ccd;
+
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ {
+ free(ccd[i].pieces[j].pccName);
+ ccd[i].pieces[j].pccName = NULL;
+ }
+
+ free(ccd[i].ccName); ccd[i].ccName = NULL;
+ }
+
+ free(fi->ccd); fi->ccd = NULL;
+ }
+
+ free(fi);
+
+ } /* if */
+
+} /* freeStorage */
+
+
+/*************************** printValues **************************/
+
+printValues()
+{
+ if (fi->gfi != NULL) printGlobals();
+ if (fi->cmi != NULL) printAllCharMetrics();
+ if (fi->pkd != NULL) printKernPairData();
+ if (fi->tkd != NULL) printKernTrackData();
+ if (fi->ccd != NULL) printCompCharData();
+ printf("EndFontMetrics\n");
+} /* printValues */
+
+
+/*************************** sumValues **************************/
+
+sumValues (FACTOR)
+float FACTOR;
+{
+int i,j = 0;
+CharMetricInfo *temp = fi->cmi;
+CharMetricInfo *othertemp = otherfi->cmi;
+PairKernData *pkd = fi->pkd;
+PairKernData *otherpkd = otherfi->pkd;
+TrackKernData *tkd = fi->tkd;
+TrackKernData *othertkd = otherfi->tkd;
+CompCharData *ccd = fi->ccd;
+CompCharData *otherccd = otherfi->ccd;
+
+fi->gfi->italicAngle += otherfi->gfi->italicAngle * FACTOR;
+fi->gfi->underlinePosition += otherfi->gfi->underlinePosition * FACTOR;
+fi->gfi->underlineThickness += otherfi->gfi->underlineThickness * FACTOR;
+fi->gfi->fontBBox.llx += otherfi->gfi->fontBBox.llx * FACTOR;
+fi->gfi->fontBBox.lly += otherfi->gfi->fontBBox.lly * FACTOR;
+fi->gfi->fontBBox.urx += otherfi->gfi->fontBBox.urx * FACTOR;
+fi->gfi->fontBBox.ury += otherfi->gfi->fontBBox.ury * FACTOR;
+fi->gfi->capHeight += otherfi->gfi->capHeight * FACTOR;
+fi->gfi->xHeight += otherfi->gfi->xHeight * FACTOR;
+fi->gfi->descender += otherfi->gfi->descender * FACTOR;
+fi->gfi->ascender += otherfi->gfi->ascender * FACTOR;
+
+
+for (i = 0; i < fi->numOfChars; ++i)
+ {
+ temp->wx += othertemp->wx * FACTOR;
+ temp->charBBox.llx += othertemp->charBBox.llx * FACTOR;
+ temp->charBBox.lly += othertemp->charBBox.lly * FACTOR;
+ temp->charBBox.urx += othertemp->charBBox.urx * FACTOR;
+ temp->charBBox.ury += othertemp->charBBox.ury * FACTOR;
+ temp++;
+ othertemp++;
+ } /* for */
+
+ i = 0;
+
+ if (fi->numOfPairs != 0)
+ {
+ for (i = 0; i < fi->numOfPairs; ++i)
+ pkd[i].xamt += otherpkd[i].xamt * FACTOR;
+ }
+
+
+i = 0;
+
+ if (fi->numOfTracks != 0)
+ {
+ for (i = 0; i < fi->numOfTracks; ++i)
+ {
+ tkd[i].degree += othertkd[i].degree * FACTOR;
+ tkd[i].minPtSize += othertkd[i].minPtSize * FACTOR;
+ tkd[i].minKernAmt += othertkd[i].minKernAmt * FACTOR;
+ tkd[i].maxPtSize += othertkd[i].maxPtSize * FACTOR;
+ tkd[i].maxKernAmt += othertkd[i].maxKernAmt * FACTOR;
+ }
+ }
+
+
+i = 0;
+j = 0;
+ if (fi->numOfComps != 0)
+ {
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ {
+ ccd[i].pieces[j].deltax += otherccd[i].pieces[j].deltax * FACTOR;
+ ccd[i].pieces[j].deltay += otherccd[i].pieces[j].deltay * FACTOR;
+ }
+ }
+ }
+
+}
+
+
+/*************************** IniValues **************************/
+
+IniValues (FACTOR)
+float FACTOR;
+{
+int i,j = 0;
+CharMetricInfo *temp = fi->cmi;
+PairKernData *pkd = fi->pkd;
+TrackKernData *tkd = fi->tkd;
+CompCharData *ccd = fi->ccd;
+
+fi->gfi->italicAngle = fi->gfi->italicAngle * FACTOR;
+fi->gfi->underlinePosition = fi->gfi->underlinePosition * FACTOR;
+fi->gfi->underlineThickness = fi->gfi->underlineThickness * FACTOR;
+fi->gfi->fontBBox.llx = fi->gfi->fontBBox.llx * FACTOR;
+fi->gfi->fontBBox.lly = fi->gfi->fontBBox.lly * FACTOR;
+fi->gfi->fontBBox.urx = fi->gfi->fontBBox.urx * FACTOR;
+fi->gfi->fontBBox.ury = fi->gfi->fontBBox.ury * FACTOR;
+fi->gfi->capHeight = fi->gfi->capHeight * FACTOR;
+fi->gfi->xHeight = fi->gfi->xHeight * FACTOR;
+fi->gfi->descender = fi->gfi->descender * FACTOR;
+fi->gfi->ascender = fi->gfi->ascender * FACTOR;
+
+
+for (i = 0; i < fi->numOfChars; ++i)
+ {
+ temp->wx = temp->wx * FACTOR;
+ temp->charBBox.llx = temp->charBBox.llx * FACTOR;
+ temp->charBBox.lly = temp->charBBox.lly * FACTOR;
+ temp->charBBox.urx = temp->charBBox.urx * FACTOR;
+ temp->charBBox.ury = temp->charBBox.ury * FACTOR;
+ temp++;
+ } /* for */
+
+ i = 0;
+
+ if (fi->numOfPairs != 0)
+ {
+ for (i = 0; i < fi->numOfPairs; ++i)
+ pkd[i].xamt = pkd[i].xamt * FACTOR;
+ }
+
+
+i = 0;
+
+ if (fi->numOfTracks != 0)
+ {
+ for (i = 0; i < fi->numOfTracks; ++i)
+ {
+ tkd[i].degree = tkd[i].degree * FACTOR;
+ tkd[i].minPtSize = tkd[i].minPtSize * FACTOR;
+ tkd[i].minKernAmt = tkd[i].minKernAmt * FACTOR;
+ tkd[i].maxPtSize = tkd[i].maxPtSize * FACTOR;
+ tkd[i].maxKernAmt = tkd[i].maxKernAmt * FACTOR;
+ }
+ }
+
+
+i = 0;
+j = 0;
+ if (fi->numOfComps != 0)
+ {
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ {
+ ccd[i].pieces[j].deltax = ccd[i].pieces[j].deltax * FACTOR;
+ ccd[i].pieces[j].deltay = ccd[i].pieces[j].deltay * FACTOR;
+ }
+ }
+ }
+
+}
+
+
+/*************************** main *********************************/
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+
+ char *filename, *prog = *argv;
+ FILE *fp, *fpmain;
+ char mastafm[MAXMM][128];
+ char Line[128];
+ char newafm[128];
+ float Weight;
+ int NofM, i, j, k, l;
+
+ ++argv; --argc; myflags |= P_ALL;
+
+ if (!argc)
+ {
+ printf(" usage: parseAFM [AFM File]\n");
+ exit(0);
+ }
+ else
+ filename = *argv;
+
+ if (!filename[0])
+ {
+ printf ("*** ERROR: can't open. filename is missing.\n",
+ filename );
+ return 0;
+ }
+
+ fpmain = fopen(filename, "r" );
+ if (fpmain == NULL)
+ {
+ fprintf (stderr,"*** ERROR: can't find: %s\n", filename );
+ exit(1);
+ }
+ fgets(mastafm[0],128,fpmain);
+ NofM = atoi(mastafm[0]);
+ fprintf(stderr,"Now read %d lines\n",NofM);
+ for (j = 0; j < NofM; j++)
+ {
+ fscanf(fpmain,"%s",&mastafm[j]);
+ }
+ fscanf(fpmain,"%s",&newafm);
+ fprintf(stderr,"Make new AFM file: %s\n",newafm);
+ for (j = 0; j < NofM; j++)
+ {
+ fscanf(fpmain,"%f",&Weight);
+ fprintf(stderr,"Process file %d: %s with weight %f\n",j,mastafm[j],Weight);
+ fp = fopen(mastafm[j], "r" );
+ if (fp == NULL)
+ {
+ fprintf (stderr,"*** ERROR: can't find: %s\n", mastafm[j] );
+ exit(1);
+ }
+ if ( j == 0 )
+ {
+ parseFile(fp, &fi, myflags);
+ IniValues(Weight);
+ }
+ else
+ {
+ parseFile(fp, &otherfi, myflags);
+ sumValues(Weight);
+ }
+ fclose(fp);
+ }
+ printValues();
+ freeStorage();
+ fclose(fpmain);
+}
diff --git a/fonts/utilities/mm/mmfont b/fonts/utilities/mm/mmfont
new file mode 100644
index 0000000000..0b9570ce76
--- /dev/null
+++ b/fonts/utilities/mm/mmfont
@@ -0,0 +1,183 @@
+#!/usr/bin/bash
+#
+#make a Minion or Myriad font instance
+#-------------------------------------------------
+#there are 3 axes in Minion:
+#the weight ranges from 345 to 620
+#the width ranges from 450 to 600
+#the size varies from 6 to 72
+#
+#there are 2 axes in Myriad:
+#the weight ranges from 215 to 830
+#the width ranges from 300 to 750
+#
+TDS=/home/spqr/tds
+MMHOME=/home/spqr/psfonts/mmafm
+MMDEST=$TDS/dvips/mm
+TFMDEST=$TDS/fonts/tfm/adobe/mm
+VFDEST=$TDS/fonts/vf/adobe/mm
+#
+#option allows us just to generate the AFM files, not run fontinst
+#
+AFM=
+while true; do
+ case $1 in
+ -afm) shift ; AFM=y ; break;;
+ *) break;;
+ esac
+done
+FNAME=$1
+FAM=`expr $FNAME : '^z\(..\).*$'`
+IWEIGHT=`expr $FNAME : '^zm.\(.*\)[78]t.*$'`
+WIDTH=`expr $FNAME : '^[a-z]*[78]t\([^0-9]*\).*$'`
+SIZE=`expr $FNAME : '^.*[78]t[^0-9]*\([0-9]*\)$'`
+ENCODING=`expr $FNAME : '^.*\([78]t\).*$'`
+USESIZE=`echo $SIZE \* 1.095 | bc`
+WEIGHT=`expr $IWEIGHT : '\(.\).*'`
+SHAPE=`expr $IWEIGHT : '.\(.*\)'`
+EXTRA=
+case $FAM in
+ mn) FULLFAM=Minion ; EXPERT=y;;
+ my) FULLFAM=Myriad; EXPERT=;;
+ *) echo Unknown MM family $FAM >&2; exit 1;;
+esac
+
+if test "${SHAPE}" = "i"
+then
+ PFA=${FULLFAM}MM-It
+ EPFA=${FULLFAM}MM-ItEp
+ LSHAPE="it"
+else
+ PFA=${FULLFAM}MM
+ EPFA=${FULLFAM}MM-Ep
+ if test "${SHAPE}" = "c"
+ then
+ LSHAPE="sc"
+ IWEIGHT=$WEIGHT
+ EXTRA="c"
+ else
+ LSHAPE="n"
+ fi
+fi
+if test "${WIDTH}x" = "x"
+then
+ REALWIDTH="r"
+else
+ REALWIDTH=$WIDTH
+fi
+case $WEIGHT in
+ h) LWEIGHT="ul"; MINWEIGHT=345; MYWEIGHT=215;; #hairline
+ j) LWEIGHT="el"; MINWEIGHT=360; MYWEIGHT=291;; #extralight
+ l) LWEIGHT="l"; MINWEIGHT=380; MYWEIGHT=367;; #light
+ k) LWEIGHT="sl"; MINWEIGHT=400; MYWEIGHT=443;; #book
+ m) LWEIGHT="m"; MINWEIGHT=415; MYWEIGHT=519;; #Medium
+ s) LWEIGHT="sb"; MINWEIGHT=500; MYWEIGHT=595;; #semibold
+ b) LWEIGHT="b"; MINWEIGHT=580; MYWEIGHT=671;; #bold
+ x) LWEIGHT="eb"; MINWEIGHT=600; MYWEIGHT=747;; #ExtraBold
+ u) LWEIGHT="ub"; MINWEIGHT=620; MYWEIGHT=830;; #UltraBlack
+ *) echo BAD WEIGHT >&2; exit 1;;
+esac
+case $REALWIDTH in
+ o) LWIDTH="uc"; MINWIDTH=450; MYWIDTH=300;; #UltraCondensed
+ q) LWIDTH="ec"; MINWIDTH=468; MYWIDTH=350;; #ExtraCondensed
+ c) LWIDTH="c"; MINWIDTH=490; MYWIDTH=400;; #Condensed
+ n) LWIDTH="sc"; MINWIDTH=510; MYWIDTH=450;; #Narrow
+ r) LWIDTH="m"; MINWIDTH=535; MYWIDTH=500;; #Regular
+ x) LWIDTH="sx"; MINWIDTH=550; MYWIDTH=550;; #Extended
+ e) LWIDTH="x"; MINWIDTH=565; MYWIDTH=600;; #Expanded
+ v) LWIDTH="ex"; MINWIDTH=584; MYWIDTH=650;; #Extra Expanded
+ w) LWIDTH="ux"; MINWIDTH=600; MYWIDTH=700;; #Wide
+ *) echo BAD WIDTH >&2; exit 1;;
+esac
+ORID=`pwd`
+cd $MMHOME
+if test "$LWIDTH$LWEIGHT" = "mm"
+then
+ LSERIES="m"
+else
+ if test "$LWIDTH" = "m"
+ then
+ LWIDTH=""
+ fi
+ if test "$LWEIGHT" = "m"
+ then
+ LWEIGHT=""
+ fi
+ LSERIES=$LWEIGHT$LWIDTH
+fi
+if test "$ENCODING" = "8t"
+then
+ LATEXENC=T1
+ SUFFIX=8t
+else
+ LATEXENC=OT1
+ SUFFIX=7t
+fi
+EFNAME=z$FAM${IWEIGHT}8x${WIDTH}${SIZE}
+RNAME=z$FAM${IWEIGHT}8r${WIDTH}${SIZE}
+FINALNAME=z$FAM${IWEIGHT}${EXTRA}${SUFFIX}${WIDTH}${SIZE}
+RAWNAME=z$FAM${IWEIGHT}8a${WIDTH}${SIZE}
+echo $RAWNAME: $EFNAME, $RNAME, $FINALNAME
+#echo $FNAME: $FAM / $WEIGHT [ $IWEIGHT ] / $WIDTH / $SIZE / $SHAPE: $LSERIES / $LSHAPE >&2
+if test "${SHAPE}" != "c"
+then
+ echo "$RNAME $RAWNAME \" TeXBase1Encoding ReEncodeFont \" <8r.enc <$PFA.PFA <$RAWNAME.pro" > $RAWNAME.map
+fi
+makeinstance.sh $PFA $RAWNAME $MINWEIGHT $MINWIDTH $USESIZE
+if test "$EXPERT"x != "x"
+then
+ echo "$EFNAME $EFNAME <$EPFA.PFA <$EFNAME.pro" > $EFNAME.map
+ makeinstance.sh $EPFA $EFNAME $MINWEIGHT $MINWIDTH $USESIZE >& /dev/null
+fi
+if test "$AFM"x != "x"
+then
+ exit 0
+fi
+cat > _min$$.tex <<HERE
+\input fontinst.sty
+\needsfontinstversion{1.5}
+\installfonts
+\installfamily{${LATEXENC}}{foo}{}
+ \transformfont{$RNAME}{\reencodefont{8r}{\fromafm{$RAWNAME}}}
+HERE
+if test "$EXPERT"x != "x"
+then
+ if test "${SHAPE}" = "c"
+ then
+echo "\\installfont{$FINALNAME}{$RNAME,$EFNAME,latin}{${LATEXENC}c}{${LATEXENC}}{foo}{$LSERIES}{$LSHAPE}{}" >> _min$$.tex
+ else
+ echo "\\installfont{$FINALNAME}{$RNAME,$EFNAME,latin}{${LATEXENC}}{${LATEXENC}}{foo}{$LSERIES}{$LSHAPE}{}" >> _min$$.tex
+ fi
+else
+ if test "${SHAPE}" = "c"
+ then
+ echo " \\installfont{$FINALNAME}{$RNAME,latin}{${LATEXENC}c}{${LATEXENC}}{foo}{$LSERIES}{$LSHAPE}{}" >> _min$$.tex
+ else
+ echo "\\installfont{$FINALNAME}{$RNAME,latin}{${LATEXENC}}{${LATEXENC}}{foo}{$LSERIES}{$LSHAPE}{}" >> _min$$.tex
+ fi
+fi
+cat >> _min$$.tex <<THERE
+\endinstallfonts
+\bye
+THERE
+tex _min$$
+rm _min$$.*
+pltotf $RNAME.pl $RNAME.tfm >& /dev/null
+vptovf $FINALNAME.vpl $FINALNAME.vf $FINALNAME.tfm >& /dev/null
+rm $RNAME.pl $FINALNAME.vpl
+rm ${LATEXENC}foo.fd
+rm $RAWNAME.afm
+mv $RNAME.tfm $FINALNAME.tfm $TFMDEST
+mv $FINALNAME.vf $VFDEST
+mv $RAWNAME.pro $MMDEST
+cat z$FAM${IWEIGHT}8*${WIDTH}${SIZE}.map $MMDEST/mm.map | sort | uniq > $$.map
+mv $$.map $MMDEST/mm.map
+rm $RAWNAME.*
+if test "$EXPERT"x != "x"
+then
+ pltotf $EFNAME.pl $EFNAME.tfm >& /dev/null
+ mv $EFNAME.pro $MMDEST
+ mv $EFNAME.tfm $TFMDEST
+ rm $EFNAME.*
+fi
+cd $ORID
diff --git a/fonts/utilities/mm/parseAFM.c b/fonts/utilities/mm/parseAFM.c
new file mode 100644
index 0000000000..186755beca
--- /dev/null
+++ b/fonts/utilities/mm/parseAFM.c
@@ -0,0 +1,1226 @@
+/*
+ * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+ *
+ * ************************************************************************
+ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+ * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+ * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+ * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+ * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+ * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * ************************************************************************
+ */
+
+/* parseAFM.c
+ *
+ * This file is used in conjuction with the parseAFM.h header file.
+ * This file contains several procedures that are used to parse AFM
+ * files. It is intended to work with an application program that needs
+ * font metric information. The program can be used as is by making a
+ * procedure call to "parseFile" (passing in the expected parameters)
+ * and having it fill in a data structure with the data from the
+ * AFM file, or an application developer may wish to customize this
+ * code.
+ *
+ * There is also a file, parseAFMclient.c, that is a sample application
+ * showing how to call the "parseFile" procedure and how to use the data
+ * after "parseFile" has returned.
+ *
+ * Please read the comments in parseAFM.h and parseAFMclient.c.
+ *
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' return code
+ * - fixed bug of not allocating extra byte for string duplication
+ * - fixed typos
+ * modified: DSM Tue Apr 3 11:18:34 PDT 1990
+ * - added free(ident) at end of parseFile routine
+ * modified: DSM Tue Jun 19 10:16:29 PDT 1990
+ * - changed (width == 250) to (width = 250) in initializeArray
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <sys/file.h>
+#include <math.h>
+#include "parseAFM.h"
+
+#define lineterm EOL /* line terminating character */
+#define normalEOF 1 /* return code from parsing routines used only */
+ /* in this module */
+#define Space "space" /* used in string comparison to look for the width */
+ /* of the space character to init the widths array */
+#define False "false" /* used in string comparison to check the value of */
+ /* boolean keys (e.g. IsFixedPitch) */
+
+#define MATCH(A,B) (strncmp((A),(B), MAX_NAME) == 0)
+
+
+
+/*************************** GLOBALS ***********************/
+
+static char *ident = NULL; /* storage buffer for keywords */
+
+
+/* "shorts" for fast case statement
+ * The values of each of these enumerated items correspond to an entry in the
+ * table of strings defined below. Therefore, if you add a new string as
+ * new keyword into the keyStrings table, you must also add a corresponding
+ * parseKey AND it MUST be in the same position!
+ *
+ * IMPORTANT: since the sorting algorithm is a binary search, the strings of
+ * keywords must be placed in lexicographical order, below. [Therefore, the
+ * enumerated items are not necessarily in lexicographical order, depending
+ * on the name chosen. BUT, they must be placed in the same position as the
+ * corresponding key string.] The NOPE shall remain in the last position,
+ * since it does not correspond to any key string, and it is used in the
+ * "recognize" procedure to calculate how many possible keys there are.
+ */
+
+static enum parseKey {
+ ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, COMMENT,
+ DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES,
+ ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN,
+ FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH,
+ ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME,
+ NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES,
+ STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS,
+ STARTTRACKKERN, TRACKKERN, UNDERLINEPOSITION,
+ UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT,
+ NOPE };
+
+/* keywords for the system:
+ * This a table of all of the current strings that are vaild AFM keys.
+ * Each entry can be referenced by the appropriate parseKey value (an
+ * enumerated data type defined above). If you add a new keyword here,
+ * a corresponding parseKey MUST be added to the enumerated data type
+ * defined above, AND it MUST be added in the same position as the
+ * string is in this table.
+ *
+ * IMPORTANT: since the sorting algorithm is a binary search, the keywords
+ * must be placed in lexicographical order. And, NULL should remain at the
+ * end.
+ */
+
+static char *keyStrings[] = {
+ "Ascender", "B", "C", "CC", "CapHeight", "Comment",
+ "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites",
+ "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern",
+ "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch",
+ "ItalicAngle", "KP", "KPX", "L", "N",
+ "Notice", "PCC", "StartCharMetrics", "StartComposites",
+ "StartFontMetrics", "StartKernData", "StartKernPairs",
+ "StartTrackKern", "TrackKern", "UnderlinePosition",
+ "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight",
+ NULL };
+
+/*************************** PARSING ROUTINES **************/
+
+/*************************** token *************************/
+
+/* A "AFM File Conventions" tokenizer. That means that it will
+ * return the next token delimited by white space. See also
+ * the `linetoken' routine, which does a similar thing but
+ * reads all tokens until the next end-of-line.
+ */
+
+static char *token(stream)
+ FILE *stream;
+{
+ int ch, idx;
+
+ /* skip over white space */
+ while ((ch = fgetc(stream)) == ' ' || ch == lineterm ||
+ ch == ',' || ch == '\t' || ch == ';');
+
+ idx = 0;
+ while (ch != EOF && ch != ' ' && ch != lineterm
+ && ch != '\t' && ch != ':' && ch != ';')
+ {
+ ident[idx++] = ch;
+ ch = fgetc(stream);
+ } /* while */
+
+ if (ch == EOF && idx < 1) return ((char *)NULL);
+ if (idx >= 1 && ch != ':' ) ungetc(ch, stream);
+ if (idx < 1 ) ident[idx++] = ch; /* single-character token */
+ ident[idx] = 0;
+
+ return(ident); /* returns pointer to the token */
+
+} /* token */
+
+
+/*************************** linetoken *************************/
+
+/* "linetoken" will get read all tokens until the EOL character from
+ * the given stream. This is used to get any arguments that can be
+ * more than one word (like Comment lines and FullName).
+ */
+
+static char *linetoken(stream)
+ FILE *stream;
+{
+ int ch, idx;
+
+ while ((ch = fgetc(stream)) == ' ' || ch == '\t' );
+
+ idx = 0;
+ while (ch != EOF && ch != lineterm)
+ {
+ ident[idx++] = ch;
+ ch = fgetc(stream);
+ } /* while */
+
+ ungetc(ch, stream);
+ ident[idx] = 0;
+
+ return(ident); /* returns pointer to the token */
+
+} /* linetoken */
+
+
+/*************************** recognize *************************/
+
+/* This function tries to match a string to a known list of
+ * valid AFM entries (check the keyStrings array above).
+ * "ident" contains everything from white space through the
+ * next space, tab, or ":" character.
+ *
+ * The algorithm is a standard Knuth binary search.
+ */
+
+static enum parseKey recognize(ident)
+ register char *ident;
+{
+ int lower = 0, upper = (int) NOPE, midpoint, cmpvalue;
+ BOOL found = FALSE;
+
+ while ((upper >= lower) && !found)
+ {
+ midpoint = (lower + upper)/2;
+ if (keyStrings[midpoint] == NULL) break;
+ cmpvalue = strncmp(ident, keyStrings[midpoint], MAX_NAME);
+ if (cmpvalue == 0) found = TRUE;
+ else if (cmpvalue < 0) upper = midpoint - 1;
+ else lower = midpoint + 1;
+ } /* while */
+
+ if (found) return (enum parseKey) midpoint;
+ else return NOPE;
+
+} /* recognize */
+
+
+/************************* parseGlobals *****************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "StartCharMetrics" keyword, which essentially marks the
+ * end of the Global Font Information and the beginning of the character
+ * metrics information.
+ *
+ * If the caller of "parseFile" specified that it wanted the Global
+ * Font Information (as defined by the "AFM File Specification"
+ * document), then that information will be stored in the returned
+ * data structure.
+ *
+ * Any Global Font Information entries that are not found in a
+ * given file, will have the usual default initialization value
+ * for its type (i.e. entries of type int will be 0, etc).
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static BOOL parseGlobals(fp, gfi)
+ FILE *fp;
+ register GlobalFontInfo *gfi;
+{
+ BOOL cont = TRUE, save = (gfi != NULL);
+ int error = ok;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Global Font info section */
+ /* without saving any of the data */
+ switch (recognize(keyword))
+ {
+ case STARTCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire global font info section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case STARTFONTMETRICS:
+ keyword = token(fp);
+ gfi->afmVersion = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->afmVersion, keyword);
+ break;
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case FONTNAME:
+ keyword = token(fp);
+ gfi->fontName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->fontName, keyword);
+ break;
+ case ENCODINGSCHEME:
+ keyword = token(fp);
+ gfi->encodingScheme = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(gfi->encodingScheme, keyword);
+ break;
+ case FULLNAME:
+ keyword = linetoken(fp);
+ gfi->fullName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->fullName, keyword);
+ break;
+ case FAMILYNAME:
+ keyword = linetoken(fp);
+ gfi->familyName = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->familyName, keyword);
+ break;
+ case WEIGHT:
+ keyword = token(fp);
+ gfi->weight = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->weight, keyword);
+ break;
+ case ITALICANGLE:
+ keyword = token(fp);
+ gfi->italicAngle = (float) atoi(keyword);
+ if (errno == ERANGE) error = parseError;
+ break;
+ case ISFIXEDPITCH:
+ keyword = token(fp);
+ if (MATCH(keyword, False))
+ gfi->isFixedPitch = 0;
+ else
+ gfi->isFixedPitch = 1;
+ break;
+ case UNDERLINEPOSITION:
+ keyword = token(fp);
+ gfi->underlinePosition = atoi(keyword);
+ break;
+ case UNDERLINETHICKNESS:
+ keyword = token(fp);
+ gfi->underlineThickness = atoi(keyword);
+ break;
+ case VERSION:
+ keyword = token(fp);
+ gfi->version = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->version, keyword);
+ break;
+ case NOTICE:
+ keyword = linetoken(fp);
+ gfi->notice = (char *) malloc(strlen(keyword) + 1);
+ strcpy(gfi->notice, keyword);
+ break;
+ case FONTBBOX:
+ keyword = token(fp);
+ gfi->fontBBox.llx = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.lly = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.urx = atoi(keyword);
+ keyword = token(fp);
+ gfi->fontBBox.ury = atoi(keyword);
+ break;
+ case CAPHEIGHT:
+ keyword = token(fp);
+ gfi->capHeight = atoi(keyword);
+ break;
+ case XHEIGHT:
+ keyword = token(fp);
+ gfi->xHeight = atoi(keyword);
+ break;
+ case DESCENDER:
+ keyword = token(fp);
+ gfi->descender = atoi(keyword);
+ break;
+ case ASCENDER:
+ keyword = token(fp);
+ gfi->ascender = atoi(keyword);
+ break;
+ case STARTCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ return(error);
+
+} /* parseGlobals */
+
+
+
+/************************* initializeArray ************************/
+
+/* Unmapped character codes are (at Adobe Systems) assigned the
+ * width of the space character (if one exists) else they get the
+ * value of 250 ems. This function initializes all entries in the
+ * char widths array to have this value. Then any mapped character
+ * codes will be replaced with the width of the appropriate character
+ * when parsing the character metric section.
+
+ * This function parses the Character Metrics Section looking
+ * for a space character (by comparing character names). If found,
+ * the width of the space character will be used to initialize the
+ * values in the array of character widths.
+ *
+ * Before returning, the position of the read/write pointer of the
+ * file is reset to be where it was upon entering this function.
+ */
+
+static int initializeArray(fp, cwi)
+ FILE *fp;
+ register int *cwi;
+{
+ BOOL cont = TRUE, found = FALSE;
+ long opos = ftell(fp);
+ int code = 0, width = 0, i = 0, error = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ code = atoi(token(fp));
+ break;
+ case XWIDTH:
+ width = atoi(token(fp));
+ break;
+ case CHARNAME:
+ keyword = token(fp);
+ if (MATCH(keyword, Space))
+ {
+ cont = FALSE;
+ found = TRUE;
+ }
+ break;
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (!found)
+ width = 250;
+
+ for (i = 0; i < 256; ++i)
+ cwi[i] = width;
+
+ fseek(fp, opos, 0);
+
+ return(error);
+
+} /* initializeArray */
+
+
+/************************* parseCharWidths **************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndCharMetrics" keyword. It will save the character
+ * width info (as opposed to all of the character metric information)
+ * if requested by the caller of parseFile. Otherwise, it will just
+ * parse through the section without saving any information.
+ *
+ * If data is to be saved, parseCharWidths is passed in a pointer
+ * to an array of widths that has already been initialized by the
+ * standard value for unmapped character codes. This function parses
+ * the Character Metrics section only storing the width information
+ * for the encoded characters into the array using the character code
+ * as the index into that array.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static parseCharWidths(fp, cwi)
+ FILE *fp;
+ register int *cwi;
+{
+ BOOL cont = TRUE, save = (cwi != NULL);
+ int pos = 0, error = ok;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Char Metrics section without */
+ /* saving any of the data*/
+ switch (recognize(keyword))
+ {
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire char metrics section, saving */
+ /* only the char x-width info */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ keyword = token(fp);
+ pos = atoi(keyword);
+ break;
+ case XYWIDTH:
+ /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */
+ keyword = token(fp); keyword = token(fp); /* eat values */
+ error = parseError;
+ break;
+ case XWIDTH:
+ keyword = token(fp);
+ if (pos >= 0) /* ignore unmapped chars */
+ cwi[pos] = atoi(keyword);
+ break;
+ case ENDCHARMETRICS:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case CHARNAME: /* eat values (so doesn't cause parseError) */
+ keyword = token(fp);
+ break;
+ case CHARBBOX:
+ keyword = token(fp); keyword = token(fp);
+ keyword = token(fp); keyword = token(fp);
+ break;
+ case LIGATURE:
+ keyword = token(fp); keyword = token(fp);
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ return(error);
+
+} /* parseCharWidths */
+
+
+/************************* parseCharMetrics ************************/
+
+/* This function is called by parseFile if the caller of parseFile
+ * requested that all character metric information be saved
+ * (as opposed to only the character width information).
+ *
+ * parseCharMetrics is passed in a pointer to an array of records
+ * to hold information on a per character basis. This function
+ * parses the Character Metrics section storing all character
+ * metric information for the ALL characters (mapped and unmapped)
+ * into the array.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static parseCharMetrics(fp, fi)
+ FILE *fp;
+ register FontInfo *fi;
+{
+ BOOL cont = TRUE, firstTime = TRUE;
+ int error = ok, count = 0;
+ register CharMetricInfo *temp = fi->cmi;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case CODE:
+ if (count < fi->numOfChars)
+ {
+ if (firstTime) firstTime = FALSE;
+ else temp++;
+ temp->code = atoi(token(fp));
+ count++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case XYWIDTH:
+ temp->wx = atoi(token(fp));
+ temp->wy = atoi(token(fp));
+ break;
+ case XWIDTH:
+ temp->wx = atoi(token(fp));
+ break;
+ case CHARNAME:
+ keyword = token(fp);
+ temp->name = (char *) malloc(strlen(keyword) + 1);
+ strcpy(temp->name, keyword);
+ break;
+ case CHARBBOX:
+ temp->charBBox.llx = atoi(token(fp));
+ temp->charBBox.lly = atoi(token(fp));
+ temp->charBBox.urx = atoi(token(fp));
+ temp->charBBox.ury = atoi(token(fp));
+ break;
+ case LIGATURE: {
+ Ligature **tail = &(temp->ligs);
+ Ligature *node = *tail;
+
+ if (*tail != NULL)
+ {
+ while (node->next != NULL)
+ node = node->next;
+ tail = &(node->next);
+ }
+
+ *tail = (Ligature *) calloc(1, sizeof(Ligature));
+ keyword = token(fp);
+ (*tail)->succ = (char *) malloc(strlen(keyword) + 1);
+ strcpy((*tail)->succ, keyword);
+ keyword = token(fp);
+ (*tail)->lig = (char *) malloc(strlen(keyword) + 1);
+ strcpy((*tail)->lig, keyword);
+ break; }
+ case ENDCHARMETRICS:
+ cont = FALSE;;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if ((error == ok) && (count != fi->numOfChars))
+ error = parseError;
+
+ return(error);
+
+} /* parseCharMetrics */
+
+
+
+/************************* parseTrackKernData ***********************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndTrackKern" or "EndKernData" keywords. It will save the
+ * track kerning data if requested by the caller of parseFile.
+ *
+ * parseTrackKernData is passed in a pointer to the FontInfo record.
+ * If data is to be saved, the FontInfo record will already contain
+ * a valid pointer to storage for the track kerning data.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static parseTrackKernData(fp, fi)
+ FILE *fp;
+ register FontInfo *fi;
+{
+ BOOL cont = TRUE, save = (fi->tkd != NULL);
+ int pos = 0, error = ok, tcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Track Kerning Data */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDTRACKKERN:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Track Kerning Data section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case TRACKKERN:
+ if (tcount < fi->numOfTracks)
+ {
+ keyword = token(fp);
+ fi->tkd[pos].degree = atoi(keyword);
+ keyword = token(fp);
+ fi->tkd[pos].minPtSize = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos].minKernAmt = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos].maxPtSize = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ keyword = token(fp);
+ fi->tkd[pos++].maxKernAmt = atof(keyword);
+ if (errno == ERANGE) error = parseError;
+ tcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case ENDTRACKKERN:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && tcount != fi->numOfTracks)
+ error = parseError;
+
+ return(error);
+
+} /* parseTrackKernData */
+
+
+/************************* parsePairKernData ************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndKernPairs" or "EndKernData" keywords. It will save
+ * the pair kerning data if requested by the caller of parseFile.
+ *
+ * parsePairKernData is passed in a pointer to the FontInfo record.
+ * If data is to be saved, the FontInfo record will already contain
+ * a valid pointer to storage for the pair kerning data.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static parsePairKernData(fp, fi)
+ FILE *fp;
+ register FontInfo *fi;
+{
+ BOOL cont = TRUE, save = (fi->pkd != NULL);
+ int pos = 0, error = ok, pcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+
+ if (keyword == NULL)
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Pair Kerning Data */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDKERNPAIRS:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Pair Kerning Data section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case KERNPAIR:
+ if (pcount < fi->numOfPairs)
+ {
+ keyword = token(fp);
+ fi->pkd[pos].name1 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name1, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].name2 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name2, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].xamt = atoi(keyword);
+ keyword = token(fp);
+ fi->pkd[pos++].yamt = atoi(keyword);
+ pcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case KERNPAIRXAMT:
+ if (pcount < fi->numOfPairs)
+ {
+ keyword = token(fp);
+ fi->pkd[pos].name1 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name1, keyword);
+ keyword = token(fp);
+ fi->pkd[pos].name2 = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->pkd[pos].name2, keyword);
+ keyword = token(fp);
+ fi->pkd[pos++].xamt = atoi(keyword);
+ pcount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case ENDKERNPAIRS:
+ case ENDKERNDATA:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && pcount != fi->numOfPairs)
+ error = parseError;
+
+ return(error);
+
+} /* parsePairKernData */
+
+
+/************************* parseCompCharData **************************/
+
+/* This function is called by "parseFile". It will parse the AFM File
+ * up to the "EndComposites" keyword. It will save the composite
+ * character data if requested by the caller of parseFile.
+ *
+ * parseCompCharData is passed in a pointer to the FontInfo record, and
+ * a boolean representing if the data should be saved.
+ *
+ * This function will create the appropriate amount of storage for
+ * the composite character data and store a pointer to the storage
+ * in the FontInfo record.
+ *
+ * This function returns an error code specifying whether there was
+ * a premature EOF or a parsing error. This return value is used by
+ * parseFile to determine if there is more file to parse.
+ */
+
+static parseCompCharData(fp, fi)
+ FILE *fp;
+ register FontInfo *fi;
+{
+ BOOL cont = TRUE, firstTime = TRUE, save = (fi->ccd != NULL);
+ int pos = 0, j = 0, error = ok, ccount = 0, pcount = 0;
+ register char *keyword;
+
+ while (cont)
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ error = earlyEOF;
+ break; /* get out of loop */
+ }
+ if (ccount > fi->numOfComps)
+ {
+ error = parseError;
+ break; /* get out of loop */
+ }
+ if (!save)
+ /* get tokens until the end of the Composite Character info */
+ /* section without saving any of the data */
+ switch(recognize(keyword))
+ {
+ case ENDCOMPOSITES:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ default:
+ break;
+ } /* switch */
+ else
+ /* otherwise parse entire Composite Character info section, */
+ /* saving the data */
+ switch(recognize(keyword))
+ {
+ case COMMENT:
+ keyword = linetoken(fp);
+ break;
+ case COMPCHAR:
+ if (ccount < fi->numOfComps)
+ {
+ keyword = token(fp);
+ if (pcount != fi->ccd[pos].numOfPieces)
+ error = parseError;
+ pcount = 0;
+ if (firstTime) firstTime = FALSE;
+ else pos++;
+ fi->ccd[pos].ccName = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->ccd[pos].ccName, keyword);
+ keyword = token(fp);
+ fi->ccd[pos].numOfPieces = atoi(keyword);
+ fi->ccd[pos].pieces = (Pcc *)
+ calloc(fi->ccd[pos].numOfPieces, sizeof(Pcc));
+ j = 0;
+ ccount++;
+ }
+ else
+ {
+ error = parseError;
+ cont = FALSE;
+ }
+ break;
+ case COMPCHARPIECE:
+ if (pcount < fi->ccd[pos].numOfPieces)
+ {
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j].pccName = (char *)
+ malloc(strlen(keyword) + 1);
+ strcpy(fi->ccd[pos].pieces[j].pccName, keyword);
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j].deltax = atoi(keyword);
+ keyword = token(fp);
+ fi->ccd[pos].pieces[j++].deltay = atoi(keyword);
+ pcount++;
+ }
+ else
+ error = parseError;
+ break;
+ case ENDCOMPOSITES:
+ cont = FALSE;
+ break;
+ case ENDFONTMETRICS:
+ cont = FALSE;
+ error = normalEOF;
+ break;
+ case NOPE:
+ default:
+ error = parseError;
+ break;
+ } /* switch */
+ } /* while */
+
+ if (error == ok && ccount != fi->numOfComps)
+ error = parseError;
+
+ return(error);
+
+} /* parseCompCharData */
+
+
+
+
+/*************************** 'PUBLIC' FUNCTION ********************/
+
+
+/*************************** parseFile *****************************/
+
+/* parseFile is the only 'public' procedure available. It is called
+ * from an application wishing to get information from an AFM file.
+ * The caller of this function is responsible for locating and opening
+ * an AFM file and handling all errors associated with that task.
+ *
+ * parseFile expects 3 parameters: a vaild file pointer, a pointer
+ * to a (FontInfo *) variable (for which storage will be allocated and
+ * the data requested filled in), and a mask specifying which
+ * data from the AFM File should be saved in the FontInfo structure.
+ *
+ * The file will be parsed and the requested data will be stored in
+ * a record of type FontInfo (refer to ParseAFM.h).
+ *
+ * parseFile returns an error code as defined in parseAFM.h.
+ *
+ * The position of the read/write pointer associated with the file
+ * pointer upon return of this function is undefined.
+ */
+
+extern int parseFile (fp, fi, flags)
+ FILE *fp;
+ FontInfo **fi;
+ FLAGS flags;
+{
+
+ int code = ok; /* return code from each of the parsing routines */
+ int error = ok; /* used as the return code from this function */
+
+ register char *keyword; /* used to store a token */
+
+
+ /* storage data for the global variable ident */
+ ident = (char *) calloc(MAX_NAME, sizeof(char));
+ if (ident == NULL) {error = storageProblem; return(error);}
+
+ (*fi) = (FontInfo *) calloc(1, sizeof(FontInfo));
+ if ((*fi) == NULL) {error = storageProblem; return(error);}
+
+ if (flags & P_G)
+ {
+ (*fi)->gfi = (GlobalFontInfo *) calloc(1, sizeof(GlobalFontInfo));
+ if ((*fi)->gfi == NULL) {error = storageProblem; return(error);}
+ }
+
+ /* The AFM File begins with Global Font Information. This section */
+ /* will be parsed whether or not information should be saved. */
+ code = parseGlobals(fp, (*fi)->gfi);
+
+ if (code < 0) error = code;
+
+ /* The Global Font Information is followed by the Character Metrics */
+ /* section. Which procedure is used to parse this section depends on */
+ /* how much information should be saved. If all of the metrics info */
+ /* is wanted, parseCharMetrics is called. If only the character widths */
+ /* is wanted, parseCharWidths is called. parseCharWidths will also */
+ /* be called in the case that no character data is to be saved, just */
+ /* to parse through the section. */
+
+ if ((code != normalEOF) && (code != earlyEOF))
+ {
+ (*fi)->numOfChars = atoi(token(fp));
+ if (flags & (P_M ^ P_W))
+ {
+ (*fi)->cmi = (CharMetricInfo *)
+ calloc((*fi)->numOfChars, sizeof(CharMetricInfo));
+ if ((*fi)->cmi == NULL) {error = storageProblem; return(error);}
+ code = parseCharMetrics(fp, *fi);
+ }
+ else
+ {
+ if (flags & P_W)
+ {
+ (*fi)->cwi = (int *) calloc(256, sizeof(int));
+ if ((*fi)->cwi == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ }
+ /* parse section regardless */
+ code = parseCharWidths(fp, (*fi)->cwi);
+ } /* else */
+ } /* if */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ /* The remaining sections of the AFM are optional. This code will */
+ /* look at the next keyword in the file to determine what section */
+ /* is next, and then allocate the appropriate amount of storage */
+ /* for the data (if the data is to be saved) and call the */
+ /* appropriate parsing routine to parse the section. */
+
+ while ((code != normalEOF) && (code != earlyEOF))
+ {
+ keyword = token(fp);
+ if (keyword == NULL)
+ /* Have reached an early and unexpected EOF. */
+ /* Set flag and stop parsing */
+ {
+ code = earlyEOF;
+ break; /* get out of loop */
+ }
+ switch(recognize(keyword))
+ {
+ case STARTKERNDATA:
+ break;
+ case ENDKERNDATA:
+ break;
+ case STARTTRACKKERN:
+ keyword = token(fp);
+ if (flags & P_T)
+ {
+ (*fi)->numOfTracks = atoi(keyword);
+ (*fi)->tkd = (TrackKernData *)
+ calloc((*fi)->numOfTracks, sizeof(TrackKernData));
+ if ((*fi)->tkd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parseTrackKernData(fp, *fi);
+ break;
+ case STARTKERNPAIRS:
+ keyword = token(fp);
+ if (flags & P_P)
+ {
+ (*fi)->numOfPairs = atoi(keyword);
+ (*fi)->pkd = (PairKernData *)
+ calloc((*fi)->numOfPairs, sizeof(PairKernData));
+ if ((*fi)->pkd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parsePairKernData(fp, *fi);
+ break;
+ case STARTCOMPOSITES:
+ keyword = token(fp);
+ if (flags & P_C)
+ {
+ (*fi)->numOfComps = atoi(keyword);
+ (*fi)->ccd = (CompCharData *)
+ calloc((*fi)->numOfComps, sizeof(CompCharData));
+ if ((*fi)->ccd == NULL)
+ {
+ error = storageProblem;
+ return(error);
+ }
+ } /* if */
+ code = parseCompCharData(fp, *fi);
+ break;
+ case ENDFONTMETRICS:
+ code = normalEOF;
+ break;
+ case NOPE:
+ default:
+ code = parseError;
+ break;
+ } /* switch */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ } /* while */
+
+ if ((error != earlyEOF) && (code < 0)) error = code;
+
+ if (ident != NULL) { free(ident); ident = NULL; }
+
+ return(error);
+
+} /* parseFile */
diff --git a/fonts/utilities/mm/parseAFM.h b/fonts/utilities/mm/parseAFM.h
new file mode 100644
index 0000000000..8e35e14734
--- /dev/null
+++ b/fonts/utilities/mm/parseAFM.h
@@ -0,0 +1,321 @@
+/*
+ * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+ *
+ * ************************************************************************
+ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+ * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+ * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+ * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+ * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+ * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * ************************************************************************
+ */
+
+/* ParseAFM.h
+ *
+ * This header file is used in conjuction with the parseAFM.c file.
+ * Together these files provide the functionality to parse Adobe Font
+ * Metrics files and store the information in predefined data structures.
+ * It is intended to work with an application program that needs font metric
+ * information. The program can be used as is by making a procedure call to
+ * parse an AFM file and have the data stored, or an application developer
+ * may wish to customize the code.
+ *
+ * This header file defines the data structures used as well as the key
+ * strings that are currently recognized by this version of the AFM parser.
+ * This program is based on the document "Adobe Font Metrics Files,
+ * Specification Version 2.0".
+ *
+ * AFM files are separated into distinct sections of different data. Because
+ * of this, the parseAFM program can parse a specified file to only save
+ * certain sections of information based on the application's needs. A record
+ * containing the requested information will be returned to the application.
+ *
+ * AFM files are divided into five sections of data:
+ * 1) The Global Font Information
+ * 2) The Character Metrics Information
+ * 3) The Track Kerning Data
+ * 4) The Pair-Wise Kerning Data
+ * 5) The Composite Character Data
+ *
+ * Basically, the application can request any of these sections independent
+ * of what other sections are requested. In addition, in recognizing that
+ * many applications will want ONLY the x-width of characters and not all
+ * of the other character metrics information, there is a way to receive
+ * only the width information so as not to pay the storage cost for the
+ * unwanted data. An application should never request both the
+ * "quick and dirty" char metrics (widths only) and the Character Metrics
+ * Information since the Character Metrics Information will contain all
+ * of the character widths as well.
+ *
+ * There is a procedure in parseAFM.c, called parseFile, that can be
+ * called from any application wishing to get information from the AFM File.
+ * This procedure expects 3 parameters: a vaild file descriptor, a pointer
+ * to a (FontInfo *) variable (for which space will be allocated and then
+ * will be filled in with the data requested), and a mask specifying
+ * which data from the AFM File should be saved in the FontInfo structure.
+ *
+ * The flags that can be used to set the appropriate mask are defined below.
+ * In addition, several commonly used masks have already been defined.
+ *
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' return code
+ * - fixed typos
+ */
+
+#include <stdio.h>
+
+
+
+/* your basic constants */
+#define TRUE 1
+#define FALSE 0
+#define EOL '\n' /* end-of-line indicator */
+#define MAX_NAME 4096 /* max length for identifiers */
+#define BOOL int
+#define FLAGS int
+
+
+
+/* Flags that can be AND'ed together to specify exactly what
+ * information from the AFM file should be saved.
+ */
+#define P_G 0x01 /* 0000 0001 */ /* Global Font Info */
+#define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */
+#define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */
+#define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */
+#define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */
+#define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */
+
+
+/* Commonly used flags
+ */
+#define P_GW (P_G | P_W)
+#define P_GM (P_G | P_M)
+#define P_GMP (P_G | P_M | P_P)
+#define P_GMK (P_G | P_M | P_P | P_T)
+#define P_ALL (P_G | P_M | P_P | P_T | P_C)
+
+
+
+/* Possible return codes from the parseFile procedure.
+ *
+ * ok means there were no problems parsing the file.
+ *
+ * parseError means that there was some kind of parsing error, but the
+ * parser went on. This could include problems like the count for any given
+ * section does not add up to how many entries there actually were, or
+ * there was a key that was not recognized. The return record may contain
+ * vaild data or it may not.
+ *
+ * earlyEOF means that an End of File was encountered before expected. This
+ * may mean that the AFM file had been truncated, or improperly formed.
+ *
+ * storageProblem means that there were problems allocating storage for
+ * the data structures that would have contained the AFM data.
+ */
+#define ok 0
+#define parseError -1
+#define earlyEOF -2
+#define storageProblem -3
+
+
+
+/************************* TYPES *********************************/
+/* Below are all of the data structure definitions. These structures
+ * try to map as closely as possible to grouping and naming of data
+ * in the AFM Files.
+ */
+
+
+/* Bounding box definition. Used for the Font BBox as well as the
+ * Character BBox.
+ */
+typedef struct
+{
+ int llx; /* lower left x-position */
+ int lly; /* lower left y-position */
+ int urx; /* upper right x-position */
+ int ury; /* upper right y-position */
+} BBox;
+
+
+/* Global Font information.
+ * The key that each field is associated with is in comments. For an
+ * explanation about each key and its value please refer to the AFM
+ * documentation (full title & version given above).
+ */
+typedef struct
+{
+ char *afmVersion; /* key: StartFontMetrics */
+ char *fontName; /* key: FontName */
+ char *fullName; /* key: FullName */
+ char *familyName; /* key: FamilyName */
+ char *weight; /* key: Weight */
+ float italicAngle; /* key: ItalicAngle */
+ BOOL isFixedPitch; /* key: IsFixedPitch */
+ BBox fontBBox; /* key: FontBBox */
+ int underlinePosition; /* key: UnderlinePosition */
+ int underlineThickness; /* key: UnderlineThickness */
+ char *version; /* key: Version */
+ char *notice; /* key: Notice */
+ char *encodingScheme; /* key: EncodingScheme */
+ int capHeight; /* key: CapHeight */
+ int xHeight; /* key: XHeight */
+ int ascender; /* key: Ascender */
+ int descender; /* key: Descender */
+} GlobalFontInfo;
+
+
+/* Ligature definition is a linked list since any character can have
+ * any number of ligatures.
+ */
+typedef struct _t_ligature
+{
+ char *succ, *lig;
+ struct _t_ligature *next;
+} Ligature;
+
+
+/* Character Metric Information. This structure is used only if ALL
+ * character metric information is requested. If only the character
+ * widths is requested, then only an array of the character x-widths
+ * is returned.
+ *
+ * The key that each field is associated with is in comments. For an
+ * explanation about each key and its value please refer to the
+ * Character Metrics section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ int code, /* key: C */
+ wx, /* key: WX */
+ wy; /* together wx and wy are associated with key: W */
+ char *name; /* key: N */
+ BBox charBBox; /* key: B */
+ Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */
+} CharMetricInfo;
+
+
+/* Track kerning data structure.
+ * The fields of this record are the five values associated with every
+ * TrackKern entry.
+ *
+ * For an explanation about each value please refer to the
+ * Track Kerning section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ int degree;
+ float minPtSize,
+ minKernAmt,
+ maxPtSize,
+ maxKernAmt;
+} TrackKernData;
+
+
+/* Pair Kerning data structure.
+ * The fields of this record are the four values associated with every
+ * KP entry. For KPX entries, the yamt will be zero.
+ *
+ * For an explanation about each value please refer to the
+ * Pair Kerning section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *name1;
+ char *name2;
+ int xamt,
+ yamt;
+} PairKernData;
+
+
+/* PCC is a piece of a composite character. This is a sub structure of a
+ * compCharData described below.
+ * These fields will be filled in with the values from the key PCC.
+ *
+ * For an explanation about each key and its value please refer to the
+ * Composite Character section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *pccName;
+ int deltax,
+ deltay;
+} Pcc;
+
+
+/* Composite Character Information data structure.
+ * The fields ccName and numOfPieces are filled with the values associated
+ * with the key CC. The field pieces points to an array (size = numOfPieces)
+ * of information about each of the parts of the composite character. That
+ * array is filled in with the values from the key PCC.
+ *
+ * For an explanation about each key and its value please refer to the
+ * Composite Character section of the AFM documentation (full title
+ * & version given above).
+ */
+typedef struct
+{
+ char *ccName;
+ int numOfPieces;
+ Pcc *pieces;
+} CompCharData;
+
+
+/* FontInfo
+ * Record type containing pointers to all of the other data
+ * structures containing information about a font.
+ * A a record of this type is filled with data by the
+ * parseFile function.
+ */
+typedef struct
+{
+ GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */
+ int *cwi; /* ptr to 256 element array of just char widths */
+ int numOfChars; /* number of entries in char metrics array */
+ CharMetricInfo *cmi; /* ptr to char metrics array */
+ int numOfTracks; /* number to entries in track kerning array */
+ TrackKernData *tkd; /* ptr to track kerning array */
+ int numOfPairs; /* number to entries in pair kerning array */
+ PairKernData *pkd; /* ptr to pair kerning array */
+ int numOfComps; /* number to entries in comp char array */
+ CompCharData *ccd; /* ptr to comp char array */
+} FontInfo;
+
+
+
+/************************* PROCEDURES ****************************/
+
+/* Call this procedure to do the grunt work of parsing an AFM file.
+ *
+ * "fp" should be a valid file pointer to an AFM file.
+ *
+ * "fi" is a pointer to a pointer to a FontInfo record sturcture
+ * (defined above). Storage for the FontInfo structure will be
+ * allocated in parseFile and the structure will be filled in
+ * with the requested data from the AFM File.
+ *
+ * "flags" is a mask with bits set representing what data should
+ * be saved. Defined above are valid flags that can be used to set
+ * the mask, as well as a few commonly used masks.
+ *
+ * The possible return codes from parseFile are defined above.
+ */
+
+extern int parseFile ( /* FILE *fp; FontInfo **fi; FLAGS flags; */ );
diff --git a/fonts/utilities/mm/parseAFMclient.c b/fonts/utilities/mm/parseAFMclient.c
new file mode 100644
index 0000000000..02d24a42d8
--- /dev/null
+++ b/fonts/utilities/mm/parseAFMclient.c
@@ -0,0 +1,346 @@
+/*
+ * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
+ *
+ * This file may be freely copied and redistributed as long as:
+ * 1) This entire notice continues to be included in the file,
+ * 2) If the file has been modified in any way, a notice of such
+ * modification is conspicuously indicated.
+ *
+ * PostScript, Display PostScript, and Adobe are registered trademarks of
+ * Adobe Systems Incorporated.
+ *
+ * ************************************************************************
+ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
+ * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
+ * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
+ * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
+ * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
+ * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * ************************************************************************
+ */
+
+/* parseAFMclient.c
+ *
+ * This file is an example of how an application might use the provided
+ * AFM Parser (parseAFM.c).
+ *
+ * In a nutshell, the client of the parser (like this file) chooses
+ * the AFM File that it wishes to have parsed, opens the file for
+ * reading (and does any/all error handling associated with that task),
+ * and passes the resulting file pointer to the procedure "parseFile"
+ * (in parseAFM.c). In addition to the file pointer, the client also
+ * needs to pass a pointer to a FontInfo record type (for which storage
+ * will be allocated and data filled in), and a mask representing which
+ * sections of the AFM should be saved in the FontInfo record.
+ *
+ * In the procedure "main", the mask is built from command line switches,
+ * but your application, of course, can set that mask any way you prefer.
+ * "main" then calls the "parseFile" procedure (of parseAFM.c) to do the
+ * grunt work, and checks the error codes upon "parseFile"'s return.
+ *
+ * The rest of this sample application is a collection of print routines
+ * that show how to reference each of the sections of data and a
+ * "freeStorage" routine (that many unix programmers may feel they
+ * don't need but is included for portability to other systems that do
+ * need to manage storage). The print procedures are there just to
+ * give meaning to this application, and hopefully your application
+ * will use the data collected from the AFM file in a more useful way.
+ *
+ * History:
+ * original: DSM Thu Oct 20 17:39:59 PDT 1988
+ * modified: DSM Mon Jul 3 14:17:50 PDT 1989
+ * - added 'storageProblem' check in main
+ */
+
+#include <stdio.h>
+#include "parseAFM.h"
+
+
+/*************************** GLOBALS ***************************/
+FontInfo *fi;
+FLAGS myflags = 0;
+
+
+/*************************** printGlobals **********************/
+
+printGlobals()
+{
+ printf("StartFontMetrics %s\n", fi->gfi->afmVersion);
+ printf("FontName %s\n", fi->gfi->fontName);
+ printf("FullName %s\n", fi->gfi->fullName);
+ printf("FamilyName %s\n", fi->gfi->familyName);
+ printf("Weight %s\n", fi->gfi->weight);
+ printf("ItalicAngle %3.1f\n", fi->gfi->italicAngle);
+ if (fi->gfi->isFixedPitch)
+ printf("IsFixedPitch true\n");
+ else
+ printf("IsFixedPitch false\n");
+ printf("UnderlinePosition %d\n", fi->gfi->underlinePosition);
+ printf("UnderlineThickness %d\n", fi->gfi->underlineThickness);
+ printf("Version %s\n", fi->gfi->version);
+ printf("FontBBox %d %d %d %d\n",
+ fi->gfi->fontBBox.llx, fi->gfi->fontBBox.lly,
+ fi->gfi->fontBBox.urx, fi->gfi->fontBBox.ury);
+ printf("Notice %s\n", fi->gfi->notice);
+ printf("EncodingScheme %s\n", fi->gfi->encodingScheme);
+ printf("CapHeight %d\n", fi->gfi->capHeight);
+ printf("XHeight %d\n", fi->gfi->xHeight);
+ printf("Descender %d\n", fi->gfi->descender);
+ printf("Ascender %d\n", fi->gfi->ascender);
+
+} /* printGlobals */
+
+
+/*************************** printCharWidths *********************/
+printCharWidths()
+{
+ int i = 0;
+ for (i = 0; i < 256; ++i)
+ printf(" code: %3d width: %4d\n", i, fi->cwi[i]);
+ printf("\n");
+
+} /* printCharWidths */
+
+
+/*************************** printAllCharMetrics *****************/
+printAllCharMetrics()
+{
+ int i = 0;
+ CharMetricInfo *temp = fi->cmi;
+ Ligature *node = temp->ligs;
+ printf("StartCharMetrics %d\n", fi->numOfChars);
+ for (i = 0; i < fi->numOfChars; ++i)
+ {
+ printf(
+ "C %d ; WX %d ; N %s ; B %d %d %d %d ;",
+ temp->code, temp->wx, temp->name, temp->charBBox.llx,
+ temp->charBBox.lly, temp->charBBox.urx, temp->charBBox.ury);
+ for (node = temp->ligs; node != NULL; node = node->next)
+ {
+ printf(" L %s %s ;", node->succ, node->lig);
+ }
+ printf("\n");
+ temp++;
+ } /* for */
+ printf("EndCharMetrics\n");
+
+} /* printAllCharMetrics */
+
+
+/*************************** printKernPairData ******************/
+printKernPairData()
+{
+ int i = 0;
+ PairKernData *pkd = fi->pkd;
+
+ if (fi->numOfPairs != 0)
+ {
+ printf("StartKernData\n");
+ printf("StartKernPairs %d\n",fi->numOfPairs);
+ for (i = 0; i < fi->numOfPairs; ++i)
+ printf(
+ "KPX %s %s %d\n",
+ pkd[i].name1, pkd[i].name2, pkd[i].xamt);
+/* "KPX %s %s %d %d\n",
+ pkd[i].name1, pkd[i].name2, pkd[i].xamt, pkd[i].yamt); */
+ printf("EndKernPairs\n");
+ printf("EndKernData\n");
+ }
+
+} /* printKernPairData */
+
+
+/*************************** printKernTrackData *******************/
+printKernTrackData()
+{
+ int i = 0;
+ TrackKernData *tkd = fi->tkd;
+
+ if (fi->numOfTracks != 0)
+ {
+ printf("StartTrackKern %d\n",fi->numOfTracks);
+ for (i = 0; i < fi->numOfTracks; ++i)
+ printf(
+ "TrackKern %d %d %d %d %d\n",
+ tkd[i].degree, tkd[i].minPtSize, tkd[i].minKernAmt,
+ tkd[i].maxPtSize, tkd[i].maxKernAmt);
+ printf("EndTrackKern\n");
+ }
+
+} /* printKernTrackData */
+
+
+/*************************** printCompCharData ********************/
+printCompCharData()
+{
+ int i = 0, j = 0;
+ CompCharData *ccd = fi->ccd;
+
+ if (fi->numOfComps != 0)
+ {
+ printf("StartComposites %d\n",fi->numOfComps);
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ printf("CC %s %d ;",
+ ccd[i].ccName, ccd[i].numOfPieces);
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ printf(
+ " PCC %s %d %d ;", ccd[i].pieces[j].pccName,
+ ccd[i].pieces[j].deltax, ccd[i].pieces[j].deltay);
+ printf("\n");
+ }
+ printf("EndComposites\n");
+ }
+
+} /* printCompCharData */
+
+
+
+/*************************** freeStorage ***********************/
+
+freeStorage()
+{
+ if (fi != NULL)
+ {
+ if (fi->gfi != NULL)
+ {
+ free(fi->gfi->afmVersion); fi->gfi->afmVersion = NULL;
+ free(fi->gfi->fontName); fi->gfi->fontName = NULL;
+ free(fi->gfi->fullName); fi->gfi->fullName = NULL;
+ free(fi->gfi->familyName); fi->gfi->familyName = NULL;
+ free(fi->gfi->weight); fi->gfi->weight = NULL;
+ free(fi->gfi->version); fi->gfi->version = NULL;
+ free(fi->gfi->notice); fi->gfi->notice = NULL;
+ free(fi->gfi->encodingScheme); fi->gfi->encodingScheme = NULL;
+ free(fi->gfi); fi->gfi = NULL;
+ }
+
+ if (fi->cwi != NULL)
+ { free(fi->cwi); fi->cwi = NULL; }
+
+ if (fi->cmi != NULL)
+ {
+ int i = 0;
+ CharMetricInfo *temp = fi->cmi;
+ Ligature *node = temp->ligs;
+
+ for (i = 0; i < fi->numOfChars; ++i)
+ {
+ for (node = temp->ligs; node != NULL; node = node->next)
+ {
+ free(node->succ); node->succ = NULL;
+ free(node->lig); node->lig = NULL;
+ }
+
+ free(temp->name); temp->name = NULL;
+ temp++;
+ }
+
+ free(fi->cmi); fi->cmi = NULL;
+ }
+
+ if (fi->tkd != NULL)
+ { free(fi->tkd); fi->tkd = NULL; }
+
+ if (fi->pkd != NULL)
+ {
+ free(fi->pkd->name1); fi->pkd->name1 = NULL;
+ free(fi->pkd->name2); fi->pkd->name2 = NULL;
+ free(fi->pkd); fi->pkd = NULL;
+ }
+
+ if (fi->ccd != NULL)
+ {
+ int i = 0, j = 0;
+ CompCharData *ccd = fi->ccd;
+
+ for (i = 0; i < fi->numOfComps; ++i)
+ {
+ for (j = 0; j < ccd[i].numOfPieces; ++j)
+ {
+ free(ccd[i].pieces[j].pccName);
+ ccd[i].pieces[j].pccName = NULL;
+ }
+
+ free(ccd[i].ccName); ccd[i].ccName = NULL;
+ }
+
+ free(fi->ccd); fi->ccd = NULL;
+ }
+
+ free(fi);
+
+ } /* if */
+
+} /* freeStorage */
+
+
+/*************************** printValues **************************/
+
+printValues()
+{
+ if (fi->gfi != NULL) printGlobals();
+ if (fi->cmi != NULL) printAllCharMetrics();
+ if (fi->pkd != NULL) printKernPairData();
+ if (fi->tkd != NULL) printKernTrackData();
+ if (fi->ccd != NULL) printCompCharData();
+ printf("EndFontMetrics\n");
+
+} /* printValues */
+
+
+
+/*************************** main *********************************/
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *filename, *prog = *argv;
+ FILE *fp;
+
+ ++argv; --argc; myflags |= P_ALL;
+
+ if (!argc)
+ {
+ printf(" usage: parseAFM [AFM File]\n");
+ exit(0);
+ }
+ else
+ filename = *argv;
+
+ if (!filename[0])
+ {
+ printf ("*** ERROR: can't open. filename is missing.\n",
+ filename );
+ return 0;
+ }
+
+ fp = fopen(filename, "r" );
+ if (fp == NULL)
+ {
+ printf ("*** ERROR: can't find: %s\n", filename );
+ exit(1);
+ }
+
+ switch (parseFile(fp, &fi, myflags))
+ {
+ case parseError:
+ printf("*** ERROR: problem in parsing the AFM File.\n");
+ case ok:
+ fclose(fp);
+ printValues();
+ freeStorage();
+ break;
+ case earlyEOF:
+ printf("The AFM File ended prematurely.\n");
+ break;
+ case storageProblem:
+ printf("*** ERROR: problem allocating storage.\n");
+ break;
+ default:
+ break;
+ }
+
+} /* main */
diff --git a/fonts/utilities/otfinst/README b/fonts/utilities/otfinst/README
new file mode 100644
index 0000000000..315f03b6f1
--- /dev/null
+++ b/fonts/utilities/otfinst/README
@@ -0,0 +1,7 @@
+otfinst takes a list of OpenType font files as input, uses Eddie Kohler's
+otftotfm to install them into a TeX/LaTeX system, and builds and installs
+the necessary font description and style files. otfinst was formerly known
+as otftex_install and is written in Python. It has similar capabilities to
+Marc Penninga's fontools.
+
+For more, see http://www.ece.ucdavis.edu/~jowens/code/otfinst/ . \ No newline at end of file
diff --git a/fonts/utilities/otfinst/otfinst.py b/fonts/utilities/otfinst/otfinst.py
new file mode 100644
index 0000000000..cf79ab3ccd
--- /dev/null
+++ b/fonts/utilities/otfinst/otfinst.py
@@ -0,0 +1,748 @@
+#!/usr/bin/env python
+
+# otfinst version 1.0.3 2 January 2007
+# http://www.ece.ucdavis.edu/~jowens/code/otfinst/
+# Formerly known as otftex_install
+#
+# usage: As arguments, takes OTF font files or directories where the
+# OTF font files are located. Configuration is within this file.
+
+# Copyright (c) 2005, 2006, John Owens <jowens at ece.ucdavis.edu>,
+# University of California, Davis. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# Neither the name of the University of California nor the names of
+# its contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission. THIS
+# SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import sys, os, re, math, time, datetime, operator, glob
+
+#######################################
+# BEGIN USER-SETTABLE VARIABLES
+#######################################
+
+# which encoding are we using?
+encoding = 'LY1'
+
+# "encoding" (above) should have a dict entry in "encodings" that specifies
+# the two-letter berry designation for the encoding and the command-line
+# options to otftotfm that work for the encoding
+encodings = { 'LY1':
+ { 'berryencoding': '8y',
+ 'commandline': '-e texnansx',
+ },
+ }
+
+# kpsewhich will look up the right TEXMFHOME directory, but within that,
+# where do local fonts go?
+localfontsdir = '/tex/latex/localfonts/'
+
+# which OpenType options do we support in this script?
+# add more to optionList if you want the script to support them
+optionList = [
+ # in optionList, each element is itself a list
+ # we generate options by always picking one choice from each element
+ # and taking all permutations of those choices
+ ['kern'], # always selected
+ ['liga'],
+ ['lnum', 'onum', 'swsh', 'sinf', 'sups', 'pnum', 'fakenum'], # one of these
+ ['smcp', ''], # either smcp or nothing
+ ]
+
+# categorize the OpenType options above
+# globalOptionList contains options that we should apply to all fonts
+globalOptionList = ['kern', 'liga']
+# newFontFamilyOptionList has options that create new font families
+newFontFamilyOptionList = ['lnum', 'onum', 'swsh', 'sinf', 'sups', 'pnum',
+ 'fakenum']
+# weightOptionsList contains options that modify the weight
+weightOptionList = []
+# widthOptionsList contains options that modify the width
+widthOptionList = []
+# variantOptionsList contains options that modify the variant
+variantOptionList = ['smcp']
+# fakeOptionList contains options that aren't real OpenType options
+fakeOptionList = [
+ 'fakenum' # fakenum is if no ?num is available
+ ]
+
+# options and their Berry encodings
+# contains both:
+# - features (4 letters) and their mappings (lnum, onum, smcp)
+# (found in otfinfo --features)
+# - subfamily attributes (italic, bold, etc.)
+# (found in otfinfo --info, subfamily field)
+optionMappings = {
+ # OpenType command line options
+ 'lnum' : 'x',
+ 'onum' : 'j',
+ 'fakenum' : '', # we manually put this in if lnum and
+ # onum are not present so we get
+ # something out
+ 'swsh' : 'w',
+ 'sinf' : '0',
+ 'sups' : '1',
+ 'pnum' : '2',
+ 'smcp' : 'sc', # also a variant
+ # weights
+ 'thin' : 'ul',
+ 'extralight' : 'el',
+ 'light' : 'l',
+ 'book' : 'm',
+ 'medium' : 'mb',
+ 'demibold' : 'db',
+ 'semibold' : 'sb',
+ 'bold' : 'b',
+ 'black' : 'eb',
+ 'heavy' : 'eb',
+ # widths
+ 'condensed' : 'c',
+ 'cond' : 'c',
+ 'narrow' : 'n',
+ 'semicondensed' : 'sc',
+ 'semiextended' : 'sx',
+ 'extended' : 'x',
+ # variants
+ 'italic' : 'it',
+ 'slanted' : 'sl',
+ 'oblique' : 'sl',
+ 'outline' : 'ol',
+ # regular is the default
+ 'regular' : '',
+ }
+
+# each font has a 3-letter designation
+# it's the first 3 letters from
+# http://www.tex.ac.uk/tex-archive/info/fontname/adobe.map
+# font names are what's returned from "otfinfo --family fontfile.otf"
+berryname = { 'Minion Pro' : 'pmn',
+ 'Myriad Pro' : 'pmy',
+ 'Adobe Garamond Pro' : 'pag',
+ 'Adobe Caslon Pro' : 'pac',
+ 'Adobe Jenson Pro' : 'paj',
+ 'Utopia Std' : 'put',
+ 'Warnock Pro' : 'pwp',
+ 'Kepler Std' : 'pkp',
+ 'Prestige Elite Std' : 'ppe',
+ 'Calibri' : 'jk0',
+ 'Cambria' : 'jk1',
+ 'Candara' : 'jk2',
+ 'Consolas' : 'jk3',
+ 'Constantia' : 'jk4',
+ 'Corbel' : 'jk5',
+ 'Arno Pro' : 'pa0',
+ 'ScalaSansPro' : '0sa',
+ 'Hypatia Sans Pro' : 'phy',
+ }
+
+# if you would like to scale the font by default, set it here as a float
+scaled = { 'Minion Pro' : 1.0,
+ }
+
+#######################################
+# END USER-SETTABLE VARIABLES
+#######################################
+
+#######################################
+# BEGIN UTILITY FUNCTIONS
+#######################################
+
+def letterize(s):
+ s = s.replace('0', 'zero')
+ s = s.replace('1', 'one')
+ s = s.replace('2', 'two')
+ s = s.replace('3', 'three')
+ s = s.replace('4', 'four')
+ s = s.replace('5', 'five')
+ s = s.replace('6', 'six')
+ s = s.replace('7', 'seven')
+ s = s.replace('8', 'eight')
+ s = s.replace('9', 'nine')
+ return s
+
+glyfRE = re.compile("glyf")
+CFFRE = re.compile("CFF")
+# User can redefine if necessary; used to prune candidate list of fonts
+def isValidFontFile(filename):
+ # return os.system("otfinfo --info -q %s" % filename) == 0
+ fields = os.popen("otfinfo -qt '%s'" % filename, 'r').readlines()
+ # otfinfo -qt returns the fields in the font file; "glyf" means TrueType
+ # and "CFF" means PostScript
+ for line in fields:
+ if glyfRE.search(line):
+ print "%s (TTF)" % filename
+ return True
+ if CFFRE.search(line):
+ print "%s (PS)" % filename
+ return True
+ return False
+
+# Eddie Kohler's shell script for determining OTF type
+# otfflavor () {
+# # Returns 0 for not OTF, 1 for CFF-flavored, 2 for TTF-flavored
+# otfinfo -qt $1 | awk '/glyf/ { exit 2 }
+# /CFF/ { exit 1 }'
+# }
+
+def generateFontfiles(l):
+ # Get all candidate files. This works as follows:
+ # 1) glob the input list, resulting in a list
+ # 2)a) if anything in that list is a file, add it to the fontfiles list
+ # 2)b) if anything in that list is a dir, add its subfiles to
+ # the fontfiles list
+ # start off assuming everything is a dir
+ gl = []
+ fontfiles = []
+ for item in l:
+ gl += glob.glob('%s*' % item)
+ for item in gl:
+ if os.path.isdir(item):
+ for file in os.listdir(item):
+ fontfiles.append(os.path.join(item, file))
+ if os.path.isfile(item):
+ fontfiles.append(item)
+ print "Installing following font files:"
+ fontfiles = filter(isValidFontFile, fontfiles)
+ return fontfiles
+
+# http://www.microsoft.com/typography/otspec/recom.htm
+# We recommend using name ID's 8-12, to identify manufacturer,
+# designer, description, URL of the vendor, and URL of the designer.
+# URL's must contain the protocol of the site: for example, http:// or
+# mailto: or ftp://. The OpenType font properties extension can
+# enumerate this information to the users.
+#
+# The Subfamily string in the 'name' table should be used for variants
+# of weight (ultra light to extra black) and style (oblique/italic or
+# not). So, for example, the full font name of "Helvetica Narrow
+# Italic" should be defined as Family name "Helvetica Narrow" and
+# Subfamily "Italic". This is so that Windows can group the standard
+# four weights of a font in a reasonable fashion for
+# non-typographically aware applications which only support
+# combinations of "bold" and "italic."
+#
+# The Full font name string usually contains a concatenation of
+# strings 1 and 2. However, if the font is 'Regular' as indicated in
+# string 2, then use only the family name contained in string 1. This
+# is the font name that Windows will expose to users.
+
+otfinfoversionRE = re.compile("([0-9]+\.[0-9]+)")
+otfinfoRE = re.compile("^(.*):\s+(.*)$")
+urlRE = re.compile("(\w*)\.(com|net|org|edu|de|fr|co\.uk)")
+opticalRE = re.compile("size range \(([\d.]+) pt, ([\d.]+) pt\]")
+
+# list-to-string and string-to-list primitives (useful when we want to
+# index into a hash with a list - we use a string instead)
+sep = '-'
+def l2s(l):
+ return sep.join(l)
+
+def s2l(s):
+ if not s:
+ return []
+ return s.split(sep)
+
+# otfinfo requires version 2.38 or higher of otfinfo (which supports --info)
+def checkOTFInfoVersion():
+ otfiv = os.popen("otfinfo --version").read()
+ m = otfinfoversionRE.search(otfiv)
+ if float(m.group(1)) < 2.38:
+ sys.stderr.write("Your otfinfo version is currently %s.\nPlease upgrade your otfinfo version to at least 2.38.\n" % m.group(1))
+ sys.exit()
+
+# given a font file, populates fonthash for that font file
+# calls classifyFont on each font file too
+def addToFonthash(font):
+ postScriptName = os.popen("otfinfo --postscript-name '%s'" % font).read()[:-1]
+ fonthash[postScriptName] = {}
+ fonthash[postScriptName]['filename'] = font
+ info = os.popen("otfinfo --info '%s'" % font).read()[:-1]
+ for line in info.split('\n'):
+ m = otfinfoRE.search(line)
+ if m:
+ if (m.group(1) == 'Family') or (m.group(1) == 'Preferred family'):
+ # 'preferred family' preferred over 'family'; relies on it coming last
+ # which it should under otfinfo
+ fonthash[postScriptName]['family'] = m.group(2)
+ elif (m.group(1) == 'Subfamily') or (m.group(1) == 'Preferred subfamily'):
+ # 'preferred subfamily' preferred over 'subfamily'; relies on
+ # it coming last which it should under otfinfo
+ # this RE separates both 'Aa Bb' and 'AaBb' into ['aa', 'bb']
+ fonthash[postScriptName]['subfamily'] = \
+ re.sub("(?<=[a-z])(?=[A-Z])", " ", m.group(2)).lower().split()
+ if 'roman' in fonthash[postScriptName]['subfamily']:
+ # replace 'roman' with 'regular'
+ roman_id = fonthash[postScriptName]['subfamily'].index('roman')
+ fonthash[postScriptName]['subfamily'][roman_id] = 'regular'
+ while 'extra' in fonthash[postScriptName]['subfamily']:
+ # combine 'extra' with next element, delete 'extra'
+ extra_id = fonthash[postScriptName]['subfamily'].index('extra')
+ fonthash[postScriptName]['subfamily'][extra_id+1] = \
+ 'extra' + fonthash[postScriptName]['subfamily'][extra_id+1]
+ fonthash[postScriptName]['subfamily'].remove('extra')
+ elif m.group(1) == 'Vendor URL':
+ fonthash[postScriptName]['vendor'] = urlRE.search(m.group(2)).group(1)
+ if 'vendor' not in fonthash[postScriptName].keys():
+ fonthash[postScriptName]['vendor'] = 'generic'
+ features = os.popen("otfinfo --features '%s'" % font).read()[:-1]
+ opticalSize = os.popen("otfinfo --optical-size '%s'" % font).read()[:-1]
+ m = opticalRE.search(opticalSize)
+ if m:
+ # convert from OTF's (exclusive, inclusive] to TeX's [inclusive, exclusive)
+ # OTF measures in decipoints, so add 0.1 to each size
+ fonthash[postScriptName]['opticalSize'] = [str(float(m.group(1)) + 0.1),
+ str(float(m.group(2)) + 0.1)]
+ else:
+ fonthash[postScriptName]['opticalSize'] = []
+ fonthash[postScriptName]['weight'] = []
+ fonthash[postScriptName]['width'] = []
+ fonthash[postScriptName]['variant'] = []
+ for s in fonthash[postScriptName]['subfamily']:
+ if s in ['regular', 'thin', 'extralight', 'light', 'book', 'medium', 'regular', 'demibold', 'semibold', 'bold', 'heavy', 'black']:
+ fonthash[postScriptName]['weight'].append(s)
+ if s in ['regular', 'condensed', 'cond', 'semicondensed', 'narrow', 'semiextended', 'extended']:
+ fonthash[postScriptName]['width'].append(s)
+ if s in ['regular', 'italic', 'slanted', 'oblique', 'outline']:
+ fonthash[postScriptName]['variant'].append(s)
+ fonthash[postScriptName]['weight'].sort()
+ fonthash[postScriptName]['width'].sort()
+ fonthash[postScriptName]['variant'].sort()
+ fonthash[postScriptName]['weight'] = l2s(fonthash[postScriptName]['weight'])
+ fonthash[postScriptName]['width'] = l2s(fonthash[postScriptName]['width'])
+ fonthash[postScriptName]['variant'] = l2s(fonthash[postScriptName]['variant'])
+ numFeatureCount = 0
+ fonthash[postScriptName]['features'] = []
+ for line in features.split('\n'):
+ if line[1:4] == 'num':
+ numFeatureCount += 1
+ fonthash[postScriptName]['features'].append(line[0:4])
+ if numFeatureCount == 0:
+ fonthash[postScriptName]['features'].append('fakenum')
+ # if no other ?num are present, add 'fakenum'
+ classifyFont(postScriptName)
+
+# populates classifiedFonts from fonthash
+def classifyFont(postScriptName):
+ # classifiedFonts[postScriptName][weight][width][variant] contains list of opticals
+ family = fonthash[postScriptName]['family']
+ weight = fonthash[postScriptName]['weight']
+ width = fonthash[postScriptName]['width']
+ variant = fonthash[postScriptName]['variant']
+ if family not in classifiedFonts.keys():
+ classifiedFonts[family] = {}
+ if weight not in classifiedFonts[family].keys():
+ classifiedFonts[family][weight] = {}
+ if width not in classifiedFonts[family][weight].keys():
+ classifiedFonts[family][weight][width] = {}
+ if variant not in classifiedFonts[family][weight][width].keys():
+ classifiedFonts[family][weight][width][variant] = []
+ classifiedFonts[family][weight][width][variant].append([postScriptName, fonthash[postScriptName]['opticalSize']])
+
+# generates Berry series from list of series options
+def buildSeries(weight, width):
+ seriesopts = unique(s2l(weight) + s2l(width))
+ if l2s(seriesopts) == 'regular' or not seriesopts:
+ return 'm'
+ series = ''
+ for s in seriesopts:
+ series += optionMappings[s]
+ return series
+
+# generates Berry shape from list of shape options
+def buildShape(variant):
+ shapeopts = unique(s2l(variant))
+ if l2s(shapeopts) == 'regular' or not shapeopts:
+ return 'n'
+ shape = ''
+ if ('italic' in shapeopts) and ('smcp' in shapeopts):
+ shapeopts.remove('italic')
+ shapeopts.remove('smcp')
+ shape += 'si'
+ for s in shapeopts:
+ shape += optionMappings[s]
+ return shape
+
+# populates explodedFonts from classifiedFonts
+def populateFontDataStructures():
+ for family in classifiedFonts.keys():
+ for weight in classifiedFonts[family].keys():
+ for width in classifiedFonts[family][weight].keys():
+ for variant in classifiedFonts[family][weight][width].keys():
+ for font in classifiedFonts[family][weight][width][variant]:
+ name = font[0]
+ myOptionList = []
+ for o in optionList:
+ opt = []
+ for oo in o:
+ if not oo or oo in fonthash[name]['features']:
+ opt.append(oo)
+ if opt:
+ myOptionList.append(opt)
+ for o in breakout(myOptionList):
+ xfamily = [ fonthash[name]['family'] ]
+ xweight = weight
+ xwidth = width
+ xvariant = variant
+ cmdlineoptions = []
+ for oo in o:
+ if oo in globalOptionList and oo not in fakeOptionList:
+ cmdlineoptions.append(oo)
+ if oo in newFontFamilyOptionList and oo not in fakeOptionList:
+ xfamily.append(oo)
+ if oo in weightOptionList and oo not in fakeOptionList:
+ xweight = l2s(s2l(weight) + [oo])
+ cmdlineoptions.append(oo)
+ if oo in widthOptionList and oo not in fakeOptionList:
+ xwidth = l2s(s2l(width) + [oo])
+ cmdlineoptions.append(oo)
+ if oo in variantOptionList and oo not in fakeOptionList:
+ xvariant = l2s(s2l(variant) + [oo])
+ cmdlineoptions.append(oo)
+ xfamily = l2s(xfamily)
+ # print name, xfamily, xseries, xshape, cmdlineoptions
+ # print l2s([encoding, name] + s2l(xfamily)[1:] + cmdlineoptions),
+ # for f in (s2l(xfamily)[1:] + cmdlineoptions):
+ # print '-f%s' % f,
+ # print
+ # print xfamily, '|', xweight, '|', xwidth, '|', buildSeries(xweight, xwidth), '|', xvariant, '|', buildShape(xvariant), '|', name
+ series = buildSeries(xweight, xwidth)
+ shape = buildShape(xvariant)
+ optical = l2s(fonthash[name]['opticalSize'])
+ if xfamily not in explodedFonts.keys():
+ explodedFonts[xfamily] = {}
+ if series not in explodedFonts[xfamily].keys():
+ explodedFonts[xfamily][series] = {}
+ if shape not in explodedFonts[xfamily][series].keys():
+ explodedFonts[xfamily][series][shape] = {}
+ if optical not in explodedFonts[xfamily][series][shape].keys():
+ explodedFonts[xfamily][series][shape][optical] = {}
+ explodedFonts[xfamily][series][shape][optical]['filename'] = fonthash[name]['filename']
+ explodedFonts[xfamily][series][shape][optical]['family'] = fonthash[name]['family']
+ explodedFonts[xfamily][series][shape][optical]['vendor'] = fonthash[name]['vendor']
+ explodedFonts[xfamily][series][shape][optical]['fontname'] = l2s([encoding, name] + s2l(xfamily)[1:] + cmdlineoptions)
+ explodedFonts[xfamily][series][shape][optical]['cmdlineoptions'] = ''
+ for f in (s2l(xfamily)[1:] + cmdlineoptions):
+ explodedFonts[xfamily][series][shape][optical]['cmdlineoptions'] += '-f%s ' % f
+
+# generates .fd files for each font family, .sty file for the typeface
+# does the right thing if multiple typefaces/font families
+# requires that explodedFonts is populated
+def generateFDandSTY():
+ styfiles = {}
+ for family in explodedFonts.keys():
+ fontbase = s2l(family)[0]
+ fontoptions = s2l(family)[1:]
+ if fontbase in styfiles.keys():
+ styfiles[fontbase].append(fontoptions)
+ else:
+ styfiles[fontbase] = [ fontoptions ]
+ fdfilebase = encoding.lower()
+ if fontbase not in berryname.keys():
+ sys.stderr.write("Error: The three-letter Berry ID for font '%s' must be\n added to the 'berryname' hash. Please add it as '%s': 'xxx',\n replacing 'xxx' with the three-letter Berry ID.\n" % (fontbase, fontbase))
+ sys.exit()
+ fontname = berryname[fontbase]
+ for o in fontoptions:
+ fontname += optionMappings[o]
+ fdfilebase += fontname
+ print "Generating", (fdfilebase + ".fd")
+ texmfhome = filenameInLocaldir(fdfilebase + ".fd")
+ print texmfhome
+ fddest = open(texmfhome, 'w')
+ print >> fddest, ("%% Autogenerated by %s on %s" %
+ (sys.argv[0],
+ datetime.date.today().strftime("%Y/%m/%d")))
+ longsuffix = fontoptions
+ print >> fddest, ("\ProvidesFile{%s.fd}[%s %s/%s]" %
+ (fdfilebase, datetime.date.today().strftime("%Y/%m/%d"),
+ encoding, family))
+ # example of scaling from Helvetica:
+ # \expandafter\ifx\csname Hv@scale\endcsname\relax
+ # \let\Hv@@scale\@empty
+ # \else
+ # \edef\Hv@@scale{s*[\csname Hv@scale\endcsname]}%
+ # \fi
+ print >> fddest, r"\expandafter\ifx\csname %s@scaled\endcsname\relax" % letterize(berryname[fontbase])
+ if fontbase in scaled.keys():
+ print >> fddest, r" \edef\%s@scaled{s*[%f]}%%" % (letterize(berryname[fontbase]), scaled[fontbase])
+ else:
+ print >> fddest, r" \let\%s@scaled\@empty" % letterize(berryname[fontbase])
+ print >> fddest, r"\fi"
+ print >> fddest, "\n\\DeclareFontFamily{%s}{%s}{}" % (encoding, fontname)
+ for se in explodedFonts[family].keys():
+ for sh in explodedFonts[family][se].keys():
+ print >> fddest, ("\\DeclareFontShape{%s}{%s}{%s}{%s}{" %
+ (encoding, fontname, se, sh))
+ opticalkeys = explodedFonts[family][se][sh].keys()
+ sz = len(opticalkeys)
+ if sz > 1:
+ # sort by size range
+ opticalkeys.sort(lambda a,b: cmp(float(a.split('-')[0]),
+ float(b.split('-')[0])))
+ # then lop off the lowest start point and highest end point
+ for op in opticalkeys:
+ if sz > 1:
+ range = op
+ if range == opticalkeys[0]:
+ range = '-' + range.split('-')[1]
+ elif range == opticalkeys[-1]:
+ range = range.split('-')[0] + '-'
+ print >> fddest, " <%s> " % range,
+ else:
+ print >> fddest, " <-> ",
+ print >> fddest, "\%s@scaled " % letterize(berryname[fontbase]),
+ print >> fddest, "%s" % explodedFonts[family][se][sh][op]['fontname']
+ # example command line:
+ # otftotfm -a -e texnansx --no-create /Volumes/Adobe\ Type\ Classics/Western\ Fonts/Adobe\ Caslon\ Pro/ACaslonPro-Regular.otf -fkern -fliga LY1--AdobeCaslonPro-Regular
+
+ installcommands.append("otftotfm --no-updmap -a %s --typeface '%s' --vendor '%s' '%s' %s %s" %
+ (encodings[encoding]['commandline'],
+ niceFontName(explodedFonts[family][se][sh][op]['family']),
+ explodedFonts[family][se][sh][op]['vendor'],
+ explodedFonts[family][se][sh][op]['filename'],
+ explodedFonts[family][se][sh][op]['cmdlineoptions'],
+ explodedFonts[family][se][sh][op]['fontname']))
+ print >> fddest, "}{}"
+ # rest of fd part:
+ # - substitutes slanted with italic if slanted not available
+ # - substitutes italic with slanted if italic not available
+ # - substitutes bold extended with bold if bold extended not available
+ # - substitutes bold extended slanted with bxit if bxsl not available
+ for sh in [ ['sl', 'it'], ['it', 'sl'] ]:
+ # sh[0] is replacement sh, sh[1] is old sh
+ for se in explodedFonts[family].keys():
+ if sh[0] in explodedFonts[family][se].keys() and sh[1] not in explodedFonts[family][se].keys():
+ print >> fddest, ("\\DeclareFontShape{%s}{%s}{%s}{%s}{" %
+ (encoding, fontname, se, sh[1]))
+ print >> fddest, " <-> sub * %s/%s/%s" % (fontname, se, sh[0])
+ print >> fddest, "}{}"
+
+ if 'b' in explodedFonts[family].keys() and 'bx' not in explodedFonts[family].keys():
+ se = 'b'
+ for sh in explodedFonts[family][se]:
+ print >> fddest, ("\\DeclareFontShape{%s}{%s}{%s}{%s}{" %
+ (encoding, fontname, 'bx', sh))
+ print >> fddest, " <-> sub * %s/%s/%s" % (fontname, se, sh)
+ print >> fddest, "}{}"
+
+ sh = 'sl'
+ if 'it' in explodedFonts[family][se].keys() and sh not in explodedFonts[family][se].keys():
+ print >> fddest, ("\\DeclareFontShape{%s}{%s}{%s}{%s}{" %
+ (encoding, fontname, 'bx', sh))
+ print >> fddest, " <-> sub * %s/%s/%s" % (fontname, se, 'it')
+ print >> fddest, "}{}"
+ print >> fddest, "\n\\endinput"
+ fddest.close()
+
+ for fontbase in styfiles.keys():
+ styoptions = styfiles[fontbase]
+ print styoptions
+ styname = niceFontName(fontbase)
+ filename = filenameInLocaldir(styname + '.sty')
+ stydest = open(filename, 'w')
+ print >> stydest, ("%% Autogenerated by %s on %s" %
+ (sys.argv[0],
+ datetime.date.today().strftime("%Y/%m/%d")))
+ print >> stydest, r"\NeedsTeXFormat{LaTeX2e}"
+ print >> stydest, (r"\ProvidesPackage{%s}[%s %s]" %
+ (styname, datetime.date.today().strftime("%Y/%m/%d"),
+ fontbase))
+ print >> stydest, r"\RequirePackage[%s]{fontenc}" % encoding
+ print >> stydest, r"\RequirePackage{textcomp}"
+ print >> stydest, r"\RequirePackage{xkeyval}"
+ print >> stydest, r"\RequirePackage{nfssext}"
+ seensups = 0
+ seensinf = 0
+ for o in styoptions:
+ if 'sups' in o:
+ seensups = 1
+ if 'sinf' in o:
+ seensinf = 1
+ if seensups:
+ print >> stydest, r"\def\@makefnmark{\hbox{\sustyle\@thefnmark}}"
+ if seensinf:
+ print >> stydest, r"\providecommand*{\textfrac}[2]{%"
+ print >> stydest, r" \textsu{#1}%"
+ print >> stydest, r" \textfractionsolidus"
+ print >> stydest, r" \textin{#2}}"
+ str = r"\define@key{%s}{scaled}" % letterize(berryname[fontbase])
+ if berryname[fontbase] in scaled.keys():
+ str += "[%s]" % scaled[berryname[fontbase]]
+ else:
+ str += "[1.0]"
+ str += "{\def\%s@scaled{s*[#1]}}" % letterize(berryname[fontbase])
+ print >> stydest, str
+ str = r"\define@key{%s}{family}[rm]{\def\%s@family{#1}}" % (letterize(berryname[fontbase]), letterize(berryname[fontbase]))
+ print >> stydest, str
+ print >> stydest, r"\DeclareOption*{%"
+ print >> stydest, r" \begingroup"
+ print >> stydest, r" \edef\x{\endgroup"
+ print >> stydest, r" \noexpand\setkeys{%s}{\CurrentOption}}%%" % letterize(berryname[fontbase])
+ print >> stydest, r" \x}"
+
+ onumprinted = False
+ lnumprinted = False
+ # change this if you don't want oldstyle to be the default
+ oldstyleisdefault = True
+ styledefaultprinted = False
+ numoptions = ''
+ for o in styoptions:
+ if not onumprinted and 'onum' in o:
+ if oldstyleisdefault == True:
+ print >> stydest, (r"\newcommand*{\%s@style}{%s}" %
+ (letterize(berryname[fontbase]),
+ optionMappings['onum']))
+ styledefaultprinted = True
+ numoptions += r"\DeclareOption{oldstyle}{%" + "\n"
+ numoptions += (r" \renewcommand*{\%s@style}{%s}%%" %
+ (letterize(berryname[fontbase]), optionMappings['onum']))
+ numoptions += "\n}\n"
+ onumprinted = True
+ if not lnumprinted and 'lnum' in o:
+ if oldstyleisdefault == False:
+ print >> stydest, (r"\newcommand*{\%s@style}{%s}" %
+ (letterize(berryname[fontbase]),
+ optionMappings['lnum']))
+ styledefaultprinted = True
+ numoptions += r"\DeclareOption{lining}{%" + "\n"
+ numoptions += (r" \renewcommand*{\%s@style}{%s}%%" %
+ (letterize(berryname[fontbase]), optionMappings['lnum']))
+ numoptions += "\n}\n"
+ lnumprinted = True
+ if not lnumprinted and not onumprinted:
+ print >> stydest, (r"\newcommand*{\%s@style}{%s}" %
+ (letterize(berryname[fontbase]),
+ optionMappings['fakenum']))
+ print >> stydest, numoptions
+
+ print >> stydest, (r"\newcommand*{\%s@default}{%%" %
+ letterize(berryname[fontbase]))
+ print >> stydest, (r" \renewcommand*{\rmdefault}{%s\%s@style}%%" %
+ (berryname[fontbase], letterize(berryname[fontbase])))
+ print >> stydest, "}\n"
+
+ for o in ['rm', 'sf', 'tt']:
+ print >> stydest, (r"\DeclareOption{%s}{%%" % o)
+ print >> stydest, (r" \renewcommand*{\%s@default}{}%%" %
+ letterize(berryname[fontbase]))
+ print >> stydest, (r" \renewcommand*{\%sdefault}{%s\%s@style}%%" %
+ (o, berryname[fontbase],
+ letterize(berryname[fontbase])))
+ print >> stydest, "}\n"
+
+ print >> stydest, r"\ProcessOptions*"
+ print >> stydest, r"\%s@default" % letterize(berryname[fontbase])
+ print >> stydest, r"\endinput"
+ stydest.close()
+
+# given installcommands list, runs all commands in that list
+def executeCommands():
+ dryrun = False # change to true to show commands but not run them
+ installcommands[-1] = installcommands[-1].replace(" --no-updmap", "")
+ for cmd in installcommands:
+ print cmd
+ if not dryrun:
+ os.system(cmd)
+ # typically these two need to be called at the end to clean up
+ if not dryrun:
+ os.system("texhash")
+ os.system("updmap --syncwithtrees")
+
+# break out all possibilities from a list
+# breakout(['a', 'b'], ['c', '']) => [['a', 'c'], ['a'], ['b', 'c'], ['b']]
+# Filters empty values out of output lists.
+# breakout by Doug Zongker (thanks Doug!)
+def breakout(lyst):
+ if not lyst:
+ yield []
+ else:
+ for i in lyst[0]:
+ if i:
+ for j in breakout(lyst[1:]):
+ yield [i] + j
+ else:
+ for j in breakout(lyst[1:]):
+ yield j
+
+def filenameInLocaldir(str):
+ return (os.popen("kpsewhich -expand-path='$TEXMFHOME'",
+ 'r').readline()[0:-1] +
+ localfontsdir + str)
+
+removeproRE = re.compile(" pro")
+removestdRE = re.compile(" std")
+def niceFontName(str):
+ return removestdRE.sub('', removeproRE.sub('', str.lower())).replace(' ', '')
+
+# stable
+def unique(s):
+ u = {}
+ ss = []
+ for x in s:
+ if x not in u.keys():
+ ss.append(x)
+ u[x] = 1
+ return ss
+
+#######################################
+# END UTILITY FUNCTIONS
+#######################################
+
+#######################################
+# BEGIN GLOBAL VARIABLES
+# DON'T TOUCH THESE
+#######################################
+
+# contains otftotfm commands to send to the os
+installcommands = []
+
+# indexed by font file name, contains (flat) info about font file:
+# filename, family, subfamily, vendor, opticalSize, series, shape, features
+fonthash = {}
+
+# indexed by [family][series][shape], contains list of optical variants
+# for each [family][series][shape]
+classifiedFonts = {}
+
+# indexed by [family][series][shape][optical], contains info for each optical
+# variant:
+# filename, vendor, fontname, cmdlineoptions
+explodedFonts = {}
+
+#######################################
+# END GLOBAL VARIABLES
+#######################################
+
+#######################################
+# BEGIN PROGRAM
+#######################################
+
+checkOTFInfoVersion()
+for font in generateFontfiles(sys.argv[1:]):
+ addToFonthash(font)
+populateFontDataStructures()
+generateFDandSTY()
+executeCommands()
+
+#######################################
+# END PROGRAM
+#######################################
diff --git a/fonts/utilities/otftofd/COPYING b/fonts/utilities/otftofd/COPYING
new file mode 100644
index 0000000000..b6f92f3dbf
--- /dev/null
+++ b/fonts/utilities/otftofd/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/fonts/utilities/otftofd/README b/fonts/utilities/otftofd/README
new file mode 100644
index 0000000000..4a1f8b1f20
--- /dev/null
+++ b/fonts/utilities/otftofd/README
@@ -0,0 +1,94 @@
+Overview
+--------
+
+otftofd is a script I wrote to help the task of generating a NFSS font
+description file and a map file from a large collection of OpenType
+fonts. In particular, when considering Adobe Pro Optical fonts, there is
+almost a combinatorial nightmare when attempting to create these files
+by hand.
+
+This software is still probably alpha quality and mostly designed
+specifically for Adobe font conventions. It currently has experimental
+support for generating swashed versions of a font and fonts consisting
+of ornaments. There is some preliminary support for selecting encodings,
+but it is far from complete. The tool has been mostly tested with the
+T1 Cork encoding. For more information about using the tool, invoke it
+with the --help option.
+
+otftofd is written in CaSH (Caml Shell) and additionally requires Eddie
+Kohler's excellent LCDF Typetools.
+
+ofttofd was originally called "adobe-font-tool", but at the suggestion
+of CTAN it was renamed to hopefully be more descriptive.
+
+otftofd is licensed under the FSF General Public License. Do not hesitate
+to send me bug reports or fixes, other improvements, or suggestions.
+Contact via e-mail at washburn@acm.org.
+
+There is a public, read-only, Subversion repository for otftofd at
+https://svn.cis.upenn.edu/svnroot/otftofd/.
+
+Installation
+------------
+
+otftofd is a script so installation only requires setting the executable
+bit ("chmod a+x otftofd") and placing it in your PATH.
+
+However, otftofd is written in the Objective Caml language with
+the CaSH library. Therefore you will need to install them before
+otftofd can be used. The latest version of OCaml can be obtained
+from http://caml.inria.fr, and the latest version of CaSH from
+http://pauillac.inria.fr/cash/.
+
+Additionally, otftofd makes use of the programs otfinfo and otftotfm.
+Therefore you will need have them installed as well. They are part of
+the LCDF Typetools package. The latest version can be obtained from
+http://www.lcdf.org/type/.
+
+Usage
+-----
+
+At its simplest, otftofd is just used as
+
+ otftofd <collection of OpenType fonts>
+
+For example, if I have a directory minion, containing a set of OpenType
+fonts for the Minion Pro font. These files will have names like
+MinionPro*.otf. Inside the minion directory I would run
+
+ otftofd *.otf
+
+Which will generate a rather large number of support files. However,
+in general you won't need to concern yourself with them. At this
+point you just need to make sure that the directory "minion" is in the
+kpathsea search path for TEXINPUTS, TEXFONTS, T1FONTS, and ENCFONTS.
+The simplest way to do this is to set the environment variables, but
+you could also edit your global TeX configuration.
+
+At this point, you just need to add the following to your LaTeX document
+(assuming you are using pdfTeX/LaTeX)
+
+ \pdfmapfile {+MinionPro.map}
+ \renewcommand{\encodingdefault}{T1}
+
+And now the MinionPro font is available. You could make it the default
+"Roman" font by adding
+
+ \renewcommand{\rmdefault}{MinionPro}
+
+or just in the current scope by
+
+ \fontencoding{T1}\fontfamily{MinionPro}\selectfont
+
+
+
+By default otftofd uses the "T1" or "Cork" font encoding, but it is
+also possible to tell otftofd to use another encoding. Returning to
+our Minion Pro example, we could have done
+
+ otftofd --enc=LY1 *.otf
+
+or if we want to use an encoding that otftofd doesn't know about, we
+could have done
+
+ otftodf --enc=LY42 --encFile=myencoding.enc *.otf
diff --git a/fonts/utilities/otftofd/otftofd b/fonts/utilities/otftofd/otftofd
new file mode 100644
index 0000000000..15a30225d6
--- /dev/null
+++ b/fonts/utilities/otftofd/otftofd
@@ -0,0 +1,1037 @@
+#!/usr/bin/env cash
+(*
+# vim:ft=ocaml
+*)
+(*
+adobe-font-tool $Id: otftofd 7 2005-09-10 21:25:47Z geoffw $
+Copyright Geoffrey Alan Washburn, 2005.
+
+You can redistribute and/or modify this software under the terms of
+the GNU General Public License as published by the Free Software
+Foundation; either version 2, or (at your option) any later version.
+
+This software is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You may obtain the GNU General Public License by writing to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*)
+
+#load "str.cma";;
+open Cash;;
+open Str;;
+open List;;
+
+(******************************************************************************)
+
+(* Define this here just in case, but we'll overwrite it later *)
+let program_name : string ref = ref "otftofd"
+
+(******************************************************************************)
+
+(* Small general helper functions *)
+
+(* Print an error message and exit with an error code *)
+let error (msg : string) : 'a =
+ begin
+ print_string ((!program_name) ^ " (error) : " ^ msg ^ "\n");
+ exit 1
+ end
+
+(* Print an warning message *)
+let warning (msg : string) : unit =
+ print_string ((!program_name) ^ " (warning): " ^ msg ^ "\n")
+
+
+(******************************************************************************)
+
+(* Define these in case we need to change them later/dynamically *)
+
+let dirsep = "/"
+let pathsep = ":"
+
+(******************************************************************************)
+
+(* Check whether a programs exists in a given directory *)
+let prog_exists_dir (prog : string) (dir : string) =
+ if (is_file_directory_fn dir) then
+ is_file_executable_fn (dir ^ dirsep ^ prog)
+ else
+ (error ("Tried to check the existence of program " ^ prog ^ " in non-directory " ^ dir))
+
+(* basename *)
+let basename (fn : string) =
+ let parts = Str.split (regexp dirsep) fn in
+ let rec last (l : string list) : string =
+ (match l with
+ | [] -> (error "Argument to basename doesn't have a basecase?!")
+ | [base] -> base
+ | h::t -> last t) in
+ last (parts)
+
+(* Check whether a program exists in the users path *)
+let prog_exists_path (prog : string) : bool =
+ exists (prog_exists_dir prog) (exec_path_list ())
+
+(* Run a program and return the output as a string *)
+let system (prog : string) (args : string list) : string =
+ run_with_string (fun _ -> exec_path prog args)
+
+(******************************************************************************)
+
+(* Define the various datatypes *)
+
+(* Font encodings - not entirely implemented yet FIX *)
+type encoding =
+ | OML (* Original TeX math text encoding: ?? *)
+ | OMS (* Original TeX math symbol encoding: ?? *)
+ | OMX (* Original TeX math extended symbol encoding: ?? *)
+ | OT1 (* Original TeX encoding: ?? *)
+ | OT2 (* ??: ?? *)
+ | OT4 (* ??: ?? *)
+ | QX (* ??: ?? *)
+ | T1 (* TeX Cork encoding: cork, tex256 *)
+ | T2 (* ??: ?? *)
+ | T5 (* ??: ?? *)
+ | TS1 (* ??: ?? *)
+ | U (* Unknown encoding: ?? *)
+ | LY1 (* ??: texnansx *)
+
+(* NFSS Weights *)
+type weight =
+ | UltraLightWeight
+ | ExtraLightWeight
+ | LightWeight
+ | SemiLightWeight
+ | MediumWeight
+ | SemiBoldWeight
+ | BoldWeight
+ | ExtraBoldWeight
+ | UltraBoldWeight
+
+(* NFSS Widths *)
+type width =
+ | UltraCondensedWidth
+ | ExtraCondensedWidth
+ | CondensedWidth
+ | SemiCondensedWidth
+ | MediumWidth
+ | SemiExpandedWidth
+ | ExpandedWidth
+ | ExtraExpandedWidth
+ | UltraExpandedWidth
+
+(* NFSS Shapes *)
+type shape =
+ | UprightShape
+ | ItalicShape
+ | SlantedShape
+ | SmallCapsShape
+ | UprightItalicShape
+ | OutlineShape
+
+(* OpenType features *)
+type feature =
+ | Faalt (* access all alternates *)
+ | Fc2sc (* small captials from capitals *)
+ | Fcalt (* contextual alternatives *)
+ | Fcase (* case sensitive forms *)
+ | Fcpsp (* captial spacing *)
+ | Fcswh (* contextual swash *)
+ | Fdlig (* discrentionary ligatures *)
+ | Fdnom (* denominators *)
+ | Ffina (* terminal forms *)
+ | Ffrac (* fractions *)
+ | Fhist (* historical forms *)
+ | Fkern (* kerning *)
+ | Fliga (* standard ligatures *)
+ | Flnum (* lining figures *)
+ | Fnumr (* numerators *)
+ | Fonum (* old style numbers *)
+ | Fordn (* ordinals *)
+ | Fornm (* Ornaments *)
+ | Fpnum (* proportional figures *)
+ | Fsalt (* stylistic alternatives *)
+ | Fsinf (* scientific inferiors *)
+ | Fsize (* optical sizes *)
+ | Fsmcp (* small caps *)
+ | Fss of int (* Stylistic sets *)
+ | Fsups (* superscript *)
+ | Fswsh (* swash *)
+ | Ftnum (* tabular figures *)
+ | Fzero (* slashed zero *)
+
+(* Ranges used to describe optical coverage for a font *)
+type range =
+ | Greater of float
+ | Less of float
+ | Between of (float * float)
+ | All
+
+(******************************************************************************)
+
+(* Convert an encoding to a string *)
+let encodingToString (enc : encoding) =
+ (match enc with
+ | OML -> "OML"
+ | OMS -> "OMS"
+ | OMX -> "OMX"
+ | OT1 -> "OT1"
+ | OT2 -> "OT2"
+ | OT4 -> "OT4"
+ | QX -> "QX"
+ | T1 -> "T1"
+ | T2 -> "T2"
+ | T5 -> "T5"
+ | TS1 -> "TS1"
+ | LY1 -> "LY1"
+ | U -> "U")
+
+let parseEncoding (enc : string) : encoding =
+ (match (String.uppercase enc) with
+ | "OML" -> OML
+ | "OMS" -> OMS
+ | "OMX" -> OMX
+ | "OT1" -> OT1
+ | "OT2" -> OT2
+ | "OT4" -> OT4
+ | "QX" -> QX
+ | "T1" -> T1
+ | "T2" -> T2
+ | "T5" -> T5
+ | "TS1" -> TS1
+ | "LY1" -> LY1
+ | "U" -> U
+ | _ -> error ("Unknown font encoding " ^ enc))
+
+(* Convert an encoding name to a default encoding file, not entirely correct yet. *)
+let encodingToFile (enc : encoding) =
+ let encwarn () =
+ warning ("Presently, encoding " ^ (encodingToString enc) ^ " is not directly supported.\nTry using --encFile=file to specify an encoding file. ")
+ in
+ (match enc with
+ | OML -> (encwarn (); "-")
+ | OMS -> (encwarn (); "-")
+ | OMX -> (encwarn (); "-")
+ | OT1 -> (encwarn (); "-")
+ | OT2 -> (encwarn (); "-")
+ | OT4 -> (encwarn (); "-")
+ | QX -> (encwarn (); "-")
+ | T1 -> "cork"
+ | T2 -> (encwarn (); "-")
+ | T5 -> (encwarn (); "-")
+ | TS1 -> (encwarn (); "-")
+ | LY1 -> "texnansx"
+ | U -> (encwarn (); "-"))
+
+(* Convert a feature to a string *)
+let featureToString (feat : feature) =
+ (match feat with
+ | Faalt -> "aalt"
+ | Fc2sc -> "c2sc"
+ | Fcalt -> "calt"
+ | Fcase -> "case"
+ | Fcpsp -> "cpsp"
+ | Fcswh -> "cswh"
+ | Fdlig -> "dlig"
+ | Fdnom -> "dnom"
+ | Ffina -> "fina"
+ | Ffrac -> "frac"
+ | Fhist -> "hist"
+ | Fkern -> "kern"
+ | Fliga -> "liga"
+ | Flnum -> "lnum"
+ | Fnumr -> "numr"
+ | Fonum -> "onum"
+ | Fordn -> "ordn"
+ | Fornm -> "ornm"
+ | Fpnum -> "pnum"
+ | Fsalt -> "salt"
+ | Fsinf -> "sinf"
+ | Fsize -> "size"
+ | Fsmcp -> "smcp"
+ | Fss(n) -> if((n >= 1) || (n<=20)) then "ss" ^ (string_of_int n) else (error "Invalid style set") (* FIX -- this doesn't output leading zeros :-( *)
+ | Fsups -> "sups"
+ | Fswsh -> "swsh"
+ | Ftnum -> "tnum"
+ | Fzero -> "zero")
+
+(* Convert a weight to a string *)
+let weightToString (wght : weight) =
+ (match wght with
+ | UltraLightWeight -> "ul"
+ | ExtraLightWeight -> "el"
+ | LightWeight -> "l"
+ | SemiLightWeight -> "sl"
+ | MediumWeight -> "m"
+ | SemiBoldWeight -> "sb"
+ | BoldWeight -> "b"
+ | ExtraBoldWeight -> "eb"
+ | UltraBoldWeight -> "ub")
+
+(* Convert a width to a string *)
+let widthToString (wdth : width) =
+ (match wdth with
+ | UltraCondensedWidth -> "uc"
+ | ExtraCondensedWidth -> "ec"
+ | CondensedWidth -> "c"
+ | SemiCondensedWidth -> "sc"
+ | MediumWidth -> "m"
+ | SemiExpandedWidth -> "sx"
+ | ExpandedWidth -> "x"
+ | ExtraExpandedWidth -> "ex"
+ | UltraExpandedWidth -> "ux")
+
+(* Convert a shape to a string *)
+let shapeToString (shp : shape) =
+ (match shp with
+ | UprightShape -> "n"
+ | ItalicShape -> "it"
+ | SlantedShape -> "sl"
+ | SmallCapsShape -> "sc"
+ | UprightItalicShape -> (error "FIX")
+ | OutlineShape -> (error "FIX"))
+
+(* Convert a range to a string *)
+let rangeToString (rng : range) : string =
+ (match rng with
+ | Greater f -> "<" ^ (string_of_float f) ^ "->"
+ | Less f -> "<-" ^ (string_of_float f) ^ ">"
+ | Between (s,e) -> "<" ^ (string_of_float s) ^ "-" ^ (string_of_float e) ^ ">"
+ | All -> "<->" )
+
+(* Compare to ranges -- kind of broken, but works well enough at the moment *)
+let compareRngs (rng1 : range) (rng2 : range) : int =
+ (match (rng1, rng2) with
+ (* Slapdash comparison heurisitic *)
+ | (All, All) -> 0
+ | (_, All) -> -1
+ | (All, _) -> 1
+ | (Greater f1, Greater f2) -> compare f1 f2
+ | (Less f1, Less f2) -> compare f1 f2
+ | (Greater f1, Less f2) -> compare f1 f2
+ | (Less f1, Greater f2) -> compare f1 f2
+ | (Less f, Between (s,e)) ->
+ if (f < e) then -1
+ else
+ if (f >= e) then 1
+ else
+ 0
+ | (Between (s,e), Less f) ->
+ if (f < e) then -1
+ else
+ if (f >= e) then 1
+ else
+ 0
+ | (Greater f, Between (s,e)) ->
+ if (f < e) then -1
+ else
+ if (f >= e) then 1
+ else
+ 0
+ | (Between (s,e), Greater f) ->
+ if (f < e) then -1
+ else
+ if (f >= e) then 1
+ else
+ 0
+ | (Between (s1, e1), Between (s2, e2)) ->
+ if (e1 < s1) then -1
+ else
+ if (s1 >= e2) then 1
+ else
+ if (e1 < e2) then -1
+ else
+ if (e1 >= e2) then 1
+ else
+ 0
+ )
+
+(* Create a series string from width and weight *)
+let createSeries (wght : weight) (wdth : width) =
+ (match wght with
+ | MediumWeight ->
+ (match wdth with
+ | MediumWidth -> "m"
+ | _ -> widthToString wdth)
+ | _ ->
+ (match wdth with
+ | MediumWidth -> weightToString wght
+ | _ -> (weightToString wght) ^ (widthToString wdth)))
+
+(******************************************************************************)
+
+(* Global configuration constants *)
+
+let encoding : encoding ref = ref T1
+let encodingFile : (string option) ref = ref None
+
+(* Should we show the usage information instead of doing anything? *)
+let showUsage : bool ref = ref false
+
+(* Generate a version of the fonts with swashes *)
+let swashVersion : bool ref = ref false
+
+(* Generate a version of the fonts with just ornaments *)
+let ornamentVersion : bool ref = ref false
+
+(* Should we print more info about what we are doing? *)
+let verbose : bool ref = ref false
+
+(******************************************************************************)
+
+(* Heuristics *)
+
+(* Try to infer a weight from the attribute string in the filename *)
+let parseWeight (attr : string) =
+ if (string_match (regexp ".*\\(Black\\|Bold\\|Bd\\|Semibold\\|Regular\\|ExtraLight\\|Light\\|Lt\\).*") attr 0) then
+ (match (matched_group 1 attr) with
+ (* We assume black is ExtraBold rather than UltraBold *)
+ | "Black" -> Some (ExtraBoldWeight)
+ | ("Bold"|"Bd") -> Some (BoldWeight)
+ | "Semibold" -> Some (SemiBoldWeight)
+ | "Regular" -> Some (MediumWeight)
+ (* Disambiguate *)
+ | ("Light"|"Lt") ->
+ if (string_match (regexp ".*ExtraLight.*") attr 0) then
+ Some (ExtraLightWeight)
+ else
+ Some (LightWeight)
+ | _ -> (error "Shouldn't have matched!"))
+ else
+ None
+
+(* Try to infer a width from the attribute string in the filename *)
+let parseWidth (attr : string) =
+ if (string_match (regexp ".*\\(Regular\\|Cond\\|SemiCn\\|Cn\\|SemiExt\\).*") attr 0) then
+ (match (matched_group 1 attr) with
+ | "SemiExt" -> Some (SemiExpandedWidth)
+ | "Regular" -> Some (MediumWidth)
+ | ("Cond"|"Cn") ->
+ (* Disambiguate *)
+ if (string_match (regexp ".*SemiCn.*") attr 0) then
+ Some (SemiCondensedWidth)
+ else
+ Some (CondensedWidth)
+ | _ -> (error "Shouldn't have matched!"))
+ else
+ None
+
+(* Try to infer a shape from the attribute string in the filename *)
+let parseShape (attr : string) =
+ if (string_match (regexp ".*\\(Regular\\|It\\|Italic\\|Slanted\\).*") attr 0) then
+ (match (matched_group 1 attr) with
+ | ("Italic"|"It") -> Some (ItalicShape)
+ | "Regular" -> Some (UprightShape)
+ | "Slanted" -> Some (SlantedShape)
+ | _ -> (error "Shouldn't have matched!"))
+ else
+ None
+
+(* Try to infer a design size from the attribute string in the filename *)
+let parseDesign (attr : string) =
+ if (string_match (regexp ".*\\(Regular\\|Capt\\|Disp\\|Headline\\|Subh\\).*") attr 0) then
+ (match (matched_group 1 attr) with
+ (* otfinfo gives slightly different numbers for different fonts, so just
+ use these as an estimate if otfinfo is unavailable or doesn't provide
+ feedback *)
+ | ("Disp"|"Headline") -> Some (20.1,72.0)
+ | "Subh" -> Some (13.1, 20.0)
+ | "Regular" -> Some (9.0, 13.0)
+ | "Capt" -> Some (6.0, 8.9)
+ | _ -> (error "Shouldn't have matched!"))
+ else
+ None
+
+(* Attempt to figure out stuff about the font just from the name *)
+let parseFileName (fn : string) =
+ let parts = Str.split (regexp "[-\\.]") fn in
+ (match parts with
+ | [name; attr; ext] -> if (ext = "otf") then
+ (name,
+ parseWeight attr,
+ parseWidth attr,
+ parseShape attr,
+ parseDesign attr)
+ else
+ error ("Filename \"" ^ fn ^ "\" does not appear to be an OpenType file")
+ | [name; ext] -> if (ext = "otf") then
+ (name,
+ None,
+ None,
+ None,
+ None)
+ else
+ error ("Filename \"" ^ fn ^ "\" does not appear to be an OpenType file")
+ | _ -> error ("Error parsing filename \"" ^ fn ^ "\""))
+
+(******************************************************************************)
+
+(* Constants used when optimizing ranges *)
+let minrange = 1.0
+let maxrange = 144.0
+
+(* Optimize font ranges *)
+let optRanges (rngs : (range * (string * string list)) list) :
+ (range * (string * string list)) list =
+ (* First sort them *)
+ let sorted = sort (fun (rng1, _) (rng2, _) -> compareRngs rng1 rng2)
+ rngs in
+ (* Extend the ranges so that we have everything as small as minrange pt *)
+ let cover_bottom rngs =
+ (match rngs with
+ | [] -> (error "Font must have at least one range!")
+ | (Greater f, stf)::tl -> (Greater minrange, stf)::tl
+ | (Less f, stf)::tl -> (Less f, stf)::tl
+ | (Between (s,e), stf)::tl -> (Between (minrange, e), stf)::tl
+ | (All, stf)::tl -> (All, stf)::tl)
+ in
+ (* Extend the ranges so that we have everything as large as maxrange pt *)
+ let rec cover_top rngs =
+ (match rngs with
+ | [] -> (error "Font must have at least one range!")
+ | [(Greater f, stf)] -> [(Greater f, stf)]
+ | [(Less f, stf)] -> [(Less maxrange, stf)]
+ | [(Between (s,e), stf)] -> [(Between (s, maxrange), stf)]
+ | [(All, stf)] -> [(All, stf)]
+ | hd::tl -> hd::(cover_top tl))
+ in
+ let rec remove_gaps rngs =
+ (match rngs with
+ | [] -> (error "Font must have at least one range!")
+ | [(rng, stf)] -> [(rng, stf)]
+ | (rng1, stf1)::(rng2, stf2)::tl ->
+ (match (rng1, rng2) with
+ (* All can't have a gap *)
+ | (All, _) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ (* Greater can't have a gap *)
+ | (Greater _, _) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ (* Less followed by less or all can't have a gap *)
+ | (Less _, Less _) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Less _, All) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Less f1, Greater f2) -> (Less f2, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Less f, Between (s,e)) -> (Less s, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ (* Between followed by less or all can't have a gap *)
+ | (Between (s, e), Less f) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Between (s, e), All) -> (rng1, stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Between (s, e), Greater f) -> (Between(s, f), stf1)::(remove_gaps ((rng2,stf2)::tl))
+ | (Between (s1,e1), Between (s2,e2)) ->
+ (Between (s1,s2), stf1)::(remove_gaps ((rng2,stf2)::tl))
+ ))
+ in
+ remove_gaps (cover_bottom (cover_top sorted))
+
+(******************************************************************************)
+
+(* Feature parsing *)
+
+(* This is a list of regexps and handler functions *)
+let featureHandlers =
+ [ ("aalt", (fun _ -> Faalt));
+ ("c2sc", (fun _ -> Fc2sc));
+ ("calt", (fun _ -> Fcalt));
+ ("case", (fun _ -> Fcase));
+ ("cpsp", (fun _ -> Fcpsp));
+ ("cswh", (fun _ -> Fcswh));
+ ("dlig", (fun _ -> Fdlig));
+ ("dnom", (fun _ -> Fdnom));
+ ("fina", (fun _ -> Ffina));
+ ("frac", (fun _ -> Ffrac));
+ ("hist", (fun _ -> Fhist));
+ ("kern", (fun _ -> Fkern));
+ ("liga", (fun _ -> Fliga));
+ ("lnum", (fun _ -> Flnum));
+ ("numr", (fun _ -> Fnumr));
+ ("onum", (fun _ -> Fonum));
+ ("ordn", (fun _ -> Fordn));
+ ("ornm", (fun _ -> Fornm));
+ ("pnum", (fun _ -> Fpnum));
+ ("salt", (fun _ -> Fsalt));
+ ("sinf", (fun _ -> Fsinf));
+ ("size", (fun _ -> Fsize));
+ ("smcp", (fun _ -> Fsmcp));
+ ("smcp", (fun _ -> Fsmcp));
+ ("ss[0-9][0-9]",
+ (fun str ->
+ let numstr = (last_chars str 2) in
+ try
+ let n = int_of_string numstr in
+ if((n >= 1) || (n<=20)) then
+ Fss(n)
+ else
+ (error "Invalid style set while parsing features")
+ with Failure msg -> (error "Invalid style set while parsing features")));
+ ("sups", (fun _ -> Fsups));
+ ("swsh", (fun _ -> Fswsh));
+ ("tnum", (fun _ -> Ftnum));
+ ("zero", (fun _ -> Fzero)) ]
+
+(* Call otfinfo to obtain a list of features for the specified filename *)
+let parseOTFFeatures (fn : string) : feature list =
+ let result = system "otfinfo" ["-f"; fn] in
+ let rec buildFeatures handlers features =
+ (match handlers with
+ | [] -> (rev features)
+ | (rx, handlerFun)::hs ->
+ if (string_match
+ (regexp ("\\(.\\|\n\\)*\\(" ^ rx ^ "\\)\\(.\\|\n\\)*")) result 0) then
+ buildFeatures hs ((handlerFun (matched_group 2 result))::features)
+ else
+ buildFeatures hs features)
+ in
+ buildFeatures featureHandlers []
+
+(******************************************************************************)
+
+(* Parsing design size *)
+
+(* See if otfinfo can give us a design size as well as a size range *)
+let parseOTFSize (fn : string) : (float * float * float) option =
+ let result = system "otfinfo" ["-z"; fn] in
+ (* Abstract out the regex for a decimal number *)
+ let dec_num = "[0-9]+\\(\\.[0-9]+\\)?" in
+ if (string_match (regexp
+ ("design size \\(" ^ dec_num ^
+ "\\) pt, size range \\((\\|\\[\\)\\(" ^ dec_num ^ "\\) pt, \\(" ^ dec_num ^
+ "\\) pt\\()\\|\\]\\), .*")) result 0)
+ then
+ Some (float_of_string (matched_group 1 result),
+ float_of_string (matched_group 4 result),
+ float_of_string (matched_group 6 result))
+ else
+ None
+
+(******************************************************************************)
+
+(* The primary datastructure that we use to construct all of the necessary output
+ familes -- table of all the font families we have encountered
+ shapes -- each family has a table of shapes that it supports
+ weights -- each shape table has a table of weights it supports
+ widths -- each weight table has a table of widths it supports
+ ranges -- each width table has a list of optical ranges,
+ should not overlap.
+ impl -- each range has an associated implementation with
+ it, that is a pair of the file that we are using to
+ get this particular instance and the options that
+ we need to pass to otftotfm to generate it
+
+*)
+(* Create one of size five, don't expect to run this on more than a couple families *)
+let families = Hashtbl.create 5
+
+
+let allocate_family (fam : string) : unit =
+ (* Check to see if this family already exists *)
+ if (not (Hashtbl.mem families fam)) then
+ (* Create seven entries for shapes, as we don't recognize any more than six
+ at this point *)
+ Hashtbl.add families fam (Hashtbl.create 7)
+ else
+ ()
+
+(* Allocate an entry in the font table *)
+let allocate_entry (fam : string)
+ (shp : shape)
+ (wght : weight)
+ (wdth : width)
+ (rng : range)
+ (fn : string)
+ (opts : string list) =
+ let shpTable =
+ (* Check to see if this family already exists *)
+ try
+ Hashtbl.find families fam
+ (* If not, create it *)
+ with Not_found ->
+ (* Create seven entries for shapes, as we don't recognize any more than six
+ at this point *)
+ let tbl = Hashtbl.create 7 in
+ (Hashtbl.add families fam tbl; tbl) in
+ let wghtTable =
+ (* Check to see if this table already exists *)
+ try
+ Hashtbl.find shpTable shp
+ (* If not, create it *)
+ with Not_found ->
+ (* Create ten entries for weights, as we don't recognize any more than nine
+ at this point *)
+ let tbl = Hashtbl.create 10 in
+ (Hashtbl.add shpTable shp tbl; tbl) in
+ let wdthTable =
+ (* Check to see if this table already exists *)
+ try
+ Hashtbl.find wghtTable wght
+ (* If not, create it *)
+ with Not_found ->
+ (* Create ten entries for widthd, as we don't recognize any more than nine
+ at this point *)
+ let tbl = Hashtbl.create 10 in
+ (Hashtbl.add wghtTable wght tbl; tbl) in
+ let rngList =
+ (* Check to see if there is already a list of ranges *)
+ try
+ Hashtbl.replace wdthTable wdth ((rng,(fn, opts))::(Hashtbl.find wdthTable wdth))
+ (* If not, create it *)
+ with Not_found ->
+ Hashtbl.add wdthTable wdth [(rng, (fn, opts))] in
+ ()
+
+(***************************************************************************)
+
+(* Check for a specified feature *)
+let rec checkFeature (feat : feature) (feats : feature list) : bool =
+ (match feats with
+ | [] -> false
+ | hd::tl ->
+ if (hd = feat) then
+ true
+ else
+ checkFeature feat tl)
+
+(* Given the fonts features and the shape we inferred from the filename,
+ figure out what shapes it supports and the options necessary to generate them *)
+let decideShapes (shpopt : shape option) (feats : feature list) :
+ (shape * string list) list =
+ (* Look at what we decided from the filename *)
+ (match shpopt with
+ (* If it is upright we might also want to check for smallcaps *)
+ | Some(UprightShape) ->
+ if (checkFeature Fsmcp feats) then
+ [(UprightShape, []); (SmallCapsShape, ["-fsmcp"])]
+ else
+ [(UprightShape, [])]
+ (* OpenType allows "other" shapes to also have smallcaps shapes,
+ but NFSS doesn't support mixing shapes like that at the moment,
+ so we will just ignore the smallcaps capabilities *)
+ | Some(shp) -> [(shp, [])]
+ (* If we didn't get a shape from the filename, assume upright, and
+ check for smallcaps *)
+ | None ->
+ if (checkFeature Fsmcp feats) then
+ [(UprightShape, []); (SmallCapsShape, ["-fsmcp"])]
+ else
+ [(UprightShape, [])])
+
+(* Decide the weight of a font, not very interesting because
+ we only rely upon what we guessed from the filename *)
+(* FIX: Should also attempt to consult otfinfo *)
+let decideWeight (wghtopt : weight option) : weight =
+ (match wghtopt with
+ (* If we inferred a weight, use it *)
+ | Some(wght) -> wght
+ (* If we didn't assume that this is a medium weight font *)
+ | None -> MediumWeight)
+
+(* Decide the width of a font, not very interesting because
+ we only rely upon what we guessed from the filename *)
+(* FIX: Should also attempt to consult otfinfo *)
+let decideWidth (wdthopt : width option) : width =
+ (match wdthopt with
+ (* If we inferred a weight, use it *)
+ | Some(wdth) -> wdth
+ (* If we didn't assume that this is a medium weight font *)
+ | None -> MediumWidth)
+
+(* See if we can determine an optical size *)
+let decideSize (dsnopt : (float * float) option)
+ (feats : feature list)
+ (otfsize : (float * float * float) option) : range =
+ (* Does this font include an optical size feature? *)
+ if (checkFeature Fsize feats) then
+ (* Yes, use it *)
+ (match otfsize with
+ | Some(_, s, e) -> Between (s, e)
+ | None -> (error "Shouldn't be possible!")
+ )
+ else
+ All
+ (* Turn this off for now, doesn't seem to really work well
+
+ (* Nope, try guessing based upon the name *)
+ (match dsnopt with
+ | Some (s, e) -> Between (s, e)
+ | None -> All)
+ *)
+
+(* Table building inner loop *)
+let build_table_inner (fn : string)
+ (family : string)
+ (wghtopt : weight option)
+ (wdthopt : width option)
+ (dsnopt : (float * float) option)
+ (shp : shape)
+ (features : feature list)
+ (opts : string list) =
+ let otfsize = parseOTFSize fn in
+ (* Always add default ligatures, kerning, and terminal forms if they are available *)
+ let opts = if (checkFeature Fliga features) then "-fliga"::opts else opts in
+ let opts = if (checkFeature Fkern features) then "-fkern"::opts else opts in
+ let opts = if (checkFeature Ffina features) then "-ffina"::"--boundary-char= "::opts else opts in
+ begin
+ (* Allocate entries in the table *)
+ allocate_entry family
+ shp
+ (decideWeight wghtopt)
+ (decideWidth wdthopt)
+ (decideSize dsnopt features otfsize)
+ fn
+ opts
+ end
+
+(* Fill in the appropriate entries in the family table for the given filename *)
+let build_table (swash : bool) (orn : bool) (fn : string) =
+ let (family, wghtopt, wdthopt, shpopt, dsnopt) = parseFileName fn in
+ let features = parseOTFFeatures fn in
+ begin
+ (* For each shape we have ... *)
+ fold_left
+ (fun _ (shp, opts) ->
+ if swash then
+ if ((checkFeature Fswsh features) && (checkFeature Fcswh features)) then
+ let opts = "-fswsh"::"-fcswh"::opts in
+ build_table_inner fn family wghtopt wdthopt dsnopt shp features opts
+ else
+ (* No swashes, so don't do anything *)
+ ()
+ else if orn then
+ if (checkFeature Fornm features) then
+ let opts = "-fornm"::opts in
+ build_table_inner fn family wghtopt wdthopt dsnopt shp features opts
+ else
+ (* No ornaments, so don't do anything *)
+ ()
+ else
+ build_table_inner fn family wghtopt wdthopt dsnopt shp features opts)
+ ()
+ (decideShapes shpopt features)
+ end
+
+(* Generate the "Texname" for a given font from the filename and options *)
+let genTexname (fn : string) (enc : encoding) (opts : string list) =
+ let rec filteropts (opts : string list) : string list =
+ (match opts with
+ | [] -> []
+ | h::t ->
+ if (string_match (regexp "-f.*") h 0) then h::(filteropts t) else (filteropts t))
+ in
+ let fopts = filteropts opts in
+ let parts = Str.split (regexp "\\.") fn in
+ (match parts with
+ | [name; ext] -> if (ext = "otf") then
+ (encodingToString enc) ^ "-" ^ name ^ (String.concat "" fopts)
+ else
+ error ("Filename \"" ^ fn ^ "\" does not appear to be an OpenType file")
+ | _ -> error ("Error parsing filename \"" ^ fn ^ "\""))
+
+(******************************************************************************)
+
+(* Generate a list of NFSS font descriptor files *)
+let genFdFile (enc : encoding) : (string * string) list =
+ Hashtbl.fold
+ (fun family shpTable files ->
+ (((encodingToString enc) ^ family ^ ".fd"),
+ "\\DeclareFontFamily{" ^ (encodingToString enc) ^ "}{" ^ family ^ "}{}\n" ^
+ (Hashtbl.fold
+ (fun shp wghtTable accum ->
+ Hashtbl.fold
+ (fun wght wdthTable accum ->
+ Hashtbl.fold
+ (fun wdth rngs accum ->
+ ("\\DeclareFontShape{" ^ (encodingToString enc) ^
+ "}{" ^ family ^ "}{" ^ (createSeries wght wdth) ^
+ "}{" ^ (shapeToString shp) ^ "}{" ^
+ (fold_left
+ (fun accum (rng, (fn, opts)) ->
+ accum ^ " " ^ (rangeToString rng) ^ " " ^
+ (genTexname fn enc opts) ^ " ")
+ ""
+ (optRanges rngs)
+ ) ^ "}{ }\n" ^ accum)
+ )
+ wdthTable
+ accum
+ )
+ wghtTable
+ accum
+ )
+ shpTable
+ "\n"
+ )
+ )::files
+ )
+ families
+ []
+
+
+(******************************************************************************)
+
+type map_special =
+ | SlantFontSpecial of float
+ | ExtendFontSpecial of float
+
+type std_psfont =
+ | TimesRomanPS
+ | TimesItalicPS
+ | TimesBoldPS
+ | TimesBoldItalicPS
+ | HelveticaPS
+ | HelveticaObliquePS
+ | HelveticaBoldPS
+ | HelveticaBoldObliquePS
+ | CourierPS
+ | CourierObliquePS
+ | CourierBoldPS
+ | CourierBoldObliquePS
+ | SymbolPS
+
+type map_embed =
+ | PartialEmbed
+ | FullEmbed
+ | NoEmbed
+
+(* tfmname, psbasename, fontflags, specials, encoding file *)
+type map_entry =
+ | MapFile of string *
+ string option *
+ (* map_fontflags option * FIX *)
+ map_special list *
+ string option *
+ map_embed *
+ string
+ | PSFile of string *
+ std_psfont *
+ (* map_fontflags option * FIX *)
+ map_special list *
+ string option
+
+
+(******************************************************************************)
+
+(* Generate a list of map files by running otftotfm*)
+let genMapFile () : (string * string) list =
+ Hashtbl.fold
+ (fun family shpTable files ->
+ ((family ^ ".map"),
+ Hashtbl.fold
+ (fun shp wghtTable accum ->
+ Hashtbl.fold
+ (fun wght wdthTable accum ->
+ Hashtbl.fold
+ (fun wdth rngs accum ->
+ (fold_left
+ (fun accum (rng, (fn, opts)) ->
+ let tname = genTexname fn (!encoding) opts in
+ (match (!encodingFile) with
+ | Some(file) ->
+ let mapline =
+ system "otftotfm" (("-e"::file::fn::opts)@[tname]) in
+ accum ^ mapline
+ | None -> error "should be impossible!")
+ )
+ ""
+ rngs
+ ) ^ accum
+ )
+ wdthTable
+ accum
+ )
+ wghtTable
+ accum
+ )
+ shpTable
+ "\n"
+ )::files
+ )
+ families
+ []
+
+(******************************************************************************)
+
+(* Print the usage information for the program *)
+let usage () : 'a =
+ print_string ("Usage: " ^ (!program_name) ^ "\n" ^
+ " [--help]\n" ^
+ " [--verbose]\n" ^
+ " [--swash]\n" ^
+ " [--ornaments]\n" ^
+ " [--enc=ENCODING]\n" ^
+ " [--encFile=FILE]\n" ^
+ " files ...\n\n" ^
+ "Construct NFSS font descriptor files and PostScript map files\n" ^
+ "for the specified OpenType fonts.\n\n" ^
+ " -h, --help print this message\n" ^
+ " --verbose print more information about what is happening\n" ^
+ " --swash generate a swashy version (experimental)\n" ^
+ " --ornaments generate ornaments (experimental)\n" ^
+ " --enc=ENCODING set the encoding type (default T1) \n" ^
+ " --encFile=FILE set the encoding definition (default cork)\n\n" ^
+ "Version $Id: otftofd 7 2005-09-10 21:25:47Z geoffw $\n" ^
+ "Report bugs to <washburn@acm.org>.\n")
+
+let rec parseArgs (args : string list) : string list =
+ (match args with
+ | [] -> []
+ | "--h"::t -> (showUsage := true); parseArgs t
+ | "--verbose"::t -> (verbose := true); parseArgs t
+ | "--help"::t -> (showUsage := true); parseArgs t
+ | "--swash"::t -> (swashVersion := true); parseArgs t
+ | "--ornaments"::t -> (ornamentVersion := true); parseArgs t
+ | (h::t)
+ when
+ (string_match (regexp "--enc=\\(.*\\)") h 0) ->
+ (encoding := parseEncoding (matched_group 1 h));
+ parseArgs t
+ | (h::t)
+ when
+ (string_match (regexp "--encfile=\\(.*\\)") h 0) ->
+ (encodingFile := Some (matched_group 1 h));
+ parseArgs t
+ | h::t -> h :: (parseArgs t))
+
+(******************************************************************************)
+
+(* Should convert to basename *)
+let _ = (program_name := basename (hd (command_line ())))
+
+let options = (tl (command_line ()))
+
+let _ = map (fun prog -> if not (prog_exists_path prog) then
+ error ("Could not find the program " ^ prog ^ " in your path!"))
+ ["otfinfo"; "otftotfm"]
+
+(******************************************************************************)
+
+(* Do the work *)
+let filtered_args = (parseArgs options) in
+ let _ = (match (!encodingFile) with
+ | None -> (encodingFile := Some (encodingToFile (!encoding)))
+ | _ -> ()) in
+ if ((length filtered_args) > 0) && not (!showUsage) then
+ begin
+ ignore (map (build_table (!swashVersion)
+ (!ornamentVersion))
+ filtered_args);
+ ignore (map
+ (fun (fn, contents) ->
+ let _ = if (!verbose) then
+ print_string ((!program_name) ^ ": creating " ^ fn ^ "\n")
+ in
+ let channel = open_out fn in
+ let _ = output_string channel contents in
+ close_out channel)
+ (genFdFile (!encoding)));
+ ignore (map
+ (fun (fn, contents) ->
+ let _ = if (!verbose) then
+ print_string ((!program_name) ^ ": creating " ^ fn ^ "\n")
+ in
+ let channel = open_out fn in
+ let _ = output_string channel contents in
+ close_out channel)
+ (genMapFile ()))
+ end
+ else
+ usage ()
diff --git a/fonts/utilities/pbmtogf/00README b/fonts/utilities/pbmtogf/00README
new file mode 100644
index 0000000000..ec4c9acdc9
--- /dev/null
+++ b/fonts/utilities/pbmtogf/00README
@@ -0,0 +1,115 @@
+README for pbmtogf.
+In the absence of proper documentation, this file will give you
+essential information of pbmtogf.
+
+WHAT IS PBMTOGF
+===============
+
+PBMTOGF is a little utility for converting a pbm file into a gf file
+plus an accompanying pl file. In effect, it generates a font that can
+be used by other typesetting systems, such as TeX, LaTeX.
+
+A pbm file is a portable bitmap file. A gf file is a generic font file
+which is the default output format of METAFONT. It contains
+information of a bitmap font. A program gftopk can convert this file
+into a pk file to be used by TeX, LaTeX and their driver programs such
+as dvips to typeset documents. A pl file contains a font property
+list. A program pltotf conterts this file into a tfm (TeX Font Matrix)
+file to be used by TeX, LaTeX, etc.
+
+The input to pbmtogf is a bitmap which contains one or more
+pictures. Each picture will become a character in the generated
+font. Currently, pbmtogf assumes the size of all pictures are the
+same. The pictures are arranged in rows and columns. For example, a
+bitmap of 300x200 pixels contains six pictures. The size of the
+pictures are 100x100 pixel. They are arranged into rows of three.
+
+Assuming this bitmap is store in a file named mymap.pbm, the following
+command
+ pbmtogf -r2 -c3 mymap.pbm
+will generate a font in the file mymap.600gf and mymap.pl. The font
+name will be the basename of the input file, i.e., mymap in the aove
+example, and the characters in the font will have codes starting from
+0, i.e., the first character in the top row is character 0, the next
+is character 1, and so on.
+
+pbmtogf accepts the following command line options (with default value
+in parentheses):
+ -help display this message
+ -d enable debugging
+ -c<n> n characters per row (1)
+ -r<n> n rows in the image (1)
+ -w<n> character width in pixels (width of bitmap)
+ -h<n> character height in pixels (height of bitmap)
+ -f<n> character code of first character
+ -n<n> number of characters
+ -s<n> output resolution in pixels per inch (600)
+ -z<n> designe size in points (12)
+
+The following commands convert the gf and pl files to pk and tfm files
+respectively:
+ gftopk mymap.600gf
+ pltotf mymap.tfm
+
+After this conversion, you can use the font mymap in a TeX document
+like this:
+
+\font\myfont=mymap %define and load the font
+\myfont\char0 %use the first character in myfont
+ %or better as below
+ % to define a macro for the characters
+\def\mychara{\myfont\char0}
+ % use the macros in the text
+This is a new character in parentheses (\mychara).
+
+Or you can use the font mymap in a LaTeX2e document like this:
+
+\DeclareFontFamily{U}{mymap}{}
+\DeclareFontShape{U}{mymap}{m}{n}{ <12> icons }{}
+\DeclareFixedFont{\myfont}{U}{icons}{m}{n}{12pt}
+\newcommand{\mychara}{\myfont\char0}
+This is a new character in parentheses (\mychara).
+
+INSTALLATION
+============
+
+After you unzip and untar the distribution, You should receive the
+following files:
+
+ README --- this file
+ COPYING --- GNU public license
+ makefile
+ pbmtogf.h --- header files
+ gf.h
+ pbmtogf.c --- C source files
+ gf.c
+ pl.c
+ readpbm.c
+
+To compile the program, you need make and a C compile. GNU make and
+gcc are a good choice. Type the command:
+ make all
+will compile the program and create an executable pbmtogf.
+
+In the test subdirector, you will also receive a sample of pbm file
+and the font files (gf, pl, tfm and pk) generated by pbmtogf. There is
+a LaTeX file showing an example of using this font.
+
+PORTABILITY
+===========
+Since pbmtogf does not use any system dependent functions, it should work
+on many different platforms, though I only tested it in the following
+systems:
+ Red Hat Linux 4.1, 5.0, 5.1, 5.2
+ SunOS 4.2
+ Solaris
+ Window95, Window NT with gnu-win32
+
+AUTHOR
+======
+
+pbmtogf was written by Wai WONG (wwong@comp.hkbu.edu.hk).
+The home page of pbmtogf can be found at
+ http://www.comp.hkbu.edu.hk/~wwong/typeset/pbmtogf/index.html
+
+19 July 1999 \ No newline at end of file
diff --git a/fonts/utilities/pf2afm/pf2afm.bat b/fonts/utilities/pf2afm/pf2afm.bat
new file mode 100644
index 0000000000..10e6b4a122
--- /dev/null
+++ b/fonts/utilities/pf2afm/pf2afm.bat
@@ -0,0 +1,3 @@
+@ echo off
+set DOS4G=quiet
+gs386 -dNODISPLAY -q -- pf2afm.ps %1
diff --git a/fonts/utilities/pf2afm/pf2afm.ps b/fonts/utilities/pf2afm/pf2afm.ps
new file mode 100644
index 0000000000..dda2c712a0
--- /dev/null
+++ b/fonts/utilities/pf2afm/pf2afm.ps
@@ -0,0 +1,490 @@
+%!
+% This is a PostScript program for making an AFM file from
+% PFB / PFA and (optionally) PFM files.
+%
+% Written in BOP s.c., Gda\'nsk, Poland
+% e-mail contact: B.Jackowski@GUST.ORG.PL
+% version 0.5 (18 XII 1997)
+% version 0.55 (11 III 1998) -- unlimited number of chars in a font
+% version 1.00 (27 III 1998) -- scanning PFM subdirectory added,
+% code improved
+
+% Usage:
+% gs [-dNODISPLAY] -- pf2afm.ps disk_font_name
+%
+% The result is written to the file disk_font_name.afm, provided such
+% a file does not exist; otherwise program quits.
+%
+% The font can be either *.pfa or *.pfb; if no extension is supplied,
+% first disk_font_name.pfb is examined, then disk_font_name.pfa.
+% Moreover, if there is a *.pfm file in the same directory or in the
+% subdirectory PFM, i.e., disk_font_name.pfm or PFM/disk_font_name.pfm,
+% kern pairs from it are extracted, as well as additional font
+% parameters, usually absent from Type 1 fonts.
+
+% Tribute:
+% The program is based on James Clark's <jjc@jclark.uucp> printafm.ps
+% (with alterations by d.love@dl.ac.uk and L. Peter Deutsch) from
+% Ghostscript 5.10 distribution.
+
+/onechar 1 string def
+/edef {exch def} def
+
+% charnumber print-charname -
+% prints the name of the encoded character
+/print-charname {
+ PFBencoding exch get =string cvs dup
+ (.notdef) eq {
+ /was.notdef true def
+ } if
+ print.to.ofi ( ) print.to.ofi
+} def
+
+/printquit {print flush quit} def
+
+% redirecting GS output to ``ofi'' file
+/eolch (\r\n) def
+/=only.to.ofi {ofi exch write=only} def % replaces GS's `=only'
+/print.to.ofi {ofi exch writestring} def % replaces `print'
+/=to.ofi { =only.to.ofi eolch print.to.ofi } def % replaces `='
+
+% read and skip: byte, short, word, double and long
+/readb-p {currPFMfile read not {(Unexpected EOF) printquit} if} def
+/readw-p {readb-p readb-p 256 mul add} def
+/reads-p {readw-p dup 32768 ge {65536 sub} if} def
+/readd-p {readb-p readb-p readb-p readb-p 256 mul add 256 mul add 256 mul add} def
+/readl-p /readd-p load def % double word is, in fact, long integer in GS
+/skipb-p {readb-p pop} def
+/skipw-p {skipb-p skipb-p} def
+/skips-p /skipw-p load def
+/skipd-p {skipb-p skipb-p skipb-p skipb-p} def
+/skipl-p /skipd-p load def
+/skipa-p { {skipb-p} repeat} def
+
+% PFMfile readPFMheader -
+% defines currPFMfile, PFMExtMetricOffset, PFMPairKernTableOffset
+
+/readPFMheader {
+ currPFMfile bytesavailable
+ % ---------------
+ % PFM MAIN HEADER
+ % ---------------
+ skipw-p % PFM: version
+ readd-p % PFM: size (size is dword, not word as the documentation says)
+ ne {(Wrong file size) printquit} if
+ 60 skipa-p % PFM: copyright
+ skipw-p % PFM: Type
+ skipw-p % PFM: Points
+ skipw-p % PFM: VertRes
+ skipw-p % PFM: HorizRes
+ skipw-p % PFM: Ascent
+ skipw-p % PFM: InternalLeading
+ skipw-p % PFM: ExternalLeading
+ skipb-p % PFM: Italic
+ skipb-p % PFM: Underline
+ skipb-p % PFM: Stikeout
+ skipw-p % PFM: Weight
+ skipb-p % PFM: CharSet
+ skipw-p % PFM: PixWidth
+ skipw-p % PFM: PixHeight
+ skipb-p % PFM: PitchAndFamily
+ skipw-p % PFM: AvgWidth
+ skipw-p % PFM: MaxWidth
+ skipb-p % PFM: FirstChar
+ skipb-p % PFM: LastChar
+ skipb-p % PFM: DefaultChar
+ skipb-p % PFM: BreakChar
+ skipw-p % PFM: WidthBytes
+ skipd-p % PFM: Device
+ skipd-p % PFM: Face
+ skipd-p % PFM: BitsPointer
+ skipd-p % PFM: BitsOffset
+ % here we assume that it is a PostScript font, i.e., it always uses
+ % the extended width table, therefore the normal width table is empty
+ % -------------
+ % PFM EXTENSION
+ % -------------
+ skipw-p % PFMEX: SizeFields
+ readd-p % PFMEX: ExtMetricOffset
+ /PFMExtMetricOffset edef
+ skipd-p % PFMEX: ExtentTable
+ skipd-p % PFMEX: OriginTable
+ readd-p % PFMEX: PairKernTable
+ /PFMPairKernTableOffset edef
+ skipd-p % PFMEX: TrackKernTable
+ skipd-p % PFMEX: DriverInfo
+ skipd-p % PFMEX: Reserved
+} def
+
+% requires that currPFMfile, PFMExtMetricOffset are defined
+% readPFMExtMetric -
+% defines PFMNumberofKernPairs
+
+/readPFMExtMetric {
+ currPFMfile PFMExtMetricOffset setfileposition
+ skips-p % EXTT: Size
+ skips-p % EXTT: PointSize
+ skips-p % EXTT: Orientation
+ skips-p % EXTT: MasterHeight
+ skips-p % EXTT: MinScale
+ skips-p % EXTT: MaxScale
+ skips-p % EXTT: MasterUnit
+ reads-p % EXTT: CapHeight
+ /PFMCapHeight edef
+ reads-p % EXTT: XHeight
+ /PFMXHeight edef
+ reads-p % EXTT: LowerCaseAscent
+ /PFMLowerCaseAscent edef
+ reads-p % EXTT: LowerCaseDescent
+ neg /PFMLowerCaseDescent edef
+ skips-p % EXTT: Slant
+ skips-p % EXTT: SuperScript
+ skips-p % EXTT: SubScript
+ skips-p % EXTT: SuperScriptSize
+ skips-p % EXTT: SubScriptSize
+ skips-p % EXTT: UnderlineOffset
+ skips-p % EXTT: UnderlineWidth
+ skips-p % EXTT: DoubleUpperUnderlineOffset
+ skips-p % EXTT: DoubleLowerUnderlineOffset
+ skips-p % EXTT: DoubleUpperUnderlineWidth
+ skips-p % EXTT: DoubleLowerUnderlineWidth
+ skips-p % EXTT: StrikeOutOffset
+ skips-p % EXTT: StrikeOutWidth
+ readw-p % EXTT: KernPairs
+ /PFMNumberofKernPairs edef
+ skipw-p % EXTT: KernTracks
+} def
+
+% requires that currPFMfile, PFMPairKernTableOffset, PFMNumberofKernPairs are defined
+% readPFMExtMetric -
+% prints kern pairs table in the AFM format
+
+/readPFMKernPairs {
+ currPFMfile () ne {
+ PFMdict begin
+ PFMPairKernTableOffset 0 ne {
+ currPFMfile PFMPairKernTableOffset setfileposition
+ readw-p % undocumented kern count (although all remaining structures are
+ % explicitly preceded by their sizes); if it were a stable
+ % feature, EXTTEXTMETRICS could be skipped
+ PFMNumberofKernPairs
+% 2 copy = =
+ ne {
+ (Inconsistent number of kern pairs) printquit
+ } if
+ (StartKernData) =to.ofi
+ (StartKernPairs ) print.to.ofi
+ PFMNumberofKernPairs =to.ofi
+ % ---------
+ % MAIN LOOP
+ % ---------
+ /was.notdef false def
+ PFMNumberofKernPairs {
+ (KPX ) print.to.ofi
+ readb-p % first char
+ print-charname
+ readb-p % second char
+ print-charname
+ reads-p % kern amount
+ =to.ofi
+ } repeat
+ was.notdef {
+ (.notdef character ocurred among kern pairs) =
+ (you'd better check the resulting AFM file.) =
+ } if
+ (EndKernPairs) =to.ofi
+ (EndKernData) =to.ofi
+ } if
+ end
+ } if
+} def
+
+% alias (for ``compatibility'' with J. Clark):
+/printkernpairs /readPFMKernPairs load def
+
+% printcharmetrics -
+
+/printcharmetrics {
+ (StartCharMetrics ) print.to.ofi
+ /PFBencoding currfont /Encoding get dup length array copy def
+ /PFBcharstrings currfont /CharStrings get def
+ PFBcharstrings length
+ PFBcharstrings /.notdef known { 1 sub } if =to.ofi
+ currfont 1000 scalefont setfont
+ % checking Encoding array and CharStrings dictionary for
+ % the consistency of names
+ /was.inconsitent false def
+ 0 1 255 {
+ dup PFBencoding exch get
+ PFBcharstrings exch known {
+ pop
+ }{
+% dup PFBencoding exch get =
+ PFBencoding exch /.notdef put % fix Encoding array
+ /was.inconsitent true def
+ } ifelse
+ } for
+ was.inconsitent {
+ (Encoding array contains name(s) absent from CharStrings dictionary) =
+ } if
+ % print metric data for each character in PFB encoding vector
+ 0 1 255 {
+ dup PFBencoding exch get
+ dup /.notdef ne {
+ exch dup printmetric
+ }{
+ pop pop
+ } ifelse
+ } for
+ % xPFBencoding contains an entry for each name in the original
+ % encoding vector
+ /xPFBencoding PFBcharstrings length dict def
+ PFBencoding {
+ xPFBencoding exch true put
+ } forall
+
+ /fontiter 0 def
+ /TMPFontTemplate (TMP_FONT#000) def
+ {
+ % NewPFBencoding is the new encoding vector
+ /NewPFBencoding 256 array def
+ 0 1 255 {
+ NewPFBencoding exch /.notdef put
+ } for
+ % fill up NewPFBencoding with names from CharStrings dictionary that
+ % are not encoded so far
+ /i 0 def
+ PFBcharstrings {
+ pop
+ i 255 le {
+ dup xPFBencoding exch known not {
+ dup xPFBencoding exch true put
+ NewPFBencoding i 3 -1 roll put
+ /i i 1 add def
+ }{
+ pop
+ } ifelse
+ }{
+ pop exit
+ } ifelse
+ } forall
+ i 0 eq {exit} if
+ % define a new font with NewPFBencoding as its encoding vector
+ currfont maxlength dict /NewTMPfont edef
+ currfont {
+ exch dup dup /FID ne exch /Encoding ne and {
+ exch NewTMPfont 3 1 roll put
+ }{
+ pop pop
+ } ifelse
+ } forall
+ % compute a unique name for a font to be registered
+ /fontiter fontiter 1 add def
+ TMPFontTemplate fontiter (000) cvs
+ dup length TMPFontTemplate length exch sub exch putinterval
+ /TMPFontName TMPFontTemplate cvn def
+ NewTMPfont /FontName TMPFontName put
+ NewTMPfont /Encoding NewPFBencoding put
+ % make this new font the current font
+ TMPFontName NewTMPfont definefont 1000 scalefont setfont
+ % print metric data for each character in the newly created encoding vector
+ 0 1 255 {
+ dup NewPFBencoding exch get
+ dup /.notdef ne {
+ exch -1 printmetric
+ }{
+ pop pop exit
+ } ifelse
+ } for
+ i 255 lt {exit} if
+ } loop
+ (EndCharMetrics) =to.ofi
+} def
+
+% name actual_code normal_code printmetric -
+
+/printmetric {
+ (C ) print.to.ofi =only.to.ofi
+ ( ; WX ) print.to.ofi
+ onechar 0 3 -1 roll put
+ onechar stringwidth pop round cvi =only.to.ofi
+ ( ; N ) print.to.ofi =only.to.ofi
+ ( ; B ) print.to.ofi
+ newpath 0 0 moveto
+ onechar false charpath flattenpath pathbbox
+ newpath
+ round cvi /ury edef round cvi /urx edef
+ round cvi /lly edef round cvi /llx edef
+ ury lly eq {/ury 0 def /lly 0 def} if % normalize degenrated BB
+ urx llx eq {/urx 0 def /llx 0 def} if %
+ llx =only.to.ofi ( ) print.to.ofi lly =only.to.ofi ( ) print.to.ofi
+ urx =only.to.ofi ( ) print.to.ofi ury =only.to.ofi ( ) print.to.ofi
+ (;) =to.ofi
+} def
+
+/printinfoitem {
+ 3 1 roll 2 copy known {
+ get =string cvs exch
+ print.to.ofi ( ) print.to.ofi =to.ofi
+ }{
+ pop pop pop
+ } ifelse
+} def
+
+/printfontinfo {
+ (Comment AFM Generated by Ghostscript/pf2afm) =to.ofi
+ currfont /FontName (FontName) printinfoitem
+ %
+ currfont /FontInfo get
+ dup /FullName (FullName) printinfoitem
+ dup /FamilyName (FamilyName) printinfoitem
+ dup /Weight (Weight) printinfoitem
+ dup /Notice (Notice) printinfoitem
+ dup /ItalicAngle (ItalicAngle) printinfoitem
+ dup /isFixedPitch (IsFixedPitch) printinfoitem
+ dup /UnderlinePosition (UnderlinePosition) printinfoitem
+ dup /UnderlineThickness (UnderlineThickness) printinfoitem
+ /version (Version) printinfoitem
+ %
+ (EncodingScheme FontSpecific) =to.ofi
+ %
+ (FontBBox) print.to.ofi
+ currfont /FontBBox get {
+ ( ) print.to.ofi round cvi =only.to.ofi
+ } forall
+ eolch print.to.ofi
+ %
+ currPFMfile () ne {
+ PFMdict
+ dup /PFMCapHeight (CapHeight) printinfoitem
+ dup /PFMXHeight (XHeight) printinfoitem
+ dup /PFMLowerCaseDescent (Descender) printinfoitem
+ /PFMLowerCaseAscent (Ascender) printinfoitem
+ } if
+} def
+
+/readPFBfile {
+ % make a shot of the actual font directory:
+ /oldFontDirectory FontDirectory dup length dict copy def
+ isPFB {% defined in `makeafm'
+ (r) file true /PFBDecode filter cvx % true is better (see gs_type1.ps)
+ mark exch exec
+ }{
+ (r) file mark exch run
+ } ifelse
+ cleartomark
+ % make a shot of the updated font directory:
+ /newFontDirectory FontDirectory dup length dict copy def
+ % spot the added font:
+ oldFontDirectory {pop newFontDirectory exch undef} forall
+ newFontDirectory length 1 ne {(Weird PFB file?) printquit} if
+ newFontDirectory {pop} forall
+ findfont /currfont edef
+} def
+
+/readPFMfile {
+ dup () ne {
+ (r) file /currPFMfile edef
+ 10 dict dup /PFMdict edef begin
+ readPFMheader
+ readPFMExtMetric
+ end
+ }{
+ pop /currPFMfile () def
+ } ifelse
+} def
+
+% pfmfilename pf[ba]filename filetype printafm -
+% where filetype=(a) or (b)
+
+/printafm {
+ readPFBfile
+ readPFMfile
+ (StartFontMetrics 2.0) =to.ofi
+ printfontinfo
+ printcharmetrics
+ printkernpairs
+ (EndFontMetrics) =to.ofi
+} def
+
+% pf[ba]filename makeafm -
+
+/makeafm {
+ count 0 eq {(Missing font file name) printquit} if
+ /ifn edef
+ ifn length 0 eq {(Empty font file name) printquit} if
+% the following piece of the code does, in fact, the job of a system shell,
+% i.e., it analyses the supplied names, appends extensions if needed,
+% and check files:
+ /pfbn () def /pfan () def /pfmn () def % initialisation
+ ifn (.pfb) search {
+ 3 -1 roll length 0 eq {% file name extension = ".pfb"
+ ifn dup length string copy /pfbn edef
+ /ifn edef
+ }{pop} ifelse
+ } if pop
+ ifn (.pfa) search {
+ 3 -1 roll length 0 eq {% file name extension = ".pfa"
+ ifn dup length string copy /pfan edef
+ /ifn edef
+ }{pop} ifelse
+ } if pop
+ pfbn () eq pfan () eq and dup {% no extension was supplied, try ".pfb"
+ /pfbn ifn (.pfb) concatstrings def
+ } if
+ pfbn () ne {% check whether "filename.pfb" exists
+ pfbn status {pop pop pop pop /isPFB true def}{/pfbn () def} ifelse
+ } if
+ pfbn () eq and {% checking "filename.pfb" unsuccessful, try ".pfa"
+ /pfan ifn (.pfa) concatstrings def
+ } if
+ pfan () ne {% check whether "filename.pfa" exists
+ pfan status {pop pop pop pop /isPFB false def}{/pfan () def} ifelse
+ } if
+
+ pfbn () eq pfan () eq and {
+ (Neither pfa nor pfb found) printquit
+ } if
+
+ /ofn ifn (.afm) concatstrings def
+ ofn status {
+ pop pop pop pop (Resulting file exists) printquit
+ } if
+ /ofi ofn (w) file def
+
+ /pfmn ifn (.pfm) concatstrings def
+ pfmn status {
+ pop pop pop pop
+ }{
+ () pfmn {
+ (/) search {
+ 4 -1 roll exch concatstrings exch concatstrings exch
+ }{
+ exit
+ } ifelse
+ } loop
+ (pfm/) exch concatstrings concatstrings
+ dup status {
+ pop pop pop pop /pfmn edef
+ }{
+ pop /pfmn () def (pfm file not found -- ignored) print
+ } ifelse
+ } ifelse
+
+ pfmn
+ isPFB {pfbn}{pfan} ifelse
+ printafm
+
+} def
+
+% Check for command line arguments.
+[ shellarguments
+ { ] dup length 1 eq {
+ 0 get makeafm
+ }{
+ (This is PF2AFM -- AFM generator \(ver. 1.00\)\n)
+ (Usage: gs [-dNODISPLAY] -- pf2afm.ps disk_font_name\n) printquit
+ } ifelse
+ }
+ {pop}
+ifelse
diff --git a/fonts/utilities/pfm2afm/README b/fonts/utilities/pfm2afm/README
new file mode 100644
index 0000000000..b249d84db9
--- /dev/null
+++ b/fonts/utilities/pfm2afm/README
@@ -0,0 +1,54 @@
+README for afm2pfm
+
+This ZIP file contains two programs:
+ pfm2afm - Convert Windows .pfm files to .afm files
+ afm2pfm - convert Adobe .afm file to MS-Windows binary .pfm file
+They have been compiled with EMX/GCC 0.9a.
+To run under OS/2 or MS-DOS, you need
+ ftp://hobbes.nmsu.edu/os2/unix/emx09a/emxrt.zip
+
+1. pfm2afm was written by
+ Author: Ken Borgendale 10/9/91 Version 1.0
+ but slightly modified by myself to compile with EMX/GCC and
+ to be more compatible with actual PFM files and afm2pfm.
+ pfm2afm is copyrighted by Ken Borgendale.
+
+
+2. afm2pfm was written by myself so that I could create a PFM file
+ for use with the MS-Windows ATM.
+
+ afm2pfm is copyright by Russell Lang, and covered by the FSF Licence.
+ See the file COPYING for details.
+
+ Syntax:
+ afm2pfm [-w] [-?] infile [outfile]
+
+ -? displays a short help message.
+ -w suppresses warnings.
+ The extension .afm is added to the infile if it has none.
+ If unspecified, the outfile is defaulted from the input file name.
+
+ Limitations:
+ afm2pfm was written to produce a PFM file for a simple Type 1 font
+ that I had created. More complex AFM files may expose limitations
+ in this program. Warning messages are produced for AFM lines or
+ sections that are ignored. Ligatures are silently ignored. Track
+ kerning and Composites are ignored. Unencoded characters are ignored.
+
+ Background:
+ I wrote this to create a PFM file for a small Type 1 font that
+ I had created by hand and converted to PFB format with
+ ftp://hobbes.nmsu.edu/os2/printer/fontutls.zip
+ I created the AFM file by hand which allowed the font to be used
+ with the OS/2 PM Adobe Type Manager.
+ afm2pfm allows me to use the font with MS-Windows ATM.
+ AFM documentation is available from ftp.adobe.com.
+ PFM docuemntation is available in the Windows 3.1 DDK.
+ Since writing afm2pfm, I found that a similar program AFM.EXE
+ exists in the Windows 3.1 DDK. AFM.EXE is likely to have less
+ problems thatn afm2pfm, but afm2pfm is free.
+
+
+Russell Lang <rjl@eng.monash.edu.au>
+1995-03-10
+
diff --git a/fonts/utilities/pfm2afm/unix.patches b/fonts/utilities/pfm2afm/unix.patches
new file mode 100644
index 0000000000..13b871d933
--- /dev/null
+++ b/fonts/utilities/pfm2afm/unix.patches
@@ -0,0 +1,111 @@
+diff -c2 orig/afm2pfm.c new/afm2pfm.c
+*** orig/afm2pfm.c Fri Jan 14 14:34:50 1994
+--- new/afm2pfm.c Mon Feb 27 09:31:49 1995
+***************
+*** 233,239 ****
+
+ void lcheck(void) {
+! if (strlen(line) >= sizeof(line)-1)
+ fprintf(stderr,"Error on line %d, line too long\n", linecount);
+! exit(2);
+ }
+
+--- 233,240 ----
+
+ void lcheck(void) {
+! if (strlen(line) >= sizeof(line)-1) {
+ fprintf(stderr,"Error on line %d, line too long\n", linecount);
+! exit(2);
+! }
+ }
+
+***************
+*** 346,349 ****
+--- 347,359 ----
+ inhdr = FALSE;
+ }
++ else if (strcmp(key, "FullName")==0) {
++ /* nop */
++ }
++ else if (strcmp(key, "Comment")==0) {
++ /* nop */
++ }
++ else if (strcmp(key, "Version")==0) {
++ /* nop */
++ }
+ else {
+ if (warnflag) {
+***************
+*** 364,369 ****
+ pfm.dfFirstChar = 255;
+ pfm.dfLastChar = 0;
+! if (strncmp(line, "StartFontMetrics",16)!=0) {
+! fprintf(stderr,"Error on line %d, expecting StartFontMetrics\n",linecount);
+ exit(2);
+ }
+--- 374,379 ----
+ pfm.dfFirstChar = 255;
+ pfm.dfLastChar = 0;
+! if (strncmp(line, "StartCharMetrics",16)!=0) {
+! fprintf(stderr,"Error on line %d, expecting StartCharMetrics\n",linecount);
+ exit(2);
+ }
+diff -c2 orig/pfm2afm.c new/pfm2afm.c
+*** orig/pfm2afm.c Fri Jan 7 14:40:20 1994
+--- new/pfm2afm.c Mon Feb 27 09:59:11 1995
+***************
+*** 276,279 ****
+--- 276,280 ----
+ void putheader(void) {
+ uchar * cp;
++ int temp;
+
+ fputs("StartFontMetrics 3.0\n", outf);
+***************
+*** 337,341 ****
+ if (isMono) outval(-20); /* Just guess at left bounds */
+ else outval(-100);
+! outval(-(psx->descender+5)); /* Descender is given as positive value */
+ outval(pfm->maxwidth+10);
+ outval(pfm->ascent+5);
+--- 338,344 ----
+ if (isMono) outval(-20); /* Just guess at left bounds */
+ else outval(-100);
+! temp = psx->descender;
+! temp = -(temp+5);
+! outval(temp); /* Descender is given as positive value */
+ outval(pfm->maxwidth+10);
+ outval(pfm->ascent+5);
+***************
+*** 526,530 ****
+--- 529,538 ----
+ void outval(int v) {
+ char chx[16];
++ printf("The number is %d\n", v);
++ #ifdef unix
++ sprintf(chx, "%d", v);
++ #else
+ itoa(v, chx, 10);
++ #endif
+ fputc(' ', outf);
+ fputs(chx, outf);
+diff -c2 orig/pfm2afm.h new/pfm2afm.h
+*** orig/pfm2afm.h Fri Jan 14 14:17:18 1994
+--- new/pfm2afm.h Mon Feb 27 09:39:40 1995
+***************
+*** 37,42 ****
+ typedef unsigned long ulong;
+ typedef unsigned int uint;
+! #ifdef __EMX__
+ #define itoa(a,b,c) _itoa(a,b,c)
+ #define NEAR
+ #define MAINENT int
+--- 37,44 ----
+ typedef unsigned long ulong;
+ typedef unsigned int uint;
+! #if defined(__EMX__) || defined(unix)
+! #if defined(__EMX__)
+ #define itoa(a,b,c) _itoa(a,b,c)
++ #endif
+ #define NEAR
+ #define MAINENT int
diff --git a/fonts/utilities/pkbbox/README b/fonts/utilities/pkbbox/README
new file mode 100644
index 0000000000..62fa3bbee0
--- /dev/null
+++ b/fonts/utilities/pkbbox/README
@@ -0,0 +1,41 @@
+PKBBOX is a hack that exists only because some Type1 fonts on the
+net do not include AFM files. I was determined to use these fonts
+(I don't remember why anymore ;-) so I discovered that the following
+sequence would produce a legal, if imperfect, AFM file:
+
+ 1) Use PFM2AFM to generate an initial AFM file. This file is insufficient
+ for generating a TFM file because it does not contain the bounding
+ boxes for the characters.
+
+ 2) Use PS2PK to produce a PK file from the Type 1 font. This works because
+ PS2PK doesn't care about the bounding boxes.
+
+ 3) Use PKBBOX to build a (more) valid AFM file. PKBBOX reads the original
+ AFM file and the PK file and constructs reasonable (but *not* perfect)
+ bounding boxes. It produces a new AFM file with this information.
+
+ 4) Use the new AFM file to generate a TFM file.
+
+ 5) That's it, use the font.
+
+The bounding boxes are going to be wrong if the font has letters which have
+large descenders or other "bumps" that extend out of the real bounding box,
+but it was the best I could do.
+
+ Cheers,
+ norm
+
+P.S. Feel free to drop me a note if you have any difficulties, although I
+can't promise that I'll be able to help very much.
+
+---
+Norman Walsh <norm@ora.com> | Unable to locate coffee---operator halted.
+Production Tools Specialist |
+O'Reilly & Associates, Inc. |
+90 Sherman Street |
+Cambridge, MA 02140 |------------------------------------------------
+(617) 354-5800/661-1116 FAX | URL: http://jasper.ora.com/norm.html
+
+
+
+
diff --git a/fonts/utilities/pkbbox/pkbbox.mak b/fonts/utilities/pkbbox/pkbbox.mak
new file mode 100644
index 0000000000..ffa14b0651
--- /dev/null
+++ b/fonts/utilities/pkbbox/pkbbox.mak
@@ -0,0 +1,43 @@
+#
+# MakeFile created by Dep 3.42 for pkbbox.pas
+# on 01/07/93 at 07:34 pm
+#
+# This makefile is for ndMake vers 4.51
+#
+VPATH = .;d:\tp\source\tex\units;d:\tp\unit;d:\tp\bgi;d:\opro;d:\tp\inc;d:\opro;
+#
+# Compilation macros ###############################################
+#
+pas_compiler = d:\tp\tpc.exe
+pas_options = /l
+pun_compiler = d:\tp\tpc.exe
+pun_options = /l
+#
+# Implicit rules ###################################################
+#
+.SUFFIXES : .exe .tpu .pas .pun .l
+
+.pas.exe:; $(pas_compiler) $(pas_options) $<
+
+.pun.tpu:; $(pun_compiler) $(pun_options) $<
+
+.l.pas:; $(l_compiler) $(l_options) $<
+
+.pas.tpu:; $(pun_compiler) $(pun_options) $<
+
+#
+# Explicit rules ###################################################
+#
+pkbbox.exe : pkbbox.pas opcrt.tpu clock.tpu files.tpu \
+ moredos.tpu moresys.tpu strings.tpu opstring.tpu \
+ tp_msgs.tpu sps_cpyr.tpu pkdcl.tpu texdcl.tpu \
+ tfmdcl.tpu
+
+pkdcl.tpu : d:\tp\source\tex\units\pkdcl.pun buffers.tpu \
+ files.tpu bytevec.tpu
+
+texdcl.tpu : d:\tp\source\tex\units\texdcl.pun strings.tpu
+
+tfmdcl.tpu : d:\tp\source\tex\units\tfmdcl.pun files.tpu \
+ moresys.tpu
+
diff --git a/fonts/utilities/pkbbox/pkbbox.pas b/fonts/utilities/pkbbox/pkbbox.pas
new file mode 100644
index 0000000000..a9ea1d3c95
--- /dev/null
+++ b/fonts/utilities/pkbbox/pkbbox.pas
@@ -0,0 +1,170 @@
+Program PKtoSFP;
+
+uses OpCrt,
+ Clock,
+ Files,
+ MoreDos,
+ MoreSys,
+ Strings,
+ OpString,
+ Tp_Msgs,
+ Sps_Cpyr,
+ PkDcl,
+ TexDcl,
+ TfmDcl;
+
+const
+ Vers = '0.2';
+ BannerStr = 'This is PKbbox vers '+Vers;
+ ProgName = 'PKbbox';
+
+var
+ DesignSize : Real;
+ DesignRatio : Real;
+
+type
+ CharRec = Record
+ CC : Byte;
+ llx,lly,urx,ury : Integer;
+ end;
+
+var
+ RC : Integer;
+ PkFont : PkFontObj;
+ PkChar : PkCharObj;
+ PkFn : FileSpecStr;
+ AfmFn : FileSpecStr;
+ Count : Word;
+ WorkReal : Real;
+ WorkString : String;
+ Chars : Array[0..255] of CharRec;
+ T : Text;
+ StdErr : Text;
+ Line,s : String;
+ I,err : Integer;
+
+ lc_Width : Real;
+ lc_Count : Word;
+
+ MaxDescender: LongInt;
+ MaxAscender : LongInt;
+
+ CharName : String[12];
+ HorizDpi : Integer;
+ VertDpi : Integer;
+ ScaleAdj : Real;
+ RemapSuccess: Boolean;
+ Multiplier : Real;
+ llx,lly,urx,ury : Integer;
+
+begin
+ AssignCrt(StdErr);
+ Rewrite(StdErr);
+
+ Assign(Output,'');
+ Rewrite(Output);
+
+ If ParamCount < 2 then
+ begin
+ Writeln(StdErr,'Usage: PKBBOX pkfile afmfile > newafmfile');
+ Halt(0);
+ end;
+
+ Writeln(StdErr,BannerStr);
+
+ PkFn := ParamStr(1);
+ AfmFn := ParamStr(2);
+
+ PkFont.Init;
+ PkFont.OpenPkFile(RC,PkFn);
+ If RC <> 0 then
+ begin
+ Write(StdErr,ProgName,': cannot read PK file: ');
+ If RC > 0 then
+ Write(StdErr,TpErrMsg(RC))
+ Else
+ Write(StdErr,PkErrMsg(RC));
+ Halt(1);
+ end;
+
+ DesignSize := 1.0*PkFont.DesignSize/1048576.0;
+ DesignRatio := 300.0/72.27*DesignSize;
+
+ HorizDpi := Round(1.0*PkFont.Hppp/65536.0*72.27);
+ VertDpi := Round(1.0*PkFont.Vppp/65536.0*72.27);
+ ScaleAdj := 1.0*HorizDpi/300.0;
+
+ Multiplier := 1000.0 / DesignRatio;
+
+ FillChar(Chars,SizeOf(Chars),$00);
+
+ MaxAscender := 0;
+ MaxDescender := 0;
+ lc_Width := 0.0;
+ lc_Count := 0;
+ PkChar.Init;
+ PkChar.ReadPkChar(RC,PkFont);
+ While RC = 0 do
+ begin
+ CharName := Pad(TexChar(Char(PkChar.CharacterCode)),6);
+
+ MaxAscender := Max(MaxAscender,PkChar.VOff);
+ MaxDescender := Max(MaxDescender,PkChar.Height-PkChar.VOff);
+
+ llx := 0;
+ lly := Trunc((PkChar.Voff-PkChar.Height)*Multiplier);
+ urx := Trunc(PkChar.Width*Multiplier);
+ ury := Trunc(PkChar.Height*Multiplier) + lly;
+
+ Chars[PkChar.CharacterCode].llx := llx;
+ Chars[PkChar.CharacterCode].lly := lly;
+ Chars[PkChar.CharacterCode].urx := urx;
+ Chars[PkChar.CharacterCode].ury := ury;
+
+ PkChar.Done;
+ PkChar.Init;
+ PkChar.ReadPkChar(RC,PkFont);
+ end;
+
+ If RC <> Err_PkNoMore then
+ begin
+ Write(StdErr,ProgName,': Error scanning PK file: ');
+ If RC > 0 then
+ Write(StdErr,TpErrMsg(RC))
+ Else
+ Write(StdErr,PkErrMsg(RC));
+ Halt(1);
+ end;
+
+ PkFont.Done;
+
+ Assign(T,ParamStr(2));
+ {$I-} Reset(T); {$I+}
+ RC := IoResult;
+
+ If RC <> 0 then
+ begin
+ Write(StdErr,ProgName,': cannot read AFM file: ',TpErrMsg(RC));
+ Halt(1);
+ end;
+
+ While Not Eof(T) do
+ begin
+ Readln(T,Line);
+ S := WordN(Line,2,' ');
+ Val(S,I,err);
+ If (WordN(Line,1,' ') = 'C') and (err = 0) and (I >= -1) and (I <= 255) then
+ begin
+ If I = -1 then
+ Writeln(Line,' B 0 0 0 0 ;')
+ Else
+ Writeln(Line,' B ',Chars[I].llx,' ',Chars[I].lly,' ',Chars[I].urx,' ',Chars[I].ury,' ;');
+ end
+ Else
+ Writeln(Line);
+ end;
+
+ Close(T);
+
+ Writeln('Done.');
+end.
diff --git a/fonts/utilities/ps2mf/AFMparse.c b/fonts/utilities/ps2mf/AFMparse.c
new file mode 100644
index 0000000000..649a72a1cb
--- /dev/null
+++ b/fonts/utilities/ps2mf/AFMparse.c
@@ -0,0 +1,552 @@
+/* AFM_parse.c */
+
+#include <stdio.h>
+#ifndef AIX
+#include <stdlib.h>
+# endif
+#include <string.h>
+#include "defines.h"
+#include "myopen.h"
+#include "mymalloc.h"
+#include "ps2mf.h"
+#include "ps2mfutl.h"
+#include "AFMparse.h"
+#ifdef MSDOS
+#include <float.h>
+#endif
+
+#ifdef __STDC__
+int AFM_command (char * s)
+#else
+int AFM_command (s)
+char * s;
+#endif
+{
+ char ** p;
+ int n;
+
+ for (p = AFM_key_words, n = 0; * p; p ++, n ++)
+ {
+ if (strequ (s, * p)) return (n);
+ }
+ return (not_an_AFM_keyword);
+}
+
+#ifdef __STDC__
+int find_TeX_num (char * p)
+#else
+int find_TeX_num (p)
+char * p;
+#endif
+{
+ AFM_info_tp * ai;
+
+ for (ai = AFM_chars; ai; ai = ai -> next)
+ {
+ if (strequ (p, ai -> AFM_name)) return (ai -> TeX_num);
+ }
+ fprintf (stderr, "! No TeX coding found for character %s\n", p);
+ error ("! Are you sure the configuration file is OK?\n");
+}
+
+kern_tp * new_kern ()
+{
+ kern_tp * nk;
+
+ nk = (kern_tp *) my_malloc (sizeof (kern_tp));
+ nk -> next = NULL;
+ nk -> succ = NULL;
+ nk -> delta = 0;
+ return (nk);
+}
+
+AFM_info_tp * new_char ()
+{
+ AFM_info_tp * ai;
+
+ ai = (AFM_info_tp *) my_malloc (sizeof (AFM_info_tp));
+ ai -> AFM_num = -1;
+ ai -> TeX_num = -1;
+ ai -> width = -1;
+ ai -> AFM_name = NULL;
+ ai -> bbox_llx = -1;
+ ai -> bbox_lly = -1;
+ ai -> bbox_urx = -1;
+ ai -> bbox_ury = -1;
+ ai -> ligs = NULL;
+ ai -> kerns = NULL;
+ ai -> pccs = NULL;
+ ai -> next = AFM_chars;
+ ai -> in_MF_file = FALSE;
+ AFM_chars = ai;
+ return (ai);
+}
+
+lig_tp * new_lig ()
+{
+ lig_tp * nl;
+
+ nl = (lig_tp *) my_malloc (sizeof (lig_tp));
+ nl -> next = NULL;
+ nl -> succ = NULL;
+ nl -> sub = NULL;
+ return (nl);
+}
+
+void process_char ()
+{
+ AFM_info_tp * ai;
+ configuration_info_tp * ci;
+ lig_tp * nl, * cilig;
+
+ ai = new_char ();
+ ai -> AFM_num = param_num ();
+ expect (";");
+ expect ("WX");
+ ai -> width = transform (param_num (), 0);
+ expect (";");
+ expect ("N");
+ ai -> AFM_name = param_new_string ();
+ expect (";");
+ expect ("B");
+ ai -> bbox_llx = param_num ();
+ ai -> bbox_lly = param_num ();
+ ai -> bbox_urx = param_num ();
+ ai -> bbox_ury = param_num ();
+ ai -> bbox_llx = transform (ai -> bbox_llx, ai -> bbox_lly);
+ ai -> bbox_urx = transform (ai -> bbox_urx, ai -> bbox_ury);
+ if (ai -> bbox_lly > 0) ai -> bbox_lly = 0;
+ if (ai -> bbox_ury < 0) ai -> bbox_ury = 0;
+ if (strequ (ai -> AFM_name, "space")) font_space = ai -> width;
+ if (strequ (ai -> AFM_name, "M")) font_quad = ai -> width;
+ if (strequ (ai -> AFM_name, "x") && ! x_height_is_defined)
+ {
+ x_height = ai -> bbox_ury;
+ }
+ expect (";");
+ while (* param == 'L')
+ {
+ expect ("L");
+ nl = new_lig ();
+ nl -> succ = param_new_string ();
+ nl -> sub = param_new_string ();
+ nl -> next = ai -> ligs;
+ ai -> ligs = nl;
+ expect (";");
+ }
+ for (ci = TeX_configuration; ci; ci = ci -> next)
+ {
+ if (strequ (ai -> AFM_name, ci -> AFM_name))
+ {
+ for (cilig = ci -> ligs; cilig; cilig = cilig -> next)
+ {
+ nl = new_lig ();
+ nl -> succ = cilig -> succ;
+ nl -> sub = cilig -> sub;
+ nl -> next = ai -> ligs;
+ ai -> ligs = nl;
+ }
+ }
+ }
+}
+
+void process_kern ()
+{
+ AFM_info_tp * ai;
+ char * p;
+ kern_tp * nk;
+
+ p = param_string ();
+ if (strequ (p, "space")) return;
+ ai = find_AFM_info_for (p);
+ if (ai == NULL) error ("! kern char not found");
+ if (ai -> AFM_num < '0' || ai -> AFM_num > '9')
+ {
+ nk = new_kern ();
+ nk -> succ = param_new_string ();
+ if (strequ (nk -> succ, "space")) return;
+ nk -> delta = transform (param_num (), 0);
+ nk -> next = ai -> kerns;
+ ai -> kerns = nk;
+ }
+}
+
+pcc_tp * new_pcc ()
+{
+ pcc_tp * np;
+
+ np = (pcc_tp *) my_malloc (sizeof (pcc_tp));
+ np -> next = NULL;
+ np -> part_name = NULL;
+ np -> x_offset = 0;
+ np -> y_offset = 0;
+ return (np);
+}
+
+void process_composite_char ()
+{
+ AFM_info_tp * ai;
+ char * p;
+ pcc_tp * np;
+ int n;
+ pcc_tp * npp = NULL;
+
+ p = param_string ();
+ ai = find_AFM_info_for (p);
+ if (ai == NULL) error ("! composite character name not found");
+ n = param_num ();
+ expect (";");
+ while (n --)
+ {
+ expect ("PCC"); /* see afm2tfm.c: handleconstruct*/
+ np = new_pcc ();
+ np -> part_name = param_new_string ();
+ if (find_AFM_info_for (np -> part_name) == NULL) return;
+ np -> x_offset = param_num ();
+ np -> y_offset = param_num ();
+ np -> x_offset = transform (np -> x_offset, np -> y_offset);
+ if (npp) npp -> next = np;
+ else ai -> pccs = np;
+ npp = np;
+ expect (";");
+ }
+}
+
+#ifdef __STDC__
+void append_liginfo (lig_tp * ail, lig_tp * cil)
+# else
+void append_liginfo (ail, cil)
+lig_tp * ail, * cil;
+# endif
+{
+ lig_tp * dummy_cil;
+
+ if (ail == NULL)
+ {
+ ail = cil;
+ return;
+ }
+ if (cil == NULL) return;
+ dummy_cil = cil;
+ while (dummy_cil -> next != NULL) dummy_cil = dummy_cil -> next;
+ dummy_cil -> next = ail;
+ ail = cil;
+}
+
+void assign_chars ()
+{
+ char ** p;
+ int i;
+ bool stop;
+ AFM_info_tp * ai;
+ configuration_info_tp * ci;
+ int nextfree;
+
+ for (ai = AFM_chars; ai; ai = ai -> next)
+ {
+ stop = FALSE; ci = TeX_configuration;
+ while (! stop && ci)
+ {
+ if (strequ (ai -> AFM_name, ci -> AFM_name))
+ {
+ ai -> TeX_num = ci -> TeX_num;
+ append_liginfo (ai -> ligs, ci -> ligs);
+ stop = TRUE;
+ }
+ ci = ci -> next;
+ }
+ }
+}
+
+void delete_TeX_configuration ()
+{
+ configuration_info_tp * ci;
+
+ while (TeX_configuration)
+ {
+ ci = TeX_configuration -> next;
+ free (TeX_configuration);
+ TeX_configuration = ci;
+ }
+}
+
+void parse_AFM ()
+{
+ strcpy (font_name, "Unknown");
+ italic_angle = 0.0;
+ fixed_pitch = FALSE;
+ x_height = 400;
+ font_space = 250;
+ font_quad = 800;
+ x_height_is_defined = FALSE;
+
+
+ while (get_line (afm_file))
+ {
+ switch (AFM_command (param_string ()))
+ {
+ case FontName:
+ {
+ strcpy (font_name, param_string ());
+ }
+ break;
+ case EncodingScheme:
+ {
+ /*strcpy (coding_scheme, param_string ());*/
+ }
+ break;
+ case ItalicAngle:
+ {
+ italic_angle = param_float ();
+ }
+ break;
+ case IsFixedPitch:
+ {
+ if (* param == 't' || * param == 'T')
+ {
+ fixed_pitch = TRUE;
+ }
+ else fixed_pitch = FALSE;
+ }
+ break;
+ case XHeight:
+ {
+ x_height = param_num ();
+ x_height_is_defined = TRUE;
+ }
+ break;
+ case C:
+ {
+ process_char ();
+ }
+ break;
+ case KPX:
+ {
+ process_kern ();
+ }
+ break;
+ case CC:
+ {
+ process_composite_char ();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ assign_chars ();
+ delete_TeX_configuration ();
+}
+
+#ifdef __STDC__
+int config_command (char * s)
+#else
+int config_command (s)
+char * s;
+#endif
+{
+ char ** p;
+ int n;
+
+ for (p = config_key_words, n = 0; * p; p ++, n ++)
+ {
+ if (strequ (s, * p)) return (n);
+ }
+ return (not_a_config_keyword);
+}
+
+configuration_info_tp * new_conf_info ()
+{
+ configuration_info_tp * nsl;
+
+ nsl = (configuration_info_tp *)
+ my_malloc (sizeof (configuration_info_tp));
+ nsl -> TeX_num = 0;
+ nsl -> AFM_name = NULL;
+ nsl -> ligs = NULL;
+ nsl -> next = TeX_configuration;
+ TeX_configuration = nsl;
+ return (nsl);
+}
+
+#ifdef __STDC__
+void process_configuration (int base)
+# else
+void process_configuration (base)
+int base;
+# endif
+{
+ configuration_info_tp * ci;
+ lig_tp * nl;
+
+ ci = new_conf_info ();
+ if (base == 8) ci -> TeX_num = param_oct ();
+ else if (base == 10) ci -> TeX_num = param_num ();
+ else if (base == 16) ci -> TeX_num = param_hex ();
+ expect (";");
+ expect ("N");
+ ci -> AFM_name = param_new_string ();
+ expect (";");
+ while (* param == 'L')
+ {
+ expect ("L");
+ nl = new_lig ();
+ nl -> succ = param_new_string ();
+ nl -> sub = param_new_string ();
+ nl -> next = ci -> ligs;
+ ci -> ligs = nl;
+ expect (";");
+ }
+}
+
+ignore_info_tp * new_ignore_info ()
+{
+ ignore_info_tp * nii;
+
+ nii = (ignore_info_tp *)
+ my_malloc (sizeof (ignore_info_tp));
+ nii -> AFM_name = NULL;
+ nii -> next = ignore_list;
+ ignore_list = nii;
+ return (nii);
+}
+
+void process_ignore ()
+{
+ ignore_info_tp * ii;
+
+ ii = new_ignore_info ();
+ ii -> AFM_name = param_new_string ();
+ expect (";");
+}
+
+void process_encoding ()
+{
+ strcpy (coding_scheme, param_string ());
+ while (* param != ';')
+ {
+ strcat (coding_scheme, " ");
+ strcat (coding_scheme, param_string ());
+ }
+ expect (";");
+}
+
+void parse_config ()
+{
+ strcpy (coding_scheme, "Unspecified");
+ while (get_line (conf_file))
+ {
+ switch (config_command (param_string ()))
+ {
+ case config_C:
+ case config_D:
+ {
+ process_configuration (10);
+ }
+ break;
+ case config_H:
+ {
+ process_configuration (16);
+ }
+ break;
+ case config_O:
+ {
+ process_configuration (8);
+ }
+ break;
+ case config_I:
+ {
+ process_ignore ();
+ }
+ break;
+ case config_Encoding:
+ {
+ process_encoding ();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+#ifdef __STDC__
+void process_ligatures (AFM_info_tp * ai)
+# else
+void process_ligatures (ai)
+AFM_info_tp * ai;
+# endif
+{
+ AFM_info_tp * ai2, * ai3;
+
+ while (ai -> ligs != NULL)
+ {
+ if (! has_ligs [ai -> TeX_num])
+ {
+ ai2 = find_AFM_info_for (ai -> ligs -> succ);
+ ai3 = find_AFM_info_for (ai -> ligs -> sub);
+ if (ai2 -> in_MF_file && ai3 -> in_MF_file)
+ {
+ if (first_ligtable_entry)
+ fprintf (mf_file, "\nligtable %d",
+ ai -> TeX_num);
+ fprintf (mf_file, "%s%d=:%d",
+ first_ligtable_entry ? ":\n" : ",\n",
+ ai2 -> TeX_num, ai3 -> TeX_num);
+ has_ligs [ai -> TeX_num] = TRUE;
+ first_ligtable_entry = FALSE;
+ }
+ }
+ ai -> ligs = ai -> ligs -> next;
+ }
+}
+
+#ifdef __STDC__
+void process_kerns (AFM_info_tp * ai)
+# else
+void process_kerns (ai)
+AFM_info_tp * ai;
+# endif
+{
+ AFM_info_tp * ai2;
+
+ while (ai -> kerns != NULL)
+ {
+ if (! has_ligs [ai -> TeX_num])
+ {
+ ai2 = find_AFM_info_for (ai -> kerns -> succ);
+ if (ai2 -> in_MF_file)
+ {
+ if (first_ligtable_entry)
+ fprintf (mf_file, "\nligtable %d",
+ ai -> TeX_num);
+ fprintf (mf_file, "%s%d kern %dFX#",
+ first_ligtable_entry ? ":\n" : ",\n",
+ ai2 -> TeX_num, ai -> kerns -> delta);
+ first_ligtable_entry = FALSE;
+ }
+ }
+ ai -> kerns = ai -> kerns -> next;
+ }
+}
+
+void process_ligatures_and_kerns ()
+{
+ AFM_info_tp * ai, * ai2, * ai3;
+ int i;
+
+ fprintf (stderr, "Generating a ligaturetable\n");
+ for (ai = AFM_chars; ai; ai = ai -> next)
+ {
+ for (i = 0; i < 255; i ++) has_ligs [i] = FALSE;
+ first_ligtable_entry = TRUE;
+ if (ai -> in_MF_file && (ai -> ligs != NULL
+ || ai -> kerns != NULL))
+ {
+ if (ai -> ligs != NULL) process_ligatures (ai);
+ if (ai -> kerns != NULL) process_kerns (ai);
+ if (! first_ligtable_entry) fprintf (mf_file, ";\n");
+ }
+ }
+}
+
diff --git a/fonts/utilities/ps2mf/AFMparse.h b/fonts/utilities/ps2mf/AFMparse.h
new file mode 100644
index 0000000000..39a490493c
--- /dev/null
+++ b/fonts/utilities/ps2mf/AFMparse.h
@@ -0,0 +1,67 @@
+/* AFM_parse.h */
+
+char * AFM_key_words [] =
+{
+ "FontName",
+ "ItalicAngle",
+ "IsFixedPitch",
+ "XHeight",
+ "C",
+ "KPX",
+ "CC",
+ "EncodingScheme",
+ NULL
+};
+
+#define FontName (0)
+#define ItalicAngle (1)
+#define IsFixedPitch (2)
+#define XHeight (3)
+#define C (4)
+#define KPX (5)
+#define CC (6)
+#define EncodingScheme (7)
+#define not_an_AFM_keyword (-1)
+
+char * config_key_words [] =
+{
+ "C",
+ "D",
+ "H",
+ "O",
+ "I",
+ "Encoding",
+ NULL
+};
+
+#define config_C (0)
+#define config_D (1)
+#define config_H (2)
+#define config_O (3)
+#define config_I (4)
+#define config_Encoding (5)
+#define not_a_config_keyword (-1)
+
+bool has_ligs [255], first_ligtable_entry;
+
+int AFM_command __P((char * s));
+void append_liginfo __P((lig_tp * ail, lig_tp * cil));
+void assign_chars __P((void));
+int config_command __P((char * s));
+void delete_TeX_configuration __P((void));
+AFM_info_tp * new_char __P((void));
+ignore_info_tp * new_ignore_info __P((void));
+kern_tp * new_kern __P((void));
+lig_tp * new_lig __P((void));
+pcc_tp * new_pcc __P((void));
+configuration_info_tp * new_conf_info __P((void));
+void parse_AFM __P((void));
+void parse_config __P((void));
+void process_char __P((void));
+void process_composite_char __P((void));
+void process_configuration __P((int base));
+void process_ignore __P((void));
+void process_kern __P((void));
+void process_kerns __P((AFM_info_tp * ai));
+void process_ligatures __P((AFM_info_tp * ai));
+char * name_from_AFM_num __P((int afm_num)); /* ILH */
diff --git a/fonts/utilities/ps2mf/Makefile b/fonts/utilities/ps2mf/Makefile
new file mode 100644
index 0000000000..aabcb8a24a
--- /dev/null
+++ b/fonts/utilities/ps2mf/Makefile
@@ -0,0 +1,29 @@
+default: all
+
+CC = gcc
+CFLAGS = -g -DUSG -DDEBUG
+
+MYOBJS = myopen.o myerror.o mymalloc.o
+EXTRAOBJS = getopt.o
+PSTOMFOBJS = ps2mf.o PSparse.o AFMparse.o ps2mfutl.o
+PROGS = ps2mf pfb2pfa pfa2chr chr2ps
+
+all: ${PROGS}
+
+ps2mf: ${EXTRAOBJS} ${PSTOMFOBJS} myopen.o mymalloc.o
+ ${CC} ${CFLAGS} -o ps2mf ${PSTOMFOBJS} myopen.o mymalloc.o ${EXTRAOBJS} -lm
+
+pfb2pfa: ${MYOBJS} ${EXTRAOBJS} pfb2pfa.o
+ ${CC} ${CFLAGS} -o pfb2pfa pfb2pfa.o ${MYOBJS} ${EXTRAOBJS}
+
+pfa2chr: ${MYOBJS} ${EXTRAOBJS} pfa2chr.o
+ ${CC} ${CFLAGS} -o pfa2chr pfa2chr.o ${MYOBJS} ${EXTRAOBJS}
+
+chr2ps: ${MYOBJS} ${EXTRAOBJS} chr2ps.o
+ ${CC} ${CFLAGS} -o chr2ps chr2ps.o ${MYOBJS} ${EXTRAOBJS}
+
+.c.o: $<
+ ${CC} ${CFLAGS} -c $<
+
+clean:
+ rm -f ${MYOBJS} ${EXTRAOBJS} ${PSTOMFOBJS} %* ${PROGS}
diff --git a/fonts/utilities/ps2mf/PSparse.c b/fonts/utilities/ps2mf/PSparse.c
new file mode 100644
index 0000000000..f58e4221a4
--- /dev/null
+++ b/fonts/utilities/ps2mf/PSparse.c
@@ -0,0 +1,1498 @@
+/* PSparse.c */
+
+#include <stdio.h>
+#ifndef AIX
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+#include "defines.h"
+#include "myopen.h"
+#include "mymalloc.h"
+#include "ps2mf.h"
+#include "ps2mfutl.h"
+#include "PSparse.h"
+#ifdef MSDOS
+#include <float.h>
+#endif
+
+float x_scale, y_scale;
+
+void write_MF_header ()
+{
+ int i;
+
+ fprintf (mf_file, "%% %s\n", font_name);
+ fprintf (mf_file, "mode_setup;\n");
+ fprintf (mf_file, "if unknown FontSize: FontSize := 10pt#; fi\n");
+ fprintf (mf_file, "FX# := FontSize * %.4f;\n", x_scale);
+ fprintf (mf_file, "FY# := FontSize * %.4f;\n", y_scale);
+ fprintf (mf_file, "bot_blues.n := %d;\n", num_of_other_blues + 1);
+ fprintf (mf_file, "bot_blues1o := %d;\n", blue_values [0] . overshoot);
+ fprintf (mf_file, "bot_blues1p := %d;\n", blue_values [0] . position);
+ for (i = 0; i < num_of_other_blues; i ++)
+ {
+ fprintf (mf_file, "bot_blues%do := %d;\n", i + 2,
+ other_blues [i] . overshoot);
+ fprintf (mf_file, "bot_blues%dp := %d;\n", i + 2,
+ other_blues [i] . position);
+ }
+ fprintf (mf_file, "top_blues.n := %d;\n", num_of_blue_values - 1);
+ for (i = 1; i < num_of_blue_values; i ++)
+ {
+ fprintf (mf_file, "top_blues%do := %d;\n", i,
+ blue_values [i] . overshoot);
+ fprintf (mf_file, "top_blues%dp := %d;\n", i,
+ blue_values [i] . position);
+ }
+ fprintf (mf_file, "blue_scale := %g;\n", blue_scale);
+ fprintf (mf_file, "blue_shift := %d;\n", blue_shift);
+ fprintf (mf_file, "blue_fuzz := %d;\n", blue_fuzz);
+ fprintf (mf_file, "\ninput hints;\n");
+}
+
+void write_MF_trailer ()
+{
+ fprintf (mf_file, "\nfont_slant := %.4f;\n", 1 - cos (italic_angle));
+ fprintf (mf_file, "font_normal_space := %d * FX#;\n", font_space);
+ fprintf (mf_file, "font_normal_stretch := %d * FX#;\n",
+ (int) (font_space / 2.0));
+ fprintf (mf_file, "font_normal_shrink := %d * FX#;\n",
+ (int) (font_space / 3.0));
+ fprintf (mf_file, "font_x_height := %d * FY#;\n", (int) x_height);
+ if (font_quad > 0)
+ {
+ fprintf (mf_file, "font_quad := %d * FX#;\n", font_quad);
+ }
+ else
+ {
+ fprintf (mf_file, "font_quad := %d * FX#;\n", (font_space * 3));
+ }
+ fprintf (mf_file, "designsize := FontSize;\n");
+ fprintf (mf_file, "font_coding_scheme := \"%s\";\n", coding_scheme);
+ fprintf (mf_file, "font_identifier := \"%s\";\n", font_name);
+ fprintf (mf_file, "end.\n");
+ fprintf (mf_file, "%% That's all, Folks!\n");
+}
+
+#ifdef __STDC__
+void push (float fl)
+#else
+void push (fl)
+float fl;
+#endif
+{
+ if (top_of_stack >= MAX_stack) error ("! stack overflow");
+ stack [top_of_stack] = fl;
+ top_of_stack ++;
+}
+
+float pop ()
+{
+ top_of_stack --;
+ if (top_of_stack < 0) error ("! stack underflow");
+ return (stack [top_of_stack]);
+}
+
+#ifdef __STDC__
+void eat_this_character (char * s)
+#else
+void eat_this_character (s)
+char * s;
+#endif
+{
+ char * this_param_string;
+
+ do
+ {
+ get_token (ps_file);
+ this_param_string = param_string ();
+ }
+ while (! (strequ (this_param_string, "ND")
+ || strequ (this_param_string, "|-")));
+}
+
+#ifdef __STDC__
+bool ignore_this_character (char * s)
+# else
+bool ignore_this_character (s)
+char * s;
+# endif
+{
+ ignore_info_tp * ii;
+
+ for (ii = ignore_list; ii; ii = ii -> next)
+ {
+ if (strequ (ii -> AFM_name, s)) return (TRUE);
+ }
+ return (FALSE);
+}
+
+#ifdef __STDC__
+int charstring_command (char * s)
+#else
+int charstring_command (s)
+char * s;
+#endif
+{
+ char ** p;
+ int n;
+
+ if (s [0] == '/')
+ {
+ s ++;
+ if (ignore_this_character (s)
+ || ((strstr (obuffer, "seac") != NULL)
+ && ! processing_seacs)
+ || ((strstr (obuffer, "seac") == NULL)
+ && processing_seacs))
+ {
+ if (! have_found_seacs) have_found_seacs = TRUE;
+ eat_this_character (s);
+ return (not_a_charstring_command);
+ }
+ strcpy (current_char, s);
+ return (charstring_command_char);
+ }
+ for (p = charstring_commands, n = 0; * p; p ++, n ++)
+ if (strequ (s, * p)) return (n);
+ if (sscanf (s, "%f", & numeric_val) == 1)
+ return (charstring_command_numeric);
+ if (strequ (s, "end")) return (charstring_commands_end);
+ return (not_a_charstring_command);
+}
+
+#ifdef __STDC__
+int PS_header_command ()
+#else
+int PS_header_command ()
+#endif
+{
+ char ** p;
+ int n;
+
+ for (p = PS_header_commands, n = 0; * p; p ++, n ++)
+ if (strstr (obuffer, * p) != NULL) return (n);
+ return (not_a_PS_header_command);
+}
+
+/* Charstring Command Handling */
+
+/* Commands for Starting and Finishing */
+
+bool candidate_for_seac ()
+{
+ char ** p;
+
+ for (p = seac_candidates; * p; p ++)
+ if (strequ (current_char, * p))
+ return (TRUE);
+ return (FALSE);
+}
+
+void do_endchar ()
+{
+ /*
+ finishes a charstring outline definition and must be the last command
+ in a character's outline (except for accented character defined using
+ *seac*). When *endchar* is executed, Type 1 BuildChar performs several
+ tasks. It executes a *setcachedevice* operation, using a bounding box
+ it computes directly from the character outline and using the width
+ information acquired from a previous *hsbw* or *sbw* operation. (Note
+ that this is not the same order of events as in Type 3 Fonts.)
+ BuildChar then calls a special version of *fill* or *stroke* depending
+ on the value of *PaintType* in the font dictionary. The Type 1 font
+ format supports only *PaintType* 0 (fill) and 2 (outline). Note that
+ this single *fill* or *stroke* implies that there can be only one path
+ (possibly containing several subpaths) that can be created to be
+ filled or stroked by the *endchar* command.
+ */
+
+ if (active_path) do_closepath ();
+ if (candidate_for_seac ())
+ {
+ fprintf (mf_file, "chp[%d]:=currentpicture;\n",
+ current_AFM_num);
+ }
+ fprintf (mf_file, "endchar;\n");
+}
+
+#ifdef __STDC__
+void do_hsbw (float sbx, float wx)
+#else
+void do_hsbw (sbx, wx)
+float sbx, wx;
+#endif
+{
+ /*
+ sets the left sidebearing point at (sbx, 0) and sets the character
+ width vector to (wx, 0) in character space. This command also sets the
+ currentpoint to (sbx, 0), but does not place the point in the
+ character path. Use *rmoveto* for the first point in the path. The
+ name *hsbw* stands for horizontal sidebearing and width; horizontal
+ indicates that the y component of both the sidebearing and width is 0.
+ Either *sbw* or *hsbw* must be used once as the first command in a
+ character outline definition. It must be used only once. In
+ non-marking characters, such as the space character, the left
+ sidebearing point should be (0, 0).
+ */
+
+ do_sbw (sbx, 0.0, wx, 0.0);
+}
+
+#ifdef __STDC__
+void do_seac (float asb, float adx, float ady, int bchar, int achar)
+#else
+void do_seac (asb, adx, ady, bchar, achar)
+float asb, adx, ady;
+int bchar, achar;
+#endif
+{
+ /*
+ for standard encoding accented character, makes an accented character
+ from two other characters in its font program. The asb argument is the
+ x component of the left sidebearing of the accent; this value must be
+ the same as the sidebearing value given in the *hsbw* or *sbw* command
+ in the accent's own charstring. The origin of the accent is placed at
+ (adx, ady) relative to the origin of the base character. The bchar
+ argument is the character code of the base character, and the achar
+ argument is the the character code of the accent character. Both bchar
+ and achar are codes that these characters are assigned in the Adobe
+ StandardEncoding vector, given in an Appendix in the PostScript
+ Language Reference Manual. Furthermore, the characters represented by
+ achar and bchar must be in the same position in the font's encoding
+ vector as the positions they occupy in the Adobe StandardEncoding
+ vector. If the name of both components of an accented character do not
+ appear in the Adobe StandardEncoding vector, the accented character
+ cannot be build using the *seac* command.
+
+ The *FontBBox* entry in the font dictionary must be large enough to
+ accommodate both parts of the accented character. The *sbw* or *hsbw*
+ command that begins the accented character must be the same as the
+ corresponding command in the base character. Finally, *seac* is the
+ last command in the charstring for the accented character because the
+ accent and base characters' charstrings each already end with their
+ own *endchar* commands.
+
+ The use of this command saves space in a Type 1 font program, but its
+ use is restricted to those characters whose parts are defined in the
+ Adobe StandardEncoding vector. In situations where use of the *seac*
+ command is not possible, use of *Subrs* subroutines is a more general
+ means for creating accented characters.
+ */
+ fprintf (mf_file, "seac(%d,%d,%g,%g)\n", achar, bchar,
+ adx + current_point . x - asb, ady);
+ fprintf (mf_file, "endchar;\n");
+}
+
+#ifdef __STDC__
+void do_sbw (float sbx, float sby, float wx, float wy)
+#else
+void do_sbw (sbx, sby, wx, wy)
+float sbx, sby, wx, wy;
+#endif
+{
+ /*
+ sets the left sidebearing point to (sbx, sby) and sets the character
+ width vector to (wx, wy) in character space. This command also sets
+ the current point to (sbx, sby), but does not place the point in the
+ character path. Use *rmoveto* for the first point in the path. The
+ name *sbw* stands for sidebearing and width; the x and y components of
+ both the left sidebearing and width must be specified. If the y
+ components of both the left sidebearing and the width are 0, then the
+ *hsbw* command should be used. Either *sbw* or *hsbw* must be used
+ once as the first command in a character outline definition. It must
+ be used only once.
+ */
+
+ current_point . x = sbx;
+ current_point . y = sby;
+ the_sbx = sbx;
+}
+
+/* Path Construction Commands */
+
+void do_closepath ()
+{
+ /*
+ *closepath* closes a subpath. Adobe strongly recommends that all
+ character subpaths end with a *closepath* command, otherwise when an
+ outline is stroked (by setting *PaintType* equal to 2) you may get
+ unexpected behaviour where lines join. Note that, unlike the
+ *closepath* command in the PostScript language, this command does not
+ reposition the current point. Any subsequent *rmoveto* must be
+ relative to the current point in force before the Type 1 format
+ *closepath* command was given.
+
+ Make sure that any subpath section formed by the *closepath* command
+ intended to be zero length, is zero length. If not, the *closepath*
+ command may cause a "spike" or "hangnail" (if the subpath doubles back
+ onto itself) with unexpected results.
+ */
+
+ fprintf (mf_file, " )cp\n");
+ active_path = FALSE;
+ after_hint = FALSE;
+}
+
+#ifdef __STDC__
+void do_hlineto (float dx)
+#else
+void do_hlineto (dx)
+float dx;
+#endif
+{
+ /*
+ for horizontal lineto. Equivalent to dx 0 *rlineto*.
+ */
+
+ do_rlineto (dx, 0.0);
+}
+
+#ifdef __STDC__
+void do_hmoveto (float dx)
+#else
+void do_hmoveto (dx)
+float dx;
+#endif
+{
+ /*
+ for horizontal lineto. Equivalent to dx 0 *rmoveto*.
+ */
+
+ do_rmoveto (dx, 0.0);
+}
+
+#ifdef __STDC__
+void do_hvcurveto (float dx1, float dx2, float dy2, float dy3)
+#else
+void do_hvcurveto (dx1, dx2, dy2, dy3)
+float dx1, dx2, dy2, dy3;
+#endif
+{
+ /*
+ for horizontal-vertical curveto. Equivalent to dx1 0 dx2 dy2 0 dy3
+ *rrcurveto*. This command eliminates two arguments from an *rrcurveto*
+ call when the first B'ezier tangent is horizontal and the second
+ B'ezier tangent is vertical.
+ */
+
+ do_rrcurveto (dx1, 0.0, dx2, dy2, 0.0, dy3);
+}
+
+#ifdef __STDC__
+void do_rlineto (float dx, float dy)
+#else
+void do_rlineto (dx, dy)
+float dx, dy;
+#endif
+{
+ /*
+ (relative *lineto*) appends a straight line segment to the current
+ path in the same manner as *lineto*. However, the number pair is
+ interpreted as a displacement relative to the current point (x, y)
+ rather than as an absolute coordinate. That is, *rlineto* constructs a
+ line from (x, y) to (x + dx, y + dy) and makes (x + dx, y + dy) the
+ new current point. If the current point is undefined because the
+ current path is empty, *rlineto* executes the error *nocurrentpoint*.
+ */
+
+ current_point . x += dx;
+ current_point . y += dy;
+ fprintf (mf_file, "lt%s(%g,%g)\n",
+ after_hint ? "h" : "",
+ current_point . x,
+ current_point . y);
+ after_hint = FALSE;
+}
+
+#ifdef __STDC__
+void do_rmoveto (float dx, float dy)
+#else
+void do_rmoveto (dx, dy)
+float dx, dy;
+#endif
+{
+ /*
+ (relative *moveto*) starts a new subpath of the current path in the
+ same manner as *moveto*. However, the number pair is interpreted as a
+ displacement relative to the current point (x, y) rather than as an
+ absolute coordinate. That is, *rmoveto* makes (x + dx, y + dy) the new
+ currentpoint, without connecting it to the previous point. If the
+ current point is undefined because the current path is empty, *moveto*
+ executes the error *nocurrentpoint*.
+ */
+
+ current_point . x += dx;
+ current_point . y += dy;
+ if (active_path) do_closepath ();
+ path_number ++; active_path = TRUE;
+ if (after_hint) fprintf (mf_file, "ih\n");
+ fprintf (mf_file, "dr\n");
+ fprintf (mf_file, "ah((%g,%g)\n", current_point . x,
+ current_point . y);
+ after_hint = FALSE;
+}
+
+#ifdef __STDC__
+void do_rrcurveto (float dx1, float dy1, float dx2, float dy2, float dx3,
+ float dy3)
+#else
+void do_rrcurveto (dx1, dy1, dx2, dy2, dx3, dy3)
+float dx1, dy1, dx2, dy2, dx3, dy3;
+#endif
+{
+ /*
+ for relative *rcurveto*. Whereas the arguments to the *rcurveto*
+ operator in the PostScript language are all relative to the current
+ point, the arguments to *rrcurveto* are relative to each other.
+ Equivalent to dx1 dy1 (dx1 + dx2) (dy1 + dy2) (dx1 + dx2 + dx3, dy1 +
+ dy2 + dy3) *rcurveto*.
+ */
+
+ do_rcurveto (dx1, dy1, dx1 + dx2, dy1 + dy2, dx1 + dx2 + dx3,
+ dy1 + dy2 + dy3);
+}
+
+#ifdef __STDC__
+void do_vhcurveto (float dy1, float dx2, float dy2, float dx3)
+#else
+void do_vhcurveto (dy1, dx2, dy2, dx3)
+float dy1, dx2, dy2, dx3;
+#endif
+{
+ /*
+ for vertical-horizontal curveto. Equivalent to 0 dy1 dx2 dy2 dx3 0
+ *rrcurveto*. This command eliminates two arguments from an *rrcurveto*
+ call when the first B'ezier tangent is vertical and the second B'ezier
+ tangent is horizontal.
+ */
+
+ do_rrcurveto (0.0, dy1, dx2, dy2, dx3, 0.0);
+}
+
+#ifdef __STDC__
+void do_vlineto (float dy)
+#else
+void do_vlineto (dy)
+float dy;
+#endif
+{
+ /*
+ for vertical lineto. This is equivalent to 0 dy *rlineto*.
+ */
+
+ do_rlineto (0.0, dy);
+}
+
+#ifdef __STDC__
+void do_vmoveto (float dy)
+#else
+void do_vmoveto (dy)
+float dy;
+#endif
+{
+ /*
+ for vertical moveto. This is equivalent to 0 dy *rmoveto*.
+ */
+
+ do_rmoveto (0.0, dy);
+}
+
+void do_dotsection ()
+{
+ /*
+ brackets an outline section for the dots in letters such as "i", "j"
+ and "!". This is a hint command that indicates that a section of a
+ charstring should be understood as describing such a feature, rather
+ than as port of the main outline.
+ */
+
+}
+
+#ifdef __STDC__
+void do_hstem (float y, float dy)
+#else
+void do_hstem (y, dy)
+float y, dy;
+#endif
+{
+ /*
+ declares the vertical range of a horizontal stem zone between the y
+ coordinates y and y + dy, where y is relative to the y coordinate of
+ the left sidebearing point. Horizontal stem zones within a set of stem
+ hints for a single character may not overlap other horizontal stem
+ zones. Use hint replacement to avoid stem hint overlaps.
+ */
+
+ if (dy >= 0) fprintf (mf_file, "dh(\"hs(%g,%g)\")\n", y, y + dy);
+ else fprintf (mf_file, "dh(\"hs(%g,%g)\")\n", y + dy, y);
+ after_hint = TRUE;
+}
+
+#ifdef __STDC__
+void do_hstem3 (float y0, float dy0, float y1, float dy1, float y2, float dy2)
+#else
+void do_hstem3 (y0, dy0, y1, dy1, y2, dy2)
+float y0, dy0, y1, dy1, y2, dy2;
+#endif
+{
+ /*
+ declares the vertical ranges of three horizontal stem zones between
+ the y coordinates y0 and y0 + dy0, y1 and y1 + dy2, and between y2 and
+ y2 + dy2, where y0, y1 and y2 are all relative to the y coordinate of
+ the left sidebearing point. The *hstem3* command sorts these zones by
+ the y values to obtain the lowest, middle and highest zones, called
+ ymin, ymid and ymax respectively. The corresponding dy values are
+ called dymin, dymid and dymax. These stems and the counters between
+ them will all be controled. These coordinates must obey certain
+ restrictions:
+
+ . dymin = dymax
+
+ . The distance from ymin + dymin/2 to ymid + dymid/2 must equal the
+ distance from ymid + dymid/2 to ymax + dymax/2. In other words, the
+ distance from the center of the bottom stem to the center of the
+ middle stem must be the same as the distance from the center of the
+ middle stem to the center of the top stem.
+
+ If a charstring uses an *hstem3* command in the hints for a character,
+ the charstring must not use *hstem* commands and it must use the same
+ *hstem3* command consistently if hint replacement is performed.
+
+ The *hstem3* command is especially suited for controlling the stems
+ and counters of symbols with three horizontally oriented features with
+ equal vertical widths and with equal white space between these
+ features, such as the mathematical equivalence symbol or the division
+ symbol.
+ */
+
+ do_hstem (y0, dy0);
+ do_hstem (y1, dy1);
+ do_hstem (y2, dy2);
+ fprintf (mf_file, "dh(\"hst\")\n");
+}
+
+#ifdef __STDC__
+void do_vstem (float x, float dx)
+# else
+void do_vstem (x, dx)
+float x, dx;
+# endif
+{
+ /*
+ declares the horizontal range of a vertical stem zone between the x
+ coordinates x and x + dx, where x is relative to the x coordinate of
+ the left sidebearing point. Vertical stem zones within a set of stem
+ hints for a single character may not overlap other vertical stem
+ zones. Use hint replacement to avoid stem hint overlap.
+ */
+
+ if (dx >= 0) fprintf (mf_file, "dh(\"vs(%g,%g)\")\n", x + the_sbx,
+ x + dx + the_sbx);
+ else fprintf (mf_file, "dh(\"vs(%g,%g)\")\n", x + dx + the_sbx,
+ x + the_sbx);
+ after_hint = TRUE;
+}
+
+#ifdef __STDC__
+void do_vstem3 (float x0, float dx0, float x1, float dx1, float x2, float dx2)
+#else
+void do_vstem3 (x0, dx0, x1, dx1, x2, dx2)
+float x0, dx0, x1, dx1, x2, dx2;
+#endif
+{
+ /*
+ declares the horizontal ranges of three vertical stem zones between
+ the x coordinates x0 and x0 + dx0, x1 and x1 + dx2, and x2 and x2 +
+ dx2, where x0, x1 and x2 are all relative to the x coordinate of the
+ left sidebearing point. The *vstem3* command sorts these zones by the
+ x values to obtain the leftmost, middle and rightmost zones, called
+ xmin, xmid and xmax respectively. The corresponding dx values are
+ called dxmin, dxmid and dxmax. These stems and the counters between
+ them will all be controled. These coordinates must obey certain
+ restrictions:
+
+ . dxmin = dxmax
+
+ . The distance from xmin + dxmin/2 to xmid + dxmid/2 must equal the
+ distance from xmid + dxmid/2 to xmax + dxmax/2. In other words, the
+ distance from the center of the left stem to the center of the
+ middle stem must be the same as the distance from the center of the
+ middle stem to the center of the right stem.
+
+ If a charstring uses an *vstem3* command in the hints for a character,
+ the charstring must not use *vstem* commands and it must use the same
+ *vstem3* command consistently if hint replacement is performed.
+
+ The *vstem3* command is especially suited for controlling the stems
+ and counters of characters such as a lower case "m".
+ */
+
+ do_vstem (x0, dx0);
+ do_vstem (x1, dx1);
+ do_vstem (x2, dx2);
+ fprintf (mf_file, "dh(\"vst\")\n");
+}
+
+#ifdef __STDC__
+void do_rcurveto (float dx1, float dy1, float dx2, float dy2, float dx3,
+ float dy3)
+#else
+void do_rcurveto (dx1, dy1, dx2, dy2, dx3, dy3)
+float dx1, dy1, dx2, dy2, dx3, dy3;
+#endif
+{
+ /*
+ (relative *curveto*) adds a B'ezier cubic section to the current path
+ in the same manner as *curveto*. However, the three number pairs are
+ interpreted as displacements relative to the current point (x0, y0)
+ rather than as absolute coordinates. That is, *rcurveto* constructs a
+ curve from (x0, y0) to (x0 + dx3, y0 + dy3), using (x0 + dx1, y0 +
+ dy1) and (x0 + dx2, y0 + dy2) as B'ezier control points.
+ */
+
+ fprintf (mf_file, "ct%s(%g,%g,%g,%g,%g,%g)\n",
+ after_hint ? "h" : "",
+ current_point . x + dx1,
+ current_point . y + dy1,
+ current_point . x + dx2,
+ current_point . y + dy2,
+ current_point . x + dx3,
+ current_point . y + dy3);
+ current_point . x += dx3;
+ current_point . y += dy3;
+ after_hint = FALSE;
+}
+
+/* Arithmetic Command */
+
+#ifdef __STDC__
+void do_div (float num1, float num2)
+#else
+void do_div (num1, num2)
+float num1, num2;
+#endif
+{
+ /*
+ divides num1 by num2, producing a result that is always a real even if
+ both operands are integers
+ */
+
+ push (num1 / num2);
+}
+
+/* Subroutine Commands */
+
+#ifdef __STDC__
+void do_moveto_for_flex (float dx, float dy)
+# else
+void do_moveto_for_flex (dx, dy)
+float dx, dy;
+#endif
+{
+ current_point . x += dx;
+ current_point . y += dy;
+ flex . x [flex . n] = current_point . x;
+ flex . y [flex . n] = current_point . y;
+}
+
+#ifdef __STDC__
+void do_callothersubr (int othersubr, int n)
+#else
+void do_callothersubr (othersubr, n)
+int othersubr, n;
+#endif
+{
+ /*
+ is a mechanism used by Type 1 BuildChar to make calls on the
+ PostScript interpreter. Arguments argn through arg1 are pushed onto
+ the PostScript interpreter operand stack, and the PostScript language
+ procedure in the othersubr# position in the *OtherSubrs* array in the
+ *Private* dictionary (or a built-in function equivalent to this
+ procedure) is executed. Note that the argument order will be reversed
+ when pushed onto the PostScript interpreter operand stack. After the
+ arguments are pushed onto the PostScript interpreter operand stack,
+ the PostScript interpreter performs a *begin* operation on
+ *systemdict* followed by a *begin* operation on the font dictionary
+ prior to executing the *OtherSubrs* entry. When the *OtherSubrs* entry
+ completes its execution, the PostScript interpreter performs two *end*
+ operations prior to returning to Type 1 BuildChar charstring
+ execution. Use *pop* commands to retrieve results from the PostScript
+ operand stack back to the Type 1 BuildChar operand stack.
+ */
+
+ float flex_h;
+
+ switch (othersubr)
+ {
+ case 0:
+ {
+ (void) pop (); /* end point y */
+ (void) pop (); /* end point x */
+ flex_h = pop (); /* flex feature height */
+ if (! active_flex)
+ error ("! othersub 1 required before Flex othersub 0\n");
+ if (flex . n != 7)
+ error ("! seven calls to othersub 2 required before Flex othersub 0\n");
+ fprintf (mf_file,
+ " fl%s(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)\n",
+ after_hint ? "h" : "",
+ flex . x [0], flex . y [0],
+ flex . x [1], flex . y [1],
+ flex . x [2], flex . y [2],
+ flex . x [3], flex . y [3],
+ flex . x [4], flex . y[4],
+ flex . x [5], flex . y [5],
+ flex . x [6], flex . y [6],
+ flex_h);
+ active_flex = after_hint = FALSE;
+ }
+ break;
+ case 1:
+ {
+ active_flex = TRUE;
+ flex . n = 0;
+ }
+ break;
+ case 2:
+ {
+ flex . n ++;
+ }
+ break;
+ case 3:
+ {
+ if (active_path && ! after_hint)
+ fprintf (mf_file, " )\n");
+ }
+ break;
+ }
+}
+
+#ifdef __STDC__
+void do_callsubr (int subr_no)
+#else
+void do_callsubr (subr_no)
+int subr_no;
+#endif
+{
+ /*
+ calls a charstring subroutine with index subr# form the *Subrs* array
+ in the *private* dictionary. Each element of the *Subrs* array is a
+ charstring encoded and encrypted like any other charstring. Arguments
+ pushed on the Type 1 BuildChar operand stack prior to calling the
+ subroutine, and results pushed on the stack by the subroutine, act
+ according to the manner in which the subroutine is coded. These
+ subroutines are generally used to encode sequences of path commands
+ that are repeated throughout the font program, for example, serif
+ outline sequences. Subroutine calls may be nested 10 deep.
+ */
+
+ if (Subrs_entries [subr_no] == NULL)
+ {
+ error ("! Undefined subroutine called");
+ }
+ processing_Subr = TRUE;
+ current_Subr ++;
+ Subrs_stack [current_Subr] = Subrs_entries [subr_no];
+}
+
+float do_pop ()
+{
+ /*
+ removes a number from the top of the PostScript interpreter operand
+ stack and pushes that number onto the Type1 BuildChar operand stack.
+ This command is used only to retrieve a result from an *OtherSubrs*
+ procedure.
+ */
+
+ return (0.0);
+}
+
+void do_return ()
+{
+ /*
+ returns from a *Subrs* array charstring subroutine (that had been
+ called with a *callsubr* command) and continues execution in the
+ calling charstring.
+ */
+
+ current_Subr --;
+ if (current_Subr < 0) processing_Subr = FALSE;
+}
+
+#ifdef __STDC__
+void do_setcurrentpoint (float x, float y)
+#else
+void do_setcurrentpoint (x, y)
+float x, y;
+#endif
+{
+ /*
+ sets the current point in the Type 1 format *BuildChar* to (x, y) in
+ absolute character space coordinates without performing a charstring
+ *moveto* command. This establishes the current point for a subsequent
+ relative path building command. The *setcurrentpoint* command is used
+ only in conjunction with results from *OtherSubrs* procedures.
+ */
+
+ current_point . x = x;
+ current_point . y = y;
+}
+
+void process_hstem () /* hstem: |- y dy hstem (1) |- */
+{
+ float y, dy;
+
+ dy = pop ();
+ y = pop ();
+ do_hstem (y, dy);
+}
+
+
+void process_vstem () /* vstem: |- x dx vstem (3) |- */
+{
+ float x, dx;
+
+ dx = pop ();
+ x = pop ();
+ do_vstem (x, dx);
+}
+
+
+void process_vmoveto () /* vmoveto: |- dy vmoveto (4) |- */
+{
+ float dy;
+
+ dy = pop ();
+ if (active_flex) do_moveto_for_flex (0.0, dy);
+ else do_vmoveto (dy);
+}
+
+void process_rlineto () /* rlineto: |- dx dy rlineto (5) |- */
+{
+ float dx, dy;
+
+ dy = pop ();
+ dx = pop ();
+ do_rlineto (dx, dy);
+}
+
+void process_hlineto () /* hlineto: |- dx hlineto (6) |- */
+{
+ float dx;
+
+ dx = pop ();
+ do_hlineto (dx);
+}
+
+void process_vlineto () /* vlineto: |- dy vlineto (7) |- */
+{
+ do_vlineto (pop ());
+}
+
+void process_rrcurveto () /* rrcurveto: |- dx1 dy1 dx2 dy2 dx3 dy3 rrcurveto (8) |- */
+{
+ float dx1, dy1, dx2, dy2, dx3, dy3;
+
+ dy3 = pop ();
+ dx3 = pop ();
+ dy2 = pop ();
+ dx2 = pop ();
+ dy1 = pop ();
+ dx1 = pop ();
+ do_rrcurveto (dx1, dy1, dx2, dy2, dx3, dy3);
+}
+
+void process_closepath () /* - closepath (9) |- */
+{
+ do_closepath ();
+}
+
+void process_callsubr () /* subr# callsubr */
+{
+ do_callsubr ((int) pop ());
+}
+
+void process_return () /* - return (11) - */
+{
+ /*
+ returns from a *Subrs* array charstring subroutine (that had been
+ called with a *callsubr* command) and continues execution in the
+ calling charstring.
+ */
+
+ do_return ();
+}
+
+void process_escape () /* escape (12) */
+{
+ /* skip */;
+}
+
+void process_hsbw () /* |- sbx wx hsbw (13) |- */
+{
+ float sbx, wx;
+
+ wx = pop ();
+ sbx = pop ();
+ do_hsbw (sbx, wx);
+}
+
+void process_endchar () /* - endchar (14) |- */
+{
+ do_endchar ();
+}
+
+void process_rmoveto () /* |- dx dy rmoveto (21) |- */
+{
+ float dx, dy;
+
+ dy = pop ();
+ dx = pop ();
+ if (active_flex) do_moveto_for_flex (dx, dy);
+ else do_rmoveto (dx, dy);
+}
+
+void process_hmoveto () /* |- dx hmoveto (22) |- */
+{
+ float dx;
+
+ dx = pop ();
+ if (active_flex) do_moveto_for_flex (dx, 0.0);
+ else do_hmoveto (dx);
+}
+
+void process_vhcurveto () /* |- dy1 dx2 dy2 dx3 vhcurveto (30) |- */
+{
+ float dy1, dx2, dy2, dx3;
+
+ dx3 = pop ();
+ dy2 = pop ();
+ dx2 = pop ();
+ dy1 = pop ();
+ do_vhcurveto (dy1, dx2, dy2, dx3);
+}
+
+void process_hvcurveto () /* |- dx1 dx2 dy2 dy3 hvcurveto (31) |- */
+{
+ float dx1, dx2, dy2, dy3;
+
+ dy3 = pop ();
+ dy2 = pop ();
+ dx2 = pop ();
+ dx1 = pop ();
+ do_hvcurveto (dx1, dx2, dy2, dy3);
+}
+
+void process_dotsection () /* - dotsection (12 0) |- */
+{
+ do_dotsection ();
+}
+
+void process_vstem3 () /* |- x0 dx0 x1 dx1 x2 dx2 vstem3 (12 1) |- */
+{
+ float x0, dx0, x1, dx1, x2, dx2;
+
+ dx2 = pop ();
+ x2 = pop ();
+ dx1 = pop ();
+ x1 = pop ();
+ dx0 = pop ();
+ x0 = pop ();
+ do_vstem3 (x0, dx0, x1, dx1, x2, dx2);
+}
+
+void process_hstem3 () /* |- y0 dy0 y1 dy1 y2 dy2 hstem3 (12 2) |- */
+{
+ float y0, dy0, y1, dy1, y2, dy2;
+
+ dy2 = pop ();
+ y2 = pop ();
+ dy1 = pop ();
+ y1 = pop ();
+ dy0 = pop ();
+ y0 = pop ();
+ do_hstem3 (y0, dy0, y1, dy1, y2, dy2);
+}
+
+void process_seac () /* |- asb adx ady bchar achar seac (12 6) |- */
+{
+ float asb, adx, ady;
+ int bchar, achar;
+
+ achar = (int) pop ();
+ bchar = (int) pop ();
+ ady = pop ();
+ adx = pop ();
+ asb = pop ();
+ do_seac (asb, adx, ady, bchar, achar);
+}
+
+void process_sbw () /* |- sbx sby wx wy sbw (12 7) |- */
+{
+ float sbx, sby, wx, wy;
+
+ wy = pop ();
+ wx = pop ();
+ sby = pop ();
+ sbx = pop ();
+ do_sbw (sbx, sby, wx, wy);
+}
+
+void process_div () /* num1 num2 div (12 12) quotient */
+{
+ float num1, num2;
+
+ num2 = pop ();
+ num1 = pop ();
+ do_div (num1, num2);
+}
+
+void process_callothersubr () /* arg1 ... argn n othersubr# callothersubr (12 16) - */
+{
+ int othersubr, n;
+
+ othersubr = (int) pop ();
+ n = (int) pop ();
+ do_callothersubr (othersubr, n);
+}
+
+float process_pop ()
+{
+ return (do_pop ());
+}
+
+void process_setcurrentpoint () /* |- x y setcurrentpoint (12 33) |- */
+{
+ float x, y;
+
+ y = pop ();
+ x = pop ();
+ do_setcurrentpoint (x, y);
+}
+
+
+#ifdef __STDC__
+void start_char (char * name)
+#else
+void start_char (name)
+char * name;
+#endif
+{
+ AFM_info_tp * ai;
+
+ ai = find_AFM_info_for (name);
+ if (ai == NULL || ai -> TeX_num == -1)
+ {
+/* fprintf (stderr, "No TeX coding found for character %s\n",
+ name); */
+ eat_this_character (name);
+ return;
+ }
+ if (first_time_generating)
+ {
+ fprintf (stderr, "Generating MF code for %s", name);
+ linepos = strlen ("Generating MF code for ");
+ linepos += strlen (name);
+ first_time_generating = FALSE;
+ }
+ else
+ {
+ if (linepos + strlen (name) + 3 < 79)
+ {
+ fprintf (stderr, ", %s", name);
+ linepos += strlen (name) + 3;
+ }
+ else
+ {
+ fprintf (stderr, ",\n %s", name);
+ linepos = strlen (name) + 2;
+ }
+ }
+ fprintf (mf_file, "\nbeginchar(%d,%d*FX#,%d*FY#,%d*FY#);\n",
+ ai -> TeX_num, ai -> width, ai -> bbox_ury,
+ (ai -> bbox_lly == 0) ? 0 : -ai -> bbox_lly);
+ fprintf (mf_file, "\"%s\";\n", ai -> AFM_name);
+ path_number = 0; active_path = FALSE;
+ ai -> in_MF_file = TRUE;
+ current_AFM_num = ai -> AFM_num;
+}
+
+Subrs_entry_tp * new_Subrs_entry ()
+{
+ Subrs_entry_tp * nse;
+
+ nse = (Subrs_entry_tp *) my_malloc (sizeof (Subrs_entry_tp));
+ nse -> token = NULL;
+ nse -> next = NULL;
+ return (nse);
+}
+
+void process_one_Subrs_entry ()
+{
+ Subrs_entry_tp * se, * nse, * lse;
+ char * p;
+ int n;
+ bool stop;
+
+ stop = FALSE;
+ expect ("dup");
+ n = param_num ();
+ if (n >= MAX_Subrs_entries) error ("! Too many Subrs");
+ se = new_Subrs_entry ();
+ lse = se;
+ while (! stop)
+ {
+ nse = new_Subrs_entry ();
+ nse -> token = param_new_string ();
+ if (strequ (nse -> token, "return")) stop = TRUE;
+ lse -> next = nse;
+ lse = nse;
+ if (! * param) get_line (ps_file);
+ }
+ Subrs_entries [n] = se;
+}
+
+void process_Subrs_entries ()
+{
+ int i;
+
+ while (get_line (ps_file))
+ {
+ if (strstr (obuffer, "dup") == NULL) return;
+ else process_one_Subrs_entry ();
+ }
+}
+
+void get_paint_type ()
+{
+ char * dummy_string;
+ int dummy_int;
+
+ dummy_string = param_string ();
+ dummy_int = param_num ();
+ if (dummy_int != 0) error ("! Can only handle outlinefonts");
+}
+
+void get_font_type ()
+{
+ char * dummy_string;
+ int dummy_int;
+
+ dummy_string = param_string ();
+ dummy_int = param_num ();
+ if (dummy_int != 1) error ("! Can only translate Type 1 fonts");
+}
+
+void get_font_matrix ()
+{
+ char * dummy_string;
+ float dummy_float;
+
+ dummy_string = param_string ();
+ if (* param == '[')
+ {
+ param ++;
+ while (* param == ' ') param ++;
+ }
+ x_scale = param_float ();
+ dummy_float = param_float ();
+ dummy_float = param_float ();
+ y_scale = param_float ();
+}
+
+void get_italic_angle ()
+{
+ char * dummy_string;
+ float dummy_float;
+
+ dummy_string = param_string ();
+ if (italic_angle != param_float ())
+ {
+ error ("! PS en AFM do not match");
+ }
+}
+
+void get_is_fixed_pitch ()
+{
+ char * dummy_string;
+
+ dummy_string = param_string ();
+ if (fixed_pitch != ((* param == 't' || * param == 'T') ? TRUE : FALSE))
+ {
+ error ("! PS en AFM do not match");
+ }
+}
+
+void get_blue_scale ()
+{
+ char * dummy_string;
+ float dummy_float;
+ int dummy_int;
+
+ dummy_string = param_string ();
+ blue_scale = param_float ();
+}
+
+void get_blue_shift ()
+{
+ char * dummy_string;
+ float dummy_float;
+ int dummy_int;
+
+ dummy_string = param_string ();
+ blue_shift = param_num ();
+}
+
+void get_blue_fuzz ()
+{
+ char * dummy_string;
+ float dummy_float;
+ int dummy_int;
+
+ dummy_string = param_string ();
+ blue_fuzz = param_num ();
+}
+
+void get_blue_values ()
+{
+ char * dummy_string;
+
+ num_of_blue_values = 0;
+ dummy_string = param_string ();
+ if (* param == '[')
+ {
+ param ++;
+ while (* param == ' ') param ++;
+ }
+ while (isdigit (* param) || * param == '-') /* added ILH */
+ {
+ if (num_of_blue_values == 0)
+ {
+ blue_values [num_of_blue_values] . overshoot
+ = param_num ();
+ blue_values [num_of_blue_values] . position
+ = param_num ();
+ }
+ else
+ {
+ blue_values [num_of_blue_values] . position
+ = param_num ();
+ blue_values [num_of_blue_values] . overshoot
+ = param_num ();
+ }
+ num_of_blue_values ++;
+/* if (num_of_blue_values >= MAX_blue_values) */
+ }
+}
+
+void get_other_blues ()
+{
+ char * dummy_string;
+ float dummy_float;
+ int dummy_int;
+
+ num_of_other_blues = 0;
+ dummy_string = param_string ();
+ if (* param == '[')
+ {
+ param ++;
+ while (* param == ' ') param ++;
+ }
+ while (isdigit (* param) || * param == '-') /* added ILH */
+ {
+ other_blues [num_of_other_blues] . overshoot = param_num ();
+ other_blues [num_of_other_blues] . position = param_num ();
+ num_of_other_blues ++;
+/* if (num_of_other_blues >= MAX_other_blues) */
+ }
+}
+
+void parse_PS_header ()
+{
+ /* Skip PS file until FontInfo entry -- the FontInfo case below will
+ not be called because we eat it now */
+ while (get_line (ps_file) && PS_header_command () != FontInfo)
+ /* skip */;
+ while (get_line (ps_file))
+ {
+ switch (PS_header_command ())
+ {
+ case FontInfo: break;
+ case FontName: break;
+ case Encoding: break;
+ case PaintType:
+ {
+ get_paint_type ();
+ }
+ break;
+ case FontType:
+ {
+ get_font_type ();
+ }
+ break;
+ case FontMatrix:
+ {
+ get_font_matrix ();
+ }
+ break;
+ case FontBBox: break;
+ case UniqueID: break;
+ case Metrics: break;
+ case StrokeWidth: break;
+ case Private: break;
+ case CharStrings:
+ {
+ get_line (ps_file);
+ return;
+ }
+ case FID: break;
+ case version: break;
+ case Notice: break;
+ case FullName: break;
+ case FamilyName: break;
+ case Weight: break;
+ case ItalicAngle:
+ {
+ get_italic_angle ();
+ }
+ break;
+ case isFixedPitch:
+ {
+ get_is_fixed_pitch ();
+ }
+ break;
+ case UnderlinePosition: break;
+ case UnderlineThickness: break;
+ case BlueFuzz:
+ {
+ get_blue_fuzz ();
+ }
+ break;
+ case BlueScale:
+ {
+ get_blue_scale ();
+ }
+ break;
+ case BlueShift:
+ {
+ get_blue_shift ();
+ }
+ break;
+ case BlueValues:
+ {
+ get_blue_values ();
+ }
+ break;
+ case ExpansionFactor: break;
+ case FamilyBlues: break;
+ case FamilyOtherBlues: break;
+ case ForceBold: break;
+ case LanguageGroup: break;
+ case lenIV: break;
+ case MinFeature: break;
+ case ND: break;
+ case NP: break;
+ case OtherSubrs: break;
+ case OtherBlues:
+ {
+ get_other_blues ();
+ }
+ break;
+ case password: break;
+ case RD: break;
+ case RndStemUp: break;
+ case StdHW: break;
+ case StdVW: break;
+ case StemSnapH: break;
+ case StemSnapV: break;
+ case Subrs:
+ {
+ process_Subrs_entries ();
+ }
+ break;
+ case not_a_PS_header_command: break;
+ default: break;
+ }
+ }
+}
+
+char * next_param_string ()
+{
+ if (! processing_Subr) return (param_string ());
+ Subrs_stack [current_Subr] = Subrs_stack [current_Subr] -> next;
+ return (Subrs_stack [current_Subr] -> token);
+}
+
+void parse_charstrings_dictionary ()
+{
+ float dummy;
+
+ processing_Subr = FALSE;
+ current_Subr = -1;
+ while (get_token (ps_file))
+ {
+ switch (charstring_command (next_param_string ()))
+ {
+ case hstem: process_hstem (); break;
+ case vstem: process_vstem (); break;
+ case vmoveto: process_vmoveto (); break;
+ case rlineto: process_rlineto (); break;
+ case hlineto: process_hlineto (); break;
+ case vlineto: process_vlineto (); break;
+ case rrcurveto: process_rrcurveto (); break;
+ case closepath: process_closepath (); break;
+ case callsubr: process_callsubr (); break;
+ case return_command: process_return (); break;
+ case escape: process_escape (); break;
+ case hsbw: process_hsbw (); break;
+ case endchar: process_endchar (); break;
+ case rmoveto: process_rmoveto (); break;
+ case hmoveto: process_hmoveto (); break;
+ case vhcurveto: process_vhcurveto (); break;
+ case hvcurveto: process_hvcurveto (); break;
+ case dotsection: process_dotsection (); break;
+ case vstem3: process_vstem3 (); break;
+ case hstem3: process_hstem3 (); break;
+ case seac: process_seac (); break;
+ case sbw: process_sbw (); break;
+ case div: process_div (); break;
+ case callothersubr: process_callothersubr ();
+ break;
+ case pop_command: dummy = process_pop (); break;
+ case charstring_command_numeric:
+ push (numeric_val); break;
+ case charstring_command_char:
+ start_char (current_char);
+ break;
+ case charstring_commands_end: return;
+ default: break;
+ }
+ }
+}
+
+void parse_PS ()
+{
+ top_of_stack = 0;
+ x_scale = 1000; y_scale = 1000;
+ have_found_seacs = FALSE; after_hint = FALSE;
+ the_sbx = 0.0;
+ blue_scale = 0.039625; blue_shift = 7; blue_fuzz = 1;
+ first_time_generating = TRUE;
+ parse_PS_header ();
+ write_MF_header ();
+ charstring_position = ftell (ps_file);
+ processing_seacs = FALSE;
+ parse_charstrings_dictionary ();
+ if (have_found_seacs)
+ {
+ fseek (ps_file, charstring_position, 0);
+ processing_seacs = TRUE;
+ parse_charstrings_dictionary ();
+ }
+ fprintf (stderr, ".\n");
+ process_ligatures_and_kerns ();
+ write_MF_trailer ();
+}
diff --git a/fonts/utilities/ps2mf/PSparse.h b/fonts/utilities/ps2mf/PSparse.h
new file mode 100644
index 0000000000..75c5c0a0b7
--- /dev/null
+++ b/fonts/utilities/ps2mf/PSparse.h
@@ -0,0 +1,335 @@
+/* PSparse.h */
+
+char * PS_header_commands [] =
+{
+ "/FontInfo",
+ "/FontName",
+ "/Encoding",
+ "/PaintType",
+ "/FontType",
+ "/FontMatrix",
+ "/FontBBox",
+ "/UniqueID",
+ "/Metrics",
+ "/StrokeWidth",
+ "/Private",
+ "/CharStrings",
+ "/FID",
+ "/version",
+ "/Notice",
+ "/FullName",
+ "/FamilyName",
+ "/Weight",
+ "/ItalicAngle",
+ "/isFixedPitch",
+ "/UnderlinePosition",
+ "/UnderlineThickness",
+ "/BlueFuzz",
+ "/BlueScale",
+ "/BlueShift",
+ "/BlueValues",
+ "/ExpansionFactor",
+ "/FamilyBlues",
+ "/FamilyOtherBlues",
+ "/ForceBold",
+ "/LanguageGroup",
+ "/lenIV",
+ "/MinFeature",
+ "/ND",
+ "/NP",
+ "/OtherBlues",
+ "/OtherSubrs",
+ "/password",
+ "/RD",
+ "/RndStemUp",
+ "/StdHW",
+ "/StdVW",
+ "/StemSnapH",
+ "/StemSnapV",
+ "/Subrs",
+ NULL
+};
+
+#define FontInfo (0)
+#define FontName (1)
+#define Encoding (2)
+#define PaintType (3)
+#define FontType (4)
+#define FontMatrix (5)
+#define FontBBox (6)
+#define UniqueID (7)
+#define Metrics (8)
+#define StrokeWidth (9)
+#define Private (10)
+#define CharStrings (11)
+#define FID (12)
+#define version (13)
+#define Notice (14)
+#define FullName (15)
+#define FamilyName (16)
+#define Weight (17)
+#define ItalicAngle (18)
+#define isFixedPitch (19)
+#define UnderlinePosition (20)
+#define UnderlineThickness (21)
+#define BlueFuzz (22)
+#define BlueScale (23)
+#define BlueShift (24)
+#define BlueValues (25)
+#define ExpansionFactor (26)
+#define FamilyBlues (27)
+#define FamilyOtherBlues (28)
+#define ForceBold (29)
+#define LanguageGroup (30)
+#define lenIV (31)
+#define MinFeature (32)
+#define ND (33)
+#define NP (34)
+#define OtherBlues (35)
+#define OtherSubrs (36)
+#define password (37)
+#define RD (38)
+#define RndStemUp (39)
+#define StdHW (40)
+#define StdVW (41)
+#define StemSnapH (42)
+#define StemSnapV (43)
+#define Subrs (44)
+#define not_a_PS_header_command (-1)
+
+char * charstring_commands [] =
+{
+ "hstem",
+ "vstem",
+ "vmoveto",
+ "rlineto",
+ "hlineto",
+ "vlineto",
+ "rrcurveto",
+ "closepath",
+ "callsubr",
+ "return",
+ "escape",
+ "hsbw",
+ "endchar",
+ "rmoveto",
+ "hmoveto",
+ "vhcurveto",
+ "hvcurveto",
+ "dotsection",
+ "vstem3",
+ "hstem3",
+ "seac",
+ "sbw",
+ "div",
+ "callothersubr",
+ "pop",
+ "setcurrentpoint",
+ NULL
+};
+
+#define hstem (0)
+#define vstem (1)
+#define vmoveto (2)
+#define rlineto (3)
+#define hlineto (4)
+#define vlineto (5)
+#define rrcurveto (6)
+#define closepath (7)
+#define callsubr (8)
+#define return_command (9) /* return is a reserved word !!!! */
+#define escape (10)
+#define hsbw (11)
+#define endchar (12)
+#define rmoveto (13)
+#define hmoveto (14)
+#define vhcurveto (15)
+#define hvcurveto (16)
+#define dotsection (17)
+#define vstem3 (18)
+#define hstem3 (19)
+#define seac (20)
+#define sbw (21)
+#define div (22)
+#define callothersubr (23)
+#define pop_command (24)
+#define setcurrentpoint (25)
+#define not_a_charstring_command (-1)
+#define charstring_command_numeric (-2)
+#define charstring_command_char (-3)
+#define charstring_commands_end (-4)
+
+char * seac_candidates [] =
+{
+ "A",
+ "C",
+ "E",
+ "I",
+ "N",
+ "O",
+ "S",
+ "U",
+ "Y",
+ "Z",
+ "a",
+ "c",
+ "dotlessi",
+ "e",
+ "n",
+ "o",
+ "s",
+ "u",
+ "y",
+ "z",
+ "acute",
+ "caron",
+ "cedilla",
+ "circumflex",
+ "dieresis",
+ "grave",
+ "ring",
+ "tilde",
+ NULL
+};
+
+#define MAX_Subrs_entries 1000 /* Really I have seen a font with 612 entries */
+#define MAX_Subrs_stack 11
+bool processing_Subr;
+int current_Subr;
+
+typedef struct Subrs_entry
+{
+ char * token;
+ struct Subrs_entry * next;
+} Subrs_entry_tp;
+Subrs_entry_tp * Subrs_entries [MAX_Subrs_entries],
+ * Subrs_stack [MAX_Subrs_stack];
+
+char coding_vector [255][35];
+
+#define MAX_stack 1500
+float stack [MAX_stack];
+int top_of_stack;
+float numeric_val;
+char current_char [35];
+int current_AFM_num;
+bool after_hint;
+float the_sbx;
+
+int active_path, path_number;
+bool active_flex;
+typedef struct Flex
+{
+ float x [7], y [7];
+ int n;
+} Flex_tp;
+Flex_tp flex;
+typedef struct cartesian
+{
+ float x;
+ float y;
+} cartesian_tp;
+cartesian_tp current_point;
+bool processing_seacs, have_found_seacs;
+long charstring_position;
+
+#define MAX_blue_values 7
+#define MAX_other_blues 5
+typedef struct blue_pairs
+{
+ int overshoot;
+ int position;
+} blue_pairs_tp;
+blue_pairs_tp blue_values [MAX_blue_values], other_blues [MAX_other_blues];
+int num_of_blue_values, num_of_other_blues;
+float blue_scale;
+int blue_shift;
+int blue_fuzz;
+
+bool first_time_generating;
+int linepos;
+
+#ifndef __P
+#ifdef __STDC__
+#define __P(a) a
+#else
+#define __P(a) ()
+#endif
+#endif
+
+bool candidate_for_seac __P((void));
+int charstring_command __P((char * s));
+void do_callothersubr __P((int othersubr, int n));
+void do_callsubr __P((int subr_no));
+void do_closepath __P((void));
+void do_div __P((float num1, float num2));
+void do_dotsection __P((void));
+void do_endchar __P((void));
+void do_hlineto __P((float dx));
+void do_hmoveto __P((float dx));
+void do_hsbw __P((float sbx, float wx));
+void do_hstem __P((float y, float dy));
+void do_hstem3 __P((float y0, float dy0, float y1, float dy1, float y2,
+ float dy2));
+void do_hvcurveto __P((float dx1, float dx2, float dy2, float dy3));
+float do_pop __P((void));
+void do_rcurveto __P((float dx1, float dy1, float dx2, float dy2, float dx3,
+ float dy3));
+void do_return __P((void));
+void do_rlineto __P((float dx, float dy));
+void do_rmoveto __P((float dx, float dy));
+void do_rrcurveto __P((float dx1, float dy1, float dx2, float dy2, float dx3,
+ float dy3));
+void do_sbw __P((float sbx, float sby, float wx, float wy));
+void do_seac __P((float asb, float adx, float ady, int bchar, int achar));
+void do_setcurrentpoint __P((float x, float y));
+void do_vhcurveto __P((float dy1, float dx2, float dy2, float dx3));
+void do_vlineto __P((float dy));
+void do_vmoveto __P((float dy));
+void do_vstem __P((float x, float dx));
+void do_vstem3 __P((float x0, float dx0, float x1, float dx1, float x2,
+ float dx2));
+void eat_this_character __P((char * s));
+void get_blue_scale __P((void));
+void get_blue_values __P((void));
+void get_font_matrix __P((void));
+void get_font_type __P((void));
+void get_is_fixed_pitch __P((void));
+void get_italic_angle __P((void));
+void get_other_blues __P((void));
+void get_paint_type __P((void));
+Subrs_entry_tp * new_Subrs_entry __P((void));
+char * next_param_string __P((void));
+void parse_PS_header __P((void));
+void parse_charstrings_dictionary __P((void));
+float pop __P((void));
+void process_callothersubr __P((void));
+void process_callsubr __P((void));
+void process_closepath __P((void));
+void process_div __P((void));
+void process_dotsection __P((void));
+void process_endchar __P((void));
+void process_escape __P((void));
+void process_hlineto __P((void));
+void process_hmoveto __P((void));
+void process_hsbw __P((void));
+void process_hstem __P((void));
+void process_hstem3 __P((void));
+void process_hvcurveto __P((void));
+void process_one_Subrs_entry __P((void));
+float process_pop __P((void));
+void process_return __P((void));
+void process_rlineto __P((void));
+void process_rmoveto __P((void));
+void process_rrcurveto __P((void));
+void process_sbw __P((void));
+void process_seac __P((void));
+void process_setcurrentpoint __P((void));
+void process_Subrs_entries __P((void));
+void process_vhcurveto __P((void));
+void process_vlineto __P((void));
+void process_vmoveto __P((void));
+void process_vstem __P((void));
+void process_vstem3 __P((void));
+void push __P((float fl));
+void start_char __P((char * name));
diff --git a/fonts/utilities/ps2mf/alloca.c b/fonts/utilities/ps2mf/alloca.c
new file mode 100644
index 0000000000..cfe98f92d2
--- /dev/null
+++ b/fonts/utilities/ps2mf/alloca.c
@@ -0,0 +1,191 @@
+/*
+ alloca -- (mostly) portable public-domain implementation -- D A Gwyn
+
+ last edit: 86/05/30 rms
+ include config.h, since on VMS it renames some symbols.
+ Use xmalloc instead of malloc.
+
+ This implementation of the PWB library alloca() function,
+ which is used to allocate space off the run-time stack so
+ that it is automatically reclaimed upon procedure exit,
+ was inspired by discussions with J. Q. Johnson of Cornell.
+
+ It should work under any C implementation that uses an
+ actual procedure stack (as opposed to a linked list of
+ frames). There are some preprocessor constants that can
+ be defined when compiling for your specific system, for
+ improved efficiency; however, the defaults should be okay.
+
+ The general concept of this implementation is to keep
+ track of all alloca()-allocated blocks, and reclaim any
+ that are found to be deeper in the stack than the current
+ invocation. This heuristic does not reclaim storage as
+ soon as it becomes invalid, but it will do so eventually.
+
+ As a special case, alloca(0) reclaims storage without
+ allocating any. It is a good idea to use alloca(0) in
+ your main control loop, etc. to force garbage collection.
+*/
+#ifndef lint
+static char SCCSid[] = "@(#)alloca.c 1.1"; /* for the "what" utility */
+#endif
+
+#ifdef emacs
+#include "config.h"
+#ifdef static
+/* actually, only want this if static is defined as ""
+ -- this is for usg, in which emacs must undefine static
+ in order to make unexec workable
+ */
+#ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+#endif /* STACK_DIRECTION undefined */
+#endif static
+#endif emacs
+
+#ifdef X3J11
+typedef void *pointer; /* generic pointer type */
+#else
+typedef char *pointer; /* generic pointer type */
+#endif
+
+#define NULL 0 /* null pointer constant */
+
+extern void free();
+extern pointer xmalloc();
+
+/*
+ Define STACK_DIRECTION if you know the direction of stack
+ growth for your system; otherwise it will be automatically
+ deduced at run-time.
+
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+*/
+
+#ifndef STACK_DIRECTION
+#define STACK_DIRECTION 0 /* direction unknown */
+#endif
+
+#if STACK_DIRECTION != 0
+
+#define STACK_DIR STACK_DIRECTION /* known at compile-time */
+
+#else /* STACK_DIRECTION == 0; need run-time code */
+
+static int stack_dir; /* 1 or -1 once known */
+#define STACK_DIR stack_dir
+
+static void
+find_stack_direction (/* void */)
+{
+ static char *addr = NULL; /* address of first
+ `dummy', once known */
+ auto char dummy; /* to get stack address */
+
+ if (addr == NULL)
+ { /* initial entry */
+ addr = &dummy;
+
+ find_stack_direction (); /* recurse once */
+ }
+ else /* second entry */
+ if (&dummy > addr)
+ stack_dir = 1; /* stack grew upward */
+ else
+ stack_dir = -1; /* stack grew downward */
+}
+
+#endif /* STACK_DIRECTION == 0 */
+
+/*
+ An "alloca header" is used to:
+ (a) chain together all alloca()ed blocks;
+ (b) keep track of stack depth.
+
+ It is very important that sizeof(header) agree with malloc()
+ alignment chunk size. The following default should work okay.
+*/
+
+#ifndef ALIGN_SIZE
+#define ALIGN_SIZE sizeof(double)
+#endif
+
+typedef union hdr
+{
+ char align[ALIGN_SIZE]; /* to force sizeof(header) */
+ struct
+ {
+ union hdr *next; /* for chaining headers */
+ char *deep; /* for stack depth measure */
+ } h;
+} header;
+
+/*
+ alloca( size ) returns a pointer to at least `size' bytes of
+ storage which will be automatically reclaimed upon exit from
+ the procedure that called alloca(). Originally, this space
+ was supposed to be taken from the current stack frame of the
+ caller, but that method cannot be made to work for some
+ implementations of C, for example under Gould's UTX/32.
+*/
+
+static header *last_alloca_header = NULL; /* -> last alloca header */
+
+pointer
+alloca (size) /* returns pointer to storage */
+ unsigned size; /* # bytes to allocate */
+{
+ auto char probe; /* probes stack depth: */
+ register char *depth = &probe;
+
+#if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* unknown growth direction */
+ find_stack_direction ();
+#endif
+
+ /* Reclaim garbage, defined as all alloca()ed storage that
+ was allocated from deeper in the stack than currently. */
+
+ {
+ register header *hp; /* traverses linked list */
+
+ for (hp = last_alloca_header; hp != NULL;)
+ if (STACK_DIR > 0 && hp->h.deep > depth
+ || STACK_DIR < 0 && hp->h.deep < depth)
+ {
+ register header *np = hp->h.next;
+
+ free ((pointer) hp); /* collect garbage */
+
+ hp = np; /* -> next header */
+ }
+ else
+ break; /* rest are not deeper */
+
+ last_alloca_header = hp; /* -> last valid storage */
+ }
+
+ if (size == 0)
+ return NULL; /* no allocation required */
+
+ /* Allocate combined header + user data storage. */
+
+ {
+ register pointer new = xmalloc (sizeof (header) + size);
+ /* address of header */
+
+ ((header *)new)->h.next = last_alloca_header;
+ ((header *)new)->h.deep = depth;
+
+ last_alloca_header = (header *)new;
+
+ /* User storage begins just after header. */
+
+ return (pointer)((char *)new + sizeof(header));
+ }
+}
+
diff --git a/fonts/utilities/ps2mf/chr2ps.c b/fonts/utilities/ps2mf/chr2ps.c
new file mode 100644
index 0000000000..0e78ea1c25
--- /dev/null
+++ b/fonts/utilities/ps2mf/chr2ps.c
@@ -0,0 +1,350 @@
+/* CHR2PS.C */
+
+#define VERSION "1.0 (beta)"
+
+#include <stdio.h>
+#include <string.h>
+#ifndef AIX
+#include <stdlib.h>
+#endif
+#include "defines.h"
+#include "myopen.h"
+#include "chr2ps.h"
+
+void give_usage ()
+{
+ fprintf (stderr, "Usage: chr2ps [<somechr[.chr]|-]");
+ fprintf (stderr, " [<someps>[.ps]]\n");
+ exit (UNSUCCESSFUL);
+}
+
+#ifdef __STDC__
+void preamble (int argc, char ** argv)
+#else
+void preamble (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ if (argc == 1) give_usage ();
+ if (argc == 3)
+ {
+ if (strequ (argv [1], "-")) chr_file = stdin;
+ else chr_file = my_open (argv [1], ".chr", "rb");
+ ps_file = my_open (argv [2], ".ps", "w");
+ }
+ else
+ {
+ chr_file = my_open (argv [1], ".chr", "rb");
+ ps_file = my_open (argv [1], ".ps", "w");
+ }
+}
+
+void postamble ()
+{
+ fclose (chr_file);
+ fclose (ps_file);
+ fprintf (stderr, "Conversion done\n");
+ exit (SUCCESSFUL);
+}
+
+#ifdef __STDC__
+unsigned char ReadChar (void)
+#else
+unsigned char ReadChar ()
+#endif
+{
+ char Inc;
+
+ if (! HaveSavedChar)
+ {
+ fread (&Inc, 1, 1, chr_file);
+ /* translate CR, LF or CR/LF to '\n' */
+ if (Inc == '\r') /* CR = 0x0D */
+ {
+ fread (&Inc, 1, 1, chr_file);
+ if (Inc != '\n') /* LF = 0x0A */
+ {
+ HaveSavedChar = TRUE;
+ SavedChar = Inc;
+ }
+ Inc = '\n';
+ }
+ }
+ else
+ {
+ Inc = SavedChar;
+ HaveSavedChar = FALSE;
+ }
+ return (Inc);
+}
+
+#ifdef __STDC__
+void ReadLine (void)
+#else
+void ReadLine ()
+#endif
+{
+/* read another line (binary mode!)
+ do not include the \r and \n characters
+ */
+/* assume a line is terminated by CR, LF or CR/LF */
+
+ char_pos = in_buff;
+ * in_buff = NULLCHAR;
+ in_size = 0;
+ while (! feof (chr_file))
+ {
+ inchar = ReadChar ();
+ if (inchar != '\n')
+ {
+ in_buff [in_size] = inchar;
+ in_size++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ in_buff [in_size] = NULLCHAR;
+}
+
+#ifdef __STDC__
+unsigned char DeCrypt (unsigned char cipher)
+#else
+unsigned char DeCrypt(cipher)
+unsigned char cipher;
+#endif
+{
+ unsigned char plain;
+
+ plain = (cipher ^ (cr >> 8));
+ cr = (cipher + cr) * cc1 + cc2;
+ return plain;
+}
+
+#ifdef __STDC__
+void DecryptCharString (unsigned char * CS, int count)
+#else
+void DecryptCharString (CS, count)
+unsigned char * CS;
+int count;
+#endif
+{
+ int i;
+ unsigned char byte;
+ long value;
+ int out_size;
+
+ cr = CR; cc1 = CC1; cc2 = CC2;
+ out_size = 0;
+ fputs("{ ", ps_file);
+ for (i = 0; i < lenIV; i++) byte = DeCrypt (CS [i]);
+ for (i = lenIV ; i < count ; )
+ {
+ byte = DeCrypt (CS [i ++]);
+ if (byte == 11)
+ {
+ fprintf (ps_file, " %s", commands [byte] . command);
+ break;
+ }
+ else if (byte == 12)
+ {
+ byte = DeCrypt (CS [i ++]);
+ if (byte > MAX_ESCAPE)
+ {
+ out_size = out_size + 17;
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " not_defined_e%d", byte);
+ }
+ else
+ {
+ out_size = out_size
+ + strlen (escapes [byte] . command);
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " %s",
+ escapes [byte] . command);
+ }
+ continue;
+ }
+ else if (byte < 32)
+ {
+ out_size = out_size
+ + strlen (commands [byte] . command);
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " %s", commands [byte] . command);
+ }
+ if (byte >= 32)
+ {
+ if (byte <= 246)
+ {
+ out_size = out_size + 4;
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " %d", byte - 139);
+ }
+ else if ((byte >= 247) && (byte <= 250))
+ {
+ out_size = out_size + 7;
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " %d", (byte - 247) * 256
+ + DeCrypt (CS [i ++]) + 108);
+ }
+ else if ((byte >= 251) && (byte <= 254))
+ {
+ out_size = out_size + 7;
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ fprintf (ps_file, " %d", -(byte - 251) * 256
+ - DeCrypt(CS[i++]) - 108);
+ }
+ else if (byte == 255)
+ {
+ out_size = out_size + 9;
+ if (out_size > out_break)
+ {
+ out_size = 0;
+ fprintf (ps_file, "\n ");
+ }
+ value = DeCrypt (CS [i ++]);
+ value <<= 8;
+ value += DeCrypt (CS [i ++]);
+ value <<= 8;
+ value += DeCrypt (CS [i ++]);
+ value <<= 8;
+ value += DeCrypt (CS [i ++]);
+ fprintf (ps_file, " %d", value);
+ }
+ }
+ }
+ fprintf (ps_file, " } ");
+}
+
+#ifdef __STDC__
+void main (int argc, char ** argv)
+#else
+void main(argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ int lusteller;
+ char ch;
+
+ fprintf (stderr, "This is chr2ps, version: %s\n", VERSION);
+ preamble (argc, argv);
+ HaveSavedChar = FALSE; in_size = 0;
+ fprintf (stderr, " Conversion of charstring to postscript \n");
+ fprintf (stderr, " Copying inputfile until /Subrs entry \n");
+ for (;;)
+ {
+ ReadLine ();
+ fprintf (ps_file, "%s\n", in_buff);
+ if (strnequ ((char *) in_buff, "/lenIV", 6))
+ {
+ lenIV = atoi ((char *) in_buff + 7);
+ }
+ if (strstr ((char *) in_buff, "/Subrs") != NULL) break;
+ }
+ tp = 0; in_size = 0; inchar= ' ';
+ fprintf (stderr, " Decrypting charstring data now (This may take a while...)\n");
+ for (lusteller = 0;; lusteller ++)
+ {
+ if (! (lusteller % 20)) fprintf (stderr, ".");
+ if (feof (chr_file)) break;
+ prevchar = inchar;
+ inchar = ReadChar ();
+ in_size ++;
+ if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file);
+ temp_buff [tp] = inchar;
+ if (tp == (TEMPSIZE - 1)) tp = 0;
+ else tp++;
+ if ((inchar != '-') && (inchar != 'R')) continue;
+ if (prevchar != ' ') continue;
+ if (inchar == '-') testchar = '|';
+ else testchar = 'D';
+ inchar = ReadChar ();
+ if (inchar != testchar)
+ {
+ in_size++;
+ if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file);
+ temp_buff[tp] = inchar;
+ if (tp == (TEMPSIZE - 1)) tp = 0;
+ else tp++;
+ continue;
+ }
+ inchar = ReadChar ();
+ testchar = ' ';
+ if (inchar != testchar)
+ {
+ in_size++;
+ if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file);
+ temp_buff [tp] = inchar;
+ if (tp == (TEMPSIZE - 1)) tp = 0;
+ else tp++;
+ continue;
+ }
+ if (in_size > 20) restcount = 20;
+ else
+ {
+ restcount = in_size;
+ tp = 0;
+ }
+ for (i = 0 ; i < restcount ; i++)
+ {
+ in_buff [i] = temp_buff [tp];
+ if (tp == (TEMPSIZE - 1)) tp = 0;
+ else tp++;
+ }
+ in_buff [restcount] = NULLCHAR;
+ count_pos = & in_buff [restcount - 2];
+ do count_pos --;
+ while (* count_pos != ' ');
+ count_pos ++;
+ count = atoi ((char *) count_pos);
+ * count_pos = NULLCHAR;
+ fprintf (ps_file, "%s", in_buff);
+ in_size = 0; tp = 0;
+ fread (CharString, 1, count, chr_file);
+ CharString [count] = NULLCHAR;
+ DecryptCharString (CharString, count);
+ }
+ fprintf (stderr, "\n");
+ if (in_size > 20) restcount = 20;
+ else
+ {
+ restcount = in_size;
+ tp = 0;
+ }
+ for (i = 0 ; i < restcount ; i ++)
+ {
+ in_buff [i] = temp_buff [tp];
+ if (tp == (TEMPSIZE - 1)) tp = 0;
+ else tp++;
+ }
+ in_buff [restcount] = NULLCHAR;
+ fprintf (ps_file, "%s", in_buff);
+ postamble ();
+}
diff --git a/fonts/utilities/ps2mf/chr2ps.h b/fonts/utilities/ps2mf/chr2ps.h
new file mode 100644
index 0000000000..c8d66c74ea
--- /dev/null
+++ b/fonts/utilities/ps2mf/chr2ps.h
@@ -0,0 +1,112 @@
+/* chr2ps.h */
+
+int lenIV = 4; /* CharString salt length */
+
+typedef struct
+{
+ char * command;
+ int value;
+} Command;
+
+Command commands [] =
+{
+ { "notdefined_c0", 0 },
+ { "hstem", 1 },
+ { "notdefined_c2", 2 },
+ { "vstem", 3 },
+ { "vmoveto", 4 },
+ { "rlineto", 5 },
+ { "hlineto", 6 },
+ { "vlineto", 7 },
+ { "rrcurveto", 8 },
+ { "closepath", 9 },
+ { "callsubr", 10 },
+ { "return", 11 },
+ { "escape", 12 },
+ { "hsbw", 13 },
+ { "endchar", 14 },
+ { "notdefined_c15", 15 },
+ { "notdefined_c16", 16 },
+ { "notdefined_c17", 17 },
+ { "notdefined_c18", 18 },
+ { "notdefined_c19", 19 },
+ { "notdefined_c20", 20 },
+ { "rmoveto", 21 },
+ { "hmoveto", 22 },
+ { "notdefined_c23", 23 },
+ { "notdefined_c24", 24 },
+ { "notdefined_c25", 25 },
+ { "notdefined_c26", 26 },
+ { "notdefined_c27", 27 },
+ { "notdefined_c28", 28 },
+ { "notdefined_c29", 29 },
+ { "vhcurveto", 30 },
+ { "hvcurveto", 31 }
+};
+
+Command escapes[] =
+{
+ { "dotsection", 0 },
+ { "vstem3", 1 },
+ { "hstem3", 2 },
+ { "notdefined_e3", 3 },
+ { "notdefined_e4", 4 },
+ { "notdefined_e5", 5 },
+ { "seac", 6 },
+ { "sbw", 7 },
+ { "notdefined_e8", 8 },
+ { "notdefined_e9", 9 },
+ { "notdefined_e10", 10 },
+ { "notdefined_e11", 11 },
+ { "div", 12 },
+ { "notdefined_e13", 13 },
+ { "notdefined_e14", 14 },
+ { "notdefined_e15", 15 },
+ { "callothersubr", 16 },
+ { "pop", 17 },
+ { "notdefined_e18", 18 },
+ { "notdefined_e19", 19 },
+ { "notdefined_e20", 20 },
+ { "notdefined_e21", 21 },
+ { "notdefined_e22", 22 },
+ { "notdefined_e23", 23 },
+ { "notdefined_e24", 24 },
+ { "notdefined_e25", 25 },
+ { "notdefined_e26", 26 },
+ { "notdefined_e27", 27 },
+ { "notdefined_e28", 28 },
+ { "notdefined_e29", 29 },
+ { "notdefined_e30", 30 },
+ { "notdefined_e31", 31 },
+ { "notdefined_e32", 32 },
+ { "setcurrentpoint", 33 }
+};
+
+#define MAX_ESCAPE 33
+
+#define CR 4330
+#define CC1 52845
+#define CC2 22719
+
+#define CHARSIZE 4000
+#define LINESIZE 4000
+#define TEMPSIZE 20
+
+#define out_break 120
+
+
+FILE * chr_file, * ps_file;
+
+unsigned char HaveSavedChar = FALSE;
+char SavedChar;
+
+unsigned short int cr, cc1, cc2;
+unsigned char CharString [CHARSIZE], inchar, testchar, prevchar;
+unsigned char byte, temp_buff [TEMPSIZE];
+unsigned char in_buff [LINESIZE], * char_pos, * rd_pos, * count_pos;
+int in_size, rd_index, tp, btp, CP, i, copycount, count, restcount;
+
+unsigned char ReadChar __P((void));
+void ReadLine __P((void));
+void DecryptCharString __P((unsigned char * CS, int count));
+unsigned char DeCrypt __P((unsigned char cipher));
diff --git a/fonts/utilities/ps2mf/defines.h b/fonts/utilities/ps2mf/defines.h
new file mode 100644
index 0000000000..9d0922befd
--- /dev/null
+++ b/fonts/utilities/ps2mf/defines.h
@@ -0,0 +1,20 @@
+typedef unsigned char bool;
+
+#define strequ(a,b) (strcmp (a, b) == 0)
+#define strnequ(a,b,c) (strncmp (a, b, c) == 0)
+
+#ifndef __P
+#ifdef __STDC__
+#define __P(a) a
+#else
+#define __P(a) ()
+#endif
+#endif
+
+#define UNSUCCESSFUL 1
+#define SUCCESSFUL 0
+
+#define TRUE 1
+#define FALSE 0
+
+#define NULLCHAR (unsigned char) 0
diff --git a/fonts/utilities/ps2mf/getopt.c b/fonts/utilities/ps2mf/getopt.c
new file mode 100644
index 0000000000..da64d69b61
--- /dev/null
+++ b/fonts/utilities/ps2mf/getopt.c
@@ -0,0 +1,611 @@
+/* Getopt for GNU.
+ Copyright (C) 1987, 1989, 1990, 1991 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef __STDC__
+#define CONST const
+#else
+#define CONST
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of `argv' so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable _POSIX_OPTION_ORDER disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include <stdio.h>
+
+/* If compiled with GNU C, use the built-in alloca */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#ifdef sparc
+#include <alloca.h>
+#else
+#ifdef _AIX
+#pragma alloca
+#else
+# ifdef MSDOS
+# include <malloc.h>
+# else
+char *alloca ();
+# endif
+#endif
+#endif /* sparc */
+#endif /* not __GNUC__ */
+
+#if defined(STDC_HEADERS) || defined(__GNU_LIBRARY__)
+#include <stdlib.h>
+#else /* STDC_HEADERS or __GNU_LIBRARY__ */
+# ifndef MSDOS
+char *getenv ();
+char *malloc ();
+# endif
+#endif /* STDC_HEADERS or __GNU_LIBRARY__ */
+
+#if defined(USG) || defined(STDC_HEADERS) || defined(__GNU_LIBRARY__) || defined (MSDOS)
+#include <string.h>
+#define bcopy(s, d, n) memcpy ((d), (s), (n))
+#define index strchr
+#else /* USG or STDC_HEADERS or __GNU_LIBRARY__ */
+#ifdef VMS
+#include <string.h>
+#else /* VMS */
+#include <strings.h>
+#endif /* VMS */
+/* Declaring bcopy causes errors on systems whose declarations are different.
+ If the declaration is omitted, everything works fine. */
+#endif /* USG or STDC_HEADERS or __GNU_LIBRARY__ */
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ _POSIX_OPTION_ORDER is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable _POSIX_OPTION_ORDER, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Describe the long-named options requested by the application.
+ _GETOPT_LONG_OPTIONS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+ The field `has_arg' is 1 if the option takes an argument,
+ 2 if it takes an optional argument. */
+
+struct option
+{
+ char *name;
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+CONST struct option *_getopt_long_options;
+
+int _getopt_long_only = 0;
+
+/* Index in _GETOPT_LONG_OPTIONS of the long-named option actually found.
+ Only valid when a long-named option was found. */
+
+int option_index;
+
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+#ifdef __STDC__
+static void exchange (char ** argv);
+
+static void exchange (char ** argv)
+#else
+static void
+exchange (argv)
+ char **argv;
+#endif
+{
+ int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
+ char **temp = (char **) alloca (nonopts_size);
+
+ /* Interchange the two blocks of data in ARGV. */
+
+ bcopy (&argv[first_nonopt], temp, nonopts_size);
+ bcopy (&argv[last_nonopt], &argv[first_nonopt],
+ (optind - last_nonopt) * sizeof (char *));
+ bcopy (temp, &argv[first_nonopt + optind - last_nonopt], nonopts_size);
+
+ /* Update records for the slots the non-options now occupy. */
+
+ first_nonopt += (optind - last_nonopt);
+ last_nonopt = optind;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `+' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ otherwise. */
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char **argv;
+ CONST char *optstring;
+{
+ optarg = 0;
+
+ /* Initialize the internal data when the first call is made.
+ Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ if (optind == 0)
+ {
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = 0;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else
+#ifndef MSDOS
+ if (getenv ("_POSIX_OPTION_ORDER") != 0)
+ ordering = REQUIRE_ORDER;
+ else
+# endif
+ ordering = PERMUTE;
+ }
+
+ if (nextchar == 0 || *nextchar == 0)
+ {
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange (argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Now skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-'
+ || argv[optind][1] == 0)
+ && (_getopt_long_options == 0
+ || argv[optind][0] != '+'
+ || argv[optind][1] == 0))
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* Special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange (argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == 0)
+ && (_getopt_long_options == 0
+ || argv[optind][0] != '+' || argv[optind][1] == 0))
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Start decoding its characters. */
+
+ nextchar = argv[optind] + 1;
+ }
+
+ if (_getopt_long_options != 0
+ && (argv[optind][0] == '+'
+ || (_getopt_long_only && argv[optind][0] == '-'))
+ )
+ {
+ CONST struct option *p;
+ char *s = nextchar;
+ int exact = 0;
+ int ambig = 0;
+ CONST struct option *pfound = 0;
+ int indfound;
+
+ while (*s && *s != '=')
+ s++;
+
+ /* Test all options for either exact match or abbreviated matches. */
+ for (p = _getopt_long_options, option_index = 0; p->name;
+ p++, option_index++)
+ if (!strncmp (p->name, nextchar, s - nextchar))
+ {
+ if (s - nextchar == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == 0)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += strlen (nextchar);
+ optind++;
+ return '?';
+ }
+
+ if (pfound != 0)
+ {
+ option_index = indfound;
+ optind++;
+ if (*s)
+ {
+ if (pfound->has_arg > 0)
+ optarg = s + 1;
+ else
+ {
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ nextchar += strlen (nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += strlen (nextchar);
+ return '?';
+ }
+ }
+ nextchar += strlen (nextchar);
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ /* Can't find it as a long option. If this is getopt_long_only,
+ and the option starts with '-' and is a valid short
+ option, then interpret it as a short option. Otherwise it's
+ an error. */
+ if (_getopt_long_only == 0 || argv[optind][0] == '+' ||
+ index (optstring, *nextchar) == 0)
+ {
+ if (opterr != 0)
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ nextchar += strlen (nextchar);
+ optind++;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == 0)
+ optind++;
+
+ if (temp == 0 || c == ':')
+ {
+ if (opterr != 0)
+ {
+ if (c < 040 || c >= 0177)
+ fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+ argv[0], c);
+ else
+ fprintf (stderr, "%s: unrecognized option `-%c'\n",
+ argv[0], c);
+ }
+ return '?';
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != 0)
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = 0;
+ nextchar = 0;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != 0)
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr != 0)
+ fprintf (stderr, "%s: option `-%c' requires an argument\n",
+ argv[0], c);
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = 0;
+ }
+ }
+ return c;
+ }
+}
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/fonts/utilities/ps2mf/getopt.h b/fonts/utilities/ps2mf/getopt.h
new file mode 100644
index 0000000000..151379fc69
--- /dev/null
+++ b/fonts/utilities/ps2mf/getopt.h
@@ -0,0 +1,102 @@
+/* declarations for getopt
+ Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Describe the long-named options requested by the application.
+ _GETOPT_LONG_OPTIONS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ The field `has_arg' is:
+ 0 if the option does not take an argument,
+ 1 if the option requires an argument,
+ 2 if the option takes an optional argument.
+
+ If the field `flag' is nonzero, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+ char *name;
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+#ifdef __STDC__
+extern const struct option *_getopt_long_options;
+#else
+extern struct option *_getopt_long_options;
+#endif
+
+/* If nonzero, '-' can introduce long-named options.
+ Set by getopt_long_only. */
+
+extern int _getopt_long_only;
+
+/* The index in GETOPT_LONG_OPTIONS of the long-named option found.
+ Only valid when a long-named option has been found by the most
+ recent call to `getopt'. */
+
+extern int option_index;
+
+#ifdef __STDC__
+int getopt (int argc, char **argv, const char *shortopts);
+int getopt_long (int argc, char **argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+int getopt_long_only (int argc, char **argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+void envopt(int *pargc, char ***pargv, char *optstr);
+#else
+int getopt ();
+int getopt_long ();
+int getopt_long_only ();
+void envopt();
+#endif
diff --git a/fonts/utilities/ps2mf/hints.mf b/fonts/utilities/ps2mf/hints.mf
new file mode 100644
index 0000000000..9a836e6af4
--- /dev/null
+++ b/fonts/utilities/ps2mf/hints.mf
@@ -0,0 +1,619 @@
+% hints.mf --- an attempt at PostScript Type-1 Hints in METAFONT for use
+% with PS2MF.
+%
+% Copyright (c) 1992 I. Lee Hetherington, all rights reserved. I have
+% not yet decided on what copyright restrictions I will place here.
+% Probably something like TeX's copyright. I think the GNU copyleft
+% is far too extreme.
+%
+% The general scheme for hint implementation is apply vertical (hstem)
+% and horizontal (vstem) hints separately. For each direction, we
+% first collect the stems in a sorted list. At this point we reject
+% overlapping or duplicate stems. When we first need to use the
+% hints, we make sure that piecewise linear transformations are
+% computed. These METAFONT transformations depend on the stem or
+% inter-stem region a particular x- or y-coordinate falls in. These
+% transformations are easily computed once the stems specified in
+% character space are placed in pixel space. This stem placement is
+% more complicated in the vertical direction because of the BlueValues
+% font-level hints.
+%
+% Currently the implemented hints are BlueValues, OtherBlues,
+% BlueScale, BlueShift, BlueFuzz, hstem, hstem3, vstem, vstem3, `Hint
+% Replacement', and `Flex'. The hints FamilyBlues, FamilyOtherBlues
+% are not implemented as we only apply hints at the font and character
+% level, not across an entire font family. The hints StdHW, StdVW,
+% StemSnapH, and StemSnapV are not implemented. It would probably not
+% be very difficult to add these. The ForceBold, LanguageGroup,
+% RndStemUp, and ExpansionFactor are also not implemented.
+%
+% Hint replacement ignores previous stem hints unless the same stem
+% was used previously. In this case, the stem is placed the same as
+% it was before. If after replacement a single stem is respecified
+% without the other original stems, we can place it as it was placed
+% before. However, *both* edges of the stem must be identical. This
+% may now be irrelevant since stems are placed independently now
+% (except in the case of hstem3 and vstem3, of course).
+%
+% I make no claim to that these hints have exactly the same effect as
+% Adobe PostScript font rasterizer. The hints and their interactions
+% can be quite complicated. The hint implementation in this file is
+% based solely on my interpretation of their effects given their
+% description in the book "Adobe Type 1 Font Format, Version 1.1".
+%
+% There is certainly room for improvement: both with respect to hint
+% effects and implementation efficiency. Running METAFONT can take
+% quite a while. I've made some attempt at caching placement results
+% using METAFONT vector to reduce redundant computation. One
+% improvement I can think of is replacing the stem gathering and
+% sorting (h_insert and v_insert) with C code in PS2MF. Another is
+% predetermining which stems are effected by the blue values. Most of
+% the other placement/transformation opertions need to be done in
+% METAFONT because these operations are dependent on device resolution
+% and magnification.
+%
+% I welcome comments, suggestions, fixes, and improvements. I plan on
+% commenting this code more when I get a chance. The comments are
+% pretty sparse at the moment.
+%
+% If you want to disable the hint mechanism, specify `hinting:=0'
+% before this file is included. METAFONT will run much faster but
+% will produce inconsistent stem widths at low resolutions. At higher
+% resolutions these hints are much less important.
+%
+% 1.0 beta 3/30/92 I. Lee Hetherington (ilh@lcs.mit.edu)
+
+if unknown hinting: hinting := 1; fi
+
+% expansion and slanting (same as `xscaled expansion slanted slanting')
+if unknown expansion: expansion := 1; fi
+if unknown slanting: slanting := 0; fi
+
+% make sure character space units are defined
+if unknown FX#: FX# := 0.001pt#; fi
+if unknown FY#: FY# := 0.001pt#; fi
+FX# := FX# * expansion; % incorporate expansion here so hints know about it
+u# := FX#;
+v# := FY#;
+define_pixels(u,v,FX,FY);
+
+boolean debug; debug := false;
+
+% like round but rounds to the nearest half
+def roundhalf(expr x) = (round(x+0.5)-0.5) enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% horizontal (vstem) hints
+
+extra_beginchar := extra_beginchar & "h_init;numeric h[][]sc;";
+
+% initialize structures
+def h_init =
+ numeric h.r,h[]s,h[]p,h[]pc;
+ boolean h.triple;
+ transform h[]t;
+ h.r := 1;
+ h.triple := false;
+enddef;
+
+% insert new stem into sorted list
+% requires that stems don't overlap
+% toss duplicates
+def h_insert(expr a, b) =
+ boolean flag; flag:=false; % temporary flag to exit loop
+ if h.r = 1: % no stems thus far
+ h[1]s := a;
+ h[2]s := b;
+ h.r := 3;
+ elseif a > h[h.r-1]s: % at end
+ h[h.r]s := a;
+ h[h.r+1]s := b;
+ h.r := h.r + 2;
+ else: % we need to search for location and shift elements
+ for i = 1 step 2 until h.r-2:
+ exitif ((h[i]s >= a) and (h[i]s <= b)) or
+ ((h[i+1]s >= a) and (h[i+1]s <= b));
+ if a < h[i]s:
+ % insert here, so shift remaining elements up by two
+ for j = h.r-1 downto i:
+ h[j+2]s := h[j]s;
+ endfor
+ h[i]s := a;
+ h[i+1]s := b;
+ h.r := h.r + 2;
+ flag := true;
+ fi
+ exitif flag;
+ endfor
+ fi
+enddef;
+
+% horizontal stem width (for vstem's)
+def hsw(expr a,b) = max(1, round(abs(a-b)*u)) enddef;
+
+% place stems in pixel space
+def h_place =
+ if h.triple:
+ h2p - h1p = vsw(h1s, h2s) - 1;
+ h4p - h3p = vsw(h3s, h4s) - 1;
+ h6p - h5p = vsw(h5s, h6s) - 1;
+ if unknown h[h1s][h2s]sc: % cached?
+ h3p - h2p = h5p - h4p;
+ h1p = roundhalf(h1p - (0.5[h1p,h2p] - 0.5[h1s,h2s]*u));
+ h3p = roundhalf(h3p - (0.5[h3p,h4p] - 0.5[h3s,h4s]*u));
+ h[h1s][h2s]sc := h1p;
+ h[h3s][h4s]sc := h3p;
+ h[h5s][h6s]sc := h5p;
+ else:
+ h1p = h[h1s][h2s]sc;
+ h3p = h[h3s][h4s]sc;
+ h5p = h[h5s][h6s]sc;
+ fi
+ elseif h.r > 1:
+ for i = 1 step 2 until h.r-2:
+ h[i+1]p - h[i]p = hsw(h[i]s,h[i+1]s) - 1;
+ if unknown h[h[i]s][h[i+1]s]sc: % cached?
+ h[i]p = roundhalf(h[i]p - (0.5[h[i]p,h[i+1]p] - 0.5[h[i]s,h[i+1]s]*u));
+ h[h[i]s][h[i+1]s]sc := h[i]p;
+ else:
+ h[i]p = h[h[i]s][h[i+1]s]sc;
+ fi
+ endfor
+ fi
+ if debug:
+ for i = 1 upto h.r-1:
+ message "h" & decimal(i) & ": " & decimal(h[i]s) &
+ " (" & decimal(h[i]p) & ")";
+ endfor
+ fi
+enddef;
+
+% build separate transformations for each region
+def h_transforms =
+ if unknown h1p: h_place; fi
+ if h.r = 1: h[0]t := identity xscaled u;
+ else:
+ % first region (not stem)
+ h[0]t := identity shifted (-h[1]s,0)
+ xscaled u
+ shifted (h[1]p,0);
+ % last region (not stem)
+ h[h.r-1]t := identity shifted (-h[h.r-1]s,0)
+ xscaled u
+ shifted (h[h.r-1]p,0);
+ % other regions
+ for i = 1 upto h.r - 2:
+ h[i]t := identity shifted (-h[i]s,0)
+ xscaled
+ (if h[i+1]p = h[i]p: 0
+ else: ((h[i+1]p - h[i]p) / (h[i+1]s - h[i]s)) fi)
+ shifted (h[i]p,0);
+ endfor
+ fi
+ if debug:
+ for i = 0 upto h.r-1:
+ show xxpart h[i]t;
+ endfor
+ fi
+enddef;
+
+% find region according to x-coordinate
+def h_region(expr x) =
+ if h.r = 1: 0
+ elseif x < h[1]s: 0
+ elseif x >= h[h.r-1]s: (h.r - 1)
+ else:
+ for i = 2 upto h.r-1:
+ if x < h[i]s: (i - 1) fi
+ exitif (x < h[i]s);
+ endfor
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% vertical (hstem) hints with support for BlueValues, OtherBlueValues,
+% BlueScale, BlueShift, and BlueFuzz
+
+extra_beginchar := extra_beginchar & "v_init;numeric v[][]sc;";
+
+% initialize structures
+def v_init =
+ numeric v.r,v[]s,v[]p,v[]pc;
+ boolean v.triple;
+ transform v[]t;
+ v.r := 1;
+ v.triple := false;
+enddef;
+
+% insert new stem into sorted list
+% requires that stems don't overlap
+def v_insert(expr a, b) =
+ boolean flag; flag:=false; % temporary flag to exit loop
+ if v.r = 1: % no stems thus far
+ v[1]s := a;
+ v[2]s := b;
+ v.r := 3;
+ elseif a > v[v.r-1]s: % at end
+ v[v.r]s := a;
+ v[v.r+1]s := b;
+ v.r := v.r + 2;
+ else: % we need to search for location and shift elements
+ for i = 1 step 2 until v.r-2:
+ exitif ((v[i]s >= a) and (v[i]s <= b)) or
+ ((v[i+1]s >= a) and (v[i+1]s <= b));
+ if a < v[i]s:
+ % insert here, so shift remaining elements up by two
+ for j = v.r-1 downto i:
+ v[j+2]s := v[j]s;
+ endfor
+ v[i]s := a;
+ v[i+1]s := b;
+ v.r := v.r + 2;
+ flag := true;
+ fi
+ exitif flag;
+ endfor
+ fi
+enddef;
+
+% Blue stuff
+boolean suppress; % suppress overshoot
+suppress := v < blue_scale;
+
+def find_bot_blue(expr y) =
+ numeric blue.pos, blue.over;
+ for i = 1 upto bot_blues.n:
+ exitif known blue.pos;
+ if (y >= bot_blues[i]o - blue_fuzz) and (y <= bot_blues[i]p):
+ blue.pos := bot_blues[i]p;
+ blue.over := bot_blues[i]o;
+ fi
+ endfor
+enddef;
+
+def find_top_blue(expr y) =
+ numeric blue.pos, blue.over;
+ for i = 1 upto top_blues.n:
+ exitif known blue.pos;
+ if (y >= top_blues[i]p) and (y <= top_blues[i]o + blue_fuzz):
+ blue.pos := top_blues[i]p;
+ blue.over := top_blues[i]o;
+ fi
+ endfor
+enddef;
+
+% vertical stem width (for hstem's)
+def vsw(expr a,b) = max(1, round(abs(a-b)*v)) enddef;
+
+% place stems in pixel space paying attention to blue stuff
+% (currently ignore v.triple)
+% CHECK CACHING IN HERE. MIGHT NOT NEED TO DO BLUE STUFF SO OFTEN
+def v_place =
+ if v.triple: % ignore blue stuff for hstem3
+ v2p - v1p = vsw(v1s, v2s) - 1;
+ v4p - v3p = vsw(v3s, v4s) - 1;
+ v6p - v5p = vsw(v5s, v6s) - 1;
+ if unknown v[v1s][v2s]sc: % cached?
+ v3p - v2p = v5p - v4p;
+ v1p = roundhalf(v1p - (0.5[v1p,v2p] - 0.5[v1s,v2s]*v));
+ v3p = roundhalf(v3p - (0.5[v3p,v4p] - 0.5[v3s,v4s]*v));
+ v[v1s][v2s]sc := v1p;
+ v[v3s][v4s]sc := v3p;
+ v[v5s][v6s]sc := v5p;
+ else:
+ v1p = v[v1s][v2s]sc;
+ v3p = v[v3s][v4s]sc;
+ v5p = v[v5s][v6s]sc;
+ fi
+ elseif v.r > 1:
+ for i = 1 step 2 until v.r-2:
+ find_bot_blue(v[i]s);
+ if known blue.pos:
+ % position according to blue values
+ if suppress:
+ v[i]p = roundhalf(blue.pos * v);
+ else:
+ v[i]p = roundhalf(blue.pos * v) -
+ max(if v[i]s <= blue.pos-blue_shift: 1 else: 0 fi,
+ round((blue.pos - if v[i]s < blue.over: blue.over
+ else: v[i]s fi)*v));
+ fi
+ v[i+1]p = v[i]p + vsw(v[i]s,v[i+1]s) - 1;
+ fi
+ find_top_blue(v[i+1]s);
+ if known blue.pos:
+ % position according to blue values
+ if suppress:
+ v[i+1]p := roundhalf(blue.pos * v);
+ else:
+ v[i+1]p := roundhalf(blue.pos * v) +
+ max(if v[i+1]s >= blue.pos+blue_shift: 1 else: 0 fi,
+ round((if v[i+1]s > blue.over: blue.over
+ else: v[i+1]s fi - blue.pos)*v));
+ fi
+ % Note that it is possible for the top of a stem to be fall in a
+ % top zone and the bottom to fall in a bottom zone. Therefore, only
+ % set v[i]p (bottom) if it wasn't set previously.
+ if unknown v[i]p: v[i]p := v[i+1]p - (vsw(v[i]s,v[i+1]s) - 1); fi
+ fi
+ endfor
+ % place remaining stems if not under blue control
+ for i = 1 step 2 until v.r-2:
+ if unknown v[i]p:
+ v[i+1]p = v[i]p + vsw(v[i]s,v[i+1]s) - 1;
+ if unknown v[v[i]s][v[i+1]s]sc: % cached?
+ v[i]p = roundhalf(v[i]p - (0.5[v[i]p,v[i+1]p] - 0.5[v[i]s,v[i+1]s]*v));
+ v[v[i]s][v[i+1]s]sc := v[i]p;
+ else:
+ v[i]p = v[v[i]s][v[i+1]s]sc;
+ fi
+ fi
+ endfor
+ fi
+ if debug:
+ for i = 1 upto v.r-1:
+ message "v" & decimal(i) & ": " & decimal(v[i]s) &
+ " (" & decimal(v[i]p) & ")";
+ endfor
+ fi
+enddef;
+
+% build separate transformations for each region
+def v_transforms =
+ if unknown v1p: v_place; fi
+ if v.r = 1: v[0]t := identity yscaled v;
+ else:
+ % first region (not stem)
+ v[0]t := identity shifted (0,-v[1]s)
+ yscaled v
+ shifted (0,v[1]p);
+ % last region (not stem)
+ v[v.r-1]t := identity shifted (0,-v[v.r-1]s)
+ yscaled v
+ shifted (0,v[v.r-1]p);
+ % other regions
+ for i = 1 upto v.r - 2:
+ v[i]t := identity shifted (0,-v[i]s)
+ yscaled
+ (if v[i+1]p = v[i]p: 0
+ else: ((v[i+1]p - v[i]p) / (v[i+1]s - v[i]s)) fi)
+ shifted (0,v[i]p);
+ endfor
+ fi
+ if debug:
+ for i = 0 upto v.r-1:
+ show yypart v[i]t;
+ endfor
+ fi
+enddef;
+
+% find region according to y-coordinate
+def v_region(expr y) =
+ if v.r = 1: 0
+ elseif y < v[1]s: 0
+ elseif y >= v[v.r-1]s: (v.r - 1)
+ else:
+ for i = 2 upto v.r-1:
+ if y < v[i]s:
+ (i - 1)
+ fi
+ exitif (y < v[i]s);
+ endfor
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% actual pair (point) and path transformations
+
+% transform a pair (point) to pixel space, caching x and y coordinates
+% separately for future use
+def hv_pixel(expr p) =
+ if unknown h[xpart p]pc:
+ hide(h[xpart p]pc := xpart(p transformed h[h_region(xpart p)]t))
+ fi
+ if unknown v[ypart p]pc:
+ hide(v[ypart p]pc := ypart(p transformed v[v_region(ypart p)]t))
+ fi
+ (h[xpart p]pc, v[ypart p]pc)
+enddef;
+
+% do the region-dependent tranformation on a point or path
+def hv_transform(expr p) =
+ if unknown v0t: hide(v_transforms) fi
+ if unknown h0t: hide(h_transforms) fi
+ if pair p: hv_pixel(p)
+ else: % path
+ for i = 0 upto length p - 1:
+ hv_pixel(point i of p) .. controls
+ hv_pixel(postcontrol i of p) and hv_pixel(precontrol i+1 of p) ..
+ endfor
+ hv_pixel(point (length p) of p)
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% proofing stuff -- display stem hints on proof sheets
+
+% Mark a vstem specified in character space. Note that the hints aren't known
+% at this time so they can't be applied to the stem.
+def mark_vstem(expr a,b) =
+ one := h + 20;
+ two := -d - 20;
+ aa := round(a*u);
+ bb := round(b*u);
+ proofrule((aa,two),(aa,one)); proofrule((bb,two),(bb,one));
+ if proofing>3:
+ screenrule((aa,two),(aa,one)); screenrule((bb,two),(bb,one)); fi
+enddef;
+
+% Mark a hstem specified in character space. Note that the hints aren't known
+% at this time so they can't be applied to the stem.
+def mark_hstem(expr a,b) =
+ one := -20;
+ two := w + 20;
+ aa := round(a*v);
+ bb := round(b*v);
+ proofrule((one,aa),(two,aa)); proofrule((one,bb),(two,bb));
+ if proofing>3:
+ screenrule((one,aa),(two,aa)); screenrule((one,bb),(two,bb)); fi
+enddef;
+
+% Mark blue value ranges.
+def mark_blues =
+ for i = 1 upto top_blues.n:
+ one := -30;
+ two := w + 30;
+ aa := round(top_blues[i]o*v);
+ bb := round(top_blues[i]p*v);
+ proofrule((one,aa),(two,aa)); proofrule((one-10,bb),(two+10,bb));
+ if proofing>3:
+ screenrule((one,aa),(two,aa)); screenrule((one,bb),(two,bb)); fi
+ endfor
+ for i = 1 upto bot_blues.n:
+ one := -30;
+ two := w + 30;
+ aa := round(bot_blues[i]o*v);
+ bb := round(bot_blues[i]p*v);
+ proofrule((one,aa),(two,aa)); proofrule((one-10,bb),(two+10,bb));
+ if proofing>3:
+ screenrule((one,aa),(two,aa)); screenrule((one,bb),(two,bb)); fi
+ endfor
+enddef;
+extra_beginchar := extra_beginchar & "mark_blues;";
+
+
+numeric subpath_label; subpath_label := ASCII "a";
+extra_beginchar := extra_beginchar &
+ "subpath_label:=ASCII " & ditto & "a" & ditto & ";";
+
+% Mark path points. If p is a pair (point) then it is a control point.
+% Control points are only plotted if proofing > 2, but they are left
+% unlabelled.
+def mark_points(expr p) =
+ if path p:
+ for i = 0 upto length p:
+ makelabel(char(subpath_label) & decimal(i), point i of p);
+ endfor
+ if proofing > 2: % plot control points too
+ for i = 1 upto length p - 1:
+ makelabel("", postcontrol i of p);
+ makelabel("", precontrol i of p);
+ endfor
+ makelabel("", postcontrol 0 of p);
+ makelabel("", precontrol (length p - 1) of p);
+ fi
+ subpath_label:=subpath_label+1;
+ elseif (pair p) and (proofing>2): makelabel("", p)
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% macros used in character descriptions
+
+% store hint commands in this string for future incorporation
+string delayed_hints; delayed_hints:="";
+
+% specify delayed hints
+def dh(expr s) =
+ if hinting>0: hide(delayed_hints := delayed_hints & s & ";") fi
+enddef;
+
+% incorporate delayed hints
+def ih =
+ if hinting>0: hide(h_init; v_init; scantokens delayed_hints;
+ delayed_hints:="") fi
+enddef;
+
+% vertical stem hint
+def vs(expr a,b) =
+ if hinting>0: hide(h_insert(a,b); if proofing>0: mark_vstem(a,b); fi) fi
+enddef;
+
+% vstem3 indicator
+def vst = if hinting>0: hide(h.triple:=true) fi enddef;
+
+% horizontal stem hint
+def hs(expr a,b) =
+ if hinting>0: hide(v_insert(a,b); if proofing>0: mark_hstem(a,b); fi) fi
+enddef;
+
+% hstem3 indicator
+def hst = if hinting>0: hide(v.triple:=true) fi enddef;
+
+% apply hints
+def ah(expr p) =
+ hide(if proofing>0:
+ if hinting>0: mark_points(hv_transform(p));
+ else: mark_points(p xscaled u yscaled v); fi
+ fi)
+ if hinting>0: hv_transform(p)
+ else: (p xscaled u yscaled v) fi
+enddef;
+
+% line to
+def lt(expr a,b) =
+ -- (a,b)
+enddef;
+
+% line to (after hint replacement)
+def lth(expr a,b) =
+ -- ih ah((a,b)
+enddef;
+
+% curve to
+def ct(expr a,b,c,d,e,f) =
+ .. controls (a,b) and (c,d) .. (e,f)
+enddef;
+
+% curve to (after hint replacement)
+def cth(expr a,b,c,d,e,f) =
+ .. controls ah((a,b)) and ih ah((c,d)) .. ah((e,f)
+enddef;
+
+% flex
+def fl(expr rx,ry,ax,ay,bx,by,cx,cy,dx,dy,ex,ey,fx,fy,height) =
+ if (abs((rx,ry) - (cx,cy))*u >= 0.01*height): % use curves
+ ct(ax,ay,bx,by,cx,cy)
+ ct(dx,dy,ex,ey,fx,fy)
+ else:
+ lt(fx,fy) % replace curves with line
+ fi
+enddef;
+
+% flex (after hint replacement)
+def flh(expr rx,ry,ax,ay,bx,by,cx,cy,dx,dy,ex,ey,fx,fy,height) =
+ if (abs((rx,ry) - (cx,cy))*u >= 0.01*height): % use curves
+ cth(ax,ay,bx,by,cx,cy)
+ ct(dx,dy,ex,ey,fx,fy)
+ else:
+ lth(fx,fy) % replace curves with line
+ fi
+enddef;
+
+% close path
+def cp = -- cycle enddef;
+
+% Draw by filling and stroking the path (helps greatly with small sizes).
+% We specify slanting here but not expansion because that's already been
+% incorporated.
+def dr expr c =
+ addto currentpicture contour (c slanted slanting) withpen pencircle;
+enddef;
+
+picture chp[];
+
+% seac (standard encoding accented character) use previously created
+% pictures. When specifying accent shift, use slanting to correctly
+% position accent.
+def seac(expr achar,bchar,adx,ady) =
+ currentpicture := chp[bchar] +
+ chp[achar] shifted ((adx*u, ady*v) slanted slanting);
+enddef;
+
+% non-zero winding rule for filling instead of default positive rule
+def nonzerowinding = cull currentpicture dropping (0,0); enddef;
+extra_endchar := extra_endchar & "nonzerowinding;";
+
+turningcheck := 0; % no checking because directions are known
+
+autorounding := smoothing := 0; % we're doing hints ourselves
diff --git a/fonts/utilities/ps2mf/myerror.c b/fonts/utilities/ps2mf/myerror.c
new file mode 100644
index 0000000000..c6855658b0
--- /dev/null
+++ b/fonts/utilities/ps2mf/myerror.c
@@ -0,0 +1,20 @@
+/* myerror.c */
+
+#include <stdio.h>
+#ifndef AIX
+# include <stdlib.h>
+#endif
+#include "defines.h"
+#include "myerror.h"
+
+#ifdef __STDC__
+void error (char * s)
+#else
+void error (s)
+char * s;
+#endif
+{
+ fprintf (stderr, "\n%s\n", s);
+ if (* s == '!') exit (UNSUCCESSFUL);
+}
+
diff --git a/fonts/utilities/ps2mf/myerror.h b/fonts/utilities/ps2mf/myerror.h
new file mode 100644
index 0000000000..2defddde52
--- /dev/null
+++ b/fonts/utilities/ps2mf/myerror.h
@@ -0,0 +1,3 @@
+/* myerror.h */
+
+void error __P((char * s));
diff --git a/fonts/utilities/ps2mf/mymalloc.c b/fonts/utilities/ps2mf/mymalloc.c
new file mode 100644
index 0000000000..3281a3b6bf
--- /dev/null
+++ b/fonts/utilities/ps2mf/mymalloc.c
@@ -0,0 +1,24 @@
+/* mymalloc.c */
+
+#include <stdio.h>
+#ifndef AIX
+# include <stdlib.h>
+#endif
+#include "defines.h"
+#include "myerror.h"
+#include "mymalloc.h"
+
+#ifdef __STDC__
+char * my_malloc (unsigned int len)
+#else
+char * my_malloc (unsigned len)
+int len;
+#endif
+{
+ char * p;
+
+ p = (char *) malloc (len);
+ if (p == NULL) error ("! out of memory");
+ return (p);
+}
+
diff --git a/fonts/utilities/ps2mf/mymalloc.h b/fonts/utilities/ps2mf/mymalloc.h
new file mode 100644
index 0000000000..9450dfc562
--- /dev/null
+++ b/fonts/utilities/ps2mf/mymalloc.h
@@ -0,0 +1,3 @@
+/* mymalloc.h */
+
+char * my_malloc __P((unsigned int len));
diff --git a/fonts/utilities/ps2mf/myopen.c b/fonts/utilities/ps2mf/myopen.c
new file mode 100644
index 0000000000..32d6f7378b
--- /dev/null
+++ b/fonts/utilities/ps2mf/myopen.c
@@ -0,0 +1,42 @@
+/* myopen.c */
+
+#include <stdio.h>
+#ifndef AIX
+# include <stdlib.h>
+#endif
+#include <string.h>
+#include "defines.h"
+#include "myopen.h"
+#include "mymalloc.h"
+#include "myerror.h"
+
+#ifdef __STDC__
+FILE * my_open (char * file_name, char * extension , char * mode)
+#else
+FILE * my_open (file_name, extension, mode)
+char * file_name, * extension, * mode;
+#endif
+{
+ char * tmp_file_name;
+ int i, lastext;
+ FILE * out_file;
+
+ tmp_file_name = (char *) my_malloc (sizeof (char)
+ * (strlen (file_name) + 5));
+ strcpy (tmp_file_name, file_name);
+ lastext = -1;
+ for (i = 0; tmp_file_name [i]; i ++)
+ if (tmp_file_name [i] == '.') lastext = i;
+ else
+ if (tmp_file_name [i] == '/') lastext = -1;
+ if (lastext == -1) strcat (tmp_file_name, extension);
+ if ((out_file = fopen (tmp_file_name, mode)) == NULL)
+ {
+ fprintf (stderr, "Cannot open %s for %s\n", tmp_file_name,
+ mode [0] == 'r' ? "reading" : "writing");
+ exit (UNSUCCESSFUL);
+ }
+ free (tmp_file_name);
+ return (out_file);
+}
+
diff --git a/fonts/utilities/ps2mf/myopen.h b/fonts/utilities/ps2mf/myopen.h
new file mode 100644
index 0000000000..94ae6703b9
--- /dev/null
+++ b/fonts/utilities/ps2mf/myopen.h
@@ -0,0 +1,3 @@
+/* myopen.h */
+
+FILE * my_open __P((char * file_name, char * extension , char * mode));
diff --git a/fonts/utilities/ps2mf/pfa2chr.c b/fonts/utilities/ps2mf/pfa2chr.c
new file mode 100644
index 0000000000..53a5acf745
--- /dev/null
+++ b/fonts/utilities/ps2mf/pfa2chr.c
@@ -0,0 +1,107 @@
+/* HEX2CHR.C */
+
+#define VERSION "1.0 (beta)"
+
+#include <stdio.h>
+#include <string.h>
+#ifndef AIX
+#include <stdlib.h>
+#endif
+#include "defines.h"
+#include "myopen.h"
+#include "pfa2chr.h"
+
+void give_usage ()
+{
+ fprintf (stderr, "Usage: pfa2chr [<somepfa>[.pfa]|-]");
+ fprintf (stderr, " [<somechr>[.chr]|-]\n");
+ exit (UNSUCCESSFUL);
+}
+
+#ifdef __STDC__
+void preamble (int argc, char ** argv)
+#else
+void preamble (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ if (argc == 1) give_usage ();
+ if (strequ (argv [1], "-")) pfa_file = stdin;
+ else pfa_file = my_open (argv [1], ".pfa", "r");
+ if (argc == 3)
+ {
+ if (strequ (argv [2], "-")) chr_file = stdout;
+ else chr_file = my_open (argv [2], ".chr", "wb");
+ }
+ else chr_file = my_open (argv [1], ".chr", "wb");
+}
+
+void postamble ()
+{
+ fclose (pfa_file);
+ fclose (chr_file);
+ exit (SUCCESSFUL);
+}
+
+#ifdef __STDC__
+unsigned char DeCrypt (unsigned char ch1, unsigned char ch2)
+#else
+unsigned char DeCrypt (ch1, ch2)
+unsigned char ch1, ch2;
+#endif
+{
+ unsigned char plain, cipher;
+
+ if ('A' <= ch1 && ch1 <= 'F') ch1 -= 'A' - 10;
+ else if ('a' <= ch1 && ch1 <= 'f') ch1 -= 'a' - 10;
+ else ch1 -= '0';
+ if ('A' <= ch2 && ch2 <= 'F') ch2 -= 'A' - 10;
+ else if ('a' <= ch2 && ch2 <= 'f') ch2 -= 'a' - 10;
+ else ch2 -= '0';
+ cipher = ch1 * 16 + ch2;
+ plain = (cipher ^ (er >> 8));
+ er = (cipher + er) * ec1 + ec2;
+ return plain;
+}
+
+#ifdef __STDC__
+void main (int argc, char ** argv)
+#else
+void main (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ int i, o, in_size;
+ int skip_salt = TRUE;
+ char * efp;
+
+ fprintf (stderr, "This is pfa2chr, version: %s\n", VERSION);
+ preamble (argc, argv);
+ while (fgets (in_buff, MAX_BUFFER, pfa_file) != NULL)
+ {
+ if (strequ (in_buff, "currentfile eexec\n")) break;
+ fprintf (chr_file, "%s", in_buff);
+ }
+ for (;;)
+ {
+ if (fgets (in_buff, MAX_BUFFER + 1, pfa_file) == NULL) break;
+ in_size = strlen (in_buff) - 1;
+ if (in_buff [in_size - 1] == '\n') in_size --;
+ for (i = o = 0; i < in_size; i += 2)
+ out_buff [o ++] = DeCrypt (in_buff [i],
+ in_buff [i + 1]);
+ out_buff [o] = '\0';
+ if ((efp = strstr (out_buff, "closefile\n")) != NULL)
+ o = (efp - out_buff) + 10;
+ if (skip_salt)
+ {
+ fwrite (out_buff + EEXEC_SKIP_BYTES,
+ o - EEXEC_SKIP_BYTES, 1, chr_file);
+ skip_salt = FALSE;
+ }
+ else fwrite (out_buff, o, 1, chr_file);
+ }
+ postamble ();
+}
diff --git a/fonts/utilities/ps2mf/pfa2chr.h b/fonts/utilities/ps2mf/pfa2chr.h
new file mode 100644
index 0000000000..0edaadb801
--- /dev/null
+++ b/fonts/utilities/ps2mf/pfa2chr.h
@@ -0,0 +1,13 @@
+/* pfa2chr.h */
+
+#define EEXEC_SKIP_BYTES 4
+#define MAX_BUFFER 512
+
+unsigned short int er = 55665;
+unsigned short int ec1 = 52845;
+unsigned short int ec2 = 22719;
+
+FILE * pfa_file, * chr_file;
+char in_buff [MAX_BUFFER + 1], out_buff [MAX_BUFFER];
+
+unsigned char DeCrypt __P((unsigned char ch1, unsigned char ch2));
diff --git a/fonts/utilities/ps2mf/pfb2mf.tex b/fonts/utilities/ps2mf/pfb2mf.tex
new file mode 100644
index 0000000000..5000979163
--- /dev/null
+++ b/fonts/utilities/ps2mf/pfb2mf.tex
@@ -0,0 +1,383 @@
+% Gerard, je zult waarschijnlijk de header een beetje moeten editen.
+% Maar dit is mijn verhaal uit de Proceedings van Praag (met verbeterde
+% typefouten)
+
+\documentstyle[euro92]{article}
+
+\font\times=times
+\font\manfnt=manfnt
+\def\METAFONT{{\manfnt META}\-{\manfnt FONT}}
+
+\title{Incorporating PostScript fonts in \TeX{}}
+\author{Erik-Jan Vens}
+\titlehead{PostScript Type One to \METAFONT{}}
+\authorhead{E.J. Vens}
+\affiliation{Rijks Universiteit Groningen\\
+ ICCE\\
+ P.O.Box 335\\
+ 9700 AH \ Groningen\\
+ the Netherlands\\
+ {\tt E.J.Vens@icce.rug.nl}}
+
+\begin{document}
+
+\maketitle
+
+\begin{abstract}
+\noindent {\tt pfb2mf} Provides the \TeX{} community with an interface to the
+PostScript Type One fonts. There is an overwhelming amount of these fonts for
+sale and there are a lot of fonts in the Public Domain, so it extends the
+range of typefaces the \TeX{} user can choose from.
+\end{abstract}
+
+\section{The typical look of a \TeX-ed document}
+
+\subsection{Some of my background}
+
+As a novice \TeX{}\footnote{Just as some people do mention that they denote
+`he and/or she' by just using `he', my usage of `\TeX' means `\TeX{} and/or
+\LaTeX'.} user, one will often be very enthousiastic about the program. At
+least, from those days when I was a rookie \TeX{} user, I remember a sort of
+passion for what was possible with this incredible program. It was in 1985 and
+our university's computing centre had a Canon BLP-8 hooked up to their
+VAX~8650. I was a student then and used to work there almost every evening,
+sometimes nights. There was this typical small group of people working in the
+only room which was open to general users. And typically we would gather
+around the coffee-machine and discuss all sorts of things.
+
+One of us knew about this program called \TeX. He showed me some results and I
+was so impressed that the next day I visited the library to pick up `The \TeX
+book'. (Needless to say, of course it was `\TeX{} and \METAFONT: New
+Directions in Typesetting', so it was of little help.) Anyways, I spent many
+hours trying to create masterpieces of the publishing art. I was very
+enthousiastic about the program.
+
+And I became even more enthousiastic when I met fellow \TeX ers, or saw
+publications made with \TeX. But, how did I see these were made \TeX? It was
+precisely because they were all typeset with the Computer Modern font family.
+
+\subsection{How and why did Knuth create the Computer Modern font family}
+
+When Knuth decided to write \TeX, he wanted to be able to finish his series
+`The Art of Computer Programming' with digital typography. As he writes in
+`The Errors of \TeX': `The genesis of \TeX{} probably took place on
+1~February~1977, when~I first chanced to see the output of a high-resolution
+typesetting machine. I was told that this fine typography [$\ldots$] was
+produced by entirely digital methods; yet I could see no difference between
+the digital type and `real' type. Therefore I realized that a central aspect
+of printing had been reduced to bit manipulation. As a computer scientist, I
+could not resist the challenge to improve print quality by manipulating those
+bits better. [$\ldots$] By 13~February I~had changed my plan to spend a
+forthcoming sabbatical year in South America; instead of travelling to an
+exotic place and working on Volume~4 of {\it The Art of Computer Programming},
+I~had decided to stay at Stanford and work on digital typography.'
+
+He also needed a typeface. He chose Monotype Modern No.~8A, of which he says
+in `Computers~\&~Typesetting, Vol.~E': `In letterpress printing, modern fonts
+were technically troublesome because their delicate hairlines and serifs were
+particularly susceptible to damage; the broken letters produced a degraded
+text image. In digital typography with sufficient resolution, the delicate
+forms of modern can be rendered precisely. Computer typesetting and
+photolithographic printing are capable of reproducing modern typefaces with a
+clarity and sharpness unobtainable at the time of the original development of
+the style'.
+
+Undoubtly, this is true. Anyone who has ever seen a text set in Computer
+Modern come out of a phototypesetter, knows this striking feeling of beauty.
+Only, most applications of \TeX{} that I have seen, do not end up on a
+2400~dpi phototypesetter. The typical outputresolution is~300~dpi for a
+laserprinter, 240~dpi for a dotmatrix printer and 400~dpi for the NeXT
+laserprinter. So choosing fonts that render well at low resolutions is
+certainly worthwhile.
+
+\subsection{Why there are no serious attempts at creating other faces}
+
+Creating a typeface from scratch is an extremely difficult task that takes
+lots of time, patience and maybe energy. The only other complete family of
+typefaces designed with \METAFONT{} is Neenie Billawala's Pandora. This is not
+just a recreation of an existing font, it is a series of tools, drivers and
+parameters that make up a family of faces, as she has described in TUGboat,
+Vol.~10, (1989), No.~4, pp.~481--489.
+
+I am still working on a font together with a friend, where I~do most of the
+programming and he does most of the designing. But this is our long, cold
+winter's sunday afternoon project, so it's not nearly finished, even though we
+started out one-and-a-half-year ago.
+
+And there are more people who have done some work in this area. Yannis
+Haralambous did some. He and other people have created new fonts, notably for
+Indian languages, Greek, Hebrew and Russian. But the \TeX{} community is not a
+very large one, and so the field of font creation remains a largely
+undiscovered one.
+
+\section{The wealth of the world of PostScript fonts}
+
+But maybe we do not need to wait for new fonts written in \METAFONT. One of
+the many attractions of the PostScript world is it's large range of available
+typefaces. Even in the Public Domain one can find numerous nice looking fonts.
+And if you consider buying them, there is such a large choice, that it becomes
+virtually impossible to get to know them all before taking your pick. So one
+tends to start at the traditional, standard PostScript look of a document.
+
+\subsection{The standard Times Roman plus Courier document}
+
+In much the same way that a \TeX ed document can be recognized by the use of
+Computer Modern, can a standard PostScript document be recognized by the
+combination of Times Roman and Courier, with Courier being slightly too thin
+next to the Times. Most people who come from the world of computer science
+know this combination from books as Kernighan~\&~Ritchie's `The C Programming
+Language' and `Kernighan~\&~Pike's `The UNIX Programming Environment'.
+
+Other traditional PostScript fonts include AvantGarde, Bookman, Helvetica, New
+Century Schoolbook, Palatino and some loose fonts as Zapf Dingbats and Zapf
+Chancery.
+
+\subsection{But there are more fonts}
+
+The past few years --as fonts grew cheaper and cheaper-- many users have
+gotten used to be able to buy fonts. If one looks at the Top~40 bestsellers
+list of Adobe, one will notice that both in Europa and in the USA, Adobe
+Garamond is in the Top~10. On the other hand, Neville Brody's Arcadia,
+Industria and Insignia are the number one in the USA, where in Europe they
+rank only at~27. In Europe e.g.\ the GillSans ranks very high. Even in the
+`Jobs' section of a widely read Dutch newspaper one can find many, many uses
+of GillSans. Even Flora and Praxis (both by Dutch designer Gerard Unger) can
+be found often.
+
+\section{Combing the worlds of \TeX{} and PostScript fonts}
+
+Wouldn't it be nice if the user of \TeX{} could incorporate the use of
+PostScript fonts in a \TeX{} document? \TeX{} still is one of the best, if not
+{\bf the best} where the production of neatly spaced text and beautifully
+typeset mathematics is concerned. We --as \TeX{} users-- shiver in awe when we
+are confronted with the Swiss cheese output produced by WorstPervert, let
+alone the {\tt eqn}-based formula editor it now provides. We don't even want
+to think about WordStar, and we have seen instances where the output of
+Ventura doesn't look extremely bad. We have heard that Word4Windows is nice.
+But still, \TeX{} outranks them when pure text and mathematics is concerned.
+
+\subsection{Choosing a scheme}
+
+There are several possibilities open to the non Computer Modern user.
+
+\begin{enumerate}
+
+\item Completely switch to PostScript output. There is a Public Domain
+ PostScript emulator, written by L.~Peter Deutsch, in the GNU
+ distribution. One will also have to use a {\tt dvi} to {\tt ps}
+ translator, e.g.\ Tom Rokicki's {\tt dvips}.
+
+\item Use Piet Tutelaer's {\tt ps2pk} package, based on the X-Windows,
+ Release~5 distribution, which can translate a PostScript Type One font
+ to \TeX's {\tt pk} format. This is extremely useful for those users who
+ want fast, production quality fonts.
+
+\item Use my {\tt pfb2mf} package, which can translate a PostScript Type One
+ font to \METAFONT{} format. To create a bitmap, one will still have to
+ run \METAFONT. This last part of the job can be frustratingly slow, but
+ it does provide the \TeX{} user with options to change the output.
+
+\end{enumerate}
+
+\noindent Beware. A caveat should be here. Producing beautifully typeset
+documents is just combining spaces and faces. But remember that this is an
+art, rather than a job which can be automated.
+
+\section{What does a \METAFONT{} file look like}
+
+A \METAFONT{} file consists of a combination of commands to set up the
+communication with \TeX, commands to set up plottable functions and commands
+to set up a plot.
+
+\subsection{The macro-biotic aspects of \METAFONT{}}
+
+Just as with \TeX, macro's play an important role. And just as with \TeX,
+macro's are essentialy build up from other macro's and primitives. Only
+because with \TeX{} one has to make a distinction between pure text and
+macro's, the macro's have to be escaped with a backslash. \METAFONT{} macro's
+on the other hand do not need the escape. And \METAFONT{} macro's can even
+handle binary operators. An example on p.~178 of `The \METAFONT book' states:
+
+${\bf primarydef } w {\rm\ dotprod } z = {}$
+
+\quad $({\rm xpart } w \ast{} {\rm xpart } z + {\rm ypart } w \ast{} {\rm
+ypart } z) {\bf\ enddef}$.
+
+\noindent I will not discuss this in in-depth, but basically this defines an
+infix operator `{\tt dotprod}' which takes a left and a right operand, it then
+returns a value.
+
+There a couple of important macro's and primitives:
+
+\begin{itemize}
+
+\item `{\tt beginchar}' sets up the beginning of the definition of a glyph. It
+ takes four parameters:
+
+ \begin{enumerate}
+
+ \item the character number, this can be given as a decimal, octal or
+ hexadecimal number, or as the representation of the character,
+ e.g.~{\tt"a"}.
+ \item the width of the surrounding box. The character's shape can stick
+ out of it's box, but this box provides the metrics with which
+ \TeX{} will do it's calculations.
+ \item the height of the surrounding box. This is the height the
+ characters extends above the baseline.
+ \item the depth of the surrounding box.
+ \end{enumerate}
+
+\item `{\tt endchar}' declares the end of the definition.
+
+\item One can assign values to constants and variables. $u := 3.5$, or
+ $width\# := 3.5pt\#$, where the $\#$ denotes a sharped, i.e.\ reallife,
+ or not-rounded-to-the-raster value.
+
+\item One can declare points in space, or just their x- and y-values: $x_3 =
+ x_2 - x_1$, or $z_1 = ({1\over 2}width, .8h - 3.5pt)$.
+
+\item The points can be connected with several types of lines. E.g.\ a
+ straight line: $z_1 {\tt--} z_2 {\tt--} z_3$, or a smooth curve: $z_1
+ {\tt..} z_2 {\tt..} z_3$.
+
+\item One can draw these lines with a pen, or one can fill the area that is
+ defined by a shape. Or combining these two. One can also erase a line,
+ or an area. {\tt draw} $z_1 {\tt--} z_2$ draws a straight line from
+ $z_1$ to $z_2$ with the current pen. {\tt fill} $z_1 {\tt..} z_2 {\tt--}
+ z_3 {\tt..} cycle$ fills an area defined by a smooth line from $z_1$ to
+ $z_2$, from there with a straight line to $z_3$, and from there with a
+ smooth line back to the beginning.
+
+\end{itemize}
+
+\section{What does a Type One font look like}
+
+We will have to do some work before we can take a look at Type One fonts with
+a plain text editor.
+
+\subsection{From {\tt pfb} via {\tt pfa} to {\tt ps}}
+
+Type One fonts typically come in two flavors: binary or ascii representation.
+The binary representation is just an encoded form of the ascii representation.
+So, one needs a program to translate from the first to the last form. In the
+{\tt pfb2mf} package that would be {\tt pfb2pfa}. The ascii version, however,
+is a readable hexadecimal version of an encrypted series of PostScript
+commands. Once this encryption was secret, but it is now given to the world.
+So, one can translate the ascii version to human-readable PostScript. In the
+{\tt pfb2mf} package this would be done with {\tt pfa2ps}.
+
+\subsection{What does it mean}
+
+All Type One fonts are outline fonts which are filled. The PostScript language
+uses a reverse polish notation for it's commands, so `{\tt dx dy rlineto}'
+means `draw a straight line from the currentpoint to the point which lies at a
+distance $(dx, dy)$. There are very few commands:
+
+\begin{itemize}
+
+\item `{\tt endchar}' finishes a charstring outline definition.
+
+\item `{\tt seac}' makes an accented character from two other characters in
+ the font program.
+
+\item `{\tt closepath}' closes a subpath. (Surprise!)
+
+\item All sorts of drawing and moving commands. These are all relative to the
+ currentpoint. Some commands are abbreviations for others, one can say,
+ e.g.\ {\tt dx hmoveto}, which means {\tt dx 0 rmoveto}. All lines are
+ straight lines. The curves are B\'ezier cubics, so {\tt dx1 dy1 dx2 dy2
+ dx3 dy3 rrcurveto} means `construct a curve from $currentpoint$ to
+ $currentpoint + (dx1 + dx2 + dx3, dy1 + dy2 + dy3)$, using $currentpoint
+ + (dx1, dy1)$ and $currentpoint + (dx1 + dx2, dy1 + dy2)$ as
+ controlpoints.
+
+\item Then there are the stem commands. This is the most difficult to
+ understand part of a Type One font. I am still not sure whether I really
+ do. Anyways, stem commands define zones within which the renderer can
+ choose a position so that the output will look good. It is strongly
+ related to \METAFONT's commands for `Discreteness and Discretion'.
+
+\item We can define subroutines and call them from within the Type One font
+ program. So, any translation program must learn these subroutines and
+ apply them when called.
+
+\item `{\tt setcurrentpoint}' sets the currentpoint, for how else can we start
+ a curve where each point is defined in terms of it's predecessor?
+
+\end{itemize}
+
+\section{The uninteresting bits and pieces}
+
+The definition of how this is all done is not very interesting, so I will give
+just one example and leave it to the reader to pick up the sources if this
+reader is interested in more details.
+
+\subsection{An example of the font}
+
+There is a freely distributable version of Times New Roman out on the net in
+TrueType format. I have translated this to Type One format. This is an example
+of what the fonts looks like:
+
+\bigskip
+
+{\times Times New Roman}
+
+\subsection{An example of the letter A in sourceform}
+
+\begin{verbatim}
+/A {7 722 hsbw 450 221 rmoveto -256 hlineto -45 -104 rlineto
+ -12 -26 -5 -20 0 -12 rrcurveto 0 -10 5 -9 10 -8
+ rrcurveto 9 -7 21 -5 32 -2 rrcurveto -18 vlineto -209
+ hlineto 18 vlineto 28 4 18 7 8 8 rrcurveto 16 15 19 32
+ 20 48 rrcurveto 233 545 rlineto 17 hlineto 231 -551
+ rlineto 18 -44 17 -29 15 -13 rrcurveto 15 -13 21 -8 27
+ -1 rrcurveto -18 vlineto -261 hlineto 18 vlineto 27 1 17
+ 4 10 8 rrcurveto 9 7 5 9 0 11 rrcurveto 0 14 -7 23 -13
+ 31 rrcurveto -40 95 rlineto -14 36 rmoveto -112 268
+ rlineto -115 -268 rlineto 227 hlineto endchar } ND
+\end{verbatim}
+
+\begin{verbatim}
+beginchar(65,722*FX#,677*FY#,0*FY#); "A";
+fill ((457,221) -- (201,221) -- (156,117) .. controls
+ (144,91) and (139,71) .. (139,59) .. controls (139,49)
+ and (144,40) .. (154,32) .. controls (163,25) and
+ (184,20) .. (216,18) -- (216,0) -- (7,0) -- (7,18) ..
+ controls (35,22) and (53,29) .. (61,37) .. controls
+ (77,52) and (96,84) .. (116,132) -- (349,677) --
+ (366,677) -- (597,126) .. controls (615,82) and
+ (632,53) .. (647,40) .. controls (662,27) and
+ (683,19) .. (710,18) -- (710,0) -- (449,0) -- (449,18)
+ .. controls (476,19) and (493,23) .. (503,31) ..
+ controls (512,38) and (517,47) .. (517,58) .. controls
+ (517,72) and (510,95) .. (497,126) -- (457,221) --
+ cycle) xscaled FX# yscaled FY#;
+unfill ((443,257) -- (331,525) -- (216,257) -- (443,257) --
+ cycle) xscaled FX# yscaled FY#;
+endchar;
+\end{verbatim}
+
+\section{Does it meet realworld constraints?}
+
+No, as of yet, it doesn't. However, the process of hinting is time-consuming
+and therefor very, very slow. So, if it is fast production quality you are
+after, you are well advised to pick up Piet Tutelaer's {\tt ps2pk}.
+
+I want to extend the possibilities of the program to provide the user with
+ways of implementing meta-ness. So if you'd like to fiddle with the font's
+parameters, {\tt pfb2mf} is what you want. It will provide a great deal of
+tuneable parameters, and you can lift out part of a font an use that as a
+basis for other things.
+
+\section{And where can I get all this?}
+
+Both {\tt pfb2mf} and {\tt ps2pk} are ftp-able. E.g.\ from my home machine
+{\tt obelix.icce.rug.nl}. It can be found in {\tt pub/erikjan}.
+
+\section{A warning}
+
+Be careful! If you plan on using more fonts, you will not only have to worry
+about you text, and the layout you choose, you will also have to worry about
+what font you are going to use.
+
+\end{document}
diff --git a/fonts/utilities/ps2mf/pfb2pfa.c b/fonts/utilities/ps2mf/pfb2pfa.c
new file mode 100644
index 0000000000..9d0b5992bc
--- /dev/null
+++ b/fonts/utilities/ps2mf/pfb2pfa.c
@@ -0,0 +1,152 @@
+/* pfb2pfa.c === modified version of: */
+/* pfb2ps.c - Copyright 1991-05-12 Erik Wallin, d87-ewa@nada.kth.se.
+ This program may be distributed freely, modified or included in
+ other free programs long as this copyright notice is still
+ included.
+*/
+
+#define VERSION "1.0 (beta)"
+
+#include <stdio.h>
+#ifndef AIX
+# include <stdlib.h>
+#endif
+#include <string.h>
+#include "defines.h"
+#include "myopen.h"
+#include "mymalloc.h"
+#include "pfb2pfa.h"
+
+#define getb() (getc (pfb_file))
+#define getlen() (getb () | getb () << 8 | getb () << 16 | getb () << 24)
+
+void give_usage ()
+{
+ fprintf (stderr, "Usage: pfb2pfa <somepfb>[.pfb]");
+ fprintf (stderr, " [<somepfa>[.pfa]|-]\n");
+ exit (UNSUCCESSFUL);
+}
+
+#ifdef __STDC__
+void preamble (int argc, char ** argv)
+#else
+void preamble (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ if (argc == 1) give_usage ();
+ pfb_file = my_open (argv [1], ".pfb", "rb");
+ if (argc == 3)
+ {
+ if (strequ (argv [2], "-")) pfa_file = stdout;
+ else pfa_file = my_open (argv [2], ".pfa", "w");
+ }
+ else pfa_file = my_open (argv [1], ".pfa", "w");
+}
+
+void postamble ()
+{
+ fclose (pfb_file);
+ fclose (pfa_file);
+ exit (SUCCESSFUL);
+}
+
+#ifdef __STDC__
+void main (int argc, char ** argv)
+# else
+void main (argc, argv)
+int argc;
+char ** argv;
+# endif
+{
+ int t;
+ unsigned int l, i;
+ unsigned char * buf;
+
+ fprintf (stderr, "This is pfb2pfa, version %s\n", VERSION);
+ preamble (argc, argv);
+ while (! feof (pfb_file))
+ {
+ if (getb () != 128)
+ {
+ fprintf (stderr, "Magic number (128) not found ");
+ fprintf (stderr, "or no input on input.\n");
+ exit (UNSUCCESSFUL);
+ }
+ t = getb ();
+ fprintf (stderr, "Type: %d, ", t);
+ switch (t)
+ {
+ case 1:
+ {
+ l = (unsigned int) getlen ();
+ fprintf (stderr, " plain text, length %ld\n",
+ (long) l);
+ buf = (unsigned char *) my_malloc (l);
+ if (fread (buf, sizeof (unsigned char),
+ l, pfb_file) != l)
+ {
+ fprintf (stderr, "Wrong length of ");
+ fprintf (stderr, "ascii field: %ld ",
+ (long) l);
+ fprintf (stderr, "or could not read ");
+ fprintf (stderr, "file.\n");
+ exit (UNSUCCESSFUL);
+ }
+# ifdef unix
+ for (i = 0; i < l; i ++)
+ if (buf [i] == (unsigned char) '\r')
+ buf [i] = (unsigned char) '\n';
+# endif
+ if (fwrite (buf, sizeof (unsigned char),
+ l, pfa_file) != l)
+ {
+ fprintf (stderr, "Could not write ");
+ fprintf (stderr, "output.\n");
+ exit (UNSUCCESSFUL);
+ }
+ free (buf);
+ }
+ break;
+ case 2:
+ {
+ l = (unsigned int) getlen ();
+ fprintf (stderr, " binary data, length %ld\n",
+ (long) l);
+ buf = (unsigned char *) my_malloc (l);
+ if (fread (buf, sizeof (unsigned char),
+ l, pfb_file) != l)
+ {
+ fprintf (stderr, "Wrong length of ");
+ fprintf (stderr, "binary field: %ld ",
+ (long) l);
+ fprintf (stderr, "or could not read ");
+ fprintf (stderr, "file.\n");
+ exit (UNSUCCESSFUL);
+ }
+ for (i = 0; i < l ; i ++)
+ {
+ fprintf (pfa_file, "%2.2X", buf [i]);
+ if (! ((i + 1) % HEX_PER_LINE))
+ fprintf (pfa_file, "\n");
+ }
+ fprintf (pfa_file, "\n");
+ free (buf);
+ }
+ break;
+ case 3:
+ {
+ fprintf (stderr, "End of file\n");
+ postamble ();
+ }
+ break;
+ default:
+ {
+ fprintf (stderr, "Unknown field type: %d\n", t);
+ exit (UNSUCCESSFUL);
+ }
+ }
+ }
+ postamble ();
+}
diff --git a/fonts/utilities/ps2mf/pfb2pfa.h b/fonts/utilities/ps2mf/pfb2pfa.h
new file mode 100644
index 0000000000..987e24e443
--- /dev/null
+++ b/fonts/utilities/ps2mf/pfb2pfa.h
@@ -0,0 +1,5 @@
+/* pfb2pfa.h */
+
+#define HEX_PER_LINE 32
+
+FILE * pfb_file, * pfa_file;
diff --git a/fonts/utilities/ps2mf/ps2mf.c b/fonts/utilities/ps2mf/ps2mf.c
new file mode 100644
index 0000000000..1f9a4a40b4
--- /dev/null
+++ b/fonts/utilities/ps2mf/ps2mf.c
@@ -0,0 +1,145 @@
+/* ps2mf.c */
+
+#define VERSION "1.1 (beta)"
+
+#include <stdio.h>
+#ifndef AIX
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include "defines.h"
+#include "myopen.h"
+#include "ps2mf.h"
+#include "ps2mfutl.h"
+#include "getopt.h"
+#ifdef MSDOS
+#include <float.h>
+#endif
+
+AFM_info_tp * AFM_chars;
+configuration_info_tp * TeX_configuration;
+ignore_info_tp * ignore_list;
+char font_name [255], coding_scheme[255];
+float italic_angle;
+bool fixed_pitch;
+int x_height, font_space, font_quad;
+bool x_height_is_defined;
+char buffer [255], obuffer [255];
+char * param;
+
+
+void give_usage ()
+{
+ fprintf (stderr, "Usage: ps2mf <basename>\n");
+ fprintf (stderr, " [-p <someps>[.ps]][-a <someafm>[.afm]]\n");
+ fprintf (stderr, " [-m <somemf>[.mf]][-c <someconf>[.cfg]]\n");
+ exit (UNSUCCESSFUL);
+}
+
+FILE * ps_file, * afm_file, * mf_file, * conf_file;
+
+#ifdef __STDC__
+void preamble (int argc, char ** argv)
+#else
+void preamble (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ int c, i, lastext;
+ bool ps_file_defined, afm_file_defined, mf_file_defined,
+ conf_file_defined;
+ char * ps_file_name, * afm_file_name, * mf_file_name, * conf_file_name,
+ * base_file_name;
+
+ ps_file_defined = FALSE;
+ afm_file_defined = FALSE;
+ mf_file_defined = FALSE;
+ conf_file_defined = FALSE;
+
+ while ((c = getopt (argc, argv, "p:m:a:c:")) != EOF)
+ {
+ switch (c)
+ {
+ case 'p':
+ {
+ ps_file_name = optarg;
+ ps_file_defined = TRUE;
+ }
+ break;
+ case 'm':
+ {
+ mf_file_name = optarg;
+ mf_file_defined = TRUE;
+ }
+ break;
+ case 'a':
+ {
+ afm_file_name = optarg;
+ afm_file_defined = TRUE;
+ }
+ break;
+ case 'c':
+ {
+ conf_file_name = optarg;
+ conf_file_defined = TRUE;
+ }
+ break;
+ case '?':
+ {
+ give_usage ();
+ }
+ break;
+ }
+ }
+ if (! argv [optind]) give_usage ();
+ base_file_name = (char *) my_malloc (sizeof (char)
+ * strlen (argv [optind]) + 5);
+ strcpy (base_file_name, argv [optind]);
+ lastext = -1;
+ for (i = 0; base_file_name [i]; i ++)
+ {
+ if (base_file_name [i] == '.') lastext = i;
+ else
+ {
+ if (base_file_name [i] == '/') lastext = -1;
+ }
+ }
+ if (lastext != -1) base_file_name [lastext] = '\0';
+ ps_file = my_open (ps_file_defined ? ps_file_name : base_file_name,
+ ".ps", "r");
+ afm_file = my_open (afm_file_defined ? afm_file_name : base_file_name,
+ ".afm", "r");
+ mf_file = my_open (mf_file_defined ? mf_file_name : base_file_name,
+ ".mf", "w");
+ conf_file = my_open (conf_file_defined ? conf_file_name : base_file_name,
+ ".cfg", "r");
+}
+
+void postamble ()
+{
+ fclose (ps_file);
+ fclose (afm_file);
+ fclose (mf_file);
+ fclose (conf_file);
+}
+
+#ifdef __STDC__
+void main (int argc, char ** argv)
+#else
+void main (argc, argv)
+int argc;
+char ** argv;
+#endif
+{
+ fprintf (stderr, "This is ps2mf, version %s.\n", VERSION);
+ preamble (argc, argv);
+ fprintf (stderr, " Starting to read configuration-file\n");
+ parse_config ();
+ fprintf (stderr, " Starting to read fontmetric-file\n");
+ parse_AFM ();
+ fprintf (stderr, " Starting to read postscript-file\n");
+ parse_PS ();
+ postamble ();
+ exit (SUCCESSFUL);
+}
diff --git a/fonts/utilities/ps2mf/ps2mf.h b/fonts/utilities/ps2mf/ps2mf.h
new file mode 100644
index 0000000000..820a9dde24
--- /dev/null
+++ b/fonts/utilities/ps2mf/ps2mf.h
@@ -0,0 +1,75 @@
+/* ps2mf.h */
+
+typedef struct AFM_info
+{
+ struct AFM_info * next;
+ int AFM_num, TeX_num, width;
+ char * AFM_name;
+ int bbox_llx, bbox_lly, bbox_urx, bbox_ury;
+ struct lig * ligs;
+ struct kern * kerns;
+ struct pcc * pccs;
+ bool in_MF_file;
+} AFM_info_tp;
+extern struct AFM_info * AFM_chars;
+
+typedef struct configuration_info
+{
+ struct configuration_info * next;
+ int TeX_num;
+ char * AFM_name;
+ struct lig * ligs;
+} configuration_info_tp;
+extern struct configuration_info * TeX_configuration;
+
+typedef struct ignore_info
+{
+ struct ignore_info * next;
+ char * AFM_name;
+} ignore_info_tp;
+extern struct ignore_info * ignore_list;
+
+typedef struct lig
+{
+ struct lig * next;
+ char * succ, * sub;
+} lig_tp;
+
+typedef struct kern
+{
+ struct kern * next;
+ char * succ;
+ int delta;
+} kern_tp;
+
+typedef struct pcc
+{
+ struct pcc * next;
+ char * part_name;
+ int x_offset, y_offset;
+} pcc_tp;
+
+extern FILE * ps_file, * afm_file, * mf_file, * conf_file;
+extern char font_name [255], coding_scheme [255];
+extern float italic_angle;
+extern bool fixed_pitch;
+extern int x_height, font_space, font_quad;
+extern bool x_height_is_defined;
+extern float x_scale, y_scale;
+
+int find_TeX_num __P((char * p));
+FILE * my_open __P((char * name, char * extension, char * mode));
+void parse_AFM __P((void));
+void parse_PS __P((void));
+void parse_config __P((void));
+void process_ligatures_and_kerns __P((void));
+void postamble __P((void));
+void preamble __P((int argc, char ** argv));
+void test_AFM_info __P((void));
+
+#ifdef HAVE_NO_STRSTR
+char * strstr __P((char * s, char * find));
+# endif
+#ifdef HAVE_NO_ALLOCA
+char * alloca __P((unsigned size));
+# endif
diff --git a/fonts/utilities/ps2mf/ps2mfutl.c b/fonts/utilities/ps2mf/ps2mfutl.c
new file mode 100644
index 0000000000..ae8579bd1b
--- /dev/null
+++ b/fonts/utilities/ps2mf/ps2mfutl.c
@@ -0,0 +1,217 @@
+/* ps2mfutl.c */
+
+#include <stdio.h>
+#ifndef AIX
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include "defines.h"
+#include "mymalloc.h"
+#include "ps2mf.h"
+#include "ps2mfutl.h"
+#ifdef MSDOS
+#include <float.h>
+#endif
+
+
+#ifdef __STDC__
+void error (char * s)
+#else
+void error (s)
+char * s;
+#endif
+{
+ fprintf (stderr, "\n%s\n", s);
+ if (obuffer [0])
+ {
+ fprintf (stderr, "%s\n", obuffer);
+ while (param > buffer)
+ {
+ fprintf (stderr, " ");
+ param --;
+ }
+ fprintf (stderr, "^n\n");
+ }
+ if (* s == '!') exit (UNSUCCESSFUL);
+}
+
+#ifdef __STDC__
+int transform (int x, int y)
+#else
+int transform (x, y)
+int x, y;
+#endif
+{
+ double acc;
+
+ acc = 1.0 * x + 0.0 * y;
+ /* ^=efactor ^=slant */
+ return ((int) (acc >= 0.0 ? acc + 0.5 : acc - 0.5));
+}
+
+#ifdef __STDC
+int get_line (FILE * in_file)
+#else
+int get_line (in_file)
+FILE * in_file;
+#endif
+{
+ char * p;
+ int c;
+
+ param = buffer;
+ do c = getc (in_file);
+ while (c == ' ' || c == '\r' || c == '\n');
+ ungetc (c, in_file);
+ for (p = buffer; (c = getc (in_file)) != EOF && c != '\n'
+ && c != '\r'; /* skip */) * p ++ = c;
+ if (buffer [0] == '%') return (get_line (in_file));
+ * p = 0;
+ strcpy (obuffer, buffer);
+ if (p == buffer && c == EOF) return (0);
+ return (1);
+}
+
+#ifdef __STDC
+void un_get_line (FILE * in_file)
+#else
+void un_get_line (in_file)
+FILE * in_file;
+#endif
+{
+ char * p;
+ int c;
+
+ for (p = obuffer; * p; p ++) /* skip */;
+ for (* p = '\n'; p >= obuffer; p --)
+ {
+ if (! ungetc (* p, in_file) == * p)
+ error ("! could not unget");
+ }
+}
+
+#ifdef __STDC__
+int get_token (FILE * in_file)
+#else
+int get_token (in_file)
+FILE * in_file;
+#endif
+{
+ if (! * param) if (! get_line (in_file)) return (0);
+ return (1);
+}
+
+/* Routines for input parsing: param_new_string, param_string, param_num,
+ param_float, expect */
+
+#ifdef __STDC__
+bool is_in_delimiters (char c)
+# else
+bool is_in_delimiters (c)
+char c;
+# endif
+{
+ if (c == '{' || c == '[' || c == '('
+ || c == ')' || c == ']' || c == '}') return (TRUE);
+ return (FALSE);
+}
+
+char * param_new_string ()
+{
+ char * p, * q;
+
+ p = param;
+ if (is_in_delimiters (* p)) p ++;
+ else while (* p > ' ' && ! is_in_delimiters (* p)) p ++;
+ q = my_malloc ((int) (p - param + 1));
+ if (* p != 0) * p ++ = 0;
+ strcpy (q, param);
+ while (* p && * p <= ' ') p ++;
+ param = p;
+ return (q);
+}
+
+char * param_string ()
+{
+ char * p, * q;
+
+ p = param;
+ if (is_in_delimiters (* p)) p ++;
+ else while (* p > ' ' && ! is_in_delimiters (* p)) p ++;
+ q = param;
+ if (* p != 0) * p ++ = 0;
+ while (* p && * p <= ' ') p ++;
+ param = p;
+ return (q);
+}
+
+int param_oct ()
+{
+ char * p;
+ int i;
+
+ p = param_string ();
+ if (sscanf (p, "%o", & i) != 1) error ("! octal number expected");
+ return (i);
+}
+
+int param_hex ()
+{
+ char * p;
+ int i;
+
+ p = param_string ();
+ if (sscanf (p, "%x", & i) != 1) error ("! hexadecimal number expected");
+ return (i);
+}
+
+int param_num ()
+{
+ char * p;
+ int i;
+
+ p = param_string ();
+ if (sscanf (p, "%d", & i) != 1) error ("! integer expected");
+ return (i);
+}
+
+float param_float ()
+{
+ char * p;
+ float f;
+
+ p = param_string ();
+ if (sscanf (p, "%f", & f) != 1) error ("! number expected");
+ return (f);
+}
+
+#ifdef __STDC__
+void expect (char * s)
+#else
+void expect (s)
+char * s;
+#endif
+{
+ if (! strequ (param_string (), s))
+ {
+ fprintf (stderr, "%s expected.", s);
+ error ("! syntax error");
+ }
+}
+
+#ifdef __STDC__
+AFM_info_tp * find_AFM_info_for (char * p)
+#else
+AFM_info_tp * find_AFM_info_for (p)
+char * p;
+#endif
+{
+ AFM_info_tp * ai;
+
+ for (ai = AFM_chars; ai; ai = ai -> next)
+ {
+ if (strequ (p, ai -> AFM_name)) return (ai);
+ }
+ return (NULL);
+}
+
diff --git a/fonts/utilities/ps2mf/ps2mfutl.h b/fonts/utilities/ps2mf/ps2mfutl.h
new file mode 100644
index 0000000000..d9f63500c4
--- /dev/null
+++ b/fonts/utilities/ps2mf/ps2mfutl.h
@@ -0,0 +1,20 @@
+/* ps2mfutl.h */
+
+extern char buffer [255], obuffer [255]; /* buffer is modified while parsing,
+ /* obuffer is an unmodified copy of the input */
+extern char * param; /* current position in "buffer" */
+
+void error __P((char * s));
+void expect __P((char * s));
+AFM_info_tp * find_AFM_info_for __P((char * p));
+int get_line __P((FILE * in_file));
+int get_token __P((FILE * in_file));
+bool is_in_delimiters __P((char c));
+float param_float __P((void));
+int param_hex __P((void));
+char * param_new_string __P((void));
+int param_num __P((void));
+int param_oct __P((void));
+char * param_string __P((void));
+int transform __P((int x, int y));
+void un_get_line __P((FILE * in_file));
diff --git a/fonts/utilities/ps2mf/strstr.c b/fonts/utilities/ps2mf/strstr.c
new file mode 100644
index 0000000000..08d60911e3
--- /dev/null
+++ b/fonts/utilities/ps2mf/strstr.c
@@ -0,0 +1,75 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strstr.c 5.2 (Berkeley) 1/26/91";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+#include <sys/cdefs.h>
+ */
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * Find the first occurrence of find in s.
+ */
+#ifdef __STDC__
+char * strstr (char * s, char * find)
+# else
+char * strstr (s, find)
+char * s, * find;
+# endif
+{
+ char c, sc;
+ int len;
+
+ if ((c = * find ++) != 0)
+ {
+ len = strlen (find);
+ do
+ {
+ do
+ {
+ if ((sc = * s ++) == 0) return (NULL);
+ }
+ while (sc != c);
+ }
+ while (strncmp (s, find, len) != 0);
+ s --;
+ }
+ return ((char *) s);
+}
diff --git a/fonts/utilities/ps2mf/times.mf b/fonts/utilities/ps2mf/times.mf
new file mode 100644
index 0000000000..d5d89297ea
--- /dev/null
+++ b/fonts/utilities/ps2mf/times.mf
@@ -0,0 +1,8657 @@
+% TimesNewRoman
+mode_setup;
+if unknown FontSize: FontSize := 10pt#; fi
+FX# := FontSize * 0.0010;
+FY# := FontSize * 0.0010;
+bot_blues.n := 1;
+bot_blues1o := -15;
+bot_blues1p := 0;
+top_blues.n := 2;
+top_blues1o := 460;
+top_blues1p := 447;
+top_blues2o := 677;
+top_blues2p := 662;
+blue_scale := 0.039625;
+blue_shift := 7;
+blue_fuzz := 1;
+
+input hints;
+
+beginchar(33,333*FX#,677*FY#,13*FY#);
+"exclam";
+dr
+ah((175,175)
+lt(157,175)
+lt(114,570)
+ct(112,587,111,600,111,609)
+ct(111,629,116,646,127,658)
+ct(138,671,151,677,166,677)
+ct(182,677,195,671,205,658)
+ct(216,646,221,627,221,603)
+ct(221,595,220,584,219,570)
+lt(175,175)
+ )cp
+dr
+ah((166,94)
+ct(180,94,193,88,204,78)
+ct(214,67,220,55,220,40)
+ct(220,25,214,12,204,2)
+ct(193,-8,180,-13,166,-13)
+ct(151,-13,138,-8,127,2)
+ct(117,12,111,25,111,40)
+ct(111,55,117,67,127,78)
+ct(138,88,151,94,166,94)
+ )cp
+endchar;
+
+beginchar(134,408*FX#,677*FY#,0*FY#);
+"quotedbl";
+dr
+ah((281,392)
+lt(254,534)
+lt(244,593)
+ct(243,601,243,609,243,618)
+ct(243,638,247,653,256,663)
+ct(265,672,277,677,292,677)
+ct(306,677,318,672,327,663)
+ct(337,653,341,640,341,625)
+ct(341,597,338,567,332,535)
+lt(304,392)
+lt(281,392)
+ )cp
+dr
+ah((102,392)
+lt(75,536)
+ct(67,576,64,603,64,617)
+ct(64,638,69,653,77,663)
+ct(86,672,98,677,112,677)
+ct(127,677,138,672,148,662)
+ct(157,653,162,640,162,624)
+ct(162,611,157,582,149,536)
+lt(123,392)
+lt(102,392)
+ )cp
+endchar;
+
+beginchar(35,500*FX#,677*FY#,13*FY#);
+"numbersign";
+dr
+ah((56,-13)
+lt(101,208)
+lt(18,208)
+lt(18,248)
+lt(109,248)
+lt(143,416)
+lt(18,416)
+lt(18,455)
+lt(152,455)
+lt(196,677)
+lt(237,677)
+lt(192,455)
+lt(357,455)
+lt(404,677)
+lt(445,677)
+lt(398,455)
+lt(481,455)
+lt(481,416)
+lt(391,416)
+lt(357,248)
+lt(481,248)
+lt(481,208)
+lt(349,208)
+lt(303,-13)
+lt(264,-13)
+lt(308,208)
+lt(143,208)
+lt(96,-13)
+lt(56,-13)
+ )cp
+dr
+ah((150,248)
+lt(315,248)
+lt(351,416)
+lt(184,416)
+lt(150,248)
+ )cp
+endchar;
+
+beginchar(36,500*FX#,717*FY#,76*FY#);
+"dollar";
+dr
+ah((52,163)
+lt(74,163)
+ct(77,118,91,84,116,60)
+ct(140,36,177,22,225,18)
+lt(225,303)
+ct(151,348,103,388,79,423)
+ct(61,447,53,477,53,513)
+ct(53,553,68,588,97,618)
+ct(127,648,170,666,225,672)
+lt(225,717)
+lt(256,717)
+lt(256,672)
+ct(282,670,305,667,324,663)
+ct(333,661,364,649,417,629)
+lt(417,483)
+lt(398,483)
+ct(394,535,381,573,358,597)
+ct(336,621,302,635,256,640)
+lt(256,392)
+ct(338,334,391,292,414,265)
+ct(438,238,449,204,449,164)
+ct(449,119,432,79,398,45)
+ct(364,11,317,-8,256,-13)
+lt(256,-76)
+lt(225,-76)
+lt(225,-13)
+ct(194,-12,166,-8,140,-3)
+ct(113,2,84,11,52,24)
+lt(52,163)
+ )cp
+dr
+ah((225,412)
+lt(225,639)
+ct(193,635,168,625,153,608)
+ct(137,591,129,570,129,545)
+ct(129,521,136,499,150,478)
+ct(165,458,190,436,225,412)
+ )cp
+dr
+ah((256,18)
+ct(280,22,299,28,312,36)
+ct(331,47,345,62,356,80)
+ct(366,99,372,118,372,139)
+ct(372,161,365,181,352,200)
+ct(339,219,307,247,256,282)
+lt(256,18)
+ )cp
+endchar;
+
+beginchar(37,833*FX#,677*FY#,27*FY#);
+"percent";
+dr
+ah((679,677)
+lt(197,-27)
+lt(153,-27)
+lt(636,677)
+lt(679,677)
+ )cp
+dr
+ah((177,677)
+ct(221,677,255,659,280,622)
+ct(304,586,316,544,316,497)
+ct(316,440,302,396,275,365)
+ct(248,334,215,319,176,319)
+ct(151,319,127,326,105,340)
+ct(84,354,67,375,54,403)
+ct(41,431,35,462,35,497)
+ct(35,531,41,562,54,591)
+ct(67,620,85,641,108,656)
+ct(130,670,153,677,177,677)
+ )cp
+dr
+ah((176,649)
+ct(159,649,144,640,132,620)
+ct(119,601,112,560,112,497)
+ct(112,451,115,417,123,394)
+ct(128,376,137,362,149,352)
+ct(155,346,164,343,174,343)
+ct(190,343,203,351,214,369)
+ct(230,393,239,435,239,494)
+ct(239,556,231,599,215,625)
+ct(204,641,191,649,176,649)
+ )cp
+dr
+ah((657,328)
+ct(680,328,703,321,726,306)
+ct(749,291,767,270,779,242)
+ct(792,214,798,183,798,150)
+ct(798,92,784,48,756,18)
+ct(729,-12,696,-27,658,-27)
+ct(634,-27,611,-20,589,-5)
+ct(567,9,549,30,536,57)
+ct(524,84,517,115,517,150)
+ct(517,184,524,215,536,244)
+ct(549,272,567,293,589,307)
+ct(611,321,634,328,657,328)
+ )cp
+dr
+ah((657,302)
+ct(641,302,628,293,617,276)
+ct(602,253,595,210,595,146)
+ct(595,88,602,47,617,24)
+ct(628,8,641,0,657,0)
+ct(672,0,685,8,697,26)
+ct(713,50,721,91,721,149)
+ct(721,210,713,253,697,277)
+ct(686,293,673,302,657,302)
+ )cp
+endchar;
+
+beginchar(38,777*FX#,677*FY#,15*FY#);
+"ampersand";
+dr
+ah((510,426)
+lt(715,426)
+lt(715,408)
+ct(687,405,666,399,652,389)
+ct(639,379,618,348,589,296)
+ct(560,244,528,196,492,151)
+ct(521,117,547,93,570,80)
+ct(593,66,616,60,639,60)
+ct(661,60,680,66,696,78)
+ct(711,90,722,108,729,132)
+lt(747,119)
+ct(735,73,716,39,689,17)
+ct(662,-4,631,-15,596,-15)
+ct(569,-15,542,-7,514,6)
+ct(487,21,457,45,424,80)
+ct(384,44,348,19,315,5)
+ct(283,-8,248,-15,211,-15)
+ct(158,-15,115,0,83,27)
+ct(52,56,36,90,36,130)
+ct(36,169,50,209,79,248)
+ct(107,287,160,328,238,370)
+ct(223,403,213,431,207,453)
+ct(201,475,199,495,199,515)
+ct(199,571,219,613,260,643)
+ct(292,665,328,677,369,677)
+ct(408,677,439,665,464,642)
+ct(488,619,500,591,500,558)
+ct(500,523,489,493,465,467)
+ct(441,441,400,412,340,381)
+ct(381,307,424,240,469,179)
+ct(526,247,555,305,555,352)
+ct(555,367,550,380,541,392)
+ct(533,400,523,406,510,408)
+lt(510,426)
+ )cp
+dr
+ah((323,413)
+ct(364,432,394,454,414,479)
+ct(434,503,444,530,444,560)
+ct(444,583,437,603,422,618)
+ct(408,633,390,641,368,641)
+ct(340,641,318,631,304,612)
+ct(289,592,282,573,282,554)
+ct(282,538,285,520,291,500)
+ct(296,481,307,451,323,413)
+ )cp
+dr
+ah((399,108)
+ct(356,166,326,209,310,236)
+ct(293,263,275,297,255,337)
+ct(216,314,186,290,167,263)
+ct(147,236,137,206,137,175)
+ct(137,140,148,109,171,83)
+ct(193,57,224,43,262,43)
+ct(282,43,302,48,321,56)
+ct(340,64,366,81,399,108)
+ )cp
+endchar;
+
+beginchar(161,180*FX#,677*FY#,0*FY#);
+"quotesingle";
+dr
+ah((77,392)
+lt(50,536)
+ct(42,576,39,603,39,617)
+ct(39,638,43,653,52,663)
+ct(60,672,72,677,86,677)
+ct(101,677,113,672,123,662)
+ct(132,653,137,640,137,625)
+ct(137,612,133,582,125,536)
+lt(98,392)
+lt(77,392)
+ )cp
+endchar;
+
+beginchar(40,333*FX#,694*FY#,213*FY#);
+"parenleft";
+dr
+ah((310,-195)
+lt(310,-213)
+ct(260,-188,219,-159,187,-126)
+ct(140,-79,104,-24,79,40)
+ct(53,104,41,170,41,239)
+ct(41,340,65,432,115,515)
+ct(165,599,230,658,310,694)
+lt(310,673)
+ct(270,651,237,621,211,583)
+ct(186,544,166,495,154,437)
+ct(141,378,135,316,135,252)
+ct(135,182,140,118,151,62)
+ct(159,17,170,-18,182,-45)
+ct(194,-72,210,-98,230,-124)
+ct(251,-149,277,-173,310,-195)
+ )cp
+endchar;
+
+beginchar(41,333*FX#,694*FY#,213*FY#);
+"parenright";
+dr
+ah((22,673)
+lt(22,694)
+ct(71,669,112,640,145,607)
+ct(192,560,228,504,253,440)
+ct(279,376,291,310,291,240)
+ct(291,139,267,47,217,-35)
+ct(167,-118,102,-178,22,-213)
+lt(22,-195)
+ct(62,-173,95,-142,121,-104)
+ct(147,-66,166,-17,178,41)
+ct(191,100,197,161,197,226)
+ct(197,295,191,358,181,416)
+ct(173,460,163,496,151,523)
+ct(138,550,122,576,102,602)
+ct(82,627,55,651,22,673)
+ )cp
+endchar;
+
+beginchar(42,500*FX#,694*FY#,0*FY#);
+"asterisk";
+dr
+ah((241,509)
+ct(239,531,235,554,227,576)
+ct(215,608,210,630,210,642)
+ct(210,659,214,672,222,681)
+ct(230,689,240,694,252,694)
+ct(262,694,271,689,278,681)
+ct(286,672,290,659,290,643)
+ct(290,628,285,608,277,582)
+ct(268,556,263,531,261,509)
+ct(279,520,295,534,309,551)
+ct(331,576,348,592,358,599)
+ct(369,605,380,608,391,608)
+ct(402,608,411,604,418,597)
+ct(426,590,429,581,429,571)
+ct(429,559,424,548,413,539)
+ct(402,529,375,520,333,510)
+ct(307,504,286,498,270,491)
+ct(286,482,307,475,332,471)
+ct(371,464,397,455,409,444)
+ct(422,434,428,422,428,409)
+ct(428,399,424,391,417,384)
+ct(409,377,401,373,391,373)
+ct(381,373,371,376,359,383)
+ct(347,390,331,405,311,429)
+ct(297,445,281,460,261,474)
+ct(261,455,265,435,272,414)
+ct(284,375,290,349,290,335)
+ct(290,322,286,311,278,302)
+ct(270,293,262,289,253,289)
+ct(241,289,230,293,220,303)
+ct(213,309,210,320,210,335)
+ct(210,351,214,370,221,392)
+ct(229,414,233,429,235,437)
+ct(237,446,239,458,241,474)
+ct(221,461,204,447,190,432)
+ct(166,405,149,388,137,381)
+ct(128,375,119,373,110,373)
+ct(99,373,90,377,82,384)
+ct(74,392,70,400,70,409)
+ct(70,417,74,426,80,435)
+ct(87,444,97,451,110,457)
+ct(119,461,139,466,170,473)
+ct(190,477,210,483,229,491)
+ct(211,499,190,506,166,512)
+ct(126,520,101,527,92,535)
+ct(77,545,70,558,70,574)
+ct(70,583,74,591,81,598)
+ct(89,605,97,609,107,609)
+ct(118,609,129,605,141,599)
+ct(153,592,168,578,186,557)
+ct(204,537,222,521,241,509)
+ )cp
+endchar;
+
+beginchar(43,563*FX#,595*FY#,0*FY#);
+"plus";
+dr
+ah((261,68)
+lt(261,312)
+lt(18,312)
+lt(18,352)
+lt(261,352)
+lt(261,595)
+lt(300,595)
+lt(300,352)
+lt(544,352)
+lt(544,312)
+lt(300,312)
+lt(300,68)
+lt(261,68)
+ )cp
+endchar;
+
+beginchar(44,250*FX#,97*FY#,166*FY#);
+"comma";
+dr
+ah((53,-166)
+lt(53,-145)
+ct(87,-133,113,-116,131,-93)
+ct(149,-70,159,-45,159,-19)
+ct(159,-13,157,-7,154,-3)
+ct(152,-1,149,0,147,0)
+ct(143,0,136,-3,124,-9)
+ct(118,-11,111,-13,105,-13)
+ct(90,-13,77,-8,67,0)
+ct(58,9,53,22,53,39)
+ct(53,55,59,69,72,80)
+ct(84,91,99,97,116,97)
+ct(138,97,157,88,174,69)
+ct(190,50,199,26,199,-4)
+ct(199,-38,187,-69,164,-98)
+ct(141,-127,104,-149,53,-166)
+ )cp
+endchar;
+
+beginchar(45,333*FX#,261*FY#,0*FY#);
+"hyphen";
+dr
+ah((40,261)
+lt(292,261)
+lt(292,187)
+lt(40,187)
+lt(40,261)
+ )cp
+endchar;
+
+beginchar(46,250*FX#,94*FY#,13*FY#);
+"period";
+dr
+ah((125,94)
+ct(140,94,153,89,163,78)
+ct(173,68,179,55,179,40)
+ct(179,25,173,12,163,2)
+ct(152,-8,139,-13,125,-13)
+ct(110,-13,97,-8,86,2)
+ct(76,12,70,25,70,40)
+ct(70,55,76,68,86,79)
+ct(97,89,110,94,125,94)
+ )cp
+endchar;
+
+beginchar(47,277*FX#,694*FY#,13*FY#);
+"slash";
+dr
+ah((280,694)
+lt(40,-13)
+lt(1,-13)
+lt(241,694)
+lt(280,694)
+ )cp
+endchar;
+
+beginchar(48,500*FX#,675*FY#,11*FY#);
+"zero";
+dr
+ah((36,327)
+ct(36,402,47,467,70,522)
+ct(93,576,123,617,161,644)
+ct(190,664,220,675,251,675)
+ct(302,675,348,649,388,598)
+ct(438,533,464,446,464,337)
+ct(464,260,453,195,431,141)
+ct(409,87,380,48,346,24)
+ct(312,0,278,-11,247,-11)
+ct(183,-11,131,26,89,100)
+ct(53,162,36,238,36,327)
+ )cp
+dr
+ah((131,314)
+ct(131,223,142,149,165,91)
+ct(183,43,211,19,248,19)
+ct(266,19,284,26,303,42)
+ct(322,58,336,84,346,122)
+ct(360,178,368,256,368,358)
+ct(368,434,360,497,345,547)
+ct(333,585,317,611,299,627)
+ct(285,637,269,643,251,643)
+ct(229,643,209,633,192,613)
+ct(168,586,152,544,144,486)
+ct(136,428,131,371,131,314)
+ )cp
+endchar;
+
+beginchar(49,500*FX#,675*FY#,0*FY#);
+"one";
+dr
+ah((117,597)
+lt(278,675)
+lt(294,675)
+lt(294,116)
+ct(294,79,295,56,299,47)
+ct(302,38,308,31,318,26)
+ct(328,21,347,18,377,18)
+lt(377,0)
+lt(128,0)
+lt(128,18)
+ct(160,18,180,21,189,26)
+ct(198,30,204,37,208,45)
+ct(212,53,213,76,213,116)
+lt(213,474)
+ct(213,522,211,552,208,566)
+ct(206,577,202,584,196,589)
+ct(190,594,183,597,174,597)
+ct(162,597,145,592,124,582)
+lt(117,597)
+ )cp
+endchar;
+
+beginchar(50,500*FX#,675*FY#,0*FY#);
+"two";
+dr
+ah((458,127)
+lt(412,0)
+lt(21,0)
+lt(21,18)
+ct(136,122,217,208,264,274)
+ct(311,341,334,402,334,457)
+ct(334,499,321,533,295,560)
+ct(270,587,239,601,203,601)
+ct(171,601,141,591,115,572)
+ct(90,553,70,525,58,488)
+lt(40,488)
+ct(48,548,69,595,103,627)
+ct(136,659,179,675,229,675)
+ct(283,675,328,658,364,624)
+ct(399,589,417,548,417,501)
+ct(417,467,409,434,394,401)
+ct(370,348,331,292,277,233)
+ct(195,145,145,91,125,73)
+lt(298,73)
+ct(333,73,358,75,372,77)
+ct(386,80,399,85,410,93)
+ct(422,101,431,112,440,127)
+lt(458,127)
+ )cp
+endchar;
+
+beginchar(51,500*FX#,675*FY#,11*FY#);
+"three";
+dr
+ah((50,536)
+ct(69,580,93,615,122,639)
+ct(151,663,187,675,229,675)
+ct(282,675,323,658,352,624)
+ct(373,598,384,570,384,541)
+ct(384,493,353,443,293,392)
+ct(334,376,364,353,385,323)
+ct(406,294,416,259,416,219)
+ct(416,161,398,112,362,70)
+ct(314,16,245,-11,155,-11)
+ct(111,-11,80,-6,64,4)
+ct(48,15,40,27,40,40)
+ct(40,49,44,58,52,65)
+ct(59,72,68,76,79,76)
+ct(87,76,95,74,104,72)
+ct(110,70,122,64,142,54)
+ct(161,44,175,38,182,36)
+ct(194,32,207,30,221,30)
+ct(254,30,283,43,307,69)
+ct(332,95,344,125,344,160)
+ct(344,186,338,211,327,235)
+ct(318,253,309,267,299,277)
+ct(285,290,266,302,242,312)
+ct(217,323,192,328,167,328)
+lt(151,328)
+lt(151,343)
+ct(177,346,203,355,229,371)
+ct(255,386,273,404,285,426)
+ct(297,447,303,471,303,497)
+ct(303,530,292,557,271,578)
+ct(250,599,224,609,193,609)
+ct(142,609,100,582,66,528)
+lt(50,536)
+ )cp
+endchar;
+
+beginchar(52,500*FX#,675*FY#,0*FY#);
+"four";
+dr
+ah((465,244)
+lt(465,174)
+lt(376,174)
+lt(376,0)
+lt(295,0)
+lt(295,174)
+lt(15,174)
+lt(15,237)
+lt(322,675)
+lt(376,675)
+lt(376,244)
+lt(465,244)
+ )cp
+dr
+ah((295,244)
+lt(295,572)
+lt(63,244)
+lt(295,244)
+ )cp
+endchar;
+
+beginchar(53,500*FX#,662*FY#,11*FY#);
+"five";
+dr
+ah((434,662)
+lt(395,579)
+lt(196,579)
+lt(153,490)
+ct(239,477,307,445,358,394)
+ct(401,349,423,297,423,237)
+ct(423,202,416,170,402,141)
+ct(387,111,370,86,348,65)
+ct(327,44,303,27,276,15)
+ct(238,-2,200,-11,161,-11)
+ct(121,-11,93,-4,74,8)
+ct(56,22,47,36,47,53)
+ct(47,62,51,70,59,77)
+ct(66,84,76,87,87,87)
+ct(95,87,103,86,109,83)
+ct(115,81,126,74,142,63)
+ct(166,46,190,38,216,38)
+ct(254,38,287,52,316,81)
+ct(345,110,359,145,359,187)
+ct(359,227,347,264,321,299)
+ct(295,333,260,360,214,379)
+ct(178,393,130,402,69,404)
+lt(196,662)
+lt(434,662)
+ )cp
+endchar;
+
+beginchar(54,500*FX#,675*FY#,11*FY#);
+"six";
+dr
+ah((448,675)
+lt(448,657)
+ct(405,653,370,644,343,632)
+ct(315,619,288,599,262,573)
+ct(235,546,213,517,196,485)
+ct(179,452,164,414,152,369)
+ct(199,401,246,417,293,417)
+ct(339,417,378,399,411,363)
+ct(444,326,461,279,461,222)
+ct(461,166,444,116,411,71)
+ct(370,16,316,-11,250,-11)
+ct(205,-11,167,3,135,33)
+ct(73,91,42,166,42,259)
+ct(42,319,54,375,78,428)
+ct(102,482,136,529,180,570)
+ct(224,612,266,639,307,654)
+ct(347,668,385,675,419,675)
+lt(448,675)
+ )cp
+dr
+ah((144,333)
+ct(138,289,135,254,135,227)
+ct(135,196,141,162,153,125)
+ct(164,89,181,60,204,38)
+ct(220,22,241,15,265,15)
+ct(293,15,318,28,341,55)
+ct(363,82,374,120,374,169)
+ct(374,225,363,273,341,314)
+ct(319,355,287,375,247,375)
+ct(234,375,221,372,207,367)
+ct(193,362,172,351,144,333)
+ )cp
+endchar;
+
+beginchar(55,500*FX#,662*FY#,13*FY#);
+"seven";
+dr
+ah((100,662)
+lt(455,662)
+lt(455,643)
+lt(234,-13)
+lt(180,-13)
+lt(377,582)
+lt(195,582)
+ct(158,582,132,577,117,569)
+ct(89,553,67,530,51,500)
+lt(37,505)
+lt(100,662)
+ )cp
+endchar;
+
+beginchar(56,500*FX#,675*FY#,11*FY#);
+"eight";
+dr
+ah((191,333)
+ct(139,376,105,410,90,437)
+ct(75,463,67,490,67,518)
+ct(67,561,84,598,117,629)
+ct(150,660,194,675,250,675)
+ct(303,675,346,661,378,632)
+ct(411,603,427,570,427,533)
+ct(427,508,418,483,401,457)
+ct(383,431,347,401,291,366)
+ct(348,322,386,287,405,262)
+ct(429,228,442,193,442,157)
+ct(442,110,424,70,389,37)
+ct(353,4,307,-11,249,-11)
+ct(186,-11,137,8,102,47)
+ct(74,78,60,112,60,150)
+ct(60,180,70,209,90,238)
+ct(109,266,143,298,191,333)
+ )cp
+dr
+ah((268,385)
+ct(307,420,332,448,342,468)
+ct(353,489,358,512,358,538)
+ct(358,572,348,599,329,618)
+ct(310,637,284,647,250,647)
+ct(217,647,190,637,169,618)
+ct(149,599,138,576,138,551)
+ct(138,534,142,517,151,500)
+ct(160,483,172,467,188,452)
+lt(268,385)
+ )cp
+dr
+ah((214,314)
+ct(187,292,167,267,154,240)
+ct(141,213,135,184,135,153)
+ct(135,111,146,77,169,52)
+ct(192,27,221,14,257,14)
+ct(292,14,320,24,341,44)
+ct(362,64,373,88,373,116)
+ct(373,139,366,160,354,179)
+ct(331,213,284,258,214,314)
+ )cp
+endchar;
+
+beginchar(57,500*FX#,675*FY#,13*FY#);
+"nine";
+dr
+ah((52,-13)
+lt(52,4)
+ct(95,5,134,14,170,33)
+ct(207,52,242,86,276,133)
+ct(310,181,334,233,347,290)
+ct(295,257,249,241,208,241)
+ct(162,241,122,259,89,295)
+ct(56,331,39,378,39,438)
+ct(39,496,55,547,89,593)
+ct(129,647,181,675,246,675)
+ct(300,675,346,652,385,608)
+ct(433,552,457,483,457,402)
+ct(457,328,438,260,402,196)
+ct(366,132,316,80,251,38)
+ct(199,4,142,-13,80,-13)
+lt(52,-13)
+ )cp
+dr
+ah((355,326)
+ct(361,368,364,402,364,428)
+ct(364,459,358,493,348,530)
+ct(337,567,322,595,302,614)
+ct(282,634,260,644,235,644)
+ct(206,644,180,631,159,604)
+ct(137,578,126,540,126,488)
+ct(126,419,140,365,169,327)
+ct(190,299,216,285,248,285)
+ct(263,285,280,289,301,296)
+ct(321,303,339,313,355,326)
+ )cp
+endchar;
+
+beginchar(58,277*FX#,460*FY#,13*FY#);
+"colon";
+dr
+ah((141,460)
+ct(156,460,168,455,179,445)
+ct(190,434,195,421,195,406)
+ct(195,391,190,378,179,368)
+ct(168,357,156,352,141,352)
+ct(126,352,113,357,102,368)
+ct(92,378,86,391,86,406)
+ct(86,421,92,434,102,445)
+ct(113,455,126,460,141,460)
+ )cp
+dr
+ah((140,95)
+ct(155,95,168,89,178,79)
+ct(189,68,194,55,194,40)
+ct(194,25,189,12,178,2)
+ct(167,-8,155,-13,140,-13)
+ct(125,-13,112,-8,101,2)
+ct(91,12,85,25,85,40)
+ct(85,55,91,68,101,79)
+ct(112,89,125,95,140,95)
+ )cp
+endchar;
+
+beginchar(59,277*FX#,461*FY#,166*FY#);
+"semicolon";
+dr
+ah((137,461)
+ct(152,461,165,456,176,445)
+ct(186,435,191,422,191,407)
+ct(191,392,186,379,176,369)
+ct(165,358,152,353,137,353)
+ct(122,353,109,358,99,369)
+ct(88,379,83,392,83,407)
+ct(83,422,88,435,99,445)
+ct(109,456,122,461,137,461)
+ )cp
+dr
+ah((69,-166)
+lt(69,-145)
+ct(102,-133,128,-116,147,-93)
+ct(165,-70,174,-45,174,-19)
+ct(174,-13,172,-7,170,-3)
+ct(167,-1,165,0,163,0)
+ct(159,0,152,-3,140,-9)
+ct(134,-11,127,-13,121,-13)
+ct(105,-13,92,-8,83,0)
+ct(74,9,69,22,69,39)
+ct(69,55,75,69,87,80)
+ct(99,91,114,97,132,97)
+ct(153,97,172,88,189,69)
+ct(206,50,214,26,214,-4)
+ct(214,-38,203,-69,179,-98)
+ct(156,-127,119,-149,69,-166)
+ )cp
+endchar;
+
+beginchar(137,563*FX#,572*FY#,0*FY#);
+"less";
+dr
+ah((19,344)
+lt(544,572)
+lt(544,529)
+lt(92,333)
+lt(544,135)
+lt(544,91)
+lt(19,320)
+lt(19,344)
+ )cp
+endchar;
+
+beginchar(61,563*FX#,431*FY#,0*FY#);
+"equal";
+dr
+ah((18,431)
+lt(544,431)
+lt(544,391)
+lt(18,391)
+lt(18,431)
+ )cp
+dr
+ah((18,271)
+lt(544,271)
+lt(544,231)
+lt(18,231)
+lt(18,271)
+ )cp
+endchar;
+
+beginchar(138,563*FX#,572*FY#,0*FY#);
+"greater";
+dr
+ah((543,318)
+lt(18,91)
+lt(18,133)
+lt(470,329)
+lt(18,527)
+lt(18,572)
+lt(543,342)
+lt(543,318)
+ )cp
+endchar;
+
+beginchar(63,443*FX#,677*FY#,13*FY#);
+"question";
+dr
+ah((221,156)
+lt(201,156)
+ct(203,197,209,231,217,258)
+ct(225,284,241,322,266,370)
+ct(286,406,298,435,304,454)
+ct(310,474,313,494,313,514)
+ct(313,555,302,588,280,613)
+ct(258,637,231,649,199,649)
+ct(171,649,149,643,132,629)
+ct(116,616,108,602,108,586)
+ct(108,574,113,559,123,541)
+ct(132,524,137,511,137,501)
+ct(137,490,133,480,126,472)
+ct(118,464,109,460,99,460)
+ct(85,460,72,467,61,480)
+ct(50,494,44,513,44,537)
+ct(44,573,60,606,92,634)
+ct(123,663,166,677,220,677)
+ct(287,677,336,657,368,618)
+ct(391,589,403,557,403,523)
+ct(403,499,398,475,387,450)
+ct(377,425,357,395,327,361)
+ct(280,308,251,270,240,248)
+ct(230,225,223,195,221,156)
+ )cp
+dr
+ah((214,95)
+ct(230,95,243,90,253,79)
+ct(264,69,269,56,269,41)
+ct(269,26,264,13,253,2)
+ct(242,-7,229,-13,214,-13)
+ct(199,-13,187,-7,176,2)
+ct(165,13,160,26,160,41)
+ct(160,56,165,69,176,79)
+ct(187,90,199,95,214,95)
+ )cp
+endchar;
+
+beginchar(64,920*FX#,694*FY#,215*FY#);
+"at";
+dr
+ah((687,467)
+lt(630,272)
+ct(609,200,596,153,591,134)
+ct(587,114,584,99,584,87)
+ct(584,76,588,68,595,61)
+ct(602,53,611,50,621,50)
+ct(645,50,673,62,707,85)
+ct(740,109,769,148,792,201)
+ct(816,255,828,310,828,368)
+ct(828,424,815,475,788,522)
+ct(761,570,723,606,674,631)
+ct(625,656,571,669,512,669)
+ct(437,669,367,649,302,609)
+ct(238,569,187,512,149,437)
+ct(112,362,93,284,93,204)
+ct(93,129,109,61,142,0)
+ct(175,-61,222,-107,282,-138)
+ct(342,-170,406,-186,475,-186)
+ct(561,-186,638,-163,707,-117)
+ct(776,-71,830,-4,868,83)
+lt(896,83)
+ct(867,-5,813,-77,736,-132)
+ct(659,-188,571,-215,473,-215)
+ct(395,-215,323,-197,257,-160)
+ct(190,-124,139,-72,102,-5)
+ct(65,62,47,136,47,216)
+ct(47,302,67,382,107,457)
+ct(148,531,204,589,277,631)
+ct(350,673,427,694,509,694)
+ct(576,694,637,680,691,652)
+ct(745,624,787,584,815,530)
+ct(843,476,857,420,857,359)
+ct(857,300,844,241,818,182)
+ct(791,124,757,81,716,55)
+ct(675,28,632,15,588,15)
+ct(563,15,545,20,532,32)
+ct(519,44,513,60,513,82)
+ct(513,100,516,123,522,153)
+ct(474,95,435,57,406,40)
+ct(377,23,352,14,330,14)
+ct(306,14,286,24,268,45)
+ct(250,66,241,93,241,128)
+ct(241,175,257,228,287,287)
+ct(318,345,359,393,410,430)
+ct(447,456,480,470,510,470)
+ct(532,470,550,465,565,453)
+ct(579,442,589,425,594,403)
+lt(610,457)
+lt(687,467)
+ )cp
+dr
+ah((516,447)
+ct(491,447,466,434,441,409)
+ct(404,371,373,320,347,256)
+ct(327,209,318,171,318,143)
+ct(318,122,324,105,336,93)
+ct(347,80,360,73,375,73)
+ct(393,73,413,80,434,95)
+ct(455,109,477,131,500,161)
+ct(522,191,539,221,549,250)
+ct(567,302,577,344,577,377)
+ct(577,398,571,416,559,428)
+ct(547,441,533,447,516,447)
+ )cp
+endchar;
+
+beginchar(65,722*FX#,677*FY#,0*FY#);
+"A";
+dr
+ah((457,221)
+lt(201,221)
+lt(156,117)
+ct(144,91,139,71,139,59)
+ct(139,49,144,40,154,32)
+ct(163,25,184,20,216,18)
+lt(216,0)
+lt(7,0)
+lt(7,18)
+ct(35,22,53,29,61,37)
+ct(77,52,96,84,116,132)
+lt(349,677)
+lt(366,677)
+lt(597,126)
+ct(615,82,632,53,647,40)
+ct(662,27,683,19,710,18)
+lt(710,0)
+lt(449,0)
+lt(449,18)
+ct(476,19,493,23,503,31)
+ct(512,38,517,47,517,58)
+ct(517,72,510,95,497,126)
+lt(457,221)
+ )cp
+dr
+ah((443,257)
+lt(331,525)
+lt(216,257)
+lt(443,257)
+ )cp
+chp[65]:=currentpicture;
+endchar;
+
+beginchar(66,666*FX#,662*FY#,0*FY#);
+"B";
+dr
+ah((461,337)
+ct(507,327,541,312,564,291)
+ct(596,261,612,224,612,181)
+ct(612,148,601,116,581,86)
+ct(560,56,531,34,495,20)
+ct(459,6,403,0,329,0)
+lt(16,0)
+lt(16,18)
+lt(41,18)
+ct(69,18,89,26,101,44)
+ct(108,55,112,79,112,117)
+lt(112,544)
+ct(112,585,107,611,98,622)
+ct(85,636,66,644,41,644)
+lt(16,644)
+lt(16,662)
+lt(302,662)
+ct(355,662,398,658,431,650)
+ct(479,638,517,617,542,588)
+ct(568,558,581,524,581,485)
+ct(581,452,571,422,551,396)
+ct(531,370,501,350,461,337)
+ )cp
+dr
+ah((206,364)
+ct(218,361,231,360,247,359)
+ct(262,357,279,357,298,357)
+ct(345,357,381,362,405,372)
+ct(429,383,447,398,460,419)
+ct(473,441,479,464,479,489)
+ct(479,527,463,561,432,588)
+ct(400,615,354,629,293,629)
+ct(261,629,232,625,206,618)
+lt(206,364)
+ )cp
+dr
+ah((206,47)
+ct(243,38,280,34,317,34)
+ct(376,34,421,47,452,74)
+ct(483,100,499,133,499,172)
+ct(499,198,492,223,478,247)
+ct(464,270,441,289,409,303)
+ct(378,316,339,323,292,323)
+ct(272,323,255,323,240,322)
+ct(226,322,214,320,206,319)
+lt(206,47)
+ )cp
+endchar;
+
+beginchar(67,666*FX#,677*FY#,15*FY#);
+"C";
+dr
+ah((602,677)
+lt(617,452)
+lt(602,452)
+ct(581,519,553,568,515,597)
+ct(478,627,433,642,380,642)
+ct(336,642,297,630,261,608)
+ct(226,586,198,550,177,501)
+ct(157,453,147,392,147,319)
+ct(147,259,157,208,176,164)
+ct(195,120,224,86,262,62)
+ct(301,39,345,27,395,27)
+ct(437,27,475,37,508,55)
+ct(541,73,577,110,617,165)
+lt(632,155)
+ct(599,96,560,53,516,25)
+ct(471,-1,419,-15,358,-15)
+ct(248,-15,163,25,103,106)
+ct(58,166,36,238,36,320)
+ct(36,386,50,447,80,502)
+ct(110,558,150,601,202,631)
+ct(254,662,311,677,373,677)
+ct(420,677,467,665,514,642)
+ct(528,634,537,631,543,631)
+ct(552,631,560,634,566,640)
+ct(574,648,580,661,584,677)
+lt(602,677)
+ )cp
+chp[67]:=currentpicture;
+endchar;
+
+beginchar(68,722*FX#,662*FY#,0*FY#);
+"D";
+dr
+ah((17,0)
+lt(17,18)
+lt(41,18)
+ct(69,18,89,26,101,44)
+ct(108,55,112,79,112,117)
+lt(112,544)
+ct(112,585,107,611,98,622)
+ct(85,636,66,644,41,644)
+lt(17,644)
+lt(17,662)
+lt(286,662)
+ct(385,662,460,650,512,628)
+ct(564,605,605,568,636,516)
+ct(668,463,684,403,684,334)
+ct(684,242,656,165,600,103)
+ct(536,34,440,0,312,0)
+lt(17,0)
+ )cp
+dr
+ah((206,47)
+ct(247,38,282,34,310,34)
+ct(385,34,448,60,498,113)
+ct(547,166,572,238,572,329)
+ct(572,421,547,493,498,545)
+ct(448,598,384,625,306,625)
+ct(276,625,243,620,206,610)
+lt(206,47)
+ )cp
+endchar;
+
+beginchar(69,610*FX#,662*FY#,0*FY#);
+"E";
+dr
+ah((208,625)
+lt(208,364)
+lt(354,364)
+ct(392,364,417,369,430,381)
+ct(446,395,456,422,458,460)
+lt(476,460)
+lt(476,229)
+lt(458,229)
+ct(453,261,448,282,444,291)
+ct(438,303,429,312,416,318)
+ct(402,325,382,328,354,328)
+lt(208,328)
+lt(208,110)
+ct(208,81,210,63,212,56)
+ct(215,50,220,45,226,41)
+ct(233,38,245,36,263,36)
+lt(375,36)
+ct(413,36,440,38,457,43)
+ct(474,49,490,59,506,74)
+ct(526,94,546,124,568,166)
+lt(587,166)
+lt(530,0)
+lt(20,0)
+lt(20,18)
+lt(43,18)
+ct(59,18,74,21,88,29)
+ct(98,34,105,42,109,52)
+ct(113,63,115,84,115,116)
+lt(115,546)
+ct(115,588,110,614,102,624)
+ct(90,637,70,644,43,644)
+lt(20,644)
+lt(20,662)
+lt(530,662)
+lt(538,517)
+lt(519,517)
+ct(512,551,504,575,496,588)
+ct(488,601,475,611,459,618)
+ct(445,622,422,625,390,625)
+lt(208,625)
+ )cp
+chp[69]:=currentpicture;
+endchar;
+
+beginchar(70,556*FX#,662*FY#,0*FY#);
+"F";
+dr
+ah((204,625)
+lt(204,365)
+lt(325,365)
+ct(352,365,373,371,385,384)
+ct(398,396,407,420,411,456)
+lt(429,456)
+lt(429,232)
+lt(411,232)
+ct(411,258,407,277,401,289)
+ct(395,301,386,310,375,316)
+ct(364,322,347,325,325,325)
+lt(204,325)
+lt(204,117)
+ct(204,83,206,60,210,50)
+ct(213,42,220,35,231,29)
+ct(245,21,260,18,276,18)
+lt(300,18)
+lt(300,0)
+lt(16,0)
+lt(16,18)
+lt(39,18)
+ct(66,18,86,25,99,41)
+ct(106,51,110,77,110,117)
+lt(110,544)
+ct(110,578,108,600,104,611)
+ct(100,619,94,626,84,632)
+ct(70,640,55,644,39,644)
+lt(16,644)
+lt(16,662)
+lt(508,662)
+lt(515,516)
+lt(498,516)
+ct(489,547,479,570,468,584)
+ct(457,599,443,609,427,616)
+ct(410,622,385,625,350,625)
+lt(204,625)
+ )cp
+endchar;
+
+beginchar(71,722*FX#,677*FY#,15*FY#);
+"G";
+dr
+ah((613,677)
+lt(630,468)
+lt(613,468)
+ct(595,520,573,559,546,585)
+ct(506,623,456,643,395,643)
+ct(310,643,246,609,202,542)
+ct(165,486,147,419,147,341)
+ct(147,278,159,221,184,168)
+ct(208,116,240,78,280,54)
+ct(319,30,360,18,401,18)
+ct(426,18,449,21,472,27)
+ct(495,33,517,42,538,54)
+lt(538,246)
+ct(538,279,536,301,531,311)
+ct(525,321,518,329,507,334)
+ct(496,340,478,342,451,342)
+lt(451,361)
+lt(708,361)
+lt(708,342)
+lt(695,342)
+ct(669,342,652,333,643,317)
+ct(636,305,633,281,633,246)
+lt(633,43)
+ct(596,23,559,8,522,0)
+ct(486,-10,445,-15,401,-15)
+ct(273,-15,175,25,109,107)
+ct(59,169,35,240,35,320)
+ct(35,378,49,434,77,488)
+ct(109,551,155,600,213,634)
+ct(261,662,319,677,385,677)
+ct(409,677,431,675,451,671)
+ct(471,667,499,658,535,645)
+ct(553,638,565,635,571,635)
+ct(577,635,583,638,587,643)
+ct(592,649,594,660,595,677)
+lt(613,677)
+ )cp
+endchar;
+
+beginchar(72,722*FX#,662*FY#,0*FY#);
+"H";
+dr
+ah((205,354)
+lt(513,354)
+lt(513,544)
+ct(513,578,510,600,506,611)
+ct(502,619,496,626,486,632)
+ct(472,640,457,644,441,644)
+lt(418,644)
+lt(418,662)
+lt(701,662)
+lt(701,644)
+lt(678,644)
+ct(662,644,647,640,633,632)
+ct(623,627,616,619,612,609)
+ct(608,598,606,576,606,544)
+lt(606,117)
+ct(606,83,608,60,613,50)
+ct(616,42,623,35,633,29)
+ct(647,21,662,18,678,18)
+lt(701,18)
+lt(701,0)
+lt(418,0)
+lt(418,18)
+lt(441,18)
+ct(468,18,488,25,500,41)
+ct(508,51,513,77,513,117)
+lt(513,318)
+lt(205,318)
+lt(205,117)
+ct(205,83,207,60,211,50)
+ct(214,42,221,35,232,29)
+ct(246,21,260,18,276,18)
+lt(300,18)
+lt(300,0)
+lt(17,0)
+lt(17,18)
+lt(40,18)
+ct(67,18,87,25,100,41)
+ct(107,51,111,77,111,117)
+lt(111,544)
+ct(111,578,109,600,105,611)
+ct(101,619,95,626,85,632)
+ct(70,640,55,644,40,644)
+lt(17,644)
+lt(17,662)
+lt(300,662)
+lt(300,644)
+lt(276,644)
+ct(260,644,246,640,232,632)
+ct(222,627,215,619,211,609)
+ct(207,598,205,576,205,544)
+lt(205,354)
+ )cp
+endchar;
+
+beginchar(73,333*FX#,662*FY#,0*FY#);
+"I";
+dr
+ah((308,18)
+lt(308,0)
+lt(24,0)
+lt(24,18)
+lt(48,18)
+ct(75,18,95,25,107,41)
+ct(115,51,119,77,119,117)
+lt(119,544)
+ct(119,578,117,600,113,611)
+ct(109,619,103,626,93,632)
+ct(78,640,63,644,48,644)
+lt(24,644)
+lt(24,662)
+lt(308,662)
+lt(308,644)
+lt(284,644)
+ct(257,644,237,636,225,620)
+ct(217,609,213,584,213,544)
+lt(213,117)
+ct(213,83,215,60,219,50)
+ct(222,42,229,35,240,29)
+ct(254,21,268,18,284,18)
+lt(308,18)
+ )cp
+chp[73]:=currentpicture;
+endchar;
+
+beginchar(74,389*FX#,662*FY#,15*FY#);
+"J";
+dr
+ah((99,644)
+lt(99,662)
+lt(383,662)
+lt(383,644)
+lt(359,644)
+ct(331,644,312,636,300,620)
+ct(292,609,288,584,288,544)
+lt(288,221)
+ct(288,171,283,131,272,100)
+ct(261,69,242,42,215,19)
+ct(189,-3,156,-15,119,-15)
+ct(88,-15,64,-7,46,7)
+ct(29,22,20,40,20,59)
+ct(20,75,24,87,32,95)
+ct(42,105,55,110,70,110)
+ct(80,110,90,107,98,100)
+ct(106,93,117,75,129,45)
+ct(137,27,146,19,158,19)
+ct(167,19,175,24,183,35)
+ct(190,46,194,65,194,92)
+lt(194,544)
+ct(194,578,192,600,188,611)
+ct(184,619,177,626,167,632)
+ct(153,640,138,644,123,644)
+lt(99,644)
+ )cp
+endchar;
+
+beginchar(75,722*FX#,662*FY#,0*FY#);
+"K";
+dr
+ah((298,367)
+lt(542,124)
+ct(583,84,617,57,645,42)
+ct(673,28,702,20,730,18)
+lt(730,0)
+lt(415,0)
+lt(415,18)
+ct(434,18,447,21,456,27)
+ct(464,33,468,41,468,48)
+ct(468,56,467,63,464,69)
+ct(461,76,450,87,433,104)
+lt(205,330)
+lt(205,117)
+ct(205,83,207,60,211,50)
+ct(214,42,221,35,231,29)
+ct(245,21,260,18,276,18)
+lt(298,18)
+lt(298,0)
+lt(16,0)
+lt(16,18)
+lt(40,18)
+ct(67,18,87,25,99,41)
+ct(107,51,111,77,111,117)
+lt(111,544)
+ct(111,578,108,600,104,611)
+ct(101,619,94,626,84,632)
+ct(70,640,55,644,40,644)
+lt(16,644)
+lt(16,662)
+lt(298,662)
+lt(298,644)
+lt(276,644)
+ct(260,644,245,640,231,632)
+ct(221,627,214,619,210,609)
+ct(207,598,205,577,205,544)
+lt(205,342)
+ct(211,348,233,368,271,404)
+ct(367,492,426,551,447,581)
+ct(455,594,460,605,460,615)
+ct(460,623,457,629,450,635)
+ct(443,641,431,644,415,644)
+lt(400,644)
+lt(400,662)
+lt(643,662)
+lt(643,644)
+ct(629,643,616,641,604,638)
+ct(592,634,578,627,561,617)
+ct(544,607,523,590,499,567)
+ct(491,561,458,527,399,467)
+lt(298,367)
+ )cp
+endchar;
+
+beginchar(76,610*FX#,662*FY#,0*FY#);
+"L";
+dr
+ah((573,183)
+lt(589,179)
+lt(532,0)
+lt(20,0)
+lt(20,18)
+lt(44,18)
+ct(72,18,92,27,104,45)
+ct(111,55,115,79,115,117)
+lt(115,544)
+ct(115,585,110,611,101,622)
+ct(88,636,69,644,44,644)
+lt(20,644)
+lt(20,662)
+lt(319,662)
+lt(319,644)
+ct(284,644,260,641,245,634)
+ct(231,627,222,618,216,608)
+ct(211,597,208,573,208,533)
+lt(208,117)
+ct(208,90,210,72,216,62)
+ct(220,55,226,50,234,46)
+ct(243,43,268,41,311,41)
+lt(359,41)
+ct(410,41,445,45,466,53)
+ct(486,60,505,73,522,93)
+ct(539,112,556,142,573,183)
+ )cp
+endchar;
+
+beginchar(77,889*FX#,662*FY#,0*FY#);
+"M";
+dr
+ah((409,0)
+lt(153,557)
+lt(153,114)
+ct(153,73,157,48,166,38)
+ct(178,24,197,18,223,18)
+lt(247,18)
+lt(247,0)
+lt(16,0)
+lt(16,18)
+lt(40,18)
+ct(68,18,87,26,99,43)
+ct(106,53,110,77,110,114)
+lt(110,547)
+ct(110,576,106,597,100,610)
+ct(96,620,87,628,75,634)
+ct(63,640,43,644,16,644)
+lt(16,662)
+lt(204,662)
+lt(444,144)
+lt(680,662)
+lt(868,662)
+lt(868,644)
+lt(845,644)
+ct(816,644,796,635,785,618)
+ct(777,608,774,584,774,547)
+lt(774,114)
+ct(774,73,778,48,788,38)
+ct(800,24,819,18,845,18)
+lt(868,18)
+lt(868,0)
+lt(586,0)
+lt(586,18)
+lt(610,18)
+ct(638,18,657,26,669,43)
+ct(676,53,680,77,680,114)
+lt(680,557)
+lt(425,0)
+lt(409,0)
+ )cp
+endchar;
+
+beginchar(78,722*FX#,662*FY#,10*FY#);
+"N";
+dr
+ah((-13,662)
+lt(166,662)
+lt(571,165)
+lt(571,547)
+ct(571,587,566,613,557,623)
+ct(545,637,526,644,500,644)
+lt(477,644)
+lt(477,662)
+lt(708,662)
+lt(708,644)
+lt(684,644)
+ct(656,644,636,635,625,618)
+ct(617,608,614,584,614,547)
+lt(614,-10)
+lt(596,-10)
+lt(160,522)
+lt(160,114)
+ct(160,73,164,48,173,38)
+ct(185,24,204,18,230,18)
+lt(253,18)
+lt(253,0)
+lt(23,0)
+lt(23,18)
+lt(46,18)
+ct(74,18,94,26,106,43)
+ct(113,53,117,77,117,114)
+lt(117,575)
+ct(97,597,83,612,73,619)
+ct(63,626,48,633,29,639)
+ct(19,642,5,644,-13,644)
+lt(-13,662)
+ )cp
+chp[78]:=currentpicture;
+endchar;
+
+beginchar(79,722*FX#,677*FY#,15*FY#);
+"O";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+chp[79]:=currentpicture;
+endchar;
+
+beginchar(80,556*FX#,662*FY#,0*FY#);
+"P";
+dr
+ah((205,310)
+lt(205,117)
+ct(205,75,209,49,218,39)
+ct(230,25,249,18,274,18)
+lt(300,18)
+lt(300,0)
+lt(16,0)
+lt(16,18)
+lt(41,18)
+ct(69,18,89,27,101,45)
+ct(107,55,111,79,111,117)
+lt(111,544)
+ct(111,586,106,612,98,622)
+ct(85,636,66,644,41,644)
+lt(16,644)
+lt(16,662)
+lt(259,662)
+ct(318,662,365,656,399,643)
+ct(433,631,462,611,485,582)
+ct(509,553,520,518,520,479)
+ct(520,424,503,381,467,347)
+ct(431,313,381,296,316,296)
+ct(300,296,283,297,264,299)
+ct(246,302,226,305,205,310)
+ )cp
+dr
+ah((205,337)
+ct(222,334,237,332,250,330)
+ct(264,328,275,328,285,328)
+ct(319,328,348,341,372,367)
+ct(397,393,409,427,409,469)
+ct(409,497,403,524,392,549)
+ct(380,573,363,592,342,604)
+ct(320,616,296,622,269,622)
+ct(252,622,231,619,205,613)
+lt(205,337)
+ )cp
+endchar;
+
+beginchar(81,722*FX#,677*FY#,195*FY#);
+"Q";
+dr
+ah((440,-7)
+ct(473,-64,509,-106,548,-133)
+ct(586,-160,630,-176,679,-180)
+lt(679,-195)
+ct(634,-194,586,-185,535,-168)
+ct(484,-152,436,-129,390,-100)
+ct(344,-71,305,-40,271,-7)
+ct(224,11,187,30,160,52)
+ct(120,84,90,123,68,169)
+ct(46,215,35,269,35,332)
+ct(35,431,67,513,131,579)
+ct(195,644,273,677,364,677)
+ct(450,677,525,644,589,578)
+ct(652,513,684,430,684,330)
+ct(684,249,661,178,616,117)
+ct(571,55,512,14,440,-7)
+ )cp
+dr
+ah((358,639)
+ct(298,639,251,618,215,576)
+ct(169,522,146,441,146,332)
+ct(146,224,169,142,216,84)
+ct(252,40,299,18,358,18)
+ct(419,18,468,40,506,84)
+ct(550,137,572,215,572,318)
+ct(572,397,560,464,536,518)
+ct(517,559,492,590,462,610)
+ct(431,629,396,639,358,639)
+ )cp
+endchar;
+
+beginchar(82,666*FX#,662*FY#,0*FY#);
+"R";
+dr
+ah((675,0)
+lt(499,0)
+lt(274,309)
+ct(258,308,244,308,234,308)
+ct(230,308,225,308,220,308)
+ct(215,309,210,309,205,309)
+lt(205,117)
+ct(205,75,209,49,219,39)
+ct(231,25,249,18,274,18)
+lt(300,18)
+lt(300,0)
+lt(17,0)
+lt(17,18)
+lt(41,18)
+ct(69,18,89,27,102,45)
+ct(108,55,112,79,112,117)
+lt(112,544)
+ct(112,586,107,612,98,622)
+ct(85,636,66,644,41,644)
+lt(17,644)
+lt(17,662)
+lt(258,662)
+ct(328,662,380,656,413,646)
+ct(447,636,475,617,498,590)
+ct(522,562,533,529,533,491)
+ct(533,451,520,415,493,385)
+ct(467,355,426,334,370,322)
+lt(507,132)
+ct(538,88,565,59,587,45)
+ct(610,31,639,21,675,18)
+lt(675,0)
+ )cp
+dr
+ah((205,340)
+ct(211,340,217,340,221,340)
+ct(226,339,229,339,232,339)
+ct(296,339,343,353,375,380)
+ct(407,408,423,443,423,485)
+ct(423,526,410,560,385,586)
+ct(359,612,324,625,282,625)
+ct(262,625,237,621,205,615)
+lt(205,340)
+ )cp
+endchar;
+
+beginchar(83,556*FX#,677*FY#,15*FY#);
+"S";
+dr
+ah((458,677)
+lt(458,448)
+lt(440,448)
+ct(434,492,424,527,408,553)
+ct(393,579,372,599,344,615)
+ct(316,630,287,638,257,638)
+ct(223,638,195,627,173,607)
+ct(151,586,140,562,140,536)
+ct(140,516,147,497,161,481)
+ct(181,456,229,423,305,383)
+ct(367,350,409,325,431,307)
+ct(454,289,471,268,484,244)
+ct(496,220,502,195,502,168)
+ct(502,118,482,75,444,39)
+ct(405,3,355,-15,293,-15)
+ct(274,-15,256,-13,239,-10)
+ct(229,-9,208,-3,177,7)
+ct(145,17,125,22,116,22)
+ct(108,22,102,20,97,15)
+ct(92,10,89,0,86,-15)
+lt(68,-15)
+lt(68,211)
+lt(86,211)
+ct(95,164,106,128,121,105)
+ct(135,81,157,62,186,46)
+ct(216,30,248,22,283,22)
+ct(324,22,356,33,380,55)
+ct(403,76,415,102,415,131)
+ct(415,147,411,164,402,180)
+ct(393,197,379,212,360,227)
+ct(347,236,312,257,256,289)
+ct(199,321,159,346,135,365)
+ct(111,384,93,404,81,427)
+ct(68,450,62,475,62,502)
+ct(62,550,80,591,117,625)
+ct(153,660,200,677,256,677)
+ct(291,677,328,668,368,651)
+ct(386,643,398,639,406,639)
+ct(415,639,422,641,427,646)
+ct(432,651,437,661,440,677)
+lt(458,677)
+ )cp
+chp[83]:=currentpicture;
+endchar;
+
+beginchar(84,610*FX#,662*FY#,0*FY#);
+"T";
+dr
+ah((578,662)
+lt(585,506)
+lt(567,506)
+ct(563,533,558,553,552,565)
+ct(542,584,529,598,512,607)
+ct(495,616,473,620,446,620)
+lt(353,620)
+lt(353,114)
+ct(353,73,357,48,366,38)
+ct(378,24,397,18,423,18)
+lt(446,18)
+lt(446,0)
+lt(165,0)
+lt(165,18)
+lt(188,18)
+ct(216,18,236,26,248,43)
+ct(255,53,259,77,259,114)
+lt(259,620)
+lt(179,620)
+ct(148,620,126,617,113,613)
+ct(96,607,82,595,70,578)
+ct(58,560,51,536,48,506)
+lt(30,506)
+lt(38,662)
+lt(578,662)
+ )cp
+endchar;
+
+beginchar(85,722*FX#,662*FY#,15*FY#);
+"U";
+dr
+ah((477,644)
+lt(477,662)
+lt(711,662)
+lt(711,644)
+lt(686,644)
+ct(660,644,640,633,626,611)
+ct(619,601,616,577,616,541)
+lt(616,272)
+ct(616,206,609,154,596,117)
+ct(583,81,557,49,518,23)
+ct(480,-2,427,-15,361,-15)
+ct(289,-15,234,-3,196,21)
+ct(159,47,132,80,117,123)
+ct(106,151,101,206,101,286)
+lt(101,544)
+ct(101,585,95,612,84,625)
+ct(73,637,55,644,30,644)
+lt(5,644)
+lt(5,662)
+lt(291,662)
+lt(291,644)
+lt(266,644)
+ct(238,644,219,635,207,618)
+ct(199,606,195,581,195,544)
+lt(195,256)
+ct(195,230,197,201,202,167)
+ct(207,134,215,108,228,90)
+ct(240,71,258,56,281,44)
+ct(304,32,333,26,367,26)
+ct(410,26,449,35,483,54)
+ct(517,73,540,97,553,127)
+ct(565,156,572,206,572,276)
+lt(572,544)
+ct(572,585,567,611,558,622)
+ct(545,636,526,644,501,644)
+lt(477,644)
+ )cp
+chp[85]:=currentpicture;
+endchar;
+
+beginchar(86,722*FX#,662*FY#,15*FY#);
+"V";
+dr
+ah((709,662)
+lt(709,644)
+ct(685,639,668,631,656,621)
+ct(638,605,623,580,610,548)
+lt(379,-15)
+lt(361,-15)
+lt(113,555)
+ct(100,584,91,602,86,609)
+ct(78,619,68,627,56,633)
+ct(45,638,28,642,8,644)
+lt(8,662)
+lt(279,662)
+lt(279,644)
+ct(248,641,228,635,219,628)
+ct(210,620,206,611,206,599)
+ct(206,583,213,557,228,523)
+lt(396,135)
+lt(553,518)
+ct(568,556,576,582,576,597)
+ct(576,606,571,615,562,624)
+ct(552,632,536,638,514,642)
+ct(512,642,509,643,505,644)
+lt(505,662)
+lt(709,662)
+ )cp
+endchar;
+
+beginchar(87,943*FX#,662*FY#,15*FY#);
+"W";
+dr
+ah((936,662)
+lt(936,644)
+ct(918,644,904,640,894,634)
+ct(883,628,873,617,863,600)
+ct(856,588,846,561,832,518)
+lt(647,-15)
+lt(628,-15)
+lt(477,408)
+lt(327,-15)
+lt(310,-15)
+lt(113,534)
+ct(98,575,89,599,85,607)
+ct(78,619,70,628,58,635)
+ct(47,641,32,644,13,644)
+lt(13,662)
+lt(258,662)
+lt(258,644)
+lt(246,644)
+ct(229,644,216,640,207,632)
+ct(197,624,193,615,193,604)
+ct(193,592,200,565,214,525)
+lt(345,153)
+lt(455,469)
+lt(435,525)
+lt(419,569)
+ct(412,585,404,600,396,612)
+ct(392,618,387,624,381,628)
+ct(373,634,364,638,356,641)
+ct(350,643,340,644,327,644)
+lt(327,662)
+lt(585,662)
+lt(585,644)
+lt(567,644)
+ct(549,644,536,640,527,632)
+ct(519,624,515,613,515,600)
+ct(515,583,522,554,537,513)
+lt(664,153)
+lt(790,518)
+ct(804,558,811,586,811,602)
+ct(811,610,809,617,804,623)
+ct(799,630,793,634,786,637)
+ct(774,641,758,644,738,644)
+lt(738,662)
+lt(936,662)
+ )cp
+endchar;
+
+beginchar(88,722*FX#,662*FY#,0*FY#);
+"X";
+dr
+ah((408,366)
+lt(550,154)
+ct(589,96,618,59,637,43)
+ct(656,28,681,19,710,18)
+lt(710,0)
+lt(426,0)
+lt(426,18)
+ct(444,18,458,19,468,23)
+ct(475,26,480,31,485,37)
+ct(489,43,491,49,491,55)
+ct(491,62,489,70,487,78)
+ct(484,83,475,97,460,121)
+lt(348,291)
+lt(209,113)
+ct(194,94,186,81,183,75)
+ct(180,69,178,62,178,55)
+ct(178,45,183,36,191,29)
+ct(200,22,217,19,242,18)
+lt(242,0)
+lt(7,0)
+lt(7,18)
+ct(23,19,38,22,50,28)
+ct(70,36,89,48,107,62)
+ct(126,76,146,98,170,128)
+lt(326,325)
+lt(196,516)
+ct(160,568,130,602,105,618)
+ct(81,634,52,643,20,644)
+lt(20,662)
+lt(326,662)
+lt(326,644)
+ct(300,643,282,638,273,631)
+ct(263,623,258,615,258,606)
+ct(258,594,266,576,282,553)
+lt(383,401)
+lt(501,550)
+ct(515,568,523,580,526,586)
+ct(529,593,531,600,531,606)
+ct(531,613,529,619,525,625)
+ct(520,631,514,636,506,639)
+ct(499,642,483,643,460,644)
+lt(460,662)
+lt(695,662)
+lt(695,644)
+ct(676,642,661,639,649,635)
+ct(632,627,616,617,601,604)
+ct(586,592,566,568,539,534)
+lt(408,366)
+ )cp
+endchar;
+
+beginchar(89,722*FX#,662*FY#,0*FY#);
+"Y";
+dr
+ah((476,662)
+lt(707,662)
+lt(707,644)
+lt(694,644)
+ct(686,644,673,640,657,632)
+ct(641,625,626,614,613,600)
+ct(599,586,583,563,563,532)
+lt(404,280)
+lt(404,114)
+ct(404,73,408,48,417,38)
+ct(429,24,449,18,476,18)
+lt(498,18)
+lt(498,0)
+lt(216,0)
+lt(216,18)
+lt(240,18)
+ct(268,18,287,26,299,43)
+ct(306,53,310,77,310,114)
+lt(310,271)
+lt(128,548)
+ct(107,581,92,601,85,609)
+ct(77,618,61,627,37,639)
+ct(30,642,21,644,9,644)
+lt(9,662)
+lt(292,662)
+lt(292,644)
+lt(277,644)
+ct(262,644,248,640,235,633)
+ct(222,626,216,615,216,601)
+ct(216,589,226,567,246,537)
+lt(384,324)
+lt(514,528)
+ct(533,558,543,581,543,596)
+ct(543,605,541,613,536,621)
+ct(531,628,524,633,516,637)
+ct(507,642,494,644,476,644)
+lt(476,662)
+ )cp
+chp[89]:=currentpicture;
+endchar;
+
+beginchar(90,610*FX#,662*FY#,0*FY#);
+"Z";
+dr
+ah((575,662)
+lt(140,40)
+lt(411,40)
+ct(453,40,485,49,507,67)
+ct(529,85,549,122,566,178)
+lt(583,175)
+lt(551,0)
+lt(12,0)
+lt(12,18)
+lt(437,622)
+lt(225,622)
+ct(190,622,164,618,149,611)
+ct(133,603,121,592,113,577)
+ct(104,563,97,536,90,496)
+lt(71,496)
+lt(85,662)
+lt(575,662)
+ )cp
+chp[90]:=currentpicture;
+endchar;
+
+beginchar(91,333*FX#,677*FY#,198*FY#);
+"bracketleft";
+dr
+ah((296,-198)
+lt(82,-198)
+lt(82,677)
+lt(296,677)
+lt(296,638)
+lt(155,638)
+lt(155,-160)
+lt(296,-160)
+lt(296,-198)
+ )cp
+endchar;
+
+beginchar(148,277*FX#,694*FY#,13*FY#);
+"backslash";
+dr
+ah((40,694)
+lt(279,-13)
+lt(240,-13)
+lt(1,694)
+lt(40,694)
+ )cp
+endchar;
+
+beginchar(93,333*FX#,677*FY#,198*FY#);
+"bracketright";
+dr
+ah((36,677)
+lt(251,677)
+lt(251,-198)
+lt(36,-198)
+lt(36,-160)
+lt(178,-160)
+lt(178,638)
+lt(36,638)
+lt(36,677)
+ )cp
+endchar;
+
+beginchar(143,469*FX#,675*FY#,0*FY#);
+"asciicircum";
+dr
+ah((243,675)
+lt(450,325)
+lt(405,325)
+lt(234,611)
+lt(63,325)
+lt(18,325)
+lt(228,675)
+lt(243,675)
+ )cp
+endchar;
+
+beginchar(149,500*FX#,0*FY#,215*FY#);
+"underscore";
+dr
+ah((508,-215)
+lt(-8,-215)
+lt(-8,-174)
+lt(508,-174)
+lt(508,-215)
+ )cp
+endchar;
+
+beginchar(18,333*FX#,678*FY#,0*FY#);
+"grave";
+dr
+ah((57,678)
+lt(166,678)
+lt(218,510)
+lt(201,510)
+lt(57,678)
+ )cp
+chp[193]:=currentpicture;
+endchar;
+
+beginchar(97,443*FX#,460*FY#,9*FY#);
+"a";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+chp[97]:=currentpicture;
+endchar;
+
+beginchar(98,500*FX#,694*FY#,13*FY#);
+"b";
+dr
+ah((153,370)
+ct(196,430,243,460,293,460)
+ct(339,460,379,440,414,401)
+ct(448,362,465,308,465,240)
+ct(465,160,438,96,386,48)
+ct(340,7,290,-13,234,-13)
+ct(208,-13,182,-8,155,0)
+ct(128,9,101,24,73,42)
+lt(73,506)
+ct(73,557,72,588,69,600)
+ct(67,611,63,619,58,624)
+ct(52,628,46,630,38,630)
+ct(28,630,17,627,4,622)
+lt(-2,639)
+lt(131,694)
+lt(153,694)
+lt(153,370)
+ )cp
+dr
+ah((153,338)
+lt(153,71)
+ct(170,55,187,42,205,34)
+ct(223,26,241,21,259,21)
+ct(289,21,316,38,342,70)
+ct(368,103,380,150,380,212)
+ct(380,270,368,314,342,344)
+ct(316,375,287,391,255,391)
+ct(237,391,220,386,203,377)
+ct(190,371,173,358,153,338)
+ )cp
+endchar;
+
+beginchar(99,443*FX#,460*FY#,13*FY#);
+"c";
+dr
+ah((411,169)
+ct(399,111,375,65,340,33)
+ct(305,2,266,-13,223,-13)
+ct(172,-13,128,7,90,50)
+ct(53,92,34,150,34,223)
+ct(34,293,55,350,96,394)
+ct(138,438,188,460,247,460)
+ct(291,460,327,448,355,425)
+ct(384,402,398,378,398,353)
+ct(398,340,394,330,386,322)
+ct(378,315,367,311,353,311)
+ct(333,311,319,317,309,330)
+ct(304,336,300,349,298,369)
+ct(296,388,290,402,278,413)
+ct(266,422,251,427,231,427)
+ct(198,427,172,415,152,391)
+ct(126,359,113,317,113,265)
+ct(113,211,126,164,152,123)
+ct(178,82,214,62,258,62)
+ct(290,62,318,73,344,95)
+ct(362,109,379,136,396,176)
+lt(411,169)
+ )cp
+chp[99]:=currentpicture;
+endchar;
+
+beginchar(100,500*FX#,694*FY#,13*FY#);
+"d";
+dr
+ah((347,50)
+ct(325,27,304,11,283,1)
+ct(262,-8,239,-13,215,-13)
+ct(166,-13,124,6,87,47)
+ct(51,88,33,140,33,205)
+ct(33,269,53,327,93,381)
+ct(134,434,186,460,249,460)
+ct(288,460,321,447,347,423)
+lt(347,505)
+ct(347,556,345,588,343,600)
+ct(341,611,337,619,332,624)
+ct(326,628,320,630,312,630)
+ct(303,630,292,627,278,622)
+lt(272,639)
+lt(405,694)
+lt(427,694)
+lt(427,177)
+ct(427,124,428,92,431,81)
+ct(433,69,437,61,443,57)
+ct(448,52,454,50,461,50)
+ct(470,50,482,52,497,58)
+lt(502,41)
+lt(369,-13)
+lt(347,-13)
+lt(347,50)
+ )cp
+dr
+ah((347,84)
+lt(347,314)
+ct(345,337,339,357,329,375)
+ct(319,393,306,407,290,416)
+ct(274,426,258,430,243,430)
+ct(214,430,188,417,166,392)
+ct(136,358,122,308,122,243)
+ct(122,177,136,127,165,92)
+ct(194,57,226,40,261,40)
+ct(290,40,319,54,347,84)
+ )cp
+endchar;
+
+beginchar(101,443*FX#,460*FY#,13*FY#);
+"e";
+dr
+ah((106,278)
+ct(105,212,121,160,154,122)
+ct(186,84,225,65,269,65)
+ct(298,65,324,73,345,90)
+ct(367,106,385,133,400,172)
+lt(415,163)
+ct(408,118,388,77,355,41)
+ct(323,4,281,-13,232,-13)
+ct(178,-13,132,7,94,49)
+ct(56,90,37,147,37,217)
+ct(37,294,56,353,95,396)
+ct(135,439,184,460,243,460)
+ct(293,460,334,444,367,411)
+ct(399,378,415,334,415,278)
+lt(106,278)
+ )cp
+dr
+ah((106,307)
+lt(313,307)
+ct(311,335,308,355,303,367)
+ct(295,385,282,400,266,410)
+ct(250,421,233,426,216,426)
+ct(189,426,165,415,143,394)
+ct(122,373,110,344,106,307)
+ )cp
+chp[101]:=currentpicture;
+endchar;
+
+beginchar(102,333*FX#,693*FY#,0*FY#);
+"f";
+dr
+ah((206,412)
+lt(206,118)
+ct(206,76,210,49,219,39)
+ct(231,24,247,17,268,17)
+lt(308,17)
+lt(308,0)
+lt(41,0)
+lt(41,17)
+lt(61,17)
+ct(74,17,86,20,97,27)
+ct(107,33,115,42,119,53)
+ct(123,64,125,86,125,118)
+lt(125,412)
+lt(38,412)
+lt(38,447)
+lt(125,447)
+lt(125,476)
+ct(125,521,132,558,146,589)
+ct(161,620,183,645,212,664)
+ct(242,683,275,693,312,693)
+ct(346,693,377,682,406,660)
+ct(424,645,434,628,434,610)
+ct(434,601,430,591,421,583)
+ct(413,574,404,570,394,570)
+ct(387,570,379,572,370,578)
+ct(362,583,352,595,340,613)
+ct(328,630,317,642,307,648)
+ct(296,654,285,658,273,658)
+ct(258,658,245,654,235,646)
+ct(224,638,217,625,212,609)
+ct(208,592,206,549,206,479)
+lt(206,447)
+lt(321,447)
+lt(321,412)
+lt(206,412)
+ )cp
+endchar;
+
+beginchar(103,500*FX#,460*FY#,215*FY#);
+"g";
+dr
+ah((150,163)
+ct(123,176,102,195,87,218)
+ct(73,242,65,269,65,298)
+ct(65,342,82,380,115,412)
+ct(149,444,192,460,244,460)
+ct(286,460,323,449,354,429)
+lt(449,429)
+ct(463,429,471,428,474,427)
+ct(476,427,478,425,479,423)
+ct(480,420,481,415,481,408)
+ct(481,399,480,393,479,390)
+ct(478,388,476,387,474,386)
+ct(471,385,463,385,449,385)
+lt(391,385)
+ct(409,361,418,331,418,295)
+ct(418,253,402,218,371,188)
+ct(339,158,296,144,242,144)
+ct(220,144,197,147,174,153)
+ct(160,141,150,130,145,121)
+ct(140,112,138,104,138,97)
+ct(138,92,140,86,146,81)
+ct(151,76,162,72,177,70)
+ct(186,68,209,67,246,66)
+ct(312,64,356,62,376,60)
+ct(406,55,430,44,448,26)
+ct(467,8,476,-14,476,-41)
+ct(476,-77,458,-112,424,-144)
+ct(373,-191,307,-215,225,-215)
+ct(162,-215,109,-201,66,-173)
+ct(41,-156,29,-139,29,-122)
+ct(29,-114,31,-106,35,-99)
+ct(40,-87,51,-70,69,-48)
+ct(71,-45,87,-28,119,3)
+ct(102,13,90,23,83,31)
+ct(76,38,72,48,72,58)
+ct(72,69,77,82,86,98)
+ct(95,113,117,135,150,163)
+ )cp
+dr
+ah((235,437)
+ct(211,437,191,427,175,408)
+ct(159,388,150,359,150,319)
+ct(150,267,161,228,184,200)
+ct(200,178,222,167,248,167)
+ct(273,167,293,177,309,195)
+ct(325,214,333,243,333,283)
+ct(333,334,321,374,299,404)
+ct(282,426,261,437,235,437)
+ )cp
+dr
+ah((145,0)
+ct(130,-16,119,-32,111,-46)
+ct(103,-60,99,-73,99,-85)
+ct(99,-101,108,-114,127,-126)
+ct(159,-146,207,-157,269,-157)
+ct(327,-157,370,-146,398,-126)
+ct(426,-105,440,-83,440,-60)
+ct(440,-42,431,-30,415,-23)
+ct(398,-16,364,-12,314,-11)
+ct(241,-9,185,-5,145,0)
+ )cp
+endchar;
+
+beginchar(104,500*FX#,694*FY#,0*FY#);
+"h";
+dr
+ah((162,694)
+lt(162,367)
+ct(198,406,227,432,248,443)
+ct(269,454,290,460,312,460)
+ct(337,460,359,453,377,439)
+ct(395,425,409,403,417,373)
+ct(423,352,427,314,427,259)
+lt(427,101)
+ct(427,72,429,52,434,42)
+ct(437,35,442,28,450,24)
+ct(458,19,472,17,493,17)
+lt(493,0)
+lt(273,0)
+lt(273,17)
+lt(284,17)
+ct(305,17,319,20,327,27)
+ct(335,33,341,42,344,55)
+ct(345,59,346,75,346,101)
+lt(346,259)
+ct(346,308,343,340,338,355)
+ct(333,370,325,382,314,389)
+ct(303,397,290,401,274,401)
+ct(258,401,241,397,224,388)
+ct(207,380,186,363,162,337)
+lt(162,101)
+ct(162,70,164,51,167,43)
+ct(171,36,177,30,186,25)
+ct(196,20,212,17,234,17)
+lt(234,0)
+lt(13,0)
+lt(13,17)
+ct(32,17,48,20,60,26)
+ct(66,30,71,36,75,45)
+ct(79,54,81,73,81,101)
+lt(81,505)
+ct(81,556,80,588,77,600)
+ct(75,611,71,619,66,624)
+ct(61,628,54,630,46,630)
+ct(39,630,28,627,13,622)
+lt(6,639)
+lt(140,694)
+lt(162,694)
+ )cp
+endchar;
+
+beginchar(105,277*FX#,694*FY#,0*FY#);
+"i";
+dr
+ah((145,694)
+ct(158,694,170,689,179,679)
+ct(189,670,194,658,194,645)
+ct(194,631,189,619,179,609)
+ct(170,600,158,595,145,595)
+ct(131,595,119,600,109,609)
+ct(100,619,95,631,95,645)
+ct(95,658,100,670,109,679)
+ct(119,689,131,694,145,694)
+ )cp
+dr
+ah((185,460)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,35,201,28,209,24)
+ct(217,19,232,17,253,17)
+lt(253,0)
+lt(36,0)
+lt(36,17)
+ct(57,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(102,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,100,367)
+ct(97,378,94,385,89,389)
+ct(84,393,77,395,69,395)
+ct(59,395,48,392,36,388)
+lt(29,405)
+lt(164,460)
+lt(185,460)
+ )cp
+endchar;
+
+beginchar(106,277*FX#,694*FY#,215*FY#);
+"j";
+dr
+ah((144,694)
+ct(158,694,170,689,180,680)
+ct(189,670,194,658,194,644)
+ct(194,630,189,619,180,609)
+ct(170,599,158,594,144,594)
+ct(130,594,119,599,109,609)
+ct(99,619,94,630,94,644)
+ct(94,658,99,670,109,680)
+ct(119,689,130,694,144,694)
+ )cp
+dr
+ah((186,460)
+lt(186,10)
+ct(186,-66,170,-123,137,-160)
+ct(105,-197,62,-215,10,-215)
+ct(-18,-215,-40,-210,-55,-199)
+ct(-69,-188,-76,-177,-76,-166)
+ct(-76,-155,-72,-145,-64,-137)
+ct(-56,-129,-47,-125,-36,-125)
+ct(-27,-125,-18,-127,-10,-131)
+ct(-5,-133,5,-141,21,-156)
+ct(37,-170,50,-177,61,-177)
+ct(68,-177,76,-174,83,-168)
+ct(91,-162,97,-152,100,-137)
+ct(104,-123,105,-93,105,-45)
+lt(105,272)
+ct(105,321,103,353,101,367)
+ct(99,377,95,385,90,389)
+ct(85,393,79,395,70,395)
+ct(61,395,50,392,37,388)
+lt(30,405)
+lt(165,460)
+lt(186,460)
+ )cp
+endchar;
+
+beginchar(107,500*FX#,694*FY#,0*FY#);
+"k";
+dr
+ah((163,694)
+lt(163,249)
+lt(277,353)
+ct(301,375,315,389,319,395)
+ct(321,398,323,402,323,406)
+ct(323,413,320,418,315,423)
+ct(309,428,300,430,288,431)
+lt(288,447)
+lt(482,447)
+lt(482,431)
+ct(456,430,434,426,416,419)
+ct(398,411,379,398,357,379)
+lt(243,273)
+lt(357,128)
+ct(389,88,410,62,422,52)
+ct(437,36,451,26,463,22)
+ct(471,18,485,17,505,17)
+lt(505,0)
+lt(288,0)
+lt(288,17)
+ct(300,17,309,19,313,23)
+ct(318,26,320,31,320,37)
+ct(320,44,313,56,300,73)
+lt(163,249)
+lt(163,100)
+ct(163,71,165,52,169,43)
+ct(173,34,179,27,187,23)
+ct(194,20,210,17,235,17)
+lt(235,0)
+lt(8,0)
+lt(8,17)
+ct(30,17,47,19,59,25)
+ct(65,29,71,34,75,42)
+ct(79,52,82,71,82,98)
+lt(82,505)
+ct(82,557,81,588,79,600)
+ct(76,611,73,619,67,624)
+ct(62,628,55,630,47,630)
+ct(40,630,30,627,16,622)
+lt(8,639)
+lt(141,694)
+lt(163,694)
+ )cp
+endchar;
+
+beginchar(108,277*FX#,694*FY#,0*FY#);
+"l";
+dr
+ah((185,694)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,36,201,29,209,24)
+ct(218,19,234,17,257,17)
+lt(257,0)
+lt(38,0)
+lt(38,17)
+ct(58,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(101,54,104,73,104,101)
+lt(104,507)
+ct(104,557,102,588,100,600)
+ct(98,611,94,619,89,624)
+ct(84,628,78,630,70,630)
+ct(61,630,50,627,38,622)
+lt(29,639)
+lt(163,694)
+lt(185,694)
+ )cp
+endchar;
+
+beginchar(109,777*FX#,460*FY#,0*FY#);
+"m";
+dr
+ah((164,365)
+ct(196,397,215,416,221,421)
+ct(236,433,252,443,269,450)
+ct(285,457,302,460,319,460)
+ct(347,460,371,452,391,436)
+ct(411,419,425,396,432,365)
+ct(465,404,493,429,517,442)
+ct(540,454,563,460,588,460)
+ct(612,460,633,454,651,442)
+ct(670,429,684,409,695,382)
+ct(702,363,706,333,706,293)
+lt(706,101)
+ct(706,73,708,53,712,43)
+ct(715,36,721,30,730,25)
+ct(739,20,753,17,773,17)
+lt(773,0)
+lt(552,0)
+lt(552,17)
+lt(562,17)
+ct(580,17,595,20,606,28)
+ct(614,33,619,41,623,53)
+ct(624,59,625,75,625,101)
+lt(625,293)
+ct(625,329,620,355,611,370)
+ct(598,390,578,401,550,401)
+ct(533,401,516,397,498,388)
+ct(481,380,460,364,435,340)
+lt(434,335)
+lt(435,314)
+lt(435,101)
+ct(435,70,437,51,440,43)
+ct(444,36,450,30,459,25)
+ct(469,20,485,17,508,17)
+lt(508,0)
+lt(282,0)
+lt(282,17)
+ct(306,17,323,20,333,26)
+ct(342,32,348,41,352,52)
+ct(353,58,354,74,354,101)
+lt(354,293)
+ct(354,329,348,356,338,372)
+ct(324,392,304,403,278,403)
+ct(260,403,243,398,226,389)
+ct(199,374,178,358,164,340)
+lt(164,101)
+ct(164,71,166,52,170,43)
+ct(174,35,180,28,188,24)
+ct(196,19,212,17,236,17)
+lt(236,0)
+lt(15,0)
+lt(15,17)
+ct(36,17,50,19,58,24)
+ct(66,28,72,35,77,45)
+ct(81,54,83,73,83,101)
+lt(83,271)
+ct(83,320,81,352,79,367)
+ct(76,377,73,385,68,389)
+ct(63,393,56,395,48,395)
+ct(38,395,27,392,15,388)
+lt(8,405)
+lt(143,460)
+lt(164,460)
+lt(164,365)
+ )cp
+endchar;
+
+beginchar(110,500*FX#,460*FY#,0*FY#);
+"n";
+dr
+ah((161,365)
+ct(213,428,263,460,311,460)
+ct(335,460,356,454,374,442)
+ct(392,429,406,409,416,381)
+ct(423,361,427,331,427,291)
+lt(427,101)
+ct(427,72,429,53,434,43)
+ct(437,35,443,28,451,24)
+ct(459,19,474,17,495,17)
+lt(495,0)
+lt(274,0)
+lt(274,17)
+lt(283,17)
+ct(304,17,319,20,327,27)
+ct(335,33,341,42,344,55)
+ct(345,59,346,75,346,101)
+lt(346,284)
+ct(346,324,341,354,330,372)
+ct(320,391,302,400,277,400)
+ct(238,400,199,378,161,336)
+lt(161,101)
+ct(161,70,162,51,166,44)
+ct(171,35,177,28,185,24)
+ct(193,19,209,17,234,17)
+lt(234,0)
+lt(13,0)
+lt(13,17)
+lt(22,17)
+ct(45,17,61,23,69,34)
+ct(77,46,81,68,81,101)
+lt(81,267)
+ct(81,320,79,353,77,365)
+ct(74,376,71,384,66,389)
+ct(61,393,54,395,45,395)
+ct(36,395,25,392,13,388)
+lt(5,405)
+lt(140,460)
+lt(161,460)
+lt(161,365)
+ )cp
+chp[110]:=currentpicture;
+endchar;
+
+beginchar(111,500*FX#,460*FY#,13*FY#);
+"o";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+chp[111]:=currentpicture;
+endchar;
+
+beginchar(112,500*FX#,460*FY#,213*FY#);
+"p";
+dr
+ah((0,402)
+lt(136,458)
+lt(155,458)
+lt(155,354)
+ct(178,393,201,420,224,436)
+ct(248,452,272,460,298,460)
+ct(342,460,380,442,410,407)
+ct(446,364,465,308,465,239)
+ct(465,162,443,98,399,48)
+ct(362,7,316,-13,261,-13)
+ct(237,-13,216,-9,199,-3)
+ct(185,1,171,10,155,25)
+lt(155,-110)
+ct(155,-140,157,-160,160,-168)
+ct(164,-177,171,-183,180,-188)
+ct(189,-193,206,-195,230,-195)
+lt(230,-213)
+lt(-3,-213)
+lt(-3,-195)
+lt(8,-195)
+ct(26,-195,41,-192,54,-185)
+ct(60,-181,65,-176,69,-168)
+ct(72,-160,74,-139,74,-107)
+lt(74,315)
+ct(74,344,72,362,70,370)
+ct(67,378,63,384,57,388)
+ct(52,392,44,394,34,394)
+ct(26,394,16,391,4,387)
+lt(0,402)
+ )cp
+dr
+ah((155,325)
+lt(155,158)
+ct(155,122,156,98,159,86)
+ct(164,68,175,51,193,37)
+ct(210,22,233,15,260,15)
+ct(292,15,319,27,339,53)
+ct(365,86,378,133,378,193)
+ct(378,261,363,314,333,351)
+ct(312,376,287,389,259,389)
+ct(243,389,228,385,213,377)
+ct(201,371,181,354,155,325)
+ )cp
+endchar;
+
+beginchar(113,500*FX#,460*FY#,213*FY#);
+"q";
+dr
+ah((427,460)
+lt(427,-114)
+ct(427,-143,429,-161,433,-169)
+ct(437,-178,443,-184,451,-188)
+ct(459,-193,475,-195,500,-195)
+lt(500,-213)
+lt(274,-213)
+lt(274,-195)
+lt(283,-195)
+ct(301,-195,315,-192,325,-187)
+ct(331,-184,336,-177,340,-168)
+ct(344,-159,346,-141,346,-114)
+lt(346,77)
+ct(317,42,291,18,269,5)
+ct(246,-7,223,-13,200,-13)
+ct(156,-13,118,6,84,45)
+ct(50,84,33,137,33,203)
+ct(33,279,55,341,100,388)
+ct(145,436,199,460,263,460)
+ct(281,460,298,457,314,452)
+ct(330,447,344,439,356,429)
+ct(374,437,392,448,410,460)
+lt(427,460)
+ )cp
+dr
+ah((346,108)
+lt(346,318)
+ct(346,342,343,361,337,375)
+ct(330,389,319,401,303,411)
+ct(286,421,268,426,248,426)
+ct(211,426,180,410,154,379)
+ct(128,348,115,302,115,239)
+ct(115,179,128,133,155,102)
+ct(181,70,213,55,250,55)
+ct(270,55,287,59,302,67)
+ct(317,75,332,89,346,108)
+ )cp
+endchar;
+
+beginchar(114,333*FX#,460*FY#,0*FY#);
+"r";
+dr
+ah((162,460)
+lt(162,359)
+ct(199,426,237,460,277,460)
+ct(295,460,310,454,321,444)
+ct(333,433,339,420,339,406)
+ct(339,393,335,382,326,374)
+ct(318,365,308,360,296,360)
+ct(284,360,272,366,258,377)
+ct(243,388,233,394,226,394)
+ct(220,394,213,390,207,384)
+ct(192,370,177,348,162,318)
+lt(162,104)
+ct(162,79,165,60,171,48)
+ct(175,39,183,32,193,26)
+ct(204,20,220,17,240,17)
+lt(240,0)
+lt(11,0)
+lt(11,17)
+ct(33,17,50,20,62,28)
+ct(70,33,75,41,79,53)
+ct(80,58,81,74,81,100)
+lt(81,273)
+ct(81,326,80,357,78,366)
+ct(76,376,72,384,66,388)
+ct(60,393,53,395,45,395)
+ct(35,395,23,392,11,388)
+lt(6,405)
+lt(141,460)
+lt(162,460)
+ )cp
+endchar;
+
+beginchar(115,389*FX#,460*FY#,13*FY#);
+"s";
+dr
+ah((320,460)
+lt(320,308)
+lt(304,308)
+ct(291,355,275,388,256,405)
+ct(237,423,212,431,182,431)
+ct(159,431,141,425,127,413)
+ct(113,401,106,388,106,373)
+ct(106,355,111,339,122,326)
+ct(132,312,152,298,183,284)
+lt(254,249)
+ct(320,217,354,174,354,122)
+ct(354,81,338,48,307,23)
+ct(277,-1,242,-13,204,-13)
+ct(176,-13,145,-8,110,0)
+ct(99,3,90,5,84,5)
+ct(76,5,70,1,66,-6)
+lt(50,-6)
+lt(50,152)
+lt(66,152)
+ct(76,107,93,72,119,49)
+ct(144,26,173,15,205,15)
+ct(228,15,246,21,260,34)
+ct(274,48,281,63,281,82)
+ct(281,104,273,123,258,139)
+ct(242,154,210,173,163,197)
+ct(116,220,85,241,70,260)
+ct(55,278,48,302,48,331)
+ct(48,367,61,398,86,423)
+ct(111,448,144,460,184,460)
+ct(201,460,222,456,248,449)
+ct(264,443,275,441,281,441)
+ct(286,441,291,443,293,445)
+ct(296,447,300,452,304,460)
+lt(320,460)
+ )cp
+chp[115]:=currentpicture;
+endchar;
+
+beginchar(116,277*FX#,594*FY#,7*FY#);
+"t";
+dr
+ah((161,594)
+lt(161,447)
+lt(265,447)
+lt(265,413)
+lt(161,413)
+lt(161,123)
+ct(161,94,165,74,173,64)
+ct(181,54,192,49,205,49)
+ct(216,49,226,52,236,59)
+ct(246,65,254,75,260,88)
+lt(279,88)
+ct(267,56,251,32,230,16)
+ct(210,0,188,-7,166,-7)
+ct(151,-7,136,-3,122,5)
+ct(108,13,97,25,90,40)
+ct(83,56,80,80,80,112)
+lt(80,413)
+lt(9,413)
+lt(9,429)
+ct(27,436,45,448,64,465)
+ct(83,482,100,502,114,526)
+ct(121,538,131,560,145,594)
+lt(161,594)
+ )cp
+endchar;
+
+beginchar(117,500*FX#,447*FY#,13*FY#);
+"u";
+dr
+ah((423,447)
+lt(423,176)
+ct(423,124,424,92,427,81)
+ct(429,69,433,61,438,57)
+ct(444,52,450,50,457,50)
+ct(467,50,478,52,491,58)
+lt(498,41)
+lt(364,-13)
+lt(342,-13)
+lt(342,81)
+ct(304,39,275,13,254,2)
+ct(234,-8,213,-13,190,-13)
+ct(165,-13,144,-6,125,8)
+ct(107,22,94,41,87,63)
+ct(80,86,76,118,76,160)
+lt(76,360)
+ct(76,381,74,396,69,404)
+ct(65,412,58,418,49,423)
+ct(40,427,24,429,0,429)
+lt(0,447)
+lt(157,447)
+lt(157,147)
+ct(157,106,164,78,179,65)
+ct(193,52,211,46,231,46)
+ct(245,46,261,50,279,59)
+ct(297,68,318,85,342,109)
+lt(342,363)
+ct(342,388,338,405,328,414)
+ct(319,423,300,428,270,429)
+lt(270,447)
+lt(423,447)
+ )cp
+chp[117]:=currentpicture;
+endchar;
+
+beginchar(118,500*FX#,447*FY#,13*FY#);
+"v";
+dr
+ah((8,447)
+lt(218,447)
+lt(218,429)
+lt(205,429)
+ct(192,429,182,426,176,419)
+ct(169,413,166,405,166,395)
+ct(166,383,169,369,176,354)
+lt(280,107)
+lt(384,363)
+ct(391,381,395,395,395,405)
+ct(395,409,394,413,392,416)
+ct(388,421,383,424,378,426)
+ct(372,428,361,429,344,429)
+lt(344,447)
+lt(490,447)
+lt(490,429)
+ct(473,427,461,424,455,418)
+ct(443,408,433,392,424,370)
+lt(266,-13)
+lt(246,-13)
+lt(86,363)
+ct(79,381,72,393,65,401)
+ct(59,409,51,415,41,420)
+ct(35,423,24,426,8,429)
+lt(8,447)
+ )cp
+endchar;
+
+beginchar(119,722*FX#,447*FY#,13*FY#);
+"w";
+dr
+ah((6,447)
+lt(193,447)
+lt(193,429)
+ct(176,427,165,424,159,419)
+ct(154,415,151,408,151,398)
+ct(151,388,154,376,160,362)
+lt(255,104)
+lt(352,314)
+lt(326,380)
+ct(318,399,307,412,295,420)
+ct(288,424,275,427,255,429)
+lt(255,447)
+lt(468,447)
+lt(468,429)
+ct(444,427,428,423,418,416)
+ct(412,410,409,402,409,391)
+ct(409,384,410,377,413,371)
+lt(514,114)
+lt(608,362)
+ct(614,379,618,393,618,404)
+ct(618,410,615,416,609,420)
+ct(602,425,590,428,571,429)
+lt(571,447)
+lt(712,447)
+lt(712,429)
+ct(684,424,663,405,650,371)
+lt(500,-13)
+lt(480,-13)
+lt(369,271)
+lt(238,-13)
+lt(220,-13)
+lt(77,362)
+ct(67,386,58,402,49,410)
+ct(40,418,25,424,6,429)
+lt(6,447)
+ )cp
+endchar;
+
+beginchar(120,500*FX#,447*FY#,0*FY#);
+"x";
+dr
+ah((13,447)
+lt(223,447)
+lt(223,429)
+ct(210,429,200,426,195,422)
+ct(190,417,187,411,187,404)
+ct(187,396,192,384,204,368)
+ct(207,362,212,354,220,343)
+lt(252,292)
+lt(289,343)
+ct(312,375,324,396,324,404)
+ct(324,411,321,417,315,422)
+ct(310,426,301,429,289,429)
+lt(289,447)
+lt(440,447)
+lt(440,429)
+ct(424,427,410,423,398,416)
+ct(382,404,361,380,333,343)
+lt(272,262)
+lt(383,102)
+ct(411,62,430,38,442,31)
+ct(454,23,469,18,487,17)
+lt(487,0)
+lt(276,0)
+lt(276,17)
+ct(290,17,302,20,311,27)
+ct(317,31,320,37,320,45)
+ct(320,52,309,71,289,102)
+lt(223,197)
+lt(151,102)
+ct(129,72,118,54,118,49)
+ct(118,41,122,34,129,28)
+ct(136,21,147,18,162,17)
+lt(162,0)
+lt(16,0)
+lt(16,17)
+ct(28,19,38,23,47,29)
+ct(59,38,79,62,109,102)
+lt(203,226)
+lt(118,349)
+ct(94,384,75,406,62,415)
+ct(49,424,33,429,13,429)
+lt(13,447)
+ )cp
+endchar;
+
+beginchar(121,500*FX#,447*FY#,215*FY#);
+"y";
+dr
+ah((5,447)
+lt(214,447)
+lt(214,429)
+lt(204,429)
+ct(189,429,178,426,171,419)
+ct(163,413,160,405,160,395)
+ct(160,382,165,365,176,343)
+lt(285,117)
+lt(385,364)
+ct(390,377,393,390,393,404)
+ct(393,410,392,414,390,417)
+ct(387,421,383,423,377,426)
+ct(372,428,362,429,348,429)
+lt(348,447)
+lt(494,447)
+lt(494,429)
+ct(482,427,472,425,466,421)
+ct(459,417,452,410,444,399)
+ct(441,394,436,381,428,361)
+lt(246,-84)
+ct(228,-127,205,-160,177,-182)
+ct(148,-204,121,-215,94,-215)
+ct(75,-215,59,-210,47,-199)
+ct(34,-188,28,-175,28,-161)
+ct(28,-147,33,-136,42,-128)
+ct(51,-119,63,-115,79,-115)
+ct(89,-115,104,-118,123,-126)
+ct(135,-130,143,-133,147,-133)
+ct(157,-133,167,-128,179,-118)
+ct(190,-108,202,-89,214,-60)
+lt(246,17)
+lt(85,354)
+ct(80,364,72,377,62,392)
+ct(53,403,46,411,41,415)
+ct(33,420,21,425,5,429)
+lt(5,447)
+ )cp
+chp[121]:=currentpicture;
+endchar;
+
+beginchar(122,443*FX#,447*FY#,0*FY#);
+"z";
+dr
+ah((419,137)
+lt(414,0)
+lt(20,0)
+lt(20,17)
+lt(316,413)
+lt(170,413)
+ct(138,413,118,411,108,406)
+ct(98,402,90,395,84,383)
+ct(75,367,70,347,69,323)
+lt(49,323)
+lt(52,447)
+lt(427,447)
+lt(427,429)
+lt(127,32)
+lt(291,32)
+ct(325,32,348,35,360,41)
+ct(372,46,382,56,390,71)
+ct(394,81,399,103,403,137)
+lt(419,137)
+ )cp
+chp[122]:=currentpicture;
+endchar;
+
+beginchar(128,479*FX#,694*FY#,215*FY#);
+"braceleft";
+dr
+ah((410,-198)
+lt(410,-215)
+ct(356,-208,312,-186,278,-149)
+ct(244,-113,227,-72,227,-27)
+ct(227,-4,230,22,238,53)
+ct(245,85,249,109,249,126)
+ct(249,149,239,171,219,192)
+ct(200,212,173,224,138,229)
+lt(138,249)
+ct(173,254,200,266,219,286)
+ct(239,306,249,328,249,352)
+ct(249,369,245,393,238,424)
+ct(230,455,227,483,227,506)
+ct(227,551,244,591,278,628)
+ct(312,665,356,687,410,694)
+lt(410,677)
+ct(372,668,344,653,326,632)
+ct(309,611,300,589,300,564)
+ct(300,545,303,519,311,488)
+ct(318,457,322,430,322,408)
+ct(322,375,310,343,286,312)
+ct(262,281,226,257,178,240)
+ct(225,223,260,199,285,167)
+ct(309,135,322,103,322,70)
+ct(322,48,318,21,311,-9)
+ct(303,-40,300,-66,300,-85)
+ct(300,-110,309,-132,326,-153)
+ct(344,-174,372,-189,410,-198)
+ )cp
+endchar;
+
+beginchar(129,200*FX#,694*FY#,215*FY#);
+"bar";
+dr
+ah((119,694)
+lt(119,-215)
+lt(78,-215)
+lt(78,694)
+lt(119,694)
+ )cp
+endchar;
+
+beginchar(130,479*FX#,694*FY#,215*FY#);
+"braceright";
+dr
+ah((86,677)
+lt(86,694)
+ct(140,687,184,665,218,628)
+ct(253,592,270,551,270,506)
+ct(270,482,266,455,258,424)
+ct(251,393,247,369,247,352)
+ct(247,329,257,307,277,286)
+ct(296,266,324,254,358,249)
+lt(358,229)
+ct(324,224,296,212,277,192)
+ct(257,171,247,149,247,126)
+ct(247,109,251,85,258,53)
+ct(266,22,270,-4,270,-27)
+ct(270,-72,253,-112,218,-149)
+ct(184,-186,140,-208,86,-215)
+lt(86,-198)
+ct(124,-189,152,-174,170,-153)
+ct(187,-133,196,-110,196,-85)
+ct(196,-66,193,-40,185,-9)
+ct(178,21,174,48,174,70)
+ct(174,103,186,135,210,166)
+ct(234,197,270,221,318,238)
+ct(271,255,236,279,211,311)
+ct(186,343,174,375,174,408)
+ct(174,430,178,457,185,488)
+ct(193,519,196,545,196,564)
+ct(196,589,187,611,170,632)
+ct(152,653,124,668,86,677)
+ )cp
+endchar;
+
+beginchar(141,541*FX#,331*FY#,0*FY#);
+"asciitilde";
+dr
+ah((520,329)
+lt(542,329)
+ct(541,287,529,254,506,230)
+ct(483,206,455,194,422,194)
+ct(407,194,391,196,374,201)
+ct(357,206,312,224,240,253)
+ct(190,273,154,284,133,284)
+ct(111,284,91,277,76,263)
+ct(60,249,49,226,42,195)
+lt(21,195)
+ct(23,239,35,272,57,296)
+ct(79,319,105,331,135,331)
+ct(149,331,164,328,179,324)
+ct(213,314,258,297,313,274)
+ct(368,250,407,238,429,238)
+ct(454,238,474,246,491,262)
+ct(507,277,517,300,520,329)
+ )cp
+endchar;
+
+beginchar(142,350*FX#,453*FY#,0*FY#);
+"bullet";
+dr
+ah((177,453)
+ct(211,453,239,441,263,417)
+ct(287,393,299,364,299,330)
+ct(299,296,287,267,263,243)
+ct(239,219,211,208,177,208)
+ct(143,208,114,219,90,243)
+ct(66,267,54,296,54,330)
+ct(54,364,66,393,90,417)
+ct(114,441,143,453,177,453)
+ )cp
+endchar;
+
+beginchar(159,1*FX#,0*FY#,0*FY#);
+"fraction";
+endchar;
+
+beginchar(12,1*FX#,0*FY#,0*FY#);
+"fi";
+endchar;
+
+beginchar(13,1*FX#,0*FY#,0*FY#);
+"fl";
+endchar;
+
+beginchar(150,1*FX#,0*FY#,0*FY#);
+"Lslash";
+endchar;
+
+beginchar(151,1*FX#,0*FY#,0*FY#);
+"lslash";
+endchar;
+
+beginchar(208,722*FX#,662*FY#,0*FY#);
+"Eth";
+dr
+ah((17,0)
+lt(17,18)
+lt(41,18)
+ct(69,18,89,27,102,45)
+ct(108,55,112,79,112,117)
+lt(112,331)
+lt(17,331)
+lt(17,367)
+lt(112,367)
+lt(112,544)
+ct(112,585,107,611,98,622)
+ct(85,636,66,644,41,644)
+lt(17,644)
+lt(17,662)
+lt(286,662)
+ct(389,662,465,650,514,627)
+ct(563,603,603,566,635,515)
+ct(667,464,683,404,683,335)
+ct(683,242,653,162,593,97)
+ct(534,32,440,0,312,0)
+lt(17,0)
+ )cp
+dr
+ah((206,48)
+ct(247,39,282,35,310,35)
+ct(385,35,448,61,498,114)
+ct(547,167,572,239,572,330)
+ct(572,422,547,494,498,546)
+ct(448,599,384,625,306,625)
+ct(276,625,243,620,206,611)
+lt(206,367)
+lt(398,367)
+lt(398,331)
+lt(206,331)
+lt(206,48)
+ )cp
+endchar;
+
+beginchar(240,500*FX#,694*FY#,13*FY#);
+"eth";
+dr
+ah((229,570)
+lt(108,504)
+lt(93,531)
+lt(207,596)
+ct(186,618,169,633,158,642)
+ct(148,651,133,661,115,673)
+lt(128,694)
+ct(167,674,207,649,249,618)
+lt(371,686)
+lt(387,659)
+lt(275,596)
+ct(337,542,384,483,416,418)
+ct(447,354,463,291,463,231)
+ct(463,186,454,144,435,106)
+ct(416,68,390,39,356,18)
+ct(322,-3,284,-13,243,-13)
+ct(185,-13,135,8,94,51)
+ct(53,94,33,149,33,215)
+ct(33,283,55,343,100,393)
+ct(138,435,184,456,238,456)
+ct(254,456,268,454,281,450)
+ct(291,446,304,439,320,427)
+ct(294,481,263,528,229,570)
+ )cp
+dr
+ah((233,426)
+ct(202,426,176,413,155,387)
+ct(134,360,123,316,123,252)
+ct(123,208,130,167,143,130)
+ct(156,93,174,65,196,47)
+ct(219,29,242,20,267,20)
+ct(296,20,321,33,342,59)
+ct(362,84,373,126,373,184)
+ct(373,257,360,316,334,360)
+ct(308,404,275,426,233,426)
+ )cp
+endchar;
+
+beginchar(222,556*FX#,662*FY#,0*FY#);
+"Thorn";
+dr
+ah((205,511)
+lt(241,511)
+ct(289,511,326,509,350,505)
+ct(385,499,414,489,438,474)
+ct(461,459,480,439,495,415)
+ct(510,390,517,362,517,332)
+ct(517,306,512,283,503,262)
+ct(493,241,481,222,465,207)
+ct(449,192,431,180,411,170)
+ct(390,161,364,155,332,150)
+ct(320,148,289,148,239,148)
+lt(205,148)
+lt(205,118)
+ct(205,76,210,49,221,36)
+ct(233,24,252,18,279,18)
+lt(299,18)
+lt(299,0)
+lt(17,0)
+lt(17,18)
+lt(36,18)
+ct(66,18,87,27,101,45)
+ct(107,54,110,78,110,117)
+lt(110,541)
+ct(110,578,109,600,105,609)
+ct(101,618,93,626,81,633)
+ct(69,640,54,644,37,644)
+lt(17,644)
+lt(17,662)
+lt(299,662)
+lt(299,644)
+lt(280,644)
+ct(265,644,250,640,234,632)
+ct(224,628,217,620,212,608)
+ct(207,597,205,575,205,543)
+lt(205,511)
+ )cp
+dr
+ah((205,473)
+lt(205,183)
+lt(226,183)
+ct(266,183,297,187,319,196)
+ct(348,209,370,226,384,250)
+ct(398,273,405,299,405,330)
+ct(405,354,400,377,390,397)
+ct(380,418,366,434,350,446)
+ct(333,457,315,465,295,469)
+ct(281,471,259,473,228,473)
+lt(205,473)
+ )cp
+endchar;
+
+beginchar(254,500*FX#,694*FY#,213*FY#);
+"thorn";
+dr
+ah((0,638)
+lt(136,694)
+lt(155,694)
+lt(155,354)
+ct(178,393,201,420,224,436)
+ct(248,452,272,460,298,460)
+ct(342,460,380,442,410,407)
+ct(446,364,465,308,465,239)
+ct(465,162,443,98,399,48)
+ct(362,7,316,-13,261,-13)
+ct(237,-13,216,-9,199,-3)
+ct(185,1,171,10,155,25)
+lt(155,-110)
+ct(155,-140,157,-159,160,-167)
+ct(164,-176,171,-182,180,-187)
+ct(189,-192,206,-194,230,-194)
+lt(230,-213)
+lt(-3,-213)
+lt(-3,-194)
+lt(8,-195)
+ct(26,-195,41,-191,54,-185)
+ct(60,-181,65,-175,69,-167)
+ct(72,-159,74,-139,74,-107)
+lt(74,551)
+ct(74,580,72,598,70,606)
+ct(67,614,63,620,57,624)
+ct(52,628,44,630,34,630)
+ct(26,630,16,627,4,623)
+lt(0,638)
+ )cp
+dr
+ah((155,325)
+lt(155,158)
+ct(155,122,156,98,159,86)
+ct(164,68,175,51,193,37)
+ct(210,22,233,15,260,15)
+ct(292,15,319,27,339,53)
+ct(365,86,378,133,378,193)
+ct(378,261,363,314,333,351)
+ct(312,376,287,389,259,389)
+ct(243,389,228,385,213,377)
+ct(201,371,181,354,155,325)
+ )cp
+endchar;
+
+beginchar(181,576*FX#,447*FY#,215*FY#);
+"mu";
+dr
+ah((95,447)
+lt(175,447)
+lt(175,187)
+ct(175,139,178,107,184,90)
+ct(188,77,196,66,208,58)
+ct(219,50,231,46,245,46)
+ct(283,46,321,67,360,111)
+lt(360,447)
+lt(440,447)
+lt(440,127)
+ct(440,95,441,73,444,63)
+ct(447,56,451,50,456,45)
+ct(462,41,467,39,474,39)
+ct(482,39,489,42,495,49)
+ct(503,59,509,75,513,99)
+lt(534,99)
+ct(531,60,520,31,503,13)
+ct(485,-4,463,-13,437,-13)
+ct(411,-13,392,-4,378,14)
+ct(368,28,362,49,360,79)
+ct(332,45,305,22,281,7)
+ct(256,-6,232,-13,207,-13)
+ct(189,-13,174,-9,162,-3)
+ct(152,1,142,11,131,27)
+ct(130,17,130,9,130,5)
+ct(130,-20,135,-59,147,-111)
+ct(151,-131,153,-148,153,-162)
+ct(153,-177,149,-190,140,-200)
+ct(131,-210,120,-215,107,-215)
+ct(95,-215,85,-211,77,-201)
+ct(69,-192,65,-179,65,-162)
+ct(65,-147,69,-120,79,-82)
+ct(85,-55,89,-38,90,-31)
+ct(94,2,96,31,96,56)
+ct(96,57,95,69,95,92)
+lt(95,447)
+ )cp
+endchar;
+
+beginchar(177,548*FX#,595*FY#,0*FY#);
+"plusminus";
+dr
+ah((11,68)
+lt(11,108)
+lt(254,108)
+lt(254,312)
+lt(11,312)
+lt(11,352)
+lt(254,352)
+lt(254,595)
+lt(293,595)
+lt(293,352)
+lt(537,352)
+lt(537,312)
+lt(293,312)
+lt(293,108)
+lt(538,108)
+lt(537,68)
+lt(11,68)
+ )cp
+endchar;
+
+beginchar(189,750*FX#,675*FY#,26*FY#);
+"onehalf";
+dr
+ah((65,633)
+lt(165,675)
+lt(182,675)
+lt(182,386)
+ct(182,366,183,354,185,350)
+ct(186,347,189,345,193,343)
+ct(198,340,211,339,231,339)
+lt(231,324)
+lt(73,324)
+lt(73,339)
+ct(93,339,106,340,112,343)
+ct(116,344,118,347,120,351)
+ct(122,354,123,366,123,386)
+lt(123,569)
+ct(123,592,122,607,120,615)
+ct(119,620,117,624,115,626)
+ct(113,628,109,629,105,629)
+ct(99,629,88,625,73,619)
+lt(65,633)
+ )cp
+dr
+ah((619,675)
+lt(162,-26)
+lt(119,-26)
+lt(575,675)
+lt(619,675)
+ )cp
+dr
+ah((729,55)
+lt(699,-19)
+lt(458,-19)
+lt(458,-4)
+ct(538,57,592,107,618,147)
+ct(634,171,643,195,643,217)
+ct(643,237,636,254,622,267)
+ct(609,281,592,288,571,288)
+ct(553,288,536,283,522,273)
+ct(508,264,498,249,491,230)
+lt(469,230)
+ct(473,262,486,286,507,305)
+ct(527,323,554,332,587,332)
+ct(621,332,649,322,671,303)
+ct(693,284,704,263,704,240)
+ct(704,218,696,195,680,171)
+ct(656,133,608,85,536,27)
+lt(627,27)
+ct(655,27,674,29,683,33)
+ct(693,37,701,44,707,55)
+lt(729,55)
+ )cp
+endchar;
+
+beginchar(127,333*FX#,652*FY#,0*FY#);
+"dieresis";
+dr
+ah((252,652)
+ct(267,652,280,647,290,637)
+ct(300,626,305,614,305,599)
+ct(305,584,300,572,290,562)
+ct(280,552,267,546,252,546)
+ct(238,546,225,552,215,562)
+ct(204,572,199,584,199,599)
+ct(199,614,204,626,215,637)
+ct(225,647,238,652,252,652)
+ )cp
+dr
+ah((80,652)
+ct(95,652,108,647,118,637)
+ct(128,626,133,614,133,599)
+ct(133,584,128,572,118,562)
+ct(107,552,95,546,81,546)
+ct(66,546,53,552,43,562)
+ct(33,572,27,584,27,599)
+ct(27,614,32,626,43,637)
+ct(53,647,65,652,80,652)
+ )cp
+chp[200]:=currentpicture;
+endchar;
+
+beginchar(39,333*FX#,677*FY#,0*FY#);
+"quoteright";
+dr
+ah((116,424)
+lt(116,447)
+ct(149,467,172,485,184,502)
+ct(192,514,197,529,197,547)
+ct(197,557,195,564,191,569)
+ct(187,574,183,577,179,577)
+ct(175,577,170,575,165,573)
+ct(156,570,149,569,144,569)
+ct(131,569,119,574,109,583)
+ct(99,593,94,605,94,620)
+ct(94,636,99,649,109,658)
+ct(122,670,138,677,158,677)
+ct(180,677,199,668,217,649)
+ct(234,631,243,608,243,581)
+ct(243,542,228,507,199,476)
+ct(179,454,152,437,116,424)
+ )cp
+endchar;
+
+beginchar(183,1*FX#,0*FY#,0*FY#);
+"periodcentered";
+endchar;
+
+beginchar(126,333*FX#,676*FY#,0*FY#);
+"tilde";
+dr
+ah((121,676)
+lt(211,676)
+lt(304,514)
+lt(289,514)
+lt(155,618)
+lt(43,514)
+lt(29,514)
+lt(121,676)
+ )cp
+chp[196]:=currentpicture;
+endchar;
+
+beginchar(94,333*FX#,662*FY#,0*FY#);
+"circumflex";
+dr
+ah((26,535)
+lt(10,535)
+ct(12,580,21,612,38,632)
+ct(55,652,77,662,102,662)
+ct(115,662,127,659,139,655)
+ct(153,650,174,638,201,620)
+ct(228,603,248,594,261,594)
+ct(271,594,280,598,288,607)
+ct(296,616,303,634,307,662)
+lt(322,662)
+ct(323,631,319,607,310,590)
+ct(302,572,290,558,275,548)
+ct(260,538,245,533,229,533)
+ct(203,533,172,546,134,572)
+ct(113,586,99,595,92,598)
+ct(85,601,78,602,71,602)
+ct(57,602,47,596,40,584)
+ct(36,578,31,562,26,535)
+ )cp
+chp[195]:=currentpicture;
+endchar;
+
+beginchar(123,500*FX#,256*FY#,0*FY#);
+"endash";
+dr
+ah((508,221)
+lt(-8,221)
+lt(-8,256)
+lt(508,256)
+lt(508,221)
+ )cp
+endchar;
+
+beginchar(19,333*FX#,678*FY#,0*FY#);
+"acute";
+dr
+ah((275,678)
+lt(131,510)
+lt(115,510)
+lt(166,678)
+lt(275,678)
+ )cp
+chp[194]:=currentpicture;
+endchar;
+
+beginchar(22,1*FX#,0*FY#,0*FY#);
+"macron";
+endchar;
+
+beginchar(96,333*FX#,677*FY#,0*FY#);
+"quoteleft";
+dr
+ah((216,677)
+lt(216,656)
+ct(182,635,160,616,148,600)
+ct(139,587,135,572,135,555)
+ct(135,544,137,536,141,532)
+ct(144,526,148,524,154,524)
+ct(157,524,161,525,167,528)
+ct(176,530,183,532,189,532)
+ct(202,532,214,527,224,518)
+ct(234,508,239,496,239,481)
+ct(239,464,234,451,224,442)
+ct(210,430,193,424,175,424)
+ct(153,424,133,433,116,452)
+ct(98,470,90,493,90,520)
+ct(90,558,104,593,133,625)
+ct(152,646,180,663,216,677)
+ )cp
+endchar;
+
+beginchar(23,333*FX#,695*FY#,0*FY#);
+"ring";
+dr
+ah((166,695)
+ct(192,695,214,686,232,667)
+ct(251,649,260,627,260,602)
+ct(260,576,251,553,232,535)
+ct(214,517,192,508,166,508)
+ct(140,508,118,517,100,535)
+ct(82,553,73,576,73,602)
+ct(73,627,82,649,100,667)
+ct(118,686,140,695,166,695)
+ )cp
+dr
+ah((166,661)
+ct(149,661,135,655,124,644)
+ct(112,632,106,618,106,602)
+ct(106,585,112,571,124,560)
+ct(135,548,149,542,166,542)
+ct(183,542,197,548,208,560)
+ct(220,571,226,585,226,602)
+ct(226,618,220,632,208,644)
+ct(197,655,183,661,166,661)
+ )cp
+chp[202]:=currentpicture;
+endchar;
+
+beginchar(95,1*FX#,0*FY#,0*FY#);
+"dotaccent";
+endchar;
+
+beginchar(125,1*FX#,0*FY#,0*FY#);
+"hungarumlaut";
+endchar;
+
+beginchar(24,333*FX#,7*FY#,190*FY#);
+"cedilla";
+dr
+ah((176,7)
+lt(205,7)
+lt(181,-30)
+ct(201,-35,216,-44,227,-57)
+ct(237,-69,242,-84,242,-102)
+ct(242,-125,232,-146,212,-163)
+ct(193,-181,168,-190,137,-190)
+ct(125,-190,109,-189,91,-187)
+lt(91,-166)
+ct(99,-166,107,-167,114,-167)
+ct(131,-167,145,-162,156,-151)
+ct(168,-140,173,-128,173,-114)
+ct(173,-104,170,-96,162,-88)
+ct(155,-81,145,-78,134,-78)
+ct(130,-78,126,-78,122,-79)
+lt(176,7)
+ )cp
+chp[203]:=currentpicture;
+endchar;
+
+beginchar(158,1*FX#,0*FY#,0*FY#);
+"ogonek";
+endchar;
+
+beginchar(20,333*FX#,676*FY#,0*FY#);
+"caron";
+dr
+ah((211,514)
+lt(122,514)
+lt(29,676)
+lt(44,676)
+lt(177,572)
+lt(289,676)
+lt(304,676)
+lt(211,514)
+ )cp
+chp[207]:=currentpicture;
+endchar;
+
+beginchar(21,1*FX#,0*FY#,0*FY#);
+"breve";
+endchar;
+
+beginchar(16,277*FX#,460*FY#,0*FY#);
+"dotlessi";
+dr
+ah((185,460)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,35,201,28,209,24)
+ct(217,19,232,17,253,17)
+lt(253,0)
+lt(36,0)
+lt(36,17)
+ct(57,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(102,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,100,367)
+ct(97,378,94,385,89,389)
+ct(84,393,77,395,69,395)
+ct(59,395,48,392,36,388)
+lt(29,405)
+lt(164,460)
+lt(185,460)
+ )cp
+chp[245]:=currentpicture;
+endchar;
+
+beginchar(144,443*FX#,97*FY#,154*FY#);
+"quotedblbase";
+dr
+ah((56,-154)
+lt(56,-133)
+ct(89,-115,110,-98,120,-83)
+ct(131,-68,136,-50,136,-30)
+ct(136,-21,134,-14,131,-10)
+ct(127,-5,123,-3,119,-3)
+ct(115,-3,110,-4,104,-7)
+ct(96,-9,89,-11,82,-11)
+ct(68,-11,57,-6,47,3)
+ct(37,13,32,25,32,39)
+ct(32,54,38,68,51,80)
+ct(64,91,79,97,97,97)
+ct(118,97,138,88,155,69)
+ct(172,51,181,27,181,0)
+ct(181,-34,170,-65,148,-94)
+ct(126,-122,95,-142,56,-154)
+ )cp
+dr
+ah((289,-154)
+lt(289,-133)
+ct(317,-119,337,-103,350,-87)
+ct(362,-70,369,-52,369,-33)
+ct(369,-21,367,-13,364,-9)
+ct(360,-5,357,-3,353,-3)
+ct(349,-3,343,-4,336,-7)
+ct(328,-9,322,-11,316,-11)
+ct(303,-11,291,-6,281,3)
+ct(272,13,267,26,267,40)
+ct(267,55,273,69,285,80)
+ct(297,91,312,97,329,97)
+ct(351,97,371,88,389,69)
+ct(406,50,415,26,415,0)
+ct(415,-33,404,-63,383,-92)
+ct(361,-120,330,-140,289,-154)
+ )cp
+endchar;
+
+beginchar(192,722*FX#,877*FY#,0*FY#);
+"Agrave";
+dr
+ah((456,221)
+lt(200,221)
+lt(155,117)
+ct(143,91,138,71,138,59)
+ct(138,49,143,40,153,32)
+ct(162,25,183,20,215,18)
+lt(215,0)
+lt(6,0)
+lt(6,18)
+ct(34,22,52,29,60,37)
+ct(76,52,95,84,115,132)
+lt(348,677)
+lt(365,677)
+lt(596,126)
+ct(614,82,631,53,646,40)
+ct(661,27,682,19,709,18)
+lt(709,0)
+lt(448,0)
+lt(448,18)
+ct(475,19,492,23,502,31)
+ct(511,38,516,47,516,58)
+ct(516,72,509,95,496,126)
+lt(456,221)
+ )cp
+dr
+ah((442,257)
+lt(330,525)
+lt(215,257)
+lt(442,257)
+ )cp
+dr
+ah((250,877)
+lt(359,877)
+lt(411,708)
+lt(394,708)
+lt(250,877)
+ )cp
+endchar;
+
+beginchar(194,722*FX#,875*FY#,0*FY#);
+"Acircumflex";
+dr
+ah((456,221)
+lt(200,221)
+lt(155,117)
+ct(143,91,138,71,138,59)
+ct(138,49,143,40,153,32)
+ct(162,25,183,20,215,18)
+lt(215,0)
+lt(6,0)
+lt(6,18)
+ct(34,22,52,29,60,37)
+ct(76,52,95,84,115,132)
+lt(348,677)
+lt(365,677)
+lt(596,126)
+ct(614,82,631,53,646,40)
+ct(661,27,682,19,709,18)
+lt(709,0)
+lt(448,0)
+lt(448,18)
+ct(475,19,492,23,502,31)
+ct(511,38,516,47,516,58)
+ct(516,72,509,95,496,126)
+lt(456,221)
+ )cp
+dr
+ah((442,257)
+lt(330,525)
+lt(215,257)
+lt(442,257)
+ )cp
+dr
+ah((313,875)
+lt(403,875)
+lt(496,713)
+lt(481,713)
+lt(348,817)
+lt(236,713)
+lt(221,713)
+lt(313,875)
+ )cp
+endchar;
+
+beginchar(200,610*FX#,877*FY#,0*FY#);
+"Egrave";
+dr
+ah((208,625)
+lt(208,364)
+lt(354,364)
+ct(392,364,417,369,430,381)
+ct(446,395,456,422,458,460)
+lt(476,460)
+lt(476,229)
+lt(458,229)
+ct(453,261,448,282,444,291)
+ct(438,303,429,312,416,318)
+ct(402,325,382,328,354,328)
+lt(208,328)
+lt(208,110)
+ct(208,81,210,63,212,56)
+ct(215,50,220,45,226,41)
+ct(233,38,245,36,263,36)
+lt(375,36)
+ct(413,36,440,38,457,43)
+ct(474,49,490,59,506,74)
+ct(526,94,546,124,568,166)
+lt(587,166)
+lt(530,0)
+lt(20,0)
+lt(20,18)
+lt(43,18)
+ct(59,18,74,21,88,29)
+ct(98,34,105,42,109,52)
+ct(113,63,115,84,115,116)
+lt(115,546)
+ct(115,588,110,614,102,624)
+ct(90,637,70,644,43,644)
+lt(20,644)
+lt(20,662)
+lt(530,662)
+lt(538,517)
+lt(519,517)
+ct(512,551,504,575,496,588)
+ct(488,601,475,611,459,618)
+ct(445,622,422,625,390,625)
+lt(208,625)
+ )cp
+dr
+ah((198,877)
+lt(307,877)
+lt(358,708)
+lt(341,708)
+lt(198,877)
+ )cp
+endchar;
+
+beginchar(202,610*FX#,875*FY#,0*FY#);
+"Ecircumflex";
+dr
+ah((208,625)
+lt(208,364)
+lt(354,364)
+ct(392,364,417,369,430,381)
+ct(446,395,456,422,458,460)
+lt(476,460)
+lt(476,229)
+lt(458,229)
+ct(453,261,448,282,444,291)
+ct(438,303,429,312,416,318)
+ct(402,325,382,328,354,328)
+lt(208,328)
+lt(208,110)
+ct(208,81,210,63,212,56)
+ct(215,50,220,45,226,41)
+ct(233,38,245,36,263,36)
+lt(375,36)
+ct(413,36,440,38,457,43)
+ct(474,49,490,59,506,74)
+ct(526,94,546,124,568,166)
+lt(587,166)
+lt(530,0)
+lt(20,0)
+lt(20,18)
+lt(43,18)
+ct(59,18,74,21,88,29)
+ct(98,34,105,42,109,52)
+ct(113,63,115,84,115,116)
+lt(115,546)
+ct(115,588,110,614,102,624)
+ct(90,637,70,644,43,644)
+lt(20,644)
+lt(20,662)
+lt(530,662)
+lt(538,517)
+lt(519,517)
+ct(512,551,504,575,496,588)
+ct(488,601,475,611,459,618)
+ct(445,622,422,625,390,625)
+lt(208,625)
+ )cp
+dr
+ah((262,875)
+lt(352,875)
+lt(444,713)
+lt(429,713)
+lt(296,817)
+lt(184,713)
+lt(169,713)
+lt(262,875)
+ )cp
+endchar;
+
+beginchar(203,610*FX#,833*FY#,0*FY#);
+"Edieresis";
+dr
+ah((208,625)
+lt(208,364)
+lt(354,364)
+ct(392,364,417,369,430,381)
+ct(446,395,456,422,458,460)
+lt(476,460)
+lt(476,229)
+lt(458,229)
+ct(453,261,448,282,444,291)
+ct(438,303,429,312,416,318)
+ct(402,325,382,328,354,328)
+lt(208,328)
+lt(208,110)
+ct(208,81,210,63,212,56)
+ct(215,50,220,45,226,41)
+ct(233,38,245,36,263,36)
+lt(375,36)
+ct(413,36,440,38,457,43)
+ct(474,49,490,59,506,74)
+ct(526,94,546,124,568,166)
+lt(587,166)
+lt(530,0)
+lt(20,0)
+lt(20,18)
+lt(43,18)
+ct(59,18,74,21,88,29)
+ct(98,34,105,42,109,52)
+ct(113,63,115,84,115,116)
+lt(115,546)
+ct(115,588,110,614,102,624)
+ct(90,637,70,644,43,644)
+lt(20,644)
+lt(20,662)
+lt(530,662)
+lt(538,517)
+lt(519,517)
+ct(512,551,504,575,496,588)
+ct(488,601,475,611,459,618)
+ct(445,622,422,625,390,625)
+lt(208,625)
+ )cp
+dr
+ah((393,833)
+ct(407,833,420,828,430,818)
+ct(440,807,445,795,445,780)
+ct(445,766,440,753,430,743)
+ct(420,733,407,728,393,728)
+ct(378,728,365,733,355,743)
+ct(345,753,339,766,339,780)
+ct(339,795,345,807,355,818)
+ct(365,828,378,833,393,833)
+ )cp
+dr
+ah((220,833)
+ct(235,833,248,828,258,818)
+ct(268,807,273,795,273,780)
+ct(273,766,268,753,258,743)
+ct(247,733,235,728,221,728)
+ct(206,728,194,733,183,743)
+ct(173,753,167,766,167,780)
+ct(167,795,173,807,183,818)
+ct(193,828,206,833,220,833)
+ )cp
+endchar;
+
+beginchar(206,333*FX#,875*FY#,0*FY#);
+"Icircumflex";
+dr
+ah((308,18)
+lt(308,0)
+lt(24,0)
+lt(24,18)
+lt(48,18)
+ct(75,18,95,25,107,41)
+ct(115,51,119,77,119,117)
+lt(119,544)
+ct(119,578,117,600,113,611)
+ct(109,619,103,626,93,632)
+ct(78,640,63,644,48,644)
+lt(24,644)
+lt(24,662)
+lt(308,662)
+lt(308,644)
+lt(284,644)
+ct(257,644,237,636,225,620)
+ct(217,609,213,584,213,544)
+lt(213,117)
+ct(213,83,215,60,219,50)
+ct(222,42,229,35,240,29)
+ct(254,21,268,18,284,18)
+lt(308,18)
+ )cp
+dr
+ah((121,875)
+lt(211,875)
+lt(304,713)
+lt(289,713)
+lt(155,817)
+lt(43,713)
+lt(29,713)
+lt(121,875)
+ )cp
+endchar;
+
+beginchar(207,333*FX#,833*FY#,0*FY#);
+"Idieresis";
+dr
+ah((308,18)
+lt(308,0)
+lt(24,0)
+lt(24,18)
+lt(48,18)
+ct(75,18,95,25,107,41)
+ct(115,51,119,77,119,117)
+lt(119,544)
+ct(119,578,117,600,113,611)
+ct(109,619,103,626,93,632)
+ct(78,640,63,644,48,644)
+lt(24,644)
+lt(24,662)
+lt(308,662)
+lt(308,644)
+lt(284,644)
+ct(257,644,237,636,225,620)
+ct(217,609,213,584,213,544)
+lt(213,117)
+ct(213,83,215,60,219,50)
+ct(222,42,229,35,240,29)
+ct(254,21,268,18,284,18)
+lt(308,18)
+ )cp
+dr
+ah((252,833)
+ct(267,833,279,828,289,818)
+ct(300,807,305,795,305,780)
+ct(305,766,300,753,289,743)
+ct(279,733,267,728,252,728)
+ct(237,728,225,733,214,743)
+ct(204,753,199,766,199,780)
+ct(199,795,204,807,214,818)
+ct(225,828,237,833,252,833)
+ )cp
+dr
+ah((80,833)
+ct(95,833,107,828,117,818)
+ct(128,807,133,795,133,780)
+ct(133,766,128,753,117,743)
+ct(107,733,94,728,80,728)
+ct(65,728,53,733,42,743)
+ct(32,753,27,766,27,780)
+ct(27,795,32,807,42,818)
+ct(52,828,65,833,80,833)
+ )cp
+endchar;
+
+beginchar(169,759*FX#,677*FY#,15*FY#);
+"copyright";
+dr
+ah((379,677)
+ct(438,677,494,662,550,632)
+ct(605,602,648,560,679,504)
+ct(711,449,726,391,726,331)
+ct(726,271,711,213,680,158)
+ct(650,103,607,60,552,30)
+ct(497,0,439,-15,379,-15)
+ct(319,-15,262,0,207,30)
+ct(152,60,110,103,79,158)
+ct(48,213,33,271,33,331)
+ct(33,391,49,449,80,504)
+ct(111,560,154,602,209,632)
+ct(265,662,321,677,379,677)
+ )cp
+dr
+ah((379,647)
+ct(326,647,275,633,224,606)
+ct(174,579,134,540,106,489)
+ct(78,438,63,386,63,331)
+ct(63,276,77,223,105,173)
+ct(133,123,172,84,222,56)
+ct(272,28,325,14,379,14)
+ct(434,14,487,28,537,56)
+ct(587,84,626,123,654,173)
+ct(682,223,696,276,696,331)
+ct(696,386,682,438,653,489)
+ct(625,540,586,579,535,606)
+ct(485,633,433,647,379,647)
+ )cp
+dr
+ah((551,553)
+lt(561,416)
+lt(541,416)
+ct(530,455,511,484,486,503)
+ct(460,522,429,532,394,532)
+ct(367,532,343,526,322,515)
+ct(301,504,284,489,271,471)
+ct(261,457,253,438,247,415)
+ct(240,392,237,368,237,342)
+ct(237,273,252,222,281,189)
+ct(311,156,350,140,398,140)
+ct(462,140,513,166,551,219)
+lt(569,210)
+ct(523,144,461,111,382,111)
+ct(317,111,263,132,220,174)
+ct(177,216,156,267,156,328)
+ct(156,390,179,443,224,488)
+ct(270,532,328,554,399,554)
+ct(414,554,426,553,436,551)
+ct(446,549,464,544,489,535)
+ct(497,532,503,531,507,531)
+ct(513,531,517,533,520,535)
+ct(524,538,528,544,531,553)
+lt(551,553)
+ )cp
+endchar;
+
+beginchar(174,759*FX#,677*FY#,15*FY#);
+"registered";
+dr
+ah((379,677)
+ct(438,677,494,662,550,632)
+ct(605,602,648,560,679,504)
+ct(711,449,726,391,726,331)
+ct(726,271,711,213,680,158)
+ct(650,103,607,60,552,30)
+ct(497,0,439,-15,379,-15)
+ct(319,-15,262,0,207,30)
+ct(152,60,110,103,79,158)
+ct(48,213,33,271,33,331)
+ct(33,391,49,449,80,504)
+ct(111,560,154,602,209,632)
+ct(265,662,321,677,379,677)
+ )cp
+dr
+ah((379,647)
+ct(326,647,275,633,224,606)
+ct(174,579,134,540,106,489)
+ct(78,438,63,386,63,331)
+ct(63,276,77,223,105,173)
+ct(133,123,172,84,222,56)
+ct(272,28,325,14,379,14)
+ct(434,14,487,28,537,56)
+ct(587,84,626,123,654,173)
+ct(682,223,696,276,696,331)
+ct(696,386,682,438,653,489)
+ct(625,540,586,579,535,606)
+ct(485,633,433,647,379,647)
+ )cp
+dr
+ah((188,543)
+lt(376,543)
+ct(424,543,460,533,484,511)
+ct(509,490,521,464,521,434)
+ct(521,409,513,388,496,369)
+ct(480,350,452,336,413,326)
+lt(515,180)
+ct(527,162,538,151,548,145)
+ct(554,141,563,138,574,137)
+lt(574,121)
+lt(484,121)
+lt(341,319)
+lt(304,319)
+lt(304,168)
+ct(306,157,310,149,318,145)
+ct(325,140,340,137,361,137)
+lt(361,121)
+lt(182,121)
+lt(182,137)
+ct(198,137,209,139,215,143)
+ct(222,147,227,152,229,159)
+ct(231,164,233,179,233,205)
+lt(233,460)
+ct(233,484,232,498,231,502)
+ct(229,510,225,516,219,520)
+ct(213,524,203,526,188,526)
+lt(188,543)
+ )cp
+dr
+ah((304,340)
+ct(342,340,370,344,388,351)
+ct(406,359,419,369,429,383)
+ct(438,396,443,411,443,429)
+ct(443,455,434,477,415,495)
+ct(397,513,373,522,345,522)
+ct(332,522,318,519,304,514)
+lt(304,340)
+ )cp
+endchar;
+
+beginchar(147,979*FX#,662*FY#,0*FY#);
+"trademark";
+dr
+ah((24,662)
+lt(380,662)
+lt(391,563)
+lt(374,563)
+ct(371,587,362,604,348,615)
+ct(335,627,312,632,279,632)
+lt(243,632)
+lt(243,350)
+ct(243,322,246,305,252,298)
+ct(259,290,273,286,294,285)
+lt(294,268)
+lt(112,268)
+lt(112,285)
+ct(133,287,146,292,152,299)
+ct(158,306,161,322,161,349)
+lt(161,632)
+lt(124,632)
+ct(93,632,71,627,58,617)
+ct(45,607,36,589,31,563)
+lt(14,563)
+lt(24,662)
+ )cp
+dr
+ah((564,662)
+lt(697,382)
+lt(827,662)
+lt(963,662)
+lt(963,644)
+ct(945,643,933,641,927,638)
+ct(920,635,916,630,913,623)
+ct(910,615,909,600,909,578)
+lt(909,349)
+ct(909,321,912,304,918,297)
+ct(924,291,939,286,963,285)
+lt(963,268)
+lt(769,268)
+lt(769,285)
+ct(788,285,801,287,807,291)
+ct(814,295,819,300,822,307)
+ct(825,313,827,327,827,349)
+lt(827,589)
+lt(677,268)
+lt(661,268)
+lt(511,584)
+lt(511,349)
+ct(511,327,512,313,515,306)
+ct(518,299,522,294,528,291)
+ct(534,287,543,285,556,285)
+lt(574,285)
+lt(574,268)
+lt(424,268)
+lt(424,285)
+ct(443,285,455,287,461,290)
+ct(468,293,472,298,475,305)
+ct(478,312,479,327,479,349)
+lt(479,577)
+ct(479,601,478,617,475,624)
+ct(473,630,468,635,461,638)
+ct(455,642,443,644,424,644)
+lt(424,662)
+lt(564,662)
+ )cp
+endchar;
+
+beginchar(135,333*FX#,456*FY#,3*FY#);
+"guilsinglleft";
+dr
+ah((274,-3)
+lt(247,-3)
+lt(58,226)
+lt(247,456)
+lt(274,456)
+lt(155,226)
+lt(274,-3)
+ )cp
+endchar;
+
+beginchar(136,333*FX#,456*FY#,3*FY#);
+"guilsinglright";
+dr
+ah((56,456)
+lt(84,456)
+lt(276,225)
+lt(84,-3)
+lt(56,-3)
+lt(174,225)
+lt(56,456)
+ )cp
+endchar;
+
+beginchar(217,722*FX#,877*FY#,15*FY#);
+"Ugrave";
+dr
+ah((477,644)
+lt(477,662)
+lt(711,662)
+lt(711,644)
+lt(686,644)
+ct(660,644,640,633,626,611)
+ct(619,601,616,577,616,541)
+lt(616,272)
+ct(616,206,609,154,596,117)
+ct(583,81,557,49,518,23)
+ct(480,-2,427,-15,361,-15)
+ct(289,-15,234,-3,196,21)
+ct(159,47,132,80,117,123)
+ct(106,151,101,206,101,286)
+lt(101,544)
+ct(101,585,95,612,84,625)
+ct(73,637,55,644,30,644)
+lt(5,644)
+lt(5,662)
+lt(291,662)
+lt(291,644)
+lt(266,644)
+ct(238,644,219,635,207,618)
+ct(199,606,195,581,195,544)
+lt(195,256)
+ct(195,230,197,201,202,167)
+ct(207,134,215,108,228,90)
+ct(240,71,258,56,281,44)
+ct(304,32,333,26,367,26)
+ct(410,26,449,35,483,54)
+ct(517,73,540,97,553,127)
+ct(565,156,572,206,572,276)
+lt(572,544)
+ct(572,585,567,611,558,622)
+ct(545,636,526,644,501,644)
+lt(477,644)
+ )cp
+dr
+ah((274,877)
+lt(383,877)
+lt(435,708)
+lt(417,708)
+lt(274,877)
+ )cp
+endchar;
+
+beginchar(219,722*FX#,875*FY#,15*FY#);
+"Ucircumflex";
+dr
+ah((477,644)
+lt(477,662)
+lt(711,662)
+lt(711,644)
+lt(686,644)
+ct(660,644,640,633,626,611)
+ct(619,601,616,577,616,541)
+lt(616,272)
+ct(616,206,609,154,596,117)
+ct(583,81,557,49,518,23)
+ct(480,-2,427,-15,361,-15)
+ct(289,-15,234,-3,196,21)
+ct(159,47,132,80,117,123)
+ct(106,151,101,206,101,286)
+lt(101,544)
+ct(101,585,95,612,84,625)
+ct(73,637,55,644,30,644)
+lt(5,644)
+lt(5,662)
+lt(291,662)
+lt(291,644)
+lt(266,644)
+ct(238,644,219,635,207,618)
+ct(199,606,195,581,195,544)
+lt(195,256)
+ct(195,230,197,201,202,167)
+ct(207,134,215,108,228,90)
+ct(240,71,258,56,281,44)
+ct(304,32,333,26,367,26)
+ct(410,26,449,35,483,54)
+ct(517,73,540,97,553,127)
+ct(565,156,572,206,572,276)
+lt(572,544)
+ct(572,585,567,611,558,622)
+ct(545,636,526,644,501,644)
+lt(477,644)
+ )cp
+dr
+ah((337,875)
+lt(427,875)
+lt(520,713)
+lt(504,713)
+lt(371,817)
+lt(259,713)
+lt(245,713)
+lt(337,875)
+ )cp
+endchar;
+
+beginchar(92,443*FX#,677*FY#,0*FY#);
+"quotedblleft";
+dr
+ah((159,677)
+lt(159,657)
+ct(130,642,110,626,97,610)
+ct(85,594,79,576,79,557)
+ct(79,545,80,537,83,533)
+ct(86,528,90,526,94,526)
+ct(98,526,104,528,111,530)
+ct(118,532,125,534,131,534)
+ct(144,534,156,529,166,519)
+ct(176,509,181,497,181,482)
+ct(181,467,175,453,163,442)
+ct(151,431,136,425,118,425)
+ct(96,425,76,435,59,454)
+ct(41,472,32,496,32,523)
+ct(32,556,43,586,65,614)
+ct(86,643,118,663,159,677)
+ )cp
+dr
+ah((392,675)
+lt(392,657)
+ct(359,638,337,621,327,606)
+ct(316,591,311,573,311,553)
+ct(311,544,312,537,316,533)
+ct(320,528,324,526,328,526)
+ct(331,526,337,527,344,530)
+ct(351,532,358,534,365,534)
+ct(379,534,390,529,400,519)
+ct(410,510,415,498,415,484)
+ct(415,468,409,454,396,442)
+ct(384,431,368,425,350,425)
+ct(329,425,309,434,292,453)
+ct(275,471,266,494,266,522)
+ct(266,556,277,587,299,615)
+ct(321,644,352,664,392,675)
+ )cp
+endchar;
+
+beginchar(34,443*FX#,774*FY#,0*FY#);
+"quotedblright";
+dr
+ah((56,522)
+lt(56,543)
+ct(89,562,110,578,120,593)
+ct(131,609,136,626,136,646)
+ct(136,655,134,662,131,666)
+ct(127,670,123,673,119,673)
+ct(115,673,110,671,104,669)
+ct(96,667,89,666,82,666)
+ct(68,666,57,670,47,680)
+ct(37,690,32,702,32,716)
+ct(32,731,38,745,51,757)
+ct(64,769,79,774,97,774)
+ct(118,774,138,765,155,747)
+ct(172,728,181,705,181,676)
+ct(181,642,170,611,148,583)
+ct(126,554,95,534,56,522)
+ )cp
+dr
+ah((289,522)
+lt(289,543)
+ct(317,558,337,573,350,590)
+ct(362,606,369,624,369,643)
+ct(369,654,367,662,364,667)
+ct(360,671,357,673,353,673)
+ct(349,673,343,671,336,669)
+ct(328,667,322,666,316,666)
+ct(303,666,291,671,281,681)
+ct(272,691,267,703,267,717)
+ct(267,732,273,746,285,757)
+ct(297,769,312,774,329,774)
+ct(351,774,371,765,389,746)
+ct(406,727,415,703,415,676)
+ct(415,643,404,613,383,585)
+ct(361,557,330,536,289,522)
+ )cp
+endchar;
+
+beginchar(176,399*FX#,676*FY#,0*FY#);
+"degree";
+dr
+ah((197,676)
+ct(239,676,275,662,304,632)
+ct(333,603,348,568,348,526)
+ct(348,485,333,449,304,420)
+ct(274,391,239,376,197,376)
+ct(156,376,121,391,91,420)
+ct(62,449,47,485,47,526)
+ct(47,568,62,603,91,632)
+ct(120,662,156,676,197,676)
+ )cp
+dr
+ah((197,635)
+ct(167,635,141,625,120,604)
+ct(99,582,88,557,88,526)
+ct(88,496,99,471,120,449)
+ct(141,428,167,417,197,417)
+ct(227,417,253,428,274,449)
+ct(295,471,306,496,306,526)
+ct(306,557,296,582,274,604)
+ct(253,625,228,635,197,635)
+ )cp
+endchar;
+
+beginchar(199,666*FX#,677*FY#,190*FY#);
+"Ccedilla";
+dr
+ah((602,677)
+lt(617,452)
+lt(602,452)
+ct(581,519,553,568,515,597)
+ct(478,627,433,642,380,642)
+ct(336,642,297,630,261,608)
+ct(226,586,198,550,177,501)
+ct(157,453,147,392,147,319)
+ct(147,259,157,208,176,164)
+ct(195,120,224,86,262,62)
+ct(301,39,345,27,395,27)
+ct(437,27,475,37,508,55)
+ct(541,73,577,110,617,165)
+lt(632,155)
+ct(599,96,560,53,516,25)
+ct(471,-1,419,-15,358,-15)
+ct(248,-15,163,25,103,106)
+ct(58,166,36,238,36,320)
+ct(36,386,50,447,80,502)
+ct(110,558,150,601,202,631)
+ct(254,662,311,677,373,677)
+ct(420,677,467,665,514,642)
+ct(528,634,537,631,543,631)
+ct(552,631,560,634,566,640)
+ct(574,648,580,661,584,677)
+lt(602,677)
+ )cp
+dr
+ah((340,7)
+lt(370,7)
+lt(345,-30)
+ct(366,-35,381,-44,391,-57)
+ct(401,-69,406,-84,406,-102)
+ct(406,-125,396,-146,377,-163)
+ct(357,-181,332,-190,301,-190)
+ct(289,-190,273,-189,255,-187)
+lt(255,-166)
+ct(264,-166,272,-167,279,-167)
+ct(295,-167,309,-162,321,-151)
+ct(332,-140,338,-128,338,-114)
+ct(338,-104,334,-96,327,-88)
+ct(319,-81,310,-78,299,-78)
+ct(295,-78,291,-78,286,-79)
+lt(340,7)
+ )cp
+endchar;
+
+beginchar(231,443*FX#,460*FY#,190*FY#);
+"ccedilla";
+dr
+ah((411,169)
+ct(399,111,375,65,340,33)
+ct(305,2,266,-13,223,-13)
+ct(172,-13,128,7,90,50)
+ct(53,92,34,150,34,223)
+ct(34,293,55,350,96,394)
+ct(138,438,188,460,247,460)
+ct(291,460,327,448,355,425)
+ct(384,402,398,378,398,353)
+ct(398,340,394,330,386,322)
+ct(378,315,367,311,353,311)
+ct(333,311,319,317,309,330)
+ct(304,336,300,349,298,369)
+ct(296,388,290,402,278,413)
+ct(266,422,251,427,231,427)
+ct(198,427,172,415,152,391)
+ct(126,359,113,317,113,265)
+ct(113,211,126,164,152,123)
+ct(178,82,214,62,258,62)
+ct(290,62,318,73,344,95)
+ct(362,109,379,136,396,176)
+lt(411,169)
+ )cp
+dr
+ah((229,7)
+lt(258,7)
+lt(234,-30)
+ct(254,-35,270,-44,280,-57)
+ct(290,-69,295,-84,295,-102)
+ct(295,-125,285,-146,266,-163)
+ct(246,-181,221,-190,190,-190)
+ct(178,-190,162,-189,144,-187)
+lt(144,-166)
+ct(153,-166,161,-167,167,-167)
+ct(184,-167,198,-162,209,-151)
+ct(221,-140,227,-128,227,-114)
+ct(227,-104,223,-96,215,-88)
+ct(208,-81,199,-78,187,-78)
+ct(184,-78,180,-78,175,-79)
+lt(229,7)
+ )cp
+endchar;
+
+beginchar(209,722*FX#,841*FY#,10*FY#);
+"Ntilde";
+dr
+ah((-13,662)
+lt(166,662)
+lt(571,165)
+lt(571,547)
+ct(571,587,566,613,557,623)
+ct(545,637,526,644,500,644)
+lt(477,644)
+lt(477,662)
+lt(708,662)
+lt(708,644)
+lt(684,644)
+ct(656,644,636,635,625,618)
+ct(617,608,614,584,614,547)
+lt(614,-10)
+lt(596,-10)
+lt(160,522)
+lt(160,114)
+ct(160,73,164,48,173,38)
+ct(185,24,204,18,230,18)
+lt(253,18)
+lt(253,0)
+lt(23,0)
+lt(23,18)
+lt(46,18)
+ct(74,18,94,26,106,43)
+ct(113,53,117,77,117,114)
+lt(117,575)
+ct(97,597,83,612,73,619)
+ct(63,626,48,633,29,639)
+ct(19,642,5,644,-13,644)
+lt(-13,662)
+ )cp
+dr
+ah((218,715)
+lt(203,715)
+ct(204,759,213,792,230,812)
+ct(248,831,269,841,294,841)
+ct(307,841,319,839,331,835)
+ct(346,829,366,818,393,800)
+ct(420,782,440,773,453,773)
+ct(464,773,473,778,481,787)
+ct(489,795,495,814,500,841)
+lt(515,841)
+ct(515,811,511,787,503,769)
+ct(494,752,483,738,468,728)
+ct(452,718,437,713,422,713)
+ct(396,713,364,726,326,752)
+ct(306,766,292,774,285,777)
+ct(277,780,270,782,264,782)
+ct(250,782,240,776,232,764)
+ct(228,758,224,742,218,715)
+ )cp
+endchar;
+
+beginchar(241,500*FX#,662*FY#,0*FY#);
+"ntilde";
+dr
+ah((161,365)
+ct(213,428,263,460,311,460)
+ct(335,460,356,454,374,442)
+ct(392,429,406,409,416,381)
+ct(423,361,427,331,427,291)
+lt(427,101)
+ct(427,72,429,53,434,43)
+ct(437,35,443,28,451,24)
+ct(459,19,474,17,495,17)
+lt(495,0)
+lt(274,0)
+lt(274,17)
+lt(283,17)
+ct(304,17,319,20,327,27)
+ct(335,33,341,42,344,55)
+ct(345,59,346,75,346,101)
+lt(346,284)
+ct(346,324,341,354,330,372)
+ct(320,391,302,400,277,400)
+ct(238,400,199,378,161,336)
+lt(161,101)
+ct(161,70,162,51,166,44)
+ct(171,35,177,28,185,24)
+ct(193,19,209,17,234,17)
+lt(234,0)
+lt(13,0)
+lt(13,17)
+lt(22,17)
+ct(45,17,61,23,69,34)
+ct(77,46,81,68,81,101)
+lt(81,267)
+ct(81,320,79,353,77,365)
+ct(74,376,71,384,66,389)
+ct(61,393,54,395,45,395)
+ct(36,395,25,392,13,388)
+lt(5,405)
+lt(140,460)
+lt(161,460)
+lt(161,365)
+ )cp
+dr
+ah((109,535)
+lt(94,535)
+ct(95,580,104,612,122,632)
+ct(139,652,160,662,186,662)
+ct(199,662,211,659,222,655)
+ct(237,650,258,638,284,620)
+ct(311,603,331,594,344,594)
+ct(355,594,364,598,372,607)
+ct(380,616,386,634,391,662)
+lt(406,662)
+ct(406,631,402,607,394,590)
+ct(385,572,374,558,359,548)
+ct(343,538,328,533,313,533)
+ct(287,533,255,546,217,572)
+ct(197,586,183,595,176,598)
+ct(169,601,162,602,155,602)
+ct(141,602,131,596,123,584)
+ct(119,578,115,562,109,535)
+ )cp
+endchar;
+
+beginchar(60,333*FX#,475*FY#,215*FY#);
+"exclamdown";
+dr
+ah((166,475)
+ct(182,475,195,470,205,459)
+ct(215,449,221,436,221,421)
+ct(221,406,215,393,205,383)
+ct(194,372,181,367,166,367)
+ct(152,367,139,372,128,383)
+ct(118,393,113,406,113,421)
+ct(113,436,118,449,128,459)
+ct(139,470,152,475,166,475)
+ )cp
+dr
+ah((157,286)
+lt(175,286)
+lt(219,-108)
+ct(220,-125,221,-138,221,-147)
+ct(221,-167,216,-184,205,-197)
+ct(194,-209,181,-215,166,-215)
+ct(151,-215,138,-209,127,-197)
+ct(116,-184,111,-166,111,-141)
+ct(111,-133,111,-122,113,-108)
+lt(157,286)
+ )cp
+endchar;
+
+beginchar(62,443*FX#,476*FY#,215*FY#);
+"questiondown";
+dr
+ah((220,476)
+ct(235,476,248,470,259,460)
+ct(269,449,274,436,274,421)
+ct(274,406,269,394,259,383)
+ct(248,372,235,367,220,367)
+ct(205,367,192,372,182,383)
+ct(171,394,166,406,166,421)
+ct(166,436,171,449,182,460)
+ct(192,470,205,476,220,476)
+ )cp
+dr
+ah((215,305)
+lt(234,305)
+ct(232,265,228,233,222,209)
+ct(216,186,199,145,172,89)
+ct(145,32,132,-14,132,-51)
+ct(132,-94,143,-127,164,-151)
+ct(186,-174,213,-186,247,-186)
+ct(275,-186,298,-179,314,-166)
+ct(330,-153,338,-138,338,-122)
+ct(338,-112,333,-98,323,-81)
+ct(313,-63,308,-49,308,-39)
+ct(308,-28,312,-19,320,-11)
+ct(328,-3,337,0,348,0)
+ct(361,0,373,-6,385,-20)
+ct(396,-33,402,-51,402,-74)
+ct(402,-111,386,-144,354,-173)
+ct(322,-201,279,-215,224,-215)
+ct(169,-215,125,-200,92,-170)
+ct(59,-139,43,-103,43,-61)
+ct(43,-33,47,-9,57,13)
+ct(71,45,96,81,130,121)
+ct(165,161,187,192,197,214)
+ct(207,236,213,267,215,305)
+ )cp
+endchar;
+
+beginchar(164,500*FX#,566*FY#,0*FY#);
+"currency";
+dr
+ah((387,497)
+lt(457,566)
+lt(485,539)
+lt(415,470)
+ct(448,426,465,381,465,333)
+ct(465,282,448,236,415,194)
+lt(485,123)
+lt(457,96)
+lt(387,166)
+ct(343,132,299,116,255,116)
+ct(227,116,199,121,172,131)
+ct(144,141,124,152,111,166)
+lt(40,96)
+lt(13,123)
+lt(83,194)
+ct(49,232,33,278,33,332)
+ct(33,382,49,428,83,470)
+lt(13,539)
+lt(40,566)
+lt(111,497)
+ct(128,512,150,524,176,533)
+ct(202,542,227,547,250,547)
+ct(273,547,297,543,322,534)
+ct(346,526,368,513,387,497)
+ )cp
+dr
+ah((250,507)
+ct(200,507,159,490,124,455)
+ct(90,421,73,379,73,330)
+ct(73,282,90,241,125,207)
+ct(159,172,201,155,249,155)
+ct(298,155,339,172,374,207)
+ct(409,242,426,283,426,331)
+ct(426,361,418,390,402,418)
+ct(386,447,364,469,336,484)
+ct(308,500,279,507,250,507)
+ )cp
+endchar;
+
+beginchar(163,500*FX#,675*FY#,11*FY#);
+"sterling";
+dr
+ah((353,321)
+lt(227,321)
+ct(227,306,227,295,227,288)
+ct(227,257,225,229,220,203)
+ct(216,177,208,147,197,113)
+ct(260,93,296,82,306,80)
+ct(323,76,340,74,356,74)
+ct(383,74,405,80,422,93)
+ct(439,105,451,125,459,152)
+lt(477,147)
+ct(470,95,453,55,426,28)
+ct(399,1,369,-11,336,-11)
+ct(314,-11,294,-7,276,0)
+ct(258,8,225,30,177,66)
+ct(164,40,150,20,135,7)
+ct(120,-5,104,-11,86,-11)
+ct(70,-11,57,-6,46,5)
+ct(35,16,29,31,29,51)
+ct(29,73,37,91,52,105)
+ct(67,120,86,127,109,127)
+ct(115,127,121,127,128,126)
+ct(135,125,142,124,151,123)
+ct(152,131,152,139,152,145)
+ct(152,151,152,156,152,161)
+ct(152,189,148,243,142,321)
+lt(47,321)
+lt(47,368)
+lt(142,368)
+ct(138,416,136,448,136,465)
+ct(136,505,144,541,160,574)
+ct(176,607,198,632,226,649)
+ct(254,667,284,675,316,675)
+ct(357,675,388,664,409,642)
+ct(430,620,440,598,440,576)
+ct(440,565,436,556,428,548)
+ct(420,540,411,536,402,536)
+ct(389,536,379,542,371,554)
+ct(368,560,365,573,364,592)
+ct(362,611,357,626,347,635)
+ct(337,643,323,648,305,648)
+ct(279,648,258,638,241,618)
+ct(224,598,216,562,216,512)
+ct(216,488,218,457,222,420)
+ct(224,396,225,378,227,368)
+lt(353,368)
+lt(353,321)
+ )cp
+dr
+ah((145,83)
+ct(138,88,131,91,124,94)
+ct(117,96,110,97,104,97)
+ct(89,97,77,93,69,85)
+ct(61,77,57,67,57,54)
+ct(57,42,60,33,67,26)
+ct(73,20,80,16,89,16)
+ct(100,16,110,21,120,31)
+ct(131,41,139,59,145,83)
+ )cp
+endchar;
+
+beginchar(165,500*FX#,662*FY#,0*FY#);
+"yen";
+dr
+ah((291,207)
+lt(499,207)
+lt(499,171)
+lt(291,171)
+lt(291,119)
+ct(291,82,292,59,296,49)
+ct(299,41,305,35,313,30)
+ct(325,23,338,20,354,20)
+lt(375,20)
+lt(375,0)
+lt(123,0)
+lt(123,20)
+lt(139,20)
+ct(161,20,178,24,189,32)
+ct(197,38,202,47,206,60)
+ct(207,66,208,85,208,119)
+lt(208,171)
+lt(0,171)
+lt(0,207)
+lt(208,207)
+lt(208,277)
+lt(200,295)
+lt(0,295)
+lt(0,331)
+lt(185,331)
+lt(81,573)
+ct(69,601,57,620,45,629)
+ct(34,638,19,643,0,643)
+lt(0,662)
+lt(216,662)
+lt(216,643)
+ct(193,641,177,638,169,632)
+ct(161,626,157,620,157,613)
+ct(157,607,160,598,166,584)
+lt(270,331)
+lt(375,577)
+ct(381,593,385,605,385,613)
+ct(385,620,381,627,375,633)
+ct(370,637,359,640,343,642)
+ct(340,642,336,642,330,643)
+lt(330,662)
+lt(499,662)
+lt(499,643)
+ct(479,643,465,639,457,632)
+ct(443,620,429,599,415,567)
+lt(310,331)
+lt(499,331)
+lt(499,295)
+lt(294,295)
+lt(291,287)
+lt(291,207)
+ )cp
+endchar;
+
+beginchar(167,500*FX#,675*FY#,195*FY#);
+"section";
+dr
+ah((184,411)
+ct(162,435,146,457,137,477)
+ct(128,497,123,517,123,538)
+ct(123,576,136,608,163,635)
+ct(190,662,223,675,262,675)
+ct(298,675,327,664,350,643)
+ct(374,621,385,596,385,568)
+ct(385,555,381,544,373,534)
+ct(366,527,357,524,347,524)
+ct(336,524,326,528,319,535)
+ct(312,543,309,551,309,562)
+ct(309,566,310,575,312,587)
+ct(314,595,315,602,315,608)
+ct(315,622,310,633,301,642)
+ct(291,650,278,655,262,655)
+ct(238,655,218,646,201,630)
+ct(185,613,177,593,177,569)
+ct(177,548,181,531,190,518)
+ct(204,494,229,470,264,446)
+ct(329,398,374,356,398,319)
+ct(414,292,423,264,423,235)
+ct(423,205,415,176,397,146)
+ct(380,116,353,90,315,68)
+ct(338,43,354,21,363,3)
+ct(371,-14,375,-34,375,-55)
+ct(375,-95,362,-128,335,-155)
+ct(309,-181,276,-195,237,-195)
+ct(202,-195,172,-184,149,-161)
+ct(126,-139,114,-114,114,-85)
+ct(114,-73,118,-63,126,-54)
+ct(133,-46,142,-42,152,-42)
+ct(162,-42,171,-46,178,-53)
+ct(185,-61,189,-71,189,-84)
+ct(189,-93,188,-103,185,-114)
+ct(182,-124,181,-132,181,-138)
+ct(181,-147,185,-155,193,-161)
+ct(205,-171,221,-176,240,-176)
+ct(262,-176,281,-167,299,-150)
+ct(317,-133,326,-115,326,-95)
+ct(326,-75,321,-57,311,-41)
+ct(295,-16,266,11,226,41)
+ct(164,86,123,126,101,162)
+ct(84,188,76,216,76,246)
+ct(76,276,84,305,102,334)
+ct(120,363,147,389,184,411)
+ )cp
+dr
+ah((199,396)
+ct(149,366,125,330,125,288)
+ct(125,264,131,243,144,225)
+ct(160,198,192,167,240,131)
+ct(262,113,282,97,299,82)
+ct(349,112,374,147,374,189)
+ct(374,211,367,233,353,256)
+ct(338,279,309,307,264,342)
+ct(237,362,215,380,199,396)
+ )cp
+endchar;
+
+beginchar(132,500*FX#,677*FY#,210*FY#);
+"florin";
+dr
+ah((335,427)
+lt(422,427)
+lt(414,395)
+lt(329,395)
+ct(311,307,283,191,245,49)
+ct(214,-61,181,-134,145,-169)
+ct(117,-196,89,-210,60,-210)
+ct(42,-210,27,-205,17,-195)
+ct(6,-185,0,-173,0,-159)
+ct(0,-146,4,-136,12,-127)
+ct(20,-119,28,-115,38,-115)
+ct(47,-115,54,-118,60,-124)
+ct(67,-130,70,-136,70,-143)
+ct(70,-149,67,-155,63,-161)
+ct(59,-165,58,-168,58,-170)
+ct(58,-173,59,-175,62,-177)
+ct(64,-180,67,-181,70,-181)
+ct(76,-181,82,-179,88,-176)
+ct(98,-170,108,-160,117,-145)
+ct(127,-129,136,-100,146,-58)
+ct(148,-50,162,16,188,144)
+ct(190,155,211,239,249,395)
+lt(162,395)
+lt(169,427)
+ct(202,429,222,432,230,434)
+ct(239,437,245,442,251,450)
+ct(259,460,269,482,280,515)
+ct(304,584,327,628,349,648)
+ct(370,667,394,677,420,677)
+ct(441,677,457,671,469,661)
+ct(481,650,487,637,487,622)
+ct(487,611,484,602,478,595)
+ct(471,588,463,584,454,584)
+ct(446,584,438,587,432,593)
+ct(426,599,423,605,423,612)
+ct(423,617,425,623,429,629)
+ct(432,635,434,639,434,642)
+ct(434,645,432,648,430,651)
+ct(426,653,422,654,417,654)
+ct(406,654,397,650,389,643)
+ct(377,631,370,618,366,602)
+ct(357,562,347,503,335,427)
+ )cp
+endchar;
+
+beginchar(162,500*FX#,647*FY#,185*FY#);
+"cent";
+dr
+ah((439,170)
+ct(423,108,397,61,359,27)
+ct(329,1,293,-11,251,-11)
+ct(225,-11,198,-5,172,5)
+lt(103,-185)
+lt(69,-185)
+lt(145,23)
+ct(118,47,99,72,87,98)
+ct(70,134,62,174,62,220)
+ct(62,302,87,366,139,411)
+ct(178,445,222,462,272,462)
+ct(278,462,288,461,302,460)
+lt(371,647)
+lt(406,647)
+lt(335,451)
+ct(367,436,390,422,402,408)
+ct(418,390,426,372,426,352)
+ct(426,339,422,329,414,322)
+ct(406,314,395,311,380,311)
+ct(362,311,348,317,338,329)
+ct(332,336,327,349,325,369)
+ct(323,379,321,389,317,401)
+lt(206,93)
+ct(224,80,239,72,251,68)
+ct(260,64,271,63,285,63)
+ct(305,63,324,67,342,75)
+ct(361,84,374,93,384,105)
+ct(393,116,407,140,424,176)
+lt(439,170)
+ )cp
+dr
+ah((180,122)
+lt(289,422)
+ct(279,426,270,428,260,428)
+ct(226,428,200,416,181,392)
+ct(154,359,141,315,141,261)
+ct(141,236,143,214,149,193)
+ct(155,173,165,149,180,122)
+ )cp
+endchar;
+
+beginchar(226,443*FX#,676*FY#,9*FY#);
+"acircumflex";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((178,676)
+lt(268,676)
+lt(361,514)
+lt(346,514)
+lt(212,618)
+lt(101,514)
+lt(86,514)
+lt(178,676)
+ )cp
+endchar;
+
+beginchar(234,443*FX#,676*FY#,13*FY#);
+"ecircumflex";
+dr
+ah((106,278)
+ct(105,212,121,160,154,122)
+ct(186,84,225,65,269,65)
+ct(298,65,324,73,345,90)
+ct(367,106,385,133,400,172)
+lt(415,163)
+ct(408,118,388,77,355,41)
+ct(323,4,281,-13,232,-13)
+ct(178,-13,132,7,94,49)
+ct(56,90,37,147,37,217)
+ct(37,294,56,353,95,396)
+ct(135,439,184,460,243,460)
+ct(293,460,334,444,367,411)
+ct(399,378,415,334,415,278)
+lt(106,278)
+ )cp
+dr
+ah((106,307)
+lt(313,307)
+ct(311,335,308,355,303,367)
+ct(295,385,282,400,266,410)
+ct(250,421,233,426,216,426)
+ct(189,426,165,415,143,394)
+ct(122,373,110,344,106,307)
+ )cp
+dr
+ah((196,676)
+lt(286,676)
+lt(379,514)
+lt(364,514)
+lt(230,618)
+lt(119,514)
+lt(104,514)
+lt(196,676)
+ )cp
+endchar;
+
+beginchar(244,500*FX#,676*FY#,13*FY#);
+"ocircumflex";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+dr
+ah((210,676)
+lt(300,676)
+lt(393,514)
+lt(377,514)
+lt(244,618)
+lt(132,514)
+lt(118,514)
+lt(210,676)
+ )cp
+endchar;
+
+beginchar(251,500*FX#,676*FY#,13*FY#);
+"ucircumflex";
+dr
+ah((423,447)
+lt(423,176)
+ct(423,124,424,92,427,81)
+ct(429,69,433,61,438,57)
+ct(444,52,450,50,457,50)
+ct(467,50,478,52,491,58)
+lt(498,41)
+lt(364,-13)
+lt(342,-13)
+lt(342,81)
+ct(304,39,275,13,254,2)
+ct(234,-8,213,-13,190,-13)
+ct(165,-13,144,-6,125,8)
+ct(107,22,94,41,87,63)
+ct(80,86,76,118,76,160)
+lt(76,360)
+ct(76,381,74,396,69,404)
+ct(65,412,58,418,49,423)
+ct(40,427,24,429,0,429)
+lt(0,447)
+lt(157,447)
+lt(157,147)
+ct(157,106,164,78,179,65)
+ct(193,52,211,46,231,46)
+ct(245,46,261,50,279,59)
+ct(297,68,318,85,342,109)
+lt(342,363)
+ct(342,388,338,405,328,414)
+ct(319,423,300,428,270,429)
+lt(270,447)
+lt(423,447)
+ )cp
+dr
+ah((206,676)
+lt(296,676)
+lt(389,514)
+lt(374,514)
+lt(240,618)
+lt(128,514)
+lt(114,514)
+lt(206,676)
+ )cp
+endchar;
+
+beginchar(225,443*FX#,678*FY#,9*FY#);
+"aacute";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((333,678)
+lt(188,510)
+lt(172,510)
+lt(223,678)
+lt(333,678)
+ )cp
+endchar;
+
+beginchar(233,443*FX#,678*FY#,13*FY#);
+"eacute";
+dr
+ah((106,278)
+ct(105,212,121,160,154,122)
+ct(186,84,225,65,269,65)
+ct(298,65,324,73,345,90)
+ct(367,106,385,133,400,172)
+lt(415,163)
+ct(408,118,388,77,355,41)
+ct(323,4,281,-13,232,-13)
+ct(178,-13,132,7,94,49)
+ct(56,90,37,147,37,217)
+ct(37,294,56,353,95,396)
+ct(135,439,184,460,243,460)
+ct(293,460,334,444,367,411)
+ct(399,378,415,334,415,278)
+lt(106,278)
+ )cp
+dr
+ah((106,307)
+lt(313,307)
+ct(311,335,308,355,303,367)
+ct(295,385,282,400,266,410)
+ct(250,421,233,426,216,426)
+ct(189,426,165,415,143,394)
+ct(122,373,110,344,106,307)
+ )cp
+dr
+ah((339,678)
+lt(195,510)
+lt(178,510)
+lt(229,678)
+lt(339,678)
+ )cp
+endchar;
+
+beginchar(243,500*FX#,678*FY#,13*FY#);
+"oacute";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+dr
+ah((353,678)
+lt(208,510)
+lt(192,510)
+lt(243,678)
+lt(353,678)
+ )cp
+endchar;
+
+beginchar(250,500*FX#,678*FY#,13*FY#);
+"uacute";
+dr
+ah((423,447)
+lt(423,176)
+ct(423,124,424,92,427,81)
+ct(429,69,433,61,438,57)
+ct(444,52,450,50,457,50)
+ct(467,50,478,52,491,58)
+lt(498,41)
+lt(364,-13)
+lt(342,-13)
+lt(342,81)
+ct(304,39,275,13,254,2)
+ct(234,-8,213,-13,190,-13)
+ct(165,-13,144,-6,125,8)
+ct(107,22,94,41,87,63)
+ct(80,86,76,118,76,160)
+lt(76,360)
+ct(76,381,74,396,69,404)
+ct(65,412,58,418,49,423)
+ct(40,427,24,429,0,429)
+lt(0,447)
+lt(157,447)
+lt(157,147)
+ct(157,106,164,78,179,65)
+ct(193,52,211,46,231,46)
+ct(245,46,261,50,279,59)
+ct(297,68,318,85,342,109)
+lt(342,363)
+ct(342,388,338,405,328,414)
+ct(319,423,300,428,270,429)
+lt(270,447)
+lt(423,447)
+ )cp
+dr
+ah((341,678)
+lt(197,510)
+lt(180,510)
+lt(231,678)
+lt(341,678)
+ )cp
+endchar;
+
+beginchar(224,443*FX#,678*FY#,9*FY#);
+"agrave";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((126,678)
+lt(235,678)
+lt(287,510)
+lt(270,510)
+lt(126,678)
+ )cp
+endchar;
+
+beginchar(232,443*FX#,678*FY#,13*FY#);
+"egrave";
+dr
+ah((106,278)
+ct(105,212,121,160,154,122)
+ct(186,84,225,65,269,65)
+ct(298,65,324,73,345,90)
+ct(367,106,385,133,400,172)
+lt(415,163)
+ct(408,118,388,77,355,41)
+ct(323,4,281,-13,232,-13)
+ct(178,-13,132,7,94,49)
+ct(56,90,37,147,37,217)
+ct(37,294,56,353,95,396)
+ct(135,439,184,460,243,460)
+ct(293,460,334,444,367,411)
+ct(399,378,415,334,415,278)
+lt(106,278)
+ )cp
+dr
+ah((106,307)
+lt(313,307)
+ct(311,335,308,355,303,367)
+ct(295,385,282,400,266,410)
+ct(250,421,233,426,216,426)
+ct(189,426,165,415,143,394)
+ct(122,373,110,344,106,307)
+ )cp
+dr
+ah((139,678)
+lt(248,678)
+lt(299,510)
+lt(282,510)
+lt(139,678)
+ )cp
+endchar;
+
+beginchar(242,500*FX#,678*FY#,13*FY#);
+"ograve";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+dr
+ah((146,678)
+lt(255,678)
+lt(307,510)
+lt(290,510)
+lt(146,678)
+ )cp
+endchar;
+
+beginchar(249,500*FX#,678*FY#,13*FY#);
+"ugrave";
+dr
+ah((423,447)
+lt(423,176)
+ct(423,124,424,92,427,81)
+ct(429,69,433,61,438,57)
+ct(444,52,450,50,457,50)
+ct(467,50,478,52,491,58)
+lt(498,41)
+lt(364,-13)
+lt(342,-13)
+lt(342,81)
+ct(304,39,275,13,254,2)
+ct(234,-8,213,-13,190,-13)
+ct(165,-13,144,-6,125,8)
+ct(107,22,94,41,87,63)
+ct(80,86,76,118,76,160)
+lt(76,360)
+ct(76,381,74,396,69,404)
+ct(65,412,58,418,49,423)
+ct(40,427,24,429,0,429)
+lt(0,447)
+lt(157,447)
+lt(157,147)
+ct(157,106,164,78,179,65)
+ct(193,52,211,46,231,46)
+ct(245,46,261,50,279,59)
+ct(297,68,318,85,342,109)
+lt(342,363)
+ct(342,388,338,405,328,414)
+ct(319,423,300,428,270,429)
+lt(270,447)
+lt(423,447)
+ )cp
+dr
+ah((149,678)
+lt(258,678)
+lt(310,510)
+lt(293,510)
+lt(149,678)
+ )cp
+endchar;
+
+beginchar(228,443*FX#,652*FY#,9*FY#);
+"adieresis";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((309,652)
+ct(324,652,336,647,346,637)
+ct(357,626,362,614,362,599)
+ct(362,584,357,572,346,562)
+ct(336,552,324,546,309,546)
+ct(294,546,282,552,271,562)
+ct(261,572,256,584,256,599)
+ct(256,614,261,626,271,637)
+ct(282,647,294,652,309,652)
+ )cp
+dr
+ah((137,652)
+ct(152,652,164,647,175,637)
+ct(185,626,190,614,190,599)
+ct(190,584,185,572,174,562)
+ct(164,552,152,546,137,546)
+ct(123,546,110,552,100,562)
+ct(89,572,84,584,84,599)
+ct(84,614,89,626,99,637)
+ct(110,647,122,652,137,652)
+ )cp
+endchar;
+
+beginchar(235,443*FX#,652*FY#,13*FY#);
+"edieresis";
+dr
+ah((106,278)
+ct(105,212,121,160,154,122)
+ct(186,84,225,65,269,65)
+ct(298,65,324,73,345,90)
+ct(367,106,385,133,400,172)
+lt(415,163)
+ct(408,118,388,77,355,41)
+ct(323,4,281,-13,232,-13)
+ct(178,-13,132,7,94,49)
+ct(56,90,37,147,37,217)
+ct(37,294,56,353,95,396)
+ct(135,439,184,460,243,460)
+ct(293,460,334,444,367,411)
+ct(399,378,415,334,415,278)
+lt(106,278)
+ )cp
+dr
+ah((106,307)
+lt(313,307)
+ct(311,335,308,355,303,367)
+ct(295,385,282,400,266,410)
+ct(250,421,233,426,216,426)
+ct(189,426,165,415,143,394)
+ct(122,373,110,344,106,307)
+ )cp
+dr
+ah((327,652)
+ct(342,652,354,647,364,636)
+ct(375,626,380,613,380,599)
+ct(380,584,375,572,364,561)
+ct(354,551,342,546,327,546)
+ct(312,546,300,551,290,561)
+ct(279,572,274,584,274,599)
+ct(274,613,279,626,290,636)
+ct(300,647,312,652,327,652)
+ )cp
+dr
+ah((155,652)
+ct(170,652,182,647,193,636)
+ct(203,626,208,613,208,599)
+ct(208,584,203,572,192,561)
+ct(182,551,170,546,155,546)
+ct(141,546,128,551,118,561)
+ct(107,572,102,584,102,599)
+ct(102,613,107,626,117,636)
+ct(128,647,140,652,155,652)
+ )cp
+endchar;
+
+beginchar(246,500*FX#,652*FY#,13*FY#);
+"odieresis";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+dr
+ah((335,652)
+ct(350,652,362,647,372,636)
+ct(383,626,388,613,388,599)
+ct(388,584,383,572,372,561)
+ct(362,551,350,546,335,546)
+ct(320,546,308,551,297,561)
+ct(287,572,282,584,282,599)
+ct(282,613,287,626,297,636)
+ct(308,647,320,652,335,652)
+ )cp
+dr
+ah((163,652)
+ct(178,652,190,647,200,636)
+ct(211,626,216,613,216,599)
+ct(216,584,211,572,200,561)
+ct(190,551,177,546,163,546)
+ct(148,546,136,551,125,561)
+ct(115,572,110,584,110,599)
+ct(110,613,115,626,125,636)
+ct(135,647,148,652,163,652)
+ )cp
+endchar;
+
+beginchar(252,500*FX#,652*FY#,13*FY#);
+"udieresis";
+dr
+ah((423,447)
+lt(423,176)
+ct(423,124,424,92,427,81)
+ct(429,69,433,61,438,57)
+ct(444,52,450,50,457,50)
+ct(467,50,478,52,491,58)
+lt(498,41)
+lt(364,-13)
+lt(342,-13)
+lt(342,81)
+ct(304,39,275,13,254,2)
+ct(234,-8,213,-13,190,-13)
+ct(165,-13,144,-6,125,8)
+ct(107,22,94,41,87,63)
+ct(80,86,76,118,76,160)
+lt(76,360)
+ct(76,381,74,396,69,404)
+ct(65,412,58,418,49,423)
+ct(40,427,24,429,0,429)
+lt(0,447)
+lt(157,447)
+lt(157,147)
+ct(157,106,164,78,179,65)
+ct(193,52,211,46,231,46)
+ct(245,46,261,50,279,59)
+ct(297,68,318,85,342,109)
+lt(342,363)
+ct(342,388,338,405,328,414)
+ct(319,423,300,428,270,429)
+lt(270,447)
+lt(423,447)
+ )cp
+dr
+ah((335,652)
+ct(350,652,362,647,372,636)
+ct(383,626,388,613,388,599)
+ct(388,584,383,572,372,561)
+ct(362,551,350,546,335,546)
+ct(320,546,308,551,297,561)
+ct(287,572,282,584,282,599)
+ct(282,613,287,626,297,636)
+ct(308,647,320,652,335,652)
+ )cp
+dr
+ah((163,652)
+ct(178,652,190,647,200,636)
+ct(211,626,216,613,216,599)
+ct(216,584,211,572,200,561)
+ct(190,551,177,546,163,546)
+ct(148,546,136,551,125,561)
+ct(115,572,110,584,110,599)
+ct(110,613,115,626,125,636)
+ct(135,647,148,652,163,652)
+ )cp
+endchar;
+
+beginchar(197,722*FX#,830*FY#,0*FY#);
+"Aring";
+dr
+ah((456,221)
+lt(200,221)
+lt(155,117)
+ct(143,91,138,71,138,59)
+ct(138,49,143,40,153,32)
+ct(162,25,183,20,215,18)
+lt(215,0)
+lt(6,0)
+lt(6,18)
+ct(34,22,52,29,60,37)
+ct(76,52,95,84,115,132)
+lt(348,677)
+lt(365,677)
+lt(596,126)
+ct(614,82,631,53,646,40)
+ct(661,27,682,19,709,18)
+lt(709,0)
+lt(448,0)
+lt(448,18)
+ct(475,19,492,23,502,31)
+ct(511,38,516,47,516,58)
+ct(516,72,509,95,496,126)
+lt(456,221)
+ )cp
+dr
+ah((442,257)
+lt(330,525)
+lt(215,257)
+lt(442,257)
+ )cp
+dr
+ah((356,830)
+ct(382,830,405,821,423,803)
+ct(441,784,450,763,450,737)
+ct(450,711,441,689,423,670)
+ct(405,652,382,643,356,643)
+ct(331,643,309,652,291,670)
+ct(272,689,263,711,263,737)
+ct(263,763,272,784,290,803)
+ct(308,821,330,830,356,830)
+ )cp
+dr
+ah((356,796)
+ct(340,796,326,791,314,779)
+ct(303,767,297,753,297,737)
+ct(297,721,303,707,314,695)
+ct(326,683,340,677,356,677)
+ct(373,677,387,683,399,695)
+ct(410,707,416,721,416,737)
+ct(416,753,410,767,399,779)
+ct(387,791,373,796,356,796)
+ )cp
+endchar;
+
+beginchar(238,277*FX#,676*FY#,0*FY#);
+"icircumflex";
+dr
+ah((185,460)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,35,201,28,209,24)
+ct(217,19,232,17,253,17)
+lt(253,0)
+lt(36,0)
+lt(36,17)
+ct(57,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(102,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,100,367)
+ct(97,378,94,385,89,389)
+ct(84,393,77,395,69,395)
+ct(59,395,48,392,36,388)
+lt(29,405)
+lt(164,460)
+lt(185,460)
+ )cp
+dr
+ah((98,676)
+lt(188,676)
+lt(281,514)
+lt(266,514)
+lt(132,618)
+lt(20,514)
+lt(6,514)
+lt(98,676)
+ )cp
+endchar;
+
+beginchar(31,722*FX#,683*FY#,22*FY#);
+"Oslash";
+dr
+ah((560,604)
+lt(624,683)
+lt(652,662)
+lt(587,580)
+ct(621,543,645,506,661,468)
+ct(676,430,684,386,684,335)
+ct(684,223,644,132,564,64)
+ct(503,11,436,-15,363,-15)
+ct(329,-15,294,-9,257,3)
+ct(220,15,188,32,161,54)
+lt(98,-22)
+lt(69,0)
+lt(133,80)
+ct(67,147,35,233,35,337)
+ct(35,433,67,514,131,579)
+ct(195,644,271,677,361,677)
+ct(435,677,501,652,560,604)
+ )cp
+dr
+ah((519,554)
+ct(481,612,427,642,359,642)
+ct(328,642,304,638,287,631)
+ct(262,621,240,606,222,584)
+ct(196,556,177,521,165,479)
+ct(153,438,147,392,147,340)
+ct(147,264,159,198,183,141)
+lt(519,554)
+ )cp
+dr
+ah((537,519)
+lt(203,105)
+ct(220,78,239,59,259,47)
+ct(288,29,320,20,356,20)
+ct(390,20,418,25,440,35)
+ct(462,45,482,61,501,83)
+ct(520,104,537,134,550,173)
+ct(564,212,571,261,571,320)
+ct(571,360,568,397,562,431)
+ct(557,456,549,485,537,519)
+ )cp
+endchar;
+
+beginchar(29,889*FX#,662*FY#,0*FY#);
+"AE";
+dr
+ah((501,625)
+lt(501,364)
+lt(626,364)
+ct(664,364,690,371,706,385)
+ct(721,399,730,424,732,460)
+lt(750,460)
+lt(750,230)
+lt(732,230)
+ct(729,263,723,284,717,296)
+ct(710,307,699,316,683,323)
+ct(675,326,656,328,626,328)
+lt(501,328)
+lt(501,109)
+ct(501,79,502,62,504,56)
+ct(507,50,511,45,519,41)
+ct(526,38,539,36,557,36)
+lt(646,36)
+ct(681,36,709,39,728,44)
+ct(747,50,766,62,784,79)
+ct(807,101,826,130,842,166)
+lt(861,166)
+lt(808,0)
+lt(311,0)
+lt(311,18)
+lt(336,18)
+ct(362,18,382,25,395,41)
+ct(403,51,407,76,407,116)
+lt(407,256)
+lt(214,256)
+lt(153,142)
+ct(130,99,119,71,119,58)
+ct(119,48,124,40,134,32)
+ct(144,25,165,20,196,18)
+lt(196,0)
+lt(-11,0)
+lt(-11,18)
+ct(2,18,14,21,25,27)
+ct(35,33,46,43,58,59)
+ct(70,74,85,99,104,133)
+lt(305,510)
+ct(330,556,343,588,343,604)
+ct(343,614,338,622,330,628)
+ct(318,636,294,642,258,644)
+lt(258,662)
+lt(801,662)
+lt(808,516)
+lt(791,516)
+ct(787,549,779,575,767,593)
+ct(758,605,745,615,729,621)
+ct(719,623,697,625,663,625)
+lt(501,625)
+ )cp
+dr
+ah((407,625)
+lt(233,291)
+lt(407,291)
+lt(407,625)
+ )cp
+endchar;
+
+beginchar(229,443*FX#,696*FY#,9*FY#);
+"aring";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((223,696)
+ct(249,696,271,687,290,668)
+ct(308,650,317,628,317,603)
+ct(317,576,308,554,290,536)
+ct(271,518,249,509,223,509)
+ct(197,509,175,518,157,536)
+ct(139,554,130,576,130,603)
+ct(130,628,139,650,157,668)
+ct(175,687,197,696,223,696)
+ )cp
+dr
+ah((223,662)
+ct(207,662,192,656,181,645)
+ct(169,633,164,619,164,603)
+ct(164,586,169,572,181,561)
+ct(192,549,207,543,223,543)
+ct(240,543,254,549,265,561)
+ct(277,572,283,586,283,603)
+ct(283,619,277,633,265,645)
+ct(254,656,240,662,223,662)
+ )cp
+endchar;
+
+beginchar(237,277*FX#,678*FY#,0*FY#);
+"iacute";
+dr
+ah((185,460)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,35,201,28,209,24)
+ct(217,19,232,17,253,17)
+lt(253,0)
+lt(36,0)
+lt(36,17)
+ct(57,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(102,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,100,367)
+ct(97,378,94,385,89,389)
+ct(84,393,77,395,69,395)
+ct(59,395,48,392,36,388)
+lt(29,405)
+lt(164,460)
+lt(185,460)
+ )cp
+dr
+ah((243,678)
+lt(99,510)
+lt(82,510)
+lt(133,678)
+lt(243,678)
+ )cp
+endchar;
+
+beginchar(28,500*FX#,478*FY#,32*FY#);
+"oslash";
+dr
+ah((393,406)
+lt(458,478)
+lt(480,457)
+lt(415,382)
+ct(449,338,466,287,466,230)
+ct(466,192,457,152,438,111)
+ct(419,69,393,38,360,17)
+ct(326,-3,289,-13,247,-13)
+ct(220,-13,196,-9,175,-1)
+ct(154,7,132,21,107,41)
+lt(41,-32)
+lt(19,-11)
+lt(87,65)
+ct(71,86,58,110,49,140)
+ct(40,169,36,196,36,222)
+ct(36,260,45,299,65,339)
+ct(85,378,111,408,145,429)
+ct(178,450,214,460,254,460)
+ct(281,460,305,456,326,447)
+ct(348,439,370,425,393,406)
+ )cp
+dr
+ah((343,351)
+ct(327,380,310,400,294,411)
+ct(278,422,259,428,238,428)
+ct(206,428,179,415,158,389)
+ct(137,363,126,319,126,259)
+ct(126,219,132,176,145,131)
+lt(343,351)
+ )cp
+dr
+ah((357,319)
+lt(160,99)
+ct(177,69,193,49,209,37)
+ct(225,26,244,20,267,20)
+ct(299,20,325,34,345,60)
+ct(366,86,376,131,376,196)
+ct(376,235,369,276,357,319)
+ )cp
+endchar;
+
+beginchar(26,666*FX#,460*FY#,13*FY#);
+"ae";
+dr
+ah((358,276)
+ct(357,259,357,247,357,240)
+ct(357,175,369,128,393,101)
+ct(416,73,446,59,482,59)
+ct(514,59,542,69,568,89)
+ct(584,101,602,127,621,166)
+lt(636,156)
+ct(624,103,599,59,561,24)
+ct(533,0,498,-13,456,-13)
+ct(420,-13,390,-5,365,9)
+ct(353,16,335,34,311,64)
+ct(307,61,298,54,284,43)
+ct(265,27,252,18,246,15)
+ct(231,6,215,0,197,-5)
+ct(180,-11,162,-13,144,-13)
+ct(113,-13,88,-2,67,18)
+ct(46,40,35,66,35,98)
+ct(35,126,42,150,56,170)
+ct(71,190,98,210,140,231)
+ct(190,257,235,277,274,291)
+lt(274,336)
+ct(274,371,268,396,255,410)
+ct(242,425,224,432,203,432)
+ct(181,432,164,426,152,416)
+ct(140,405,134,393,134,381)
+ct(134,354,132,336,130,328)
+ct(127,319,123,313,117,309)
+ct(111,305,104,303,95,303)
+ct(82,303,72,306,65,314)
+ct(55,324,51,336,51,349)
+ct(51,366,57,383,69,400)
+ct(80,417,99,431,125,443)
+ct(150,455,180,460,214,460)
+ct(255,460,285,455,306,443)
+ct(326,432,340,417,346,400)
+ct(362,420,378,434,395,443)
+ct(418,454,446,460,478,460)
+ct(524,460,563,445,592,413)
+ct(621,381,636,336,636,276)
+lt(358,276)
+ )cp
+dr
+ah((358,308)
+lt(542,308)
+ct(542,349,533,379,516,398)
+ct(500,416,478,426,452,426)
+ct(426,426,404,416,386,395)
+ct(368,375,359,346,358,308)
+ )cp
+dr
+ah((297,89)
+ct(291,104,285,123,281,147)
+ct(277,170,274,193,274,216)
+lt(274,259)
+ct(230,245,189,225,153,197)
+ct(129,178,117,154,117,125)
+ct(117,100,125,79,140,62)
+ct(156,46,174,38,196,38)
+ct(208,38,222,41,236,48)
+ct(250,55,271,69,297,89)
+ )cp
+endchar;
+
+beginchar(196,722*FX#,833*FY#,0*FY#);
+"Adieresis";
+dr
+ah((456,221)
+lt(200,221)
+lt(155,117)
+ct(143,91,138,71,138,59)
+ct(138,49,143,40,153,32)
+ct(162,25,183,20,215,18)
+lt(215,0)
+lt(6,0)
+lt(6,18)
+ct(34,22,52,29,60,37)
+ct(76,52,95,84,115,132)
+lt(348,677)
+lt(365,677)
+lt(596,126)
+ct(614,82,631,53,646,40)
+ct(661,27,682,19,709,18)
+lt(709,0)
+lt(448,0)
+lt(448,18)
+ct(475,19,492,23,502,31)
+ct(511,38,516,47,516,58)
+ct(516,72,509,95,496,126)
+lt(456,221)
+ )cp
+dr
+ah((442,257)
+lt(330,525)
+lt(215,257)
+lt(442,257)
+ )cp
+dr
+ah((444,833)
+ct(459,833,471,828,482,818)
+ct(492,807,497,795,497,780)
+ct(497,766,492,753,482,743)
+ct(471,733,459,728,444,728)
+ct(430,728,417,733,407,743)
+ct(396,753,391,766,391,780)
+ct(391,795,396,807,407,818)
+ct(417,828,430,833,444,833)
+ )cp
+dr
+ah((272,833)
+ct(287,833,300,828,310,818)
+ct(320,807,325,795,325,780)
+ct(325,766,320,753,310,743)
+ct(299,733,287,728,272,728)
+ct(258,728,245,733,235,743)
+ct(224,753,219,766,219,780)
+ct(219,795,224,807,235,818)
+ct(245,828,257,833,272,833)
+ )cp
+endchar;
+
+beginchar(236,277*FX#,678*FY#,0*FY#);
+"igrave";
+dr
+ah((185,460)
+lt(185,101)
+ct(185,73,187,54,191,45)
+ct(195,35,201,28,209,24)
+ct(217,19,232,17,253,17)
+lt(253,0)
+lt(36,0)
+lt(36,17)
+ct(57,17,72,19,80,23)
+ct(87,28,93,35,97,44)
+ct(102,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,100,367)
+ct(97,378,94,385,89,389)
+ct(84,393,77,395,69,395)
+ct(59,395,48,392,36,388)
+lt(29,405)
+lt(164,460)
+lt(185,460)
+ )cp
+dr
+ah((37,678)
+lt(146,678)
+lt(198,510)
+lt(181,510)
+lt(37,678)
+ )cp
+endchar;
+
+beginchar(214,722*FX#,833*FY#,15*FY#);
+"Odieresis";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+dr
+ah((443,833)
+ct(458,833,470,828,481,818)
+ct(491,807,496,795,496,780)
+ct(496,766,491,753,481,743)
+ct(470,733,458,728,443,728)
+ct(429,728,416,733,406,743)
+ct(395,753,390,766,390,780)
+ct(390,795,395,807,406,818)
+ct(416,828,429,833,443,833)
+ )cp
+dr
+ah((271,833)
+ct(286,833,299,828,309,818)
+ct(319,807,324,795,324,780)
+ct(324,766,319,753,309,743)
+ct(298,733,286,728,271,728)
+ct(257,728,244,733,234,743)
+ct(223,753,218,766,218,780)
+ct(218,795,223,807,234,818)
+ct(244,828,256,833,271,833)
+ )cp
+endchar;
+
+beginchar(220,722*FX#,833*FY#,15*FY#);
+"Udieresis";
+dr
+ah((477,644)
+lt(477,662)
+lt(711,662)
+lt(711,644)
+lt(686,644)
+ct(660,644,640,633,626,611)
+ct(619,601,616,577,616,541)
+lt(616,272)
+ct(616,206,609,154,596,117)
+ct(583,81,557,49,518,23)
+ct(480,-2,427,-15,361,-15)
+ct(289,-15,234,-3,196,21)
+ct(159,47,132,80,117,123)
+ct(106,151,101,206,101,286)
+lt(101,544)
+ct(101,585,95,612,84,625)
+ct(73,637,55,644,30,644)
+lt(5,644)
+lt(5,662)
+lt(291,662)
+lt(291,644)
+lt(266,644)
+ct(238,644,219,635,207,618)
+ct(199,606,195,581,195,544)
+lt(195,256)
+ct(195,230,197,201,202,167)
+ct(207,134,215,108,228,90)
+ct(240,71,258,56,281,44)
+ct(304,32,333,26,367,26)
+ct(410,26,449,35,483,54)
+ct(517,73,540,97,553,127)
+ct(565,156,572,206,572,276)
+lt(572,544)
+ct(572,585,567,611,558,622)
+ct(545,636,526,644,501,644)
+lt(477,644)
+ )cp
+dr
+ah((468,833)
+ct(483,833,495,828,506,818)
+ct(516,807,521,795,521,780)
+ct(521,766,516,753,506,743)
+ct(495,733,483,728,468,728)
+ct(454,728,441,733,431,743)
+ct(420,753,415,766,415,780)
+ct(415,795,420,807,431,818)
+ct(441,828,454,833,468,833)
+ )cp
+dr
+ah((296,833)
+ct(311,833,323,828,334,818)
+ct(344,807,349,795,349,780)
+ct(349,766,344,753,333,743)
+ct(323,733,311,728,296,728)
+ct(282,728,269,733,259,743)
+ct(248,753,243,766,243,780)
+ct(243,795,248,807,259,818)
+ct(269,828,281,833,296,833)
+ )cp
+endchar;
+
+beginchar(201,610*FX#,877*FY#,0*FY#);
+"Eacute";
+dr
+ah((208,625)
+lt(208,364)
+lt(354,364)
+ct(392,364,417,369,430,381)
+ct(446,395,456,422,458,460)
+lt(476,460)
+lt(476,229)
+lt(458,229)
+ct(453,261,448,282,444,291)
+ct(438,303,429,312,416,318)
+ct(402,325,382,328,354,328)
+lt(208,328)
+lt(208,110)
+ct(208,81,210,63,212,56)
+ct(215,50,220,45,226,41)
+ct(233,38,245,36,263,36)
+lt(375,36)
+ct(413,36,440,38,457,43)
+ct(474,49,490,59,506,74)
+ct(526,94,546,124,568,166)
+lt(587,166)
+lt(530,0)
+lt(20,0)
+lt(20,18)
+lt(43,18)
+ct(59,18,74,21,88,29)
+ct(98,34,105,42,109,52)
+ct(113,63,115,84,115,116)
+lt(115,546)
+ct(115,588,110,614,102,624)
+ct(90,637,70,644,43,644)
+lt(20,644)
+lt(20,662)
+lt(530,662)
+lt(538,517)
+lt(519,517)
+ct(512,551,504,575,496,588)
+ct(488,601,475,611,459,618)
+ct(445,622,422,625,390,625)
+lt(208,625)
+ )cp
+dr
+ah((416,877)
+lt(272,708)
+lt(255,708)
+lt(307,877)
+lt(416,877)
+ )cp
+endchar;
+
+beginchar(239,277*FX#,652*FY#,0*FY#);
+"idieresis";
+dr
+ah((184,460)
+lt(184,101)
+ct(184,73,186,54,190,45)
+ct(195,35,201,28,209,24)
+ct(217,19,231,17,252,17)
+lt(252,0)
+lt(35,0)
+lt(35,17)
+ct(57,17,72,19,79,23)
+ct(87,28,93,35,97,44)
+ct(101,54,104,73,104,101)
+lt(104,273)
+ct(104,321,102,353,99,367)
+ct(97,378,93,385,88,389)
+ct(83,393,77,395,68,395)
+ct(59,395,48,392,35,388)
+lt(28,405)
+lt(163,460)
+lt(184,460)
+ )cp
+dr
+ah((252,652)
+ct(267,652,279,647,289,636)
+ct(300,626,305,613,305,599)
+ct(305,584,300,572,289,561)
+ct(279,551,267,546,252,546)
+ct(237,546,225,551,214,561)
+ct(204,572,199,584,199,599)
+ct(199,613,204,626,214,636)
+ct(225,647,237,652,252,652)
+ )cp
+dr
+ah((80,652)
+ct(95,652,107,647,117,636)
+ct(128,626,133,613,133,599)
+ct(133,584,128,572,117,561)
+ct(107,551,94,546,80,546)
+ct(65,546,53,551,42,561)
+ct(32,572,27,584,27,599)
+ct(27,613,32,626,42,636)
+ct(52,647,65,652,80,652)
+ )cp
+endchar;
+
+beginchar(25,500*FX#,694*FY#,6*FY#);
+"germandbls";
+dr
+ah((17,0)
+lt(17,17)
+ct(36,19,50,22,58,27)
+ct(67,33,72,40,76,49)
+ct(79,58,81,78,81,109)
+lt(81,471)
+ct(81,552,96,610,126,644)
+ct(156,677,199,694,255,694)
+ct(308,694,350,679,381,649)
+ct(412,619,427,581,427,535)
+ct(427,500,418,471,401,447)
+ct(387,429,365,414,334,400)
+ct(378,387,411,365,434,333)
+ct(456,300,467,258,467,206)
+ct(467,149,452,99,423,57)
+ct(393,14,354,-6,304,-6)
+ct(275,-6,253,1,236,17)
+ct(218,32,210,51,210,72)
+ct(210,86,213,96,220,104)
+ct(227,111,237,115,249,115)
+ct(261,115,271,111,278,104)
+ct(285,97,289,88,289,76)
+ct(289,70,288,65,287,60)
+ct(285,52,284,46,284,43)
+ct(284,37,286,31,291,27)
+ct(295,22,302,20,311,20)
+ct(330,20,346,28,359,46)
+ct(375,69,384,104,384,152)
+ct(384,220,372,273,348,313)
+ct(324,353,288,374,240,377)
+lt(240,405)
+ct(275,405,301,415,319,436)
+ct(336,456,345,490,345,538)
+ct(345,581,337,613,320,632)
+ct(302,652,280,662,251,662)
+ct(225,662,204,651,187,630)
+ct(170,610,162,568,162,506)
+lt(162,0)
+lt(17,0)
+ )cp
+endchar;
+
+beginchar(212,722*FX#,875*FY#,15*FY#);
+"Ocircumflex";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+dr
+ah((312,875)
+lt(402,875)
+lt(495,713)
+lt(480,713)
+lt(347,817)
+lt(235,713)
+lt(220,713)
+lt(312,875)
+ )cp
+endchar;
+
+beginchar(193,722*FX#,877*FY#,0*FY#);
+"Aacute";
+dr
+ah((457,221)
+lt(201,221)
+lt(156,117)
+ct(144,91,139,71,139,59)
+ct(139,49,144,40,154,32)
+ct(163,25,184,20,216,18)
+lt(216,0)
+lt(7,0)
+lt(7,18)
+ct(35,22,53,29,61,37)
+ct(77,52,96,84,116,132)
+lt(349,677)
+lt(366,677)
+lt(597,126)
+ct(615,82,632,53,647,40)
+ct(662,27,683,19,710,18)
+lt(710,0)
+lt(449,0)
+lt(449,18)
+ct(476,19,493,23,503,31)
+ct(512,38,517,47,517,58)
+ct(517,72,510,95,497,126)
+lt(457,221)
+ )cp
+dr
+ah((443,257)
+lt(331,525)
+lt(216,257)
+lt(443,257)
+ )cp
+dr
+ah((468,877)
+lt(324,708)
+lt(307,708)
+lt(358,877)
+lt(468,877)
+ )cp
+endchar;
+
+beginchar(195,722*FX#,841*FY#,0*FY#);
+"Atilde";
+dr
+ah((456,221)
+lt(200,221)
+lt(155,117)
+ct(143,91,138,71,138,59)
+ct(138,49,143,40,153,32)
+ct(162,25,183,20,215,18)
+lt(215,0)
+lt(6,0)
+lt(6,18)
+ct(34,22,52,29,60,37)
+ct(76,52,95,84,115,132)
+lt(348,677)
+lt(365,677)
+lt(596,126)
+ct(614,82,631,53,646,40)
+ct(661,27,682,19,709,18)
+lt(709,0)
+lt(448,0)
+lt(448,18)
+ct(475,19,492,23,502,31)
+ct(511,38,516,47,516,58)
+ct(516,72,509,95,496,126)
+lt(456,221)
+ )cp
+dr
+ah((442,257)
+lt(330,525)
+lt(215,257)
+lt(442,257)
+ )cp
+dr
+ah((219,715)
+lt(203,715)
+ct(204,759,214,792,231,812)
+ct(248,831,270,841,295,841)
+ct(308,841,320,839,332,835)
+ct(346,829,367,818,394,800)
+ct(421,782,441,773,454,773)
+ct(464,773,473,778,481,787)
+ct(489,795,495,814,500,841)
+lt(515,841)
+ct(515,811,511,787,503,769)
+ct(495,752,483,738,468,728)
+ct(453,718,438,713,422,713)
+ct(396,713,365,726,327,752)
+ct(306,766,292,774,285,777)
+ct(278,780,271,782,264,782)
+ct(250,782,240,776,232,764)
+ct(228,758,224,742,219,715)
+ )cp
+endchar;
+
+beginchar(227,443*FX#,662*FY#,9*FY#);
+"atilde";
+dr
+ah((284,64)
+ct(238,28,209,8,198,2)
+ct(180,-5,161,-9,142,-9)
+ct(111,-9,85,1,65,22)
+ct(45,43,35,71,35,105)
+ct(35,127,40,146,50,162)
+ct(63,184,86,205,119,225)
+ct(152,244,207,268,284,296)
+lt(284,313)
+ct(284,358,277,389,263,405)
+ct(249,422,228,430,201,430)
+ct(180,430,164,424,152,414)
+ct(140,402,134,389,134,375)
+lt(135,347)
+ct(135,332,131,321,123,312)
+ct(116,304,106,300,93,300)
+ct(81,300,71,305,64,313)
+ct(56,321,52,333,52,348)
+ct(52,376,67,401,95,425)
+ct(124,448,164,460,216,460)
+ct(255,460,287,453,313,440)
+ct(332,430,346,414,356,393)
+ct(362,379,365,350,365,307)
+lt(365,155)
+ct(365,112,366,86,367,76)
+ct(369,67,371,60,375,57)
+ct(379,54,383,52,388,52)
+ct(393,52,398,53,402,56)
+ct(408,60,421,71,441,91)
+lt(441,64)
+ct(405,16,370,-8,337,-8)
+ct(321,-8,308,-3,299,7)
+ct(289,18,284,37,284,64)
+ )cp
+dr
+ah((284,96)
+lt(284,266)
+ct(234,246,203,233,189,225)
+ct(163,210,145,195,134,180)
+ct(123,164,117,147,117,128)
+ct(117,105,124,86,138,70)
+ct(152,55,168,47,187,47)
+ct(211,47,244,63,284,96)
+ )cp
+dr
+ah((83,535)
+lt(67,535)
+ct(69,580,78,612,95,632)
+ct(112,652,134,662,159,662)
+ct(172,662,184,659,196,655)
+ct(210,650,231,638,258,620)
+ct(285,603,305,594,318,594)
+ct(328,594,337,598,345,607)
+ct(353,616,360,634,364,662)
+lt(379,662)
+ct(380,631,376,607,367,590)
+ct(359,572,347,558,332,548)
+ct(317,538,302,533,287,533)
+ct(261,533,229,546,191,572)
+ct(170,586,157,595,149,598)
+ct(142,601,135,602,128,602)
+ct(114,602,104,596,97,584)
+ct(93,578,88,562,83,535)
+ )cp
+endchar;
+
+beginchar(205,333*FX#,877*FY#,0*FY#);
+"Iacute";
+dr
+ah((308,18)
+lt(308,0)
+lt(24,0)
+lt(24,18)
+lt(48,18)
+ct(75,18,95,25,107,41)
+ct(115,51,119,77,119,117)
+lt(119,544)
+ct(119,578,117,600,113,611)
+ct(109,619,103,626,93,632)
+ct(78,640,63,644,48,644)
+lt(24,644)
+lt(24,662)
+lt(308,662)
+lt(308,644)
+lt(284,644)
+ct(257,644,237,636,225,620)
+ct(217,609,213,584,213,544)
+lt(213,117)
+ct(213,83,215,60,219,50)
+ct(222,42,229,35,240,29)
+ct(254,21,268,18,284,18)
+lt(308,18)
+ )cp
+dr
+ah((275,877)
+lt(131,708)
+lt(115,708)
+lt(166,877)
+lt(275,877)
+ )cp
+endchar;
+
+beginchar(204,333*FX#,877*FY#,0*FY#);
+"Igrave";
+dr
+ah((308,18)
+lt(308,0)
+lt(24,0)
+lt(24,18)
+lt(48,18)
+ct(75,18,95,25,107,41)
+ct(115,51,119,77,119,117)
+lt(119,544)
+ct(119,578,117,600,113,611)
+ct(109,619,103,626,93,632)
+ct(78,640,63,644,48,644)
+lt(24,644)
+lt(24,662)
+lt(308,662)
+lt(308,644)
+lt(284,644)
+ct(257,644,237,636,225,620)
+ct(217,609,213,584,213,544)
+lt(213,117)
+ct(213,83,215,60,219,50)
+ct(222,42,229,35,240,29)
+ct(254,21,268,18,284,18)
+lt(308,18)
+ )cp
+dr
+ah((58,877)
+lt(166,877)
+lt(218,708)
+lt(201,708)
+lt(58,877)
+ )cp
+endchar;
+
+beginchar(211,722*FX#,877*FY#,15*FY#);
+"Oacute";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+dr
+ah((467,877)
+lt(323,708)
+lt(306,708)
+lt(357,877)
+lt(467,877)
+ )cp
+endchar;
+
+beginchar(210,722*FX#,877*FY#,15*FY#);
+"Ograve";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+dr
+ah((249,877)
+lt(358,877)
+lt(410,708)
+lt(393,708)
+lt(249,877)
+ )cp
+endchar;
+
+beginchar(213,722*FX#,841*FY#,15*FY#);
+"Otilde";
+dr
+ah((365,677)
+ct(451,677,526,644,589,579)
+ct(652,514,683,432,683,334)
+ct(683,234,651,150,588,84)
+ct(524,18,448,-15,357,-15)
+ct(266,-15,190,17,128,82)
+ct(66,146,35,230,35,333)
+ct(35,438,70,524,142,590)
+ct(204,648,278,677,365,677)
+ )cp
+dr
+ah((356,641)
+ct(296,641,249,619,213,575)
+ct(168,520,146,440,146,335)
+ct(146,227,169,143,216,85)
+ct(251,41,298,19,356,19)
+ct(419,19,470,43,510,92)
+ct(551,140,571,217,571,321)
+ct(571,434,548,519,504,575)
+ct(468,619,419,641,356,641)
+ )cp
+dr
+ah((217,715)
+lt(202,715)
+ct(203,759,212,792,229,812)
+ct(247,831,268,841,293,841)
+ct(306,841,318,839,330,835)
+ct(345,829,365,818,392,800)
+ct(419,782,439,773,452,773)
+ct(463,773,472,778,480,787)
+ct(488,795,494,814,499,841)
+lt(514,841)
+ct(514,811,510,787,502,769)
+ct(493,752,482,738,467,728)
+ct(451,718,436,713,421,713)
+ct(395,713,363,726,325,752)
+ct(305,766,291,774,284,777)
+ct(277,780,270,782,263,782)
+ct(249,782,239,776,231,764)
+ct(227,758,223,742,217,715)
+ )cp
+endchar;
+
+beginchar(245,500*FX#,662*FY#,13*FY#);
+"otilde";
+dr
+ah((250,460)
+ct(317,460,371,434,413,383)
+ct(447,339,465,288,465,231)
+ct(465,191,455,151,436,110)
+ct(417,69,390,38,357,17)
+ct(323,-3,285,-13,244,-13)
+ct(176,-13,123,13,83,66)
+ct(49,111,33,162,33,219)
+ct(33,260,43,301,64,341)
+ct(84,382,111,412,144,431)
+ct(177,450,212,460,250,460)
+ )cp
+dr
+ah((234,428)
+ct(217,428,200,423,182,413)
+ct(165,403,151,385,140,359)
+ct(129,333,124,300,124,260)
+ct(124,195,137,138,163,91)
+ct(189,44,223,20,265,20)
+ct(297,20,323,34,343,60)
+ct(364,86,374,130,374,194)
+ct(374,273,357,335,323,381)
+ct(299,412,270,428,234,428)
+ )cp
+dr
+ah((109,535)
+lt(93,535)
+ct(95,580,104,612,121,632)
+ct(138,652,160,662,185,662)
+ct(198,662,210,659,222,655)
+ct(236,650,257,638,284,620)
+ct(311,603,331,594,344,594)
+ct(354,594,363,598,371,607)
+ct(379,616,386,634,390,662)
+lt(405,662)
+ct(406,631,402,607,393,590)
+ct(385,572,373,558,358,548)
+ct(343,538,328,533,312,533)
+ct(286,533,255,546,217,572)
+ct(196,586,182,595,175,598)
+ct(168,601,161,602,154,602)
+ct(140,602,130,596,123,584)
+ct(119,578,114,562,109,535)
+ )cp
+endchar;
+
+beginchar(153,556*FX#,875*FY#,15*FY#);
+"Scaron";
+dr
+ah((457,677)
+lt(457,448)
+lt(439,448)
+ct(433,492,423,527,407,553)
+ct(392,579,371,599,343,615)
+ct(315,630,286,638,256,638)
+ct(222,638,194,627,172,607)
+ct(150,586,139,562,139,536)
+ct(139,516,146,497,160,481)
+ct(180,456,228,423,304,383)
+ct(366,350,408,325,430,307)
+ct(453,289,470,268,483,244)
+ct(495,220,501,195,501,168)
+ct(501,118,482,75,443,39)
+ct(404,3,354,-15,292,-15)
+ct(273,-15,255,-13,238,-10)
+ct(228,-9,207,-3,176,7)
+ct(144,17,124,22,115,22)
+ct(107,22,101,20,96,15)
+ct(91,10,88,0,85,-15)
+lt(67,-15)
+lt(67,211)
+lt(85,211)
+ct(94,164,105,128,120,105)
+ct(134,81,156,62,185,46)
+ct(215,30,247,22,282,22)
+ct(323,22,355,33,379,55)
+ct(402,76,414,102,414,131)
+ct(414,147,410,164,401,180)
+ct(392,197,378,212,359,227)
+ct(346,236,312,257,255,289)
+ct(198,321,158,346,134,365)
+ct(110,384,92,404,80,427)
+ct(67,450,61,475,61,502)
+ct(61,550,79,591,116,625)
+ct(152,660,199,677,255,677)
+ct(290,677,327,668,367,651)
+ct(385,643,397,639,405,639)
+ct(414,639,421,641,426,646)
+ct(431,651,436,661,439,677)
+lt(457,677)
+ )cp
+dr
+ah((320,713)
+lt(230,713)
+lt(138,875)
+lt(153,875)
+lt(286,771)
+lt(398,875)
+lt(413,875)
+lt(320,713)
+ )cp
+endchar;
+
+beginchar(156,389*FX#,676*FY#,13*FY#);
+"scaron";
+dr
+ah((320,460)
+lt(320,308)
+lt(304,308)
+ct(291,355,275,388,256,405)
+ct(237,423,212,431,182,431)
+ct(159,431,141,425,127,413)
+ct(113,401,106,388,106,373)
+ct(106,355,111,339,122,326)
+ct(132,312,152,298,183,284)
+lt(254,249)
+ct(320,217,354,174,354,122)
+ct(354,81,338,48,307,23)
+ct(277,-1,242,-13,204,-13)
+ct(176,-13,145,-8,110,0)
+ct(99,3,90,5,84,5)
+ct(76,5,70,1,66,-6)
+lt(50,-6)
+lt(50,152)
+lt(66,152)
+ct(76,107,93,72,119,49)
+ct(144,26,173,15,205,15)
+ct(228,15,246,21,260,34)
+ct(274,48,281,63,281,82)
+ct(281,104,273,123,258,139)
+ct(242,154,210,173,163,197)
+ct(116,220,85,241,70,260)
+ct(55,278,48,302,48,331)
+ct(48,367,61,398,86,423)
+ct(111,448,144,460,184,460)
+ct(201,460,222,456,248,449)
+ct(264,443,275,441,281,441)
+ct(286,441,291,443,293,445)
+ct(296,447,300,452,304,460)
+lt(320,460)
+ )cp
+dr
+ah((239,514)
+lt(149,514)
+lt(57,676)
+lt(72,676)
+lt(205,572)
+lt(317,676)
+lt(332,676)
+lt(239,514)
+ )cp
+endchar;
+
+beginchar(218,722*FX#,877*FY#,15*FY#);
+"Uacute";
+dr
+ah((477,644)
+lt(477,662)
+lt(711,662)
+lt(711,644)
+lt(686,644)
+ct(660,644,640,633,626,611)
+ct(619,601,616,577,616,541)
+lt(616,272)
+ct(616,206,609,154,596,117)
+ct(583,81,557,49,518,23)
+ct(480,-2,427,-15,361,-15)
+ct(289,-15,234,-3,196,21)
+ct(159,47,132,80,117,123)
+ct(106,151,101,206,101,286)
+lt(101,544)
+ct(101,585,95,612,84,625)
+ct(73,637,55,644,30,644)
+lt(5,644)
+lt(5,662)
+lt(291,662)
+lt(291,644)
+lt(266,644)
+ct(238,644,219,635,207,618)
+ct(199,606,195,581,195,544)
+lt(195,256)
+ct(195,230,197,201,202,167)
+ct(207,134,215,108,228,90)
+ct(240,71,258,56,281,44)
+ct(304,32,333,26,367,26)
+ct(410,26,449,35,483,54)
+ct(517,73,540,97,553,127)
+ct(565,156,572,206,572,276)
+lt(572,544)
+ct(572,585,567,611,558,622)
+ct(545,636,526,644,501,644)
+lt(477,644)
+ )cp
+dr
+ah((468,877)
+lt(324,708)
+lt(308,708)
+lt(359,877)
+lt(468,877)
+ )cp
+endchar;
+
+beginchar(154,722*FX#,833*FY#,0*FY#);
+"Ydieresis";
+dr
+ah((476,662)
+lt(707,662)
+lt(707,644)
+lt(694,644)
+ct(686,644,673,640,657,632)
+ct(641,625,626,614,613,600)
+ct(599,586,583,563,563,532)
+lt(404,280)
+lt(404,114)
+ct(404,73,408,48,417,38)
+ct(429,24,449,18,476,18)
+lt(498,18)
+lt(498,0)
+lt(216,0)
+lt(216,18)
+lt(240,18)
+ct(268,18,287,26,299,43)
+ct(306,53,310,77,310,114)
+lt(310,271)
+lt(128,548)
+ct(107,581,92,601,85,609)
+ct(77,618,61,627,37,639)
+ct(30,642,21,644,9,644)
+lt(9,662)
+lt(292,662)
+lt(292,644)
+lt(277,644)
+ct(262,644,248,640,235,633)
+ct(222,626,216,615,216,601)
+ct(216,589,226,567,246,537)
+lt(384,324)
+lt(514,528)
+ct(533,558,543,581,543,596)
+ct(543,605,541,613,536,621)
+ct(531,628,524,633,516,637)
+ct(507,642,494,644,476,644)
+lt(476,662)
+ )cp
+dr
+ah((457,833)
+ct(471,833,484,828,494,818)
+ct(504,807,509,795,509,780)
+ct(509,766,504,753,494,743)
+ct(484,733,471,728,457,728)
+ct(442,728,429,733,419,743)
+ct(409,753,403,766,403,780)
+ct(403,795,409,807,419,818)
+ct(429,828,442,833,457,833)
+ )cp
+dr
+ah((284,833)
+ct(299,833,312,828,322,818)
+ct(332,807,337,795,337,780)
+ct(337,766,332,753,322,743)
+ct(311,733,299,728,285,728)
+ct(270,728,257,733,247,743)
+ct(237,753,231,766,231,780)
+ct(231,795,237,807,247,818)
+ct(257,828,270,833,284,833)
+ )cp
+endchar;
+
+beginchar(255,500*FX#,652*FY#,215*FY#);
+"ydieresis";
+dr
+ah((5,447)
+lt(214,447)
+lt(214,429)
+lt(204,429)
+ct(189,429,178,426,171,419)
+ct(163,413,160,405,160,395)
+ct(160,382,165,365,176,343)
+lt(285,117)
+lt(385,364)
+ct(390,377,393,390,393,404)
+ct(393,410,392,414,390,417)
+ct(387,421,383,423,377,426)
+ct(372,428,362,429,348,429)
+lt(348,447)
+lt(494,447)
+lt(494,429)
+ct(482,427,472,425,466,421)
+ct(459,417,452,410,444,399)
+ct(441,394,436,381,428,361)
+lt(246,-84)
+ct(228,-127,205,-160,177,-182)
+ct(148,-204,121,-215,94,-215)
+ct(75,-215,59,-210,47,-199)
+ct(34,-188,28,-175,28,-161)
+ct(28,-147,33,-136,42,-128)
+ct(51,-119,63,-115,79,-115)
+ct(89,-115,104,-118,123,-126)
+ct(135,-130,143,-133,147,-133)
+ct(157,-133,167,-128,179,-118)
+ct(190,-108,202,-89,214,-60)
+lt(246,17)
+lt(85,354)
+ct(80,364,72,377,62,392)
+ct(53,403,46,411,41,415)
+ct(33,420,21,425,5,429)
+lt(5,447)
+ )cp
+dr
+ah((354,652)
+ct(368,652,381,647,391,637)
+ct(401,626,406,614,406,599)
+ct(406,584,401,572,391,562)
+ct(381,552,368,546,354,546)
+ct(339,546,326,552,316,562)
+ct(305,572,300,584,300,599)
+ct(300,614,305,626,316,637)
+ct(326,647,339,652,354,652)
+ )cp
+dr
+ah((181,652)
+ct(196,652,209,647,219,637)
+ct(229,626,234,614,234,599)
+ct(234,584,229,572,219,562)
+ct(208,552,196,546,182,546)
+ct(167,546,154,552,144,562)
+ct(134,572,128,584,128,599)
+ct(128,614,134,626,144,637)
+ct(154,647,166,652,181,652)
+ )cp
+endchar;
+
+beginchar(30,889*FX#,667*FY#,7*FY#);
+"OE";
+dr
+ah((539,625)
+lt(539,364)
+lt(628,364)
+ct(665,364,692,372,708,387)
+ct(723,403,731,427,730,460)
+lt(750,460)
+lt(750,229)
+lt(730,229)
+ct(728,270,719,296,706,309)
+ct(692,322,666,328,628,328)
+lt(539,328)
+lt(539,109)
+ct(539,83,540,66,543,59)
+ct(547,51,552,45,560,41)
+ct(564,38,577,37,597,37)
+lt(648,37)
+ct(687,37,714,39,730,43)
+ct(745,47,761,57,778,72)
+ct(802,94,823,125,841,166)
+lt(860,166)
+lt(808,0)
+lt(571,0)
+ct(525,0,497,0,487,0)
+ct(483,0,456,-1,406,-4)
+ct(370,-6,347,-7,335,-7)
+ct(280,-7,230,6,184,33)
+ct(139,61,103,102,76,156)
+ct(49,209,36,267,36,330)
+ct(36,414,59,488,105,552)
+ct(159,628,240,667,346,667)
+ct(353,667,384,666,440,664)
+ct(486,662,529,662,571,662)
+lt(802,662)
+lt(808,516)
+lt(792,516)
+ct(784,554,777,579,771,589)
+ct(763,601,750,611,733,619)
+ct(722,623,699,625,664,625)
+lt(539,625)
+ )cp
+dr
+ah((445,508)
+ct(445,551,442,579,436,592)
+ct(430,606,421,616,410,622)
+ct(393,631,372,636,348,636)
+ct(307,636,272,624,241,601)
+ct(210,577,187,540,172,491)
+ct(156,442,148,387,148,326)
+ct(148,275,155,226,169,179)
+ct(183,131,205,94,235,67)
+ct(266,40,302,26,346,26)
+ct(370,26,390,31,405,39)
+ct(420,47,431,59,436,74)
+ct(442,89,445,119,445,166)
+lt(445,508)
+ )cp
+endchar;
+
+beginchar(27,722*FX#,460*FY#,13*FY#);
+"oe";
+dr
+ah((421,279)
+ct(420,271,420,265,420,261)
+ct(420,230,425,198,436,165)
+ct(447,132,463,107,485,91)
+ct(506,75,530,66,556,66)
+ct(582,66,605,75,625,91)
+ct(645,108,661,135,672,173)
+lt(688,165)
+ct(677,102,656,56,627,28)
+ct(598,0,563,-13,522,-13)
+ct(491,-13,464,-6,442,9)
+ct(419,24,402,43,391,64)
+ct(371,38,348,19,322,6)
+ct(296,-7,267,-13,236,-13)
+ct(179,-13,130,7,91,49)
+ct(52,90,32,146,32,216)
+ct(32,290,52,350,93,394)
+ct(133,438,181,460,239,460)
+ct(274,460,304,453,330,438)
+ct(355,424,376,406,391,383)
+ct(410,410,430,430,452,442)
+ct(473,454,499,460,529,460)
+ct(577,460,616,444,646,412)
+ct(676,380,690,335,688,279)
+lt(421,279)
+ )cp
+dr
+ah((221,433)
+ct(209,433,195,429,179,420)
+ct(163,412,150,397,142,376)
+ct(130,348,124,311,124,263)
+ct(124,179,140,112,173,64)
+ct(193,34,218,20,248,20)
+ct(277,20,301,33,320,57)
+ct(339,81,349,123,349,184)
+ct(349,260,338,320,316,365)
+ct(294,411,262,433,221,433)
+ )cp
+dr
+ah((421,311)
+lt(592,311)
+ct(592,333,589,355,581,376)
+ct(575,392,565,405,551,414)
+ct(537,423,522,428,507,428)
+ct(485,428,466,418,449,398)
+ct(432,379,423,350,421,311)
+ )cp
+endchar;
+
+beginchar(182,453*FX#,662*FY#,215*FY#);
+"paragraph";
+dr
+ah((389,635)
+lt(389,-215)
+lt(354,-215)
+lt(354,635)
+lt(263,635)
+lt(263,-215)
+lt(227,-215)
+lt(227,293)
+ct(165,296,118,304,88,318)
+ct(57,331,33,353,17,382)
+ct(1,410,-6,443,-6,479)
+ct(-6,514,0,543,14,566)
+ct(33,598,58,621,89,637)
+ct(121,654,162,662,212,662)
+lt(454,662)
+lt(454,635)
+lt(389,635)
+ )cp
+endchar;
+
+beginchar(139,500*FX#,685*FY#,205*FY#);
+"dagger";
+dr
+ah((255,-205)
+lt(237,-205)
+ct(235,-63,230,50,222,137)
+ct(214,201,203,263,188,321)
+ct(205,336,216,351,224,367)
+ct(231,383,235,406,237,437)
+ct(216,435,195,429,173,420)
+ct(139,405,114,398,98,398)
+ct(83,398,72,403,62,412)
+ct(53,420,49,431,49,445)
+ct(49,458,54,470,63,479)
+ct(73,489,85,493,99,493)
+ct(107,493,114,492,122,490)
+ct(125,489,142,482,173,469)
+ct(192,460,213,455,237,454)
+ct(237,467,236,477,234,484)
+ct(231,494,226,508,219,526)
+ct(201,568,193,599,193,621)
+ct(193,640,198,655,209,667)
+ct(220,679,233,685,248,685)
+ct(261,685,274,678,284,666)
+ct(295,654,301,639,301,621)
+ct(301,611,299,601,297,592)
+ct(294,579,286,559,275,531)
+ct(263,502,257,477,255,454)
+ct(278,456,300,461,320,469)
+ct(352,481,370,488,376,490)
+ct(383,492,390,493,398,493)
+ct(414,493,426,488,436,479)
+ct(445,470,450,458,450,445)
+ct(450,432,445,421,436,412)
+ct(426,402,414,398,400,398)
+ct(382,398,355,405,319,421)
+ct(304,427,292,431,286,433)
+ct(279,435,269,436,255,437)
+ct(257,406,261,383,269,366)
+ct(276,350,288,335,304,321)
+ct(289,262,278,203,271,144)
+ct(265,85,260,-31,255,-205)
+ )cp
+endchar;
+
+beginchar(140,500*FX#,694*FY#,215*FY#);
+"daggerdbl";
+dr
+ah((258,476)
+ct(261,455,265,439,271,428)
+ct(277,418,288,406,304,393)
+ct(288,369,276,346,269,323)
+ct(262,300,258,271,258,236)
+ct(258,203,262,176,269,154)
+ct(275,131,287,108,304,83)
+ct(289,69,278,57,272,47)
+ct(266,36,261,20,258,0)
+ct(271,1,280,3,286,5)
+ct(292,6,303,11,321,18)
+ct(348,29,370,35,386,35)
+ct(400,35,410,31,419,23)
+ct(427,15,432,5,432,-7)
+ct(432,-20,427,-31,419,-39)
+ct(410,-48,400,-52,387,-52)
+ct(373,-52,353,-46,325,-34)
+ct(309,-27,297,-23,289,-21)
+ct(281,-19,271,-18,258,-18)
+ct(261,-37,263,-51,265,-57)
+ct(266,-63,270,-72,275,-84)
+ct(291,-120,299,-146,299,-164)
+ct(299,-179,295,-191,285,-201)
+ct(276,-210,264,-215,250,-215)
+ct(236,-215,225,-210,215,-200)
+ct(206,-190,201,-178,201,-163)
+ct(201,-155,202,-147,204,-138)
+ct(206,-130,213,-111,224,-83)
+ct(231,-61,236,-40,239,-18)
+ct(224,-18,213,-20,204,-21)
+ct(196,-23,184,-28,168,-35)
+ct(143,-46,125,-52,113,-52)
+ct(99,-52,89,-48,81,-40)
+ct(72,-32,68,-21,68,-9)
+ct(68,4,73,14,81,23)
+ct(90,31,101,35,115,35)
+ct(128,35,146,30,170,20)
+ct(186,12,198,8,208,6)
+ct(214,4,225,3,239,3)
+ct(236,23,231,38,225,48)
+ct(219,58,208,70,192,83)
+ct(206,102,217,121,224,141)
+ct(234,171,239,204,239,242)
+ct(239,280,234,313,224,342)
+ct(217,359,206,376,192,393)
+ct(208,405,218,416,224,427)
+ct(230,437,235,454,239,476)
+ct(225,475,216,474,210,472)
+ct(204,471,190,466,168,457)
+ct(145,448,126,443,110,443)
+ct(98,443,88,447,80,456)
+ct(71,464,67,474,67,486)
+ct(67,498,71,508,79,516)
+ct(87,524,97,528,110,528)
+ct(124,528,146,522,174,512)
+ct(190,504,203,500,211,499)
+ct(217,497,226,495,239,495)
+ct(238,509,237,519,235,525)
+ct(231,538,223,559,213,588)
+ct(206,605,202,615,202,618)
+ct(200,623,200,630,200,640)
+ct(200,656,204,669,214,679)
+ct(223,689,235,694,249,694)
+ct(263,694,274,689,283,680)
+ct(292,670,296,656,296,638)
+ct(296,628,295,619,294,613)
+ct(292,606,286,592,276,569)
+ct(266,546,260,521,258,495)
+ct(273,496,283,497,289,498)
+ct(295,500,308,504,326,512)
+ct(350,522,371,528,388,528)
+ct(401,528,411,524,419,516)
+ct(428,508,432,498,432,486)
+ct(432,473,427,463,419,455)
+ct(410,446,399,442,386,442)
+ct(370,442,350,447,324,458)
+ct(308,466,296,471,290,472)
+ct(283,474,273,475,258,476)
+ )cp
+endchar;
+
+beginchar(124,1000*FX#,257*FY#,0*FY#);
+"emdash";
+dr
+ah((1008,221)
+lt(-9,221)
+lt(-9,257)
+lt(1008,257)
+lt(1008,221)
+ )cp
+endchar;
+
+beginchar(170,275*FX#,675*FY#,0*FY#);
+"ordfeminine";
+dr
+ah((166,576)
+ct(166,611,161,634,153,645)
+ct(144,656,131,662,114,662)
+ct(98,662,87,658,79,651)
+ct(72,644,68,633,68,618)
+ct(68,604,65,593,60,586)
+ct(54,579,48,576,40,576)
+ct(32,576,26,579,20,584)
+ct(15,590,12,597,12,605)
+ct(12,623,21,639,40,654)
+ct(58,668,87,675,126,675)
+ct(156,675,179,670,196,660)
+ct(212,650,222,640,226,629)
+ct(231,618,233,600,233,576)
+lt(233,469)
+ct(233,451,233,441,234,439)
+ct(234,435,236,432,239,430)
+ct(241,428,244,427,246,427)
+ct(250,427,259,431,274,441)
+lt(274,418)
+ct(250,401,234,390,226,387)
+ct(218,384,210,382,201,382)
+ct(193,382,186,385,179,392)
+ct(173,399,168,411,166,428)
+ct(145,414,126,402,108,395)
+ct(91,388,75,384,61,384)
+ct(43,384,28,390,16,402)
+ct(3,415,-2,429,-2,444)
+ct(-2,458,1,471,7,482)
+ct(17,496,34,511,60,527)
+ct(76,537,112,553,166,576)
+ )cp
+dr
+ah((166,557)
+ct(126,544,100,530,86,514)
+ct(72,499,64,483,64,467)
+ct(64,456,69,446,77,438)
+ct(85,430,96,425,108,425)
+ct(115,425,123,427,133,431)
+ct(143,434,153,440,166,447)
+lt(166,557)
+ )cp
+endchar;
+
+beginchar(186,310*FX#,675*FY#,0*FY#);
+"ordmasculine";
+dr
+ah((158,675)
+ct(198,675,232,662,258,634)
+ct(285,607,298,573,298,532)
+ct(298,492,283,457,254,428)
+ct(225,398,191,384,151,384)
+ct(113,384,80,397,54,424)
+ct(27,450,14,484,14,524)
+ct(14,569,27,606,54,634)
+ct(81,661,115,675,158,675)
+ )cp
+dr
+ah((144,654)
+ct(127,654,113,647,101,632)
+ct(89,618,83,594,83,562)
+ct(83,510,94,469,116,437)
+ct(128,418,145,409,166,409)
+ct(185,409,200,416,212,430)
+ct(224,445,230,468,230,499)
+ct(230,550,218,592,196,624)
+ct(181,644,164,654,144,654)
+ )cp
+endchar;
+
+beginchar(171,500*FX#,456*FY#,3*FY#);
+"guillemotleft";
+dr
+ah((248,-3)
+lt(220,-3)
+lt(31,226)
+lt(220,456)
+lt(248,456)
+lt(128,226)
+lt(248,-3)
+ )cp
+dr
+ah((468,-3)
+lt(440,-3)
+lt(248,226)
+lt(440,456)
+lt(468,456)
+lt(350,226)
+lt(468,-3)
+ )cp
+endchar;
+
+beginchar(187,500*FX#,456*FY#,3*FY#);
+"guillemotright";
+dr
+ah((251,456)
+lt(279,456)
+lt(468,225)
+lt(279,-3)
+lt(251,-3)
+lt(371,225)
+lt(251,456)
+ )cp
+dr
+ah((31,456)
+lt(59,456)
+lt(251,225)
+lt(59,-3)
+lt(31,-3)
+lt(149,225)
+lt(31,456)
+ )cp
+endchar;
+
+beginchar(145,1000*FX#,94*FY#,13*FY#);
+"ellipsis";
+dr
+ah((166,94)
+ct(181,94,194,89,205,78)
+ct(215,68,220,55,220,40)
+ct(220,25,215,12,204,2)
+ct(194,-8,181,-13,166,-13)
+ct(151,-13,138,-8,128,2)
+ct(117,12,112,25,112,40)
+ct(112,55,117,68,128,79)
+ct(138,89,151,94,166,94)
+ )cp
+dr
+ah((500,94)
+ct(514,94,527,89,538,78)
+ct(548,68,554,55,554,40)
+ct(554,25,548,12,538,2)
+ct(527,-8,514,-13,500,-13)
+ct(485,-13,472,-8,461,2)
+ct(451,12,445,25,445,40)
+ct(445,55,451,68,461,79)
+ct(472,89,485,94,500,94)
+ )cp
+dr
+ah((833,94)
+ct(848,94,861,89,871,78)
+ct(882,68,887,55,887,40)
+ct(887,25,882,12,871,2)
+ct(861,-8,848,-13,833,-13)
+ct(818,-13,805,-8,795,2)
+ct(784,12,779,25,779,40)
+ct(779,55,784,68,794,79)
+ct(805,89,818,94,833,94)
+ )cp
+endchar;
+
+beginchar(166,200*FX#,694*FY#,215*FY#);
+"brokenbar";
+dr
+ah((119,694)
+lt(119,332)
+lt(78,332)
+lt(78,694)
+lt(119,694)
+ )cp
+dr
+ah((119,146)
+lt(119,-215)
+lt(78,-215)
+lt(78,146)
+lt(119,146)
+ )cp
+endchar;
+
+beginchar(172,563*FX#,428*FY#,0*FY#);
+"logicalnot";
+dr
+ah((17,428)
+lt(544,428)
+lt(544,230)
+lt(506,230)
+lt(506,389)
+lt(17,389)
+lt(17,428)
+ )cp
+endchar;
+
+beginchar(173,1*FX#,0*FY#,0*FY#);
+"minus";
+endchar;
+
+beginchar(176,399*FX#,676*FY#,0*FY#);
+"degree";
+dr
+ah((197,676)
+ct(239,676,275,662,304,632)
+ct(333,603,348,568,348,526)
+ct(348,485,333,449,304,420)
+ct(274,391,239,376,197,376)
+ct(156,376,121,391,91,420)
+ct(62,449,47,485,47,526)
+ct(47,568,62,603,91,632)
+ct(120,662,156,676,197,676)
+ )cp
+dr
+ah((197,635)
+ct(167,635,141,625,120,604)
+ct(99,582,88,557,88,526)
+ct(88,496,99,471,120,449)
+ct(141,428,167,417,197,417)
+ct(227,417,253,428,274,449)
+ct(295,471,306,496,306,526)
+ct(306,557,296,582,274,604)
+ct(253,625,228,635,197,635)
+ )cp
+endchar;
+
+beginchar(178,299*FX#,675*FY#,0*FY#);
+"twosuperior";
+dr
+ah((280,398)
+lt(250,324)
+lt(9,324)
+lt(9,338)
+ct(89,400,143,451,169,491)
+ct(185,515,194,538,194,561)
+ct(194,580,187,597,174,611)
+ct(160,624,143,631,123,631)
+ct(104,631,88,626,74,616)
+ct(60,607,49,592,42,573)
+lt(20,573)
+ct(25,605,37,630,58,648)
+ct(79,666,105,675,138,675)
+ct(173,675,201,666,222,647)
+ct(244,628,255,607,255,583)
+ct(255,561,247,539,231,515)
+ct(207,477,159,429,87,371)
+lt(178,371)
+ct(207,371,225,373,235,376)
+ct(244,380,252,388,258,398)
+lt(280,398)
+ )cp
+endchar;
+
+beginchar(179,299*FX#,675*FY#,0*FY#);
+"threesuperior";
+dr
+ah((26,600)
+ct(38,624,51,641,66,652)
+ct(86,667,111,675,139,675)
+ct(169,675,192,668,209,653)
+ct(227,638,235,621,235,604)
+ct(235,581,218,556,184,528)
+ct(208,519,225,507,237,491)
+ct(249,476,255,458,255,439)
+ct(255,405,241,377,213,353)
+ct(185,328,145,316,93,316)
+ct(65,316,46,320,34,328)
+ct(25,333,21,339,21,347)
+ct(21,353,24,358,29,362)
+ct(34,367,41,369,50,369)
+ct(59,369,72,365,89,357)
+ct(107,350,121,346,134,346)
+ct(152,346,168,352,181,365)
+ct(194,378,200,393,200,410)
+ct(200,425,196,439,187,452)
+ct(179,465,167,475,154,480)
+ct(134,487,117,491,102,491)
+lt(87,491)
+lt(87,505)
+ct(112,505,133,513,150,528)
+ct(167,543,176,561,176,581)
+ct(176,597,170,610,160,620)
+ct(149,630,135,635,117,635)
+ct(89,635,65,620,45,592)
+lt(26,600)
+ )cp
+endchar;
+
+beginchar(185,299*FX#,675*FY#,0*FY#);
+"onesuperior";
+dr
+ah((66,633)
+lt(166,675)
+lt(183,675)
+lt(183,386)
+ct(183,366,184,354,186,350)
+ct(187,347,190,345,194,343)
+ct(199,340,212,339,232,339)
+lt(232,324)
+lt(74,324)
+lt(74,339)
+ct(94,339,107,340,113,343)
+ct(117,344,119,347,121,351)
+ct(123,354,124,366,124,386)
+lt(124,569)
+ct(124,592,123,607,121,615)
+ct(120,620,118,624,116,626)
+ct(114,628,110,629,106,629)
+ct(100,629,89,625,74,619)
+lt(66,633)
+ )cp
+endchar;
+
+beginchar(188,750*FX#,675*FY#,26*FY#);
+"onequarter";
+dr
+ah((65,633)
+lt(165,675)
+lt(182,675)
+lt(182,386)
+ct(182,366,183,354,185,350)
+ct(186,347,189,345,193,343)
+ct(198,340,211,339,231,339)
+lt(231,324)
+lt(73,324)
+lt(73,339)
+ct(93,339,106,340,112,343)
+ct(116,344,118,347,120,351)
+ct(122,354,123,366,123,386)
+lt(123,569)
+ct(123,592,122,607,120,615)
+ct(119,620,117,624,115,626)
+ct(113,628,109,629,105,629)
+ct(99,629,88,625,73,619)
+lt(65,633)
+ )cp
+dr
+ah((630,675)
+lt(174,-26)
+lt(130,-26)
+lt(587,675)
+lt(630,675)
+ )cp
+dr
+ah((732,109)
+lt(732,69)
+lt(680,69)
+lt(680,-19)
+lt(623,-19)
+lt(623,69)
+lt(455,69)
+lt(455,105)
+lt(639,332)
+lt(680,332)
+lt(680,109)
+lt(732,109)
+ )cp
+dr
+ah((623,109)
+lt(623,263)
+lt(496,109)
+lt(623,109)
+ )cp
+endchar;
+
+beginchar(190,750*FX#,675*FY#,26*FY#);
+"threequarters";
+dr
+ah((623,675)
+lt(168,-26)
+lt(125,-26)
+lt(581,675)
+lt(623,675)
+ )cp
+dr
+ah((25,600)
+ct(37,624,50,641,65,652)
+ct(85,667,110,675,138,675)
+ct(168,675,191,668,208,653)
+ct(226,638,234,621,234,604)
+ct(234,581,217,556,183,528)
+ct(207,519,224,507,236,491)
+ct(248,476,254,458,254,439)
+ct(254,405,240,377,212,353)
+ct(184,328,144,316,92,316)
+ct(64,316,45,320,33,328)
+ct(24,333,20,339,20,347)
+ct(20,353,23,358,28,362)
+ct(33,367,40,369,49,369)
+ct(58,369,71,365,88,357)
+ct(106,350,120,346,133,346)
+ct(151,346,167,352,180,365)
+ct(193,378,199,393,199,410)
+ct(199,434,190,453,172,469)
+ct(153,484,125,492,86,491)
+lt(86,505)
+ct(111,505,132,513,149,528)
+ct(166,543,175,561,175,581)
+ct(175,597,169,610,159,620)
+ct(148,630,134,635,116,635)
+ct(88,635,64,620,44,592)
+lt(25,600)
+ )cp
+dr
+ah((732,109)
+lt(732,69)
+lt(680,69)
+lt(680,-19)
+lt(623,-19)
+lt(623,69)
+lt(455,69)
+lt(455,105)
+lt(639,332)
+lt(680,332)
+lt(680,109)
+lt(732,109)
+ )cp
+dr
+ah((623,109)
+lt(623,263)
+lt(496,109)
+lt(623,109)
+ )cp
+endchar;
+
+beginchar(131,563*FX#,532*FY#,0*FY#);
+"multiply";
+dr
+ah((80,160)
+lt(252,332)
+lt(81,504)
+lt(109,532)
+lt(281,360)
+lt(453,532)
+lt(480,504)
+lt(308,333)
+lt(481,160)
+lt(453,131)
+lt(280,304)
+lt(108,132)
+lt(80,160)
+ )cp
+endchar;
+
+beginchar(221,722*FX#,877*FY#,0*FY#);
+"Yacute";
+dr
+ah((476,662)
+lt(707,662)
+lt(707,644)
+lt(694,644)
+ct(686,644,673,640,657,632)
+ct(641,625,626,614,613,600)
+ct(599,586,583,563,563,532)
+lt(404,280)
+lt(404,114)
+ct(404,73,408,48,417,38)
+ct(429,24,449,18,476,18)
+lt(498,18)
+lt(498,0)
+lt(216,0)
+lt(216,18)
+lt(240,18)
+ct(268,18,287,26,299,43)
+ct(306,53,310,77,310,114)
+lt(310,271)
+lt(128,548)
+ct(107,581,92,601,85,609)
+ct(77,618,61,627,37,639)
+ct(30,642,21,644,9,644)
+lt(9,662)
+lt(292,662)
+lt(292,644)
+lt(277,644)
+ct(262,644,248,640,235,633)
+ct(222,626,216,615,216,601)
+ct(216,589,226,567,246,537)
+lt(384,324)
+lt(514,528)
+ct(533,558,543,581,543,596)
+ct(543,605,541,613,536,621)
+ct(531,628,524,633,516,637)
+ct(507,642,494,644,476,644)
+lt(476,662)
+ )cp
+dr
+ah((486,877)
+lt(342,708)
+lt(325,708)
+lt(376,877)
+lt(486,877)
+ )cp
+endchar;
+
+beginchar(253,500*FX#,678*FY#,215*FY#);
+"yacute";
+dr
+ah((5,447)
+lt(214,447)
+lt(214,429)
+lt(204,429)
+ct(189,429,178,426,171,419)
+ct(163,413,160,405,160,395)
+ct(160,382,165,365,176,343)
+lt(285,117)
+lt(385,364)
+ct(390,377,393,390,393,404)
+ct(393,410,392,414,390,417)
+ct(387,421,383,423,377,426)
+ct(372,428,362,429,348,429)
+lt(348,447)
+lt(494,447)
+lt(494,429)
+ct(482,427,472,425,466,421)
+ct(459,417,452,410,444,399)
+ct(441,394,436,381,428,361)
+lt(246,-84)
+ct(228,-127,205,-160,177,-182)
+ct(148,-204,121,-215,94,-215)
+ct(75,-215,59,-210,47,-199)
+ct(34,-188,28,-175,28,-161)
+ct(28,-147,33,-136,42,-128)
+ct(51,-119,63,-115,79,-115)
+ct(89,-115,104,-118,123,-126)
+ct(135,-130,143,-133,147,-133)
+ct(157,-133,167,-128,179,-118)
+ct(190,-108,202,-89,214,-60)
+lt(246,17)
+lt(85,354)
+ct(80,364,72,377,62,392)
+ct(53,403,46,411,41,415)
+ct(33,420,21,425,5,429)
+lt(5,447)
+ )cp
+dr
+ah((357,678)
+lt(213,510)
+lt(196,510)
+lt(248,678)
+lt(357,678)
+ )cp
+endchar;
+
+beginchar(152,548*FX#,524*FY#,0*FY#);
+"divide";
+dr
+ah((274,524)
+ct(286,524,296,520,304,512)
+ct(312,504,316,494,316,482)
+ct(316,470,312,460,304,452)
+ct(296,444,285,439,273,439)
+ct(262,439,252,444,243,452)
+ct(235,460,231,470,231,482)
+ct(231,494,235,504,243,512)
+ct(252,520,262,524,274,524)
+ )cp
+dr
+ah((537,312)
+lt(11,312)
+lt(11,352)
+lt(537,352)
+lt(537,312)
+ )cp
+dr
+ah((274,222)
+ct(286,222,296,217,304,209)
+ct(313,201,317,190,317,179)
+ct(317,167,313,157,304,148)
+ct(296,140,286,136,274,136)
+ct(262,136,252,140,244,148)
+ct(235,157,231,167,231,179)
+ct(231,190,235,201,243,209)
+ct(252,217,262,222,274,222)
+ )cp
+endchar;
+
+beginchar(248,1*FX#,0*FY#,0*FY#);
+"radical";
+endchar;
+
+beginchar(198,1*FX#,0*FY#,0*FY#);
+"greaterequal";
+endchar;
+
+beginchar(192,1*FX#,0*FY#,0*FY#);
+"lessequal";
+endchar;
+
+beginchar(175,1*FX#,0*FY#,0*FY#);
+"notequal";
+endchar;
+
+beginchar(184,1*FX#,0*FY#,0*FY#);
+"infinity";
+endchar;
+
+beginchar(215,1*FX#,0*FY#,0*FY#);
+"partialdiff";
+endchar;
+
+beginchar(216,1*FX#,0*FY#,0*FY#);
+"summation";
+endchar;
+
+beginchar(1,1*FX#,0*FY#,0*FY#);
+"Delta";
+endchar;
+
+beginchar(133,1*FX#,0*FY#,0*FY#);
+"approxequal";
+endchar;
+
+beginchar(10,1*FX#,0*FY#,0*FY#);
+"Omega";
+endchar;
+
+beginchar(223,1*FX#,0*FY#,0*FY#);
+"product";
+endchar;
+
+beginchar(230,1*FX#,0*FY#,0*FY#);
+"pi";
+endchar;
+
+beginchar(247,1*FX#,0*FY#,0*FY#);
+"integral";
+endchar;
+
+beginchar(155,1*FX#,0*FY#,0*FY#);
+"Zcaron";
+endchar;
+
+beginchar(157,1*FX#,0*FY#,0*FY#);
+"zcaron";
+endchar;
+
+beginchar(160,333*FX#,97*FY#,166*FY#);
+"quotesinglbase";
+dr
+ah((53,-166)
+lt(53,-145)
+ct(87,-133,113,-116,131,-93)
+ct(149,-70,159,-45,159,-19)
+ct(159,-13,157,-7,154,-3)
+ct(152,-1,149,0,147,0)
+ct(143,0,136,-3,124,-9)
+ct(118,-11,111,-13,105,-13)
+ct(90,-13,77,-8,67,0)
+ct(58,9,53,22,53,39)
+ct(53,55,59,69,72,80)
+ct(84,91,99,97,116,97)
+ct(138,97,157,88,174,69)
+ct(190,50,199,26,199,-4)
+ct(199,-38,187,-69,164,-98)
+ct(141,-127,104,-149,53,-166)
+ )cp
+endchar;
+
+beginchar(0,1*FX#,0*FY#,0*FY#);
+"Gamma";
+endchar;
+
+beginchar(2,1*FX#,0*FY#,0*FY#);
+"Theta";
+endchar;
+
+beginchar(8,1*FX#,0*FY#,0*FY#);
+"Phi";
+endchar;
+
+beginchar(11,1*FX#,0*FY#,0*FY#);
+"ff";
+endchar;
+
+beginchar(14,1*FX#,0*FY#,0*FY#);
+"ffi";
+endchar;
+
+beginchar(15,1*FX#,0*FY#,0*FY#);
+"ffl";
+endchar;
+endchar;
+
+ligtable 123:
+45=:124;
+
+ligtable 121:
+46 kern -64FX#,
+44 kern -64FX#;
+
+ligtable 119:
+46 kern -64FX#,
+44 kern -64FX#;
+
+ligtable 118:
+46 kern -64FX#,
+44 kern -64FX#;
+
+ligtable 114:
+39 kern 37FX#,
+103 kern -18FX#,
+46 kern -55FX#,
+45 kern -20FX#,
+44 kern -40FX#;
+
+ligtable 102:
+105=:12;
+
+ligtable 96:
+96=:92;
+
+ligtable 89:
+118 kern -100FX#,
+117 kern -110FX#,
+113 kern -110FX#,
+112 kern -91FX#,
+111 kern -100FX#,
+105 kern -55FX#,
+101 kern -100FX#,
+97 kern -100FX#,
+65 kern -110FX#,
+59 kern -91FX#,
+58 kern -91FX#,
+46 kern -128FX#,
+45 kern -110FX#,
+44 kern -128FX#;
+
+ligtable 87:
+121 kern -60FX#,
+117 kern -40FX#,
+114 kern -40FX#,
+111 kern -80FX#,
+105 kern -40FX#,
+101 kern -80FX#,
+97 kern -80FX#,
+65 kern -110FX#,
+59 kern -37FX#,
+58 kern -37FX#,
+46 kern -91FX#,
+45 kern -55FX#,
+44 kern -91FX#;
+
+ligtable 86:
+121 kern -110FX#,
+117 kern -60FX#,
+114 kern -60FX#,
+111 kern -128FX#,
+105 kern -60FX#,
+101 kern -110FX#,
+97 kern -110FX#,
+65 kern -128FX#,
+59 kern -74FX#,
+58 kern -74FX#,
+46 kern -128FX#,
+45 kern -91FX#,
+44 kern -128FX#;
+
+ligtable 84:
+121 kern -69FX#,
+119 kern -69FX#,
+117 kern -35FX#,
+115 kern -69FX#,
+114 kern -35FX#,
+111 kern -69FX#,
+105 kern -35FX#,
+101 kern -69FX#,
+99 kern -69FX#,
+97 kern -69FX#,
+79 kern -18FX#,
+65 kern -80FX#,
+59 kern -55FX#,
+58 kern -49FX#,
+46 kern -74FX#,
+45 kern -91FX#,
+44 kern -74FX#;
+
+ligtable 82:
+121 kern -40FX#,
+89 kern -55FX#,
+87 kern -55FX#,
+86 kern -80FX#,
+84 kern -60FX#;
+
+ligtable 80:
+65 kern -91FX#,
+46 kern -110FX#,
+44 kern -110FX#;
+
+ligtable 76:
+39 kern -91FX#,
+121 kern -55FX#,
+89 kern -100FX#,
+87 kern -74FX#,
+86 kern -91FX#,
+84 kern -91FX#;
+
+ligtable 70:
+65 kern -74FX#,
+46 kern -80FX#,
+44 kern -80FX#;
+
+ligtable 65:
+39 kern -110FX#,
+121 kern -91FX#,
+119 kern -91FX#,
+118 kern -74FX#,
+89 kern -91FX#,
+87 kern -80FX#,
+86 kern -128FX#,
+84 kern -110FX#;
+
+ligtable 63:
+96=:62;
+
+ligtable 45:
+45=:123;
+
+ligtable 39:
+39=:34;
+
+ligtable 33:
+96=:60;
+
+font_slant := 0.0000;
+font_normal_space := 250 * FX#;
+font_normal_stretch := 125 * FX#;
+font_normal_shrink := 83 * FX#;
+font_x_height := 447 * FY#;
+font_quad := 889 * FX#;
+designsize := FontSize;
+font_coding_scheme := "TeX text";
+font_identifier := "TimesNewRoman";
+end.
+% That's all, Folks!
diff --git a/fonts/utilities/ps2mf/xmalloc.c b/fonts/utilities/ps2mf/xmalloc.c
new file mode 100644
index 0000000000..e9d1480325
--- /dev/null
+++ b/fonts/utilities/ps2mf/xmalloc.c
@@ -0,0 +1,60 @@
+/* xmalloc.c - get memory or bust
+ Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*
+NAME
+ xmalloc() - get memory or bust
+INDEX
+ xmalloc() uses malloc()
+
+SYNOPSIS
+ char * my_memory;
+
+ my_memory = xmalloc(42); / * my_memory gets address of 42 chars * /
+
+DESCRIPTION
+
+ Use xmalloc() as an "error-free" malloc(). It does almost the same job.
+ When it cannot honour your request for memory it BOMBS your program
+ with a "virtual memory exceeded" message. Malloc() returns NULL and
+ does not bomb your program.
+
+SEE ALSO
+ malloc()
+
+*/
+#ifndef AIX
+# include <stdlib.h>
+#endif
+
+char * xmalloc(n)
+ long n;
+{
+ char * retval;
+ char * malloc();
+ void error();
+
+ if ( ! (retval = malloc ((unsigned)n)) )
+ {
+ error("virtual memory exceeded");
+ }
+ return (retval);
+}
+
+/* end: xmalloc.c */
diff --git a/fonts/utilities/ps2pk/CHANGES.type1 b/fonts/utilities/ps2pk/CHANGES.type1
new file mode 100644
index 0000000000..39047274df
--- /dev/null
+++ b/fonts/utilities/ps2pk/CHANGES.type1
@@ -0,0 +1,65 @@
+This are the sources as I have found them on the X11R5 distribution. In
+order to use them for my purpose (ps2pk: conversion tool for Type1 fonts to
+packed TeX fonts) a number of changes were needed (see Changelog).
+
+--Piet
+
+Piet Tutelaers
+Computer Center Room RC 1.90
+Eindhoven University of Technology
+P.O. Box 513, 5600 MB Eindhoven, NL
+
+Changelog (the main-line):
+--------------------------
+92-02: Start of ps2pk project
+ - decoupling Type1 library from X11 (changes in t1intf.h + t1funcs.h;
+ added Xstuff.h to replace X header files)
+ - user definable encoding schemes (removed hardwired ISOLatin1 and
+ Symbol encodings from t1funcs.c and replaced by encoding paramater
+ in Type1OpenScalable)
+92-03: First release 1.0 (pre-release)
+92-04: - added expansion and slanting features as suggested by Lee
+ Hetherington (changes in spaces.c, t1funcs.c)
+ - changed t1test.c in order to test above features; added ISOLatin1
+ encoding vector.
+ - README2 replaced by CHANGES (this file)
+ - MSDOS concession (thanks to Sebastian Rahtz): renamed
+ fontfilest.h to ffilest.h so it does not clash with fontfile.h
+ (affects: fontfilest.h (->ffilest.h), t1funcs.c, t1info.c and
+ t1test.c).
+ - MSDOS concession: all file extensions .c.orig and .h.orig renamed
+ to .crg respectivally .hrg
+ - patch to handle /negationslash and /mapsto from LucidaMath-Symbol
+ correctly in t1funcs.c (ILH: Lee Hetherington).
+92-05: AMIGA/Aztec:
+ - added type1.ami (contains order of objects in library)
+ - added Makefile.ami
+ - added bstring.c (contains a bzero())
+92-05: - fixed a reference to a NULL pointer in t1info.c
+ - more verbose error messages in type1 library (NDW: Norman Walsh)
+ - changed memory heuristic in type1 library from static (one chunk)
+ into dynamic (up to a maximum of 10 chunks). This was needed for
+ big fonts like daysrib.pfa (reported by Norman Walsh).
+ (Changes in t1funcs.c and t1malloc.c)
+ - added Makefile.tcc for MSDOS/Turbo C, removed Makefile.dos
+92-06: - added Makefile.djg for MSDOS/GCC 386 (djgpp)
+ - fixed bug in t1io.c so MSDOS can read its own .pfb format
+92-08: - fixed alligment problem for machines with wordlength other than 32
+ bits (patch in util.c). Reported by J"urgen Marenda
+ <marenda@ford.uni-koblenz.de> for DataGeneral AViiON (Motorola
+ M88k machine)
+ - The type1 library did not render Oblique fonts correctly.
+ Erik Schenk <schenk@cpsc.ucalgary.ca> provided a patch for
+ this problem (patches in fontfcn.c and t1util.c).
+ - Official X11.5 patches (Stephen Gildea 920728) merged in the type1
+ library version of ps2pk. These patches were available on:
+ export.lcs.mit.edu:/pub/R5/contrib-fixes/Type1.patch
+ - portability: index() in t1info.c replaced by strchr()
+94-01: Version 1.4 (bug fix release)
+ - types.h: added basic type definitions for non 32-bit platforms
+ - fontfcn.c: made `virtual memory' management dynamically
+ (reported by Norman Walsh, needed for complicated fonts)
+ - Makefile.*: improved
+ - original X11R5 sources no longer included (see X11R5 sources if
+ you want to see them)
+ - t1malloc.c removed, not longer needed.
diff --git a/fonts/utilities/ps2pk/ChangeLog b/fonts/utilities/ps2pk/ChangeLog
new file mode 100644
index 0000000000..09eebc9b8b
--- /dev/null
+++ b/fonts/utilities/ps2pk/ChangeLog
@@ -0,0 +1,393 @@
+2018-12-05 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * mag.c, pk2bm.c: check for missing arguments.
+
+2018-12-01 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * ps2pk.c: check for missing arguments.
+ tex-k mail 1 Dec 2018 08:04:39.
+
+2018-09-09 Karl Berry <karl@tug.org>
+
+ * tests/ps2pk.test: LC_ALL=LANGUAGE=C.
+
+2018-01-18 Karl Berry <karl@tug.org>
+
+ * objects.h (IfTrace0): printf %s instead of direct string
+ (from Debian).
+
+2017-03-27 Karl Berry <karl@freefriends.org>
+
+ * Makefile.am (AM_TESTS_ENVIRONMENT): use instead of TESTS_ENVIRONMENT.
+
+2016-04-03 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * arith.h, pk2bm.c: Avoid compiler warnings.
+
+2016-02-01 Karl Berry <karl@tug.org>
+
+ * configure.ac
+ Version 1.8 (February 2016).
+
+ * ps2pk.c: use PACKAGE_VERSION (from c-auto.h) instead
+ of hardwiring the number.
+
+ * mag.c,
+ * pfb2pfa.c,
+ * pk2bm.c,
+ * pktest.c: report version number in usage as with ps2pk.
+ Also say "invalid" instead of "illegal".
+
+ * *.1: uniformly use date in .TH line.
+
+ * Remove version numbers from individual files.
+
+ * Remove Piet's email address so he does not get unwanted mail,
+ since this package is maintained in TeX Live now. Ask for reports
+ to go to tex-k.
+
+2016-01-31 Luigi Scarso <luigi.scarso@gmail.com>
+
+ * pk2bm.c, pkin.c, pkin.h: Support charext.
+
+2015-07-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Better dependencies for 'make check'.
+
+2014-12-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am (noinst_PROGRAMS): Build pktest.
+ * pktest.c: ANSI/ISO C.
+ * tests/ps2pk.test: Test PK (pk2bm) BM (pktest) PK (pk2bm) BM.
+
+ * basics.[ch], configure.ac, encoding.c, filenames.[ch],
+ pkout.[ch], pktest.c, ps2pk.c, psearch.c, types.h:
+ Version 1.7 (December 2014).
+
+2014-12-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Applied some changes from Version 1.6beta1 (ctan.org/pkg/ps2pk).
+ Renamed ./ps2pkm => ./ps2pk.
+
+ * filenames.c: Drop charptr() and use strchr(). Whitespace.
+ * filenames.[ch]: Constify ps_resource() argument.
+
+ * pkin.c: New function pksbyte(). Replace error() => fatal().
+ Correctly handle flag bytes 5 and 6.
+ * Makefile.am (pk2bm_SOURCES): Add basics.[ch].
+ Use AM_CPPFLAGS, AM_CFLAGS, and LDADD also for pk2bm.
+
+2014-11-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * regions.c [WIN64]: Use __int64 (not long) as intptr_t.
+
+2014-10-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * paths.c: Fixed a bug introduced by the previous "Bug fix".
+
+ * tests/lmmath.test: Shell script ...
+ * tests/lmmi12.600pk: ... and data for a new test.
+ * Makefile.am, configure.ac: Add the new test.
+
+2014-10-13 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * paths.c: Bug fix: Avoid use of uninitialized variable.
+
+ * basics.h, filenames.c, fontfcn.c, pk2bm.c, pkin.c, t1io.c,
+ t1snap.c, types.h: Always include "c-auto.h" first in all C
+ files (directly or indirectly via "basics.h" or "types.h").
+
+ * configure.ac: Add AC_TYPE_(U)INT32_T and AC_TYPE_INTPTR_T.
+
+ * pkout.[ch], ps2pk.c: Replace (U)INT32 => (u)int32_t.
+
+ * arith.[ch], curves.c, ffilest.h, fsmasks.h, hints.c, lines.c,
+ objects.[ch], paths.c, regions.c, spaces.[ch], t1funcs.c,
+ t1info.c, t1stdio.h, token.c, types.h, util.[ch]: Replace
+ (U)LONG => (u)int32_t, to avoid LONG defined as long for MinGW
+ (and MSVC?).
+
+ * fontstruct.h, ps2pk.c, util.h: Change MakeAtom() return type
+ long => intptr_t (large enough for 'void *' even for WIN64).
+
+2014-10-12 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ More general cleanup:
+ * *.[ch]: ANSI/ISO C function prototypes and definitions.
+ Extern declarations in only in headers.
+ Drop unused functions and variables.
+ Declare functions used in only one file as static.
+ * Makefile.am: t1imager.h. t1stub.c, and trig.h are not used.
+ Enable compiler warnings.
+
+2014-10-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * basics.h: Declare fatal() as noreturn (gcc and MSVC).
+ * pkout.c (magnification): Fatal error if no value found.
+
+2014-10-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * ps2pk.c: Add return type for main and GetClientResolutions.
+ * regions.c: Add return type for OptimizeRegion.
+ * t1funcs.c: Add return type for Type1RegisterFontFileFunctions.
+ * t1stub.c: Add return type for xiStub.
+
+ * encoding.c (my_string, remove_string, addcc, getcc, decimal,
+ nextsymbol, nextpsname), filenames.c (equal), objects.[ch]
+ (Pragmatics), pkout.c (optimal_size, PSPKINT, magnification),
+ regions.[ch] (BoxClip), t1stub.c (xiStub): Declare as static.
+
+ * curves.c, hints.c, objects.c, paths.c, regions.c, scanfont.c,
+ spaces.c, t1funcs.c, t1info.c, t1io.c, token.c, tokst.h,
+ type1.c: ANSI/ISO C for all static functions.
+
+ * paths.c, regions.c, scanfont.c, spaces.c, t1info.c: Add braces
+ around substructures in initializers.
+
+ * basics.[ch], encoding.c, ffilest.h, filenames.[ch],
+ fontfcn.c, mag.c, objects.c, pfb2pfa.c, pkout.c, pktest.c,
+ ps2pk.c, scanfonts.c, spaces.c, t1funcs.c, t1info.c, util.[ch]:
+ Declare various local and global variables, function parameters
+ and return values, and struct members as const.
+
+ * scanfonts.c: Add parentheses around assignment as truth value.
+
+ * regions.c: Add braces to avoid 'ambiguos else'.
+
+2014-10-07 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * pk2bm.c, paths.c, pkout.c, ps2pk.c, regions.c, t1func.c:
+ Minor cleanup to avoid compiler warnings.
+
+2014-10-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * t1funcs.c: Bugfix (undefined operation due to a typo).
+ * token.c: Fix ambigous behavior (sequence point).
+
+ * encoding.c, objects.c: Avoid undefined behaviour when char is
+ signed.
+
+ * arith.c: Fix formats: %dl => %d for int.
+ * paths.c, regions.c, spaces.c: Fix (debug) format specifiers:
+ %f for double* => double
+ %ld => %d for int
+ %p => %d for int
+ %x => %d for int (except for flags)
+ %x => %p for ANY*
+ %z => %p for ANY*
+
+2014-06-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Drop the obsolete ACLOCAL_AMFLAGS.
+
+2013-06-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * encoding.c, filenames.c, fontfcn.c, mag.c, pfb2pfa.c, pkout.c,
+ ps2pk.c, scanfont.c: Include Autoconf generated headers first.
+
+2012-11-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Avoid use of deprecated INCLUDES.
+
+2012-10-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Remove TL vs W32TeX diffs (from Akira).
+ * pkout.c: Add casts to avoid MSVC warnings.
+
+2012-10-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Reduce TL vs W32TeX diffs (from Akira).
+ * mag.c [WIN32]: Add '#include <fcntl.h>' for setmode().
+ * t1funcs.c: Add casts to avoid MSVC warnings.
+
+2012-08-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * pfb2pfa.c (main): Drop unnecessary nested fatal() prototype.
+
+2012-07-25 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * pkout.c (pk_runlengths): Pretend that the first pixel of an
+ empty glyph is white; avoid using uninitialized data.
+ Found by Martin Schroeder <martin@oneiros.de>.
+
+2012-07-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * ps2pk.c: Invoke kpse_set_program_name() with original argv[0]
+ and program name string.
+ * mag.c, ps2pk.c: ANSI C function declarations and definitions.
+ No nested function declarations. Declare functions as static.
+ * tests/ps2pk.test: Set environment for kpatsea file search.
+
+2012-07-12 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * pk2bm.c: Cast arg2 of readchar() to avoid MSVC warning.
+
+2012-07-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/ps2pk.test (new): Shell script for a test case.
+ * tests/Symbol.afm, tests/Symbol.pfb (new): Test input.
+ * tests/Symbol.pfa, tests/Symbol.alpha.{hex,pix},
+ tests/Symbol10.300pk (new): Expected output.
+ * Makefile.am: Adapted.
+
+2012-07-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * mag.c, pk2bm.c: Use binary mode for output files (from W32TeX).
+
+ * pfb2pfa.c: Drop unused ambiguous code.
+
+ * Makefile.am: Pk2bm does not use KPATHSEA.
+ * pk2bm.c, pkin.[ch]: ANSI C function prototypes and definitions.
+
+2011-07-19 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * type1.c [FABS, CEIL, FLOOR]: Use routines from libm, the
+ evaluation order of tmpx in the original macros is undefined
+ by the C-standard!
+ (ComputeStem): Fix `ambiguous else' bug (also present in t1lib
+ 5.1.2, compare libXfont 1.3.x from XOrg-7.4).
+
+2011-07-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * type1.c (PSFakePop): Non-void function should return a value.
+ Reported by Jack Howarth <howarth@bromo.med.uc.edu>
+ Patch from Akira, [tex-live] Sun, 17 Jul 2011 22:39:30.
+
+ * Makefile.am (AM_CFLAGS): Prepare for compiler warnings.
+
+2011-05-27 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * README: Fixed a typo.
+
+2011-05-26 Karl Berry <karl@tug.org>
+
+ * README: clarify license per authors.
+
+2011-04-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * t1funcs.c (Type1OpenScalable): Cast ev[i] to 'unsigned char *'
+ to avoid 'differ in signedness' warning.
+
+2011-03-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * ps2pk.c (main): `program_invocation_name' has been renamed
+ into `kpse_invocation_name'.
+
+2010-03-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * ps2pk.c: Use kpse_set_program_name() instead of
+ kpse_set_progname().
+
+2010-02-27 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: List all used header files.
+
+2010-02-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * basics.c: #include "basics.h" and drop all others.
+
+2010-02-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * t1info.c (ComputeStdProps): Declare rc as int, not LONG,
+ because they differ for WIN32.
+ * t1stub.c: Use ANSI C protos (not only for WIN32).
+ Declare struct segment (#include "paths.h" doesn't work).
+
+2010-02-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * basics.c: Don't #include <win32lib.h> for MinGW32.
+ ps2pk.c (CheckFSFormat), t1funcs.c (fill): Rename function
+ param byte => Byte to avoid conflicts.
+
+2009-07-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * regions.c (NewEdge): align to sizeof(long), as in t1lib.
+ * util.c (vm_alloc): align to 64-bit boundary, as in t1lib.
+
+2009-06-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * fontfcn.c, regions.c, regions.h, scanfont.c, t1funcs.c:
+ drop #ifdef HAVE_PROTOTYPES, unconditionally use prototypes.
+
+2009-06-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * objects.c, objects.h: use ANSI C variadic function syntax.
+ * paths.c: use ANSI C prototypes instead of P[1-9]H.
+ * type1.c: use ANSI C prototypes instead of P[1-9]H or AA.
+
+2009-06-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * regions.c, regions.h, t1imager.h:
+ rename INFINITY -> T1_INFINITY, to avoid name conflict with
+ INFINITY from cygwin <math.h>.
+
+2009-05-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Adapt to TL2009 build system.
+
+2008-02-29 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * acconfig.h: removed.
+
+2008-01-31 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Convert from autoconf-2.13 to autoconf-2.59+:
+ * Makefile.in: Add @configure_input@ line.
+ * aclocal.m4 (new): Generated (aclocal -I ../m4).
+ * configure: Regenerated (autoconf).
+
+Fri Mar 13 13:41:39 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * bstring.c: more fixes from Thomas Esser in this and configure
+ setup
+
+Mon Mar 9 10:33:30 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * fixes as suggested by Melissa O'Neill <oneill@cs.sfu.ca> (from
+ Thomas Esser), for memset in bstring.c (addition to configure)
+
+Tue Feb 24 11:55:33 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * objects.[ch]: extra #ifdef KPATHSEA inside WIN32
+
+Mon Feb 16 12:36:45 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * more fixes to regions.c (Thomas Esser)
+
+Tue Feb 3 13:40:36 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * regions.c: rationalized non STDC declarations
+
+Wed Jan 28 09:44:45 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * better undef of BITS in curves.c; change in objects.h (ifdef
+ KPATHSEA instead of just WIN32) from Fabrice Popineau
+
+Tue Jan 27 14:32:25 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * configure etc: new configure.in, c-auto.in, Makefile.in from
+ Olaf Weber
+
+Tue Jan 27 13:48:14 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * patch to regions.h from Peter B
+
+Tue Jan 20 10:14:10 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * added check of function prototypes to c-auto.in
+
+Mon Jan 19 20:46:08 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ * pkin.c: "remainder" clashed with some builtin, so
+ renamed to remainderPK throughout
+
+Thu Jan 1 11:08:37 1998 Sebastian Rahtz <s.rahtz@elsevier.co.uk>
+
+ Fixes by Peter Breitenlohner <peb@mppmu.mpg.de>
+ * curves.c: BITS redefined
+ * regions.h: incompatible pointer types
+ * types.h: AA redefined
+ * t1stub.c: struct declared inside parameter list
+
+
+
diff --git a/fonts/utilities/ps2pk/INSTALLATION b/fonts/utilities/ps2pk/INSTALLATION
new file mode 100644
index 0000000000..ebfbc1d521
--- /dev/null
+++ b/fonts/utilities/ps2pk/INSTALLATION
@@ -0,0 +1,208 @@
+
+ PS2PK installation summary
+ --------------------------
+ (March 1995)
+
+For the version which works with Karl Berry's path searching,
+run configure in this directory and use the Makefile which is
+generated. Otherwise follow the instructions below
+There needs to be a fully configured kpathsea directory
+at the same level as this.
+
+Special versions of MakeTeXPK and texmf.cnf are provided
+These are needed for the proper running of this version
+of ps2pk.
+
+ (January 1994)
+
+The ./src directory contains the sources to build the following programs:
+ - ps2pk a program to build PK fonts from PostScript type1 fonts
+ - pk2bm a program that allows to look at a PK character.
+
+To install and use these programs follow next steps:
+ 1) - Go to the ./src directory.
+
+ Select a Makefile.xxx
+ System xxx
+ ------------------------------------------------------------
+ UNIX unx A universal UNIX makefile using gcc.
+ This makefile is tailored to BSD like UNIX-es. On
+ SYS5 UNIX systems some small changes may be
+ necessary.
+
+ MSDOS bcc Borland C 3.1. The programs compile but ps2pk.exe
+ does not run (program does not fit in 640k!).
+
+ djg Delorie's port of gcc. The programs compile and run
+ on 386 compatible machines only. Ready compiled
+ versions are available that run on MSDOS or
+ MSWindows (386 with or without a coprocessor needed).
+
+ emx Eberhardt Mattes port of GCC with an extender that
+ can be used on MSDOS and OS2. Only 386.
+
+ wat For the Watcom/386 compiler.
+
+ Copy the selected Makefile.xxx to Makefile.
+
+ Edit the Makefile to adapt the T1INPUTS path and the bin and man
+ directories.
+
+ - Do a `make'. This will create the tools above.
+ The master Makefile calls the appropriate Makefile in the ./type1
+ directory to install a type1 library. If your compiler has problems
+ in compiling this library you possibly have to adapt that
+ makefile to your needs.
+
+ - Do a `make install'.
+ This will install the above programs.
+
+ - Do a `make install.man'.
+ This will install manual pages for the above programs.
+
+ 2) Testing ps2pk from ./src directory.
+ The directory ../Utopia contains the Utopia-Regular font donated by
+ Adobe. To make from this type1 font a PKfile next steps are needed:
+ setenv T1INPUTS ../Utopia (C-shell)
+ ps2pk -v -X300 Utopia-Regular.pfa (long)
+ or: ps2pk -v Utopia-Regular.pfa (short using defaults)
+
+ This will create the Utopia-Regular10.300pk font with the default
+ AdobeStandard characters derived from ../Utopia/Utopia-Regular.afm.
+ (The -v flag will show what the program is doing and which character
+ codes are generated.)
+
+ To see how for example the `Q' is rendered by ps2pk (using the IBM
+ type1 rendering software) you can use:
+ pk2bm -bcQ Utopia-Regular10.300pk
+
+ MSDOS has problems with such long names as Utopia-Regular10.300pk. That
+ is the reason that dvips uses abreviations for the PostScript names. The
+ short name for TeX's virtual font needed to use Utopia-Regular is `putr'.
+ The short name for its raw counterpart is `rputr'. To generate rputr.pk
+ the equivalent of Utopia-Regular10.300pk in directory 300dpi you have to
+ use (on MSDOS):
+ ps2pk -v Utopia-Regular 300dpi\rputr.pk
+
+ Ps2pk has some extra options. All options are explained in the manual page
+ (man/ps2pk.1). Here are the most important:
+ -X<xres> the desired X-resolution (ex: 300, 329, 360, 432, etc)
+ -E<expansion> the factor to expand a font
+ -S<slant> to get a slanted font.
+
+ 3) Using the ps2pk rendered fonts with xdvi.
+ The main reason why ps2pk is written is to use the PK fonts for
+ previewing a (La)TeX document that uses PostScript fonts. But some
+ people use the PKfonts instead of the original type1 fonts that are
+ available in the printer because they consume less virtual memory
+ or because the printing goes faster.
+
+ To use putr the TeX version of Utopia-Regular in xdvi you will need:
+ - the latest version of xdvi (supporting virtual fonts)
+ - putr.tfm and putr.vf (the virtual TeX-face of Utopia-Regular)
+ - rputr.tfm and rputr.300pk (the raw TeX-face of Utopia-Regular)
+ - testfont.tex (a plain TeX source to test the font).
+
+ We have explained how to make rputr.300pk from Utopia-Regular. How do
+ we generate rputr.tfm, putr.vf and putr.tfm? The first TFM file can be
+ generated with afm2tfm, coming with dvips, in the following way:
+ - afm2tfm Utopia/Utopia-Regular.afm -v putr.vpl rputr.tfm
+
+ The TFM/VF files for putr can be generated from the virtual property
+ list file (VPL) with vptovf:
+ - vptovf putr.vpl putr.vf putr.tfm
+
+ Now we have to verify that xdvi can find all these VF and PK fonts
+ by adding the current directory to the PATH's used for locating them:
+ - XDVIVFS (path for VF files)
+ - XDVIFONTS (path for PK files)
+
+ Now we are ready to test Utopia-Regular:
+ - tex testfont
+
+ If TeX asks for a font enter `putr' and when asked for a test
+ enter `\bigtest\bye' and you will get a testfont.dvi file.
+ (Testfont.tex is distributed with every TeX version.)
+
+ - xdvi testfont
+
+ If everything is OK you should see Utopia!
+
+ (You can try another testfont with `rputr' instead of `putr'. Explain
+ the differences!)
+
+ 4) Using Utopia-Regular with dvips.
+ Before you can run dvips to generate the PostScript output that can
+ be printed you have to make the font available to dvips by adding a
+ line to psfonts.map (normally located in /usr/local/lib/tex/ps).
+ This line tells dvips if a font is resident (available in the
+ printer) and if not how to download it. For rputr we need to add
+ next line in psfonts.map (the new version of afm2tfm will show this
+ line on the standard output):
+ rputr Utopia-Regular
+
+ and to copy or to move Utopia-Regular to /usr/local/lib/tex/ps so
+ that it will be downloaded (added to the PostScript output).
+ dvips testfont
+
+ If you have GhostScript, and your dvips is installed so that it does
+ not send the output immediately to the printer, you can check
+ testfont.ps behind your X-display with:
+ gs testfont.ps
+
+ 5) Using rputr.300pk with dvips.
+ You have to remove the line you have added to psfonts.map. Then
+ dvips will try to find a PK-font instead of the type1 font.
+
+ 6) Automatic font generation with MakeTeXPK.
+
+ If you are interested in automatically generating PK fonts from
+ either METAFONT and/or type1 sources you may want to install the
+ MTPK package. This package provides a perl script that allows
+ DVI drivers to generate missing PK sizes in a platform independant
+ way. See ftp.urc.tue.nl:pub/tex/MTPK??.gtz and the MTPK??.README
+ file for more information (under development).
+
+ 7) Although ps2pk is set up for AdobeStandardEncoding, the default used
+ by current versions of dvips, it will also accept other PostScript
+ and TeX encodings. An interesting alternative for TeX users is the new
+ TUG 8bits font standard (see: TUGboat #10 vol. 4 1990). This standard
+ is a superset of ISOLatin1 with many accented characters. The PostScript
+ encoding used by this new font is contained in etc/EC.enc. In order to
+ use it you will need afm2tfm version 7.0 (distributed with dvips5485++).
+
+ [Here you should read two danger bends!! Next in small letters . . .
+
+ As an example how an encoding scheme other than Adobe Standard can
+ be used we show how you can use the Utopia-Regular font as an
+ extended Computer Modern font. We use this encoding scheme both on
+ the TeX input side (let us call that internal encoding) and on the
+ TeX output side (we will call that external encoding). It is clear
+ that we can not use the plain macros that are still based on
+ oldstyle 7bits internal encodings. But we can use NFSS-DC a new
+ font selection scheme based on DC encodings. The DC encoding is a
+ preliminar version of the EC encoding.
+
+ How do we generate the appropriate TFM, VF and PK files?
+ rputr.300pk:
+ setenv T1INPUTS Utopia (C-shell)
+ ps2pk -e etc/EC.enc Utopia-Regular rputr.300pk
+ rputr.tfm and putr.vpl:
+ afm2tfm Utopia/Utopia-Regular.afm -p etc/EC.enc -v putr.vpl rputr.tfm
+ putr.vf putr.tfm:
+ vptovf putr.vpl putr.vf putr.tfm
+
+ How do we use it?
+ psfonts.map (add line):
+ rputr Utopia-Regular " ECEncoding ReEncodeFont " <EC.enc
+ $TEXCONFIG:
+ install here Utopia-Regular and EC.enc
+ testfont.tex (tex-nfss-dc is a special plain TeX version):
+ tex-nfss-dc testfont (choose `putr' and '\bigtest\bye')
+ xdvi testfont
+ dvips testfont.
+
+ . . .End of dangerous stuff and the small letters]
+
+--Piet
+
diff --git a/fonts/utilities/ps2pk/Makefile.am b/fonts/utilities/ps2pk/Makefile.am
new file mode 100644
index 0000000000..977442014e
--- /dev/null
+++ b/fonts/utilities/ps2pk/Makefile.am
@@ -0,0 +1,144 @@
+## $Id: Makefile.am 43617 2017-03-27 18:00:45Z karl $
+## Makefile.am for the TeX Live subdirectory texk/ps2pk/
+##
+## Copyright 2017 Karl Berry <tex-live@tug.org>
+## Copyright 2009-2015 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+
+bin_PROGRAMS = mag pfb2pfa pk2bm ps2pk
+noinst_PROGRAMS = pktest
+
+AM_CPPFLAGS = $(KPATHSEA_INCLUDES) -DUNIX -DKPATHSEA
+AM_CFLAGS = $(WARNING_CFLAGS)
+LDADD = $(KPATHSEA_LIBS)
+
+mag_SOURCES = \
+ basics.c \
+ basics.h \
+ mag.c
+
+pfb2pfa_SOURCES = \
+ basics.c \
+ basics.h \
+ filenames.c \
+ filenames.h \
+ pfb2pfa.c
+
+pk2bm_SOURCES = \
+ basics.c \
+ basics.h \
+ pk2bm.c \
+ pkin.c \
+ pkin.h
+
+ps2pk_SOURCES = \
+ Xstuff.h \
+ arith.c \
+ arith.h \
+ basics.c \
+ basics.h \
+ blues.h \
+ bstring.c \
+ cluts.h \
+ curves.c \
+ curves.h \
+ digit.h \
+ encoding.c \
+ ffilest.h \
+ filenames.c \
+ filenames.h \
+ font.h \
+ fontfcn.c \
+ fontfcn.h \
+ fontfile.h \
+ fontmisc.h \
+ fonts.h \
+ fontstruct.h \
+ fontxlfd.h \
+ fsmasks.h \
+ hdigit.h \
+ hints.c \
+ hints.h \
+ lines.c \
+ lines.h \
+ objects.c \
+ objects.h \
+ paths.c \
+ paths.h \
+ pictures.h \
+ pkout.c \
+ pkout.h \
+ ps2pk.c \
+ psearch.h \
+ regions.c \
+ regions.h \
+ scanfont.c \
+ spaces.c \
+ spaces.h \
+ strokes.h \
+ t1funcs.c \
+ t1hdigit.h \
+ t1info.c \
+ t1intf.h \
+ t1io.c \
+ t1snap.c \
+ t1stdio.h \
+ token.c \
+ token.h \
+ tokst.h \
+ type1.c \
+ types.h \
+ util.c \
+ util.h
+
+pktest_SOURCES = \
+ basics.c \
+ basics.h \
+ pkout.c \
+ pkout.h \
+ pktest.c
+
+$(mag_OBJECTS) $(pfb2pfa_OBJECTS) $(pk2m_OBJECTS) $(ps2pk_OBJECTS) $(pktest_OBJECTS): $(KPATHSEA_DEPEND)
+
+## Rebuild libkpathsea
+@KPATHSEA_RULE@
+
+dist_man1_MANS = mag.1 pfb2pfa.1 pk2bm.1 ps2pk.1
+
+## Tests.
+AM_TESTS_ENVIRONMENT = KPSEWHICH='$(KPSEWHICH)'; export KPSEWHICH;
+#
+TESTS = tests/lmmath.test tests/ps2pk.test
+tests/lmmath.log: ps2pk$(EXEEXT)
+tests/ps2pk.log: pfb2pfa$(EXEEXT) ps2pk$(EXEEXT) pk2bm$(EXEEXT) pktest$(EXEEXT) mag$(EXEEXT)
+#
+EXTRA_DIST = $(TESTS)
+DISTCLEANFILES =
+## tests/lmmath.test
+EXTRA_DIST += tests/lmmi12.600pk
+DISTCLEANFILES += lmmi12.600pk
+## tests/ps2pk.test
+EXTRA_DIST += tests/Symbol.afm tests/Symbol.alpha.hex tests/Symbol.alpha.pix \
+ tests/Symbol.pfa tests/Symbol.pfb tests/Symbol10.300pk
+DISTCLEANFILES += Symbol*
+
+## Not used
+EXTRA_DIST += \
+ CHANGES.type1 \
+ INSTALLATION \
+ README.14m \
+ README.type1 \
+ basename.c \
+ flisearch.c \
+ protos.h \
+ psearch.c \
+ sexpr.c \
+ strexpr.c \
+ strexpr.h \
+ t1imager.h \
+ t1stub.c \
+ t1test.c \
+ texfiles.c \
+ texfiles.h \
+ trig.h \
+ usenet
diff --git a/fonts/utilities/ps2pk/Makefile.in b/fonts/utilities/ps2pk/Makefile.in
new file mode 100644
index 0000000000..1400c0ede1
--- /dev/null
+++ b/fonts/utilities/ps2pk/Makefile.in
@@ -0,0 +1,1520 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mag$(EXEEXT) pfb2pfa$(EXEEXT) pk2bm$(EXEEXT) \
+ ps2pk$(EXEEXT)
+noinst_PROGRAMS = pktest$(EXEEXT)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = c-auto.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_mag_OBJECTS = basics.$(OBJEXT) mag.$(OBJEXT)
+mag_OBJECTS = $(am_mag_OBJECTS)
+mag_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+mag_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_pfb2pfa_OBJECTS = basics.$(OBJEXT) filenames.$(OBJEXT) \
+ pfb2pfa.$(OBJEXT)
+pfb2pfa_OBJECTS = $(am_pfb2pfa_OBJECTS)
+pfb2pfa_LDADD = $(LDADD)
+pfb2pfa_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_pk2bm_OBJECTS = basics.$(OBJEXT) pk2bm.$(OBJEXT) pkin.$(OBJEXT)
+pk2bm_OBJECTS = $(am_pk2bm_OBJECTS)
+pk2bm_LDADD = $(LDADD)
+pk2bm_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_pktest_OBJECTS = basics.$(OBJEXT) pkout.$(OBJEXT) pktest.$(OBJEXT)
+pktest_OBJECTS = $(am_pktest_OBJECTS)
+pktest_LDADD = $(LDADD)
+pktest_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_ps2pk_OBJECTS = arith.$(OBJEXT) basics.$(OBJEXT) bstring.$(OBJEXT) \
+ curves.$(OBJEXT) encoding.$(OBJEXT) filenames.$(OBJEXT) \
+ fontfcn.$(OBJEXT) hints.$(OBJEXT) lines.$(OBJEXT) \
+ objects.$(OBJEXT) paths.$(OBJEXT) pkout.$(OBJEXT) \
+ ps2pk.$(OBJEXT) regions.$(OBJEXT) scanfont.$(OBJEXT) \
+ spaces.$(OBJEXT) t1funcs.$(OBJEXT) t1info.$(OBJEXT) \
+ t1io.$(OBJEXT) t1snap.$(OBJEXT) token.$(OBJEXT) \
+ type1.$(OBJEXT) util.$(OBJEXT)
+ps2pk_OBJECTS = $(am_ps2pk_OBJECTS)
+ps2pk_LDADD = $(LDADD)
+ps2pk_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/arith.Po ./$(DEPDIR)/basics.Po \
+ ./$(DEPDIR)/bstring.Po ./$(DEPDIR)/curves.Po \
+ ./$(DEPDIR)/encoding.Po ./$(DEPDIR)/filenames.Po \
+ ./$(DEPDIR)/fontfcn.Po ./$(DEPDIR)/hints.Po \
+ ./$(DEPDIR)/lines.Po ./$(DEPDIR)/mag.Po ./$(DEPDIR)/objects.Po \
+ ./$(DEPDIR)/paths.Po ./$(DEPDIR)/pfb2pfa.Po \
+ ./$(DEPDIR)/pk2bm.Po ./$(DEPDIR)/pkin.Po ./$(DEPDIR)/pkout.Po \
+ ./$(DEPDIR)/pktest.Po ./$(DEPDIR)/ps2pk.Po \
+ ./$(DEPDIR)/regions.Po ./$(DEPDIR)/scanfont.Po \
+ ./$(DEPDIR)/spaces.Po ./$(DEPDIR)/t1funcs.Po \
+ ./$(DEPDIR)/t1info.Po ./$(DEPDIR)/t1io.Po \
+ ./$(DEPDIR)/t1snap.Po ./$(DEPDIR)/token.Po \
+ ./$(DEPDIR)/type1.Po ./$(DEPDIR)/util.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(mag_SOURCES) $(pfb2pfa_SOURCES) $(pk2bm_SOURCES) \
+ $(pktest_SOURCES) $(ps2pk_SOURCES)
+DIST_SOURCES = $(mag_SOURCES) $(pfb2pfa_SOURCES) $(pk2bm_SOURCES) \
+ $(pktest_SOURCES) $(ps2pk_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man1_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+ $(LISP)c-auto.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope check recheck
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../../build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__DIST_COMMON = $(dist_man1_MANS) $(srcdir)/Makefile.in \
+ $(srcdir)/c-auto.in $(top_srcdir)/../../build-aux/compile \
+ $(top_srcdir)/../../build-aux/config.guess \
+ $(top_srcdir)/../../build-aux/config.sub \
+ $(top_srcdir)/../../build-aux/depcomp \
+ $(top_srcdir)/../../build-aux/install-sh \
+ $(top_srcdir)/../../build-aux/ltmain.sh \
+ $(top_srcdir)/../../build-aux/missing \
+ $(top_srcdir)/../../build-aux/test-driver \
+ ../../build-aux/ar-lib ../../build-aux/compile \
+ ../../build-aux/config.guess ../../build-aux/config.sub \
+ ../../build-aux/depcomp ../../build-aux/install-sh \
+ ../../build-aux/ltmain.sh ../../build-aux/missing \
+ ../../build-aux/texinfo.tex ../../build-aux/ylwrap ChangeLog \
+ README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+KPSEWHICH = @KPSEWHICH@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = $(KPATHSEA_INCLUDES) -DUNIX -DKPATHSEA
+AM_CFLAGS = $(WARNING_CFLAGS)
+LDADD = $(KPATHSEA_LIBS)
+mag_SOURCES = \
+ basics.c \
+ basics.h \
+ mag.c
+
+pfb2pfa_SOURCES = \
+ basics.c \
+ basics.h \
+ filenames.c \
+ filenames.h \
+ pfb2pfa.c
+
+pk2bm_SOURCES = \
+ basics.c \
+ basics.h \
+ pk2bm.c \
+ pkin.c \
+ pkin.h
+
+ps2pk_SOURCES = \
+ Xstuff.h \
+ arith.c \
+ arith.h \
+ basics.c \
+ basics.h \
+ blues.h \
+ bstring.c \
+ cluts.h \
+ curves.c \
+ curves.h \
+ digit.h \
+ encoding.c \
+ ffilest.h \
+ filenames.c \
+ filenames.h \
+ font.h \
+ fontfcn.c \
+ fontfcn.h \
+ fontfile.h \
+ fontmisc.h \
+ fonts.h \
+ fontstruct.h \
+ fontxlfd.h \
+ fsmasks.h \
+ hdigit.h \
+ hints.c \
+ hints.h \
+ lines.c \
+ lines.h \
+ objects.c \
+ objects.h \
+ paths.c \
+ paths.h \
+ pictures.h \
+ pkout.c \
+ pkout.h \
+ ps2pk.c \
+ psearch.h \
+ regions.c \
+ regions.h \
+ scanfont.c \
+ spaces.c \
+ spaces.h \
+ strokes.h \
+ t1funcs.c \
+ t1hdigit.h \
+ t1info.c \
+ t1intf.h \
+ t1io.c \
+ t1snap.c \
+ t1stdio.h \
+ token.c \
+ token.h \
+ tokst.h \
+ type1.c \
+ types.h \
+ util.c \
+ util.h
+
+pktest_SOURCES = \
+ basics.c \
+ basics.h \
+ pkout.c \
+ pkout.h \
+ pktest.c
+
+dist_man1_MANS = mag.1 pfb2pfa.1 pk2bm.1 ps2pk.1
+AM_TESTS_ENVIRONMENT = KPSEWHICH='$(KPSEWHICH)'; export KPSEWHICH;
+#
+TESTS = tests/lmmath.test tests/ps2pk.test
+#
+EXTRA_DIST = $(TESTS) tests/lmmi12.600pk tests/Symbol.afm \
+ tests/Symbol.alpha.hex tests/Symbol.alpha.pix tests/Symbol.pfa \
+ tests/Symbol.pfb tests/Symbol10.300pk CHANGES.type1 \
+ INSTALLATION README.14m README.type1 basename.c flisearch.c \
+ protos.h psearch.c sexpr.c strexpr.c strexpr.h t1imager.h \
+ t1stub.c t1test.c texfiles.c texfiles.h trig.h usenet
+DISTCLEANFILES = lmmi12.600pk Symbol*
+all: c-auto.h
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+c-auto.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/c-auto.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status c-auto.h
+$(srcdir)/c-auto.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f c-auto.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mag$(EXEEXT): $(mag_OBJECTS) $(mag_DEPENDENCIES) $(EXTRA_mag_DEPENDENCIES)
+ @rm -f mag$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(mag_OBJECTS) $(mag_LDADD) $(LIBS)
+
+pfb2pfa$(EXEEXT): $(pfb2pfa_OBJECTS) $(pfb2pfa_DEPENDENCIES) $(EXTRA_pfb2pfa_DEPENDENCIES)
+ @rm -f pfb2pfa$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pfb2pfa_OBJECTS) $(pfb2pfa_LDADD) $(LIBS)
+
+pk2bm$(EXEEXT): $(pk2bm_OBJECTS) $(pk2bm_DEPENDENCIES) $(EXTRA_pk2bm_DEPENDENCIES)
+ @rm -f pk2bm$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pk2bm_OBJECTS) $(pk2bm_LDADD) $(LIBS)
+
+pktest$(EXEEXT): $(pktest_OBJECTS) $(pktest_DEPENDENCIES) $(EXTRA_pktest_DEPENDENCIES)
+ @rm -f pktest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pktest_OBJECTS) $(pktest_LDADD) $(LIBS)
+
+ps2pk$(EXEEXT): $(ps2pk_OBJECTS) $(ps2pk_DEPENDENCIES) $(EXTRA_ps2pk_DEPENDENCIES)
+ @rm -f ps2pk$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ps2pk_OBJECTS) $(ps2pk_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arith.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basics.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bstring.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curves.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encoding.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filenames.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fontfcn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hints.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mag.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objects.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paths.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pfb2pfa.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pk2bm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkin.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkout.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pktest.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps2pk.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regions.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanfont.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spaces.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1funcs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1info.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1io.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1snap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/token.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+install-man1: $(dist_man1_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(dist_man1_MANS)'; \
+ list2=''; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS) c-auto.h
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f ./$(DEPDIR)/arith.Po
+ -rm -f ./$(DEPDIR)/basics.Po
+ -rm -f ./$(DEPDIR)/bstring.Po
+ -rm -f ./$(DEPDIR)/curves.Po
+ -rm -f ./$(DEPDIR)/encoding.Po
+ -rm -f ./$(DEPDIR)/filenames.Po
+ -rm -f ./$(DEPDIR)/fontfcn.Po
+ -rm -f ./$(DEPDIR)/hints.Po
+ -rm -f ./$(DEPDIR)/lines.Po
+ -rm -f ./$(DEPDIR)/mag.Po
+ -rm -f ./$(DEPDIR)/objects.Po
+ -rm -f ./$(DEPDIR)/paths.Po
+ -rm -f ./$(DEPDIR)/pfb2pfa.Po
+ -rm -f ./$(DEPDIR)/pk2bm.Po
+ -rm -f ./$(DEPDIR)/pkin.Po
+ -rm -f ./$(DEPDIR)/pkout.Po
+ -rm -f ./$(DEPDIR)/pktest.Po
+ -rm -f ./$(DEPDIR)/ps2pk.Po
+ -rm -f ./$(DEPDIR)/regions.Po
+ -rm -f ./$(DEPDIR)/scanfont.Po
+ -rm -f ./$(DEPDIR)/spaces.Po
+ -rm -f ./$(DEPDIR)/t1funcs.Po
+ -rm -f ./$(DEPDIR)/t1info.Po
+ -rm -f ./$(DEPDIR)/t1io.Po
+ -rm -f ./$(DEPDIR)/t1snap.Po
+ -rm -f ./$(DEPDIR)/token.Po
+ -rm -f ./$(DEPDIR)/type1.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f ./$(DEPDIR)/arith.Po
+ -rm -f ./$(DEPDIR)/basics.Po
+ -rm -f ./$(DEPDIR)/bstring.Po
+ -rm -f ./$(DEPDIR)/curves.Po
+ -rm -f ./$(DEPDIR)/encoding.Po
+ -rm -f ./$(DEPDIR)/filenames.Po
+ -rm -f ./$(DEPDIR)/fontfcn.Po
+ -rm -f ./$(DEPDIR)/hints.Po
+ -rm -f ./$(DEPDIR)/lines.Po
+ -rm -f ./$(DEPDIR)/mag.Po
+ -rm -f ./$(DEPDIR)/objects.Po
+ -rm -f ./$(DEPDIR)/paths.Po
+ -rm -f ./$(DEPDIR)/pfb2pfa.Po
+ -rm -f ./$(DEPDIR)/pk2bm.Po
+ -rm -f ./$(DEPDIR)/pkin.Po
+ -rm -f ./$(DEPDIR)/pkout.Po
+ -rm -f ./$(DEPDIR)/pktest.Po
+ -rm -f ./$(DEPDIR)/ps2pk.Po
+ -rm -f ./$(DEPDIR)/regions.Po
+ -rm -f ./$(DEPDIR)/scanfont.Po
+ -rm -f ./$(DEPDIR)/spaces.Po
+ -rm -f ./$(DEPDIR)/t1funcs.Po
+ -rm -f ./$(DEPDIR)/t1info.Po
+ -rm -f ./$(DEPDIR)/t1io.Po
+ -rm -f ./$(DEPDIR)/t1snap.Po
+ -rm -f ./$(DEPDIR)/token.Po
+ -rm -f ./$(DEPDIR)/type1.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \
+ check-TESTS check-am clean clean-binPROGRAMS clean-cscope \
+ clean-generic clean-libtool clean-noinstPROGRAMS cscope \
+ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+ distcheck distclean distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags distcleancheck \
+ distdir distuninstallcheck dvi dvi-am html html-am info \
+ info-am install install-am install-binPROGRAMS install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-man1 install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+$(mag_OBJECTS) $(pfb2pfa_OBJECTS) $(pk2m_OBJECTS) $(ps2pk_OBJECTS) $(pktest_OBJECTS): $(KPATHSEA_DEPEND)
+
+@KPATHSEA_RULE@
+tests/lmmath.log: ps2pk$(EXEEXT)
+tests/ps2pk.log: pfb2pfa$(EXEEXT) ps2pk$(EXEEXT) pk2bm$(EXEEXT) pktest$(EXEEXT) mag$(EXEEXT)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/fonts/utilities/ps2pk/README b/fonts/utilities/ps2pk/README
new file mode 100644
index 0000000000..b718b1ca33
--- /dev/null
+++ b/fonts/utilities/ps2pk/README
@@ -0,0 +1,240 @@
+This ps2pk program (all versions) is available under the same
+permissive license as the Type 1 interpreter code that it is based on
+(and incorporates). For the exact wording, see, for example, the type1.c
+source file.
+--Piet Tutelaers and Pierre MacKay, May 2011.
+
+ps2pk is currently maintained as part of TeX Live (http://tug.org/texlive),
+and distributed through TL and CTAN.
+
+ Ps2pk-1.4 available
+ -------------------
+ (January 1994)
+
+Version 1.4 of ps2pk is now available on:
+ ftp.urc.tue.nl (address: 131.155.2.79)
+ directory: /pub/tex
+ files: ps2pk14.README ( 9k) This file
+ ps2pk14.tar.gz (237k) Sources
+
+ For MSDOS people having difficulties in handling UNIX `.tar.gz'
+ format I have made some UNIX tools (only executables) available
+ in directories:
+ /pub/unixtools/dos
+
+ See the system specific TARGZ file for some help.
+
+ Ftp.urc.tue.nl can not handle E-mail requests. But sites are free
+ to put the ps2pk14 stuff on any server that can.
+
+ I have made read-to-go 1.4 executables for MSDOS available in:
+ pub/tex/ps2pk14x/msdos/djgpp (created with DJGPP/gcc)
+ msdos/emx (created with EMX/gcc)
+
+When do you need ps2pk?
+----------------------
+Ps2pk is a tool that converts a PostScript type1 font into a corres-
+ponding TeX PK font. The tool is especially interesting if you want
+to use fully hinted type1 fonts in your DVI previewer (instead of the
+unhinted type1 fonts currently used in GhostScript) or on a printer
+that has no PostScript interpreter.
+
+In order to use the ps2pk generated fonts your driver and previewer need
+to support virtual fonts. The reason is that PostScript fonts and TeX
+fonts do have a different font encoding and handle ligatures in a
+different way. With virtual fonts the PostScript world (encoding +
+ligatures) can be mapped to the old style TeX world on which the current
+plain macro packages still are based (despite the fact that TeX3.0 can
+handle 8bits).
+
+It is also possible to use the ps2pk generated PK fonts directly
+(without virtual fonts) but in that case you need modified plain TeX
+macros in order to acces the new (changed) font features. To make TeX
+really 8bits (the reason TeX3.0 was released) TUG has proposed a new
+font standard supporting the full 8bit range (in stead of the 7bit).
+The 128 extra characters in this new TUG standard are filled up with
+characters for 17 different European languages (see: TUGboat #10 vol.
+4 1990). With ps2pk it is possible to generate PK fonts from
+PostScript fonts according to this new TUG font standard.
+
+Ps2pk and virtual fonts.
+------------------------
+In order to use ps2pk in combination with virtal fonts you need afm2tfm
+(the version belonging to dvips5.487 or newer), dvips and a previewer
+supporting virtual fonts (ex.: xdvi on UNIX).
+
+PS: the latest version of dvips can be retrieved from
+ labrea.stanford.edu:pub and xdvi from export.lcs.mit.edu:contrib
+
+Ps2pk without virtual fonts.
+----------------------------
+This road in not a paved one even for experienced TeX users! So be
+prepared that you need to build some bridges and other improvements to
+reach your goal. Or simply wait until the TeX community has switched to
+the new TUG font standard.
+
+Dvips (5.487 and higher) supports different TeX and PostScript
+encodings. If you choose for the new TUG fontstandard defined in the
+Cork meeting, as the TeX and PostScript encoding, you have to:
+ - generate a set of TFM/VF fonts for the `EC' (Extended Computer
+ Modern Font encoding) using afm2tfm and vptovf,
+ - install the new encoding vector EC.enc so it will also be used for
+ the resident/downloaded PostScript fonts
+ - install a modified version of NFSS (New Font Selection Scheme) using
+ this encoding scheme.
+
+Type1 PostScript text fonts.
+----------------------------
+Fully hinted type1 fonts are generally not PD. You have to buy them
+unless you are satisfied with the PD available GhostScript versions
+(which are currently not hinted). You don't need to be an expert to
+see the difference between hinted and unhinted fonts. If you are
+using MSDOS or MacIntosh computers you probably use Adobe Type Manager
+(ATM) a program that can render type1 fonts dynamically. With this
+program or with other programs using ATM (for example Lotus) you
+receive fully hinted type1 fonts. On MSDOS they have funny names like
+tmr______.pfb. To save space on MSDOS type1 fonts are binary encoded
+(.pfb). On UNIX you can use this .pfb format too or the .pfa format
+(which occupies about double the space of a .pfb format).
+
+If your UNIX workstation supports DPS (Display PostScript) than
+you already may have a number of fully hinted type1 fonts. Look in
+places like /usr/lib/dps.
+
+ If you are satisfied with PK fonts derived from unhinted type1
+ fonts just for previewing then you can ftp (thanks to Karl Berry):
+ ftp.cs.umb.edu (file: pub/tex/psfonts.tar).
+
+ This set contains PK files for the standard 35 PostScript fonts in
+ various sizes, generated by `gsrenderfont' in the GNU font utilities
+ (on prep.ai.mit.edu et al.).
+
+Adobe has donated their Utopia font family to the X-consortium and IBM
+their Courier font. Both families are available on ftp.urc.tue.nl. The
+Courier font from IBM does have a rich set of accented characters not
+found in other Adobe fonts. Both fonts are fully hinted.
+
+Lee Hetherington has written a set of type1 conversion utilities. These
+allow to convert from binary (PFB) to ASCII (PFA) and back. Or to
+convert a type1 font into readable PostScript (disassemble) with the
+possibility to edit it and to convert it back (assemble) to some type1
+encoded form. They are now maintained by Eddie Kohler and available at
+http://www.lcdf.org/type (and as part of TeX Live).
+
+Type1 PostScript math fonts.
+----------------------------
+The PostScript type1 symbol fonts do not have the same rich set of math
+symbols as the TeX fonts. There are two exceptions: the Lucida fonts
+and the MathTime package. I have no experience with the Lucida fonts.
+The MathTime package from Michael Spivak has the disadvantage that it is
+too much MacIntosh/AMSTeX oriented. There are people who are working on
+LaTeX support based upon NFSS. Another disadvantage of MathTime is that
+it is built on top of TimesRoman-Italic (not delivered with the package)
+and lacks bold-italic symbols.
+
+Acknowledgements.
+-----------------
+Ps2pk uses the type1 rendering software IBM has donated to the
+X-consortium. This rendering package is used by ps2pk as pure as
+possible. But in order to support user specified encoding schemes, to
+generate extended and/or slanted font variations, to uncouple it from the
+X protocol and to fix some bugs I needed to change some of the sources.
+
+I also want to thank the `ps2pk discussion forum' who helped me to make
+ps2pk as it is now. Especially Tom Rokicki for enhancing his dvips/afm2tfm.
+
+I wish you a lot of fun with type1 fonts,
+
+--Piet
+
+Piet Tutelaers
+Computer Center Room RC 1.90
+Eindhoven University of Technology
+P.O. Box 513, 5600 MB Eindhoven, NL
+
+
+For those who have used earlier versions of ps2pk next differences may be
+of interest (only major differences are mentioned):
+
+Ps2pk 1.4 release (94-01)
+-------------------------
+1) Memory allocation made dynamically
+ 1.1 in computing runlengths (needed to build PK fonts)
+ 1.2 in scanning type1 fonts (to overcome `fixed' virtual memory)
+2) Problem with handling Lucida font (negative widths) solved
+3) Improved error handling in scanning AFM files
+4) Provided hooks to handle non 32-bit platforms
+5) Some cleanups
+6) Improved Makefiles.
+
+Ps2pk 1.3 release (92-09)
+-------------------------
+1) Official X11R5 patches included in type1 library.
+2) The -a<AFMfile> option added to ps2pk.
+3) Problem with rendering of Obique fonts solved.
+
+Ps2pk 1.2 release (92-06)
+-------------------------
+1) Ps2pk now computes the same checksum as afm2tfm (dvips5.487 or
+ higher). This means that you have to update your VF and TFM files
+ with the new dvips5487lib files.
+2) Bug fixes:
+ - the MSDOS version now correctly reads PFB font files
+ - a segmentation fault error removed (capri.pfa font)
+ - an out of memory problem fixed (davysrib.pfa font)
+3) Added Makefile for MSDOS/DJGPP (Delorie's GCC for 386 systems)
+
+Ps2pk 1.1 release (92-04)
+-------------------------
+1) Ps2pk uses now the same encoding scheme as introduced by afm2tfm 7.0
+ (dvips5485). But default (for all English/American writing TeX-friends)
+ the program uses the same encoding as is in the AFM-file belonging to
+ the type1 PostScript font (normally AdobeStandard). So the program does
+ not longer need re-encode to create a .cmi file containing the encoding
+ vector and the WX values. These are read directly from the AFM file.
+
+ Typical usage for standard encoding:
+ ps2pk -X329 Utopia-Regular rputr.329pk
+
+ or with EC.enc encoding:
+ ps2pk -eEC.enc -X329 Utopia-Regular rputr.329pk
+
+2) I have added a -E<expansion> and -S<slant> option to ps2pk thanks to
+ the patches I got from Lee Hetherington.
+
+3) I have added a MakeTeXPK script so that dvips and xdvi can use it.
+
+4) I have added manual pages and some documentation (README + INSTALLATION).
+
+5) Some inconveniences for MSDOS users are removed.
+
+Ps2pk 1.0 release (92-03)
+-------------------------
+
+======================================================================
+
+
+CTAN SOURCE TREE INFORMATION
+
+
+This CTAN source tree has been automatically extracted from the texk
+Subversion repository at svn://tug.org/texlive/trunk/Build/source/texk/.
+
+It is not possible to use the supplied configure script.
+In fact, if you call it; you will be told as such.
+
+This source can only be compiled in a texk build environment.
+You will need to download the whole environment, please refer to
+http://www.tug.org/texlive/svn/.
+
+It all boils down to a Subversion checkout of
+svn://tug.org/texlive/trunk/Build/source
+This will be the source tree that you can use for compilation. The
+CTAN directory is there for archival and informational purpose.
+
+For your convenience, the original configure script from the texk
+source tree is available in this directory as configure.texk.
+
+For the CTAN team,
+
+ Joachim Schrod <jschrod@acm.org>
diff --git a/fonts/utilities/ps2pk/README.14m b/fonts/utilities/ps2pk/README.14m
new file mode 100644
index 0000000000..6a70ab18ce
--- /dev/null
+++ b/fonts/utilities/ps2pk/README.14m
@@ -0,0 +1,35 @@
+Fri May 9 13:23:31 MET DST 1997
+ Rearranged all the files into one directory. New Makefile.in and
+ configure.in.
+
+ Thomas Esser
+
+March 1995
+Configuration files supplied. Makefile for the
+manual pages.
+
+January 1995
+
+Kpathsea path searching added. Set up for use with
+MakeTeXPK
+
+December 1994
+
+This modification of ps2pk version 1.4
+is an attempt to provide for PK files
+that will be compatible with the recommendations
+of the TUG Working Group on a TeX Directory Structure
+for platform-independent support files.
+
+The sources in the src directory have been modified
+to provide for PK specials at the end of each
+PK file so that there will be an internal
+identification available if the files have
+to be stored under truncated DOS 8+3 names
+as xxxx.pk for all resolutions. For details
+see src/CHANGES and the manual page ps2pk.1
+The original files are retained in this package
+with the suffix [ch]orig (which DOS will truncate to
+"COR" and "HOR"
+
+P. A. Mackay---mackay@cs.washington.edu
diff --git a/fonts/utilities/ps2pk/README.type1 b/fonts/utilities/ps2pk/README.type1
new file mode 100644
index 0000000000..4ce796d75c
--- /dev/null
+++ b/fonts/utilities/ps2pk/README.type1
@@ -0,0 +1,25 @@
+This directory contains a rasterizer for "Type 1" (PostScript) format
+outline fonts. It was donated by IBM for the R5 contrib tape and has
+been maintained since then by the MIT X Consortium. This version is
+compatible with X11R5 public patch 13.
+
+To be used, this rasterizer must be bound into the X server and the font
+server. It is most convenient to do this if this directory is moved
+into the 'mit' directory tree (i.e., mit/font/lib/font/Type1, a peer of
+the 'Speedo' directory). Of course, mit/font/lib/font/Imakefile must be
+made aware of its new subdirectory and the objects in it. In any case,
+you must ensure that the library mit/font/lib/font/libfont.a contains
+this code.
+
+In addition, the rasterizer must be "registered" with X. The source in
+mit/fonts/lib/font/fontfile/renderers.c, specifically the routine
+FontFileRegisterFontFileFunctions(), must be modified to add the line:
+
+ Type1RegisterFontFileFunctions();
+
+after the call to "SpeedoRegisterFontFileFunctions".
+
+Some Type 1 fonts have been donated; see, for example, the directory
+contrib/fonts/scaled/Type1. In order to use them, they must be in the
+font path, either by combining them in some existing font object
+directory, or adding a new font directory to the path.
diff --git a/fonts/utilities/ps2pk/Xstuff.h b/fonts/utilities/ps2pk/Xstuff.h
new file mode 100644
index 0000000000..523767da37
--- /dev/null
+++ b/fonts/utilities/ps2pk/Xstuff.h
@@ -0,0 +1,42 @@
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef XMD_H
+#define XMD_H 1
+
+#include "types.h"
+
+/*
+ * Bitfield suffixes for the protocol structure elements, if you
+ * need them. Note that bitfields are not guarranteed to be signed
+ * (or even unsigned) according to ANSI C.
+ */
+#ifdef WORD64
+#define B32 :32
+#define B16 :16
+#else
+#define B32
+#define B16
+#endif
+
+typedef struct {
+ SHORT leftSideBearing B16,
+ rightSideBearing B16,
+ characterWidth B16,
+ ascent B16,
+ descent B16;
+ USHORT attributes;
+} xCharInfo;
+#endif /* XMD_H */
+
+#ifndef _FS_PROTO_H_
+#define _FS_PROTO_H_
+
+typedef struct {
+ USHORT x_resolution B16;
+ USHORT y_resolution B16;
+ USHORT point_size B16;
+} fsResolution;
+
+#endif /* _FS_PROTO_H_ */
diff --git a/fonts/utilities/ps2pk/ac/withenable.ac b/fonts/utilities/ps2pk/ac/withenable.ac
new file mode 100644
index 0000000000..2fc8d86e84
--- /dev/null
+++ b/fonts/utilities/ps2pk/ac/withenable.ac
@@ -0,0 +1,7 @@
+## texk/ps2pk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/ps2pk/
+dnl
+dnl Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+dnl You may freely use, modify and/or distribute this file.
+dnl
+## configure options and TL libraries required for ps2pk
+KPSE_ENABLE_PROG([ps2pk], [kpathsea])
diff --git a/fonts/utilities/ps2pk/aclocal.m4 b/fonts/utilities/ps2pk/aclocal.m4
new file mode 100644
index 0000000000..36330023bf
--- /dev/null
+++ b/fonts/utilities/ps2pk/aclocal.m4
@@ -0,0 +1,1179 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.1], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. Try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../../m4/kpse-common.m4])
+m4_include([../../m4/kpse-kpathsea-flags.m4])
+m4_include([../../m4/kpse-warnings.m4])
+m4_include([../../m4/libtool.m4])
+m4_include([../../m4/ltoptions.m4])
+m4_include([../../m4/ltsugar.m4])
+m4_include([../../m4/ltversion.m4])
+m4_include([../../m4/lt~obsolete.m4])
diff --git a/fonts/utilities/ps2pk/arith.c b/fonts/utilities/ps2pk/arith.c
new file mode 100644
index 0000000000..eba1b5dcde
--- /dev/null
+++ b/fonts/utilities/ps2pk/arith.c
@@ -0,0 +1,409 @@
+/* $XConsortium: arith.c,v 1.2 91/10/10 11:14:06 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* ARITH CWEB V0006 ******** */
+/*
+:h1.ARITH Module - Portable Module for Multiple Precision Fixed Point Arithmetic
+
+This module provides division and multiplication of 64-bit fixed point
+numbers. (To be more precise, the module works on numbers that take
+two 'longs' to store. That is almost always equivalent to saying 64-bit
+numbers.)
+
+Note: it is frequently easy and desirable to recode these functions in
+assembly language for the particular processor being used, because
+assembly language, unlike C, will have 64-bit multiply products and
+64-bit dividends. This module is offered as a portable version.
+
+&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Sten F. Andler
+
+
+:h3.Include Files
+
+The included files are:
+*/
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "arith.h"
+
+/*
+:h3.
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+Reference for all algorithms: Donald E. Knuth, "The Art of Computer
+Programming, Volume 2, Semi-Numerical Algorithms," Addison-Wesley Co.,
+Massachusetts, 1969, pp. 229-279.
+
+Knuth talks about a 'digit' being an arbitrary sized unit and a number
+being a sequence of digits. We'll take a digit to be a 'short'.
+The following assumption must be valid for these algorithms to work:
+:ol.
+:li.A 'long' is two 'short's.
+:eol.
+The following code is INDEPENDENT of:
+:ol.
+:li.The actual size of a short.
+:li.Whether shorts and longs are stored most significant byte
+first or least significant byte first.
+:eol.
+
+SHORTSIZE is the number of bits in a short; INT32SIZE is the number of
+bits in an int32_t; MAXSHORT is the maximum unsigned short:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+ASSEMBLE concatenates two shorts to form a long:
+*/
+#define ASSEMBLE(hi,lo) ((((uint32_t)hi)<<SHORTSIZE)+(lo))
+/*
+HIGHDIGIT extracts the most significant short from a long; LOWDIGIT
+extracts the least significant short from a long:
+*/
+#define HIGHDIGIT(u) ((u)>>SHORTSIZE)
+#define LOWDIGIT(u) ((u)&MAXSHORT)
+
+/*
+SIGNBITON tests the high order bit of a long 'w':
+*/
+#define SIGNBITON(w) (((int32_t)w)<0)
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h2.Double Long Arithmetic
+
+:h3.DLmult() - Multiply Two Longs to Yield a Double Long
+
+The two multiplicands must be positive.
+*/
+
+void DLmult(register doublelong *product, register uint32_t u, register uint32_t v)
+{
+ register uint32_t u1, u2; /* the digits of u */
+ register uint32_t v1, v2; /* the digits of v */
+ register unsigned int w1, w2, w3, w4; /* the digits of w */
+ register uint32_t t; /* temporary variable */
+/* printf("DLmult(? ?, %x, %x)\n", u, v); */
+ u1 = HIGHDIGIT(u);
+ u2 = LOWDIGIT(u);
+ v1 = HIGHDIGIT(v);
+ v2 = LOWDIGIT(v);
+
+ if (v2 == 0) w4 = w3 = w2 = 0;
+ else
+ {
+ t = u2 * v2;
+ w4 = LOWDIGIT(t);
+ t = u1 * v2 + HIGHDIGIT(t);
+ w3 = LOWDIGIT(t);
+ w2 = HIGHDIGIT(t);
+ }
+
+ if (v1 == 0) w1 = 0;
+ else
+ {
+ t = u2 * v1 + w3;
+ w3 = LOWDIGIT(t);
+ t = u1 * v1 + w2 + HIGHDIGIT(t);
+ w2 = LOWDIGIT(t);
+ w1 = HIGHDIGIT(t);
+ }
+
+ product->high = ASSEMBLE(w1, w2);
+ product->low = ASSEMBLE(w3, w4);
+}
+
+/*
+:h2.DLdiv() - Divide Two Longs by One Long, Yielding Two Longs
+
+Both the dividend and the divisor must be positive.
+*/
+
+void DLdiv(
+ doublelong *quotient, /* also where dividend is, originally */
+ uint32_t divisor)
+{
+ register uint32_t u1u2 = quotient->high;
+ register uint32_t u3u4 = quotient->low;
+ register int32_t u3; /* single digit of dividend */
+ register int v1,v2; /* divisor in registers */
+ register int32_t t; /* signed copy of u1u2 */
+ register int qhat; /* guess at the quotient digit */
+ register uint32_t q3q4; /* low two digits of quotient */
+ register int shift; /* holds the shift value for normalizing */
+ register int j; /* loop variable */
+
+/* printf("DLdiv(%x %x, %x)\n", quotient->high, quotient->low, divisor); */
+ /*
+ * Knuth's algorithm works if the dividend is smaller than the
+ * divisor. We can get to that state quickly:
+ */
+ if (u1u2 >= divisor) {
+ quotient->high = u1u2 / divisor;
+ u1u2 %= divisor;
+ }
+ else
+ quotient->high = 0;
+
+ if (divisor <= MAXSHORT) {
+
+ /*
+ * This is the case where the divisor is contained in one
+ * 'short'. It is worthwhile making this fast:
+ */
+ u1u2 = ASSEMBLE(u1u2, HIGHDIGIT(u3u4));
+ q3q4 = u1u2 / divisor;
+ u1u2 %= divisor;
+ u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3u4));
+ quotient->low = ASSEMBLE(q3q4, u1u2 / divisor);
+ return;
+ }
+
+
+ /*
+ * At this point the divisor is a true 'long' so we must use
+ * Knuth's algorithm.
+ *
+ * Step D1: Normalize divisor and dividend (this makes our 'qhat'
+ * guesses more accurate):
+ */
+ for (shift=0; !SIGNBITON(divisor); shift++, divisor <<= 1) { ; }
+ shift--;
+ divisor >>= 1;
+
+ if ((u1u2 >> (INT32SIZE - shift)) != 0 && shift != 0)
+ t1_abort("DLdiv: dividend too large");
+ u1u2 = (u1u2 << shift) + ((shift == 0) ? 0 : u3u4 >> (INT32SIZE - shift));
+ u3u4 <<= shift;
+
+ /*
+ * Step D2: Begin Loop through digits, dividing u1,u2,u3 by v1,v2,
+ * then shifting U left by 1 digit:
+ */
+ v1 = HIGHDIGIT(divisor);
+ v2 = LOWDIGIT(divisor);
+ q3q4 = 0;
+ u3 = HIGHDIGIT(u3u4);
+
+ for (j=0; j < 2; j++) {
+
+ /*
+ * Step D3: make a guess (qhat) at the next quotient denominator:
+ */
+ qhat = (HIGHDIGIT(u1u2) == v1) ? MAXSHORT : u1u2 / v1;
+ /*
+ * At this point Knuth would have us further refine our
+ * guess, since we know qhat is too big if
+ *
+ * v2 * qhat > ASSEMBLE(u1u2 % v, u3)
+ *
+ * That would make sense if u1u2 % v was easy to find, as it
+ * would be in assembly language. I ignore this step, and
+ * repeat step D6 if qhat is too big.
+ */
+
+ /*
+ * Step D4: Multiply v1,v2 times qhat and subtract it from
+ * u1,u2,u3:
+ */
+ u3 -= qhat * v2;
+ /*
+ * The high digit of u3 now contains the "borrow" for the
+ * rest of the substraction from u1,u2.
+ * Sometimes we can lose the sign bit with the above.
+ * If so, we have to force the high digit negative:
+ */
+ t = HIGHDIGIT(u3);
+ if (t > 0)
+ t |= -1 << SHORTSIZE;
+ t += u1u2 - qhat * v1;
+/* printf("..>divide step qhat=%x t=%x u3=%x u1u2=%x v1=%x v2=%x\n",
+ qhat, t, u3, u1u2, v1, v2); */
+ while (t < 0) { /* Test is Step D5. */
+
+ /*
+ * D6: Oops, qhat was too big. Add back in v1,v2 and
+ * decrease qhat by 1:
+ */
+ u3 = LOWDIGIT(u3) + v2;
+ t += HIGHDIGIT(u3) + v1;
+ qhat--;
+/* printf("..>>qhat correction t=%x u3=%x qhat=%x\n", t, u3, qhat); */
+ }
+ /*
+ * Step D7: shift U left one digit and loop:
+ */
+ u1u2 = t;
+ if (HIGHDIGIT(u1u2) != 0)
+ t1_abort("divide algorithm error");
+ u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3));
+ u3 = LOWDIGIT(u3u4);
+ q3q4 = ASSEMBLE(q3q4, qhat);
+ }
+ quotient->low = q3q4;
+/* printf("DLdiv returns %x %x\n", quotient->high, quotient->low); */
+ return;
+}
+
+/*
+:h3.DLadd() - Add Two Double Longs
+
+In this case, the doublelongs may be signed. The algorithm takes the
+piecewise sum of the high and low longs, with the possibility that the
+high should be incremented if there is a carry out of the low. How to
+tell if there is a carry? Alex Harbury suggested that if the sum of
+the lows is less than the max of the lows, there must have been a
+carry. Conversely, if there was a carry, the sum of the lows must be
+less than the max of the lows. So, the test is "if and only if".
+*/
+
+void DLadd(doublelong *u, doublelong *v) /* u = u + v */
+{
+ register uint32_t lowmax = MAX(u->low, v->low);
+
+/* printf("DLadd(%x %x, %x %x)\n", u->high, u->low, v->high, v->low); */
+ u->high += v->high;
+ u->low += v->low;
+ if (lowmax > u->low)
+ u->high++;
+}
+/*
+:h3.DLsub() - Subtract Two Double Longs
+
+Testing for a borrow is even easier. If the v.low is greater than
+u.low, there must be a borrow.
+*/
+
+void DLsub(doublelong *u, doublelong *v) /* u = u - v */
+{
+/* printf("DLsub(%x %x, %x %x)\n", u->high, u->low, v->high, v->low);*/
+ u->high -= v->high;
+ if (v->low > u->low)
+ u->high--;
+ u->low -= v->low;
+}
+/*
+:h3.DLrightshift() - Macro to Shift Double Long Right by N
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h2.Fractional Pel Arithmetic
+*/
+/*
+:h3.FPmult() - Multiply Two Fractional Pel Values
+
+This funtion first calculates w = u * v to "doublelong" precision.
+It then shifts w right by FRACTBITS bits, and checks that no
+overflow will occur when the resulting value is passed back as
+a fractpel.
+*/
+
+fractpel FPmult(register fractpel u, register fractpel v)
+{
+ doublelong w;
+ register int negative = FALSE; /* sign flag */
+
+ if ((u == 0) || (v == 0)) return (0);
+
+
+ if (u < 0) {u = -u; negative = TRUE;}
+ if (v < 0) {v = -v; negative = !negative;}
+
+ if (u == TOFRACTPEL(1)) return ((negative) ? -v : v);
+ if (v == TOFRACTPEL(1)) return ((negative) ? -u : u);
+
+ DLmult(&w, u, v);
+ DLrightshift(w, FRACTBITS);
+ if (w.high != 0 || SIGNBITON(w.low)) {
+ IfTrace2(TRUE,"FPmult: overflow, %dx%d\n", u, v);
+ w.low = TOFRACTPEL(MAXSHORT);
+ }
+
+ return ((negative) ? -w.low : w.low);
+}
+
+/*
+:h3.FPdiv() - Divide Two Fractional Pel Values
+
+These values may be signed. The function returns the quotient.
+*/
+
+fractpel FPdiv(register fractpel dividend, register fractpel divisor)
+{
+ doublelong w; /* result will be built here */
+ int negative = FALSE; /* flag for sign bit */
+
+ if (dividend < 0) {
+ dividend = -dividend;
+ negative = TRUE;
+ }
+ if (divisor < 0) {
+ divisor = -divisor;
+ negative = !negative;
+ }
+ w.low = dividend << FRACTBITS;
+ w.high = dividend >> (INT32SIZE - FRACTBITS);
+ DLdiv(&w, divisor);
+ if (w.high != 0 || SIGNBITON(w.low)) {
+ IfTrace2(TRUE,"FPdiv: overflow, %d/%d\n", dividend, divisor);
+ w.low = TOFRACTPEL(MAXSHORT);
+ }
+ return( (negative) ? -w.low : w.low);
+}
+
+/*
+:h3.FPstarslash() - Multiply then Divide
+
+Borrowing a chapter from the language Forth, it is useful to define
+an operator that first multiplies by one constant then divides by
+another, keeping the intermediate result in extended precision.
+*/
+
+fractpel FPstarslash(register fractpel a, register fractpel b,
+ register fractpel c) /* result = a * b / c */
+{
+ doublelong w; /* result will be built here */
+ int negative = FALSE;
+
+ if (a < 0) { a = -a; negative = TRUE; }
+ if (b < 0) { b = -b; negative = !negative; }
+ if (c < 0) { c = -c; negative = !negative; }
+
+ DLmult(&w, a, b);
+ DLdiv(&w, c);
+ if (w.high != 0 || SIGNBITON(w.low)) {
+ IfTrace3(TRUE,"FPstarslash: overflow, %d*%d/%d\n", a, b, c);
+ w.low = TOFRACTPEL(MAXSHORT);
+ }
+ return((negative) ? -w.low : w.low);
+}
diff --git a/fonts/utilities/ps2pk/arith.h b/fonts/utilities/ps2pk/arith.h
new file mode 100644
index 0000000000..fa3e1ecd2c
--- /dev/null
+++ b/fonts/utilities/ps2pk/arith.h
@@ -0,0 +1,70 @@
+/* $XConsortium: arith.h,v 1.2 91/10/10 11:17:49 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+/* MAXSHORT may be defined by <limits.h> */
+#ifdef MAXSHORT
+#undef MAXSHORT
+#endif
+
+#define SHORTSIZE (sizeof(SHORT)*8)
+#define INT32SIZE (SHORTSIZE*2)
+#define MAXSHORT ((1<<SHORTSIZE)-1)
+
+/*END SHARED*/
+/*SHARED*/
+
+typedef struct {
+ int32_t high;
+ int32_t low;
+} doublelong;
+
+/*END SHARED*/
+/*SHARED*/
+
+#define DLrightshift(dl,N) { \
+ dl.low = (dl.low >> N) + (((uint32_t) dl.high) << (INT32SIZE - N)); \
+ dl.high >>= N; \
+}
+
+/*END SHARED*/
+/*SHARED*/
+
+#include "types.h"
+
+void DLmult(doublelong *, uint32_t, uint32_t),
+ DLdiv(doublelong *, uint32_t),
+ DLadd(doublelong *, doublelong *),
+ DLsub(doublelong *, doublelong *);
+
+fractpel FPmult(fractpel, fractpel);
+fractpel FPdiv(fractpel, fractpel);
+fractpel FPstarslash(fractpel, fractpel, fractpel);
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/basename.c b/fonts/utilities/ps2pk/basename.c
new file mode 100644
index 0000000000..624b746778
--- /dev/null
+++ b/fonts/utilities/ps2pk/basename.c
@@ -0,0 +1,23 @@
+/*
+ * FILE: basename.c
+ * PURPOSE: a reimplementation of BSD's basename so that it can also be
+ * used as a function in other programs (see filenames.c and
+ * filenames.h)
+ * AUTHOR: Piet Tutelaers
+ * VERSION: 1.0 (Sept. 1995)
+ */
+#include <stdio.h> /* printf() */
+#include "basics.h" /* fatal() */
+#include "filenames.h" /* basename() */
+
+main(int argc, char **argv)
+{
+ if (argc < 2 || argc > 3)
+ fatal("Usage: basename string [suffix]\n");
+
+ if (argc == 2)
+ printf("%s\n", basename(argv[1], NULL));
+ else
+ printf("%s\n", basename(argv[1], argv[2]));
+ exit(0);
+}
diff --git a/fonts/utilities/ps2pk/basics.c b/fonts/utilities/ps2pk/basics.c
new file mode 100644
index 0000000000..6b1842d5ea
--- /dev/null
+++ b/fonts/utilities/ps2pk/basics.c
@@ -0,0 +1,27 @@
+/* FILE: basics.c
+ * PURPOSE: basic functions
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+#include "basics.h"
+
+/* Give up ... */
+void fatal(const char *fmt, ...)
+{ va_list args;
+
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+ exit(1);
+}
+
+/* Give a message ... */
+void msg(const char *fmt, ...)
+{ va_list args;
+
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ fflush(stderr);
+ va_end(args);
+}
diff --git a/fonts/utilities/ps2pk/basics.h b/fonts/utilities/ps2pk/basics.h
new file mode 100644
index 0000000000..28c9c80831
--- /dev/null
+++ b/fonts/utilities/ps2pk/basics.h
@@ -0,0 +1,99 @@
+/* FILE: basics.h
+ * PURPOSE: basic definitions
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#ifndef NOBASICS
+
+#if defined(KPATHSEA)
+# include <kpathsea/config.h>
+# include <kpathsea/c-pathch.h>
+# include <kpathsea/c-fopen.h>
+# define PATHSEP ENV_SEP
+# define DIRSEP DIR_SEP
+# define RB FOPEN_RBIN_MODE
+# define WB FOPEN_WBIN_MODE
+# if defined(DOSISH)
+# define ESCAPECHAR '!'
+# define RECURSIVE "!!"
+# endif /* DOSISH */
+# define basename ps2pk_basename
+#elif defined(MSDOS) || defined(WIN32)
+# define PATHSEP ';'
+# define DIRSEP '\\'
+# define ESCAPECHAR '!'
+# define RECURSIVE "!!"
+# define PSRES_NAME "psres.dpr"
+# define RB "rb"
+# define WB "wb"
+#endif
+
+#ifndef PATHSEP
+#define PATHSEP ':'
+#endif
+
+#ifndef DIRSEP
+#define DIRSEP '/'
+#endif
+
+#ifndef ESCAPECHAR
+#define ESCAPECHAR '\\'
+#endif
+
+#ifndef RECURSIVE
+#define RECURSIVE "//"
+#endif
+
+/* TeX PS Resource database name */
+#ifndef PSRES_NAME
+#define PSRES_NAME "PSres.upr"
+#endif
+
+#ifndef RB
+#define RB "r"
+#endif
+
+#ifndef WB
+#define WB "w"
+#endif
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 256
+#endif
+
+#ifndef MAXSTRLEN
+#define MAXSTRLEN 256
+#endif
+
+#ifndef IS_DIR_SEP
+#define IS_DIR_SEP(c) ((c) == DIRSEP)
+#endif
+
+#define NOBASICS
+#endif
+
+#include <stdarg.h>
+
+#if defined __GNUC__ && __GNUC__ >=3
+__attribute__((__noreturn__))
+#elif defined _MSC_VER && 1200 <= _MSC_VER
+__declspec (noreturn)
+#endif
+void fatal(const char *fmt, ...);
+void msg(const char *fmt, ...);
+
+extern char *encfile, *afmfile;
+
+/* For debugging purposes it is handy to have a fopen() function that
+ * shows which files are opened.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h> /* struct stat */
+#include <sys/stat.h> /* stat() */
diff --git a/fonts/utilities/ps2pk/blues.h b/fonts/utilities/ps2pk/blues.h
new file mode 100644
index 0000000000..8d6a486e04
--- /dev/null
+++ b/fonts/utilities/ps2pk/blues.h
@@ -0,0 +1,93 @@
+/* $XConsortium: blues.h,v 1.2 91/10/10 11:17:52 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ * Portions Copyright (c) 1990 Adobe Systems Incorporated.
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark or Adobe
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY
+ * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE
+ * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING
+ * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY
+ * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM,
+ * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND
+ * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "types.h"
+
+#define TOPLEFT 1
+#define BOTTOMRIGHT 2
+
+#define NUMBLUEVALUES 14
+#define NUMOTHERBLUES 10
+#define NUMFAMILYBLUES 14
+#define NUMFAMILYOTHERBLUES 10
+#define NUMSTEMSNAPH 12
+#define NUMSTEMSNAPV 12
+#define NUMSTDHW 1
+#define NUMSTDVW 1
+
+#define DEFAULTBOLDSTEMWIDTH 2.0
+
+#define MAXALIGNMENTZONES ((NUMBLUEVALUES+NUMOTHERBLUES)/2)
+#define DEFAULTBLUESCALE 0.039625
+#define DEFAULTBLUESHIFT 7
+#define DEFAULTBLUEFUZZ 1
+#define DEFAULTSTDHW 0
+#define DEFAULTSTDVW 0
+#define DEFAULTFORCEBOLD FALSE
+#define DEFAULTLANGUAGEGROUP 0
+#define DEFAULTRNDSTEMUP FALSE
+#define DEFAULTLENIV 4
+#define DEFAULTEXPANSIONFACTOR 0.06
+
+/* see Type 1 Font Format book for explanations of these values */
+/* Note that we're currently doing nothing for minfeature and password. */
+struct blues_struct {
+ struct blues_struct *next; /* ptr to next Blues structure in list */
+ int numBlueValues; /* # of BlueValues in following array */
+ int BlueValues[NUMBLUEVALUES];
+ int numOtherBlues; /* # of OtherBlues values in following array */
+ int OtherBlues[NUMOTHERBLUES];
+ int numFamilyBlues; /* # of FamilyBlues values in following array */
+ int FamilyBlues[NUMFAMILYBLUES];
+ int numFamilyOtherBlues; /* # of FamilyOtherBlues values in */
+ int FamilyOtherBlues[NUMFAMILYOTHERBLUES]; /* this array */
+ DOUBLE BlueScale;
+ int BlueShift;
+ int BlueFuzz;
+ DOUBLE StdHW;
+ DOUBLE StdVW;
+ int numStemSnapH; /* # of StemSnapH values in following array */
+ DOUBLE StemSnapH[NUMSTEMSNAPH];
+ int numStemSnapV; /* # of StemSnapV values in following array */
+ DOUBLE StemSnapV[NUMSTEMSNAPV];
+ int ForceBold;
+ int LanguageGroup;
+ int RndStemUp;
+ int lenIV;
+ DOUBLE ExpansionFactor;
+};
+
+/* the alignment zone structure -- somewhat similar to the stem structure */
+/* see Adobe Type1 Font Format book about the terms used in this structure */
+struct alignmentzone {
+ int topzone; /* TRUE if a topzone, FALSE if a bottom zone */
+ DOUBLE bottomy, topy; /* interval of this alignment zone */
+};
diff --git a/fonts/utilities/ps2pk/bstring.c b/fonts/utilities/ps2pk/bstring.c
new file mode 100644
index 0000000000..250eece830
--- /dev/null
+++ b/fonts/utilities/ps2pk/bstring.c
@@ -0,0 +1,13 @@
+/*
+ * A simple memset() in case your ANSI C does not provide it
+ */
+
+#include "c-auto.h"
+
+#if !defined(HAVE_MEMSET) && !defined(memset)
+memset(void *s, int c, int length)
+{ char *p = s;
+
+ while (length--) *(p++) = c;
+}
+#endif
diff --git a/fonts/utilities/ps2pk/c-auto.in b/fonts/utilities/ps2pk/c-auto.in
new file mode 100644
index 0000000000..f6eb86702d
--- /dev/null
+++ b/fonts/utilities/ps2pk/c-auto.in
@@ -0,0 +1,196 @@
+/* c-auto.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+#undef CLOSEDIR_VOID
+
+/* Define to 1 if you have the <assert.h> header file. */
+#undef HAVE_ASSERT_H
+
+/* Define to 1 if you have the declaration of `isascii', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISASCII
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the <float.h> header file. */
+#undef HAVE_FLOAT_H
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getwd' function. */
+#undef HAVE_GETWD
+
+/* Define to 1 if the system has the type `intptr_t'. */
+#undef HAVE_INTPTR_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `memcmp' function. */
+#undef HAVE_MEMCMP
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the `mktemp' function. */
+#undef HAVE_MKTEMP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strrchr' function. */
+#undef HAVE_STRRCHR
+
+/* Define to 1 if `st_mtim' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_MTIM
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT32_T
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT64_T
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to the type of a signed integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int32_t
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int64_t
+
+/* Define to the type of a signed integer type wide enough to hold a pointer,
+ if such a type exists, and if the system does not define it. */
+#undef intptr_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to the type of an unsigned integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint32_t
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint64_t
diff --git a/fonts/utilities/ps2pk/cluts.h b/fonts/utilities/ps2pk/cluts.h
new file mode 100644
index 0000000000..fe51e02f9a
--- /dev/null
+++ b/fonts/utilities/ps2pk/cluts.h
@@ -0,0 +1,35 @@
+/* $XConsortium: cluts.h,v 1.2 91/10/10 11:17:54 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* STUB */
+
+#define KillCLUT(T)
+#define CopyCLUT(T) T
+#define UniqueCLUT(T)
+
diff --git a/fonts/utilities/ps2pk/configure b/fonts/utilities/ps2pk/configure
new file mode 100755
index 0000000000..c071336652
--- /dev/null
+++ b/fonts/utilities/ps2pk/configure
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# Pseudo configure for CTAN releases of DVI drivers from the texk
+# source tree.
+
+cat <<'_EOT_'
+
+Sorry, but this configure script won't be of much use for you.
+
+This source directory from CTAN can only be compiled in a texk build
+environment. You will need to download the whole environment, please
+refer to http://www.tug.org/texlive/svn/.
+
+It all boils down to a Subversion checkout of
+svn://tug.org/texlive/trunk/Build/source
+This will be the source tree that you can use for compilation. The
+CTAN tree is there for archival and informational purpose.
+
+For your convenience, the original configure script from the texk
+source tree is available in this directory as configure.texk.
+
+_EOT_
+
+exit 1
diff --git a/fonts/utilities/ps2pk/configure.ac b/fonts/utilities/ps2pk/configure.ac
new file mode 100644
index 0000000000..9d0f79dc68
--- /dev/null
+++ b/fonts/utilities/ps2pk/configure.ac
@@ -0,0 +1,42 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl Copyright 2009-2016 Peter Breitenlohner <tex-live@tug.org>
+dnl
+dnl This file is free software; the copyright holder
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+AC_INIT([ps2pkm (TeX Live)], [1.8], [tex-k@tug.org])
+AC_PREREQ([2.65])
+AC_CONFIG_SRCDIR([arith.c])
+AC_CONFIG_AUX_DIR([../../build-aux])
+AC_CONFIG_MACRO_DIR([../../m4])
+
+dnl Common code for all programs using libkpathsea.
+KPSE_COMMON([ps2pkm], [no-define])
+
+AC_SEARCH_LIBS([pow], [m])
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([fcntl.h])
+
+dnl Checks for types.
+AC_TYPE_INT32_T
+AC_TYPE_INTPTR_T
+AC_TYPE_UINT32_T
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([memset])
+
+AC_CONFIG_HEADERS([c-auto.h:c-auto.in])
+
+dnl For tests
+AC_CHECK_PROGS([KPSEWHICH], [kpsewhich], [false])
+
+KPSE_KPATHSEA_FLAGS
+
+AC_CONFIG_FILES([Makefile])
+
+AC_OUTPUT
diff --git a/fonts/utilities/ps2pk/configure.texk b/fonts/utilities/ps2pk/configure.texk
new file mode 100755
index 0000000000..475349d659
--- /dev/null
+++ b/fonts/utilities/ps2pk/configure.texk
@@ -0,0 +1,17537 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for ps2pkm (TeX Live) 1.8.
+#
+# Report bugs to <tex-k@tug.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='ps2pkm (TeX Live)'
+PACKAGE_TARNAME='ps2pkm--tex-live-'
+PACKAGE_VERSION='1.8'
+PACKAGE_STRING='ps2pkm (TeX Live) 1.8'
+PACKAGE_BUGREPORT='tex-k@tug.org'
+PACKAGE_URL=''
+
+ac_unique_file="arith.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+KPATHSEA_RULE
+KPATHSEA_DEPEND
+KPATHSEA_LIBS
+KPATHSEA_INCLUDES
+PKG_CONFIG
+KPSEWHICH
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+WARNING_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_compiler_warnings
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+with_system_kpathsea
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+LT_SYS_LIBRARY_PATH
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures ps2pkm (TeX Live) 1.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root
+ [DATAROOTDIR/doc/ps2pkm--tex-live-]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of ps2pkm (TeX Live) 1.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-compiler-warnings=[no|min|yes|max|all]
+ Turn on compiler warnings [default: yes if
+ maintainer-mode, min otherwise]
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-static[=PKGS] build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --disable-largefile omit support for large files
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-system-kpathsea use installed kpathsea headers and library (requires
+ pkg-config)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <tex-k@tug.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+ps2pkm (TeX Live) configure 1.8
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ---------------------------- ##
+## Report this to tex-k@tug.org ##
+## ---------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_find_intX_t LINENO BITS VAR
+# -----------------------------------
+# Finds a signed integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_intX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+$as_echo_n "checking for int$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in int$2_t 'int' 'long int' \
+ 'long long int' 'short int' 'signed char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ case $ac_type in #(
+ int$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_intX_t
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by ps2pkm (TeX Live) $as_me 1.8, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_aux_dir=
+for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+
+
+am__api_version='1.16'
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+# Check whether --enable-compiler-warnings was given.
+if test "${enable_compiler_warnings+set}" = set; then :
+ enableval=$enable_compiler_warnings;
+fi
+case $enable_compiler_warnings in #(
+ no | min | yes | max | all) :
+ ;; #(
+ *) :
+ if test "x$enable_maintainer_mode" = xyes; then :
+ enable_compiler_warnings=yes
+else
+ enable_compiler_warnings=min
+fi ;;
+esac
+
+case `pwd` in
+ *\ * | *\ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in fgrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+ withval=$with_sysroot;
+else
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in dd; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_cc_needs_belf=yes
+else
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_ld_exported_symbols_list=yes
+else
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+##tldbg KPSE_COMMON: ps2pkm (no-define).
+##tldbg KPSE_BASIC: Remember ps2pkm (no-define) as Kpse_Package (for future messages).
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='ps2pkm--tex-live-'
+ VERSION='1.8'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler accepts prototypes" >&5
+$as_echo_n "checking whether the compiler accepts prototypes... " >&6; }
+if ${kb_cv_c_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+extern void foo(int i,...);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kb_cv_c_prototypes=yes
+else
+ kb_cv_c_prototypes=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kb_cv_c_prototypes" >&5
+$as_echo "$kb_cv_c_prototypes" >&6; }
+if test "x$kb_cv_c_prototypes" = xno; then
+ as_fn_error $? "Sorry, your compiler does not understand prototypes." "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5
+$as_echo_n "checking what warning flags to pass to the C compiler... " >&6; }
+if ${kpse_cv_warning_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$GCC" = xyes; then
+ kpse_cv_warning_cflags=
+if test "x$enable_compiler_warnings" != xno; then
+ kpse_cv_warning_cflags="-Wimplicit -Wreturn-type"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #(
+ *) :
+ ;;
+esac
+ case `$CC -dumpversion` in #(
+ 3.[234].* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmin; then
+ kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations"
+ if test "x$enable_compiler_warnings" != xyes; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmax; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow"
+ fi
+ fi
+ fi
+fi
+elif test "x$enable_compiler_warnings" = xno; then
+ kpse_cv_warning_cflags=
+else
+ kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5
+$as_echo "$kpse_cv_warning_cflags" >&6; }
+WARNING_CFLAGS=$kpse_cv_warning_cflags
+
+
+
+
+
+
+
+
+
+
+
+
+# Set options
+enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+$as_echo "$AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+$as_echo "$ac_ct_AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_AS" = x; then
+ AS="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AS=$ac_ct_AS
+ fi
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+ ;;
+esac
+
+test -z "$AS" && AS=as
+
+
+
+
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+
+ # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else
+ if ${lt_cv_with_aix_soname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_irix_exported_symbol=yes
+else
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_shl_load=yes
+else
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_svld_dlopen=yes
+else
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_dld_link=yes
+else
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP"; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_source+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
+$as_echo_n "checking whether closedir returns void... " >&6; }
+if ${ac_cv_func_closedir_void+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_closedir_void=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header_dirent>
+#ifndef __cplusplus
+int closedir ();
+#endif
+
+int
+main ()
+{
+return closedir (opendir (".")) != 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_closedir_void=no
+else
+ ac_cv_func_closedir_void=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
+$as_echo "$ac_cv_func_closedir_void" >&6; }
+if test $ac_cv_func_closedir_void = yes; then
+
+$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
+
+fi
+
+for ac_header in assert.h float.h limits.h pwd.h stdlib.h sys/param.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in putenv
+do :
+ ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PUTENV 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getcwd getwd memcmp memcpy mkstemp mktemp strchr strrchr
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t"
+case $ac_cv_c_int64_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int64_t $ac_cv_c_int64_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
+case $ac_cv_c_uint64_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT64_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t $ac_cv_c_uint64_t
+_ACEOF
+;;
+ esac
+
+case :$ac_cv_c_int64_t:$ac_cv_c_int64_t: in #(
+ *':no:'*) :
+ as_fn_error $? "Sorry, your compiler does not support 64-bit integer types." "$LINENO" 5 ;; #(
+ *) :
+ ;;
+esac
+ac_fn_c_check_decl "$LINENO" "isascii" "ac_cv_have_decl_isascii" "#include <ctype.h>
+"
+if test "x$ac_cv_have_decl_isascii" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISASCII $ac_have_decl
+_ACEOF
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_MTIM 1
+_ACEOF
+
+
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5
+$as_echo_n "checking for library containing pow... " >&6; }
+if ${ac_cv_search_pow+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pow ();
+int
+main ()
+{
+return pow ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_pow=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_pow+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_pow+:} false; then :
+
+else
+ ac_cv_search_pow=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5
+$as_echo "$ac_cv_search_pow" >&6; }
+ac_res=$ac_cv_search_pow
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+for ac_header in fcntl.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
+if test "x$ac_cv_header_fcntl_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FCNTL_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t"
+case $ac_cv_c_int32_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int32_t $ac_cv_c_int32_t
+_ACEOF
+;;
+esac
+
+
+ ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_intptr_t" = xyes; then :
+
+$as_echo "#define HAVE_INTPTR_T 1" >>confdefs.h
+
+else
+ for ac_type in 'int' 'long int' 'long long int'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define intptr_t $ac_type
+_ACEOF
+
+ ac_type=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test -z "$ac_type" && break
+ done
+fi
+
+
+ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t"
+case $ac_cv_c_uint32_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT32_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint32_t $ac_cv_c_uint32_t
+_ACEOF
+;;
+ esac
+
+
+for ac_func in vprintf
+do :
+ ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
+if test "x$ac_cv_func_vprintf" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VPRINTF 1
+_ACEOF
+
+ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt"
+if test "x$ac_cv_func__doprnt" = xyes; then :
+
+$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h
+
+fi
+
+fi
+done
+
+
+for ac_func in memset
+do :
+ ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset"
+if test "x$ac_cv_func_memset" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_MEMSET 1
+_ACEOF
+
+fi
+done
+
+
+ac_config_headers="$ac_config_headers c-auto.h:c-auto.in"
+
+
+for ac_prog in kpsewhich
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_KPSEWHICH+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$KPSEWHICH"; then
+ ac_cv_prog_KPSEWHICH="$KPSEWHICH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_KPSEWHICH="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+KPSEWHICH=$ac_cv_prog_KPSEWHICH
+if test -n "$KPSEWHICH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KPSEWHICH" >&5
+$as_echo "$KPSEWHICH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$KPSEWHICH" && break
+done
+test -n "$KPSEWHICH" || KPSEWHICH="false"
+
+
+kpse_save_CPPFLAGS=$CPPFLAGS
+kpse_save_LIBS=$LIBS
+
+##tldbg _KPSE_INIT: Initialize TL infrastructure.
+kpse_BLD=`(cd "./../../." && pwd)`
+kpse_SRC=`(cd "$srcdir/../../." && pwd)`
+
+##tldbg _KPSE_USE_LIBTOOL: Generate a libtool script for use in configure tests.
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+ps2pkm (TeX Live) config.lt 1.8
+configured by $0, generated by GNU Autoconf 2.69.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $#
+do
+ case $1 in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) as_fn_error $? "unrecognized option: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+
+ *) as_fn_error $? "unrecognized argument: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="./libtool --mode=link --tag=CC $ac_link"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PKG_CONFIG"; then
+ ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PKG_CONFIG="${ac_tool_prefix}pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_PKG_CONFIG"; then
+ ac_ct_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_PKG_CONFIG"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG
+if test -n "$ac_ct_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5
+$as_echo "$ac_ct_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_PKG_CONFIG" = x; then
+ PKG_CONFIG="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_ct_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_prog_PKG_CONFIG"
+fi
+
+##tldbg _KPSE_LIB_FLAGS: Setup kpathsea (-lkpathsea) flags.
+echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=kpathsea, libname=kpathsea, options=lt, tlincl=-IBLD/texk -ISRC/texk, tllib=BLD/texk/kpathsea/libkpathsea.la, tlextra=, rebuildsrcdeps=${top_srcdir}/../kpathsea/*.[ch], rebuildblddeps=${top_builddir}/../kpathsea/paths.h.' >&5
+##tldbg _KPSE_LIB_FLAGS_TL: kpathsea (kpathsea) lt.
+
+# Check whether --with-system-kpathsea was given.
+if test "${with_system_kpathsea+set}" = set; then :
+ withval=$with_system_kpathsea;
+fi
+if test "x$with_system_kpathsea" = xyes; then
+ if $PKG_CONFIG kpathsea; then
+ KPATHSEA_INCLUDES=`$PKG_CONFIG kpathsea --cflags`
+ KPATHSEA_LIBS=`$PKG_CONFIG kpathsea --libs`
+elif test "x$need_kpathsea:$with_system_kpathsea" = xyes:yes; then
+ as_fn_error $? "did not find kpathsea" "$LINENO" 5
+fi
+else
+ KPATHSEA_INCLUDES="-I$kpse_BLD/texk -I$kpse_SRC/texk"
+ KPATHSEA_LIBS="$kpse_BLD/texk/kpathsea/libkpathsea.la"
+ KPATHSEA_DEPEND='${top_builddir}/../kpathsea/libkpathsea.la'
+ KPATHSEA_RULE='# Rebuild libkpathsea
+$(KPATHSEA_DEPEND): ${top_srcdir}/../kpathsea/*.[ch] ${top_builddir}/../kpathsea/paths.h
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild
+${top_builddir}/../kpathsea/paths.h:
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild'
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libkpathsea supports debugging" >&5
+$as_echo_n "checking if libkpathsea supports debugging... " >&6; }
+if ${kpse_cv_kpse_debug+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval CPPFLAGS=\"$KPATHSEA_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$KPATHSEA_LIBS \$LIBS\"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+int
+main ()
+{
+FILE *f = fopen("f", "r")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kpse_cv_kpse_debug=yes
+else
+ kpse_cv_kpse_debug=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_kpse_debug" >&5
+$as_echo "$kpse_cv_kpse_debug" >&6; }
+if test "x$kpse_cv_kpse_debug" != xyes; then :
+ KPATHSEA_INCLUDES="$KPATHSEA_INCLUDES -DNO_DEBUG"
+fi
+
+
+ac_config_files="$ac_config_files Makefile"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by ps2pkm (TeX Live) $as_me 1.8, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <tex-k@tug.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+ps2pkm (TeX Live) config.status 1.8
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+ac_aux_dir='$ac_aux_dir'
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "c-auto.h") CONFIG_HEADERS="$CONFIG_HEADERS c-auto.h:c-auto.in" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. Try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/fonts/utilities/ps2pk/curves.c b/fonts/utilities/ps2pk/curves.c
new file mode 100644
index 0000000000..08b7a866d1
--- /dev/null
+++ b/fonts/utilities/ps2pk/curves.c
@@ -0,0 +1,222 @@
+/* $XConsortium: curves.c,v 1.3 91/10/10 11:17:56 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991 */
+/* All Rights Reserved */
+
+/* License to use, copy, modify, and distribute this software */
+/* and its documentation for any purpose and without fee is */
+/* hereby granted, provided that licensee provides a license to */
+/* IBM, Corp. to use, copy, modify, and distribute derivative */
+/* works and their documentation for any purpose and without */
+/* fee, that the above copyright notice appear in all copies */
+/* and that both that copyright notice and this permission */
+/* notice appear in supporting documentation, and that the name */
+/* of IBM not be used in advertising or publicity pertaining to */
+/* distribution of the software without specific, written prior */
+/* permission. */
+
+/* IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES */
+/* OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT */
+/* LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, */
+/* FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF */
+/* THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND */
+/* PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT */
+/* OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF */
+/* THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES */
+/* THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN */
+/* NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR */
+/* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING */
+/* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF */
+/* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT */
+/* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */
+/* SOFTWARE. */
+/*
+:h1.CURVES Module - Stepping Beziers
+
+This module is responsible for "rasterizing"
+third order curves. That is, it changes the high level curve
+specification into a list of pels that that curve travels
+through.
+
+:h3.Include Files
+
+Include files needed:
+*/
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "curves.h"
+#include "lines.h"
+#include "arith.h"
+
+
+/*
+:h3.Functions Provided to Other Modules
+
+External entry points:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+Note that "stepping" and "flattening" are so similiar that they use the
+same routine. When the "region" parameter is NULL, that is a flag that
+we are flattening instead of stepping.
+*/
+/*
+:h2.Bezier Third Order Curves
+*/
+/*
+:h3.The "bezierinfo" Structure
+
+This structure is used to store information used when we subdivide
+Bezier curves.
+*/
+
+struct bezierinfo {
+ struct region *region; /* the region being built or NULL */
+ struct fractpoint last; /* not used yet; maybe could save some work */
+ struct fractpoint origin; /* the origin of the bezier */
+} ;
+
+/*
+ Checking for termination of the subdivision process:
+ This is the stupidest test in the world, just check if the coordinatewise
+ distance from an end control point to the next control point is less than
+ one half pel. If so, we must be done.
+ This returns 1 if the subdivision is terminated and 0 if you still need
+ to subdivide.
+*/
+
+static int BezierTerminationTest(fractpel xa, fractpel ya, fractpel xb, fractpel yb,
+ fractpel xc, fractpel yc, fractpel xd, fractpel yd)
+{
+ fractpel dmax;
+ dmax = ABS(xa - xb);
+ dmax = MAX(dmax,ABS(ya - yb));
+ dmax = MAX(dmax,ABS(xd - xc));
+ dmax = MAX(dmax,ABS(yd - yc));
+ if(dmax > FPHALF)
+ return(0); /* not done yet */
+ else
+ return(1); /* done */
+}
+
+/*
+:h3.StepBezierRecurse() - The Recursive Logic in StepBezier()
+
+The recursion involves dividing the control polygon into two smaller
+control polygons by finding the midpoints of the lines. This idea is
+described in any graphics text book and its simplicity is what caused
+Bezier to define his curves as he did. If the input region 'R' is NULL,
+the result is a path that is the 'flattened' curve; otherwise StepBezier
+returns nothing special.
+*/
+static struct segment *StepBezierRecurse(
+ struct bezierinfo *I, /* Region under construction or NULL */
+ fractpel xA, fractpel yA, /* A control point */
+ fractpel xB, fractpel yB, /* B control point */
+ fractpel xC, fractpel yC, /* C control point */
+ fractpel xD, fractpel yD) /* D control point */
+
+{
+ if (BezierTerminationTest(xA,yA,xB,yB,xC,yC,xD,yD))
+ {
+ if (I->region == NULL)
+ return(PathSegment(LINETYPE, xD - xA, yD - yA));
+ else
+ StepLine(I->region, I->origin.x + xA, I->origin.y + yA,
+ I->origin.x + xD, I->origin.y + yD);
+ }
+ else
+ {
+ fractpel xAB,yAB;
+ fractpel xBC,yBC;
+ fractpel xCD,yCD;
+ fractpel xABC,yABC;
+ fractpel xBCD,yBCD;
+ fractpel xABCD,yABCD;
+
+ xAB = xA + xB; yAB = yA + yB;
+ xBC = xB + xC; yBC = yB + yC;
+ xCD = xC + xD; yCD = yC + yD;
+
+ xABC = xAB + xBC; yABC = yAB + yBC;
+ xBCD = xBC + xCD; yBCD = yBC + yCD;
+
+ xABCD = xABC + xBCD; yABCD = yABC + yBCD;
+
+ xAB >>= 1; yAB >>= 1;
+ xBC >>= 1; yBC >>= 1;
+ xCD >>= 1; yCD >>= 1;
+ xABC >>= 2; yABC >>= 2;
+ xBCD >>= 2; yBCD >>= 2;
+ xABCD >>= 3; yABCD >>= 3;
+
+ if (I->region == NULL)
+ {
+ return( Join(
+ StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD),
+ StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD)
+ )
+ );
+ }
+ else
+ {
+ StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD);
+ StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD);
+ }
+ }
+ /*NOTREACHED*/
+ return NULL;
+}
+
+/*
+:h3.TOOBIG() - Macro to Test if a Coordinate is Too Big to Bezier SubDivide Normally
+
+Intermediate values in the Bezier subdivision are 8 times bigger than
+the starting values. If this overflows, a 'long', we are in trouble:
+*/
+
+#if defined(BITS)
+#undef BITS
+#endif
+#define BITS (sizeof(int32_t)*8)
+#define HIGHTEST(p) (((p)>>(BITS-4)) != 0) /* includes sign bit */
+#define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy))
+
+/*
+:h3.StepBezier() - Produce Run Ends for a Bezier Curve
+
+This is the entry point called from outside the module.
+*/
+
+struct segment *StepBezier(
+ struct region *R, /* Region under construction or NULL */
+ fractpel xA, fractpel yA, /* A control point */
+ fractpel xB, fractpel yB, /* B control point */
+ fractpel xC, fractpel yC, /* C control point */
+ fractpel xD, fractpel yD) /* D control point */
+{
+ struct bezierinfo Info;
+
+ Info.region = R;
+ Info.origin.x = xA;
+ Info.origin.y = yA;
+
+ xB -= xA;
+ xC -= xA;
+ xD -= xA;
+ yB -= yA;
+ yC -= yA;
+ yD -= yA;
+
+ if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC)
+ || TOOBIG(xD) || TOOBIG(yD) )
+ t1_abort("Beziers this big not yet supported");
+
+ return(StepBezierRecurse(&Info,
+ (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD));
+}
+
diff --git a/fonts/utilities/ps2pk/curves.h b/fonts/utilities/ps2pk/curves.h
new file mode 100644
index 0000000000..cfa07b2bb7
--- /dev/null
+++ b/fonts/utilities/ps2pk/curves.h
@@ -0,0 +1,41 @@
+/* $XConsortium: curves.h,v 1.2 91/10/10 11:17:59 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+#define StepConic(R,xA,yA,xB,yB,xC,yC,r) t1_StepConic(R,xA,yA,xB,yB,xC,yC,r)
+#define StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) t1_StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD)
+
+#define FlattenConic(xM,yM,xC,yC,r) t1_StepConic(NULL,(fractpel)0,(fractpel)0,xM,yM,xC,yC,r)
+#define FlattenBezier(xB,yB,xC,yC,xD,yD) t1_StepBezier(NULL,(fractpel)0,(fractpel)0,xB,yB,xC,yC,xD,yD)
+
+struct segment *t1_StepConic();
+struct segment *t1_StepBezier(struct region *, fractpel, fractpel, fractpel,
+ fractpel, fractpel, fractpel, fractpel, fractpel);
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/digit.h b/fonts/utilities/ps2pk/digit.h
new file mode 100644
index 0000000000..4ed89c765c
--- /dev/null
+++ b/fonts/utilities/ps2pk/digit.h
@@ -0,0 +1,64 @@
+/* $XConsortium: digit.h,v 1.2 91/10/10 11:18:01 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* -------------------------------------- */
+/* --- MACHINE GENERATED, DO NOT EDIT --- */
+/* -------------------------------------- */
+
+#ifndef DIGIT
+#define DIGIT 1
+
+/*
+ * Digit Value Table --
+ *
+ * The entries in the Digit Value Table map character
+ * codes in the set {0-9,a-z,A-Z} to their numeric
+ * values as part of numbers of radix 2-36.
+ *
+ */
+unsigned char digit_value[256] = {
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
+ 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
+ 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
+};
+
+#endif
diff --git a/fonts/utilities/ps2pk/encoding.c b/fonts/utilities/ps2pk/encoding.c
new file mode 100644
index 0000000000..e1d85fb029
--- /dev/null
+++ b/fonts/utilities/ps2pk/encoding.c
@@ -0,0 +1,353 @@
+/* MODULE encoding (encoding.c)
+ * interface: typedef char *encoding[256];
+ * void getenc(
+ * char **fontname, **encname,
+ * ( foundry name of font and name of this encoding )
+ * encoding ev, output encoding
+ * int width[256]); output widths
+ *
+ * depends on: MODULEs binary_table, strings
+ * <ctype.h>
+ * <stdio.h>
+ * <stdlib.h>
+ * <string.h>
+ *
+ * globals: void fatal();
+ *
+ * Author: Piet Tutelaers
+ * (see README for license)
+ */
+
+#include "types.h"
+#include "basics.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static char *my_string(char *);
+static void remove_string(void);
+static void addcc(char *name, int charcode);
+static int getcc(char *name);
+
+/* return a pointer to first non space character after occurence of string t,
+ * the scan starts at pointer s
+ */
+static char *value_after(char *s, const char *t)
+{ int l;
+ l = strlen(t);
+ for (;;) {
+ while (*s != *t && *s != '\n') s++;
+ if (*s == '\n') return NULL;
+ if (strncmp(s, t, l) == 0) break;
+ s++;
+ }
+ s += l;
+ while (isspace((unsigned char)*s)) s++;
+ return s;
+}
+
+static int decimal(char *s)
+{ int sign = 1, d = 0;
+
+ while (isspace((unsigned char)*s)) s++;
+ if (*s == '-') { sign = -1; s++; }
+ while (isdigit((unsigned char)*s)) { d = d * 10 + (*s - '0'); s++; }
+ return sign*d;
+}
+
+/* Nextsymbol() reads lines from enc until a '[', '/' or a ']' is
+ * encountered. In that case pline points to the character following
+ * this symbol otherwise a fatal error is generated.
+ */
+
+FILE *enc;
+
+#define LINEBUF 1024
+char line[LINEBUF], *pline = NULL;
+
+static char nextsymbol(void)
+{
+ for (;;) {
+ if (pline == NULL) {
+ if (fgets(line, LINEBUF-1, enc) == NULL)
+ fatal("unexpected EOF while reading %s\n", encfile);
+ pline = line;
+ }
+ if (*pline == '[' || *pline == ']' || *pline == '/') break;
+ if (*pline == '%' || *pline == '\n' || *pline == '\0')
+ { pline = NULL;
+ continue;
+ }
+ pline++;
+ }
+ pline++; return *(pline-1);
+}
+
+static char *nextpsname(void)
+{ int i = 0;
+ char the_nextname[MAXSTRLEN], *name;
+
+ for (;;) {
+ if (pline == NULL) {
+ if (fgets(line, LINEBUF-1, enc) == NULL)
+ fatal("unexpected EOF while reading %s\n", encfile);
+ pline = line;
+ }
+ if (*pline == '%' || *pline == '\n' || *pline == '\0')
+ { pline = NULL;
+ continue;
+ }
+ if (isspace((unsigned char)*pline)) {
+ pline++;
+ continue;
+ }
+ if (!isalpha((unsigned char)*pline)) fatal("invalid name in %s\n", encfile);
+ /* pt981009: added '_' Staszek Wawrykiewicz <staw@gust.org.pl> */
+ while (isalnum((unsigned char)*pline) || *pline == '-' || *pline == '_') {
+ if (i > MAXSTRLEN-2)
+ fatal("name too long in %s (%s)\n", line, encfile);
+ the_nextname[i++] = *pline++;
+ }
+ the_nextname[i] = '\0';
+ name = malloc(i+1);
+ if (name == NULL) fatal("Out of memory\n");
+ strcpy(name, the_nextname);
+ break;
+ }
+ /* pt981009: removed pline++ Staszek Wawrykiewicz <staw@gust.org.pl> */
+ return name;
+}
+
+void getenc(char **fontname, char **encname, encoding ev, int width[256])
+{ int i, len, SCMseen, Ccnt, wx, cc;
+ FILE *afm;
+ char *name, ns;
+
+ for (i=0; i < 256; i++) { ev[i] = NULL; width[i] = -1000; }
+ if (encfile) {
+ enc = fopen(encfile, "r");
+ if (enc == NULL) fatal("Can't open %s\n", encfile);
+ if (nextsymbol() != '/') fatal("missing '/encoding' in %s\n", encfile);
+ *encname = nextpsname();
+ if (nextsymbol() != '[') fatal("missing '[' in %s\n", encfile);
+ i = 0;
+ while (i < 256 && (ns = nextsymbol()) == '/') {
+ name = my_string(pline);
+ if (strcmp(name, ".notdef") == 0) {
+ i++; remove_string();
+ continue;
+ }
+ addcc(name, i++);
+ }
+ if (i != 256) fatal("missing %d symbols in %s\n", 256-i, encfile);
+ if (nextsymbol() != ']') fatal("missing ']' in %s\n", encfile);
+ fclose(enc);
+ }
+ afm = fopen(afmfile, "r");
+ if (afm == NULL) fatal("Can't open %s\n", afmfile);
+ /*
+ * Scan header of AFM file and take the FontName and EncodingScheme
+ * (used for identification purposes in the PK postamble)
+ * Stop after reading `StartCharMetrics'.
+ */
+ SCMseen = 0; Ccnt = 0;
+ while (fgets(line, LINEBUF-1, afm)) {
+ if (strncmp(line, "FontName", 8) == 0) {
+ pline = value_after(line, "FontName");
+ len = strlen(pline);
+ if (*(pline+len-1) == '\n') {
+ *(pline+len-1) = '\0'; len--;
+ }
+ *fontname = malloc(len + 1);
+ if (*fontname == NULL) fatal("Out of memory\n");
+ strcpy(*fontname, pline);
+ }
+ else if (encname == NULL && strncmp(line, "EncodingScheme", 8) == 0) {
+ pline = value_after(line, "EncodingScheme");
+ len = strlen(pline);
+ if (*(pline+len-1) == '\n') {
+ *(pline+len-1) = '\0'; len--;
+ }
+ *encname = malloc(len + 1);
+ if (*encname == NULL) fatal("Out of memory\n");
+ strcpy(*encname, pline);
+ }
+ else if (strncmp(line, "StartCharMetrics", 16) == 0) {
+ SCMseen = 1; break;
+ }
+ }
+ if (SCMseen == 0) fatal("%s: no metrics info\n", afmfile);
+ while (fgets(line, LINEBUF-1, afm)) {
+ if (strncmp(line, "EndCharMetrics", 14) == 0) break;
+ if (strncmp(line, "C ", 2) != 0)
+ fatal("%s: unexpected line\n", afmfile);
+
+ /* Gracefully terminate when the AFM file is not valid. Every line */
+ /* in the AFM file should specify a "C"haracter, a "WX"idth, and */
+ /* a "N"ame. (ndw)
+ */
+ pline = value_after(line, "C");
+ if (pline == NULL)
+ fatal("\nBad char metric in %s (no char):\n\t %s\n", afmfile, line);
+ cc = decimal(pline);
+ pline = value_after(pline, "WX");
+ if (pline == NULL)
+ fatal("\nBad char metric in %s (no width):\n\t %s\n", afmfile, line);
+ wx = decimal(pline);
+ pline = value_after(pline, "N");
+ if (pline == NULL)
+ fatal("\nBad char metric in %s (no name):\n\t %s\n", afmfile, line);
+ name = my_string(pline);
+
+ if (encfile) {
+ if ((i = getcc(name)) == -1) {
+ remove_string();
+ continue;
+ }
+ do { /* allow more occurences per name */
+ ev[i] = name; width[i] = wx;
+ i = getcc(name);
+ }
+ while (i >= 0);
+ }
+ else if (cc >= 0 && cc <= 255) { /* ndw: 10/13/92 */
+ ev[cc] = name; width[cc] = wx;
+ }
+ else if (cc > 255)
+ msg("Char code %d ignored (out of range).\n", cc);
+ Ccnt++;
+ }
+ if (Ccnt == 0) fatal("%s: no characters selected\n", afmfile);
+}
+
+/* END MODULE encoding */
+
+/* MODULE binary_table
+ * depends on: MODULE string
+ * <stdlib.h>
+ * <string.h>
+ */
+
+/*
+ * TUG has accepted an extended font layout (EC.enc) where the hyphen
+ * occupies two positions ('055 and '177) to handle exeptional hyphenation
+ * situations (see TUGboat#11 1990 (no. 4) pp. 514).
+ * To handle this special case we allow two charcodes per symbol.
+ */
+
+/*
+ * Two functions for a binary search table. One to add a name and one
+ * to lookup a name. This table is used to store all encoding names and
+ * its corresponding charcode.
+ */
+
+struct Node
+{ char *name; /* pointer to a PostScript string */
+ short cc[2]; /* its charcode's (maximum of two) */
+ short left, right;
+} node[256];
+
+static int freenode = 0;
+static short root = -1;
+
+static void addcc(char *name, int charcode)
+{
+ short p = 0, q;
+ int r = 0;
+
+ q = root;
+ while (q != -1) {
+ p = q; r = strcmp(name, node[p].name);
+ if (r == 0) {
+ if (node[p].cc[1] == -1) {
+ node[p].cc[1] = charcode;
+ return;
+ }
+ else
+ fatal("%s: more than two codes for %s (%d,%d,%d)\n",
+ encfile, name, node[p].cc[0], node[p].cc[1], charcode);
+ }
+ else if (r < 0) q=node[p].left;
+ else q=node[p].right;
+ }
+ if (freenode == 256)
+ fatal("%s: too many PostScript names\n", encfile);
+ /* not found hence insert */
+ node[freenode].name = name;
+ node[freenode].cc[0] = charcode;
+ node[freenode].cc[1] = -1;
+ node[freenode].left = node[freenode].right = -1;
+ if (root == -1)
+ root = freenode;
+ else {
+ if (r < 0) node[p].left=freenode;
+ else node[p].right=freenode;
+ }
+ freenode++;
+}
+
+static int getcc(char *name)
+{ short r, p, q, cc;
+
+ q = root;
+ while (q != -1) {
+ p = q; r = strcmp(name, node[p].name);
+ if (r == 0) {
+ cc = node[p].cc[0];
+ node[p].cc[0] = node[p].cc[1];
+ node[p].cc[1] = -1;
+ return cc;
+ }
+ else if (r < 0) q = node[p].left;
+ else q = node[p].right;
+ }
+ return -1;
+}
+
+/* END MODULE binary_table */
+
+/* MODULE string:
+ * depends on: <ctype.h>
+ * <string.h>
+ */
+
+/* String() reads a string starting at a given character pointer.
+ * After removing leading whitespace the resulting string (with possible
+ * `.' and '_' characters) is stored in a stringpool after which a pointer
+ * to it is returned.
+ */
+
+#define POOLSIZE 10000
+static char stringpool[POOLSIZE];
+static int poolsize, /* occupied space annex free index */
+ lastpoolsize; /* previous poolsize */
+
+static char *my_string(char *s)
+{ int length; char *str;
+
+ while (isspace((unsigned char)*s)) s++;
+ str = s; length = 0;
+ while (isalnum((unsigned char)*s) || *s == '.' || *s == '_') { length++; s++; }
+ if (length == 0) return NULL;
+ else {
+ if (length + 1 > POOLSIZE - poolsize)
+ fatal("Out of memory %s\n", s);
+ strncpy(stringpool+poolsize, str, length);
+ str = stringpool + poolsize;
+ s = stringpool + poolsize + length;
+ *s = '\0';
+ lastpoolsize = poolsize;
+ poolsize += length+1;
+ return str;
+ }
+}
+
+/* remove last string from stringpool */
+static void remove_string(void)
+{
+ poolsize = lastpoolsize;
+}
+
+/* END MODULE string */
+
diff --git a/fonts/utilities/ps2pk/ffilest.h b/fonts/utilities/ps2pk/ffilest.h
new file mode 100644
index 0000000000..006e5fa042
--- /dev/null
+++ b/fonts/utilities/ps2pk/ffilest.h
@@ -0,0 +1,153 @@
+/*
+ * $XConsortium: fontfilest.h,v 1.3 91/07/16 20:15:16 keith Exp $
+ *
+ * Copyright 1991 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+#ifndef _FONTFILEST_H_
+#define _FONTFILEST_H_
+
+#ifdef XSERVER
+#include <X11/Xos.h>
+#else
+#include "types.h"
+#include "Xstuff.h"
+#endif
+
+#include "fontmisc.h"
+#include "fontstruct.h"
+#include "fontfile.h"
+#include "fontxlfd.h"
+
+typedef struct _FontName {
+ const char *name;
+ short length;
+ short ndashes;
+} FontNameRec;
+
+typedef struct _FontScaled {
+ FontScalableRec vals;
+ FontEntryPtr bitmap;
+ FontPtr pFont;
+} FontScaledRec;
+
+typedef struct _FontScalableExtra {
+ FontScalableRec defaults;
+ int numScaled;
+ int sizeScaled;
+ FontScaledPtr scaled;
+ pointer private;
+} FontScalableExtraRec;
+
+typedef struct _FontScalableEntry {
+ FontRendererPtr renderer;
+ char *fileName;
+ FontScalableExtraPtr extra;
+} FontScalableEntryRec;
+
+/*
+ * This "can't" work yet - the returned alias string must be permanent,
+ * but this layer would need to generate the appropriate name from the
+ * resolved scalable + the XLFD values passed in. XXX
+ */
+
+typedef struct _FontScaleAliasEntry {
+ char *resolved;
+} FontScaleAliasEntryRec;
+
+typedef struct _FontBitmapEntry {
+ FontRendererPtr renderer;
+ char *fileName;
+ FontPtr pFont;
+} FontBitmapEntryRec;
+
+typedef struct _FontAliasEntry {
+ char *resolved;
+} FontAliasEntryRec;
+
+typedef struct _FontBCEntry {
+ FontScalableRec vals;
+ FontEntryPtr entry;
+} FontBCEntryRec;
+
+typedef struct _FontEntry {
+ FontNameRec name;
+ int type;
+ union _FontEntryParts {
+ FontScalableEntryRec scalable;
+ FontBitmapEntryRec bitmap;
+ FontAliasEntryRec alias;
+ FontBCEntryRec bc;
+ } u;
+} FontEntryRec;
+
+typedef struct _FontTable {
+ int used;
+ int size;
+ FontEntryPtr entries;
+ Bool sorted;
+} FontTableRec;
+
+typedef struct _FontDirectory {
+ char *directory;
+ uint32_t dir_mtime;
+ uint32_t alias_mtime;
+ FontTableRec scalable;
+ FontTableRec nonScalable;
+} FontDirectoryRec;
+
+typedef struct _FontRenderer {
+ const char *fileSuffix;
+ int fileSuffixLen;
+ int (*OpenBitmap)(/* fpe, pFont, flags, entry, fileName, format, fmask */);
+ int (*OpenScalable)(/* fpe, pFont, flags, entry, fileName, vals, format, fmask */);
+ int (*GetInfoBitmap)(/* fpe, pFontInfo, entry, fileName */);
+ int (*GetInfoScalable)(/* fpe, pFontInfo, entry, fileName, vals */);
+ int number;
+} FontRendererRec;
+
+typedef struct _FontRenders {
+ int number;
+ FontRendererPtr *renderers;
+} FontRenderersRec, *FontRenderersPtr;
+
+typedef struct _BitmapInstance {
+ FontScalableRec vals;
+ FontBitmapEntryPtr bitmap;
+} BitmapInstanceRec, *BitmapInstancePtr;
+
+typedef struct _BitmapScalablePrivate {
+ int numInstances;
+ BitmapInstancePtr instances;
+} BitmapScalablePrivateRec, *BitmapScalablePrivatePtr;
+
+typedef struct _BitmapSources {
+ FontPathElementPtr *fpe;
+ int size;
+ int count;
+} BitmapSourcesRec, *BitmapSourcesPtr;
+
+extern BitmapSourcesRec FontFileBitmapSources;
+
+extern void Type1CloseFont(FontPtr);
+
+#endif /* _FONTFILEST_H_ */
diff --git a/fonts/utilities/ps2pk/filenames.c b/fonts/utilities/ps2pk/filenames.c
new file mode 100644
index 0000000000..8081233ef2
--- /dev/null
+++ b/fonts/utilities/ps2pk/filenames.c
@@ -0,0 +1,136 @@
+/* FILE: filenames.c
+ * PURPOSE: some handy functions for working with TeXfiles
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#ifdef KPATHSEA
+#include <kpathsea/kpathsea.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "basics.h" /* basic definitions and fatal() */
+#include "filenames.h"
+
+/* comparing names (system dependant) */
+static int equal(const char *s, const char *t)
+{
+# ifndef UNIX
+ while (tolower(*s) == tolower(*t)) {
+ if (*s == '\0')
+ break;
+ s++; t++;
+ }
+# else
+ while (*s == *t) {
+ if (*s == '\0' || *t == '\0')
+ break;
+ s++; t++;
+ }
+# endif
+ if (*s == '\0' && *t == '\0')
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * Determine the extension
+ */
+char *extension(char *str) {
+ char *p, *base;
+ for (p = base = str; *p; ++p)
+ /* if (*p++ == DIRSEP) base = p; */
+ if (IS_DIR_SEP(*p))
+ base = p + 1;
+ for (p = base ; *p; p++)
+ if (*p == '.')
+ break;
+ return p;
+}
+
+/*
+ * Construct filename by replacing the current extension (if available)
+ * with supplied one.
+ */
+char *newname(char *name, const char *ext)
+{
+ char *e, *nn; int len1, len2;
+
+ e = extension(name);
+ if (equal(ext, e))
+ return name;
+ len1 = strlen(name) - strlen(e);
+ len2 = len1 + strlen(ext) + 1;
+ nn = (char *) malloc(len2);
+ if (nn == NULL)
+ fatal("Out of memory\n");
+ strncpy(nn, name, len1);
+ strcpy(nn+len1, ext);
+ return nn;
+}
+
+/*
+ * Derived from BSD basename
+ */
+char *basename(char *str, const char *suffix){
+ char *p; int len = 0;
+ const char *t;
+ char *base;
+
+ printf("basename of %s = ", str);
+#ifdef KPATHSEA
+ for (p = base = (NAME_BEGINS_WITH_DEVICE(str) ? str+2 : str);
+ *p; p++) {
+#else
+ for (p = base = str; *p; p++) {
+#endif
+ /* if (*p++ == DIRSEP) { base = p; len = 0; } */
+ if (IS_DIR_SEP(*p)) {
+ base = p+1;
+ len = 0;
+ } else len++;
+ }
+ printf("%s\n", base);
+ if (suffix != NULL) {
+ for (t = suffix; *t; ++t);
+ do {
+ len--; t--; p--;
+ if (*t != *p) break;
+ if (t == suffix) {
+ char *bn;
+ if (len == 0)
+ return NULL;
+ bn = malloc(len+1);
+ if (bn == NULL)
+ fatal("Out of memory\n");
+ strncpy(bn, base, len);
+ *(bn+len) = '\0'; /* RA */
+ return bn;
+ }
+ } while (p > base);
+ }
+ return base;
+}
+
+/*
+ * Return true if name can be the name of a PostScript resource
+ * (no extension and no absolute pathname).
+ */
+int ps_resource(const char *name) {
+ if (strchr(name, '.')) return 0 ;
+#ifdef KPATHSEA
+ if (kpse_absolute_p(name, true)) return 0;
+#else
+ if (strchr(name, DIRSEP)) return 0 ;
+#endif
+ return 1;
+}
diff --git a/fonts/utilities/ps2pk/filenames.h b/fonts/utilities/ps2pk/filenames.h
new file mode 100644
index 0000000000..3eda4744dd
--- /dev/null
+++ b/fonts/utilities/ps2pk/filenames.h
@@ -0,0 +1,27 @@
+/* FILE: filenames.h
+ * PURPOSE: functions for handling file names
+ */
+
+/*
+ * Determine extension of <str>.
+ */
+char *extension(char *str);
+
+/*
+ * Basename is the functional equivalent of BSD's basename utility.
+ * When the suffix is NULL no suffix removal is done. When needed
+ * a new string is allocated so that the original value of str is
+ * not changed.
+ */
+char *basename(char *str, const char *suffix);
+
+/*
+ * Newname builds a new filename by adding or replacing the extension
+ * of the given <name> with the new supplied <ext>.
+ */
+char *newname(char *name, const char *ext);
+
+/*
+ * ps_resource returns true if name can be treated as a PS resource
+ */
+int ps_resource(const char *name);
diff --git a/fonts/utilities/ps2pk/flisearch.c b/fonts/utilities/ps2pk/flisearch.c
new file mode 100644
index 0000000000..e196f6f1e2
--- /dev/null
+++ b/fonts/utilities/ps2pk/flisearch.c
@@ -0,0 +1,42 @@
+/*
+ * FILE: psearch.c
+ * PURPOSE: search files through possible recursive path
+ * VERSION: 1.0 (Oct. 1995)
+ * AUTHOR: Piet Tutelaers
+ */
+
+#include <stdio.h>
+#include <string.h> /* strcmp() */
+#include "basics.h" /* fatal(), msg() */
+#include "filenames.h" /* */
+#include "psearch.h" /* search_flipath() */
+
+char *fontname; int dpi, margin = 0;
+
+int main(int argc, char *argv[]) {
+ char *path, *file, *fn;
+ int matching(char *, int);
+
+ /* get path and file arguments */
+ if (argc != 4) fatal("Usage: psearch path fontname dpi\n");
+ path = argv[1]; fontname = argv[2]; dpi = atoi(argv[3]);
+
+ /* find <file> in <path> */
+ fn = search_flipath(path, matching);
+ if (fn == NULL) msg("%s at %d dpi not found\n", fontname, dpi);
+ else msg("%s: %s at %d dpi found\n", fn, fontname, dpi);
+ exit(0);
+}
+
+/*
+ * Function used to search for one single font in FLI path
+ */
+int matching(char *font, int size) {
+
+ if ((strcmp(font, fontname) == 0) && (size == dpi ||
+ (size >= dpi - margin && size <= dpi+margin)))
+ return 1;
+ else
+ return 0;
+}
+
diff --git a/fonts/utilities/ps2pk/font.h b/fonts/utilities/ps2pk/font.h
new file mode 100644
index 0000000000..8de6e908f3
--- /dev/null
+++ b/fonts/utilities/ps2pk/font.h
@@ -0,0 +1,107 @@
+/* $XConsortium: font.h,v 1.8 91/07/19 21:03:49 rws Exp $ */
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $NCDId: @(#)font.h,v 1.7 1991/06/24 17:00:23 lemke Exp $ */
+
+#ifndef FONT_H
+#define FONT_H
+
+#ifndef BitmapFormatByteOrderMask
+#include "fsmasks.h"
+#endif
+
+/* data structures */
+typedef struct _Font *FontPtr;
+typedef struct _FontInfo *FontInfoPtr;
+typedef struct _FontProp *FontPropPtr;
+typedef struct _ExtentInfo *ExtentInfoPtr;
+typedef struct _FontPathElement *FontPathElementPtr;
+typedef struct _CharInfo *CharInfoPtr;
+typedef struct _FontNames *FontNamesPtr;
+typedef struct _FontResolution *FontResolutionPtr;
+
+#define NullCharInfo ((CharInfoPtr) 0)
+#define NullFont ((FontPtr) 0)
+#define NullFontInfo ((FontInfoPtr) 0)
+
+ /* draw direction */
+#define LeftToRight 0
+#define RightToLeft 1
+#define BottomToTop 2
+#define TopToBottom 3
+typedef int DrawDirection;
+
+#define NO_SUCH_CHAR -1
+
+
+#define FontAliasType 0x1000
+
+#define AllocError 80
+#define StillWorking 81
+#define FontNameAlias 82
+#define BadFontName 83
+#define Suspended 84
+#define Successful 85
+#define BadFontPath 86
+#define BadCharRange 87
+#define BadFontFormat 88
+#define FPEResetFailed 89 /* for when an FPE reset won't work */
+
+/* OpenFont flags */
+#define FontLoadInfo 0x0001
+#define FontLoadProps 0x0002
+#define FontLoadMetrics 0x0004
+#define FontLoadBitmaps 0x0008
+#define FontLoadAll 0x000f
+#define FontOpenSync 0x0010
+
+/* Query flags */
+#define LoadAll 0x1
+#define FinishRamge 0x2
+#define EightBitFont 0x4
+#define SixteenBitFont 0x8
+
+typedef char *closure;
+
+extern int StartListFontsWithInfo( /* client, length, pattern, maxNames */ );
+extern int ListFonts( /* client, length, pattern, maxNames */ );
+
+extern FontNamesPtr MakeFontNamesRecord( /* size */ );
+extern void FreeFontNames();
+extern int AddFontNamesName();
+
+extern int FontToFSError();
+
+extern FontResolutionPtr GetClientResolution();
+
+typedef struct _FontPatternCache *FontPatternCachePtr;
+
+extern FontPatternCachePtr MakeFontPatternCache ();
+extern void FreeFontPatternCache ();
+extern void EmtpyFontPatternCache ();
+extern void CacheFontPattern ();
+extern FontPtr FindCachedFontPattern ();
+extern void RemoveCachedFontPattern ();
+
+#endif /* FONT_H */
diff --git a/fonts/utilities/ps2pk/fontfcn.c b/fonts/utilities/ps2pk/fontfcn.c
new file mode 100644
index 0000000000..dfaeb8ff57
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontfcn.c
@@ -0,0 +1,300 @@
+/* $XConsortium: fontfcn.c,v 1.8 92/03/27 18:15:45 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "util.h"
+#include "fontmisc.h"
+#include "ffilest.h"
+#include "fontfcn.h"
+
+#define FF_PARSE_ERROR 5
+#define FF_PATH 1
+
+/***================================================================***/
+/* GLOBALS */
+/***================================================================***/
+char CurFontName[120];
+char *CurFontEnv;
+char *vm_base = NULL;
+psfont *FontP = NULL;
+psfont TheCurrentFont;
+
+
+/***================================================================***/
+/* SearchDict - look for name */
+/* - compare for match on len and string */
+/* return 0 - not found. */
+/* return n - nth element in dictionary. */
+/***================================================================***/
+int SearchDictName(psdict *dictP, psobj *keyP)
+{
+ int i,n;
+
+
+ n = dictP[0].key.len;
+ for (i=1;i<=n;i++) { /* scan the intire dictionary */
+ if (
+ (dictP[i].key.len == keyP->len )
+ &&
+ (strncmp(dictP[i].key.data.valueP,
+ keyP->data.valueP,
+ keyP->len) == 0
+ )
+ ) return(i);
+ }
+ return(0);
+}
+/***================================================================***/
+static boolean initFont(void)
+{
+
+ if (!(vm_init())) return(FALSE);
+ vm_base = vm_next_byte();
+ if (!(Init_BuiltInEncoding())) return(FALSE);
+ strcpy(CurFontName, ""); /* iniitialize to none */
+ FontP = &TheCurrentFont;
+ FontP->vm_start = vm_next_byte();
+ FontP->FontFileName.len = 0;
+ FontP->FontFileName.data.valueP = CurFontName;
+ return(TRUE);
+}
+/***================================================================***/
+static void resetFont(char *env)
+{
+
+ vm_next = FontP->vm_start;
+ vm_free = vm_size - ( vm_next - vm_base);
+ FontP->Subrs.len = 0;
+ FontP->Subrs.data.stringP = NULL;
+ FontP->CharStringsP = NULL;
+ FontP->Private = NULL;
+ FontP->fontInfoP = NULL;
+ FontP->BluesP = NULL;
+ /* This will load the font into the FontP */
+ strcpy(CurFontName,env);
+ FontP->FontFileName.len = strlen(CurFontName);
+ FontP->FontFileName.data.valueP = CurFontName;
+
+}
+/***================================================================***/
+/* Read font used to attempt to load the font and, upon failure,
+ try a second time with twice as much memory. Unfortunately, if
+ it's a really complex font, simply using 2*vm_size may be insufficient.
+ I've modified it so that the program will try progressively larger
+ amounts of memory until it really runs out or the font loads
+ successfully. (ndw)
+*/
+static int readFont(char *env)
+{
+ int rcode;
+
+ /* restore the virtual memory and eliminate old font */
+ resetFont(env);
+ /* This will load the font into the FontP */
+ rcode = scan_font(FontP);
+ return(rcode);
+}
+/***================================================================***/
+struct region *fontfcnB(struct XYspace *S, unsigned char *code, int *lenP, int *mode)
+{
+ psobj *charnameP; /* points to psobj that is name of character*/
+ int N;
+ psdict *CharStringsDictP; /* dictionary with char strings */
+ psobj CodeName; /* used to store the translation of the name*/
+ psobj *SubrsArrayP;
+ psobj *theStringP;
+
+ struct region *charpath; /* the path for this character */
+
+ charnameP = &CodeName;
+ charnameP->len = *lenP;
+ charnameP->data.stringP = code;
+
+ CharStringsDictP = FontP->CharStringsP;
+
+ /* search the chars string for this charname as key */
+ N = SearchDictName(CharStringsDictP,charnameP);
+ if (N<=0) {
+ *mode = FF_PARSE_ERROR;
+ return(NULL);
+ }
+ /* ok, the nth item is the psobj that is the string for this char */
+ theStringP = &(CharStringsDictP[N].value);
+
+ /* get the dictionary pointers to the Subrs */
+
+ SubrsArrayP = &(FontP->Subrs);
+ /* scale the Adobe fonts to 1 unit high */
+ S = (struct XYspace *)Permanent(Scale((struct xobject *)S, 1.0 , 1.0));
+ /* call the type 1 routine to rasterize the character */
+ charpath = (struct region *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
+ FontP->BluesP, mode);
+ Destroy(S);
+ /* if Type1Char reported an error, then return */
+ if ( *mode == FF_PARSE_ERROR) return(NULL);
+ /* fill with winding rule unless path was requested */
+ if (*mode != FF_PATH) {
+ charpath = Interior((struct segment *)charpath,WINDINGRULE+CONTINUITY);
+ }
+ return(charpath);
+}
+/***================================================================***/
+/* fontfcnA(env, mode) */
+/* */
+/* env is a pointer to a string that contains the fontname. */
+/* */
+/* 1) initialize the font - global indicates it has been done */
+/* 2) load the font */
+/***================================================================***/
+Bool fontfcnA(char *env, int *mode)
+{
+ int rc;
+
+ /* Has the FontP initialized? If not, then */
+ /* Initialize */
+ if (FontP == NULL) {
+ InitImager();
+ if (!(initFont())) {
+ /* we are really out of memory */
+ *mode = SCAN_OUT_OF_MEMORY;
+ return(FALSE);
+ }
+ }
+
+ /* if the env is null, then use font already loaded */
+
+ /* if the not same font name */
+ if ( (env) && (strcmp(env,CurFontName) != 0 ) ) {
+ /* restore the virtual memory and eliminate old font, read new one */
+ rc = readFont(env);
+ if (rc != 0 ) {
+ strcpy(CurFontName, ""); /* no font loaded */
+ *mode = rc;
+ return(FALSE);
+ }
+ }
+ return(TRUE);
+
+}
+/***================================================================***/
+/* QueryFontLib(env, infoName,infoValue,rcodeP) */
+/* */
+/* env is a pointer to a string that contains the fontname. */
+/* */
+/* 1) initialize the font - global indicates it has been done */
+/* 2) load the font */
+/* 3) use the font to call getInfo for that value. */
+/***================================================================***/
+
+void QueryFontLib(
+ char *env, const char *infoName,
+ void *infoValue, /* parameter returned here */
+ int *rcodeP)
+{
+ int rc,N,i;
+ psdict *dictP;
+ psobj nameObj;
+ psobj *valueP;
+
+ /* Has the FontP initialized? If not, then */
+ /* Initialize */
+ if (FontP == NULL) {
+ InitImager();
+ if (!(initFont())) {
+ *rcodeP = 1;
+ return;
+ }
+ }
+ /* if the env is null, then use font already loaded */
+ /* if the not same font name, reset and load next font */
+ if ( (env) && (strcmp(env,CurFontName) != 0 ) ) {
+ /* restore the virtual memory and eliminate old font */
+ rc = readFont(env);
+ if (rc != 0 ) {
+ strcpy(CurFontName, ""); /* no font loaded */
+ *rcodeP = 1;
+ return;
+ }
+ }
+ dictP = FontP->fontInfoP;
+ objFormatName(&nameObj,strlen(infoName),infoName);
+ N = SearchDictName(dictP,&nameObj);
+ /* if found */
+ if ( N > 0 ) {
+ *rcodeP = 0;
+ switch (dictP[N].value.type) {
+ case OBJ_ARRAY:
+ valueP = dictP[N].value.data.arrayP;
+ if (strcmp(infoName,"FontMatrix") == 0) {
+ /* 6 elments, return them as floats */
+ for (i=0;i<6;i++) {
+ if (valueP->type == OBJ_INTEGER )
+ ((float *)infoValue)[i] = valueP->data.integer;
+ else
+ ((float *)infoValue)[i] = valueP->data.real;
+ valueP++;
+ }
+ }
+ if (strcmp(infoName,"FontBBox") == 0) {
+ /* 4 elments for Bounding Box. all integers */
+ for (i=0;i<4;i++) {
+ ((int *)infoValue)[i] = valueP->data.integer;
+ valueP++;
+ }
+ break;
+ case OBJ_INTEGER:
+ case OBJ_BOOLEAN:
+ *((int *)infoValue) = dictP[N].value.data.integer;
+ break;
+ case OBJ_REAL:
+ *((float *)infoValue) = dictP[N].value.data.real;
+ break;
+ case OBJ_NAME:
+ case OBJ_STRING:
+ *((char **)infoValue) = dictP[N].value.data.valueP;
+ break;
+ default:
+ *rcodeP = 1;
+ break;
+ }
+ }
+ }
+ else *rcodeP = 1;
+}
diff --git a/fonts/utilities/ps2pk/fontfcn.h b/fonts/utilities/ps2pk/fontfcn.h
new file mode 100644
index 0000000000..fdabdd89cf
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontfcn.h
@@ -0,0 +1,121 @@
+/* $XConsortium: fontfcn.h,v 1.3 92/03/26 16:42:23 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Definition of a PostScript FONT */
+typedef struct ps_font {
+ char *vm_start;
+ psobj FontFileName;
+ psobj Subrs;
+ psdict *CharStringsP;
+ psdict *Private;
+ psdict *fontInfoP;
+struct blues_struct *BluesP;
+} psfont;
+/***================================================================***/
+/* Globals */
+/***================================================================***/
+
+extern int currentchar; /* for error reporting */
+/***================================================================***/
+/* Routines in scan_font */
+/***================================================================***/
+
+extern boolean Init_BuiltInEncoding(void);
+extern int SearchDictName(psdict *, psobj *);
+extern int scan_font(psfont *);
+extern struct xobject *Type1Char(psfont *, struct XYspace *, psobj *, psobj *,
+ psobj *, struct blues_struct *, int *);
+extern void objFormatName(psobj *, int, const char *);
+extern Bool fontfcnA(char *env,int *mode);
+extern struct region *fontfcnB(struct XYspace *S, unsigned char *code,
+ int *lenP, int *mode);
+/***================================================================***/
+/* Entry point for Type1Char to get entry from CharStrings */
+/***================================================================***/
+extern psobj *GetType1CharString(psfont *, unsigned char);
+
+extern int Type1OpenScalable(encoding, FontPtr *, int, FontEntryPtr, char *,
+ FontScalablePtr, fsBitmapFormat,
+ fsBitmapFormatMask, DOUBLE, DOUBLE);
+extern void Type1RegisterFontFileFunctions(void);
+extern void Type1CloseFont();
+extern int CheckFSFormat(int format,int fmask,int *bit,int *byte,int *scan,int *glyph,int *image);
+
+/***================================================================***/
+/* Return codes from scan_font */
+/***================================================================***/
+#define SCAN_OK 0
+#define SCAN_FILE_EOF -1
+#define SCAN_ERROR -2
+#define SCAN_OUT_OF_MEMORY -3
+#define SCAN_FILE_OPEN_ERROR -4
+#define SCAN_TRUE -5
+#define SCAN_FALSE -6
+#define SCAN_END -7
+
+/***================================================================***/
+/* Name of FontInfo fields */
+/***================================================================***/
+
+#define FONTNAME 1
+#define PAINTTYPE 2
+#define FONTTYPENUM 3
+#define FONTMATRIX 4
+#define FONTBBOX 5
+#define UNIQUEID 6
+#define STROKEWIDTH 7
+#define VERSION 8
+#define NOTICE 9
+#define FULLNAME 10
+#define FAMILYNAME 11
+#define WEIGHT 12
+#define ITALICANGLE 13
+#define ISFIXEDPITCH 14
+#define UNDERLINEPOSITION 15
+#define UNDERLINETHICKNESS 16
+#define ENCODING 17
+/***================================================================***/
+/* Name of Private values */
+/***================================================================***/
+#define BLUEVALUES 1
+#define OTHERBLUES 2
+#define FAMILYBLUES 3
+#define FAMILYOTHERBLUES 4
+#define BLUESCALE 5
+#define BLUESHIFT 6
+#define BLUEFUZZ 7
+#define STDHW 8
+#define STDVW 9
+#define STEMSNAPH 10
+#define STEMSNAPV 11
+#define FORCEBOLD 12
+#define LANGUAGEGROUP 13
+#define LENIV 14
+#define RNDSTEMUP 15
+#define EXPANSIONFACTOR 16
diff --git a/fonts/utilities/ps2pk/fontfile.h b/fonts/utilities/ps2pk/fontfile.h
new file mode 100644
index 0000000000..166aac3a01
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontfile.h
@@ -0,0 +1,72 @@
+/*
+ * $XConsortium: fontfile.h,v 1.1 91/05/11 09:11:58 rws Exp $
+ *
+ * Copyright 1991 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+#ifndef _FONTFILE_H_
+#define _FONTFILE_H_
+typedef struct _FontEntry *FontEntryPtr;
+typedef struct _FontTable *FontTablePtr;
+typedef struct _FontName *FontNamePtr;
+typedef struct _FontScaled *FontScaledPtr;
+typedef struct _FontScalableExtra *FontScalableExtraPtr;
+typedef struct _FontScalableEntry *FontScalableEntryPtr;
+typedef struct _FontScaleAliasEntry *FontScaleAliasEntryPtr;
+typedef struct _FontBitmapEntry *FontBitmapEntryPtr;
+typedef struct _FontAliasEntry *FontAliasEntryPtr;
+typedef struct _FontBCEntry *FontBCEntryPtr;
+typedef struct _FontDirectory *FontDirectoryPtr;
+typedef struct _FontRenderer *FontRendererPtr;
+
+#define NullFontEntry ((FontEntryPtr) 0)
+#define NullFontTable ((FontTablePtr) 0)
+#define NullFontName ((FontNamePtr) 0)
+#define NullFontScaled ((FontScaled) 0)
+#define NullFontScalableExtra ((FontScalableExtra) 0)
+#define NullFontscalableEntry ((FontScalableEntry) 0)
+#define NullFontScaleAliasEntry ((FontScaleAliasEntry) 0)
+#define NullFontBitmapEntry ((FontBitmapEntry) 0)
+#define NullFontAliasEntry ((FontAliasEntry) 0)
+#define NullFontBCEntry ((FontBCEntry) 0)
+#define NullFontDirectory ((FontDirectoryPtr) 0)
+#define NullFontRenderer ((FontRendererPtr) 0)
+
+#define FONT_ENTRY_SCALABLE 0
+#define FONT_ENTRY_SCALE_ALIAS 1
+#define FONT_ENTRY_BITMAP 2
+#define FONT_ENTRY_ALIAS 3
+#define FONT_ENTRY_BC 4
+
+#define MAXFONTNAMELEN 1024
+#define MAXFONTFILENAMELEN 1024
+
+#define FontDirFile "fonts.dir"
+#define FontAliasFile "fonts.alias"
+#define FontScalableFile "fonts.scale"
+
+extern FontEntryPtr FontFileFindNameInDir ();
+extern FontDirectoryPtr FontFileMakeDir ();
+extern FontRendererPtr FontFileMatchRenderer ();
+extern char *SaveString ();
+extern FontScaledPtr FontFileFindScaledInstance ();
+#endif /* _FONTFILE_H_ */
diff --git a/fonts/utilities/ps2pk/fontmisc.h b/fonts/utilities/ps2pk/fontmisc.h
new file mode 100644
index 0000000000..ffde14ff31
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontmisc.h
@@ -0,0 +1,63 @@
+/*
+ * $XConsortium: fontmisc.h,v 1.5 91/05/12 16:15:48 rws Exp $
+ *
+ * Copyright 1991 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+#ifndef _FONTMISC_H_
+#define _FONTMISC_H_
+
+#ifdef XSERVER
+#include "Xfuncs.h"
+#endif
+
+typedef unsigned char *pointer;
+typedef int Bool;
+#ifndef X_PROTOCOL
+typedef unsigned long Atom;
+typedef unsigned long XID;
+#endif
+#ifndef LSBFirst
+#define LSBFirst 0
+#define MSBFirst 1
+#endif
+
+#ifndef None
+#define None 0l
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+extern char *NameForAtom ();
+
+#define lowbit(x) ((x) & (~(x) + 1))
+
+#if defined(assert)
+#undef assert
+#endif
+
+#define assert(x)
+
+#endif /* _FONTMISC_H_ */
diff --git a/fonts/utilities/ps2pk/fonts.h b/fonts/utilities/ps2pk/fonts.h
new file mode 100644
index 0000000000..497206bf2d
--- /dev/null
+++ b/fonts/utilities/ps2pk/fonts.h
@@ -0,0 +1,47 @@
+/* $XConsortium: fonts.h,v 1.2 91/10/10 11:18:09 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+/* STUB */
+
+#define CopyFont(f) f
+#define UniqueFont(f) f
+#define KillFont(f)
+#define KillText(t)
+#define CopyText(t) t
+#define I_DumpText(t)
+#define CoerceText(t) t
+#define TextDelta(t,pt)
+#define XformText(p,s)
+#define GimeSpace() FALSE
+
+#define LibInit()
+#define InitFonts()
+#define InitFiles()
+#define TraceClose()
diff --git a/fonts/utilities/ps2pk/fontstruct.h b/fonts/utilities/ps2pk/fontstruct.h
new file mode 100644
index 0000000000..7b9212f1e3
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontstruct.h
@@ -0,0 +1,224 @@
+/* $Header: fontstruct.h,v 1.10 91/07/22 15:37:41 keith Exp $ */
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+ @(#)fontstruct.h 3.2 91/04/15
+
+******************************************************************/
+
+#ifndef FONTSTR_H
+#define FONTSTR_H
+
+#ifdef XSERVER
+#include <X11/Xproto.h>
+#else
+#include "Xstuff.h"
+#endif
+
+#include "font.h"
+
+/*
+ * This version of the server font data strucutre is only for describing
+ * the in memory data structure. The file structure is not necessarily a
+ * copy of this. That is up to the compiler and the OS layer font loading
+ * machinery.
+ */
+
+#define GLYPHPADOPTIONS 4 /* 1, 2, 4, or 8 */
+
+typedef enum {
+ Linear8Bit, TwoD8Bit, Linear16Bit, TwoD16Bit
+} FontEncoding;
+
+typedef struct _FontProp {
+ long name;
+ intptr_t value; /* large enough to hole an 'int' or 'void *' */
+} FontPropRec;
+
+typedef struct _FontResolution {
+ unsigned short x_resolution;
+ unsigned short y_resolution;
+ unsigned short point_size;
+} FontResolutionRec;
+
+typedef struct _ExtentInfo {
+ DrawDirection drawDirection;
+ int fontAscent;
+ int fontDescent;
+ int overallAscent;
+ int overallDescent;
+ int overallWidth;
+ int overallLeft;
+ int overallRight;
+} ExtentInfoRec;
+
+typedef struct _CharInfo {
+ xCharInfo metrics; /* info preformatted for Queries */
+ char *bits; /* pointer to glyph image */
+} CharInfoRec;
+
+/*
+ * Font is created at font load time. It is specific to a single encoding.
+ * e.g. not all of the glyphs in a font may be part of a single encoding.
+ */
+
+typedef struct _FontInfo {
+ unsigned short firstCol;
+ unsigned short lastCol;
+ unsigned short firstRow;
+ unsigned short lastRow;
+ unsigned short defaultCh;
+ unsigned int noOverlap:1;
+ unsigned int terminalFont:1;
+ unsigned int constantMetrics:1;
+ unsigned int constantWidth:1;
+ unsigned int inkInside:1;
+ unsigned int inkMetrics:1;
+ unsigned int allExist:1;
+ unsigned int drawDirection:2;
+ unsigned int cachable:1;
+ unsigned int anamorphic:1;
+ short maxOverlap;
+ short pad;
+ xCharInfo maxbounds;
+ xCharInfo minbounds;
+ xCharInfo ink_maxbounds;
+ xCharInfo ink_minbounds;
+ short fontAscent;
+ short fontDescent;
+ int nprops;
+ FontPropPtr props;
+ char *isStringProp;
+} FontInfoRec;
+
+typedef struct _Font {
+ int refcnt;
+ FontInfoRec info;
+ char bit;
+ char byte;
+ char glyph;
+ char scan;
+ fsBitmapFormat format;
+ int (*get_glyphs) ( /* font, count, chars, encoding, count, glyphs */ );
+ int (*get_metrics) ( /* font, count, chars, encoding, count, glyphs */ );
+ int (*get_bitmaps) (/* client, font, flags, ranges, nranges,
+ nextents, extents */ );
+ int (*get_extents) (/* client, font, format, flags, ranges,
+ nranges, nglyphs, offsets, glyphs */ );
+ void (*unload_font) ( /* font */ );
+ FontPathElementPtr fpe;
+ pointer svrPrivate;
+ pointer fontPrivate;
+ pointer fpePrivate;
+ int maxPrivate;
+ pointer *devPrivates;
+} FontRec;
+
+extern Bool _FontSetNewPrivate (/* pFont, n, ptr */);
+extern int AllocateFontPrivateIndex ();
+
+#define FontGetPrivate(pFont,n) ((n) > (pFont)->maxPrivate ? (pointer) 0 : \
+ (pFont)->devPrivates[n])
+
+#define FontSetPrivate(pFont,n,ptr) ((n) > (pFont)->maxPrivate ? \
+ _FontSetNewPrivate (pFont, n, ptr) : \
+ ((((pFont)->devPrivates[n] = (ptr)) != 0) || TRUE))
+
+typedef struct _FontNames {
+ int nnames;
+ int size;
+ int *length;
+ char **names;
+} FontNamesRec;
+
+/* External view of font paths */
+typedef struct _FontPathElement {
+ int name_length;
+ char *name;
+ int type;
+ int refcount;
+ pointer private;
+} FontPathElementRec;
+
+typedef struct _FPEFunctions {
+ int (*name_check) ( /* name */ );
+ int (*init_fpe) ( /* fpe */ );
+ int (*reset_fpe) ( /* fpe */ );
+ int (*free_fpe) ( /* fpe */ );
+ int (*open_font) ( /* client, fpe, flags, name, namelen, format,
+ fid, ppfont, alias */ );
+ int (*close_font) ( /* pfont */ );
+ int (*list_fonts) ( /* client, fpe, pattern, patlen, maxnames,
+ paths */ );
+ int (*start_list_fonts_with_info) ( /* client, fpe, name, namelen,
+ maxnames, data */ );
+ int (*list_next_font_with_info) ( /* client, fpe, name, namelen,
+ info, num, data */ );
+ int (*wakeup_fpe) ( /* fpe, mask */ );
+ int (*client_died) ( /* client, fpe */ );
+} FPEFunctionsRec, FPEFunctions;
+
+extern int InitFPETypes();
+
+/*
+ * Various macros for computing values based on contents of
+ * the above structures
+ */
+
+#define GLYPHWIDTHPIXELS(pci) \
+ ((pci)->metrics.rightSideBearing - (pci)->metrics.leftSideBearing)
+
+#define GLYPHHEIGHTPIXELS(pci) \
+ ((pci)->metrics.ascent + (pci)->metrics.descent)
+
+#define GLYPHWIDTHBYTES(pci) (((GLYPHWIDTHPIXELS(pci))+7) >> 3)
+
+#define GLYPHWIDTHPADDED(bc) (((bc)+7) & ~0x7)
+
+#define BYTES_PER_ROW(bits, nbytes) \
+ ((nbytes) == 1 ? (((bits)+7)>>3) /* pad to 1 byte */ \
+ :(nbytes) == 2 ? ((((bits)+15)>>3)&~1) /* pad to 2 bytes */ \
+ :(nbytes) == 4 ? ((((bits)+31)>>3)&~3) /* pad to 4 bytes */ \
+ :(nbytes) == 8 ? ((((bits)+63)>>3)&~7) /* pad to 8 bytes */ \
+ : 0)
+
+#define BYTES_FOR_GLYPH(ci,pad) (GLYPHHEIGHTPIXELS(ci) * \
+ BYTES_PER_ROW(GLYPHWIDTHPIXELS(ci),pad))
+/*
+ * Macros for computing different bounding boxes for fonts; from
+ * the font protocol
+ */
+
+#define FONT_MAX_ASCENT(pi) ((pi)->fontAscent > (pi)->ink_maxbounds.ascent ? \
+ (pi)->fontAscent : (pi)->ink_maxbounds.ascent)
+#define FONT_MAX_DESCENT(pi) ((pi)->fontDescent > (pi)->ink_maxbounds.descent ? \
+ (pi)->fontDescent : (pi)->ink_maxbounds.descent)
+#define FONT_MAX_HEIGHT(pi) (FONT_MAX_ASCENT(pi) + FONT_MAX_DESCENT(pi))
+#define FONT_MIN_LEFT(pi) ((pi)->ink_minbounds.leftSideBearing < 0 ? \
+ (pi)->ink_minbounds.leftSideBearing : 0)
+#define FONT_MAX_RIGHT(pi) ((pi)->ink_maxbounds.rightSideBearing > \
+ (pi)->ink_maxbounds.characterWidth ? \
+ (pi)->ink_maxbounds.rightSideBearing : \
+ (pi)->ink_maxbounds.characterWidth)
+#define FONT_MAX_WIDTH(pi) (FONT_MAX_RIGHT(pi) - FONT_MIN_LEFT(pi))
+
+#endif /* FONTSTR_H */
diff --git a/fonts/utilities/ps2pk/fontxlfd.h b/fonts/utilities/ps2pk/fontxlfd.h
new file mode 100644
index 0000000000..9ea8090c30
--- /dev/null
+++ b/fonts/utilities/ps2pk/fontxlfd.h
@@ -0,0 +1,43 @@
+/*
+ * $XConsortium: fontxlfd.h,v 1.1 91/05/11 09:12:07 rws Exp $
+ *
+ * Copyright 1990 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+#ifndef _FONTXLFD_H_
+#define _FONTXLFD_H_
+
+
+typedef struct _FontScalable {
+ int pixel,
+ point,
+ x,
+ y,
+ width;
+} FontScalableRec, *FontScalablePtr;
+
+#define FONT_XLFD_REPLACE_NONE 0
+#define FONT_XLFD_REPLACE_STAR 1
+#define FONT_XLFD_REPLACE_ZERO 2
+#define FONT_XLFD_REPLACE_VALUE 3
+
+#endif /* _FONTXLFD_H_ */
diff --git a/fonts/utilities/ps2pk/fsmasks.h b/fonts/utilities/ps2pk/fsmasks.h
new file mode 100644
index 0000000000..dba6e8ec61
--- /dev/null
+++ b/fonts/utilities/ps2pk/fsmasks.h
@@ -0,0 +1,72 @@
+/* $XConsortium: fsmasks.h,v 1.2 91/05/13 16:46:16 gildea Exp $ */
+/*
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation and the
+ * Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this protoype software
+ * and its documentation to Members and Affiliates of the MIT X Consortium
+ * any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices, Digital or
+ * MIT not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE
+ * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * @(#)fsmasks.h 4.1 91/05/02
+ *
+ */
+
+/*
+ * masks & values used by the font lib and the font server
+ */
+
+#ifndef _FSMASKS_H_
+#define _FSMASKS_H_
+
+#include "types.h"
+
+/* font format macros */
+#define BitmapFormatByteOrderMask (1L << 0)
+#define BitmapFormatBitOrderMask (1L << 1)
+#define BitmapFormatImageRectMask (3L << 2)
+#define BitmapFormatScanlinePadMask (3L << 8)
+#define BitmapFormatScanlineUnitMask (3L << 12)
+
+#define BitmapFormatByteOrderLSB (0)
+#define BitmapFormatByteOrderMSB (1L << 0)
+#define BitmapFormatBitOrderLSB (0)
+#define BitmapFormatBitOrderMSB (1L << 1)
+
+#define BitmapFormatImageRectMin (0L << 2)
+#define BitmapFormatImageRectMaxWidth (1L << 2)
+#define BitmapFormatImageRectMax (2L << 2)
+
+#define BitmapFormatScanlinePad8 (0L << 8)
+#define BitmapFormatScanlinePad16 (1L << 8)
+#define BitmapFormatScanlinePad32 (2L << 8)
+#define BitmapFormatScanlinePad64 (3L << 8)
+
+#define BitmapFormatScanlineUnit8 (0L << 12)
+#define BitmapFormatScanlineUnit16 (1L << 12)
+#define BitmapFormatScanlineUnit32 (2L << 12)
+#define BitmapFormatScanlineUnit64 (3L << 12)
+
+#define BitmapFormatMaskByte (1L << 0)
+#define BitmapFormatMaskBit (1L << 1)
+#define BitmapFormatMaskImageRectangle (1L << 2)
+#define BitmapFormatMaskScanLinePad (1L << 3)
+#define BitmapFormatMaskScanLineUnit (1L << 4)
+
+typedef uint32_t fsBitmapFormat;
+typedef uint32_t fsBitmapFormatMask;
+
+#endif /* _FSMASKS_H_ */
diff --git a/fonts/utilities/ps2pk/hdigit.h b/fonts/utilities/ps2pk/hdigit.h
new file mode 100644
index 0000000000..adee64dd00
--- /dev/null
+++ b/fonts/utilities/ps2pk/hdigit.h
@@ -0,0 +1,94 @@
+/* $XConsortium: hdigit.h,v 1.2 91/10/10 11:18:11 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* -------------------------------------- */
+/* --- MACHINE GENERATED, DO NOT EDIT --- */
+/* -------------------------------------- */
+
+#ifndef HDIGIT
+#define HDIGIT 1
+
+/*
+ * Hex Digit Value Table --
+ *
+ * The entries in the Digit Value Table map character codes in the set
+ * {0-9,a-f,A-F} to their numeric values for readhexstring
+ * (00 10...F0 for the high hex digit and 00 01...0F for the low).
+ * The white-space and hex string termination characters are.
+ * mapped to codes > 0xf0 to enable usage by several modules.
+ * 2 tables are build HighHex and LowHex.
+ *
+ */
+
+/* Indicators for special characters in these tables */
+#define HERROR (0xfe)
+#define HWHITE_SPACE (0xfd)
+#define HRIGHT_ANGLE (0xfc)
+#define LAST_HDIGIT (0xf0)
+
+#define HighHexP (HighHex+1)
+unsigned char HighHex[257] = { 0xFF,
+ 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE,
+ 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE
+};
+#define LowHexP (LowHex+1)
+unsigned char LowHex[257] = { 0xFF,
+ 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE,
+ 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
+ 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE
+};
+
+#endif
diff --git a/fonts/utilities/ps2pk/hints.c b/fonts/utilities/ps2pk/hints.c
new file mode 100644
index 0000000000..5cd52aab7e
--- /dev/null
+++ b/fonts/utilities/ps2pk/hints.c
@@ -0,0 +1,916 @@
+/* $XConsortium: hints.c,v 1.4 91/10/10 11:18:13 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* HINTS CWEB V0006 ******** */
+/*
+:h1.HINTS Module - Processing Rasterization Hints
+
+&author. Sten F. Andler; continuity by Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Duaine
+W. Pryor, Jr.
+
+
+:h3.Include Files
+
+The included files are:
+*/
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "hints.h"
+
+/*
+:h3.Functions Provided to the TYPE1IMAGER User
+
+None.
+*/
+
+/*
+:h3.Functions Provided to Other Modules
+
+This module provides the following entry point to other modules:
+*/
+
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.Macros Provided to Other Modules
+
+None.
+*/
+
+/*
+:h2.InitHints() - Initialize hint data structure
+*/
+
+#define MAXLABEL 20
+static struct {
+ int inuse;
+ int computed;
+ struct fractpoint hint;
+} oldHint[MAXLABEL];
+
+#define ODD(x) (((int)(x)) & 01)
+#define FPFLOOR(fp) TOFRACTPEL((fp) >> FRACTBITS)
+#define FPROUND(fp) FPFLOOR((fp) + FPHALF)
+
+void InitHints(void)
+{
+ int i;
+
+ for (i = 0; i < MAXLABEL; i++)
+ {
+ oldHint[i].inuse = FALSE;
+ oldHint[i].computed = FALSE;
+ }
+}
+
+/*
+:h3.CloseHints(hintP) - Reverse hints that are still open
+*/
+
+void CloseHints(struct fractpoint *hintP)
+{
+ int i;
+
+ for (i = 0; i < MAXLABEL; i++)
+ {
+ if (oldHint[i].inuse)
+ {
+ hintP->x -= oldHint[i].hint.x;
+ hintP->y -= oldHint[i].hint.y;
+
+ oldHint[i].inuse = FALSE;
+
+ IfTrace3((HintDebug > 1)," Hint %d was open, hint=(%dl,%dl)\n",
+ i, hintP->x, hintP->y);
+ }
+ }
+}
+
+/*
+:h3.ComputeHint(hP, currX, currY, hintP) - Compute the value of a hint
+*/
+
+static void ComputeHint(struct hintsegment *hP, fractpel currX, fractpel currY,
+ struct fractpoint *hintP)
+{
+ fractpel currRef = 0, currWidth = 0;
+ int idealWidth;
+ fractpel hintValue = 0;
+ char orientation;
+
+/*
+By construction, width is never zero. Therefore we can use the
+width value to determine if the hint has been rotated by a
+multiple of 90 degrees.
+*/
+
+ if (hP->width.y == 0)
+ {
+ orientation = 'v'; /* vertical */
+ IfTrace0((HintDebug > 0)," vertical hint\n");
+ }
+ else if (hP->width.x == 0)
+ {
+ orientation = 'h'; /* horizontal */
+ IfTrace0((HintDebug > 0)," horizontal hint\n");
+ }
+ else
+ {
+ IfTrace0((HintDebug > 0)," hint not vertical or horizontal\n");
+ hintP->x = hintP->y = 0;
+ return;
+ }
+
+ /* Compute currRef and currWidth with a unit of 1 pel */
+ if (orientation == 'v') /* vertical */
+ {
+ currRef = hP->ref.x + currX;
+ currWidth = ABS(hP->width.x);
+ }
+ else if (orientation == 'h') /* horizontal */
+ {
+ currRef = hP->ref.y + currY;
+ currWidth = ABS(hP->width.y);
+ }
+ else /* error */
+ {
+ t1_abort("ComputeHint: invalid orientation");
+ }
+
+ IfTrace4((HintDebug > 1),
+ " currX=%dl, currY=%dl, currRef=%dl, currWidth=%dl\n",
+ currX, currY,
+ currRef, currWidth);
+
+ if ((hP->hinttype == 'b') /* Bar or stem */
+ || (hP->hinttype == 's')) /* Serif */
+ {
+ idealWidth = NEARESTPEL(currWidth);
+ if (idealWidth == 0) idealWidth = 1;
+ if (ODD(idealWidth)) /* Is ideal width odd? */
+ {
+ /* center "ref" over pel */
+ hintValue = FPFLOOR(currRef) + FPHALF - currRef;
+ }
+ else
+ {
+ /* align "ref" on pel boundary */
+ hintValue = FPROUND(currRef) - currRef;
+ }
+ if (HintDebug > 2) {
+ IfTrace1(TRUE," idealWidth=%d, ", idealWidth);
+ }
+ }
+ else if (hP->hinttype == 'c') /* Curve extrema */
+ {
+ /* align "ref" on pel boundary */
+ hintValue = FPROUND(currRef) - currRef;
+ }
+ else /* error */
+ {
+ t1_abort("ComputeHint: invalid hinttype");
+ }
+
+ IfTrace1((HintDebug > 1)," hintValue=%dl", hintValue);
+
+ if (orientation == 'v') /* vertical */
+ {
+ hintP->x = hintValue;
+ hintP->y = 0;
+ }
+ else if (orientation == 'h') /* horizontal */
+ {
+ hintP->x = 0;
+ hintP->y = hintValue;
+ }
+ else /* error */
+ {
+ t1_abort("ComputeHint: invalid orientation");
+ }
+}
+
+/*
+:h3.ProcessHint(hP, currX, currY, hintP) - Process a rasterization hint
+*/
+
+void ProcessHint(struct hintsegment *hP, fractpel currX, fractpel currY,
+ struct fractpoint *hintP)
+{
+ struct fractpoint thisHint = { 0, 0 };
+
+ IfTrace4((HintDebug > 1)," ref=(%dl,%dl), width=(%dl,%dl)",
+ hP->ref.x, hP->ref.y,
+ hP->width.x, hP->width.y);
+ IfTrace4((HintDebug > 1),", %c %c %c %c",
+ hP->orientation, hP->hinttype,
+ hP->adjusttype, hP->direction);
+ IfTrace1((HintDebug > 1),", label=%d\n", hP->label);
+
+ if ((hP->adjusttype == 'm') /* Move */
+ || (hP->adjusttype == 'a')) /* Adjust */
+ {
+ /* Look up hint in oldHint table */
+ if ((hP->label >= 0) && (hP->label < MAXLABEL))
+ {
+ if (oldHint[hP->label].computed)
+ /* Use old hint value if already computed */
+ {
+ thisHint.x = oldHint[hP->label].hint.x;
+ thisHint.y = oldHint[hP->label].hint.y;
+ oldHint[hP->label].inuse = TRUE;
+ }
+ else
+ /* Compute new value for hint and store it for future use */
+ {
+ ComputeHint(hP, currX, currY, &thisHint);
+
+ oldHint[hP->label].hint.x = thisHint.x;
+ oldHint[hP->label].hint.y = thisHint.y;
+ oldHint[hP->label].inuse = TRUE;
+ oldHint[hP->label].computed = TRUE;
+ }
+ }
+ else /* error */
+ {
+ t1_abort("ProcessHint: invalid label");
+ }
+ }
+ else if (hP->adjusttype == 'r') /* Reverse */
+ {
+ /* Use the inverse of the existing hint value to reverse hint */
+ if ((hP->label >= 0) && (hP->label < MAXLABEL))
+ {
+ if (oldHint[hP->label].inuse)
+ {
+ thisHint.x = -oldHint[hP->label].hint.x;
+ thisHint.y = -oldHint[hP->label].hint.y;
+ oldHint[hP->label].inuse = FALSE;
+ }
+ else /* error */
+ {
+ t1_abort("ProcessHint: label is not in use");
+ }
+ }
+ else /* error */
+ {
+ t1_abort("ProcessHint: invalid label");
+ }
+
+ }
+ else /* error */
+ {
+ t1_abort("ProcessHint: invalid adjusttype");
+ }
+ IfTrace3((HintDebug > 1)," label=%d, thisHint=(%dl,%dl)\n",
+ hP->label, thisHint.x, thisHint.y);
+
+ hintP->x += thisHint.x;
+ hintP->y += thisHint.y;
+
+ IfTrace2((HintDebug > 1)," hint=(%dl,%dl)\n",
+ hintP->x, hintP->y);
+}
+
+/*
+:h2 id=subpath.Navigation Through Edge Lists
+
+For continuity checking purposes, we need to navigate through edge
+lists by the "subpath" chains and answer questions about edges. The
+subpath chain links together edges that were part of the same subpath
+(no intervening move segments) when the interior of the path was
+calculated. Here we use the term "edge" to mean every edge list
+that was created in between changes of direction.
+
+The subpath chains are singly-linked circular chains. For the convenience
+of building them, they direction of the list (from edge to edge) is the
+reverse of the order in which they were built. Within any single edge,
+the subpath chain goes from top-to-bottom. (There might be a violation
+of this because of the way the user started the first chain; see
+:hdref refid=fixsubp..).
+
+:h3.ISTOP() and ISBOTTOM() - Flag Bits for Edge Lists at the Top and
+Bottom of Their SubPaths
+*/
+
+#define ISTOP(flag) ((flag)&0x20)
+#define ISBOTTOM(flag) ((flag)&0x10)
+/*
+:h3.ISLEFT() - Flag Bit for Left Edges
+*/
+
+#define ISLEFT(flag) ((flag)&0x08)
+
+/*
+:h3.XofY() - Macro to Find X Value at Given Y
+
+This macro can only be used if it is known that the Y is within the
+given edgelist's ymin and ymax.
+*/
+
+#define XofY(edge, y) edge->xvalues[y - edge->ymin]
+
+/*
+:h3.findXofY() - Like XofY(), Except not Restricted
+
+If the Y is out of bounds of the given edgelist, this macro will
+call SearchXofY to search the edge's subpath chain for the correct
+Y range. If the Y value is off the edge, MINPEL is returned.
+*/
+#define findXofY(edge, y) ((y < edge->ymin || y >= edge->ymax) ? SearchXofY(edge, y) : XofY(edge, y))
+
+/*
+:h4.SearchXofY() - Routine Called by FindXofY() for Difficult Cases
+
+The concept of this routine is to follow the subpath chain to find the
+edge just below (i.e., next in chain) or just above (i.e., immediately
+before in chain. It is assumed that the Y value is no more than one
+off of the edge's range; XofY() could be replace by FindXofY() to
+call ourselves recursively if this were not true.
+*/
+
+static pel SearchXofY(
+ register struct edgelist *edge, /* represents edge */
+ register pel y) /* 'y' value to find edge for */
+{
+ register struct edgelist *e; /* loop variable */
+
+ if (y < edge->ymin) {
+ if (ISTOP(edge->flag))
+ return(MINPEL);
+ for (e = edge->subpath; e->subpath != edge; e = e->subpath) { ; }
+ if (e->ymax == edge->ymin)
+ return(XofY(e, y));
+ }
+ else if (y >= edge->ymax) {
+ if (ISBOTTOM(edge->flag))
+ return(MINPEL);
+ e = edge->subpath;
+ if (e->ymin == edge->ymax)
+ return(XofY(e, y));
+ }
+ else
+ return(XofY(edge, y));
+
+ t1_abort("bad subpath chain");
+
+ /*NOTREACHED*/
+ return MINPEL;
+}
+/*
+:h3.ISBREAK() Macro - Tests if an Edge List is at a "Break"
+
+The subpath chains are organized top to bottom. When the bottom of
+a given edge is reached, the subpath chain points to the top of the
+next edge. We call this a "break" in the chain. The following macro
+is the simple test for the break condition:
+*/
+
+#define ISBREAK(top,bot) (top->ymax != bot->ymin)
+
+
+/*
+:h3.ImpliedHorizontalLine() - Tests for Horizontal Connectivity
+
+This function returns true if two edges are connected horizontally.
+They are connected horizontally if they are consecutive in the subpath,
+and either we are at the bottom and the first edge is going down or we
+are at the top and the first edge is going up.
+*/
+
+#define BLACKABOVE -1
+#define BLACKBELOW +1
+#define NONE 0
+
+static int ImpliedHorizontalLine(
+ register struct edgelist *e1, /* two edges ... */
+ register struct edgelist *e2, /* ... to check */
+ register int y) /* y where they might be connected */
+{
+ register struct edgelist *e3,*e4;
+
+ if (ISDOWN(e1->flag) == ISDOWN(e2->flag))
+ return(NONE); /* can't be consecutive unless different directions */
+/*
+Now we check for consecutiveness: Can we get from 'e1' to 'e2' with
+only one intervening break? Can we get from 'e2' to 'e1' with only one
+intervening break? 'e3' will be as far as we can get after 'e1'; 'e4'
+will be has far as we can get after 'e2':
+*/
+ for (e3 = e1; !ISBREAK(e3, e3->subpath); e3 = e3->subpath) { ; }
+ for (e3 = e3->subpath; e3 != e2; e3 = e3->subpath)
+ if (ISBREAK(e3, e3->subpath))
+ break;
+
+ for (e4 = e2; !ISBREAK(e4, e4->subpath); e4 = e4->subpath) { ; }
+ for (e4 = e4->subpath; e4 != e1; e4 = e4->subpath)
+ if (ISBREAK(e4, e4->subpath))
+ break;
+/*
+If the edges are mutually consecutive, we must have horizontal lines
+both top and bottom:
+*/
+ if (e3 == e2 && e4 == e1)
+ return(TRUE);
+/*
+If the edges are not consecutive either way, no horizontal lines are
+possible:
+*/
+ if (e3 != e2 && e4 != e1)
+ return(NONE);
+/*
+Now let's swap 'e1' and 'e2' if necessary to enforce the rule that 'e2'
+follows 'e1'. Remember that subpath chains go in the opposite direction
+from the way the subpaths were built; this led to the simplest way
+do build them.
+*/
+ if (e4 != e1) {
+ e2 = e1;
+ e1 = e3; /* remember e3 == e2, this just swaps 'e1' and 'e2' */
+ }
+/*
+Now we have everything to return the answer:
+*/
+ if (ISTOP(e1->flag) && y == e1->ymin)
+ return(ISDOWN(e2->flag));
+ else if (ISBOTTOM(e1->flag) && y == e1->ymax)
+ return(!ISDOWN(e2->flag));
+ else
+ t1_abort("ImpliedHorizontalLine: why ask?");
+ /*NOTREACHED*/
+ return 0;
+}
+
+/*
+:h3 id=fixsubp.FixSubPaths() - Must be Called to Organize Subpath Chains
+
+The region-building code in Interior(), in particular splitedge(),
+maintains the rule that sub-paths are linked top-to-bottom except
+at breaks. However, it is possible that there may be a "false break"
+because the user started the subpath in the middle of an edge (and
+went in the "wrong" direction from there, up instead of down). This
+routine finds and fixes false breaks.
+
+Also, this routine sets the ISTOP and ISBOTTOM flags in the edge lists.
+*/
+
+static void FixSubPaths(
+ register struct region *R) /* anchor of region */
+{
+ register struct edgelist *e; /* fast loop variable */
+ register struct edgelist *edge; /* current edge in region */
+ register struct edgelist *next; /* next in subpath after 'edge' */
+ register struct edgelist *break1; /* first break after 'next' */
+ register struct edgelist *break2 = NULL; /* last break before 'edge' */
+ register struct edgelist *prev; /* previous edge for fixing links */
+ int left = TRUE;
+
+ for (edge = R->anchor; edge != NULL; edge = edge->link) {
+
+ if (left)
+ edge->flag |= ISLEFT(ON);
+ left = !left;
+
+ next = edge->subpath;
+
+ if (!ISBREAK(edge, next))
+ continue;
+ if (edge->ymax < next->ymin)
+ t1_abort("disjoint subpath?");
+/*
+'edge' now contains an edgelist at the bottom of an edge, and 'next'
+contains the next subsequent edgelist in the subpath, which must be at
+the top. We refer to this a "break" in the subpath.
+*/
+ next->flag |= ISTOP(ON);
+ edge->flag |= ISBOTTOM(ON);
+
+ if (ISDOWN(edge->flag) != ISDOWN(next->flag))
+ continue;
+/*
+We are now in the unusual case; both edges are going in the same
+direction so this must be a "false break" due to the way that the user
+created the path. We'll have to fix it.
+*/
+ for (break1 = next; !ISBREAK(break1, break1->subpath); break1 = break1->subpath) { ; }
+
+ for (e = break1->subpath; e != edge; e = e->subpath)
+ if (ISBREAK(e, e->subpath))
+ break2 = e;
+/*
+Now we've set up 'break1' and 'break2'. I've found the following
+diagram invaluable. 'break1' is the first break after 'next'. 'break2'
+is the LAST break before 'edge'.
+&drawing.
+ next
+ +------+ +---->+------+
+ +--->| >-----+ | | >-----+
+ | | | | | | | |
+ | +-------------+ | +-------------+
+ | | |break1| | | | |
+ | +->| >-------+ +->| >-----+
+ | | | | | |
+ | | | +-------------+
+ | +------+ | | |
+ | +----------------+ | | |
+ | | +------+ | +->| >-----+
+ | +->| >-----+ | | | |
+ | | | | | +-------------+
+ | +-------------+ | | | |
+ | | |edge | | | |break2|
+ | +->| >-----+ | +->| >-----+
+ | | | | | | | |
+ | | | | | | | |
+ | | | | | | | |
+ | +------+ | | +------+ |
+ | | | |
+ +---------------+ +---------------+
+
+&edrawing.
+We want to fix this situation by having 'edge' point to where 'break1'
+now points, and having 'break1' point to where 'break2' now points.
+Finally, 'break2' should point to 'next'. Also, we observe that
+'break1' can't be a bottom, and is also not a top unless it is the same
+as 'next':
+*/
+ edge->subpath = break1->subpath;
+
+ break1->subpath = break2->subpath;
+ if (ISBREAK(break1, break1->subpath))
+ t1_abort("unable to fix subpath break?");
+
+ break2->subpath = next;
+
+ break1->flag &= ~ISBOTTOM(ON);
+ if (break1 != next)
+ break1->flag &= ~ISTOP(ON);
+ }
+/*
+This region might contain "ambiguous" edges; edges exactly equal to
+edge->link. Due to the random dynamics of where they get sorted into
+the list, they can yield false crossings, where the edges appear
+to cross. This confuses our continuity logic no end. Since we can
+swap them without changing the region, we do.
+*/
+ for (edge = R->anchor, prev = NULL; VALIDEDGE(edge); prev = edge, edge = prev->link) {
+
+ if (! ISAMBIGUOUS(edge->flag))
+ continue;
+
+ next = edge->subpath;
+
+ while (ISAMBIGUOUS(next->flag) && next != edge)
+ next = next->subpath;
+/*
+We've finally found a non-ambiguous edge; we make sure it is left/right
+compatible with 'edge':
+*/
+ if ( (ISLEFT(edge->flag) == ISLEFT(next->flag) && ISDOWN(edge->flag) == ISDOWN(next->flag) )
+ || (ISLEFT(edge->flag) != ISLEFT(next->flag) && ISDOWN(edge->flag) != ISDOWN(next->flag) ) )
+ continue;
+
+/*
+Incompatible, we will swap 'edge' and the following edge in the list.
+You may think that there must be a next edge in this swath. So did I.
+No! If there is a totally ambiguous inner loop, for example, we could
+get all the way to the outside without resolving ambiguity.
+*/
+ next = edge->link; /* note new meaning of 'next' */
+ if (next == NULL || edge->ymin != next->ymin)
+ continue;
+ if (prev == NULL)
+ R->anchor = next;
+ else
+ prev->link = next;
+ edge->link = next->link;
+ next->link = edge;
+ edge->flag ^= ISLEFT(ON);
+ edge->flag &= ~ISAMBIGUOUS(ON);
+ next->flag ^= ISLEFT(ON);
+ next->flag &= ~ISAMBIGUOUS(ON);
+ edge = next;
+ }
+}
+/*
+:h3.DumpSubPaths()
+
+A debug tool.
+*/
+
+static struct edgelist *before(struct edgelist *); /* subroutine of DumpSubPaths */
+
+static void DumpSubPaths(struct edgelist *anchor)
+{
+
+ register struct edgelist *edge,*e,*e2;
+ pel y;
+
+ for (edge = anchor; VALIDEDGE(edge); edge = edge->link) {
+ if (ISPERMANENT(edge->flag))
+ continue;
+ IfTrace0(TRUE, "BEGIN Subpath\n");
+ for (e2 = edge; !ISPERMANENT(e2->flag);) {
+ if (ISDOWN(e2->flag)) {
+ IfTrace1(TRUE, ". Downgoing edge's top at %p\n", e2);
+ for (e = e2;; e = e->subpath) {
+ IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n",
+ e->ymin, *e->xvalues, e, e->flag);
+ for (y=e->ymin+1; y < e->ymax; y++)
+ IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]);
+ e->flag |= ISPERMANENT(ON);
+ if (ISBREAK(e, e->subpath))
+ break;
+ }
+ }
+ else {
+ IfTrace1(TRUE, ". Upgoing edge's top at %p\n", e2);
+ for (e = e2; !ISBREAK(e, e->subpath); e = e->subpath) { ; }
+ for (;; e=before(e)) {
+ IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n",
+ e->ymax-1, e->xvalues[e->ymax-1-e->ymin], e, e->flag);
+ for (y=e->ymax-2; y >= e->ymin; y--)
+ IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]);
+ e->flag |= ISPERMANENT(ON);
+ if (e == e2)
+ break;
+ }
+ }
+ do {
+ e2 = before(e2);
+ } while (!ISBREAK(before(e2), e2));
+ }
+ }
+}
+
+static struct edgelist *before(struct edgelist *e)
+{
+ struct edgelist *r;
+ for (r = e->subpath; r->subpath != e; r = r->subpath) { ; }
+ return(r);
+}
+
+/*
+:h2.Fixing Region Continuity Problems
+
+Small regions may become disconnected when their connecting segments are
+less than a pel wide. This may be correct in some applications, but in
+many (especially small font characters), it is more pleasing to keep
+connectivity. ApplyContinuity() (invoked by +CONTINUITY on the
+Interior() fill rule) fixes connection breaks. The resulting region
+is geometrically less accurate, but may be more pleasing to the eye.
+*/
+/*
+Here are some macros which we will need:
+*/
+
+#define IsValidPel(j) (j!=MINPEL)
+
+/*
+:h3.writeXofY() - Stuffs an X Value Into an "edgelist"
+
+writeXofY writes an x value into an edge at position 'y'. It must
+update the edge's xmin and xmax. If there is a possibility that this
+new x might exceed the region's bounds, updating those are the
+responsibility of the caller.
+*/
+
+static void writeXofY(
+ struct edgelist *e, /* relevant edgelist */
+ int y, /* y value */
+ int x) /* new x value */
+{
+ if (e->xmin > x) e->xmin = x;
+ if (e->xmax < x) e->xmax = x;
+ e->xvalues[y - e->ymin] = x;
+}
+
+/*-------------------------------------------------------------------------*/
+/* the following three macros tell us whether we are at a birth point, a */
+/* death point, or simply in the middle of the character */
+/*-------------------------------------------------------------------------*/
+#define WeAreAtTop(e,i) (ISTOP(e->flag) && e->ymin == i)
+#define WeAreAtBottom(e,i) (ISBOTTOM(e->flag) && e->ymax-1 == i)
+#define WeAreInMiddle(e,i) \
+ ((!ISTOP(e->flag) && !ISBOTTOM(e->flag))||(i < e->ymax-1 && i > e->ymin))
+/*
+The following macro tests if two "edgelist" structures are in the same
+swath:
+*/
+#define SAMESWATH(e1,e2) (e1->ymin == e2->ymin)
+
+/*
+:h3.CollapseWhiteRun() - Subroutine of ApplyContinuity()
+
+When we have a white run with an implied horizontal line above or
+below it, we better have black on the other side of this line. This
+function both tests to see if black is there, and adjusts the end
+points (collapses) the white run as necessary if it is not. The
+goal is to collapse the white run as little as possible.
+*/
+
+static void CollapseWhiteRun(
+ struct edgelist *anchor, /* anchor of edge list */
+ pel yblack, /* y of (hopefully) black run above or below */
+ struct edgelist *left, /* edgelist at left of WHITE run */
+ struct edgelist *right, /* edgelist at right of WHITE run */
+ pel ywhite) /* y location of white run */
+{
+ struct edgelist *edge;
+ struct edgelist *swathstart = anchor;
+ register pel x;
+
+ if (XofY(left, ywhite) >= XofY(right, ywhite))
+ return;
+/*
+Find the swath with 'yblack'. If we don't find it, completely collapse
+the white run and return:
+*/
+ while (VALIDEDGE(swathstart)) {
+ if (yblack < swathstart->ymin) {
+ writeXofY(left, ywhite, XofY(right, ywhite));
+ return;
+ }
+ if (yblack < swathstart->ymax) break;
+ swathstart = swathstart->link->link;
+ }
+ if(!VALIDEDGE(swathstart)) {
+ writeXofY(left, ywhite, XofY(right, ywhite));
+ return;
+ }
+/*
+Now we are in the swath that contains 'y', the reference line above
+or below that we are trying to maintain continuity with. If black
+in this line begins in the middle of our white run, we must collapse
+the white run from the left to that point. If black ends in the
+middle of our white run, we must collapse the white run from the right
+to that point.
+*/
+ for (edge = swathstart; VALIDEDGE(edge); edge = edge->link) {
+
+ if (!SAMESWATH(swathstart,edge))
+ break;
+ if( XofY(edge, yblack) > XofY(left, ywhite)) {
+ if (ISLEFT(edge->flag)) {
+ x = XofY(edge, yblack);
+ if (XofY(right, ywhite) < x)
+ x = XofY(right, ywhite);
+ writeXofY(left, ywhite, x);
+ }
+ else {
+ x = XofY(edge, yblack);
+ while (edge->link != NULL && SAMESWATH(edge, edge->link)
+ && x >= XofY(edge->link, yblack) ) {
+ edge = edge->link->link;
+ x = XofY(edge, yblack);
+ }
+ if (x < XofY(right, ywhite))
+ writeXofY(right, ywhite, x);
+ return;
+ }
+ }
+ }
+ writeXofY(left, ywhite, XofY(right, ywhite));
+}
+
+/*
+:h3.ApplyContinuity() - Fix False Breaks in a Region
+
+This is the externally visible routine called from the REGIONS module
+when the +CONTINUITY flag is on the Interior() fill rule.
+*/
+
+void ApplyContinuity(struct region *R)
+{
+ struct edgelist *left;
+ struct edgelist *right;
+ struct edgelist *edge,*e2;
+ pel rightXabove,rightXbelow,leftXabove,leftXbelow;
+ pel leftX,rightX;
+ int i;
+ int32_t newcenter,abovecenter,belowcenter;
+
+ FixSubPaths(R);
+ if (RegionDebug >= 3)
+ DumpSubPaths(R->anchor);
+ left = R->anchor;
+/* loop through and do all of the easy checking. ( no tops or bottoms) */
+ while(VALIDEDGE(left))
+ {
+ right = left->link;
+ for(i=left->ymin;i<left->ymax;++i)
+ {
+ leftX = findXofY(left,i);
+ rightX = findXofY(right,i);
+ leftXbelow = findXofY(left,i+1);
+ rightXbelow = findXofY(right,i+1);
+ if(rightX <= leftX)
+ {
+/* then, we have a break in a near vertical line */
+ leftXabove = findXofY(left,i-1);
+ rightXabove = findXofY(right,i-1);
+ if( IsValidPel(leftXabove) && IsValidPel(rightXabove) )
+ {
+ abovecenter = leftXabove + rightXabove;
+ }
+ else
+ {
+ abovecenter = leftX + rightX;
+ }
+ if( IsValidPel(leftXbelow) && IsValidPel(rightXbelow) )
+ {
+ belowcenter = leftXbelow + rightXbelow;
+ }
+ else
+ {
+ belowcenter = leftX + rightX;
+ }
+ newcenter = abovecenter + belowcenter;
+ if( newcenter > 4*leftX )
+ {
+ rightX = rightX + 1;
+ }
+ else if( newcenter < 4*leftX)
+ {
+ leftX = leftX - 1;
+ }
+ else
+ {
+ rightX = rightX + 1;
+ }
+ writeXofY(right,i,rightX);
+ writeXofY(left,i,leftX);
+ if(rightX > R->xmax) {R->xmax = rightX;}
+ if(leftX < R->xmin) {R->xmin = leftX;}
+ }
+ if( !WeAreAtBottom(left,i) && (leftXbelow>=rightX))
+ {
+/* then we have a break in a near horizontal line in the middle */
+ writeXofY(right,i,leftXbelow);
+ }
+ if( !WeAreAtBottom(right,i) && (leftX >=rightXbelow))
+ {
+/* then we have a break in a near horizontal line in the middle */
+ writeXofY(left,i,rightXbelow);
+ }
+ }
+ left = right->link;
+ }
+/*
+There may be "implied horizontal lines" between edges that have
+implications for continuity. This loop looks for white runs that
+have implied horizontal lines on the top or bottom, and calls
+CollapseWhiteRuns to check and fix any continuity problems from
+them.
+*/
+ for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) {
+ if ((!ISTOP(edge->flag) && !ISBOTTOM(edge->flag)) || ISLEFT(edge->flag))
+ continue; /* at some future date we may want left edge logic here too */
+ for (e2 = edge->link; VALIDEDGE(e2) && SAMESWATH(edge,e2); e2 = e2->link) {
+ if (ISTOP(e2->flag) && ISTOP(edge->flag)
+ && NONE != ImpliedHorizontalLine(edge,e2,edge->ymin)) {
+ if (ISLEFT(e2->flag))
+ CollapseWhiteRun(R->anchor, edge->ymin-1,
+ edge, e2, edge->ymin);
+ }
+ if (ISBOTTOM(e2->flag) && ISBOTTOM(edge->flag)
+ && NONE != ImpliedHorizontalLine(edge,e2, edge->ymax)) {
+ if (ISLEFT(e2->flag))
+ CollapseWhiteRun(R->anchor, edge->ymax,
+ edge, e2, edge->ymax-1);
+ }
+ }
+ }
+}
+
+
+
+
diff --git a/fonts/utilities/ps2pk/hints.h b/fonts/utilities/ps2pk/hints.h
new file mode 100644
index 0000000000..a3f91675cb
--- /dev/null
+++ b/fonts/utilities/ps2pk/hints.h
@@ -0,0 +1,43 @@
+/* $XConsortium: hints.h,v 1.2 91/10/10 11:18:19 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+#define InitHints t1_InitHints
+void t1_InitHints(void); /* Initialize hint data structure */
+
+#define CloseHints(hintP) t1_CloseHints(hintP)
+void t1_CloseHints(struct fractpoint *); /* Reverse hints that are still open */
+
+#define ProcessHint(hP, currX, currY, hintP) t1_ProcessHint(hP, currX, currY, hintP)
+void t1_ProcessHint(struct hintsegment *, fractpel, fractpel,
+ struct fractpoint *); /* Process a rasterization hint */
+
+#define ApplyContinuity(R) t1_ApplyContinuity(R)
+void t1_ApplyContinuity(struct region *); /* fix false connection breaks in a region */
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/lines.c b/fonts/utilities/ps2pk/lines.c
new file mode 100644
index 0000000000..41a1d5beb2
--- /dev/null
+++ b/fonts/utilities/ps2pk/lines.c
@@ -0,0 +1,194 @@
+/* $XConsortium: lines.c,v 1.2 91/10/10 11:18:21 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* LINES CWEB V0003 ******** */
+/*
+:h1.LINES Module - Rasterizing Lines
+
+&author. Duaine W. Pryor, Jr. and Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com)
+
+
+:h3.Include Files
+
+The included files are:
+*/
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "lines.h"
+
+/*
+:h3.Functions Provided to the TYPE1IMAGER User
+
+None.
+*/
+
+/*
+:h3.Functions Provided to Other Modules
+
+This module provides the following entry point to other modules:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.Macros Provided to Other Modules
+
+None.
+*/
+
+/*
+:h2.StepLine() - Produces Run Ends for a Line After Checks
+
+The main work is done by Bresenham(); here we just perform checks and
+get the line so that its Y direction is always increasing:
+*/
+
+static void Bresenham(pel *, fractpel, fractpel, fractpel, fractpel);
+
+void StepLine(
+ register struct region *R, /* region being built */
+ register fractpel x1, /* starting ... */
+ register fractpel y1, /* ... point */
+ register fractpel x2, /* ending ... */
+ register fractpel y2) /* ... point */
+{
+ register fractpel dy;
+
+ IfTrace4((LineDebug > 0), ".....StepLine: (%dl,%dl) to (%dl,%dl)\n",
+ x1, y1, x2, y2);
+
+ dy = y2 - y1;
+
+/*
+We execute the "GOING_TO" macro to call back the REGIONS module, if
+necessary (like if the Y direction of the edge has changed):
+*/
+ GOING_TO(R, x1, y1, x2, y2, dy);
+
+ if (dy == 0)
+ return;
+
+ if (dy < 0)
+ Bresenham(R->edge, x2, y2, x1, y1);
+ else
+ Bresenham(R->edge, x1, y1, x2, y2);
+ return;
+}
+/*
+:h3.Bresenham() - Actually Produces Run Ends
+
+This routine runs a Bresenham line-stepping
+algorithm. See, for example, Newman and Sproul, :hp1/Principles
+of Interactive Computer Graphics/, pp. 25-27.
+When we enter this, we
+are guaranteed that dy is positive.
+We'd like to work in 8 bit precision, so we'll define some macros and
+constants to let us do that:
+*/
+
+#define PREC 8 /* we'll keep fraction pels in 8 bit precision */
+/*
+RoundFP() rounds down by 'b' bits:
+*/
+#define RoundFP(xy,b) (((xy)+(1<<((b)-1)))>>(b))
+
+/*
+TruncFP() truncates down by 'b' bits:
+*/
+#define TruncFP(xy,b) ((xy)>>(b))
+
+
+static void Bresenham(
+ register pel *edgeP, /* pointer to top of list (y == 0) */
+ register fractpel x1, /* starting point ... */
+ register fractpel y1, /* ... on line */
+ register fractpel x2, /* ending point ... */
+ register fractpel y2) /* ... on the line (down) */
+{
+ register int32_t dx,dy; /* change in x and y, in my own precision */
+ register int32_t x,y; /* integer pel starting point */
+ register int count; /* integer pel delta y */
+ register int32_t d; /* the Bresenham algorithm error term */
+
+ x1 = TruncFP(x1, FRACTBITS-PREC);
+ y1 = TruncFP(y1, FRACTBITS-PREC);
+ x2 = TruncFP(x2, FRACTBITS-PREC);
+ y2 = TruncFP(y2, FRACTBITS-PREC);
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+/*
+Find the starting x and y integer pel coordinates:
+*/
+
+ x = RoundFP(x1,PREC);
+ y = RoundFP(y1,PREC);
+ edgeP += y;
+ count = RoundFP(y2,PREC) - y;
+/*------------------------------------------------------------------*/
+/* Force dx to be positive so that dfy will be negative */
+/* this means that vertical moves will decrease d */
+/*------------------------------------------------------------------*/
+ if (dx<0)
+ {
+ dx = -dx;
+#define P PREC
+ d=(dy*(x1-(x<<P)+(1<<(P-1)))-dx*((y<<P)-y1+(1<<(P-1))))>>P;
+#undef P
+ while(--count >= 0 )
+ {
+ while(d<0)
+ {
+ --x;
+ d += dy;
+ }
+ *(edgeP++) = x;
+ d -= dx;
+ }
+ }
+ else /* positive dx */
+ {
+#define P PREC
+ d = (dy*((x<<P)-x1+(1<<(P-1)))-dx*((y<<P)-y1+(1<<(P-1))))>>P;
+#undef P
+ while(--count >= 0 )
+ {
+ while(d<0)
+ {
+ ++x;
+ d += dy;
+ }
+ *(edgeP++) = x;
+ d -= dx;
+ }
+ }
+}
diff --git a/fonts/utilities/ps2pk/lines.h b/fonts/utilities/ps2pk/lines.h
new file mode 100644
index 0000000000..011955c299
--- /dev/null
+++ b/fonts/utilities/ps2pk/lines.h
@@ -0,0 +1,36 @@
+/* $XConsortium: lines.h,v 1.2 91/10/10 11:18:23 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+#define StepLine(R,x1,y1,x2,y2) t1_StepLine(R,x1,y1,x2,y2)
+
+void t1_StepLine(struct region *, fractpel, fractpel, fractpel,
+ fractpel); /* check for special conditions, call Bresenham */
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/mag.1 b/fonts/utilities/ps2pk/mag.1
new file mode 100644
index 0000000000..bf1c97ce7a
--- /dev/null
+++ b/fonts/utilities/ps2pk/mag.1
@@ -0,0 +1,68 @@
+.\" e
+.TH MAG 1 "1 Feb 2016"
+.de EX
+.sp
+.in +5
+.nf
+.ft CW
+..
+.de EE
+.in -5
+.ft R
+.sp
+.fi
+..
+.SH NAME
+mag \- computes TeX fontsizes and magsteps
+.SH SYNOPSIS
+.B
+mag
+[-\fBR\fIdpi\fP\fP] magstep . . .
+
+.B
+mag
+[-\fBr\fP] [-\fBR\fP\fIdpi\fP] fontsize . . .
+
+.SH DESCRIPTION
+.EQ
+delim $$
+.EN
+This tool calculates fontsizes given magsteps. TeXfonts are provided as
+true sized fonts or as magnifications. The fontsize of a true sized
+font equals the resolution of the printer (ex. 300). The fontsize
+of a font magnified $n$ \fImagsteps\fP equals:
+.EQ
+1.2 sup{n} times 300
+delim off
+.EN
+rounded to its nearest integer value. Fontnames for TeX fonts normally
+consists of the name (\fIcmr\fP), pointsize (\fI10\fP), type (\fIpk\fP)
+and fontsize (\fI360\fP), for example: \fIcmr10.360pk\fP.
+
+.SH EXAMPLES
+The result of \fImag -R240 -2 0 0.5 1\fP will be:
+.EX
+167 240 263 288
+.EE
+
+The inverse function is computed with the \fI-r\fP option. The result of
+\fImag -r -R240 167 240 263 288\fP
+will be the fontsteps:
+.EX
+-2 0 0.5 1
+.EE
+
+The UNIX shells allow command substitution. One can write:
+.EX
+mag -r -R240 `mag -R240 -2 0 0.5 1`
+.EE
+
+.SH DATE
+18 December, 1989
+
+.SH AUTHOR
+.nf
+Piet Tutelaers
+University of Technology Eindhoven
+Maintained in TeX Live; please send bug reports or other correspondence
+to tex-k@tug.org (http://lists.tug.org/tex-k).
diff --git a/fonts/utilities/ps2pk/mag.c b/fonts/utilities/ps2pk/mag.c
new file mode 100644
index 0000000000..3f5c6b61d5
--- /dev/null
+++ b/fonts/utilities/ps2pk/mag.c
@@ -0,0 +1,156 @@
+/*
+ * .\" e
+ * .TH MAG 1 UMFT
+ * .SH NAME
+ * mag \- computes fontsizes and magsteps
+ *
+ * .de Ex
+ * .sp
+ * .RS
+ * .nf
+ * .ft C
+ * ..
+ * .de Xe
+ * .RE
+ * .sp
+ * .fi
+ * ..
+ * .SH SYNOPSIS
+ * .B
+ * mag
+ * [-\fBR\fIdpi\fP\fP] magstep . . .
+ *
+ * .B
+ * mag
+ * [-\fBr\fP] [-\fBR\fP\fIdpi\fP] fontsize . . .
+ *
+ * .SH DESCRIPTION
+ * .EQ
+ * delim $$
+ * .EN
+ * This tool calculates fontsizes given magsteps. TeXfonts are provided as
+ * true sized fonts or as magnifications. The fontsize of a true sized
+ * font equals the resolution of the printer (ex. 300). The fontsize
+ * of a font magnified $n$ \fImagsteps\fP equals:
+ * .EQ
+ * 1.2 sup{n} times 300
+ * delim off
+ * .EN
+ * rounded to its nearest integer value. Fontnames for TeX fonts normally
+ * consists of the name (\fIcmr\fP), pointsize (\fI10\fP), type (\fIpk\fP)
+ * and fontsize (\fI360\fP), for example: \fIcmr10.360pk\fP.
+ *
+ * .SH EXAMPLES
+ * The result of \fImag -R240 -2 0 0.5 1\fP will be:
+ * .Ex
+ * 167 240 263 288
+ * .Xe
+ *
+ * The inverse function is computed with the \fI-r\fP option. The result of
+ * \fImag -r -R240 167 240 263 288\fP
+ * will be the fontsteps:
+ * .Ex
+ * -2 0 0.5 1
+ * .Xe
+ *
+ * The UNIX shells allow command substitution. One can write:
+ * .Ex
+ * mag -r -R240 `mag -R240 -2 0 0.5 1`
+ * .Xe
+ *
+ * .SH DATE
+ * August, 1992
+ *
+ * .SH AUTHOR
+ * .nf
+ * Piet Tutelaers
+ * University of Technology Eindhoven
+ */
+
+#include "basics.h" /* fatal() */
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef WIN32
+#include <fcntl.h>
+#endif
+
+int invert = 0;
+float DPI = 300.0;
+
+/* Prototypes */
+static int fontsize(double);
+static double stepsize(double);
+
+int main(int argc, char *argv[]) {
+ float sz, arg; int c;
+ const char *myname = "mag";
+ short done;
+
+ while (--argc > 0 && (*++argv)[0] == '-') {
+ if (isdigit((int)(*argv)[1])) { /* allow negative numbers as arguments */
+ break;
+ }
+ done=0;
+ while ((!done) && (c = *++argv[0])) /* allow -bcK like options */
+ switch (c) {
+ case 'r':
+ invert = 1; break;
+ case 'R':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ DPI = atof(argv[0]);
+ done = 1;
+ break;
+invalid:
+ default:
+ fatal("%s: %c invalid option\n", myname, c);
+ }
+ }
+
+ if (argc < 1) {
+ msg ("mag (ps2pk) version " PACKAGE_VERSION "\n");
+ fatal("Usage: %s [-r] [-Rdpi] size . . .\n", myname);
+ }
+
+#ifdef WIN32
+ setmode(fileno(stdout), _O_BINARY);
+#endif
+
+ for ( ; argc; argc--, argv++) {
+ arg=atof(argv[0]);
+ switch (invert) {
+ case 0:
+ printf("%d%c", fontsize(arg), argc > 1 ? ' ' : '\n');
+ break;
+ case 1:
+ sz=stepsize(arg);
+ if (((int)(10*sz))%10==0)
+ printf("%d%c", (int)sz, argc > 1 ? ' ' : '\n');
+ else
+ printf("%f%c", sz, argc > 1 ? ' ' : '\n');
+ }
+ }
+ return 0;
+}
+
+static int
+fontsize(double x)
+{
+ return(DPI*pow(1.2, x) + 0.5);
+}
+
+static double
+stepsize(double x)
+{
+ double s;
+ s=(log(x)-log(DPI))/log(1.2);
+ if (s>=0) return floor(10*s+0.5)/10;
+ return -floor(10*(-s)+0.5)/10;
+}
diff --git a/fonts/utilities/ps2pk/objects.c b/fonts/utilities/ps2pk/objects.c
new file mode 100644
index 0000000000..ba18c9ca7f
--- /dev/null
+++ b/fonts/utilities/ps2pk/objects.c
@@ -0,0 +1,1156 @@
+/* $XConsortium: objects.c,v 1.5 92/03/20 15:56:06 eswu Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* OBJECTS CWEB V0025 ******** */
+/*
+:h1.OBJECTS Module - TYPE1IMAGER Objects Common Routines
+
+This module defines and implements the C structures that represent
+objects in the TYPE1IMAGER. All common routines for manipulating these
+objects are defined in this module. Specific routines for
+specific objects are defined in the modules that deal with that
+object type.
+
+
+&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com)
+
+
+:h3.Include Files
+
+The included files are:
+*/
+#define GLOBALS 1 /* see :hdref refid=debugvar. */
+/*
+The following two includes are C standards; we include them because we
+use 'toupper' and the 'str'-type functions in this module. Potentially
+these may be defined as macros; if these ".h" files do not exist on your
+system it is a pretty safe bet that these are external entry points and
+you do do not need to include these header files.
+*/
+
+#include "types.h"
+#include <string.h>
+#include <ctype.h>
+#include "util.h"
+
+/*
+override incorrect system functions; for example you might define
+a macro for "strcpy" that diverts it to "my_strcpy".
+*/
+
+ /* moved these includes from above the */
+ /* was included first (it contains com- */
+ /* piler defines). dsr 081291 */
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "fonts.h"
+#include "pictures.h"
+#include "strokes.h"
+#include "cluts.h"
+static const char *TypeFmt(int);
+static int ObjectPostMortem(struct xobject *obj);
+
+/*
+:h3.The "pointer" Macro - Define a Generic Pointer
+
+Sadly, many compilers will give a warning message when a pointer to
+one structure is assigned to a pointer to another. We've even seen
+some that give severe errors (when the wrong pointer type is used as
+an initializer or returned from a function). TYPE1IMAGER has routines
+like Dup and Allocate that are perfectly willing to duplicate or
+allocate any of a number of different types of structures. How to
+declare them in a truely portable way?
+
+Well, there is no single good answer that I've found. You can always
+beg the question and "cast" everything. I find this distracting and the
+resulting code ugly. On the other hand, we have found at least one
+compiler that will accept "void *" as a generic pointer that can
+assigned to any other pointer type without error or warning (apparently
+this is also the ANSI standard). So, we define "void *" to be a generic
+pointer. (You might have to change this for your compiler; the "ifndef"
+allows the change to be made on the command line if you want.)
+:i1/portability assumptions/
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Functions Provided to the TYPE1IMAGER User
+
+This module provides the following TYPE1IMAGER entry points:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+Note that entry points that are intended for use external to TYPE1IMAGER
+begin with the characters :q/xi/. Macros are used to make the names
+more mnemonic.
+*/
+
+/*
+:h3.Functions Provided to Other Modules
+
+This module provides the following functions for other modules:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+Note that entry points that intended for use within TYPE1IMAGER, but
+which must be global because they are used across module boundaries,
+begin with the characters :q/I_/. Macros are used to make the names
+more mnemonic.
+
+Entry points totally within a module use mnemonic names and are
+declared :hp2/static/. One of the compilers I used had a bug when
+static functions were passed as addresses. Thus, some functions
+which are logically "static" are not so declared.
+
+Note also the trick of declaring routines, like Consume(), with a
+variable number of arguments. To avoid the restrictions on variable
+numbers of arguments in the macro processor, we just replace the
+text 'Consume' with 'I_Consume'.
+*/
+/*
+:h3.Macros Provided to Other Modules
+
+This is the module where we define all the useful constants like
+TRUE, FALSE, and NULL, and simple expressions like MIN(), MAX(), and ABS().
+We might as well get to it right here:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+Notice that upper case is used for constant values and macro
+definitions. I generally follow that convention.
+
+Many more global macros are defined later in this module.
+*/
+/*
+:h2.Basic TYPE1IMAGER Object Structure
+
+All TYPE1IMAGER objects which are available to the user have a common
+header. This header is defined below:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+The following define is an attempt to centralize the definition of the
+common xobject data shared by structures that are derived from the
+generic xobject structure. For example, the structure font, defined in
+fonts.shr :
+&code.
+ struct font {
+ char type;
+ char flag;
+ int references;
+ ... other data types & structs ...
+ }
+&ecode.
+would now be defined as:
+&code.
+ struct font {
+ XOBJ_COMMON
+ ... other data types & structs ...
+ }
+&ecode.
+Thus we have a better-structured inheritance mechanism. 3-26-91 PNM
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Object Type Definitions
+
+These constants define the values which go in the 'type' field of
+an TYPE1IMAGER object structure:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Flag Byte Definitions
+
+Many programmers define flag bits as a mask (for example, 0x04), and
+test, set, and reset them as follows:
+
+&code.
+ if ((flag & PERMANENT) != 0)
+
+ flag |= PERMANENT;
+ flag &= &inv.PERMANENT;
+:exmp.
+
+I favor a style where the 'if' statement can ask a question:
+
+&code.
+ if (ISPERMANENT(flag))
+
+ flag |= ISPERMANENT(ON);
+ flag &= &inv.ISPERMANENT(ON);
+
+:exmp.
+This said, we now define two bit settings of the flag byte of the
+object. "ISPERMANENT" will be set by the user, when he calls
+Permanent(). "ISIMMORTAL" will be used for compiled-in objects
+that we don't want the user to ever destroy.
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+Flag bit definitions that apply to all objects are assigned
+starting with the least significant (0x01) bit. Flag bit definitions
+specific to a certain object type are assigned starting with the
+most significant (0x80) bit. We hope they never meet.
+*/
+/*
+:h3 id=preserve.PRESERVE() Macro
+
+Occasionally an TYPE1IMAGER operator is implemented by calling other
+TYPE1IMAGER operators. For example, Arc2() calls Conic(). When we
+call more than one operator as a subroutine, we have to be careful
+of temporary objects. A temporary object will be consumed by the
+subroutine operator and then is no longer available for the caller.
+This can be prevented simply by bumping a temporary object's reference
+count.
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.RefRoll() Macro to Detect References Count Rollover
+
+The following macro is designed to check for reference count rollover.
+A return value of TRUE means rollover has not occurred; a return value
+of FALSE means we cannot increment the reference count. Note also that
+those functions that use this macro must decrement the reference count
+afterwards. 3-26-91 PNM
+*/
+
+#define RefRoll(obj) (++(obj)->references > 0)
+
+/*
+:h2.TYPE1IMAGER Object Functions
+
+:h3.INT32COPY() - Macro to Copy "long" Aligned Data
+
+Copying arbitrary bytes in C is a bit of a problem. "strcpy" can't be
+used, because 0 bytes are special-cased. Most environments have a
+routine "memcopy" or "bcopy" or "bytecopy" that copies memory containing
+zero bytes. Sadly, there is no standard on the name of such a routine,
+which makes it impossible to write truely portable code to use it.
+
+It turns out that TYPE1IMAGER, when it wants to copy data, frequently
+knows that both the source and destination are aligned on "long"
+boundaries. This allows us to copy by using "long *" pointers. This
+is usually very efficient on almost all processors. Frequently, it
+is more efficient than using general-purpose assembly language routines.
+So, we define a macro to do this in a portable way. "dest" and "source"
+must be long-aligned, and "bytes" must be a multiple of "sizeof(long)":
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Allocate() - Allocating a Memory Block
+
+Allocate returns a pointer to memory object that is a copy of
+the template passed (if any). In addition, extra bytes may be
+allocated contiguously with the object. (This may be useful for
+variable size objects such as edge lists. See :hdref refid=regions..)
+
+Allocate() always returns a non-immortal object, even if the template is
+immortal. Therefore a non-NULL template must have a "flag" byte.
+
+If the template is NULL, then 'size' bytes are cleared to all NULLs.
+
+If the template is non-NULL, a new object is allocated in memory.
+It therefore seems logical that its reference count field should be
+set to 1. So, a nun-NULL template must also have a "references" field.
+PNM 3-26-91
+*/
+
+struct xobject *t1_Allocate(
+ register int size, /* number of bytes to allocate & initialize */
+ void *p, /* example structure to allocate */
+ register int extra) /* any extra uninitialized bytes needed contiguously */
+{
+/* the actual argument p is one of
+ struct XYspace *
+ struct edgelist *
+ struct hintsegment *
+ struct region *
+ struct segment *
+ struct xobject *
+*/
+ register struct xobject *template = p;
+ register struct xobject *r;
+
+ /*
+ * round up 'size' and 'extra' to be an integer number of 'long's:
+ */
+ size = (size + sizeof(int32_t) - 1) & -sizeof(int32_t);
+ extra = (extra + sizeof(int32_t) - 1) & -sizeof(int32_t);
+ if (size + extra <= 0)
+ t1_abort("Non-positive allocate?");
+ r = (struct xobject *) Xalloc(size + extra);
+
+ while (r == NULL) {
+ if (!GimeSpace()) {
+ IfTrace1(TRUE, "malloc attempted %d bytes.\n",
+ size + extra);
+ t1_abort("We have REALLY run out of memory");
+ }
+ r = (struct xobject *) Xalloc(size + extra);
+ }
+
+ /*
+ * copy the template into the new memory:
+ */
+ if (template != NULL) {
+ /* Added references count decrement if template is not permanent.
+ This is for the case where Allocate is called by a Dupxxxx
+ function, which was in turn called by Unique(). (PNM) */
+ if (!ISPERMANENT(template->flag))
+ --template->references;
+ INT32COPY(r, template, size);
+ r->flag &= ~(ISPERMANENT(ON) | ISIMMORTAL(ON));
+ /* added reference field 3-2-6-91 PNM */
+ r->references = 1;
+ }
+ else {
+ register char **p1;
+
+ for (p1=(char **)r; size > 0; size -= sizeof(char *))
+ *p1++ = NULL;
+ }
+
+ if (MemoryDebug > 1) {
+ register int *L;
+ L = (int *) r;
+ IfTrace4(TRUE, "Allocating at %p: %x %x %x\n",
+ L, L[-1], L[0], L[1]);
+ }
+ return(r);
+}
+
+/*
+:h3.Free() - Frees an Allocated Object
+
+This routine makes a sanity check to make sure the "type" field of the
+standard object structure has not been cleared. If the object is
+not a standard structure, then the macro "NonObjectFree" is available
+that does not perform this check.
+
+In either case, the object must not be the NULL pointer. This preserves
+portability, as the C system Xfree() will not always accept NULL.
+*/
+
+void Free(void *p) /* structure to free */
+{
+/* the actual argument p is one of
+ struct XYspace *
+ struct edgelist *
+ struct region *
+ struct segment *
+ struct xobject *
+*/
+ register struct xobject *obj = p;
+
+ if (obj->type == INVALIDTYPE)
+ t1_abort("Free of already freed object?");
+ obj->type = INVALIDTYPE;
+
+ if (MemoryDebug > 1) {
+ register int *L;
+ L = (int *) obj;
+ IfTrace4(TRUE,"Freeing at %p: %x %x %x\n", L, L[-1], L[0], L[1]);
+ }
+
+ Xfree(obj);
+}
+
+/*
+:h3.Permanent() - Makes an Object Permanent
+
+Real simple--just set a flag. Every routine that consumes its objects
+(which is almost every user entry) must check this flag, and not consume
+the object if it is set.
+
+If a temporary object is made permanent, and there is more than one
+reference to it, we must first Copy() it, then set the ISPERMANENT
+flag. Note also that the reference count must be incremented when an
+object is changed from temporary to permanent (see the ISUNIQUE macro).
+
+Note that the purpose of this function is to convert an object into a
+permanent object:
+ If it was permanent to begin with, we do nothing;
+ If it was temporary and unique, we set the PERMANENT flag and increment
+the reference count;
+ If it was temporary and nonunique, we must make a unique Copy(), set
+the PERMANENT flag, and set the reference count to 2. We must also
+decrement the original object's reference count, because what we have
+done is to change one of the old temporary handles to a permanent one.
+3-26-91 PNM
+*/
+
+struct xobject *t1_Permanent(void *p) /* object to be made permanent */
+{
+/* the actual argument p is one of
+ struct segment *
+ struct xobject *
+*/
+ register struct xobject *obj = p;
+
+ IfTrace1((MustTraceCalls),"Permanent(%p)\n", obj);
+
+ if ( (obj != NULL) && ( !(ISPERMANENT(obj->flag)) ) )
+ {
+ /* there is a non-NULL, temporary object to be made permanent.
+ If there are multiple references to this object, first get
+ a new COPY().
+ Note also that we have to decrement the reference count if
+ we do a Copy() here, because we are consuming the temporary
+ argument passed, and returning a unique, permanent one.
+ */
+ if ( obj->references > 1)
+ {
+ obj = Copy(obj);
+ }
+ /* now set the permanent flag, and increment the reference
+ count, since a temporary object has now become permanent. */
+ obj->references++;
+ obj->flag |= ISPERMANENT(ON);
+ }
+ return(obj);
+}
+
+#if 0
+/*
+:h3.Temporary() - Undoes the Effect of "Permanent()"
+
+This simply resets the "ISPERMANENT" flag.
+
+If a permanent object is made temporary, and there is more than one reference
+to it, we must first Copy() it, then reset the ISPERMANENT flag. However,
+if the permanent object has obly one reference, we need only decrement the
+reference count ( and reset the flag).
+
+Note that this function, in the case of a PERMANENT argument, basically
+converts the PERMANENT handle to a TEMPORARY one. Thus, in the case of
+a nonunique, permanent argument passed, we not only make a Copy(),
+we also decrement the reference count, to reflect the fact that we have
+lost a permanent handle and gained a temporary one.
+PNM 3-2-6-91
+*/
+
+struct xobject *xiTemporary(
+ register struct xobject *obj) /* object to be made not permanent */
+{
+ IfTrace1((MustTraceCalls),"Temporary(%p)\n", obj);
+
+ if (obj != NULL) {
+ /* if it's already temporary, there's nothing to do. */
+ if ISPERMANENT(obj->flag)
+ {
+ /* if there are multiple references to this object, get a
+ Copy we can safely alter. Recall that the reference count
+ is incremented for permanent objects.
+ Recall further that Copy returns an object with the
+ same flag state and a reference count of 2 (for PERMANENT
+ objects).
+ Thus, regardless of whether or not we need to copy a
+ permanent object, we still decrement its reference
+ count and reset the flag.
+ */
+ if (obj->references != 2 || ISIMMORTAL(obj->flag))
+ {
+ /* not unique; consume handle, get a temporary Copy! */
+ obj = Copy(obj);
+ }
+ /* else decrement the reference count (since it's going from
+ permanent to temporary) and clear the flag. */
+ else {
+ obj->references--;
+ obj->flag &= ~ISPERMANENT(ON);
+ }
+ }
+ }
+ return(obj);
+}
+#endif
+
+/*
+:h3.Dup() - Duplicate an Object
+
+Dup will increment the reference count of an object, only making a
+Copy() if needed.
+Note that Dup() retains the state of the permanent flag.
+3-26-91 PNM
+*/
+
+
+struct xobject *t1_Dup(
+ register struct xobject *obj) /* object to be duplicated */
+{
+ register char oldflag; /* copy of original object's flag byte */
+
+ IfTrace1((MustTraceCalls),"Dup(%p)\n", obj);
+
+ if (obj == NULL)
+ return(NULL);
+ /* An immortal object must be Copy'ed, so that we get a mortal
+ copy of it, since we try not to destroy immortal objects. */
+ if (ISIMMORTAL(obj->flag))
+ return(Copy(obj));
+
+ /* if incrementing the reference count doesn't cause the count
+ to wrap, simply return the object with the count bumped. Note
+ that the RefRoll macro increments the count to perform the
+ rollover check, so we must decrement the count. */
+ if (RefRoll(obj))
+ return(obj);
+
+ /* that didn't work out, so put the count back and call Copy(). */
+ --obj->references;
+ oldflag = obj->flag;
+ obj = Copy(obj);
+ if (ISPERMANENT(oldflag))
+ obj = Permanent(obj);
+ return(obj);
+}
+
+/*
+:h3.Copy() - Make a New Copy of an Object
+
+This is the generic Copy() where the object type is unknown. There
+are specific Copyxxx functions for known object types.
+
+Copy will create a NEW temporary object, and WILL NOT simply bump the
+reference count.
+
+Sometimes duplicating an object is just as simple as Allocating with it
+as a template. But other objects are complicated linked lists. So, we
+let each module provide us a routine (or macro) that duplicates the
+objects it knows about.
+*/
+
+struct xobject *t1_Copy(
+ register struct xobject *obj) /* object to be Copy'ed */
+{
+ if (obj == NULL)
+ return(NULL);
+
+ if (ISPATHTYPE(obj->type))
+ obj = (struct xobject *) CopyPath((struct segment *)obj);
+ else
+ switch (obj->type) {
+ case SPACETYPE:
+ obj = (struct xobject *) CopySpace((struct XYspace *)obj); break;
+ case FONTTYPE:
+ obj = (struct xobject *) CopyFont(obj); break;
+ case REGIONTYPE:
+ obj = (struct xobject *) CopyRegion((struct region *)obj); break;
+ case PICTURETYPE:
+ obj = (struct xobject *) CopyPicture(obj); break;
+ case LINESTYLETYPE:
+ obj = (struct xobject *) CopyLineStyle(obj); break;
+ case STROKEPATHTYPE:
+ obj = (struct xobject *) CopyStrokePath(obj); break;
+ case CLUTTYPE:
+ obj = (struct xobject *) CopyCLUT(obj); break;
+ default:
+ return(ArgErr("Copy: invalid object", obj, NULL));
+ }
+
+ return(obj);
+}
+
+/*
+:h3.Destroy() - Destroys an Object
+
+This can get complicated. Just like with Copy(), we let the experts
+handle it.
+*/
+struct xobject *Destroy(void *p) /* object to be destroyed */
+{
+/* the actual argument p is one of
+ struct region *
+ struct segment *
+ struct xobject *
+*/
+ register struct xobject *obj = p;
+
+ IfTrace1((MustTraceCalls),"Destroy(%p)\n", obj);
+
+ if (obj == NULL)
+ return(NULL);
+ if (ISIMMORTAL(obj->flag)) {
+ IfTrace1(TRUE,"Destroy of immortal object %p ignored\n", obj);
+ return(NULL);
+ }
+ if (ISPATHTYPE(obj->type))
+ KillPath((struct segment *)obj);
+ else {
+ switch (obj->type) {
+ case REGIONTYPE:
+ KillRegion((struct region *)obj);
+ break;
+ case SPACETYPE:
+ KillSpace(obj);
+ break;
+ case LINESTYLETYPE:
+ KillLineStyle(obj);
+ break;
+ case FONTTYPE:
+ KillFont(obj);
+ break;
+ case PICTURETYPE:
+ KillPicture(obj);
+ break;
+ case STROKEPATHTYPE:
+ KillStrokePath(obj);
+ break;
+ case CLUTTYPE:
+ KillCLUT(obj);
+ break;
+ default:
+ return(ArgErr("Destroy: invalid object", obj, NULL));
+ }
+ }
+ return(NULL);
+}
+/*
+:h2.Generally Useful Macros
+
+:h3.FOLLOWING() - Macro to Point to the Data Following a Structure
+
+There are several places in TYPE1IMAGER where we will allocate variable
+data that belongs to a structure immediately after that structure.
+This is a performance technique, because it reduces the number of
+trips we have to take through Xalloc() and Xfree(). It turns out C has
+a very convenient way to point past a structure--if 'p' is a pointer
+to a structure, 'p+1' is a pointer to the data after it. This
+behavior of C is somewhat startling and somewhat hard to follow, if
+you are not used to it, so we define a macro to point to the data
+following a structure:
+*/
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.TYPECHECK() - Verify the Type of an Argument
+
+This macro tests the type of an argument. If the test fails, it consumes
+any other arguments as necessary and causes the imbedding routine to
+return the value 'whenBAD'.
+
+Note that the consumeables list should be an argument list itself, for
+example (0) or (2,A,B). See :hdref refid=consume. below.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.ARGCHECK() - Perform an Arbitrary Check on an Argument
+
+This macro is a generalization of TYPECHECK to take an arbitrary
+predicate. If the error occurs (i.e., the predicate is true), the
+arbitrary message 'msg' is returned.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.TYPENULLCHECK() - Extension of TYPECHECK() for NULL arguments
+
+Many routines allow NULLs to be passed as arguments. 'whenBAD' will
+be returned in this case, too.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.MAKECONSUME() - Create a "Consume"-type Macro
+
+Consuming an object means destroying it if it is not permanent. This
+logic is so common to all the routines, that it is immortalized in this
+macro. For example, ConsumePath(p) can be simply defined as
+MAKECONSUME(p,KillPath(p)). In effect, this macro operates on a
+meta-level.
+:i1/consuming objects/
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.MAKEUNIQUE() - Create a "Unique"-type Macro
+
+Many routines are written to modify their arguments in place. Thus,
+they want to insure that they duplicate an object if it is permanent.
+This is called making an object "unique". For example, UniquePath(p)
+can be simply defined as MAKEUNIQUE(p,DupPath(p)).
+:i1/unique objects/
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+An object is unique (and directly alterable) if there is only one
+reference to it, and it is not permanent (in which case we increment
+the reference count, so we don't have to check the permanent bit).
+3-26-91 PNM
+
+Note the rules for making a unique object:
+&drawing.
+ IF (obj->references = 1) return(obj);
+ ELSE (references > 1)
+ IF (ISPERMANENT(obj->flag)) return(Dupxxx(obj));
+ ELSE (nonunique, temporary object!)
+ obj->references--; return(Dupxxx(obj));
+&edrawing.
+If we must make a Copy of a nonunique, temporary object, we decrement
+reference count of the original object!
+*/
+
+/*
+:h3.Unique() - Make a Unique Object
+
+Here is a generic 'Unique' function if the object type is not known.
+Why didn't we build it with the MAKEUNIQUE macro, you ask? Well, we
+used to, but there is at least one damn compiler in the world that
+raises errors if the types of an "(a) ? b : c" expression do not match.
+Also, when we changed Dup() to retain the permanent/temporary flag, we
+wanted to make sure "Unique" always returned a temporary object.
+
+Note that we cannot use Dup() to create a copy of the object in question,
+because Dup() may simply bump the reference count, and not return a
+unique copy to us. That is why we use t1_Copy().
+
+The purpose of this function is to make sure we have a copy of an object
+that we can safely alter:
+:ol.
+:li.If we have a unique, temporary object, we simply return the argument.
+:li.If we have a nonunique, temporary object, we have to make a new copy
+of it, and decrement the reference count of the original object, to reflect
+the fact that we traded temporary handles.
+:li.If we have a permanent object, we make a temporary copy of it, but
+we do not decrement the reference count of the original permanent object,
+because permanent objects, by definition, are persistent. 3-2-6-91 PNM
+:eol.
+*/
+
+struct xobject *t1_Unique(struct xobject *obj)
+{
+ /* if the original object is not already unique, make a unique
+ copy...Note also that if the object was not permanent, we must
+ consume the old handle! 3-26-91 PNM
+ NOTE : consumption of the old handle moved to Allocate. 4-18-91 */
+ if (!obj || obj->references == 1)
+ return(obj);
+
+ obj = Copy(obj);
+ /* and make sure we return a temporary object ! */
+ if (ISPERMANENT(obj->flag))
+ {
+ obj->flag &= ~ISPERMANENT(ON);
+ obj->references--;
+ }
+ return(obj);
+}
+
+
+/*
+:h2.Initialization, Error, and Debug Routines
+
+:h3 id=debugvar.Declarations for Debug Purposes
+
+We declare all the debug flags here. Some link editors make the not
+unreasonable restriction that only one module may declare and
+initialize global variables; all the rest must declare the variable
+'extern'. This is logical, but is somewhat awkward to implement with
+C include files. We solve the problem by temporarily making the name
+'extern' a null name if GLOBALS is defined. (GLOBALS is only defined
+in this OBJECTS module.) Since 'externs' can't be initialized, we
+have to handle that with #defines too.
+:i1/GLOBALS (&#define.)/
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+static const char *ErrorMessage = NULL;
+
+/*
+:h3.Pragmatics() - Set/Reset Debug Flags
+
+We provide a controlled way for the TYPE1IMAGER user to set and reset
+our debugging and tracing:
+*/
+static void Pragmatics(
+ const char *username, /* name of the flag */
+ int value) /* value to set it to */
+{
+ register char *p; /* temporary loop variable */
+#define NAMESIZE 40
+ char name[NAMESIZE]; /* buffer to store my copy of 'username' */
+
+ if (strlen(username) >= NAMESIZE)
+ t1_abort("Pragmatics name too large");
+ strcpy(name, username);
+ for (p = name; *p != '\0'; p++)
+ *p = toupper((unsigned char)*p);
+
+ if (!strcmp(name, "ALL"))
+ MustTraceCalls = InternalTrace = /* MustCrash = */
+ LineIOTrace = value;
+
+ else if (!strcmp(name, "LINEIOTRACE"))
+ LineIOTrace = value;
+
+ else if (!strcmp(name, "TRACECALLS"))
+ MustTraceCalls = value;
+
+ else if (!strcmp(name, "CHECKARGS"))
+ MustCheckArgs = value;
+
+ else if (!strcmp(name, "PROCESSHINTS"))
+ ProcessHints = value;
+
+ else if (!strcmp(name, "SAVEFONTPATHS"))
+ SaveFontPaths = value;
+
+ else if (!strcmp(name, "CRASTERCOMPRESSIONTYPE"))
+ CRASTERCompressionType = value;
+
+ else if (!strcmp(name, "CRASHONUSERERROR"))
+ MustCrash = value;
+
+ else if (!strcmp(name, "DEBUG"))
+ StrokeDebug = SpaceDebug = PathDebug = ConicDebug = LineDebug =
+ RegionDebug = MemoryDebug = FontDebug =
+ HintDebug = ImageDebug = OffPageDebug = value;
+
+ else if (!strcmp(name, "CONICDEBUG"))
+ ConicDebug = value;
+
+ else if (!strcmp(name, "LINEDEBUG"))
+ LineDebug = value;
+
+ else if (!strcmp(name, "REGIONDEBUG"))
+ RegionDebug = value;
+
+ else if (!strcmp(name, "PATHDEBUG"))
+ PathDebug = value;
+
+ else if (!strcmp(name, "SPACEDEBUG"))
+ SpaceDebug = value;
+
+ else if (!strcmp(name, "STROKEDEBUG"))
+ StrokeDebug = value;
+
+ else if (!strcmp(name, "MEMORYDEBUG"))
+ MemoryDebug = value;
+
+ else if (!strcmp(name, "FONTDEBUG"))
+ FontDebug = value;
+
+ else if (!strcmp(name, "HINTDEBUG"))
+ HintDebug = value;
+
+ else if (!strcmp(name, "IMAGEDEBUG"))
+ ImageDebug = value;
+
+ else if (!strcmp(name, "OFFPAGEDEBUG"))
+ OffPageDebug = value;
+
+#ifdef MC68000
+/*
+The following pragmatics flag turns on or off instruction histograming
+for performance analysis. It is only defined in the Delta card
+environment.
+*/
+ else if (!strcmp(name, "PROFILE")) {
+ if (value)
+ StartProfile();
+ else
+ StopProfile();
+ }
+#endif
+ else if (!strcmp(name, "FLUSHCACHE")) {
+ while (GimeSpace()) { ; }
+ }
+
+ else if (!strcmp(name, "CACHEDCHARS"))
+ CachedChars = (value <= 0) ? 1 : value;
+
+ else if (!strcmp(name, "CACHEDFONTS"))
+ CachedFonts = (value <= 0) ? 1 : value;
+
+ else if (!strcmp(name, "CACHEBLIMIT"))
+ CacheBLimit = value;
+
+ else if (!strcmp(name, "CONTINUITY"))
+ Continuity = value;
+
+
+ else {
+ printf("Pragmatics flag = '%s'\n", name);
+ ArgErr("Pragmatics: flag not known", NULL, NULL);
+ }
+ return;
+}
+
+/*
+:h3.Consume() - Consume a List of Arguments
+
+This general purpose routine is provided in the case where the object
+type(s) to be consumed are unknown or not yet verified, and/or it is
+not known whether the object is permanent.
+
+If the type of the argument is known, it is faster to directly consume
+that type, for example, ConsumeRegion() or ConsumePath(). Furthermore,
+if it is already known that the object is temporary, it is faster to
+just kill it rather than consume it, for example, KillSpace().
+*/
+
+void
+Consume(int n, ...)
+{
+ struct xobject *arg;
+ int i;
+ va_list ap;
+
+ va_start (ap, n);
+ for(i = 0; i < n; i++) {
+ arg = va_arg(ap, struct xobject *);
+ if (arg != NULL && !ISPERMANENT(arg->flag))
+ Destroy(arg);
+ }
+ va_end(ap);
+ return;
+}
+
+/*
+:h3.TypeErr() - Handles "Invalid Object Type" Errors
+*/
+
+struct xobject *TypeErr(
+ const char *name, /* Name of routine (for error message) */
+ void *p, /* Object in error */
+ int expect, /* type expected */
+ void *q) /* object to return to caller */
+{
+/* the actual arguments p and q are one of
+ struct XYspace *
+ struct segment *
+ struct xobject *
+*/
+ struct xobject *obj = p;
+ struct xobject *ret = q;
+
+ static char typemsg[80];
+
+ if (MustCrash)
+ LineIOTrace = TRUE;
+
+ sprintf(typemsg, "Wrong object type in %s; expected %s seen %s\n",
+ name, TypeFmt(expect), TypeFmt(obj->type));
+ IfTrace0(TRUE,typemsg);
+
+ ObjectPostMortem(obj);
+
+ if (MustCrash)
+ t1_abort("Terminating because of CrashOnUserError...");
+ else
+ ErrorMessage = typemsg;
+
+/* changed ISPERMANENT to ret->references > 1 3-26-91 PNM */
+ if (ret != NULL && (ret->references > 1))
+ ret = Dup(ret);
+ return(ret);
+}
+
+/*
+:h4.TypeFmt() - Returns Pointer to English Name of Object Type
+
+This is a subroutine of TypeErr().
+*/
+
+static const char *TypeFmt(
+ int type) /* type field */
+{
+ const char *r;
+
+ if (ISPATHTYPE(type))
+ if (type == TEXTTYPE)
+ r = "path or region (from TextPath)";
+ else
+ r = "path";
+ else {
+ switch (type) {
+ case INVALIDTYPE:
+ r = "INVALID (previously consumed?)";
+ break;
+ case REGIONTYPE:
+ r = "region";
+ break;
+ case SPACETYPE:
+ r = "XYspace";
+ break;
+ case LINESTYLETYPE:
+ r = "linestyle";
+ break;
+ case FONTTYPE:
+ r = "font";
+ break;
+ case PICTURETYPE:
+ r = "picture";
+ break;
+ case STROKEPATHTYPE:
+ r = "path (from StrokePath)";
+ break;
+ default:
+ r = "UNKNOWN";
+ break;
+ }
+ }
+ return(r);
+}
+/*
+:h4.ObjectPostMortem() - Prints as Much as We Can About a Bad Object
+
+This is a subroutine of TypeErr() and ArgErr().
+*/
+
+static int ObjectPostMortem(register struct xobject *obj)
+{
+ Pragmatics("Debug", 10);
+ IfTrace2(TRUE,"Bad object is of %s type %p\n", TypeFmt(obj->type), obj);
+
+ IfTrace0((obj == (struct xobject *) USER),
+ "Suspect that InitImager() was omitted.\n");
+ Pragmatics("Debug", 0);
+
+ /* NOTREACHED? */
+ return 0;
+}
+
+/*
+:h3.ArgErr() - Invalid Argument Passed to a Routine
+
+A common routine to report argument errors. It is usually called
+is returned to the caller in case MustCrash is FALSE and ArgErr
+returns to its caller.
+*/
+
+struct xobject *ArgErr(
+ const char *str, /* description of error */
+ void *p, /* object, if any, that was in error */
+ void *q) /* object returned to caller or NULL */
+{
+/* the actual argument p is one of
+ struct XYspace *
+ struct segment *
+ struct xobject *
+*/
+ struct xobject *obj = p;
+ struct xobject *ret = q;
+
+ if (MustCrash)
+ LineIOTrace = TRUE;
+ IfTrace1(TRUE,"ARGUMENT ERROR-- %s.\n", str);
+ if (obj != NULL)
+ ObjectPostMortem(obj);
+ if (MustCrash)
+ t1_abort("Terminating because of CrashOnUserError...");
+ else
+ ErrorMessage = str;
+ return(ret);
+}
+
+/*
+:h3.t1_abort() - Crash Due to Error
+
+We divide by zero, and if that doesn't work, call exit(), the results of
+which is system dependent (and thus is part of the Hourglass required
+environment).
+*/
+static int test = 0;
+
+/*ARGSUSED*/
+void t1_abort(const char *str)
+{
+ LineIOTrace = TRUE;
+ IfTrace1(TRUE,"\nABORT: reason='%s'\n", str);
+ TraceClose();
+ test = 1/test;
+ exit(99);
+}
+
+/*
+:h3.REAL Miscellaneous Stuff
+
+:h4.ErrorMsg() - Return the User an Error Message
+*/
+
+const char *ErrorMsg(void)
+{
+ register const char *r;
+
+ r = ErrorMessage;
+ ErrorMessage = NULL;
+ return(r);
+}
+
+/*
+:h4.InitImager() - Initialize TYPE1IMAGER
+
+We check that a short is 16 bits and a long 32 bits; we have made
+those assumptions elsewhere in the code. (This is almost a C standard,
+anyway.) Note that TYPE1IMAGER makes no assumptions about the size of an
+'int'!
+:i1/portability assumptions/
+*/
+void InitImager(void)
+{
+
+/* Check to see if we have been using our own malloc. If so,*/
+/* Undef malloc so that we can get to the system call. */
+/* All other calls to malloc are defined to Xalloc. */
+
+ if (sizeof(SHORT) != 2 || sizeof(int32_t) != 4)
+ t1_abort("Fundamental TYPE1IMAGER assumptions invalid in this port");
+ InitSpaces();
+ InitFonts();
+ InitFiles();
+/*
+In some environments, constants and/or exception handling need to be
+*/
+ LibInit();
+}
+/*
+:h4.TermImager() - Terminate TYPE1IMAGER
+
+This only makes sense in a server environment; true TYPE1IMAGER needs do
+nothing.
+*/
+void TermImager(void)
+{
+ return;
+}
+#if 0
+/*
+:h4.reportusage() - A Stub to Get a Clean Link with Portable PMP
+*/
+void reportusage(void)
+{
+ return;
+}
+#endif
diff --git a/fonts/utilities/ps2pk/objects.h b/fonts/utilities/ps2pk/objects.h
new file mode 100644
index 0000000000..790bed9865
--- /dev/null
+++ b/fonts/utilities/ps2pk/objects.h
@@ -0,0 +1,298 @@
+/* $XConsortium: objects.h,v 1.6 92/03/20 14:35:56 keith Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+/*END SHARED*/
+/*SHARED*/
+
+#ifdef WIN32
+#include <stdio.h>
+#include <stdlib.h>
+#include <kpathsea/kpathsea.h>
+#endif
+
+#include "types.h"
+
+#define Permanent(obj) t1_Permanent(obj)
+#define Destroy(obj) t1_Destroy(obj)
+#define Dup(obj) t1_Dup(obj)
+#define InitImager t1_InitImager
+#define TermImager t1_TermImager
+#define ErrorMsg t1_ErrorMsg
+
+struct xobject *t1_Permanent(void *); /* make an object permanent */
+struct xobject *t1_Destroy(void *); /* destroy an object */
+struct xobject *t1_Dup(struct xobject *); /* duplicate an object */
+void t1_InitImager(void); /* initialize TYPE1IMAGER */
+void t1_TermImager(void); /* terminate TYPE1IMAGER */
+const char *t1_ErrorMsg(void); /* return last TYPE1IMAGER error message */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define Allocate(n,t,s) t1_Allocate(n,t,s)
+#define Free(obj) t1_Free(obj)
+#define NonObjectFree(a) Xfree(a)
+#define Consume t1_Consume
+#define ArgErr(s,o,r) t1_ArgErr(s,o,r)
+#define TypeErr(n,o,e,r) t1_TypeErr(n,o,e,r)
+#define Copy(obj) t1_Copy(obj)
+#define Unique(obj) t1_Unique(obj)
+
+void t1_abort(const char *); /* crash; software logic error */
+struct xobject *t1_Allocate(int, void *, int); /* allocate memory */
+void t1_Free(void *); /* free memory */
+struct xobject *t1_Unique(struct xobject *);
+ /* make a unique temporary copy of an object */
+struct xobject *t1_ArgErr(const char *, void *, void *);
+ /* handle argument errors */
+struct xobject *t1_TypeErr(const char *, void *, int, void *);
+ /* handle 'bad type' argument errors */
+void t1_Consume(int, ...); /* consume a variable number of arguments */
+struct xobject *t1_Copy(struct xobject *);
+ /* make a new copy, not reference bump PNM */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ON (~0) /* all bits on */
+#ifndef FALSE
+#define FALSE 0 /* handy zero value */
+#endif
+#ifndef TRUE
+#define TRUE 1 /* handy non-zero value */
+#endif
+
+#ifndef NULL
+#define NULL 0
+/*
+The NULL pointer is system specific. (Most systems, however, use 0.)
+TYPE1IMAGER could have its own NULL, independent of the rest of the system,
+were it not for malloc(). The system call malloc() returns NULL when
+out of memory.
+:i1/portibility assumptions/
+*/
+#endif
+
+#ifdef MAX
+#undef MAX
+#endif
+
+#ifdef MIN
+#undef MIN
+#endif
+
+#ifdef ABS
+#undef ABS
+#endif
+
+#define MIN(a,b) (((a)<(b)) ? a : b)
+#define MAX(a,b) (((a)>(b)) ? a : b)
+#define ABS(a) (((a)>=0)?(a):-(a))
+
+/*END SHARED*/
+/*SHARED*/
+
+struct xobject {
+ char type; /* encoded type of object */
+ unsigned char flag; /* flag byte for temporary object characteristics */
+ short references; /* count of pointers to this object
+ (plus 1 for permanent objects) PNM */
+} ;
+
+/*END SHARED*/
+/*SHARED*/
+
+#define XOBJ_COMMON char type; unsigned char flag; short references;
+
+/*END SHARED*/
+/*SHARED*/
+
+
+#define INVALIDTYPE 0
+#define FONTTYPE 1
+#define REGIONTYPE 3
+#define PICTURETYPE 4
+#define SPACETYPE 5
+#define LINESTYLETYPE 6
+#define EDGETYPE 7
+#define STROKEPATHTYPE 8
+#define CLUTTYPE 9
+
+#define ISPATHTYPE(type) ((type)&0x10) /* all path segments have this bit on */
+#define LINETYPE (0+ISPATHTYPE(ON))
+#define CONICTYPE (1+ISPATHTYPE(ON))
+#define BEZIERTYPE (2+ISPATHTYPE(ON))
+#define HINTTYPE (3+ISPATHTYPE(ON))
+
+#define MOVETYPE (5+ISPATHTYPE(ON))
+#define TEXTTYPE (6+ISPATHTYPE(ON))
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ISPERMANENT(flag) ((flag)&0x01)
+#define ISIMMORTAL(flag) ((flag)&0x02)
+
+/*END SHARED*/
+/*SHARED*/
+
+#define PRESERVE(obj) if (!ISPERMANENT((obj)->flag)) \
+ (obj)->references++;
+
+/*END SHARED*/
+/*SHARED*/
+
+#define INT32COPY(dest,source,bytes) { \
+ register int32_t *p1 = (int32_t *)dest; register int32_t *p2 = (int32_t *)source; \
+ register int count = (bytes) / sizeof(int32_t); \
+ while (--count >= 0) *p1++ = *p2++; }
+
+
+/*END SHARED*/
+/*SHARED*/
+
+#define FOLLOWING(p) ((p)+1)
+
+/*END SHARED*/
+/*SHARED*/
+
+#define TYPECHECK(name, obj, expect, whenBAD, consumables, rettype) { \
+ if (obj->type != expect) { \
+ (Consume)consumables; \
+ return((rettype)TypeErr(name, obj, expect, whenBAD)); \
+ } \
+}
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ARGCHECK(test,msg,obj,whenBAD,consumables,rettype) { \
+ if (test) { \
+ (Consume)consumables; \
+ return((rettype)ArgErr(msg, obj, whenBAD)); \
+ } \
+}
+
+/*END SHARED*/
+/*SHARED*/
+
+/* Changed use of Dup() below to Temporary(Copy()) because Dup() does not
+ necessarily return a Unique Copy anymore! 3-26-91 */
+#define TYPENULLCHECK(name, obj, expect, whenBAD, consumables,rettype) \
+ if (obj == NULL) { \
+ (Consume)consumables; \
+ if (whenBAD != NULL && ISPERMANENT(whenBAD->flag)) \
+ return((rettype)Temporary(Copy(whenBAD))); \
+ else return((rettype)whenBAD); \
+ } else { \
+ if (obj->type != expect) { \
+ (Consume)consumables; \
+ return((rettype)TypeErr(name, obj, expect, whenBAD)); \
+ } \
+ }
+/*END SHARED*/
+/*SHARED*/
+
+#define MAKECONSUME(obj,stmt) { if (!ISPERMANENT(obj->flag)) stmt; }
+
+/*END SHARED*/
+/*SHARED*/
+
+#define MAKEUNIQUE(obj,stmt) ( ( (obj)->references > 1 ) ? stmt : obj )
+
+/*END SHARED*/
+/*SHARED*/
+/* NDW: personally, I want to see status and error messages! */
+#define IfTrace0(condition,model) \
+ {if (condition) printf("%s",model);}
+#define IfTrace1(condition,model,arg0) \
+ {if (condition) printf(model,arg0);}
+#define IfTrace2(condition,model,arg0,arg1) \
+ {if (condition) printf(model,arg0,arg1);}
+#define IfTrace3(condition,model,arg0,arg1,arg2) \
+ {if (condition) printf(model,arg0,arg1,arg2);}
+#define IfTrace4(condition,model,arg0,arg1,arg2,arg3) \
+ {if (condition) printf(model,arg0,arg1,arg2,arg3);}
+#define IfTrace5(condition,model,arg0,arg1,arg2,arg3,arg4) \
+ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4);}
+#define IfTrace6(condition,model,arg0,arg1,arg2,arg3,arg4,arg5) \
+ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4,arg5);}
+/* NDW: patch ends */
+
+void Trace0();
+char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6();
+
+#ifdef GLOBALS
+
+#define extern
+#define INITIALIZED(value) = value
+
+#else
+
+#define INITIALIZED(value)
+
+#endif
+
+extern char MustCheckArgs INITIALIZED(TRUE);
+extern char MustTraceCalls INITIALIZED(FALSE);
+extern char MustCrash INITIALIZED(TRUE);
+extern char InternalTrace INITIALIZED(TRUE);
+extern char LineIOTrace INITIALIZED(TRUE);
+
+extern char ProcessHints INITIALIZED(TRUE);
+
+extern char SaveFontPaths INITIALIZED(TRUE);
+
+extern short CRASTERCompressionType INITIALIZED(1);
+
+extern char ConicDebug INITIALIZED(0);
+extern char LineDebug INITIALIZED(0);
+extern char RegionDebug INITIALIZED(0);
+extern char PathDebug INITIALIZED(0);
+extern char FontDebug INITIALIZED(0);
+extern char SpaceDebug INITIALIZED(0);
+extern char StrokeDebug INITIALIZED(0);
+extern char MemoryDebug INITIALIZED(0);
+extern char HintDebug INITIALIZED(0);
+extern char ImageDebug INITIALIZED(0);
+extern char OffPageDebug INITIALIZED(0);
+
+extern short CachedChars INITIALIZED(0x7FFF);
+extern short CachedFonts INITIALIZED(0x7FFF);
+extern int CacheBLimit INITIALIZED(12500);
+extern char Continuity INITIALIZED(2);
+
+#ifdef extern
+#undef extern
+#endif
+
+extern void Xfree(void*);
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/paths.c b/fonts/utilities/ps2pk/paths.c
new file mode 100644
index 0000000000..fc7cb511cb
--- /dev/null
+++ b/fonts/utilities/ps2pk/paths.c
@@ -0,0 +1,1395 @@
+/* $XConsortium: paths.c,v 1.4 91/10/10 11:18:40 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* PATHS CWEB V0021 ******** */
+/*
+:h1 id=paths.PATHS Module - Path Operator Handler
+
+This is the module that is responsible for building and transforming
+path lists.
+
+&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com)
+
+
+:h3.Include Files
+
+The included files are:
+*/
+
+ /* after the system includes (dsr) */
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h" /* understands about Union */
+#include "fonts.h" /* understands about TEXTTYPEs */
+#include "pictures.h" /* understands about handles */
+#include "strokes.h" /* understands how to coerce stroke paths */
+
+static void UnClose(struct segment *);
+
+/*
+:h3.Routines Available to the TYPE1IMAGER User
+
+The PATHS routines that are made available to the outside user are:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Functions Provided to Other Modules
+
+The path routines that are made available to other TYPE1IMAGER modules
+are defined here:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+NOTE: because of the casts put in the macros for Loc, ArcCA, Conic,
+RoundConic, PathSegment, and JoinSegment, we cannot use the macro names
+when the functions are actually defined. We have to use the unique
+names with their unique first two characters. Thus, if anyone in the
+future ever decided to change the first two characters, it would not be
+enough just to change the macro (as it would for most other functions).
+He would have to also change the function definition.
+*/
+/*
+:h3.Macros Provided to Other Modules
+
+The CONCAT macro is defined here and used in the STROKES module. See
+:hdref refid=pathmac..
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h2.Path Segment Structures
+
+A path is represented as a linked list of the following structure:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+When 'link' is NULL, we are at the last segment in the path (surprise!).
+
+'last' is only non-NULL on the first segment of a path,
+for all the other segments 'last' == NULL. We test for a non-NULL
+'last' (ISPATHANCHOR predicate) when we are given an alleged path
+to make sure the user is not trying to pull a fast one on us.
+
+A path may be a collection of disjoint paths. Every break in the
+disjoint path is represented by a MOVETYPE segment.
+
+Closed paths are discussed in :hdref refid=close..
+
+:h3.CopyPath() - Physically Duplicating a Path
+
+This simple function illustrates moving through the path linked list.
+Duplicating a segment just involves making a copy of it, except for
+text, which has some auxilliary things involved. We don't feel
+competent to duplicate text in this module, so we call someone who
+knows how (in the FONTS module).
+*/
+struct segment *CopyPath(
+ register struct segment *p0) /* path to duplicate */
+{
+ register struct segment *p,*n,*last,*anchor;
+
+ for (p = p0, anchor = NULL; p != NULL; p = p->link) {
+
+ ARGCHECK((!ISPATHTYPE(p->type) || (p != p0 && p->last != NULL)),
+ "CopyPath: invalid segment", p, NULL, (0), struct segment *);
+
+ if (p->type == TEXTTYPE)
+ n = (struct segment *) CopyText(p);
+ else
+ n = (struct segment *)Allocate(p->size, p, 0);
+ n->last = NULL;
+ if (anchor == NULL)
+ anchor = n;
+ else
+ last->link = n;
+ last = n;
+ }
+/*
+At this point we have a chain of newly allocated segments hanging off
+'anchor'. We need to make sure the first segment points to the last:
+*/
+ if (anchor != NULL) {
+ n->link = NULL;
+ anchor->last = n;
+ }
+
+ return(anchor);
+}
+/*
+:h3.KillPath() - Destroying a Path
+
+Destroying a path is simply a matter of freeing each segment in the
+linked list. Again, we let the experts handle text.
+*/
+void KillPath(
+ register struct segment *p) /* path to destroy */
+{
+ register struct segment *linkp; /* temp register holding next segment*/
+
+ /* return conditional based on reference count 3-26-91 PNM */
+ if ( (--(p->references) > 1) ||
+ ( (p->references == 1) && !ISPERMANENT(p->flag) ) )
+ return;
+
+ while (p != NULL) {
+ if (!ISPATHTYPE(p->type)) {
+ ArgErr("KillPath: bad segment", p, NULL);
+ return;
+ }
+ linkp = p->link;
+ if (p->type == TEXTTYPE)
+ KillText(p);
+ else
+ Free(p);
+ p = linkp;
+ }
+}
+
+/*
+:h2 id=location."location" Objects
+
+The TYPE1IMAGER user creates and destroys objects of type "location". These
+objects locate points for the primitive path operators. We play a trick
+here and store these objects in the same "segment" structure used for
+paths, with a type field == MOVETYPE.
+
+This allows the Line() operator, for example, to be very trivial:
+It merely stamps its input structure as a LINETYPE and returns it to the
+caller--assuming, of course, the input structure was not permanent (as
+it usually isn't).
+
+:h3.The "movesegment" Template Structure
+
+This template is used as a generic segment structure for Allocate:
+*/
+
+/* added reference field 1 to temporary template below 3-26-91 PNM */
+static struct segment movetemplate = { MOVETYPE, 0, 1, sizeof(struct segment), 0,
+ NULL, NULL, { 0, 0 } };
+/*
+:h3.Loc() - Create an "Invisible Line" Between (0,0) and a Point
+
+*/
+
+struct segment *t1_Loc(
+ register struct XYspace *S, /* coordinate space to interpret X,Y */
+ DOUBLE x, DOUBLE y) /* destination point */
+{
+ register struct segment *r;
+
+
+ IfTrace3((MustTraceCalls),"..Loc(S=%p, x=%f, y=%f)\n", S, x, y);
+
+ r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0);
+ TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *);
+
+ r->last = r;
+ r->context = S->context;
+ (*S->convert)(&r->dest, S, x, y);
+ ConsumeSpace(S);
+ return(r);
+}
+/*
+:h3.ILoc() - Loc() With Integer Arguments
+
+*/
+struct segment *ILoc(
+ register struct XYspace *S, /* coordinate space to interpret X,Y */
+ register int x, register int y) /* destination point */
+{
+ register struct segment *r;
+
+ IfTrace3((MustTraceCalls),"..ILoc(S=%p, x=%d, y=%d)\n",
+ S, (int32_t) x, (int32_t) y);
+ r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0);
+ TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *);
+
+ r->last = r;
+ r->context = S->context;
+ (*S->iconvert)(&r->dest, S, (int32_t) x, (int32_t) y);
+ ConsumeSpace(S);
+ return(r);
+}
+
+/*
+:h2.Straight Line Segments
+
+:h3.PathSegment() - Create a Generic Path Segment
+
+Many routines need a LINETYPE or MOVETYPE path segment, but do not
+want to go through the external user's interface, because, for example,
+they already know the "fractpel" destination of the segment and the
+conversion is unnecessary. PathSegment() is an internal routine
+provided to the rest of TYPE1IMAGER for handling these cases.
+*/
+
+struct segment *t1_PathSegment(
+ int type, /* LINETYPE or MOVETYPE */
+ fractpel x, fractpel y) /* where to go to, if known */
+{
+ register struct segment *r; /* newly created segment */
+
+ r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0);
+ r->type = type;
+ r->last = r; /* last points to itself for singleton */
+ r->dest.x = x;
+ r->dest.y = y;
+ return(r);
+}
+/*
+:h3.Line() - Create a Line Segment Between (0,0) and a Point P
+
+This involves just creating and filling out a segment structure:
+*/
+struct segment *Line(
+ register struct segment *P) /* relevant coordinate space */
+{
+
+ IfTrace1((MustTraceCalls),"..Line(%p)\n", P);
+ ARGCHECK(!ISLOCATION(P), "Line: arg not a location", P, NULL, (0), struct segment *);
+
+ P = UniquePath(P);
+ P->type = LINETYPE;
+ return(P);
+}
+/*
+:h2.Curved Path Segments
+
+We need more points to describe curves. So, the structures for curved
+path segments are slightly different. The first part is identical;
+the curved structures are larger with the extra points on the end.
+
+:h3.Bezier Segment Structure
+
+We support third order Bezier curves. They are specified with four
+control points A, B, C, and D. The curve starts at A with slope AB
+and ends at D with slope CD. The curvature at the point A is inversely
+related to the length |AB|, and the curvature at the point D is
+inversely related to the length |CD|. Point A is always point (0,0).
+
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Bezier() - Generate a Bezier Segment
+
+This is just a simple matter of filling out a 'beziersegment' structure:
+*/
+
+struct beziersegment *Bezier(
+ register struct segment *B, /* second control point */
+ register struct segment *C, /* third control point */
+ register struct segment *D) /* fourth control point (ending point) */
+{
+/* added reference field of 1 to temporary template below 3-26-91 PNM */
+ static struct beziersegment template =
+ { BEZIERTYPE, 0, 1, sizeof(struct beziersegment), 0,
+ NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 } };
+
+ register struct beziersegment *r; /* output segment */
+
+ IfTrace3((MustTraceCalls),"..Bezier(%p, %p, %p)\n", B, C, D);
+ ARGCHECK(!ISLOCATION(B), "Bezier: bad B", B, NULL, (2,C,D), struct beziersegment *);
+ ARGCHECK(!ISLOCATION(C), "Bezier: bad C", C, NULL, (2,B,D), struct beziersegment *);
+ ARGCHECK(!ISLOCATION(D), "Bezier: bad D", D, NULL, (2,B,C), struct beziersegment *);
+
+ r = (struct beziersegment *)Allocate(sizeof(struct beziersegment), &template, 0);
+ r->last = (struct segment *) r;
+ r->dest.x = D->dest.x;
+ r->dest.y = D->dest.y;
+ r->B.x = B->dest.x;
+ r->B.y = B->dest.y;
+ r->C.x = C->dest.x;
+ r->C.y = C->dest.y;
+
+ ConsumePath(B);
+ ConsumePath(C);
+ ConsumePath(D);
+ return(r);
+}
+
+/*
+:h2.Font "Hint" Segments
+
+:h3.Hint() - A Font 'Hint' Segment
+
+This is temporary code while we experiment with hints.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+struct hintsegment *Hint(
+ struct XYspace *S,
+ float ref,
+ float width,
+ char orientation,
+ char hinttype,
+ char adjusttype,
+ char direction,
+ int label)
+{
+/* added reference field of 1 to hintsegment template below 3-26-91 PNM */
+ static struct hintsegment template = { HINTTYPE, 0, 1, sizeof(struct hintsegment), 0,
+ NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ ' ', ' ', ' ', ' ', 0};
+
+ register struct hintsegment *r;
+
+ r = (struct hintsegment *)Allocate(sizeof(struct hintsegment), &template, 0);
+
+ r->orientation = orientation;
+ if (width == 0.0) width = 1.0;
+
+ if (orientation == 'h') {
+ (*S->convert)(&r->ref, S, 0.0, ref);
+ (*S->convert)(&r->width, S, 0.0, width);
+ }
+ else if (orientation == 'v') {
+ (*S->convert)(&r->ref, S, ref, 0.0);
+ (*S->convert)(&r->width, S, width, 0.0);
+ }
+ else
+ return((struct hintsegment *)ArgErr("Hint: orient not 'h' or 'v'", NULL, NULL));
+ if (r->width.x < 0) r->width.x = - r->width.x;
+ if (r->width.y < 0) r->width.y = - r->width.y;
+ r->hinttype = hinttype;
+ r->adjusttype = adjusttype;
+ r->direction = direction;
+ r->label = label;
+ r->last = (struct segment *) r;
+ ConsumeSpace(S);
+ return(r);
+}
+
+/*
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+POP removes the first segment in a path 'p' and Frees it. 'p' is left
+pointing to the end of the path:
+*/
+#define POP(p) \
+ { register struct segment *linkp; \
+ linkp = p->link; \
+ if (linkp != NULL) \
+ linkp->last = p->last; \
+ Free(p); \
+ p = linkp; }
+/*
+INSERT inserts a single segment in the middle of a chain. 'b' is
+the segment before, 'p' the segment to be inserted, and 'a' the
+segment after.
+*/
+#define INSERT(b,p,a) b->link=p; p->link=a; p->last=NULL
+
+/*
+:h3.Join() - Join Two Objects Together
+
+If these are paths, this operator simply invokes the CONCAT macro.
+Why so much code then, you ask? Well we have to check for object
+types other than paths, and also check for certain path consistency
+rules.
+*/
+
+struct segment *Join(
+ register struct segment *p1, register struct segment *p2)
+{
+ IfTrace2((MustTraceCalls),"..Join(%p, %p)\n", p1, p2);
+/*
+We start with a whole bunch of very straightforward argument tests:
+*/
+ if (p2 != NULL) {
+ if (!ISPATHTYPE(p2->type)) {
+
+ if (p1 == NULL)
+ return((struct segment *)Unique((struct xobject *)p2));
+
+ switch (p1->type) {
+
+ case REGIONTYPE:
+
+ case STROKEPATHTYPE:
+ p1 = CoercePath(p1);
+ break;
+
+ default:
+ return((struct segment *)BegHandle(p1, p2));
+ }
+ }
+
+ ARGCHECK((p2->last == NULL), "Join: right arg not anchor", p2, NULL, (1,p1), struct segment *);
+ p2 = UniquePath(p2);
+
+/*
+In certain circumstances, we don't have to duplicate a permanent
+location. (We would just end up destroying it anyway). These cases
+are when 'p2' begins with a move-type segment:
+*/
+ if (p2->type == TEXTTYPE || p2->type == MOVETYPE) {
+ if (p1 == NULL)
+ return(p2);
+ if (ISLOCATION(p1)) {
+ p2->dest.x += p1->dest.x;
+ p2->dest.y += p1->dest.y;
+ ConsumePath(p1);
+ return(p2);
+ }
+ }
+ }
+ else
+ return((struct segment *)Unique((struct xobject *)p1));
+
+ if (p1 != NULL) {
+ if (!ISPATHTYPE(p1->type))
+
+ switch (p2->type) {
+
+ case REGIONTYPE:
+
+ case STROKEPATHTYPE:
+ p2 = CoercePath(p2);
+ break;
+
+ default:
+ return((struct segment *)EndHandle(p1, p2));
+ }
+
+ ARGCHECK((p1->last == NULL), "Join: left arg not anchor", p1, NULL, (1,p2), struct segment *);
+ p1 = UniquePath(p1);
+ }
+ else
+ return(p2);
+
+/*
+At this point all the checking is done. We have two temporary non-null
+path types in 'p1' and 'p2'. If p1 ends with a MOVE, and p2 begins with
+a MOVE, we collapse the two MOVEs into one. We enforce the rule that
+there may not be two MOVEs in a row:
+*/
+
+ if (p1->last->type == MOVETYPE && p2->type == MOVETYPE) {
+ p1->last->flag |= p2->flag;
+ p1->last->dest.x += p2->dest.x;
+ p1->last->dest.y += p2->dest.y;
+ POP(p2);
+ if (p2 == NULL)
+ return(p1);
+ }
+/*
+Now we check for another silly rule. If a path has any TEXTTYPEs,
+then it must have only TEXTTYPEs and MOVETYPEs, and furthermore,
+it must begin with a TEXTTYPE. This rule makes it easy to check
+for the special case of text. If necessary, we will coerce
+TEXTTYPEs into paths so we don't mix TEXTTYPEs with normal paths.
+*/
+ if (p1->type == TEXTTYPE) {
+ if (p2->type != TEXTTYPE && !ISLOCATION(p2))
+ p1 = CoerceText(p1);
+ }
+ else {
+ if (p2->type == TEXTTYPE) {
+ if (ISLOCATION(p1)) {
+ p2->dest.x += p1->dest.x;
+ p2->dest.y += p1->dest.y;
+ Free(p1);
+ return(p2);
+ }
+ else
+ p2 = CoerceText(p2);
+ }
+ }
+/*
+Thank God! Finally! It's hard to believe, but we are now able to
+actually do the join. This is just invoking the CONCAT macro:
+*/
+ CONCAT(p1, p2);
+
+ return(p1);
+}
+
+/*
+:h3.JoinSegment() - Create a Path Segment and Join It to a Known Path
+
+This internal function is quicker than a full-fledged join because
+it can do much less checking.
+*/
+
+struct segment *t1_JoinSegment(
+ register struct segment *before, /* path to join before new segment */
+ int type, /* type of new segment (MOVETYPE or LINETYPE) */
+ fractpel x, fractpel y, /* x,y of new segment */
+ register struct segment *after) /* path to join after new segment */
+{
+ register struct segment *r; /* returned path built here */
+
+ r = PathSegment(type, x, y);
+ if (before != NULL) {
+ CONCAT(before, r);
+ r = before;
+ }
+ else
+ r->context = after->context;
+ if (after != NULL)
+ CONCAT(r, after);
+ return(r);
+}
+
+/*
+:h2.Other Path Functions
+
+*/
+
+
+struct segment *t1_ClosePath(
+ register struct segment *p0, /* path to close */
+ register int lastonly) /* flag deciding to close all subpaths or... */
+{
+ register struct segment *p,*last,*start; /* used in looping through path */
+ register fractpel x,y; /* current position in path */
+ register fractpel firstx,firsty; /* start position of sub path */
+ register struct segment *lastnonhint; /* last non-hint segment in path */
+
+ IfTrace1((MustTraceCalls),"ClosePath(%p)\n", p0);
+ if (p0 != NULL && p0->type == TEXTTYPE)
+ return(UniquePath(p0));
+ if (p0->type == STROKEPATHTYPE)
+ return((struct segment *)Unique((struct xobject *)p0));
+ /*
+ * NOTE: a null closed path is different from a null open path
+ * and is denoted by a closed (0,0) move segment. We make
+ * sure this path begins and ends with a MOVETYPE:
+ */
+ if (p0 == NULL || p0->type != MOVETYPE)
+ p0 = JoinSegment(NULL, MOVETYPE, 0, 0, p0);
+ TYPECHECK("ClosePath", p0, MOVETYPE, NULL, (0), struct segment *);
+ if (p0->last->type != MOVETYPE)
+ p0 = JoinSegment(p0, MOVETYPE, 0, 0, NULL);
+
+ p0 = UniquePath(p0);
+
+ lastnonhint = NULL;
+/*
+We now begin a loop through the path,
+incrementing current 'x' and 'y'. We are searching
+for MOVETYPE segments (breaks in the path) that are not already closed.
+At each break, we insert a close segment.
+*/
+ for (p = p0, x = y = 0, start = NULL;
+ p != NULL;
+ x += p->dest.x, y += p->dest.y, last = p, p = p->link) {
+
+ if (p->type == MOVETYPE) {
+ if (start != NULL && (lastonly?p->link==NULL:TRUE) &&
+ !(ISCLOSED(start->flag) && LASTCLOSED(last->flag))) {
+ register struct segment *r; /* newly created */
+
+ start->flag |= ISCLOSED(ON);
+ r = PathSegment(LINETYPE, firstx - x,
+ firsty - y);
+ INSERT(last, r, p);
+ r->flag |= LASTCLOSED(ON);
+ /*< adjust 'last' if possible for a 0,0 close >*/
+
+#define CLOSEFUDGE 3 /* if we are this close, let's change last segment */
+ if (r->dest.x != 0 || r->dest.y != 0) {
+ if (r->dest.x <= CLOSEFUDGE && r->dest.x >= -CLOSEFUDGE
+ && r->dest.y <= CLOSEFUDGE && r->dest.y >= -CLOSEFUDGE) {
+ IfTrace2((PathDebug),
+ "ClosePath forced closed by (%d,%d)\n",
+ r->dest.x, r->dest.y);
+ if (lastnonhint == NULL)
+ t1_abort("unexpected NULL pointer in ClosePath");
+ lastnonhint->dest.x += r->dest.x;
+ lastnonhint->dest.y += r->dest.y;
+ r->dest.x = r->dest.y = 0;
+ }
+ }
+ if (p->link != NULL) {
+ p->dest.x += x - firstx;
+ p->dest.y += y - firsty;
+ x = firstx;
+ y = firsty;
+ }
+ }
+ start = p;
+ firstx = x + p->dest.x;
+ firsty = y + p->dest.y;
+ }
+ else if (p->type != HINTTYPE)
+ lastnonhint = p;
+ }
+ return(p0);
+}
+/*
+*/
+/*
+:h2.Reversing the Direction of a Path
+
+This turned out to be more difficult than I thought at first. The
+trickiness was due to the fact that closed paths must remain closed,
+etc.
+
+We need three subroutines:
+*/
+
+static struct segment *SplitPath(struct segment *, struct segment *); /* break a path at any point */
+static struct segment *DropSubPath(struct segment *); /* breaks a path after first sub-path */
+static struct segment *ReverseSubPath(struct segment *); /* reverses a single sub-path */
+
+/*
+:h3.Reverse() - User Operator to Reverse a Path
+
+This operator reverses the entire path.
+*/
+
+struct segment *Reverse(
+ register struct segment *p) /* full path to reverse */
+{
+ register struct segment *r; /* output path built here */
+ register struct segment *nextp; /* contains next sub-path */
+
+ IfTrace1((MustTraceCalls),"Reverse(%p)\n", p);
+
+ if (p == NULL)
+ return(NULL);
+
+ ARGCHECK(!ISPATHANCHOR(p), "Reverse: invalid path", p, NULL, (0), struct segment *);
+
+ if (p->type == TEXTTYPE)
+ p = CoerceText(p);
+ p = UniquePath(p);
+
+ r = NULL;
+
+ do {
+ nextp = DropSubPath(p);
+ p = ReverseSubPath(p);
+ r = Join(p, r);
+ p = nextp;
+
+ } while (p != NULL);
+
+ return(r);
+}
+
+/*
+:h4.ReverseSubPath() - Subroutine to Reverse a Single Sub-Path
+*/
+
+static struct segment *ReverseSubPath(
+ register struct segment *p) /* input path */
+{
+ register struct segment *r; /* reversed path will be created here */
+ register struct segment *nextp; /* temporary variable used in loop */
+ register int wasclosed; /* flag, path was closed */
+
+ if (p == NULL)
+ return(NULL);
+
+ wasclosed = ISCLOSED(p->flag);
+ r = NULL;
+
+ do {
+/*
+First we reverse the direction of this segment and clean up its flags:
+*/
+ p->dest.x = - p->dest.x; p->dest.y = - p->dest.y;
+ p->flag &= ~(ISCLOSED(ON) | LASTCLOSED(ON));
+
+ switch (p->type) {
+
+ case LINETYPE:
+ case MOVETYPE:
+ break;
+
+ case CONICTYPE:
+ {
+/*
+The logic of this is that the new M point (stored relative to the new
+beginning) is (M - C). However, C ("dest") has already been reversed
+So, we add "dest" instead of subtracting it:
+*/
+ register struct conicsegment *cp = (struct conicsegment *) p;
+
+ cp->M.x += cp->dest.x; cp->M.y += cp->dest.y;
+ }
+ break;
+
+ case BEZIERTYPE:
+ {
+ register struct beziersegment *bp = (struct beziersegment *) p;
+
+ bp->B.x += bp->dest.x; bp->B.y += bp->dest.y;
+ bp->C.x += bp->dest.x; bp->C.y += bp->dest.y;
+ }
+ break;
+
+ case HINTTYPE:
+ {
+ register struct hintsegment *hp = (struct hintsegment *) p;
+
+ hp->ref.x = -hp->ref.x; hp->ref.y = -hp->ref.y;
+ }
+ break;
+
+ default:
+ t1_abort("Reverse: bad path segment");
+ }
+/*
+We need to reverse the order of segments too, so we break this segment
+off of the input path, and tack it on the front of the growing path
+in 'r':
+*/
+ nextp = p->link;
+ p->link = NULL;
+ p->last = p;
+ if (r != NULL)
+ CONCAT(p,r); /* leaves result in 'p'... not what we want */
+ r = p;
+ p = nextp; /* advance to next segment in input path */
+
+ } while (p != NULL);
+
+ if (wasclosed)
+ r = ClosePath(r);
+
+ return(r);
+}
+
+/*
+:h4.DropSubPath() - Drops the First Sub-Path Off a Path
+
+This subroutine returns the remaining sub-path(s). While doing so, it
+breaks the input path after the first sub-path so that a pointer to
+the original path now contains the first sub-path only.
+*/
+
+static struct segment *DropSubPath(
+ register struct segment *p0) /* original path */
+{
+ register struct segment *p; /* returned remainder here */
+
+ for (p = p0; p->link != NULL; p = p->link) {
+ if (p->link->type == MOVETYPE)
+ break;
+ }
+
+ return(SplitPath(p0, p));
+}
+
+static struct segment *SplitPath(
+ register struct segment *anchor,
+ register struct segment *before)
+{
+ register struct segment *r;
+
+ if (before == anchor->last)
+ return(NULL);
+
+ r = before->link;
+ r->last = anchor->last;
+ anchor->last = before;
+ before->link = NULL;
+
+ return(r);
+}
+
+
+/*
+:h3.ReverseSubPaths() - Reverse the Direction of Sub-paths Within a Path
+
+This user operator reverses the sub-paths in a path, but leaves the
+'move' segments unchanged. It builds on top of the subroutines
+already established.
+*/
+
+struct segment *ReverseSubPaths(
+ register struct segment *p) /* input path */
+{
+ register struct segment *r; /* reversed path will be created here */
+ register struct segment *nextp; /* temporary variable used in loop */
+ int wasclosed; /* flag; subpath was closed */
+ register struct segment *nomove; /* the part of sub-path without move segment */
+ struct fractpoint delta;
+
+ IfTrace1((MustTraceCalls),"ReverseSubPaths(%p)\n", p);
+
+ if (p == NULL)
+ return(NULL);
+
+ ARGCHECK(!ISPATHANCHOR(p), "ReverseSubPaths: invalid path", p, NULL, (0), struct segment *);
+
+ if (p->type == TEXTTYPE)
+ p = CoerceText(p);
+ if (p->type != MOVETYPE)
+ p = JoinSegment(NULL, MOVETYPE, 0, 0, p);
+
+ p = UniquePath(p);
+
+ r = NULL;
+
+ for (; p != NULL;) {
+ nextp = DropSubPath(p);
+ wasclosed = ISCLOSED(p->flag);
+ if (wasclosed)
+ UnClose(p);
+
+ nomove = SplitPath(p, p);
+ r = Join(r, p);
+
+ PathDelta(nomove, &delta);
+
+ nomove = ReverseSubPath(nomove);
+ p->dest.x += delta.x;
+ p->dest.y += delta.y;
+ if (nextp != NULL) {
+ nextp->dest.x += delta.x;
+ nextp->dest.y += delta.y;
+ }
+ if (wasclosed) {
+ nomove = ClosePath(nomove);
+ nextp->dest.x -= delta.x;
+ nextp->dest.y -= delta.y;
+ }
+ r = Join(r, nomove);
+ p = nextp;
+
+ }
+
+ return(r);
+}
+
+static void UnClose(register struct segment *p0)
+{
+ register struct segment *p;
+
+ for (p=p0; p->link->link != NULL; p=p->link) { ; }
+
+ if (!LASTCLOSED(p->link->flag))
+ t1_abort("UnClose: no LASTCLOSED");
+
+ Free(SplitPath(p0, p));
+ p0->flag &= ~ISCLOSED(ON);
+}
+
+/*
+:h2.Transforming and Putting Handles on Paths
+
+:h3.PathTransform() - Transform a Path
+
+Transforming a path involves transforming all the points. In order
+that closed paths do not become "unclosed" when their relative
+positions are slightly changed due to loss of arithmetic precision,
+all point transformations are in absolute coordinates.
+
+(It might be better to reset the "absolute" coordinates every time a
+move segment is encountered. This would mean that we could accumulate
+error from subpath to subpath, but we would be less likely to make
+the "big error" where our fixed point arithmetic "wraps". However, I
+think I'll keep it this way until something happens to convince me
+otherwise.)
+
+The transform is described as a "space", that way we can use our
+old friend the "iconvert" function, which should be very efficient.
+*/
+
+struct segment *PathTransform(
+ register struct segment *p0, /* path to transform */
+ register struct XYspace *S) /* pseudo space to transform in */
+{
+ register struct segment *p; /* to loop through path with */
+ register fractpel newx,newy; /* current transformed position in path */
+ register fractpel oldx,oldy; /* current untransformed position in path */
+ register fractpel savex,savey; /* save path delta x,y */
+
+ p0 = UniquePath(p0);
+
+ newx = newy = oldx = oldy = 0;
+
+ for (p=p0; p != NULL; p=p->link) {
+
+ savex = p->dest.x; savey = p->dest.y;
+
+ (*S->iconvert)(&p->dest, S, p->dest.x + oldx, p->dest.y + oldy);
+ p->dest.x -= newx;
+ p->dest.y -= newy;
+
+ switch (p->type) {
+
+ case LINETYPE:
+ case MOVETYPE:
+ break;
+
+ case CONICTYPE:
+ {
+ register struct conicsegment *cp = (struct conicsegment *) p;
+
+ (*S->iconvert)(&cp->M, S, cp->M.x + oldx, cp->M.y + oldy);
+ cp->M.x -= newx;
+ cp->M.y -= newy;
+ /*
+ * Note roundness doesn't change... linear transform
+ */
+ break;
+ }
+
+
+ case BEZIERTYPE:
+ {
+ register struct beziersegment *bp = (struct beziersegment *) p;
+
+ (*S->iconvert)(&bp->B, S, bp->B.x + oldx, bp->B.y + oldy);
+ bp->B.x -= newx;
+ bp->B.y -= newy;
+ (*S->iconvert)(&bp->C, S, bp->C.x + oldx, bp->C.y + oldy);
+ bp->C.x -= newx;
+ bp->C.y -= newy;
+ break;
+ }
+
+ case HINTTYPE:
+ {
+ register struct hintsegment *hp = (struct hintsegment *) p;
+
+ (*S->iconvert)(&hp->ref, S, hp->ref.x + oldx, hp->ref.y + oldy);
+ hp->ref.x -= newx;
+ hp->ref.y -= newy;
+ (*S->iconvert)(&hp->width, S, hp->width.x, hp->width.y);
+ /* Note: width is not relative to origin */
+ break;
+ }
+
+ case TEXTTYPE:
+ {
+ XformText(p,S);
+ break;
+ }
+
+ default:
+ IfTrace1(TRUE,"path = %p\n", p);
+ t1_abort("PathTransform: invalid segment");
+ }
+ oldx += savex;
+ oldy += savey;
+ newx += p->dest.x;
+ newy += p->dest.y;
+ }
+ return(p0);
+}
+
+/*
+:h3.PathDelta() - Return a Path's Ending Point
+*/
+
+void PathDelta(
+ register struct segment *p, /* input path */
+ register struct fractpoint *pt) /* pointer to x,y to set */
+{
+ register fractpel x,y; /* working variables for path current point */
+
+ for (x=y=0; p != NULL; p=p->link) {
+ x += p->dest.x;
+ y += p->dest.y;
+#if 0 /* fonts.h defines TextDelta as empty, thus mypoint is not initialized */
+ if (p->type == TEXTTYPE) {
+ struct fractpoint mypoint;
+
+ TextDelta(p, &mypoint);
+ x += mypoint.x;
+ y += mypoint.y;
+ }
+#endif
+ }
+
+ pt->x = x;
+ pt->y = y;
+}
+
+/*
+:h3.BoundingBox() - Produce a Bounding Box Path
+
+This function is called by image code, when we know the size of the
+image in pels, and need to get a bounding box path that surrounds it.
+The starting/ending handle is in the lower right hand corner.
+*/
+struct segment *BoundingBox(
+ register pel h, register pel w) /* size of box */
+{
+ register struct segment *path;
+
+ path = PathSegment(LINETYPE, -TOFRACTPEL(w), 0);
+ path = JoinSegment(NULL, LINETYPE, 0, -TOFRACTPEL(h), path);
+ path = JoinSegment(NULL, LINETYPE, TOFRACTPEL(w), 0, path);
+ path = ClosePath(path);
+
+ return(path);
+}
+
+/*
+:h2.Querying Locations and Paths
+
+:h3.QueryLoc() - Return the X,Y of a Locition
+*/
+
+void QueryLoc(
+ register struct segment *P, /* location to query, not consumed */
+ register struct XYspace *S, /* XY space to return coordinates in */
+ register DOUBLE *xP, /* coordinates ... */
+ register DOUBLE *yP) /* ... returned here */
+{
+ IfTrace4((MustTraceCalls),"QueryLoc(P=%p, S=%p, (%p, %p))\n",
+ P, S, xP, yP);
+ if (!ISLOCATION(P)) {
+ ArgErr("QueryLoc: first arg not a location", P, NULL);
+ return;
+ }
+ if (S->type != SPACETYPE) {
+ ArgErr("QueryLoc: second arg not a space", S, NULL);
+ return;
+ }
+ UnConvert(S, &P->dest, xP, yP);
+}
+/*
+:h3.QueryPath() - Find Out the Type of Segment at the Head of a Path
+
+This is a very simple routine that looks at the first segment of a
+path and tells the caller what it is, as well as returning the control
+point(s) of the path segment. Different path segments have different
+number of control points. If the caller knows that the segment is
+a move segment, for example, he only needs to pass pointers to return
+one control point.
+*/
+
+void QueryPath(
+ register struct segment *path, /* path to check */
+ register int *typeP, /* return the type of path here */
+ register struct segment **Bp, /* return location of first point */
+ register struct segment **Cp, /* return location of second point */
+ register struct segment **Dp, /* return location of third point */
+ register DOUBLE *fP) /* return Conic sharpness */
+{
+ register int coerced = FALSE; /* did I coerce a text path? */
+
+ IfTrace3((MustTraceCalls), "QueryPath(%p, %p, %p, ...)\n",
+ path, typeP, Bp);
+ if (path == NULL) {
+ *typeP = -1;
+ return;
+ }
+ if (!ISPATHANCHOR(path)) {
+ ArgErr("QueryPath: arg not a valid path", path, NULL);
+ }
+ if (path->type == TEXTTYPE) {
+ path = CoerceText(path);
+ coerced = TRUE;
+ }
+
+ switch (path->type) {
+
+ case MOVETYPE:
+ *typeP = 0;
+ *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y);
+ break;
+
+ case LINETYPE:
+ *typeP = (LASTCLOSED(path->flag)) ? 4 : 1;
+ *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y);
+ break;
+
+ case CONICTYPE:
+ {
+ register struct conicsegment *cp = (struct conicsegment *) path;
+
+ *typeP = 2;
+ *Bp = PathSegment(MOVETYPE, cp->M.x, cp->M.y);
+ *Cp = PathSegment(MOVETYPE, cp->dest.x, cp->dest.y);
+ *fP = cp->roundness;
+ }
+ break;
+
+ case BEZIERTYPE:
+ {
+ register struct beziersegment *bp = (struct beziersegment *) path;
+
+ *typeP = 3;
+ *Bp = PathSegment(MOVETYPE, bp->B.x, bp->B.y);
+ *Cp = PathSegment(MOVETYPE, bp->C.x, bp->C.y);
+ *Dp = PathSegment(MOVETYPE, bp->dest.x, bp->dest.y);
+ }
+ break;
+
+ case HINTTYPE:
+ *typeP = 5;
+ break;
+
+ default:
+ t1_abort("QueryPath: unknown segment");
+ }
+ if (coerced)
+ KillPath(path);
+}
+/*
+:h3.QueryBounds() - Return the Bounding Box of a Path
+
+Returns the bounding box by setting the user's variables.
+*/
+
+void QueryBounds(
+ register struct segment *p0, /* object to check for bound */
+ struct XYspace *S, /* coordinate space of returned values */
+ DOUBLE *xminP, DOUBLE *yminP,
+ /* lower left hand corner (set by routine) */
+ DOUBLE *xmaxP, DOUBLE *ymaxP)
+ /* upper right hand corner (set by routine) */
+{
+ register struct segment *path; /* loop variable for path segments */
+ register fractpel lastx,lasty; /* loop variables: previous endingpoint */
+ register fractpel x,y; /* loop variables: current ending point */
+ struct fractpoint min; /* registers to keep lower left hand corner */
+ struct fractpoint max; /* registers to keep upper right hand corner */
+ int coerced = FALSE; /* we have coerced the path from another object */
+ DOUBLE x1,y1,x2,y2,x3,y3,x4,y4; /* corners of rectangle in space X */
+
+ IfTrace2((MustTraceCalls), "QueryBounds(%p, %p,", p0, S);
+ IfTrace4((MustTraceCalls), " %p, %p, %p, %p)\n",
+ xminP, yminP, xmaxP, ymaxP);
+ if (S->type != SPACETYPE) {
+ ArgErr("QueryBounds: bad XYspace", S, NULL);
+ return;
+ }
+
+ min.x = min.y = max.x = max.y = 0;
+ if (p0 != NULL) {
+ if (!ISPATHANCHOR(p0)) {
+ switch(p0->type) {
+ case STROKEPATHTYPE:
+ /* replaced DupStrokePath() with Dup() 3-26-91 PNM */
+ p0 = (struct segment *) DoStroke(Dup((struct xobject *)p0));
+ /* no break here, we have a region in p0 */
+ case REGIONTYPE:
+ p0 = RegionBounds((struct region *)p0);
+ break;
+
+ case PICTURETYPE:
+ p0 = PictureBounds(p0);
+ break;
+
+ default:
+ ArgErr("QueryBounds: bad object", p0, NULL);
+ return;
+ }
+ coerced = TRUE;
+ }
+ if (p0->type == TEXTTYPE) {
+ /* replaced CopyPath() with Dup() 3-26-91 PNM */
+ p0 = (struct segment *)CoerceText(Dup((struct xobject *)p0)); /* there are faster ways */
+ coerced = TRUE;
+ }
+ if (p0->type == MOVETYPE) {
+ min.x = max.x = p0->dest.x;
+ min.y = max.y = p0->dest.y;
+ }
+ }
+ lastx = lasty = 0;
+
+ for (path = p0; path != NULL; path = path->link) {
+
+ x = lastx + path->dest.x;
+ y = lasty + path->dest.y;
+
+ switch (path->type) {
+
+ case LINETYPE:
+ break;
+
+ case CONICTYPE:
+ {
+ register struct conicsegment *cp = (struct conicsegment *) path;
+ register fractpel Mx = lastx + cp->M.x;
+ register fractpel My = lasty + cp->M.y;
+ register fractpel deltax = 0.5 * cp->roundness * cp->dest.x;
+ register fractpel deltay = 0.5 * cp->roundness * cp->dest.y;
+ register fractpel Px = Mx - deltax;
+ register fractpel Py = My - deltay;
+ register fractpel Qx = Mx + deltax;
+ register fractpel Qy = My + deltay;
+
+
+ if (Mx < min.x) min.x = Mx;
+ else if (Mx > max.x) max.x = Mx;
+ if (My < min.y) min.y = My;
+ else if (My > max.y) max.y = My;
+
+ if (Px < min.x) min.x = Px;
+ else if (Px > max.x) max.x = Px;
+ if (Py < min.y) min.y = Py;
+ else if (Py > max.y) max.y = Py;
+
+ if (Qx < min.x) min.x = Qx;
+ else if (Qx > max.x) max.x = Qx;
+ if (Qy < min.y) min.y = Qy;
+ else if (Qy > max.y) max.y = Qy;
+ }
+ break;
+
+
+ case MOVETYPE:
+ /*
+ * We can't risk adding trailing Moves to the
+ * bounding box:
+ */
+ if (path->link == NULL)
+ goto done; /* God forgive me */
+ break;
+
+ case BEZIERTYPE:
+ {
+ register struct beziersegment *bp = (struct beziersegment *) path;
+ register fractpel Bx = lastx + bp->B.x;
+ register fractpel By = lasty + bp->B.y;
+ register fractpel Cx = lastx + bp->C.x;
+ register fractpel Cy = lasty + bp->C.y;
+
+ if (Bx < min.x) min.x = Bx;
+ else if (Bx > max.x) max.x = Bx;
+ if (By < min.y) min.y = By;
+ else if (By > max.y) max.y = By;
+
+ if (Cx < min.x) min.x = Cx;
+ else if (Cx > max.x) max.x = Cx;
+ if (Cy < min.y) min.y = Cy;
+ else if (Cy > max.y) max.y = Cy;
+ }
+ break;
+
+ case HINTTYPE:
+ break;
+ default:
+ t1_abort("QueryBounds: unknown type");
+ }
+
+ if (x < min.x) min.x = x;
+ else if (x > max.x) max.x = x;
+ if (y < min.y) min.y = y;
+ else if (y > max.y) max.y = y;
+
+ lastx = x; lasty = y;
+ }
+done:
+ UnConvert(S, &min, &x1, &y1);
+ UnConvert(S, &max, &x4, &y4);
+ x = min.x; min.x = max.x; max.x = x;
+ UnConvert(S, &min, &x2, &y2);
+ UnConvert(S, &max, &x3, &y3);
+
+ *xminP = *xmaxP = x1;
+ if (x2 < *xminP) *xminP = x2;
+ else if (x2 > *xmaxP) *xmaxP = x2;
+ if (x3 < *xminP) *xminP = x3;
+ else if (x3 > *xmaxP) *xmaxP = x3;
+ if (x4 < *xminP) *xminP = x4;
+ else if (x4 > *xmaxP) *xmaxP = x4;
+
+ *yminP = *ymaxP = y1;
+ if (y2 < *yminP) *yminP = y2;
+ else if (y2 > *ymaxP) *ymaxP = y2;
+ if (y3 < *yminP) *yminP = y3;
+ else if (y3 > *ymaxP) *ymaxP = y3;
+ if (y4 < *yminP) *yminP = y4;
+ else if (y4 > *ymaxP) *ymaxP = y4;
+
+ if (coerced)
+ Destroy(p0);
+}
+/*
+:h3.BoxPath()
+*/
+struct segment *BoxPath(struct XYspace *S, int h, int w)
+{
+ struct segment *path;
+
+ path = Join( Line(ILoc(S, w, 0)), Line(ILoc(S, 0, h)) );
+ path = JoinSegment(path, LINETYPE, -path->dest.x, -path->dest.y, NULL);
+ return(ClosePath(path));
+}
+
+/*
+:h3.DropSegment() - Drop the First Segment in a Path
+
+This routine takes the path and returns a new path that is one segment
+shorter. It can be used in conjunction with QueryPath(), for example,
+to ask about an entire path.
+*/
+
+struct segment *DropSegment(register struct segment *path)
+{
+ IfTrace1((MustTraceCalls),"DropSegment(%p)\n", path);
+ if (path != NULL && path->type == STROKEPATHTYPE)
+ path = CoercePath(path);
+ ARGCHECK((path == NULL || !ISPATHANCHOR(path)),
+ "DropSegment: arg not a non-null path", path, path, (0), struct segment *);
+ if (path->type == TEXTTYPE)
+ path = CoerceText(path);
+ path = UniquePath(path);
+
+ POP(path);
+ return(path);
+}
+/*
+:h3.HeadSegment() - Return the First Segment in a Path
+
+This routine takes the path and returns a new path consists of the
+first segment only.
+*/
+
+struct segment *HeadSegment(
+ register struct segment *path) /* input path */
+{
+ IfTrace1((MustTraceCalls),"HeadSegment(%p)\n", path);
+ if (path == NULL)
+ return(NULL);
+ if (path->type == STROKEPATHTYPE)
+ path = CoercePath(path);
+ ARGCHECK(!ISPATHANCHOR(path), "HeadSegment: arg not a path", path, path, (0), struct segment *);
+ if (path->type == TEXTTYPE)
+ path = CoerceText(path);
+ path = UniquePath(path);
+
+ if (path->link != NULL)
+ KillPath(path->link);
+ path->link = NULL;
+ path->last = path;
+ return(path);
+}
diff --git a/fonts/utilities/ps2pk/paths.h b/fonts/utilities/ps2pk/paths.h
new file mode 100644
index 0000000000..f16fd55136
--- /dev/null
+++ b/fonts/utilities/ps2pk/paths.h
@@ -0,0 +1,220 @@
+/* $XConsortium: paths.h,v 1.2 91/10/10 11:18:50 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+#include "types.h"
+
+#define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y)
+#define ILoc(S,x,y) t1_ILoc(S,x,y)
+#define Line(P) t1_Line(P)
+#define Join(p1,p2) t1_Join(p1,p2)
+#define ClosePath(p) t1_ClosePath(p,0)
+#define CloseLastSubPath(p) t1_ClosePath(p,1)
+#define Conic(B,C,s) t1_Conic(B,C,(DOUBLE)s)
+#define RoundConic(M,C,r) t1_RoundConic(M,C,(DOUBLE)r)
+#define ArcP3(S,P2,P3) t1_ArcP3(S,P2,P3)
+#define ArcCA(S,C,d) t1_ArcCA(S,C,(DOUBLE)d)
+#define Bezier(B,C,D) t1_Bezier(B,C,D)
+#define Hint(S,r,w,o,h,a,d,l) t1_Hint(S,r,w,o,h,a,d,l)
+#define Reverse(p) t1_Reverse(p)
+#define ReverseSubPaths(p) t1_ReverseSubPaths(p)
+#define AddLoc(p1,p2) t1_Join(p1,p2)
+#if 0
+#define SubLoc(p1,p2) t1_SubLoc(p1,p2)
+#endif
+#define DropSegment(p) t1_DropSegment(p)
+#define HeadSegment(p) t1_HeadSegment(p)
+#define QueryLoc(P,S,x,y) t1_QueryLoc(P,S,x,y)
+#define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r)
+#define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2)
+
+
+struct segment *t1_Loc(struct XYspace *, DOUBLE, DOUBLE);
+ /* create a location object (or "move" segment) */
+struct segment *t1_ILoc(struct XYspace *, int, int);
+ /* integer argument version of same */
+struct segment *t1_Line(struct segment *); /* straight line path segment */
+struct segment *t1_Join(struct segment *, struct segment *);
+ /* join two paths or regions together */
+struct segment *t1_ClosePath(struct segment *, int);
+ /* close a path or path set */
+struct conicsegment *t1_Conic(); /* conic curve path segment */
+struct conicsegment *t1_RoundConic(); /* ditto, specified another way */
+struct conicsegment *t1_ArcP3(); /* circular path segment with three points */
+struct conicsegment *t1_ArcCA(); /* ditto, with center point and angle */
+struct beziersegment *t1_Bezier(struct segment *, struct segment *,
+ struct segment *); /* Bezier third order curve path segment */
+struct hintsegment *t1_Hint(struct XYspace *, float, float, char,
+ char, char, char, int); /* produce a font 'hint' path segment */
+struct segment *t1_Reverse(struct segment *);
+ /* reverse the complete order of paths */
+struct segment *t1_ReverseSubPaths(struct segment *);
+ /* reverse only sub-paths; moves unchanged */
+struct segment *t1_DropSegment(struct segment *);
+ /* Drop the first segment in a path */
+struct segment *t1_HeadSegment(struct segment *);
+ /* return the first segment in a path */
+void t1_QueryLoc(struct segment *, struct XYspace *, DOUBLE *, DOUBLE *);
+ /* Query location; return its (x,y) */
+void t1_QueryPath(struct segment *, int *typeP, struct segment **,
+ struct segment **, struct segment **, DOUBLE *);
+ /* Query segment at head of a path */
+void t1_QueryBounds(struct segment *, struct XYspace *, DOUBLE *, DOUBLE *,
+ DOUBLE *, DOUBLE *); /* Query the bounding box of a path */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define CopyPath(p) t1_CopyPath(p)
+#define KillPath(p) t1_KillPath(p)
+#define PathTransform(p,m) t1_PathXform(p,m)
+#define PathDelta(p,pt) t1_PathDelta(p,pt)
+#define BoundingBox(h,w) t1_BoundingBox(h,w)
+#define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y)
+#define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a)
+#define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy)
+#define BoxPath(S,h,w) t1_BoxPath(S,h,w)
+
+struct segment *t1_CopyPath(struct segment *); /* duplicate a path */
+void t1_KillPath(struct segment *); /* destroy a path */
+struct segment *t1_PathXform(struct segment *, struct XYspace *);
+ /* transform a path arbitrarily */
+void t1_PathDelta(struct segment *, struct fractpoint *);
+ /* calculate the ending point of a path */
+struct segment *t1_BoundingBox(pel, pel); /* produce a Bounding Box Path */
+struct segment *t1_PathSegment(int, fractpel, fractpel);
+ /* produce a MOVE or LINE segment */
+struct segment *t1_JoinSegment(struct segment *, int, fractpel, fractpel,
+ struct segment *); /* join a MOVE or LINE segment to a path */
+DOUBLE t1_Hypoteneuse(); /* returns the length of a line */
+struct segment *t1_BoxPath(struct XYspace *, int, int);
+ /* returns a rectangular path */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ConsumePath(p) MAKECONSUME(p,KillPath(p))
+#define UniquePath(p) MAKEUNIQUE(p,CopyPath(p))
+
+/*END SHARED*/
+/*SHARED*/
+
+struct segment {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ unsigned char size; /* size of the structure */
+ unsigned char context; /* index to device context */
+ struct segment *link; /* pointer to next structure in linked list */
+ struct segment *last; /* pointer to last structure in list */
+ struct fractpoint dest; /* relative ending location of path segment */
+} ;
+
+#define ISCLOSED(flag) ((flag)&0x80) /* subpath is closed */
+#define LASTCLOSED(flag) ((flag)&0x40) /* last segment in closed subpath */
+
+/*
+NOTE: The ISCLOSED flag is set on the MOVETYPE segment before the
+subpath proper; the LASTCLOSED flag is set on the last segment (LINETYPE)
+in the subpath
+
+We define the ISPATHANCHOR predicate to test that a path handle
+passed by the user is valid:
+*/
+
+#define ISPATHANCHOR(p) (ISPATHTYPE(p->type)&&p->last!=NULL)
+
+/*
+For performance reasons, a user's "location" object is identical to
+a path whose only segment is a move segment. We define a predicate
+to test for this case. See also :hdref refid=location..
+*/
+
+#define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL)
+
+/*END SHARED*/
+/*SHARED*/
+
+struct conicsegment {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = CONICTYPE */
+ unsigned char size; /* as with any 'segment' type */
+ unsigned char context; /* as with any 'segment' type */
+ struct segment *link; /* as with any 'segment' type */
+ struct segment *last; /* as with any 'segment' type */
+ struct fractpoint dest; /* Ending point (C point) */
+ struct fractpoint M; /* "midpoint" of conic explained above */
+ float roundness; /* explained above */
+} ;
+/*END SHARED*/
+/*SHARED*/
+
+struct beziersegment {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = BEZIERTYPE */
+ unsigned char size; /* as with any 'segment' type */
+ unsigned char context; /* as with any 'segment' type */
+ struct segment *link; /* as with any 'segment' type */
+ struct segment *last; /* as with any 'segment' type */
+ struct fractpoint dest; /* ending point (D) */
+ struct fractpoint B; /* control point B */
+ struct fractpoint C; /* control point C */
+} ;
+
+/*END SHARED*/
+/*SHARED*/
+
+struct hintsegment {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = HINTTYPE */
+ unsigned char size; /* size of the structure */
+ unsigned char context; /* device context */
+ struct segment *link; /* pointer to next structure in linked list */
+ struct segment *last; /* pointer to last structure in list */
+ struct fractpoint dest; /* ALWAYS 0,0 */
+ struct fractpoint ref;
+ struct fractpoint width;
+ char orientation;
+ char hinttype;
+ char adjusttype;
+ char direction;
+ int label;
+} ;
+
+/*END SHARED*/
+/*SHARED*/
+
+/*
+CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro
+is also used by the STROKES module.)
+*/
+#define CONCAT(p1, p2) { \
+ p1->last->link = p2; /* link p2 on end of p1 */ \
+ p1->last = p2->last; /* last of new is last of p2 */ \
+ p2->last = NULL; } /* only first segment has non-NULL "last" */
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/pfb2pfa.1 b/fonts/utilities/ps2pk/pfb2pfa.1
new file mode 100644
index 0000000000..b533d8f7ae
--- /dev/null
+++ b/fonts/utilities/ps2pk/pfb2pfa.1
@@ -0,0 +1,21 @@
+.TH PFB2PFA 1 "1 Feb 2016"
+.SH NAME
+pfb2pfa \- convert a type1 pfb file (binary MSDOS) into a pfa (ASCII)
+.SH SYNOPSIS
+pfb2pfa [-v] pfbfile [pfafile]
+.SH DESCRIPTION
+Program converts a binary MSDOS representation for a type1 PostScript
+font into a readable ASCII version. The MSDOS newline (\\r) is converted
+into the UNIX newline (\\n). The output is written in a file whose name
+is the name that is provided on the command line or the basename of the
+input file plus extension ".pfa".
+.PP
+With the -v option you get some information about what the
+program is doing.
+.SH AUTHOR
+.nf
+Piet Tutelaers
+Maintained in TeX Live; please send bug reports or other correspondence
+to tex-k@tug.org (http://lists.tug.org/tex-k).
+
+
diff --git a/fonts/utilities/ps2pk/pfb2pfa.c b/fonts/utilities/ps2pk/pfb2pfa.c
new file mode 100644
index 0000000000..368d0a9b57
--- /dev/null
+++ b/fonts/utilities/ps2pk/pfb2pfa.c
@@ -0,0 +1,106 @@
+/*
+ * NAME
+ * pfb2pfa - convert a type1 pfb file (binary) into a pfa (ASCII)
+ * SYNOPSIS
+ * pfb2pfa [-v] pfbfile [pfafile]
+ * DESCRIPTION
+ * Program converts a binary MSDOS representation for a type1
+ * PostScript font into a readable ASCII version. The MSDOS
+ * newline (\r) is converted into the UNIX newline (\n).
+ * The output is written in a file whose name is the name that
+ * is provided on the command line or the basename of the input
+ * file plus extension ".pfa".
+ *
+ * With the -v option you get some information about what the
+ * program is doing.
+ * AUTHOR
+ * Piet Tutelaers
+ */
+
+#include "basics.h" /* basic definitions and fatal() */
+#include <stdarg.h>
+#include <stdio.h>
+#include "filenames.h" /* newname() */
+
+#if defined(MSDOS) || defined(DOSISH)
+#define NEWLINE '\012'
+#else
+#define NEWLINE '\n'
+#endif
+
+#define HEX_PER_LINE 30
+
+int main (int argc, char *argv[])
+{ unsigned int t, l, i;
+ unsigned int l1, l2, l3, l4;
+ short c, done, verbose = 0;
+ FILE *pfb, *pfa;
+ char *pfbname, *pfaname = NULL;
+ const char *myname = "pfb2pfa";
+
+ while (--argc > 0 && (*++argv)[0] == '-') {
+ done=0;
+ while ((!done) && (c = *++argv[0])) /* allow -bcK like options */
+ switch (c) {
+ case 'v':
+ verbose = 1; break;
+ default:
+ fatal("%s: %c invalid option\n", myname, c);
+ }
+ }
+
+ if (argc < 1) {
+ msg ("pfb2pfa (ps2pk) version " PACKAGE_VERSION "\n");
+ fatal("Usage: %s [-v] pfbfile [pfafile]\n", myname);
+ }
+
+ pfbname = argv[0]; argc--; argv++;
+ if (argc < 1) pfaname = newname(pfbname, ".pfa");
+ else if (argc == 1) pfaname = argv[0];
+ else fatal("Usage: %s [-v] pfbfile [pfafile]\n", myname);
+
+ pfb = fopen(pfbname, RB);
+ if (pfb == NULL) fatal("Can't open %s\n", pfbname);
+
+ pfa = fopen(pfaname, WB);
+ if (pfa == NULL) fatal("Can't open %s\n", pfaname);
+
+ while(!feof(pfb)) {
+ if (getc(pfb) != 128)
+ fatal("%s: not a pfb file.\n", pfbname);
+ t = getc(pfb);
+ if (verbose) printf("Type: %d, ", t);
+ switch (t) {
+ case 1:
+ l1 = getc(pfb); l2 = getc(pfb); l3 = getc(pfb); l4 = getc(pfb);
+ l = l1 | l2 << 8 | l3 << 16 | l4 << 24;
+ /* printf("%2x %2x %2x %2x -> %x\n", l1, l2, l3, l4, l); */
+ if (verbose) printf(" plain text, length %d\n", l);
+ for (i=0; i < l ; i++) {
+ c = getc(pfb);
+ if (c == '\r') putc(NEWLINE, pfa);
+ else putc(c, pfa);
+ }
+ break;
+ case 2:
+ l1 = getc(pfb); l2 = getc(pfb); l3 = getc(pfb); l4 = getc(pfb);
+ l = l1 | l2 << 8 | l3 << 16 | l4 << 24;
+ /* printf("%2x %2x %2x %2x -> %x\n", l1, l2, l3, l4, l); */
+ if (verbose) printf(" binary data, length %d\n", l);
+ for(i = 0; i < l ;i++) {
+ fprintf(pfa, "%02x", getc(pfb));
+ if ((i+1) % HEX_PER_LINE == 0) putc(NEWLINE, pfa);
+ }
+ putc(NEWLINE, pfa);
+ break;
+ case 3:
+ if (verbose) printf("End of file\n");
+ exit(0);
+ break;
+ default:
+ fatal("Unknown field type: %d\n", t);
+ }
+ }
+ fclose(pfa); fclose(pfb);
+ return 0;
+}
diff --git a/fonts/utilities/ps2pk/pictures.h b/fonts/utilities/ps2pk/pictures.h
new file mode 100644
index 0000000000..cd9aab1e09
--- /dev/null
+++ b/fonts/utilities/ps2pk/pictures.h
@@ -0,0 +1,48 @@
+/* $XConsortium: pictures.h,v 1.2 91/10/10 11:18:53 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* STUB */
+
+#define CopyPicture(p) p
+#define UniquePicture(p) p
+#define KillPicture(p)
+#define BegHandle(o,m) o
+#define EndHandle(o,m) o
+#define PictureBounds(P) P
+
+struct picture {
+ struct fractpoint origin;
+ struct fractpoint ending;
+};
+
+#define Phantom(o) t1_Phantom(o)
+#define Snap(o) t1_Snap(o)
+
+struct segment *t1_Phantom(struct segment *);
+struct segment *t1_Snap(struct segment *);
diff --git a/fonts/utilities/ps2pk/pk2bm.1 b/fonts/utilities/ps2pk/pk2bm.1
new file mode 100644
index 0000000000..12155d08ef
--- /dev/null
+++ b/fonts/utilities/ps2pk/pk2bm.1
@@ -0,0 +1,40 @@
+.TH PK2BM 1 "1 Feb 2016"
+.SH NAME
+pk2bm \- create a bitmap from a TeX pkfont
+.SH SYNOPSIS:
+pk2bm [-bh] [-W\fIwidth\fP] [-H\fIheight\fP] -c\fIchar\fP pkfont
+
+pk2bm [-bh] [-W\fIwidth\fP] [-H\fIheight\fP] -o\fIoctchar\fP pkfont
+.SH DESCRIPTION
+This program generates a bitmap (ASCII file) which can be used
+to create X11 applications. The bitmap file consists of all pixels
+of the specified character (via the -c or -o option) from
+the given pkfont. The format is described in bitmap(X11).
+.PP
+The pkfont is a packed fontfile generated by gftopk(TeX) from a
+gffont. A gffont is the output of METAFONT a program to design fonts
+in a device independant way.
+.PP
+With the -b flag a bitmap is generated in which all black pixels are
+drawn as a `*' and all white bits as a `.'. With the -h flag a
+hexadecimal bitmap dump is generated.
+.PP
+The -W and/or -H options can be used to create a bitmap of
+respectivally `width' and `height' pixels. The pk-bitmap will in
+this case be centered according to these new dimensions.
+.PP
+The output is written to the standard output.
+.SH SEE ALSO
+.nf
+`METAFONT', Donald Knuth.
+`The PKtype processor', belonging to the METAFONTware.
+bitmap(X11),
+gftopk(TeX),
+pktype(TeX),
+ps2pk(1)
+
+.SH AUTHOR
+.nf
+Piet Tutelaers
+Maintained in TeX Live; please send bug reports or other correspondence
+to tex-k@tug.org (http://lists.tug.org/tex-k).
diff --git a/fonts/utilities/ps2pk/pk2bm.c b/fonts/utilities/ps2pk/pk2bm.c
new file mode 100644
index 0000000000..5445bf7409
--- /dev/null
+++ b/fonts/utilities/ps2pk/pk2bm.c
@@ -0,0 +1,231 @@
+/*
+ * NAME
+ * pk2bm - create a bitmap from a TeX pkfont
+ * SYNOPSIS:
+ * pk2bm [-bh] [-W width] [-H height] {-c char|-o octchar} pkfont
+ * DESCRIPTION
+ * This program generates a bitmap (ASCII file) which can be used
+ * to create X11 applications. The bitmap file consists of all
+ * pixels of the specified character (via the -c or -o option) from
+ * the given pkfont. The format is described in bitmap(X11).
+ *
+ * The pkfont is a packed fontfile generated by gftopk(TeX) from a
+ * gffont. A gffont is the output of METAFONT a program to design fonts
+ * in a device independant way.
+ *
+ * With the -b flag a bitmap is generated in which all black pixels are
+ * drawn as a `*' and all white bits as a `.'. With the -h flag a
+ * hexadecimal bitmap dump is generated.
+ *
+ * The -W and/or -H options can be used to create a bitmap of
+ * respectivally `width' and `height' pixels. The pk-bitmap will in
+ * this case be centered according to these new dimensions.
+ *
+ * The output is written to the standard output.
+ * SEE ALSO
+ * ``METAFONT'', Donald Knuth.
+ * ``The PKtype processor'', belonging to the METAFONTware.
+ * bitmap(X11), gftopk(TeX), pktype(TeX), ps2pk(1)
+ * AUTHOR
+ * Piet Tutelaers
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#include <stdio.h>
+#include "pkin.h"
+#include "basics.h"
+
+#ifdef WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
+static quarterword lsbf(quarterword u);
+static void dots(quarterword u, int n);
+static int atoo(char *oct);
+
+int main(int argc, char *argv[])
+{
+ int done, C = 0, c, h = 0, w = 0, row, col;
+ unsigned int bitmap = 0, hexmap = 0;
+ halfword *word;
+ chardesc cd;
+ const char *myname = "pk2bm";
+ char *pkname;
+
+ while (--argc > 0 && (*++argv)[0] == '-') {
+ done=0;
+ while ((!done) && (c = *++argv[0])) /* allow -bcK as an option */
+ switch (c) {
+ case 'c':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ C = *argv[0];
+ done = 1; break;
+ case 'o':
+ if (*++argv[0] == '\0') {
+ argc--; ++argv;
+ }
+ if (argv[0] == '\0') goto invalid;
+ C = atoo(argv[0]);
+ done = 1; break;
+ case 'H':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ h = atoi(argv[0]);
+ done=1;
+ break;
+ case 'W':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ w = atoi(argv[0]);
+ done=1;
+ break;
+ case 'b':
+ bitmap = 1;
+ break;
+ case 'h':
+ hexmap = 1;
+ break;
+invalid:
+ default:
+ printf("%s: %c invalid option\n", myname, c);
+ exit(1);
+ }
+ }
+
+ if (argc == 0) {
+ msg ("pk2bm (ps2pk) version " PACKAGE_VERSION "\n");
+ printf("Usage: %s [-bh] {-c char|-o octchar} [-W width -H height] pkfile\n", myname);
+ exit(1);
+ }
+
+#ifdef WIN32
+ _setmode(fileno(stdout), _O_BINARY);
+#endif
+
+ pkname = argv[0];
+
+ if (readchar(pkname, (integer)C, &cd)) {
+ int H, dh, W, dw, bitsleft;
+ halfword nextword; quarterword nextbyte;
+
+ H=cd.cheight; if (h==0) h=H; dh=(h-H)/2;
+ W=cd.cwidth; if (w==0) w=W; dw=(w-W)/2;
+
+ if (bitmap || hexmap) {
+ printf("character : %d (%c)\n", (int) cd.charcode,
+ (char)cd.charcode);
+ printf(" height : %d\n", (int) cd.cheight);
+ printf(" width : %d\n", (int) cd.cwidth);
+ printf(" xoff : %d\n", (int) cd.xoff);
+ printf(" yoff : %d\n", (int) cd.yoff);
+ }
+ else {
+ printf("#define %s_%c_width \t %d\n",
+ pkname, (char)cd.charcode, (int) w);
+ printf("#define %s_%c_height \t %d\n",
+ pkname, (char)cd.charcode, (int) h);
+ printf("#define %s_%c_xoff \t %d\n",
+ pkname, (char)cd.charcode, (int) dw);
+ printf("#define %s_%c_yoff \t %d\n",
+ pkname, (char)cd.charcode, (int) dh);
+ printf("static char %s_%c_bits[] = {",
+ pkname, (char)cd.charcode);
+ }
+ for (row=0; row<h-H-dh; row++) {
+ printf("\n ");
+ for (col=0; col<w; col+=8)
+ if (bitmap) dots(0, w-col>7? 8: w-col);
+ else if (hexmap) printf("%02x", 0x00);
+ else printf(" 0x%02x, ", 0x00);
+ }
+ word = cd.raster;
+ for (row=h-H-dh; row<h-dh; row++) {
+ bitsleft = dw; nextword = 0;
+ printf("\n ");
+ for (col=0; col<w; col+=8) {
+ if (bitsleft>=8) {
+ nextbyte = nextword >> (bitsleft-8) & 0xff;
+ bitsleft-=8;
+
+ if (bitmap) dots(nextbyte, w-col>7? 8: w-col);
+ else if (hexmap) printf("%02x", nextbyte);
+ else printf(" 0x%02x, ", lsbf(nextbyte));
+ }
+ else {
+ nextbyte = nextword << (8-bitsleft) & 0xff;
+ if (col-dw<W)
+ nextword=(*word++);
+ else nextword=0;
+ nextbyte = nextbyte | (nextword >> (16-(8-bitsleft))
+ & 0xff);
+ bitsleft = 16 - (8-bitsleft);
+
+ if (bitmap) dots(nextbyte, w-col>7? 8: w-col);
+ else if (hexmap) printf("%02x", nextbyte);
+ else printf(" 0x%02x, ", lsbf(nextbyte));
+ }
+ }
+ }
+ for (row=h-dh; row<h; row++) {
+ printf("\n ");
+ for (col=0; col<w; col+=8)
+ if (bitmap) dots(0, w-col>7? 8: w-col);
+ else if (hexmap) printf("%02x", 0x00);
+ else printf(" 0x%02x, ", 0x00);
+ }
+ if ((!bitmap) && (!hexmap)) printf("};\n");
+ else putchar('\n');
+ }
+ return 0;
+}
+
+/*
+ * lsbf() transforms a byte (least significant bit first).
+ */
+static quarterword
+lsbf(quarterword u)
+{
+ int i; quarterword bit, result = 0;
+
+ for (i=0; i<8; i++) {
+ bit = u & 001;
+ result = (result<<1) | bit;
+ u = u >> 1;
+ }
+ return result;
+}
+
+/*
+ * dots() print byte: `*' for a black and `.' for a white pixel
+ */
+static void
+dots(quarterword u, int n)
+{
+ unsigned int bit;
+
+ bit=1<<7;
+ for ( ;n>0 ;n--) {
+ if (u & bit) putchar('*');
+ else putchar('.');
+ bit>>=1;
+ }
+}
+
+static int
+atoo(char *oct)
+{
+ int octal = 0;
+ while (*oct != '\0') octal = 8*octal + (*oct++) - '0';
+ return octal;
+}
diff --git a/fonts/utilities/ps2pk/pkin.c b/fonts/utilities/ps2pk/pkin.c
new file mode 100644
index 0000000000..be295a00b4
--- /dev/null
+++ b/fonts/utilities/ps2pk/pkin.c
@@ -0,0 +1,435 @@
+/*
+ * NAME
+ * pkin.c - implementation of readchar()
+ * DESCRIPTION
+ * This implementation of readchar() uses parts of the program dvips
+ * written by Tomas Rokicki--the inventor of the pkformat--(loadfont.c,
+ * download.c and unpack.c). Dvips in turn is derived from pktype.
+ * Pktype(TeX) is described in debt in ``The PKtype processor'',
+ * which is available as pktype.weave as part of the METAFONTware.
+ * What was needed to implement readchar() is rearranged in pkfile.c to
+ * get more modularity in the style of MODULA2.
+ * REDESIGN
+ * Piet Tutelaers
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <stdlib.h> /* malloc() */
+#include "basics.h" /* basic definitions */
+#include "pkin.h"
+
+/*
+ * Now we have some routines to get stuff from the pk file. pkbyte returns
+ * the next byte from the pk file.
+ */
+
+static FILE *pkfile ;
+
+static shalfword
+pkbyte(void)
+{
+ register shalfword i ;
+
+ if ((i=getc(pkfile))==EOF)
+ fatal("unexpected eof in pk file\n") ;
+ return(i) ;
+}
+
+static shalfword
+pksbyte(void)
+{
+ register shalfword i ;
+
+ i = pkbyte() ;
+ return i > 127 ? i -256 : i ;
+}
+
+static integer
+pkquad(void)
+{
+ register integer i ;
+
+ i = pksbyte() ;
+ i = i * 256 + pkbyte() ;
+ i = i * 256 + pkbyte() ;
+ i = i * 256 + pkbyte() ;
+ return(i) ;
+}
+
+static integer
+pktrio(void)
+{
+ register integer i ;
+
+ i = pkbyte() ;
+ i = i * 256 + pkbyte() ;
+ i = i * 256 + pkbyte() ;
+ return(i) ;
+}
+
+static integer
+pkpair(void)
+{
+ register integer i ;
+
+ i = pkbyte() ;
+ i = i * 256 + pkbyte() ;
+ return (i);
+}
+
+static integer
+pkspair(void)
+{
+ register integer i ;
+
+ i = pksbyte() ;
+ i = i * 256 + pkbyte();
+ return (i);
+}
+
+/*
+ * pkopen opens the pk file. This is system dependent.
+ */
+
+static Boolean
+pkopen(const char *name)
+{
+ if ((pkfile=fopen(name, RB))==NULL) {
+ fatal("Could not open %s\n", name) ;
+ } else
+ return(1) ;
+}
+
+/*
+ * The next part is devoted to unpacking the character data.
+ */
+
+/*
+ * We need procedures to get a nybble, bit, and packed word from the
+ * packed data structure.
+ */
+
+static halfword inputbyte, flagbyte ;
+static halfword bitweight ;
+static halfword dynf ;
+static halfword repeatcount ;
+
+static shalfword
+getnyb (void)
+{ halfword temp;
+ if ( bitweight == 0 )
+ { bitweight = 16 ;
+ inputbyte = pkbyte();
+ temp = inputbyte >> 4 ;
+ } else {
+ bitweight = 0 ;
+ temp = inputbyte & 15 ;
+ }
+ return(temp);
+}
+
+static Boolean
+getbit (void)
+{
+ bitweight >>= 1 ;
+ if ( bitweight == 0 )
+ { inputbyte = pkbyte();
+ bitweight = 128 ;
+ }
+ return(inputbyte & bitweight) ;
+}
+
+static halfword (*realfunc)() ;
+long PKremainder ;
+static halfword handlehuge(halfword i, halfword k) ;
+
+static halfword
+pkpackednum (void)
+{
+register halfword i, j ;
+ i = getnyb () ;
+ if ( i == 0 )
+ { do { j = getnyb () ;
+ i++ ;
+ } while ( ! ( j != 0 ) ) ;
+ if ( i > 3 ) {
+/*
+ * Damn, we got a huge count! We *fake* it by giving an artificially
+ * large repeat count.
+ */
+ return( handlehuge ( i , j ) ) ;
+ } else {
+ while ( i > 0 )
+ { j = j * 16 + getnyb () ;
+ i-- ;
+ }
+ return ( j - 15 + ( 13 - dynf ) * 16 + dynf ) ;
+ }
+ }
+ else if ( i <= dynf ) return ( i ) ;
+ else if ( i < 14 ) return ( ( i - dynf - 1 ) * 16 + getnyb () + dynf + 1
+ ) ;
+ else
+ { if ( i == 14 ) repeatcount = pkpackednum () ;
+ else repeatcount = 1 ;
+#ifdef DEBUG
+ printf("[%d]", repeatcount);
+#endif
+ return ( (*realfunc)() ) ;
+ }
+ }
+
+static halfword rest (void)
+{
+ halfword i ;
+
+ if (PKremainder < 0) {
+ PKremainder = - PKremainder ;
+ return ( 0 ) ;
+ } else if (PKremainder > 0) {
+ if (PKremainder > 4000) {
+ PKremainder = 4000 - PKremainder ;
+ return ( 4000 ) ;
+ } else {
+ i = PKremainder ;
+ PKremainder = 0 ;
+ realfunc = pkpackednum ;
+ return ( i ) ;
+ }
+ } else {
+ fatal("shouldn't happen\n") ;
+ }
+
+ /*NOTREACHED*/
+ return 0;
+}
+
+static halfword
+handlehuge (halfword i, halfword k)
+{
+ register long j = k ;
+
+ while (i) {
+ j = (j << 4L) + getnyb() ;
+ i-- ;
+ }
+ PKremainder = j - 15 + ( 13 - dynf ) * 16 + dynf ;
+ realfunc = rest ;
+ return ( rest() ) ;
+}
+
+/*
+ * And now we have our unpacking routine.
+ */
+
+static halfword gpower[17] = { 0 , 1 , 3 , 7 , 15 , 31 , 63 , 127 ,
+ 255 , 511 , 1023 , 2047 , 4095 , 8191 , 16383 , 32767 , 65535 } ;
+
+static void
+unpack(chardesc *cd)
+{
+ register integer i, j ;
+ register halfword word, wordweight ;
+ halfword *raster;
+ shalfword rowsleft ;
+ Boolean turnon ;
+ shalfword hbit ;
+ halfword count ;
+ shalfword wordwidth ;
+
+ wordwidth = (cd->cwidth + 15) / 16 ;
+ i = 2 * cd->cheight * (long)wordwidth ;
+ if (i <= 0)
+ i = 2 ;
+ cd->raster = (halfword *)malloc((unsigned)i) ;
+ if (cd->raster == NULL)
+ fatal("out of memory during allocation\n") ;
+ raster = cd->raster;
+ realfunc = pkpackednum ;
+ dynf = flagbyte / 16 ;
+ turnon = flagbyte & 8 ;
+ if ( dynf == 14 )
+ { bitweight = 0 ;
+ for ( i = 1 ; i <= cd->cheight ; i ++ )
+ { word = 0 ;
+ wordweight = 32768 ;
+ for ( j = 1 ; j <= cd->cwidth ; j ++ )
+ { if ( getbit () ) word += wordweight ;
+ wordweight >>= 1 ;
+ if ( wordweight == 0 )
+ { *raster++ = word ;
+ word = 0 ;
+ wordweight = 32768 ;
+ }
+ }
+ if ( wordweight != 32768 )
+ *raster++ = word ;
+ }
+ } else {
+ rowsleft = cd->cheight ;
+ hbit = cd->cwidth ;
+ repeatcount = 0 ;
+ wordweight = 16 ;
+ word = 0 ;
+ bitweight = 0 ;
+ while ( rowsleft > 0 )
+ { count = (*realfunc)() ;
+#ifdef DEBUG
+ if (turnon) printf("(%d) ",count);
+ else printf("%d ",count);
+#endif
+ while ( count != 0 )
+ { if ( ( count < wordweight ) && ( count < hbit ) )
+ { if ( turnon ) word += gpower [ wordweight ] - gpower
+ [ wordweight - count ] ;
+ hbit -= count ;
+ wordweight -= count ;
+ count = 0 ;
+ }
+ else if ( ( count >= hbit ) && ( hbit <= wordweight ) )
+ { if ( turnon )
+ word += gpower [ wordweight ] - gpower
+ [ wordweight - hbit ] ;
+ *raster++ = word ;
+ for ( i = 1 ; i <= repeatcount ; i ++ ) {
+ for ( j = 1 ; j <= wordwidth ; j ++ ) {
+ *raster = *(raster - wordwidth) ;
+ raster++ ;
+ }
+ }
+ rowsleft -= repeatcount + 1 ;
+ repeatcount = 0 ;
+ word = 0 ;
+ wordweight = 16 ;
+ count -= hbit ;
+ hbit = cd->cwidth ;
+ }
+ else
+ { if ( turnon ) word += gpower [ wordweight ] ;
+ *raster++ = word ;
+ word = 0 ;
+ count -= wordweight ;
+ hbit -= wordweight ;
+ wordweight = 16 ;
+ }
+ }
+ turnon = ! turnon ;
+ }
+ putchar('\n') ;
+ if ( ( rowsleft != 0 ) || ( hbit != cd->cwidth ) )
+ fatal( "error while unpacking; more bits than required\n" ) ;
+ }
+}
+
+/*
+ * readchar(): the main routine
+ * Reads the character definition of character `c' into `cd' if available,
+ * return FALSE (0) otherwise.
+ */
+int
+readchar(char *name, integer c, chardesc *cd)
+{
+ register shalfword i ;
+ register integer k ;
+ register integer length = 0;
+
+ if (!pkopen(name)) return(0);
+/*
+ * Check the preamble of the pkfile
+ */
+ if (pkbyte()!=247)
+ fatal("bad pk file, expected pre\n") ;
+ if (pkbyte()!=89)
+ fatal("bad version of pk file\n") ;
+ for(i=pkbyte(); i>0; i--) /* creator of pkfile */
+ (void)pkbyte() ;
+ (void) pkquad() ; /* design size */
+ (void) pkquad() ; /* checksum */
+ (void) pkquad() ; /* hppp */
+ (void) pkquad() ; /* vppp */
+/*
+ * Now we skip to the desired character definition
+ */
+ while ((flagbyte=pkbyte())!=245) {
+ if (flagbyte < 240) {
+ switch (flagbyte & 7) {
+case 0: case 1: case 2: case 3:
+ length = (flagbyte & 7) * 256 + pkbyte() - 4 ;
+ cd->charcode = pkbyte() ;
+ (void) pktrio() ; /* TFMwidth */
+ (void) pkbyte() ; /* pixel width */
+ break ;
+case 4: case 5: case 6:
+ length = (flagbyte & 3) * 65536 + pkpair() * 256 - 5 ;
+ cd->charcode = pkbyte() ;
+ (void) pktrio() ; /* TFMwidth */
+ (void) pkpair() ; /* pixelwidth */
+ break ;
+case 7:
+ length = pkquad() - 12 ;
+ cd->charcode = pkquad() ;
+ (void) pkquad() ; /* TFMwidth */
+ (void) pkquad(); /* pixelwidth */
+ (void) pkquad(); /* pixelheight */
+ }
+ if (length <= 0)
+ fatal("packet length (%d) too small\n", length) ;
+ if (cd->charcode == c) {
+ if (flagbyte & 4) {
+ if ((flagbyte & 7) == 7) { /* long format */
+ cd->cwidth = pkquad() ;
+ cd->cheight = pkquad() ;
+ cd->xoff = pkquad() ;
+ cd->yoff = pkquad() ;
+ } else { /* extended format */
+ cd->cwidth = pkpair(); ;
+ cd->cheight = pkpair() ;
+ cd->xoff = pkspair() ;
+ cd->yoff = pkspair() ;
+ }
+ } else { /* short format */
+ cd->cwidth = pkbyte() ;
+ cd->cheight = pkbyte() ;
+ cd->xoff = pksbyte() ;
+ cd->yoff = pksbyte() ;
+ }
+ unpack(cd);
+ (void)fclose(pkfile) ;
+ return(1);
+ }
+ for (; length>0; length--) /* skip this character */
+ (void) pkbyte() ;
+ } else {
+ k = 0 ;
+ switch (flagbyte) {
+case 243:
+ k = pksbyte() ;
+case 242:
+ k = k * 256 + pkbyte() ;
+case 241:
+ k = k * 256 + pkbyte() ;
+case 240:
+ k = k * 256 + pkbyte() ;
+ while (k-- > 0)
+ i = pkbyte() ;
+ break ;
+case 244:
+ k = pkquad() ;
+ break ;
+case 246:
+ break ;
+default:
+ fatal("unexpected command (%d)\n", flagbyte) ;
+ }
+ }
+ }
+ (void)fclose(pkfile) ;
+ return(0); /* character not found */
+}
diff --git a/fonts/utilities/ps2pk/pkin.h b/fonts/utilities/ps2pk/pkin.h
new file mode 100644
index 0000000000..8ffae55e2d
--- /dev/null
+++ b/fonts/utilities/ps2pk/pkin.h
@@ -0,0 +1,60 @@
+/*
+ * NAME
+ * pkin.h - header file for readchar()
+ * SYNOPSIS
+ * #include "pkfile.h"
+ *
+ * int readchar(name, c, cd)
+ * char name[]; shalfword c; chardesc *cd;
+ * DESCRIPTION
+ * Readchar() opens the pkfile `name', checks if it's a legal pkfile,
+ * and reads the character description of `c' into `cd'. Readchar()
+ * returns TRUE (1) upon success, FALSE (0) if the character `c' is
+ * not found in the pkfile.
+ *
+ * Parameter `cd' is a pointer to a the following structure:
+ * typedef struct {
+ * integer charcode,
+ * cwidth, cheight,
+ * xoff, yoff;
+ * halfword *raster ;
+ * } chardesc ;
+ *
+ * Charcode is the code of the character returned, cwidth and cheight
+ * respectively the width and height of the character in pixels,
+ * xoff and yoff are the offsets of first pixel to the reference point
+ * of the character box.
+ * Raster is a pointer to the bitmap describing the character. This
+ * raster consists of cheight rows of (cwidth + 15) /16 words of
+ * 16 bits each. Each row contains from left to right all cwidth
+ * pixels of that row.
+ * WARNING
+ * If the machine has a default integer size of 16 bits, and 32-bit
+ * integers must be manipulated with %ld, be carefull!
+ * AUTHORS
+ * Piet Tutelaers
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+/*
+ * Type declarations. integer must be a 32-bit signed; shalfword must
+ * be a sixteen-bit signed; halfword must be a sixteen-bit unsigned;
+ * quarterword must be an eight-bit unsigned.
+ */
+typedef long integer;
+typedef short shalfword ;
+typedef unsigned short halfword ;
+typedef unsigned char quarterword ;
+typedef short Boolean ;
+/*
+ * A chardesc describes an individual character.
+ */
+typedef struct {
+ integer charcode,
+ cwidth, cheight,
+ xoff, yoff;
+ halfword *raster ;
+} chardesc ;
+
+int readchar(char *name, integer c, chardesc *cd);
diff --git a/fonts/utilities/ps2pk/pkout.c b/fonts/utilities/ps2pk/pkout.c
new file mode 100644
index 0000000000..4d50fbe7be
--- /dev/null
+++ b/fonts/utilities/ps2pk/pkout.c
@@ -0,0 +1,578 @@
+/* FILE: pkout.c
+ * PURPOSE: implementation of PK output functions
+ * COMMENT: functions are derived from `The GFtoPK processor' but
+ * presented in a modular fashion so they can be used in other
+ * programs.
+ * (Porting `top-down' WEB code into modular readable C-code is
+ * not a trivial exercise.)
+ *
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+/* Some constants */
+#define PK_ID 89
+#define PK_SPC1 240 /* All we need, max length always < 255 */
+#define PK_NUMSPC 244
+#define PK_NOOP 246
+#define PK_PRE 247
+#define PK_POST 245
+
+#define DPI 72.27
+#define MIN(a,b) ( (a<b)? (a): (b))
+
+#include "basics.h" /* definitions and fatal() */
+#include <stdio.h>
+#include <stdarg.h> /* va_start(), va_end() */
+#include <stdlib.h> /* malloc() */
+#include "pkout.h"
+
+#undef DEBUG
+static int pk_len = 0;
+static FILE *pkfile;
+
+void pk_open(char *pkname)
+{
+ pkfile = fopen(pkname, WB);
+ if (pkfile == NULL) fatal("Can not open %s\n", pkname);
+}
+
+void pk_close(void)
+{
+ fclose(pkfile);
+}
+
+/* Portable Big Endian output functions */
+
+/* Nybble buffer */
+static int pk_output_byte, bitweight;
+static void pk1(int);
+
+static void pk_nybble(int x)
+{
+ if (bitweight == 16) {
+ bitweight = 1; pk_output_byte = x*16;
+ }
+ else {
+ bitweight = 16; pk1(pk_output_byte + x);
+ }
+}
+
+static void pk1(int x)
+{
+ if (x < 0) x += 256;
+ putc(x & 0x00ff, pkfile);
+ pk_len++;
+}
+
+static void pk2(int x)
+{
+ if (x < 0) x += 65536;
+ pk1((x & 0x00ff00) >> 8);
+ pk1(x & 0x0000ff);
+}
+
+static void pk3(int32_t x)
+{
+ pk1((x & 0x00ff0000) >> 16);
+ pk1((x & 0x0000ff00) >> 8);
+ pk1(x & 0x000000ff);
+}
+
+static void pk4(int32_t x)
+{
+ if (x < 0) { /* next two lines from mackay@cs.washington.edu */
+ x += 2<<29; x += 2<<29;
+ pk1(((x & 0x7f000000) >> 24) + 128);
+ }
+ else pk1((x & 0x7f000000) >> 24);
+ pk1((x & 0x00ff0000) >> 16);
+ pk1((x & 0x0000ff00) >> 8);
+ pk1(x & 0x000000ff);
+}
+
+static int MAX_COUNTS; /* length of array to hold runlengths */
+
+void pk_preamble(char *comment, /* source of the font */
+ float pointsize, /* pointsize in points */
+ int32_t checksum, /* should equal to tfm-value */
+ unsigned int h_res, /* horizontal resolution (dpi) */
+ unsigned int v_res) /* vertical resolution (dpi) */
+{
+ int i, len;
+
+ /* compute MAX_COUNTS based upon pointsize, h_res and v_res */
+ MAX_COUNTS = pointsize / DPI * h_res * (pointsize / DPI * v_res + 1);
+
+ pk1(PK_PRE);
+ pk1(PK_ID);
+ len = strlen(comment);
+ len = len>255? 255: len;
+ pk1(len);
+ for (i=0; i<len; i++) pk1(*comment++);
+
+ pk4((int32_t)(pointsize * (1<<20) + 0.5));
+ pk4(checksum);
+ pk4((int32_t)(h_res / DPI * (1<<16))); pk4((int32_t)(v_res / DPI * (1<<16)));
+}
+
+/* From `The GFtoPK processor', pp. 231 */
+
+static int optimal_size(int W, int H, int cnt, int count[], int *dyn_f)
+{ int comp_size = 0, b_comp_size, deriv[14], i, j, k;
+
+ i = (count[0] == 0? 1: 0); /* skip first empty runlength */
+ /* compute comp_size and deriv[1..13] */
+ for (j=1; j<14; j++) deriv[j] = 0;
+ while (i<cnt) {
+ j = count[i++];
+ if (j == -1) { comp_size++; continue; }
+ if (j < 0) { j = -j; comp_size++; }
+ if (j < 209) comp_size += 2;
+ else {
+ k = j - 193;
+ while (k >= 16) { k=k/16; comp_size += 2; }
+ comp_size++;
+ }
+ if (j < 14) deriv[j]--;
+ else {
+ if (j < 209) deriv[(223 - j) / 15]++;
+ else {
+ k = 16;
+ while (k*16 < j+3) k *= 16;
+ if (j-k <= 192) deriv[(207-j+k)/15] += 2;
+ }
+ }
+ }
+ /* find minimal value */
+ b_comp_size = comp_size; *dyn_f = 0;
+ for (i=1; i<14; i++) {
+ comp_size += deriv[i];
+ if (comp_size <= b_comp_size) {
+ b_comp_size = comp_size; *dyn_f = i;
+ }
+ }
+ comp_size = (b_comp_size + 1) / 2;
+ if (H*W == 0 || (comp_size > (H*W + 7) / 8)) {
+ comp_size = (H*W + 7) / 8; *dyn_f = 14;
+ }
+ return comp_size;
+}
+
+/* Next array contains the runlengths */
+static int *count = NULL;
+
+/* Global variables (interface between pk_runlengths() and pk_char() */
+static int dyn_f, comp_size, cnt;
+
+static void pk_runlengths(int W, int H, int (*next_pixel)())
+{ int current_value, pixel, i, j, max_counts, first_count;
+ int total_pixels, rc, row, col, runlength;
+ int color2, total_pixels2, /* counting equal rows variables */
+ i1, i2, newrow;
+
+ first_count = H; max_counts = first_count + H * W;
+ if (count == NULL) {
+ count = malloc(MAX_COUNTS * sizeof(int));
+ if (count == NULL) fatal("Out of memory\n");
+ }
+
+ if (max_counts > MAX_COUNTS) {
+ free(count);
+ count = malloc(max_counts * sizeof(int));
+ if (count == NULL) fatal("Out of memory\n");
+ MAX_COUNTS = max_counts;
+ }
+
+ /* 1: compute transitions BLACK<->WHITE */
+
+ cnt = first_count;
+ runlength = 0; current_value = BLACK;
+ for (row=0; row < H; row++) {
+ for (col=0; col<W; col++) {
+ pixel = (*next_pixel)();
+ if (pixel == current_value) runlength++;
+ else if (pixel == OTHER(current_value)) {
+ count[cnt++] = runlength;
+ current_value = OTHER(current_value);
+ runlength = 1;
+ }
+ }
+ }
+ if (runlength>0)
+ count[cnt++] = runlength;
+
+ /* for an empty glyph */
+ if (cnt == first_count) count[cnt++] = 0;
+
+#ifdef DEBUG
+ current_value = BLACK;
+ for (i=first_count; i<cnt; i++)
+ if (count[i] < 0) printf("[%d]", -count[i]);
+ else {
+ if (current_value == BLACK) printf("%d", count[i]);
+ else printf("(%d)", count[i]);
+ current_value = OTHER(current_value);
+ }
+ putchar('\n');
+#endif
+
+ /* 2: Now remove equal lines and add a repeat count at the first
+ transition of a row */
+
+ i = first_count; j = 0;
+ total_pixels = 0; row = -1;
+ current_value = BLACK;
+ if (count[i] == 0) {
+ count[j++] = count[i++];
+ current_value = WHITE;
+ }
+ while (i < cnt) {
+ if (j >= i) fatal("Program error: report to author!\n");
+ count[j++] = count[i];
+ total_pixels += count[i++];
+ current_value = OTHER(current_value);
+ newrow = total_pixels / W; col = total_pixels % W;
+ /* if transition starts in column zero or in a previous row
+ then continue */
+ if (newrow == row || row == H-1 || col == 0) continue;
+ row = newrow;
+
+ /* count equal rows */
+
+ /* 1: goto first transition of next row */
+ color2 = current_value;
+ total_pixels2 = total_pixels; i2 = i;
+ while (i2 < cnt && total_pixels2 / W == row) {
+ total_pixels2 += count[i2++];
+ color2 = OTHER(color2);
+ }
+
+ /* 2: do we need to compute a repeat count? */
+ if (color2 != current_value
+ || total_pixels2 - total_pixels != W) continue;
+
+ /* 3: count them */
+ rc = 0; i1 = i;
+ while (i2 < cnt && count[i1] == count[i2]) {
+#ifdef DEBUG
+ printf("%d (%d)", count[i1], count[i2]);
+#endif
+ total_pixels2 += count[i2++]; i1++;
+ }
+ rc = total_pixels2 / W - row; /* enclosed rows */
+ if (MIN(count[i1], count[i2]) + total_pixels2 % W < W)
+ rc--;
+#ifdef DEBUG
+ printf(" row %d: rc = %d\n", row, rc);
+#endif
+
+ /* 3: now remove the equal rows and finish last row */
+ if (rc > 0) {
+ /* insert a repeat count */
+ if (j >= i) fatal("Program error: report to author\n");
+ count[j++] = -rc;
+
+ /* finish runlengths of current row */
+ while (total_pixels + count[i] < row*W+W) {
+ if (j >= i) fatal("Program error: increase FIRST_COUNT!\n");
+ count[j++] = count[i];
+ total_pixels += count[i++];
+ current_value = OTHER(current_value);
+ }
+
+ /* skip runlengths of equal rows */
+ while (total_pixels + count[i] < (row+rc+1)*W) {
+ total_pixels += count[i++];
+ current_value = OTHER(current_value);
+ }
+ row += rc;
+ }
+ }
+ cnt = j; /* that is what we have now */
+
+ /* 3: compute optimal packing size */
+
+ comp_size = optimal_size(H, W, cnt, count, &dyn_f);
+#ifdef DEBUG
+ current_value = BLACK;
+ for (i=0; i<cnt; i++)
+ if (count[i] < 0) printf("[%d]", -count[i]);
+ else {
+ if (current_value == BLACK) printf("%d", count[i]);
+ else printf("(%d)", count[i]);
+ current_value = OTHER(current_value);
+ }
+ printf("\nOptimal packing with dyn_f = %d total size %d\n",
+ dyn_f, comp_size);
+#endif
+}
+
+#define MAX_TWOBYTE_NYBBLE (208 - 15*dyn_f)
+
+static void pk_number(int x)
+{ int k;
+
+ if (x < 0) { /* repeat count */
+ if (x == -1) pk_nybble(0xF);
+ else { pk_nybble(0xE);
+ pk_number(-x);
+ }
+ }
+ else if (x <= dyn_f) pk_nybble(x);
+ else if (x <= MAX_TWOBYTE_NYBBLE) { /* two nybble values */
+ x-= dyn_f+1;
+ pk_nybble(dyn_f + 1 + x / 16);
+ pk_nybble(x % 16);
+ }
+ else { /* huge counts */
+ x = x - MAX_TWOBYTE_NYBBLE + 15; k = 16;
+ while (k <= x) { k *= 16; pk_nybble(0x0); }
+ while (k > 1) { k = k / 16; pk_nybble(x / k); x = x % k; }
+ }
+}
+
+/* in case runlength encoding is not optimal we send a compressed
+ bitmap in stead of the packed runlengths
+ See GFtoPK processor, pp. 235 */
+static void pk_bitmap(int width, int cnt, int runlength[])
+{ int count, /* number of bits in the current state to send */
+ buff, /* byte buffer */
+ h_bit, /* horizontal bit count for each runlength */
+ p_bit, /* what bit are we about to send out? */
+ r_on, s_on, /* state saving variables */
+ r_count, s_count,/* dito */
+ r_i, s_i, /* dito */
+ rc, /* repeat count */
+ state, /* state variable (what state?) */
+ on, /* starting with black? */
+ i; /* points to next runlength */
+ static int power[9] = {1, 2, 4, 8, 16, 32, 64, 128, 256};
+
+ buff = 0; p_bit = 8; h_bit = width;
+ state = 0; rc = 0;
+ r_on = s_on = r_count = s_count = r_i = s_i = 0; /* avoid warnings */
+ on = 1; count = runlength[0]; i = 1;
+ while (i < cnt || state || count>0) {
+ if (state) {
+ count = r_count; i = r_i; on = r_on; rc--;
+ }
+ else {
+ r_count = count; r_i = i; r_on = on;
+ }
+
+ /* send one row of width bits */
+ do {
+ if (count == 0) {
+ if (runlength[i] < 0) {
+ if (!state) rc = - runlength[i];
+ i++;
+ }
+ count = runlength[i]; i++; on = !on;
+ }
+ if (count >= p_bit && p_bit < h_bit) {
+ /* we end a byte, we don't end a runlength */
+ if (on) buff += power[p_bit] - 1;
+ pk1(buff);
+ buff = 0; h_bit -= p_bit;
+ count -= p_bit; p_bit = 8;
+ }
+ else {
+ if (count < p_bit && count < h_bit) {
+ /* we neither end the row nor the byte */
+ if (on) buff += power[p_bit] - power[p_bit-count];
+ p_bit -= count; h_bit -= count; count = 0;
+ }
+ else { /* we end a row and maybe a byte */
+ if (on) buff += power[p_bit] - power[p_bit-h_bit];
+ count -= h_bit; p_bit -= h_bit; h_bit = width;
+ if (p_bit == 0) {
+ pk1(buff); buff = 0; p_bit = 8;
+ }
+ }
+ }
+ } while (h_bit != width);
+
+ if (state && rc == 0) {
+ count = s_count; i = s_i; on = s_on; state = 0;
+ }
+ else if (!state && rc >0) {
+ s_count = count; s_i = i; s_on = on; state = 1;
+ }
+ }
+ if (p_bit != 8) pk1(buff);
+}
+
+/* For packing a character */
+void pk_char(int char_code, /* character code 0..255 */
+ int32_t tfm_width, /* TFM width of character */
+ int h_escapement, /* horizontal escapement in pixels */
+ unsigned int width, /* width of bounding box */
+ unsigned int height, /* height of bounding box */
+ int h_offset, /* horizontal offset to reference point */
+ int v_offset, /* vertical offset to reference point */
+ int (*next_pixel)()) /* user's next pixel generator */
+{ int i;
+ unsigned short flag_byte;
+
+ pk_runlengths(width, height, next_pixel);
+
+ /* write a character preamble */
+
+ flag_byte = dyn_f * 16;
+ if (count[0] > 0) flag_byte += 8; /* starting in BLACK */
+ if (tfm_width > 0XFFFFFF || width > 65535 || height > 65535
+ || h_offset > 32767 || v_offset > 32767
+ || h_offset < -32768 || v_offset < -32768
+ || comp_size > 196594)
+ { /* write long format */
+ fatal("Can't handle long format yet!\n");
+ }
+ else if (h_escapement > 255 || width > 255 || height > 255
+ || h_offset > 127 || v_offset > 127
+ || h_offset < -128 || v_offset < -128
+ || comp_size > 1015)
+ { /* write two-byte short character preamble */
+ comp_size += 13; flag_byte += comp_size / 65535 + 4;
+ pk1(flag_byte);
+ pk2(comp_size % 65535);
+ pk1(char_code);
+ pk3(tfm_width);
+ pk2(h_escapement); /* pixels ! */
+ pk2(width);
+ pk2(height);
+ pk2(h_offset);
+ pk2(v_offset);
+ }
+ else { /* write one-byte short character preamble */
+ comp_size += 8; flag_byte += comp_size / 256;
+ pk1(flag_byte);
+ pk1(comp_size % 256);
+ pk1(char_code);
+ pk3(tfm_width);
+ pk1(h_escapement); /* pixels ! */
+ pk1(width);
+ pk1(height);
+ pk1(h_offset);
+ pk1(v_offset);
+ }
+
+ /* and now the character itself */
+ if (dyn_f != 14) { /* send compressed format */
+ if (count[0] == 0) i = 1; else i = 0;
+ bitweight = 16;
+ for (i=i; i<cnt; i++) pk_number(count[i]);
+ if (bitweight != 16) pk1(pk_output_byte);
+ }
+ else /* send bitmap */
+ if (height > 0) pk_bitmap(width, cnt, count);
+
+}
+
+/*
+ * Output small string special (<255 chars)
+ */
+static void pkstring(const char *fmt, ...) {
+ char buf[256]; int i, len;
+ va_list args;
+
+ va_start(args, fmt);
+#ifdef CHARSPRINTF
+ (void) vsprintf(buf, fmt, args);
+ len = strlen(buf);
+#else
+ len = vsprintf(buf, fmt, args);
+#endif
+ if (len > 255 || len < 0) fatal("PK string exceeds 255 characters\n");
+ va_end(args);
+
+ pk1(PK_SPC1);
+ pk1(len); i = 0;
+ for (i = 0; i < len; i++) pk1(buf[i]);
+}
+
+/*
+ * Compute METAFONT magnification string for <dpi>
+ */
+
+static int PSPKINT(float x) {
+ return (int) x;
+}
+
+static char mag_str[64];
+
+static char *magnification (int dpi, int BDPI) {
+ double size, magstep;
+
+ if (dpi == BDPI) {
+ sprintf(mag_str, "magstep(0)");
+ return mag_str;
+ }
+ size = BDPI; magstep = 0;
+ while (dpi < size) {
+ size = size / 1.095445115;
+ magstep -= 0.5;
+ if (dpi == PSPKINT(size + 0.5)) {
+ sprintf(mag_str, "magstep(%.1f)", magstep);
+ return mag_str;
+ }
+ if (dpi > size) {
+ sprintf(mag_str, "%d+%d/%d", PSPKINT(dpi/BDPI), dpi%BDPI, BDPI);
+ return mag_str;
+ }
+ }
+ while (dpi > size) {
+ size = size * 1.095445115;
+ magstep += 0.5;
+ if (dpi == PSPKINT(size + 0.5)) {
+ sprintf(mag_str, "magstep(%.1f)", magstep);
+ return mag_str;
+ }
+ if (dpi < size) {
+ sprintf(mag_str, "%d+%d/%d", PSPKINT(dpi/BDPI), dpi%BDPI, BDPI);
+ return mag_str;
+ }
+ }
+ fatal("PK could not determine magnification\n");
+}
+
+/*
+ * Barebone postample
+ */
+void pk_postamble(void)
+{
+ pk1(PK_POST);
+ while (pk_len % 4 != 0) pk1(PK_NOOP);
+}
+
+/*
+ * Write special PK strings in the postamble for identification
+ * purposes as proposed by mackay@cs.washington.edu.
+ */
+void ps2pk_postamble(char *fontname, /* The real FontName from the afm */
+ char *encname, /* The actual name, not the filename */
+ int base_res, /* basic resolution */
+ int h_res, /* Match against base_res for mag */
+ int v_res, /* Match against h_res for aspect_ratio */
+ float pointsize, /* Used for fontfacebyte calculation */
+ char *args) /* Essential ps2pk args */
+{
+ int i;
+
+ pkstring("ps2pk options: %s", args);
+ pkstring("fontid=%s", fontname);
+ if (encname) pkstring("codingscheme=%s", encname);
+ pkstring("fontfacebyte");
+ pk1(PK_NUMSPC);
+ i = (pointsize < 127.0) ?
+ ((254 - (int)((2 * pointsize)+0.5)) * (1 << 16)) : 0;
+ pk4(i);
+ pkstring("pixels_per_inch=%d", base_res);
+ pkstring("mag=%s", magnification(h_res, base_res));
+ if (v_res != h_res)
+ pkstring("aspect ratio=%d / %d",
+ (int)((1.0 * v_res / h_res * base_res) + 0.5), base_res);
+
+ pk1(PK_POST);
+ while (pk_len % 4 != 0) pk1(PK_NOOP);
+}
diff --git a/fonts/utilities/ps2pk/pkout.h b/fonts/utilities/ps2pk/pkout.h
new file mode 100644
index 0000000000..a22d9f9015
--- /dev/null
+++ b/fonts/utilities/ps2pk/pkout.h
@@ -0,0 +1,45 @@
+/* FILE: pkout.h
+ * PURPOSE: interface to te PK output functions (pkfile.c)
+ * COMMENT: See the pktest.c example program how to use the PK functions.
+ * (see README for license)
+ */
+
+/* A function for opening a pk file */
+void pk_open(char *name);
+
+/* A function for closing a pk file */
+void pk_close(void);
+
+/* A function for writing the preamble */
+void pk_preamble(char *comment, /* comment string: source of font */
+ float pointsize, /* design size in points */
+ int32_t checksum, /* checksum */
+ unsigned int h_res, /* horizontal resolution (dpi) */
+ unsigned int v_res); /* vertical resolution (dpi) */
+
+/* For packing a character */
+void pk_char(int char_code, /* character code 0..255 */
+ int32_t tfm_width, /* TFM width of character */
+ int h_escapement, /* horizontal escapement in pixels */
+ unsigned int width, /* width of bounding box */
+ unsigned int height, /* height of bounding box */
+ int h_offset, /* horizontal offset to reference point */
+ int v_offset, /* vertical offset to reference point */
+ int (*next_pixel)()); /* user's pixel generator */
+
+/* Barebone postample */
+void pk_postamble(void);
+
+/* PS2PK postamble */
+void ps2pk_postamble(char *fontname, /* The real FontName from the afm */
+ char *encname, /* The actual name, not the filename */
+ int base_res, /* basic resolution */
+ int h_res, /* Match against base_res for mag */
+ int v_res, /* Match against h_res for aspect_ratio */
+ float pointsize, /* Used for fontfacebyte calculation */
+ char *args); /* Essential ps2pk args */
+
+/* Here are some definitions to play with pixels */
+#define BLACK 1
+#define WHITE 0
+#define OTHER(pixel) (pixel==BLACK? WHITE: BLACK)
diff --git a/fonts/utilities/ps2pk/pktest.c b/fonts/utilities/ps2pk/pktest.c
new file mode 100644
index 0000000000..2cc97f1c7c
--- /dev/null
+++ b/fonts/utilities/ps2pk/pktest.c
@@ -0,0 +1,110 @@
+/* FILE: pktest.c
+ * PURPOSE: This program demonstrates how a PK file can be created from
+ * a single character bitmap.
+ * USAGE: pktest -c<char_code> -W<with> -H<Height> pkname < test.bm
+ * (test.bm contains the character from `The GFtoPK processor')
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+int testing = 1;
+#include <stdio.h>
+#include "basics.h" /* fatal() */
+#include "pkout.h"
+
+static int next_pixel(void);
+
+int main(int argc, char *argv[])
+{
+ int done, C = 0, W = 0, H = 0, c;
+ const char *myname;
+ char *pkname, comment[256];
+
+ myname = argv[0];
+ while (--argc > 0 && (*++argv)[0] == '-') {
+ done=0;
+ while ((!done) && (c = *++argv[0])) /* allow multiletter options */
+ switch (c) {
+ case 'c':
+ C = *++argv[0];
+ if (C == '\0') {
+ argc--; C = *++argv[0];
+ }
+ break;
+ case 'H':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ H = atoi(*argv); done = 1;
+ break;
+ case 'W':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ W = atoi(*argv); done = 1;
+ break;
+ default:
+ fatal("%s: %c invalid option\n", myname, c);
+ }
+ }
+
+ if (argc == 0 || C == 0 || W*H == 0) {
+ msg ("pktest (ps2pk) version " PACKAGE_VERSION "\n");
+ fatal("Usage: %s -c<char> -W<width> -H<height> pkfile\n", myname);
+ }
+
+ pkname = argv[0];
+ pk_open(pkname);
+
+ sprintf(comment, "Testfont %s designed at 10 points", pkname);
+ pk_preamble(comment, 10.0, 1473505522, 120, 120);
+ printf("character %c Width %d Height %d\n", C, W, H);
+ pk_char(C, 640796, 25, W, H, -2, 28, next_pixel);
+ pk_postamble();
+ pk_close();
+ return 0;
+}
+
+/* This function delivers the pixels from the character's bounding box
+ * from left to right and from top to bottom.
+ */
+static int next_pixel(void)
+{ int c;
+ do { c = getchar();
+ if (c==EOF) fatal("reading past end of file!\n");
+ if (c == '*' || c == 'X') return BLACK;
+ if (c == '.') return WHITE;
+ } while (1);
+}
+
+/* The character example from GFtoPK:
+ ********************
+ ********************
+ ********************
+ ********************
+ **................**
+ **................**
+ **................**
+ ....................
+ ....................
+ ..**............**..
+ ..**............**..
+ ..**............**..
+ ..****************..
+ ..****************..
+ ..****************..
+ ..****************..
+ ..**............**..
+ ..**............**..
+ ..**............**..
+ ....................
+ ....................
+ ....................
+ **................**
+ **................**
+ **................**
+ ********************
+ ********************
+ ********************
+ ********************
+*/
diff --git a/fonts/utilities/ps2pk/protos.h b/fonts/utilities/ps2pk/protos.h
new file mode 100644
index 0000000000..eb8e62c32f
--- /dev/null
+++ b/fonts/utilities/ps2pk/protos.h
@@ -0,0 +1,402 @@
+arith.c
+/* void DLmult(struct *product,unsigned long u,unsigned long v); */
+/* void DLdiv(struct *quotient,unsigned long divisor); */
+/* void DLadd(struct *u,struct *v); */
+/* void DLsub(struct *u,struct *v); */
+extern long FPmult(long u,long v);
+extern long FPdiv(long dividend,long divisor);
+extern long FPstarslash(long a,long b,long c);
+basename.c
+extern int main(int argc,char **argv );
+basics.c
+extern void fatal(char *fmt,...);
+extern void msg(char *fmt,...);
+bstring.c
+extern int memset(void *s,int c,int length);
+curves.c
+extern int BezierTerminationTest(long xa,long ya,long xb,long yb,long xc,long yc,long xd,long yd);
+static struct segment *StepBezierRecurse(struct bezierinfo *I,long xA,long yA,long xB,long yB,long xC,long yC,long xD,long yD);
+extern struct segment *t1_StepBezier(struct region *R,long xA,long yA,long xB,long yB,long xC,long yC,long xD,long yD);
+emxrun.c
+extern int main(int argc,char **argv );
+extern int emx_system(char *cmd);
+encoding.c
+static char *value_after(char *s,char *t);
+extern int decimal(char *s);
+extern char nextsymbol(void);
+extern char *nextpsname(void);
+extern void getenc(char **fontname ,char **encname ,char **ev ,int *width);
+extern void addcc(char *name,int charcode);
+extern int getcc(char *name);
+extern char *string(char *s);
+extern void remove_string(void);
+filenames.c
+static char *charptr(char *name,char c);
+extern int equal(char *s,char *t);
+extern char *extension(char *str);
+extern char *newname(char *name,char *ext);
+extern char *ps2pk_basename(char *str,char *suffix);
+extern int ps_resource(char *name);
+flisearch.c
+extern int main(int argc,char **argv );
+extern int matching(char *font,int size);
+fontfcn.c
+extern int SearchDictName(struct ps_dict *dictP,struct ps_obj *keyP);
+extern int initFont(void);
+extern void resetFont(char *env);
+extern int readFont(char *env);
+extern unsigned char *fontfcnB(unsigned char *S,unsigned char *code,int *lenP,int *mode);
+extern int fontfcnA(char *env,int *mode);
+extern void QueryFontLib(char *env,char *infoName,unsigned char *infoValue,int *rcodeP);
+hints.c
+extern void t1_InitHints(void);
+extern void t1_CloseHints(struct fractpoint *hintP);
+static void ComputeHint(struct hintsegment *hP,long currX,long currY,struct fractpoint *hintP);
+extern void t1_ProcessHint(struct hintsegment *hP,long currX,long currY,struct fractpoint *hintP);
+static short SearchXofY(struct edgelist *edge,short y);
+static int ImpliedHorizontalLine(struct edgelist *e1,struct edgelist *e2,int y);
+static void FixSubPaths(struct region *R);
+static void DumpSubPaths(struct edgelist *anchor);
+static struct edgelist *before(struct edgelist *e);
+static void writeXofY(struct edgelist *e,int y,int x);
+static void CollapseWhiteRun(struct edgelist *anchor,short yblack,struct edgelist *left,struct edgelist *right,short ywhite);
+extern void t1_ApplyContinuity(struct region *R);
+lines.c
+extern void t1_StepLine(struct region *R,long x1,long y1,long x2,long y2);
+extern void t1_Bresenham(short *edgeP,long x1,long y1,long x2,long y2);
+lspsres.c
+mag.c
+extern int main(int argc,char **argv );
+extern int fontsize(double x);
+extern double stepsize(double x);
+objects.c
+extern struct xobject *t1_Allocate(int size,struct xobject *template,int extra);
+extern void t1_Free(struct xobject *obj);
+extern struct xobject *t1_Permanent(struct xobject *obj);
+extern struct xobject *xiTemporary(struct xobject *obj);
+extern struct xobject *t1_Dup(struct xobject *obj);
+extern struct xobject *t1_Copy(struct xobject *obj);
+extern struct xobject *t1_Destroy(struct xobject *obj);
+extern struct xobject *t1_Unique(struct xobject *obj);
+extern void t1_Pragmatics(char *username,int value);
+extern void t1_Consume(int n,...);
+extern struct xobject *t1_TypeErr(char *name,struct xobject *obj,int expect,struct xobject *ret);
+static char *TypeFmt(int type);
+static int ObjectPostMortem(struct xobject *obj);
+extern struct xobject *t1_ArgErr(char *str,struct xobject *obj,struct xobject *ret);
+extern void t1_abort(char *str);
+extern char *t1_ErrorMsg(void);
+extern void t1_InitImager(void);
+extern void t1_TermImager(void);
+extern void reportusage(void);
+paths.c
+extern struct segment *t1_CopyPath(struct segment *p0);
+extern void t1_KillPath(struct segment *p);
+extern struct segment *t1_Loc(struct XYspace *S,double x,double y);
+extern struct segment *t1_ILoc(struct XYspace *S,int x,int y);
+extern struct segment *t1_SubLoc(struct segment *p1,struct segment *p2);
+extern struct segment *t1_PathSegment(int type,long x,long y);
+extern struct segment *t1_Line(struct segment *P);
+extern struct beziersegment *t1_Bezier(struct segment *B,struct segment *C,struct segment *D);
+extern struct hintsegment *t1_Hint(struct XYspace *S,double ref,double width,char orientation,char hinttype,char adjusttype,char direction,int label);
+extern struct segment *t1_Join(struct segment *p1,struct segment *p2);
+extern struct segment *t1_JoinSegment(struct segment *before,int type,long x,long y,struct segment *after);
+extern struct segment *t1_ClosePath(struct segment *p0,int lastonly);
+extern struct segment *t1_Reverse(struct segment *p);
+static struct segment *ReverseSubPath(struct segment *p);
+static struct segment *DropSubPath(struct segment *p0);
+static struct segment *SplitPath(struct segment *anchor,struct segment *before);
+extern struct segment *t1_ReverseSubPaths(struct segment *p);
+static int UnClose(struct segment *p0);
+extern struct segment *t1_PathXform(struct segment *p0,struct XYspace *S);
+extern void t1_PathDelta(struct segment *p,struct fractpoint *pt);
+extern struct segment *t1_BoundingBox(short h,short w);
+extern void t1_QueryLoc(struct segment *P,struct XYspace *S,double *xP,double *yP);
+extern void t1_QueryPath(struct segment *path,int *typeP,struct segment **Bp ,struct segment **Cp ,struct segment **Dp ,double *fP);
+extern void t1_QueryBounds(struct segment *p0,struct XYspace *S,double *xminP,double *yminP,double *xmaxP,double *ymaxP);
+extern struct segment *t1_BoxPath(struct XYspace *S,int h,int w);
+extern struct segment *t1_DropSegment(struct segment *path);
+extern struct segment *t1_HeadSegment(struct segment *path);
+extern void t1_DumpPath(struct segment *p);
+pfb2pfa.c
+extern int main(int argc,char **argv );
+pk2bm.c
+extern int main(int argc,char **argv );
+extern unsigned char lsbf(unsigned char u);
+extern void dots(unsigned char u,int n);
+extern int atoo(char *oct);
+pkin.c
+static short pkbyte(void);
+static long pkquad(void);
+static long pktrio(void);
+static long pklong(void);
+static short pkopen(char *name);
+static short getnyb(void);
+static short getbit(void);
+static unsigned short pkpackednum(void);
+static unsigned short rest(void);
+static unsigned short handlehuge(unsigned short i,unsigned short k);
+/* void unpack(struct *cd); */
+/* int readchar(char *name,short c,struct *cd); */
+static void error(char *s);
+pkout.c
+extern void pk_open(char *pkname);
+extern void pk_close(void);
+static void pk_nybble(int x);
+static void pk1(int x);
+static void pk2(int x);
+static void pk3(int x);
+static void pk4(int x);
+extern void pk_preamble(char *comment,float pointsize,int checksum,unsigned int h_res,unsigned int v_res);
+extern int optimal_size(int W,int H,int cnt,int *count,int *dyn_f);
+static void pk_runlengths(int W,int H,int (*next_pixel)(void));
+static void pk_number(int x);
+static void pk_bitmap(int width,int cnt,int *runlength);
+extern void pk_char(int char_code,int tfm_width,int h_escapement,unsigned int width,unsigned int height,int h_offset,int v_offset,int (*next_pixel)(void));
+static void pkstring(char *fmt,...);
+extern int INT(float x);
+extern char *magnification(int dpi,int BDPI);
+extern void pk_postamble(void);
+extern void ps2pk_postamble(char *fontname,char *encname,int base_res,int h_res,int v_res,float pointsize,char *args);
+pktest.c
+extern int main(int argc,char **argv );
+extern int next_pixel(void);
+ps2pk.c
+psargs.c
+psearch.c
+regions.c
+extern void t1_KillRegion(struct region *area);
+extern struct region *t1_CopyRegion(struct region *area);
+static struct edgelist *NewEdge(short xmin,short xmax,short ymin,short ymax,short *xvalues,int isdown);
+extern struct region *t1_Interior(struct segment *p,int fillrule);
+static int Unwind(struct edgelist *area);
+extern void t1_ChangeDirection(int type,struct region *R,long x,long y,long dy);
+static void newfilledge(struct region *R,long xmin,long xmax,long ymin,long ymax,int isdown);
+extern struct edgelist *t1_SortSwath(struct edgelist *anchor,struct edgelist *edge,struct edgelist *(*swathfcn)(void));
+static struct edgelist *splitedge(struct edgelist *list,short y);
+static void vertjoin(struct edgelist *top,struct edgelist *bottom);
+extern struct edgelist *swathxsort(struct edgelist *before0,struct edgelist *edge);
+extern struct edgelist *t1_SwathUnion(struct edgelist *before0,struct edgelist *edge);
+extern struct edgelist *swathrightmost(struct edgelist *before,struct edgelist *edge);
+static int touches(int h,short *left,short *right);
+static int crosses(int h,short *left,short *right);
+static void cedgemin(int, pel *, pel);
+static void cedgemax(int, pel *, pel);
+static void edgemin(int, pel *, pel *);
+static void edgemax(int, pel *, pel *);
+static void discard(struct edgelist *left,struct edgelist *right);
+extern void t1_MoveEdges(struct region *R,long dx,long dy);
+extern void t1_UnJumble(struct region *region);
+static int OptimizeRegion(struct region *R);
+extern void t1_MoreWorkArea(struct region *R,long x1,long y1,long x2,long y2);
+extern struct region *t1_BoxClip(struct region *R,short xmin,short ymin,short xmax,short ymax);
+extern struct segment *t1_RegionBounds(struct region *R);
+extern void t1_DumpArea(struct region *area);
+extern void t1_DumpEdges(struct edgelist *edges);
+static int edgecheck(struct edgelist *edge,int oldmin,int oldmax);
+scanfont.c
+/* struct ps_obj *MakeEncodingArrayP(struct *encodingTable); */
+extern int Init_BuiltInEncoding(void);
+static int getNextValue(int valueType);
+static int getInt(void);
+static int getEncoding(struct ps_obj *arrayP);
+static int getArray(struct ps_obj *arrayP);
+static int getName(char *nameP);
+static int getNbytes(int N);
+static int getLiteralName(struct ps_obj *nameObjP);
+static int BuildSubrs(struct ps_font *FontP);
+static int BuildCharStrings(struct ps_font *FontP);
+static int BuildFontInfo(struct ps_font *fontP);
+static int BuildPrivate(struct ps_font *fontP);
+static int GetType1Blues(struct ps_font *fontP);
+extern struct ps_obj *GetType1CharString(struct ps_font *fontP,unsigned char code);
+static int FindDictValue(struct ps_dict *dictP);
+extern int scan_font(struct ps_font *FontP);
+sexpr.c
+extern int main(int argc,char **argv );
+spaces.c
+extern struct XYspace *t1_CopySpace(struct XYspace *S);
+static void ConsiderContext(struct xobject *obj,double (*M)[2]);
+extern void FXYConvert(struct fractpoint *pt,struct XYspace *S,double x,double y);
+extern void IXYConvert(struct fractpoint *pt,struct XYspace *S,long x,long y);
+extern void ForceFloat(struct fractpoint *pt,struct XYspace *S,long x,long y);
+extern long FXYboth(double cx,double cy,double x,double y);
+extern long FXonly(double cx,double cy,double x,double y);
+extern long FYonly(double cx,double cy,double x,double y);
+extern long IXYboth(long cx,long cy,long x,long y);
+extern long IXonly(long cx,long cy,long x,long y);
+extern long IYonly(long cx,long cy,long x,long y);
+extern long FPXYboth(long cx,long cy,long x,long y);
+extern long FPXonly(long cx,long cy,long x,long y);
+extern long FPYonly(long cx,long cy,long x,long y);
+static void FillOutFcns(struct XYspace *S);
+static void FindFfcn(double cx,double cy,long (**fcnP )(void));
+static void FindIfcn(double cx,double cy,long *icxP,long *icyP,long (**fcnP )(void));
+extern void t1_UnConvert(struct XYspace *S,struct fractpoint *pt,double *xp,double *yp);
+extern struct xobject *t1_Xform(struct xobject *obj,double (*M)[2]);
+extern struct xobject *t1_Transform(struct xobject *obj,double cxx,double cyx,double cxy,double cyy);
+extern struct xobject *t1_Scale(struct xobject *obj,double sx,double sy);
+extern void t1_PseudoSpace(struct XYspace *S,double (*M)[2]);
+extern void t1_MMultiply(double (*A)[2],double (*B)[2],double (*C)[2]);
+extern void t1_MInvert(double (*M)[2],double (*Mprime)[2]);
+extern void t1_InitSpaces(void);
+extern void t1_QuerySpace(struct XYspace *S,double *cxxP,double *cyxP,double *cxyP,double *cyyP);
+extern void t1_FormatFP(char *str,long fpel);
+extern void t1_DumpSpace(struct XYspace *S);
+strexpr.c
+extern struct val *make_int(int i);
+extern struct val *make_str(char *s);
+extern void free_value(struct val *vp);
+extern int is_integer(struct val *vp,int *r);
+extern int to_integer(struct val *vp);
+extern void to_string(struct val *vp);
+extern void nexttoken(void);
+extern struct val *eval6(void);
+extern struct val *eval4(void);
+extern struct val *eval3(void);
+extern int strexpr(int *result,char *expression);
+t1funcs.c
+extern int Type1OpenScalable(char **ev ,struct _Font **ppFont ,int flags,struct _FontEntry *entry,char *fileName,struct _FontScalable *vals,unsigned long format,unsigned long fmask,double efactor,double slant);
+static int Type1GetGlyphs(struct _Font *pFont,unsigned long count,unsigned char *chars,int charEncoding,unsigned long *glyphCount,struct _CharInfo **glyphs );
+/* int Type1GetMetrics(struct _Font *pFont,unsigned long count,unsigned char *chars,int charEncoding,unsigned long *glyphCount,struct **glyphs ); */
+extern void Type1CloseFont(struct _Font *pFont);
+static void fill(char *dest,int h,int w,struct region *area,int byte,int bit,int wordsize);
+static void fillrun(char *p,short x0,short x1,int bit);
+extern int Type1RegisterFontFileFunctions(void);
+t1info.c
+static void FillHeader(struct _FontInfo *pInfo,struct _FontScalable *Vals);
+/* void adjust_min_max(struct *minc,struct *maxc,struct *tmp); */
+static void ComputeBounds(struct _FontInfo *pInfo,struct _CharInfo *pChars,struct _FontScalable *Vals);
+static void ComputeProps(struct _FontInfo *pInfo,struct _FontScalable *Vals,char *Filename);
+static void ComputeStdProps(struct _FontInfo *pInfo,struct _FontScalable *Vals,char *Filename,char *Fontname);
+extern int Type1GetInfoScalable(struct _FontPathElement *fpe,struct _FontInfo *pInfo,struct _FontEntry *entry,struct _FontName *fontName,char *fileName,struct _FontScalable *Vals);
+extern void T1FillFontInfo(struct _Font *pFont,struct _FontScalable *Vals,char *Filename,char *Fontname);
+extern void T1InitStdProps(void);
+t1io.c
+extern struct F_FILE *T1Open(char *fn,char *mode);
+extern int T1Getc(struct F_FILE *f);
+extern int T1Ungetc(int c,struct F_FILE *f);
+extern int T1Read(char *buffP,int size,int n,struct F_FILE *f);
+extern int T1Close(struct F_FILE *f);
+extern struct F_FILE *T1eexec(struct F_FILE *f);
+static int T1Decrypt(unsigned char *p,int len);
+static int T1Fill(struct F_FILE *f);
+t1snap.c
+extern unsigned __int64 __stdcall Int64ShllMod32(unsigned __int64 Value,unsigned long ShiftCount);
+extern __int64 __stdcall Int64ShraMod32(__int64 Value,unsigned long ShiftCount);
+extern unsigned __int64 __stdcall Int64ShrlMod32(unsigned __int64 Value,unsigned long ShiftCount);
+extern void *GetFiberData(void );
+extern void *GetCurrentFiber(void );
+extern struct segment *t1_Phantom(struct xobject *obj);
+extern struct xobject *t1_Snap(struct segment *p);
+t1stub.c
+extern int xiStub(void);
+extern void t1_DumpText(struct segment *foo);
+t1test.c
+extern int main(int argc,char **argv );
+extern void Display(struct _CharInfo *glyph);
+extern int T1FillVals(struct _FontScalable *vals);
+extern int CheckFSFormat(int format,int fmask,int *bit,int *byte,int *scan,int *glyph,int *image);
+extern char *MakeAtom(char *p);
+extern int GetClientResolutions(int *resP);
+extern char *Xalloc(int size);
+extern void Xfree(void);
+extern int FontDefaultFormat(void);
+extern int FontFileRegisterRenderer(void);
+extern int GenericGetBitmaps(void);
+extern int GenericGetExtents(void);
+extern int FontParseXLFDName(void);
+extern int FontComputeInfoAccelerators(void);
+texfiles.c
+extern unsigned long num(struct _iobuf *fp,int size);
+extern int snum(struct _iobuf *fp,int size);
+token.c
+static double P10(long exponent);
+static int next_char(int ch);
+static int add_char(int ch);
+static int skip_space(int ch);
+static int skip_comment(int ch);
+static int add_sign(int ch);
+static int add_1st_digits(int ch);
+static int add_digits(int ch);
+static int add_1st_decpt(int ch);
+static int add_decpt(int ch);
+static int add_fraction(int ch);
+static int add_e_sign(int ch);
+static int add_exponent(int ch);
+static int add_radix(int ch);
+static int add_r_digits(int ch);
+static int RADIX_NUMBER(int ch);
+static int INTEGER(int ch);
+static int REAL(int ch);
+static int HEX_STRING(int ch);
+static void save_digraph(int ch);
+static int STRING(int ch);
+static int AAH_NAME(int ch);
+static int NAME(int ch);
+static int LITERAL_NAME(int ch);
+static int IMMED_NAME(int ch);
+static int OOPS_NAME(int ch);
+static int RIGHT_ANGLE(int ch);
+static int RIGHT_PAREN(int ch);
+static int LEFT_BRACE(int ch);
+static int RIGHT_BRACE(int ch);
+static int LEFT_BRACKET(int ch);
+static int RIGHT_BRACKET(int ch);
+static int BREAK_SIGNAL(int ch);
+static int NO_TOKEN(int ch);
+extern void scan_token(struct ps_obj *inputP);
+type1.c
+static int ComputeAlignmentZones(void);
+static int InitStems(void);
+static int FinitStems(void);
+static void ComputeStem(int stemno);
+static struct segment *Applyhint(struct segment *p,int stemnumber,int half);
+static struct segment *Applyrevhint(struct segment *p,int stemnumber,int half);
+static struct segment *FindStems(double x,double y,double dx,double dy);
+static void ClearStack(void);
+static void Push(double Num);
+static void ClearCallStack(void);
+static void PushCall(struct ps_obj *CurrStrP,int CurrIndex,unsigned short CurrKey);
+static void PopCall(struct ps_obj **CurrStrPP ,int *CurrIndexP,unsigned short *CurrKeyP);
+static void ClearPSFakeStack(void);
+static void PSFakePush(double Num);
+static double PSFakePop(void);
+static struct segment *CenterStem(double edge1,double edge2);
+static unsigned char Decrypt(unsigned char cipher);
+static int DoRead(int *CodeP);
+static void StartDecrypt(void);
+static void Decode(int Code);
+static void DoCommand(int Code);
+static void Type1Escape(int Code);
+static void HStem(double y,double dy);
+static void VStem(double x,double dx);
+static void RLineTo(double dx,double dy);
+static void RRCurveTo(double dx1,double dy1,double dx2,double dy2,double dx3,double dy3);
+static void DoClosePath(void);
+static void CallSubr(int subrno);
+static void Return(void);
+static void EndChar(void);
+static void RMoveTo(double dx,double dy);
+static void DotSection(void);
+static void Seac(double asb,double adx,double ady,unsigned char bchar,unsigned char achar);
+static void Sbw(double sbx,double sby,double wx,double wy);
+static double Div(double num1,double num2);
+static void FlxProc(double c1x2,double c1y2,double c3x0,double c3y0,double c3x1,double c3y1,double c3x2,double c3y2,double c4x0,double c4y0,double c4x1,double c4y1,double c4x2,double c4y2,double epY,double epX,int idmin);
+static void FlxProc1(void);
+static void FlxProc2(void);
+static void HintReplace(void);
+static void CallOtherSubr(int othersubrno);
+static void SetCurrentPoint(double x,double y);
+extern struct xobject *Type1Char(char *env,struct XYspace *S,struct ps_obj *charstrP,struct ps_obj *subrsP,struct ps_obj *osubrsP,struct blues_struct *bluesP,int *modeP);
+util.c
+extern int vm_init(void);
+extern char *vm_alloc(unsigned int bytes);
+extern void objFormatInteger(struct ps_obj *objP,int value);
+extern void objFormatReal(struct ps_obj *objP,double value);
+extern void objFormatBoolean(struct ps_obj *objP,int value);
+extern void objFormatEncoding(struct ps_obj *objP,int length,struct ps_obj *valueP);
+extern void objFormatArray(struct ps_obj *objP,int length,struct ps_obj *valueP);
+extern void objFormatString(struct ps_obj *objP,int length,char *valueP);
+extern void objFormatName(struct ps_obj *objP,int length,char *valueP);
+extern void objFormatFile(struct ps_obj *objP,struct _iobuf *valueP);
diff --git a/fonts/utilities/ps2pk/ps2pk.1 b/fonts/utilities/ps2pk/ps2pk.1
new file mode 100644
index 0000000000..47cf209269
--- /dev/null
+++ b/fonts/utilities/ps2pk/ps2pk.1
@@ -0,0 +1,159 @@
+.TH PS2PK 1 "1 Feb 2016"
+.SH NAME
+ps2pk \- creates a TeX pkfont from a type1 PostScript font
+.SH SYNOPSIS
+ps2pk
+[ -v ]
+[ -e\fIenc\fP ]
+[ -X\fIxres\fP ]
+[ -E\fIexpansion\fP ]
+[ -S\fIslant\fP ]
+[ -P\fIpointsize\fP ]
+[ -R\fIbaseres\fP ]
+[ -r\fIaspectratio\fP ]
+[ -Y\fIyres\fP ]
+[ -a\fIAFMfile\fP ]
+[ -m\fImodename\fP ]
+type1 [pkfont]
+.SH DESCRIPTION
+This program renders a given type1 PostScript font at a given pointsize
+(default 10.0 points) and resolution (default 300dpi) into a TeX pkfont.
+.PP
+To generate the pkfont ps2pk needs a valid type1 font file (for
+example Utopia-Regular, Utopia-Regula.pfb or Utopia-Regula.pfa) and
+its corresponding AFM-file (Utopia-Regular.afm) with the font metrics.
+The program accepts both the binary type1 format (Utopia-Regula.pfb)
+and its ASCII equivalent (Utopia-Regular or Utopia-Regula.pfa). To
+locate the files, ps2pk uses the kpathsea library (see the info page
+on kpathsea). Additionally, pfb and pfa files are searched for in the
+directory specified in the environment variable T1INPUTS, and afm
+files are searched in AFMFONTS, if they are set (the -v flag will
+report which filenames are looked for).
+.PP
+The program will make a pkfont in which the character codes are derived
+from their AFM (Adobe Font Metrics) defined values. This can be
+overruled by specifying an explicit encoding file via the -e option.
+The encoding file \fIenc\fP
+should contain a valid PostScript encoding containing PostScript names
+like /hyphen. Here is an incomplete example (see afm2tfm for complete
+syntax):
+
+.RS
+.nf
+% This is the EC encoding.
+/ECEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut
+ /ring /caron /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+
+ (Rest of lines omitted.)
+
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde
+ /odieresis /oe /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /germandbls ] def
+.fi
+.RE
+.PP
+Options and arguments:
+.IP -a\fIAFMfile\fP 12
+Overrules the name that is used to locate the AFM file.
+
+.IP -e\fIenc\fP 12
+Name of a file containing an encoding scheme
+(default \- the encoding named in the AFM-file is used).
+The actual PostScript name of the encoding scheme is written
+as a "special" at the end of the pkfont.
+
+.IP -E\fIextension\fP 12
+The extension factor (real value, default 1.0).
+
+.IP -m\fImodename\fP 12
+A modename such as would be used by METAFONT (default "Unknown mode").
+
+.IP -P\fIpointsize\fP 12
+The desired pointsize (real value, default 10.0 points).
+
+.IP -R\fIbaseres\fP 12
+The desired base resolution (integer value, default 300 dpi).
+If this differs from the value of \fIxres\fP, the appropriate
+magnification will be shown in the "specials" at the end
+of the pkfont. If possible, this will be expressed as a
+magstep, otherwise as a real number. For example, a pkfont with an \fIxres\fP
+of 329, using the default base resolution of 300,
+will include the "special" text "mag=magstep(0.5)" at the
+end of the font.
+
+.IP -r\fIaspectratio\fP 12
+The desired aspect ratio (expression, integerY/integerX, default 300/300).
+This will be shown in the "specials" at the end
+of the pkfont. Setting the aspect ratio creates a value for
+\fIyres\fP but an explicit \fIyres\fP value will take precedence.
+Argument must be in "" if spaces are left around `/'.
+
+.IP -S\fIslant\fP 12
+The slant (real value, default 0.0).
+
+.IP -X\fIxres\fP 12
+The resolution in the X direction (integer value, default 300 dpi).
+
+.IP -Y\fIyres\fP 12
+The resolution in the Y direction (integer value, default the value
+of \fIxres\fP). If \fIyres\fP differs from \fIxres\fP, a "special"
+text giving the aspect ratio will be written at the end of the
+pkfont.
+
+.IP -v 12
+Verbose flag. (Tells what the program is doing.)
+
+.IP type1 12
+The name of the PostScript type1 font. The name of the AFM-file will be
+constructed from this name by removing the extension (if suplied) and
+adding ".afm". The PostScript "FontName" is extracted from the
+AFM-file and written into a "special" at the end of the pkfont.
+
+.IP [pkfont] 12
+The name of the resulting pkfont can be overruled with this name. The
+default name of pkfont is derived from the basename of the type1
+font, the pointsize and \fIxres\fP. For example
+`ps2pk -P17.28 Utopia-Regular' will result in `Utopia-Regular17.300pk'.
+An explicit value for the name of the pkfont is necessary when
+the type1 font name already shows the point size, otherwise
+the \fIpointsize\fP value is catenated on to the pkfont basename
+which is usually not what is wanted.
+
+.PP
+The following PK "specials" provide an internal check on the
+characteristics of the pkfont, in accordance with the recommendations
+of the TeX Working Group on the TeX Directory Standard (TWG-TDS):
+.br
+"fontid=\fIFontName\fP", "codingscheme=\fIEncoding\fP", "fontfacebyte", "mag",
+"mode=(ps2pk)\fImodename\fP", "pixels-per-inch", and "aspect-ratio" if it
+is other than unity.
+
+.SH ACKNOWLEDGEMENT
+This program uses the Type1 hinting and rendering software IBM
+has donated to the X Consortium.
+
+.SH SEE ALSO
+.nf
+`METAFONT: The Program', Donald Knuth.
+`The GFtoPK processor', belonging to the METAFONTware.
+`Adobe Font Metric Files', Version 3.0, PostScript Developer
+Support Group.
+afm2tfm(1)
+pk2bm(1)
+kpsewhich(1)
+info kpathsea
+
+.SH VERSION
+1.4 (January 1994)
+
+.SH AUTHOR
+Piet Tutelaers,
+modified for ps2pkm by Pierre A. Mackay.
+This manpage was adapted to teTeX by Frank Kuester.
+.PP
+Maintained in TeX Live; please send bug reports or other correspondence
+to tex-k@tug.org (http://lists.tug.org/tex-k).
diff --git a/fonts/utilities/ps2pk/ps2pk.c b/fonts/utilities/ps2pk/ps2pk.c
new file mode 100644
index 0000000000..c59d9a7f82
--- /dev/null
+++ b/fonts/utilities/ps2pk/ps2pk.c
@@ -0,0 +1,708 @@
+/*
+ * NAME
+ * ps2pk - creates a PK font from a type1 PostScript font
+ * SYNOPSIS:
+ * ps2pk [options] type1 [pkname]
+ * DESCRIPTION
+ * This program renders a given type1 PostScript font at a given
+ * pointsize (default 10.0 points) and resolution (default 300dpi)
+ * into a TeX PK font.
+ *
+ * To generate the PK font ps2pk needs a valid type1 fontname (for
+ * example Utopia-Regular.pfa) and its corresponding AFMfile
+ * (Utopia-Regular.afm). The program accepts both the MSDOS binary
+ * type1 format (Utopia-Regula.pfb) and its UNIX ASCII equivalent
+ * (Utopia-Regula.pfa). The resulting PK font does contain all
+ * characters for which the C-code is non negative. This can be
+ * overruled by specifying an explicit <encoding> via the -e<encoding>
+ * option. Character codes in AFM files are specified as integer values
+ * after the C, for example Utopia-Regular.afm provides:
+ * C 251 ; WX 601 ; N germandbls ; B 22 -12 573 742 ;
+ * C -1 ; WX 380 ; N onesuperior ; B 81 272 307 680 ;
+ *
+ * The `germandbls' has code 251 and `onesuperior' -1 which means
+ * that this character is not part of the default AdobeStandard-
+ * Encoding scheme. To get this `onesuperior' you have to add it to
+ * an encoding vector as described in the PostScript manuals. But of
+ * course it is better to use standard encodings, like the one provided
+ * with the new psfonts. This `TeXBase1Encoding' encoding does contain
+ * all names of characters as defined in the 256 character TeX fonts.
+ *
+ * The location of files for ps2pk, since version 1.5, has been
+ * improved using PostScript resource databases. These databases
+ * can be created using Adobe's mkpsres(1) utility. On UNIX the
+ * default name is PSres.upr and can be found in directories like
+ * /usr/lib/DPS depending on the machine you are using. The
+ * following example of an UPR file contains three resources
+ * PS-Resources-1.0
+ * Encoding
+ * FontAFM
+ * FontOutline
+ * .
+ * //usr/local/tex/fonts/type1faces
+ * Encoding
+ * ECEncoding=EC.enc
+ * .
+ * FontAFM
+ * Courier=ResidentFonts/Courier.pfa
+ * .
+ * FontOutline
+ * Courier=ResidentFonts/Courier.afm
+ * .
+ *
+ * When this UPR is in the PSRESOURCEPATH ps2pk can make an EC encoded
+ * PK font for Courier with:
+ *
+ * ps2pk -eECEncoding Courier
+ *
+ * It is also possible without the UPR file but then you have to
+ * set T1INPUTS to the directories containing the files you need,
+ * for example:
+ *
+ * setenv T1INPUTS /usr/local/tex/fonts/type1faces//
+ *
+ * and to run ps2pk by providing the proper filenames:
+ *
+ * ps2pk -eEC.enc Courier.pfa
+ *
+ * In both cases the result will be the PK font Courier10.300pk.
+ *
+ * PostScript resource databases eliminate the need for recursive
+ * directory search, this is done by mkpsres(1) instead. And all
+ * resources can be stored in one directory per computer keeping
+ * maintenance easy. Another advantage is the mapping of internal
+ * PostScript names, which are case sensitive and not restricted to
+ * MSDOS limitations, to external platform dependant filenames in
+ * a very natural way. On a MSDOS computer psres.dpr (the equivalent
+ * of PSres.upr) could be:
+ * PS-Resources-1.0
+ * Encoding
+ * FontAFM
+ * FontOutline
+ * .
+ * Encoding
+ * TeXBase1Encoding=c:\emtex\dvips\8r.enc
+ * .
+ * FontAFM
+ * Courier=c:\psfonts\com_____.pfb
+ * .
+ * FontOutline
+ * Courier=c:\psfonts\afm\com_____.afm
+ * .
+ *
+ * Given this psres.dpr resource database
+ *
+ * ps2pk -eTeXBase1Encoding Courier
+ *
+ * will create Courier10.300pk. Unfortunately MSDOS will abbreviate
+ * this name to COURIER1.300. Mkpsres(1) is an improved version
+ * of Adobe's makepsres(1) that runs on UNIX and MSDOS. This program
+ * will treat PFB fonts and PFM fonts correctly and recognize
+ * filenames ending with ".enc" as encoding vectors.
+ *
+ * If the name of <type1font> does not contain an explicit extension
+ * or directory separator it is considered as the name of a resource.
+ * Otherwise as a filename. You can not mix up resource names and file-
+ * names. Filenames must have an extension!
+ *
+ * OPTIONS AND ARGUMENTS
+ * -a<AFM> The name of the AFM resource or file can be
+ * overruled with this option.
+ * -e<encoding> The encoding scheme (default the encoding from the
+ * AFM file is used).
+ * -E<extension> The extension factor (real value, default 1.0).
+ * -O Create old checksums (for compatibility)
+ * -P<pointsize> The desired pointsize (real value, default 10.0
+ * points). PK fonts created with a value different
+ * to 10.0 will cause dvips warnings `dvips: Design
+ * size mismatch in font ...'.
+ * -R<baseres> The base resolution (integer value, default 300
+ * dpi). Only used for creating METAFONT compatible
+ * identification strings in PK postamble.
+ * -S<slant> The slant (real value, default 0.0).
+ * -X<xres> The resolution (integer value) in the X direction
+ * (default 300 dpi).
+ * -Y<yres> The resolution (integer value) in the Y direction
+ * (defaults to the value of <xres>).
+ * -d Debug stat() calls during recursive path searching
+ * -v Verbose flag. (Tells what the program is doing.)
+ *
+ * type1font The name of the PostScript type 1 font. When no
+ * explicit AFMfile is given via the -a option the
+ * name of the AFMfile will be constructed from this
+ * name by removing the extension (if supplied) and
+ * adding ".afm".
+ * [pkname] The name of the resulting PK font can be overruled
+ * with this name. The default name of the PK font is
+ * derived from the basename of the type1 font, the
+ * pointsize and <xres>. For example:
+ * ps2pk -P17.28 Utopia-Regular
+ * will result in:
+ * Utopia-Regular17.300pk
+ *
+ * ENVIRONMENTS
+ *
+ * PSRESOURCEPATH
+ * The path used for locating PS resource database files (PSres.upr
+ * on UNIX and psres.dpr on MSDOS). The default of the path will be
+ * shown by running ps2pk with the -v flag and a non-existant resource
+ * name.
+ *
+ * T1INPUTS
+ * The path used for locating PS type1 fonts, their AFM files and
+ * encoding vectors. Path may contain '//' (UNIX) or '!!' (MSDOS) to
+ * force ps2pk to look into subdirectories. Using PSRESOURCEPATH
+ * instead of T1INPUTS avoids recursion. The default of the path will
+ * be shown by running ps2pk with the -v flag and a non-existant
+ * filename.
+ *
+ * ACKNOWLEDGEMENTS
+ * This program uses the type1 hinting and rendering software IBM
+ * has donated to the X-consortium.
+ *
+ * Since version 1.5 the lookup of PS resources as described in
+ * `Programming the Display PostScript System with X (Appendix A:
+ * Locating PostScript Resources)' from Adobe Systems is used.
+ * SEE ALSO
+ * ``METAFONT: The Program'', Donald Knuth.
+ * ``The GFtoPK processor'', belonging to the METAFONTware.
+ * afm2tfm(1)
+ * mkpsres(1)
+ * mtpk(1)
+ * pk2bm(1)
+ * pkfonts(1)
+ * AUTHOR
+ * Piet Tutelaers
+ */
+
+#include "basics.h" /* basic definitions and fatal() */
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/* PostScript Resource lookup functions */
+/*
+#include "PSres.h"
+*/
+#include "filenames.h" /* newname(), extension(), ps_resource() */
+#include "psearch.h" /* path search functions */
+#include "pkout.h" /* PK output functions */
+
+/* begin interface to type 1 software */
+#include "ffilest.h"
+
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "t1stdio.h"
+#include "util.h"
+#include "fontfcn.h"
+
+FontScalableRec vals;
+FontEntryRec entry;
+#define Succesful 85
+/* end interface to type 1 software */
+
+char *encfile = NULL, *afmfile;
+
+char ps2pk_args[MAXSTRLEN] = "none"; /* essential ps2pk arguments */
+
+#define POINTSPERINCH 72.27
+#define DEFAULTRES 300
+#define DEFAULTPOINTSIZE 10.0
+
+double pointsize = 0.0; /* wanted pointsize */
+int W, H, /* width and height of character glyph */
+ base_resolution = DEFAULTRES,
+ x_resolution = 0,
+ y_resolution = 0;
+
+int verbose = 0, debug = 0;
+
+/* Provide old (-O flag) and new (default) checksum function */
+static uint32_t checksum(encoding, int [256]);
+static uint32_t old_checksum(encoding, int [256]);
+uint32_t (*pchecksum)(encoding, int [256]) = checksum;
+
+/* Prototypes */
+static int next_pixel(void);
+#if 0
+static void print_pixmap(void);
+#endif
+static void first_pixel(CharInfoRec *);
+static int32_t TFMwidth(int);
+static int h_escapement(int);
+static void add_option(const char *, const char *);
+
+int main(int argc, char *argv[])
+{
+ char c;
+ int done, i;
+ const char *myname = "ps2pk";
+ char *psname, *psbasename, *afmname = NULL,
+ *encname = NULL, *psfile = NULL, *psfilebn, pkname[80],
+ *AFM_fontname = NULL,
+ *encodingscheme = NULL;
+
+ FontPtr fontptr;
+ unsigned char glyphcode[1]; /* must be an array */
+ CharInfoRec *glyphs[1];
+ unsigned int count;
+ int charcode, rc = -1, charno;
+ char comment[256];
+ long cs;
+ encoding ev;
+ int WX[256];
+
+ float efactor = 1.0, slant = 0.0;
+
+#ifdef KPATHSEA
+ kpse_set_program_name(argv[0], "ps2pk");
+#endif
+
+ while (--argc > 0 && (*++argv)[0] == '-') {
+ done=0;
+ while ((!done) && (c = *++argv[0])) /* allow -bcK like options */
+ switch (c) {
+ case 'a':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ afmname = argv[0];
+ done = 1;
+ break;
+ case 'd':
+ debug = 1;
+ break;
+ case 'e':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ encname = argv[0];
+ add_option("-e", encname);
+ done = 1;
+ break;
+ case 'E':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ efactor = atof(argv[0]);
+ add_option("-E", argv[0]);
+ done = 1;
+ break;
+ case 'O':
+ pchecksum = old_checksum;
+ add_option("-O", "");
+ break;
+ case 'P':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ pointsize = atof(argv[0]);
+ add_option("-P", argv[0]);
+ done = 1;
+ break;
+ case 'R':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ base_resolution = atoi(argv[0]);
+ add_option("-R", argv[0]);
+ done = 1;
+ break;
+ case 'S':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ slant = atof(argv[0]);
+ add_option("-S", argv[0]);
+ done = 1;
+ break;
+ case 'X':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ x_resolution = atoi(argv[0]); done = 1;
+ if (y_resolution == 0) y_resolution = x_resolution;
+ add_option("-X", argv[0]);
+ break;
+ case 'Y':
+ if (*++argv[0] == '\0') {
+ argc--; argv++;
+ }
+ if (argv[0] == '\0') goto invalid;
+ y_resolution = atoi(argv[0]); done = 1;
+ if (x_resolution == 0) x_resolution = y_resolution;
+ add_option("-Y", argv[0]);
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+invalid:
+ default:
+ fatal("%s: %c invalid option\n", myname, c);
+ }
+ }
+
+ if (argc < 1 || argc >2) {
+ msg ("ps2pk version " PACKAGE_VERSION " (1992-2016)\n");
+ msg ("Usage: %s [options] type1font [pkname]\n", myname);
+ msg ("options: -d -v -e<enc> -X<xres> -E<expansion> -S<slant>\n");
+ fatal("options: -O -P<pointsize> -Y<yres> -a<AFM> -R<baseres>\n");
+ }
+
+ psname = argv[0]; argc--; argv++;
+
+#ifndef KPATHSEA
+ if (ps_resource(psname)) {
+ /* if psname does neither contain a DIRSEP or `.' character
+ * then find the filename of this resource in one of the PS
+ * resource database(s) available in PSRESOURCEPATH.
+ */
+ char **names, **files; int i, count;
+
+ psrespath = path(PSRESOURCEPATH, getenv("PSRESOURCEPATH"));
+ if (verbose) msg("PSRESOURCEPATH := %s\n", psrespath);
+
+ count = ListPSResourceFiles(psrespath, NULL,
+ "FontOutline", psname, &names, &files);
+ if (count == 0)
+ fatal("No FontOutline resource found for %s\n", psname);
+ if (verbose && count > 1) {
+ msg("More than one FontOutline resource for %s\n", psname);
+ for (i = 0; i < count; i++) msg("\t<%s>\n", files[i]);
+ }
+ psfile = files[0];
+ if (verbose) msg("Resource <%s>\n", psfile);
+ psbasename = psname;
+ }
+
+ if (psfile != NULL) {
+ char **names, **files; int count;
+
+ if (afmname == NULL || ps_resource(afmname)) {
+ if (afmname == NULL) afmname = psname;
+ count = ListPSResourceFiles(psrespath, NULL,
+ "FontAFM", afmname, &names, &files);
+ if (count == 0)
+ fatal("No FontAFM resource found for %s\n", afmname);
+ if (verbose && count > 1) {
+ msg("More than one FontAFM resource for %s\n", afmname);
+ for (i = 0; i < count; i++) msg("\t<%s>\n", files[i]);
+ }
+ afmfile = files[0];
+ if (verbose) msg("Resource <%s>\n", afmfile);
+ }
+ else fatal("%s: invalid resource name\n", afmname);
+
+ if (encname != NULL) {
+ if (!ps_resource(encname))
+ fatal("%s: invalid Encoding resource\n", encname);
+ count = ListPSResourceFiles(psrespath, NULL,
+ "Encoding", encname, &names, &files);
+ if (count == 0)
+ fatal("No Encoding resource found for %s\n", encname);
+ if (verbose && count > 1) {
+ msg("More than one Encoding resource for %s\n", encname);
+ for (i = 0; i < count; i++) msg("\t<%s>\n", files[i]);
+ }
+ encfile = files[0];
+ if (verbose) msg("Resource <%s>\n", encfile);
+ }
+ }
+ else { /* No PS resource database or no resource for type1font */
+#endif
+#ifdef KPATHSEA
+ psfile = kpse_find_file(psname,kpse_type1_format,0);
+ if (!psfile) {
+ /* kpse_find_file does not look for alternate suffixes */
+ char *altname = newname(psname, ".pfb");
+ psfile = kpse_find_file(altname, kpse_type1_format, 0);
+ free(altname);
+ }
+ if (!psfile)
+ fatal("%s: PS file %s not found!\n", kpse_invocation_name,
+ psname);
+ if (afmname == NULL)
+ afmname = newname(psname, ".afm");
+ afmfile = kpse_find_file(afmname,kpse_afm_format,0);
+ if (!afmfile)
+ fatal("%s: AFM file %s not found!\n", kpse_invocation_name,
+ afmname);
+
+ if (encname) {
+ encfile = kpse_find_file(encname,kpse_enc_format,0);
+ if (!encfile)
+ fatal("%s: enc file %s not found!\n", kpse_invocation_name,
+ encname);
+ }
+ else
+ encfile = NULL;
+ printf("psfile = %s\n", psfile);
+ printf("afmfile = %s\n", afmfile);
+ if (encfile) printf("encfile = %s\n", encfile);
+#else
+ t1inputs = path(T1INPUTS, getenv("T1INPUTS"));
+ if (verbose) msg("T1INPUTS := %s\n", t1inputs);
+
+ psfile = search_file(t1inputs, psname, FATAL);
+ if (verbose) msg("Font file <%s>\n", psfile);
+
+ if (afmname == NULL) afmname = newname(psfile, ".afm");
+ afmfile = search_file(t1inputs, afmname, FATAL);
+ if (verbose) msg("AFM file <%s>\n", afmfile);
+
+ /* get encoding when -e<enc> provided */
+ if (encname) {
+ encfile = search_file(t1inputs, encname, FATAL);
+ if (verbose) msg("Encoding file <%s>\n", encfile);
+ }
+#endif
+ psbasename = basename(psname, extension(psname));
+#ifndef KPATHSEA
+ }
+#endif
+ psfilebn = basename(psfile, NULL);
+
+ if (pointsize == 0.0) pointsize = DEFAULTPOINTSIZE;
+ if (x_resolution == 0) x_resolution = DEFAULTRES;
+ if (y_resolution == 0) y_resolution = x_resolution;
+ if (verbose)
+ msg("Loading encoding vector from %s ...",
+ encname? encname: basename(afmfile, NULL));
+ getenc(&AFM_fontname, &encodingscheme, ev, WX);
+ if (efactor != 1.0)
+ for (i=0; i < 256; i++) {
+ if (ev[i] == NULL) continue;
+ WX[i] = WX[i] * efactor + 0.5;
+ }
+ if (verbose) msg(" done\n");
+
+ if (argc == 1) strcpy(pkname, argv[0]);
+ else
+ sprintf(pkname, "%s%d.%dpk", psbasename,
+ (int) (pointsize + 0.5), x_resolution);
+
+ /* next values are needed! */
+ vals.x = x_resolution;
+ vals.y = y_resolution;
+ vals.point = 10.0 * pointsize + 0.5; /* DECIPOINTS */
+ vals.pixel = pointsize * y_resolution / POINTSPERINCH + 0.5;
+
+ if (verbose) msg("Checking type1 font %s ...", psfilebn);
+ Type1RegisterFontFileFunctions();
+ if (verbose) msg(" done\n");
+
+ /* next line prevents UNIX core dumps */
+ entry.name.name = "-adobe-utopia-medium-r-normal--0-0-0-0-p-0-iso8859-1";
+ if (verbose)
+ msg("Creating character glyphs for %s ...", psfilebn);
+ rc = Type1OpenScalable(ev, &fontptr, 0, &entry,
+ psfile, &vals, 0, 0, efactor, slant);
+ if (rc != Succesful)
+ fatal("Type1OpenScalable error (result: %d) on %s \n", rc, psfile);
+ if (verbose) msg(" done\n");
+
+ pk_open(pkname);
+ sprintf(comment, "%s rendered at %f points", psbasename, pointsize);
+ cs = pchecksum(ev, WX);
+ pk_preamble(comment, pointsize, cs, x_resolution, y_resolution);
+ charno = 0;
+ if (verbose) msg("Creating %s from %s\n", pkname, psfilebn);
+ for (charcode = 0; charcode < 256; charcode++) {
+ if (ev[charcode] == NULL) continue;
+ glyphcode[0] = charcode;
+ (fontptr->get_glyphs)(fontptr, 1, glyphcode, 0, &count, glyphs);
+ if (count > 0) {
+ if (debug) {
+ msg("'%03o ", charcode); charno++;
+ if (charno == 8) {
+ msg("%c", '\n'); charno = 0;
+ }
+ }
+ first_pixel(glyphs[0]); /* assigns W and H */
+ pk_char(charcode, /* charcode */
+ TFMwidth(WX[charcode]), /* TFMwidth */
+ h_escapement(WX[charcode]), /* h_escapement */
+ W, H, /* width and height */
+ - glyphs[0]->metrics.leftSideBearing, /* h_offset */
+ glyphs[0]->metrics.ascent, /* v_offset */
+ next_pixel); /* pixel generator */
+ }
+ }
+ if (debug) msg("%c", '\n');
+ ps2pk_postamble(psbasename, encodingscheme,
+ base_resolution, x_resolution, y_resolution, pointsize,
+ ps2pk_args);
+ pk_close();
+ exit(0);
+}
+
+/*
+ * The checksum should garantee that our PK file belongs to the correct TFM
+ * file! Exactly the same as the afm2tfm (dvips5487) calculation.
+ */
+static uint32_t old_checksum(encoding ev, int width[256])
+{
+ int i;
+ uint32_t s1 = 0, s2 = 0;
+ char *p ;
+
+ for (i=0; i<256; i++) {
+ if (ev[i] == NULL) continue;
+ s1 = (s1<<1) ^ width[i]; /* left shift */
+ for (p=ev[i]; *p; p++)
+ s2 = s2 * 3 + *p ;
+ }
+ return (s1<<1) ^ s2 ;
+}
+
+/*
+ * The new checksum algorithm.
+ */
+static uint32_t checksum(encoding ev, int width[256])
+{
+ int i;
+ uint32_t s1 = 0, s2 = 0;
+ char *p ;
+
+ for (i=0; i<256; i++) {
+ if (ev[i] == NULL) continue;
+ s1 = ((s1<<1) ^ (s1>>31)) ^ width[i]; /* cyclic left shift */
+ for (p=ev[i]; *p; p++)
+ s2 = s2 * 3 + *p ;
+ }
+ return (s1<<1) ^ s2 ;
+}
+
+static int row, col;
+static int data, bitno;
+static unsigned char *p_data;
+
+static int
+next_pixel(void)
+{
+ int pixel;
+
+ while (row < H) {
+ if (col++ < W) {
+ if (bitno == 0) { data = *p_data++; bitno = 8; }
+ pixel = data & 0x80? BLACK: WHITE;
+ data <<= 1; bitno--; return pixel;
+ }
+ col = 0; row++; bitno = 0;
+ }
+ fatal("Not that many pixels!\n");
+}
+
+static void
+first_pixel(CharInfoRec *G)
+{
+ row = col = 0;
+ p_data = (unsigned char *) G->bits;
+ W = G->metrics.rightSideBearing - G->metrics.leftSideBearing;
+ H = G->metrics.ascent + G->metrics.descent;
+ bitno = 0;
+}
+
+#if 0
+static void
+print_pixmap(void)
+{
+ int c, r;
+ unsigned char *save_p_data;
+
+ save_p_data = p_data;
+ if (W*H == 0) return; /* easy */
+ for (r = 0; r < H; r++) {
+ for (c = 0; c < W; c++)
+ if (next_pixel() == BLACK) msg("%c", 'X');
+ else msg("%c", '.');
+ msg("%c", '\n');
+ }
+ /* reset data for scanning pixmap */
+ p_data = save_p_data;
+ bitno = 0; row = 0; col = 0;
+}
+#endif
+
+/* Next function computes the width as a fix_word. A fix_word is
+ an integer representation for fractions. The decimal point is
+ left from bit 20. (The method is `stolen' from afm2tfm.) */
+
+static int32_t
+TFMwidth(int wx)
+{
+ return (((wx / 1000) << 20) +
+ (((wx % 1000) << 20) + 500) / 1000) ;
+}
+
+static float HXU = -1.0; /* horizontal pixels per design unit */
+
+/* the horizontal escapent is the number of pixels to next origin */
+static int
+h_escapement(int wx)
+{
+ if (HXU == -1.0)
+ HXU = (pointsize * x_resolution) / 72270.0;
+ return wx * HXU + 0.5;
+}
+
+/* add ps2pk option to string */
+static void
+add_option(const char *option, const char *value)
+{
+ static char *p_args = NULL;
+
+ if (p_args == NULL) {
+ p_args = ps2pk_args;
+ sprintf(p_args, "%s%s", option, value);
+ }
+ else
+ sprintf(p_args, " %s%s", option, value);
+ p_args+= strlen(p_args);
+}
+
+/* Next stuff is needed by type1 rendering functions */
+
+int CheckFSFormat(int format, int fmask, int *bit, int *Byte, int *scan,
+ int *glyph, int *image)
+{
+ *bit = *Byte = 1;
+ *glyph = *scan = *image = 1;
+ return Successful;
+
+}
+
+intptr_t MakeAtom(const char *p, unsigned int len, int foo)
+{
+ return (intptr_t)p;
+}
+
+#if 0
+void GetClientResolutions(int *resP)
+{
+ *resP = 0;
+}
+#endif
+
+void *Xalloc(size_t size)
+{
+ void *p;
+ p = malloc(size);
+ if (p == NULL) fatal("Out of memory\n");
+ return p;
+}
+
+void Xfree(void *p)
+{
+ free(p);
+}
diff --git a/fonts/utilities/ps2pk/psearch.c b/fonts/utilities/ps2pk/psearch.c
new file mode 100644
index 0000000000..0d81c57f44
--- /dev/null
+++ b/fonts/utilities/ps2pk/psearch.c
@@ -0,0 +1,557 @@
+/* FILE: psearch.c
+ * PURPOSE: PATH search module
+ * VERSION: 1.7 (December 2014)
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+#define _POSIX_SOURCE 1
+#ifdef ultrix
+#define __POSIX /* otherwise MAXNAMLEN undefined */
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h> /* struct stat */
+#include <dirent.h> /* opendir(), readdir(), closedir() */
+#include "ctype.h" /* isalpha() */
+#include <stdio.h> /* sprintf(), fclose() */
+#include "stdlib.h" /* getenv(), malloc() */
+#include <stdarg.h> /* va_start(), va_arg(), va_end() */
+#include "string.h" /* strcat(), strchr(), strcmp(), strcpy(), strlen(),
+ strncmp(), strncpy(), strstr() */
+#include "basics.h" /* fatal() */
+#include "strexpr.h" /* strexpr() */
+#include "filenames.h" /* equal(), extension() */
+#include "texfiles.h" /* four(), one(), two() */
+
+#ifdef UNIX
+#include <pwd.h> /* getpwnam() */
+
+int tilde = 1; /* Substitute ~ and ~user */
+static char *home = NULL;
+
+/*
+ * During scanning of paths we often need to replace ~user with user's
+ * HOME directory and ~ with HOME directory. Subtilde() copies the actual
+ * value of `~' or `~user' from <path> into <fn>. The pointers <fn> and
+ * <path> are `updated'.
+ */
+void subtilde(char **fn, char **path)
+{ char pattern[32], *p; int i;
+
+ i = 0; p = *path;
+ while (*p != '\0' && *p != DIRSEP && *p != PATHSEP)
+ pattern[i++] = *p++ ;
+ pattern[i] = '\0' ;
+ if (pattern[0] != '~') return;
+ if (pattern[1] == '\0') {
+ if (home == NULL)
+ home = getenv("HOME");
+ if (home == NULL) fatal("You don't have a HOME!\n");
+ sprintf(*fn, "%s\0", home);
+ *fn += strlen(*fn);
+ *path = p;
+ }
+ else {
+ struct passwd *pw;
+ if (pw = getpwnam(&pattern[1])) {
+ sprintf(*fn, "%s\0", pw->pw_dir);
+ *fn += strlen(*fn); *path = p;
+ }
+ else
+ fatal("%s: no such user\n", &pattern[1]) ;
+ }
+}
+#else
+static int tilde = 0; /* Don't substitute ~ and ~user */
+static void subtilde(char **fn, char **path) {}
+#endif
+
+/*
+ * Return a path constructed by <env> and <deFault>. If <env> is empty
+ * the returned path equals <deFault>, otherwise the returned path is
+ * <env> in which empty path elements are replaced by <deFault>. Double
+ * path elements are NOT removed.
+ */
+char *path(char *deFault, char *env) {
+ char *e, *p, *q; int len, left = MAXPATHLEN;
+
+ if (env == NULL) return deFault;
+
+ p = (char *) malloc(MAXPATHLEN);
+ if (p == NULL) fatal("Out of memory\n");
+
+ q = p; e = env;
+ while (*e) {
+ if (*e == PATHSEP) {
+ if (left == MAXPATHLEN) {
+ len = strlen(deFault);
+ if (len > left-1) fatal("'%s' path too long!\n", env);
+ strcpy(q, deFault);
+ q += len; left -= len;
+ *q++ = *e++; left--;
+ }
+ else if (*(e+1) == PATHSEP || *(e+1) == '\0') {
+ *q++ = *e++; left--;
+ len = strlen(deFault);
+ if (len > left) fatal("'%s' path too long!\n", env);
+ strcpy(q, deFault);
+ q += len; left -= len;
+ }
+ else {
+ *q++ = *e++; left--;
+ }
+ }
+ else {
+ *q++ = *e++; left--;
+ }
+ if (left == 0) fatal("'%s' path too long!\n", env);
+ }
+ *q = '\0';
+ return p;
+}
+
+/*
+ * Rsearch() searches <file> through <path>. Recursion introduced by
+ * RECURSIVE string (system dependant) will be followed. Search stops
+ * after first match.
+ */
+static char *rsearch(char *path, char *file)
+{
+ struct stat status;
+ DIR *D;
+ struct dirent *de;
+ int i;
+ char *res = NULL, *ext, *file_ext,
+ head[MAXPATHLEN], target[MAXPATHLEN], *tail;
+ char fn[MAXPATHLEN];
+
+ /* determine head and tail of path */
+ i = 0;
+ while (*(path+i) != '\0' && strncmp(path+i, RECURSIVE, 2) != 0) {
+ head[i] = *(path+i); i++;
+ }
+ head[i] = '\0';
+ if (*(path+i) == '\0') tail = NULL;
+ else tail = path+i+2;
+
+ /* Check if we have found <file> */
+ if (tail == NULL || *tail == '\0') {
+ sprintf(fn, "%s%c%s", head, DIRSEP, file);
+ if (stat(fn, &status) == 0) {
+ res = malloc(strlen(fn)+1);
+ if (res == NULL) fatal("Out of memory\n");
+ strcpy(res, fn);
+ return res;
+ }
+ /* No recursion, so stop */
+ if (tail == NULL) return NULL;
+ }
+
+ if ((D = opendir(head)) == NULL) return NULL;
+ file_ext = extension(file);
+
+ /* now read directories and probe files */
+ while ((de = readdir(D)) != NULL) {
+ /* Ignore `.' and `..' directories */
+ if (strcmp(de->d_name, ".") == 0) continue;
+ if (strcmp(de->d_name, "..") == 0) continue;
+
+ /* Check if we have a directory */
+ sprintf(fn, "%s%c%s", head, DIRSEP, de->d_name);
+ (void) stat(fn, &status);
+ if (!S_ISDIR(status.st_mode)) {
+ /* if we are looking for a file with an extension and we find
+ * files with the same or a different extension we may consider
+ * this directory as a wrong place unless the user has defined
+ * funny directory search paths
+ */
+ if (file_ext && (ext = extension(de->d_name))) {
+ if (equal(ext, ".pk")) break;
+ if (equal(ext, ".vf")) break;
+ if (equal(ext, ".mf")) break;
+ if (equal(ext, ".tfm")) break;
+ if (equal(ext, ".afm")) break;
+ }
+ continue;
+ }
+
+ /* Directories with no real subdirectories can be skipped
+ * unless the file we are looking for is there. Unfortunately
+ * this shortcut only works for UNIX systems. On other systems
+ * the above check on extensions may help.
+ */
+#if defined(UNIX)
+ if (status.st_nlink == 2) {
+ if (strchr(file, DIRSEP)) continue;
+ if ((*tail == '\0') && (res = rsearch(fn, file))) break;
+ continue;
+ }
+#endif
+
+ /* path of the form "/aap/noot/mies//" */
+ if (*tail == '\0') {
+ sprintf(fn, "%s%c%s%s", head, DIRSEP, de->d_name, RECURSIVE);
+ if (res = rsearch(fn, file)) break;
+ continue;
+ }
+
+ /* path of the form "/aap/noot//mies" */
+
+ /* search /aap/noot/<d_name>// <tail>/<file> */
+ sprintf(fn, "%s%c%s%s", head, DIRSEP, de->d_name, RECURSIVE);
+ sprintf(target, "%s%c%s", tail, DIRSEP, file);
+ if (res = rsearch(fn, target)) break;
+ }
+ closedir(D);
+ return res;
+}
+
+/* Is <name> an absolute filename? */
+int absname(char *name) {
+
+ if (*name == DIRSEP) return 1;
+#ifdef MSDOS
+ if (*(name+1) == ':' && *(name+2) == DIRSEP && isalpha(*name)) return 1;
+#endif
+ return 0;
+}
+
+/*
+ * Look for a <file> in <path>. Return absolute filename if found.
+ * If not found return NULL (if <terminate> is 0) or terminate program
+ * with appropriate message (if <terminate> is not equal to 0).
+ */
+char *search_file(char *path, char *file, int terminate) {
+ char *fn, pe[MAXPATHLEN], *ppe, *ppath;
+ struct stat status;
+
+ if (path == NULL || *path == '\0' || absname(file)) {
+ if (stat(file, &status) == 0) return file;
+ if (terminate) fatal("File <%s> not found\n", file);
+ return NULL;
+ }
+ ppath = path;
+ while (*ppath) {
+ /* copy next pathelement into pe */
+ ppe = pe;
+ while (*ppath != PATHSEP && *ppath != '\0') {
+ if (tilde && *ppath == '~')
+ subtilde(&ppe, &ppath);
+ else
+ *ppe++ = *ppath++;
+ }
+ *ppe = '\0';
+ if (*ppath == PATHSEP) ppath++;
+ if (fn = rsearch(pe, file)) return fn;
+ }
+ if (terminate) fatal("File <%s> not found in path \"%s\"\n", file, path);
+ return NULL;
+}
+
+/*
+ * Now some functions for PK font search
+ */
+
+/*
+ * replace <pattern> in <cs> by <value>. If the <pattern> is %b or %d
+ * the value will be converted to a decimal value.
+ */
+static void replace(char *cs, char *pattern, void *value) {
+ char temp[MAXPATHLEN], *p, *q; int len;
+
+ while (q = strstr(cs, pattern)) {
+ strcpy(temp, q+strlen(pattern));
+ switch (*(pattern+1)) {
+ case 'b':
+ case 'd':
+ sprintf(q, "%d", *((int *)value));
+ len = strlen(q);
+ break;
+ case 'F':
+ sprintf(q, "%-8s", (char *) value);
+ len = strlen (q);
+ break;
+ case 'f':
+ sprintf(q, "%s", (char *) value);
+ len = strlen (q);
+ break;
+ default:
+ sprintf(q, "%s", (char *) value);
+ len = strlen (q);
+ break;
+ }
+ strcpy(q+len, temp);
+ }
+}
+
+/*
+ * This function substitutes the <patterns> encountered in <str>
+ * with their corresponding <value>. Recognized patterns are %b, %d,
+ * %f, %F and %m. They will be replaced with their corresponding integer
+ * (%b, %d) or string values (%f, %F and %m). These values can be used as
+ * placeholders for basic resolution (%b), resolution (%d), font name
+ * (%f or %F) or mode definition (%m). The %F is a special case for
+ * representing the fontname leftadjusted in a string of eight characters.
+ */
+
+void substitute(char *str, char *patterns, ...) {
+ va_list ap;
+ char *p;
+ char *svalue; int ivalue;
+
+ /* get arguments ... */
+ va_start(ap, patterns);
+ for (p = patterns; *p; p++) {
+ if (*p != '%') {
+ fatal("%s: invalid format\n");
+ }
+ switch (*++p) {
+ case 'b':
+ ivalue = va_arg(ap, int);
+ replace(str, "%b", &ivalue);
+ break;
+ case 'd':
+ ivalue = va_arg(ap, int);
+ replace(str, "%d", &ivalue);
+ break;
+ case 'F':
+ svalue = va_arg(ap, char *);
+ replace(str, "%F", svalue);
+ break;
+ case 'f':
+ svalue = va_arg(ap, char *);
+ replace(str, "%f", svalue);
+ break;
+ case 'm':
+ svalue = va_arg(ap, char *);
+ replace(str, "%m", svalue);
+ break;
+ case 'p':
+ svalue = va_arg(ap, char *);
+ replace(str, "%p", svalue);
+ break;
+ default:
+ fatal("%s: invalid letter (%c) in format\n", patterns, *p);
+ }
+ }
+ va_end(ap);
+}
+
+/* global font searching parameters */
+static char *_mode = NULL;
+static int _margin = 0, _bdpi = -1;
+static char *_tolerance = NULL;
+
+void init_pksearch(int bdpi, char *mode, int margin, char *tolerance) {
+ _bdpi = bdpi;
+ _mode = mode;
+ _margin = margin;
+ _tolerance = tolerance;
+}
+
+/* evaluate <expr> after substituting %d with <dpi>. Return the
+ * integer result or abort with message when invalid expression.
+ */
+int evaluate(char *expr, int dpi) {
+ char expression[128];
+ int result;
+
+ if (expr == NULL || *expr == '\0') return 0;
+ strcpy(expression, expr);
+ substitute(expression, "%d", dpi);
+ if (strexpr(&result, expression))
+ fatal("%s: expression error\n", expression);
+ return result;
+}
+
+#define INT(x) ((int)(x+0.5))
+
+/*
+ * Round <dpi> to a whole or half magstep if the difference is within
+ * a certain _tolerance from it.
+ */
+int nearesthalf(int dpi) {
+ double near = _bdpi, half = 1.095445115; int tolerance;
+
+ tolerance = evaluate(_tolerance, dpi);
+ if (tolerance == 0 || dpi == _bdpi) return dpi;
+ if (dpi > INT(near)+tolerance)
+ while (dpi > INT(near)+tolerance) near*=half;
+ else if (dpi < INT(near)-tolerance)
+ while (dpi < INT(near)-tolerance) near/=half;
+ if (dpi >= INT(near)-tolerance && dpi <= INT(near)+tolerance)
+ return INT(near);
+ return dpi;
+}
+
+/*
+ * Look for a PK <font> of resolution <dpi> in <path>. To avoid floating
+ * around lots of different font sizes TeX prefers to work with whole
+ * and half magsteps. So instead of using a 330 dpi font for a 11 point
+ * version of a 300 dpi font we would prefer the 329 dpi size because
+ * this size matches magstep 0.5 of 300 (329 = int(300 * 1.2 ** 0.5).
+ * The process of truncating real font sizes to magsteps can be
+ * controlled by the global parameter <tolerance> which may be an
+ * expression of the actual value of <dpi> itself. The value dvips(1)
+ * uses for <tolerance> is 1 + <dpi> / 500 allowing more tolerance in
+ * bigger sizes. Due to round-off different DVI drivers choose different
+ * <dpi> sizes. With <margin> we can define what font sizes are looked
+ * at whenever size <dpi> is wanted. With <margin> set to zero only the
+ * exact size is looked at, while a value of one would allow for a
+ * round-off of one. Both <margin> and <tolerance> can be set before a
+ * search starts otherwise they get their default values (zero) with
+ * init_pksearch().
+ *
+ * When <path> does contain placeholders like %b, %d, %f, %p and %m
+ * they will be substituted by their corresponding values _bdpi, <dpi>,
+ * <font>, "pk" and _mode respectivally. This allows to define paths
+ * for a whole range of printers. Occurrences off ~ or * ~user in <path>
+ * will be substituted by the corresponding HOME directories on UNIX.
+ *
+ * The result of search_pkfile() is a pointer to the name of <font> when
+ * one is found otherwise NULL.
+ */
+char *search_pkfile(char *path, char *texfont, int dpi) {
+ char *ppe, *pkpath, pe[MAXPATHLEN];
+ int del;
+ char *pkname;
+ struct stat status;
+
+ for (del=0; del <= _margin ; del=del>0?-del:-del+1) {
+ pkpath = path;
+ while (*pkpath) {
+ /* copy next pathelement into pe */
+ ppe = pe;
+ while (*pkpath != PATHSEP && *pkpath != '\0') {
+ if (tilde && *pkpath == '~')
+ subtilde(&ppe, &pkpath);
+ else
+ *ppe++ = *pkpath++;
+ }
+ *ppe = '\0';
+ if (strchr(pe, '%')) {
+ if (strstr(pe, "%d") && strstr(pe, "%f")) {
+ /* try filename after replacing placeholders */
+ substitute(pe, "%b%m%f%d%p",
+ _bdpi, _mode, texfont, dpi+del, "pk");
+ if (stat(pe, &status) == 0) {
+ pkname = malloc(strlen(pe)+1);
+ if (pkname == NULL) fatal("Out of memory\n");
+ strcpy(pkname, pe);
+ return pkname;
+ }
+ }
+ else /* %f and %d are required! */
+ fatal("%s: incomplete path element!\n", pe);
+ }
+ else {
+ sprintf(ppe, "%c%s.%dpk", DIRSEP, texfont, dpi+del);
+ if (stat(pe, &status) == 0) {
+ pkname = malloc(strlen(pe)+1);
+ if (pkname == NULL) fatal("Out of memory\n");
+ strcpy(pkname, pe);
+ return pkname;
+ }
+ }
+ if (*pkpath == PATHSEP) pkpath++;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * Functions for handling emTeX's FLI files.
+ */
+
+/*
+ * Look at the fonts in the font library by calling the function <font>.
+ * This function can stop the search by returning a 1 or continue by
+ * returning a zero. In this way we can look for just one font or for
+ * a whole series of fonts. If the search is stopped the name of the
+ * current FLI file is returned otherwise a NULL pointer.
+ */
+char *search_flifile(char *fliname, int (*font)(char *, int)) {
+ unsigned short len, numsizes, numfonts, version1, version2;
+ char fontname[50];
+ int i, size;
+
+ FILE *FLI;
+
+ FLI = fopen(fliname, RB);
+ if (FLI == NULL) return NULL;
+
+ for (i=0; i<4; i++) {
+ fontname[i] = one(FLI); /* read header */
+ }
+ version1 = one(FLI);
+ version2 = one(FLI);
+ if (strncmp(fontname,"FLIB",4)!=0 || version1 != 2 || version2 != 0)
+ fatal("incorrect font library format");
+
+ (void) two(FLI); /* ignore directory length */
+ numsizes = two(FLI); /* number of sizes */
+ numfonts = two(FLI); /* number of fonts */
+ len = two(FLI); /* length of comment */
+ for (i=0; i<len; i++)
+ (void)one(FLI); /* skip comment */
+
+ for ( ;numsizes>0; numsizes--) {
+ /* for each font size in this library */
+ (void)two(FLI); /* length of size entry - ignore */
+ numfonts = two(FLI); /* number of fonts */
+ /* DPI (fixed point 16.16) */
+ size = (int)(four(FLI)/65536.0+0.5);
+
+ for ( ;numfonts > 0; numfonts--) {
+ /* read each entry */
+ (void)four(FLI); /* ignore length of font */
+ (void)four(FLI); /* offset to font */
+ len = one(FLI); /* length of name */
+ for (i=0; i<len; i++)
+ fontname[i] = one(FLI);
+ fontname[len] = '\0';
+ if (font(fontname, size) == 1) {
+ fclose(FLI);
+ return fliname;
+ };
+ }
+ }
+ fclose(FLI);
+ return NULL;
+}
+
+/*
+ * Look for font libraries in <path> (ex.: c:\emtex\texfonts;fli_0;fli_1).
+ * Run <font()> function for each .fli file found in <path>. Continue
+ * if this function returns NULL, stop otherwise.
+ */
+char *search_flipath(char *flipath, int (*font)(char *, int)) {
+ char fn[MAXPATHLEN], *pfn, *pfli, *fliname;
+ int len;
+
+ if (flipath == NULL) fatal("Invalid fli path\n");
+
+ /* treat first element of flipath as a directory */
+ pfn = fn;
+ while (*flipath != PATHSEP && *flipath != '\0') {
+ *pfn++ = *flipath++;
+ }
+ *pfn = '\0'; len = strlen(fn);
+ if (len >= 1 && fn[len-1] != DIRSEP) *pfn++ = DIRSEP;
+
+ /* and next elements as fli files */
+ while (*flipath != '\0') {
+ /* copy next pathelement into fn */
+ pfli = pfn; flipath++;
+ while (*flipath != PATHSEP && *flipath != '\0') {
+ *pfli++ = *flipath++;
+ }
+ *pfli = '\0'; len = strlen(pfn);
+ if (len > 4 && strcmp(pfli-4, ".fli") != 0)
+ strcat(pfli, ".fli");
+ if ((fliname = search_flifile(fn, font)) != NULL)
+ return fliname;
+ }
+ return NULL;
+}
diff --git a/fonts/utilities/ps2pk/psearch.h b/fonts/utilities/ps2pk/psearch.h
new file mode 100644
index 0000000000..333a679e00
--- /dev/null
+++ b/fonts/utilities/ps2pk/psearch.h
@@ -0,0 +1,115 @@
+/* FILE: psearch.h
+ * PURPOSE: PATH search module
+ * VERSION: 1.0 (Oct. 1995)
+ * AUTHOR: Piet Tutelaers
+ * (see README for license)
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/*
+ * This function initiates a path by using a built-in <deFault> and
+ * a PATH environment variable that can be set at run time by the user.
+ * A typical usage is
+ * userenv = path(".:/someplace", getenv("USERENV"))
+ *
+ * If USERENV is not set getenv("USERENV") returns NULL and the returned
+ * path equals the value of the first argument. Otherwise the returned
+ * path is the value of second argument in which empty path elements are
+ * replaced by <deFault>. For example when USERENV is set to "~/myplace:"
+ * the resulting path will be "~myplace:.:/someplace".
+ */
+char *path(char *deFault, char *env);
+
+/*
+ * This function substitutes the <patterns> encountered in <str>
+ * with their corresponding <value>. Recognized patterns are %b, %d,
+ * %f, %F and %m. They will be replaced with their corresponding integer
+ * (%b, %d) or string values (%f, %F and %m). These values can be used as
+ * placeholders for basic resolution (%b), resolution (%d), font name
+ * (%f or %F) or mode definition (%m). The %F is a special case for
+ * representing the fontname leftadjusted in a string of eight characters.
+ */
+void substitute(char *str, char *patterns, ...);
+
+#define NONFATAL 0
+#undef FATAL
+#define FATAL 1
+/*
+ * Look for a <file> in <path>. Return absolute filename if found.
+ * If not found return NULL (if <terminate> is NONFATAL) or terminate
+ * program with appropriate message (if <terminate> is FATAL).
+ * On UNIX ~ or ~someone in paths are evaluated to the proper HOME
+ * directories.
+ * When the path does contain recursion characters ("//" on UNIX and
+ * "!!" on MSDOS) directories are searched recursively.
+ */
+char *search_file(char *path, char *file, int terminate);
+
+/* set global paramaters for PK font search */
+void init_pksearch(int bdpi, char *mode, int margin, char *tolerance);
+
+/*
+ * Look for a PK <font> of resolution <dpi> in <path>. To avoid floating
+ * around lots of different font sizes TeX prefers to work with whole
+ * and half magsteps. So instead of using a 330 dpi font for a 11 point
+ * version of a 300 dpi font we would prefer the 329 dpi size because
+ * this size matches magstep 0.5 of 300 (329 = int(300 * 1.2 ** 0.5).
+ * The process of truncating real font sizes to magsteps can be
+ * controlled by the global parameter <tolerance> which may be an
+ * expression of the actual value of <dpi> itself. The value dvips(1)
+ * uses for <tolerance> is 1 + <dpi> / 500 allowing more tolerance in
+ * bigger sizes. Due to round-off different DVI drivers choose different
+ * <dpi> sizes. With <margin> we can define what font sizes are looked
+ * at whenever size <dpi> is wanted. With <margin> set to zero only the
+ * exact size is looked at, while a value of one would allow for a
+ * round-off of one. Both <margin> and <tolerance> can be set before a
+ * search starts otherwise they get their default values (zero) with
+ * init_pksearch().
+ *
+ * When <path> does contain placeholders like %b, %d, %f, %p and %m
+ * they will be substituted by their corresponding values _bdpi, <dpi>,
+ * <font>, "pk" and _mode respectivally. This allows to define paths
+ * for a whole range of printers. Occurrences off ~ or * ~user in <path>
+ * will be substituted by the corresponding HOME directories on UNIX.
+ *
+ * The result of search_pkfile() is a pointer to the name of <font> when
+ * one is found otherwise NULL.
+ */
+char *search_pkfile(char *path, char *font, int dpi);
+
+/*
+ * evaluate <expr> after substituting %d with <dpi>. Return the
+ * integer result or abort with message when invalid expression.
+ */
+int evaluate(char *expr, int dpi);
+
+/*
+ * Round <dpi> to a whole or half magstep of <bdpi> if the distance of
+ * <dpi> is within a certain <tolerance> from it. The value of <bdpi> and
+ * <tolerance> should be set with init_pksearch().
+ */
+int nearesthalf(int dpi);
+
+extern int tilde;
+
+/*
+ * During scanning of paths we often need to replace ~user with user's
+ * HOME directory and ~ with HOME directory. Subtilde() copies the actual
+ * value of `~' or `~user' from <path> into <fn>. The pointers <fn> and
+ * <path> are `updated'.
+ */
+void subtilde(char **fn, char **path);
+
+/* Is <name> an absolute filename? */
+int absname(char *name);
+
+/*
+ * Look for font libraries in <path> (ex.: c:\emtex\texfonts;fli_0;fli_1).
+ * Run <font()> function for each .fli file found in <path>. Continue
+ * if this function returns 0, stop when if this function return a 1.
+ * In the last case the name of the FLI file is returned.
+ */
+char *search_flipath(char *flipath, int (*font)(char *, int));
+
diff --git a/fonts/utilities/ps2pk/regions.c b/fonts/utilities/ps2pk/regions.c
new file mode 100644
index 0000000000..f1b4b8b470
--- /dev/null
+++ b/fonts/utilities/ps2pk/regions.c
@@ -0,0 +1,1589 @@
+/* $XConsortium: regions.c,v 1.4 91/10/10 11:18:57 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* REGIONS CWEB V0023 LOTS */
+/*
+:h1 id=regions.REGIONS Module - Regions Operator Handler
+
+This module is responsible for creating and manipulating regions.
+
+&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com)
+
+
+:h3.Include Files
+
+The included files are:
+*/
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "curves.h"
+#include "lines.h"
+#include "pictures.h"
+#include "fonts.h"
+#include "hints.h"
+#include "strokes.h" /* to pick up 'DoStroke' */
+static void Unwind(struct edgelist *);
+static void newfilledge(register struct region *, fractpel, fractpel,
+ fractpel, fractpel, int);
+static void vertjoin(register struct edgelist *, register struct edgelist *);
+static void discard(register struct edgelist *, register struct edgelist *);
+static void edgemin(register int, register pel *, register pel *);
+static void edgemax(register int, register pel *, register pel *);
+static struct edgelist *splitedge(struct edgelist *, pel);
+static int touches(int, pel *, pel *);
+static int crosses(int, pel *, pel *);
+static struct edgelist *NewEdge(pel, pel, pel, pel, pel *, int);
+
+/*
+:h3.Functions Provided to the TYPE1IMAGER User
+
+This module provides the following TYPE1IMAGER entry points:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Functions Provided to Other Modules
+
+This module provides the following entry points to other modules:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Macros Provided to Other Modules
+
+:h4.GOING_TO() - Macro Predicate Needed for Changing Direction, Etc.
+
+The actual generation of run end lists (edge boundaries) is left
+to the low level rasterizing modules, LINES and CURVES. There
+are some global region-type
+questions that occur when doing a low-level
+rasterization:
+:ol.
+:li.Did we just change direction in Y and therefore need to start
+a new edge?
+:li.Did we run out of allocated edge space?
+:li.Do the minimum or maximum X values for the current edge need
+updating?
+:eol.
+In general the REGIONS is not smart enough to answer those questions
+itself. (For example, determining if and when a curve changes direction
+may need detailed curve knowledge.) Yet, this must be done efficiently.
+We provide a macro "GOING_TO" where the invoker tells us where it is
+heading for (x2,y2), plus where it is now (x1,y1), plus the current
+region under construction, and the macro answers the questions above.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h2.Data Structures Used to Represent Regions
+
+:h3.The "region" Structure
+
+The region structure is an anchor for a linked list of "edgelist"
+structures (see :hdref refid=edgelist..). It also summarizes the
+information in the edgelist structures (for example, the bounding
+box of the region). And, it contains scratch areas used during
+the creation of a region.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+The ISOPTIMIZED flag tells us if we've put a permanent region in
+'optimal' form.
+*/
+#define ISOPTIMIZED(flag) ((flag)&0x10)
+
+/*
+The ISRECTANGULAR flag tells us if a region is a rectangle. We don't
+always notice rectangles--if this flag is set, the region definitely
+is a rectangle, but some rectangular regions will not have the flag
+set. The flag is used to optimize some paths.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h4."T1_INFINITY" - A Constant Region Structure of Infinite Extent
+
+Infinity is the complement of a null area:
+Note - removed the refcount = 1 init, replaced with references = 2 3-26-91 PNM
+*/
+static struct region t1_infinity = { REGIONTYPE,
+ ISCOMPLEMENT(ON)+ISINFINITE(ON)+ISPERMANENT(ON)+ISIMMORTAL(ON), 2,
+ { 0, 0 }, { 0, 0 },
+ 0, 0, 0, 0,
+ NULL, NULL,
+ 0, 0, 0, 0, 0, NULL, NULL,
+ NULL, 0, NULL, NULL };
+struct region *T1_INFINITY = &t1_infinity;
+
+/*
+:h4."EmptyRegion" - A Region Structure with Zero Area
+
+This structure is used to initialize the region to be built in
+Interior():
+Note - replaced refcount = 1 init with references = 2 3-26-91 PNM
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+struct region EmptyRegion = { REGIONTYPE,
+ ISPERMANENT(ON)+ISIMMORTAL(ON), 2,
+ { 0, 0 }, { 0, 0 },
+ MAXPEL, MAXPEL, MINPEL, MINPEL,
+ NULL, NULL,
+ 0, 0, 0, 0, 0, NULL, NULL,
+ NULL, 0, NULL, NULL };
+
+/*
+:h3 id=edgelist.The "edgelist" Structure
+
+Regions are represented by a linked list of 'edgelist' structures.
+When a region is complete, the structures are paired, one for the
+left and one for the right edge. While a region is being built,
+this rule may be violated temporarily.
+
+An 'edgelist' structure contains the X values for a given span
+of Y values. The (X,Y) pairs define an edge. We use the crack
+and edge coordinate system, so that integer values of X and Y
+go between pels. The edge is defined between the minimum Y and
+maximum Y.
+
+The linked list is kept sorted from top to bottom, that is, in
+increasing y. Also, if 'e1' is an edgelist structure and 'e2' is the
+next one in the list, they must have exactly the same ymin,ymax values
+or be totally disjoint. These two requirements mean that if e2's ymin
+is less than e1's ymax, it must be exactly equal to e1's ymin. A
+sublist of structures with identical ymin and ymax values is called a
+'swath'.
+
+In addition, edgelist structures are separately linked together based
+on what subpath originally created them; each subpath is kept as a
+separate circular linked list. This information is ignored unless
+continuity checking is invoked. See :hdref refid=subpath. for a
+complete description of this.
+*/
+
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+The "edgelist" structure follows the convention of TYPE1IMAGER user
+objects, having a type field and a flag field as the first two
+elements. However, the user never sees "edgelist" structures
+directly; he is given handles to "region" structures only.
+
+By having a type field, we can use the "copy" feature of Allocate()
+to duplicate edge lists quickly.
+
+We also define two flag bits for this structure. The ISDOWN bit is set
+if the edge is going in the direction of increasing Y. The ISAMBIGUOUS
+bit is set if the edge is identical to its neighbor (edge->link); such
+edges may be "left" when they should be "right", or vice versa,
+unnecessarily confusing the continuity checking logic. The FixSubPaths()
+routine in HINTS will swap ambiguous edges if that avoids crossing edges;
+see :hdref refid=fixsubp..
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.KillRegion() - Destroys a Region
+
+KillRegion nominally just decrements the reference count to that region.
+If the reference count becomes 0, all memory associated with it is
+freed. We just follow the linked list, freeing as we go, then kill any
+associated (thresholded) picture.
+Note - added conditional return based on references 3-26-91 PNM
+*/
+
+void KillRegion(
+ register struct region *area) /* area to free */
+{
+ register struct edgelist *p; /* loop variable */
+ register struct edgelist *next; /* loop variable */
+
+ if (area->references < 0)
+ t1_abort("KillRegion: negative reference count");
+ if ( (--(area->references) > 1) ||
+ ( (area->references == 1) && !ISPERMANENT(area->flag) ) )
+ return;
+
+ for (p=area->anchor; p != NULL; p=next) {
+ next = p->link;
+ Free(p);
+ }
+ if (area->thresholded != NULL)
+ KillPicture(area->thresholded);
+ Free(area);
+}
+/*
+:h3.CopyRegion() - Makes a Copy of a Region
+*/
+struct region *CopyRegion(
+ register struct region *area) /* region to duplicate */
+{
+ register struct region *r; /* output region built here */
+ register struct edgelist *last; /* loop variable */
+ register struct edgelist *p,*newp; /* loop variables */
+
+ r = (struct region *)Allocate(sizeof(struct region), area, 0);
+ r->anchor = NULL;
+
+ for (p=area->anchor; VALIDEDGE(p); p=p->link) {
+
+ newp = NewEdge(p->xmin, p->xmax, p->ymin, p->ymax, p->xvalues, ISDOWN(p->flag));
+ if (r->anchor == NULL)
+ r->anchor = last = newp;
+ else
+ last->link = newp;
+
+ last = newp;
+ }
+ if (area->thresholded != NULL)
+ /* replaced DupPicture with Dup() 3-26-91 PNM */
+ r->thresholded = (struct picture *)Dup((struct xobject *)area->thresholded);
+ return(r);
+}
+/*
+:h4.NewEdge() - Allocates and Returns a New "edgelist" Structure
+
+We allocate space for the X values contiguously with the 'edgelist'
+structure that locates them. That way, we only have to free the
+edgelist structure to free all memory associated with it. Damn
+clever, huh?
+*/
+
+static struct edgelist *NewEdge(
+ pel xmin, pel xmax, /* X extent of edge */
+ pel ymin, pel ymax, /* Y extent of edge */
+ pel *xvalues, /* list of X values for entire edge */
+ int isdown) /* flag: TRUE means edge progresses downward */
+{
+ static struct edgelist template = {
+ EDGETYPE, 0, 1, NULL, NULL,
+ 0, 0, 0, 0, NULL };
+
+ register struct edgelist *r; /* returned structure */
+ register int iy; /* ymin adjusted for 'long' alignment purposes */
+
+ IfTrace2((RegionDebug),"....new edge: ymin=%d, ymax=%d ",
+ (int32_t)ymin, (int32_t) ymax);
+ if (ymin >= ymax)
+ t1_abort("newedge: height not positive");
+/*
+We are going to copy the xvalues into a newly allocated area. It
+helps performance if the values are all "long" aligned. We can test
+if the xvalues are long aligned by ANDing the address with the
+(sizeof(long) - 1)--if non zero, the xvalues are not aligned well. We
+set 'iy' to the ymin value that would give us good alignment:
+*/
+#ifdef _WIN64
+ iy = ymin - (((unsigned __int64) xvalues) & (sizeof(int32_t) - 1)) / sizeof(pel);
+#else
+ iy = ymin - (((unsigned long) xvalues) & (sizeof(int32_t) - 1)) / sizeof(pel);
+#endif
+
+ r = (struct edgelist *)Allocate(sizeof(struct edgelist), &template,
+ (ymax - iy) * sizeof(pel));
+
+ if (isdown) r->flag = ISDOWN(ON);
+ r->xmin = xmin;
+ r->xmax = xmax;
+ r->ymin = ymin;
+ r->ymax = ymax;
+
+ r->xvalues = (pel *) FOLLOWING(r);
+ if (ymin != iy) {
+ r->xvalues += ymin - iy;
+ xvalues -= ymin - iy;
+ }
+
+/*
+We must round up (ymax - iy) so we get the ceiling of the number of
+longs. The destination must be able to hold these extra bytes because
+Allocate() makes everything it allocates be in multiples of longs.
+*/
+ INT32COPY(&r[1], xvalues, (ymax - iy) * sizeof(pel) + sizeof(int32_t) - 1);
+
+ IfTrace1((RegionDebug),"result=%p\n", r);
+ return(r);
+}
+
+/*
+:h2.Building Regions
+
+:h3.Interior() - Iterate Through a Path, Building a Region
+
+This routine is the workhorse driver routine that iterates through a
+path, calling the appropriate stepping routines to actually produce the
+run end "edgelist" structures.
+
+:ol.
+:li."Interior" calls StepLine or StepConic or StepBezier as appropriate
+to produce run ends.
+:li.Occasionally these routines will notice a change in Y direction
+and will call ChangeDirection (through the GOING_TO macro); this is
+a call back to the REGIONS module.
+:li.ChangeDirection will call whatever function is in the region
+structure; for Interior, this function is 'newfilledge'.
+:li.Newfilledge will call NewEdge to create a new edgelist structure,
+then, call SortSwath to sort it onto the linked list being built at
+the region "anchor".
+:eol.
+
+By making the function called by ChangeDirection be a parameter of the
+region, we allow the same ChangeDirection logic to be used by stroking.
+*/
+
+static struct edgelist *SortSwath( struct edgelist *, struct edgelist *,
+ struct edgelist *(*)());
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+struct region *Interior(
+ register struct segment *p, /* take interior of this path */
+ register int fillrule) /* rule to follow if path crosses itself */
+{
+ register fractpel x,y; /* keeps ending point of path segment */
+ fractpel lastx,lasty; /* previous x,y from path segment before */
+ register struct region *R; /* region I will build */
+ register struct segment *nextP; /* next segment of path */
+ struct fractpoint hint; /* accumulated hint value */
+ char tempflag; /* flag; is path temporary? */
+ char Cflag; /* flag; should we apply continuity? */
+
+ IfTrace2((MustTraceCalls),". INTERIOR(%p, %d)\n", p, (int32_t) fillrule);
+
+ if (p == NULL)
+ return(NULL);
+/*
+Establish the 'Cflag' continuity flag based on user's fill rule and
+our own 'Continuity' pragmatic (0: never do continuity, 1: do what
+user asked, >1: do it regardless).
+*/
+ if (fillrule > 0) {
+ Cflag = Continuity > 0;
+ fillrule -= CONTINUITY;
+ }
+ else
+ Cflag = Continuity > 1;
+
+ ARGCHECK((fillrule != WINDINGRULE && fillrule != EVENODDRULE),
+ "Interior: bad fill rule", NULL, NULL, (1,p), struct region *);
+
+ if (p->type == TEXTTYPE)
+/* if (fillrule != EVENODDRULE)
+ else */
+ return((struct region *)UniquePath(p));
+ if (p->type == STROKEPATHTYPE) {
+ if (fillrule == WINDINGRULE)
+ return((struct region *)DoStroke(p));
+ else
+ p = CoercePath(p);
+ }
+
+ R = (struct region *)Allocate(sizeof(struct region), &EmptyRegion, 0);
+
+ ARGCHECK(!ISPATHANCHOR(p), "Interior: bad path", p, R, (0), struct region *);
+ ARGCHECK((p->type != MOVETYPE), "Interior: path not closed", p, R, (0), struct region *);
+
+
+/* changed definition from !ISPERMANENT to references <= 1 3-26-91 PNM */
+ tempflag = (p->references <= 1); /* only first segment in path is so marked */
+ if (!ISPERMANENT(p->flag)) p->references -= 1;
+
+ R->newedgefcn = newfilledge;
+/*
+Believe it or not, "R" is now completely initialized. We are counting
+on the copy of template to get other fields the way we want them,
+namely
+:ol.
+:li.anchor = NULL
+:li.xmin, ymin, xmax, ymax, to minimum and maximum values respectively.
+:eol.
+Anchor = NULL is very
+important to ChangeDirection.
+See :hdref refid=CD..
+
+To minimize problems of "wrapping" in our pel arithmetic, we keep an
+origin of the region which is the first move. Hopefully, that keeps
+numbers within plus or minus 32K pels.
+*/
+ R->origin.x = 0/*TOFRACTPEL(NEARESTPEL(p->dest.x))*/;
+ R->origin.y = 0/*TOFRACTPEL(NEARESTPEL(p->dest.y))*/;
+ lastx = - R->origin.x;
+ lasty = - R->origin.y;
+/*
+ChangeDirection initializes other important fields in R, such as
+lastdy, edge, edgeYstop, edgexmin, and edgexmax. The first segment
+is a MOVETYPE, so it will be called first.
+*/
+/*
+The hints data structure must be initialized once for each path.
+*/
+
+ if (ProcessHints)
+ InitHints(); /* initialize hint data structure */
+
+ while (p != NULL) {
+
+ x = lastx + p->dest.x;
+ y = lasty + p->dest.y;
+
+ IfTrace2((HintDebug > 0),"Ending point = (%d,%d)\n", x, y);
+
+ nextP = p->link;
+
+/*
+Here we start the hints processing by initializing the hint value to
+zero. If ProcessHints is FALSE, the value will remain zero.
+Otherwise, hint accumulates the computed hint values.
+*/
+
+ hint.x = hint.y = 0;
+
+/*
+If we are processing hints, and this is a MOVE segment (other than
+the first on the path), we need to close (reverse) any open hints.
+*/
+
+ if (ProcessHints)
+ if ((p->type == MOVETYPE) && (p->last == NULL)) {
+ CloseHints(&hint);
+ IfTrace2((HintDebug>0),"Closed point= (%d,%d)\n",
+ x+hint.x, y+hint.y);
+ }
+
+/*
+Next we run through all the hint segments (if any) attached to this
+segment. If ProcessHints is TRUE, we will accumulate computed hint
+values. In either case, nextP will be advanced to the first non-HINT
+segment (or NULL), and each hint segment will be freed if necessary.
+*/
+
+ while ((nextP != NULL) && (nextP->type == HINTTYPE)) {
+ if (ProcessHints)
+ ProcessHint((struct hintsegment *)nextP, x + hint.x, y + hint.y, &hint);
+
+ {
+ register struct segment *saveP = nextP;
+
+ nextP = nextP->link;
+ if (tempflag)
+ Free(saveP);
+ }
+ }
+
+/*
+We now apply the full hint value to the ending point of the path segment.
+*/
+
+ x += hint.x;
+ y += hint.y;
+
+ IfTrace2((HintDebug>0),"Hinted ending point = (%d,%d)\n", x, y);
+
+ switch(p->type) {
+
+ case LINETYPE:
+ StepLine(R, lastx, lasty, x, y);
+ break;
+
+ case CONICTYPE:
+ {
+
+/*
+For a conic curve, we apply half the hint value to the conic midpoint.
+*/
+
+ }
+ break;
+
+ case BEZIERTYPE:
+ {
+ register struct beziersegment *bp = (struct beziersegment *) p;
+
+/*
+For a Bezier curve, we apply the full hint value to the Bezier C point.
+*/
+
+ StepBezier(R, lastx, lasty,
+ lastx + bp->B.x, lasty + bp->B.y,
+ lastx + bp->C.x + hint.x,
+ lasty + bp->C.y + hint.y,
+ x, y);
+ }
+ break;
+
+ case MOVETYPE:
+/*
+At this point we have encountered a MOVE segment. This breaks the
+path, making it disjoint.
+*/
+ if (p->last == NULL) /* i.e., not first in path */
+ ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0);
+
+ ChangeDirection(CD_FIRST, R, x, y, (fractpel) 0);
+/*
+We'll just double check for closure here. We forgive an appended
+MOVETYPE at the end of the path, if it isn't closed:
+*/
+ if (!ISCLOSED(p->flag) && p->link != NULL)
+ return((struct region *)ArgErr("Fill: sub-path not closed", p, NULL));
+ break;
+
+ default:
+ t1_abort("Interior: path type error");
+ }
+/*
+We're done with this segment. Advance to the next path segment in
+the list, freeing this one if necessary:
+*/
+ lastx = x; lasty = y;
+
+ if (tempflag)
+ Free(p);
+ p = nextP;
+ }
+ ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0);
+ R->ending.x = lastx;
+ R->ending.y = lasty;
+/*
+Finally, clean up the region's based on the user's 'fillrule' request:
+*/
+ if (Cflag)
+ ApplyContinuity(R);
+ if (fillrule == WINDINGRULE)
+ Unwind(R->anchor);
+ return(R);
+}
+/*
+:h4.Unwind() - Discards Edges That Fail the Winding Rule Test
+
+The winding rule says that upward going edges should be paired with
+downward going edges only, and vice versa. So, if two upward edges
+or two downward edges are nominally left/right pairs, Unwind() should
+discard the second one. Everything should balance; we should discard
+an even number of edges; of course, we abort if we don't.
+*/
+static void Unwind(
+ register struct edgelist *area) /* input area modified in place */
+{
+ register struct edgelist *last,*next; /* struct before and after current one */
+ register int y; /* ymin of current swath */
+ register int count,newcount; /* winding count registers */
+
+ IfTrace1((RegionDebug>0),"...Unwind(%p)\n", area);
+
+ while (VALIDEDGE(area)) {
+
+ count = 0;
+ y = area->ymin;
+
+ do {
+ next = area->link;
+
+ if (ISDOWN(area->flag))
+ newcount = count + 1;
+ else
+ newcount = count - 1;
+
+ if (count == 0 || newcount == 0)
+ last = area;
+ else
+ discard(last, next);
+
+ count = newcount;
+ area = next;
+
+ } while (area != NULL && area->ymin == y);
+
+ if (count != 0)
+ t1_abort("Unwind: uneven edges");
+ }
+}
+/*
+:h3."workedge" Array
+
+This is a statically allocated array where edges are built
+before being copied into more permanent storage by NewEdge().
+*/
+
+#ifndef MAXEDGE
+#define MAXEDGE 1000
+#endif
+
+static pel workedge[MAXEDGE];
+static pel *currentworkarea = workedge;
+static pel currentsize = MAXEDGE;
+
+/*
+:h3 id=cd.ChangeDirection() - Called When Y Direction Changes
+
+The rasterizing routines call this entry point when they detect
+a change in Y. We then build the current edge and sort it into
+emerging edgelist at 'anchor' by calling whatever "newedgefcn"
+is appropriate.
+*/
+
+void ChangeDirection(
+ int type, /* CD_FIRST, CD_CONTINUE, or CD_LAST */
+ register struct region *R, /* region in which we are changing direction */
+ fractpel x, fractpel y, /* current beginning x,y */
+ fractpel dy) /* direction and magnitude of change in y */
+{
+ register fractpel ymin,ymax; /* minimum and maximum Y since last call */
+ register pel iy; /* nearest integer pel to 'y' */
+ register pel idy; /* nearest integer pel to 'dy' */
+ register int ydiff; /* allowed Y difference in 'currentworkarea' */
+
+ IfTrace4((RegionDebug>0),"Change Y direction (%d) from (%d,%d), dy=%d\n",
+ (int32_t) type, x, y, dy);
+
+ if (type != CD_FIRST) {
+
+ if (R->lastdy > 0) {
+ ymin = R->firsty;
+ ymax = y;
+ }
+ else {
+ ymin = y;
+ ymax = R->firsty;
+ }
+
+ if (ymax < ymin)
+ t1_abort("negative sized edge?");
+
+
+ /* FIXME: there are not as much parameters as here. */
+ (*R->newedgefcn)(R, R->edgexmin, R->edgexmax, ymin, ymax,
+ R->lastdy > 0 /*, x_at_ymin, x_at_ymax */);
+
+ }
+
+ R->firsty = y;
+ R->firstx = x;
+ R->lastdy = dy;
+
+ iy = NEARESTPEL(y);
+ idy = NEARESTPEL(dy);
+ if (currentworkarea != workedge && idy < MAXEDGE && idy > -MAXEDGE) {
+ NonObjectFree(currentworkarea);
+ currentworkarea = workedge;
+ currentsize = MAXEDGE;
+ }
+ ydiff = currentsize - 1;
+ if (dy > 0) {
+ R->edge = &currentworkarea[-iy];
+ R->edgeYstop = TOFRACTPEL(ydiff + iy) + FPHALF;
+ }
+ else {
+ R->edge = &currentworkarea[ydiff - iy];
+ R->edgeYstop = TOFRACTPEL(iy - ydiff) - FPHALF;
+ }
+ R->edgexmax = R->edgexmin = x;
+/*
+If this is the end of a subpath, we complete the subpath circular
+chain:
+*/
+ if (type == CD_LAST && R->lastedge != NULL) {
+ register struct edgelist *e = R->firstedge;
+
+ while (e->subpath != NULL)
+ e = e->subpath;
+ e->subpath = R->lastedge;
+ R->lastedge = R->firstedge = NULL;
+ }
+}
+/*
+:h3 id=newfill.newfilledge() - Called When We Have a New Edge While Filling
+
+This is the prototypical "newedge" function passed to "Rasterize" and
+stored in "newedgefcn" in the region being built.
+
+If the edge is non-null, we sort it onto the list of edges we are
+building at "anchor".
+
+This function also has to keep the bounding box of the region
+up to date.
+*/
+static struct edgelist *swathxsort(struct edgelist *, struct edgelist *);
+
+static void newfilledge(register struct region *R,
+ fractpel xmin, fractpel xmax, fractpel ymin, fractpel ymax, int isdown)
+{
+ register pel pelxmin,pelymin,pelxmax,pelymax; /* pel versions of bounds */
+ register struct edgelist *edge; /* newly created edge */
+
+ pelymin = NEARESTPEL(ymin);
+ pelymax = NEARESTPEL(ymax);
+ if (pelymin == pelymax)
+ return;
+
+ pelxmin = NEARESTPEL(xmin);
+ pelxmax = NEARESTPEL(xmax);
+
+ if (pelxmin < R->xmin) R->xmin = pelxmin;
+ if (pelxmax > R->xmax) R->xmax = pelxmax;
+ if (pelymin < R->ymin) R->ymin = pelymin;
+ if (pelymax > R->ymax) R->ymax = pelymax;
+
+ edge = NewEdge(pelxmin, pelxmax, pelymin, pelymax, &R->edge[pelymin], isdown);
+ edge->subpath = R->lastedge;
+ R->lastedge = edge;
+ if (R->firstedge == NULL)
+ R->firstedge = edge;
+
+ R->anchor = SortSwath(R->anchor, edge, swathxsort);
+
+}
+
+/*
+:h2.Sorting Edges
+
+:h3.SortSwath() - Vertically Sort an Edge into a Region
+
+This routine sorts an edge or a pair of edges into a growing region,
+so that the region maintains its top-to-bottom, left-to-right form.
+The rules for sorting horizontally may vary depending on what you
+are doing, but the rules for vertical sorting are always the same.
+This routine is passed an argument that is a function that will
+perform the horizontal sort on demand (for example, swathxsort() or
+SwathUnion()).
+
+This is a recursive routine. A new edge (or edge pair) may overlap
+the list I am building in strange and wonderful ways. Edges may
+cross. When this happens, my strategy is to split the incoming edge
+(or the growing list) in two at that point, execute the actual sort on
+the top part of the split, and recursively call myself to figure out
+exactly where the bottom part belongs.
+*/
+
+#define TOP(e) ((e)->ymin) /* the top of an edge (for readability */
+#define BOTTOM(e) ((e)->ymax) /* the bottom of an edge (for readability */
+
+static struct edgelist *SortSwath(
+ struct edgelist *anchor, /* list being built */
+ register struct edgelist *edge, /* incoming edge or pair of edges */
+ struct edgelist *(*swathfcn)()) /* horizontal sorter */
+{
+ register struct edgelist *before,*after;
+ struct edgelist base;
+
+ if (RegionDebug > 0) {
+ IfTrace3(TRUE,"SortSwath(anchor=%p, edge=%p, fcn=%p)\n",
+ anchor, edge, swathfcn);
+ }
+ if (anchor == NULL)
+ return(edge);
+
+ before = &base;
+ before->ymin = before->ymax = MINPEL;
+ before->link = after = anchor;
+
+/*
+If the incoming edge is above the current list, we connect the current
+list to the bottom of the incoming edge. One slight complication is
+if the incoming edge overlaps into the current list. Then, we
+first split the incoming edge in two at the point of overlap and recursively
+call ourselves to sort the bottom of the split into the current list:
+*/
+ if (TOP(edge) < TOP(after)) {
+ if (BOTTOM(edge) > TOP(after)) {
+
+ after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn);
+ }
+ vertjoin(edge, after);
+ return(edge);
+ }
+/*
+At this point the top of edge is not higher than the top of the list,
+which we keep in 'after'. We move the 'after' point down the list,
+until the top of the edge occurs in the swath beginning with 'after'.
+
+If the bottom of 'after' is below the bottom of the edge, we have to
+split the 'after' swath into two parts, at the bottom of the edge.
+If the bottom of 'after' is above the bottom of the swath,
+*/
+
+ while (VALIDEDGE(after)) {
+
+ if (TOP(after) == TOP(edge)) {
+ if (BOTTOM(after) > BOTTOM(edge))
+ vertjoin(after, splitedge(after, BOTTOM(edge)));
+ else if (BOTTOM(after) < BOTTOM(edge)) {
+ after = SortSwath(after,
+ splitedge(edge, BOTTOM(after)), swathfcn);
+ }
+ break;
+ }
+ else if (TOP(after) > TOP(edge)) {
+ IfTrace0((BOTTOM(edge) < TOP(after) && RegionDebug > 0),
+ "SortSwath: disjoint edges\n");
+ if (BOTTOM(edge) > TOP(after)) {
+ after = SortSwath(after,
+ splitedge(edge, TOP(after)), swathfcn);
+ }
+ break;
+ }
+ else if (BOTTOM(after) > TOP(edge))
+ vertjoin(after, splitedge(after, TOP(edge)));
+
+ before = after;
+ after = after->link;
+ }
+
+/*
+At this point 'edge' exactly corresponds in height to the current
+swath pointed to by 'after'.
+*/
+ if (after != NULL && TOP(after) == TOP(edge)) {
+ before = (*swathfcn)(before, edge);
+ after = before->link;
+ }
+/*
+At this point 'after' contains all the edges after 'edge', and 'before'
+contains all the edges before. Whew! A simple matter now of adding
+'edge' to the linked list in its rightful place:
+*/
+ before->link = edge;
+ if (RegionDebug > 1) {
+ IfTrace3(TRUE,"SortSwath: in between %p and %p are %p",
+ before, after, edge);
+ while (edge->link != NULL) {
+ edge = edge->link;
+ IfTrace1(TRUE," and %p", edge);
+ }
+ IfTrace0(TRUE,"\n");
+ }
+ else
+ for (; edge->link != NULL; edge = edge->link) { ; }
+
+ edge->link = after;
+ return(base.link);
+}
+
+/*
+:h3.splitedge() - Split an Edge or Swath in Two at a Given Y Value
+
+This function returns the edge or swath beginning at the Y value, and
+is guaranteed not to change the address of the old swath while splitting
+it.
+*/
+
+static struct edgelist *splitedge(
+ struct edgelist *list, /* area to split */
+ register pel y) /* Y value to split list at */
+{
+ register struct edgelist *new; /* anchor for newly built list */
+ register struct edgelist *last; /* end of newly built list */
+ register struct edgelist *r; /* temp pointer to new structure */
+ register struct edgelist *lastlist; /* temp pointer to last 'list' value */
+
+ IfTrace2((RegionDebug > 1),"splitedge of %p at %d ", list, (int32_t) y);
+
+ lastlist = new = NULL;
+
+ while (list != NULL) {
+ if (y < list->ymin)
+ break;
+ if (y >= list->ymax)
+ t1_abort("splitedge: above top of list");
+ if (y == list->ymin)
+ t1_abort("splitedge: would be null");
+
+ r = (struct edgelist *)Allocate(sizeof(struct edgelist), list, 0);
+/*
+At this point 'r' points to a copy of the single structure at 'list'.
+We will make 'r' be the new split 'edgelist'--the lower half.
+We don't bother to correct 'xmin' and 'xmax', we'll take the
+the pessimistic answer that results from using the old values.
+*/
+ r->ymin = y;
+ r->xvalues = list->xvalues + (y - list->ymin);
+/*
+Note that we do not need to allocate new memory for the X values,
+they can remain with the old "edgelist" structure. We do have to
+update that old structure so it is not as high:
+*/
+ list->ymax = y;
+/*
+Insert 'r' in the subpath chain:
+*/
+ r->subpath = list->subpath;
+ list->subpath = r;
+/*
+Now attach 'r' to the list we are building at 'new', and advance
+'list' to point to the next element in the old list:
+*/
+ if (new == NULL)
+ new = r;
+ else
+ last->link = r;
+ last = r;
+ lastlist = list;
+ list = list->link;
+ }
+/*
+At this point we have a new list built at 'new'. We break the old
+list at 'lastlist', and add the broken off part to the end of 'new'.
+Then, we return the caller a pointer to 'new':
+*/
+ if (new == NULL)
+ t1_abort("null splitedge");
+ lastlist->link = NULL;
+ last->link = list;
+ IfTrace1((RegionDebug > 1),"yields %p\n", new);
+ return(new);
+}
+
+/*
+:h3.vertjoin() - Join Two Disjoint Edge Lists Vertically
+
+The two edges must be disjoint vertically.
+*/
+static void vertjoin(register struct edgelist *top,
+ register struct edgelist *bottom)
+{
+ if (BOTTOM(top) > TOP(bottom))
+ t1_abort("vertjoin not disjoint");
+
+ for (; top->link != NULL; top=top->link) { ; }
+
+ top->link = bottom;
+ return;
+}
+
+/*
+:h3.swathxsort() - Sorting by X Values
+
+We need to sort 'edge' into its rightful
+place in the swath by X value, taking care that we do not accidentally
+advance to the next swath while searching for the correct X value. Like
+all swath functions, this function returns a pointer to the edge
+BEFORE the given edge in the sort.
+*/
+
+static struct edgelist *swathxsort(
+ register struct edgelist *before0, /* edge before this swath */
+ register struct edgelist *edge) /* input edge */
+{
+ register struct edgelist *before;
+ register struct edgelist *after;
+ register pel y = 0;
+
+ before = before0;
+ after = before->link;
+
+ while (after != NULL && TOP(after) == TOP(edge)) {
+
+ register pel *x1,*x2;
+
+ y = TOP(edge);
+ x1 = after->xvalues;
+ x2 = edge->xvalues;
+
+ while (y < BOTTOM(edge) && *x1 == *x2) {
+ x1++; x2++; y++;
+ }
+ if (y >= BOTTOM(edge)) {
+ edge->flag |= ISAMBIGUOUS(ON);
+ after->flag |= ISAMBIGUOUS(ON);
+ break;
+ }
+
+ if (*x1 >= *x2)
+ break;
+
+ before = after;
+ after = after->link;
+ }
+
+/*
+At this point, 'edge' is between 'before' and 'after'. If 'edge' didn't
+cross either of those other edges, we would be done. We check for
+crossing. If it does cross, we split the problem up by calling SortSwath
+recursively with the part of the edge that is below the crossing point:
+*/
+{
+ register int h0,h; /* height of edge--number of scans */
+
+ h0 = h = BOTTOM(edge) - y;
+ y -= TOP(edge);
+
+ if (h0 <= 0) {
+ IfTrace0((RegionDebug>0),"swathxsort: exactly equal edges\n");
+ return(before);
+ }
+
+ if (TOP(before) == TOP(edge))
+ h -= crosses(h, &before->xvalues[y], &edge->xvalues[y]);
+ if (after != NULL && TOP(after) == TOP(edge))
+ h -= crosses(h, &edge->xvalues[y], &after->xvalues[y]);
+
+ if (h < h0) {
+ SortSwath(before0->link,
+ splitedge(edge, TOP(edge) + y + h),
+ swathxsort);
+
+ }
+}
+
+ return(before);
+}
+/*
+:h3.SwathUnion() - Union Two Edges by X Value
+
+We have a left and right edge that must be unioned into a growing
+swath. If they are totally disjoint, they are just added in. The
+fun comes in they overlap the existing edges. Then some edges
+will disappear.
+*/
+
+static struct edgelist *SwathUnion(
+ register struct edgelist *before0, /* edge before the swath */
+ register struct edgelist *edge) /* list of two edges to be unioned */
+{
+ register int h; /* saves height of edge */
+ register struct edgelist *rightedge; /* saves right edge of 'edge' */
+ register struct edgelist *before,*after; /* edge before and after */
+ int h0; /* saves initial height */
+
+ IfTrace2((RegionDebug > 1),"SwathUnion entered, before=%p, edge=%p\n",
+ before0, edge);
+
+ h0 = h = edge->ymax - edge->ymin;
+ if (h <= 0)
+ t1_abort("SwathUnion: 0 height swath?");
+
+ before = before0;
+ after = before->link;
+
+ while (after != NULL && TOP(after) == TOP(edge)) {
+ register struct edgelist *right;
+
+ right = after->link;
+ if (right->xvalues[0] >= edge->xvalues[0])
+ break;
+ before = right;
+ after = before->link;
+ }
+/*
+This is the picture at this point. 'L' indicates a left hand edge,
+'R' indicates the right hand edge.
+'<--->' indicates the degree of uncertainty as to its placement
+relative to other edges:
+:xmp atomic.
+ before after
+ R <---L----> R L R L R
+ <---L---> <------R-------------------------->
+ edge
+:exmp.
+In case the left of 'edge' touches 'before', we need to reduce
+the height by that amount.
+*/
+ if (TOP(before) == TOP(edge))
+ h -= touches(h, before->xvalues, edge->xvalues);
+
+ rightedge = edge->link;
+
+ if (after == NULL || TOP(after) != TOP(edge) ||
+ after->xvalues[0] > rightedge->xvalues[0]) {
+ IfTrace2((RegionDebug > 1),
+ "SwathUnion starts disjoint: before=%p after=%p\n",
+ before, after);
+/*
+On this side of the the above 'if', the new edge is disjoint from the
+existing edges in the swath. This is the picture:
+:xmp atomic.
+ before after
+ R L R L R L R
+ L R
+ edge
+:exmp.
+We will verify it remains disjoint for the entire height. If the
+situation changes somewhere down the edge, we split the edge at that
+point and recursively call ourselves (through 'SortSwath') to figure
+out the new situation:
+*/
+ if (after != NULL && TOP(after) == TOP(edge))
+ h -= touches(h, rightedge->xvalues, after->xvalues);
+ if (h < h0)
+ SortSwath(before0->link, splitedge(edge, edge->ymin + h), SwathUnion);
+ /* go to "return" this edge pair; it is totally disjoint */
+ }
+ else {
+/*
+At this point, at the 'else', we know that the
+new edge overlaps one or more pairs in the existing swath. Here is
+a picture of our knowledge and uncertainties:
+:xmp atomic.
+ before after
+ R L R L R L R
+ <---L---> <---R------------------->
+ edge
+:exmp.
+We need to move 'after' along until it is to the right of the
+right of 'edge'. ('After' should always point to a left edge of a pair:)
+*/
+ register struct edgelist *left; /* variable to keep left edge in */
+
+ do {
+ left = after;
+ after = (after->link)->link;
+
+ } while (after != NULL && TOP(after) == TOP(edge)
+ && after->xvalues[0] <= rightedge->xvalues[0]);
+/*
+At this point this is the picture:
+:xmp atomic.
+ before left after
+ R L R L R L R
+ <---L---> <---R--->
+ edge
+:exmp.
+We need to verify that the situation stays like this all the way
+down the edge. Again, if the
+situation changes somewhere down the edge, we split the edge at that
+point and recursively call ourselves (through 'SortSwath') to figure
+out the new situation:
+*/
+
+ h -= crosses(h, left->xvalues, rightedge->xvalues);
+ h -= crosses(h, edge->xvalues, ((before->link)->link)->xvalues);
+
+ if (after != NULL && TOP(after) == TOP(edge))
+
+ h -= touches(h, rightedge->xvalues, after->xvalues);
+
+ IfTrace3((RegionDebug > 1),
+ "SwathUnion is overlapped until %d: before=%p after=%p\n",
+ (int32_t) TOP(edge) + h, before, after);
+/*
+OK, if we touched either of our neighbors we need to split at that point
+and recursively sort the split edge onto the list. One tricky part
+is that when we recursively sort, 'after' will change if it was not
+in our current swath:
+*/
+ if (h < h0) {
+ SortSwath(before0->link,
+ splitedge(edge, edge->ymin + h),
+ SwathUnion);
+
+ if (after == NULL || TOP(after) != TOP(edge))
+ for (after = before0->link;
+ TOP(after) == TOP(edge);
+ after = after->link) { ; }
+ }
+/*
+Now we need to augment 'edge' by the left and right of the overlapped
+swath, and to discard all edges between before and after, because they
+were overlapped and have been combined with the new incoming 'edge':
+*/
+ edge->xmin = MIN(edge->xmin, (before->link)->xmin);
+ edge->xmax = MIN(edge->xmax, (before->link)->xmax);
+ edgemin(h, edge->xvalues, (before->link)->xvalues);
+ rightedge->xmin = MAX(rightedge->xmin, (left->link)->xmin);
+ rightedge->xmax = MAX(rightedge->xmax, (left->link)->xmax);
+ edgemax(h, rightedge->xvalues, (left->link)->xvalues);
+ discard(before, after);
+ }
+ return(before);
+}
+#if 0
+/*
+:h3.swathrightmost() - Simply Sorts New Edge to Rightmost of Swath
+
+Like all swath functions, this function returns a pointer to the edge
+BEFORE the given edge in the sort.
+*/
+
+struct edgelist *swathrightmost(
+ register struct edgelist *before, /* edge before this swath */
+ register struct edgelist *edge) /* input edge */
+{
+ register struct edgelist *after;
+
+ after = before->link;
+
+ while (after != NULL && TOP(after) == TOP(edge)) {
+ before = after;
+ after = after->link;
+ }
+
+ return(before);
+
+}
+#endif
+/*
+:h3.touches() - Returns the Remaining Height When Two Edges Touch
+
+So, it will return 0 if they never touch. Allows incredibly(?) mnemonic
+if (touches(...)) construct.
+*/
+
+static int touches(int h, register pel *left, register pel *right)
+{
+ for (; h > 0; h--)
+ if (*left++ >= *right++)
+ break;
+ return(h);
+}
+/*
+:h3.crosses() - Returns the Remaining Height When Two Edges Cross
+
+So, it will return 0 if they never cross.
+*/
+
+static int crosses(register int h, register pel *left, register pel *right)
+{
+ for (; h > 0; h--)
+ if (*left++ > *right++)
+ break;
+ return(h);
+}
+#if 0
+/*
+:h3.cedgemin() - Stores the Mininum of an Edge and an X Value
+*/
+
+static void cedgemin(register int h, register pel *e1, register pel x)
+{
+ for (; --h >= 0; e1++)
+ if (*e1 > x)
+ *e1 = x;
+}
+/*
+:h3.cedgemax() - Stores the Maximum of an Edge and an X Value
+*/
+
+static void cedgemax(register int h, register pel *e1, register pel x)
+{
+ for (; --h >= 0; e1++)
+ if (*e1 < x)
+ *e1 = x;
+}
+#endif
+/*
+:h3.edgemin() - Stores the Mininum of Two Edges in First Edge
+*/
+
+static void edgemin(register int h, register pel *e1, register pel *e2)
+{
+ for (; --h >= 0; e1++,e2++)
+ if (*e1 > *e2)
+ *e1 = *e2;
+}
+/*
+:h3.edgemax() - Stores the Maximum of Two Edges in First Edge
+*/
+
+static void edgemax(register int h, register pel *e1, register pel *e2)
+{
+ for (; --h >= 0; e1++,e2++)
+ if (*e1 < *e2)
+ *e1 = *e2;
+}
+/*
+:h3 id=discard.discard() - Discard All Edges Between Two Edges
+
+At first glance it would seem that we could discard an edgelist
+structure merely by unlinking it from the list and freeing it. You are
+wrong, region-breath! For performance, the X values associated with an
+edge are allocated contiguously with it. So, we free the X values when
+we free a structure. However, once an edge has been split, we are no
+longer sure which control block actually is part of the memory block
+that contains the edges. Rather than trying to decide, we play it safe
+and never free part of a region.
+
+So, to mark a 'edgelist' structure as discarded, we move it to the end
+of the list and set ymin=ymax.
+*/
+
+static void discard(register struct edgelist *left, register struct edgelist *right)
+{
+ register struct edgelist *beg,*end,*p;
+
+ IfTrace2((RegionDebug > 0),"discard: l=%p, r=%p\n", left, right);
+
+ beg = left->link;
+ if (beg == right)
+ return;
+
+ for (p = beg; p != right; p = p->link) {
+ if (p->link == NULL && right != NULL)
+ t1_abort("discard(): ran off end");
+ IfTrace1((RegionDebug > 0),"discarding %p\n", p);
+ p->ymin = p->ymax = 32767;
+ end = p;
+ }
+ /*
+ * now put the chain beg/end at the end of right, if it is not
+ * already there:
+ */
+ if (right != NULL) {
+ left->link = right;
+ while (right->link != NULL)
+ right = right->link;
+ right->link = beg;
+ }
+ end->link = NULL;
+}
+
+/*
+:h2.Changing the Representation of Regions
+
+For convenience and/or performance, we sometimes like to change the way
+regions are represented. This does not change the object itself, just
+the representation, so these transformations can be made on a permanent
+region.
+
+*/
+
+void MoveEdges(
+ register struct region *R, /* region to modify */
+ register fractpel dx, /* delta X ... */
+ register fractpel dy) /* ... and Y to move edge list by */
+{
+ register struct edgelist *edge; /* for looping through edges */
+
+ R->origin.x += dx;
+ R->origin.y += dy;
+ R->ending.x += dx;
+ R->ending.y += dy;
+ if (R->thresholded != NULL) {
+ R->thresholded->origin.x -= dx;
+ R->thresholded->origin.y -= dy;
+ }
+/*
+From now on we will deal with dx and dy as integer pel values:
+*/
+ dx = NEARESTPEL(dx);
+ dy = NEARESTPEL(dy);
+ if (dx == 0 && dy == 0)
+ return;
+
+ R->xmin += dx;
+ R->xmax += dx;
+ R->ymin += dy;
+ R->ymax += dy;
+
+ for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) {
+ edge->ymin += dy;
+ edge->ymax += dy;
+ if (dx != 0) {
+ register int h; /* loop index; height of edge */
+ register pel *Xp; /* loop pointer to X values */
+
+ edge->xmin += dx;
+ edge->xmax += dx;
+ for (Xp = edge->xvalues, h = edge->ymax - edge->ymin;
+ --h >= 0; )
+ *Xp++ += dx;
+ }
+ }
+}
+
+/*
+:h3.UnJumble() - Sort a Region Top to Bottom
+
+It is an open question whether it pays in general to do this.
+*/
+
+void UnJumble(
+ struct region *region) /* region to sort */
+{
+ register struct edgelist *anchor; /* new lists built here */
+ register struct edgelist *edge; /* edge pointer for loop */
+ register struct edgelist *next; /* ditto */
+
+ anchor = NULL;
+
+ for (edge=region->anchor; VALIDEDGE(edge); edge=next) {
+ if (edge->link == NULL)
+ t1_abort("UnJumble: unpaired edge?");
+ next = edge->link->link;
+ edge->link->link = NULL;
+ anchor = SortSwath(anchor, edge, SwathUnion);
+ }
+
+ if (edge != NULL)
+ vertjoin(anchor, edge);
+
+ region->anchor = anchor;
+ region->flag &= ~ISJUMBLED(ON);
+}
+
+/*
+:h2.Miscelaneous Routines
+
+:h3.MoreWorkArea() - Allocate New Space for "edge"
+
+Our strategy is to temporarily allocate an array to hold this
+unexpectedly large edge. ChangeDirection frees this array any time
+it gets a shorter 'dy'.
+*/
+
+/*ARGSUSED*/
+void MoreWorkArea(
+ struct region *R, /* region we are generating */
+ fractpel x1, fractpel y1, /* starting point of line */
+ fractpel x2, fractpel y2) /* ending point of line */
+{
+ register int idy; /* integer dy of line */
+
+ idy = NEARESTPEL(y1) - NEARESTPEL(y2);
+ if (idy < 0) idy = - idy;
+
+ /*
+ * we must add one to the delta for the number of run ends we
+ * need to store:
+ */
+ if (++idy > currentsize) {
+ IfTrace1((RegionDebug > 0),"Allocating edge of %d pels\n", idy);
+ if (currentworkarea != workedge)
+ NonObjectFree(currentworkarea);
+ currentworkarea = (pel *)Allocate(0, NULL, idy * sizeof(pel));
+ currentsize = idy;
+ }
+ ChangeDirection(CD_CONTINUE, R, x1, y1, y2 - y1);
+}
+
+/*
+:h3.RegionBounds() - Returns Bounding Box of a Region
+*/
+
+struct segment *RegionBounds(register struct region *R)
+{
+ register struct segment *path; /* returned path */
+
+ path = BoxPath(IDENTITY, R->ymax - R->ymin, R->xmax - R->xmin);
+ path = Join(PathSegment(MOVETYPE, R->origin.x + TOFRACTPEL(R->xmin),
+ R->origin.y + TOFRACTPEL(R->ymin) ),
+ path);
+ return(path);
+}
+
+#if 0
+/*
+:h2.Formatting/Dump Routines for Debug
+
+:h3.DumpArea() - Display a Region
+*/
+void DumpArea(register struct region *area)
+{
+ IfTrace1(TRUE,"Dumping area %p,", area);
+ IfTrace4(TRUE," X %d:%d Y %d:%d;", (int32_t) area->xmin,
+ (int32_t) area->xmax, (int32_t) area->ymin,(int32_t) area->ymax);
+ IfTrace4(TRUE," origin=(%d,%d), ending=(%d,%d)\n",
+ area->origin.x, area->origin.y, area->ending.x, area->ending.y);
+ DumpEdges(area->anchor);
+}
+
+#define INSWATH(p, y0, y1) (p != NULL && p->ymin == y0 && p->ymax == y1)
+/*
+:h3.DumpEdges() - Display Run End Lists (Edge Lists)
+*/
+
+static pel RegionDebugYMin = MINPEL;
+static pel RegionDebugYMax = MAXPEL;
+
+void DumpEdges(register struct edgelist *edges)
+{
+ register struct edgelist *p,*p2;
+ register pel ymin = MINPEL;
+ register pel ymax = MINPEL;
+ register int y;
+
+ if (edges == NULL) {
+ IfTrace0(TRUE," NULL area.\n");
+ return;
+ }
+ if (RegionDebug <= 1) {
+ for (p=edges; p != NULL; p = p->link) {
+ edgecheck(p, ymin, ymax);
+ ymin = p->ymin; ymax = p->ymax;
+ IfTrace3(TRUE,". at %p type=%d flag=%x",
+ p, (int32_t) p->type,(int32_t) p->flag);
+ IfTrace4(TRUE," bounding box HxW is %dx%d at (%d,%d)\n",
+ (int32_t) ymax - ymin, (int32_t) p->xmax - p->xmin,
+ (int32_t) p->xmin, (int32_t) ymin);
+ }
+ }
+ else {
+
+ for (p2=edges; p2 != NULL; ) {
+
+ edgecheck(p2, ymin, ymax);
+ ymin = p2->ymin;
+ ymax = p2->ymax;
+
+ if (RegionDebug > 3 || (ymax > RegionDebugYMin
+ && ymin < RegionDebugYMax)) {
+ IfTrace2 (TRUE,". Swath from %d to %d:\n",
+ ymin, ymax);
+ for (p=p2; INSWATH(p,ymin,ymax); p = p->link) {
+ IfTrace4(TRUE,". . at %p[%x] range %d:%d, ",
+ p, (int32_t) p->flag,
+ (int32_t) p->xmin, (int32_t)p->xmax);
+ IfTrace1(TRUE, "subpath=%p,\n", p->subpath);
+ }
+ }
+ for (y=MAX(ymin,RegionDebugYMin); y < MIN(ymax, RegionDebugYMax); y++) {
+ IfTrace1(TRUE,". . . Y[%5d] ", (int32_t) y);
+ for (p=p2; INSWATH(p,ymin,ymax); p = p->link)
+ IfTrace1(TRUE,"%5d ",
+ (int32_t) p->xvalues[y - ymin]);
+ IfTrace0(TRUE,"\n");
+ }
+ while (INSWATH(p2, ymin, ymax))
+ p2 = p2->link;
+ }
+ }
+}
+
+/*
+:h3.edgecheck() - For Debug, Verify that an Edge Obeys the Rules
+*/
+
+/*ARGSUSED*/
+static void edgecheck(struct edgelist *edge, int oldmin, int oldmax)
+{
+ if (edge->type != EDGETYPE)
+ t1_abort("EDGE ERROR: non EDGETYPE in list");
+/*
+The following check is not valid if the region is jumbled so I took it
+out:
+*/
+/* if (edge->ymin < oldmax && edge->ymin != oldmin)
+ t1_abort("EDGE ERROR: overlapping swaths"); */
+}
+#endif
diff --git a/fonts/utilities/ps2pk/regions.h b/fonts/utilities/ps2pk/regions.h
new file mode 100644
index 0000000000..aec9323f29
--- /dev/null
+++ b/fonts/utilities/ps2pk/regions.h
@@ -0,0 +1,205 @@
+/* $XConsortium: regions.h,v 1.2 91/10/10 11:19:06 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+struct region {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = REGIONTYPE */
+ struct fractpoint origin; /* beginning handle: X,Y origin of region */
+ struct fractpoint ending; /* ending handle: X,Y change after painting region */
+ pel xmin,ymin; /* minimum X,Y of region */
+ pel xmax,ymax; /* mat1_mum X,Y of region */
+ struct edgelist *anchor; /* list of edges that bound the region */
+ struct picture *thresholded; /* region defined by thresholded picture*/
+/*
+Note that the ending handle and the bounding box values are stored
+relative to 'origin'.
+
+The above elements describe a region. The following elements are
+scratchpad areas used while the region is being built:
+*/
+ fractpel lastdy; /* direction of last segment */
+ fractpel firstx,firsty; /* starting point of current edge */
+ fractpel edgexmin,edgexmax; /* x extent of current edge */
+ struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */
+ pel *edge; /* pointer to array of X values for edge */
+ fractpel edgeYstop; /* Y value where 'edges' array ends */
+ void (*newedgefcn)(struct region *, fractpel, fractpel,
+ fractpel, fractpel, int); /* function to use when
+ building a new edge */
+ struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */
+} ;
+/*
+The ISCOMPLEMENT flag indicates the region is reversed--it is the
+"outside" of the nominal region.
+*/
+#define ISCOMPLEMENT(flag) ((flag)&0x80)
+/*
+The ISJUMBLED flag indicates the region is not sorted top-to-bottom.
+*/
+#define ISJUMBLED(flag) ((flag)&0x40)
+/*
+The ISINFINITE flag allows a quick check for an INFINITE region, which
+is frequently intersected.
+*/
+#define ISINFINITE(flag) ((flag)&0x20)
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ISRECTANGULAR(flag) ((flag)&0x08)
+
+/*END SHARED*/
+/*SHARED*/
+
+#define EmptyRegion t1_EmptyRegion
+
+/*END SHARED*/
+/*SHARED*/
+
+struct edgelist {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = EDGETYPE */
+ struct edgelist *link; /* pointer to next in linked list */
+ struct edgelist *subpath; /* informational link for "same subpath" */
+ pel xmin,xmax; /* range of edge in X */
+ pel ymin,ymax; /* range of edge in Y */
+ pel *xvalues; /* pointer to ymax-ymin X values */
+} ;
+/*
+The end of the list is marked by either "link" being NULL, or by
+ymin == ymax. See :hdref refid=discard.. We define the VALIDEDGE
+predicate to test for the opposite of these conditions:
+*/
+
+#define VALIDEDGE(p) ((p)!=NULL&&(p)->ymin<(p)->ymax)
+
+/*END SHARED*/
+/*SHARED*/
+
+#define Interior(p,rule) t1_Interior(p,rule)
+#define Union(a1,a2) t1_Union(a1,a2)
+#define Intersect(a1,a2) t1_Intersect(a1,a2)
+#define Complement(area) t1_Complement(area)
+#define Overlap(a1,a2) t1_OverLap(a1,a2)
+
+struct region *t1_Interior(struct segment *, int);
+ /* returns the interior of a closed path */
+struct region *t1_Union(); /* set union of paths or regions */
+struct region *t1_Intersect(); /* set intersection of regions */
+struct region *t1_Complement(); /* complement of a region */
+int t1_Overlap(); /* returns a Boolean; TRUE if regions overlap */
+
+#define T1_INFINITY t1_Infinity
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ChangeDirection(type,R,x,y,dy) t1_ChangeDirection(type,R,x,y,dy)
+
+void t1_ChangeDirection(int, struct region *, fractpel, fractpel, fractpel);
+ /* called when we change direction in Y */
+#define CD_FIRST -1 /* enumeration of ChangeDirection type */
+#define CD_CONTINUE 0 /* enumeration of ChangeDirection type */
+#define CD_LAST 1 /* enumeration of ChangeDirection type */
+
+#define MoreWorkArea(R,x1,y1,x2,y2) t1_MoreWorkArea(R,x1,y1,x2,y2)
+#define KillRegion(area) t1_KillRegion(area)
+#define CopyRegion(area) t1_CopyRegion(area)
+#define RegionBounds(r) t1_RegionBounds(r)
+#define CoerceRegion(p) t1_CoerceRegion(p)
+#define MoveEdges(R,dx,dy) t1_MoveEdges(R,dx,dy)
+#define UnJumble(R) t1_UnJumble(R)
+
+void t1_MoreWorkArea(struct region *, fractpel, fractpel, fractpel,
+ fractpel); /* get longer edge list for stepping */
+struct region *t1_CopyRegion(struct region *); /* duplicate a region */
+void t1_KillRegion(struct region *); /* destroy a region */
+struct segment *t1_RegionBounds(struct region *);
+ /* returns bounding box of a region */
+struct region *t1_CoerceRegion(); /* force text to become a true region */
+void t1_MoveEdges(struct region *, fractpel, fractpel);
+ /* moves the edge values in a region */
+void t1_UnJumble(struct region *);
+ /* sort the edges and reset the jumbled flag */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define GOING_TO(R, x1, y1, x2, y2, dy) { \
+ if (dy < 0) { \
+ if (R->lastdy >= 0) \
+ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
+ if (y2 < R->edgeYstop) \
+ MoreWorkArea(R, x1, y1, x2, y2); \
+ } \
+ else if (dy > 0) { \
+ if (R->lastdy <= 0) \
+ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
+ if (y2 > R->edgeYstop) \
+ MoreWorkArea(R, x1, y1, x2, y2); \
+ } \
+ else /* dy == 0 */ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
+ if (x2 < R->edgexmin) R->edgexmin = x2; \
+ else if (x2 > R->edgexmax) R->edgexmax = x2; \
+}
+
+
+#define MINPEL (-1<<(8*sizeof(pel)-1)) /* smallest value fitting in a pel */
+#define MAXPEL ((1<<(8*sizeof(pel)-1))-1)/* largest value fitting in a pel */
+
+/*
+The "Unique"-type macro is different (unique?) for regions, because some
+regions structures are shared among several objects, and might have
+to be made unique for that reason (i.e., references > 1).
+*/
+
+#define ConsumeRegion(R) MAKECONSUME(R,KillRegion(R))
+#define UniqueRegion(R) MAKEUNIQUE(R,CopyRegion(R))
+
+
+/*END SHARED*/
+/*SHARED*/
+
+#define ISDOWN(f) ((f)&0x80)
+
+#define ISAMBIGUOUS(f) ((f)&0x40)
+
+/*END SHARED*/
+/*SHARED*/
+
+/*
+Interior() rule enumerations:
+*/
+#define WINDINGRULE -2
+#define EVENODDRULE -3
+
+#define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/scanfont.c b/fonts/utilities/ps2pk/scanfont.c
new file mode 100644
index 0000000000..9224928246
--- /dev/null
+++ b/fonts/utilities/ps2pk/scanfont.c
@@ -0,0 +1,1480 @@
+/* $XConsortium: scanfont.c,v 1.9 92/07/07 17:14:56 gildea Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */
+
+#include "types.h"
+#include <string.h>
+
+#include "t1stdio.h"
+#include "util.h"
+#include "token.h"
+#include "objects.h"
+#include "spaces.h"
+#include "fontmisc.h"
+#include "ffilest.h"
+#include "fontfcn.h"
+#include "blues.h"
+
+
+static int rc;
+static boolean InPrivateDict;
+static boolean WantFontInfo;
+static boolean TwoSubrs;
+static psobj inputFile;
+static psobj filterFile;
+static psobj *inputP;
+
+
+/**********************************************************************/
+/* Init_BuiltInEncoding() */
+/* */
+/* Initializes the StandardEncoding and ISOLatin1Encoding vector. */
+/* */
+/**********************************************************************/
+typedef struct /* Builtin Standard Encoding */
+{
+ int index;
+ const char *name;
+} EncodingTable;
+
+static EncodingTable StdEnc[] = {
+ { 040 , "space" },
+ { 041 , "exclam" },
+ { 042 , "quotedbl" },
+ { 043 , "numbersign" },
+ { 044 , "dollar" },
+ { 045 , "percent" },
+ { 046 , "ampersand" },
+ { 047 , "quoteright" },
+ { 050 , "parenleft" },
+ { 051 , "parenright" },
+ { 052 , "asterisk" },
+ { 053 , "plus" },
+ { 054 , "comma" },
+ { 055 , "hyphen" },
+ { 056 , "period" },
+ { 057 , "slash" },
+ { 060 , "zero" },
+ { 061 , "one" },
+ { 062 , "two" },
+ { 063 , "three" },
+ { 064 , "four" },
+ { 065 , "five" },
+ { 066 , "six" },
+ { 067 , "seven" },
+ { 070 , "eight" },
+ { 071 , "nine" },
+ { 072 , "colon" },
+ { 073 , "semicolon" },
+ { 074 , "less" },
+ { 075 , "equal" },
+ { 076 , "greater" },
+ { 077 , "question" },
+ { 0100 , "at" },
+ { 0101 , "A" },
+ { 0102 , "B" },
+ { 0103 , "C" },
+ { 0104 , "D" },
+ { 0105 , "E" },
+ { 0106 , "F" },
+ { 0107 , "G" },
+ { 0110 , "H" },
+ { 0111 , "I" },
+ { 0112 , "J" },
+ { 0113 , "K" },
+ { 0114 , "L" },
+ { 0115 , "M" },
+ { 0116 , "N" },
+ { 0117 , "O" },
+ { 0120 , "P" },
+ { 0121 , "Q" },
+ { 0122 , "R" },
+ { 0123 , "S" },
+ { 0124 , "T" },
+ { 0125 , "U" },
+ { 0126 , "V" },
+ { 0127 , "W" },
+ { 0130 , "X" },
+ { 0131 , "Y" },
+ { 0132 , "Z" },
+ { 0133 , "bracketleft" },
+ { 0134 , "backslash" },
+ { 0135 , "bracketright" },
+ { 0136 , "asciicircum" },
+ { 0137 , "underscore" },
+ { 0140 , "quoteleft" },
+ { 0141 , "a" },
+ { 0142 , "b" },
+ { 0143 , "c" },
+ { 0144 , "d" },
+ { 0145 , "e" },
+ { 0146 , "f" },
+ { 0147 , "g" },
+ { 0150 , "h" },
+ { 0151 , "i" },
+ { 0152 , "j" },
+ { 0153 , "k" },
+ { 0154 , "l" },
+ { 0155 , "m" },
+ { 0156 , "n" },
+ { 0157 , "o" },
+ { 0160 , "p" },
+ { 0161 , "q" },
+ { 0162 , "r" },
+ { 0163 , "s" },
+ { 0164 , "t" },
+ { 0165 , "u" },
+ { 0166 , "v" },
+ { 0167 , "w" },
+ { 0170 , "x" },
+ { 0171 , "y" },
+ { 0172 , "z" },
+ { 0173 , "braceleft" },
+ { 0174 , "bar" },
+ { 0175 , "braceright" },
+ { 0176 , "asciitilde" },
+ { 0241 , "exclamdown" },
+ { 0242 , "cent" },
+ { 0243 , "sterling" },
+ { 0244 , "fraction" },
+ { 0245 , "yen" },
+ { 0246 , "florin" },
+ { 0247 , "section" },
+ { 0250 , "currency" },
+ { 0251 , "quotesingle" },
+ { 0252 , "quotedblleft" },
+ { 0253 , "guillemotleft" },
+ { 0254 , "guilsinglleft" },
+ { 0255 , "guilsinglright" },
+ { 0256 , "fi" },
+ { 0257 , "fl" },
+ { 0261 , "endash" },
+ { 0262 , "dagger" },
+ { 0263 , "daggerdbl" },
+ { 0264 , "periodcentered" },
+ { 0266 , "paragraph" },
+ { 0267 , "bullet" },
+ { 0270 , "quotesinglbase" },
+ { 0271 , "quotedblbase" },
+ { 0272 , "quotedblright" },
+ { 0273 , "guillemotright" },
+ { 0274 , "ellipsis" },
+ { 0275 , "perthousand" },
+ { 0277 , "questiondown" },
+ { 0301 , "grave" },
+ { 0302 , "acute" },
+ { 0303 , "circumflex" },
+ { 0304 , "tilde" },
+ { 0305 , "macron" },
+ { 0306 , "breve" },
+ { 0307 , "dotaccent" },
+ { 0310 , "dieresis" },
+ { 0312 , "ring" },
+ { 0313 , "cedilla" },
+ { 0315 , "hungarumlaut" },
+ { 0316 , "ogonek" },
+ { 0317 , "caron" },
+ { 0320 , "emdash" },
+ { 0341 , "AE" },
+ { 0343 , "ordfeminine" },
+ { 0350 , "Lslash" },
+ { 0351 , "Oslash" },
+ { 0352 , "OE" },
+ { 0353 , "ordmasculine" },
+ { 0361 , "ae" },
+ { 0365 , "dotlessi" },
+ { 0370 , "lslash" },
+ { 0371 , "oslash" },
+ { 0372 , "oe" },
+ { 0373 , "germandbls" },
+ { 0, 0 }
+};
+
+static EncodingTable ISO8859Enc[] = {
+ { 32, "space" },
+ { 33, "exclam" },
+ { 34, "quotedbl" },
+ { 35, "numbersign" },
+ { 36, "dollar" },
+ { 37, "percent" },
+ { 38, "ampersand" },
+ { 39, "quoteright" },
+ { 40, "parenleft" },
+ { 41, "parenright" },
+ { 42, "asterisk" },
+ { 43, "plus" },
+ { 44, "comma" },
+ { 45, "minus" },
+ { 46, "period" },
+ { 47, "slash" },
+ { 48, "zero" },
+ { 49, "one" },
+ { 50, "two" },
+ { 51, "three" },
+ { 52, "four" },
+ { 53, "five" },
+ { 54, "six" },
+ { 55, "seven" },
+ { 56, "eight" },
+ { 57, "nine" },
+ { 58, "colon" },
+ { 59, "semicolon" },
+ { 60, "less" },
+ { 61, "equal" },
+ { 62, "greater" },
+ { 63, "question" },
+ { 64, "at" },
+ { 65, "A" },
+ { 66, "B" },
+ { 67, "C" },
+ { 68, "D" },
+ { 69, "E" },
+ { 70, "F" },
+ { 71, "G" },
+ { 72, "H" },
+ { 73, "I" },
+ { 74, "J" },
+ { 75, "K" },
+ { 76, "L" },
+ { 77, "M" },
+ { 78, "N" },
+ { 79, "O" },
+ { 80, "P" },
+ { 81, "Q" },
+ { 82, "R" },
+ { 83, "S" },
+ { 84, "T" },
+ { 85, "U" },
+ { 86, "V" },
+ { 87, "W" },
+ { 88, "X" },
+ { 89, "Y" },
+ { 90, "Z" },
+ { 91, "bracketleft" },
+ { 92, "backslash" },
+ { 93, "bracketright" },
+ { 94, "asciicircum" },
+ { 95, "underscore" },
+ { 96, "quoteleft" },
+ { 97, "a" },
+ { 98, "b" },
+ { 99, "c" },
+ { 100, "d" },
+ { 101, "e" },
+ { 102, "f" },
+ { 103, "g" },
+ { 104, "h" },
+ { 105, "i" },
+ { 106, "j" },
+ { 107, "k" },
+ { 108, "l" },
+ { 109, "m" },
+ { 110, "n" },
+ { 111, "o" },
+ { 112, "p" },
+ { 113, "q" },
+ { 114, "r" },
+ { 115, "s" },
+ { 116, "t" },
+ { 117, "u" },
+ { 118, "v" },
+ { 119, "w" },
+ { 120, "x" },
+ { 121, "y" },
+ { 122, "z" },
+ { 123, "braceleft" },
+ { 124, "bar" },
+ { 125, "braceright" },
+ { 126, "asciitilde" },
+ { 161, "exclamdown" },
+ { 162, "cent" },
+ { 163, "sterling" },
+ { 164, "currency" },
+ { 165, "yen" },
+ { 166, "brokenbar" },
+ { 167, "section" },
+ { 168, "dieresis" },
+ { 169, "copyright" },
+ { 170, "ordfeminine" },
+ { 171, "guillemotleft" },
+ { 172, "logicalnot" },
+ { 173, "hyphen" },
+ { 174, "registered" },
+ { 175, "macron" },
+ { 176, "degree" },
+ { 177, "plusminus" },
+ { 178, "twosuperior" },
+ { 179, "threesuperior" },
+ { 180, "acute" },
+ { 181, "mu" },
+ { 182, "paragraph" },
+ { 183, "periodcentered" },
+ { 184, "cedilla" },
+ { 185, "onesuperior" },
+ { 186, "ordmasculine" },
+ { 187, "guillemotright" },
+ { 188, "onequarter" },
+ { 189, "onehalf" },
+ { 190, "threequarters" },
+ { 191, "questiondown" },
+ { 192, "Agrave" },
+ { 193, "Aacute" },
+ { 194, "Acircumflex" },
+ { 195, "Atilde" },
+ { 196, "Adieresis" },
+ { 197, "Aring" },
+ { 198, "AE" },
+ { 199, "Ccedilla" },
+ { 200, "Egrave" },
+ { 201, "Eacute" },
+ { 202, "Ecircumflex" },
+ { 203, "Edieresis" },
+ { 204, "Igrave" },
+ { 205, "Iacute" },
+ { 206, "Icircumflex" },
+ { 207, "Idieresis" },
+ { 208, "Eth" },
+ { 209, "Ntilde" },
+ { 210, "Ograve" },
+ { 211, "Oacute" },
+ { 212, "Ocircumflex" },
+ { 213, "Otilde" },
+ { 214, "Odieresis" },
+ { 215, "multiply" },
+ { 216, "Oslash" },
+ { 217, "Ugrave" },
+ { 218, "Uacute" },
+ { 219, "Ucircumflex" },
+ { 220, "Udieresis" },
+ { 221, "Yacute" },
+ { 222, "Thorn" },
+ { 223, "germandbls" },
+ { 224, "agrave" },
+ { 225, "aacute" },
+ { 226, "acircumflex" },
+ { 227, "atilde" },
+ { 228, "adieresis" },
+ { 229, "aring" },
+ { 230, "ae" },
+ { 231, "ccedilla" },
+ { 232, "egrave" },
+ { 233, "eacute" },
+ { 234, "ecircumflex" },
+ { 235, "edieresis" },
+ { 236, "igrave" },
+ { 237, "iacute" },
+ { 238, "icircumflex" },
+ { 239, "idieresis" },
+ { 240, "eth" },
+ { 241, "ntilde" },
+ { 242, "ograve" },
+ { 243, "oacute" },
+ { 244, "ocircumflex" },
+ { 245, "otilde" },
+ { 246, "odieresis" },
+ { 247, "divide" },
+ { 248, "oslash" },
+ { 249, "ugrave" },
+ { 250, "uacute" },
+ { 251, "ucircumflex" },
+ { 252, "udieresis" },
+ { 253, "yacute" },
+ { 254, "thorn" },
+ { 255, "ydieresis" },
+ { 0, 0 }
+};
+
+static psobj *StdEncArrayP = NULL;
+psobj *ISOLatin1EncArrayP = NULL;
+
+static psobj *MakeEncodingArrayP(EncodingTable *encodingTable)
+{
+ int i;
+ psobj *encodingArrayP;
+
+ encodingArrayP = (psobj *)vm_alloc(256*(sizeof(psobj)));
+ if (!encodingArrayP)
+ return NULL;
+
+ /* initialize everything to .notdef */
+ for (i=0; i<256;i++)
+ objFormatName(&(encodingArrayP[i]),7, ".notdef");
+
+ for (i=0; encodingTable[i].name; i++)
+ {
+ objFormatName(&(encodingArrayP[encodingTable[i].index]),
+ strlen(encodingTable[i].name),
+ encodingTable[i].name);
+ }
+
+ return(encodingArrayP);
+}
+
+boolean Init_BuiltInEncoding(void)
+{
+ StdEncArrayP = MakeEncodingArrayP(StdEnc);
+ ISOLatin1EncArrayP = MakeEncodingArrayP(ISO8859Enc);
+ return (StdEncArrayP && ISOLatin1EncArrayP);
+}
+
+/********************************************************************/
+/***================================================================***/
+static int getNextValue(int valueType)
+{
+ scan_token(inputP);
+ if (tokenType != valueType) {
+ return(SCAN_ERROR);
+ }
+ return(SCAN_OK);
+
+}
+/***================================================================***/
+/* This routine will set the global rc if there is an error */
+/***================================================================***/
+static int getInt(void)
+{
+ scan_token(inputP);
+ if (tokenType != TOKEN_INTEGER) {
+ rc = SCAN_ERROR;
+ return(0);
+ }
+ else {
+ return( tokenValue.integer);
+ }
+
+}
+/***================================================================***/
+/*
+ * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1,
+ * for parsing Encoding.
+ */
+static int getEncoding(psobj *arrayP)
+{
+
+ scan_token(inputP);
+ if ((tokenType == TOKEN_NAME)
+ &&
+ (((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) ||
+ (((tokenLength==17) && (!strncmp(tokenStartP,"ISOLatin1Encoding",17))))))
+ {
+ /* Adobe Standard Encoding */
+
+ if (tokenLength == 16)
+ arrayP->data.valueP = (char *) StdEncArrayP;
+ else
+ arrayP->data.valueP = (char *) ISOLatin1EncArrayP;
+
+ arrayP->len = 256;
+ return(SCAN_OK);
+ }
+ else if ( (tokenType == TOKEN_LEFT_BRACE) ||
+ (tokenType == TOKEN_LEFT_BRACKET) )
+ {
+ /* Array of literal names */
+
+ psobj *objP;
+ int i;
+
+ objP = (psobj *)vm_alloc(256*(sizeof(psobj)));
+ if (!(objP)) return(SCAN_OUT_OF_MEMORY);
+
+ arrayP->data.valueP = (char *) objP;
+ arrayP->len = 256;
+
+ for (i=0; i<256; i++, objP++)
+ {
+ scan_token(inputP);
+
+ if (tokenType != TOKEN_LITERAL_NAME)
+ return(SCAN_ERROR);
+
+ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY);
+ objFormatName(objP,tokenLength,tokenStartP);
+ }
+
+ scan_token(inputP);
+ if ( (tokenType == TOKEN_RIGHT_BRACE) ||
+ (tokenType == TOKEN_RIGHT_BRACKET) )
+ return(SCAN_OK);
+ }
+ else
+ {
+ /* Must be sequences of ``dup <index> <charactername> put" */
+
+ psobj *objP;
+ int i;
+
+ objP = (psobj *)vm_alloc(256*(sizeof(psobj)));
+ if (!(objP)) return(SCAN_OUT_OF_MEMORY);
+
+ arrayP->data.valueP = (char *) objP;
+ arrayP->len = 256;
+
+ for (i=0; i<256; i++)
+ objFormatName(objP + i, 7, ".notdef");
+
+ while (TRUE)
+ {
+ scan_token(inputP);
+
+ switch (tokenType)
+ {
+ case TOKEN_NAME:
+ if (tokenLength == 3)
+ {
+ if (strncmp(tokenStartP,"dup",3) == 0)
+ {
+ /* get <index> */
+ scan_token(inputP);
+ if (tokenType != TOKEN_INTEGER ||
+ tokenValue.integer < 0 ||
+ tokenValue.integer > 255)
+ return (SCAN_ERROR);
+ i = tokenValue.integer;
+
+ /* get <characer_name> */
+ scan_token(inputP);
+ if (tokenType != TOKEN_LITERAL_NAME)
+ return(SCAN_ERROR);
+
+ if (!(vm_alloc(tokenLength)) )
+ return(SCAN_OUT_OF_MEMORY);
+ objFormatName(objP + i,tokenLength,tokenStartP);
+
+ /* get "put" */
+ scan_token(inputP);
+ if (tokenType != TOKEN_NAME)
+ return(SCAN_ERROR);
+ }
+ else if (strncmp(tokenStartP,"def",3) == 0)
+ return (SCAN_OK);
+ }
+ break;
+ case TOKEN_EOF:
+ case TOKEN_NONE:
+ case TOKEN_INVALID:
+ return (SCAN_ERROR);
+ }
+ }
+ }
+
+ return (SCAN_ERROR);
+}
+/***================================================================***/
+static int getArray(psobj *arrayP)
+{
+ int N; /* count the items in the array */
+ psobj *objP;
+
+
+ scan_token(inputP);
+ if ( (tokenType != TOKEN_LEFT_BRACE) &&
+ (tokenType != TOKEN_LEFT_BRACKET) ) {
+ return(SCAN_ERROR);
+ }
+ /* format the array in memory, save pointer to the beginning */
+ arrayP->data.valueP = tokenStartP;
+ /* loop, picking up next object, until right BRACE or BRACKET */
+ N = 0;
+ do {
+ scan_token(inputP);
+ if ( (tokenType == TOKEN_RIGHT_BRACE) ||
+ (tokenType == TOKEN_RIGHT_BRACKET) ) {
+ /* save then number of items in the array */
+ arrayP->len = N;
+ return(SCAN_OK);
+ }
+ /* allocate the space for the object */
+ objP = (psobj *)vm_alloc(sizeof(psobj));
+ if (!(objP)) return(SCAN_OUT_OF_MEMORY);
+
+ /* array is an array of numbers, (real or integer) */
+ if (tokenType == TOKEN_REAL) {
+ objFormatReal(objP, tokenValue.real);
+ }
+ else
+ if (tokenType == TOKEN_INTEGER) {
+ objFormatInteger(objP, tokenValue.integer);
+ }
+ else return(SCAN_ERROR);
+ N++;
+ } while ( 1>0 );
+ /* NOTREACHED*/
+}
+/***================================================================***/
+static int getName(const char *nameP)
+{
+ do {
+ scan_token(inputP);
+ if (tokenType <= TOKEN_NONE) {
+ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY);
+ return(SCAN_ERROR);
+ }
+ } while ((tokenType != TOKEN_NAME) ||
+ (0 != strncmp(tokenStartP,nameP,strlen(nameP))) );
+ /* found */
+ return(SCAN_OK);
+}
+/***================================================================***/
+static int getNbytes(int N)
+{
+ int I;
+
+ if (N > vm_free_bytes()) {
+ if (!vm_init()) return(SCAN_OUT_OF_MEMORY);
+ }
+ tokenStartP = vm_next_byte();
+ I = fread(tokenStartP,1,N,inputP->data.fileP);
+ if ( I != N ) return(SCAN_FILE_EOF);
+ return(SCAN_OK);
+}
+
+/***================================================================***/
+/* getLiteralName(nameObjP) */
+/* scan for next literal. */
+/* if we encounter the name 'end' then terminate and say ok. */
+/* It means that the CharStrings does not have as many characters */
+/* as the dictionary said it would and that is ok. */
+/***================================================================***/
+static int getLiteralName(psobj *nameObjP)
+{
+ do {
+ scan_token(inputP);
+ if (tokenType <= TOKEN_NONE) {
+ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY);
+ return(SCAN_ERROR);
+ }
+ if (tokenType == TOKEN_NAME) {
+ if (0 == strncmp(tokenStartP,"end",3) ) {
+ return(SCAN_END);
+ }
+ }
+ } while (tokenType != TOKEN_LITERAL_NAME) ;
+ nameObjP->len = tokenLength;
+ /* allocate all the names in the CharStrings Structure */
+ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY);
+ nameObjP->data.valueP = tokenStartP;
+ /* found */
+ return(SCAN_OK);
+}
+
+/***================================================================***/
+/*
+ * BuildSubrs routine
+ */
+/***================================================================***/
+
+static int BuildSubrs(psfont *FontP)
+{
+ int N; /* number of values in Subrs */
+ int I; /* index into Subrs */
+ int i; /* loop thru Subrs */
+ int J; /* length of Subrs entry */
+ psobj *arrayP;
+
+ /* next token should be a positive int */
+ /* note: rc is set by getInt. */
+ N = getInt();
+ if (rc) return(rc);
+ if (N < 0 ) return(SCAN_ERROR);
+ /* if we already have a Subrs, then skip the second one */
+ /* The second one is for hiresolution devices. */
+ if (FontP->Subrs.data.arrayP != NULL) {
+ TwoSubrs = TRUE;
+ /* process all the Subrs, but do not update anything */
+ /* can not just skip them because of the binary data */
+ for (i=0;i<N;i++) {
+ /* look for dup */
+ rc = getName("dup");
+ if (rc) return(rc);
+ /* get 2 integers */
+ I = getInt();
+ if (rc) return(rc);
+ J = getInt();
+ if (rc) return(rc);
+ if ( (I < 0) || (J < 0 ) ) return (SCAN_ERROR);
+ /* get the next token, it should be RD or -|, either is ok */
+ rc = getNextValue(TOKEN_NAME);
+ if ( rc != SCAN_OK ) return(rc);
+ rc = getNbytes(J);
+ if (rc) return(rc);
+ }
+ return(SCAN_OK);
+ }
+
+ arrayP = (psobj *)vm_alloc(N*sizeof(psobj));
+ if (!(arrayP) ) return(SCAN_OUT_OF_MEMORY);
+ FontP->Subrs.len = N;
+ FontP->Subrs.data.arrayP = arrayP;
+ /* get N values for Subrs */
+ for (i=0;i<N;i++) {
+ /* look for dup */
+ rc = getName("dup");
+ if (rc) return(rc);
+ /* get 2 integers */
+ I = getInt();
+ if (rc) return(rc);
+ J = getInt();
+ if (rc) return(rc);
+ if ( (I < 0) || (J < 0 ) ) return (SCAN_ERROR);
+ arrayP[I].len = J;
+ /* get the next token, it should be RD or -|, either is ok */
+ rc = getNextValue(TOKEN_NAME);
+ if ( rc != SCAN_OK ) return(rc);
+ rc = getNbytes(J);
+ if (rc == SCAN_OK) {
+ arrayP[I].data.valueP = tokenStartP;
+ if ( !(vm_alloc(J)) ) return(SCAN_OUT_OF_MEMORY);
+ }
+ else return(rc);
+ }
+ return(SCAN_OK);
+
+}
+/***================================================================***/
+/***================================================================***/
+/*
+ * BuildCharStrings routine
+ */
+/***================================================================***/
+
+static int BuildCharStrings(psfont *FontP)
+{
+ int N; /* number of values in CharStrings */
+ int i; /* loop thru Subrs */
+ int J; /* length of Subrs entry */
+ psdict *dictP;
+
+ /* next token should be a positive int */
+ N = getInt();
+ if (rc) {
+ /* check if file had TwoSubrs, hi resolution stuff is in file*/
+ if (TwoSubrs) {
+ do {
+ scan_token(inputP);
+ if (tokenType <= TOKEN_NONE) {
+ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY);
+ return(SCAN_ERROR);
+ }
+ } while (tokenType != TOKEN_INTEGER);
+ N = tokenValue.integer;
+ }
+ else return(rc); /* if next token was not an Int */
+ }
+ if (N<=0) return(SCAN_ERROR);
+ /* save number of entries in the dictionary */
+
+ dictP = (psdict *)vm_alloc((N+1)*sizeof(psdict));
+ if (!(dictP)) return(SCAN_OUT_OF_MEMORY);
+ FontP->CharStringsP = dictP;
+ dictP[0].key.len = N;
+ /* get N values for CharStrings */
+ for (i=1;i<=N;i++) {
+ /* look for next literal name */
+ rc = getLiteralName(&(dictP[i].key));
+ if (rc) return(rc);
+ /* get 1 integer */
+ J = getInt();
+ if (rc) return(rc); /* if next token was not an Int */
+ if (J<0) return (SCAN_ERROR);
+ dictP[i].value.len = J;
+ /* get the next token, it should be RD or -|, either is ok */
+ rc = getNextValue(TOKEN_NAME);
+ if ( rc != SCAN_OK ) return(rc);
+ rc = getNbytes(J);
+ if (rc == SCAN_OK) {
+ dictP[i].value.data.valueP = tokenStartP;
+ if ( !(vm_alloc(J)) ) return(SCAN_OUT_OF_MEMORY);
+ }
+ else return(rc);
+ }
+ return(SCAN_OK);
+
+}
+/***================================================================***/
+/***================================================================***/
+/*
+ * BuildFontInfo Dictionary
+ */
+/***================================================================***/
+static int BuildFontInfo(psfont *fontP)
+{
+ psdict *dictP;
+
+ /* allocate the private dictionary */
+ dictP = (psdict *)vm_alloc(20*sizeof(psdict));
+ if (!(dictP)) return(SCAN_OUT_OF_MEMORY);
+
+ fontP->fontInfoP = dictP;
+ fontP->fontInfoP[0].key.len = 17; /* number of actual entries */
+ objFormatName(&(dictP[FONTNAME].key),8,"FontName");
+ objFormatName(&(dictP[FONTNAME].value),0,NULL);
+ objFormatName(&(dictP[PAINTTYPE].key),9,"PaintType");
+ objFormatInteger(&(dictP[PAINTTYPE].value),0);
+ objFormatName(&(dictP[FONTTYPENUM].key),8,"FontType");
+ objFormatInteger(&(dictP[FONTTYPENUM].value),0);
+ objFormatName(&(dictP[FONTMATRIX].key),10,"FontMatrix");
+ objFormatArray(&(dictP[FONTMATRIX].value),0,NULL);
+ objFormatName(&(dictP[FONTBBOX].key),8,"FontBBox");
+ objFormatArray(&(dictP[FONTBBOX].value),0,NULL);
+ objFormatName(&(dictP[ENCODING].key),8,"Encoding");
+ objFormatEncoding(&(dictP[ENCODING].value),0,NULL);
+ objFormatName(&(dictP[UNIQUEID].key),8,"UniqueID");
+ objFormatInteger(&(dictP[UNIQUEID].value),0);
+ objFormatName(&(dictP[STROKEWIDTH].key),11,"StrokeWidth");
+ objFormatReal(&(dictP[STROKEWIDTH].value),0.0);
+ objFormatName(&(dictP[VERSION].key),7,"version");
+ objFormatString(&(dictP[VERSION].value),0,NULL);
+ objFormatName(&(dictP[NOTICE].key),6,"Notice");
+ objFormatString(&(dictP[NOTICE].value),0,NULL);
+ objFormatName(&(dictP[FULLNAME].key),8,"FullName");
+ objFormatString(&(dictP[FULLNAME].value),0,NULL);
+ objFormatName(&(dictP[FAMILYNAME].key),10,"FamilyName");
+ objFormatString(&(dictP[FAMILYNAME].value),0,NULL);
+ objFormatName(&(dictP[WEIGHT].key),6,"Weight");
+ objFormatString(&(dictP[WEIGHT].value),0,NULL);
+ objFormatName(&(dictP[ITALICANGLE].key),11,"ItalicAngle");
+ objFormatReal(&(dictP[ITALICANGLE].value),0.0);
+ objFormatName(&(dictP[ISFIXEDPITCH].key),12,"isFixedPitch");
+ objFormatBoolean(&(dictP[ISFIXEDPITCH].value),FALSE);
+ objFormatName(&(dictP[UNDERLINEPOSITION].key),17,"UnderlinePosition");
+ objFormatReal(&(dictP[UNDERLINEPOSITION].value),0.0);
+ objFormatName(&(dictP[UNDERLINETHICKNESS].key),18,"UnderlineThickness");
+ objFormatReal(&(dictP[UNDERLINETHICKNESS].value),0.0);
+ return(SCAN_OK);
+}
+/***================================================================***/
+/*
+ * BuildPrivate Dictionary
+ */
+/***================================================================***/
+static int BuildPrivate(psfont *fontP)
+{
+ psdict *Private;
+
+ /* allocate the private dictionary */
+ Private = (psdict *)vm_alloc(20*sizeof(psdict));
+
+ if (!(Private)) return(SCAN_OUT_OF_MEMORY);
+
+ fontP->Private = Private;
+ fontP->Private[0].key.len = 16; /* number of actual entries */
+
+ objFormatName(&(Private[BLUEVALUES].key),10,"BlueValues");
+ objFormatArray(&(Private[BLUEVALUES].value),0,NULL);
+ objFormatName(&(Private[OTHERBLUES].key),10,"OtherBlues");
+ objFormatArray(&(Private[OTHERBLUES].value),0,NULL);
+ objFormatName(&(Private[FAMILYBLUES].key),11,"FamilyBlues");
+ objFormatArray(&(Private[FAMILYBLUES].value),0,NULL);
+ objFormatName(&(Private[FAMILYOTHERBLUES].key),16,"FamilyOtherBlues");
+ objFormatArray(&(Private[FAMILYOTHERBLUES].value),0,NULL);
+ objFormatName(&(Private[BLUESCALE].key),9,"BlueScale");
+ objFormatReal(&(Private[BLUESCALE].value),DEFAULTBLUESCALE);
+ objFormatName(&(Private[BLUESHIFT].key),9,"BlueShift");
+ objFormatInteger(&(Private[BLUESHIFT].value),DEFAULTBLUESHIFT);
+ objFormatName(&(Private[BLUEFUZZ].key),8,"BlueFuzz");
+ objFormatInteger(&(Private[BLUEFUZZ].value),DEFAULTBLUEFUZZ);
+ objFormatName(&(Private[STDHW].key),5,"StdHW");
+ objFormatArray(&(Private[STDHW].value),0,NULL);
+ objFormatName(&(Private[STDVW].key),5,"StdVW");
+ objFormatArray(&(Private[STDVW].value),0,NULL);
+ objFormatName(&(Private[STEMSNAPH].key),9,"StemSnapH");
+ objFormatArray(&(Private[STEMSNAPH].value),0,NULL);
+ objFormatName(&(Private[STEMSNAPV].key),9,"StemSnapV");
+ objFormatArray(&(Private[STEMSNAPV].value),0,NULL);
+ objFormatName(&(Private[FORCEBOLD].key),9,"ForceBold");
+ objFormatBoolean(&(Private[FORCEBOLD].value),DEFAULTFORCEBOLD);
+ objFormatName(&(Private[LANGUAGEGROUP].key),13,"LanguageGroup");
+ objFormatInteger(&(Private[LANGUAGEGROUP].value),DEFAULTLANGUAGEGROUP);
+ objFormatName(&(Private[LENIV].key),5,"LenIV");
+ objFormatInteger(&(Private[LENIV].value),DEFAULTLENIV);
+ objFormatName(&(Private[RNDSTEMUP].key),9,"RndStemUp");
+ objFormatBoolean(&(Private[RNDSTEMUP].value),DEFAULTRNDSTEMUP);
+ objFormatName(&(Private[EXPANSIONFACTOR].key),9,"ExpansionFactor");
+ objFormatReal(&(Private[EXPANSIONFACTOR].value),
+ DEFAULTEXPANSIONFACTOR);
+ return(SCAN_OK);
+}
+/***================================================================***/
+/**********************************************************************/
+/* GetType1Blues(fontP) */
+/* */
+/* Routine to support font-level hints. */
+/* */
+/* Gets all the Blues information from the Private dictionary */
+/* for the font. */
+/* */
+/* */
+/**********************************************************************/
+static int GetType1Blues(psfont *fontP)
+{
+ psdict *PrivateDictP; /* the Private dict relating to hints */
+ struct blues_struct *blues; /* ptr for the blues struct we will allocate */
+ int i;
+ psobj *HintEntryP;
+
+
+
+ /* get the Private dictionary pointer */
+ PrivateDictP = fontP->Private;
+
+ /* allocate the memory for the blues structure */
+ blues = (struct blues_struct *) vm_alloc(sizeof(struct blues_struct));
+
+ if (!blues) return(SCAN_OUT_OF_MEMORY);
+
+ /* Make fontP's blues ptr point to this newly allocated structure. */
+ fontP->BluesP = blues;
+
+ /* fill in the BlueValues array */
+ HintEntryP = &(PrivateDictP[BLUEVALUES].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numBlueValues = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMBLUEVALUES) {
+ blues->numBlueValues = NUMBLUEVALUES;
+ } else
+ blues->numBlueValues = HintEntryP->len;
+ for (i = 0; i<= blues->numBlueValues-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->BlueValues[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->BlueValues[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->BlueValues[i] = 0;
+ }
+ }
+
+ /* fill in the OtherBlues array */
+ HintEntryP = &(PrivateDictP[OTHERBLUES].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numOtherBlues = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMOTHERBLUES) {
+ blues->numOtherBlues = NUMOTHERBLUES;
+ } else
+ blues->numOtherBlues = HintEntryP->len;
+ for (i = 0; i<= blues->numOtherBlues-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->OtherBlues[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->OtherBlues[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->OtherBlues[i] = 0;
+ }
+ }
+
+ /* fill in the FamilyBlues array */
+ HintEntryP = &(PrivateDictP[FAMILYBLUES].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numFamilyBlues = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMFAMILYBLUES) {
+ blues->numFamilyBlues = NUMFAMILYBLUES;
+ } else
+ blues->numFamilyBlues = HintEntryP->len;
+ for (i = 0; i<= blues->numFamilyBlues-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->FamilyBlues[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->FamilyBlues[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->FamilyBlues[i] = 0;
+ }
+ }
+
+ /* fill in the FamilyOtherBlues array */
+ HintEntryP = &(PrivateDictP[FAMILYOTHERBLUES].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numFamilyOtherBlues = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMFAMILYOTHERBLUES) {
+ blues->numFamilyOtherBlues = NUMFAMILYOTHERBLUES;
+ } else
+ blues->numFamilyOtherBlues = HintEntryP->len;
+ for (i = 0; i<= blues->numFamilyOtherBlues-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->FamilyOtherBlues[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->FamilyOtherBlues[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->FamilyOtherBlues[i] = 0;
+ }
+ }
+
+ /* fill in the StemSnapH array */
+ HintEntryP = &(PrivateDictP[STEMSNAPH].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numStemSnapH = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMSTEMSNAPH) {
+ blues->numStemSnapH = NUMSTEMSNAPH;
+ } else
+ blues->numStemSnapH = HintEntryP->len;
+ for (i = 0; i<= blues->numStemSnapH-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->StemSnapH[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->StemSnapH[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->StemSnapH[i] = 0;
+ }
+ }
+
+ /* fill in the StemSnapV array */
+ HintEntryP = &(PrivateDictP[STEMSNAPV].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ blues->numStemSnapV = 0;
+ else {
+ /* get the number of values in the array */
+ if (HintEntryP->len > NUMSTEMSNAPV) {
+ blues->numStemSnapV = NUMSTEMSNAPV;
+ } else
+ blues->numStemSnapV = HintEntryP->len;
+ for (i = 0; i<= blues->numStemSnapV-1; ++i) {
+ if (objPIsInteger(&HintEntryP->data.arrayP[i]))
+ blues->StemSnapV[i] =
+ HintEntryP->data.arrayP[i].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[i]))
+ blues->StemSnapV[i] =
+ HintEntryP->data.arrayP[i].data.real;
+ else
+ blues->StemSnapV[i] = 0;
+ }
+ }
+
+ /* fill in the StdVW array */
+ HintEntryP = &(PrivateDictP[STDVW].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ /* a value of zero signifies no entry */
+ blues->StdVW = 0;
+ else {
+ if (HintEntryP->len > NUMSTDVW) {
+ }
+ if (objPIsInteger(&HintEntryP->data.arrayP[0]))
+ blues->StdVW = HintEntryP->data.arrayP[0].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[0]))
+ blues->StdVW = HintEntryP->data.arrayP[0].data.real;
+ else
+ blues->StdVW = 0;
+ }
+
+ /* fill in the StdHW array */
+ HintEntryP = &(PrivateDictP[STDHW].value);
+ /* check to see if the entry exists and if it's an array */
+ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 ))
+ /* a value of zero signifies no entry */
+ blues->StdHW = 0;
+ else {
+ if (HintEntryP->len > NUMSTDHW) {
+ }
+ if (objPIsInteger(&HintEntryP->data.arrayP[0]))
+ blues->StdHW = HintEntryP->data.arrayP[0].data.integer;
+ else if (objPIsReal(&HintEntryP->data.arrayP[0]))
+ blues->StdHW = HintEntryP->data.arrayP[0].data.real;
+ else
+ blues->StdHW = 0;
+ }
+
+
+ /* get the ptr to the BlueScale entry */
+ HintEntryP = &(PrivateDictP[BLUESCALE].value);
+ /* put the BlueScale in the blues structure */
+ if (objPIsInteger(HintEntryP)) /* Must be integer! */
+ blues->BlueScale = HintEntryP->data.integer;
+ else if (objPIsReal(HintEntryP)) /* Error? */
+ blues->BlueScale = HintEntryP->data.real;
+ else
+ blues->BlueScale = DEFAULTBLUESCALE;
+
+ /* get the ptr to the BlueShift entry */
+ HintEntryP = &(PrivateDictP[BLUESHIFT].value);
+ if (objPIsInteger(HintEntryP)) /* Must be integer! */
+ blues->BlueShift = HintEntryP->data.integer;
+ else if (objPIsReal(HintEntryP)) /* Error? */
+ blues->BlueShift = HintEntryP->data.real;
+ else
+ blues->BlueShift = DEFAULTBLUESHIFT;
+
+ /* get the ptr to the BlueFuzz entry */
+ HintEntryP = &(PrivateDictP[BLUEFUZZ].value);
+ if (objPIsInteger(HintEntryP)) /* Must be integer! */
+ blues->BlueFuzz = HintEntryP->data.integer;
+ else if (objPIsReal(HintEntryP)) /* Error? */
+ blues->BlueFuzz = HintEntryP->data.real;
+ else
+ blues->BlueFuzz = DEFAULTBLUEFUZZ;
+
+ /* get the ptr to the ForceBold entry */
+ HintEntryP = &(PrivateDictP[FORCEBOLD].value);
+ if (objPIsBoolean(HintEntryP)) /* Must be integer! */
+ blues->ForceBold = HintEntryP->data.boolean;
+ else
+ blues->ForceBold = DEFAULTFORCEBOLD;
+
+ /* get the ptr to the LanguageGroup entry */
+ HintEntryP = &(PrivateDictP[LANGUAGEGROUP].value);
+ if (objPIsInteger(HintEntryP)) /* Must be integer! */
+ blues->LanguageGroup = HintEntryP->data.integer;
+ else
+ blues->LanguageGroup = DEFAULTLANGUAGEGROUP;
+
+ /* get the ptr to the RndStemUp entry */
+ HintEntryP = &(PrivateDictP[RNDSTEMUP].value);
+ if (objPIsBoolean(HintEntryP)) /* Must be integer! */
+ blues->RndStemUp = HintEntryP->data.boolean;
+ else
+ blues->RndStemUp = DEFAULTRNDSTEMUP;
+
+ /* get the ptr to the lenIV entry */
+ HintEntryP = &(PrivateDictP[LENIV].value);
+ if (objPIsInteger(HintEntryP)) /* Must be integer! */
+ blues->lenIV = HintEntryP->data.integer;
+ else
+ blues->lenIV = DEFAULTLENIV;
+
+ /* get the ptr to the ExpansionFactor entry */
+ HintEntryP = &(PrivateDictP[EXPANSIONFACTOR].value);
+ if (objPIsInteger(HintEntryP))
+ blues->ExpansionFactor = HintEntryP->data.integer;
+ else if (objPIsReal(HintEntryP))
+ blues->ExpansionFactor = HintEntryP->data.real;
+ else
+ blues->ExpansionFactor = DEFAULTEXPANSIONFACTOR;
+ return(SCAN_OK);
+}
+/**********************************************************************/
+/* GetType1CharString(fontP,code) */
+/* */
+/* Look up code in the standard encoding vector and return */
+/* the charstring associated with the character name. */
+/* */
+/* fontP is the psfont structure. */
+/* */
+/* Returns a psobj (string) */
+/**********************************************************************/
+psobj *GetType1CharString(psfont *fontP, unsigned char code)
+{
+ int N; /* the 'Nth' entry in the CharStrings */
+ psobj *charnameP; /* points to psobj that is name of character*/
+
+ psdict *CharStringsDictP; /* dictionary with char strings */
+ psobj *theStringP; /* the definition for the code */
+
+
+
+ if (StdEncArrayP == NULL) {
+ return(NULL);
+ }
+ /* use the code to index into the standard encoding vector */
+ charnameP = &(StdEncArrayP[code]);
+
+ /* test if the encoding array points to a name */
+ if (!(objPIsName(charnameP)) ) {
+ return(NULL);
+ }
+
+ /* Now that we have the character name out of the standardencoding */
+ /* get the character definition out of the current font */
+ CharStringsDictP = fontP->CharStringsP;
+
+ /* search the chars string for this charname as key */
+ N = SearchDictName(CharStringsDictP,charnameP);
+ if (N<=0) {
+ return(NULL);
+ }
+ /* OK, the nth item is the psobj that is the string for this char */
+ theStringP = &(CharStringsDictP[N].value);
+
+ return(theStringP);
+}
+
+/***================================================================***/
+/*
+ * FindDictValue
+ */
+/***================================================================***/
+
+static int FindDictValue(psdict *dictP)
+{
+ psobj LitName;
+ int N;
+ int V;
+
+ /* we have just scanned a token and it is a literal name */
+ /* need to check if that name is in Private dictionary */
+ objFormatName(&LitName,tokenLength,tokenStartP);
+ /* is it in the dictP */
+ N = SearchDictName(dictP,&LitName);
+ /* if found */
+ if ( N > 0 ) {
+ /* what type */
+ switch (dictP[N].value.type) {
+ case OBJ_ENCODING:
+ V = getEncoding(&(dictP[N].value));
+ if ( V != SCAN_OK ) return(V);
+ break;
+ case OBJ_ARRAY:
+ V = getArray(&(dictP[N].value));
+ if ( V != SCAN_OK ) return(V);
+ break;
+ case OBJ_INTEGER:
+ /* next value in integer */
+ dictP[N].value.data.integer = getInt();
+ if (rc) return(rc); /* if next token was not an Int */
+ break;
+ case OBJ_REAL:
+ /* next value must be real or int, store as a real */
+ scan_token(inputP);
+ if (tokenType == TOKEN_REAL) {
+ dictP[N].value.data.real = tokenValue.real;
+ }
+ else
+ if (tokenType == TOKEN_INTEGER) {
+ dictP[N].value.data.real = tokenValue.integer;
+ }
+ else return(SCAN_ERROR);
+ break;
+ case OBJ_NAME:
+ V = getNextValue(TOKEN_LITERAL_NAME);
+ if ( V != SCAN_OK ) return(V);
+ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY);
+ objFormatName(&(dictP[N].value),tokenLength,tokenStartP);
+ break;
+ case OBJ_STRING:
+ V = getNextValue(TOKEN_STRING);
+ if ( V != SCAN_OK ) return(V);
+ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY);
+ objFormatString(&(dictP[N].value),tokenLength,tokenStartP);
+ break;
+ case OBJ_BOOLEAN:
+ scan_token(inputP);
+ if (tokenType != TOKEN_NAME) {
+ return(SCAN_ERROR);
+ }
+ if (0 == strncmp(tokenStartP,"true",4) ) {
+ dictP[N].value.data.boolean =TRUE;
+ }
+ else
+ if (0 == strncmp(tokenStartP,"false",5) ) {
+ dictP[N].value.data.boolean =FALSE;
+ }
+ else return(SCAN_ERROR);
+ break;
+
+ default:
+ return(SCAN_ERROR);
+ break;
+ }
+ }
+ /* Name is not in dictionary. That is ok. */
+ return(SCAN_OK);
+
+}
+/***================================================================***/
+
+/*
+ * -------------------------------------------------------------------
+ * Scan the next token and convert it into an object
+ * Result is placed on the Operand Stack as next object
+ * -------------------------------------------------------------------
+ */
+int scan_font(psfont *FontP)
+{
+
+
+ char filename[128];
+ char filetype[3];
+ FILE *fileP;
+ const char *nameP;
+ int namelen;
+ int V;
+ int i;
+ boolean starthex80;
+
+ starthex80 = FALSE;
+ filetype[0] = 'r';
+ filetype[1] = 'b';
+ filetype[2] = '\0';
+ /* copy the filename and remove leading or trailing blanks */
+ /* point to name and search for leading blanks */
+ nameP= FontP->FontFileName.data.nameP;
+ namelen = FontP->FontFileName.len;
+ while (nameP[0] == ' ') {
+ nameP++;
+ namelen--;
+ }
+ /* now remove any trailing blanks */
+ while ((namelen>0) && ( nameP[namelen-1] == ' ')) {
+ namelen--;
+ }
+ strncpy(filename,nameP,namelen);
+ filename[namelen] = '\0';
+ /* file name is now constructed */
+ inputFile.data.fileP = NULL;
+ filterFile.data.fileP = NULL;
+
+ inputP = &inputFile;
+ if ((fileP = fopen(filename,filetype))) {
+ /* get the first byte of file */
+ V = getc(fileP);
+ /* if file starts with x'80' then skip next 5 bytes */
+ if ( V == 0X80 ) {
+ for (i=0;i<5;i++) V = getc(fileP);
+ starthex80 = TRUE;
+ }
+ else ungetc(V,fileP);
+ objFormatFile(inputP,fileP);
+ }
+ else {
+ return(SCAN_FILE_OPEN_ERROR);
+ };
+
+ WantFontInfo = TRUE;
+ InPrivateDict = FALSE;
+ TwoSubrs = FALSE;
+ rc = BuildFontInfo(FontP);
+ if (rc != 0) return(rc);
+
+ /* Assume everything will be OK */
+ rc = 0;
+
+ /* Loop until complete font is read */
+ do {
+ /* Scan the next token */
+ scan_token(inputP);
+
+ /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */
+ /* now set */
+
+ switch (tokenType) {
+ case TOKEN_EOF:
+ case TOKEN_NONE:
+ case TOKEN_INVALID:
+ /* in this case we are done */
+ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY);
+ rc = SCAN_ERROR;
+ break;
+ case TOKEN_LITERAL_NAME:
+ /* Look up the name */
+ tokenStartP[tokenLength] = '\0';
+ if (InPrivateDict ) {
+ if (0== strncmp(tokenStartP,"Subrs",5) ) {
+ rc = BuildSubrs(FontP);
+ break;
+ }
+ if (0== strncmp(tokenStartP,"CharStrings",11) ) {
+ rc = BuildCharStrings(FontP);
+ if ( (rc == SCAN_OK) ||(rc == SCAN_END) ) {
+ fclose(inputP->data.fileP);
+ /* Build the Blues Structure */
+ rc = GetType1Blues(FontP);
+ /* whatever the return code, return it */
+ /* all the work is done. This is the normal exit.*/
+ return(rc);
+ }
+ break;
+ }
+ rc = FindDictValue(FontP->Private);
+ /* we are not going to report errors */
+ /* Sometimes the font file may test a value such as */
+ /* testing to see if the font is alreadly loaded with */
+ /* same UniqueID. We would faile on /UniqueID get */
+ /* because we are expecting a int to follow UniqueID*/
+ /* If the correct object type does not follow a Name*/
+ /* then we will skip over it without reporting error*/
+ rc = SCAN_OK;
+ break;
+ } /* end of reading Private dictionary */
+ else
+ if (0== strncmp(tokenStartP,"Private",7) ) {
+ InPrivateDict = TRUE;
+ rc = BuildPrivate(FontP);
+ break;
+ }
+ else
+ if (WantFontInfo) {
+ rc = FindDictValue(FontP->fontInfoP);
+ /* we are not going to report errors */
+ rc = SCAN_OK;
+ break;
+ }
+ break;
+ case TOKEN_NAME:
+ if (0 == strncmp(tokenStartP,"eexec",5) ) {
+ /* if file started with x'80', check next 5 bytes */
+ if (starthex80) {
+ V = getc(fileP);
+ if ( V == 0X80 ) {
+ for (i=0;i<5;i++) V = getc(fileP);
+ }
+ else ungetc(V,fileP);
+ }
+ filterFile.data.fileP = T1eexec(inputP->data.fileP);
+ if (filterFile.data.fileP == NULL) {
+ fclose(inputFile.data.fileP);
+ return(SCAN_FILE_OPEN_ERROR);
+ }
+ inputP = &filterFile;
+
+ WantFontInfo = FALSE;
+ }
+ break;
+ }
+
+ }
+ while (rc ==0);
+ fclose(inputP->data.fileP);
+ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY);
+ return(rc);
+}
+
diff --git a/fonts/utilities/ps2pk/sexpr.c b/fonts/utilities/ps2pk/sexpr.c
new file mode 100644
index 0000000000..d069cce1c0
--- /dev/null
+++ b/fonts/utilities/ps2pk/sexpr.c
@@ -0,0 +1,25 @@
+/*
+ * File: sexpr.c
+ * Purpose: evaluate algebraic expression from single argument
+ * (Derived from expr.c from J.T. Conklin <jtc@netbsd.org>.)
+ * Version: 1.0 (Nov 1995)
+ * Author: Piet Tutelaers
+ */
+
+#include <stdio.h>
+#include "strexpr.h" /* strexpr() */
+#include "basics.h" /* fatal() */
+
+int main(int argc, char *argv[]) {
+ int result;
+
+ if (argc < 2) fatal("Usage: sexpr expression ...\n");
+
+ while (--argc > 0) {
+ if (strexpr(&result, *++argv))
+ fatal("expression error\n");
+
+ printf("%s = %d\n", argv[0] , result);
+ }
+ exit(0);
+}
diff --git a/fonts/utilities/ps2pk/spaces.c b/fonts/utilities/ps2pk/spaces.c
new file mode 100644
index 0000000000..a8845e3a22
--- /dev/null
+++ b/fonts/utilities/ps2pk/spaces.c
@@ -0,0 +1,999 @@
+/* $XConsortium: spaces.c,v 1.4 91/10/10 11:19:16 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+ /* SPACES CWEB V0021 ******** */
+/*
+:h1 id=spaces.SPACES Module - Handles Coordinate Spaces
+
+This module is responsible for handling the TYPE1IMAGER "XYspace" object.
+
+&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com)
+
+
+:h3.Include Files
+*/
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "pictures.h"
+#include "fonts.h"
+#include "arith.h"
+
+static void FindFfcn(DOUBLE, DOUBLE, fractpel (**)());
+static void FindIfcn(DOUBLE, DOUBLE, fractpel *, fractpel *, fractpel (**)());
+/*
+:h3.Entry Points Provided to the TYPE1IMAGER User
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.Entry Points Provided to Other Modules
+*/
+
+/*
+In addition, other modules call the SPACES module through function
+vectors in the "XYspace" structure. The entry points accessed that
+way are "FConvert()", "IConvert()", and "ForceFloat()".
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h3.Macros and Typedefs Provided to Other Modules
+
+:h4.Duplicating and Killing Spaces
+
+Destroying XYspaces is so simple we can do it with a
+macro:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+On the other hand, duplicating XYspaces is slightly more difficult
+because of the need to keep a unique ID in the space, see
+:hdref refid=dupspace..
+
+:h4.Fixed Point Pel Representation
+
+We represent pel positions with fixed point numbers. This does NOT
+mean integer, but truly means fixed point, with a certain number
+of binary digits (FRACTBITS) representing the fractional part of the
+pel.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+/*
+:h2.Data Structures for Coordinate Spaces and Points
+*/
+/*
+:h3 id=matrix.Matrices
+
+TYPE1IMAGER uses 2x2 transformation matrices. We'll use C notation for
+such a matrix (M[2][2]), the first index being rows, the second columns.
+*/
+
+/*
+:h3.The "doublematrix" Structure
+
+We frequently find it desirable to store both a matrix and its
+inverse. We store these in a "doublematrix" structure.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.The "XYspace" Structure
+
+The XYspace structure represents the XYspace object.
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+#define RESERVED 10 /* 'n' IDs are reserved for invalid & immortal spaces */
+/*
+*/
+#define NEXTID ((SpaceID < RESERVED) ? (SpaceID = RESERVED) : ++SpaceID)
+
+static unsigned int SpaceID = 1;
+
+struct XYspace *CopySpace(register struct XYspace *S)
+{
+ S = (struct XYspace *)Allocate(sizeof(struct XYspace), S, 0);
+ S->ID = NEXTID;
+ return(S);
+}
+/*
+:h3.The "fractpoint" Structure
+
+A fractional point is just a "fractpel" x and y:
+*/
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.Lazy Evaluation of Matrix Inverses
+
+Calculating the inverse of a matrix is somewhat involved, and we usually
+do not need them. So, we flag whether or not the space has the inverse
+already calculated:
+*/
+
+#define HASINVERSE(flag) ((flag)&0x80)
+
+/*
+The following macro forces a space to have an inverse:
+*/
+
+#define CoerceInverse(S) if (!HASINVERSE((S)->flag)) { \
+ MatrixInvert((S)->tofract.normal, (S)->tofract.inverse); (S)->flag |= HASINVERSE(ON); }
+/*
+:h3.IDENTITY Space
+
+IDENTITY space is (logically) the space corresponding to the identity
+transformation matrix. However, since all our transformation matrices
+have a common FRACTFLOAT scale factor to convert to 'fractpel's, that
+is actually what we store in 'tofract' matrix of IDENTITY:
+*/
+
+static struct XYspace identity = { SPACETYPE, ISPERMANENT(ON) + ISIMMORTAL(ON)
+ + HASINVERSE(ON), 2, /* added 3-26-91 PNM */
+ NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ INVALIDID + 1, 0,
+ { { { FRACTFLOAT, 0.0 }, { 0.0, FRACTFLOAT } },
+ { { 1.0/FRACTFLOAT, 0.0 }, { 0.0, 1.0/FRACTFLOAT } } },
+ { { 0, 0 }, { 0, 0 } } };
+struct XYspace *IDENTITY = &identity;
+
+/*
+*/
+#define MAXCONTEXTS 16
+
+static struct doublematrix contexts[MAXCONTEXTS];
+
+#if 0
+
+static int nextcontext = 1;
+
+/*SHARED LINE(S) ORIGINATED HERE*/
+
+/*
+:h3.FindDeviceContext() - Find the Context Given a Device
+
+This routine, given a device, returns the index of the device's
+transformation matrix in the context array. If it cannot find it,
+it will allocate a new array entry and fill it out.
+*/
+
+static int FindDeviceContext(
+ void *device) /* device token */
+{
+ DOUBLE M[2][2]; /* temporary matrix */
+ float Xres,Yres; /* device resolution */
+ int orient = -1; /* device orientation */
+ int rc = -1; /* return code for QueryDeviceState */
+
+ if (rc != 0) /* we only bother with this check once */
+ t1_abort("Context: QueryDeviceState didn't work");
+
+ M[0][0] = M[1][0] = M[0][1] = M[1][1] = 0.0;
+
+ switch (orient) {
+ case 0:
+ M[0][0] = Xres; M[1][1] = -Yres;
+ break;
+ case 1:
+ M[1][0] = Yres; M[0][1] = Xres;
+ break;
+ case 2:
+ M[0][0] = -Xres; M[1][1] = Yres;
+ break;
+ case 3:
+ M[1][0] = -Yres; M[0][1] = -Xres;
+ break;
+ default:
+ t1_abort("QueryDeviceState returned invalid orientation");
+ }
+ return(FindContext(M));
+}
+
+/*
+:h3.FindContext() - Find the Context Given a Matrix
+
+This routine, given a matrix, returns the index of that matrix matrix in
+the context array. If it cannot find it, it will allocate a new array
+entry and fill it out.
+*/
+
+int FindContext(
+ DOUBLE M[2][2]) /* array to search for */
+{
+ register int i; /* loop variable for search */
+ for (i=0; i < nextcontext; i++)
+ if (M[0][0] == contexts[i].normal[0][0] && M[1][0] == contexts[i].normal[1][0]
+ && M[0][1] == contexts[i].normal[0][1] && M[1][1] == contexts[i].normal[1][1])
+ break;
+
+ if (i >= nextcontext) {
+ if (i >= MAXCONTEXTS)
+ t1_abort("Context: out of them");
+ INT32COPY(contexts[i].normal, M, sizeof(contexts[i].normal));
+ MatrixInvert(M, contexts[i].inverse);
+ nextcontext++;
+ }
+
+ return(i);
+}
+
+/*
+:h3.Context() - Create a Coordinate Space for a Device
+
+This user operator is implemented by first finding the device context
+array index, then transforming IDENTITY space to create an appropriate
+cooridnate space.
+*/
+
+struct XYspace *Context(
+ void *device, /* device token */
+ DOUBLE units) /* multiples of one inch */
+{
+ DOUBLE M[2][2]; /* device transformation matrix */
+ register int n; /* will hold device context number */
+ register struct XYspace *S; /* XYspace constructed */
+
+ IfTrace2((MustTraceCalls),"Context(%p, %f)\n", device, units);
+
+ ARGCHECK((device == NULL), "Context of NULLDEVICE not allowed",
+ NULL, IDENTITY, (0), struct XYspace *);
+ ARGCHECK((units == 0.0), "Context: bad units", NULL, IDENTITY, (0), struct XYspace *);
+
+ n = FindDeviceContext(device);
+
+ INT32COPY(M, contexts[n].normal, sizeof(M));
+
+ M[0][0] *= units;
+ M[0][1] *= units;
+ M[1][0] *= units;
+ M[1][1] *= units;
+
+ S = (struct XYspace *)Xform(IDENTITY, M);
+
+ S->context = n;
+ return(S);
+}
+#endif
+
+/*
+:h3.ConsiderContext() - Adjust a Matrix to Take Out Device Transform
+
+Remember, we have :f/x times U times D/ and :f/M/ and and we want :f/x
+times U times M times D/. An easy way to do this is to calculate
+:f/D sup <-1> times M times D/, because:
+:formula.
+x times U times D times D sup <-1> times M times D = x times U times M times D
+:formula.
+So this subroutine, given an :f/M/and an object, finds the :f/D/ for that
+object and modifies :f/M/ so it is :f/D sup <-1> times M times D/.
+*/
+
+static void ConsiderContext(
+ register struct xobject *obj, /* object to be transformed */
+ register DOUBLE M[2][2]) /* matrix (may be changed) */
+{
+ register int context; /* index in contexts array */
+
+ if (obj == NULL) return;
+
+ if (ISPATHTYPE(obj->type)) {
+ struct segment *path = (struct segment *) obj;
+
+ context = path->context;
+ }
+ else if (obj->type == SPACETYPE) {
+ struct XYspace *S = (struct XYspace *) obj;
+
+ context = S->context;
+ }
+ else if (obj->type == PICTURETYPE) {
+ context = NULLCONTEXT;
+ }
+ else
+ context = NULLCONTEXT;
+
+ if (context != NULLCONTEXT) {
+ MatrixMultiply(contexts[context].inverse, M, M);
+ MatrixMultiply(M, contexts[context].normal, M);
+ }
+}
+
+/*
+:h2.Conversion from User's X,Y to "fractpel" X,Y
+
+When the user is building paths (lines, moves, curves, etc.) he passes
+the control points (x,y) for the paths together with an XYspace. We
+must convert from the user's (x,y) to our internal representation
+which is in pels (fractpels, actually). This involves transforming
+the user's (x,y) under the coordinate space transformation. It is
+important that we do this quickly. So, we store pointers to different
+conversion functions right in the XYspace structure. This allows us
+to have simpler special case functions for the more commonly
+encountered types of transformations.
+
+:h3.Convert(), IConvert(), and ForceFloat() - Called Through "XYspace" Structure
+
+These are functions that fit in the "convert" and "iconvert" function
+pointers in the XYspace structure. They call the "xconvert", "yconvert",
+"ixconvert", and "iyconvert" as appropriate to actually do the work.
+These secondary routines come in many flavors to handle different
+special cases as quickly as possible.
+*/
+
+static void FXYConvert(
+ register struct fractpoint *pt, /* point to set */
+ register struct XYspace *S, /* relevant coordinate space */
+ register DOUBLE x, register DOUBLE y) /* user's coordinates of point */
+{
+ pt->x = (*S->xconvert)(S->tofract.normal[0][0], S->tofract.normal[1][0], x, y);
+ pt->y = (*S->yconvert)(S->tofract.normal[0][1], S->tofract.normal[1][1], x, y);
+}
+
+static void IXYConvert(
+ register struct fractpoint *pt, /* point to set */
+ register struct XYspace *S, /* relevant coordinate space */
+ register int32_t x, register int32_t y)
+ /* user's coordinates of point */
+{
+ pt->x = (*S->ixconvert)(S->itofract[0][0], S->itofract[1][0], x, y);
+ pt->y = (*S->iyconvert)(S->itofract[0][1], S->itofract[1][1], x, y);
+}
+
+/*
+ForceFloat is a substitute for IConvert(), when we just do not have
+enough significant digits in the coefficients to get high enough
+precision in the answer with fixed point arithmetic. So, we force the
+integers to floats, and do the arithmetic all with floats:
+*/
+
+static void ForceFloat(
+ register struct fractpoint *pt, /* point to set */
+ register struct XYspace *S, /* relevant coordinate space */
+ register int32_t x, register int32_t y)
+ /* user's coordinates of point */
+{
+ (*S->convert)(pt, S, (DOUBLE) x, (DOUBLE) y);
+}
+
+/*
+:h3.FXYboth(), FXonly(), FYonly() - Floating Point Conversion
+
+These are the routines we use when the user has given us floating
+point numbers for x and y. FXYboth() is the general purpose routine;
+FXonly() and FYonly() are special cases when one of the coefficients
+is 0.0.
+*/
+
+static fractpel FXYboth(
+ register DOUBLE cx, register DOUBLE cy, /* x and y coefficients */
+ register DOUBLE x, register DOUBLE y) /* user x,y */
+{
+ register DOUBLE r; /* temporary float */
+
+ r = x * cx + y * cy;
+ return((fractpel) r);
+}
+
+/*ARGSUSED*/
+static fractpel FXonly(
+ register DOUBLE cx, register DOUBLE cy, /* x and y coefficients */
+ register DOUBLE x, register DOUBLE y) /* user x,y */
+{
+ register DOUBLE r; /* temporary float */
+
+ r = x * cx;
+ return((fractpel) r);
+}
+
+/*ARGSUSED*/
+static fractpel FYonly(
+ register DOUBLE cx, register DOUBLE cy, /* x and y coefficients */
+ register DOUBLE x, register DOUBLE y) /* user x,y */
+{
+ register DOUBLE r; /* temporary float */
+
+ r = y * cy;
+ return((fractpel) r);
+}
+
+/*
+:h3.IXYboth(), IXonly(), IYonly() - Simple Integer Conversion
+
+These are the routines we use when the user has given us integers for
+x and y, and the coefficients have enough significant digits to
+provide precise answers with only "long" (32 bit?) multiplication.
+IXYboth() is the general purpose routine; IXonly() and IYonly() are
+special cases when one of the coefficients is 0.
+*/
+
+static fractpel IXYboth(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return(x * cx + y * cy);
+}
+
+/*ARGSUSED*/
+static fractpel IXonly(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return(x * cx);
+}
+
+/*ARGSUSED*/
+static fractpel IYonly(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return(y * cy);
+}
+
+
+/*
+:h3.FPXYboth(), FPXonly(), FPYonly() - More Involved Integer Conversion
+
+These are the routines we use when the user has given us integers for
+x and y, but the coefficients do not have enough significant digits to
+provide precise answers with only "long" (32 bit?) multiplication.
+We have increased the number of significant bits in the coefficients
+by FRACTBITS; therefore we must use "double long" (64 bit?)
+multiplication by calling FPmult(). FPXYboth() is the general purpose
+routine; FPXonly() and FPYonly() are special cases when one of the
+coefficients is 0.
+
+Note that it is perfectly possible for us to calculate X with the
+"FP" method and Y with the "I" method, or vice versa. It all depends
+on how the functions in the XYspace structure are filled out.
+*/
+
+static fractpel FPXYboth(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return( FPmult(x, cx) + FPmult(y, cy) );
+}
+
+/*ARGSUSED*/
+static fractpel FPXonly(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return( FPmult(x, cx) );
+}
+
+/*ARGSUSED*/
+static fractpel FPYonly(
+ register fractpel cx, register fractpel cy, /* x and y coefficients */
+ register int32_t x, register int32_t y) /* user x,y */
+{
+ return( FPmult(y, cy) );
+}
+
+
+
+/*
+:h3.FillOutFcns() - Determine the Appropriate Functions to Use for Conversion
+
+This function fills out the "convert" and "iconvert" function pointers
+in an XYspace structure, and also fills the "helper"
+functions that actually do the work.
+*/
+
+static void FillOutFcns(
+ register struct XYspace *S) /* functions will be set in this structure */
+{
+ S->convert = FXYConvert;
+ S->iconvert = IXYConvert;
+
+ FindFfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->xconvert);
+ FindFfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->yconvert);
+ FindIfcn(S->tofract.normal[0][0], S->tofract.normal[1][0],
+ &S->itofract[0][0], &S->itofract[1][0], &S->ixconvert);
+ FindIfcn(S->tofract.normal[0][1], S->tofract.normal[1][1],
+ &S->itofract[0][1], &S->itofract[1][1], &S->iyconvert);
+
+ if (S->ixconvert == NULL || S->iyconvert == NULL)
+ S->iconvert = ForceFloat;
+}
+
+/*
+:h4.FindFfcn() - Subroutine of FillOutFcns() to Fill Out Floating Functions
+
+This function tests for the special case of one of the coefficients
+being zero:
+*/
+
+static void FindFfcn(
+ register DOUBLE cx, register DOUBLE cy, /* x and y coefficients */
+ register fractpel (**fcnP)()) /* pointer to function to set */
+{
+ if (cx == 0.0)
+ *fcnP = FYonly;
+ else if (cy == 0.0)
+ *fcnP = FXonly;
+ else
+ *fcnP = FXYboth;
+}
+
+/*
+:h4.FindIfcn() - Subroutine of FillOutFcns() to Fill Out Integer Functions
+
+There are two types of integer functions, the 'I' type and the 'FP' type.
+We use the I type functions when we are satisfied with simple integer
+arithmetic. We used the FP functions when we feel we need higher
+precision (but still fixed point) arithmetic. If all else fails,
+we store a NULL indicating that this we should do the conversion in
+floating point.
+*/
+
+static void FindIfcn(
+ register DOUBLE cx, DOUBLE cy, /* x and y coefficients */
+ register fractpel *icxP, /* fixed point ... */
+ register fractpel *icyP, /* ... coefficients to set */
+ register fractpel (**fcnP)()) /* pointer to function to set */
+{
+ register fractpel imax; /* maximum of cx and cy */
+
+ *icxP = cx;
+ *icyP = cy;
+
+ if (cx != (float) (*icxP) || cy != (float) (*icyP)) {
+/*
+At this point we know our integer approximations of the coefficients
+are not exact. However, we will still use them if the maximum
+coefficient will not fit in a 'fractpel'. Of course, we have little
+choice at that point, but we haven't lost that much precision by
+staying with integer arithmetic. We have enough significant digits
+so that
+any error we introduce is less than one part in 2:sup/16/.
+*/
+
+ imax = MAX(ABS(*icxP), ABS(*icyP));
+ if (imax < (fractpel) (1<<(FRACTBITS-1)) ) {
+/*
+At this point we know our integer approximations just do not have
+enough significant digits for accuracy. We will add FRACTBITS
+significant digits to the coefficients (by multiplying them by
+1<<FRACTBITS) and go to the "FP" form of the functions. First, we
+check to see if we have ANY significant digits at all (that is, if
+imax == 0). If we don't, we suspect that adding FRACTBITS digits
+won't help, so we punt the whole thing.
+*/
+ if (imax == 0) {
+ *fcnP = NULL;
+ return;
+ }
+ cx *= FRACTFLOAT;
+ cy *= FRACTFLOAT;
+ *icxP = cx;
+ *icyP = cy;
+ *fcnP = FPXYboth;
+ }
+ else
+ *fcnP = IXYboth;
+ }
+ else
+ *fcnP = IXYboth;
+/*
+Now we check for special cases where one coefficient is zero (after
+integer conversion):
+*/
+ if (*icxP == 0)
+ *fcnP = (*fcnP == FPXYboth) ? FPYonly : IYonly;
+ else if (*icyP == 0)
+ *fcnP = (*fcnP == FPXYboth) ? FPXonly : IXonly;
+}
+/*
+:h3.UnConvert() - Find User Coordinates From FractPoints
+
+The interesting thing with this routine is that we avoid calculating
+the matrix inverse of the device transformation until we really need
+it, which is to say, until this routine is called for the first time
+with a given coordinate space.
+
+We also only calculate it only once. If the inverted matrix is valid,
+we don't calculate it; if not, we do. We never expect matrices with
+zero determinants, so by convention, we mark the matrix is invalid by
+marking both X terms zero.
+*/
+
+void UnConvert(
+ register struct XYspace *S, /* relevant coordinate space */
+ register struct fractpoint *pt, /* device coordinates */
+ DOUBLE *xp, DOUBLE *yp) /* where to store resulting x,y */
+{
+ DOUBLE x,y;
+
+ CoerceInverse(S);
+ x = pt->x;
+ y = pt->y;
+ *xp = S->tofract.inverse[0][0] * x + S->tofract.inverse[1][0] * y;
+ *yp = S->tofract.inverse[0][1] * x + S->tofract.inverse[1][1] * y;
+}
+
+/*
+:h2.Transformations
+*/
+/*
+:h3 id=xform.Xform() - Transform Object in X and Y
+
+TYPE1IMAGER wants transformations of objects like paths to be identical
+to transformations of spaces. For example, if you scale a line(1,1)
+by 10 it should yield the same result as generating the line(1,1) in
+a coordinate space that has been scaled by 10.
+
+We handle fonts by storing the accumulated transform, for example, SR
+(accumulating on the right). Then when we map the font through space TD,
+for example, we multiply the accumulated font transform on the left by
+the space transform on the right, yielding SRTD in this case. We will
+get the same result if we did S, then R, then T on the space and mapping
+an unmodified font through that space.
+*/
+static void PseudoSpace(struct XYspace *, DOUBLE[2][2]);
+
+struct xobject *t1_Xform(
+ register struct xobject *obj, /* object to transform */
+ register DOUBLE M[2][2]) /* transformation matrix */
+{
+ if (obj == NULL)
+ return(NULL);
+
+ if (obj->type == FONTTYPE) {
+ register struct font *F = (struct font *) obj;
+
+ F = UniqueFont(F);
+ return((struct xobject*)F);
+ }
+ if (obj->type == PICTURETYPE) {
+/*
+In the case of a picture, we choose both to update the picture's
+transformation matrix and keep the handles up to date.
+*/
+ register struct picture *P = (struct picture *) obj;
+ register struct segment *handles; /* temporary path to transform handles */
+
+ P = UniquePicture(P);
+ handles = PathSegment(LINETYPE, P->origin.x, P->origin.y);
+ handles = Join(handles,
+ PathSegment(LINETYPE, P->ending.x, P->ending.y) );
+ handles = (struct segment *)Xform((struct xobject *) handles, M);
+ P->origin = handles->dest;
+ P->ending = handles->link->dest;
+ KillPath(handles);
+ return((struct xobject *)P);
+ }
+
+ if (ISPATHTYPE(obj->type)) {
+ struct XYspace pseudo; /* local temporary space */
+ PseudoSpace(&pseudo, M);
+ return((struct xobject *) PathTransform((struct segment *)obj, &pseudo));
+ }
+
+
+ if (obj->type == SPACETYPE) {
+ register struct XYspace *S = (struct XYspace *) obj;
+
+/* replaced ISPERMANENT(S->flag) with S->references > 1 3-26-91 PNM */
+ if (S->references > 1)
+ S = CopySpace(S);
+ else
+ S->ID = NEXTID;
+
+ MatrixMultiply(S->tofract.normal, M, S->tofract.normal);
+ /*
+ * mark inverted matrix invalid:
+ */
+ S->flag &= ~HASINVERSE(ON);
+
+ FillOutFcns(S);
+ return((struct xobject *) S);
+ }
+
+ return(ArgErr("Untransformable object", obj, obj));
+}
+
+/*
+:h3.Transform() - Transform an Object
+
+This is the external user's entry point.
+*/
+struct xobject *t1_Transform(
+ struct xobject *obj,
+ DOUBLE cxx, DOUBLE cyx, /* 2x2 transform matrix ... */
+ DOUBLE cxy, DOUBLE cyy) /* ... elements in row order */
+{
+ DOUBLE M[2][2];
+
+ IfTrace1((MustTraceCalls),"Transform(%p,", obj);
+ IfTrace4((MustTraceCalls)," %f %f %f %f)\n", cxx, cyx, cxy, cyy);
+
+ M[0][0] = cxx;
+ M[0][1] = cyx;
+ M[1][0] = cxy;
+ M[1][1] = cyy;
+ ConsiderContext(obj, M);
+ return(Xform(obj, M));
+}
+/*
+:h3.Scale() - Special Case of Transform()
+
+This is a user operator.
+*/
+
+struct xobject *t1_Scale(
+ struct xobject *obj, /* object to scale */
+ DOUBLE sx, DOUBLE sy) /* scale factors in x and y */
+{
+ DOUBLE M[2][2];
+ IfTrace3((MustTraceCalls),"Scale(%p, %f, %f)\n", obj, sx, sy);
+ M[0][0] = sx;
+ M[1][1] = sy;
+ M[1][0] = M[0][1] = 0.0;
+ ConsiderContext(obj, M);
+ return(Xform(obj, M));
+}
+
+#if 0
+/*
+:h3 id=rotate.Rotate() - Special Case of Transform()
+
+We special-case different settings of 'degrees' for performance
+and accuracy within the DegreeSin() and DegreeCos() routines themselves.
+*/
+
+struct xobject *xiRotate(
+ struct xobject *obj, /* object to be transformed */
+ DOUBLE degrees) /* degrees of COUNTER-clockwise rotation */
+{
+ DOUBLE M[2][2];
+
+
+ IfTrace2((MustTraceCalls),"Rotate(%p, %f)\n", obj, degrees);
+
+ M[0][0] = M[1][1] = DegreeCos(degrees);
+ M[1][0] = - (M[0][1] = DegreeSin(degrees));
+ ConsiderContext(obj, M);
+ return(Xform(obj, M));
+}
+#endif
+
+/*
+:h3.PseudoSpace() - Build a Coordinate Space from a Matrix
+
+Since we have built all this optimized code that, given an (x,y) and
+a coordinate space, yield transformed (x,y), it seems a shame not to
+use the same logic when we need to multiply an (x,y) by an arbitrary
+matrix that is not (initially) part of a coordinate space. This
+subroutine takes the arbitrary matrix and builds a coordinate
+space, with all its nifty function pointers.
+*/
+
+static void PseudoSpace(
+ struct XYspace *S, /* coordinate space structure to fill out */
+ DOUBLE M[2][2]) /* matrix that will become 'tofract.normal' */
+{
+ S->type = SPACETYPE;
+ S->flag = ISPERMANENT(ON) + ISIMMORTAL(ON);
+ S->references = 2; /* 3-26-91 added PNM */
+ S->tofract.normal[0][0] = M[0][0];
+ S->tofract.normal[1][0] = M[1][0];
+ S->tofract.normal[0][1] = M[0][1];
+ S->tofract.normal[1][1] = M[1][1];
+
+ FillOutFcns(S);
+}
+
+/*
+:h2 id=matrixa.Matrix Arithmetic
+
+Following the convention in Newman and Sproull, :hp1/Interactive
+Computer Graphics/,
+matrices are organized:
+:xmp.
+ | cxx cyx |
+ | cxy cyy |
+:exmp.
+A point is horizontal, for example:
+:xmp.
+ [ x y ]
+:exmp.
+This means that:
+:formula/x prime = cxx times x + cxy times y/
+:formula/y prime = cyx times x + cyy times y/
+I've seen the other convention, where transform matrices are
+transposed, equally often in the literature.
+*/
+
+/*
+:h3.MatrixMultiply() - Implements Multiplication of Two Matrices
+
+Implements matrix multiplication, A * B = C.
+
+To remind myself, matrix multiplication goes rows of A times columns
+of B.
+The output matrix may be the same as one of the input matrices.
+*/
+void MatrixMultiply(
+ register DOUBLE A[2][2], /* input ... */
+ register DOUBLE B[2][2], /* ... matrices */
+ register DOUBLE C[2][2]) /* output matrix */
+{
+ register DOUBLE txx,txy,tyx,tyy;
+
+ txx = A[0][0] * B[0][0] + A[0][1] * B[1][0];
+ txy = A[1][0] * B[0][0] + A[1][1] * B[1][0];
+ tyx = A[0][0] * B[0][1] + A[0][1] * B[1][1];
+ tyy = A[1][0] * B[0][1] + A[1][1] * B[1][1];
+
+ C[0][0] = txx;
+ C[1][0] = txy;
+ C[0][1] = tyx;
+ C[1][1] = tyy;
+}
+/*
+:h3.MatrixInvert() - Invert a Matrix
+
+My reference for matrix inversion was :hp1/Elementary Linear Algebra/
+by Paul C. Shields, Worth Publishers, Inc., 1968.
+*/
+void MatrixInvert(
+ DOUBLE M[2][2], /* input matrix */
+ DOUBLE Mprime[2][2]) /* output inverted matrix */
+{
+ register DOUBLE D; /* determinant of matrix M */
+ register DOUBLE txx,txy,tyx,tyy;
+
+ txx = M[0][0];
+ txy = M[1][0];
+ tyx = M[0][1];
+ tyy = M[1][1];
+
+ D = M[1][1] * M[0][0] - M[1][0] * M[0][1];
+ if (D == 0.0)
+ t1_abort("MatrixInvert: can't");
+
+ Mprime[0][0] = tyy / D;
+ Mprime[1][0] = -txy / D;
+ Mprime[0][1] = -tyx / D;
+ Mprime[1][1] = txx / D;
+}
+/*
+:h2.Initialization, Queries, and Debug
+*/
+/*
+:h3.InitSpaces() - Initialize Constant Spaces
+
+For compatibility, we initialize a coordinate space called USER which
+maps 72nds of an inch to pels on the default device.
+*/
+
+struct XYspace *USER = &identity;
+
+void InitSpaces(void)
+{
+ IDENTITY->type = SPACETYPE;
+ FillOutFcns(IDENTITY);
+
+ contexts[NULLCONTEXT].normal[1][0]
+ = contexts[NULLCONTEXT].normal[0][1]
+ = contexts[NULLCONTEXT].inverse[1][0]
+ = contexts[NULLCONTEXT].inverse[0][1] = 0.0;
+ contexts[NULLCONTEXT].normal[0][0]
+ = contexts[NULLCONTEXT].normal[1][1]
+ = contexts[NULLCONTEXT].inverse[0][0]
+ = contexts[NULLCONTEXT].inverse[1][1] = 1.0;
+
+ USER->flag |= ISIMMORTAL(ON);
+ CoerceInverse(USER);
+}
+/*
+:h3.QuerySpace() - Returns the Transformation Matrix of a Space
+
+Since the tofract matrix of an XYspace includes the scale factor
+necessary to produce fractpel results (i.e., FRACTFLOAT), this
+must be taken out before we return the matrix to the user. Fortunately,
+this is simple: just multiply by the inverse of IDENTITY!
+*/
+
+void QuerySpace(
+ register struct XYspace *S, /* space asked about */
+ register DOUBLE *cxxP, register DOUBLE *cyxP, /* where to ... */
+ register DOUBLE *cxyP, register DOUBLE *cyyP) /* ... put answer */
+{
+ DOUBLE M[2][2]; /* temp matrix to build user's answer */
+
+ if (S->type != SPACETYPE) {
+ ArgErr("QuerySpace: not a space", S, NULL);
+ return;
+ }
+ MatrixMultiply(S->tofract.normal, IDENTITY->tofract.inverse, M);
+ *cxxP = M[0][0];
+ *cxyP = M[1][0];
+ *cyxP = M[0][1];
+ *cyyP = M[1][1];
+}
+
+#if 0
+/*
+:h3.FormatFP() - Format a Fixed Point Pel
+
+We format the pel as "dddd.XXXX", where XX's are hexidecimal digits,
+and the dd's are decimal digits. This might be a little confusing
+mixing hexidecimal and decimal like that, but it is convenient
+to use for debug.
+
+We make sure we have N (FRACTBITS/4) digits past the decimal point.
+*/
+#define FRACTMASK ((1<<FRACTBITS)-1) /* mask for fractional part */
+
+static void FormatFP(
+ register char *str, /* output str */
+ register fractpel fpel) /* fractional pel input */
+{
+ char temp[8];
+ register char *s;
+ register const char *sign;
+
+ if (fpel < 0) {
+ sign = "-";
+ fpel = -fpel;
+ }
+ else
+ sign = "";
+
+ sprintf(temp, "000%x", fpel & FRACTMASK);
+ s = temp + strlen(temp) - (FRACTBITS/4);
+
+ sprintf(str, "%s%d.%sx", sign, fpel >> FRACTBITS, s);
+}
+
+/*
+:h3.DumpSpace() - Display a Coordinate Space
+*/
+/*ARGSUSED*/
+void DumpSpace(register struct XYspace *S)
+{
+ IfTrace4(TRUE,"--Coordinate space at %p,ID=%d,convert=%p,iconvert=%p\n",
+ S, S->ID, S->convert, S->iconvert);
+ IfTrace2(TRUE," | %12.3f %12.3f |",
+ S->tofract.normal[0][0], S->tofract.normal[0][1]);
+ IfTrace2(TRUE," [ %d %d ]\n", S->itofract[0][0], S->itofract[0][1]);
+ IfTrace2(TRUE," | %12.3f %12.3f |",
+ S->tofract.normal[1][0], S->tofract.normal[1][1]);
+ IfTrace2(TRUE," [ %d %d ]\n", S->itofract[1][0], S->itofract[1][1]);
+}
+#endif
diff --git a/fonts/utilities/ps2pk/spaces.h b/fonts/utilities/ps2pk/spaces.h
new file mode 100644
index 0000000000..baadecf167
--- /dev/null
+++ b/fonts/utilities/ps2pk/spaces.h
@@ -0,0 +1,152 @@
+/* $XConsortium: spaces.h,v 1.3 91/10/10 11:19:22 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
+ * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
+ * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
+ * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
+ * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
+ * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/*SHARED*/
+
+#include "types.h"
+
+#define USER t1_User
+#define IDENTITY t1_Identity
+
+typedef SHORT pel; /* integer pel locations */
+typedef int32_t fractpel; /* fractional pel locations */
+
+#define FRACTBITS 16 /* number of fractional bits in 'fractpel' */
+/*
+We define the following macros to convert from 'fractpel' to 'pel' and
+vice versa:
+*/
+#define TOFRACTPEL(p) (((fractpel)p)<<FRACTBITS)
+#define FPHALF (1<<(FRACTBITS-1))
+#define NEARESTPEL(fp) (((fp)+FPHALF)>>FRACTBITS)
+#define FRACTFLOAT (DOUBLE)(1L<<FRACTBITS)
+
+/*END SHARED*/
+/*SHARED*/
+
+struct doublematrix {
+ DOUBLE normal[2][2];
+ DOUBLE inverse[2][2];
+} ;
+
+/*END SHARED*/
+/*SHARED*/
+
+struct XYspace {
+ XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
+ /* type = SPACETYPE */
+ void (*convert)(); /* calculate "fractpoint" X,Y from float X,Y */
+ void (*iconvert)(); /* calculate "fractpoint" X,Y from int X,Y */
+ fractpel (*xconvert)(); /* subroutine of convert */
+ fractpel (*yconvert)(); /* subroutine of convert */
+ fractpel (*ixconvert)(); /* subroutine of iconvert */
+ fractpel (*iyconvert)(); /* subroutine of iconvert */
+ int ID; /* unique identifier (used in font caching) */
+ unsigned char context; /* device context of coordinate space */
+ struct doublematrix tofract; /* xform to get to fractional pels */
+ fractpel itofract[2][2]; /* integer version of "tofract.normal" */
+} ;
+
+#define INVALIDID 0 /* no valid space will have this ID */
+
+/*END SHARED*/
+/*SHARED*/
+
+struct fractpoint {
+ fractpel x,y;
+} ;
+
+/*END SHARED*/
+/*SHARED*/
+
+extern struct XYspace *IDENTITY;
+extern struct XYspace *USER;
+
+/*END SHARED*/
+/*SHARED*/
+
+#define Context(d,u) t1_Context(d,u)
+#define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4)
+#define Rotate(o,d) t1_Rotate(o,d)
+#define Scale(o,sx,sy) t1_Scale(o,sx,sy)
+#define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4)
+#define Warp(s1,o,s2) t1_Warp(s1,o,s2)
+
+struct XYspace *t1_Context(); /* creates a coordinate space for a device */
+struct xobject *t1_Transform(struct xobject *, DOUBLE, DOUBLE, DOUBLE,
+ DOUBLE); /* transform an object */
+struct xobject *t1_Rotate(); /* rotate an object */
+struct xobject *t1_Scale(struct xobject *, DOUBLE, DOUBLE); /* scale an object */
+struct xobject *t1_Warp(); /* transform like delta of two spaces */
+void t1_QuerySpace(struct XYspace *, DOUBLE *, DOUBLE *, DOUBLE *, DOUBLE *);
+ /* returns coordinate space matrix */
+
+/*END SHARED*/
+/*SHARED*/
+
+#define DeviceResolution t1_DeviceResolution
+#define InitSpaces t1_InitSpaces
+#define CopySpace(s) t1_CopySpace(s)
+#define Xform(o,M) t1_Xform(o,M)
+#define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp)
+#define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C)
+#define MatrixInvert(A,B) t1_MInvert(A,B)
+#define FindContext(M) t1_FindContext(M)
+
+void t1_InitSpaces(void); /* initialize pre-defined coordinate spaces */
+struct XYspace *t1_CopySpace(struct XYspace *);
+ /* duplicate a coordinate space */
+struct xobject *t1_Xform(struct xobject *, DOUBLE[2][2]);
+ /* transform object by matrix */
+void t1_UnConvert(struct XYspace *, struct fractpoint *, DOUBLE *, DOUBLE *);
+ /* return user coordinates from device coordinates */
+void t1_MMultiply(DOUBLE[2][2], DOUBLE[2][2], DOUBLE[2][2]);
+ /* multiply two matrices */
+void t1_MInvert(DOUBLE[2][2], DOUBLE[2][2]); /* invert a matrix */
+int t1_FindContext(); /* return the "context" represented by a matrix */
+
+/*END SHARED*/
+/*SHARED*/
+
+/* #define KillSpace(s) Free(s)
+Note - redefined KillSpace() to check references !
+3-26-91 PNM */
+
+#define KillSpace(s) if ( (--(s->references) == 0) ||\
+ ( (s->references == 1) && ISPERMANENT(s->flag) ) )\
+ Free(s)
+
+#define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s))
+#define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s))
+
+/*END SHARED*/
+/*SHARED*/
+
+#define NULLCONTEXT 0
+
+/*END SHARED*/
diff --git a/fonts/utilities/ps2pk/strexpr.c b/fonts/utilities/ps2pk/strexpr.c
new file mode 100644
index 0000000000..ebfcc8fcdf
--- /dev/null
+++ b/fonts/utilities/ps2pk/strexpr.c
@@ -0,0 +1,292 @@
+/*
+ * File: strexpr.c
+ * Purpose: calculate value from algebraic string expression
+ * (Stripped down from expr.c from J.T. Conklin <jtc@netbsd.org>.)
+ * Version: 1.0 (Nov 1995)
+ * Author: Piet Tutelaers
+ */
+
+#include <stdio.h> /* sprintf() */
+#include <stdlib.h> /* free(), malloc() */
+#include <string.h> /* strchr(), strcpy() */
+#include <ctype.h> /* isdigit(), isspace() */
+#include "basics.h" /* fatal() */
+
+const char *OPERATORS = "+-*/%()";
+
+enum token {
+ ADD, SUB, MUL, DIV, MOD, LP, RP, OPERAND, EOI
+};
+
+struct val {
+ enum {
+ integer,
+ string
+ } type;
+
+ union {
+ char *s;
+ int i;
+ } u;
+};
+
+enum token token;
+struct val *tokval;
+char *pexpr;
+
+struct val *
+make_int(int i)
+{
+ struct val *vp;
+
+ vp = (struct val *) malloc(sizeof(*vp));
+ if (vp == NULL) fatal("expression error\n");
+ vp->type = integer;
+ vp->u.i = i;
+ return vp;
+}
+
+
+struct val *
+make_str(char *s)
+{
+ char operand[32]; int i;
+
+ struct val *vp;
+
+ vp = (struct val *) malloc(sizeof(*vp));
+ if (vp == NULL) fatal("expression error\n");
+
+ pexpr = s; i = 0;
+ while (1) {
+ if (isspace(*pexpr) || *pexpr == '\0') break;
+ if (strchr(OPERATORS, *pexpr) != NULL) break;
+ if (i == 30) fatal("operand too large\n");
+ operand[i++] = *pexpr++;
+ }
+ if (i == 0) fatal("invalid operand\n");
+ operand[i] = '\0';
+ vp->u.s = malloc(i+1);
+ if (vp->u.s == NULL) fatal("Out of memory\n");
+ strcpy(vp->u.s, operand);
+ vp->type = string;
+ return vp;
+}
+
+
+void
+free_value(struct val *vp)
+{
+ if (vp->type == string)
+ free(vp->u.s);
+ free(vp);
+}
+
+
+/* determine if vp is an integer; if so, return it's value in *r */
+int
+is_integer(struct val *vp, int *r)
+{
+ char *s;
+ int neg;
+ int i;
+
+ if (vp->type == integer) {
+ *r = vp->u.i;
+ return 1;
+ }
+
+ /*
+ * POSIX.2 defines an "integer" as an optional unary minus
+ * followed by digits.
+ */
+ s = vp->u.s;
+ i = 0;
+
+ neg = (*s == '-');
+ if (neg)
+ s++;
+
+ while (*s) {
+ if (!isdigit(*s))
+ return 0;
+
+ i *= 10;
+ i += *s - '0';
+
+ s++;
+ }
+
+ if (neg)
+ i *= -1;
+
+ *r = i;
+ return 1;
+}
+
+
+/* coerce to vp to an integer */
+int
+to_integer(struct val *vp)
+{
+ int r;
+
+ if (vp->type == integer)
+ return 1;
+
+ if (is_integer(vp, &r)) {
+ free(vp->u.s);
+ vp->u.i = r;
+ vp->type = integer;
+ return 1;
+ }
+
+ return 0;
+}
+
+
+/* coerce to vp to an string */
+void
+to_string(struct val *vp)
+{
+ char *tmp;
+
+ if (vp->type == string)
+ return;
+
+ tmp = malloc(25);
+ if (tmp == NULL) fatal("Out of memory\n");
+ sprintf(tmp, "%d", vp->u.i);
+ vp->type = string;
+ vp->u.s = tmp;
+}
+
+void
+nexttoken()
+{
+ char *i; /* index */
+
+ while (isspace(*pexpr)) pexpr++;
+
+ if (*pexpr == '\0') {
+ token = EOI;
+ return;
+ }
+
+ if ((i = strchr(OPERATORS, *pexpr)) != NULL) {
+ pexpr++;
+ token = i - OPERATORS;
+ return;
+ }
+ tokval = make_str(pexpr);
+ token = OPERAND;
+ return;
+}
+
+struct val *
+eval6()
+{
+ struct val *eval3(void);
+ struct val *v;
+
+ if (token == OPERAND) {
+ nexttoken();
+ return tokval;
+
+ } else if (token == LP) {
+ nexttoken();
+ v = eval3();
+
+ if (token != RP)
+ fatal("missing parenthesis in expression\n");
+ nexttoken();
+ return v;
+ } else fatal("expression error\n");
+ /* NOTREACHED */
+}
+
+/* Parse and evaluate multiplication and division expressions */
+struct val *
+eval4()
+{
+ struct val *l, *r;
+ enum token op;
+
+ l = eval6();
+ while ((op = token) == MUL || op == DIV || op == MOD) {
+ nexttoken();
+ r = eval6();
+
+ if (!to_integer(l) || !to_integer(r)) {
+ fatal("non-numeric argument\n");
+ }
+
+ if (op == MUL) {
+ l->u.i *= r->u.i;
+ } else {
+ if (r->u.i == 0) {
+ fatal("division by zero\n");
+ }
+ if (op == DIV) {
+ l->u.i /= r->u.i;
+ } else {
+ l->u.i %= r->u.i;
+ }
+ }
+
+ free_value(r);
+ }
+
+ return l;
+}
+
+/* Parse and evaluate addition and subtraction expressions */
+struct val *
+eval3()
+{
+ struct val *l, *r;
+ enum token op;
+
+ l = eval4();
+ while ((op = token) == ADD || op == SUB) {
+ nexttoken();
+ r = eval4();
+
+ if (!to_integer(l) || !to_integer(r)) {
+ fatal("non-numeric argument\n");
+ }
+
+ if (op == ADD) {
+ l->u.i += r->u.i;
+ } else {
+ l->u.i -= r->u.i;
+ }
+
+ free_value(r);
+ }
+
+ return l;
+}
+
+/*
+ * Evaluate the algebraic expression contained in <expression>. The
+ * value will be assigned to <result>. When errors are encountered
+ * non-zero is returned (if program is not aborted) otherwise zero.
+ */
+int strexpr(int *result, char *expression) {
+ struct val *vp;
+
+ pexpr = expression;
+
+ nexttoken();
+ vp = eval3();
+
+ if (token != EOI) return 1;
+
+ if (vp->type == integer || to_integer(vp)) {
+ *result = vp->u.i;
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/fonts/utilities/ps2pk/strexpr.h b/fonts/utilities/ps2pk/strexpr.h
new file mode 100644
index 0000000000..6012a8be56
--- /dev/null
+++ b/fonts/utilities/ps2pk/strexpr.h
@@ -0,0 +1,13 @@
+/*
+ * File: strexpr.h
+ * Purpose: calculate value from algebraic string expression
+ * Version: 1.0 (Nov 1995)
+ * Author: Piet Tutelaers
+ */
+
+/*
+ * Evaluate the algebraic expression contained in <expression>. The
+ * value will be assigned to <result>. When errors are encountered
+ * non-zero (if program is not aborted) is returned otherwise zero.
+ */
+int strexpr(int *result, char *expression);
diff --git a/fonts/utilities/ps2pk/strokes.h b/fonts/utilities/ps2pk/strokes.h
new file mode 100644
index 0000000000..5907632984
--- /dev/null
+++ b/fonts/utilities/ps2pk/strokes.h
@@ -0,0 +1,38 @@
+/* $XConsortium: strokes.h,v 1.2 91/10/10 11:19:25 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/*STUB*/
+
+#define CopyLineStyle(s) s
+#define CopyStrokePath(p) p
+#define KillStrokePath(p)
+#define KillLineStyle(s)
+#define CoercePath(sp) sp
+#define DoStroke(sp) sp
+
diff --git a/fonts/utilities/ps2pk/t1funcs.c b/fonts/utilities/ps2pk/t1funcs.c
new file mode 100644
index 0000000000..e95623f693
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1funcs.c
@@ -0,0 +1,493 @@
+/* $XConsortium: t1funcs.c,v 1.10 92/05/12 18:07:55 gildea Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License, subject to the license given below, to use,
+ * copy, modify, and distribute this software * and its
+ * documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice appear
+ * in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Jeffrey B. Lotspiech, IBM Almaden Research Center
+ * Modeled on spfuncs.c by Dave Lemke, Network Computing Devices, Inc
+ * which contains the following copyright and permission notices:
+ *
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation and the
+ * Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this protoype software
+ * and its documentation to Members and Affiliates of the MIT X Consortium
+ * any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices, Digital or
+ * MIT not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE
+ * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "types.h"
+#include <string.h>
+#include "ffilest.h"
+#ifdef XSERVER
+#include <X11/Xfuncs.h>
+#include "FSproto.h"
+#endif
+#include "t1intf.h"
+
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "regions.h"
+#include "t1stdio.h"
+#include "util.h"
+#include "fontfcn.h"
+
+static int Type1GetGlyphs(struct _Font *pFont, uint32_t count,
+ unsigned char *chars, FontEncoding charEncoding,
+ uint32_t *glyphCount, struct _CharInfo **glyphs);
+static int Type1GetMetrics(struct _Font *pFont, uint32_t count,
+ unsigned char *chars, FontEncoding charEncoding,
+ uint32_t *glyphCount, xCharInfo **glyphs );
+static void fillrun(register char *p,pel x0,pel x1,int bit);
+static void fill(char *dest,int h,int w,struct region *area,
+ int byte,int bit,int wordsize);
+static void FontDefaultFormat(int *bit, int *byte, int *glyphs, int *scan);
+
+#define DECIPOINTSPERINCH 722.7
+
+/*ARGSUSED*/
+int Type1OpenScalable (
+ encoding ev,
+ FontPtr *ppFont,
+ int flags,
+ FontEntryPtr entry,
+ char *fileName,
+ FontScalablePtr vals,
+ fsBitmapFormat format,
+ fsBitmapFormatMask fmask,
+ DOUBLE efactor,
+ DOUBLE slant)
+{
+ FontPtr pFont;
+ int bit,
+ byte,
+ glyph,
+ scan,
+ image;
+ int pad,wordsize; /* scan & image in bits */
+ int size; /* for memory size calculations */
+ struct XYspace *S; /* coordinate space for character */
+ struct region *area;
+ DOUBLE scale; /* scale factor for font */
+ DOUBLE txx, tyx, txy, tyy;
+ CharInfoRec *glyphs;
+ register int i;
+ int len,rc;
+ struct type1font *type1;
+
+ /* set up default values */
+ FontDefaultFormat(&bit, &byte, &glyph, &scan);
+ /* get any changes made from above */
+ rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image);
+ if (rc != Successful)
+ return rc;
+
+ pad = glyph * 8;
+ wordsize = scan * 8;
+
+#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad))
+
+ pFont = (FontPtr) Xalloc(sizeof(FontRec));
+ if (pFont == NULL)
+ return AllocError;
+
+ type1 = (struct type1font *)Xalloc(sizeof(struct type1font));
+ if (type1 == NULL) {
+ Xfree(pFont);
+ return AllocError;
+ }
+ (void) memset(type1, 0, sizeof(struct type1font));
+
+ scale = (DOUBLE) vals->pixel;
+
+ /* Code added by E. Schenk. July 25, 1992.
+ * The following code reads the FontMatrix for the font,
+ * and transforms the font using it. This is necessary
+ * for fonts that are just an oblique, or extend of
+ * a normal font.
+ */
+ { float fontmatrix[6];
+ int rc;
+ QueryFontLib(fileName,"FontMatrix",fontmatrix,&rc);
+ if (!rc) {
+ S = (struct XYspace *) Transform((struct xobject *)IDENTITY,
+ fontmatrix[0], fontmatrix[1], fontmatrix[2], fontmatrix[3]);
+ }
+ else {
+ S = (struct XYspace *) Scale((struct xobject *)IDENTITY,0.001,0.001);
+ }
+ }
+ /* End of additional code */
+
+ if (efactor == 1.0 && slant == 0.0)
+ S = (struct XYspace *)Permanent(Scale((struct xobject *)S, scale, - scale));
+ else {
+ txx = (DOUBLE)vals->x * efactor * vals->point / DECIPOINTSPERINCH;
+ tyy = (DOUBLE)vals->y * vals->point / DECIPOINTSPERINCH;
+ tyx = 0.0;
+ txy = (DOUBLE)vals->x * slant * vals->point / DECIPOINTSPERINCH;
+ S = (struct XYspace *) Permanent(Transform((struct xobject *)S, txx, tyx, txy, -tyy));
+ }
+
+ glyphs = type1->glyphs;
+
+ /* load font if not already loaded */
+ if (!fontfcnA(fileName, &rc))
+ return (rc);
+
+ for (i=0; i < 256-FIRSTCOL; i++) {
+ int32_t h,w;
+ int32_t paddedW;
+
+ if (ev[i] == NULL) continue;
+ len = strlen(ev[i]);
+
+ currentchar = i;
+
+ rc = 0;
+ area = fontfcnB(S, (unsigned char *)ev[i], &len, &rc);
+ if (rc < 0) {
+ rc = BadFontName;
+ break;
+ }
+ else if (rc > 0)
+ continue;
+
+ if (area == NULL)
+ continue;
+
+ h = area->ymax - area->ymin;
+ w = area->xmax - area->xmin;
+ paddedW = PAD(w, pad);
+
+ if (h > 0 && w > 0) {
+ size = h * paddedW / 8;
+ glyphs[i].bits = (char *)Xalloc(size);
+ if (glyphs[i].bits == NULL) {
+ rc = AllocError;
+ break;
+ }
+ }
+ else {
+ h = w = 0;
+ area->xmin = area->xmax = 0;
+ area->ymin = area->ymax = 0;
+ }
+
+ glyphs[i].metrics.leftSideBearing = area->xmin;
+ glyphs[i].metrics.characterWidth = NEARESTPEL(area->ending.x - area->origin.x);
+ glyphs[i].metrics.rightSideBearing = w + area->xmin;
+ glyphs[i].metrics.descent = area->ymax - NEARESTPEL(area->origin.y);
+ glyphs[i].metrics.ascent = h - glyphs[i].metrics.descent;
+
+ if (h > 0 && w > 0) {
+ (void) memset(glyphs[i].bits, 0, size);
+ fill(glyphs[i].bits, h, paddedW, area, byte, bit, wordsize );
+ }
+
+ Destroy(area);
+ }
+
+ if (i != 256 - FIRSTCOL) {
+ for (i--; i >= 0; i--)
+ if (glyphs[i].bits != NULL)
+ Xfree(glyphs[i].bits);
+ Xfree(type1);
+ Xfree(pFont);
+ return rc;
+ }
+ type1->pDefault = NULL;
+
+ pFont->format = format;
+
+ pFont->bit = bit;
+ pFont->byte = byte;
+ pFont->glyph = glyph;
+ pFont->scan = scan;
+
+ pFont->info.firstCol = FIRSTCOL;
+ pFont->info.lastCol = 255;
+ pFont->info.firstRow = 0;
+ pFont->info.lastRow = 0;
+
+ pFont->get_metrics = Type1GetMetrics;
+ pFont->get_glyphs = Type1GetGlyphs;
+ pFont->unload_font = Type1CloseFont;
+ pFont->refcnt = 0;
+ pFont->maxPrivate = -1;
+ pFont->devPrivates = 0;
+
+ pFont->fontPrivate = (unsigned char *) type1;
+
+ T1FillFontInfo(pFont, vals, fileName, entry->name.name);
+
+ *ppFont = pFont;
+ return Successful;
+}
+
+/* NOTE: ILH removed tests ...->characterWidth != 0 below because zero-width
+ does not mean the character is empty, simply that it has zero escapement. */
+
+static int
+Type1GetGlyphs(
+ FontPtr pFont,
+ uint32_t count,
+ register unsigned char *chars,
+ FontEncoding charEncoding,
+ uint32_t *glyphCount, /* RETURN */
+ CharInfoPtr *glyphs) /* RETURN */
+{
+ unsigned int firstRow;
+ unsigned int numRows;
+ CharInfoPtr *glyphsBase;
+ register unsigned int c;
+ unsigned int r;
+ CharInfoPtr pDefault;
+ register struct type1font *type1Font;
+ register int firstCol;
+
+ type1Font = (struct type1font *) pFont->fontPrivate;
+ firstCol = pFont->info.firstCol;
+ pDefault = type1Font->pDefault;
+ glyphsBase = glyphs;
+
+ switch (charEncoding) {
+
+ case Linear8Bit:
+ case TwoD8Bit:
+ if (pFont->info.firstRow > 0)
+ break;
+ while (count--) {
+ c = (*chars++);
+ if (c >= firstCol)
+ *glyphs++ = &type1Font->glyphs[c-firstCol];
+ else if (pDefault)
+ *glyphs++ = pDefault;
+ }
+ break;
+ case Linear16Bit:
+ while (count--) {
+ c = *chars++ << 8;
+ c = (c | *chars++);
+ if (c < 256 && c >= firstCol)
+ *glyphs++ = &type1Font->glyphs[c-firstCol];
+ else if (pDefault)
+ *glyphs++ = pDefault;
+ }
+ break;
+
+ case TwoD16Bit:
+ firstRow = pFont->info.firstRow;
+ numRows = pFont->info.lastRow - firstRow + 1;
+ while (count--) {
+ r = (*chars++) - firstRow;
+ c = (*chars++);
+ if (r < numRows && c < 256 && c >= firstCol)
+ *glyphs++ = &type1Font->glyphs[(r << 8) + c - firstCol];
+ else if (pDefault)
+ *glyphs++ = pDefault;
+ }
+ break;
+ }
+ *glyphCount = glyphs - glyphsBase;
+ return Successful;
+}
+
+static int
+Type1GetMetrics(
+ FontPtr pFont,
+ uint32_t count,
+ register unsigned char *chars,
+ FontEncoding charEncoding,
+ uint32_t *glyphCount, /* RETURN */
+ xCharInfo **glyphs) /* RETURN */
+{
+ static CharInfoRec nonExistantChar;
+
+ int ret;
+ struct type1font *type1Font;
+ CharInfoPtr oldDefault;
+
+ type1Font = (struct type1font *) pFont->fontPrivate;
+ oldDefault = type1Font->pDefault;
+ type1Font->pDefault = &nonExistantChar;
+ ret = Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr *) glyphs);
+ type1Font->pDefault = oldDefault;
+ return ret;
+}
+
+void Type1CloseFont(FontPtr pFont)
+{
+ register int i;
+ struct type1font *type1;
+
+ type1 = (struct type1font *) pFont->fontPrivate;
+ for (i=0; i < 256 - pFont->info.firstCol; i++)
+ if (type1->glyphs[i].bits != NULL)
+ Xfree(type1->glyphs[i].bits);
+ Xfree(type1);
+
+ if (pFont->info.props)
+ Xfree(pFont->info.props);
+
+ if (pFont->info.isStringProp)
+ Xfree(pFont->info.isStringProp);
+
+ Xfree(pFont);
+}
+
+
+static void fill(
+ register char *dest, /* destination bitmap */
+ int h, int w, /* dimensions of 'dest', w padded */
+ register struct region *area, /* region to write to 'dest' */
+ int Byte, int bit, /* flags; LSBFirst or MSBFirst */
+ int wordsize) /* number of bits per word for LSB/MSB purposes */
+{
+ register struct edgelist *edge; /* for looping through edges */
+ register char *p; /* current scan line in 'dest' */
+ register int y; /* for looping through scans */
+ register int wbytes = w / 8; /* number of bytes in width */
+ register pel *leftP,*rightP; /* pointers to X values, left and right */
+ int xmin = area->xmin; /* upper left X */
+ int ymin = area->ymin; /* upper left Y */
+
+ for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) {
+
+ p = dest + (edge->ymin - ymin) * wbytes;
+ leftP = edge->xvalues;
+ rightP = edge->link->xvalues;
+
+ for (y = edge->ymin; y < edge->ymax; y++) {
+ fillrun(p, (pel)(*leftP++ - xmin), (pel)(*rightP++ - xmin), bit);
+ p += wbytes;
+ }
+ }
+/*
+Now, as an afterthought, we'll go reorganize if odd byte order requires
+it:
+*/
+ if (Byte == LSBFirst && wordsize != 8) {
+ register int i;
+
+ switch (wordsize) {
+ case 16:
+ {
+ register unsigned short data,*p;
+
+ p = (unsigned short *) dest;
+
+ for (i = h * w /16; --i >= 0;) {
+ data = *p;
+ *p++ = (data << 8) + (data >> 8);
+ }
+ break;
+ }
+ case 64:
+ case 32:
+ {
+ register uint32_t data,*p;
+
+ p = (uint32_t *) dest;
+
+ for (i = h * w / 32; --i >= 0;) {
+ data = *p;
+ *p++ = (data << 24) + (data >> 24)
+ + (0xFF00 & (data >> 8))
+ + (0xFF0000 & (data << 8));
+ }
+ if (wordsize == 64) {
+
+ p = (uint32_t *) dest;
+
+ for (i = h * w / 64; --i >= 0;) {
+ data = *p++;
+ p[-1] = p[0];
+ *p++ = data;
+ }
+ }
+ break;
+ }
+ default:
+ t1_abort("xiFill: unknown format");
+ }
+ }
+
+}
+
+#define ALLONES 0xFF
+
+static void fillrun(register char *p, pel x0, pel x1, int bit)
+{
+ register int startmask,endmask; /* bits to set in first and last char*/
+ register int middle; /* number of chars between start and end + 1 */
+
+ if (x1 <= x0)
+ return;
+ middle = x1/8 - x0/8;
+ p += x0/8;
+ x0 &= 7; x1 &= 7;
+ if (bit == LSBFirst) {
+ startmask = ALLONES << x0;
+ endmask = ~(ALLONES << x1);
+ }
+ else {
+ startmask = ALLONES >> x0;
+ endmask = ~(ALLONES >> x1);
+ }
+ if (middle == 0)
+ *p++ |= startmask & endmask;
+ else {
+ *p++ |= startmask;
+ while (--middle > 0)
+ *p++ = ALLONES;
+ *p |= endmask;
+ }
+}
+
+
+void Type1RegisterFontFileFunctions(void)
+{
+ T1InitStdProps();
+}
+
+static void FontDefaultFormat(int *bit, int *byte, int *glyphs, int *scan) { ; }
diff --git a/fonts/utilities/ps2pk/t1hdigit.h b/fonts/utilities/ps2pk/t1hdigit.h
new file mode 100644
index 0000000000..9979ef55ce
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1hdigit.h
@@ -0,0 +1,40 @@
+/* $XConsortium: t1hdigit.h,v 1.2 91/10/10 11:19:31 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Indicators for special characters in the p_hdigit.h tables */
+#define HERROR (0xfe)
+#define HWHITE_SPACE (0xfd)
+#define HRIGHT_ANGLE (0xfc)
+#define LAST_HDIGIT (0xf0)
+
+/* Declarations for the tables */
+#define HighHexP (HighHex+1)
+extern unsigned char HighHex[];
+#define LowHexP (LowHex+1)
+extern unsigned char LowHex[];
diff --git a/fonts/utilities/ps2pk/t1imager.h b/fonts/utilities/ps2pk/t1imager.h
new file mode 100644
index 0000000000..78eae98fd7
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1imager.h
@@ -0,0 +1,152 @@
+/* $XConsortium: t1imager.h,v 1.5 92/03/20 14:36:05 keith Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include "types.h"
+#include "fontmisc.h"
+
+typedef pointer xobject;
+typedef pointer location;
+typedef pointer path;
+typedef pointer region;
+typedef pointer XYspace;
+
+#ifndef NOEXTERNS
+/*
+The following are the user entry locations to TYPE1IMAGER
+*/
+extern path t1_Bezier();
+extern path t1_ClosePath();
+extern xobject t1_Destroy();
+extern xobject t1_Dup();
+extern char *t1_ErrorMsg();
+extern void t1_InitImager();
+extern region t1_Interior();
+extern location t1_ILoc();
+extern xobject t1_Join();
+extern path t1_Line();
+extern xobject t1_Permanent();
+extern path t1_Phantom();
+extern location t1_Loc();
+extern xobject t1_Scale();
+extern xobject t1_Snap();
+extern location t1_SubLoc();
+extern xobject t1_Temporary();
+
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/*
+Here are some TYPE1IMAGER functions that are defined in terms of others:
+*/
+
+#define t1_AddLoc(p1,p2) t1_Join(p1,p2)
+
+#ifndef NONAMES
+/*
+Define the simple form of all the subroutine names:
+*/
+#define AddLoc(p1,p2) t1_AddLoc(p1,p2)
+#define Bezier(B,C,D) t1_Bezier(B,C,D)
+#define ClosePath(p) t1_ClosePath(p,0)
+#define Complement(area) t1_Complement(area)
+#define Destroy(o) t1_Destroy(o)
+#define Dup(o) t1_Dup(o)
+#define ErrorMsg() t1_ErrorMsg()
+#define HeadSegment(p) t1_HeadSegment(p)
+#define InitImager() t1_InitImager()
+#define Interior(p,rule) t1_Interior(p,rule)
+#define ILoc(S,x,y) t1_ILoc(S,x,y)
+#define Join(p1,p2) t1_Join(p1,p2)
+#define Line(P) t1_Line(P)
+#define Permanent(o) t1_Permanent(o)
+#define Phantom(o) t1_Phantom(o)
+#define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y)
+#define Scale(o,sx,sy) t1_Scale(o,(DOUBLE)sx,(DOUBLE)sy)
+#define Snap(o) t1_Snap(o)
+#define SubLoc(a,b) t1_SubLoc(a,b)
+#define Temporary(o) t1_Temporary(o)
+#define TermImager() t1_TermImager()
+#define Transform(o,cxx,cyx,cxy,cyy) t1_Transform(o,(DOUBLE)cxx,(DOUBLE)cyx,\
+ (DOUBLE)cxy,(DOUBLE)cyy)
+
+#endif
+
+#define WINDINGRULE -2
+#define EVENODDRULE -3
+
+#define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */
+
+/*
+Stroke() line style constants:
+*/
+
+/*
+Coordinate space constants:
+*/
+#define IDENTITY t1_Identity
+extern XYspace *IDENTITY;
+
+/*
+Generic null object definition:
+*/
+#define NULLOBJECT ((xobject)NULL)
+
+/*
+Null path definition:
+*/
+#define NULLPATH NULLOBJECT
+
+/*
+Full page and null region definition:
+*/
+#define T1_INFINITY t1_Infinity
+#ifndef NOEXTERNS
+extern region *T1_INFINITY;
+#endif
+#ifdef NULLREGION
+#undef NULLREGION
+#endif
+#define NULLREGION NULLOBJECT
+
+#define FF_PARSE_ERROR 5
+#define FF_PATH 1
+
+extern pointer xiStub();
diff --git a/fonts/utilities/ps2pk/t1info.c b/fonts/utilities/ps2pk/t1info.c
new file mode 100644
index 0000000000..fd86c3c797
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1info.c
@@ -0,0 +1,380 @@
+/* $XConsortium: t1info.c,v 1.9 92/03/20 16:00:13 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License, subject to the license given below, to use,
+ * copy, modify, and distribute this software * and its
+ * documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice appear
+ * in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Carol H. Thompson IBM Almaden Research Center
+ * Modeled on spinfo.c by Dave Lemke, Network Computing Devices, Inc
+ * which contains the following copyright and permission notices:
+ *
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation and the
+ * Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this protoype software
+ * and its documentation to Members and Affiliates of the MIT X Consortium
+ * any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices, Digital or
+ * MIT not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE
+ * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "types.h"
+#include <stdio.h>
+#include <string.h>
+#include "util.h"
+#include "ffilest.h"
+#ifdef XSERVER
+#include "FSproto.h"
+#endif
+#include "t1intf.h"
+
+#ifdef WIN32
+static void FontParseXLFDName(char *, FontScalablePtr, int);
+#endif
+static void FontComputeInfoAccelerators(FontInfoPtr);
+
+#define DECIPOINTSPERINCH 722.7
+#define DEFAULTRES 75
+#define DEFAULTPOINTSIZE 120
+
+enum scaleType {
+ atom, pixel_size, point_size, resolution_x, resolution_y,
+ average_width, scaledX, scaledY, unscaled, scaledXoverY,
+ uncomputed
+};
+
+typedef struct _fontProp {
+ const char *name;
+ int32_t atom;
+ enum scaleType type;
+} fontProp;
+
+static fontProp fontNamePropTable[] = { /* Example: */
+ { "FOUNDRY", 0, atom }, /* adobe */
+ { "FAMILY_NAME", 0, atom }, /* times roman */
+ { "WEIGHT_NAME", 0, atom }, /* bold */
+ { "SLANT", 0, atom }, /* i */
+ { "SETWIDTH_NAME", 0, atom }, /* normal */
+ { "ADD_STYLE_NAME", 0, atom }, /* */
+ { "PIXEL_SIZE", 0, pixel_size }, /* 18 */
+ { "POINT_SIZE", 0, point_size }, /* 180 */
+ { "RESOLUTION_X", 0, resolution_x }, /* 72 */
+ { "RESOLUTION_Y", 0, resolution_y }, /* 72 */
+ { "SPACING", 0, atom }, /* p */
+ { "AVERAGE_WIDTH", 0, average_width }, /* 0 */
+ { "CHARSET_REGISTRY", 0, atom }, /* ISO8859 */
+ { "CHARSET_ENCODING", 0, atom } /* 1 */
+};
+
+static fontProp extraProps[] = {
+ { "FONT", 0, atom },
+ { "COPYRIGHT", 0, atom }
+};
+
+/* this is a bit kludgy */
+#define FONTPROP 0
+#define COPYRIGHTPROP 1
+
+#define NNAMEPROPS (sizeof(fontNamePropTable) / sizeof(fontProp))
+#define NEXTRAPROPS (sizeof(extraProps) / sizeof(fontProp))
+
+#define NPROPS (NNAMEPROPS + NEXTRAPROPS)
+
+/*ARGSUSED*/
+static void
+FillHeader(
+ FontInfoPtr pInfo,
+ FontScalablePtr Vals)
+{
+ /* OpenScalable in T1FUNCS sets the following:
+ pInfo->firstCol,
+ pInfo->firstRow,
+ pInfo->lastCol, and
+ pInfo->lastRow. */
+ /* the following are ununsed
+ pInfo->pad. */
+
+ /* Items we should handle better someday +++ */
+ pInfo->defaultCh = 0;
+ pInfo->drawDirection = LeftToRight;
+ /* our size is based only on Vals->pixel, so we won't
+ create an anamorphic font (yet) */
+ pInfo->anamorphic = 0;
+ pInfo->inkMetrics = 0; /* no ink metrics here */
+ pInfo->cachable = 1; /* no licensing (yet) */
+}
+
+static void
+adjust_min_max(xCharInfo *minc, xCharInfo *maxc, xCharInfo *tmp)
+{
+#define MINMAX(field,ci) \
+ if (minc->field > (ci)->field) \
+ minc->field = (ci)->field; \
+ if (maxc->field < (ci)->field) \
+ maxc->field = (ci)->field;
+
+ MINMAX(ascent, tmp);
+ MINMAX(descent, tmp);
+ MINMAX(leftSideBearing, tmp);
+ MINMAX(rightSideBearing, tmp);
+ MINMAX(characterWidth, tmp);
+
+#undef MINMAX
+}
+
+static void
+ComputeBounds(
+ FontInfoPtr pInfo,
+ CharInfoPtr pChars,
+ FontScalablePtr Vals)
+{
+ int i;
+ xCharInfo minchar, maxchar;
+ int32_t width = 0;
+ int numchars = 0;
+ int totchars;
+ int overlap;
+ int maxlap;
+
+ minchar.ascent = minchar.descent =
+ minchar.leftSideBearing = minchar.rightSideBearing =
+ minchar.characterWidth = 32767;
+ minchar.attributes = 0; /* What's this for? +++ */
+ maxchar.ascent = maxchar.descent =
+ maxchar.leftSideBearing = maxchar.rightSideBearing =
+ maxchar.characterWidth = -32767;
+ maxchar.attributes = 0;
+
+ maxlap = -32767;
+ totchars = pInfo->lastCol - pInfo->firstCol + 1;
+ pInfo->allExist = 1;
+ for (i = 0; i < totchars; i++,pChars++) {
+ xCharInfo *pmetrics = &pChars->metrics;
+
+ if (pmetrics->characterWidth) {
+ width += pmetrics->characterWidth;
+ numchars++;
+ adjust_min_max(&minchar, &maxchar, pmetrics);
+ overlap = pmetrics->rightSideBearing - pmetrics->characterWidth;
+ if (overlap > maxlap) maxlap = overlap;
+ }
+ else pInfo->allExist = 0;
+ }
+
+ Vals->width = ((width * 10)+((numchars+1)/2)) / numchars;
+ /* (We think the above average width value should be put into
+ the Vals structure. This may be wrong, and the proper
+ behavior might be to regard the values in Vals as sacred,
+ and for us to squirrel the computed number in a static, and
+ then use that static in ComputeStdProps.) */
+ pInfo->maxbounds = maxchar;
+ pInfo->minbounds = minchar;
+ pInfo->ink_maxbounds = maxchar;
+ pInfo->ink_minbounds = minchar;
+ pInfo->maxOverlap = maxlap + -(minchar.leftSideBearing);
+
+ /* Set the pInfo flags */
+ /* Properties set by FontComputeInfoAccelerators:
+ pInfo->noOverlap;
+ pInfo->terminalFont;
+ pInfo->constantMetrics;
+ pInfo->constantWidth;
+ pInfo->inkInside;
+
+ */
+ FontComputeInfoAccelerators (pInfo);
+}
+
+static void
+ComputeProps(
+ FontInfoPtr pInfo,
+ FontScalablePtr Vals,
+ char *Filename)
+{
+ int infoint;
+ int infoBBox[4];
+ int rc;
+
+ QueryFontLib(Filename, "isFixedPitch", &infoint, &rc);
+ if (!rc) {
+ pInfo->constantWidth = infoint;
+ }
+ QueryFontLib((char *)0, "FontBBox", infoBBox, &rc);
+ if (!rc) {
+ pInfo->fontAscent = (infoBBox[3] * Vals->pixel) / 1000;
+ pInfo->fontDescent = - (infoBBox[1] * Vals->pixel) / 1000;
+ }
+}
+
+static void
+ComputeStdProps(
+ FontInfoPtr pInfo,
+ FontScalablePtr Vals,
+ char *Filename,
+ const char *Fontname)
+{
+ FontPropPtr pp;
+ int i,
+ nprops;
+ fontProp *fpt;
+ char *is_str;
+ char *ptr1,
+ *ptr2;
+ const char *infostrP;
+ int rc;
+ char scaledName[MAXFONTNAMELEN];
+
+ strcpy (scaledName, Fontname);
+#ifdef WIN32
+ /* Fill in our copy of the fontname from the Vals structure */
+ FontParseXLFDName (scaledName, Vals, FONT_XLFD_REPLACE_VALUE);
+#endif
+
+ /* This form of the properties is used by the X-client; the X-server
+ doesn't care what they are. */
+ nprops = pInfo->nprops = NPROPS;
+ pInfo->isStringProp = (char *) Xalloc(sizeof(char) * nprops);
+ pInfo->props = (FontPropPtr) Xalloc(sizeof(FontPropRec) * nprops);
+ if (!pInfo->isStringProp || !pInfo->props) {
+ Xfree(pInfo->isStringProp);
+ pInfo->isStringProp = (char *) 0;
+ Xfree(pInfo->props);
+ pInfo->props = (FontPropPtr) 0;
+ return;
+ }
+ (void) memset(pInfo->isStringProp, 0, (sizeof(char) * nprops));
+
+ ptr2 = scaledName;
+ for (i = NNAMEPROPS, pp = pInfo->props, fpt = fontNamePropTable, is_str = pInfo->isStringProp;
+ i;
+ i--, pp++, fpt++, is_str++) {
+ ptr1 = ptr2 + 1;
+ if (*ptr1 == '-')
+ ptr2 = ptr1;
+ else {
+ if (i > 1)
+ ptr2 = strchr(ptr1 + 1, '-');
+ else
+ ptr2 = strchr(ptr1 + 1, '\0');
+ }
+ pp->name = fpt->atom;
+ switch (fpt->type) {
+ case atom: /* Just copy info from scaledName */
+ *is_str = TRUE;
+ pp->value = MakeAtom(ptr1, ptr2 - ptr1, TRUE);
+ break;
+ case pixel_size:
+ pp->value = Vals->pixel;
+ break;
+ case point_size:
+ pp->value = Vals->point;
+ break;
+ case resolution_x:
+ pp->value = Vals->x;
+ break;
+ case resolution_y:
+ pp->value = Vals->y;
+ break;
+ case average_width:
+ pp->value = Vals->width;
+ break;
+ default: /* scaledX, scaledY, unscaled, scaledXoverY, and uncomputed */
+ break;
+ }
+ }
+
+ for (i = 0, fpt = extraProps;
+ i < NEXTRAPROPS;
+ i++, is_str++, pp++, fpt++) {
+ pp->name = fpt->atom;
+ switch (i) {
+ case FONTPROP:
+ /* Why do we need this property -- nice for debug anyway */
+ *is_str = TRUE;
+ pp->value = MakeAtom(scaledName, strlen(scaledName), TRUE);
+ break;
+ case COPYRIGHTPROP:
+ *is_str = TRUE;
+ QueryFontLib(Filename, "Notice", &infostrP, &rc);
+ if (rc || !infostrP) {
+ infostrP = "Copyright Notice not available";
+ }
+ pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE);
+ break;
+ }
+ }
+}
+
+void
+T1FillFontInfo(
+ FontPtr pFont,
+ FontScalablePtr Vals,
+ char *Filename,
+ const char *Fontname)
+{
+ FontInfoPtr pInfo = &pFont->info;
+ struct type1font *p = (struct type1font *)pFont->fontPrivate;
+
+ FillHeader(pInfo, Vals);
+
+ ComputeBounds(pInfo, p->glyphs, Vals);
+
+ ComputeProps(pInfo, Vals, Filename);
+ ComputeStdProps(pInfo, Vals, Filename, Fontname);
+}
+
+/* Called once, at renderer registration time */
+void
+T1InitStdProps(void)
+{
+ int i;
+ fontProp *t;
+
+ i = sizeof(fontNamePropTable) / sizeof(fontProp);
+ for (t = fontNamePropTable; i; i--, t++)
+ t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE);
+ i = sizeof(extraProps) / sizeof(fontProp);
+ for (t = extraProps; i; i--, t++)
+ t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE);
+}
+
+#ifdef WIN32
+static void FontParseXLFDName(char *scaledName, FontScalablePtr Vals, int foo) { ; }
+#endif
+static void FontComputeInfoAccelerators(FontInfoPtr foo) { ; }
diff --git a/fonts/utilities/ps2pk/t1intf.h b/fonts/utilities/ps2pk/t1intf.h
new file mode 100644
index 0000000000..b79e1cf481
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1intf.h
@@ -0,0 +1,42 @@
+/* $XConsortium: t1intf.h,v 1.2 91/10/10 11:19:39 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#define FIRSTCOL 0
+
+struct type1font {
+ CharInfoPtr pDefault;
+ CharInfoRec glyphs[256-FIRSTCOL];
+};
+
+extern void T1FillFontInfo(struct _Font *pFont,
+ struct _FontScalable *Vals,
+ char *Filename,
+ const char *Fontname);
+extern void T1InitStdProps(void);
diff --git a/fonts/utilities/ps2pk/t1io.c b/fonts/utilities/ps2pk/t1io.c
new file mode 100644
index 0000000000..384e3d19c3
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1io.c
@@ -0,0 +1,287 @@
+/* $XConsortium: t1io.c,v 1.4 91/10/10 11:19:41 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Carol H. Thompson IBM Almaden Research Center
+ */
+/*******************************************************************
+* I/O package for Type 1 font reading
+********************************************************************/
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include "t1stdio.h"
+#include "t1hdigit.h"
+
+/* Constants and variables used in the decryption */
+#define c1 ((unsigned short)52845)
+#define c2 ((unsigned short)22719)
+static unsigned short r;
+static int asc, Decrypt;
+static int extrach;
+static int haveextrach;
+
+/* Our single FILE structure and buffer for this package */
+STATIC F_FILE TheFile;
+STATIC unsigned char TheBuffer[F_BUFSIZ];
+
+/* Our routines */
+STATIC int T1Decrypt(unsigned char *, int), T1Fill(F_FILE *);
+
+/* -------------------------------------------------------------- */
+/*ARGSUSED*/
+F_FILE *T1Open(
+ char *fn, /* Pointer to filename */
+ char *mode) /* Pointer to open mode string */
+{
+ F_FILE *of = &TheFile;
+
+ Decrypt = 0;
+
+ /* We know we are only reading */
+#if defined(MSDOS) || defined(VMS) || defined(WIN32)
+ if ((of->fd=open(fn, O_RDONLY | O_BINARY)) < 0) return NULL;
+#else
+ if ((of->fd=open(fn, O_RDONLY)) < 0) return NULL;
+#endif
+
+ /* Initialize the buffer information of our file descriptor */
+ of->b_base = TheBuffer;
+ of->b_size = F_BUFSIZ;
+ of->b_ptr = NULL;
+ of->b_cnt = 0;
+ of->flags = 0;
+ of->error = 0;
+ haveextrach = 0;
+ return &TheFile;
+} /* end Open */
+
+/* -------------------------------------------------------------- */
+int T1Getc( /* Read one character */
+ F_FILE *f) /* Stream descriptor */
+{
+ if (f->b_base == NULL) return EOF; /* already closed */
+
+ if (f->flags & UNGOTTENC) { /* there is an ungotten c */
+ f->flags &= ~UNGOTTENC;
+ return (int) f->ungotc;
+ }
+
+ if (f->b_cnt == 0) /* Buffer needs to be (re)filled */
+ f->b_cnt = T1Fill(f);
+ if (f->b_cnt > 0) return (f->b_cnt--, (int) *(f->b_ptr++));
+ else {
+ f->flags |= FIOEOF;
+ return EOF;
+ }
+} /* end Getc */
+
+/* -------------------------------------------------------------- */
+int T1Ungetc( /* Put back one character */
+ int c,
+ F_FILE *f) /* Stream descriptor */
+{
+ if (c != EOF) {
+ f->ungotc = c;
+ f->flags |= UNGOTTENC; /* set flag */
+ f->flags &= ~FIOEOF; /* reset EOF */
+ }
+ return c;
+} /* end Ungetc */
+
+/* -------------------------------------------------------------- */
+int T1Read( /* Read n items into caller's buffer */
+ char *buffP, /* Buffer to be filled */
+ int size, /* Size of each item */
+ int n, /* Number of items to read */
+ F_FILE *f) /* Stream descriptor */
+{
+ int bytelen, cnt, i;
+ F_char *p = (F_char *)buffP;
+ int icnt; /* Number of characters to read */
+
+ if (f->b_base == NULL) return 0; /* closed */
+ icnt = (size!=1)?n*size:n; /* Number of bytes we want */
+
+ if (f->flags & UNGOTTENC) { /* there is an ungotten c */
+ f->flags &= ~UNGOTTENC;
+ *(p++) = f->ungotc;
+ icnt--; bytelen = 1;
+ }
+ else bytelen = 0;
+
+ while (icnt > 0) {
+ /* First use any bytes we have buffered in the stream buffer */
+ if ((cnt=f->b_cnt) > 0) {
+ if (cnt > icnt) cnt = icnt;
+ for (i=0; i<cnt; i++) *(p++) = *(f->b_ptr++);
+ f->b_cnt -= cnt;
+ icnt -= cnt;
+ bytelen += cnt;
+ }
+
+ if ((icnt == 0) || (f->flags & FIOEOF)) break;
+
+ f->b_cnt = T1Fill(f);
+ }
+ return ((size!=1)?bytelen/size:bytelen);
+} /* end Read */
+
+/* -------------------------------------------------------------- */
+int T1Close( /* Close the file */
+ F_FILE *f) /* Stream descriptor */
+{
+ if (f->b_base == NULL) return 0; /* already closed */
+ f->b_base = NULL; /* no valid stream */
+ return close(f->fd);
+} /* end Close */
+
+/* -------------------------------------------------------------- */
+F_FILE *T1eexec( /* Initialization */
+ F_FILE *f) /* Stream descriptor */
+{
+ int i, c;
+ int H;
+ unsigned char *p;
+ unsigned char randomP[8];
+
+ r = 55665; /* initial key */
+ asc = 1; /* indicate ASCII form */
+
+ /* Consume the 4 random bytes, determining if we are also to
+ ASCIIDecodeHex as we process our input. (See pages 63-64
+ of the Adobe Type 1 Font Format book.) */
+
+ /* Skip over any initial white space chars */
+ while (HighHexP[c=getc(f)] == HWHITE_SPACE) ;
+
+ /* If ASCII, the next 7 chars are guaranteed consecutive */
+ randomP[0] = c; /* store first non white space char */
+ fread((char *)randomP+1, 1, 3, f); /* read 3 more, for a total of 4 */
+ /* store first four chars */
+ for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */
+ if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */
+ asc = 0;
+ break;
+ }
+ }
+ if (asc) { /* ASCII form, convert first eight bytes to binary */
+ fread((char *)randomP+4, 1, 4, f); /* Need four more */
+ for (i=0,p=randomP; i<4; i++) { /* Convert */
+ H = HighHexP[*p++];
+ randomP[i] = H | LowHexP[*p++];
+ }
+ }
+
+ /* Adjust our key */
+ for (i=0,p=randomP; i<4; i++) {
+ r = (*p++ + r) * c1 + c2;
+ }
+
+ /* Decrypt the remaining buffered bytes */
+ f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt);
+ Decrypt = 1;
+ return (feof(f))?NULL:f;
+} /* end eexec */
+
+/* -------------------------------------------------------------- */
+STATIC int T1Decrypt(unsigned char *p, int len)
+{
+ int n;
+ int H = 0, L;
+ unsigned char *inp = p;
+ unsigned char *tblP;
+
+ if (asc) {
+ if (haveextrach) {
+ H = extrach;
+ tblP = LowHexP;
+ }
+ else tblP = HighHexP;
+ for (n=0; len>0; len--) {
+ L = tblP[*inp++];
+ if (L == HWHITE_SPACE) continue;
+ if (L > LAST_HDIGIT) break;
+ if (tblP == HighHexP) { /* Got first hexit value */
+ H = L;
+ tblP = LowHexP;
+ } else { /* Got second hexit value; compute value and store it */
+ n++;
+ tblP = HighHexP;
+ H |= L;
+ /* H is an int, 0 <= H <= 255, so all of this will work */
+ *p++ = H ^ (r >> 8);
+ r = (H + r) * c1 + c2;
+ }
+ }
+ if (tblP != HighHexP) { /* We had an odd number of hexits */
+ extrach = H;
+ haveextrach = 1;
+ } else haveextrach = 0;
+ return n;
+ } else {
+ for (n = len; n>0; n--) {
+ H = *inp++;
+ *p++ = H ^ (r >> 8);
+ r = (H + r) * c1 + c2;
+ }
+ return len;
+ }
+} /* end Decrypt */
+
+/* -------------------------------------------------------------- */
+STATIC int T1Fill( /* Refill stream buffer */
+ F_FILE *f) /* Stream descriptor */
+{
+ int rc;
+
+ rc = read(f->fd, f->b_base, F_BUFSIZ);
+ /* propagate any error or eof to current file */
+ if (rc <= 0) {
+ if (rc == 0) /* means EOF */
+ f->flags |= FIOEOF;
+ else {
+ f->error = (short)-rc;
+ f->flags |= FIOERROR;
+ rc = 0;
+ }
+ }
+ f->b_ptr = f->b_base;
+ if (Decrypt) rc = T1Decrypt(f->b_base, rc);
+ return rc;
+} /* end Fill */
diff --git a/fonts/utilities/ps2pk/t1snap.c b/fonts/utilities/ps2pk/t1snap.c
new file mode 100644
index 0000000000..7f1f29c1bc
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1snap.c
@@ -0,0 +1,81 @@
+/* $XConsortium: t1snap.c,v 1.3 91/10/10 11:19:47 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include "types.h"
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "pictures.h"
+
+/*
+:h2.Handle Functions
+
+:h3.Phantom() - Returns a Move Segment Equivalent to Handles
+
+This is a user operator. Its new name is QueryHandle.
+*/
+
+struct segment *t1_Phantom(
+ register struct segment *obj) /* object to take the Phantom of */
+{
+ struct fractpoint pt; /* handle size will built here */
+
+ if (obj == NULL)
+ pt.x = pt.y = 0;
+ else
+ PathDelta(obj, &pt);
+
+ return(PathSegment(MOVETYPE, pt.x, pt.y));
+}
+
+/*
+:h3.Snap() - Force Ending Handle of Object to Origin
+
+This is a user operator.
+*/
+
+struct segment *t1_Snap(
+ register struct segment *p) /* path to snap */
+{
+ struct fractpoint pt; /* for finding length of path */
+
+ if (p == NULL)
+ return(NULL);
+ p = UniquePath(p);
+
+ PathDelta(p, &pt);
+ if (p->last->type == MOVETYPE) {
+ p->last->dest.x -= pt.x;
+ p->last->dest.y -= pt.y;
+ }
+ else
+ p = JoinSegment(p, MOVETYPE, -pt.x, -pt.y, NULL);
+ return(p);
+}
diff --git a/fonts/utilities/ps2pk/t1stdio.h b/fonts/utilities/ps2pk/t1stdio.h
new file mode 100644
index 0000000000..f19d9627ed
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1stdio.h
@@ -0,0 +1,110 @@
+/* $XConsortium: t1stdio.h,v 1.4 91/10/10 11:19:49 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* T1IO FILE structure and related stuff */
+
+#include "types.h"
+
+#define FILE F_FILE
+typedef unsigned char F_char;
+
+typedef struct F_FILE {
+ F_char *b_base; /* Pointer to beginning of buffer */
+ int32_t b_size; /* Size of the buffer */
+ F_char *b_ptr; /* Pointer to next char in buffer */
+ int32_t b_cnt; /* Number of chars remaining in buffer */
+ F_char flags; /* other flags; != 0 means getc must call fgetc */
+ F_char ungotc; /* Place for ungotten char; flag set if present */
+ short error; /* error status */
+ int fd; /* underlying file descriptor */
+} F_FILE;
+
+
+/* defines for flags */
+#define UNGOTTENC (0x01)
+#define FIOEOF (0x80)
+#define FIOERROR (0x40)
+
+#ifndef NULL
+#define NULL 0 /* null pointer */
+#endif
+#define EOF (-1) /* end of file */
+#define F_BUFSIZ (512)
+
+#ifdef fopen
+#undef fopen
+#endif
+
+#ifdef fclose
+#undef fclose
+#endif
+
+#ifdef feof
+#undef feof
+#endif
+
+#ifdef ferror
+#undef ferror
+#endif
+
+#ifdef fread
+#undef fread
+#endif
+
+#ifdef getc
+#undef getc
+#endif
+
+#ifdef ungetc
+#undef ungetc
+#endif
+
+#ifdef fgetc
+#undef fgetc
+#endif
+
+#define getc(f) \
+ ( \
+ ( ((f)->b_cnt > 0) && ((f)->flags == 0) ) ? \
+ ( (f)->b_cnt--, (unsigned int)*( (f)->b_ptr++ ) ) : \
+ T1Getc(f) \
+ )
+
+extern F_FILE *T1Open(char *, char *), *T1eexec(F_FILE *);
+extern int T1Close(F_FILE *);
+extern int T1Read(char *, int, int, F_FILE *),
+ T1Getc(F_FILE *), T1Ungetc(int, F_FILE *);
+
+#define fclose(f) T1Close(f)
+#define fopen(name,mode) T1Open(name,mode)
+#define ungetc(c,f) T1Ungetc(c,f)
+#define fgetc(f) T1Getc(f)
+#define fread(bufP,size,n,f) T1Read(bufP,size,n,f)
+#define feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0))
+#define ferror(f) (((f)->flags & FIOERROR)?(f)->error:0)
diff --git a/fonts/utilities/ps2pk/t1stub.c b/fonts/utilities/ps2pk/t1stub.c
new file mode 100644
index 0000000000..6405b64c10
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1stub.c
@@ -0,0 +1,44 @@
+/* $XConsortium: t1stub.c,v 1.3 92/03/20 15:58:40 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include "objects.h" /* get #define for t1_abort() */
+
+xiStub(void)
+{
+ printf("xiStub called\n");
+ t1_abort("xiStub called");
+}
+
+struct segment;
+
+void t1_DumpText(struct segment * foo)
+{
+ xiStub();
+}
diff --git a/fonts/utilities/ps2pk/t1test.c b/fonts/utilities/ps2pk/t1test.c
new file mode 100644
index 0000000000..6629117378
--- /dev/null
+++ b/fonts/utilities/ps2pk/t1test.c
@@ -0,0 +1,529 @@
+/* $XConsortium: t1test.c,v 1.2 91/10/10 11:19:53 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include "ffilest.h"
+#ifdef XSERVER
+#include "FSproto.h"
+#endif
+
+void Display();
+
+#define DECIPOINTSPERINCH 722.7
+#define DEFAULTRES 75
+#define DEFAULTPOINTSIZE 120
+
+FontScalableRec vals;
+FontEntryRec entry;
+
+typedef char *encoding[256];
+
+/* PostScript ISOLatin1Encoding */
+
+char *ISOLatin1[256] = {
+ /* '000 000 "00 */ NULL,
+ /* '001 001 "01 */ NULL,
+ /* '002 002 "02 */ NULL,
+ /* '003 003 "03 */ NULL,
+ /* '004 004 "04 */ NULL,
+ /* '005 005 "05 */ NULL,
+ /* '006 006 "06 */ NULL,
+ /* '007 007 "07 */ NULL,
+ /* '010 008 "08 */ NULL,
+ /* '011 009 "09 */ NULL,
+ /* '012 010 "0A */ NULL,
+ /* '013 011 "0B */ NULL,
+ /* '014 012 "0C */ NULL,
+ /* '015 013 "0D */ NULL,
+ /* '016 014 "0E */ NULL,
+ /* '017 015 "0F */ NULL,
+ /* '020 016 "10 */ NULL,
+ /* '021 017 "11 */ NULL,
+ /* '022 018 "12 */ NULL,
+ /* '023 019 "13 */ NULL,
+ /* '024 020 "14 */ NULL,
+ /* '025 021 "15 */ NULL,
+ /* '026 022 "16 */ NULL,
+ /* '027 023 "17 */ NULL,
+ /* '030 024 "18 */ NULL,
+ /* '031 025 "19 */ NULL,
+ /* '032 026 "1A */ NULL,
+ /* '033 027 "1B */ NULL,
+ /* '034 028 "1C */ NULL,
+ /* '035 029 "1D */ NULL,
+ /* '036 030 "1E */ NULL,
+ /* '037 031 "1F */ NULL,
+ /* '040 032 "20 */ "space",
+ /* '041 033 "21 */ "exclam",
+ /* '042 034 "22 */ "quotedbl",
+ /* '043 035 "23 */ "numbersign",
+ /* '044 036 "24 */ "dollar",
+ /* '045 037 "25 */ "percent",
+ /* '046 038 "26 */ "ampersand",
+ /* '047 039 "27 */ "quoteright",
+ /* '050 040 "28 */ "parenleft",
+ /* '051 041 "29 */ "parenright",
+ /* '052 042 "2A */ "asterisk",
+ /* '053 043 "2B */ "plus",
+ /* '054 044 "2C */ "comma",
+ /* '055 045 "2D */ "hyphen",
+ /* '056 046 "2E */ "period",
+ /* '057 047 "2F */ "slash",
+ /* '060 048 "30 */ "zero",
+ /* '061 049 "31 */ "one",
+ /* '062 050 "32 */ "two",
+ /* '063 051 "33 */ "three",
+ /* '064 052 "34 */ "four",
+ /* '065 053 "35 */ "five",
+ /* '066 054 "36 */ "six",
+ /* '067 055 "37 */ "seven",
+ /* '070 056 "38 */ "eight",
+ /* '071 057 "39 */ "nine",
+ /* '072 058 "3A */ "colon",
+ /* '073 059 "3B */ "semicolon",
+ /* '074 060 "3C */ "less",
+ /* '075 061 "3D */ "equal",
+ /* '076 062 "3E */ "greater",
+ /* '077 063 "3F */ "question",
+ /* '100 064 "40 */ "at",
+ /* '101 065 "41 */ "A",
+ /* '102 066 "42 */ "B",
+ /* '103 067 "43 */ "C",
+ /* '104 068 "44 */ "D",
+ /* '105 069 "45 */ "E",
+ /* '106 070 "46 */ "F",
+ /* '107 071 "47 */ "G",
+ /* '110 072 "48 */ "H",
+ /* '111 073 "49 */ "I",
+ /* '112 074 "4A */ "J",
+ /* '113 075 "4B */ "K",
+ /* '114 076 "4C */ "L",
+ /* '115 077 "4D */ "M",
+ /* '116 078 "4E */ "N",
+ /* '117 079 "4F */ "O",
+ /* '120 080 "50 */ "P",
+ /* '121 081 "51 */ "Q",
+ /* '122 082 "52 */ "R",
+ /* '123 083 "53 */ "S",
+ /* '124 084 "54 */ "T",
+ /* '125 085 "55 */ "U",
+ /* '126 086 "56 */ "V",
+ /* '127 087 "57 */ "W",
+ /* '130 088 "58 */ "X",
+ /* '131 089 "59 */ "Y",
+ /* '132 090 "5A */ "Z",
+ /* '133 091 "5B */ "bracketleft",
+ /* '134 092 "5C */ "backslash",
+ /* '135 093 "5D */ "bracketright",
+ /* '136 094 "5E */ "asciicircum",
+ /* '137 095 "5F */ "underscore",
+ /* '140 096 "60 */ "quoteleft",
+ /* '141 097 "61 */ "a",
+ /* '142 098 "62 */ "b",
+ /* '143 099 "63 */ "c",
+ /* '144 100 "64 */ "d",
+ /* '145 101 "65 */ "e",
+ /* '146 102 "66 */ "f",
+ /* '147 103 "67 */ "g",
+ /* '150 104 "68 */ "h",
+ /* '151 105 "69 */ "i",
+ /* '152 106 "6A */ "j",
+ /* '153 107 "6B */ "k",
+ /* '154 108 "6C */ "l",
+ /* '155 109 "6D */ "m",
+ /* '156 110 "6E */ "n",
+ /* '157 111 "6F */ "o",
+ /* '160 112 "70 */ "p",
+ /* '161 113 "71 */ "q",
+ /* '162 114 "72 */ "r",
+ /* '163 115 "73 */ "s",
+ /* '164 116 "74 */ "t",
+ /* '165 117 "75 */ "u",
+ /* '166 118 "76 */ "v",
+ /* '167 119 "77 */ "w",
+ /* '170 120 "78 */ "x",
+ /* '171 121 "79 */ "y",
+ /* '172 122 "7A */ "z",
+ /* '173 123 "7B */ "braceleft",
+ /* '174 124 "7C */ "bar",
+ /* '175 125 "7D */ "braceright",
+ /* '176 126 "7E */ "asciitilde",
+ /* '177 127 "7F */ NULL,
+ /* '200 128 "80 */ NULL,
+ /* '201 129 "81 */ NULL,
+ /* '202 130 "82 */ NULL,
+ /* '203 131 "83 */ NULL,
+ /* '204 132 "84 */ NULL,
+ /* '205 133 "85 */ NULL,
+ /* '206 134 "86 */ NULL,
+ /* '207 135 "87 */ NULL,
+ /* '210 136 "88 */ NULL,
+ /* '211 137 "89 */ NULL,
+ /* '212 138 "8A */ NULL,
+ /* '213 139 "8B */ NULL,
+ /* '214 140 "8C */ NULL,
+ /* '215 141 "8D */ NULL,
+ /* '216 142 "8E */ NULL,
+ /* '217 143 "8F */ NULL,
+ /* '220 144 "90 */ "dotlessi",
+ /* '221 145 "91 */ "grave",
+ /* '222 146 "92 */ "acute",
+ /* '223 147 "93 */ "circumflex",
+ /* '224 148 "94 */ "tilde",
+ /* '225 149 "95 */ "macron",
+ /* '226 150 "96 */ "breve",
+ /* '227 151 "97 */ "dotaccent",
+ /* '230 152 "98 */ "dieresis",
+ /* '231 153 "99 */ NULL,
+ /* '232 154 "9A */ "ring",
+ /* '233 155 "9B */ "cedilla",
+ /* '234 156 "9C */ NULL,
+ /* '235 157 "9D */ "hungarumlaut",
+ /* '236 158 "9E */ "ogonek",
+ /* '237 159 "9F */ "caron",
+ /* '240 160 "A0 */ "space",
+ /* '241 161 "A1 */ "exclamdown",
+ /* '242 162 "A2 */ "cent",
+ /* '243 163 "A3 */ "sterling",
+ /* '244 164 "A4 */ "currency",
+ /* '245 165 "A5 */ "yen",
+ /* '246 166 "A6 */ "brokenbar",
+ /* '247 167 "A7 */ "section",
+ /* '250 168 "A8 */ "dieresis",
+ /* '251 169 "A9 */ "copyright",
+ /* '252 170 "AA */ "ordfeminine",
+ /* '253 171 "AB */ "guillemotleft",
+ /* '254 172 "AC */ "logicalnot",
+ /* '255 173 "AD */ "hyphen",
+ /* '256 174 "AE */ "registered",
+ /* '257 175 "AF */ "macron",
+ /* '260 176 "B0 */ "degree",
+ /* '261 177 "B1 */ "plusminus",
+ /* '262 178 "B2 */ "twosuperior",
+ /* '263 179 "B3 */ "threesuperior",
+ /* '264 180 "B4 */ "acute",
+ /* '265 181 "B5 */ "mu",
+ /* '266 182 "B6 */ "paragraph",
+ /* '267 183 "B7 */ "periodcentered",
+ /* '270 184 "B8 */ "cedilla",
+ /* '271 185 "B9 */ "onesuperior",
+ /* '272 186 "BA */ "ordmasculine",
+ /* '273 187 "BB */ "guillemotright",
+ /* '274 188 "BC */ "onequarter",
+ /* '275 189 "BD */ "onehalf",
+ /* '276 190 "BE */ "threequarters",
+ /* '277 191 "BF */ "questiondown",
+ /* '300 192 "C0 */ "Agrave",
+ /* '301 193 "C1 */ "Aacute",
+ /* '302 194 "C2 */ "Acircumflex",
+ /* '303 195 "C3 */ "Atilde",
+ /* '304 196 "C4 */ "Adieresis",
+ /* '305 197 "C5 */ "Aring",
+ /* '306 198 "C6 */ "AE",
+ /* '307 199 "C7 */ "Ccedilla",
+ /* '310 200 "C8 */ "Egrave",
+ /* '311 201 "C9 */ "Eacute",
+ /* '312 202 "CA */ "Ecircumflex",
+ /* '313 203 "CB */ "Edieresis",
+ /* '314 204 "CC */ "Igrave",
+ /* '315 205 "CD */ "Iacute",
+ /* '316 206 "CE */ "Icircumflex",
+ /* '317 207 "CF */ "Idieresis",
+ /* '320 208 "D0 */ "Eth",
+ /* '321 209 "D1 */ "Ntilde",
+ /* '322 210 "D2 */ "Ograve",
+ /* '323 211 "D3 */ "Oacute",
+ /* '324 212 "D4 */ "Ocircumflex",
+ /* '325 213 "D5 */ "Otilde",
+ /* '326 214 "D6 */ "Odieresis",
+ /* '327 215 "D7 */ "multiply",
+ /* '330 216 "D8 */ "Oslash",
+ /* '331 217 "D9 */ "Ugrave",
+ /* '332 218 "DA */ "Uacute",
+ /* '333 219 "DB */ "Ucircumflex",
+ /* '334 220 "DC */ "Udieresis",
+ /* '335 221 "DD */ "Yacute",
+ /* '336 222 "DE */ "Thorn",
+ /* '337 223 "DF */ "Germandbls",
+ /* '340 224 "E0 */ "agrave",
+ /* '341 225 "E1 */ "aacute",
+ /* '342 226 "E2 */ "acircumflex",
+ /* '343 227 "E3 */ "atilde",
+ /* '344 228 "E4 */ "adieresis",
+ /* '345 229 "E5 */ "aring",
+ /* '346 230 "E6 */ "ae",
+ /* '347 231 "E7 */ "ccedilla",
+ /* '350 232 "E8 */ "egrave",
+ /* '351 233 "E9 */ "eacute",
+ /* '352 234 "EA */ "ecircumflex",
+ /* '353 235 "EB */ "edieresis",
+ /* '354 236 "EC */ "igrave",
+ /* '355 237 "ED */ "iacute",
+ /* '356 238 "EE */ "icircumflex",
+ /* '357 239 "EF */ "idieresis",
+ /* '360 240 "F0 */ "eth",
+ /* '361 241 "F1 */ "ntilde",
+ /* '362 242 "F2 */ "ograve",
+ /* '363 243 "F3 */ "oacute",
+ /* '364 244 "F4 */ "ocircumflex",
+ /* '365 245 "F5 */ "otilde",
+ /* '366 246 "F6 */ "odieresis",
+ /* '367 247 "F7 */ "divide",
+ /* '370 248 "F8 */ "oslash",
+ /* '371 249 "F9 */ "ugrave",
+ /* '372 250 "FA */ "uacute",
+ /* '373 251 "FB */ "ucircumflex",
+ /* '374 252 "FC */ "udieresis",
+ /* '375 253 "FD */ "yacute",
+ /* '376 254 "FE */ "thorn",
+ /* '377 255 "FF */ "ydieresis"};
+
+int main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int h;
+ char temp[80];
+ char file[80];
+ char glyphcode[1];
+ FontPtr fontptr;
+ CharInfoRec *glyphs[1];
+ int count;
+ int code;
+ int rc = -1;
+ float efactor = 1.0, slant = 0.0;
+ encoding *ev = &ISOLatin1;
+
+ T1FillVals(&vals);
+ Type1RegisterFontFileFunctions();
+ entry.name.name = "-adobe-utopia-medium-r-normal--0-0-0-0-p-0-iso8859-1";
+
+ for (;;) {
+ printf("T1TEST: ");
+ gets(temp);
+ glyphcode[0] = '\0';
+
+ switch(temp[0]) {
+
+ case 'E':
+ if (1 != sscanf(&temp[2], "%f", &efactor))
+ printf("expansion factor?\n");
+ break;
+
+ case 'S':
+ if (1 != sscanf(&temp[2], "%f", &slant))
+ printf("slant?\n");
+ break;
+
+ case 'c':
+ if (1 != sscanf(&temp[2], "%c", glyphcode))
+ printf("glyph code?\n");
+ break;
+
+ case 'x':
+ if (1 != sscanf(&temp[2], "%x", &code))
+ printf("glyph code?\n");
+ else
+ glyphcode[0] = code;
+ break;
+
+ case 'd':
+ if (1 != sscanf(&temp[2], "%d", &code))
+ printf("glyph code?\n");
+ else
+ glyphcode[0] = code;
+ break;
+
+ case 'h':
+ if (1 != sscanf(&temp[2], "%d", &h))
+ printf("height?\n");
+ vals.pixel = h;
+ vals.point = (vals.pixel * DECIPOINTSPERINCH) / vals.y;
+ rc = Type1OpenScalable(*ev, &fontptr, 0, &entry,
+ file, &vals, 0, 0, efactor, slant);
+ break;
+
+ case 'f':
+ if (1 != sscanf(&temp[2], "%s", file))
+ printf("file name?\n");
+ rc = Type1OpenScalable(*ev, &fontptr, 0, &entry,
+ file, &vals, 0, 0, efactor, slant);
+ break;
+
+ case 't':
+ if (1 != sscanf(&temp[2], "%s", file))
+ printf("file name?\n");
+ vals.pixel = 8;
+ rc = Type1OpenScalable(*ev, &fontptr, 0, &entry,
+ file, &vals, 0, 0, efactor, slant);
+ if (rc != Successful) break;
+ vals.pixel = 20;
+ rc = Type1OpenScalable(*ev, &fontptr, 0, &entry,
+ file, &vals, 0, 0, efactor, slant);
+ if (rc != Successful) break;
+ vals.pixel = 50;
+ rc = Type1OpenScalable(*ev, &fontptr, 0, &entry,
+ file, &vals, 0, 0, efactor, slant);
+ glyphcode[0] = 'A';
+ printf("From font '%s':\n", file);
+ break;
+
+ case 'q':
+ return 0;
+
+ default:
+ printf("unknown command '%c', must one of 'ESqfchdxt'\n", temp[0]);
+
+ }
+ if (rc == Successful) {
+ if (glyphcode[0] != '\0') {
+ (*fontptr->get_glyphs)(fontptr, 1, glyphcode, 0, &count, glyphs);
+ if (count > 0)
+ Display(glyphs[0]);
+ else
+ printf("Code %x not valid in this font\n", glyphcode[0]);
+ }
+ }
+ else
+ printf("Bad font (rc = %d, file='%s')\n", rc, file);
+ }
+}
+
+void Display(glyph)
+ CharInfoRec *glyph;
+{
+ int h,w;
+ unsigned char *p;
+ int data;
+ int i;
+
+ p = (unsigned char *) glyph->bits;
+
+ printf("Metrics: left=%d, right=%d, w=%d, above=%d, below=%d\n",
+ glyph->metrics.leftSideBearing,
+ glyph->metrics.rightSideBearing,
+ glyph->metrics.characterWidth,
+ glyph->metrics.ascent,
+ glyph->metrics.descent);
+
+ for (h=glyph->metrics.ascent + glyph->metrics.descent; --h >= 0;) {
+ w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing;
+ while (w > 0) {
+ data = *p++;
+ for (i=0; i<8; i++) {
+ if (--w < 0)
+ break;
+ if (data & 0x80)
+ printf("X");
+ else
+ printf(".");
+ data <<= 1;
+ }
+ }
+ printf("\n");
+ }
+}
+
+T1FillVals(vals)
+ FontScalablePtr vals;
+{
+ fsResolution *res;
+ int x_res = DEFAULTRES;
+ int y_res = DEFAULTRES;
+ int pointsize = DEFAULTPOINTSIZE; /* decipoints */
+ int num_res;
+
+ /* Must have x, y, and pixel */
+ if (!vals->x || !vals->y || !vals->pixel) {
+ res = (fsResolution *) GetClientResolutions(&num_res);
+ if (num_res) {
+ if (res->x_resolution)
+ x_res = res->x_resolution;
+ if (res->y_resolution)
+ y_res = res->y_resolution;
+ if (res->point_size)
+ pointsize = res->point_size;
+ }
+ if (!vals->x)
+ vals->x = x_res;
+ if (!vals->y)
+ vals->y = y_res;
+ if (!vals->point) {
+ if (!vals->pixel) vals->point = pointsize;
+ else vals->point = (vals->pixel * DECIPOINTSPERINCH) / vals->y;
+ }
+ if (!vals->pixel)
+ vals->pixel = (vals->point * vals->y) / DECIPOINTSPERINCH;
+ /* Make sure above arithmetic is normally in range and will
+ round properly. +++ */
+ }
+}
+
+int CheckFSFormat(format, fmask, bit, byte, scan, glyph, image)
+ int format,fmask,*bit,*byte,*scan,*glyph,*image;
+{
+ *bit = *byte = 1;
+ *glyph = *scan = *image = 1;
+ return Successful;
+
+}
+
+char *MakeAtom(p)
+ char *p;
+{
+ return p;
+}
+GetClientResolutions(resP)
+ int *resP;
+{
+ *resP = 0;
+};
+
+char *Xalloc(size)
+ int size;
+{
+ extern char *malloc();
+ return(malloc(size));
+}
+
+void Xfree()
+{
+ free();
+}
+
+FontDefaultFormat() { ; }
+
+FontFileRegisterRenderer() { ; }
+
+GenericGetBitmaps() { ; }
+GenericGetExtents() { ; }
+
+FontParseXLFDName() { ; }
+FontComputeInfoAccelerators() { ; }
diff --git a/fonts/utilities/ps2pk/tests/Symbol.afm b/fonts/utilities/ps2pk/tests/Symbol.afm
new file mode 100644
index 0000000000..1cdbdae695
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol.afm
@@ -0,0 +1,209 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Wed Jan 17 21:48:26 1990
+Comment UniqueID 27004
+Comment VMusage 28489 37622
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -180 -293 1090 1010
+UnderlinePosition -98
+UnderlineThickness 54
+Version 001.007
+Notice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StartCharMetrics 189
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 23 -17 471 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 686 ;
+C 51 ; WX 500 ; N three ; B 39 -17 435 685 ;
+C 52 ; WX 500 ; N four ; B 16 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 29 -17 443 685 ;
+C 54 ; WX 500 ; N six ; B 36 -17 467 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 54 -18 440 685 ;
+C 57 ; WX 500 ; N nine ; B 31 -18 460 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 478 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 27 -224 490 671 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 40 -85 92 925 ;
+C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -79 55 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;
+C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ;
+C 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;
+C 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;
+C 239 ; WX 494 ; N braceex ; B 201 -80 255 935 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 332 -83 715 921 ;
+C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;
+C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 398 -85 450 925 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ;
+C 250 ; WX 384 ; N bracketrightex ; B 305 -79 360 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;
+C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ;
+C 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ;
+C 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/fonts/utilities/ps2pk/tests/Symbol.alpha.hex b/fonts/utilities/ps2pk/tests/Symbol.alpha.hex
new file mode 100644
index 0000000000..53999742d7
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol.alpha.hex
@@ -0,0 +1,29 @@
+
+character : 97 (a)
+ height : 22
+ width : 24
+ xoff : -2
+ yoff : 21
+
+ 03f000
+ 0ff81c
+ 1e1c3c
+ 3c0e3c
+ 780638
+ 780378
+ 780378
+ f003f0
+ f001f0
+ f001e0
+ f001e0
+ f001e0
+ f001c0
+ f003c0
+ f003c0
+ 7803c1
+ 7807e1
+ 780721
+ 3c0e3b
+ 1e1e3f
+ 0f381e
+ 07e00c
diff --git a/fonts/utilities/ps2pk/tests/Symbol.alpha.pix b/fonts/utilities/ps2pk/tests/Symbol.alpha.pix
new file mode 100644
index 0000000000..fe8cbb32c6
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol.alpha.pix
@@ -0,0 +1,29 @@
+
+character : 97 (a)
+ height : 22
+ width : 24
+ xoff : -2
+ yoff : 21
+
+ ......******............
+ ....*********......***..
+ ...****....***....****..
+ ..****......***...****..
+ .****........**...***...
+ .****.........**.****...
+ .****.........**.****...
+ ****..........******....
+ ****...........*****....
+ ****...........****.....
+ ****...........****.....
+ ****...........****.....
+ ****...........***......
+ ****..........****......
+ ****..........****......
+ .****.........****.....*
+ .****........******....*
+ .****........***..*....*
+ ..****......***...***.**
+ ...****....****...******
+ ....****..***......****.
+ .....******.........**..
diff --git a/fonts/utilities/ps2pk/tests/Symbol.pfa b/fonts/utilities/ps2pk/tests/Symbol.pfa
new file mode 100644
index 0000000000..f8671f45af
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol.pfa
@@ -0,0 +1,1099 @@
+%!PS-AdobeFont-1.0: Symbol 001.007
+%%CreationDate: Wed Jan 17 21:48:17 1990
+%%VMusage: 28489 37622
+11 dict begin
+/FontInfo 10 dict dup begin
+/version (001.007) readonly def
+/Notice (Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated. All rights reserved.) readonly def
+/FullName (Symbol) readonly def
+/FamilyName (Symbol) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -98 def
+/UnderlineThickness 54 def
+end readonly def
+/FontName /Symbol def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 32 /space put
+dup 33 /exclam put
+dup 34 /universal put
+dup 35 /numbersign put
+dup 36 /existential put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /suchthat put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asteriskmath put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /minus put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /congruent put
+dup 65 /Alpha put
+dup 66 /Beta put
+dup 67 /Chi put
+dup 68 /Delta put
+dup 69 /Epsilon put
+dup 70 /Phi put
+dup 71 /Gamma put
+dup 72 /Eta put
+dup 73 /Iota put
+dup 74 /theta1 put
+dup 75 /Kappa put
+dup 76 /Lambda put
+dup 77 /Mu put
+dup 78 /Nu put
+dup 79 /Omicron put
+dup 80 /Pi put
+dup 81 /Theta put
+dup 82 /Rho put
+dup 83 /Sigma put
+dup 84 /Tau put
+dup 85 /Upsilon put
+dup 86 /sigma1 put
+dup 87 /Omega put
+dup 88 /Xi put
+dup 89 /Psi put
+dup 90 /Zeta put
+dup 91 /bracketleft put
+dup 92 /therefore put
+dup 93 /bracketright put
+dup 94 /perpendicular put
+dup 95 /underscore put
+dup 96 /radicalex put
+dup 97 /alpha put
+dup 98 /beta put
+dup 99 /chi put
+dup 100 /delta put
+dup 101 /epsilon put
+dup 102 /phi put
+dup 103 /gamma put
+dup 104 /eta put
+dup 105 /iota put
+dup 106 /phi1 put
+dup 107 /kappa put
+dup 108 /lambda put
+dup 109 /mu put
+dup 110 /nu put
+dup 111 /omicron put
+dup 112 /pi put
+dup 113 /theta put
+dup 114 /rho put
+dup 115 /sigma put
+dup 116 /tau put
+dup 117 /upsilon put
+dup 118 /omega1 put
+dup 119 /omega put
+dup 120 /xi put
+dup 121 /psi put
+dup 122 /zeta put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /similar put
+dup 161 /Upsilon1 put
+dup 162 /minute put
+dup 163 /lessequal put
+dup 164 /fraction put
+dup 165 /infinity put
+dup 166 /florin put
+dup 167 /club put
+dup 168 /diamond put
+dup 169 /heart put
+dup 170 /spade put
+dup 171 /arrowboth put
+dup 172 /arrowleft put
+dup 173 /arrowup put
+dup 174 /arrowright put
+dup 175 /arrowdown put
+dup 176 /degree put
+dup 177 /plusminus put
+dup 178 /second put
+dup 179 /greaterequal put
+dup 180 /multiply put
+dup 181 /proportional put
+dup 182 /partialdiff put
+dup 183 /bullet put
+dup 184 /divide put
+dup 185 /notequal put
+dup 186 /equivalence put
+dup 187 /approxequal put
+dup 188 /ellipsis put
+dup 189 /arrowvertex put
+dup 190 /arrowhorizex put
+dup 191 /carriagereturn put
+dup 192 /aleph put
+dup 193 /Ifraktur put
+dup 194 /Rfraktur put
+dup 195 /weierstrass put
+dup 196 /circlemultiply put
+dup 197 /circleplus put
+dup 198 /emptyset put
+dup 199 /intersection put
+dup 200 /union put
+dup 201 /propersuperset put
+dup 202 /reflexsuperset put
+dup 203 /notsubset put
+dup 204 /propersubset put
+dup 205 /reflexsubset put
+dup 206 /element put
+dup 207 /notelement put
+dup 208 /angle put
+dup 209 /gradient put
+dup 210 /registerserif put
+dup 211 /copyrightserif put
+dup 212 /trademarkserif put
+dup 213 /product put
+dup 214 /radical put
+dup 215 /dotmath put
+dup 216 /logicalnot put
+dup 217 /logicaland put
+dup 218 /logicalor put
+dup 219 /arrowdblboth put
+dup 220 /arrowdblleft put
+dup 221 /arrowdblup put
+dup 222 /arrowdblright put
+dup 223 /arrowdbldown put
+dup 224 /lozenge put
+dup 225 /angleleft put
+dup 226 /registersans put
+dup 227 /copyrightsans put
+dup 228 /trademarksans put
+dup 229 /summation put
+dup 230 /parenlefttp put
+dup 231 /parenleftex put
+dup 232 /parenleftbt put
+dup 233 /bracketlefttp put
+dup 234 /bracketleftex put
+dup 235 /bracketleftbt put
+dup 236 /bracelefttp put
+dup 237 /braceleftmid put
+dup 238 /braceleftbt put
+dup 239 /braceex put
+dup 241 /angleright put
+dup 242 /integral put
+dup 243 /integraltp put
+dup 244 /integralex put
+dup 245 /integralbt put
+dup 246 /parenrighttp put
+dup 247 /parenrightex put
+dup 248 /parenrightbt put
+dup 249 /bracketrighttp put
+dup 250 /bracketrightex put
+dup 251 /bracketrightbt put
+dup 252 /bracerighttp put
+dup 253 /bracerightmid put
+dup 254 /bracerightbt put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/UniqueID 27004 def
+/FontBBox{-180 -293 1090 1010}readonly def
+currentdict end
+currentfile eexec
+a8686bfddf470dd119f86e1b8e5b290ae7d910e9317a36f6768d8de89e7e
+d5b845166db0e18e3fca77c6e789f2ac61e3ba2248c0c4ccdb4c50344889
+3c2a909c36546b763088822eb34d1051d0ac662d8098db11f0a527a679e4
+ac03347df4319a689d7d65239e8502b5db9aef94cd6cebd07cee5af22db4
+c8c628a982cdd10c4e3b04736d073f90eb0b840b42ace3798961326b5fea
+769b604e99b2d79dadb8b7ab2e769c4efa129084478f38eb206f8fec149b
+0b6e326fc4c76c32fe3ea5164f588b21cf83c0dcb1548e4dbc4192fa8187
+5d1968283f0a8974422b2af5ccb6cfe6097902c0355e57be4514166ff58f
+ff2b47cbda355099fb31aa17e4e857dc0df1b653b9cc8a9a45292d41e3c8
+8ffe4036018811bf2fc55980ce1a4fa5161e167769c4e289627a8d3083cd
+52b08be6b1531c322f863631069f3a3ada3e2076bab4d62374eab5672cbc
+8537bbd7ed92c12f05909c25dd36e05b289b91b1fec65dc210e67c167de0
+44de197b03df0817a5f3faddc8d16ceb8b1be53b6765b6e659bf54d91981
+57c966649a774ee195c10eb3659115d7ad8bb83114beea798c45dc84db92
+b20e757059ab45e275c23f1be30b619ac8486127cc0bad1eed3eea4b7e86
+4e58fdb2a98ecf8b0380d25e481a4304e232e4e346ba781e0e68b0cea3f1
+0ee7b2fce0b144ffae9bd297b2506c7da44474845893e06c490f0eb2ffeb
+034a75292e59cc038e75e1dd9ad080719647fea7dd00f7c8913d92b9282a
+1765a2d357557cb0de7c0da979954cbd77694f99ba39246adb7495766058
+fb8a8d4151a4a0d0f740d776fa13c0ae11be76ec06f9b367b3006ea681f6
+1f640c3640a78d0c7ff521d477981e23e5956baf42252463fdbec49bb560
+a9428d248b0c5250cfa2a49cd9dbcef73123c13ba382d3cf6a7b8a8ca319
+1d379a659f0e2c6e9cafe9da2ac074f622e397a2f7c73347364ae249b11a
+e2c34aa7f0d27b5f35d548d5ad1228597dd16a478c901d3a34d82c32da87
+78486072ad36d8b1903689123f99be020d41cfa9ff521d1eef52a83f4b6f
+daecaeb404e3cab31da47ebe2cc011e458d64a6e2c5c1348b91c0ae0d799
+9c35ed72eef0db90ff2ec2c242328ace7bbc5ccc5ee7998e27d365ec0937
+b6a1d0581d6a28cecd8cfde5aaa0ab1d43ee1629ae7a70cc0171ca2f3d2b
+becc6cd9ffd9858f4767cd3338250c3e467d21efd5d365d7b28d3106dea9
+c0b68a52ebabf4b463cae58656a0c6cd0d56cb1e9a2faab1dc4696600ffb
+c2039816785e3dfe868e181378031bb9e8c502cc2ff6a457c458ee19b123
+a175c89ef640111781540cd9df8903ee6fa23d54262274559148057e9adc
+e2cc011470c1c168128822ac4f22b2b37ce77a358c9a7730a948b9d9bad1
+3f78e1d2cd986d9807d720243dfd898657943cefbce545ee38325e803c5c
+d2b755fa168ad5390b54cb33b9e0762fd22b13aa21643c022d40e697c8d2
+1d8c44d89f32a2ecd1992acb064881c5ebaa138d05ee0b4d302dff6f5bf1
+271174f933bf4f7162e0f80833dce8059bdbd626ab7e6d7498554fe49190
+43bb14842d91c888c0a68354c5c5539a82079e393710d408ec09dea09f95
+cb8fc26260f2c49ecf4a2f64c34b6ee86521f313326f38d12578f96b85c2
+649725bd3457eb8b156f4c991022e9d3b1e3c07e9519dbdb3032e90445b6
+e7e377278a37c589fb9b4cbf72a100dc7ffab7cbac93f3f648007948aaf6
+ab06d371f10ba0f9240b1a24c9c3f89c29fdc5b57dd99799ff4f68274159
+9d406456eb64e2cd4e02d80cdf90f0a7df99214b1111ca43a98301ab543d
+25084c6e7a4442aaf6f599fd0e3a02996c15700eb2e8389f33a7479d991e
+c67abd43893d113472b19972ef0550084f40a3e49cbc85c29b1ba3834e81
+ed3c553ce6727ccc5d0a0b2e0fc9a61624d916cfbf803360b278a8a9c4e4
+5fe435fd830daeb63879cd7ebe6bd5e3c4f6e516b24ba18038b3a936f74e
+2430149a0ffdc466bc93b4b8e9d7df66d6d09c2301085aa2e37f75728e29
+1e3557000ffeb9a47657d6b01e3f24386e45d356fd6eb98599b611d73cbe
+88c899e8e60efa6f99fe7e12d3039aac12f385081e4e95c8d833867a8666
+d5bd2153cfcc12187d7aabd79203e914ea680b4c977cdc9c2286f9a47d8f
+0378a687d1d48c9bee2ca64806a93961d644b4d70da7c173d5bc3213f8eb
+d3cffce79f20deb618299724865c5d594b7086b5fbba9d68f365aea313fc
+2d7c0af3dfcc007cf7c2b7647287f4e8be8255f2532796b42e8ef17c74a5
+921763696c8236f7902969a664ddcf185c3bda785c108fc48bd6b7d4dd17
+bf4964caebcc06392fda130c67d2b5dfaadf7c727a947e61725fcb8452dd
+33819fa3debd761a1769d3b186911b7927c0d49d5e7a2b53e044c784060d
+9600c2801a8095bc9985586564b28fbd26870ee6c0dafbc40857a44a606d
+dd95ed837e5799730f9d5246e3eaf6be8a37dff0901b065753d3d4d3a68b
+7a87af6b0e137e1cc4f7125479fc7ce782cbf663c7b858dfaf98c3f53957
+15de7e2d6a620e29234da977490ceed8cb72b49e2b5bca3acbddf342e184
+bcc24b3da9a1c234919e35d9cf53621f383f85c28655044ce05191ab0cd8
+7ca61e2dcf787237a162a93816bf7c5139d16ee799efcbf3386bcb9dbbe2
+3b5c52cb34eb7207aa39403001c86122f5b32ab35b32d4bc391955a3c84e
+896e1fa498aa99cb980316851de4fd4c5884d8c55ea10b791c68bd908d4f
+aa1f641a982bee3ecc433f311e28b4ba46b10fb9450061d5074509640a2c
+6e3bd08c10f4dc99ee2679700fdb3074e493e8b9ca673cf12f336b85521f
+c81f904afce3e03446bd8d4ddb4cd33bf24cf9443709b94aa6ff54809baf
+42eb9966d68f64d1958d36e170189462c484decc1a9aee047aff84a75296
+de9f230992046462a9a3d821f31924f6e063b23edf20590c2271ea26f96f
+5c8234ff0f2656506710d15387dfe9402a35fac32ce9bd709736adb09802
+239e6dccf3bb89e677e7fa2347f693a47ddbb82f6ab50796227f74a1687c
+d405e590389a2fa3a12494e637d69798722a4629f29d5f8ec0c28cd6a9d6
+c3613b06a9b48170dfb844290618452fdaf4258fc231836fa07eb842f496
+3d7f4baec587f7f8e1aa1ef70d02fce05d72b987639f416fb6d18abca742
+976bb4ae3cfb9bd8ab03fd01a267d2ca968014e648d68bf195855ad77bc9
+97f33dc586892d270f7df2671868be008921d9bab6f6cb2d3e2909f1ceef
+7f62586c44ff027c28d1b285d1c409c0a6f68e33684bcb04ddd8e8d338cd
+ecfc68488e9bcd337047c2135d66b24644a4fcd8578fa7d21001773db210
+6e989597faae907aa2d58b28357e6e2478bed2d0660947227ca40e089050
+14401885bb6d04fb705bd7ef86e51437f0f01aecc60f1bd71d480504aa20
+2d31e1e3de1f1103c68ae43948d25a4c34bc8f274fc38b4b1785a8e5bb55
+c458b4399b817db03be9a37c4f93cb04cb3d96e2ff74cca331de6080da74
+57eb89b94a67334119f33abd1273a16a440bf2503c7f412706743e880531
+43048517dccc0f0659d9fcb65808f260c9cee906c80262ee2a9f9e6c2aad
+b36cec10145e641a0b1240584bd2e082b404778a8f335cdc4d2523e67fc2
+7b7a9f4e91eff110ff727d2af7cc179188fe799197ea65527e8a763e289a
+8752072d43b427f86bb7b4a6395f9d787d34ca8fde4fb9a9b140a343a9a6
+3f7af293ce1a6f54f5bdfca90b7a30714ccb880b6676b50c5e3547a383a5
+1528157a06c8dbecd116885e5d3690d454b0495d14ae65ddb7d0ea5778bd
+90311442970aaf33f262a13bf86ba493fe947d27603651ac8b1d04ca5fae
+8f28cdf53203b3e691675407254ef6275a6da6ce9dc274c3cd492ee4d846
+ffcab2d2d35c1401727b0dcb170c77546e0d79823a26d2c5e14d1f6d1319
+f4435b76fc3891d7c30ef28b0a16ddabac526f3b51f8b89708b27014a84f
+5920f23e6a13e8c06aa5692c01d38872aaced2a0410e865619348b96d153
+a51d41c62f1d1206f422ba739299333656d32791195c9b87eefb1abc2bff
+3ea3af85cce2c3df1d6d7b0e01ebdbb0bac3033a5252ca06aea1c21201b0
+7fd8e5f7fda300de7c7f689836aaaed413b5114e0e87ad0d8f236382f388
+dc7a6e0d05369713388a2fcabd1b98468be00618077a00a4a359374cb8ed
+22513b15304cac497830a9a4b6c5f16f6b3130043db3d7367166e455fc5f
+ffa2f27d832015fbc432db0776953fc30771dfaf50995a60e0cea496759f
+f4260f807e9fb4a9e8e0292d714eb61d820a1c9c67ef0b08d5a52d362c12
+4a75112bbf2b9189f3a605ec592012abd7a3c27f907f2d521cb9eb27768d
+eb8388f1e872591ad29b41053db67ca08713497dba053be52d997b5ed0f0
+bd1246b0fe4f13695138f3ab7646782174647a7f27d88b0368cd81dc0531
+93b1daf6036e4e6be7c846bf0f5350c414629b45aba11c62b5d5e9adae9b
+57474271636efd71446bb26a275bb208f698bdc2d9905e30e920326297eb
+f6ba9092ac2000b5c937edcf0c8c79835ab722a951325867c4f17115a821
+4241b658d4aeea5d4026747c789f84b60e532d30ef8d8712b8e20439e78e
+b40f6153076b572816da799a60f4ec00220d3c111c695e58d005e4a64279
+f33e5a28f4e0a366e5490469cb7632a6be0b5f087ef7c08bb801f66d29a1
+8e2b8b107d4c8aaf2d4875d97c085e771e2e864fb0055ee292eb53b07834
+eaa8b71e6c0b1c65df3b864e2014022e88816e38a5629559893fecfefd8b
+fac67bb993a30a42d9c124f66c296294f26ba316b5a7093c3439c0e1d096
+e45dae1a6c747daf9edee56a0bed1f95e0f7470080614245c1d59830f075
+4448718ce6810d8631f2e072802d66fab9f9d52ff1f1de8a695dcd371c90
+85fd5f465befe96c894e8ac0cb58836e9bc3e3f3f0d78404c84b91533f61
+bff9d0aedca8511d9bc30554e043f307d4360e371d2fde541f77b6b415f0
+54d257980975602b6df53bd99dc3923b96d3f9e4b3d1b29865931093a73d
+3b2fb7aa6cc6f5c3db794c6909faa3e83673e4d94b506f33ca6a9e5b797e
+c486f9bb84106a4a85b3e850def844550c7eb5c128117da5e8da50ddbc3f
+41dba4d7b8a2945850f164d71dfd95f65fa980c2887d9da47fd4fa0dbd00
+5b5e677e969dec3860ad63781645dd8dbfed960d59d56994665ebf62e152
+4e6c12a6958d92bb156243e204368e13f406084be068d594fdf21774a1f9
+c3d3fea9ad298ee7c9ff47e27064cbaf84d7fe2265e953cd353da669ef14
+482029840a776f9d0afa8bebd2a636717e7eba08688d93e44e161a696d70
+c9ae0f702268f3a13b58db17ece7a3dd600cb6493c7a1684c3ad66044d52
+912421c39f6136471afbbfbde4cdffb5f1ff72ce1ecb208a236392f5b62e
+f92bc2271c5fb8504b386cb60b9b1b9e3699b2c1b53a4b92b492818bd004
+f17db76dc85bd164a96a77ad5a1a263d6affa10264fd17334f1cc89c4f95
+9345c182765f60135a4589093b45d0ce523645ca4b9103e9679b264c0602
+e5bad2d6e03b1d520bae2f4b8f06e50352032445f790b021a44aef0e16d5
+06dce9251834ea125177b46a37cc3c856b94ebe362de717e8b8fc6ab3c88
+d4c618115e56d3e8e4e9f68f816807f1e06b2c9ac53e44c938d3026492b5
+3e5489f328ef410e46b817ce3649ad8046ffd2c163c4ee6491ddac639877
+3f82fe4b0c55a695bbd98414b42e03dfcb152a1590802e518b3bb31364b9
+7f95cc993c08c53ea8b3c0826a468a61ffc8134db155874c5166f5bae260
+e6d8cea4aa701d8c33ed4c9a04761b2e51a865a9ff88fdb67e9dac28029d
+4438c38ce12e0e697b68b75200147589599ce8a5706355e2a952b58c1a77
+5b1733323a14b591bf7f67ac5746ed1064c7a0a507eba49d161bdd06a3fa
+6c82e40188119661121732722d1926f836a7f54db2928ead28c9e10d3995
+9c98245c8002edf97735c4a8fdb6abbf8fa2a2374d46553f964d6a1fe112
+9929dcfbfcaec32a22e535a78376168436231cf19323e4fced6ba2e00c07
+e38120cca376d42ac150c47d00b62a3159a6164a5d0cb6aee490fd31f7bf
+0676d582e55e6f5a119c1a2b5aed0f79e941b98e45aeef9df57395994aa2
+2682603ad7f4f4b4e6dfa9f1b7dcbf8b516566115191112a9d03a835be9f
+cd7f6c165431e3583e9548d7ec93d5de800a12651e83780030421de60be8
+9f35edf14cc8f44b384d3b60cf1dc0c6bee7510de78a074099cbaf218cfe
+74780fdbad5dfd1e611fc553d85c4f95dfdc13021d8cdd1aa3c2862b1352
+81c25b9032240ffd6c346699b7aac0dce23c71032dba631948586c102b96
+10371a2cdfef7e4c29f266c013678c8a5803a3060c76e4ac7d39b633f13e
+4f53ba8eae2006fe1eae01ca235f5a62119871dd78560131218cabb47f53
+862cc5c0fd6962fc3eb0cc4bac7fdedb4aa80748dad4941e7663628397c3
+0329efc42c9818eafa8dd6b71d1236635cb73fa8e6a245643a2fc5436b20
+0993293b062d409497d2983a2e3e8ac1f02debdafc87a1f428e2c2029ef4
+53dec66f9d71e80e2105a3f0750375c54a35edec553934ccf6a21f6c0ec6
+42f89b66f7275facac47364cc288ecb4af118fc7d431836531e4162cfb02
+328d43cc6d5cee04d7966b5e3580ba5ce14e2d0f763c4c3eae5664351415
+ad48e4c36c2d94b935a57c96841857f920234a9b371c9649bdb29692964f
+c370ba384810420bb538ef4ff3cbe4f770898c9496229cc5cba246f38b07
+3f94904ed3f00a3e478668930b7f77819c73905310c9b8dcf76150055458
+8fe9e3a36acc59e433e52ed6d7e0fc9f850695c9c569fc00b3201e685887
+8be41d4de89375ff51d7b0c727178bf99a3ac56aa8ab328beb140755e4ed
+cf7457688c673d43d81d108ecd6472153d35286c9b015d4bf4ceb52fc945
+b0d0353c1bfc3138f22eebda1258d4a772c9f6047a241a38e2889cfc4336
+9d60450a021b7d1a57305f652b6860b43f72f89136ccc3cc817f5ef2cb65
+3e149481c75e4051d770358cc5c14c9e5449333129ea5ab70b73919b2eaa
+94851b83e17adf1b0937e1623383ac461dd61f853bb2a19148cf1741b8d2
+261815705f6ae9313e9a5a7aba0a893265c8732c4a80218113f5a7623685
+f0d475f4b7488a7cc54867c6f4269f21ae484f6ed719e917f1b412c69bc8
+b48120c7044c32b0c844309d2ae90f43c7940b3d5261eeb2ebaeca757b89
+640ee3effbbaff2877cf311a180de67f0a8df934aad92a7eace8c6efc4f0
+9cbc06ed609c96cf891473abe1362a4d9f95a5d37d789d76325eebcba638
+e6fb891f9d7413217fe184dc2218577fce1f22e5d40b55ada7cfd71b1eec
+39231456df20ec121d6f4fa4e8ab3b291fdfce7286c10b774cb1ce7db9b2
+3c9c8322881641e3c6019e31334f2cc1d665cc479ad36c8ca694302cb574
+10bd789166ed99df4ded2ca40612b2a68c49b6ffc4c2c4ed667023711748
+a5baeeeaa20a1ab463c09c87b6f7f3901ecb0984cc23c24b66e89424eebe
+4f07f811cae8b3136abcdc64f0319d4cce4f8f2cacfc44109d3ea2890d11
+802e6bc28bfb0adf428e92f8c8e302908e1d7791358fd3f5e02ae3a7f50e
+ec45fa0f28091572c528fbaabbcdfcad65d66d8a7be76ecc58d5cb263430
+31d61a0d94e11dda5aaf9c4f66e4af19a31d29326ca2189cb61edfd36e98
+cc7e67aebcbff6befa0691f3f4cece202224d4d824884b845f664114b915
+1044df7b8f23c9cfc17127aef763f528360dbae912b49f194ea48b337c85
+bed117fe164030e19ed3ed6650ec283bc9b90a6702e719aaf72e3c79edee
+6eb5cf68ccf74cac3747484809d3c8a1e8993cb543e7bf7b2dbec7e996c4
+5b6326095c2938cf3fa05453c7787095a236fcb854d39935ba4e1cd90db8
+1a871fa058165b045ed582109ad90c2092dfbf376d3f43523ac2cc336cca
+d3dae039e02ddaed85e1d1428c58ecff2f1e969eaa1658330eb155ab33a9
+524ed336d1ad1b4ad4f09f25af25e2da4cca590f14fd18f1bf2de6649318
+5b54fa7db4c1b425f8a91af562895795746e8cfaee57f247ecb949924c26
+966145b848874a5c2731b8905136e8599ade111001a33b455105f4681eff
+6186070ed30e43454ed39c80b2720b77572de8a977329d2dcdffce6ba302
+740cc1f4fa5b804644b0283a7e783238e1832d6de3e6d8a1b2834cfaceb5
+62ae004d98b7deb05436f547e189e3529cde322ae38b38be6be02cefb389
+c7b9432711c0b528b7516a8d9a416a112b1cc51a2adc8d96b0bd098e80b5
+d6ca55953591fbaf29ca90ff480fb9a8b11589cfe2a8f52f76e03cfd7f2c
+eb497d2d51a4ef853dc69eec6c73ddf8acb29aee0167e103e8e0f0a070fd
+ade75354b85b722d56fe6a8a4a827fa17e8f9b7e7282f85d03ed13dd9adb
+40a3572188be0d269ca5574915012a6596604f77a730bfc7a10243379e55
+e0f155a002f0280f0bf8507c5439e33872e61eb21b1b90fa91a263475509
+1deb6b50774f0b3000acf9e6597ab7394d55feffbe319feddad4d7c5fa8c
+2240ff827cbd391934e32c5c6933218eb33fe11dc5c27a5067cdcc434510
+8801f15e5b9339e654382eefe167926869f5b09e004c3d4478990f4df71f
+3e500ba8782387819df65b7241d4f8e91c016399ce427bf970c135373ff2
+3320761fac67862a5a3eaff5d149fca9632445017e82ee8435b1f5205ebc
+a0d86c5bd0fdafd794b5b4906684eedde0f75236a3cc78faf940723334d6
+d4807b4b84ec78149e3d70293b8b8a6e5b37cf09f9b955507003d4333a8b
+b2e445962a326007d7cc23d17ae70e4eb3ceffd18eed2b9c1097b80b75f7
+eac6f9d34a7eb4ef04cbd02c60f0bcd72794562333dff3f94484cb7bc1e1
+b6ca1af53a8432ea8b4ffb87fd2f0cadf71931a6ed19fc8bc6d914b1a8b2
+633bf49929446174e580f5186099635c605dc1d4030b4e4019df73e796e8
+e41cfc84e0916e2ec637b4a86166e6fab41ac8750e2396641d9bdf1ceec3
+f448dc3d0b89a8bd33c0134fbb2c2e0395bb65c5fb243bbe2b22ed8f55c8
+bb8aaac2543f3352343717d97b71cdb22b5bf6fd62076fc41e1146533d73
+093dd421025e5b2e4225a9e47235fb30328774f0fd76b1362c85e69baec8
+7af39d8dfa4b3ae82ebe1bdf21f9cd1c20edee7ae5a17a48f84d5c5d28ca
+a3a18a0408d8420071c9eca26b71dc618881bbce3d0968aae3762934261f
+4cb03f26efeca6188177d804acfd250234474181de94fd711dbff420123e
+db91df92997cba49f726b8a4ba43a3f2f6f040bed8e370afe031556999bc
+9ca5a553effd814f1bf4f640cdea3406e34f65cfd625d9729701dbf02a03
+f7787e8c95dd08719c58e3b8a92c573381dc1392a7c49c2a72e796364d3d
+117e927be69f9bb70b53e450797503b1f8fb400c580f3e4ed94863747099
+dc3a102c29b013655e06e8d0bfe5e12f5d8b8b909f886bc9910eb42e7b62
+d1218bd94d8a5b20e03950c0a5887d6729937bcea0679fb52ad29514685e
+3e64c9e82e9c82c04f810cb5e86dae4cd7eea14041f1d27adf00526fde35
+9379ed1d0b7e06244ff354f343453fcf21514d8ebc5dfc005dfb9ca4e698
+dcdba07d0f79b129f2b71a8bf488ebf90e6ae748bc438fa5492e239dd4ea
+fd79f8b52408a4f244efbba527e131e6ebf6da23fb43186dfd414ab02344
+76dcf1c1ddf06e58b5ce5d5677740b4e285d8b87cd04f6011b54c4d5c322
+3c17ca906e90dc6271c103b4a49cf2f89896987e96484b45fefc41b04c00
+d9a8de774d861fae63f8bc9cc2fba2317a5e951ecbccaba5aad95ea61329
+3f1da5e3042ac4ba95837fc844eccbb76cbca769ee049d9c3f90f5d687b0
+97379bb7679a9a12eabf3ef0036300b90f0722807f81a871118418db0dac
+ffe28aae0c1031fdffeee2d3b831103fbbea005058b243be116dcc9729cd
+6d088d0f9cb9364f89e942177ef74d0643db9c3301155db0a9ec75829673
+922b1560e69c151fa9325a00c84a202eb41b134203b092736ee61cf1bd5c
+95532ed88d5b9b71e14accbc3dae675b52e49e4cf4c7580d13ddfbde33aa
+91f1aa4ccd64af5a5475f24553e339389c8dfbc14a6dad602cb23feb06e8
+aa30dff60f3aa223bf5ab110688326a72e543f0d17a2bd5d33ba449e1b2c
+6c4eaa0bc276a160c2a07a385ce22caff5c3aa7a5551196c48aebba6a3f4
+afd1cf8566eb6542a1ef37794ff98737ceefc0bb772d7cd07ad5a4302072
+bb172a5e82065e61d2aabc5411cc35a79cc0a63f29d7f62c09fa98b1e703
+825b2a9fe735c296dcf5d16adf235cf9a252e9538a30e38f67836cdca7c2
+a75c1b2657017c16f5ed7d125a3354289eaf233d52f082bb5d8f80389e8e
+9d5e50e4ab869f8f29734aa2d3c06b11dcc569351d446e9e45408e41a969
+9fc3a7c0116b8a6603949de556a52ad218272f497251f281fcdd2a71ceaa
+c2e9bfdb4c891e2d4a1b3423e9a8c30e3379756ee7e196cbc76affc12021
+a58d78151394692dd830c6ee1bd29149a37d9a45303a2ea3339b3bad881f
+ad6aa15b9e7aed09c4fb27fdbb859d6ce02d1a1d3ea90f2939ed801beb0f
+28f367ff5616f5b033970d040a411747ab706733752bf0c11217126324ce
+ab6530e67324e516b56a0b80977a395211e1a7f32db114d1b621f7669b23
+a8a53fc327a8ca38592ed16715c6d782503d7c2973fb4d4cb11e2ea3cc8b
+5df0dc8fcdf0af4ad28f18ddea460de623bb4f79e3d7a9345f47d555746a
+c1d9eca2f8ebe594fe42164a8970c20aa4440d4e9a6cae89845edbc74583
+edcd312b4fd93911e8c9c5c4e0a127d1ca4a78f6f8ce93a4a6c571fb72ee
+c0a73a194e246e5f9b6b8019be7ef975b3956ad798c64a580654943d6192
+d4b4f05172b7064e2c4782e7215265c5ee0c4f3e0331765a94273708830c
+fa0aa2cb6a5bb230f433abd5aef8aab8f91603eb59c29b9ce5b54d8548ca
+e59ad6e3609668094077006883d52967bfc43213ee7504d366bd6ab0fb3c
+295c3adceae4803b8d723d78f6bb53d6391f68b5a76f17d15ef40987c3b8
+b1b3fef926a9690ce2147b648792f250d2db8ee80455cea46ada1ddda0fe
+bf1b6fb4022fefa0c519b1d9793c5ed7dc0b0aa59c61a4cf3336679deca9
+9c4f2bb39b348b6bdd98bba8dc2d015255fa2684385cbafc8e7c2d82db00
+10b220d38fedb4255bfd65138bbb1016b53b04051a4c2d757ce0af776c58
+5313fc9888b79fe7341c271df06400b6a95edb836c45cf59d3faf312e015
+2278835e430e4b42aebf48a293ed6b789bf67edc92010fcc0fc9f5dae346
+18903f7b1251fc3f2d5eb5fde66f0ec1630e640568b1109eab8ca9f84617
+f30d4b5897c959db430132540cd1379f5dcb17658aa1c59dc6f509aec5c6
+24d225ef96194a075d9ab67011f10fd21d07434e7f101534e57247994d9c
+16a7fec8416e59ec750027be6e2ac9258dd30147146c3048c9c93d16f8fb
+b062ecf10f9e54b418a1fcf4ab24521bb27453ca57b5cc9b72c4e175edbc
+8a876db42aebafacc33ba6ab66f028ce8d29198781870a7120de21eaeebb
+aed44b65b24b837059ead5c5205d68d51a1506de9b51440774b57de55915
+fe05ba2e740c37ff24a077659b9fbb4a394a069c1fb33c50836287a28226
+c31f75903b44b25d3bccba417f46a8433da7744dc56113ace4a12c87cffa
+60fee38cd9643cec30b1aee59d18e508e944c53dba216345f133513e9329
+9fa822780b39d049a3f3ab235314b4a361866a8957b3e4fc3991f2e76d80
+7e16d9dd47a6de200c036d3ab6567175251f6c8769dd0519d53434b98bb5
+e7051d83592febfcfec038d4265963be24aac1d495c4df853bbcca5ac937
+843ede788ca0e73249a06f7227c04796e86282572318f185226173d3a347
+b548368afaf2b80b1857848be4e7092e38a2b01360e3066dc9517840ec06
+89e93b4ac163d778556f67268034e5658aa79c2ad79d474118f29e146753
+bac0b74456787d73f19d2bd96b017c9a270d3bec637a666f8d08c63d1fc4
+1480bf974c50ef693cc995f92bfc61646ed34bb3bfa262dd8e6bb548584a
+f3a73a4835ba8dc1059dec2083660b63356e30fb63f2b88e38bdab96199b
+9730b28b51092cf9677247562cb407230ed9cf30f89d7556d0b8eb22979a
+c7835f90a982ce70aa7b45d52cfbe97b434a077aa24d4aaaf674fe71ffb9
+0dfc5f18eea5a533c3cab25b5dcf08565447a4e09485513fe2347434b0be
+57b79e8eae0e1a01dfc7222002c7a364223250b08a3f378447582edaa55f
+bbb26a096542ee42adcea469ac07b728f33de035e3f5f1850dd772d75486
+220d731af6d26c41f4afdebe24caec68bbcb6d3c45b2ba3b1d961d2eb7c1
+404388865dc57d7fdbfc2edf5bf2b3f1b07dcb47837878abc49846e359c5
+73cc53ebbcb66e48e625dafed81f6548f17709705f513a7d0f34623f81b3
+6c28ee3f66f2c211427a1f0261faa0c5717a2f48b538fc79a40fba8dc99a
+94e01d754d64ce6c03e299ddd366801e87446b9c263734e559aa8b84e82b
+8d352cbd31c43705af067fe793b2572014ef5ebb7d4bd550aba0c65849f7
+9d958f225d85d29f40804518230abc0aeda63a594c7fb53e132e3f34475a
+16b5a5903f210db4e88dcd27120cd8d7c4e1009bc75796ae2bff4de7ceef
+7a15888afcc60903524c01cb4a905a0d40878202d381dcfb1a5adeed0f5d
+ace0f724e120649f94a508c8af92417a88522f67176985626d5d80904c51
+60809063ff4283d029e8ae00a748f5a87b47558e2454185e1c6e6e8deb72
+d50793625f0012fe530b499532e6a099eb188378ff2031058d2c03ce54cb
+15aa73fb9b43ac365d0437d9d738e4246e0d3b49d8471d360b2cf6963e72
+7c29cd37317bd5e49f0339976f5e9dedd1ce3c6838a6bc632cb3f3b87946
+39ebe5f5c76a7fea93142907ee6e70c404f89b5948904e531b8d2d1ede3f
+3e495e110a850df56535bdeabaa476acbb05bea4d2ac4d1165f057bc40bf
+bbbf7a3ddefa700d63531613d6cedf2ec5a6c99c83f2da1fe8d158e9c441
+a38059f327d17fad51f5976c7b27fc48cc3a179c414cbae5bf819abe5ac4
+ea5da1febf135cabc6a49f8078db4a6c64ed0fda651990151260eeae1d0a
+a17bc1f1f95ab368572f1f742e6150028ed8d6232d2ee9650afb384de052
+6114497d10f994bf388cf16e8cebbb62334f9ffeaf0df3a89c50bc6a88d2
+7021d296e7920ebf10bdbeae0bf1fa6a0ef3b7c9ff1ace94d39bc2374789
+09788432a7c826e329dfd1fe2e05c7f36fcd9d41b16145e3c4aae1d08f12
+9643e8797e81ddc38e18ff6793bd44fd1f62fdf30e0902c99a8b4ac58bb1
+e2349dbe1866b5be28a47973645d7b3f3629175e324d50f3783e35bc0119
+bc11a38a8472a1c534daaf25f5b4072432252d5ded842be4b1ad5ea57db0
+964867457849162d5335e8c86562365fd833b7ae84535ba53c4db95b0ff7
+bc61122e0eccd8af40c3e17cffe0ea4fa12e1438feeb67e8d530cb0811b3
+54955e947a92be3d753428ff010a2a1c746461bc8ec2bf78a76cca0f75ac
+0d65625712915ef3d18967962b8993082256214c408ea41866558b636ce0
+b453df438ee2642ce35a0c1f736c2788d98aab85992f842c492b3c7c11dd
+646de00b0ae62a269f2a50854f2aba06a06e3e3ee42c1c65217bbe11db79
+3580fffe2f57968ac21b095bcd9fbb3d2756bf6231226fe63a2abf321dbf
+b74b65c86ef514df6292c885a461e0e9db19eb2d153c0fb7960780de473c
+0e672515f592a4836f62188c11508fa593d1f5f9e5682d258e723cb7f068
+1b83ccf0c14b4b789da54a747f892086d58eb2da4618d86898f5125fed03
+1c3e7fdc0856e12c65fcdb9f34f052b0f416be940c99853d77a89a136dfe
+fa4d315125d05150c6d7755c66e6a84d0737074aed40104177149e8a2862
+1117f07ee708e71cbeda23673447e7e2ecc84ded1c2fdf40945cae38522c
+4316c75706f52f2dba1a9d43e97babab6f9157b7d8cd08ff409024889216
+27b3e8a94cdff1de0aa7cd30029f7ef45a41902a8297256de2b91aded584
+d098019bae6e763078e9e7634fce21359e074006aacc89a1c8c6199da648
+dc880002ddae31f5a3d2594d41803bc86475884658bee7c7691726fc61b5
+5385fbd5ca9fab4142e3c765e568d42e8e358aeb6406d3e31c1659e89b0c
+87f71bb7cdadd56d1aae187168231e375e8737e17c05208d5ffc3737a893
+fefd4da6f095e8de9340cbfd21bea1b0027afd7313a6d188315ef4d3caa2
+18b7dcc6dd4de6d569a0652f6115ab7cec90679da2735501f982a3d98cd0
+ec6ea48b449863f1ffff347523d3766bb67305d20bf0492eb2334a2c7320
+9935f4f35de5fc172cbb9431ab371c7f69e11f9fc69c9f0ad5780ddebc20
+3bf4275be7bf05c8801de5b4e5d007250346b4e159263031666571f87ce7
+411cc1d94ec0a4c65b2ee9f67f2ee39f70b3abab8e9911a38a014c4e839f
+47d2bc47cf0a5c88a1da47c6f47cfa2000b0f5f36f9f7a182d6998c37308
+3df1c4beb464643b7bcd26056efdd43fd7d90f15992f3ae6fc00a080f1dc
+d11bbb610a9809869f3712880ae4574d7de52c25fb8d56627e03acb055a1
+7e50f5862d3309ddb88353a85bccf98e203167107d8a631f1fbe87631718
+41e891b1cdedf9438c18264f9d014c0a99fba6c12974fe029d016b200a56
+ba8e67b5b4121de96f2141abe0338d0a1121fb389f3b7c38794e64cd5458
+e8ac4ead27c1aaf01d6e4f90713328249c8a35050d0c57c92c68615047ed
+607bb0b2e01dafb143567159ee43013f7b51ad57bdf4c0e42e56029940f0
+d65d9a408a9d0d57d91e4fc6ae2b7061482ec4fdd62f842494e8b8a1c4a1
+4a65d4dfe80a8e12346e37a8ef583a034b1096dc0dce0498b464c0e3e6fa
+902f805e2f620ad1cdee95d566d37754036c669fba48bcbf5a1e178720ef
+3afc4499ab001afff896b3c2e5b4d691578ca26e1b7c9bc2caf84aab60e4
+1ee5c91559c7e1ea5f7f5e49f32a9eb00bfa1a5ba53b7ad7ff25a97ec81a
+c3d6157941b69ce2e8d3c057d355874e85e626df6e0be7f5bd1d6034e571
+274302767ebeb3f362dd5e50fd850e7542fa920b015f276c5063eae79597
+0445431aea0987239853e77530b83d1ba630f003d0960f40388ac23f5445
+31e221b8b982352f6015b3e027d691fb7eb68b360d6846029dc69e6d9c5a
+885781a9ff40968799b46493f675cf4455b1c4abf6ddef65a20adc5ebe0d
+631a6018560df33eabbfd3fee26b2c4a158502978bbb70885f36c7b5f226
+f3183e8f978c7cb27094a947f4063106b3807c916ff00a6b488edeaa8c51
+9d4951e81e3c04cad9dfc80e882021978231f02816771baedf04eb25724b
+901ff4d73d024f2c47684f09068e1c9137f0a2f5de2891ff1c02fd59f447
+f793536eb41bbba5fb1caf6185f6a7256b847f7c4c562b981e9d2fb06029
+8d16b7bc55ebde4ec18f48caa85a08eb0c24fc8f54922b774acd2dc50660
+9da8d87b76def4c69562c175bb77b5e2b21436692445fed298003382afb1
+1ee906908b3ea15f766ed5317360935c0cb9a83d5a25c5bdd7d4c9c89f1e
+26b129f10cd26160e8b208aaffa5aa24f8e95af40e66077a4079d347f136
+7b943541c2d89542a78dc8731c195b5086bfa5cc8741ceb0c786e28a2a79
+768be51b726626a337d07021e4e662e3d88c93763a66cbb90452b28fd046
+ce6c4ac6e125c37b20fcc9de34f9697974603387bf6c6b0b800f00bff5cd
+a260efcc62818f5866b0d917984c79e4f394e54117915eaad55b01dc6b3f
+aee7c97ca5b55ab277532fcf8caee6e09b05f400022d8e84be366c2d18f0
+045677c5ccc98eb674e92dc13f0ef7e86e64c7928a8aa20e937eecb4ca31
+04a7244220d3ba68ac70066ffbf6a63f639f6830e34aa78f73d0d6a1a88d
+aba0283f2382223c4527d447fa7997477194bbb673ab25071335384c849f
+654ab0345af53d7c96f5c2ad635a9f1704158c4a69cc9037f74f83c1588a
+321403a06e09956a4dd863a2a77399f4dd13abe0cdb7a4cace56d5526974
+291da8012c26558bfbad653f29efa176a2d9d75e067d3e62d62e46ee4eb4
+cd7596654ead0a57fe6b80294fc8f7414df81d09258ded8c4928818f7e31
+14bc99c93ee1b8a4b955d66f268556970964f462738dd33454e8ae8d397c
+28e2871c2745ddb891b2fb43c881a043902e9aa0c6e2e049b090a04d744d
+2bc3ac5673fea830691b036a3f7881a175cfb771076676081a50227f086a
+27dc149a84ceb522e16a54a3669f00a02e6ae52a0b037ee0ee4b3c9a6f8e
+4d9b1ca74efa2e29669fe3141b3d9d5e15e08d534e798241c8ceaa466796
+1261e7c7d7502f8fc6be415d18b5ff6334ca3817ba5478debb3b80cd89c3
+966b5416b8e52b062942746f0306d05d80b14de7955a0df79e88d65d02a1
+b6c36b238e44e86aad035bc8a0cd08acdf69831acb83b7d8a05db9ee80f2
+042ddcf1bf5eb388848061138bc6f08e100d1371eeee171542f649fc8f45
+a94bb8df4d0803cd51c0b2aeae6c203ee6acdaa2fd6696b46d99a564d397
+2d05a6262f16353fb549ac735537c616ffcc18141a456b4333b0d1f38aa5
+f48fdd2a10162010f35ca5af6d12d60bc67902bfe26f4bc5e7462ef42400
+df06fbadb6886cc29d45e431805cf86cda8d4a5f23c295f118790bc64ecf
+9740ea83dc22a5e257ddff33e47fb9ba559fb4c7eeff0dba8692c5ccfcb9
+4d91ecdc1ced2d4474f1c4dfb969eb75abbe27b36fa47c0797b5cced1fab
+d1589bd823737d2350d562d241bd266d3e488f2c1de700ec07eb5ffe52dc
+9a7284314e5600eb812fc948874b08118c3143efa79442196ec391591ea0
+d01ffd1fa3a51908feaad02b402830ac414c26da1a0e15190872eeb8f163
+8da716486f1914fe6353b2487548ea30fdd14fc9b7a6b25a2c949d8ab5e6
+de8d21ef0c795e5fa28a7c6fabea50aedc95b66b7074d97ec409916e4631
+726738dea0d4d66c9df0a79680caf3b351ef95d4888e104cccdb9ee97160
+ae14c96b71be94896b4d290419bc9b0301729b22237289ef54620ee5e445
+08867b50a3128b2e8a53d33a501f466ae75b3fe05d47b073f8b57afbb3f1
+4326ab29bbde4d9e8954c7f99113cf766104dbae067ba02b702da3393e9d
+7d236c92bbd5637d4863ec6545e8827cf8f094f23f5369974f1e296c14ef
+4a1742abaee9995e3dc7a8e8c469df3b392b716c3a4aaacd801d17fa0c72
+d089b9e275f8cd065bcd3bcfe6875a03ee56ac64e1fe10307dbb2522fec9
+2eb25c296cc942360b38399591519c67aad6fbe733639bda24841588b04f
+4cae97237055906a8e8b7962e1f1f89d68ebc30fcdc598a322be4e471751
+8a07efc28efc59119d5fec75fe2e7b6066627fc957c8c4265d0f497cc32b
+b5342621fd58887c5ef6ecae52b1f137bfbcf6ec422c4148113dedf2b685
+71494034cb2ae19466123c60f9d651320bf6b3556017e58d73572c0b1983
+c6a2905e4c1e97b7b7ca6bc703eeb216a0ed382f375ea69af2a34bdcb296
+d4944992d6cfc10315e33e64fb7bd76d9b2bc48b7ddd6e84071e501c9663
+f8745473f74149d05dc9a3ebe1beababd8f776066e3b50cd58bcb93ff901
+365a62a28b65c7db8f0717563ef743637206d16d8d08b3b41da45e30b4b2
+3c10287f13c03426a55cab4c20054890d74ff74e917458313910aba8fd75
+78823f6437435d324b3f22f1ba509143af39f07fc1278310df068c0c52fc
+d5d8be0b19718f0c975dbc2f3d217884d8e22b17d1fcfc8ce3305e25db8f
+3bf0da80a564d51d227fd895f6131397b93d34d88027c1b96102b22df106
+b96b82346fb0b6814b56fb00957dab25aef8cfc08f34cfedae6dab39ffbe
+1a34e35695f2b3c061f5f8ebbc2999e579867b2add78712a8c0f8d9ba80c
+d0a013bab8ce12352d66e694071d25f68a314d35d71e020f2df6e465dbf5
+c9b2ce35f68e06a3da16eeb6ed9c9f7d59e822dc87e066c18e41e2c976e3
+1cc14ad6833298fc00494c494da1335572a69806c7f302fb62b3212acd42
+32e5bd732be9733c1e8ffab05fe671cbe302599ad14972cfcad413f2ddf6
+adc786815f4b884c537619722ea3371304a902d2f0041f7159bc079a4636
+d70125b0f63429c901530dab3c99ad7f1b07132d4051ca543c578a9fc20b
+1b5fe1d5a2bde2b2665a4030d1d3deaca3b4b2484c73bfe3ff38edc1ec24
+cf7c9cbdb208da62eb0ab921d1833dec9005251181125d1b4ae35a8c7e42
+5cfc523f649c9699a916747bdf6f299ca914446943f5ff2087288ced2f0d
+e486b761f1f8cd0e05f0ec2b5011a60d0b1001a1281de32d9facb15b0064
+c1d9e29a8dd04e8d721c3c499ea8283161213e4ae2a2712ca2c1820caba7
+dafe076d94488b625c2caf76de56b7684342156758656236cba122eefce4
+009fffa5e4fb66345c1f3c574aff543ae6bd0990fe7f7b55b5d2fb9e01a5
+405b0e125ac24c5205afba4f5bf091cbd3b71a5716a55e72dfa5044decd2
+0f26e18f143f51727806c9f34a8fcb32020cd41400f7f068b332e993af72
+57ea6c49c04bdfc7ebeaa09958eac5fbcdd367eabdf5b23689d0fdba5230
+091824139d362e484baaf7cda2a50b849df3842eee52254ebe957f03d81d
+cc3ce52d999a162252cfc5a6e45fd7b72179229dec5144c304c059274048
+a0e03bfcbe449abdb7b96a8620ef9691bf75c6ad40bfd454a465713fb670
+05cae613fcfb8fc4ec29ff3c5f8b5612492329f7965e77f6295e209de448
+d2a117baf2b8b5414442c8c3d9d8c64710288aed628c0078466551888849
+7e0fb1d09b5200585f8e453af16c7ef0496be96cf5a3c0049ea7f5571c20
+d29590db168bdc2909c2c5890b876a142cba5ba3401bb9e43de8eadff7e9
+261b3acfa13a12562eea1554b112aae29c1eefbca3d500ce88622fcd7e8c
+9e1f6f18bee5c8953d53260329e5362365836ddeceef3270eb6120e2566a
+ac43935f3ac71810852e05a514b5818697363e3dfe272315899dc6fb9b75
+7623bb4f529726d0a5051be3953d1f4fd34a97e1533fbe50ef1242aa7c7a
+12c75f9ad9e25995a57ce60e683ac14327a8ede099dcbe6385c2e7f39fbf
+431dd03d20f0fe86b585fb1233cb0a05abb00d3cff450d5852bb4da032b8
+b393c04886b904ded16f80032944a55d1c3f5b74b93bc43989a31cd88cb2
+b1d41a3b97cf4bd67c366c85fdaf088fe0e7169c6027ed2c084966972b47
+bb229b1c1b97a80661dfd5ddf40495984c015fff111c286c93dce15b2ff6
+2b7b84943784d9c7eadd8acd16e6c5228a48e41c985e6a8741a59de42003
+0819e38c82795040022ff264125d5d7baeee6304ab5899e6fbb16991a3a1
+20beadd0cf5bdea470063c338012fd96e71d836621e073f47fe8cc8638b4
+8d38a55c5efb752bc53a104ae3053c12e8570e820bcada8e7fec871be81c
+aaeefa45065f1ac0a6cf00c42a50b038e67d5d7143d15ba7507d62637332
+d23c5813820115183241969cc05290d3af8b27a487a9c1f9364b69c958c1
+b1071905fee7ac1ccef5fba9d33ff266fc27cd59489b352f8634d2bb900c
+ad14f4716f26c3421d39292ea926be6000870ca5325620ad3b1d8593011f
+ebecadb881c187b73fd4b1e53d5edac00738d55e17cd40347a3bd648f799
+4a1d9f170a7887353a0ac7097ffbb8b215ffd63acb8b294d24b44cf84e92
+abee700b8334ff826c952f019f81f62d9982185d48b34dd1568909eaf031
+8c1cd0c1da64eed3993c0ae0251e1b165950d1e734564e062c35ad393fac
+58d488d6825c9e20551d211837f93b833876bc055ad0ff49405e5d960a49
+e98d3ebb097cd1b5c31253b573f0ef5287a01f91a4c34549971e37948c82
+02f2b7e5c98ada831e67ea8c0d5693da3588f72e6c961e083c98218eca46
+b37fba941deda7123bd1a0e92ca2a1dbc20d369d19350bdb4a44da25f947
+470a1a5e053c2fba22e99fa32e0e74bdd51e69882fd2a43350761951176c
+67412389d41279a1c7a4e9f995b09930dc28a1d75359e5acad9c5a703544
+ce4961c39755d94db1c74d845869b78be8bf6dc97cfd2ed0bd187290abb7
+7fa806c8aaa2fe46c17c05ebc6141adbe4efe456743ea5672cd946ac45f2
+fd74712b4f36f962db5fc54afdad2e71ec2b034b6dd69f39f0acfe5c2c18
+07e4c60856b79931975f87020151ad0c05f2c6cff5a5bb7489f8cb6e8118
+6c0ad85881a4c159943fb53990cab8914a0d096a14bff414e2e9a31648c3
+d7dac80142aadfc3295f9cdaeb84cc5ac885f475acf94e6cca268a9d23cd
+705cfb4c1a14e1069d449967f58051f3bf54d19a310afcefc1d9a3242c9f
+bcaf5d7793faefb08214fff4535f646aa7f1596378fd86136b4c08c3a863
+6a2a5ebaace6e99390201f9ded66507e76a6f031fe1c3f81b6d9f7a59ba8
+c70c964e1583ea48460ec7dee4b738b28b6f3a03614554d9ef7b9f6b7202
+36e5d449747799a242ef96fd9de4bdb7059ce3053e02c7aa9e24536bd3d2
+1aaaa5884f7064937fa48653ea39a3e6e1401fd96e97d6aa15eed15d77e5
+80679eb37f36f9bd5736a036a308cb06ee20cf32de82a3cc4dbfae50c296
+642963acd7adbe3eff9463f69f976aa47eeaba0e88258a4ffc4f0933af5c
+8b5b5ccf51a5cfd83f96defaa217f5b4450492b146a0e1bba99664b7f484
+cc1a13c5d31779ef3598ce57a7f2f98851711d3447dcf54bf98aa2851be0
+1bb5372601e5986e6c7af78ed12642418c3a126db1157355f3a9e757d9a9
+27109466de9f4cefa15be737e6fee85313e4ab2522b8590dfc9136c10353
+cef0f76faaed3bce8617438a6ebc81db83e948d85bb231cda96710ea8db3
+fd406900bcdc73a75a78cb281ce0af94e574d6135ef05bbedff72a333ef6
+7e1cd73f1655e4c445919d87baab3cc1805691e80c3a16546d9b78357a60
+d516a53c084fa1b044c7b98e5a749e609e565b38231e6082d82e0f503936
+1afa972be4edd7eb44fff1b2c2e62e43d4e9b867a753cf9437b540f81905
+c0700f33c390fb06cea8a5b5cf8ea3a059e70dc1ffcd5b984beb34522ffb
+6b8e139d3c65aeaf10ee4510687f6f444b2eeefa7a9230eda603b20d5ab0
+9bd4ed89c94cfd636a40e19fef5f9cffc021e328753a4d94657f26041266
+e57b2f616e3ba924edd21ab5e0c112d50094df4953740857ffb9a528d92e
+a2a82c128394a6ceeed3b0eefae0d56ba1257cf423cee9f5b6e44a31d92e
+d17cca0ae2f59680dcc6ffe5402d4224de2c46731e9b431246e8caa84678
+cb8f88154805eb8afa1d643688056535471ffbe69021f8c14640705ff8a3
+ace43c6b8e6cd7a392d4dd587ed63b0d7556a509b1a04b057e2b64388b7d
+b8883fd1fea4957bf1efae7eaf60b6cc51915d8469f4413900dd810adc6f
+5454e7b23aca799d17f86fc6a940d72203099344101275c016e64ffcbdcb
+0fc05207fee7dd3efcf8e229a91d1ebf848e35ea739756100730e52f1bc1
+08e4132ea49e67d72e5611c57fbef7016ea1e54778cbf78994355b8ce81a
+cd4c73e242b7d1a047929dfbe50a005de1941b4da749a3ae9240610e1a22
+10fe35231fee309ad0dfb0c3fb7f37fc7388b10b9e0f94ebef8c1b371a3b
+ae1ad137928431d7cfa80df52db47e3287e4490df35effe46b9953beea19
+e3f96058a7c9adb2f10b36ef37d68c77d8e8bf4381500acdab38c78b3bd2
+5cd1a24faa406c599970447c8286ae0ec57916948e609287aa930ae24453
+da1a159a797eefaa166ed9a7240b66247833a3518f3f95420a0b3d09116e
+4c3b98e4efd8605ac502e4f905e575237153264b84511ffbe4072869737c
+738fe243e487ef6e22f74116eebf09aa2aaf63ff491a3a31d72dd908599c
+e9752a45671f74821e5acbb29aa871c0ea78a0c52a19d7280276156586ed
+59b61b715b7bba3195df8d0fe404d35a27d4a024eac9a7dbdbe3e2f60492
+17f5eb6c513aa42badbeb632f61375b2f51bc2cdb6902973b33e41b1924b
+2ebc1bb21ad24989d572b72c4a8c094f66b26a2f3c515782a285cab173a5
+901cf8a7c520c352e66006cb9ddd4f513886ad9041f5eca06edc316c378d
+8cd37ebee64c4af3e0093361e4e1b490c14eab48282d06e443729399c0c3
+e82423cae476393d203448a3a66567068a6b9f7a59d950113a39684f7472
+d5633aaf0d1eae46cbbb4452e35d5bd9ff31671b7ad333834aa66201d008
+0397f60831c62a157b54db32f2bd616a9d06a64bec27449e46b5a0a7de1c
+5753a48b1d78f7f3a08afe638519c9f9e35143c19664d07f879e305b3add
+34a1784cce04ce12f1d207e8a6e6dc2e96e15bb4847b0c1fb126560912c4
+510c2bac1b97b453b63b2ef06c4013ab3a036c83367535699d38523fa142
+5fa884b9c4496d310381018ad155ae8a9776a60860a1a142aa6a08fcb298
+f41d9c09e80639f17322299de0afbb66008e3de68b870b14db13585c93af
+a7a7453f103d934f3d97f26d1219203084161d3b5f0cd476b94734f24775
+5c1c537b3dcd97377bdf36b011070c185566890a4d94a5c2dac0f7a8b303
+a63a20a9c69bae5be9ef175e32d71ab9ea3b84a70b5aca09164e8ad904d8
+56537b464d84e0fda12bc3d704bc175ce278d5864dcf6f70ee0dd7a01eea
+5fb5500c4c8e70cb536c3fd74303b9036804360f08d511382e9c24c607b7
+721f2d10b5b2da52d05c3e3197b20ca67335278312aff8a78a984d539cc1
+ad1283d79e1a26fd94272527acf786ddd470b839e725c8964f156a47bfa7
+8f39f09b8e66a27d68cf1813b87c4a53f68ede700f465fecbf1dcb4671e6
+8882d65917f6c5eb5d6872d20674a7afe1809ade875f1ca99e7e946b7ffa
+cf55ba919901be74bcb76701ddb805e79f74fd9ab948e1743ce4b1928534
+dea3085d5cd3b810370b1c10bdcd6422133bfa5970599f7d6f0d345057d1
+1dd969a1caf29b540c509a7235b241fd54d180a126a22260bce48c6bc13a
+5a2628643648c3de80db360c3cda13f242cb7d951cb125cf15e25a811b00
+fd462ce46256d79b0f76c3e17b136ff34c0396ebef6794c2cb8b5c8f77e9
+1ec0d38110d871d2d3016982c7569e979b65e272ff63c5fcecb615cc1e51
+8c4f1ad4bd3c5c111d78bfecde89e7cf39e3fd9e1e96da91ce67d84d0f21
+f07a4633229ef928fb3a1e0057672ec81488873471cba85db82622b66b7f
+552ca4d5a8eaca181dcaeb1688075614260da43275b5ff9d3b1b857ff112
+ac1e4e23ce7cd023de78fc86658b970337be6f76d8f9b8cc004cab5ef459
+e45dc097c6ac28ffd024416348dcaf2465dc78737cd96ae9320fdd66204b
+b3ef22a7c03b893deb1319fee64ccbca911274dc067d81765212d93c4a19
+b3556985bb8ca78ed6242a741c7b989b9b9758a14db667993d1bb771a96e
+fcd8e11212e42238294b953acf9afbd043425107fe3be48f9dbe42fa4f56
+181b57c0f5775d21587ba02802abb04983e3a9505c90292488b5b67b20c1
+2f929046209df6e1ebc7c75d9d1ec0099f24c087c6ddd9d75e492618c137
+53ac1e0cf7f891eebbd132757ea250bbf083654ed84ead7d61c0d39d3836
+f6c61a19af3d3defef09075dd33902db9d1373ae1ba9736bbd2fd0f03fbb
+cfd56979ec616dffbbc9dd3be31d1966739e4734fd9687b0dd8dfe28c460
+69c2c49407fb1a97b77784b859d5458cd73b999e886c22dec444a1bb6f25
+23ec42de9809b6b3bb667a7f152e0acfcde4dfed0618f62b3056980c7026
+2021a18e0370be209adc1b535ed034181962c3aae8f3b0594379f329862c
+0b7fcd8a084fd92b09cb5ca092fcd31f1c79de205da08f09a2025cb60cc5
+c1ab1626beada762cb617cea852ab8009ee428be58e465761c8fba889282
+4328c5e6b4437d9e0171a4e64934a711af10e6999a0dd4013beaa89ec00e
+2b93549b602b99e78bac467f23b6c360c2a912c19cd0b05ba37dee185f04
+f35aa98cd0cafce7f04df9c9fd8e7ed397f67bdd09a5a10ad1fe78b5817e
+981470fc8006f3a8a25fe3ed3034a833d31d56df7af22247d18c4c62fd12
+3e18c958fed1f4af293fab1ccc17f80888e7702807254de89a71e0d75c98
+4b58c7fc2e405f48f339bc1b552d5efcde68ffe3390c0defc17cea9e075f
+8eceb401f8e0025a2e6aefca5b2a16c1d84df8aa9e95ec0bb1e6ea672fd1
+84cfad89a779df6430d775a30b6c1877480b23d14bc3fe1153896a11104a
+aaac146e386482b05baa5e200c206941fc9911115e3e9bc274f585a35c0e
+97c6836c21d7cef4ddbbdafa455c25f4bba41e11c925f9d4fe94078cce89
+0a7585f58ecb1ae850a1b2da8644987286a3e7495d7b4978e57e5e2741f9
+77e0caf22030b67c2f8ad794e12511eb1915b9553bdc26a6cdf0e35b1968
+cb80e8db6d2a2e97db63f4795357020c2bc3ca1837ab1e1c2fb3380fe0b0
+537dfba3945358dae2905772691786c3e3f475b5072b0e6413c8ad2d4cea
+006b630568961212fe907830c6a91f7718ff86febc0adbe1d3d8242145d7
+092a7e204ae34cc528bcc7b67baa6d4c1917c5bd39eee47fcc073aabcb93
+27c63bbb4017fba149837278895d06fa12d0085c19fd2164015fb6e7822a
+8994309a6afd9156b7d8a6a2239a2084c0a05b05d8bdf91171b9c840018f
+b23d0d28f5360a0bcca1e94e3c3a9de7451b033114ae73fe06d73891ed40
+65aa13581a464ebc84bee4bd0d081b8ba8546ddbb709735f23205b31f106
+0a1307d0de1bf1f8ca9c2c1dc5cbc7232c7627b48c37b1f5204b1179a934
+373a588f48dd1b50f9732855ebf0cbe96810b284009fc82860523c54f105
+063f6a73defce9f17c2c9d3379d77389666db5cd9e691714ba7b2f24c539
+02016e49e99c7849e89591ebf2902ef5cad9350d3f18ac7fd5eac076916b
+cc731d5a71704565881c0b68200e5614b1054e248eb894027bdc3c57a3a2
+0337b7e895e3e8f2e974ea33a01880cfa9858b0d2820092865fab5caff15
+79b62236f13276a02f458c35aabcaade56f1b2c7ab5a348e5545034d5431
+ec4d2a7a5a661cba46673971db0c769f7fb5144c7ab0c9ef1ea66e4a1f40
+a0e7842ca6b2bec0a17c9bce50c5deed9dd7bb2cf5c508d4646672d17c83
+0a0a83d613e0987bd7fc4100182e846ab45f7b175d0d35c635dafeb268bb
+cff34b020768b49d350e7a3e05000a8c1908c8fd8c5aaec284e41854a0fc
+72dc0c7f4133e16366be75afdecb7cbc2f47c0b8fa622c6a06d1c958c083
+2591f9c50a750364bc045e0062382d6263628620a9ca5a3a39cb97ab9450
+d9e839e57d327c65d8995242db5da370aa38a718704d91376ecda02a88fd
+cd663856666d6210714bc6489070a161eea4c3fd56f912515ea04ff6fa86
+41f735643ac42023596595f4864270314fe25cf928f58db399bc8b1f8949
+05d44901083204efa84ca557cb069398bfd15387028cfa5c2265849b5091
+997ed75d92870c347308cc5fe6fc13502d805bf21c3529b9a788410d5799
+81fdbc3929ae808ec0aede49afcc34cdfcb2826e20ae8e5d55253a5112a2
+838aaad0342a28b2fe40958af964dcc6682279ce5f5a971244ac8d9965bb
+30f0b4d1af25afadc7a3be40c168eb738c35a0795d37c62009d7a2592724
+7adc065dfcb416d1dffad3b54071e5958e13df684c48a5cee90eb7e0f166
+f688a3214e6bda46f06ffb0cab609de2309850d4a0ce12c9733439ba1187
+9d0e051ed8fa8962180f4cd6b38626a6065a8425ca360180d368f9734b21
+c0ffc9e8155f92d75382d096e894260c749d460466c2f866c335e23bf442
+4ad9875ef61ab14275fbc7dedec3d06bb3ba03581c8c330cfc30dbbd1e9d
+c92401a291f0c5eb5b4028aad99e5617f726531a422559db24ddf0bccc99
+f081dce48bbb731d91e06d2237c495ebd5b477afc744a8f17ba775630a2e
+90176e4e5e1c3f60b87112187f12e13d7880671aca68a24bf979fd4c790f
+09e477592571a105260eb97f062eb60273372c1bab4c4c6791bf9a45e1df
+d1e728cc5ca3ebba3b4fb96f8af68710b099ac2b5b0474634ea258d1b11b
+4b13be12fec7c5c193cd90be653063222469f13e2a4c77743b9fb0083d76
+64007c18ac981a7d9950dd97a3ceee037cdcc01e231a913de0a3ecddb871
+f20b4962e5847f87e3b41b52000d20d0031affad94d2aca4df047f3ba245
+5baf141cb493df6cca147fa3932d06a68f60598584dd4437fa16c32e9821
+082eb7fb11c5fb8cc0db33dbce8910bb26a7fe3deb515b06dffa37b12c91
+526eec637375ce1cd945046fa8793d2b7fea09aa573076e0de6a4ae83c0f
+1b7cde73a7f357b6acc6e41747f977637c5422f37926a2e26d646c1a7084
+ca157e28a75511a91de9f12d9df50950a22d3136c64f1e76db3134862738
+7e490000b8d76e688d18ca2b69c11da8a24866070d8b37e95a3eab084e11
+73570a54e21bb68f5b511c520e8211328355b96eec2c5e46f3281b415b6b
+d47d72e1d675231e2710599df129b3a4b859d77ae0be5a6750a73bef64e7
+4d4e09475d4067b26f4f77a72c00a9382826e1b5cde6f494809df9806ff8
+52efe0e7671fe9148afeaa63e1aa416c5998fde86fbb076a699e6062f1b0
+a7bb8a40b9c7470ee9d346736ce2536e8409be8845754e06bcb834a4a992
+5376e228f1e6b2ac37917379331a0af60a28771480fdbb3919a08a21ba58
+71d0ddc3aabdb186a80100eec21b2f847bdd24e75fefd5cfffbba60128e3
+541a77fc2ae46e0679e7d9f9a01f24b60bbc360ceb7c7d40f2dee7b98671
+09777f4d10668b5ceb2765dadb659bdab3f650e5c54009e40b66ecc1d46b
+4832afd2c75a79e11bd0d99ed7f9b38ede3b15c4a0fe86230870a5a1c762
+38f774cafdca5a6f89c42030333d486f68e85048a8d47aed82cbc8d42ac8
+e00915d1d99276d0de9f14965be6b50f325366b20f83f68d202286a62b89
+f4d866fd95b65b3228222aca3a61dc208f6aad2dca550adc0f6006d40f5f
+d352dce5bc7d50614794a9fdf62314e67afb3091d52b65ae0b6c49bcf86f
+3df5ed5912ab1212e706bf1964c6d8f56c608cccaa3b615a1b442fc95a18
+0d612791e4731c379fa09b30d01d72f167019e064b54c6967aaa73f91a3d
+d6ca39c3c256867dd8510bec55ae1bf70100bc4da31013724b35d8eafd91
+0c36b4cce0a23ae88f00c18fffc5f0b42af04d7f1f3395adedbf2f1167a6
+4ee33d311f0e7ba0bdb299c9e84db08c3aaa943c4155644987a9caa931e6
+429cbdb7c2181633fd60abfb0a0162aa9a3cf7902dabe7a15c21c6d5c0a7
+98933af01ce1e8586dc495d31894777a521c4df671837863df800f3eda6d
+ff691fd84dac4b4455250e80236a158c7f12a2611fb6643dfd2874f45740
+0950e899bdf61efc6b92223b1767f4726c0d1fc48188ad41880f3564dece
+3a71d318d2b728783360165494041af38d7a08b956e5ccdb4e0ceab31f67
+5ecc37c6e80cc69ea564f683e6ca41421bbabbaced13f9c4edb0bc7a7bea
+de9cf086f052d0efc6b510cc29a079d3137dc085757b89beae29ca372eed
+d334ab9eadfe9adcf40209ea9b7106aaeccc4f7c5064e9b1ef03a161dec0
+49ab0494966f312ff65c11582d2b213310eeaa04493bf663aef625d0a346
+017e734bac4d75056405e5b56bba89c9847d5bc32fe80bbe21905d9b037c
+fe1b007bd40db660a353b9887aa94fb50741d0dcbf4737429a362561b149
+cb4c4656884289f08bcc11a95d99d8746682ce0830d6a7ef0a0fa5d4f33f
+3c3f1cc13e0d3ddd44867d87f1b43a9add96ef2cc5b566fcedfff9933bb7
+522e5465aa5b83fdfaa36dacd17365d90183bee8367657d215b08fa01cc4
+cd75c1a328d321646a553d8bcac20e143ef018a788235193c0adf7908d05
+13a2e71c3dde6399b554970b44c9d085ca14db424afab61f33b6d1db2f19
+dabec03a92bdcae9bcd67d218498c43bd7cc75145ca4f88c49f55c0c00ba
+3d6fe75838dca4883eff7fcd39dbdba3488eb97e25dd449c8b3312863d07
+1cb2d0d77895733edafe6e0fec1534cdd1a21a991cf59291a9eb10d887e8
+a30a69c993305cdd2a6e953e9ecc992ff88617e9d374314958c2918cba34
+868099c16946d2ea1ff14697622f2f100bb680576df96dde0c1f2e4e33ac
+02d7ee2ae5a05d77f11683d271f2bb33432559aeb4b2fa18a6152076ad1b
+f415727bffc8962b58bb3d21e5916c85aea872e287d89a54c9f22cb3d3d5
+3fe094d881e9d972a5930976504f97fc7f496b29d3c6c7e74b840bc8da01
+c87a354a7ec46157816098ebf348b1dc4dee64c45bac4869f7b0bd77e9bf
+2b299f8c272ae57f5f8bf458e576a9efbd2f46cbfaa98e643f01ef4f7526
+34d8cdd724fb8d390bc9b66848157629134488ebaece3a60181d54d430e9
+bd2a98c52bf5b71c6c6097fc33420ccd7ba08a1ab1961cf04773bc3b0027
+465c6fb99c4fdc742d886acf122df963f92fb0e58538d1eae7c001532533
+17a92fdc63ec6c942c82457048dcfdd96c5dd71e54c892817892adec3098
+512b7f8d1ad020993b61018d32de244079425962d2a3f9a20d540e160407
+bc9ca63f6dc15ad408f2f20b0ca3762e6c5940100c3b23bcbcdcb13ed331
+8c7d43d4bf1f38c647592a3bbc4d5c2934fedc7d7d7022fb16274a5aba94
+b1ffcea6b94d390e97093db09bf4e8e3e5f0090326e92c20b6393cee7e5b
+1f52e50e82c532aa06d84789d3e1a30d4fbd4c23f96c76fa905020f30d4e
+b3fb8775ff97018d63be0afd799a888d0639c8c16a9bd808db1944fb76db
+0f7a15a3893a88209d9a291aa0d3dbd62520430fca052f45cded9adb03ce
+8590c7ba82739c46d92055809781c113cdf71cb395c2b5eefb807e52c621
+8f7e0c5f1ca5557a16bb7242af53ef182cdf9c5bc3962a86097482078c31
+93a854581c6473ea738086490e14ed5fa358daea43386991cd38ebad878f
+ab7713f0e31835681c26995375f2bbffe6e3aed7051f53c47bb1ee0fa258
+e1c4366764c1e460eb1d2fecddc58be23067122483e35b89ab583559ad58
+6048d401eb979ac134a90675496f1153f7e116c0b468db98fffe0581f939
+773d8830d2a7ff8a5e0d1e2ce0195b941ac983461bed5dfc6c141e1f814d
+244d40b512fbef72af2d0d6a0d52cab9e5da42f6714fd600a39bb007006b
+8567a0db724a576f3775ed2b8528117113adbfb2a76417c1b5d1f2213383
+fb4ca75fe49fdb060ecd2a2628aa798a76556daa082b419d31a19a5e70fc
+c68c824e00caeced378ebee62d0af03811ded8632f5f2745efb1f9d24768
+c69ade96e055bcfcc5d96752d96c0748ef653f8be91004ca14fe3561bbe5
+7d2135c2410e9f6c83bd0eeae2f071f28853b5d9fbb5fdd91bf0505c7a59
+1965f555270fbb48e90524575fd2cf50e325239bf9c184f9843a1008621f
+6f6f20cc8960c500ae600d3e2ba36da9c91ae2fd1a9efb1e55749c5920c2
+d13ffa390cbf4fe1e8bbddbc329bf30b1766c50fe0f714f8e21e562dd92a
+ae644774e04418b9698bfa1e7d74b60573862b0076016884da86dab655fe
+55b27db183f01b8a946c451b1cfa848a423c7e5e63cc0d0816e2d26b92a5
+0638dbe0d9eb68d1eb6049972ca0eb816de5d908a85420679cd87a539d7f
+81d3c5d865ee619f7cab188e84b3e281e374297d20b48f9c05b67364fd23
+12bc769289734c49a245d635d3246e91ccd1bf050c31e71bdeafca463552
+bab58b33f716fb8c484db217ae9cc1b7c57f9138cfbaf39c62cb4723cd4a
+85222610c639d5700eff6d0e07166a4cf27a749166580e5926c2496876bf
+9b0cfac6a6069ad45b0ae75c47150492b49625f4a862c12d7de81deafce6
+f8f869fd7bbcadcd60afaf00730ddad0b40c01b6590055aedece7f72d329
+db9585459b94ed3429cf1daa3e7bd4db54f9c9d69d7e0685b8e96589c9ff
+7f259a5d1b08a36cf7a57988b0b22a80547fc2a7f5d7a2fecb873195914a
+c7781d14b39b38a7e5bd1eb3e36db08cddf9f3d0d7d52cbc134af253d4fd
+640f0faa0668815975d36bae8ae6dcde20505e48df3505b02bf4159f1264
+d47f2f073cc9c4e15541f06385ed4889376f8ca26b2836b8831efa962f47
+02ce6fc0d13b1641c3b2b2a09692ebec091e2b8da489f9eda0e9e83b670e
+a70a63916b5934cfac9221aeda0a17d1d6e5ad459d29beb8c04c45c00561
+6a8a1a1755de39425c7999d04ed7b37fc6b8380a5a010809c909d22a6646
+8901953068c7ef52432782ff285d1263c18b04adaa0b0dbfcd938a35cacc
+3fd5110e7c18c76caf0bcb3f1c49f3eeb024e55e754223ba9501c287b367
+d037b5469c0f5eeaa9ebef41df5f736d0d352d07e285abfa1efe9df11925
+6252e5274bf361130efd2b3258bc01fbbf8ef89bce0412fa41e7308e146a
+30e1b0abc45615548c2b2b3512c8f505e24d937ff07d3379a72993b570c4
+4e156f98a84394eb3ea15808cbc77fe69276fd7f6a8c7e9589f1e9dd0f7d
+80ca2c06b8a654bdccac7517dd5acef2cc0ff887b7b6236ca8e5eba068e7
+fde83d763653985795891fd898197225fc94ab77defec4876af0576f6040
+0928dbe79403ce4aee10fa051139699a0067f19901bf6ecc5a8d732c8e87
+f27457639bca63abc0f7319dbdd66f1340d459ff5855de0967c6ee42b3aa
+e4746f377edd74d7480d7c56f5a275609cad8a335a309814a071e9948d1d
+e3cc9fbafd0268560e7e12379c956d165f618db68cbf1db33b6ec3483050
+1bf6e537e00118fc84cf6302098c9fc1841bb076f471bf80770d72898924
+21df74c93f8b765bc0261a186cf9bc561109e7674c9d6b8cb0f6bb29e0ad
+da7cda78cbcb86a4a858560df143a533c420241272346330d366d7aac8a8
+678204bfdfd15e49b46a703f2bce4affeafb26b2f76e2b21d34a5d71948f
+71c5d78c776483bb09341f800bbe786065fff786afc450aed3a2abc1e3f2
+5d2577271a12f2c5f5bc852662a19655bbc2ebeb24c6dccf28978fc52913
+dce655cb21576373bf33c740b324d8dfa745ac044f094ae7a14ec1b3e6cd
+08e03841833852f0779dc37a8e1617c21bfb7a824728db74d5023f839e50
+cd44126da917e643050c2f60fac3b411b857329c601548b493e202b77c14
+f4cb6ab08ba2aa727ebfd5bb40b66eec12f43c2759606f5ef2eba9010942
+d3d2b532ee0ddaff8269adeb75a12b00830918d30e4ebfa1a6aebb0dcdf7
+edfd3679ecfc6b283f11c30c98acc79a2ae311f016964b045ccb4c66c6c4
+34849aea17b02735481756437fe92abd575887506c7e4522dc6f7a6961e8
+24000bb68e8c7871ac1b704dffad8e04df8e814e93d0eb7503c1315dfa00
+f8b9341f478ac907d475ef650ae80587780f71e7f65550755b8e0a2963dc
+c86eb72f22ee87c16bcfc2ccfd0da6d811f52ad064c4ddd7aa375a2cd474
+df5e8bffb02df24c3c16998bd8294dbef8ad0dce209a7464eb7acd40d0d9
+a4678d159b9b1937d82c5cfb9029009c56e429e1e3d23f1522e91cd1f276
+025d75195883c43537b3fef47a841b672d49f63140c14a7cc1318768b76c
+a9850f49aa7ac9da33679f43986bc69e2c9610a6fddd044ff00240bc09a6
+e25681eba705e55621d33d04d1a041a639a577d584e60110720cb96af250
+c076dcc38197adaceea7eb0e0175788f5b71347c79277f3cda414683ce26
+4b7b64dc3af7d710d8790ccf0a61a9fe4bcfad32eefea3372fd924ae3be5
+ba738eea455df3912db0c2f3cbd6f2cf2b39365cbd5dcea69e79a7953a22
+698bc3a20bf6627bfcd0bd53fe1233b1dc428874fe84cfbebfb2ac04b1c4
+546edf0cd51ee85197841ec4e55830d03db9fcdbd97f63b44a95407399ed
+f69e0c14634ffb3cab9630e22a7665fcec4e493b7ae4d7769e71df76602c
+8daab61ca2f03a8376be6103a81448c3fb266f7cfeb8a6b1f6f7632484ed
+8603b99562942d09644bd9eb3890b5c0d62cd7797501a702f6a12daa54e2
+0300519a40c248f6c12d6cccaf8173f5bd985673b6884d7a1a41486be38f
+9229b6f930d8b98f892f457bd008a5bc354d9e2c5acb748381bca0ed2a1e
+0891f492c489bbb365938c80ce8eb82de271d351efefd394a791d9ab22e2
+7bef611803b087e84e12849808579369b9f0ec1c08cd1ea72eebc288f0b3
+cccaa240e430387ecee0e567ba431074223226ca222d8324dc706aa51aa2
+79fecc280429cd243cf56822a720fbb88a92d5d6f37363ab2edc5bc053ab
+ceb752a2ca80b78a9518059de8b1624ab90ccabb63a89422ab4f78ee3b94
+1d49e1caea3fa59f4b2e925d5d92d331d96412e133306980878c3614cb9c
+d99d644b4772a0470d2e1cfd7975e37179035ca5bc64d2d2a148e2d8f5d2
+c4a894ffcae6725d88552470cd3393f79c8b31aaf46b1790152aeb1865a9
+25af135b30f0ab01ab72534d0137e831e65787367301cb478d62f623c763
+7882a729eda0241b553cf31e51623af66a841482485c3a1287342da71916
+060a46e37e37a30dc99f3f524ae3cbe3dd075c8c38d187695c5e559bfbb7
+b7d94fac98f7ab7d94d615a8a22d6842dd09f995454666724a15efea104d
+f85626e9e6db009ce1805be05a29bdf063cb4cbd9f27f05a6f3d03353147
+e86f05390629a04c88bef21d2892b4b68cde132e631be2076e5867430f87
+8c57d3eedab592ffbf1f8c12dd7a6022d9a286469e6b6a181a58822d9587
+c457941da28c466ad86bbd7e9fbf2c6539f1cc5bb4a16ef65bbb0db5237a
+0f28925532d5fd394ea9267babd451ce56ad4d983172060237898a504ba4
+7cc4f3c43c2f6bab090534505c9a6c4609c19657177f9720de4529883dca
+9fd8c8cc0b217f1a8fe6c11b4d9782974f1872a6131ad0efbf5be03977bb
+625ca5c83fb60284aa6f4c31e50417ee21e3dda2a69ff6984925654198be
+41fc4c9fd11d635e1e3fe367191877b593440078c200abc78cfe822a78f2
+c6127f70caed225150ed8a185a7d2b247a18dfd63967af0420f9df2e7905
+0681c00b95493b97b5353ff0db28169af7e2270fa28dc208314652d59207
+168de1aa523e9f50abb42e68fe7399ac4f1839b43e41429e337947851391
+7d43463e623fb2502bc3d477e525d0c6e8aa5dedaff575337c0e499b7d12
+3edcf05ed0f494ede88769f188f8a4134f53cfc850362d9017dfb0f2a611
+e22ce4f18ff6d78559ca0092e7756320ed34fa849a56163a4236ba8940da
+6f9fde0eb3e2e71eebfa8d37ec8dac8b0cf6ea21a97ab3b30934ba8ac209
+9ec89085e15f42b6196dcedb9b775a066062346da41692b9d7e69d794215
+6e0f55241ff6f4f653caa58d29acd106c0b2863a2ae8c71366b929475713
+6d45234b208fb30c1c453e05e68c9a35712986c0eb5161592667dcf85fac
+37be40e947238a08f48cd294f453cc94a9417c9f211680074aa91bdb32fd
+bc0ad75251944001c0e3779fb03fa474f69743de8d160747e1bab93fbb23
+e75fb3bf3cd85e48cbaa2090c5398a4dbe174b9d98bd6cc056b067eee625
+44ef416db590d244728c488581710e3cf9c8874502f581884bd1d839d111
+5f1f77028d98977d83971ff0d2f242f74c108c5c4e98dfd28bcf4262afb5
+739ff804d54cbd8a0bf7d65bcc312c28bd5af696b97eb4f5b39ace5c742f
+342681f98f8bab16c959d6a16ef5368bd711c201a895f0971b26baf6ff7a
+9c635134983a54d2b49f5bced91010996994909648564344479e11e7589a
+603206110b90a3e6eb8eb089f3ce49b911b316be83209d7b6aa903d931a1
+12d42421c99a8ab0192325723019e31250cb5f130959b26687cd3ab0751c
+9ad02e20cd96820fd36e8dd97f9b3fa2f21d9436b62074e2e3a09ed74ba6
+847868b768482b44ddc6eb79add9655be334197532f3d978b94e667e51ff
+c5b6521e0ef83706b20147f5edf54549e5a505cc22917a613cf7617ed104
+c26c225ffc39ef7e30cafe37aab34ccf71a1c610a288d5038e481bead3d7
+364c646e4158659ace5f448dae82c18cb13ef42762c8269a107bccbdc8da
+44d4e3265e8b62aae6d70a4c14e8564adfed450fb7ae9057d661724a5aaf
+0eb818791004eecae762d4281231a91b3733efd99f35c2b222d1417ab81d
+fd64568840022c6be13632bf8a3eabd754d0d7979d70488b44b32abcb6d9
+e9ec65e227ea3b8391b66346f4d428c4fabe9927485f8891f677acdd7d8a
+4f58763af0f9ca3343d608ec13ee639ddb18a1f09f3038f65afbbc2f5eb1
+7c26befd7e57118952857acfeea1a8d65880778aefa626e4acda8232ee9b
+b8085ceec2f845be9ea4b0c1715a04ec166ddeff6108b2f30d05a38120e5
+91a650a942ffa49fe8cf7cf6572652be94953556d3bc1344779efc1b9f9c
+66278d614747d16bdc069ecab758c341a13e10a63556edf13a562ab27af5
+bc57242af4e708af899a0ae345e8251557eda3f15558f7f4aad4626edeb5
+e1e7f16160bd8940f02448a462b1e0648613388a9d3b6c0f2965e2b34e2b
+0bfead1df63667ebae172d58487b3c2ae07403ecc022f3317570e85e0a96
+053b32957fb6bef1f91bb6bf283f626954e712cea564110ce9a4c88edb28
+d87a8c32ade55a79bbe68cf93501110f59a020c02b0359f50a4aed99df4a
+069daba42eec26b132a2fcb2964dc73a5f0f123041b38ca854112a03a3cb
+a297a6fa4b045d658d291264495b6d1eacd8c683b5a44193747831182518
+27305c1a74945d3dd8eaa5943a74b7825c2030e3a8233a40046dd9446633
+52d6af102f737878091714621795368327c2d35d8907695acca5206862a1
+7804e1cf7fbd1fae40071d43e6e2cf101eccdf81f25ec91cb057321b8204
+60706a4f990f5d0a5e40fa2c3a07bee8af0100bdcf4298e8cfdf68932838
+6c525f06c125a4998a015db3a4cb96825015f4569183bf2e9d2745951de6
+c53ef9f1fd193781bad0897f1a5ea004510e815a90c6c957ec7577fd2652
+df67ce4efb3f8c30304d356509cc01fead119448b5983413a3c398e1fa98
+beba5e97dd9c7bc4ca825d8771cd1b8b8206892aee39cf9fca7511e301e2
+fd61754e2c36b3b9801cb123623b16c00dc15510a2c16c7dfb39d271acf3
+7f9b4d3709169c4e460b5752a2663e3b24fd6d6e23097ad38917b36993cd
+d5f1543ddd39167f72ab544823e02c0282f34876f4498b12a07ccfd9cc15
+4c96c4fbee226906f45de971027be08f78ab0b93b530db1f374a85b3ab16
+b123add1ce4ff1f39bbb5b1b80668afba767f2aa947073af88be267a21e7
+2c6d8d62585fbb7cfca3238639a017c3eb9e8335061f9f53cf7af75442e7
+2f8df88fbe8c06465cf9469692a57711e1d8a6d4b2b8bdd56957175888cf
+f2b56c2c7b1f4ed085864e8031f8bc7bfe708af06d7920da144678731584
+9e315c01b363be9f4841d255cb9c978c5dbe53b63b9c133bd41d9fe9b5ce
+fe685662bbaafce39c13c26136b0d19b8579d8e2be61f1e158851476e431
+63c31ef71dbef1b7de4696346d4be168944b1148fcf3220eeeb1b3a1b845
+fc5f4c55ea17b6644c277637f834766fcaf68f1f173c8784ae648624744f
+a07837e686fbf9b9845fa0d66a082cf8afd89e7b2393f8e2c299b656b09e
+3b960c369557f0b7736000603f4f9aafef291f7100cc1378216f808b06f8
+4f1797ed54bafb693d82a8133ade22edd3e06f7aa5f624f7823aa46cee9a
+59d48e84c53062b6f54744063847fbd79dad395ca365c635a5c93cdc9a56
+02a1e8d07a2734a5bb83b47f9642e918d6f848556e0c176b22142b2930c1
+c4753fe6377ad3967d9cdd718fd80eafbd6d4e51d4a641752fbce144f802
+bf5a89096128b725f577da8937e439404119ace13f3622be5e8f019acf3e
+15fffd271b9ba0f510e92e04f2638cd8c01ce389077ffcce1f23647eac11
+5095e56d625fa670cc1ccd42b9d785536793ad84d2772eab0be639d0c1d8
+3e12eeceba5ba8d2927e1e35a3eeee5c196ba9ebf69b72b2fddaa907032e
+4a77e4dad4b44e357d733819597de78b2eb52ffdd8f520791c67469c1fb5
+32f11f6cfbcc5605a40ca49553160b720189c1840c0f647795881496a4fb
+ba5fb1399577af150d7a2381db41d11f3de795a2239494cb434a97430eca
+e9600d8b3e23d1990c5fd55f2aedef7ed633bb3d3745f40f06d059dc5fae
+57d7d99c4be5da150d995f86c7ed928088fbe8ae45807531e9fea6c812c3
+66bfe43cd3858f8d479491c3d3c1c0efe22a1d7f5b7178b085f33c1bddcf
+7359a253dbac7f208bdbe359adc47dda6456e9e9e6da4193eeedcea7e1bf
+72a371dae857540032d2f8e8f5a16f647c07636e2c7a618933e95c609248
+7f3ed15f78c6cc25162513f3731fd125becc806a92c133036ae711b9bf62
+6ac52263c94150c9ea75cb77145fef1b2e01cc4f4fca08573e8f5a31718c
+e8277c4d685daa390eec5ec461e32e401188c14d7ad2909a70823b314730
+45549ee65c1142331880fdcd0a8fd511889b05692de6f932a1f700213a08
+d6f1b06abb6410d3ba1305cfbe9fb86fc47d82c092a927f07e7a4b163519
+f7dd9c4fd0658a442b318ddd44a79f0ff4e19f96c9df9c98d8b350978554
+97a0363e5aef9bdab0712547bfa8654749603332a4f18015c9ac8067a4fa
+66ca1d81cefe7bacb899e70529b785b2d03e565f7475484827476c1eb1c8
+add1648c3e41fd21e4fae0546aaba41ad528bed418f684c320971ff24218
+a0acb587b1531ad505ee5922bb7823140d70f54ec065419e7661b520484f
+14f737675b9e90135d872671ad819d63c2e3c22902c1640880877e04340e
+15ecf930069dacd15558a3de1be8ab83ceee18ea8cbe4d00129ff7e3d829
+59c4d25232afdfc5c56ffa2e0a9edab1b83b4edaaabaab1806c3aa90a955
+fc9596ab5ec9dc8e48b20729f9821855abdb3f7c0d533b690ba211be869b
+0d714478f6ac0124258f3b654b84ebd4453afa8164d0b1b3ec21b2b462f9
+b501cb7f8443070cec740f05fbf784ba236d851c9cb24819a7ec19fde67e
+35df0625f2212cddef4fe01c2b9f195346cdef6b7e7eebf1385ab3988a15
+7e6476b97c93e08471d5dd2cad24d028d40e5875e688911213f5ece58537
+9f2939cea04f8cf727acb15c186cdecc5c10794a92c9bfcdf47e85db06fd
+acf631f8f5980bacddac0eca5cdcbd3efc773e62af1d970c0134ba7374a9
+ef32aa06ad7955ea4638
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
diff --git a/fonts/utilities/ps2pk/tests/Symbol.pfb b/fonts/utilities/ps2pk/tests/Symbol.pfb
new file mode 100644
index 0000000000..ff00dde448
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol.pfb
Binary files differ
diff --git a/fonts/utilities/ps2pk/tests/Symbol10.300pk b/fonts/utilities/ps2pk/tests/Symbol10.300pk
new file mode 100644
index 0000000000..f4c2aa9ccd
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/Symbol10.300pk
Binary files differ
diff --git a/fonts/utilities/ps2pk/tests/lmmath.test b/fonts/utilities/ps2pk/tests/lmmath.test
new file mode 100755
index 0000000000..bc3123eb3b
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/lmmath.test
@@ -0,0 +1,24 @@
+#! /bin/sh -vx
+# $Id: lmmath.test 45809 2017-11-15 00:36:56Z karl $
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+test -d tests || mkdir -p tests
+
+TEXMFCNF=$srcdir/../kpathsea
+
+encpath=`$KPSEWHICH lm-mathit.enc` || exit 77
+ENCFONTS="`dirname $encpath`"
+
+t1path=`$KPSEWHICH lmmi12.pfb` || exit 77
+T1FONTS="`dirname $t1path`"
+
+afmpath=`$KPSEWHICH lmmi12.afm` || exit 77
+AFMFONTS="`dirname $afmpath`"
+
+export TEXMFCNF ENCFONTS T1FONTS AFMFONTS
+
+./ps2pk -elm-mathit.enc -X600 -Y600 -R600 -S0 -E1 -P12.0 lmmi12.pfb lmmi12.600pk || exit 1
+diff $srcdir/tests/lmmi12.600pk lmmi12.600pk || exit 1
+
diff --git a/fonts/utilities/ps2pk/tests/lmmi12.600pk b/fonts/utilities/ps2pk/tests/lmmi12.600pk
new file mode 100644
index 0000000000..5d2fa7d66d
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/lmmi12.600pk
Binary files differ
diff --git a/fonts/utilities/ps2pk/tests/ps2pk.test b/fonts/utilities/ps2pk/tests/ps2pk.test
new file mode 100755
index 0000000000..5f32933f1e
--- /dev/null
+++ b/fonts/utilities/ps2pk/tests/ps2pk.test
@@ -0,0 +1,43 @@
+#! /bin/sh -vx
+# $Id: ps2pk.test 48633 2018-09-09 17:56:55Z karl $
+# Copyright 2017-2018 Karl Berry <tex-live@tug.org>
+# Copyright 2012-2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+LC_ALL=C; export LC_ALL; LANGUAGE=C; export LANGUAGE
+
+TEXMFCNF=$srcdir/../kpathsea; export TEXMFCNF
+TEXFONTS=.; export TEXFONTS
+
+rm -f Symbol*
+
+cp $srcdir/tests/Symbol.afm $srcdir/tests/Symbol.pfb .
+
+./pfb2pfa -v Symbol.pfb || exit 1
+diff $srcdir/tests/Symbol.pfa Symbol.pfa || exit 1
+
+./ps2pk -v Symbol.pfa || exit 1
+diff $srcdir/tests/Symbol10.300pk Symbol10.300pk || exit 1
+
+rm -f Symbol10.300pk
+./ps2pk -v Symbol.pfb || exit 1
+diff $srcdir/tests/Symbol10.300pk Symbol10.300pk || exit 1
+
+./pk2bm -h -ca Symbol10.300pk >Symbol.alpha.hex || exit 1
+diff $srcdir/tests/Symbol.alpha.hex Symbol.alpha.hex || exit 1
+
+./pk2bm -b -o141 Symbol10.300pk >Symbol.alpha.pix || exit 1
+diff $srcdir/tests/Symbol.alpha.pix Symbol.alpha.pix || exit 1
+./pktest -ca -W24 -H22 Symbol.alpha.pk <Symbol.alpha.pix || exit 1
+./pk2bm -b -ca Symbol.alpha.pk | \
+ sed 's/yoff : 28/yoff : 21/' >Symbol.alpha.out || exit 1
+diff Symbol.alpha.pix Symbol.alpha.out || exit 1
+
+val1='167 240 263 288'
+val2=`./mag -r -R240 $val1` || exit 1
+val3=`./mag -R240 $val2` || exit 1
+
+echo "./mag -r -R240 $val1 => $val2"
+echo "./mag -R240 $val2 => $val3"
+test "x$val1" = "x$val3" || exit 1
+
diff --git a/fonts/utilities/ps2pk/texfiles.c b/fonts/utilities/ps2pk/texfiles.c
new file mode 100644
index 0000000000..0ec4ce95e0
--- /dev/null
+++ b/fonts/utilities/ps2pk/texfiles.c
@@ -0,0 +1,26 @@
+/*
+ * File: texfiles.c
+ * Purpose: basic binary TeX reading functions
+ * Version: 1.0 (Nov 1993)
+ * Author: Piet Tutelaers (derived from xdvi/pl16)
+ */
+
+#include <stdio.h>
+#include "texfiles.h"
+
+#define one(fp) ((unsigned char) getc(fp))
+
+unsigned long num(FILE *fp, int size)
+{ unsigned long x = 0;
+
+ while (size--) x = (x << 8) | one(fp);
+ return x;
+}
+
+integer snum(FILE *fp, int size)
+{ integer x;
+
+ x = getc(fp);
+ while (--size) x = (x << 8) | one(fp);
+ return x;
+}
diff --git a/fonts/utilities/ps2pk/texfiles.h b/fonts/utilities/ps2pk/texfiles.h
new file mode 100644
index 0000000000..960c1d7a49
--- /dev/null
+++ b/fonts/utilities/ps2pk/texfiles.h
@@ -0,0 +1,29 @@
+/*
+ * File: texfiles.h
+ * Purpose: headerfile for texfiles.c
+ * Version: 1.0 (Nov 1993)
+ * Author: Piet Tutelaers
+ */
+
+#ifndef __TEXFILES__
+#define __TEXFILES__
+
+#include <stdio.h>
+
+#ifdef MSDOS
+typedef long integer ;
+#else
+typedef int integer ;
+#endif
+
+unsigned long num(FILE *fp, int size);
+integer snum(FILE *fp, int size);
+
+#define one(fp) ((unsigned char) getc(fp))
+#define sone(fp) ((long) one(fp))
+#define two(fp) num (fp, 2)
+#define stwo(fp) snum(fp, 2)
+#define four(fp) num (fp, 4)
+#define sfour(fp) snum(fp, 4)
+
+#endif /* __TEXFILES__ */
diff --git a/fonts/utilities/ps2pk/token.c b/fonts/utilities/ps2pk/token.c
new file mode 100644
index 0000000000..fd768072e3
--- /dev/null
+++ b/fonts/utilities/ps2pk/token.c
@@ -0,0 +1,1170 @@
+/* $XConsortium: token.c,v 1.2 91/10/10 11:19:55 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Authors: Sig Nin & Carol Thompson IBM Almaden Research Laboratory */
+#include "types.h"
+#include "t1stdio.h"
+#include "util.h"
+#include "digit.h"
+#include "token.h"
+#include "tokst.h"
+#include "hdigit.h"
+/*
+ * -------------------------------------------------------------------
+ * Globals
+ * -------------------------------------------------------------------
+ */
+
+/* These variables are set by the caller */
+char *tokenStartP; /* Pointer to token buffer in VM */
+char *tokenMaxP; /* Pointer to last byte in buffer + 1 */
+
+/* These variables are set by TOKEN */
+int tokenLength; /* Characters in token */
+boolean tokenTooLong; /* Token too long for buffer */
+int tokenType; /* Type of token identified */
+psvalue tokenValue; /* Token value */
+
+/*
+ * -------------------------------------------------------------------
+ * Private variables
+ * -------------------------------------------------------------------
+ */
+
+static FILE *inputFileP; /* Current input file */
+
+
+/* Token */
+static char *tokenCharP; /* Pointer to next character in token */
+
+/*
+ * -------------------------------------------------------------------
+ * Private routines for manipulating numbers
+ * -------------------------------------------------------------------
+ */
+
+#define Exp10(e) \
+((e) == 0\
+ ? (DOUBLE)(1.0)\
+ : (-64 <= (e) && (e) <= 63\
+ ? Exp10T[(e)+64]\
+ : P10(e)\
+ )\
+)
+
+static DOUBLE Exp10T[128] = {
+ 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57,
+ 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49,
+ 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41,
+ 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33,
+ 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25,
+ 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18, 1e-17,
+ 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9,
+ 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1,
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7,
+ 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
+ 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23,
+ 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31,
+ 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
+ 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47,
+ 1e48, 1e49, 1e50, 1e51, 1e52, 1e53, 1e54, 1e55,
+ 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63
+};
+
+static DOUBLE P10(int32_t exponent)
+{
+ DOUBLE value, power;
+
+ if (exponent < 0) {
+ power = 0.1;
+ value = (exponent & 1 ? power : 1.0);
+ exponent = -((exponent + 1) >> 1); /* portable C for -(exponent/2) */
+ }
+ else {
+ power = 10.0;
+ value = (exponent & 1 ? power : 1.0);
+ exponent = exponent >> 1;
+ }
+
+ while(exponent > 0) {
+ power *= power;
+ if (exponent & 1)
+ value *= power;
+ exponent >>= 1;
+ }
+
+ return(value);
+}
+
+/*
+ * -------------------------------------------------------------------
+ * Private routines and macros for manipulating the input
+ * -------------------------------------------------------------------
+ */
+
+/* Get next character from the input --
+ *
+ */
+#define next_ch() (getc(inputFileP))
+
+/* Push a character back into the input --
+ *
+ * Ungetc of EOF will fail, but that's ok: the next getc will
+ * return EOF.
+ *
+ * NOTE: These macros are presently written to return the character
+ * pushed, or EOF if none was pushed. However, they are not
+ * required to return anything in particular, and callers should
+ * not rely on the returned value.
+ */
+#define back_ch(ch) (ungetc(ch, inputFileP))
+
+/* Push a character back into the input if it was not white space.
+ * If it is a carriage return (\r) then check next char for
+ * linefeed and consume them both, otherwise put next char back.
+ *
+ */
+#define back_ch_not_white(ch) \
+(\
+isWHITE_SPACE(ch)\
+ ? ((ch == '\r')\
+ ? (((ch = next_ch()) == '\n')\
+ ? EOF\
+ : back_ch(ch)\
+ )\
+ : EOF\
+ )\
+ : back_ch(ch)\
+)
+
+/*
+ * -------------------------------------------------------------------
+ * Private routines and macros for manipulating the token buffer
+ * -------------------------------------------------------------------
+ */
+
+/* Add a character to the token
+ * ---- use ONLY when you KNOW that this character will
+ * be stored within the token buffer.
+ */
+#define save_unsafe_ch(ch) (*tokenCharP++ = ch)
+
+/* Add a character to the token, if not too long to fit */
+#define save_ch(ch) \
+((tokenCharP < tokenMaxP)\
+ ? save_unsafe_ch(ch)\
+ : (tokenTooLong = TRUE)\
+)
+
+/*
+ * -------------------------------------------------------------------
+ * Action Routines
+ *
+ * These routines all
+ * -- take int ch as a parameter
+ * -- return int ch if no token was recognized, DONE otherwise
+ * -- leave the next character in the input, if returning DONE
+ * -------------------------------------------------------------------
+ */
+
+#define DONE (256)
+
+/* Get the next input character */
+static int next_char(int ch)
+{
+ return(next_ch());
+}
+
+/* Add character to token */
+static int add_char(int ch)
+{
+ save_ch(ch);
+ return(next_ch());
+}
+
+
+/* -------------------------------------------------------------------
+ * Skip white space and comments
+ */
+
+/* Skip white space */
+static int skip_space(int ch)
+{
+ do {
+ ch = next_ch();
+ } while(isWHITE_SPACE(ch));
+ return(ch);
+}
+
+/* Skip comments */
+static int skip_comment(int ch)
+{
+ do {
+ ch = next_ch();
+ } while(isCOMMENT(ch));
+ return(ch);
+}
+
+/* -------------------------------------------------------------------
+ * Collect value elements for a number
+ */
+
+/* decimal integer or real number mantissa */
+static int m_sign;
+static int32_t m_value;
+static int32_t m_scale;
+
+/* real number exponent */
+static int e_sign;
+static int32_t e_value;
+static int32_t e_scale;
+
+/* radix number */
+static int32_t r_base;
+static int32_t r_value;
+static int32_t r_scale;
+
+static int add_sign(int ch)
+{
+ m_sign = ch;
+ save_unsafe_ch(ch);
+ return(next_ch());
+}
+
+static int add_1st_digits(int ch)
+{
+ m_sign = '+';
+ return(add_digits(ch));
+}
+
+static int add_digits(int ch)
+{
+ int32_t value, p_value, scale;
+ int digit;
+
+ /* On entry, expect m_sign to be set to '+' or '-';
+ * ch is a decimal digit.
+ * Expect at most one character saved at this point,
+ * a sign. This routine will save up to 10 more
+ * characters without checking the buffer boundary.
+ */
+
+ value = ch - '0';
+ save_unsafe_ch(ch);
+ ch = next_ch();
+
+ while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) {
+ value = (value << 3) + (value << 1) + (ch - '0');
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ }
+
+ /* Quick exit for small integers --
+ * |x| <= 10*((MAX_INTEGER/10)-1)+9
+ * |x| <= 2,147,483,639 for 32 bit integers
+ */
+ if (isNUMBER_ENDER(ch)) {
+ back_ch_not_white(ch);
+ tokenValue.integer = (m_sign == '-' ? -value : value);
+ tokenType = TOKEN_INTEGER;
+ return(DONE);
+ }
+
+ /* Handle additional digits. Beyond the boundary case,
+ * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER
+ * just count the digits: the number is too large to
+ * represent as an integer and will be returned as a real.
+ * The mantissa of a real holds fewer bits than an integer.
+ */
+ p_value = value;
+ value = (m_sign == '-' ? -value : value);
+ scale = 0;
+
+ if (isDECIMAL_DIGIT(ch)) {
+
+ /* Handle the boundary case */
+ if (p_value == (MAX_INTEGER/10)) {
+ digit = ch - '0';
+
+ /* Must handle positive and negative values separately */
+ /* for 2's complement arithmetic */
+ if (value > 0) {
+ if (digit <= MAX_INTEGER%10)
+ value = (value << 3) + (value << 1) + digit;
+ else
+ ++scale; /* Too big, just count it */
+ }
+ else {
+ /* Use positive % operands for portability */
+ if (digit <= -(MIN_INTEGER+10)%10)
+ value = (value << 3) + (value << 1) - digit;
+ else
+ ++scale; /* Too big, just count it */
+ }
+ }
+ else
+ ++scale; /* Not boundary case, just count digit */
+
+ save_unsafe_ch(ch);
+ ch = next_ch();
+
+ /* Continue scanning digits, but can't store them */
+ while(isDECIMAL_DIGIT(ch)) {
+ ++scale;
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+
+ /* Continue from here scanning radix integer or real */
+ m_value = value;
+ m_scale = scale;
+
+ /* Initialize for possible real */
+ e_sign = '+';
+ e_value = 0;
+ e_scale = 0;
+
+ return(ch);
+}
+
+static int add_1st_decpt(int ch)
+{
+ m_sign = '+';
+ return(add_decpt(ch));
+}
+
+static int add_decpt(int ch)
+{
+ /* On entry, expect m_sign to be set to '+' or '-' */
+ m_value = 0;
+ m_scale = 0;
+ save_unsafe_ch(ch);
+ return(next_ch());
+}
+
+static int add_fraction(int ch)
+{
+ int32_t value, scale;
+ int digit;
+
+ /* On entry, expect m_value and m_scale to be initialized,
+ * and m_sign to be set to '+' or '-'. Expect m_value and m_sign
+ * to be consistent (this is not checked).
+ */
+ value = m_value;
+ scale = m_scale;
+
+ /* Scan leading zeroes */
+ if (value == 0) {
+ while(ch == '0') {
+ --scale;
+ save_ch(ch);
+ ch = next_ch();
+ }
+
+ /* Scan first significant digit */
+ if (isDECIMAL_DIGIT(ch)) {
+ --scale;
+ value = ch - '0';
+ value = (m_sign == '-' ? -value : value);
+ save_ch(ch);
+ ch = next_ch();
+ }
+ else
+ /* no significant digits -- number is zero */
+ scale = 0;
+ }
+ /* value != 0 || value == 0 && !isDECIMAL_DIGIT(ch) */
+
+ /* Scan additional significant digits */
+ if (isDECIMAL_DIGIT(ch)) {
+ if (value > 0) {
+ while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) {
+ --scale;
+ value = (value << 3) + (value << 1) + (ch - '0');
+ save_ch(ch);
+ ch = next_ch();
+ }
+ /* Check boundary case */
+ if (isDECIMAL_DIGIT(ch) && value == (MAX_INTEGER/10)) {
+ digit = ch - '0';
+ if (digit <= MAX_INTEGER%10) {
+ --scale;
+ value = (value << 3) + (value << 1) + digit;
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+ else {
+ /* value < 0 */
+ while(isDECIMAL_DIGIT(ch) && value > -(-(MIN_INTEGER+10)/10+1)) {
+ /* Use positive / operands for portability */
+ --scale;
+ value = (value << 3) + (value << 1) - (ch - '0');
+ save_ch(ch);
+ ch = next_ch();
+ }
+ /* Check boundary case */
+ if (isDECIMAL_DIGIT(ch)
+ && value == -(-(MIN_INTEGER+10)/10+1)) {
+ digit = ch - '0';
+ if (digit <= -(MIN_INTEGER+10)%10) {
+ /* Use positive % operands for portability */
+ --scale;
+ value = (value << 3) + (value << 1) - digit;
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+
+ /* Additional digits can be discarded */
+ while(isDECIMAL_DIGIT(ch)) {
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+
+ /* Store results */
+ m_value = value;
+ m_scale = scale;
+
+ /* Initialize for possible real */
+ e_sign = '+';
+ e_value = 0;
+ e_scale = 0;
+
+ return(ch);
+}
+
+static int add_e_sign(int ch)
+{
+ e_sign = ch;
+ save_ch(ch);
+ return(next_ch());
+}
+
+static int add_exponent(int ch)
+{
+ int32_t value, p_value;
+ int32_t scale = 0;
+ int digit;
+
+ /* On entry, expect e_sign to be set to '+' or '-' */
+
+ value = ch - '0';
+ save_ch(ch);
+ ch = next_ch();
+
+ while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) {
+ value = (value << 3) + (value << 1) + (ch - '0');
+ save_ch(ch);
+ ch = next_ch();
+ }
+
+ p_value = value;
+ value = (e_sign == '-' ? -value : value);
+
+ /* Handle additional digits. Beyond the boundary case,
+ * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER
+ * just count the digits: the number is too large to
+ * represent as an integer.
+ */
+ if (isDECIMAL_DIGIT(ch)) {
+
+ /* Examine boundary case */
+ if (p_value == (MAX_INTEGER/10)) {
+ digit = ch - '0';
+
+ /* Must handle positive and negative values separately */
+ /* for 2's complement arithmetic */
+ if (value > 0) {
+ if (digit <= MAX_INTEGER%10)
+ value = (value << 3) + (value << 1) + digit;
+ else
+ ++scale; /* Too big, just count it */
+ }
+ else {
+ /* Use positive % operands for portability */
+ if (digit <= -(MIN_INTEGER+10)%10)
+ value = (value << 3) + (value << 1) - digit;
+ else
+ ++scale; /* Too big, just count it */
+ }
+ }
+ else
+ ++scale; /* Not boundary case, just count digit */
+
+ save_ch(ch);
+ ch = next_ch();
+
+ /* Continue scanning digits, but can't store any more */
+ while(isDECIMAL_DIGIT(ch)) {
+ ++scale;
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+
+ /* Store results */
+ e_value = value;
+ e_scale = scale;
+
+ return(ch);
+}
+
+static int add_radix(int ch)
+{
+ if (2 <= m_value && m_value <= 36 && m_scale == 0) {
+ r_base = m_value;
+ save_ch(ch);
+ return(next_ch());
+ }
+ else {
+ /* Radix invalid, complete a name token */
+ return(AAH_NAME(ch));
+ }
+}
+
+static int add_r_digits(int ch)
+{
+ uint32_t value;
+ int32_t radix, scale;
+ int digit;
+
+ /* NOTE: The syntax of a radix number allows only for
+ * values of zero or more. The value will be stored as
+ * a 32 bit integer, which PostScript then interprets
+ * as signed. This means, for example, that the numbers:
+ *
+ * 8#37777777777
+ * 10#4294967295
+ * 16#FFFFFFFF
+ * 36#1Z141Z3
+ *
+ * are all interpreted as -1. This routine implements this
+ * idea explicitly: it accumulates the number's value
+ * as unsigned, then casts it to signed when done.
+ */
+
+ /* Expect r_base to be initialized */
+ radix = r_base;
+ value = 0;
+ scale = 0;
+
+ /* Scan leading zeroes */
+ while(ch == '0') {
+ save_ch(ch);
+ ch = next_ch();
+ }
+
+ /* Handle first non-zero digit */
+ if ((digit=digit_value[ch]) < radix) {
+ value = digit;
+ save_ch(ch);
+ ch = next_ch();
+
+ /* Add digits until boundary case reached */
+ while((digit=digit_value[ch]) < radix
+ && value < (MAX_INT32 / radix)) {
+ value = value * radix + digit;
+ save_ch(ch);
+ ch = next_ch();
+ };
+
+ /* Scan remaining digits */
+ if ((digit=digit_value[ch]) < radix) {
+
+ /* Examine boundary case ---
+ * radix*(MAX_INT32/radix) <= number <= MAX_INT32
+ */
+ if (value == (MAX_INT32/radix) && digit <= MAX_INT32%radix)
+ value = value * radix + digit;
+ else
+ ++scale;
+
+ /* Continue scanning digits, but can't store them */
+ save_ch(ch);
+ ch = next_ch();
+ while(digit_value[ch] < radix) {
+ ++scale;
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+
+ /* Store result */
+ r_value = (int32_t) value; /* result is signed */
+ r_scale = scale;
+
+ return(ch);
+}
+
+/* -------------------------------------------------------------------
+ * Complete a number; set token type and done flag.
+ * Put current input character back, if it is not white space.
+ */
+
+/* Done: Radix Number */
+static int RADIX_NUMBER(int ch)
+{
+ back_ch_not_white(ch);
+ if (r_scale == 0) {
+ tokenValue.integer = r_value;
+ tokenType = TOKEN_INTEGER;
+ }
+ else {
+ tokenType = TOKEN_NAME;
+ }
+ return(DONE);
+}
+
+/* Done: Integer */
+static int INTEGER(int ch)
+{
+ back_ch_not_white(ch);
+ if (m_scale == 0) {
+ tokenValue.integer = m_value;
+ tokenType = TOKEN_INTEGER;
+ }
+ else {
+ tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale);
+ tokenType = TOKEN_REAL;
+ }
+ return(DONE);
+}
+
+/* Done: Real */
+static int REAL(int ch)
+{
+ DOUBLE temp;
+
+ back_ch_not_white(ch);
+
+ /* NOTE: ignore e_scale, since e_value alone will cause
+ * exponent overflow if e_scale > 0.
+ */
+
+ /* HAZARD: exponent overflow of intermediate result
+ * (e.g., in 370 floating point); this should not be a problem
+ * with IEEE floating point. Reduce exponent overflow hazard by
+ * combining m_scale and e_value first, if they have different signs,
+ * or multiplying m_value and one of the other factors, if both
+ * m_scale and e_value are negative.
+ */
+ if ((m_scale >= 0 && e_value <= 0)
+ || (m_scale <= 0 && e_value >= 0)) {
+ tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale + e_value);
+ }
+ else {
+ temp = (DOUBLE)(m_value) * Exp10(m_scale);
+ tokenValue.real = temp * Exp10(e_value);
+ }
+
+ tokenType = TOKEN_REAL;
+ return(DONE);
+}
+
+
+/* -------------------------------------------------------------------
+ * Assemble a hex string; set token type and done flag.
+ */
+
+/* Done: Hex String */
+static int HEX_STRING(int ch)
+{
+ int value;
+
+ while(TRUE) {
+
+ /* Process odd digit */
+ ch = next_ch();
+ if (!isHEX_DIGIT(ch)) {
+
+ /* Skip white space */
+ while(isWHITE_SPACE(ch))
+ ch = next_ch();
+
+ /* Check for terminator */
+ if (!isHEX_DIGIT(ch)) {
+ break;
+ }
+ }
+ value = digit_value[ch] << 4;
+
+ /* Process even digit */
+ ch = next_ch();
+ if (!isHEX_DIGIT(ch)) {
+
+ /* Skip white space */
+ while(isWHITE_SPACE(ch))
+ ch = next_ch();
+
+ /* Check for terminator */
+ if (!isHEX_DIGIT(ch)) {
+ save_ch(value);
+ break;
+ }
+ }
+ save_ch(value + digit_value[ch]);
+ }
+
+ /* Classify result, based on why loop ended */
+ if (ch == '>')
+ tokenType = TOKEN_HEX_STRING;
+ else {
+ /* save the invalid character for error reporting */
+ save_ch(ch);
+ tokenType = TOKEN_INVALID;
+ }
+
+ return(DONE);
+}
+
+/* -------------------------------------------------------------------
+ * Assemble a string; set token type and done flag
+ */
+
+/* Save a backslash-coded character in a string --
+ *
+ * Store the proper character for special cases
+ * "\b", "\f", "\n", "\r", and "\t".
+ *
+ * Decode and store octal-coded character, up to
+ * three octal digits, "\o", "\oo", and "\ooo".
+ *
+ * The sequence "\<newline>" is a line continuation,
+ * so consume both without storing anything.
+ *
+ * The sequence "\<EOF>" is an error; exit without
+ * storing anything and let the caller handle it.
+ *
+ * For other characters, including the sequences
+ * "\\", "\(", and "\)", simply store the second
+ * character.
+ */
+static void save_digraph(int ch)
+{
+ int value;
+
+ switch (ch) {
+
+ case 'b': /* backspace */
+ ch = '\b';
+ break;
+
+ case 'f': /* formfeed */
+ ch = '\f';
+ break;
+
+ case 'n': /* newline */
+ ch = '\n';
+ break;
+
+ case 'r': /* carriage return */
+ ch = '\r';
+ break;
+
+ case 't': /* horizontal tab */
+ ch = '\t';
+ break;
+
+ case '\n': /* line continuation -- consume it */
+ return;
+
+ case '\r': /* carriage return -- consume it */
+ ch = next_ch(); /* look at next character, is it \n? */
+ if (ch == '\n') return;
+ back_ch(ch); /* if not a line feed, then return it */
+ return;
+
+ case EOF: /* end of file -- forget it */
+ return;
+
+ default:
+ /* scan up to three octal digits to get value */
+ if (isOCTAL_DIGIT(ch)) {
+ value = digit_value[ch];
+ ch = next_ch();
+ if (isOCTAL_DIGIT(ch)) {
+ value = (value << 3) + digit_value[ch];
+ ch = next_ch();
+ if (isOCTAL_DIGIT(ch))
+ value = (value << 3) + digit_value[ch];
+ else
+ back_ch(ch);
+ }
+ else
+ back_ch(ch);
+ ch = value;
+ }
+ }
+
+ /* Found a character to save */
+ save_ch(ch);
+}
+
+/* Done: String */
+static int STRING(int ch)
+{
+ int nest_level = 1;
+
+ tokenType = TOKEN_STRING;
+
+ do {
+
+ ch = next_ch();
+ while(!isSTRING_SPECIAL(ch)) {
+ save_ch(ch);
+ ch = next_ch();
+ };
+
+ switch (ch) {
+
+ case '(':
+ ++nest_level;
+ save_ch(ch);
+ break;
+
+ case ')':
+ if (--nest_level > 0)
+ save_ch(ch);
+ break;
+
+ case '\\':
+ save_digraph(next_ch());
+ break;
+
+ case '\r':
+ /* All carriage returns (\r) are turned into linefeeds (\n)*/
+ ch = next_ch(); /* get the next one, is it \n? */
+ if (ch != '\n') { /* if not, then put it back. */
+ back_ch(ch);
+ }
+ save_ch('\n'); /* in either case, save a linefeed */
+ break;
+
+
+ case EOF:
+ tokenType = TOKEN_INVALID; /* Unterminated string */
+ nest_level = 0;
+ break;
+ }
+
+ } while(nest_level > 0);
+
+ return(DONE);
+}
+
+
+/* -------------------------------------------------------------------
+ * Assemble a name; set token type and done flag.
+ * Put current input character back, if it is not white space.
+ */
+
+/* Done: Name
+ * (Safe version used to complete name tokens that
+ * start out looking like something else).
+ */
+
+static int AAH_NAME(int ch)
+{
+ do {
+ save_ch(ch);
+ ch = next_ch();
+ } while(isNAME(ch));
+
+ back_ch_not_white(ch);
+ tokenType = TOKEN_NAME;
+ return(DONE);
+}
+
+/* Done: Name */
+static int NAME(int ch)
+{
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ while(isNAME(ch)) {
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ back_ch_not_white(ch);
+ tokenType = TOKEN_NAME;
+ return(DONE);
+}
+
+/* Done: Literal Name */
+static int LITERAL_NAME(int ch)
+{
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ while(isNAME(ch)) {
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ back_ch_not_white(ch);
+ tokenType = TOKEN_LITERAL_NAME;
+ return(DONE);
+}
+
+/* Done: immediate Name */
+static int IMMED_NAME(int ch)
+{
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ if (isNAME(ch)) {
+ save_unsafe_ch(ch);
+ ch = next_ch();
+ while(isNAME(ch)) {
+ save_ch(ch);
+ ch = next_ch();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ back_ch_not_white(ch);
+ tokenType = TOKEN_IMMED_NAME;
+ return(DONE);
+}
+
+/* Done: Name found while looking for something else */
+static int OOPS_NAME(int ch)
+{
+ back_ch_not_white(ch);
+ tokenType = TOKEN_NAME;
+ return(DONE);
+}
+
+
+/* -------------------------------------------------------------------
+ * Complete a miscellaneous token; set token type and done flag.
+ */
+
+/* Done: Unmatched Right Angle-Bracket */
+static int RIGHT_ANGLE(int ch)
+{
+ tokenType = TOKEN_RIGHT_ANGLE;
+ return(DONE);
+}
+
+/* Done: Unmatched Right Parenthesis */
+static int RIGHT_PAREN(int ch)
+{
+ tokenType = TOKEN_RIGHT_PAREN;
+ return(DONE);
+}
+
+/* Done: Left Brace */
+static int LEFT_BRACE(int ch)
+{
+ tokenType = TOKEN_LEFT_BRACE;
+ return(DONE);
+}
+
+/* Done: Right Brace */
+static int RIGHT_BRACE(int ch)
+{
+ tokenType = TOKEN_RIGHT_BRACE;
+ return(DONE);
+}
+
+/* Done: Left Bracket */
+static int LEFT_BRACKET(int ch)
+{
+ save_unsafe_ch(ch);
+ tokenType = TOKEN_LEFT_BRACKET;
+ return(DONE);
+}
+
+/* Done: Right Bracket */
+static int RIGHT_BRACKET(int ch)
+{
+ save_unsafe_ch(ch);
+ tokenType = TOKEN_RIGHT_BRACKET;
+ return(DONE);
+}
+
+/* Done: Break */
+static int BREAK_SIGNAL(int ch)
+{
+ tokenType = TOKEN_BREAK;
+ return(DONE);
+}
+
+/* Done: No Token Found */
+static int NO_TOKEN(int ch)
+{
+ tokenType = TOKEN_EOF;
+ return(DONE);
+}
+
+
+/*
+ * -------------------------------------------------------------------
+ * scan_token -- scan one token from the input. It uses a simple
+ * finite state machine to recognize token classes.
+ *
+ * The input is from a file.
+ *
+ * On entry --
+ *
+ * inputP -> input PostScript object, a file.
+ * tokenStartP -> buffer in VM for accumulating the token.
+ * tokenMaxP -> last character in the token buffer
+ *
+ * On exit --
+ *
+ * tokenLength = number of characters in the token
+ * tokenTooLong = TRUE if the token did not fit in the buffer
+ * tokenType = code for the type of token parsed.
+ * tokenValue = converted value of a numeric token.
+ *
+ *
+ * -------------------------------------------------------------------
+ */
+void scan_token(psobj *inputP)
+{
+ int ch;
+ unsigned char *stateP = s0;
+ unsigned char entry;
+ int (*actionP)();
+
+ /* Define input source */
+ inputFileP = inputP->data.fileP;
+ if (inputFileP == NULL) {
+ tokenType = TOKEN_EOF;
+ return;
+ }
+
+ /* Ensure enough space for most cases
+ * (so we don't have to keep checking)
+ * The length needs to cover the maximum number
+ * of save_unsafe_ch() calls that might be executed.
+ * That number is 11 (a sign and 10 decimal digits, e.g.,
+ * when scanning -2147483648), but use MAX_NAME_LEN
+ * in case someone changes that without checking.
+ */
+ if (vm_free_bytes() < (MAX_NAME_LEN)) {
+ if (!(vm_init())) {
+ tokenLength = 0;
+ tokenTooLong = TRUE;
+ tokenType = TOKEN_NONE;
+ tokenValue.integer = 0;
+ return;
+ }
+ }
+
+ tokenStartP = vm_next_byte();
+
+ /* Reset token */
+ tokenCharP = tokenStartP;
+ tokenTooLong = FALSE;
+
+ /* Scan one token */
+ ch = next_ch();
+ do {
+ entry = stateP[ch];
+ stateP = classActionTable[entry].nextStateP;
+ actionP = classActionTable[entry].actionRoutineP;
+ ch = (*actionP)(ch);
+ } while(ch != DONE);
+
+
+ /* Return results */
+ tokenLength = tokenCharP - tokenStartP;
+}
diff --git a/fonts/utilities/ps2pk/token.h b/fonts/utilities/ps2pk/token.h
new file mode 100644
index 0000000000..272da4cbaa
--- /dev/null
+++ b/fonts/utilities/ps2pk/token.h
@@ -0,0 +1,61 @@
+/* $XConsortium: token.h,v 1.2 91/10/10 11:19:58 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+#ifndef TOKEN_H
+#define TOKEN_H
+
+/* Special characters */
+#define CONTROL_C (3)
+
+/* Token type codes */
+#define TOKEN_INVALID (-3)
+#define TOKEN_BREAK (-2)
+#define TOKEN_EOF (-1)
+#define TOKEN_NONE (0)
+#define TOKEN_LEFT_PAREN (1)
+#define TOKEN_RIGHT_PAREN (2)
+#define TOKEN_LEFT_ANGLE (3)
+#define TOKEN_RIGHT_ANGLE (4)
+#define TOKEN_LEFT_BRACE (5)
+#define TOKEN_RIGHT_BRACE (6)
+#define TOKEN_LEFT_BRACKET (7)
+#define TOKEN_RIGHT_BRACKET (8)
+#define TOKEN_NAME (9)
+#define TOKEN_LITERAL_NAME (10)
+#define TOKEN_INTEGER (11)
+#define TOKEN_REAL (12)
+#define TOKEN_RADIX_NUMBER (13)
+#define TOKEN_HEX_STRING (14)
+#define TOKEN_STRING (15)
+#define TOKEN_IMMED_NAME (16)
+
+/* Token routines */
+extern void scan_token(psobj *);
+
+#endif /* TOKEN_H */
diff --git a/fonts/utilities/ps2pk/tokst.h b/fonts/utilities/ps2pk/tokst.h
new file mode 100644
index 0000000000..53471c97af
--- /dev/null
+++ b/fonts/utilities/ps2pk/tokst.h
@@ -0,0 +1,508 @@
+/* $XConsortium: tokst.h,v 1.2 91/10/10 11:20:00 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* -------------------------------------- */
+/* --- MACHINE GENERATED, DO NOT EDIT --- */
+/* -------------------------------------- */
+
+#ifndef TOKST
+#define TOKST 1
+
+/*
+ * State Index Tables --
+ *
+ * These tables map the input character to the
+ * proper entry in the Class Action Table.
+ * There is one table for each state.
+ *
+ */
+#define s0 (si0+2)
+static unsigned char si0[258] = { 0x10,0x11,
+ 0x02,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x02,0x02,0x0F,0x0F,0x02,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x02,0x0F,0x0F,0x0F,0x0F,0x03,0x0F,0x0F,0x05,0x0B,0x0F,0x0D,0x0F,0x0D,0x0E,0x04,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x0F,0x08,0x0F,0x0C,0x0F,
+ 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x0A,0x0F,0x0F,
+ 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x09,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
+ 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F
+};
+
+#define s1 (si1+2)
+static unsigned char si1[258] = { 0x14,0x15,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+ 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13
+};
+
+#define s2 (si2+2)
+static unsigned char si2[258] = { 0x1B,0x1C,
+ 0x16,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x16,0x16,0x1A,0x1A,0x16,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x16,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x1A,0x17,0x17,0x1A,0x1A,0x1A,0x1A,0x19,0x17,
+ 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1A,0x1A,0x17,0x1A,0x17,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+ 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A
+};
+
+#define s3 (si3+2)
+static unsigned char si3[258] = { 0x23,0x24,
+ 0x1D,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1D,0x1D,0x22,0x22,0x1D,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x1D,0x22,0x22,0x20,0x22,0x1E,0x22,0x22,0x1E,0x1E,0x22,0x22,0x22,0x22,0x1F,0x1E,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22
+};
+
+#define s4 (si4+2)
+static unsigned char si4[258] = { 0x29,0x2A,
+ 0x25,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x28,0x28,0x25,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x25,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x26,
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x28,0x26,0x28,0x26,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+ 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28
+};
+
+#define s5 (si5+2)
+static unsigned char si5[258] = { 0x30,0x31,
+ 0x2B,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2B,0x2B,0x2F,0x2F,0x2B,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2B,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2F,0x2C,0x2C,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,
+ 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+ 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F
+};
+
+#define s6 (si6+2)
+static unsigned char si6[258] = { 0x36,0x37,
+ 0x32,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x32,0x32,0x35,0x35,0x32,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x32,0x35,0x35,0x35,0x35,0x33,0x35,0x35,0x33,0x33,0x35,0x35,0x35,0x35,0x35,0x33,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35
+};
+
+#define s7 (si7+2)
+static unsigned char si7[258] = { 0x3D,0x3E,
+ 0x38,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x38,0x38,0x3C,0x3C,0x38,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x38,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x3C,0x39,0x39,0x3C,0x3A,0x3C,0x3A,0x3C,0x39,
+ 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x39,0x3C,0x39,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+ 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C
+};
+
+#define s8 (si8+2)
+static unsigned char si8[258] = { 0x43,0x44,
+ 0x3F,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3F,0x3F,0x42,0x42,0x3F,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x3F,0x42,0x42,0x42,0x42,0x40,0x42,0x42,0x40,0x40,0x42,0x42,0x42,0x42,0x42,0x40,
+ 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x42,0x40,0x42,0x40,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+ 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42
+};
+
+#define s9 (si9+2)
+static unsigned char si9[258] = { 0x48,0x49,
+ 0x45,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x45,0x45,0x47,0x47,0x45,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x45,0x47,0x47,0x47,0x47,0x46,0x47,0x47,0x46,0x46,0x47,0x47,0x47,0x47,0x47,0x46,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+ 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47
+};
+
+#define s10 (si10+2)
+static unsigned char si10[258] = { 0x4E,0x4F,
+ 0x4A,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4A,0x4A,0x4D,0x4D,0x4A,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4A,0x4D,0x4D,0x4D,0x4D,0x4B,0x4D,0x4D,0x4B,0x4B,0x4D,0x4D,0x4D,0x4D,0x4D,0x4B,
+ 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4D,0x4D,0x4B,0x4D,0x4B,0x4D,
+ 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,
+ 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D,
+ 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,
+ 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,
+ 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D
+};
+
+#define s11 (si11+2)
+static unsigned char si11[258] = { 0x53,0x54,
+ 0x50,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x50,0x50,0x52,0x52,0x50,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x50,0x52,0x52,0x52,0x52,0x51,0x52,0x52,0x51,0x51,0x52,0x52,0x52,0x52,0x52,0x51,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+ 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52
+};
+
+/*
+ * Class Action Table --
+ *
+ * The entries in the Class Action Table indicate the
+ * action routine to be called, and the next state to
+ * enter, for each relevant character class in each.
+ * state. There are several entries for each state.
+ *
+ */
+static int AAH_NAME(int);
+static int BREAK_SIGNAL(int);
+static int HEX_STRING(int);
+static int IMMED_NAME(int);
+static int INTEGER(int);
+static int LEFT_BRACE(int);
+static int LEFT_BRACKET(int);
+static int LITERAL_NAME(int);
+static int NAME(int);
+static int NO_TOKEN(int);
+static int OOPS_NAME(int);
+static int RADIX_NUMBER(int);
+static int REAL(int);
+static int RIGHT_ANGLE(int);
+static int RIGHT_BRACE(int);
+static int RIGHT_BRACKET(int);
+static int RIGHT_PAREN(int);
+static int STRING(int);
+static int add_1st_decpt(int);
+static int add_1st_digits(int);
+static int add_char(int);
+static int add_decpt(int);
+static int add_digits(int);
+static int add_e_sign(int);
+static int add_exponent(int);
+static int add_fraction(int);
+static int add_r_digits(int);
+static int add_radix(int);
+static int add_sign(int);
+static int next_char(int);
+static int skip_comment(int);
+static int skip_space(int);
+
+static struct cat {
+ int (*actionRoutineP)();
+ unsigned char *nextStateP;
+} classActionTable[] = {
+
+ /* s0: Classify initial character */
+ /* 00 ALPHA */ {NAME, s0}, /* executable name */
+ /* 01 DIGIT */ {add_1st_digits, s3}, /* number? */
+ /* 02 WHITE_SPACE */ {skip_space, s0}, /* skip white space */
+ /* 03 PERCENT */ {skip_comment, s0}, /* comment? */
+ /* 04 SLASH */ {next_char, s1}, /* literal or imm name */
+ /* 05 LEFT_PAREN */ {STRING, s0}, /* string */
+ /* 06 LEFT_BRACE */ {LEFT_BRACE, s0}, /* begin procedure body */
+ /* 07 LEFT_BRACKET */ {LEFT_BRACKET, s0}, /* begin array */
+ /* 08 LEFT_ANGLE */ {HEX_STRING, s0}, /* hex string? */
+ /* 09 RIGHT_BRACE */ {RIGHT_BRACE, s0}, /* end procedure body */
+ /* 0A RIGHT_BRACKET */ {RIGHT_BRACKET, s0}, /* end array */
+ /* 0B RIGHT_PAREN */ {RIGHT_PAREN, s0}, /* unmatched right paren */
+ /* 0C RIGHT_ANGLE */ {RIGHT_ANGLE, s0}, /* unmatched right angle */
+ /* 0D SIGN */ {add_sign, s2}, /* signed number? */
+ /* 0E DECIMAL_POINT */ {add_1st_decpt, s4}, /* real number? */
+ /* 0F ANY */ {NAME, s0}, /* executable name */
+ /* 10 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 11 EOF */ {NO_TOKEN, s0}, /* no token found */
+
+ /* s1: Further classify a '/' */
+ /* 12 SLASH */ {IMMED_NAME, s0}, /* immediate name */
+ /* 13 ANY */ {LITERAL_NAME, s0}, /* literal name */
+ /* 14 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 15 EOF */ {OOPS_NAME, s0}, /* isolated sign */
+
+ /* s2: sign */
+ /* 16 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated sign */
+ /* 17 SPECIAL */ {OOPS_NAME, s0}, /* isolated sign */
+ /* 18 DIGIT */ {add_digits, s3}, /* number? */
+ /* 19 DECIMAL_POINT */ {add_decpt, s4}, /* real number? */
+ /* 1A ANY */ {NAME, s0}, /* executable name */
+ /* 1B BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 1C EOF */ {OOPS_NAME, s0}, /* isolated sign */
+
+ /* s3: sign? digit+ */
+ /* 1D WHITE_SPACE */ {INTEGER, s0}, /* n-digit integer */
+ /* 1E SPECIAL */ {INTEGER, s0}, /* n-digit integer */
+ /* 1F DECIMAL_POINT */ {add_char, s5}, /* real number? */
+ /* 20 POUND */ {add_radix, s10}, /* radix number? */
+ /* 21 eE */ {add_char, s7}, /* real with exponent? */
+ /* 22 ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 23 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 24 EOF */ {INTEGER, s0}, /* n-digit integer */
+
+ /* s4: sign? . */
+ /* 25 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated +. or -. */
+ /* 26 SPECIAL */ {OOPS_NAME, s0}, /* isolated +. or -. */
+ /* 27 DIGIT */ {add_fraction, s6}, /* number? */
+ /* 28 ANY */ {NAME, s0}, /* executable name */
+ /* 29 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 2A EOF */ {OOPS_NAME, s0}, /* isolated +. or -. */
+
+ /* s5: sign? digit+ . */
+ /* 2B WHITE_SPACE */ {REAL, s0}, /* real with fraction */
+ /* 2C SPECIAL */ {REAL, s0}, /* real with fraction */
+ /* 2D eE */ {add_char, s7}, /* real with exponent? */
+ /* 2E DIGIT */ {add_fraction, s6}, /* number? */
+ /* 2F ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 30 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 31 EOF */ {REAL, s0}, /* real with fraction */
+
+ /* s6: sign? (digit+ . digit+) | (. digit+) */
+ /* 32 WHITE_SPACE */ {REAL, s0}, /* real with fraction */
+ /* 33 SPECIAL */ {REAL, s0}, /* real with fraction */
+ /* 34 eE */ {add_char, s7}, /* real with exponent? */
+ /* 35 ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 36 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 37 EOF */ {REAL, s0}, /* real with fraction */
+
+ /* s7: sign? ((digit+ (. digit*)?) | (. digit+)) Ee */
+ /* 38 WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */
+ /* 39 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */
+ /* 3A SIGN */ {add_e_sign, s8}, /* real w signed exponent? */
+ /* 3B DIGIT */ {add_exponent, s9}, /* real w exponent ? */
+ /* 3C ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 3D BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 3E EOF */ {OOPS_NAME, s0}, /* invalid real number */
+
+ /* s8: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign */
+ /* 3F WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */
+ /* 40 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */
+ /* 41 DIGIT */ {add_exponent, s9}, /* real w exponent? */
+ /* 42 ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 43 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 44 EOF */ {OOPS_NAME, s0}, /* invalid real number */
+
+ /* s9: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign? digit+ */
+ /* 45 WHITE_SPACE */ {REAL, s0}, /* real w exponent */
+ /* 46 SPECIAL */ {REAL, s0}, /* real w exponent */
+ /* 47 ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 48 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 49 EOF */ {REAL, s0}, /* real w exponent */
+
+ /* s10: digit+ # */
+ /* 4A WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid radix number */
+ /* 4B SPECIAL */ {OOPS_NAME, s0}, /* invalid radix number */
+ /* 4C R_DIGIT */ {add_r_digits, s11}, /* radix number? */
+ /* 4D ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 4E BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 4F EOF */ {OOPS_NAME, s0}, /* invalid radix number */
+
+ /* s11: digit+ # r_digit+ */
+ /* 50 WHITE_SPACE */ {RADIX_NUMBER, s0}, /* radix number */
+ /* 51 SPECIAL */ {RADIX_NUMBER, s0}, /* radix number */
+ /* 52 ANY */ {AAH_NAME, s0}, /* executable name */
+ /* 53 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */
+ /* 54 EOF */ {RADIX_NUMBER, s0} /* radix number */
+};
+
+/*
+ * Character Classification Tables --
+ *
+ * The entries in the Character Classification Tables
+ * map character codes to character classes. The
+ * tables contains one entry per code. The bits in
+ * each entry indicate which classes the character
+ * code belongs to.
+ *
+ * The macros 'isInCLASS(ch)' generate code to test
+ * whether 'ch' is a character in 'CLASS'.
+ *
+ */
+/* Membership macros for classes defined in table 1 ... */
+#define isRADIX_DIGIT(c) ((isInP1[c] & 0x80) != 0)
+#define isHEX_DIGIT(c) ((isInP1[c] & 0x40) != 0)
+#define isDECIMAL_DIGIT(c) ((isInP1[c] & 0x10) != 0)
+#define isOCTAL_DIGIT(c) ((isInP1[c] & 0x20) != 0)
+
+/* Membership macros for classes defined in table 2 ... */
+#define isWHITE_SPACE(c) ((isInP2[c] & 0x80) != 0)
+#define isCOMMENT(c) ((isInP2[c] & 0x40) != 0)
+#define isNAME(c) ((isInP2[c] & 0x20) != 0)
+#define isSTRING_SPECIAL(c) ((isInP2[c] & 0x10) != 0)
+#define isNUMBER_ENDER(c) ((isInP2[c] & 0x08) != 0)
+
+#define isInP1 (isInT1+2)
+static unsigned char isInT1[258] = { 0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xD0,0xD0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+#define isInP2 (isInT2+2)
+static unsigned char isInT2[258] = { 0x18,0x18,
+ 0xC8,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC8,0x88,0x60,0x60,0x98,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0xC8,0x60,0x60,0x60,0x60,0x48,0x60,0x60,0x58,0x58,0x60,0x60,0x60,0x60,0x60,0x48,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x70,0x48,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+ 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60
+};
+
+#endif
diff --git a/fonts/utilities/ps2pk/trig.h b/fonts/utilities/ps2pk/trig.h
new file mode 100644
index 0000000000..ebc253f243
--- /dev/null
+++ b/fonts/utilities/ps2pk/trig.h
@@ -0,0 +1,33 @@
+/* $XConsortium: trig.h,v 1.2 91/10/10 11:20:04 rws Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/*SHARED*/
+
+#define DegreeCos(d) xiStub()
+#define DegreeSin(d) xiStub()
diff --git a/fonts/utilities/ps2pk/type1.c b/fonts/utilities/ps2pk/type1.c
new file mode 100644
index 0000000000..edb112c70d
--- /dev/null
+++ b/fonts/utilities/ps2pk/type1.c
@@ -0,0 +1,1776 @@
+/* $XConsortium: type1.c,v 1.5 91/10/10 11:20:06 rws Exp $ */
+/* Copyright International Business Machines, Corp. 1991
+ * All Rights Reserved
+ * Copyright Lexmark International, Inc. 1991
+ * All Rights Reserved
+ * Portions Copyright (c) 1990 Adobe Systems Incorporated.
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of IBM or Lexmark or Adobe
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY
+ * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE
+ * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING
+ * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY
+ * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM,
+ * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND
+ * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*********************************************************************/
+/* */
+/* Type 1 module - Converting fonts in Adobe Type 1 Font Format */
+/* to scaled and hinted paths for rasterization. */
+/* Files: type1.c, type1.h, and blues.h. */
+/* */
+/* Authors: Sten F. Andler, IBM Almaden Research Center */
+/* (Type 1 interpreter, stem & flex hints) */
+/* */
+/* Patrick A. Casey, Lexmark International, Inc. */
+/* (Font level hints & stem hints) */
+/* */
+/*********************************************************************/
+
+/******************/
+/* Include Files: */
+/******************/
+#include "types.h"
+#include <stdio.h> /* a system-dependent include, usually */
+
+#include "objects.h"
+#include "spaces.h"
+#include "paths.h"
+#include "fonts.h" /* understands about TEXTTYPEs */
+#include "pictures.h" /* understands about handles */
+#include "util.h" /* PostScript objects */
+#include "blues.h" /* Blues structure for font-level hints */
+#include "fontmisc.h"
+#include "ffilest.h"
+#include "fontfcn.h"
+
+/**********************************/
+/* Type1 Constants and Structures */
+/**********************************/
+#define MAXSTACK 24 /* Adobe Type1 limit */
+#define MAXCALLSTACK 10 /* Adobe Type1 limit */
+#define MAXPSFAKESTACK 32 /* Max depth of fake PostScript stack (local) */
+#define MAXSTRLEN 512 /* Max length of a Type 1 string (local) */
+#define MAXLABEL 256 /* Maximum number of new hints */
+#define MAXSTEMS 128 /* Maximum number of VSTEM and HSTEM hints */
+#define EPS 0.001 /* Small number for comparisons */
+
+/************************************/
+/* Adobe Type 1 CharString commands */
+/************************************/
+#define HSTEM 1
+#define VSTEM 3
+#define VMOVETO 4
+#define RLINETO 5
+#define HLINETO 6
+#define VLINETO 7
+#define RRCURVETO 8
+#define CLOSEPATH 9
+#define CALLSUBR 10
+#define RETURN 11
+#define ESCAPE 12
+#define HSBW 13
+#define ENDCHAR 14
+#define RMOVETO 21
+#define HMOVETO 22
+#define VHCURVETO 30
+#define HVCURVETO 31
+
+/*******************************************/
+/* Adobe Type 1 CharString Escape commands */
+/*******************************************/
+#define DOTSECTION 0
+#define VSTEM3 1
+#define HSTEM3 2
+#define SEAC 6
+#define SBW 7
+#define DIV 12
+#define CALLOTHERSUBR 16
+#define POP 17
+#define SETCURRENTPOINT 33
+
+/*****************/
+/* Useful macros */
+/*****************/
+
+#define FABS(x) fabs(x)
+
+#define CEIL(x) ceil(x)
+
+#define FLOOR(x) floor(x)
+
+#define ROUND(x) FLOOR((x) + 0.5)
+
+#define ODD(x) (((int)(x)) & 01)
+
+int currentchar = -1; /* for error reporting */
+
+#define CC IfTrace1(TRUE, "'%03o ", currentchar)
+
+#define Error {errflag = TRUE; return;}
+
+#define Error0(errmsg) { CC; IfTrace0(TRUE, errmsg); Error;}
+
+#define Error01(errmsg) { CC; IfTrace0(TRUE, errmsg); errflag = TRUE; return -1.0;}
+
+#define Error1(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Error;}
+
+/********************/
+/* global variables */
+/********************/
+struct stem { /* representation of a STEM hint */
+ int vertical; /* TRUE if vertical, FALSE otherwise */
+ DOUBLE x, dx; /* interval of vertical stem */
+ DOUBLE y, dy; /* interval of horizontal stem */
+ struct segment *lbhint, *lbrevhint; /* left or bottom hint adjustment */
+ struct segment *rthint, *rtrevhint; /* right or top hint adjustment */
+};
+
+static DOUBLE escapementX, escapementY;
+static DOUBLE sidebearingX, sidebearingY;
+static DOUBLE accentoffsetX, accentoffsetY;
+
+static struct segment *path;
+static int errflag;
+
+/*************************************************/
+/* Global variables to hold Type1Char parameters */
+/*************************************************/
+static psfont *Environment;
+static struct XYspace *CharSpace;
+static psobj *CharStringP, *SubrsP, *OtherSubrsP;
+static int *ModeP;
+
+/************************/
+/* Forward declarations */
+/************************/
+#ifdef WIN32
+/* Unfortunately, there is such a function in the Win32 API */
+#define Escape Type1Escape
+#endif
+static void ComputeAlignmentZones(void);
+static void InitStems(void);
+static void FinitStems(void);
+static void ComputeStem(int stemno);
+static struct segment *Applyhint(struct segment *p,int stemnumber,int half);
+static struct segment *Applyrevhint(struct segment *p,int stemnumber,int half);
+static struct segment *FindStems(DOUBLE x,DOUBLE y,DOUBLE dx,DOUBLE dy);
+static void ClearStack(void);
+static void Push(DOUBLE Num);
+static void ClearCallStack(void);
+static void PushCall(psobj *CurrStrP,int CurrIndex,unsigned short CurrKey);
+static void PopCall(psobj **CurrStrPP ,int *CurrIndexP,unsigned short *CurrKeyP);
+static void ClearPSFakeStack(void);
+static void PSFakePush(DOUBLE Num);
+static DOUBLE PSFakePop(void);
+static struct segment *CenterStem(DOUBLE edge1,DOUBLE edge2);
+static unsigned char Decrypt(unsigned char cipher);
+static int DoRead(int *CodeP);
+static void StartDecrypt(void);
+static void Decode(int Code);
+static void DoCommand(int Code);
+static void Escape(int Code);
+static void HStem(DOUBLE y,DOUBLE dy);
+static void VStem(DOUBLE x,DOUBLE dx);
+static void RLineTo(DOUBLE dx,DOUBLE dy);
+static void RRCurveTo(DOUBLE dx1,DOUBLE dy1,DOUBLE dx2,DOUBLE dy2,DOUBLE dx3,DOUBLE dy3);
+static void DoClosePath(void);
+static void CallSubr(int subrno);
+static void Return(void);
+static void EndChar(void);
+static void RMoveTo(DOUBLE dx,DOUBLE dy);
+static void DotSection(void);
+static void Seac(DOUBLE asb,DOUBLE adx,DOUBLE ady,unsigned char bchar,unsigned char achar);
+static void Sbw(DOUBLE sbx,DOUBLE sby,DOUBLE wx,DOUBLE wy);
+static DOUBLE Div(DOUBLE num1,DOUBLE num2);
+static void FlxProc(DOUBLE c1x2,DOUBLE c1y2,DOUBLE c3x0,DOUBLE c3y0,DOUBLE c3x1,DOUBLE c3y1,DOUBLE c3x2,DOUBLE c3y2,DOUBLE c4x0,DOUBLE c4y0,DOUBLE c4x1,DOUBLE c4y1,DOUBLE c4x2,DOUBLE c4y2,DOUBLE epY,DOUBLE epX,int idmin);
+static void FlxProc1(void);
+static void FlxProc2(void);
+static void HintReplace(void);
+static void CallOtherSubr(int othersubrno);
+static void SetCurrentPoint(DOUBLE x,DOUBLE y);
+
+/*****************************************/
+/* statics for Flex procedures (FlxProc) */
+/*****************************************/
+static struct segment *FlxOldPath; /* save path before Flex feature */
+
+/******************************************************/
+/* statics for Font level hints (Blues) (see blues.h) */
+/******************************************************/
+static struct blues_struct *blues; /* the blues structure */
+static struct alignmentzone alignmentzones[MAXALIGNMENTZONES];
+int numalignmentzones; /* total number of alignment zones */
+
+/****************************************************************/
+/* Subroutines for the Font level hints (Alignment zones, etc.) */
+/****************************************************************/
+
+/******************************************/
+/* Fill in the alignment zone structures. */
+/******************************************/
+static void ComputeAlignmentZones(void)
+{
+ int i;
+ DOUBLE dummy, bluezonepixels, familyzonepixels;
+ struct segment *p;
+
+ numalignmentzones = 0; /* initialize total # of zones */
+
+ /* do the BlueValues zones */
+ for (i = 0; i < blues->numBlueValues; i +=2, ++numalignmentzones) {
+ /* the 0th & 1st numbers in BlueValues are for a bottom zone */
+ /* the rest are topzones */
+ if (i == 0) /* bottom zone */
+ alignmentzones[numalignmentzones].topzone = FALSE;
+ else /* top zone */
+ alignmentzones[numalignmentzones].topzone = TRUE;
+ if (i < blues->numFamilyBlues) { /* we must consider FamilyBlues */
+ p = ILoc(CharSpace,0,blues->BlueValues[i] - blues->BlueValues[i+1]);
+ QueryLoc(p, IDENTITY, &dummy, &bluezonepixels);
+ Destroy(p);
+ p = ILoc(CharSpace,0,blues->FamilyBlues[i]-blues->FamilyBlues[i+1]);
+ QueryLoc(p, IDENTITY, &dummy, &familyzonepixels);
+ Destroy(p);
+ /* is the difference in size of the zones less than 1 pixel? */
+ if (FABS(bluezonepixels - familyzonepixels) < 1.0) {
+ /* use the Family zones */
+ alignmentzones[numalignmentzones].bottomy =
+ blues->FamilyBlues[i];
+ alignmentzones[numalignmentzones].topy =
+ blues->FamilyBlues[i+1];
+ continue;
+ }
+ }
+ /* use this font's Blue zones */
+ alignmentzones[numalignmentzones].bottomy = blues->BlueValues[i];
+ alignmentzones[numalignmentzones].topy = blues->BlueValues[i+1];
+ }
+
+ /* do the OtherBlues zones */
+ for (i = 0; i < blues->numOtherBlues; i +=2, ++numalignmentzones) {
+ /* all of the OtherBlues zones are bottom zones */
+ alignmentzones[numalignmentzones].topzone = FALSE;
+ if (i < blues->numFamilyOtherBlues) {/* consider FamilyOtherBlues */
+ p = ILoc(CharSpace,0,blues->OtherBlues[i] - blues->OtherBlues[i+1]);
+ QueryLoc(p, IDENTITY, &dummy, &bluezonepixels);
+ Destroy(p);
+ p = ILoc(CharSpace,0,blues->FamilyOtherBlues[i] -
+ blues->FamilyOtherBlues[i+1]);
+ QueryLoc(p, IDENTITY, &dummy, &familyzonepixels);
+ Destroy(p);
+ /* is the difference in size of the zones less than 1 pixel? */
+ if (FABS(bluezonepixels - familyzonepixels) < 1.0) {
+ /* use the Family zones */
+ alignmentzones[numalignmentzones].bottomy =
+ blues->FamilyOtherBlues[i];
+ alignmentzones[numalignmentzones].topy =
+ blues->FamilyOtherBlues[i+1];
+ continue;
+ }
+ }
+ /* use this font's Blue zones (as opposed to the Family Blues */
+ alignmentzones[numalignmentzones].bottomy = blues->OtherBlues[i];
+ alignmentzones[numalignmentzones].topy = blues->OtherBlues[i+1];
+ }
+}
+
+/**********************************************************************/
+/* Subroutines and statics for handling of the VSTEM and HSTEM hints. */
+/**********************************************************************/
+int InDotSection; /* DotSection flag */
+struct stem stems[MAXSTEMS]; /* All STEM hints */
+int numstems; /* Number of STEM hints */
+int currstartstem; /* The current starting stem. */
+int oldvert, oldhor; /* Remember hint in effect */
+int oldhorhalf, oldverthalf; /* Remember which half of the stem */
+DOUBLE wsoffsetX, wsoffsetY; /* White space offset - for VSTEM3,HSTEM3 */
+int wsset; /* Flag for whether we've set wsoffsetX,Y */
+
+static void InitStems(void) /* Initialize the STEM hint data structures */
+{
+ InDotSection = FALSE;
+ currstartstem = numstems = 0;
+ oldvert = oldhor = -1;
+}
+
+static void FinitStems(void) /* Terminate the STEM hint data structures */
+{
+ int i;
+
+ for (i = 0; i < numstems; i++) {
+ Destroy(stems[i].lbhint);
+ Destroy(stems[i].lbrevhint);
+ Destroy(stems[i].rthint);
+ Destroy(stems[i].rtrevhint);
+ }
+}
+
+/*******************************************************************/
+/* Compute the dislocation that a stemhint should cause for points */
+/* inside the stem. */
+/*******************************************************************/
+static void ComputeStem(int stemno)
+{
+ int verticalondevice, idealwidth;
+ DOUBLE stemstart, stemwidth;
+ struct segment *p;
+ int i;
+ DOUBLE stembottom, stemtop, flatposition;
+ DOUBLE Xpixels, Ypixels;
+ DOUBLE unitpixels, onepixel;
+ int suppressovershoot, enforceovershoot;
+ DOUBLE stemshift, flatpospixels, overshoot;
+ DOUBLE widthdiff; /* Number of character space units to adjust width */
+ DOUBLE lbhintvalue, rthintvalue;
+ DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */
+ int rotated; /* TRUE if character is on the side, FALSE if upright */
+
+ /************************************************/
+ /* DETERMINE ORIENTATION OF CHARACTER ON DEVICE */
+ /************************************************/
+
+ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */
+
+ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001)
+ rotated = TRUE; /* Char is on side (90 or 270 degrees), possibly oblique. */
+ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001)
+ rotated = FALSE; /* Char is upright (0 or 180 degrees), possibly oblique. */
+ else {
+ stems[stemno].lbhint = NULL; /* Char is at non-axial angle, ignore hints. */
+ stems[stemno].lbrevhint = NULL;
+ stems[stemno].rthint = NULL;
+ stems[stemno].rtrevhint = NULL;
+ return;
+ }
+
+ /* Determine orientation of stem */
+
+ if (stems[stemno].vertical) {
+ verticalondevice = !rotated;
+ stemstart = stems[stemno].x;
+ stemwidth = stems[stemno].dx;
+ } else {
+ verticalondevice = rotated;
+ stemstart = stems[stemno].y;
+ stemwidth = stems[stemno].dy;
+ }
+
+ /* Determine how many pixels (non-negative) correspond to 1 character space
+ unit (unitpixels), and how many character space units (non-negative)
+ correspond to one pixel (onepixel). */
+
+ if (stems[stemno].vertical)
+ p = ILoc(CharSpace, 1, 0);
+ else
+ p = ILoc(CharSpace, 0, 1);
+ QueryLoc(p, IDENTITY, &Xpixels, &Ypixels);
+ Destroy(p);
+ if (verticalondevice)
+ unitpixels = FABS(Xpixels);
+ else
+ unitpixels = FABS(Ypixels);
+
+ onepixel = 1.0 / unitpixels;
+
+ /**********************/
+ /* ADJUST STEM WIDTHS */
+ /**********************/
+
+ widthdiff = 0.0;
+
+ /* Find standard stem with smallest width difference from this stem */
+ if (stems[stemno].vertical) { /* vertical stem */
+ if (blues->StdVW != 0) /* there is an entry for StdVW */
+ widthdiff = blues->StdVW - stemwidth;
+ for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */
+ if (blues->StemSnapV[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapV[i] - stemwidth;
+ }
+ } else { /* horizontal stem */
+ if (blues->StdHW != 0) /* there is an entry for StdHW */
+ widthdiff = blues->StdHW - stemwidth;
+ for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */
+ if (blues->StemSnapH[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapH[i] - stemwidth;
+ }
+ }
+
+ /* Only expand or contract stems if they differ by less than 1 pixel from
+ the closest standard width, otherwise make the width difference = 0. */
+ if (FABS(widthdiff) > onepixel)
+ widthdiff = 0.0;
+
+ /* Expand or contract stem to the nearest integral number of pixels. */
+ idealwidth = ROUND((stemwidth + widthdiff) * unitpixels);
+ /* Ensure that all stems are at least one pixel wide. */
+ if (idealwidth == 0)
+ idealwidth = 1;
+ /* Apply ForceBold to vertical stems. */
+ if (blues->ForceBold && stems[stemno].vertical)
+ /* Force this vertical stem to be at least DEFAULTBOLDSTEMWIDTH wide. */
+ if (idealwidth < DEFAULTBOLDSTEMWIDTH)
+ idealwidth = DEFAULTBOLDSTEMWIDTH;
+ /* Now compute the number of character space units necessary */
+ widthdiff = idealwidth * onepixel - stemwidth;
+
+ /*********************************************************************/
+ /* ALIGNMENT ZONES AND OVERSHOOT SUPPRESSION - HORIZONTAL STEMS ONLY */
+ /*********************************************************************/
+
+ stemshift = 0.0;
+
+ if (!stems[stemno].vertical) {
+
+ /* Get bottom and top boundaries of the stem. */
+ stembottom = stemstart;
+ stemtop = stemstart + stemwidth;
+
+ /* Find out if this stem intersects an alignment zone (the BlueFuzz */
+ /* entry in the Private dictionary specifies the number of character */
+ /* units to extend (in both directions) the effect of an alignment */
+ /* zone on a horizontal stem. The default value of BlueFuzz is 1. */
+ for (i = 0; i < numalignmentzones; ++i) {
+ if (alignmentzones[i].topzone) {
+ if (stemtop >= alignmentzones[i].bottomy &&
+ stemtop <= alignmentzones[i].topy + blues->BlueFuzz) {
+ break; /* We found a top-zone */
+ }
+ } else {
+ if (stembottom <= alignmentzones[i].topy &&
+ stembottom >= alignmentzones[i].bottomy - blues->BlueFuzz) {
+ break; /* We found a bottom-zone */
+ }
+ }
+ }
+
+ if (i < numalignmentzones) { /* We found an intersecting zone (number i). */
+ suppressovershoot = FALSE;
+ enforceovershoot = FALSE;
+
+ /* When 1 character space unit is rendered smaller than BlueScale
+ device units (pixels), we must SUPPRESS overshoots. Otherwise,
+ if the top (or bottom) of this stem is more than BlueShift character
+ space units away from the flat position, we must ENFORCE overshoot. */
+
+ if (unitpixels < blues->BlueScale)
+ suppressovershoot = TRUE;
+ else
+ if (alignmentzones[i].topzone) {
+ if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift)
+ enforceovershoot = TRUE;
+ } else
+ if (stembottom <= alignmentzones[i].topy - blues->BlueShift)
+ enforceovershoot = TRUE;
+
+ /*************************************************/
+ /* ALIGN THE FLAT POSITION OF THE ALIGNMENT ZONE */
+ /*************************************************/
+
+ /* Compute the position of the alignment zone's flat position in
+ device space and the amount of shift needed to align it on a
+ pixel boundary. Move all stems this amount. */
+
+ if (alignmentzones[i].topzone)
+ flatposition = alignmentzones[i].bottomy;
+ else
+ flatposition = alignmentzones[i].topy;
+
+ /* Find the flat position in pixels */
+ flatpospixels = flatposition * unitpixels;
+
+ /* Find the stem shift necessary to align the flat
+ position on a pixel boundary, and use this shift for all stems */
+ stemshift = (ROUND(flatpospixels) - flatpospixels) * onepixel;
+
+ /************************************************/
+ /* HANDLE OVERSHOOT ENFORCEMENT AND SUPPRESSION */
+ /************************************************/
+
+ /* Compute overshoot amount (non-negative) */
+ if (alignmentzones[i].topzone)
+ overshoot = stemtop - flatposition;
+ else
+ overshoot = flatposition - stembottom;
+
+ if (overshoot > 0.0) {
+ /* ENFORCE overshoot by shifting the entire stem (if necessary) so that
+ it falls at least one pixel beyond the flat position. */
+
+ if (enforceovershoot)
+ if (overshoot < onepixel) {
+ if (alignmentzones[i].topzone)
+ stemshift += onepixel - overshoot;
+ else
+ stemshift -= onepixel - overshoot;
+ }
+
+ /* SUPPRESS overshoot by aligning the stem to the alignment zone's
+ flat position. */
+
+ if (suppressovershoot) {
+ if (alignmentzones[i].topzone)
+ stemshift -= overshoot;
+ else
+ stemshift += overshoot;
+ }
+ }
+
+ /************************************************************/
+ /* COMPUTE HINT VALUES FOR EACH SIDE OF THE HORIZONTAL STEM */
+ /************************************************************/
+
+ /* If the stem was aligned by a topzone, we expand or contract the stem
+ only at the bottom - since the stem top was aligned by the zone.
+ If the stem was aligned by a bottomzone, we expand or contract the stem
+ only at the top - since the stem bottom was aligned by the zone. */
+ if (alignmentzones[i].topzone) {
+ lbhintvalue = stemshift - widthdiff; /* bottom */
+ rthintvalue = stemshift; /* top */
+ } else {
+ lbhintvalue = stemshift; /* bottom */
+ rthintvalue = stemshift + widthdiff; /* top */
+ }
+
+ stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue));
+ stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue));
+ stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue));
+ stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue));
+
+ return;
+
+ } /* endif (i < numalignmentzones) */
+
+ /* We didn't find any alignment zones intersecting this stem, so
+ proceed with normal stem alignment below. */
+
+ } /* endif (!stems[stemno].vertical) */
+
+ /* Align stem with pixel boundaries on device */
+ stemstart = stemstart - widthdiff / 2;
+ stemshift = ROUND(stemstart * unitpixels) * onepixel - stemstart;
+
+ /* Adjust the boundaries of the stem */
+ lbhintvalue = stemshift - widthdiff / 2; /* left or bottom */
+ rthintvalue = stemshift + widthdiff / 2; /* right or top */
+
+ if (stems[stemno].vertical) {
+ stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, lbhintvalue, 0.0));
+ stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, -lbhintvalue, 0.0));
+ stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, rthintvalue, 0.0));
+ stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, -rthintvalue, 0.0));
+ } else {
+ stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue));
+ stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue));
+ stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue));
+ stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue));
+ }
+}
+
+#define LEFT 1
+#define RIGHT 2
+#define BOTTOM 3
+#define TOP 4
+
+/*********************************************************************/
+/* Adjust a point using the given stem hint. Use the left/bottom */
+/* hint value or the right/top hint value depending on where the */
+/* point lies in the stem. */
+/*********************************************************************/
+static struct segment *Applyhint(struct segment *p, int stemnumber, int half)
+{
+ if (half == LEFT || half == BOTTOM)
+ return Join(p, stems[stemnumber].lbhint); /* left or bottom hint */
+ else
+ return Join(p, stems[stemnumber].rthint); /* right or top hint */
+}
+
+/*********************************************************************/
+/* Adjust a point using the given reverse hint. Use the left/bottom */
+/* hint value or the right/top hint value depending on where the */
+/* point lies in the stem. */
+/*********************************************************************/
+static struct segment *Applyrevhint(struct segment *p, int stemnumber, int half)
+{
+ if (half == LEFT || half == BOTTOM)
+ return Join(p, stems[stemnumber].lbrevhint); /* left or bottom hint */
+ else
+ return Join(p, stems[stemnumber].rtrevhint); /* right or top hint */
+}
+
+/***********************************************************************/
+/* Find the vertical and horizontal stems that the current point */
+/* (x, y) may be involved in. At most one horizontal and one vertical */
+/* stem can apply to a single point, since there are no overlaps */
+/* allowed. */
+/* The actual hintvalue is returned as a location. */
+/* Hints are ignored inside a DotSection. */
+/***********************************************************************/
+static struct segment *FindStems(DOUBLE x, DOUBLE y, DOUBLE dx, DOUBLE dy)
+{
+ int i;
+ int newvert, newhor;
+ struct segment *p;
+ int newhorhalf, newverthalf;
+
+ if (InDotSection) return(NULL);
+
+ newvert = newhor = -1;
+ newhorhalf = newverthalf = -1;
+
+ for (i = currstartstem; i < numstems; i++) {
+ if (stems[i].vertical) { /* VSTEM hint */
+ if ((x >= stems[i].x - EPS) &&
+ (x <= stems[i].x+stems[i].dx + EPS)) {
+ newvert = i;
+ if (dy != 0.0) {
+ if (dy < 0) newverthalf = LEFT;
+ else newverthalf = RIGHT;
+ } else {
+ if (x < stems[i].x+stems[i].dx / 2) newverthalf = LEFT;
+ else newverthalf = RIGHT;
+ }
+ }
+ } else { /* HSTEM hint */
+ if ((y >= stems[i].y - EPS) &&
+ (y <= stems[i].y+stems[i].dy + EPS)) {
+ newhor = i;
+ if (dx != 0.0) {
+ if (dx < 0) newhorhalf = TOP;
+ else newhorhalf = BOTTOM;
+ } else {
+ if (y < stems[i].y+stems[i].dy / 2) newhorhalf = BOTTOM;
+ else newhorhalf = TOP;
+ }
+ }
+ }
+ }
+
+ p = NULL;
+
+ if (newvert == -1 && oldvert == -1) ; /* Outside of any hints */
+ else if (newvert == oldvert &&
+ newverthalf == oldverthalf); /* No hint change */
+ else if (oldvert == -1) { /* New vertical hint in effect */
+ p = Applyhint(p, newvert, newverthalf);
+ } else if (newvert == -1) { /* Old vertical hint no longer in effect */
+ p = Applyrevhint(p, oldvert, oldverthalf);
+ } else { /* New vertical hint in effect, old hint no longer in effect */
+ p = Applyrevhint(p, oldvert, oldverthalf);
+ p = Applyhint(p, newvert, newverthalf);
+ }
+
+ if (newhor == -1 && oldhor == -1) ; /* Outside of any hints */
+ else if (newhor == oldhor &&
+ newhorhalf == oldhorhalf) ; /* No hint change */
+ else if (oldhor == -1) { /* New horizontal hint in effect */
+ p = Applyhint(p, newhor, newhorhalf);
+ } else if (newhor == -1) { /* Old horizontal hint no longer in effect */
+ p = Applyrevhint(p, oldhor, oldhorhalf);
+ }
+ else { /* New horizontal hint in effect, old hint no longer in effect */
+ p = Applyrevhint(p, oldhor, oldhorhalf);
+ p = Applyhint(p, newhor, newhorhalf);
+ }
+
+ oldvert = newvert; oldverthalf = newverthalf;
+ oldhor = newhor; oldhorhalf = newhorhalf;
+
+ return p;
+}
+
+/******************************************************/
+/* Subroutines and statics for the Type1Char routines */
+/******************************************************/
+
+static int strindex; /* index into PostScript string being interpreted */
+static DOUBLE currx, curry; /* accumulated x and y values for hints */
+
+struct callstackentry {
+ psobj *currstrP; /* current CharStringP */
+ int currindex; /* current strindex */
+ unsigned short currkey; /* current decryption key */
+ };
+
+static DOUBLE Stack[MAXSTACK];
+static int Top;
+static struct callstackentry CallStack[MAXCALLSTACK];
+static int CallTop;
+static DOUBLE PSFakeStack[MAXPSFAKESTACK];
+static int PSFakeTop;
+
+static void ClearStack(void)
+{
+ Top = -1;
+}
+
+static void Push(DOUBLE Num)
+{
+ if (++Top < MAXSTACK) Stack[Top] = Num;
+ else Error0("Push: Stack full\n");
+}
+
+static void ClearCallStack(void)
+{
+ CallTop = -1;
+}
+
+static void PushCall(psobj *CurrStrP, int CurrIndex, unsigned short CurrKey)
+{
+ if (++CallTop < MAXCALLSTACK) {
+ CallStack[CallTop].currstrP = CurrStrP; /* save CharString pointer */
+ CallStack[CallTop].currindex = CurrIndex; /* save CharString index */
+ CallStack[CallTop].currkey = CurrKey; /* save decryption key */
+ }
+ else Error0("PushCall: Stack full\n");
+}
+
+static void PopCall(psobj **CurrStrPP, int *CurrIndexP, unsigned short *CurrKeyP)
+{
+ if (CallTop >= 0) {
+ *CurrStrPP = CallStack[CallTop].currstrP; /* restore CharString pointer */
+ *CurrIndexP = CallStack[CallTop].currindex; /* restore CharString index */
+ *CurrKeyP = CallStack[CallTop--].currkey; /* restore decryption key */
+ }
+ else Error0("PopCall: Stack empty\n");
+}
+
+static void ClearPSFakeStack(void)
+{
+ PSFakeTop = -1;
+}
+
+/* PSFakePush: Pushes a number onto the fake PostScript stack */
+static void PSFakePush(DOUBLE Num)
+{
+ if (++PSFakeTop < MAXPSFAKESTACK) PSFakeStack[PSFakeTop] = Num;
+ else Error0("PSFakePush: Stack full\n");
+}
+
+/* PSFakePop: Removes a number from the top of the fake PostScript stack */
+static DOUBLE PSFakePop (void)
+{
+ if (PSFakeTop >= 0) return(PSFakeStack[PSFakeTop--]);
+ else Error01("PSFakePop : Stack empty\n");
+ /*NOTREACHED*/
+}
+
+/***********************************************************************/
+/* Center a stem on the pixel grid -- used by HStem3 and VStem3 */
+/***********************************************************************/
+static struct segment *CenterStem(DOUBLE edge1, DOUBLE edge2)
+{
+ int idealwidth, verticalondevice;
+ DOUBLE leftx, lefty, rightx, righty, center, width;
+ DOUBLE widthx, widthy;
+ DOUBLE shift, shiftx, shifty;
+ DOUBLE Xpixels, Ypixels;
+ struct segment *p;
+
+ p = Loc(CharSpace, edge1, 0.0);
+ QueryLoc(p, IDENTITY, &leftx, &lefty);
+
+ p = Join(p, Loc(CharSpace, edge2, 0.0));
+ QueryLoc(p, IDENTITY, &rightx, &righty);
+ Destroy(p);
+
+ widthx = FABS(rightx - leftx);
+ widthy = FABS(righty - lefty);
+
+ if (widthy <= EPS) { /* verticalondevice hint */
+ verticalondevice = TRUE;
+ center = (rightx + leftx) / 2.0;
+ width = widthx;
+ }
+ else if (widthx <= EPS) { /* horizontal hint */
+ verticalondevice = FALSE;
+ center = (righty + lefty) / 2.0;
+ width = widthy;
+ }
+ else { /* neither horizontal nor verticalondevice and not oblique */
+ return (NULL);
+ }
+
+ idealwidth = ROUND(width);
+ if (idealwidth == 0) idealwidth = 1;
+ if (ODD(idealwidth)) { /* is ideal width odd? */
+ /* center stem over pixel */
+ shift = FLOOR(center) + 0.5 - center;
+ }
+ else {
+ /* align stem on pixel boundary */
+ shift = ROUND(center) - center;
+ }
+
+ if (verticalondevice) {
+ shiftx = shift;
+ shifty = 0.0;
+ } else {
+ shifty = shift;
+ shiftx = 0.0;
+ }
+
+ p = Loc(IDENTITY, shiftx, shifty);
+ QueryLoc(p, CharSpace, &Xpixels, &Ypixels);
+ wsoffsetX = Xpixels; wsoffsetY = Ypixels;
+ currx += wsoffsetX; curry += wsoffsetY;
+
+ return (p);
+}
+
+/*-----------------------------------------------------------------------
+ Decrypt - From Adobe Type 1 book page 63, with some modifications
+-----------------------------------------------------------------------*/
+#define KEY 4330 /* Initial key (seed) for CharStrings decryption */
+#define C1 52845 /* Multiplier for pseudo-random number generator */
+#define C2 22719 /* Constant for pseudo-random number generator */
+
+static unsigned short r; /* Pseudo-random sequence of keys */
+
+static unsigned char Decrypt(unsigned char cipher)
+{
+ unsigned char plain;
+
+ plain = cipher ^ (r >> 8);
+ r = (cipher + r) * C1 + C2;
+ return plain;
+}
+
+/* Get the next byte from the codestring being interpreted */
+static int DoRead(int *CodeP)
+{
+ if (strindex >= CharStringP->len) return(FALSE); /* end of string */
+ *CodeP = Decrypt((unsigned char) CharStringP->data.stringP[strindex++]);
+ return(TRUE);
+}
+
+/* Strip blues->lenIV bytes from CharString and update encryption key */
+/* (the lenIV entry in the Private dictionary specifies the number of */
+/* random bytes at the beginning of each CharString; default is 4) */
+static void StartDecrypt(void)
+{
+ int Code;
+
+ r = KEY; /* Initial key (seed) for CharStrings decryption */
+ for (strindex = 0; strindex < blues->lenIV;)
+ if (!DoRead(&Code)) /* Read a byte and update decryption key */
+ Error0("StartDecrypt: Premature end of CharString\n");
+}
+
+static void Decode(int Code)
+{
+ int Code1, Code2, Code3, Code4;
+
+ if (Code <= 31) /* Code is [0,31] */
+ DoCommand(Code);
+ else if (Code <= 246) /* Code is [32,246] */
+ Push((DOUBLE)(Code - 139));
+ else if (Code <= 250) { /* Code is [247,250] */
+ if (!DoRead(&Code2)) goto ended;
+ Push((DOUBLE)(((Code - 247) << 8) + Code2 + 108));
+ }
+ else if (Code <= 254) { /* Code is [251,254] */
+ if (!DoRead(&Code2)) goto ended;
+ Push((DOUBLE)( -((Code - 251) << 8) - Code2 - 108));
+ }
+ else { /* Code is 255 */
+ if (!DoRead(&Code1)) goto ended;
+ if (!DoRead(&Code2)) goto ended;
+ if (!DoRead(&Code3)) goto ended;
+ if (!DoRead(&Code4)) goto ended;
+ Push((DOUBLE)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4));
+ }
+ return;
+
+ended: Error0("Decode: Premature end of Type 1 CharString");
+}
+
+/* Interpret a command code */
+static void DoCommand(int Code)
+{
+ switch(Code) {
+ case HSTEM: /* |- y dy HSTEM |- */
+ /* Vertical range of a horizontal stem zone */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ HStem(Stack[0], Stack[1]);
+ ClearStack();
+ break;
+ case VSTEM: /* |- x dx VSTEM |- */
+ /* Horizontal range of a vertical stem zone */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ VStem(Stack[0], Stack[1]);
+ ClearStack();
+ break;
+ case VMOVETO: /* |- dy VMOVETO |- */
+ /* Vertical MOVETO, equivalent to 0 dy RMOVETO */
+ if (Top < 0) Error0("DoCommand: Stack low\n");
+ RMoveTo(0.0, Stack[0]);
+ ClearStack();
+ break;
+ case RLINETO: /* |- dx dy RLINETO |- */
+ /* Like RLINETO in PostScript */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ RLineTo(Stack[0], Stack[1]);
+ ClearStack();
+ break;
+ case HLINETO: /* |- dx HLINETO |- */
+ /* Horizontal LINETO, equivalent to dx 0 RLINETO */
+ if (Top < 0) Error0("DoCommand: Stack low\n");
+ RLineTo(Stack[0], 0.0);
+ ClearStack();
+ break;
+ case VLINETO: /* |- dy VLINETO |- */
+ /* Vertical LINETO, equivalent to 0 dy RLINETO */
+ if (Top < 0) Error0("DoCommand: Stack low\n");
+ RLineTo(0.0, Stack[0]);
+ ClearStack();
+ break;
+ case RRCURVETO:
+ /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */
+ /* Relative RCURVETO, equivalent to dx1 dy1 */
+ /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */
+ /* (dy1+dy2+dy3) RCURVETO in PostScript */
+ if (Top < 5) Error0("DoCommand: Stack low\n");
+ RRCurveTo(Stack[0], Stack[1], Stack[2], Stack[3],
+ Stack[4], Stack[5]);
+ ClearStack();
+ break;
+ case CLOSEPATH: /* - CLOSEPATH |- */
+ /* Closes a subpath without repositioning the */
+ /* current point */
+ DoClosePath();
+ ClearStack();
+ break;
+ case CALLSUBR: /* subr# CALLSUBR - */
+ /* Calls a CharString subroutine with index */
+ /* subr# from the Subrs array */
+ if (Top < 0) Error0("DoCommand: Stack low\n");
+ CallSubr((int)Stack[Top--]);
+ break;
+ case RETURN: /* - RETURN - */
+ /* Returns from a Subrs array CharString */
+ /* subroutine called with CALLSUBR */
+ Return();
+ break;
+ case ESCAPE: /* ESCAPE to two-byte command code */
+ if (!DoRead(&Code)) Error0("DoCommand: ESCAPE is last byte\n");
+ Escape(Code);
+ break;
+ case HSBW: /* |- sbx wx HSBW |- */
+ /* Set the left sidebearing point to (sbx,0), */
+ /* set the character width vector to (wx,0). */
+ /* Equivalent to sbx 0 wx 0 SBW. Space */
+ /* character should have sbx = 0 */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ Sbw(Stack[0], 0.0, Stack[1], 0.0);
+ ClearStack();
+ break;
+ case ENDCHAR: /* - ENDCHAR |- */
+ /* Finishes a CharString outline */
+ EndChar();
+ ClearStack();
+ break;
+ case RMOVETO: /* |- dx dy RMOVETO |- */
+ /* Behaves like RMOVETO in PostScript */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ RMoveTo(Stack[0], Stack[1]);
+ ClearStack();
+ break;
+ case HMOVETO: /* |- dx HMOVETO |- */
+ /* Horizontal MOVETO. Equivalent to dx 0 RMOVETO */
+ if (Top < 0) Error0("DoCommand: Stack low\n");
+ RMoveTo(Stack[0], 0.0);
+ ClearStack();
+ break;
+ case VHCURVETO: /* |- dy1 dx2 dy2 dx3 VHCURVETO |- */
+ /* Vertical-Horizontal CURVETO, equivalent to */
+ /* 0 dy1 dx2 dy2 dx3 0 RRCURVETO */
+ if (Top < 3) Error0("DoCommand: Stack low\n");
+ RRCurveTo(0.0, Stack[0], Stack[1], Stack[2],
+ Stack[3], 0.0);
+ ClearStack();
+ break;
+ case HVCURVETO: /* |- dx1 dx2 dy2 dy3 HVCURVETO |- */
+ /* Horizontal-Vertical CURVETO, equivalent to */
+ /* dx1 0 dx2 dy2 0 dy3 RRCURVETO */
+ if (Top < 3) Error0("DoCommand: Stack low\n");
+ RRCurveTo(Stack[0], 0.0, Stack[1], Stack[2], 0.0, Stack[3]);
+ ClearStack();
+ break;
+ default: /* Unassigned command code */
+ ClearStack();
+ Error1("DoCommand: Unassigned code %d\n", Code);
+ }
+}
+
+static void Escape(int Code)
+{
+ int i, Num;
+ struct segment *p;
+
+ switch(Code) {
+ case DOTSECTION: /* - DOTSECTION |- */
+ /* Brackets an outline section for the dots in */
+ /* letters such as "i", "j", and "!". */
+ DotSection();
+ ClearStack();
+ break;
+ case VSTEM3: /* |- x0 dx0 x1 dx1 x2 dx2 VSTEM3 |- */
+ /* Declares the horizontal ranges of three */
+ /* vertical stem zones between x0 and x0+dx0, */
+ /* x1 and x1+dx1, and x2 and x2+dx2. */
+ if (Top < 5) Error0("DoCommand: Stack low\n");
+ if (!wsset && ProcessHints) {
+ /* Shift the whole character so that the middle stem is centered. */
+ p = CenterStem(Stack[2] + sidebearingX, Stack[3]);
+ path = Join(path, p);
+ wsset = 1;
+ }
+
+ VStem(Stack[0], Stack[1]);
+ VStem(Stack[2], Stack[3]);
+ VStem(Stack[4], Stack[5]);
+ ClearStack();
+ break;
+ case HSTEM3: /* |- y0 dy0 y1 dy1 y2 dy2 HSTEM3 |- */
+ /* Declares the vertical ranges of three hori- */
+ /* zontal stem zones between y0 and y0+dy0, */
+ /* y1 and y1+dy1, and y2 and y2+dy2. */
+ if (Top < 5) Error0("DoCommand: Stack low\n");
+ HStem(Stack[0], Stack[1]);
+ HStem(Stack[2], Stack[3]);
+ HStem(Stack[4], Stack[5]);
+ ClearStack();
+ break;
+ case SEAC: /* |- asb adx ady bchar achar SEAC |- */
+ /* Standard Encoding Accented Character. */
+ if (Top < 4) Error0("DoCommand: Stack low\n");
+ Seac(Stack[0], Stack[1], Stack[2],
+ (unsigned char) Stack[3],
+ (unsigned char) Stack[4]);
+ ClearStack();
+ break;
+ case SBW: /* |- sbx sby wx wy SBW |- */
+ /* Set the left sidebearing point to (sbx,sby), */
+ /* set the character width vector to (wx,wy). */
+ if (Top < 3) Error0("DoCommand: Stack low\n");
+ Sbw(Stack[0], Stack[1], Stack[2], Stack[3]);
+ ClearStack();
+ break;
+ case DIV: /* num1 num2 DIV quotient */
+ /* Behaves like DIV in the PostScript language */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ Stack[Top-1] = Div(Stack[Top-1], Stack[Top]);
+ Top--;
+ break;
+ case CALLOTHERSUBR:
+ /* arg1 ... argn n othersubr# CALLOTHERSUBR - */
+ /* Make calls on the PostScript interpreter */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ Num = Stack[Top-1];
+ if (Top < Num+1) Error0("DoCommand: Stack low\n");
+ for (i = 0; i < Num; i++) PSFakePush(Stack[Top - i - 2]);
+ Top -= Num + 2;
+ CallOtherSubr((int)Stack[Top + Num + 2]);
+ break;
+ case POP: /* - POP number */
+ /* Removes a number from the top of the */
+ /* PostScript interpreter stack and pushes it */
+ /* onto the Type 1 BuildChar operand stack */
+ Push(PSFakePop());
+ break;
+ case SETCURRENTPOINT: /* |- x y SETCURRENTPOINT |- */
+ /* Sets the current point to (x,y) in absolute */
+ /* character space coordinates without per- */
+ /* forming a CharString MOVETO command */
+ if (Top < 1) Error0("DoCommand: Stack low\n");
+ SetCurrentPoint(Stack[0], Stack[1]);
+ ClearStack();
+ break;
+ default: /* Unassigned escape code command */
+ ClearStack();
+ Error1("Escape: Unassigned code %d\n", Code);
+ }
+}
+
+/* |- y dy HSTEM |- */
+/* Declares the vertical range of a horizontal stem zone */
+/* between coordinates y and y + dy */
+/* y is relative to the left sidebearing point */
+static void HStem(DOUBLE y, DOUBLE dy)
+{
+ IfTrace2((FontDebug), "Hstem %f %f\n", y, dy);
+ if (ProcessHints) {
+ if (numstems >= MAXSTEMS) Error0("HStem: Too many hints\n");
+ if (dy < 0.0) {y += dy; dy = -dy;}
+ stems[numstems].vertical = FALSE;
+ stems[numstems].x = 0.0;
+ stems[numstems].y = sidebearingY + y + wsoffsetY;
+ stems[numstems].dx = 0.0;
+ stems[numstems].dy = dy;
+ ComputeStem(numstems);
+ numstems++;
+ }
+}
+
+/* |- x dx VSTEM |- */
+/* Declares the horizontal range of a vertical stem zone */
+/* between coordinates x and x + dx */
+/* x is relative to the left sidebearing point */
+static void VStem(DOUBLE x, DOUBLE dx)
+{
+ IfTrace2((FontDebug), "Vstem %f %f\n", x, dx);
+ if (ProcessHints) {
+ if (numstems >= MAXSTEMS) Error0("VStem: Too many hints\n");
+ if (dx < 0.0) {x += dx; dx = -dx;}
+ stems[numstems].vertical = TRUE;
+ stems[numstems].x = sidebearingX + x + wsoffsetX;
+ stems[numstems].y = 0.0;
+ stems[numstems].dx = dx;
+ stems[numstems].dy = 0.0;
+ ComputeStem(numstems);
+ numstems++;
+ }
+}
+
+/* |- dx dy RLINETO |- */
+/* Behaves like RLINETO in PostScript */
+static void RLineTo(DOUBLE dx, DOUBLE dy)
+{
+ struct segment *B;
+
+ IfTrace2((FontDebug), "RLineTo %f %f\n", dx, dy);
+
+ B = Loc(CharSpace, dx, dy);
+
+ if (ProcessHints) {
+ currx += dx;
+ curry += dy;
+ /* B = Join(B, FindStems(currx, curry)); */
+ B = Join(B, FindStems(currx, curry, dx, dy));
+ }
+
+ path = Join(path, Line(B));
+}
+
+/* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */
+/* Relative RCURVETO, equivalent to dx1 dy1 */
+/* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */
+/* (dy1+dy2+dy3) RCURVETO in PostScript */
+static void RRCurveTo(DOUBLE dx1, DOUBLE dy1, DOUBLE dx2, DOUBLE dy2, DOUBLE dx3, DOUBLE dy3)
+{
+ struct segment *B, *C, *D;
+
+ IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", dx1, dy1, dx2, dy2);
+ IfTrace2((FontDebug), "%f %f\n", dx3, dy3);
+
+ B = Loc(CharSpace, dx1, dy1);
+ C = Loc(CharSpace, dx2, dy2);
+ D = Loc(CharSpace, dx3, dy3);
+
+ if (ProcessHints) {
+ /* For a Bezier curve, we apply the full hint value to
+ the Bezier C point (and thereby D point). */
+ currx += dx1 + dx2 + dx3;
+ curry += dy1 + dy2 + dy3;
+ /* C = Join(C, FindStems(currx, curry)); */
+ C = Join(C, FindStems(currx, curry, dx3, dy3));
+ }
+
+ /* Since XIMAGER is not completely relative, */
+ /* we need to add up the delta values */
+
+ C = Join(C, (struct segment *)Dup((struct xobject *)B));
+ D = Join(D, (struct segment *)Dup((struct xobject *)C));
+
+ path = Join(path, (struct segment *)Bezier(B, C, D));
+}
+
+/* - CLOSEPATH |- */
+/* Closes a subpath WITHOUT repositioning the */
+/* current point */
+static void DoClosePath(void)
+{
+ struct segment *CurrentPoint;
+
+ IfTrace0((FontDebug), "DoClosePath\n");
+ CurrentPoint = Phantom(path);
+ path = ClosePath(path);
+ path = Join(Snap(path), CurrentPoint);
+}
+
+/* subr# CALLSUBR - */
+/* Calls a CharString subroutine with index */
+/* subr# from the Subrs array */
+static void CallSubr(int subrno)
+{
+ IfTrace1((FontDebug), "CallSubr %d\n", subrno);
+ if ((subrno < 0) || (subrno >= SubrsP->len))
+ Error0("CallSubr: subrno out of range\n");
+ PushCall(CharStringP, strindex, r);
+ CharStringP = &SubrsP->data.arrayP[subrno];
+ StartDecrypt();
+}
+
+/* - RETURN - */
+/* Returns from a Subrs array CharString */
+/* subroutine called with CALLSUBR */
+static void Return(void)
+{
+ IfTrace0((FontDebug), "Return\n");
+ PopCall(&CharStringP, &strindex, &r);
+}
+
+/* - ENDCHAR |- */
+/* Finishes a CharString outline */
+/* Executes SETCHACHEDEVICE using a bounding box */
+/* it computes directly from the character outline */
+/* and using the width information acquired from a previous */
+/* HSBW or SBW. It then calls a special version of FILL */
+/* or STROKE depending on the value of PaintType in the */
+/* font dictionary */
+static void EndChar(void)
+{
+ IfTrace0((FontDebug), "EndChar\n");
+
+ /* There is no need to compute and set bounding box for
+ the cache, since XIMAGER does that on the fly. */
+
+ /* Perform a Closepath just in case the command was left out */
+ path = ClosePath(path);
+
+ /* Set character width */
+ path = Join(Snap(path), Loc(CharSpace, escapementX, escapementY));
+
+}
+
+/* |- dx dy RMOVETO |- */
+/* Behaves like RMOVETO in PostScript */
+static void RMoveTo(DOUBLE dx, DOUBLE dy)
+{
+ struct segment *B;
+
+ IfTrace2((FontDebug), "RMoveTo %f %f\n", dx, dy);
+
+ B = Loc(CharSpace, dx, dy);
+
+ if (ProcessHints) {
+ currx += dx;
+ curry += dy;
+ /* B = Join(B, FindStems(currx, curry)); */
+ B = Join(B, FindStems(currx, curry, 0.0, 0.0));
+ }
+
+ path = Join(path, B);
+}
+
+/* - DOTSECTION |- */
+/* Brackets an outline section for the dots in */
+/* letters such as "i", "j", and "!". */
+static void DotSection(void)
+{
+ IfTrace0((FontDebug), "DotSection\n");
+ InDotSection = !InDotSection;
+}
+
+/* |- asb adx ady bchar achar SEAC |- */
+/* Standard Encoding Accented Character. */
+static void Seac(DOUBLE asb, DOUBLE adx, DOUBLE ady,
+ unsigned char bchar, unsigned char achar)
+{
+ int Code;
+ struct segment *mypath;
+
+ IfTrace4((FontDebug), "SEAC %f %f %f %d ", asb, adx, ady, bchar);
+ IfTrace1((FontDebug), "%d\n", achar);
+
+ /* Move adx - asb, ady over and up from base char's sbpoint. */
+ /* (We use adx - asb to counteract the accents sb shift.) */
+ /* The variables accentoffsetX/Y modify sidebearingX/Y in Sbw(). */
+ /* Note that these incorporate the base character's sidebearing shift by */
+ /* using the current sidebearingX, Y values. */
+ accentoffsetX = sidebearingX + adx - asb;
+ accentoffsetY = sidebearingY + ady;
+
+ /* Set path = NULL to avoid complaints from Sbw(). */
+ path = NULL;
+
+ /* Go find the CharString for the accent's code via an upcall */
+ CharStringP = GetType1CharString(Environment, achar);
+ if (CharStringP == NULL) {
+ Error1("Invalid accent ('%03o) in SEAC\n", achar);
+ return;
+ }
+ StartDecrypt();
+
+ ClearStack();
+ ClearPSFakeStack();
+ ClearCallStack();
+
+ for (;;) {
+ if (!DoRead(&Code)) break;
+ Decode(Code);
+ if (errflag) return;
+ }
+ /* Copy snapped path to mypath and set path to NULL as above. */
+ mypath = Snap(path);
+ path = NULL;
+
+ /* We must reset these to null now. */
+ accentoffsetX = accentoffsetY = 0;
+
+ /* go find the CharString for the base char's code via an upcall */
+ CharStringP = GetType1CharString(Environment, bchar);
+ StartDecrypt();
+
+ ClearStack();
+ ClearPSFakeStack();
+ ClearCallStack();
+
+ FinitStems();
+ InitStems();
+
+ for (;;) {
+ if (!DoRead(&Code)) break;
+ Decode(Code);
+ if (errflag) return;
+ }
+ path = Join(mypath, path);
+}
+
+
+/* |- sbx sby wx wy SBW |- */
+/* Set the left sidebearing point to (sbx,sby), */
+/* set the character width vector to (wx,wy). */
+static void Sbw(DOUBLE sbx, DOUBLE sby, DOUBLE wx, DOUBLE wy)
+{
+ IfTrace4((FontDebug), "SBW %f %f %f %f\n", sbx, sby, wx, wy);
+
+ escapementX = wx; /* Character width vector */
+ escapementY = wy;
+
+ /* Sidebearing values are sbx, sby args, plus accent offset from Seac(). */
+ sidebearingX = sbx + accentoffsetX;
+ sidebearingY = sby + accentoffsetY;
+
+ path = Join(path, Loc(CharSpace, sidebearingX, sidebearingY));
+ if (ProcessHints) {currx = sidebearingX; curry = sidebearingY;}
+}
+
+ /* num1 num2 DIV quotient */
+/* Behaves like DIV in the PostScript language */
+static DOUBLE Div(DOUBLE num1, DOUBLE num2)
+{
+ IfTrace2((FontDebug), "Div %f %f\n", num1, num2);
+ return(num1 / num2);
+}
+
+/*
+ The following four subroutines (FlxProc, FlxProc1, FlxProc2, and
+ HintReplace) are C versions of the OtherSubrs Programs, which were
+ were published in the Adobe Type 1 Font Format book.
+
+ The Flex outline fragment is described by
+ c1: (x0, y0) = c3: (x0, yshrink(y0)) or (xshrink(x0), y0)
+ " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1)
+ " (x2, y2) - reference point
+ c2: (x0, y0) = c4: (x0, yshrink(y0)) or (xshrink(x0), y0)
+ " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1)
+ " (x2, y2) = " (x2, y2), rightmost endpoint
+ c3: (x0, y0) - control point, 1st Bezier curve
+ " (x1, y1) - control point, -"-
+ " (x2, y2) - end point, -"-
+ c4: (x0, y0) - control point, 2nd Bezier curve
+ " (x1, y1) - control point, -"-
+ " (x2, y2) - end point, -"-
+ ep: (epY, epX) - final endpoint (should be same as c4: (x2, y2))
+ idmin - minimum Flex height (1/100 pixel) at which to render curves
+*/
+
+#define dtransform(dxusr,dyusr,dxdev,dydev) { \
+ register struct segment *point = Loc(CharSpace, dxusr, dyusr); \
+ QueryLoc(point, IDENTITY, dxdev, dydev); \
+ Destroy(point); \
+}
+
+#define itransform(xdev,ydev,xusr,yusr) { \
+ register struct segment *point = Loc(IDENTITY, xdev, ydev); \
+ QueryLoc(point, CharSpace, xusr, yusr); \
+ Destroy(point); \
+}
+
+#define transform(xusr,yusr,xdev,ydev) dtransform(xusr,yusr,xdev,ydev)
+
+#define PaintType (0)
+
+#define lineto(x,y) { \
+ struct segment *CurrentPoint; \
+ DOUBLE CurrentX, CurrentY; \
+ CurrentPoint = Phantom(path); \
+ QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \
+ Destroy(CurrentPoint); \
+ RLineTo(x - CurrentX, y - CurrentY); \
+}
+
+#define curveto(x0,y0,x1,y1,x2,y2) { \
+ struct segment *CurrentPoint; \
+ DOUBLE CurrentX, CurrentY; \
+ CurrentPoint = Phantom(path); \
+ QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \
+ Destroy(CurrentPoint); \
+ RRCurveTo(x0 - CurrentX, y0 - CurrentY, x1 - x0, y1 - y0, x2 - x1, y2 - y1); \
+}
+
+#define xshrink(x) ((x - c4x2) * shrink +c4x2)
+#define yshrink(y) ((y - c4y2) * shrink +c4y2)
+
+#define PickCoords(flag) \
+ if (flag) { /* Pick "shrunk" coordinates */ \
+ x0 = c1x0; y0 = c1y0; \
+ x1 = c1x1; y1 = c1y1; \
+ x2 = c1x2; y2 = c1y2; \
+ x3 = c2x0; y3 = c2y0; \
+ x4 = c2x1; y4 = c2y1; \
+ x5 = c2x2; y5 = c2y2; \
+ } else { /* Pick original coordinates */ \
+ x0 = c3x0; y0 = c3y0; \
+ x1 = c3x1; y1 = c3y1; \
+ x2 = c3x2; y2 = c3y2; \
+ x3 = c4x0; y3 = c4y0; \
+ x4 = c4x1; y4 = c4y1; \
+ x5 = c4x2; y5 = c4y2; \
+ }
+
+/* FlxProc() = OtherSubrs[0]; Main part of Flex */
+/* Calling sequence: 'idmin epX epY 3 0 callothersubr' */
+/* Computes Flex values, and renders the Flex path, */
+/* and returns (leaves) ending coordinates on stack */
+static void FlxProc(DOUBLE c1x2, DOUBLE c1y2,
+ DOUBLE c3x0, DOUBLE c3y0, DOUBLE c3x1, DOUBLE c3y1, DOUBLE c3x2, DOUBLE c3y2,
+ DOUBLE c4x0, DOUBLE c4y0, DOUBLE c4x1, DOUBLE c4y1, DOUBLE c4x2, DOUBLE c4y2,
+ DOUBLE epY, DOUBLE epX, int idmin)
+{
+ DOUBLE dmin;
+ DOUBLE c1x0, c1y0, c1x1, c1y1;
+ DOUBLE c2x0, c2y0, c2x1, c2y1, c2x2, c2y2;
+ char yflag;
+ DOUBLE x0, y0, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5;
+ DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */
+ int flipXY;
+ DOUBLE x, y;
+ DOUBLE erosion = 1; /* Device parameter */
+ /* Erosion may have different value specified in 'internaldict' */
+ DOUBLE shrink;
+ DOUBLE dX, dY;
+ char erode;
+ DOUBLE eShift;
+ DOUBLE cx, cy;
+ DOUBLE ex, ey;
+
+ Destroy(path);
+ path = FlxOldPath; /* Restore previous path (stored in FlxProc1) */
+
+ if (ProcessHints) {
+ dmin = ABS(idmin) / 100.0; /* Minimum Flex height in pixels */
+
+ c2x2 = c4x2; c2y2 = c4y2; /* Point c2 = c4 */
+
+ yflag = FABS(c1y2 - c3y2) > FABS(c1x2 - c3x2); /* Flex horizontal? */
+
+ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */
+
+ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001)
+ flipXY = -1; /* Char on side */
+ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001)
+ flipXY = 1; /* Char upright */
+ else
+ flipXY = 0; /* Char at angle */
+
+ if (yflag) { /* Flex horizontal */
+ if (flipXY == 0 || c3y2 == c4y2) { /* Char at angle or Flex height = 0 */
+ PickCoords(FALSE); /* Pick original control points */
+ } else {
+ shrink = FABS((c1y2 - c4y2) / (c3y2 - c4y2)); /* Slope */
+
+ c1x0 = c3x0; c1y0 = yshrink(c3y0);
+ c1x1 = c3x1; c1y1 = yshrink(c3y1);
+ c2x0 = c4x0; c2y0 = yshrink(c4y0);
+ c2x1 = c4x1; c2y1 = yshrink(c4y1);
+
+ dtransform(0.0, ROUND(c3y2-c1y2), &x, &y); /* Flex height in pixels */
+ dY = FABS((flipXY == 1) ? y : x);
+ PickCoords(dY < dmin); /* If Flex small, pick 'shrunk' control points */
+
+ if (FABS(y2 - c1y2) > 0.001) { /* Flex 'non-zero'? */
+ transform(c1x2, c1y2, &x, &y);
+
+ if (flipXY == 1) {
+ cx = x; cy = y;
+ } else {
+ cx = y; cy = x;
+ }
+
+ dtransform(0.0, ROUND(y2-c1y2), &x, &y);
+ dY = (flipXY == 1) ? y : x;
+ if (ROUND(dY) != 0)
+ dY = ROUND(dY);
+ else
+ dY = (dY < 0) ? -1 : 1;
+
+ erode = PaintType != 2 && erosion >= 0.5;
+ if (erode)
+ cy -= 0.5;
+ ey = cy + dY;
+ ey = CEIL(ey) - ey + FLOOR(ey);
+ if (erode)
+ ey += 0.5;
+
+ if (flipXY == 1) {
+ itransform(cx, ey, &x, &y);
+ } else {
+ itransform(ey, cx, &x, &y);
+ }
+
+ eShift = y - y2;
+ y1 += eShift;
+ y2 += eShift;
+ y3 += eShift;
+ }
+ }
+ } else { /* Flex vertical */
+ if (flipXY == 0 || c3x2 == c4x2) { /* Char at angle or Flex height = 0 */
+ PickCoords(FALSE); /* Pick original control points */
+ } else {
+ shrink = FABS((c1x2 - c4x2) / (c3x2 - c4x2)); /* Slope */
+
+ c1x0 = xshrink(c3x0); c1y0 = c3y0;
+ c1x1 = xshrink(c3x1); c1y1 = c3y1;
+ c2x0 = xshrink(c4x0); c2y0 = c4y0;
+ c2x1 = xshrink(c4x1); c2y1 = c4y1;
+
+ dtransform(ROUND(c3x2 - c1x2), 0.0, &x, &y); /* Flex height in pixels */
+ dX = FABS((flipXY == -1) ? y : x);
+ PickCoords(dX < dmin); /* If Flex small, pick 'shrunk' control points */
+
+ if (FABS(x2 - c1x2) > 0.001) {
+ transform(c1x2, c1y2, &x, &y);
+ if (flipXY == -1) {
+ cx = y; cy = x;
+ } else {
+ cx = x; cy = y;
+ }
+
+ dtransform(ROUND(x2-c1x2), 0.0, &x, &y);
+ dX = (flipXY == -1) ? y : x;
+ if (ROUND(dX) != 0)
+ dX = ROUND(dX);
+ else
+ dX = (dX < 0) ? -1 : 1;
+
+ erode = PaintType != 2 && erosion >= 0.5;
+ if (erode)
+ cx -= 0.5;
+ ex = cx + dX;
+ ex = CEIL(ex) - ex + FLOOR(ex);
+ if (erode)
+ ex += 0.5;
+
+ if (flipXY == -1) {
+ itransform(cy, ex, &x, &y);
+ } else {
+ itransform(ex, cy, &x, &y);
+ }
+
+ eShift = x - x2;
+ x1 += eShift;
+ x2 += eShift;
+ x3 += eShift;
+ }
+ }
+ }
+
+ if (x2 == x5 || y2 == y5) {
+ lineto(x5, y5);
+ } else {
+ curveto(x0, y0, x1, y1, x2, y2);
+ curveto(x3, y3, x4, y4, x5, y5);
+ }
+ } else { /* ProcessHints is off */
+ PickCoords(FALSE); /* Pick original control points */
+ curveto(x0, y0, x1, y1, x2, y2);
+ curveto(x3, y3, x4, y4, x5, y5);
+ }
+
+ PSFakePush(epY);
+ PSFakePush(epX);
+}
+
+/* FlxProc1() = OtherSubrs[1]; Part of Flex */
+/* Calling sequence: '0 1 callothersubr' */
+/* Saves and clears path, then restores currentpoint */
+static void FlxProc1(void)
+{
+ struct segment *CurrentPoint;
+
+ CurrentPoint = Phantom(path);
+
+ FlxOldPath = path;
+ path = CurrentPoint;
+}
+
+/* FlxProc2() = OtherSubrs[2]; Part of Flex */
+/* Calling sequence: '0 2 callothersubr' */
+/* Returns currentpoint on stack */
+static void FlxProc2(void)
+{
+ struct segment *CurrentPoint;
+ DOUBLE CurrentX, CurrentY;
+
+ CurrentPoint = Phantom(path);
+ QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY);
+ Destroy(CurrentPoint);
+
+ /* Push CurrentPoint on fake PostScript stack */
+ PSFakePush(CurrentX);
+ PSFakePush(CurrentY);
+}
+
+/* HintReplace() = OtherSubrs[3]; Hint Replacement */
+/* Calling sequence: 'subr# 1 3 callothersubr pop callsubr' */
+/* Reinitializes stem hint structure */
+static void HintReplace(void)
+{
+ /* Effectively retire the current stems, but keep them around for */
+ /* revhint use in case we are in a stem when we replace hints. */
+ currstartstem = numstems;
+
+ /* 'subr#' is left on PostScript stack (for 'pop callsubr') */
+}
+
+/* arg1 ... argn n othersubr# CALLOTHERSUBR - */
+/* Make calls on the PostScript interpreter (or call equivalent C code) */
+/* NOTE: The n arguments have been pushed on the fake PostScript stack */
+static void CallOtherSubr(int othersubrno)
+{
+ IfTrace1((FontDebug), "CallOtherSubr %d\n", othersubrno);
+
+ switch(othersubrno) {
+ case 0: /* OtherSubrs[0]; Main part of Flex */
+ if (PSFakeTop < 16) Error0("CallOtherSubr: PSFakeStack low");
+ ClearPSFakeStack();
+ FlxProc(
+ PSFakeStack[0], PSFakeStack[1], PSFakeStack[2], PSFakeStack[3],
+ PSFakeStack[4], PSFakeStack[5], PSFakeStack[6], PSFakeStack[7],
+ PSFakeStack[8], PSFakeStack[9], PSFakeStack[10], PSFakeStack[11],
+ PSFakeStack[12], PSFakeStack[13], PSFakeStack[14], PSFakeStack[15],
+ (int) PSFakeStack[16]
+ );
+ break;
+ case 1: /* OtherSubrs[1]; Part of Flex */
+ FlxProc1();
+ break;
+ case 2: /* OtherSubrs[2]; Part of Flex */
+ FlxProc2();
+ break;
+ case 3: /* OtherSubrs[3]; Hint Replacement */
+ HintReplace();
+ break;
+ default: { /* call OtherSubrs[4] or higher if PostScript is present */
+ }
+ }
+}
+
+/* |- x y SETCURRENTPOINT |- */
+/* Sets the current point to (x,y) in absolute */
+/* character space coordinates without per- */
+/* forming a CharString MOVETO command */
+static void SetCurrentPoint(DOUBLE x, DOUBLE y)
+{
+ IfTrace2((FontDebug), "SetCurrentPoint %f %f\n", x, y);
+
+ currx = x;
+ curry = y;
+}
+
+/* The Type1Char routine for use by PostScript. */
+/************************************************/
+struct xobject *Type1Char(
+ psfont *FontP,
+ struct XYspace *S,
+ psobj *charstrP,
+ psobj *subrsP,
+ psobj *osubrsP,
+ struct blues_struct *bluesP, /* FontID's ptr to the blues struct */
+ int *modeP)
+{
+ int Code;
+
+ path = NULL;
+ errflag = FALSE;
+
+ /* Make parameters available to all Type1 routines */
+ Environment = FontP;
+ CharSpace = S; /* used when creating path elements */
+ CharStringP = charstrP;
+ SubrsP = subrsP;
+ OtherSubrsP = osubrsP;
+ ModeP = modeP;
+
+ blues = bluesP;
+
+ /* compute the alignment zones */
+ ComputeAlignmentZones();
+
+ StartDecrypt();
+
+ ClearStack();
+ ClearPSFakeStack();
+ ClearCallStack();
+
+ InitStems();
+
+ currx = curry = 0;
+ escapementX = escapementY = 0;
+ sidebearingX = sidebearingY = 0;
+ accentoffsetX = accentoffsetY = 0;
+ wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */
+ wsset = 0; /* wsoffsetX,Y haven't been set yet. */
+
+ for (;;) {
+ if (!DoRead(&Code)) break;
+ Decode(Code);
+ if (errflag) break;
+ }
+
+ FinitStems();
+
+
+ /* Clean up if an error has occurred */
+ if (errflag) {
+ if (path != NULL) {
+ Destroy(path); /* Reclaim storage */
+ path = NULL; /* Indicate that character could not be built */
+ }
+ }
+
+ return((struct xobject *) path);
+}
+
diff --git a/fonts/utilities/ps2pk/types.h b/fonts/utilities/ps2pk/types.h
new file mode 100644
index 0000000000..f9e78c2f14
--- /dev/null
+++ b/fonts/utilities/ps2pk/types.h
@@ -0,0 +1,33 @@
+/* File: types.h
+ * Purpose: define basic types so that program is portable to non 32 bits
+ * platforms
+ * Author: Piet Tutelaers
+ * (see README for license)
+ */
+
+#ifndef __PS2PK_TYPES__
+#define __PS2PK_TYPES__
+
+#ifdef HAVE_CONFIG_H
+#include "c-auto.h"
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifdef KPATHSEA
+#include <kpathsea/kpathsea.h>
+#endif /* KPATHSEA */
+
+typedef unsigned short USHORT; /* 16 bits */
+typedef short SHORT; /* 16 bits */
+typedef double DOUBLE; /* 64 bits */
+
+typedef char *encoding[256];
+extern void getenc(char **, char **, encoding, int [256]);
+
+#endif /* __PS2PK_TYPES__ */
diff --git a/fonts/utilities/ps2pk/usenet b/fonts/utilities/ps2pk/usenet
new file mode 100644
index 0000000000..14dd5523f7
--- /dev/null
+++ b/fonts/utilities/ps2pk/usenet
@@ -0,0 +1,64 @@
+Path: tuegate.tue.nl!rw6.urc.tue.nl!rcpt
+From: rcpt@rw6.urc.tue.nl (Piet Tutelaers)
+Newsgroups: comp.text.tex
+Subject: Re: ps2mf
+Message-ID: <rcpt.714861633@rw6.urc.tue.nl>
+Date: 26 Aug 92 20:40:33 GMT
+References: <memo.585707@cix.compulink.co.uk> <ILH.92Aug20112742@winnie-the-pooh.lcs.mit.edu> <1992Aug22.112526.13957@cnix.uucp> <4847@news.duke.edu>
+Sender: root@tuegate.tue.nl
+Reply-To: rcpt@urc.tue.nl
+Lines: 52
+
+jbrehm@acpub.duke.edu (John Brehm) writes:
+
+>I need to convert some postscript fonts for use with the emTeX dvihplj
+>drivers, but at sizes that differ from the standard 10pt. I can
+>easily generate fonts of arbitrary sizes with ps2pk (great tool!),
+>but how do I produce the right .tfm files? That is, if I include
+>the line:
+> \font\opt12=optima at 12pt
+>I get the error message (from LaTeX):
+> ! Font \opt=optima not loadable: Bad metric (TFM) file.
+
+>Any thoughts?
+
+I see that my ps2pk.README does not explain this clearly. So here is a try
+to correct that.
+
+1) Get the latest afm2tfm coming with dvips. You need at least version 7.0
+of afm2tfm othewise the checksums of TFM files generated by afm2tfm and PK
+files generated by ps2pk will be different. Try ftp.urc.tue.nl:pub/tex or
+labrea.stanford.edu for the latest sources. MSDOS binaries are (or will
+become) available in :pub/tex/emtex/dvips.zip.
+
+2) You should have VPtoVF a fonttool coming with emTeX: converts a Virtual
+Property Font format (.vpl: ASCII) to Virtual Font format (.vf: binary).
+
+3) It is possible to name your TeX font `optima' but real TeX-ers
+prefer `popr', a name that can be used on MSDOS (and that can be found
+from grep-ing in the file adobe coming with dvips). You will need:
+ 1) emtex\tfm\popr.tfm
+ 2) emtex\vf\popr.vf
+ 3) emtex\tfm\rpopr.tfm
+ 4) emtex\pixel.lj\360dpi\rpopr.pk (360=12/10*300)
+
+4) To generate them:
+ afm2tfm Optima.afm -v popr.vpl rpopr.tfm
+ vptovf popr.vpl popr.vf popr.tfm
+ (delete popr.vpl if you like)
+ ps2pk -X360 -v Optima.pfb rpopr.360pk
+
+5) To use them install all TFM, VF and PK fonts on their proper place.
+Check that they will be located there and use now within plain TeX
+(especially check that emtex\lj.cnf contains a line telling dvihplj where
+to find its VF fonts. I have no MSDOS machine nearby, so I can't tell what
+exact line you need):
+ \font\opt12=popr at 12pt
+
+The bunch of files are necessary to map PostScript fonts to TeX (virtual
+magic).
+
+Hope this brings some light,
+
+--Piet
+
diff --git a/fonts/utilities/ps2pk/util.c b/fonts/utilities/ps2pk/util.c
new file mode 100644
index 0000000000..3c7b82ca9d
--- /dev/null
+++ b/fonts/utilities/ps2pk/util.c
@@ -0,0 +1,178 @@
+/* $XConsortium: util.c,v 1.6 92/03/26 16:42:26 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */
+
+#include "types.h"
+#include <stdio.h>
+#include "util.h"
+#include "fontmisc.h"
+
+static char *vm_base = NULL; /* Start of virtual memory area */
+ char *vm_next = NULL; /* Pointer to first free byte */
+ int32_t vm_free = 0; /* Count of free bytes */
+ int32_t vm_size = 0; /* Total size of memory */
+
+/*
+ * Initialize memory.
+ */
+
+boolean vm_init(void)
+{
+ vm_next = vm_base = (char *) Xalloc(MAX_STRING_LEN);
+
+ if (vm_base != NULL) {
+ vm_free = MAX_STRING_LEN;
+ vm_size = MAX_STRING_LEN;
+ tokenMaxP = vm_next_byte() + MAX_STRING_LEN;
+ return(TRUE);
+ }
+ else
+ return(FALSE);
+}
+
+char *vm_alloc(unsigned int bytes)
+{
+ char *answer;
+
+ /* Align returned bytes to 64-bit boundary */
+ bytes = (bytes + 7) & ~7;
+
+ /* take space from what is left otherwise allocate another CHUNK */
+ if (bytes > vm_free)
+ if (!vm_init()) return NULL;
+ if (bytes <= vm_free) {
+ answer = vm_next;
+ vm_free -= bytes;
+ vm_next += bytes;
+ return answer;
+ }
+ else {
+ printf("Trying to allocate %d bytes (%d maximum)\n", bytes, MAX_STRING_LEN);
+ return NULL;
+ }
+}
+
+/*
+ * Format an Integer object
+ */
+void objFormatInteger(psobj *objP, int value)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_INTEGER;
+ objP->len = 0;
+ objP->data.integer = value;
+ }
+}
+
+/*
+ * Format a Real object
+ */
+void objFormatReal(psobj *objP, float value)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_REAL;
+ objP->len = 0;
+ objP->data.real = value;
+ }
+}
+
+/*
+ * Format a Boolean object
+ */
+void objFormatBoolean(psobj *objP, boolean value)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_BOOLEAN;
+ objP->len = 0;
+ objP->data.boolean = value;
+ }
+}
+
+/*
+ * Format an Encoding object
+ */
+void objFormatEncoding(psobj *objP, int length, psobj *valueP)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_ENCODING;
+ objP->len = length;
+ objP->data.arrayP = valueP;
+ }
+}
+
+/*
+ * Format an Array object
+ */
+void objFormatArray(psobj *objP, int length, psobj *valueP)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_ARRAY;
+ objP->len = length;
+ objP->data.arrayP = valueP;
+ }
+}
+
+
+/*
+ * Format a String object
+ */
+void objFormatString(psobj *objP, int length, char *valueP)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_STRING;
+ objP->len = length;
+ objP->data.valueP = valueP;
+ }
+}
+
+/*
+ * Format a Name object
+ */
+void objFormatName(psobj *objP, int length, const char *valueP)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_NAME;
+ objP->len = length;
+ objP->data.nameP = valueP;
+ }
+}
+
+/*
+ * Format a File object
+ */
+void objFormatFile(psobj *objP, FILE *valueP)
+{
+ if (objP != NULL) {
+ objP->type = OBJ_FILE;
+ objP->len = 0;
+ objP->data.fileP = valueP;
+ }
+}
+
diff --git a/fonts/utilities/ps2pk/util.h b/fonts/utilities/ps2pk/util.h
new file mode 100644
index 0000000000..f38f9519d7
--- /dev/null
+++ b/fonts/utilities/ps2pk/util.h
@@ -0,0 +1,209 @@
+/* $XConsortium: util.h,v 1.3 92/03/26 16:42:29 eswu Exp $ */
+/* Copyright International Business Machines,Corp. 1991
+ * All Rights Reserved
+ *
+ * License to use, copy, modify, and distribute this software
+ * and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice
+ * appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation,
+ * and that the name of IBM not be used in advertising or
+ * publicity pertaining to distribution of the software without
+ * specific, written prior permission.
+ *
+ * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES
+ * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT
+ * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND
+ * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
+ * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF
+ * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES
+ * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN
+ * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+#ifndef UTIL_H
+#define UTIL_H
+#include "types.h"
+
+#ifndef KPATHSEA
+#ifndef boolean
+typedef int boolean;
+#endif
+#endif
+
+#ifndef TRUE
+#define TRUE (1)
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/***================================================================***/
+/* Portable definitions for 2's complement machines.
+ * NOTE: These really should be based on PostScript types,
+ * for example, sizeof(ps_integer), or sizeof(ps_unsigned)
+ */
+#define MAX_INT32 (~(uint32_t)(0))
+/* This code is portable, assuming K&R C and 2's complement arithmetic */
+#define MAX_INTEGER \
+ ((int32_t)((((uint32_t) 1)<<(sizeof(uint32_t)*8-1))-1))
+#define MIN_INTEGER ((-MAX_INTEGER)-1)
+
+#define MAX_ARRAY_CNT (65535)
+#define MAX_DICT_CNT (65535)
+#define MAX_STRING_LEN (65535)
+#define MAX_NAME_LEN (128)
+
+/* this is the size of memory allocated for reading fonts */
+
+#define VM_SIZE (50*1024)
+/***================================================================***/
+
+#ifndef MIN
+#define MIN(a,b) (((a)<(b)) ? a : b )
+#endif
+
+/***================================================================***/
+/* Routines for managing virtual memory */
+/***================================================================***/
+extern boolean vm_init(void);
+extern int32_t vm_free;
+extern int32_t vm_size;
+extern char *vm_next;
+extern char *vm_alloc(unsigned int bytes);
+/***================================================================***/
+/* Macros for managing virtual memory */
+/***================================================================***/
+#define vm_next_byte() (vm_next)
+#define vm_free_bytes() (vm_free)
+#define vm_avail(B) (B <= vm_free)
+
+
+
+/***================================================================***/
+/* Types of PostScript objects */
+/***================================================================***/
+#define OBJ_INTEGER (0)
+#define OBJ_REAL (1)
+#define OBJ_BOOLEAN (2)
+#define OBJ_ARRAY (3)
+#define OBJ_STRING (4)
+#define OBJ_NAME (5)
+#define OBJ_FILE (6)
+#define OBJ_ENCODING (7)
+
+/***================================================================***/
+/* Value of PostScript objects */
+/***================================================================***/
+typedef union ps_value {
+ char *valueP; /* value pointer for unspecified type */
+ int value; /* value for unspecified type */
+ int integer; /* when type is OBJ_INTEGER */
+ float real; /* when type is OBJ_REAL */
+ int boolean; /* when type is OBJ_BOOLEAN */
+ struct ps_obj *arrayP; /* when type is OBJ_ARRAY */
+ unsigned char *stringP; /* when type is OBJ_STRING */
+ const char *nameP; /* when type is OBJ_NAME */
+ FILE *fileP; /* when type is OBJ_FILE */
+} psvalue;
+
+/***================================================================***/
+/* Definition of a PostScript object */
+/***================================================================***/
+typedef struct ps_obj {
+ char type;
+ char unused;
+ unsigned short len;
+ union ps_value data;
+} psobj;
+
+/***================================================================***/
+/* Definition of a PostScript Dictionary Entry */
+/***================================================================***/
+typedef struct ps_dict {
+ psobj key;
+ psobj value;
+} psdict;
+
+/***================================================================***/
+/* Macros for testing type of PostScript objects */
+/***================================================================***/
+#define objIsInteger(o) ((o).type == OBJ_INTEGER)
+#define objIsReal(o) ((o).type == OBJ_REAL)
+#define objIsBoolean(o) ((o).type == OBJ_BOOLEAN)
+#define objIsArray(o) ((o).type == OBJ_ARRAY)
+#define objIsString(o) ((o).type == OBJ_STRING)
+#define objIsName(o) ((o).type == OBJ_NAME)
+#define objIsFile(o) ((o).type == OBJ_FILE)
+
+/***================================================================***/
+/* Macros for setting type of PostScript objects */
+/***================================================================***/
+#define objSetInteger(o) ((o).type = OBJ_INTEGER)
+#define objSetReal(o) ((o).type = OBJ_REAL)
+#define objSetBoolean(o) ((o).type = OBJ_BOOLEAN)
+#define objSetArray(o) ((o).type = OBJ_ARRAY)
+#define objSetString(o) ((o).type = OBJ_STRING)
+#define objSetName(o) ((o).type = OBJ_NAME)
+#define objSetFile(o) ((o).type = OBJ_FILE)
+
+/***================================================================***/
+/* Macros for testing type of PostScript objects (pointer access) */
+/***================================================================***/
+#define objPIsInteger(o) ((o)->type == OBJ_INTEGER)
+#define objPIsReal(o) ((o)->type == OBJ_REAL)
+#define objPIsBoolean(o) ((o)->type == OBJ_BOOLEAN)
+#define objPIsArray(o) ((o)->type == OBJ_ARRAY)
+#define objPIsString(o) ((o)->type == OBJ_STRING)
+#define objPIsName(o) ((o)->type == OBJ_NAME)
+#define objPIsFile(o) ((o)->type == OBJ_FILE)
+
+/***================================================================***/
+/* Macros for setting type of PostScript objects (pointer access) */
+/***================================================================***/
+#define objPSetInteger(o) ((o)->type = OBJ_INTEGER)
+#define objPSetReal(o) ((o)->type = OBJ_REAL)
+#define objPSetBoolean(o) ((o)->type = OBJ_BOOLEAN)
+#define objPSetArray(o) ((o)->type = OBJ_ARRAY)
+#define objPSetString(o) ((o)->type = OBJ_STRING)
+#define objPSetName(o) ((o)->type = OBJ_NAME)
+#define objPSetFile(o) ((o)->type = OBJ_FILE)
+
+extern void objFormatInteger(psobj *,int);
+extern void objFormatReal(psobj *, float);
+extern void objFormatBoolean(psobj *, boolean);
+extern void objFormatEncoding(psobj *, int, psobj *);
+extern void objFormatArray(psobj *, int, psobj *);
+extern void objFormatString(psobj *, int, char *);
+extern void objFormatName(psobj *, int, const char *);
+extern void objFormatFile(psobj *, FILE *);
+
+extern void *Xalloc(size_t);
+extern void Xfree(void *);
+extern intptr_t MakeAtom(const char *, unsigned int, int);
+extern void QueryFontLib(char *, const char *, void *, int *);
+
+/*
+ * -------------------------------------------------------------------------
+ * Globals shared -- (everyone else KEEP YOUR MITTS OFF THEM!)
+ * -------------------------------------------------------------------------
+ */
+
+/* These variables are set by the caller */
+extern char *tokenStartP; /* Pointer to token buffer in VM */
+extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */
+
+/* These variables are set by P_TOKEN */
+extern int tokenLength; /* Characters in token */
+extern boolean tokenTooLong; /* Token too long for space available */
+extern int tokenType; /* Type of token identified */
+extern psvalue tokenValue; /* Token value */
+
+#endif
diff --git a/fonts/utilities/ps4mf-dos/ps4mf28.txt b/fonts/utilities/ps4mf-dos/ps4mf28.txt
new file mode 100644
index 0000000000..e5b9681473
--- /dev/null
+++ b/fonts/utilities/ps4mf-dos/ps4mf28.txt
@@ -0,0 +1,123 @@
+ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+ ³ -*- PS4MF -*- ³
+ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+ Version: 2.8 September 1995
+
+ (c) 1994, 1995 by Markus Neteler
+
+
+ Conversion of Postscript-Type1-fonts to TeX
+ (original cm-encoded metafont-files, no virtual fonts or nfss necessary)
+
+ CONTENTS
+
+ I. Description
+ II. Quality of characters
+ III. How to convert fonts
+
+ Appendix
+ IV. Some information about <font>.afm
+ V. Any problems?
+ VI. Where to get fonts
+ VII. New versions of ps4mfxx.zip
+ VIII. Copyright
+
+
+ I. Description of the ps4mf-package
+ ------------------------------------
+
+ In order to use Postscript-Type1-fonts for TeX without any special
+ encoding scheme (like dc, ec, nfss) you now can convert your favourite
+ postscript-font to Metafont-readable files.
+ This postscript-font has to be encoded in the "AdobeStandardEncoding-
+ scheme". The output is a metafont-file in stardard-computer-modern
+ encoding like the cm-family.
+
+ You also can get dc-encoding, just choose right conversion routine
+ (see below at chapter III.).
+
+ This package is based on the ps2mf-package of the authors:
+ Marcel Dings (original idea of the ps2mf-package) and Erik-Jan Vens (new
+ ps2mf.exe 2.0).
+
+
+ [...]
+
+ For more look into the package!
+
+ [...]
+
+ VI. WHERE TO GET FONTS:
+ -----------------------
+ (a) To get a nice listings, character-pictures and ftp-connections of fonts
+ try WWW with mosaic/netscape/etc.:
+
+ CTAN at WWW:
+ http://jasper.ora.com/
+
+ There is a fontpage which allows to look at fonts and download them
+ directly!
+
+
+ (b) You can get postscript-fonts via anonymous ftp at
+
+ - ftp.uni-stuttgart.de (mirror of hobbes.nmsu.edu)
+ /pub/systems/os2/hobbes-mirror/multimed/fonts
+
+ - ftp.uni-freiburg.de
+ /pc/os2/atmfonts
+
+ - ftp obelix.icce.rug.nl
+ /pub/erikjan/fonts/type.one.fonts
+ /pub/erikjan/fonts/BitStream
+
+ - garbo.uwasa.fi
+ /pc/fonts
+ - Attention: utopia.zip - metafont problems!
+ If you look into the .mf file after using conv_gho you find
+ several hundred lines sprinkled randomly about the file
+ containing only a right parenthesis. When you delete these
+ lines, Metafont runs without a problem and you now have a
+ Utopia font.
+
+
+
+ VII. New versions of ps4mfxx.zip:
+ ----------------------------------
+
+ Via anonymous ftp:
+ (ftp <host>, user: anonymous, passwd: email-address)
+
+ The package 2.8 (DOS) is available at CTAN-servers like
+ ftp.uni-stuttgart.de
+ /pub/tex/systems/msdos/ps4mf
+
+ There is also a unix-version 1.0c (C-sources) available at CTAN like
+ ftp.uni-stuttgart.de
+ /pub/tex/systems/unix/ps4mf
+
+ You can get the actual version of the ps4mf-package at
+ ftp.rrzn.uni-hannover.de
+ /incoming/tex
+
+ Other CTAN-servers:
+ ftp.tex.ac.uk (England) /tex-archive (/pub/tex
+ /pub/archive)
+ ftp.center.osaka-u.ac.jp (Japan) /CTAN
+ ftp.cs.rmit.edu.au (Australia) /tex-archive
+ sunsite.unc.edu (North Carolina, USA) /pub/packages/TeX
+ wuarchive.wustl.edu (Missouri, USA) /packages/TeX
+
+ VIII. Copyright
+ -----------------
+ Please read \ps4mf\doc\copying.gnu.
+
+
+
+ Please get hints and comments to
+
+ Markus Neteler
+ email: neteler@geog.uni-hannover.de
+
+
+
diff --git a/fonts/utilities/ps4mf/ps4mf.txt b/fonts/utilities/ps4mf/ps4mf.txt
new file mode 100644
index 0000000000..da04f4ab7b
--- /dev/null
+++ b/fonts/utilities/ps4mf/ps4mf.txt
@@ -0,0 +1,405 @@
+ +-------------------+
+ | -*- PS4MF -*- |
+ +-------------------+
+ Unix-Version: 1.1 June 1996
+
+ (c) Markus Neteler 1994 - 1996
+ Hannover, Germany
+
+ Conversion of Postscript-Type1-fonts to TeX
+
+ CONTENTS
+
+ I. Description
+ II. Quality of letters
+ III. What to do
+ IV. Some information about <font>.afm
+ V. Any problems ?
+ VI. Where to get fonts
+ VII. New versions of ps4mfxx.zip
+ VIII. Copyright
+
+
+ I. DESCRIPTION
+
+ In order to use Postscript-Type1-fonts for TeX without any special
+ encoding scheme (like dc,ec,nfss) you now can convert your favourite
+ Postscript-font.
+ This font has to be encoded in the "AdobeStandardEncoding-scheme".
+ After conversion into the standard-cm-encoding of TeX you can use
+ the fonts in LaTeX 2.09.
+ If you use LaTeX 2.e you need dc-encoding: this is also possible.
+
+ This package is based on the ps2mf-package of the authors:
+ Marcel Dings (original idea of the ps2mf-package) and Erik-Jan Vens (new
+ ps2mf).
+
+
+ II. QUALITY OF LETTERS
+
+ Fonts made by programs like Adobe(tm), Corel's Wfnboss(tm) and Fontographer
+ (Apple(tm)) seem to be of a better quality than fonts generated by
+ ghostscript's getafm. If you get free or shareware-fonts you should take
+ care of that.
+
+
+ III. WHAT TO DO
+ (Please read ../ps4mf/install.txt before you start!)
+
+ (0) Copy your postscript-font into directory ../ps4mf.
+ ../ stands for your home or whereever you put the package.
+
+ (1) Because of two different AdobeEncodingSchemes look at <font>.afm for
+ the actual used encoding scheme:
+
+ conv_ado.sh Adobe-made-fonts converting routine
+ conv_east.sh east-european converting routine for special
+ postscript-fonts
+ conv_dc.sh dc encoding converting routine for Adobefonts
+
+ (a) Fonts made by programs like Adobe(tm), Corel's Wfnboss(tm) with
+ AdobeStandardEncoding and Fontographer (EncodingScheme AppleStandard)
+ must be converted with conv_ado.sh -- Ado like Adobe:
+
+ Typical encoding in <font>.afm:
+ character "grave" has got the number C 128 or C 96:
+ "C 128 ; W ... grave ... "
+ "C 96 ; W ... grave ... "
+
+
+ To avoid trivial problems with syntax-error "C 175":
+ While looking for the name of the font-generating program
+ at <font>.afm, check this line:
+ C 175 ; WX 278 ; N ; B 11 33 44 566
+ If no charactername is specified (like here), delete this line.
+ Otherwise you maybe won't get a metafont-file!
+ Please read PROBLEMS (3) further down for this, too.
+
+
+ (b) For east-europe-TeXusers I have added conv_east.sh:
+ It generates a special encoded metafont-file (8 bit font) -
+ please look at encoding scheme in ps2mf/east.cfg.
+
+ (c) If you want to have dc-encoded fonts take conv_dc.sh
+
+ If you don't find a notice of the font-generating program or don't have
+ the character "grave" to look for the number just try both - you will
+ just see the upper and lower letters and no accents and foreign letters
+ etc. in your TeX document if you are wrong.
+ Just take the better result!
+
+ IMPORTANT:
+
+ IF FILES <font>.afm OR <font>.pfb ARE MISSING:
+
+ - If <font>.afm is missing and you only have <font>.pfm try
+ pfm2afm <font>
+ to convert the <font>.pfm -file to <font>.afm .
+ Look on ftp-servers for this program.
+ - You can also take ghostscript's getafm together with t1tools/t1utils
+ written by Thomas Wolff@inf.fu-berlin.de.
+
+
+ (2) If necessary edit conv_ado.sh for your TeX-directory-structure.
+
+ (3) Now run simply conv_ado.sh with fontname as parameter.
+
+ Example:
+ conv_ado garamond
+
+ (4) Use the new font in your TeX-documents:
+
+
+ (A) For the use of LaTeX 2.09:
+
+ (You should move newfont.tex and redefint.tex from /ps4mf/texinput
+ into the TeX-directory /usr/local/tex/texinput.)
+
+ (a) By using TeX-command
+ e.g. \newfont{\garamond}{garamond scaled 1000}.
+
+ or
+ (b) If you want to change fonts generally from computer-modern
+ fontfamily to your favourite postscriptfonts, just declare the
+ new fontnames in the file "newfont.tex". Then every magnification
+ (\large, \Huge etc.) will use your postscript-font.
+
+
+ Look at
+ ../ps4mf/texinput/sample1.tex (LaTeX: use of newfont.tex) or
+ ../ps4mf/texinput/sample2.tex (LaTeX: use of redefint.tex) or
+ ../ps4mf/texinput/dingbats.tex (LaTeX: use of font dingbats) or
+ ../ps4mf/texinput/testfont.tex (TeX: character-table) for example.
+
+ (B) For the use of LaTeX 2.e (and the teTeX-package, for other packages
+ please send a mail to me with suggestions):
+
+ It seems to be somehow complicated but is rather simple... :)
+
+ (a) Copy the base-file ps2mfbas.mf to:
+
+ /usr/lib/teTeX/texmf/metafont/misc/
+
+ (b) Copy the (meta-)font-files *.mf (with dc-encoding) to:
+
+ /usr/lib/teTeX/texmf/fonts/source/myfonts/dc/
+
+ You have to create both directories ../myfonts/dc/.
+
+ (c) The *.tfm-files are created by metafont, you can ignore them.
+
+
+ (d) The original postscript-files have to be copied, too:
+
+ - the *.afm -files to:
+
+ /usr/lib/teTeX/texmf/fonts/afm/myfonts/
+
+ Here you have to create the directory ../myfonts/.
+
+ - the *.pfb -files also:
+
+ /usr/lib/teTeX/texmf/fonts/type1/myfonts/
+
+ Here you have to create the directory ../myfonts/.
+
+
+ (e) Now you can declare a font-family (similar to "newfont.tex" which
+ was for LaTeX 2.09):
+
+ - Change to the directory
+
+ /usr/lib/teTeX/texmf/tex/latex/psnfss
+
+ - Create a file called "T1xxxxx.fd" where xxxxx has to be
+ substituted with the familyname which is defined in the first
+ line of the file. Here you define all shapes etc. as you like it.
+ Look further down for an example:
+
+ Example for family "baskerville":
+
+ T1bask.fd
+
+ Content of file:
+
+ \DeclareFontFamily{T1}{bask}{}
+ \DeclareFontShape{T1}{bask}{m}{n}{ <-> baskvl }{}
+ % medium norm.
+ \DeclareFontShape{T1}{bask}{b}{n}{ <-> baskvlb }{}
+ % bold norm.
+ \DeclareFontShape{T1}{bask}{bx}{n}{ <-> baskvlb }{}
+ % bold ext. norm.
+ \DeclareFontShape{T1}{bask}{m}{it}{ <-> baskvli }{}
+ % med. ital.
+
+ Another example ist at ps4mf/font-definition/.
+
+ (f) For the tetex-package you have to execute "texhash" at
+ unix-prompt to tell the system that there are more files
+ present now.
+
+ (g) Now the big bang is coming ...
+
+ Take you TeX-Document and add the following to the header
+
+ %%%%%%%%%%%%%%%%%
+ %[some of your definitions]
+
+ \usepackage[T1]{fontenc}
+ \renewcommand{\familydefault}{bask}
+
+ % Fuer deutschsprachige AnwenderInnen zusaetzlich:
+ \usepackage[iso]{umlaute}
+ \usepackage{german}
+ \selectlanguage{german}
+
+
+ ENJOY!
+
+
+
+ IV. SOME INFORMATION ABOUT <font>.afm
+
+ (1) The <font>.afm-file contains some lines like
+ C 168 ; WX 445 ; N dieresis ; B -9 16 455 480 ;
+
+ The "C 168" is the character-number,
+ the "WX 445" I don't know at the moment,
+ the "N dieresis" is the name of the character,
+ the "B -9 16 455 480" is the character bounding box information.
+
+ (2) If you just have the <font>.pfb-file you can try to create a new
+ <font>.afm-file with getafm.sh. Just type
+ getafm <font> (without extension .pfb).
+
+ For getafm see above.
+
+
+ (3) To clean up afm-files or correct characters you can use "t1tidy.zip"
+ (ask archie or me)
+
+
+ V. ANY PROBLEMS ?
+
+ (1) utopia.zip - metafont problems!
+ If you look into the .mf file after using conv_Gho you find many lines
+ sprinkled randomly about the file containing only a right parenthesis
+ " ) ". After deleting these lines Metafont runs without a problem
+ and you now have a Utopia font.
+
+ (2) If you get an error from ps2mf and afm2tfm like :
+
+ B expected ; ! syntax error
+ C 32 ; WX 278 ; N space ;
+ ^
+ there is no hope to convert this font. Some part of the font-description
+ is missing (bug of the postscript-font generating program), you have to
+ use another font or to get it via anonymous ftp (see further down).
+
+ The correct syntax at file <font>.afm looks like
+ C 32 ; WX 278 ; N space ; B 278 0 278 0 ;
+ The part following "B" is necessary for ps2mf and afm2tfm.
+
+ (3) No <font>.mf file is generated:
+ ps2mf reports an syntax-error with C 175 or similar:
+ ! syntax error
+ C 175 ; WX 278 ; N ;
+ ^
+ The character-name is missing, just delete this line in file <font>.afm
+ This is an error of Corel's Wfnboss (the font-generating program).
+
+ (4) You don't see any "umlauts" or other accents although there is a line
+
+ e.g.: C 168 ; WX 445 ; N dieresis ; B -9 16 455 480 ;
+ (or some other character)
+
+ There is a definition at <font>.afm but there no information
+ in the binary file (<font>.pfb) - get another font, blame the
+ font-creator...
+
+ (5) You get an error of afm2tfm like
+
+ " Kern char not found
+ KPX Y a -68 "
+
+ Just ignore this.
+
+ (6) If you have MAC-files you can try to convert them to Adobe with
+ refont
+
+ (7) Metafont-error like:
+ " ... [89][90][91]
+ >> -1
+ ! Invalid code has been replaced by 0.
+ <to be read again>
+ ;
+ l.9067 105=:-1;
+
+ I was looking for a number between 0 and 255, or for a
+ string of length 1. Didn't find it; will use 0 instead. "
+
+ Please edit /usr/local/tex/mfinput/<font>.mf for that error:
+ Then there are lines like
+
+ ligtable 102:
+ 105=:-1;
+
+ The "-1" is unknown by metafont - delete all
+ ligtables <no> followed by
+ <no>=:-1
+
+ Then you can run metafont again.
+
+ (8) It was reported that dvihplq/dvidot give checksum errors. But it is
+ possible to print out anyway. If you take the <font>.tfm file produced
+ by metafont the problem will disappear (then your font won't end
+ with character 127 but with 255 - the encoding of the first 128
+ characters is still like computer modern: no differences!)
+
+
+
+ VI. WHERE TO GET FONTS:
+
+
+
+
+ VI. WHERE TO GET FONTS:
+ -----------------------
+ (a) To get a nice listings, character-pictures and ftp-connections of fonts
+ try WWW with mosaic/netscape/etc.:
+
+ CTAN at WWW:
+ http://jasper.ora.com/
+
+ There is a fontpage which allows to look at fonts and download them
+ directly!
+
+
+ (b) You can get postscript-fonts via anonymous ftp at
+
+ - ftp.uni-stuttgart.de (mirror of hobbes.nmsu.edu)
+ /pub/systems/os2/hobbes-mirror/multimed/fonts
+
+ - ftp.uni-freiburg.de
+ /pc/os2/atmfonts
+
+ - ftp obelix.icce.rug.nl
+ /pub/erikjan/fonts/type.one.fonts
+ /pub/erikjan/fonts/BitStream
+
+ - garbo.uwasa.fi
+ /pc/fonts
+ - Attention: utopia.zip - metafont problems!
+ If you look into the .mf file after using conv_gho you find
+ several hundred lines sprinkled randomly about the file
+ containing only a right parenthesis. When you delete these
+ lines, Metafont runs without a problem and you now have a
+ Utopia font.
+
+
+ Both files <font>.afm and <font>.pfb are necessary.
+
+
+ Recommended (tested) fonts:
+ agate.zip
+ agateb.zip
+ agatei.zip
+ bodoni.zip
+ bodonib.zip
+ bodonii.zip (change "ItalicAngle" from 1 to 16 in bodonii.afm)
+ boecklin.zip
+ dingbats.zip
+ fr-n.zip (Frutiger)
+ fr-b.zip etc. (Frutiger bold)
+ garmnd.zip
+ garmndmi.zip (change "ItalicAngle" from 1 to 15 in garmndmi.afm)
+ goudyoi.zip (change "ItalicAngle" from 1 to 4 in goudyoi.afm)
+ hobo.zip
+ kaufmann.zip
+ lowereas.zip (use conv_ado2.bat to convert)
+ lowerwes.zip (use conv_ado2.bat to convert)
+ peigmed.zip
+ peignot.zip
+ postcr.zip (from package atmfonts.zip, use conv_ado2.bat to convert)
+ sntfra.zip (from package atmfonts.zip, use conv_ado2.bat to convert)
+ utopia.zip (for fixing a simple problem look at PROBLEMS (V.1))
+
+ * ATTENTION - Fonts made by Corel's Wfnboss (that's a lot!): *
+ * To avoid trivial problems please read PROBLEMS (V.3) above. *
+
+
+ VII. NEW VERSIONS OF ps4mf-unix.tar.gz:
+ ftp.rrzn.uni-hannover.de
+ /incoming/tex
+
+ VIII. COPYRIGHT: Please read copying.gnu.
+
+
+ --------------------------------
+ Please get hints and comments to
+
+ Markus Neteler
+ email: neteler@geog.uni-hannover.de
+
+
+
diff --git a/fonts/utilities/psposter/CHANGELOG b/fonts/utilities/psposter/CHANGELOG
new file mode 100644
index 0000000000..a9783389f9
--- /dev/null
+++ b/fonts/utilities/psposter/CHANGELOG
@@ -0,0 +1,110 @@
+%% /u/sy/beebe/src/psposter/CHANGELOG, Mon Jan 16 14:33:12 1995
+%% Edit by Nelson H. F. Beebe <beebe@sunrise>
+
+ Development log for psposter
+ [in reverse chronological order]
+
+[16-Jan-1995] 0.08
+ Fix a bug in the use of +table 8/h: the header line
+ 8 9 a b c d e f was in a Roman font instead of the
+ intended bold font used for the preceding line.
+
+ Modify grep commands to redirect stderr to /dev/null,
+ to unneeded error messages don't confuse the user.
+
+ Revise PostScript coding that implements the +table
+ option. In the original implementation of this code,
+ it was assumed that ASCII space and NUL had no
+ assigned glyph, which appears to be the case for all
+ Adobe PostScript fonts, and is supported by the encoding
+ tables in Appendix E of the PostScript Language
+ Reference Manual, Second Edition, Addison-Wesley
+ (1990). I also verified this in all 1305 .afm files
+ in the CTAN /tex-archive/fonts/postscript/AFMFiles
+ collection.
+
+ However, for Basil K. Malashev's BaKoMa fonts, which
+ represent Computer Modern in hinted PostScript Type 1
+ format, font positions 0 (NUL) and 32 (space) have
+ assigned glyphs, with the result that psposter showed
+ those glyphs throughout the font table, because space
+ had been used to separate table characters, setting
+ strings like (@ A B C D E F G ). The revised code
+ avoids the use of separating space, setting strings
+ like (@ABCDEFG) instead.
+
+[11-Jan-1995] 0.07
+ Add code to support on-the-fly invocation of t1ascii
+ so that psposter can use the more compact .pfb binary
+ PostScript font files, as well as the ASCII .pfa files
+ supported by earlier versions. Also add support for
+ on-the-fly decompression of font files compressed by
+ compress (.Z) and gzip (.gz). Although compress will
+ not reduce the size of .pfb files, gzip will.
+
+ If you don't have t1ascii installed yet, you can find
+ it in the Comprehensive TeX Archive Network (CTAN)
+ archives ("finger ctan@pip.shsu.edu" for a list of
+ CTAN site hostnames) in the directory
+ /tex-archive/fonts/utilities/t1utils.
+
+ If you don't have gunzip installed yet, you can find
+ it in the Free Software Foundation GNU Project
+ archives on prep.ai.mit.edu:/pub/gnu, and its mirror
+ sites.
+
+[01-Jan-1995] 0.06
+ Add +table option for printing tables of PostScript
+ fonts.
+
+[29-Dec-1994] 0.05
+ Add code in psposter.awk to issue a warning if a font
+ file is found in .pfb (binary) format, and show the
+ user how to convert it to .pfa (ASCII) format. The
+ requested font will be substituted by the default font
+ until that conversion has been done. I don't feel
+ like tackling the job of converting .pfb files to .pfb
+ format using the awk language (dvialw and dvips have C
+ code to do it).
+
+[19-Dec-1994] 0.04
+ Add code in psposter.awk to issue a warning if
+ afmfonts.map or rgb.txt cannot be found, and avoid
+ invoking grep on them if they are missing.
+
+ Correct error in Makefile: man page was installed
+ with wrong extension, and formatted man page in
+ cat directory was not removed.
+
+[16-Dec-1994] 0.03
+ Move awk code from psposter.sh to a separate file,
+ psposter.awk; DEC ULTRIX 4.x, HP HP-UX 9.x, IBM
+ RS/6000 AIX 3.x and SGI IRIX 4.x and 5.x shells were
+ unable to handle the long string containing the awk
+ program. There was no such problem on Cray UNICOS,
+ DEC OSF/1 3.x, NeXT Mach 3.0, Sun SunOS 4.1.x, and Sun
+ Solaris 2.x.
+
+ Eliminate three regular expressions for argument
+ matching in the awk code because the Cray UNICOS nawk
+ complained about them.
+
+ In psposter.awk, check for LOGNAME as well as USER to
+ try to get a username.
+
+ Change definition of VERSION to use "." instead of
+ "\#"; the latter raises a syntax error with IBM
+ RS/6000 AIX 3.5 make.
+
+[13-Dec-1994] 0.02
+ Full-fledged implementation of psposter with many new
+ options, manual page documentation, ready for limited
+ public distribution.
+
+[07-Dec-1994] 0.01
+ First working programmable implementation of psposter,
+ with limited support for command-line options.
+
+[27-Oct-1994] 0.00
+ First working outline of a PostScript poster, with
+ fixed text, and no programmability.
diff --git a/fonts/utilities/psposter/Makefile b/fonts/utilities/psposter/Makefile
new file mode 100644
index 0000000000..22d539b777
--- /dev/null
+++ b/fonts/utilities/psposter/Makefile
@@ -0,0 +1,216 @@
+#=======================================================================
+# Makefile for files in ~/src/psposter
+#
+# Current target list:
+# all
+# doorsigns
+# clean
+# mostlyclean
+# clobber
+# distclean
+# realclean
+# install
+# install-bin
+# install-ftp
+# install-US
+# install-ISO
+# install-man
+# psposter.hlp
+# psposter.ps
+# psposter.shar
+# psposter.tar
+# psposter.txt
+# psposter.zip
+# psposter.zoo
+# test-version
+# uninstall
+# uninstall-exe
+# uninstall-man
+#
+# [11-Jan-1995]
+#=======================================================================
+
+# These six values may require local customization:
+AWK = /usr/local/bin/gawk
+BINDIR = /usr/local/bin
+CATDIR = $(MANDIR)/../cat$(MANEXT)
+FTPDIR = /u/ftp/pub/misc
+LIBDIR = /usr/local/lib/psposter
+MANDIR = /usr/local/man/man$(MANEXT)
+MANEXT = 1
+
+# If you don't have Robert Solovay's checksum program, use cat
+CHECKSUM = cat
+CHECKSUM = checksum
+
+# You should not have to change anything below this point.
+CHMOD = chmod
+
+COL = col -b
+
+COMPRESS = compress
+
+CP = /bin/cp
+
+DIST-FILES = CHANGELOG README Makefile TODO bb.ps fontlist.ps \
+ fontlold.ps fontlsim.ps fontshow.ps man2ps \
+ psposter.awk psposter.ps psposter.sh psposter.man \
+ rofvms.awk
+
+DOORFILES = door.les door.nhfb door.pjb
+DOORFILES =
+
+EXPAND = expand
+
+FONTNAME = CharterBT-Bold
+FONTNAME = Utopia-BoldItalic
+FONTNAME = URWGroteskT-Bold
+FONTNAME = NimbusRomanNo9L-Regular
+FONTNAME = Copperplate-ThirtyAB
+FONTNAME = CharterBT-BoldItalic
+
+ISPELL = ispell
+
+LN = ln -s
+
+MAN2PS = ./man2ps
+
+NROFF = nroff
+
+PSPOSTER = ./psposter.sh
+
+PSPOSTERFLAGS = +bg powderblue +fg navyblue +paper 4inx9.5in +x 1in +y 1in +l +p 60pt +fn $(FONTNAME)
+PSPOSTERFLAGS = +bg PaleGreen +fg navyblue +paper 4inx9.5in +x 1in +y 1in +l +p 60pt +fn $(FONTNAME)
+
+RM = /bin/rm -f
+
+SED = /bin/sed
+
+SHELL = /bin/sh
+
+SORT = sort
+
+SPELL = spell
+
+UNZIP = unzip
+
+# NB: The version number of the FTP psposter archive files is extracted
+# from that of psposter.awk.
+VERSION = `$(AWK) '/^...[ \t]*version *= *"[0-9.]+", *$$/ \
+ { gsub(/[^0-9.]/,"",$$4); print $$4 }' psposter.awk`
+
+ZIP = zip
+
+ZOO = zoo
+
+#=======================================================================
+
+all: psposter.txt psposter.hlp psposter.ps
+
+doorsigns:
+ for f in $(DOORFILES) ; \
+ do \
+ $(PSPOSTER) $(PSPOSTERFLAGS) <$$f >$$f.ps ; \
+ done
+
+clean mostlyclean:
+ -$(RM) *.i
+ -$(RM) *.o
+ -$(RM) *~
+ -$(RM) \#*
+ -$(RM) a.out
+ -$(RM) core
+
+clobber distclean realclean: clean
+ -$(RM) psposter-?.??.??? psposter-?.??.???-???
+ -$(RM) psposter.hlp
+ -$(RM) psposter.ps
+ -$(RM) psposter.shar
+ -$(RM) psposter.tar
+ -$(RM) psposter.txt
+ -$(RM) psposter.zip
+ -$(RM) psposter.zoo
+
+install:
+ @echo "Choose install-US or install-ISO to select the default paper type."
+
+install-bin:
+ $(SED) -e 's@/usr/local/bin/gawk@$(AWK)@' \
+ -e 's@/usr/local/lib/psposter@$(LIBDIR)@' \
+ < psposter.sh >$(BINDIR)/psposter
+ $(CHMOD) 775 $(BINDIR)/psposter
+
+install-ftp: psposter.tar psposter.zip psposter.zoo
+ tar tvf psposter-$(VERSION).tar >$(FTPDIR)/psposter-$(VERSION).tar-lst
+ $(COMPRESS) <psposter-$(VERSION).tar \
+ >$(FTPDIR)/psposter-$(VERSION).tar.z
+ $(CP) psposter-$(VERSION).zip $(FTPDIR)
+ $(CP) psposter-$(VERSION).zip-lst $(FTPDIR)
+ $(CP) psposter-$(VERSION).zoo $(FTPDIR)
+ $(CP) psposter-$(VERSION).zoo-lst $(FTPDIR)
+ ls -l $(FTPDIR)/psposter*
+
+install-US: install-bin install-man
+ -if [ ! -d $(LIBDIR) ] ; then mkdir $(LIBDIR) ; fi
+ $(CP) psposter.awk $(LIBDIR)/psposter.awk
+ $(CHMOD) 664 $(LIBDIR)/psposter.awk
+
+install-ISO: install-bin install-man
+ -if [ ! -d $(LIBDIR) ] ; then mkdir $(LIBDIR) ; fi
+ $(SED) -e 's/set_paper_dimensions("A")/set_paper_dimensions("A4")/' \
+ < psposter.awk | $(CHECKSUM) >$(LIBDIR)/psposter.awk
+ $(CHMOD) 664 $(LIBDIR)/psposter.awk
+
+install-man: uninstall-man
+ -$(RM) $(CATDIR)/psposter.$(MANEXT)
+ -$(CP) psposter.man $(MANDIR)/psposter.$(MANEXT)
+ $(CHMOD) 664 $(MANDIR)/psposter.$(MANEXT)
+
+# VAX VMS help file format from psposter.txt
+psposter.hlp: psposter.txt rofvms.awk
+ $(EXPAND) <psposter.txt | $(AWK) -f rofvms.awk >psposter.hlp
+
+psposter.ps: psposter.man
+ $(MAN2PS) <psposter.man >psposter.ps
+
+psposter.shar: $(DIST-FILES)
+ shar -b -c -v $(DIST-FILES) >psposter.shar
+
+psposter.tar: $(DIST-FILES)
+ -$(RM) psposter.tar psposter.tar-lst
+ tar chf psposter.tar $(DIST-FILES)
+ -mkdir psposter-$(VERSION)
+ cd psposter-$(VERSION); tar xf ../psposter.tar
+ tar cf psposter-$(VERSION).tar psposter-$(VERSION)
+ -$(RM) -r psposter-$(VERSION)
+ -$(RM) psposter.tar
+ $(LN) psposter-$(VERSION).tar psposter.tar
+
+psposter.txt: psposter.man
+ $(NROFF) -man $? | $(COL) >$@
+
+psposter.zip: $(DIST-FILES)
+ -$(RM) psposter*.zip
+ -$(RM) psposter*.zip-lst
+ $(ZIP) psposter-$(VERSION).zip $(DIST-FILES)
+ $(UNZIP) -v psposter-$(VERSION).zip >psposter-$(VERSION).zip-lst
+ $(LN) psposter-$(VERSION).zip psposter.zip
+
+psposter.zoo: $(DIST-FILES)
+ -$(RM) psposter*.zoo
+ -$(RM) psposter*.zoo-lst
+ $(ZOO) a psposter-$(VERSION).zoo $(DIST-FILES)
+ $(ZOO) v psposter-$(VERSION).zoo >psposter-$(VERSION).zoo-lst
+ $(LN) psposter-$(VERSION).zoo psposter.zoo
+
+test-version:
+ @echo "Version number is ""'"$(VERSION)"'"
+
+uninstall: uninstall-exe uninstall-man
+
+uninstall-exe:
+ -$(RM) $(BINDIR)/psposter
+
+uninstall-man:
+ -$(RM) $(MANDIR)/psposter.$(MANEXT)
+ -$(RM) $(CATDIR)/psposter.$(MANEXT)
diff --git a/fonts/utilities/psposter/README b/fonts/utilities/psposter/README
new file mode 100644
index 0000000000..1a94196a85
--- /dev/null
+++ b/fonts/utilities/psposter/README
@@ -0,0 +1,86 @@
+%% /u/sy/beebe/src/psposter/README, Fri Dec 16 15:02:08 1994
+%% Edit by Nelson H. F. Beebe <beebe@plot79.math.utah.edu>
+
+Author:
+ Nelson H. F. Beebe
+ Center for Scientific Computing
+ Department of Mathematics
+ University of Utah
+ Salt Lake City, UT 84112
+ USA
+ Email: beebe@math.utah.edu (Internet)
+ Tel: +1 801 581 5254
+ FAX: +1 801 581 4148
+
+This directory contains psposter, an easy-to-use program for producing
+simple colored posters in PostScript.
+
+ *********************************************
+ *********************************************
+ *** This program is in the PUBLIC DOMAIN. ***
+ *********************************************
+ *********************************************
+
+The master copy of psposter can be found on the Internet archive
+ftp.math.utah.edu:/pub/misc in compressed UNIX tar, zip, and zoo
+formats. It may be automatically mirrored from there to other
+Internet sites.
+
+If you don't have lptops installed (available in the same archive as
+psposter), you can create an empty afmfonts.map file, and put it in a
+directory pointed to by the AFMPATH environment variable. lptops is
+very handy, and its installation will supply you with some additional
+fonts for psposter.
+
+The files in the psposter distribution consist of:
+
+CHANGELOG Reverse time-ordered log of changes to psposter.
+
+README This file.
+
+Makefile UNIX Makefile for installing and uninstalling
+ psposter.
+
+TODO Record of things to do in future versions.
+
+bb.ps PostScript file to prepend to an EPS file for
+ determining the bounding box. This comes from
+ Tom Rokicki's dvips 5.528 distribution,
+ available on labrea.stanford.edu, and the CTAN
+ (Comprehensive TeX Archive Network) archives
+ (do "finger ctan@pip.shsu.edu" for a list of
+ CTAN sites).
+
+fontlist.ps PostScript file for listing the resident fonts
+ on a PostScript output device, in alphabetical
+ order.
+
+fontlsim.ps Simple version of fontlist.ps, without sorting;
+ this is the file illustrated in the man pages.
+
+fontlold.ps PostScript file for listing the resident fonts
+ on a PostScript output device; uses Level 1
+ PostScript, but Adobe documentation says that
+ the technique is unreliable.
+
+fontshow.ps PostScript file for listing and illustrating
+ the resident fonts in alphabetical order on a
+ PostScript output device.
+
+man2ps UNIX shell script for converting UNIX manual
+ pages to PostScript.
+
+psposter.awk The program.
+
+psposter.hlp VAX VMS HELP file for psposter.man.
+
+psposter.man UNIX manual pages documenting psposter.
+
+psposter.txt ASCII formatted nroff output from psposter.man.
+
+psposter.ps PostScript typeset output from psposter.man.
+
+psposter.sh Pre-installation script for running psposter.
+
+rofvms.awk Program for converting nroff manual page
+ output to VAX VMS HELP file format.
diff --git a/fonts/utilities/psposter/TODO b/fonts/utilities/psposter/TODO
new file mode 100644
index 0000000000..2210552c34
--- /dev/null
+++ b/fonts/utilities/psposter/TODO
@@ -0,0 +1,12 @@
+[15-Dec-1994]
+psposter currently outputs a
+
+ %%DocumentNeededResources: font Times-Bold
+
+comment. However, if the font is downloaded in the output, then it
+should say instead:
+
+ %%DocumentSuppliedResources: font Times-Bold
+
+There should be one font list in the Supplied Resources for every
+BeginResource/EndResource pair.
diff --git a/fonts/utilities/psposter/bb.ps b/fonts/utilities/psposter/bb.ps
new file mode 100644
index 0000000000..ef1d07ebf7
--- /dev/null
+++ b/fonts/utilities/psposter/bb.ps
@@ -0,0 +1,527 @@
+%!
+% bb.ps --
+%
+% Prints a file, but keeps track of bounding box info, and prints the box at
+% the end (around the figure.)
+%
+% $Header: /u/sy/beebe/src/psposter/RCS/bb.ps,v 1.3 1995/01/12 04:55:01 beebe Exp beebe $
+% RCS log info at end
+
+50 dict /$BoundingBox exch def
+
+$BoundingBox begin
+
+/xdef {
+ exch def
+} def
+
+/xstore {
+ exch store
+} def
+
+/addcoords {
+ exch
+ 4 -1 roll add
+ 3 1 roll add
+} def
+
+%
+% Stubs of old functions.
+%
+
+/-stroke /stroke load def
+/-fill /fill load def
+/-eofill /eofill load def
+/-image /image load def
+/-show /show load def
+/-awidthshow /awidthshow load def
+/-showpage /showpage load def
+/-restore /restore load def
+/-imagemask /imagemask load def
+
+end % $BoundingBox
+
+%
+% New Functions. --- These go into the user dict to intercept the calls
+%
+
+/stroke {
+ $BoundingBox begin
+ gsave
+ initmatrix
+ (stroke called\n) traceprint %%DEBUG
+ {
+ strokepath % Make sure to take line width into account.
+ 0 setlinejoin
+ flattenpath
+ } stopped { % strokepath often hits a limitcheck.
+ (Can't set up a strokepath\n) traceprint % DEBUG
+ grestore % Restore the original path
+ gsave
+ } if
+ includepath % Accumulate it into our box.
+ grestore
+
+ -stroke
+ end % $BoundingBox
+} def
+
+/fill {
+ $BoundingBox begin
+ gsave
+ (fill called\n) traceprint %%DEBUG
+ includepath
+ grestore
+
+ -fill
+ end % $BoundingBox
+} def
+
+/eofill {
+ $BoundingBox begin
+ gsave
+ (eofill called\n) traceprint %%DEBUG
+ includepath
+ grestore
+
+ -eofill
+ end % $BoundingBox
+} def
+
+%
+% Text is implemented by reducing everything to an `awidthshow'.
+%
+
+/show {
+ $BoundingBox begin
+ (show called\n) traceprint %%DEBUG
+ 0 0 0 0 0 % Extra parameters for awidthshow
+ 6 -1 roll % Bring the string back up
+ awidthshow
+ end % $BoundingBox
+} def
+
+/widthshow {
+ $BoundingBox begin
+ (widthshow called\n) traceprint %%DEBUG
+ 0 0 % Extra parameters for awidthshow
+ 3 -1 roll % Bring the string back up.
+ awidthshow
+ end % $BoundingBox
+} def
+
+/ashow {
+ $BoundingBox begin
+ (ashow called\n) traceprint %%DEBUG
+ 0 0 0
+ 6 3 roll
+ awidthshow
+ end % $BoundingBox
+} def
+
+
+% This does all of the work of the text-rendering operators
+% What it does, is compute, basically brute force, what 'charpath'
+% would have given us virtually for free, if 'show' were the only
+% operator that we needed to do.
+
+/awidthshow {
+ $BoundingBox begin
+ gsave
+ 6 (awidthshow:) debug %%DEBUG
+ currentpoint
+ 2 copy /@starty xdef /@startx xdef
+ 2 index stringwidth % Get the natural length of the string
+ addcoords % Add to the start to get the end.
+
+ 2 index length % How many characters?
+
+ dup % Add the offsets to each character
+ 6 index mul
+ exch 5 index mul
+ addcoords
+
+ 5 index 3 index
+ chcount % How many padding characters?
+
+ dup % Add the offsets for each pad.
+ 9 index mul
+ exch 8 index mul
+ addcoords
+
+ /@endy xdef /@endx xdef
+
+ % We now have the left and right edges (in user coords)
+ % of the text. Now we need only correct for the vertical
+ % displacements needed for the font and we can get the
+ % top and bottom edges of the enclosing box
+
+ fontheight % Get the height and depth of the current font.
+
+ @startx @starty addcoords
+ /@starty xdef /@startx xdef
+ @endx @endy addcoords
+ /@endy xdef /@endx xdef
+ newpath
+ @startx @starty moveto
+ @endx @starty lineto
+ @endx @endy lineto
+ @startx @endy lineto
+ closepath
+ includepath
+ grestore
+
+ -awidthshow
+ end % $BoundingBox
+} def
+
+%
+% `image':
+%
+% Assume here that the image lands in the unit square.
+%
+
+/image {
+ $BoundingBox begin
+ (image called\n) traceprint %%DEBUG
+ gsave
+ newpath
+ 0 0 moveto
+ 1 0 rlineto
+ 1 1 rlineto
+ -1 0 rlineto
+ closepath
+ includepath
+ grestore
+
+ -image
+ end % $BoundingBox
+} def
+
+/imagemask
+{
+ $BoundingBox begin
+ (imagemask called\n) traceprint %%DEBUG
+ gsave
+ newpath
+ 0 0 moveto
+ 1 0 rlineto
+ 1 1 rlineto
+ -1 0 rlineto
+ closepath
+ includepath
+ grestore
+
+ -imagemask
+ end % $BoundingBox
+} def
+
+% Just define this one out of existence
+/framedevice { pop pop pop pop } def
+
+% Handle restoring VM --- this is all OK, except that we have to
+% hang onto the bb info we collected while in the about-to-be-discarded
+% environment
+
+/restore
+{
+ $BoundingBox begin
+ (restore called\n) traceprint %%DEBUG
+ tracedump %% HACK, but the only way I see right now to get this stuff!
+ bbox-llx bbox-lly bbox-urx bbox-ury
+ 5 -1 roll
+ -restore
+ /bbox-ury xstore /bbox-urx xstore
+ /bbox-lly xstore /bbox-llx xstore
+ end % $BoundingBox
+} def
+
+
+%
+% `showpage':
+%
+% Just draw the box around the figure and print the page, and then initialize
+% the bounding box variables again.
+%
+
+$BoundingBox begin
+/temp-string 10 string def
+end % $BoundingBox
+
+/showpage {
+ $BoundingBox begin
+ initgraphics
+
+ (showpage\n) traceprint % DEBUG
+ dump-bbox % DEBUG
+
+ /bbox-llx round_down
+ /bbox-lly round_down
+ /bbox-ury round_up
+ /bbox-urx round_up
+
+ bbox-llx bbox-lly moveto % Make the box
+ bbox-llx bbox-ury lineto
+ bbox-urx bbox-ury lineto
+ bbox-urx bbox-lly lineto
+ closepath
+
+ bwstroke % Draw the box.
+
+% Print the size of the bounding box both above and below the actual box
+ 0 setgray
+ /Courier findfont 10 scalefont setfont
+ bbox-llx 36 max bbox-lly 12 sub 36 max moveto
+ (%%BoundingBox: ) -show
+ bbox-llx temp-string cvs -show ( ) -show
+ bbox-lly temp-string cvs -show ( ) -show
+ bbox-urx temp-string cvs -show ( ) -show
+ bbox-ury temp-string cvs -show
+
+ bbox-llx 36 max bbox-ury 12 add 740 min moveto
+ (%%BoundingBox: ) -show
+ bbox-llx temp-string cvs -show ( ) -show
+ bbox-lly temp-string cvs -show ( ) -show
+ bbox-urx temp-string cvs -show ( ) -show
+ bbox-ury temp-string cvs -show
+
+ init
+ -showpage
+ tracedump %% DEBUG
+ end % $BoundingBox
+} def
+
+%
+% BoundingBox functions:
+%
+% We accumulate the information about the bounding box into four variables.
+% The data is stored in default coordinates.
+%
+
+$BoundingBox begin
+
+/init {
+ /bbox-llx 99999 store
+ /bbox-lly 99999 store
+ /bbox-urx -99999 store
+ /bbox-ury -99999 store
+} def
+
+/bbox-llx 0 def
+/bbox-lly 0 def
+/bbox-urx 0 def
+/bbox-ury 0 def
+
+%
+% - `includepath' -
+%
+% Incorporates the bounding box of the path into the bounding box info.
+% ... Gets the bounding box in default coords
+
+/includepath {
+ (Adding a path: ) traceprint %%DEBUG
+ gsave
+ initmatrix
+ {
+ 0 setlinejoin
+ flattenpath
+ } stopped {
+ (Couldn't flatten the path\n) traceprint % DEBUG
+ grestore
+ gsave
+ initmatrix
+ } if
+ { pathbbox } stopped not
+ {
+ 4 2 roll % Just so we get lower-left first
+ 2 copy dump-coord %%DEBUG
+ dup bbox-lly lt {
+ /bbox-lly xstore
+ } {
+ pop
+ } ifelse
+ dup bbox-llx lt {
+ /bbox-llx xstore
+ } {
+ pop
+ } ifelse
+
+ (; ) traceprint 2 copy dump-coord (\n) traceprint %%DEBUG
+ dup bbox-ury gt {
+ /bbox-ury xstore
+ } {
+ pop
+ } ifelse
+ dup bbox-urx gt {
+ /bbox-urx xstore
+ } {
+ pop
+ } ifelse
+ dump-bbox %%DEBUG
+ } if
+ grestore
+} def
+
+%
+% A nice black-and white line drawing function.
+%
+
+/bwstroke {
+ 0 setlinewidth % Thinnest possible lines
+ 1 setgray % White first
+ [5] 0 setdash % Only half the line
+ gsave -stroke grestore
+ 0 setgray % Then black
+ [5] 5 setdash % On the other half
+ -stroke
+} def
+
+%
+% Stuff for text.
+%
+
+%
+% char-code string `chcount' occurs
+%
+% Counts the number of times a character appears in a string.
+%
+
+/chcount {
+ 0 exch
+ {
+ 2 index eq {
+ 1 add
+ } if
+ } forall
+ exch pop
+} def
+
+%
+% - `fontheight' heightx heighty depthx depthy
+%
+% Returns the offsets to the lowest point and highest point in the current
+% font.
+%
+
+/fontheight {
+ currentfont begin
+ /FontBBox load aload pop
+ exch pop 0 exch
+ FontMatrix transform
+ 4 2 roll
+ exch pop 0 exch
+ FontMatrix transform
+ end
+} def
+
+% key round_{down|up} - These will round the value of the given key
+% up or down, as appropriate, to the nearest integer
+/round_up { dup load ceiling cvi store } def
+/round_down { dup load floor cvi store } def
+
+% key binddefinition - this will do a 'bind' on the procedure given by 'key'
+/binddefinition
+{
+ dup where
+ {
+ exch
+ 2 copy
+ get bind put
+ }
+ { undefined } ifelse
+} def
+
+% Given two numbers on the stack, return with just the smallest
+/min { 2 copy ge { exch } if pop } def
+
+% Dito for the largest of the pair
+/max { 2 copy lt { exch } if pop } def
+
+
+% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+%
+% Debugging utilities
+%
+
+/$tracedict where
+{ % Trace package loaded... do the tracing
+ pop
+% This is a debugging function to print out what is going on.
+% Format <argn> <argn-1> ... <arg1> n <string> debug <argn> ... <arg1>
+% (that is, the 'n' args will be *left* on the stack!)
+/debug
+{
+ traceprint (\n) traceprint
+ dup 1 add % Now total number of args (including arg count)
+ copy
+ {
+ ( ) traceprint
+ trace=
+ (\n) traceprint
+ } repeat
+ pop % Remove the extra copy of the arg count
+} def
+
+% Print out a coordinate on the stack: x y ---
+/dump-coord
+{
+ (\() traceprint exch trace= (, ) traceprint trace= (\)) traceprint
+} def
+
+% Print out bb's current notion of its bounding box
+
+/dump-bbox
+{
+ (Bounding Box: ) traceprint
+ bbox-llx bbox-lly dump-coord
+ (; ) traceprint
+ bbox-urx bbox-ury dump-coord
+ (\n) traceprint
+} def
+
+tracebegin %% DEBUG
+
+}
+{ % No trace package loaded, so don't trace. Stub out the various calls
+
+/traceprint { pop } def
+/dump-coord { pop pop } def
+/dump-bbox { } def
+/debug { pop pop } def
+/tracedump { } def
+
+} ifelse
+
+% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+
+% Bind everything
+
+/xdef binddefinition
+/xstore binddefinition
+/addcoords binddefinition
+/stroke binddefinition
+/fill binddefinition
+/eofill binddefinition
+/show binddefinition
+/widthshow binddefinition
+/ashow binddefinition
+/awidthshow binddefinition
+/image binddefinition
+/showpage binddefinition
+/init binddefinition
+/includepath binddefinition
+/bwstroke binddefinition
+/chcount binddefinition
+/fontheight binddefinition
+
+/debug binddefinition
+/dump-coord binddefinition
+/dump-bbox binddefinition
+
+% Start it up.
+
+init
+
+end % $BoundingBox
+
+% end of bb.ps
diff --git a/fonts/utilities/psposter/fontlist.ps b/fonts/utilities/psposter/fontlist.ps
new file mode 100644
index 0000000000..039148a665
--- /dev/null
+++ b/fonts/utilities/psposter/fontlist.ps
@@ -0,0 +1,167 @@
+%!PS-Adobe-3.0
+%=======================================================================
+% Send this file to a PostScript device to list the names of all of
+% the resident fonts, in ascending order.
+%=======================================================================
+%%Title: fontlist.ps
+%%CreationDate: Thu Dec 15 09:31:00 MST 1994
+%%Creator: Nelson H. F. Beebe <beebe@sunrise>
+%%For: Nelson H. F. Beebe <beebe@sunrise>
+%%BoundingBox: 0 0 612 792
+%%DocumentMedia: A 612 792 () () ()
+%%DocumentData: Clean7Bit
+%%DocumentFonts: font Courier Times-Bold
+%%DocumentNeededResources: font Courier Times-Bold
+%%DocumentSuppliedResources:
+%%Orientation: Portrait
+%%PageOrder: Ascend
+%%Pages: 1
+% NB: The number of pages depends on the number of resident fonts
+%%EndComments
+%=======================================================================
+%%BeginProlog
+/fontlistdict 50 dict def
+fontlistdict begin
+
+/inch { 72 mul } def
+
+/PointSize 10 def
+
+/ColumnWidth 3.24 inch def % slightly less than (8.5 - 2)/2
+
+/Courier findfont PointSize scalefont setfont
+
+/BaselineSkip PointSize 1.2 mul def
+
+/BottomOfColumn { y 1 inch lt } def
+
+/Bubblesort % Here is the sorting routine, courtesy of ulfis@nada.kth.se
+{ % Usage: array Bubblesort
+ % This code may be used for arrays of strings and arrays of numbers
+ /TheArray exch def
+ /num TheArray length def
+ num 1 gt
+ {
+ 1 1 num 1 sub
+ {
+ /localcount exch def
+ num 1 sub -1 localcount
+ {
+ /innercount exch def
+ /firststring TheArray innercount 1 sub get def
+ /secondstring TheArray innercount get def
+ firststring secondstring gt
+ {
+ TheArray innercount 1 sub secondstring put
+ TheArray innercount firststring put
+ } if
+ } for
+ } for
+ } if
+} def
+
+/ColumnOffPage { x ColumnWidth add 7.5 inch gt } def
+
+/NewColumn
+{
+ /x x ColumnWidth add def
+ /y Y def
+ ColumnOffPage { showpage NewPage } if
+ x y moveto
+} def
+
+/NewLine
+{
+ /y y BaselineSkip sub def
+ BottomOfColumn { NewColumn } if
+ x y moveto
+} def
+
+/NewPage
+{
+ /x 1 inch def
+ /y 10 inch def
+ /Y y def
+ x y moveto
+} def
+
+end % fontlistdict
+%%EndProlog
+%=======================================================================
+%%BeginSetup
+/#copies 1 def
+fontlistdict begin
+
+% Count the fonts available, while putting all of the font names on
+% the stack. We need to create a new string for each of them, because
+% scratch gets reused on each loop iteration.
+/n 0 def
+systemdict /resourceforall known
+ { % Level 2 PostScript
+ /scratch 256 string def
+ (*) { /n n 1 add def dup length string cvs } scratch /Font resourceforall
+ }
+ { % Level 1 PostScript
+ FontDirectory { pop /n n 1 add def dup length string cvs } forall
+ }
+ifelse
+
+% Make an array to hold the font names and then store them from the stack
+/FontArray n array def
+FontArray astore
+
+% Sort the font array (astore left FontArray on the stack)
+Bubblesort
+
+end %fontlistdict
+%%EndSetup
+%=======================================================================
+%%Page: 1 1
+%%BeginPageSetup
+fontlistdict begin
+NewPage
+end % fontlistdict
+%%EndPageSetup
+
+fontlistdict begin
+
+% Display the sorted fonts: this make take several pages
+/n 0 def
+/nstr 10 string def
+FontArray
+{
+ /n n 1 add def
+ n 10 lt { ( ) show } if
+ n 100 lt { ( ) show } if
+ n 1000 lt { ( ) show } if
+ n nstr cvs show
+ (: ) show
+ show
+ NewLine
+}
+forall
+
+/Times-Bold findfont PointSize scalefont setfont
+(Total memory: ) show
+vmstatus 40 string cvs show
+NewLine
+
+(Memory used: ) show
+40 string cvs show
+NewLine
+
+pop % discard 3rd vmstatus value
+
+(Free memory: ) show
+vmstatus exch sub 40 string cvs show
+NewLine
+
+pop % discard 3rd vmstatus value
+
+end % fontlistdict
+
+showpage
+%%PageTrailer
+%=======================================================================
+%%Trailer
+%%EOF
diff --git a/fonts/utilities/psposter/fontlold.ps b/fonts/utilities/psposter/fontlold.ps
new file mode 100644
index 0000000000..3253298fef
--- /dev/null
+++ b/fonts/utilities/psposter/fontlold.ps
@@ -0,0 +1,98 @@
+%!
+% Prints a sorted list of resident fonts.
+
+/MaxNrOfFonts 100 def % Maximum numbers of fonts...
+/Xpos 136 def
+/Ypos 690 def
+/num 0 def % local counter
+/incr {
+ /num num 1 add def
+} def
+
+/s40 { 40 string } def % Proper length of the fontname
+
+/showline { % Show and newlines
+ show
+ newline
+} def
+
+/newline { % Spacing between lines
+ /Ypos Ypos 12 sub def
+ Xpos Ypos moveto
+} def
+
+/CountFonts { % Count the fonts and put the names into array
+ FontDirectory
+ {
+ pop
+ s40
+ cvs
+ incr
+ }
+ forall
+ /FontArray num array def
+ FontArray astore
+ pop
+} def
+
+/ListFonts { % Sort the fonts and show them on paper
+ Bubbelsort
+ FontArray
+ {
+ showline
+ }
+ forall
+} def
+
+/Bubbelsort { % Here is the sorting routine
+ 1 1 num 1 sub
+ {
+ /localcount exch def
+ num 1 sub -1 localcount
+ {
+ /innercount exch def
+ /firststring FontArray innercount 1 sub get def
+ /secondstring FontArray innercount get def
+ firststring secondstring gt
+ {
+ FontArray innercount 1 sub secondstring put
+ FontArray innercount firststring put
+ } if
+ } for
+ } for
+} def
+
+/prettyline
+{ /YPOSition exch def
+ newpath
+ Xpos Ypos YPOSition add moveto
+ Xpos 100 add Ypos YPOSition add lineto
+ stroke
+} def
+
+/Times-Roman findfont 12 scalefont setfont
+14 prettyline
+
+Xpos Ypos 18 add moveto
+CountFonts
+(Number of fonts: ) show
+num s40 cvs show
+
+30 prettyline
+Xpos Ypos moveto
+ListFonts
+newline
+
+/Times-Bold findfont 12 scalefont setfont
+(Total memory: ) show
+vmstatus s40 cvs show newline
+(Memory used: ) show
+s40 cvs show newline
+pop
+(Free memory: ) show
+vmstatus exch sub s40 cvs show newline newline
+pop
+/Times-Roman findfont 12 scalefont setfont
+(From ulfis@nada.kth.se, 88-10-05) show
+
+showpage
diff --git a/fonts/utilities/psposter/fontlsim.ps b/fonts/utilities/psposter/fontlsim.ps
new file mode 100644
index 0000000000..1440d8bc81
--- /dev/null
+++ b/fonts/utilities/psposter/fontlsim.ps
@@ -0,0 +1,41 @@
+%!
+% fontlist.ps
+% Send this file to a PostScript device to list
+% the names of all of the resident fonts.
+% [13-Dec-1994]
+/inch { 72 mul } def
+/PointSize 10 def
+/ColumnWidth 3 inch def
+/Courier findfont PointSize scalefont setfont
+/n 0 def
+/newcolumn
+{
+ /x x ColumnWidth add def
+ x y moveto
+ 8 inch x gt { showpage newpage } if
+} def
+/newpage
+{
+ /x 1 inch def
+ /y 10 inch def
+ x y moveto
+} def
+/nstr 10 string def
+/scratch 256 string def
+newpage
+(*)
+{
+ /n n 1 add def
+ gsave
+ n nstr cvs show
+ (: ) show
+ show
+ grestore
+ 0 PointSize -1.2 mul rmoveto
+ currentpoint exch pop 1 inch lt
+ {
+ newcolumn
+ } if
+}
+scratch /Font resourceforall
+showpage
diff --git a/fonts/utilities/psposter/fontshow.ps b/fonts/utilities/psposter/fontshow.ps
new file mode 100644
index 0000000000..9e626223d0
--- /dev/null
+++ b/fonts/utilities/psposter/fontshow.ps
@@ -0,0 +1,190 @@
+%!PS-Adobe-3.0
+%=======================================================================
+% Send this file to a PostScript device to list the names of all of
+% the resident fonts, in ascending order, together with a small sample
+% of each font.
+%=======================================================================
+%%Title: fontshow.ps
+%%CreationDate: Thu Dec 15 09:31:00 MST 1994
+%%Creator: Nelson H. F. Beebe <beebe@sunrise>
+%%For: Nelson H. F. Beebe <beebe@sunrise>
+%%BoundingBox: 0 0 612 792
+%%DocumentMedia: A 612 792 () () ()
+%%DocumentData: Clean7Bit
+%%DocumentFonts: font Courier Times-Bold
+%%DocumentNeededResources: font Courier Times-Bold
+%%DocumentSuppliedResources:
+%%Orientation: Portrait
+%%PageOrder: Ascend
+%%Pages: 1
+% NB: The number of pages depends on the number of resident fonts
+%%EndComments
+%=======================================================================
+%%BeginProlog
+/fontshowdict 50 dict def
+fontshowdict begin
+
+/inch { 72 mul } def
+
+/PointSize 10 def
+
+/ColumnWidth 3.24 inch def % slightly less than (8.5 - 2)/2
+
+/Courier findfont PointSize scalefont setfont
+
+/BaselineSkipFactor 1.2 def
+
+/BaselineSkip { PointSize BaselineSkipFactor mul } def
+
+/BottomOfColumn { y 1 inch lt } def
+
+/ColumnOffPage { x ColumnWidth add 7.5 inch gt } def
+
+/Bubblesort % Here is the sorting routine, courtesy of ulfis@nada.kth.se
+{ % Usage: array Bubblesort
+ % This code may be used for arrays of strings and arrays of numbers
+ /TheArray exch def
+ /num TheArray length def
+ num 1 gt
+ {
+ 1 1 num 1 sub
+ {
+ /localcount exch def
+ num 1 sub -1 localcount
+ {
+ /innercount exch def
+ /firststring TheArray innercount 1 sub get def
+ /secondstring TheArray innercount get def
+ firststring secondstring gt
+ {
+ TheArray innercount 1 sub secondstring put
+ TheArray innercount firststring put
+ } if
+ } for
+ } for
+ } if
+} def
+
+/ColumnSpaceCheck
+{ % Usage: vertical-space-needed ColumnSpaceCheck
+ y exch
+ neg y add /y exch def
+ BottomOfColumn { pop NewColumn } { /y exch def } ifelse
+} def
+
+/FontShow
+{ % Usage: fontname FontShow
+ currentfont exch
+ findfont 0.8 PointSize mul scalefont setfont
+ (ABCDEFGHIJKLMNOPQRSTUVWXYZ) show NewLine
+ (abcdefghijklmnopqrstuvwxyz) show NewLine
+ (0123456789 !@#$%^&*()_+|~-=\\`{}[]:";'<>?,./) show NewLine
+ (The quick brown fox jumps over the lazy dog.) show NewLine
+ NewLine
+ setfont
+} def
+
+/NewColumn
+{
+ /x x ColumnWidth add def
+ /y Y def
+ ColumnOffPage { showpage NewPage } if
+ x y moveto
+} def
+
+/NewLine
+{
+ /y y BaselineSkip sub def
+ BottomOfColumn { NewColumn } if
+ x y moveto
+} def
+
+/NewPage
+{
+ /x 1 inch def
+ /Y 10 inch PointSize BaselineSkipFactor mul sub def % top of column
+ /y Y def
+ x y moveto
+} def
+
+end % fontshowdict
+%%EndProlog
+%=======================================================================
+%%BeginSetup
+/#copies 1 def
+fontshowdict begin
+
+% Count the fonts available, while putting all of the font names on
+% the stack. We need to create a new string for each of them, because
+% scratch gets reused on each loop iteration.
+/n 0 def
+systemdict /resourceforall known
+ { % Level 2 PostScript
+ /scratch 256 string def
+ (*) { /n n 1 add def dup length string cvs } scratch /Font resourceforall
+ }
+ { % Level 1 PostScript
+ FontDirectory { pop /n n 1 add def dup length string cvs } forall
+ }
+ifelse
+
+% Make an array to hold the font names and then store them from the stack
+/FontArray n array def
+FontArray astore
+
+% Sort the font array (astore left FontArray on the stack)
+Bubblesort
+
+end %fontshowdict
+%%EndSetup
+%=======================================================================
+%%Page: 1 1
+%%BeginPageSetup
+fontshowdict begin
+NewPage
+%%EndPageSetup
+
+% Display the sorted fonts: this make take several pages
+/n 0 def
+/nstr 10 string def
+FontArray
+{
+ dup
+ BaselineSkip 2 mul BaselineSkip 0.8 mul 5 mul add ColumnSpaceCheck
+ /n n 1 add def
+ n 10 lt { ( ) show } if
+ n 100 lt { ( ) show } if
+ n 1000 lt { ( ) show } if
+ n nstr cvs show
+ (: ) show
+ show
+ NewLine
+ cvn FontShow
+}
+forall
+
+/Times-Bold findfont PointSize scalefont setfont
+(Total memory: ) show
+vmstatus 40 string cvs show
+NewLine
+
+(Memory used: ) show
+40 string cvs show
+NewLine
+
+pop % discard 3rd vmstatus value
+
+(Free memory: ) show
+vmstatus exch sub 40 string cvs show
+NewLine
+
+pop % discard 3rd vmstatus value
+
+end % fontshowdict
+
+showpage
+%%PageTrailer
+%=======================================================================
+%%Trailer
+%%EOF
+
diff --git a/fonts/utilities/psposter/man2ps b/fonts/utilities/psposter/man2ps
new file mode 100644
index 0000000000..8d0f230443
--- /dev/null
+++ b/fonts/utilities/psposter/man2ps
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Filter for converting "troff -mxx" to PostScript. This script is
+# normally linked to the names man2ps, ms2ps, me2ps, and mm2ps.
+#
+# Usage:
+# man2ps [<] cc.1 >cc.ps
+# me2ps [<] foo.me >foo.ps
+# mm2ps [<] foo.mm >foo.ps
+# ms2ps [<] foo.ms >foo.ps
+#
+# [08-May-1993]
+
+# Choose a troff format according to the scrip name.
+case `basename $0` in
+ man*) FORMAT=-man ;;
+ me*) FORMAT=-me ;;
+ mm*) FORMAT=-mm ;;
+ ms*) FORMAT=-ms ;;
+ *) echo "Unknown troff format:" ; exit 1 ;;
+esac
+
+# We can use either GNU groff or Sun Solaris troff + dpost
+if [ -x /usr/local/bin/groff ]
+then # GNU groff
+ TROFF="groff $FORMAT"
+ TROFF2PS="cat"
+elif [ -x /usr/lib/lp/postscript/dpost ]
+then # Solaris 2.1
+ TROFF="troff $FORMAT"
+ TROFF2PS="/usr/lib/lp/postscript/dpost"
+else
+ echo "Cannot find troff-to-PostScript filter"
+ exit 1
+fi
+
+tbl $* | eqn | $TROFF | $TROFF2PS
diff --git a/fonts/utilities/psposter/psposter.awk b/fonts/utilities/psposter/psposter.awk
new file mode 100644
index 0000000000..cf6163161a
--- /dev/null
+++ b/fonts/utilities/psposter/psposter.awk
@@ -0,0 +1,1184 @@
+### ====================================================================
+### @Awk-file{
+### author = "Nelson H. F. Beebe",
+### version = "0.08",
+### date = "16 January 1995",
+### time = "14:49:41 MST",
+### filename = "psposter.sh",
+### address = "Center for Scientific Computing
+### Department of Mathematics
+### University of Utah
+### Salt Lake City, UT 84112
+### USA",
+### telephone = "+1 801 581 5254",
+### FAX = "+1 801 581 4148",
+### checksum = "19029 1184 5360 42015",
+### email = "beebe@math.utah.edu (Internet)",
+### codetable = "ISO/ASCII",
+### keywords = "poster, PostScript",
+### supported = "yes",
+### docstring = "Display a centered message in a very large
+### font for a poster, which is represented as an
+### output Encapsulated PostScript file which
+### will produce exactly one page.
+###
+### Usage:
+### psposter [+author] [+bd color] [+bg color]
+### [+bs factor] [+bw dimension]
+### [+c nnn] [+copyright] [+d ]
+### [+fg color] [+fn fontname]
+### [+h dimension] [+help] [+l]
+### [+mw dimension] [+p dimension]
+### [+paper form] [+s factor]
+### [+table {8/o | 8/h | 16/o | 16/h}]
+### [+version] [+w dimension]
+### [+x dimension] [+y dimension]
+### ['?'] [++]
+### [word(s) or <infile] >PostScript-file
+###
+### The font size is normally chosen
+### automatically so that the longest line fills
+### the page, but a fixed font size may be
+### requested if required.
+###
+### If there are too many lines to fit on one
+### page, lines will be lost at the top and
+### bottom of the page.
+###
+### Options are provided to change colors, to
+### request multiple copies, to adjust the
+### position, scale, and orientation, and to
+### select the font.
+###
+### Each poster line consists of one argument,
+### if the words come from the command line, or
+### one line, if the words come from a file.
+###
+### The checksum field above contains a CRC-16
+### checksum as the first value, followed by the
+### equivalent of the standard UNIX wc (word
+### count) utility output of lines, words, and
+### characters. This is produced by Robert
+### Solovay's checksum utility.",
+### }
+### ====================================================================
+BEGIN {
+ VERSION_NUMBER = "0.08"
+ VERSION = "Version " VERSION_NUMBER " [16-Jan-1995]"
+ AFMPATH = ENVIRON["AFMPATH"]
+ if (AFMPATH == "") # supply default fallback search path
+ AFMPATH = "/usr/local/lib/afm"
+ split(AFMPATH,afmpath,":")
+ AFMMAPFILE = find_file(afmpath,"afmfonts.map")
+ if (AFMMAPFILE == "")
+ warning("Cannot find font mapping file [afmfonts.map]")
+
+ DEFAULT_FONT_NAME = "Times-Bold"
+
+ RGBPATH = ENVIRON["RGBPATH"]
+ if (RGBPATH == "") # supply default fallback search path
+ RGBPATH = "/usr/lib/X11:/usr/openwin/lib/X11:/usr/local/lib/X11:/usr/local/X11R5/lib"
+ split(RGBPATH,rgbpath,":")
+ RGBTXTFILE = find_file(rgbpath,"rgb.txt")
+ if (RGBTXTFILE == "")
+ warning("Cannot find X11 color data base file [rgb.txt]")
+
+ angle = "" # empty string means unset
+ background = "0.9 0.9 0.9" # 10% gray
+ baseline_skip = 1.2
+ border_color = "0.5 0.5 0.5" # 50% gray
+ border_width = 10 # big points
+ copies = 1
+ display_fontsize = 0
+ font_name = DEFAULT_FONT_NAME
+ foreground = "0 0 0" # black
+ height = 0
+ width = 0
+ landscape = 0
+ make_font_table = 0
+ margin_width = "" # empty string means unset
+ paper_name = ""
+ point_size = 0
+ ScaleFactor = 1
+ x_offset = 0
+ y_offset = 0
+
+ initialize_paper_table()
+
+ for (k = 1; k < ARGC; ++k) # preserve original command-line arguments
+ OLD_ARGV[k] = ARGV[k]
+
+ for (k = 1; k < ARGC; k++) # collect +switches
+ {
+ if (ARGV[k] == "+author")
+ author()
+ else if (ARGV[k] == "+bd")
+ {
+ border_color = ARGV[++k]
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+bg")
+ {
+ background = ARGV[++k]
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+bs")
+ {
+ baseline_skip = ARGV[++k] + 0
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+bw")
+ {
+ border_width = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+c")
+ {
+ copies = ARGV[++k] + 0
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+copyright")
+ copyright()
+ else if (ARGV[k] == "+d")
+ display_fontsize = 1
+ else if (ARGV[k] == "+fg")
+ {
+ foreground = ARGV[++k]
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+fn")
+ {
+ font_name = ARGV[++k]
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+h")
+ {
+ height = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if ((ARGV[k] == "+help") || (ARGV[k] == "?"))
+ usage()
+ else if (ARGV[k] == "+l")
+ {
+ landscape = 1
+ angle = +90
+ }
+ else if (ARGV[k] == "+mw")
+ {
+ margin_width = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+s")
+ {
+ ScaleFactor = ARGV[++k] + 0
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+table")
+ {
+ parse_table_type(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+p")
+ {
+ point_size = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+paper")
+ {
+ set_paper_dimensions(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+r")
+ {
+ angle = ARGV[++k] + 0
+ ARGV[k] = "" # forget this argument
+ angle = angle % 360 # reduce to -360 .. 360
+ if (angle < 0) # and reduce again to 0 .. 359
+ angle += 360
+ if (!((angle == 0) || (angle == 90) || (angle == 180) || (angle == 270)))
+ error("rotation angle is not a multiple of 90 degrees in -360 .. +360")
+ }
+ else if (ARGV[k] == "+version")
+ version()
+ else if (ARGV[k] == "+w")
+ {
+ width = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+x")
+ {
+ x_offset = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "+y")
+ {
+ y_offset = bigpoint(ARGV[++k])
+ ARGV[k] = "" # forget this argument
+ }
+ else if (ARGV[k] == "++") # no more arguments
+ {
+ while (k < ARGC) # remaining words are for poster text
+ {
+ word[++n] = ARGV[++k]
+ ARGV[k] = "" # forget this argument
+ }
+ }
+ else if (ARGV[k] ~ /^[ \t]*[+]/)
+ error("unrecognized option [" ARGV[k] "]: try +help for more information")
+ else
+ word[++n] = ARGV[k]
+ }
+
+ if ((n == 0) && (make_font_table == 0))
+ { # no words supplied, so read stdin for lines to print
+ while (getline <"/dev/stdin" > 0)
+ word[++n] = $0
+ }
+
+ if (paper_name == "")
+ set_paper_dimensions("A")
+
+ if (margin_width == "")
+ margin_width = (paper_left + paper_right + paper_top + paper_bottom)/4
+ if (height == 0)
+ height = paper_height
+ if (width == 0)
+ width = paper_width
+
+ #
+ # Here is what the picture will look like. Ps mark the PAGE
+ # boundary, enclosing a region of size (PageWidth,PageHeight).
+ # Ms mark the MARGIN, and Bs mark the border; both have
+ # constant width on all four edges. The inner frame contains
+ # the poster text; it has width W (TextWidth) and height H
+ # (TextHeight). The lower-left corner of the MARGIN area is at
+ # (xoffset,yoffset) from the lower-left page corner. The
+ # BoundingBox surrounds the border rectangle marked by Bs.
+ #
+ # For full page posters, normally (xoffset,yoffset) = (0,0),
+ # but the MarginWidth is non-zero, because most PostScript
+ # output devices are incapable of printing closer than about
+ # 5mm to the edge of the printing surface.
+ #
+ # The inner frame may be further scaled by ScaleFactor;
+ # that scaling applies to everything, EXCEPT
+ # (xoffset,yoffset), because those offsets are used to
+ # position the scaled picture on the page.
+ #
+ # PPPPPPPPPPPPPPPPPPPPPPPP
+ # P P
+ # P P
+ # P MMMMMMMMMMMMMMMMMM P
+ # P MMMMMMMMMMMMMMMMMM P
+ # P MMBBBBBBBBBBBBBBMM P
+ # P MMB ^ BMM P
+ # P MMB | BMM P
+ # P MMB<-+----W--->BMM P
+ # P MMB | BMM P
+ # P MMB | BMM P
+ # P MMB H BMM P
+ # P MMB | BMM P
+ # P MMB | BMM P
+ # P MMB | BMM P
+ # P MMB | BMM P
+ # P MMB | BMM P
+ # P MMB v BMM P
+ # P MMBBBBBBBBBBBBBBMM P
+ # P MMMMMMMMMMMMMMMMMM P
+ # P MMMMMMMMMMMMMMMMMM P
+ # ^ P P
+ # | P P
+ # yoffset | P P
+ # | P P
+ # v PPPPPPPPPPPPPPPPPPPPPPPP
+ # <->xoffset
+ #
+
+ # NB: text_width and text_height must match the definitions of the
+ # PostScript values TextWidth and TextHeight below
+ text_width = width - 2*margin_width - 2*border_width
+ text_height = height - 2*margin_width - 2*border_width
+
+ "date" | getline current_date_and_time
+ if ("USER" in ENVIRON)
+ username = ENVIRON["USER"]
+ else if ("LOGNAME" in ENVIRON)
+ username = ENVIRON["LOGNAME"]
+ else
+ username = "unknown"
+ "awk -F: '/^" username "/ {print $5}' /etc/passwd" | \
+ getline personal_name
+ "hostname" | getline hostname
+
+ print "%!PS-Adobe-3.0 EPSF-3.0"
+ printf("%%%%Title: psposter")
+ for (k = 1; k < ARGC; ++k)
+ printf(" %s",OLD_ARGV[k])
+ print ""
+
+ print "%%CreationDate:", current_date_and_time
+ print "%%Creator: psposter", VERSION
+ print "%%For: " personal_name " <" username "@" hostname ">"
+ print "%%BoundingBox:", \
+ floor(x_offset + ScaleFactor * margin_width), \
+ floor(y_offset + ScaleFactor * margin_width), \
+ ceil(x_offset + \
+ ScaleFactor * (margin_width + text_width + 2*border_width)), \
+ ceil(y_offset + \
+ ScaleFactor * (margin_width + text_height + 2*border_width))
+ print "%%DocumentMedia:", paper_name, \
+ ceil(paper_width), ceil(paper_height), "() () ()"
+ print "%%DocumentData: Clean7Bit"
+ print "%%DocumentFonts: font",font_name
+ print "%%DocumentNeededResources: font", font_name
+ print "%%Orientation:", (landscape ? "Landscape" : "Portrait")
+ print "%%PageOrder: Ascend"
+ print "%%Pages: 1"
+ print "%%EndComments"
+ print "%======================================================================="
+ print "%%BeginProlog"
+ print "/psposterdict 50 dict def"
+ print "psposterdict begin"
+ print "/inch { 72 mul } def"
+ print "/BackgroundColor {", getcolor(background), "} def %",background
+ print "/BaselineSkipFactor", baseline_skip, "def"
+ print "/BorderColor {", getcolor(border_color), "} def %",border_color
+ print "/BorderWidth", border_width, "def"
+ print "/CapHeight"
+ print "{"
+ print "\tgsave newpath 0 0 moveto (M) true charpath pathbbox"
+ print "\texch pop sub neg exch pop grestore"
+ print "} def"
+ print "/ForegroundColor {", getcolor(foreground), "} def %",foreground
+ if (angle != "") # "+rotation angle" overrides "+l"
+ landscape = (angle / 90) % 2
+ print "/LandscapeMode", (landscape ? "true" : "false"), "def"
+ print "/MarginWidth", margin_width, "def"
+ print "/PageHeight", paper_height, "def"
+ print "/PageWidth", paper_width, "def"
+ print "/Height", height, "def"
+ print "/Width", width, "def"
+ print "/PointSize", point_size, "def"
+ print "/ROTATE_0 {} def"
+ print "/ROTATE_90 {Width 0 translate 90 rotate} bind def"
+ print "/ROTATE_180 {Width Height translate 180 rotate} bind def"
+ print "/ROTATE_270 {0 Height translate 270 rotate} bind def"
+ print "/ScaleFactor", ScaleFactor, "def"
+
+ print "LandscapeMode"
+ print "{"
+ print "\t/TextHeight Width MarginWidth 2 mul sub BorderWidth 2 mul sub def"
+ print "\t/TextWidth Height MarginWidth 2 mul sub BorderWidth 2 mul sub def"
+ print "}"
+ print "{"
+ print "\t/TextHeight Height MarginWidth 2 mul sub BorderWidth 2 mul sub def"
+ print "\t/TextWidth Width MarginWidth 2 mul sub BorderWidth 2 mul sub def"
+ print "}"
+ print "ifelse"
+
+ print "/XOffset", x_offset, "def"
+ print "/YOffset", y_offset, "def"
+
+ print "% Center and show a string at the current point, leaving"
+ print "% point at the center of the next line."
+ print "% Usage: (string) cshow"
+ print "/cshow"
+ print "{"
+ print "\tcurrentpoint /cpy exch def /cpx exch def"
+ print "\tdup stringwidth pop 0.5 mul neg 0 rmoveto show"
+ print "\tcpx cpy moveto"
+ print "\tNewLine"
+ print "} def"
+
+ print "/max"
+ print "{"
+ print "\t/a exch def"
+ print "\t/b exch def"
+ print "\ta b gt { a } { b } ifelse"
+ print "} def"
+
+ print "/min"
+ print "{"
+ print "\t/a exch def"
+ print "\t/b exch def"
+ print "\ta b lt { a } { b } ifelse"
+ print "} def"
+
+ print "/TheFont /" font_name " def"
+
+ print "% Set the font size so that longest PosterLines string fills the TextWidth"
+ print "% Usage: setfontsize"
+ print "/setfontsize"
+ print "{"
+ print "\tTheFont findfont 10 scalefont setfont"
+ print "\t% Set TheFontSize according to maximum string width"
+ print "\t0 PosterLines { stringwidth pop max } forall TextWidth exch div 10 mul"
+ print "\t/TheFontSize exch def"
+ print "\t% Adjust TheFontSize according to the number of text lines"
+ print "\tLineCount TheFontSize mul BaselineSkipFactor mul"
+ print "\tTextHeight div"
+ print "\tdup 1 gt { TheFontSize exch div /TheFontSize exch def } { pop } ifelse"
+ if (point_size > 0) # override
+ {
+ print "\t% NB: The following definition silently overrides the previous one"
+ print "\t/TheFontSize PointSize def"
+ }
+ print "\t/BaselineSkip BaselineSkipFactor TheFontSize mul def"
+ print "\tTheFont findfont TheFontSize scalefont setfont"
+ print "} def"
+
+ print "/NewLine {0 BaselineSkip neg rmoveto} def"
+
+ print "/PosterLines"
+ print "["
+ for (k = 1; k <= n; ++k)
+ print "\t(" word[k] ")"
+ print "] def"
+ print "/LineCount PosterLines length 1 max def"
+ if (make_font_table)
+ print_font_table_macros()
+ print "end % psposterdict"
+ print "%%EndProlog"
+
+ print "%======================================================================="
+ print "%%BeginSetup"
+ print "/#copies", copies," def"
+
+ # Now see if we have a font that must be downloaded. If we do not
+ # find it, we silently assume that it is a resident font on the
+ # output PostScript device. AFMMAPFILE lines look like this:
+ # ZapfChancery-MediumItalic = ZapChaMI % Optional comment
+
+ if (AFMMAPFILE == "")
+ mapline = ""
+ else
+ "grep 2>/dev/null \"^" font_name "[ \t]\" " AFMMAPFILE | getline mapline
+
+ k = index(mapline,"=")
+ if (k > 0) # copy font using mapped filename
+ {
+ basename = substr(mapline,k+1)
+ gsub(/%.*$/,"",basename) # discard inline comment
+ gsub(/[ \t]/,"",basename) # and spaces
+ }
+ else # try to copy font using native file name
+ basename = font_name
+
+ filename = find_file(afmpath, basename ".pfa")
+ if (filename == "")
+ filename = find_file(afmpath, basename ".pfb")
+ if (filename == "")
+ filename = find_file(afmpath, basename ".pfa.gz")
+ if (filename == "")
+ filename = find_file(afmpath, basename ".pfa.Z")
+ if (filename == "")
+ filename = find_file(afmpath, basename ".pfb.gz")
+ if (filename == "")
+ filename = find_file(afmpath, basename ".pfb.Z")
+ if (filename != "") # download the font
+ copyfont(filename)
+
+ print "%%EndSetup"
+
+ print "%======================================================================="
+ print "%%Page: 1 1"
+ print "%%BeginPageSetup"
+ print "psposterdict begin"
+ print "XOffset YOffset translate"
+ print "ScaleFactor dup scale"
+ print "ROTATE_" (angle + 0)
+ print "end % psposterdict"
+ print "%%EndPageSetup"
+ print ""
+ print "psposterdict begin"
+ print "% Draw a frame box and fill it with the background color, and a border color."
+ print "BorderWidth setlinewidth"
+ print "newpath"
+ print "MarginWidth BorderWidth 0.5 mul add dup moveto"
+ print "TextWidth BorderWidth add 0 rlineto"
+ print "0 TextHeight BorderWidth add rlineto"
+ print "TextWidth BorderWidth add neg 0 rlineto"
+ print "closepath"
+ print "BackgroundColor setrgbcolor gsave fill grestore"
+ print "BorderColor setrgbcolor stroke"
+
+ print ""
+ print "0 0 0 setrgbcolor % revert to black"
+
+ print ""
+ print "% Set the clipping path to the text region"
+ print "0 setlinewidth"
+ print "newpath"
+ print "MarginWidth BorderWidth add dup moveto"
+ print "TextWidth 0 rlineto"
+ print "0 TextHeight rlineto"
+ print "TextWidth neg 0 rlineto"
+ print "closepath"
+ print "clip"
+
+ print ""
+ print "% Move origin to text box center, since x = 0 is a convenient"
+ print "% value for centering text."
+ print "LandscapeMode"
+ print "\t{ Height 0.5 mul Width 0.5 mul translate }"
+ print "\t{ Width 0.5 mul Height 0.5 mul translate }"
+ print "ifelse"
+
+ if (make_font_table)
+ {
+ print "% Typeset the poster text."
+ print "TheFont MakeFontTable"
+ }
+ else
+ {
+ print "% Set font size so that the longest line just fills the TextWidth."
+ print "setfontsize"
+ print "% Center the text vertically, such that the middle line has its text"
+ print "% (rather than baseline distance) centered on a horizontal line"
+ print "% passing through the center of the picture."
+ print "0 LineCount 0.5 mul BaselineSkip mul BaselineSkip sub moveto"
+
+ print "0 BaselineSkip CapHeight sub 0.5 mul rmoveto"
+
+ print "ForegroundColor setrgbcolor"
+ print "% Typeset the poster text."
+ print "PosterLines { cshow } forall"
+ }
+ print "end % psposterdict"
+ print "showpage"
+ print "%%PageTrailer"
+
+ if (display_fontsize)
+ {
+ print "%%Page: 2 2"
+ print "%%BeginPageSetup"
+ print "psposterdict begin"
+ print "/tempstr 25 string def"
+ print "/Courier findfont 20 scalefont setfont"
+ print "/BaselineSkip 20 1.2 mul def"
+ print "72 PageHeight 2 div moveto"
+ print "(Set font pointsize by) show"
+ print "/Courier-BoldOblique findfont 20 scalefont setfont"
+ print "( +p ) show"
+ print "TheFontSize ScaleFactor div tempstr cvs show"
+ print "(bp) show"
+ print "showpage"
+ print "end % psposterdict"
+ print "%%PageTrailer"
+ }
+
+ print "%======================================================================="
+ print "%%Trailer"
+ print "%%EOF"
+
+ exit (0) # all done (no command-line words are files)
+}
+
+function author()
+{
+ print \
+ "Author:\n" \
+ "\tNelson H. F. Beebe\n" \
+ "\tCenter for Scientific Computing\n" \
+ "\tDepartment of Mathematics\n" \
+ "\tUniversity of Utah\n" \
+ "\tSalt Lake City UT 84112\n" \
+ "\tUSA\n" \
+ "\tTel: +1 801 581 5254\n" \
+ "\tFAX: +1 801 581 4801\n" \
+ "\tEmail: <beebe@math.utah.edu>\n"
+ url()
+ exit (0)
+}
+
+function bigpoint(dimension)
+{
+ return (72 * inch(dimension))
+}
+
+function ceil(x, n)
+{
+ n = int(x)
+ if (n < x) ++n
+ return (n)
+}
+
+function copyfont(filename, filter,fontline)
+{
+ # NB: .pfb files are binary: gawk can copy them, but nawk cannot.
+ # Even so, before the font can be included in a PostScript file,
+ # it must be converted to ASCII form. We therefore invoke t1ascii
+ # on-the-fly to handle the conversion, plus gunzip or uncompress,
+ # if needed for decompression. t1ascii writes a version banner
+ # to stderr, so we redirect it to /dev/null.
+
+ print "%%BeginResource: font " font_name
+ if (filename ~ /.pfb$/) # convert from .pfb to .pfa on-the-fly
+ filter = "t1ascii 2>/dev/null " filename
+ else if (filename ~ /.pfa.gz$/) # convert from .pfa.gz to .pfa on-the-fly
+ filter = "gunzip <" filename
+ else if (filename ~ /.pfb.gz$/) # convert from .pfb.gz to .pfa on-the-fly
+ filter = "gunzip <" filename " | t1ascii 2>/dev/null "
+ else if (filename ~ /.pfa.Z$/) # convert from .pfa.Z to .pfa on-the-fly
+ filter = "uncompress <" filename
+ else if (filename ~ /.pfb.Z$/) # convert from .pfb.Z to .pfa on-the-fly
+ filter = "uncompress <" filename " | t1ascii 2>/dev/null "
+ else
+ filter = "cat " filename
+ print "% file:", filename
+ if (filter !~ /^cat /) print "% filter:", filter
+ while (filter | getline fontline)
+ print fontline
+ close (filter)
+ print "% font:",font_name
+ print "% file:",filename
+ print "%%EndResource"
+}
+
+function copyright()
+{
+ print \
+ "*********************************************\n" \
+ "*********************************************\n" \
+ "*** This program is in the PUBLIC DOMAIN. ***\n" \
+ "*********************************************\n" \
+ "*********************************************\n"
+ url()
+ exit (0)
+}
+
+function error(message)
+{
+ print message > "/dev/tty"
+ exit (1)
+}
+
+function file_exists(filename)
+{
+ # Unfortunately, getline in both nawk and gawk will hang if its
+ # file does not exist, so we need to test for file existence by
+ # invoking a shell command, sigh...
+
+ return (system("test -f " filename) == 0)
+}
+
+function find_file(path,filename, fullname,k)
+{
+ for (k = 1; k in path; ++k)
+ {
+ fullname = path[k] "/" filename
+ if (file_exists(fullname))
+ return (fullname)
+ }
+ return ("")
+}
+
+function floor(x, n)
+{
+ n = int(x)
+ if (n > x) --n
+ return (n)
+}
+
+function getcolor(value)
+{ # value is e.g. "0.5/0.25/0.9" or "yellow"
+ if (value ~ /[A-Za-z]/) # named color
+ {
+ if (RGBTXTFILE == "")
+ rgbline = "0 0 0" # default to black
+ else
+ ("grep 2>/dev/null -i '^[0-9 \t]*" value "[ \t]*$' " RGBTXTFILE) | \
+ getline rgbline
+ split(rgbline,rgb," ")
+ value = (rgb[1] / 255) " " (rgb[2] / 255) " " (rgb[3] / 255)
+ }
+ else # expect numbered color
+ gsub(/[^0-9.]/," ",value) # eliminate punctuation
+ return (value)
+}
+
+function inch(units, value)
+{
+ value = units + 0 # coerce to number
+
+ if (units ~ "[-+]?[0-9]+[.]?[0-9]*bp") # big points
+ value /= 72.0
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*in") # inches
+ ; # NO-OP
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*cm") # centimeters
+ value /= 2.54
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*pt") # points
+ value /= 72.27
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*cc") # cicero
+ value *= 12.0 * (1238.0 / 1157.0) / 72.27
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*dd") # didot points
+ value *= (1238.0 / 1157.0) / 72.27
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*mm") # millimeters
+ value /= 25.4
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*pc") # pica
+ value *= 12.0 / 72.27
+ else if (units ~ "[-+]?[0-9]+[.]?[0-9]*sp") # scaled points
+ value /= (65536.0 * 72.27)
+ else
+ error("unrecognized dimension " units)
+ return (value)
+}
+
+function initialize_paper_table()
+{
+ # name width height left right bottom top
+
+ # ANSI (note that B folded in half becomes A, etc.) (portrait)
+
+ paper["A"] = "8.5in 11in 1in 1in 1in 1in"
+ paper["B"] = "11in 17in 1in 1in 1in 1in"
+ paper["C"] = "17in 22in 1in 1in 1in 1in"
+ paper["D"] = "22in 34in 1in 1in 1in 1in"
+ paper["E"] = "34in 44in 1in 1in 1in 1in"
+
+ # Common US designations (portrait)
+
+ paper["Computer-1411"] = "14in 11in 1in 1in 1in 1in"
+ paper["Legal"] = "8.5in 13in 1in 1in 1in 1in"
+ paper["Letter"] = "8.5in 11in 1in 1in 1in 1in"
+ paper["US-Legal"] = "8.5in 14in 1in 1in 1in 1in"
+
+ # Common US designations (landscape)
+
+ paper["A-L"] = "11in 8.5in 1in 1in 1in 1in"
+ paper["Computer-1411-L"] = "11in 14in 1in 1in 1in 1in"
+ paper["Legal-L"] = "13in 8.5in 1in 1in 1in 1in"
+ paper["Letter-L"] = "11in 8.5in 1in 1in 1in 1in"
+ paper["US-Legal-L"] = "14in 8.5in 1in 1in 1in 1in"
+
+ # Additional paper and envelope sizes taken from <<Hewlett-Packard
+ # LaserJet Family Paper Specification Guide>> (1992).
+
+ paper["COM10"] = "4.1in 9.5in 1in 1in 1in 1in"
+ paper["DL"] = "110mm 220mm 25mm 25mm 25mm 25mm"
+ paper["Executive"] = "7.25in 10.5in 1in 1in 1in 1in"
+ paper["Monarch"] = "3.9in 7.5in 1in 1in 1in 1in"
+
+ # Miscellaneous and Imagen Ultrascript paper sizes
+
+ paper["A4Small"] = "210mm 297mm 25mm 25mm 25mm 25mm"
+ paper["Ledger"] = "11in 17in 1in 1in 1in 1in"
+ paper["LetterSmall"] = "8.5in 11in 1in 1in 1in 1in"
+ paper["Note"] = "8.5in 11in 1in 1in 1in 1in"
+
+ # ISO standard paper A-series (portrait). Note that Xn folded in half
+ # becomes Xn+1 (X = A, B, C)
+
+ paper["A0"] = "841mm 1189mm 25mm 25mm 25mm 25mm"
+ paper["A1"] = "594mm 841mm 25mm 25mm 25mm 25mm"
+ paper["A2"] = "420mm 594mm 25mm 25mm 25mm 25mm"
+ paper["A3"] = "297mm 420mm 25mm 25mm 25mm 25mm"
+ paper["A4"] = "210mm 297mm 25mm 25mm 25mm 25mm"
+ paper["A5"] = "148mm 210mm 25mm 25mm 25mm 25mm"
+ paper["A6"] = "105mm 148mm 25mm 25mm 25mm 25mm"
+ paper["A7"] = "74mm 105mm 25mm 25mm 25mm 25mm"
+ paper["A8"] = "52mm 74mm 25mm 25mm 25mm 25mm"
+ paper["A9"] = "37mm 52mm 25mm 25mm 25mm 25mm"
+ paper["A10"] = "26mm 37mm 25mm 25mm 25mm 25mm"
+
+ # ISO standard paper A-series (landscape). Note that the final L
+ # is NOT prefixed by a hyphen.
+
+ paper["A0L"] = "1189mm 841mm 25mm 25mm 25mm 25mm"
+ paper["A1L"] = "841mm 594mm 25mm 25mm 25mm 25mm"
+ paper["A2L"] = "594mm 420mm 25mm 25mm 25mm 25mm"
+ paper["A3L"] = "420mm 297mm 25mm 25mm 25mm 25mm"
+ paper["A4L"] = "297mm 210mm 25mm 25mm 25mm 25mm"
+ paper["A5L"] = "210mm 148mm 25mm 25mm 25mm 25mm"
+ paper["A6L"] = "148mm 105mm 25mm 25mm 25mm 25mm"
+ paper["A7L"] = "105mm 74mm 25mm 25mm 25mm 25mm"
+ paper["A8L"] = "74mm 52mm 25mm 25mm 25mm 25mm"
+ paper["A9L"] = "52mm 37mm 25mm 25mm 25mm 25mm"
+ paper["A10L"] = "37mm 26mm 25mm 25mm 25mm 25mm"
+
+ # ISO intermediate paper B-series (portrait)
+
+ paper["B0"] = "1000mm 1414mm 25mm 25mm 25mm 25mm"
+ paper["B1"] = "707mm 1000mm 25mm 25mm 25mm 25mm"
+ paper["B2"] = "500mm 707mm 25mm 25mm 25mm 25mm"
+ paper["B3"] = "353mm 500mm 25mm 25mm 25mm 25mm"
+ paper["B4"] = "250mm 353mm 25mm 25mm 25mm 25mm"
+ paper["B5"] = "176mm 250mm 25mm 25mm 25mm 25mm"
+ paper["B6"] = "125mm 176mm 25mm 25mm 25mm 25mm"
+
+ # ISO intermediate paper B-series (landscape)
+
+ paper["B0L"] = "1414mm 1000mm 25mm 25mm 25mm 25mm"
+ paper["B1L"] = "1000mm 707mm 25mm 25mm 25mm 25mm"
+ paper["B2L"] = "707mm 500mm 25mm 25mm 25mm 25mm"
+ paper["B3L"] = "500mm 353mm 25mm 25mm 25mm 25mm"
+ paper["B4L"] = "353mm 250mm 25mm 25mm 25mm 25mm"
+ paper["B5L"] = "250mm 176mm 25mm 25mm 25mm 25mm"
+ paper["B6L"] = "176mm 125mm 25mm 25mm 25mm 25mm"
+
+ # ISO envelopes for A-series
+
+ paper["C0"] = "1294mm 916mm 25mm 25mm 25mm 25mm"
+ paper["C1"] = "916mm 647mm 25mm 25mm 25mm 25mm"
+ paper["C2"] = "647mm 458mm 25mm 25mm 25mm 25mm"
+ paper["C3"] = "458mm 323mm 25mm 25mm 25mm 25mm"
+ paper["C4"] = "323mm 229mm 25mm 25mm 25mm 25mm"
+ paper["C5"] = "229mm 161mm 25mm 25mm 25mm 25mm"
+ paper["C6"] = "161mm 114mm 25mm 25mm 25mm 25mm"
+
+ # British paper sizes (some are also used in the USA)
+
+ paper["Octavo"] = "5in 8in 1in 1in 1in 1in"
+ paper["Sixmo"] = "6.5in 8in 1in 1in 1in 1in"
+ paper["Quarto"] = "8in 10in 1in 1in 1in 1in"
+ paper["Foolscap"] = "8.5in 13in 1in 1in 1in 1in"
+ paper["Government-legal"] = "8.5in 13in 1in 1in 1in 1in"
+ paper["Folio"] = "8.3in 13in 1in 1in 1in 1in"
+}
+
+function parse_table_type(s, parts,t)
+{
+ t = s
+ gsub(/[^0-9A-Za-z]/," ",t)
+ split(t,parts," ")
+ table_columns = 0 + parts[1]
+ label_base = (parts[2] ~ /^[oO]$/) ? 8 : ((parts[2] ~ /^[hH]$/) ? 16 : 0)
+ if (((table_columns != 8) && (table_columns != 16)) || \
+ ((label_base != 8) && (label_base != 16)))
+ {
+ warning("Unrecognized +table value `" s \
+ "': expected one of 8/o 16/o 8/h 16/h. Defaulting to 8/o.")
+ parse_table_type("8/o")
+ }
+ make_font_table = s
+}
+
+function print_font_table_macros()
+{
+ print "/Black { 0 0 0 } def"
+ print "/LabelBase " label_base " def"
+ print "/TableColumns " table_columns " def"
+ print "/LabelChars 3 def % 0x3_ or \\12_; 3 looks better than 4"
+ print "/RowChars TableColumns def"
+ print "/TheRow RowChars string def % 8 or 16 characters"
+ print "/TitleLines TableColumns 8 eq LabelBase 16 eq and { 3 } { 2 } ifelse def"
+ print "/TableLines 256 TableColumns div TitleLines add def % 16 or 32 char rows and 2 or 3 title rows"
+ print "PointSize 0 eq"
+ print "\t{"
+ print "\t\t/dx"
+ print "\t\t\tTextWidth RowChars LabelChars add div"
+ print "\t\t\tTextHeight TableLines BaselineSkipFactor mul div"
+ print "\t\t\tmin"
+ print "\t\t\tcvi"
+ print "\t\tdef"
+ print "\t}"
+ print "\t{"
+ print "\t\t/dx PointSize def"
+ print "\t}"
+ print "ifelse"
+ print "/TheFontSize dx def"
+ print "/BaselineSkip BaselineSkipFactor TheFontSize mul def"
+ print "/LabelWidth dx LabelChars mul def"
+ print "/TableHeight BaselineSkip TableLines mul def"
+ print "/TableWidth dx 2 mul RowChars mul dx add LabelWidth add def"
+ print "/TitleBoxHeight BaselineSkip TitleLines mul def"
+ print ""
+ print "/KernShow"
+ print "{ % Usage: (string) KernShow % show with characters of width 2*dx"
+ print "\tSavePosition"
+ print "\t{ % stack: c(n) c(n+1)"
+ print "\t\tpop pop"
+ print "\t\t/x x dx 2 mul add def"
+ print "\t\tx y moveto"
+ print "\t}"
+ print "\texch kshow"
+ print "} def"
+ print "/MakeFontTable"
+ print "{ % Usage: /fontname MakeFontTable"
+ print " % (0,0) is at page center"
+ print "\tfindfont TheFontSize scalefont setfont"
+ print "\tTableWidth -2 div TableHeight 2 div moveto"
+ print "\tShowTableTitle"
+ print "\tgsave"
+ print "\t\tSetLabelFont"
+ print "\t\tSetLabelColor"
+ print "\t\tLabelWidth dx add 0 rmoveto"
+ print "\t\tTableColumns 16 eq"
+ print "\t\t\t{"
+ print "\t\t\t\tLabelBase 16 eq"
+ print "\t\t\t\t\t{(0123456789abcdef)}"
+ print "\t\t\t\t\t{(0123456701234567)}"
+ print "\t\t\t\tifelse"
+ print "\t\t\t}"
+ print "\t\t\t{"
+ print "\t\t\t\t(01234567)"
+ print "\t\t\t}"
+ print "\t\tifelse"
+ print "\t\tKernShow"
+ print "\tgrestore"
+ print "\tTableColumns 8 eq LabelBase 16 eq and"
+ print "\t\t{"
+ print "\t\t\tNewLine"
+ print "\t\t\tgsave"
+ print "\t\t\t\tSetLabelFont"
+ print "\t\t\t\tSetLabelColor"
+ print "\t\t\t\tLabelWidth dx add 0 rmoveto"
+ print "\t\t\t\t(89abcdef) KernShow"
+ print "\t\t\tgrestore"
+ print "\t\t}"
+ print "\tif"
+ print "\tSavePosition"
+ print "\t1 setlinewidth"
+ print "\tSetLabelColor"
+ print "\tx y TitleBoxHeight add TableWidth ShowHorizontalRule"
+ print "\tx y TableWidth ShowHorizontalRule"
+ print "\tx y TitleBoxHeight add TableHeight ShowVerticalRule"
+ print "\tx LabelWidth add y TitleBoxHeight add TableHeight ShowVerticalRule"
+ print "\tx TableWidth add y TitleBoxHeight add TableHeight ShowVerticalRule"
+ print "\tTableColumns 16 eq"
+ print "\t\t{"
+ print "\t\t\tx LabelWidth add TableWidth LabelWidth sub 2 div add"
+ print "\t\t\ty TableHeight TitleBoxHeight sub ShowVerticalRule"
+ print "\t\t}"
+ print "\tif"
+ print "\tx y moveto"
+ print "\tNewLine"
+ print "\tForegroundColor setrgbcolor"
+ print "\tShowCharacterTable"
+ print "\tSetLabelColor"
+ print "\tReverseNewline"
+ print "\tx y TableWidth ShowHorizontalRule"
+ print "} def"
+ print "\t/NewLine {0 BaselineSkip neg rmoveto SavePosition} def"
+ print "/ReverseNewline {0 BaselineSkip rmoveto SavePosition} def"
+ print "/RuleVerticalOffset BaselineSkip -0.2 mul def"
+ print "/SavePosition { currentpoint /y exch def /x exch def } def"
+ print "/SetLabelColor { Black setrgbcolor } def"
+ print "/SetLabelFont"
+ print "{"
+ print "\t/Times-BoldItalic findfont TheFontSize scalefont setfont"
+ print "} def"
+ print "/ShowCharacterTable"
+ print "{"
+ print "\t0 TableColumns 255"
+ print "\t{"
+ print "\t\t/n exch def"
+ print "\t\tn 8#100 mod 8#070 eq"
+ print "\t\t{"
+ print "\t\t\tgsave"
+ print "\t\t\t SetLabelColor"
+ print "\t\t\t x y TableWidth ShowHorizontalRule"
+ print "\t\t\tgrestore"
+ print "\t\t} if"
+ print "\t\tShowRowLabel"
+ print "\t\tgsave"
+ print "\t\t\tLabelWidth dx add 0 rmoveto"
+ print "\t\t\tShowRow"
+ print "\t\tgrestore"
+ print "\t\tNewLine"
+ print "\t} for"
+ print "} def"
+ print "/ShowHorizontalRule"
+ print "{ % Usage: x y len ShowHorizontalRule"
+ print "\tgsave"
+ print "\t\t/r exch def"
+ print "\t\tnewpath"
+ print "\t\t\tmoveto"
+ print "\t\t\t0 RuleVerticalOffset rmoveto"
+ print "\t\t\tr 0 rlineto"
+ print "\t\tstroke"
+ print "\tgrestore"
+ print "} def"
+ print "/ShowRow"
+ print "{ % Usage: ShowRow"
+ print "\tgsave"
+ print "\t\t0 1 TableColumns 1 sub"
+ print "\t\t{"
+ print "\t\t\t/k exch def"
+ print "\t\t\tTheRow k n k add put % char"
+ print "\t\t} for % create character row"
+ print "\t\tSavePosition"
+ print "\t\tTheRow KernShow"
+ print "\tgrestore"
+ print "} def"
+ print "/ShowRowLabel"
+ print "{ % Usage: ShowRowLabel"
+ print "\tcurrentpoint"
+ print "\tgsave"
+ print "\t\tSetLabelColor"
+ print "\t\tSetLabelFont"
+ print "\t\tLabelBase 16 eq"
+ print "\t\t\t{"
+ print "\t\t\t\t/TempStr 5 string def"
+ print "\t\t\t\tTempStr 0 ( ) putinterval"
+ print "\t\t\t\tn 16 idiv 8#10000 add 16 TempStr cvrs pop"
+ print "\t\t\t\t/k 0 def"
+ print "\t\t\t\tTempStr"
+ print "\t\t\t\t{ % convert to lowercase"
+ print "\t\t\t\t\tdup dup 8#100 ge exch 8#107 le and { 32 add } if"
+ print "\t\t\t\t\tTempStr exch k exch put"
+ print "\t\t\t\t\t/k k 1 add def"
+ print "\t\t\t\t} forall"
+ print "\t\t\t\tTempStr 0 (\\\\0x) putinterval"
+ print "\t\t\tTempStr 4 (_) putinterval"
+ print "\t\t\t}"
+ print "\t\t\t{"
+ print "\t\t\t\t/TempStr 4 string def"
+ print "\t\t\t\tTempStr 0 ( ) putinterval"
+ print "\t\t\t\tn 8 idiv 8#100 add 8 TempStr cvrs pop"
+ print "\t\t\t\tTempStr 0 (\\\\) putinterval"
+ print "\t\t\t\tTempStr 3 (_) putinterval"
+ print "\t\t\t}"
+ print "\t\tifelse"
+ print "\t\tLabelWidth 2 div 0 rmoveto"
+ print "\t\tTempStr cshow"
+ print "\tgrestore"
+ print "\tmoveto"
+ print "\tSavePosition"
+ print "} def"
+ print "/ShowTableTitle"
+ print "{ % Usage: ShowTableTitle"
+ print "\tNewLine"
+ print "\tgsave"
+ print "\t\tSetLabelColor"
+ print "\t\tSetLabelFont"
+ print "\t\tLabelWidth 0 rmoveto"
+ print "\t\tTableWidth LabelWidth sub 2 div 0 rmoveto"
+ print "\t\t% Create centered title, e.g. 23bp FontName"
+ print "\t\t/TitleString TheFont length 5 add string def"
+ print "\t\tTitleString 0 TheFontSize 4 string cvs putinterval"
+ print "\t\tTitleString 2 (bp ) putinterval"
+ print "\t\tTitleString 5 TheFont dup length string cvs putinterval"
+ print "\t\tTitleString cshow"
+ print "\tgrestore"
+ print "\tNewLine"
+ print "} def"
+ print "/ShowVerticalRule"
+ print "{ % Usage: x y len ShowVerticalRule"
+ print "\tgsave"
+ print "\t\t/r exch def"
+ print "\t\tnewpath"
+ print "\t\t\tmoveto"
+ print "\t\t\t0 RuleVerticalOffset rmoveto"
+ print "\t\t\t0 r neg rlineto"
+ print "\t\tstroke"
+ print "\tgrestore"
+ print "} def"
+}
+
+function set_paper_dimensions(name, n,swap,value)
+{
+ if (name in paper)
+ {
+ n = split(paper[name],value," ")
+ if (n == 6)
+ {
+ paper_name = name
+ paper_width = bigpoint(value[1])
+ paper_height = bigpoint(value[2])
+ paper_left = bigpoint(value[3])
+ paper_right = bigpoint(value[4])
+ paper_bottom = bigpoint(value[5])
+ paper_top = bigpoint(value[6])
+ }
+ else
+ error("internal error: corrupt paper dimensions for paper type " name)
+ }
+ else
+ { # expect something like 8.5inx11in
+ n = split(name,value,"x")
+ if (n == 2)
+ {
+ paper_name = name
+ paper_width = bigpoint(value[1])
+ paper_height = bigpoint(value[2])
+ paper_left = bigpoint("1in")
+ paper_right = bigpoint("1in")
+ paper_bottom = bigpoint("1in")
+ paper_top = bigpoint("1in")
+ }
+ else
+ error("unrecognized paper type " name)
+ }
+ if (paper_width > paper_height)
+ landscape = 1
+}
+
+function url()
+{
+ print \
+ "Internet source distribution:\n" \
+ "\tURL: ftp://ftp.math.utah.edu/pub/misc/psposter-" \
+ VERSION_NUMBER ".tar.z\n" \
+ "\tURL: ftp://ftp.math.utah.edu/pub/misc/psposter-" \
+ VERSION_NUMBER ".zip\n" \
+ "\tURL: ftp://ftp.math.utah.edu/pub/misc/psposter-" \
+ VERSION_NUMBER ".zoo"
+}
+
+
+function usage()
+{
+ print "Usage: psposter [+option value] ... word1 word2 ..."
+ print ""
+ print "Recognized options are:"
+ print "\t+author display program author and quit"
+ print "\t+bd color set border color"
+ print "\t+bg color set background color"
+ print "\t+bs factor set baselineskip to factor times font pointsize"
+ print "\t+bw dimension set border width"
+ print "\t+c nnn number of copies to print"
+ print "\t+copyright display program copyright and quit"
+ print "\t+d display font pointsize on second page"
+ print "\t+fg color set foreground color"
+ print "\t+fn fontname select PostScript font"
+ print "\t+h dimension poster height"
+ print "\t+help display this message and quit"
+ print "\t+l landscape (instead of portrait) orientation"
+ print "\t+mw dimension set margin width"
+ print "\t+p dimension set font pointsize"
+ print "\t+paper form set paper size"
+ print "\t+r angle set text rotation angle in degrees (only multiples of 90)"
+ print "\t+s factor set poster scale factor"
+ print "\t+table {8/o | 8/h | 16/o | 16/h} show font character table"
+ print "\t+version display program version and quit"
+ print "\t+w dimension set poster width"
+ print "\t+x dimension set x offset"
+ print "\t+y dimension set y offset"
+ print "\t? display this message and quit"
+ print "\t++ no more options: remaining words are for poster text"
+ print ""
+ print "Any command-line arguments that are not recognized as options will be"
+ print "typeset on the poster, one argument per line. If no poster text words"
+ print "are supplied on the command line, then poster lines are read from"
+ print "standard input."
+ print ""
+ print "Color names may be any named X Window System color, or red/green/blue"
+ print "values in 0..1 separated by characters other than digits or period."
+ print "E.g. 0/1/0 is green, and 0.5:0.5:0.5 is 50% grey."
+ print ""
+ print "Dimensions consist of a (possibly signed) number followed by a TeX"
+ print "dimension unit: bp (big points), cc (ciceros), cm (centimeters), dd"
+ print "(didot points), in (inches), mm (millimeters), pc (picas), pt (points),"
+ print "or sp (scaled points). E.g. 72bp, 2.54cm, 67.542dd, 1in, 25.4mm,"
+ print "6.023pc, 72.27pt, and 4736286.72sp all specify a dimension of one inch."
+ print ""
+ print "Paper names may be either standard ones like A, A4, Foolscap, etc., or"
+ print "width and height dimensions separated by an x, so that 210mmx297mm and"
+ print "A4 are equivalent, and 8.5inx11in and A are too."
+
+ exit (0)
+}
+
+function version()
+{
+ print "psposter", VERSION "\n"
+ url()
+ exit (0)
+}
+
+
+function warning(message)
+{
+ print message >"/dev/tty"
+}
diff --git a/fonts/utilities/psposter/psposter.man b/fonts/utilities/psposter/psposter.man
new file mode 100644
index 0000000000..55b08379a4
--- /dev/null
+++ b/fonts/utilities/psposter/psposter.man
@@ -0,0 +1,719 @@
+.\" ====================================================================
+.\" @Troff-man-file{
+.\" author = "Nelson H. F. Beebe",
+.\" version = "0.08",
+.\" date = "16 January 1995",
+.\" time = "14:33:47 MST",
+.\" filename = "psposter.man",
+.\" address = "Center for Scientific Computing
+.\" Department of Mathematics
+.\" University of Utah
+.\" Salt Lake City, UT 84112
+.\" USA",
+.\" telephone = "+1 801 581 5254",
+.\" FAX = "+1 801 581 4148",
+.\" checksum = "30262 719 2765 18363",
+.\" email = "beebe@math.utah.edu (Internet)",
+.\" codetable = "ISO/ASCII",
+.\" keywords = "PostScript, poster",
+.\" supported = "yes",
+.\" docstring = "This file contains the UNIX manual pages
+.\" for the psposter utility, a program for
+.\" creating simple one-page posters in
+.\" PostScript.
+.\"
+.\" The checksum field above contains a CRC-16
+.\" checksum as the first value, followed by the
+.\" equivalent of the standard UNIX wc (word
+.\" count) utility output of lines, words, and
+.\" characters. This is produced by Robert
+.\" Solovay's checksum utility.",
+.\" }
+.\" ====================================================================
+.if t .ds Ps P\s-2OST\s+2S\s-2CRIPT\s+2
+.if n .ds Ps PostScript
+.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
+.if n .ds Te TeX
+.TH PSPOSTER 1 "16 January 1995" "Version 0.08"
+psposter \- create simple one-page colored posters in PostScript
+.\"======================================================================
+.SH SYNOPSIS
+.B psposter
+[
+.B +author
+]
+[
+.BI +bd " color"
+]
+[
+.BI +bg " color"
+]
+.if n .ti +9n
+[
+.BI +bs " factor"
+]
+[
+.BI +bw " dimension"
+]
+[
+.BI +c " nnn"
+]
+.if t .ti +.5i
+.if n .ti +9n
+[
+.B +copyright
+]
+[
+.B +d
+]
+[
+.BI +fg " color"
+]
+.if n .ti +9n
+[
+.BI +fn " fontname"
+]
+[
+.BI +h " dimension"
+]
+[
+.B +help
+]
+[
+.B +l
+]
+.if t .ti +.5i
+.if n .ti +9n
+[
+.BI +mw " dimension"
+]
+[
+.BI +p " dimension"
+]
+[
+.BI +paper " form"
+]
+.if n .ti +9n
+[
+.BI +r " angle"
+]
+[
+.BI +s " factor"
+]
+.if n .ti +9n
+.if t .ti +.5i
+[
+.BI +table " { 8/o | 8/h | 16/o | 16/h }"
+]
+[
+.B +version
+]
+.if n .ti +9n
+[
+.BI +w " dimension"
+]
+[
+.BI +x " dimension"
+]
+.if t .ti +.5i
+[
+.BI +y " dimension"
+]
+.if n .ti +9n
+[
+.B '?'
+]
+[
+.B ++
+]
+.if t .ti +.5i
+.if n .ti +9n
+[ word(s) or
+.RI < infile
+]
+.RI > \*(Ps\&-file
+.\"======================================================================
+.SH DESCRIPTION
+.B psposter
+creates an Encapsulated \*(Ps\& file containing a
+one-page poster. It may be included as a figure
+in any document processing system that supports
+inclusion of \*(Ps\& figures.
+.PP
+The poster text is typeset inside a colored box of
+specified width and height, with an empty
+surrounding margin, and a colored border.
+.PP
+The text area has a width of
+.IR "(boxwidth - 2*marginwidth - 2*borderwidth)" ,
+and a height of
+.IR "(boxheight - 2*marginwidth - 2*borderwidth)" .
+.PP
+When landscape orientation is chosen, poster text
+will be rotated 90 degrees counterclockwise, so
+that it runs from bottom to top. The width and
+height of the poster box are
+.I not
+affected by this.
+.\"======================================================================
+.SH OPTIONS
+Most options require values, which are supplied as
+the
+.I next
+command-line argument.
+.PP
+The current implementation (in awk) requires
+options to begin with a `+', rather than the
+conventional `\-', so as to distinguish them from
+.BR nawk (1)
+options.
+.PP
+Color values can be specified as any named X
+Window System color, or red/green/blue values in
+0\|.\|.\|1 separated by characters other than digits
+or period. E.g. 0/1/0 is green, and 0.5:0.5:0.5
+is 50% gray. Letter case in color names is
+.I not
+significant.
+.PP
+Dimensions consist of a (possibly signed) number
+followed by a \*(Te\& dimension unit:
+.IR bp " (big points),"
+.IR cc " (ciceros),"
+.IR cm " (centimeters),"
+.IR dd " (didot points),"
+.IR in " (inches),"
+.IR mm " (millimeters),"
+.IR pc " (picas), "
+.IR pt " (points),"
+or
+.IR sp " (scaled points)."
+E.g. 72bp, 2.54cm, 67.542dd, 1in, 25.4mm,
+6.023pc, 72.27pt, and 4\|736\|286.72sp all specify
+a dimension of one inch. \*(Ps\& uses
+.I "big points"
+as its default units, and its documentation refers
+to them as points.
+.PP
+Poster text is given either as separate arguments
+on the command line, or as separate lines of a
+file supplied on standard input. Multiple-word
+arguments must be quoted or their spaces escaped
+to be properly recognized.
+.\"-----------------------------------------------
+.TP \w'xxmwxdimension'u+3n
+.B +author
+Display an author credit on standard output and
+quit. Sometimes an executable program is
+separated from its documentation and source code;
+this option provides a way to recover from that.
+.\"-----------------------------------------------
+.TP
+.BI +bd " color"
+Define border color.
+.I "Default: 0.5:0.5:0.5 (50% gray)."
+.\"-----------------------------------------------
+.TP
+.BI +bg " color"
+Define background color.
+.I "Default: 0.9:0.9:0.9 (10% gray)."
+.\"-----------------------------------------------
+.TP
+.BI +bs " factor"
+Set the baseline skip to factor times font
+pointsize. This value defines the interline
+spacing, or
+.IR leading ,
+as it is called in typography.
+.I "Default: 1.2."
+.\"-----------------------------------------------
+.TP
+.BI +bw " dimension"
+Define border width.
+.I "Default: 10bp."
+.\"-----------------------------------------------
+.TP
+.BI +c " nnn"
+Define number of copies to print.
+.I "Default: 1."
+.\"-----------------------------------------------
+.TP
+.B +copyright
+Display copyright information on standard output and
+quit.
+.\"-----------------------------------------------
+.TP
+.B +d
+Display the font size on a second output page.
+This option is useful for making a series of
+posters with the same font size: specify
+.B +d
+for the poster with the longest text lines, then
+use the output font size in an explicit
+.B +p
+option for all of the other posters. This
+round-about way is required because automatic text
+sizing happens inside the \*(Ps\& output device,
+rather than in
+.BR psposter .
+.\"-----------------------------------------------
+.TP
+.BI +fg " color"
+Define foreground color.
+.I "Default: 0:0:0 (black)."
+.\"-----------------------------------------------
+.TP
+.BI +fn " fontname"
+Select the \*(Ps\& font. The name can be either
+the long name of a Type 1 \*(Ps\& font, such as
+.IR NewCenturySchlbk-BoldItalic ,
+or the basename of a \*(Ps\& font in ASCII
+.RI ( .pfa ),
+or binary
+.RI ( .pfb )
+format, such as
+.IR NewCenBI .
+.B psposter
+will also handle compressed variants of these
+files from
+.BR compress (1)
+and
+.BR gzip (1)
+.RI ( .pfa.Z ,
+.IR .pfb.Z ,
+.IR .pfa.gz ,
+and
+.IR .pfb.gz ),
+decompressing them on-the-fly.
+.I "Default: Times-Bold."
+.IP
+Most \*(Ps\& printers contain a number of resident
+fonts, but only a small number of downloadable
+Type 1 \*(Ps\& fonts are available without a font
+license, notably Adobe Courier and Utopia,
+Bitstream Charter and Courier, and URW Antiqua,
+Grotesk, and Nimbus. These three vendors have
+generously made these fonts available for free
+distribution, but retain the copyrights. More
+than 2300 fonts are listed in the
+.I afmfonts.map
+file (see the
+.B "\s-2ENVIRONMENT VARIABLES\s+2"
+section below), but only a very small number are
+likely to be available at a given site.
+.IP
+On a UNIX system, you can list the downloadable
+fonts available at your site by
+.IR "grep /FontName /usr/local/lib/afm/*.pfa" ,
+assuming that
+.I /usr/local/lib/afm
+is where they reside.
+.IP
+For a list of printer resident fonts, consult your
+printer documentation, or print the small \*(Ps\&
+file,
+.IR fontlist.ps ,
+that is distributed with
+.BR psposter .
+For convenience, that file is reproduced here; you
+can adjust PointSize, ColumnWidth, and the default
+display font (Courier) if you wish:
+.RS
+.nf
+%!
+% fontlist.ps
+% Send this file to a PostScript device to list
+% the names of all of the resident fonts.
+% [13-Dec-1994]
+/inch { 72 mul } def
+/PointSize 10 def
+/ColumnWidth 3 inch def
+/Courier findfont PointSize scalefont setfont
+/n 0 def
+/newcolumn
+{
+ /x x ColumnWidth add def
+ x y moveto
+ 8 inch x gt { showpage newpage } if
+} def
+/newpage
+{
+ /x 1 inch def
+ /y 10 inch def
+ x y moveto
+} def
+/nstr 10 string def
+/scratch 256 string def
+newpage
+(*)
+{
+ /n n 1 add def
+ gsave
+ n nstr cvs show
+ (: ) show
+ show
+ grestore
+ 0 PointSize -1.2 mul rmoveto
+ currentpoint exch pop 1 inch lt
+ {
+ newcolumn
+ } if
+}
+scratch /Font resourceforall
+showpage
+.fi
+.RE
+.\"-----------------------------------------------
+.TP
+.BI +h " dimension"
+Define poster height.
+.I "Default: paper height."
+.\"-----------------------------------------------
+.TP
+.B +help
+Display a help message on standard output and
+quit.
+.\"-----------------------------------------------
+.TP
+.BI +l
+Use landscape (instead of portrait) orientation
+for text. Text is rotated 90 degrees
+counterclockwise, so that it runs from bottom to
+top. This is a shorthand for the rotation option
+.B "+r 90"
+(see below). Only text,
+.I not
+the poster box, is affected by this option.
+.\"-----------------------------------------------
+.TP
+.BI +mw " dimension"
+Define margin width. Most \*(Ps\& hardcopy output
+devices are incapable of imaging closer than about
+5mm to the edge of the display surface, so a
+non-zero margin width is usually desirable.
+.I "Default: 1in (or 25mm for ISO paper sizes)."
+.\"-----------------------------------------------
+.TP
+.BI +p " dimension"
+Set font pointsize. Normally, the size is chosen
+to make the poster text just fill the text frame,
+either horizontally or vertically. You can use
+this option to force a particular font size,
+e.g. to produce a series of posters with different
+text, all at the same size.
+.IP
+Any poster text outside the text frame is clipped,
+and not displayed.
+.I "Default: automatically set."
+.\"-----------------------------------------------
+.TP
+.BI +paper " form"
+Set paper size. See
+.BR lptops (1)
+for a list of supported sizes.
+.IP
+In addition to the standard sizes, any particular
+size can be requested by giving it in the form
+.IR widthxheight ,
+e.g. 8.5inx11in or 210mmx297mm.
+.IP
+.I "Default: installation dependent: usually A (in"
+.I "the USA) and A4 (elsewhere)."
+.\"-----------------------------------------------
+.TP
+.BI +r " angle"
+Set the text rotation angle, which must be a
+multiple of 90 degrees. It is measured
+counterclockwise from the horizontal axis. The
+.B +l
+landscape option is equivalent to
+.BR "+r 90" .
+.I "Default: 0."
+.\"-----------------------------------------------
+.TP
+.BI +s " factor"
+Define poster scale factor. This option can be
+used to resize a poster without having to change
+any other command-line options.
+.I "Default: 1."
+.\"-----------------------------------------------
+.TP
+.BI +table " { 8/o | 8/h | 16/o | 16/h }"
+When this option is given, command-line poster
+words are ignored, and standard input is not read.
+Instead,
+.B psposter
+makes a table of all of the characters in the
+poster font. The option value defines the number
+of columns (8 or 16) and the label number base
+(octal or hexadecimal). The delimiter character
+\&`/' can be any punctuation character. With
+16-column tables, you probably also want to
+specify the landscape option
+.BR +l .
+.IP
+The table title includes the font size and name.
+The title, and the row/column labels, are always
+set in black Times-BoldItalic text.
+.IP
+Unless an explicit
+.BI +p " dimension"
+option is provided, the font size is automatically
+adjusted to an integer value that maximizes table
+size.
+.IP
+.I "Default: no font table."
+.\"-----------------------------------------------
+.TP
+.BI +version
+Display the program version number on standard
+output and quit.
+.\"-----------------------------------------------
+.TP
+.BI +w " dimension"
+Define poster width.
+.I "Default: paper width."
+.\"-----------------------------------------------
+.TP
+.BI +x " dimension"
+Define horizontal offset. A positive value moves
+the poster right on the output surface, and is
+.I unaffected
+by any poster scale factor, or by the choice of
+rotated text.
+.I "Default: 0bp."
+.\"-----------------------------------------------
+.TP
+.BI +y " dimension"
+Define vertical offset. A positive value moves
+the poster up on the output surface, and is
+.I unaffected
+by any poster scale factor, or by the choice of
+rotated text.
+.I "Default: 0bp."
+.\"-----------------------------------------------
+.TP
+.B ?
+Display a help message and quit.
+.\"-----------------------------------------------
+.TP
+.B ++
+No more options: remaining words are for poster
+text. This option is only needed if any of the
+poster words begin with a `+'.
+.\"======================================================================
+.SH "EXAMPLES"
+Print a full-size poster with an announcement:
+.RS
+.nf
+.I "psposter Chemistry 101 Examination 1:00pm--3:00pm | lpr"
+.fi
+.RE
+.PP
+Make a door sign in landscape mode:
+.RS
+.nf
+.I "psposter +l +w 10cm +h 25cm 'Prof. Jane Smith' >doorsign.ps"
+.fi
+.RE
+.PP
+Print the same sign, in color:
+.RS
+.nf
+.I "psposter +l +w 10cm +h 25cm +bd blue +bg skyblue \e"
+.I " +fg navyblue 'Prof. Jane Smith' | lpr"
+.fi
+If a \*(Ps\& printer is incapable of printing in
+color, it will simulate color by shades of gray.
+.RE
+.PP
+Make a sale sign:
+.RS
+.nf
+.I "psposter +bg yellow <<END-OF-DATA >yardsale.ps"
+.I "Terrific"
+.I "Yard Sale"
+.I "Today"
+.I "123 Elm St."
+.I "END-OF-DATA"
+.fi
+.RE
+.PP
+Make a seminar announcement:
+.RS
+.nf
+.I "psposter +bg orange <<EOF >seminar.ps
+.I "Biology Colloquium"
+.I "Friday 23-Sep-1994"
+.I "3pm--4pm"
+.I "LSB 234"
+.I ""
+.I "Dr. Judith Brown"
+.I "Sex Life of Gnats"
+.I "EOF"
+.fi
+.RE
+.PP
+Make a Danish road sign (the octal escape sequences
+select the letters AE and o-slash; see Appendix E
+of the
+.IR "PostScript Language Reference Manual" ,
+Addison-Wesley, 1990, ISBN 0-201-18127-4):
+.RS
+.nf
+.I "psposter +bg yellow +fg black '\e341resk\e371bing' 5km >vejskilt.ps"
+.fi
+.RE
+.PP
+Make another road sign in a downloaded font, supplying one leading and
+trailing blank on each line:
+.RS
+.nf
+.I "psposter +bg green +fg white +fn URWGroteskT-Bold +r -90 \e
+.I " ' Green River ' ' 106 miles ' >roadsign.ps"
+.fi
+.RE
+(The stretch of highway I-70 in Utah from Salina
+to Green River is claimed to be the longest in the
+US Interstate Highway System without services.)
+.PP
+Make a poster showing the dingbat font layout:
+.RS
+.nf
+.I "psposter +fn ZapfDingbats +table 8/o >dingbats.ps"
+.\"======================================================================
+.SH "ENVIRONMENT VARIABLES"
+.TP \w'AFMPATH'u+2n
+AFMPATH
+Search path for \*(Ps\& font mapping file,
+.RI ( afmfonts.map ),
+and for downloadable fonts in
+\*(Ps ASCII
+.RI ( .pfa )
+and binary
+.RI ( .pfb )
+formats. The font mapping file connects long
+\*(Ps\& font names with (usually shorter) file
+names on the host computer.
+.IP
+On UNIX, the search path is a colon-separated list
+of directories. On other operating systems, the
+search path follows the conventions of those
+systems.
+.TP
+RGBPATH
+Search path for the X Window System color
+definition file,
+.IR rgb.txt .
+.\"======================================================================
+.SH "FILES"
+.TP \w'\fIafmfonts.map\fP'u+3n
+.I afmfonts.map
+\*(Ps\& font mapping file. It is distributed,
+together with some freely-distributable Type 1
+fonts in
+.I .pfa
+and
+.I .pfb
+formats, and numerous Adobe Font Metric
+.RI ( .afm )
+files, with
+.BR lptops (1).
+.B psposter
+looks for this file, and downloadable fonts, in the
+.I AFMPATH
+search path.
+.IP
+Typical lines in
+.I afmfonts.map
+look like this:
+.RS
+.nf
+.I "% This line is a comment."
+.I "% This font name is too long for some"
+.I "% operating systems, so we store it under a"
+.I "% shorter name. The font files will be"
+.I "% HelvNaBI.afm, containing the character"
+.I "% metrics (assorted dimensions), and"
+.I "% HelvNaBI.pfa (ASCII) or HelvNaBI.pfb"
+.I "% (binary), containing encrypted \*(Ps\&"
+.I "% definitions of the character shapes."
+.I "Helvetica-Narrow-BoldOblique = HelvNaBI"
+.fi
+.RE
+.TP
+.I rgb.txt
+Color mapping file distributed with the X Window
+System.
+.B psposter
+looks for this file in the
+.I RGBPATH
+search path.
+.IP
+Typical lines in
+.I rgb.txt
+look like this:
+.RS
+.nf
+.I "000 000 000 black"
+.I "000 000 255 blue"
+.I "000 255 000 green"
+.I "000 255 255 cyan"
+.I "255 000 000 red"
+.I "255 000 255 magenta"
+.I "255 255 000 yellow"
+.I "255 255 255 white"
+.I "250 235 215 antique white"
+.I "250 235 215 AntiqueWhite"
+.fi
+.RE
+.IP
+There is no comment syntax.
+.IP
+The first three numbers define red, green, and
+blue intensities on a scale of 0\|.\|.\|255, and
+the remaining text on each line is the color name,
+which, in the case of compound color names, appears
+in two forms, one in lower case with blank
+separators, and one without blanks, in mixed case.
+.\"======================================================================
+.SH "SEE ALSO"
+.BR compress (1),
+.BR dxpsview (1),
+.BR ghostview (1),
+.BR gs (1),
+.BR gzip (1),
+.BR lptops (1),
+.BR pageview (1),
+.BR rgb (1),
+.BR tex (1).
+.\"======================================================================
+.SH AUTHOR
+.nf
+Nelson H. F. Beebe, Ph.D.
+Center for Scientific Computing
+Department of Mathematics
+University of Utah
+Salt Lake City, UT 84112
+Tel: +1 801 581 5254
+FAX: +1 801 581 4148
+Email: <beebe@math.utah.edu>
+.fi
+.\"======================================================================
+.SH COPYRIGHT
+This program is in the
+.BR "public domain" .
+.\"======================================================================
+.SH AVAILABILITY
+Internet source distribution of
+.B psposter
+is available through the World-Wide Web Uniform
+Resource Locator addresses
+.RS
+.nf
+.I "ftp://ftp.math.utah.edu/pub/misc/psposter-0.08.tar.z"
+.I "ftp://ftp.math.utah.edu/pub/misc/psposter-0.08.zip"
+.I "ftp://ftp.math.utah.edu/pub/misc/psposter-0.08.zoo"
+.fi
+.RE
+.\"==============================[The End]==============================
diff --git a/fonts/utilities/psposter/psposter.ps b/fonts/utilities/psposter/psposter.ps
new file mode 100644
index 0000000000..0064930009
--- /dev/null
+++ b/fonts/utilities/psposter/psposter.ps
@@ -0,0 +1,606 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.08
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%DocumentSuppliedResources: procset grops 1.08 0
+%%Pages: 6
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.08 0
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
+792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
+/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
+/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
+/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
+/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
+/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
+/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
+/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
+/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
+/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
+/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
+/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
+/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
+/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
+/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
+/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
+/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
+/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
+/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R
+(psposter \255 create simple one-page colored posters in PostScript)72 84 Q/F1
+9/Times-Bold@0 SF(SYNOPSIS)72 100.8 Q/F2 10/Times-Bold@0 SF(psposter)108 112.8
+Q F0([)2.5 E F2(+author)2.5 E F0 2.5(][)2.5 G F2(+bd)A/F3 10/Times-Italic@0 SF
+(color)2.5 E F0 2.5(][)2.5 G F2(+bg)A F3(color)2.5 E F0 2.5(][)2.5 G F2(+bs)A
+F3(factor)2.5 E F0 2.5(][)2.5 G F2(+bw)A F3(dimension)2.5 E F0 2.5(][)2.5 G F2
+(+c)A F3(nnn)2.5 E F0(])2.5 E([)144 124.8 Q F2(+copyright)2.5 E F0 2.5(][)2.5 G
+F2(+d)A F0 2.5(][)2.5 G F2(+fg)A F3(color)2.5 E F0 2.5(][)2.5 G F2(+fn)A F3
+(fontname)2.5 E F0 2.5(][)2.5 G F2(+h)A F3(dimension)2.5 E F0 2.5(][)2.5 G F2
+(+help)A F0 2.5(][)2.5 G F2(+l)A F0(])2.5 E([)144 136.8 Q F2(+mw)2.5 E F3
+(dimension)2.5 E F0 2.5(][)2.5 G F2(+p)A F3(dimension)2.5 E F0 2.5(][)2.5 G F2
+(+paper)A F3(form)2.5 E F0 2.5(][)2.5 G F2(+r)A F3(angle)2.5 E F0 2.5(][)2.5 G
+F2(+s)A F3(factor)2.5 E F0(])2.5 E([)144 148.8 Q F2(+table)2.5 E F3 2.5({8)2.5
+G(/o | 8/h | 16/o | 16/h })190.64 148.8 Q F0 2.5(][)2.5 G F2(+v)A(ersion)-.1 E
+F0 2.5(][)2.5 G F2(+w)A F3(dimension)2.5 E F0 2.5(][)2.5 G F2(+x)A F3
+(dimension)2.5 E F0(])2.5 E([)144 160.8 Q F2(+y)2.5 E F3(dimension)2.5 E F0 2.5
+(][)2.5 G F2('?')A F0 2.5(][)5 G F2(++)A F0(])2.5 E 2.5([w)144 172.8 S
+(ord\(s\) or <)156.95 172.8 Q F3(in\214le).01 E F0 2.5(]>)2.5 G F3(P)234.28
+172.8 Q/F4 8/Times-Italic@0 SF(OST)A F3(S)A F4(CRIPT)A F3(-\214le)A F1
+(DESCRIPTION)72 189.6 Q F2(psposter)108 201.6 Q F0 .934
+(creates an Encapsulated P)3.434 F/F5 8/Times-Roman@0 SF(OST)A F0(S)A F5(CRIPT)
+A F0 .934(\214le containing a one-page poster)3.434 F 5.934(.I)-.55 G 3.434(tm)
+446.184 201.6 S .933(ay be included as a)460.178 201.6 R(\214gure in an)108
+213.6 Q 2.5(yd)-.15 G(ocument processing system that supports inclusion of P)
+165.9 213.6 Q F5(OST)A F0(S)A F5(CRIPT)A F0(\214gures.)2.5 E 1.011
+(The poster te)108 230.4 R 1.011(xt is typeset inside a colored box of speci\
+\214ed width and height, with an empty surrounding)-.15 F(mar)108 242.4 Q
+(gin, and a colored border)-.18 E(.)-.55 E 1.346(The te)108 259.2 R 1.346
+(xt area has a width of)-.15 F F3 1.346(\(boxwidth - 2*mar)3.846 F 1.346
+(ginwidth - 2*bor)-.37 F(derwidth\))-.37 E F0 3.846(,a).06 G 1.346
+(nd a height of)426.902 259.2 R F3 1.345(\(boxheight -)3.845 F(2*mar)108 271.2
+Q(ginwidth - 2*bor)-.37 E(derwidth\))-.37 E F0(.).06 E 1.102
+(When landscape orientation is chosen, poster te)108 288 R 1.103
+(xt will be rotated 90 de)-.15 F 1.103(grees counterclockwise, so that it)-.15
+F(runs from bottom to top.)108 300 Q
+(The width and height of the poster box are)5 E F3(not)2.5 E F0(af)2.5 E
+(fected by this.)-.25 E F1(OPTIONS)72 316.8 Q F0(Most options require v)108
+328.8 Q(alues, which are supplied as the)-.25 E F3(ne)2.5 E(xt)-.2 E F0
+(command-line ar)2.5 E(gument.)-.18 E .45(The current implementation \(in a)108
+345.6 R .45(wk\) requires options to be)-.15 F .45
+(gin with a `+', rather than the con)-.15 F -.15(ve)-.4 G .45(ntional `\255',)
+.15 F(so as to distinguish them from)108 357.6 Q F2(nawk)2.5 E F0
+(\(1\) options.)A .254(Color v)108 374.4 R .255(alues can be speci\214ed as an)
+-.25 F 2.755(yn)-.15 G .255(amed X W)261.852 374.4 R(indo)-.4 E 2.755(wS)-.25 G
+.255(ystem color)338.347 374.4 R 2.755(,o)-.4 G 2.755(rr)395.397 374.4 S .255
+(ed/green/blue v)404.812 374.4 R .255(alues in 0)-.25 F -3.077 1.666(..1 s)
+1.666 H(ep-)-1.666 E 1.124(arated by characters other than digits or period.)
+108 386.4 R 1.124(E.g. 0/1/0 is green, and 0.5:0.5:0.5 is 50% gray)6.124 F
+6.124(.L)-.65 G(etter)522.23 386.4 Q(case in color names is)108 398.4 Q F3(not)
+2.5 E F0(signi\214cant.)2.5 E .935
+(Dimensions consist of a \(possibly signed\) number follo)108 415.2 R .935
+(wed by a T)-.25 F(E)-1.667 2.4 M 3.436(Xd)-1.25 -2.4 O .936(imension unit:)
+402.04 415.2 R F3(bp)3.436 E F0 .936(\(big points\),)3.626 F F3(cc)3.436 E F0
+(\(ciceros\),)108 427.2 Q F3(cm)3.413 E F0(\(centimeters\),)3.733 E F3(dd)3.413
+E F0 .913(\(didot points\),)4.183 F F3(in)3.413 E F0(\(inches\),)3.653 E F3(mm)
+3.413 E F0(\(millimeters\),)3.733 E F3(pc)3.413 E F0(\(picas\),)3.722 E F3(pt)
+3.412 E F0 .912(\(points\), or)4.092 F F3(sp)3.412 E F0 .326
+(\(scaled points\).)108 439.2 R .327
+(E.g. 72bp, 2.54cm, 67.542dd, 1in, 25.4mm, 6.023pc, 72.27pt, and 4)5.326 F
+-.834(736 286.72sp)1.666 F .327(all spec-)2.827 F .01
+(ify a dimension of one inch.)108 451.2 R(P)5.009 E F5(OST)A F0(S)A F5(CRIPT)A
+F0(uses)2.509 E F3 .009(big points)2.509 F F0 .009(as its def)2.509 F .009
+(ault units, and its documentation refers to)-.1 F(them as points.)108 463.2 Q
+.205(Poster te)108 480 R .205(xt is gi)-.15 F -.15(ve)-.25 G 2.705(ne).15 G
+.206(ither as separate ar)191.6 480 R .206
+(guments on the command line, or as separate lines of a \214le supplied)-.18 F
+.546(on standard input.)108 492 R(Multiple-w)5.546 E .546(ord ar)-.1 F .546
+(guments must be quoted or their spaces escaped to be properly recog-)-.18 F
+(nized.)108 504 Q F2(+author)108 520.8 Q F0 .751
+(Display an author credit on standard output and quit.)194.67 520.8 R .751
+(Sometimes an e)5.751 F -.15(xe)-.15 G .751(cutable pro-).15 F .155
+(gram is separated from its documentation and source code; this option pro)
+194.67 532.8 R .155(vides a w)-.15 F(ay)-.1 E(to reco)194.67 544.8 Q -.15(ve)
+-.15 G 2.5(rf).15 G(rom that.)240.46 544.8 Q F2(+bd)108 561.6 Q F3(color)2.5 E
+F0(De\214ne border color)194.67 561.6 Q(.)-.55 E F3
+(Default: 0.5:0.5:0.5 \(50% gr)5 E(ay\).)-.15 E F2(+bg)108 578.4 Q F3(color)2.5
+E F0(De\214ne background color)194.67 578.4 Q(.)-.55 E F3
+(Default: 0.9:0.9:0.9 \(10% gr)5 E(ay\).)-.15 E F2(+bs)108 595.2 Q F3(factor)
+2.5 E F0 1.187(Set the baseline skip to f)194.67 595.2 R 1.187
+(actor times font pointsize.)-.1 F 1.187(This v)6.187 F 1.187
+(alue de\214nes the interline)-.25 F(spacing, or)194.67 607.2 Q F3(leading)2.5
+E F0 2.5(,a).22 G 2.5(si)280.71 607.2 S 2.5(ti)289.88 607.2 S 2.5(sc)297.94
+607.2 S(alled in typograph)308.77 607.2 Q -.65(y.)-.05 G F3(Default: 1.2.)5.65
+E F2(+bw)108 624 Q F3(dimension)2.5 E F0(De\214ne border width.)194.67 624 Q F3
+(Default: 10bp.)5 E F2(+c)108 640.8 Q F3(nnn)2.5 E F0
+(De\214ne number of copies to print.)194.67 640.8 Q F3(Default: 1.)5 E F2
+(+copyright)108 657.6 Q F0(Display cop)194.67 657.6 Q
+(yright information on standard output and quit.)-.1 E F2(+d)108 674.4 Q F0
+1.376(Display the font size on a second output page.)194.67 674.4 R 1.376
+(This option is useful for making a)6.376 F 1.07
+(series of posters with the same font size: specify)194.67 686.4 R F2(+d)3.571
+E F0 1.071(for the poster with the longest)3.571 F(te)194.67 698.4 Q 1.174
+(xt lines, then use the output font size in an e)-.15 F(xplicit)-.15 E F2(+p)
+3.673 E F0 1.173(option for all of the other)3.673 F 4.619(posters. This)194.67
+710.4 R 2.119(round-about w)4.619 F 2.119(ay is required because automatic te)
+-.1 F 2.119(xt sizing happens)-.15 F(inside the P)194.67 722.4 Q F5(OST)A F0(S)
+A F5(CRIPT)A F0(output de)2.5 E(vice, rather than in)-.25 E F2(psposter)2.5 E
+F0(.)A -1.11(Ve)72 768 S(rsion 0.08)1.11 E(16 January 1995)272.95 768 Q(1)535
+768 Q EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R/F1 10
+/Times-Bold@0 SF(+fg)108 84 Q/F2 10/Times-Italic@0 SF(color)2.5 E F0
+(De\214ne fore)194.67 84 Q(ground color)-.15 E(.)-.55 E F2
+(Default: 0:0:0 \(blac)5 E(k\).)-.2 E F1(+fn)108 100.8 Q F2(fontname)2.5 E F0
+1.912(Select the P)194.67 100.8 R/F3 8/Times-Roman@0 SF(OST)A F0(S)A F3(CRIPT)A
+F0 4.412(font. The)4.412 F 1.912(name can be either the long name of a T)4.412
+F 1.911(ype 1)-.8 F(P)194.67 112.8 Q F3(OST)A F0(S)A F3(CRIPT)A F0 3.711
+(font, such as)6.211 F F2(Ne)6.212 E(wCenturySc)-.15 E(hlbk-BoldItalic)-.15 E
+F0 6.212(,o).31 G 6.212(rt)447.402 112.8 S 3.712(he basename of a)459.724 112.8
+R(P)194.67 124.8 Q F3(OST)A F0(S)A F3(CRIPT)A F0 3.201(font in ASCII \()5.701 F
+F2(.pfa).23 E F0 3.201(\), or binary \().26 F F2(.pfb).23 E F0 5.7(\)f).23 G
+3.2(ormat, such as)423.72 124.8 R F2(Ne)5.7 E(wCenBI)-.15 E F0(.)1.01 E F1
+(psposter)194.67 136.8 Q F0 1.261(will also handle compressed v)3.76 F 1.261
+(ariants of these \214les from)-.25 F F1(compr)3.761 E(ess)-.18 E F0 1.261
+(\(1\) and)B F1(gzip)194.67 148.8 Q F0 .324(\(1\) \()B F2(.pfa.Z).23 E F0(,)1 E
+F2(.pfb)2.824 E(.Z)-.4 E F0(,)1 E F2(.pfa.gz)2.824 E F0 2.823(,a).41 G(nd)
+326.265 148.8 Q F2(.pfb)2.823 E(.gz)-.4 E F0 .323
+(\), decompressing them on-the-\215y).41 F(.)-.65 E F2(Default:)5.323 E -.55
+(Ti)194.67 160.8 S(mes-Bold.).55 E F0 .639(Most P)194.67 177.6 R F3(OST)A F0(S)
+A F3(CRIPT)A F0 .64(printers contain a number of resident fonts, b)3.139 F .64
+(ut only a small num-)-.2 F 1.291(ber of do)194.67 189.6 R 1.291(wnloadable T)
+-.25 F 1.291(ype 1 P)-.8 F F3(OST)A F0(S)A F3(CRIPT)A F0 1.29(fonts are a)3.791
+F -.25(va)-.2 G 1.29(ilable without a font license,).25 F 1.105
+(notably Adobe Courier and Utopia, Bitstream Charter and Courier)194.67 201.6 R
+3.606(,a)-.4 G 1.106(nd UR)478.898 201.6 R 3.606(WA)-.55 G(nti-)526.11 201.6 Q
+1.439(qua, Grotesk, and Nimb)194.67 213.6 R 3.938(us. These)-.2 F 1.438
+(three v)3.938 F 1.438(endors ha)-.15 F 1.738 -.15(ve g)-.2 H 1.438
+(enerously made these fonts).15 F -.2(av)194.67 225.6 S 1.523
+(ailable for free distrib)-.05 F 1.523(ution, b)-.2 F 1.523(ut retain the cop)
+-.2 F 4.023(yrights. More)-.1 F 1.524(than 2300 fonts are)4.024 F .303
+(listed in the)194.67 237.6 R F2(afmfonts.map)2.803 E F0 .303(\214le \(see the)
+2.803 F/F4 8/Times-Bold@0 SF(ENVIR)2.803 E .303(ONMENT V)-.24 F(ARIABLES)-1.08
+E F0 .303(section belo)2.803 F .302(w\), b)-.25 F(ut)-.2 E(only a v)194.67
+249.6 Q(ery small number are lik)-.15 E(ely to be a)-.1 E -.25(va)-.2 G
+(ilable at a gi).25 E -.15(ve)-.25 G 2.5(ns).15 G(ite.)444.36 249.6 Q .244
+(On a UNIX system, you can list the do)194.67 266.4 R .245(wnloadable fonts a)
+-.25 F -.25(va)-.2 G .245(ilable at your site by).25 F F2(gr)2.745 E(ep)-.37 E
+(/F)194.67 278.4 Q 2.599(ontName /usr/local/lib/afm/*.pfa)-1.05 F F0 5.099(,a)
+.26 G 2.599(ssuming that)348.538 278.4 R F2(/usr/local/lib/afm)5.099 E F0 2.598
+(is where the)5.098 F(y)-.15 E(reside.)194.67 290.4 Q -.15(Fo)194.67 307.2 S
+3.885(ral).15 G 1.385(ist of printer resident fonts, consult your printer docu\
+mentation, or print the)223.4 307.2 R .372(small P)194.67 319.2 R F3(OST)A F0
+(S)A F3(CRIPT)A F0(\214le,)2.872 E F2(fontlist.ps)2.872 E F0 2.872(,t).27 G
+.372(hat is distrib)336.742 319.2 R .371(uted with)-.2 F F1(psposter)2.871 E F0
+5.371(.F)C .371(or con)476.869 319.2 R -.15(ve)-.4 G(nience,).15 E .72
+(that \214le is reproduced here; you can adjust PointSize, ColumnW)194.67 331.2
+R .72(idth, and the def)-.4 F(ault)-.1 E(display font \(Courier\) if you wish:)
+194.67 343.2 Q(%!)194.67 355.2 Q 2.5(%f)194.67 367.2 S(ontlist.ps)208.83 367.2
+Q 2.5(%S)194.67 379.2 S(end this \214le to a PostScript de)211.06 379.2 Q
+(vice to list)-.25 E 2.5(%t)194.67 391.2 S
+(he names of all of the resident fonts.)208.28 391.2 Q 2.5(%[)194.67 403.2 S
+(13-Dec-1994])208.83 403.2 Q(/inch { 72 mul } def)194.67 415.2 Q
+(/PointSize 10 def)194.67 427.2 Q(/ColumnW)194.67 439.2 Q(idth 3 inch def)-.4 E
+(/Courier \214ndfont PointSize scalefont setfont)194.67 451.2 Q(/n 0 def)194.67
+463.2 Q(/ne)194.67 475.2 Q(wcolumn)-.25 E({)194.67 487.2 Q(/x x ColumnW)204.67
+499.2 Q(idth add def)-.4 E 2.5(xym)204.67 511.2 S -.15(ove)227.45 511.2 S(to)
+.15 E 2.5(8i)204.67 523.2 S(nch x gt { sho)214.95 523.2 Q(wpage ne)-.25 E
+(wpage } if)-.25 E 2.5(}d)194.67 535.2 S(ef)206.97 535.2 Q(/ne)194.67 547.2 Q
+(wpage)-.25 E({)194.67 559.2 Q(/x 1 inch def)204.67 571.2 Q(/y 10 inch def)
+204.67 583.2 Q 2.5(xym)204.67 595.2 S -.15(ove)227.45 595.2 S(to).15 E 2.5(}d)
+194.67 607.2 S(ef)206.97 607.2 Q(/nstr 10 string def)194.67 619.2 Q
+(/scratch 256 string def)194.67 631.2 Q(ne)194.67 643.2 Q(wpage)-.25 E(\(*\))
+194.67 655.2 Q({)194.67 667.2 Q(/n n 1 add def)204.67 679.2 Q(gsa)204.67 691.2
+Q -.15(ve)-.2 G 2.5(nn)214.67 703.2 S(str cvs sho)227.17 703.2 Q(w)-.25 E
+(\(: \) sho)214.67 715.2 Q(w)-.25 E(sho)214.67 727.2 Q(w)-.25 E -1.11(Ve)72 768
+S(rsion 0.08)1.11 E(16 January 1995)272.95 768 Q(2)535 768 Q EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R(grestore)
+204.67 84 Q 2.5(0P)204.67 96 S(ointSize -1.2 mul rmo)217.73 96 Q -.15(ve)-.15 G
+(to).15 E(currentpoint e)204.67 108 Q(xch pop 1 inch lt)-.15 E({)204.67 120 Q
+(ne)214.67 132 Q(wcolumn)-.25 E 2.5(}i)204.67 144 S(f)214.75 144 Q(})194.67 156
+Q(scratch /F)194.67 168 Q(ont resourceforall)-.15 E(sho)194.67 180 Q(wpage)-.25
+E/F1 10/Times-Bold@0 SF(+h)108 196.8 Q/F2 10/Times-Italic@0 SF(dimension)2.5 E
+F0(De\214ne poster height.)194.67 196.8 Q F2(Default: paper height.)5 E F1
+(+help)108 213.6 Q F0(Display a help message on standard output and quit.)
+194.67 213.6 Q F1(+l)108 230.4 Q F0 1.704
+(Use landscape \(instead of portrait\) orientation for te)194.67 230.4 R 4.203
+(xt. T)-.15 F -.15(ex)-.7 G 4.203(ti).15 G 4.203(sr)455.341 230.4 S 1.703
+(otated 90 de)466.764 230.4 R(grees)-.15 E .283
+(counterclockwise, so that it runs from bottom to top.)194.67 242.4 R .284
+(This is a shorthand for the rota-)5.283 F .002(tion option)194.67 254.4 R F1
+.002(+r 90)2.502 F F0 .002(\(see belo)2.502 F 2.502(w\). Only)-.25 F(te)2.502 E
+(xt,)-.15 E F2(not)2.502 E F0 .002(the poster box, is af)2.502 F .001
+(fected by this option.)-.25 F F1(+mw)108 271.2 Q F2(dimension)2.5 E F0 1.7
+(De\214ne mar)194.67 271.2 R 1.7(gin width.)-.18 F 1.7(Most P)6.7 F/F3 8
+/Times-Roman@0 SF(OST)A F0(S)A F3(CRIPT)A F0(hardcop)4.201 E 4.201(yo)-.1 G
+1.701(utput de)414.036 271.2 R 1.701(vices are incapable of)-.25 F .269
+(imaging closer than about 5mm to the edge of the display surf)194.67 283.2 R
+.268(ace, so a non-zero mar)-.1 F(-)-.2 E(gin width is usually desirable.)
+194.67 295.2 Q F2(Default: 1in \(or 25mm for ISO paper sizes\).)5 E F1(+p)108
+312 Q F2(dimension)2.5 E F0 1.12(Set font pointsize.)194.67 312 R(Normally)6.12
+E 3.62(,t)-.65 G 1.12(he size is chosen to mak)322.11 312 R 3.62(et)-.1 G 1.12
+(he poster te)435.38 312 R 1.12(xt just \214ll the)-.15 F(te)194.67 324 Q .076
+(xt frame, either horizontally or v)-.15 F(ertically)-.15 E 5.076(.Y)-.65 G
+.076(ou can use this option to force a particu-)378.316 324 R .145
+(lar font size, e.g. to produce a series of posters with dif)194.67 336 R .145
+(ferent te)-.25 F .146(xt, all at the same size.)-.15 F(An)194.67 352.8 Q 3.546
+(yp)-.15 G 1.046(oster te)220.286 352.8 R 1.046(xt outside the te)-.15 F 1.045
+(xt frame is clipped, and not displayed.)-.15 F F2 1.045(Default: auto-)6.045 F
+(matically set.)194.67 364.8 Q F1(+paper)108 381.6 Q F2(form)2.5 E F0
+(Set paper size.)194.67 381.6 Q(See)5 E F1(lptops)2.5 E F0
+(\(1\) for a list of supported sizes.)A .83
+(In addition to the standard sizes, an)194.67 398.4 R 3.33(yp)-.15 G .83
+(articular size can be requested by gi)354.2 398.4 R .83(ving it in)-.25 F
+(the form)194.67 410.4 Q F2(widthxheight)2.5 E F0 2.5(,e).68 G
+(.g. 8.5inx11in or 210mmx297mm.)293.12 410.4 Q F2
+(Default: installation dependent: usually A \(in the USA\) and A4 \(else)194.67
+427.2 Q(wher)-.15 E(e\).)-.37 E F1(+r)108 444 Q F2(angle)2.5 E F0 1.119
+(Set the te)194.67 444 R 1.119
+(xt rotation angle, which must be a multiple of 90 de)-.15 F 3.618(grees. It)
+-.15 F 1.118(is measured)3.618 F .9(counterclockwise from the horizontal axis.)
+194.67 456 R(The)5.9 E F1(+l)3.4 E F0 .9(landscape option is equi)3.4 F -.25
+(va)-.25 G .9(lent to).25 F F1(+r 90)194.67 468 Q F0(.)A F2(Default: 0.)5 E F1
+(+s)108 484.8 Q F2(factor)2.5 E F0 .645(De\214ne poster scale f)194.67 484.8 R
+(actor)-.1 E 5.645(.T)-.55 G .644
+(his option can be used to resize a poster without ha)312.12 484.8 R(ving)-.2 E
+(to change an)194.67 496.8 Q 2.5(yo)-.15 G(ther command-line options.)257.56
+496.8 Q F2(Default: 1.)5 E F1(+table)108 513.6 Q F2 2.5({8)2.5 G
+(/o | 8/h | 16/o | 16/h })148.81 513.6 Q F0 2.074(When this option is gi)194.67
+525.6 R -.15(ve)-.25 G 2.075(n, command-line poster w).15 F 2.075
+(ords are ignored, and standard)-.1 F .153(input is not read.)194.67 537.6 R
+(Instead,)5.153 E F1(psposter)2.653 E F0(mak)2.653 E .152
+(es a table of all of the characters in the poster)-.1 F 2.782(font. The)194.67
+549.6 R .282(option v)2.782 F .283
+(alue de\214nes the number of columns \(8 or 16\) and the label number)-.25 F
+.403(base \(octal or he)194.67 561.6 R 2.903(xadecimal\). The)-.15 F .402
+(delimiter character `/' can be an)2.903 F 2.902(yp)-.15 G .402
+(unctuation char)474.538 561.6 R(-)-.2 E(acter)194.67 573.6 Q 5.235(.W)-.55 G
+.235(ith 16-column tables, you probably also w)230.325 573.6 R .235
+(ant to specify the landscape option)-.1 F F1(+l)194.67 585.6 Q F0(.)A .521
+(The table title includes the font size and name.)194.67 602.4 R .52
+(The title, and the ro)5.521 F .52(w/column labels,)-.25 F(are al)194.67 614.4
+Q -.1(wa)-.1 G(ys set in black T).1 E(imes-BoldItalic te)-.35 E(xt.)-.15 E
+1.777(Unless an e)194.67 631.2 R(xplicit)-.15 E F1(+p)4.277 E F2(dimension)
+4.277 E F0 1.777(option is pro)4.277 F 1.778
+(vided, the font size is automatically)-.15 F(adjusted to an inte)194.67 643.2
+Q(ger v)-.15 E(alue that maximizes table size.)-.25 E F2
+(Default: no font table)194.67 660 Q(.)-.15 E F1(+v)108 676.8 Q(ersion)-.1 E F0
+(Display the program v)194.67 676.8 Q
+(ersion number on standard output and quit.)-.15 E F1(+w)108 693.6 Q F2
+(dimension)2.5 E F0(De\214ne poster width.)194.67 693.6 Q F2
+(Default: paper width.)5 E F1(+x)108 710.4 Q F2(dimension)2.5 E F0 1.055
+(De\214ne horizontal of)194.67 710.4 R 3.555(fset. A)-.25 F(positi)3.555 E
+1.355 -.15(ve v)-.25 H 1.055(alue mo)-.1 F -.15(ve)-.15 G 3.555(st).15 G 1.054
+(he poster right on the output sur)402.775 710.4 R(-)-.2 E -.1(fa)194.67 722.4
+S 1.47(ce, and is).1 F F2(unaf)3.97 E(fected)-.18 E F0 1.47(by an)3.97 F 3.97
+(yp)-.15 G 1.47(oster scale f)329.42 722.4 R(actor)-.1 E 3.97(,o)-.4 G 3.97(rb)
+411.08 722.4 S 3.97(yt)423.38 722.4 S 1.47(he choice of rotated te)435.13 722.4
+R(xt.)-.15 E -1.11(Ve)72 768 S(rsion 0.08)1.11 E(16 January 1995)272.95 768 Q
+(3)535 768 Q EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R/F1 10
+/Times-Italic@0 SF(Default: 0bp.)194.67 84 Q/F2 10/Times-Bold@0 SF(+y)108 100.8
+Q F1(dimension)2.5 E F0 .033(De\214ne v)194.67 100.8 R .033(ertical of)-.15 F
+2.532(fset. A)-.25 F(positi)2.532 E .332 -.15(ve v)-.25 H .032(alue mo)-.1 F
+-.15(ve)-.15 G 2.532(st).15 G .032(he poster up on the output surf)384.906
+100.8 R .032(ace, and)-.1 F(is)194.67 112.8 Q F1(unaf)2.647 E(fected)-.18 E F0
+.147(by an)2.647 F 2.647(yp)-.15 G .147(oster scale f)282.698 112.8 R(actor)-.1
+E 2.647(,o)-.4 G 2.647(rb)360.389 112.8 S 2.647(yt)371.366 112.8 S .148
+(he choice of rotated te)381.793 112.8 R(xt.)-.15 E F1 .148(Default: 0bp.)5.148
+F F2(?)108 129.6 Q F0(Display a help message and quit.)194.67 129.6 Q F2(++)108
+146.4 Q F0 .719(No more options: remaining w)194.67 146.4 R .719
+(ords are for poster te)-.1 F 3.218(xt. This)-.15 F .718
+(option is only needed if)3.218 F(an)194.67 158.4 Q 2.5(yo)-.15 G 2.5(ft)216.46
+158.4 S(he poster w)225.07 158.4 Q(ords be)-.1 E(gin with a `+'.)-.15 E/F3 9
+/Times-Bold@0 SF(EXAMPLES)72 175.2 Q F0
+(Print a full-size poster with an announcement:)108 187.2 Q F1
+(psposter Chemistry 101 Examination 1:00pm--3:00pm | lpr)144 199.2 Q F0(Mak)108
+216 Q 2.5(ead)-.1 G(oor sign in landscape mode:)145.11 216 Q F1
+(psposter +l +w 10cm +h 25cm 'Pr)144 228 Q(of)-.45 E 2.5(.J)-.15 G
+(ane Smith' >door)300.51 228 Q(sign.ps)-.1 E F0(Print the same sign, in color:)
+108 244.8 Q F1(psposter +l +w 10cm +h 25cm +bd blue +bg sk)144 256.8 Q
+(yblue \\)-.1 E(+fg navyblue 'Pr)166.5 268.8 Q(of)-.45 E 2.5(.J)-.15 G
+(ane Smith' | lpr)251.73 268.8 Q F0(If a P)144 280.8 Q/F4 8/Times-Roman@0 SF
+(OST)A F0(S)A F4(CRIPT)A F0(printer is incapable of printing in color)2.5 E 2.5
+(,i)-.4 G 2.5(tw)373.864 280.8 S(ill simulate color by shades of gray)386.364
+280.8 Q(.)-.65 E(Mak)108 297.6 Q 2.5(eas)-.1 G(ale sign:)144 297.6 Q F1
+(psposter +bg yellow <<END-OF-D)144 309.6 Q -.37(AT)-.35 G 2.5(A>)-.13 G(yar)
+314.77 309.6 Q(dsale)-.37 E(.ps)-.15 E -.92(Te)144 321.6 S(rri\214c).92 E -.92
+(Ya)144 333.6 S .74 -.37(rd S).92 H(ale).37 E -.92(To)144 345.6 S(day).92 E
+(123 Elm St.)144 357.6 Q(END-OF-D)144 369.6 Q -.37(AT)-.35 G(A)-.13 E F0(Mak)
+108 386.4 Q 2.5(eas)-.1 G(eminar announcement:)144 386.4 Q F1(psposter +bg or)
+144 398.4 Q(ang)-.15 E 2.5(e<)-.1 G(<EOF >seminar)236.97 398.4 Q(.ps)-1.11 E
+(Biolo)144 410.4 Q(gy Colloquium)-.1 E -.55(Fr)144 422.4 S(iday 23-Sep-1994).55
+E(3pm--4pm)144 434.4 Q(LSB 234)144 446.4 Q(Dr)144 470.4 Q 2.5(.J)-1.11 G
+(udith Br)163.09 470.4 Q(own)-.45 E(Se)144 482.4 Q 2.5(xL)-.2 G(ife of Gnats)
+165.74 482.4 Q(EOF)144 494.4 Q F0(Mak)108 511.2 Q 3.054(eaD)-.1 G .554(anish r\
+oad sign \(the octal escape sequences select the letters AE and o-slash; see A\
+ppendix E of)148.438 511.2 R(the)108 523.2 Q F1 -.8(Po)2.5 G(stScript Langua).8
+E .2 -.1(ge R)-.1 H(efer).1 E(ence Manual)-.37 E F0 2.5(,A).51 G(ddison-W)
+294.34 523.2 Q(esle)-.8 E 1.3 -.65(y, 1)-.15 H(990, ISBN 0-201-18127-4\):).65 E
+F1(psposter +bg yellow +fg blac)144 535.2 Q 2.5(k')-.2 G(\\341r)272.57 535.2 Q
+(esk\\371bing' 5km >vejskilt.ps)-.37 E F0(Mak)108 552 Q 2.5(ea)-.1 G
+(nother road sign in a do)137.61 552 Q
+(wnloaded font, supplying one leading and trailing blank on each line:)-.25 E
+F1(psposter +bg gr)144 564 Q(een +fg white +fn UR)-.37 E(WGr)-.18 E(oteskT)-.45
+E(-Bold +r -90 \\)-.74 E 2.5('G)166.5 576 S -.37(re)179.55 576 S
+(en River ' ' 106 miles ' >r).37 E(oadsign.ps)-.45 E F0 1.1
+(\(The stretch of highw)108 588 R 1.1(ay I-70 in Utah from Salina to Green Ri)
+-.1 F -.15(ve)-.25 G 3.6(ri).15 G 3.6(sc)384.54 588 S 1.1
+(laimed to be the longest in the US)396.47 588 R(Interstate Highw)108 600 Q
+(ay System without services.\))-.1 E(Mak)108 616.8 Q 2.5(eap)-.1 G(oster sho)
+145.11 616.8 Q(wing the dingbat font layout:)-.25 E F1
+(psposter +fn ZapfDingbats +table 8/o >dingbats.ps)144 628.8 Q F3(ENVIR)72
+645.6 Q(ONMENT V)-.27 E(ARIABLES)-1.215 E F0(AFMP)108 657.6 Q -1.11(AT)-.92 G
+10(HS)1.11 G .107(earch path for P)169.31 657.6 R F4(OST)A F0(S)A F4(CRIPT)A F0
+.107(font mapping \214le, \()2.607 F F1(afmfonts.map).33 E F0 .107
+(\), and for do).19 F .108(wnloadable fonts in)-.25 F(P)163.75 669.6 Q F4(OST)A
+F0(S)A F4(CRIPT)A F0 1.555(ASCII \()4.055 F F1(.pfa).23 E F0 4.055(\)a).26 G
+1.555(nd binary \()277.799 669.6 R F1(.pfb).23 E F0 4.055(\)f).23 G 4.055
+(ormats. The)351.244 669.6 R 1.554(font mapping \214le connects long)4.055 F(P)
+163.75 681.6 Q F4(OST)A F0(S)A F4(CRIPT)A F0
+(font names with \(usually shorter\) \214le names on the host computer)2.5 E(.)
+-.55 E 1.266
+(On UNIX, the search path is a colon-separated list of directories.)163.75
+698.4 R 1.266(On other operating sys-)6.266 F(tems, the search path follo)
+163.75 710.4 Q(ws the con)-.25 E -.15(ve)-.4 G(ntions of those systems.).15 E
+-1.11(Ve)72 768 S(rsion 0.08)1.11 E(16 January 1995)272.95 768 Q(4)535 768 Q EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R(RGBP)108 84
+Q -1.11(AT)-.92 G 11.11(HS)1.11 G(earch path for the X W)169.31 84 Q(indo)-.4 E
+2.5(wS)-.25 G(ystem color de\214nition \214le,)293.63 84 Q/F1 10/Times-Italic@0
+SF -.37(rg)2.5 G -.4(b.).37 G(txt).4 E F0(.).68 E/F2 9/Times-Bold@0 SF(FILES)72
+100.8 Q F1(afmfonts.map)108 112.8 Q F0(P)177.17 112.8 Q/F3 8/Times-Roman@0 SF
+(OST)A F0(S)A F3(CRIPT)A F0 1.407(font mapping \214le.)3.907 F 1.407
+(It is distrib)6.407 F 1.406(uted, together with some freely-distrib)-.2 F
+(utable)-.2 E -.8(Ty)177.17 124.8 S .513(pe 1 fonts in).8 F F1(.pfa)3.013 E F0
+(and)3.013 E F1(.pfb)3.013 E F0 .513(formats, and numerous Adobe F)3.013 F .514
+(ont Metric \()-.15 F F1(.afm).23 E F0 3.014<298c>.32 G .514(les, with)505.596
+124.8 R/F4 10/Times-Bold@0 SF(lptops)177.17 136.8 Q F0(\(1\).)A F4(psposter)
+5.69 E F0 .689(looks for this \214le, and do)3.19 F .689
+(wnloadable fonts, in the)-.25 F F1(AFMP)3.189 E -.37(AT)-.9 G(H).37 E F0
+(search)3.189 E(path.)177.17 148.8 Q -.8(Ty)177.17 165.6 S(pical lines in).8 E
+F1(afmfonts.map)2.5 E F0(look lik)2.5 E 2.5(et)-.1 G(his:)338.22 165.6 Q F1 2.5
+(%T)177.17 177.6 S(his line is a comment.)193.56 177.6 Q 2.5(%T)177.17 189.6 S
+(his font name is too long for some)193.56 189.6 Q 2.5(%o)177.17 201.6 S(per)
+193 201.6 Q(ating systems, so we stor)-.15 E 2.5(ei)-.37 G 2.5(tu)314.7 201.6 S
+(nder a)324.98 201.6 Q 2.5(%s)177.17 213.6 S(horter name)191.89 213.6 Q 5(.T)
+-.15 G(he font \214les will be)253.96 213.6 Q 2.5(%H)177.17 225.6 S
+(elvNaBI.afm, containing the c)195.22 225.6 Q(har)-.15 E(acter)-.15 E 2.5(%m)
+177.17 237.6 S(etrics \(assorted dimensions\), and)195.22 237.6 Q 2.5(%H)177.17
+249.6 S(elvNaBI.pfa \(ASCII\) or HelvNaBI.pfb)195.22 249.6 Q 2.5(%\()177.17
+261.6 S(binary\), containing encrypted P)191.33 261.6 Q/F5 8/Times-Italic@0 SF
+(OST)A F1(S)A F5(CRIPT)A F1 2.5(%d)177.17 273.6 S(e\214nitions of the c)193
+273.6 Q(har)-.15 E(acter shapes.)-.15 E(Helvetica-Narr)177.17 285.6 Q
+(ow-BoldOblique = HelvNaBI)-.45 E -.37(rg)108 302.4 S -.4(b.).37 G(txt).4 E F0
+.341(Color mapping \214le distrib)177.17 302.4 R .341(uted with the X W)-.2 F
+(indo)-.4 E 2.841(wS)-.25 G(ystem.)389.608 302.4 Q F4(psposter)5.342 E F0 .342
+(looks for this \214le in)2.842 F(the)177.17 314.4 Q F1(RGBP)2.5 E -.37(AT)-.9
+G(H).37 E F0(search path.)2.5 E -.8(Ty)177.17 331.2 S(pical lines in).8 E F1
+-.37(rg)2.5 G -.4(b.).37 G(txt).4 E F0(look lik)2.5 E 2.5(et)-.1 G(his:)309.67
+331.2 Q F1(000 000 000)177.17 343.2 Q(blac)249.67 343.2 Q(k)-.2 E(000 000 255)
+177.17 355.2 Q(blue)249.67 355.2 Q(000 255 000)177.17 367.2 Q(gr)249.67 367.2 Q
+(een)-.37 E(000 255 255)177.17 379.2 Q(cyan)249.67 379.2 Q(255 000 000)177.17
+391.2 Q -.37(re)249.67 391.2 S(d).37 E(255 000 255)177.17 403.2 Q(ma)249.67
+403.2 Q -.1(ge)-.1 G(nta).1 E(255 255 000)177.17 415.2 Q(yellow)249.67 415.2 Q
+(255 255 255)177.17 427.2 Q(white)249.67 427.2 Q(250 235 215)177.17 439.2 Q
+(antique white)249.67 439.2 Q(250 235 215)177.17 451.2 Q(AntiqueWhite)249.67
+451.2 Q F0(There is no comment syntax.)177.17 468 Q .897(The \214rst three num\
+bers de\214ne red, green, and blue intensities on a scale of 0)177.17 484.8 R
+1.666(..2)1.666 G .896(55, and)-1.666 F .815(the remaining te)177.17 496.8 R
+.815(xt on each line is the color name, which, in the case of compound color)
+-.15 F 1.165(names, appears in tw)177.17 508.8 R 3.665(of)-.1 G 1.164
+(orms, one in lo)276.43 508.8 R 1.164
+(wer case with blank separators, and one without)-.25 F(blanks, in mix)177.17
+520.8 Q(ed case.)-.15 E F2(SEE ALSO)72 537.6 Q F4(compr)108 549.6 Q(ess)-.18 E
+F0(\(1\),)A F4(dxpsview)2.5 E F0(\(1\),)A F4(ghostview)2.5 E F0(\(1\),)A F4(gs)
+2.5 E F0(\(1\),)A F4(gzip)2.5 E F0(\(1\),)A F4(lptops)2.5 E F0(\(1\),)A F4
+(page)2.5 E(view)-.15 E F0(\(1\),)A F4 -.1(rg)2.5 G(b).1 E F0(\(1\),)A F4(tex)
+2.5 E F0(\(1\).)A F2 -.45(AU)72 566.4 S(THOR).45 E F0(Nelson H. F)108 578.4 Q
+2.5(.B)-.8 G(eebe, Ph.D.)167.48 578.4 Q(Center for Scienti\214c Computing)108
+590.4 Q(Department of Mathematics)108 602.4 Q(Uni)108 614.4 Q -.15(ve)-.25 G
+(rsity of Utah).15 E(Salt Lak)108 626.4 Q 2.5(eC)-.1 G(ity)155.12 626.4 Q 2.5
+(,U)-.65 G 2.5(T8)177.25 626.4 S(4112)190.86 626.4 Q -.7(Te)108 638.4 S
+(l: +1 801 581 5254).7 E -.74(FA)108 650.4 S(X: +1 801 581 4148).74 E
+(Email: <beebe@math.utah.edu>)108 662.4 Q F2(COPYRIGHT)72 679.2 Q F0
+(This program is in the)108 691.2 Q F4(public domain)2.5 E F0(.)A -1.11(Ve)72
+768 S(rsion 0.08)1.11 E(16 January 1995)272.95 768 Q(5)535 768 Q EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 345.48(PSPOSTER\(1\) PSPOSTER\(1\))72 48 R/F1 9
+/Times-Bold@0 SF -.855 -1.305(AV A)72 84 T(ILABILITY)1.305 E F0 .3
+(Internet source distrib)108 96 R .3(ution of)-.2 F/F2 10/Times-Bold@0 SF
+(psposter)2.8 E F0 .3(is a)2.8 F -.25(va)-.2 G .3(ilable through the W).25 F
+(orld-W)-.8 E .3(ide W)-.4 F .3(eb Uniform Resource Loca-)-.8 F(tor addresses)
+108 108 Q/F3 10/Times-Italic@0 SF(ftp://ftp.math.utah.edu/pub/misc/psposter)144
+120 Q(-0.08.tar)-.2 E(.z)-1.11 E(ftp://ftp.math.utah.edu/pub/misc/psposter)144
+132 Q(-0.08.zip)-.2 E(ftp://ftp.math.utah.edu/pub/misc/psposter)144 144 Q
+(-0.08.zoo)-.2 E F0 -1.11(Ve)72 768 S(rsion 0.08)1.11 E(16 January 1995)272.95
+768 Q(6)535 768 Q EP
+%%Trailer
+end
+%%EOF
diff --git a/fonts/utilities/psposter/psposter.sh b/fonts/utilities/psposter/psposter.sh
new file mode 100644
index 0000000000..1e186e0cd3
--- /dev/null
+++ b/fonts/utilities/psposter/psposter.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+/usr/local/bin/gawk -f /usr/local/lib/psposter/psposter.awk "$@"
diff --git a/fonts/utilities/psposter/rofvms.awk b/fonts/utilities/psposter/rofvms.awk
new file mode 100644
index 0000000000..dedb9ce181
--- /dev/null
+++ b/fonts/utilities/psposter/rofvms.awk
@@ -0,0 +1,61 @@
+# rofvms.awk -*-awk-*-
+# Filter to convert nroff -man output to VMS .hlp file format according
+# to the rules:
+#
+# 13 or more consecutive blank lines are reduced to 1
+# 3--12 consecutive blank lines are dropped
+# 2 consecutive blank lines are reduced to 1
+# All others output verbatim.
+#
+# The peculiar number 13 handles the case where a paragraph break
+# coincides with a page break.
+#
+# In addition, whenever a line in non-blank in column 1, and then
+# previous line was blank, we insert a blank line; this provides
+# vertical space before a section heading.
+#
+# The output of nroff -man on different UNIX systems is regrettably
+# quite variable in appearance; this file is likely to need
+# modifications on other than Sun OS.
+#
+# Too bad nroff doesn't have an option to suppress titling!
+#
+# The NAME section head becomes 1 BIBCLEAN, and others become
+# 2 XXX followed by XXX.
+# [27-Mar-1993]
+BEGIN { if (NAME == "") NAME = "DVI" }
+
+# Match and delete page headers: xxx(nnn) .... xxx(nnn)
+/^[A-Za-z][-_A-Za-z0-9]*\([0-9A-Za-z]+\).*[A-Za-z][-_A-Za-z0-9]*\([0-9A-Za-z]+\)$/ {next}
+
+# Match and delete page footers: Sun Release ...nnn
+# These vary from system to system, so extra patterns may be needed here
+/^Sun Release.*[0-9]+$/ {next} # Sun OS x.x
+/^Sun Microsystems.*[0-9]+$/ {next}
+/^Printed.*[0-9]+$/ {next} # BSD 4.3
+/^Page [0-9].*$/ {next} # Silicon Graphics
+/^Version.*Last change:/ {next} # bibclean.txt on SunOS 4.1.1
+
+# Match all lines and do blank line processing
+{
+ if (NF == 0) # blank line
+ nb++;
+ else # non blank line
+ {
+ if ((nb == 1) || (nb == 2) || (nb >= 13))
+ printf("\n");
+ else if ((nb > 0) && (substr($0,1,1) != " ") && (nf > 0))
+ printf("\n");
+ if ($0 == "NAME") # level 1 header
+ $0 = "1 " NAME;
+ else if (substr($0,1,1) != " ") # level 2 header
+ {
+ header = $0;
+ gsub(/ /,"-",header);
+ $0 = "2 " header "\n " $0;
+ }
+ printf("%s\n",$0);
+ nb = 0;
+ nf++;
+ }
+}
diff --git a/fonts/utilities/qdtexvpl/distrib.cmd b/fonts/utilities/qdtexvpl/distrib.cmd
new file mode 100644
index 0000000000..341ccf09b1
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/distrib.cmd
@@ -0,0 +1,2 @@
+nmake distrib
+pkzip -u qdtexvpl
diff --git a/fonts/utilities/qdtexvpl/ibmpc437.bat b/fonts/utilities/qdtexvpl/ibmpc437.bat
new file mode 100644
index 0000000000..af43abed26
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/ibmpc437.bat
@@ -0,0 +1,9 @@
+@echo off
+tex ibmpc437
+if errorlevel 1 goto end
+tftopl \emtex\tfm\cmr10 cmr10
+if errorlevel 1 goto end
+qdtexvpl -d10.0 -icmr10.pl ibmpc437.dvi ibmpc437.vpl
+if errorlevel 1 goto end
+vptovf ibmpc437
+:end
diff --git a/fonts/utilities/qdtexvpl/ibmpc437.cmd b/fonts/utilities/qdtexvpl/ibmpc437.cmd
new file mode 100644
index 0000000000..8b0732a50f
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/ibmpc437.cmd
@@ -0,0 +1,9 @@
+@echo off
+texp ibmpc437
+if errorlevel 1 goto end
+tftopl \emtex\tfm\cmr10 cmr10
+if errorlevel 1 goto end
+qdtexvpl -d10.0 -icmr10.pl ibmpc437.dvi ibmpc437.vpl
+if errorlevel 1 goto end
+vptovf ibmpc437
+:end
diff --git a/fonts/utilities/qdtexvpl/ibmpc437.tex b/fonts/utilities/qdtexvpl/ibmpc437.tex
new file mode 100644
index 0000000000..39304eb7e1
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/ibmpc437.tex
@@ -0,0 +1,15 @@
+%
+% ibmpc437.tex
+%
+% Some extended characters for cmr10
+%
+\font\f=cmr10
+\input qdtexvpl
+\texvpl{„}{\f\"a}
+\texvpl{”}{\f\"o}
+\texvpl{}{\f\"u}
+\texvpl{Ž}{\f\"A}
+\texvpl{™}{\f\"O}
+\texvpl{š}{\f\"U}
+\texvpl{á}{\f\ss}
+\bye
diff --git a/fonts/utilities/qdtexvpl/makefile b/fonts/utilities/qdtexvpl/makefile
new file mode 100644
index 0000000000..2f90ec5c51
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/makefile
@@ -0,0 +1,38 @@
+#
+# makefile for qdtexvpl
+#
+CC=cl -Ozax -Lp -Fb -W3 -AS
+
+default: qdtexvpl.exe qdtexvpl.tfm
+
+qdtexvpl.exe: qdtexvpl.obj qdtexvpl.def
+ $(CC) qdtexvpl.obj qdtexvpl.def
+
+qdtexvpl.obj: qdtexvpl.c
+ $(CC) -c qdtexvpl.c
+
+qdtexvpl.tfm: qdtexvpl.pl
+ pltotf qdtexvpl
+
+clean:
+ -del *.log
+ -del *.dvi
+ -del *.vf
+ -del cmr10.pl
+ -del *.vpl
+ -del *.tfm
+ -del *.obj
+ -del *.exe
+ -del out
+
+distrib:
+ -del *.log
+ -del *.dvi
+ -del *.vf
+ -del cmr10.pl
+ -del *.vpl
+ -del self.tfm
+ -del ibmpc437.tfm
+ -del *.obj
+ -del *.bak
+ -del out
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.c b/fonts/utilities/qdtexvpl/qdtexvpl.c
new file mode 100644
index 0000000000..5da793661f
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.c
@@ -0,0 +1,1271 @@
+/* qdtexvpl.c -- Version 1.0 -- Copyright (c) 1992 by Eberhard Mattes */
+/*
+ made to work with gcc. april 30 1993 S Rahtz CERN
+*/
+
+/* Written: ??-Apr-1990, modified 15-Feb-1992 for release */
+
+/* Quick & dirty conversion of TeX code to VPL */
+
+/* No warranty! */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef MSDOS
+#else
+#include <unistd.h>
+#include <errno.h>
+#endif
+
+#define FALSE 0
+#define TRUE 1
+
+#define DVI_STACK_SIZE 50
+
+
+#define DVI_set_char_0 0
+#define DVI_set1 128
+#define DVI_set2 129
+#define DVI_set3 130
+#define DVI_set4 131
+#define DVI_set_rule 132
+#define DVI_put1 133
+#define DVI_put2 134
+#define DVI_put3 135
+#define DVI_put4 136
+#define DVI_put_rule 137
+#define DVI_nop 138
+#define DVI_bop 139
+#define DVI_eop 140
+#define DVI_push 141
+#define DVI_pop 142
+#define DVI_right1 143
+#define DVI_right2 144
+#define DVI_right3 145
+#define DVI_right4 146
+#define DVI_w0 147
+#define DVI_w1 148
+#define DVI_w2 149
+#define DVI_w3 150
+#define DVI_w4 151
+#define DVI_x0 152
+#define DVI_x1 153
+#define DVI_x2 154
+#define DVI_x3 155
+#define DVI_x4 156
+#define DVI_down1 157
+#define DVI_down2 158
+#define DVI_down3 159
+#define DVI_down4 160
+#define DVI_y0 161
+#define DVI_y1 162
+#define DVI_y2 163
+#define DVI_y3 164
+#define DVI_y4 165
+#define DVI_z0 166
+#define DVI_z1 167
+#define DVI_z2 168
+#define DVI_z3 169
+#define DVI_z4 170
+#define DVI_fnt_num_0 171
+#define DVI_fnt1 235
+#define DVI_fnt2 236
+#define DVI_fnt3 237
+#define DVI_fnt4 238
+#define DVI_xxx1 239
+#define DVI_xxx2 240
+#define DVI_xxx3 241
+#define DVI_xxx4 242
+#define DVI_fnt_def1 243
+#define DVI_fnt_def2 244
+#define DVI_fnt_def3 245
+#define DVI_fnt_def4 246
+#define DVI_pre 247
+#define DVI_post 248
+#define DVI_post_post 249
+
+#define DVI_EOF 223
+#define DVI_id_byte 2
+
+
+typedef unsigned char u_byte;
+typedef signed short s_word;
+typedef unsigned short u_word;
+typedef int boolean;
+
+struct mem
+ {
+ u_byte *ptr, *add;
+ int size;
+ int alloc;
+
+ };
+
+struct map
+ {
+ long code; /* Character code */
+ long wd, ht, dp;
+ struct mem repl;
+ struct map *next;
+ };
+
+struct font
+ {
+ struct mem dvi;
+ struct font *next;
+ };
+
+struct dvi_stack
+ {
+ long h, v, w, x, y, z;
+ };
+
+static FILE *dvi_file;
+static FILE *ins_file;
+static FILE *out_file;
+static char *dvi_fname;
+static char *ins_fname;
+static char *out_fname;
+static u_byte buffer[1000]; /* fnt_def: area+name */
+static u_byte *dst;
+static struct map *map;
+static struct dvi_stack position;
+static struct dvi_stack dvi_stack[DVI_STACK_SIZE];
+static int dvi_sp;
+static int out_sp;
+static struct mem *mem;
+static u_byte *hex = "0123456789abcdef";
+static struct map *map_head, **map_add;
+static struct font *font_head, **font_add;
+static double design_size;
+static boolean opt_d;
+static boolean opt_i;
+
+
+#if defined (MSDOS)
+
+static char *read_binary = "rb";
+static char *read_text = "rt";
+static char *write_text = "wt";
+
+#else
+
+static char *read_binary = "r";
+static char *read_text = "r";
+static char *write_text = "w";
+
+#endif
+
+
+static void usage (void);
+static void out_of_mem (void);
+static void dvi_eof (void);
+static void dvi_seek (long pos);
+static s_word dvi_get1u (void);
+static s_word dvi_get1s (void);
+static u_word dvi_get2u (void);
+static s_word dvi_get2s (void);
+static long dvi_get3u (void);
+static long dvi_get3s (void);
+static long dvi_get4 (void);
+static long dvi_get_u (s_word l);
+static long dvi_get_s (s_word l);
+static void internal (int err_no);
+static void dvi_preamble (void);
+static void dvi_push (void);
+static void dvi_pop (void);
+static void dvi_char (long c, boolean move);
+static void dvi_rule (boolean move);
+static void dvi_fnt_num (long n);
+static void dvi_fnt_def (s_word b);
+static void dvi_right (long n);
+static void dvi_down (long n);
+static void dvi_special (long n);
+static void dvi_bop (void);
+static void init_pos (struct dvi_stack *dst);
+static void dvi_main (void);
+static void init_mem (struct mem *dst);
+static void add_mem (struct mem *dst, u_byte src);
+static void add1u (u_byte x);
+static void add4 (long x);
+static void copy (void);
+static void out_prop (char *txt);
+static void out_end (void);
+static void out_fnt_def (s_word b);
+static void out_fnt_num (long n);
+static void out_down (long n);
+static void out_right (long n);
+static void out_set_char (long n, boolean move);
+static void out_set_rule (boolean move);
+static void out_special (long n);
+static void out_real (double x);
+static void out_scaled (long n);
+static void out_dec (long n);
+static void out_oct (long n);
+static void out_char (long n);
+static void out_str (char *txt, int len);
+static void output (struct mem *src);
+static void make_output (void);
+long parse_pt (u_byte **pp, int *nn);
+int main (int argc, char *argv[]);
+
+
+#define OUTPUT (map != NULL && dvi_sp > out_sp)
+
+static void init_pos (struct dvi_stack *dst)
+ {
+ dst->h = 0;
+ dst->v = 0;
+ }
+
+
+#define MEM_CHECK(n) {if (mem != NULL && (mem->size -= n) < 0) dvi_eof ();}
+#define DVI_GET (mem != NULL ? *mem->ptr++ : (*dst++ = (u_byte)getc (dvi_file)))
+#define DVI_EOF_CHECK {if (mem == NULL && feof (dvi_file)) dvi_eof ();}
+
+static void dvi_eof (void)
+ {
+ (void)fprintf (stderr, "*** Premature end of DVI file\n");
+ exit (2);
+ }
+
+
+
+static void internal (int err_no)
+ {
+ (void)fprintf (stderr, "*** Internal error %.4d\n", err_no);
+ }
+
+
+static void out_of_mem (void)
+ {
+ (void)fprintf (stderr, "*** Out of memory\n");
+ }
+
+
+static void dvi_seek (long n)
+ {
+ if (fseek (dvi_file, n, SEEK_SET) != 0)
+ {
+ (void)fprintf (stderr, "*** dvi_seek failed\n");
+ exit (2);
+ }
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read an unsigned byte from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static s_word dvi_get1u (void)
+ {
+ s_word x;
+
+ MEM_CHECK (1);
+ x = DVI_GET;
+ DVI_EOF_CHECK;
+ return (x);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read a signed byte from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static s_word dvi_get1s (void)
+ {
+ s_word n;
+
+ MEM_CHECK (1);
+ n = DVI_GET;
+ DVI_EOF_CHECK;
+ if (n >= 128)
+ return (n-256);
+ else
+ return (n);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read an unsigned word (2 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static u_word dvi_get2u (void)
+ {
+ u_word a, b;
+
+ MEM_CHECK (2);
+ a = (u_word)DVI_GET;
+ b = (u_word)DVI_GET;
+ DVI_EOF_CHECK;
+ return (a*256+b);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read a signed word (2 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static s_word dvi_get2s (void)
+ {
+ s_word a, b;
+
+ MEM_CHECK (2);
+ a = DVI_GET;
+ b = DVI_GET;
+ DVI_EOF_CHECK;
+ if (a >= 128)
+ return ((a-256)*256+b);
+ else
+ return (a*256+b);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read an unsigned word (3 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static long dvi_get3u (void)
+ {
+ s_word a, b, c;
+
+ MEM_CHECK (3);
+ a = DVI_GET;
+ b = DVI_GET;
+ c = DVI_GET;
+ DVI_EOF_CHECK;
+ return (a*65536L+b*256L+c);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read a signed word (3 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static long dvi_get3s (void)
+ {
+ s_word a, b, c;
+
+ MEM_CHECK (3);
+ a = DVI_GET;
+ b = DVI_GET;
+ c = DVI_GET;
+ DVI_EOF_CHECK;
+ if (a >= 128)
+ return ((a-256)*65536L+b*256L+c);
+ else
+ return (a*65536L+b*256L+c);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read a word (4 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static long dvi_get4 (void)
+ {
+ s_word a, b, c, d;
+
+ MEM_CHECK (4);
+ a = DVI_GET;
+ b = DVI_GET;
+ c = DVI_GET;
+ d = DVI_GET;
+ DVI_EOF_CHECK;
+ if (a >= 128)
+ return ((a-256)*16777216L+b*65536L+c*256L+d);
+ else
+ return (a*16777216L+b*65536L+c*256L+d);
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read an unsigned word (1 to 4 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static long dvi_get_u (s_word l)
+ {
+ switch (l)
+ {
+ case 0:
+ return ((long)dvi_get1u ());
+ case 1:
+ return ((long)dvi_get2u ());
+ case 2:
+ return (dvi_get3u ());
+ case 3:
+ return (dvi_get4 ());
+ default:
+ internal (3002);
+ }
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* Read a signed word (1 to 4 bytes) from the DVI file. */
+/* ------------------------------------------------------------------------ */
+
+static long dvi_get_s (s_word l)
+ {
+ switch (l)
+ {
+ case 0:
+ return ((long)dvi_get1s ());
+ case 1:
+ return ((long)dvi_get2s ());
+ case 2:
+ return (dvi_get3s ());
+ case 3:
+ return (dvi_get4 ());
+ default:
+ internal (3003);
+ }
+ }
+
+
+static void dvi_preamble (void)
+ {
+ s_word b1, b2;
+
+ dst = buffer; mem = NULL;
+ b1 = dvi_get1u ();
+ b2 = dvi_get1u ();
+ if (b1 != DVI_pre || b2 != DVI_id_byte)
+ {
+ (void)fprintf (stderr, "*** The input file is not a dvi file\n");
+ exit (2);
+ }
+ (void)dvi_get4 (); /* num */
+ (void)dvi_get4 (); /* den */
+ (void)dvi_get4 (); /* mag */
+ b1 = dvi_get1u ();
+ for (b2 = 0; b2 < b1; ++b2)
+ (void)dvi_get1u ();
+ }
+
+
+static void init_mem (struct mem *dst)
+ {
+ dst->size = 0; dst->alloc = 0;
+ dst->ptr = NULL; dst->add = NULL;
+ }
+
+
+static void add_mem (struct mem *dst, u_byte src)
+ {
+ if (dst->size >= dst->alloc)
+ {
+ dst->alloc += 10;
+ dst->ptr = realloc (dst->ptr, dst->alloc);
+ if (dst->ptr == NULL)
+ out_of_mem ();
+ dst->add = dst->ptr+dst->size;
+ }
+ *dst->add++ = src;
+ ++dst->size;
+ }
+
+
+static void add1u (u_byte x)
+ {
+ add_mem (&map->repl, x);
+ }
+
+
+static void add4 (long x)
+ {
+ add1u ((u_byte)((x >> 24) & 0xff));
+ add1u ((u_byte)((x >> 16) & 0xff));
+ add1u ((u_byte)((x >> 8) & 0xff));
+ add1u ((u_byte)(x & 0xff));
+ }
+
+
+static void copy (void)
+ {
+ s_word i, n;
+
+ if (OUTPUT)
+ {
+ n = dst-buffer;
+ for (i = 0; i < n; ++i)
+ add1u (buffer[i]);
+ dst = buffer;
+ }
+ }
+
+
+static void dvi_char (long c, boolean move)
+ {
+ if (move)
+ {
+ position.h += 0; /*...to be implemented...*/
+ }
+ copy ();
+ }
+
+
+static void dvi_rule (boolean move)
+ {
+ long width, height;
+
+ height = dvi_get4 ();
+ width = dvi_get4 ();
+ if (!OUTPUT)
+ {
+ fprintf (stderr, "*** Rule set outside \\texvpl macro\n");
+ exit (2);
+ }
+ if (move)
+ position.h += width;
+ copy ();
+ }
+
+
+/* Returns scaled points */
+
+long parse_pt (u_byte **pp, int *nn)
+ {
+ double x;
+ u_byte *e, *p;
+ char buf[20];
+ int i, n;
+
+ i = 0; p = *pp; n = *nn;
+ while (n >= 1 && i < sizeof (buf)-1 && (isdigit (*p) || *p == '.'))
+ {
+ buf[i++] = *p++;
+ --n;
+ }
+ buf[i] = 0;
+ errno = 0;
+ x = strtod (buf, &e);
+ if (errno != 0 || *e != 0 || n < 2 || memcmp (p, "pt", 2) != 0)
+ {
+ (void)fprintf (stderr, "*** Invalid dimension in \\special{>...}\n");
+ exit (2);
+ }
+ *pp = p+2; *nn = n-2;
+ return ((long)(x*65536.0));
+ }
+
+
+static void dvi_special (long n)
+ {
+ int i;
+ u_byte *p;
+ long code;
+
+ p = dst;
+ if (n < 0 || (p-buffer)+n > sizeof (buffer))
+ {
+ (void)fprintf (stderr, "*** Invalid size of \\special\n");
+ exit (2);
+ }
+ for (i = 0; i < (s_word)n; ++i)
+ (void)dvi_get1u ();
+ if (n >= 1)
+ {
+ if (*p == '<')
+ {
+ if (map == NULL && n == 2)
+ code = (long)p[1];
+ else if (map == NULL && n == 4 && p[1] == '^' && p[2] == '^' && p[3] < 128)
+ {
+ code = (long)p[3];
+ if (code < 64) code += 64; else code -= 64;
+ }
+ else if (map == NULL && n == 5 && p[1] == '^' && p[2] == '^' &&
+ strchr (hex, p[3]) && strchr (hex, p[4]))
+ {
+#ifdef MSDOS
+ code = 16*(strchr (hex, p[3])-hex);
+ code += (strchr (hex, p[4])-hex);
+#else
+ code = 16* (int)(strchr (hex, p[3])-(int)hex);
+ code += (strchr (hex, p[4])-(int)hex);
+#endif
+ }
+ else
+ {
+ (void)fprintf (stderr, "*** Invalid \\special{<...}\n");
+ exit (2);
+ }
+ map = (struct map *)malloc (sizeof (struct map));
+ if (map == NULL) out_of_mem ();
+ map->code = code;
+ init_mem (&map->repl);
+ map->next = NULL; *map_add = map; map_add = &map->next;
+ out_sp = dvi_sp;
+ return;
+ }
+ else if (*p == '>')
+ {
+ if (map == NULL || n < 1)
+ {
+ (void)fprintf (stderr, "*** Invalid \\special{>...}\n");
+ exit (2);
+ }
+ ++p; i = (int)(n-1);
+ map->wd = parse_pt (&p, &i);
+ map->ht = parse_pt (&p, &i);
+ map->dp = parse_pt (&p, &i);
+ map = NULL;
+ return;
+ }
+ }
+ if (map == NULL)
+ {
+ (void)fprintf (stderr, "*** \\special outside \\texvpl macro\n");
+ exit (2);
+ }
+ copy ();
+ }
+
+
+static void dvi_right (long n)
+ {
+ position.h += n;
+ copy ();
+ }
+
+
+static void dvi_down (long n)
+ {
+ position.v += n;
+ copy ();
+ }
+
+
+static void dvi_fnt_num (long n)
+ {
+ copy ();
+ }
+
+
+static void dvi_fnt_def (s_word b)
+ {
+ s_word area_len, name_len;
+ int i;
+ struct font *fp;
+
+ (void)dvi_get_u (b-DVI_fnt_def1); /* font number */
+ (void)dvi_get4 (); /* check sum */
+ (void)dvi_get4 (); /* scale factor */
+ (void)dvi_get4 (); /* Design size */
+ area_len = dvi_get1u ();
+ name_len = dvi_get1u ();
+ for (i = 0; i < area_len; ++i)
+ (void)dvi_get1u ();
+ for (i = 0; i < name_len; ++i)
+ (void)dvi_get1u ();
+ if (map != NULL)
+ {
+ fp = (struct font *)malloc (sizeof (struct font));
+ if (fp == NULL) out_of_mem ();
+ init_mem (&fp->dvi);
+ i = dst-buffer;
+ fp->dvi.ptr = (u_byte *)malloc (i);
+ if (fp->dvi.ptr == NULL) out_of_mem ();
+ fp->dvi.size = i; fp->dvi.alloc = i;
+#ifdef MSDOS
+ memmove (fp->dvi.ptr, buffer, i);
+#else
+ memcpy (fp->dvi.ptr, buffer, i);
+#endif
+ fp->next = NULL; *font_add = fp; font_add = &fp->next;
+ }
+ }
+
+
+static void dvi_push ()
+ {
+ copy (); /* Nota bene: call this before changing dvi_sp */
+ if (dvi_sp >= DVI_STACK_SIZE)
+ {
+ (void)fprintf (stderr, "*** dvi stack overflow\n");
+ exit (2);
+ }
+ dvi_stack[dvi_sp++] = position;
+ }
+
+
+static void dvi_pop ()
+ {
+ if (dvi_sp <= 0)
+ {
+ (void)fprintf (stderr, "*** dvi stack underflow\n");
+ exit (2);
+ }
+ position = dvi_stack[--dvi_sp];
+ copy (); /* Nota bene: call this after changing dvi_sp */
+ }
+
+
+static void dvi_bop (void)
+ {
+ s_word i;
+
+ for (i = 0; i < 10; ++i)
+ (void)dvi_get4 (); /* \count0 to \count9 */
+ (void)dvi_get4 (); /* Back pointer */
+ }
+
+
+static void dvi_main (void)
+ {
+ s_word b;
+
+ map = NULL; dvi_sp = 0;
+ map_head = NULL; map_add = &map_head;
+ font_head = NULL; font_add = &font_head;
+ init_pos (&position);
+ position.w = 0; position.x = 0; position.y = 0; position.z = 0;
+ for (;;)
+ {
+ dst = buffer;
+ b = dvi_get1u ();
+ if (b >= DVI_set_char_0 && b < DVI_set_char_0+128)
+ dvi_char ((long)b-DVI_set_char_0, TRUE);
+ else if (b >= DVI_fnt_num_0 && b < DVI_fnt_num_0+64)
+ dvi_fnt_num ((long)(b-DVI_fnt_num_0));
+ else
+ switch (b)
+ {
+ case DVI_set1:
+ case DVI_set2:
+ case DVI_set3:
+ case DVI_set4:
+ dvi_char (dvi_get_u (b-DVI_set1), TRUE);
+ break;
+ case DVI_put1:
+ case DVI_put2:
+ case DVI_put3:
+ case DVI_put4:
+ dvi_char (dvi_get_u (b-DVI_set1), FALSE);
+ break;
+ case DVI_set_rule:
+ dvi_rule (TRUE);
+ break;
+ case DVI_put_rule:
+ dvi_rule (FALSE);
+ break;
+ case DVI_nop:
+ break;
+ case DVI_bop:
+ dvi_bop ();
+ break;
+ case DVI_eop:
+ break;
+ case DVI_push:
+ dvi_push ();
+ break;
+ case DVI_pop:
+ dvi_pop ();
+ break;
+ case DVI_right1:
+ case DVI_right2:
+ case DVI_right3:
+ case DVI_right4:
+ dvi_right (dvi_get_s (b-DVI_right1));
+ break;
+ case DVI_down1:
+ case DVI_down2:
+ case DVI_down3:
+ case DVI_down4:
+ dvi_down (dvi_get_s (b-DVI_down1));
+ break;
+ case DVI_w0:
+ dvi_right (position.w);
+ break;
+ case DVI_w1:
+ case DVI_w2:
+ case DVI_w3:
+ case DVI_w4:
+ position.w = dvi_get_s (b-DVI_w1);
+ dvi_right (position.w);
+ break;
+ case DVI_x0:
+ dvi_right (position.x);
+ break;
+ case DVI_x1:
+ case DVI_x2:
+ case DVI_x3:
+ case DVI_x4:
+ position.x = dvi_get_s (b-DVI_x1);
+ dvi_right (position.x);
+ break;
+ case DVI_y0:
+ dvi_down (position.y);
+ break;
+ case DVI_y1:
+ case DVI_y2:
+ case DVI_y3:
+ case DVI_y4:
+ position.y = dvi_get_s (b-DVI_y1);
+ dvi_down (position.y);
+ break;
+ case DVI_z0:
+ dvi_down (position.z);
+ break;
+ case DVI_z1:
+ case DVI_z2:
+ case DVI_z3:
+ case DVI_z4:
+ position.z = dvi_get_s (b-DVI_z1);
+ dvi_down (position.z);
+ break;
+ case DVI_fnt1:
+ case DVI_fnt2:
+ case DVI_fnt3:
+ case DVI_fnt4:
+ dvi_fnt_num (dvi_get_s (b-DVI_fnt1));
+ break;
+ case DVI_xxx1:
+ case DVI_xxx2:
+ case DVI_xxx3:
+ case DVI_xxx4:
+ dvi_special (dvi_get_u (b-DVI_xxx1));
+ break;
+ case DVI_fnt_def1:
+ case DVI_fnt_def2:
+ case DVI_fnt_def3:
+ case DVI_fnt_def4:
+ dvi_fnt_def (b);
+ break;
+ case DVI_post:
+ goto done;
+ default:
+ (void)fprintf (stderr, "*** Bad dvi file\n");
+ exit (2);
+ }
+ }
+done:;
+ }
+
+
+static int out_level;
+static boolean out_in_line;
+
+
+static void out_prop (char *txt)
+ {
+ int i;
+
+ if (out_in_line)
+ {
+ (void)fputc ('\n', out_file);
+ out_in_line = FALSE;
+ }
+ for (i = 0; i < out_level; ++i)
+ (void)fputs (" ", out_file);
+ (void)fputc ('(', out_file);
+ (void)fputs (txt, out_file);
+ ++out_level;
+ out_in_line = TRUE;
+ }
+
+
+static void out_end (void)
+ {
+ (void)fputc (')', out_file);
+ --out_level;
+ }
+
+
+static void out_real (double x)
+ {
+ (void)fprintf (out_file, " R %lf", x);
+ }
+
+
+static void out_scaled (long n)
+ {
+ out_real ((double)n/65536.0/design_size);
+ }
+
+
+static void out_char (long n)
+ {
+ if (n >= 0 && n <= 127 && isalnum ((int)n))
+ (void)fprintf (out_file, " C %c", (char)n);
+ else
+ (void)fprintf (out_file, " O %lo", n);
+ }
+
+
+static void out_dec (long n)
+ {
+ (void)fprintf (out_file, " D %ld", n);
+ }
+
+
+static void out_oct (long n)
+ {
+ (void)fprintf (out_file, " O %lo", n);
+ }
+
+
+
+static void out_str (char *txt, int len)
+ {
+ int i, level;
+ u_byte c;
+
+ level = 0;
+ (void)fputc (' ', out_file);
+ for (i = 0; i < len; ++i)
+ {
+ c = txt[i];
+ if (c == '(') ++level;
+ else if (c == ')') --level;
+ if (level < 0)
+ {
+ fprintf (stderr, "*** Unbalanced parentheses in string\n");
+ exit (2);
+ }
+ (void)fputc (c, out_file);
+ }
+ if (level != 0)
+ {
+ fprintf (stderr, "*** Unbalanced parentheses in string\n");
+ exit (2);
+ }
+ }
+
+
+static void out_down (long n)
+ {
+ out_prop ("MOVEDOWN");
+ out_scaled (n);
+ out_end ();
+ }
+
+
+static void out_right (long n)
+ {
+ out_prop ("MOVERIGHT");
+ out_scaled (n);
+ out_end ();
+ }
+
+
+static void out_set_char (long n, boolean move)
+ {
+ if (!move)
+ {
+ out_prop ("PUSH"); out_end ();
+ }
+ out_prop ("SETCHAR");
+ out_char (n);
+ out_end ();
+ if (!move)
+ {
+ out_prop ("POP"); out_end ();
+ }
+ }
+
+
+static void out_set_rule (boolean move)
+ {
+ long n1, n2;
+
+ n1 = dvi_get4 ();
+ n2 = dvi_get4 ();
+ if (!move)
+ {
+ out_prop ("PUSH"); out_end ();
+ }
+ out_prop ("SETRULE");
+ out_scaled (n1); out_scaled (n2);
+ out_end ();
+ if (!move)
+ {
+ out_prop ("PUSH"); out_end ();
+ }
+ }
+
+
+static void out_fnt_def (s_word b)
+ {
+ long font_number, check_sum, dsize;
+ s_word area_len, name_len;
+ u_byte name[256], area[256];
+ s_word i;
+
+ font_number = dvi_get_u (b-DVI_fnt_def1);
+ check_sum = dvi_get4 ();
+ (void)dvi_get4 (); /* scale factor */
+ dsize = dvi_get4 ();
+ area_len = dvi_get1u ();
+ name_len = dvi_get1u ();
+ for (i = 0; i < area_len; ++i)
+ area[i] = (u_byte)dvi_get1u ();
+ for (i = 0; i < name_len; ++i)
+ name[i] = (u_byte)dvi_get1u ();
+ out_prop ("MAPFONT");
+ out_dec (font_number);
+ out_prop ("FONTNAME"); out_str (name, name_len); out_end ();
+ if (area_len != 0)
+ {
+ out_prop ("FONTAREA"); out_str (area, area_len); out_end ();
+ }
+ if (check_sum != 0)
+ {
+ out_prop ("FONTCHECKSUM"); out_oct (check_sum); out_end ();
+ }
+ out_prop ("FONTDSIZE");
+ out_real ((double)dsize/(double)0x10000);
+ out_end ();
+ out_end ();
+ }
+
+
+static void out_fnt_num (long n)
+ {
+ out_prop ("SELECTFONT");
+ out_dec (n);
+ out_end ();
+ }
+
+
+static void out_special (long n)
+ {
+ out_prop ("SPECIAL");
+ out_str (mem->ptr, (int)n);
+ out_end ();
+ mem->ptr += n; mem->size -= n;
+ }
+
+
+static void output (struct mem *src)
+ {
+ s_word b;
+
+ mem = src; dst = NULL;
+ while (mem->size > 0)
+ {
+ b = dvi_get1u ();
+ if (b >= DVI_set_char_0 && b < DVI_set_char_0+128)
+ out_set_char ((long)b, TRUE);
+ else if (b >= DVI_fnt_num_0 && b < DVI_fnt_num_0+64)
+ out_fnt_num ((long)(b-DVI_fnt_num_0));
+ else
+ switch (b)
+ {
+ case DVI_set1:
+ case DVI_set2:
+ case DVI_set3:
+ case DVI_set4:
+ out_set_char (dvi_get_u (b-DVI_set1), TRUE);
+ break;
+ case DVI_put1:
+ case DVI_put2:
+ case DVI_put3:
+ case DVI_put4:
+ out_set_char (dvi_get_u (b-DVI_put1), FALSE);
+ break;
+ case DVI_set_rule:
+ out_set_rule (TRUE);
+ break;
+ case DVI_put_rule:
+ out_set_rule (FALSE);
+ break;
+ case DVI_push:
+ out_prop ("PUSH"); out_end ();
+ break;
+ case DVI_pop:
+ out_prop ("POP"); out_end ();
+ break;
+ case DVI_right1:
+ case DVI_right2:
+ case DVI_right3:
+ case DVI_right4:
+ out_right (dvi_get_s (b-DVI_right1));
+ break;
+ case DVI_down1:
+ case DVI_down2:
+ case DVI_down3:
+ case DVI_down4:
+ out_down (dvi_get_s (b-DVI_down1));
+ break;
+ case DVI_w0:
+ out_right (position.w);
+ break;
+ case DVI_w1:
+ case DVI_w2:
+ case DVI_w3:
+ case DVI_w4:
+ position.w = dvi_get_s (b-DVI_w1);
+ out_right (position.w);
+ break;
+ case DVI_x0:
+ out_right (position.x);
+ break;
+ case DVI_x1:
+ case DVI_x2:
+ case DVI_x3:
+ case DVI_x4:
+ position.x = dvi_get_s (b-DVI_x1);
+ out_right (position.x);
+ break;
+ case DVI_y0:
+ out_down (position.y);
+ break;
+ case DVI_y1:
+ case DVI_y2:
+ case DVI_y3:
+ case DVI_y4:
+ position.y = dvi_get_s (b-DVI_y1);
+ out_down (position.y);
+ break;
+ case DVI_z0:
+ out_down (position.z);
+ break;
+ case DVI_z1:
+ case DVI_z2:
+ case DVI_z3:
+ case DVI_z4:
+ position.z = dvi_get_s (b-DVI_z1);
+ out_down (position.z);
+ break;
+ case DVI_fnt1:
+ case DVI_fnt2:
+ case DVI_fnt3:
+ case DVI_fnt4:
+ out_fnt_num (dvi_get_s (b-DVI_fnt1));
+ break;
+ case DVI_xxx1:
+ case DVI_xxx2:
+ case DVI_xxx3:
+ case DVI_xxx4:
+ out_special (dvi_get_u (b-DVI_xxx1));
+ break;
+ case DVI_fnt_def1:
+ case DVI_fnt_def2:
+ case DVI_fnt_def3:
+ case DVI_fnt_def4:
+ out_fnt_def (b);
+ break;
+ default:
+ internal (3043);
+ exit (2);
+ }
+ }
+ mem = NULL;
+ }
+
+
+
+static void make_output (void)
+ {
+ struct map *mp;
+ struct font *fp;
+ char line[256];
+
+ out_in_line = FALSE;
+ out_level = 0;
+ for (fp = font_head; fp != NULL; fp = fp->next)
+ {
+ output (&fp->dvi);
+ }
+ if (opt_i)
+ {
+ while (fgets (line, sizeof (line), ins_file) != NULL)
+ fputs (line, out_file);
+ fclose (ins_file);
+ opt_i = FALSE;
+ }
+ for (mp = map_head; mp != NULL; mp = mp->next)
+ {
+ out_prop ("CHARACTER");
+ out_char (mp->code);
+ out_prop ("CHARWD"); out_scaled (mp->wd); out_end ();
+ out_prop ("CHARHT"); out_scaled (mp->ht); out_end ();
+ out_prop ("CHARDP"); out_scaled (mp->dp); out_end ();
+ out_prop ("MAP");
+ output (&mp->repl);
+ out_end ();
+ out_end ();
+ }
+ if (out_in_line)
+ (void)fputc ('\n', out_file);
+ }
+
+
+static void usage (void)
+ {
+ (void)fputs ("Usage:\n", stderr);
+ (void)fputs (" qdtexvpl -d<design_size> [-i<insert.pl>] <input.dvi> <output.vpl>\n",
+ stderr);
+ exit (1);
+ }
+
+
+int main (int argc, char *argv[])
+ {
+ int i;
+ char *p;
+
+ opt_d = FALSE; opt_i = FALSE;
+ ins_fname = NULL;
+ for (i = 1; i < argc; ++i)
+ if (argv[i][0] == '-')
+ switch (argv[i][1])
+ {
+ case 'd':
+ opt_d = TRUE;
+ errno = 0;
+ design_size = strtod (argv[i]+2, &p);
+ if (errno != 0 || design_size <= 0.0 || *p != 0)
+ usage ();
+ break;
+ case 'i':
+ opt_i = TRUE;
+ ins_fname = argv[i]+2;
+ break;
+ default:
+ usage ();
+ }
+ else
+ break;
+ if (!opt_d) usage ();
+ if (argc - i != 2) usage ();
+ dvi_fname = argv[i+0];
+ out_fname = argv[i+1];
+ dvi_file = fopen (dvi_fname, read_binary);
+ if (dvi_file == NULL)
+ {
+ (void)fprintf (stderr, "*** Cannot open input file '%s'\n", dvi_fname);
+ exit (1);
+ }
+ if (opt_i)
+ {
+ ins_file = fopen (ins_fname, read_text);
+ if (dvi_file == NULL)
+ {
+ (void)fprintf (stderr, "*** Cannot open -i file '%s'\n", ins_fname);
+ exit (1);
+ }
+ }
+ out_file = fopen (out_fname, write_text);
+ if (out_file == NULL)
+ {
+ (void)fprintf (stderr, "*** Cannot open output file '%s'\n", out_fname);
+ exit (1);
+ }
+ dvi_preamble ();
+ dvi_main ();
+ make_output ();
+ (void)fflush (out_file);
+ if (ferror (out_file))
+ {
+ (void)fprintf (stderr, "*** Cannot write to output file '%s'\n",
+ out_fname);
+ exit (1);
+ }
+ (void)fclose (out_file);
+ return (0);
+ }
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.def b/fonts/utilities/qdtexvpl/qdtexvpl.def
new file mode 100644
index 0000000000..7bf431a2e2
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.def
@@ -0,0 +1 @@
+NAME qdtexvpl WINDOWCOMPAT
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.doc b/fonts/utilities/qdtexvpl/qdtexvpl.doc
new file mode 100644
index 0000000000..d420be89f1
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.doc
@@ -0,0 +1,81 @@
+==============================================================================
+qdtexvpl.doc for qdtexvpl 1.0 Copyright (c) 1992 by Eberhard Mattes
+==============================================================================
+
+qdtexvpl is a tool for quick & dirty creation of virtual fonts. You have to
+create a TeX file which contains the TeX code to be put into the virtual font.
+Run TeX on the file. Then, feed the DVI file into qdtexvpl, which creates a
+VPL file. Use VPtoVF to create a TFM file and a VF file from the VPL file.
+
+This is an example of an input file:
+
+ %
+ % ibmpc437.tex
+ %
+ % Some extended characters for cmr10
+ %
+ \font\f=cmr10
+ \input qdtexvpl
+ \texvpl{^^84}{\f\"a}
+ \texvpl{^^94}{\f\"o}
+ \texvpl{^^81}{\f\"u}
+ \texvpl{^^8e}{\f\"A}
+ \texvpl{^^99}{\f\"O}
+ \texvpl{^^9a}{\f\"U}
+ \texvpl{^^e1}{\f\ss}
+ \bye
+
+You have to define the fonts referenced by your virtual font. If a font
+references itself, you have to run the complete process twice. TeX will
+complain about a missing TFM file on the first pass, you can ignore that
+warning.
+
+\input qdtexvpl to load the \texvpl macro.
+
+Then, use \texvpl to define how a character of the virtual font is to be
+constructed. The first argument of \texvpl is the character to be defined, the
+second argument contains the TeX commands to construct the character. You can
+use any TeX commands, including rules and plain TeX commands. Don't forget to
+switch to the font from which you want to take characters!
+
+Your file should end with \bye.
+
+Compile your file by calling TeX (usage of the plain format is recommended).
+This requires qdtexvpl.tfm. If you don't want to move that file to \emtex\tfm,
+add . to the TEXTFM environment variable.
+
+Run qdtexvpl to convert the resulting DVI file into a VPL file. The calling
+sequence of qdtexvpl is
+
+ qdtexvpl -d<design_size> [-i<insert.pl>] <input.dvi> <output.vpl>
+
+You have to replace <design_size> with the design size (pt) of your font. If
+you want to copy characters of another fonts into your font (for instance, if
+you want to complement a 7-bit font by characters in the range 128-255), use
+the -i option followed by the name of the PL file for that font (created by
+TFtoPL). The next argument is the name of the DVI file created by the previous
+step, the last argument is the output file name. There are no default
+extensions, you have to enter all the extensions! Example:
+
+ qdtexvpl -d10.0 myfont.dvi myfont.vpl
+
+Then, run VPtoVF to convert the VPL file into a TFM file and a VF file:
+
+ vptovf myfont
+
+If your virtual font references itself, you have to do all this once again,
+starting with compiling the TeX file by running TeX.
+
+
+Problems
+--------
+
+- qdtexvpl uses floating point math which is machine-dependent.
+
+- I don't know whether the computations done by qdtexvpl are precise
+ enough.
+
+- Better use ^^X or ^^ff notation for characters with code > 127.
+
+
+ --- END OF QDTEXVPL.DOC ---
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.pl b/fonts/utilities/qdtexvpl/qdtexvpl.pl
new file mode 100644
index 0000000000..2c6cd9890e
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.pl
@@ -0,0 +1,16 @@
+(CODINGSCHEME Dummy font for qdtexvpl)
+(DESIGNSIZE R 10.0)
+(CHECKSUM O 0)
+(FONTDIMEN
+ (SLANT R 0.0)
+ (SPACE R 0.0)
+ (STRETCH R 0.0)
+ (SHRINK R 0.0)
+ (XHEIGHT R 0.0)
+ (QUAD R 0.0)
+ (EXTRASPACE R 0.0)
+ )
+(CHARACTER C A
+ (CHARWD R 0.0)
+ (CHARHT R 0.0)
+ )
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.tex b/fonts/utilities/qdtexvpl/qdtexvpl.tex
new file mode 100644
index 0000000000..ec03bd435f
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.tex
@@ -0,0 +1,28 @@
+%
+% qdtexvpl.tex
+%
+%
+% \texvpl{dst}{cmds}
+%
+% dst Destination character
+% cmds Desired expansion of dst
+%
+% Example:
+%
+% \input qdtexvpl
+% \font\f=cmr10
+% \texvpl{„}{\f\"a}
+% \texvpl{”}{\f\"o}
+% \texvpl{}{\f\"u}
+% \texvpl{^^ff}{\f I\negthinspace R}
+% \bye
+%
+% Limitations:
+%
+% - \unusedfont must not be used in `cmds'.
+% - \unusedfont must contain an `A'.
+%
+\nopagenumbers
+\font\unusedfont=qdtexvpl
+\def\texvpl#1#2{{\noindent\unusedfont A \setbox0=\hbox{#2}%
+ \special{<#1}\copy0\special{>\the\wd0 \the\ht0 \the\dp0}\par}}
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.tfm b/fonts/utilities/qdtexvpl/qdtexvpl.tfm
new file mode 100644
index 0000000000..cd5b2de83e
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.tfm
Binary files differ
diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.txt b/fonts/utilities/qdtexvpl/qdtexvpl.txt
new file mode 120000
index 0000000000..44441007ed
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/qdtexvpl.txt
@@ -0,0 +1 @@
+qdtexvpl.doc \ No newline at end of file
diff --git a/fonts/utilities/qdtexvpl/self.tex b/fonts/utilities/qdtexvpl/self.tex
new file mode 100644
index 0000000000..76d2e04e30
--- /dev/null
+++ b/fonts/utilities/qdtexvpl/self.tex
@@ -0,0 +1,11 @@
+%
+% self.tex
+%
+% A self-referencing virtual font
+%
+\font\f=cmr10
+\font\s=self
+\input qdtexvpl
+\texvpl{a}{\f a}
+\texvpl{b}{\s a}
+\bye
diff --git a/fonts/utilities/t1infos/README b/fonts/utilities/t1infos/README
new file mode 100644
index 0000000000..873fc565e1
--- /dev/null
+++ b/fonts/utilities/t1infos/README
@@ -0,0 +1,9 @@
+Two tiny tools for studying Type 1 fonts.
+ - t1area: give informations about the black area of a glyph;
+ - t1extremes: tell if "extremes" of Bzeier curves are at the right place.
+Compile the tools with:
+
+gcc -lm -lt1 -I /usr/local/include -L /usr/local/lib -o t1area t1area.c
+gcc -lm -lt1 -I /usr/local/include -L /usr/local/lib -o t1extremes t1aextremes.c
+
+Thomas Baruchel (baruchel@users.sourceforge.net)
diff --git a/fonts/utilities/t1infos/kerndict.ps b/fonts/utilities/t1infos/kerndict.ps
new file mode 100644
index 0000000000..d5c895d25f
--- /dev/null
+++ b/fonts/utilities/t1infos/kerndict.ps
@@ -0,0 +1,618 @@
+%!
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% KERNDICT a PostScript dictionary for automatical kerning %
+% written by Thomas Baruchel (may 2003) %
+% %
+% Several methods are provided %
+% * Tangent-based kerning (an idea of the author) %
+% 45° tangents encapsulate the letter at the right or at the left. %
+% How far they are from the left or right side of the BoundingBox %
+% tells what can be done. The method is intended to be very quick. %
+% Usage : { kernproc } (Hello) kshow %
+% %
+% * Sector-based kerning (a classical method) %
+% The user chooses the length of the smallest horizontal gap %
+% between the two letters. The number of sectors gives the %
+% precision of the computation. %
+% Usage : { 175 12 kernsector } (Hello) kshow %
+% Warning : not intended to take account of spaces %
+% %
+% * Outline-based kerning %
+% The user chooses the real distance between the characters even %
+% if the two closest points of the outline are not at the same %
+% height. The user must build an outline version of the font he %
+% uses before calling the procedure. The /StrokeWidth key of this %
+% outline font must be set to the expected distance. A number of %
+% sectors give the precision of the computation. %
+% Usage : { /Outline-Font findfont 12 kernoutline } (Hello) kshow %
+% Warning : not intended to take account of spaces %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/kerndict 5 dict dup begin
+
+/min { dup 2 index ge { pop } { exch pop } ifelse } bind def
+/kerncompute { 1 index 1 index mul 0 ge { abs exch abs min
+neg 3 div } { pop pop 0 } ifelse } bind def
+/kernproc { gsave (..) dup 0 4 -1 roll put dup 1 4 -1 roll put
+currentfont dup /FontMatrix get matrix invertmatrix makefont setfont
+newpath 0 0 moveto dup true charpath flattenpath pathbbox pop exch pop
+add exch [1 -1 -1 -1 0 0] setmatrix newpath 0 0 moveto true charpath
+[1 0 0 1 0 0] setmatrix pathbbox sub 3 index sub 4 1 roll sub sub
+grestore kerncompute currentfont /FontMatrix get matrix currentmatrix
+exch concat exch 0 rmoveto setmatrix } bind def
+/kernsector { matrix currentmatrix currentfont dup dup /FontMatrix get
+dup concat gsave newpath matrix invertmatrix makefont setfont /FontBBox
+get aload pop 2 {3 index neg} repeat moveto exch 3 index sub 2 mul (.)
+dup 0 11 -1 roll put true charpath currentpoint pop (.) dup 0 12 -1 roll
+put true charpath currentpoint pop exch flattenpath 0 moveto 3 -1 roll 4
+-1 roll sub dup 0 exch rlineto clip dup 7 -1 roll div 0 0 2 index 5 -1
+roll { gsave 0 exch 5 index 4 index rectclip clippath pathbbox pop exch
+pop sub min grestore } for exch pop add exch pop add 3 -1 roll sub neg
+grestore 0 rmoveto setmatrix } bind def
+/kernoutline { matrix currentmatrix currentfont /FontMatrix get concat
+gsave 3 -1 roll dup /FontMatrix get matrix invertmatrix makefont dup
+setfont /FontBBox get aload pop 2 {3 index neg} repeat moveto exch 3
+index sub 2 mul (.) dup 0 10 -1 roll put true charpath currentpoint pop
+(.) dup 0 11 -1 roll put true charpath currentpoint pop exch flattenpath
+0 moveto 3 -1 roll 4 -1 roll sub dup 0 exch rlineto clip dup 7 -1 roll
+div 0 0 2 index 5 -1 roll { gsave 0 exch 5 index 4 index rectclip
+clippath pathbbox pop exch pop sub min grestore } for exch pop add exch
+pop add neg grestore 0 rmoveto setmatrix } bind def
+
+
+end def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Test %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+gsave 0 -36 translate
+/Courier-Bold findfont 48 scalefont setfont
+%595 (kerndict.ps) stringwidth pop sub 2 div
+72 772 moveto (kerndict.ps) show
+/myfont /Helvetica def
+myfont findfont dup length 1 add dict begin
+currentdict copy /PaintType 2 def /StrokeWidth 128 def
+/myfont-Outline exch definefont pop end
+
+gsave 84 -10 translate
+kerndict begin
+myfont findfont 64 scalefont setfont
+72 700 moveto (AVATeV/4) show
+72 600 moveto {175 16 kernsector} (AVATeV/4) kshow
+72 500 moveto {kernproc} (AVATeV/4) kshow
+72 400 moveto {/myfont-Outline findfont 12 kernoutline} (AVATeV/4) kshow
+/Helvetica findfont 10 scalefont setfont
+84 688 moveto (No correction) show
+84 588 moveto (Sector-based kerning) show
+84 488 moveto (Tangent-based kerning) show
+84 388 moveto (Outline-based kerning) show
+end grestore
+
+newpath 140 750 moveto 330 0 rlineto 0 -385 rlineto
+-330 0 rlineto closepath stroke
+
+gsave 0 -6 translate
+/Courier findfont 10 scalefont setfont
+84 344 moveto (Copyright \(c\) 2003 Thomas Baruchel) show
+84 332 moveto () show
+84 320 moveto (Permission is hereby granted, free of charge, to any person obtaining) show
+84 308 moveto (a copy of this software and associated documentation files \(the) show
+84 296 moveto ("Software"\), to deal in the Software without restriction, including) show
+84 284 moveto (without limitation the rights to use, copy, modify, merge, publish,) show
+84 272 moveto (distribute, sublicense, and/or sell copies of the Software, and to) show
+84 260 moveto (permit persons to whom the Software is furnished to do so, subject to) show
+84 248 moveto (the following conditions:) show
+84 236 moveto () show
+84 224 moveto (The above copyright notice and this permission notice shall be) show
+84 212 moveto (included in all copies or substantial portions of the Software.) show
+84 200 moveto () show
+84 188 moveto (THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,) show
+84 176 moveto (EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF) show
+84 164 moveto (MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.) show
+84 152 moveto (IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY) show
+84 140 moveto (CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,) show
+84 128 moveto (TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE) show
+84 116 moveto ( SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.) show
+grestore grestore showpage
+
+
+/_S { % save current state
+ /_s save def
+} def
+/_R { % restore from saved state
+ _s restore
+} def
+
+/S { % showpage protecting gstate
+ gsave
+ showpage
+ grestore
+} bind def
+
+/MF { % fontname newfontname -> - make a new encoded font
+ /newfontname exch def
+ /fontname exch def
+
+ /fontdict fontname findfont def
+ /newfont fontdict maxlength dict def
+
+ fontdict {
+ exch
+ dup /FID eq {
+ % skip FID pair
+ pop pop
+ } {
+ % copy to the new font dictionary
+ exch newfont 3 1 roll put
+ } ifelse
+ } forall
+
+ newfont /FontName newfontname put
+
+ % insert only valid encoding vectors
+ encoding_vector length 256 eq {
+ newfont /Encoding encoding_vector put
+ } if
+
+ newfontname newfont definefont pop
+} def
+
+/SF { % fontname width height -> - set a new font
+ /height exch def
+ /width exch def
+
+ findfont
+ [width 0 0 height 0 0] makefont setfont
+} def
+
+/SUF { % fontname width height -> - set a new user font
+ /height exch def
+ /width exch def
+
+ /F-gs-user-font MF
+ /F-gs-user-font width height SF
+} def
+
+/M {moveto} bind def
+/s {show} bind def
+
+/Box { % x y w h -> - define box path
+ /d_h exch def /d_w exch def /d_y exch def /d_x exch def
+ d_x d_y moveto
+ d_w 0 rlineto
+ 0 d_h rlineto
+ d_w neg 0 rlineto
+ closepath
+} def
+
+/bgs { % x y height blskip gray str -> - show string with bg color
+ /str exch def
+ /gray exch def
+ /blskip exch def
+ /height exch def
+ /y exch def
+ /x exch def
+
+ gsave
+ x y blskip sub str stringwidth pop height Box
+ gray setgray
+ fill
+ grestore
+ x y M str s
+} def
+
+% Highlight bars.
+/highlight_bars { % nlines lineheight output_y_margin gray -> -
+ gsave
+ setgray
+ /ymarg exch def
+ /lineheight exch def
+ /nlines exch def
+
+ % This 2 is just a magic number to sync highlight lines to text.
+ 0 d_header_y ymarg sub 2 sub translate
+
+ /cw d_output_w cols div def
+ /nrows d_output_h ymarg 2 mul sub lineheight div cvi def
+
+ % for each column
+ 0 1 cols 1 sub {
+ cw mul /xp exch def
+
+ % for each rows
+ 0 1 nrows 1 sub {
+ /rn exch def
+ rn lineheight mul neg /yp exch def
+ rn nlines idiv 2 mod 0 eq {
+ % Draw highlight bar. 4 is just a magic indentation.
+ xp 4 add yp cw 8 sub lineheight neg Box fill
+ } if
+ } for
+ } for
+
+ grestore
+} def
+
+% Line highlight bar.
+/line_highlight { % x y width height gray -> -
+ gsave
+ /gray exch def
+ Box gray setgray fill
+ grestore
+} def
+
+% Column separator lines.
+/column_lines {
+ gsave
+ .1 setlinewidth
+ 0 d_footer_h translate
+ /cw d_output_w cols div def
+ 1 1 cols 1 sub {
+ cw mul 0 moveto
+ 0 d_output_h rlineto stroke
+ } for
+ grestore
+} def
+
+% Column borders.
+/column_borders {
+ gsave
+ .1 setlinewidth
+ 0 d_footer_h moveto
+ 0 d_output_h rlineto
+ d_output_w 0 rlineto
+ 0 d_output_h neg rlineto
+ closepath stroke
+ grestore
+} def
+
+% Do the actual underlay drawing
+/draw_underlay {
+ ul_style 0 eq {
+ ul_str true charpath stroke
+ } {
+ ul_str show
+ } ifelse
+} def
+
+% Underlay
+/underlay { % - -> -
+ gsave
+ 0 d_page_h translate
+ d_page_h neg d_page_w atan rotate
+
+ ul_gray setgray
+ ul_font setfont
+ /dw d_page_h dup mul d_page_w dup mul add sqrt def
+ ul_str stringwidth pop dw exch sub 2 div ul_h_ptsize -2 div moveto
+ draw_underlay
+ grestore
+} def
+
+/user_underlay { % - -> -
+ gsave
+ ul_x ul_y translate
+ ul_angle rotate
+ ul_gray setgray
+ ul_font setfont
+ 0 0 ul_h_ptsize 2 div sub moveto
+ draw_underlay
+ grestore
+} def
+
+% Page prefeed
+/page_prefeed { % bool -> -
+ statusdict /prefeed known {
+ statusdict exch /prefeed exch put
+ } {
+ pop
+ } ifelse
+} def
+
+% Wrapped line markers
+/wrapped_line_mark { % x y charwith charheight type -> -
+ /type exch def
+ /h exch def
+ /w exch def
+ /y exch def
+ /x exch def
+
+ type 2 eq {
+ % Black boxes (like TeX does)
+ gsave
+ 0 setlinewidth
+ x w 4 div add y M
+ 0 h rlineto w 2 div 0 rlineto 0 h neg rlineto
+ closepath fill
+ grestore
+ } {
+ type 3 eq {
+ % Small arrows
+ gsave
+ .2 setlinewidth
+ x w 2 div add y h 2 div add M
+ w 4 div 0 rlineto
+ x w 4 div add y lineto stroke
+
+ x w 4 div add w 8 div add y h 4 div add M
+ x w 4 div add y lineto
+ w 4 div h 8 div rlineto stroke
+ grestore
+ } {
+ % do nothing
+ } ifelse
+ } ifelse
+} def
+
+% EPSF import.
+
+/BeginEPSF {
+ /b4_Inc_state save def % Save state for cleanup
+ /dict_count countdictstack def % Count objects on dict stack
+ /op_count count 1 sub def % Count objects on operand stack
+ userdict begin
+ /showpage { } def
+ 0 setgray 0 setlinecap
+ 1 setlinewidth 0 setlinejoin
+ 10 setmiterlimit [ ] 0 setdash newpath
+ /languagelevel where {
+ pop languagelevel
+ 1 ne {
+ false setstrokeadjust false setoverprint
+ } if
+ } if
+} bind def
+
+/EndEPSF {
+ count op_count sub { pos } repeat % Clean up stacks
+ countdictstack dict_count sub { end } repeat
+ b4_Inc_state restore
+} bind def
+
+% Check PostScript language level.
+/languagelevel where {
+ pop /gs_languagelevel languagelevel def
+} {
+ /gs_languagelevel 1 def
+} ifelse
+%%EndResource
+%%BeginResource: procset Enscript-Encoding-88591 1.6 1
+/encoding_vector [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /hyphen /period /slash
+/zero /one /two /three
+/four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C
+/D /E /F /G
+/H /I /J /K
+/L /M /N /O
+/P /Q /R /S
+/T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c
+/d /e /f /g
+/h /i /j /k
+/l /m /n /o
+/p /q /r /s
+/t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /tilde /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /bullet
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis
+] def
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%IncludeResource: font Courier
+/HFpt_w 10 def
+/HFpt_h 10 def
+/Courier-Bold /HF-gs-font MF
+/HF /HF-gs-font findfont [HFpt_w 0 0 HFpt_h 0 0] makefont def
+/Courier-Bold /F-gs-font MF
+/F-gs-font 10 10 SF
+/#copies 1 def
+% Pagedevice definitions:
+gs_languagelevel 1 gt {
+ <<
+ /PageSize [595 842]
+ >> setpagedevice
+} if
+/d_page_w 451 def
+/d_page_h 698 def
+/d_header_x 0 def
+/d_header_y 698 def
+/d_header_w 451 def
+/d_header_h 0 def
+/d_footer_x 0 def
+/d_footer_y 0 def
+/d_footer_w 451 def
+/d_footer_h 0 def
+/d_output_w 451 def
+/d_output_h 698 def
+/cols 1 def
+%%EndSetup
+%%Page: (1) 1
+%%BeginPageSetup
+_S
+72 72 translate
+/pagenum 1 def
+/fname (code) def
+/fdir () def
+/ftail (code) def
+/user_header_p false def
+%%EndPageSetup
+5 685 M
+(%!) s
+5 674 M
+(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) s
+5 663 M
+(% %) s
+5 652 M
+(% KERNDICT a PostScript dictionary for automatical kerning %) s
+5 641 M
+(% written by Thomas Baruchel \(may 2003\) %) s
+5 630 M
+(% %) s
+5 619 M
+(% Several methods are provided %) s
+5 608 M
+(% * Tangent-based kerning \(an idea of the author\) %) s
+5 597 M
+(% 45\260 tangents encapsulate the letter at the right or at the left. %) s
+5 586 M
+(% How far they are from the left or right side of the BoundingBox %) s
+5 575 M
+(% tells what can be done. The method is intended to be very quick. %) s
+5 564 M
+(% Usage : { kernproc } \(Hello\) kshow %) s
+5 553 M
+(% %) s
+5 542 M
+(% * Sector-based kerning \(a classical method\) %) s
+5 531 M
+(% The user chooses the length of the smallest horizontal gap %) s
+5 520 M
+(% between the two letters. The number of sectors gives the %) s
+5 509 M
+(% precision of the computation. %) s
+5 498 M
+(% Usage : { 175 12 kernsector } \(Hello\) kshow %) s
+5 487 M
+(% Warning : not intended to take account of spaces %) s
+5 476 M
+(% %) s
+5 465 M
+(% * Outline-based kerning %) s
+5 454 M
+(% The user chooses the real distance between the characters even %) s
+5 443 M
+(% if the two closest points of the outline are not at the same %) s
+5 432 M
+(% height. The user must build an outline version of the font he %) s
+5 421 M
+(% uses before calling the procedure. The /StrokeWidth key of this %) s
+5 410 M
+(% outline font must be set to the expected distance. A number of %) s
+5 399 M
+(% sectors give the precision of the computation. %) s
+5 388 M
+(% Usage : { /Outline-Font findfont 12 kernoutline } \(Hello\) kshow %) s
+5 377 M
+(% Warning : not intended to take account of spaces %) s
+5 366 M
+(% %) s
+5 355 M
+(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) s
+5 333 M
+(/kerndict 5 dict dup begin) s
+5 322 M
+(/min { dup 2 index ge { pop } { exch pop } ifelse } bind def) s
+5 311 M
+(/kerncompute { 1 index 1 index mul 0 ge { abs exch abs min) s
+5 300 M
+(neg 3 div } { pop pop 0 } ifelse } bind def) s
+5 289 M
+(/kernproc { gsave \(..\) dup 0 4 -1 roll put dup 1 4 -1 roll put) s
+5 278 M
+(currentfont dup /FontMatrix get matrix invertmatrix makefont setfont) s
+5 267 M
+(newpath 0 0 moveto dup true charpath flattenpath pathbbox pop exch pop) s
+5 256 M
+(add exch [1 -1 -1 -1 0 0] setmatrix newpath 0 0 moveto true charpath) s
+5 245 M
+([1 0 0 1 0 0] setmatrix pathbbox sub 3 index sub 4 1 roll sub sub) s
+5 234 M
+(grestore kerncompute currentfont /FontMatrix get matrix currentmatrix) s
+5 223 M
+(exch concat exch 0 rmoveto setmatrix } bind def) s
+5 212 M
+(/kernsector { matrix currentmatrix currentfont dup dup /FontMatrix get) s
+5 201 M
+(dup concat gsave newpath matrix invertmatrix makefont setfont /FontBBox) s
+5 190 M
+(get aload pop 2 {3 index neg} repeat moveto exch 3 index sub 2 mul \(.\)) s
+5 179 M
+(dup 0 11 -1 roll put true charpath currentpoint pop \(.\) dup 0 12 -1 roll) s
+5 168 M
+(put true charpath currentpoint pop exch flattenpath 0 moveto 3 -1 roll 4) s
+5 157 M
+(-1 roll sub dup 0 exch rlineto clip dup 7 -1 roll div 0 0 2 index 5 -1) s
+5 146 M
+(roll { gsave 0 exch 5 index 4 index rectclip clippath pathbbox pop exch) s
+5 135 M
+(pop sub min grestore } for exch pop add exch pop add 3 -1 roll sub neg) s
+5 124 M
+(grestore 0 rmoveto setmatrix } bind def) s
+5 113 M
+(/kernoutline { matrix currentmatrix currentfont /FontMatrix get concat) s
+5 102 M
+(gsave 3 -1 roll dup /FontMatrix get matrix invertmatrix makefont dup) s
+5 91 M
+(setfont /FontBBox get aload pop 2 {3 index neg} repeat moveto exch 3) s
+5 80 M
+(index sub 2 mul \(.\) dup 0 10 -1 roll put true charpath currentpoint pop) s
+5 69 M
+(\(.\) dup 0 11 -1 roll put true charpath currentpoint pop exch flattenpath) s
+5 58 M
+(0 moveto 3 -1 roll 4 -1 roll sub dup 0 exch rlineto clip dup 7 -1 roll) s
+5 47 M
+(div 0 0 2 index 5 -1 roll { gsave 0 exch 5 index 4 index rectclip) s
+5 36 M
+(clippath pathbbox pop exch pop sub min grestore } for exch pop add exch) s
+5 25 M
+(pop add neg grestore 0 rmoveto setmatrix } bind def) s
+5 14 M
+(end def) s
+_R
+S
+%%Trailer
+%%Pages: 1
+%%DocumentNeededResources: font Courier-Bold Courier
+%%EOF
diff --git a/fonts/utilities/t1infos/t1area.c b/fonts/utilities/t1infos/t1area.c
new file mode 100644
index 0000000000..6630c390e9
--- /dev/null
+++ b/fonts/utilities/t1infos/t1area.c
@@ -0,0 +1,167 @@
+/*
+
+ t1area
+ ======
+
+ Scan a Type 1 font and tell the area of each character.
+ Also tell how much percent of the bounding box of the character
+ is filled by this area.
+
+ Copyright (c) 2003 Thomas Baruchel
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <t1lib.h>
+#include <math.h>
+
+int usage(void) {
+ fprintf(stderr,"Usage: t1area [-v] file\n -v verbose output\n");
+ return(EXIT_FAILURE);
+}
+
+double integrale(double t1, double t2, int ay, int by, int cy, int dy,
+ int a, int b, int c) {
+ return(
+ ( ay*a*t2*t2*t2*t2*t2*t2/6
+ + (ay*b+by*a)*t2*t2*t2*t2*t2/5
+ + (ay*c+by*b+cy*a)*t2*t2*t2*t2/4
+ + (by*c+cy*b+dy*a)*t2*t2*t2/3
+ + (cy*c+dy*b)*t2*t2/2
+ + dy*c*t2 )
+-
+ ( ay*a*t1*t1*t1*t1*t1*t1/6
+ + (ay*b+by*a)*t1*t1*t1*t1*t1/5
+ + (ay*c+by*b+cy*a)*t1*t1*t1*t1/4
+ + (by*c+cy*b+dy*a)*t1*t1*t1/3
+ + (cy*c+dy*b)*t1*t1/2
+ + dy*c*t1 )
+ );
+}
+
+void area(T1_OUTLINE *outline, BBox bb, char *name, unsigned char v) {
+ auto int xpos = 0;
+ auto int ypos = -bb.lly;
+ auto double area = 0;
+ do {
+ switch(((T1_PATHSEGMENT *) outline)->type) {
+ case T1_PATHTYPE_MOVE: {
+ xpos += (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.x);
+ ypos -= (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.y);
+ break;
+ }
+ case T1_PATHTYPE_LINE: {
+ auto int dx =
+ (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.x);
+ auto int dy =
+ - (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.y);
+ auto double surface = (double) (abs(dx)*((dy<0) ? (ypos+dy) : ypos))
+ + ((double) (abs(dy*dx)))/((double) 2);
+ area += (dx<0) ? surface : -surface;
+ xpos += dx;
+ ypos += dy;
+ break;
+ }
+ case T1_PATHTYPE_BEZIER: {
+ auto int x0 = xpos;
+ auto int y0 = ypos;
+ auto int x1 =
+ xpos+T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->B.x);
+ auto int y1 =
+ ypos-T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->B.y);
+ auto int x2 =
+ xpos+T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->C.x);
+ auto int y2 =
+ ypos-T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->C.y);
+ /* x'(t) = a.t^2 + b.t + c */
+ auto int a,b,c;
+ /* y(t) = ay.t^3 + by.t^2 + cy.t + dy */
+ auto int ay,by,cy;
+ /* auto int dy; useless */
+ xpos += (int) T1_NEARESTPOINT(outline->dest.x);
+ ypos -= (int) T1_NEARESTPOINT(outline->dest.y);
+ ay = -y0 + 3*y1 -3*y2 + ypos;
+ by = 3*y0-6*y1+3*y2;
+ cy = -3*y0+3*y1;
+ /* dy = y0; useless */
+ a = 3*(-x0+3*x1-3*x2+xpos);
+ b = 6*(x0-2*x1+x2);
+ c = 3*(-x0+x1);
+ area -= integrale(0,1,ay,by,cy,y0,a,b,c);
+ break;
+ }
+ }
+ } while ((outline = outline->link) != NULL);
+ if(area != (double) 0) {
+ fprintf(stdout,"/%s area = %.2f",name,area);
+ if(v!=0) {
+ fprintf(stdout," (%.2f %% of BBox)",
+ area/((bb.urx-bb.llx)*(bb.ury-bb.lly))*100);
+ }
+ fprintf(stdout,"\n");
+ }
+}
+
+int main(int argc, char **argv)
+{
+ static signed int i;
+ static unsigned char j=0;
+ static char *fontname = NULL;
+ static unsigned char v = 0;
+
+ for(i=1;i<argc;i++) {
+ if((argv[i][0]=='-')
+ && (argv[i][1]=='v')
+ && (argv[i][2]=='\0')) v = 1;
+ else if(fontname==NULL) fontname = argv[i];
+ else exit(usage());
+ }
+ if(fontname==NULL) exit(usage());
+ if (T1_InitLib(NO_LOGFILE)==NULL) {
+ fprintf(stderr, "Initialization of t1lib failed\n");
+ exit(EXIT_FAILURE);
+ }
+ i = T1_AddFont(fontname);
+ if(i<0) {
+ T1_CloseLib();
+ if(i==-1) {
+ fprintf(stderr, "Font file could not be located\n");
+ exit(EXIT_FAILURE);
+ }
+ fprintf(stderr, "Memory allocation failure\n");
+ exit(EXIT_FAILURE);
+ }
+ if(T1_LoadFont(i)==-1) {
+ T1_CloseLib();
+ fprintf(stderr, "t1lib could not load the font\n");
+ exit(EXIT_FAILURE);
+ }
+ do {
+ auto T1_OUTLINE *myoutline;
+ area(myoutline = T1_GetCharOutline(i,j,1000,NULL),
+ T1_GetCharBBox(i,j),
+ T1_GetCharName(i,j),v);
+ T1_FreeOutline(myoutline);
+ } while(j++<255);
+ T1_CloseLib();
+ return(EXIT_SUCCESS);
+}
diff --git a/fonts/utilities/t1infos/t1extremes.c b/fonts/utilities/t1infos/t1extremes.c
new file mode 100644
index 0000000000..6ab8363c33
--- /dev/null
+++ b/fonts/utilities/t1infos/t1extremes.c
@@ -0,0 +1,159 @@
+/*
+
+ t1extremes
+ ==========
+
+ Scan the outlines of a Type 1 font in order to see if some extremes
+ are missing. Type 1 specifications strongly suggest to add a point in
+ the outline path at such extreme places.
+
+ Copyright (c) 2003 Thomas Baruchel
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <t1lib.h>
+#include <math.h>
+
+int usage(void) {
+ fprintf(stderr,
+ "Usage: t1extremes [-v] file\n -v verbose output\n");
+ return(EXIT_FAILURE);
+}
+
+void position(double t, int x0, int y0, int x1, int y1,
+ int x2, int y2, int x3, int y3, char *name,
+ unsigned char d, unsigned char v) {
+ auto double x =
+ (double) x0 + ((double) (3*(-x0+x1)))*t
+ + ((double) (3*(x0-2*x1+x2)))*t*t
+ + ((double) (-x0+3*x1-3*x2+x3))*t*t*t;
+ auto double y =
+ (double) y0 + ((double) (3*(-y0+y1)))*t
+ + ((double) (3*(y0-2*y1+y2)))*t*t
+ + ((double) (-y0+3*y1-3*y2+y3))*t*t*t;
+ fprintf(stdout,"/%s : missing an extreme at (%.3f , %.3f) with a",name,x,y);
+ if(d==0) fprintf(stdout," vertical tangent\n");
+ else fprintf(stdout,"n horizontal tangent\n");
+ if(v!=0) {
+ auto double d1 = (x0-x)*(x0-x) + (y0-y)*(y0-y);
+ auto double d2 = (x3-x)*(x3-x) + (y3-y)*(y3-y);
+ fprintf(stdout," closest point of the outline is (");
+ if(d1<d2) fprintf(stdout,"%d , %d), distance = %.3f\n",x0,y0,sqrt(d1));
+ else fprintf(stdout,"%d , %d), distance = %.3f\n",x3,y3,sqrt(d2));
+ }
+}
+
+void missing_extremes(T1_OUTLINE *outline, char *name, unsigned char v) {
+ auto int xpos = 0;
+ auto int ypos = 0;
+ do {
+ switch(((T1_PATHSEGMENT *) outline)->type) {
+ case T1_PATHTYPE_MOVE:
+ case T1_PATHTYPE_LINE: {
+ xpos += (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.x);
+ ypos -= (int) T1_NEARESTPOINT(((T1_PATHSEGMENT *) outline)->dest.y);
+ break;
+ }
+ case T1_PATHTYPE_BEZIER: {
+ auto int x0 = xpos;
+ auto int y0 = ypos;
+ auto int x1 =
+ xpos+T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->B.x);
+ auto int y1 =
+ ypos-T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->B.y);
+ auto int x2 =
+ xpos+T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->C.x);
+ auto int y2 =
+ ypos-T1_NEARESTPOINT(((T1_BEZIERSEGMENT *) outline)->C.y);
+ auto int a,b,c,delta;
+ xpos += (int) T1_NEARESTPOINT(outline->dest.x);
+ ypos -= (int) T1_NEARESTPOINT(outline->dest.y);
+ a = 3*(-x0+3*x1-3*x2+xpos);
+ b = 6*(x0-2*x1+x2);
+ c = 3*(-x0+x1);
+ delta = b*b-4*a*c;
+ if(delta>=0) {
+ auto double t1 = (-b-sqrt(delta))/(2*a);
+ auto double t2 = (-b+sqrt(delta))/(2*a);
+ if((t1>0)&&(t1<1)) position(t1,x0,y0,x1,y1,x2,y2,xpos,ypos,name,0,v);
+ if((t2>0)&&(t2<1)) position(t2,x0,y0,x1,y1,x2,y2,xpos,ypos,name,0,v);
+ }
+ a = 3*(-y0+3*y1-3*y2+ypos);
+ b = 6*(y0-2*y1+y2);
+ c = 3*(-y0+y1);
+ delta = b*b-4*a*c;
+ if(delta>=0) {
+ auto double t1 = (-b-sqrt(delta))/(2*a);
+ auto double t2 = (-b+sqrt(delta))/(2*a);
+ if((t1>0)&&(t1<1)) position(t1,x0,y0,x1,y1,x2,y2,xpos,ypos,name,1,v);
+ if((t2>0)&&(t2<1)) position(t2,x0,y0,x1,y1,x2,y2,xpos,ypos,name,1,v);
+ }
+ break;
+ }
+ }
+ } while ((outline = outline->link) != NULL);
+}
+
+int main(int argc, char **argv)
+{
+ static signed int i;
+ static unsigned char j=0;
+ static char *fontname = NULL;
+ static unsigned char v = 0;
+
+ for(i=1;i<argc;i++) {
+ if((argv[i][0]=='-')
+ && (argv[i][1]=='v')
+ && (argv[i][2]=='\0')) v = 1;
+ else if(fontname==NULL) fontname = argv[i];
+ else exit(usage());
+ }
+ if(fontname==NULL) exit(usage());
+ if (T1_InitLib(NO_LOGFILE)==NULL) {
+ fprintf(stderr, "Initialization of t1lib failed\n");
+ exit(EXIT_FAILURE);
+ }
+ i = T1_AddFont(fontname);
+ if(i<0) {
+ T1_CloseLib();
+ if(i==-1) {
+ fprintf(stderr, "Font file could not be located\n");
+ exit(EXIT_FAILURE);
+ }
+ fprintf(stderr, "Memory allocation failure\n");
+ exit(EXIT_FAILURE);
+ }
+ if(T1_LoadFont(i)==-1) {
+ T1_CloseLib();
+ fprintf(stderr, "t1lib could not load the font\n");
+ exit(EXIT_FAILURE);
+ }
+ do {
+ auto T1_OUTLINE *myoutline;
+ missing_extremes(myoutline = T1_GetCharOutline(i,j,1000,NULL),
+ T1_GetCharName(i,j),v);
+ T1_FreeOutline(myoutline);
+ } while(j++<255);
+ T1_CloseLib();
+ return(EXIT_SUCCESS);
+}
diff --git a/fonts/utilities/t1install/toil/0toileng.inf b/fonts/utilities/t1install/toil/0toileng.inf
new file mode 100644
index 0000000000..aaab47fde0
--- /dev/null
+++ b/fonts/utilities/t1install/toil/0toileng.inf
@@ -0,0 +1,184 @@
+This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL
+This package is public domain | Pakiet stanowi dobro powszechne
+For more info see `0TOILENG.LIC' | Wi/ecej informacji w ,,0TOILPOL.LIC''
+============================================================================
+
+The package TOIL was created in order to facilitate the tedious task of
+installing Type 1 Adobe fonts for T. Rokicki's DVIPS driver. The main engine
+of the package is the MS DOS script, A2T.BAT, which invokes (GNU) AWK and
+METAPOST (or METAFONT; see the section ``REMARKS CONCERNING CONFIGURATION''
+below), and, as a result, creates and places appropriately files needed for
+the proper functioning of a DVIPS driver.
+
+The approach used in the TOIL package differs from the approach used by the
+AFM2TFM program and the FONTINST utility; also, the scope of applications is
+slightly different. In fact, TOIL was designed in order to get rid of
+annoying ``manual adjustments'' and its primary scope of application is a
+fully automatic font installation. Automatization is particularly useful in
+the case of temporary (i.e., local) installation. You may ask whether a local
+installation is really needed. The answer is: yes, if you use a plethora of
+fonts from different vendors, you use different encodings for different
+occasions, and, moreover, you don't want to clutter up your disks with
+the litter of TFM, encoding and font map files.
+
+Since the package employs only AWK and METAPOST, it is expected to be
+portable to other platforms.
+
+The process of installing consists of the following stages: first, the whole
+process is prepared, then an AFM file is converted to a temporary MF file,
+then METAPOST is invoked with the temporary MF file, and eventually METAPOST
+LOG file is processed and DVIPS-oriented data is extracted and stored in
+directories defined in a config file TOIL.CFG (see TOIL.CFG for details).
+
+The batch file should be invoked as follows:
+
+ A2T font_name [additional_parameters]
+
+Additional parameters can have the following form:
+ -L[ ]external_ligature_file_name
+ -E[ ]external_encoding_file_name
+ -M[ ]METAPOST_file_name
+ -N[ ]resulting_encoding_file_name
+ -X[ ]x_scaling
+ -I[ ]italic_angle
+ -G[ ]zero_or_one
+ -B[ ]character_code
+where [ ] optional space; case of parameter names is meaningless;
+a slash can be used instead of dash.
+
+(There is also A2TQX.BAT, meant for Polish users, equivalent
+to `A2T.BAT -Ll.qx -Ee.qx'. See CTAN:fonts/plsfonts/polish/qfonts/
+for the explanation of the proposed encoding.)
+
+The meaning of the parameters is as follows:
+
+-L the parameter specifies a name of a file in which a set of
+ TeX-oriented ligatures is defined; the file should begin with
+ the line containing the following header (leading blanks
+ are unimportant)
+ OPTIONAL LIGATURES FOR TOIL
+ and then triples of PostScript names should appear, e.g.,
+ f f ff
+ In this case, the meaning of the triple is: ``two letters f should
+ ligature to a single ff symbol.''
+
+-E The parameter specifies a name of a file in which a TeX layout
+ of the font is defined (it is not necessarily the built-in encoding
+ of the Type 1 font being installed); the file should begin with
+ the line containing the following header (leading blanks
+ are unimportant)
+ EXTERNAL ENCODING FOR TOIL
+ next line is considered as a TFM comment ``coding scheme,'' and then
+ space-separated pairs code--PostScript_name should appear.
+
+ If this parameter is not supplied, a font-specific (AFM) encoding
+ is used and encoding file is not created.
+
+ REMARK: There is a nasty ambiguity in the naming convention:
+ the Polish diacritical characters `zdotaccent' and `Zdotaccent'
+ are sometimes called `zdot' and `Zdot'. We have followed the general
+ Adobe's naming convention that the names of diacritical characters
+ are formed by concatenating the name of a character and the name
+ of the accent, e.g., `eacute' = `e' + `acute'; since there exists
+ a glyph called `dotaccent,' we consider proper the names `zdotaccent'
+ and `Zdotaccent'.
+
+-M The pivot step of the installing procedure is the conversion of an AFM
+ file to a temporary METAPOST file. By default, the METAPOST file,
+ and thus the resulting TFM file, inherits the name from the font.
+ The parameter `M' overrides the default.
+
+-N By default, the encoding file name is equal to the METAPOST file name.
+ If a family of files is being installed, however, it does not make
+ too much sense to provide a separate encoding file for every
+ member of the family. The parameter `N' enables to override
+ the default.
+
+-X The font being installed can be scaled horizontally on-the-fly.
+ The parameter `X' determines the coefficient of the horizontal scaling.
+ Obviously, the original Type 1 font remains intact, the scaling
+ coefficient has an influence on the TFM file and the information
+ to be contained in the PSFONTS.MAP file. Extensive usage of this
+ parameter, however, should be discouraged, because the affine
+ transformation of the font usually is hardly acceptable from
+ a typographer's point of view.
+
+-I The font being installed can also be slanted on-the-fly. The parameter
+ `I' determines the angle of the slant. Remarks concerning horizontal
+ scaling of the font fit also here.
+
+-G This parameter determines whether the PSFONTS.MAP file should
+ be created (value 0) or modified (value 1). More precisely, if
+ the option `-G0' is set and a PSFONTS.MAP file is not found in either
+ a current or a target directory, a new PSFONTS.MAP file is created
+ and placed in the target directory; if the option `-G1' is set
+ or a PSFONTS.MAP file is found in either a current or a target directory,
+ the file is moved, if necessary, to the target directory and
+ the appropriate information about the font is appended to it.
+ The target directory for PSFONTS.MAP and the default value for
+ the parameter `-G' is specified in the config file, TOIL.CFG.
+
+-B A character of a given code (its slot must be empty) along with a set
+ of kern pairs are included into font; the implict kerns cause
+ the neutralization of side bars for all characters in a font.
+
+The batch file sets a system environment variable TOILPATH which specifies
+the directories that should be searched for components of the TOIL package.
+One of such components is the config file, TOIL.CFG, which specifies several
+TOIL defaults. Obviously, setting the environment variable can be
+done outside A2T.BAT, e.g., in AUTOEXEC.BAT.
+
+REMARKS CONCERNING CONFIGURATION:
+
+The script TOILA.AWK (function `fix_const') defines the programs
+employed by the TOIL package:
+
+ MF_CALL="mpost &mfplain"
+ AWK_CALL="gawk"
+
+Obviously, these variables can be changed appropriately if needed.
+In particular, METAFONT can be used instead of METAFONT.
+
+The default version of the TOIL package works with DOS.
+In order to adapt it to a non-English Win95/98 some
+extra adjustments may turn out necessary. For example,
+the Polish version of Win95/98 requires a re-definition
+of the function `sys_copy' in the file TOILA.AWK; namely,
+instead of
+ function sys_copy(i, o) {return "echo F|xcopy " i " " o ">" TMP_TMP}
+one should use
+ function sys_copy(i, o) {return "echo P|xcopy " i " " o ">" TMP_TMP}
+
+We think about the compliance of the TOIL package with Web2c distribution...
+
+=======================================================================
+
+HISTORY:
+ 1.05.1997 -- ver. 1.00
+ first public presentation (at GUST's BachoTeX'97 meeting)
+ 6.05.1997 -- ver. 1.01
+ post-BachoTeX'97 release
+ 7.01.1998 -- ver. 1.03
+ a few bugs fixed, Polish documentation added,
+ config variables TMP_NAME, MF_CALL, and AWK_CALL
+ moved to the system-dependent function fix_const()
+ in toila.awk
+ 27.01.1999 -- ver. 1.04
+ option MATHEMATIZE available from CFG file
+ (by default absent from TOIL.CFG; default value 1);
+ command line option `B<character code>' introduced
+ for compensating for sidebars via kerning
+ mechanism
+ 26.IV.1999 -- ver. 1.05
+ condition ,if exist' added in ,sys_copy' (Win95/98),
+ changes in the documentation and defauls;
+ BachoTeX 1999 release
+ 28.IV.2003 -- ver. 1.06
+ unpublished (more exactly: publishing postponed);
+ adaptation to all genres od Windows
+15.XII.2004 -- ver. 1.07
+ METAFONT replaced by METAPOST
+
+=======================================================================
+END OF `0TOILENG.INF'
+
diff --git a/fonts/utilities/t1install/toil/0toileng.lic b/fonts/utilities/t1install/toil/0toileng.lic
new file mode 100644
index 0000000000..7fa81a87a3
--- /dev/null
+++ b/fonts/utilities/t1install/toil/0toileng.lic
@@ -0,0 +1,51 @@
+ This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL
+ This package is public domain | Pakiet stanowi dobro powszechne
+========================================================================
+ This is a configurable Type One Install utiLity (TOIL)
+
+TOIL package consists of:
+
+0TOILENG.INF -- English info file
+0TOILENG.LIC -- English license (This file)
+0TOILPOL.LIC -- Polish license
+A2T.BAT -- Main system script file
+A2TQX.BAT -- Additional script file (predefines QX encoding and ligatures)
+TOIL.CFG -- Config file
+TOILA.AWK -- Governing AWK program
+TOILB.AWK -- AFM-to-MF AWK program
+TOILC.AWK -- Post-MF AWK program
+TOIL.MF1 -- Component 1 of the METAFONT/METAPOST template
+TOIL.MF2 -- Component 2 of the METAFONT/METAPOST template
+TOIL.MF3 -- Component 3 of the METAFONT/METAPOST template
+E.PL -- PL encoding file (included for compatibility)
+E.QX -- QX encoding file
+L.QX -- QX ligature scheme
+ (see http://www.gust.org.pl/fonty/qx-einfo.html)
+
+=======================================================================
+
+AUTHORS: Bogu\l{}aw Jackowski, Piotr Pianowski, Piotr Strzelczyk
+Mail: BOP s.c., ul. Bora-Komorowskiego, 80-377 Gda\'nsk, Poland
+Email: b_jackowski@gust.org.pl
+
+=======================================================================
+
+All copyrights, copylefts, copyups, copydowns, or whatever you wish to call
+them, concerning all the files in the TOIL package are essentially of the
+public domain character.
+
+This package is distributed in the hope that it will be useful, but without
+any warranty. Although the authors have attempted to find and correct any
+bugs in the package, they are not responsible for any damage or losses of any
+kind caused by the use or misuse of the package. The authors are under no
+obligation to provide service, corrections, or upgrades to this package.
+
+If you alter a file or if you distribute incomplete package,
+please remove the lines containing the comment:
+
+ `This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL'
+
+in order to avoid mess.
+
+=======================================================================
+END OF `0TOILENG.LIC'
diff --git a/fonts/utilities/t1install/toil/0toilpol.inf b/fonts/utilities/t1install/toil/0toilpol.inf
new file mode 100644
index 0000000000..be3a509a0e
--- /dev/null
+++ b/fonts/utilities/t1install/toil/0toilpol.inf
@@ -0,0 +1,228 @@
+This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL
+This package is public domain | Pakiet stanowi dobro powszechne
+For more info see `0TOILENG.LIC' | Wi/ecej informacji w ,,0TOILPOL.LIC''
+============================================================================
+
+Na spotkaniu w Bachotku wiosn/a 1997 roku zosta/l udost/epniony pakiet TOIL
+przeznaczony do instalowania font/ow PostScript-owych dla potrzeb sk/ladu
+TeX-owego.
+
+G/l/owna idea pakietu, wykorzystuj/acego program AWK oraz METAPOST (lub
+METAFONT; p. punkt ``UWAGI O KONFIGURACJI'' poni/zej), polega na tym, /zeby
+z pliku AFM utworzy/c plik /xr/od/lowy dla METAPOST-a, kt/ory zawiera/lby
+informacj/e metryczn/a, czyli rozmiary znak/ow, pary kernowe, ligatury oraz
+korekty kursywy (kszta/lty znak/ow s/a na tym etapie nieistotne). Po
+przetworzeniu pliku wynikowego METAPOST-em uzyskujemy plik *.tfm, niezb/edny
+do sk/ladania dokument/ow TeX-em. Opr/ocz pliku *.tfm tworzone s/a r/ownie/z
+dodatkowe pliki dla sterownika DVIPS, mianowicie psfonts.map, oraz plik
+zawieraj/acy informacj/e o aktualnym uk/ladzie znak/ow, tzw. plik kodowania
+(encoding file).
+
+Podobne funkcje pe/lni program AFM2TFM, nale/z/acy do pakietu dystrybucyjnego
+sterownika DVIPS. Program ten umie nawet wi/ecej, bo obs/luguje --
+w odr/o/znieniu od TOIL-a -- fonty wirtualne. Po co wi/ec tworzy/c nowe,
+ubo/zsze narz/edzie? Dwa grzyby w barszcz?
+
+Tak bardzo ubo/zszy od programu AFM2TFM to pakiet TOIL nie jest -- ma przede
+wszystkim spore mo/zliwo/sci konfigurowania, i to jest jego mocny punkt.
+A poza tym z font/ow wirtualnych, jak pokazuje praktyka, korzystaj/a
+g/l/ownie wirtuozi...
+
+Plik konfiguracyjny pakietu TOIL okre/sla, gdzie i jakie pliki wej/sciowe
+maj/a by/c poszukiwane oraz gdzie i jakie pliki wynikowe maj/a si/e
+znale/x/c. Ponadto pozwala na wygodne -- zdaniem autor/ow -- definiowanie
+w/lasnych uk/lad/ow znak/ow i w/lasnych zestaw/ow ligatur. Je/sli
+uwzgl/edni/c jeszcze, /ze u/zytkownik ma do dyspozycji r/o/zne ,,gwizdki
+i dzwonki'', na przyk/lad mo/zliwo/s/c zignorowania pojawiaj/acych si/e
+w niekt/orych fontach kern/ow mi/edzy cyframi, to my/sl/e, /ze czytelnik si/e
+zgodzi, i/z dwa grzyby w barszcz to w tym wypadku niekoniecznie za du/zo.
+
+Po zainstalowaniu pakietu korzystanie ze/n jest bardzo proste. Plik wsadowy
+o nazwie a2t.bat robi co trzeba, to znaczy tworzy plik *.tfm, psfonts.map
+oraz je/sli trzeba plik kodowania *.enc. Polecenie systemowe ma
+nast/epuj/ac/a posta/c:
+
+ A2T _nazwa_fontu_ [_parametry_dodatkowe_]
+
+Parametr _nazwa_fontu_ oznacza tu dyskow/a nazw/e (w odr/o/znieniu od
+PostScript-owej). Podkre/sli/c nale/zy, /ze to, gdzie szuka/c danego fontu,
+zapisane jest w pliku konfiguracyjnym toil.cfg pakietu TOIL i /ze font mo/ze
+by/c mozolnie (po angielsku ,,toil'' to tyle co ,,moz/o/l'') poszukiwany
+w rozmaitych podejrzanych o zawieranie go kartotekach. Mo/ze wydawa/c si/e
+dziwne, /ze kto/s mo/ze nie wiedzie/c, gdzie jaki font si/e znajduje, ale
+za/l/o/zmy, /ze mamy fonty spolonizowane przez firm/e ThETA (kilkaset font/ow
+na trzech p/lytach CD) plus fonty TeX-owe (CM, PL, EC, Euler), fonty firmy
+URW dystrybuowane wraz z Ghostscriptem, fonty dostarczane z niekt/orymi
+sterownikami, fonty z polskiej wersji popularnego programu ColrelDRAW!, itp.,
+itd., i za/l/o/zmy, /ze w ramach unikania ba/laganu przygotowujemy specjaln/a
+struktur/e kartotek i tam starannie w osobnych kartotekach uk/ladamy
+poszczeg/olne fonty... /Latwo sobie wyobrazi/c, /ze ju/z po paru miesi/acach
+przestanie by/c oczywiste, gdzie kt/orego fontu poszukiwa/c. Ma wi/ec sens
+zapisanie kartotek fontowych raz na zawsze (no, mo/ze raz na jaki/s czas)
+w pliku konfiguracyjnym.
+
+Opcjonalne _parametry_dodatkowe_ maj/a posta/c:
+
+ -L[] _nazwa_pliku_definiuj/acego_ligatury_
+ -E[] _nazwa_pliku_definiuj/acego_kodowanie_
+ -M[] _nazwa_(tymczasowego)_pliku_METAPOST-owego_
+ -N[] _nazwa_pliku_kodowania_dla_sterownika_DVIPS_
+ -X[] _przeskalowanie_poziome_fontu_
+ -I[] _dodatkowe_pochylenie_fontu_
+ -G[] _0 lub 1_
+ -B[] _kod znaku_
+
+(Spacja w nawiasach kwadratowych oznacza opcjonalny odst/ep,
+du/ze i ma/le litery s/a uto/zsamiane.)
+
+Ni/zej om/owione jest pokr/otce znaczenie poszczeg/olnych parametr/ow:
+
+-L Parametr ten okre/sla nazw/e pliku zawiaraj/acego informacje
+ o ligaturach; plik powinen mie/c w pierwszym wierszu nast/epuj/acy
+ nag/l/owek (spacje na pocz/atku wiersza s/a ignorowane):
+ OPTIONAL LIGATURES FOR TOIL
+ Dalsze wiersze zawieraj/a tr/ojki nazw PostScript-owych, np.:
+ f f ff
+ W tym wypadku oznacza to, /ze dwie litery f powinny
+ zosta/c zast/apione pojedynczym symbolem o nazwie ff
+
+-E Parametr ten okre/sla nazw/e pliku definiuj/acego uk/lad znak/ow dla
+ TeX-a (niekoniecznie jest to uk/lad zgodny z uk/ladem wbudowanym
+ w font PostScriptowy); plik powinen mie/c w pierwszym wierszu
+ nast/epuj/acy nag/l/owek (spacje na pocz/atku wiersza s/a ignorowane):
+ EXTERNAL ENCODING FOR TOIL
+ nast/epny wiersz jest traktowany jako komentarz dla pliku TFM,
+ a dalsze wiersze zawieraj/a pary kod-nazwa (oddzielone odst/epem), np.
+ 155 Zdotaccent
+ Je/sli parametr ten nie zostanie podany, u/zywany jest uk/lad znak/ow
+ wyst/epuj/acy w pliku AFM.
+
+ UWAGA: Jest pewien k/lopot z nazewnictwem polskich znak/ow diakrytycznych,
+ mianowicie niekt/orzy tw/orcy font/ow stosuj/a nazw/e ,,zdotaccent''
+ i ,,Zdotaccent'', a niekt/orzy ,,zdot'' i ,,Zdot''. Wyrocznia,
+ tj. firma Adobe, tworzy nazwy znak/ow diakrytycznych przez konkatenacj/e
+ nazwy znaku i nazwy akcentu, np. ,,eacute'' = ,,e'' + ,,acute''.
+ Poniewa/z istnieje akcent o nazwie ,,dotaccent'', za prawid/low/a
+ nale/za/loby uzna/c nazw/e ,,zdotaccent'' oraz ,,Zdotaccent''.
+
+-M Podstawowym krokiem jest ,,przet/lumaczenie'' pliku AFM na tymczasowey
+ plik METAPOST-owy. Domy/slnie plik ten, a zatem i wynikowy plik TFM,
+ dziedziczy nazw/e dyskow/a fontu. Parametr ,,M'' pozwala to zmieni/c.
+
+-N Domy/slnie nazwa pliku kodowania jest taka sama jak nazwa pliku
+ METAPOST-owego. W wypadku instalowania rodziny font/ow zawieraj/acych
+ te same zestawy znak/ow rozs/adnie jest utworzy/c jeden plik kodowania
+ dla ca/lej rodziny. Parametr ,,N'' pozwala na specyfikacj/e nazwy pliku
+ kodowania.
+
+-X Instalowany font mo/zna przeskalowa/c w poziomie -- parametr ,,X''
+ okre/sla wsp/o/lczynnik przeskalowania. Oczywi/scie oryginalny font
+ PostScript-owy nie ulega zmianie, przeskalowanie jest uwzgl/ednione
+ jedynie w pliku TFM i w informacji zawartej w pliku PSFONTS.MAP.
+ Zbyt /smia/le u/zywanie tego parametru nie jest zalecane, bowiem
+ deformacje afiniczne daj/a niezadawalaj/ace efekty z punku widzenia
+ profesjonalnej typografii.
+
+-I Instalowany font mo/zna tak/ze pochyli/c -- parametr ,,I'' okre/sla
+ wielko/s/c k/ata pochylenia (w stopniach). Uwagi o zbyt /smia/lym
+ przeskalowywaniu poziomym dotycz/a r/ownie/z pochylania.
+
+-G Warto/sci/a tego parametru mo/ze by/c 0 lub 1; okre/sla on czy
+ utworzy/c lokalnie nowy plik psfonts.map (warto/s/c 0),
+ czy te/z skorzysta/c z istniej/acego ju/z, globalnego (st/ad G)
+ pliku psfonts.map (warto/s/c 1), wskazywanego przez zmienn/a
+ systemow/a TEXCONFIG.
+
+-B Do/l/aczany jest znak o podanym kodzie (o ile w foncie jest wolne miejsce)
+ wraz z zestawem kern/ow umo/zliwiaj/acych neutralizacj/e odsadek
+ wszystkich znak/ow obecnych w foncie.
+
+Je/zeli chodzi o polskie znaki diakrytyczne, to trudno si/e spodziewa/c,
+/zeby w og/olno/sci w fontach PostScript-owych mia/ly one przypisane kody
+zgodne z wymaganiami pakiet/ow TeX-owych, czyli uk/lad zgodny z uk/ladem
+font/ow PL czy EC. Raczej b/ed/a to uk/lady znak/ow z punktu widzenia TeX-a
+egzotyczne, takie jak np. CP-1250.
+
+Aby po/zeni/c ogie/n z wod/a, czyli TeX-a ze /swiatem windowsowym, po
+licznych, trwaj/acych /ladnych par/e lat debatach, wypracowany zosta/l
+tzw. ,,uk/lad QX'' okre/slaj/acy zestaw znak/ow oraz kody znak/ow dla potrzeb
+zastosowa/n windowsowych i TeX-owych. Oczywi/scie kody polskich znak/ow
+w uk/ladzie QX do zastosowa/n TeX-owych s/a zgodne z uk/ladem font/ow PL,
+czyli s/a przystosowane do wykorzystania od r/eki w MeX-u.
+
+Szczeg/o/lowe informacje na temat uk/ladu QX mo/zna znale/x/c w archiwum
+GUST lub CTAN:
+ fonts/plsfonts/polish/qfonts/
+
+Wraz z pakietem TOIL dystrybuowany jest plik E.QX zawieraj/acy informacj/e
+niezb/edn/a dla wygenerowania pliku *.tfm z polskimi znakami w uk/ladzie QX.
+W pewnym sensie uzupe/lnieniem pliku E.QX jest plik L.QX zawieraj/acy
+definicje stosownych ligatur dla uk/ladu QX. Aby zainstalowa/c font
+zawieraj/acy polskie znaki diakrytyczne, np. udost/epniony r/ownie/z na
+spotkaniu w Bachotku wiosn/a 1997 roku font PostScript-owy Quasi-Palladio,
+nale/za/loby u/zy/c polecenia systemowego:
+
+ A2T _nazwa_fontu_ -L L.QX -E E.QX
+
+(W istocie Quasi-Palladio jest dystrybuowany wraz ze wszystkimi ,,dodatkami''
+niezb/ednymi dla wykorzystania tego fontu w sk/ladzie TeX-owym.)
+
+Ze wzgl/edu na domniemanie, i/z powy/zsze polecenie b/edzie do/s/c cz/esto
+wykorzystywane, pakiet TOIL zawiera plik wsadowy a2tqx.bat, realizuj/acy
+powy/zsze polecenie.
+
+UWAGI O KONFIGURACJI:
+
+Skrypt TOILA.AWK (funkcja fix_const) zawiera zmienne definiuj/ace programy,
+z kt/orych pakiet TOIL korzysta:
+
+ MF_CALL="mpost &mfplain"
+ AWK_CALL="gawk"
+
+W razie potrzeby warto/sci tych zmiennych mo/zna dostosowa/c do
+konkretnego /srodowiska. W szczeg/olno/sci mo/zna skorzysta/c
+z METAFONT-a zamiast z METAPOST-a.
+
+W wersji domy/slnej pakiet TOIL dzia/la pod systemem MS-DOS.
+Aby pakiet poprawnie dzia/la/l w /srodowisku polskiej wersji
+Win95 nale/zy w pliku TOILA.AWK definicj/e
+ function sys_copy(i, o) {return "echo F|xcopy " i " " o ">" TMP_TMP}
+zast/api/c definicj/a
+ function sys_copy(i, o) {return "echo P|xcopy " i " " o ">" TMP_TMP}
+
+Trwaj/a pr/oby przeniesienia pakietu na inne platformy, na kt/orych
+istniej/a implementacje AWK-a i METAPOST-a (Linux, Windows NT, OS/2);
+dobrze by/loby doprowadzi/c do zgodno/sci z dystrybucj/a Web2c...
+
+=======================================================================
+
+HISTORIA:
+ 1.05.1997 -- wer. 1.00
+ pierwsza publiczna prezentacja na spotkanie GUST-u
+ podczas spotkania ,,BachoTeX'97''
+ 6.05.1997 -- wer. 1.01
+ edycja uwzgl/edniaj/aca uwagi zebrane podczas
+ spotkania ,,BachoTeX'97''
+ 7.01.1998 -- wer. 1.03
+ kilka b/l/ed/ow poprawionych, polska dokumentacja dodana,
+ zmienne konfiguracyjne TMP_NAME, MF_CALL, and AWK_CALL
+ przesuni/ete do pliku toila.awk (funkcja fix_const())
+ 27.01.1999 -- wer. 1.04
+ opcja MATHEMATIZE dost/epna z pliku CFG (domy/slnie
+ nie wyst/epuje w pliku CFG; domy/slna warto/s/c 1);
+ wprowadzony parametr ,B<kod znaku>', powoduj/acy
+ dodanie znaku o zadanym kodzie i zestawu kern/ow,
+ pozwalaj/acych na neutralizacj/e odsadek
+ 26.IV.1999 -- wer. 1.05
+ klauzula ,if exist' dodana w ,sys_copy' (Win95/98),
+ zmiany dokumentacji i niekt/orych ustawie/n domy/slnych,
+ wersja przygotowana na BachoTeX 1999
+ 28.IV.2003 -- ver. 1.06
+ nieudost/epniona (na razie); adaptacja do system/ow
+ Windows r/o/znej ma/sci
+15.XII.2004 -- ver. 1.07
+ METAFONT zast/apiony METAPOST-em
+
+=======================================================================
+KONIEC ,,0TOILPOL.INF''
+
diff --git a/fonts/utilities/t1install/toil/0toilpol.lic b/fonts/utilities/t1install/toil/0toilpol.lic
new file mode 100644
index 0000000000..9ec74fa603
--- /dev/null
+++ b/fonts/utilities/t1install/toil/0toilpol.lic
@@ -0,0 +1,55 @@
+ This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL
+ This package is public domain | Pakiet stanowi dobro powszechne
+========================================================================
+ Jest to konfigurowalne narz/edzie do instalowania
+ font/ow PostScript-owych w formacie Adobe Type 1
+ (Type One Install utiLity -- TOIL)
+
+Pakiet TOIL sk/lada si/e z:
+
+0TOILENG.INF -- Plik informacyjny w j/ezyku angielskim
+0TOILENG.LIC -- Licencja w j/ezyku angielskim
+0TOILPOL.LIC -- Licencja w j/ezyku polskim (niniejszy plik)
+A2T.BAT -- G/l/owny skrypt wsadowy pakietu TOIL
+A2TQX.BAT -- Skrypt wsadowy (domy/slny uk/lad znak/ow QX oraz ligatury)
+TOIL.CFG -- Plik konfiguracyjny
+TOILA.AWK -- Zarz/adzaj/acy program AWK-owy
+TOILB.AWK -- Program AWK-owy dokonuj/acy konwersji AFM-MF
+TOILC.AWK -- Program AWK-owy analizuj/acy efekt pracy METAFONT-a/METAPOST-a
+TOIL.MF1 -- Element 1 programu METAFONT-owego
+TOIL.MF2 -- Element 2 programu METAFONT-owego
+TOIL.MF3 -- Element 3 programu METAFONT-owego
+E.PL -- definicja uk/ladu znak/ow PL (dodana dla kompatybilno/sci)
+E.QX -- definicja uk/ladu znak/ow QX
+L.QX -- definicja ligatur dla uk/ladu QX
+ (p. http://www.gust.org.pl/fonty/qx-info.html)
+
+=======================================================================
+
+AUTORZY: Bogus/law Jackowski, Piotr Pianowski, Piotr Strzelczyk
+Adres: BOP s.c., ul. Bora-Komorowskiego, 80-377 Gda\'nsk, Poland
+Email: b_jackowski@gust.org.pl
+
+=======================================================================
+
+Wszystkie prawa, lewa, g/ory, do/ly autorskie, czy jak tam to zwa/c,
+dotycz/ace wszystkich plik/ow wchodz/acych w sk/lad pakietu TOIL,
+maj/a charakter dobra publicznego.
+
+Rozpowszechniaj/ac ten pakiet mamy nadziej/e, /ze oka/ze si/e on przydatny,
+nie dajemy jednak na niego /zadnej gwarancji. Starali/smy si/e znale/x/c
+i usun/a/c z pakietu wszystkie b/l/edy, ale nie ponosimy /zadnej
+odpowiedzialno/sci za uszkodzenia b/ad/x straty wywo/lane jego w/la/sciwym
+lub niew/la/sciwym u/zyciem. Jednocze/snie zaznaczamy, /ze o ile b/edziemy
+starali si/e piel/egnowa/c pakiet, o tyle nie nie podejmujemy /zadnych
+zobowi/aza/n w tej mierze.
+
+Je/zeli plik zosta/l zmodyfikowany lub rozpowszechniana jest tylko cz/e/s/c
+pakietu, prosimy o usuni/ecie linii zawieraj/acych komentarz:
+
+ ,,This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL''
+
+w celu unikni/ecia ba/laganu.
+
+=======================================================================
+KONIEC ,,0TOILPOL.LIC''
diff --git a/fonts/utilities/t1install/toil/a2t.bat b/fonts/utilities/t1install/toil/a2t.bat
new file mode 100644
index 0000000000..22bf135ad4
--- /dev/null
+++ b/fonts/utilities/t1install/toil/a2t.bat
@@ -0,0 +1,85 @@
+::This file belongs to the TOIL package |Ten plik nale/zy do pakietu TOIL
+::This package is public domain |Pakiet stanowi dobro powszechne
+::For more info see `0TOILENG.LIC' |Wi/ecej informacji w ,,0TOILPOL.LIC''
+::============================================================================
+@echo off
+if "%1"=="" goto USAGE
+set TOILPATH=.;..!;c:/toil
+::
+echo %1>> _clp_.tmp
+:: room for default parameters
+shift
+if "%1"=="" goto ENDLOOP
+:LOOP
+echo %1>> _clp_.tmp
+shift
+if "%1"=="" goto ENDLOOP
+goto LOOP
+:ENDLOOP
+::
+gawk -ftoila.awk -vCLP=_clp_.tmp
+if errorlevel==1 goto HALT1
+:: toiltmp1.bat: gawk -ftoilb.awk
+:: generates %1.mf
+call toiltmp1.bat
+if errorlevel==1 goto HALT2
+:: toiltmp2.bat: mf386 &plain APPROPRIATE_OPTIONS MF_FILE
+call toiltmp2.bat
+if errorlevel==1 goto HALT3
+:: toiltmp3.bat: gawk -ftoilc.awk MF_FILE.LOG
+:: extracts information from MF_FILE.LOG
+call toiltmp3.bat
+if errorlevel==1 goto HALT4
+goto END0
+::
+:: ERROR MESSAGES:
+:HALT1
+echo ! STAGE 1: something went wrong.
+goto END0
+:HALT2
+echo ! STAGE 2: something went wrong.
+goto END0
+:HALT3
+echo ! STAGE 3: something went wrong (see METAFONT's LOG file).
+goto END1
+:HALT4
+echo ! STAGE 4: something went wrong.
+goto END0
+:: END OF ERROR MESSAGES
+::
+:USAGE
+echo USAGE:
+echo A2T font_name [additional_parameters]
+echo Additional parameters can have the following form:
+echo -L[ ]external_ligature_file_name
+echo -E[ ]external_encoding_file_name
+echo -M[ ]METAFONT_file_name
+echo -N[ ]resulting_encoding_file_name
+echo -X[ ]x_scaling
+echo -I[ ]italic_angle
+echo -G[ ]zero_or_one
+echo where [ ] optional space; for details see file 0TOILENG.INF.
+echo WYWO/LANIE:
+echo A2T nazwa_fontu [parametry_dodatkowe]
+echo Parametry dodatkowe mog/a mie/c nast/epuj/ac/a posta/c:
+echo -L[ ]nazwa_pliku_definiuj/acego_ligatury
+echo -E[ ]nazwa_pliku_definiuj/acego_uk/lad_znak/ow
+echo -M[ ]nazwa_tymczasowego_pliku_METAFONTowego
+echo -N[ ]nazwa_wynikowego_pliku_z_uk/ladem_znak/ow
+echo -X[ ]wsp/o/lczynnik_przeskalowania_poziomego_fontu
+echo -I[ ]k/at_pochylenia_fontu
+echo -G[ ]zero_lub_jeden
+echo gdzie [ ] oznacza opcjonalny odst/ep; szczeg/o/ly -- p. 0TOILENG.INF;
+echo do instalowania font/ow z polskimi znakami zalecane jest u/zycie A2TQX.BAT.
+:END0
+:: toiltmp4.bat: clean MF and LOG files, if required and if MF-ing was OK
+if exist toiltmp4.bat call toiltmp4.bat
+:END1
+:: toiltmp5.bat: completing clean-up
+if exist _clp_.tmp del _clp_.tmp
+if exist toiltmp5.bat call toiltmp5.bat
+if exist toiltmp1.bat del toiltmp1.bat
+if exist toiltmp2.bat del toiltmp2.bat
+if exist toiltmp3.bat del toiltmp3.bat
+if exist toiltmp4.bat del toiltmp4.bat
+if exist toiltmp5.bat del toiltmp5.bat
diff --git a/fonts/utilities/t1install/toil/a2tqx.bat b/fonts/utilities/t1install/toil/a2tqx.bat
new file mode 100644
index 0000000000..43f8abc87c
--- /dev/null
+++ b/fonts/utilities/t1install/toil/a2tqx.bat
@@ -0,0 +1,85 @@
+::This file belongs to the TOIL package |Ten plik nale/zy do pakietu TOIL
+::This package is public domain |Pakiet stanowi dobro powszechne
+::For more info see `0TOILENG.LIC' |Wi/ecej informacji w ,,0TOILPOL.LIC''
+::============================================================================
+@echo off
+if "%1"=="" goto USAGE
+set TOILPATH=.;..!;c:/toil
+::
+echo %1>> _clp_.tmp
+echo -ee.qx>> _clp_.tmp
+echo -ll.qx>> _clp_.tmp
+shift
+if "%1"=="" goto ENDLOOP
+:LOOP
+echo %1>> _clp_.tmp
+shift
+if "%1"=="" goto ENDLOOP
+goto LOOP
+:ENDLOOP
+::
+gawk -ftoila.awk -vCLP=_clp_.tmp
+if errorlevel==1 goto HALT1
+:: toiltmp1.bat: gawk -ftoilb.awk
+:: generates %1.mf
+call toiltmp1.bat
+if errorlevel==1 goto HALT2
+:: toiltmp2.bat: mf386 &plain APPROPRIATE_OPTIONS MF_FILE
+call toiltmp2.bat
+if errorlevel==1 goto HALT3
+:: toiltmp3.bat: gawk -ftoilc.awk MF_FILE.LOG
+call toiltmp3.bat
+if errorlevel==1 goto HALT4
+goto END0
+::
+:: ERROR MESSAGES:
+:HALT1
+echo ! STAGE 1: something went wrong.
+goto END0
+:HALT2
+echo ! STAGE 2: something went wrong.
+goto END0
+:HALT3
+echo ! STAGE 3: something went wrong (see METAFONT's LOG file).
+goto END1
+:HALT4
+echo ! STAGE 4: something went wrong.
+goto END0
+:: END OF ERROR MESSAGES
+::
+:USAGE
+echo WYWO/LANIE:
+echo A2TQX nazwa_fontu [parametry_dodatkowe]
+echo Parametry dodatkowe mog/a mie/c nast/epuj/ac/a posta/c:
+echo -L[ ]nazwa_pliku_definiuj/acego_ligatury
+echo -E[ ]nazwa_pliku_definiuj/acego_uk/lad_znak/ow
+echo -M[ ]nazwa_tymczasowego_pliku_METAFONTowego
+echo -N[ ]nazwa_wynikowego_pliku_z_uk/ladem_znak/ow
+echo -X[ ]wsp/o/lczynnik_przeskalowania_poziomego_fontu
+echo -I[ ]k/at_pochylenia_fontu
+echo -G[ ]zero_lub_jeden
+echo gdzie [ ] oznacza opcjonalny odst/ep; szczeg/o/ly -- p. 0TOILENG.INF.
+echo `A2TQX.BAT nazwa_fontu' jest r/ownowa/zne `A2T nazwa_fontu -Ee.qx -Ll.qx'.
+echo USAGE:
+echo A2TQX font_name [additional_parameters]
+echo The batch is meant for Polish users; parameters can have the following form:
+echo -L[ ]external_ligature_file_name
+echo -E[ ]external_encoding_file_name
+echo -M[ ]METAFONT_file_name
+echo -N[ ]resulting_encoding_file_name
+echo -X[ ]x_scaling
+echo -I[ ]italic_angle
+echo -G[ ]zero_or_one
+echo where [ ] optional space; for details see file 0TOILENG.INF.
+:END0
+:: toiltmp4.bat: clean MF and LOG files, if required and if MF-ing was OK
+if exist toiltmp4.bat call toiltmp4.bat
+:END1
+:: toiltmp5.bat: completing clean-up
+if exist _clp_.tmp del _clp_.tmp
+if exist toiltmp5.bat call toiltmp5.bat
+if exist toiltmp1.bat del toiltmp1.bat
+if exist toiltmp2.bat del toiltmp2.bat
+if exist toiltmp3.bat del toiltmp3.bat
+if exist toiltmp4.bat del toiltmp4.bat
+if exist toiltmp5.bat del toiltmp5.bat
diff --git a/fonts/utilities/t1install/toil/e.pl b/fonts/utilities/t1install/toil/e.pl
new file mode 100644
index 0000000000..b66970986a
--- /dev/null
+++ b/fonts/utilities/t1install/toil/e.pl
@@ -0,0 +1,263 @@
+EXTERNAL ENCODING FOR TOIL % the header
+PL-like % TFM info
+%============================================================================
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+ 0 Gamma
+ 1 Delta
+ 2 Theta
+ 3 Lambda
+ 4 Xi
+ 5 Pi
+ 6 Sigma
+ 7 Upsilon
+ 8 Phi
+ 9 Psi
+ 10 Omega
+ 11 ff
+ 12 fi
+ 13 fl
+ 14 ffi
+ 15 ffl
+ 16 dotlessi
+ 17 dotlessj
+ 18 grave
+ 19 acute
+ 20 caron
+ 21 breve
+ 22 macron
+ 23 ring
+ 24 cedilla
+ 25 germandbls
+ 26 ae
+ 27 oe
+ 28 oslash
+ 29 AE
+ 30 OE
+ 31 Oslash
+ 32 ogonek
+ 33 exclam
+ 34 quotedblright
+ 35 numbersign
+ 36 dollar
+ 37 percent
+ 38 ampersand
+ 39 quoteright
+ 40 parenleft
+ 41 parenright
+ 42 asterisk
+ 43 plus
+ 44 comma
+ 45 hyphen
+ 46 period
+ 47 slash
+ 48 zero
+ 49 one
+ 50 two
+ 51 three
+ 52 four
+ 53 five
+ 54 six
+ 55 seven
+ 56 eight
+ 57 nine
+ 58 colon
+ 59 semicolon
+ 60 exclamdown
+ 61 equal
+ 62 questiondown
+ 63 question
+ 64 at
+ 65 A
+ 66 B
+ 67 C
+ 68 D
+ 69 E
+ 70 F
+ 71 G
+ 72 H
+ 73 I
+ 74 J
+ 75 K
+ 76 L
+ 77 M
+ 78 N
+ 79 O
+ 80 P
+ 81 Q
+ 82 R
+ 83 S
+ 84 T
+ 85 U
+ 86 V
+ 87 W
+ 88 X
+ 89 Y
+ 90 Z
+ 91 bracketleft
+ 92 quotedblleft
+ 93 bracketright
+ 94 circumflex
+ 95 dotaccent
+ 96 quoteleft
+ 97 a
+ 98 b
+ 99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 endash
+124 emdash
+125 hungarumlaut
+126 tilde
+127 dieresis
+128 @
+129 Aogonek
+130 Cacute
+131 @
+132 @
+133 @
+134 Eogonek
+135 @
+136 @
+137 @
+138 Lslash
+139 Nacute
+140 @
+141 @
+142 @
+143 @
+144 @
+145 Sacute
+146 @
+147 @
+148 @
+149 @
+150 @
+151 @
+152 @
+153 Zacute
+154 @
+155 Zdotaccent
+156 @
+157 @
+158 @
+159 @
+160 @
+161 aogonek
+162 cacute
+163 @
+164 @
+165 @
+166 eogonek
+167 @
+168 @
+169 @
+170 lslash
+171 nacute
+172 @
+173 @
+174 guillemotleft
+175 guillemotright
+176 @
+177 sacute
+178 @
+179 @
+180 @
+181 @
+182 @
+183 @
+184 @
+185 zacute
+186 @
+187 zdotaccent
+188 @
+189 @
+190 @
+191 @
+192 @
+193 @
+194 @
+195 @
+196 @
+197 @
+198 @
+199 @
+200 @
+201 @
+202 @
+203 @
+204 @
+205 @
+206 @
+207 @
+208 @
+209 @
+210 @
+211 Oacute
+212 @
+213 @
+214 @
+215 @
+216 @
+217 @
+218 @
+219 @
+220 @
+221 @
+222 @
+223 @
+224 @
+225 @
+226 @
+227 @
+228 @
+229 @
+230 @
+231 @
+232 @
+233 @
+234 @
+235 @
+236 @
+237 @
+238 @
+239 @
+240 @
+241 @
+242 @
+243 oacute
+244 @
+245 @
+246 @
+247 @
+248 @
+249 @
+250 @
+251 @
+252 @
+253 @
+254 @
+255 quotedblbase
diff --git a/fonts/utilities/t1install/toil/e.qx b/fonts/utilities/t1install/toil/e.qx
new file mode 100644
index 0000000000..096dfde05a
--- /dev/null
+++ b/fonts/utilities/t1install/toil/e.qx
@@ -0,0 +1,264 @@
+EXTERNAL ENCODING FOR TOIL % the header
+QX ENCODING, VER. 0.06 % TFM info
+%============================================================================
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+ 0 alpha
+ 1 Delta
+ 2 beta
+ 3 delta
+ 4 pi
+ 5 Pi
+ 6 Sigma
+ 7 mu
+ 8 ellipsis
+ 9 f_k
+ 10 Omega
+ 11 ff
+ 12 fi
+ 13 fl
+ 14 ffi
+ 15 ffl
+ 16 dotlessi
+ 17 dotlessj
+ 18 grave
+ 19 acute
+ 20 caron
+ 21 breve
+ 22 macron
+ 23 ring
+ 24 cedilla
+ 25 germandbls
+ 26 ae
+ 27 oe
+ 28 oslash
+ 29 AE
+ 30 OE
+ 31 Oslash
+ 32 space
+ 33 exclam
+ 34 quotedblright
+ 35 numbersign
+ 36 dollar
+ 37 percent
+ 38 ampersand
+ 39 quoteright
+ 40 parenleft
+ 41 parenright
+ 42 asterisk
+ 43 plus
+ 44 comma
+ 45 hyphen
+ 46 period
+ 47 slash
+ 48 zero
+ 49 one
+ 50 two
+ 51 three
+ 52 four
+ 53 five
+ 54 six
+ 55 seven
+ 56 eight
+ 57 nine
+ 58 colon
+ 59 semicolon
+ 60 exclamdown
+ 61 equal
+ 62 questiondown
+ 63 question
+ 64 at
+ 65 A
+ 66 B
+ 67 C
+ 68 D
+ 69 E
+ 70 F
+ 71 G
+ 72 H
+ 73 I
+ 74 J
+ 75 K
+ 76 L
+ 77 M
+ 78 N
+ 79 O
+ 80 P
+ 81 Q
+ 82 R
+ 83 S
+ 84 T
+ 85 U
+ 86 V
+ 87 W
+ 88 X
+ 89 Y
+ 90 Z
+ 91 bracketleft
+ 92 quotedblleft
+ 93 bracketright
+ 94 circumflex
+ 95 dotaccent
+ 96 quoteleft
+ 97 a
+ 98 b
+ 99 c
+100 d
+101 e
+102 f
+103 g
+104 h
+105 i
+106 j
+107 k
+108 l
+109 m
+110 n
+111 o
+112 p
+113 q
+114 r
+115 s
+116 t
+117 u
+118 v
+119 w
+120 x
+121 y
+122 z
+123 endash
+124 emdash
+125 hungarumlaut
+126 tilde
+127 dieresis
+128 Euro
+129 Aogonek
+130 Cacute
+131 greater
+132 greaterequal
+133 approxequal
+134 Eogonek
+135 Iogonek
+136 less
+137 lessequal
+138 Lslash
+139 Nacute
+140 asciitilde
+141 asciicircum
+142 ell
+143 dagger
+144 daggerdbl
+145 Sacute
+146 Scaron
+147 Scommaaccent
+148 degree
+149 Tcommaaccent
+150 ogonek
+151 Uogonek
+152 Ydieresis
+153 Zacute
+154 Zcaron
+155 Zdotaccent
+156 IJ
+157 braceleft
+158 braceright
+159 section
+160 @
+161 aogonek
+162 cacute
+163 registered
+164 copyright
+165 divide
+166 eogonek
+167 iogonek
+168 minus
+169 multiply
+170 lslash
+171 nacute
+172 plusminus
+173 infinity
+174 guillemotleft
+175 guillemotright
+176 paragraph
+177 sacute
+178 scaron
+179 scommaaccent
+180 bullet
+181 tcommaaccent
+182 threequartersemdash
+183 uogonek
+184 ydieresis
+185 zacute
+186 zcaron
+187 zdotaccent
+188 ij
+189 periodcentered
+190 quotedbl
+191 quotesingle
+192 Agrave
+193 Aacute
+194 Acircumflex
+195 Atilde
+196 Adieresis
+197 Aring
+198 backslash
+199 Ccedilla
+200 Egrave
+201 Eacute
+202 Ecircumflex
+203 Edieresis
+204 Igrave
+205 Iacute
+206 Icircumflex
+207 Idieresis
+208 Eth
+209 Ntilde
+210 Ograve
+211 Oacute
+212 Ocircumflex
+213 Otilde
+214 Odieresis
+215 currency
+216 perthousand
+217 Ugrave
+218 Uacute
+219 Ucircumflex
+220 Udieresis
+221 Yacute
+222 Thorn
+223 bar
+224 agrave
+225 aacute
+226 acircumflex
+227 atilde
+228 adieresis
+229 aring
+230 underscore
+231 ccedilla
+232 egrave
+233 eacute
+234 ecircumflex
+235 edieresis
+236 igrave
+237 iacute
+238 icircumflex
+239 idieresis
+240 eth
+241 ntilde
+242 ograve
+243 oacute
+244 ocircumflex
+245 otilde
+246 odieresis
+247 anglearc
+248 diameter
+249 ugrave
+250 uacute
+251 ucircumflex
+252 udieresis
+253 yacute
+254 thorn
+255 quotedblbase
+
diff --git a/fonts/utilities/t1install/toil/l.qx b/fonts/utilities/t1install/toil/l.qx
new file mode 100644
index 0000000000..e41c012460
--- /dev/null
+++ b/fonts/utilities/t1install/toil/l.qx
@@ -0,0 +1,21 @@
+OPTIONAL LIGATURES FOR TOIL % the header
+%============================================================================
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+f f ff
+f i fi
+f l fl
+f k fk
+ff i ffi
+ff l ffl
+hyphen hyphen endash
+endash hyphen emdash
+quoteleft quoteleft quotedblleft
+quoteright quoteright quotedblright
+comma comma quotedblbase
+exclam quoteleft exclamdown
+question quoteleft questiondown
+exclamdown exclamdown guillemotleft
+questiondown questiondown guillemotright
diff --git a/fonts/utilities/t1install/toil/toil.cfg b/fonts/utilities/t1install/toil/toil.cfg
new file mode 100644
index 0000000000..97ffc54b4c
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toil.cfg
@@ -0,0 +1,78 @@
+ This file belongs to the TOIL package | Ten plik nale/zy do pakietu TOIL
+ This package is public domain | Pakiet stanowi dobro powszechne
+ For more info see `0TOILENG.LIC' | Wi/ecej informacji w ,,0TOILPOL.LIC''
+============================================================================
+ This is a CONFIG file for the Type One Install utiLity (TOIL, ver. 1.05)
+============================================================================
+
+Pay attention to the following four settings---they're ENVIRONMENT-DEPENDENT:
+T1PSTREE .;..;lofo;c:/psfonts!! | a set of directories where
+ | Type 1 fonts are to be searched for;
+ | emTeX ``exclam''-convention
+ | was adopted: an exclamation mark
+ | ending a directory means searching
+ | one level deeper; two exclamation
+ | marks mean serching through all
+ | subdirectories
+
+USE_DIGIT_KPX 0 | 0 causes that all kern pairs (KPX lines in AFM)
+ | containing at least one name of a digit will
+ | be ignored; 1 means that only KPX lines
+ | referring to two digit names will be ignored;
+ | 2 means that all KPX lines will be taken into
+ | account; following Knuth's Computer Modern
+ | family of typefaces, 0 was chosen as default
+LC_PSF_NAME 0 | lowercase PS font name (in the resulting PSFONTS.MAP)
+UC_TFM_NAME 0 | uppercase TFM name (in the resulting PSFONTS.MAP)
+ | remark: lc-ing and uc-ing is a MSDOS-oriented
+ | idiosyncrasy of ``BOP'' s.c.
+
+The following six settings are also ENVIRONMENT-DEPENDENT:
+RES_MAP_DIR lofo | target MAP file directory
+RES_TFM_DIR lofo | target TFM file directory
+RES_ENC_DIR lofo | target ENC file directory
+RES_ENC_EXT .enc | default ENC file extension
+RES_ENC_PFX | prefix of the ENC file name to be prepended
+ | to the ENC name in the MAP file
+ | (you may prefer to have it empty)
+RES_PSF_PFX *PSF_DIR* | prefix of the PostScript font (PFB/PFA) file name
+ | to be prepended to the PFB/PFA name in the MAP file
+ | (as previously, you may prefer to have it empty)
+In general, you may prefer a modest version:
+| RES_TFM_DIR .
+| RES_MAP_DIR .
+| RES_ENC_DIR .
+| RES_ENC_PFX
+| RES_PSF_PFX
+or you may prefer a sophisticated one:
+| RES_TFM_DIR *AFM_DIR*/../tfm
+| RES_MAP_DIR *AFM_DIR*/../map
+| RES_ENC_DIR *AFM_DIR*/../enc
+| RES_ENC_PFX
+| RES_PSF_PFX
+
+DVIPS_PATH <TEXCONFIG> | <...> means referring to a system
+ | environment variable; DVIPS_PATH, in fact,
+ | locates (main) PSFONTS.MAP (and CONFIG.PS
+ | but it doesn't matter)
+DVIPS_MAP psfonts.map | DVIPS convention
+USER_MAP psfonts.map | let's follow DVIPS convention...
+| USER_MAP *MF_NAME*.map | ... or not
+USE_GLB_MAP 1 | use global font map, unless local one
+ | hasn't been found
+DEL_MF_FILE 1 | remove temporary (local) MF file
+DEL_MF_LOG 1 | remove temporary (local) LOG file
+QUIET 0 | 1 means writing messages to the terminal
+
+============================================================================
+
+Only the lines beginning with key-words (leading blanks are ignored) are
+taken into account. A broken bar | means a beginning of a comment (a hash and
+a percent are valid characters in MS DOS names). Objects surrouned with
+less-greater braces, e.g., <TEXCONFIG>, refer to system environment
+variables; objects surrouned with asterisks, e.g., *AFM_DIR*, refer to
+internal variables; at present, the following references of this kind are
+allowed: *AFM_DIR*, *PSF_DIR*, *FONT_NAME*, *ENC_NAME*, *MF_NAME*.
+
+The names of the key-words are expected to be long enough to be
+self-explaining in most cases; if not, trailing comments should suffice.
diff --git a/fonts/utilities/t1install/toil/toil.mf1 b/fonts/utilities/t1install/toil/toil.mf1
new file mode 100644
index 0000000000..825a4e25c3
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toil.mf1
@@ -0,0 +1,175 @@
+THIS IS AN INCLUDE FILE No. 1 FOR TOILB.AWK
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+% RUDIMENTARY DEFINITIONS, REDEFINITIONS AND DEFAULTS:
+%%% addto H V
+%%% ; semi_
+%%% message write_enc write_map char_title
+% ---
+% This METAFONT file was generated from an AFM file in order to create
+% a corresponding TFM file along with a font map file and an encoding vector
+% file (the latter two are to be extracted from a log file and are meant
+% for use with Tomas Rokicki's DVIPS driver)
+% ---
+% By default, italic angle (in degrees) |IA=whatever| and
+% x-scale |XS=whatever|. User may assign a value to any of these
+% variables either by changing this file or (preferably) from a command
+% line writing, e.g.,
+% mf &plain \IA:=12; input thisfile
+% or
+% mf &plain \XS:=1.2; input thisfile
+% or
+% mf &plain \XS:=1.2;IA:=12; input thisfile
+% ---
+string res_enc_name; res_enc_name=ENCNNAME;
+string res_enc_file; res_enc_file=ENCXNAME;
+string type_one_file; type_one_file=TONEFILE;
+boolean quiet; quiet=MESSAGES;
+vardef math_axis = MATHAXIS enddef;
+vardef math_rule = MATHRULE enddef;
+% ---
+let semi_ = ; ;
+let endchar_=endchar;
+let beginchar_=beginchar;
+string curr_title;
+string enc_vec[\\];
+% ---
+mode_def tfm_mode =
+ proofing:=0; % no, we're not making full proofs
+ fontmaking:=1; % yes, we're making a font
+ tracingtitles:=0; % no, don't show titles online
+ pixels_per_inch:=DUMMYPPI; % doesn't matter
+ blacker:=0; % no additional blackness
+ fillin:=0; % no compensation for fillin
+ o_correction:=1; % no reduction in overshoot
+enddef;
+% --------------------------------
+% SKIPPING AND NAMING CHARACTER:
+def skip_char =
+ let ; = end_skip_char \\ semi_
+ if known show_skipping:
+ message "SKIPPING " & curr_title \\ semi_
+ fi
+ let endchar = fi \\ semi_
+ if false:
+enddef;
+def end_skip_char =
+ let ; = semi_ semi_
+ let endchar = endchar_;
+enddef;
+% --------------------------------
+% BEGINNING CHARACTER:
+def char_title expr t =
+ curr_title:=t; curr_enc:=Enc(curr_title);
+ if curr_enc<>-1: enc_vec[curr_enc]:=curr_title; t \\ fi
+enddef;
+% ---
+def beginchar(expr cc,ww,hh,dd) =
+ numeric code; code:=byte(cc);
+ if (known skip_this_char) or (code<0):
+ let next_to_do = skip_char;
+ else:
+ let next_to_do = beginchar_;
+ fi
+ save skip_this_char;
+ next_to_do(code,ww,hh,dd)
+enddef;
+extra_endchar:=extra_endchar & ";charcode:=charcode-256;";
+% --------------------------------
+% ITALIC CORRECTIONS (according to the rule of thumb,
+% see METAFONTbook, p. 105):
+def IC expr tip = % to improve or not to improve?
+ charic:=xpart(tip)-charwd+ypart(tip)*user_slant+0.5u#;
+ if charic<0: charic:=0; fi
+enddef;
+% --------------------------------
+% KERNS AND LIGATURES (be careful if you don't want to produce
+% malformed TFM):
+vardef code_OK(expr c) = % returns |true| iff code |c| is OK
+ if known c: (c>=0) and (c<=255) and (charexists c) else: false fi
+enddef;
+def start_or_cont =
+% we postpone starting |ligtable| until a legal pair is encountered
+ if unknown already_started:
+ already_started:=1; ligtable LK_code: else: ,
+ fi
+enddef;
+def skip_LK =
+ let ; = end_skip_LK \\ semi_
+ let KL = fi \\ semi_
+ if false:
+enddef;
+def end_skip_LK =
+ let ; = semi_ semi_
+ let KL = relax;
+enddef;
+def LK(expr c) = % start ligature-kern table
+ numeric LK_code,code,code',already_started;
+ code:=Enc c;
+ if code_OK(code): let next_to_do = relax;
+ else: let next_to_do = skip_LK; fi
+ next_to_do \\ LK_code:=code;
+enddef;
+def LP(expr c, cc) = % ligature pair
+ hide(code:=Enc c; code':=Enc cc)
+ if code_OK(code) and code_OK(code'):
+ start_or_cont \\ code=:(code') % braces are crucial for delimiting suffix
+ fi
+enddef;
+def KP(expr c, k) = % kern pair
+ hide(code:=Enc c)
+ if code_OK(code): start_or_cont \\ code kern k fi
+enddef;
+let KL = relax;
+% --------------------------------
+% SCALING:
+vardef sharp_scale(expr e) = e/100 enddef; % i.e., |1pt#*e/100|
+vardef H expr x = % sharp horizontal scaling
+ if known XS: XS* fi \\ sharp_scale(x)
+enddef;
+vardef V expr y = % sharp vertical scaling
+ sharp_scale(y)
+enddef;
+% --------------------------------
+% WRITING ENCODING:
+boolean internal_enc; % set in the ENCODING part
+def write_enc = message ":ENC:" \\ & enddef;
+def write_map = message ":MAP:" \\ & enddef;
+def write_enc_info =
+ if not internal_enc:
+ write_enc "/enc" & res_enc_name & "[";
+ for i:=0 upto 255:
+ write_enc "/"
+ & if unknown enc_vec[i]: ".notdef" else: enc_vec[i] fi;
+ endfor
+ write_enc "] def";
+ fi
+enddef;
+def write_map_info = % this produces a line for PSFONTS.MAP
+ write_map TFMNAME;
+ write_map TONENAME;
+% BJ doesn't like superfluous spaces, that's why the following
+% code is rather tangled than woven...
+ if (user_slant<>0) or (known XS):
+ write_map ditto
+ if (user_slant<>0):
+ & decimal(user_slant) & " SlantFont"
+ fi
+ if known XS:
+ if (user_slant<>0): & " " fi
+ & decimal(XS) & " ExtendFont"
+ fi
+ if internal_enc: & ditto fi;
+ fi
+ if not internal_enc:
+ write_map
+ if not ((user_slant<>0) or (known XS)): ditto & fi
+ "enc" & res_enc_name & " ReEncodeFont" & ditto;
+ fi
+ if not internal_enc: write_map "<" & res_enc_file; fi
+ if type_one_file<>"": write_map "<" & type_one_file; fi
+ message "";
+enddef;
+% --------------------------------
diff --git a/fonts/utilities/t1install/toil/toil.mf2 b/fonts/utilities/t1install/toil/toil.mf2
new file mode 100644
index 0000000000..4cdb64f6fd
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toil.mf2
@@ -0,0 +1,30 @@
+THIS IS AN INCLUDE FILE No. 2 FOR TOILB.AWK
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+% INITIALIZATION:
+if not string mode: % unless user's will is different
+ mode:=tfm_mode; % set our private mode, defined above
+fi
+mode_setup;
+displaying:=0; % we're never displaying
+font_coding_scheme enc_kind;
+font_identifier jobname;
+font_size 10pt#; % i.e., |designsize=10pt#|
+u#:=if known XS: XS* fi \\ 1/18designsize;
+font_normal_space 6u#;
+font_normal_stretch 3u#;
+font_normal_shrink 2u#;
+font_quad 18u#;
+font_extra_space 2u#;
+font_x_height XHEIGHT;
+afm_slant:=SLANT;
+user_slant:=if known IA: sind(IA)/cosd(IA) else: 0 fi;
+% |fontdimen1| should contain the resulting slant:
+res_slant:=xpart(up slanted afm_slant slanted user_slant);
+font_slant res_slant;
+if known math_rule: fontdimen 8: math_rule; fi
+if known math_axis: fontdimen 22: math_axis; fi
+numeric show_skipping; % default is not showing
+% --------------------------------
diff --git a/fonts/utilities/t1install/toil/toil.mf3 b/fonts/utilities/t1install/toil/toil.mf3
new file mode 100644
index 0000000000..ed0d0e165c
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toil.mf3
@@ -0,0 +1,21 @@
+THIS IS AN INCLUDE FILE No. 3 FOR TOILB.AWK
+%This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+%This package is public domain : Pakiet stanowi dobro powszechne
+%For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+%============================================================================
+% LAST MINUTE ACTION:
+write_enc_info;
+write_map_info;
+% --------------------------------
+if (not quiet) and ((afm_slant<>0) or (user_slant<>0) or (known XS)):
+ errorstopmode; % switch to the usual mode (|batchmode| is default)
+ if (afm_slant<>0) or (user_slant<>0):
+ message " slant: " & decimal(res_slant)
+ & " (afm: " & decimal(afm_slant) & ", user: " & decimal(user_slant) & ")"
+ fi;
+ if known XS: message "x-scale: " & decimal(XS); fi;
+ batchmode; % don't write mess to the terminal
+fi
+% --------------------------------
+bye.
+%%\end
diff --git a/fonts/utilities/t1install/toil/toila.awk b/fonts/utilities/t1install/toil/toila.awk
new file mode 100644
index 0000000000..26d2138856
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toila.awk
@@ -0,0 +1,442 @@
+#This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+#This package is public domain : Pakiet stanowi dobro powszechne
+#For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+#============================================================================
+# GOVERNING FILE
+# ==========================================================================
+# PARMETERS:
+# CLP -- an auxiliary file containing in the first line a comment,
+# in the second one -- the font name, and then a list of options ensues
+# No input is expected
+# ==========================================================================
+BEGIN {
+# FIX BASIC CONSTANTS
+ fix_const()
+
+# WRITE A BANNER
+ mess("This is a configurable Type One Install utiLity (TOIL), ver.", VER_NO)
+
+# INSPECT CONFIG FILE AND ANALYSE COMMAND LINE
+ clear(Q_COND); list_files(ENV_CFG, "", CFG_PAT, Q_COND, cfg_lst)
+ CFG=cfg_lst[1]; if (cfg_lst[1]=="") errmess(1, CFG_PAT " file not found")
+ get_config(cfg_lst[1])
+ analyse_command_line_parameters(CLP)
+ if (err_par!="") errmess(2, "Offending parameter:", err_par)
+
+# CHECK WHETHER THE REMAINING AWK PROGRAMS EXIST
+ clear(Q_COND); Q_COND[AWK1_PAT]=1; Q_COND[AWK2_PAT]=1
+ list_files(ENV_CFG, "", AWK_PAT, Q_COND, awk_lst)
+ AWK1=first_fit(awk_lst, AWK1_PAT)
+ AWK2=first_fit(awk_lst, AWK2_PAT)
+ if ((AWK1=="") || (AWK2=="")) errmess(4, "AWK program(s) not found")
+
+# CHECK WHETHER THE COMPONENT MF FILES EXIST
+ clear(Q_COND); Q_COND[MF1_PAT]=1; Q_COND[MF2_PAT]=1; Q_COND[MF3_PAT]=1
+ list_files(ENV_CFG, "", MF_PAT, Q_COND, mf_lst)
+ MF1=first_fit(mf_lst, MF1_PAT)
+ MF2=first_fit(mf_lst, MF2_PAT)
+ MF3=first_fit(mf_lst, MF3_PAT)
+ if ((MF1=="")||(MF2=="")||(MF3=="")) errmess(5,"MF component(s) not found")
+
+# FIX BASIC NAMES
+ if ((MF=="") && ((X_SCALE!="") || (IT_ANGLE!=""))) {
+ warn("It is advisable to use an alternate name (option `-M')",
+ "if you rescale or slant a font (options `-X' or `-I')")
+ }
+ if (MF=="") MF=FONT
+ TFM=MF
+ MF_MF=MF ".mf"
+ if (ENC_NAME=="") ENC_NAME=MF
+ if (ENC_GVN!="") {
+ clear(Q_COND)
+ list_files(".;" ENV_CFG,
+ sys_hull_dir(ENC_GVN), sys_hull_namex(ENC_GVN), Q_COND, enc_lst)
+ ENC_ACT=enc_lst[1]
+ }
+ if (LIG_GVN!="") {
+ clear(Q_COND)
+ list_files(".;" ENV_CFG,
+ sys_hull_dir(LIG_GVN), sys_hull_namex(LIG_GVN), Q_COND, lig_lst)
+ LIG_ACT=lig_lst[1]
+ }
+
+# FIND AFM AND PFB/PFA FILES
+ mess("Seeking for " FONT ".afm and " FONT ".pfa or " FONT ".pfb")
+ clear(Q_COND); Q_COND[AFM_PAT]=1; Q_COND[PSF_PAT]=1
+ list_files(CV["T1PSTREE"],
+ sys_hull_dir(FONT_GVN), FONT T1_PAT, Q_COND, t1_lst)
+ AFM_FILE=first_fit(t1_lst, AFM_PAT)
+ PSF_FILE=unix_name(first_fit(t1_lst, PSF_PAT))
+ if (AFM_FILE=="") errmess(6, FONT ".afm not found")
+ if (PSF_FILE=="") warn("Neither " FONT ".pfb nor " FONT ".pfa not found")
+
+# RESOLVE INTERNAL REFERENCES
+ AFM_DIR=sys_hull_dir(AFM_FILE)
+ PSF_DIR=sys_hull_dir(PSF_FILE)
+ CV["ENC_XNAME"]=sys_conc(CV["RES_ENC_PFX"], ENC_NAME CV["RES_ENC_EXT"])
+ CV["PSF_XNAME"]=sys_conc(CV["RES_PSF_PFX"], sys_hull_namex(PSF_FILE))
+ for (v in CV) {
+ if (CV[v] ~ /\*(((AFM|PSF)_DIR)|((ENC|FONT|MF)_NAME))\*/) {
+ gsub(/\*AFM_DIR\*/, AFM_DIR, CV[v]); CV[v]=sys_name(CV[v])
+ gsub(/\*PSF_DIR\*/, PSF_DIR, CV[v]); CV[v]=sys_name(CV[v])
+ gsub(/\*ENC_NAME\*/, ENC_NAME, CV[v]); CV[v]=sys_name(CV[v])
+ gsub(/\*FONT_NAME\*/, FONT, CV[v]); CV[v]=sys_name(CV[v])
+ gsub(/\*MF_NAME\*/, MF, CV[v]); CV[v]=sys_name(CV[v])
+ }
+ }
+ CV["ENC_XNAME"]=unix_name(CV["ENC_XNAME"])
+ CV["PSF_XNAME"]=unix_name(CV["PSF_XNAME"])
+
+# FIND FONT MAP FILE
+ clear(Q_COND)
+ list_files(CV["RES_MAP_DIR"], "", CV["USER_MAP"], Q_COND, loc_lst)
+ MAP=loc_lst[1]
+ if ((MAP=="") && CV["USE_GLB_MAP"]) {# MAP doesn't exist yet, use global one
+ clear(Q_COND)
+ list_files(".;" CV["DVIPS_PATH"], "", CV["DVIPS_MAP"], Q_COND, glb_lst)
+ MAP=glb_lst[1]
+ }
+
+# PERFORM (UPPER|LOWER)CASING, DEPENDING ON CONFIG FILE SETTINGS
+ if (CV["LC_PSF_NAME"]) {
+ CV["ENC_XNAME"]=lc(CV["ENC_XNAME"]); CV["PSF_XNAME"]=lc(CV["PSF_XNAME"])
+ ENC_NAME=lc(ENC_NAME)
+ }
+ if (CV["UC_TFM_NAME"]) TFM=uc(TFM)
+
+# WRITE TEMPORARY CONFIG FILE (EXTEND THE USER'S CONFIG)
+ for (v in CV) print v, CV[v] > TMP_CFG
+ print "FONT", FONT > TMP_CFG
+ print "MF1", MF1 > TMP_CFG
+ print "MF2", MF2 > TMP_CFG
+ print "MF3", MF3 > TMP_CFG
+ print "MF", MF > TMP_CFG
+ print "MF_MF", MF_MF > TMP_CFG
+ print "LIG_GVN", LIG_GVN > TMP_CFG
+ print "LIG_ACT", LIG_ACT > TMP_CFG
+ print "ENC_GVN", ENC_GVN > TMP_CFG
+ print "ENC_ACT", ENC_ACT > TMP_CFG
+ print "ENC_NAME", ENC_NAME > TMP_CFG
+ print "AFM", AFM_FILE > TMP_CFG
+ print "TFM", TFM > TMP_CFG
+ print "MAP", MAP > TMP_CFG
+ print "AFM_DIR", AFM_DIR > TMP_CFG
+ print "PSF_DIR", PSF_DIR > TMP_CFG
+ print "TMP_ENC", TMP_ENC > TMP_CFG
+ print "TMP_MAP", TMP_MAP > TMP_CFG
+ print "TMP_TMP", TMP_TMP > TMP_CFG
+ print "PPI", PPI > TMP_CFG
+ print "VER_NO", VER_NO > TMP_CFG
+ print "B_CHAR", B_CHAR > TMP_CFG
+
+# WRITE SYSTEM SCRIPTS
+ # BAT1:
+# print sys_copy(TMP_TMP) > BAT1
+ print sys_del(TMP_MAP) > BAT1
+ print sys_del(TMP_ENC) > BAT1
+ print sys_del(TMP_TMP) > BAT1
+ print sys_name(AWK_CALL) " -f" AWK1 > BAT1
+ # BAT2:
+ MF_opt="\\batchmode;"
+ if (X_SCALE!="") {MF_opt=MF_opt "XS=" X_SCALE ";"}
+ if (IT_ANGLE!="") {MF_opt=MF_opt "IA=" IT_ANGLE ";"}
+ print sys_name(MF_CALL) " " MF_opt "input " MF > BAT2
+ # BAT3:
+ if (MAP!="") {
+ print sys_copy(MAP, TMP_MAP) > BAT3
+ print "echo Using", MAP > BAT3
+ }
+ print sys_name(AWK_CALL) " -f" AWK2 " " MF ".log" > BAT3
+ # BAT4: LOG and MF files should rather be kept in the case of MF crash
+ if (CV["DEL_MF_LOG"]) print sys_del(MF ".log") > BAT4
+ if (CV["DEL_MF_FILE"]) print sys_del(MF ".mf") > BAT4
+ print sys_del(MF ".ps") > BAT4
+ # BAT5:
+ print sys_del(MF "." PPI "GF") > BAT5
+ print sys_del(MF "." substr(PPI "GF",1,3)) > BAT5
+ if (CV["RES_TFM_DIR"]!="\.") {
+ print sys_copy(MF ".tfm", sys_conc(CV["RES_TFM_DIR"], MF ".tfm")) > BAT5
+ print sys_del(MF ".tfm") > BAT5
+ }
+ print sys_copy(TMP_ENC,
+ sys_conc(CV["RES_ENC_DIR"], ENC_NAME CV["RES_ENC_EXT"])) > BAT5
+ print sys_copy(TMP_MAP,
+ sys_conc(CV["RES_MAP_DIR"], CV["USER_MAP"])) > BAT5
+ print sys_del(TMP_MAP) > BAT5
+ print sys_del(TMP_ENC) > BAT5
+ print sys_del(TMP_TMP) > BAT5
+ print sys_del(TMP_CFG) > BAT5
+}
+
+# ==========================================================================
+
+function uc(s, i) {
+ for (i=1; i<=length(s); ++i) {
+ if (substr(s,i,1) in UC)
+ s=substr(s,1,i-1) UC[substr(s,i,1)] substr(s,i+1)
+ }
+ return s
+}
+
+function lc(s, i) {
+ for (i=1; i<=length(s); ++i) {
+ if (substr(s,i,1) in LC)
+ s=substr(s,1,i-1) LC[substr(s,i,1)] substr(s,i+1)
+ }
+ return s
+}
+
+function analyse_command_line_parameters(CLP_FILE, glb_map, p, i) {
+ # CLP_FILE -- command line parameter file
+ getline FONT_GVN < CLP_FILE # get font name
+ FONT=sys_hull_name(FONT_GVN)
+ if (FONT=="") errmess(3, "Invalid font name", FONT_GVN)
+ while (getline < CLP_FILE > 0) p[++p[0]]=$0 # get options
+ i=1
+ while ((i<=p[0]) && (p[i]!="") && (err_par=="")) {
+ if (p[i] ~ /^[-\/][BbEeGgIiLlMmNnXx]$/) {
+ if (p[i+1]=="") {err_par=p[i]}
+ else {
+ if (p[i] ~ /^[-\/][Bb]$/) B_CHAR=p[++i]
+ if (p[i] ~ /^[-\/][Ee]$/) ENC_GVN=p[++i]
+ if (p[i] ~ /^[-\/][Gg]$/) glb_map=p[++i]+0
+ if (p[i] ~ /^[-\/][Ii]$/) IT_ANGLE=p[++i]+0
+ if (p[i] ~ /^[-\/][Ll]$/) LIG_GVN=p[++i]
+ if (p[i] ~ /^[-\/][Mm]$/) MF=sys_hull_name(p[++i])
+ if (p[i] ~ /^[-\/][Nn]$/) ENC_NAME=sys_hull_name(p[++i])
+ if (p[i] ~ /^[-\/][Xx]$/) X_SCALE=p[++i]+0
+ }
+ } else if (p[i] ~ /^[-\/][BbEeGgIiLlMmNnXx]/) {
+ if (p[i] ~ /^[-\/][Bb]/) B_CHAR=substr(p[i],3)
+ if (p[i] ~ /^[-\/][Ee]/) ENC_GVN=substr(p[i],3)
+ if (p[i] ~ /^[-\/][Gg]/) glb_map=substr(p[i],3)+0
+ if (p[i] ~ /^[-\/][Ii]/) IT_ANGLE=substr(p[i],3)+0
+ if (p[i] ~ /^[-\/][Ll]/) LIG_GVN=substr(p[i],3)
+ if (p[i] ~ /^[-\/][Mm]/) MF=sys_hull_name(substr(p[i],3))
+ if (p[i] ~ /^[-\/][Nn]/) ENC_NAME=sys_hull_name(substr(p[i],3))
+ if (p[i] ~ /^[-\/][Xx]/) X_SCALE=substr(p[i],3)+0
+ } else {err_par=p[i]}
+ ++i
+ }
+ B_CHAR=(B_CHAR !~ /[\+\-]?[0-9]+/ ? -1 : B_CHAR+0)
+ if (LIG_GVN ~ /[\?\*]/) LIG_GVN=""
+ if (ENC_GVN ~ /[\?\*]/) ENC_GVN=""
+ if (MF ~ /[\?\*]/) MF=""
+ if (ENC_NAME ~ /[\?\*]/) ENC_NAME=""
+ gsub(/\.[Ee][Nn][Cc]$/, "", ENC_NAME)
+ if (glb_map!="") CV["USE_GLB_MAP"]=glb_map
+}
+
+function errmess(e,s1,s2,s3) {# at most three parts may occur
+ mess("TOIL ERROR:",s1, s2, s3); exit(e)
+}
+
+function mess(s1,s2,s3,s4, s) {# at most four parts may occur
+ s=s1; if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4
+ if (length(s)<=max_line) {
+ if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG
+ } else {
+ if ((!CV["QUIET"]) && (s1!="")) print s1 > "CON"
+ if ((LOG!="") && (s1!="")) print s1 > LOG
+ if ((!CV["QUIET"]) && (s2!="")) print s2 > "CON"
+ if ((LOG!="") && (s2!="")) print s2 > LOG
+ if ((!CV["QUIET"]) && (s3!="")) print s3 > "CON"
+ if ((LOG!="") && (s3!="")) print s3 > LOG
+ if ((!CV["QUIET"]) && (s4!="")) print s4 > "CON"
+ if ((LOG!="") && (s4!="")) print s4 > LOG
+ }
+}
+
+function warn(s1,s2,s3,s4, s) {# at most four parts may occur
+ s="WARNING: " s1
+ if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4
+ if (length(s)<=max_line) {
+ if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG
+ } else {
+ if ((!CV["QUIET"]) && (s1!="")) print "WARNING:", s1 > "CON"
+ if ((LOG!="") && (s1!="")) print "WARNING:", s1 > LOG
+ if ((!CV["QUIET"]) && (s2!="")) print " ", s2 > "CON"
+ if ((LOG!="") && (s2!="")) print " ", s2 > LOG
+ if ((!CV["QUIET"]) && (s3!="")) print " ", s3 > "CON"
+ if ((LOG!="") && (s3!="")) print " ", s3 > LOG
+ if ((!CV["QUIET"]) && (s4!="")) print " ", s4 > "CON"
+ if ((LOG!="") && (s4!="")) print " ", s4 > LOG
+ }
+}
+
+function clear(t, i) {for (i in t) delete t[i]}
+function entries(t, i,j) {for (i in t) ++j; return j}
+
+function first_fit(list, item_pat, i, r) {
+ for (i=1; i<=list[0]; ++i) {if (list[i] ~ item_pat) {r=list[i]; break}}
+ return r
+}
+
+function list_files(tree, dir_pfx, file_pat, q_cond, res, q, r, s, t) {
+ do_sys_del(TMP_TMP)
+ t[0]=split(tree,t,";");
+ for (s=1; s<=t[0]; ++s) {
+ r=sys_conc_dir(t[s], dir_pfx)
+ if (r ~ /[^!]!!$/) {
+ r=substr(r,1,length(r)-2)
+ if (sys_is_dir(r)) lst_all_lev(r, file_pat, res)
+ } else if (r ~ /[^!]!$/) {
+ r=substr(r,1,length(r)-1)
+ if (sys_is_dir(r)) lst_one_lev(r, file_pat, res)
+ } else {
+ if (sys_is_dir(r)) lst_cur_lev(r, file_pat, res)
+ }
+ for (q in q_cond)
+ for (r=1; r<=res[0]; ++r)
+ if (res[r] ~ q) delete q_cond[q]
+ if ((res[0]>0) && (entries(q_cond)==0)) break
+ }
+}
+
+function lst_all_lev(dir, file_pat, res) {
+ do_sys_call(sys_lst("-d /s") sys_conc(dir, file_pat) ">" TMP_TMP)
+ while (getline < TMP_TMP > 0) res[++res[0]]=$0
+ do_sys_del(TMP_TMP)
+}
+
+function lst_cur_lev(dir, file_pat, res) {
+ do_sys_call(sys_lst("-d") sys_conc(dir, file_pat) ">" TMP_TMP)
+ while (getline < TMP_TMP > 0) res[++res[0]]=sys_conc(dir, $0)
+ do_sys_del(TMP_TMP)
+}
+
+function lst_one_lev(dir, file_pat, res, d, i) {
+ lst_cur_lev(dir, file_pat, res)
+ do_sys_call(sys_lst("d") sys_name(dir) ">" TMP_TMP)
+ while (getline < TMP_TMP > 0) d[++d[0]]=$0
+ for (i=1; i<=d[0]; ++i) {
+ do_sys_del(TMP_TMP)
+ do_sys_call(sys_lst("-d") "\"" sys_conc(sys_conc(dir, d[i]), file_pat) "\">" TMP_TMP)
+ while (getline < TMP_TMP > 0)
+ res[++res[0]]=sys_conc(sys_conc(dir, d[i]), $0)
+ do_sys_del(TMP_TMP)
+ }
+}
+
+function sys_is_dir(dir, s_n, f) {
+# checks if a directory exists; introduced to avoid message ``path not found''
+ s_n=sys_conc((dir=="" ? "." : dir), "nul")
+ do_sys_call("if exist " s_n " echo FOUND > " TMP_TMP)
+ getline f < TMP_TMP
+ do_sys_del(TMP_TMP)
+ return (f ~ "FOUND")
+}
+
+function sys_hull_dir(n) {# n -- a file name
+ return (match(n,/[^:\\\/]*$/) ? substr(n,1,RSTART-1) : "")
+}
+
+function sys_hull_namex(n) {# n -- a file name
+ return (match(n,/[^:\\\/]*$/) ? substr(n,RSTART) : n)
+}
+
+function sys_hull_name(n) {# n -- a file name
+ gsub(/^.*[:\\\/]/, "", n) # truncate directory
+ gsub(/\.+[^\.]*$/, "", n) # truncate extension (and malformed names)
+ return n
+}
+function sys_conc(a, b) {# a -- directory, b -- file name
+ if ((a=="") || (b ~ /:/)) return b
+ else if (b=="") return a
+ else return sys_name(a (a ~ /:$/ ? "" : "/" ) b)
+}
+function sys_conc_dir(a, b) {# a and b directories, perhaps from a tree (path)
+ if ((a=="") || (b ~ /:/)) return b
+ else if ((b=="") || (a ~ /[^!]!!?$/)) return a
+ else return sys_name(a (a ~ /:$/ ? "" : "/" ) b)
+}
+function sys_name(n) {gsub(/\\+/,"/",n); gsub(/\/+/,"\\",n); return n}
+function unix_name(n) {gsub(/\\+/,"/",n); return n}
+function sys_lst(opt) {return "dir /on /b /a" opt " "}
+function sys_del(what) {return "if exist " what " del " what}
+function do_sys_del(what) {close(what); do_sys_call(sys_del(what))}
+# ---
+# ATTENTION: A DISCREPANCY DUE TO M$'S CRAZY LOCALIZATION!
+# Uncomment the following declaration of `sys_copy' if the English
+# MS DOS system is used (also see below):
+# function sys_copy(i, o) {return "if exist " i " echo F|xcopy " i " " o ">" TMP_TMP}
+# Uncomment the following declaration of `sys_copy' if the Polish
+# MS DOS from Win95/98 system is used (`P' stands for Plik, while
+# `F' stands for File):
+function sys_copy(i, o) {return "if exist " i " echo P|xcopy " i " " o ">" TMP_TMP}
+# ---
+function do_sys_call(s) {system(s)} # print s > "ZZZ"
+
+function get_cfg_item(item_name, item) {
+ if ($1==item_name) {
+ item=$0
+ gsub("^[ \t]*" item_name "[ \t]+","",item)
+ gsub(/[ \t]*(\|.*)?$/,"",item)
+ CV[item_name]=item
+ }
+}
+
+function get_config (CFG, v,w) {
+ # list of actually recognized config variables:
+ in_CV["T1PSTREE"]=1
+ in_CV["USE_DIGIT_KPX"]=1
+ in_CV["LC_PSF_NAME"]=1
+ in_CV["UC_TFM_NAME"]=1
+ in_CV["RES_MAP_DIR"]=1
+ in_CV["RES_TFM_DIR"]=1
+ in_CV["RES_ENC_DIR"]=1
+ in_CV["RES_ENC_PFX"]=1
+ in_CV["RES_ENC_EXT"]=1
+ in_CV["RES_PSF_PFX"]=1
+ in_CV["DVIPS_MAP"]=1
+ in_CV["DVIPS_PATH"]=1
+ in_CV["USER_MAP"]=1
+ in_CV["USE_GLB_MAP"]=1
+ in_CV["DEL_MF_FILE"]=1
+ in_CV["DEL_MF_LOG"]=1
+ in_CV["QUIET"]=1
+ in_CV["MATHEMATIZE"]=1
+ while (getline < CFG > 0) for (v in in_CV) get_cfg_item(v)
+
+ if (CV["MATHEMATIZE"]=="") CV["MATHEMATIZE"]=1
+ if (CV["RES_MAP_DIR"]=="") CV["RES_MAP_DIR"]="."
+ if (CV["RES_TFM_DIR"]=="") CV["RES_TFM_DIR"]="."
+ if (CV["RES_ENC_DIR"]=="") CV["RES_ENC_DIR"]="."
+ for (w in in_CV)
+ while (match(CV[w],/<[^>]+>/)) {
+ v=substr(CV[w],RSTART+1,RLENGTH-2)
+ # references to non-existant environment variables are replaced by
+ # an empty string:
+ CV[w]=substr(CV[w],1,RSTART-1)\
+ (v in ENVIRON ? ENVIRON[v] : "")\
+ substr(CV[w],RSTART+RLENGTH)
+ }
+# for (w in CV) printf("%20s %s\n",w, CV[w])
+}
+
+function fix_const() {
+# GENERAL CONSTANTS (used also in toilb.awk and toilc.awk)
+ QQ="\""
+ max_line=79 # screen limit
+ max_sys_line=127 # MSDOS limit
+ TMP_CFG="~t~m~p~.cfg"
+# VERSION
+ VER_NO="1.07"
+# PATHS, FILE NAMES AND NAME PATTERNS
+ ENV_CFG=("TOILPATH" in ENVIRON ? ENVIRON["TOILPATH"] : "")
+ MF_CALL="mpost &mfplain"
+ AWK_CALL=ARGV[0]
+ TMP_NAME="_t_m_p_"
+ TMP_TMP=TMP_NAME ".tmp"; TMP_ENC=TMP_NAME ".enc"; TMP_MAP=TMP_NAME ".map"
+ CFG_PAT="toil.cfg"; T1_PAT="\.?f?"; AWK_PAT="toil?\.awk"
+ AFM_PAT="\.(afm|AFM)$"; PSF_PAT="\.(pf[ab]|PF[AB])$";
+ AWK1_PAT="(toilb|TOILB)\.(awk|AWK)"
+ AWK2_PAT="(toilc|TOILC)\.(awk|AWK)"
+ MF_PAT="toil.mf?"; MF1_PAT="1$"; MF2_PAT="2$"; MF3_PAT="3$"
+ BAT1="toiltmp1.bat"; BAT2="toiltmp2.bat"; BAT3="toiltmp3.bat";
+ BAT4="toiltmp4.bat"; BAT5="toiltmp5.bat"
+ PPI=999
+# INITIALIZE lc AND uc FUNCTION:
+ for (i=97; i<=122; ++i) LC[sprintf("%c",i-32)]=sprintf("%c",i)
+ for (i=65; i<=90; ++i) UC[sprintf("%c",i+32)]=sprintf("%c",i)
+}
diff --git a/fonts/utilities/t1install/toil/toilb.awk b/fonts/utilities/t1install/toil/toilb.awk
new file mode 100644
index 0000000000..f3fd8a1ca1
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toilb.awk
@@ -0,0 +1,335 @@
+#This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+#This package is public domain : Pakiet stanowi dobro powszechne
+#For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+#============================================================================
+# MAIN TASK FILE: generates the MF program which will generate the TFM file
+# ==========================================================================
+BEGIN {
+ B_CHAR_NAME=".boundarychar" # local constant (unimportant, in fact)
+ fix_const(); get_tmp_config(TMP_CFG)
+# 0: READ AFM FILE:
+ RS="(\012|\015|\012\015)"
+ getline < CV["AFM"]
+ if (!/^StartFontMetrics/) errmess(4, CV["AFM"], "is not an AFM file")
+ mess("Converting", CV["AFM"], "to", CV["MF_MF"])
+ FS=" *;? *" # convenient FS for parsing AFM files
+ while (getline < CV["AFM"] > 0) {
+ if ($1=="UnderlineThickness") UnderlineThickness=$2
+ if ($1=="FontName") FontName=$2
+ if ($1=="XHeight") XHeight=$2
+ if ($1=="ItalicAngle") ItalicAngle=$2
+ if ($1 == "C") {
+ AFM_C[++AFM_NUM]=round($2)
+ AFM_W[AFM_NUM]=round($4)
+ AFM_N[AFM_NUM]=$6
+ AFM_SET[$6]=AFM_NUM
+ XL[AFM_NUM]=round($8)
+ YL[AFM_NUM]=round($9)
+ XH[AFM_NUM]=round($10)
+ YH[AFM_NUM]=round($11)
+ AFM_CN[AFM_C[AFM_NUM]]=AFM_N[AFM_NUM]
+ if (AFM_C[AFM_NUM]>Cmax) Cmax=AFM_C[AFM_NUM]
+ for (i=12; i<=NF; i+=3) if ($i=="L") AFM_L[$6,$(i+1)]=$(i+2)
+ }
+ if ($1 == "KPX")
+ if (($2 in AFM_SET) && ($3 in AFM_SET))
+ # warning: a bit of trickery is comming:
+ if ((is_digit($2)+is_digit($3))<=CV["USE_DIGIT_KPX"])
+ K[$2,$3]=round($4)
+ }
+ FS=" " # restore standard FS
+# 1: ``MATHEMATIZE'' FONT IF REQUIRED (USUALLY REQUIRED):
+ if (CV["MATHEMATIZE"]) {
+ # The innocent word ``mathematize'' means that
+ # 1. All depths (e.g., accents) and heights (e.g., underscore) but
+ # the depth of equal sign are set par force to non-negative values
+ # according to the formula (x<0 ? 0 : x)
+ # 2. Math axis is determined in the following way:
+ # (a) if an equals sign exists, the math axis is calculated
+ # on the basis of its bounding box,
+ # (b) if an equals sign does not exist, the math axis is
+ # assumed to be equal 1/4 of the design size of the font.
+ # 3. If an equals sign exists, its height and depth are calculated from
+ # the AFM bounding box; it is the only character that can have
+ # a negative depth.
+ # 4. The following characters are considered to be math operators:
+ # plus, minus, multiply, divide, plusminus, periodcentered,
+ # less, greater, greaterequal, approxequal, lessequal
+ # All the listed characters are subjected to the following
+ # uniformizing adjustments of their heights and depths:
+ # (a) a plus sign is considered first; if an equal sign is present,
+ # the height and depth of a plus sign are adjusted in such
+ # a way that the resulting bounding box is the smallest one
+ # having the following properties: it contains the AFM bounding
+ # box, depth is non-negative, and, moreover, m+d=h-m, where
+ # m is the height of the math axis, d -- resulting depth,
+ # h -- resulting height; if an equal sign is not present,
+ # plus sign receives merely a non-negative depth (see p. 1);
+ # (b) if a plus sign does not exist, it is considered to have
+ # zero height and depth;
+ # (c) the remaining characters from the list receive height and
+ # depth according to the following formula: h=max(h,h'),
+ # d=min(d,d'), where h' and d' are the height and depth of
+ # a plus sign, and h and d are, obviously, the height
+ # and depth of a given character.
+ # 5. Finally, two parameters are fixed MATH_RULE (as equal to
+ # UnderlineThickness (or 2/5pt#, if UnderlineThickness<=0),
+ # and MATH_AXIS, as equal to the value determined in p. 2.
+ # These parameters are written to the TFM file as
+ # fontdimen registers 8 and 22, respectively.
+ # COMMENT: the process of ``mathematization'' may seem somewhat
+ # arbitrary and, frankly speaking, it is. ``Though this
+ # be madness, yet there is method in 't'':
+ # * negative depths may manifest their presence only in
+ # math mode, as, according to ``The TeXbook'':
+ # The result of `\hbox' never has negative height
+ # or negative depth [...]
+ # * if accent characters have negative depths, they
+ # behave OK in the text mode, but fall too low
+ # when used as `\mathaccent' commands;
+ # * almost all math operators in CM fonts have uniformized
+ # height and depth basing on that of a plus sign;
+ # an equals sign, however, has different settings;
+ # * `\fontdimen22' of `\fam2' denotes the height of math axis,
+ # moreover, at least 22 `\fontdimen' registers are
+ # necessary for to make TeX accepting a font as
+ # a math one;
+ # * `\fontdimen8' of `\fam3' denotes the default (math) rule
+ # thickness;
+ if ("equal" in AFM_SET) {
+ math_axis=(YH[AFM_SET["equal"]]+YL[AFM_SET["equal"]])/2
+ YL[AFM_SET["equal"]]=-YL[AFM_SET["equal"]]
+ }
+ MATH_AXIS=((math_axis+0)==0 ? "9/2u#" : "V" math_axis)
+ MATH_RULE=(UnderlineThickness>0 ? "V" UnderlineThickness+0 : ".4pt#");
+ if ("plus" in AFM_SET) {
+ plus_ht=YH[AFM_SET["plus"]]
+ plus_dp=nneg(-YL[AFM_SET["plus"]])
+ plus_ht=max(plus_ht,math_axis+plus_dp)
+ }
+ math_op["minus"]=1; math_op["multiply"]=1; math_op["divide"]=1
+ math_op["plusminus"]=1; math_op["periodcentered"]=1
+ math_op["less"]=1; math_op["greater"]=1; math_op["greaterequal"]=1
+ math_op["approxequal"]=1; math_op["lessequal"]=1
+ for (m in math_op) if (m in AFM_SET) {
+ YH[AFM_SET[m]]=max(YH[AFM_SET[m]],plus_ht)
+ YL[AFM_SET[m]]=max(nneg(-YL[AFM_SET[m]]),plus_dp)
+ }
+ for (n in AFM_SET) if (n!="equal") {
+ YH[AFM_SET[n]]=nneg(YH[AFM_SET[n]])
+ YL[AFM_SET[n]]=nneg(-YL[AFM_SET[n]])
+ }
+ } else for (n in AFM_SET) YL[AFM_SET[n]]=-YL[AFM_SET[n]]
+# 2: WRITE PREAMBLE
+ getline < CV["MF1"] # skip first line
+ print "% This is a METAFONT file created by TOIL ver. " CV["VER_NO"] > CV["MF_MF"]
+ while (getline < CV["MF1"] > 0) {
+ gsub("TONEFILE", QQ CV["PSF_XNAME"] QQ)
+ gsub("ENCNNAME", QQ CV["ENC_NAME"] QQ)
+ gsub("ENCXNAME", QQ CV["ENC_XNAME"] QQ)
+ gsub("TFMNAME", QQ CV["TFM"] QQ)
+ gsub("TONENAME", QQ FontName QQ)
+ gsub("DUMMYPPI", CV["PPI"])
+ if (CV["MATHEMATIZE"]) {
+ gsub("MATHRULE", MATH_RULE)
+ gsub("MATHAXIS", MATH_AXIS)
+ }
+ gsub("MESSAGES", (CV["QUIET"] ? "true" : "false"))
+ print > CV["MF_MF"]
+ }
+ close(CV["MF1"])
+# 3: WRITE ENCODING AND ADD (OPTIONALLY) A BOUNDARY CHAR
+ enc_kind="AFM-based encoding"
+ internal_enc=1
+ if ((CV["ENC_ACT"]=="") && (CV["ENC_GVN"]!=""))
+ {mess("Encoding file", CV["ENC_GVN"], "not found (ignored)")}
+ else if (CV["ENC_ACT"]!="") {
+ getline < CV["ENC_ACT"]
+ if (!/^[ \t]*EXTERNAL ENCODING FOR TOIL/) {
+ mess(CV["ENC_ACT"], "is not an encoding file for TOIL")
+ mess("AFM encoding will be used")
+ } else {
+ mess("Encoding taken from", CV["ENC_ACT"])
+ getline enc_kind < CV["ENC_ACT"]; gsub(/ *%.*$/,"",enc_kind)
+ for (i in AFM_CN) delete AFM_CN[i]; Cmax=0
+ while (getline < CV["ENC_ACT"] > 0)
+ if ((/^[^%]/) && ($2 in AFM_SET)) {AFM_CN[$1+0]=$2; if (($1+0)>Cmax) Cmax=$1+0}
+ internal_enc=0
+ }
+ close(CV["ENC_ACT"])
+ }
+ if (B_CHAR>=0)
+ if (B_CHAR in AFM_CN)
+ mess("Slot " B_CHAR " occupied; boundary char specification ignored")
+ else {
+ AFM_C[++AFM_NUM]=B_CHAR
+ AFM_W[AFM_NUM]=0
+ AFM_N[AFM_NUM]=B_CHAR_NAME
+ AFM_SET[B_CHAR_NAME]=AFM_NUM
+ XL[AFM_NUM]=0; YL[AFM_NUM]=0; XH[AFM_NUM]=0; YH[AFM_NUM]=0
+ AFM_CN[AFM_C[AFM_NUM]]=AFM_N[AFM_NUM]
+ if (AFM_C[AFM_NUM]>Cmax) Cmax=AFM_C[AFM_NUM]
+ for (every_char in AFM_SET) if (every_char!=B_CHAR_NAME) {
+ K[B_CHAR_NAME,every_char]=-XL[AFM_SET[every_char]]
+ K[every_char,B_CHAR_NAME]=-AFM_W[AFM_SET[every_char]]+XH[AFM_SET[every_char]]
+ }
+ }
+ print "string enc_kind; enc_kind=" QQ enc_kind QQ ";" > CV["MF_MF"]
+ print "internal_enc:=" (internal_enc ? "true" : "false") ";" > CV["MF_MF"]
+ print "vardef Enc expr tit =" > CV["MF_MF"]
+ first=1
+ for (i=0; i<=Cmax; ++i) if (i in AFM_CN) {
+ print (first ? " if tit=" : " elseif tit=") QQ AFM_CN[i] QQ ":" i > CV["MF_MF"]
+ first=0
+ }
+ print " else:-1\n fi\nenddef;" > CV["MF_MF"]
+# 4: WRITE INTERAMBLE
+ getline < CV["MF2"] # skip first line
+ while (getline < CV["MF2"] > 0) {
+ gsub("XHEIGHT","V" XHeight+0);
+ if (ItalicAngle==0) {gsub("SLANT","0")}
+ else gsub("SLANT","-sind(" ItalicAngle ")/cosd(" ItalicAngle ")")
+ print > CV["MF_MF"]
+ }
+ close(CV["MF2"])
+# 5: WRITE DUMMY CHAR PROGRAMS
+ for (i=1; i<=AFM_NUM; ++i) {
+ print "char_title", QQ AFM_N[i] QQ ";" > CV["MF_MF"]
+ print "beginchar(curr_enc,H" AFM_W[i] ",V" YH[i] ",V" (YL[i]) ");" > CV["MF_MF"]
+ print "IC(H" XH[i] ",V" YH[i] "); endchar;" > CV["MF_MF"]
+ print "% ---" > CV["MF_MF"]
+ }
+# 6: CLEAN UP LIGATURES ALREADY READ IN AND READ OPTIONAL LIGATURES
+ for (i in AFM_L) {
+ split(i,u,SUBSEP) # by definition, (u[1] in AFM_SET) == true
+## if ((!(u[2] in AFM_SET)) || (!(AFM_L[i] in AFM_SET))) delete AFM_L[i]
+ if ((!(u[2] in AFM_SET)) || (!(AFM_L[i] in AFM_SET))) AFM_L[i]=""
+ }
+ if ((CV["LIG_ACT"]=="") && (CV["LIG_GVN"]!="")) {
+ mess("Ligature file", CV["LIG_GVN"], "not found (ignored)")
+ } else if (CV["LIG_ACT"]!="") {
+ getline < CV["LIG_ACT"]
+ if (!/^[ \t]*OPTIONAL LIGATURES FOR TOIL/) {
+ mess(CV["LIG_ACT"], "is not a ligature file for TOIL")
+ mess("Only AFM ligatures will be used")
+ } else {
+ mess("Ligatures taken from", CV["LIG_ACT"])
+ while (getline < CV["LIG_ACT"] > 0)
+ if ((/^[^%]/) && ($1 in AFM_SET) && ($2 in AFM_SET) && ($3 in AFM_SET)) {
+ if (($1,$2) in AFM_L) if (AFM_L[$1,$2]!=$3)
+ {# inform about collision
+ mess(" afm ligature " $1 " " $2 " " AFM_L[$1,$2])
+ mess(" new ligature " $1 " " $2 " " $3)
+ }
+ AFM_L[$1,$2]=$3
+ }
+ }
+ close(CV["LIG_ACT"])
+ }
+# 7: WRITE LIGTABLE
+# 6a: write ligatures and kerns
+## for (i in AFM_L) {
+ for (i in AFM_L) if (AFM_L[i]!="") {
+ split(i,u,SUBSEP)
+ print "LK(" QQ u[1] QQ ")" > CV["MF_MF"]
+ print " LP(" QQ u[2] QQ "," QQ AFM_L[i] QQ ")" > CV["MF_MF"]
+## delete AFM_L[i]
+ AFM_L[i]=""
+## for (j in AFM_L) {
+ for (j in AFM_L) if (AFM_L[j]!="") {
+ split(j,v,SUBSEP)
+ if (v[1]==u[1]) {
+ print " LP(" QQ v[2] QQ "," QQ AFM_L[j] QQ ")" > CV["MF_MF"]
+## delete AFM_L[j]
+ AFM_L[j]=""
+ }
+ }
+## for (j in K) {
+ for (j in K) if (K[j]!="") {
+ split(j,v,SUBSEP)
+ if (v[1]==u[1]) {
+ print " KP(" QQ v[2] QQ ",H" K[j] ")" > CV["MF_MF"]
+## delete K[j]
+ K[j]=""
+ }
+ }
+ print "KL;" > CV["MF_MF"]
+ }
+# 6b: write remaining kerns
+## for (i in K) {
+ for (i in K) if (K[i]!="") {
+ split(i,u,SUBSEP)
+ print "LK(" QQ u[1] QQ ")" > CV["MF_MF"]
+ print " KP(" QQ u[2] QQ ",H" K[i] ")" > CV["MF_MF"]
+## delete K[i]
+ K[i]=""
+ for (j in K) if (K[j]!="") {
+ split(j,v,SUBSEP)
+ if (v[1]==u[1]) {
+ print " KP(" QQ v[2] QQ ",H" K[j] ")" > CV["MF_MF"]
+## delete K[j]
+ K[j]=""
+ }
+ }
+ print "KL;" > CV["MF_MF"]
+ }
+# 8: WRITE POSTAMBLE
+ getline < CV["MF3"] # skip first line
+ while (getline < CV["MF3"] > 0) print > CV["MF_MF"]
+ close(CV["MF3"])
+# 9: SAY BYE
+ if ((!CV["QUIET"]) && (LOG!="")) print "Transcript written on " LOG > "CON"
+}
+
+# ==========================================================================
+
+function max(x,y) {return (x>y ? x : y)}
+function abs(x) {return (x>0 ? x : -x)}
+function nneg(x) {return max(x,0)}
+function round(x) {return (x>0 ? int(x+.5) : -int(-x+.5))}
+
+function is_digit(n) {# let's be explicit here; it suffices that it is used
+ # in a tricky way...
+ return (n~/^(zero|one|two|three|four|five|six|seven|eight|nine)$/?1:0)
+}
+
+function errmess(e,s1,s2,s3) {# at most three parts may occur
+ mess("TOIL ERROR:",s1, s2, s3); exit(e)
+}
+
+function mess(s1,s2,s3,s4, s) {# at most four parts may occur
+ s=s1; if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4
+ if (length(s)<=max_line) {
+ if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG
+ } else {
+ if ((!CV["QUIET"]) && (s1!="")) print s1 > "CON"
+ if ((LOG!="") && (s1!="")) print s1 > LOG
+ if ((!CV["QUIET"]) && (s2!="")) print s2 > "CON"
+ if ((LOG!="") && (s2!="")) print s2 > LOG
+ if ((!CV["QUIET"]) && (s3!="")) print s3 > "CON"
+ if ((LOG!="") && (s3!="")) print s3 > LOG
+ if ((!CV["QUIET"]) && (s4!="")) print s4 > "CON"
+ if ((LOG!="") && (s4!="")) print s4 > LOG
+ }
+}
+
+function get_tmp_cfg_item(item_name, item) {
+ CV[$1]=$0; gsub("^" $1 " +", "", CV[$1]);
+}
+
+function get_tmp_config (TMP_CFG, v) {
+ while (getline < TMP_CFG > 0) get_tmp_cfg_item()
+# for (v in CV) printf("%20s %s\n", v, CV[v])
+ TMP_TMP=CV["TMP_TMP"]
+ TMP_ENC=CV["TMP_ENC"]
+ TMP_MAP=CV["TMP_MAP"]
+ B_CHAR=CV["B_CHAR"]+0
+}
+
+function fix_const() {
+# GENERAL CONSTANTS (used also in toila.awk and toilc.awk)
+ QQ="\""
+ max_line=79 # screen limit
+ max_sys_line=127 # MSDOS limit
+ TMP_CFG="~t~m~p~.cfg"
+}
diff --git a/fonts/utilities/t1install/toil/toilc.awk b/fonts/utilities/t1install/toil/toilc.awk
new file mode 100644
index 0000000000..acce935d86
--- /dev/null
+++ b/fonts/utilities/t1install/toil/toilc.awk
@@ -0,0 +1,75 @@
+#This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL
+#This package is public domain : Pakiet stanowi dobro powszechne
+#For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC''
+#============================================================================
+# AUXILIARY TASK FILE: extracts relevant information from the MF LOG-file
+# ==========================================================================
+BEGIN {
+ fix_const(); get_tmp_config(TMP_CFG)
+# GET AND CHECK THE FIRST LINE OF THE METAFONT LOG FILE
+ getline
+ if (!/^This is (METAFONT|MetaPost)/)
+ mess("Are you sure that", FILENAME, "is a METAFONT/MetaPost log file?")
+}
+
+/^:ENC:/ {was_ENC=1; print substr($0,6) > TMP_ENC}
+/^:MAP:/ {was_MAP=1; map_line=map_line (map_line!="" ? " " : "") substr($0,6)}
+
+END {
+ if (was_MAP) {
+ print map_line >> TMP_MAP
+ if (CV["MAP"]=="") xmess=" newly created"
+ mess("Font info appended to" xmess,
+ sys_conc(CV["RES_MAP_DIR"], CV["USER_MAP"]))
+ }
+ if (was_ENC) mess("Encoding extracted to",
+ sys_conc(CV["RES_ENC_DIR"], CV["ENC_NAME"] CV["RES_ENC_EXT"]))
+ mess("Font metrics moved to", sys_conc(CV["RES_TFM_DIR"], CV["MF"] ".tfm"))
+ if ((!CV["QUIET"]) && (LOG!="")) print "Transcript written on " LOG > "CON"
+}
+
+# ==========================================================================
+
+function mess(s1,s2,s3,s4, s) {# at most four parts may occur
+ s=s1; if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4
+ if (length(s)<=max_line) {
+ if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG
+ } else {
+ if ((!CV["QUIET"]) && (s1!="")) print s1 > "CON"
+ if ((LOG!="") && (s1!="")) print s1 > LOG
+ if ((!CV["QUIET"]) && (s2!="")) print s2 > "CON"
+ if ((LOG!="") && (s2!="")) print s2 > LOG
+ if ((!CV["QUIET"]) && (s3!="")) print s3 > "CON"
+ if ((LOG!="") && (s3!="")) print s3 > LOG
+ if ((!CV["QUIET"]) && (s4!="")) print s4 > "CON"
+ if ((LOG!="") && (s4!="")) print s4 > LOG
+ }
+}
+
+function sys_conc(a, b) {# a -- directory, b -- file name
+ if ((a=="") || (b ~ /:/)) return b
+ else if (b=="") return a
+ else return sys_name(a (a ~ /:$/ ? "" : "/" ) b)
+}
+function sys_name(n) {gsub(/\\+/,"/",n); gsub(/\/+/,"\\",n); return n}
+
+function get_tmp_cfg_item(item_name, item) {
+ CV[$1]=$0; gsub("^" $1 " +", "", CV[$1]);
+}
+
+function get_tmp_config (TMP_CFG, v) {
+ while (getline < TMP_CFG > 0) get_tmp_cfg_item()
+# for (v in CV) printf("%20s %s\n", v, CV[v])
+ TMP_TMP=CV["TMP_TMP"]
+ TMP_ENC=CV["TMP_ENC"]
+ TMP_MAP=CV["TMP_MAP"]
+}
+
+function fix_const() {
+# GENERAL CONSTANTS (used also in toila.awk and toilb.awk)
+ QQ="\""
+ max_line=79 # screen limit
+ max_sys_line=127 # MSDOS limit
+ TMP_CFG="~t~m~p~.cfg"
+}
+
diff --git a/fonts/utilities/t1tools/afm-inf.bat b/fonts/utilities/t1tools/afm-inf.bat
new file mode 100644
index 0000000000..e88bb004c3
--- /dev/null
+++ b/fonts/utilities/t1tools/afm-inf.bat
@@ -0,0 +1,64 @@
+@echo off
+set dumvar=
+set del=
+if not "%1"=="-" goto mach
+set del=rem
+shift
+
+:mach
+egrep CapHeight %1.afm > %1.inf
+if not errorlevel 1 goto capok
+egrep FontBBox %1.afm | sed "s,.* \([-0-9][-0-9]*\) *$,CapHeight \1," > %1.inf
+:capok
+echo Serif true >> %1.inf
+echo Pi false >> %1.inf
+:getstyle
+if "%3"=="" goto genstyle
+echo VPStyle (%3) >> %1.inf
+goto getname
+:genstyle
+egrep "FontName.*(Demi|Semi|Bold|Heavy|Black|Ultra|Three)" %1.afm > nul
+if errorlevel 1 goto testweight
+goto testobl
+:testweight
+egrep "Weight.*(Demi|Semi|Bold|Heavy|Black|Ultra)" %1.afm > nul
+if errorlevel 1 goto notbold
+:testobl
+egrep "FontName.*(Italic|Oblique|Slanted)" %1.afm > nul
+if errorlevel 1 goto bold
+echo ItalicAngle -20 >> %1.inf
+echo VPStyle (T) >> %1.inf
+goto getname
+:bold
+echo VPStyle (B) >> %1.inf
+goto getname
+:notbold
+egrep "FontName.*(Italic|Oblique|Slanted)" %1.afm > nul
+if errorlevel 1 goto normal
+echo ItalicAngle -20 >> %1.inf
+echo VPStyle (I) >> %1.inf
+goto getname
+:normal
+echo VPStyle (N) >> %1.inf
+
+:getname
+if "%2"=="" goto genname
+if "%2"=="-" goto genname
+if not "%3"=="" echo DOS command restriction: family name may not contain blanks
+echo MSMenuName (%2) >> %1.inf
+goto end
+
+rem this was used with dos grep and without sed:
+:gennameold
+grep FamilyName %1.afm | sort > MSMenu$$.bat
+call MSMenu$$.bat
+type MSMenu$$.i >> %1.inf
+%del% del MSMenu$$.bat
+%del% del MSMenu$$.i
+goto end
+
+:genname
+egrep -e FamilyName %1.afm | sed "s,FamilyName *\(.*\) *$,MSMenuName (\1)," >> %1.inf
+rem with DOS grep, grep -o could be used here instead of egrep -e
+
+:end
diff --git a/fonts/utilities/t1tools/afm-pfm.bat b/fonts/utilities/t1tools/afm-pfm.bat
new file mode 100644
index 0000000000..a9fa22bc8f
--- /dev/null
+++ b/fonts/utilities/t1tools/afm-pfm.bat
@@ -0,0 +1,93 @@
+@echo off
+set dumvar=
+set del=
+if not "%1"=="-" goto mach
+set del=rem
+shift
+
+:mach
+if exist %1.afm goto los
+echo "Parameter: [-] fontfile [without afm suffix] [MSMenuName | - ] [N | I | B | T]"
+goto end
+
+:los
+set enc=C:\Adobe\foundry\w
+if exist %1.enc set enc=%1
+if exist %1.inf goto makepfminf
+
+egrep CapHeight %1.afm > %1.inf
+if not errorlevel 1 goto capok
+egrep FontBBox %1.afm | sed "s,.* \([-0-9][-0-9]*\) *$,CapHeight \1," > %1.inf
+:capok
+echo Serif true >> %1.inf
+echo Pi false >> %1.inf
+:getstyle
+if "%3"=="" goto genstyle
+echo VPStyle (%3) >> %1.inf
+goto getname
+:genstyle
+egrep "FontName.*(Demi|Semi|Bold|Heavy|Black|Ultra|Three)" %1.afm > nul
+if errorlevel 1 goto testweight
+goto testobl
+:testweight
+egrep "Weight.*(Demi|Semi|Bold|Heavy|Black|Ultra)" %1.afm > nul
+if errorlevel 1 goto notbold
+:testobl
+egrep "FontName.*(Italic|Oblique|Slanted)" %1.afm > nul
+if errorlevel 1 goto bold
+echo ItalicAngle -20 >> %1.inf
+echo VPStyle (T) >> %1.inf
+goto getname
+:bold
+echo VPStyle (B) >> %1.inf
+goto getname
+:notbold
+egrep "FontName.*(Italic|Oblique|Slanted)" %1.afm > nul
+if errorlevel 1 goto normal
+echo ItalicAngle -20 >> %1.inf
+echo VPStyle (I) >> %1.inf
+goto getname
+:normal
+echo VPStyle (N) >> %1.inf
+
+:getname
+if "%2"=="" goto genname
+if "%2"=="-" goto genname
+if not "%3"=="" echo DOS command restriction: family name may not contain blanks
+echo MSMenuName (%2) >> %1.inf
+goto makepfm
+
+rem this was used with dos grep and without sed:
+:gennameold
+grep FamilyName %1.afm | sort > MSMenu$$.bat
+call MSMenu$$.bat
+type MSMenu$$.i >> %1.inf
+%del% del MSMenu$$.bat
+%del% del MSMenu$$.i
+goto makepfm
+
+:genname
+egrep -e FamilyName %1.afm | sed "s,FamilyName *\(.*\) *$,MSMenuName (\1)," >> %1.inf
+rem with DOS grep, grep -o could be used here instead of egrep -e
+
+:makepfm
+C:\Adobe\foundry\makepfm.exe -e %enc%.enc -i %1.inf -l nul %1.afm
+%del% del %1.inf
+if exist %1.pfm goto end
+goto error
+
+:makepfminf
+C:\Adobe\foundry\makepfm.exe -e %enc%.enc -i %1.inf -l nul %1.afm
+if exist %1.pfm goto end
+
+:error
+echo off
+echo makepfm failed. Possible errors:
+echo 1. CapHeight entry must be present (last value of B box of letter H)
+echo 2. StartCharMetrics entry must contain exact number of character entries
+echo 3. Character entries must have B box information. To fake them, take
+echo the FontBBox x1 y1 x2 y2 entry and insert behind every character's
+echo N (name) entry: B x1 y1 x2 y2 ;
+echo 4. makepfm doesn't seem to like character position 0 in afm files
+echo 5. .inf file was not built properly
+:end
diff --git a/fonts/utilities/t1tools/afm-sort.bat b/fonts/utilities/t1tools/afm-sort.bat
new file mode 100644
index 0000000000..2604ada5e0
--- /dev/null
+++ b/fonts/utilities/t1tools/afm-sort.bat
@@ -0,0 +1,14 @@
+@echo off
+set dumvar=
+set del=
+if not "%1"=="-" goto mach
+set del=rem
+shift
+
+:mach
+sed -e /StartFontMetrics/,/StartKernPairs/p -e d %1.afm > %1.afs
+egrep KPX %1.afm | sort >> %1.afs
+sed -e /EndKernPairs/,/EndFontMetrics/p -e d %1.afm >> %1.afs
+%del% if exist %1.af$ del %1.af$
+ren %1.afm %1.af$
+ren %1.afs %1.afm
diff --git a/fonts/utilities/t1tools/apple.enc b/fonts/utilities/t1tools/apple.enc
new file mode 100644
index 0000000000..b116cc915e
--- /dev/null
+++ b/fonts/utilities/t1tools/apple.enc
@@ -0,0 +1,173 @@
+%
+% This encoding vector represents the differences between the PostScript
+% standard encoding and the AppleStandardEncoding character set.
+% assembled by Thomas Wolff - Dec 92
+%
+MaxIndex 255
+MaxEncoded 255
+%
+StartEncoding
+0 NUL
+1 Eth
+2 eth
+3 Lslash
+4 lslash
+5 Scaron
+6 scaron
+7 Yacute
+8 yacute
+9 HT
+10 LF
+11 Thorn
+12 thorn
+13 CR
+14 Zcaron
+15 zcaron
+16 DLE
+17 DC1
+18 DC2
+19 DC3
+20 DC4
+21 onehalf
+22 onequarter
+23 onesuperior
+24 threequarters
+25 threesuperior
+26 twosuperior
+27 brokenbar
+28 minus
+29 multiply
+30 RS
+31 US
+39 quotesingle
+96 grave
+127 DEL
+128 Adieresis
+129 Aring
+130 Ccedilla
+131 Eacute
+132 Ntilde
+133 Odieresis
+134 Udieresis
+135 aacute
+136 agrave
+137 acircumflex
+138 adieresis
+139 atilde
+140 aring
+141 ccedilla
+142 eacute
+143 egrave
+144 ecircumflex
+145 edieresis
+146 iacute
+147 igrave
+148 icircumflex
+149 idieresis
+150 ntilde
+151 oacute
+152 ograve
+153 ocircumflex
+154 odieresis
+155 otilde
+156 uacute
+157 ugrave
+158 ucircumflex
+159 udieresis
+160 dagger
+161 degree
+162 cent
+163 sterling
+164 section
+165 bullet
+166 paragraph
+167 germandbls
+168 registered
+169 copyright
+170 trademark
+171 acute
+172 dieresis
+173 notequal
+174 AE
+175 Oslash
+176 infinity
+177 plusminus
+178 lessequal
+179 greaterequal
+180 yen
+181 mu
+182 partialdiff
+183 summation
+184 product
+185 pi
+186 integral
+187 ordfeminine
+188 ordmasculine
+189 Omega
+190 ae
+191 oslash
+192 questiondown
+193 exclamdown
+194 logicalnot
+195 radical
+196 florin
+197 approxequal
+198 Delta
+199 guillemotleft
+200 guillemotright
+201 ellipsis
+202 nbspace
+203 Agrave
+204 Atilde
+205 Otilde
+206 OE
+207 oe
+208 endash
+209 emdash
+210 quotedblleft
+211 quotedblright
+212 quoteleft
+213 quoteright
+214 divide
+215 lozenge
+216 ydieresis
+217 Ydieresis
+218 fraction
+219 currency
+220 guilsinglleft
+221 guilsinglright
+222 fi
+223 fl
+224 daggerdbl
+225 periodcentered
+226 quotesinglbase
+227 quotedblbase
+228 perthousand
+229 Acircumflex
+230 Ecircumflex
+231 Aacute
+232 Edieresis
+233 Egrave
+234 Iacute
+235 Icircumflex
+236 Idieresis
+237 Igrave
+238 Oacute
+239 Ocircumflex
+240 apple
+241 Ograve
+242 Uacute
+243 Ucircumflex
+244 Ugrave
+245 dotlessi
+246 circumflex
+247 tilde
+248 macron
+249 breve
+250 dotaccent
+251 ring
+252 cedilla
+253 hungarumlaut
+254 ogonek
+255 caron
+EndEncoding
diff --git a/fonts/utilities/t1tools/fm.ps b/fonts/utilities/t1tools/fm.ps
new file mode 100644
index 0000000000..649c0fdc81
--- /dev/null
+++ b/fonts/utilities/t1tools/fm.ps
@@ -0,0 +1 @@
+/deviceinfo 0 dict def
diff --git a/fonts/utilities/t1tools/getmetri.bat b/fonts/utilities/t1tools/getmetri.bat
new file mode 100644
index 0000000000..7f68f3cf7a
--- /dev/null
+++ b/fonts/utilities/t1tools/getmetri.bat
@@ -0,0 +1,60 @@
+@echo off
+if not "%1"=="-" goto weiter
+set dumvar=
+set del=rem
+shift
+:weiter
+if not "%1"=="" goto los
+echo Parameter: font-file (without .pfb / .pfa suffix) [/FontName]
+goto end
+
+:los
+rem copy %GS_LIB%\getmetri.ps %TEMP%\getafm$$.ps
+if exist %1.pfa goto pfa
+if exist %1.pfb goto pfb
+echo no font file (.pfb / .pfa) present
+goto end
+:pfa
+type %1.pfa > %TEMP%\getafm$$.ps
+goto fontok
+:pfb
+D:\fonts\progs\t1utils\t1ascii %1.pfb > %TEMP%\getafm$$.ps
+:fontok
+echo appendnewfont >> %TEMP%\getafm$$.ps
+echo fontname %2 getmetric0 quit >> %TEMP%\getafm$$.ps
+
+rem try to save kerning information from previous .afm file
+rem or to extract it from .pfm file
+if exist %1.afm goto afmkern
+if not exist %1.pfm goto startafm
+echo extracting kerning information from %1.pfm
+pfm2afm %1
+rem dumppfm %1.pfm %1.afm
+
+:afmkern
+rem echo saving kerning information from %1.afm
+rem egrep -e "^(StartKern|EndKern|KPX)" %1.afm > %TEMP%\%1.kpx
+echo saving Composite and KernData information from %1.afm
+rem sed -e /StartComposites/,/EndComposites/p -e /StartKernData/,/EndKernData/p -e d < %1.afm > %TEMP%\%1.kpx
+sed -e /EndCharMetrics/,/EndFontMetrics/p -e d < %1.afm > %TEMP%\%1.kpx
+
+:startafm
+echo generating afm information
+gs -q -DNODFONT -DNODISPLAY getmetri.ps %TEMP%\getafm$$.ps | sed -e /StartFontMetrics/,$p -e d > %1.afm
+
+rem insert previously extracted or saved kerning information
+if not exist %TEMP%\%1.kpx goto nokern
+echo adding kerning and composite information
+type %TEMP%\%1.kpx >> %1.afm
+rem if sorting of KPX entries is desired, they must be kept apart from CC etc
+rem egrep -e "^StartKern" %TEMP%\%1.kpx >> %1.afm
+rem egrep -e "^KPX" %TEMP%\%1.kpx | sort >> %1.afm
+rem egrep -e "^EndKern" %TEMP%\%1.kpx >> %1.afm
+goto fini
+:nokern
+echo EndCharMetrics>> %1.afm
+echo EndFontMetrics>> %1.afm
+:fini
+if exist %TEMP%\%1.kpx %del% del %TEMP%\%1.kpx
+%del% del %TEMP%\getafm$$.ps
+:end
diff --git a/fonts/utilities/t1tools/getmetri.ps b/fonts/utilities/t1tools/getmetri.ps
new file mode 100644
index 0000000000..cf2cec0be1
--- /dev/null
+++ b/fonts/utilities/t1tools/getmetri.ps
@@ -0,0 +1,298 @@
+%!
+% Get the Font Metric Information from a font
+
+% Written by W.T. Roberts, Queen Mary College, LONDON UK
+% (liam@cs.qmc.ac.uk, liam@qmc-cs.UUCP)
+
+% modified 3/91 by Bryan Bayerdorffer, UT Austin, Austin, TX, USA
+% (bryan@cs.utexas.edu)
+
+% modified 4/93 by Thomas Wolff (wolff@inf.fu-berlin.de):
+% must discard UniqueID as well as FID when generating modified font copy
+% ligature information must only be printed if ligatures are present
+% the availability of the four CapHeight etc entries is decided separately
+% to allow CapHeight to be generated even if the font does not
+% contain small characters
+% if no CapHeight can be determined (because there is no letter "H") the
+% height value of FontBBox is taken instead - Adobe's makepfm
+% program requires the presence of this entry
+% moved the FontName line behind the Comment lines
+% added the EncodingScheme information
+% now printing FontInfo contents in well-defined order
+% added character count in StartCharMetrics
+% changed BBox information for null characters to 0 0 0 0
+% don't generate entries for undefined characters, even if included in
+% the font's encoding
+% getmetric0 variant leaves out final "End..." entries to simplify
+% merging in kerning and composite information from other sources
+% added code for automatic new font name detection to enable cooperation
+% with simple MSDOS batch script
+
+%statusdict begin 0 setjobtimeout end
+
+/xdef {exch def} def
+/sp {( ) print} def
+/nl {(\n) print flush} def
+/eof {(\034) print flush} def %Amiga end-of-file
+
+/= { %dup type (stringtype) ne {
+ buffer cvs
+ %} if
+ print} def
+/toupper {
+ dup dup (a) 0 get ge exch (z) 0 get le and
+ {(a) 0 get sub (A) 0 get add} if % convert to lowercase
+} def
+
+/buffer 250 string def
+
+/getmetric0 {
+% /VMsave save def
+ dup findfont /fontdict xdef % grab the font
+ (StartFontMetrics 1.0) print nl
+ (Comment generated by getmetric.ps (by W.T. Roberts, qmc-cs.UUCP)) print nl
+ (Comment (modified 3/91 by Bryan Bayerdorffer, 4/93 by Thomas Wolff)) print nl
+ (FontName ) print = nl % record PostScript name
+ getFontInfo
+ getEncodingScheme
+ getFontBBox
+ iniBBox
+ recorddefaults % get the default encoding
+ miscHeights
+ recordunencoded
+ (StartCharMetrics ) print #name = nl
+ getCharMetrics
+ checkBBox
+% VMsave restore
+} def
+
+/getmetric {
+ getmetric0
+ (EndCharMetrics) print nl
+ (EndFontMetrics) print nl
+} def
+
+/iniBBox { /llx 1000 def /lly 1000 def /urx -1000 def /ury -1000 def } def
+
+/checkBBox {
+ llx BBllx 1 sub lt
+ lly BBlly 1 sub lt
+ urx BBurx 1 add gt
+ ury BBury 1 add gt
+ or or or
+ {(Comment calculated FontBBox) print
+ ury urx lly llx
+ 4 {sp =} repeat % convert to 1000 point and print
+ nl
+ } if
+} def
+
+/getFontInfo {
+ fontdict /FontInfo known
+ {fontdict /FontInfo get
+ {exch buffer cvs dup
+ dup 0 get toupper 0 exch put % convert first letter to UC
+ print sp = nl} forall
+ }
+ if
+} def
+
+/getFontInfo {
+ fontdict /FontInfo known
+ {fontdict /FontInfo get
+ [/FullName /FamilyName /Weight /ItalicAngle /isFixedPitch
+ /UnderlinePosition /UnderlineThickness /version /Notice]
+ {2 copy known
+ {2 copy get
+ exch buffer cvs dup
+ dup 0 get toupper 0 exch put % convert first letter to upper case
+ print sp = nl}
+ {pop}
+ ifelse
+ }
+ forall
+ }
+ if
+} def
+
+/getFontBBox {
+ fontdict /FontMatrix get dup
+ length array /fmat xdef
+ fmat copy pop
+ fontdict /FontBBox get aload pop % llx lly trx try
+ fmat transform 4 2 roll fmat transform % TRX TRY LLX LLY
+ 4 {1000 mul round cvi 4 1 roll} repeat % convert to 1000 point
+ (FontBBox) print
+ 4 copy /BBlly xdef /BBllx xdef /BBury xdef /BBurx xdef
+ 2 {exch sp = sp =} repeat
+ nl
+} def
+
+/getEncodingScheme {
+ /EncodingScheme (FontSpecific) def % the default
+ fontdict /Encoding get
+ dup StandardEncoding eq
+ {/EncodingScheme (AdobeStandardEncoding) def} if
+ dup SymbolEncoding eq
+ {/EncodingScheme (SymbolEncoding) def} if
+ % others...
+ pop
+ (EncodingScheme ) print EncodingScheme print nl
+} def
+
+/maketempfont { % encoding vector
+ fontdict length dict /testdict xdef
+ fontdict
+ { 1 index dup /FID ne exch /UniqueID ne and
+ {testdict 3 1 roll put} {pop pop} ifelse
+ } forall % copy contents of fontdict
+ testdict begin
+ /Encoding encoding def
+ end % install the encoding vector
+ /TestName testdict definefont 1000 scalefont setfont
+} def
+
+/recorddefaults {
+ fontdict /CharStrings known
+ {fontdict /CharStrings get length
+ 256 gt
+ {fontdict /CharStrings get length}
+ {256}
+ ifelse}
+ {256}
+ ifelse
+ array /names xdef % make array to hold the names
+ /#name 0 def
+ /defaultEncoding 256 dict def
+ fontdict begin
+ defaultEncoding begin
+ 0 1 Encoding length 1 sub
+ {dup Encoding exch get dup
+ dup /.notdef ne % ignore .notdef ...
+ exch fontdict /CharStrings known
+ {fontdict /CharStrings get exch known} % and undefined characters
+ {pop true}
+ ifelse
+ and
+ {dup recordname exch def}
+ {pop pop}
+ ifelse % record number
+ } for
+ end
+ end
+} def
+
+/recordname {
+ userdict begin
+ names exch #name exch put
+ /#name #name 1 add def
+ end
+} def
+
+/recordunencoded {
+ fontdict /CharStrings known
+ {fontdict /CharStrings get
+ {pop dup dup
+ /.notdef eq exch % ignore .notdef
+ defaultEncoding exch known or % and defaultEncoding names
+ {pop} {recordname} ifelse
+ } forall
+ }
+ if
+} def
+
+/getCharMetrics {
+ 256 array /encoding xdef
+ /namecount #name def /first 0 def
+ % while (true)
+ {namecount 256 le
+ {names first namecount getinterval}
+ {names first 256 getinterval}
+ ifelse
+ encoding copy pop
+ maketempfont
+ 0 1 encoding length namecount le
+ {encoding length 1 sub}
+ {namecount 1 sub}
+ ifelse
+ {getcharmetric}
+ for
+ /namecount namecount 256 sub def
+ /first first 256 add def
+ namecount 0 le {exit} if
+ } loop
+} def
+
+/miscHeights {
+ /encoding fontdict /Encoding get def maketempfont % make real font
+ defaultEncoding begin
+ currentdict /H known
+ {H nbbox (CapHeight ) print dup = nl 4p}
+ {(CapHeight ) print BBury = nl} ifelse
+ currentdict /x known
+ {x nbbox (XHeight ) print dup = nl 4p} if
+ currentdict /d known
+ {d nbbox (Ascender ) print dup = nl 4p} if
+ currentdict /p known
+ {p nbbox (Descender ) print 2 index = nl 4p} if
+ end
+} def
+
+/4p {pop pop pop pop} def
+/nbbox {char exch 0 exch put charbbox} def
+/charbbox {
+ newpath 0 0 moveto char true charpath flattenpath pathbbox
+ 4 {4 1 roll round cvi} repeat
+} def
+
+/char ( ) def
+/getcharmetric {
+ /n exch def % grab the character code
+ char 0 n put % make a string from it
+ /label encoding n get def % record its text name
+ (C ) print
+ defaultEncoding label known
+ {defaultEncoding label get} {-1} ifelse
+ = ( ; ) print
+ char stringwidth round cvi /ywidth exch def round cvi /xwidth exch def
+ ywidth 0 eq
+ {(WX ) print xwidth = }
+ {(W ) print xwidth = sp ywidth =}
+ ifelse
+ ( ; N ) print label =
+ ( ; B) print
+ charbbox
+ dup 3 index eq 2 index 5 index eq and
+ {pop pop pop pop 0 0 0 0} if
+ 4 copy
+ ury max /ury xdef urx max /urx xdef lly min /lly xdef llx min /llx xdef
+ 4 2 roll 2 {exch sp = sp =} repeat
+ label /f eq
+ {fontdict /CharStrings known
+ {fontdict /CharStrings get
+ dup /fi known
+ {( ; L i fi) print}
+ if
+ /fl known
+ {( ; L l fl) print}
+ if
+ }
+ if
+ }
+ if
+ ( ;) print nl
+} def
+%end
+
+/fontlist [] def
+/FontDirectoryKnown FontDirectory dup length 20 add dict copy def
+/appendnewfont {
+ /fontlist [ fontlist aload pop
+ FontDirectoryKnown begin
+ FontDirectory
+ {FontDirectoryKnown 2 index known {pop pop} {2 copy def pop} ifelse
+ } forall
+ end
+ ] def
+ } def
+/fontname {fontlist 0 get} def
diff --git a/fonts/utilities/t1tools/getmetric b/fonts/utilities/t1tools/getmetric
new file mode 100644
index 0000000000..e58a2a6603
--- /dev/null
+++ b/fonts/utilities/t1tools/getmetric
@@ -0,0 +1,67 @@
+#! /bin/sh
+
+afmdir=${afmdir-afm}
+
+pfafontname () {
+ sed -e '/\<eexec\>/q' -e '/\<CharStrings\>/q' |
+ sed -e 's,.*FontName *[[{(]\(.*\)[]})].*,\1,' -e t \
+ -e 's,.*FontName[ /]*\([^ ]*\).*,\1,' -e t \
+ -e d
+ }
+
+for file in $*
+do font=`basename $file .pfb`
+ font=`basename $font .pfa`
+ if [ ! -f $font.pfa ]
+ then t1ascii $font.pfb $font.pfa
+ delpfa=/bin/rm
+ else delpfa=#
+ fi
+ FontName=`pfafontname < $font.pfa`
+
+ if [ -f $font.afm ]
+ then echo saving Composite and KernData information from old afm
+ # sed -e /StartComposites/,/EndComposites/p -e /StartKernData/,/EndKernData/p -e d < $font.afm > $font.cck
+ sed -e /EndCharMetrics/,/EndFontMetrics/p -e d < $font.afm > $font.cck
+ elif [ -f $font.pfm ]
+ then
+ echo EndCharMetrics > $font.cck
+ set - ` ( /bin/dd ibs=1 skip=195 count=2 < $font.pfm | /bin/dd conv=swab | /bin/od -d ) 2> /dev/null `
+ pairs=`expr $2 + 0`
+ if [ $pairs -ne 0 ]
+ then
+ WinANSI=`dirname $0`/WinANSI
+ len=`expr $pairs \* 4`
+
+ set - ` ( /bin/dd ibs=1 skip=131 count=4 < $font.pfm | /bin/dd conv=swab | /bin/od -d ) 2> /dev/null `
+ start=`expr $3 \* 65536 + $2 + 2`
+
+ echo StartKernData >> $font.cck
+ echo StartKernPairs $pairs >> $font.cck
+
+ /bin/dd ibs=1 skip=$start count=$len < $font.pfm | /bin/dd conv=swab |
+ /bin/od -vbiw4 |
+ sed -e '/^0/N' -e 's,^[0-7]* *\([0-7]*\) \([0-7]*\) [0-7]* [0-7]*[^-0-9]*[-0-9]* *\([-0-9]*\)$,KPX C\2 C\1 \3,' -f ${WinANSI}1 |
+ sed -f ${WinANSI}2 >> $font.cck
+
+ echo EndKernPairs >> $font.cck
+ echo EndKernData >> $font.cck
+ else
+ echo no kern pairs in $font.pfm
+ fi
+ echo EndFontMetrics >> $font.cck
+ fi
+
+ echo /$FontName getmetric0 | gs -DNODISPLAY -q $font.pfa getmetri.ps - > $font.afm
+
+ if [ -f $font.cck ]
+ then cat $font.cck >> $font.afm
+ fi
+
+ eval $delpfa $font.pfa
+ /bin/rm $font.cck
+ if [ -d $afmdir ]
+ then ln $font.afm $afmdir/$FontName.afm
+ else ln $font.afm $FontName.afm
+ fi
+done
diff --git a/fonts/utilities/t1tools/gpreview b/fonts/utilities/t1tools/gpreview
new file mode 100644
index 0000000000..dbeed59505
--- /dev/null
+++ b/fonts/utilities/t1tools/gpreview
@@ -0,0 +1,277 @@
+#! /bin/sh
+
+case `basename $0` in
+ gprev*) show="cat > /tmp/gs$$.ps; gs /tmp/gs$$.ps < /dev/tty; rm -f /tmp/gs$$.ps"; prep="erasepage 20 780 sethome" ;;
+ prev*) show=psh ; prep="erasepage 20 780 sethome" ;;
+ pspre*) show=cat ; prep="12 setfontsize" ;;
+ *) show=lpr ; prep="12 setfontsize" ;;
+esac
+
+psatops () {
+# 3 further transformations on decomp's output:
+# ^M -> ^J : to edit it on unix machines
+# < > -> { } : to make it a PostScript program
+# remove access restriction operators to play around with it in an
+# interactive PostScript interpreter
+ sed -e 'y/ <>/\n{}/' -e 's/executeonly//g' -e 's/noaccess//g' -e 's/readonly//g'
+ }
+
+pfbtops () {
+ if t1disasm $1
+ then true # t1disasm did the job
+ elif decrypt $1 | decomp | psatops
+ then true # decrypt, decomp did the job
+ else false # no one found to do the job
+ fi
+ }
+
+pfbtopfa () {
+ if t1ascii $1
+ then true # t1ascii did the job
+ elif pfb2ps < $1
+ then true # one of numerous PD programs could do this simple job
+ else case $1 in
+ *.pfb) fmAdobePCFont $1 ${TMPDIR-/tmp}/$$.pfa ;;
+ *.pfe|*.rsrc) fmAdobeMacFont $1 ${TMPDIR-/tmp}/$$.pfa ;;
+ esac
+ # this should be found in $FMHOME/bin
+ # it runs slower than others
+ cat ${TMPDIR-/tmp}/$$.pfa
+ /bin/rm ${TMPDIR-/tmp}/$$.pfa
+ fi
+ }
+
+((cat
+echo $prep
+if [ "$show" = "psh" ]
+then cat $HOME/ps/emulate.ps - << \*EOP*
+%!
+% (emulate.ps) run % alternatively to cat-ting it in
+/eexec {pop} def
+/*definefont /definefont load def
+/definefont {dup /FontType get 1 eq
+ {dup length 3 add dict copy
+ dup /FontType 3 put
+ dup /Type1EmuDict dup load put
+ dup /BuildChar dup load put
+ } if
+ 1 index registername % this could be left out if only
+ % new fonts (not preloaded into NeWS) are displayed
+ *definefont
+ } def
+/*closefile /closefile load def
+/closefile {pop} def % NeWS's closefile crashes
+/executeonly {} def
+/noaccess {} def
+/readonly {} def
+*EOP*
+fi
+for param in $*
+do if [ `dirname $param` = / ]
+ then echo $param registername
+ # take this as explicitly specified fontname instead of filename
+ else
+ case $param in
+ *.pfb|*.pfe|*.rsrc)
+ if [ "$show" = "psh" ]
+ then pfbtops $param
+ else pfbtopfa $param
+ fi
+ echo appendnewfont ;;
+ *.pfa) if [ "$show" = "psh" ]
+ then pfbtops $param
+ else cat $param
+ fi
+ echo appendnewfont ;;
+ *.Z) zcat $param
+ echo appendnewfont ;;
+ *.zip) unzip -p $param
+ echo appendnewfont ;;
+ *) cat $param
+ echo appendnewfont ;;
+ esac
+ fi
+done ; echo " " showallfonts showpage quit) | eval $show) << \*EOP*
+%! print font samples and character sets
+/home {leftborder top moveto} def
+/sethome {/top exch def /leftborder exch def} def
+/setfontsize {/fontsize exch def} def
+/setrightborder {/rightborder exch def} def
+40 790 sethome
+18 setfontsize
+550 setrightborder
+/leading 4 def
+/nl {currentpoint exch pop leftborder exch fontsize sub leading sub moveto} def
+
+/fontN {fontN} def
+/fontB {fontN} def
+/fontI {fontB} def
+/fontBI {fontB} def
+/N {fontN setfont} def
+/B {fontB setfont} def
+/I {fontI setfont} def
+/BI {fontBI setfont} def
+/pushfont {/fontBI /fontI load def
+ /fontI /fontB load def
+ /fontB /fontN load def
+ /fontN currentfont def
+ } def
+/nextfonti 0 def
+/setnextfont {[/fontN /fontI /fontB /fontBI] nextfonti get currentfont def
+ /nextfonti nextfonti 1 add def
+ } def
+
+/namefont {currentfont} def
+/showtext {
+ N
+ (Scoloplos ist euryök. Er ist in der gesamten borealen Region ) show nl
+ (in fast allen marinen Sedimenten zu finden, die einen sandigen ) show nl
+ (Anteil aufweisen. Man findet ihn von ) show B (Grönland ) show
+ N (bis zum ) show I (Mittelmeer) show N (, ) show nl
+ (in der ) show BI (Nordsee) show
+ N (, an der kanadischen Küste und im Weißen Meer. ) show nl
+ (Er besiedelt sowohl das Eulitoral als auch das Bathyal.) show nl
+ } def
+/showcset {[cs1 cs2 cs3 cs4 cs5 cs6 cs7] {show nl} forall
+ currentfont
+ currentpoint
+ dup fontsize leading add 3 mul add
+ currentfont /FontName get findfont 50 scalefont setfont
+ rightborder (Forqen) stringwidth pop sub exch moveto
+ (Forqen) show
+ moveto
+ setfont
+ } def
+/showcsetbig {
+ 2 2 scale
+ [cs1 cs2 cs3 cs4 cs5 cs6 cs7] {show nl} forall
+ .5 .5 scale
+ currentfont
+ currentpoint
+ dup fontsize leading add -2 mul add
+ currentfont /FontName get findfont 100 scalefont setfont
+ rightborder (Forqen) stringwidth pop sub exch moveto
+ (Forqen) show
+ moveto
+ setfont
+ } def
+/showname {currentfont namefont setfont
+ dup /FontName get dup length string cvs show
+ setfont nl
+ } def
+/showfont { % param: fontname
+ fontsize ff
+ home
+ showtext
+ showname
+ showcset % or: showcsetbig
+ } def
+/showallfonts {
+ % if registername was used, replace the automatically generated
+ % fontlist with the explicit one:
+ fontlistr length 0 ne {/fontlist fontlistr def} if
+
+ fontlist {fontsize ff setnextfont} forall
+ home showtext
+ [fontN fontI fontB fontBI] 0 fontlist length getinterval
+ {nl setfont ( ) show showname nl
+ showcset % or: showcsetbig
+ } forall
+ } def
+
+/findfontISO {dup findfont
+ dup maxlength dict begin
+ {1 index /FID ne {def} {pop pop } ifelse} forall
+ Encoding StandardEncoding eq
+ % pop true
+ {/Encoding ISO-Latin-1 def} if
+ currentdict end
+ definefont
+ } def
+/ff {exch findfontISO exch dup /fontsize exch def scalefont
+ setfont} def
+
+/fontlist [] def
+/fontlistr [] def
+/FontDirectoryKnown FontDirectory dup length 20 add dict begin
+ {def}
+ forall
+ currentdict end def
+/appendnewfont {
+ /fontlist [ fontlist aload pop
+ FontDirectoryKnown begin
+ FontDirectory
+ {FontDirectoryKnown 2 index known {pop pop} {2 copy def pop} ifelse
+ } forall
+ end
+ ] def
+ } def
+/registerfont {run appendnewfont} def
+/registername {/newfont exch def
+ /fontlistr [ fontlistr aload pop newfont ] def
+ } def
+
+/=dict { % for debugging
+ {2 array astore ==} forall
+ } def
+
+/cs1 ( !"#$%&'()*+,-./0123456789:;<=>?) def
+/cs2 (@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_) def
+/cs3 (`abcdefghijklmnopqrstuvwxyz{|}~) def
+/cs4 (€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ) def
+/cs5 ( ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿) def
+/cs6 (ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß) def
+/cs7 (àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ) def
+
+/ISO-Latin-1 [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+% or: /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% or: /grave
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /fraction
+% accents not in ISO-Latin-1:
+/dotlessi /ring /circumflex /tilde /breve /dotaccent
+/grave % see comment below
+% FrameMaker characters:
+/quotesingle % comment: must have /quoteleft instead of /grave, or
+ % /quoteright instead of /quotesingle, resp.,
+ % depending on which is already present above
+/quotesinglbase /quotedblbase /quotedblleft /quotedblright
+/guilsinglleft /guilsinglright
+/trademark
+/caron /hungarumlaut /ogonek
+/OE /oe
+/fi /fl
+/dagger /daggerdbl /ellipsis /emdash /florin /periodcentered /perthousand
+% DEC-supplemental (also /OE /oe):
+/Ydieresis
+% further PostScript chars:
+/Lslash /lslash
+
+% this must align with 240 octal
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /endash /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /bullet
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
+
+*EOP*
diff --git a/fonts/utilities/t1tools/makeafm b/fonts/utilities/t1tools/makeafm
new file mode 100644
index 0000000000..c40f34cc9d
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm
@@ -0,0 +1,198 @@
+#! /bin/sh
+
+# makeafm: generate .afm file from PostScript type 1 font file
+# (leaves out character bounding box information)
+# It accepts the file formats:
+# .pfb - type 1 encrypted binary file
+# .pfa - hex version of .pfb
+# .psb - first level of decryption; character outlines still encrypted
+# .psa - second level of decryption; character outlines embedded in
+# < > to recognize them for back-encryption; thus not PostScript
+# .ps - PostScript version of .psa as generated by makeps
+
+# This script uses:
+# - the programs decrypt and decomp posted by Per Lindqvist
+# ("ps-accent", comp.lang.postscript:3943, alt.sources:1978, 24 Jan 92)
+# in a slightly modified version that can also read from stdin
+# or alternatively:
+# the program t1disasm from the package t1utils posted by
+# I. Lee Hetherington with the following modification to t1disasm.c:
+# look up the line output(" {\n");
+# at the beginning of the routine do_charstring and remove the \n .
+
+# The afm's generated can be used with FrameMaker (on Sun's). Since they
+# do not contain character bounding box information, they cannot be
+# transformed to tex metrics files (.tfm), nor can Per Lindqvist's accent
+# making algorithm be applied to them (the programs I got from the posting
+# don't seem to work anyway, but the algorithm seems to be alright and the
+# coverage of many accents of many languages and the integration of their
+# placement specifications seems to be well done so far...)
+
+mergekpx () {
+ if [ -f $font.kpx ]
+ then echo merging $kpxfont kern pairs from $font.kpx
+ echo StartKernData >> $font.afm
+ echo StartKernPairs $kpxfont >> $font.afm
+ egrep "^KPX" $font.kpx >> $font.afm
+ echo EndKernPairs >> $font.afm
+ echo EndKernData >> $font.afm
+ elif [ -f $base.kpx ]
+ then echo merging $kpxbase kern pairs from $base.kpx
+ echo StartKernData >> $font.afm
+ echo StartKernPairs $kpxbase >> $font.afm
+ egrep "^KPX" $base.kpx >> $font.afm
+ echo EndKernPairs >> $font.afm
+ echo EndKernData >> $font.afm
+ fi
+ }
+
+makeafm () {
+ echo extracting information from $base
+# first, extract all information we need into a separate file since the
+# source file is very long and we need to scan its information several times
+ sed -e 'y/ /\n /' -e "s,^ *,," | egrep -e '(^/.*def|^/[A-z0-9]* *[<{].*sbw|^[- 0-9]*seac)' > /tmp/$base.extract
+# extract FontName
+ font=` sed -e '\@^/FontName@!{' -e 'd;b' -e '}' -e 's,^/FontName /\([^ ]*\).*,\1,' -e q /tmp/$base.extract `
+ font=${font:-$base}
+ echo making $font.afm
+ kpxfont=0
+ kpxbase=0
+ kpxpfm=0
+ if [ -f $font.afm ]
+ then kpxfont=`egrep -c "^KPX" $font.afm`
+ if [ $kpxfont -ne 0 ]
+ then egrep "^KPX" $font.afm > $font.kpx
+ echo $kpxfont kern pairs in previous $font.afm
+ fi
+ fi
+ if [ -f $base.afm ]
+ then kpxbase=`egrep -c "^KPX" $base.afm`
+ if [ $kpxbase -ne 0 ]
+ then egrep "^KPX" $base.afm > $base.kpx
+ echo $kpxbase kern pairs in $base.afm
+ fi
+ fi
+ echo StartFontMetrics 1.0 > $font.afm
+ echo Comment generated from Type 1 font description >> $font.afm
+# generate fixed Encoding specification (mind!)
+ echo EncodingScheme AdobeStandardEncoding >> $font.afm
+# extract font information items and transform into afm syntax
+ sed -e /FontName/b -e /FullName/b -e /FamilyName/b -e /Weight/b \
+ -e /ItalicAngle/b -e /Underline/b -e /FontBBox/b \
+ -e /Notice/b -e /Comment/b \
+ -e /isFixedPitch/s,i,I, -e /version/s,v,V, -e t -e d \
+ /tmp/$base.extract | sed \
+ -e 's,^/\([A-z]*\) *[[{(]\(.*\)[]})].*,\1 \2,' -e t \
+ -e 's,^/\([A-z]* [^ ]*\).*,\1,' -e 's,[/()],,g' >> $font.afm
+# determine if the ligatures fi and fl are present
+ fifl=`sed -e 's,^/f\([il]\) .*, L \1 f\1 ;,' -e t -e d /tmp/$base.extract`
+ if [ -n "$fifl" ]
+ then fifl=" `echo $fifl`"
+ # remove newline from $fifl
+ fi
+# now extract the metrics information
+ echo StartCharMetrics >> $font.afm
+ sed -e 's,^/\([A-z0-9]*\) *[<{] *[-0-9]* *\([-0-9]*\) *hsbw *$,C -1 ; WX \2 ; N \1 ;,' \
+ -e 's,^/\([A-z0-9]*\) *[<{] *[-0-9]* *[-0-9]* *\([-0-9]*\) *\([-0-9]*\) *sbw *$,C -1 ; W \2 \3 ; N \1 ;,' \
+ -e "s,\( N f .*\)$,\1$fifl," \
+ -e t -e d /tmp/$base.extract >> $font.afm
+ echo EndCharMetrics >> $font.afm
+# look for a dumped pfm file (if possible, dumppfm $base.pfm > $base.dfm
+# should have been inserted here)
+## I used the following generation of kerning information from a
+## pfm file dump made by dumppfm before I crypted that extraction
+## into dd/od/sed commands myself.
+## if [ -f $base.dfm ]
+## then
+## pairs=`sed -e 's,.* etmKernPairs *[0-F]* *\([0-9]*\)[^0-9]*,\1,' -e t -e d $base.dfm`
+## if [ $pairs -ne 0 ]
+## then
+## echo including $pairs kern pairs from $base.dfm
+## echo StartKernData >> $font.afm
+## echo StartKernPairs $pairs >> $font.afm
+## sed -e 's,^[0-F]* [0-F]* KernPair\[[0-F]*\] *[0-F]* [0-F]* [0-F]* [0-F]* *\([0-z]*\) *\([0-z]*\) *\([-0-9]*\)[^0-9]*,KPX \1 \2 \3,' -e t -e d $base.dfm >> $font.afm
+## echo EndKernPairs >> $font.afm
+## echo EndKernData >> $font.afm
+## else
+## echo no kern pairs in $base.dfm
+## fi
+## elif ...
+ if [ -f $base.pfm ]
+ then
+ set - ` ( /bin/dd ibs=1 skip=195 count=2 < $base.pfm | /bin/dd conv=swab | /bin/od -d ) 2> /dev/null `
+ pairs=`expr $2 + 0`
+ if [ $pairs -ne 0 ]
+ then
+ WinANSI=`dirname $0`/WinANSI
+ len=`expr $pairs \* 4`
+
+ set - ` ( /bin/dd ibs=1 skip=131 count=4 < $base.pfm | /bin/dd conv=swab | /bin/od -d ) 2> /dev/null `
+ start=`expr $3 \* 65536 + $2 + 2`
+
+ echo StartKernData >> $font.afm
+ echo StartKernPairs $pairs >> $font.afm
+
+ /bin/dd ibs=1 skip=$start count=$len < $base.pfm | /bin/dd conv=swab |
+ /bin/od -vbiw4 |
+ sed -e '/^0/N' -e 's,^[0-7]* *\([0-7]*\) \([0-7]*\) [0-7]* [0-7]*[^-0-9]*[-0-9]* *\([-0-9]*\)$,KPX C\2 C\1 \3,' -f ${WinANSI}1 |
+ sed -f ${WinANSI}2 >> $font.afm
+
+ echo EndKernPairs >> $font.afm
+ echo EndKernData >> $font.afm
+ kpxpfm=$pairs
+ echo merged $kpxpfm kern pairs from $base.pfm
+ else
+ echo no kern pairs in $base.pfm
+ mergekpx
+ fi
+ else
+ mergekpx
+ fi
+# finally, extract composite character information as available
+ if true # no Composites entries needed for FrameMaker
+ then
+ echo StartComposites >> $font.afm
+ # since we will only find character encodings
+ # (as index into StandardEncoding), we have to translate them into
+ # their names using the list PCCnames - hopefully being found so:
+ PCCnames=`dirname $0`/PCCnames
+ sed -e '\@^/\([A-z0-9]*\) *[<{][-0-9 ]* hsbw *$@h' \
+ -e '\@^/\([A-z0-9]*\) *[<{][-0-9 ]* sbw *$@h' \
+ -e '/ seac *$/G' \
+ -e 's,^ *[-0-9]* *\([-0-9]*\) *\([-0-9]*\) *\([0-9]*\) *\([0-9]*\) *seac *\n/\([A-z0-9]*\) *[<{].*$,CC \5 2 ; PCC \3 0 0 ; PCC \4 \1 \2 ;,' \
+ -e t -e d /tmp/$base.extract | sed -f $PCCnames >> $font.afm
+ # The accent shift values (substituted as \1 and \2 above)
+ # are not exact. The difference of the "side bearing points"
+ # (letter - accent) would have to be added to it.
+ echo EndComposites >> $font.afm
+ fi
+# and finish the job
+ echo EndFontMetrics >> $font.afm
+ /bin/rm /tmp/$base.extract
+ }
+
+disasm () {
+ if t1disasm
+ then true
+ else decrypt | decomp
+ fi
+ }
+
+for file in $*
+do base=`basename $file .pfb`
+ base=`basename $base .pfa`
+ base=`basename $base .psb`
+ base=`basename $base .psa`
+ base=`basename $base .ps`
+ if [ -f $file ]
+ then case $file in
+ *.pfb | *.pfa)
+ disasm < $file | makeafm ;;
+ # if decomp cannot read stdin, use temp file instead
+ *.psb) decomp $file | makeafm ;;
+ *.psa | *.ps) makeafm < $file ;;
+ *) echo no file found for $file ;;
+ esac
+ else echo no file found for $file
+ fi
+done
diff --git a/fonts/utilities/t1tools/makeafm.dir/fontbbox.sed b/fonts/utilities/t1tools/makeafm.dir/fontbbox.sed
new file mode 100644
index 0000000000..1d3a3a48e4
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/fontbbox.sed
@@ -0,0 +1,9 @@
+s,^FontBBox *\([-0-9]*\) *\([-0-9]*\) *\([-0-9]*\) *\([-0-9]*\) *$,set llx=\1\
+set urx=\3\
+set Descender=\2\
+set CapHeight=\4\
+set XHeight=\4\
+set Ascender=\4,
+tx
+d
+:x
diff --git a/fonts/utilities/t1tools/makeafm.dir/fontinf1.sed b/fonts/utilities/t1tools/makeafm.dir/fontinf1.sed
new file mode 100644
index 0000000000..cc76fc89ce
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/fontinf1.sed
@@ -0,0 +1,14 @@
+/FontName/bx
+/FullName/bx
+/FamilyName/bx
+/Weight/bx
+/ItalicAngle/bx
+/Underline/bx
+/FontBBox/bx
+/Notice/bx
+/Comment/bx
+/isFixedPitch/s,i,I,
+/version/s,v,V,
+tx
+d
+:x \ No newline at end of file
diff --git a/fonts/utilities/t1tools/makeafm.dir/fontinf2.sed b/fonts/utilities/t1tools/makeafm.dir/fontinf2.sed
new file mode 100644
index 0000000000..b2bbbe1cbd
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/fontinf2.sed
@@ -0,0 +1,5 @@
+s,^ */\([A-z]*\) *[[{(]\(.*\)[]})].*,\1 \2,
+tx
+s,^ */\([A-z]*\)[ /]\([^ ]*\).*,\1 \2,
+s,[/()],,g
+:x
diff --git a/fonts/utilities/t1tools/makeafm.dir/fontmetr.sed b/fonts/utilities/t1tools/makeafm.dir/fontmetr.sed
new file mode 100644
index 0000000000..8b03e55437
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/fontmetr.sed
@@ -0,0 +1,5 @@
+s,^/\([A-z0-9]*\) *[<{] *[-0-9]* *\([-0-9]*\) *hsbw *$,C -1 ; WX \2 ; N \1 ;,
+s,^/\([A-z0-9]*\) *[<{] *[-0-9]* *[-0-9]* *\([-0-9]*\) *\([-0-9]*\) *sbw *$,C -1 ; W \2 \3 ; N \1 ;,
+tx
+d
+:x
diff --git a/fonts/utilities/t1tools/makeafm.dir/makeafm.bat b/fonts/utilities/t1tools/makeafm.dir/makeafm.bat
new file mode 100644
index 0000000000..998d98b46f
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/makeafm.bat
@@ -0,0 +1,129 @@
+@echo off
+
+rem makeafm: generate .afm file from PostScript type 1 font file
+rem (faking character bounding box information)
+rem It accepts the file formats:
+rem .pfb - type 1 encrypted binary file
+
+rem This script uses:
+rem 1. To disassemble the type 1 font (.pfb file):
+rem the program t1disasm from the package t1utils posted by
+rem I. Lee Hetherington with the following modification to t1disasm.c:
+rem look up the line output(" {\n");
+rem at the beginning of the routine do_charstring and remove the \n .
+rem 2. To extract pair kerning information from .pfm files:
+rem a) either the program pfm2afm
+rem b) or the program dumppfm (version 1.5.3)
+
+set dumvar=
+set dumvar2=
+if not "%1"=="-" goto normal
+set del=rem
+shift
+:normal
+if not exist %1.pfb goto error
+
+rem first, extract all information we need into a separate file since the
+rem source file is very long and we need to scan its information several times
+if exist %1.ps$ goto ext
+if exist %1.ps goto ps
+echo extracting information from %1.pfb
+D:\fonts\progs\t1utils\t1disasm %1.pfb > %TEMP%\%1.ps
+sed -e "y/ / /" %TEMP%\%1.ps > %TEMP%\%1.pb$
+%del% del %TEMP%\%1.ps
+goto pb
+:ps
+sed -e "y/ / /" %1.ps > %TEMP%\%1.pb$
+:pb
+egrep -e "(^ */.*def|^/[A-z0-9]* *[<{].*sbw|^[- 0-9]*seac)" %TEMP%\%1.pb$ > %1.ps$
+%del% del %TEMP%\%1.pb$
+:ext
+
+rem try to save kerning information from previous .afm file or to extract
+rem it from .pfm file
+if exist %1.afm goto afmkern
+if not exist %1.pfm goto startafm
+echo extracting kerning and height information from %1.pfm
+pfm2afm %1
+rem dumppfm %1.pfm %1.afm
+if not exist %1.inf call afm-inf %1
+:afmkern
+echo saving kerning and height information from %1.afm
+egrep -e "^(StartKern|EndKern|KPX)" %1.afm > %TEMP%\%1.kpx
+egrep -e "^(CapHeight|XHeight|Ascender|Descender)" %1.afm > %TEMP%\%1.hei
+
+:startafm
+echo making %1.afm
+echo StartFontMetrics 1.0 > %1.afm
+echo Comment generated from Type 1 font >> %1.afm
+rem generate fixed Encoding specification (mind!)
+echo EncodingScheme AdobeStandardEncoding >> %1.afm
+rem extract font information items and transform into afm syntax
+sed -f D:\fonts\progs\makeafm\fontinf1.sed %1.ps$ > %TEMP%\%1.fi
+sed -f D:\fonts\progs\makeafm\fontinf2.sed %TEMP%\%1.fi >> %1.afm
+%del% del %TEMP%\%1.fi
+rem determine if the ligatures fi and fl are present
+sed -e "s,^/f\([il]\) .*,set fifl=%%fifl%% L \1 f\1 ;," -e tx -e d -e :x %1.ps$ > %TEMP%\%1.bat
+sed -f D:\fonts\progs\makeafm\fontbbox.sed %1.afm >> %TEMP%\%1.bat
+if not exist %TEMP%\%1.hei goto nohei
+rem type %TEMP%\%1.hei >> %1.afm
+egrep -v CapHeight %TEMP%\%1.hei >> %1.afm
+sed -e "s,^\([^ ][^ ]*\) *\([-0-9]*\) *$,set \1=\2," %TEMP%\%1.hei >> %TEMP%\%1.bat
+%del% del %TEMP%\%1.hei
+:nohei
+set fifl=
+call %TEMP%\%1.bat
+echo CapHeight %CapHeight% >> %1.afm
+set BBoxC= B %llx% %Descender% %urx% %CapHeight% ;
+set BBoxX= B %llx% %Descender% %urx% %XHeight% ;
+set BBox= B %llx% %Descender% %urx% %Ascender% ;
+%del% del %TEMP%\%1.bat
+
+rem now extract the metrics information
+rem echo StartCharMetrics >> %1.afm
+sed -f D:\fonts\progs\makeafm\fontmetr.sed %1.ps$ > %TEMP%\%1.ex
+egrep -c -e . %TEMP%\%1.ex | sed -e "s,^,StartCharMetrics " >> %1.afm
+echo s,\( N *f .*\)$,\1%BBox%%fifl%,> %TEMP%\%1.sed
+echo s,\( N *[A-Z][^;]*;\),\1%BBoxC%,>> %TEMP%\%1.sed
+rem echo s,\( N *[acegm-su-z][^;]*;\),\1%BBoxX%,>> %TEMP%\%1.sed
+echo s,\( N *x[^;]*;\),\1%BBoxX%,>> %TEMP%\%1.sed
+echo tx>> %TEMP%\%1.sed
+echo s,\( N [^;]*;\),\1%BBox%,>> %TEMP%\%1.sed
+echo tx>> %TEMP%\%1.sed
+echo d>> %TEMP%\%1.sed
+echo :x>> %TEMP%\%1.sed
+sed -f %TEMP%\%1.sed %TEMP%\%1.ex >> %1.afm
+%del% del %TEMP%\%1.ex
+%del% del %TEMP%\%1.sed
+echo EndCharMetrics >> %1.afm
+
+rem insert previously extracted or saved kerning information
+if not exist %TEMP%\%1.kpx goto nokern
+rem type %TEMP%\%1.kpx >> %1.afm
+egrep -e "^StartKern" %TEMP%\%1.kpx >> %1.afm
+egrep -e "^KPX" %TEMP%\%1.kpx | sort >> %1.afm
+egrep -e "^EndKern" %TEMP%\%1.kpx >> %1.afm
+:nokern
+
+goto nocompo
+rem finally, extract composite character information as available
+echo StartComposites >> %1.afm
+rem since we will only find character encodings (as index into
+rem StandardEncoding), we have to translate them into their names:
+sed -f D:\fonts\progs\makeafm\PCCinfo.sed %1.ps$ > %TEMP%\%1.pcc
+sed -f D:\fonts\progs\makeafm\PCCnames.sed %TEMP%\%1.pcc >> %1.afm
+%del% del %TEMP%\%1.pcc
+rem The accent shift values (substituted as \1 and \2 above)
+rem are not exact. The difference of the "side bearing points"
+rem (letter - accent) would have to be added to it.
+echo EndComposites >> %1.afm
+:nocompo
+rem and finish the job
+echo EndFontMetrics >> %1.afm
+%del% del %1.ps$
+if exist %TEMP%\%1.kpx %del% del %TEMP%\%1.kpx
+goto end
+
+:error
+echo makeafm failed
+:end
diff --git a/fonts/utilities/t1tools/makeafm.dir/pccinfo.sed b/fonts/utilities/t1tools/makeafm.dir/pccinfo.sed
new file mode 100644
index 0000000000..58e5a25b2b
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/pccinfo.sed
@@ -0,0 +1,7 @@
+/^\/\([A-z0-9]*\) *[<{][-0-9 ]* hsbw *$/h
+/^\/\([A-z0-9]*\) *[<{][-0-9 ]* sbw *$/h
+/ seac *$/G
+s,^ *[-0-9]* *\([-0-9]*\) *\([-0-9]*\) *\([0-9]*\) *\([0-9]*\) *seac *\n/\([A-z0-9]*\) *[<{].*$,CC \5 2 ; PCC \3 0 0 ; PCC \4 \1 \2 ;,
+tx
+d
+:x
diff --git a/fonts/utilities/t1tools/makeafm.dir/pccnames.sed b/fonts/utilities/t1tools/makeafm.dir/pccnames.sed
new file mode 100644
index 0000000000..7c963ac1cc
--- /dev/null
+++ b/fonts/utilities/t1tools/makeafm.dir/pccnames.sed
@@ -0,0 +1,90 @@
+s,PCC 34,PCC quotedbl,
+s,PCC 42,PCC asterisk,
+s,PCC 43,PCC plus,
+s,PCC 44,PCC comma,
+s,PCC 45,PCC hyphen,
+s,PCC 46,PCC period,
+s,PCC 47,PCC slash,
+s,PCC 58,PCC colon,
+s,PCC 60,PCC less,
+s,PCC 61,PCC equal,
+s,PCC 62,PCC greater,
+s,PCC 65,PCC A,
+s,PCC 66,PCC B,
+s,PCC 67,PCC C,
+s,PCC 68,PCC D,
+s,PCC 69,PCC E,
+s,PCC 70,PCC F,
+s,PCC 71,PCC G,
+s,PCC 72,PCC H,
+s,PCC 73,PCC I,
+s,PCC 74,PCC J,
+s,PCC 75,PCC K,
+s,PCC 76,PCC L,
+s,PCC 77,PCC M,
+s,PCC 78,PCC N,
+s,PCC 79,PCC O,
+s,PCC 80,PCC P,
+s,PCC 81,PCC Q,
+s,PCC 82,PCC R,
+s,PCC 83,PCC S,
+s,PCC 84,PCC T,
+s,PCC 85,PCC U,
+s,PCC 86,PCC V,
+s,PCC 87,PCC W,
+s,PCC 88,PCC X,
+s,PCC 89,PCC Y,
+s,PCC 90,PCC Z,
+s,PCC 92,PCC backslash,
+s,PCC 94,PCC asciicircum,
+s,PCC 95,PCC underscore,
+s,PCC 97,PCC a,
+s,PCC 98,PCC b,
+s,PCC 99,PCC c,
+s,PCC 100,PCC d,
+s,PCC 101,PCC e,
+s,PCC 102,PCC f,
+s,PCC 103,PCC g,
+s,PCC 104,PCC h,
+s,PCC 105,PCC i,
+s,PCC 106,PCC j,
+s,PCC 107,PCC k,
+s,PCC 108,PCC l,
+s,PCC 109,PCC m,
+s,PCC 110,PCC n,
+s,PCC 111,PCC o,
+s,PCC 112,PCC p,
+s,PCC 113,PCC q,
+s,PCC 114,PCC r,
+s,PCC 115,PCC s,
+s,PCC 116,PCC t,
+s,PCC 117,PCC u,
+s,PCC 118,PCC v,
+s,PCC 119,PCC w,
+s,PCC 120,PCC x,
+s,PCC 121,PCC y,
+s,PCC 122,PCC z,
+s,PCC 124,PCC bar,
+s,PCC 126,PCC asciitilde,
+s,PCC 164,PCC fraction,
+s,PCC 169,PCC quotesingle,
+s,PCC 177,PCC endash,
+s,PCC 180,PCC periodcentered,
+s,PCC 183,PCC bullet,
+s,PCC 184,PCC quotesinglbase,
+s,PCC 188,PCC ellipsis,
+s,PCC 193,PCC grave,
+s,PCC 194,PCC acute,
+s,PCC 195,PCC circumflex,
+s,PCC 196,PCC tilde,
+s,PCC 197,PCC macron,
+s,PCC 198,PCC breve,
+s,PCC 199,PCC dotaccent,
+s,PCC 200,PCC dieresis,
+s,PCC 202,PCC ring,
+s,PCC 203,PCC cedilla,
+s,PCC 205,PCC hungarumlaut,
+s,PCC 206,PCC ogonek,
+s,PCC 207,PCC caron,
+s,PCC 208,PCC emdash,
+s,PCC 245,PCC dotlessi,
diff --git a/fonts/utilities/t1tools/pcs.ps b/fonts/utilities/t1tools/pcs.ps
new file mode 100644
index 0000000000..004f429822
--- /dev/null
+++ b/fonts/utilities/t1tools/pcs.ps
@@ -0,0 +1,330 @@
+%! print and compare font character sets
+/home {leftmargin top moveto} def
+/rightmargin {leftmargin} def
+/sethome {/top exch def /leftmargin exch def} def
+/setfontsize {/fontsize exch def} def
+/setrightborder {/rightborder exch def} def
+70 740 sethome
+20 setfontsize
+550 setrightborder
+/leading 4 def
+/nl {currentpoint exch pop leftmargin exch
+ fontsize sub leading sub moveto} def
+/hl {currentpoint exch pop leftmargin exch
+ fontsize 2 div sub leading sub moveto} def
+
+/comparecs {
+ fontlist dup 0 get fontsize ffont /reffont exch def
+ 1 get fontsize ffont /chkfont exch def
+
+ chkfont /FontInfo get /ItalicAngle get abs
+ dup [ 1 0 4 -1 roll sin 1 0 0 ] /slantmatrix exch def
+ home
+ [cs0 cs1 cs2 cs3 cs4 cs5 cs6 cs7]
+ { {
+ currentpoint ( ) dup 0 6 -1 roll put dup /ch exch def
+ reffont setfont show
+ currentpoint % stack: x0 y0 x y
+ 4 2 roll pop % stack: x y x0
+ 3 copy pop pop sub % stack: x y x0-x
+ chkfont setfont ch stringwidth pop dup /width exch def
+ sub 2 div 0 rmoveto
+ 0 fontsize neg rmoveto currentpoint
+ % here we are at base point of character to be shown
+ % draw width and height reference box:
+ 0 fontsize slantmatrix transform
+ 2 copy 2 copy rmoveto neg exch neg exch rlineto
+ width 0 rlineto rlineto
+ 0 setlinewidth
+ % currentrgbcolor .5 .0 .0 setrgbcolor stroke setrgbcolor
+ % 2 copy moveto
+ % 0 fontsize
+ % 2 copy 2 copy rmoveto neg exch neg exch rlineto
+ % width 0 rlineto rlineto
+ currentrgbcolor .0 .5 .0 setrgbcolor stroke setrgbcolor
+ % back to base point:
+ moveto
+ ch show
+ moveto
+ fontsize 5 div 0 rmoveto
+ } forall
+ nl nl
+ } forall
+ } def
+
+/findfont+ {dup findfont
+ dup maxlength dict begin
+ {1 index dup /FID ne exch /UniqueID ne and
+ {def} {pop pop} ifelse} forall
+ Encoding StandardEncoding eq
+ % pop true % for unconditional re-encoding
+ {/Encoding Win31+
+ % pop CP437 % CP437 / CP850 / PrestigeElite-additionals / ...
+ def} if
+ currentdict end
+ definefont
+ } def
+/ffont {exch findfont+ exch dup /fontsize exch def scalefont
+ } def
+/ff {exch findfont+ exch dup /fontsize exch def scalefont
+ setfont} def
+
+/fontlist [] def
+%/newfontnames [/font2 /font1] def
+/FontDirectoryKnown FontDirectory dup length 20 add dict copy def
+/appendnewfont {
+ /fontlist [ fontlist aload pop
+ FontDirectoryKnown begin
+ FontDirectory
+ {FontDirectoryKnown 2 index known {pop pop} {2 copy def pop} ifelse
+ } forall
+ end
+ % font renaming to allow comparison of two fonts with equal name:
+ % third attempt, useless
+ % findfont
+ % /newfontnames
+ % [ newfontnames aload pop /newfontname exch def ] def
+ % newfontname exch definefont pop
+ % newfontname
+ ] def
+ } def
+/setreffont {
+ [ exch ] /fontlist exch def
+ } def
+/registerfont {run appendnewfont} def
+
+/=dict { % for debugging
+ {2 array astore ==} forall
+ } def
+
+{
+% the following module should allow multiple samples with the same font name
+% but it does not work
+/appendnewfont {} def
+%/*definefont /definefont load def
+/*definefont {definefont} bind def
+/fontnamelist [] def
+/fontnewnames [/f1 /f2] def
+/fontnewnamei 0 def
+/definefont {
+ % (definefont) =
+ 2 copy *definefont /FontName get /fontname exch def
+ % this yields "invalidaccess" !???
+ /fontnamelist [ fontnamelist aload pop fontname ] def
+ /fontnewname fontnewnames fontnewnamei get def
+ /fontnewnamei dup load 1 add def
+ /fontlist [ fontlist aload pop fontnewname ] def
+ exch pop fontnewname exch
+ *definefont
+ %/*definefont load exec
+ } store
+} pop
+
+{
+% the following module should allow multiple samples with the same font name
+% second attempt, doesn't work either
+/fontnamelist [] def
+/fontnewnames [/f1 /f2] def
+/fontnewnamei 0 def
+/appendnewfont {
+ FontDirectory
+ dup length dict /FontNewDirectory exch def
+ dup length dict /FontDirectoryKnown exch def
+ {FontDirectoryKnown 2 index known
+ {FontNewDirectory 3 copy pop put
+ FontDirectoryKnown 3 copy pop put
+ }
+ {
+ /fontnewname fontnewnames fontnewnamei get def
+ /fontnewnamei dup load 1 add def
+ FontNewDirectory fontnewname 2 index put
+ FontDirectoryKnown fontnewname 2 index put
+ /fontlist [ fontlist aload pop fontnewname ] def
+fontnewname ==
+ }
+ ifelse
+ pop pop
+ } forall
+ /FontDirectory FontNewDirectory def
+ } def
+} pop
+
+/fillsample { % param: name from-code
+ 32 string dup
+ 3 -1 roll dup 1 exch 31 add
+ {dup 32 mod exch put dup}
+ for pop def
+ } def
+/cs0 0 fillsample
+/cs1 32 fillsample
+/cs2 64 fillsample
+/cs3 96 fillsample
+/cs4 128 fillsample
+/cs5 160 fillsample
+/cs6 192 fillsample
+/cs7 224 fillsample
+
+/Win31+ [
+% Windows 3.1 character set extended with other common characters,
+% nbspace instead of second space, minus instead of second hyphen;
+% first 32 positions filled up with additional characters from MacIntosh.
+% Windows 3.1 character set is basically an extension of ISO Latin-1
+% with a few deviations.
+/NUL /HT /LF /CR /DLE /DC1 /DC2 /DC3 /DC4 /US /RS /DEL
+/lessequal /greaterequal /notequal /approxequal /lozenge /apple
+/infinity /partialdiff /summation /product /integral /radical
+/Delta /Omega /pi
+/breve /dotaccent /hungarumlaut /ogonek /ring
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /fraction
+
+/fi /fl /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /Lslash /Zcaron /caron
+/dotlessi /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /lslash /zcaron /Ydieresis
+
+/nbspace /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /minus /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
+
+/PrestigeElite-additionals [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/Hbar /IJ /Ldot /Tbar /dbar /hbar /ij /kgreenlandic
+/ldot /napostrophe /tbar
+/Gamma /Omega /Phi /Sigma /Theta
+/alpha /delta /epsilon
+/phi /pi /sigma /tau
+/Pts /deutschmark /franc
+/oneeighth
+/threeeighths /fiveeighths /seveneighths
+/Eng /apostrophereverse
+/approxequal /arrowboth /arrowdown
+/arrowleft /arrowright /arrowup /caretinverted
+/club /diamond /diamondopen /eng
+/equivalence /exclamdbl /female /filledbox /greaterequal
+/heart /infinity /intersection /lessequal
+/male /minus /monospacedash /musicalnote
+/musicalnotedbl /nsuperior /overscore /radical
+/spade /underscoredbl /zeroslash /SA420000
+/SD630000 /SF010000 /SF020000 /SF030000 /SF040000 /SF050000 /SF060000 /SF070000
+/SF080000 /SF090000 /SF100000 /SF110000 /SF140000 /SF150000 /SF160000 /SF190000
+/SF200000 /SF210000 /SF220000 /SF230000 /SF240000 /SF250000 /SF260000 /SF270000
+/SF280000 /SF360000 /SF370000 /SF380000 /SF390000 /SF400000 /SF410000 /SF420000
+/SF430000 /SF440000 /SF450000 /SF460000 /SF470000 /SF480000 /SF490000 /SF500000
+/SF510000 /SF520000 /SF530000 /SF540000 /SF570000 /SF580000 /SF590000 /SF600000
+/SF610000 /SM570001 /SM590000 /SM600000 /SM630000 /SM680000 /SM690000 /SM700000
+/SM750000 /SM750002 /SM760000 /SM770000 /SM790000 /SP320000 /SS000000 /SS010000
+/SS260000 /SS270000 /SV040000 /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+/CP437 [
+/space/SS000000/SS010000/heart/diamond/club/spade/bullet
+/SM570001/HT/SM750002/male/female/musicalnote/musicalnotedbl/SM690000
+/SM590000/SM630000/SM760000/exclamdbl/paragraph/section/SM700000/SM770000
+/arrowup/arrowdown/arrowright/arrowleft/SA420000/arrowboth/SM600000/SV040000
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+/SM790000
+% €‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
+/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla
+/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring
+/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave
+/ydieresis/Odieresis/Udieresis/cent/sterling/yen/Pts/florin
+%  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
+/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine
+/questiondown /SM680000 /logicalnot/onehalf/onequarter/exclamdown
+/guillemotleft /guillemotright
+/SF140000/SF150000/SF160000/SF110000/SF090000/SF190000/SF200000/SF210000
+/SF220000/SF230000/SF240000/SF250000/SF260000/SF270000/SF280000/SF030000
+% ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
+/SF020000/SF070000/SF060000/SF080000/SF100000/SF050000/SF360000/SF370000
+/SF380000/SF390000/SF400000/SF410000/SF420000/SF430000/SF440000/SF450000
+/SF460000/SF470000/SF480000/SF490000/SF500000/SF510000/SF520000/SF530000
+/SF540000/SF040000/SF010000/SF610000/SF570000/SF580000/SF590000/SF600000
+% àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+/alpha /germandbls /Gamma /pi /Sigma /sigma /mu /gamma
+/Phi /Theta /Omega /delta /infinity /infinity /epsilon /intersection
+/equivalence /plusminus /greaterequal /lessequal
+/SS260000/SS270000 /divide /approxequal
+/degree /SD630000 /SP320000 /radical /nsuperior /twosuperior /filledbox /space
+] def
+
+/CP850 [
+/space/SS000000/SS010000/heart/diamond/club/spade/bullet
+/SM570001/HT/SM750002/male/female/musicalnote/musicalnotedbl/SM690000
+/SM590000/SM630000/SM760000/exclamdbl/paragraph/section/SM700000/SM770000
+/arrowup/arrowdown/arrowright/arrowleft/SA420000/arrowboth/SM600000/SV040000
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+/SM790000
+% €‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
+/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla
+/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring
+/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave
+/ydieresis/Odieresis/Udieresis/oslash/sterling/Oslash/multiply/florin
+%  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
+/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine
+/questiondown/registered/logicalnot/onehalf/onequarter/exclamdown
+/guillemotleft /guillemotright
+/SF140000/SF150000/SF160000/SF110000/SF090000 /Aacute /Acircumflex /Agrave
+/copyright /SF230000/SF240000/SF250000/SF260000 /cent /yen /SF030000
+% ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
+/SF020000/SF070000/SF060000/SF080000/SF100000/SF050000 /atilde /Atilde
+/SF380000/SF390000/SF400000/SF410000/SF420000/SF430000/SF440000 /currency
+/delta /Eth /Ecircumflex /Edieresis /Egrave /quotesingle /Iacute /Icircumflex
+/Idieresis /SF040000/SF010000/SF610000/SF570000 /brokenbar /Igrave /SF600000
+% àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+/Oacute /germandbls /Ocircumflex /Ograve /otilde /Otilde /mu /thorn
+/Thorn /Uacute /Ucircumflex /Ugrave /yacute /Yacute /macron /acute
+/minus /plusminus /underscoredbl /threequarters
+/paragraph /section /divide /cedilla
+/degree /dieresis /periodcentered /onesuperior
+/threesuperior /twosuperior /filledbox /space
+] def
diff --git a/fonts/utilities/t1tools/pfb-abf.bat b/fonts/utilities/t1tools/pfb-abf.bat
new file mode 100644
index 0000000000..808be18f34
--- /dev/null
+++ b/fonts/utilities/t1tools/pfb-abf.bat
@@ -0,0 +1,57 @@
+@ echo off
+
+if not "%1"=="" goto los
+echo pfb-abf [-] fontname outnam [resolutionx] [resolutiony] [encoding]
+echo fontname without .pfb
+echo outnam at most 6 characters
+echo screen resolution defaults to 72 72
+echo encoding vector file (without suffix .enc)
+echo - defaults to fontname.ENC if existing, C:\Adobe\APPLE.ENC otherwise
+echo SIZES may be set to list of sizes to be generated, defaults to 10 12 14 18 24
+echo an additional starting "-" leaves intermediate files and doesn't zip
+goto end
+
+:los
+rem try to make some space in environment (NC problem):
+set dumvar=
+
+set del=
+if not "%1"=="-" goto mach
+set del=rem
+shift
+
+:mach
+set name=%1
+set namo=%2
+if "%2"=="" set namo=%1
+if "%sizes%" == "" set sizes=10 12 14 18 24
+
+set resx=72
+set resy=72
+if not "%3"=="" set resx=%3
+if not "%4"=="" set resy=%4
+echo generating for resolution %resx% %resy%
+
+set enc=C:\Adobe\APPLE
+if exist %1.enc set enc=%1
+if not "%5"=="" set enc=%5
+
+echo StartTypeface > %namo%.mb
+echo Resolution %resx% %resy% >> %namo%.mb
+echo Orientation Portrait >> %namo%.mb
+echo StandardEncoding %enc%.ENC >> %namo%.mb
+echo SpecialEncoding >> %namo%.mb
+for %%s in (%sizes%) do call C:\Adobe\makemb %namo% %%s
+echo EndTypeface >> %namo%.mb
+
+C:\Adobe\foundry\MAKEBIT.EXE -i %namo%.MB -l nul %name%.pfb
+%del% del %namo%.mb
+
+for %%s in (%sizes%) do C:\Adobe\foundry\MAKEABF.EXE -l nul %namo%%%s.BIT
+
+%del% del %namo%*.bit
+
+%del% pkzip %namo% %namo%*.abf
+%del% del %namo%*.abf
+
+:end
diff --git a/fonts/utilities/t1tools/pfb-enc.bat b/fonts/utilities/t1tools/pfb-enc.bat
new file mode 100644
index 0000000000..a8c546b49b
--- /dev/null
+++ b/fonts/utilities/t1tools/pfb-enc.bat
@@ -0,0 +1,11 @@
+if exist %1.pfb goto los
+echo kein .pfb-Fontfile da.
+goto end
+
+:los
+echo MaxIndex 255 > %1.enc
+echo MaxEncoded 255 >> %1.enc
+echo StartEncoding >> %1.enc
+sed -e /eexec/d -e /eexec/q -e "s,^dup \(.*\)/\(.*\) put$,\1\2," -e tx -e d -e :x %1.pfb >> %1.enc
+echo EndEncoding >> %1.enc
+:end
diff --git a/fonts/utilities/t1tools/pfb-sfp.bat b/fonts/utilities/t1tools/pfb-sfp.bat
new file mode 100644
index 0000000000..c474b12906
--- /dev/null
+++ b/fonts/utilities/t1tools/pfb-sfp.bat
@@ -0,0 +1,58 @@
+@ echo off
+
+if not "%1"=="" goto los
+echo pfb-sfp [-] fontname outnam [resolutionx] [resolutiony] [encoding]
+echo fontname without .pfb
+echo outnam at most 6 characters
+echo printer resolution defaults to 300 300
+echo encoding vector file (without suffix .enc)
+echo - defaults to fontname.ENC if existing, C:\Adobe\foundry\W.ENC otherwise
+echo PSIZES may be set to list of sizes to be generated, defaults to 10 12
+echo an additional starting "-" leaves intermediate files
+goto end
+
+:los
+rem try to make some space in environment (NC problem):
+set dumvar=
+
+set del=
+if not "%1"=="-" goto mach
+set del=rem
+shift
+
+:mach
+set name=%1
+set namo=%2
+if "%2"=="" set namo=%1
+if "%PSIZES%" == "" set PSIZES=10 12
+
+set resx=300
+set resy=300
+if not "%3"=="" set resx=%3
+if not "%4"=="" set resy=%4
+echo generating for resolution %resx% %resy%
+
+set enc=C:\Adobe\foundry\W
+if exist %1.enc set enc=%1
+if not "%5"=="" set enc=%5
+
+echo StartTypeface > %namo%.mb
+echo Resolution %resx% %resy% >> %namo%.mb
+echo Orientation Portrait >> %namo%.mb
+echo StandardEncoding %enc%.ENC >> %namo%.mb
+echo SpecialEncoding >> %namo%.mb
+for %%s in (%PSIZES%) do call C:\Adobe\makemb %namo% %%s
+echo EndTypeface >> %namo%.mb
+
+C:\Adobe\foundry\MAKEBIT.EXE -i %namo%.MB %name%.pfb
+%del% del %namo%.mb
+
+for %%s in (%PSIZES%) do C:\Adobe\foundry\MAKELJF.EXE -c 9U -s 1 -w 0 -t 182 -o %namo%%%s.SFP %namo%%%s.BIT
+rem for %%s in (%PSIZES%) do C:\Adobe\foundry\MAKEPFM.EXE -h 1 -p %%s -e W.ENC -o %namo%%%s.pfm %name%.AFM
+
+%del% del %namo%*.bit
+
+rem %del% pkzip %namo% %namo%*.sfp
+rem %del% del %namo%*.sfp
+
+:end
diff --git a/fonts/utilities/t1tools/pfblist.bat b/fonts/utilities/t1tools/pfblist.bat
new file mode 100644
index 0000000000..e889bd0671
--- /dev/null
+++ b/fonts/utilities/t1tools/pfblist.bat
@@ -0,0 +1 @@
+pfbnames | C:\DOS\sort /+15 > @fontpfb.lst \ No newline at end of file
diff --git a/fonts/utilities/t1tools/pfbnames.pas b/fonts/utilities/t1tools/pfbnames.pas
new file mode 100644
index 0000000000..4c44f593b7
--- /dev/null
+++ b/fonts/utilities/t1tools/pfbnames.pas
@@ -0,0 +1,58 @@
+program pfbnames;
+
+uses Dos;
+
+var DirInfo: SearchRec;
+
+function getFontName (fn: string): string;
+const separators = [' ', ^I, ^M, ^J];
+var f: file of char;
+ { 'text' would sometimes interpret one of the first 6 binary
+ (block header) bytes as EOF . On the other hand, 'file of char'
+ is slow (stupid Turbo, probably not buffering file input other
+ than 'text' (Does Turbo-7 remedy this?). Maybe 'file' with
+ block operations should be used. }
+ lasttoken: string;
+ lastch: char;
+
+ procedure getchar;
+ begin
+ if eof (f) then lastch := chr (0)
+ else read (f, lastch)
+ end;
+
+ procedure gettoken;
+ begin
+ while lastch in separators do getchar;
+ if lastch = '/' then begin
+ lasttoken := '/';
+ getchar;
+ end else lasttoken := '';
+ while not eof (f) and not (lastch in separators + ['/']) do begin
+ lasttoken := lasttoken + lastch;
+ getchar;
+ end;
+ end;
+begin
+ assign (f, fn);
+ reset (f);
+ lastch := ' ';
+ lasttoken := '';
+ while not eof (f) and (lasttoken <> '/FontName')
+ do gettoken;
+ gettoken;
+ getFontName := lasttoken;
+ close (f)
+end;
+
+begin
+ if paramcount > 0 then writeln (getFontName (paramstr (1)))
+ else begin
+ FindFirst ('*.pfb', $00, DirInfo);
+ while DosError = 0 do begin
+ writeln (DirInfo.Name, ':', ' ': 13 - length (DirInfo.Name),
+ getFontName (DirInfo.Name));
+ FindNext (DirInfo)
+ end
+ end
+end.
diff --git a/fonts/utilities/t1tools/pfbpr.bat b/fonts/utilities/t1tools/pfbpr.bat
new file mode 100644
index 0000000000..f9b61f77ee
--- /dev/null
+++ b/fonts/utilities/t1tools/pfbpr.bat
@@ -0,0 +1,20 @@
+echo off
+if not "%1"=="" goto los
+echo Parameter: Font-Dateien (.pfb), max. 4
+goto end
+
+:los
+rem copy %GS_LIB%\pfshow.ps %TEMP%\pfshow$$.ps
+echo 70 740 sethome 12 setfontsize > %TEMP%\pfshow$$.ps
+:next
+if exist %1.pfa type %1.pfa >> %TEMP%\pfshow$$.ps
+if exist %1.pfb D:\fonts\progs\t1utils\t1ascii %1.pfb >> %TEMP%\pfshow$$.ps
+if exist %1 D:\fonts\progs\t1utils\t1ascii %1 >> %TEMP%\pfshow$$.ps
+echo appendnewfont >> %TEMP%\pfshow$$.ps
+shift
+if not "%1"=="" goto next
+echo showallfonts showpage quit >> %TEMP%\pfshow$$.ps
+
+gs -q -sPAPERSIZE=a4 -sDEVICE=deskjet -r300 -dNOPAUSE pfshow.ps %TEMP%\pfshow$$.ps
+del %TEMP%\pfshow$$.ps
+:end
diff --git a/fonts/utilities/t1tools/pfbshow.bat b/fonts/utilities/t1tools/pfbshow.bat
new file mode 100644
index 0000000000..b7e805146a
--- /dev/null
+++ b/fonts/utilities/t1tools/pfbshow.bat
@@ -0,0 +1,41 @@
+@echo off
+rem show font text sample and character sets
+rem point size is automatically adjusted to number of fonts (1..4)
+rem additionally required programs:
+rem the PostScript file pfshow.ps
+rem ghostscript
+rem a program to convert .pfb to .pfa hex representation (here t1ascii)
+
+if not "%1"=="-" goto weiter
+set dumvar=
+set del=rem
+shift
+:weiter
+if not "%1"=="" goto los
+echo Parameter: font-files (.pfb), max. 4
+goto end
+
+:los
+rem copy %GS_LIB%\pfshow.ps %TEMP%\pfshow$$.ps
+echo 40 730 sethome 40 setfontsize 1000 setrightborder > %TEMP%\pfshow$$.ps
+rem with one line less, appropriate sizes are 45/28/18/13
+if not "%2"=="" echo 25 setfontsize >> %TEMP%\pfshow$$.ps
+if not "%3"=="" echo 16 setfontsize >> %TEMP%\pfshow$$.ps
+if not "%4"=="" echo 11 setfontsize >> %TEMP%\pfshow$$.ps
+:next
+if "%1"=="-a" goto arial
+if exist %1.pfa type %1.pfa >> %TEMP%\pfshow$$.ps
+if exist %1.pfb D:\fonts\progs\t1utils\t1ascii %1.pfb >> %TEMP%\pfshow$$.ps
+if exist %1 D:\fonts\progs\t1utils\t1ascii %1 >> %TEMP%\pfshow$$.ps
+goto append
+:arial
+D:\fonts\progs\t1utils\t1ascii D:\fonts\profi\_a______.pfb >> %TEMP%\pfshow$$.ps
+:append
+echo appendnewfont >> %TEMP%\pfshow$$.ps
+shift
+if not "%1"=="" goto next
+echo showallfonts showpage quit >> %TEMP%\pfshow$$.ps
+
+gs -q %GSOPT% pfshow.ps %TEMP%\pfshow$$.ps
+%del% del %TEMP%\pfshow$$.ps
+:end
diff --git a/fonts/utilities/t1tools/pfshow.ps b/fonts/utilities/t1tools/pfshow.ps
new file mode 100644
index 0000000000..37e3e388b0
--- /dev/null
+++ b/fonts/utilities/t1tools/pfshow.ps
@@ -0,0 +1,181 @@
+%! print font samples and character sets
+/home {leftmargin top moveto} def
+/rightmargin {leftmargin} def
+/sethome {/top exch def /leftmargin exch def} def
+/setfontsize {/fontsize exch def} def
+/setrightborder {/rightborder exch def} def
+70 740 sethome
+20 setfontsize
+550 setrightborder
+/leading 4 def
+/nl {currentpoint exch pop leftmargin exch
+ fontsize sub leading sub moveto} def
+/hl {currentpoint exch pop leftmargin exch
+ fontsize 2 div sub leading sub moveto} def
+
+/fontN {currentfont} def
+/fontB {fontN} def
+/fontI {fontB} def
+/fontBI {fontB} def
+/N {fontN setfont} def
+/B {fontB setfont} def
+/I {fontI setfont} def
+/BI {fontBI setfont} def
+/pushfont {/fontBI /fontI load def
+ /fontI /fontB load def
+ /fontB /fontN load def
+ /fontN currentfont def
+ } def
+/nextfonti 0 def
+/setnextfont {[/fontN /fontI /fontB /fontBI] nextfonti get currentfont def
+ /nextfonti nextfonti 1 add def
+ } def
+
+/namefont {currentfont} def
+/showtext {
+ N
+ (Scoloplos ist eury) show odieresis show
+ (k. Er ist in der gesamten borealen Region in fast allen) show nl
+ (marinen Sedimenten zu finden, die einen sandigen Anteil aufweisen. Man) show nl
+ (findet ihn von ) show B (Gr) show odieresis show (nland ) show
+ N (bis zum ) show I (Mittelmeer) show
+ N (, in der ) show BI (Nordsee) show
+ N (, an der kanadischen) show nl
+ (K) show udieresis show (ste und im Wei) show germandbls show
+ (en Meer (Markelova 1981).) show nl
+ quotedblleft show (Er besiedelt sowohl das ) show guillemotleft show
+ (Eulitoral) show guillemotright show ( als auch das ) show quotedblbase show
+ (Bathyal) show quotedblleft show (.) show quotedblright show nl
+ quoteleft show (Er besiedelt sowohl das ) show guilsinglleft show
+ (Eulitoral) show guilsinglright show ( als auch das ) show quotesinglbase show
+ (Bathyal) show quoteleft show (.) show quoteright show nl
+ } def
+/showcset {
+ [cs0 cs1 cs2 cs3 cs4 cs5 cs6 cs7] {show nl} forall
+ currentfont
+ currentpoint
+ dup fontsize leading add 3 mul add
+ % leftmargin 400 add exch moveto
+ currentfont /FontName get findfont 70 scalefont setfont
+ rightborder (Forqen) stringwidth pop sub exch moveto
+ (Forqen) show
+ moveto
+ setfont
+ } def
+/showname {currentfont namefont setfont
+ dup /FontName get dup length string cvs show
+ setfont nl
+ } def
+/showfont { % param: fontname
+ fontsize ff
+ home
+ showtext
+ showname
+ showcset
+ } def
+/showallfonts {
+ % /fontlist [ FontDirectory {pop} forall ] def
+% fontlist
+% {dup findfont copyfont definefont pop}
+% forall
+
+ fontlist {fontsize ff setnextfont} forall
+ fontlist length 0 ne {home showtext} if
+ [fontN fontI fontB fontBI] 0 fontlist length getinterval
+ {hl setfont ( ) show showname hl showcset} forall
+ } def
+
+/findfont+ {dup findfont
+ dup maxlength dict begin
+ {1 index dup /FID ne exch /UniqueID ne and
+ {def} {pop pop} ifelse} forall
+ Encoding StandardEncoding eq
+ % pop true % for unconditional re-encoding
+ {/Encoding Win31+ def} if
+ % /Encoding PrestigeElite def
+ currentdict end
+ definefont
+ } def
+/ff {exch findfont+ exch dup /fontsize exch def scalefont
+ setfont} def
+
+/fontlist [] def
+/FontDirectoryKnown FontDirectory dup length 20 add dict copy def
+/appendnewfont {
+ /fontlist [ fontlist aload pop
+ FontDirectoryKnown begin
+ FontDirectory
+ {FontDirectoryKnown 2 index known {pop pop} {2 copy def pop} ifelse
+ } forall
+ end
+ ] def
+ } def
+/registerfont {run appendnewfont} def
+
+/=dict { % for debugging
+ {2 array astore ==} forall
+ } def
+
+/fillsample { % param: name from-code
+ 32 string dup
+ 3 -1 roll dup 1 exch 31 add
+ {dup 32 mod exch put dup}
+ for pop def
+ } def
+/cs0 0 fillsample
+/cs1 32 fillsample
+/cs2 64 fillsample
+/cs3 96 fillsample
+/cs4 128 fillsample
+/cs5 160 fillsample
+/cs6 192 fillsample
+/cs7 224 fillsample
+
+/Win31+ [
+% Windows 3.1 character set extended with other common characters,
+% nbspace instead of second space, minus instead of second hyphen;
+% first 32 positions filled up with additional characters from MacIntosh.
+% Windows 3.1 character set is basically an extension of ISO Latin-1
+% with a few deviations.
+/NUL /HT /LF /CR /DLE /DC1 /DC2 /DC3 /DC4 /US /RS /DEL
+/lessequal /greaterequal /notequal /approxequal /lozenge /apple
+/infinity /partialdiff /summation /product /integral /radical
+/Delta /Omega /pi
+/breve /dotaccent /hungarumlaut /ogonek /ring
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /fraction
+
+/fi /fl /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /Lslash /Zcaron /caron
+/dotlessi /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /lslash /zcaron /Ydieresis
+
+/nbspace /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /minus /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
+Win31+
+0 1 31 {2 copy get exch 1 string dup 0 4 -1 roll put def} for
+127 1 255 {2 copy get exch 1 string dup 0 4 -1 roll put def} for
+pop
+
diff --git a/fonts/utilities/t1tools/readme b/fonts/utilities/t1tools/readme
new file mode 100644
index 0000000000..7dd1c2f083
--- /dev/null
+++ b/fonts/utilities/t1tools/readme
@@ -0,0 +1,228 @@
+t1tools is a collection of programs and batch files useful for
+handling type 1 fonts on MSDOS and Unix systems.
+Documentation is ad-hoc to get the package out at last - sorry for
+any inconvenience this may impose. The package is not meant for
+people without knowledge about type 1 font and metrics stuff.
+If you detect any incompleteness or have any suggestions for improvement,
+please tell me.
+Thomas Wolff@inf.fu-berlin.de
+
+
+The package is available by anonymous ftp:
+ ftp.fu-berlin.de: pub/postscript/t1tools.zip
+
+
+The package contains the following tools:
+
+makeafm.bat (MSDOS)
+makeafm (Unix)
+ Generates an .afm font metrics file from a .pfb font file.
+ The information is taken directly from the font itself by
+ first disassembling it using an appropriate program.
+ If pair kerning information is available from any previously
+ existing .afm or .pfm file for that font it will be included
+ in the generated .afm file.
+
+ Syntax: makeafm font-file-base
+ Don't include .pfb / .pfa suffix in file name.
+ Examples:
+ makeafm photina
+
+ Disadvantage: character bounding box information will not be
+ included. This does not matter for use with FrameMaker (which
+ I originally wrote the script for), but for some Tex-ps adaptations.
+ The MSDOS version, however, does at least include simulated character
+ bounding box information derived from other font information to
+ enable Adobe's makepfm to work on the .afm file.
+ Required:
+ 1. To disassemble the type 1 font (.pfb file):
+ the program t1disasm from the package t1utils posted by
+ I. Lee Hetherington with the following modification to t1disasm.c:
+ look up the line output(" {\n");
+ at the beginning of the routine do_charstring and remove the \n .
+ 2. To extract pair kerning information from .pfm files on MSDOS:
+ a) either the program pfm2afm
+ b) or the program dumppfm (version 1.5.3)
+ (Extraction from .pfm files works without additional software on Unix.)
+
+
+getmetri.bat (MSDOS)
+getmetric (Unix)
+ Generates an .afm font metrics file by interpretation of the font
+ using GhostScript. Like makeafm, this script will try to include
+ kerning information from previous sources.
+
+ Syntax: getmetric font-file-base [/FontName]
+ Don't include .pfb / .pfa suffix in file name.
+ Explicit /FontName can choose among several fonts in file.
+ Examples:
+ getmetric photina
+ getmetric hvn_____ /Helvetica-Narrow
+
+ Disadvantage: GhostScript in its current version still has a bug
+ which causes incorrect width information to be calculated for
+ characters composed by seac and having a different width from their
+ base character - actually, this should not be allowed according to
+ the type 1 font specification, but to accomodate existing fonts to
+ work, rather Adobe's "Do what we implement" semantics should be
+ realized. The problem especially occurs with fonts bundled with
+ Micrografx Designer (which even compose characters like double
+ qoute marks from single quote marks etc), so don't apply getmetri
+ on them.
+
+ Required: GhostScript
+ getmetri.ps (enclosed), which is a corrected and enhanced
+ version of the PostScript program posted by W.T. Roberts
+ and Bryan Bayerdorffer.
+
+pfbshow.bat (MSDOS)
+gpreview (Unix)
+preview (Unix)
+pfbpr.bat (MSDOS)
+preprint (Unix)
+ [preview and preprint differ from gpreview only by their name and
+ can be created by setting respective links.]
+ Generates a sample text and character set listing of up to four
+ fonts (preferably of one family).
+ The latter two print, the first three display on screen.
+
+ Syntax: pfbshow fontfile1 [fontfile2 [fontfile3 [fontfile4]]]
+ pfbpr fontfile1 [fontfile2 [fontfile3 [fontfile4]]]
+ preview (fontfile|fontname) ...
+ Up to four fonts make sense. The Unix scripts can accept
+ FontNames instead of file names to explicitly select a
+ font which must then be previously known to the interpreter.
+ Examples:
+ pfbshow photina.pfb
+ pfbshow photina photinai photinab
+ gpreview Times-Roman.pfb /Hershey-Roman
+
+ Required:
+ one of several .pfb/.pfa converters (e.g. from t1utils)
+ pfbshow.bat, pfbpr.bat: pfshow.ps (enclosed)
+ pfbshow, gpreview, pfbpr: GhostScript
+ preprint: a PostScript printer
+ preview: a type 1 font emulation package for OpenWindows
+ and a font disassembler (e.g. from t1utils)
+ (or maybe, native type 1 font interpretation in
+ OpenWindows 3.1 which I don't have)
+
+pcs.bat (MSDOS)
+ Display the character set of a font in comparison with that of
+ an installed reference font (or a second font) including a
+ coloured width and slant angle box. It can be used to judge
+ quality, similarity, and correct/incorrect character set assignment
+ of fonts.
+
+ Syntax: pcs filename [filename2]
+ Examples:
+ pcs gocmase_.pfb
+ pcs agar agarsc
+
+pfblist.bat (MSDOS)
+ Generates a list of file and font names of the current directory.
+ Requires: pfbnames.pas/.exe (enclosed)
+
+afm-pfm.bat (MSDOS)
+ Generates .pfm from .afm files using Adobe's makepfm program.
+ Generates .inf information as needed for makepfm. Also tries
+ to extract the correct Bold/Italic combination from .afm information.
+ Can be called with explicit information about the Windows menu
+ font name and Bold/Italic combination to be used.
+
+ Syntax: afm-pfm fontfile [MSMenuName | - ] [N | I | B | T]
+ Don't include .afm suffix in fontfile.
+ MSMenuName selects a name under which the font should appear
+ in MS Windows menus for most programs if this is different
+ from the FamilyName in the .afm file. (Annoyingly, only
+ 4 fonts can be grouped under one name in MS Windows.)
+ N forces the generated style information to be normal,
+ I italic, B bold, T bold-italic.
+ Examples:
+ afm-pfm agar
+ afm-pfm agarb AGaramondBold N
+ If the MS menu name to be generated should contain blanks, an .inf
+ file must be generated first and the name inserted there.
+
+ Required: makepfm.exe from Adobe's "font foundry".
+
+afm-inf.bat (MSDOS)
+ Part of afm-pfm, can also be called separately.
+ Example: afm-inf agar
+
+afm-sort.bat (MSDOS)
+ Sorts the pair kerning list within an .afm file. Needed for some
+ .afm files to prevent Adobe's simple-minded makepfm program
+ from crashing.
+ Example: afm-sort agar
+
+pfb-abf.bat (MSDOS)
+ Generate .abf files for 72x72 resolution as required to generate
+ FrameMaker screen font files for use on Sun workstations.
+
+ Syntax: pfb-abf fontname [outnam [resolutionx [resolutiony [encoding]]]]
+ Don't include .pfb suffix in fontname.
+ If fontname is longer than 6 characters a unique outnam with
+ at most 6 characters must additionally be specified (five if
+ you should generate point sizes > 99).
+ Screen resolution defaults to 72x72 (for Sun workstations)
+ but can be changed.
+ The encoding vector to be applied (to be given without its
+ .enc suffix) defaults to fontname.ENC if that exists,
+ C:\Adobe\APPLE.ENC otherwise (adapt the path in the script
+ to where you place the APPLE.ENC file enclosed).
+ The set of point sizes to be generated defaults to
+ 10 12 14 18 24 but may changed by the environment variable
+ SIZES, e.g. (for display fonts) set SIZES=18 24 36
+ Note that FrameMaker needs at least sizes 18 and 24.
+
+ Required: makebit.exe, makeabf.exe from Adobe's "font foundry".
+
+pfb-sfp.bat (MSDOS)
+ Generate HP Laserjet soft fonts from .pfb fonts.
+
+ Syntax: pfb-abf fontname [outnam [resolutionx [resolutiony [encoding]]]]
+ Don't include .pfb suffix in fontname.
+ If fontname is longer than 6 characters a unique outnam with
+ at most 6 characters must additionally be specified (five if
+ you should generate point sizes > 99).
+ Printer resolution defaults to 300x300.
+ The encoding vector to be applied (to be given without its
+ .enc suffix) defaults to fontname.ENC if that exists,
+ C:\Adobe\foundry\W.ENC otherwise (adapt path in the script).
+ The set of point sizes to be generated defaults to
+ 10 12 but may changed by the environment variable PSIZES,
+ e.g. set PSIZES=9 10 12 14 18
+
+ Required: makebit.exe, makeljf.exe from Adobe's "font foundry".
+
+pfb-enc.bat (MSDOS)
+ Extracts an .ENC encoding description from a font specific encoding
+ vector for use with pfb-abf or pfb-sfp.
+ Example:
+ pfb-enc agarexp
+
+fm.ps
+ A one-liner. Prepended to FrameMaker generated PostScript files
+ it makes them work with GhostScript.
+
+compose.bat (MSDOS) (not included)
+ This script calculates positions of accent marks and other
+ character parts to be composed for composed characters.
+ It can be used as batch file or interactively, enabling
+ visual correction of character slant values, accent distance, etc.
+ The program (actually, compose.ps) generates output usable by my
+ "t1tidy" program which will then generate according characters
+ into the font.
+ Since the interactive version has not been developed to a state
+ I would like to see posted publically (I have only used it myself
+ for a few fonts) it is not included in the ftp-able package but
+ I will mail it to anyone who states interest.
+
+Debugging: All MSDOS scripts accept an additional first parameter "-"
+in which case they do not delete their intermediate files.
+
+Remark: Due to that silly MSDOS path restriction, all my MSDOS scripts
+(.bat files) contain full path names for several programs. These will have
+to be adapted to your installation. Also, for pcs, a reference font will
+have to be chosen and installed in the script.
diff --git a/fonts/utilities/t1tools/t1tidy/@t1tidy.doc b/fonts/utilities/t1tools/t1tidy/@t1tidy.doc
new file mode 100644
index 0000000000..61f728f91d
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/@t1tidy.doc
@@ -0,0 +1,281 @@
+t1tidy - tidy up your type 1 font programs
+May 1993 version
+
+Purpose
+ This program was intended and is capable to reduce the size
+ of many amateur font programs (type 1 fonts) significantly, i.e.
+ by 20-35% (this also applies to many of the clone fonts bundled with
+ Coreldraw and some of those bundled with Micrografx Designer).
+ Of course, no loss of information will occur.
+ The reduction is achieved by 3 different operations:
+ - Find common subpaths in the character descriptions and put them
+ into subroutines (Subrs entry). Apparently, many font generating
+ programs (e.g. FontMonger) are not clever enough to do this.
+ - If an explicit encoding vector is present in a text font, this
+ should be replaced by the simple entry
+ /Encoding StandardEncoding def
+ The explicit vector is stupid anyway since automatic adjustment
+ to the operating system specific (or otherwise environment
+ specific) encoding scheme will often be disabled. And it's also
+ a waste of storage (more than 4 KB!).
+ - Many amateur fonts around were apparently generated by font
+ software (e.g. ZSoft's SoftType) which is so stupid as to
+ include a large bunch of PostScript code for hint replacement
+ and curve flexing although the font does not use these features
+ at all. t1tidy detects if no use of that code occurs and in that
+ case removes that junk code (5 KB, after all!).
+
+Further functions of t1tidy are:
+ - Insert dummy zero-move commands where subpaths start with a
+ drawing command. Their omission, although alright according to
+ the type 1 format specifications, appeared to cause display
+ problems with ATM 1.3 which would display inappropriate junk
+ lines (I have not checked this with ATM 2).
+ - t1tidy can attempt to generate some missing characters from
+ others, namely quote marks.
+ - t1tidy can generate composite characters from their base
+ characters and accents if external composition information
+ if given. This can either be supplied by the CC lines of an afm
+ file or can be generated separately by a PostScript script
+ attached to this package, 'compose.bat' and 'compose.ps'.
+ - Empty character descriptions are removed to make them free
+ for automatically generated characters (and to save some space).
+ Some font generation programs seem to store entries for all
+ character names of their favourite encoding even if the designer
+ of the font was too lazy to design that character.
+ - If an afm file is present, it is copied along with the
+ transformation. All metrics entries are checked and
+ corrected if necessary and missing entries and entries for
+ generated characters are supplemented.
+ - Optionally, t1tidy can also expand (instead of factor out)
+ existing Subrs into full character path descriptions. This is
+ useful to take characters from one font into another.
+
+Why is there a need to reduce storage at all?
+ Smaller font files do not only reduce the amount of disk storage
+ used which might be of less interest to some people. They also
+ reduce virtual memory use in the PostScript printer which may
+ already be less available. And, of course, downloading time (there
+ are still a lot of PostScript printers connected by serial lines).
+
+Liability
+ None. Don't delete the original font file before you have verified
+ that the tidied font works.
+
+Copyright
+ 1. Private users without commercial advantage from using fonts
+ may apply t1tidy freely to any font file not created by
+ themselves (cf. 3.) for private, non-commercial use.
+ 2. Commercial users send 15 ECU / 20 US$ to me. Remember
+ that you may save downloading time with t1tidy and time is money!
+ 3. Font designers who lack appropriate font software and wish
+ to use t1tidy to keep their font small or to generate
+ additional characters, are permitted to use it with the
+ following restrictions:
+ - I request that a free copy of your font is granted and sent
+ to me.
+ - If you make a text font based on the Latin alphabet (i.e. not
+ a Chinese, Cyrillic, etc. or an ornamental font),
+ I only allow to use t1tidy on it if character set completeness
+ is respected:
+ Your font should contain all characters of
+ AdobeStandardEncoding, and also all commonly used combinations
+ of letters and accent marks as included, e.g., in the
+ Windows 3.1 character set (a superset of ISO-Latin-1) or the
+ Macintosh character set.
+ If you only make a stub font without these characters, using
+ t1tidy on it is a violation of my copyright. Sorry, but I'm
+ really fed up with all these useless junk fonts I've wasted
+ downloading time for.
+
+Requirements
+ MSDOS, (Turbo-Pascal to compile).
+ Type 1 font disassembling and assembling software. I recommend
+ t1utils which is freely available on ftp servers. A future
+ version of t1tidy may perform this step itself.
+
+Syntax
+ t1tidy [options] infont.ps outfont.ps
+ or, with batch file:
+ t1t [options] infont outfont
+ t1t [options] infont outdir
+
+ The font name(s) for t1t must be given without any suffix. (The
+ primitive MSDOS command interpreter does not allow for such things
+ as stripping suffixes for more comfortable command processing.)
+ Also unfortunately, the stupid MSDOS command interpreter does not
+ allow us to recognize if the first argument start with a '-', so we
+ can only have a small number of specific option strings here.
+ Option strings recognized by t1t are: -g, -e, -ge, -eg, -s, +c, +x .
+ Within t1t, add recognizable option sets to your needs or the -v
+ option according to your taste.
+
+ For convenience, the second argument to the scripts can be the
+ name of a directory which the tidied fonts are then collected in.
+ This simplifies working on a bunch of fonts.
+ In t1t, modify the paths of t1tidy.exe and the type 1 font
+ assembly/disassembly programs according to your installation.
+
+Actions
+ The transformation will be performed on the (disassembled type 1)
+ font file infont.ps and written to outfont.ps. If infont.afm is
+ present, it will be copied to outfont.afm and modifications
+ accordingly applied, including renumbering of the entries if the
+ -e option is given.
+ Incomplete afm files will be completed with respect to some
+ basic entries (e.g. CapHeight which is needed by Adobe's makepfm)
+ and adding missing bounding boxes from default assumptions (also
+ required for some metrics transformation software).
+
+Options
+ Except for +c, all options are selected by default! Options can
+ be selected with +<letter> or deselected with -<letter>.
+ s split Perform path splitting and subroutine extraction.
+ t1tidy cannot currently generate new Subrs for
+ fonts which do not already have a Subrs entry.
+ In that case, insert one manually in the
+ disassembled version of the font:
+ /Subrs 4 array
+ dup 0 {} put
+ dup 1 {} put
+ dup 2 {} put
+ dup 3 {} put
+ def
+ into the font directory, typically called
+ /FontDirectory, typically before the lines
+ end NP
+ dup /CharString ... dict dup begin
+ (details may vary). The size of the font directory
+ might have to be increased by 1.
+ This option should be disabled, e.g., if some
+ aspect of the font is too large to handle it but
+ another function of t1tidy (e.g. character
+ generation) shall be applied.
+ e encoding Replace encoding vector with StandardEncoding.
+ This option should and should only be deselected
+ for use on ornamental or foreign letter-type fonts
+ if they use their own character naming scheme.
+ o OtherSubrs Enable removal of OtherSubrs unless they are used
+ in the font. This saves 5 KB of wasted storage in
+ many amateur fonts (e.g. generated by SoftType).
+ g generate Try to generate missing quote marks from others.
+ The following generations are implemented:
+ halfchar ('/quotedbl', '/quotesingle');
+ downchar ('/quotedblright', '/quotedblbase');
+ halfchar ('/quotedblbase', '/quotesinglbase');
+ halfchar ('/quotedblleft', '/quoteleft');
+ halfchar ('/quotedblright', '/quoteright');
+ downchar ('/quoteright', '/quotesinglbase');
+ halfchar ('/guillemotleft', '/guilsinglleft');
+ halfchar ('/guillemotright', '/guilsinglright');
+ copychar ('/less', '/guilsinglleft');
+ copychar ('/greater', '/guilsinglright');
+ either copychar ('/endash', '/minus')
+ or copychar ('/hyphen', '/minus');
+ copychar ('/slash', '/fraction');
+ copychar ('/bar', '/brokenbar');
+ copychar ('/asciitilde', '/tilde');
+ copychar ('/asciicircum', '/circumflex');
+ copychar ('/degree', '/ring');
+ halfchar generates the second from the first by
+ taking the first closed part of its path description.
+ downchar generates the second from the first by
+ setting its vertical offset to zero. Hints are
+ adjusted.
+ copychar copies the first into the second.
+ Every generation is only performed if the affected
+ character does not already exist.
+ Deselect this option if the font is not a Latin
+ letter font (i.e., e.g., Greek, or ornaments) but
+ contains its foreign letters or symbols under Latin
+ letter names (as is often the case).
+ x expand Reexpands existing Subrs into full character path
+ descriptions. This is useful to take characters from
+ one font into another.
+ a afmcheck Enables checking of afm entries for all characters.
+ c corelfix Apply 3 fixes for problems encountered with
+ wfn font files (those transformed with WFNBOSS
+ from CorelDraw 2 fonts - I don't know if the same
+ problems occur with CorelDraw 3 fonts).
+ Exchange wrongly encoded characters, derive some
+ missing characters from others (i.e., -g is implied),
+ solve the UniqueID problem by assigning increasing
+ UniqueID values using a configuration file
+ uniqueid.int.
+ As long as you tidy wfn font files, you should keep
+ the file uniqueid.int (generated on first use)
+ always in the working directory.
+ (The zero-move command insertion also primarily
+ serves wfn fonts, but not exclusively.)
+ t ttfix Rename characters from PostScript-embedded fonts
+ which Windows generated from TrueType fonts
+ (manual adjustments still to be done).
+ v verbose Tell user about every major step.
+
+Procedure:
+ 1. Display or print a sample of the font to be tidied to determine
+ if any characters are misplaced (i.e. are not registered with
+ their correct name) or any junk characters take positions which
+ need to be used for automatic character generation. You may use
+ my "pcs.bat" and "pcs.ps" for character set display, or
+ "pfbshow.bat" and "pfshow.ps" for style and character samples.
+ Manually change the names of misplaced characters or delete the
+ descriptions of useless characters. Some fonts contain a
+ character showing a copyright notice. This tends to comsume
+ up to 5KB of memory due to an extraordinarily long character
+ path which also exceeds t1tidy's path length limit.
+ 2. Apply t1tidy to perform path length reduction and generation
+ of characters, e.g. single from double quotemarks, circumflex
+ from asciicircum (sometimes not nice) etc. If important accent
+ marks are still missing: if the font conatains not all but some
+ accented characters, try to extract accents from characters
+ by manually removing parts of their character description (after
+ copying the path and giving the copy the right name), else
+ design new accent marks or take them from another font fitting
+ to the font style.
+ 3. If accented character are to be generated, generate an .afm or
+ .cc file containing appropriate "CC ..." entries for them. You
+ can use my "compose.bat" and "compose.ps" for this task. Then
+ apply t1tidy again to incorporate the compositions into the font.
+
+Precautions to be observed:
+1. t1tidy should not be applied to professional quality fonts. It should
+ be expected from professional fonts anyway that optimizations
+ like those performed by t1tidy should not be necessary. (However,
+ this need not always be the case. I have seen commercially sold
+ text fonts which included explicit encoding vectors and few Subrs.)
+2. t1tidy will crash and leave incomplete output on fonts which are too
+ large or contain too large character paths. This is basically
+ due to the old 640KB restriction and will probably change when
+ compiled with Turbo-Pascal 7 (I don't have it yet). For the path
+ length restriction, also constant maxpathlen in pathunit.pas and
+ some code would have to be changed because I did not implement
+ path description storage with a dynamic data structure since this
+ would have caused even more memory problems in the 640KB limited
+ version.
+
+Future improvements
+ - Repeated applications of t1tidy would currently not find
+ common subpaths between already existing Subrs and newly
+ extracted subpaths. This should really be smoothed.
+ Moreover, more than a single level of common subpath extraction
+ might be desirable.
+ - An initial Subrs entry should be generated automatically if no
+ one is present.
+ - When trying to generate a half or doubled character description,
+ subpath determination should consider Subrs called. Also stems
+ should be adjusted.
+ - More automization on extracting embedded fonts generated from
+ printing TrueType fonts might be useful.
+ - More information in the afm file should be checked and corrected,
+ like FontName, EncodingScheme, etc.
+
+Availability
+ by ftp from ftp.fu-berlin.de: pub/postscript/t1tidy.zip
+
+Author
+ Thomas Wolff
+ Hebbelstra$e 3
+ D-10585 Berlin
+ wolff@inf.fu-berlin.de
+
diff --git a/fonts/utilities/t1tools/t1tidy/afm.pas b/fonts/utilities/t1tools/t1tidy/afm.pas
new file mode 100644
index 0000000000..676deeaafe
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/afm.pas
@@ -0,0 +1,361 @@
+unit afm;
+
+
+interface
+
+procedure openafm (var afmin, afmout: text);
+procedure closeafm (var afmin, afmout: text);
+
+procedure getafmchar (var C, WX: integer; name: string; var lx, ly, rx, ry: integer);
+procedure putafmchar (C, WX: integer; pname: string; lx, ly, rx, ry: integer);
+
+procedure opencc (var ccin: text);
+procedure composeCCs;
+
+
+implementation
+
+uses strtype, data, pathunit;
+
+function makeint (s: string): integer;
+var i, c: integer;
+begin
+ val (s, i, c);
+ makeint := i
+end;
+
+function intstr (i: integer): string;
+var s: string;
+begin
+ str (i, s);
+ intstr := s
+end;
+
+var line: strec;
+
+procedure readline (var f: text);
+(* accept DOS, Unix, and Mac line-ends *)
+var s: string;
+ c: char;
+begin
+ c := ' ';
+ s := '';
+ while not eoln (f) and (c <> #$0A) do begin
+ read (f, c);
+ if c <> #$0A then s := s + c
+ end;
+ if eoln (f) then readln (f);
+ line.ini (s)
+end;
+
+type ligpoi = ^ ligature;
+ ligature = record
+ second, ligname: string [30];
+ nextlig: ligpoi
+ end;
+ charmetrics = record
+ C: integer;
+ WX: integer;
+ N: string [30];
+ lx, ly, rx, ry: integer;
+ lig: ligpoi;
+ end;
+ charmetricspoi = ^ charmetrics;
+ composespec = record
+ name, name1, name2: string [30];
+ x1, y1, x2, y2: integer;
+ end;
+ composespecpoi = ^ composespec;
+
+const maxmetricsentry = 600;
+ maxcomposeentry = 300;
+var charentries: array [0..maxmetricsentry] of charmetricspoi;
+ (* 0..255 are encoded entries, those above are unencoded *)
+ composeentries: array [1..maxcomposeentry] of composespecpoi;
+ unencodedindex: integer;
+ afmopen: Boolean;
+ entrycount, composecount: integer;
+ CapHeight, XHeight, Ascender, Descender: Boolean;
+ afmintermediate: text;
+
+procedure parseCC (line: strec; fromafm: Boolean);
+(* parse a line like CC Aacute 2 ; PCC A 0 0 ; PCC acute 183 227 ; *)
+var composeentry: composespec;
+begin
+ with composeentry do begin
+ name := line.nexttoken;
+ if line.nexttoken <> '2' then begin
+ if fromafm (* or afmopen ? But then include StartComposites etc. *)
+ then writeln (afmintermediate, line.str);
+ end else begin
+ if fromafm (* or afmopen ? *)
+ then writeln (afmintermediate, line.str);
+ (* or re-generate entries? *)
+ line.gotonexttoken; line.gotonexttoken;
+ name1 := line.nexttoken;
+ x1 := makeint (line.nexttoken);
+ y1 := makeint (line.nexttoken);
+ line.gotonexttoken; line.gotonexttoken;
+ name2 := line.nexttoken;
+ x2 := makeint (line.nexttoken);
+ y2 := makeint (line.nexttoken);
+ composecount := composecount + 1;
+ new (composeentries [composecount]);
+ composeentries [composecount] ^ := composeentry;
+ end
+ end
+end;
+
+procedure openafm (var afmin, afmout: text);
+var charentry: charmetrics;
+ newmetric: charmetricspoi;
+ afmcmd: string;
+ FontBBoxlx, FontBBoxly, FontBBoxrx, FontBBoxry: integer;
+ i: integer;
+
+ function getligature: ligpoi;
+ var newlig: ligpoi;
+ begin
+ line.gotonexttoken;
+ if line.nexttoken = 'L' then begin
+ new (newlig);
+ newlig ^. second := line.nexttoken;
+ newlig ^. ligname := line.nexttoken;
+ newlig ^. nextlig := getligature;
+ getligature := newlig
+ end
+ else getligature := nil
+ end;
+
+begin
+ afmopen := true;
+ rewrite (afmout);
+ (* set defaults: *)
+ FontBBoxlx := 0;
+ FontBBoxly := 0;
+ FontBBoxrx := 0;
+ FontBBoxry := 0;
+ CapHeight := false;
+ XHeight := false;
+ Ascender := false;
+ Descender := false;
+ for i := 0 to maxmetricsentry do charentries [i] := nil;
+ unencodedindex := 255;
+
+ readline (afmin); afmcmd := line.firsttoken;
+ while afmcmd <> 'StartCharMetrics' do begin
+ writeln (afmout, line.str);
+ if afmcmd = 'FontBBox' then begin
+ FontBBoxlx := makeint (line.nexttoken);
+ FontBBoxly := makeint (line.nexttoken);
+ FontBBoxrx := makeint (line.nexttoken);
+ FontBBoxry := makeint (line.nexttoken);
+ end
+ else if afmcmd = 'CapHeight' then CapHeight := true
+ else if afmcmd = 'XHeight' then XHeight := true
+ else if afmcmd = 'Ascender' then Ascender := true
+ else if afmcmd = 'Descender' then Descender := true
+ ;
+ readline (afmin); afmcmd := line.firsttoken
+ end;
+ readline (afmin);
+ while line.nexttoken = 'C' do with charentry do begin
+ C := makeint (line.nexttoken);
+ line.gotonexttoken; line.gotonexttoken;
+ WX := makeint (line.nexttoken);
+ line.gotonexttoken; line.gotonexttoken;
+ N := line.nexttoken;
+ if N <> ';' (* name may be missing, e.g. with wfnboss's files *)
+ then begin
+ if stdenc then C := getSEcode ('/' + N);
+ entrycount := entrycount + 1;
+ line.gotonexttoken;
+ if line.nexttoken = 'B' then begin
+ lx := makeint (line.nexttoken);
+ ly := makeint (line.nexttoken);
+ rx := makeint (line.nexttoken);
+ ry := makeint (line.nexttoken);
+ end else begin
+ lx := FontBBoxlx;
+ ly := FontBBoxly;
+ rx := FontBBoxrx;
+ ry := FontBBoxry;
+ end;
+ lig := getligature;
+ if C = 0 then C := -1 (* makepfm doesn't like 0 *);
+ new (newmetric);
+ newmetric^ := charentry;
+ if C >= 0 then charentries [C] := newmetric
+ else begin
+ unencodedindex := unencodedindex + 1;
+ charentries [unencodedindex] := newmetric;
+ end;
+ end;
+ readline (afmin);
+ end;
+ makefilebuffer (afmintermediate, 'afminter.med');
+ repeat
+ writeln (afmintermediate, line.str);
+ if not eof (afmin) then readline (afmin);
+ until eof (afmin) or (line.firsttoken = 'CC');
+ if not eof (afmin) then
+ while line.firsttoken = 'CC' do begin
+ parseCC (line, true);
+ readline (afmin);
+ end;
+end;
+
+procedure opencc (var ccin: text);
+var s: string;
+ ccline: strec;
+begin
+ while not eof (ccin) do begin
+ readln (ccin, s);
+ ccline.ini (s);
+ if ccline.firsttoken = 'CC' then parseCC (ccline, false);
+ end
+end;
+
+procedure closeafm (var afmin, afmout: text);
+var c: char;
+ i: integer;
+
+ procedure writelig (lp: ligpoi);
+ begin
+ if lp <> nil then begin
+ write (afmout, ' L ', lp^.second, ' ', lp^.ligname, ' ;');
+ writelig (lp^.nextlig)
+ end
+ end;
+
+begin
+ if not CapHeight then if charentries [ord ('H')] <> nil then
+ writeln (afmout, 'CapHeight ', charentries [ord ('H')]^.ry);
+ if not XHeight then if charentries [ord ('x')] <> nil then
+ writeln (afmout, 'XHeight ', charentries [ord ('x')]^.ry);
+ if not Ascender then if charentries [ord ('d')] <> nil then
+ writeln (afmout, 'Ascender ', charentries [ord ('d')]^.ry);
+ if not Descender then if charentries [ord ('p')] <> nil then
+ writeln (afmout, 'Descender ', charentries [ord ('p')]^.ly);
+ writeln (afmout, 'StartCharMetrics ', entrycount);
+ for i := 0 to maxmetricsentry do if charentries [i] <> nil then
+ with charentries [i]^ do begin
+ write (afmout, 'C ', C, ' ; WX ', WX, ' ; N ', N,
+ ' ; B ', lx, ' ', ly, ' ', rx, ' ', ry, ' ;');
+ writelig (lig);
+ if (N = 'f') and (lig = nil) then begin
+ if getCharString ('/fi') <> nil then write (afmout, ' L i fi ;');
+ if getCharString ('/fl') <> nil then write (afmout, ' L l fl ;');
+ end;
+ writeln (afmout)
+ end;
+ getfilebuffer (afmintermediate, afmout);
+ writeln (afmout, line.str);
+ while not eof (afmin) do begin
+ read (afmin, c);
+ write (afmout, c);
+ end;
+ close (afmin);
+ close (afmout);
+end;
+
+function purename (s: string): string;
+begin
+ if pos ('/', s) = 1 then purename := copy (s, 2, length (s) - 1)
+ else purename := s
+end;
+
+procedure composeCCs;
+var i: integer;
+ cc1, cc2: integer;
+ CS1, CS2: CharStrpointer;
+ pname, pname1, pname2: string [30];
+begin
+ for i := 1 to composecount do with composeentries [i] ^ do begin
+ pname := '/' + name;
+ pname1 := '/' + name1;
+ pname2 := '/' + name2;
+ if getCharString (pname) = nil then
+ if (x1 = 0) and (y1 = 0) then begin
+ cc1 := getSEcode (pname1);
+ cc2 := getSEcode (pname2);
+ CS1 := getCharString (pname1);
+ CS2 := getCharString (pname2);
+ if (cc1 >= 0) and (cc2 >= 0)
+ and (CS1 <> nil) and (CS2 <> nil) then begin
+ CharStringscount := CharStringscount + 1;
+ new (CharStrings [CharStringscount], ini);
+ CharStrings [CharStringscount] ^ . setname (pname);
+ CharStrings [CharStringscount] ^ . compose
+ (CS1, CS2, cc1, cc2, x2, y2)
+ end
+ end
+ else writeln ('% cannot compose with first char offset')
+ end
+end;
+
+procedure getafmchar (var C, WX: integer; name: string; var lx, ly, rx, ry: integer);
+var i: integer;
+ N: string;
+begin
+ N := purename (name);
+ C := -2; (* error indication if not found *)
+ WX := 0;
+ lx := 0; ly := 0; rx := 0; ry := 0;
+ if afmopen then begin
+ for i := 0 to maxmetricsentry do if charentries [i] <> nil then
+ if charentries [i]^.N = N then begin
+ C := charentries [i]^.C;
+ WX := charentries [i]^.WX;
+ lx := charentries [i]^.lx;
+ ly := charentries [i]^.ly;
+ rx := charentries [i]^.rx;
+ ry := charentries [i]^.ry;
+ end
+ end
+end;
+
+procedure putafmchar (C, WX: integer; pname: string; lx, ly, rx, ry: integer);
+var index: integer;
+ name: string [30];
+ found: Boolean;
+begin
+ name := purename (pname);
+ if afmopen then begin
+ if C >= 0 then
+ if charentries [C] = nil then index := C
+ else if charentries [C]^.N = name then index := C
+ else C := -1;
+ if C < 0 then begin
+ index := 255; (* last encoded index *)
+ found := false;
+ repeat index := index + 1;
+ if index > unencodedindex then begin
+ found := true;
+ unencodedindex := index;
+ end else if charentries [index] <> nil
+ then if charentries [index]^.N = name
+ then found := true
+ until found
+ end;
+ if charentries [index] = nil then begin
+ entrycount := entrycount + 1;
+ new (charentries [index]);
+ charentries [index]^.N := name;
+ charentries [index]^.lig := nil;
+ end;
+ charentries [index]^.C := C;
+ charentries [index]^.WX := WX;
+ charentries [index]^.lx := lx;
+ charentries [index]^.ly := ly;
+ charentries [index]^.rx := rx;
+ charentries [index]^.ry := ry;
+ end
+end;
+
+begin
+ afmopen := false;
+ ccopen := false;
+ entrycount := 0;
+ composecount := 0;
+end.
diff --git a/fonts/utilities/t1tools/t1tidy/data.pas b/fonts/utilities/t1tools/t1tidy/data.pas
new file mode 100644
index 0000000000..f0d427f5b7
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/data.pas
@@ -0,0 +1,158 @@
+unit data;
+
+
+interface
+
+uses pathunit;
+
+(* options: *)
+
+var corelfix, generate, split, ttfix, verbose, stdenc,
+ noOtherSubrs, afmcheck: Boolean;
+
+(* flags: *)
+
+var afmopen, ccopen: Boolean;
+
+(* CharStrings storage *)
+
+const maxCharStrings = 300;
+
+var CharStrings: array [1..maxCharStrings] of CharStrpointer;
+ CharStringscount: integer;
+
+(* Encoding vectors *)
+
+const (* Windows encoding vector used for ttfix option *)
+ WinANSI: array [0..255] of string [30] = (
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/space', '/exclam', '/quotedbl', '/numbersign', '/dollar', '/percent', '/ampersand', '/quotesingle',
+ '/parenleft', '/parenright', '/asterisk', '/plus', '/comma', '/hyphen', '/period', '/slash',
+ '/zero', '/one', '/two', '/three', '/four', '/five', '/six', '/seven',
+ '/eight', '/nine', '/colon', '/semicolon', '/less', '/equal', '/greater', '/question',
+ '/at', '/A', '/B', '/C', '/D', '/E', '/F', '/G', '/H', '/I', '/J', '/K', '/L', '/M', '/N', '/O',
+ '/P', '/Q', '/R', '/S', '/T', '/U', '/V', '/W',
+ '/X', '/Y', '/Z', '/bracketleft', '/backslash', '/bracketright', '/asciicircum', '/underscore',
+ '/grave', '/a', '/b', '/c', '/d', '/e', '/f', '/g', '/h', '/i', '/j', '/k', '/l', '/m', '/n', '/o',
+ '/p', '/q', '/r', '/s', '/t', '/u', '/v', '/w',
+ '/x', '/y', '/z', '/braceleft', '/bar', '/braceright', '/asciitilde', '/.notdef',
+ '/.notdef', '/.notdef', '/quotesinglbase', '/florin',
+ '/quotedblbase', '/ellipsis', '/dagger', '/daggerdbl',
+ '/circumflex', '/perthousand', '/Scaron', '/guilsinglleft', '/OE', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/quoteleft', '/quoteright', '/quotedblleft',
+ '/quotedblright', '/bullet', '/endash', '/emdash',
+ '/tilde', '/trademark', '/scaron', '/guilsinglright', '/oe', '/.notdef', '/.notdef', '/Ydieresis',
+ '/space', '/exclamdown', '/cent', '/sterling', '/currency', '/yen', '/brokenbar', '/section',
+ '/dieresis', '/copyright', '/ordfeminine', '/guillemotleft',
+ '/logicalnot', '/minus', '/registered', '/macron',
+ '/degree', '/plusminus', '/twosuperior', '/threesuperior',
+ '/acute', '/mu', '/paragraph', '/periodcentered',
+ '/cedilla', '/onesuperior', '/ordmasculine', '/guillemotright',
+ '/onequarter', '/onehalf', '/threequarters', '/questiondown',
+ '/Agrave', '/Aacute', '/Acircumflex', '/Atilde', '/Adieresis', '/Aring', '/AE', '/Ccedilla',
+ '/Egrave', '/Eacute', '/Ecircumflex', '/Edieresis', '/Igrave', '/Iacute', '/Icircumflex', '/Idieresis',
+ '/Eth', '/Ntilde', '/Ograve', '/Oacute', '/Ocircumflex', '/Otilde', '/Odieresis', '/multiply',
+ '/Oslash', '/Ugrave', '/Uacute', '/Ucircumflex', '/Udieresis', '/Yacute', '/Thorn', '/germandbls',
+ '/agrave', '/aacute', '/acircumflex', '/atilde', '/adieresis', '/aring', '/ae', '/ccedilla',
+ '/egrave', '/eacute', '/ecircumflex', '/edieresis', '/igrave', '/iacute', '/icircumflex', '/idieresis',
+ '/eth', '/ntilde', '/ograve', '/oacute', '/ocircumflex', '/otilde', '/odieresis', '/divide',
+ '/oslash', '/ugrave', '/uacute', '/ucircumflex', '/udieresis', '/yacute', '/thorn', '/ydieresis'
+ );
+
+ (* StandardEncoding vector used for generate option *)
+ StandardEncoding: array [0..255] of string [30] = (
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/space', '/exclam', '/quotedbl', '/numbersign', '/dollar', '/percent', '/ampersand', '/quoteright',
+ '/parenleft', '/parenright', '/asterisk', '/plus', '/comma', '/hyphen', '/period', '/slash',
+ '/zero', '/one', '/two', '/three', '/four', '/five', '/six', '/seven',
+ '/eight', '/nine', '/colon', '/semicolon', '/less', '/equal', '/greater', '/question',
+ '/at', '/A', '/B', '/C', '/D', '/E', '/F', '/G', '/H', '/I', '/J', '/K', '/L', '/M', '/N', '/O',
+ '/P', '/Q', '/R', '/S', '/T', '/U', '/V', '/W',
+ '/X', '/Y', '/Z', '/bracketleft', '/backslash', '/bracketright', '/asciicircum', '/underscore',
+ '/quoteleft', '/a', '/b', '/c', '/d', '/e', '/f', '/g', '/h', '/i', '/j', '/k', '/l', '/m', '/n', '/o',
+ '/p', '/q', '/r', '/s', '/t', '/u', '/v', '/w',
+ '/x', '/y', '/z', '/braceleft', '/bar', '/braceright', '/asciitilde', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/exclamdown', '/cent', '/sterling', '/fraction', '/yen', '/florin', '/section',
+ '/currency', '/quotesingle', '/quotedblleft', '/guillemotleft',
+ '/guilsinglleft', '/guilsinglright', '/fi', '/fl',
+ '/.notdef', '/endash', '/dagger', '/daggerdbl',
+ '/periodcentered', '/.notdef', '/paragraph', '/bullet',
+ '/quotesinglbase', '/quotedblbase', '/quotedblright', '/guillemotright',
+ '/ellipsis', '/perthousand', '/.notdef', '/questiondown',
+ '/.notdef', '/grave', '/acute', '/circumflex', '/tilde', '/macron', '/breve', '/dotaccent',
+ '/dieresis', '/.notdef', '/ring', '/cedilla', '/.notdef', '/hungarumlaut', '/ogonek', '/caron',
+ '/emdash', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/AE', '/.notdef', '/ordfeminine', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/Lslash', '/Oslash', '/OE', '/ordmasculine', '/.notdef', '/.notdef', '/.notdef', '/.notdef',
+ '/.notdef', '/ae', '/.notdef', '/.notdef', '/.notdef', '/dotlessi', '/.notdef', '/.notdef',
+ '/lslash', '/oslash', '/oe', '/germandbls', '/.notdef', '/.notdef', '/.notdef', '/.notdef'
+ );
+
+function getCharString (n: string): CharStrpointer;
+function getSEcode (n: string): integer;
+procedure makefilebuffer (var buf: text; name: string);
+procedure getfilebuffer (var buf, out: text);
+
+
+implementation
+
+uses Dos;
+
+function getCharString (n: string): CharStrpointer;
+var i: integer;
+begin
+ i := 1;
+ getCharString := nil;
+ while i <= CharStringscount do
+ if CharStrings [i] ^.name = n then begin
+ getCharString := CharStrings [i];
+ i := CharStringscount + 1
+ end
+ else i := i + 1
+end;
+
+function getSEcode (n: string): integer;
+var i: integer;
+ weiter: Boolean;
+begin
+ i := 255;
+ weiter := true;
+ while weiter and (i >= 0) do
+ if StandardEncoding [i] = n
+ then weiter := false
+ else i := i - 1;
+ getSEcode := i
+end;
+
+procedure makefilebuffer (var buf: text; name: string);
+begin
+ if getenv ('TEMP') <> ''
+ then assign (buf, getenv ('TEMP') + '\' + name)
+ else assign (buf, name);
+ rewrite (buf);
+end;
+
+procedure getfilebuffer (var buf, out: text);
+var s: string;
+begin
+ reset (buf);
+ while not eof (buf) do begin
+ readln (buf, s);
+ writeln (out, s)
+ end;
+ close (buf);
+ erase (buf);
+end;
+
+end.
diff --git a/fonts/utilities/t1tools/t1tidy/pathunit.pas b/fonts/utilities/t1tools/t1tidy/pathunit.pas
new file mode 100644
index 0000000000..3751a07540
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/pathunit.pas
@@ -0,0 +1,1135 @@
+{$B-}
+
+unit pathunit;
+
+interface
+
+const pathlenunit = 50;
+ maxpathlen = 10 * pathlenunit;
+ (* 92 recommended for normal operation
+ 170 for longer paths with many characters *)
+
+type t1cmd =
+ (callothersubr, callsubr, closepath, t1div, dotsection, endchar,
+ hlineto, hmoveto, hsbw, hstem, hstem3, hvcurveto, pop, return,
+ rlineto, rmoveto, rrcurveto, sbw, seac, setcurrentpoint,
+ vhcurveto, vlineto, vmoveto, vstem, vstem3);
+
+const cmdcount = 25;
+ cmdtab: array [1..cmdcount] of record
+ cmd: t1cmd;
+ str: string;
+ case code1: byte of
+ 12: (code2: byte)
+ end = (
+ (cmd: callothersubr; str: 'callothersubr'; code1: 12; code2: 16),
+ (cmd: callsubr; str: 'callsubr'; code1: 10),
+ (cmd: closepath; str: 'closepath'; code1: 9),
+ (cmd: t1div; str: 'div'; code1: 12; code2: 12),
+ (cmd: dotsection; str: 'dotsection'; code1: 12; code2: 0),
+ (cmd: endchar; str: 'endchar'; code1: 14),
+ (cmd: hlineto; str: 'hlineto'; code1: 6),
+ (cmd: hmoveto; str: 'hmoveto'; code1: 22),
+ (cmd: hsbw; str: 'hsbw'; code1: 13),
+ (cmd: hstem; str: 'hstem'; code1: 1),
+ (cmd: hstem3; str: 'hstem3'; code1: 12; code2: 2),
+ (cmd: hvcurveto; str: 'hvcurveto'; code1: 31),
+ (cmd: pop; str: 'pop'; code1: 12; code2: 17),
+ (cmd: return; str: 'return'; code1: 11),
+ (cmd: rlineto; str: 'rlineto'; code1: 5),
+ (cmd: rmoveto; str: 'rmoveto'; code1: 21),
+ (cmd: rrcurveto; str: 'rrcurveto'; code1: 8),
+ (cmd: sbw; str: 'sbw'; code1: 12; code2: 7),
+ (cmd: seac; str: 'seac'; code1: 12; code2: 6),
+ (cmd: setcurrentpoint; str: 'setcurrentpoint'; code1: 12; code2: 33),
+ (cmd: vhcurveto; str: 'vhcurveto'; code1: 30),
+ (cmd: vlineto; str: 'vlineto'; code1: 7),
+ (cmd: vmoveto; str: 'vmoveto'; code1: 4),
+ (cmd: vstem; str: 'vstem'; code1: 3),
+ (cmd: vstem3; str: 'vstem3'; code1: 12; code2: 1));
+
+var cmdstring: array [t1cmd] of string;
+var expand: Boolean;
+
+type commandpoi = ^ command;
+ SubrTpointer = ^ SubrT;
+ SubPathpointer = ^ SubPath;
+ CharStrpointer = ^ CharStrT;
+ command = record
+ Subr: SubPathpointer;
+ case Boolean of
+ true (* if Subr = nil: *):
+ (cmd: t1cmd;
+ paramnum: integer;
+ param: array [1..6] of integer;
+ );
+ false (* if Subr <> nil: *):
+ (closed: Boolean;
+ offsetx, offsety: integer;
+ )
+ end;
+
+ commandsarray0 = array [1..maxpathlen] of commandpoi;
+ commandsarray1 = array [1..1 * pathlenunit] of commandpoi;
+ commandsarray2 = array [1..2 * pathlenunit] of commandpoi;
+ commandsarray3 = array [1..3 * pathlenunit] of commandpoi;
+ commandsarray4 = array [1..4 * pathlenunit] of commandpoi;
+ commandsarray5 = array [1..5 * pathlenunit] of commandpoi;
+ commandsarray6 = array [1..6 * pathlenunit] of commandpoi;
+ commandsarray7 = array [1..7 * pathlenunit] of commandpoi;
+ commandsarray8 = array [1..8 * pathlenunit] of commandpoi;
+ commandsarray9 = array [1..9 * pathlenunit] of commandpoi;
+
+ varcommandspoi = record case byte of
+ 0: (cp0: ^commandsarray0);
+ 1: (cp1: ^commandsarray1);
+ 2: (cp2: ^commandsarray2);
+ 3: (cp3: ^commandsarray3);
+ 4: (cp4: ^commandsarray4);
+ 5: (cp5: ^commandsarray5);
+ 6: (cp6: ^commandsarray6);
+ 7: (cp7: ^commandsarray7);
+ 8: (cp8: ^commandsarray8);
+ 9: (cp9: ^commandsarray9);
+ end;
+
+ Path = object
+ commands: varcommandspoi;
+ pathlen: integer;
+ mayuseothersubrs: Boolean;
+ constructor ini;
+ procedure appendtoken (var s: string);
+ procedure clippath;
+ procedure setdef (s: string); virtual;
+ procedure splitpath;
+ procedure cleanup;
+ function usesothersubrs: Boolean;
+ private
+ procedure appendcommand (cmd: commandpoi);
+ procedure delete (i: integer);
+ function pathcmd (i: integer): t1cmd;
+ function pathcomponent (i: integer): commandpoi;
+ procedure getoffset (i: integer; var x, y: integer);
+ procedure printpath (var out: text; checkzmove, printreturn: Boolean);
+ function firstorlastcmd (i: integer; last: Boolean): t1cmd;
+ procedure traceBBox (var x, y, llx, lly, urx, ury: integer; var errcmd: t1cmd);
+ end;
+
+ CharStrT = object (Path)
+ name: string [30];
+ function clearifempty: Boolean;
+ procedure setname (n: string);
+ procedure setdef (s: string); virtual;
+ procedure print (var out: text);
+ procedure copyhalf (var newc: CharStrT; newname: string);
+ procedure downpath (var newc: CharStrT; newname: string);
+ procedure copypath (var newc: CharStrT; newname: string);
+ procedure compose (CS1, CS2: CharStrpointer; cc1, cc2, dx, dy: integer);
+ procedure checkafm (checkBBox: Boolean);
+ end;
+
+ SubrT = object (Path)
+ index: integer;
+ procedure setindex (i: integer);
+ procedure setdef (s: string); virtual;
+ procedure print (var out: text);
+ end;
+
+ SubPath = object (SubrT)
+ used: integer;
+ closedunique, offsetunique, closed: Boolean;
+ offsetx, offsety: integer;
+ procedure checkunique (x, y: integer; cl: Boolean);
+ procedure setdef (s: string); virtual;
+ procedure printSubr (var out: text);
+ end;
+
+const maxSubrs = 500;
+var Subrs: array [1..maxSubrs] of ^SubrT;
+ Subrscount: integer;
+ MoreSubrscount: integer;
+ Subrstotal: integer;
+
+procedure sortMoreSubrs;
+
+procedure arrangeMoreSubrs (Subrscount: integer);
+
+procedure printMoreSubrs (var out: text);
+
+procedure printusedStat;
+
+procedure swappaths (var c1, c2: CharStrT);
+
+(************************************************************************)
+
+implementation
+
+uses afm, data;
+
+function getSubr (i: integer): SubrTpointer;
+var k: integer;
+ result: SubrTpointer;
+begin
+ result := nil;
+ if Subrs [i + 1]^.index = i then result := Subrs [i + 1]
+ else for k := 1 to Subrscount do
+ if Subrs [k]^.index = i then result := Subrs [k];
+ getSubr := result
+end;
+
+var NP, ND: string (* name of Subr / CharString definition command *);
+
+type comparison = (less, equal, greater);
+
+function pathcompare (var p1, p2: SubPath): comparison;
+var i: integer;
+ result: comparison;
+ function cmdcompare (var c1, c2: command): comparison;
+ var i: integer;
+ result: comparison;
+ begin
+ if c1.Subr <> nil then
+ if c2.Subr = nil then cmdcompare := less
+ else cmdcompare := pathcompare (c1.Subr^, c2.Subr^)
+ else if c2.Subr <> nil then cmdcompare := greater
+ else if c1.cmd < c2.cmd then cmdcompare := less
+ else if c1.cmd > c2.cmd then cmdcompare := greater
+ else if c1.paramnum < c2.paramnum then cmdcompare := less
+ else if c1.paramnum > c2.paramnum then cmdcompare := greater
+ else begin
+ i := 1;
+ result := equal;
+ while (result = equal) and (i <= c1.paramnum) do begin
+ if c1.param [i] > c2.param [i] then result := greater
+ else if c1.param [i] < c2.param [i] then result := less;
+ i := i + 1;
+ end;
+ cmdcompare := result
+ end
+ end;
+begin
+ if p1.pathlen < p2.pathlen then pathcompare := less
+ else if p1.pathlen > p2.pathlen then pathcompare := greater
+ else begin
+ i := 1;
+ result := equal;
+ while (result = equal) and (i <= p1.pathlen) do begin
+ result := cmdcompare (p1.commands.cp0^[i]^, p2.commands.cp0^[i]^);
+ i := i + 1;
+ end;
+ pathcompare := result
+ end
+end;
+
+(*
+procedure sortMoreSubrs;
+ procedure quicksort (l, r: integer);
+ var i, j: integer; x, w: SubPathpointer;
+ begin i := l; j := r;
+ x := a [(l + r) div 2];
+ repeat
+ while pathcompare (a [i]^, x^) = less do i := i + 1;
+ while pathcompare (x^, a [j]^) = less do j := j - 1;
+ if i <= j then begin
+ w := a [i]; a [i] := a [j]; a [j] := w;
+ i := i + 1; j := j - 1
+ end
+ until i > j;
+ if l < j then quicksort (l, j);
+ if i < r then quicksort (i, r)
+ end;
+begin
+ quicksort (1, MoreSubrscount)
+end;
+*)
+procedure sortMoreSubrs;
+begin
+end;
+
+type SubPathtree = ^SubPathrec;
+ SubPathrec = record SB: SubPathpointer;
+ left, right: SubPathtree
+ end;
+
+var MoreSubrs: SubPathtree;
+
+
+procedure disposeSubPath (SP: SubPathpointer);
+var i: integer;
+begin
+ for i := 1 to SP^.pathlen do begin
+ if SP^.commands.cp0^[i]^.Subr <> nil
+ then disposeSubPath (SP^.commands.cp0^[i]^.Subr);
+ dispose (SP^.commands.cp0^[i])
+ end;
+ dispose (SP)
+end;
+
+function insertSubPath (var SBp: SubPathtree; SP: SubPathpointer): SubPathpointer;
+begin
+ if SBp = nil then begin
+ new (SBp); SBp^.left := nil; SBp^.right := nil;
+ SBp^.SB := SP; MoreSubrscount := MoreSubrscount + 1;
+ insertSubPath := SP
+ end else if pathcompare (SP^, SBp^.SB^) = equal then begin
+ SBp^.SB^.used := SBp^.SB^.used + 1;
+ disposeSubPath (SP);
+ insertSubPath := SBp^.SB
+ end else if pathcompare (SP^, SBp^.SB^) = less then
+ insertSubPath := insertSubPath (SBp^.left, SP)
+ else insertSubPath := insertSubPath (SBp^.right, SP)
+end;
+
+type PathProc = procedure (sp: SubPathpointer; var out: text);
+ (* The second parameter and its dummy setting at several places
+ of one of the two application cases below is due to the
+ silly restriction of Turbo-Pascal which doesn't allow nested
+ procedures to be passed as parameters as standard Pascal does. *)
+procedure applyMoreSubrs (PP: PathProc; var out: text);
+ procedure apply (SBp: SubPathtree);
+ begin
+ if SBp <> nil then begin
+ apply (SBp^.left);
+ PP (SBp^.SB, out);
+ apply (SBp^.right)
+ end
+ end;
+begin
+ apply (MoreSubrs)
+end;
+
+const maxused = 50;
+var usedStat: array [0..maxused] of integer;
+ zeromoves: integer;
+
+procedure Pindex (sp: SubPathpointer; (*dummy*) var out: text); far;
+begin if (sp^.used > 1) and (sp^.index < 0) then begin
+ sp^.setindex (Subrstotal);
+ Subrstotal := Subrstotal + 1;
+ end;
+ if sp^.used > maxused then
+ usedStat [0] := usedStat [0] + 1
+ else usedStat [sp^.used] := usedStat [sp^.used] + 1
+end;
+procedure arrangeMoreSubrs (Subrscount: integer);
+begin Subrstotal := Subrscount;
+ applyMoreSubrs (Pindex, (*dummy*) output)
+end;
+
+procedure Pprint (sp: SubPathpointer; var out: text); far;
+begin if sp^.used > 1 then
+ sp^.printSubr (out)
+end;
+procedure printMoreSubrs (var out: text);
+begin applyMoreSubrs (Pprint, out)
+end;
+
+procedure printusedStat;
+var i: integer;
+begin
+ writeln ('extracted Subrs use statistics:');
+ writeln ('# used # Subrs');
+ for i := 1 to maxused do
+ if usedStat [i] > 0 then
+ writeln (i: 6, usedStat [i]: 6);
+ if usedStat [0] > 0 then
+ writeln (' more:', usedStat [0]: 6);
+ if zeromoves > 0 then
+ writeln (' inserted ', zeromoves, ' zero move commands for ATM''s sake');
+end;
+
+(************************************************************************)
+
+function cmdstr (cmd: t1cmd): string;
+begin cmdstr := cmdstring [cmd] end;
+
+function strcmd (var (* for some efficiency *) s: string): t1cmd;
+var l, r, i: integer;
+ cs: string;
+begin l := 1; r := cmdcount;
+ repeat
+ i := (l + r) div 2;
+ cs := cmdtab [i].str;
+ if s < cs then r := i - 1
+ else if s > cs then l := i + 1
+ else l := r + 1
+ until l > r;
+ if s = cs then strcmd := cmdtab [i].cmd
+ else begin
+ writeln ('% WARNING: unknown command "', s, '" detected');
+ strcmd := endchar
+ end
+end;
+
+procedure setNPND (var def: string; s: string);
+begin if def = '' then def := s
+ else if s <> ''
+ then if def <> s then writeln ('% WARNING: NP/ND command names differ')
+end;
+
+
+procedure printoffset (var out: text; x, y: integer);
+begin
+ if x <> 0 then
+ if y <> 0 then writeln (out, ' ', x, ' ', y, ' rmoveto')
+ else writeln (out, ' ', x, ' hmoveto')
+ else if y <> 0 then writeln (out, ' ', y, ' vmoveto')
+ else begin (* atm (1.15) bug: also write zero move command *)
+ zeromoves := zeromoves + 1;
+ writeln (out, ' 0 hmoveto')
+ end
+end;
+
+(************************************************************************)
+
+var commandactive: Boolean;
+
+constructor Path.ini;
+begin pathlen := 0;
+ commandactive := false;
+ mayuseothersubrs := true;
+ new (commands.cp0)
+end;
+
+function Path.usesothersubrs: Boolean;
+var i: integer;
+ othersfound: Boolean;
+ icmd: t1cmd;
+ sub: ^SubrT;
+begin
+ if not mayuseothersubrs then usesothersubrs := false
+ else begin
+ i := 1;
+ othersfound := false;
+ while (i <= pathlen) and not othersfound do begin
+ icmd := pathcmd (i);
+ if icmd = callothersubr then othersfound := true
+ else if icmd = callsubr then with commands.cp0^[i]^ do begin
+ if Subr = nil
+ then if paramnum = 0
+ then sub := nil (* something like pop callsubr *)
+ else sub := getSubr (param [paramnum])
+ else sub := Subr;
+ if sub <> nil then othersfound := sub^.usesothersubrs;
+ end;
+ i := i + 1;
+ end;
+ if not othersfound then mayuseothersubrs := false;
+ usesothersubrs := othersfound
+ end
+end;
+
+procedure Path.appendtoken (var (* for some efficiency *) s: string);
+var i, c: integer;
+begin if not commandactive then begin
+ if pathlen < maxpathlen then begin
+ pathlen := pathlen + 1;
+ new (commands.cp0^[pathlen]);
+ commands.cp0^[pathlen]^.paramnum := 0;
+ commands.cp0^[pathlen]^.Subr := nil;
+ end else begin
+ writeln ('ERROR: max. path length exceeded');
+ halt
+ end
+ end;
+ val (s, i, c);
+ if c = 0 then with commands.cp0^[pathlen]^ do begin
+ paramnum := paramnum + 1;
+ param [paramnum] := i;
+ commandactive := true
+ end else begin
+ commands.cp0^[pathlen]^.cmd := strcmd (s);
+ commandactive := false
+ end
+end;
+
+procedure Path.clippath;
+(* shortens path storage according to current pathlen *)
+var longpath: varcommandspoi;
+ i: integer;
+begin
+ longpath := commands;
+ case (pathlen - 1) div pathlenunit + 1 of
+ 1: new (commands.cp1);
+ 2: new (commands.cp2);
+ 3: new (commands.cp3);
+ 4: new (commands.cp4);
+ 5: new (commands.cp5);
+ 6: new (commands.cp6);
+ 7: new (commands.cp7);
+ 8: new (commands.cp8);
+ 9: new (commands.cp9);
+ else new (commands.cp0);
+ end;
+ for i := 1 to pathlen do commands.cp0^[i] := longpath.cp0^[i];
+ dispose (longpath.cp0)
+end;
+
+procedure Path.appendcommand (cmd: commandpoi);
+begin if pathlen < maxpathlen then begin
+ pathlen := pathlen + 1;
+ new (commands.cp0^[pathlen]);
+ commands.cp0^[pathlen]^ := cmd ^;
+ end else begin
+ writeln ('ERROR: max. path length exceeded');
+ halt
+ end
+end;
+
+procedure Path.delete (i: integer);
+var k: integer;
+begin
+ pathlen := pathlen - 1;
+ dispose (commands.cp0^[i]);
+ for k := i to pathlen do commands.cp0^[k] := commands.cp0^[k + 1]
+end;
+
+procedure Path.cleanup;
+var i, k: integer;
+ prevcmd: t1cmd;
+ x, y: integer;
+begin
+ i := 1;
+ while i <= pathlen do begin
+ if i = 1 then prevcmd := pop (* dummy, just not a moveto *)
+ else prevcmd := commands.cp0^[i - 1]^.cmd;
+ case commands.cp0^[i]^.cmd of
+ closepath: if prevcmd in [closepath, endchar, hmoveto, hsbw,
+ return, rmoveto, sbw, vmoveto]
+ then delete (i)
+ else i := i + 1;
+ hmoveto, rmoveto, vmoveto:
+ if prevcmd in [hmoveto, rmoveto, vmoveto] then begin
+ x := 0; y := 0;
+ for k := i - 1 to i do with commands.cp0^[k]^ do
+ case cmd of
+ hmoveto: x := x + param [1];
+ vmoveto: y := y + param [1];
+ rmoveto: begin x := x + param [1];
+ y := y + param [2]
+ end
+ end;
+ delete (i);
+ i := i - 1;
+ with commands.cp0^[i]^ do begin
+ cmd := rmoveto;
+ param [1] := x;
+ param [2] := y;
+ paramnum := 2;
+ end
+ end else with commands.cp0^[i]^ do begin
+ (* if (param [1] = 0) and
+ (* ((cmd <> rmoveto) or (param [2] = 0))
+ (* then delete (i)
+ (* don't delete (i): atm (1.15) has a bug
+ (* else *)
+ if (cmd = rmoveto) and (param [2] = 0)
+ then begin
+ cmd := hmoveto;
+ paramnum := 1;
+ end else
+ if (cmd = rmoveto) and (param [1] = 0)
+ then begin
+ cmd := vmoveto;
+ param [1] := param [2];
+ paramnum := 1;
+ end else
+ if (cmd = vmoveto) and (param [1] = 0)
+ then begin
+ cmd := hmoveto;
+ end else
+ i := i + 1
+ end;
+ rlineto: with commands.cp0^[i]^ do begin
+ if param [1] = 0 (* 0 y rlineto *)
+ then begin
+ cmd := vlineto;
+ param [1] := param [2];
+ paramnum := 1;
+ end else if param [2] = 0 (* x 0 rlineto *)
+ then begin
+ cmd := hlineto;
+ paramnum := 1;
+ end;
+ i := i + 1
+ end;
+ rrcurveto: with commands.cp0^[i]^ do begin
+ if (param [1] = 0) and (param [6] = 0)
+ then begin
+ cmd := vhcurveto;
+ for k := 1 to 4 do
+ param [k] := param [k + 1];
+ paramnum := 4;
+ end
+ else if (param [2] = 0) and (param [5] = 0)
+ then begin
+ cmd := hvcurveto;
+ param [2] := param [3];
+ param [3] := param [4];
+ param [4] := param [6];
+ paramnum := 4;
+ end;
+ i := i + 1
+ end;
+ else i := i + 1
+ end
+ end
+end;
+
+const hintcmds = [hstem, hstem3, vstem, vstem3, dotsection];
+ movecmds = [hmoveto, rmoveto, vmoveto];
+ drawcmds = [hlineto, hvcurveto, rlineto,
+ rrcurveto, vhcurveto, vlineto];
+ curvecmds = [hvcurveto, rrcurveto, vhcurveto];
+
+function Path.pathcmd (i: integer): t1cmd;
+begin
+ if (i > pathlen) or (i < 1) then pathcmd := pop
+ else if commands.cp0^[i]^.Subr = nil then pathcmd := commands.cp0^[i]^.cmd
+ else pathcmd := callsubr
+end;
+
+function Path.pathcomponent (i: integer): commandpoi;
+begin
+ if (i > pathlen) or (i < 1) then pathcomponent := nil
+ else pathcomponent := commands.cp0^[i]
+end;
+
+procedure Path.getoffset (i: integer; var x, y: integer);
+begin
+ if pathcmd (i) in movecmds then with commands.cp0^[i]^ do begin
+ case cmd of
+ hmoveto: begin x := param [1]; y := 0 end;
+ vmoveto: begin y := param [1]; x := 0 end;
+ rmoveto: begin x := param [1]; y := param [2] end;
+ end
+ end else begin
+ x := 0; y := 0
+ end
+end;
+
+procedure Path.splitpath;
+var i, pathstart, k: integer;
+ newSubr: ^SubPath;
+ x, y: integer;
+
+begin
+ i := 1;
+ while i <= pathlen do begin
+ while (i <= pathlen) and
+ not (pathcmd (i) in drawcmds + hintcmds) do
+ i := i + 1;
+ if i <= pathlen then begin
+ pathstart := i;
+ (* heuristics which sorts of command groups to build: *)
+ if pathcmd (pathstart) in hintcmds then
+ repeat i := i + 1 until not (pathcmd (i) in hintcmds)
+ else begin (* pathcmd (pathstart) in drawcmds *)
+ repeat i := i + 1 until not (pathcmd (i) in drawcmds);
+ (* if pathcmd (i) = closepath then i := i + 1; *)
+ end;
+ if (i - pathstart > 1) or
+ (pathcmd (pathstart) in curvecmds) then begin
+ new (newSubr, ini);
+ newSubr^.used := 1;
+ newSubr^.index := -1;
+ newSubr^.pathlen := i - pathstart;
+ newSubr^.clippath;
+ for k := 1 to newSubr^.pathlen do
+ newSubr^.commands.cp0^[k] := commands.cp0^[pathstart+k-1];
+ pathlen := pathlen - i + pathstart + 1;
+ for k := pathstart + 1 to pathlen do begin
+ commands.cp0^[k] := commands.cp0^[k - pathstart - 1 + i];
+ (* don't dispose them - they are still needed in the Subr *)
+ end;
+ new (commands.cp0^[pathstart]);
+ newSubr := insertSubPath (MoreSubrs, newSubr);
+ (* to replace newSubr by unique one on second use *)
+ commands.cp0^[pathstart]^.Subr := newSubr;
+ getoffset (pathstart - 1, x, y);
+ commands.cp0^[pathstart]^.offsetx := x;
+ commands.cp0^[pathstart]^.offsety := y;
+ if pathcmd (pathstart + 1) = closepath then begin
+ newSubr^.checkunique (x, y, true);
+ delete (pathstart + 1);
+ commands.cp0^[pathstart]^.closed := true
+ end else begin
+ newSubr^.checkunique (x, y, false);
+ commands.cp0^[pathstart]^.closed := false
+ end;
+ if pathcmd (pathstart - 1) in movecmds then begin
+ pathstart := pathstart - 1;
+ delete (pathstart)
+ end;
+ i := pathstart + 1;
+ end
+ end
+ end
+end;
+
+function Path.firstorlastcmd (i: integer; last: Boolean): t1cmd;
+var cmd: t1cmd;
+ sub: ^SubrT;
+begin
+ cmd := pathcmd (i);
+ if cmd = callsubr then with commands.cp0^[i]^ do begin
+ if Subr = nil
+ then if paramnum <> 1
+ then sub := nil (* something like pop callsubr
+ or n m callsubr *)
+ else sub := getSubr (param [paramnum])
+ else sub := Subr;
+ if sub = nil
+ then firstorlastcmd := rmoveto (* pretend it's alright *)
+ else if last
+ then if sub^.pathcmd (sub^.pathlen) = return
+ then firstorlastcmd := (* last of original Subr *)
+ sub^.firstorlastcmd (sub^.pathlen - 1, true)
+ else firstorlastcmd := (* last of extracted Subr *)
+ sub^.firstorlastcmd (sub^.pathlen, true)
+ else firstorlastcmd := sub^.firstorlastcmd (1, false)
+ end else firstorlastcmd := cmd
+end;
+
+procedure Path.printpath (var out: text; checkzmove, printreturn: Boolean);
+const nozeromovecmds = drawcmds + movecmds
+ + [setcurrentpoint, callothersubr, dotsection];
+var i, k: integer;
+begin for i := 1 to pathlen - ord (not printreturn) do
+ with commands.cp0^[i]^ do begin
+ if Subr = nil then begin
+ if expand and (cmd = callsubr)
+ and (paramnum >= 1) and (param [paramnum] >= 4) then begin
+ if paramnum > 1 then begin
+ write (out, ' ');
+ for k := 1 to paramnum - 1 do begin
+ write (out, param [k], ' ');
+ end;
+ end;
+ getSubr (param [paramnum])^.printpath (out, false, false)
+ end else begin
+ if checkzmove then
+ if firstorlastcmd (i, false) in drawcmds
+ then if not (firstorlastcmd (i - 1, true) in nozeromovecmds)
+ then printoffset (out, 0, 0);
+ write (out, ' ');
+ for k := 1 to paramnum do begin
+ write (out, param [k], ' ');
+ end;
+ writeln (out, cmdstr (cmd));
+ end
+ end else if (Subr^.used > 1) and not expand then begin
+ if (not Subr^.offsetunique)
+ or ((Subr^.offsetx = 0) and (Subr^.offsety = 0)) then
+ if Subr^.pathcmd (1) in drawcmds then
+ if (offsetx <> 0) or (offsety <> 0)
+ or not (firstorlastcmd (i - 1, true) in nozeromovecmds)
+ then printoffset (out, offsetx, offsety);
+ writeln (out, ' ', Subr^.index, ' callsubr');
+ if closed and not Subr^.closedunique then writeln (out, ' closepath');
+ end else begin
+ if Subr^.pathcmd (1) in drawcmds then
+ if (offsetx <> 0) or (offsety <> 0)
+ or not (firstorlastcmd (i - 1, true) in nozeromovecmds)
+ then printoffset (out, offsetx, offsety);
+ Subr^.printpath (out, false, true);
+ if closed then writeln (out, ' closepath');
+ end
+ end
+end;
+
+function CharStrT.clearifempty: Boolean;
+(* clippath must not have been called! *)
+var i: integer;
+ isempty: Boolean;
+begin isempty := true;
+ i := 1;
+ while (i <= pathlen) and isempty do begin
+ if pathcmd (i) in drawcmds + [callsubr, callothersubr, seac]
+ then isempty := false;
+ i := i + 1;
+ end;
+ if isempty then
+ if (name = '/.notdef') or (pos ('space', name) > 0) or (pos ('blank', name) > 0)
+ then isempty := false
+ else begin
+ for i := 1 to pathlen do dispose (commands.cp0^[i]);
+ dispose (commands.cp0);
+ end;
+ clearifempty := isempty
+end;
+
+procedure CharStrT.setname (n: string);
+begin name := n end;
+
+procedure CharStrT.print (var out: text);
+begin
+ write (out, name, ' {');
+ printpath (out, true, true);
+ writeln (out, ' } ', ND)
+end;
+
+procedure CharStrT.setdef (s: string);
+begin setNPND (ND, s); clippath end;
+
+procedure SubrT.setindex (i: integer);
+begin index := i end;
+
+procedure SubrT.print (var out: text);
+begin
+ write (out, 'dup ', index, ' {');
+ printpath (out, false, true);
+ writeln (out, ' } ', NP)
+end;
+
+procedure Path.setdef (s: string);
+begin clippath end;
+
+procedure SubPath.checkunique (x, y: integer; cl: Boolean);
+begin
+ if used <= 1 then begin
+ offsetx := x; offsety := y; offsetunique := true;
+ closed := cl; closedunique := true
+ end else begin
+ if (x <> offsetx) or (y <> offsety) then offsetunique := false;
+ if cl <> closed then closedunique := false
+ end
+end;
+
+procedure SubPath.setdef (s: string);
+begin clippath end;
+
+procedure SubPath.printSubr (var out: text);
+begin
+ write (out, 'dup ', index, ' {');
+ if offsetunique then
+ if pathcmd (1) in drawcmds then
+ if (offsetx <> 0) or (offsety <> 0) then
+ printoffset (out, offsetx, offsety);
+ printpath (out, false, true);
+ if closedunique and closed then writeln (out, ' closepath');
+ writeln (out, ' return');
+ writeln (out, ' } ', NP)
+end;
+
+procedure SubrT.setdef (s: string);
+begin setNPND (NP, s); clippath end;
+
+(************************************************************************)
+
+function newafmcode (name: string): integer;
+begin
+ if stdenc then newafmcode := getSEcode (name)
+ else newafmcode := -1
+end;
+
+procedure CharStrT.copyhalf (var newc: CharStrT; newname: string);
+(* This is a heuristic attempt to generate single-part characters from
+ double-part ones, especially quote marks. It was designed for wfnboss
+ generated fonts which lack some single quote marks.
+ The proceudre assumes that the path of the character to be split contains
+ exactly 2 move commands! *)
+var i, m1, m2, x1, x2, y1, y2, widthsub: integer;
+ C, WX, lx, ly, rx, ry: integer;
+begin
+ newc.setname (newname);
+ i := 1;
+ while (i <= pathlen) and not (pathcmd (i) in movecmds) do i := i + 1;
+ m1 := i;
+ repeat i := i + 1 until (i > pathlen) or (pathcmd (i) in movecmds);
+ if i > pathlen then i := pathlen;
+ m2 := i;
+ getoffset (m1, x1, y1);
+ getoffset (m2, x2, y2);
+ for i := 1 to m2 - 1 do newc.appendcommand (commands.cp0^[i]);
+ newc.appendcommand (commands.cp0^[pathlen]);
+ newc.clippath;
+ if x2 < 0 then begin
+ (* first part of path was right part; shift it left *)
+ with newc.commands.cp0^[m1]^ do begin
+ cmd := rmoveto; (* might have been hmoveto or vmoveto *)
+ paramnum := 2;
+ param [1] := x1 + x2;
+ param [2] := y1;
+ end;
+ widthsub := - x2;
+ end else begin
+ widthsub := x2;
+ end;
+ with newc.commands.cp0^[1]^ do (* reduce wx *)
+ case cmd of
+ hsbw: param [2] := param [2] - widthsub;
+ sbw: param [3] := param [3] - widthsub;
+ end;
+ newc.cleanup;
+ if afmopen then begin
+ getafmchar (C, WX, name, lx, ly, rx, ry);
+ putafmchar (newafmcode (newname), WX - widthsub, newc.name, lx, ly, rx - widthsub, ry);
+ end
+end;
+
+procedure CharStrT.downpath (var newc: CharStrT; newname: string);
+(* This is a heuristic attempt to generate base line quote marks from
+ upper quote marks *)
+var i, m, x, y, heightsub: integer;
+ C, WX, lx, ly, rx, ry: integer;
+begin
+ newc.setname (newname);
+ i := 1;
+ while (i <= pathlen) and not (pathcmd (i) in movecmds) do i := i + 1;
+ m := i;
+ getoffset (m, x, y);
+ heightsub := y; (* This might be more sophisticated *)
+ for i := 1 to pathlen do newc.appendcommand (commands.cp0^[i]);
+ newc.clippath;
+ for i := 1 to m do
+ with newc.commands.cp0^[i]^ do
+ case cmd of
+ hmoveto: (* would only have to be handled
+ if we could derive non-zero down-shift
+ values from this *);
+ vmoveto: param [1] := param [1] - heightsub;
+ rmoveto: param [2] := param [2] - heightsub;
+ hstem: param [1] := param [1] - heightsub;
+ hstem3: begin
+ param [1] := param [1] - heightsub;
+ param [3] := param [3] - heightsub;
+ param [5] := param [5] - heightsub;
+ end
+ else ;
+ end;
+ newc.cleanup;
+ if afmopen then begin
+ getafmchar (C, WX, name, lx, ly, rx, ry);
+ putafmchar (newafmcode (newname), WX, newc.name, lx, ly - heightsub, rx, ry - heightsub);
+ end
+end;
+
+procedure CharStrT.copypath (var newc: CharStrT; newname: string);
+var i, C, WX, lx, ly, rx, ry: integer;
+begin
+ newc.setname (newname);
+ for i := 1 to pathlen do newc.appendcommand (commands.cp0^[i]);
+ newc.clippath;
+ newc.cleanup;
+ if afmopen then begin
+ getafmchar (C, WX, name, lx, ly, rx, ry);
+ putafmchar (newafmcode (newname), WX, newc.name, lx, ly, rx, ry);
+ end
+end;
+
+procedure CharStrT.compose (CS1, CS2: CharStrpointer; cc1, cc2, dx, dy: integer);
+var seaccmd: commandpoi;
+ WX, WX1, WX2, sbx1, sby1, sbx2, sby2: integer;
+ C, llx1, lly1, urx1, ury1, llx2, lly2, urx2, ury2: integer;
+
+ procedure getsb (CS: CharStrpointer; var sbx, sby: integer);
+ begin
+ sbx := CS^.pathcomponent (1)^.param [1];
+ if CS^.pathcmd (1) = sbw
+ then sby := CS^.pathcomponent (1)^.param [2]
+ else sby := 0
+ end;
+
+ function getwidth (CS: CharStrpointer): integer;
+ begin
+ with CS^.pathcomponent (1)^ do case cmd of
+ hsbw: getwidth := param [2];
+ sbw: getwidth := param [3];
+ else getwidth := 0
+ end
+ end;
+
+begin
+ appendcommand (CS1^.pathcomponent (1));
+ WX1 := getwidth (CS1);
+ WX := WX1;
+ if length (CS2^.name) = 2 then begin
+ (* a letter appended to another *)
+ WX2 := getwidth (CS2) + dx;
+ if WX2 > WX1 then with pathcomponent (1)^ do begin
+ WX := WX2;
+ case cmd of
+ hsbw: param [2] := WX;
+ sbw: param [3] := WX;
+ end
+ end
+ end;
+ new (seaccmd);
+ getsb (CS1, sbx1, sby1);
+ getsb (CS2, sbx2, sby2);
+ with seaccmd^ do begin
+ Subr := nil;
+ cmd := seac;
+ paramnum := 5;
+ param [4] := cc1;
+ param [5] := cc2;
+ param [1] := sbx2;
+ param [2] := dx + sbx2 - sbx1;
+ param [3] := dy + sby2 - sby1;
+ end;
+ appendcommand (seaccmd);
+ clippath;
+ if afmopen then begin
+ getafmchar (C, WX1, CS1^.name, llx1, lly1, urx1, ury1);
+ getafmchar (C, WX2, CS2^.name, llx2, lly2, urx2, ury2);
+ if llx2 + dx < llx1 then llx1 := llx2 + dx;
+ if lly2 + dy < lly1 then lly1 := lly2 + dy;
+ if urx2 + dx > urx1 then urx1 := urx2 + dx;
+ if ury2 + dy > ury1 then ury1 := ury2 + dy;
+ putafmchar (newafmcode (name), WX, name, llx1, lly1, urx1, ury1);
+ end
+end;
+
+procedure swappaths (var c1, c2: CharStrT);
+(* to fix wfnboss's exchange of bullet and periodcentered descriptions *)
+var name: string; wx, wx1, wx2: integer;
+begin
+ name := c1.name;
+ c1.name := c2.name;
+ c2.name := name;
+ if c1.commands.cp0^[1]^.cmd = hsbw then wx1 := 2 else wx1 := 3;
+ if c2.commands.cp0^[1]^.cmd = hsbw then wx2 := 2 else wx2 := 3;
+ wx := c1.commands.cp0^[1]^.param [wx1];
+ c1.commands.cp0^[1]^.param [wx1] := c2.commands.cp0^[1]^.param [wx2];
+ c2.commands.cp0^[1]^.param [wx2] := wx;
+ (* the case that only one path has an sbw command
+ is not handled completely correct *)
+ wx := c1.commands.cp0^[1]^.param [wx1 + 1];
+ c1.commands.cp0^[1]^.param [wx1 + 1] := c2.commands.cp0^[1]^.param [wx2 + 1];
+ c2.commands.cp0^[1]^.param [wx2 + 1] := wx;
+end;
+
+(************************************************************************)
+
+procedure Path.traceBBox (var x, y, llx, lly, urx, ury: integer; var errcmd: t1cmd);
+var i: integer;
+ x1, y1: integer;
+ procedure newpoint (newx, newy: integer);
+ begin
+ x := newx;
+ y := newy;
+ if x < llx then llx := x
+ else if x > urx then urx := x;
+ if y < lly then lly := y
+ else if y > ury then ury := y;
+ end;
+begin
+ i := 1;
+ while (i <= pathlen) do with pathcomponent (i) ^ do begin
+ if Subr <> nil then Subr^.traceBBox (x, y, llx, lly, urx, ury, errcmd)
+ else
+ case cmd of
+ callothersubr: errcmd := callothersubr;
+ callsubr: getSubr (param [paramnum])^.traceBBox (x, y, llx, lly, urx, ury, errcmd);
+ t1div: errcmd := t1div;
+ closepath, return, endchar, pop: ;
+ dotsection, hstem, hstem3, vstem, vstem3: ;
+ hsbw: x := param [1];
+ sbw: begin x := param [1]; y := param [2] end;
+ seac: begin x1 := x; y1 := y; (* save current sidebearing point *)
+ getCharString (StandardEncoding [param [4]])^.
+ traceBBox (x, y, llx, lly, urx, ury, errcmd);
+ x := x1 + param [2] - param [1];
+ y := y1 + param [3] (* - sby (accent), hopefully 0 *);
+ getCharString (StandardEncoding [param [5]])^.
+ traceBBox (x, y, llx, lly, urx, ury, errcmd)
+ end;
+ hlineto: newpoint (x + param [1], y);
+ hmoveto: newpoint (x + param [1], y);
+ rlineto: newpoint (x + param [1], y + param [2]);
+ rmoveto: newpoint (x + param [1], y + param [2]);
+ vlineto: newpoint (x, y + param [2]);
+ vmoveto: newpoint (x, y + param [2]);
+ (* with the curves, hope for horizontal and vertical tangents: *)
+ hvcurveto: newpoint (x + param [1] + param [2],
+ y + param [3] + param [4]);
+ rrcurveto: newpoint (x + param [1] + param [3] + param [5],
+ y + param [2] + param [4] + param [6]);
+ vhcurveto: newpoint (x + param [2] + param [4],
+ y + param [1] + param [3]);
+ setcurrentpoint: if paramnum = 2 then begin
+ x := param [1]; y := param [2]
+ end
+ else errcmd := setcurrentpoint;
+ end;
+ i := i + 1
+ end
+end;
+
+procedure CharStrT.checkafm (checkBBox: Boolean);
+(* Check afm entries for correct width and (optionally)
+ bounding box information. The latter procedure seems to be
+ currently a great rubbish. *)
+var C, WX, llx, lly, urx, ury,
+ oldWX, oldllx, oldlly, oldurx, oldury: integer;
+ x, y: integer;
+ errcmd: t1cmd;
+ putit: Boolean;
+begin
+ if name <> '/.notdef' then begin
+ if pathcmd (1) = hsbw
+ then WX := pathcomponent (1)^.param [2]
+ else if pathcmd (1) = sbw
+ then WX := pathcomponent (1)^.param [3]
+ else begin
+ writeln ('% path error: first command not hsbw or sbw in character ', name);
+ WX := 0;
+ end;
+ getafmchar (C, oldWX, name, oldllx, oldlly, oldurx, oldury);
+ putit := false;
+
+ if C = -2 then begin
+ writeln ('% afm error: missing entry for character ', name);
+ putit := true;
+ C := newafmcode (name);
+ end
+ else if oldWX <> WX then begin
+ writeln ('% afm error: wrong width for character ', name);
+ putit := true;
+ end;
+
+ if checkBBox then begin
+ llx := maxint;
+ urx := - maxint;
+ lly := maxint;
+ ury := - maxint;
+ x := 0;
+ y := 0;
+ errcmd := return;
+ traceBBox (x, y, llx, lly, urx, ury, errcmd);
+ if errcmd <> return then begin
+ writeln ('% tracing BBox of ', name, ': cannot handle ', cmdstr (errcmd));
+ llx := oldllx; lly := oldlly; urx := oldurx; ury := oldury;
+ end
+ else if C = -2 then putit := true
+ else if abs (llx - oldllx) + abs (lly - oldlly)
+ + abs (urx - oldurx) + abs (ury - oldury) < 30
+ then begin (* keep old values *)
+ llx := oldllx; lly := oldlly; urx := oldurx; ury := oldury;
+ end
+ else begin
+ putit := true;
+ writeln ('% adjusting afm BBox information for ', name);
+ end;
+ end
+ else begin
+ llx := oldllx; lly := oldlly; urx := oldurx; ury := oldury;
+ end;
+
+ if putit then putafmchar (C, WX, name, llx, lly, urx, ury);
+ end
+end;
+
+(************************************************************************)
+
+var i: integer;
+begin
+ for i := 1 to cmdcount do with cmdtab [i] do
+ cmdstring [cmd] := str;
+ NP := ''; ND := '';
+ MoreSubrscount := 0;
+ MoreSubrs := nil;
+ for i := 0 to maxused do usedStat [i] := 0;
+ zeromoves := 0;
+end.
diff --git a/fonts/utilities/t1tools/t1tidy/strtype.pas b/fonts/utilities/t1tools/t1tidy/strtype.pas
new file mode 100644
index 0000000000..8ecf3d61ea
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/strtype.pas
@@ -0,0 +1,196 @@
+unit strtype;
+
+interface
+
+type strec = object
+ function isblank (c: char): Boolean;
+ function isdigit (c: char): Boolean;
+ function isletter (c: char): Boolean;
+ function isname (c: char): Boolean;
+ function hasat (i: integer; s1: string): Boolean;
+ function posof (s1: string): integer;
+ procedure replace (j, k: integer; s1: string);
+ function hasprefix (s1: string): Boolean;
+ function empty: Boolean;
+ function str: string;
+ procedure ini (s1: string);
+ (* token functions: *)
+ procedure resetposition;
+ function nexttoken: string;
+ function lasttoken: string;
+ function firsttoken: string;
+ function nthtoken (n: integer): string;
+ function lookuptoken (s1: string): Boolean;
+ function findtoken (s1: string): Boolean;
+ procedure gotonexttoken;
+ procedure replacelasttoken (s1: string);
+ private
+ s: string;
+ len: integer;
+ position: integer (* current scan position *);
+ startpos: integer (* start of last retrieved token *);
+ function cc: char;
+ end;
+
+implementation
+
+function strec.isblank (c: char): Boolean;
+begin isblank := (c = ' ') or (c = ' ')
+end;
+
+function strec.isdigit (c: char): Boolean;
+begin isdigit := (c >= '0') and (c <= '9')
+end;
+
+function strec.isletter (c: char): Boolean;
+begin isletter := ((c >= 'A') and (c <= 'Z')) or ((c >= 'a') and (c <= 'z'))
+end;
+
+function strec.isname (c: char): Boolean;
+begin (*
+ isname := not isblank (c) and
+ (c <> '(') and (c <> ')') and (c <> '<') and (c <> '>') and
+ (c <> '[') and (c <> ']') and (c <> '{') and (c <> '}') and
+ (c <> '/') and (c <> '%')
+ *)
+ isname := not (c in [' ', ' ', '(', ')', '<', '>', '[', ']', '{', '}', '/', '%'])
+end;
+
+function strec.cc: char;
+begin if position > len
+ then cc := ' '
+ else cc := s [position]
+end;
+
+function strec.hasat (i: integer; s1: string): Boolean;
+begin hasat := pos (s1, s) = i end;
+
+function strec.posof (s1: string): integer;
+begin posof := pos (s1, s) end;
+
+procedure strec.replace (j, k: integer; s1: string);
+begin delete (s, j, k - j + 1);
+ insert (s1, s, j)
+end;
+
+function strec.hasprefix (s1: string): Boolean;
+begin hasprefix := pos (s1, s) = 1 end;
+
+function strec.empty: Boolean;
+begin empty := s = '' end;
+
+function strec.str: string;
+begin str := s end;
+
+procedure strec.ini (s1: string);
+begin s := s1; position := 0; len := length (s) end;
+
+procedure strec.resetposition;
+begin position := 0 end;
+
+function strec.nexttoken: string;
+const specialchars = [' ', ' ', '(', ')', '<', '>', '[', ']', '{', '}', '/', '%'];
+var level: integer;
+ quote: Boolean;
+ nexttok: string;
+begin
+ if position = 0 then position := position + 1;
+ while (position <= len) and isblank (s [position])
+ do position := position + 1;
+ startpos := position;
+ if startpos > len
+ then nexttok := ''
+ else begin
+ if (cc = '/') or not (cc in specialchars)
+ then begin (* scan name or number *)
+ if cc = '/'
+ then begin
+ position := position + 1;
+ (* ignore the special cases /[ and /] *)
+ if cc = '/' then position := position + 1;
+ end;
+ while not (cc in specialchars) do position := position + 1
+ end else if cc = '='
+ then begin (* scan special symbol *)
+ position := position + 1;
+ if cc = '=' then position := position + 1
+ end else if cc = '<'
+ then begin (* scan hex string *)
+ while (position <= len) and (cc <> '>')
+ do position := position + 1;
+ if position <= len
+ then position := position + 1
+ end else if cc = '('
+ then begin (* scan string *)
+ position := position + 1;
+ level := 1;
+ quote := false;
+ while (position <= len) and (level > 0) do begin
+ if not quote
+ then if cc = '\'
+ then quote := true
+ else begin
+ quote := false;
+ if cc = '('
+ then level := level + 1
+ else if cc = ')'
+ then level := level - 1
+ end;
+ position := position + 1
+ end
+ end else if cc = '%'
+ then (* scan comment *)
+ position := len + 1
+ else (* scan one-character symbol *)
+ position := position + 1;
+ nexttok := copy (s, startpos, position - startpos)
+ end;
+ (* writeln ('nexttoken: ¯', nexttok, '®'); *)
+ nexttoken := nexttok
+end;
+
+function strec.lasttoken: string;
+begin if startpos > len
+ then lasttoken := ''
+ else lasttoken := copy (s, startpos, position - startpos)
+end;
+
+function strec.firsttoken: string;
+begin position := 0;
+ firsttoken := nexttoken
+end;
+
+function strec.nthtoken (n: integer): string;
+var i: integer;
+ r: string;
+begin position := 0;
+ for i := 1 to n do r := nexttoken;
+ nthtoken := r
+end;
+
+function strec.lookuptoken (s1: string): Boolean;
+var t: string;
+ r: Boolean;
+begin r := false;
+ t := nexttoken;
+ while t <> '' do
+ if t = s1 then begin r := true; t := '' end
+ else t := nexttoken;
+ lookuptoken := r
+end;
+
+function strec.findtoken (s1: string): Boolean;
+begin position := 0;
+ findtoken := lookuptoken (s1)
+end;
+
+procedure strec.gotonexttoken;
+var t: string;
+begin t := nexttoken
+end;
+
+procedure strec.replacelasttoken (s1: string);
+begin replace (startpos, position - 1, s1)
+end;
+
+end.
diff --git a/fonts/utilities/t1tools/t1tidy/t1t.bat b/fonts/utilities/t1tools/t1tidy/t1t.bat
new file mode 100644
index 0000000000..af8c75caf5
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/t1t.bat
@@ -0,0 +1,48 @@
+@echo off
+set dumvar=
+rem Options: unfortunately, the stupid MSDOS command interpreter does not
+rem allow us to recognize if the first argument start with a '-', so we
+rem can only have a small number of specific option strings here.
+set option=
+:options
+if "%1"=="-g" goto option
+if "%1"=="-e" goto option
+if "%1"=="-ge" goto option
+if "%1"=="-eg" goto option
+if "%1"=="-s" goto option
+if "%1"=="+c" goto option
+if "%1"=="+x" goto option
+goto optok
+:option
+set option=%option% %1
+shift
+goto :options
+:optok
+echo options: %option%
+if exist %1.ps set genps=rem
+if "%2"=="" goto empty
+if exist %2\nul goto dir
+
+%genps% D:\fonts\progs\t1utils\t1disasm %1.pfb %1.ps
+D:\fonts\progs\t1tidy\t1tidy %option% %1.ps %2.ps
+D:\fonts\progs\t1utils\t1asm %2.ps %2.pfa
+D:\fonts\progs\t1utils\t1binary %2.pfa %2.pfb
+%genps% del %1.ps
+del %2.ps
+del %2.pfa
+goto end
+
+:dir
+%genps% D:\fonts\progs\t1utils\t1disasm %1.pfb %1.ps
+D:\fonts\progs\t1tidy\t1tidy %option% %1.ps %2
+D:\fonts\progs\t1utils\t1asm %2\%1.ps %2\%1.pfa
+D:\fonts\progs\t1utils\t1binary %2\%1.pfa %2\%1.pfb
+%genps% del %1.ps
+del %2\%1.ps
+del %2\%1.pfa
+goto end
+
+:empty
+echo No destination font file name given
+
+:end
diff --git a/fonts/utilities/t1tools/t1tidy/t1tidy.pas b/fonts/utilities/t1tools/t1tidy/t1tidy.pas
new file mode 100644
index 0000000000..a80ecb09e8
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tidy/t1tidy.pas
@@ -0,0 +1,531 @@
+program T1tidy;
+
+uses Dos, pathunit, strtype, afm, data;
+
+function makeint (s: string): integer;
+var i, c: integer;
+begin
+ val (s, i, c);
+ makeint := i
+end;
+
+function hex (c: char): integer;
+begin
+ if c < '0' then hex := 0
+ else if c <= '9' then hex := ord (c) - ord ('0')
+ else if upcase (c) < 'A' then hex := 0
+ else if upcase (c) <= 'F' then hex := ord (upcase (c)) - ord ('A') + 10
+ else hex := 0
+end;
+
+function intstr (i: longint): string;
+var s: string;
+begin
+ str (i, s);
+ intstr := s
+end;
+
+function basename (fn: string): string;
+begin
+ if pos ('.', fn) > 0 then
+ basename := copy (fn, 1, pos ('.', fn) - 1)
+ else basename := fn
+end;
+
+function isdir (fn: string): Boolean;
+var f: file;
+ a: word;
+begin
+ assign (f, fn);
+ GetFAttr (f, a);
+ isdir := (a and $10) <> 0
+end;
+
+(* main procedure: *)
+
+procedure tidy (var infile, out: text);
+
+const maxintermediatelines = 40;
+
+var line, Subrsline, CharStringsline: strec;
+ intermediatelines: array [1..maxintermediatelines] of string;
+ linesafterOtherSubrs, linesafterSubrs: integer;
+
+ blanklines: integer;
+ i: integer;
+
+(***************************************************************************)
+
+ function eofile: Boolean;
+ begin eofile := eof (infile) end;
+
+ procedure readline;
+ var s: string;
+ begin
+ readln (infile, s);
+ line.ini (s)
+ end;
+
+ function nexttoken: string;
+ var r: string;
+ begin
+ r := line.nexttoken;
+ while r = '' do begin
+ readline;
+ r := line.nexttoken
+ end;
+ nexttoken := r
+ end;
+
+ procedure readSubr;
+ var s: string;
+ index: integer;
+ begin
+ Subrscount := Subrscount + 1;
+ new (Subrs [Subrscount], ini);
+ with Subrs [Subrscount] ^ do begin
+ index := makeint (nexttoken);
+ (* writeln ('% reading Subr ', index); *)
+ setindex (index);
+ if nexttoken <> '{' then writeln ('% missing { in Subr');
+ s := nexttoken;
+ while s <> '}' (* and ... Fehlerabfang! *)
+ do begin
+ if s = '' then writeln ('% empty line detected in Subr');
+ appendtoken (s);
+ s := nexttoken;
+ end;
+ if s <> '}' then writeln ('% missing } in Subr');
+ s := nexttoken;
+ if s = 'noaccess' then s := s + ' ' + nexttoken;
+ setdef (s);
+ cleanup
+ end
+ end;
+
+ procedure readCharString;
+ var s: string;
+ begin
+ CharStringscount := CharStringscount + 1;
+ new (CharStrings [CharStringscount], ini);
+ with CharStrings [CharStringscount] ^ do begin
+ s := line.lasttoken;
+ if ttfix then
+ if (s [2] = 'G') and (length (s) = 4) then begin
+ i := hex (s [3]) * 16 + hex (s [4]);
+ if WinANSI [i] <> '/.notdef' then s := WinANSI [i]
+ end;
+ setname (s);
+ if nexttoken <> '{' then writeln ('% missing { in CharString');
+ s := nexttoken;
+ while s <> '}' (* and ... Fehlerabfang! *)
+ do begin
+ appendtoken (s);
+ s := nexttoken;
+ end;
+ if s <> '}' then writeln ('% missing } in CharString');
+ s := nexttoken;
+ if s = 'noaccess' then s := s + ' ' + nexttoken;
+ if clearifempty
+ then begin
+ dispose (CharStrings [CharStringscount]);
+ CharStringscount := CharStringscount - 1
+ end
+ else begin
+ setdef (s);
+ cleanup;
+ if not generate and split then splitpath
+ end
+ end
+ end;
+
+ procedure fixchars;
+
+ procedure halfchar (oldname, newname: string);
+ var CSold, CSnew: CharStrpointer;
+ begin
+ CSold := getCharString (oldname);
+ CSnew := getCharString (newname);
+ if (CSnew = nil) and (CSold <> nil) then begin
+ new (CSnew, ini);
+ CSold^.copyhalf (CSnew^, newname);
+ CharStringscount := CharStringscount + 1;
+ CharStrings [CharStringscount] := CSnew;
+ end
+ end;
+
+ procedure downchar (oldname, newname: string);
+ var CSold, CSnew: CharStrpointer;
+ begin
+ CSold := getCharString (oldname);
+ CSnew := getCharString (newname);
+ if (CSnew = nil) and (CSold <> nil) then begin
+ new (CSnew, ini);
+ CSold^.downpath (CSnew^, newname);
+ CharStringscount := CharStringscount + 1;
+ CharStrings [CharStringscount] := CSnew;
+ end
+ end;
+
+ procedure copychar (oldname, newname: string);
+ var CSold, CSnew: CharStrpointer;
+ begin
+ CSold := getCharString (oldname);
+ CSnew := getCharString (newname);
+ if (CSnew = nil) and (CSold <> nil) then begin
+ new (CSnew, ini);
+ CSold^.copypath (CSnew^, newname);
+ CharStringscount := CharStringscount + 1;
+ CharStrings [CharStringscount] := CSnew;
+ end
+ end;
+
+ var CSbullet, CSperiodcentered: CharStrpointer;
+ begin
+ if verbose then writeln ('% generating missing characters');
+ if corelfix then begin
+ CSbullet := getCharString ('/bullet');
+ CSperiodcentered := getCharString ('/periodcentered');
+ if (CSbullet <> nil) and (CSperiodcentered <> nil) then
+ swappaths (CSbullet^, CSperiodcentered^);
+ end;
+ halfchar ('/quotedbl', '/quotesingle');
+ downchar ('/quotedblright', '/quotedblbase');
+ halfchar ('/quotedblbase', '/quotesinglbase');
+ halfchar ('/quotedblleft', '/quoteleft');
+ halfchar ('/quotedblright', '/quoteright');
+ downchar ('/quoteright', '/quotesinglbase');
+ halfchar ('/guillemotleft', '/guilsinglleft');
+ halfchar ('/guillemotright', '/guilsinglright');
+ copychar ('/less', '/guilsinglleft');
+ copychar ('/greater', '/guilsinglright');
+ if getCharString ('/endash') <> nil
+ then copychar ('/endash', '/minus')
+ else copychar ('/hyphen', '/minus');
+ copychar ('/slash', '/fraction');
+ copychar ('/bar', '/brokenbar');
+ copychar ('/asciitilde', '/tilde');
+ copychar ('/asciicircum', '/circumflex');
+ copychar ('/degree', '/ring');
+
+ if afmopen or ccopen then begin
+ if verbose then writeln ('% generating composed characters');
+ composeCCs;
+ end
+ end;
+
+var uidfile: text; UniqueID, OtherSubrsfilepos: longint;
+ OtherSubrs: text;
+ savedOtherSubrs: Boolean;
+ s: string;
+ OtherSubrslevel: integer;
+ OtherSubrsup, OtherSubrsdown: string;
+
+begin (* tidy *)
+ Subrscount := 0;
+ linesafterOtherSubrs := 0;
+ savedOtherSubrs := false;
+ linesafterSubrs := 0;
+ CharStringscount := 0;
+ UniqueID := 0;
+
+ readline;
+ (* i := line.posof ('FontType1-1.0');
+ (* if i > 0 then line.replace (i, i + 12, 'PS-AdobeFont-1.0'); *)
+ blanklines := 0;
+ while not eofile and not line.findtoken ('/Subrs')
+ and not line.findtoken ('/OtherSubrs')
+ and not line.findtoken ('/CharStrings') do begin
+ if line.str <> '' then
+ if line.firsttoken = '' then blanklines := blanklines + 1
+ else begin
+ if line.hasprefix ('/FontName') then
+ writeln ('% FontName: ', line.nthtoken (2));
+ if corelfix then begin
+ (* The following modification, if desired at all,
+ would have to be accompanied with metrics
+ adjustment in the .afm file *)
+ (* if line.hasprefix ('/FontMatrix') then begin
+ if line.findtoken ('0.001000')
+ then line.replacelasttoken ('0.000950');
+ if line.findtoken ('0.001000')
+ then line.replacelasttoken ('0.000950');
+ end;
+ *)
+ if line.hasprefix ('/UniqueID') then
+ if line.findtoken ('4221071') then begin
+ if UniqueID = 0 then begin
+ assign (uidfile, 'UniqueID.int');
+ (*$I-*) reset (uidfile) (*$I+*);
+ if IOresult = 0 then read (uidfile, UniqueID)
+ else UniqueID := 4221071;
+ UniqueID := UniqueID + 1;
+ rewrite (uidfile);
+ write (uidfile, UniqueID);
+ close (uidfile);
+ end;
+ line.replacelasttoken (intstr (UniqueID));
+ end
+ end;
+ if stdenc then begin
+ if line.findtoken ('/Encoding') then begin
+ while not line.findtoken ('def') do begin
+ stdenc := false;
+ readline;
+ end;
+ line.ini ('/Encoding StandardEncoding def');
+ if verbose and not stdenc then
+ writeln ('% replacing encoding vector with StandardEncoding')
+ end
+ end;
+ writeln (out, line.str);
+ end;
+ readline;
+ end;
+ if blanklines > 0 then begin
+ writeln ('% ', blanklines, ' blank lines removed');
+ end;
+ if line.findtoken ('/OtherSubrs') then begin
+ (* Borland unwisely prohibited filepos / seek on text files,
+ so we must save the OtherSubrs part in an intermediate
+ file to paste it in again if needed. *)
+ if getenv ('TEMP') <> ''
+ then assign (OtherSubrs, getenv ('TEMP') + '\other.sub')
+ else assign (OtherSubrs, 'other.sub');
+ rewrite (OtherSubrs);
+ OtherSubrslevel := 1;
+ OtherSubrsup := '';
+ repeat s := line.nexttoken;
+ if s = '' then begin
+ writeln (OtherSubrs, line.str);
+ readline;
+ end else if OtherSubrsup = '' then begin
+ OtherSubrsup := s;
+ if s = '[' then OtherSubrsdown := ']'
+ else OtherSubrsdown := '}';
+ end else if s = OtherSubrsup then
+ OtherSubrslevel := OtherSubrslevel + 1
+ else if s = OtherSubrsdown then
+ OtherSubrslevel := OtherSubrslevel - 1;
+ until OtherSubrslevel = 0;
+ writeln (OtherSubrs, line.str);
+ reset (OtherSubrs);
+ savedOtherSubrs := true;
+
+ readline;
+ while not eofile and not line.findtoken ('/Subrs')
+ and not line.findtoken ('/CharStrings') do begin
+ if not line.empty then begin
+ linesafterOtherSubrs := linesafterOtherSubrs + 1;
+ intermediatelines [linesafterOtherSubrs] := line.str;
+ end;
+ readline
+ end;
+ end;
+ if line.findtoken ('/Subrs') then begin
+ if verbose then writeln ('% reading Subrs');
+ Subrsline := line;
+ readline;
+ while nexttoken = 'dup' do readSubr;
+ end else
+ writeln ('% /Subrs not found');
+
+ linesafterSubrs := linesafterOtherSubrs;
+ while not eofile and not line.findtoken ('/CharStrings') do begin
+ if not line.empty then begin
+ linesafterSubrs := linesafterSubrs + 1;
+ intermediatelines [linesafterSubrs] := line.str;
+ end;
+ readline
+ end;
+ if line.findtoken ('/CharStrings') then begin
+ if verbose then writeln ('% reading CharStrings');
+ CharStringsline := line;
+ readline;
+ while pos ('/', nexttoken) = 1 do begin
+ readCharString;
+ (* readline; *)
+ end;
+ end else
+ writeln ('% /CharStrings not found');
+
+ i := 1;
+ while noOtherSubrs and (i <= CharStringscount) do begin
+ noOtherSubrs := not CharStrings [i]^.usesothersubrs;
+ i := i + 1
+ end;
+ (* Borland unwisely prohibited filepos / seek on text files
+ if noOtherSubrs then seek (out, OtherSubrsfilepos);
+ *)
+ if savedOtherSubrs then begin
+ if noOtherSubrs
+ then writeln ('% unused /OtherSubrs removed')
+ else while not eof (OtherSubrs) do begin
+ readln (OtherSubrs, s);
+ writeln (out, s)
+ end;
+ close (OtherSubrs);
+ erase (OtherSubrs);
+ end;
+ for i := 1 to linesafterOtherSubrs do
+ writeln (out, intermediatelines [i]);
+
+ if Subrscount > 0 then begin
+ (* re-structure Subrs and CharStrings: *)
+ (* if verbose then write ('% cleaning junk operations - '); *)
+ (* for i := 1 to Subrscount do Subrs [i]^.cleanup; *)
+ (* for i := 1 to CharStringscount do CharStrings [i]^.cleanup; *)
+ if generate then begin
+ if verbose then write ('% generating missing chars - ');
+ fixchars;
+ end;
+ if generate and split then begin
+ if verbose then write ('% splitting paths - ');
+ for i := 1 to CharStringscount do CharStrings [i]^.splitpath; (**)
+ end;
+ (* sort and number subroutines, collect statistics *)
+ sortMoreSubrs;
+ if verbose then writeln ('% arranging new subpaths');
+ arrangeMoreSubrs (Subrscount);
+
+ (* output Subrs: *)
+ if expand then begin
+ Subrstotal := 4;
+ Subrscount := 4 (* assume they sit on the first positions *)
+ end;
+ Subrsline.gotonexttoken;
+ Subrsline.replacelasttoken (intstr (Subrstotal));
+ writeln (out, Subrsline.str);
+ begin (* writeln (out, '% Subrs: -------'); *)
+ if verbose then write ('% writing previous Subrs - ');
+ for i := 1 to Subrscount do
+ Subrs [i]^.print (out);
+ if not expand then begin
+ if verbose then writeln ('% writing new Subrs');
+ printMoreSubrs (out)
+ end
+ end;
+
+ for i := linesafterOtherSubrs + 1 to linesafterSubrs do
+ writeln (out, intermediatelines [i]);
+ end;
+
+ if afmcheck and afmopen then begin
+ if verbose then writeln ('% checking afm measure information');
+ for i := 1 to CharStringscount do CharStrings [i]^.checkafm (false);
+ end;
+
+ if CharStringscount > 0 then begin
+ (* output CharStrings: *)
+ CharStringsline.gotonexttoken;
+ CharStringsline.replacelasttoken (intstr (CharStringscount));
+ writeln (out, CharStringsline.str);
+ begin (* writeln (out, '% CharStrings: -------'); *)
+ if verbose then writeln ('% writing CharStrings');
+ for i := 1 to CharStringscount do
+ CharStrings [i]^.print (out)
+ end;
+ end;
+
+ while not eofile do begin
+ writeln (out, line.str);
+ readline;
+ end;
+ write (out, line.str);
+ writeln (out);
+end;
+
+var infile, out, afmin, ccin, afmout: text;
+ fontfile, fontname: string;
+ paramindex, i: integer;
+ option: string;
+ optionvalue: Boolean;
+
+ function isoption: Boolean;
+ begin if paramindex > paramcount then isoption := false
+ else begin
+ option := paramstr (paramindex);
+ if length (option) = 0 then isoption := false
+ else isoption := option [1] in ['-', '+', '/']
+ end
+ end;
+begin
+ corelfix := false;
+ generate := true;
+ split := true;
+ ttfix := true;
+ verbose := true;
+ stdenc := true;
+ noOtherSubrs := true;
+ afmcheck := true;
+ expand := false;
+ paramindex := 1;
+ while isoption do begin
+ optionvalue := true;
+ for i := 1 to length (option) do
+ case option [i] of
+ '+': optionvalue := true;
+ '-': optionvalue := false;
+ 'c': corelfix := optionvalue;
+ 'g': generate := optionvalue;
+ 's': split := optionvalue;
+ 't': ttfix := optionvalue;
+ 'v': verbose := optionvalue;
+ 'e': stdenc := optionvalue;
+ 'o': noOtherSubrs := optionvalue;
+ 'a': afmcheck := optionvalue;
+ 'x': expand := optionvalue;
+ end;
+ if corelfix then generate := true;
+ if expand then split := false;
+ paramindex := paramindex + 1
+ end;
+
+ if paramindex <= paramcount then begin
+ fontfile := paramstr (paramindex);
+ fontname := basename (fontfile);
+ assign (infile, fontfile); reset (infile);
+ assign (afmin, fontname + '.afm');
+ assign (ccin, fontname + '.cc');
+
+ paramindex := paramindex + 1;
+ if paramindex <= paramcount then begin
+ if isdir (paramstr (paramindex)) then begin
+ fontfile := paramstr (paramindex) + '\' + fontfile;
+ fontname := paramstr (paramindex) + '\' + fontname;
+ end else begin
+ fontfile := paramstr (paramindex);
+ fontname := basename (fontfile);
+ end;
+ assign (out, fontfile);
+ assign (afmout, fontname + '.afm');
+ end else begin
+ assign (out, '' (* use standard output *));
+ assign (afmout, fontname + '.af$');
+ end;
+ (*$I-*) reset (afmin) (*$I+*);
+ afmopen := IOresult = 0;
+ if afmopen then begin
+ if verbose then writeln ('% reading afm information');
+ openafm (afmin, afmout);
+ end;
+ (*$I-*) reset (ccin) (*$I+*);
+ ccopen := IOresult = 0;
+ if ccopen then begin
+ if verbose then writeln ('% reading compose information');
+ opencc (ccin);
+ close (ccin);
+ end;
+
+ rewrite (out);
+ tidy (infile, out);
+ close (out);
+
+ if afmopen then begin
+ if verbose then writeln ('% finishing afm file');
+ closeafm (afmin, afmout);
+ end;
+ close (infile)
+ end else tidy (input, output);
+ printusedstat;
+end.
diff --git a/fonts/utilities/t1tools/t1tools.doc b/fonts/utilities/t1tools/t1tools.doc
new file mode 100644
index 0000000000..10ed517d3b
--- /dev/null
+++ b/fonts/utilities/t1tools/t1tools.doc
@@ -0,0 +1,211 @@
+t1tools is a collection of programs and batch files useful for
+handling type 1 fonts on MSDOS and Unix systems.
+Documentation is ad-hoc to get the package out at last - sorry for
+any inconvenience this may impose. The package is not meant for
+people without knowledge about type 1 font and metrics stuff.
+If you detect any incompleteness or have any suggestions for improvement,
+please tell me.
+Thomas Wolff@inf.fu-berlin.de
+
+
+The package contains the following tools:
+
+makeafm.bat (MSDOS)
+makeafm (Unix)
+ Generates an .afm font metrics file from a .pfb font file.
+ The information is taken directly from the font itself by
+ first disassembling it using an appropriate program.
+ If pair kerning information is available from any previously
+ existing .afm or .pfm file for that font it will be included
+ in the generated .afm file.
+
+ Syntax: makeafm font-file-base
+ Don't include .pfb / .pfa suffix in file name.
+ Examples:
+ makeafm photina
+
+ Disadvantage: character bounding box information will not be
+ included. This does not matter for use with FrameMaker (which
+ I originally wrote the script for), but for some Tex-ps adaptations.
+ The MSDOS version, however, does at least include simulated character
+ bounding box information derived from other font information to
+ enable Adobe's makepfm to work on the .afm file.
+ Required:
+ 1. To disassemble the type 1 font (.pfb file):
+ the program t1disasm from the package t1utils posted by
+ I. Lee Hetherington with the following modification to t1disasm.c:
+ look up the line output(" {\n");
+ at the beginning of the routine do_charstring and remove the \n .
+ 2. To extract pair kerning information from .pfm files on MSDOS:
+ a) either the program pfm2afm
+ b) or the program dumppfm (version 1.5.3)
+ (Extraction from .pfm files works without additional software on Unix.)
+
+
+getmetri.bat (MSDOS)
+getmetric (Unix)
+ Generates an .afm font metrics file by interpretation of the font
+ using GhostScript. Like makeafm, this script will try to include
+ kerning information from previous sources.
+
+ Syntax: getmetric font-file-base [/FontName]
+ Don't include .pfb / .pfa suffix in file name.
+ Explicit /FontName can choose among several fonts in file.
+ Examples:
+ getmetric photina
+ getmetric hvn_____ /Helvetica-Narrow
+
+ Disadvantage: GhostScript in its current version still has a bug
+ which causes incorrect width information to be calculated for
+ characters composed by seac and having a different width from their
+ base character - actually, this should not be allowed according to
+ the type 1 font specification, but to accomodate existing fonts to
+ work, rather Adobe's "Do what we implement" semantics should be
+ realized. The problem especially occurs with fonts bundled with
+ Micrografx Designer (which even compose characters like double
+ qoute marks from single quote marks etc), so don't apply getmetri
+ on them.
+
+ Required: GhostScript
+ getmetri.ps (enclosed), which is a corrected and enhanced
+ version of the PostScript program posted by W.T. Roberts
+ and Bryan Bayerdorffer.
+
+pfbshow.bat (MSDOS)
+gpreview (Unix)
+preview (Unix)
+pfbpr.bat (MSDOS)
+preprint (Unix)
+ [preview and preprint differ from gpreview only by their name and
+ can be created by setting respective links.]
+ Generates a sample text and character set listing of up to four
+ fonts (preferably of one family).
+ The latter two print, the first three display on screen.
+
+ Syntax: pfbshow fontfile1 [fontfile2 [fontfile3 [fontfile4]]]
+ pfbpr fontfile1 [fontfile2 [fontfile3 [fontfile4]]]
+ preview (fontfile|fontname) ...
+ Up to four fonts make sense. The Unix scripts can accept
+ FontNames instead of file names to explicitly select a
+ font which must then be previously known to the interpreter.
+ Examples:
+ pfbshow photina.pfb
+ pfbshow photina photinai photinab
+ gpreview Times-Roman.pfb /Hershey-Roman
+
+ Required:
+ one of several .pfb/.pfa converters (e.g. from t1utils)
+ pfbshow.bat, pfbpr.bat: pfshow.ps (enclosed)
+ pfbshow, gpreview, pfbpr: GhostScript
+ preprint: a PostScript printer
+ preview: a type 1 font emulation package for OpenWindows
+ and a font disassembler (e.g. from t1utils)
+ (or maybe, native type 1 font interpretation in
+ OpenWindows 3.1 which I don't have)
+
+pcs.bat (MSDOS)
+ Display the character set of a font in comparison with that of
+ an installed reference font (or a second font) including a
+ coloured width and slant angle box. It can be used to judge
+ quality, similarity, and correct/incorrect character set assignment
+ of fonts.
+
+ Syntax: pcs filename [filename2]
+ Examples:
+ pcs gocmase_.pfb
+ pcs agar agarsc
+
+pfblist.bat (MSDOS)
+ Generates a list of file and font names of the current directory.
+ Requires: pfbnames.pas/.exe (enclosed)
+
+afm-pfm.bat (MSDOS)
+ Generates .pfm from .afm files using Adobe's makepfm program.
+ Generates .inf information as needed for makepfm. Also tries
+ to extract the correct Bold/Italic combination from .afm information.
+ Can be called with explicit information about the Windows menu
+ font name and Bold/Italic combination to be used.
+
+ Syntax: afm-pfm fontfile [MSMenuName | - ] [N | I | B | T]
+ Don't include .afm suffix in fontfile.
+ MSMenuName selects a name under which the font should appear
+ in MS Windows menus for most programs if this is different
+ from the FamilyName in the .afm file. (Annoyingly, only
+ 4 fonts can be grouped under one name in MS Windows.)
+ N forces the generated style information to be normal,
+ I italic, B bold, T bold-italic.
+ Examples:
+ afm-pfm agar
+ afm-pfm agarb AGaramondBold N
+ If the MS menu name to be generated should contain blanks, an .inf
+ file must be generated first and the name inserted there.
+
+ Required: makepfm.exe from Adobe's "font foundry".
+
+afm-inf.bat (MSDOS)
+ Part of afm-pfm, can also be called separately.
+ Example: afm-inf agar
+
+afm-sort.bat (MSDOS)
+ Sorts the pair kerning list within an .afm file. Needed for some
+ .afm files to prevent Adobe's simple-minded makepfm program
+ from crashing.
+ Example: afm-sort agar
+
+pfb-abf.bat (MSDOS)
+ Generate .abf files for 72x72 resolution as required to generate
+ FrameMaker screen font files for use on Sun workstations.
+
+ Syntax: pfb-abf fontname [outnam [resolutionx [resolutiony [encoding]]]]
+ Don't include .pfb suffix in fontname.
+ If fontname is longer than 6 characters a unique outnam with
+ at most 6 characters must additionally be specified (five if
+ you should generate point sizes > 99).
+ Screen resolution defaults to 72x72 (for Sun workstations)
+ but can be changed.
+ The encoding vector to be applied (to be given without its
+ .enc suffix) defaults to fontname.ENC if that exists,
+ C:\Adobe\APPLE.ENC otherwise (adapt the path in the script
+ to where you place the APPLE.ENC file enclosed).
+ The set of point sizes to be generated defaults to
+ 10 12 14 18 24 but may changed by the environment variable
+ SIZES, e.g. (for display fonts) set SIZES=18 24 36
+ Note that FrameMaker needs at least sizes 18 and 24.
+
+ Required: makebit.exe, makeabf.exe from Adobe's "font foundry".
+
+pfb-sfp.bat (MSDOS)
+ Generate HP Laserjet soft fonts from .pfb fonts.
+
+ Syntax: pfb-abf fontname [outnam [resolutionx [resolutiony [encoding]]]]
+ Don't include .pfb suffix in fontname.
+ If fontname is longer than 6 characters a unique outnam with
+ at most 6 characters must additionally be specified (five if
+ you should generate point sizes > 99).
+ Printer resolution defaults to 300x300.
+ The encoding vector to be applied (to be given without its
+ .enc suffix) defaults to fontname.ENC if that exists,
+ C:\Adobe\foundry\W.ENC otherwise (adapt path in the script).
+ The set of point sizes to be generated defaults to
+ 10 12 but may changed by the environment variable PSIZES,
+ e.g. set PSIZES=9 10 12 14 18
+
+ Required: makebit.exe, makeljf.exe from Adobe's "font foundry".
+
+pfb-enc.bat (MSDOS)
+ Extracts an .ENC encoding description from a font specific encoding
+ vector for use with pfb-abf or pfb-sfp.
+ Example:
+ pfb-enc agarexp
+
+fm.ps
+ A one-liner. Prepended to FrameMaker generated PostScript files
+ it makes them work with GhostScript.
+
+Debugging: All MSDOS scripts accept an additional first parameter "-"
+in which case they do not delete their intermediate files.
+
+Remark: Due to that silly MSDOS path restriction, all my MSDOS scripts
+(.bat files) contain full path names for several programs. These will have
+to be adapted to your installation. Also, for pcs, a reference font will
+have to be chosen and installed in the script.
diff --git a/fonts/utilities/t1tools/w.enc b/fonts/utilities/t1tools/w.enc
new file mode 100644
index 0000000000..f03b4aae2f
--- /dev/null
+++ b/fonts/utilities/t1tools/w.enc
@@ -0,0 +1,144 @@
+%
+% Copyright 1989 Adobe Systems Inc. All Rights Reserved.
+% This encoding vector represents the differences between the PostScript
+% standard encoding and the MS-Windows ANSI character set.
+% Digby Horner - 01/11/89
+% yh - 08/27/91 Added some characters for Windows 3.1
+% rm - 11-21-91 added tilde @ 152 and circumflex @ 136 for win 3.1
+%
+MaxIndex 255
+MaxEncoded 255
+%
+StartEncoding
+39 quotesingle
+96 grave
+128 .notdef
+129 .notdef
+130 quotesinglbase
+131 florin
+132 quotedblbase
+133 ellipsis
+134 dagger
+135 daggerdbl
+136 circumflex
+137 perthousand
+138 Scaron
+139 guilsinglleft
+140 OE
+141 .notdef
+142 .notdef
+143 .notdef
+144 .notdef
+145 quoteleft
+146 quoteright
+147 quotedblleft
+148 quotedblright
+149 bullet
+150 endash
+151 emdash
+152 tilde
+153 trademark
+154 scaron
+155 guilsinglright
+156 oe
+157 .notdef
+158 .notdef
+159 Ydieresis
+160 space
+161 exclamdown
+162 cent
+163 sterling
+164 currency
+165 yen
+166 brokenbar
+167 section
+168 dieresis
+169 copyright
+170 ordfeminine
+171 guillemotleft
+172 logicalnot
+173 minus
+174 registered
+175 macron
+176 degree
+177 plusminus
+178 twosuperior
+179 threesuperior
+180 acute
+181 mu
+182 paragraph
+183 periodcentered
+184 cedilla
+185 onesuperior
+186 ordmasculine
+187 guillemotright
+188 onequarter
+189 onehalf
+190 threequarters
+191 questiondown
+192 Agrave
+193 Aacute
+194 Acircumflex
+195 Atilde
+196 Adieresis
+197 Aring
+198 AE
+199 Ccedilla
+200 Egrave
+201 Eacute
+202 Ecircumflex
+203 Edieresis
+204 Igrave
+205 Iacute
+206 Icircumflex
+207 Idieresis
+208 Eth
+209 Ntilde
+210 Ograve
+211 Oacute
+212 Ocircumflex
+213 Otilde
+214 Odieresis
+215 multiply
+216 Oslash
+217 Ugrave
+218 Uacute
+219 Ucircumflex
+220 Udieresis
+221 Yacute
+222 Thorn
+223 germandbls
+224 agrave
+225 aacute
+226 acircumflex
+227 atilde
+228 adieresis
+229 aring
+230 ae
+231 ccedilla
+232 egrave
+233 eacute
+234 ecircumflex
+235 edieresis
+236 igrave
+237 iacute
+238 icircumflex
+239 idieresis
+240 eth
+241 ntilde
+242 ograve
+243 oacute
+244 ocircumflex
+245 otilde
+246 odieresis
+247 divide
+248 oslash
+249 ugrave
+250 uacute
+251 ucircumflex
+252 udieresis
+253 yacute
+254 thorn
+255 ydieresis
+EndEncoding
+ \ No newline at end of file
diff --git a/fonts/utilities/t1utils/README b/fonts/utilities/t1utils/README
new file mode 100644
index 0000000000..0f7415491b
--- /dev/null
+++ b/fonts/utilities/t1utils/README
@@ -0,0 +1,81 @@
+T1UTILS VERSION 1.36 NOTES
+==========================
+
+ You need an ANSI C compiler, such as gcc.
+
+ Just type `./configure', then `make'. `make install' will build and
+install the utilities and their manual pages.
+
+ `./configure' accepts the usual options. See `INSTALL' for more
+details. The most commonly used option is `--prefix', which can be used
+to install the utilities in a place other than /usr/local.
+
+ Changes since version 1.2 (c) 1998-2008 Eddie Kohler, under the same
+redistribution copyright as I. Lee Hetherington's. See below for I. Lee
+Hetherington's original README from 1992, updated slightly for today's
+t1utils.
+
+Eddie Kohler
+ekohler@gmail.com
+
+####################################################################
+
+t1utils is a collection of simple type-1 font manipulation programs.
+Together, they allow you to convert between PFA (ASCII) and PFB (binary)
+formats, disassemble PFA or PFB files into human-readable form, reassemble
+them into PFA or PFB format. Additionally you can extract font resources
+from a Macintosh font file (ATM/Laserwriter), or create a Macintosh Type 1
+font file from a PFA or PFB font.
+
+There are currently six programs:
+
+t1ascii converts PFB files to PFA format.
+
+t1binary converts PFA files to PFB format.
+
+t1disasm disassembles a type-1 font (PFA or PFB format) into a
+ raw, human-readable text form for subsequent hand
+ editing, tweaking, hint fixing, etc...
+
+t1asm assembles type-1 font into PFA or PFB format from
+ human-readable form produced by t1disasm.
+
+t1unmac extracts POST resources from a Macintosh type-1 file
+ (ATM/Laserwriter) into PFA or PFB format for use outside
+ the Macintosh environment. The Macintosh file should be
+ stored in MacBinary, AppleSingle, AppleDouble, or BinHex
+ format, or as a raw resource fork. Note that t1unmac does
+ not have to run on a Macintosh, but makes Macintosh type-1
+ fonts available to Unix machines and PCs.
+
+t1mac creates a Macintosh Type 1 file from a PFA or PFB-format
+ Type 1 font. Writes the Macintosh file in MacBinary,
+ AppleSingle, AppleDouble, or BinHex format, or as a raw
+ resource fork. WARNING: This will not suffice to use the
+ new font on a Macintosh, as Macintoshes cannot read raw
+ Type 1 fonts. You will need to create a font suitcase
+ containing bitmap fonts if you do not have such a suitcase
+ for the font already. T1utils cannot help you do this.
+
+...
+
+Thanks to Kai-Uwe Herbing (herbing@netmbx.netmbx.de) for the MS-DOS
+port (Microsoft C/C++ compiler).
+
+The copyright on all of the tools in t1utils looks like:
+
+ Copyright (c) 1992 by I. Lee Hetherington, all rights
+ reserved.
+
+ Permission is hereby granted to use, modify, and distribute
+ this program for any purpose provided this copyright notice
+ and the one below remain intact.
+
+Note that these tools should not be used to illegally copy type-1 font
+programs. Typeface design is an intricate art that should be
+rewarded.
+
+I. Lee Hetherington
+ilh@lcs.mit.edu
+
+####################################################################
diff --git a/fonts/utilities/tfmpktest/README b/fonts/utilities/tfmpktest/README
new file mode 100644
index 0000000000..79e7a491e4
--- /dev/null
+++ b/fonts/utilities/tfmpktest/README
@@ -0,0 +1,9 @@
+
+TFMPKtest.pl
+
+tfmpktest.pl : control the checksum of pk font (use the tfm font).
+Can delete bad pk font with checksum missmatch and recreate it
+with mktexpk. Can also control TFM files by generating new TFM
+with the MF files and mf. TFMPKtest.pl need pktype, tftopl and mf.
+
+
diff --git a/fonts/utilities/tfmpktest/tfmpktest.pl b/fonts/utilities/tfmpktest/tfmpktest.pl
new file mode 100644
index 0000000000..60d1165938
--- /dev/null
+++ b/fonts/utilities/tfmpktest/tfmpktest.pl
@@ -0,0 +1,429 @@
+#!/usr/local/bin/perl5
+#
+# TFMPKtest.pl : control the checksum of pk font (use the tfm font).
+# Can delete bad pk font with checksum missmatch and recreate it with mktexpk.
+# Can also control TFM files by generating new TFM with the MF files and mf.
+# TFMPKtest.pl need pktype, tftopl and mf.
+#
+# License: LaTeX Project Public License (lppl)
+# (CTAN:/help/Catalogue/licenses.lppl.html)
+#
+# Dominique Larchey (e-mail: larchey@loria.fr web: http://www.loria.fr/~larchey)
+# Denis Roegel (e-mail: roegel@loria.fr web: http://www.loria.fr/~roegel)
+# Christian Rossi (e-mail: rossi@loria.fr web: http://www.loria.fr/~rossi)
+#
+# This perl script is on the web : http://www.loria.fr/~rossi/tfmpktest.pl
+#
+# (La)TEX Navigator (http://www.loria.fr/services/tex/)
+# CTAN Navigator (http://ctan.loria.fr/)
+# LORIA (http://www.loria.fr/) - Nancy - France
+# 2000/07/08
+
+# options
+
+use Getopt::Long;
+GetOptions('dir=s',\@dir,'c!','control!','d!','del!','t!','tfm!','v!','verbose!','h!','help!');
+
+# if -h or --h or -help or --help
+
+if (($opt_h) || ($opt_help))
+ {
+ print "tfmpktest.pl v. 0.11 by DL/DR/CR - LORIA\n";
+ print "Usage: tfmpktest.pl [OPTIONS] \n\n";
+ print "--help for more information\n";
+ print "--control control pkfont (default)\n";
+ print "--del delete pkfont with checksum\n";
+ print " mismatch and create the new pk\n";
+ print "--tfm control TFM files\n";
+ print "--dir DIR1 [, DIR2...] pk font directories\n";
+ print "--verbose verbose\n";
+ print "\n";
+ print "TFMPKtest.pl : control the checksum of pk font (use the tfm font).\n";
+ print "Can delete bad pk font with checksum missmatch and recreate it with mktexpk.\n";
+ print "Can also control TFM files by generating new TFM with the MF files and mf.\n";
+ print "TFMPKtest.pl need pktype and tftopl for pk control and TFM control need mf.\n";
+ print "\n";
+ exit;
+ }
+
+# pid for the logfile name
+$pid = $$;
+if (($opt_tfm) || ($opt_t))
+ {
+ $logfile="/tmp/tfmtest." . $pid . ".log";
+ } else
+ {
+ $logfile="/tmp/pktest." . $pid . ".log";
+ }
+
+print "PKtest v0.1 by DL/DR/CR - LORIA\n\n";
+print "Logfile : $logfile \n";
+
+open(LOGFILE,">$logfile");
+
+# no buffer for the print command on the logfile and on stdout
+
+select(LOGFILE);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+# dir for the tfm font
+if (($opt_tfm) || ($opt_t))
+ {
+ $testmkdir = mkdir("/tmp/tfmtest.$pid",0777);
+ if (! $testmkdir) {
+ print "Cannot mkdir /tmp/tfmtest.$pid\n";
+ }
+ $currentpwd = `pwd`;
+ chdir("/tmp/tfmtest.$pid");
+ }
+
+# test if -dir or --dir option for the pk font directories
+
+$numberofdir=@dir;
+
+# if no -dir use kpsewhich to find the font directories
+
+if ( $numberofdir == 0 )
+ {
+ $vartexfonts=`kpsewhich -expand-var '\$VARTEXFONTS'`;
+ $texmf=`kpsewhich -expand-var '\$TEXMF'`;
+ $texmf =~ s/[{}!! \n]//g;
+ @dir_list = split(/,/,$texmf);
+ @new_dir_list = ();
+
+ # add strings /fonts/pk to $TEXMF
+
+ foreach $path (@dir_list)
+ {
+ if (($opt_tfm) || ($opt_t))
+ {
+ $path = $path . "/fonts/tfm";
+ } else
+ {
+ $path = $path . "/fonts/tk";
+ }
+ @new_dir_list = (@new_dir_list,$path);
+ }
+ # add /pk to $vartexfonts
+ chop($vartexfonts);
+ $ext=pk;
+ if (($opt_tfm) || ($opt_t)) {
+ $ext=tfm;
+ }
+ @new_dir_list = ("$vartexfonts/$ext",@new_dir_list);
+ }
+else
+ {
+ @new_dir_list = @dir;
+ }
+
+# main loop
+foreach $path (@new_dir_list)
+ {
+ $dir = $path;
+ print "\nDirectory: $dir\n";
+ print LOGFILE "\n\nDirectory: $dir\n\n";
+ $numberfont = 0;
+ $notfm = 0;
+ $mismatch = 0;
+ $nodelete = 0;
+ $nbdifftfm = 0;
+ $mfnotfound = 0;
+ $newtfmnotok = 0;
+ # number of file
+
+ open(LISTE,"du -a $dir|");
+ # loop for each file or directory of du
+ while (<LISTE>)
+ {
+ # use only ligne with .pk at the end
+ if (($opt_tfm) || ($opt_t))
+ {
+ if (/\.tfm$/)
+ {
+ $tab[$numberfont]=$_;
+ $numberfont = $numberfont + 1;
+ }
+ }
+ else {
+ if (/\..*pk$/)
+ {
+ $tab[$numberfont]=$_;
+ $numberfont = $numberfont + 1;
+ }
+ }
+ }
+
+ print "Number of files: $numberfont \n";
+
+ # inc to use for the display of %
+
+ $inc = $numberfont / 100;
+ $incint= int($inc) + 1;
+
+ $i=0;
+ $j=0;
+ $val = 0;
+ print " 0% ";
+
+ for ($indice=0; $indice < $numberfont ; $indice++)
+ {
+ $longname=$tab[$indice];
+ ($block,$filename) = split(/\t/,$longname);
+
+ # work only with the file *.pk or *.tfm
+ $tfm_test = (($opt_tfm) || ($opt_t));
+
+ if (((! $tfm_test) && ($filename =~ /\..*pk$/)) || (($tfm_test) && ($filename =~ /\.tfm$/)))
+ {
+ $i = $i + 1;
+ $res = $i % $incint;
+ # need to display the % ?
+ if (! $res)
+ {
+ $j= $j + 1;
+ $val = $j;
+ if (($val > 9) && ! (($val) % 10))
+ {
+ print "\n";
+ }
+ if ($val < 10)
+ {print " $val% ";}
+ else{
+ print "$val% ";
+ }
+ }
+
+ if ($tfm_test)
+ {
+
+ &chk_font_tfm($filename);
+
+ } else
+ {
+ $dpi="";
+ $shortnamepk="";
+ $fontname="";
+
+ @field=split(/\//,$filename);
+
+ $numberfield=@field;
+ # name of printer
+ $previous="";
+ foreach $n (reverse @field) {
+ if ($n eq pk) {
+ $printer=$previous;
+ }
+ $previous=$n;
+ }
+ # try to find dpi
+ $shortnamepk = $field[$numberfield - 1];
+ split(/\//,$filename);
+ chop($shortnamepk);
+ ($fontname,$dpi)=split(/\./,$shortnamepk);
+ $dpi =~ s/pk//;
+
+ if (! $dpi)
+ {
+ @dir=split(/\//,$longname);
+ $number = @dir;
+ $number = $number - 2;
+ $dpi=$dir[$number];
+ $dpi =~ s/dpi//;
+ }
+ # now check each font
+ if ($dpi)
+ {
+ &chk_font_pk($shortnamepk,$fontname);
+ }
+ }
+ }
+
+ }
+ # display the last %
+ for ($inc = $val + 1 ; $inc < 100; $inc++) {
+ if (($inc > 9) && ! (($inc) % 10))
+ {
+ print "\n";
+ }
+ if ($inc < 10)
+ {
+ print " $inc% ";
+ }
+ else
+ {
+ print "$inc% ";
+ }
+ }
+ # result of the check
+ print "100%\n";
+ if ($tfm_test)
+ {
+ print "\n---> TFM font that differ: $nbdifftfm - MF file not found: $mfnotfound - TFM not generated: $newtfmnotok\n";
+ print LOGFILE "\n---> TFM font that differ: $nbdifftfm - MF file not found: $mfnotfound - TFM not generated: $newtfmnotok\n";
+ } else {
+ print "\n---> TFM font not found: $notfm - Checksum mismatch: $mismatch";
+ print LOGFILE "\n---> TFM font not found: $notfm - checksum mismatch: $mismatch";
+ if ($nodelete)
+ {
+ print " - Impossible delete: $nodelete\n";
+ print LOGFILE " - Impossible delete: $nodelete\n";
+ } else
+ {
+ print LOGFILE "\n";
+ print "\n";
+ }
+ }
+ }
+
+chdir("$currentpwd");
+print "\n";
+print "Logfile: $logfile \n";
+print LOGFILE "\n";
+print "\n";
+
+#-----------------------------------------------------------------------
+# chk_font_pk - test the Checksum of the pk and tfm files
+#
+#-----------------------------------------------------------------------
+
+sub chk_font_pk
+ {
+
+ local($fontpk,$fonttfm);
+
+ ($fontpk,$fonttfm) = @_;
+
+ $chk_pk = `pktype $fontpk 2>/dev/null | grep Checksum`;
+ $chk_tfm = `tftopl $fonttfm 2>/dev/null | grep CHECKSUM`;
+
+ $_ = $chk_pk;
+ /^Checksum = (.*)/;
+ $chk_pk = sprintf("0%lo", $1);
+
+ $_ = $chk_tfm;
+ /^[^\d]*(\d*).*/;
+ $chk_tfm = sprintf("0%s", $1);
+
+ if ($chk_pk != $chk_tfm) {
+ if ($chk_tfm == 0)
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "TFM file doesn't exist: $fonttfm.tfm\n";
+ }
+ print LOGFILE "TFM file doesn't exist: $fonttfm.tfm \n";
+ $notfm = $notfm + 1 ;
+ }
+ else
+ {
+ $bdpi=600;
+ if (($opt_d == 1) || ($opt_del == 1))
+ {
+ chop($filename);
+ $testrm=unlink($filename);
+ if ($testrm)
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "Delete file: $filename \n";
+ }
+ print LOGFILE "Delete file: $filename\n";
+ $result=`mktexpk --mfmode $printer --bdpi $bdpi --mag ${dpi}/${bdpi} --dpi $dpi $fonttfm 2>&1`;
+ (($opt_v == 1) || ($opt_verbose == 1)) and print "$result\n";
+ print LOGFILE "$result\n";
+ } else
+ {
+ print LOGFILE "Impossible delete: $filename \n";
+ $nodelete = $nodelete + 1;
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "Impossible delete: : $filename \n";
+ }
+ }
+ }
+ else
+ {
+ $longfonttfm=`kpsewhich $fonttfm.tfm`;
+ chop($longfonttfm);
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "Cheksum missmatch: $shortnamepk and $longfonttfm \n";
+ }
+ chop($filename);
+ print LOGFILE "Cheksum missmatch: $filename and $longfonttfm \n";
+ }
+ $mismatch = $mismatch + 1;
+ }
+
+ }
+ }
+
+#-----------------------------------------------------------------------
+# chk_font_tfm - test the Checksum of the mf and tfm files
+#
+#-----------------------------------------------------------------------
+
+sub chk_font_tfm
+ {
+
+ local($fonttfm);
+ ($fonttfm) = @_;
+ @field=split(/\//,$fonttfm);
+ $numberfield = @field;
+ $shortnametfm = $field[$numberfield - 1];
+ ($name,$extfile) = split(/\./,$shortnametfm);
+
+ $testkpse = system("kpsewhich $name.mf >/dev/null 2>&1");
+ if (! $testkpse)
+ {
+ $resulttfm=`mf '\\mode=localfont;input $name' -interaction=nonstopmode 2>&1`;
+ if (-f "/tmp/tfmtest.$pid/$name.tfm")
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ #print "$resulttfm\n";
+ }
+ #print LOGFILE "$resulttfm\n";
+ chop($shortnametfm);
+ $usename = "/tmp/tfmtest." . $pid . "/" . $shortnametfm;
+ #$testdiff=system("cmp -s $usename $fonttfm");;
+
+ if ($testdiff)
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "TFM file differ: $shortnametfm\n";
+ }
+
+ print LOGFILE "TFM file differ: $fonttfm";
+ $nbdifftfm = $nbdifftfm + 1;
+ }
+ unlink("/tmp/tfmtest.$pid/$name.tfm");
+ unlink("/tmp/tfmtest.$pid/$name.log");
+ unlink("/tmp/tfmtest.$pid/$name.600gf");
+ }
+ else
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "TFM file not generated: $name.tfm\n";
+ }
+ print LOGFILE "TFM file not generated: $name.tfm\n";
+ $newtfmnotok = $newtmfnotok + 1;
+ unlink("/tmp/tfmtest.$pid/$name.log");
+ unlink("/tmp/tfmtest.$pid/$name.600gf");
+ }
+ }
+ else
+ {
+ if (($opt_v == 1) || ($opt_verbose == 1))
+ {
+ print "MF file not found: $name.mf\n";
+ }
+ print LOGFILE "MF file not found: $name.mf\n";
+ $mfnotfound = $mfnotfound + 1;
+ }
+ }
diff --git a/fonts/utilities/ttf2mf/notes.txt b/fonts/utilities/ttf2mf/notes.txt
new file mode 100644
index 0000000000..6e48ccc969
--- /dev/null
+++ b/fonts/utilities/ttf2mf/notes.txt
@@ -0,0 +1,15 @@
+ TTF2MF obtains information on True Type fonts by using Windows GDI
+functions (GetGlyphOutLine etc.). That is why the program works with
+installed fonts instead of .ttf files.
+
+ The conversion by TTF2MF does not take into account the so-called
+hinting which is an important property of True Type fonts. For more
+information on True Type format and True Type tools look at
+http://www.truetype.demon.co.uk
+http://www.freetype.org
+
+The sources of the program are free available on quest.
+
+Good luck
+
+Oleg Motygin \ No newline at end of file
diff --git a/fonts/utilities/ttf2mf/readme b/fonts/utilities/ttf2mf/readme
new file mode 100644
index 0000000000..c95373f950
--- /dev/null
+++ b/fonts/utilities/ttf2mf/readme
@@ -0,0 +1,127 @@
+True Type 2 Meta Font Converter,
+ver. 0.02 (c) copyright 1998 by Oleg V. Motygin
+
+--------------------------------------------------------------------------
+
+Purpose of the program is to convert True Type Windows fonts to
+Meta Font format. The program also allows to define ligatures for
+dashes and quotes and to change code page of the font.
+
+--------------------------------------------------------------------------
+
+TTF2MF was tested under Window 3.11, Windows'95 and Windows NT.
+
+--------------------------------------------------------------------------
+
+Free usage and distribution for non-commercial users.
+
+Sources are freely available on quest.
+
+In the case the program helps you in your commercial projects
+(publishing etc.) so that you would like to support my work
+registering for $9, please contact me via email: mov@snark.ipme.ru
+
+--------------------------------------------------------------------------
+
+Version info:
+
+Changes since 0.01
+The program becomes more acurate in generating ligtables in the case
+of conflict between user-defined ligatures and designer's kerns.
+
+--------------------------------------------------------------------------
+
+Instructions:
+
+Start ttf2mf.exe. Click on 'Font' in the main menu and 'Choose' the font
+you would like to convert. Then, font table in working area will show the
+font in its original encoding. You can zoom the table of font using '-','+',
+'View->Zoom in', 'View->Zoom Out' or just resizing the window. If you are
+going to change encoding of the font, click on 'Encoding'. There you can
+'Change the encoding' or to look at the help in 'About enc. file'.
+The True Type fonts do not contain ligatures. So, if you would like the
+resulting MF file to define ligatures for dashes and/or for quotes, choose
+'Ligatures' in the main menu. In the dialog you can read 'Help', 'Default'
+button will fill the field with TeX usual values for dashes and quotes
+positions. After you define the ligatures, corresponding symbols will be
+marked with green in the font table.
+Finally, 'Font->Convert' performs the conversion.
+
+------------------------------------------------------------------------
+
+What in the resulting MF file may need correcting?
+1. font_x_height
+2. font_normal_space
+3. font_normal_stretch
+4. font_normal_shrink
+
+-------------------------------------------------------------------------
+
+Encoding of the font:
+
+An example of encoding file is given as 1251_866.enc.
+A line of encoding file has the following format:
+m [.. n] t
+This means that symbols with numbers from m to n in the destination
+MF file will be taken from position t in the TTF file. If t is equal
+to -1 the corresponding symbols should be omitted.
+E.g. an enc file can look as follows
+'120 32
+'130..'137 112
+'132 -1
+Note that the order of two last lines is important and that both octal
+and decimal notations for symbol position are allowable.
+After you choose new encoding, the font table on the screen should change.
+
+-------------------------------------------------------------------------
+
+Using the fonts in TeX:
+
+When you have already converted a font in a set of sizes: myfont8.mf,
+myfont10.mf ..., to incorporate this set to a TeX text you need .tfm
+and .pk files. They can be produced, e.g. by invoking to mfjob myfont.mfj,
+where myfont.mfj is
+
+input [modes];
+def s=[s0]; % Unless changed on command line
+{
+base=plain;
+fonts=myfont#;
+mags=s; m;
+}
+
+-------------------------------------------------------------------------
+
+How does it work:
+
+ TTF2MF obtains information on True Type fonts by using Windows GDI
+functions (GetGlyphOutLine etc.). That is why the program works with
+installed fonts instead of .ttf files.
+
+What doesn't work:
+
+ The conversion by TTF2MF does not take into account the so-called
+hinting which is an important property of True Type fonts. For more
+information on True Type format and True Type tools look at
+http://www.truetype.demon.co.uk
+http://www.freetype.org
+
+-------------------------------------------------------------------------
+
+Wishes:
+
+Many of free TTF fonts I see are ugly enough. Please, don't put this trash
+to CTAN. I trust your taste.
+
+I would be very grateful for suggestions, comments and information on bugs.
+Please contact me via email mov@snark.ipme.ru
+
+--------------------------------------------------------------------------
+
+Thanks:
+
+My sincere thanks to Drahoslav Lim and To Tanh Binh for information on
+features of the program and suggestions for further development.
+
+
+Oleg Motygin
diff --git a/fonts/utilities/ttf2pfb/README.ttf2pfb b/fonts/utilities/ttf2pfb/README.ttf2pfb
new file mode 100644
index 0000000000..0d8667a6d2
--- /dev/null
+++ b/fonts/utilities/ttf2pfb/README.ttf2pfb
@@ -0,0 +1,7 @@
+ttf2pfb.exe and t1asm.exe are binaries for MS-DOS and OS/2 compiled with
+emx 0.9c -- they will work under Windows too.
+
+In addition, you'll need the emxrsx.zip runtime library package from emTeX,
+available from CTAN (i.e., ftp.dante.de, ftp.tex.ac.uk, ctan.tug.org, and
+its mirrors; say `finger ctan@ftp.dante.de' to get a full list of mirrors)
+in the directory pub/tex/systems/msdos/emtex.
diff --git a/fonts/utilities/ttf2pt1/CHANGES.html b/fonts/utilities/ttf2pt1/CHANGES.html
new file mode 100644
index 0000000000..d60d14ba6d
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/CHANGES.html
@@ -0,0 +1,588 @@
+<HTML>
+<HEAD>
+<TITLE>
+TTF2PT1 - CHANGES history
+</TITLE>
+</HEAD>
+<BODY>
+<H2>
+TTF2PT1 - CHANGES history
+</H2>
+
+<!
+(Do not edit this file, it is generated from CHANGES.html!!!)
+>
+
+<H4>
+3.3.2 -- November 20, 2000
+</H4>
+<!
+-------
+>
+
+<b>New features:</b>
+<ul>
+<li> Added generation of man pages.
+<li> Added "make install" and "make uninstall".
+<li> Added language option "-l plane".
+<li> In <tt>other/showg</tt> added better support of comparison files:
+<ul>
+ <li> printing of the comparison file legend;
+ <li> guessing of missing glyph names in a comparison file by code;
+ <li> bounding boxes of all comparison files are used for page layout.
+</ul>
+<li> Added ability to use external t1asm instead of compiling it in.
+<li> Renamed the fonts installation guide from INSTALL*html to FONTS*html
+ to avoid confusion with installation of ttf2pt1 itself.
+</ul>
+
+<b>Bug fixes:</b>
+<ul>
+<li> Removed erroneous extra fclose(pfa_file).
+<li> Fixed random memory corruption that manifested with crash on Linux
+ when converting fonts not containing glyph names.
+<li> Removed from the output file the comments that confused dvips. Changed
+ <tt>other/showg</tt> to work without them.
+<li> In <tt>other/showg</tt> added better checks for missing glyphs, now it
+ gives warnings about them and the output file does not crash PostScript.
+</ul>
+
+<b>Other:</b>
+<ul>
+<li> <tt>ttf2pfa</tt> is no longer included, people interested in history
+ should look for it in the older versions.
+</ul>
+
+<H4>
+3.3.1 -- October 22, 2000
+</H4>
+<!
+-------------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added front-end parser based on the FreeType-2 library. See Makefile
+for build instructions.
+<li> Changed the handling of encodings to accomodate the FreeType model.
+<li> Further cleaned up the front-end parser interface.
+</ul>
+
+<b>Bug fixes:</b>
+<ul>
+<li> Fixed a bug that caused core dump on Alpha machines.
+<li> Fixed a bug in the outline smoothing that occasionally caused core dump.
+<li> Cleaned up warnings from picky compilers
+<li> Fixed more bugs in the Windows port (by Stefan Bauer).
+<li> Fixed the RPM spec file (suggested by Brian Armstrong).
+</ul>
+<p>
+
+<H4>
+3.3.0 -- September 22, 2000
+</H4>
+<!
+---------------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Converted most of the outlines' processing to floating point
+arithmetic.
+<li> Added splitting of curves crossing the quadrant boundaries (no gross
+damage is done any more to the Marvosym font and others like it).
+<li> Added modular interface for front-end font parsers and option to control
+their selection at run time.
+<li> Grouped the outline processing control options into one to reduce the
+options namespace pollution.
+<li> Thomas moved the Chinese maps into a separate module, chinese-maps.
+<li> Thomas added option -V to print version number. In addition, the version
+number is put in the header of the font file.
+<li> Added long option names (suggested by Thomas).
+<li> Added support for multi-level composite glyphs.
+<li> TH: Made &lt;fontname&gt; command-line argument optional; default to &lt;ttf-file&gt;
+with suffix replaced.
+<li> In <tt>other/showg</tt> added more ways to specify glyphs and the comparison option.
+</ul>
+
+<b>Bug fixes:</b>
+<ul>
+<li> Fixed the VC++ batch file, added batch file for Cygnus GCC on Windows.
+<li> Removed parentheses from the Version string in AFM files because it does
+not help StarOffice anyway. StarOffice 5.2 has been reported to have this
+bug fixed. Added paragraph on StarOffice in FONTS.html.
+<li> Made messages on the '?' option parameter more meaningful (by Johan Vromans).
+<li> Changed the latin1 encoding table to include the Euro sign, Z and z with
+caron (by Thomas Henlich).
+<li> Improved the smoothing code which occasionally had problems with
+joining curves. Also fixed a few minor bugs in it.
+</ul>
+
+<H4>
+3.22 -- May 23, 2000
+</H4>
+<!
+--------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Included windows support by Frank Siegert (somewhat amended)
+<li> Added control over verbosity of warnings.
+<li> Added arguments and initialization functions to the language
+translation routines.
+<li> Added support of planes determined by arguments to the external
+maps.
+<li> Added compact external maps format (primarily for Eastern fonts).
+<li> Added external maps for Chinese GBK and Big5 encodings (converted
+from ttf2pfb) as well as maps for other Chinese encodings by Wang Lei.
+<li> Added the idea of buckets to speed up the search in external maps.
+<li> Changed the grouping algorithm for substituted hints: now it creates
+a bit bigger files but requires smaller hint stack when being rendered.
+<li> Added maximal limit of hint stack depth, glyphs requiring bigger
+stack get generation of substituted hints disabled. This makes substituted
+hints safe to use, no more lost glyphs due to hint stack overflow.
+<li> Added the font dump program <tt>other/dumpf</tt>.
+<li> Changed the testing HTML generator <tt>other/lst.pl</tt> to use tables.
+<li> Added debugging script <tt>other/cntstems.pl</tt> to count required hint
+stack depth for the glyphs.
+</ul>
+
+<b>Bug fixes:</b>
+<ul>
+<li> Fixed printing of UID in script/trans. Changed the auto-generated UID to
+be in range 4000000-4999999 which is reserved by Adobe for private use.
+<li> Fixed handling of "cleartomark" in built-in t1asm.
+<li> Added handling of "can't happen" case in straighten() routine
+which actually happened on strange fonts and caused failure on assertion.
+<li> Made it always include the glyph .notdef in the resulting font.
+<li> Placed the version string in AFM file in parentheses, hopefully
+that would fix the problem with StarOffice.
+<li> Improved the smoothing code which occasionally had problems with
+joining curves.
+</ul>
+
+<H4>
+3.21 -- March 1, 2000
+</H4>
+<!
+---------------------
+>
+
+Sergey Babkin: committed the changes by Petr Titera and
+my bugfixes.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> New Unicode map format with glyph names, by Petr Titera.
+<li> Option to force the Unicode encoding by Petr Titera
+ (I changed it to work on any MS encoding, not only Symbol).
+<li> Slightly tweaked the calculation of hints, should be better now.
+</ul>
+
+<b>Bug fixes:</b>
+<ul>
+<li> The unicode-sample.map with description of the map formats
+ was lost in the release process, restored and enhanced.
+<li> Renamed the table ISOLatin1Encoding to Fmt3Encoding to reflect
+ the way it is used. Saved the original one for reference
+ purposes. In the new table renamed "quoteright" to "quotesingle"
+ as Thomas Henlich suggested (and he were right).
+<li> In the ISOLatinEncoding table renamed the glyph "grave"
+ at octal 0140 to "quoteleft", "quotesingle" at octal 047 to
+ "quoteright" to conform to the standard as suggested by
+ Martin Trautner).
+<li> Fixed bug in scripts/trans that corrupted the UniqueID record
+ in the translated fonts.
+<li> Fixed bug in interaction of substituted hints with BlueZones.
+ Now the fonts with hint substitution seem to be always at least
+ not worse than without it (well, when they fit in the X11
+ file size limit).
+</ul>
+
+
+<H4>
+3.2 -- January 15, 2000
+</H4>
+<!
+-----------------------
+>
+
+Sergey Babkin: combined my changes with the changes by
+Thomas Henlich. The result deserves a not-so-minor version
+increase.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Support of the external Unicode re-encoding maps
+ (by Thomas).
+<li> Support for inclusion of all the glyphs from the
+ source file into the resulting file (inspired by
+ Thomas but I re-implemented it to remove the limitation
+ of his implementation: not more than 1024 glyphs).
+<li> The hints substitution. It's an experimental feature
+ yet and needs further work.
+<li> Support for UniqueID and its auto-generation.
+<li> Support for the name-based conversions from Unicode
+ in general and the adobestd "language" in particular.
+<li> Started the split of the source code into multiple
+ files. This needs more work to do it in a cleaner
+ way.
+<li> Better framework for the debugging printout
+ in the converter.
+<li> Utilities to install the fonts in Netscape
+ Navigator/Communicator 4.x.
+<li> Patches for bigger font files in the X11 rasterizer.
+<li> Linux RPM spec-file (by Johan Vromans).
+<li> Added the COPYRIGHT file (BSD-style, as we discussed
+ on the mailing list earlier) and the CHANGES file.
+<li> Creation of the <tt>.pfb</tt> files from the <tt>convert</tt>
+ script.
+<li> Changed the <tt>.notdef</tt>-s in the built-in
+ ISOLatin1Encoding table to some valid names (by Thomas).
+ Thomas also suggested replacing `<tt>quoteright</tt>' by
+ `<tt>quotesingle</tt>' but this seems to be against the
+ Adobe ISOLatin1 table.
+<li> New aliases <tt>windows-1251</tt> and <tt>cp-866</tt> for
+ the Russian encodings: those are expected by Netscape
+ navigator.
+<li> The font comparison program <tt>other/cmpf</tt>.
+<li> The "magnifying glass" program for glyph outlines:
+ <tt>other/showg</tt>.
+<li> Other updates of the tools in the `<tt>other</tt>' subdirectory.
+<li> Added a link to T1LIB in README.
+<li> A few new options in <tt>convert.cfg</tt>.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> A bug in the outline smoothing code that corrupted some
+ of the fonts (for example, Microsoft Verdana).
+<li> Added explicit `<tt>cleartomark</tt>' to the end of file,
+ this seems to be compatible with both old and new version
+ of <tt>t1asm</tt> (suggested by Thomas).
+<li> Added the <tt>FontEncoding</tt> statement to the AFM files
+ (techincally this was not a bug because this statement
+ is optional but some programs want it).
+<li> A coredump when the converter tried to print a warning
+ (rather ironically) about a weird glyph width.
+<li> Changed the underscores in the font names to dashes (this
+ has been proposed long time ago by Johan Vromans).
+<li> No more glyph names of font names staring with a digit.
+<li> The names of the fonts in font and AFM files are now the
+ same as in the generated Ghostscript <tt>Fontmap</tt> file.<br>
+ <b>Warning:</b> the names in <tt>Fontmap</tt> have been
+ changed.
+<li> The <tt>forceiso</tt> script does not corrupt the character
+ and kerning pairs counts any more, and is optional at all.
+<li> Fix for a loop going to 254 instead of 255 (by Thomas).
+<li> Added ':' in the font header (by Thomas).
+<li> A coredump when wrong language name is given (this was
+ also fixed by Thomas but I noticed it too late, after
+ I already fixed it by myself).
+<li> Fixed the links to the Adobe documents in README.
+</ul>
+
+
+<H4>
+3.13 -- October 18, 1999
+</H4>
+<!
+------------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> New option -v for automatic re-scaling based on the vertical size of the font
+<li> Changed the code to use getopt() instead of a home-made version of it.
+<li> Latin2 language support by Szalay Tamas.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> Fix for the bug that made possible calls of malloc(0).
+<li> Refinement of the option -w to prevent extra wide spacing
+</ul>
+
+<H4>
+3.12 -- October 2, 1999
+</H4>
+<!
+-----------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added support for the Bulgarian language (actually, for now just an alias
+of Russian).
+<li> Added option -w that tries to make sure that the character widths are not
+too narrow.
+<li> Added the concept of aliased encodings.
+<li> Now the conversion scripts create and install the .afm files too.
+<li> The conversion script removes the intermediate files after installation.
+<li> Added tunables to the conversion script.
+<li> Installation of the Ghostscript fonts can now be done automatically
+together with the X11 fonts.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> (FINALLY!!!) A correct fix for the infamous Red Hat 6.0 stdio "feature".
+<li> A number of little bugs discovered by a picky SGI compiler (well, maybe
+some day I'll try to run it through the UnixWare lint and see what happens).
+<li> A diagnostic message about the empty encodings in the convert script was
+made less cryptic and a bug in the awk sub-script was fixed.
+<li> The .afm creation code now considers the option -t.
+</ul>
+
+<H4>
+3.11 -- May 24, 1999
+</H4>
+<!
+--------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> It includes the Turkish (Latin5, ISO8859/9)
+language support by Turgut Uyar and Baltic (ISO8859/4) languages support by
+Rihardas Hepas.
+<li> Also the installation script got updated: the configuration parameters
+are moved to a separate file and the generated fonts.dir files should now be
+compatible with Xfsft.
+</ul>
+
+<H4>
+3.1 -- March 28, 1999
+</H4>
+<!
+---------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Improved the interaction of the character-level hints and font-level hints
+</ul>
+
+
+<H4>
+3.0 -- March 6, 1999
+</H4>
+<!
+--------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added HTML documents.
+</ul>
+
+<H4>
+3.0beta2 -- February 14, 1999
+</H4>
+<!
+-----------------------------
+>
+
+Packaged by Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added ability to print the .afm file instead of the font to STDOUT.
+<li> Added the guessing of the /ForceBold parameter that proved to be useful.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> Removed the force-fixed option that proved to be troublesome.
+</ul>
+
+<H4>
+3.0beta1 -- December 11, 1998
+</H4>
+<!
+-----------------------------
+>
+
+By Andrew Weeks.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added option (passed to t1asm) to create a compressed binary
+version of the font (A PFB file).
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> Versions of handle_post and handle_cmap that deal with some
+problems with buggy fonts.
+<li> Minor Bug Fixes.
+</ul>
+
+<H4>
+3.0beta-afm -- December 5, 1998
+</H4>
+<!
+-------------------------------
+>
+
+By Thomas Henlich.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Integration of AFM file creation.
+</ul>
+
+<H4>
+3.0beta -- November 15, 1998
+</H4>
+<!
+----------------------------
+>
+
+By Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Added the auto-calculation of the italic angle.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> Fixed a couple of bugs.
+</ul>
+
+<H4>
+3.0alpha -- October 19, 1998
+</H4>
+<!
+----------------------------
+>
+
+By Sergey Babkin.
+<p>
+
+<b>New features:</b>
+<ul>
+<li> Improved (although still not perfect) handling of
+scaling in composite glyphs
+<li> Automatic correction of outlines to make them more
+smooth (to correct both rounding errors introduced
+during conversion and present in the original font)
+<li> Automatic generation of hints (still has lots of
+space for improvement)
+<li> Automatic generation of BlueValues etc.
+</ul>
+
+<b>Bux fixes:</b>
+<ul>
+<li> Scaling of fonts to 1000x1000 M-square required by
+Type1 standard
+<li> Printing out the contours in reverse direction, because
+TTF directions are different from Type1 ones (that was
+the major reason why the fonts generated by
+version 2.2 were rendered so badly in small sizes)
+</ul>
+
+<H4>
+June 22, 1998 (AKA 2.2)
+</H4>
+<!
+-------------
+>
+
+By Thomas Henlich.
+<p>
+
+<b>Bux fixes:</b>
+<ul>
+<li> "width" should be "short int" because otherwise:
+characters with negative widths (e.g. -4) become *very* wide (65532)
+<li> The number of /CharStrings is numglyphs and not numglyphs+1
+</ul>
+
+<H4>
+February 13, 1998
+</H4>
+<!
+-----------------
+>
+
+By Mark Heath.
+<p>
+
+<b>Bux fixes:</b>
+<ul>
+<li> An original Bug Reported by Frank, which was just incorrect syntax in the
+Type 1 header, managed to creep back into the Feb 04 Version. This has been
+Fixed in the Feb 13 Version.
+</ul>
+
+<H4>
+February 4, 1998
+</H4>
+<!
+----------------
+>
+
+By Mark Heath.
+<p>
+
+<b>Bux fixes:</b>
+<ul>
+<li> A workaround was implemented in ttf2pfa by altering the matrix. I suspect
+I will have to calculate the correct values, as matrix ops are probably not
+allowed in Type 1 format.
+</ul>
+
+<!
+---------------------------------------------
+>
+<H4>
+The older history seems to be lost.
+</H4>
+
+<I>
+(S.B.: The story how we got the version numbers is rather funny. Initially
+there were no version umbers, the releases were marked by dates. The version
+from June 22 1998 untarred itself into a directory "<tt>ttf2pt1-22</tt>". When I
+made my changes to it I assumed that this was the version number meaning
+version 2.2. Since Mark asked me to send him a complete archive I supposed
+that I have to bump the version number. And I bumped it to 3.0 because the
+changes were rather extensive. Mark silently agreed and released the new
+version as 3.0. And that's the end of the story about how we got this
+Microsoft-like high version number.)
+</I>
+
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/COPYRIGHT b/fonts/utilities/ttf2pt1/COPYRIGHT
new file mode 100644
index 0000000000..2eb23a0158
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/COPYRIGHT
@@ -0,0 +1,77 @@
+The following copyright notice applies to all the files provided
+in this distribution unless explicitly noted otherwise
+(the most notable exception being t1asm.c).
+
+ Copyright (c) 1997-2000 by the AUTHORS:
+ Andrew Weeks <ccsaw@bath.ac.uk>
+ Frank M. Siegert <fms@this.net>
+ Mark Heath <mheath@netspace.net.au>
+ Thomas Henlich <thenlich@rcs.urz.tu-dresden.de>
+ Sergey Babkin <babkin@bellatlantic.net>, <sab123@hotmail.com>
+ Turgut Uyar <uyar@cs.itu.edu.tr>
+ Rihardas Hepas <rch@WriteMe.Com>
+ Szalay Tamas <tomek@elender.hu>
+ Johan Vromans <jvromans@squirrel.nl>
+ Petr Titera <P.Titera@sh.cvut.cz>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by the TTF2PT1 Project
+ and its contributors.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+For the approximate list of the AUTHORS' responsibilities see the
+project history.
+
+Other contributions to the project are:
+
+Turgut Uyar <uyar@cs.itu.edu.tr>
+ The Unicode translation table for the Turkish language.
+
+Rihardas Hepas <rch@WriteMe.Com>
+ The Unicode translation table for the Baltic languages.
+
+Szalay Tamas <tomek@elender.hu>
+ The Unicode translation table for the Central European languages.
+
+Johan Vromans <jvromans@squirrel.nl>
+ The RPM file.
+
+Petr Titera <P.Titera@sh.cvut.cz>
+ The Unicode map format with names, the forced Unicode option.
+
+Frank M. Siegert <frank@this.net>
+ Port to Windows
+
+Lei Wang <lwang@amath8.amt.ac.cn>
+Chen Xiangyang <chenxy@sun.ihep.ac.cn>
+ Translation maps for Chinese fonts.
+
+I. Lee Hetherington <ilh@lcs.mit.edu>
+ The Type1 assembler (from the package 't1utils'), its full copyright
+ notice:
+ Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ Permission is hereby granted to use, modify, and distribute this program
+ for any purpose provided this copyright notice and the one below remain
+ intact.
+
diff --git a/fonts/utilities/ttf2pt1/FONTS.hpux.html b/fonts/utilities/ttf2pt1/FONTS.hpux.html
new file mode 100644
index 0000000000..80889cae2b
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/FONTS.hpux.html
@@ -0,0 +1,197 @@
+<HTML>
+<HEAD>
+<TITLE>
+How to install new Type1 fonts on an HP-UX 10.20 machine
+</TITLE>
+</HEAD>
+<BODY>
+Sergey A. Babkin
+<br>
+<A HREF="mailto:babkin@bellatlantic.net">
+&lt;babkin@bellatlantic.net&gt;</A> or <A HREF="mailto:sab123@hotmail.com">&lt;sab123@hotmail.com&gt;</A>
+<p>
+<!
+(Do not edit this file, it is generated from FONTS.hpux.html!!!)
+>
+
+<H3>
+How to install new Type1 fonts on an HP-UX 10.20 machine
+</H3>
+<!
+--------------------------------------------------------
+>
+
+1. Add the font files to <tt>/usr/lib/X11/fonts/type1.st/typefaces</tt>.
+<p>
+
+2. Add the font descriptions to
+<tt>/usr/lib/X11/fonts/type1.st/typefaces/fonts.scale</tt>. Run `mkfontdir'
+in <tt>/usr/lib/X11/fonts/type1.st/typefaces</tt>. In the descriptions
+you have to specify the font manufacturer as `misc', like:
+<p>
+
+<tt>
+&nbsp;&nbsp;-misc-courier-...
+</tt>
+<p>
+
+3. Copy <tt>/usr/lib/X11/fonts/type1.st/typefaces/fonts.dir</tt> to
+<tt>/usr/lib/X11/fonts/type1.st/licenses/STSYSTEM/DISPLAYS/fonts.dir</tt>.
+Better yet, create a symbolic link.
+<p>
+
+4. For each font encoding you are going to use create a description
+file in <tt>/usr/lib/X11/fonts/stadmin/type1/charsets</tt>. Of course, if you
+are going to use the same fonts in several encodings, the best way
+would be to create fair descriptions of charsets and really store
+only one encoding in typefaces, all the others will be produced
+automatically. That's not difficult at all.
+But the simplest way is to just copy the file <tt>cp.iso8859-1</tt>
+to <tt>cp.<i>&lt;your-encoding-name&gt;</i></tt>, like <tt>cp.koi8-r</tt>.
+<p>
+
+5. Restart you X server and/or font server.
+<p>
+
+<H4>
+What if you don't have the `root' privileges ?
+</H4>
+<!
+----------------------------------------------
+>
+
+You still can run the font server and configure your X server
+to get the fonts from it.
+<p>
+
+Further let's suppose that the name on which you are going
+to run the font server is named `somehost'. Login to it
+and configure the font server.
+<p>
+
+First, choose some unused port. Numbers around 9000 are a good
+choice. Verify that this port is not used by somebody else
+by entering
+<p>
+
+<blockquote><tt>
+ netstat -naf inet |grep 9000
+</tt></blockquote>
+
+and look what happens. If you get nothing, that's good, this
+port is unused. If you get some lines of data, try abother port.
+<p>
+
+Go to you home directory <tt>$HOME</tt> and create some directory for
+your font server, say, <tt>$HOME/fs</tt>. Copy the directory structure
+of <tt>/usr/lib/X11/fonts/type1.st</tt> into <tt>$HOME/fs</tt>, so that in result
+you get <tt>$HOME/fs/type1.st/<i>&lt;whatever was there&gt;</i></tt>. Copy the directory
+structure of <tt>/usr/lib/X11/fonts/stadmin/type1/charsets</tt> into <tt>$HOME/fs</tt>,
+so that in result you get <tt>$HOME/fs/charsets/<i>&lt;whatever was there&gt;</i></tt>.
+Install the new fonts in these directorues as described above.
+<p>
+
+Then create the fontserver configuration file, say, <tt>$HOME/fs/xfs.cfg</tt>.
+The sample contents (supposing that my <tt>$HOME</tt> is equal to <tt>/home/babkin</tt>)
+is:
+<p>
+
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<hr>
+<tt>
+# font server configuration file
+<br>
+# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $
+<br>
+
+<br>
+rasterizers = /usr/lib/X11/fs/ufstrast.sl,/usr/lib/X11/fs/iforast.sl
+<br>
+
+<br>
+clone-self = off
+<br>
+use-syslog = off
+<br>
+catalogue = /home/babkin/fs/type1.st
+<br>
+# in decipoints
+<br>
+default-point-size = 120
+<br>
+default-resolutions = 100,100,75,75
+<br>
+port=9000
+<br>
+error-file=/home/babkin/fs/fs.err
+</tt>
+<hr>
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<p>
+
+Then create the script to start your font server, say, <tt>$HOME/fs/runme</tt>:
+<p>
+
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<hr>
+<tt>
+TYPE1_CODEPAGE_DIR=$HOME/fs/charsets
+<br>
+export TYPE1_CODEPAGE_DIR
+<br>
+kill `ps -ef | grep $HOME/\[f\]s/xfs.cfg | awk '{print $2}'`;
+<br>
+nohup xfs -config $HOME/fs/xfs.cfg &
+</tt>
+<hr>
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<p>
+
+Don't forget to make <tt>$HOME/fs/runme</tt> executable. Then you can
+execute it manually or from you .profile.
+<p>
+
+After you get your font server running, just execute the following
+command (with proper host name and port number) in your X session
+<p>
+
+<blockquote><tt>
+ xset fp+ tcp/somehost:9000
+</tt></blockquote>
+
+to get the access to your private font server. You can add this
+information to the configuration data of your X server or just
+put it also into your .profile. In the latter case the best way
+to do that would be like:
+<p>
+
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<hr>
+<tt>
+...
+<br>
+$HOME/fs/runme
+<br>
+sleep 2 # give it some time to start
+<br>
+xset fp+ tcp/somehost:9000
+<br>
+...
+</tt>
+<hr>
+<!
+--------------8&lt;----------- cut here -----------------------------
+>
+<p>
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/FONTS.html b/fonts/utilities/ttf2pt1/FONTS.html
new file mode 100644
index 0000000000..1f359ed0ff
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/FONTS.html
@@ -0,0 +1,669 @@
+<HTML>
+<HEAD>
+<TITLE>
+The ttf2pt1 font installation guide
+</TITLE>
+</HEAD>
+<BODY>
+Sergey A. Babkin
+<br>
+<A HREF="mailto:babkin@users.sourceforge.net">
+&lt;babkin@bellatlantic.net&gt;</A> or <A HREF="mailto:sab123@hotmail.com">&lt;sab123@hotmail.com&gt;</A>
+<p>
+<!
+(Do not edit this file, it is generated from FONTS.html!!!)
+>
+
+<!-- =defdoc cv ttf2pt1_convert 1 >
+<!-- =defdoc gs ttf2pt1_x2gs 1 >
+<H2>
+THE FONT INSTALLATION GUIDE
+<br>
+for the TTF to Type1 converter and fonts generated by it
+</H2>
+<!
+========================================================
+>
+
+There is historically a number of problems with the support of the 8-bit
+character encodings. This installation guide pays a lot of attention
+to the 8-bit issues, because these issues are responsible for the
+most of troubles during the installation of fonts. But they are
+not the only things covered in this guide, so it's worth reading
+even if all you need is plain ASCII. For convenience of reading
+I have marked the paragraphs dealing solely with 8-bit problems
+with characters <FONT COLOR="#3333FF"><FONT SIZE=-1>*8*</FONT></FONT>.
+<p>
+
+To simplify this installation the distribution package of the
+converter contains a number of scripts written in shell and
+Perl. So, to run them you will need a shell interpreter (Bourne-shell,
+POSIX-shell, Korn-shell are OK, ba-shell is probably also OK but not
+tested yet). The Perl scripts were tested with Perl5 but probably
+should work with Perl4 too. All the scripts are located in the
+`scripts' subdirectory.
+<p>
+
+This guide considers the following issues of installation of the
+fonts:
+<p>
+
+<b>
+<ul>
+<li> <A HREF="#X11">X11</A><br>
+<li> <A HREF="#gs">Ghostscript</A><br>
+<li> <A HREF="#win">MS Windows</A><br>
+<li> <A HREF="#netscape">Netscape Navigator/Communicator</A><br>
+<li> <A HREF="#rpm">Linux RPM package</A><br>
+<li> <A HREF="#framemaker">FrameMaker</A><br>
+<li> <A HREF="#soffice">StarOffice</A><br>
+</ul>
+</b><p>
+
+<A NAME="X11"></A>
+<H3>
+X11
+</H3>
+<!
+===
+>
+
+<!-- =section cv NAME >
+<!-- =text B&lt;ttf2pt1_convert&gt; - convenience font conversion script >
+<!-- =stop >
+To simplify the conversion a set of scripts is provided with <b>ttf2pt1</b>.
+They are collected in the `<TT>scripts</TT>' subdirectory.
+<p>
+
+<!-- =section cv DESCRIPTION >
+`<b>Convert</b>' is the master conversion script provided with ttf2pt1.
+When installed into a public directory it's named `<b>ttf2pt1_convert</b>'
+to avoid name collisions with the other programs.
+<p>
+<!-- =stop >
+
+It's called as:
+<p>
+
+<!-- =section cv SYNOPSIS >
+<!-- =text ttf2pt1_convert B&lt;[config-file]&gt; >
+<!-- =stop >
+<blockquote>
+ convert <i>[config-file]</i>
+</blockquote>
+
+<!-- =section cv DESCRIPTION >
+If the configuration file is not specified as an argument then the file
+`<TT>convert.cfg</TT>' in the current directory is used. This file contains
+a set of configuration variables. The distribution contains a sample file
+file `<TT>convert.cfg.sample</TT>'. Please copy it to `<TT>convert.cfg</TT>',
+look inside it and change the configuration variables. The more stable
+configuration variables, such as the path names of the scripts and
+encoding files are located in `<TT>convert</TT>' itself, they are
+automatically updated when installing <b>ttf2pt1</b>.
+<p>
+
+Put all the TTF fonts you want to convert into some directory (this
+may be just the directory that already contains all the Windows
+fonts on a mounted FAT filesystem). If you have fonts in different
+source encoding then put the fonts in each of the encodings
+into a separate directory. Up to 10 source directories are
+supported. If you (in a rather unlikely case) have more source
+directories then you can make two separate runs of the converter,
+converting up to 10 directories at a time.
+<p>
+
+The variables in the configuration file are:
+<p>
+
+<!-- ==over 2 >
+<!-- ==item * >
+<B><tt>SRCDIRS</tt></B> - the list of directories (with absolute paths) with
+ TTF fonts. Each line contains at least 3 fields: the name of the directory,
+ the language of the fonts in it (if you have fonts for different
+ languages you have to put them into the separate directories) and the
+ encoding of the fonts. Again, if you have some of the TTF typefaces in
+ one encoding, and some in another (say, CP-1251 and KOI-8), you have
+ to put them into the separate source directories. Some lines may contain
+ 4 fields. Then the fourth field is the name of the external map to
+ convert the Unicode fonts into the desirable encoding. This map is
+ used instead of the built-in map for the specified language.
+<p>
+
+<FONT COLOR="#3333FF"><FONT SIZE=-1>*8*</FONT></FONT>
+An interesting thing is that some languages have more than one
+widely used character encodings. For example, the widely used
+encodings for Russian are IBM CP-866 (MS-DOS and Unix), KOI-8
+(Unix and VAX, also the standard Internet encoding), IBM CP-1251 (MS Windows).
+That's why I have provided the means to generate the converted fonts
+in more than one encoding. See the file <A HREF="encodings/README.html">encodings/README</A> for
+details about the encoding tables. Actually, if you plan to use
+these fonts with Netscape Navigator better use the aliases
+cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251
+because that's what Netscape wants.
+<p>
+
+<!-- ==item * >
+<b><tt>DSTDIR</tt></b> - directory for the resulting Type1 fonts. Be careful!
+ This directory gets completely wiped out before conversion,
+ so don't use any already existing directory for this purpose.
+<p>
+
+<!-- ==item * >
+<b><tt>DSTENC<i>{language}</i></tt></b> - the list of encodings in which the destination
+ fonts will be generated for each language. Each font of that
+ language will be generated in each of the specified
+ encodings. If you don't want any translation, just specify both
+ <tt>SRCENC</tt> and <tt>DSTENC</tt> as iso8859-1 (or if you want any other encoding
+ specified in the fonts.dir, copy the description of 8859-1 with
+ new name and use this new name for <tt>SRCENC</tt> and <tt>DSTENC</tt>).
+<p>
+
+<!-- ==item * >
+<b><tt>FOUNDRY</tt></b> - the foundry name to be used in the fonts.dir file. I have
+ set it to `fromttf' to avoid name conflicts with any existing font for
+ sure. But this foundry name is not registered in X11 standards and
+ if you want to get the full standard compliance or have a font server
+ that enforces such a compliance, use `misc'.
+<p>
+<!-- ==back >
+
+The next few parameters control the general behavior of the converter.
+They default values are set to something reasonable.
+<p>
+
+<!-- ==over 2 >
+<!-- ==item * >
+<b><tt>CORRECTWIDTH</tt></b> - if the value is set to <b><tt>YES</tt></b> then use the
+ converter option <tt><b>-w</b></tt>, otherwise don't use it. See the description of
+ this option in the <A HREF="README.html">README</A> file.
+<p>
+
+<!-- ==item * >
+<b><tt>REMOVET1A</tt></b> - if the value is set to <b><tt>YES</tt></b> then after
+ conversion remove the un-encoded <tt>.t1a</tt> font files and the
+ intermediate <tt>.xpfa</tt> font metric files.
+<p>
+
+<!-- ==item * >
+<b><tt>INSTALLFONTMAP</tt></b> - a Ghostscript parameter, if the value is set to
+ <b><tt>YES</tt></b> then install the entries for the new fonts
+ right into the main <tt>Fontmap</tt> file. Otherwise just leave
+ the file <tt>Fontmap.ttf</tt> in the Ghostscript configuration
+ directory.
+<p>
+
+<!-- ==item * >
+<b><tt>HINTSUBST</tt></b> - if the value is set to <b><tt>YES</tt></b> use the option
+ <tt><b>-H</b></tt>, otherwise don't use it. This option enables the
+ hint substitution technique. If you have not installed the X11 patch
+ described above, use this option with great caution. See further
+ description of this option in the <A HREF="README.html">README</A> file.
+<p>
+
+<!-- ==item * >
+<b><tt>ENFORCEISO</tt></b> - if the value is set to <b><tt>YES</tt></b> then
+ disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically
+ this was neccessary due to the way the installer scripts created the
+ X11 font configuration files. It is not neccessary any more for this
+ purpose. But if you plan to use these fonts with some other application
+ that expects ISOLatin1 encoding then better enable this option.
+<p>
+
+<!-- ==item * >
+<b><tt>ALLGLYPHS</tt></b> - if the value is set to <b><tt>YES</tt></b> then
+ include all the glyphs from the source fonts into the resulting fonts, even
+ if these glyphs are inaccessible. If it's set to <b><tt>NO</tt></b> then
+ include only the glyphs which have codes assigned to them. The glyphs
+ without codes can not be used directly. But some clever programs,
+ such as the Type 1 library from XFree86 3.9 and higher can change
+ the encoding on the fly and use another set of glyphs. If you have not
+ installed the X11 patch described above, use this option with great
+ caution. See further description of the option option <tt><b>-a</b></tt> in the
+ <A HREF="README.html">README</A> file.
+<p>
+
+<!-- ==item * >
+<b><tt>GENUID</tt></b> - if the value is set to <b><tt>YES</tt></b> then use
+ the option <tt><b>-uA</b></tt> of the converter to generate UniqueIDs for
+ the converted fonts. The standard X11 Type 1 library does not use
+ this ID, so it may only be neccessary for the other applications.
+ The script is clever enough to generate different UniqueID for the
+ same font converted to multiple encodings. Also after conversion it
+ checks all the fonts generacted during the session for duplicated
+ UniqueID and shows those. Still, this does not quarantee that these
+ UniqueIDs won't overlap with some other fonts. The UniqueIDs are
+ generated as hash values from the font names, so it's guaranteed
+ that if the `<tt>convert</tt>' script runs multiple times it will
+ generate the same UniqueIDs during each run. See further description
+ of this option in the <A HREF="README.html">README</A> file.
+<p>
+
+<!-- ==item * >
+<b><tt>GENUID</tt></b> - if the value is set to <b><tt>YES</tt></b> then create
+ the <tt>.pfb</tt> files, otherwise the <tt>.pfa</tt> files. The <tt>.pfb</tt>
+ files are more compact but contain binary data, so you may experience some
+ troubles when transferring them through the network.
+<p>
+<!-- ==back >
+
+The following parameters are used to locate the other scripts and
+configuration files. By default the scripts do a bit of guessing for them:
+they search in the <b>ttf2pt1</b> installation directory if <b>ttf2pt1</b>
+was installed or otherwise suppose that you are running `<tt>convert</tt>' with
+`<tt>scripts</tt>' subdirectory being the current directory.
+<p>
+
+<!-- ==over 2 >
+<!-- ==item * >
+<b><tt>ENCDIR</tt></b> - directory containing the descriptions of encodings
+<br>
+<!-- ==item * >
+<b><tt>MAPDIR</tt></b> - directory containing the external map files
+<p>
+<!-- ==back >
+
+Besides that a few parameters are built into the `<tt>convert</tt>' script itself.
+You probably won't need to change them:
+<p>
+
+<!-- ==over 2 >
+<!-- ==item * >
+<tt><b>T1ASM</b></tt>, <tt><b>TTF2PT1</b></tt>, <tt><b>TRANS</b></tt>, <tt><b>T1FDIR</b></tt>, <tt><b>FORCEISO</b></tt> - paths to the other script
+<p>
+<!-- ==back >
+
+Also there are a few parameters controlling the installation of
+fonts for Ghostscript. Please look at their description in the
+<A HREF="#gs">Ghostscript</a> section of documentation or in the <b>ttf2pt1_x2gs(1)</b>
+manual page before running `<tt>convert</tt>'. If these parameters are
+set, `<tt>convert</tt>' will call the `<tt>x2gs</tt>' script automatically
+to install the newly converted fonts in Ghostscript.
+<p>
+
+After creating the configuration file run the `<tt>convert</tt>' script. Look at
+the result and the log file in <tt>DSTDIR</tt>.
+<p>
+
+Add the directory with newly converted fonts to the configuration
+of X server or font server. For most of the systems this step is
+very straightforward. For HP-UX it's rather tricky and poorly
+documented, so the file <A HREF="FONTS.hpux.html">FONTS.hpux</A> gives a short description.
+<p>
+
+If you don't have the privileges of the root user, you still can
+configure your private font server. Just use some non-standard
+port number (see <A HREF="FONTS.hpux.html">FONTS.hpux</A> for an example, exept that you won't
+need all the HP-related stuff on any other system).
+<p>
+<!-- =stop >
+
+<H4>
+Known Problems
+</H4>
+<!
+--------------
+>
+<!-- =section cv BUGS >
+<!-- ==head2 Known problems >
+
+<ul>
+<li> One catch is that the X11 Type 1 font library has a rather low limit
+ on the font size. Because of this the fonts with more complicated
+ outlines and the enabled hint substitution may not fit into
+ this limit. The same applies to the fonts with very complicated
+ outlines or with very many glyphs (especially the fonts with
+ over 256 glyphs). So you will need to excercise caution with
+ these options if you plan using these fonts with X11. Some vendors
+ such as HP provide the Type 1 implementation licensed from Adobe
+ which should have no such problem.
+<p>
+
+ But there is a solution even for the generic X11. A patch located
+ in the subdirectory `<tt>app/X11</tt>' fixes this problem as well
+ as some other minor problems. Its description is provided in
+ <A HREF="app/X11/README.html">app/X11/README</A>.
+<p>
+
+ To fix the X11 font library, you have to get the X11 sources. I
+ can recommend the ftp sites of the XFree86 project <A HREF="ftp://ftp.xfree86.org">ftp://ftp.xfree86.org</A>
+ or of the Open Group <A HREF="ftp://ftp.x.org">ftp://ftp.x.org</A>. This patch was made on the sources
+ of XFree86 so you may have better success with applying it to the
+ XFree86 distribution. After you have got the sources, make sure
+ that you can compile them. Then apply the patch as described.
+ Make sure that it was applied properly. Compile the sources again
+ (actually, you need only the fonts library, the fonts server, and
+ possibly the X server). It would be prudent now to save your old
+ font library, font server and, possibly, X server. Then install
+ the new recently compiled versions of these files. Of course,
+ if you know someone who already has compiled these files for the
+ same OS as yours, you can just copy the binary fles from him.
+<p>
+
+ Alas, building the X11 system from the source code is not the
+ easiest thing in the world and if you have no experience it
+ can be quite difficult. In this case just avoid the aforementioned
+ features or check each converted font to make sure that it
+ works properly.
+<p>
+
+<li> The Type1 font library from the standard X11 distribution
+ does not work on HP-UX (at least, up to 10.01). The font server
+ supplied with HP-UX up to 10.01 is also broken. Starting from
+ HP-UX 10.20 (I don't know about 10.10) they supply a proprietary font
+ library and the converted fonts work fine with it, provided that
+ they are configured properly (see the file <A HREF="FONTS.hpux.html">FONTS.hpux</A>).
+<p>
+
+<li> The <tt>fonts.scale</tt> files created by the older versions of the
+ <tt>ttf2pt1</tt> installation program (up to release 3.1) have conflicted
+ with the language definitions of the <tt>Xfsft</tt> font server and
+ parts of it included into XFree86. To overcome this incompatibility
+ the never versions creats the <tt>fonts.scale</tt> file describing all the
+ fonts as belonging to the <tt>adobe-fontspecific</tt> encoding and
+ the <tt>fonts.alias</tt> file with the proper names. The drawback of
+ this solution is that <tt>xlsfonts</tt> gives the list of twice more
+ fonts. But as a side effect the option <tt><b>ENFORCEISO</b></tt> in
+ `<tt>convert.cfg</tt>' is not required for X11 any more.
+<p>
+
+<li> The conversion script has no support for Eastern multi-plane fonts.
+ Contribution of such a support would be welcome.
+<p>
+</ul>
+<!-- =stop >
+<!-- =section cv FILES >
+<!-- ==over 2 >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/scripts/convert.cfg.sample >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/scripts/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/README >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/FONTS >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_BINDIR/ttf2pt1 >
+<!-- ==back >
+<!-- =stop >
+<!-- =section cv SEE ALSO >
+<!-- ==over 4 >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1_x2gs(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;t1asm(1)&gt; >
+<!-- ==back >
+<!-- =stop >
+
+<A NAME="gs"></A>
+<H3>
+Ghostscript
+</H3>
+<!
+===========
+>
+<!-- =section gs NAME >
+<!-- =text B&lt;ttf2pt1_x2gs&gt; - font installer for Ghostscript >
+<!-- =stop >
+
+<!-- =section gs DESCRIPTION >
+The fonts generated with <b>ttf2pt1</b> work fine with Ghostscript by
+themselves. The script `<b>x2gs</b>' (or `<b>ttf2pt1_x2gs</b>' when installed
+into a public directory, to avoid name conflicts with other
+programs) links the font files from the X11 direcotry into the Ghostscript
+directory and automatically creates the description file (<tt>Fontmap</tt>)
+in Ghostscript format.
+<!-- =stop >
+
+It's called as:
+<p>
+
+<!-- =section gs SYNOPSIS >
+<!-- =text ttf2pt1_x2gs B&lt;[config-file]&gt; >
+<!-- =stop >
+<blockquote>
+ x2gs <i>[config-file]</i>
+</blockquote>
+
+<!-- =section gs DESCRIPTION >
+If the configuration file is not specified as an argument then the file
+`<TT>convert.cfg</TT>' in the current directory is used, just like the
+`<tt>convert</tt>' script does. Indeed, this configuration file is used for
+both scripts.
+<p>
+
+The Ghostscript-related parameters in the configuration file are:
+<p>
+
+<b><tt>DSTDIR</tt></b> - the X11 font directory used by `<tt>x2gs</tt>' as the
+ source of the fonts. This parameter is common with the X11
+ configuration.
+<p>
+
+<b><tt>GSDIR</tt></b> - the base directory of Ghostsript. If this
+ parameter is set to an empty string then `<tt>convert</tt>' won't
+ call `<tt>x2gs</tt>'. So if you want to get only the X11 fonts
+ installed then set this parameter to an empty string. This
+ directory may vary on various system, so please check your
+ system and set this value accordingly before running the script.
+<p>
+
+<b><tt>GSFONTDIR</tt></b> - the font directory of Ghostscript. In the standard
+ Ghostscript installation it's a subdirectory of <tt>GSDIR</tt>
+ but some systems may use completely different directories.
+<p>
+
+<b><tt>GSCONFDIR</tt></b> - the configuration subdirectory of Ghostscript
+ that contains the <tt>Fontmap</tt> file.
+<p>
+
+<b><tt>INSTALLFONTMAP</tt></b> - if the value is set to <b><tt>YES</tt></b> then
+ install the entries for the new fonts right into the main
+ <tt>Fontmap</tt> file. Otherwise just leave the file <tt>Fontmap.ttf</tt>
+ in the Ghostscript configuration directory.
+<p>
+
+
+After preparing the configuration file run the script. It symbolicaly links
+all the font files and creates the description file <tt>Fontmap.ttf</tt> in
+<tt>GSCONDFIR</tt>. After that there are two choices.
+<p>
+
+If the option <tt>INSTALLFONTMAP</tt> was set to <tt>YES</tt> then
+the font descriptions are also automatically installed into the
+master <tt>Fontmap</tt> file. The script is clever enough to
+detect if it was run multiple times with the same directories
+and if so it replaces the old <tt>Fontmap</tt> entries with
+the new ones instead of just accumulating all of them. You
+may also run it multiple times for multiple X11 directories
+and all the results will be properly collected in the <tt>Fontmap</tt>.
+But it's your responsibility to watch that the names of the
+font files don't overlap. If the X11 font directory gets
+renamed then you have to remove its font entries from the
+<tt>Fontmap</tt> and only after that re-run `<tt>x2gs</tt>'
+for the new directory.
+<p>
+
+On the other hand if the option <tt>INSTALLFONTMAP</tt> was set to
+<tt>NO</tt> then go to the <tt>GSCONFDIR</tt> directory and insert the
+contents of <tt>Fontmap.ttf</tt> into the <tt>Fontmap</tt> file
+manually. This step may be left manual to make the installation
+a little bit more safe.
+<p>
+
+After that you may also want to redefine some of the aliases in
+<tt>Fontmap</tt> to refer to the newly installed fonts.
+But the redefinition of the aliases may be dangerous if the width of
+characters in the new font will be different from the old font.
+Alas, there is no visible solution of this problem yet.
+<p>
+<!-- =stop >
+<!-- =section gs FILES >
+<!-- ==over 2 >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/scripts/convert.cfg.sample >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/scripts/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/README >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/FONTS >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_BINDIR/ttf2pt1 >
+<!-- ==back >
+<!-- =stop >
+<!-- =section gs SEE ALSO >
+<!-- ==over 4 >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1_convert(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;t1asm(1)&gt; >
+<!-- ==back >
+<!-- =stop >
+
+<A NAME="win"></A>
+<H3>
+MS Windows
+</H3>
+<!
+===========
+>
+
+<b>Ttf2pt1</b> can be built on Windows either with native compiler or in
+POSIX emulation mode.
+<p>
+
+Native MS Windows compilers require a different way to build the converter
+instead of the Makefile (their <tt>make</tt> programs commonly are quite weird
+and limited in capabilities). An example of batch file <tt>winbuild.bat</tt>
+is provided for MS Visual C/C++. Probably it can be easily adapted for other
+32-bit Windows and DOS compilers. The important part is to define the
+preprocessor symbol WINDOWS during compilation.
+<p>
+
+Cygnus <tt>make</tt> almost supports full Makefiles but not quite. Seems
+like its POSIX support is also of the same quality "almost but not quite".
+So another command file <tt>cygbuild.sh</tt> is provided for Cygnus GNU C, also
+with the preprocessor symbol WINDOWS defined. It is intended to be run from
+the Cygnus BASH shell. To run the programs produced by the Cygnus compiler
+the Cygnus library file <tt>CYGWIN1.DLL</tt> should be copied first into
+<tt>C:\WINDOWS</tt>.
+<p>
+
+To run the accompanying scripts Perl for Windows will be required as well as
+other tools from the Cygnus set.
+<p>
+
+The Windows support was not particularly tested, so in case of problems with
+building or running the converter please let us know.
+<p>
+
+<A NAME="netscape"></a>
+<H3>
+Netscape Navigator/Communicator
+</H3>
+<!
+===============================
+>
+
+Basically, the biggest problem with Netscape Navigator is that
+it has built-in fixed PostScript font names and built-in fixed
+glyph tables for them. Oh, no, that's two! Let's start over:
+basically the two biggest problems of Netscape Navigator are
+that (one)it has built-in fixed PostScript font names and (two)
+built-in fixed glyph tables for them and (three) it always
+assumes that the fonts have ISOLatin1 encoding. OK, let's
+start over again: basically the three biggest problems of Netscape
+Navigator are that (one) it has built-in fixed PostScript font names,
+(two) built-in fixed glyph tables for them and (three) it always
+assumes that the fonts have ISOLatin1 encoding and (four) it
+does not remember the scaled font size between the sessions.
+You did not expect such a Spanish Inquisition, did you ? (<A HREF="#nsfn1">*</a>)
+<p>
+
+Luckily, we have solutions for all of these problems. They are
+located in the subdirectory `<tt>app/netscape</tt>' and described
+in <A HREF="app/netscape/README.html">app/netscape/README</a>.
+<p>
+
+<A NAME="nsfn1"></a>
+&nbsp;&nbsp;-------<br>
+&nbsp;&nbsp;<FONT SIZE=-1>*) See Monty Python's Flying Circus, episode 15</FONT></FONT>
+<p>
+
+<A NAME="rpm"></a>
+<H3>
+Linux RPM package
+</H3>
+<!
+=================
+>
+
+The spec file for the creation of a Linux RPM package is located in
+<tt>app/RPM</tt>. It has been contributed by Johan Vromans. When
+<tt>make all</tt> is ran in the main directory it among the other
+things creates the version of itself adapted to Linux in <tt>app/RPM</tt>,
+you may want to copy that version back to the main directory.
+<p>
+
+<B>Warning:</B> Please note that the install section is incomplete, and
+the installed scripts won't work until the paths inside them
+are corrected.
+<p>
+
+<A NAME="framemaker"></a>
+<H3>
+FrameMaker
+</H3>
+<!
+==========
+>
+
+The fonts and AFM files generated by the version 3.2 and higher
+should work with Framemaker without problems. The AFM files
+generated by the previous versions of the converter require a
+line added to them:
+<p>
+
+&nbsp;&nbsp;<tt>EncodingScheme FontSpecific</tt>
+<p>
+
+And the underscores in the font names of the font and AFM files
+generated by the older versions may need to be changed to dashes.
+<p>
+
+<B>NOTE by Jason Baietto:</B> Ignore the directions in the Frame on-line docs
+that say to put a "serverdict begin 0 exitserver" line in the pfa files.
+Doing this caused both my printer and ghostscript to choke on the resulting
+output from FrameMaker, so I would not advise doing this (though your
+mileage may vary).
+<p>
+
+<A NAME="soffice"></a>
+<H3>
+StarOffice
+</H3>
+<!
+==========
+>
+
+StarOffice 5.1x has been reported to crash if the <tt>.afm</tt> file contains
+spaces in the values of such statements as <b>Version</b>, <b>Weight</b> etc.
+These spaces are permitted by the Adobe spec, so this is a problem of
+StarOffice. The easiest way to fix these <tt>.afm</tt> files for StarOffice
+is to remove spaces in these strings or remove these strings (in case if
+they are optional) at all. This can be done automatically with a <tt>sed</tt>
+script. It seems that StarOffice 5.2 has this problem fixed, so we decided to
+spend no efforts on providing workarounds for 5.1 with <tt>ttf2pt1</tt>.
+<p>
+
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/Makefile b/fonts/utilities/ttf2pt1/Makefile
new file mode 100644
index 0000000000..6c75e9d7ef
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/Makefile
@@ -0,0 +1,243 @@
+
+# This file should be configured before running `make'.
+# Uncomment or change the values that are relevant for your OS.
+
+# The preferred C compiler (by default use the OS-specific default value).
+# For BSD/OS, FreeBSD, Linux (all flavors), NetBSD, OpenBSD the default
+# compiler is GNU C.
+# (Note please the politically correct ordering by alphabet ! :-)
+#
+# Use GNU C even if it's not the default compiler
+#
+#CC=gcc
+#
+# Use the standard ANSI C compiler on HP-UX even if it's not default
+#
+#CC=c89
+
+#
+# The system-dependent flags for the C compiler
+#
+# Default
+
+CFLAGS_SYS= -O
+
+# For GNU C
+#
+#CFLAGS_SYS= -O2
+#
+# For GNU C with long options support library (Linux etc.)
+#
+#CFLAGS_SYS= -O2 -D_GNU_SOURCE
+#
+# For GNU C on HP-UX/PA-RISC 1.1
+#
+#CFLAGS_SYS= -O2 -Wa,-w
+#
+# For the standard ANSI C on HP-UX
+#
+#CFLAGS_SYS= +O2 -D_HPUX_SOURCE
+
+#
+# The system-dependent libraries
+#
+# Defalut (for the BSD-style OSes)
+
+LIBS_SYS= -lm
+
+# For SystemV (such as SCO, UnixWare, Solaris, but _NOT_ Linux or HP-UX)
+#
+#LIBS_SYS= -lm -lsocket
+
+#
+# The flags for C compiler for the FreeType-2 library (disabled by default).
+# This code was tested with FreeType-current. It WON'T BUILD with FT2-beta8.
+# Though it probably will work fine with later betas.
+# FreeType can be downloaded from
+# ftp://freetype.sourceforge.net/pub/freetype/unstable/freetype2-current.tar.gz
+
+CFLAGS_FT=
+
+# To enable use of the FreeType-2 library
+# (if the include and lib directory do not match your installation,
+# modify them), also uncomment LIBS_FT
+#
+#CFLAGS_FT = -DUSE_FREETYPE -I/usr/local/include
+
+#
+# The FreeType-2 library flags (disabled by default)
+
+LIBS_FT=
+
+# To enable use of the FreeType-2 library
+# (if the include and lib directory do not match your installation,
+# modify them), also uncomment LIBS_FT
+#
+#LIBS_FT= -L/usr/local/lib -lfreetype
+
+#
+# Preference of front-ends if multiple parsers match a file
+# (by default the build-in front-end takes preference over FreeType)
+
+CFLAGS_PREF=
+
+# To prefer FreeType (if enabled):
+#
+#CFLAGS_PREF= -DPREFER_FREETYPE
+
+# Uncomment the second line to not compile t1asm into ttf2pt1
+CFLAGS_EXTT1ASM=
+#CFLAGS_EXTT1ASM= -DEXTERNAL_T1ASM
+
+CFLAGS= $(CFLAGS_SYS) $(CFLAGS_FT) $(CFLAGS_PREF)
+LIBS= $(LIBS_SYS) $(LIBS_FT)
+
+# Installation-related stuff
+#
+# The base dir for installation and subdirs in it
+INSTDIR = /usr/local
+# for binaries
+BINDIR = $(INSTDIR)/bin
+# for binaries of little general interest
+LIBXDIR = $(INSTDIR)/libexec/ttf2pt1
+# for scripts, maps/encodings etc.
+SHAREDIR = $(INSTDIR)/share/ttf2pt1
+MANDIR = $(INSTDIR)/man
+
+# owner and group of installed files
+OWNER = root
+GROUP = bin
+
+# After you have configured the Makefile, comment out the following
+# definition:
+warning: docs
+ @echo >&2
+ @echo " You have to configure the Makefile before running make!" >&2
+ @echo "(or if you are lazy and hope that it will work as is run \`make all')">&2
+ @echo >&2
+
+DOCS=CHANGES README FONTS FONTS.hpux encodings/README other/README \
+ app/X11/README app/netscape/README
+
+SUBDIRS = app encodings maps scripts other
+
+MANS1=ttf2pt1.1 ttf2pt1_convert.1 ttf2pt1_x2gs.1
+MANS=$(MANS1) $(MANS5)
+
+all: t1asm ttf2pt1 docs mans rpm
+
+docs: $(DOCS)
+
+mans: $(MANS)
+
+clean:
+ rm -f t1asm ttf2pt1 *.o app/RPM/Makefile app/RPM/*.spec *.core core.* core
+ ( cd other && make clean; )
+
+veryclean: clean
+ rm -f $(DOCS) $(MANS)
+
+rpm: app/RPM/Makefile app/RPM/ttf2pt1.spec
+
+ttf2pt1.1: README.html
+ scripts/html2man . . <README.html
+
+ttf2pt1_convert.1 ttf2pt1_x2gs.1: FONTS.html
+ scripts/html2man . . <FONTS.html
+
+app/RPM/Makefile: Makefile
+ sed 's/^CFLAGS_SYS.*=.*$$/CFLAGS_SYS= -O2 -D_GNU_SOURCE/;/warning:/,/^$$/s/^/#/' <Makefile >app/RPM/Makefile
+
+app/RPM/ttf2pt1.spec: app/RPM/ttf2pt1.spec.src version.h
+ sed 's/^Version:.*/Version: '`grep TTF2PT1_VERSION version.h| cut -d\" -f2`'/' <app/RPM/ttf2pt1.spec.src >$@
+
+t1asm: t1asm.c
+ $(CC) $(CFLAGS) -o t1asm -DSTANDALONE t1asm.c $(LIBS)
+
+ttf2pt1.o: ttf2pt1.c ttf.h pt1.h global.h version.h
+ $(CC) $(CFLAGS) -c ttf2pt1.c
+
+pt1.o: pt1.c ttf.h pt1.h global.h
+ $(CC) $(CFLAGS) -c pt1.c
+
+ttf.o: ttf.c ttf.h pt1.h global.h
+ $(CC) $(CFLAGS) -c ttf.c
+
+ft.o: ft.c pt1.h global.h
+ $(CC) $(CFLAGS) -c ft.c
+
+runt1asm.o: runt1asm.c global.h
+ $(CC) $(CFLAGS) $(CFLAGS_EXTT1ASM) -c runt1asm.c
+
+ttf2pt1: ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o
+ $(CC) $(CFLAGS) -o ttf2pt1 ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o $(LIBS)
+
+CHANGES: CHANGES.html
+ scripts/unhtml <CHANGES.html >CHANGES
+
+README: README.html
+ scripts/unhtml <README.html >README
+
+encodings/README: encodings/README.html
+ scripts/unhtml <encodings/README.html >encodings/README
+
+other/README: other/README.html
+ scripts/unhtml <other/README.html >other/README
+
+app/X11/README: app/X11/README.html
+ scripts/unhtml <app/X11/README.html >app/X11/README
+
+app/netscape/README: app/netscape/README.html
+ scripts/unhtml <app/netscape/README.html >app/netscape/README
+
+FONTS: FONTS.html
+ scripts/unhtml <FONTS.html >FONTS
+
+FONTS.hpux: FONTS.hpux.html
+ scripts/unhtml <FONTS.hpux.html >FONTS.hpux
+
+install: all
+ scripts/inst_dir $(BINDIR)
+ scripts/inst_dir $(LIBXDIR)
+ scripts/inst_dir $(SHAREDIR)
+ scripts/inst_dir $(MANDIR)/man1
+ scripts/inst_dir $(MANDIR)/man5
+ cp -R [A-Z][A-Z]* $(SUBDIRS) $(SHAREDIR)
+ chown -R $(OWNER) $(SHAREDIR)
+ chgrp -R $(GROUP) $(SHAREDIR)
+ chmod -R go-w $(SHAREDIR)
+ scripts/inst_file ttf2pt1 $(BINDIR)/ttf2pt1 $(OWNER) $(GROUP) 0755
+ [ -f $(BINDIR)/t1asm ] || scripts/inst_file t1asm $(LIBXDIR)/t1asm $(OWNER) $(GROUP) 0755
+ sed 's|^TTF2PT1_BINDIR=$$|TTF2PT1_BINDIR=$(BINDIR)|;\
+ s|^TTF2PT1_LIBXDIR=$$|TTF2PT1_LIBXDIR=$(LIBXDIR)|;\
+ s|^TTF2PT1_SHAREDIR=$$|TTF2PT1_SHAREDIR=$(SHAREDIR)|;' <scripts/convert >cvt.tmp
+ scripts/inst_file cvt.tmp $(BINDIR)/ttf2pt1_convert $(OWNER) $(GROUP) 0755
+ scripts/inst_file cvt.tmp $(SHAREDIR)/scripts/convert $(OWNER) $(GROUP) 0755
+ rm cvt.tmp
+ scripts/inst_file scripts/x2gs $(BINDIR)/ttf2pt1_x2gs $(OWNER) $(GROUP) 0755
+ for i in $(MANS1); do { \
+ sed 's|TTF2PT1_BINDIR|$(BINDIR)|;\
+ s|TTF2PT1_LIBXDIR|$(LIBXDIR)|;\
+ s|TTF2PT1_SHAREDIR|$(SHAREDIR)|;' <$$i >$(MANDIR)/man1/$$i \
+ && chown $(OWNER) $(MANDIR)/man1/$$i \
+ && chgrp $(GROUP) $(MANDIR)/man1/$$i \
+ && chmod 0644 $(MANDIR)/man1/$$i \
+ || exit 1; \
+ } done
+
+uninstall:
+ rm -f $(BINDIR)/ttf2pt1 $(BINDIR)/ttf2pt1_convert $(BINDIR)/ttf2pt1_x2gs
+ rm -rf $(LIBXDIR)
+ rm -rf $(SHAREDIR)
+ for i in $(MANS1); do { \
+ rm -f $(MANDIR)/man1/$$i $(MANDIR)/man1/$$i.gz; \
+ } done
+
+
+# targets for automatic generation of releases and snapshots
+
+snapshot:
+ scripts/mkrel snapshot
+
+release:
+ scripts/mkrel release
diff --git a/fonts/utilities/ttf2pt1/README.FIRST b/fonts/utilities/ttf2pt1/README.FIRST
new file mode 100644
index 0000000000..f89db20102
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/README.FIRST
@@ -0,0 +1,4 @@
+To get the plain-text README and installation guides run:
+
+ make docs
+
diff --git a/fonts/utilities/ttf2pt1/README.html b/fonts/utilities/ttf2pt1/README.html
new file mode 100644
index 0000000000..9795389974
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/README.html
@@ -0,0 +1,1105 @@
+<HTML>
+<HEAD>
+<TITLE>
+TTF2PT1 - A True Type to PostScript Type 1 Converter
+</TITLE>
+</HEAD>
+<BODY>
+<!-- =defdoc t1 ttf2pt1 1 >
+<H2>
+<!-- =section t1 NAME >
+TTF2PT1 - A True Type to PostScript Type 1 Font Converter
+<!-- =stop >
+</H2>
+
+<!
+(Do not edit this file, it is generated from README.html!!!)
+>
+<TT>
+[
+<blockquote>
+<!-- =section t1 HISTORY >
+ Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert.
+<BR>
+ Modification by Mark Heath.
+<BR>
+ Further modification by Sergey Babkin.
+<BR>
+ The Type1 assembler by I. Lee Hetherington with modifications by
+ Kai-Uwe Herbing.
+<!-- =stop >
+</blockquote>
+]
+</TT>
+<p>
+
+Ever wanted to install a particular font on your XServer but only could find
+the font you are after in True Type Format?
+<p>
+
+Ever asked <TT>comp.fonts</TT> for a True Type to Type 1 converter and got a List
+of Commercial software that doesn't run on your Operating System?
+<p>
+
+Well, this program should be the answer. This program is written in C (so it
+should be portable) and therefore should run on any OS. The only limitation
+is that the program requires some method of converting Big endian integers into
+local host integers so the network functions ntohs and ntohl are used. These
+can be replaced by macros if your platform doesn't have them.
+Of course the target platform requires a C compiler and command line ability.
+<p>
+
+<!-- =section t1 DESCRIPTION >
+Ttf2pt1 is a font converter from the True Type format (and some other formats
+supported by the FreeType library as well) to the Adobe Type1 format.
+<p>
+
+The versions 3.0 and later got rather extensive post-processing algorithm that
+brings the converted fonts to the requirements of the Type1 standard, tries to
+correct the rounding errors introduced during conversions and some simple
+kinds of bugs that are typical for the public domain TTF fonts. It
+also generates the hints that enable much better rendering of fonts in
+small sizes that are typical for the computer displays. But everything
+has its price, and some of the optimizations may not work well for certain
+fonts. That's why the options were added to the converter, to control
+the performed optimizations.
+<p>
+<!-- =stop >
+
+The converter is simple to run, just:
+<p>
+
+<!-- =section t1 SYNOPSIS >
+<blockquote>
+ <tt>ttf2pt1 <i>[-options] ttffont.ttf [Fontname]</i></tt>
+</blockquote>
+or
+<blockquote>
+ <tt>ttf2pt1 <i>[-options] ttffont.ttf -</i></tt>
+</blockquote>
+<!-- =stop >
+<p>
+
+<!-- =section t1 OPTIONS >
+The first variant creates the file <tt>Fontname.pfa</tt> (or <tt>Fontname.pfb</tt> if the
+option `<b>-b</b>' was used) with the converted font and <tt>Fontname.afm</tt> with the
+font metrics, the second one prints the font or the font metrics (if the option
+`<b>-A</b>' was used) on the standard output from where it can be immediately
+piped through some filter. If no <tt>Fontname</tt> is specified for the first
+variant, the name is generated from <tt>ttffont</tt> by replacing the <tt>.ttf</tt>
+filename suffix.
+<p>
+
+Most of the time no options are neccessary (with a possible exception
+of `<b>-e</b>'). But if there are some troubles with the resulting font, they
+may be used to control the conversion.
+The <B>options</B> are:
+<p>
+
+<!-- ==over 2 >
+<!-- ==item * >
+<TT><B>-a</TT></B> - Include all the glyphs from the source file into the converted
+ file. If this option is not specified then only the glyphs that have
+ been assigned some encoding are included, because the rest of glyphs
+ would be inaccessible anyway and would only consume the disk space.
+ But some applications are clever enough to change the encoding on
+ the fly and thus use the other glyphs, in this case they could
+ benefit from using this option. But there is a catch: the X11 library
+ has rather low limit for the font size. Including more glyphs increases
+ the file size and thus increases the chance of hitting this limit.
+ See <A HREF="app/X11/README.html"><tt>app/X11/README</tt></A> for the description of a
+ patch to X11 which fixes this problem.
+<p>
+
+<!-- ==item * >
+<TT><B>-A</TT></B> - Print the font metrics (.afm file) instead of the font on STDOUT
+<p>
+
+<!-- ==item * >
+<TT><B>-b</TT></B> - Encode the resulting font to produce a ready <tt>.pfb</tt> file.
+<p>
+
+<!-- ==item * >
+<TT><B>-d <i>suboptions</i></TT></B> - Debugging options. The suboptions are:
+<p>
+
+<blockquote>
+ <TT><B>a</TT></B> - Print out the absolute coordinates of dots in outlines. Such
+ a font can not be used by any program (that's why this option is
+ incompatible with `<b>-e</b>') but it has proven to be a valuable debuging
+ information.
+<p>
+
+ <TT><B>r</TT></B> - Do not reverse the direction of outlines. The TTF fonts have
+ the standard direction of outlines opposite to the Type1 fonts. So
+ they should be reversed during proper conversion. This option
+ may be used for debugging or to handle a TTF font with wrong
+ direction of outlines (possibly, converted in a broken way from
+ a Type1 font). The first signs of the wrong direction are the
+ letters like "P" or "B" without the unpainted "holes" inside.
+<p>
+</blockquote>
+
+<!-- ==item * >
+<TT><B>-e</TT></B> - Assemble the resulting font to produce a ready <tt>.pfa</tt> file.
+<I>
+ [ </I>S.B.<I>: Personally I don't think that this option is particularly useful.
+ The same result may be achieved by piping the unassembled data
+ through t1asm, the Type 1 assembler. And, anyways, it's good to
+ have the t1utils package handy. But Mark and many users think that
+ this functionality is good and it took not much time to add this option. ]
+</I>
+<p>
+
+<!-- ==item * >
+<TT><B>-F</TT></B> - Force the Unicode encoding: any type of MS encoding specified
+ in the font is ignored and the font is treated like it has Unicode
+ encoding. <B>WARNING:</B> <I>this option is intended for buggy fonts
+ which actually are in Unicode but are marked as something else. The
+ effect on the other fonts is unpredictable.</I>
+<p>
+
+<!-- ==item * >
+<TT><B>-l <I>language</I>[+<I>argument</I>]</TT></B> - Extract the fonts for the specified language from a
+ multi-language Unicode font. If this option is not used the converter
+ tries to guess the language by the values of the shell variable LANG.
+ If it is not able to guess the language by LANG it tries all the
+ languages in the order they are listed.
+<p>
+
+ After the plus sign an optional argument for the language extractor
+ may be specified. The format of the argument is absolutely up to
+ the particular language converter. The primary purpose of the
+ argument is to support selection of planes for the multi-plane
+ Eastern encodings but it can also be used in any other way. The
+ language extractor may decide to add the plane name in some form
+ to the name of the resulting font. None of the currently supported
+ languages make any use of the argument yet.
+<p>
+
+ As of now the following languages are supported:
+<br>
+ &nbsp;&nbsp;<TT>latin1</TT> - for all the languages using the Latin-1 encoding
+<br>
+ &nbsp;&nbsp;<TT>latin2</TT> - for the Central European languages
+<br>
+ &nbsp;&nbsp;<TT>latin4</TT> - for the Baltic languages
+<br>
+ &nbsp;&nbsp;<TT>latin5</TT> - for the Turkish language
+<br>
+ &nbsp;&nbsp;<TT>russian</TT> - for the Russian language
+<br>
+ &nbsp;&nbsp;<TT>bulgarian</TT> - for the Bulgarian language
+<br>
+ &nbsp;&nbsp;<TT>adobestd</TT> - for the AdobeStandard encoding used by TeX
+<br>
+ &nbsp;&nbsp;<TT>plane+<i>argument</i></TT> - to select one plane from a multi-byte encoding
+<p>
+
+ The argument of the "<tt>plane</tt>" language may be in one of three forms:
+<p>
+ &nbsp;&nbsp;<tt>plane+<b>pid=</b><i>&lt;pid&gt;</i><b>,eid=</b><i>&lt;eid&gt;</i></tt>
+<br>
+ &nbsp;&nbsp;<tt>plane+<b>pid=</b><i>&lt;pid&gt;</i><b>,eid=</b><i>&lt;eid&gt;</i><b>,</b><i>&lt;plane_number&gt;</i></tt>
+<br>
+ &nbsp;&nbsp;<tt>plane+<i>&lt;plane_number&gt;</i></tt>
+<p>
+
+ Pid (TTF platform id) and eid (TTF encoding id) select a particular
+ TTF encoding table in the original font. They are specified as decimal
+ numbers. If this particular encoding table is not present in the font
+ file then the conversion fails. The native ("ttf") front-end parser supports
+ only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports
+ any platform. If pid/eid is not specified then the TTF encoding table is
+ determined as usual: Unicode encoding if it's first or an 8-bit encoding
+ if not (and for an 8-bit encoding the plane number is silently ignored).
+ To prevent the converter from falling back to an 8-bit encoding, specify
+ the Unicode pid/eid value explicitly.
+<p>
+
+ Plane_number is a hexadecimal (if starts with "<b>0x</b>") or decimal number.
+ It gives the values of upper bytes for which 256 characters will be
+ selected. If not specified, defaults to 0. It is also used as a font
+ name suffix (the leading "0x" is not included into the suffix).
+<p>
+
+<!-- =stop >
+ <B>NOTE:</B>
+<!-- =section t1 BUGS >
+ It seems that many Eastern fonts use features of the TTF format that are
+ not supported by the ttf2pt1's built-in front-end parser. Because of
+ this for now we recommend using the FreeType-based parser (option
+ `<b>-p ft</b>') with the "<tt>plane</tt>" language.
+<p>
+<!-- =stop >
+
+<!-- =section t1 OPTIONS >
+<I>
+ <B>NOTE:</B>
+ You may notice that the language names are not uniform: some are the
+ names of particular languages and some are names of encodings. This
+ is because of the different approaches. The original idea was to
+ implement a conversion from Unicode to the appropriate Windows
+ encoding for a given language. And then use the translation tables
+ to generate the fonts in whatever final encodings are needed. This
+ would allow to pile together the Unicode fonts and the non-Unicode
+ Windows fonts for that language and let the program to sort them out
+ automatically. And then generate fonts in all the possible encodings
+ for that language. An example of this approach is the Russian language
+ support. But if there is no multiplicity of encodings used for some
+ languages and if the non-Unicode fonts are not considered important
+ by the users, another way would be simpler to implement: just provide
+ only one table for extraction of the target encoding from Unicode
+ and don't bother with the translation tables. The </I>latin*<I> "languages"
+ are examples of this approach. If somebody feels that he needs the
+ Type1 fonts both in Latin-* and Windows encodings he or she is absolutely
+ welcome to submit the code to implement it.
+</I><p>
+
+ <B>WARNING:</B>
+ Some of the glyphs included into the AdobeStandard encoding are not
+ included into the Unicode standard. The most typical examples of such
+ glyphs are ligatures like `fi', `fl' etc. Because of this the font
+ designers may place them at various places. The converter tries to
+ do its best, if the glyphs have honest Adobe names and/or are
+ placed at the same codes as in the Microsoft fonts they will be
+ picked up. Otherwise a possible solution is to use the option `<b>-L</b>'
+ with an external map.
+<p>
+
+<!-- ==item * >
+<TT><B>-L <I>file</I>[+<I>plane</I>]</TT></B> - Extract the fonts for the specified language from the
+ multi-language Unicode font using the map from this file. This is
+ rather like the option `<b>-l</b>' but the encoding map is not
+ compiled into the program, it's taken from that file, so it's
+ easy to edit. Examples of such files are provided in
+ <tt>maps/adobe-standard-encoding.map</tt>, <tt>CP1250.map</tt>. (<b>NOTE:</b>
+ <I>the `standard encoding' map does not include all the glyphs of the
+ AdobeStandard encoding, it's provided only as an example</I>.) The
+ description of the supported map formats is in the file
+ <tt>maps/unicode-sample.map</tt>.
+<p>
+
+ Likewise to `<b>-l</b>', an argument may be specified after the map file
+ name. But in this case the argument has fixed meaning: it selects the
+ plane of the map file. The plane name also gets added after dash to the
+ font name. The plane is a concept used in the Eastern fonts with big
+ number of glyphs: one TTF font gets divided into multiple Type1 fonts,
+ each containing one plane of up to 256 glyphs. But with a little
+ creativity this concept may be used for other purposes of combining
+ multiple translation maps into one file. To extract multiple planes
+ from a TTF font <tt>ttf2pt1</tt> must be run multiple times, each time with
+ a different plane name specified.
+<p>
+
+<!-- ==item * >
+<TT><B>-m <i>type</i>=<i>value</i></TT></B> - Set maximal or minimal limits of resources.
+ These limits control the the font generation by limiting the resources
+ that the font is permitted to require from the PostScript interpreter.
+ The currently supported types of limits are:
+<p>
+
+<blockquote>
+ <TT><B>h</TT></B> - the maximal hint stack depth for the substituted hints.
+ The default value is 128, according to the limitation in X11. This seems to
+ be the lowest (and thus the safest) widespread value. To display the
+ hint stack depth required by each glyph in a <tt>.t1a</tt> file use the script
+ <tt>scripts/cntstems.pl</tt>.
+<p>
+</blockquote>
+
+<!-- ==item * >
+<TT><B>-O <i>suboptions</i></TT></B> - Outline processing options. The suboptions
+ may be lowercase or uppercase, the lowercase ones disable the features,
+ the corresponding uppercase suboptions enable the same features.
+ The suboptions to disable/enable features are:
+<p>
+
+<blockquote>
+ <TT><B>b/B</TT></B> - Guessing of the ForceBold parameter. This parameter helps
+ the Type1 engine to rasterize the bold fonts properly at small sizes.
+ But the algorithm used to guess the proper value of this flag makes
+ that guess based solely on the font name. In rare cases that may cause
+ errors, in these cases you may want to disable this guessing.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>h/H</TT></B> - Autogeneration of hints. The really complex outlines
+ may confuse the algorithm, so theoretically it may be useful
+ sometimes to disable them. Although up to now it seems that
+ even bad hints are better than no hints at all.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>u/U</TT></B> - Hint substitution. Hint substitution is a technique
+ permitting generation of more detailed hints for the rasterizer. It allows
+ to use different sets of hints for different parts of a glyph and change
+ these sets as neccessary during rasterization (that's why "substituted").
+ So it should improve the quality of the fonts rendered at small sizes.
+ But there are two catches: First, the X11 library has rather low limit for
+ the font size. More detailed hints increase the file size and thus increase
+ the chance of hitting this limit (that does not mean that you shall hit it
+ but you may if your fonts are particularly big). This is especially
+ probable for Unicode fonts converted with option `<b>-a</b>', so you may want to
+ use `<b>-a</b>' together with `<b>-Ou</b>'. See <A HREF="app/X11/README.html"><tt>app/X11/README</tt></A> for the description of
+ a patch to X11 which fixes this problem. Second, some rasterizers (again,
+ X11 is the typical example) have a limitation for total number of hints
+ used when drawing a glyph (also known as the hint stack depth). If that
+ stack overflows the glyph is ignored. Starting from version 3.22 <tt>ttf2pt1</tt>
+ uses algorithms to minimizing this depth, with the trade-off of slightly
+ bigger font files. The glyphs which still exceed the limit set by option
+ `<b>-mh</b>' have all the substituted hints removed and only base hints left.
+ The algorithms seem to have been refined far enough to make the fonts with
+ substituted hints look better than the fonts without them or at least the
+ same. Still if the original fonts are not well-designed the detailed
+ hinting may emphasize the defects of the design, such as non-even thickness
+ of lines. So provided that you are not afraid of the X11 bug the best idea
+ would be to generate a font with this feature and without it, then compare
+ the results using the program <tt>other/cmpf</tt> (see the description
+ in <A HREF="other/README.html"><tt>other/README</tt></A>) and decide which one looks better.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>o/O</TT></B> - Space optimization of the outlines' code. This kind of optimization
+ never hurts, and the only reason to disable this feature is for comparison
+ of the generated fonts with the fonts generated by the previous versions of
+ converter. Well, it _almost_ never hurts. As it turned out there exist
+ some brain-damaged printers which don't understand it. Actually this
+ feature does not change the outlines at all. The Type 1 font manual
+ provides a set of redundant operators that make font description shorter,
+ such as '10 hlineto' instead of '0 10 rlineto' to describe a horizontal
+ line. This feature enables use of these operators.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>s/S</TT></B> - Smoothing of outlines. If the font is broken in some
+ way (even the ones that are not easily noticeable), such smoothing
+ may break it further. So disabling this feature is the first thing to be
+ tried if some font looks odd. But with smoothing off the hint generation
+ algorithms may not work properly too.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>t/T</TT></B> - Auto-scaling to the 1000x1000 Type1 standard matrix. The
+ TTF fonts are described in terms of an arbitrary matrix up to
+ 4000x4000. The converted fonts must be scaled to conform to
+ the Type1 standard. But the scaling introduces additional rounding
+ errors, so it may be curious sometimes to look at the font in its
+ original scale.
+ <b>Default: enabled</b>
+<p>
+
+ <TT><B>w/W</TT></B> - Glyphs' width corection. This option is designed to be
+ used on broken fonts which specify too narrow widths for the
+ letters. You can tell that a font can benefit from this option
+ if you see that the characters are smashed together without
+ any whitespace between them. This option causes the converter
+ to set the character widths to the actual width of this character
+ plus the width of a typical vertical stem. But on the other hand
+ the well-designed fonts may have characters that look better if
+ their widths are set slightly narrower. Such well-designed fonts
+ will benefit from disabling this feature. You may want to convert
+ a font with and without this feature, compare the results and
+ select the better one. This feature may be used only on proportional
+ fonts, it has no effect on the fixed-width fonts.
+ <b>Default: disabled</b>
+<p>
+</blockquote>
+
+<!-- ==item * >
+<TT><B>-p <I>parser_name</I></TT></B> - Use the specified front-end parser to read the font file.
+ If this option is not used, ttf2pt1 selects the parser automatically based
+ on the suffix of the font file name, it uses the first parser in its
+ list that supports this font type. Now two parsers are supported:
+<p>
+
+ &nbsp;&nbsp;<TT>ttf</TT> - built-in parser for the ttf files (suffix <tt>.ttf</tt>)
+<br>
+ &nbsp;&nbsp;<TT>ft</TT> - parser based on the FreeType-2 library (suffixes <tt>.ttf</tt>,
+ <tt>.otf</tt>, <tt>.pfa</tt>, <tt>.pfb</tt>)
+<p>
+
+ The parser <tt>ft</tt> is <b>NOT</b> linked in by default. See <tt>Makefile</tt>
+ for instructions how to enable it. We do no support this parser on
+ Windows: probably it will work but nobody tried and nobody knows how
+ to build it.
+<p>
+
+<!-- ==item * >
+<TT><B>-u <I>number</I></TT></B> - Mark the font with this value as its
+ UniqueID. The UniqueID is used by the printers with the hard disks
+ to cache the rasterized characters and thus significantly
+ speed-up the printing. Some of those printers just can't
+ store the fonts without UniqueID on their disk.The problem
+ is that the ID is supposed to be unique, as it name says. And
+ there is no easy way to create a guaranteed unique ID. Adobe specifies
+ the range 4000000-4999999 for private IDs but still it's difficult
+ to guarantee the uniqueness within it. So if you don't really need the
+ UniqueID don't use it, it's optional. Luckily there are a few millions of
+ possible IDs, so the chances of collision are rather low.
+ If instead of the number a special value '<tt><b>A</b></tt>' is given
+ then the converter generates the value of UniqueID automatically,
+ as a hash of the font name. (<b>NOTE:</b> <i> in the version 3.22 the
+ algorithm for autogeneration of UniqueID was changed to fit the values
+ into the Adobe-spacified range. This means that if UniqueIDs were used
+ then the printer's cache may need to be flushed before replacing the
+ fonts converted by an old version with fonts converted by a newer version</i>).
+ A simple way to find if any of the fonts in a given directory have
+ duplicated UniqueIDs is to use the command:
+<p>
+
+ <tt>&nbsp;&nbsp;cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 '</tt>
+<p>
+
+ Or if you use <tt>scripts/convert</tt> it will do that for you automatically
+ plus it will also give the exact list of files with duplicate UIDs.
+<p>
+
+<!-- ==item * >
+<TT><B>-v <I>size</I></TT></B> - Re-scale the font to get the size of a typical uppercase
+ letter somewhere around the specified size. Actually, it re-scales
+ the whole font to get the size of one language-dependent letter to be
+ at least of the specified size. Now this letter is "A" in all the
+ supported languages. The size is specified in the points of the
+ Type 1 coordinate grids, the maximal value is 1000. This is an
+ experimental option and should be used with caution. It tries to
+ increase the visible font size for a given point size and thus make
+ the font more readable. But if overused it may cause the fonts to
+ look out of scale. As of now the interesting values of size for
+ this option seem to be located mostly between 600 and 850. This
+ re-scaling may be quite useful but needs more experience to
+ understand the balance of its effects.
+<p>
+
+<!-- ==item * >
+<TT><B>-W <i>level</i></TT></B> - Select the verbosity level of the warnings.
+ Currently the levels from 0 to 4 are supported. Level 0 means no warnings
+ at all, level 4 means all the possible warnings. The default level is 3.
+ Other levels may be added in the future, so using the level number 99 is
+ recommended to get all the possible warnings. Going below level 2 is
+ not generally recommended because you may miss valuable information about
+ the problems with the fonts being converted.
+<p>
+
+<!-- ==item * >
+<B>Very obsolete option:</B>
+<br>
+ The algorithm that implemented the forced fixed width had major
+ flaws, so it was disabled. The code is still in the program and
+ some day it will be refined and returned back. Meanwhile the
+ option name `<b>-f</b>' was reused for another option. The old version was:
+<br>
+<TT><B>-f</TT></B> - Don't try to force the fixed width of font. Normally the converter
+ considers the fonts in which the glyph width deviates by not more
+ than 5% as buggy fixed width fonts and forces them to have really
+ fixed width. If this is undesirable, it can be disabled by this option.
+<p>
+<!-- ==back >
+
+The <tt>.pfa</tt> font format supposes that the description of the characters
+is binary encoded and encrypted. This converter does not encode or
+encrypt the data by default, you have to specify the option `<b>-e</b>'
+or use the <tt>t1asm</tt> program to assemble (that means, encode and
+encrypt) the font program. The <tt>t1asm</tt> program that is included with
+the converter is actually a part of the <tt>t1utils</tt> package, rather old
+version of which may be obtained from
+<p>
+
+<blockquote>
+<A HREF="http://ttf2pt1.sourceforge.net/t1utils.tar.gz">
+ http://ttf2pt1.sourceforge.net/t1utils.tar.gz
+</A>
+</blockquote>
+<p>
+
+Note that <tt>t1asm</tt> from the old version of that package won't work properly
+with the files generated by <tt>ttf2pt1</tt> version 3.20 and later. Please use
+<tt>t1asm</tt> packaged with <tt>ttf2pt1</tt> or from the new version <tt>t1utils</tt>
+instead. For a newer version of <tt>t1utils</tt> please look at
+<p>
+
+<blockquote>
+<A HREF="http://www.lcdf.org/~eddietwo/type/">
+ http://www.lcdf.org/~eddietwo/type/
+</A>
+</blockquote>
+<p>
+<!-- =stop >
+
+<!-- =section t1 EXAMPLES >
+So, the following command lines:
+<p>
+
+<blockquote>
+ <tt>ttf2pt1 -e ttffont.ttf t1font</tt>
+<br>
+ <tt>ttf2pt1 ttffont.ttf - | t1asm &gt;t1font.pfa</tt>
+</blockquote>
+<p>
+
+represent two ways to get a working font. The benefit of the second form
+is that other filters may be applied to the font between the converter
+and assembler.
+<p>
+<!-- =stop >
+
+<H4>
+Installation and deinstallation of the converter
+</H4>
+<!
+------------------------------------------------
+>
+
+The converter may be easily installed systemwide with
+
+<blockquote>
+ <tt>make install</tt>
+</blockquote>
+
+and uninstalled with
+
+<blockquote>
+ <tt>make uninstall</tt>
+</blockquote>
+
+By default the <tt>Makefile</tt> is configured to install in the hierarchy
+of directory <tt>/usr/local</tt>. This destination directory as well as
+the structure of the hierarchy may be changed by editing the <tt>Makefile</tt>.
+
+<H4>
+Installation of the fonts
+</H4>
+<!
+-------------------------
+>
+
+Running the converter manually becomes somewhat boring if it has to
+be applied to a few hundreds of fonts and then you have to generate the
+<tt>fonts.scale</tt> and/or <tt>Fontmap</tt> files. The <A HREF="FONTS.html"><tt>FONTS</tt></A> file describes how to use
+the supplied scripts to handle such cases easily. It also discusses
+the installation of the fonts for a few widespread programs.
+<p>
+
+<H4>
+Other utilities
+</H4>
+<!
+---------------
+>
+
+A few other small interesting programs that allow a cloase look at
+the fonts are located in the subdirectory `<tt>other</tt>'. They
+are described shortly in <A HREF="other/README.html">others/README</a>.
+<p>
+
+<H4>
+Optional packages
+</H4>
+<!
+-----------------
+>
+
+Some auxiliary files are not needed by everyone and are big enough that
+moving them to a separate package speeds up the downloads of the main
+package significantly. As of now we have one such optional package:
+<p>
+
+&nbsp;&nbsp;<b>ttf2pt1-chinese</b> - contains the Chinese conversion maps
+<p>
+
+The general versioning policy for the optional packages is the following:
+These packages may have no direct dependency on the ttf2pt1 version.
+But they may be updated in future, as well as some versions of optional
+packages may have dependencies on certain versions of ttf2pt1.
+To avoid unneccessary extra releases on one hand and keep the updates in
+sync with the ttf2pt1 itself on the other hand, a new version of an optional
+package will be released only if there are any changes to it and it will be
+given the same version number as ttf2pt1 released at the same time. So not
+every release of ttf2pt1 would have a corresponding release of all optional
+packages. For example, to get the correct version of optional packages for an
+imaginary release 8.3.4 of ttf2pt1 you would need to look for optional
+packages of the highest version not higher than (but possibly equal to) 8.3.4.
+<p>
+
+<H4>
+TO DO:
+</H4>
+<!
+------
+>
+
+<ul>
+<li> Improve hinting.
+<li> Implement the family-level hints.
+<li> Handle the composite glyphs with relative base points.
+<li> Preserve the relative width of stems during scaling to 1000x1000 matrix.
+<li> Write the man pages.
+<li> Write a BDF front-end.
+<li> Write a TTC-to-Type1 front-end (for TTF-like bitmapped fonts).
+<li> Implement better support of Asian encodings.
+<li> Implement automatic creation of ligatures.
+</ul>
+
+<H4>
+TROUBLESHOOTING AND BUG REPORTS
+</H4>
+<!
+-------------------------------
+>
+<!-- =section t1 BUGS >
+<!-- ==head2 Troubleshooting and bug reports >
+
+Have problems with conversion of some font ? The converter dumps core ? Or your
+printer refuses to understand the converted fonts ? Or some characters are
+missing ? Or some characters look strange ?
+<p>
+
+Send the bug reports to the ttf2pt1 development mailing list at
+<A HREF="mailto:ttf2pt1-devel@lists.sourceforge.net">ttf2pt1-devel@lists.sourceforge.net</A>.
+<p>
+
+Try to collect more information about the problem and include it into
+the bug report. (Of course, even better if you would provide a ready
+fix, but just a detailed bug report is also good). Provide detailed
+information about your problem, this will speed up the response greatly.
+Don't just write "this font looks strange after conversion" but describe
+what's exactly wrong with it: for example, what characters look wrong
+and what exactly is wrong about their look. Providing a link to the
+original font file would be also a good idea. Try to do a little
+troublehooting and report its result. This not only would help with
+the fix but may also give you a temporary work-around for the bug.
+<p>
+
+First, enable full warnings with option `<b>-W99</b>', save them to
+a file and read carefully. Sometimes the prolem is with a not implemented
+feature which is reported in the warnings. Still, reporting about such
+problems may be a good idea: some features were missed to cut corners,
+in hope that no real font is using them. So a report about a font using
+such a feature may motivate someone to implement it. Of course, you
+may be the most motivated person: after all, you are the one wishing
+to convert that font. ;-) Seriously, the philosophy "scrath your own itch"
+seems to be the strongest moving force behind the Open Source software.
+<p>
+
+The next step is playing with the options. This serves a dual purpose:
+on one hand, it helps to localize the bug, on the other hand you may be
+able to get a working version of the font for the meantime while the
+bug is being fixed. The typical options to try out are: first `<b>-Ou</b>', if
+it does not help then `<b>-Os</b>', then `<b>-Oh</b>', then `<b>-Oo</b>'.
+They are described in a bit more detail above. Try them one by one
+and in combinations. See if with them the resulting fonts look better.
+<p>
+
+On some fonts ttf2pt1 just crashes. Commonly that happens because the
+font being converted is highly defective (although sometimes the bug
+is in ttf2pt1 itself). In any case it should not crash, so the reports
+about such cases will help to handle these defects properly in future.
+<p>
+
+We try to respond to the bug reports in a timely fashion but alas, this
+may not always be possible, especially if the problem is complex.
+This is a volunteer project and its resources are limited. Because
+of this we would appreciate bug reports as detailed as possible,
+and we would appreciate the ready fixes and contributions even more.
+<p>
+<!-- =stop >
+<!-- =section t1 FILES >
+<!-- ==over 2 >
+<!-- ==item * >
+<!-- =text TTF2PT1_LIBXDIR/t1asm >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/scripts/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/other/* >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/README >
+<!-- ==item * >
+<!-- =text TTF2PT1_SHAREDIR/FONTS >
+<!-- ==back >
+<!-- =stop >
+
+<H4>
+CONTACTS
+</H4>
+<!
+--------
+>
+<!-- =section t1 SEE ALSO >
+<!-- ==over 4 >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1_convert(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;ttf2pt1_x2gs(1)&gt; >
+<!-- ==item * >
+<!-- =text L&lt;t1asm(1)&gt; >
+
+<!-- ==item * >
+<A HREF="http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce">
+ttf2pt1-announce@lists.sourceforge.net
+</A><br>
+ The mailing list with announcements about ttf2pt1. It is a moderated mailing
+ with extremely low traffic. Everyone is encouraged to subscribe to keep in
+ touch with the current status of project. To subscribe use the Web interface
+ at <A HREF="http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce">http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce</A>.
+ If you have only e-mail access to the Net then send a subscribe request to
+ the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody
+ will help you with subscription.
+<p>
+
+<!-- ==item * >
+<A HREF="mailto:ttf2pt1-devel@lists.sourceforge.net">
+ttf2pt1-devel@lists.sourceforge.net
+</A><br>
+<A HREF="mailto:ttf2pt1-users@lists.sourceforge.net">
+ttf2pt1-users@lists.sourceforge.net
+</A><br>
+ The ttf2pt1 mailing lists for development and users issues. They have not
+ that much traffic either. To subscribe use the Web interface at
+ <A HREF="http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel">http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel</A>
+ and <A HREF="http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users">http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users</A>.
+ If you have only e-mail access to the Net then send a subscribe request to
+ the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody
+ will help you with subscription.
+<p>
+
+<!-- =stop >
+<A HREF="mailto:mheath@netspace.net.au">
+mheath@netspace.net.au
+</A><br>
+ Mark Heath
+<p>
+
+<A HREF="mailto:A.Weeks@mcc.ac.uk">
+A.Weeks@mcc.ac.uk
+</A><br>
+ Andrew Weeks
+<p>
+
+<A HREF="mailto:babkin@users.sourceforge.net">
+babkin@users.sourceforge.net</A> (preferred)<br>
+<A HREF="mailto:sab123@hotmail.com">
+sab123@hotmail.com
+</A><br>
+ Sergey Babkin
+<p>
+
+<H4>
+SEE ALSO
+</H4>
+<!
+--------
+>
+
+<!-- =section t1 SEE ALSO >
+<!-- ==item * >
+<A HREF="http://ttf2pt1.sourceforge.net">
+http://ttf2pt1.sourceforge.net
+</A><br>
+<A HREF="http://www.netspace.net.au/~mheath/ttf2pt1/">
+http://www.netspace.net.au/~mheath/ttf2pt1/
+</A><br>
+ The primary copies of the main page of the project.
+<p>
+<!-- ==back >
+<!-- =stop >
+
+<A HREF="http://www.lcdf.org/~eddietwo/type/">
+http://www.lcdf.org/~eddietwo/type/
+</a><br>
+ The home page of the Type 1 utilities package.
+<p>
+
+<A HREF="http://www.rightbrain.com/pages/books.html">
+http://www.rightbrain.com/pages/books.html
+</a><br>
+ The first book about PostScript on the Web, "Thinking in PostScript".
+<p>
+
+<A HREF="http://fonts.apple.com/TTRefMan/index.html">
+http://fonts.apple.com/TTRefMan/index.html
+</a><br>
+ The True Type reference manual.
+<p>
+
+<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
+http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf
+</a><br>
+ Adobe PostScript reference manual.
+<p>
+
+<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF">
+http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF
+</a><br>
+ Specification of the Type 1 font format.
+<p>
+
+<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf">
+http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf
+</a><br>
+ The Type 1 font format supplement.
+<p>
+
+<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf">
+http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf
+</A><BR>
+ Specification of the Adobe font metrics file format.
+<p>
+
+<A HREF="http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html">
+http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html
+</A><BR>
+<A HREF="http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html">
+http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html
+</A><BR>
+ Information about the Bezier curves.
+<p>
+
+<A HREF="http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html">
+http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html
+</A><br>
+ A stand-alone library supporting the Type1 fonts. Is neccessary
+ to compile the programs <tt>other/cmpf</tt> and <tt>other/dmpf</tt>.
+<p>
+
+<A HREF="http://www.freetype.org">
+http://www.freetype.org
+</A><br>
+ A library supporting the TTF fonts. Also many useful TTF programs
+ are included with it.
+<p>
+
+<A HREF="http://heliotrope.homestead.com/files/printsoft.html">
+http://heliotrope.homestead.com/files/printsoft.html
+</A><br>
+ Moses Gold's collection of links to printing software.
+<p>
+
+<A HREF="http://linuxartist.org/fonts/">
+http://linuxartist.org/fonts/
+</A><br>
+ Collection of font-related links.
+<p>
+
+<HR>
+<HR>
+<!
+----------------------------------------------------------------------
+----------------------------------------------------------------------
+>
+
+Following is the Readme of <tt>ttf2pfa</tt> (true type to type 3 font converter) It
+covers other issues regarding the use of this software. Please note that
+although <tt>ttf2pfa</tt> is a public domain software, <tt>ttf2pt1</tt>
+is instead covered by an Open Source license. See the <tt>COPYRIGHT</tt>
+file for details.
+<p>
+
+Please note also that <tt>ttf2pfa</tt> has not been maintained for a long time.
+All of its functionality has been integrated into <tt>ttf2pt1</tt> and all the
+development moved to <tt>ttf2pt1</tt>, including Andrew Weeks, the author of
+<tt>ttf2pfa</tt>. <tt>Ttf2pfa</tt> is provided for historical reasons only. Please use
+<tt>ttf2pt1</tt> instead.
+
+<HR>
+<!
+----------------------------------------------------------------------
+>
+
+<H3>
+True Type to Postscript Font converter
+</H3>
+<!
+--------------------------------------
+>
+
+My mind is still reeling from the discovery that I was able to write
+this program. What it does is it reads a Microsoft TrueType font and
+creates a Postscript font. '<I>_A_</I> postscript font', that is, not necessarily
+the same font, you understand, but a fair imitation.
+<p>
+
+Run it like this:
+<p>
+
+<blockquote><tt>
+ ttf2pfa fontfile.ttf fontname
+</tt></blockquote>
+<p>
+
+The first parameter is the truetype filename, the second is a stem for
+the output file names. The program will create a <tt>fontname.pfa</tt> containing
+the Postscript font and a <tt>fontname.afm</tt> containing the metrics.
+<p>
+
+The motivation behind this is that in Linux if you do not have a
+Postscript printer, but only some other printer, you can only print
+Postscript by using Ghostscript. But the fonts that come with
+Ghostscript are very poor (they are converted from bitmaps and look
+rather lumpy). This is rather frustrating as the PC running Linux
+probably has MS-Windows as well and will therefore have truetype fonts,
+but which are quite useless with Linux, X or Ghostscript.
+<p>
+
+The program has been tested on over a hundred different TrueType fonts
+from various sources, and seems to work fairly well. The converted
+characters look OK, and the program doesn't seem to crash any more. I'm
+not sure about the AFM files though, as I have no means to test them.
+<p>
+
+The fonts generated will not work with X, as the font rasterizer that
+comes with X only copes with Type 1 fonts. If I have the time I may
+modify ttf2pfa to generate Type 1s.
+<p>
+
+<H4>
+Copyright issues
+</H4>
+<!
+----------------
+>
+
+I am putting this program into the public domain, so don't bother
+sending me any money, I'd only have to declare it for income tax.
+<p>
+
+Copyright on fonts, however, is a difficult legal question. Any
+copyright statements found in a font will be preserved in the output.
+Whether you are entitled to translate them at all I don't know.
+<p>
+
+If you have a license to run a software package, like say MS-Windows, on
+your PC, then you probably have a right to use any part of it, including
+fonts, on that PC, even if not using that package for its intended
+purpose.
+<p>
+
+I am not a lawyer, however, so this is not a legal opinion, and may be
+garbage.
+<p>
+
+There shouldn't be a any problem with public domain fonts.
+<p>
+
+<H4>
+About the Program
+</H4>
+<!
+-----------------
+>
+
+It was written in C on a IBM PC running Linux.
+<p>
+
+The TrueType format was originally developed by Apple for the MAC, which
+has opposite endianness to the PC, so to ensure compatibility 16 and 32
+bit fields are the wrong way round from the PC's point of view. This is
+the reason for all the 'ntohs' and 'ntohl' calls. Doing it this way
+means the program will also work on big-endian machines like Suns.
+<p>
+
+I doubt whether it will work on a DOS-based PC though.
+<p>
+
+The program produces what technically are Type 3 rather than Type 1
+fonts. They are not compressed or encrypted and are plain text. This is
+so I (and you) can see what's going on, and (if you're a Postscript guru
+and really want to) can alter the outlines.
+<p>
+
+I only translate the outlines, not the 'instructions' that come with
+them. This latter task is probably virtually impossible anyway. TrueType
+outlines are B-splines rather than the Bezier curves that Postscript
+uses. I believe that my conversion algorithm is reasonably correct, if
+nothing else because the characters look right.
+<p>
+
+<H4>
+Problems that may occur
+</H4>
+<!
+-----------------------
+>
+
+Most seriously, very complex characters (with lots of outline segments)
+can make Ghostscript releases 2.x.x fail with a 'limitcheck' error. It
+is possible that this may happen with some older Postscript printers as
+well. Such characters will be flagged by the program and there are
+basically two things you can do. First is to edit the <tt>.pfa</tt> file to
+simplify or remove the offending character. This is not really
+recommended. The second is to use Ghostscript release 3, if you can get
+it. This has much larger limits and does not seem to have any problems
+with complex characters.
+<p>
+
+Then there are buggy fonts (yes, a font can have bugs). I try to deal
+with these in as sane a manner as possible, but it's not always
+possible.
+<p>
+
+<H4>
+Encodings
+</H4>
+<!
+---------
+>
+
+A postscript font must have a 256 element array, called an encoding,
+each element of which is a name, which is also the name of a procedure
+contained within the font. The 'BuildChar' command takes a byte and uses
+it to index the encoding array to find a character name, and then looks
+that up in the font's procedure table find the commands to draw the
+glyph. However, not all characters need be in the encoding array. Those
+that are not cannot be drawn (at least not using 'show'), however it is
+possible to 're-encode' the font to enable these characters. There are
+several standard encodings: Adobe's original, ISO-Latin1 and Symbol
+being the most commonly encountered.
+<p>
+
+TrueType fonts are organised differently. As well as the glyph
+descriptions there are a number of tables. One of these is a mapping
+from a character set into the glyph array, and another is a mapping from
+the glyph array into a set of Postscript character names. The problems
+are:
+<p>
+ 1) Microsoft uses Unicode, a 16-bit system, to encode the font.
+<br>
+ 2) that more than one glyph is given the same Postscript name.
+<p>
+
+I deal with (1) by assuming a Latin1 encoding. The MS-Windows and
+Unicode character sets are both supersets of ISO-8859-1. This usually
+means that most characters will be properly encoded, but you should be
+warned that some software may assume that fonts have an Adobe encoding.
+Symbol, or Dingbat, fonts are in fact less of a problem, as they have
+private encodings starting at 0xF000. It is easy to just lose the top
+byte.
+<p>
+
+Postscript fonts can be re-encoded, either manually, or by software.
+Groff, for example, generates postscript that re-encodes fonts with the
+Adobe encoding. The problem here is that not all characters in the Adobe
+set are in the MS-Windows set. In particular there are no fi and fl
+ligatures. This means that conversions of the versions of
+Times-New-Roman and Arial that come with MS-Windows cannot be used
+blindly as replacements for Adobe Times-Roman and Helvetica. You can get
+expanded versions of MS fonts from Microsoft's web site which do contain
+these ligatures (and a lot else besides).
+<p>
+
+I deal with (2) by creating new character names. This can be error-prone
+because I do not know which of them is the correct glyph to give the
+name to. Some (buggy) fonts have large numbers of blank glyphs, all with
+the same name.
+<p>
+
+(almost every TrueType font has three glyphs called <tt>.notdef</tt>, one of them
+is usually an empty square shape, one has no outline and has zero width,
+and one has no outline and a positive width. This example is not really
+a problem with well formed fonts since the <tt>.notdef</tt> characters are only
+used for unprintable characters, which shouldn't occur in your documents
+anyway).
+<p>
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/app/RPM/ttf2pt1.spec.src b/fonts/utilities/ttf2pt1/app/RPM/ttf2pt1.spec.src
new file mode 100644
index 0000000000..31fc984372
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/RPM/ttf2pt1.spec.src
@@ -0,0 +1,40 @@
+Summary: TrueType to Adobe Type 1 font converter
+Name: ttf2pt1
+Version: XXX
+Release: 1jv
+Source: %{name}-%{version}.tgz
+Copyright: Distributable
+Group: Utilities/Printing
+BuildRoot: /var/tmp/ttf2pt1
+
+%description
+ * True Type Font to Adobe Type 1 font converter
+ * By Mark Heath <mheath@netspace.net.au>
+ * Based on ttf2pfa by Andrew Weeks <ccsaw@bath.ac.uk>
+ * With help from Frank M. Siegert <fms@this.net>
+
+%prep
+%setup
+
+%build
+make all
+
+%install
+rm -fr $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+mkdir -p $RPM_BUILD_ROOT/usr/local/share/%{name}
+mkdir -p $RPM_BUILD_ROOT/usr/local/doc
+
+install -s -m 0555 ttf2pt1 $RPM_BUILD_ROOT/usr/local/bin
+install -m 0555 scripts/* $RPM_BUILD_ROOT/usr/local/share/%{name}
+chmod 0444 $RPM_BUILD_ROOT/usr/local/share/%{name}/convert.cfg.sample
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(644, root, root, 755)
+%doc README README.html INSTALL INSTALL.html
+/usr/local/bin/ttf2pt1
+/usr/local/share/%{name}
+
diff --git a/fonts/utilities/ttf2pt1/app/X11/README.html b/fonts/utilities/ttf2pt1/app/X11/README.html
new file mode 100644
index 0000000000..322a01e9df
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/X11/README.html
@@ -0,0 +1,41 @@
+<HTML>
+<HEAD>
+<TITLE>
+Recommended patches for the X11 font library
+</TITLE>
+</HEAD>
+<BODY>
+<H2>
+Recommended patches for the X11 font library
+</H2>
+
+by Sergey Babkin
+&lt;babkin@bellatlantic.net&gt;, &lt;sab123@hotmail.com&gt;
+<p>
+
+These are patches for XFree86 versions 3.3.4 and 3.9
+to fix a few known problems with big Type1 fonts and
+with strange handling of the standard stem width table.
+The patch for XFree86 3.3.4 probably may be easily
+installed on any other distribution of X11.
+They are supposed to be installed in the subdirectory
+<br>
+
+&nbsp;&nbsp;<tt>xc/lib/font/Type1</tt>
+<br>
+
+of the X11 source tree and after that the font library,
+font server and X server should be rebuilt.
+<p>
+
+Sorry that the description has so little details but if
+you know how to build X11 then this is enough, otherwise
+any more details won't help much.
+<p>
+
+The patches have been submitted to the XFree86 project,
+hope they will be included in some next release of XFree86
+and X11.
+<p>
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/app/X11/t1-xf86.334.patch b/fonts/utilities/ttf2pt1/app/X11/t1-xf86.334.patch
new file mode 100644
index 0000000000..31e98e2d01
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/X11/t1-xf86.334.patch
@@ -0,0 +1,199 @@
+*** fontfcn.c 2000/01/02 18:55:56 1.1
+--- fontfcn.c 2000/01/02 19:00:17
+***************
+*** 33,38 ****
+--- 33,39 ----
+ #include <string.h>
+ #include "t1imager.h"
+ #include "util.h"
++ #include "t1stdio.h"
+ #include "fontfcn.h"
+ #include "fontmisc.h"
+
+***************
+*** 117,132 ****
+ resetFont(env);
+ /* This will load the font into the FontP */
+ rcode = scan_font(FontP);
+! if (rcode == SCAN_OUT_OF_MEMORY) {
+ /* free the memory and start again */
+ xfree(vm_base);
+ if (!(initFont(vm_size * 2))) {
+ /* we are really out of memory */
+ return(SCAN_OUT_OF_MEMORY);
+ }
+ resetFont(env);
+ rcode = scan_font(FontP);
+- /* only double the memory once, then report error */
+ }
+ return(rcode);
+ }
+--- 118,151 ----
+ resetFont(env);
+ /* This will load the font into the FontP */
+ rcode = scan_font(FontP);
+! if (rcode != SCAN_OUT_OF_MEMORY)
+! return rcode;
+!
+! if (T1FileSize > VM_SIZE) {
+! /* use the file size as estimation */
+!
+ /* free the memory and start again */
+ xfree(vm_base);
++ if (!(initFont(T1FileSize))) {
++ /* we are really out of memory */
++ return(SCAN_OUT_OF_MEMORY);
++ }
++ resetFont(env);
++ rcode = scan_font(FontP);
++ if (rcode != SCAN_OUT_OF_MEMORY)
++ return rcode;
++ }
++
++ /* if still not enough, increase up to maximum */
++ while (rcode == SCAN_OUT_OF_MEMORY
++ && vm_size <= VM_SIZE_MAX/2 ) {
++ xfree(vm_base);
+ if (!(initFont(vm_size * 2))) {
+ /* we are really out of memory */
+ return(SCAN_OUT_OF_MEMORY);
+ }
+ resetFont(env);
+ rcode = scan_font(FontP);
+ }
+ return(rcode);
+ }
+*** paths.c 2000/01/02 18:55:56 1.1
+--- paths.c 2000/01/02 18:56:27
+***************
+*** 584,590 ****
+ CONCAT(before, r);
+ r = before;
+ }
+! else
+ r->context = after->context;
+ if (after != NULL)
+ CONCAT(r, after);
+--- 584,590 ----
+ CONCAT(before, r);
+ r = before;
+ }
+! else if (after != NULL)
+ r->context = after->context;
+ if (after != NULL)
+ CONCAT(r, after);
+*** scanfont.c 2000/01/02 18:55:56 1.1
+--- scanfont.c 2000/01/02 18:56:26
+***************
+*** 1383,1388 ****
+--- 1383,1390 ----
+ /* point to name and search for leading blanks */
+ nameP= FontP->FontFileName.data.nameP;
+ namelen = FontP->FontFileName.len;
++ if (namelen > (128-1) ) /* prevent getting out of filename[] */
++ namelen = (128-1);
+ while (nameP[0] == ' ') {
+ nameP++;
+ namelen--;
+*** t1io.c 2000/01/02 18:55:56 1.1
+--- t1io.c 2000/01/02 18:56:32
+***************
+*** 54,59 ****
+--- 54,62 ----
+ /* Our single FILE structure and buffer for this package */
+ STATIC F_FILE TheFile;
+ STATIC unsigned char TheBuffer[F_BUFSIZ];
++
++ /* the size of the file we read */
++ int T1FileSize;
+
+ /* Our routines */
+ F_FILE *T1Open(), *T1Eexec();
+***************
+*** 87,92 ****
+--- 90,96 ----
+ of->flags = 0;
+ of->error = 0;
+ haveextrach = 0;
++ T1FileSize = 0;
+ return &TheFile;
+ } /* end Open */
+
+***************
+*** 165,171 ****
+--- 169,181 ----
+ int T1Close(f) /* Close the file */
+ F_FILE *f; /* Stream descriptor */
+ {
++ int rc;
++
+ if (f->b_base == NULL) return 0; /* already closed */
++
++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0)
++ T1FileSize += rc; /* count the rest of the file */
++
+ f->b_base = NULL; /* no valid stream */
+ return close(f->fd);
+ } /* end Close */
+***************
+*** 289,294 ****
+--- 299,305 ----
+ }
+ }
+ f->b_ptr = f->b_base;
++ T1FileSize += rc; /* remember how many bytes we have */
+ if (Decrypt) rc = T1Decrypt(f->b_base, rc);
+ return rc;
+ } /* end Fill */
+*** type1.c 2000/01/02 18:55:56 1.1
+--- type1.c 2000/01/02 18:56:27
+***************
+*** 365,378 ****
+ /* ADJUST STEM WIDTHS */
+ /**********************/
+
+! widthdiff = 0.0;
+
+ /* Find standard stem with smallest width difference from this stem */
+ if (stems[stemno].vertical) { /* vertical stem */
+ if (blues->StdVW != 0) /* there is an entry for StdVW */
+ widthdiff = blues->StdVW - stemwidth;
+ for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */
+! if (blues->StemSnapV[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapV[i] - stemwidth;
+ }
+--- 365,380 ----
+ /* ADJUST STEM WIDTHS */
+ /**********************/
+
+! /* a big value to not compete with StemSnap */
+! /* if there is no StemSnap it will be caught later */
+! widthdiff = onepixel*2;
+
+ /* Find standard stem with smallest width difference from this stem */
+ if (stems[stemno].vertical) { /* vertical stem */
+ if (blues->StdVW != 0) /* there is an entry for StdVW */
+ widthdiff = blues->StdVW - stemwidth;
+ for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */
+! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) )
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapV[i] - stemwidth;
+ }
+***************
+*** 380,386 ****
+ if (blues->StdHW != 0) /* there is an entry for StdHW */
+ widthdiff = blues->StdHW - stemwidth;
+ for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */
+! if (blues->StemSnapH[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapH[i] - stemwidth;
+ }
+--- 382,388 ----
+ if (blues->StdHW != 0) /* there is an entry for StdHW */
+ widthdiff = blues->StdHW - stemwidth;
+ for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */
+! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) )
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapH[i] - stemwidth;
+ }
diff --git a/fonts/utilities/ttf2pt1/app/X11/t1-xf86.39.patch b/fonts/utilities/ttf2pt1/app/X11/t1-xf86.39.patch
new file mode 100644
index 0000000000..44d32ce57f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/X11/t1-xf86.39.patch
@@ -0,0 +1,252 @@
+*** scanfont.c 1999/12/27 00:34:02 1.1
+--- scanfont.c 1999/12/27 00:35:34
+***************
+*** 2234,2239 ****
+--- 2234,2241 ----
+ /* point to name and search for leading blanks */
+ nameP= FontP->FontFileName.data.nameP;
+ namelen = FontP->FontFileName.len;
++ if (namelen > (128-1) ) /* prevent getting out of filename[] */
++ namelen = (128-1);
+ while (nameP[0] == ' ') {
+ nameP++;
+ namelen--;
+*** paths.c 1999/12/27 00:37:01 1.1
+--- paths.c 1999/12/27 00:37:43
+***************
+*** 583,589 ****
+ CONCAT(before, r);
+ r = before;
+ }
+! else
+ r->context = after->context;
+ if (after != NULL)
+ CONCAT(r, after);
+--- 583,589 ----
+ CONCAT(before, r);
+ r = before;
+ }
+! else if (after != NULL)
+ r->context = after->context;
+ if (after != NULL)
+ CONCAT(r, after);
+*** type1.c 1999/12/27 00:38:16 1.1
+--- type1.c 1999/12/27 01:08:02
+***************
+*** 399,412 ****
+ /* ADJUST STEM WIDTHS */
+ /**********************/
+
+! widthdiff = 0.0;
+
+ /* Find standard stem with smallest width difference from this stem */
+ if (stems[stemno].vertical) { /* vertical stem */
+ if (blues->StdVW != 0) /* there is an entry for StdVW */
+ widthdiff = blues->StdVW - stemwidth;
+ for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */
+! if (blues->StemSnapV[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapV[i] - stemwidth;
+ }
+--- 399,414 ----
+ /* ADJUST STEM WIDTHS */
+ /**********************/
+
+! /* a big value to not compete with StemSnap */
+! /* if there is no StemSnap it will be caught later */
+! widthdiff = onepixel*2;
+
+ /* Find standard stem with smallest width difference from this stem */
+ if (stems[stemno].vertical) { /* vertical stem */
+ if (blues->StdVW != 0) /* there is an entry for StdVW */
+ widthdiff = blues->StdVW - stemwidth;
+ for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */
+! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) )
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapV[i] - stemwidth;
+ }
+***************
+*** 414,420 ****
+ if (blues->StdHW != 0) /* there is an entry for StdHW */
+ widthdiff = blues->StdHW - stemwidth;
+ for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */
+! if (blues->StemSnapH[i] - stemwidth < widthdiff)
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapH[i] - stemwidth;
+ }
+--- 416,422 ----
+ if (blues->StdHW != 0) /* there is an entry for StdHW */
+ widthdiff = blues->StdHW - stemwidth;
+ for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */
+! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) )
+ /* this standard width is the best match so far for this stem */
+ widthdiff = blues->StemSnapH[i] - stemwidth;
+ }
+*** t1io.c 2000/01/01 00:41:44 1.1
+--- t1io.c 2000/01/01 01:23:38
+***************
+*** 78,83 ****
+--- 78,86 ----
+ /* Our single FILE structure and buffer for this package */
+ STATIC F_FILE TheFile;
+ STATIC unsigned char TheBuffer[F_BUFSIZ];
++
++ /* the size of the file we read */
++ int T1FileSize;
+
+ /* Our routines */
+ F_FILE *T1Open(), *T1Eexec();
+***************
+*** 118,123 ****
+--- 121,127 ----
+ of->flags = 0;
+ of->error = 0;
+ haveextrach = 0;
++ T1FileSize = 0;
+ return &TheFile;
+ } /* end Open */
+
+***************
+*** 196,202 ****
+--- 200,212 ----
+ int T1Close(f) /* Close the file */
+ F_FILE *f; /* Stream descriptor */
+ {
++ int rc;
++
+ if (f->b_base == NULL) return 0; /* already closed */
++
++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0)
++ T1FileSize += rc; /* count the rest of the file */
++
+ f->b_base = NULL; /* no valid stream */
+ return close(f->fd);
+ } /* end Close */
+***************
+*** 381,386 ****
+--- 391,397 ----
+ }
+ }
+ f->b_ptr = f->b_base;
++ T1FileSize += rc; /* remember how many bytes we have */
+ if (Decrypt) rc = T1Decrypt(f->b_base, rc);
+ return rc;
+ } /* end Fill */
+*** t1stdio.h 2000/01/01 00:43:38 1.1
+--- t1stdio.h 2000/01/01 01:24:19
+***************
+*** 73,78 ****
+--- 73,79 ----
+
+ extern FILE *T1Open(), *T1eexec();
+ extern int T1Close(), T1Ungetc(), T1Read();
++ extern int T1FileSize;
+
+ #undef fclose
+ #undef fopen
+*** fontfcn.c 2000/01/01 00:07:54 1.1
+--- fontfcn.c 2000/01/01 01:36:02
+***************
+*** 57,62 ****
+--- 57,63 ----
+ #endif
+ #include "t1imager.h"
+ #include "util.h"
++ #include "t1stdio.h"
+ #ifdef BUILDCID
+ #include "range.h"
+ #include "fontmisc.h"
+***************
+*** 300,333 ****
+ resetFont(env);
+ /* This will load the font into the FontP */
+ rcode = scan_font(FontP);
+! if (rcode == SCAN_OUT_OF_MEMORY) {
+ /* free the memory and start again */
+ #ifdef BUILDCID
+ /* xfree(vm_base); */
+ #else
+ xfree(vm_base);
+ #endif
+ if (!(initFont(vm_size * 2))) {
+ /* we are really out of memory */
+ return(SCAN_OUT_OF_MEMORY);
+ }
+ resetFont(env);
+ rcode = scan_font(FontP);
+- #ifdef BUILDCID
+- /* only double the memory twice, then report error */
+- if (rcode == SCAN_OUT_OF_MEMORY) {
+- /* free the memory and start again */
+- /* xfree(vm_base) */
+- if (!(initFont(vm_size * 2))) {
+- /* we are really out of memory */
+- return(SCAN_OUT_OF_MEMORY);
+- }
+- resetFont(env);
+- rcode = scan_font(FontP);
+- }
+- #else
+- /* only double the memory once, then report error */
+- #endif
+ }
+ return(rcode);
+ }
+--- 301,342 ----
+ resetFont(env);
+ /* This will load the font into the FontP */
+ rcode = scan_font(FontP);
+! if (rcode != SCAN_OUT_OF_MEMORY)
+! return rcode;
+!
+! if (T1FileSize > VM_SIZE) {
+! /* use the file size as estimation */
+!
+ /* free the memory and start again */
+ #ifdef BUILDCID
+ /* xfree(vm_base); */
+ #else
+ xfree(vm_base);
+ #endif
++ if (!(initFont(T1FileSize))) {
++ /* we are really out of memory */
++ return(SCAN_OUT_OF_MEMORY);
++ }
++ resetFont(env);
++ rcode = scan_font(FontP);
++ if (rcode != SCAN_OUT_OF_MEMORY)
++ return rcode;
++ }
++
++ /* if still not enough, increase up to maximum */
++ while (rcode == SCAN_OUT_OF_MEMORY
++ && vm_size <= VM_SIZE_MAX/2 ) {
++ #ifdef BUILDCID
++ /* xfree(vm_base); */
++ #else
++ xfree(vm_base);
++ #endif
+ if (!(initFont(vm_size * 2))) {
+ /* we are really out of memory */
+ return(SCAN_OUT_OF_MEMORY);
+ }
+ resetFont(env);
+ rcode = scan_font(FontP);
+ }
+ return(rcode);
+ }
+*** util.h 2000/01/01 00:40:11 1.1
+--- util.h 2000/01/01 01:29:18
+***************
+*** 83,88 ****
+--- 83,92 ----
+ #else
+ #define VM_SIZE (50*1024)
+ #endif
++
++ /* this is the maximal permitted memory size */
++ #define VM_SIZE_MAX (1024*1024)
++
+ /***================================================================***/
+
+ #ifndef MIN
diff --git a/fonts/utilities/ttf2pt1/app/netscape/Makefile b/fonts/utilities/ttf2pt1/app/netscape/Makefile
new file mode 100644
index 0000000000..048117b639
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/Makefile
@@ -0,0 +1,2 @@
+nsfix: nsfix.c
+ $(CC) $(CFLAGS) -o nsfix nsfix.c $(LDFLAGS)
diff --git a/fonts/utilities/ttf2pt1/app/netscape/README.html b/fonts/utilities/ttf2pt1/app/netscape/README.html
new file mode 100644
index 0000000000..3c832c3f03
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/README.html
@@ -0,0 +1,229 @@
+<HTML>
+<HEAD>
+<TITLE>
+Installing the fonts in Netscape Navigator
+</TITLE>
+</HEAD>
+<BODY>
+<H2>
+Installing the fonts in Netscape Navigator
+</H2>
+
+<tt>
+by Sergey Babkin
+&lt;babkin@bellatlantic.net&gt;, &lt;sab123@hotmail.com&gt;
+</tt>
+<p>
+
+This is a collection of supplements to Netscape 4.x on
+Unix. Probably they will also work with Netscape 3.x,
+possilby with minor modifications.
+<p>
+
+<h4><tt>
+&nbsp;&nbsp;Makefile<br>
+&nbsp;&nbsp;nsfix.c<br>
+&nbsp;&nbsp;psfonts.cf
+</tt></h4>
+<p>
+
+This is a program that allows to substitute the font metrics
+of any PostScript font in Netscape.
+<p>
+
+When Netscape prints the files to PostScript format it uses a
+built-in table of character widths. It prints all the fixed-width
+characters in the typeface "Courier" and all the variable-width
+characters in the typeface "Times". And if the PostScript printer
+has these fonts by Adobe then everything goes fine because
+the tables inside Netscape are generated from the Adobe fonts.
+But if the fonts are different (say, those supplied with Ghostscripts
+or the fonts with non-latin characters) then the result is quite
+ugly. This program allows to replace the width tables inside
+the Netscape executable with the tables for any given font.
+The only problem is that Netscape can hold only one set of tables
+at once. So if you want to print with different fonts (say,
+for different languages or encodings) you will have to make
+multiple copies of the executable, tune each of them for its
+font and then run them separately.
+<p>
+
+I tried to make the program as machine-independent as possible.
+But because it patches the binary files it still has the dependencies
+on hardware. The default version as supplied was designed for
+Intel x86 machines but it should work OK on any machine
+with 32-bit CPU and 4Kbyte (or less) page size. If it can't
+find the tables matching the font names on some other architecture
+the first thing to try would be reduce the `<tt>PAGEBITS</tt>' definition
+in the source code. On the machines with non-page-aligned structure
+of executables it won't work at all. I don't know whether would
+it work on the 64-bit machines. This may depend on whether the
+Netscape executable was compiled in 32-bit or 64-bit mode. For
+the 64-bit executables it may be neccessary to change the definition
+of the type `<tt>tptr</tt>' to an 8-byte integer type (probably `<tt>long</tt>'
+or `<tt>long long</tt>'). Also must be re-compiled for patching of the
+Netscape binary for each particular machine architecture because
+it assumes the byte order of the current machine.
+<p>
+
+It might be possible to create a program that would patch
+a running Netscape binary on the fly, that would allow
+changing the printing fonts as neccessary when Netscape is
+running. But this would be even more platform-dependent,
+so I don't feel any enthusiasm about doing that.
+<p>
+
+I have tested the program on the Intel machines, Netscape
+4.08 and 4.7, OS FreeBSD (both a.out and ELF formats of the
+Netscape binary) and UnixWare.
+<p>
+
+After all these scary issues are resolved the compiling
+is easy: just run `<tt>make</tt>'.
+<p>
+
+To command to patch the Netscape is:
+<p>
+<tt>
+&nbsp;&nbsp;./nsfix <i>&lt;netscape-binary&gt; &lt;config-file&gt;</i>
+</tt>
+<p>
+
+Please make a copy of the original Netscape binary before
+patching in case anything goes wrong. Patch the copy, test
+that it works OK and only then install it. The configuration
+file describes the fonts that are to be used. An example
+is provided in the file psfonts.cf.
+<p>
+
+Each line in the configuration file consists of 4
+columns:
+<p>
+
+<tt><i>
+&lt;PS_font_name&gt; &lt;font_base_file&gt; &lt;suffix_afm&gt; &lt;suffix_font&gt;
+</i></tt>
+<p>
+
+For example, the following line from my configuration file:
+<p>
+
+<tt>
+Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa
+</tt>
+<p>
+
+says that the font `Courier' will be replaced with the
+font taken from the file `<tt>/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.pfa</tt>'
+and the metrics for that font will be taken from the file
+`<tt>/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.afm</tt>' .
+<p>
+
+One more caveat: the new font must have a proper encoding
+table. Some fonts contain characters for multiple encodings
+hoping that the program wil re-encode them as neccessary.
+This won't work in this case, only the primary encoding table
+of the font will be used.
+<p>
+
+<h4><tt>
+&nbsp;&nbsp;nsfilter<br>
+&nbsp;&nbsp;nsprint<br>
+&nbsp;&nbsp;psfonts.cf
+</tt></h4>
+<p>
+
+These are the filters for printing from Netscape.
+<p>
+
+Changing the metrics is not the end of the story. This will
+provide proper placement of the characters but not the
+characters themselves. There are a few ways to provide
+the characters:
+<p>
+
+First, if you use GhostScript you may configure proper
+aliases in the GhostScript configuration file. We will
+consider this variant trivial and won't discuss it furter
+except for one caveat: Netscape tries to re-encode the
+fonts per the ISO Latin-1 encoding. If the primary encoding
+of the font is different this cause unexpected effects.
+So you still may consider using the filters (at least in a
+simplified form) to solve this problem.
+<p>
+
+Second, load the fonts right into your printer. This is
+very much like configuring GhostScript.
+<p>
+
+Third, use the provided filters. The script `<tt>nsfilter</tt>'
+reads the output of Netscape on its standard input and
+puts the result to its standard output. It uses the same
+configuration file `<tt>psfonts.cf</tt>' as `<tt>nsfix</tt>'. First it
+looks for the configuration file in the user's home
+directory (<tt>$HOME/.netscape/psfonts.cf</tt>) and if the
+file it not there then the second guess is the system-wide
+configuration file <tt>/usr/local/etc/psfonts.cf</tt>. The
+script inserts the fonts into the output and also
+removes the Netscape's experiments with the encodings.
+<p>
+
+`<tt>nsfilter</tt>' is generally intended to be ran by user, not by the
+printing subsystem. The reason is that the user may have
+changed fonts in his Netscape and the printing subsystem
+would have no way to access user's configuration file.
+But if all the users are using the same fonts then it
+may be incorporated into the printing subsystem and use
+the system-wide configuration file.
+<p>
+
+The script `<tt>nsprint</tt>' is purely for convenience, to type it
+as a printing command in the Netscape printing window.
+It just pipelines the data through `<tt>nsfilter</tt>' to the
+printing program which also gets all the arguments. Please
+note that the SystemV-style and BSD-style systems use different
+printing programs (although they commonly provide compatibility
+with the other style too). The script tries to guess the
+type of system and use its native print program, `<tt>lp</tt>' or
+`<tt>lpr</tt>'. But in case it guesses wrong you may want
+to change this in the script. Also if the printer does not support
+PostScript directly this script may be a good place to
+insert a call to GhostScript.
+<p>
+
+<h4><tt>
+&nbsp;&nbsp;notscape<br>
+&nbsp;&nbsp;fontsz.cf
+</tt></h4>
+<p>
+
+Netscape on Unix has a very annoying "feature", it does
+not remember the desired base size of the scalable screen
+fonts and always resets it to 12.0 points. Even if the size
+is changed manually in its preferences file, Netscape
+forgets it after it exits.
+<p>
+
+So my solution was to write a program which would change
+the size to my favorite one every time right before
+starting Netscape. `<tt>notscape</tt>' is exactly such a program,
+it sets the font sizes an then transparently executes
+netscape. It takes the font sizes from the file
+`<tt>$HOME/.netscape/fontsz.cf</tt>' . An example of such file
+is provided. The format of the file is quite self-explanatory,
+for example the lines
+<p>
+
+<tt>
+fixed-koi8-r 140<br>
+prop-koi8-r 150
+</tt>
+<p>
+
+mean "set the size of the fixed-width screen font in the
+encoding koi8-r to 14.0 points; set the size of the proportional
+(variable-width) font in the encoding koi8-r to 15.0 points".
+<p>
+</BODY>
+</HTML>
+
diff --git a/fonts/utilities/ttf2pt1/app/netscape/fontsz.cf b/fonts/utilities/ttf2pt1/app/netscape/fontsz.cf
new file mode 100644
index 0000000000..acce79c226
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/fontsz.cf
@@ -0,0 +1,8 @@
+fixed-koi8-r 150
+prop-koi8-r 150
+fixed-iso-8859-5 150
+prop-iso-8859-5 150
+fixed-iso-8859-1 150
+prop-iso-8859-1 150
+fixed-x-user-defined 150
+prop-x-user-defined 150
diff --git a/fonts/utilities/ttf2pt1/app/netscape/notscape b/fonts/utilities/ttf2pt1/app/netscape/notscape
new file mode 100755
index 0000000000..67d87bcbb5
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/notscape
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+NDIR=$HOME/.netscape
+PFILE=$NDIR/preferences.js
+CFFILE=$NDIR/fontsz.cf
+TMPFILE=$NDIR/fontsz.sed
+
+die() {
+ echo "notscape: can't $*" >&2
+ exit 1
+}
+
+[ -r $CFFILE ] && {
+awk '{ printf("/intl.font_spec_list/s/-[^-]*-\\([^-]*\\)-%s,/-%s-\\1-%s,/\n", \
+ $1, $2, $1); }' <$CFFILE >$TMPFILE
+
+cp $PFILE $PFILE.old || die "save old pref file"
+sed -f $TMPFILE <$PFILE.old >$PFILE.new || die "create new pref file"
+[ -s $PFILE.new ] || die "create new pref file"
+
+mv $PFILE.new $PFILE || die "install new pref file"
+
+}
+
+exec netscape -no-about-splash "$@"
diff --git a/fonts/utilities/ttf2pt1/app/netscape/nsfilter b/fonts/utilities/ttf2pt1/app/netscape/nsfilter
new file mode 100755
index 0000000000..905c96c340
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/nsfilter
@@ -0,0 +1,24 @@
+#!/bin/sh
+CONFLOCAL=$HOME/.netscape/psfonts.cf
+CONFGLOBAL=/usr/local/etc/nspsfonts.cf
+
+if [ -r "$CONFLOCAL" ]
+then
+ CONF="$CONFLOCAL"
+else
+ CONF="$CONFGLOBAL"
+fi
+
+grep -v "^#" <$CONF | grep -v "^$" | while :
+do {
+ read nsname base afm pfa x
+ [ -z "$nsname" ] && break;
+
+ fname=`awk '/^FontName/ {print $2;}' <$base$afm`
+
+ cat $base$pfa
+ echo "/$nsname /$fname findfont definefont"
+
+} done
+
+grep -v "^ /Encoding isolatin1encoding def$"
diff --git a/fonts/utilities/ttf2pt1/app/netscape/nsfix.c b/fonts/utilities/ttf2pt1/app/netscape/nsfix.c
new file mode 100644
index 0000000000..6aa47c91b5
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/nsfix.c
@@ -0,0 +1,469 @@
+/*
+ * Fix the Netscape executable for specified font widths
+ *
+ * (c) 1999 Copyright by Sergey Babkin
+ * see COPYRIGHT
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <locale.h>
+#include <unistd.h>
+
+/************************** DEFINES *************************/
+
+#undef DEBUG
+
+/* we can handle at most this many fonts */
+#define MAXFONTS 20
+
+/* maximal line buffer size */
+#define MAXLINE 512
+
+/* there may be multiple strings with the same contents */
+#define MAXDUPS 10
+
+/* file read buffer size */
+#define FILEBF 40960
+
+/* bits in the hardware page offset */
+#define BITSPERPAGE 12
+
+/* size of page in bytes */
+#define PAGESIZE (1<<BITSPERPAGE)
+
+/* mask of the in-page offset */
+#define PAGEMASK (PAGESIZE-1)
+
+/* this is machine-dependent! */
+typedef short t2b; /* 2-byte type */
+typedef int t4b; /* 4-byte type */
+typedef int tptr; /* integer type with the same size as pointer */
+
+struct bbox { /* bounding box */
+ t2b llx; /* lower-left-x */
+ t2b lly;
+ t2b urx;
+ t2b ury; /* upper-right-y */
+};
+
+struct glyphmetrics { /* metrics of one glyph */
+ t2b width;
+ t2b unknown;
+ struct bbox bbox;
+};
+
+struct fontmetrics { /* metrics of the wholefont */
+ tptr name;
+ struct bbox bbox;
+ t2b underlinepos;
+ t2b underlinethick;
+ struct glyphmetrics glyphs[256];
+};
+
+struct font {
+ char nsname[MAXLINE]; /* name in the Netscape binary */
+ char afmname[MAXLINE]; /* name of the .afm file */
+ char pfaname[MAXLINE]; /* name of the .pfa (or .pfb) file */
+ struct fontmetrics metrics;
+ off_t binoff; /* offset in the binary */
+};
+
+#define SCONST(x) (x), ((sizeof (x))-1)
+
+/************************** GLOBALS *************************/
+
+struct font font[MAXFONTS];
+int nfonts=0;
+
+char msg[MAXLINE];
+
+/*************************** PROTOTYPES **********************/
+
+void usage(void);
+void readconfig( char *fn);
+void readmetrics(void);
+void replacefonts( char *fn);
+
+/************************** main ****************************/
+
+main(ac, av)
+ int ac;
+ char **av;
+{
+ setlocale(LC_ALL, "");
+
+ if(ac!=3) {
+ usage(); exit(1);
+ }
+
+ readconfig(av[2]);
+ readmetrics();
+ replacefonts( av[1]);
+}
+
+/************************** usage ***************************/
+
+void
+usage(void)
+{
+ fprintf(stderr,"Use:\n");
+ fprintf(stderr," nsfix <netscape.bin> <config-file>\n");
+}
+
+
+/************************** readconfig **********************/
+
+void
+readconfig(fn)
+ char *fn;
+{
+ char s[MAXLINE];
+ char afmsuffix[MAXLINE], pfasuffix[MAXLINE];
+ int lineno=0;
+ FILE *f;
+
+ if(( f=fopen(fn, "r") )==NULL) {
+ sprintf(msg,"nsfix: open %s",fn);
+ perror(msg);
+ exit(1);
+ }
+
+ while( fgets(s, MAXLINE, f) ) {
+ lineno++;
+ if(s[0]=='#' || s[0]=='\n')
+ continue;
+
+ if(nfonts>=MAXFONTS) {
+ fprintf(stderr, "nsfix: only %d fonts are supported at once\n",
+ MAXFONTS);
+ exit(1);
+ }
+
+ if( sscanf(s, "%s %s %s %s", font[nfonts].nsname,
+ font[nfonts].afmname, afmsuffix, pfasuffix) != 4 ) {
+ fprintf(stderr, "nsfix: syntax error at line %d of %s\n",
+ lineno, fn);
+ exit(1);
+ }
+ strcpy(font[nfonts].pfaname, font[nfonts].afmname);
+ strcat(font[nfonts].afmname, afmsuffix);
+ strcat(font[nfonts].pfaname, pfasuffix);
+ nfonts++;
+ }
+
+ if(nfonts==0) {
+ fprintf(stderr, "nsfix: no fonts are defined in %s\n", fn);
+ exit(1);
+ }
+ fclose(f);
+}
+
+/************************** readmetrics *********************/
+
+void
+readmetrics(void)
+{
+ int i;
+ char s[MAXLINE];
+ FILE *f;
+ int n;
+ int lineno;
+ int code, width, llx, lly, urx, ury;
+ char gn[MAXLINE];
+ struct glyphmetrics *gm;
+
+ for(i=0; i<nfonts; i++) {
+ if(( f=fopen(font[i].afmname, "r") )==NULL) {
+ sprintf(msg,"nsfix: open %s", font[i].afmname);
+ perror(msg);
+ exit(1);
+ }
+ lineno=0;
+ while( fgets(s, MAXLINE, f) ) {
+ lineno++;
+ if( !strncmp(s, SCONST("UnderlineThickness ")) ) {
+ if( sscanf(s, "UnderlineThickness %d", &n) <1) {
+ fprintf(stderr, "nsfix: weird UnderlineThickness at line %d in %s\n",
+ lineno, font[i].afmname);
+ exit(1);
+ }
+ font[i].metrics.underlinethick=n;
+ } else if( !strncmp(s, SCONST("UnderlinePosition ")) ) {
+ if( sscanf(s, "UnderlinePosition %d", &n) <1) {
+ fprintf(stderr, "nsfix: weird UnderlinePosition at line %d in %s\n",
+ lineno, font[i].afmname);
+ exit(1);
+ }
+ font[i].metrics.underlinepos=n;
+ } else if( !strncmp(s, SCONST("FontBBox ")) ) {
+ if( sscanf(s, "FontBBox %d %d %d %d", &llx, &lly, &urx, &ury) <4) {
+ fprintf(stderr, "nsfix: weird FontBBox at line %d in %s\n",
+ lineno, font[i].afmname);
+ exit(1);
+ }
+ font[i].metrics.bbox.llx=llx;
+ font[i].metrics.bbox.lly=lly;
+ font[i].metrics.bbox.urx=urx;
+ font[i].metrics.bbox.ury=ury;
+ } else if( !strncmp(s, SCONST("C ")) ) {
+ if( sscanf(s, "C %d ; WX %d ; N %s ; B %d %d %d %d",
+ &code, &width, &gn, &llx, &lly, &urx, &ury) <7)
+ {
+ fprintf(stderr, "nsfix: weird metrics at line %d in %s\n",
+ lineno, font[i].afmname);
+ exit(1);
+ }
+ if(code>=32 && code<=255) {
+ font[i].metrics.glyphs[code].width=width;
+ font[i].metrics.glyphs[code].bbox.llx=llx;
+ font[i].metrics.glyphs[code].bbox.lly=lly;
+ font[i].metrics.glyphs[code].bbox.urx=urx;
+ font[i].metrics.glyphs[code].bbox.ury=ury;
+ }
+ }
+ }
+ fclose(f);
+ }
+
+#ifdef DEBUG
+ for(i=0; i<nfonts; i++) {
+ printf("Font %s\n", font[i].nsname);
+ for(n=0; n<256; n++) {
+ gm= &font[i].metrics.glyphs[n];
+ printf(" %d w=%4d [%4d %4d %4d %4d]", n, gm->width,
+ gm->bbox.llx, gm->bbox.lly, gm->bbox.urx, gm->bbox.ury);
+ printf(" w=0x%04x [0x%04x 0x%04x 0x%04x 0x%04x]\n", gm->width & 0xffff,
+ gm->bbox.llx & 0xffff, gm->bbox.lly & 0xffff, gm->bbox.urx & 0xffff, gm->bbox.ury & 0xffff);
+ }
+ }
+
+ exit(0);
+#endif
+
+}
+
+/************************** replacefonts ********************/
+
+void
+replacefonts(fn)
+ char *fn;
+{
+ int f; /* don't use stdio */
+ char bf[FILEBF];
+ char *bfend, *p;
+ int len;
+ off_t pos;
+
+ off_t zerooff[MAXFONTS*MAXDUPS]; /* offset of zero strings */
+ tptr nameaddr[MAXFONTS*MAXDUPS]; /* name pointers before these zero strings */
+ int zeroid[MAXFONTS*MAXDUPS]; /* font number for this zero block */
+ int nzeroes;
+ short matched[MAXFONTS]; /* counters how many matches we have for each requested font */
+ struct fontmetrics *fp;
+
+ struct {
+ int noff;
+ int nz;
+ off_t off[MAXDUPS]; /* there may be multiple strings with the same contents */
+ } o[MAXFONTS];
+ int maxnlen;
+ int i, j, k, n;
+
+ static struct glyphmetrics gm[32]; /* 0-initialized */
+
+
+ if(( f=open(fn, O_RDWR) )<0) {
+ sprintf(msg,"nsfix: open %s",fn);
+ perror(msg);
+ exit(1);
+ }
+
+
+ /* get the maximal font name length */
+ maxnlen=0;
+ for(i=0; i<nfonts; i++) {
+ o[i].noff=o[i].nz=0;
+ matched[i]=0;
+ len=strlen(font[i].nsname)+1;
+ if(len>maxnlen)
+ maxnlen=len;
+ }
+
+ /* fprintf(stderr,"maxnlen= 0x%x\n", maxnlen); /* */
+ /* try to find the literal strings of the font names */
+ pos=0; bfend=bf;
+ while(( len=read(f, bfend, FILEBF-(bfend-bf)) )>=0 ) {
+ /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */
+ /* the last position to check */
+ if(len>=maxnlen)
+ /* leave the rest with the next block */
+ bfend+= len-maxnlen;
+ else {
+ /* we are very near to the end of file, check
+ * up to the very last byte */
+ bfend+= len-2;
+ memset(bfend+2, 0, maxnlen);
+ }
+
+ for(p=bf; p<=bfend; p++)
+ for(i=0; i<nfonts; i++)
+ if(!strcmp(font[i].nsname, p) && o[i].noff<MAXDUPS) {
+ o[i].off[ o[i].noff++ ] = pos + (p-bf);
+ fprintf(stderr,"found %s at 0x%lx\n", font[i].nsname, (long)pos + (p-bf));
+ }
+
+ if(len==0)
+ break;
+
+ memmove(bf, bfend, maxnlen);
+ pos+= (bfend-bf);
+ bfend= (bf+maxnlen);
+ }
+ if(len<0) {
+ sprintf(msg,"nsfix: read %s",fn);
+ perror(msg);
+ exit(1);
+ }
+ fprintf(stderr,"---\n");
+ /* if there are any dups try to resolve them */
+ for(i=0; i<nfonts; i++) {
+ if(o[i].noff==0) {
+ fprintf(stderr, "nsfix: font %s (%d of %d) is missing in %s\n",
+ font[i].nsname, i, nfonts, fn);
+ exit(1);
+ }
+ if(o[i].noff!=1)
+ continue;
+ /* good, only one entry */
+ fprintf(stderr,"found unique %s at 0x%lx\n", font[i].nsname, (long)o[i].off[0] );
+ /* if any dupped entry is right after this one then it's good */
+ /* if it's farther than PAGESIZE/2 then it's bad */
+ pos=o[i].off[0]+strlen(font[i].nsname)+1;
+ for(j=0; j<MAXFONTS; j++) {
+ if(o[j].noff<=1)
+ continue;
+ for(k=0; k<o[j].noff; k++) {
+ if(o[j].off[k]==pos) { /* good */
+ fprintf(stderr,"got unique %s at 0x%lx\n", font[j].nsname, (long)pos );
+ o[j].off[0]=pos;
+ o[j].noff=1;
+ break;
+ }
+ if(o[j].off[k] < pos - PAGESIZE/2
+ || o[j].off[k] > pos + PAGESIZE/2) { /* bad */
+ fprintf(stderr, "eliminated %s at 0x%lx\n", font[j].nsname, (long)o[j].off[k] );
+ for(n=k+1; n<o[j].noff; n++)
+ o[j].off[n-1]=o[j].off[n];
+ o[j].noff--;
+ k--;
+ }
+ }
+ if(o[j].noff==1 && j<i) { /* have to revisit this font */
+ i=j-1; /* compensate for i++ */
+ break;
+ }
+ }
+ }
+
+
+ /* try to find the metric tables in the executable */
+ if(lseek(f, (off_t)0, SEEK_SET)<0) {
+ sprintf(msg,"nsfix: rewind %s",fn);
+ perror(msg);
+ exit(1);
+ }
+
+ /*
+ * search for the zeroes in place of the metrics for the codes 0-31:
+ * 4-byte aligned strings of (32*sizeof(struct glyphmetrics)) zero bytes
+ */
+ maxnlen=sizeof(struct fontmetrics);
+
+ pos=0; bfend=bf; nzeroes=0;
+ while(( len=read(f, bfend, FILEBF-(bfend-bf)) )>=0 ) {
+ /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */
+ /* the last position to check */
+ bfend+= len-maxnlen; /* don't look beyond the EOF */
+
+ for(p=bf; p<=bfend; p+=4 /* 4-byte aligned */ ) {
+ fp=(struct fontmetrics *)p;
+ if(fp->name==0)
+ continue;
+ if( memcmp(gm, fp->glyphs, sizeof gm) )
+ continue;
+
+ /* OK, looks like it, see if we can match it to any name */
+ n= fp->name & PAGEMASK;
+ for(i=0; i<nfonts; i++) {
+ for(j=0; j<o[i].noff; j++)
+ if( n==(o[i].off[j] & PAGEMASK) ) {
+ zerooff[nzeroes]= pos + (p-bf);
+ nameaddr[nzeroes]= fp->name;
+ zeroid[nzeroes]=i;
+ o[i].nz++;
+ fprintf(stderr, "matched %s at 0x%lx\n",
+ font[i].nsname, (long) zerooff[nzeroes]);
+ nzeroes++;
+ matched[i]++;
+ break;
+ }
+ }
+
+ }
+
+ if(len==0)
+ break;
+
+ memmove(bf, bfend, maxnlen);
+ pos+= (bfend-bf);
+ bfend= (bf+maxnlen);
+ }
+ if(len<0) {
+ sprintf(msg,"nsfix: read %s",fn);
+ perror(msg);
+ exit(1);
+ }
+ fprintf(stderr,"---\n");
+
+ /* make sure that all the fonts got one match */
+ k=0; /* flag: have non-matched fonts */ n=0; /* flag: have ambiguities */
+ for(i=0; i<nfonts; i++)
+ if(matched[i]==0)
+ k=1;
+ else if(matched[i]>1)
+ n=1;
+
+ if(k) {
+ fprintf(stderr,"nsfix: can't find match for some of the fonts\n");
+ fprintf(stderr,"nsfix: maybe wrong byte order, aborting\n");
+ exit(1);
+ }
+ if(n) {
+ fprintf(stderr,"nsfix: got multiple matches for some of the fonts\n");
+ fprintf(stderr,"nsfix: can't resolve, aborting\n");
+ exit(1);
+ }
+
+ /* now finally write the updated tables */
+ for(i=0; i<nzeroes; i++) {
+ j=zeroid[i];
+ fprintf(stderr, "nsfix: writing table for %s at 0x%lx\n", font[j].nsname,
+ (long)zerooff[i]);
+
+ font[j].metrics.name=nameaddr[i];
+ if( lseek(f, zerooff[i], SEEK_SET)<0 ) {
+ sprintf(msg,"nsfix: seek %s to 0x%lx",fn, (long)zerooff[i] );
+ perror(msg);
+ exit(1);
+ }
+ if( write(f, &font[j].metrics, sizeof font[j].metrics) != sizeof font[j].metrics ) {
+ sprintf(msg,"nsfix: write to %s",fn );
+ perror(msg);
+ exit(1);
+ }
+ }
+
+ close(f);
+}
diff --git a/fonts/utilities/ttf2pt1/app/netscape/nsprint b/fonts/utilities/ttf2pt1/app/netscape/nsprint
new file mode 100755
index 0000000000..6209f167e4
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/nsprint
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if uname -s | grep -i bsd >/dev/null
+then
+ LPR=lpr
+else
+ LPR=lp
+fi
+
+nsfilter | $LPR "$@"
diff --git a/fonts/utilities/ttf2pt1/app/netscape/psfonts.cf b/fonts/utilities/ttf2pt1/app/netscape/psfonts.cf
new file mode 100644
index 0000000000..19b4d712fc
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/app/netscape/psfonts.cf
@@ -0,0 +1,11 @@
+# PS_font_name font_base_file suffix_afm suffix_font
+
+Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa
+Courier-Bold /usr/lib/X11/fonts/ttf/cokoi8b.koi8-r .afm .pfa
+Courier-Oblique /usr/lib/X11/fonts/ttf/cokoi8i.koi8-r .afm .pfa
+Courier-BoldOblique /usr/lib/X11/fonts/ttf/cokoi8bi.koi8-r .afm .pfa
+
+Times-Roman /usr/lib/X11/fonts/ttf/kudriash.koi8-r .afm .pfa
+Times-Bold /usr/lib/X11/fonts/ttf/kudrias1.koi8-r .afm .pfa
+Times-Italic /usr/lib/X11/fonts/ttf/kudrias3.koi8-r .afm .pfa
+Times-BoldItalic /usr/lib/X11/fonts/ttf/kudrias2.koi8-r .afm .pfa
diff --git a/fonts/utilities/ttf2pt1/byteorder.h b/fonts/utilities/ttf2pt1/byteorder.h
new file mode 100644
index 0000000000..c139817e51
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/byteorder.h
@@ -0,0 +1,24 @@
+/*
+ * see COPYRIGHT
+ */
+
+/* This defines the macroes ntohs and ntohl, which convert short and long
+ ints from network order (used on 68000 chips, and in TrueType font
+ files) to whatever order your computer uses. #define _BIG_ENDIAN or not
+ to control which set of definitions apply. If you don't know, try both. If
+ you have a peculiar machine you're on your own.
+*/
+
+#if defined(_BIG_ENDIAN)
+#define ntohl(x) (x)
+#define ntohs(x) (x)
+#else
+#define ntohs(x) \
+ ((USHORT)((((USHORT)(x) & 0x00ff) << 8) | \
+ (((USHORT)(x) & 0xff00) >> 8)))
+#define ntohl(x) \
+ ((ULONG)((((ULONG)(x) & 0x000000ffU) << 24) | \
+ (((ULONG)(x) & 0x0000ff00U) << 8) | \
+ (((ULONG)(x) & 0x00ff0000U) >> 8) | \
+ (((ULONG)(x) & 0xff000000U) >> 24)))
+#endif
diff --git a/fonts/utilities/ttf2pt1/cygbuild.sh b/fonts/utilities/ttf2pt1/cygbuild.sh
new file mode 100644
index 0000000000..df109f81ec
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/cygbuild.sh
@@ -0,0 +1,8 @@
+:
+# this file should be run from Cygnus BASH
+# file to build ttf2pt1 with Cygnus GCC on Windows
+# don't forget to copy CYGWIN1.DLL into C:\WINDOWS
+
+gcc -o ttf2pt1 -DWINDOWS ttf2pt1.c pt1.c t1asm.c ttf.c -lm
+gcc -o t1asm -DWINDOWS -DSTANDALONE t1asm.c
+
diff --git a/fonts/utilities/ttf2pt1/encodings/README.html b/fonts/utilities/ttf2pt1/encodings/README.html
new file mode 100644
index 0000000000..9a7c40c77d
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/README.html
@@ -0,0 +1,81 @@
+<HTML>
+<HEAD>
+<TITLE>
+The INSTALLATION GUIDE
+</TITLE>
+</HEAD>
+<BODY>
+Sergey A. Babkin
+<br>
+<A HREF="mailto:babkin@bellatlantic.net">
+&lt;babkin@bellatlantic.net&gt;</A> or <A HREF="mailto:sab123@hotmail.com">&lt;sab123@hotmail.com&gt;</A>
+<p>
+<!
+(Do not edit this file, it is generated from README.html!!!)
+>
+
+<H3>
+The Translation Tables
+</H3>
+<!
+----------------------
+>
+
+These translation tables are used to translate the Type 1 fonts between
+different encodings of the same language.
+<p>
+
+The file names are supposed to have the suffix <tt>.tbl</tt>. Each file
+describes one encoding, and all the tables for a given language
+are stored in the same directory.
+<p>
+
+The file format is quite simple: just a sequence of rows in
+format
+<p>
+
+<tt>
+&lt;name&gt; &lt;decimal code&gt;
+</tt>
+<p>
+
+The names do not have to conform to any standard, just the same
+glyph must have the same name in all the files for a given language.
+<p>
+
+Not all the codes need to be described in the tables, the codes that
+are not mentioned in the tables are left untranslated. So a file
+of zero length may be used in case when no translation is neccessary.
+<p>
+
+The translation changes only the encoding table of the font and does not
+rename the glyphs in the font file.
+<p>
+
+<H3>
+Examples
+</H3>
+<!
+--------
+>
+
+The directory `russian' contains the tables for some encodings of the
+Russian language: KOI-8, IBM CP-866, IBM CP-1251 and just for fun
+ISO-8859/5 (nobody uses it anyways). The tables describe both russian
+letters and table graphics characters (except for CP-1251 for which
+the table graphics is not defined, so the table graphics portion for
+it is just copied from KOI-8).
+<p>
+
+The file for ISO-8859/1 is just a copy of file for KOI-8. It is neccessary
+because Netscape has rather weird ideas about the documents in
+KOI-8 encoding. The common way to fool Netscape is to set the KOI-8
+fonts for the ISO-8859/1 encoding and set the default encoding
+in Netscape to 8859/1.
+<p>
+
+The directory `latin1' contains an empty table for ISO-8859/1
+because it does not need any translation.
+<p>
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/encodings/adobestd/adobe-std.tbl b/fonts/utilities/ttf2pt1/encodings/adobestd/adobe-std.tbl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/adobestd/adobe-std.tbl
diff --git a/fonts/utilities/ttf2pt1/encodings/bulgarian/encodings.alias b/fonts/utilities/ttf2pt1/encodings/bulgarian/encodings.alias
new file mode 100644
index 0000000000..76574d8327
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/bulgarian/encodings.alias
@@ -0,0 +1,3 @@
+# alias real-name
+iso8859-1 koi8-r
+
diff --git a/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-1251.tbl b/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-1251.tbl
new file mode 100644
index 0000000000..28f2de4d5f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-1251.tbl
@@ -0,0 +1,128 @@
+rus_A 192
+rus_BE 193
+rus_CHE 215
+rus_DE 196
+rus_E 221
+rus_EF 212
+rus_EL 203
+rus_EM 204
+rus_EN 205
+rus_ER 208
+rus_ES 209
+rus_GHE 195
+rus_HA 213
+rus_HARDSIGN 218
+rus_I 200
+rus_IE 197
+rus_KA 202
+rus_O 206
+rus_PE 207
+rus_SHA 216
+rus_SHCHA 217
+rus_SHORTI 201
+rus_SOFTSIGN 220
+rus_TE 210
+rus_TSE 214
+rus_U 211
+rus_VE 194
+rus_YA 223
+rus_YERU 219
+rus_YO 168
+rus_YU 222
+rus_ZE 199
+rus_ZHE 198
+rus_a 224
+rus_be 225
+rus_che 247
+rus_de 228
+rus_e 253
+rus_ef 244
+rus_el 235
+rus_em 236
+rus_en 237
+rus_er 240
+rus_es 241
+rus_g_100pc 141
+rus_g_25pc 144
+rus_g_50pc 145
+rus_g_75pc 146
+rus_g_LD 179
+rus_g_LR 160
+rus_g_LRD 163
+rus_g_LRT 187
+rus_g_LRTD 190
+rus_g_LRd 182
+rus_g_LRt 185
+rus_g_LRtd 188
+rus_g_LT 174
+rus_g_LTD 181
+rus_g_Ld 166
+rus_g_Lt 172
+rus_g_Ltd 178
+rus_g_RD 165
+rus_g_RT 171
+rus_g_RTD 177
+rus_g_Rd 162
+rus_g_Rt 170
+rus_g_Rtd 175
+rus_g_TD 161
+rus_g_copyright 191
+rus_g_degree 156
+rus_g_dintegral 155
+rus_g_divide 159
+rus_g_equal 151
+rus_g_fatdot 149
+rus_g_ge 153
+rus_g_lD 167
+rus_g_lT 173
+rus_g_lTD 180
+rus_g_ld 131
+rus_g_le 152
+rus_g_leandot 158
+rus_g_lefthalf 142
+rus_g_lowerhalf 140
+rus_g_lr 128
+rus_g_lrD 183
+rus_g_lrT 186
+rus_g_lrTD 189
+rus_g_lrd 136
+rus_g_lrt 137
+rus_g_lrtd 138
+rus_g_lt 133
+rus_g_ltd 135
+rus_g_power2 157
+rus_g_rD 164
+rus_g_rT 169
+rus_g_rTD 176
+rus_g_rd 130
+rus_g_righthalf 143
+rus_g_root 150
+rus_g_rt 132
+rus_g_rtd 134
+rus_g_space 154
+rus_g_square 148
+rus_g_td 129
+rus_g_tintegral 147
+rus_g_upperhalf 139
+rus_ghe 227
+rus_ha 245
+rus_hardsign 250
+rus_i 232
+rus_ie 229
+rus_ka 234
+rus_o 238
+rus_pe 239
+rus_sha 248
+rus_shcha 249
+rus_shorti 233
+rus_softsign 252
+rus_te 242
+rus_tse 246
+rus_u 243
+rus_ve 226
+rus_ya 255
+rus_yeru 251
+rus_yo 184
+rus_yu 254
+rus_ze 231
+rus_zhe 230
diff --git a/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-866.tbl b/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-866.tbl
new file mode 100644
index 0000000000..986aa92fc5
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/bulgarian/ibm-866.tbl
@@ -0,0 +1,128 @@
+rus_A 128
+rus_BE 129
+rus_CHE 151
+rus_DE 132
+rus_E 157
+rus_EF 148
+rus_EL 139
+rus_EM 140
+rus_EN 141
+rus_ER 144
+rus_ES 145
+rus_GHE 131
+rus_HA 149
+rus_HARDSIGN 154
+rus_I 136
+rus_IE 133
+rus_KA 138
+rus_O 142
+rus_PE 143
+rus_SHA 152
+rus_SHCHA 153
+rus_SHORTI 137
+rus_SOFTSIGN 156
+rus_TE 146
+rus_TSE 150
+rus_U 147
+rus_VE 130
+rus_YA 159
+rus_YERU 155
+rus_YO 240
+rus_YU 158
+rus_ZE 135
+rus_ZHE 134
+rus_a 160
+rus_be 161
+rus_che 231
+rus_de 164
+rus_e 237
+rus_ef 228
+rus_el 171
+rus_em 172
+rus_en 173
+rus_er 224
+rus_es 225
+rus_g_100pc 219
+rus_g_25pc 178
+rus_g_50pc 177
+rus_g_75pc 176
+rus_g_LD 187
+rus_g_LR 205
+rus_g_LRD 203
+rus_g_LRT 202
+rus_g_LRTD 206
+rus_g_LRd 209
+rus_g_LRt 207
+rus_g_LRtd 216
+rus_g_LT 188
+rus_g_LTD 185
+rus_g_Ld 184
+rus_g_Lt 190
+rus_g_Ltd 181
+rus_g_RD 201
+rus_g_RT 200
+rus_g_RTD 204
+rus_g_Rd 213
+rus_g_Rt 212
+rus_g_Rtd 198
+rus_g_TD 186
+rus_g_copyright 252
+rus_g_degree 248
+rus_g_dintegral 245
+rus_g_divide 246
+rus_g_equal 247
+rus_g_fatdot 249
+rus_g_ge 242
+rus_g_lD 183
+rus_g_lT 189
+rus_g_lTD 182
+rus_g_ld 191
+rus_g_le 243
+rus_g_leandot 250
+rus_g_lefthalf 221
+rus_g_lowerhalf 220
+rus_g_lr 196
+rus_g_lrD 210
+rus_g_lrT 208
+rus_g_lrTD 215
+rus_g_lrd 194
+rus_g_lrt 193
+rus_g_lrtd 197
+rus_g_lt 217
+rus_g_ltd 180
+rus_g_power2 253
+rus_g_rD 214
+rus_g_rT 211
+rus_g_rTD 199
+rus_g_rd 218
+rus_g_righthalf 222
+rus_g_root 251
+rus_g_rt 192
+rus_g_rtd 195
+rus_g_space 255
+rus_g_square 254
+rus_g_td 179
+rus_g_tintegral 244
+rus_g_upperhalf 223
+rus_ghe 163
+rus_ha 229
+rus_hardsign 234
+rus_i 168
+rus_ie 165
+rus_ka 170
+rus_o 174
+rus_pe 175
+rus_sha 232
+rus_shcha 233
+rus_shorti 169
+rus_softsign 236
+rus_te 226
+rus_tse 230
+rus_u 227
+rus_ve 162
+rus_ya 239
+rus_yeru 235
+rus_yo 241
+rus_yu 238
+rus_ze 167
+rus_zhe 166
diff --git a/fonts/utilities/ttf2pt1/encodings/bulgarian/iso8859-5.tbl b/fonts/utilities/ttf2pt1/encodings/bulgarian/iso8859-5.tbl
new file mode 100644
index 0000000000..430fceb5ba
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/bulgarian/iso8859-5.tbl
@@ -0,0 +1,128 @@
+rus_A 176
+rus_BE 177
+rus_CHE 199
+rus_DE 180
+rus_E 205
+rus_EF 196
+rus_EL 187
+rus_EM 188
+rus_EN 189
+rus_ER 192
+rus_ES 193
+rus_GHE 179
+rus_HA 197
+rus_HARDSIGN 202
+rus_I 184
+rus_IE 181
+rus_KA 186
+rus_O 190
+rus_PE 191
+rus_SHA 200
+rus_SHCHA 201
+rus_SHORTI 185
+rus_SOFTSIGN 204
+rus_TE 194
+rus_TSE 198
+rus_U 195
+rus_VE 178
+rus_YA 207
+rus_YERU 203
+rus_YO 240
+rus_YU 206
+rus_ZE 183
+rus_ZHE 182
+rus_a 208
+rus_be 209
+rus_che 231
+rus_de 212
+rus_e 237
+rus_ef 228
+rus_el 219
+rus_em 220
+rus_en 221
+rus_er 224
+rus_es 225
+rus_g_100pc 171
+rus_g_25pc 130
+rus_g_50pc 129
+rus_g_75pc 128
+rus_g_LD 139
+rus_g_LR 157
+rus_g_LRD 155
+rus_g_LRT 154
+rus_g_LRTD 158
+rus_g_LRd 161
+rus_g_LRt 159
+rus_g_LRtd 168
+rus_g_LT 140
+rus_g_LTD 137
+rus_g_Ld 136
+rus_g_Lt 142
+rus_g_Ltd 133
+rus_g_RD 153
+rus_g_RT 152
+rus_g_RTD 156
+rus_g_Rd 165
+rus_g_Rt 164
+rus_g_Rtd 150
+rus_g_TD 138
+rus_g_copyright 252
+rus_g_degree 248
+rus_g_dintegral 245
+rus_g_divide 246
+rus_g_equal 247
+rus_g_fatdot 249
+rus_g_ge 242
+rus_g_lD 135
+rus_g_lT 141
+rus_g_lTD 134
+rus_g_ld 143
+rus_g_le 243
+rus_g_leandot 250
+rus_g_lefthalf 173
+rus_g_lowerhalf 172
+rus_g_lr 148
+rus_g_lrD 162
+rus_g_lrT 160
+rus_g_lrTD 167
+rus_g_lrd 146
+rus_g_lrt 145
+rus_g_lrtd 149
+rus_g_lt 169
+rus_g_ltd 132
+rus_g_power2 253
+rus_g_rD 166
+rus_g_rT 163
+rus_g_rTD 151
+rus_g_rd 170
+rus_g_righthalf 174
+rus_g_root 251
+rus_g_rt 144
+rus_g_rtd 147
+rus_g_space 255
+rus_g_square 254
+rus_g_td 131
+rus_g_tintegral 244
+rus_g_upperhalf 175
+rus_ghe 211
+rus_ha 229
+rus_hardsign 234
+rus_i 216
+rus_ie 213
+rus_ka 218
+rus_o 222
+rus_pe 223
+rus_sha 232
+rus_shcha 233
+rus_shorti 217
+rus_softsign 236
+rus_te 226
+rus_tse 230
+rus_u 227
+rus_ve 210
+rus_ya 239
+rus_yeru 235
+rus_yo 241
+rus_yu 238
+rus_ze 215
+rus_zhe 214
diff --git a/fonts/utilities/ttf2pt1/encodings/bulgarian/koi8-r.tbl b/fonts/utilities/ttf2pt1/encodings/bulgarian/koi8-r.tbl
new file mode 100644
index 0000000000..509e699e32
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/bulgarian/koi8-r.tbl
@@ -0,0 +1,128 @@
+rus_A 225
+rus_BE 226
+rus_CHE 254
+rus_DE 228
+rus_E 252
+rus_EF 230
+rus_EL 236
+rus_EM 237
+rus_EN 238
+rus_ER 242
+rus_ES 243
+rus_GHE 231
+rus_HA 232
+rus_HARDSIGN 255
+rus_I 233
+rus_IE 229
+rus_KA 235
+rus_O 239
+rus_PE 240
+rus_SHA 251
+rus_SHCHA 253
+rus_SHORTI 234
+rus_SOFTSIGN 248
+rus_TE 244
+rus_TSE 227
+rus_U 245
+rus_VE 247
+rus_YA 241
+rus_YERU 249
+rus_YO 179
+rus_YU 224
+rus_ZE 250
+rus_ZHE 246
+rus_a 193
+rus_be 194
+rus_che 222
+rus_de 196
+rus_e 220
+rus_ef 198
+rus_el 204
+rus_em 205
+rus_en 206
+rus_er 210
+rus_es 211
+rus_g_100pc 141
+rus_g_25pc 144
+rus_g_50pc 145
+rus_g_75pc 146
+rus_g_LD 168
+rus_g_LR 160
+rus_g_LRD 184
+rus_g_LRT 187
+rus_g_LRTD 190
+rus_g_LRd 182
+rus_g_LRt 185
+rus_g_LRtd 188
+rus_g_LT 174
+rus_g_LTD 181
+rus_g_Ld 166
+rus_g_Lt 172
+rus_g_Ltd 178
+rus_g_RD 165
+rus_g_RT 171
+rus_g_RTD 177
+rus_g_Rd 162
+rus_g_Rt 170
+rus_g_Rtd 175
+rus_g_TD 161
+rus_g_copyright 191
+rus_g_degree 156
+rus_g_dintegral 155
+rus_g_divide 159
+rus_g_equal 151
+rus_g_fatdot 149
+rus_g_ge 153
+rus_g_lD 167
+rus_g_lT 173
+rus_g_lTD 180
+rus_g_ld 131
+rus_g_le 152
+rus_g_leandot 158
+rus_g_lefthalf 142
+rus_g_lowerhalf 140
+rus_g_lr 128
+rus_g_lrD 183
+rus_g_lrT 186
+rus_g_lrTD 189
+rus_g_lrd 136
+rus_g_lrt 137
+rus_g_lrtd 138
+rus_g_lt 133
+rus_g_ltd 135
+rus_g_power2 157
+rus_g_rD 164
+rus_g_rT 169
+rus_g_rTD 176
+rus_g_rd 130
+rus_g_righthalf 143
+rus_g_root 150
+rus_g_rt 132
+rus_g_rtd 134
+rus_g_space 154
+rus_g_square 148
+rus_g_td 129
+rus_g_tintegral 147
+rus_g_upperhalf 139
+rus_ghe 199
+rus_ha 200
+rus_hardsign 223
+rus_i 201
+rus_ie 197
+rus_ka 203
+rus_o 207
+rus_pe 208
+rus_sha 219
+rus_shcha 221
+rus_shorti 202
+rus_softsign 216
+rus_te 212
+rus_tse 195
+rus_u 213
+rus_ve 215
+rus_ya 209
+rus_yeru 217
+rus_yo 163
+rus_yu 192
+rus_ze 218
+rus_zhe 214
diff --git a/fonts/utilities/ttf2pt1/encodings/latin1/iso8859-1.tbl b/fonts/utilities/ttf2pt1/encodings/latin1/iso8859-1.tbl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/latin1/iso8859-1.tbl
diff --git a/fonts/utilities/ttf2pt1/encodings/latin2/iso8859-2.tbl b/fonts/utilities/ttf2pt1/encodings/latin2/iso8859-2.tbl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/latin2/iso8859-2.tbl
diff --git a/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4 b/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4
diff --git a/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4.tbl b/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4.tbl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/latin4/iso8859-4.tbl
diff --git a/fonts/utilities/ttf2pt1/encodings/latin5/iso8859-9 b/fonts/utilities/ttf2pt1/encodings/latin5/iso8859-9
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/latin5/iso8859-9
diff --git a/fonts/utilities/ttf2pt1/encodings/russian/encodings.alias b/fonts/utilities/ttf2pt1/encodings/russian/encodings.alias
new file mode 100644
index 0000000000..75efb711d6
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/russian/encodings.alias
@@ -0,0 +1,5 @@
+# alias real-name
+iso8859-1 koi8-r
+windows-1251 ibm-1251
+cp-866 ibm-866
+
diff --git a/fonts/utilities/ttf2pt1/encodings/russian/ibm-1251.tbl b/fonts/utilities/ttf2pt1/encodings/russian/ibm-1251.tbl
new file mode 100644
index 0000000000..28f2de4d5f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/russian/ibm-1251.tbl
@@ -0,0 +1,128 @@
+rus_A 192
+rus_BE 193
+rus_CHE 215
+rus_DE 196
+rus_E 221
+rus_EF 212
+rus_EL 203
+rus_EM 204
+rus_EN 205
+rus_ER 208
+rus_ES 209
+rus_GHE 195
+rus_HA 213
+rus_HARDSIGN 218
+rus_I 200
+rus_IE 197
+rus_KA 202
+rus_O 206
+rus_PE 207
+rus_SHA 216
+rus_SHCHA 217
+rus_SHORTI 201
+rus_SOFTSIGN 220
+rus_TE 210
+rus_TSE 214
+rus_U 211
+rus_VE 194
+rus_YA 223
+rus_YERU 219
+rus_YO 168
+rus_YU 222
+rus_ZE 199
+rus_ZHE 198
+rus_a 224
+rus_be 225
+rus_che 247
+rus_de 228
+rus_e 253
+rus_ef 244
+rus_el 235
+rus_em 236
+rus_en 237
+rus_er 240
+rus_es 241
+rus_g_100pc 141
+rus_g_25pc 144
+rus_g_50pc 145
+rus_g_75pc 146
+rus_g_LD 179
+rus_g_LR 160
+rus_g_LRD 163
+rus_g_LRT 187
+rus_g_LRTD 190
+rus_g_LRd 182
+rus_g_LRt 185
+rus_g_LRtd 188
+rus_g_LT 174
+rus_g_LTD 181
+rus_g_Ld 166
+rus_g_Lt 172
+rus_g_Ltd 178
+rus_g_RD 165
+rus_g_RT 171
+rus_g_RTD 177
+rus_g_Rd 162
+rus_g_Rt 170
+rus_g_Rtd 175
+rus_g_TD 161
+rus_g_copyright 191
+rus_g_degree 156
+rus_g_dintegral 155
+rus_g_divide 159
+rus_g_equal 151
+rus_g_fatdot 149
+rus_g_ge 153
+rus_g_lD 167
+rus_g_lT 173
+rus_g_lTD 180
+rus_g_ld 131
+rus_g_le 152
+rus_g_leandot 158
+rus_g_lefthalf 142
+rus_g_lowerhalf 140
+rus_g_lr 128
+rus_g_lrD 183
+rus_g_lrT 186
+rus_g_lrTD 189
+rus_g_lrd 136
+rus_g_lrt 137
+rus_g_lrtd 138
+rus_g_lt 133
+rus_g_ltd 135
+rus_g_power2 157
+rus_g_rD 164
+rus_g_rT 169
+rus_g_rTD 176
+rus_g_rd 130
+rus_g_righthalf 143
+rus_g_root 150
+rus_g_rt 132
+rus_g_rtd 134
+rus_g_space 154
+rus_g_square 148
+rus_g_td 129
+rus_g_tintegral 147
+rus_g_upperhalf 139
+rus_ghe 227
+rus_ha 245
+rus_hardsign 250
+rus_i 232
+rus_ie 229
+rus_ka 234
+rus_o 238
+rus_pe 239
+rus_sha 248
+rus_shcha 249
+rus_shorti 233
+rus_softsign 252
+rus_te 242
+rus_tse 246
+rus_u 243
+rus_ve 226
+rus_ya 255
+rus_yeru 251
+rus_yo 184
+rus_yu 254
+rus_ze 231
+rus_zhe 230
diff --git a/fonts/utilities/ttf2pt1/encodings/russian/ibm-866.tbl b/fonts/utilities/ttf2pt1/encodings/russian/ibm-866.tbl
new file mode 100644
index 0000000000..986aa92fc5
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/russian/ibm-866.tbl
@@ -0,0 +1,128 @@
+rus_A 128
+rus_BE 129
+rus_CHE 151
+rus_DE 132
+rus_E 157
+rus_EF 148
+rus_EL 139
+rus_EM 140
+rus_EN 141
+rus_ER 144
+rus_ES 145
+rus_GHE 131
+rus_HA 149
+rus_HARDSIGN 154
+rus_I 136
+rus_IE 133
+rus_KA 138
+rus_O 142
+rus_PE 143
+rus_SHA 152
+rus_SHCHA 153
+rus_SHORTI 137
+rus_SOFTSIGN 156
+rus_TE 146
+rus_TSE 150
+rus_U 147
+rus_VE 130
+rus_YA 159
+rus_YERU 155
+rus_YO 240
+rus_YU 158
+rus_ZE 135
+rus_ZHE 134
+rus_a 160
+rus_be 161
+rus_che 231
+rus_de 164
+rus_e 237
+rus_ef 228
+rus_el 171
+rus_em 172
+rus_en 173
+rus_er 224
+rus_es 225
+rus_g_100pc 219
+rus_g_25pc 178
+rus_g_50pc 177
+rus_g_75pc 176
+rus_g_LD 187
+rus_g_LR 205
+rus_g_LRD 203
+rus_g_LRT 202
+rus_g_LRTD 206
+rus_g_LRd 209
+rus_g_LRt 207
+rus_g_LRtd 216
+rus_g_LT 188
+rus_g_LTD 185
+rus_g_Ld 184
+rus_g_Lt 190
+rus_g_Ltd 181
+rus_g_RD 201
+rus_g_RT 200
+rus_g_RTD 204
+rus_g_Rd 213
+rus_g_Rt 212
+rus_g_Rtd 198
+rus_g_TD 186
+rus_g_copyright 252
+rus_g_degree 248
+rus_g_dintegral 245
+rus_g_divide 246
+rus_g_equal 247
+rus_g_fatdot 249
+rus_g_ge 242
+rus_g_lD 183
+rus_g_lT 189
+rus_g_lTD 182
+rus_g_ld 191
+rus_g_le 243
+rus_g_leandot 250
+rus_g_lefthalf 221
+rus_g_lowerhalf 220
+rus_g_lr 196
+rus_g_lrD 210
+rus_g_lrT 208
+rus_g_lrTD 215
+rus_g_lrd 194
+rus_g_lrt 193
+rus_g_lrtd 197
+rus_g_lt 217
+rus_g_ltd 180
+rus_g_power2 253
+rus_g_rD 214
+rus_g_rT 211
+rus_g_rTD 199
+rus_g_rd 218
+rus_g_righthalf 222
+rus_g_root 251
+rus_g_rt 192
+rus_g_rtd 195
+rus_g_space 255
+rus_g_square 254
+rus_g_td 179
+rus_g_tintegral 244
+rus_g_upperhalf 223
+rus_ghe 163
+rus_ha 229
+rus_hardsign 234
+rus_i 168
+rus_ie 165
+rus_ka 170
+rus_o 174
+rus_pe 175
+rus_sha 232
+rus_shcha 233
+rus_shorti 169
+rus_softsign 236
+rus_te 226
+rus_tse 230
+rus_u 227
+rus_ve 162
+rus_ya 239
+rus_yeru 235
+rus_yo 241
+rus_yu 238
+rus_ze 167
+rus_zhe 166
diff --git a/fonts/utilities/ttf2pt1/encodings/russian/iso8859-5.tbl b/fonts/utilities/ttf2pt1/encodings/russian/iso8859-5.tbl
new file mode 100644
index 0000000000..430fceb5ba
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/russian/iso8859-5.tbl
@@ -0,0 +1,128 @@
+rus_A 176
+rus_BE 177
+rus_CHE 199
+rus_DE 180
+rus_E 205
+rus_EF 196
+rus_EL 187
+rus_EM 188
+rus_EN 189
+rus_ER 192
+rus_ES 193
+rus_GHE 179
+rus_HA 197
+rus_HARDSIGN 202
+rus_I 184
+rus_IE 181
+rus_KA 186
+rus_O 190
+rus_PE 191
+rus_SHA 200
+rus_SHCHA 201
+rus_SHORTI 185
+rus_SOFTSIGN 204
+rus_TE 194
+rus_TSE 198
+rus_U 195
+rus_VE 178
+rus_YA 207
+rus_YERU 203
+rus_YO 240
+rus_YU 206
+rus_ZE 183
+rus_ZHE 182
+rus_a 208
+rus_be 209
+rus_che 231
+rus_de 212
+rus_e 237
+rus_ef 228
+rus_el 219
+rus_em 220
+rus_en 221
+rus_er 224
+rus_es 225
+rus_g_100pc 171
+rus_g_25pc 130
+rus_g_50pc 129
+rus_g_75pc 128
+rus_g_LD 139
+rus_g_LR 157
+rus_g_LRD 155
+rus_g_LRT 154
+rus_g_LRTD 158
+rus_g_LRd 161
+rus_g_LRt 159
+rus_g_LRtd 168
+rus_g_LT 140
+rus_g_LTD 137
+rus_g_Ld 136
+rus_g_Lt 142
+rus_g_Ltd 133
+rus_g_RD 153
+rus_g_RT 152
+rus_g_RTD 156
+rus_g_Rd 165
+rus_g_Rt 164
+rus_g_Rtd 150
+rus_g_TD 138
+rus_g_copyright 252
+rus_g_degree 248
+rus_g_dintegral 245
+rus_g_divide 246
+rus_g_equal 247
+rus_g_fatdot 249
+rus_g_ge 242
+rus_g_lD 135
+rus_g_lT 141
+rus_g_lTD 134
+rus_g_ld 143
+rus_g_le 243
+rus_g_leandot 250
+rus_g_lefthalf 173
+rus_g_lowerhalf 172
+rus_g_lr 148
+rus_g_lrD 162
+rus_g_lrT 160
+rus_g_lrTD 167
+rus_g_lrd 146
+rus_g_lrt 145
+rus_g_lrtd 149
+rus_g_lt 169
+rus_g_ltd 132
+rus_g_power2 253
+rus_g_rD 166
+rus_g_rT 163
+rus_g_rTD 151
+rus_g_rd 170
+rus_g_righthalf 174
+rus_g_root 251
+rus_g_rt 144
+rus_g_rtd 147
+rus_g_space 255
+rus_g_square 254
+rus_g_td 131
+rus_g_tintegral 244
+rus_g_upperhalf 175
+rus_ghe 211
+rus_ha 229
+rus_hardsign 234
+rus_i 216
+rus_ie 213
+rus_ka 218
+rus_o 222
+rus_pe 223
+rus_sha 232
+rus_shcha 233
+rus_shorti 217
+rus_softsign 236
+rus_te 226
+rus_tse 230
+rus_u 227
+rus_ve 210
+rus_ya 239
+rus_yeru 235
+rus_yo 241
+rus_yu 238
+rus_ze 215
+rus_zhe 214
diff --git a/fonts/utilities/ttf2pt1/encodings/russian/koi8-r.tbl b/fonts/utilities/ttf2pt1/encodings/russian/koi8-r.tbl
new file mode 100644
index 0000000000..509e699e32
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/encodings/russian/koi8-r.tbl
@@ -0,0 +1,128 @@
+rus_A 225
+rus_BE 226
+rus_CHE 254
+rus_DE 228
+rus_E 252
+rus_EF 230
+rus_EL 236
+rus_EM 237
+rus_EN 238
+rus_ER 242
+rus_ES 243
+rus_GHE 231
+rus_HA 232
+rus_HARDSIGN 255
+rus_I 233
+rus_IE 229
+rus_KA 235
+rus_O 239
+rus_PE 240
+rus_SHA 251
+rus_SHCHA 253
+rus_SHORTI 234
+rus_SOFTSIGN 248
+rus_TE 244
+rus_TSE 227
+rus_U 245
+rus_VE 247
+rus_YA 241
+rus_YERU 249
+rus_YO 179
+rus_YU 224
+rus_ZE 250
+rus_ZHE 246
+rus_a 193
+rus_be 194
+rus_che 222
+rus_de 196
+rus_e 220
+rus_ef 198
+rus_el 204
+rus_em 205
+rus_en 206
+rus_er 210
+rus_es 211
+rus_g_100pc 141
+rus_g_25pc 144
+rus_g_50pc 145
+rus_g_75pc 146
+rus_g_LD 168
+rus_g_LR 160
+rus_g_LRD 184
+rus_g_LRT 187
+rus_g_LRTD 190
+rus_g_LRd 182
+rus_g_LRt 185
+rus_g_LRtd 188
+rus_g_LT 174
+rus_g_LTD 181
+rus_g_Ld 166
+rus_g_Lt 172
+rus_g_Ltd 178
+rus_g_RD 165
+rus_g_RT 171
+rus_g_RTD 177
+rus_g_Rd 162
+rus_g_Rt 170
+rus_g_Rtd 175
+rus_g_TD 161
+rus_g_copyright 191
+rus_g_degree 156
+rus_g_dintegral 155
+rus_g_divide 159
+rus_g_equal 151
+rus_g_fatdot 149
+rus_g_ge 153
+rus_g_lD 167
+rus_g_lT 173
+rus_g_lTD 180
+rus_g_ld 131
+rus_g_le 152
+rus_g_leandot 158
+rus_g_lefthalf 142
+rus_g_lowerhalf 140
+rus_g_lr 128
+rus_g_lrD 183
+rus_g_lrT 186
+rus_g_lrTD 189
+rus_g_lrd 136
+rus_g_lrt 137
+rus_g_lrtd 138
+rus_g_lt 133
+rus_g_ltd 135
+rus_g_power2 157
+rus_g_rD 164
+rus_g_rT 169
+rus_g_rTD 176
+rus_g_rd 130
+rus_g_righthalf 143
+rus_g_root 150
+rus_g_rt 132
+rus_g_rtd 134
+rus_g_space 154
+rus_g_square 148
+rus_g_td 129
+rus_g_tintegral 147
+rus_g_upperhalf 139
+rus_ghe 199
+rus_ha 200
+rus_hardsign 223
+rus_i 201
+rus_ie 197
+rus_ka 203
+rus_o 207
+rus_pe 208
+rus_sha 219
+rus_shcha 221
+rus_shorti 202
+rus_softsign 216
+rus_te 212
+rus_tse 195
+rus_u 213
+rus_ve 215
+rus_ya 209
+rus_yeru 217
+rus_yo 163
+rus_yu 192
+rus_ze 218
+rus_zhe 214
diff --git a/fonts/utilities/ttf2pt1/ft.c b/fonts/utilities/ttf2pt1/ft.c
new file mode 100644
index 0000000000..332b5083b0
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ft.c
@@ -0,0 +1,639 @@
+/*
+ * The font parser using the FreeType library version 2.
+ *
+ * see COPYRIGHT
+ *
+ */
+
+#ifdef USE_FREETYPE
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <freetype/freetype.h>
+#include <freetype/ftglyph.h>
+#include <freetype/ftnames.h>
+#include <freetype/ttnameid.h>
+#include <freetype/ftoutln.h>
+#include "pt1.h"
+#include "global.h"
+
+/* prototypes of call entries */
+static void openfont(char *fname, char *arg);
+static void closefont( void);
+static int getnglyphs ( void);
+static int glnames( GLYPH *glyph_list);
+static void glmetrics( GLYPH *glyph_list);
+static int glenc( GLYPH *glyph_list, int *encoding, int *unimap);
+static void fnmetrics( struct font_metrics *fm);
+static void glpath( int glyphno, GLYPH *glyph_list);
+static void kerning( GLYPH *glyph_list);
+
+/* globals */
+
+/* front-end descriptor */
+struct frontsw freetype_sw = {
+ /*name*/ "ft",
+ /*descr*/ "based on the FreeType library",
+ /*suffix*/ { "ttf", "otf", "pfa", "pfb" },
+ /*open*/ openfont,
+ /*close*/ closefont,
+ /*nglyphs*/ getnglyphs,
+ /*glnames*/ glnames,
+ /*glmetrics*/ glmetrics,
+ /*glenc*/ glenc,
+ /*fnmetrics*/ fnmetrics,
+ /*glpath*/ glpath,
+ /*kerning*/ kerning,
+};
+
+/* statics */
+
+static char * dupcnstring( char *s, int len);
+
+static FT_Library library;
+static FT_Face face;
+
+static int enc_type, enc_found;
+
+/* SFNT functions do not seem to be included by default in FT2beta8 */
+#define ENABLE_SFNT
+
+/*
+ * Open font and prepare to return information to the main driver.
+ * May print error and warning messages.
+ * Exit on error.
+ */
+
+static void
+openfont(
+ char *fname,
+ char *arg /* unused now */
+)
+{
+ FT_Error error;
+
+ if( FT_Init_FreeType( &library ) ) {
+ fprintf(stderr, "** FreeType initialization failed\n");
+ exit(1);
+ }
+
+ if( error = FT_New_Face( library, fname, 0, &face ) ) {
+ if ( error == FT_Err_Unknown_File_Format )
+ fprintf(stderr, "**** %s has format unknown to FreeType\n", fname);
+ else
+ fprintf(stderr, "**** Cannot access %s ****\n", fname);
+ exit(1);
+ }
+
+ if(FT_HAS_FIXED_SIZES(face)) {
+ WARNING_1 fprintf(stderr, "Font contains bitmaps\n");
+ }
+ if(FT_HAS_MULTIPLE_MASTERS(face)) {
+ WARNING_1 fprintf(stderr, "Font contains multiple masters, using default\n");
+ }
+
+ if(ISDBG(FT)) fprintf(stderr," %d units per EM\n", face->units_per_EM);
+
+ enc_found = 0;
+}
+
+/*
+ * Close font.
+ * Exit on error.
+ */
+
+static void
+closefont(
+ void
+)
+{
+ if( FT_Done_Face(face) ) {
+ WARNING_1 fprintf(stderr, "Errors when closing the font file, ignored\n");
+ }
+ if( FT_Done_FreeType(library) ) {
+ WARNING_1 fprintf(stderr, "Errors when stopping FreeType, ignored\n");
+ }
+}
+
+/*
+ * Get the number of glyphs in font.
+ */
+
+static int
+getnglyphs (
+ void
+)
+{
+ if(ISDBG(FT)) fprintf(stderr, "%d glyphs in font\n", face->num_glyphs);
+ return (int)face->num_glyphs;
+}
+
+/*
+ * Get the names of the glyphs.
+ * Returns 0 if the names were assigned, non-zero if the font
+ * provides no glyph names.
+ */
+
+static int
+glnames(
+ GLYPH *glyph_list
+)
+{
+#define MAX_NAMELEN 1024
+ unsigned char bf[1024];
+ int i;
+
+ if( ! FT_HAS_GLYPH_NAMES(face) ) {
+ WARNING_1 fprintf(stderr, "Font has no glyph names\n");
+ return 1;
+ }
+
+ for(i=0; i < face->num_glyphs; i++) {
+ if( FT_Get_Glyph_Name(face, i, bf, MAX_NAMELEN) || bf[0]==0 ) {
+ sprintf(bf, "_%d", i);
+ WARNING_2 fprintf(stderr,
+ "**** Glyph No. %d has no postscript name, becomes %s ****\n",
+ i, bf);
+ }
+ glyph_list[i].name = strdup(bf);
+ if(ISDBG(FT)) fprintf(stderr, "%d has name %s\n", i, bf);
+ if (glyph_list[i].name == NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+ }
+ return 0;
+}
+
+/*
+ * Get the metrics of the glyphs.
+ */
+
+static void
+glmetrics(
+ GLYPH *glyph_list
+)
+{
+ GLYPH *g;
+ int i;
+ FT_Glyph_Metrics *met;
+ FT_BBox bbox;
+ FT_Glyph gly;
+
+ for(i=0; i < face->num_glyphs; i++) {
+ g = &(glyph_list[i]);
+
+ if( FT_Load_Glyph(face, i, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE) ) {
+ fprintf(stderr, "Can't load glyph %s, skipped\n", g->name);
+ continue;
+ }
+
+ met = &face->glyph->metrics;
+
+ if(FT_HAS_HORIZONTAL(face)) {
+ g->width = met->horiAdvance;
+ g->lsb = met->horiBearingX;
+ } else {
+ WARNING_2 fprintf(stderr, "Glyph %s has no horizontal metrics, guessed them\n", g->name);
+ g->width = met->width;
+ g->lsb = 0;
+ }
+
+ if( FT_Get_Glyph(face->glyph, &gly) ) {
+ fprintf(stderr, "Can't access glyph %s bbox, skipped\n", g->name);
+ continue;
+ }
+
+ FT_Glyph_Get_CBox(gly, ft_glyph_bbox_unscaled, &bbox);
+ g->xMin = bbox.xMin;
+ g->yMin = bbox.yMin;
+ g->xMax = bbox.xMax;
+ g->yMax = bbox.yMax;
+
+ g->ttf_pathlen = face->glyph->outline.n_points;
+ }
+}
+
+/*
+ * Get the original encoding of the font.
+ * Returns 1 for if the original encoding is Unicode, 2 if the
+ * original encoding is other 16-bit, 0 if 8-bit.
+ */
+
+static int
+glenc(
+ GLYPH *glyph_list,
+ int *encoding,
+ int *unimap
+)
+{
+ int i, e;
+ unsigned code;
+
+ if(ISDBG(FT))
+ for(e=0; e < face->num_charmaps; e++) {
+ fprintf(stderr, "found encoding pid=%d eid=%d\n",
+ face->charmaps[e]->platform_id,
+ face->charmaps[e]->encoding_id);
+ }
+
+ if(enc_found)
+ goto populate_map;
+
+ enc_type = 0;
+
+ /* first check for an explicit PID/EID */
+
+ if(force_pid != -1) {
+ for(e=0; e < face->num_charmaps; e++) {
+ if(face->charmaps[e]->platform_id == force_pid
+ && face->charmaps[e]->encoding_id == force_eid) {
+ WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n",
+ force_pid, force_eid);
+ if( FT_Set_Charmap(face, face->charmaps[e]) ) {
+ fprintf(stderr, "**** Cannot set charmap in FreeType ****\n");
+ exit(1);
+ }
+ enc_type = 1;
+ goto populate_map;
+ }
+ }
+ fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n",
+ force_pid, force_eid);
+ exit(1);
+ }
+
+ /* next check for a direct Adobe mapping */
+
+ if(!forceunicode) {
+ for(e=0; e < face->num_charmaps; e++) {
+ if(face->charmaps[e]->encoding == ft_encoding_adobe_custom) {
+ WARNING_1 fputs("Found Adobe Custom Encoding\n", stderr);
+ if( FT_Set_Charmap(face, face->charmaps[e]) ) {
+ fprintf(stderr, "**** Cannot set charmap in FreeType ****\n");
+ exit(1);
+ }
+ goto populate_map;
+ }
+ }
+ }
+
+ for(e=0; e < face->num_charmaps; e++) {
+ if(face->charmaps[e]->platform_id == 3) {
+ switch(face->charmaps[e]->encoding_id) {
+ case 0:
+ WARNING_1 fputs("Found Symbol Encoding\n", stderr);
+ break;
+ case 1:
+ WARNING_1 fputs("Found Unicode Encoding\n", stderr);
+ enc_type = 1;
+ break;
+ default:
+ WARNING_1 {
+ fprintf(stderr,
+ "****MS Encoding ID %d not supported****\n",
+ face->charmaps[e]->encoding_id);
+ fputs("Treating it like Symbol encoding\n", stderr);
+ }
+ break;
+ }
+ break;
+ }
+ }
+ if(e >= face->num_charmaps) {
+ WARNING_1 fputs("No Microsoft encoding, using first encoding available\n", stderr);
+ e = 0;
+ }
+ if(forceunicode) {
+ WARNING_1 fputs("Forcing Unicode Encoding\n", stderr);
+ }
+
+ if( FT_Set_Charmap(face, face->charmaps[e]) ) {
+ fprintf(stderr, "**** Cannot set charmap in FreeType ****\n");
+ exit(1);
+ }
+
+populate_map:
+ enc_found = 1;
+ for(i=0; i<256; i++) {
+ if(encoding[i] != -1)
+ continue;
+ if(enc_type == 1 || forceunicode) {
+ code = unimap[i];
+ if(code == (unsigned) -1)
+ continue;
+ } else
+ code = i;
+
+ code = FT_Get_Char_Index(face, code);
+ if(0 && ISDBG(FT)) fprintf(stderr, "code of %3d is %3d\n", i, code);
+ if(code == 0)
+ continue; /* .notdef */
+ encoding[i] = code;
+ }
+
+ return enc_type;
+}
+
+/* duplicate a string with counter to a 0-terminated string */
+static char *
+dupcnstring(
+ char *s,
+ int len
+)
+{
+ char *res;
+
+ if(( res = malloc(len+1) )==NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+
+ memcpy(res, s, len);
+ res[len] = 0;
+ return res;
+}
+
+/*
+ * Get the font metrics
+ */
+static void
+fnmetrics(
+ struct font_metrics *fm
+)
+{
+ char *str;
+ static char *fieldstocheck[3];
+#ifdef ENABLE_SFNT
+ FT_SfntName sn;
+#endif /* ENABLE_SFNT */
+ int i;
+
+ fm->italic_angle = 0.0; /* FreeType hides the angle */
+ fm->underline_position = face->underline_position;
+ fm->underline_thickness = face->underline_thickness;
+ fm->is_fixed_pitch = FT_IS_FIXED_WIDTH(face);
+
+ fm->ascender = face->ascender;
+ fm->descender = face->descender;
+
+ fm->units_per_em = face->units_per_EM;
+
+ fm->bbox[0] = face->bbox.xMin;
+ fm->bbox[1] = face->bbox.yMin;
+ fm->bbox[2] = face->bbox.xMax;
+ fm->bbox[3] = face->bbox.yMax;
+
+#ifdef ENABLE_SFNT
+ if( FT_Get_Sfnt_Name(face, TT_NAME_ID_COPYRIGHT, &sn) )
+#endif /* ENABLE_SFNT */
+ fm->name_copyright = "";
+#ifdef ENABLE_SFNT
+ else
+ fm->name_copyright = dupcnstring(sn.string, sn.string_len);
+#endif /* ENABLE_SFNT */
+
+ fm->name_family = face->family_name;
+
+ fm->name_style = face->style_name;
+ if(fm->name_style == NULL)
+ fm->name_style = "";
+
+#ifdef ENABLE_SFNT
+ if( FT_Get_Sfnt_Name(face, TT_NAME_ID_FULL_NAME, &sn) )
+#endif /* ENABLE_SFNT */
+ {
+ int len;
+
+ len = strlen(fm->name_family) + strlen(fm->name_style) + 2;
+ if(( fm->name_full = malloc(len) )==NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+ strcpy(fm->name_full, fm->name_family);
+ if(strlen(fm->name_style) != 0) {
+ strcat(fm->name_full, " ");
+ strcat(fm->name_full, fm->name_style);
+ }
+ }
+#ifdef ENABLE_SFNT
+ else
+ fm->name_full = dupcnstring(sn.string, sn.string_len);
+#endif /* ENABLE_SFNT */
+
+#ifdef ENABLE_SFNT
+ if( FT_Get_Sfnt_Name(face, TT_NAME_ID_VERSION_STRING, &sn) )
+#endif /* ENABLE_SFNT */
+ fm->name_version = "1.0";
+#ifdef ENABLE_SFNT
+ else
+ fm->name_version = dupcnstring(sn.string, sn.string_len);
+#endif /* ENABLE_SFNT */
+
+#ifdef ENABLE_SFNT
+ if( FT_Get_Sfnt_Name(face, TT_NAME_ID_PS_NAME , &sn) ) {
+#endif /* ENABLE_SFNT */
+ if(( fm->name_ps = strdup(fm->name_full) )==NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+#ifdef ENABLE_SFNT
+ } else
+ fm->name_ps = dupcnstring(sn.string, sn.string_len);
+#endif /* ENABLE_SFNT */
+
+ /* guess the boldness from the font names */
+ fm->force_bold=0;
+
+ fieldstocheck[0] = fm->name_style;
+ fieldstocheck[1] = fm->name_full;
+ fieldstocheck[2] = fm->name_ps;
+
+ for(i=0; !fm->force_bold && i<sizeof fieldstocheck /sizeof(fieldstocheck[0]); i++) {
+ str=fieldstocheck[i];
+ for(i=0; str[i]!=0; i++) {
+ if( (str[i]=='B'
+ || str[i]=='b'
+ && ( i==0 || !isalpha(str[i-1]) )
+ )
+ && !strncmp("old",&str[i+1],3)
+ && !islower(str[i+4])
+ ) {
+ fm->force_bold=1;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * Functions to decompose the outlines
+ */
+
+static GLYPH *curg;
+static double lastx, lasty;
+
+static int
+outl_moveto(
+ FT_Vector *to,
+ void *unused
+)
+{
+ double tox, toy;
+
+ tox = fscale((double)to->x); toy = fscale((double)to->y);
+
+ /* FreeType does not do explicit closepath() */
+ if(curg->lastentry) {
+ g_closepath(curg);
+ }
+ fg_rmoveto(curg, tox, toy);
+ lastx = tox; lasty = toy;
+
+ return 0;
+}
+
+static int
+outl_lineto(
+ FT_Vector *to,
+ void *unused
+)
+{
+ double tox, toy;
+
+ tox = fscale((double)to->x); toy = fscale((double)to->y);
+
+ fg_rlineto(curg, tox, toy);
+ lastx = tox; lasty = toy;
+
+ return 0;
+}
+
+static int
+outl_conicto(
+ FT_Vector *control1,
+ FT_Vector *to,
+ void *unused
+)
+{
+ double c1x, c1y, tox, toy;
+
+ c1x = fscale((double)control1->x); c1y = fscale((double)control1->y);
+ tox = fscale((double)to->x); toy = fscale((double)to->y);
+
+ fg_rrcurveto(curg,
+ (lastx + 2.0 * c1x) / 3.0, (lasty + 2.0 * c1y) / 3.0,
+ (2.0 * c1x + tox) / 3.0, (2.0 * c1y + toy) / 3.0,
+ tox, toy );
+ lastx = tox; lasty = toy;
+
+ return 0;
+}
+
+static int
+outl_cubicto(
+ FT_Vector *control1,
+ FT_Vector *control2,
+ FT_Vector *to,
+ void *unused
+)
+{
+ double c1x, c1y, c2x, c2y, tox, toy;
+
+ c1x = fscale((double)control1->x); c1y = fscale((double)control1->y);
+ c2x = fscale((double)control2->x); c2y = fscale((double)control2->y);
+ tox = fscale((double)to->x); toy = fscale((double)to->y);
+
+ fg_rrcurveto(curg, c1x, c1y, c2x, c2y, tox, toy);
+ lastx = tox; lasty = toy;
+
+ return 0;
+}
+
+static FT_Outline_Funcs ft_outl_funcs = {
+ outl_moveto,
+ outl_lineto,
+ outl_conicto,
+ outl_cubicto,
+ 0,
+ 0
+};
+
+/*
+ * Get the path of contrours for a glyph.
+ */
+
+static void
+glpath(
+ int glyphno,
+ GLYPH *glyf_list
+)
+{
+ FT_Outline *ol;
+
+ curg = &glyf_list[glyphno];
+
+ if( FT_Load_Glyph(face, glyphno, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING)
+ || face->glyph->format != ft_glyph_format_outline ) {
+ fprintf(stderr, "Can't load glyph %s, skipped\n", curg->name);
+ return;
+ }
+
+ ol = &face->glyph->outline;
+ lastx = 0.0; lasty = 0.0;
+
+ if( FT_Outline_Decompose(ol, &ft_outl_funcs, NULL) ) {
+ fprintf(stderr, "Can't decompose outline of glyph %s, skipped\n", curg->name);
+ return;
+ }
+
+ /* FreeType does not do explicit closepath() */
+ if(curg->lastentry) {
+ g_closepath(curg);
+ }
+
+ if(ol->flags & ft_outline_reverse_fill) {
+ assertpath(curg->entries, __FILE__, __LINE__, curg->name);
+ reversepaths(curg);
+ }
+}
+
+/*
+ * Get the kerning data.
+ */
+
+static void
+kerning(
+ GLYPH *glyph_list
+)
+{
+ int i, j, n;
+ int nglyphs = face->num_glyphs;
+ FT_Vector k;
+ GLYPH *gl;
+
+ if( nglyphs == 0 || !FT_HAS_KERNING(face) ) {
+ WARNING_1 fputs("No Kerning data\n", stderr);
+ return;
+ }
+
+ for(i=0; i<nglyphs; i++) {
+ if( (glyph_list[i].flags & GF_USED) ==0)
+ continue;
+ for(j=0; j<nglyphs; j++) {
+ if( (glyph_list[j].flags & GF_USED) ==0)
+ continue;
+ if( FT_Get_Kerning(face, i, j, ft_kerning_unscaled, &k) )
+ continue;
+ if( k.x == 0 )
+ continue;
+
+ addkernpair(i, j, k.x);
+ }
+ }
+}
+
+#endif
diff --git a/fonts/utilities/ttf2pt1/global.h b/fonts/utilities/ttf2pt1/global.h
new file mode 100644
index 0000000000..fe990cbcc9
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/global.h
@@ -0,0 +1,157 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+/* options */
+
+extern int encode; /* encode the resulting file */
+extern int pfbflag; /* produce compressed file */
+extern int wantafm; /* want to see .afm instead of .t1a on stdout */
+extern int correctvsize; /* try to correct the vertical size of characters */
+extern int wantuid; /* user wants UniqueID entry in the font */
+extern int allglyphs; /* convert all glyphs, not only 256 of them */
+extern int warnlevel; /* the level of permitted warnings */
+extern int forceunicode; /* consider any fonr as Unicode for mapping purposes */
+/* options - maximal limits */
+extern int max_stemdepth; /* maximal depth of stem stack in interpreter */
+/* options - debugging */
+extern int absolute; /* print out in absolute values */
+extern int reverse; /* reverse font to Type1 path directions */
+/* options - suboptions of Outline Processing */
+extern int optimize; /* enables space optimization */
+extern int smooth; /* enable smoothing of outlines */
+extern int transform; /* enables transformation to 1000x1000 matrix */
+extern int hints; /* enables autogeneration of hints */
+extern int subhints; /* enables autogeneration of substituted hints */
+extern int trybold; /* try to guess whether the font is bold */
+extern int correctwidth; /* try to correct the character width */
+
+/* not quite options to select a particular source encoding */
+extern int force_pid; /* specific platform id */
+extern int force_eid; /* specific encoding id */
+
+/* other globals */
+extern FILE *pfa_file, *afm_file;
+extern int numglyphs;
+
+/* warnings */
+
+#define WARNING_1 if(warnlevel >= 1)
+#define WARNING_2 if(warnlevel >= 2)
+#define WARNING_3 if(warnlevel >= 3)
+#define WARNING_4 if(warnlevel >= 4)
+
+/*
+ * Bitmap control macros
+ */
+
+#define BITMAP_BYTES(size) (((size)+7)>>3)
+#define DEF_BITMAP(name, size) unsigned char name[BITMAP_BYTES(size)]
+#define SET_BITMAP(name, bit) ( name[(bit)>>3] |= (1<<((bit)&7)) )
+#define CLR_BITMAP(name, bit) ( name[(bit)>>3] &= ~(1<<((bit)&7)) )
+#define IS_BITMAP(name, bit) ( name[(bit)>>3] & (1<<((bit)&7)) )
+
+/* debugging */
+
+/* debug flags */
+#define DEBUG_UNICODE 0x00000001 /* unicode to 8-bit code conversion */
+#define DEBUG_MAINSTEMS 0x00000002 /* glyph-wide main stem generation */
+#define DEBUG_SUBSTEMS 0x00000004 /* substituted stem generation */
+#define DEBUG_STEMS (DEBUG_MAINSTEMS|DEBUG_SUBSTEMS)
+#define DEBUG_REVERSAL 0x00000008 /* reversal of the paths */
+#define DEBUG_FIXCVDIR 0x00000010 /* fixcvdir() */
+#define DEBUG_STEMOVERLAP 0x00000020 /* stemoverlap() */
+#define DEBUG_BLUESTEMS 0x00000040 /* markbluestems() */
+#define DEBUG_STRAIGHTEN 0x00000080 /* markbluestems() */
+#define DEBUG_EXTMAP 0x00000100 /* parsing of external map */
+#define DEBUG_TOINT 0x00000200 /* conversion of path to integer */
+#define DEBUG_BUILDG 0x00000400 /* building of glyph path */
+#define DEBUG_QUAD 0x00000800 /* splitting curves by quadrants */
+#define DEBUG_SQEQ 0x00001000 /* square equation solver */
+#define DEBUG_COMPOSITE 0x00002000 /* handling of composite glyphs */
+#define DEBUG_FCONCISE 0x00004000 /* normalization of curves */
+#define DEBUG_FT 0x00008000 /* FreeType front-end */
+#define DEBUG_DISABLED 0x80000000 /* special flag: temporary disable debugging */
+
+/* at what we want to look now */
+#ifndef DEBUG
+# define DEBUG (0)
+#endif
+
+/* uncomment the next line if debugging data is wanted for one glyph only */
+/* #define DBG_GLYPH "_517" /* */
+
+#if DEBUG==0
+# define ISDBG(name) (0)
+# define ENABLEDBG(condition) (0)
+# define DISABLEDBG(condition) (0)
+#else
+ extern int debug; /* collection of the flags */
+/* this ISDBG will only work on ANSI C, not K&R */
+# define ISDBG(name) ( (debug & DEBUG_DISABLED) ? 0 : (debug & (DEBUG_##name)) )
+# define ENABLEDBG(condition) ( (condition) ? (debug&=~DEBUG_DISABLED) : 0 )
+# define DISABLEDBG(condition) ( (condition) ? (debug|=DEBUG_DISABLED) : 0 )
+#endif
+
+#ifdef DBG_GLYPH
+# define DBG_TO_GLYPH(g) DISABLEDBG( strcmp( (g)->name, DBG_GLYPH ) )
+# define DBG_FROM_GLYPH(g) ENABLEDBG(1)
+#else
+# define DBG_TO_GLYPH(g) (0)
+# define DBG_FROM_GLYPH(g) (0)
+#endif
+
+/* prototypes */
+int iscale( int val);
+double fscale( double val);
+int unicode_rev_lookup( int unival);
+
+/* global metrics for a font */
+
+struct font_metrics {
+ /* post */
+ double italic_angle;
+ short underline_position;
+ short underline_thickness;
+ short is_fixed_pitch;
+
+ /* hhea */
+ short ascender;
+ short descender;
+
+ /* head */
+ unsigned short units_per_em;
+ short bbox[4];
+
+ /* name */
+ char *name_copyright;
+ char *name_family;
+ char *name_style;
+ char *name_full;
+ char *name_version;
+ char *name_ps;
+
+ /* other */
+ int force_bold;
+};
+
+/* switch table structure for front-ends */
+
+#define MAXSUFFIX 10
+
+struct frontsw {
+ char *name; /* name of the front end */
+ char *descr; /* description of the front end */
+ char *suffix[MAXSUFFIX]; /* possible file name suffixes */
+
+ void (*open)(char *fname, char *arg); /* open font file */
+ void (*close)(void); /* close font file */
+ int (*nglyphs)(void); /* get the number of glyphs */
+ int (*glnames)(GLYPH *glyphs); /* get the names of glyphs */
+ void (*glmetrics)(GLYPH *glyphs); /* get the metrics of glyphs */
+ int (*glenc)(GLYPH *glyphs, int *enc, int *unimap); /* get the encoding */
+ void (*fnmetrics)(struct font_metrics *fm); /* get the font metrics */
+ void (*glpath)(int glyphno, GLYPH *glyphs); /* get the glyph path */
+ void (*kerning)(GLYPH *glyph_list); /* extract the kerning data */
+};
diff --git a/fonts/utilities/ttf2pt1/maps/CP1250.map b/fonts/utilities/ttf2pt1/maps/CP1250.map
new file mode 100644
index 0000000000..34596a9455
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/maps/CP1250.map
@@ -0,0 +1,254 @@
+// CP1250 code encoding table with glyph renaming
+// Petr Titera P.Titera@sh.cvut.cz
+
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quote
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D minus
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC .notdef
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+015A Sacute
+!8D U+0164 Tcaron
+!8E U+017D Zcaron
+!8F U+0179 Zacute
+!91 U+2018 quotesinglleft
+!92 U+2019 quotesinglright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+015B sacute
+!9D U+0165 tcaron
+!9E U+017E zcaron
+!9F U+017A zacute
+!A0 U+00A0 nbspace
+!A1 U+02C7 caron
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+0104 Aogonek
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+015E Scedilla
+!AB U+00AB guillemotleft
+!AC U+00AC notsign
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+2219 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+0105 aogonek
+!BA U+015F scedilla
+!BB U+00BB guillemotright
+!BC U+013D Lcaron
+!BD U+02DD hungarumlaut
+!BE U+013E lcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+00D0 Eth
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcedilla
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 eth
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcedilla
+!FF U+02D9 dotaccent
diff --git a/fonts/utilities/ttf2pt1/maps/adobe-standard-encoding.map b/fonts/utilities/ttf2pt1/maps/adobe-standard-encoding.map
new file mode 100644
index 0000000000..230d4a1efb
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/maps/adobe-standard-encoding.map
@@ -0,0 +1,231 @@
+// Adobe Standard Encoding table for ttf2pt1
+// Thomas Henlich <Thomas.Henlich@mailbox.tu-dresden.de>
+
+=20 U+0020 SPACE
+=21 U+0021 EXCLAMATION MARK
+=22 U+0022 QUOTATION MARK
+=23 U+0023 NUMBER SIGN
+=24 U+0024 DOLLAR SIGN
+=25 U+0025 PERCENT SIGN
+=26 U+0026 AMPERSAND
+=27 U+2019 RIGHT SINGLE QUOTATION MARK
+=28 U+0028 LEFT PARENTHESIS
+=29 U+0029 RIGHT PARENTHESIS
+=2A U+002A ASTERISK
+=2B U+002B PLUS SIGN
+=2C U+002C COMMA
+=2D U+002D HYPHEN-MINUS
+=2E U+002E FULL STOP
+=2F U+002F SOLIDUS
+=30 U+0030 DIGIT ZERO
+=31 U+0031 DIGIT ONE
+=32 U+0032 DIGIT TWO
+=33 U+0033 DIGIT THREE
+=34 U+0034 DIGIT FOUR
+=35 U+0035 DIGIT FIVE
+=36 U+0036 DIGIT SIX
+=37 U+0037 DIGIT SEVEN
+=38 U+0038 DIGIT EIGHT
+=39 U+0039 DIGIT NINE
+=3A U+003A COLON
+=3B U+003B SEMICOLON
+=3C U+003C LESS-THAN SIGN
+=3D U+003D EQUALS SIGN
+=3E U+003E GREATER-THAN SIGN
+=3F U+003F QUESTION MARK
+=40 U+0040 COMMERCIAL AT
+=41 U+0041 LATIN CAPITAL LETTER A
+=42 U+0042 LATIN CAPITAL LETTER B
+=43 U+0043 LATIN CAPITAL LETTER C
+=44 U+0044 LATIN CAPITAL LETTER D
+=45 U+0045 LATIN CAPITAL LETTER E
+=46 U+0046 LATIN CAPITAL LETTER F
+=47 U+0047 LATIN CAPITAL LETTER G
+=48 U+0048 LATIN CAPITAL LETTER H
+=49 U+0049 LATIN CAPITAL LETTER I
+=4A U+004A LATIN CAPITAL LETTER J
+=4B U+004B LATIN CAPITAL LETTER K
+=4C U+004C LATIN CAPITAL LETTER L
+=4D U+004D LATIN CAPITAL LETTER M
+=4E U+004E LATIN CAPITAL LETTER N
+=4F U+004F LATIN CAPITAL LETTER O
+=50 U+0050 LATIN CAPITAL LETTER P
+=51 U+0051 LATIN CAPITAL LETTER Q
+=52 U+0052 LATIN CAPITAL LETTER R
+=53 U+0053 LATIN CAPITAL LETTER S
+=54 U+0054 LATIN CAPITAL LETTER T
+=55 U+0055 LATIN CAPITAL LETTER U
+=56 U+0056 LATIN CAPITAL LETTER V
+=57 U+0057 LATIN CAPITAL LETTER W
+=58 U+0058 LATIN CAPITAL LETTER X
+=59 U+0059 LATIN CAPITAL LETTER Y
+=5A U+005A LATIN CAPITAL LETTER Z
+=5B U+005B LEFT SQUARE BRACKET
+=5C U+005C REVERSE SOLIDUS
+=5D U+005D RIGHT SQUARE BRACKET
+=5E U+005E CIRCUMFLEX ACCENT
+=5F U+005F LOW LINE
+=60 U+2018 LEFT SINGLE QUOTATION MARK
+=61 U+0061 LATIN SMALL LETTER A
+=62 U+0062 LATIN SMALL LETTER B
+=63 U+0063 LATIN SMALL LETTER C
+=64 U+0064 LATIN SMALL LETTER D
+=65 U+0065 LATIN SMALL LETTER E
+=66 U+0066 LATIN SMALL LETTER F
+=67 U+0067 LATIN SMALL LETTER G
+=68 U+0068 LATIN SMALL LETTER H
+=69 U+0069 LATIN SMALL LETTER I
+=6A U+006A LATIN SMALL LETTER J
+=6B U+006B LATIN SMALL LETTER K
+=6C U+006C LATIN SMALL LETTER L
+=6D U+006D LATIN SMALL LETTER M
+=6E U+006E LATIN SMALL LETTER N
+=6F U+006F LATIN SMALL LETTER O
+=70 U+0070 LATIN SMALL LETTER P
+=71 U+0071 LATIN SMALL LETTER Q
+=72 U+0072 LATIN SMALL LETTER R
+=73 U+0073 LATIN SMALL LETTER S
+=74 U+0074 LATIN SMALL LETTER T
+=75 U+0075 LATIN SMALL LETTER U
+=76 U+0076 LATIN SMALL LETTER V
+=77 U+0077 LATIN SMALL LETTER W
+=78 U+0078 LATIN SMALL LETTER X
+=79 U+0079 LATIN SMALL LETTER Y
+=7A U+007A LATIN SMALL LETTER Z
+=7B U+007B LEFT CURLY BRACKET
+=7C U+007C VERTICAL LINE
+=7D U+007D RIGHT CURLY BRACKET
+=7E U+007E TILDE
+=A1 U+00A1 INVERTED EXCLAMATION MARK
+=A2 U+00A2 CENT SIGN
+=A3 U+00A3 POUND SIGN
+=A4 U+2044 FRACTION SLASH
+=A5 U+00A5 YEN SIGN
+=A6 U+0192 LATIN SMALL LETTER F WITH HOOK
+=A7 U+00A7 SECTION SIGN
+=A8 U+00A4 CURRENCY SIGN
+=A9 U+0027 APOSTROPHE
+=AA U+201C LEFT DOUBLE QUOTATION MARK
+=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+=AE U+FB01 LATIN SMALL LIGATURE FI
+=AF U+FB02 LATIN SMALL LIGATURE FL
+=B1 U+2013 EN DASH
+=B2 U+2020 DAGGER
+=B3 U+2021 DOUBLE DAGGER
+=B4 U+00B7 MIDDLE DOT
+=B6 U+00B6 PILCROW SIGN
+=B7 U+2022 BULLET
+=B8 U+201A SINGLE LOW-9 QUOTATION MARK
+=B9 U+201E DOUBLE LOW-9 QUOTATION MARK
+=BA U+201D RIGHT DOUBLE QUOTATION MARK
+=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+=BC U+2026 HORIZONTAL ELLIPSIS
+=BD U+2030 PER MILLE SIGN
+=BF U+00BF INVERTED QUESTION MARK
+=C1 U+0060 GRAVE ACCENT
+=C2 U+00B4 ACUTE ACCENT
+=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+=C4 U+02DC SMALL TILDE
+=C5 U+00AF MACRON
+=C6 U+02D8 BREVE
+=C7 U+02D9 DOT ABOVE
+=C8 U+00A8 DIAERESIS
+=CA U+02DA RING ABOVE
+=CB U+00B8 CEDILLA
+=CD U+02DD DOUBLE ACUTE ACCENT
+=CE U+02DB OGONEK
+=CF U+02C7 CARON
+=D0 U+2014 EM DASH
+=E1 U+00C6 LATIN CAPITAL LETTER AE
+=E3 U+00AA FEMININE ORDINAL INDICATOR
+=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE
+=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE
+=EA U+0152 LATIN CAPITAL LIGATURE OE
+=EB U+00BA MASCULINE ORDINAL INDICATOR
+=F1 U+00E6 LATIN SMALL LETTER AE
+=F5 U+0131 LATIN SMALL LETTER DOTLESS I
+=F8 U+0142 LATIN SMALL LETTER L WITH STROKE
+=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE
+=FA U+0153 LATIN SMALL LIGATURE OE
+=FB U+00DF LATIN SMALL LETTER SHARP S
+
+// unencoded characters:
+=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA
+=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS
+=102 U+00E3 LATIN SMALL LETTER A WITH TILDE
+=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+=104 U+00B3 SUPERSCRIPT THREE
+=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+=106 U+00FE LATIN SMALL LETTER THORN
+=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE
+=108 U+00B2 SUPERSCRIPT TWO
+=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE
+=10A U+00F5 LATIN SMALL LETTER O WITH TILDE
+=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE
+=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE
+=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS
+=10F U+00BE VULGAR FRACTION THREE QUARTERS
+=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+=111 U+00D0 LATIN CAPITAL LETTER ETH
+=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS
+=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE
+=114 U+2122 TRADE MARK SIGN
+=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE
+=116 U+0161 LATIN SMALL LETTER S WITH CARON
+=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+=118 U+00FA LATIN SMALL LETTER U WITH ACUTE
+=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE
+=11A U+00F1 LATIN SMALL LETTER N WITH TILDE
+=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE
+=11C U+017E LATIN SMALL LETTER Z WITH CARON
+=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE
+=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE
+=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+=124 U+0160 LATIN CAPITAL LETTER S WITH CARON
+=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE
+=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS
+=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE
+=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE
+=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+=12A U+00AE REGISTERED SIGN
+=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE
+=12C U+00BC VULGAR FRACTION ONE QUARTER
+=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE
+=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+=12F U+00DE LATIN CAPITAL LETTER THORN
+=130 U+00F7 DIVISION SIGN
+=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE
+=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE
+=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+=134 U+00AC NOT SIGN
+=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS
+=137 U+00ED LATIN SMALL LETTER I WITH ACUTE
+=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE
+=139 U+00B1 PLUS-MINUS SIGN
+=13A U+00D7 MULTIPLICATION SIGN
+=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+=13C U+2212 MINUS SIGN
+=13D U+00B9 SUPERSCRIPT ONE
+=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE
+=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+=140 U+00A9 COPYRIGHT SIGN
+=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE
+=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS
+=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE
+=144 U+00B0 DEGREE SIGN
+=145 U+00EC LATIN SMALL LETTER I WITH GRAVE
+=146 U+00B5 MICRO SIGN
+=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE
+=148 U+00F0 LATIN SMALL LETTER ETH
+=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE
+=14B U+00A6 BROKEN BAR
+=14C U+00BD VULGAR FRACTION ONE HALF
diff --git a/fonts/utilities/ttf2pt1/maps/unicode-sample.map b/fonts/utilities/ttf2pt1/maps/unicode-sample.map
new file mode 100644
index 0000000000..0fc170f50a
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/maps/unicode-sample.map
@@ -0,0 +1,143 @@
+# this file is a sample Unicode map description.
+# It describes which glyphs are to be included in the font
+# and at which character position they are to be put.
+
+# If the character position is greater than 255, the glyph is included, but
+# does not appear in the encoding table (you must then use font reencoding
+# to use this glyph).
+# That makes it possible to have more than 256 glyphs in a font.
+# Currently the maximum supported number of glyphs is 1024.
+
+# Use this file as the argument to ttf2pt1's -L option.
+
+# 1999-11-24 Thomas.Henlich@mailbox.tu-dresden.de
+# 2000-03-01 Sergey Babkin: added 3rd format
+
+# comment lines start with '#' or '%' or '//'
+
+# One file may contain multiple actual translation tables. Each particular
+# table within a file is named a plane. The primary use of planes is
+# for multi-plane Eastern fonts with over 256 glyphs: for them one TTF
+# file gets converted into multiple Type1 files, with each resulting file
+# containing one plane of the original font. But they may also be used
+# in other creative ways. Each plane may be specified in different format
+# although this is not recommended for aesthetical reasons. If a map file
+# contains any specifications of planes then the plane argument MUST
+# be specified to the converter with that map file. If a map file
+# contains no specifications of planes then the plane argument MUST NOT
+# be specified to the converter with that map file.
+#
+# The plane maps start from the plane directive and continue to the next
+# plane directive or end of file. The plane directive must be located
+# at the very beginning of a separate string and contain the word "plane"
+# followed by whitespace and the plane name. The whitespace characters
+# are not allowed in the plane names. Non-alphanumeric characters are
+# discouraged in the plane names as well.
+
+# examples:
+
+plane 81
+=27 U+0027 APOSTROPHE
+
+plane otherplane
+ 0, 1, 2
+
+
+% There is one code assignment per line.
+// Three formats are recognized:
+# 1. optional whitespace, followed by '=', followed by a hex number
+# (character position), followed by optional whitespace, followed by
+# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want
+# here), followed by any number of characters.
+
+// example:
+
+=20 U+0020 SPACE
+=48 U+0021 EXCLAMATION MARK
+=22 U+0022 QUOTATION MARK
+=23 U+0023 NUMBER SIGN
+=24 U+0024 DOLLAR SIGN
+=25 U+0025 PERCENT SIGN
+=26 U+0026 AMPERSAND
+=27 U+0027 APOSTROPHE
+
+=E0 U+042E CYRILLIC CAPITAL LETTER YU
+=E1 U+0410 CYRILLIC CAPITAL LETTER A
+=E2 U+0411 CYRILLIC CAPITAL LETTER BE
+=E3 U+0426 CYRILLIC CAPITAL LETTER TSE
+=E4 U+0414 CYRILLIC CAPITAL LETTER DE
+=E5 U+0415 CYRILLIC CAPITAL LETTER IE
+=E6 U+0424 CYRILLIC CAPITAL LETTER EF
+=E7 U+0413 CYRILLIC CAPITAL LETTER GHE
+
+% 2. optional whitespace, followed by '<', followed by one or more
+% non-whitespace characters,
+% followed by optional whitespace, followed by '/x', followed by
+% a hex number (character position), followed by optional
+% whitespace, followed by '<U', followed by a four-digit hex number
+% (the Unicode of the glyph we want here), followed by '>' and any number
+% of characters.
+
+# example:
+
+<I> /x40 <U0049> LATIN CAPITAL LETTER I
+<t> /x41 <U0074> LATIN SMALL LETTER T
+<r> /x43 <U0072> LATIN SMALL LETTER R
+<o> /x44 <U006F> LATIN SMALL LETTER O
+<c> /x45 <U0063> LATIN SMALL LETTER C
+<k> /x46 <U006B> LATIN SMALL LETTER K
+<s> /x47 <U0073> LATIN SMALL LETTER S
+
+<Eu> /xA4 <U20AC> EURO SIGN
+
+# 3. optional whitespace, followed by '!', followed by a hex number
+# (character position), followed by optional whitespace, followed by
+# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want
+# here), followed by the name of the glyph that will be used in the
+# output file.
+
+# example:
+
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+
+# 4. compact format: just list of unicodes separated by commas or ranges
+# denoted by a dash between unicodes. These unicodes are mapped to
+# the output codes starting from 0 and continuously increasing.
+# It is possible to reset the current code by using the "at" directive
+# which must start at beginning of the line and give the new current
+# output code (which will be assigned to the next occuring unicode)
+# as decimal, hexadecimal or octal in C notation. The "at directive must
+# take a separate line. The spaces around unicodes don't matter.
+
+# example:
+# map unicodes 0x40, 0x400, 0x4000 to the output codes 0, 1, 2 and unicodes
+# 0xf010 - 0xf020, 0xf030 to the output codes 0x11-0x22
+
+ 0, 1, 2
+at 0x11
+ 0xf010- 0xf020, 0xf030
+
+
+# the first format is used by Roman Czyborra on his fine WWW pages:
+# http://czyborra.com/charsets/iso8859.html
+
+# the second format is used in the Linux locale charmaps files:
+# /usr/share/i18n/charmaps/*
+
+# we don't need those glyphs in the encoding table
+=100 U+0030 DIGIT ZERO
+=101 U+0031 DIGIT ONE
+=102 U+0032 DIGIT TWO
+=103 U+0033 DIGIT THREE
+=104 U+0034 DIGIT FOUR
+=105 U+0035 DIGIT FIVE
+=106 U+0036 DIGIT SIX
+=107 U+0037 DIGIT SEVEN
+=108 U+0039 DIGIT NINE
+=109 U+0038 DIGIT EIGHT
+
diff --git a/fonts/utilities/ttf2pt1/other/Makefile b/fonts/utilities/ttf2pt1/other/Makefile
new file mode 100644
index 0000000000..87d17a908b
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/Makefile
@@ -0,0 +1,20 @@
+
+PROGS= bz cmpf dmpf
+
+BZOBJS= bz.o bzscreen.o
+
+CFLAGS= -g
+
+all: $(PROGS)
+
+clean:
+ rm -f $(PROGS) *.o *.core core.* core
+
+bz: $(BZOBJS)
+ $(CC) $(CFLAGS) -o bz $(BZOBJS)
+
+cmpf: cmpf.c bmpfont.h
+ $(CC) $(CFLAGS) -o cmpf -I/usr/local/include -L/usr/local/lib cmpf.c -lt1 -lm
+
+dmpf: dmpf.c bmpfont.h
+ $(CC) $(CFLAGS) -o dmpf -I/usr/local/include -L/usr/local/lib dmpf.c -lt1 -lm
diff --git a/fonts/utilities/ttf2pt1/other/README.html b/fonts/utilities/ttf2pt1/other/README.html
new file mode 100644
index 0000000000..8fd0f0d6c9
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/README.html
@@ -0,0 +1,146 @@
+<HTML>
+<HEAD>
+<TITLE>
+Supplements for True Type to PostScript Type 1 Converter
+</TITLE>
+</HEAD>
+<BODY>
+<H2>
+Supplements for True Type to PostScript Type 1 Converter
+</H2>
+
+<!
+(Do not edit this file, it is generated from README.html!!!)
+>
+
+<h4><tt>bz</tt></h4>
+<!
+--
+>
+
+A small program to draw the Bezier curves on an alphanumeric display.
+The recommended way of uing it is to run it from xterm with "Tiny"
+(if you want higher magnification) or "Unreadable" (if you want
+higher resolution) font and as big window size as possible. The size
+of the window can be obtained by running "<tt>stty -a</tt>". For everything else
+just "Use the source, Luke!"
+<p>
+
+<h4><tt>cmpf</tt></h4>
+<!
+----
+>
+
+A small program to compare the rendering of two supposedly
+nearly-identical fonts at low resolutions. It requires the
+T1LIB library. This program may be used to compare the
+effect of various options of the converter on the resulting
+fonts. Create two <tt>.pfa</tt> files, one with one set of options,
+another with another set of options, then use this program
+to compare them.
+<p>
+
+<h4><tt>dmpf</tt></h4>
+<!
+----
+>
+
+A small program to dump the bitmaps of all glyphs of the font
+at low pixel sizes, up to 20 pixels. It requires the
+T1LIB library. This program may be used to compare the
+effect of changes in the T1LIB rasterizer and just for visual
+search for rendering anomalies.
+<p>
+
+<h4><tt>lst.pl</tt></h4>
+<!
+------
+>
+
+A simple PERL script that generates an HTML file
+with the full list of all characters in all
+possible styles of the Variable-width and Fixed-width
+fonts. This file is quite convenient to look
+at the converted fonts in Netscape (or other
+graphical browser).
+
+<h4><tt>cntstems.pl</tt></h4>
+<!
+------
+>
+
+A simple PERL script that counts the required hint stack in the
+interpreter to rasterize the glyphs of the font. May be quite
+useful in search for missing glyphs which may be aborted due to
+insufficient stack depth.
+
+<h4><tt>showg</tt></h4>
+<!
+-----
+>
+
+A PERL script that draws the glyphs and their interesting
+metrics (such as coordinates of the dots, hints and blue zones)
+in PostScript. It works only with un-encoded font files generated
+by <tt>ttf2pt1</tt>. The intended use is like:
+<p>
+
+&nbsp;&nbsp;<tt>showg [-c <i>&lt;fontfile.t1a&gt;</i>]... <i>&lt;fontfile.t1a&gt; &lt;glyph-to-draw&gt;</i>... &gt;file.ps</tt><br>
+&nbsp;&nbsp;<tt>gv file.ps # start the Ghostscript viewer</tt>
+<p>
+
+As you can see, multiple glyphs may be specified. The glyphs may be
+specified in one of three ways:
+<br>
+&nbsp;&nbsp;- as a decimal code (for example, <tt>43</tt> )
+<br>
+&nbsp;&nbsp;- as a glyph name preceded by a slash (for example, <tt>/plus</tt> )
+<br>
+&nbsp;&nbsp;- as a literal character preceded by a dot (for example, <tt>.+</tt> )
+<p>
+
+So for example the following command would draw the same glyph "left
+parenthesis" three times:
+<p>
+
+&nbsp;&nbsp;<tt>showg file.t1a 40 /parenleft .\( >/file.ps</tt>
+<p>
+
+Don't forget that some characters have to be protected from the shell
+by backslash as shown above, or else the shell would try to interpret
+them before passing to the program.
+<p>
+
+One file (given as the first argument) is considered the main file
+but multiple files can be specified with option <b>-c</b> for visual comparison
+of the outlines. The glyphs from the main file are drawn in black
+and supplemented with coordinate grid and sidebars for hints. The
+glyphs from the comparison files are drawn in slightly lighter colors
+(red, cyan, brown) and no supplemental information is provided for them.
+Each use of option <b>-c</b> adds one comparison file, this option may be used
+multiple times. If there are more than 3 comparison files the colors
+repeat cyclically.
+<p>
+
+So for example the following command would draw the same glyph "left
+parenthesis" from three files on the same page:
+<p>
+
+&nbsp;&nbsp;<tt>showg -c fileA.t1a -c fileB.t1a file.t1a .\( >/file.ps</tt>
+<p>
+
+This program is quite valuable it you want to take a close-up view at
+the font.
+<p>
+
+The outlines are drawn in black, the ends of the curves and
+lines are marked as dots, the first dots of the outlines
+are fatter. The Blue Zones are drawn in light blue. The
+substituted hints are marked in red, the global hints are
+marked in blue. The coordinate grid is drawn in green.
+The stems and the values of coordinates are for convenience
+marked twice, on each size of the picture.
+<p>
+
+</BODY>
+</HTML>
diff --git a/fonts/utilities/ttf2pt1/other/bmpfont.h b/fonts/utilities/ttf2pt1/other/bmpfont.h
new file mode 100644
index 0000000000..59c27372a4
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/bmpfont.h
@@ -0,0 +1,338 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+fchkneg(file, line, rc, cmd)
+ char *file;
+ int line;
+ int rc;
+ char *cmd;
+{
+ if(rc<0) {
+ fprintf(stderr,"%s: fatal error on line %d of %s: %d\n",
+ PROGNAME, line, file, rc);
+ fprintf(stderr,"%s\n", cmd);
+ exit(1);
+ }
+}
+
+fchknull(file, line, rc, cmd)
+ char *file;
+ int line;
+ void *rc;
+ char *cmd;
+{
+ if(rc==NULL) {
+ fprintf(stderr,"%s: fatal error on line %d of %s: NULL\n",
+ PROGNAME, line, file);
+ fprintf(stderr,"%s\n", cmd);
+ exit(1);
+ }
+}
+
+#define chkneg(f) fchkneg(__FILE__,__LINE__,(f),#f)
+#define chknull(f) fchknull(__FILE__,__LINE__,(f),#f)
+
+#define MYPAD 8
+
+#define CHRNONE ' '
+#define CHRBOTH '.'
+#define CHRONE '1'
+#define CHRTWO '2'
+
+#define MINSIZE 8
+#define MAXSIZE 20
+
+#define LINEWIDTH 80 /* screen line width in chars */
+#define MAXLINES (MAXSIZE*(MAXSIZE-MINSIZE+1))
+
+static char map[MAXLINES][LINEWIDTH+1];
+static char mbase, mx, mend;
+
+/* returns 0 if the same, -1 if different */
+
+int
+cmpglyphs(g1, g2)
+ GLYPH *g1, *g2;
+{
+ int wd1, wd2;
+ int ht1, ht2;
+ int i, j;
+ char *p1, *p2;
+
+ wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing;
+ ht1=g1->metrics.ascent - g1->metrics.descent;
+ wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing;
+ ht2=g2->metrics.ascent - g2->metrics.descent;
+
+ if(g1->bits==NULL && g2->bits!=NULL
+ || g1->bits!=NULL && g2->bits==NULL)
+ return -1;
+
+ if(g1->metrics.ascent != g2->metrics.ascent)
+ return -1;
+
+ if(g1->metrics.descent != g2->metrics.descent)
+ return -1;
+
+ if( wd1 != wd2 )
+ return -1;
+
+ if( (p1=g1->bits) !=NULL && (p2=g2->bits) !=NULL )
+ for(i=0; i<ht1; i++) {
+ for(j=0; j<wd1; j+=8) {
+ if( *p1++ != *p2++)
+ return -1;
+ }
+ }
+ return 0;
+}
+
+void
+resetmap()
+{
+ int i, j;
+
+ for(i=0; i<MAXLINES; i++)
+ for(j=0; j<LINEWIDTH; j++)
+ map[i][j]=' ';
+ mbase=mx=mend=0;
+}
+
+void
+drawdot(row, col, val)
+ unsigned row, col, val;
+{
+ if(row < MAXLINES && col < LINEWIDTH-1) {
+ map[row][col]=val;
+ if(row > mend)
+ mend=row;
+ }
+}
+
+void
+drawdotg1(row, col, val)
+ unsigned row, col, val;
+{
+ if(row < MAXLINES && col < LINEWIDTH-1) {
+ if(val)
+ map[row][col]=CHRONE;
+ else
+ map[row][col]=CHRNONE;
+ if(row > mend)
+ mend=row;
+ }
+}
+
+void
+drawdotg2(row, col, val)
+ unsigned row, col, val;
+{
+ if(row < MAXLINES && col < LINEWIDTH-1) {
+ if(val)
+ if(map[row][col]==CHRONE)
+ map[row][col]=CHRBOTH;
+ else
+ map[row][col]=CHRTWO;
+ else if(map[row][col]!=CHRONE)
+ map[row][col]=CHRNONE;
+ if(row > mend)
+ mend=row;
+ }
+}
+
+void
+drawglyf(size, g1)
+ int size;
+ GLYPH *g1;
+{
+ int wd1, wd2, wdm;
+ int ht1, ht2, ascm, desm;
+ int i, j, k, val;
+ char *p;
+ int off1, off2;
+
+ wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing;
+ ht1=g1->metrics.ascent - g1->metrics.descent;
+
+ wdm=wd1;
+
+ ascm=g1->metrics.ascent;
+ desm= -g1->metrics.descent;
+
+ if(mbase==0)
+ mbase=ascm+1;
+ else if(LINEWIDTH-mx <= wdm+1) {
+ mx=0; mbase=mend+ascm+2;
+ }
+
+ drawdot(mbase-ascm-1, mx, (size/10)%10+'0');
+ drawdot(mbase-ascm-1, mx+1, size%10+'0');
+
+ if( (p=g1->bits) !=NULL)
+ for(i=0; i<ht1; i++) {
+ for(j=0; j<wd1; j+=8) {
+ val = *p++;
+ for(k=0; k<8 && j+k<wd1; k++, val>>=1)
+ drawdot(i+mbase-g1->metrics.ascent, mx+j+k, (val&1)?CHRBOTH:CHRNONE);
+ }
+ }
+
+ wdm++;
+ if(wdm<3)
+ wdm=3;
+ mx+=wdm;
+ drawdot(mbase, mx-1, '-');
+}
+
+void
+drawdiff(size, g1, g2)
+ int size;
+ GLYPH *g1, *g2;
+{
+ int wd1, wd2, wdm;
+ int ht1, ht2, ascm, desm;
+ int i, j, k, val;
+ char *p;
+ int off1, off2;
+
+ wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing;
+ ht1=g1->metrics.ascent - g1->metrics.descent;
+ wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing;
+ ht2=g2->metrics.ascent - g2->metrics.descent;
+
+ if(wd1>wd2) {
+ wdm=wd1;
+ off1=0; off2=wd1-wd2;
+ } else {
+ wdm=wd2;
+ off2=0; off1=wd2-wd1;
+ }
+
+ if(g1->metrics.ascent > g2->metrics.ascent)
+ ascm=g1->metrics.ascent;
+ else
+ ascm=g2->metrics.ascent;
+
+ if(g1->metrics.descent < g2->metrics.descent)
+ desm= -g1->metrics.descent;
+ else
+ desm= -g2->metrics.descent;
+
+ if(mbase==0)
+ mbase=ascm+1;
+ else if(LINEWIDTH-mx <= wdm+1) {
+ mx=0; mbase=mend+ascm+2;
+ }
+
+ drawdot(mbase-ascm-1, mx, (size/10)%10+'0');
+ drawdot(mbase-ascm-1, mx+1, size%10+'0');
+
+ /* check which alignment is better */
+ if(off1!=0 || off2!=0) {
+ int cntl,cntr;
+ int a1, a2, d1, d2;
+ int val1, val2;
+ int rstep1, rstep2;
+
+ cntl=cntr=0;
+ rstep1=(wd1+7)/8;
+ rstep2=(wd2+7)/8;
+ a1=g1->metrics.ascent;
+ d1=g1->metrics.descent;
+ a2=g2->metrics.ascent;
+ d2=g2->metrics.descent;
+
+#ifdef dbgoff
+ printf("size: %d\n", size);
+#endif
+ for(i=ascm; i>= -desm; i--) {
+ for(j=0; j<wdm; j++) {
+ /* first the left alignment */
+ if(i>a1 || i<d1 || j>=wd1)
+ val1=0;
+ else
+ val1=( g1->bits[ (a1-i)*rstep1+j/8 ] >> (j%8) ) & 1;
+ if(i>a2 || i<d2 || j>=wd2)
+ val2=0;
+ else
+ val2=( g2->bits[ (a2-i)*rstep2+j/8 ] >> (j%8) ) & 1;
+
+ cntl += (val1 ^ val2);
+
+#ifdef dbgoff
+ putchar(val1?'1':' ');
+ putchar(val2?'2':' ');
+ putchar('.');
+#endif
+
+ /* now the right alignment */
+ if(i>a1 || i<d1 || j-off1>=wd1 || j<off1)
+ val1=0;
+ else
+ val1=( g1->bits[ (a1-i)*rstep1+(j-off1)/8 ] >> ((j-off1)%8) ) & 1;
+ if(i>a2 || i<d2 || j-off2>=wd2)
+ val2=0;
+ else
+ val2=( g2->bits[ (a2-i)*rstep2+(j-off2)/8 ] >> ((j-off2)%8) ) & 1;
+
+ cntr += (val1 ^ val2);
+
+#ifdef dbgoff
+ putchar(val1?'1':' ');
+ putchar(val2?'2':' ');
+ putchar('|');
+#endif
+ }
+#ifdef dbgoff
+ putchar('\n');
+#endif
+ }
+
+#ifdef dbgoff
+ printf("size %d: left %d right %d\n",size, cntl, cntr);
+#endif
+ if(cntl <= cntr) /* left is better or the same */
+ off1=off2=0;
+ }
+
+ if( (p=g1->bits) !=NULL)
+ for(i=0; i<ht1; i++) {
+ for(j=0; j<wd1; j+=8) {
+ val = *p++;
+ for(k=0; k<8 && j+k<wd1; k++, val>>=1)
+ drawdotg1(i+mbase-g1->metrics.ascent, mx+j+k+off1, val&1);
+ }
+ }
+ if( (p=g2->bits) !=NULL)
+ for(i=0; i<ht2; i++) {
+ for(j=0; j<wd2; j+=8) {
+ val = *p++;
+ for(k=0; k<8 && j+k<wd2; k++, val>>=1)
+ drawdotg2(i+mbase-g2->metrics.ascent, mx+j+k+off2, val&1);
+ }
+ }
+
+ wdm++;
+ if(wdm<3)
+ wdm=3;
+ mx+=wdm;
+ drawdot(mbase, mx-1, '-');
+}
+
+void
+printmap(f)
+ FILE *f;
+{
+ int i, j;
+
+ for(i=0; i<=mend; i++) {
+ for(j=LINEWIDTH-1; j>=0 && map[i][j]==' '; j--)
+ {}
+ map[i][j+1]='\n';
+ map[i][j+2]=0;
+ fputs(map[i], f);
+ }
+}
+
diff --git a/fonts/utilities/ttf2pt1/other/bz.c b/fonts/utilities/ttf2pt1/other/bz.c
new file mode 100644
index 0000000000..475d13fa47
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/bz.c
@@ -0,0 +1,78 @@
+/*
+ * see COPYRIGHT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bzscreen.h"
+
+/* size of the screen in "physical pixels" */
+#define PHYSX 980
+#define PHYSY 310
+
+/* the bounding box of the drawing in "logical pixels" */
+/* the base point - set to 0, 0 for absolute coordinates */
+#define BASEX 19
+#define BASEY 122
+/* the maximal point */
+#define MAXX 450
+#define MAXY 481
+
+main(argc,argv)
+ int argc;
+ char **argv;
+{
+ initscreen(PHYSX, PHYSY, PHYSX, PHYSY, 0, 0, BASEX, BASEY, MAXX, MAXY);
+
+ /*
+ drawcurve('#', 0,0, 51,0, 1,49, 45,98);
+ drawcurve('1', 5,28, 8,37, 16,65, 45,98);
+
+ drawcurve('3', 0,0, 0,24, 30,68, 80,72);
+
+ drawcurve('1', 0,0, 0,5, 1,10, 2,15);
+ drawcurve('2', 2,15, 8,42, 30,68, 80,72);
+
+ drawcurve('4', 0,0, 0,37, 22,67, 80,72);
+ */
+
+ /* final */
+ /*
+ drawcurve('#', 324, 481, 390, 481, 448, 475, 448, 404 );
+ drawcurve('#', 448, 404, 448, 404, 448, 324, 448, 324 );
+ drawcurve('#', 448, 324, 402, 245, 19, 338, 19, 122 );
+ */
+
+ /* 3 */
+ /*
+ */
+ drawcurve('*', 450, 404, 450, 397, 450, 390, 448, 384 );
+
+ drawcurve('*', 448, 384, 446, 378, 444, 370, 443, 360 );
+ drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 );
+ drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 );
+
+ /* 4 */
+ drawcurve('#', 324, 481, 390, 481, 450, 475, 450, 404 );
+ drawcurve('#', 450, 404, 450, 397, 450, 390, 448, 384 );
+
+ drawcurve('#', 448, 384, 402, 245, 19, 338, 19, 122 );
+
+ /*
+ drawcurve('.', 324, 481, 361, 481, 391, 478, 414, 466 );
+ drawcurve('.', 414, 466, 436, 454, 450, 436, 450, 404 );
+
+ drawcurve('.', 450, 404, 450, 390, 447, 378, 443, 360 );
+ drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 );
+
+ drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 );
+ */
+
+ printscreen(stdout);
+}
+
+sumcurves(dx11, dy11, dx12, dy12, dx13, dy13,
+ dx21, dy21, dx22, dy22, dx23, dy23)
+{
+}
+
diff --git a/fonts/utilities/ttf2pt1/other/bzscreen.c b/fonts/utilities/ttf2pt1/other/bzscreen.c
new file mode 100644
index 0000000000..0bb5ab6a33
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/bzscreen.c
@@ -0,0 +1,220 @@
+/*
+ * see COPYRIGHT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bzscreen.h"
+
+/*
+ * functions to draw the bezier curves in text mode
+ */
+
+double
+fmin(a,b)
+ double a, b;
+{
+ if(a<b)
+ return a;
+ else
+ return b;
+}
+
+int
+abs(x)
+ int x;
+{
+ if(x<0)
+ return -x;
+ else
+ return x;
+}
+
+void
+initscreen(physx, physy, cols, rows, xoff, yoff, minx, miny, maxx, maxy)
+ unsigned physx, physy, cols, rows, xoff, yoff, minx, miny, maxx, maxy;
+{
+ int i,j;
+ double yxscale;
+
+ if(screen.dots != NULL)
+ free(screen.dots);
+
+ if(physx==0 || physy==0 || rows==0 || cols==0) {
+ fprintf(stderr, "*** negative or zero screen size\n");
+ exit(1);
+ }
+
+ if(physx+xoff > cols || physy+yoff > rows) {
+ fprintf(stderr, "*** drawable area out of screen\n");
+ exit(1);
+ }
+
+ if(minx>maxx || miny>maxy) {
+ fprintf(stderr, "*** empty drawable area\n");
+ exit(1);
+ }
+
+ screen.physx = physx;
+ screen.physy = physy;
+ screen.rows = rows;
+ screen.cols = cols+2; /* for '\n\0' */
+ screen.xoff = xoff;
+ screen.yoff = yoff;
+ screen.minx = minx;
+ screen.miny = miny;
+
+ if(( screen.dots=malloc(screen.rows*screen.cols) )==NULL) {
+ perror("*** no memory for screen: ");
+ exit(1);
+ }
+
+ j=screen.rows*screen.cols;
+ for(i=0; i<j; i++)
+ screen.dots[i]=' ';
+
+ /* scale of Y to X on the screen, i.e. x=YXSCALE*y */
+ /* 3/4 is the approx. ratio of Y/X sizes of the physical screen */
+ yxscale = ((double)physx/(double)physy*3.0/4.0);
+
+ /* scale of "logical" to "physical", i.e. physical=PHYSSCALE*logical */
+ screen.yscale = fmin( ((double)physy-0.51)/(maxy+1-miny),
+ ((double)physx-0.51)/yxscale/(maxx+1-minx) );
+ screen.xscale = yxscale * screen.yscale;
+}
+
+void
+drawcurve(mark, ax,ay, bx,by, cx,cy, dx,dy)
+ int mark, ax,ay, bx,by, cx,cy, dx,dy;
+{
+ int i,j,n,c;
+ int maxn=(screen.physx + screen.physy)*2;
+
+ ax-=screen.minx; bx-=screen.minx; cx-=screen.minx; dx-=screen.minx;
+ ay-=screen.miny; by-=screen.miny; cy-=screen.miny; dy-=screen.miny;
+
+ for(i=0; i<=maxn; i++) {
+ double t, t2, t3, nt, nt2, nt3;
+
+ t=(double)i/(double)maxn; t2=t*t; t3=t2*t;
+ nt=1-t; nt2=nt*nt; nt3=nt2*nt;
+
+ setfdot(
+ mark,
+ ( ax*t3 + bx*3*t2*nt + cx*3*t*nt2 + dx*nt3 ),
+ ( ay*t3 + by*3*t2*nt + cy*3*t*nt2 + dy*nt3 )
+ );
+ }
+}
+
+/* draw curve and mark direction at the ends */
+
+void
+drawcurvedir(mark, ax,ay, bx,by, cx,cy, dx,dy)
+ int mark, ax,ay, bx,by, cx,cy, dx,dy;
+{
+ int i,j,n,c;
+ int maxn=(screen.physx + screen.physy)*2;
+ double t, t2, t3, nt, nt2, nt3;
+ int markb, marke;
+
+ ax-=screen.minx; bx-=screen.minx; cx-=screen.minx; dx-=screen.minx;
+ ay-=screen.miny; by-=screen.miny; cy-=screen.miny; dy-=screen.miny;
+
+ if(bx==ax && by==ay) {
+ markb=mark;
+ } else if( abs(by-ay) > abs(bx-ax) ) {
+ if(by>ay)
+ markb='^';
+ else
+ markb='v';
+ } else {
+ if(bx>ax)
+ markb='>';
+ else
+ markb='<';
+ }
+
+ if(dx==cx && dy==cy) {
+ marke=mark;
+ } else if( abs(dy-cy) > abs(dx-cx) ) {
+ if(dy>cy)
+ marke='^';
+ else
+ marke='v';
+ } else {
+ if(dx>cx)
+ marke='>';
+ else
+ marke='<';
+ }
+
+ for(i=1; i<maxn; i++) {
+ t=(double)i/(double)maxn; t2=t*t; t3=t2*t;
+ nt=1-t; nt2=nt*nt; nt3=nt2*nt;
+
+ setfdot(
+ mark,
+ ( ax*t3 + bx*3*t2*nt + cx*3*t*nt2 + dx*nt3 ),
+ ( ay*t3 + by*3*t2*nt + cy*3*t*nt2 + dy*nt3 )
+ );
+ }
+ /* mark the ends */
+ setfdot( markb, (double)ax, (double)ay );
+ setfdot( marke, (double)dx, (double)dy );
+}
+
+void
+drawdot(mark, x, y)
+ int mark;
+ int x, y;
+{
+ x=(int)((x-screen.minx)*screen.xscale+0.5);
+ y=(int)((y-screen.miny)*screen.yscale+0.5);
+
+ if(y<0 || y>=screen.physy || x<0 || x>=screen.physx)
+ return;
+ screendot(x,y)=mark;
+}
+
+void
+setabsdot(mark, x, y)
+ int x, y, mark;
+{
+ if(y<0 || y>=screen.rows || x<0 || x>=screen.cols-2)
+ return;
+ screenabsdot(x,y)=mark;
+}
+
+void
+setfdot(mark, fx, fy)
+ int mark;
+ double fx, fy;
+{
+ int x, y;
+
+ x=(int)(fx*screen.xscale+0.5);
+ y=(int)(fy*screen.yscale+0.5);
+
+ if(y<0 || y>=screen.physy || x<0 || x>=screen.physx)
+ return;
+ screendot(x,y)=mark;
+}
+
+/* destructive */
+void
+printscreen(f)
+ FILE *f;
+{
+ int r;
+ char *pi, *pc;
+
+ for(r=screen.rows-1; r>=0; r--) {
+ pc=&screenabsdot(0,r);
+ for(pi=&screenabsdot(-2,r+1); pi>=pc && *pi == ' '; pi--)
+ {}
+ pi[1]='\n';
+ pi[2]=0;
+ fputs(pc, f);
+ }
+}
diff --git a/fonts/utilities/ttf2pt1/other/bzscreen.h b/fonts/utilities/ttf2pt1/other/bzscreen.h
new file mode 100644
index 0000000000..290d5195aa
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/bzscreen.h
@@ -0,0 +1,40 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+/*
+ * Screen for drawing the Bezier curves in text mode
+ */
+
+struct screen {
+ unsigned physx;
+ unsigned physy;
+ unsigned cols;
+ unsigned rows;
+ unsigned xoff;
+ unsigned yoff;
+ unsigned minx;
+ unsigned miny;
+ char *dots;
+ double xscale;
+ double yscale;
+} screen;
+
+#define screenabsdot(x,y) (screen.dots[(y)*screen.cols+(x)])
+#define screendot(x,y) screenabsdot((x)+screen.xoff, (y)+screen.yoff)
+
+/* prototypes */
+double fmin(double a, double b);
+int abs(int x);
+void initscreen(unsigned physx, unsigned physy,
+ unsigned cols, unsigned rows, unsigned xoff, unsigned yoff,
+ unsigned minx, unsigned miny, unsigned maxx, unsigned maxy);
+void drawcurve(int mark, int ax,int ay,
+ int bx,int by, int cx,int cy, int dx,int dy);
+void drawcurvedir(int mark, int ax,int ay,
+ int bx,int by, int cx,int cy, int dx,int dy);
+void drawdot(int mark, int x, int y);
+void setabsdot(int mark, int x, int y);
+void setfdot(int mark, double x, double y);
+void printscreen(FILE *f);
diff --git a/fonts/utilities/ttf2pt1/other/cmpf.c b/fonts/utilities/ttf2pt1/other/cmpf.c
new file mode 100644
index 0000000000..37e6e98f0c
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/cmpf.c
@@ -0,0 +1,67 @@
+/*
+ * see COPYRIGHT
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include "t1lib.h"
+
+/*
+ * compare two [ almost the same ] fonts
+ */
+
+#define PROGNAME "cmpf"
+
+#include "bmpfont.h"
+
+
+main(ac, av)
+ int ac;
+ char **av;
+{
+ int fontid1, fontid2;
+ GLYPH *g1, *g2;
+ int chr, size, diff, offset;
+
+ if(ac!=3) {
+ fprintf(stderr,"Use: %s font1 font2\n", PROGNAME);
+ exit(1);
+ }
+
+ chkneg(T1_SetBitmapPad(MYPAD));
+ chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE));
+ chkneg(fontid1=T1_AddFont(av[1]));
+ chkneg(fontid2=T1_AddFont(av[2]));
+
+
+ resetmap();
+ for(chr=0; chr<256; chr++) {
+ diff=0;
+ for(size=MAXSIZE; size>=MINSIZE; size--) {
+ chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) );
+ chknull( g2=T1_CopyGlyph(T1_SetChar( fontid2, chr, (float)size, NULL)) );
+
+ if( cmpglyphs(g1, g2) ) {
+ /* printf("%d %d - diff\n", chr, size); */
+ diff=1;
+ drawdiff(size, g1, g2);
+ }
+ /*
+ else
+ fprintf(stderr, "%d %d - same\n", chr, size);
+ */
+
+ chkneg(T1_FreeGlyph(g1));
+ chkneg(T1_FreeGlyph(g2));
+ }
+ if(diff) {
+ printf("*** Difference for %d==0x%x %c\n", chr, chr,
+ isprint(chr) ? chr : ' ');
+ printmap(stdout);
+ diff=0;
+ resetmap();
+ }
+ }
+
+ printf("All done!\n");
+}
diff --git a/fonts/utilities/ttf2pt1/other/cntstems.pl b/fonts/utilities/ttf2pt1/other/cntstems.pl
new file mode 100755
index 0000000000..185c06c4fd
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/cntstems.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 2000 by Sergey Babkin
+# (see COPYRIGHT for full copyright notice)
+#
+# script to calculate the total number of stems used by the
+# glyphs in case if stems are always pushed to the stack and
+# never popped (as X11 does)
+
+$insubrs = 0;
+$inchars = 0;
+
+while(<>)
+{
+ if(/\/Subrs/) {
+ $insubrs = 1;
+ } elsif(/\/CharStrings/) {
+ $insubrs = 0;
+ $inchars = 1;
+ }
+ if($insubrs && /^dup (\d+)/) {
+ $cursubr = $1;
+ $substems[$cursubr] = 0;
+ } elsif (/^dup (\d+) \/(\S+) put/) {
+ $codeof{$2} = $1;
+ }
+ if($inchars) {
+ if(/^\/(\S+)\s+\{/) {
+ $curchar = $1;
+ $charstems = 0;
+ } elsif( /endchar/ ) {
+ printf("%d:%s\t%d\n", $codeof{$curchar}, $curchar, $charstems);
+ } elsif( /(\d+)\s+4\s+callsubr/) {
+ $charstems += $substems[$1+0];
+ }
+ }
+ if(/[hv]stem3/) {
+ if($insubrs) {
+ $substems[$cursubr] += 3;
+ } elsif($inchars) {
+ $charstems += 3;
+ }
+ } elsif( /[hv]stem/ ) {
+ if($insubrs) {
+ $substems[$cursubr]++;
+ } elsif($inchars) {
+ $charstems++;
+ }
+ }
+}
diff --git a/fonts/utilities/ttf2pt1/other/dmpf.c b/fonts/utilities/ttf2pt1/other/dmpf.c
new file mode 100644
index 0000000000..1052a44872
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/dmpf.c
@@ -0,0 +1,53 @@
+/*
+ * see COPYRIGHT
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include "t1lib.h"
+
+/*
+ * Dump a rasterizarion of the font at small size
+ */
+
+#define PROGNAME "dmpf"
+
+#include "bmpfont.h"
+
+
+main(ac, av)
+ int ac;
+ char **av;
+{
+ int fontid1, fontid2;
+ GLYPH *g1, *g2;
+ int chr, size, diff, offset;
+
+ if(ac!=2) {
+ fprintf(stderr,"Use: %s font\n", PROGNAME);
+ exit(1);
+ }
+
+ chkneg(T1_SetBitmapPad(MYPAD));
+ chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE));
+ chkneg(fontid1=T1_AddFont(av[1]));
+
+
+ resetmap();
+ for(chr=0; chr<256; chr++) {
+ for(size=MAXSIZE; size>=MINSIZE; size--) {
+ chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) );
+
+ drawglyf(size, g1);
+
+ chkneg(T1_FreeGlyph(g1));
+ }
+
+ printf("*** Glyph %d==0x%x %c\n", chr, chr,
+ isprint(chr) ? chr : ' ');
+ printmap(stdout);
+ resetmap();
+ }
+
+ printf("All done!\n");
+}
diff --git a/fonts/utilities/ttf2pt1/other/lst.pl b/fonts/utilities/ttf2pt1/other/lst.pl
new file mode 100755
index 0000000000..b5840b275b
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/lst.pl
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+#
+# script to create HTML file with character table
+# in plain, italic, bold, bold-italic
+#
+# see COPYRIGHT
+#
+
+# width of tables
+$step=16;
+
+# commands to enable and disable the font modes
+# (the fastest changing is first)
+@matrix = (
+ [ "Roman", "Italic", "</i>", "<i>" ],
+ [ "Medium", "Bold", "</b>", "<b>" ],
+ [ "Variable", "Fixed", "</tt>", "<tt>" ],
+);
+
+sub printall
+{
+ local $i, $j;
+
+ printf("<table border=\"0\" >\n");
+ for($j=32; $j<256; $j+=$step) {
+ printf("<tr>\n");
+ for $i ($j..$j+$step-1) {
+ $c=chr($i);
+ if($c eq "<") {
+ $c="&lt;";
+ } elsif($c eq ">") {
+ $c="&gt;";
+ }
+ printf("<td><font color=\"gray\">%03d</font></td><td>\n", $i);
+ printf("<font color=\"white\">%s%s%s</font>\n", $enmode, $c, $dismode);
+ printf("</td>\n");
+ }
+ printf("</tr>\n");
+ }
+ printf("</table><p>\n");
+}
+
+printf("<HTML><HEAD></HEAD><BODY bgcolor=\"black\">\n<font color=\"white\"><p>\n");
+
+for $mask (0.. (1<<@matrix)-1) {
+ #printf("<table><tr>");
+ $mode = $enmode = $dismode = "";
+ for $bit (0.. $#matrix) {
+ $val = ($mask >> $bit) & 1;
+ $mode = $matrix[$bit]->[$val] . "<br>" . $mode;
+ if( $val ) {
+ $enmode = $matrix[$bit]->[3] . $enmode;
+ $dismode = $dismode . $matrix[$bit]->[2];
+ }
+ #printf("=== %d %s %s %s\n", $val, $mode, $enmode, $dismode);
+ }
+ #printf("%x %s %s %s\n", $mask, $mode, $enmode, $dismode);
+ printf("<table border=\"0\"><tr><td>\n");
+ &printall();
+ printf("</td><td valign=top><font size=\"+1\" color=\"yellow\"><b>\n");
+ printf("%s\n", $mode);
+ printf("</b></font></td></tr></table>\n");
+}
+
+printf("</font></BODY></HTML>\n");
diff --git a/fonts/utilities/ttf2pt1/other/showg b/fonts/utilities/ttf2pt1/other/showg
new file mode 100755
index 0000000000..437860d4c2
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/other/showg
@@ -0,0 +1,633 @@
+#!/usr/bin/perl
+
+my @cmpfiles;
+
+while($ARGV[0] eq "-c") {
+ shift(@ARGV);
+ push(@cmpfiles, shift(@ARGV));
+}
+
+if( $#ARGV < 1) {
+ die("Usage: $0 [-c file]... file glyph-code...\n");
+}
+
+$fname=shift @ARGV;
+
+# storage for files
+my %fontname;
+my %fbbox;
+my %fblues;
+my %fenc;
+my %frevenc;
+my %fsubrs;
+my %fchars;
+my @cmnbbox; # common bounding box covering all files
+
+@cmnbbox = (100, 100, 100, 100);
+
+# read all files into memory
+for $f (@cmpfiles, $fname) {
+ open(FILE, "<$f") or die("no such file $f");
+ while(<FILE>) {
+ if(/FontBBox\s+\{\s*(.*)\s*}/) {
+ @bbox=split(/\s+/, $1);
+ push(@{$fbbox{$f}}, @bbox);
+ if($bbox[0] < $cmnbbox[0]) {
+ $cmnbbox[0] = $bbox[0];
+ }
+ if($bbox[1] < $cmnbbox[1]) {
+ $cmnbbox[1] = $bbox[1];
+ }
+ if($bbox[2] > $cmnbbox[2]) {
+ $cmnbbox[2] = $bbox[2];
+ }
+ if($bbox[3] > $cmnbbox[3]) {
+ $cmnbbox[3] = $bbox[3];
+ }
+ } elsif( /BlueValues\s+\[\s*(.*)\s*\]/ || /OtherBlues\s+\[\s*(.*)\s*\]/ ) {
+ @blues=split(/\s+/, $1);
+ push(@{$fblues{$f}}, @blues);
+ } elsif( /^dup\s+(\d+)\s+\/(\S+)\s+put/ ) {
+ $fenc{$f}{$1} = $2;
+ if( ! defined $frevenc{$f}{$2} ) {
+ $frevenc{$f}{$2} = $1;
+ }
+ } elsif( /^dup\s+(\d+)\s+\{\s*$/ ) {
+ $key = $1;
+ $bf = $_;
+ while(<FILE>) {
+ $bf .= $_;
+ if( /\}\s+NP/ ) {
+ last;
+ }
+ }
+ $fsubrs{$f}{$key} = $bf;
+ } elsif( /^\/(\S+)\s+\{\s*$/ ) {
+ $key = $1;
+ $bf = $_;
+ while(<FILE>) {
+ $bf .= $_;
+ if( /endchar/ ) {
+ last;
+ }
+ }
+ $fchars{$f}{$key} = $bf;
+ } elsif( /^\/FontName\s+(\S+)/ ) {
+ $fontname{$f} = $1;
+ }
+ }
+ close(FILE);
+}
+
+######################## Prolog ###################################
+
+print("%%!PS-Adobe-1.0
+%%DocumentNeededResources: font Courier
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+/cmpfcolorarray [
+ [ 1 0.2 0.2 ] % slightly lighter red
+ [ 0 0.7 0.7 ] % cyan
+ [ 0.7 0.7 0 ] % brown-yellow
+] def
+/cmpfcolor { % number -> .
+ cmpfcolorarray length mod % get the subarray number
+ cmpfcolorarray exch get aload pop setrgbcolor
+} bind def
+/contourcolor { 0 0 0 setrgbcolor } bind def % black
+/bluezonecolor { 0.95 0.95 1 setrgbcolor } bind def % very light blue
+/coordcolor { 0 1 0 setrgbcolor } bind def % green
+/textcolor { 0 0 0 setrgbcolor } bind def % black
+/stemcolor { 1 0 0 setrgbcolor } bind def % red
+/mainstemcolor { 0 0 1 setrgbcolor } bind def % blue
+
+% /fnt2pt { 72 5 mul 1000 div } bind def
+
+/linehor { % . font_y -> .
+ gsave
+ 0 72 translate
+ 72 fnt2pt scale
+ newpath
+ 0 exch moveto
+ 7 0 rlineto
+ stroke
+ grestore
+} bind def
+
+/linevert { % . font_x -> .
+ gsave
+ 72 0 translate
+ fnt2pt 72 scale
+ newpath
+ 0 moveto
+ 0 7 rlineto
+ stroke
+ grestore
+} bind def
+
+/bluezone { % . font_y_1 font_y_2 -> .
+ gsave
+ bluezonecolor
+ 0 72 translate
+ 72 fnt2pt scale
+ newpath
+ 0 exch moveto
+ 7 0 rlineto
+ 7 exch lineto
+ -7 0 rlineto
+ closepath
+ fill
+ grestore
+} bind def
+
+/drawstem { % . xwidth ywidth x0 y0 -> .
+ gsave
+ 72 72 translate fnt2pt fnt2pt scale xorg yorg translate
+ newpath
+ moveto
+ dup 0 exch rlineto
+ exch 0 rlineto
+ neg 0 exch rlineto
+ closepath fill
+ grestore
+} bind def
+
+/getlen {
+ dup stringwidth pop
+} bind def
+
+/compressfont 0.8 def
+
+/label { % . string stringwd y -> .
+ dup lasty lt {
+ dup lasty fontsz sub le
+ } {
+ dup lasty fontsz add ge
+ } ifelse {
+ /curx 0 store
+ } if
+ dup /lasty exch store
+ 0 exch moveto
+ compressfont mul dup curx add maxx gt {
+ /curx 0 store
+ } if
+ curx 0 rmoveto
+ dup 0 rlineto
+ stroke
+ gsave
+ curx lasty moveto
+ curx add /curx exch store
+ compressfont 1 scale
+ show
+ grestore
+} bind def
+");
+
+@bbox=@cmnbbox;
+
+$nx=$bbox[2]-$bbox[0];
+$ny=$bbox[3]-$bbox[1];
+$maxsz= ($nx>$ny) ? $nx : $ny;
+$fnt2pt= 72*5/$maxsz;
+printf("/fnt2pt 72 5 mul %d div def\n", $maxsz);
+$xorg= -($bbox[0]-($maxsz-$nx)/2);
+$yorg= -($bbox[1]-($maxsz-$ny)/2);
+printf("/xorg %d def /yorg %d def\n", $xorg, $yorg);
+
+print("
+%%EndProlog
+");
+
+######################## Subroutines ##############################
+
+sub bluezone # from to
+{
+ my ($a, $b)=@_;
+ printf("%d %d bluezone\n",$a+$yorg, $b+$yorg);
+ $ycoord{$a+0}=1;
+ $ycoord{$b+0}=1;
+}
+
+sub linehor # x
+{
+ my $a=$_[0];
+ printf("%d linehor\n",$a+$yorg);
+ $ycoord{$a+0}=1;
+}
+
+sub linevert # x
+{
+ my $a=$_[0];
+ printf("%d linevert\n",$a+$xorg);
+ $xcoord{$a+0}=1;
+}
+
+sub hstem # from width
+{
+ my ($from, $width)=@_;
+ $stemhused=1;
+ printf("%d %d %d %d drawstem %% %d %d h \n", -$stemwd, $width,
+ $bbox[0]-2-$stemhgrp*$stemwd, $from,
+ $from, $width);
+ printf("%d %d %d %d drawstem %% %d %d h \n", $stemwd, $width,
+ $bbox[2]+2+$stemhgrp*$stemwd, $from,
+ $from, $width);
+}
+
+sub vstem # from width
+{
+ my ($from, $width)=@_;
+ $stemvused=1;
+ printf("%d %d %d %d drawstem %% %d %d v \n", $width, -$stemwd,
+ $from, $bbox[1]-2-$stemhgrp*$stemwd,
+ $from, $width);
+ printf("%d %d %d %d drawstem %% %d %d v \n", $width, $stemwd,
+ $from, $bbox[3]+2+$stemhgrp*$stemwd,
+ $from, $width);
+}
+
+sub nextstemgrp
+{
+ if($stemhused || $stemvused) {
+ $stemhgrp++;
+ $stemhused=0;
+ $stemvgrp++;
+ $stemvused=0;
+ }
+}
+
+sub substems # fname subrlist
+{
+ my $fname = shift;
+ my $i, $cmd, @vals;
+
+ print("\nstemcolor\n");
+
+ for $i (@_) {
+ &nextstemgrp();
+ for $_ (split(/\n/, $fsubrs{$fname}{$i})) {
+ s/^\s+//;
+ @vals=split(/\s+/, $_);
+ $cmd=$vals[$#vals];
+ if($cmd eq "hstem") {
+ &hstem($vals[0], $vals[1]);
+ } elsif($cmd eq "vstem") {
+ &vstem($vals[0], $vals[1]);
+ }
+ }
+ }
+ print("\n");
+}
+
+sub drawcharwstems # charstring
+{
+ my($x,$y)=(0,0);
+ my @vals, $cmd, $i;
+
+ print("\nmainstemcolor\n");
+ &nextstemgrp();
+ for $_ (split(/\n/, $_[0])) {
+ s/^\s+//;
+ @vals=split(/\s+/, $_);
+ $cmd=$vals[$#vals];
+
+ if($cmd eq "hsbw") {
+ $x=$vals[0]+0;
+ } elsif($cmd eq "hstem") {
+ &hstem($vals[0], $vals[1]);
+ } elsif($cmd eq "hstem3") {
+ &hstem($vals[0], $vals[1]);
+ &hstem($vals[2], $vals[3]);
+ &hstem($vals[4], $vals[5]);
+ } elsif($cmd eq "vstem") {
+ &vstem($vals[0], $vals[1]);
+ } elsif($cmd eq "vstem3") {
+ &vstem($vals[0], $vals[1]);
+ &vstem($vals[2], $vals[3]);
+ &vstem($vals[4], $vals[5]);
+ } elsif($cmd eq "rmoveto") {
+ # a shortcut
+ last;
+ }
+ }
+ &drawchar("drawchar", 1, "contourcolor", $_[0]);
+}
+
+sub drawchar #procname wantgrid color charstring
+{
+ my($procname, $wantgrid, $color, $charstring) = @_;
+ my($x,$y)=(0,0);
+ my @vals, $cmd, $i;
+ my %xv=();
+ my %yv=();
+
+ printf("\n/%s {\n",$procname);
+ printf("\ngsave 72 72 translate fnt2pt fnt2pt scale %d %d translate\n", $xorg, $yorg);
+ printf("%s 1 setlinewidth newpath\n", $color);
+ for $_ (split(/\n/, $charstring)) {
+ s/^\s+//;
+ @vals=split(/\s+/, $_);
+ $cmd=$vals[$#vals];
+
+ if($cmd eq "callsubr" && $vals[1] == 4) {
+ push(@subrlist, $vals[0]);
+ } elsif($cmd eq "amoveto") {
+ $x=$vals[0]+0;
+ $y=$vals[1]+0;
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d moveto\n", $x, $y);
+ printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "rmoveto") {
+ $x+=$vals[0];
+ $y+=$vals[1];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d moveto\n", $x, $y);
+ printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "hmoveto") {
+ $x+=$vals[0];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d moveto\n", $x, $y);
+ printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "vmoveto") {
+ $y+=$vals[0];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d moveto\n", $x, $y);
+ printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "alineto") {
+ $x=$vals[0]+0;
+ $y=$vals[1]+0;
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d lineto\n", $x, $y);
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "rlineto") {
+ $x+=$vals[0];
+ $y+=$vals[1];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d lineto\n", $x, $y);
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "hlineto") {
+ $x+=$vals[0];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d lineto\n", $x, $y);
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "vlineto") {
+ $y+=$vals[0];
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("%d %d lineto\n", $x, $y);
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "arcurveto") {
+ for $i (0,2,4) {
+ $x=$vals[$i]+0;
+ $y=$vals[$i+1]+0;
+ printf("%d %d ", $x, $y);
+ }
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("curveto\n");
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "rrcurveto") {
+ for $i (0,2,4) {
+ $x+=$vals[$i];
+ $y+=$vals[$i+1];
+ printf("%d %d \n", $x, $y);
+ }
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("curveto\n");
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "hvcurveto") {
+ $x+=$vals[0];
+ printf("%d %d \n", $x, $y);
+ $x+=$vals[1];
+ $y+=$vals[2];
+ printf("%d %d \n", $x, $y);
+ $y+=$vals[3];
+ printf("%d %d \n", $x, $y);
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("curveto\n");
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "vhcurveto") {
+ $y+=$vals[0];
+ printf("%d %d \n", $x, $y);
+ $x+=$vals[1];
+ $y+=$vals[2];
+ printf("%d %d \n", $x, $y);
+ $x+=$vals[3];
+ printf("%d %d \n", $x, $y);
+ $xv{$x+0}=1; $yv{$y+0}=1;
+ printf("curveto\n");
+ printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y);
+ } elsif($cmd eq "closepath") {
+ printf("closepath stroke newpath\n");
+ }
+ }
+
+ printf("grestore } bind def\n");
+ if($wantgrid) {
+ printf("coordcolor\n");
+ for $x (keys %xv) {
+ &linevert($x);
+ }
+ for $y (keys %yv) {
+ &linehor($y);
+ }
+ }
+}
+
+$pages=0;
+
+for $arg (@ARGV) {
+ undef $name, $code;
+
+ if( $arg =~ /^\/(.*)/ ) {
+ $name=$1;
+ } elsif( $arg =~ /^\.(.)/ ) {
+ $code=ord($1);
+ } else {
+ $code=$arg;
+ }
+
+ $pages++;
+
+ $stemhgrp=0;
+ $stemhused=0;
+ $stemvgrp=0;
+ $stemvused=0;
+ $stemwd=10;
+ undef %xcoord;
+ undef %ycoord;
+
+ if( defined $name ) {
+ $xname = $name;
+ $xcode = $frevenc{$fname}{$name};
+ if( $xcode eq "" ) {
+ $xcode = "**UNKNOWN**";
+ }
+ } else {
+ $xname = $fenc{$fname}{$code};
+ if( $xname eq "" ) {
+ $xname = "**UNKNOWN**";
+ }
+ $xcode = $code;
+ }
+
+ printf("%%%%Page: %d %d\n", $pages, $pages);
+ printf("gsave
+
+0 setlinewidth
+36 72 translate
+
+gsave
+contourcolor
+72 72 scale
+newpath
+0 0 moveto
+7 0 rlineto
+0 7 rlineto
+-7 0 rlineto
+closepath
+stroke
+1 1 translate
+newpath
+0 0 moveto
+5 0 rlineto
+0 5 rlineto
+-5 0 rlineto
+closepath
+stroke
+grestore
+
+");
+
+ undef @subrlist;
+
+
+ @bbox=@{$fbbox{$fname}};
+
+ print("coordcolor\n");
+ printf("0 linehor %d linehor %d linehor\n", $bbox[1]+$yorg, $bbox[3]+$yorg);
+ printf("%d linevert %d linevert\n", $bbox[0]+$xorg, $bbox[2]+$xorg);
+
+ %vals=@{$fblues{$fname}};
+ for $i (keys %vals) {
+ &bluezone($i, $vals{$i});
+ }
+
+ $havechar = 1;
+ if( defined $fchars{$fname}{$xname} ) {
+ &drawcharwstems($fchars{$fname}{$xname});
+ } else {
+ $havechar = 0;
+ if(defined $name) {
+ printf(STDERR "WARNING: %s nas no character with name \"%s\"\n", $fname, $name);
+ } else {
+ printf(STDERR "WARNING: %s nas no character with code \"%s\"\n", $fname, $code);
+ }
+ }
+
+ &substems($fname, @subrlist);
+
+ printf(STDERR "glyph name:%s code:%s (%d substituted stem groups)\n", $xname, $xcode, scalar @subrlist);
+
+ $cmpfidx = 0;
+ for $cmpf(@cmpfiles) {
+ undef $cname, $ccode;
+
+ if( defined $name ) {
+ if ( ! defined $fchars{$cmpf}{$name} && defined $fenc{$cmpf}{$xcode}) {
+ printf(STDERR " NOTE: %s nas no glyph with name \"%s\", guessed by code\n", $cmpf, $name);
+ $cname = $fenc{$cmpf}{$xcode};
+ if( $cname eq "" ) {
+ $cname = "**UNKNOWN**";
+ }
+ $ccode = $xcode;
+ } else {
+ $cname = $name;
+ $ccode = $frevenc{$cmpf}{$name};
+ if( $ccode eq "" ) {
+ $ccode = "**UNKNOWN**";
+ }
+ }
+ } else {
+ $cname = $fenc{$cmpf}{$code};
+ if( $cname eq "" ) {
+ $cname = "**UNKNOWN**";
+ }
+ $ccode = $code;
+ }
+
+ if( defined $fchars{$cmpf}{$cname} ) {
+ &drawchar("drawcmpchar", 0, sprintf("%d cmpfcolor", $cmpfidx),
+ $fchars{$cmpf}{$cname});
+ printf("drawcmpchar\n\n");
+ printf(STDERR " in %s glyph name:%s code:%s\n", $cmpf, $cname, $ccode);
+ } else {
+ if(defined $name) {
+ printf(STDERR " WARNING: %s nas no character with name \"%s\"\n", $cmpf, $name);
+ } else {
+ printf(STDERR " WARNING: %s nas no character with code \"%s\"\n", $cmpf, $code);
+ }
+ }
+ $cmpfidx++;
+ }
+
+ if($havechar) {
+ printf("drawchar\n\n");
+ }
+
+ # flush the last group
+ &nextstemgrp();
+
+ # the values of coordinates
+ printf("/fontsz 8 fnt2pt div def\n");
+ printf("/Myfont /Courier findfont fontsz scalefont def\n\n");
+ printf("contourcolor Myfont setfont\n");
+
+ for $org (0, $xorg+$bbox[2]+$stemwd*$stemhgrp+72/$fnt2pt) {
+ printf("gsave\n");
+ printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n",
+ 2+$stemhgrp*$stemwd-$xorg-$bbox[0]);
+ printf("0 72 translate fnt2pt fnt2pt scale %f yorg translate 1 setlinewidth\n", $org);
+ for $y (sort {$a <=> $b} keys %ycoord) {
+ printf("(%d) getlen %d label\n", $y, $y);
+ }
+ printf("grestore\n");
+ }
+
+ for $org (0, $yorg+$bbox[3]+$stemwd*$stemvgrp+72/$fnt2pt) {
+ printf("gsave\n");
+ printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n",
+ 2+$stemvgrp*$stemwd-$yorg-$bbox[1]);
+ printf("72 0 translate fnt2pt fnt2pt scale xorg %f translate 90 rotate 1 setlinewidth\n", $org);
+ for $x (sort {$a <=> $b} keys %xcoord) {
+ printf("(%d) getlen %d label\n", $x, -$x);
+ }
+ printf("grestore\n");
+ }
+
+ printf("gsave 0 %d translate\n", 7.5*72 );
+ printf("contourcolor /Courier findfont 12 scalefont setfont\n");
+ $line = 0;
+
+ $cmpfidx = $#cmpfiles;
+ if( $cmpfidx > (2.5*72/15)-4 ) {
+ $cmpfidx = (2.5*72/15)-4;
+ }
+ for(; $cmpfidx>=0; $cmpfidx--) {
+ $cmpf = $cmpfiles[$cmpfidx];
+ printf("%d cmpfcolor\n", $cmpfidx);
+ printf("newpath 20 %d moveto 0 10 rlineto 10 0 rlineto 0 -10 rlineto closepath fill\n",
+ 15*$line, $cmpf);
+ printf("contourcolor 40 %d moveto (%s %s) show\n", 15*$line, $cmpf, $fontname{$cmpf});
+ $line++;
+ }
+ if( $#cmpfiles >=0 ) {
+ printf("0 %d moveto (Comparison files:) show\n", 15*$line++);
+ }
+ printf("0 %d moveto (code: %d name: %s) show\n", 15*$line++, $xcode, $xname);
+ printf("0 %d moveto (%s) show\n", 15*$line++, $fname);
+ printf("0 %d moveto (%s) show\n", 15*$line++, $fontname{$fname});
+ printf("grestore\n\n");
+
+ printf("showpage grestore\n\n");
+}
+printf("%%%%Pages: %d\n", $pages);
diff --git a/fonts/utilities/ttf2pt1/pt1.c b/fonts/utilities/ttf2pt1/pt1.c
new file mode 100644
index 0000000000..ba0bef2835
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/pt1.c
@@ -0,0 +1,5878 @@
+/*
+ * see COPYRIGHT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <ctype.h>
+#include <math.h>
+
+#ifndef WINDOWS
+# include <netinet/in.h>
+# include <unistd.h>
+#else
+# include "windows.h"
+#endif
+
+#include "ttf.h"
+#include "pt1.h"
+#include "global.h"
+
+/* big and small values for comparisons */
+#define FBIGVAL (1e20)
+#define FEPS (100000./FBIGVAL)
+
+int stdhw, stdvw; /* dominant stems widths */
+int stemsnaph[12], stemsnapv[12]; /* most typical stem width */
+
+int bluevalues[14];
+int nblues;
+int otherblues[10];
+int notherb;
+int bbox[4]; /* the FontBBox array */
+double italic_angle;
+
+GLYPH *glyph_list;
+int encoding[256]; /* inverse of glyph[].char_no */
+int kerning_pairs = 0;
+
+/* prototypes */
+static int isign( int x);
+static int fsign( double x);
+static void fixcvdir( GENTRY * ge, int dir);
+static void fixcvends( GENTRY * ge);
+static int fgetcvdir( GENTRY * ge);
+static int igetcvdir( GENTRY * ge);
+static int fiszigzag( GENTRY *ge);
+static int iiszigzag( GENTRY *ge);
+static GENTRY * freethisge( GENTRY *ge);
+static void addgeafter( GENTRY *oge, GENTRY *nge );
+static GENTRY * newgentry( int flags);
+static void debugstems( char *name, STEM * hstems, int nhs, STEM * vstems, int nvs);
+static int addbluestems( STEM *s, int n);
+static void sortstems( STEM * s, int n);
+static int stemoverlap( STEM * s1, STEM * s2);
+static int steminblue( STEM *s);
+static void markbluestems( STEM *s, int nold);
+static int joinmainstems( STEM * s, int nold, int useblues);
+static void joinsubstems( STEM * s, short *pairs, int nold, int useblues);
+static void fixendpath( GENTRY *ge);
+static void fdelsmall( GLYPH *g, double minlen);
+static double fcvarea( GENTRY *ge);
+static int fckjoinedcv( GLYPH *g, double t, GENTRY *nge,
+ GENTRY *old1, GENTRY *old2, double k);
+static double fcvval( GENTRY *ge, int axis, double t);
+static double fclosegap( GENTRY *from, GENTRY *to, int axis,
+ double gap, double *ret);
+
+static int
+isign(
+ int x
+)
+{
+ if (x > 0)
+ return 1;
+ else if (x < 0)
+ return -1;
+ else
+ return 0;
+}
+
+static int
+fsign(
+ double x
+)
+{
+ if (x > 0.0)
+ return 1;
+ else if (x < 0.0)
+ return -1;
+ else
+ return 0;
+}
+
+static GENTRY *
+newgentry(
+ int flags
+)
+{
+ GENTRY *ge;
+
+ ge = calloc(1, sizeof(GENTRY));
+
+ if (ge == 0) {
+ fprintf(stderr, "***** Memory allocation error *****\n");
+ exit(255);
+ }
+ ge->stemid = -1;
+ ge->flags = flags;
+ /* the rest is set to 0 by calloc() */
+ return ge;
+}
+
+/*
+ * Routines to print out Postscript functions with optimization
+ */
+
+void
+rmoveto(
+ int dx,
+ int dy
+)
+{
+ if (optimize && dx == 0 && dy == 0) /* for special pathologic
+ * case */
+ return;
+ else if (optimize && dx == 0)
+ fprintf(pfa_file, "%d vmoveto\n", dy);
+ else if (optimize && dy == 0)
+ fprintf(pfa_file, "%d hmoveto\n", dx);
+ else
+ fprintf(pfa_file, "%d %d rmoveto\n", dx, dy);
+}
+
+void
+rlineto(
+ int dx,
+ int dy
+)
+{
+ if (optimize && dx == 0 && dy == 0) /* for special pathologic
+ * case */
+ return;
+ else if (optimize && dx == 0)
+ fprintf(pfa_file, "%d vlineto\n", dy);
+ else if (optimize && dy == 0)
+ fprintf(pfa_file, "%d hlineto\n", dx);
+ else
+ fprintf(pfa_file, "%d %d rlineto\n", dx, dy);
+}
+
+void
+rrcurveto(
+ int dx1,
+ int dy1,
+ int dx2,
+ int dy2,
+ int dx3,
+ int dy3
+)
+{
+ /* first two ifs are for crazy cases that occur surprisingly often */
+ if (optimize && dx1 == 0 && dx2 == 0 && dx3 == 0)
+ rlineto(0, dy1 + dy2 + dy3);
+ else if (optimize && dy1 == 0 && dy2 == 0 && dy3 == 0)
+ rlineto(dx1 + dx2 + dx3, 0);
+ else if (optimize && dy1 == 0 && dx3 == 0)
+ fprintf(pfa_file, "%d %d %d %d hvcurveto\n",
+ dx1, dx2, dy2, dy3);
+ else if (optimize && dx1 == 0 && dy3 == 0)
+ fprintf(pfa_file, "%d %d %d %d vhcurveto\n",
+ dy1, dx2, dy2, dx3);
+ else
+ fprintf(pfa_file, "%d %d %d %d %d %d rrcurveto\n",
+ dx1, dy1, dx2, dy2, dx3, dy3);
+}
+
+void
+closepath(void)
+{
+ fprintf(pfa_file, "closepath\n");
+}
+
+/*
+ * Many of the path processing routines exist (or will exist) in
+ * both floating-point and integer version. Fimally most of the
+ * processing will go in floating point and the integer processing
+ * will become legacy.
+ * The names of floating routines start with f, names of integer
+ * routines start with i, and those old routines existing in one
+ * version only have no such prefix at all.
+ */
+
+/*
+** Routine that checks integrity of the path, for debugging
+*/
+
+void
+assertpath(
+ GENTRY * from,
+ char *file,
+ int line,
+ char *name
+)
+{
+ GENTRY *first, *pe, *ge;
+ int isfloat;
+
+ if(from==0)
+ return;
+ isfloat = (from->flags & GEF_FLOAT);
+ pe = from->prev;
+ for (ge = from; ge != 0; pe = ge, ge = ge->next) {
+ if( (ge->flags & GEF_FLOAT) ^ isfloat ) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "float flag changes from %s to %s at 0x%p (type %c, prev type %c)\n",
+ (isfloat ? "TRUE" : "FALSE"), (isfloat ? "FALSE" : "TRUE"), ge, ge->type, pe->type);
+ abort();
+ }
+ if (pe != ge->prev) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "unidirectional chain 0x%x -next-> 0x%x -prev-> 0x%x \n",
+ pe, ge, ge->prev);
+ abort();
+ }
+
+ switch(ge->type) {
+ case GE_MOVE:
+ break;
+ case GE_PATH:
+ if (ge->prev == 0) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "empty path at 0x%x \n", ge);
+ abort();
+ }
+ break;
+ case GE_LINE:
+ case GE_CURVE:
+ if(ge->frwd->bkwd != ge) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "unidirectional chain 0x%x -frwd-> 0x%x -bkwd-> 0x%x \n",
+ ge, ge->frwd, ge->frwd->bkwd);
+ abort();
+ }
+ if(ge->prev->type == GE_MOVE) {
+ first = ge;
+ if(ge->bkwd->next->type != GE_PATH) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "broken first backlink 0x%x -bkwd-> 0x%x -next-> 0x%x \n",
+ ge, ge->bkwd, ge->bkwd->next);
+ abort();
+ }
+ }
+ if(ge->next->type == GE_PATH) {
+ if(ge->frwd != first) {
+ fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name);
+ fprintf(stderr, "broken loop 0x%x -...-> 0x%x -frwd-> 0x%x \n",
+ first, ge, ge->frwd);
+ abort();
+ }
+ }
+ break;
+ }
+
+ }
+}
+
+void
+assertisfloat(
+ GLYPH *g,
+ char *msg
+)
+{
+ if( !(g->flags & GF_FLOAT) ) {
+ fprintf(stderr, "**! Glyph %s is not float: %s\n", g->name, msg);
+ abort();
+ }
+ if(g->lastentry) {
+ if( !(g->lastentry->flags & GEF_FLOAT) ) {
+ fprintf(stderr, "**! Glyphs %s last entry is int: %s\n", g->name, msg);
+ abort();
+ }
+ }
+}
+
+void
+assertisint(
+ GLYPH *g,
+ char *msg
+)
+{
+ if( (g->flags & GF_FLOAT) ) {
+ fprintf(stderr, "**! Glyph %s is not int: %s\n", g->name, msg);
+ abort();
+ }
+ if(g->lastentry) {
+ if( (g->lastentry->flags & GEF_FLOAT) ) {
+ fprintf(stderr, "**! Glyphs %s last entry is float: %s\n", g->name, msg);
+ abort();
+ }
+ }
+}
+
+
+/*
+ * Routines to save the generated data about glyph
+ */
+
+void
+fg_rmoveto(
+ GLYPH * g,
+ double x,
+ double y)
+{
+ GENTRY *oge;
+
+ if (ISDBG(BUILDG))
+ fprintf(stderr, "%s: f rmoveto(%g, %g)\n", g->name, x, y);
+
+ assertisfloat(g, "adding float MOVE");
+
+ if ((oge = g->lastentry) != 0) {
+ if (oge->type == GE_MOVE) { /* just eat up the first move */
+ oge->fx3 = x;
+ oge->fy3 = y;
+ } else if (oge->type == GE_LINE || oge->type == GE_CURVE) {
+ fprintf(stderr, "Glyph %s: MOVE in middle of path\n", g->name);
+ } else {
+ GENTRY *nge;
+
+ nge = newgentry(GEF_FLOAT);
+ nge->type = GE_MOVE;
+ nge->fx3 = x;
+ nge->fy3 = y;
+
+ oge->next = nge;
+ nge->prev = oge;
+ g->lastentry = nge;
+ }
+ } else {
+ GENTRY *nge;
+
+ nge = newgentry(GEF_FLOAT);
+ nge->type = GE_MOVE;
+ nge->fx3 = x;
+ nge->fy3 = y;
+ nge->bkwd = (GENTRY*)&g->entries;
+ g->entries = g->lastentry = nge;
+ }
+
+ if (0 && ISDBG(BUILDG))
+ dumppaths(g, NULL, NULL);
+}
+
+void
+fg_rlineto(
+ GLYPH * g,
+ double x,
+ double y)
+{
+ GENTRY *oge, *nge;
+
+ if (ISDBG(BUILDG))
+ fprintf(stderr, "%s: f rlineto(%g, %g)\n", g->name, x, y);
+
+ assertisfloat(g, "adding float LINE");
+
+ nge = newgentry(GEF_FLOAT);
+ nge->type = GE_LINE;
+ nge->fx3 = x;
+ nge->fy3 = y;
+
+ if ((oge = g->lastentry) != 0) {
+ if (x == oge->fx3 && y == oge->fy3) { /* empty line */
+ /* ignore it or we will get in troubles later */
+ free(nge);
+ return;
+ }
+ if (g->path == 0) {
+ g->path = nge;
+ nge->bkwd = nge->frwd = nge;
+ } else {
+ oge->frwd = nge;
+ nge->bkwd = oge;
+ g->path->bkwd = nge;
+ nge->frwd = g->path;
+ }
+
+ oge->next = nge;
+ nge->prev = oge;
+ g->lastentry = nge;
+ } else {
+ WARNING_1 fprintf(stderr, "Glyph %s: LINE outside of path\n", g->name);
+ free(nge);
+ }
+
+ if (0 && ISDBG(BUILDG))
+ dumppaths(g, NULL, NULL);
+}
+
+void
+fg_rrcurveto(
+ GLYPH * g,
+ double x1,
+ double y1,
+ double x2,
+ double y2,
+ double x3,
+ double y3)
+{
+ GENTRY *oge, *nge;
+
+ oge = g->lastentry;
+
+ if (ISDBG(BUILDG))
+ fprintf(stderr, "%s: f rrcurveto(%g, %g, %g, %g, %g, %g)\n"
+ ,g->name, x1, y1, x2, y2, x3, y3);
+
+ assertisfloat(g, "adding float CURVE");
+
+ if (oge && oge->fx3 == x1 && x1 == x2 && x2 == x3) /* check if it's
+ * actually a line */
+ fg_rlineto(g, x1, y3);
+ else if (oge && oge->fy3 == y1 && y1 == y2 && y2 == y3)
+ fg_rlineto(g, x3, y1);
+ else {
+ nge = newgentry(GEF_FLOAT);
+ nge->type = GE_CURVE;
+ nge->fx1 = x1;
+ nge->fy1 = y1;
+ nge->fx2 = x2;
+ nge->fy2 = y2;
+ nge->fx3 = x3;
+ nge->fy3 = y3;
+
+ if (oge != 0) {
+ if (x3 == oge->fx3 && y3 == oge->fy3) {
+ free(nge); /* consider this curve empty */
+ /* ignore it or we will get in troubles later */
+ return;
+ }
+ if (g->path == 0) {
+ g->path = nge;
+ nge->bkwd = nge->frwd = nge;
+ } else {
+ oge->frwd = nge;
+ nge->bkwd = oge;
+ g->path->bkwd = nge;
+ nge->frwd = g->path;
+ }
+
+ oge->next = nge;
+ nge->prev = oge;
+ g->lastentry = nge;
+ } else {
+ WARNING_1 fprintf(stderr, "Glyph %s: CURVE outside of path\n", g->name);
+ free(nge);
+ }
+ }
+
+ if (0 && ISDBG(BUILDG))
+ dumppaths(g, NULL, NULL);
+}
+
+void
+g_closepath(
+ GLYPH * g
+)
+{
+ GENTRY *oge, *nge;
+
+ if (ISDBG(BUILDG))
+ fprintf(stderr, "%s: closepath\n", g->name);
+
+ oge = g->lastentry;
+
+ if (g->path == 0) {
+ WARNING_1 fprintf(stderr, "Warning: **** closepath on empty path in glyph \"%s\" ****\n",
+ g->name);
+ if (oge == 0) {
+ WARNING_1 fprintf(stderr, "No previois entry\n");
+ } else {
+ WARNING_1 fprintf(stderr, "Previous entry type: %c\n", oge->type);
+ if (oge->type == GE_MOVE) {
+ g->lastentry = oge->prev;
+ if (oge->prev == 0)
+ g->entries = 0;
+ }
+ }
+ return;
+ }
+
+ nge = newgentry(oge->flags & GEF_FLOAT); /* keep the same type */
+ nge->type = GE_PATH;
+
+ g->path = 0;
+
+ oge->next = nge;
+ nge->prev = oge;
+ g->lastentry = nge;
+
+ if (0 && ISDBG(BUILDG))
+ dumppaths(g, NULL, NULL);
+}
+
+/*
+ * * SB * Routines to smooth and fix the glyphs
+ */
+
+/*
+** we don't want to see the curves with coinciding middle and
+** outer points
+*/
+
+static void
+fixcvends(
+ GENTRY * ge
+)
+{
+ int dx, dy;
+ int x0, y0, x1, y1, x2, y2, x3, y3;
+
+ if (ge->type != GE_CURVE)
+ return;
+
+ if(ge->flags & GEF_FLOAT) {
+ fprintf(stderr, "**! fixcvends(0x%x) on floating entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ x0 = ge->prev->ix3;
+ y0 = ge->prev->iy3;
+ x1 = ge->ix1;
+ y1 = ge->iy1;
+ x2 = ge->ix2;
+ y2 = ge->iy2;
+ x3 = ge->ix3;
+ y3 = ge->iy3;
+
+
+ /* look at the start of the curve */
+ if (x1 == x0 && y1 == y0) {
+ dx = x2 - x1;
+ dy = y2 - y1;
+
+ if (dx == 0 && dy == 0
+ || x2 == x3 && y2 == y3) {
+ /* Oops, we actually have a straight line */
+ /*
+ * if it's small, we hope that it will get optimized
+ * later
+ */
+ if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) {
+ ge->ix1 = x3;
+ ge->iy1 = y3;
+ ge->ix2 = x0;
+ ge->iy2 = y0;
+ } else {/* just make it a line */
+ ge->type = GE_LINE;
+ }
+ } else {
+ if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very
+ * small */
+ ge->ix1 = x2;
+ ge->iy1 = y2;
+ } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */
+ ge->ix1 += dx / 2;
+ ge->iy1 += dy / 2;
+ } else {
+ ge->ix1 += dx / 4;
+ ge->iy1 += dy / 4;
+ }
+ /* make sure that it's still on the same side */
+ if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) {
+ if (abs(x3 - x0) * abs(ge->iy1 - y0) > abs(y3 - y0) * abs(ge->ix1 - x0))
+ ge->ix1 += isign(dx);
+ } else {
+ if (abs(x3 - x0) * abs(ge->iy1 - y0) < abs(y3 - y0) * abs(ge->ix1 - x0))
+ ge->iy1 += isign(dy);
+ }
+
+ ge->ix2 += (x3 - x2) / 8;
+ ge->iy2 += (y3 - y2) / 8;
+ /* make sure that it's still on the same side */
+ if (abs(x3 - x0) * abs(y3 - y2) < abs(y3 - y0) * abs(x3 - x2)) {
+ if (abs(x3 - x0) * abs(y3 - ge->iy2) > abs(y3 - y0) * abs(x3 - ge->ix2))
+ ge->iy1 -= isign(y3 - y2);
+ } else {
+ if (abs(x3 - x0) * abs(y3 - ge->iy2) < abs(y3 - y0) * abs(x3 - ge->ix2))
+ ge->ix1 -= isign(x3 - x2);
+ }
+
+ }
+ } else if (x2 == x3 && y2 == y3) {
+ dx = x1 - x2;
+ dy = y1 - y2;
+
+ if (dx == 0 && dy == 0) {
+ /* Oops, we actually have a straight line */
+ /*
+ * if it's small, we hope that it will get optimized
+ * later
+ */
+ if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) {
+ ge->ix1 = x3;
+ ge->iy1 = y3;
+ ge->ix2 = x0;
+ ge->iy2 = y0;
+ } else {/* just make it a line */
+ ge->type = GE_LINE;
+ }
+ } else {
+ if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very
+ * small */
+ ge->ix2 = x1;
+ ge->iy2 = y1;
+ } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */
+ ge->ix2 += dx / 2;
+ ge->iy2 += dy / 2;
+ } else {
+ ge->ix2 += dx / 4;
+ ge->iy2 += dy / 4;
+ }
+ /* make sure that it's still on the same side */
+ if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) {
+ if (abs(x3 - x0) * abs(ge->iy2 - y3) > abs(y3 - y0) * abs(ge->ix2 - x3))
+ ge->ix2 += isign(dx);
+ } else {
+ if (abs(x3 - x0) * abs(ge->iy2 - y3) < abs(y3 - y0) * abs(ge->ix2 - x3))
+ ge->iy2 += isign(dy);
+ }
+
+ ge->ix1 += (x0 - x1) / 8;
+ ge->iy1 += (y0 - y1) / 8;
+ /* make sure that it's still on the same side */
+ if (abs(x3 - x0) * abs(y0 - y1) < abs(y3 - y0) * abs(x0 - x1)) {
+ if (abs(x3 - x0) * abs(y0 - ge->iy1) > abs(y3 - y0) * abs(x0 - ge->ix1))
+ ge->iy1 -= isign(y0 - y1);
+ } else {
+ if (abs(x3 - x0) * abs(y0 - ge->iy1) < abs(y3 - y0) * abs(x0 - ge->ix1))
+ ge->ix1 -= isign(x0 - x1);
+ }
+
+ }
+ }
+}
+
+/* if we have any curves that are in fact flat but
+** are not horizontal nor vertical, substitute
+** them also with lines
+*/
+
+void
+flattencurves(
+ GLYPH * g
+)
+{
+ GENTRY *ge;
+ int x0, y0, x1, y1, x2, y2, x3, y3;
+
+ assertisint(g, "flattencurves INT");
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_CURVE)
+ continue;
+
+ x0 = ge->prev->ix3;
+ y0 = ge->prev->iy3;
+ x1 = ge->ix1;
+ y1 = ge->iy1;
+ x2 = ge->ix2;
+ y2 = ge->iy2;
+ x3 = ge->ix3;
+ y3 = ge->iy3;
+
+ if ((x1 - x0) * (y2 - y1) == (x2 - x1) * (y1 - y0)
+ && (x1 - x0) * (y3 - y2) == (x3 - x2) * (y1 - y0)) {
+ ge->type = GE_LINE;
+ }
+ }
+}
+
+/*
+** After transformations we want to make sure that the resulting
+** curve is going in the same quadrant as the original one,
+** because rounding errors introduced during transformations
+** may make the result completeley wrong.
+**
+** `dir' argument describes the direction of the original curve,
+** it is the superposition of two values for the front and
+** rear ends of curve:
+**
+** >EQUAL - goes over the line connecting the ends
+** =EQUAL - coincides with the line connecting the ends
+** <EQUAL - goes under the line connecting the ends
+**
+** See CVDIR_* for exact definitions.
+*/
+
+static void
+fixcvdir(
+ GENTRY * ge,
+ int dir
+)
+{
+ int a, b, c, d;
+ double kk, kk1, kk2;
+ int changed;
+ int fdir, rdir;
+
+ if(ge->flags & GEF_FLOAT) {
+ fprintf(stderr, "**! fixcvdir(0x%x) on floating entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ fdir = (dir & CVDIR_FRONT) - CVDIR_FEQUAL;
+ if ((dir & CVDIR_REAR) == CVDIR_RSAME)
+ rdir = fdir; /* we need only isign, exact value doesn't matter */
+ else
+ rdir = (dir & CVDIR_REAR) - CVDIR_REQUAL;
+
+ fixcvends(ge);
+
+ c = isign(ge->ix3 - ge->prev->ix3); /* note the direction of
+ * curve */
+ d = isign(ge->iy3 - ge->prev->iy3);
+
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy1 - ge->prev->iy3;
+ b = ge->ix1 - ge->prev->ix3;
+ kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy3 - ge->iy2;
+ b = ge->ix3 - ge->ix2;
+ kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+
+ changed = 1;
+ while (changed) {
+ if (ISDBG(FIXCVDIR)) {
+ /* for debugging */
+ fprintf(stderr, "fixcvdir %d %d (%d %d %d %d %d %d) %f %f %f\n",
+ fdir, rdir,
+ ge->ix1 - ge->prev->ix3,
+ ge->iy1 - ge->prev->iy3,
+ ge->ix2 - ge->ix1,
+ ge->iy2 - ge->iy1,
+ ge->ix3 - ge->ix2,
+ ge->iy3 - ge->iy2,
+ kk1, kk, kk2);
+ }
+ changed = 0;
+
+ if (fdir > 0) {
+ if (kk1 > kk) { /* the front end has problems */
+ if (c * (ge->ix1 - ge->prev->ix3) > 0) {
+ ge->ix1 -= c;
+ changed = 1;
+ } if (d * (ge->iy2 - ge->iy1) > 0) {
+ ge->iy1 += d;
+ changed = 1;
+ }
+ /* recalculate the coefficients */
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy1 - ge->prev->iy3;
+ b = ge->ix1 - ge->prev->ix3;
+ kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ }
+ } else if (fdir < 0) {
+ if (kk1 < kk) { /* the front end has problems */
+ if (c * (ge->ix2 - ge->ix1) > 0) {
+ ge->ix1 += c;
+ changed = 1;
+ } if (d * (ge->iy1 - ge->prev->iy3) > 0) {
+ ge->iy1 -= d;
+ changed = 1;
+ }
+ /* recalculate the coefficients */
+ a = ge->iy1 - ge->prev->iy3;
+ b = ge->ix1 - ge->prev->ix3;
+ kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ }
+ }
+ if (rdir > 0) {
+ if (kk2 < kk) { /* the rear end has problems */
+ if (c * (ge->ix2 - ge->ix1) > 0) {
+ ge->ix2 -= c;
+ changed = 1;
+ } if (d * (ge->iy3 - ge->iy2) > 0) {
+ ge->iy2 += d;
+ changed = 1;
+ }
+ /* recalculate the coefficients */
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy3 - ge->iy2;
+ b = ge->ix3 - ge->ix2;
+ kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ }
+ } else if (rdir < 0) {
+ if (kk2 > kk) { /* the rear end has problems */
+ if (c * (ge->ix3 - ge->ix2) > 0) {
+ ge->ix2 += c;
+ changed = 1;
+ } if (d * (ge->iy2 - ge->iy1) > 0) {
+ ge->iy2 -= d;
+ changed = 1;
+ }
+ /* recalculate the coefficients */
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy3 - ge->iy2;
+ b = ge->ix3 - ge->ix2;
+ kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ }
+ }
+ }
+ fixcvends(ge);
+}
+
+/* Get the directions of ends of curve for further usage */
+
+/* expects that the previous element is also float */
+
+static int
+fgetcvdir(
+ GENTRY * ge
+)
+{
+ double a, b;
+ double k, k1, k2;
+ int dir = 0;
+
+ if( !(ge->flags & GEF_FLOAT) ) {
+ fprintf(stderr, "**! fgetcvdir(0x%x) on int entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ a = ge->fy3 - ge->prev->fy3;
+ b = ge->fx3 - ge->prev->fx3;
+ k = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ( b / a));
+ a = ge->fy1 - ge->prev->fy3;
+ b = ge->fx1 - ge->prev->fx3;
+ k1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ( b / a));
+ a = ge->fy3 - ge->fy2;
+ b = ge->fx3 - ge->fx2;
+ k2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ( b / a));
+
+ if (k1 < k)
+ dir |= CVDIR_FUP;
+ else if (k1 > k)
+ dir |= CVDIR_FDOWN;
+ else
+ dir |= CVDIR_FEQUAL;
+
+ if (k2 > k)
+ dir |= CVDIR_RUP;
+ else if (k2 < k)
+ dir |= CVDIR_RDOWN;
+ else
+ dir |= CVDIR_REQUAL;
+
+ return dir;
+}
+
+
+/* expects that the previous element is also int */
+
+static int
+igetcvdir(
+ GENTRY * ge
+)
+{
+ int a, b;
+ double k, k1, k2;
+ int dir = 0;
+
+ if(ge->flags & GEF_FLOAT) {
+ fprintf(stderr, "**! igetcvdir(0x%x) on floating entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ a = ge->iy3 - ge->prev->iy3;
+ b = ge->ix3 - ge->prev->ix3;
+ k = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy1 - ge->prev->iy3;
+ b = ge->ix1 - ge->prev->ix3;
+ k1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+ a = ge->iy3 - ge->iy2;
+ b = ge->ix3 - ge->ix2;
+ k2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a));
+
+ if (k1 < k)
+ dir |= CVDIR_FUP;
+ else if (k1 > k)
+ dir |= CVDIR_FDOWN;
+ else
+ dir |= CVDIR_FEQUAL;
+
+ if (k2 > k)
+ dir |= CVDIR_RUP;
+ else if (k2 < k)
+ dir |= CVDIR_RDOWN;
+ else
+ dir |= CVDIR_REQUAL;
+
+ return dir;
+}
+
+#if 0
+/* a function just to test the work of fixcvdir() */
+static void
+testfixcvdir(
+ GLYPH * g
+)
+{
+ GENTRY *ge;
+ int dir;
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type == GE_CURVE) {
+ dir = igetcvdir(ge);
+ fixcvdir(ge, dir);
+ }
+ }
+}
+#endif
+
+static int
+iround(
+ double val
+)
+{
+ return (int) (val > 0 ? val + 0.5 : val - 0.5);
+}
+
+/* for debugging - dump the glyph
+ * mark with a star the entries from start to end inclusive
+ * (start == NULL means don't mark any, end == NULL means to the last)
+ */
+
+void
+dumppaths(
+ GLYPH *g,
+ GENTRY *start,
+ GENTRY *end
+)
+{
+ GENTRY *ge;
+ int i;
+ char mark=' ';
+
+ fprintf(stderr, "Glyph %s:\n", g->name);
+
+ /* now do the conversion */
+ for(ge = g->entries; ge != 0; ge = ge->next) {
+ if(ge == start)
+ mark = '*';
+ fprintf(stderr, " %c %8x", mark, ge);
+ switch(ge->type) {
+ case GE_MOVE:
+ case GE_LINE:
+ if(ge->flags & GEF_FLOAT)
+ fprintf(stderr," %c float (%g, %g)\n", ge->type, ge->fx3, ge->fy3);
+ else
+ fprintf(stderr," %c int (%d, %d)\n", ge->type, ge->ix3, ge->iy3);
+ break;
+ case GE_CURVE:
+ if(ge->flags & GEF_FLOAT) {
+ fprintf(stderr," C float ");
+ for(i=0; i<3; i++)
+ fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]);
+ fprintf(stderr,"\n");
+ } else {
+ fprintf(stderr," C int ");
+ for(i=0; i<3; i++)
+ fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]);
+ fprintf(stderr,"\n");
+ }
+ break;
+ default:
+ fprintf(stderr, " %c\n", ge->type);
+ break;
+ }
+ if(ge == end)
+ mark = ' ';
+ }
+}
+
+/*
+ * Routine that converts all entries in the path from float to int
+ */
+
+void
+pathtoint(
+ GLYPH *g
+)
+{
+ GENTRY *ge;
+ int x[3], y[3];
+ int i;
+
+
+ if(ISDBG(TOINT))
+ fprintf(stderr, "TOINT: glyph %s\n", g->name);
+ assertisfloat(g, "converting path to int\n");
+
+ fdelsmall(g, 1.0); /* get rid of sub-pixel contours */
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ /* 1st pass, collect the directions of the curves: have
+ * to do that in advance, while everyting is float
+ */
+ for(ge = g->entries; ge != 0; ge = ge->next) {
+ if( !(ge->flags & GEF_FLOAT) ) {
+ fprintf(stderr, "**! glyphs %s has int entry, found in conversion to int\n",
+ g->name);
+ exit(1);
+ }
+ if(ge->type == GE_CURVE) {
+ ge->dir = fgetcvdir(ge);
+ }
+ }
+
+ /* now do the conversion */
+ for(ge = g->entries; ge != 0; ge = ge->next) {
+ switch(ge->type) {
+ case GE_MOVE:
+ case GE_LINE:
+ if(ISDBG(TOINT))
+ fprintf(stderr," %c float x=%g y=%g\n", ge->type, ge->fx3, ge->fy3);
+ x[0] = iround(ge->fx3);
+ y[0] = iround(ge->fy3);
+ for(i=0; i<3; i++) { /* put some valid values everywhere, for convenience */
+ ge->ixn[i] = x[0];
+ ge->iyn[i] = y[0];
+ }
+ if(ISDBG(TOINT))
+ fprintf(stderr," int x=%d y=%d\n", ge->ix3, ge->iy3);
+ break;
+ case GE_CURVE:
+ if(ISDBG(TOINT))
+ fprintf(stderr," %c float ", ge->type);
+
+ for(i=0; i<3; i++) {
+ if(ISDBG(TOINT))
+ fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]);
+ x[i] = iround(ge->fxn[i]);
+ y[i] = iround(ge->fyn[i]);
+ }
+
+ if(ISDBG(TOINT))
+ fprintf(stderr,"\n int ");
+
+ for(i=0; i<3; i++) {
+ ge->ixn[i] = x[i];
+ ge->iyn[i] = y[i];
+ if(ISDBG(TOINT))
+ fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]);
+ }
+ ge->flags &= ~GEF_FLOAT; /* for fixcvdir */
+ fixcvdir(ge, ge->dir);
+
+ if(ISDBG(TOINT)) {
+ fprintf(stderr,"\n fixed ");
+ for(i=0; i<3; i++)
+ fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]);
+ fprintf(stderr,"\n");
+ }
+
+ break;
+ }
+ ge->flags &= ~GEF_FLOAT;
+ }
+ g->flags &= ~GF_FLOAT;
+}
+
+
+/* check whether we can fix up the curve to change its size by (dx,dy) */
+/* 0 means NO, 1 means YES */
+
+/* for float: if scaling would be under 10% */
+
+int
+fcheckcv(
+ GENTRY * ge,
+ double dx,
+ double dy
+)
+{
+ if( !(ge->flags & GEF_FLOAT) ) {
+ fprintf(stderr, "**! fcheckcv(0x%x) on int entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ if (ge->type != GE_CURVE)
+ return 0;
+
+ if( fabs(ge->fx3 - ge->prev->fx3) < fabs(dx) * 10 )
+ return 0;
+
+ if( fabs(ge->fy3 - ge->prev->fy3) < fabs(dy) * 10 )
+ return 0;
+
+ return 1;
+}
+
+/* for int: if won't create new zigzags at the ends */
+
+int
+icheckcv(
+ GENTRY * ge,
+ int dx,
+ int dy
+)
+{
+ int xdep, ydep;
+
+ if(ge->flags & GEF_FLOAT) {
+ fprintf(stderr, "**! icheckcv(0x%x) on floating entry, ABORT\n", ge);
+ abort(); /* dump core */
+ }
+
+ if (ge->type != GE_CURVE)
+ return 0;
+
+ xdep = ge->ix3 - ge->prev->ix3;
+ ydep = ge->iy3 - ge->prev->iy3;
+
+ if (ge->type == GE_CURVE
+ && (xdep * (xdep + dx)) > 0
+ && (ydep * (ydep + dy)) > 0) {
+ return 1;
+ } else
+ return 0;
+}
+
+/* float connect the ends of open contours */
+
+void
+fclosepaths(
+ GLYPH * g
+)
+{
+ GENTRY *ge, *fge, *xge, *nge;
+ int i;
+
+ assertisfloat(g, "fclosepaths float\n");
+
+ for (xge = g->entries; xge != 0; xge = xge->next) {
+ if( xge->type != GE_PATH )
+ continue;
+
+ ge = xge->prev;
+ if(ge == 0 || ge->type != GE_LINE && ge->type!= GE_CURVE) {
+ fprintf(stderr, "**! Glyph %s got empty path\n",
+ g->name);
+ exit(1);
+ }
+
+ fge = ge->frwd;
+ if (fge->prev == 0 || fge->prev->type != GE_MOVE) {
+ fprintf(stderr, "**! Glyph %s got strange beginning of path\n",
+ g->name);
+ exit(1);
+ }
+ fge = fge->prev;
+ if (fge->fx3 != ge->fx3 || fge->fy3 != ge->fy3) {
+ /* we have to fix this open path */
+
+ WARNING_4 fprintf(stderr, "Glyph %s got path open by dx=%g dy=%g\n",
+ g->name, fge->fx3 - ge->fx3, fge->fy3 - ge->fy3);
+
+
+ /* add a new line */
+ nge = newgentry(GEF_FLOAT);
+ (*nge) = (*ge);
+ nge->fx3 = fge->fx3;
+ nge->fy3 = fge->fy3;
+ nge->type = GE_LINE;
+
+ addgeafter(ge, nge);
+
+ if (fabs(ge->fx3 - fge->fx3) <= 2 && fabs(ge->fy3 - fge->fy3) <= 2) {
+ /*
+ * small change, try to get rid of the new entry
+ */
+
+ double df[2];
+
+ for(i=0; i<2; i++) {
+ df[i] = ge->fpoints[i][2] - fge->fpoints[i][2];
+ df[i] = fclosegap(nge, nge, i, df[i], NULL);
+ }
+
+ if(df[0] == 0. && df[1] == 0.) {
+ /* closed gap successfully, remove the added entry */
+ freethisge(nge);
+ }
+ }
+ }
+ }
+}
+
+void
+smoothjoints(
+ GLYPH * g
+)
+{
+ GENTRY *ge, *ne;
+ int dx1, dy1, dx2, dy2, k;
+ int dir;
+
+ return; /* this stuff seems to create problems */
+
+ assertisint(g, "smoothjoints int");
+
+ if (g->entries == 0) /* nothing to do */
+ return;
+
+ for (ge = g->entries->next; ge != 0; ge = ge->next) {
+ ne = ge->frwd;
+
+ /*
+ * although there should be no one-line path * and any path
+ * must end with CLOSEPATH, * nobody can say for sure
+ */
+
+ if (ge == ne || ne == 0)
+ continue;
+
+ /* now handle various joints */
+
+ if (ge->type == GE_LINE && ne->type == GE_LINE) {
+ dx1 = ge->ix3 - ge->prev->ix3;
+ dy1 = ge->iy3 - ge->prev->iy3;
+ dx2 = ne->ix3 - ge->ix3;
+ dy2 = ne->iy3 - ge->iy3;
+
+ /* check whether they have the same direction */
+ /* and the same slope */
+ /* then we can join them into one line */
+
+ if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0 && dx1 * dy2 == dy1 * dx2) {
+ /* extend the previous line */
+ ge->ix3 = ne->ix3;
+ ge->iy3 = ne->iy3;
+
+ /* and get rid of the next line */
+ freethisge(ne);
+ }
+ } else if (ge->type == GE_LINE && ne->type == GE_CURVE) {
+ fixcvends(ne);
+
+ dx1 = ge->ix3 - ge->prev->ix3;
+ dy1 = ge->iy3 - ge->prev->iy3;
+ dx2 = ne->ix1 - ge->ix3;
+ dy2 = ne->iy1 - ge->iy3;
+
+ /* if the line is nearly horizontal and we can fix it */
+ if (dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0
+ && icheckcv(ne, 0, -dy1)
+ && abs(dy1) <= 4) {
+ dir = igetcvdir(ne);
+ ge->iy3 -= dy1;
+ ne->iy1 -= dy1;
+ fixcvdir(ne, dir);
+ if (ge->next != ne)
+ ne->prev->iy3 -= dy1;
+ dy1 = 0;
+ } else if (dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0
+ && icheckcv(ne, -dx1, 0)
+ && abs(dx1) <= 4) {
+ /* the same but vertical */
+ dir = igetcvdir(ne);
+ ge->ix3 -= dx1;
+ ne->ix1 -= dx1;
+ fixcvdir(ne, dir);
+ if (ge->next != ne)
+ ne->prev->ix3 -= dx1;
+ dx1 = 0;
+ }
+ /*
+ * if line is horizontal and curve begins nearly
+ * horizontally
+ */
+ if (dy1 == 0 && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0) {
+ dir = igetcvdir(ne);
+ ne->iy1 -= dy2;
+ fixcvdir(ne, dir);
+ dy2 = 0;
+ } else if (dx1 == 0 && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0) {
+ /* the same but vertical */
+ dir = igetcvdir(ne);
+ ne->ix1 -= dx2;
+ fixcvdir(ne, dir);
+ dx2 = 0;
+ }
+ } else if (ge->type == GE_CURVE && ne->type == GE_LINE) {
+ fixcvends(ge);
+
+ dx1 = ge->ix3 - ge->ix2;
+ dy1 = ge->iy3 - ge->iy2;
+ dx2 = ne->ix3 - ge->ix3;
+ dy2 = ne->iy3 - ge->iy3;
+
+ /* if the line is nearly horizontal and we can fix it */
+ if (dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0
+ && icheckcv(ge, 0, dy2)
+ && abs(dy2) <= 4) {
+ dir = igetcvdir(ge);
+ ge->iy3 += dy2;
+ ge->iy2 += dy2;
+ fixcvdir(ge, dir);
+ if (ge->next != ne)
+ ne->prev->iy3 += dy2;
+ dy2 = 0;
+ } else if (dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0
+ && icheckcv(ge, dx2, 0)
+ && abs(dx2) <= 4) {
+ /* the same but vertical */
+ dir = igetcvdir(ge);
+ ge->ix3 += dx2;
+ ge->ix2 += dx2;
+ fixcvdir(ge, dir);
+ if (ge->next != ne)
+ ne->prev->ix3 += dx2;
+ dx2 = 0;
+ }
+ /*
+ * if line is horizontal and curve ends nearly
+ * horizontally
+ */
+ if (dy2 == 0 && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0) {
+ dir = igetcvdir(ge);
+ ge->iy2 += dy1;
+ fixcvdir(ge, dir);
+ dy1 = 0;
+ } else if (dx2 == 0 && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0) {
+ /* the same but vertical */
+ dir = igetcvdir(ge);
+ ge->ix2 += dx1;
+ fixcvdir(ge, dir);
+ dx1 = 0;
+ }
+ } else if (ge->type == GE_CURVE && ne->type == GE_CURVE) {
+ fixcvends(ge);
+ fixcvends(ne);
+
+ dx1 = ge->ix3 - ge->ix2;
+ dy1 = ge->iy3 - ge->iy2;
+ dx2 = ne->ix1 - ge->ix3;
+ dy2 = ne->iy1 - ge->iy3;
+
+ /*
+ * check if we have a rather smooth joint at extremal
+ * point
+ */
+ /* left or right extremal point */
+ if (abs(dx1) <= 4 && abs(dx2) <= 4
+ && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0
+ && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0
+ && (ge->iy3 < ge->prev->iy3 && ne->iy3 < ge->iy3
+ || ge->iy3 > ge->prev->iy3 && ne->iy3 > ge->iy3)
+ && (ge->ix3 - ge->prev->ix3) * (ne->ix3 - ge->ix3) < 0
+ ) {
+ dir = igetcvdir(ge);
+ ge->ix2 += dx1;
+ dx1 = 0;
+ fixcvdir(ge, dir);
+ dir = igetcvdir(ne);
+ ne->ix1 -= dx2;
+ dx2 = 0;
+ fixcvdir(ne, dir);
+ }
+ /* top or down extremal point */
+ else if (abs(dy1) <= 4 && abs(dy2) <= 4
+ && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0
+ && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0
+ && (ge->ix3 < ge->prev->ix3 && ne->ix3 < ge->ix3
+ || ge->ix3 > ge->prev->ix3 && ne->ix3 > ge->ix3)
+ && (ge->iy3 - ge->prev->iy3) * (ne->iy3 - ge->iy3) < 0
+ ) {
+ dir = igetcvdir(ge);
+ ge->iy2 += dy1;
+ dy1 = 0;
+ fixcvdir(ge, dir);
+ dir = igetcvdir(ne);
+ ne->iy1 -= dy2;
+ dy2 = 0;
+ fixcvdir(ne, dir);
+ }
+ /* or may be we just have a smooth junction */
+ else if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0
+ && 10 * abs(k = abs(dx1 * dy2) - abs(dy1 * dx2)) < (abs(dx1 * dy2) + abs(dy1 * dx2))) {
+ int tries[6][4];
+ int results[6];
+ int i, b;
+
+ /* build array of changes we are going to try */
+ /* uninitalized entries are 0 */
+ if (k > 0) {
+ static int t1[6][4] = {
+ {0, 0, 0, 0},
+ {-1, 0, 1, 0},
+ {-1, 0, 0, 1},
+ {0, -1, 1, 0},
+ {0, -1, 0, 1},
+ {-1, -1, 1, 1}};
+ memcpy(tries, t1, sizeof tries);
+ } else {
+ static int t1[6][4] = {
+ {0, 0, 0, 0},
+ {1, 0, -1, 0},
+ {1, 0, 0, -1},
+ {0, 1, -1, 0},
+ {0, 1, 0, -1},
+ {1, 1, -1, -1}};
+ memcpy(tries, t1, sizeof tries);
+ }
+
+ /* now try the changes */
+ results[0] = abs(k);
+ for (i = 1; i < 6; i++) {
+ results[i] = abs((abs(dx1) + tries[i][0]) * (abs(dy2) + tries[i][1]) -
+ (abs(dy1) + tries[i][2]) * (abs(dx2) + tries[i][3]));
+ }
+
+ /* and find the best try */
+ k = abs(k);
+ b = 0;
+ for (i = 1; i < 6; i++)
+ if (results[i] < k) {
+ k = results[i];
+ b = i;
+ }
+ /* and finally apply it */
+ if (dx1 < 0)
+ tries[b][0] = -tries[b][0];
+ if (dy2 < 0)
+ tries[b][1] = -tries[b][1];
+ if (dy1 < 0)
+ tries[b][2] = -tries[b][2];
+ if (dx2 < 0)
+ tries[b][3] = -tries[b][3];
+
+ dir = igetcvdir(ge);
+ ge->ix2 -= tries[b][0];
+ ge->iy2 -= tries[b][2];
+ fixcvdir(ge, dir);
+ dir = igetcvdir(ne);
+ ne->ix1 += tries[b][3];
+ ne->iy1 += tries[b][1];
+ fixcvdir(ne, dir);
+ }
+ }
+ }
+}
+
+/* debugging: print out stems of a glyph */
+static void
+debugstems(
+ char *name,
+ STEM * hstems,
+ int nhs,
+ STEM * vstems,
+ int nvs
+)
+{
+ int i;
+
+ fprintf(pfa_file, "%% %s\n", name);
+ fprintf(pfa_file, "%% %d horizontal stems:\n", nhs);
+ for (i = 0; i < nhs; i++)
+ fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c%c%c\n", i, hstems[i].value,
+ hstems[i].from, hstems[i].to,
+ ((hstems[i].flags & ST_UP) ? 'U' : 'D'),
+ ((hstems[i].flags & ST_END) ? 'E' : '-'),
+ ((hstems[i].flags & ST_FLAT) ? 'F' : '-'),
+ ((hstems[i].flags & ST_ZONE) ? 'Z' : ' '),
+ ((hstems[i].flags & ST_TOPZONE) ? 'T' : ' '));
+ fprintf(pfa_file, "%% %d vertical stems:\n", nvs);
+ for (i = 0; i < nvs; i++)
+ fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c\n", i, vstems[i].value,
+ vstems[i].from, vstems[i].to,
+ ((vstems[i].flags & ST_UP) ? 'U' : 'D'),
+ ((vstems[i].flags & ST_END) ? 'E' : '-'),
+ ((vstems[i].flags & ST_FLAT) ? 'F' : '-'));
+}
+
+/* add pseudo-stems for the limits of the Blue zones to the stem array */
+static int
+addbluestems(
+ STEM *s,
+ int n
+)
+{
+ int i;
+
+ for(i=0; i<nblues && i<2; i+=2) { /* baseline */
+ s[n].value=bluevalues[i];
+ s[n].flags=ST_UP|ST_ZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i;
+ n++;
+ s[n].value=bluevalues[i+1];
+ s[n].flags=ST_ZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i+1;
+ n++;
+ }
+ for(i=2; i<nblues; i+=2) { /* top zones */
+ s[n].value=bluevalues[i];
+ s[n].flags=ST_UP|ST_ZONE|ST_TOPZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i;
+ n++;
+ s[n].value=bluevalues[i+1];
+ s[n].flags=ST_ZONE|ST_TOPZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i+1;
+ n++;
+ }
+ for(i=0; i<notherb; i+=2) { /* bottom zones */
+ s[n].value=otherblues[i];
+ s[n].flags=ST_UP|ST_ZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i+nblues;
+ n++;
+ s[n].value=otherblues[i+1];
+ s[n].flags=ST_ZONE;
+ /* don't overlap with anything */
+ s[n].origin=s[n].from=s[n].to= -10000+i+1+nblues;
+ n++;
+ }
+ return n;
+}
+
+/* sort stems in array */
+static void
+sortstems(
+ STEM * s,
+ int n
+)
+{
+ int i, j;
+ STEM x;
+
+
+ /* a simple sorting */
+ /* hm, the ordering criteria are not quite simple :-)
+ * if the values are tied
+ * ST_UP always goes under not ST_UP
+ * ST_ZONE goes on the most outer side
+ * ST_END goes towards inner side after ST_ZONE
+ * ST_FLAT goes on the inner side
+ */
+
+ for (i = 0; i < n; i++)
+ for (j = i + 1; j < n; j++) {
+ if(s[i].value < s[j].value)
+ continue;
+ if(s[i].value == s[j].value) {
+ if( (s[i].flags & ST_UP) < (s[j].flags & ST_UP) )
+ continue;
+ if( (s[i].flags & ST_UP) == (s[j].flags & ST_UP) ) {
+ if( s[i].flags & ST_UP ) {
+ if(
+ (s[i].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT)
+ >
+ (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT)
+ )
+ continue;
+ } else {
+ if(
+ (s[i].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT)
+ <
+ (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT)
+ )
+ continue;
+ }
+ }
+ }
+ x = s[j];
+ s[j] = s[i];
+ s[i] = x;
+ }
+}
+
+/* check whether two stem borders overlap */
+
+static int
+stemoverlap(
+ STEM * s1,
+ STEM * s2
+)
+{
+ int result;
+
+ if (s1->from <= s2->from && s1->to >= s2->from
+ || s2->from <= s1->from && s2->to >= s1->from)
+ result = 1;
+ else
+ result = 0;
+
+ if (ISDBG(STEMOVERLAP))
+ fprintf(pfa_file, "%% overlap %d(%d..%d)x%d(%d..%d)=%d\n",
+ s1->value, s1->from, s1->to, s2->value, s2->from, s2->to, result);
+ return result;
+}
+
+/*
+ * check if the stem [border] is in an appropriate blue zone
+ * (currently not used)
+ */
+
+static int
+steminblue(
+ STEM *s
+)
+{
+ int i, val;
+
+ val=s->value;
+ if(s->flags & ST_UP) {
+ /* painted size up, look at lower zones */
+ if(nblues>=2 && val>=bluevalues[0] && val<=bluevalues[1] )
+ return 1;
+ for(i=0; i<notherb; i++) {
+ if( val>=otherblues[i] && val<=otherblues[i+1] )
+ return 1;
+ }
+ } else {
+ /* painted side down, look at upper zones */
+ for(i=2; i<nblues; i++) {
+ if( val>=bluevalues[i] && val<=bluevalues[i+1] )
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* mark the outermost stem [borders] in the blue zones */
+
+static void
+markbluestems(
+ STEM *s,
+ int nold
+)
+{
+ int i, j, a, b, c;
+ /*
+ * traverse the list of Blue Values, mark the lowest upper
+ * stem in each bottom zone and the topmost lower stem in
+ * each top zone with ST_BLUE
+ */
+
+ /* top zones */
+ for(i=2; i<nblues; i+=2) {
+ a=bluevalues[i]; b=bluevalues[i+1];
+ if(ISDBG(BLUESTEMS))
+ fprintf(pfa_file, "%% looking at blue zone %d...%d\n", a, b);
+ for(j=nold-1; j>=0; j--) {
+ if( s[j].flags & (ST_ZONE|ST_UP|ST_END) )
+ continue;
+ c=s[j].value;
+ if(c<a) /* too low */
+ break;
+ if(c<=b) { /* found the topmost stem border */
+ /* mark all the stems with the same value */
+ if(ISDBG(BLUESTEMS))
+ fprintf(pfa_file, "%% found D BLUE at %d\n", s[j].value);
+ /* include ST_END values */
+ while( s[j+1].value==c && (s[j+1].flags & ST_ZONE)==0 )
+ j++;
+ s[j].flags |= ST_BLUE;
+ for(j--; j>=0 && s[j].value==c
+ && (s[j].flags & (ST_UP|ST_ZONE))==0 ; j--)
+ s[j].flags |= ST_BLUE;
+ break;
+ }
+ }
+ }
+ /* baseline */
+ if(nblues>=2) {
+ a=bluevalues[0]; b=bluevalues[1];
+ for(j=0; j<nold; j++) {
+ if( (s[j].flags & (ST_ZONE|ST_UP|ST_END))!=ST_UP )
+ continue;
+ c=s[j].value;
+ if(c>b) /* too high */
+ break;
+ if(c>=a) { /* found the lowest stem border */
+ /* mark all the stems with the same value */
+ if(ISDBG(BLUESTEMS))
+ fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value);
+ /* include ST_END values */
+ while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 )
+ j--;
+ s[j].flags |= ST_BLUE;
+ for(j++; j<nold && s[j].value==c
+ && (s[j].flags & (ST_UP|ST_ZONE))==ST_UP ; j++)
+ s[j].flags |= ST_BLUE;
+ break;
+ }
+ }
+ }
+ /* bottom zones: the logic is the same as for baseline */
+ for(i=0; i<notherb; i+=2) {
+ a=otherblues[i]; b=otherblues[i+1];
+ for(j=0; j<nold; j++) {
+ if( (s[j].flags & (ST_UP|ST_ZONE|ST_END))!=ST_UP )
+ continue;
+ c=s[j].value;
+ if(c>b) /* too high */
+ break;
+ if(c>=a) { /* found the lowest stem border */
+ /* mark all the stems with the same value */
+ if(ISDBG(BLUESTEMS))
+ fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value);
+ /* include ST_END values */
+ while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 )
+ j--;
+ s[j].flags |= ST_BLUE;
+ for(j++; j<nold && s[j].value==c
+ && (s[j].flags & (ST_UP|ST_ZONE))==ST_UP ; j++)
+ s[j].flags |= ST_BLUE;
+ break;
+ }
+ }
+ }
+}
+
+/* Eliminate invalid stems, join equivalent lines and remove nested stems
+ * to build the main (non-substituted) set of stems.
+ * XXX add consideration of the italic angle
+ */
+static int
+joinmainstems(
+ STEM * s,
+ int nold,
+ int useblues /* do we use the blue values ? */
+)
+{
+#define MAX_STACK 1000
+ STEM stack[MAX_STACK];
+ int nstack = 0;
+ int sbottom = 0;
+ int nnew;
+ int i, j, k;
+ int a, b, c, w1, w2, w3;
+ int fw, fd;
+ /*
+ * priority of the last found stem:
+ * 0 - nothing found yet
+ * 1 - has ST_END in it (one or more)
+ * 2 - has no ST_END and no ST_FLAT, can override only one stem
+ * with priority 1
+ * 3 - has no ST_END and at least one ST_FLAT, can override one
+ * stem with priority 2 or any number of stems with priority 1
+ * 4 (handled separately) - has ST_BLUE, can override anything
+ */
+ int readystem = 0;
+ int pri;
+ int nlps = 0; /* number of non-committed
+ * lowest-priority stems */
+
+
+ for (i = 0, nnew = 0; i < nold; i++) {
+ if (s[i].flags & (ST_UP|ST_ZONE)) {
+ if(s[i].flags & ST_BLUE) {
+ /* we just HAVE to use this value */
+ if (readystem)
+ nnew += 2;
+ readystem=0;
+
+ /* remember the list of Blue zone stems with the same value */
+ for(a=i, i++; i<nold && s[a].value==s[i].value
+ && (s[i].flags & ST_BLUE); i++)
+ {}
+ b=i; /* our range is a <= i < b */
+ c= -1; /* index of our best guess up to now */
+ pri=0;
+ /* try to find a match, don't cross blue zones */
+ for(; i<nold && (s[i].flags & ST_BLUE)==0; i++) {
+ if(s[i].flags & ST_UP) {
+ if(s[i].flags & ST_TOPZONE)
+ break;
+ else
+ continue;
+ }
+ for(j=a; j<b; j++) {
+ if(!stemoverlap(&s[j], &s[i]) )
+ continue;
+ /* consider priorities */
+ if( ( (s[j].flags|s[i].flags) & (ST_FLAT|ST_END) )==ST_FLAT ) {
+ c=i;
+ goto bluematch;
+ }
+ if( ((s[j].flags|s[i].flags) & ST_END)==0 ) {
+ if(pri < 2) {
+ c=i; pri=2;
+ }
+ } else {
+ if(pri == 0) {
+ c=i; pri=1;
+ }
+ }
+ }
+ }
+ bluematch:
+ /* clean up the stack */
+ nstack=sbottom=0;
+ readystem=0;
+ /* add this stem */
+ s[nnew++]=s[a];
+ if(c<0) { /* make one-dot-wide stem */
+ if(nnew>=b) { /* have no free space */
+ for(j=nold; j>=b; j--) /* make free space */
+ s[j]=s[j-1];
+ b++;
+ nold++;
+ }
+ s[nnew]=s[a];
+ s[nnew].flags &= ~(ST_UP|ST_BLUE);
+ nnew++;
+ i=b-1;
+ } else {
+ s[nnew++]=s[c];
+ i=c; /* skip up to this point */
+ }
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d U BLUE\n",
+ s[nnew-2].value, s[nnew-1].value);
+ } else {
+ if (nstack >= MAX_STACK) {
+ WARNING_1 fprintf(stderr, "Warning: **** converter's stem stack overflow ****\n");
+ nstack = 0;
+ }
+ stack[nstack++] = s[i];
+ }
+ } else if(s[i].flags & ST_BLUE) {
+ /* again, we just HAVE to use this value */
+ if (readystem)
+ nnew += 2;
+ readystem=0;
+
+ /* remember the list of Blue zone stems with the same value */
+ for(a=i, i++; i<nold && s[a].value==s[i].value
+ && (s[i].flags & ST_BLUE); i++)
+ {}
+ b=i; /* our range is a <= i < b */
+ c= -1; /* index of our best guess up to now */
+ pri=0;
+ /* try to find a match */
+ for (i = nstack - 1; i >= 0; i--) {
+ if( (stack[i].flags & ST_UP)==0 ) {
+ if( (stack[i].flags & (ST_ZONE|ST_TOPZONE))==ST_ZONE )
+ break;
+ else
+ continue;
+ }
+ for(j=a; j<b; j++) {
+ if(!stemoverlap(&s[j], &stack[i]) )
+ continue;
+ /* consider priorities */
+ if( ( (s[j].flags|stack[i].flags) & (ST_FLAT|ST_END) )==ST_FLAT ) {
+ c=i;
+ goto bluedownmatch;
+ }
+ if( ((s[j].flags|stack[i].flags) & ST_END)==0 ) {
+ if(pri < 2) {
+ c=i; pri=2;
+ }
+ } else {
+ if(pri == 0) {
+ c=i; pri=1;
+ }
+ }
+ }
+ }
+ bluedownmatch:
+ /* if found no match make a one-dot-wide stem */
+ if(c<0) {
+ c=0;
+ stack[0]=s[b-1];
+ stack[0].flags |= ST_UP;
+ stack[0].flags &= ~ST_BLUE;
+ }
+ /* remove all the stems conflicting with this one */
+ readystem=0;
+ for(j=nnew-2; j>=0; j-=2) {
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% ?stem %d...%d -- %d\n",
+ s[j].value, s[j+1].value, stack[c].value);
+ if(s[j+1].value < stack[c].value) /* no conflict */
+ break;
+ if(s[j].flags & ST_BLUE) {
+ /* oops, we don't want to spoil other blue zones */
+ stack[c].value=s[j+1].value+1;
+ break;
+ }
+ if( (s[j].flags|s[j+1].flags) & ST_END ) {
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% -stem %d...%d p=1\n",
+ s[j].value, s[j+1].value);
+ continue; /* pri==1, silently discard it */
+ }
+ /* we want to discard no nore than 2 stems of pri>=2 */
+ if( ++readystem > 2 ) {
+ /* change our stem to not conflict */
+ stack[c].value=s[j+1].value+1;
+ break;
+ } else {
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% -stem %d...%d p>=2\n",
+ s[j].value, s[j+1].value);
+ continue;
+ }
+ }
+ nnew=j+2;
+ /* add this stem */
+ if(nnew>=b-1) { /* have no free space */
+ for(j=nold; j>=b-1; j--) /* make free space */
+ s[j]=s[j-1];
+ b++;
+ nold++;
+ }
+ s[nnew++]=stack[c];
+ s[nnew++]=s[b-1];
+ /* clean up the stack */
+ nstack=sbottom=0;
+ readystem=0;
+ /* set the next position to search */
+ i=b-1;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d D BLUE\n",
+ s[nnew-2].value, s[nnew-1].value);
+ } else if (nstack > 0) {
+
+ /*
+ * check whether our stem overlaps with anything in
+ * stack
+ */
+ for (j = nstack - 1; j >= sbottom; j--) {
+ if (s[i].value <= stack[j].value)
+ break;
+ if (stack[j].flags & ST_ZONE)
+ continue;
+
+ if ((s[i].flags & ST_END)
+ || (stack[j].flags & ST_END))
+ pri = 1;
+ else if ((s[i].flags & ST_FLAT)
+ || (stack[j].flags & ST_FLAT))
+ pri = 3;
+ else
+ pri = 2;
+
+ if (pri < readystem && s[nnew + 1].value >= stack[j].value
+ || !stemoverlap(&stack[j], &s[i]))
+ continue;
+
+ if (readystem > 1 && s[nnew + 1].value < stack[j].value) {
+ nnew += 2;
+ readystem = 0;
+ nlps = 0;
+ }
+ /*
+ * width of the previous stem (if it's
+ * present)
+ */
+ w1 = s[nnew + 1].value - s[nnew].value;
+
+ /* width of this stem */
+ w2 = s[i].value - stack[j].value;
+
+ if (readystem == 0) {
+ /* nothing yet, just add a new stem */
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ readystem = pri;
+ if (pri == 1)
+ nlps = 1;
+ else if (pri == 2)
+ sbottom = j;
+ else {
+ sbottom = j + 1;
+ while (sbottom < nstack
+ && stack[sbottom].value <= stack[j].value)
+ sbottom++;
+ }
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ } else if (pri == 1) {
+ if (stack[j].value > s[nnew + 1].value) {
+ /*
+ * doesn't overlap with the
+ * previous one
+ */
+ nnew += 2;
+ nlps++;
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ } else if (w2 < w1) {
+ /* is narrower */
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d %d->%d\n",
+ stack[j].value, s[i].value, pri, nlps, w1, w2);
+ }
+ } else if (pri == 2) {
+ if (readystem == 2) {
+ /* choose the narrower stem */
+ if (w1 > w2) {
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ sbottom = j;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ }
+ /* else readystem==1 */
+ } else if (stack[j].value > s[nnew + 1].value) {
+ /*
+ * value doesn't overlap with
+ * the previous one
+ */
+ nnew += 2;
+ nlps = 0;
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ sbottom = j;
+ readystem = pri;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ } else if (nlps == 1
+ || stack[j].value > s[nnew - 1].value) {
+ /*
+ * we can replace the top
+ * stem
+ */
+ nlps = 0;
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ readystem = pri;
+ sbottom = j;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ }
+ } else if (readystem == 3) { /* that means also
+ * pri==3 */
+ /* choose the narrower stem */
+ if (w1 > w2) {
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ sbottom = j + 1;
+ while (sbottom < nstack
+ && stack[sbottom].value <= stack[j].value)
+ sbottom++;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ }
+ } else if (pri == 3) {
+ /*
+ * we can replace as many stems as
+ * neccessary
+ */
+ nnew += 2;
+ while (nnew > 0 && s[nnew - 1].value >= stack[j].value) {
+ nnew -= 2;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% -stem %d..%d\n",
+ s[nnew].value, s[nnew + 1].value);
+ }
+ nlps = 0;
+ s[nnew] = stack[j];
+ s[nnew + 1] = s[i];
+ readystem = pri;
+ sbottom = j + 1;
+ while (sbottom < nstack
+ && stack[sbottom].value <= stack[j].value)
+ sbottom++;
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n",
+ stack[j].value, s[i].value, pri, nlps);
+ }
+ }
+ }
+ }
+ if (readystem)
+ nnew += 2;
+
+ /* change the 1-pixel-wide stems to 20-pixel-wide stems if possible
+ * the constant 20 is recommended in the Type1 manual
+ */
+ if(useblues) {
+ for(i=0; i<nnew; i+=2) {
+ if(s[i].value != s[i+1].value)
+ continue;
+ if( ((s[i].flags ^ s[i+1].flags) & ST_BLUE)==0 )
+ continue;
+ if( s[i].flags & ST_BLUE ) {
+ if(nnew>i+2 && s[i+2].value<s[i].value+22)
+ s[i+1].value=s[i+2].value-2; /* compensate for fuzziness */
+ else
+ s[i+1].value+=20;
+ } else {
+ if(i>0 && s[i-1].value>s[i].value-22)
+ s[i].value=s[i-1].value+2; /* compensate for fuzziness */
+ else
+ s[i].value-=20;
+ }
+ }
+ }
+ /* make sure that no stem it stretched between
+ * a top zone and a bottom zone
+ */
+ if(useblues) {
+ for(i=0; i<nnew; i+=2) {
+ a=10000; /* lowest border of top zone crosing the stem */
+ b= -10000; /* highest border of bottom zone crossing the stem */
+
+ for(j=2; j<nblues; j++) {
+ c=bluevalues[j];
+ if( c>=s[i].value && c<=s[i+1].value && c<a )
+ a=c;
+ }
+ if(nblues>=2) {
+ c=bluevalues[1];
+ if( c>=s[i].value && c<=s[i+1].value && c>b )
+ b=c;
+ }
+ for(j=1; j<notherb; j++) {
+ c=otherblues[j];
+ if( c>=s[i].value && c<=s[i+1].value && c>b )
+ b=c;
+ }
+ if( a!=10000 && b!= -10000 ) { /* it is stretched */
+ /* split the stem into 2 ghost stems */
+ for(j=nnew+1; j>i+1; j--) /* make free space */
+ s[j]=s[j-2];
+ nnew+=2;
+
+ if(s[i].value+22 >= a)
+ s[i+1].value=a-2; /* leave space for fuzziness */
+ else
+ s[i+1].value=s[i].value+20;
+
+ if(s[i+3].value-22 <= b)
+ s[i+2].value=b+2; /* leave space for fuzziness */
+ else
+ s[i+2].value=s[i+3].value-20;
+
+ i+=2;
+ }
+ }
+ }
+ /* look for triple stems */
+ for (i = 0; i < nnew; i += 2) {
+ if (nnew - i >= 6) {
+ a = s[i].value + s[i + 1].value;
+ b = s[i + 2].value + s[i + 3].value;
+ c = s[i + 4].value + s[i + 5].value;
+
+ w1 = s[i + 1].value - s[i].value;
+ w2 = s[i + 3].value - s[i + 2].value;
+ w3 = s[i + 5].value - s[i + 4].value;
+
+ fw = w3 - w1; /* fuzz in width */
+ fd = ((c - b) - (b - a)); /* fuzz in distance
+ * (doubled) */
+
+ /* we are able to handle some fuzz */
+ /*
+ * it doesn't hurt if the declared stem is a bit
+ * narrower than actual unless it's an edge in
+ * a blue zone
+ */
+ if (abs(abs(fd) - abs(fw)) * 5 < w2
+ && abs(fw) * 20 < (w1 + w3)) { /* width dirrerence <10% */
+
+ if(useblues) { /* check that we don't disturb any blue stems */
+ j=c; k=a;
+ if (fw > 0) {
+ if (fd > 0) {
+ if( s[i+5].flags & ST_BLUE )
+ continue;
+ j -= fw;
+ } else {
+ if( s[i+4].flags & ST_BLUE )
+ continue;
+ j += fw;
+ }
+ } else if(fw < 0) {
+ if (fd > 0) {
+ if( s[i+1].flags & ST_BLUE )
+ continue;
+ k -= fw;
+ } else {
+ if( s[i].flags & ST_BLUE )
+ continue;
+ k += fw;
+ }
+ }
+ pri = ((j - b) - (b - k));
+
+ if (pri > 0) {
+ if( s[i+2].flags & ST_BLUE )
+ continue;
+ } else if(pri < 0) {
+ if( s[i+3].flags & ST_BLUE )
+ continue;
+ }
+ }
+
+ /*
+ * first fix up the width of 1st and 3rd
+ * stems
+ */
+ if (fw > 0) {
+ if (fd > 0) {
+ s[i + 5].value -= fw;
+ c -= fw;
+ } else {
+ s[i + 4].value += fw;
+ c += fw;
+ }
+ } else {
+ if (fd > 0) {
+ s[i + 1].value -= fw;
+ a -= fw;
+ } else {
+ s[i].value += fw;
+ a += fw;
+ }
+ }
+ fd = ((c - b) - (b - a));
+
+ if (fd > 0) {
+ s[i + 2].value += abs(fd) / 2;
+ } else {
+ s[i + 3].value -= abs(fd) / 2;
+ }
+
+ s[i].flags |= ST_3;
+ i += 4;
+ }
+ }
+ }
+
+ return (nnew & ~1); /* number of lines must be always even */
+}
+
+/*
+ * these macros and function allow to set the base stem,
+ * check that it's not empty and subtract another stem
+ * from the base stem (possibly dividing it into multiple parts)
+ */
+
+/* pairs for pieces of the base stem */
+static short xbstem[MAX_STEMS*2];
+/* index of the last point */
+static int xblast= -1;
+
+#define setbasestem(from, to) \
+ (xbstem[0]=from, xbstem[1]=to, xblast=1)
+#define isbaseempty() (xblast<=0)
+
+/* returns 1 if was overlapping, 0 otherwise */
+static int
+subfrombase(
+ int from,
+ int to
+)
+{
+ int a, b;
+ int i, j;
+
+ if(isbaseempty())
+ return 0;
+
+ /* handle the simple case simply */
+ if(from > xbstem[xblast] || to < xbstem[0])
+ return 0;
+
+ /* the binary search may be more efficient */
+ /* but for now the linear search is OK */
+ for(b=1; from > xbstem[b]; b+=2) {} /* result: from <= xbstem[b] */
+ for(a=xblast-1; to < xbstem[a]; a-=2) {} /* result: to >= xbstem[a] */
+
+ /* now the interesting examples are:
+ * (it was hard for me to understand, so I looked at the examples)
+ * 1
+ * a|-----| |-----|b |-----| |-----|
+ * f|-----|t
+ * 2
+ * a|-----|b |-----| |-----| |-----|
+ * f|--|t
+ * 3
+ * a|-----|b |-----| |-----| |-----|
+ * f|-----|t
+ * 4
+ * |-----|b a|-----| |-----| |-----|
+ * f|------------|t
+ * 5
+ * |-----| |-----|b |-----| a|-----|
+ * f|-----------------------------|t
+ * 6
+ * |-----|b |-----| |-----| a|-----|
+ * f|--------------------------------------------------|t
+ * 7
+ * |-----|b |-----| a|-----| |-----|
+ * f|--------------------------|t
+ */
+
+ if(a < b-1) /* hits a gap - example 1 */
+ return 0;
+
+ /* now the subtraction itself */
+
+ if(a==b-1 && from > xbstem[a] && to < xbstem[b]) {
+ /* overlaps with only one subrange and splits it - example 2 */
+ j=xblast; i=(xblast+=2);
+ while(j>=b)
+ xbstem[i--]=xbstem[j--];
+ xbstem[b]=from-1;
+ xbstem[b+1]=to+1;
+ return 1;
+ /* becomes
+ * 2a
+ * a|b || |-----| |-----| |-----|
+ * f|--|t
+ */
+ }
+
+ if(xbstem[b-1] < from) {
+ /* cuts the back of this subrange - examples 3, 4, 7 */
+ xbstem[b] = from-1;
+ b+=2;
+ /* becomes
+ * 3a
+ * a|----| |-----|b |-----| |-----|
+ * f|-----|t
+ * 4a
+ * |---| a|-----|b |-----| |-----|
+ * f|------------|t
+ * 7a
+ * |---| |-----|b a|-----| |-----|
+ * f|--------------------------|t
+ */
+ }
+
+ if(xbstem[a+1] > to) {
+ /* cuts the front of this subrange - examples 4a, 5, 7a */
+ xbstem[a] = to+1;
+ a-=2;
+ /* becomes
+ * 4b
+ * a|---| |---|b |-----| |-----|
+ * f|------------|t
+ * 5b
+ * |-----| |-----|b a|-----| ||
+ * f|-----------------------------|t
+ * 7b
+ * |---| a|-----|b || |-----|
+ * f|--------------------------|t
+ */
+ }
+
+ if(a < b-1) /* now after modification it hits a gap - examples 3a, 4b */
+ return 1; /* because we have removed something */
+
+ /* now remove the subranges completely covered by the new stem */
+ /* examples 5b, 6, 7b */
+ i=b-1; j=a+2;
+ /* positioned as:
+ * 5b i j
+ * |-----| |-----|b a|-----| ||
+ * f|-----------------------------|t
+ * 6 i xblast j
+ * |-----|b |-----| |-----| a|-----|
+ * f|--------------------------------------------------|t
+ * 7b i j
+ * |---| a|-----|b || |-----|
+ * f|--------------------------|t
+ */
+ while(j <= xblast)
+ xbstem[i++]=xbstem[j++];
+ xblast=i-1;
+ return 1;
+}
+
+/* for debugging */
+static void
+printbasestem(void)
+{
+ int i;
+
+ printf("( ");
+ for(i=0; i<xblast; i+=2)
+ printf("%d-%d ", xbstem[i], xbstem[i+1]);
+ printf(") %d\n", xblast);
+}
+
+/*
+ * Join the stem borders to build the sets of substituted stems
+ * XXX add consideration of the italic angle
+ */
+static void
+joinsubstems(
+ STEM * s,
+ short *pairs,
+ int nold,
+ int useblues /* do we use the blue values ? */
+)
+{
+ int i, j, x;
+ static unsigned char mx[MAX_STEMS][MAX_STEMS];
+
+ /* we do the substituted groups of stems first
+ * and it looks like it's going to be REALLY SLOW
+ * AND PAINFUL but let's bother about it later
+ */
+
+ /* for the substituted stems we don't bother about [hv]stem3 -
+ * anyway the X11R6 rasterizer does not bother about hstem3
+ * at all and is able to handle only one global vstem3
+ * per glyph
+ */
+
+ /* clean the used part of matrix */
+ for(i=0; i<nold; i++)
+ for(j=0; j<nold; j++)
+ mx[i][j]=0;
+
+ /* build the matrix of stem pairs */
+ for(i=0; i<nold; i++) {
+ if( s[i].flags & ST_ZONE )
+ continue;
+ if(s[i].flags & ST_BLUE)
+ mx[i][i]=1; /* allow to pair with itself if no better pair */
+ if(s[i].flags & ST_UP) { /* the down-stems are already matched */
+ setbasestem(s[i].from, s[i].to);
+ for(j=i+1; j<nold; j++) {
+ if(s[i].value==s[j].value
+ || s[j].flags & ST_ZONE ) {
+ continue;
+ }
+ x=subfrombase(s[j].from, s[j].to);
+
+ if(s[j].flags & ST_UP) /* match only up+down pairs */
+ continue;
+
+ mx[i][j]=mx[j][i]=x;
+
+ if(isbaseempty()) /* nothing else to do */
+ break;
+ }
+ }
+ }
+
+ if(ISDBG(SUBSTEMS)) {
+ fprintf(pfa_file, "%% ");
+ for(j=0; j<nold; j++)
+ putc( j%10==0 ? '0'+(j/10)%10 : ' ', pfa_file);
+ fprintf(pfa_file, "\n%% ");
+ for(j=0; j<nold; j++)
+ putc('0'+j%10, pfa_file);
+ putc('\n', pfa_file);
+ for(i=0; i<nold; i++) {
+ fprintf(pfa_file, "%% %3d ",i);
+ for(j=0; j<nold; j++)
+ putc( mx[i][j] ? 'X' : '.', pfa_file);
+ putc('\n', pfa_file);
+ }
+ }
+
+ /* now use the matrix to find the best pair for each stem */
+ for(i=0; i<nold; i++) {
+ int pri, lastpri, v, f;
+
+ x= -1; /* best pair: none */
+ lastpri=0;
+
+ v=s[i].value;
+ f=s[i].flags;
+
+ if(f & ST_ZONE) {
+ pairs[i]= -1;
+ continue;
+ }
+
+ if(f & ST_UP) {
+ for(j=i+1; j<nold; j++) {
+ if(mx[i][j]==0)
+ continue;
+
+ if( (f | s[j].flags) & ST_END )
+ pri=1;
+ else if( (f | s[j].flags) & ST_FLAT )
+ pri=3;
+ else
+ pri=2;
+
+ if(lastpri==0
+ || pri > lastpri
+ && ( lastpri==1 || s[j].value-v<20 || (s[x].value-v)*2 >= s[j].value-v ) ) {
+ lastpri=pri;
+ x=j;
+ }
+ }
+ } else {
+ for(j=i-1; j>=0; j--) {
+ if(mx[i][j]==0)
+ continue;
+
+ if( (f | s[j].flags) & ST_END )
+ pri=1;
+ else if( (f | s[j].flags) & ST_FLAT )
+ pri=3;
+ else
+ pri=2;
+
+ if(lastpri==0
+ || pri > lastpri
+ && ( lastpri==1 || v-s[j].value<20 || (v-s[x].value)*2 >= v-s[j].value ) ) {
+ lastpri=pri;
+ x=j;
+ }
+ }
+ }
+ if(x== -1 && mx[i][i])
+ pairs[i]=i; /* a special case */
+ else
+ pairs[i]=x;
+ }
+
+ if(ISDBG(SUBSTEMS)) {
+ for(i=0; i<nold; i++) {
+ j=pairs[i];
+ if(j>0)
+ fprintf(pfa_file, "%% %d...%d (%d x %d)\n", s[i].value, s[j].value, i, j);
+ }
+ }
+}
+
+/*
+ * Find the best stem in the array at the specified (value, origin) .
+ * Returns its index in the array sp, -1 means "none".
+ * prevbest is the result for the other end of the line, we must
+ * find something better than it or leave it as it is.
+ */
+static int
+findstemat(
+ int value,
+ int origin,
+ STEM *sp,
+ short *pairs,
+ int ns,
+ int prevbest /* -1 means "none" */
+)
+{
+ int i, min, max;
+ int v, si;
+ int pri, prevpri; /* priority, 0 = has ST_END, 1 = no ST_END */
+ int wd, prevwd; /* stem width */
+
+ si= -1; /* nothing yet */
+
+ /* stems are ordered by value, binary search */
+ min=0; max=ns; /* min <= i < max */
+ while( min < max ) {
+ i=(min+max)/2;
+ v=sp[i].value;
+ if(v<value)
+ min=i+1;
+ else if(v>value)
+ max=i;
+ else {
+ si=i; /* temporary value */
+ break;
+ }
+ }
+
+ if( si < 0 ) /* found nothing this time */
+ return prevbest;
+
+ /* find the priority of the prevbest */
+ /* we expect that prevbest has a pair */
+ if(prevbest>=0) {
+ i=pairs[prevbest];
+ prevpri=1;
+ if( (sp[prevbest].flags | sp[i].flags) & ST_END )
+ prevpri=0;
+ prevwd=abs(sp[i].value-value);
+ }
+
+ /* stems are not ordered by origin, so now do the linear search */
+
+ while( si>0 && sp[si-1].value==value ) /* find the first one */
+ si--;
+
+ for(; si<ns && sp[si].value==value; si++) {
+ if(sp[si].origin != origin)
+ continue;
+ i=pairs[si]; /* the other side of this stem */
+ if(i<0)
+ continue; /* oops, no other side */
+ pri=1;
+ if( (sp[si].flags | sp[i].flags) & ST_END )
+ pri=0;
+ wd=abs(sp[i].value-value);
+ if( prevbest == -1 || pri >prevpri
+ || pri==prevpri && prevwd==0 || wd!=0 && wd<prevwd ) {
+ prevbest=si;
+ prevpri=pri;
+ prevwd=wd;
+ continue;
+ }
+ }
+
+ return prevbest;
+}
+
+/* add the substems for one glyph entry
+ * (called from groupsubstems())
+ * returns 0 if all OK, 1 if too many groups
+ */
+
+static int gssentry_lastgrp=0; /* reset to 0 for each new glyph */
+
+static int
+gssentry( /* crazy number of parameters */
+ GENTRY *ge,
+ STEM *hs, /* horizontal stems, sorted by value */
+ short *hpairs,
+ int nhs,
+ STEM *vs, /* vertical stems, sorted by value */
+ short *vpairs,
+ int nvs,
+ STEMBOUNDS *s,
+ short *egp,
+ int *nextvsi,
+ int *nexthsi /* -2 means "check by yourself" */
+) {
+ enum {
+ SI_VP, /* vertical primary */
+ SI_HP, /* horizontal primary */
+ SI_SIZE /* size of the array */
+ };
+ int si[SI_SIZE]; /* indexes of relevant stems */
+
+ /* the bounds of the existing relevant stems */
+ STEMBOUNDS r[ sizeof(si) / sizeof(si[0]) * 2 ];
+ char rexpand; /* by how much we need to expand the group */
+ int nr; /* and the number of them */
+
+ /* yet more temporary storage */
+ short lb, hb, isvert;
+ int conflict, grp;
+ int i, j, x, y;
+
+
+ /* for each line or curve we try to find a horizontal and
+ * a vertical stem corresponding to its first point
+ * (corresponding to the last point of the previous
+ * glyph entry), because the directions of the lines
+ * will be eventually reversed and it will then become the last
+ * point. And the T1 rasterizer applies the hints to
+ * the last point.
+ *
+ */
+
+ /* start with the common part, the first point */
+ x=ge->prev->ix3;
+ y=ge->prev->iy3;
+
+ if(*nextvsi == -2)
+ si[SI_VP]=findstemat(x, y, vs, vpairs, nvs, -1);
+ else {
+ si[SI_VP]= *nextvsi; *nextvsi= -2;
+ }
+ if(*nexthsi == -2)
+ si[SI_HP]=findstemat(y, x, hs, hpairs, nhs, -1);
+ else {
+ si[SI_HP]= *nexthsi; *nexthsi= -2;
+ }
+
+ /*
+ * For the horizontal lines we make sure that both
+ * ends of the line have the same horizontal stem,
+ * and the same thing for vertical lines and stems.
+ * In both cases we enforce the stem for the next entry.
+ * Otherwise unpleasant effects may arise.
+ */
+
+ if(ge->type==GE_LINE) {
+ if(ge->ix3==x) { /* vertical line */
+ *nextvsi=si[SI_VP]=findstemat(x, ge->iy3, vs, vpairs, nvs, si[SI_VP]);
+ } else if(ge->iy3==y) { /* horizontal line */
+ *nexthsi=si[SI_HP]=findstemat(y, ge->ix3, hs, hpairs, nhs, si[SI_HP]);
+ }
+ }
+
+ if(si[SI_VP]+si[SI_HP] == -2) /* no stems, leave it alone */
+ return 0;
+
+ /* build the array of relevant bounds */
+ nr=0;
+ for(i=0; i< sizeof(si) / sizeof(si[0]); i++) {
+ STEM *sp;
+ short *pairs;
+ int step;
+ int f;
+ int nzones, firstzone, binzone, einzone;
+ int btype, etype;
+
+ if(si[i] < 0)
+ continue;
+
+ if(i<SI_HP) {
+ r[nr].isvert=1; sp=vs; pairs=vpairs;
+ } else {
+ r[nr].isvert=0; sp=hs; pairs=hpairs;
+ }
+
+ r[nr].low=sp[ si[i] ].value;
+ r[nr].high=sp[ pairs[ si[i] ] ].value;
+
+ if(r[nr].low > r[nr].high) {
+ j=r[nr].low; r[nr].low=r[nr].high; r[nr].high=j;
+ step= -1;
+ } else {
+ step=1;
+ }
+
+ /* handle the interaction with Blue Zones */
+
+ if(i>=SI_HP) { /* only for horizontal stems */
+ if(si[i]==pairs[si[i]]) {
+ /* special case, the outermost stem in the
+ * Blue Zone without a pair, simulate it to 20-pixel
+ */
+ if(sp[ si[i] ].flags & ST_UP) {
+ r[nr].high+=20;
+ for(j=si[i]+1; j<nhs; j++)
+ if( (sp[j].flags & (ST_ZONE|ST_TOPZONE))
+ == (ST_ZONE|ST_TOPZONE) ) {
+ if(r[nr].high > sp[j].value-2)
+ r[nr].high=sp[j].value-2;
+ break;
+ }
+ } else {
+ r[nr].low-=20;
+ for(j=si[i]-1; j>=0; j--)
+ if( (sp[j].flags & (ST_ZONE|ST_TOPZONE))
+ == (ST_ZONE) ) {
+ if(r[nr].low < sp[j].value+2)
+ r[nr].low=sp[j].value+2;
+ break;
+ }
+ }
+ }
+
+ /* check that the stem borders don't end up in
+ * different Blue Zones */
+ f=sp[ si[i] ].flags;
+ nzones=0; einzone=binzone=0;
+ for(j=si[i]; j!=pairs[ si[i] ]; j+=step) {
+ if( (sp[j].flags & ST_ZONE)==0 )
+ continue;
+ /* if see a zone border going in the same direction */
+ if( ((f ^ sp[j].flags) & ST_UP)==0 ) {
+ if( ++nzones == 1 ) {
+ firstzone=sp[j].value; /* remember the first one */
+ etype=sp[j].flags & ST_TOPZONE;
+ }
+ einzone=1;
+
+ } else { /* the opposite direction */
+ if(nzones==0) { /* beginning is in a blue zone */
+ binzone=1;
+ btype=sp[j].flags & ST_TOPZONE;
+ }
+ einzone=0;
+ }
+ }
+
+ /* beginning and end are in Blue Zones of different types */
+ if( binzone && einzone && (btype ^ etype)!=0 ) {
+ if( sp[si[i]].flags & ST_UP ) {
+ if(firstzone > r[nr].low+22)
+ r[nr].high=r[nr].low+20;
+ else
+ r[nr].high=firstzone-2;
+ } else {
+ if(firstzone < r[nr].high-22)
+ r[nr].low=r[nr].high-20;
+ else
+ r[nr].low=firstzone+2;
+ }
+ }
+ }
+
+ if(ISDBG(SUBSTEMS))
+ fprintf(pfa_file, "%% at(%d,%d)[%d,%d] %d..%d %c (%d x %d)\n", x, y, i, nr,
+ r[nr].low, r[nr].high, r[nr].isvert ? 'v' : 'h',
+ si[i], pairs[si[i]]);
+
+ nr++;
+ }
+
+ /* now try to find a group */
+ conflict=0; /* no conflicts found yet */
+ for(j=0; j<nr; j++)
+ r[j].already=0;
+
+ /* check if it fits into the last group */
+ grp = gssentry_lastgrp;
+ i = (grp==0)? 0 : egp[grp-1];
+ for(; i<egp[grp]; i++) {
+ lb=s[i].low; hb=s[i].high; isvert=s[i].isvert;
+ for(j=0; j<nr; j++)
+ if( r[j].isvert==isvert /* intersects */
+ && r[j].low <= hb && r[j].high >= lb ) {
+ if( r[j].low == lb && r[j].high == hb ) /* coincides */
+ r[j].already=1;
+ else
+ conflict=1;
+ }
+
+ if(conflict)
+ break;
+ }
+
+ if(conflict) { /* nope, check all the groups */
+ for(j=0; j<nr; j++)
+ r[j].already=0;
+
+ for(i=0, grp=0; i<egp[NSTEMGRP-1]; i++) {
+ if(i == egp[grp]) { /* checked all stems in a group */
+ if(conflict) {
+ grp++; conflict=0; /* check the next group */
+ for(j=0; j<nr; j++)
+ r[j].already=0;
+ } else
+ break; /* insert into this group */
+ }
+
+ lb=s[i].low; hb=s[i].high; isvert=s[i].isvert;
+ for(j=0; j<nr; j++)
+ if( r[j].isvert==isvert /* intersects */
+ && r[j].low <= hb && r[j].high >= lb ) {
+ if( r[j].low == lb && r[j].high == hb ) /* coincides */
+ r[j].already=1;
+ else
+ conflict=1;
+ }
+
+ if(conflict)
+ i=egp[grp]-1; /* fast forward to the next group */
+ }
+ }
+
+ /* do we have any empty group ? */
+ if(conflict && grp < NSTEMGRP-1) {
+ grp++; conflict=0;
+ for(j=0; j<nr; j++)
+ r[j].already=0;
+ }
+
+ if(conflict) { /* oops, can't find any group to fit */
+ return 1;
+ }
+
+ /* OK, add stems to this group */
+
+ rexpand = nr;
+ for(j=0; j<nr; j++)
+ rexpand -= r[j].already;
+
+ if(rexpand > 0) {
+ for(i=egp[NSTEMGRP-1]-1; i>=egp[grp]; i--)
+ s[i+rexpand]=s[i];
+ for(i=0; i<nr; i++)
+ if(!r[i].already)
+ s[egp[grp]++]=r[i];
+ for(i=grp+1; i<NSTEMGRP; i++)
+ egp[i]+=rexpand;
+ }
+
+ ge->stemid = gssentry_lastgrp = grp;
+ return 0;
+}
+
+/*
+ * Create the groups of substituted stems from the list.
+ * Each group will be represented by a subroutine in the Subs
+ * array.
+ */
+
+static void
+groupsubstems(
+ GLYPH *g,
+ STEM *hs, /* horizontal stems, sorted by value */
+ short *hpairs,
+ int nhs,
+ STEM *vs, /* vertical stems, sorted by value */
+ short *vpairs,
+ int nvs
+)
+{
+ GENTRY *ge;
+ int i, j;
+
+ /* temporary storage */
+ STEMBOUNDS s[MAX_STEMS*2];
+ /* indexes in there, pointing past the end each stem group */
+ short egp[NSTEMGRP];
+
+ int nextvsi, nexthsi; /* -2 means "check by yourself" */
+
+ for(i=0; i<NSTEMGRP; i++)
+ egp[i]=0;
+
+ nextvsi=nexthsi= -2; /* processed no horiz/vert line */
+
+ gssentry_lastgrp = 0; /* reset the last group for new glyph */
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if(ge->type!=GE_LINE && ge->type!=GE_CURVE) {
+ nextvsi=nexthsi= -2; /* next path is independent */
+ continue;
+ }
+
+ if( gssentry(ge, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) {
+ WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n",
+ g->name, NSTEMGRP);
+ /* it's better to have no substituted hints at all than have only part */
+ for (ge = g->entries; ge != 0; ge = ge->next)
+ ge->stemid= -1;
+ g->nsg=0; /* just to be safe, already is 0 by initialization */
+ return;
+ }
+
+ /*
+ * handle the last vert/horiz line of the path specially,
+ * correct the hint for the first entry of the path
+ */
+ if(ge->frwd != ge->next && (nextvsi != -2 || nexthsi != -2) ) {
+ if( gssentry(ge->frwd, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) {
+ WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n",
+ g->name, NSTEMGRP);
+ /* it's better to have no substituted hints at all than have only part */
+ for (ge = g->entries; ge != 0; ge = ge->next)
+ ge->stemid= -1;
+ g->nsg=0; /* just to be safe, already is 0 by initialization */
+ return;
+ }
+ }
+
+ }
+
+ /* find the index of the first empty group - same as the number of groups */
+ if(egp[0]>0) {
+ for(i=1; i<NSTEMGRP && egp[i]!=egp[i-1]; i++)
+ {}
+ g->nsg=i;
+ } else
+ g->nsg=0;
+
+ if(ISDBG(SUBSTEMS)) {
+ fprintf(pfa_file, "%% %d substem groups (%d %d %d)\n", g->nsg,
+ g->nsg>1 ? egp[g->nsg-2] : -1,
+ g->nsg>0 ? egp[g->nsg-1] : -1,
+ g->nsg<NSTEMGRP ? egp[g->nsg] : -1 );
+ j=0;
+ for(i=0; i<g->nsg; i++) {
+ fprintf(pfa_file, "%% grp %3d: ", i);
+ for(; j<egp[i]; j++) {
+ fprintf(pfa_file, " %4d...%-4d %c ", s[j].low, s[j].high,
+ s[j].isvert ? 'v' : 'h');
+ }
+ fprintf(pfa_file, "\n");
+ }
+ }
+
+ if(g->nsg==1) { /* it would be the same as the main stems */
+ /* so erase it */
+ for (ge = g->entries; ge != 0; ge = ge->next)
+ ge->stemid= -1;
+ g->nsg=0;
+ }
+
+ if(g->nsg>0) {
+ if( (g->nsbs=malloc(g->nsg * sizeof (egp[0]))) == 0 ) {
+ fprintf(stderr, "**** not enough memory for substituted hints ****\n");
+ exit(255);
+ }
+ memmove(g->nsbs, egp, g->nsg * sizeof(short));
+ if( (g->sbstems=malloc(egp[g->nsg-1] * sizeof (s[0]))) == 0 ) {
+ fprintf(stderr, "**** not enough memory for substituted hints ****\n");
+ exit(255);
+ }
+ memmove(g->sbstems, s, egp[g->nsg-1] * sizeof(s[0]));
+ }
+}
+
+void
+buildstems(
+ GLYPH * g
+)
+{
+ STEM hs[MAX_STEMS], vs[MAX_STEMS]; /* temporary working
+ * storage */
+ short hs_pairs[MAX_STEMS], vs_pairs[MAX_STEMS]; /* best pairs for these stems */
+ STEM *sp;
+ GENTRY *ge, *nge, *pge;
+ int nx, ny;
+ int ovalue;
+ int totals, grp, lastgrp;
+
+ assertisint(g, "buildstems int");
+
+ g->nhs = g->nvs = 0;
+
+ /* first search the whole character for possible stem points */
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type == GE_CURVE) {
+
+ /*
+ * SURPRISE!
+ * We consider the stems bounded by the
+ * H/V ends of the curves as flat ones.
+ *
+ * But we don't include the point on the
+ * other end into the range.
+ */
+
+ /* first check the beginning of curve */
+ /* if it is horizontal, add a hstem */
+ if (ge->iy1 == ge->prev->iy3) {
+ hs[g->nhs].value = ge->iy1;
+
+ if (ge->ix1 < ge->prev->ix3)
+ hs[g->nhs].flags = ST_FLAT | ST_UP;
+ else
+ hs[g->nhs].flags = ST_FLAT;
+
+ hs[g->nhs].origin = ge->prev->ix3;
+
+ if (ge->ix1 < ge->prev->ix3) {
+ hs[g->nhs].from = ge->ix1+1;
+ hs[g->nhs].to = ge->prev->ix3;
+ if(hs[g->nhs].from > hs[g->nhs].to)
+ hs[g->nhs].from--;
+ } else {
+ hs[g->nhs].from = ge->prev->ix3;
+ hs[g->nhs].to = ge->ix1-1;
+ if(hs[g->nhs].from > hs[g->nhs].to)
+ hs[g->nhs].to++;
+ }
+ if (ge->ix1 != ge->prev->ix3)
+ g->nhs++;
+ }
+ /* if it is vertical, add a vstem */
+ else if (ge->ix1 == ge->prev->ix3) {
+ vs[g->nvs].value = ge->ix1;
+
+ if (ge->iy1 > ge->prev->iy3)
+ vs[g->nvs].flags = ST_FLAT | ST_UP;
+ else
+ vs[g->nvs].flags = ST_FLAT;
+
+ vs[g->nvs].origin = ge->prev->iy3;
+
+ if (ge->iy1 < ge->prev->iy3) {
+ vs[g->nvs].from = ge->iy1+1;
+ vs[g->nvs].to = ge->prev->iy3;
+ if(vs[g->nvs].from > vs[g->nvs].to)
+ vs[g->nvs].from--;
+ } else {
+ vs[g->nvs].from = ge->prev->iy3;
+ vs[g->nvs].to = ge->iy1-1;
+ if(vs[g->nvs].from > vs[g->nvs].to)
+ vs[g->nvs].to++;
+ }
+
+ if (ge->iy1 != ge->prev->iy3)
+ g->nvs++;
+ }
+ /* then check the end of curve */
+ /* if it is horizontal, add a hstem */
+ if (ge->iy3 == ge->iy2) {
+ hs[g->nhs].value = ge->iy3;
+
+ if (ge->ix3 < ge->ix2)
+ hs[g->nhs].flags = ST_FLAT | ST_UP;
+ else
+ hs[g->nhs].flags = ST_FLAT;
+
+ hs[g->nhs].origin = ge->ix3;
+
+ if (ge->ix3 < ge->ix2) {
+ hs[g->nhs].from = ge->ix3;
+ hs[g->nhs].to = ge->ix2-1;
+ if( hs[g->nhs].from > hs[g->nhs].to )
+ hs[g->nhs].to++;
+ } else {
+ hs[g->nhs].from = ge->ix2+1;
+ hs[g->nhs].to = ge->ix3;
+ if( hs[g->nhs].from > hs[g->nhs].to )
+ hs[g->nhs].from--;
+ }
+
+ if (ge->ix3 != ge->ix2)
+ g->nhs++;
+ }
+ /* if it is vertical, add a vstem */
+ else if (ge->ix3 == ge->ix2) {
+ vs[g->nvs].value = ge->ix3;
+
+ if (ge->iy3 > ge->iy2)
+ vs[g->nvs].flags = ST_FLAT | ST_UP;
+ else
+ vs[g->nvs].flags = ST_FLAT;
+
+ vs[g->nvs].origin = ge->iy3;
+
+ if (ge->iy3 < ge->iy2) {
+ vs[g->nvs].from = ge->iy3;
+ vs[g->nvs].to = ge->iy2-1;
+ if( vs[g->nvs].from > vs[g->nvs].to )
+ vs[g->nvs].to++;
+ } else {
+ vs[g->nvs].from = ge->iy2+1;
+ vs[g->nvs].to = ge->iy3;
+ if( vs[g->nvs].from > vs[g->nvs].to )
+ vs[g->nvs].from--;
+ }
+
+ if (ge->iy3 != ge->iy2)
+ g->nvs++;
+ } else {
+
+ /*
+ * check the end of curve for a not smooth
+ * local extremum
+ */
+ nge = ge->frwd;
+
+ if (nge == 0)
+ continue;
+ else if (nge->type == GE_LINE) {
+ nx = nge->ix3;
+ ny = nge->iy3;
+ } else if (nge->type == GE_CURVE) {
+ nx = nge->ix1;
+ ny = nge->iy1;
+ } else
+ continue;
+
+ /* check for vertical extremums */
+ if (ge->iy3 > ge->iy2 && ge->iy3 > ny
+ || ge->iy3 < ge->iy2 && ge->iy3 < ny) {
+ hs[g->nhs].value = ge->iy3;
+ hs[g->nhs].from
+ = hs[g->nhs].to
+ = hs[g->nhs].origin = ge->ix3;
+
+ if (ge->ix3 < ge->ix2
+ || nx < ge->ix3)
+ hs[g->nhs].flags = ST_UP;
+ else
+ hs[g->nhs].flags = 0;
+
+ if (ge->ix3 != ge->ix2 || nx != ge->ix3)
+ g->nhs++;
+ }
+ /*
+ * the same point may be both horizontal and
+ * vertical extremum
+ */
+ /* check for horizontal extremums */
+ if (ge->ix3 > ge->ix2 && ge->ix3 > nx
+ || ge->ix3 < ge->ix2 && ge->ix3 < nx) {
+ vs[g->nvs].value = ge->ix3;
+ vs[g->nvs].from
+ = vs[g->nvs].to
+ = vs[g->nvs].origin = ge->iy3;
+
+ if (ge->iy3 > ge->iy2
+ || ny > ge->iy3)
+ vs[g->nvs].flags = ST_UP;
+ else
+ vs[g->nvs].flags = 0;
+
+ if (ge->iy3 != ge->iy2 || ny != ge->iy3)
+ g->nvs++;
+ }
+ }
+
+ } else if (ge->type == GE_LINE) {
+ nge = ge->frwd;
+
+ /* if it is horizontal, add a hstem */
+ /* and the ends as vstems if they brace the line */
+ if (ge->iy3 == ge->prev->iy3
+ && ge->ix3 != ge->prev->ix3) {
+ hs[g->nhs].value = ge->iy3;
+ if (ge->ix3 < ge->prev->ix3) {
+ hs[g->nhs].flags = ST_FLAT | ST_UP;
+ hs[g->nhs].from = ge->ix3;
+ hs[g->nhs].to = ge->prev->ix3;
+ } else {
+ hs[g->nhs].flags = ST_FLAT;
+ hs[g->nhs].from = ge->prev->ix3;
+ hs[g->nhs].to = ge->ix3;
+ }
+ hs[g->nhs].origin = ge->ix3;
+
+ pge = ge->bkwd;
+
+ /* add beginning as vstem */
+ vs[g->nvs].value = pge->ix3;
+ vs[g->nvs].origin
+ = vs[g->nvs].from
+ = vs[g->nvs].to = pge->iy3;
+
+ if(pge->type==GE_CURVE)
+ ovalue=pge->iy2;
+ else
+ ovalue=pge->prev->iy3;
+
+ if (pge->iy3 > ovalue)
+ vs[g->nvs].flags = ST_UP | ST_END;
+ else if (pge->iy3 < ovalue)
+ vs[g->nvs].flags = ST_END;
+ else
+ vs[g->nvs].flags = 0;
+
+ if( vs[g->nvs].flags != 0 )
+ g->nvs++;
+
+ /* add end as vstem */
+ vs[g->nvs].value = ge->ix3;
+ vs[g->nvs].origin
+ = vs[g->nvs].from
+ = vs[g->nvs].to = ge->iy3;
+
+ if(nge->type==GE_CURVE)
+ ovalue=nge->iy1;
+ else
+ ovalue=nge->iy3;
+
+ if (ovalue > ge->iy3)
+ vs[g->nvs].flags = ST_UP | ST_END;
+ else if (ovalue < ge->iy3)
+ vs[g->nvs].flags = ST_END;
+ else
+ vs[g->nvs].flags = 0;
+
+ if( vs[g->nvs].flags != 0 )
+ g->nvs++;
+
+ g->nhs++;
+ }
+ /* if it is vertical, add a vstem */
+ /* and the ends as hstems if they brace the line */
+ else if (ge->ix3 == ge->prev->ix3
+ && ge->iy3 != ge->prev->iy3) {
+ vs[g->nvs].value = ge->ix3;
+ if (ge->iy3 > ge->prev->iy3) {
+ vs[g->nvs].flags = ST_FLAT | ST_UP;
+ vs[g->nvs].from = ge->prev->iy3;
+ vs[g->nvs].to = ge->iy3;
+ } else {
+ vs[g->nvs].flags = ST_FLAT;
+ vs[g->nvs].from = ge->iy3;
+ vs[g->nvs].to = ge->prev->iy3;
+ }
+ vs[g->nvs].origin = ge->iy3;
+
+ pge = ge->bkwd;
+
+ /* add beginning as hstem */
+ hs[g->nhs].value = pge->iy3;
+ hs[g->nhs].origin
+ = hs[g->nhs].from
+ = hs[g->nhs].to = pge->ix3;
+
+ if(pge->type==GE_CURVE)
+ ovalue=pge->ix2;
+ else
+ ovalue=pge->prev->ix3;
+
+ if (pge->ix3 < ovalue)
+ hs[g->nhs].flags = ST_UP | ST_END;
+ else if (pge->ix3 > ovalue)
+ hs[g->nhs].flags = ST_END;
+ else
+ hs[g->nhs].flags = 0;
+
+ if( hs[g->nhs].flags != 0 )
+ g->nhs++;
+
+ /* add end as hstem */
+ hs[g->nhs].value = ge->iy3;
+ hs[g->nhs].origin
+ = hs[g->nhs].from
+ = hs[g->nhs].to = ge->ix3;
+
+ if(nge->type==GE_CURVE)
+ ovalue=nge->ix1;
+ else
+ ovalue=nge->ix3;
+
+ if (ovalue < ge->ix3)
+ hs[g->nhs].flags = ST_UP | ST_END;
+ else if (ovalue > ge->ix3)
+ hs[g->nhs].flags = ST_END;
+ else
+ hs[g->nhs].flags = 0;
+
+ if( hs[g->nhs].flags != 0 )
+ g->nhs++;
+
+ g->nvs++;
+ }
+ /*
+ * check the end of line for a not smooth local
+ * extremum
+ */
+ nge = ge->frwd;
+
+ if (nge == 0)
+ continue;
+ else if (nge->type == GE_LINE) {
+ nx = nge->ix3;
+ ny = nge->iy3;
+ } else if (nge->type == GE_CURVE) {
+ nx = nge->ix1;
+ ny = nge->iy1;
+ } else
+ continue;
+
+ /* check for vertical extremums */
+ if (ge->iy3 > ge->prev->iy3 && ge->iy3 > ny
+ || ge->iy3 < ge->prev->iy3 && ge->iy3 < ny) {
+ hs[g->nhs].value = ge->iy3;
+ hs[g->nhs].from
+ = hs[g->nhs].to
+ = hs[g->nhs].origin = ge->ix3;
+
+ if (ge->ix3 < ge->prev->ix3
+ || nx < ge->ix3)
+ hs[g->nhs].flags = ST_UP;
+ else
+ hs[g->nhs].flags = 0;
+
+ if (ge->ix3 != ge->prev->ix3 || nx != ge->ix3)
+ g->nhs++;
+ }
+ /*
+ * the same point may be both horizontal and vertical
+ * extremum
+ */
+ /* check for horizontal extremums */
+ if (ge->ix3 > ge->prev->ix3 && ge->ix3 > nx
+ || ge->ix3 < ge->prev->ix3 && ge->ix3 < nx) {
+ vs[g->nvs].value = ge->ix3;
+ vs[g->nvs].from
+ = vs[g->nvs].to
+ = vs[g->nvs].origin = ge->iy3;
+
+ if (ge->iy3 > ge->prev->iy3
+ || ny > ge->iy3)
+ vs[g->nvs].flags = ST_UP;
+ else
+ vs[g->nvs].flags = 0;
+
+ if (ge->iy3 != ge->prev->iy3 || ny != ge->iy3)
+ g->nvs++;
+ }
+ }
+ }
+
+ g->nhs=addbluestems(hs, g->nhs);
+ sortstems(hs, g->nhs);
+ sortstems(vs, g->nvs);
+
+ if (ISDBG(STEMS))
+ debugstems(g->name, hs, g->nhs, vs, g->nvs);
+
+ /* find the stems interacting with the Blue Zones */
+ markbluestems(hs, g->nhs);
+
+ if(subhints) {
+ if (ISDBG(SUBSTEMS))
+ fprintf(pfa_file, "%% %s: joining subst horizontal stems\n", g->name);
+ joinsubstems(hs, hs_pairs, g->nhs, 1);
+ if (ISDBG(SUBSTEMS))
+ fprintf(pfa_file, "%% %s: joining subst vertical stems\n", g->name);
+ joinsubstems(vs, vs_pairs, g->nvs, 0);
+
+ groupsubstems(g, hs, hs_pairs, g->nhs, vs, vs_pairs, g->nvs);
+ }
+
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% %s: joining main horizontal stems\n", g->name);
+ g->nhs = joinmainstems(hs, g->nhs, 1);
+ if (ISDBG(MAINSTEMS))
+ fprintf(pfa_file, "%% %s: joining main vertical stems\n", g->name);
+ g->nvs = joinmainstems(vs, g->nvs, 0);
+
+ if (ISDBG(MAINSTEMS))
+ debugstems(g->name, hs, g->nhs, vs, g->nvs);
+
+ if(g->nhs > 0) {
+ if ((sp = malloc(sizeof(STEM) * g->nhs)) == 0) {
+ fprintf(stderr, "**** not enough memory for hints ****\n");
+ exit(255);
+ }
+ g->hstems = sp;
+ memcpy(sp, hs, sizeof(STEM) * g->nhs);
+ } else
+ g->hstems = 0;
+
+ if(g->nvs > 0) {
+ if ((sp = malloc(sizeof(STEM) * g->nvs)) == 0) {
+ fprintf(stderr, "**** not enough memory for hints ****\n");
+ exit(255);
+ }
+ g->vstems = sp;
+ memcpy(sp, vs, sizeof(STEM) * g->nvs);
+ } else
+ g->vstems = 0;
+
+ /* now check that the stems won't overflow the interpreter's stem stack:
+ * some interpreters (like X11) push the stems on each change into
+ * stack and pop them only after the whole glyphs is completed.
+ */
+
+ totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */
+ lastgrp = -1;
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ grp=ge->stemid;
+ if(grp >= 0 && grp != lastgrp) {
+ if(grp==0)
+ totals += g->nsbs[0];
+ else
+ totals += g->nsbs[grp] - g->nsbs[grp-1];
+
+ lastgrp = grp;
+ }
+ }
+
+ /* be on the safe side, check for >= , not > */
+ if(totals >= max_stemdepth) { /* oops, too deep */
+ WARNING_2 {
+ fprintf(stderr, "Warning: glyph %s needs hint stack depth %d\n", g->name, totals);
+ fprintf(stderr, " (limit %d): removed the substituted hints from it\n", max_stemdepth);
+ }
+ if(g->nsg > 0) {
+ for (ge = g->entries; ge != 0; ge = ge->next)
+ ge->stemid = -1;
+ free(g->sbstems); g->sbstems = 0;
+ free(g->nsbs); g->nsbs = 0;
+ g->nsg = 0;
+ }
+ }
+
+ /* now check if there are too many main stems */
+ totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */
+ if(totals >= max_stemdepth) {
+ /* even worse, too much of non-substituted stems */
+ WARNING_2 {
+ fprintf(stderr, "Warning: glyph %s has %d main hints\n", g->name, totals);
+ fprintf(stderr, " (limit %d): removed the hints from it\n", max_stemdepth);
+ }
+ if(g->vstems) {
+ free(g->vstems); g->vstems = 0; g->nvs = 0;
+ }
+ if(g->hstems) {
+ free(g->hstems); g->hstems = 0; g->nhs = 0;
+ }
+ }
+}
+
+/* convert weird curves that are close to lines into lines.
+*/
+
+void
+fstraighten(
+ GLYPH * g
+)
+{
+ GENTRY *ge, *pge, *nge, *ige;
+ double df;
+ int dir;
+ double iln, oln;
+ int svdir, i, o;
+
+ for (ige = g->entries; ige != 0; ige = ige->next) {
+ if (ige->type != GE_CURVE)
+ continue;
+
+ ge = ige;
+ pge = ge->bkwd;
+ nge = ge->frwd;
+
+ df = 0.;
+
+ /* look for vertical then horizontal */
+ for(i=0; i<2; i++) {
+ o = !i; /* other axis */
+
+ iln = fabs(ge->fpoints[i][2] - pge->fpoints[i][2]);
+ oln = fabs(ge->fpoints[o][2] - pge->fpoints[o][2]);
+ /*
+ * if current curve is almost a vertical line, and it
+ * doesn't begin or end horizontally (and the prev/next
+ * line doesn't join smoothly ?)
+ */
+ if( oln < 1.
+ || ge->fpoints[o][2] == ge->fpoints[o][1]
+ || ge->fpoints[o][0] == pge->fpoints[o][2]
+ || iln > 2.
+ || iln > 1. && iln/oln > 0.1 )
+ continue;
+
+
+ if(ISDBG(STRAIGHTEN))
+ fprintf(stderr,"** straighten almost %s\n", (i? "horizontal":"vertical"));
+
+ df = ge->fpoints[i][2] - pge->fpoints[i][2];
+ dir = fsign(ge->fpoints[o][2] - pge->fpoints[o][2]);
+ ge->type = GE_LINE;
+
+ /*
+ * suck in all the sequence of such almost lines
+ * going in the same direction but not deviating
+ * too far from vertical
+ */
+ iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]);
+ oln = nge->fpoints[o][2] - ge->fpoints[o][2];
+
+ while (fabs(df) <= 5 && nge->type == GE_CURVE
+ && dir == fsign(oln) /* that also gives oln != 0 */
+ && iln <= 2.
+ && ( iln <= 1. || iln/fabs(oln) <= 0.1 ) ) {
+ ge->fx3 = nge->fx3;
+ ge->fy3 = nge->fy3;
+
+ if(ISDBG(STRAIGHTEN))
+ fprintf(stderr,"** straighten collapsing %s\n", (i? "horizontal":"vertical"));
+ freethisge(nge);
+ fixendpath(ge);
+ pge = ge->bkwd;
+ nge = ge->frwd;
+
+ df = ge->fpoints[i][2] - pge->fpoints[i][2];
+
+ iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]);
+ oln = nge->fpoints[o][2] - ge->fpoints[o][2];
+ }
+
+ /* now check what do we have as previous/next line */
+
+ if(ge != pge) {
+ if( pge->type == GE_LINE && pge->fpoints[i][2] == pge->prev->fpoints[i][2]
+ && fabs(pge->fpoints[o][2] != pge->prev->fpoints[o][2]) ) {
+ if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with previous 0x%x 0x%x\n", pge, ge);
+ /* join the previous line with current */
+ pge->fx3 = ge->fx3;
+ pge->fy3 = ge->fy3;
+
+ ige = freethisge(ge)->prev; /* keep the iterator valid */
+ ge = pge;
+ fixendpath(ge);
+ pge = ge->bkwd;
+ }
+ }
+
+ if(ge != nge) {
+ if (nge->type == GE_LINE && nge->fpoints[i][2] == ge->fpoints[i][2]
+ && fabs(nge->fpoints[o][2] != ge->fpoints[o][2]) ) {
+ if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with next 0x%x 0x%x\n", ge, nge);
+ /* join the next line with current */
+ ge->fx3 = nge->fx3;
+ ge->fy3 = nge->fy3;
+
+ freethisge(nge);
+ fixendpath(ge);
+ pge = ge->bkwd;
+ nge = ge->frwd;
+
+ }
+ }
+
+ if(ge != pge) {
+ /* try to align the lines if neccessary */
+ if(df != 0.)
+ fclosegap(ge, ge, i, df, NULL);
+ } else {
+ /* contour consists of only one line, get rid of it */
+ ige = freethisge(ge)->prev; /* keep the iterator valid */
+ }
+
+ break; /* don't bother looking at the other axis */
+ }
+ }
+}
+
+/* solve a square equation,
+ * returns the number of solutions found, the solutions
+ * are stored in res which should point to array of two doubles.
+ * min and max limit the area for solutions
+ */
+
+static int
+fsqequation(
+ double a,
+ double b,
+ double c,
+ double *res,
+ double min,
+ double max
+)
+{
+ double D;
+ int n;
+
+ if(ISDBG(SQEQ)) fprintf(stderr, "sqeq(%g,%g,%g) [%g;%g]\n", a, b, c, min, max);
+
+ if(fabs(a) < 0.000001) { /* if a linear equation */
+ n=0;
+ if(fabs(b) < 0.000001) /* not an equation at all */
+ return 0;
+ res[0] = -c/b;
+ if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: linear t=%g\n", res[0]);
+ if(res[0] >= min && res[0] <= max)
+ n++;
+ return n;
+ }
+
+ D = b*b - 4.0*a*c;
+ if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: D=%g\n", D);
+ if(D<0)
+ return 0;
+
+ D = sqrt(D);
+
+ n=0;
+ res[0] = (-b+D) / (2*a);
+ if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t1=%g\n", res[0]);
+ if(res[0] >= min && res[0] <= max)
+ n++;
+
+ res[n] = (-b-D) / (2*a);
+ if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t2=%g\n", res[n]);
+ if(res[n] >= min && res[n] <= max)
+ n++;
+
+ /* return 2nd solution only if it's different enough */
+ if(n==2 && fabs(res[0]-res[1])<0.000001)
+ n=1;
+
+ return n;
+}
+
+/* check that the curves don't cross quadrant boundary */
+/* (float) */
+
+/*
+ Here we make sure that the curve does not continue past
+ horizontal or vertical extremums. The horizontal points are
+ explained, vertical points are by analogy.
+
+ The horizontal points are where the derivative
+ dy/dx is equal to 0. But the Bezier curves are defined by
+ parametric formulas
+ x=fx(t)
+ y=fy(t)
+ so finding this derivative is complicated.
+ Also even if we find some point (x,y) splitting at this point
+ is far not obvious. Fortunately we can use dy/dt = 0 instead,
+ this gets to a rather simple square equation and splitting
+ at a known value of t is simple.
+
+ The formulas are:
+
+ y = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3
+ y = (-A+3*B-3*C+D)*t^3 + (3*A-6*B+3*C)*t^2 + (-3*A+3*B)*t + A
+ dy/dt = 3*(-A+3*B-3*C+D)*t^2 + 2*(3*A-6*B+3*C)*t + (-3*A+3*B)
+ */
+
+void
+ffixquadrants(
+ GLYPH *g
+)
+{
+ GENTRY *ge, *nge;
+ int i, j, np, oldnp;
+ double sp[5]; /* split points, last one empty */
+ char dir[5]; /* for debugging, direction by which split happened */
+ double a, b, *pts; /* points of a curve */
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_CURVE)
+ continue;
+
+ doagain:
+ np = 0; /* no split points yet */
+ if(ISDBG(QUAD)) {
+ fprintf(stderr, "%s: trying 0x%x (%g %g) (%g %g) (%g %g) (%g %g)\n ", g->name,
+ ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2,
+ ge->fx3, ge->fy3);
+ }
+ for(i=0; i<2; i++) { /* first for x then for y */
+ /* find the cooridnates of control points */
+ a = ge->prev->fpoints[i][2];
+ pts = &ge->fpoints[i][0];
+
+ oldnp = np;
+ np += fsqequation(
+ 3.0*(-a + 3.0*pts[0] - 3.0*pts[1] + pts[2]),
+ 6.0*(a - 2.0*pts[0] + pts[1]),
+ 3.0*(-a + pts[0]),
+ &sp[np],
+ 0.0, 1.0); /* XXX range is [0;1] */
+
+ if(np == oldnp)
+ continue;
+
+ if(ISDBG(QUAD))
+ fprintf(stderr, "%s: 0x%x: %d pts(%c): ",
+ g->name, ge, np-oldnp, i? 'y':'x');
+
+ /* remove points that are too close to the ends
+ * because hor/vert ends are permitted, also
+ * if the split point is VERY close to the ends
+ * but not exactly then just flatten it and check again.
+ */
+ for(j = oldnp; j<np; j++) {
+ dir[j] = i;
+ if(ISDBG(QUAD))
+ fprintf(stderr, "%g ", sp[j]);
+ if(sp[j] < 0.03) { /* front end of curve */
+ if(ge->fpoints[i][0] != ge->prev->fpoints[i][2]) {
+ ge->fpoints[i][0] = ge->prev->fpoints[i][2];
+ if(ISDBG(QUAD)) fprintf(stderr, "flattened at front\n");
+ goto doagain;
+ }
+ if( ge->fpoints[i][1] != ge->fpoints[i][0]
+ && fsign(ge->fpoints[i][2] - ge->fpoints[i][1])
+ != fsign(ge->fpoints[i][1] - ge->fpoints[i][0]) ) {
+ ge->fpoints[i][1] = ge->fpoints[i][0];
+ if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at front\n");
+ goto doagain;
+ }
+ sp[j] = sp[j+1]; np--; j--;
+ if(ISDBG(QUAD)) fprintf(stderr, "(front flat) ");
+ } else if(sp[j] > 0.97) { /* rear end of curve */
+ if(ge->fpoints[i][1] != ge->fpoints[i][2]) {
+ ge->fpoints[i][1] = ge->fpoints[i][2];
+ if(ISDBG(QUAD)) fprintf(stderr, "flattened at rear\n");
+ goto doagain;
+ }
+ if( ge->fpoints[i][0] != ge->fpoints[i][1]
+ && fsign(ge->prev->fpoints[i][2] - ge->fpoints[i][0])
+ != fsign(ge->fpoints[i][0] - ge->fpoints[i][1]) ) {
+ ge->fpoints[i][0] = ge->fpoints[i][1];
+ if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at rear\n");
+ goto doagain;
+ }
+ sp[j] = sp[j+1]; np--; j--;
+ if(ISDBG(QUAD)) fprintf(stderr, "(rear flat) ");
+ }
+ }
+ if(ISDBG(QUAD)) fprintf(stderr, "\n");
+ }
+
+ if(np==0) /* no split points, leave it alone */
+ continue;
+
+ if(ISDBG(QUAD)) {
+ fprintf(stderr, "%s: splitting 0x%x (%g %g) (%g %g) (%g %g) (%g %g) at %d points\n ", g->name,
+ ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2,
+ ge->fx3, ge->fy3, np);
+ for(i=0; i<np; i++)
+ fprintf(stderr, "%g(%c) ", sp[i], dir[i] ? 'y':'x');
+ fprintf(stderr, "\n");
+ }
+
+ /* sort the points ascending */
+ for(i=0; i<np; i++)
+ for(j=i+1; j<np; j++)
+ if(sp[i] > sp[j]) {
+ a = sp[i]; sp[i] = sp[j]; sp[j] = a;
+ }
+
+ /* now finally do the split on each point */
+ for(j=0; j<np; j++) {
+ double k1, k2, c;
+
+ k1 = sp[j];
+ k2 = 1 - k1;
+
+ if(ISDBG(QUAD)) fprintf(stderr, " 0x%x %g/%g\n", ge, k1, k2);
+
+ nge = newgentry(GEF_FLOAT);
+ (*nge) = (*ge);
+
+#define SPLIT(pt1, pt2) ( (pt1) + k1*((pt2)-(pt1)) ) /* order is important! */
+ for(i=0; i<2; i++) { /* for x and y */
+ a = ge->fpoints[i][0]; /* get the middle points */
+ b = ge->fpoints[i][1];
+
+ /* calculate new internal points */
+ c = SPLIT(a, b);
+
+ ge->fpoints[i][0] = SPLIT(ge->prev->fpoints[i][2], a);
+ ge->fpoints[i][1] = SPLIT(ge->fpoints[i][0], c);
+
+ nge->fpoints[i][1] = SPLIT(b, nge->fpoints[i][2]);
+ nge->fpoints[i][0] = SPLIT(c, nge->fpoints[i][1]);
+
+ ge->fpoints[i][2] = SPLIT(ge->fpoints[i][1],
+ + nge->fpoints[i][0]);
+ }
+#undef SPLIT
+
+ addgeafter(ge, nge);
+
+ /* go to the next part, adjust remaining points */
+ ge = nge;
+ for(i=j+1; i<np; i++)
+ sp[i] = (sp[i]-k1) / k2;
+ }
+ }
+
+}
+
+/* check if a curve is a zigzag */
+
+static int
+iiszigzag(
+ GENTRY *ge
+)
+{
+ double k, k1, k2;
+ double a, b;
+
+ if (ge->type != GE_CURVE)
+ return 0;
+
+ a = ge->iy2 - ge->iy1;
+ b = ge->ix2 - ge->ix1;
+ k = fabs(a == 0 ? (b == 0 ? 1. : FBIGVAL) : (double) b / (double) a);
+ a = ge->iy1 - ge->prev->iy3;
+ b = ge->ix1 - ge->prev->ix3;
+ k1 = fabs(a == 0 ? (b == 0 ? 1. : FBIGVAL) : (double) b / (double) a);
+ a = ge->iy3 - ge->iy2;
+ b = ge->ix3 - ge->ix2;
+ k2 = fabs(a == 0 ? (b == 0 ? 1. : FBIGVAL) : (double) b / (double) a);
+
+ /* if the curve is not a zigzag */
+ if (k1 >= k && k2 <= k || k1 <= k && k2 >= k)
+ return 0;
+ else
+ return 1;
+}
+
+/* check if a curve is a zigzag - floating */
+
+static int
+fiszigzag(
+ GENTRY *ge
+)
+{
+ double k, k1, k2;
+ double a, b;
+
+ if (ge->type != GE_CURVE)
+ return 0;
+
+ a = fabs(ge->fy2 - ge->fy1);
+ b = fabs(ge->fx2 - ge->fx1);
+ k = a < FEPS ? (b <FEPS ? 1. : FBIGVAL) : b / a;
+ a = fabs(ge->fy1 - ge->prev->fy3);
+ b = fabs(ge->fx1 - ge->prev->fx3);
+ k1 = a < FEPS ? (b < FEPS ? 1. : FBIGVAL) : b / a;
+ a = fabs(ge->fy3 - ge->fy2);
+ b = fabs(ge->fx3 - ge->fx2);
+ k2 = a < FEPS ? (b <FEPS ? 1. : FBIGVAL) : b / a;
+
+ /* if the curve is not a zigzag */
+ if (k1 >= k && k2 <= k || k1 <= k && k2 >= k)
+ return 0;
+ else
+ return 1;
+}
+
+/* split the zigzag-like curves into two parts */
+
+void
+fsplitzigzags(
+ GLYPH * g
+)
+{
+ GENTRY *ge, *nge;
+ double a, b, c, d;
+
+ assertisfloat(g, "splitting zigzags");
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_CURVE)
+ continue;
+
+ /* if the curve is not a zigzag */
+ if ( !fiszigzag(ge) ) {
+ continue;
+ }
+
+ /* split the curve by t=0.5 */
+ nge = newgentry(GEF_FLOAT);
+ (*nge) = (*ge);
+ nge->type = GE_CURVE;
+
+ a = ge->prev->fx3;
+ b = ge->fx1;
+ c = ge->fx2;
+ d = ge->fx3;
+ nge->fx3 = d;
+ nge->fx2 = (c + d) / 2.;
+ nge->fx1 = (b + 2. * c + d) / 4.;
+ ge->fx3 = (a + b * 3. + c * 3. + d) / 8.;
+ ge->fx2 = (a + 2. * b + c) / 4.;
+ ge->fx1 = (a + b) / 2.;
+
+ a = ge->prev->fy3;
+ b = ge->fy1;
+ c = ge->fy2;
+ d = ge->fy3;
+ nge->fy3 = d;
+ nge->fy2 = (c + d) / 2.;
+ nge->fy1 = (b + 2. * c + d) / 4.;
+ ge->fy3 = (a + b * 3. + c * 3. + d) / 8.;
+ ge->fy2 = (a + 2. * b + c) / 4.;
+ ge->fy1 = (a + b) / 2.;
+
+ addgeafter(ge, nge);
+ }
+}
+
+/* free this GENTRY, returns what was ge->next
+ * (ge must be of type GE_LINE or GE_CURVE)
+ * works on both float and int entries
+ */
+
+static GENTRY *
+freethisge(
+ GENTRY *ge
+)
+{
+ GENTRY *xge;
+
+ if (ge->bkwd != ge->prev) {
+ /* at beginning of the contour */
+
+ xge = ge->bkwd;
+ if(xge == ge) { /* was the only line in contour */
+ /* remove the contour completely */
+ /* prev is GE_MOVE, next is GE_PATH, remove them all */
+
+ /* may be the first contour, then ->bkwd points to ge->entries */
+ if(ge->prev->prev == 0)
+ *(GENTRY **)(ge->prev->bkwd) = ge->next->next;
+ else
+ ge->prev->prev->next = ge->next->next;
+
+ if(ge->next->next) {
+ ge->next->next->prev = ge->prev->prev;
+ ge->next->next->bkwd = ge->prev->bkwd;
+ }
+
+ xge = ge->next->next;
+ free(ge->prev); free(ge->next); free(ge);
+ return xge;
+ }
+
+ /* move the start point of the contour */
+ if(ge->flags & GEF_FLOAT) {
+ ge->prev->fx3 = xge->fx3;
+ ge->prev->fy3 = xge->fy3;
+ } else {
+ ge->prev->ix3 = xge->ix3;
+ ge->prev->iy3 = xge->iy3;
+ }
+ } else if(ge->frwd != ge->next) {
+ /* at end of the contour */
+
+ xge = ge->frwd->prev;
+ /* move the start point of the contour */
+ if(ge->flags & GEF_FLOAT) {
+ xge->fx3 = ge->bkwd->fx3;
+ xge->fy3 = ge->bkwd->fy3;
+ } else {
+ xge->ix3 = ge->bkwd->ix3;
+ xge->iy3 = ge->bkwd->iy3;
+ }
+ }
+
+ ge->prev->next = ge->next;
+ ge->next->prev = ge->prev;
+ ge->bkwd->frwd = ge->frwd;
+ ge->frwd->bkwd = ge->bkwd;
+
+ xge = ge->next;
+ free(ge);
+ return xge;
+}
+
+/* inserts a new gentry (LINE or CURVE) after another (MOVE
+ * or LINE or CURVE)
+ * corrects the first GE_MOVE if neccessary
+ */
+
+static void
+addgeafter(
+ GENTRY *oge, /* after this */
+ GENTRY *nge /* insert this */
+)
+{
+ if(oge->type == GE_MOVE) {
+ /* insert before next */
+ if(oge->next->type == GE_PATH) {
+ /* first and only GENTRY in path */
+ nge->frwd = nge->bkwd = nge;
+ } else {
+ nge->frwd = oge->next;
+ nge->bkwd = oge->next->bkwd;
+ oge->next->bkwd->frwd = nge;
+ oge->next->bkwd = nge;
+ }
+ } else {
+ nge->frwd = oge->frwd;
+ nge->bkwd = oge;
+ oge->frwd->bkwd = nge;
+ oge->frwd = nge;
+ }
+
+ nge->next = oge->next;
+ nge->prev = oge;
+ oge->next->prev = nge;
+ oge->next = nge;
+
+ if(nge->frwd->prev->type == GE_MOVE) {
+ /* fix up the GE_MOVE entry */
+ if(nge->flags & GEF_FLOAT) {
+ nge->frwd->prev->fx3 = nge->fx3;
+ nge->frwd->prev->fy3 = nge->fy3;
+ } else {
+ nge->frwd->prev->ix3 = nge->ix3;
+ nge->frwd->prev->iy3 = nge->iy3;
+ }
+ }
+}
+
+/*
+ * Check if this GENTRY happens to be at the end of path
+ * and fix the first MOVETO accordingly
+ * handles both int and float
+ */
+
+static void
+fixendpath(
+ GENTRY *ge
+)
+{
+ GENTRY *mge;
+
+ mge = ge->frwd->prev;
+ if(mge->type == GE_MOVE) {
+ if(ge->flags & GEF_FLOAT) {
+ mge->fx3 = ge->fx3;
+ mge->fy3 = ge->fy3;
+ } else {
+ mge->ix3 = ge->ix3;
+ mge->iy3 = ge->iy3;
+ }
+ }
+}
+
+/*
+ * This function adjusts the rest of path (the part from...to is NOT changed)
+ * to cover the specified gap by the specified axis (0 - X, 1 - Y).
+ * Gap is counted in direction (end_of_to - beginning_of_from).
+ * Returns by how much the gap was not closed (0.0 if it was fully closed).
+ * Ret contains by how much the first and last points of [from...to]
+ * were moved to bring them in consistence to the rest of the path.
+ * If ret==NULL then this info is not returned.
+ */
+
+static double
+fclosegap(
+ GENTRY *from,
+ GENTRY *to,
+ int axis,
+ double gap,
+ double *ret
+)
+{
+#define TIMESLARGER 10. /* how many times larger must be a curve to not change too much */
+ double rm[2];
+ double oldpos[2];
+ double times, limit, df, dx;
+ int j, k;
+ GENTRY *xge, *pge, *nge, *bge[2];
+
+ /* remember the old points to calculate ret */
+ oldpos[0] = from->prev->fpoints[axis][2];
+ oldpos[1] = to->fpoints[axis][2];
+
+ rm[0] = rm[1] = gap / 2. ;
+
+ bge[0] = from; /* this is convenient for iterations */
+ bge[1] = to;
+
+ /* first try to modify large curves but if have none then settle for small */
+ for(times = (TIMESLARGER-1); times > 0.1; times /= 2. ) {
+
+ if(rm[0]+rm[1] == 0.)
+ break;
+
+ /* iterate in both directions, backwards then forwards */
+ for(j = 0; j<2; j++) {
+
+ if(rm[j] == 0.) /* if this direction is exhausted */
+ continue;
+
+ limit = fabs(rm[j]) * (1.+times);
+
+ for(xge = bge[j]->cntr[j]; xge != bge[!j]; xge = xge->cntr[j]) {
+ dx = xge->fpoints[axis][2] - xge->prev->fpoints[axis][2];
+ df = fabs(dx) - limit;
+ if( df <= FEPS ) /* curve is too small to change */
+ continue;
+
+ if( df >= fabs(rm[j]) )
+ df = rm[j];
+ else
+ df *= fsign(rm[j]); /* we may cover this part of rm */
+
+ rm[j] -= df;
+ limit = fabs(rm[j]) * (1.+times);
+
+ if(xge->type == GE_CURVE) { /* correct internal points */
+ double scale = ((dx+df) / dx) - 1.;
+ double base;
+
+ if(j)
+ base = xge->fpoints[axis][2];
+ else
+ base = xge->prev->fpoints[axis][2];
+
+ for(k = 0; k<2; k++)
+ xge->fpoints[axis][k] += scale *
+ (xge->fpoints[axis][k] - base);
+ }
+
+ /* move all the intermediate lines */
+ if(j) {
+ df = -df; /* absolute direction */
+ pge = bge[1]->bkwd;
+ nge = xge->bkwd;
+ } else {
+ xge->fpoints[axis][2] += df;
+ pge = bge[0];
+ nge = xge->frwd;
+ }
+ while(nge != pge) {
+ if(nge->type == GE_CURVE) {
+ nge->fpoints[axis][0] +=df;
+ nge->fpoints[axis][1] +=df;
+ }
+ nge->fpoints[axis][2] += df;
+ if(nge->next != nge->frwd) { /* last entry of contour */
+ nge->frwd->prev->fpoints[axis][2] += df;
+ }
+ nge = nge->cntr[!j];
+ }
+
+ if(rm[j] == 0.)
+ break;
+ }
+ }
+ }
+
+ /* find the difference */
+ oldpos[0] -= from->prev->fpoints[axis][2];
+ oldpos[1] -= to->fpoints[axis][2];
+
+ if(ret) {
+ ret[0] = oldpos[0] - from->prev->fpoints[axis][2];
+ ret[1] = oldpos[1] - to->fpoints[axis][2];
+ }
+
+#if 0
+ if( rm[0]+rm[1] != gap - oldpos[1] + oldpos[0]) {
+ fprintf(stderr, "** gap=%g rm[0]=%g rm[1]=%g o[0]=%g o[1]=%g rg=%g og=%g\n",
+ gap, rm[0], rm[1], oldpos[0], oldpos[1], rm[0]+rm[1],
+ gap - oldpos[1] + oldpos[0]);
+ }
+#endif
+
+ return rm[0]+rm[1];
+#undef TIMESLARGER
+}
+
+/* remove the lines or curves smaller or equal to the size limit */
+
+static void
+fdelsmall(
+ GLYPH *g,
+ double minlen
+)
+{
+ GENTRY *ge, *nge, *pge, *xge, *next;
+ int i, k;
+ double dx, dy, d2, d2m;
+ double minlen2;
+#define TIMESLARGER 10. /* how much larger must be a curve to not change too much */
+
+ minlen2 = minlen*minlen;
+
+ for (ge = g->entries; ge != 0; ge = next) {
+ next = ge->next;
+
+ if (ge->type != GE_CURVE && ge->type != GE_LINE)
+ continue;
+
+ d2m = 0;
+ for(i= (ge->type==GE_CURVE? 0: 2); i<3; i++) {
+ dx = ge->fxn[i] - ge->prev->fx3;
+ dy = ge->fyn[i] - ge->prev->fy3;
+ d2 = dx*dx + dy*dy;
+ if(d2m < d2)
+ d2m = d2;
+ }
+
+ if( d2m > minlen2 ) { /* line is not too small */
+ /* XXX add more normalization here */
+ continue;
+ }
+
+ /* if the line is too small */
+
+ /* check forwards if we have a whole sequence of them */
+ nge = ge;
+ for(xge = ge->frwd; xge != ge; xge = xge->frwd) {
+ d2m = 0;
+ for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) {
+ dx = xge->fxn[i] - xge->prev->fx3;
+ dy = xge->fyn[i] - xge->prev->fy3;
+ d2 = dx*dx + dy*dy;
+ if(d2m < d2)
+ d2m = d2;
+ }
+ if( d2m > minlen2 ) /* line is not too small */
+ break;
+ nge = xge;
+ if(next == nge) /* move the next step past this sequence */
+ next = next->next;
+ }
+
+ /* check backwards if we have a whole sequence of them */
+ pge = ge;
+ for(xge = ge->bkwd; xge != ge; xge = xge->bkwd) {
+ d2m = 0;
+ for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) {
+ dx = xge->fxn[i] - xge->prev->fx3;
+ dy = xge->fyn[i] - xge->prev->fy3;
+ d2 = dx*dx + dy*dy;
+ if(d2m < d2)
+ d2m = d2;
+ }
+ if( d2m > minlen2 ) /* line is not too small */
+ break;
+ pge = xge;
+ }
+
+ /* now we have a sequence of small fragments in pge...nge (inclusive) */
+
+ if(ISDBG(FCONCISE)) {
+ fprintf(stderr, "glyph %s has very small fragments(%x..%x..%x)\n",
+ g->name, pge, ge, nge);
+ dumppaths(g, pge, nge);
+ }
+
+ /* reduce whole sequence to one part and remember the middle point */
+ if(pge != nge) {
+ while(1) {
+ xge = pge->frwd;
+ if(xge == nge) {
+ pge->fx1 = pge->fx2 = pge->fx3;
+ pge->fx3 = nge->fx3;
+ pge->fy1 = pge->fy2 = pge->fy3;
+ pge->fy3 = nge->fy3;
+ pge->type = GE_CURVE;
+ freethisge(nge);
+ break;
+ }
+ if(xge == nge->bkwd) {
+ pge->fx1 = pge->fx2 = (pge->fx3+xge->fx3)/2.;
+ pge->fx3 = nge->fx3;
+ pge->fy1 = pge->fy2 = (pge->fy3+xge->fy3)/2.;
+ pge->fy3 = nge->fy3;
+ pge->type = GE_CURVE;
+ freethisge(nge);
+ freethisge(xge);
+ break;
+ }
+ freethisge(pge); pge = xge;
+ xge = nge->bkwd; freethisge(nge); nge = xge;
+ }
+ }
+ ge = pge;
+
+ /* check if the whole sequence is small */
+ dx = ge->fx3 - ge->prev->fx3;
+ dy = ge->fy3 - ge->prev->fy3;
+ d2 = dx*dx + dy*dy;
+
+ if( d2 > minlen2 ) { /* no, it is not */
+ double b, d;
+
+ WARNING_3 fprintf(stderr, "glyph %s had a sequence of fragments < %g points each, reduced to one curve\n",
+ g->name, minlen);
+
+ /* check that we did not create a monstrosity spanning quadrants */
+ if(fsign(ge->fx1 - ge->prev->fx1) * fsign(ge->fx3 - ge->fx1) < 0
+ || fsign(ge->fy1 - ge->prev->fy1) * fsign(ge->fy3 - ge->fy1) < 0 ) {
+ /* yes, we did; are both parts of this thing big enough ? */
+ dx = ge->fx1 - ge->prev->fx3;
+ dy = ge->fy1 - ge->prev->fy3;
+ d2 = dx*dx + dy*dy;
+
+ dx = ge->fx3 - ge->fx1;
+ dy = ge->fy3 - ge->fy1;
+ d2m = dx*dx + dy*dy;
+
+ if(d2 > minlen2 && d2m > minlen2) { /* make two straights */
+ nge = newgentry(GEF_FLOAT);
+ *nge = *ge;
+
+ for(i=0; i<2; i++) {
+ ge->fpoints[i][2] = ge->fpoints[i][0];
+ b = nge->fpoints[i][0];
+ d = nge->fpoints[i][2] - b;
+ nge->fpoints[i][0] = b + 0.1*d;
+ nge->fpoints[i][1] = b + 0.9*d;
+ }
+ }
+ for(i=0; i<2; i++) { /* make one straight or first of two straights */
+ b = ge->prev->fpoints[i][2];
+ d = ge->fpoints[i][2] - b;
+ ge->fpoints[i][0] = b + 0.1*d;
+ ge->fpoints[i][1] = b + 0.9*d;
+ }
+ }
+ continue;
+ }
+
+ if(ge->frwd == ge) { /* points to itself, just remove the path completely */
+ WARNING_3 fprintf(stderr, "glyph %s had a path made of fragments < %g points each, removed\n",
+ g->name, minlen);
+
+ next = freethisge(ge);
+ continue;
+ }
+
+ /* now close the gap by x and y */
+ for(i=0; i<2; i++) {
+ double gap;
+
+ gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2];
+ if( fclosegap(ge, ge, i, gap, NULL) != 0.0 ) {
+ double scale, base;
+
+ /* not good, as the last resort just scale the next line */
+ gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2];
+
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, " last resort on %c: closing next by %g\n",
+ (i==0 ? 'x' : 'y'), gap);
+
+ nge = ge->frwd;
+ base = nge->fpoints[i][2];
+ dx = ge->fpoints[i][2] - base;
+ if(fabs(dx) < FEPS)
+ continue;
+
+ scale = ((dx-gap) / dx);
+
+ if(nge->type == GE_CURVE)
+ for(k = 0; k<2; k++)
+ nge->fpoints[i][k] = base +
+ scale * (nge->fpoints[i][k] - base);
+
+ ge->fpoints[i][2] -= gap;
+ }
+ }
+
+ /* OK, the gap is closed - remove this useless GENTRY */
+ freethisge(ge);
+ }
+#undef TIMESLARGER
+}
+
+/* normalize curves to the form where their ends
+ * can be safely used as derivatives
+ */
+
+static void
+fnormalizec(
+ GLYPH * g
+)
+{
+ GENTRY *ge;
+ int midsame, frontsame, rearsame, i;
+ double d, b;
+
+ assertisfloat(g, "normalizing curves");
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_CURVE)
+ continue;
+
+ midsame = (fabs(ge->fx1-ge->fx2)<FEPS && fabs(ge->fy1-ge->fy2)<FEPS);
+ frontsame = (fabs(ge->fx1-ge->prev->fx3)<FEPS && fabs(ge->fy1-ge->prev->fy3)<FEPS);
+ rearsame = (fabs(ge->fx3-ge->fx2)<FEPS && fabs(ge->fy3-ge->fy2)<FEPS);
+
+ if(midsame && (frontsame || rearsame) ) {
+ /* essentially a line */
+ for(i=0; i<2; i++) {
+ b = ge->prev->fpoints[i][2];
+ d = ge->fpoints[i][2] - b;
+ ge->fpoints[i][0] = b + 0.1*d;
+ ge->fpoints[i][1] = b + 0.9*d;
+ }
+ } else if(frontsame) {
+ for(i=0; i<2; i++) {
+ b = ge->prev->fpoints[i][2];
+ d = ge->fpoints[i][1] - b;
+ ge->fpoints[i][0] = b + 0.01*d;
+ }
+ } else if(rearsame) {
+ for(i=0; i<2; i++) {
+ b = ge->fpoints[i][2];
+ d = ge->fpoints[i][0] - b;
+ ge->fpoints[i][1] = b + 0.01*d;
+ }
+ } else
+ continue;
+
+ if(ISDBG(FCONCISE)) fprintf(stderr, "glyph %g, normalized entry %x\n", g->name, ge);
+ }
+}
+
+/* find the point where two rays continuing vectors cross
+ * rays are defined as beginning of curve1 and end of curve 2
+ * returns 1 if they cross, 0 if they don't
+ * If they cross returns the maximal scales for both vectors.
+ * Expects that the curves are normalized.
+ */
+
+static int
+fcrossrays(
+ GENTRY *ge1,
+ GENTRY *ge2,
+ double *max1,
+ double *max2
+)
+{
+ struct ray {
+ double x1, y1, x2, y2;
+ int isvert;
+ double k, b; /* lines are represented as y = k*x + b */
+ double *maxp;
+ } ray [3];
+ double x, y;
+ int i;
+
+ ray[0].x1 = ge1->prev->fx3;
+ ray[0].y1 = ge1->prev->fy3;
+ ray[0].x2 = ge1->fx1;
+ ray[0].y2 = ge1->fy1;
+ ray[0].maxp = max1;
+
+ ray[1].x1 = ge2->fx3;
+ ray[1].y1 = ge2->fy3;
+ ray[1].x2 = ge2->fx2;
+ ray[1].y2 = ge2->fy2;
+ ray[1].maxp = max2;
+
+ for(i=0; i<2; i++) {
+ if(ray[i].x1 == ray[i].x2)
+ ray[i].isvert = 1;
+ else {
+ ray[i].isvert = 0;
+ ray[i].k = (ray[i].y2 - ray[i].y1) / (ray[i].x2 - ray[i].x1);
+ ray[i].b = ray[i].y2 - ray[i].k * ray[i].x2;
+ }
+ }
+
+ if(ray[0].isvert && ray[1].isvert) {
+ if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: both vertical\n");
+ return 0; /* both vertical, don't cross */
+ }
+
+ if(ray[1].isvert) {
+ ray[2] = ray[0]; /* exchange them */
+ ray[0] = ray[1];
+ ray[1] = ray[2];
+ }
+
+ if(ray[0].isvert) {
+ x = ray[0].x1;
+ } else {
+ if( fabs(ray[0].k - ray[1].k) < FEPS) {
+ if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: parallel lines, k = %g, %g\n",
+ ray[0].k, ray[1].k);
+ return 0; /* parallel lines */
+ }
+ x = (ray[1].b - ray[0].b) / (ray[0].k - ray[1].k) ;
+ }
+ y = ray[1].k * x + ray[1].b;
+
+ for(i=0; i<2; i++) {
+ if(ray[i].isvert)
+ *ray[i].maxp = (y - ray[i].y1) / (ray[i].y2 - ray[i].y1);
+ else
+ *ray[i].maxp = (x - ray[i].x1) / (ray[i].x2 - ray[i].x1);
+ /* check if wrong sides of rays cross */
+ if( *ray[i].maxp < 0 ) {
+ if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: scale=%g @(%g,%g) (%g,%g)<-(%g,%g)\n",
+ *ray[i].maxp, x, y, ray[i].x2, ray[i].y2, ray[i].x1, ray[i].y1);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/* find the area covered by the curve
+ * (limited by the projections to the X axis)
+ */
+
+static double
+fcvarea(
+ GENTRY *ge
+)
+{
+ double Ly, My, Ny, Py, Qx, Rx, Sx;
+ double area;
+
+ /* y = Ly*t^3 + My*t^2 + Ny*t + Py */
+ Ly = -ge->prev->fy3 + 3*(ge->fy1 - ge->fy2) + ge->fy3;
+ My = 3*ge->prev->fy3 - 6*ge->fy1 + 3*ge->fy2;
+ Ny = 3*(-ge->prev->fy3 + ge->fy1);
+ Py = ge->prev->fy3;
+
+ /* dx/dt = Qx*t^2 + Rx*t + Sx */
+ Qx = 3*(-ge->prev->fx3 + 3*(ge->fx1 - ge->fx2) + ge->fx3);
+ Rx = 6*(ge->prev->fx3 - 2*ge->fx1 + ge->fx2);
+ Sx = 3*(-ge->prev->fx3 + ge->fx1);
+
+ /* area is integral[from 0 to 1]( y(t) * dx(t)/dt *dt) */
+ area = 1./6.*(Ly*Qx) + 1./5.*(Ly*Rx + My*Qx)
+ + 1./4.*(Ly*Sx + My*Rx + Ny*Qx) + 1./3.*(My*Sx + Ny*Rx + Py*Qx)
+ + 1./2.*(Ny*Sx + Py*Rx) + Py*Sx;
+
+ return area;
+}
+
+/* find the value of point on the curve at the given parameter t,
+ * along the given axis (0 - X, 1 - Y).
+ */
+
+static double
+fcvval(
+ GENTRY *ge,
+ int axis,
+ double t
+)
+{
+ double t2, mt, mt2;
+
+ /* val = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3 */
+ t2 = t*t;
+ mt = 1-t;
+ mt2 = mt*mt;
+
+ return ge->prev->fpoints[axis][2]*mt2*mt
+ + 3*(ge->fpoints[axis][0]*mt2*t + ge->fpoints[axis][1]*mt*t2)
+ + ge->fpoints[axis][2]*t*t2;
+}
+
+/* Check that the new curve has the point identified by the
+ * parameter t reasonably close to the corresponding point
+ * in the old pair of curves which were joined in proportion k.
+ * If old2 is NULL then just compare nge and old1 at the point t.
+ * Returns 0 if OK, 1 if it's too far.
+ */
+
+static int
+fckjoinedcv(
+ GLYPH *g,
+ double t,
+ GENTRY *nge,
+ GENTRY *old1,
+ GENTRY *old2,
+ double k
+)
+{
+ GENTRY *oge;
+ double ot;
+ double off;
+ double lim;
+ int i;
+
+ if(old2 == 0) {
+ oge = old1;
+ ot = t;
+ } else if(t <= k && k!=0.) {
+ oge = old1;
+ ot = t/k;
+ } else {
+ oge = old2;
+ ot = (t-k) / (1.-k);
+ }
+
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, "%s: t=%g ot=%g (%x) ", g->name, t, ot, oge);
+
+ for(i=0; i<2; i++) {
+ /* permitted tolerance is 5% */
+ lim = fabs(nge->fpoints[i][2] - nge->prev->fpoints[i][2])*0.05;
+
+ if(lim < 3.)
+ lim = 3.; /* for small curves the tolerance is higher */
+ if(lim > 10.)
+ lim = 10.; /* for big curves the tolerance is limited anyway */
+
+ off = fabs(fcvval(nge, i, t) - fcvval(oge, i, ot));
+
+ if(off > lim) {
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, "out of range d%c=%.2f(%.2f)\n",
+ (i==0 ? 'X' : 'Y'), off, lim);
+ return 1;
+ }
+
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, "valid d%c=%.2f(%.2f) ", (i==0 ? 'X' : 'Y'), off, lim);
+ }
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, "\n");
+ return 0;
+}
+
+/* force conciseness: substitute 2 or more curves going in the
+** same quadrant with one curve
+** in floating point
+*/
+
+void
+fforceconcise(
+ GLYPH * g
+)
+{
+ GENTRY *ge, *nge;
+ GENTRY tge;
+ double firstlen, lastlen, sumlen, scale;
+ double dxw1, dyw1, dxw2, dyw2;
+ double dxb1, dyb1, dxe1, dye1;
+ double dxb2, dyb2, dxe2, dye2;
+ double maxsc1, maxsc2;
+ int i;
+
+ assertisfloat(g, "enforcing conciseness");
+
+ fdelsmall(g, 0.05);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+ fnormalizec(g);
+
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_CURVE)
+ continue;
+
+ /* the whole direction of curve */
+ dxw1 = ge->fx3 - ge->prev->fx3;
+ dyw1 = ge->fy3 - ge->prev->fy3;
+
+ while (1) {
+ /* the whole direction of curve */
+ dxw1 = ge->fx3 - ge->prev->fx3;
+ dyw1 = ge->fy3 - ge->prev->fy3;
+
+ /* directions of ends of curve */
+ dxb1 = ge->fx1 - ge->prev->fx3;
+ dyb1 = ge->fy1 - ge->prev->fy3;
+ dxe1 = ge->fx3 - ge->fx2;
+ dye1 = ge->fy3 - ge->fy2;
+
+ nge = ge->frwd;
+
+ if (nge->type != GE_CURVE)
+ break;
+
+ dxw2 = nge->fx3 - ge->fx3;
+ dyw2 = nge->fy3 - ge->fy3;
+
+ dxb2 = nge->fx1 - ge->fx3;
+ dyb2 = nge->fy1 - ge->fy3;
+ dxe2 = nge->fx3 - nge->fx2;
+ dye2 = nge->fy3 - nge->fy2;
+
+ /* if curve changes direction */
+ if (fsign(dxw1) != fsign(dxw2) || fsign(dyw1) != fsign(dyw2))
+ break;
+
+ /* if the arch is going in other direction */
+ if (fsign(fabs(dxb1 * dyw1) - fabs(dyb1 * dxw1))
+ * fsign(fabs(dxe2 * dyw2) - fabs(dye2 * dxw2)) > 0)
+ break;
+
+ /* get possible scale limits within which we won't cross quadrants */
+ if( fcrossrays(ge, nge, &maxsc1, &maxsc2) == 0 ) {
+ if(ISDBG(FCONCISE)) {
+ fprintf(stderr, "glyph %s has curves with strange ends\n", g->name);
+ dumppaths(g, ge, nge);
+ }
+ break;
+ }
+
+ if(maxsc1 < 1. || maxsc2 < 1. ) /* would create a zigzag */
+ break;
+
+ ge->dir = fgetcvdir(ge);
+ nge->dir = fgetcvdir(nge);
+
+ if( ((ge->dir&CVDIR_FRONT)-CVDIR_FEQUAL) * ((nge->dir&CVDIR_REAR)-CVDIR_REQUAL) < 0 )
+ /* would create a zigzag */
+ break;
+
+ firstlen = sqrt( dxe1*dxe1 + dye1*dye1 );
+ lastlen = sqrt( dxb2*dxb2 + dyb2*dyb2 );
+ sumlen = firstlen + lastlen;
+
+ /* check the scale limits */
+ if( sumlen/firstlen > maxsc1 || sumlen/lastlen > maxsc2 ) {
+ if(ISDBG(FCONCISE))
+ fprintf(stderr, "%s: %x, %x would be crossing in forceconcise\n",
+ g->name, ge, nge);
+ break;
+ }
+
+ /* OK, it seems like we can attempt to join these two curves */
+ tge.flags = ge->flags;
+ tge.prev = ge->prev;
+ tge.fx1 = ge->fx1;
+ tge.fy1 = ge->fy1;
+ tge.fx2 = nge->fx2;
+ tge.fy2 = nge->fy2;
+ tge.fx3 = nge->fx3;
+ tge.fy3 = nge->fy3;
+
+ dxb1 = tge.fx1 - tge.prev->fx3;
+ dyb1 = tge.fy1 - tge.prev->fy3;
+ dxe1 = tge.fx3 - tge.fx2;
+ dye1 = tge.fy3 - tge.fy2;
+
+ /* scale the first segment */
+ scale = sumlen / firstlen;
+ tge.fx1 = tge.prev->fx3 + scale * dxb1;
+ tge.fy1 = tge.prev->fy3 + scale * dyb1;
+
+ /* scale the last segment */
+ scale = sumlen / lastlen;
+ tge.fx2 = tge.fx3 - scale * dxe1;
+ tge.fy2 = tge.fy3 - scale * dye1;
+
+ /* now check if we got something sensible */
+
+ /* check if some important points is too far from original */
+ scale = firstlen / sumlen;
+ {
+ double pts[4] = { 0./*will be replaced*/, 0.5, 0.25, 0.75 };
+ int i, bad;
+
+ pts[0] = scale;
+ bad = 0;
+
+ for(i=0; i<sizeof(pts)/sizeof(pts[0]); i++)
+ if(fckjoinedcv(g, pts[i], &tge, ge, nge, scale)) {
+ bad = 1;
+ break;
+ }
+ if(bad)
+ break;
+ }
+
+ /* OK, it looks reasonably, let's apply it */
+ if(ISDBG(FCONCISE))
+ dumppaths(g, ge, nge);
+
+ for(i=0; i<3; i++) {
+ ge->fxn[i] = tge.fxn[i];
+ ge->fyn[i] = tge.fyn[i];
+ }
+
+ freethisge(nge);
+ }
+ }
+}
+
+void
+print_glyph(
+ int glyphno
+)
+{
+ GLYPH *g;
+ GENTRY *ge;
+ int x = 0, y = 0;
+ int i;
+ int grp, lastgrp= -1;
+
+ g = &glyph_list[glyphno];
+
+ fprintf(pfa_file, "/%s { \n", g->name);
+
+ /* consider widths >MAXLEGALWIDTH as bugs */
+ if( g->scaledwidth <= MAXLEGALWIDTH ) {
+ fprintf(pfa_file, "0 %d hsbw\n", g->scaledwidth);
+ } else {
+ fprintf(pfa_file, "0 1000 hsbw\n");
+ WARNING_2 fprintf(stderr, "glyph %s: width %d seems to be buggy, set to 1000\n",
+ g->name, g->scaledwidth);
+ }
+
+#if 0
+ fprintf(pfa_file, "%% contours: ");
+ for (i = 0; i < g->ncontours; i++)
+ fprintf(pfa_file, "%s(%d,%d) ", (g->contours[i].direction == DIR_OUTER ? "out" : "in"),
+ g->contours[i].xofmin, g->contours[i].ymin);
+ fprintf(pfa_file, "\n");
+
+ if (g->rymin < 5000)
+ fprintf(pfa_file, "%d lower%s\n", g->rymin, (g->flatymin ? "flat" : "curve"));
+ if (g->rymax > -5000)
+ fprintf(pfa_file, "%d upper%s\n", g->rymax, (g->flatymax ? "flat" : "curve"));
+#endif
+
+ if (g->hstems)
+ for (i = 0; i < g->nhs; i += 2) {
+ if (g->hstems[i].flags & ST_3) {
+ fprintf(pfa_file, "%d %d %d %d %d %d hstem3\n",
+ g->hstems[i].value,
+ g->hstems[i + 1].value - g->hstems[i].value,
+ g->hstems[i + 2].value,
+ g->hstems[i + 3].value - g->hstems[i + 2].value,
+ g->hstems[i + 4].value,
+ g->hstems[i + 5].value - g->hstems[i + 4].value
+ );
+ i += 4;
+ } else {
+ fprintf(pfa_file, "%d %d hstem\n", g->hstems[i].value,
+ g->hstems[i + 1].value - g->hstems[i].value);
+ }
+ }
+
+ if (g->vstems)
+ for (i = 0; i < g->nvs; i += 2) {
+ if (g->vstems[i].flags & ST_3) {
+ fprintf(pfa_file, "%d %d %d %d %d %d vstem3\n",
+ g->vstems[i].value,
+ g->vstems[i + 1].value - g->vstems[i].value,
+ g->vstems[i + 2].value,
+ g->vstems[i + 3].value - g->vstems[i + 2].value,
+ g->vstems[i + 4].value,
+ g->vstems[i + 5].value - g->vstems[i + 4].value
+ );
+ i += 4;
+ } else {
+ fprintf(pfa_file, "%d %d vstem\n", g->vstems[i].value,
+ g->vstems[i + 1].value - g->vstems[i].value);
+ }
+ }
+
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if(g->nsg>0) {
+ grp=ge->stemid;
+ if(grp >= 0 && grp != lastgrp) {
+ fprintf(pfa_file, "%d 4 callsubr\n", grp+g->firstsubr);
+ lastgrp=grp;
+ }
+ }
+
+ switch (ge->type) {
+ case GE_MOVE:
+ if (absolute)
+ fprintf(pfa_file, "%d %d amoveto\n", ge->ix3, ge->iy3);
+ else
+ rmoveto(ge->ix3 - x, ge->iy3 - y);
+ if (0)
+ fprintf(stderr, "Glyph %s: print moveto(%d, %d)\n",
+ g->name, ge->ix3, ge->iy3);
+ x = ge->ix3;
+ y = ge->iy3;
+ break;
+ case GE_LINE:
+ if (absolute)
+ fprintf(pfa_file, "%d %d alineto\n", ge->ix3, ge->iy3);
+ else
+ rlineto(ge->ix3 - x, ge->iy3 - y);
+ x = ge->ix3;
+ y = ge->iy3;
+ break;
+ case GE_CURVE:
+ if (absolute)
+ fprintf(pfa_file, "%d %d %d %d %d %d arcurveto\n",
+ ge->ix1, ge->iy1, ge->ix2, ge->iy2, ge->ix3, ge->iy3);
+ else
+ rrcurveto(ge->ix1 - x, ge->iy1 - y,
+ ge->ix2 - ge->ix1, ge->iy2 - ge->iy1,
+ ge->ix3 - ge->ix2, ge->iy3 - ge->iy2);
+ x = ge->ix3;
+ y = ge->iy3;
+ break;
+ case GE_PATH:
+ closepath();
+ break;
+ default:
+ WARNING_1 fprintf(stderr, "**** Glyph %s: unknown entry type '%c'\n",
+ g->name, ge->type);
+ break;
+ }
+ }
+
+ fprintf(pfa_file, "endchar } ND\n");
+}
+
+/* print the subroutines for this glyph, returns the number of them */
+int
+print_glyph_subs(
+ int glyphno,
+ int startid /* start numbering subroutines from this id */
+)
+{
+ GLYPH *g;
+ int i, grp;
+
+ g = &glyph_list[glyphno];
+
+ if(!hints || !subhints || g->nsg<1)
+ return 0;
+
+ g->firstsubr=startid;
+
+#if 0
+ fprintf(pfa_file, "%% %s %d\n", g->name, g->nsg);
+#endif
+ for(grp=0; grp<g->nsg; grp++) {
+ fprintf(pfa_file, "dup %d {\n", startid++);
+ for(i= (grp==0)? 0 : g->nsbs[grp-1]; i<g->nsbs[grp]; i++)
+ fprintf(pfa_file, "\t%d %d %cstem\n", g->sbstems[i].low,
+ g->sbstems[i].high-g->sbstems[i].low,
+ g->sbstems[i].isvert ? 'v' : 'h');
+ fprintf(pfa_file, "\treturn\n\t} NP\n");
+ }
+
+ return g->nsg;
+}
+
+void
+print_glyph_metrics(
+ int code,
+ int glyphno
+)
+{
+ GLYPH *g;
+
+ g = &glyph_list[glyphno];
+
+ if(transform)
+ fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n",
+ code, g->scaledwidth, g->name,
+ iscale(g->xMin), iscale(g->yMin), iscale(g->xMax), iscale(g->yMax));
+ else
+ fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n",
+ code, g->scaledwidth, g->name,
+ g->xMin, g->yMin, g->xMax, g->yMax);
+}
+
+/*
+ SB:
+ An important note about the BlueValues.
+
+ The Adobe documentation says that the maximal width of a Blue zone
+ is connected to the value of BlueScale, which is by default 0.039625.
+ The BlueScale value defines, at which point size the overshoot
+ suppression be disabled.
+
+ The formula for it that is given in the manual is:
+
+ BlueScale=point_size/240, for a 300dpi device
+
+ that makes us wonder what is this 240 standing for. Incidentally
+ 240=72*1000/300, where 72 is the relation between inches and points,
+ 1000 is the size of the glyph matrix, and 300dpi is the resolution of
+ the output device. Knowing that we can recalculate the formula for
+ the font size in pixels rather than points:
+
+ BlueScale=pixel_size/1000
+
+ That looks a lot simpler than the original formula, does not it ?
+ And the limitation about the maximal width of zone also looks
+ a lot simpler after the transformation:
+
+ max_width < 1000/pixel_size
+
+ that ensures that even at the maximal pixel size when the overshoot
+ suppression is disabled the zone width will be less than one pixel.
+ This is important, failure to comply to this limit will result in
+ really ugly fonts (been there, done that). But knowing the formula
+ for the pixel width, we see that in fact we can use the maximal width
+ of 24, not 23 as specified in the manual.
+
+*/
+
+#define MAXBLUEWIDTH (24)
+
+/*
+ * Find the indexes of the most frequent values
+ * in the hystogram, sort them in ascending order, and save which one
+ * was the best one (if asked).
+ * Returns the number of values found (may be less than maximal because
+ * we ignore the zero values)
+ */
+
+#define MAXHYST (2000) /* size of the hystogram */
+#define HYSTBASE 500
+
+static int
+besthyst(
+ short *hyst, /* the hystogram */
+ int base, /* the base point of the hystogram */
+ int *best, /* the array for indexes of best values */
+ int nbest, /* its allocated size */
+ int width, /* minimal difference between indexes */
+ int *bestindp /* returned top point */
+)
+{
+ unsigned char hused[MAXHYST / 8 + 1];
+ int i, max, j, w;
+ int nf = 0;
+
+ width--;
+
+ for (i = 0; i <= MAXHYST / 8; i++)
+ hused[i] = 0;
+
+ max = 1;
+ for (i = 0; i < nbest && max != 0; i++) {
+ best[i] = 0;
+ max = 0;
+ for (j = 1; j < MAXHYST - 1; j++) {
+ w = hyst[j];
+
+ if (w > max && (hused[j >> 3] & (1 << (j & 0x07))) == 0) {
+ best[i] = j;
+ max = w;
+ }
+ }
+ if (max != 0) {
+ for (j = best[i] - width; j <= best[i] + width; j++) {
+ if (j >= 0 && j < MAXHYST)
+ hused[j >> 3] |= (1 << (j & 0x07));
+ }
+ best[i] -= base;
+ nf = i + 1;
+ }
+ }
+
+ if (bestindp)
+ *bestindp = best[0];
+
+ /* sort the indexes in ascending order */
+ for (i = 0; i < nf; i++) {
+ for (j = i + 1; j < nf; j++)
+ if (best[j] < best[i]) {
+ w = best[i];
+ best[i] = best[j];
+ best[j] = w;
+ }
+ }
+
+ return nf;
+}
+
+/*
+ * Find the next best Blue zone in the hystogram.
+ * Return the weight of the found zone.
+ */
+
+static int
+bestblue(
+ short *zhyst, /* the zones hystogram */
+ short *physt, /* the points hystogram */
+ short *ozhyst, /* the other zones hystogram */
+ int *bluetab /* where to put the found zone */
+)
+{
+ int i, j, w, max, ind, first, last;
+
+ /* find the highest point in the zones hystogram */
+ /* if we have a plateau, take its center */
+ /* if we have multiple peaks, take the first one */
+
+ max = -1;
+ first = last = -10;
+ for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) {
+ w = zhyst[i];
+ if (w > max) {
+ first = last = i;
+ max = w;
+ } else if (w == max) {
+ if (last == i - 1)
+ last = i;
+ }
+ }
+ ind = (first + last) / 2;
+
+ if (max == 0) /* no zones left */
+ return 0;
+
+ /* now we reuse `first' and `last' as inclusive borders of the zone */
+ first = ind;
+ last = ind + (MAXBLUEWIDTH - 1);
+
+ /* our maximal width is far too big, so we try to make it narrower */
+ w = max;
+ j = (w & 1); /* a pseudo-random bit */
+ while (1) {
+ while (physt[first] == 0)
+ first++;
+ while (physt[last] == 0)
+ last--;
+ if (last - first < (MAXBLUEWIDTH * 2 / 3) || (max - w) * 10 > max)
+ break;
+
+ if (physt[first] < physt[last]
+ || physt[first] == physt[last] && j) {
+ if (physt[first] * 20 > w) /* if weight is >5%,
+ * stop */
+ break;
+ w -= physt[first];
+ first++;
+ j = 0;
+ } else {
+ if (physt[last] * 20 > w) /* if weight is >5%,
+ * stop */
+ break;
+ w -= physt[last];
+ last--;
+ j = 1;
+ }
+ }
+
+ /* save our zone */
+ bluetab[0] = first - HYSTBASE;
+ bluetab[1] = last - HYSTBASE;
+
+ /* invalidate all the zones overlapping with this one */
+ /* the constant of 2 is determined by the default value of BlueFuzz */
+ for (i = first - (MAXBLUEWIDTH - 1) - 2; i <= last + 2; i++)
+ if (i >= 0 && i < MAXHYST) {
+ zhyst[i] = 0;
+ ozhyst[i] = 0;
+ }
+ return w;
+}
+
+/*
+ * Try to find the Blue Values, bounding box and italic angle
+ */
+
+void
+findblues(void)
+{
+ /* hystograms for upper and lower zones */
+ short hystl[MAXHYST];
+ short hystu[MAXHYST];
+ short zuhyst[MAXHYST];
+ short zlhyst[MAXHYST];
+ int nchars;
+ int i, j, k, w, max;
+ GENTRY *ge;
+ GLYPH *g;
+ double ang;
+
+ /* find the lowest and highest points of glyphs */
+ /* and by the way build the values for FontBBox */
+ /* and build the hystogram for the ItalicAngle */
+
+ /* re-use hystl for the hystogram of italic angle */
+
+ bbox[0] = bbox[1] = 5000;
+ bbox[2] = bbox[3] = -5000;
+
+ for (i = 0; i < MAXHYST; i++)
+ hystl[i] = 0;
+
+ nchars = 0;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ if (g->flags & GF_USED) {
+ nchars++;
+
+ g->rymin = 5000;
+ g->rymax = -5000;
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type == GE_LINE) {
+
+ j = ge->iy3 - ge->prev->iy3;
+ k = ge->ix3 - ge->prev->ix3;
+ if (j > 0)
+ ang = atan2(-k, j) * 180.0 / M_PI;
+ else
+ ang = atan2(k, -j) * 180.0 / M_PI;
+
+ k /= 100;
+ j /= 100;
+ if (ang > -45.0 && ang < 45.0) {
+ /*
+ * be careful to not overflow
+ * the counter
+ */
+ hystl[HYSTBASE + (int) (ang * 10.0)] += (k * k + j * j) / 4;
+ }
+ if (ge->iy3 == ge->prev->iy3) {
+ if (ge->iy3 <= g->rymin) {
+ g->rymin = ge->iy3;
+ g->flatymin = 1;
+ }
+ if (ge->iy3 >= g->rymax) {
+ g->rymax = ge->iy3;
+ g->flatymax = 1;
+ }
+ } else {
+ if (ge->iy3 < g->rymin) {
+ g->rymin = ge->iy3;
+ g->flatymin = 0;
+ }
+ if (ge->iy3 > g->rymax) {
+ g->rymax = ge->iy3;
+ g->flatymax = 0;
+ }
+ }
+ } else if (ge->type == GE_CURVE) {
+ if (ge->iy3 < g->rymin) {
+ g->rymin = ge->iy3;
+ g->flatymin = 0;
+ }
+ if (ge->iy3 > g->rymax) {
+ g->rymax = ge->iy3;
+ g->flatymax = 0;
+ }
+ }
+ if (ge->type == GE_LINE || ge->type == GE_CURVE) {
+ if (ge->ix3 < bbox[0])
+ bbox[0] = ge->ix3;
+ if (ge->ix3 > bbox[2])
+ bbox[2] = ge->ix3;
+ if (ge->iy3 < bbox[1])
+ bbox[1] = ge->iy3;
+ if (ge->iy3 > bbox[3])
+ bbox[3] = ge->iy3;
+ }
+ }
+ }
+ }
+
+ /* get the most popular angle */
+ max = 0;
+ w = 0;
+ for (i = 0; i < MAXHYST; i++) {
+ if (hystl[i] > w) {
+ w = hystl[i];
+ max = i;
+ }
+ }
+ ang = (double) (max - HYSTBASE) / 10.0;
+ WARNING_2 fprintf(stderr, "Guessed italic angle: %f\n", ang);
+ if (italic_angle == 0.0)
+ italic_angle = ang;
+
+ /* build the hystogram of the lower points */
+ for (i = 0; i < MAXHYST; i++)
+ hystl[i] = 0;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ if ((g->flags & GF_USED)
+ && g->rymin + HYSTBASE >= 0 && g->rymin < MAXHYST - HYSTBASE) {
+ hystl[g->rymin + HYSTBASE]++;
+ }
+ }
+
+ /* build the hystogram of the upper points */
+ for (i = 0; i < MAXHYST; i++)
+ hystu[i] = 0;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ if ((g->flags & GF_USED)
+ && g->rymax + HYSTBASE >= 0 && g->rymax < MAXHYST - HYSTBASE) {
+ hystu[g->rymax + HYSTBASE]++;
+ }
+ }
+
+ /* build the hystogram of all the possible lower zones with max width */
+ for (i = 0; i < MAXHYST; i++)
+ zlhyst[i] = 0;
+
+ for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) {
+ for (j = 0; j < MAXBLUEWIDTH; j++)
+ zlhyst[i] += hystl[i + j];
+ }
+
+ /* build the hystogram of all the possible upper zones with max width */
+ for (i = 0; i < MAXHYST; i++)
+ zuhyst[i] = 0;
+
+ for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) {
+ for (j = 0; j < MAXBLUEWIDTH; j++)
+ zuhyst[i] += hystu[i + j];
+ }
+
+ /* find the baseline */
+ w = bestblue(zlhyst, hystl, zuhyst, &bluevalues[0]);
+ if (0)
+ fprintf(stderr, "BaselineBlue zone %d%% %d...%d\n", w * 100 / nchars,
+ bluevalues[0], bluevalues[1]);
+
+ if (w == 0) /* no baseline, something weird */
+ return;
+
+ /* find the upper zones */
+ for (nblues = 2; nblues < 14; nblues += 2) {
+ w = bestblue(zuhyst, hystu, zlhyst, &bluevalues[nblues]);
+
+ if (0)
+ fprintf(stderr, "Blue zone %d%% %d...%d\n", w * 100 / nchars,
+ bluevalues[nblues], bluevalues[nblues+1]);
+
+ if (w * 20 < nchars)
+ break; /* don't save this zone */
+ }
+
+ /* find the lower zones */
+ for (notherb = 0; notherb < 10; notherb += 2) {
+ w = bestblue(zlhyst, hystl, zuhyst, &otherblues[notherb]);
+
+ if (0)
+ fprintf(stderr, "OtherBlue zone %d%% %d...%d\n", w * 100 / nchars,
+ otherblues[notherb], otherblues[notherb+1]);
+
+
+ if (w * 20 < nchars)
+ break; /* don't save this zone */
+ }
+
+}
+
+/*
+ * Find the actual width of the glyph and modify the
+ * description to reflect it. Not guaranteed to do
+ * any good, may make character spacing too wide.
+ */
+
+void
+docorrectwidth(void)
+{
+ int i;
+ GENTRY *ge;
+ GLYPH *g;
+ int xmin, xmax;
+ int maxwidth, minsp;
+
+ /* enforce this minimal spacing,
+ * we limit the amount of the enforced spacing to avoid
+ * spacing the bold wonts too widely
+ */
+ minsp = (stdhw>60 || stdhw<10)? 60 : stdhw;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ g->oldwidth=g->scaledwidth; /* save the old width, will need for AFM */
+
+ if (correctwidth && g->flags & GF_USED) {
+ xmin = 5000;
+ xmax = -5000;
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type != GE_LINE && ge->type != GE_CURVE)
+ continue;
+
+ if (ge->ix3 <= xmin) {
+ xmin = ge->ix3;
+ }
+ if (ge->ix3 >= xmax) {
+ xmax = ge->ix3;
+ }
+ }
+
+ maxwidth=xmax+minsp;
+ if( g->scaledwidth < maxwidth ) {
+ g->scaledwidth = maxwidth;
+ WARNING_3 fprintf(stderr, "glyph %s: extended from %d to %d\n",
+ g->name, g->oldwidth, g->scaledwidth );
+ }
+ }
+ }
+
+}
+
+/*
+ * Try to find the typical stem widths
+ */
+
+void
+stemstatistics(void)
+{
+ short hyst[MAXHYST];
+ int best[12];
+ int i, j, w;
+ int nchars;
+ int ns;
+ STEM *s;
+ GLYPH *g;
+
+ /* start with typical stem width */
+
+ nchars=0;
+
+ /* build the hystogram of horizontal stem widths */
+ for (i = 0; i < MAXHYST; i++)
+ hyst[i] = 0;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ if (g->flags & GF_USED) {
+ nchars++;
+ s = g->hstems;
+ for (j = 0; j < g->nhs; j += 2) {
+ if ((s[j].flags | s[j + 1].flags) & ST_END)
+ continue;
+ w = s[j + 1].value - s[j].value+1;
+ if(w==20) /* split stems should not be counted */
+ continue;
+ if (w > 0 && w < MAXHYST - 1) {
+ /*
+ * handle some fuzz present in
+ * converted fonts
+ */
+ hyst[w] += 2;
+ hyst[w - 1]++;
+ hyst[w + 1]++;
+ }
+ }
+ }
+ }
+
+ /* find 12 most frequent values */
+ ns = besthyst(hyst, 0, best, 12, 3, &stdhw);
+
+ /* store data in stemsnaph */
+ for (i = 0; i < ns; i++)
+ stemsnaph[i] = best[i];
+ if (ns < 12)
+ stemsnaph[ns] = 0;
+
+ /* build the hystogram of vertical stem widths */
+ for (i = 0; i < MAXHYST; i++)
+ hyst[i] = 0;
+
+ for (i = 0, g = glyph_list; i < numglyphs; i++, g++) {
+ if (g->flags & GF_USED) {
+ s = g->vstems;
+ for (j = 0; j < g->nvs; j += 2) {
+ if ((s[j].flags | s[j + 1].flags) & ST_END)
+ continue;
+ w = s[j + 1].value - s[j].value+1;
+ if (w > 0 && w < MAXHYST - 1) {
+ /*
+ * handle some fuzz present in
+ * converted fonts
+ */
+ hyst[w] += 2;
+ hyst[w - 1]++;
+ hyst[w + 1]++;
+ }
+ }
+ }
+ }
+
+ /* find 12 most frequent values */
+ ns = besthyst(hyst, 0, best, 12, 3, &stdvw);
+
+ /* store data in stemsnaph */
+ for (i = 0; i < ns; i++)
+ stemsnapv[i] = best[i];
+ if (ns < 12)
+ stemsnapv[ns] = 0;
+
+}
+
+/*
+ * SB
+ * A funny thing: TTF paths are going in reverse direction compared
+ * to Type1. So after all (because the rest of logic uses TTF
+ * path directions) we have to reverse the paths.
+ *
+ * It was a big headache to discover that.
+ */
+
+/* works on both int and float paths */
+
+void
+reversepathsfromto(
+ GENTRY * from,
+ GENTRY * to
+)
+{
+ GENTRY *ge, *nge, *pge;
+ GENTRY *cur, *next;
+ int i, n, ilast[2];
+ double flast[2], f;
+
+ for (ge = from; ge != 0 && ge != to; ge = ge->next) {
+ if(ge->type == GE_LINE || ge->type == GE_CURVE) {
+ if (ISDBG(REVERSAL))
+ fprintf(stderr, "reverse path 0x%x <- 0x%x, 0x%x\n", ge, ge->prev, ge->bkwd);
+
+ /* cut out the path itself */
+ pge = ge->prev; /* GE_MOVE */
+ if (pge == 0) {
+ fprintf(stderr, "**! No MOVE before line !!! Fatal. ****\n");
+ exit(1);
+ }
+ nge = ge->bkwd->next; /* GE_PATH */
+ pge->next = nge;
+ nge->prev = pge;
+ ge->bkwd->next = 0; /* mark end of chain */
+
+ /* remember the starting point */
+ if(ge->flags & GEF_FLOAT) {
+ flast[0] = pge->fx3;
+ flast[1] = pge->fy3;
+ } else {
+ ilast[0] = pge->ix3;
+ ilast[1] = pge->iy3;
+ }
+
+ /* then reinsert them in backwards order */
+ for(cur = ge; cur != 0; cur = next ) {
+ next = cur->next; /* or addgeafter() will screw it up */
+ if(cur->flags & GEF_FLOAT) {
+ for(i=0; i<2; i++) {
+ /* reverse the direction of path element */
+ f = cur->fpoints[i][0];
+ cur->fpoints[i][0] = cur->fpoints[i][1];
+ cur->fpoints[i][1] = f;
+ f = flast[i];
+ flast[i] = cur->fpoints[i][2];
+ cur->fpoints[i][2] = f;
+ }
+ } else {
+ for(i=0; i<2; i++) {
+ /* reverse the direction of path element */
+ n = cur->ipoints[i][0];
+ cur->ipoints[i][0] = cur->ipoints[i][1];
+ cur->ipoints[i][1] = n;
+ n = ilast[i];
+ ilast[i] = cur->ipoints[i][2];
+ cur->ipoints[i][2] = n;
+ }
+ }
+ addgeafter(pge, cur);
+ }
+
+ /* restore the starting point */
+ if(ge->flags & GEF_FLOAT) {
+ pge->fx3 = flast[0];
+ pge->fy3 = flast[1];
+ } else {
+ pge->ix3 = ilast[0];
+ pge->iy3 = ilast[1];
+ }
+
+ ge = nge;
+ }
+
+ }
+}
+
+void
+reversepaths(
+ GLYPH * g
+)
+{
+ reversepathsfromto(g->entries, NULL);
+}
+
+/* add a kerning pair information, scales the value */
+
+void
+addkernpair(
+ unsigned id1,
+ unsigned id2,
+ int unscval
+)
+{
+ static unsigned char *bits = 0;
+ static int lastid;
+ GLYPH *g = &glyph_list[id1];
+ int i, n;
+ struct kern *p;
+
+ if(unscval == 0 || id1 >= numglyphs || id2 >= numglyphs)
+ return;
+
+ if( (glyph_list[id1].flags & GF_USED)==0
+ || (glyph_list[id2].flags & GF_USED)==0 )
+ return;
+
+ if(bits == 0) {
+ bits = calloc( BITMAP_BYTES(numglyphs), 1);
+ if (bits == NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+ lastid = id1;
+ }
+
+ if(lastid != id1) {
+ /* refill the bitmap cache */
+ memset(bits, 0,BITMAP_BYTES(numglyphs));
+ p = g->kern;
+ for(i=g->kerncount; i>0; i--) {
+ n = (p++)->id;
+ SET_BITMAP(bits, n);
+ }
+ lastid = id1;
+ }
+
+ if(IS_BITMAP(bits, id2))
+ return; /* duplicate */
+
+ if(g->kerncount <= g->kernalloc) {
+ g->kernalloc += 8;
+ p = realloc(g->kern, sizeof(struct kern) * g->kernalloc);
+ if(p == 0) {
+ fprintf (stderr, "** realloc failed, kerning data will be incomplete\n");
+ }
+ g->kern = p;
+ }
+
+ SET_BITMAP(bits, id2);
+ p = &g->kern[g->kerncount];
+ p->id = id2;
+ p->val = iscale(unscval) - (g->scaledwidth - g->oldwidth);
+ g->kerncount++;
+ kerning_pairs++;
+}
+
+/* print out the kerning information */
+
+void
+print_kerning(
+ FILE *afm_file
+)
+{
+ int i, j, n;
+ GLYPH *g;
+ struct kern *p;
+
+ if( kerning_pairs == 0 )
+ return;
+
+ fprintf(afm_file, "StartKernData\n");
+ fprintf(afm_file, "StartKernPairs %hd\n", kerning_pairs);
+
+ for(i=0; i<numglyphs; i++) {
+ g = &glyph_list[i];
+ if( (g->flags & GF_USED) ==0)
+ continue;
+ p = g->kern;
+ for(j=g->kerncount; j>0; j--, p++) {
+ fprintf(afm_file, "KPX %s %s %d\n", g->name,
+ glyph_list[ p->id ].name, p->val );
+ }
+ }
+
+ fprintf(afm_file, "EndKernPairs\n");
+ fprintf(afm_file, "EndKernData\n");
+}
+
+
+#if 0
+
+/*
+** This function is commented out because the information
+** collected by it is not used anywhere else yet. Now
+** it only collects the directions of contours. And the
+** direction of contours gets fixed already in draw_glyf().
+**
+***********************************************
+**
+** Here we expect that the paths are already closed.
+** We also expect that the contours do not intersect
+** and that curves doesn't cross any border of quadrant.
+**
+** Find which contours go inside which and what is
+** their proper direction. Then fix the direction
+** to make it right.
+**
+*/
+
+#define MAXCONT 1000
+
+void
+fixcontours(
+ GLYPH * g
+)
+{
+ CONTOUR cont[MAXCONT];
+ short ymax[MAXCONT]; /* the highest point */
+ short xofmax[MAXCONT]; /* X-coordinate of any point
+ * at ymax */
+ short ymin[MAXCONT]; /* the lowest point */
+ short xofmin[MAXCONT]; /* X-coordinate of any point
+ * at ymin */
+ short count[MAXCONT]; /* count of lines */
+ char dir[MAXCONT]; /* in which direction they must go */
+ GENTRY *start[MAXCONT], *minptr[MAXCONT], *maxptr[MAXCONT];
+ int ncont;
+ int i;
+ int dx1, dy1, dx2, dy2;
+ GENTRY *ge, *nge;
+
+ /* find the contours and their most upper/lower points */
+ ncont = 0;
+ ymax[0] = -5000;
+ ymin[0] = 5000;
+ for (ge = g->entries; ge != 0; ge = ge->next) {
+ if (ge->type == GE_LINE || ge->type == GE_CURVE) {
+ if (ge->iy3 > ymax[ncont]) {
+ ymax[ncont] = ge->iy3;
+ xofmax[ncont] = ge->ix3;
+ maxptr[ncont] = ge;
+ }
+ if (ge->iy3 < ymin[ncont]) {
+ ymin[ncont] = ge->iy3;
+ xofmin[ncont] = ge->ix3;
+ minptr[ncont] = ge;
+ }
+ }
+ if (ge->frwd != ge->next) {
+ start[ncont++] = ge->frwd;
+ ymax[ncont] = -5000;
+ ymin[ncont] = 5000;
+ }
+ }
+
+ /* determine the directions of contours */
+ for (i = 0; i < ncont; i++) {
+ ge = minptr[i];
+ nge = ge->frwd;
+
+ if (ge->type == GE_CURVE) {
+ dx1 = ge->ix3 - ge->ix2;
+ dy1 = ge->iy3 - ge->iy2;
+
+ if (dx1 == 0 && dy1 == 0) { /* a pathological case */
+ dx1 = ge->ix3 - ge->ix1;
+ dy1 = ge->iy3 - ge->iy1;
+ }
+ if (dx1 == 0 && dy1 == 0) { /* a more pathological
+ * case */
+ dx1 = ge->ix3 - ge->prev->ix3;
+ dy1 = ge->iy3 - ge->prev->iy3;
+ }
+ } else {
+ dx1 = ge->ix3 - ge->prev->ix3;
+ dy1 = ge->iy3 - ge->prev->iy3;
+ }
+ if (nge->type == GE_CURVE) {
+ dx2 = ge->ix3 - nge->ix1;
+ dy2 = ge->iy3 - nge->iy1;
+ if (dx1 == 0 && dy1 == 0) { /* a pathological case */
+ dx2 = ge->ix3 - nge->ix2;
+ dy2 = ge->iy3 - nge->iy2;
+ }
+ if (dx1 == 0 && dy1 == 0) { /* a more pathological
+ * case */
+ dx2 = ge->ix3 - nge->ix3;
+ dy2 = ge->iy3 - nge->iy3;
+ }
+ } else {
+ dx2 = ge->ix3 - nge->ix3;
+ dy2 = ge->iy3 - nge->iy3;
+ }
+
+ /* compare angles */
+ cont[i].direction = DIR_INNER;
+ if (dy1 == 0) {
+ if (dx1 < 0)
+ cont[i].direction = DIR_OUTER;
+ } else if (dy2 == 0) {
+ if (dx2 > 0)
+ cont[i].direction = DIR_OUTER;
+ } else if (dx2 * dy1 < dx1 * dy2)
+ cont[i].direction = DIR_OUTER;
+
+ cont[i].ymin = ymin[i];
+ cont[i].xofmin = xofmin[i];
+ }
+
+ /* save the information that may be needed further */
+ g->ncontours = ncont;
+ if (ncont > 0) {
+ g->contours = malloc(sizeof(CONTOUR) * ncont);
+ if (g->contours == 0) {
+ fprintf(stderr, "***** Memory allocation error *****\n");
+ exit(255);
+ }
+ memcpy(g->contours, cont, sizeof(CONTOUR) * ncont);
+ }
+}
+
+#endif
+
+/*
+ *
+ */
+
diff --git a/fonts/utilities/ttf2pt1/pt1.h b/fonts/utilities/ttf2pt1/pt1.h
new file mode 100644
index 0000000000..b1c8d11c86
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/pt1.h
@@ -0,0 +1,229 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+/* glyph entry, one drawing command */
+typedef struct gentry {
+ /* this list links all GENTRYs of a GLYPH sequentially */
+ struct gentry *next; /* double linked list */
+ struct gentry *prev;
+
+ /* this list links all GENTRYs of one contour -
+ * of types GE_LINE and GE_CURVE only
+ * bkwd is also reused: in the very first entry (normally
+ * of type GE_MOVE) it points to g->entries
+ */
+ struct gentry *cntr[2]; /* double-linked circular list */
+/* convenience handles */
+#define bkwd cntr[0]
+#define frwd cntr[1]
+
+ union {
+ struct {
+ int val[2][3]; /* integer values */
+ } i;
+ struct {
+ double val[2][3]; /* floating values */
+ } f;
+ } points; /* absolute values, NOT deltas */
+/* convenience handles */
+#define ipoints points.i.val
+#define fpoints points.f.val
+#define ixn ipoints[0]
+#define iyn ipoints[1]
+#define fxn fpoints[0]
+#define fyn fpoints[1]
+#define ix1 ixn[0]
+#define ix2 ixn[1]
+#define ix3 ixn[2]
+#define iy1 iyn[0]
+#define iy2 iyn[1]
+#define iy3 iyn[2]
+#define fx1 fxn[0]
+#define fx2 fxn[1]
+#define fx3 fxn[2]
+#define fy1 fyn[0]
+#define fy2 fyn[1]
+#define fy3 fyn[2]
+
+ char flags;
+#define GEF_FLOAT 0x02 /* entry contains floating point data */
+
+ unsigned char dir; /* used to temporarily store the values for
+ * the directions of the ends of curves */
+/* front end */
+#define CVDIR_FUP 0x02 /* goes over the line connecting the ends */
+#define CVDIR_FEQUAL 0x01 /* coincides with the line connecting the
+ * ends */
+#define CVDIR_FDOWN 0x00 /* goes under the line connecting the ends */
+#define CVDIR_FRONT 0x0F /* mask of all front directions */
+/* rear end */
+#define CVDIR_RSAME 0x30 /* is the same as for the front end */
+#define CVDIR_RUP 0x20 /* goes over the line connecting the ends */
+#define CVDIR_REQUAL 0x10 /* coincides with the line connecting the
+ * ends */
+#define CVDIR_RDOWN 0x00 /* goes under the line connecting the ends */
+#define CVDIR_REAR 0xF0 /* mask of all rear directions */
+
+ signed char stemid; /* connection to the substituted stem group */
+ char type;
+#define GE_HSBW 'B'
+#define GE_MOVE 'M'
+#define GE_LINE 'L'
+#define GE_CURVE 'C'
+#define GE_PATH 'P'
+} GENTRY;
+
+/* stem structure, describes one [hv]stem */
+/* acually, it describes one border of a stem */
+/* the whole stem is a pair of these structures */
+
+typedef struct stem {
+ short value; /* value of X or Y coordinate */
+ short origin; /* point of origin for curve stems */
+ /* also for all the stems the tuple (value, origin, flags & ST_UP)
+ * is used to determine whether a stem is relevant for a
+ * line, it's considered revelant if this tuple is
+ * equal to any of the ends of the line
+ */
+ short from, to; /* values of other coordinate between
+ * which this stem is valid */
+
+ short flags;
+ /* ordering of ST_END, ST_FLAT, ST_ZONE is IMPORTANT for sorting */
+#define ST_END 0x01 /* end of line, lowest priority */
+#define ST_FLAT 0x02 /* stem is defined by a flat line, not a
+ * curve */
+#define ST_ZONE 0x04 /* pseudo-stem, the limit of a blue zone */
+#define ST_UP 0x08 /* the black area is to up or right from
+ * value */
+#define ST_3 0x20 /* first stem of [hv]stem3 */
+#define ST_BLUE 0x40 /* stem is in blue zone */
+#define ST_TOPZONE 0x80 /* 1 - top zone, 0 - bottom zone */
+#define ST_VERT 0x100 /* vertical stem (used in substitutions) */
+} STEM;
+
+#define MAX_STEMS 2000 /* we can't have more stems than path
+ * elements (or hope so) */
+#define NSTEMGRP 50 /* maximal number of the substituted stem groups */
+
+/* structure for economical representation of the
+ * substituted stems
+ */
+
+typedef struct stembounds {
+ short low; /* low bound */
+ short high; /* high bound */
+ char isvert; /* 1 - vertical, 0 - horizontal */
+ char already; /* temp. flag: is aleready included */
+} STEMBOUNDS;
+
+struct kern {
+ unsigned id; /* ID of the second glyph */
+ int val; /* kerning value */
+};
+
+typedef struct contour {
+ short ymin, xofmin;
+ short inside; /* inside which contour */
+ char direction;
+#define DIR_OUTER 1
+#define DIR_INNER 0
+} CONTOUR;
+
+typedef struct glyph {
+ int char_no;/* Encoding of glyph */
+ int orig_code;/* code of glyph in the font's original encoding */
+ char *name; /* Postscript name of glyph */
+ int xMin, yMin, xMax, yMax; /* values from TTF dictionary */
+ int lsb; /* left sidebearing */
+ int ttf_pathlen; /* total length of TTF paths */
+ short width;
+ short flags;
+#define GF_USED 0x0001 /* whether is this glyph used in T1 font */
+#define GF_FLOAT 0x0002 /* thys glyph contains floating point entries */
+
+ GENTRY *entries;/* doube linked list of entries */
+ GENTRY *lastentry; /* the last inserted entry */
+ GENTRY *path; /* beggining of the last path */
+ int oldwidth; /* actually also scaled */
+ int scaledwidth;
+#define MAXLEGALWIDTH 10000
+
+ struct kern *kern; /* kerning data */
+ int kerncount; /* number of kerning pairs */
+ int kernalloc; /* for how many pairs we have space */
+
+ STEM *hstems; /* global horiz. and vert. stems */
+ STEM *vstems;
+ int nhs, nvs; /* numbers of stems */
+
+ STEMBOUNDS *sbstems; /* substituted stems for all the groups */
+ short *nsbs; /* indexes of the group ends in the common array */
+ int nsg; /* actual number of the stem groups */
+ int firstsubr; /* first substistuted stems subroutine number */
+
+ CONTOUR *contours; /* it is not used now */
+ int ncontours;
+
+ int rymin, rymax; /* real values */
+ /* do we have flat surfaces on top/bottom */
+ char flatymin, flatymax;
+
+} GLYPH;
+
+extern int stdhw, stdvw; /* dominant stems widths */
+extern int stemsnaph[12], stemsnapv[12]; /* most typical stem width */
+
+extern int bluevalues[14];
+extern int nblues;
+extern int otherblues[10];
+extern int notherb;
+extern int bbox[4]; /* the FontBBox array */
+extern double italic_angle;
+
+extern GLYPH *glyph_list;
+extern int encoding[256]; /* inverse of glyph[].char_no */
+
+/* prototypes of functions */
+void rmoveto( int dx, int dy);
+void rlineto( int dx, int dy);
+void rrcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
+void assertpath( GENTRY * from, char *file, int line, char *name);
+
+void fg_rmoveto( GLYPH * g, double x, double y);
+void ig_rmoveto( GLYPH * g, int x, int y);
+void fg_rlineto( GLYPH * g, double x, double y);
+void ig_rlineto( GLYPH * g, int x, int y);
+void fg_rrcurveto( GLYPH * g, double x1, double y1,
+ double x2, double y2, double x3, double y3);
+void ig_rrcurveto( GLYPH * g, int x1, int y1,
+ int x2, int y2, int x3, int y3);
+void g_closepath( GLYPH * g);
+
+void pathtoint( GLYPH *g);
+void ffixquadrants( GLYPH *g);
+void flattencurves( GLYPH * g);
+int checkcv( GENTRY * ge, int dx, int dy);
+void iclosepaths( GLYPH * g);
+void fclosepaths( GLYPH * g);
+void smoothjoints( GLYPH * g);
+void buildstems( GLYPH * g);
+void fstraighten( GLYPH * g);
+void istraighten( GLYPH * g, int zigonly);
+void isplitzigzags( GLYPH * g);
+void fsplitzigzags( GLYPH * g);
+void fforceconcise( GLYPH * g);
+void iforceconcise( GLYPH * g);
+void reversepathsfromto( GENTRY * from, GENTRY * to);
+void reversepaths( GLYPH * g);
+void dumppaths( GLYPH * g, GENTRY *start, GENTRY *end);
+void print_glyph( int glyphno);
+int print_glyph_subs( int glyphno, int startid);
+void print_glyph_metrics( int code, int glyphno);
+void findblues(void);
+void stemstatistics(void);
+void docorrectwidth(void);
+void addkernpair( unsigned id1, unsigned id2, int unscval);
+void print_kerning( FILE *afm_file);
diff --git a/fonts/utilities/ttf2pt1/runt1asm.c b/fonts/utilities/ttf2pt1/runt1asm.c
new file mode 100644
index 0000000000..58c4cad8c0
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/runt1asm.c
@@ -0,0 +1,61 @@
+/*
+ * Wrap-around code to either compile in t1asm or call it externally
+ *
+ * Copyright (C) 2000 by Sergey Babkin
+ * Copyright (C) 2000 by The TTF2PT1 Project
+ *
+ * See COPYRIGHT for full license
+ */
+
+#ifdef EXTERNAL_T1ASM
+
+#include <stdio.h>
+#include <errno.h>
+
+FILE *ifp;
+FILE *ofp;
+
+int
+runt1asm(
+ int pfbflag
+)
+{
+ char *cmd;
+ int id, od;
+ int error;
+
+ /* first make a copy in case some of then is already stdin/stdout */
+ if(( id = dup(fileno(ifp)) )<0) {
+ perror("** Re-opening input file for t1asm");
+ exit(1);
+ }
+ if(( od = dup(fileno(ofp)) )<0) {
+ perror("** Re-opening output file for t1asm");
+ exit(1);
+ }
+ fclose(ifp); fclose(ofp);
+ close(0);
+ if(( dup(id) )!=0) {
+ perror("** Re-directing input file for t1asm");
+ exit(1);
+ }
+ close(1);
+ if(( dup(od) )!=1) {
+ perror("** Re-directing output file for t1asm");
+ exit(1);
+ }
+ close(id); close(od);
+
+ if(pfbflag)
+ error = execlp("t1asm", "t1asm", "-b", NULL);
+ else
+ error = execlp("t1asm", "t1asm", NULL);
+
+ perror("** Calling t1asm");
+
+ exit(1);
+}
+
+#else
+# include "t1asm.c"
+#endif
diff --git a/fonts/utilities/ttf2pt1/scripts/convert b/fonts/utilities/ttf2pt1/scripts/convert
new file mode 100755
index 0000000000..e22a8c9770
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/convert
@@ -0,0 +1,367 @@
+#!/bin/sh
+#
+# Copyright (c) 1998-2000
+# Sergey A. Babkin. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
+#
+
+# Use : convert [cfgfile]
+
+# Convert TTF fonts from source directory to Type1 fonts in the destination
+# directory, converted to the specified encodings. Also generate the
+# fonts.scale, fonts.dir and fonts.alias files in the destination directory.
+
+# clean some variables so that they won't be inherited from environment
+
+ENCDIR=
+MAPDIR=
+
+# path to the configuration file
+
+if [ $# -eq 1 ]
+then
+ CFGFILE=$1
+else
+ CFGFILE=`pwd`/convert.cfg
+fi
+
+# these setting would be edited during installation
+
+TTF2PT1_BINDIR=
+TTF2PT1_LIBXDIR=
+TTF2PT1_SHAREDIR=
+
+[ -z "$TTF2PT1_BINDIR" ] && {
+ TTF2PT1_BINDIR=`pwd`/..
+}
+[ -z "$TTF2PT1_LIBXDIR" ] && {
+ TTF2PT1_LIBXDIR=`pwd`/..
+}
+[ -z "$TTF2PT1_SHAREDIR" ] && {
+ TTF2PT1_SHAREDIR=`pwd`/..
+}
+
+# directory from where we are started
+
+RUNDIR=`pwd`
+
+# paths to various utilities
+
+T1ASM=$TTF2PT1_LIBXDIR/t1asm
+[ -f $T1ASM -a -x $T1ASM ] || {
+ # if it's not in libxdir, use whatever t1asm the system provides
+ T1ASM=t1asm
+}
+TTF2PT1=$TTF2PT1_BINDIR/ttf2pt1
+TRANS=$TTF2PT1_SHAREDIR/scripts/trans
+T1FDIR=$TTF2PT1_SHAREDIR/scripts/t1fdir
+FORCEISO=$TTF2PT1_SHAREDIR/scripts/forceiso
+X2GS=$TTF2PT1_SHAREDIR/scripts/x2gs
+SUFFIX="pfa"
+
+MYSELF=convert
+
+# include the configuration
+
+if [ -r $CFGFILE ]
+then {
+ . $CFGFILE
+} else {
+ echo "
+Can't find the configuration file
+ $CFGFILE
+Please look at the sample file convert.cfg.sample,
+copy it to convert.cfg and modify for
+you actual configuration." >&2
+ exit 1
+} fi
+
+# path to the directory with descriptions of encodings
+[ -z "$ENCDIR" ] && {
+ ENCDIR=$TTF2PT1_SHAREDIR/encodings
+}
+
+# directory with the external Unicode maps
+[ -z "$MAPDIR" ] && {
+ MAPDIR=$TTF2PT1_SHAREDIR/maps
+}
+
+LOG=$DSTDIR/convert.log
+
+# configure the ttf2pt1 options from our options
+
+# artefact of backwards-compatibility with .cfg
+[ -z "$CORRECTWIDTH" -a YES != "$DONTCORRECTWIDTH" ] && {
+ TTF2PT1="$TTF2PT1 -OW"
+}
+[ YES = "$CORRECTWIDTH" ] && {
+ TTF2PT1="$TTF2PT1 -OW"
+}
+
+[ YES != "$HINTSUBST" ] && {
+ TTF2PT1="$TTF2PT1 -Ou" # meaning changed past 3.22
+}
+
+[ YES = "$ALLGLYPHS" -a YES = "$ENFORCEISO" ] && {
+ echo "$MYSELF: options ALLGLYPHS and ENFORCEISO are mutually exclusive" >&2
+ exit 1
+}
+
+[ YES = "$ALLGLYPHS" ] && {
+ TTF2PT1="$TTF2PT1 -a"
+}
+
+[ YES = "$GENUID" ] && {
+ TTF2PT1="$TTF2PT1 -uA"
+}
+
+[ YES != "$ENFORCEISO" ] && {
+ FORCEISO=cat
+}
+
+[ YES = "$CREATEPFB" ] && {
+ T1ASM="$T1ASM -b"
+ SUFFIX="pfb"
+}
+
+# parse the information about the source files
+
+eval "`echo \"$SRCDIRS\" | awk '
+ BEGIN { n=0; }
+ /^ *$/ { next; }
+ {
+ if(n>9) {
+ printf(\"echo \\\"Only 9 encodings are supported at once!\\\" >&2\n\");
+ printf(\"exit 1\\n\");
+ } else {
+ printf(\"SRCDIR%d=%s\n\",n,$1);
+ printf(\"SRCLANG%d=%s\n\",n,$2);
+ printf(\"SRCENC%d=%s\n\",n,$3);
+ printf(\"SRCMAP%d=%s\n\",n,$4);
+ n++;
+ }
+ }'`"
+
+# check whether we have the directories
+
+mkdir $DSTDIR 2>/dev/null >/dev/null
+[ -d $DSTDIR -a -r $DSTDIR -a -w $DSTDIR -a -x $DSTDIR ] || {
+ echo "$MYSELF: can't access the directory $DSTDIR" >&2
+ exit 1
+}
+
+# go to our destination directory
+
+cd $DSTDIR || {
+ echo "$MYSELF: can't chdir to $DSTDIR" >&2
+ exit 1
+}
+
+rm -f ./* 2>/dev/null
+>$LOG
+
+for dirno in 0 1 2 3 4 5 6 7 8 9
+do {
+
+ SRCDIR=`eval "echo \\\$SRCDIR$dirno"`
+ SRCLANG=`eval "echo \\\$SRCLANG$dirno"`
+ SRCENC=`eval "echo \\\$SRCENC$dirno"`
+ SRCMAP=`eval "echo \\\$SRCMAP$dirno"`
+ DSTENC=`eval "echo \\\$DSTENC$SRCLANG"`
+
+ echo $SRCDIR
+ echo $SRCENC
+
+ [ -z "$SRCDIR" ] && break;
+
+ [ "`ls $SRCDIR/*.[tT][tT][fF] 2>/dev/null |wc -l`" -gt 0 ] || {
+ echo "$MYSELF: no TTF files in $SRCDIR" >&2
+ exit 1
+ }
+
+ # check whether we have the encoding tables
+
+ [ -n "$SRCENC" ] || {
+ echo "$MYSELF: you must specify some source encoding" >&2
+ exit 1
+ }
+
+ [ unknown = "$SRCLANG" -o -n "$DSTENC" ] || {
+ echo "$MYSELF: you must specify some destination encodings" >&2
+ exit 1
+ }
+
+ # handle aliases of the destination encodings
+
+ XDSTENC=
+ DSTALIAS=
+
+ [ -r $ENCDIR/$SRCLANG/encodings.alias ] && {
+ for i in $DSTENC
+ do {
+ TO=`awk '$1=="'$i'" { print $2; }' <$ENCDIR/$SRCLANG/encodings.alias`
+ if [ -n "$TO" ]
+ then {
+ [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] && {
+ echo "WARNING: $SRCLANG encoding $i found as both table and alias" >&2
+ echo "WARNING: The alias takes precedence" >&2
+ }
+ DSTALIAS="$TO $i
+$DSTALIAS"
+ XDSTENC="$TO
+$XDSTENC"
+ } else {
+ XDSTENC="$i
+$XDSTENC"
+ } fi
+ } done
+ DSTENC=`echo "$XDSTENC" | sort -u | tr '
+' ' '`
+ }
+
+ [ unknown != "$SRCLANG" ] && {
+ for i in $SRCENC $DSTENC
+ do {
+ [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] || {
+ echo "$MYSELF: can't read $ENCDIR/$SRCLANG/$i.tbl" >&2
+ exit 1
+ }
+ } done
+ }
+
+ # OK convert the files
+
+ for file in $SRCDIR/*.[tT][tT][fF]
+ do {
+ name=`echo $file | tr A-Z a-z`
+ name=`basename $name .ttf`
+
+ echo "Converting $name"
+
+ # generate the assembler code
+
+ echo "******* $name -> t1a ************" >>$LOG
+
+ if [ -n "$SRCMAP" ]
+ then {
+ $TTF2PT1 -L $MAPDIR/$SRCMAP $file ./$name.$SRCENC 2>>$LOG
+ } else {
+ $TTF2PT1 -l $SRCLANG $file ./$name.$SRCENC 2>>$LOG
+ } fi
+
+ [ -s ./$name.$SRCENC.t1a ] || {
+ echo "$MYSELF: can't generate Type1 assembler code for $name" >&2
+ continue;
+ }
+
+ [ -s ./$name.$SRCENC.afm ] || {
+ echo "$MYSELF: can't generate AFM metrics file for $name" >&2
+ continue;
+ }
+
+ mv ./$name.$SRCENC.afm ./$name.$SRCENC.xafm
+
+ psname=`$T1FDIR -g $FOUNDRY " " -f ./$name.$SRCENC.t1a \
+ | awk '{print substr($1,2);}'`
+
+ # now for each destination encoding generate a .pfa/b file
+ # and record for fonts.scale
+
+ if [ unknown != "$SRCLANG" ]
+ then {
+ for enc in $DSTENC
+ do {
+ echo "******* $name -> $enc ************" >>$LOG
+
+ sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \
+ | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
+ | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
+ [ -s ./$name.$enc.$SUFFIX ] || {
+ echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
+ continue;
+ }
+
+ sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
+ | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
+ | uniq | $FORCEISO >./$name.$enc.afm
+ [ -s ./$name.$enc.afm ] || {
+ echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
+ }
+
+ aliases=`echo "$DSTALIAS" | grep "^$enc" | cut -d\ -f2`
+ echo "******* aliases: $aliases" >>$LOG
+
+ $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc $aliases -f ./$name.$enc.$SUFFIX
+ echo "$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf
+ } done
+ } else {
+ enc="$SRCENC"
+ echo "******* $name -> $enc ************" >>$LOG
+
+ sed 's|^\/FontName.*$|/FontName '$psname$enc' def|' <./$name.$SRCENC.t1a \
+ | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
+ [ -s ./$name.$enc.$SUFFIX ] || {
+ echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
+ continue;
+ }
+
+ sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
+ | uniq | $FORCEISO >./$name.$enc.afm
+ [ -s ./$name.$enc.afm ] || {
+ echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
+ }
+
+ $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc -f ./$name.$enc.$SUFFIX
+ echo "$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf
+ } fi
+
+ [ YES = "$REMOVET1A" ] && {
+ rm -f ./$name.$SRCENC.t1a
+ rm -f ./$name.$SRCENC.xafm
+ }
+
+ } done
+} done
+
+wc -l <fonts.ttf >fonts.scale
+cat fonts.ttf >>fonts.scale
+mkfontdir
+
+[ YES = "$GENUID" ] && {
+ echo "Checking for duplicate UniqueIDs..."
+ for id in `find . -name "*.$SUFFIX" -exec grep UniqueID {} \; \
+ | cut -d" " -f2 | sort | uniq -d`
+ do {
+ echo "Warning: duplicate UniqueID $id in files:" | tee -a $LOG
+ find . -name "*.$SUFFIX" -exec grep -l "UniqueID $id " {} \; 2>&1 | tee -a $LOG
+ } done
+}
+
+[ -n "$GSDIR" ] || {
+ echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2
+ echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2
+ echo "$MYSELF: You can do it later by running x2gs\n" >&2
+ exit 0
+}
+
+echo "Installing the Ghostscript fonts"
+cd $RUNDIR
+$X2GS $CFGFILE || {
+ echo "$MYSELF: Installation of the Ghostscript fonts has failed.\n" >&2
+ echo "$MYSELF: You can correct the problem and run x2gs to repeat\n" >&2
+ exit 0
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/convert.cfg.sample b/fonts/utilities/ttf2pt1/scripts/convert.cfg.sample
new file mode 100755
index 0000000000..8db6ea115b
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/convert.cfg.sample
@@ -0,0 +1,194 @@
+#!/bin/sh
+#
+# Copyright (c) 1998, 1999
+# Sergey A. Babkin. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
+#
+
+# Configuration file for the conversion script.
+# Convert TTF fonts from source directory to Type1 fonts in the destination
+# directory, converted to the specified encodings. Also generate the
+# fonts.scale, fonts.dir and fonts.alias files in the destination
+# directory.
+
+# This file is an example of configuration. It contains
+# the examples of settings for all the supported languages.
+# Please check the settings and change them for
+# your needs.
+
+# The directories with source TTF files.
+# The lines are formatted in 3 columns:
+# - directory path
+# - language name
+# - encoding of the fonts in this directory
+# - optional Unicode map file name
+# There should be a separate directory for each input encoding.
+# No more than 10 encodings are supported now for
+# one conversion.
+#
+# If the Unicode map file name is specified then this
+# external map file will be used to encode the resulting
+# font. Otherwise the built-in table for this language
+# will be used. If you have some special encoding map that
+# does not conform to any of the defined languages, set the
+# language name to 'unknown' and encoding name to whatever
+# you want to see in the X11 logical font description.
+#
+# NOTES:
+# For Russian, Bulgarian and English (as a subset of
+# Western) languages you may pile together the Unicode
+# fonts and the fonts in the Windows encoding into the same
+# directory, they will be sorted out automatically. For
+# the Russian and Bulgarian Unicode fonts set the
+# source encoding to ibm-1251.
+#
+# For Turkish, Baltic, Central European and other Western
+# European languages the resulting fonts will be in
+# a proper iso8859 encoding only if the source fonts
+# are in Unicode.
+#
+# AdobeStd encoding will work only
+# for the source font in Unicode encoding which
+# either have proper character names or map the
+# Adobe character extensions to the expected codes
+# (or both).
+#
+# The external maps work only if the source fonts
+# are in Unicode, otherwise the original font's
+# encoding will be preserved.
+#
+# Better don't use the map adobe-standard-encoding.map,
+# unless you really need it, it's very incomplete.
+#
+# The map planes are not supported in the scripts yet.
+
+SRCDIRS="
+/SOME_DIR_WITH_russian_windows_TTF_FONTS russian ibm-1251
+/SOME_DIR_WITH_russian_koi_TTF_FONTS russian koi8-r
+/SOME_DIR_WITH_bulgarian_windows_TTF_FONTS bulgarian ibm-1251
+/SOME_DIR_WITH_unicode_TTF_FONTS latin4 iso8859-4
+/SOME_DIR_WITH_unicode_TTF_FONTS latin5 iso8859-9
+/SOME_DIR_WITH_unicode_TTF_FONTS latin2 iso8859-2
+/SOME_DIR_WITH_western_TTF_FONTS latin1 iso8859-1
+/SOME_DIR_WITH_unicode_TTF_FONTS adobestd adobe-std
+/SOME_DIR_WITH_weird_unicode_TTF_FONTS adobestd adobe-std adobe-standard-encoding.map
+/SOME_DIR_WITH_unicode_TTF_FONTS unknown my-special some-very-special.map
+"
+
+# the directory for converted X11 fonts
+DSTDIR=/usr/X11R6/lib/X11/fonts/fromttf
+
+# The base directory of Ghostscript;
+# set it to empty space if you don't want the Ghostscript fonts installed.
+# For some systems the directory is /usr/share/ghostscript.
+GSDIR=/usr/local/share/ghostscript
+
+# The font directory of Ghostscript;
+# should work for all the versions of Ghostscript. Except (as always) the one
+# packaged with Red Hat Linux 6.0. For RH6.0 it should be set to either
+# /usr/share/fonts/default/ghostscript or /usr/share/fonts/default/Type1.
+GSFONTDIR=$GSDIR/fonts
+
+# The configuration directory of Ghostscript where the Fontmap file is stored;
+# the example is for Ghostscript 6.0, change for the version you actually
+# have. This directory is used only to reach the Fontmap file, so if your
+# installation stores the Fontmap files in the same directory as fonts
+# (like Debian Linux does - isn't Linux wonderful in its differences?)
+# then set it to the same value as GSFONTDIR.
+GSCONFDIR=$GSDIR/6.0
+
+# The encodings of generated files by languages
+# (see the whole list of possible encodings for each
+# language in the directories encoding/<language> )
+#
+# Here prefer windows-1251 over ibm-1251: it aliases
+# to the same thing but is the name expected by
+# Netscape Navigator. For the same reason prefer
+# cp-866 over ibm-866.
+
+DSTENCrussian="koi8-r windows-1251 iso8859-1"
+DSTENCbulgarian="koi8-r windows-1251 iso8859-1"
+DSTENClatin1="iso8859-1"
+DSTENClatin2="iso8859-2"
+DSTENClatin4="iso8859-4"
+DSTENClatin5="iso8859-9"
+DSTENCadobestd="adobe-std"
+
+# name of foundry for generated fonts
+# (for HP-UX or if you just want to use an
+# honest name change to "misc")
+FOUNDRY=fromttf
+
+# If you want to use non-standard directories with encoding
+# maps and tables then set these values
+
+MAPDIR=
+ENCDIR=
+
+# Options:
+# set the value to YES to enable, NO (or anything else) to disable
+
+# CORRECTWIDTH - use the option "-w" of converter. Set this
+# option to NO if your fonts are well-designed. At least some
+# freeware fonts have the width metrics broken and the letters
+# look smashed into each other. If this option is set to "YES"
+# the converter tries to correct this defect but this may have slight
+# side effects on the well-designed fonts: the characters that
+# are designed to be close to each other will get wider spacing.
+# REMOVET1A - remove the un-encoded .t1a files after they are converted
+# and assembled if this option set to YES
+# INSTALLFONTMAP - if set to YES install the entries for the converted
+# fonts right into the Ghostscript Fontmap file. Otherwise just
+# symlink the font files and copy Fontmap.ttf to the Ghostscript
+# directories.
+# HINTSUBST - enable the hint substitution (option "-H" of
+# converter). You may want to compare the looks of the fonts with and
+# without this option and decide what is better (see the discussion in
+# the README file). If the fonts with this option set to YES look
+# completely empty in X11 then set this option to NO or install
+# the supplied patches.
+# ENFORCEISO - try to disguise the character names according to
+# the ISOLatin1 encoding table. Set it to YES if some program
+# expects strictly the ISO names but the fonts have different
+# character names (this is not the case for X11 any more).
+# Options ENFORCEISO and ALLGLYPHS can't be both set to YES.
+# ALLGLYPHS - include all the glyphs (characters) from the source
+# fonts into the resulting fonts, even if those are not
+# included into the encoding tables. If the supplied X11
+# patches are not installed this may cause font size overflow
+# in X11. So if you are not sure better leave it as NO.
+# For more details see the discussion of the option "-a".
+# GENUID - automatically generate UniqueID for all the fonts.
+# Setting it to YES may be useful only for the fonts to
+# be loaded the fonts into a printer with hard disk. Be
+# advised that although unlikely the generated UniqueIDs
+# for two fonts may coincide, then the consequences will
+# be unpredictable.
+# CREATEPFB - if set to YES create .pfb font files, otherwise
+# .pfa font files. The .pfb files take somewhat less disk
+# space but contain 8-bit binary data.
+
+CORRECTWIDTH=YES
+REMOVET1A=YES
+INSTALLFONTMAP=YES
+HINTSUBST=NO
+ENFORCEISO=NO
+ALLGLYPHS=NO
+GENUID=NO
+CREATEPFB=YES
+
+# End of the configuration file
diff --git a/fonts/utilities/ttf2pt1/scripts/forceiso b/fonts/utilities/ttf2pt1/scripts/forceiso
new file mode 100755
index 0000000000..362b679845
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/forceiso
@@ -0,0 +1,428 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 1998
+# Sergey A. Babkin. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
+#
+
+#
+# Force the font to use the encoding as close to ISO Latin-1 as possible
+#
+
+%latin1=(
+ 0, "_0",
+ 1, "_1",
+ 2, "_2",
+ 3, "_3",
+ 4, "_4",
+ 5, "_5",
+ 6, "_6",
+ 7, "_7",
+ 8, "_8",
+ 9, "_9",
+ 10, "_10",
+ 11, "_11",
+ 12, "_12",
+ 13, "_13",
+ 14, "_14",
+ 15, "_15",
+ 16, "_16",
+ 17, "_17",
+ 18, "_18",
+ 19, "_19",
+ 20, "_20",
+ 21, "_21",
+ 22, "_22",
+ 23, "_23",
+ 24, "_24",
+ 25, "_25",
+ 26, "_26",
+ 27, "_27",
+ 28, "_28",
+ 29, "_29",
+ 30, "_30",
+ 31, "_31",
+ 32, "space",
+ 33, "exclam",
+ 34, "quotedbl",
+ 35, "numbersign",
+ 36, "dollar",
+ 37, "percent",
+ 38, "ampersand",
+ 39, "quoteright",
+ 40, "parenleft",
+ 41, "parenright",
+ 42, "asterisk",
+ 43, "plus",
+ 44, "comma",
+ 45, "minus",
+ 46, "period",
+ 47, "slash",
+ 48, "zero",
+ 49, "one",
+ 50, "two",
+ 51, "three",
+ 52, "four",
+ 53, "five",
+ 54, "six",
+ 55, "seven",
+ 56, "eight",
+ 57, "nine",
+ 58, "colon",
+ 59, "semicolon",
+ 60, "less",
+ 61, "equal",
+ 62, "greater",
+ 63, "question",
+ 64, "at",
+ 65, "A",
+ 66, "B",
+ 67, "C",
+ 68, "D",
+ 69, "E",
+ 70, "F",
+ 71, "G",
+ 72, "H",
+ 73, "I",
+ 74, "J",
+ 75, "K",
+ 76, "L",
+ 77, "M",
+ 78, "N",
+ 79, "O",
+ 80, "P",
+ 81, "Q",
+ 82, "R",
+ 83, "S",
+ 84, "T",
+ 85, "U",
+ 86, "V",
+ 87, "W",
+ 88, "X",
+ 89, "Y",
+ 90, "Z",
+ 91, "bracketleft",
+ 92, "backslash",
+ 93, "bracketright",
+ 94, "asciicircum",
+ 95, "underscore",
+ 96, "quoteleft",
+ 97, "a",
+ 98, "b",
+ 99, "c",
+ 100, "d",
+ 101, "e",
+ 102, "f",
+ 103, "g",
+ 104, "h",
+ 105, "i",
+ 106, "j",
+ 107, "k",
+ 108, "l",
+ 109, "m",
+ 110, "n",
+ 111, "o",
+ 112, "p",
+ 113, "q",
+ 114, "r",
+ 115, "s",
+ 116, "t",
+ 117, "u",
+ 118, "v",
+ 119, "w",
+ 120, "x",
+ 121, "y",
+ 122, "z",
+ 123, "braceleft",
+ 124, "bar",
+ 125, "braceright",
+ 126, "asciitilde",
+ 127, "_127",
+ 128, "_128",
+ 129, "_129",
+ 130, "_130",
+ 131, "_131",
+ 132, "_132",
+ 133, "_133",
+ 134, "_134",
+ 135, "_135",
+ 136, "_136",
+ 137, "_137",
+ 138, "_138",
+ 139, "_139",
+ 140, "_140",
+ 141, "_141",
+ 142, "_142",
+ 143, "_143",
+ 144, "_144",
+ 145, "_145",
+ 146, "_146",
+ 147, "_147",
+ 148, "_148",
+ 149, "_149",
+ 150, "_150",
+ 151, "_151",
+ 152, "_152",
+ 153, "_153",
+ 154, "_154",
+ 155, "_155",
+ 156, "_156",
+ 157, "_157",
+ 158, "_158",
+ 159, "_159",
+ 160, "_160",
+ 161, "exclamdown",
+ 162, "cent",
+ 163, "sterling",
+ 164, "currency",
+ 165, "yen",
+ 166, "brokenbar",
+ 167, "section",
+ 168, "dieresis",
+ 169, "copyright",
+ 170, "ordfeminine",
+ 171, "guillemotleft",
+ 172, "logicalnot",
+ 173, "hyphen",
+ 174, "registered",
+ 175, "macron",
+ 176, "degree",
+ 177, "plusminus",
+ 178, "twosuperior",
+ 179, "threesuperior",
+ 180, "acute",
+ 181, "mu",
+ 182, "paragraph",
+ 183, "periodcentered",
+ 184, "cedilla",
+ 185, "onesuperior",
+ 186, "ordmasculine",
+ 187, "guillemotright",
+ 188, "onequarter",
+ 189, "onehalf",
+ 190, "threequarters",
+ 191, "questiondown",
+ 192, "Agrave",
+ 193, "Aacute",
+ 194, "Acircumflex",
+ 195, "Atilde",
+ 196, "Adieresis",
+ 197, "Aring",
+ 198, "AE",
+ 199, "Ccedilla",
+ 200, "Egrave",
+ 201, "Eacute",
+ 202, "Ecircumflex",
+ 203, "Edieresis",
+ 204, "Igrave",
+ 205, "Iacute",
+ 206, "Icircumflex",
+ 207, "Idieresis",
+ 208, "Eth",
+ 209, "Ntilde",
+ 210, "Ograve",
+ 211, "Oacute",
+ 212, "Ocircumflex",
+ 213, "Otilde",
+ 214, "Odieresis",
+ 215, "multiply",
+ 216, "Oslash",
+ 217, "Ugrave",
+ 218, "Uacute",
+ 219, "Ucircumflex",
+ 220, "Udieresis",
+ 221, "Yacute",
+ 222, "Thorn",
+ 223, "germandbls",
+ 224, "agrave",
+ 225, "aacute",
+ 226, "acircumflex",
+ 227, "atilde",
+ 228, "adieresis",
+ 229, "aring",
+ 230, "ae",
+ 231, "ccedilla",
+ 232, "egrave",
+ 233, "eacute",
+ 234, "ecircumflex",
+ 235, "edieresis",
+ 236, "igrave",
+ 237, "iacute",
+ 238, "icircumflex",
+ 239, "idieresis",
+ 240, "eth",
+ 241, "ntilde",
+ 242, "ograve",
+ 243, "oacute",
+ 244, "ocircumflex",
+ 245, "otilde",
+ 246, "odieresis",
+ 247, "divide",
+ 248, "oslash",
+ 249, "ugrave",
+ 250, "uacute",
+ 251, "ucircumflex",
+ 252, "udieresis",
+ 253, "yacute",
+ 254, "thorn",
+ 255, "ydieresis"
+);
+
+while(<STDIN>) {
+ print $_;
+ if(/^\/Encoding\s+.*\s+array/) {
+ $fontfile=1;
+ last;
+ }
+ if(/^StartCharMetrics\s+/) {
+ $fontfile=0;
+ last;
+ }
+}
+
+$ndups=0;
+
+if($fontfile) { # .t1a file
+ while(<STDIN>) {
+ if($_ !~ /^dup\s+(\d+)\s+\/(\S+)\s+put/) {
+ print $_;
+ last;
+ }
+ $code=$1+0;
+ $name=$2;
+ if($name eq ".notdef") {
+ print $_;
+ } else {
+ printf("dup %d /%s put\n",$code,$latin1{$code});
+ if($trans{$name}) { # two or more references to the same glyph
+ $ndups++;
+ #printf(STDERR "forceiso: %d dups\n", $ndups);
+ if($copies{$name} eq "") {
+ $copies{$name} = $latin1{$code};
+ } else {
+ $copies{$name} .= "|" . $latin1{$code};
+ }
+ } else {
+ $trans{$name}=$latin1{$code};
+ }
+ }
+
+ }
+
+ while(<STDIN>) {
+ if( /\/CharStrings\s+(\d+)\s/) {
+ $nchars=$1+$ndups;
+ #printf(STDERR "forceiso: %d dups %d chars\n", $ndups, $nchars);
+ $_ =~ s|/CharStrings\s+\d+\s|/CharStrings $nchars |;
+ print $_;
+ last;
+ }
+ print $_;
+ }
+
+ while(<STDIN>) {
+ if(/^\/(\S+)/) {
+ $name=$1;
+ $to=$trans{$name};
+
+ $header=$_;
+ $body="";
+
+ if($to ne "") {
+ $_ =~ s/^\/\S+/\/$to/;
+ }
+ print $_;
+ } elsif(/endchar/) {
+ print $_;
+ if($copies{$name}) {
+ for $to (split(/\|/,$copies{$name})) {
+ $header =~ s/^\/\S+/\/$to/;
+ print($header, $body, $_);
+ }
+ }
+ } else {
+ print $_;
+ $body .= $_;
+ }
+ }
+} else { # .afm file
+ while(<STDIN>) {
+ if($_ !~ /^C\s+(\d+)(\s*;.*N\s+)(\S+)(\s*;.*)\n/) {
+ print $_;
+ last;
+ }
+ $code=$1+0;
+ $name=$3;
+ $part2=$2;
+ $part4=$4;
+ if($name eq ".notdef") {
+ print $_;
+ } else {
+ printf("C %d%s%s%s\n",$code,$part2,$latin1{$code},$part4);
+ if($copies{$name} eq "") {
+ $copies{$name} = $latin1{$code};
+ } else {
+ $copies{$name} .= "|" . $latin1{$code};
+ $ndups++;
+ #printf(STDERR "forceiso: %d dups\n", $ndups);
+ }
+ }
+
+ }
+
+ while(<STDIN>) {
+ if(/^StartKernPairs\s+(\d+)/) {
+ last;
+ }
+ print $_;
+ }
+
+ $npairs=0;
+ $kps="";
+ while(<STDIN>) {
+ if(/^KPX\s+(\S+)\s+(\S+)\s+(.*)\n/) {
+ $name1=$1;
+ $name2=$2;
+ $metric=$3;
+
+ $cp1=$copies{$name1};
+ if($cp1 eq "") {
+ $cp1=$name1;
+ }
+
+ $cp2=$copies{$name2};
+ if($cp2 eq "") {
+ $cp2=$name2;
+ }
+
+ for $to1 (split(/\|/,$cp1)) {
+ for $to2 (split(/\|/,$cp2)) {
+ $kps .= sprintf("KPX %s %s %s\n", $to1, $to2, $metric);
+ $npairs++;
+ }
+ }
+ } else {
+ if($npairs!=0) {
+ printf("StartKernPairs %d\n", $npairs);
+ printf("%s", $kps);
+ $npairs=0;
+ $kps="";
+ }
+ print $_;
+ }
+ }
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/frommap b/fonts/utilities/ttf2pt1/scripts/frommap
new file mode 100755
index 0000000000..f32280c2e5
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/frommap
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+#
+# A script to convert a Unicode character map to
+# the C code
+#
+
+sub fromhex
+{
+ return eval "0x".$_[0];
+}
+
+$inmap=0;
+
+while(<>)
+{
+ if(/^CHARMAP/) {
+ $inmap=1;
+ } elsif(/^END CHARMAP/) {
+ $inmap=0;
+ } elsif($inmap
+ && /^\s*\S+\s+\/x([0-9a-fA-F][0-9a-fA-F])\s+\<U([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])/) {
+ $map[fromhex($1)]=fromhex($2);
+ }
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/html2man b/fonts/utilities/ttf2pt1/scripts/html2man
new file mode 100755
index 0000000000..ea90dff1ac
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/html2man
@@ -0,0 +1,231 @@
+#!/usr/bin/perl
+#
+# See COPYRIGHT
+#
+# Script to generate a pod file from an html source (the same one as for text files too)
+# and later this pod file it passed through pod2man
+#
+# Use:
+# html2man [ <man-dir> [<version-dir>] ] <file.html
+#
+# <Man-dir> is the directory where the man pages will be created
+# (current directory by default). If a file name is given instead of
+# directory then the directory of that file is used.
+# <Version-dir> is the directory containing the ttf2pt1 files version.h
+# and CHANGES.html which are used to generate the release name and date
+# for the man page (by default looks in current directory and then in up to
+# 5 ancestor directories).
+# If the version files can not be found then the release defaults to
+# "current" and the date defaults to today.
+#
+# Special formatting in the html file is:
+# All controls are hidden within HTML comments that must occupy a whole separate line
+# Such a line looks like:
+# <!-- =<html2man_directive> <arguments> >
+# <!-- ==<pod_directive> <arguments> >
+# Any sort of directive must be followed by a space. The pod directives are
+# automatically surrounded by empty lines in the output file.
+# The html2man directives are:
+#
+# <!-- =defdoc <docid> <file> <section> >
+# Define a man page. Multiple man pages can be defined in the same HTML
+# file. <Docid> is a short name by which this man page will be referred in the
+# other directives. <File> is the name of the man page, and <section> is the
+# section of the manual (do not confuse with sections within a man page).
+#
+# <!-- =section <docid> <page_section_name> >
+# All the text following this directive is copied (with translation)
+# into the specified section of the specified man page. The sections
+# may appear in arbitrary order, they will be rearranged to the standard
+# order before output. Only standard section names are permitted (see @stdsect
+# below). The pod directives which occur outside of man sections are ignored,
+# just like the common text. The translation of HTML tags is:
+#
+# <br> - to paragraph break
+# <b> - to B<>
+# <i> - to I<>
+# <tt> - to C<>
+# <a href> - to F<>
+# <ul>, <li>, </ul> - to =over 2, =item *, =back
+# &nbsp;, &amp;, &lt;, &gt - to their symbols, appropriately encoded
+#
+# The rest of HTML tags is removed
+#
+# If the same section is started more than once, the text from the
+# second appearance will be added to the first, etc.
+#
+# <!-- =stop >
+# Stop copying text to the man page.
+#
+# <!-- =cont >
+# Continue copying text to the man page, same section as before.
+#
+# <!-- =text <text> >
+# Insert this <text> into the man page (works only when copying is enabled).
+# Characters &lt;, &gt;, &amp; are converted as usual.
+
+@mons = qw(January February March April May June July August September October November December);
+
+$dir = $ARGV[0];
+$maindir = $ARGV[1];
+
+if($dir eq "") {
+ $dir = ".";
+} elsif( ! -d $dir ) {
+ if( ! ($dir =~ s|\/[^/]*$||) ) {
+ $dir = ".";
+ }
+}
+if($maindir eq "") {
+ $maindir = ".";
+ for($i=0; $i<5; $i++) {
+ if(-f "$maindir/version.h") {
+ last;
+ }
+ $maindir = "../$maindir";
+ }
+}
+
+if( open(VERFILE, "<$maindir/version.h") ) {
+ while(<VERFILE>) {
+ if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) {
+ $release = "version $1";
+ }
+ }
+ close(VERFILE);
+ if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) {
+ $date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1);
+ } elsif( open(CFILE, "<$maindir/CHANGES.html") ) {
+ while(<CFILE>) {
+ if( /\<H4\>/) {
+ last;
+ }
+ }
+ $_ = <CFILE>;
+ chomp;
+ if( $_ =~ s/^.*?-- // ) {
+ $date = $_;
+ }
+ close(CFILE);
+ }
+}
+
+if($release eq "") {
+ $release = "current";
+}
+if($date eq "") {
+ @lt = localtime(time);
+ $date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]);
+}
+
+#printf(STDERR "date=%s release=%s\n", $date, $release);
+
+$writemode = 0;
+
+while(<STDIN>) {
+ if( s/^\<\!\-\- \=(\S+)\s+//) {
+ $cmd = $1;
+ s/\s*\>\s*$//;
+ #printf(STDERR "cmd=%s args=%s\n", $cmd, $_);
+ if($cmd =~ /^=/) {
+ if($writemode) {
+ $text{$tosect} .= "\n\n$cmd $_\n\n";
+ }
+ } elsif($cmd eq "defdoc") {
+ @sl = split;
+ push(@allids, $sl[0]);
+ $file{$sl[0]} = $sl[1];
+ $mansect{$sl[0]} = $sl[2];
+ } elsif($cmd eq "section") {
+ # tosect includes the file id
+ $tosect = $_;
+ $text{$tosect} .= "\n\n";
+ $writemode = 1;
+ } elsif($cmd eq "stop") {
+ $writemode = 0;
+ $text{$tosect} .= "\n";
+ } elsif($cmd eq "cont") {
+ $writemode = 1;
+ } elsif($cmd eq "text") {
+ if($writemode) {
+ s/\&lt\;/</gi;
+ s/\&gt\;/>/gi;
+ s/\&amp\;/\&/gi;
+ $text{$tosect} .= "$_\n";
+ }
+ }
+ } elsif($writemode) {
+ s/^\s+//;
+
+ s/\{/\&lbr;/g;
+ s/\}/\&rbr;/g;
+
+ s/\<br\>/\n\n/gi;
+ #s/\<blockquote\>/\n\n=over 4\n\n/gi;
+ #s/\<\/blockquote\>/\n\n=back\n\n/gi;
+ s/\<ul\>/\n\n=over 4\n\n/gi;
+ s/\<\/ul\>/\n\n=back\n\n/gi;
+ s/\<li\>\s*/\n\n=item \*\n\n/gi;
+ s/\<i\>(.*?)\<\/i\>/I\{\1\}/gi;
+ s/\<b\>(.*?)\<\/b\>/B\{\1\}/gi;
+ s/\<tt\>(.*?)\<\/tt\>/C\{\1\}/gi;
+ s/\<a href\=\.*?\>(.*?)\<\/a\>/F\{\1\}/gi;
+ s/\<.*?\>//g;
+ s/\{/\</g;
+ s/\}/\>/g;
+
+ s/\&nbsp\;/S< >/gi;
+ s/\&amp\;/\&/gi;
+ s/\&lt\;/E<lt>/gi;
+ s/\&gt\;/E<gt>/gi;
+ #s/\|/E<verbar>/g;
+ #s/\//E<sol>/g;
+ s/\&lbr\;/\{/g;
+ s/\&rbr\;/\}/g;
+
+ #printf(STDERR "section=%s add=%s", $tosect, $_);
+ $text{$tosect} .= $_;
+ }
+}
+
+@stdsect = (
+ "NAME",
+ "SYNOPSIS",
+ "DESCRIPTION",
+ "OPTIONS",
+ "RETURN VALUE",
+ "ERRORS",
+ "EXAMPLES",
+ "ENVIRONMENT",
+ "FILES",
+ "SEE ALSO",
+ "NOTES",
+ "CAVEATS",
+ "DIAGNOSTICS",
+ "BUGS",
+ "RESTRICTIONS",
+ "AUTHOR",
+ "HISTORY" );
+
+#printf(STDERR "allids= @allids\n");
+for $id (@allids) {
+ #print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n");
+ die "Unable to create pod file $dir/$file{$id}.pod"
+ unless open(PODF, ">$dir/$file{$id}.pod");
+ print(PODF "=pod\n\n");
+ for $sect (@stdsect) {
+ $sid = "$id $sect";
+ #printf(STDERR "trying %s\n", $sid);
+ if(defined $text{$sid}) {
+ print(PODF "=head1 $sect\n\n$text{$sid}\n\n");
+ }
+ }
+ print(PODF "=cut\n");
+ close(PODF);
+ die "Unable to generate the man page $dir/$file{$id}.1"
+ if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" "
+ . "--center=\"TTF2PT1 Font Converter\" --date=\"$date\" "
+ . "$dir/$file{$id}.pod >$dir/$file{$id}.1");
+
+ unlink("$dir/$file{$id}.pod");
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/inst_dir b/fonts/utilities/ttf2pt1/scripts/inst_dir
new file mode 100755
index 0000000000..7bc10f4c7a
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/inst_dir
@@ -0,0 +1,43 @@
+#!/usr/bin/perl
+#
+# Script to create a directory for installation
+#
+# (c) 2000 by The TTF2PT1 Project
+# See COPYRIGHT for full license
+#
+
+if( $#ARGV!=0 && $#ARGV !=3) {
+ die "Use: $0 dir-name [owner group mode]\n"
+}
+
+if( $#ARGV==3 ) {
+ $owner = $ARGV[1];
+ $group = $ARGV[2];
+ eval "\$mode = 0$ARGV[3];";
+} else {
+ $owner = "root";
+ $group = "bin";
+ $mode = 0755;
+}
+
+@sl = split(/\//, $ARGV[0]);
+$prefix = shift(@sl);
+if($prefix eq "") {
+ $prefix = "/" . shift(@sl);
+}
+
+while(1) {
+ if( ! -d "$prefix" ) {
+ die "Unable to create directory $prefix:\n$!\n"
+ unless mkdir($prefix, $mode);
+ die "Unable to change owner of $prefix to $owner\n"
+ if system("chown $owner $prefix");
+ die "Unable to change group of $prefix to $group\n"
+ if system("chgrp $group $prefix");
+ }
+ if($#sl < 0) {
+ last;
+ }
+ $prefix .= "/" . shift(@sl);
+}
+exit(0);
diff --git a/fonts/utilities/ttf2pt1/scripts/inst_file b/fonts/utilities/ttf2pt1/scripts/inst_file
new file mode 100755
index 0000000000..d3758671d9
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/inst_file
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# Script to install a file (for portability reasons)
+#
+# (c) 2000 by The TTF2PT1 Project
+# See COPYRIGHT for full license
+#
+
+[ $# != 5 ] && {
+ echo "Use: $0 file-from file-to owner group mode" >&2
+ exit 1
+}
+
+cp -f $1 $2 \
+&& chown $3 $2 \
+&& chgrp $4 $2 \
+&& chmod 0$5 $2
diff --git a/fonts/utilities/ttf2pt1/scripts/mkrel b/fonts/utilities/ttf2pt1/scripts/mkrel
new file mode 100755
index 0000000000..e4ac93debf
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/mkrel
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# See COPYRIGHT
+#
+# Script to create a release or shapshot archive.
+# Also checks for very basic inconsistences.
+# Expects that it would be run from the current directory of ttf2pt1,
+# and that the parent directory is the place to create archives.
+# Expects that the CVS environment variables are set properly.
+
+VER=`grep TTF2PT1_VERSION version.h | cut -d\" -f2`
+
+case "$1" in
+snapshot)
+ echo "$VER" | egrep '^[0-9][0-9]*\.[0-9].*-CURRENT$' || {
+ echo "mkrel: version.h must contain *-CURRENT to create a snapshot" >&2
+ exit 1
+ }
+ grep "^current$" CHANGES.html >/dev/null || {
+ echo "mkrel: CHANGES.html must list 'current' to create a snapshot" >&2
+ exit 1
+ }
+ snapdate=`date "+ %y %m %d " | sed 's/ \([0-9]\) / 0& /g;s/ //g'`
+ NEWVER=`echo "$VER" | sed "s/-CURRENT/-SNAP-$snapdate/"`
+ TAG="-D tomorrow"
+ ;;
+release)
+ echo "$VER" | egrep '^[0-9][0-9]*\.[0-9][.0-9]*$' || {
+ echo "mkrel: version.h must not be -CURRENT to create a release" >&2
+ exit 1
+ }
+ grep "^$VER -- " CHANGES.html >/dev/null || {
+ echo "mkrel: CHANGES.html must list the same version as version.h" >&2
+ exit 1
+ }
+ NEWVER="$VER"
+ TAG=`echo "-r ttf2pt1-$VER" | sed \
+ 's/\(-[0-9][0-9]*\.[0-9]\)$/&.0/;s/\./-/g'`
+ ;;
+*)
+ echo "use: mkrel [snapshot|release]" >&2
+ exit 1
+ ;;
+esac
+
+cd .. || {
+ echo "mkrel: can't cd to .." >&2
+ exit 1
+}
+
+rm -f ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER.zip
+rm -rf ttf2pt1-$NEWVER
+
+echo "cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1"
+cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1 || {
+ echo "mkrel: unable to export from CVS" >&2
+ echo "mkrel: check that the CVS tree is properly tagged" >&2
+ exit 1
+}
+
+
+# a little bit more for snapshot: correct the version
+(
+case "$1" in
+snapshot)
+ cd ttf2pt1-$NEWVER || {
+ echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2
+ exit 1
+ }
+
+ sed "s/^current\$/$NEWVER/" <CHANGES.html >CHANGES.html.new \
+ && mv CHANGES.html.new CHANGES.html || {
+ echo "mkrel: can't update CHANGES.html" >&2
+ exit 1
+ }
+
+ sed "s/\".*-CURRENT\"/\"$NEWVER\"/" <version.h >version.h.new \
+ && mv version.h.new version.h || {
+ echo "mkrel: can't update version.h" >&2
+ exit 1
+ }
+ ;;
+esac
+)
+
+# generate the man pages - in case if the users would have no pod2man
+(
+ cd ttf2pt1-$NEWVER || {
+ echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2
+ exit 1
+ }
+
+ make mans
+)
+
+tar czvf ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER || {
+ echo "mkrel: can't create .tgz archive" >&2
+ exit 1
+}
+
+zip -u -r ttf2pt1-$NEWVER.zip ttf2pt1-$NEWVER || {
+ echo "mkrel: can't create .zip archive" >&2
+ exit 1
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/t1fdir b/fonts/utilities/ttf2pt1/scripts/t1fdir
new file mode 100755
index 0000000000..16c86530f1
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/t1fdir
@@ -0,0 +1,227 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 1998
+# Sergey A. Babkin. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
+#
+
+#
+# Script that reads the Type1 font files and prints out the fonts.scale
+# lines for them
+#
+
+# other substrings (regexps) that are considered irrelevant
+# and sould be removed from the font names:
+@wrongstr= (
+ "koi8r",
+ "koi8",
+ "cp1251",
+ "ibm1251",
+ "win1251",
+ "cp866",
+ "ibm866",
+ "iso8859[1-9]",
+ "iso8859",
+ "isolatin[0-9]",
+ "isolatin",
+ "latin[0-9]",
+ "^ER ",
+ "^K8 ",
+);
+
+sub usage
+{
+ print STDERR "Use: \n";
+ print STDERR " t1fdir [-g] <foundry> <encoding>... [ -f <file>...]\n";
+ print STDERR "or\n";
+ print STDERR " t1fdir -d fonts.scale fonts.alias <foundry> <encoding>... [ -f <file>...]\n";
+}
+
+$ghost=0;
+if( $ARGV[0] eq "-g" ) {
+ shift @ARGV;
+ $ghost=1;
+} elsif( $ARGV[0] eq "-d" ) {
+ shift @ARGV;
+ $files=1;
+ $scalef=shift @ARGV;
+ $aliasf=shift @ARGV;
+}
+
+if($#ARGV<2) {
+ &usage();
+ exit 1;
+}
+
+$foundry=$ARGV[0];
+shift @ARGV;
+
+while($#ARGV>=0) {
+ if($ARGV[0] eq "-f") {
+ shift @ARGV;
+ last;
+ }
+ push(@encodings,$ARGV[0]);
+ shift @ARGV;
+}
+
+if($files) {
+ open(SCALEF, ">>$scalef") || die "Can't write to $scalef";
+ open(ALIASF, ">>$aliasf") || die "Can't write to $aliasf";
+}
+for $name (@ARGV) {
+
+ $familyname="";
+ $fullname="";
+ $fontname="";
+ $weight="";
+ $angle=0;
+
+ open(FILE,"<$name") || die "Unable to open file $name\n";
+
+ $type="p"; # by default
+
+ while(<FILE>) {
+ if(/eexec/) { last; }
+ if(/^\/FamilyName.*\((.+)\)/ ) { $familyname= $1; }
+ if(/^\/FullName.*\((.+)\)/ ) { $fullname= $1; }
+ if(/^\/FontName.*\((.+)\)/ ) { $fontname= $1; }
+ if(/^\/Weight.*\((.+)\)/ ) { $weight= $1; }
+ if(/^\/ItalicAngle.*(\d+)/ ) { $angle= $1+0; }
+ if(/^\/isFixedPitch/) {
+ if(/true/) {
+ $type="m";
+ } else {
+ $type="p";
+ }
+ }
+ }
+
+ # now try to interpret this information
+
+ $allinfo= $familyname ." ". $fullname ." ". $fontname ." ". $weight;
+ $lcallinfo=$allinfo;
+ $lcallinfo=~tr[A-Z][a-z];
+
+ $familyname.="_"; # just a delimiter for substitutions
+ $familyname=~s/Bold([^a-z])/$1/g;
+ $familyname=~s/Italic([^a-z])/$1/g;
+ $familyname=~s/Oblique([^a-z])/$1/g;
+ $familyname=~s/Roman([^a-z])/$1/g;
+
+ for $i (@wrongstr) { # for uppercase- and space- sensitive strings
+ $familyname =~ s/$i//g;
+ }
+
+ $familyname=~tr[A-Z][a-z];
+ $familyname=~tr[A-Za-z0-9][]cd;
+
+ for $i (@wrongstr) { # for case-insensitive strings
+ $familyname =~ s/$i//g;
+ }
+
+ if( $familyname eq "") {
+ $familyname="unknown";
+ }
+
+ $fn=$name;
+ $fn=~ s/.*\///g;
+
+ $n=0;
+ for $encoding (@encodings) {
+ $n++;
+ if($ghost) {
+ printf("/%s-", uc(substr($familyname,0,1)).substr($familyname,1));
+
+ $r=1;
+
+ if( $allinfo =~ /Bold[^a-z]/
+ || $lcallinfo =~ /\bbold\b/ ) {
+ printf("Bold");
+ $r=0;
+ }
+ if( $allinfo =~ /Italic[^a-z]/
+ || $lcallinfo =~ /\bitalic\b/
+ || $angle>0 ) {
+ printf("Italic");
+ $r=0;
+ } elsif( $allinfo =~ /Oblique[^a-z]/
+ || $lcallinfo =~ /\boblique\b/
+ || $angle<0 ) {
+ printf("Oblique");
+ $r=0;
+ }
+
+ if($r) {
+ printf("Roman");
+ }
+
+ printf("-%s\t (%s) ;\n",$encoding,$fn);
+ } else {
+ $xenc=$encoding;
+ $xenc =~ s/\-/_/g;
+
+ $srec = sprintf("-%s-%s_%s-",$foundry,$familyname,$xenc);
+ $arec = sprintf("-%s-%s-",$foundry,$familyname);
+
+ if( $allinfo =~ /Bold[^a-z]/
+ || $lcallinfo =~ /\bbold\b/ ) {
+ $srec .= "bold-";
+ $arec .= "bold-";
+ } else {
+ $srec .= "medium-";
+ $arec .= "medium-";
+ }
+
+ if( $allinfo =~ /Italic[^a-z]/
+ || $lcallinfo =~ /\bitalic\b/
+ || $angle>0 ) {
+ $srec .= "i-";
+ $arec .= "i-";
+ } elsif( $allinfo =~ /Oblique[^a-z]/
+ || $lcallinfo =~ /\boblique\b/
+ || $angle<0 ) {
+ $srec .= "o-";
+ $arec .= "o-";
+ } else {
+ $srec .= "r-";
+ $arec .= "r-";
+ }
+
+ $srec .= sprintf("normal--0-0-0-0-%s-0-adobe-fontspecific",$type,$encoding);
+ $arec .= sprintf("normal--0-0-0-0-%s-0-%s",$type,$encoding);
+
+ if($files) {
+ if($n==1) {
+ printf(SCALEF "%s %s\n",$fn,$srec);
+ printf(ALIASF "%s %s\n",$arec,$srec);
+ $srec1=$srec;
+ } else {
+ printf(ALIASF "%s %s\n",$arec,$srec1);
+ }
+ } else {
+ printf("%s %s\n",$fn,$arec);
+ }
+ }
+ }
+
+ close(FILE);
+}
+if($files) {
+ close(SCALEF);
+ close(ALIASF);
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/trans b/fonts/utilities/ttf2pt1/scripts/trans
new file mode 100755
index 0000000000..d52760e6f6
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/trans
@@ -0,0 +1,164 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 1998-2000
+# Sergey A. Babkin. All rights reserved.
+#
+# See the full text of the license in the COPYRIGHT file.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@users.sourceforge.net)
+#
+
+#
+# Script to transcode the Type1 disassembled font to other encoding
+#
+
+# calculation of UniqueID from old UID and encoding name
+# we don't have unsigned integer arithmetic in Perl
+# so we try to do at least something
+sub newuid
+{
+ use integer;
+ my ($u,$enc)=@_;
+ my $i, $uid;
+
+ $uid=substr($u, -6, 6);
+ $u=substr($u, 0, 4);
+
+ $uid+=0;
+ for $i (split(//,$enc)) {
+ $uid*=37;
+ $uid+=ord($i);
+ $uid+=($uid>>16) & 0xff;
+ $uid&=0xffffff;
+ }
+
+ ($uid % 1000000) + 4000000;
+ #$u . substr(sprintf("%d",$uid), 0, 5);
+}
+
+if($#ARGV != 1) {
+ printf(STDERR "Use: trans src-table dst-table <src-font >dst-font\n");
+ exit 1;
+}
+
+# tables are formatted in two columns, one row per character
+# name decimal-code
+
+# Read the destination table
+
+open(FILE,"<".$ARGV[1])
+ or die "Unable to read $ARGV[2]\n";
+while(<FILE>) {
+ @sl=split(/\s+/);
+ $dst{$sl[0]}=$sl[1];
+}
+close(FILE);
+
+#read the source table and build the translation table
+
+open(FILE,"<".$ARGV[0])
+ or die "Unable to read $ARGV[0]\n";
+while(<FILE>) {
+ @sl=split(/\s+/);
+ $trans{$sl[1]}=$dst{$sl[0]};
+}
+close(FILE);
+
+# name of the encoding, for UniqueID
+$encname=$ARGV[1];
+$encname =~ s|^.*\/||g;
+$encname =~ s|\..*$||g;
+
+# now read the font file, skip everything upto the encoding table
+# we suppose that the file was autogenerated by ttf2pt1 with my patches
+
+while(<STDIN>) {
+ if( /^\/FontName\s+(\S+)/) {
+ $fontname=$1;
+ }
+ if( /^\/UniqueID\s+(\S+)/) {
+ use integer;
+ my $uid=$1;
+ $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname));
+ }
+ print $_;
+ if(/^\/Encoding/) {
+ $fontfile=1;
+ last;
+ }
+ if(/^StartCharMetrics/) {
+ $fontfile=0;
+ last;
+ }
+}
+
+# read the old encoding table and build the new encoding table
+
+if($fontfile) { # .t1a
+ while($row=<STDIN>) {
+ if( $row !~ /^dup/) {
+ last;
+ }
+
+ @sl=split(/\s+/,$row);
+
+ $new=$trans{$sl[1]};
+ if($new eq "") {
+ $new=$sl[1];
+ if($enc{$new} eq "") {
+ $enc{$new}=$sl[2];
+ }
+ } else {
+ $enc{$new}=$sl[2];
+ }
+ }
+
+ # print new encoding table
+
+ for $i (0..255) {
+ if($enc{$i}) {
+ printf("dup %d %s put\n",$i,$enc{$i});
+ } else {
+ printf("dup %d /.notdef put\n",$i);
+ }
+ }
+} else { # .afm
+ while($row=<STDIN>) {
+ if($row !~ /^C\s+(\d+)(\s*;.*)\n/) {
+ last;
+ }
+ $code=$1;
+ $part2=$2;
+
+ $new=$trans{$code};
+ if($new eq "") {
+ $new=$code;
+ if($enc{$new} eq "") {
+ $enc{$new}=$part2;
+ }
+ } else {
+ $enc{$new}=$part2;
+ }
+ }
+
+ # print new encoding table
+
+ for $i (0..255) {
+ if($enc{$i}) {
+ printf("C %d%s\n",$i,$enc{$i});
+ }
+ }
+}
+
+print $row;
+
+# now copy the rest of file
+
+while(<STDIN>) {
+ if( /^\/UniqueID\s+(\S+)/) {
+ use integer;
+ my $uid=$1;
+ $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname));
+ }
+ print;
+}
diff --git a/fonts/utilities/ttf2pt1/scripts/unhtml b/fonts/utilities/ttf2pt1/scripts/unhtml
new file mode 100755
index 0000000000..1e660f544e
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/unhtml
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# This script removes the HTML formatting from a file. If the file was designed
+# with such use in mind and was properly formatted besides HTML (such as the README
+# file for ttf2pt1) it will look good as a plain text file.
+#
+# This script supports a very limited set of HTML formatting. Everything that
+# goes before <BODY> is removed. Any lines that
+# contain only the HTML formatting or start with "<!" or contain only ">"
+# are completely removed. Then all the in-line formatting is removed.
+# Then "&nbsp;", "&lt;", "&gt;" are changed to " ", "<", ">".
+
+sed '1,/<[bB][oO][dD][yY]>/d;
+/^<!/d;
+s/<[lL][iI]>/-/g;
+s/^</< </;
+s/> *$/>>/;
+s/<[^<>]*>//g;
+/^< *>$/d;
+/^>>$/d;s/^< //;
+s/>$//;
+s/&[nN][bB][sS][pP];/ /g;s/&[lL][tT];/</g;s/&[gG][tT];/>/g;s/&[aA][mM][pP];/\&/g;'
diff --git a/fonts/utilities/ttf2pt1/scripts/x2gs b/fonts/utilities/ttf2pt1/scripts/x2gs
new file mode 100755
index 0000000000..f46a3bb95f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/scripts/x2gs
@@ -0,0 +1,118 @@
+#!/bin/sh
+#
+# Copyright (c) 1998-2000
+# Sergey A. Babkin. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
+#
+
+# Use : x2gs [cfgfile]
+
+# path to the configuration file
+
+if [ $# -eq 1 ]
+then
+ CFGFILE=$1
+else
+ CFGFILE=`pwd`/convert.cfg
+fi
+
+MYSELF=x2gs
+
+# include the configuration
+
+if [ -r $CFGFILE ]
+then {
+ . $CFGFILE
+} else {
+ echo "
+Can't find the configuration file
+ $CFGFILE
+Please look at the sample file convert.cfg.sample,
+copy it to convert.cfg and modify for
+you actual configuration." >&2
+ exit 1
+} fi
+
+LOG=$DSTDIR/convert.log
+
+[ -n "$GSDIR" ] || {
+ echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2
+ echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2
+ exit 0
+}
+
+[ -n "$GSCONFDIR" -a -d "$GSCONFDIR" ] || {
+ echo "$MYSELF: The Ghostscript configuration directory does not exist.\n" >&2
+ echo "$MYSELF: Installation of the Ghostscript fonts is aborted.\n" >&2
+ exit 1
+}
+
+[ -r "$GSCONFDIR/Fontmap" ] || {
+ echo "$MYSELF: Can't find Fontmap in the GS configuration directory.\n" >&2
+ echo "$MYSELF: Installation of the Ghostscript fonts is aborted.\n" >&2
+ exit 1
+}
+
+[ -n "$GSFONTDIR" -a -d "$GSFONTDIR" ] || {
+ echo "$MYSELF: The Ghostscript font directory does not exist.\n" >&2
+ echo "$MYSELF: Installation of the Ghostscript fonts is aborted.\n" >&2
+ exit 1
+}
+
+# link the fonts to $GSFONTDIR
+
+rm -f $GSCONFDIR/Fontmap.ttf
+
+# historically x2gs supported multiple X11 directories
+for d in $DSTDIR
+do {
+ for i in $d/*.pfa $d/*.afm
+ do {
+ [ -f $i ] || break;
+
+ n=`basename $i`
+
+ rm -f $GSFONTDIR/$n
+
+ ln -s $i $GSFONTDIR/$n || {
+ echo "$MYSELF: Unable to link $n to GS font directory">&2
+ }
+ } done
+
+ cat $d/Fontmap.ttf >>$GSCONFDIR/Fontmap.ttf
+} done
+
+if [ YES = "$INSTALLFONTMAP" ]
+then {
+ mv $GSCONFDIR/Fontmap $GSCONFDIR/Fontmap.old || {
+ echo "$MYSELF: can't save Fontmap.old" >&2
+ exit 1
+ }
+
+ sed "\\|^% begin fonts from $DSTDIR|,\\|^% end fonts from $DSTDIR|d" \
+ <$GSCONFDIR/Fontmap.old >$GSCONFDIR/Fontmap || {
+ echo "$MYSELF: Can't create the new Fontmap file" >&2
+ echo "$MYSELF: Trying to restore the old Fontmap file" >&2
+ cp $GSCONFDIR/Fontmap.old $GSCONFDIR/Fontmap
+ exit 1
+ }
+ echo "% begin fonts from $DSTDIR" >>$GSCONFDIR/Fontmap
+ echo "" >>$GSCONFDIR/Fontmap
+ cat $GSCONFDIR/Fontmap.ttf >>$GSCONFDIR/Fontmap
+ echo "" >>$GSCONFDIR/Fontmap
+ echo "% end fonts from $DSTDIR" >>$GSCONFDIR/Fontmap
+} fi
diff --git a/fonts/utilities/ttf2pt1/t1asm.c b/fonts/utilities/ttf2pt1/t1asm.c
new file mode 100644
index 0000000000..d9c3061cc8
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/t1asm.c
@@ -0,0 +1,604 @@
+/* t1asm
+ *
+ * This program `assembles' Adobe Type-1 font programs in pseudo-PostScript
+ * form into either PFB or PFA format. The human readable/editable input is
+ * charstring- and eexec-encrypted as specified in the `Adobe Type 1 Font
+ * Format' version 1.1 (the `black book'). There is a companion program,
+ * t1disasm, which `disassembles' PFB and PFA files into a pseudo-PostScript
+ * file.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * Revision 1.2 92/05/22 11:54:45 ilh
+ * Fixed bug where integers larger than 32000 could not be encoded in
+ * charstrings. Now integer range is correct for four-byte
+ * twos-complement integers: -(1<<31) <= i <= (1<<31)-1. Bug detected by
+ * Piet Tutelaers (rcpt@urc.tue.nl).
+ *
+ * Revision 1.1 92/05/22 11:48:46 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ *
+ */
+
+#ifndef lint
+static char copyright[] =
+ "@(#) Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.";
+#ifdef _MSDOS
+static char portnotice[] =
+ "@(#) Ported to MS-DOS by Kai-Uwe Herbing (herbing@netmbx.netmbx.de).";
+#endif
+#endif
+
+/* Note: this is ANSI C. */
+
+#ifdef _MSDOS
+ #include <fcntl.h>
+ #include <getopt.h>
+ #include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#ifdef WINDOWS
+# ifdef STANDALONE
+# define WINDOWS_FUNCTIONS
+# include "windows.h"
+# endif
+#endif
+
+/* int32 must be at least 32-bit and uint16 must be at least 16-bit */
+#if INT_MAX >= 0x7FFFFFFFUL
+typedef int int32;
+#else
+typedef long int32;
+#endif
+#if USHRT_MAX >= 0xFFFFUL
+typedef unsigned short uint16;
+#else
+typedef unsigned int uint16;
+#endif
+
+#define LINESIZE 256
+
+#define MAXBLOCKLEN ((1L<<17)-6)
+#define MINBLOCKLEN ((1L<<8)-6)
+
+#define MARKER 128
+#define ASCII 1
+#define BINARY 2
+#define DONE 3
+
+typedef unsigned char byte;
+
+/* must be visible from outside */
+FILE *ifp;
+FILE *ofp;
+
+/* flags */
+static int pfb = 0;
+static int active = 0;
+static int start_charstring = 0;
+static int in_eexec = 0;
+
+static char line[LINESIZE];
+
+/* lenIV and charstring start command */
+static int lenIV = 4;
+static char cs_start[10];
+
+/* for charstring buffering */
+static byte charstring_buf[65535];
+static byte *charstring_bp;
+
+/* for PFB block buffering */
+static byte blockbuf[MAXBLOCKLEN];
+static int32 blocklen = MAXBLOCKLEN;
+static int32 blockpos = -1;
+static int blocktyp = ASCII;
+
+/* decryption stuff */
+static uint16 er, cr;
+static uint16 c1 = 52845, c2 = 22719;
+
+/* table of charstring commands */
+static struct command {
+ char *name;
+ int one, two;
+} command_table[] = {
+ { "callothersubr", 12, 16 },
+ { "callsubr", 10, -1 },
+ { "closepath", 9, -1 },
+ { "div", 12, 12 },
+ { "dotsection", 12, 0 },
+ { "endchar", 14, -1 },
+ { "hlineto", 6, -1 },
+ { "hmoveto", 22, -1 },
+ { "hsbw", 13, -1 },
+ { "hstem", 1, -1 },
+ { "hstem3", 12, 2 },
+ { "hvcurveto", 31, -1 },
+ { "pop", 12, 17 },
+ { "return", 11, -1 },
+ { "rlineto", 5, -1 },
+ { "rmoveto", 21, -1 },
+ { "rrcurveto", 8, -1 },
+ { "sbw", 12, 7 },
+ { "seac", 12, 6 },
+ { "setcurrentpoint", 12, 33 },
+ { "vhcurveto", 30, -1 },
+ { "vlineto", 7, -1 },
+ { "vmoveto", 4, -1 },
+ { "vstem", 3, -1 },
+ { "vstem3", 12, 1 },
+}; /* alphabetical */
+
+/* Two separate encryption functions because eexec and charstring encryption
+ must proceed in parallel. */
+
+static byte eencrypt(byte plain)
+{
+ byte cipher;
+
+ cipher = (byte) (plain ^ (er >> 8));
+ er = (uint16) ((cipher + er) * c1 + c2);
+ return cipher;
+}
+
+static byte cencrypt(byte plain)
+{
+ byte cipher;
+
+ cipher = (byte) (plain ^ (cr >> 8));
+ cr = (uint16) ((cipher + cr) * c1 + c2);
+ return cipher;
+}
+
+/* This function flushes a buffered PFB block. */
+
+static void output_block()
+{
+ int32 i;
+
+ /* output four-byte block length */
+ fputc((int) (blockpos & 0xff), ofp);
+ fputc((int) ((blockpos >> 8) & 0xff), ofp);
+ fputc((int) ((blockpos >> 16) & 0xff), ofp);
+ fputc((int) ((blockpos >> 24) & 0xff), ofp);
+
+ /* output block data */
+ for (i = 0; i < blockpos; i++)
+ fputc(blockbuf[i], ofp);
+
+ /* mark block buffer empty and uninitialized */
+ blockpos = -1;
+}
+
+/* This function outputs a single byte. If output is in PFB format then output
+ is buffered through blockbuf[]. If output is in PFA format, then output
+ will be hexadecimal if in_eexec is set, ASCII otherwise. */
+
+static void output_byte(byte b)
+{
+ static char *hexchar = "0123456789ABCDEF";
+ static int hexcol = 0;
+
+ if (pfb) {
+ /* PFB */
+ if (blockpos < 0) {
+ fputc(MARKER, ofp);
+ fputc(blocktyp, ofp);
+ blockpos = 0;
+ }
+ blockbuf[blockpos++] = b;
+ if (blockpos == blocklen)
+ output_block();
+ } else {
+ /* PFA */
+ if (in_eexec) {
+ /* trim hexadecimal lines to 64 columns */
+ if (hexcol >= 64) {
+ fputc('\n', ofp);
+ hexcol = 0;
+ }
+ fputc(hexchar[(b >> 4) & 0xf], ofp);
+ fputc(hexchar[b & 0xf], ofp);
+ hexcol += 2;
+ } else {
+ fputc(b, ofp);
+ }
+ }
+}
+
+/* This function outputs a byte through possible eexec encryption. */
+
+static void eexec_byte(byte b)
+{
+ if (in_eexec)
+ output_byte(eencrypt(b));
+ else
+ output_byte(b);
+}
+
+/* This function outputs a null-terminated string through possible eexec
+ encryption. */
+
+static void eexec_string(char *string)
+{
+ while (*string)
+ eexec_byte((byte) *string++);
+}
+
+/* This function gets ready for the eexec-encrypted data. If output is in
+ PFB format then flush current ASCII block and get ready for binary block.
+ We start encryption with four random (zero) bytes. */
+
+static void eexec_start()
+{
+ eexec_string(line);
+ if (pfb) {
+ output_block();
+ blocktyp = BINARY;
+ }
+
+ in_eexec = 1;
+ er = 55665;
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+}
+
+/* This function wraps-up the eexec-encrypted data.
+ If output is in PFB format then this entails flushing binary block and
+ starting an ASCII block. */
+
+static void eexec_end()
+{
+ int i, j;
+
+ if (pfb) {
+ output_block();
+ blocktyp = ASCII;
+ } else {
+ fputc('\n', ofp);
+ }
+ in_eexec = 0;
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 64; j++)
+ eexec_byte('0');
+ eexec_byte('\n');
+ }
+#if 0
+ eexec_string("cleartomark\n");
+#endif
+}
+
+/* This function writes ASCII trailer.
+ If output is in PFB format then this entails flushing binary block and
+ starting an ASCII block. */
+
+static void file_end()
+{
+ if (pfb) {
+ output_block();
+ fputc(MARKER, ofp);
+ fputc(DONE, ofp);
+ }
+}
+/* This function returns an input line of characters. A line is terminated by
+ length (including terminating null) greater than LINESIZE, a newline \n, or
+ when active (looking for charstrings) by '{'. When terminated by a newline
+ the newline is put into line[]. When terminated by '{', the '{' is not put
+ into line[], and the flag start_charstring is set to 1. */
+
+static void t1asm_getline()
+{
+ int c;
+ char *p = line;
+ int comment = 0;
+
+ start_charstring = 0;
+ while (p < line + LINESIZE) {
+ c = fgetc(ifp);
+ if (c == EOF)
+ break;
+ if (c == '%')
+ comment = 1;
+ if (active && !comment && c == '{') {
+ start_charstring = 1;
+ break;
+ }
+ *p++ = (char) c;
+ if (c == '\n')
+ break;
+ }
+ *p = '\0';
+}
+
+/* This function is used by the binary search, bsearch(), for command names in
+ the command table. */
+
+static int command_compare(const void *key, const void *item)
+{
+ return strcmp((char *) key, ((struct command *) item)->name);
+}
+
+/* This function returns 1 if the string is an integer and 0 otherwise. */
+
+static int is_integer(char *string)
+{
+ if (isdigit(string[0]) || string[0] == '-' || string[0] == '+') {
+ while (*++string && isdigit(*string))
+ ; /* deliberately empty */
+ if (!*string)
+ return 1;
+ }
+ return 0;
+}
+
+/* This function initializes charstring encryption. Note that this is called
+ at the beginning of every charstring. */
+
+static void charstring_start()
+{
+ int i;
+
+ charstring_bp = charstring_buf;
+ cr = 4330;
+ for (i = 0; i < lenIV; i++)
+ *charstring_bp++ = cencrypt((byte) 0);
+}
+
+/* This function encrypts and buffers a single byte of charstring data. */
+
+static void charstring_byte(int v)
+{
+ byte b = (byte) (v & 0xff);
+
+ if (charstring_bp - charstring_buf > sizeof(charstring_buf)) {
+ fprintf(stderr, "error: charstring_buf full (%d bytes)\n",
+ sizeof(charstring_buf));
+ exit(1);
+ }
+ *charstring_bp++ = cencrypt(b);
+}
+
+/* This function outputs buffered, encrypted charstring data through possible
+ eexec encryption. */
+
+static void charstring_end()
+{
+ byte *bp;
+
+ sprintf(line, "%d ", charstring_bp - charstring_buf);
+ eexec_string(line);
+ sprintf(line, "%s ", cs_start);
+ eexec_string(line);
+ for (bp = charstring_buf; bp < charstring_bp; bp++)
+ eexec_byte(*bp);
+}
+
+/* This function generates the charstring representation of an integer. */
+
+static void charstring_int(int num)
+{
+ int x;
+
+ if (num >= -107 && num <= 107) {
+ charstring_byte(num + 139);
+ } else if (num >= 108 && num <= 1131) {
+ x = num - 108;
+ charstring_byte(x / 256 + 247);
+ charstring_byte(x % 256);
+ } else if (num >= -1131 && num <= -108) {
+ x = abs(num) - 108;
+ charstring_byte(x / 256 + 251);
+ charstring_byte(x % 256);
+ } else if (num >= (-2147483647-1) && num <= 2147483647) {
+ charstring_byte(255);
+ charstring_byte(num >> 24);
+ charstring_byte(num >> 16);
+ charstring_byte(num >> 8);
+ charstring_byte(num);
+ } else {
+ fprintf(stderr,
+ "error: cannot format the integer %d, too large\n", num);
+ exit(1);
+ }
+}
+
+/* This function parses an entire charstring into integers and commands,
+ outputting bytes through the charstring buffer. */
+
+static void parse_charstring()
+{
+ struct command *cp;
+
+ charstring_start();
+ while (fscanf(ifp, "%s", line) == 1) {
+ if (line[0] == '%') {
+ /* eat comment to end of line */
+ while (fgetc(ifp) != '\n' && !feof(ifp))
+ ; /* deliberately empty */
+ continue;
+ }
+ if (line[0] == '}')
+ break;
+ if (is_integer(line)) {
+ charstring_int(atoi(line));
+ } else {
+ cp = (struct command *)
+ bsearch((void *) line, (void *) command_table,
+ sizeof(command_table) / sizeof(struct command),
+ sizeof(struct command),
+ command_compare);
+ if (cp) {
+ charstring_byte(cp->one);
+ if (cp->two >= 0)
+ charstring_byte(cp->two);
+ } else {
+ fprintf(stderr, "error: cannot use `%s' in charstring\n",line);
+ exit(1);
+ }
+ }
+ }
+ charstring_end();
+}
+
+static void usage()
+{
+ fprintf(stderr,
+ "usage: t1asm [-b] [-l block-length] [input [output]]\n");
+ fprintf(stderr,
+ "\n-b means output in PFB format, otherwise PFA format.\n");
+ fprintf(stderr,
+ "The block length applies to the length of blocks in the\n");
+ fprintf(stderr,
+ "PFB output file; the default is to use the largest possible.\n");
+ exit(1);
+}
+
+static void print_banner()
+{
+ static char rcs_revision[] = ""; /* removed RCS */
+ static char revision[20];
+
+ if (sscanf(rcs_revision, "$Revision: %19s", revision) != 1)
+ revision[0] = '\0';
+ fprintf(stderr, "This is t1asm %s.\n", revision);
+}
+
+#ifdef STANDALONE
+int main(int argc, char **argv)
+{
+ char *p, *q, *r;
+ int c;
+
+ extern char *optarg;
+ extern int optind;
+
+ ifp = stdin;
+ ofp = stdout;
+
+ print_banner();
+
+ /* interpret command line arguments using getopt */
+ while ((c = getopt(argc, argv, "bl:")) != -1)
+ switch (c) {
+ case 'b':
+ pfb = 1;
+ break;
+ case 'l':
+ blocklen = atoi(optarg);
+ if (blocklen < MINBLOCKLEN) {
+ blocklen = MINBLOCKLEN;
+ fprintf(stderr,
+ "warning: using minimum block length of %d\n",
+ blocklen);
+ } else if (blocklen > MAXBLOCKLEN) {
+ blocklen = MAXBLOCKLEN;
+ fprintf(stderr,
+ "warning: using maximum block length of %d\n",
+ blocklen);
+ }
+ break;
+ default:
+ usage();
+ break;
+ }
+ if (argc - optind > 2)
+ usage();
+
+ /* possibly open input & output files */
+ if (argc - optind >= 1) {
+ ifp = fopen(argv[optind], "r");
+ if (!ifp) {
+ fprintf(stderr, "error: cannot open %s for reading\n", argv[1]);
+ exit(1);
+ }
+ }
+ if (argc - optind >= 2) {
+ ofp = fopen(argv[optind + 1], "w");
+ if (!ofp) {
+ fprintf(stderr, "error: cannot open %s for writing\n", argv[2]);
+ exit(1);
+ }
+ }
+
+#else
+int runt1asm(int pfbflag)
+{
+ char *p, *q, *r;
+
+ pfb = pfbflag;
+#endif
+
+ #ifdef _MSDOS
+ /* If we are processing a PFB (binary) output */
+ /* file, we must set its file mode to binary. */
+ if (pfb)
+ _setmode(_fileno(ofp), _O_BINARY);
+ #endif
+
+ /* Finally, we loop until no more input. Some special things to look for
+ are the `currentfile eexec' line, the beginning of the `/Subrs'
+ definition, the definition of `/lenIV', and the definition of the
+ charstring start command which has `...string currentfile...' in it. */
+
+ while (!feof(ifp) && !ferror(ifp)) {
+ t1asm_getline();
+ if (strcmp(line, "currentfile eexec\n") == 0) {
+ eexec_start();
+ continue;
+ } else if (strstr(line, "/Subrs") && isspace(line[6])) {
+ active = 1;
+ } else if ((p = strstr(line, "/lenIV"))) {
+ sscanf(p, "%*s %d", &lenIV);
+ } else if ((p = strstr(line, "string currentfile"))) {
+ /* locate the name of the charstring start command */
+ *p = '\0'; /* damage line[] */
+ q = strrchr(line, '/');
+ if (q) {
+ r = cs_start;
+ ++q;
+ while (!isspace(*q) && *q != '{')
+ *r++ = *q++;
+ *r = '\0';
+ }
+ *p = 's'; /* repair line[] */
+ }
+ /* output line data */
+ eexec_string(line);
+ if ((p = strstr(line, "currentfile closefile"))) {
+ eexec_end();
+ }
+ if (start_charstring) {
+ if (!cs_start[0]) {
+ fprintf(stderr, "error: couldn't find charstring start command\n");
+ exit(1);
+ }
+ parse_charstring();
+ }
+ }
+ file_end();
+
+ fclose(ifp);
+ fclose(ofp);
+
+ return 0;
+}
diff --git a/fonts/utilities/ttf2pt1/ttf.c b/fonts/utilities/ttf2pt1/ttf.c
new file mode 100644
index 0000000000..d7292fccf9
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf.c
@@ -0,0 +1,1480 @@
+/*
+ * True Type Font to Adobe Type 1 font converter
+ * By Mark Heath <mheath@netspace.net.au>
+ * Based on ttf2pfa by Andrew Weeks <ccsaw@bath.ac.uk>
+ * With help from Frank M. Siegert <fms@this.net>
+ *
+ * see COPYRIGHT
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <ctype.h>
+#include <math.h>
+
+#ifndef WINDOWS
+# include <unistd.h>
+# include <netinet/in.h>
+#else
+# include "windows.h"
+#endif
+
+#include "ttf.h"
+#include "pt1.h"
+#include "global.h"
+
+/* prototypes of call entries */
+static void openfont(char *fname, char *arg);
+static void closefont( void);
+static int getnglyphs ( void);
+static int glnames( GLYPH *glyph_list);
+static void glmetrics( GLYPH *glyph_list);
+static int glenc( GLYPH *glyph_list, int *encoding, int *unimap);
+static void fnmetrics( struct font_metrics *fm);
+static void glpath( int glyphno, GLYPH *glyph_list);
+static void kerning( GLYPH *glyph_list);
+
+/* globals */
+
+/* front-end descriptor */
+struct frontsw ttf_sw = {
+ /*name*/ "ttf",
+ /*descr*/ "built-in TTF support",
+ /*suffix*/ { "ttf" },
+ /*open*/ openfont,
+ /*close*/ closefont,
+ /*nglyphs*/ getnglyphs,
+ /*glnames*/ glnames,
+ /*glmetrics*/ glmetrics,
+ /*glenc*/ glenc,
+ /*fnmetrics*/ fnmetrics,
+ /*glpath*/ glpath,
+ /*kerning*/ kerning,
+};
+
+/* statics */
+
+static FILE *ttf_file;
+static int ttf_nglyphs, long_offsets;
+
+static TTF_DIRECTORY *directory;
+static TTF_DIR_ENTRY *dir_entry;
+static char *filebuffer;
+static char *filebuffer_end;
+static TTF_NAME *name_table = NULL;
+static TTF_NAME_REC *name_record;
+static TTF_HEAD *head_table = NULL;
+static TTF_HHEA *hhea_table = NULL;
+static TTF_KERN *kern_table = NULL;
+static TTF_CMAP *cmap_table = NULL;
+static LONGHORMETRIC *hmtx_table = NULL;
+static TTF_GLYF *glyf_table;
+static BYTE *glyf_start = NULL;
+static TTF_MAXP *maxp_table = NULL;
+static TTF_POST_HEAD *post_table = NULL;
+static union {
+ USHORT *sp;
+ ULONG *lp;
+} loca_table;
+#define short_loca_table loca_table.sp
+#define long_loca_table loca_table.lp
+
+static short cmap_n_segs;
+static USHORT *cmap_seg_start, *cmap_seg_end;
+static short *cmap_idDelta, *cmap_idRangeOffset;
+static TTF_CMAP_FMT0 *encoding0;
+static int enc_type;
+
+static char name_buffer[2000];
+static char *name_fields[8];
+
+static int enc_found_ms, enc_found_mac;
+
+static char *mac_glyph_names[258] = {
+ ".notdef", ".null", "CR",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "Adieresis",
+ "Aring", "Ccedilla", "Eacute", "Ntilde",
+ "Odieresis", "Udieresis", "aacute", "agrave",
+ "acircumflex", "adieresis", "atilde", "aring",
+ "ccedilla", "eacute", "egrave", "ecircumflex",
+ "edieresis", "iacute", "igrave", "icircumflex",
+ "idieresis", "ntilde", "oacute", "ograve",
+ "ocircumflex", "odieresis", "otilde", "uacute",
+ "ugrave", "ucircumflex", "udieresis", "dagger",
+ "degree", "cent", "sterling", "section",
+ "bullet", "paragraph", "germandbls", "registered",
+ "copyright", "trademark", "acute", "dieresis",
+ "notequal", "AE", "Oslash", "infinity",
+ "plusminus", "lessequal", "greaterequal", "yen",
+ "mu", "partialdiff", "summation", "product",
+ "pi", "integral", "ordfeminine", "ordmasculine",
+ "Omega", "ae", "oslash", "questiondown",
+ "exclamdown", "logicalnot", "radical", "florin",
+ "approxequal", "increment", "guillemotleft", "guillemotright",
+ "ellipsis", "nbspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash",
+ "emdash", "quotedblleft", "quotedblright", "quoteleft",
+ "quoteright", "divide", "lozenge", "ydieresis",
+ "Ydieresis", "fraction", "currency", "guilsinglleft",
+ "guilsinglright", "fi", "fl", "daggerdbl",
+ "periodcentered", "quotesinglbase", "quotedblbase", "perthousand",
+ "Acircumflex", "Ecircumflex", "Aacute", "Edieresis",
+ "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Oacute", "Ocircumflex", "applelogo",
+ "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron",
+ "breve", "dotaccent", "ring", "cedilla",
+ "hungarumlaut", "ogonek", "caron", "Lslash",
+ "lslash", "Scaron", "scaron", "Zcaron",
+ "zcaron", "brokenbar", "Eth", "eth",
+ "Yacute", "yacute", "Thorn", "thorn",
+ "minus", "multiply", "onesuperior", "twosuperior",
+ "threesuperior", "onehalf", "onequarter", "threequarters",
+ "franc", "Gbreve", "gbreve", "Idot",
+ "Scedilla", "scedilla", "Cacute", "cacute",
+ "Ccaron", "ccaron", "dmacron"
+};
+
+/* other prototypes */
+static void draw_composite_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno,
+ double *matrix, int level);
+static void draw_simple_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno,
+ double *matrix);
+static double f2dot14( short x);
+
+/* get the TTF description table address and length for this index */
+
+static void
+get_glyf_table(
+ int glyphno,
+ TTF_GLYF **tab,
+ int *len
+)
+{
+ if(tab!=NULL) {
+ if (long_offsets) {
+ *tab = (TTF_GLYF *) (glyf_start + ntohl(long_loca_table[glyphno]));
+ } else {
+ *tab = (TTF_GLYF *) (glyf_start + (ntohs(short_loca_table[glyphno]) << 1));
+ }
+ }
+ if(len!=NULL) {
+ if (long_offsets) {
+ *len = ntohl(long_loca_table[glyphno + 1]) - ntohl(long_loca_table[glyphno]);
+ } else {
+ *len = (ntohs(short_loca_table[glyphno + 1]) - ntohs(short_loca_table[glyphno])) << 1;
+ }
+ }
+}
+
+static void
+handle_name(void)
+{
+ int j, k, lang, len, platform;
+ char *p, *string_area;
+ char *nbp = name_buffer;
+ int found3 = 0;
+
+ string_area = (char *) name_table + ntohs(name_table->offset);
+ name_record = &(name_table->nameRecords);
+
+ for (j = 0; j < 8; j++) {
+ name_fields[j] = "";
+ }
+
+ for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) {
+
+ platform = ntohs(name_record->platformID);
+
+ if (platform == 3) {
+
+ found3 = 1;
+ lang = ntohs(name_record->languageID) & 0xff;
+ len = ntohs(name_record->stringLength);
+ if (lang == 0 || lang == 9) {
+ k = ntohs(name_record->nameID);
+ if (k < 8) {
+ name_fields[k] = nbp;
+
+ p = string_area + ntohs(name_record->stringOffset);
+ for (k = 0; k < len; k++) {
+ if (p[k] != '\0') {
+ if (p[k] == '(') {
+ *nbp = '[';
+ } else if (p[k] == ')') {
+ *nbp = ']';
+ } else {
+ *nbp = p[k];
+ }
+ nbp++;
+ }
+ }
+ *nbp = '\0';
+ nbp++;
+ }
+ }
+ }
+ name_record++;
+ }
+
+ string_area = (char *) name_table + ntohs(name_table->offset);
+ name_record = &(name_table->nameRecords);
+
+ if (!found3) {
+ for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) {
+
+ platform = ntohs(name_record->platformID);
+
+ if (platform == 1) {
+
+ found3 = 1;
+ lang = ntohs(name_record->languageID) & 0xff;
+ len = ntohs(name_record->stringLength);
+ if (lang == 0 || lang == 9) {
+ k = ntohs(name_record->nameID);
+ if (k < 8) {
+ name_fields[k] = nbp;
+
+ p = string_area + ntohs(name_record->stringOffset);
+ for (k = 0; k < len; k++) {
+ if (p[k] != '\0') {
+ if (p[k] == '(') {
+ *nbp = '[';
+ } else if (p[k] == ')') {
+ *nbp = ']';
+ } else {
+ *nbp = p[k];
+ }
+ nbp++;
+ }
+ }
+ *nbp = '\0';
+ nbp++;
+ }
+ }
+ }
+ name_record++;
+ }
+ }
+ if (!found3) {
+ fprintf(stderr, "**** Cannot decode font name fields ****\n");
+ exit(1);
+ }
+ if (name_fields[4][0] == 0) { /* Full Name empty, use Family Name */
+ name_fields[4] = name_fields[1];
+ }
+ if (name_fields[6][0] == 0) { /* Font Name empty, use Full Name */
+ name_fields[6] = name_fields[4];
+ if (name_fields[6][0] == 0) { /* oops, empty again */
+ WARNING_1 fprintf(stderr, "Font name is unknown, setting to \"Unknown\"\n");
+ name_fields[6] = "Unknown";
+ }
+ }
+ p = name_fields[6];
+ /* must not start with a digit */
+ if(isdigit(*p))
+ *p+= 'A'-'0'; /* change to a letter */
+ while (*p != '\0') {
+ if (!isalnum(*p) || *p=='_') {
+ *p = '-';
+ }
+ p++;
+ }
+}
+
+static void
+handle_head(void)
+{
+ long_offsets = ntohs(head_table->indexToLocFormat);
+ if (long_offsets != 0 && long_offsets != 1) {
+ fprintf(stderr, "**** indexToLocFormat wrong ****\n");
+ exit(1);
+ }
+}
+
+/* limit the recursion level to avoid cycles */
+#define MAX_COMPOSITE_LEVEL 20
+
+static void
+draw_composite_glyf(
+ GLYPH *g,
+ GLYPH *glyph_list,
+ int glyphno,
+ double *orgmatrix,
+ int level
+)
+{
+ int len;
+ short ncontours;
+ USHORT flagbyte, glyphindex;
+ double arg1, arg2;
+ BYTE *ptr;
+ char *bptr;
+ SHORT *sptr;
+ double matrix[6], newmatrix[6];
+
+ get_glyf_table(glyphno, &glyf_table, &len);
+
+ if(len<=0) /* nothing to do */
+ return;
+
+ ncontours = ntohs(glyf_table->numberOfContours);
+ if (ncontours >= 0) { /* simple case */
+ draw_simple_glyf(g, glyph_list, glyphno, orgmatrix);
+ return;
+ }
+
+ if(ISDBG(COMPOSITE) && level ==0)
+ fprintf(stderr, "* %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", g->name,
+ orgmatrix[0], orgmatrix[1], orgmatrix[2], orgmatrix[3],
+ orgmatrix[4], orgmatrix[5]);
+
+ /* complex case */
+ if(level >= MAX_COMPOSITE_LEVEL) {
+ WARNING_1 fprintf(stderr,
+ "*** Glyph %s: stopped (possibly infinite) recursion at depth %d\n",
+ g->name, level);
+ return;
+ }
+
+ ptr = ((BYTE *) glyf_table + sizeof(TTF_GLYF));
+ sptr = (SHORT *) ptr;
+ do {
+ flagbyte = ntohs(*sptr);
+ sptr++;
+ glyphindex = ntohs(*sptr);
+ sptr++;
+
+ if (flagbyte & ARG_1_AND_2_ARE_WORDS) {
+ arg1 = (short)ntohs(*sptr);
+ sptr++;
+ arg2 = (short)ntohs(*sptr);
+ sptr++;
+ } else {
+ bptr = (char *) sptr;
+ arg1 = (signed char) bptr[0];
+ arg2 = (signed char) bptr[1];
+ sptr++;
+ }
+ matrix[1] = matrix[2] = 0.0;
+
+ if (flagbyte & WE_HAVE_A_SCALE) {
+ matrix[0] = matrix[3] = f2dot14(*sptr);
+ sptr++;
+ } else if (flagbyte & WE_HAVE_AN_X_AND_Y_SCALE) {
+ matrix[0] = f2dot14(*sptr);
+ sptr++;
+ matrix[3] = f2dot14(*sptr);
+ sptr++;
+ } else if (flagbyte & WE_HAVE_A_TWO_BY_TWO) {
+ matrix[0] = f2dot14(*sptr);
+ sptr++;
+ matrix[1] = f2dot14(*sptr);
+ sptr++;
+ matrix[2] = f2dot14(*sptr);
+ sptr++;
+ matrix[3] = f2dot14(*sptr);
+ sptr++;
+ } else {
+ matrix[0] = matrix[3] = 1.0;
+ }
+
+ /*
+ * See *
+ * http://fonts.apple.com/TTRefMan/RM06/Chap6g
+ * lyf.html * matrix[0,1,2,3,4,5]=a,b,c,d,m,n
+ */
+
+ if (fabs(matrix[0]) > fabs(matrix[1]))
+ matrix[4] = fabs(matrix[0]);
+ else
+ matrix[4] = fabs(matrix[1]);
+ if (fabs(fabs(matrix[0]) - fabs(matrix[2])) <= 33. / 65536.)
+ matrix[4] *= 2.0;
+
+ if (fabs(matrix[2]) > fabs(matrix[3]))
+ matrix[5] = fabs(matrix[2]);
+ else
+ matrix[5] = fabs(matrix[3]);
+ if (fabs(fabs(matrix[2]) - fabs(matrix[3])) <= 33. / 65536.)
+ matrix[5] *= 2.0;
+
+ /*
+ * fprintf (stderr,"Matrix Opp %hd
+ * %hd\n",arg1,arg2);
+ */
+#if 0
+ fprintf(stderr, "Matrix: %f %f %f %f %f %f\n",
+ matrix[0], matrix[1], matrix[2], matrix[3],
+ matrix[4], matrix[5]);
+ fprintf(stderr, "Offset: %f %f (%s)\n",
+ arg1, arg2,
+ ((flagbyte & ARGS_ARE_XY_VALUES) ? "XY" : "index"));
+#endif
+
+ if (flagbyte & ARGS_ARE_XY_VALUES) {
+ matrix[4] *= arg1;
+ matrix[5] *= arg2;
+ } else {
+ WARNING_1 fprintf(stderr,
+ "*** Glyph %s: reusing scale from another glyph is unsupported\n",
+ g->name);
+ /*
+ * must extract values from a glyph
+ * but it seems to be too much pain
+ * and it's not clear now that it
+ * would be really used in any
+ * interesting font
+ */
+ }
+
+ /* at this point arg1,arg2 contain what logically should be matrix[4,5] */
+
+ /* combine matrices */
+
+ newmatrix[0] = orgmatrix[0]*matrix[0] + orgmatrix[2]*matrix[1];
+ newmatrix[1] = orgmatrix[0]*matrix[2] + orgmatrix[2]*matrix[3];
+
+ newmatrix[2] = orgmatrix[1]*matrix[0] + orgmatrix[3]*matrix[1];
+ newmatrix[3] = orgmatrix[1]*matrix[2] + orgmatrix[3]*matrix[3];
+
+ newmatrix[4] = orgmatrix[0]*matrix[4] + orgmatrix[2]*matrix[5] + orgmatrix[4];
+ newmatrix[5] = orgmatrix[1]*matrix[4] + orgmatrix[3]*matrix[5] + orgmatrix[5];
+
+ if(ISDBG(COMPOSITE)) {
+ fprintf(stderr, "%*c+-> %2d %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n",
+ level+1, ' ', level, glyph_list[glyphindex].name,
+ matrix[0], matrix[1], matrix[2], matrix[3],
+ matrix[4], matrix[5]);
+ fprintf(stderr, "%*c = [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n",
+ level+1, ' ',
+ newmatrix[0], newmatrix[1], newmatrix[2], newmatrix[3],
+ newmatrix[4], newmatrix[5]);
+ }
+ draw_composite_glyf(g, glyph_list, glyphindex, newmatrix, level+1);
+
+ } while (flagbyte & MORE_COMPONENTS);
+}
+
+static void
+draw_simple_glyf(
+ GLYPH *g,
+ GLYPH *glyph_list,
+ int glyphno,
+ double *matrix
+)
+{
+ int i, j, k, k1, len, first, cs, ce;
+ /* We assume that hsbw always sets to(0, 0) */
+ double xlast = 0, ylast = 0;
+ int finished, nguide, contour_start, contour_end;
+ short ncontours, n_inst, last_point;
+ USHORT *contour_end_pt;
+ BYTE *ptr;
+#define GLYFSZ 2000
+ short xabs[GLYFSZ], yabs[GLYFSZ], xrel[GLYFSZ], yrel[GLYFSZ];
+ double xcoord[GLYFSZ], ycoord[GLYFSZ];
+ BYTE flags[GLYFSZ];
+ double tx, ty;
+ int needreverse = 0; /* transformation may require
+ * that */
+ GENTRY *lge;
+
+ lge = g->lastentry;
+
+ get_glyf_table(glyphno, &glyf_table, &len);
+
+ if (len <= 0) {
+ WARNING_1 fprintf(stderr,
+ "**** Composite glyph %s refers to non-existent glyph %s, ignored\n",
+ g->name,
+ glyph_list[glyphno].name);
+ return;
+ }
+ ncontours = ntohs(glyf_table->numberOfContours);
+ if (ncontours < 0) {
+ WARNING_1 fprintf(stderr,
+ "**** Composite glyph %s refers to composite glyph %s, ignored\n",
+ g->name,
+ glyph_list[glyphno].name);
+ return;
+ }
+ contour_end_pt = (USHORT *) ((char *) glyf_table + sizeof(TTF_GLYF));
+
+ last_point = ntohs(contour_end_pt[ncontours - 1]);
+ n_inst = ntohs(contour_end_pt[ncontours]);
+
+ ptr = ((BYTE *) contour_end_pt) + (ncontours << 1) + n_inst + 2;
+ j = k = 0;
+ while (k <= last_point) {
+ flags[k] = ptr[j];
+
+ if (ptr[j] & REPEAT) {
+ for (k1 = 0; k1 < ptr[j + 1]; k1++) {
+ k++;
+ flags[k] = ptr[j];
+ }
+ j++;
+ }
+ j++;
+ k++;
+ }
+
+ for (k = 0; k <= last_point; k++) {
+ if (flags[k] & XSHORT) {
+ if (flags[k] & XSAME) {
+ xrel[k] = ptr[j];
+ } else {
+ xrel[k] = -ptr[j];
+ }
+ j++;
+ } else if (flags[k] & XSAME) {
+ xrel[k] = 0.0;
+ } else {
+ xrel[k] = (short)( ptr[j] * 256 + ptr[j + 1] );
+ j += 2;
+ }
+ if (k == 0) {
+ xabs[k] = xrel[k];
+ } else {
+ xabs[k] = xrel[k] + xabs[k - 1];
+ }
+
+ }
+
+ for (k = 0; k <= last_point; k++) {
+ if (flags[k] & YSHORT) {
+ if (flags[k] & YSAME) {
+ yrel[k] = ptr[j];
+ } else {
+ yrel[k] = -ptr[j];
+ }
+ j++;
+ } else if (flags[k] & YSAME) {
+ yrel[k] = 0;
+ } else {
+ yrel[k] = ptr[j] * 256 + ptr[j + 1];
+ j += 2;
+ }
+ if (k == 0) {
+ yabs[k] = yrel[k];
+ } else {
+ yabs[k] = yrel[k] + yabs[k - 1];
+ }
+ }
+
+ if (matrix) {
+ for (i = 0; i <= last_point; i++) {
+ tx = xabs[i];
+ ty = yabs[i];
+ xcoord[i] = fscale(matrix[0] * tx + matrix[2] * ty + matrix[4]);
+ ycoord[i] = fscale(matrix[1] * tx + matrix[3] * ty + matrix[5]);
+ }
+ } else {
+ for (i = 0; i <= last_point; i++) {
+ xcoord[i] = fscale(xabs[i]);
+ ycoord[i] = fscale(yabs[i]);
+ }
+ }
+
+ i = j = 0;
+ first = 1;
+
+ while (i <= ntohs(contour_end_pt[ncontours - 1])) {
+ contour_end = ntohs(contour_end_pt[j]);
+
+ if (first) {
+ fg_rmoveto(g, xcoord[i], ycoord[i]);
+ xlast = xcoord[i];
+ ylast = ycoord[i];
+ contour_start = i;
+ first = 0;
+ } else if (flags[i] & ONOROFF) {
+ fg_rlineto(g, xcoord[i], ycoord[i]);
+ xlast = xcoord[i];
+ ylast = ycoord[i];
+ } else {
+ cs = i - 1;
+ finished = nguide = 0;
+ while (!finished) {
+ if (i == contour_end + 1) {
+ ce = contour_start;
+ finished = 1;
+ } else if (flags[i] & ONOROFF) {
+ ce = i;
+ finished = 1;
+ } else {
+ i++;
+ nguide++;
+ }
+ }
+
+ switch (nguide) {
+ case 0:
+ fg_rlineto(g, xcoord[ce], ycoord[ce]);
+ xlast = xcoord[ce];
+ ylast = ycoord[ce];
+ break;
+
+ case 1:
+ fg_rrcurveto(g,
+ (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0,
+ (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0,
+ (2.0 * xcoord[cs + 1] + xcoord[ce]) / 3.0,
+ (2.0 * ycoord[cs + 1] + ycoord[ce]) / 3.0,
+ xcoord[ce],
+ ycoord[ce]
+ );
+ xlast = xcoord[ce];
+ ylast = ycoord[ce];
+
+ break;
+
+ case 2:
+ fg_rrcurveto(g,
+ (-xcoord[cs] + 4.0 * xcoord[cs + 1]) / 3.0,
+ (-ycoord[cs] + 4.0 * ycoord[cs + 1]) / 3.0,
+ (4.0 * xcoord[cs + 2] - xcoord[ce]) / 3.0,
+ (4.0 * ycoord[cs + 2] - ycoord[ce]) / 3.0,
+ xcoord[ce],
+ ycoord[ce]
+ );
+ xlast = xcoord[ce];
+ ylast = ycoord[ce];
+ break;
+
+ case 3:
+ fg_rrcurveto(g,
+ (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0,
+ (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0,
+ (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0,
+ (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0,
+ (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0,
+ (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0
+ );
+
+ fg_rrcurveto(g,
+ (xcoord[cs + 1] + 5.0 * xcoord[cs + 2]) / 6.0,
+ (ycoord[cs + 1] + 5.0 * ycoord[cs + 2]) / 6.0,
+ (5.0 * xcoord[cs + 2] + xcoord[cs + 3]) / 6.0,
+ (5.0 * ycoord[cs + 2] + ycoord[cs + 3]) / 6.0,
+ (xcoord[cs + 3] + xcoord[cs + 2]) / 2.0,
+ (ycoord[cs + 3] + ycoord[cs + 2]) / 2.0
+ );
+
+ fg_rrcurveto(g,
+ (xcoord[cs + 2] + 5.0 * xcoord[cs + 3]) / 6.0,
+ (ycoord[cs + 2] + 5.0 * ycoord[cs + 3]) / 6.0,
+ (2.0 * xcoord[cs + 3] + xcoord[ce]) / 3.0,
+ (2.0 * ycoord[cs + 3] + ycoord[ce]) / 3.0,
+ xcoord[ce],
+ ycoord[ce]
+ );
+ ylast = ycoord[ce];
+ xlast = xcoord[ce];
+
+ break;
+
+ default:
+ k1 = cs + nguide;
+ fg_rrcurveto(g,
+ (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0,
+ (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0,
+ (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0,
+ (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0,
+ (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0,
+ (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0
+ );
+
+ for (k = cs + 2; k <= k1 - 1; k++) {
+ fg_rrcurveto(g,
+ (xcoord[k - 1] + 5.0 * xcoord[k]) / 6.0,
+ (ycoord[k - 1] + 5.0 * ycoord[k]) / 6.0,
+ (5.0 * xcoord[k] + xcoord[k + 1]) / 6.0,
+ (5.0 * ycoord[k] + ycoord[k + 1]) / 6.0,
+ (xcoord[k] + xcoord[k + 1]) / 2.0,
+ (ycoord[k] + ycoord[k + 1]) / 2.0
+ );
+
+ }
+
+ fg_rrcurveto(g,
+ (xcoord[k1 - 1] + 5.0 * xcoord[k1]) / 6.0,
+ (ycoord[k1 - 1] + 5.0 * ycoord[k1]) / 6.0,
+ (2.0 * xcoord[k1] + xcoord[ce]) / 3.0,
+ (2.0 * ycoord[k1] + ycoord[ce]) / 3.0,
+ xcoord[ce],
+ ycoord[ce]
+ );
+ xlast = xcoord[ce];
+ ylast = ycoord[ce];
+
+ break;
+ }
+ }
+ if (i >= contour_end) {
+ g_closepath(g);
+ first = 1;
+ i = contour_end + 1;
+ j++;
+ } else {
+ i++;
+ }
+ }
+
+ if (matrix) {
+ /* guess whether do we need to reverse the results */
+
+ double x[3], y[3];
+ int max = 0, from, to;
+
+ /* transform a triangle going in proper direction */
+ /*
+ * the origin of triangle is in (0,0) so we know it in
+ * advance
+ */
+
+ x[0] = y[0] = 0;
+ x[1] = matrix[0] * 0 + matrix[2] * 300;
+ y[1] = matrix[1] * 0 + matrix[3] * 300;
+ x[2] = matrix[0] * 300 + matrix[2] * 0;
+ y[2] = matrix[1] * 300 + matrix[3] * 0;
+
+ /* then find the topmost point */
+ for (i = 0; i < 3; i++)
+ if (y[i] > y[max])
+ max = i;
+ from = (max + 3 - 1) % 3;
+ to = (max + 1) % 3;
+
+ needreverse = 0;
+
+ /* special cases for horizontal lines */
+ if (y[max] == y[from]) {
+ if (x[max] < y[from])
+ needreverse = 1;
+ } else if (y[to] == y[from]) {
+ if (x[to] < x[max])
+ needreverse = 1;
+ } else { /* generic case */
+ if ((x[to] - x[max]) * (y[max] - y[from])
+ > (x[max] - x[from]) * (y[to] - y[max]))
+ needreverse = 1;
+ }
+
+ if (needreverse) {
+ if (lge) {
+ assertpath(lge->next, __FILE__, __LINE__, g->name);
+ reversepathsfromto(lge->next, NULL);
+ } else {
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+ reversepaths(g);
+ }
+ }
+ }
+}
+
+static double
+f2dot14(
+ short x
+)
+{
+ short y = ntohs(x);
+ return (y >> 14) + ((y & 0x3fff) / 16384.0);
+}
+
+
+/* check that the pointer points within the file */
+/* returns 0 if pointer is good, 1 if bad */
+static int
+badpointer(
+ void *ptr
+)
+{
+ return (ptr < (void *)filebuffer || ptr >= (void *)filebuffer_end);
+}
+
+/*
+ * Externally accessible methods
+ */
+
+/*
+ * Open font and prepare to return information to the main driver.
+ * May print error and warning messages.
+ * Exit on error.
+ */
+
+static void
+openfont(
+ char *fname,
+ char *arg /* unused now */
+)
+{
+ int i, j;
+ struct stat statbuf;
+ static struct {
+ void **tbpp; /* pointer to pointer to the table */
+ char name[5]; /* table name */
+ char optional; /* flag: table may be missing */
+ } tables[] = {
+ { (void **)&name_table, "name", 0 },
+ { (void **)&head_table, "head", 0 },
+ { (void **)&hhea_table, "hhea", 0 },
+ { (void **)&post_table, "post", 0 },
+ { (void **)&glyf_start, "glyf", 0 },
+ { (void **)&cmap_table, "cmap", 0 },
+ { (void **)&kern_table, "kern", 1 },
+ { (void **)&maxp_table, "maxp", 0 },
+ { (void **)&hmtx_table, "hmtx", 0 },
+ { (void **)&long_loca_table, "loca", 0 },
+ { NULL, "", 0 } /* end of table */
+ };
+
+ if (stat(fname, &statbuf) == -1) {
+ fprintf(stderr, "**** Cannot access %s ****\n", fname);
+ exit(1);
+ }
+ if ((filebuffer = malloc(statbuf.st_size)) == NULL) {
+ fprintf(stderr, "**** Cannot malloc space for file ****\n");
+ exit(1);
+ }
+
+ filebuffer_end = filebuffer + statbuf.st_size;
+
+ if ((ttf_file = fopen(fname, "rb")) == NULL) {
+ fprintf(stderr, "**** Cannot open file '%s'\n", fname);
+ exit(1);
+ } else {
+ WARNING_2 fprintf(stderr, "Processing file %s\n", fname);
+ }
+
+ if (fread(filebuffer, 1, statbuf.st_size, ttf_file) != statbuf.st_size) {
+ fprintf(stderr, "**** Could not read whole file \n");
+ exit(1);
+ }
+ fclose(ttf_file);
+
+ directory = (TTF_DIRECTORY *) filebuffer;
+
+ if (ntohl(directory->sfntVersion) != 0x00010000) {
+ fprintf(stderr,
+ "**** Unknown File Version number [%x], or not a TrueType file\n",
+ directory->sfntVersion);
+ exit(1);
+ }
+
+ /* clear the tables */
+ for(j=0; tables[j].tbpp != NULL; j++)
+ *(tables[j].tbpp) = NULL;
+
+ dir_entry = &(directory->list);
+
+ for (i = 0; i < ntohs(directory->numTables); i++) {
+
+ for(j=0; tables[j].tbpp != NULL; j++)
+ if (memcmp(dir_entry->tag, tables[j].name, 4) == 0) {
+ *(tables[j].tbpp) = (void *) (filebuffer + ntohl(dir_entry->offset));
+ break;
+ }
+
+ if (memcmp(dir_entry->tag, "EBDT", 4) == 0 ||
+ memcmp(dir_entry->tag, "EBLC", 4) == 0 ||
+ memcmp(dir_entry->tag, "EBSC", 4) == 0) {
+ WARNING_1 fprintf(stderr, "Font contains bitmaps\n");
+ }
+ dir_entry++;
+ }
+
+ for(j=0; tables[j].tbpp != NULL; j++)
+ if(!tables[j].optional && badpointer( *(tables[j].tbpp) )) {
+ fprintf(stderr, "**** File contains no required table '%s'\n", tables[j].name);
+ exit(1);
+ }
+
+ handle_name();
+
+ handle_head();
+
+ ttf_nglyphs = ntohs(maxp_table->numGlyphs);
+
+ enc_found_ms = enc_found_mac = 0;
+}
+
+/*
+ * Close font.
+ * Exit on error.
+ */
+
+static void
+closefont(
+ void
+)
+{
+ return; /* empty operation */
+}
+
+/*
+ * Get the number of glyphs in font.
+ */
+
+static int
+getnglyphs (
+ void
+)
+{
+ return ttf_nglyphs;
+}
+
+/*
+ * Get the names of the glyphs.
+ * Returns 0 if the names were assigned, non-zero if the font
+ * provides no glyph names.
+ */
+
+static int
+glnames(
+ GLYPH *glyph_list
+)
+{
+ int i, len, n, npost;
+ unsigned int format;
+ USHORT *name_index;
+ char *ptr, *p;
+ char **ps_name_ptr = (char **) malloc(ttf_nglyphs * sizeof(char *));
+ int n_ps_names;
+ int ps_fmt_3 = 0;
+
+ format = ntohl(post_table->formatType);
+
+ if (format == 0x00010000) {
+ for (i = 0; i < 258 && i < ttf_nglyphs; i++) {
+ glyph_list[i].name = mac_glyph_names[i];
+ }
+ } else if (format == 0x00020000) {
+ npost = ntohs(post_table->numGlyphs);
+ if (ttf_nglyphs != npost) {
+ /* This is an error in the font, but we can now cope */
+ WARNING_1 fprintf(stderr, "**** Postscript table size mismatch %d/%d ****\n",
+ npost, ttf_nglyphs);
+ }
+ n_ps_names = 0;
+ name_index = &(post_table->glyphNameIndex);
+
+ /* This checks the integrity of the post table */
+ for (i=0; i<npost; i++) {
+ n = ntohs(name_index[i]);
+ if (n > n_ps_names + 257) {
+ n_ps_names = n - 257;
+ }
+ }
+
+ ptr = (char *) post_table + 34 + (ttf_nglyphs << 1);
+ i = 0;
+ while (*ptr > 0 && i < n_ps_names) {
+ len = *ptr;
+ /* previously the program wrote nulls into the table. If the table
+ was corrupt, this could put zeroes anywhere, leading to obscure bugs,
+ so now I malloc space for the names. Yes it is much less efficient */
+
+ if ((p = malloc(len+1)) == NULL) {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+
+ ps_name_ptr[i] = p;
+ strncpy(p, ptr+1, len);
+ p[len] = '\0';
+ i ++;
+ ptr += len + 1;
+ }
+
+ if (i != n_ps_names)
+ {
+ WARNING_2 fprintf (stderr, "** Postscript Name mismatch %d != %d **\n",
+ i, n_ps_names);
+ n_ps_names = i;
+ }
+
+ /*
+ * for (i=0; i<n_ps_names; i++) { fprintf(stderr, "i=%d,
+ * len=%d, name=%s\n", i, ps_name_len[i], ps_name_ptr[i]); }
+ */
+
+ for (i = 0; i < npost; i++) {
+ n = ntohs(name_index[i]);
+ if (n < 258) {
+ glyph_list[i].name = mac_glyph_names[n];
+ } else if (n < 258 + n_ps_names) {
+ glyph_list[i].name = ps_name_ptr[n - 258];
+ } else {
+ glyph_list[i].name = malloc(10);
+ sprintf(glyph_list[i].name, "_%d", n);
+ WARNING_2 fprintf(stderr,
+ "**** Glyph No. %d has no postscript name, becomes %s ****\n",
+ i, glyph_list[i].name);
+ }
+ }
+ /* Now fake postscript names for all those beyond the end of the table */
+ if (npost < ttf_nglyphs) {
+ for (i=npost; i<ttf_nglyphs; i++) {
+ if ((glyph_list[i].name = malloc(10)) == NULL)
+ {
+ fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ exit(255);
+ }
+ sprintf(glyph_list[i].name, "_%d", i);
+ WARNING_2 fprintf(stderr,
+ "** Glyph No. %d has no postscript name, becomes %s **\n",
+ i, glyph_list[i].name);
+ }
+ }
+ } else if (format == 0x00030000) {
+ WARNING_3 fputs("No postscript table, using default\n", stderr);
+ ps_fmt_3 = 1;
+ } else if (format == 0x00028000) {
+ ptr = (char *) &(post_table->numGlyphs);
+ for (i = 0; i < ttf_nglyphs; i++) {
+ glyph_list[i].name = mac_glyph_names[i + ptr[i]];
+ }
+ } else {
+ fprintf(stderr,
+ "**** Postscript table in wrong format %x ****\n",
+ format);
+ exit(1);
+ }
+
+ return ps_fmt_3;
+}
+
+/*
+ * Get the metrics of the glyphs.
+ */
+
+static void
+glmetrics(
+ GLYPH *glyph_list
+)
+{
+ int i;
+ int n_hmetrics = ntohs(hhea_table->numberOfHMetrics);
+ GLYPH *g;
+ LONGHORMETRIC *hmtx_entry = hmtx_table;
+ FWORD *lsblist;
+
+ for (i = 0; i < n_hmetrics; i++) {
+ g = &(glyph_list[i]);
+ g->width = ntohs(hmtx_entry->advanceWidth);
+ g->lsb = ntohs(hmtx_entry->lsb);
+ hmtx_entry++;
+ }
+
+ lsblist = (FWORD *) hmtx_entry;
+ hmtx_entry--;
+
+ for (i = n_hmetrics; i < ttf_nglyphs; i++) {
+ g = &(glyph_list[i]);
+ g->width = ntohs(hmtx_entry->advanceWidth);
+ g->lsb = ntohs(lsblist[i - n_hmetrics]);
+ }
+
+ for (i = 0; i < ttf_nglyphs; i++) {
+ g = &(glyph_list[i]);
+ get_glyf_table(i, &glyf_table, &g->ttf_pathlen);
+
+ g->xMin = (short)ntohs(glyf_table->xMin);
+ g->xMax = (short)ntohs(glyf_table->xMax);
+ g->yMin = (short)ntohs(glyf_table->yMin);
+ g->yMax = (short)ntohs(glyf_table->yMax);
+ }
+
+}
+
+
+static void
+handle_ms_encoding(
+ GLYPH *glyph_list,
+ int *encoding,
+ int *unimap
+)
+{
+ int j, k, kk, set_ok;
+ USHORT start, end, ro;
+ short delta, n;
+
+ for (j = 0; j < cmap_n_segs - 1; j++) {
+ start = ntohs(cmap_seg_start[j]);
+ end = ntohs(cmap_seg_end[j]);
+ delta = ntohs(cmap_idDelta[j]);
+ ro = ntohs(cmap_idRangeOffset[j]);
+
+ for (k = start; k <= end; k++) {
+ if (ro == 0) {
+ n = k + delta;
+ } else {
+ n = ntohs(*((ro >> 1) + (k - start) +
+ &(cmap_idRangeOffset[j])));
+ if (delta != 0)
+ {
+ /* Not exactly sure how to deal with this circumstance,
+ I suspect it never occurs */
+ n += delta;
+ fprintf (stderr,
+ "rangeoffset and delta both non-zero - %d/%d",
+ ro, delta);
+ }
+ }
+ if(n<0 || n>=ttf_nglyphs) {
+ WARNING_1 fprintf(stderr, "Font contains a broken glyph code mapping, ignored\n");
+ continue;
+ }
+ if (glyph_list[n].orig_code != -1) {
+ if (strcmp(glyph_list[n].name, ".notdef") != 0) {
+ WARNING_2 fprintf(stderr,
+ "Glyph %s has >= two encodings (A), %4.4x & %4.4x\n",
+ glyph_list[n].name,
+ glyph_list[n].orig_code,
+ k);
+ }
+ set_ok = 0;
+ } else {
+ set_ok = 1;
+ }
+ if (enc_type==1 || forceunicode) {
+ kk = unicode_rev_lookup(k);
+ if(ISDBG(UNICODE))
+ fprintf(stderr, "Unicode %s - 0x%04x\n",glyph_list[n].name,k);
+ if (set_ok) {
+ glyph_list[n].orig_code = k;
+ /* glyph_list[n].char_no = kk; */
+ }
+ if ((kk & ~0xff) == 0 && encoding[kk] == -1)
+ encoding[kk] = n;
+ } else {
+ if ((k & 0xff00) == 0xf000) {
+ if( encoding[k & 0x00ff] == -1 ) {
+ encoding[k & 0x00ff] = n;
+ if (set_ok) {
+ /* glyph_list[n].char_no = k & 0x00ff; */
+ glyph_list[n].orig_code = k;
+ }
+ }
+ } else {
+ if (set_ok) {
+ /* glyph_list[n].char_no = k; */
+ glyph_list[n].orig_code = k;
+ }
+ WARNING_2 fprintf(stderr,
+ "Glyph %s has non-symbol encoding %4.4x\n",
+ glyph_list[n].name,
+ k & 0xffff);
+ /*
+ * just use the code
+ * as it is
+ */
+ if ((k & ~0xff) == 0 && encoding[k] == -1 )
+ encoding[k] = n;
+ }
+ }
+ }
+ }
+}
+
+static void
+handle_mac_encoding(
+ GLYPH *glyph_list,
+ int *encoding,
+ int *unimap
+)
+{
+ short n;
+ int j, size;
+
+ size = ntohs(encoding0->length) - 6;
+ for (j = 0; j < size; j++) {
+ n = encoding0->glyphIdArray[j];
+ if (glyph_list[n].char_no != -1) {
+ WARNING_2 fprintf(stderr,
+ "Glyph %s has >= two encodings (B), %4.4x & %4.4x\n",
+ glyph_list[n].name,
+ glyph_list[n].char_no,
+ j);
+ } else {
+ if (j < 256) {
+ if(encoding[j] == -1) {
+ glyph_list[n].char_no = j;
+ encoding[j] = n;
+ }
+ }
+ }
+ }
+}
+
+/*
+ * Get the original encoding of the font.
+ * Returns 1 for if the original encoding is Unicode, 2 if the
+ * original encoding is other 16-bit, 0 if 8-bit.
+ */
+
+static int
+glenc(
+ GLYPH *glyph_list,
+ int *encoding,
+ int *unimap
+)
+{
+ int num_tables = ntohs(cmap_table->numberOfEncodingTables);
+ BYTE *ptr;
+ int i, format, offset, seg_c2, found;
+ int platform, encoding_id;
+ TTF_CMAP_ENTRY *table_entry;
+ TTF_CMAP_FMT4 *encoding4;
+
+ if(enc_found_ms) {
+ handle_ms_encoding(glyph_list, encoding, unimap);
+ return enc_type;
+ } else if(enc_found_mac) {
+ handle_mac_encoding(glyph_list, encoding, unimap);
+ return 0;
+ }
+
+ if(force_pid != -1 && force_pid != 3) {
+ fputs("*** Only platform ID == 3 is supported\n", stderr);
+ exit(1);
+ }
+
+ enc_type = 0;
+ found = 0;
+
+ for (i = 0; i < num_tables && !found; i++) {
+ table_entry = &(cmap_table->encodingTable[i]);
+ offset = ntohl(table_entry->offset);
+ encoding4 = (TTF_CMAP_FMT4 *) ((BYTE *) cmap_table + offset);
+ format = ntohs(encoding4->format);
+ platform = ntohs(table_entry->platformID);
+ encoding_id = ntohs(table_entry->encodingID);
+
+ if (platform == 3 && format == 4) {
+ if(force_pid == 3) {
+ if(encoding_id != force_eid)
+ continue;
+ WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n",
+ force_pid, force_eid);
+ enc_type = 1;
+ } else {
+ switch (encoding_id) {
+ case 0:
+ WARNING_1 fputs("Found Symbol Encoding\n", stderr);
+ break;
+ case 1:
+ WARNING_1 fputs("Found Unicode Encoding\n", stderr);
+ enc_type = 1;
+ break;
+ default:
+ WARNING_1 {
+ fprintf(stderr,
+ "****MS Encoding ID %d not supported****\n",
+ encoding_id);
+ fputs("Treating it like Symbol encoding\n", stderr);
+ }
+ break;
+ }
+ if (forceunicode) {
+ WARNING_1 fputs("Forcing Unicode Encoding\n", stderr);
+ }
+ }
+
+ found = 1;
+ seg_c2 = ntohs(encoding4->segCountX2);
+ cmap_n_segs = seg_c2 >> 1;
+ ptr = (BYTE *) encoding4 + 14;
+ cmap_seg_end = (USHORT *) ptr;
+ cmap_seg_start = (USHORT *) (ptr + seg_c2 + 2);
+ cmap_idDelta = (short *) (ptr + (seg_c2 * 2) + 2);
+ cmap_idRangeOffset = (short *) (ptr + (seg_c2 * 3) + 2);
+ enc_found_ms = 1;
+
+ handle_ms_encoding(glyph_list, encoding, unimap);
+ }
+ }
+
+ if (!found) {
+ if(force_pid != -1) {
+ fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n",
+ force_pid, force_eid);
+ exit(1);
+ }
+
+ WARNING_1 fputs("No Microsoft encoding, looking for MAC encoding\n", stderr);
+ for (i = 0; i < num_tables && !found; i++) {
+ table_entry = &(cmap_table->encodingTable[i]);
+ offset = ntohl(table_entry->offset);
+ encoding0 = (TTF_CMAP_FMT0 *) ((BYTE *) cmap_table + offset);
+ format = ntohs(encoding0->format);
+ platform = ntohs(table_entry->platformID);
+ encoding_id = ntohs(table_entry->encodingID);
+
+ if (format == 0) {
+ found = 1;
+ enc_found_mac = 1;
+
+ handle_mac_encoding(glyph_list, encoding, unimap);
+ }
+ }
+ }
+ if (!found) {
+ fprintf(stderr, "**** No Recognised Encoding Table ****\n");
+ exit(1);
+ }
+
+ return enc_type;
+}
+
+/*
+ * Get the font metrics
+ */
+static void
+fnmetrics(
+ struct font_metrics *fm
+)
+{
+ char *str;
+ static int fieldstocheck[]= {2,4,6};
+ int i;
+
+ fm->italic_angle = (short) (ntohs(post_table->italicAngle.upper)) +
+ ((short) ntohs(post_table->italicAngle.lower) / 65536.0);
+ fm->underline_position = (short) ntohs(post_table->underlinePosition);
+ fm->underline_thickness = (short) ntohs(post_table->underlineThickness);
+ fm->is_fixed_pitch = ntohl(post_table->isFixedPitch);
+
+ fm->ascender = (short)ntohs(hhea_table->ascender);
+ fm->descender = (short)ntohs(hhea_table->descender);
+
+ fm->units_per_em = ntohs(head_table->unitsPerEm);
+
+ fm->bbox[0] = (short) ntohs(head_table->xMin);
+ fm->bbox[1] = (short) ntohs(head_table->yMin);
+ fm->bbox[2] = (short) ntohs(head_table->xMax);
+ fm->bbox[3] = (short) ntohs(head_table->yMax);
+
+ fm->name_copyright = name_fields[0];
+ fm->name_family = name_fields[1];
+ fm->name_style = name_fields[2];
+ fm->name_full = name_fields[4];
+ fm->name_version = name_fields[5];
+ fm->name_ps = name_fields[6];
+
+ /* guess the boldness from the font names */
+ fm->force_bold=0;
+
+ for(i=0; !fm->force_bold && i<sizeof fieldstocheck /sizeof(int); i++) {
+ str=name_fields[fieldstocheck[i]];
+ for(i=0; str[i]!=0; i++) {
+ if( (str[i]=='B'
+ || str[i]=='b'
+ && ( i==0 || !isalpha(str[i-1]) )
+ )
+ && !strncmp("old",&str[i+1],3)
+ && !islower(str[i+4])
+ ) {
+ fm->force_bold=1;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * Get the path of contrours for a glyph.
+ */
+
+static void
+glpath(
+ int glyphno,
+ GLYPH *glyf_list
+)
+{
+ double matrix[6];
+ GLYPH *g;
+
+ g = &glyph_list[glyphno];
+
+ matrix[0] = matrix[3] = 1.0;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0.0;
+ draw_composite_glyf(g, glyf_list, glyphno, matrix, 0 /*level*/);
+}
+
+/*
+ * Get the kerning data.
+ */
+
+static void
+kerning(
+ GLYPH *glyph_list
+)
+{
+ TTF_KERN_SUB *subtable;
+ TTF_KERN_ENTRY *kern_entry;
+ int i, j;
+ int ntables;
+ int npairs;
+ char *ptr;
+
+ if(kern_table == NULL) {
+ WARNING_1 fputs("No Kerning data\n", stderr);
+ return;
+ }
+ if(badpointer(kern_table)) {
+ fputs("**** Defective Kerning table, ignored\n", stderr);
+ return;
+ }
+
+ ntables = ntohs(kern_table->nTables);
+ ptr = (char *) kern_table + 4;
+
+ for (i = 0; i < ntables; i++) {
+ subtable = (TTF_KERN_SUB *) ptr;
+ if ((ntohs(subtable->coverage) & 0xff00) == 0) {
+ npairs = (short) ntohs(subtable->nPairs);
+ kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB));
+
+ kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB));
+ for (j = 0; j < npairs; j++) {
+ if( kern_entry->value != 0)
+ addkernpair(ntohs(kern_entry->left),
+ ntohs(kern_entry->right), (short)ntohs(kern_entry->value));
+ kern_entry++;
+ }
+ }
+ ptr += subtable->length;
+ }
+}
+
diff --git a/fonts/utilities/ttf2pt1/ttf.h b/fonts/utilities/ttf2pt1/ttf.h
new file mode 100644
index 0000000000..8c38808d6f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf.h
@@ -0,0 +1,172 @@
+/*
+ * see COPYRIGHT
+ */
+
+/* these definitions are mostly taken from Microsoft's True Type
+ documentation.
+*/
+
+#define BYTE unsigned char
+#define CHAR signed char
+#define USHORT unsigned short
+#define SHORT signed short
+#define ULONG unsigned int
+#define LONG signed int
+#define FWORD SHORT
+#define UFWORD USHORT
+
+#define ONOROFF 0x01
+#define XSHORT 0x02
+#define YSHORT 0x04
+#define REPEAT 0x08
+#define XSAME 0x10
+#define YSAME 0x20
+
+#define ARG_1_AND_2_ARE_WORDS 0x0001
+#define ARGS_ARE_XY_VALUES 0x0002
+#define XY_BOUND_TO_GRID 0x0004
+#define WE_HAVE_A_SCALE 0x0008
+#define MORE_COMPONENTS 0x0020
+#define WE_HAVE_AN_X_AND_Y_SCALE 0x0040
+#define WE_HAVE_A_TWO_BY_TWO 0x0080
+#define WE_HAVE_INSTRUCTIONS 0x0100
+#define USE_MY_METRICS 0x0200
+
+typedef struct short_2 {
+ SHORT upper;
+ USHORT lower;
+} FIXED ;
+
+typedef struct longhormetric {
+ UFWORD advanceWidth;
+ FWORD lsb;
+} LONGHORMETRIC;
+
+typedef struct ttf_hhea {
+ BYTE version[4];
+ SHORT ascender, descender, lineGap;
+ USHORT advnaceWidthMax;
+ SHORT minLSB, minRSB, xMaxExtent;
+ SHORT caretSlopeRise, caretSlopeRun;
+ SHORT reserved[5];
+ SHORT metricDataFormat;
+ USHORT numberOfHMetrics;
+} TTF_HHEA;
+
+typedef struct ttf_dir_entry {
+ char tag[4];
+ ULONG checksum;
+ ULONG offset;
+ ULONG length;
+} TTF_DIR_ENTRY ;
+
+typedef struct ttf_directory {
+ ULONG sfntVersion;
+ USHORT numTables;
+ USHORT searchRange;
+ USHORT entrySelector;
+ USHORT rangeShift;
+ TTF_DIR_ENTRY list;
+} TTF_DIRECTORY ;
+
+typedef struct ttf_name_rec {
+ USHORT platformID;
+ USHORT encodingID;
+ USHORT languageID;
+ USHORT nameID;
+ USHORT stringLength;
+ USHORT stringOffset;
+} TTF_NAME_REC;
+
+typedef struct ttf_name {
+ USHORT format;
+ USHORT numberOfNameRecords;
+ USHORT offset;
+ TTF_NAME_REC nameRecords;
+} TTF_NAME ;
+
+typedef struct ttf_head {
+ ULONG version;
+ ULONG fontRevision;
+ ULONG checksumAdjust;
+ ULONG magicNo;
+ USHORT flags;
+ USHORT unitsPerEm;
+ BYTE created[8];
+ BYTE modified[8];
+ FWORD xMin, yMin, xMax, yMax;
+ USHORT macStyle, lowestRecPPEM;
+ SHORT fontDirection, indexToLocFormat, glyphDataFormat;
+} TTF_HEAD ;
+
+typedef struct ttf_kern {
+ USHORT version, nTables;
+} TTF_KERN ;
+
+typedef struct ttf_kern_sub {
+ USHORT version, length, coverage;
+ USHORT nPairs, searchRange, entrySelector, rangeShift;
+} TTF_KERN_SUB;
+
+typedef struct ttf_kern_entry {
+ USHORT left, right;
+ FWORD value;
+} TTF_KERN_ENTRY;
+
+typedef struct ttf_cmap_fmt0 {
+ USHORT format;
+ USHORT length;
+ USHORT version;
+ BYTE glyphIdArray[256];
+} TTF_CMAP_FMT0;
+
+typedef struct ttf_cmap_fmt4 {
+ USHORT format;
+ USHORT length;
+ USHORT version;
+ USHORT segCountX2;
+ USHORT searchRange;
+ USHORT entrySelector;
+ USHORT rangeShift;
+} TTF_CMAP_FMT4;
+
+typedef struct ttf_cmap_entry {
+ USHORT platformID;
+ USHORT encodingID;
+ ULONG offset;
+} TTF_CMAP_ENTRY;
+
+typedef struct ttf_cmap {
+ USHORT version;
+ USHORT numberOfEncodingTables;
+ TTF_CMAP_ENTRY encodingTable[1];
+} TTF_CMAP ;
+
+typedef struct ttf_glyf {
+ SHORT numberOfContours;
+ FWORD xMin, yMin, xMax, yMax;
+} TTF_GLYF ;
+
+typedef struct ttf_maxp {
+ ULONG version;
+ USHORT numGlyphs, maxPoints, maxContours;
+ USHORT maxCompositePoints, maxCompositeContours;
+ USHORT maxZones, maxTwilightPoints, maxStorage;
+ USHORT maxFunctionDefs, maxInstructionsDefs;
+ USHORT maxSizeOfInstructions, maxComponentElements;
+ USHORT maxComponentDepth;
+} TTF_MAXP ;
+
+typedef struct ttf_post_head {
+ ULONG formatType;
+ FIXED italicAngle;
+ FWORD underlinePosition;
+ FWORD underlineThickness;
+ ULONG isFixedPitch;
+ ULONG minMemType42;
+ ULONG maxMemType42;
+ ULONG minMemType1;
+ ULONG maxMemType1;
+ USHORT numGlyphs;
+ USHORT glyphNameIndex;
+} TTF_POST_HEAD ;
diff --git a/fonts/utilities/ttf2pt1/ttf2pt1.1 b/fonts/utilities/ttf2pt1/ttf2pt1.1
new file mode 100644
index 0000000000..92bba0a321
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf2pt1.1
@@ -0,0 +1,765 @@
+.rn '' }`
+''' $RCSfile$$Revision$$Date$
+'''
+''' $Log$
+'''
+.de Sh
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp
+.if t .sp .5v
+.if n .sp
+..
+.de Ip
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve
+.ft R
+
+.fi
+..
+'''
+'''
+''' Set up \*(-- to give an unbreakable dash;
+''' string Tr holds user defined translation string.
+''' Bell System Logo is used as a dummy character.
+'''
+.tr \(*W-|\(bv\*(Tr
+.ie n \{\
+.ds -- \(*W-
+.ds PI pi
+.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+.ds L" ""
+.ds R" ""
+''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
+''' \*(L" and \*(R", except that they are used on ".xx" lines,
+''' such as .IP and .SH, which do another additional levels of
+''' double-quote interpretation
+.ds M" """
+.ds S" """
+.ds N" """""
+.ds T" """""
+.ds L' '
+.ds R' '
+.ds M' '
+.ds S' '
+.ds N' '
+.ds T' '
+'br\}
+.el\{\
+.ds -- \(em\|
+.tr \*(Tr
+.ds L" ``
+.ds R" ''
+.ds M" ``
+.ds S" ''
+.ds N" ``
+.ds T" ''
+.ds L' `
+.ds R' '
+.ds M' `
+.ds S' '
+.ds N' `
+.ds T' '
+.ds PI \(*p
+'br\}
+.\" If the F register is turned on, we'll generate
+.\" index entries out stderr for the following things:
+.\" TH Title
+.\" SH Header
+.\" Sh Subsection
+.\" Ip Item
+.\" X<> Xref (embedded
+.\" Of course, you have to process the output yourself
+.\" in some meaninful fashion.
+.if \nF \{
+.de IX
+.tm Index:\\$1\t\\n%\t"\\$2"
+..
+.nr % 0
+.rr F
+.\}
+.TH TTF2PT1 1 "version 3.3.2" "November 20, 2000" "TTF2PT1 Font Converter"
+.UC
+.if n .hy 0
+.if n .na
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.de CQ \" put $1 in typewriter font
+.ft CW
+'if n "\c
+'if t \\&\\$1\c
+'if n \\&\\$1\c
+'if n \&"
+\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+'.ft R
+..
+.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
+. \" AM - accent mark definitions
+.bd B 3
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds ? ?
+. ds ! !
+. ds /
+. ds q
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
+. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
+.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
+.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
+.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.ds oe o\h'-(\w'o'u*4/10)'e
+.ds Oe O\h'-(\w'O'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds v \h'-1'\o'\(aa\(ga'
+. ds _ \h'-1'^
+. ds . \h'-1'.
+. ds 3 3
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+. ds oe oe
+. ds Oe OE
+.\}
+.rm #[ #] #H #V #F C
+.SH "NAME"
+TTF2PT1 \- A True Type to PostScript Type 1 Font Converter
+.SH "SYNOPSIS"
+\f(CWttf2pt1 \fI[-options] ttffont.ttf [Fontname]\fR\fR
+.PP
+or
+.PP
+\f(CWttf2pt1 \fI[-options] ttffont.ttf -\fR\fR
+.SH "DESCRIPTION"
+Ttf2pt1 is a font converter from the True Type format (and some other formats
+supported by the FreeType library as well) to the Adobe Type1 format.
+.PP
+The versions 3.0 and later got rather extensive post-processing algorithm that
+brings the converted fonts to the requirements of the Type1 standard, tries to
+correct the rounding errors introduced during conversions and some simple
+kinds of bugs that are typical for the public domain TTF fonts. It
+also generates the hints that enable much better rendering of fonts in
+small sizes that are typical for the computer displays. But everything
+has its price, and some of the optimizations may not work well for certain
+fonts. That's why the options were added to the converter, to control
+the performed optimizations.
+.SH "OPTIONS"
+The first variant creates the file \f(CWFontname.pfa\fR (or \f(CWFontname.pfb\fR if the
+option `\fB\-b\fR\*(R' was used) with the converted font and \f(CWFontname.afm\fR with the
+font metrics, the second one prints the font or the font metrics (if the option
+`\fB\-A\fR\*(R' was used) on the standard output from where it can be immediately
+piped through some filter. If no \f(CWFontname\fR is specified for the first
+variant, the name is generated from \f(CWttffont\fR by replacing the \f(CW.ttf\fR
+filename suffix.
+.PP
+Most of the time no options are neccessary (with a possible exception
+of `\fB\-e\fR'). But if there are some troubles with the resulting font, they
+may be used to control the conversion.
+The \fBoptions\fR are:
+.Ip "\(bu" 2
+\f(CW\fB-a\fR\fR \- Include all the glyphs from the source file into the converted
+file. If this option is not specified then only the glyphs that have
+been assigned some encoding are included, because the rest of glyphs
+would be inaccessible anyway and would only consume the disk space.
+But some applications are clever enough to change the encoding on
+the fly and thus use the other glyphs, in this case they could
+benefit from using this option. But there is a catch: the X11 library
+has rather low limit for the font size. Including more glyphs increases
+the file size and thus increases the chance of hitting this limit.
+See \f(CWapp/X11/README\fR for the description of a
+patch to X11 which fixes this problem.
+.Ip "\(bu" 2
+\f(CW\fB-A\fR\fR \- Print the font metrics (.afm file) instead of the font on \s-1STDOUT\s0
+.Ip "\(bu" 2
+\f(CW\fB-b\fR\fR \- Encode the resulting font to produce a ready \f(CW.pfb\fR file.
+.Ip "\(bu" 2
+\f(CW\fB-d \fIsuboptions\fR\fR\fR \- Debugging options. The suboptions are:
+.Sp
+\f(CW\fBa\fR\fR \- Print out the absolute coordinates of dots in outlines. Such
+a font can not be used by any program (that's why this option is
+incompatible with `\fB\-e\fR') but it has proven to be a valuable debuging
+information.
+.Sp
+\f(CW\fBr\fR\fR \- Do not reverse the direction of outlines. The \s-1TTF\s0 fonts have
+the standard direction of outlines opposite to the Type1 fonts. So
+they should be reversed during proper conversion. This option
+may be used for debugging or to handle a \s-1TTF\s0 font with wrong
+direction of outlines (possibly, converted in a broken way from
+a Type1 font). The first signs of the wrong direction are the
+letters like \*(L"P\*(R" or \*(L"B\*(R" without the unpainted \*(L"holes\*(R" inside.
+.Ip "\(bu" 2
+\f(CW\fB-e\fR\fR \- Assemble the resulting font to produce a ready \f(CW.pfa\fR file.
+.Sp
+[ S.B.: Personally I don't think that this option is particularly useful.
+The same result may be achieved by piping the unassembled data
+through t1asm, the Type 1 assembler. And, anyways, it's good to
+have the t1utils package handy. But Mark and many users think that
+this functionality is good and it took not much time to add this option. ]
+.Ip "\(bu" 2
+\f(CW\fB-F\fR\fR \- Force the Unicode encoding: any type of \s-1MS\s0 encoding specified
+in the font is ignored and the font is treated like it has Unicode
+encoding. \fB\s-1WARNING\s0:\fR this option is intended for buggy fonts
+which actually are in Unicode but are marked as something else. The
+effect on the other fonts is unpredictable.
+.Ip "\(bu" 2
+\f(CW\fB-l \fIlanguage\fR[+\fIargument\fR]\fR\fR \- Extract the fonts for the specified language from a
+multi-language Unicode font. If this option is not used the converter
+tries to guess the language by the values of the shell variable \s-1LANG\s0.
+If it is not able to guess the language by \s-1LANG\s0 it tries all the
+languages in the order they are listed.
+.Sp
+After the plus sign an optional argument for the language extractor
+may be specified. The format of the argument is absolutely up to
+the particular language converter. The primary purpose of the
+argument is to support selection of planes for the multi-plane
+Eastern encodings but it can also be used in any other way. The
+language extractor may decide to add the plane name in some form
+to the name of the resulting font. None of the currently supported
+languages make any use of the argument yet.
+.Sp
+As of now the following languages are supported:
+.Sp
+\ \ \f(CWlatin1\fR \- for all the languages using the Latin-1 encoding
+.Sp
+\ \ \f(CWlatin2\fR \- for the Central European languages
+.Sp
+\ \ \f(CWlatin4\fR \- for the Baltic languages
+.Sp
+\ \ \f(CWlatin5\fR \- for the Turkish language
+.Sp
+\ \ \f(CWrussian\fR \- for the Russian language
+.Sp
+\ \ \f(CWbulgarian\fR \- for the Bulgarian language
+.Sp
+\ \ \f(CWadobestd\fR \- for the AdobeStandard encoding used by TeX
+.Sp
+\ \ \f(CWplane+\fIargument\fR\fR \- to select one plane from a multi-byte encoding
+.Sp
+The argument of the \*(L"\f(CWplane\fR\*(R" language may be in one of three forms:
+.Sp
+\ \ \f(CWplane+\fBpid=\fR\fI<pid>\fR\fB,eid=\fR\fI<eid>\fR\fR
+.Sp
+\ \ \f(CWplane+\fBpid=\fR\fI<pid>\fR\fB,eid=\fR\fI<eid>\fR\fB,\fR\fI<plane_number>\fR\fR
+.Sp
+\ \ \f(CWplane+\fI<plane_number>\fR\fR
+.Sp
+Pid (\s-1TTF\s0 platform id) and eid (\s-1TTF\s0 encoding id) select a particular
+\s-1TTF\s0 encoding table in the original font. They are specified as decimal
+numbers. If this particular encoding table is not present in the font
+file then the conversion fails. The native ("ttf") front-end parser supports
+only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports
+any platform. If pid/eid is not specified then the \s-1TTF\s0 encoding table is
+determined as usual: Unicode encoding if it's first or an 8-bit encoding
+if not (and for an 8-bit encoding the plane number is silently ignored).
+To prevent the converter from falling back to an 8-bit encoding, specify
+the Unicode pid/eid value explicitly.
+.Sp
+Plane_number is a hexadecimal (if starts with \*(L"\fB0x\fR") or decimal number.
+It gives the values of upper bytes for which 256 characters will be
+selected. If not specified, defaults to 0. It is also used as a font
+name suffix (the leading \*(L"0x\*(R" is not included into the suffix).
+.Sp
+\fB\s-1NOTE\s0:\fR
+You may notice that the language names are not uniform: some are the
+names of particular languages and some are names of encodings. This
+is because of the different approaches. The original idea was to
+implement a conversion from Unicode to the appropriate Windows
+encoding for a given language. And then use the translation tables
+to generate the fonts in whatever final encodings are needed. This
+would allow to pile together the Unicode fonts and the non-Unicode
+Windows fonts for that language and let the program to sort them out
+automatically. And then generate fonts in all the possible encodings
+for that language. An example of this approach is the Russian language
+support. But if there is no multiplicity of encodings used for some
+languages and if the non-Unicode fonts are not considered important
+by the users, another way would be simpler to implement: just provide
+only one table for extraction of the target encoding from Unicode
+and don't bother with the translation tables. The latin* \*(L"languages\*(R"
+are examples of this approach. If somebody feels that he needs the
+Type1 fonts both in Latin-* and Windows encodings he or she is absolutely
+welcome to submit the code to implement it.
+.Sp
+\fB\s-1WARNING\s0:\fR
+Some of the glyphs included into the AdobeStandard encoding are not
+included into the Unicode standard. The most typical examples of such
+glyphs are ligatures like `fi\*(R', `fl\*(R' etc. Because of this the font
+designers may place them at various places. The converter tries to
+do its best, if the glyphs have honest Adobe names and/or are
+placed at the same codes as in the Microsoft fonts they will be
+picked up. Otherwise a possible solution is to use the option `\fB\-L\fR\*(R'
+with an external map.
+.Ip "\(bu" 2
+\f(CW\fB-L \fIfile\fR[+\fIplane\fR]\fR\fR \- Extract the fonts for the specified language from the
+multi-language Unicode font using the map from this file. This is
+rather like the option `\fB\-l\fR\*(R' but the encoding map is not
+compiled into the program, it's taken from that file, so it's
+easy to edit. Examples of such files are provided in
+\f(CWmaps/adobe-standard-encoding.map\fR, \f(CWCP1250.map\fR. (\fB\s-1NOTE\s0:\fR
+the `standard encoding\*(R' map does not include all the glyphs of the
+AdobeStandard encoding, it's provided only as an example.) The
+description of the supported map formats is in the file
+\f(CWmaps/unicode-sample.map\fR.
+.Sp
+Likewise to `\fB\-l\fR\*(R', an argument may be specified after the map file
+name. But in this case the argument has fixed meaning: it selects the
+plane of the map file. The plane name also gets added after dash to the
+font name. The plane is a concept used in the Eastern fonts with big
+number of glyphs: one \s-1TTF\s0 font gets divided into multiple Type1 fonts,
+each containing one plane of up to 256 glyphs. But with a little
+creativity this concept may be used for other purposes of combining
+multiple translation maps into one file. To extract multiple planes
+from a \s-1TTF\s0 font \f(CWttf2pt1\fR must be run multiple times, each time with
+a different plane name specified.
+.Ip "\(bu" 2
+\f(CW\fB-m \fItype\fR=\fIvalue\fR\fR\fR \- Set maximal or minimal limits of resources.
+These limits control the the font generation by limiting the resources
+that the font is permitted to require from the PostScript interpreter.
+The currently supported types of limits are:
+.Sp
+\f(CW\fBh\fR\fR \- the maximal hint stack depth for the substituted hints.
+The default value is 128, according to the limitation in X11. This seems to
+be the lowest (and thus the safest) widespread value. To display the
+hint stack depth required by each glyph in a \f(CW.t1a\fR file use the script
+\f(CWscripts/cntstems.pl\fR.
+.Ip "\(bu" 2
+\f(CW\fB-O \fIsuboptions\fR\fR\fR \- Outline processing options. The suboptions
+may be lowercase or uppercase, the lowercase ones disable the features,
+the corresponding uppercase suboptions enable the same features.
+The suboptions to disable/enable features are:
+.Sp
+\f(CW\fBb/B\fR\fR \- Guessing of the ForceBold parameter. This parameter helps
+the Type1 engine to rasterize the bold fonts properly at small sizes.
+But the algorithm used to guess the proper value of this flag makes
+that guess based solely on the font name. In rare cases that may cause
+errors, in these cases you may want to disable this guessing.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBh/H\fR\fR \- Autogeneration of hints. The really complex outlines
+may confuse the algorithm, so theoretically it may be useful
+sometimes to disable them. Although up to now it seems that
+even bad hints are better than no hints at all.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBu/U\fR\fR \- Hint substitution. Hint substitution is a technique
+permitting generation of more detailed hints for the rasterizer. It allows
+to use different sets of hints for different parts of a glyph and change
+these sets as neccessary during rasterization (that's why \*(L"substituted").
+So it should improve the quality of the fonts rendered at small sizes.
+But there are two catches: First, the X11 library has rather low limit for
+the font size. More detailed hints increase the file size and thus increase
+the chance of hitting this limit (that does not mean that you shall hit it
+but you may if your fonts are particularly big). This is especially
+probable for Unicode fonts converted with option `\fB\-a\fR\*(R', so you may want to
+use `\fB\-a\fR\*(R' together with `\fB\-Ou\fR\*(R'. See \f(CWapp/X11/README\fR for the description of
+a patch to X11 which fixes this problem. Second, some rasterizers (again,
+X11 is the typical example) have a limitation for total number of hints
+used when drawing a glyph (also known as the hint stack depth). If that
+stack overflows the glyph is ignored. Starting from version 3.22 \f(CWttf2pt1\fR
+uses algorithms to minimizing this depth, with the trade-off of slightly
+bigger font files. The glyphs which still exceed the limit set by option
+`\fB\-mh\fR\*(R' have all the substituted hints removed and only base hints left.
+The algorithms seem to have been refined far enough to make the fonts with
+substituted hints look better than the fonts without them or at least the
+same. Still if the original fonts are not well-designed the detailed
+hinting may emphasize the defects of the design, such as non-even thickness
+of lines. So provided that you are not afraid of the X11 bug the best idea
+would be to generate a font with this feature and without it, then compare
+the results using the program \f(CWother/cmpf\fR (see the description
+in \f(CWother/README\fR) and decide which one looks better.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBo/O\fR\fR \- Space optimization of the outlines\*(R' code. This kind of optimization
+never hurts, and the only reason to disable this feature is for comparison
+of the generated fonts with the fonts generated by the previous versions of
+converter. Well, it _almost_ never hurts. As it turned out there exist
+some brain-damaged printers which don't understand it. Actually this
+feature does not change the outlines at all. The Type 1 font manual
+provides a set of redundant operators that make font description shorter,
+such as \*(L'10 hlineto\*(R' instead of \*(L'0 10 rlineto\*(R' to describe a horizontal
+line. This feature enables use of these operators.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBs/S\fR\fR \- Smoothing of outlines. If the font is broken in some
+way (even the ones that are not easily noticeable), such smoothing
+may break it further. So disabling this feature is the first thing to be
+tried if some font looks odd. But with smoothing off the hint generation
+algorithms may not work properly too.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBt/T\fR\fR \- Auto-scaling to the 1000x1000 Type1 standard matrix. The
+\s-1TTF\s0 fonts are described in terms of an arbitrary matrix up to
+4000x4000. The converted fonts must be scaled to conform to
+the Type1 standard. But the scaling introduces additional rounding
+errors, so it may be curious sometimes to look at the font in its
+original scale.
+\fBDefault: enabled\fR
+.Sp
+\f(CW\fBw/W\fR\fR \- Glyphs\*(R' width corection. This option is designed to be
+used on broken fonts which specify too narrow widths for the
+letters. You can tell that a font can benefit from this option
+if you see that the characters are smashed together without
+any whitespace between them. This option causes the converter
+to set the character widths to the actual width of this character
+plus the width of a typical vertical stem. But on the other hand
+the well-designed fonts may have characters that look better if
+their widths are set slightly narrower. Such well-designed fonts
+will benefit from disabling this feature. You may want to convert
+a font with and without this feature, compare the results and
+select the better one. This feature may be used only on proportional
+fonts, it has no effect on the fixed-width fonts.
+\fBDefault: disabled\fR
+.Ip "\(bu" 2
+\f(CW\fB-p \fIparser_name\fR\fR\fR \- Use the specified front-end parser to read the font file.
+If this option is not used, ttf2pt1 selects the parser automatically based
+on the suffix of the font file name, it uses the first parser in its
+list that supports this font type. Now two parsers are supported:
+.Sp
+\ \ \f(CWttf\fR \- built-in parser for the ttf files (suffix \f(CW.ttf\fR)
+.Sp
+\ \ \f(CWft\fR \- parser based on the FreeType-2 library (suffixes \f(CW.ttf\fR,
+\&\f(CW.otf\fR, \f(CW.pfa\fR, \f(CW.pfb\fR)
+.Sp
+The parser \f(CWft\fR is \fB\s-1NOT\s0\fR linked in by default. See \f(CWMakefile\fR
+for instructions how to enable it. We do no support this parser on
+Windows: probably it will work but nobody tried and nobody knows how
+to build it.
+.Ip "\(bu" 2
+\f(CW\fB-u \fInumber\fR\fR\fR \- Mark the font with this value as its
+UniqueID. The UniqueID is used by the printers with the hard disks
+to cache the rasterized characters and thus significantly
+speed-up the printing. Some of those printers just can't
+store the fonts without UniqueID on their disk.The problem
+is that the \s-1ID\s0 is supposed to be unique, as it name says. And
+there is no easy way to create a guaranteed unique \s-1ID\s0. Adobe specifies
+the range 4000000-4999999 for private IDs but still it's difficult
+to guarantee the uniqueness within it. So if you don't really need the
+UniqueID don't use it, it's optional. Luckily there are a few millions of
+possible IDs, so the chances of collision are rather low.
+If instead of the number a special value \*(L'\f(CW\fBA\fR\fR\*(R' is given
+then the converter generates the value of UniqueID automatically,
+as a hash of the font name. (\fB\s-1NOTE\s0:\fR in the version 3.22 the
+algorithm for autogeneration of UniqueID was changed to fit the values
+into the Adobe-spacified range. This means that if UniqueIDs were used
+then the printer's cache may need to be flushed before replacing the
+fonts converted by an old version with fonts converted by a newer version).
+A simple way to find if any of the fonts in a given directory have
+duplicated UniqueIDs is to use the command:
+.Sp
+\f(CW\ \ cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 '\fR
+.Sp
+Or if you use \f(CWscripts/convert\fR it will do that for you automatically
+plus it will also give the exact list of files with duplicate UIDs.
+.Ip "\(bu" 2
+\f(CW\fB-v \fIsize\fR\fR\fR \- Re-scale the font to get the size of a typical uppercase
+letter somewhere around the specified size. Actually, it re-scales
+the whole font to get the size of one language-dependent letter to be
+at least of the specified size. Now this letter is \*(L"A\*(R" in all the
+supported languages. The size is specified in the points of the
+Type 1 coordinate grids, the maximal value is 1000. This is an
+experimental option and should be used with caution. It tries to
+increase the visible font size for a given point size and thus make
+the font more readable. But if overused it may cause the fonts to
+look out of scale. As of now the interesting values of size for
+this option seem to be located mostly between 600 and 850. This
+re-scaling may be quite useful but needs more experience to
+understand the balance of its effects.
+.Ip "\(bu" 2
+\f(CW\fB-W \fIlevel\fR\fR\fR \- Select the verbosity level of the warnings.
+Currently the levels from 0 to 4 are supported. Level 0 means no warnings
+at all, level 4 means all the possible warnings. The default level is 3.
+Other levels may be added in the future, so using the level number 99 is
+recommended to get all the possible warnings. Going below level 2 is
+not generally recommended because you may miss valuable information about
+the problems with the fonts being converted.
+.Ip "\(bu" 2
+\fBVery obsolete option:\fR
+.Sp
+The algorithm that implemented the forced fixed width had major
+flaws, so it was disabled. The code is still in the program and
+some day it will be refined and returned back. Meanwhile the
+option name `\fB\-f\fR\*(R' was reused for another option. The old version was:
+.Sp
+\f(CW\fB-f\fR\fR \- Don't try to force the fixed width of font. Normally the converter
+considers the fonts in which the glyph width deviates by not more
+than 5% as buggy fixed width fonts and forces them to have really
+fixed width. If this is undesirable, it can be disabled by this option.
+.PP
+The \f(CW.pfa\fR font format supposes that the description of the characters
+is binary encoded and encrypted. This converter does not encode or
+encrypt the data by default, you have to specify the option `\fB\-e\fR\*(R'
+or use the \f(CWt1asm\fR program to assemble (that means, encode and
+encrypt) the font program. The \f(CWt1asm\fR program that is included with
+the converter is actually a part of the \f(CWt1utils\fR package, rather old
+version of which may be obtained from
+.PP
+http://ttf2pt1.sourceforge.net/t1utils.tar.gz
+.PP
+Note that \f(CWt1asm\fR from the old version of that package won't work properly
+with the files generated by \f(CWttf2pt1\fR version 3.20 and later. Please use
+\f(CWt1asm\fR packaged with \f(CWttf2pt1\fR or from the new version \f(CWt1utils\fR
+instead. For a newer version of \f(CWt1utils\fR please look at
+.PP
+http://www.lcdf.org/~eddietwo/type/
+.SH "EXAMPLES"
+So, the following command lines:
+.PP
+\f(CWttf2pt1 -e ttffont.ttf t1font\fR
+.PP
+\f(CWttf2pt1 ttffont.ttf - | t1asm >t1font.pfa\fR
+.PP
+represent two ways to get a working font. The benefit of the second form
+is that other filters may be applied to the font between the converter
+and assembler.
+.SH "FILES"
+.Ip "\(bu" 2
+\s-1TTF2PT1_LIBXDIR/\s0t1asm
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR\s0/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0scripts/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0other/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/README\s0
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/FONTS\s0
+.SH "SEE ALSO"
+.Ip "\(bu" 4
+the \fIttf2pt1_convert(1)\fR manpage
+.Ip "\(bu" 4
+the \fIttf2pt1_x2gs(1)\fR manpage
+.Ip "\(bu" 4
+the \fIt1asm(1)\fR manpage
+.Ip "\(bu" 4
+ttf2pt1-announce@lists.sourceforge.net
+.Sp
+The mailing list with announcements about ttf2pt1. It is a moderated mailing
+with extremely low traffic. Everyone is encouraged to subscribe to keep in
+touch with the current status of project. To subscribe use the Web interface
+at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce.
+If you have only e-mail access to the Net then send a subscribe request to
+the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody
+will help you with subscription.
+.Ip "\(bu" 4
+ttf2pt1-devel@lists.sourceforge.net
+.Sp
+ttf2pt1-users@lists.sourceforge.net
+.Sp
+The ttf2pt1 mailing lists for development and users issues. They have not
+that much traffic either. To subscribe use the Web interface at
+http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel
+and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users.
+If you have only e-mail access to the Net then send a subscribe request to
+the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody
+will help you with subscription.
+.Ip "\(bu" 4
+http://ttf2pt1.sourceforge.net
+.Sp
+http://www.netspace.net.au/~mheath/ttf2pt1/
+.Sp
+The primary copies of the main page of the project.
+.SH "BUGS"
+It seems that many Eastern fonts use features of the TTF format that are
+not supported by the ttf2pt1's built-in front-end parser. Because of
+this for now we recommend using the FreeType-based parser (option
+`\fB\-p ft\fR') with the \*(L"\f(CWplane\fR\*(R" language.
+.Sh "Troubleshooting and bug reports"
+Have problems with conversion of some font ? The converter dumps core ? Or your
+printer refuses to understand the converted fonts ? Or some characters are
+missing ? Or some characters look strange ?
+.PP
+Send the bug reports to the ttf2pt1 development mailing list at
+ttf2pt1-devel@lists.sourceforge.net.
+.PP
+Try to collect more information about the problem and include it into
+the bug report. (Of course, even better if you would provide a ready
+fix, but just a detailed bug report is also good). Provide detailed
+information about your problem, this will speed up the response greatly.
+Don't just write \*(L"this font looks strange after conversion\*(R" but describe
+what's exactly wrong with it: for example, what characters look wrong
+and what exactly is wrong about their look. Providing a link to the
+original font file would be also a good idea. Try to do a little
+troublehooting and report its result. This not only would help with
+the fix but may also give you a temporary work-around for the bug.
+.PP
+First, enable full warnings with option `\fB\-W99\fR\*(R', save them to
+a file and read carefully. Sometimes the prolem is with a not implemented
+feature which is reported in the warnings. Still, reporting about such
+problems may be a good idea: some features were missed to cut corners,
+in hope that no real font is using them. So a report about a font using
+such a feature may motivate someone to implement it. Of course, you
+may be the most motivated person: after all, you are the one wishing
+to convert that font. ;\-) Seriously, the philosophy \*(L"scrath your own itch\*(R"
+seems to be the strongest moving force behind the Open Source software.
+.PP
+The next step is playing with the options. This serves a dual purpose:
+on one hand, it helps to localize the bug, on the other hand you may be
+able to get a working version of the font for the meantime while the
+bug is being fixed. The typical options to try out are: first `\fB\-Ou\fR\*(R', if
+it does not help then `\fB\-Os\fR\*(R', then `\fB\-Oh\fR\*(R', then `\fB\-Oo\fR\*(R'.
+They are described in a bit more detail above. Try them one by one
+and in combinations. See if with them the resulting fonts look better.
+.PP
+On some fonts ttf2pt1 just crashes. Commonly that happens because the
+font being converted is highly defective (although sometimes the bug
+is in ttf2pt1 itself). In any case it should not crash, so the reports
+about such cases will help to handle these defects properly in future.
+.PP
+We try to respond to the bug reports in a timely fashion but alas, this
+may not always be possible, especially if the problem is complex.
+This is a volunteer project and its resources are limited. Because
+of this we would appreciate bug reports as detailed as possible,
+and we would appreciate the ready fixes and contributions even more.
+.SH "HISTORY"
+Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert.
+.PP
+Modification by Mark Heath.
+.PP
+Further modification by Sergey Babkin.
+.PP
+The Type1 assembler by I. Lee Hetherington with modifications by
+Kai-Uwe Herbing.
+
+.rn }` ''
+.IX Title "TTF2PT1 1"
+.IX Name "TTF2PT1 - A True Type to PostScript Type 1 Font Converter"
+
+.IX Header "NAME"
+
+.IX Header "SYNOPSIS"
+
+.IX Header "DESCRIPTION"
+
+.IX Header "OPTIONS"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "EXAMPLES"
+
+.IX Header "FILES"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "SEE ALSO"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "BUGS"
+
+.IX Subsection "Troubleshooting and bug reports"
+
+.IX Header "HISTORY"
+
diff --git a/fonts/utilities/ttf2pt1/ttf2pt1.c b/fonts/utilities/ttf2pt1/ttf2pt1.c
new file mode 100644
index 0000000000..f3180c043b
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf2pt1.c
@@ -0,0 +1,2334 @@
+/*
+ * True Type Font to Adobe Type 1 font converter
+ * By Mark Heath <mheath@netspace.net.au>
+ * Based on ttf2pfa by Andrew Weeks <ccsaw@bath.ac.uk>
+ * With help from Frank M. Siegert <fms@this.net>
+ *
+ * see COPYRIGHT
+ *
+***********************************************************************
+ *
+ * Sergey Babkin <babkin@users.sourceforge.net>, <sab123@hotmail.com>
+ *
+ * Added post-processing of resulting outline to correct the errors
+ * both introduced during conversion and present in the original font,
+ * autogeneration of hints (has yet to be improved though) and BlueValues,
+ * scaling to 1000x1000 matrix, option to print the result on STDOUT,
+ * support of Unicode to CP1251 conversion, optimization of the
+ * resulting font code by space (that improves the speed too). Excluded
+ * the glyphs that are unaccessible through the encoding table from
+ * the output file. Added the built-in Type1 assembler (taken from
+ * the `t1utils' package).
+ *
+***********************************************************************
+ *
+ * Thomas Henlich <thenlich@rcs.urz.tu-dresden.de>
+ *
+ * Added generation of .afm file (font metrics)
+ * Read encoding information from encoding description file
+ * Fixed bug in error message about unknown language ('-l' option)
+ * Added `:' after %%!PS-AdobeFont-1.0
+ * changed unused entries in ISOLatin1Encoding[] from .notdef to c127,c128...
+ *
+***********************************************************************
+ *
+ * Thomas Henlich <thenlich@rcs.urz.tu-dresden.de>
+ *
+ * Added generation of .afm file (font metrics)
+ *
+***********************************************************************
+ *
+ * Bug Fixes:
+************************************************************************
+ *
+ * Sun, 21 Jun 1998 Thomas Henlich <thenlich@Rcs1.urz.tu-dresden.de>
+ * 1. "width" should be "short int" because otherwise:
+ * characters with negative widths (e.g. -4) become *very* wide (65532)
+ * 2. the number of /CharStrings is numglyphs and not numglyphs+1
+ *
+***********************************************************************
+ *
+ *
+ *
+ * The resultant font file produced by this program still needs to be ran
+ * through t1asm (from the t1utils archive) to produce a completely valid
+ * font.
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <ctype.h>
+#include <math.h>
+
+#ifdef _GNU_SOURCE
+#include <getopt.h>
+#endif
+
+#ifndef WINDOWS
+# include <unistd.h>
+# include <netinet/in.h>
+# define BITBUCKET "/dev/null"
+# include <sys/wait.h>
+#else
+# define WINDOWS_FUNCTIONS /* ask to define functions - in one file only */
+# include "windows.h"
+# define BITBUCKET "NUL"
+#endif
+
+#include "pt1.h"
+#include "global.h"
+#include "version.h"
+
+/* globals */
+
+/* table of front-ends */
+
+extern struct frontsw ttf_sw;
+#if defined(USE_FREETYPE)
+ extern struct frontsw freetype_sw;
+#endif
+
+struct frontsw *frontswtab[] = {
+#if defined(USE_FREETYPE) && defined(PREFER_FREETYPE)
+ &freetype_sw,
+#endif
+ &ttf_sw,
+#if defined(USE_FREETYPE) && !defined(PREFER_FREETYPE)
+ &freetype_sw,
+#endif
+ NULL /* end of table */
+};
+
+struct frontsw *cursw=0; /* the active front end */
+char *front_arg=""; /* optional argument */
+
+/* options */
+int encode = 0; /* encode the resulting file */
+int pfbflag = 0; /* produce compressed file */
+int wantafm=0; /* want to see .afm instead of .t1a on stdout */
+int correctvsize=0; /* try to correct the vertical size of characters */
+int wantuid = 0; /* user wants UniqueID entry in the font */
+int allglyphs = 0; /* convert all glyphs, not only 256 of them */
+int warnlevel = 3; /* the level of permitted warnings */
+int forceunicode = 0; /* consider any fonr as Unicode for mapping purposes */
+/* options - maximal limits */
+int max_stemdepth = 128; /* maximal depth of stem stack in interpreter (128 - limit from X11) */
+/* options - debugging */
+int absolute = 0; /* print out in absolute values */
+int reverse = 1; /* reverse font to Type1 path directions */
+/* options - suboptions of Outline Processing, defaults are set in table */
+int optimize; /* enables space optimization */
+int smooth; /* enable smoothing of outlines */
+int transform; /* enables transformation to 1000x1000 matrix */
+int hints; /* enables autogeneration of hints */
+int subhints; /* enables autogeneration of substituted hints */
+int trybold; /* try to guess whether the font is bold */
+int correctwidth; /* try to correct the character width */
+
+/* not quite options to select a particular source encoding */
+int force_pid = -1; /* specific platform id */
+int force_eid = -1; /* specific encoding id */
+
+/* table of Outline Processing (may think also as Optimization) options */
+static struct {
+ char disbl; /* character to disable - enforced lowercase */
+ char enbl; /* character to enable - auto-set as toupper(disbl) */
+ int *valp; /* pointer to the actual variable containing value */
+ int dflt; /* default value */
+ char *descr; /* description */
+} opotbl[] = {
+ { 'b', 0/*auto-set*/, &trybold, 1, "guessing of the ForceBold hint" },
+ { 'h', 0/*auto-set*/, &hints, 1, "autogeneration of hints" },
+ { 'u', 0/*auto-set*/, &subhints, 1, "hint substitution technique" },
+ { 'o', 0/*auto-set*/, &optimize, 1, "space optimization of font files" },
+ { 's', 0/*auto-set*/, &smooth, 1, "smoothing and repair of outlines" },
+ { 't', 0/*auto-set*/, &transform, 1, "auto-scaling to the standard matrix 1000x1000" },
+ { 'w', 0/*auto-set*/, &correctwidth, 0, "correct the glyph widths (use only for buggy fonts)" },
+};
+
+int debug = DEBUG; /* debugging flag */
+
+FILE *pfa_file, *afm_file;
+int numglyphs;
+struct font_metrics fontm;
+
+/* non-globals */
+static char *strUID = 0; /* user-supplied UniqueID */
+static unsigned long numUID; /* auto-generated UniqueID */
+
+static int ps_fmt_3 = 0;
+static double scale_factor, original_scale_factor;
+
+static char *glyph_rename[256];
+
+/* the names assigned if the original font
+ * does not specify any
+ */
+
+static char *Fmt3Encoding[256] = {
+ "c0", "c1", "c2", "c3",
+ "c4", "c5", "c6", "c7",
+ "c8", "c9", "c10", "c11",
+ "c12", "CR", "c14", "c15",
+ "c16", "c17", "c18", "c19",
+ "c20", "c21", "c22", "c23",
+ "c24", "c25", "c26", "c27",
+ "c28", "c29", "c30", "c31",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "c127",
+ "c128", "c129", "quotesinglbase", "florin",
+ "quotedblbase", "ellipsis", "dagger", "daggerdbl",
+ "circumflex", "perthousand", "Scaron", "guilsinglleft",
+ "OE", "c141", "c142", "c143",
+ "c144", "quoteleft", "quoteright", "quotedblleft",
+ "quotedblright", "bullet", "endash", "emdash",
+ "tilde", "trademark", "scaron", "guilsinglright",
+ "oe", "c157", "c158", "Ydieresis",
+ "nbspace", "exclamdown", "cent", "sterling",
+ "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft",
+ "logicalnot", "sfthyphen", "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior",
+ "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright",
+ "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde",
+ "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+};
+
+#ifdef notdef /* { */
+/* This table is not used anywhere in the code
+ * so it's ifdef-ed out by default but left in
+ * the source code for reference purposes (and
+ * possibly for future use)
+ */
+
+static char *ISOLatin1Encoding[256] = {
+ ".null", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "CR", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "c127",
+ "c128", "c129", "quotesinglbase", "florin",
+ "quotedblbase", "ellipsis", "dagger", "daggerdbl",
+ "circumflex", "perthousand", "Scaron", "guilsinglleft",
+ "OE", "c141", "c142", "c143",
+ "c144", "quoteleft", "quoteright", "quotedblleft",
+ "quotedblright", "bullet", "endash", "emdash",
+ "tilde", "trademark", "scaron", "guilsinglright",
+ "oe", "c157", "c158", "Ydieresis",
+ "nbspace", "exclamdown", "cent", "sterling",
+ "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft",
+ "logicalnot", "sfthyphen", "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior",
+ "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright",
+ "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde",
+ "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+};
+
+#endif /* } notdef */
+
+static char *adobe_StandardEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C", "D", "E", "F", "G",
+ "H", "I", "J", "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+};
+
+/*
+ * Decription of the supported conversions from Unicode
+ *
+ * SB
+ * Yes, I know that the compiled-in conversion is stupid but
+ * it is simple to implement and allows not to worry about the
+ * filesystem context. After all, the source is always available
+ * and adding another language to it is easy.
+ *
+ * The language name is expected to be the same as the subdirectory name
+ * in the `encodings' directory (for possible future extensions).
+ * The primary use of the aliases is for guessing based on the current
+ * locale.
+ */
+
+#define MAXUNIALIAS 10
+#define MAXUNITABLES 3
+
+/* the character used as the language argument separator */
+#define LANG_ARG_SEP '+'
+
+
+/*
+ * Types of language-related routines. Arguments are:
+ * name is the glyph name
+ * arg is the user-specified language-dependent argument
+ * which can for example select the subfont plane for Eastern fonts.
+ * If none is supplied by user then an empty string ("") is passed.
+ * If no language is specified by user and auto-guessing happens
+ * then NULL is passed.
+ * when shows if the conversion by name was called before conversion by
+ * map or after (it's called twice)
+ */
+
+/* type of the Unicode map initialization routine */
+typedef void uni_init_t(char *arg);
+
+/* type of Unicode converter-by-name function
+ * it's called for each glyph twice: one time for each glyph
+ * before doing conversion by map and one time after
+ */
+typedef int uni_conv_t(char *name, char *arg, int when);
+#define UNICONV_BYNAME_BEFORE 0
+#define UNICONV_BYNAME_AFTER 1
+
+struct uni_language {
+ uni_init_t *init[MAXUNITABLES]; /* map initialization routines */
+ uni_conv_t *convbyname; /* the name-based conversion function */
+ char *name; /* the language name */
+ char *descr; /* description */
+ char *alias[MAXUNIALIAS]; /* aliases of the language name */
+ int sample_upper; /* code of some uppercase character for correctvsize() */
+};
+
+/* the converter routines have an option of adding this suffix to the font name */
+static char *uni_font_name_suffix = ""; /* empty by default */
+/* this buffer may be used to store the suffix */
+#define UNI_MAX_SUFFIX_LEN 100
+static char uni_suffix_buf[UNI_MAX_SUFFIX_LEN+1];
+
+/*
+ * Prototypes of the conversion routines
+ */
+
+static uni_init_t unicode_latin1;
+static uni_init_t unicode_latin2;
+static uni_init_t unicode_latin4;
+static uni_init_t unicode_latin5;
+static uni_init_t unicode_russian;
+static uni_init_t unicode_adobestd;
+static uni_init_t unicode_plane;
+static uni_conv_t unicode_adobestd_byname;
+
+static uni_init_t unicode_init_user;
+
+/*
+ * The order of descriptions is important: if we can't guess the
+ * language we just call all the conversion routines in order until
+ * we find one that understands this glyph.
+ */
+static struct uni_language uni_lang[]= {
+ /* pseudo-language for all the languages using Latin1 */
+ {
+ { unicode_latin1 },
+ 0, /* no name-based mapping */
+ "latin1",
+ "works for most of the Western languages",
+ { "en_", "de_", "fr_", "nl_", "no_", "da_", "it_" },
+ 'A'
+ },
+ { /* by Szalay Tamas <tomek@elender.hu> */
+ { unicode_latin2 },
+ 0, /* no name-based mapping */
+ "latin2",
+ "works for Central European languages",
+ { "hu_","pl_","cz_","si_","sk_" },
+ 'A'
+ },
+ { /* by Rièardas Èepas <rch@WriteMe.Com> */
+ { unicode_latin4 },
+ 0, /* no name-based mapping */
+ "latin4",
+ "works for Baltic languages",
+ { "lt_", "lv_" }, /* doubt about ee_ */
+ 'A'
+ },
+ { /* by Turgut Uyar <uyar@cs.itu.edu.tr> */
+ { unicode_latin5 },
+ 0, /* no name-based mapping */
+ "latin5",
+ "for Turkish",
+ { "tr_" },
+ 'A'
+ },
+ {
+ { unicode_russian, unicode_latin1 },
+ 0, /* no name-based mapping */
+ "russian",
+ "in Windows encoding",
+ { "ru_", "su_" },
+ 'A'
+ },
+ {
+ { unicode_russian, unicode_latin1 },
+ 0, /* no name-based mapping */
+ "bulgarian",
+ "in Windows encoding",
+ { "bg_" }, /* not sure whether the Bulgarian locale is named this way */
+ 'A'
+ },
+ {
+ { unicode_adobestd },
+ unicode_adobestd_byname,
+ "adobestd",
+ "Adobe Standard, expected by TeX",
+ { NULL },
+ 'A'
+ },
+ {
+ { unicode_plane },
+ 0, /* no name-based mapping */
+ "plane",
+ "one plane of Unicode or other multi-byte encoding as is",
+ { NULL },
+ 0 /* no easy way to predict the capital letters */
+ },
+};
+
+static struct uni_language uni_lang_user = {
+ { unicode_init_user },
+ 0, /* no name-based mapping */
+ 0, /* no name */
+ 0, /* no description */
+ { 0 },
+ 0 /* no sample */
+};
+
+static struct uni_language *uni_lang_selected=0; /* 0 means "unknown, try all" */
+static int uni_sample='A'; /* sample of an uppercase character */
+static char *uni_lang_arg=""; /* user-supplied language-dependent argument */
+
+extern int runt1asm(int);
+
+/*
+ * user-defined loadable maps
+ */
+
+
+/* The idea begind buckets is to avoid comparing every code with all 256 codes int table.
+ * All the 16-bit unicode space is divided between a number of equal-sized buckets.
+ * Initially all the buckets are marked with 0. Then if any code in the bucket is
+ * used it's marked with 1. Later during translation we check the code's bucket first
+ * and it it's 0 then return failure right away. This may be useful for
+ * Chinese fonts with many thousands of glyphs.
+ */
+
+#define BUCKET_ID_BITS 11
+#define MARK_UNI_BUCKET(unicode) SET_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS))
+#define IS_UNI_BUCKET(unicode) IS_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS))
+
+static DEF_BITMAP(uni_user_buckets, 1<<BUCKET_ID_BITS);
+
+static unsigned int unicode_map[256]; /* font-encoding to unicode map */
+
+static void
+unicode_init_user(
+ char *path
+)
+{
+ FILE *unicode_map_file;
+#define UNIBFSZ 256
+ char buffer[UNIBFSZ];
+ unsigned code, unicode, curpos, unicode2;
+ char *arg, *p;
+ int enabled, found;
+ int lineno, cnt, n;
+ char next;
+
+ /* check if we have an argument (plane name) */
+ arg = strrchr(path, LANG_ARG_SEP);
+ if(arg != 0) {
+ *arg++ = 0;
+ if( *arg == 0 || strlen(arg) > UNI_MAX_SUFFIX_LEN-1)
+ arg = NULL;
+ else {
+ sprintf(uni_suffix_buf, "-%s", arg);
+ uni_font_name_suffix = uni_suffix_buf;
+ }
+ }
+
+ /* now read in the encoding description file, if requested */
+ if ((unicode_map_file = fopen(path, "r")) == NULL) {
+ fprintf(stderr, "**** Cannot access map file '%s' ****\n", path);
+ exit(1);
+ }
+
+ if(arg==NULL)
+ enabled = found = 1;
+ else
+ enabled = found = 0;
+
+ lineno=0; curpos=0;
+ while (fgets (buffer, UNIBFSZ, unicode_map_file) != NULL) {
+ char name[UNIBFSZ];
+
+ lineno++;
+
+ if(sscanf(buffer, "plane %s", name)==1) {
+ if(arg == 0) {
+ fprintf(stderr, "**** map file '%s' requires plane name\n", path);
+ fprintf(stderr, "for example:\n");
+ fprintf(stderr, " ttf2pt1 -L %s%c%s ...\n", path, LANG_ARG_SEP, name);
+ fprintf(stderr, "to select plane '%s'\n", name);
+ exit(1);
+ }
+ if( !strcmp(arg, name) ) {
+ enabled = found = 1;
+ curpos = 0;
+ } else {
+ enabled = 0;
+ if(found) /* no need to read further */
+ break;
+ }
+ continue;
+ }
+
+ if( !enabled )
+ continue; /* skip to the next plane */
+
+ if( sscanf(buffer, "at %i", &curpos) == 1 ) {
+ if(curpos > 255) {
+ fprintf(stderr, "**** map file '%s' line %d: code over 255\n", path, lineno);
+ exit(1);
+ }
+ if(ISDBG(EXTMAP)) fprintf(stderr, "=== at 0x%x\n", curpos);
+ continue;
+ }
+
+ /* try the format of Roman Czyborra's files */
+ if (sscanf (buffer, " =%x U+%4x", &code, &unicode) == 2) {
+ if (code < 256) {
+ unicode_map[code] = unicode;
+ glyph_rename[code] = NULL;
+ }
+ }
+ /* try the format of Linux locale charmap file */
+ else if (sscanf (buffer, " <%*s /x%x <U%4x>", &code, &unicode) == 2) {
+ if (code < 256) {
+ unicode_map[code] = unicode;
+ glyph_rename[code] = NULL;
+ }
+ }
+ /* try the format with glyph renaming */
+ else if (sscanf (buffer, " !%x U+%4x %128s", &code,
+ &unicode, name) == 3) {
+ if (code < 256) {
+ unicode_map[code] = unicode;
+ glyph_rename[code] = strdup(name);
+ }
+ }
+ /* try the compact sequence format */
+ else if( (n=sscanf(buffer, " %i%n", &unicode, &cnt)) == 1 ) {
+ p = buffer;
+ do {
+ if(curpos > 255) {
+ fprintf(stderr, "**** map file '%s' line %d: code over 255 for unicode 0x%x\n",
+ path, lineno, unicode);
+ exit(1);
+ }
+ if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%d -> 0x%x\n", curpos, unicode);
+ unicode_map[curpos++] = unicode;
+ p += cnt;
+ if( sscanf(p, " %[,-]%n", &next,&cnt) == 1 ) {
+ if(ISDBG(EXTMAP)) fprintf(stderr, "=== next: '%c'\n", next);
+ p += cnt;
+ if( next == '-' ) { /* range */
+ if ( sscanf(p, " %i%n", &unicode2, &cnt) != 1 ) {
+ fprintf(stderr, "**** map file '%s' line %d: missing end of range\n", path, lineno);
+ exit(1);
+ }
+ p += cnt;
+ if(ISDBG(EXTMAP)) fprintf(stderr, "=== range 0x%x to 0x%x\n", unicode, unicode2);
+ for(unicode++; unicode <= unicode2; unicode++) {
+ if(curpos > 255) {
+ fprintf(stderr, "**** map file '%s' line %d: code over 255 in unicode range ...-0x%x\n",
+ path, lineno, unicode2);
+ exit(1);
+ }
+ if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%x -> 0x%x\n", curpos, unicode);
+ unicode_map[curpos++] = unicode;
+ }
+ }
+ }
+ } while ( sscanf(p, " %i%n", &unicode, &cnt) == 1 );
+ }
+
+ }
+
+ fclose (unicode_map_file);
+
+ if( !found ) {
+ fprintf(stderr, "**** map file '%s' has no plane '%s'\n", path, arg);
+ exit(1);
+ }
+
+ if(unicode_map['A'] == 'A')
+ uni_sample = 'A'; /* seems to be compatible with Latin */
+ else
+ uni_sample = 0; /* don't make any assumptions */
+}
+
+static void
+unicode_russian(
+ char *arg
+)
+{
+ int i;
+ static unsigned int russian_unicode_map[] = {
+ 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, /* 88 */
+ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178, /* 98 */
+ 0x00a0, 0x00a1, 0x00a2, 0x0451, 0x00a4, 0x00a5, 0x00a6, 0x00a7, /* A0 */
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* A8 direct */
+ 0x00b0, 0x00b1, 0x00b2, 0x0401, 0x00b4, 0x00b5, 0x00b6, 0x00b7, /* B0 */
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* B8 direct */
+ };
+
+ for(i=0; i<=0x7F; i++)
+ unicode_map[i] = i;
+
+ for(i=0x80; i<=0xBF; i++)
+ unicode_map[i] = russian_unicode_map[i-0x80];
+
+ for(i=0xC0; i<=0xFF; i++)
+ unicode_map[i] = i+0x350;
+
+}
+
+static void
+unicode_latin1(
+ char *arg
+)
+{
+ int i;
+ static unsigned int latin1_unicode_map[] = {
+ 0x20ac, -1, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, /* 88 */
+ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178, /* 98 */
+ };
+
+ for(i=0; i<=0x7F; i++)
+ unicode_map[i] = i;
+
+ for(i=0x80; i<=0x9F; i++)
+ unicode_map[i] = latin1_unicode_map[i-0x80];
+
+ for(i=0xA0; i<=0xFF; i++)
+ unicode_map[i] = i;
+}
+
+static void
+unicode_adobestd(
+ char *arg
+)
+{
+ int i;
+ static unsigned int adobestd_unicode_map[] = {
+ -1, 0x00a1, 0x00a2, 0x00a3, 0x2215, 0x00a5, 0x0192, 0x00a7, /* A0 */
+ 0x00a4, 0x0027, 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, /* A8 */
+ -1, 0x2013, 0x2020, 0x2021, 0x2219, -1, 0x00b6, 0x2022, /* B0 */
+ 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, -1, 0x00bf, /* B8 */
+ -1, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x02c9, 0x02d8, 0x02d9, /* C0 */
+ 0x00a8, -1, 0x02da, 0x00b8, -1, 0x02dd, 0x02db, 0x02c7, /* C8 */
+ 0x2014, -1, -1, -1, -1, -1, -1, -1, /* D0 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* D8 */
+ -1, 0x00c6, -1, 0x00aa, -1, -1, -1, -1, /* E0 */
+ 0x0141, 0x00d8, 0x0152, 0x00ba, -1, -1, -1, -1, /* E8 */
+ -1, 0x00e6, -1, -1, -1, 0x0131, -1, -1, /* F0 */
+ 0x0142, 0x00f8, 0x0153, 0x00df, -1, -1, -1, -1, /* F8 */
+ };
+
+ for(i=0; i<=0x7F; i++)
+ unicode_map[i] = i;
+
+ unicode_map[0x27] = 0x2019;
+ unicode_map[0x60] = -1;
+
+ /* 0x80 to 0x9F is a hole */
+
+ for(i=0xA0; i<=0xFF; i++)
+ unicode_map[i] = adobestd_unicode_map[i-0xA0];
+}
+
+/*
+ * Not all of the Adobe glyphs are in the Unicode
+ * standard maps, so the font creators have
+ * different ideas about their codes. Because
+ * of this we try to map based on the glyph
+ * names instead of Unicode codes. If there are
+ * no glyph names (ps_fmt_3!=0) we fall back
+ * to the code-based scheme.
+ */
+
+static int
+unicode_adobestd_byname(
+ char *name,
+ char *arg,
+ int where
+)
+{
+ int i;
+
+ /* names always take precedence over codes */
+ if(where == UNICONV_BYNAME_AFTER)
+ return -1;
+
+ for(i=32; i<256; i++) {
+ if(!strcmp(name, adobe_StandardEncoding[i]))
+ return i;
+ }
+ return -1;
+
+}
+
+static void
+unicode_latin2(
+ char *arg
+)
+{
+ int i;
+ static unsigned int latin2_unicode_map[] = {
+ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, /* A0 */
+ 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* A8 */
+ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, /* B0 */
+ 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* B8 */
+ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, /* C0 */
+ 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* C8 */
+ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, /* D0 */
+ 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* D8 */
+ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, /* E0 */
+ 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* E8 */
+ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, /* F0 */
+ 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, /* F8 */
+ };
+
+ for(i=0; i<=0x7E; i++)
+ unicode_map[i] = i;
+
+ /* 7F-9F are unused */
+
+ for(i=0xA0; i<=0xFF; i++)
+ unicode_map[i] = latin2_unicode_map[i-0xA0];
+}
+
+static void
+unicode_latin4(
+ char *arg
+)
+{
+ int i;
+ static unsigned int latin4_unicode_map[] = {
+ 0x0080, 0x0081, 0x201a, 0x0192, -1, 0x2026, 0x2020, 0x2021, /* 80 */
+ 0x02c6, 0x2030, -1, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */
+ 0x201e, 0x201c, 0x2019, -1, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */
+ 0x02dc, 0x2122, -1, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */
+ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, /* A0 */
+ 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* A8 */
+ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, /* B0 */
+ 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* B8 */
+ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, /* C0 */
+ 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* C8 */
+ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */
+ 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* D8 */
+ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, /* E0 */
+ 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* E8 */
+ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */
+ 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, /* F8 */
+ };
+
+ for(i=0; i<=0x7F; i++)
+ unicode_map[i] = i;
+
+ for(i=0x80; i<=0xFF; i++)
+ unicode_map[i] = latin4_unicode_map[i-0x80];
+
+#if 0 /* for documentation purposes only */
+ case 0x201e: return 0x90; /* these two quotes are a hack only */
+ case 0x201c: return 0x91; /* these two quotes are a hack only */
+ case 0x00A0: return 0xA0; /* NO-BREAK SPACE */
+ case 0x0104: return 0xA1; /* LATIN CAPITAL LETTER A WITH OGONEK */
+ case 0x0138: return 0xA2; /* LATIN SMALL LETTER KRA */
+ case 0x0156: return 0xA3; /* LATIN CAPITAL LETTER R WITH CEDILLA */
+ case 0x00A4: return 0xA4; /* CURRENCY SIGN */
+ case 0x0128: return 0xA5; /* LATIN CAPITAL LETTER I WITH TILDE */
+ case 0x013B: return 0xA6; /* LATIN CAPITAL LETTER L WITH CEDILLA */
+ case 0x00A7: return 0xA7; /* SECTION SIGN */
+ case 0x00A8: return 0xA8; /* DIAERESIS */
+ case 0x0160: return 0xA9; /* LATIN CAPITAL LETTER S WITH CARON */
+ case 0x0112: return 0xAA; /* LATIN CAPITAL LETTER E WITH MACRON */
+ case 0x0122: return 0xAB; /* LATIN CAPITAL LETTER G WITH CEDILLA */
+ case 0x0166: return 0xAC; /* LATIN CAPITAL LETTER T WITH STROKE */
+ case 0x00AD: return 0xAD; /* SOFT HYPHEN */
+ case 0x017D: return 0xAE; /* LATIN CAPITAL LETTER Z WITH CARON */
+ case 0x00AF: return 0xAF; /* MACRON */
+ case 0x00B0: return 0xB0; /* DEGREE SIGN */
+ case 0x0105: return 0xB1; /* LATIN SMALL LETTER A WITH OGONEK */
+ case 0x02DB: return 0xB2; /* OGONEK */
+ case 0x0157: return 0xB3; /* LATIN SMALL LETTER R WITH CEDILLA */
+ case 0x00B4: return 0xB4; /* ACUTE ACCENT */
+ case 0x0129: return 0xB5; /* LATIN SMALL LETTER I WITH TILDE */
+ case 0x013C: return 0xB6; /* LATIN SMALL LETTER L WITH CEDILLA */
+ case 0x02C7: return 0xB7; /* CARON */
+ case 0x00B8: return 0xB8; /* CEDILLA */
+ case 0x0161: return 0xB9; /* LATIN SMALL LETTER S WITH CARON */
+ case 0x0113: return 0xBA; /* LATIN SMALL LETTER E WITH MACRON */
+ case 0x0123: return 0xBB; /* LATIN SMALL LETTER G WITH CEDILLA */
+ case 0x0167: return 0xBC; /* LATIN SMALL LETTER T WITH STROKE */
+ case 0x014A: return 0xBD; /* LATIN CAPITAL LETTER ENG */
+ case 0x017E: return 0xBE; /* LATIN SMALL LETTER Z WITH CARON */
+ case 0x014B: return 0xBF; /* LATIN SMALL LETTER ENG */
+ case 0x0100: return 0xC0; /* LATIN CAPITAL LETTER A WITH MACRON */
+ case 0x00C1: return 0xC1; /* LATIN CAPITAL LETTER A WITH ACUTE */
+ case 0x00C2: return 0xC2; /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ case 0x00C3: return 0xC3; /* LATIN CAPITAL LETTER A WITH TILDE */
+ case 0x00C4: return 0xC4; /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ case 0x00C5: return 0xC5; /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ case 0x00C6: return 0xC6; /* LATIN CAPITAL LIGATURE AE */
+ case 0x012E: return 0xC7; /* LATIN CAPITAL LETTER I WITH OGONEK */
+ case 0x010C: return 0xC8; /* LATIN CAPITAL LETTER C WITH CARON */
+ case 0x00C9: return 0xC9; /* LATIN CAPITAL LETTER E WITH ACUTE */
+ case 0x0118: return 0xCA; /* LATIN CAPITAL LETTER E WITH OGONEK */
+ case 0x00CB: return 0xCB; /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ case 0x0116: return 0xCC; /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ case 0x00CD: return 0xCD; /* LATIN CAPITAL LETTER I WITH ACUTE */
+ case 0x00CE: return 0xCE; /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ case 0x012A: return 0xCF; /* LATIN CAPITAL LETTER I WITH MACRON */
+ case 0x0110: return 0xD0; /* LATIN CAPITAL LETTER D WITH STROKE */
+ case 0x0145: return 0xD1; /* LATIN CAPITAL LETTER N WITH CEDILLA */
+ case 0x014C: return 0xD2; /* LATIN CAPITAL LETTER O WITH MACRON */
+ case 0x0136: return 0xD3; /* LATIN CAPITAL LETTER K WITH CEDILLA */
+ case 0x00D4: return 0xD4; /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ case 0x00D5: return 0xD5; /* LATIN CAPITAL LETTER O WITH TILDE */
+ case 0x00D6: return 0xD6; /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ case 0x00D7: return 0xD7; /* MULTIPLICATION SIGN */
+ case 0x00D8: return 0xD8; /* LATIN CAPITAL LETTER O WITH STROKE */
+ case 0x0172: return 0xD9; /* LATIN CAPITAL LETTER U WITH OGONEK */
+ case 0x00DA: return 0xDA; /* LATIN CAPITAL LETTER U WITH ACUTE */
+ case 0x00DB: return 0xDB; /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+ case 0x00DC: return 0xDC; /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ case 0x0168: return 0xDD; /* LATIN CAPITAL LETTER U WITH TILDE */
+ case 0x016A: return 0xDE; /* LATIN CAPITAL LETTER U WITH MACRON */
+ case 0x00DF: return 0xDF; /* LATIN SMALL LETTER SHARP S */
+ case 0x0101: return 0xE0; /* LATIN SMALL LETTER A WITH MACRON */
+ case 0x00E1: return 0xE1; /* LATIN SMALL LETTER A WITH ACUTE */
+ case 0x00E2: return 0xE2; /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+ case 0x00E3: return 0xE3; /* LATIN SMALL LETTER A WITH TILDE */
+ case 0x00E4: return 0xE4; /* LATIN SMALL LETTER A WITH DIAERESIS */
+ case 0x00E5: return 0xE5; /* LATIN SMALL LETTER A WITH RING ABOVE */
+ case 0x00E6: return 0xE6; /* LATIN SMALL LIGATURE AE */
+ case 0x012F: return 0xE7; /* LATIN SMALL LETTER I WITH OGONEK */
+ case 0x010D: return 0xE8; /* LATIN SMALL LETTER C WITH CARON */
+ case 0x00E9: return 0xE9; /* LATIN SMALL LETTER E WITH ACUTE */
+ case 0x0119: return 0xEA; /* LATIN SMALL LETTER E WITH OGONEK */
+ case 0x00EB: return 0xEB; /* LATIN SMALL LETTER E WITH DIAERESIS */
+ case 0x0117: return 0xEC; /* LATIN SMALL LETTER E WITH DOT ABOVE */
+ case 0x00ED: return 0xED; /* LATIN SMALL LETTER I WITH ACUTE */
+ case 0x00EE: return 0xEE; /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+ case 0x012B: return 0xEF; /* LATIN SMALL LETTER I WITH MACRON */
+ case 0x0111: return 0xF0; /* LATIN SMALL LETTER D WITH STROKE */
+ case 0x0146: return 0xF1; /* LATIN SMALL LETTER N WITH CEDILLA */
+ case 0x014D: return 0xF2; /* LATIN SMALL LETTER O WITH MACRON */
+ case 0x0137: return 0xF3; /* LATIN SMALL LETTER K WITH CEDILLA */
+ case 0x00F4: return 0xF4; /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+ case 0x00F5: return 0xF5; /* LATIN SMALL LETTER O WITH TILDE */
+ case 0x00F6: return 0xF6; /* LATIN SMALL LETTER O WITH DIAERESIS */
+ case 0x00F7: return 0xF7; /* DIVISION SIGN */
+ case 0x00F8: return 0xF8; /* LATIN SMALL LETTER O WITH STROKE */
+ case 0x0173: return 0xF9; /* LATIN SMALL LETTER U WITH OGONEK */
+ case 0x00FA: return 0xFA; /* LATIN SMALL LETTER U WITH ACUTE */
+ case 0x00FB: return 0xFB; /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
+ case 0x00FC: return 0xFC; /* LATIN SMALL LETTER U WITH DIAERESIS */
+ case 0x0169: return 0xFD; /* LATIN SMALL LETTER U WITH TILDE */
+ case 0x016B: return 0xFE; /* LATIN SMALL LETTER U WITH MACRON */
+ case 0x02D9: return 0xFF; /* DOT ABOVE */
+#endif
+}
+
+static void
+unicode_latin5(
+ char *arg
+)
+{
+ int i;
+ static unsigned int latin5_unicode_map1[] = {
+ 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */
+ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */
+ };
+ static unsigned int latin5_unicode_map2[] = {
+ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* D8 */
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, /* E0 direct */
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* E8 direct */
+ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, /* F8 */
+ };
+
+ for(i=0; i<=0x7F; i++)
+ unicode_map[i] = i;
+
+ for(i=0x80; i<=0x9F; i++)
+ unicode_map[i] = latin5_unicode_map1[i-0x80];
+
+ for(i=0xA0; i<=0xCF; i++)
+ unicode_map[i] = i;
+
+ for(i=0xD0; i<=0xFF; i++)
+ unicode_map[i] = latin5_unicode_map2[i-0xD0];
+}
+
+/* a way to select one 256-character plane from Unicode
+ * or other multi-byte encoding
+ */
+
+static void
+unicode_plane(
+ char *arg
+)
+{
+ static unsigned plane;
+ int nchars;
+ int c1, c2, i;
+
+ plane = 0; force_pid = force_eid = -1;
+
+ c1 = sscanf(arg, "pid=%d,eid=%d%n", &force_pid, &force_eid, &nchars);
+ if(c1 == 2) {
+ arg += nchars;
+ if(*arg == ',')
+ arg++;
+ }
+ if(arg[0] == '0' && (arg[1]=='x' || arg[1]=='X') ) {
+ arg += 2;
+ c2 = sscanf(arg, "%x", &plane);
+ } else {
+ c2 = sscanf(arg, "%d", &plane);
+ }
+
+ if( (c1!=2 && c1!=0) || (c1==0 && c2==0) ) {
+ fprintf(stderr, "**** option -l plane requires expects one of the following formats:\n");
+ fprintf(stderr, " -l plane+0xNN - select hexadecimal number of plane of Unicode\n");
+ fprintf(stderr, " -l plane+NN - select decimal number of plane of Unicode\n");
+ fprintf(stderr, " -l plane+pid=N,eid=N - select plane 0 of specified encoding\n");
+ fprintf(stderr, " -l plane+pid=N,eid=N,0xNN - select hex plane of TTF encoding with this PID/EID\n");
+ fprintf(stderr, " -l plane+pid=N,eid=N,NN - select decimal plane of TTF encoding with this PID/EID\n");
+ exit(1);
+ }
+
+ if(c2!=0) {
+ if(strlen(arg) > sizeof(uni_suffix_buf)-2) {
+ fprintf(stderr, "**** plane number is too large\n");
+ }
+
+ sprintf(uni_suffix_buf, "-%s", arg);
+ uni_font_name_suffix = uni_suffix_buf;
+ } else {
+ uni_font_name_suffix = "";
+ }
+
+ plane <<= 8;
+ for(i=0; i<=0xFF; i++)
+ unicode_map[i] = plane | i;
+}
+
+/* look up the 8-bit code by unicode */
+
+int
+unicode_rev_lookup(
+ int unival
+)
+{
+ int res;
+
+ if( ! IS_UNI_BUCKET(unival) )
+ return -1;
+
+ for (res = 0; res < 256; res++)
+ if (unicode_map[res] == unival)
+ return res;
+ return -1;
+}
+
+/* mark the buckets for quick lookup */
+
+static void
+unicode_prepare_buckets(
+ void
+)
+{
+ int i;
+
+ memset(uni_user_buckets, 0, sizeof uni_user_buckets);
+ for(i=0; i<256; i++) {
+ if(unicode_map[i] != (unsigned) -1)
+ MARK_UNI_BUCKET(unicode_map[i]);
+ }
+}
+
+#if 0 /* XXX */
+static int
+old_unicode_to_win31(
+ int unival,
+ char *name
+)
+{
+ int i, res;
+ static unsigned char used[256];
+
+ if(unival<0) {
+ fprintf(stderr,"**** Internal error: unicode value < 0 ****\n");
+ exit(1);
+ }
+
+ /* know the language */
+ if(uni_lang_converter!=0)
+ return (*uni_lang_converter)(unival, name, uni_lang_arg);
+
+ /* don't know the language, try all */
+ for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) {
+ res=(*uni_lang[i].conv)(unival, name, NULL);
+ if(res == -1)
+ continue;
+ if(res & ~0xff) {
+ fprintf(stderr,"**** Internal error: broken unicode conversion ****\n");
+ fprintf(stderr,"**** language '%s' code 0x%04x ****\n",
+ uni_lang[i].name, unival);
+ exit(1);
+ }
+ /* make sure that the priority is in the order of the language list */
+ if(used[res]>i)
+ return -1;
+ else {
+ used[res]=250-i;
+ return res;
+ }
+ }
+
+ return -1;
+}
+#endif
+
+/*
+ * Scale the values according to the scale_factor
+ */
+
+double
+fscale(
+ double val
+)
+{
+ return scale_factor * val;
+}
+
+int
+iscale(
+ int val
+)
+{
+ return (int) (val > 0 ? scale_factor * val + 0.5
+ : scale_factor * val - 0.5);
+}
+
+/*
+ * Try to force fixed width of characters
+ */
+
+static void
+alignwidths(void)
+{
+ int i;
+ int n = 0, avg, max = 0, min = 3000, sum = 0, x;
+
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ x = glyph_list[i].width;
+
+ if (x != 0) {
+ if (x < min)
+ min = x;
+ if (x > max)
+ max = x;
+
+ sum += x;
+ n++;
+ }
+ }
+ }
+
+ if (n == 0)
+ return;
+
+ avg = sum / n;
+
+ WARNING_3 fprintf(stderr, "widths: max=%d avg=%d min=%d\n", max, avg, min);
+
+ /* if less than 5% variation from average */
+ /* force fixed width */
+ if (20 * (avg - min) < avg && 20 * (max - avg) < avg) {
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED)
+ glyph_list[i].width = avg;
+ }
+ fontm.is_fixed_pitch = 1;
+ }
+}
+
+static void
+convert_glyf(
+ int glyphno
+)
+{
+ GLYPH *g;
+ int ncurves;
+
+ g = &glyph_list[glyphno];
+
+
+ g->scaledwidth = iscale(g->width);
+
+ g->entries = 0;
+ g->lastentry = 0;
+ g->path = 0;
+ if (g->ttf_pathlen != 0) {
+ cursw->glpath(glyphno, glyph_list);
+ g->lastentry = 0;
+
+ if(ISDBG(BUILDG))
+ dumppaths(g, NULL, NULL);
+
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ fclosepaths(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ /* float processing */
+ if(smooth) {
+ ffixquadrants(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ fsplitzigzags(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ fforceconcise(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ fstraighten(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+ }
+
+ pathtoint(g);
+ /* all processing past this point expects integer path */
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+#if 0
+ fixcontours(g);
+ testfixcvdir(g);
+#endif
+
+ /* int processing */
+ if (smooth) {
+ smoothjoints(g);
+ assertpath(g->entries, __FILE__, __LINE__, g->name);
+
+ flattencurves(g);
+ }
+
+ ncurves = 0;
+ {
+ GENTRY *ge;
+ for(ge = g->entries; ge; ge = ge->next)
+ ncurves++;
+ }
+ if (ncurves > 100) {
+ WARNING_2 fprintf(stderr,
+ "** Glyph %s is too long, may display incorrectly\n",
+ g->name);
+ }
+ } else {
+ /* for buildstems */
+ g->flags &= ~GF_FLOAT;
+ }
+}
+
+static void
+handle_gnames(void)
+{
+ int i, n, found, c, type;
+
+ /* get the names from the font file */
+ ps_fmt_3 = cursw->glnames(glyph_list);
+
+ /* check for names with wrong characters */
+ for (n = 0; n < numglyphs; n++) {
+ int c;
+ for (i = 0; (c = glyph_list[n].name[i]) != 0; i++) {
+ if (!(isalnum(c) || c == '.' || c == '_' )
+ || i==0 && isdigit(c)) { /* must not start with a digit */
+ WARNING_3 fprintf(stderr, "Glyph %d %s (%s), ",
+ n, isdigit(c) ? "name starts with a digit" :
+ "has bad characters in name",
+ glyph_list[n].name);
+ glyph_list[n].name = malloc(10);
+ sprintf(glyph_list[n].name, "_%d", n);
+ WARNING_3 fprintf(stderr, "changing to %s\n", glyph_list[n].name);
+ break;
+ }
+ }
+ }
+
+ if( !ps_fmt_3 ) {
+ /* check for duplicate names */
+ for (n = 0; n < numglyphs; n++) {
+ found = 0;
+ for (i = 0; i < n && !found; i++) {
+ if (strcmp(glyph_list[i].name, glyph_list[n].name) == 0) {
+ glyph_list[n].name = malloc(10);
+ sprintf(glyph_list[n].name, "_%d", n);
+ WARNING_3 fprintf(stderr,
+ "Glyph %d has the same name as %d: (%s), changing to %s\n",
+ n, i,
+ glyph_list[i].name,
+ glyph_list[n].name);
+ found = 1;
+ }
+ }
+ }
+
+ }
+
+ /* start the encoding stuff */
+ for (i = 0; i < 256; i++) {
+ encoding[i] = -1;
+ }
+
+ /* do the 1st round of encoding by name */
+ if(!ps_fmt_3 && uni_lang_selected && uni_lang_selected->convbyname) {
+ for (n = 0; n < numglyphs; n++) {
+ c = uni_lang_selected->convbyname(glyph_list[n].name,
+ uni_lang_arg, UNICONV_BYNAME_BEFORE);
+ if(c>=0 && c<256 && encoding[n] == -1)
+ encoding[n] = n;
+ }
+ }
+
+ /* now do the encoding by table */
+ if(uni_lang_selected) {
+ for(i=0; i < MAXUNITABLES && uni_lang_selected->init[i]; i++) {
+ for (n = 0; n < 256; n++)
+ unicode_map[n] = -1;
+ uni_lang_selected->init[i](uni_lang_arg);
+ unicode_prepare_buckets();
+ if( cursw->glenc(glyph_list, encoding, unicode_map) == 0 )
+ /* if we have an 8-bit encoding we don't need more tries */
+ break;
+ }
+ } else {
+ /* language is unknown, try the first table of each */
+ for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) {
+ if(uni_lang[i].init[0] == NULL)
+ continue;
+ for (n = 0; n < 256; n++)
+ unicode_map[n] = -1;
+ uni_lang[i].init[0](uni_lang_arg);
+ unicode_prepare_buckets();
+ if( cursw->glenc(glyph_list, encoding, unicode_map) == 0 )
+ /* if we have an 8-bit encoding we don't need more tries */
+ break;
+ }
+ }
+
+ if (ps_fmt_3) {
+ for (i = 0; i < 256; i++) {
+ if (encoding[i] > 0) {
+ glyph_list[encoding[i]].name = Fmt3Encoding[i];
+ }
+ }
+ }
+
+ /* do the 2nd round of encoding by name */
+ if(uni_lang_selected && uni_lang_selected->convbyname) {
+ for (n = 0; n < numglyphs; n++) {
+ c = uni_lang_selected->convbyname(glyph_list[n].name,
+ uni_lang_arg, UNICONV_BYNAME_AFTER);
+ if(c>=0 && c<256 && encoding[n] == -1)
+ encoding[n] = n;
+ }
+ }
+ /* all the encoding things are done */
+
+ for (i = 0; i < 256; i++) {
+ if(encoding[i] == -1) /* defaults to .notdef */
+ encoding[i] = 0;
+ glyph_list[encoding[i]].char_no = i;
+ }
+
+ /* enforce two special cases defined in TTF manual */
+ if(numglyphs > 0)
+ glyph_list[0].name = ".notdef";
+ if(numglyphs > 1)
+ glyph_list[1].name = ".null";
+
+ for (i = 0; i < 256; i++) {
+ if ((encoding[i] != 0) && glyph_rename[i]) {
+ glyph_list[encoding[i]].name = glyph_rename[i];
+ }
+ }
+
+}
+
+static void
+usage(void)
+{
+
+#ifdef _GNU_SOURCE
+# define fplop(txt) fputs(txt, stderr);
+#else
+# define fplop(txt)
+#endif
+
+ fputs("Use:\n", stderr);
+ fputs("ttf2pt1 [-<opts>] [-l language | -L file] <ttf-file> [<fontname>]\n", stderr);
+ fputs(" or\n", stderr);
+ fputs("ttf2pt1 [-<opts>] [-l language | -L file] <ttf-file> -\n", stderr);
+ fputs(" or\n", stderr);
+ fputs("ttf2pt1 [-<opts>] [-l language | -L file] <ttf-file> - | t1asm > <pfa-file>\n", stderr);
+
+ fplop("\n");
+ fplop("This build supports both short and long option names,\n");
+ fplop("the long options are listed before corresponding short ones\n");
+
+ fplop(" --afm\n");
+ fputs(" -A - write the .afm file to STDOUT instead of the font itself\n", stderr);
+ fplop(" --all-glyphs\n");
+ fputs(" -a - include all glyphs, even those not in the encoding table\n", stderr);
+ fplop(" --pfb\n");
+ fputs(" -b - produce a compressed .pfb file\n", stderr);
+ fplop(" --debug dbg_suboptions\n");
+ fputs(" -d dbg_suboptions - debugging options, run ttf2pt1 -d? for help\n", stderr);
+ fplop(" --encode\n");
+ fputs(" -e - produce a fully encoded .pfa file\n", stderr);
+ fplop(" --force-unicode\n");
+ fputs(" -F - force use of Unicode encoding even if other MS encoding detected\n", stderr);
+ fplop(" --language language\n");
+ fputs(" -l language - convert Unicode to specified language, run ttf2pt1 -l? for list\n", stderr);
+ fplop(" --language-map file\n");
+ fputs(" -L file - convert Unicode according to encoding description file\n", stderr);
+ fplop(" --limit <type>=<value>\n");
+ fputs(" -m <type>=<value> - set maximal limit of given type to value, types:\n", stderr);
+ fputs(" h - maximal hint stack depth in the PostScript interpreter\n", stderr);
+ fplop(" --processing suboptions\n");
+ fputs(" -O suboptions - control outline processing, run ttf2pt1 -O? for help\n", stderr);
+ fplop(" --parser name\n");
+ fputs(" -p name - use specific front-end parser, run ttf2pt1 -p? for list\n", stderr);
+ fplop(" --uid id\n");
+ fputs(" -u id - use this UniqueID, -u A means autogeneration\n", stderr);
+ fplop(" --vertical-autoscale size\n");
+ fputs(" -v size - scale the font to make uppercase letters >size/1000 high\n", stderr);
+ fplop(" --version\n");
+ fputs(" -V - print ttf2pt1 version number\n", stderr);
+ fplop(" --warning number\n");
+ fputs(" -W number - set the level of permitted warnings (0 - disable)\n", stderr);
+ fputs("Obsolete options (will be removed in future releases, use -O? instead):\n", stderr);
+ fputs(" -f - don't try to guess the value of the ForceBold hint\n", stderr);
+ fputs(" -h - disable autogeneration of hints\n", stderr);
+ fputs(" -H - disable hint substitution\n", stderr);
+ fputs(" -o - disable outline optimization\n", stderr);
+ fputs(" -s - disable outline smoothing\n", stderr);
+ fputs(" -t - disable auto-scaling to 1000x1000 standard matrix\n", stderr);
+ fputs(" -w - correct the glyph widths (use only for buggy fonts)\n", stderr);
+ fputs("With no <fontname>, write to <ttf-file> with suffix replaced.\n", stderr);
+ fputs("The last '-' means 'use STDOUT'.\n", stderr);
+
+#undef fplop
+
+}
+
+static void
+printversion(void)
+{
+ fprintf(stderr, "ttf2pt1 %s\n", TTF2PT1_VERSION);
+}
+
+int
+main(
+ int argc,
+ char **argv
+)
+{
+ int i, j;
+ time_t now;
+ char filename[256];
+ int c,nchars,nmetrics;
+ int ws;
+ int forcebold= -1; /* -1 means "don't know" */
+ char *lang;
+ int oc;
+ int subid;
+#ifdef _GNU_SOURCE
+# define ttf2pt1_getopt(a, b, c, d, e) getopt_long(a, b, c, d, e)
+ static struct option longopts[] = {
+ { "afm", 0, NULL, 'A' },
+ { "all-glyphs", 0, NULL, 'a' },
+ { "pfb", 0, NULL, 'b' },
+ { "debug", 1, NULL, 'd' },
+ { "encode", 0, NULL, 'e' },
+ { "force-unicode", 0, NULL, 'F' },
+ { "language", 1, NULL, 'l' },
+ { "language-map", 1, NULL, 'L' },
+ { "limit", 1, NULL, 'm' },
+ { "processing", 1, NULL, 'O' },
+ { "parser", 1, NULL, 'p' },
+ { "uid", 1, NULL, 'u' },
+ { "vertical-autoscale", 1, NULL, 'v' },
+ { "version", 0, NULL, 'V' },
+ { "warning", 1, NULL, 'W' },
+ { NULL, 0, NULL, 0 }
+ };
+#else
+# define ttf2pt1_getopt(a, b, c, d, e) getopt(a, b, c)
+#endif
+
+ /* initialize sub-options of -O */
+ for(i=0; i< (sizeof opotbl)/(sizeof opotbl[0]); i++) {
+ opotbl[i].disbl = tolower(opotbl[i].disbl);
+ opotbl[i].enbl = toupper(opotbl[i].disbl);
+ *(opotbl[i].valp) = opotbl[i].dflt;
+ }
+
+ while(( oc=ttf2pt1_getopt(argc, argv, "FaoebAsthHfwVv:p:l:d:u:L:m:W:O:",
+ longopts, NULL) )!= -1) {
+ switch(oc) {
+ case 'W':
+ if(sscanf(optarg, "%d", &warnlevel) < 1 || warnlevel < 0) {
+ fprintf(stderr, "**** warning level must be a positive number\n");
+ exit(1);
+ }
+ break;
+ case 'F':
+ forceunicode = 1;
+ break;
+ case 'o':
+ fputs("Warning: option -o is obsolete, use -Oo instead\n", stderr);
+ optimize = 0;
+ break;
+ case 'e':
+ encode = 1;
+ break;
+ case 'b':
+ encode = pfbflag = 1;
+ break;
+ case 'A':
+ wantafm = 1;
+ break;
+ case 'a':
+ allglyphs = 1;
+ break;
+ case 's':
+ fputs("Warning: option -s is obsolete, use -Os instead\n", stderr);
+ smooth = 0;
+ break;
+ case 't':
+ fputs("Warning: option -t is obsolete, use -Ot instead\n", stderr);
+ transform = 0;
+ break;
+ case 'd':
+ for(i=0; optarg[i]!=0; i++)
+ switch(optarg[i]) {
+ case 'a':
+ absolute = 1;
+ break;
+ case 'r':
+ reverse = 0;
+ break;
+ default:
+ if (optarg[i] != '?')
+ fprintf(stderr, "**** Unknown debugging option '%c' ****\n", optarg[i]);
+ fputs("The recognized debugging options are:\n", stderr);
+ fputs(" a - enable absolute coordinates\n", stderr);
+ fputs(" r - do not reverse font outlines directions\n", stderr);
+ exit(1);
+ break;
+ };
+ break;
+ case 'm':
+ {
+ char subopt;
+ int val;
+
+ if(sscanf(optarg, "%c=%d", &subopt, &val) !=2) {
+ fprintf(stderr, "**** Misformatted maximal limit ****\n");
+ fprintf(stderr, "spaces around the equal sign are not allowed\n");
+ fprintf(stderr, "good examples: -mh=100 -m h=100\n");
+ fprintf(stderr, "bad examples: -mh = 100 -mh= 100\n");
+ exit(1);
+ break;
+ }
+ switch(subopt) {
+ case 'h':
+ max_stemdepth = val;
+ break;
+ default:
+ if (subopt != '?')
+ fprintf(stderr, "**** Unknown limit type '%c' ****\n", subopt);
+ fputs("The recognized limit types are:\n", stderr);
+ fputs(" h - maximal hint stack depth in the PostScript interpreter\n", stderr);
+ exit(1);
+ break;
+ }
+ break;
+ }
+ case 'O':
+ {
+ char subopt;
+ char *p;
+ char dflt[20]; /* should be big enough */
+ for(p=optarg; (subopt = *p) != 0; p++) {
+ for(i=0; i< (sizeof opotbl)/(sizeof opotbl[0]); i++) {
+ if(subopt == opotbl[i].disbl) {
+ *(opotbl[i].valp) = 0;
+ break;
+ } else if(subopt == opotbl[i].enbl) {
+ *(opotbl[i].valp) = 1;
+ break;
+ }
+ }
+ if( i == (sizeof opotbl)/(sizeof opotbl[0]) ) { /* found no match */
+ if (subopt != '?')
+ fprintf(stderr, "**** Unknown outline processing suboption '%c' ****\n", subopt);
+ fprintf(stderr,"The general form of the outline processing option is:\n");
+ fprintf(stderr," -O suboptions\n");
+ fprintf(stderr,"(To remember easily -O may be also thought of as \"optimization\").\n");
+ fprintf(stderr,"The lowercase suboptions disable features, corresponding\n");
+ fprintf(stderr,"uppercase suboptions enable them. The supported suboptions,\n");
+ fprintf(stderr,"their default states and the features they control are:\n");
+ p = dflt;
+ for(i=0; i< (sizeof opotbl)/(sizeof opotbl[0]); i++) {
+ fprintf(stderr," %c/%c - [%s] %s\n", opotbl[i].disbl, opotbl[i].enbl,
+ opotbl[i].dflt ? "enabled" : "disabled", opotbl[i].descr);
+ if(opotbl[i].dflt)
+ *p++ = opotbl[i].enbl;
+ else
+ *p++ = opotbl[i].disbl;
+ }
+ *p = 0;
+ fprintf(stderr, "The default state corresponds to the option -O %s\n", dflt);
+ exit(1);
+ }
+ }
+ break;
+ }
+ case 'h':
+ fputs("Warning: option -h is obsolete, use -Oh instead\n", stderr);
+ hints = 0;
+ break;
+ case 'H':
+ fputs("Warning: meaning of option -H has been changed to its opposite\n", stderr);
+ fputs("Warning: option -H is obsolete, use -Ou instead\n", stderr);
+ subhints = 0;
+ break;
+ case 'f':
+ fputs("Warning: option -f is obsolete, use -Ob instead\n", stderr);
+ trybold = 0;
+ break;
+ case 'w':
+ fputs("Warning: option -w is obsolete, use -OW instead\n", stderr);
+ correctwidth = 1;
+ break;
+ case 'u':
+ if(wantuid) {
+ fprintf(stderr, "**** UniqueID may be specified only once ****\n");
+ exit(1);
+ }
+ wantuid = 1;
+ if(optarg[0]=='A' && optarg[1]==0)
+ strUID=0; /* will be generated automatically */
+ else {
+ strUID=optarg;
+ for(i=0; optarg[i]!=0; i++)
+ if( !isdigit(optarg[i]) ) {
+ fprintf(stderr, "**** UniqueID must be numeric or A for automatic ****\n");
+ exit(1);
+ }
+ }
+ break;
+ case 'v':
+ correctvsize = atoi(optarg);
+ if(correctvsize <= 0 && correctvsize > 1000) {
+ fprintf(stderr, "**** wrong vsize '%d', ignored ****\n", correctvsize);
+ correctvsize=0;
+ }
+ break;
+ case 'p':
+ if(cursw!=0) {
+ fprintf(stderr, "**** only one front-end parser be used ****\n");
+ exit(1);
+ }
+
+ { /* separate parser from parser-specific argument */
+ char *p = strchr(optarg, LANG_ARG_SEP);
+ if(p != 0) {
+ *p = 0;
+ front_arg = p+1;
+ } else
+ front_arg = "";
+ }
+ for(i=0; frontswtab[i] != NULL; i++)
+ if( !strcmp(frontswtab[i]->name, optarg) ) {
+ cursw = frontswtab[i];
+ break;
+ }
+
+ if(cursw==0) {
+ if (strcmp(optarg, "?"))
+ fprintf(stderr, "**** unknown front-end parser '%s' ****\n", optarg);
+ fputs("the following front-ends are supported now:\n", stderr);
+ for(i=0; frontswtab[i] != NULL; i++) {
+ fprintf(stderr," %s (%s)\n file suffixes: ",
+ frontswtab[i]->name,
+ frontswtab[i]->descr ? frontswtab[i]->descr : "no description"
+ );
+ for(j=0; j<MAXSUFFIX; j++)
+ if(frontswtab[i]->suffix[j])
+ fprintf(stderr, "%s ", frontswtab[i]->suffix[j]);
+ fprintf(stderr, "\n");
+ }
+ exit(1);
+ }
+ break;
+ case 'l':
+ if(uni_lang_selected!=0) {
+ fprintf(stderr, "**** only one language option may be used ****\n");
+ exit(1);
+ }
+
+ { /* separate language from language-specific argument */
+ char *p = strchr(optarg, LANG_ARG_SEP);
+ if(p != 0) {
+ *p = 0;
+ uni_lang_arg = p+1;
+ } else
+ uni_lang_arg = "";
+ }
+ for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++)
+ if( !strcmp(uni_lang[i].name, optarg) ) {
+ uni_lang_selected = &uni_lang[i];
+ uni_sample = uni_lang[i].sample_upper;
+ break;
+ }
+
+ if(uni_lang_selected==0) {
+ if (strcmp(optarg, "?"))
+ fprintf(stderr, "**** unknown language '%s' ****\n", optarg);
+ fputs(" the following languages are supported now:\n", stderr);
+ for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++)
+ fprintf(stderr," %s (%s)\n",
+ uni_lang[i].name,
+ uni_lang[i].descr ? uni_lang[i].descr : "no description"
+ );
+ exit(1);
+ }
+ break;
+ case 'L':
+ if(uni_lang_selected!=0) {
+ fprintf(stderr, "**** only one language option may be used ****\n");
+ exit(1);
+ }
+ uni_lang_selected = &uni_lang_user;
+ uni_lang_arg = optarg;
+ break;
+ case 'V':
+ printversion();
+ exit(0);
+ break;
+ default:
+ usage();
+ exit(1);
+ break;
+ }
+ }
+ argc-=optind-1; /* the rest of code counts from argv[0] */
+ argv+=optind-1;
+
+ if (absolute && encode) {
+ fprintf(stderr, "**** options -a and -e are incompatible ****\n");
+ exit(1);
+ }
+ if ((argc != 2) && (argc != 3)) {
+ usage();
+ exit(1);
+ }
+
+ /* try to guess the language by the locale used */
+ if(uni_lang_selected==0 && (lang=getenv("LANG"))!=0 ) {
+ for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) {
+ if( !strncmp(uni_lang[i].name, lang, strlen(uni_lang[i].name)) ) {
+ uni_lang_selected = &uni_lang[i];
+ goto got_a_language;
+ }
+ }
+ /* no full name ? try aliases */
+ for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) {
+ for(c=0; c<MAXUNIALIAS; c++)
+ if( uni_lang[i].alias[c]!=0
+ && !strncmp(uni_lang[i].alias[c], lang, strlen(uni_lang[i].alias[c])) ) {
+ uni_lang_selected = &uni_lang[i];
+ goto got_a_language;
+ }
+ }
+ got_a_language:
+ if(uni_lang_selected!=0) {
+ WARNING_1 fprintf(stderr, "Using language '%s' for Unicode fonts\n", uni_lang[i].name);
+ uni_sample = uni_lang[i].sample_upper;
+ }
+ }
+
+ /* try to guess the front-end parser by the file name suffix */
+ if(cursw==0) {
+ char *p = strrchr(argv[1], '.');
+ char *s;
+
+ if(p!=0 && (s = strdup(p+1))!=0) {
+ for(p=s; *p; p++)
+ *p = tolower(*p);
+ p = s;
+
+ for(i=0; frontswtab[i] != 0 && cursw == 0; i++) {
+ for(j=0; j<MAXSUFFIX; j++)
+ if(frontswtab[i]->suffix[j]
+ && !strcmp(p, frontswtab[i]->suffix[j]) ) {
+ cursw = frontswtab[i];
+ WARNING_1 fprintf(stderr, "Auto-detected front-end parser '%s'\n",
+ cursw->name);
+ WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n");
+ break;
+ }
+ }
+ free(s);
+ }
+
+ if(cursw==0) {
+ cursw = frontswtab[0];
+ WARNING_1 fprintf(stderr, "Can't detect front-end parser, using '%s' by default\n",
+ cursw->name);
+ WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n");
+ }
+ }
+
+ /* open the input file */
+ cursw->open(argv[1], front_arg);
+
+ /* Get base name of output file (if not specified)
+ * by removing (known) suffixes
+ */
+ if (argc == 2) {
+ char *p;
+ argv[2] = strdup (argv[1]);
+ p = strrchr(argv[2], '.');
+ if (p != NULL)
+ for (j = 0; (j < MAXSUFFIX) && (cursw->suffix[j]); j++)
+ if (!strcmp(p+1, cursw->suffix[j])) {
+ *p = '\0';
+ break;
+ }
+ }
+
+ if (argv[2][0] == '-' && argv[2][1] == 0) {
+ pfa_file = stdout;
+#ifdef WINDOWS
+ if(encode) {
+ fprintf(stderr, "**** can't write encoded file to stdout ***\n");
+ exit(1);
+ }
+#endif /* WINDOWS */
+ if ((afm_file = fopen(BITBUCKET, "w+")) == NULL) {
+ fprintf(stderr, "**** Cannot open %s ****\n",
+ BITBUCKET);
+ exit(1);
+ }
+ if(wantafm) { /* print .afm instead of .pfa */
+ FILE *n;
+ n=pfa_file;
+ pfa_file=afm_file;
+ afm_file=n;
+ }
+ } else {
+#ifndef WINDOWS
+ sprintf(filename, "%s.%s", argv[2], encode ? (pfbflag ? "pfb" : "pfa") : "t1a" );
+#else /* WINDOWS */
+ sprintf(filename, "%s.t1a", argv[2]);
+#endif /* WINDOWS */
+ if ((pfa_file = fopen(filename, "w+b")) == NULL) {
+ fprintf(stderr, "**** Cannot create %s ****\n", filename);
+ exit(1);
+ } else {
+ WARNING_2 fprintf(stderr, "Creating file %s\n", filename);
+ }
+
+ sprintf(filename, "%s.afm", argv[2]) ;
+ if ((afm_file = fopen(filename, "w+")) == NULL) {
+ fprintf(stderr, "**** Cannot create %s ****\n", filename);
+ exit(1);
+ }
+ }
+
+ /*
+ * Now check whether we want a fully encoded .pfa file
+ */
+#ifndef WINDOWS
+ if (encode) {
+ int p[2];
+ extern FILE *ifp, *ofp; /* from t1asm.c */
+
+ ifp=stdin;
+ ofp=stdout;
+
+ if (pipe(p) < 0) {
+ perror("**** Cannot create pipe ****\n");
+ exit(1);
+ }
+ ofp = pfa_file;
+ ifp = fdopen(p[0], "r");
+ if (ifp == NULL) {
+ perror("**** Cannot use pipe for reading ****\n");
+ exit(1);
+ }
+ pfa_file = fdopen(p[1], "w");
+ if (pfa_file == NULL) {
+ perror("**** Cannot use pipe for writing ****\n");
+ exit(1);
+ }
+ switch (fork()) {
+ case -1:
+ perror("**** Cannot fork the assembler process ****\n");
+ exit(1);
+ case 0: /* child */
+ fclose(pfa_file);
+ exit(runt1asm(pfbflag));
+ default: /* parent */
+ fclose(ifp); fclose(ofp);
+ }
+ }
+#endif /* WINDOWS */
+
+ numglyphs = cursw->nglyphs();
+
+ WARNING_3 fprintf(stderr, "numglyphs = %d\n", numglyphs);
+
+ glyph_list = (GLYPH *) calloc(numglyphs, sizeof(GLYPH));
+
+ /* initialize non-0 fields */
+ for (i = 0; i < numglyphs; i++) {
+ GLYPH *g;
+
+ g = &glyph_list[i];
+ g->char_no = -1;
+ g->orig_code = -1;
+ g->name = "UNKNOWN";
+ g->flags = GF_FLOAT; /* we start with float representation */
+ }
+
+ handle_gnames();
+
+ cursw->glmetrics(glyph_list);
+ cursw->fnmetrics(&fontm);
+
+ original_scale_factor = 1000.0 / (double) fontm.units_per_em;
+
+ if(transform == 0)
+ scale_factor = 1.0; /* don't transform */
+ else
+ scale_factor = original_scale_factor;
+
+ if(correctvsize && uni_sample!=0) { /* only for known languages */
+ /* try to adjust the scale factor to make a typical
+ * uppercase character of hight at least (correctvsize), this
+ * may improve the appearance of the font but also
+ * make it weird, use with caution
+ */
+ int ysz;
+
+ ysz = iscale(glyph_list[encoding[uni_sample]].yMax);
+ if( ysz<correctvsize ) {
+ scale_factor *= (double)correctvsize / ysz;
+ }
+ }
+
+ if(allglyphs) {
+ for (i = 0; i < numglyphs; i++) {
+ glyph_list[i].flags |= GF_USED;
+ }
+ } else {
+ for (i = 0; i < 256; i++) {
+ glyph_list[encoding[i]].flags |= GF_USED;
+ }
+
+ /* also always include .notdef */
+ for (i = 0; i < numglyphs; i++)
+ if(!strcmp(glyph_list[i].name, ".notdef")) {
+ glyph_list[i].flags |= GF_USED;
+ break;
+ }
+ }
+
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ DBG_TO_GLYPH(&glyph_list[i]);
+ convert_glyf(i);
+ DBG_FROM_GLYPH(&glyph_list[i]);
+ }
+ }
+
+ italic_angle = fontm.italic_angle;
+
+ if (italic_angle > 45.0 || italic_angle < -45.0)
+ italic_angle = 0.0; /* consider buggy */
+
+ if (hints) {
+ findblues();
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ DBG_TO_GLYPH(&glyph_list[i]);
+ buildstems(&glyph_list[i]);
+ assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name);
+ DBG_FROM_GLYPH(&glyph_list[i]);
+ }
+ }
+ stemstatistics();
+ } else {
+ for(i=0; i<4; i++)
+ bbox[i] = iscale(fontm.bbox[i]);
+ }
+ /* don't touch the width of fixed width fonts */
+ if( fontm.is_fixed_pitch )
+ correctwidth=0;
+ docorrectwidth(); /* checks correctwidth inside */
+ if (reverse)
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ DBG_TO_GLYPH(&glyph_list[i]);
+ reversepaths(&glyph_list[i]);
+ assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name);
+ DBG_FROM_GLYPH(&glyph_list[i]);
+ }
+ }
+
+
+#if 0
+ /*
+ ** It seems to bring troubles. The problem is that some
+ ** styles of the font may be recognized as fixed-width
+ ** while other styles of the same font as proportional.
+ ** So it's better to be commented out yet.
+ */
+ if (tryfixed)
+ alignwidths();
+#endif
+
+ if(trybold) {
+ forcebold = fontm.force_bold;
+ }
+
+ fprintf(pfa_file, "%%!PS-AdobeFont-1.0: %s %s\n", fontm.name_ps, fontm.name_copyright);
+ time(&now);
+ fprintf(pfa_file, "%%%%CreationDate: %s", ctime(&now));
+ fprintf(pfa_file, "%% Converted from TrueType font %s by ttf2pt1 %s\n%%\n", argv[1], TTF2PT1_VERSION);
+ fprintf(pfa_file, "%%%%EndComments\n");
+ fprintf(pfa_file, "12 dict begin\n/FontInfo 9 dict dup begin\n");
+
+ WARNING_3 fprintf(stderr, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix);
+
+
+ fprintf(pfa_file, "/version (%s) readonly def\n", fontm.name_version);
+
+ fprintf(pfa_file, "/Notice (%s) readonly def\n", fontm.name_copyright);
+
+ fprintf(pfa_file, "/FullName (%s) readonly def\n", fontm.name_full);
+ fprintf(pfa_file, "/FamilyName (%s) readonly def\n", fontm.name_family);
+
+ if(wantuid) {
+ if(strUID)
+ fprintf(pfa_file, "/UniqueID %s def\n", strUID);
+ else {
+ numUID=0;
+ for(i=0; fontm.name_full[i]!=0; i++) {
+ numUID *= 37; /* magic number, good for hash */
+ numUID += fontm.name_full[i]-' ';
+ /* if the name is long the first chars
+ * may be lost forever, so re-insert
+ * them thus making kind of CRC
+ */
+ numUID += (numUID>>24) & 0xFF;
+ }
+ /* the range for private UIDs is 4 000 000 - 4 999 999 */
+ fprintf(pfa_file, "/UniqueID %lu def\n", numUID%1000000+4000000);
+ }
+ }
+
+ fprintf(pfa_file, "/Weight (%s) readonly def\n", fontm.name_style);
+
+ fprintf(pfa_file, "/ItalicAngle %f def\n", italic_angle);
+ fprintf(pfa_file, "/isFixedPitch %s def\n",
+ fontm.is_fixed_pitch ? "true" : "false");
+
+ /* we don't print out the unused glyphs */
+ nchars = 0;
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ nchars++;
+ }
+ }
+
+ fprintf(afm_file, "StartFontMetrics 4.1\n");
+ fprintf(afm_file, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix);
+ fprintf(afm_file, "FullName %s\n", fontm.name_full);
+ fprintf(afm_file, "Notice %s\n", fontm.name_copyright);
+ fprintf(afm_file, "EncodingScheme FontSpecific\n");
+ fprintf(afm_file, "FamilyName %s\n", fontm.name_family);
+ fprintf(afm_file, "Weight %s\n", fontm.name_style);
+ fprintf(afm_file, "Version %s\n", fontm.name_version);
+ fprintf(afm_file, "Characters %d\n", nchars);
+ fprintf(afm_file, "ItalicAngle %.1f\n", italic_angle);
+
+ fprintf(afm_file, "Ascender %d\n", fontm.ascender);
+ fprintf(afm_file, "Descender %d\n", fontm.descender);
+
+ fprintf(pfa_file, "/UnderlinePosition %d def\n",
+ iscale(fontm.underline_position));
+
+ fprintf(pfa_file, "/UnderlineThickness %hd def\nend readonly def\n",
+ iscale(fontm.underline_thickness));
+
+ fprintf(afm_file, "UnderlineThickness %d\n",
+ iscale(fontm.underline_thickness));
+
+ fprintf(afm_file, "UnderlinePosition %d\n",
+ iscale(fontm.underline_position));
+
+ fprintf(afm_file, "IsFixedPitch %s\n",
+ fontm.is_fixed_pitch ? "true" : "false");
+ fprintf(afm_file, "FontBBox %d %d %d %d\n",
+ bbox[0], bbox[1], bbox[2], bbox[3]);
+
+ fprintf(pfa_file, "/FontName /%s%s def\n", fontm.name_ps, uni_font_name_suffix);
+ fprintf(pfa_file, "/PaintType 0 def\n/StrokeWidth 0 def\n");
+ /* I'm not sure if these are fixed */
+ fprintf(pfa_file, "/FontType 1 def\n");
+
+ if (transform) {
+ fprintf(pfa_file, "/FontMatrix [0.001 0 0 0.001 0 0] def\n");
+ } else {
+ fprintf(pfa_file, "/FontMatrix [%9.7f 0 0 %9.7f 0 0] def\n",
+ original_scale_factor / 1000.0, original_scale_factor / 1000.0);
+ }
+
+ fprintf(pfa_file, "/FontBBox {%d %d %d %d} readonly def\n",
+ bbox[0], bbox[1], bbox[2], bbox[3]);
+
+ fprintf(pfa_file, "/Encoding 256 array\n");
+ /* determine number of elements for metrics table */
+ nmetrics = 256;
+ for (i = 0; i < numglyphs; i++) {
+ if( glyph_list[i].flags & GF_USED
+ && glyph_list[i].char_no == -1 ) {
+ nmetrics++;
+ }
+ }
+ fprintf(afm_file, "StartCharMetrics %d\n", nmetrics);
+
+ for (i = 0; i < 256; i++) {
+ fprintf(pfa_file,
+ "dup %d /%s put\n", i, glyph_list[encoding[i]].name);
+ if( glyph_list[encoding[i]].flags & GF_USED ) {
+ print_glyph_metrics(i, encoding[i]);
+ }
+ }
+
+ /* print the metrics for glyphs not in encoding table */
+ if(allglyphs) {
+ for(i=0; i<numglyphs; i++) {
+ if( (glyph_list[i].flags & GF_USED)
+ && glyph_list[i].char_no == -1 ) {
+ print_glyph_metrics(-1, i);
+ }
+ }
+ }
+
+ fprintf(pfa_file, "readonly def\ncurrentdict end\ncurrentfile eexec\n");
+ fprintf(pfa_file, "dup /Private 16 dict dup begin\n");
+
+ fprintf(pfa_file, "/RD{string currentfile exch readstring pop}executeonly def\n");
+ fprintf(pfa_file, "/ND{noaccess def}executeonly def\n");
+ fprintf(pfa_file, "/NP{noaccess put}executeonly def\n");
+
+ /* UniqueID must be shown twice, in both font and Private dictionary */
+ if(wantuid) {
+ if(strUID)
+ fprintf(pfa_file, "/UniqueID %s def\n", strUID);
+ else
+ fprintf(pfa_file, "/UniqueID %lu def\n", numUID);
+ }
+
+ if(forcebold==0)
+ fprintf(pfa_file, "/ForceBold false def\n");
+ else if(forcebold==1)
+ fprintf(pfa_file, "/ForceBold true def\n");
+
+ fprintf(pfa_file, "/BlueValues [ ");
+ for (i = 0; i < nblues; i++)
+ fprintf(pfa_file, "%d ", bluevalues[i]);
+ fprintf(pfa_file, "] def\n");
+
+ fprintf(pfa_file, "/OtherBlues [ ");
+ for (i = 0; i < notherb; i++)
+ fprintf(pfa_file, "%d ", otherblues[i]);
+ fprintf(pfa_file, "] def\n");
+
+ if (stdhw != 0)
+ fprintf(pfa_file, "/StdHW [ %d ] def\n", stdhw);
+ if (stdvw != 0)
+ fprintf(pfa_file, "/StdVW [ %d ] def\n", stdvw);
+ fprintf(pfa_file, "/StemSnapH [ ");
+ for (i = 0; i < 12 && stemsnaph[i] != 0; i++)
+ fprintf(pfa_file, "%d ", stemsnaph[i]);
+ fprintf(pfa_file, "] def\n");
+ fprintf(pfa_file, "/StemSnapV [ ");
+ for (i = 0; i < 12 && stemsnapv[i] != 0; i++)
+ fprintf(pfa_file, "%d ", stemsnapv[i]);
+ fprintf(pfa_file, "] def\n");
+
+ fprintf(pfa_file, "/MinFeature {16 16} def\n");
+ /* Are these fixed also ? */
+ fprintf(pfa_file, "/password 5839 def\n");
+
+ /* calculate the number of subroutines */
+
+ subid=5;
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ subid+=glyph_list[i].nsg;
+ }
+ }
+
+ fprintf(pfa_file, "/Subrs %d array\n", subid);
+ /* standard subroutines */
+ fprintf(pfa_file, "dup 0 {\n\t3 0 callothersubr pop pop setcurrentpoint return\n\t} NP\n");
+ fprintf(pfa_file, "dup 1 {\n\t0 1 callothersubr return\n\t} NP\n");
+ fprintf(pfa_file, "dup 2 {\n\t0 2 callothersubr return\n\t} NP\n");
+ fprintf(pfa_file, "dup 3 {\n\treturn\n\t} NP\n");
+ /* our sub to make the hint substitution code shorter */
+ fprintf(pfa_file, "dup 4 {\n\t1 3 callothersubr pop callsubr return\n\t} NP\n");
+
+ /* print the hinting subroutines */
+ subid=5;
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ subid+=print_glyph_subs(i, subid);
+ }
+ }
+
+ fprintf(pfa_file, "ND\n");
+
+ fprintf(pfa_file, "2 index /CharStrings %d dict dup begin\n", nchars);
+
+ for (i = 0; i < numglyphs; i++) {
+ if (glyph_list[i].flags & GF_USED) {
+ print_glyph(i);
+ }
+ }
+
+
+ fprintf(pfa_file, "end\nend\nreadonly put\n");
+ fprintf(pfa_file, "noaccess put\n");
+ fprintf(pfa_file, "dup/FontName get exch definefont pop\n");
+ fprintf(pfa_file, "mark currentfile closefile\n");
+ fprintf(pfa_file, "cleartomark\n");
+ fclose(pfa_file);
+
+ fprintf(afm_file, "EndCharMetrics\n");
+
+ /* print the kerning data if present */
+ cursw->kerning(glyph_list);
+ print_kerning(afm_file);
+
+ fprintf(afm_file, "EndFontMetrics\n");
+ fclose(afm_file);
+
+ WARNING_1 fprintf(stderr, "Finished - font files created\n");
+
+ cursw->close();
+
+#ifndef WINDOWS
+ while (wait(&ws) > 0) {
+ }
+#else
+ if (encode) {
+ extern FILE *ifp, *ofp; /* from t1asm.c */
+
+ sprintf(filename, "%s.%s", argv[2], pfbflag ? "pfb" : "pfa" );
+
+ if ((ofp = fopen(filename, "w+b")) == NULL) {
+ fprintf(stderr, "**** Cannot create %s ****\n", filename);
+ exit(1);
+ } else {
+ WARNING_2 fprintf(stderr, "Creating file %s\n", filename);
+ }
+
+ sprintf(filename, "%s.t1a", argv[2]);
+
+ if ((ifp = fopen(filename, "rb")) == NULL) {
+ fprintf(stderr, "**** Cannot read %s ****\n", filename);
+ exit(1);
+ } else {
+ WARNING_2 fprintf(stderr, "Converting file %s\n", filename);
+ }
+
+ runt1asm(pfbflag);
+
+ WARNING_2 fprintf(stderr, "Removing file %s\n", filename);
+ if(unlink(filename) < 0)
+ WARNING_1 fprintf(stderr, "Unable to remove file %s\n", filename);
+ }
+#endif /* WINDOWS */
+
+ return 0;
+}
diff --git a/fonts/utilities/ttf2pt1/ttf2pt1_convert.1 b/fonts/utilities/ttf2pt1/ttf2pt1_convert.1
new file mode 100644
index 0000000000..d014640603
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf2pt1_convert.1
@@ -0,0 +1,506 @@
+.rn '' }`
+''' $RCSfile$$Revision$$Date$
+'''
+''' $Log$
+'''
+.de Sh
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp
+.if t .sp .5v
+.if n .sp
+..
+.de Ip
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve
+.ft R
+
+.fi
+..
+'''
+'''
+''' Set up \*(-- to give an unbreakable dash;
+''' string Tr holds user defined translation string.
+''' Bell System Logo is used as a dummy character.
+'''
+.tr \(*W-|\(bv\*(Tr
+.ie n \{\
+.ds -- \(*W-
+.ds PI pi
+.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+.ds L" ""
+.ds R" ""
+''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
+''' \*(L" and \*(R", except that they are used on ".xx" lines,
+''' such as .IP and .SH, which do another additional levels of
+''' double-quote interpretation
+.ds M" """
+.ds S" """
+.ds N" """""
+.ds T" """""
+.ds L' '
+.ds R' '
+.ds M' '
+.ds S' '
+.ds N' '
+.ds T' '
+'br\}
+.el\{\
+.ds -- \(em\|
+.tr \*(Tr
+.ds L" ``
+.ds R" ''
+.ds M" ``
+.ds S" ''
+.ds N" ``
+.ds T" ''
+.ds L' `
+.ds R' '
+.ds M' `
+.ds S' '
+.ds N' `
+.ds T' '
+.ds PI \(*p
+'br\}
+.\" If the F register is turned on, we'll generate
+.\" index entries out stderr for the following things:
+.\" TH Title
+.\" SH Header
+.\" Sh Subsection
+.\" Ip Item
+.\" X<> Xref (embedded
+.\" Of course, you have to process the output yourself
+.\" in some meaninful fashion.
+.if \nF \{
+.de IX
+.tm Index:\\$1\t\\n%\t"\\$2"
+..
+.nr % 0
+.rr F
+.\}
+.TH TTF2PT1_CONVERT 1 "version 3.3.2" "November 20, 2000" "TTF2PT1 Font Converter"
+.UC
+.if n .hy 0
+.if n .na
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.de CQ \" put $1 in typewriter font
+.ft CW
+'if n "\c
+'if t \\&\\$1\c
+'if n \\&\\$1\c
+'if n \&"
+\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+'.ft R
+..
+.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
+. \" AM - accent mark definitions
+.bd B 3
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds ? ?
+. ds ! !
+. ds /
+. ds q
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
+. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
+.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
+.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
+.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.ds oe o\h'-(\w'o'u*4/10)'e
+.ds Oe O\h'-(\w'O'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds v \h'-1'\o'\(aa\(ga'
+. ds _ \h'-1'^
+. ds . \h'-1'.
+. ds 3 3
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+. ds oe oe
+. ds Oe OE
+.\}
+.rm #[ #] #H #V #F C
+.SH "NAME"
+\fBttf2pt1_convert\fR \- convenience font conversion script
+.SH "SYNOPSIS"
+ttf2pt1_convert \fB[config-file]\fR
+.SH "DESCRIPTION"
+`\fBConvert\fR\*(R' is the master conversion script provided with ttf2pt1.
+When installed into a public directory it's named `\fBttf2pt1_convert\fR\*(R'
+to avoid name collisions with the other programs.
+.PP
+If the configuration file is not specified as an argument then the file
+`\f(CWconvert.cfg\fR\*(R' in the current directory is used. This file contains
+a set of configuration variables. The distribution contains a sample file
+file `\f(CWconvert.cfg.sample\fR\*(R'. Please copy it to `\f(CWconvert.cfg\fR\*(R',
+look inside it and change the configuration variables. The more stable
+configuration variables, such as the path names of the scripts and
+encoding files are located in `\f(CWconvert\fR\*(R' itself, they are
+automatically updated when installing \fBttf2pt1\fR.
+.PP
+Put all the TTF fonts you want to convert into some directory (this
+may be just the directory that already contains all the Windows
+fonts on a mounted FAT filesystem). If you have fonts in different
+source encoding then put the fonts in each of the encodings
+into a separate directory. Up to 10 source directories are
+supported. If you (in a rather unlikely case) have more source
+directories then you can make two separate runs of the converter,
+converting up to 10 directories at a time.
+.PP
+The variables in the configuration file are:
+.Ip "\(bu" 2
+\fB\f(CWSRCDIRS\fR\fR \- the list of directories (with absolute paths) with
+\s-1TTF\s0 fonts. Each line contains at least 3 fields: the name of the directory,
+the language of the fonts in it (if you have fonts for different
+languages you have to put them into the separate directories) and the
+encoding of the fonts. Again, if you have some of the \s-1TTF\s0 typefaces in
+one encoding, and some in another (say, \s-1CP\s0\-1251 and \s-1KOI\s0\-8), you have
+to put them into the separate source directories. Some lines may contain
+4 fields. Then the fourth field is the name of the external map to
+convert the Unicode fonts into the desirable encoding. This map is
+used instead of the built-in map for the specified language.
+.Sp
+*8*
+An interesting thing is that some languages have more than one
+widely used character encodings. For example, the widely used
+encodings for Russian are \s-1IBM\s0 \s-1CP\s0\-866 (\s-1MS\s0\-\s-1DOS\s0 and Unix), \s-1KOI\s0\-8
+(Unix and \s-1VAX\s0, also the standard Internet encoding), \s-1IBM\s0 \s-1CP\s0\-1251 (\s-1MS\s0 Windows).
+That's why I have provided the means to generate the converted fonts
+in more than one encoding. See the file encodings/\s-1README\s0 for
+details about the encoding tables. Actually, if you plan to use
+these fonts with Netscape Navigator better use the aliases
+cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251
+because that's what Netscape wants.
+.Ip "\(bu" 2
+\fB\f(CWDSTDIR\fR\fR \- directory for the resulting Type1 fonts. Be careful!
+This directory gets completely wiped out before conversion,
+so don't use any already existing directory for this purpose.
+.Ip "\(bu" 2
+\fB\f(CWDSTENC\fI{language}\fR\fR\fR \- the list of encodings in which the destination
+fonts will be generated for each language. Each font of that
+language will be generated in each of the specified
+encodings. If you don't want any translation, just specify both
+\f(CWSRCENC\fR and \f(CWDSTENC\fR as iso8859-1 (or if you want any other encoding
+specified in the fonts.dir, copy the description of 8859-1 with
+new name and use this new name for \f(CWSRCENC\fR and \f(CWDSTENC\fR).
+.Ip "\(bu" 2
+\fB\f(CWFOUNDRY\fR\fR \- the foundry name to be used in the fonts.dir file. I have
+set it to `fromttf\*(R' to avoid name conflicts with any existing font for
+sure. But this foundry name is not registered in X11 standards and
+if you want to get the full standard compliance or have a font server
+that enforces such a compliance, use `misc\*(R'.
+.PP
+The next few parameters control the general behavior of the converter.
+They default values are set to something reasonable.
+.Ip "\(bu" 2
+\fB\f(CWCORRECTWIDTH\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use the
+converter option \f(CW\fB-w\fR\fR, otherwise don't use it. See the description of
+this option in the \s-1README\s0 file.
+.Ip "\(bu" 2
+\fB\f(CWREMOVET1A\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then after
+conversion remove the un-encoded \f(CW.t1a\fR font files and the
+intermediate \f(CW.xpfa\fR font metric files.
+.Ip "\(bu" 2
+\fB\f(CWINSTALLFONTMAP\fR\fR \- a Ghostscript parameter, if the value is set to
+\fB\f(CWYES\fR\fR then install the entries for the new fonts
+right into the main \f(CWFontmap\fR file. Otherwise just leave
+the file \f(CWFontmap.ttf\fR in the Ghostscript configuration
+directory.
+.Ip "\(bu" 2
+\fB\f(CWHINTSUBST\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR use the option
+\f(CW\fB-H\fR\fR, otherwise don't use it. This option enables the
+hint substitution technique. If you have not installed the X11 patch
+described above, use this option with great caution. See further
+description of this option in the \s-1README\s0 file.
+.Ip "\(bu" 2
+\fB\f(CWENFORCEISO\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then
+disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically
+this was neccessary due to the way the installer scripts created the
+X11 font configuration files. It is not neccessary any more for this
+purpose. But if you plan to use these fonts with some other application
+that expects ISOLatin1 encoding then better enable this option.
+.Ip "\(bu" 2
+\fB\f(CWALLGLYPHS\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then
+include all the glyphs from the source fonts into the resulting fonts, even
+if these glyphs are inaccessible. If it's set to \fB\f(CWNO\fR\fR then
+include only the glyphs which have codes assigned to them. The glyphs
+without codes can not be used directly. But some clever programs,
+such as the Type 1 library from XFree86 3.9 and higher can change
+the encoding on the fly and use another set of glyphs. If you have not
+installed the X11 patch described above, use this option with great
+caution. See further description of the option option \f(CW\fB-a\fR\fR in the
+\s-1README\s0 file.
+.Ip "\(bu" 2
+\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use
+the option \f(CW\fB-uA\fR\fR of the converter to generate UniqueIDs for
+the converted fonts. The standard X11 Type 1 library does not use
+this \s-1ID\s0, so it may only be neccessary for the other applications.
+The script is clever enough to generate different UniqueID for the
+same font converted to multiple encodings. Also after conversion it
+checks all the fonts generacted during the session for duplicated
+UniqueID and shows those. Still, this does not quarantee that these
+UniqueIDs won't overlap with some other fonts. The UniqueIDs are
+generated as hash values from the font names, so it's guaranteed
+that if the `\f(CWconvert\fR\*(R' script runs multiple times it will
+generate the same UniqueIDs during each run. See further description
+of this option in the \s-1README\s0 file.
+.Ip "\(bu" 2
+\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then create
+the \f(CW.pfb\fR files, otherwise the \f(CW.pfa\fR files. The \f(CW.pfb\fR
+files are more compact but contain binary data, so you may experience some
+troubles when transferring them through the network.
+.PP
+The following parameters are used to locate the other scripts and
+configuration files. By default the scripts do a bit of guessing for them:
+they search in the \fBttf2pt1\fR installation directory if \fBttf2pt1\fR
+was installed or otherwise suppose that you are running `\f(CWconvert\fR\*(R' with
+`\f(CWscripts\fR\*(R' subdirectory being the current directory.
+.Ip "\(bu" 2
+\fB\f(CWENCDIR\fR\fR \- directory containing the descriptions of encodings
+.Ip "\(bu" 2
+\fB\f(CWMAPDIR\fR\fR \- directory containing the external map files
+.PP
+Besides that a few parameters are built into the `\f(CWconvert\fR\*(R' script itself.
+You probably won't need to change them:
+.Ip "\(bu" 2
+\f(CW\fBT1ASM\fR\fR, \f(CW\fBTTF2PT1\fR\fR, \f(CW\fBTRANS\fR\fR, \f(CW\fBT1FDIR\fR\fR, \f(CW\fBFORCEISO\fR\fR \- paths to the other script
+.PP
+Also there are a few parameters controlling the installation of
+fonts for Ghostscript. Please look at their description in the
+Ghostscript section of documentation or in the \fBttf2pt1_x2gs(1)\fR
+manual page before running `\f(CWconvert\fR\*(R'. If these parameters are
+set, `\f(CWconvert\fR\*(R' will call the `\f(CWx2gs\fR\*(R' script automatically
+to install the newly converted fonts in Ghostscript.
+.PP
+After creating the configuration file run the `\f(CWconvert\fR\*(R' script. Look at
+the result and the log file in \f(CWDSTDIR\fR.
+.PP
+Add the directory with newly converted fonts to the configuration
+of X server or font server. For most of the systems this step is
+very straightforward. For \s-1HP\s0\-\s-1UX\s0 it's rather tricky and poorly
+documented, so the file \s-1FONTS\s0.hpux gives a short description.
+.PP
+If you don't have the privileges of the root user, you still can
+configure your private font server. Just use some non-standard
+port number (see \s-1FONTS\s0.hpux for an example, exept that you won't
+need all the \s-1HP\s0\-related stuff on any other system).
+.SH "FILES"
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0scripts/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/README\s0
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/FONTS\s0
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR\s0/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_BINDIR/\s0ttf2pt1
+.SH "SEE ALSO"
+.Ip "\(bu" 4
+the \fIttf2pt1(1)\fR manpage
+.Ip "\(bu" 4
+the \fIttf2pt1_x2gs(1)\fR manpage
+.Ip "\(bu" 4
+the \fIt1asm(1)\fR manpage
+.SH "BUGS"
+.Sh "Known problems"
+.Ip "\(bu" 4
+One catch is that the X11 Type 1 font library has a rather low limit
+on the font size. Because of this the fonts with more complicated
+outlines and the enabled hint substitution may not fit into
+this limit. The same applies to the fonts with very complicated
+outlines or with very many glyphs (especially the fonts with
+over 256 glyphs). So you will need to excercise caution with
+these options if you plan using these fonts with X11. Some vendors
+such as \s-1HP\s0 provide the Type 1 implementation licensed from Adobe
+which should have no such problem.
+.Sp
+But there is a solution even for the generic X11. A patch located
+in the subdirectory `\f(CWapp/X11\fR\*(R' fixes this problem as well
+as some other minor problems. Its description is provided in
+app/X11/\s-1README\s0.
+.Sp
+To fix the X11 font library, you have to get the X11 sources. I
+can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org
+or of the Open Group ftp://ftp.x.org. This patch was made on the sources
+of XFree86 so you may have better success with applying it to the
+XFree86 distribution. After you have got the sources, make sure
+that you can compile them. Then apply the patch as described.
+Make sure that it was applied properly. Compile the sources again
+(actually, you need only the fonts library, the fonts server, and
+possibly the X server). It would be prudent now to save your old
+font library, font server and, possibly, X server. Then install
+the new recently compiled versions of these files. Of course,
+if you know someone who already has compiled these files for the
+same \s-1OS\s0 as yours, you can just copy the binary fles from him.
+.Sp
+Alas, building the X11 system from the source code is not the
+easiest thing in the world and if you have no experience it
+can be quite difficult. In this case just avoid the aforementioned
+features or check each converted font to make sure that it
+works properly.
+.Ip "\(bu" 4
+The Type1 font library from the standard X11 distribution
+does not work on \s-1HP\s0\-\s-1UX\s0 (at least, up to 10.01). The font server
+supplied with \s-1HP\s0\-\s-1UX\s0 up to 10.01 is also broken. Starting from
+\s-1HP\s0\-\s-1UX\s0 10.20 (I don't know about 10.10) they supply a proprietary font
+library and the converted fonts work fine with it, provided that
+they are configured properly (see the file \s-1FONTS\s0.hpux).
+.Ip "\(bu" 4
+The \f(CWfonts.scale\fR files created by the older versions of the
+\f(CWttf2pt1\fR installation program (up to release 3.1) have conflicted
+with the language definitions of the \f(CWXfsft\fR font server and
+parts of it included into XFree86. To overcome this incompatibility
+the never versions creats the \f(CWfonts.scale\fR file describing all the
+fonts as belonging to the \f(CWadobe-fontspecific\fR encoding and
+the \f(CWfonts.alias\fR file with the proper names. The drawback of
+this solution is that \f(CWxlsfonts\fR gives the list of twice more
+fonts. But as a side effect the option \f(CW\fBENFORCEISO\fR\fR in
+`\f(CWconvert.cfg\fR\*(R' is not required for X11 any more.
+.Ip "\(bu" 4
+The conversion script has no support for Eastern multi-plane fonts.
+Contribution of such a support would be welcome.
+
+.rn }` ''
+.IX Title "TTF2PT1_CONVERT 1"
+.IX Name "B<ttf2pt1_convert> - convenience font conversion script"
+
+.IX Header "NAME"
+
+.IX Header "SYNOPSIS"
+
+.IX Header "DESCRIPTION"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "FILES"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "SEE ALSO"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "BUGS"
+
+.IX Subsection "Known problems"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
diff --git a/fonts/utilities/ttf2pt1/ttf2pt1_x2gs.1 b/fonts/utilities/ttf2pt1/ttf2pt1_x2gs.1
new file mode 100644
index 0000000000..9bd4a5fbfd
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/ttf2pt1_x2gs.1
@@ -0,0 +1,313 @@
+.rn '' }`
+''' $RCSfile$$Revision$$Date$
+'''
+''' $Log$
+'''
+.de Sh
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp
+.if t .sp .5v
+.if n .sp
+..
+.de Ip
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve
+.ft R
+
+.fi
+..
+'''
+'''
+''' Set up \*(-- to give an unbreakable dash;
+''' string Tr holds user defined translation string.
+''' Bell System Logo is used as a dummy character.
+'''
+.tr \(*W-|\(bv\*(Tr
+.ie n \{\
+.ds -- \(*W-
+.ds PI pi
+.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+.ds L" ""
+.ds R" ""
+''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
+''' \*(L" and \*(R", except that they are used on ".xx" lines,
+''' such as .IP and .SH, which do another additional levels of
+''' double-quote interpretation
+.ds M" """
+.ds S" """
+.ds N" """""
+.ds T" """""
+.ds L' '
+.ds R' '
+.ds M' '
+.ds S' '
+.ds N' '
+.ds T' '
+'br\}
+.el\{\
+.ds -- \(em\|
+.tr \*(Tr
+.ds L" ``
+.ds R" ''
+.ds M" ``
+.ds S" ''
+.ds N" ``
+.ds T" ''
+.ds L' `
+.ds R' '
+.ds M' `
+.ds S' '
+.ds N' `
+.ds T' '
+.ds PI \(*p
+'br\}
+.\" If the F register is turned on, we'll generate
+.\" index entries out stderr for the following things:
+.\" TH Title
+.\" SH Header
+.\" Sh Subsection
+.\" Ip Item
+.\" X<> Xref (embedded
+.\" Of course, you have to process the output yourself
+.\" in some meaninful fashion.
+.if \nF \{
+.de IX
+.tm Index:\\$1\t\\n%\t"\\$2"
+..
+.nr % 0
+.rr F
+.\}
+.TH TTF2PT1_X2GS 1 "version 3.3.2" "November 20, 2000" "TTF2PT1 Font Converter"
+.UC
+.if n .hy 0
+.if n .na
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.de CQ \" put $1 in typewriter font
+.ft CW
+'if n "\c
+'if t \\&\\$1\c
+'if n \\&\\$1\c
+'if n \&"
+\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+'.ft R
+..
+.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
+. \" AM - accent mark definitions
+.bd B 3
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds ? ?
+. ds ! !
+. ds /
+. ds q
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
+. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
+.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
+.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
+.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.ds oe o\h'-(\w'o'u*4/10)'e
+.ds Oe O\h'-(\w'O'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds v \h'-1'\o'\(aa\(ga'
+. ds _ \h'-1'^
+. ds . \h'-1'.
+. ds 3 3
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+. ds oe oe
+. ds Oe OE
+.\}
+.rm #[ #] #H #V #F C
+.SH "NAME"
+\fBttf2pt1_x2gs\fR \- font installer for Ghostscript
+.SH "SYNOPSIS"
+ttf2pt1_x2gs \fB[config-file]\fR
+.SH "DESCRIPTION"
+The fonts generated with \fBttf2pt1\fR work fine with Ghostscript by
+themselves. The script `\fBx2gs\fR\*(R' (or `\fBttf2pt1_x2gs\fR\*(R' when installed
+into a public directory, to avoid name conflicts with other
+programs) links the font files from the X11 direcotry into the Ghostscript
+directory and automatically creates the description file (\f(CWFontmap\fR)
+in Ghostscript format.
+.PP
+If the configuration file is not specified as an argument then the file
+`\f(CWconvert.cfg\fR\*(R' in the current directory is used, just like the
+`\f(CWconvert\fR\*(R' script does. Indeed, this configuration file is used for
+both scripts.
+.PP
+The Ghostscript-related parameters in the configuration file are:
+.PP
+\fB\f(CWDSTDIR\fR\fR \- the X11 font directory used by `\f(CWx2gs\fR\*(R' as the
+source of the fonts. This parameter is common with the X11
+configuration.
+.PP
+\fB\f(CWGSDIR\fR\fR \- the base directory of Ghostsript. If this
+parameter is set to an empty string then `\f(CWconvert\fR\*(R' won't
+call `\f(CWx2gs\fR\*(R'. So if you want to get only the X11 fonts
+installed then set this parameter to an empty string. This
+directory may vary on various system, so please check your
+system and set this value accordingly before running the script.
+.PP
+\fB\f(CWGSFONTDIR\fR\fR \- the font directory of Ghostscript. In the standard
+Ghostscript installation it's a subdirectory of \f(CWGSDIR\fR
+but some systems may use completely different directories.
+.PP
+\fB\f(CWGSCONFDIR\fR\fR \- the configuration subdirectory of Ghostscript
+that contains the \f(CWFontmap\fR file.
+.PP
+\fB\f(CWINSTALLFONTMAP\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then
+install the entries for the new fonts right into the main
+\f(CWFontmap\fR file. Otherwise just leave the file \f(CWFontmap.ttf\fR
+in the Ghostscript configuration directory.
+.PP
+After preparing the configuration file run the script. It symbolicaly links
+all the font files and creates the description file \f(CWFontmap.ttf\fR in
+\f(CWGSCONDFIR\fR. After that there are two choices.
+.PP
+If the option \f(CWINSTALLFONTMAP\fR was set to \f(CWYES\fR then
+the font descriptions are also automatically installed into the
+master \f(CWFontmap\fR file. The script is clever enough to
+detect if it was run multiple times with the same directories
+and if so it replaces the old \f(CWFontmap\fR entries with
+the new ones instead of just accumulating all of them. You
+may also run it multiple times for multiple X11 directories
+and all the results will be properly collected in the \f(CWFontmap\fR.
+But it's your responsibility to watch that the names of the
+font files don't overlap. If the X11 font directory gets
+renamed then you have to remove its font entries from the
+\f(CWFontmap\fR and only after that re-run `\f(CWx2gs\fR\*(R'
+for the new directory.
+.PP
+On the other hand if the option \f(CWINSTALLFONTMAP\fR was set to
+\f(CWNO\fR then go to the \f(CWGSCONFDIR\fR directory and insert the
+contents of \f(CWFontmap.ttf\fR into the \f(CWFontmap\fR file
+manually. This step may be left manual to make the installation
+a little bit more safe.
+.PP
+After that you may also want to redefine some of the aliases in
+\f(CWFontmap\fR to refer to the newly installed fonts.
+But the redefinition of the aliases may be dangerous if the width of
+characters in the new font will be different from the old font.
+Alas, there is no visible solution of this problem yet.
+.SH "FILES"
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/\s0scripts/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/README\s0
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR/FONTS\s0
+.Ip "\(bu" 2
+\s-1TTF2PT1_SHAREDIR\s0/*
+.Ip "\(bu" 2
+\s-1TTF2PT1_BINDIR/\s0ttf2pt1
+.SH "SEE ALSO"
+.Ip "\(bu" 4
+the \fIttf2pt1(1)\fR manpage
+.Ip "\(bu" 4
+the \fIttf2pt1_convert(1)\fR manpage
+.Ip "\(bu" 4
+the \fIt1asm(1)\fR manpage
+
+.rn }` ''
+.IX Title "TTF2PT1_X2GS 1"
+.IX Name "B<ttf2pt1_x2gs> - font installer for Ghostscript"
+
+.IX Header "NAME"
+
+.IX Header "SYNOPSIS"
+
+.IX Header "DESCRIPTION"
+
+.IX Header "FILES"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Header "SEE ALSO"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
+.IX Item "\(bu"
+
diff --git a/fonts/utilities/ttf2pt1/version.h b/fonts/utilities/ttf2pt1/version.h
new file mode 100644
index 0000000000..ef98c45abf
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/version.h
@@ -0,0 +1,7 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+/* version number */
+#define TTF2PT1_VERSION "3.3.2"
diff --git a/fonts/utilities/ttf2pt1/winbuild.bat b/fonts/utilities/ttf2pt1/winbuild.bat
new file mode 100644
index 0000000000..6cbcc7bf75
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/winbuild.bat
@@ -0,0 +1,9 @@
+rem file to build ttf2pt1 with Visual C++
+
+cl -DWINDOWS -c ttf2pt1.c
+cl -DWINDOWS -c pt1.c
+cl -DWINDOWS -c ttf.c
+cl -DWINDOWS -c t1asm.c
+cl -o ttf2pt1 ttf2pt1.obj pt1.obj t1asm.obj ttf.obj
+cl -o t1asm -DWINDOWS -DSTANDALONE t1asm.c
+
diff --git a/fonts/utilities/ttf2pt1/windows.h b/fonts/utilities/ttf2pt1/windows.h
new file mode 100644
index 0000000000..a90ecf7e5f
--- /dev/null
+++ b/fonts/utilities/ttf2pt1/windows.h
@@ -0,0 +1,93 @@
+/*
+ * Implementation of things missing in Windows
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#undef ntohs
+#undef ntohl
+#undef htonl
+
+#ifdef WINDOWS_FUNCTIONS
+/* byte order */
+
+static unsigned short StoM(unsigned short inv) {
+ union iconv {
+ unsigned short ui;
+ unsigned char uc[2];
+ } *inp, outv;
+
+ inp = (union iconv *)&inv;
+
+ outv.uc[0] = inp->uc[1];
+ outv.uc[1] = inp->uc[0];
+
+ return (outv.ui);
+}
+
+static unsigned int ItoM(unsigned int inv) {
+ union iconv {
+ unsigned int ui;
+ unsigned char uc[4];
+ } *inp, outv;
+
+ inp = (union iconv *)&inv;
+
+ outv.uc[0] = inp->uc[3];
+ outv.uc[1] = inp->uc[2];
+ outv.uc[2] = inp->uc[1];
+ outv.uc[3] = inp->uc[0];
+
+ return (outv.ui);
+}
+
+unsigned short ntohs(unsigned short inv) { return StoM(inv); }
+unsigned long ntohl(unsigned long inv) { return ItoM(inv); }
+unsigned long htonl(unsigned long inv) { return ItoM(inv); }
+
+char *optarg;
+int optind=1;
+
+char getopt(int argc, char **argv, char *args) {
+ int n,nlen=strlen(args),nLen=0;
+ char nCmd;
+
+ if (argv[optind] && *argv[optind]=='-') {
+ nCmd=*((argv[optind]+1));
+
+ for (n=0;n<nlen;n++) {
+ if (args[n] == ':') continue;
+ if (args[n] == nCmd) {
+ if (args[n+1]==':') {
+ char retVal;
+ retVal=*(argv[optind]+1);
+ optarg=argv[optind+1];
+ if (!optarg) optarg="";
+ optind+=2;
+ return retVal;
+ } else {
+ char retVal;
+ retVal=*(argv[optind]+1);
+ optarg=NULL;
+ optind+=1;
+ return retVal;
+ }
+ }
+ }
+ }
+ return -1;
+}
+
+#else
+
+unsigned short ntohs(unsigned short inv);
+unsigned long ntohl(unsigned long inv);
+unsigned long htonl(unsigned long inv);
+
+extern char *optarg;
+extern int optind;
+
+char getopt(int argc, char **argv, char *args);
+#endif
diff --git a/fonts/utilities/unadobe/unAdobe.hqx b/fonts/utilities/unadobe/unAdobe.hqx
new file mode 100644
index 0000000000..af7ec31efa
--- /dev/null
+++ b/fonts/utilities/unadobe/unAdobe.hqx
@@ -0,0 +1,162 @@
+(This file must be converted with BinHex 4.0)
+:"h9Z3@4[BQ8!39"36%T,9%8J!!!!!!!!!"hZqp`!!!!!!3!!!"e)!!!F5!!!!+B
+!!!!!1`2h!&!%333'3f&ZBf9X!!!!!!!G"#B!,38%L!GeEN&NEf*P!J!!!%&38%a
++5e4&)3$rrrrr!!!!!!PP!!""8&"-5NY845%!rrrrr`!!!!!!!!!!!!!!!!!!!!!
+!!*qiPXN!!!!!!!!GlMX%d!"0"!C)D@4NC@i!!!!!!+-"!!#e!9!%"N0KEQ0PE!!
+!!!!!*`$S!$X"@i!!!!!!!!"%!3!!9J&3"!9&DQ9MG!!!!!!!!&d"!!"[!9!%"84
+bDACP!!!!!!!!*`!-!,N!jJ!!!!!!!!!R!18!Z3$f!!!!!!!!!(`!r!"p!95!!!!
+!!"PS!!J!!8j@rqK1F8ja)'i!$"!3B!!"0'!!!8iJ,J!)9B!Y32rX98mr,Ia#5'l
+rl#!Z!!a8J#m!6VS5@MYIr%CJ!!%Q3Qhp9L!Z!!a8J#e!!!`J,J!)9B!Y3!!)@8m
+[,J!)F!)[!%kk$*K1ZK9f,9rrk#mZrqK1ZKDq,blrk%kk&N)[,J!-)'lrk#m3,bi
+!#%kk#$S[,J!)F!)[!%kk$')YA`!))'lrk#e3!!a+VJ!)E`!!B("3,8$rl("3X+i
+!#'m!!!JYEJ!)rqa96cmYr%*)E[rX,bi!$%kk%ESlAra'98mr,Ia#5'hm5N(Yr%J
+J#&+!,`"1ZK'H1erm4R"3d+i!$#e!!!a`X0#Z!!JY3!!)B*S[,[rS6VS9Y#mZrqK
+1ZK61B!!!4"Ym!!(m4@!!!$Sr,Ia#5'hm8$mYr%j1ZJED'h`!!Ia&B!!!)%L!$%!
+!"Q3@d%!`1`!'6[X!![kmrX$qk2r+rp6rbNjH)&p36dl36PEqcNja6R%JEJ!)3ql
+qm(!r)YK4b2rm2bi!$+L+5'i!$dKZrY!r2!!"6VS1IKeZrZrqcR!!%#lqcMm!U)K
+96dKZr[#SM$!m!C!!N!"I5-#"r!!#2`!r,J!3U*0)E[l`U)41AL"I6qm!#Nl36PE
+qcNja6R%JEJ!)3qlqm(!r)YK4b2rm2bi!$+L+5'i!$dKZrY!r2!!"6VS1&"eZrZr
+qcR!!%#lqcMm!U)Jr,J!32bi!%UL65'lqm+L%6PiJAdr[!!a1d%j@rq*1F8ja2A`
+!4[rS2A`!-[rU2A`")[rX2A`"`[rZ@8p#TdKZrqK)HJ-H(c`!!6mm!!0`rbm!3LG
+#TkN6,9rrj#mZrq5SFcmm!#JGI!!$rq*`!"!Zrq)r!$mm!"K)HJ,F6VVqfMmm!%B
+GI!!"rq*`!"!Zrq)r!$mm!!a)HJ+56VVq[$mm!&8GI!!"rq*`!"!Zrq)r!$mm!!T
+)HJ*16VVqRMmm!(0#,[rLF!!3,[rL2`!r2!!-5(S#"NkkrS)r2!##3LlriR!!%#l
+riMm!2c`!$%Kk!F"1Z[jQ2c`!Qaem!!(riR!!%#lriMm!2c`!$%Kk!CT1Z[j)2c`
+!Vd)Zrq*`!"!Zrq)r!$mm!!P)HJ&)6VVq,$mm!,P#,[rLF!!3,[rL2`!r2!!*5(S
+!h%kkrK!r2!$02c`!4Kem!!(riR!!%#lriMm!2c`!#8Kk!+a1Z[jB2c`!c6mm!)a
+#,[rLF!!3,[rL2`!r2!!*5(S!J%kkrMJr2!$02c`!dKem!!(riR!!%#lriMm!2c`
+!#8Kk!%j1Z[i@2c`!c6mm!5*#,[rLF!!3,[rL2`!r2!!*5(S!)NkkrIC96kPd%"m
++!!!"5J"R!!!%B1i[,[rNU441ANje#dpeG("eG#"QD@aP$P0PBfpZC#"ND@&XEfF
+k&JT*ER"eG#"QD@aP&Je'DA*cG#"ND@&XEfFk6e4SC5"0594545"$Eh*`Eh*KG'P
+[EL"KFh0eE@8JEQmJFQ9cF'pZFfPLD@aTG(NJCQpb)(4SC5"eFf8JEfBJG'KTFb"
+KF("XD@0KG'P[ELid9'KTFb"KF("XD@0KG'P[EL"TFb"ZEh3JCQpb)(0KE'8X)'C
+PC@`JCR*PC5"dEb"MEh"j,KB(+L!J+L!J+LKLD@jKFRNJCQpbE@&d)'PZG'mJB@i
+J390$58NJCQpbE@&d)'CTE'8Z&LT8D'Pc)'&`F'aTBf&dD@pZ)(9ZF'&MDh-JB5"
+QEfjd)'PZ)%&LEf*P*h-@*&GbDA4dC@iJBRNJ5Q9bFRNJ5f9[G@GS)'&ZC#"8C@3
+J4@4P,KBU3fp`HA*TCfKd)+NJ-6Ni1#"LH5"8D'8J68P88N8J3fpbF'pbBA4TEfi
+Z&JTeEN&NEf*P,LiZ&J!53LG1ZJA+6PErm%kk"cj"lIiL,`LSEUMqU4+T-+R-3UH
+THkK3F!%V32a+1h`!$Ia)6VVmK%KYr&")EIa16VS$C%SYr&"R!!#d98p)EIa32bh
+m6Mmm!!'Ta$YIr%B-EIrrr%CR!!#'5'hm8%KYr%*1ZJ%B3Lhm46Ym!I6p9$!Yr94
+53$Y!r94C6bmm8%p69$mYr95TS#YIr9"+VIe3C`!!0#mYr9"1ZK%8,bhp8%kk%*J
+JEIe3,a"C6bmYr9"1ZJqq6VVjb#mYr9"1ZK#',bhp8+QM5Uhp8&I!4!#!,Ia&5J"
+RQMmYr%*1ZJ&b5'hm8%KYr%j1ZJ+ZB!$r5%jH6VS'&Nj@rU*1F8ja2A`!82rZ2A`
+!0rrX,blrl%Kk!'a)E[kL)'i!$#m)5(S!9$mm!!*1ZJTq@%p)E[kL3UG)E[qL6VS
+5NK!Zrk)+!!!"5J"R!!!-)'i!$%)3B!!!(#"Z!!`r2!$r5'lrV#m)6VS*YL"Z!!J
+`V[qS6PiJAe"26Y!),R9Z3@4[BQ8@!"*19[hX6R&1F5"Z!!a$l[l`F$mLf&()rr`
+r2!$r5'lqm%KZrI"1ZJPb5'lpm%KZrHj1Z[p'5Llpm'B!!!CJ!!#-98p)E[h`2bl
+plL"Z!!J[#%kk$(SpArhX5Qlpl'B!!!CJ!!"S$'lreIhXCJ!!*&925'lpm$mZrHi
+[2%T,9%8[2&4&@&41ZJ`#29rpl'!!!"`-E[r2rHaQ!!!598mJEJ!)2a"1ZJcd29r
+pl%TZrHaQ!!!D98p)E[h`2blplL"Z!!J[#%kk$!JpArhX6PiJAe"26Y"19[rU6R&
+1F9922bi!#%KZrqa1ZJ`J29rrkP922bi!##mZrqa1ZJaq29rrkP922bi!#%kk$*)
+pArrU6PiJAe426Y"19[lN6R&1F5"Z!!T$l[l`F$mLf&()rra96dKZr[!r,J!)5'l
+ql%kk#j!!29rqlP922blql%KZrZK1ZJ`%29rqlPP2,blqk%kk$B)YArlN,blqj%k
+k$XS[,[lN6VS16P922blql%KZrZJJE[lN,a"1ZJS)29rqlP922blql%kk$!BpArl
+Z98mr,J!15'lqk#"ZrZ3[%%kk#HBpArlZ,blqj%kk$K)[,[lN6VS0,%jH)&p36dl
+36PB!!%MR%#!JEJ!3)Qi!$#!Z!!K&qJ!X%KJf2!!"k4N8!3*#!!m5mL!!8F[rmP1
+!CZC-h`3)6PiJAprm!!!!$%l3-$%b-c3e0MFi18&#3d4&4Nj@rj*1F8ja2A`!82r
+Z2A`!0rrX,Aa-9dC1rj)[,[rX5(S!8%+R2c`!!8KZrj*#TdKZrk*1ZK!+%#lrSJS
+!!!&+!'F!!!`JEJ!-3K"J!!!F)'i!$$mm!2p)E[qX,`K1ZJFH)'i!#$#ZrkK1AL"
+I8%p1d!!5"N$i3+R*)%p)jaJ!*JiS#'%'60m!'%je,`XN,IqbCJ3QAdje*N+h`f)
+%Ym4L"L3V!!"JkNkk!8K++`!'Ca""qJ&`-+X!%N(k!@"1ZJ%%*#X!!%kk!"a+JQ$
+%,`!J#m#i!aSREIqb!!!V32qb)"p1G5m")J[#Z!-D3qhrXL!4Ca#`J@F%)N"Jp#"
+!)T!!)Kp1G6!mp$DTb@%+C`*1G6!mp$HTb8MR3)!J,IqbCa!L#m+i!aU`J@F1)%!
+J%'Ef60m"!R!!6R9-h`%#F!&1G5m)6qrrcN+[!!`[5!!53Qm!&N*[!"T"k`!@,dJ
+!(#"2S!!hE`!B!!42l`!b)&p+3'FD$%$re@B%F!&1G3a!rqPQ!2lb5LX!%@F!rZT
+`!%je,`K2lrr13Um!$#p)!"*#E`!@3Qm!'L"2S!K2l`!b)&p+3'F-$%$rd'B!rVT
+`!8jeF!"1G5m)6qrrcN+[!!`[5!!53Qm!&N*[!"SJ6k!*6qm!-L"I5N"R#%SYrkT
+R!2k'6R9++`!4CL*2lrr13Um!$$pV!!3!'#"2S!&2l`!b5N"R#%SYrkTR!2jF6R8
+*6&039'9YF!!!"$%Z-N%!8fhri$Ym!!,rhN*YrpK#VIqb3QhrUMYm-$$rU%kk!%"
+1ZJ"B6VS!S%kk!3j1ZJ%5,%dQAdSICb4f!$BY!#$K5dKYrL+SEUMqU4+T-+R-3UH
+THb"2NF1J,8kk!5*1df&'C`TV%$YmrrRrV%je1hcrprqX6R9#EIqX6R9K+QF3Da`
+lI2rhrkilI2rirl"1G6YmrrRrVMYmrrVrX%je3QhrVN*Yrl"1G4!i!JGQ&K!i!T&
+U"(!!6R8#!!!28`"Qp($r6R9`!8je4qhk)%)V!!F)k`!"!!FAI!!#!"&3k`!18HX
+!"P$V!!a4k`!03UX!#$Gm!!)!&"Gm!!d!%%kkrDC(lIIq3LX!"`MV!!!!"aGm!!%
+!%9$V!!j4k`!'8HX!$&(V!!e#U`!)0h`!!J!8&h`!$3!36VVpENje-I`!$3T+6R9
+#VIqN6R93lIqU)#hrXQB+3UhrXP(YrkUTp#C!6VVqD%SV!!CR%%(krT!!-+X!%N(
+krS"1Z[iN)#X!!'$55MJ#MQSU)(J"-%2i!43J#*!!NA3-X)*P&L*4)FJ"&#+!3K%
+LH!+U)SJJJY'T!!a1GD"M6R8%-5ib33")jm$!)#m!&#)[!"J[E`!3!"4K$NM[!!%
+!'%cI!`0B6dje51F`!#3!5%,&`5B"5%2(`0C#5%0#3m,!eS%J!dcI!!a1G8MR`-!
+L,`!8Cd)J,`!B,fm!%!!8B6S[33!B60m$!eK26R9)jm$!)Lm!&'FJ)#m!''%H5S"
+U"0#[!"3[3!!B,fm!%!!860m$!eK26R9`!)(!51Fq!#S!DJ*%J#`"DJ*%J53!*J&
+#J%+"H"rMNZ13!11*X)0Y"*!!Je+"8d4XlNU&DJ*%J,Z'DJ*%J8cI!(a1G33a,M*
+"!#m),`!JE`!-F!!J`#$!)-!J`#$!)-!J`#$!)"mJAbkI6R9)jm#!)'m!%(!!)-!
+J`#$!)-!J`#$!)-!J`#"[!"!`,`!8FKrQ5**!-#m!&!*!!!F"m"!!60m"!bpA!!C
+F6dje51I`J#"[!"K`!#$!)-!J`#$!)-!J`#$!)-!JE`!BG"m`,`!FjNL83()I-#m
+!(ZC)NN!`!Q!'82!!!&*!X%&[pM![!"i#3!!(G[rK+mF`%!"`"c)[!"`#33!(N!"
+"G[rJ+mF`)!"-h`%2,eF!#&"26R9)jq#!)'m!&()I-#m!'ZC)NN"`!'!)5M!!!'C
+38N#`3@hdF!Fd,`!D!N)!"j!!3R6ri#T'!K!`%!$!!QB`FKm`,`!BjNL53$!"B!C
++-!!!CKa53!a!!"p[mM![!"J#3!!(G2rK+NB#%$!3!-!#60m""d$R,fm!!J!+40p
+36dje51I!J#"[!"!`,`!8FKrQ5**!-#m!&!*!!!F[E`!-!")"-"!!60m"!ea26R9
+)jm$!)'m!&#*[!"Kb"b!CJCK4bIrk60m$!bpA!!K36dje51I!`#"[!"3LE`!BFJF
+J'F'B8FRrqNcI!`-[9`!)8%p1G8MR`-!JE`!8)Qm!'()()"P'J-'B8FRrq%cI!`-
+[9`!)8%p1G8MRi-!`,`!B)'m!'L*[!"i[E`!8!"l33$!l!!C1q`!#!!`!$!!!!!!
+!(J!ZF!HcL&E)rra-h`-(6qm!#NjeF!FL'#3CJS+bJPE)rrCJjR!()KJN'B5"Y)&
+@b2rfB0C)jm$!-Lm!&#"[!"BL5(!!)X!L`#,!)X!L`#,!)X!L`#*[!"T63@FHF"q
+3!%(L58(`!!!`f9(*rra-h`-$,eF!#Nr[!!T1G4&C!"pJl%MRi-!LE`!B)'m!(#p
+[!"3!((!!%"Jd!")CXJ"N!K3"8d*Y#,-)9XVrr'B#XJ"-h`-(8)p1G5m+)Qm!##4
+[!!``,`!30!!5'V)#C!)8!4,#B!)5fP(+rrb`!54I)&p2l`!+6Y")jm#!)'m!%Lp
+[!!`!%R!!%"!b,`!38d&63'8#N!""60m"!eb26R8[#L"[!!K`!"!BFJ!LE`!-G!!
+8'E"#E4BN5&*"8d*Y%,-+9XVrr'F)8NK63'$HFJ!NAb"I8%mqJ8l3-#m!"%2[!!B
+b!19*dX%J85+A51F!i()!8NKJ'L4KG!!8'Y)#C!b8!9-#F!"brf!#%0T4b[rm8FM
+rj%cI"`!3J5j*8N%J9dl3*"m`(f`#F!!b(fi-4%&53C!!3@`#F!"b!5"I)PF[!R3
+!&"$3`9*#P%&X!R3!X%*[!M!#%X"J!K,B8FMrr%je60m"!b*A51I!3(!!%"!5f&(
+)rr`N(c!IE!*`!$)IEJa%39*"N!""E!*`!()")&m[!R3!&"#839*#EaL`3Qm#-!+
+4%*4!d-&$m!!!B!)3f9(+rra1G5!I-Kp)36)m!2mLAb"[!!4d!"34%0P4b[rm)Pm
+J9f!%60m$!bm!51FB-(J!F!!3'A3!&"!f!0C#YN&["$B"H2m3JdK"5N&Z!R)"8d'
+b3Qm#-J*538A`-!&(m"!"0!XQ5TE!P%Y%3Qd'&504b[rm4I!3!*C"8N1f3'm'0J"
+J!K6C8F[rr&*%60m-'%je8F&J!P$"6PErcN(ZrmiKEJ!)!#!aEJ!3!"JLEJ!-)9%
+!*%*S!#a#U!!Z5J&Q"+!#B!+J!ce!!")LEJ!-)UJ!+%jH)PrIr!!!!!T1d8j@rm"
+"l[r!)@i!%!!5-@i!&!!@3QJ!(+!(28!!&L*Z!!`bU!!@)#J!-1#!iS$!k!!qii$
+KJ#*Z!!JLJ%jH)PrIr!!!!!j1d8j@rm""l[r!)@i!$!!5S"3p3!!3)Qi!#$+S!"C
+1AL*I8)p1d8j@rm""l[r!)@i!#J!5-@i!#!!@S"8p3!!16PiLAeb26Y&19[r!3Hl
+r`$&Z!!J!&L&Z!!S!%U!628!!$NjH)PpFMdl46PErX%(Zrl!KEJ!5!")aEJ!3!"C
+#+!!DS!K+3'B@3QJ!(+!-)!K$k!!J)Zi!##+Z!!bJ$6e!!"C1AL*Ihr`!!!!16Y&
+19[r13HlrcL&Z!!i!%M&Z!!`!&N)S!"T#+!!E3UJ!(+!!)Qi!#$+S!"Jp3!!56Pi
+JAprm!!!!#Nl36PErcN(ZrmiaEJ!-!"LJ'$e!!!iLEJ!))UJ!,NjH)PpFMdl46PE
+rcN(ZrmiaEJ!1!"JaEJ!-!#`KEJ!)!#kJ4$e!!""1AL*I8)p1d8j@rmj"l[r1-@i
+!$!!BS"%p3!!1)Qi!##+S!"a1AL*IA)p1d8j@rmj"l[r1-@i!$!!B)@i!#!!FS")
+p3!!16PiLAeb26Y&19[r13HlrcM&Z!!J!'+!"28!!#NjH)&p8Mdl36PErX%(Zrl!
+KEJ!1!")aEJ!-!"C#+!!D3QJ!(+!-28!!%N(S!#!LEJ!)-$`!%+!Z6PiLAprm!!!
+!#Nl46PErX%(Zrl!KEJ!1!")aEJ!-!"C#+!!D3QJ!(+!-3qJ!)#"Z!!J`2!!3S#j
+"l[q`S!dp3!!56PiLAprm!!!!#Nl46PErcN(ZrmiKEJ!1!")aEJ!-!"C#+!!D)@i
+!#!!FS!Xp3!!56PiLAprm!!!!#Nl46PErcN(ZrmiKEJ!+!")aEJ!)!"C#+!!DS!N
+p3!!16PiLAeb26Y'J,%lk!C`LAb"IS&G1qJ'3!#*I)%qJ'Glm!!j1qJ'#)PmJAk!
+Y6[S"H+!f6[S"G+%D,dJ!"%lk!@SLAb"IS"Y1qJ&H,hJ#TJ!%6[S"A#pi!US!"%l
+k!9)LAb!IS5)ZL%lk!6iLAb"IS#01qJ%d)PmJAk!P,S"U"N+A6[S"*%lk!4iLAb!
+I)&qJ*%lk!43LAb"IS5BZL%lk!3JLAb"IS5JZL%lk!2SLAb!I)&qJ*dlk!2!LAb!
+IS4iZL%lk!13LAb"IS"p1qJ$D)PmJAk!K,S"U"N+A6[S!bNlk!-3LAb!I)&qJ)%l
+k!,SLAb"IS8JZL%lk!+kJ(#p!!!41qJ#X)PqK(5)))&mJJ5k!6[S!NL*I)"qJ6#k
+!6[S!KL*I)"qJ3%lk!(iLAb!IS%e1qJ"d)PmJAk!V6[S!DL*I)&qJ+8lk!'!LAb"
+IS#T1qJ"@)PmJAk"*6[S!6#*I)&qJ5Nlk!%)LAb"IS%Y1qJ!i,hJ$+!!%6R8L(b!
+I)PmJAk!Z)N&1qJ!J,hJ"#!!%6[S!(Mpi!L!!"%je,hJ"-!!%6[S!$(!!,`Na`!)
+J6R9`!'$f60m$!#m)51FI2L!4`,J$'QB'F*01qJ&U+%N)&!!(C`B`22q,B1iXH!%
+B*Qi!!#)4`VJ$'L*"8BNL+3!!`VJ$'Li"8BG`!02"XmYN!!%d5LN!!'F3DJ!"+L*
+T!!66cNS4D`!"(L)2)(J#UT+S!!"`rb3m!!!%!,+#E3!""J4#!)#5JJL"!!#I`Cl
+m!")U6bp"!!JJ9&&),fJ!!!!!)"6!Z!-D,d!!$"p8!""1ZJ$H5K*Q,#)U!!!J!9'
+!N!#(C5"R#!b!!!!!$'8@)&3L5Y2")!H6`*'Z!!bJ,L"-S#YJGR`!6VS!jNkk!5K
+1ZJ#J)LS!!#!Y!!4"l3!5)NV6`C2!h)#4VJ!-S#j+KfF!!%SJ#C!!LQFD)J"4JC+
+(C3jR#!b"!!!!$'8%)&4JTL9!!!"-d3!`)di!"#0'!!!6I!"!!!![#8kk!)C1ZJ$
+)6VS!3#*I50%!-'#B8BP4VJ!-)!Q3!)TR"#9!!!!N556Y!!!J6*(1*-JSLKL[!""
+`!0r[!!MHr!!560pmq$(!!L"1G5!8C`V!Z!-D)%"45'!%3Hi!0#)S!!$#Z!-D5LJ
+!!'F-DK3LD!!%dmj+%@X+*%M4`E(,CGjJ"V(Y!!aMm%je)#d!#,#(E3)J"d2Y!")
+J90((NF#HJ#Y!!!3L!+!Z)%`J"fB%S#Y1G5"388J8+!!!8)!K3!!!%8)!!0(!)8%
+!!01Z!!a1G5!m!)!!!+"-6R9d!5"I2`)[#+hUG!01q[rdG!*1q[rZG!41q[rS!!!
+!)!!!!$!!!!J#!!!!%!!!!#!!3%lY!#T1F39f2c`!!DR`!!!"!2rrrJ#!!!-!J!!
+#J)rrJN#!!!)J[rrL%)!!!JL"rqB%J!!+!Trq%rq!!#!*Jrj!#B!!J!Qri3!*J!)
+##BId"JQ!#!S*[a!5#B!J)JQI3(i*J)!!#Cd!!!Q#!!!*Y!Iq#BJ)!JQ3!"(L#D!
+J!JR!3rS*J)!##Im!!rQ!!!!"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+rrrrrrrrr!!!"!!$rrJ!"rrm!!i!$J!F!!F!1!i(J(!I$m$J1jlK`(RFFi$ik$X"
+q(!I!rJi$`Ij(!m2qBi2(rR($crjJimIq4(2$rJlM`IiI`m$q2i2!IRm$`,jq!q(
+HI!GccRJ12iC`("m$i$J1!F"`"`#!i!1!!F!"rrq!!2rr!!!!!!!!!!!!!(!!!(r
+rrrKrrrriIrrrq(rrrrKrrrriIrrrq(rrrrKrrrrirrrrq2rrrrMrrrriIrrrq(r
+rrrKrrrriIrrrq(rrrrKrrrriIrrrq(rrrrKrrrriIrrrq(rrrrKrrrriIrrrq(r
+rrrKrrrriIrrrq(rrrrJ!!!!!!!!!!!!!!!!!!!!N5NY843!!!!&*3diM!!%!!!%
+!!!%"!8C548B!!3!!!3!!!3%"!!!!EQeeEN&NEf*P,#"LH5"8C@3J4@4P)#BJ5Q9
+bFRNJ5f9[G@GS)#K0B@PZE(NJ5Q9bFRNT,L"$Eh"jFQPRD(3JU5"LH5"8D'8J68P
+88N8J3fpbF'pbBA4TEfiZ)%&XE#"bD@GSG(-JFQ9cCA*fC@3Z!!!!"d&38%`!!!!
+!!!!(9%9B9!!"!!!!!3!!!"e)!!!F5!!!!+B!!J*!![)!!!!F!+B!"%024%8!!3!
+U5801)`!"!%*#6N4-!!!!@NT,9%8!!!"Q4P*&4J!"!()!!Irr0!!!!!!#0SB!!2r
+r)!!CE!!!!!!"!Irr!!!CN!!!!MD#!3$rr`!!'T3!!!!!!3$rr`!!'jJ!!MCq!!$
+rr`!!'m!!!!!!!3$rr`!!($)!!MCk!3(rr`!!($d!!!!!jJB:
diff --git a/fonts/utilities/vfinst/1vfinst b/fonts/utilities/vfinst/1vfinst
new file mode 100644
index 0000000000..044ed922eb
--- /dev/null
+++ b/fonts/utilities/vfinst/1vfinst
@@ -0,0 +1,808 @@
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "1.00",
+### date = "August 1998",
+### filename = "1vfinst",
+### address = "Department of Mathematics,
+### John Jay College,
+### 445 West 59 Street,
+### New York, NY 10019, USA",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### keywords = "AFM, virtual fonts, fonts, PostScript, TeX",
+### supported = "yes",
+### abstract = "This is the first Perl script for the
+### vfinst virtual font installation utility.
+### See accompanying file vfinst.tex for
+### additional details.",
+### package = "vfinst",
+### dependencies = "1vfinst, vfinst.par, vfinst.lib, 2vfinst, fontinst",
+### }
+### ====================================================================
+
+## Introduction and description.
+## =============================
+
+## This script 1vfinst examines all raw font files (afm+pfb), checks that
+## each afm file has a matching outline file, creates the sort keys for
+## each font (the sort key also encodes the series, weight, and variant
+## info of the font), and decides on the Karl Berry font name for
+## subsequent renaming. It produces messages in a log file, and one or
+## two important files for later processing. The file fonts.lst contains
+## information about the current font and its proposed new Berry name.
+## The file typefaces.lst is produced only in TDS systems, and contains
+## information linking font families, directory names,a dn supplier
+## names.
+##
+## The scripts 1vfinst and 2vfinst are unbundled so a user can more
+## easily bail out in case things go horribly wrong during the execution
+## of the first script. Also, wizards and wise guys can edit
+## (carefully!) fonts.lst if the fontnaming conventions need tweaking.
+## (The 2vfinst script reads only these 2 files for font information.)
+
+# SUBROUTINES AND STUFF ...
+
+require("../vfinst.par"); ## system dependent statement!! Beware!
+require("..${sep}vfinst.lib");
+&getTDSplaces if &isTDS; # construct some TDS parameters
+$vfencoding = $vfmapdir unless defined $vfencoding;
+$font_place="." unless defined $font_place;
+$afm_place="." unless defined $afm_place;
+
+# `CheckInstallation' tries to verify that the installation
+# has been done more-or-less properly.
+
+sub CheckInstallation{# checks that a file list exists
+ local($missing, @missinglist, @presentlist); $missing = $false;
+ foreach $i (@_) {
+ if (&isfile("..${sep}${i}") == $false) {
+ $missing = $true;
+ push(@missinglist, $i);
+ } else {
+ push(@presentlist, $i);
+ }
+ }
+ local($misslist) = join("..",@missinglist);
+ local($preslist) = join("\n ",@presentlist);
+ &dwlog("The files ");
+ &dwlog(" $preslist");
+ &dwlog("are properly located.");
+ die "Can't find \n $misslist \nfiles...$!\n"
+ if $missing;
+}
+
+sub GetEnvironment{# sets up some synonyms...
+ $texin = $vfinputs; ## traditional system: input directory;
+ $encoding = $vfencoding; # where is file 8r.enc?
+}
+
+## Sub stripextension takes 2 args---the array containing the file names,
+## and the stirng containing the extension.
+
+sub stripextension{
+ local(*files,$ext)=@_;
+ foreach $elem (@files) {
+ $elem =~ s/\.$ext$//;
+ }
+}
+
+# It's important to be sure that every afm file has a corresponding
+# font file, which either has no extension, or is a pfb or a pfa file.
+# ('No extension' is treated like a pfa file.) No args.
+#
+# The afm file has a name like `firstname.afm'. The corresponding font
+# file can be `firstname.pfa' (an Ascii font file), `firstname.pfb' (a
+# binary file), or simply `firstname' (equivalent to a pfa file; this
+# convention applies to NeXT systems and others).
+
+## SPECIAL DEBUG OPTION: When debugging, it's convenient to run
+## 1vfinst on large collections of afm files with no matching font
+## files in sight. Normally, this is forbidden, but if the variable
+## $debugging == $true
+## then 1vfinst will not check against outline font files.
+
+$debugging = $false; # default status
+## $debugging = $true;
+
+## Usage: &get_afm_names("/psfonts/afm");
+sub get_afm_names{
+ local($afm_place)=$_[0];
+ opendir(THISDIR, $afm_place);
+ @allfiles=readdir(THISDIR);
+ @afmfiles = grep(/\.[Aa][Ff][Mm]$/, @allfiles);
+ closedir(THISDIR);
+}
+
+## Usage: &get_font_names("/psfonts");
+sub get_font_names{
+ local($font_place) = $_[0];
+ opendir(THISDIR, $font_place);
+ @allfiles=readdir(THISDIR);
+ @pfafiles = grep(/\.[Pp][Ff][Aa]$/, @allfiles);
+ @pfbfiles = grep(/\.[Pp][Ff][Bb]$/, @allfiles);
+ @dotless = grep(!/\./, @allfiles); # files with no dots in name
+ @dotless =grep(-T, @dotless); # accept only text files...
+ closedir(THISDIR);
+ ## (Of course, @dotless still might contain oddball font lookalikes...)
+}
+
+## Another UNDOCUMENTED FEATURE: If variables $font_place and $afm_place
+## are defined (perhaps in vfinst.par...), then the fonts/afms will be taken
+## from that pair of locations instead of from the current working directory
+## ".".
+
+sub AllAfmsNeedMates{
+ local(@allfiles, @pfafiles, @pfbfiles, @dotless);
+ local(@missingfonts, @missingafms);
+ &get_afm_names($afm_place);
+ &get_font_names($font_place);
+ @allfonts=@pfafiles;
+ push(@allfonts, @pfbfiles);
+ push(@allfonts, @dotless);
+ @allfontnames = @allfonts; # save fonts with original extensions
+ @oriafmfiles = @afmfiles; # save afm's with original extensions
+ &stripextension(*afmfiles, "[Aa][Ff][Mm]");
+ &stripextension(*allfonts, "[Pp][Ff][AaBb]"); # regex OK in stripextension
+ if ($debugging == $false) { # not debugging...
+ @missingfonts = &listcompare(*afmfiles, *allfonts);
+ @missingafms = &listcompare(*allfonts, *afmfiles);
+ local($fontgaps) = $false;
+ if ($#missingfonts > -1) {## warning---missing font files
+ $fontgaps = $true;
+ &dwlog("There are some missing afm files.");
+ &dwlog("They are >> \n ", join("\n ", @missingfonts));
+ &dwlog("You will need to find the missing afm's and re-install.");
+ }
+ if ($#missingafms > -1) {## warning---missing afm files
+ $fontgaps = $true;
+ &dwlog("There are some missing font files.");
+ &dwlog("They are >> \n ", join("\n ", @missingafms));
+ &dwlog("You will need to find the missing fonts and re-install.");
+ }
+ if ($#afmfiles < 0) {# no afms at all!
+ $fontgaps = $true;
+ &dwlog("That's funny---I find no afm files at all!");
+ }
+ if ($#allfonts < 0) {# no fonts at all!
+ $fontgaps = $true;
+ &dwlog("That's funny---I find no font files at all!");
+ }
+ &dwlog("Fonts appear to be all in order!") unless $fontgaps;
+ die "Something is wierd, and I can't go on..." if $fontgaps;
+ } else { # debugging
+ &dwlog(" *** Debugging now---not checking font files at all...");
+ }
+}
+
+## When using &ClassifyEachFont (see below), we need to extract certain
+## info from the initial part of the afm file. If the first arg is found
+## in the current line from afm, the info is stored in the second arg.
+## Eg.: &getafminfo('FamilyName', $Familyname);
+
+sub getafminfo{
+ local($searchstr) = $_[0];
+ if (/$searchstr/) {
+ ($head, $_[1])=split(/ /, $_, 2);
+ $_[1] = $correx{"$currafm$searchstr"}
+ if defined $correx{"$currafm$searchstr"};
+ &Canonize($_[1]); # removes white space
+ }
+}
+
+ $talk = <<"Endtalk";
+I need a 3-character designation for each font family
+you've given me. If I have heard of the family, I'll
+suggest the abbreviation to you (simply press ENTER to
+accept). If the family is new to me, I'll make a naive
+suggestion; again, press ENTER to accept, or enter an
+abbreviation of your own.
+
+Endtalk
+
+sub validatefamilydata{
+ $myfamily = &stdin;
+ for (;;) {
+ $l = length($myfamily);
+ if ( ($l == 3) || ($l == 0) ) {last;}
+ print "Stop trying to confuse me---I need EXACTLY \n";
+ print "three (3) characters. Please try again (or just push ENTER). >> ";
+ $myfamily = &stdin;
+ }
+}
+
+## The lines of map.sup have lines like
+## a autologi Autologic
+## b bitstrea Bitstream
+## It's a small table, so we load it right away.
+## (The `sup' stands for `supplier'.)
+
+sub loadsupplierinfo{
+ open (SUPP, "..${sep}map.sup") || "I'm missing file map.sup.";
+ while (<SUPP>) {
+ next if /^\#/; # discard comments
+ chop;
+ local($s, $supdirectory, $suppliername) = split(/\s+/, $_, 3);
+ $supp2sabb{$suppliername} = $s;
+ $sabb2supdir{$s} = $supdirectory;
+ }
+ $defaults = "9";
+ $defaultsuppliername = "unknown";
+}
+&loadsupplierinfo; # just do it!
+
+
+## The entries in map.n2a look like this:
+## ACaslon ac
+## AGaramond ad
+## (This file maps family names (n) to fontname abbrevs (a).)
+
+sub loadfontfamilyinfo{
+ open (DICT, "..${sep}map.n2a") ||
+ die "Can't seem to open file `map.n2a'. Help, please";
+ while (<DICT>) {
+ next if /^\#/; # ignore comments
+ ($knownfamily, $abb) = split(/\s+/, $_);
+ $family2abb{$knownfamily} = $abb;
+ }
+ close DICT;
+}
+&loadfontfamilyinfo;
+
+## Lines in the map.a2d file look like this:
+## ac acaslon
+## ad agaramon
+## (This file maps fontname abbreviations (a) to TDS directory
+## names (d).)
+
+sub loadfamdirectoryinfo{
+ open (DICT, "..${sep}map.a2d") ||
+ die "Can't open `map.a2d'. Mayday...";
+ while (<DICT>) {
+ next if /^\#/; # ignore comments
+ ($ab, $abbdir) = split(/\s+/, $_);
+ $abb2dir{$ab} = $abbdir;
+ }
+}
+
+## If a font family appears to be unknown, it may still be
+## possible to make an educated guess. A known family may actually
+## be embedded in the current family, as `AGaramond' is in
+## the family `AGaramondExp-Regular'. We'll cycle through all the
+## hash keys to see if this is so. We've previously prepared a file
+## `famnames' which contains the sorted family names (sorted by
+## length of family name, that is), and we'd better read it into
+## the array @famnames.
+
+## sub bynamelength{
+## $aa = length($a); $bb = length($b);
+## $n2l{$a} = $aa; $n2l{$b} = $bb;
+## $n2l{$b} <=> $n2l{$a};
+## }
+## @famnames = sort bynamelength keys %family2abb;
+## undef %n2l;
+
+sub loadsortedfamnames{
+ open(FAMNAMES, "..${sep}famnames") ||
+ die "Where is my list of family names `famnames'?";
+ while (<FAMNAMES>) {
+ chop;
+ push(@famnames, $_);
+ }
+ close FAMNAMES;
+}
+&loadsortedfamnames; # loads the @famnames array
+
+sub guessfontfamily{
+ local($found) = false;
+ foreach $fname (@famnames) {
+ next if length($Familyname) < length($fname);
+ $fname_ = $fname;
+ last if $Familyname =~ /$fname_/;
+ }
+ $found = $true if $Familyname =~ /$fname_/;
+ $tentativefamily = "unknown"; # the default
+ $tentativefamily = $family2abb{$fname_} if $found == $true;
+ $tentativefamily = "$thisabb$tentativefamily";
+}
+
+$talked=$false;
+sub getfontfamily{
+ print $talk if $talked == $false; $talked = $true;
+ if (defined($family2abb{$Familyname})) { # known font family
+ ($tentativefamily, $tmp) = split(/ /, $family2abb{$Familyname});
+ $tentativefamily =~ tr/A-Z/a-z/;
+ $tentativefamily = "$thisabb$tentativefamily";
+ print "Here's what I can suggest for a family name for \n";
+ print ">> $Familyname.\nPress ENTER to accept, or type your own:\n";
+ print " >> $tentativefamily\n";
+ } else { # unknown font family
+ &guessfontfamily;
+ $bruteforceguess=substr($fontname, 0, 2);
+ $bruteforceguess=~tr/A-Z/a-z/;
+ $bruteforceguess = "$thisabb$bruteforceguess";
+ $tentativefamily = $bruteforceguess
+ if $tentativefamily =~ "unknown";
+ print "I've not heard of the font family containing\n";
+ print "$fontname in file $currafm. May I suggest\n";
+ print ">> $tentativefamily\nas a font family name? ";
+ print "(Press ENTER to accept, or give a 3-letter name.) \n";
+ }
+ &validatefamilydata; # must be exactly 3 chars or a null string
+ if ($myfamily eq "") {$myfamily=$tentativefamily;}
+ $family{$Familyname}=$myfamily; # eg. $family{'AGaramond'}='pad'
+}
+
+## computes tangent from ItalicAngle
+## eg. $mytan = &Tan($italicangle);
+
+sub tan{
+ local($angle) = @_;
+ local($radangle) = $angle * $piover180;
+ $mytan = sin($radangle)/cos($radangle);
+ if ($mytan < 0) {
+ $mytan = -1*$mytan;
+ }
+ $mytan;
+}
+
+## FindArrayElementContaining finds the element of $_[0] which contains $_[1].
+## eg. $currfont = &FindArrayElementContaining(*allfontnames, $currafm);
+## We use this array to use the first name of an afm file to read into
+## an array containing full names of font files to get the actual font
+## name.
+
+sub FindArrayElementContaining{
+ local(*source, $strng)=@_;
+ foreach $elem (@source) {
+ $found = $elem;
+ last if $elem =~ /\b$strng\b|\b$strng\./;
+ }
+ $found;
+}
+
+sub getfontcharacteristics{
+ @afmtop = ();
+ for (;;) {
+ $_=<CURRAFM>; chop $_; # get rid of CR-LF
+ push (@afmtop, $_) unless /EncodingScheme/; # store the top
+ last if /StartCharMetrics/;
+ &getafminfo("FontName", $fontname);
+ &getafminfo("FullName", $fullname);
+ &getafminfo("FamilyName", $Formalfamilyname);
+ &getafminfo("Weight", $weight); $weight =~ tr/A-Z/a-z/;
+ &getafminfo("EncodingScheme", $encoding);
+ &getafminfo("ItalicAngle", $italicangle);
+ &getafminfo("IsFixedPitch", $monowidth);
+ }
+ $topofafmfile = join ("", @afmtop);
+ foreach $supplier (keys %supp2sabb) {
+ $supplierfound = $true;
+ $thissupplier = $supplier;
+ $thisabb = $supp2sabb{$supplier};
+ last if $topofafmfile =~ /$supplier/;
+ $supplierfound = $false;
+ }
+ if ($supplierfound == $false) {
+ $thissupplier = "unknown"; # use defaults
+ $thisabb = "9";
+ }
+}
+
+sub getfontangle{
+ $angle{$myfamily} = 0 unless defined $angle{$myfamily}; # default
+ if ($italicangle != 0) {# non-upright font
+ $mytan = &tan($italicangle);
+ $angle{$myfamily} = int(1000 * $mytan);
+ ## Because of coordinate system differences, the angle is almost
+ ## always negative, so the tan will be negative. We make it positive.
+ ## Incidentally, Perl4 forgot to make the tangent negative, so we
+ ## deal with it here.
+ $angle{$myfamily} *= -1 if $angle{$myfamily}<0;
+ } else {
+ $angle{$myfamily} = "000";
+ }
+}
+
+&loadweightinfo;
+
+sub getfontweight{
+ if (defined($weightsortkey{$weight})) {
+ $wsk = $weightsortkey{$weight}; # weight sort key
+ $wind = $weightindicator{$weight}; # weight indicator
+ } else { # screwy weight somehow
+ print "The weight `$weight' for $fontname is a new one for me.\n";
+ print "I use defaults for normal-type weights.\n";
+ $weight = "normal";
+ $wsk = $weightsortkey{$weight}; # use normal as default
+ $wind = $weightindicator{$weight}; # ditto; alert user
+ }
+}
+
+&loadshapeinfo;
+
+sub getfontshape{
+ $shapekey = "roman"; # default values follow...
+ $shsk = 0;
+ $shind = "r";
+ foreach $key (keys %shapesortkey) {
+ if ($fullname=~/$key/i) {
+ $shsk = $shapesortkey{$key};
+ $shind = $shapeindicator{$key};
+ $shapekey = $key;
+ }
+ }
+}
+
+&loadvariantinfo;
+
+## It's possible that raw fonts can have more than one non-shape
+## variant. Such fonts will rarely be suitable for constructing
+## virtual fonts for prose typesetting, so I wil give them the highest
+## sort key to get them out of the way. NB: All sort key synonyms
+## are case insensitive EXCEPT for those containing an uppercase
+## character in the @variants array. This necessitates the special
+## treatment in the foreach loop below...
+
+sub getfontvariant{
+ $variant = 0; # default
+ undef @foundvariants;
+ $varsk = -1; # default for sork key
+ foreach $key (keys %variantsortkey) {
+ if ($key =~ /[A-Z]/) {# UC indicates case sensitivity
+ if ($fontname =~ /$key/) {
+ push(@foundvariants, $key);
+ $test = $variantsortkey{$key};
+ $varsk = $test if $test>$varsk; # get largest of sort keys
+ }
+ } else {
+ if ($fontname =~ /$key/i) {
+ push(@foundvariants, $key);
+ $test = $variantsortkey{$key};
+ $varsk = $test if $test>$varsk; # get largest of sort keys
+ }
+ }
+ }
+ if (! defined(@foundvariants)) {
+ push(@foundvariants, "regular");
+ $varsk = 0;
+ }
+}
+
+sub sortcurrvar{ # sort the chars in the $currvar string
+ local(@chars) = split(//, $currvar);
+ @chars = sort @chars;
+ $currvar = join('', @chars);
+}
+
+sub CreateNewRawFontNames{
+ # First, the font abbreviation and weight....
+ $berryname = "$myfamily$wind";
+ # Now for the issue of variants, which includes shape...
+ if ($shsk > 0) {
+ $berryname .= $shind; # append shape if not `normal'
+ }
+ $currvar = ""; $currdigit = 8; $currenc = "a"; # initialize variants
+ # In the absence of other other variants, variants will be given
+ # by "$currvar$currdigit$currenc" = "8a".
+ foreach $vkey (@foundvariants) {
+ $varenctype = $variantenctype{$vkey};
+ $varind = $variantindicator{$vkey};
+ $varsk = $variantsortkey{$vkey};
+ if ($varenctype eq "S") { # a shape-like variant exists for the font
+ $currvar .= $varind if $varsk gt "0";
+ }
+ if (($varsk==4)||($varsk==5)||($varsk==6)||($varsk eq "A")) {
+ $currdigit = 7;
+ }
+ if ($varenctype eq "E") {
+ $currenc = $varind;
+ }
+ }
+ # $currvar is a string of letters. For fun, let's sort them.
+ &sortcurrvar;
+ $berryname .= "$currvar$currdigit$currenc";
+ &dwlog("Uh oh---`$berryname' is more than 8 chars! Fix me.")
+ if length $berryname > 8;
+}
+
+sub findmaxlength{ # find longest length of entries in @foo
+ local(*foo) = @_;
+ $maxl = -1; local($l, $maxl);
+ foreach $elem (@foo) { # let's find max length of filename
+ $l = length($elem);
+ $maxl = $l if $l > $maxl;
+ }
+ $maxl;
+}
+
+## Sometimes, two or more fonts have the same sortkey. This may occur
+## because the font files are somehow present more than once in the
+## working directory, or because VFinst is not capable of distinuishing
+## between two different fonts. The user should be notified of this
+## potential conflict. Duplicate fonts should be eliminated.
+## Then, 1vfinst should be executed again
+
+undef @duplicates; # initialize array
+sub checkforduplicates{
+ foreach $line (@fontlist) {
+ local($sortkey, $fontstuff) = split / /, $line, 2;
+ $scratch{$sortkey} .= $line;
+ }
+ local($count);
+ foreach $key (keys %scratch) {
+ chomp $scratch{$key};
+ $count = ($scratch{$key} =~ /\n/g); # $count>0 for duplicate entries
+ push(@duplicate, $scratch{$key}) if $count > 0;
+ }
+ undef @scratch;
+ $duplicates_found = $true if @duplicate;
+}
+
+
+
+
+ $TDStalk = <<"EndTDStalk";
+You have indicated this is a TeX Directory Structure (TDS)
+system. That means you'll need to provide me a supplier
+(e.g., monotype, adobe, etc) and a typeface name (agaramon,
+baskerv, and so on). I'll do my best to help you, but
+you might need to provide me with names. Here we go...
+
+EndTDStalk
+
+## One special case: in general, medium and normal are two distinct
+## weights (series). People are sloppy about their terminology, however.
+## In case there is no actual normal series, medium shall become normal.
+
+$normalweight = $false;
+$mediumweight = $false;
+sub recalibratefontlist{
+ foreach $elem (@fontlist) {
+ if (substr($elem, 3, 1) == $mediumwt) { # we've found medium!
+ substr($elem, 3, 1) = $normalwt; # change sort key
+ substr($elem, 10, 1) = "r"; # change series indicator
+ }
+ }
+}
+
+sub getfontcorrections{
+ open (RC, "..${sep}vfinst.rc");
+ &dwlog("\nHere are the font corrections in vfinst.rc:");
+ while (<RC>) {
+ chop if /\n$/; # get rid of newline if it is present
+ next if /^\#/; # ignore comments
+ &dwlog(" $_");
+ s/\s+/ /g; # eliminate extra spaces
+ local($fontname, $characteristic, $correction) =
+ split(/\s+/, $_, 3);
+ $afmfile=$file2font{$fontname};
+ $correx{"$afmfile$characteristic"} = $correction;
+ }
+ close RC;
+ &dwlog(""); # skip a line
+}
+
+## We need to connect the fonts via the FontName with the names
+## of the font files before they have been renamed according to the
+## Berry scheme. The next subroutine creates that mapping---a hash
+## so that $font2file{$fontname}=$filename.
+
+sub map_files_to_fonts{
+ foreach $afm_ (@oriafmfiles) {
+ open(CURRAFM, "$afm_place$sep$afm_") || die "Where is $afm_?";
+ local($afmm, $ext)=split(/\./, $afm_);
+ $myfontname="XXXXXX"; # default value indicates not found
+ for (;;) {
+ $_=<CURRAFM>;
+ $_ =~ s/[\n\r]//g; # get rid of CR-LF
+ last if /StartCharMetrics/;
+ if (/FontName/) {
+ ($tmp, $myfontname)=split(/ /, $_, 2);
+ }
+ }
+ $file2font{$myfontname}=$afmm;
+ }
+}
+
+sub ClassifyEachFont{
+ @afmfiles = sort @afmfiles;
+ &map_files_to_fonts;
+ &getfontcorrections if -e "..${sep}vfinst.rc"; # non-invasive afm correx
+ foreach $currafmname (@oriafmfiles) {
+ local($currafm, $aext) = split /\./, $currafmname;
+ open(CURRAFM, "$afm_place$sep$currafmname");
+ &getfontcharacteristics;
+ $normalweight = $true
+ if $weightsortkey{$weight} == $weightsortkey{"normal"};
+ $mediumweight = $true
+ if $weight =~ /medium/i;
+ # We'll try to get as much info as possible from the fontname
+ ($Familyname, $fontvar) = split(/-/,$fontname);
+ close CURRAFM;
+ $familyname = $Familyname;
+ &getfontfamily unless defined $family{$Familyname};
+ $myfamily = $family{$Familyname};
+ &getfontangle;
+ &getfontweight;
+ &getfontshape;
+ &getfontvariant;
+ $sortkey="$myfamily$wsk$shsk$varsk";
+ # Now that we have all the information about the font, we might as
+ # well create the new Berry name for it...
+ &CreateNewRawFontNames;
+ $currfont = &FindArrayElementContaining(*allfontnames, $currafm);
+ local($fontfirst, $fext) = split /\./, $currfont;
+ $maxlength = &findmaxlength(*allfontnames);
+ $maxlength = 11 if $maxlength<11;
+ $currfont = "Unknown" if $debugging;
+ $maxlength = length("unknown ") if $debugging;
+ &rpad($berryname, 11);
+ $fontandafm = "$fontfirst.\{$fext,$aext\}";
+ &rpad($fontandafm, $maxlength+6);
+ $fontinformation =
+ "$sortkey $berryname$angle{$myfamily} $fontandafm $fontname\n";
+ ## Before saving this information, we first...
+ push(@fontlist,$fontinformation);
+ }
+ undef %family2abb; # release memory resources
+ if (($normalweight == $false) && ($mediumweight == $true)) {
+ # That is, since there is no normal but there is a medium,
+ # medium shall become normal.
+ $mediumwt = $weightsortkey{"medium"};
+ $normalwt = $weightsortkey{"normal"};
+ &recalibratefontlist;
+ }
+ @fontlist = sort @fontlist;
+ &checkforduplicates;
+ $file = "File"; &rpad($file, $maxlength);
+ $name = "Name"; &rpad($name, $maxlength);
+ &dwlog("\nHere are the fonts and their proposed new (Berry) names:\n");
+ $titles[0] =
+ "$rem Sort New Slant $file Long Digital Foundry ";
+ $titles[1] =
+ "$rem Key Name $name Name ... ";
+ $titles[2] = "$rem " . "=" x 72;
+ open (FONTS, ">fonts.lst");
+ print FONTS "$rem This is list of font information used by VFinst.\n";
+ print FONTS "$rem Created by $vfp on $today at $now.\n$rem\n";
+ print FONTS join("\n",@titles), "\n";
+ print FONTS @fontlist;
+ close FONTS;
+ &dwlog(join("\n",@titles));
+ &dwlog(join("",@fontlist));
+ if (&isTDS) { # get additional info for TDS...
+ # At this point, all fonts have been classified and stored within
+ # @fontlist. We'll waltz through that array, using that array to
+ # determine the font families we are using and to seek for
+ # appropraite info in the map files that are part of vfinst.
+ print $TDStalk;
+ open (TYPE, ">typeface.lst");
+ &loadfamdirectoryinfo;
+ foreach $entry (@fontlist) {
+ undef $famdir;
+ ($sortkey, $berryname, $slant, $currfont, $fontname) =
+ split(/\s+/, $entry);
+ $s = substr($berryname, 0, 1); # supplier abbreviation
+ $fm = substr($berryname, 1, 2); # 2-char family abbrev
+ $fm = substr($berryname, 1, 2); # 2-char family abbrev
+ $fam = substr($berryname, 0, 3); # 3-char family abbrev
+ if (!defined $famdir{$fam}) { # get info only if necessary...
+ $currsupdir{$fam} = $sabb2supdir{$s};# supplier first
+ print "I will use supplier directory\n >>$currsupdir{$fam}";
+ print "\nfor $berryname and all other fonts with the same\n";
+ print "family name. Press ENTER to accept, or enter another\n";
+ print "alternative.... ";
+ $alt = &stdin;
+ $currsupdir{$fam} = $alt if $alt ne "";
+ $famdir{$fam} = $abb2dir{$fm} if defined $abb2dir{$fm};
+ if (!defined $abb2dir{$fm}) {# no lookup info
+ print "Hmm---I have no information for a directory name for\n";
+ print "the $fm family of fonts. Please enter a lowercase\n";
+ print "directory name for these fonts. >>";
+ $famdir{$fam} = &stdin;
+ } else {
+ print "I will use font directory name\n >>$abb2dir{$fm}\n";
+ print "for $berryname and all other fonts within the same\n";
+ print "family. Press ENTER to accept, or enter another\n";
+ print "directory name now. >>";
+ $alt = &stdin;
+ $famdir{$fam} = $alt if $alt ne "";
+ }
+ $tdsinfo{$fam} = "$fam $famdir{$fam} $currsupdir{$fam}";
+ print TYPE "$tdsinfo{$fam}\n";
+ }
+ }
+ close TYPE;
+ &dwlog("\nHere are the fontfamilies, typeface names, and suppliers");
+ &dwlog("for this installation:\n");
+ foreach $key (sort keys %tdsinfo) {
+ &dwlog("$tdsinfo{$key}");
+ }
+ &reassure("fonts.lst");
+ }
+ open(DUPS, ">duplicat.lst") || # prepare for duplicate info...
+ die "Can't open duplicates file";
+ print DUPS "This file `duplicat.lst' created by $vfp";
+ print DUPS " on $today at $now.\n\n";
+ if ($duplicates_found) {
+ print DUPS "A list of all fonts that appear the same to VFINST...\n";
+ print DUPS "=============================================\n";
+ &dwlog("Some fonts may be duplicated or may not appear distinct to ");
+ &dwlog("VFinst. Here's the list:\n");
+ &dwlog("=============================================");
+ foreach $dup (@duplicate) {
+ print DUPS "$dup\n";
+ print DUPS "=============================================\n";
+ &dwlog("$dup\n", "=============================================");
+ }
+ &dwlog("Make adjustments, and re-run this script `1vfinst'.");
+ &dwlog("(Check `Fixing .afm files' in `vfinst.tex' for assistance.)");
+ &reassure("duplicat.lst");
+ print DUPS "Duplicates should be removed or fixed; check `vfinst.tex'";
+ print DUPS " for assistance. Then _re-run_ the `1vfinst' script...\n";
+ } else {
+ print DUPS "No duplicate fonts found.\n";
+ &dwlog("No duplicate fonts found.");
+ }
+ close DUPS;
+}
+
+################################################################
+#
+# MAIN ROUTINE.
+#
+################################################################
+
+## First, we open a text file that gets written again ONLY in cases
+## of normal program termination. This makes it possible for 2vfinst.prl
+## to test for proper termination of this program.
+
+print "This is $vfp.\n\n"; # banner
+
+sub DoIt{
+ &OpenLog; ## opens the log file
+ &GetEnvironment;
+ if (&isTDS) {
+ print "\nThis is a TDS (TeX Directory Structure) Production!\n\n";
+ }
+ &CheckInstallation(@VFINSTmanifest);
+ &AllAfmsNeedMates;
+ &ClassifyEachFont; # get font family, width, shape, and variant, etc.
+ &CloseLog;
+}
+
+&DoIt; ## YES!!
+
+## Now summarize instructions for the next phase...
+open (NOW, ">start.vfi");
+print NOW "(This is the file _start.vfi_ produced by VFinst$ver.)\n\n";
+print NOW "Here's the list of fonts with some supporting information:\n\n";
+print NOW join("\n",@titles),"\n";
+print NOW join("",@fontlist);
+if ($duplicates_found) {
+ print NOW
+ "\nVFinst thinks that some fonts are duplicated. Here's that list:\n";
+ print NOW
+ "==============================================================\n";
+ foreach $dup (@duplicate) {
+ print NOW "$dup\n";
+ print NOW
+ "==============================================================\n";
+ }
+}
+ $now =<<"EndNow";
+
+ Please inspect this list, and eliminate any fonts (.pfb + .afm)
+that may not be appropriate. (Check `vfinst.tex` for additional info.)
+Eliminate any duplicate fonts, if VFinst found any. In case you do make
+any changes to the fonts that are present, please then re-run the script
+`1vfinst`.
+ When you are satisfied with your collection of fonts, then
+run the script `2vfinst`.
+EndNow
+print NOW $now;
+print $now;
+close NOW;
+&display("\n(Font information plus instructions for proceeding \n",
+ "appear in the Ascii file `start.vfi'.");
diff --git a/fonts/utilities/vfinst/2vfinst b/fonts/utilities/vfinst/2vfinst
new file mode 100644
index 0000000000..7dca44da7c
--- /dev/null
+++ b/fonts/utilities/vfinst/2vfinst
@@ -0,0 +1,963 @@
+#!/usr/local/bin/perl
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "1.00",
+### date = "August 1998",
+### filename = "2vfinst",
+### address = "Department of Mathematics,
+### John Jay College,
+### 445 West 59 Street,
+### New York, NY 10019, USA",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### keywords = "AFM, virtual fonts, fonts, PostScript, TeX",
+### supported = "yes",
+### abstract = "This is the second Perl script for the
+### vfinst virtual font installation utility.
+### See accompanying file vfinst.tex for
+### additional details.",
+### package = "vfinst",
+### dependencies = "vfinst, 1vfinst, fontinst",
+### }
+### ====================================================================
+
+## This script does the grunt work. Using information generated by
+## 1vfinst and given in the parameter file vfinst.par, this script
+## will generate TeX files and other scripts to generate the virtual
+## fonts, to create needed directories, and to move files into the
+## proper places.
+
+#< This file contains definitions for the following subroutines:
+#>
+
+## What this script expects.
+## =========================
+## 1. a fresh copy of psfonts.map in the work directory.
+
+# SUBROUTINES AND STUFF ...
+
+require("../vfinst.par"); # system dependent!! Beware!!
+require("..${sep}vfinst.lib");
+&getTDSplaces if &isTDS; # construct some TDS parameters
+##$vfencoding = $vfmapdir unless defined $vfencoding;
+$cp = $copy; # a synonym
+$rm = $del; # another synonym
+
+##$vfencoding = "" if $vfencoding eq $root; # This eliminates strange
+ # double backslash path names in
+ # case you place the enc file in the root
+
+## We begin by extracting font information from the file fonts.lst,
+## painstakingly prepared by 1vfinst. This file begins with column
+## headings (which we ignore) and is followed by lines of the form
+## mbm300 mbmr8a 000 mbur8a.pfb BulmerMT-Regular
+## whose fields are the sortkey, proposed Berry fontname, slant, existing
+## font outline name, and long (Adobe or Monotype or ...) font name.
+## The matching afm file must have a name formed by stripping the existing
+## extension if there is one and appending `.afm'. Note that slant sometimes
+## varies within members of a family, as in Bulmer, with slightly
+## different slants depending on whether the font is regular, bold,
+## or semi.
+
+## The `parseberryname' routine takes a Berry name like "mbmri8a"
+## as argument.
+
+sub parseberryname{
+ local($scr) = $_[0];
+ $berryfam = substr($scr, 0, 3);
+ $berryencoding = substr($scr, -2, 2);
+ $berryseries = substr($scr, 3, 1);
+ local($l) = length $scr;
+ $berryvars = substr($scr, 4, $l-4-2); # variants
+}
+
+## In case the original extensions are uppercase or something wierd,
+## we need to retrieve this information.
+
+sub get_original_extensions{
+ local($name_plus_extensions) = $_[0];
+ ## $name_plus_extensions looks like `foo.{pfb,afm}'
+ $name_plus_extensions
+ =~ /([-a-zA-Z0-9_]+)\.\{([pfabPFAB]*),([aA][fF][mM])\}/;
+ local($firstname, $pext, $aext) = ($1, $2, $3);
+ $pext = ".$pext" unless $pext eq "";
+ $aext = ".$aext";
+ ($firstname, $pext, $aext);
+
+}
+
+
+## Although all the information in @fontinfo is used somewhere or other,
+## we can facilitate later processing by extracting useful information
+## and storing it separately. In addition to reading fonts.lst, this
+## routine stores a separate list of the font families we have.
+
+## The array @fonts_to_ignore contains a list of font types to ignore----fonts
+## like ornaments, oldstyle figures, etc.
+@fonts_to_ignore=(
+ "p8a", # ornaments
+ "7a", # alternate fonts
+ "7d", # old-style figures
+ );
+sub examine_fonts{
+ $we_ignore_this_font=$false;
+ foreach $font_type (@fonts_to_ignore) {
+ $we_ignore_this_font=$true if $_=~/$font_type\s+/;
+ }
+}
+@fams=();
+sub getfontinfo{
+ open (IN, "fonts.lst") || die "Where is file `fonts.lst'?";
+ while (<IN>) {
+ next if /^$rem/; # ignore comments
+ # in case a user has messed with it...
+ &examine_fonts;
+ push(@fontinfo, $_) unless $we_ignore_this_font;
+ }
+ @fontinfo = sort @fontinfo; # just in case, we sort it again
+ foreach $line (@fontinfo) {
+ local($sk, $bname, $sl, $oln, $fname) = split(/\s+/, $line);
+ push(@berrynames, $bname);
+ $sortkeys{$bname} = $sk;
+ $slants{$bname} = $sl;
+ local($first_name, $pf_ext, $af_ext) = &get_original_extensions($oln);
+ $filename{$bname} = "$first_name$pf_ext";
+ $afmname{$bname} = "$first_name$af_ext";
+ $longfontname{$bname} = $fname;
+ &parseberryname($bname);
+ # keep track of this family...
+ $tmp{$berryfam} = 1;
+ # Now see if smallcaps/osf exists for the family...
+ $expert{$berryfam} = 1 if $berryencoding =~ /x/;
+ $expert{$berryfam} = 1 if $berryvars =~ /c/;
+ $expert{$berryfam} = 1 if $berryvars =~ /x/;
+ # Examine and store slant info, a function of family and series
+ $seriesslant{"$berryfam$berryseries"} = $sl unless $sl eq "000";
+ # We check to see fam/series contains an oblique font. Oblique
+ # exists if the penultimate sortkey character == 2.
+ $obl{"$berryfam$berryseries"} = 1 if substr($sk,-2,1) eq "2";
+ }
+ @fams = sort(keys %tmp); undef %tmp;
+}
+&getfontinfo; # font info loaded!
+
+## Prior to creating the psfonts addendum, let's read the current
+## psfonts.map to determine all the raw fonts currently there. We
+## only want to add an entry to psfonts.new if the font is truly new.
+## If it exists already, we don't want to add it again.
+
+sub GetExistingRawFonts{
+ &copy("$vfmapdir${sep}psfonts.map", "psfonts.map");
+ open (MAP, "psfonts.map") || die "Where is psfonts.map?...$!\n";
+ &copy("psfonts.map", "psfonts.ori"); # keep an original copy...
+ while (<MAP>) {
+ next if $_ eq "\n"; # ignore blank lines
+ next if /^%/; # ignore comment lines (beginning with %)
+ local($rawfont, $other) = split(/\s+/, $_, 2);
+ push(@oldraws, $rawfont); # save name of the raw font
+ }
+ close MAP;
+}
+&GetExistingRawFonts; # do it!
+
+## We'll use this next routine to see whether a raw font
+## already appears in psfonts.map
+
+sub CheckforNewRawFont{
+ $isnewfont = $true; local($myfont) = $_[0];
+ local(@greplist) = grep(/^$myfont/, @oldraws);
+ $isnewfont = $false if defined @greplist;
+}
+
+## This routine checks a raw font to see if it is Adobe Standard
+## encoded. If so, it stores the original name as an ASE font
+## (ASE = Adobe Standard Encoding),
+## revises $rawfont to reflect the TeXBase1Encoding 8r. It also
+## sets a flag to show that the change has been made. Issue
+## routine with the raw font name as arg, eg
+## &checkencoding($rawfont, $asefont); The 2 fonts will be the
+## same unless the original encoding is 8a AND there are
+## no berry variants except for italic.
+
+## The question of variants: variants like expert, small caps, figures,
+## fraction fonts, etc are not suitable for re-encoding according to
+## the TeXBase1 encoding. On the other hand, regular and sans and
+## their italics are suitable
+
+sub makeASEcheck{
+ local($myrawfont, $asefont) = @_;
+ $asefont = $myrawfont;
+ $isviiir = $false; # the default
+ if ((substr($asefont, -2, 2) eq "8a") && ($berryvars eq "i")) {
+ $isviiir = $true; # case 1: italicb
+
+ }
+ if ((substr($asefont, -2, 2) eq "8a") && ($berryvars eq "")) {
+ $isviiir = $true; # case 2: no variants
+ }
+ if ((substr($asefont, -2, 2) eq "8a") && ($berryvars =~ "s")) {
+ $isviiir = $true; # case 3: sans serif
+ }
+ substr($asefont, -2, 2) = "8r" if $isviiir;
+ $_[0] = $myrawfont;
+ $_[1] = $asefont;
+}
+
+sub gettypeinfo{ # only for TDS systems
+ open (IN, "typeface.lst") || die "Where is my list of typefaces?";
+ # Each line in this file looks like:
+ # mbm bulmer monotype
+ while (<IN>) {
+ local($fam); chop;
+ ($fam, $face, $supp) = split(/\s+/, $_);
+ $typeface{$fam} = $face;
+ $supplier{$fam} = $supp;
+ }
+ close IN;
+}
+
+## This rtn takes the @missdirs and suggests a script for creating
+## the missing directories, which are stored in @neededdirs.
+$mkdir="mkdir"; # system dependent call
+open(SCRIPT, ">mkdirs.bat"); # open this anyway, to zap an old file
+print SCRIPT "$rem This script makes any missing directories.\n";
+print SCRIPT "$rem It may be deleted after use.\n";
+sub makemkdirs{
+ foreach $i (0..$#missdirs) {# look at each missing directory
+ $pos=0;
+ $missdirs[$i] = "$missdirs[$i]$sep"; # tack on final slash
+ while (($pos = index($missdirs[$i], $sep, $pos)) >= 0) {# are
+ # any of of its parents missing also?
+ $currdir = substr($missdirs[$i],0,$pos);
+ $trulymissing=$true; # guess that the dir is really absent
+ foreach $j (0..$#neededdirs) {
+ $trulymissing=$false if $currdir eq $neededdirs[$j];
+ # discard it if we've already flagged it as missing
+ }
+ if (&isdir($currdir)) {} else {
+ push(@neededdirs,$currdir) if $trulymissing;
+ }
+ $pos++;
+ }
+ }
+ if ($#neededdirs >=0) {
+ &wlog("\nHere is a suggested script to create the needed directories:\n");
+ foreach $newdir (@neededdirs) {
+ &wlog("$mkdir $newdir");
+ print SCRIPT "$mkdir $newdir\n";
+ }
+ close SCRIPT;
+ }
+}
+
+sub checkdirs{
+ $errorcount=0;
+ if (&isTDS) {# TDS system
+ &verifydirs(
+ $vftexmf,
+ $vfmapdir,
+ $vfinputs,
+ );
+ $prefix = "$vftexmf${sep}fonts$sep";
+ while (($key,$sup) = each %supplier) {# check dirs for pfb, afm, vf, tfm
+ $typ = $typeface{$key};
+ $myafm = "${prefix}afm${sep}$sup${sep}$typ";
+ $mypfb = "${prefix}type1${sep}$sup${sep}$typ";
+ $mytfm = "${prefix}tfm${sep}$sup${sep}$typ";
+ $myvf = "${prefix}vf${sep}$sup${sep}$typ";
+ &verifydirs($myafm,$mypfb,$mytfm,$myvf);
+ }
+ } else {# traditional system
+ &verifydirs(
+ $vfvf,
+ $vftfm,
+ $vfmapdir,
+ $vfpsfonts,
+ $vfafm,
+ $vfinputs,
+ );
+ } # verification concludes
+ if ($errorcount == 0) { # everything OK
+ &display("All directories in place.");
+ } else {# somethings amiss
+ &dwlog("Here is a list of missing directories.\n");
+ &dwlog(join("\n",@missdirs));
+ &makemkdirs;
+ print "\nPlease execute mkdirs.bat when I am finished...\n";
+ }
+}
+
+## This function takes 2 args---fontfamily and file type.
+## The 3rd arg contains the place for the file; it acts like TDSplace
+## in case it is a TDS system, but uses the traditional location otherwise.
+## Example: $fontsource = &findplacefor($fontfamily,"type1");
+
+$tradfiletype{"type1"}=$vfpsfonts; # translates TDS terms
+$tradfiletype{"afm"}=$vfafm; # into lingo used for
+$tradfiletype{"tfm"}=$vftfm; # traditional installations
+$tradfiletype{"vf"}=$vfvf;
+
+sub findplacefor{
+ local($mystring, $mytype)=@_;
+ $tradtype=$tradfiletype{$mytype};
+ local($myfam)=substr($mystring,0,3);
+ if (&isTDS) { # otherwise, the TDS case...
+ $tradtype = "${vftexmf}${sep}fonts${sep}${mytype}${sep}";
+ $tradtype .= "$supplier{$myfam}${sep}$typeface{$myfam}";
+ }
+ $tradtype;
+}
+
+## We need to shear an original font---that is, make an oblique (slanted)
+## font from an upright, and an unslanted italic from a standard
+## italic. The guts of this is done by the &shearfonts routine, which
+## can be used to do either of these operations. (Incidentally, the `t'
+## in the middle of variable names $asetname and $berrytname suggest
+## the word `transformed' (sheared). )
+
+sub shearfonts{
+ # Now lets sort the variants...
+ local(@tmp) = split(//, $berryvars);
+ @tmp = sort @tmp;
+ $berrytvars = join("", @tmp);
+ # Now for the new name...
+ $berrytname = "$berryfam$berryseries$berrytvars$berryencoding";
+ $asetname = $berrytname; # they'll be the same except for 8r's
+ if ($isviiir == $false) { # a non-8r font...
+ &CheckforNewRawFont($berrytname);
+ print MAP "$berrytname $adobename \"$currsl SlantFont\" <$mapfontname\n"
+ if $isnewfont;
+ print TFM "pltotf $berrytname.pl $berrytname.tfm$appendtolog\n";
+ print PUTVFTF "$mv $berrytname.tfm $tfmplace\n";
+ } else { # an 8r font
+ $asetname =~ s/8a/8r/;
+ &CheckforNewRawFont($asetname);
+ if ($isnewfont) {
+ print MAP "$asetname $adobename \"$currsl SlantFont ";
+ print MAP
+ "TeXBase1Encoding ReEncodeFont\" <8r.enc <$mapfontname\n";
+ }
+ print TFM "pltotf $asetname.pl $asetname.tfm$appendtolog\n";
+ print PUTVFTF "$mv $asetname.tfm $tfmplace\n";
+ }
+ # Now for fontinst install instructions. Normally, we get metric
+ # data from the afm file, but we can get it from the mtx file if
+ # that exists---which it will in case of an 8r font.
+ $from = "fromafm";
+ $from = "frommtx" if $isviiir;
+ print INST "\\transformfont{$asetname}{\\slantfont{$dotlesssl}";
+ print INST "{\\${from}{$asename}}}\n";
+}
+
+sub makeuprights{ # make the upright fonts
+ # First, let's get the Berry name for the slanted font
+ # We replace the italic i by a u (unslanted italic) in the variants
+ $berryvars =~ s/i/u/;
+ &shearfonts unless $obl{$famseries};
+}
+
+sub makeslanteds{ # make the slanted fonts
+ # First, let's get the Berry name for the slanted font
+ # We add an o (oblique) to the variants
+ $berryvars .= "o";
+ &shearfonts unless $obl{$famseries};
+}
+
+## [It's now time to create the fontinst installation file. I forego
+## the use of the fontinst \latinfamily command for several reasons:
+## (1) I don't care for T1 fonts that \latinfamily insists on creating;
+## (2) I want to generate italic small caps which \latinfamily omits;
+## (3) I want to use the true italic angle for each family (\latinfamily
+## uses only the 1/6 slant of the Computer Modernfonts, but these
+## slants vary wildly from font family to font family);
+## and (4) I want
+## to be able to include other variants besides expert (eg Bitstream's
+## small caps and extensions fonts).]
+
+## Raw files need close examination. An addendum to psfonts.map
+## needs creation. Scripts to move fonts where they belong, to create
+## property list pl files, and the beginning of the fontinst installation
+## file need to be made.
+
+ $INSTprolog = <<"endinstprolog";
+%\&plain\n
+% This is a fontinst installation file.
+% Created by vfinst$ver at $now on $today.\n
+% THIS FILE MAY BE DELETED at completion of the font installation.\n
+\\input fontinst.sty\n
+endinstprolog
+
+## In TDS systems, it's not necessary to have font path names in psfonts.new.
+## The following subroutine strips them away, assuming that
+## [-+\!\?\@\#\$\%\^\&\:\;=\._A-Za-z0-9]
+## characterizes the allowable characters in a directory name. This is
+## probably more inclusive than most operating systems allow, anyway.
+
+sub strip_path_from_map_entries{
+ unlink "psfonts.tmp" if -e "psfonts.tmp";
+ $good_rename = rename "psfonts.new", "psfonts.tmp";
+ die "Cannot rename map file!" unless $good_rename;
+ open(TMPIN, "psfonts.tmp");
+ open(NEWOUT, ">psfonts.new");
+ while ($_ = <TMPIN>) {
+ #$_ =~ s/<(\s*)([-+\!\?\@\#\$\%\^\&\:\;=\._A-Za-z0-9]*$sep )+/<$1/g; #ori
+ if ($sep eq "\\") { # DOS and DOS-like systems...
+ $_ =~ s/<(\s*)(([-+\!\?\@\#\$\%\^\&\:\;_A-Za-z0-9]*)$sep$sep)+/</g;
+ } else { # UNIX and sensible systems...
+ $_ =~ s/<(\s*)(([-+\!\?\@\#\$\%\^\&\:\;_A-Za-z0-9]*)$sep)+/</g;
+ }
+ print NEWOUT $_;
+ }
+ close TMPIN; close NEWOUT;
+}
+
+ $appendtolog = " >> maketfm.vlg";
+sub processrawfiles{
+ # open files first of all...
+ open (MAP, ">psfonts.new");
+ print MAP "\n"; # cautionary newline
+ open (INST, ">makefont.tex"); # fontinst install file
+ open (TFM, ">maketfm.bat");
+ print TFM "$rem This file makes tfm files. It may be deleted after use.\n";
+ print TFM "$rem Created by $vfp on $today at $now.\n";
+ open (TLOG, ">maketfm.vlg"); # a log file
+ print TLOG
+ "Log file for VFinst maketfm.bat file for $now, $curdate.\n\n";
+ close TLOG;
+ open (REN, ">newnames.bat"); # renames fonts
+ print REN "$rem This file renames files. It may be deleted after use.\n";
+ print REN "$rem Created by $vfp on $today at $now.\n";
+ open (PUTFONT, ">putfonts.bat"); # places fonts, afm's properly
+ print PUTFONT "$rem This file moves files. Delete it after use.\n";
+ print PUTFONT "$rem Created by $vfp on $today at $now.\n";
+ open (PUTVFTF, ">putvftf.bat"); # places tfm's, vf's properly
+ print PUTVFTF "$rem This file moves files. Delete it after use.\n";
+ print PUTVFTF "$rem Created by $vfp on $today at $now.\n";
+ open (CLEANUP, ">cleanup.bat"); # removes stuff from work dir at end
+ print CLEANUP "$rem This file removes files. Delete it after use.\n";
+ print CLEANUP "$rem Created by $vfp on $today at $now.\n";
+ print INST "$INSTprolog";
+ foreach $berryname (@berrynames) {
+ $sortkey = $sortkeys{$berryname};
+ $fontfile = $filename{$berryname};
+ $adobename = $longfontname{$berryname};
+ &parseberryname($berryname);
+ $slant = $defaultslant;
+ $slant = $seriesslant{"$berryfam$berryseries"}
+ if defined($seriesslant{"$berryfam$berryseries"});
+ $dotlesssl = $slant;
+ $dotlesssl =~ s/\.//g; # fontinst doesn't want a decimal point
+ &makeASEcheck($berryname, $asename); # $berryname is the original
+ ($fontfirstname, $ext) = split(/\./, $fontfile);
+ $ext =".$ext" unless $ext eq "";
+ $fontplace = &findplacefor($berryname, "type1");
+ $fontplacefont = "$fontplace$sep$berryname$ext";
+ $afmplace = &findplacefor($berryname, "afm");
+ $tfmplace = &findplacefor($berryname, "tfm");
+ # Now to make addendum to map file, if necessary
+ &CheckforNewRawFont($berryname);
+ if ($isnewfont) { # addendum to psfonts.map
+# need a map name, which must be explicit for traditional systems,
+# but only the font name is needed for TDS systems, as its location
+# will be known in the kpathsea file database.
+ $mapfontname=$fontplacefont; # for traditional systems
+ $mapfontname="$berryname$ext" if &isTDS;
+ if ($isviiir) { # new font AND 8r-encoding
+ &CheckforNewRawFont($asename);
+ print MAP "$asename $adobename $eightR <$mapfontname\n"
+ if $isnewfont; # still new font?
+ } else { # 8x, 7d, etc encodings
+ print MAP "$berryname $adobename <$mapfontname\n";
+ }
+ }
+ # rename files (but only if they havenlt already been renamed)
+ if ($fontfirstname ne $berryname) {
+ print REN "$ren $fontfirstname$ext $berryname$ext\n";
+ print REN "$ren $afmname{$berryname} $berryname.afm\n";
+ }
+ print PUTFONT "$mv $berryname$ext $fontplace\n";
+ print CLEANUP "$rm $berryname$ext\n";
+ print PUTFONT "$mv $berryname.afm $afmplace\n";
+ print CLEANUP "$rm $berryname.afm\n";
+ # make tfm's out of the pl files that fontinst will produce...
+ print TFM "echo \"$berryname\"$appendtolog\n";
+ print TFM "pltotf $berryname.pl $berryname.tfm$appendtolog\n";
+ print PUTVFTF "$mv $berryname.tfm $tfmplace\n";
+ # 8r-encoded fonts mean more vf's in the system. fontinst
+ # needs to create them, an extra tfm needs to be made from
+ # the extra pl file, and of course this must be moved. (Up
+ # above, we've already added the 8r-incantation to the psfonts.map
+ # addendum.
+ if ($isviiir) {
+ print INST "\\transformfont{$asename}";
+ print INST "{\\reencodefont{8r}{\\fromafm{$berryname}}}\n";
+ print TFM "echo \"$asename\"$appendtolog\n";
+ print TFM "pltotf $asename.pl $asename.tfm$appendtolog\n";
+ print PUTVFTF "$mv $asename.tfm $tfmplace\n";
+ }
+ # If oblique versions do NOT exist, we want to create oblique
+ # forms of the upright fonts and unslant forms of the italics.
+ # Slants depend on both the font family and series.
+ $famseries = "$berryfam$berryseries";
+ $slantind = -1; # means stop
+ if (not defined($obl{$famseries})) { # no oblique
+ $sgn = "."; $slantind = 0; # upright
+ if ($berryvars =~ /i/) { # in case an italic
+ $sgn = "-.";
+ $slantind = 1; # italic
+ }
+ $currsl = "$sgn$seriesslant{$famseries}";
+ $dotlesssl = $currsl;
+ $dotlesssl =~ s/\.//g; # fontinst doesn't want a decimal point
+ if ($dotlesssl eq"") {
+ $dotlesssl = "167";
+ $currsl = ".167";
+ }
+ }
+ &makeuprights if $slantind == $currentlyslanted;
+ &makeslanteds if $slantind == $currentlyupright;
+ ## When sorting fonts to make instrucitons in the fontinst install
+ ## file, fonts with the same family, weight, and series (5 chars)
+ ## belong in the same instruction. We'll store the list of fonts
+ ## in 2 associative arrays indexed by these 5 char sequences---one
+ ## array for regular fonts and one for sheared fonts. Sheared fonts
+ ## are either slanted or unslanted italic.
+ $fivechars = $berryfam . substr($sortkey,3,2);
+ $storefont = $asename;
+ $storeshear = $asetname;
+ if ($isviiir) {
+ $storefont = $asename;
+ $storeshear = $asetname;
+ }
+ $fifonts{$fivechars} .= "$storefont,"; # fonts for fontinst file
+ $fishear{$fivechars} .= "$storeshear,"; # sheared fonts for fontinst
+ }
+ close MAP; # closes psfonts.new
+ ## In case this is a TDS system, we can eliminate path names from
+ ## from the entries in psfonts.new.
+ if (&isTDS) {
+ &strip_path_from_map_entries;
+ print REN "$del psfonts.tmp\n";
+ }
+ if (-s "psfonts.new" > 2) { # concatenate non-trivial map files
+ open (ALL, ">psfonts.all");
+ open (SRC, "psfonts.map") || die "The file psfonts.map vanished!";
+ while (<SRC>) {print ALL $_;} # insert original map file
+ close SRC; open (SRC, "psfonts.new");
+ while (<SRC>) {print ALL $_;} # append all additions.
+ close SRC;
+ print REN "$del psfonts.map\n";
+ print REN "$ren psfonts.all psfonts.map\n";
+ }
+ print REN "$del psfonts.new\n";
+}
+
+sub makevfandstorefiles{
+ print TFM "echo \"$vfname\"$appendtolog\n";
+ print TFM "vptovf $vfname.vpl $vfname.vf $vfname.tfm$appendtolog\n";
+ print PUTVFTF "$mv $vfname.vf $vfplace\n"; # store font files...
+ print PUTVFTF "$mv $vfname.tfm $tfmplace\n";
+}
+
+sub printtestlines{
+ print PLN " \\font\\t=$vfname at \\fontsize \n$showfont";
+ $showfont = "";
+ print PLN "\\noindent\\llap\{\\tt $vfname:\\ \}\{\\t \\tryit\}\n";
+ print LTX "\\noindent\\llap\{\\tt $vfenc/$ft/$nfssweight{$weight}/";
+ print LTX "$nfsssh\\ \}\{\\fontfamily\{$ft\}\\fontseries\{";
+ print LTX "$nfssweight{$weight}\}%\n \\fontshape\{";
+ print LTX "$nfsssh\}\\selectfont \\tryit\}\n";
+}
+
+## This sub reverses the list of fonts and adds reference to `ase2exp'
+## if expert fonts
+## are present and if the font family is sloppy. See below for further comments.
+@swash_like_fonts=(
+ "w8a",
+ );
+@expert_like_fonts=(
+ "8x", # expert fonts
+ "c8a", # small caps fonts
+ "co8a", # small caps oblique
+ );
+sub flistfix{ # assumes $flist contains a comma-separated font list.
+ local(@myfonts)=split /,/,$flist;
+ local($is_sloppy)=$false;
+ foreach $member (@sloppy_afms) {
+ $is_sloppy=$true if $fam =~/^$member/;
+ }
+ if ($#myfonts) { # let's reverse the list for more than 1 entry
+ @myfonts=reverse @myfonts;
+ }
+ $flist=join ',', @myfonts; $flist = "$flist,";
+ if ($is_sloppy ) { # Now preface any small caps fonts by `ase2exp'
+ # and any swash fonts by `ase2alt'.
+ foreach $type (@expert_like_fonts) {
+ $flist=~s/$type,/$type,ase2exp,/;
+ }
+ foreach $type (@swash_like_fonts) {
+ $flist=~s/$type,/$type,ase2alt,/;
+ }
+ }
+ ## $myfonts[$#myfonts+1]=$myfonts[$#myfonts];
+ ## $myfonts[$#myfonts-1]="ase2exp";
+}
+
+## This subrtn prints a long, messy \installfont line to the
+## makefont.tex file. It breaks it at a `}{' if the line is
+## longer than $linelength characters. It also adds lines to
+## test files, and it adds an entry to maketfm.bat and to
+## putfonts.bat.
+
+$linelength = 76;
+sub INSTline{
+ local($vffont,$flist,$encfile,$enc,$fam,$series,$shape) = @_;
+# $flist contains a list of fonts, regular, exp, alt, etc. It's necessary
+# to reverse the order. That way, sloppy_afm families, like PAD (Adobe Garamond),
+# can have the expert glyph names renamed by calling `ase2exp'. File ase2exp.mtx
+# gets called only if both the font fam is sloppy and expert fonts are present!
+# Swash fonts have already played with the order of $flist, so we leave it alone
+# if swash. (The implicit assumption is that font families with swash alternates
+# won't be sloppy.)
+ &flistfix; # unless $nfsssh eq "sw";
+ local($myline) =
+ " \\installfont\{$vffont\}\{${flist}dotlessj,latinx\}$linesep";
+ $myline .= "\{$encfile\}\{$enc\}\{$fam\}\{$series\}\{$shape\}\{\}\n";
+ if (($shape eq "un") or ($shape eq "ni")) { # add uline if underlining
+ $myline =~ s/latinx/uline,latinx/;
+ }
+ local($l) = length $myline;
+ $myline =~ s/latinx\}/latinx\}\%\n / if $l > $linelength;
+ $myline =~ s/,latinx// if ($shape eq "t") or ($shape eq "ti"); # for titling fonts
+ # or for displays, which have no lowercase letters,
+ # latinx generates errors becasue it refers to lower-
+ # case glyphs
+ print INST $myline;
+ &printtestlines;
+ &makevfandstorefiles;
+}
+
+sub parsefivechars{
+ $fam = substr($fivechars, 0 ,3);
+ local($i) = substr($fivechars, 3, 1);
+ $weight = $wt{$i};
+ $nfsswt = $nfssweight{$weight};
+ $i = substr($fivechars, 4, 1);
+ $shape = $shp[$i];
+ $nfsssh = $nfssshape{$shape};
+}
+
+@fontinstencfiles = ( # maps encoding shape to an etx file
+ "OT1n OT1",
+ "OT1sc OT1c",
+ "OT1sl OT1",
+ "OT1it OT1i",
+ "OT1si OT1c",
+ "OT1ui OT1",
+ "OT1t OT1",
+ "OT1ti OT1",
+ "OT1n9 OT19vf",
+ "OT1sc9 OT1c9vf",
+ "OT1sl9 OT19vf",
+ "OT1it9 OT1i9vf",
+ "OT1si9 OT1c9vf",
+ "OT1ui9 OT19vf",
+ "OT1t9 OT1",
+ "OT1ti9 OT1",
+ "OT1nx OT1",
+ "OT1scx OT1c",
+ "OT1slx OT1",
+ "OT1itx OT1",
+ "OT1six OT1c",
+ "OT1uix OT1",
+ "OT1tx OT1",
+ "OT1tix OT1",
+ "OT1un OT1",
+ "OT1un9 OT19vf",
+ "OT1unx OT1",
+ "OT1ni OT1",
+ "OT1ni9 OT1i9vf",
+ "OT1nix OT1",
+ "T1n T1",
+ "T1sc T1c",
+ "T1sl T1",
+ "T1it T1",
+ "T1si T1c",
+ "T1ui T1",
+ "T1t T1",
+ "T1ti T1",
+ "T1n9 T19vf",
+ "T1sc9 T1c9vf",
+ "T1sl9 T19vf",
+ "T1it9 T19vf",
+ "T1si9 T1c9vf",
+ "T1ui9 T1",
+ "T1t9 T1",
+ "T1ti9 T1",
+ "T1nx T1",
+ "T1scx T1c",
+ "T1slx T1",
+ "T1itx T1",
+ "T1six T1c",
+ "T1uix T1",
+ "T1tx T1",
+ "T1tix T1",
+ "T1un T1",
+ "T1un9 T19vf",
+ "T1unx T1",
+ "T1ni T1",
+ "T1ni9 T19vf",
+ "T1nix T1",
+ );
+
+$lowercaseencoding = $false;
+$lowercaseencoding = $true if $vfenc =~ /t1/;
+sub loadencodingfilenames{
+ foreach $elem (@fontinstencfiles) {
+ $elem =~ tr/A-Z/a-z/ if $lowercaseencoding == $true;
+ ($encodingtype,$filename) = split(/ /, $elem);
+ $encodingfile{$encodingtype} = $filename;
+ }
+}
+&loadencodingfilenames;
+
+ $plainprolog = <<"endplainprolog";
+\%\&plain
+\\nopagenumbers \\newdimen\\fontsize
+\% Change \\fontsize, \\baselineskip for different type sizes.
+\\fontsize = 12pt \\baselineskip = 14pt \n
+\\def\\tryit\{A fine flight Officiously Ruffles My Puff! 12345 ,.;:
+ \\c{C}e Ph{\\oe}nix Va \\`a M\\\"unchen?\\endgraf\}
+\\font\\1=cmr6 \\newcount\\cno
+\\def\\dd{\\setbox0 = \\hbox{\\t\\char\\cno}\\ifdim\\wd0>0pt
+ \\ifdim\\ht0>0pt \\box0\\lower3pt\\hbox{\\1\\the\\cno}\\fi\\fi
+ \\global\\advance\\cno by1\\relax}
+\\def\\showfont{\\centerline{\\vbox{\\halign{&\\dd\#\#\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+&&&&&&&&&&&&&&&\\cr
+}}}\\medskip}
+ \\centerline{A {\\tt plain} \\TeX{} Test File}
+ \\centerline{Prepared by vfinst$ver at $now, on $curday, $curdate.}
+\\medskip\n
+endplainprolog
+$showfont = " \\showfont\n";
+
+ $latexprolog = <<"endlatexprolog";
+\%\&latex\n
+\\documentclass{article}\n
+\\newcommand\{\\tryit\}\{A fine flight Officiously Ruffles My Puff!
+ 12345 ,.;: \\c{C}e Ph{\\oe}nix Va \\`a M\\\"unchen?\\endgraf\}\n
+\\begin{document}
+\\begin{center}
+ A \\LaTeX{} Test File\\\\
+ Prepared by vfinst$ver at $now, on $curday, $curdate.
+\\end{center}
+The text in the left margin separated by slashes yields the NFSS
+combination of encoding, family, series, and shape that
+generated that test line.\n\\vspace{1pc}\n
+endlatexprolog
+
+sub getvfname{ # determine the fontname2.1 name for virtual font
+ local($fshape) = $_[0];
+ local($vfname) = "$fam$weight"; # start with family & weight...
+ local($thisvar) = $fshape; # initialize to normal;
+ $thisvar= "" if $fshape eq "r";
+ $thisvar = "c" if $fshape eq "sc";
+ $thisvar = "ic" if $fshape eq "si";
+ $thisvar = "iw"if $fshape eq "sw"; # swash
+ $thisvar = "n" if $fshape eq "un";
+ $thisvar = "ni" if $fshape eq "ni";
+ $cork = $true; $cork = $false if $vfenc =~ /ot1/i;
+ $encdigit = "7"; $encdigit = "8" if $cork;
+ $encvar = "t";
+ if (defined($expert{$fam})) {
+ $encdigit = "9"; # start figuring expertised encodings...
+ if ($cork) {
+ $encvar = "e";
+ $encvar = "d" if $type eq "9";
+ } else { # for original tex fonts...
+ $encvar = "t";
+ $encvar = "o" if $type eq "9";
+ }
+ }
+ $vfname .= "$thisvar$encdigit$encvar";
+ local($l) = length $vfname;
+ print "Trouble---virtual font $vfname has too long a name!\n"
+ if $l > 8;
+ $vfname;
+}
+
+## Many popular font families contain an italic swash raw font.
+## Such fonts are distinguished by a fontname which contains the
+## sequence `w8'. This sub creates the swash font by taking the
+## list of raw fonts ($regfonts), putting the swash name at the
+## front, and then generating entries into makefont.tex, putfonts.bat,
+## and maketfm.bat.
+
+$swashrawfont = "w8";
+sub createswashfont{
+ local(@fonts) = split(/,/, $regfonts);
+ ## local($swashfont) = pop @fonts; # capture the name of swash font
+ ## unshift(@fonts, $swashfont);
+ local($swfonts) = join(',', @fonts) . ","; # rejoin everything together
+ $vfname = &getvfname("sw");
+ $nfsssh = "sw"; # new NFSS shape of sw
+ local($swfil)="${vfenc}sw"; # name of swash encoding file
+ &INSTline($vfname,$swfonts,$swfil,$vfenc,$ft,$nfsswt,$nfsssh);
+}
+
+sub finishinstfile{
+ print INST "\n\\installfonts\n";
+ # We'll also prepare the test files...
+ open (PLN, ">testpln.tex");
+ open (LTX, ">testltx.tex");
+ print PLN "$plainprolog";
+ print LTX "$latexprolog";
+ foreach $family (@fams) {
+ @famchoices = (""); # default
+ @famchoices = ("9","x") if defined $expert{$family};
+ foreach $type (@famchoices) {
+ print INST "\\installfamily\{$vfenc\}\{$family$type\}\{\}\n";
+ }
+ }
+ print INST "%%\n";
+ &loadweightinfo;
+ &loadshapeinfo;
+ foreach $fivechars (sort keys %fifonts) {
+ $regfonts = $fifonts{$fivechars};
+ $shears = $fishear{$fivechars};
+ $thesearenotdisplayfonts = $true; # Any display fonts?
+ &parsefivechars;
+ $thesearenotdisplayfonts=$false if $shape =~ /d/; # They ARE displays
+ $tfmplace = &findplacefor($fivechars, "tfm");
+ $vfplace = &findplacefor($fivechars, "vf");
+ @famchoices = (""); # default
+ @famchoices = ("9","x") if defined $expert{$fam};
+ # For each entry there are three types of fonts we
+ # construct---the normal shape (which will be upright or
+ # italic in fact), the matching small caps, and the
+ # shear type (which will be slanted or unslanted italic).
+ foreach $type (@famchoices) {
+ $ft = "$fam$type";
+ # First, handle the main shape (upright or italic)...
+ $vfname = &getvfname($shape); # $shape is "r" or "i"
+ $nfsssh = $nfssshape{$shape};
+ $encodingtype = "$vfenc$nfsssh$type";
+ $fil = $encodingfile{$encodingtype};
+ if ($thesearenotdisplayfonts) {
+ &INSTline($vfname,$regfonts,$fil,$vfenc,$ft,$nfsswt,$nfsssh);
+ &createswashfont if $regfonts =~ /$swashrawfont/;
+ # 2nd, generate sheared variant (oblique or upright it)...
+ $shshape = "o"; $shshape = "u" if $shape eq "i";
+ $nfsssh = $nfssshape{$shshape};
+ $encodingtype = "$vfenc$nfsssh$type";
+ $fil = $encodingfile{$encodingtype};
+ $vfname = &getvfname($shshape);
+ &INSTline($vfname,$shears,$fil,$vfenc,$ft,$nfsswt,$nfsssh)
+ unless $obl{"$fam$weight"};
+ # Third , the matching small caps...
+ $scshape = "sc"; $scshape = "si" if $shape eq "i"; # italic
+ $scshape = "si" if $shape eq "o"; # oblique case
+ $nfsssh = $nfssshape{$scshape};
+ $encodingtype = "$vfenc$scshape$type";
+ $fil = $encodingfile{$encodingtype};
+ $vfname = &getvfname($scshape);
+ &INSTline($vfname,$regfonts,$fil,$vfenc,$ft,$nfsswt,$nfsssh);
+ # Next, underline fonts...
+ $nshape = "n"; $nshape = "ni" if $shape eq "i"; # italic
+ $nshape = "ni" if $shape eq "o"; # oblique
+ $nfsssh = $nfssshape{$nshape};
+ $encodingtype = "$vfenc$nshape$type";
+ $fil = $encodingfile{$encodingtype};
+ # encodingtype mirrors that of main upright or italic font
+ $vfname = &getvfname($nshape);
+ &INSTline($vfname,$regfonts,$fil,$vfenc,$ft,$nfsswt,$nfsssh);
+ } else { # a display font...
+ $nfsssh = "t"; # titling (display)
+ $nfsssh = "ti" if $shape eq "di";
+ &INSTline($vfname,$regfonts,$fil,$vfenc,$ft,$nfsswt,$nfsssh);
+ }
+ }
+ print INST "%%\n";
+ }
+ print INST "\\endinstallfonts\n\n\\bye\n"; # finis
+ print PLN "\n\\bye\n";
+ print LTX "\n\\end\{document\}\n";
+ # We also need to place the updated psfonts.map in proper place
+ # and the fd files where they belong. Sadly, we can't simply `move'
+ # as certain unooperative OS's don't permit this if the file
+ # already exists.
+ print PUTFONT "$copy psfonts.map $vfmapdir${sep}psfonts.map\n";
+ print CLEANUP "$rm psfonts.*\n$rm *.vfi\n$rm makefont.tex\n";
+ print PUTVFTF "$mv *.fd $vfinputs\n";
+ print CLEANUP "$rm *.mtx\n$rm *.pl\n$rm *.vpl\n$rm *.log\n$rm *.aux\n";
+ print CLEANUP "$rm *.vlg\n$rm *.lst\n$rm *.bat\n$rm *.dvi\n$rm *.ps\n";
+ ## Now to change executables to `execute' status for Unix systems...
+ if ($sep eq "/") {
+ chmod 0755, "mkdirs.bat" if -e "mkdirs.bat";
+ local($cnt) =
+ chmod 0755, "maketfm.bat", "putfonts.bat",
+ "putvftf.bat", "cleanup.bat", "newnames.bat";
+ print "Couldn't make .bat files executable---check permissions."
+ if $cnt == 0;
+ }
+}
+
+################################################################
+#
+# MAIN ROUTINE.
+#
+################################################################
+
+ $finishtalk = <<"endfinishtalk";
+
+Program `2vfinst' finished. If you're satisfied with the
+way things went, execute the following commands:
+ mkdirs.bat
+ newnames.bat
+ tex makefont
+ maketfm.bat
+ putfonts.bat
+ putvftf.bat
+ [TDS only: run the system `texhash' or other tool to update
+ TDS search path.]
+ cleanup.bat
+(All but the `tex' step take very little time.)
+(To test your fonts: execute `mkdirs.bat', `newnames.bat', `tex makefont',
+`maketfm.bat', and `putfonts.bat'. Execute the final 2 steps only
+when you're sure you like the fonts and are ready to keep
+them with your other fonts.)
+
+NOTE WELL: This message is stored in the Ascii file `finish.vfi'.
+endfinishtalk
+
+sub DoItAgain{
+ &appendlog;
+ if (&isTDS) { # get typeface, supplier info
+ &gettypeinfo; # in %supplier, %typeface
+ }
+ &checkdirs;
+ &processrawfiles;
+ &finishinstfile;
+ print $finishtalk;
+ open (NXT, ">finish.vfi");
+ print NXT $finishtalk;
+ close NXT;
+}
+
+&DoItAgain; ## Yes!!
diff --git a/fonts/utilities/vfinst/ASE2ALT.MTX b/fonts/utilities/vfinst/ASE2ALT.MTX
new file mode 100644
index 0000000000..102cb82879
--- /dev/null
+++ b/fonts/utilities/vfinst/ASE2ALT.MTX
@@ -0,0 +1,75 @@
+\relax
+
+This is file ase2alt.mtx, part of vfinst by Alan Hoenig. Its purpose is to
+noninvasively change the glyph names of the characters in the regular
+and italic alternate fonts that are part of the Adobe Garamond font family.
+These fonts have been named as if they were Adobe Standard Encoded---so, for
+example, characters `ct' and `Aswash' are named (confusingly) `c' and `A'.
+I hope this file will serve as parototype and template in case there are other
+fonts as sloppily prepared as these.
+
+For further info, see vfinst.tex (part of vfinst) and ``TeX Unbound" (Hoenig, Oxford
+Univ Pr, 1998).
+
+---Alan Hoenig, ajhjj@cunyvm.cuny.edu
+ June 9, 1998
+
+\metrics
+
+\setcommand\rename#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}\glyph{#1}{1000}\endsetglyph
+ \unsetglyph{#1}
+ \fi}
+
+\unsetglyph{space}
+\unsetglyph{nbspace}
+
+\rename{ampersand}{ampersandalt}
+\rename{one}{ornament1}
+\rename{two}{ornament2}
+\rename{A}{Aswash} %% Rename these uppercase glyphs in italic alt font
+\rename{B}{Bswash}
+\rename{C}{Cswash}
+\rename{D}{Dswash}
+\rename{E}{Eswash}
+\rename{F}{Fswash}
+\rename{G}{Gswash}
+\rename{H}{Hswash}
+\rename{I}{Iswash}
+\rename{J}{Jswash}
+\rename{K}{Kswash}
+\rename{L}{Lswash}
+\rename{M}{Mswash}
+\rename{N}{Nswash}
+\rename{O}{Oswash}
+\rename{P}{Pswash}
+\rename{Q}{Qswash}
+\rename{R}{Rswash}
+\rename{S}{Sswash}
+\rename{T}{Tswash}
+\rename{U}{Uswash}
+\rename{V}{Vswash}
+\rename{W}{Wswash}
+\rename{X}{Xswash}
+\rename{Y}{Yswash}
+\rename{Z}{Zswash}
+\rename{a}{aswash}
+\rename{c}{ct}
+\rename{e}{eswash}
+\rename{n}{nswash}
+\rename{r}{rswash}
+\rename{s}{st}
+\rename{t}{tswash}
+\rename{v}{vswash}
+\rename{z}{zswash}
+
+%% Handle the limited cases of U.C. letters in case we're reading in the upright (regular)
+%% font.
+
+\ifisglyph{Aswash}\then \else % enter case of upright fonts
+ \rename{Qswash}{Qalt}
+ \rename{Rswash}{Qalt1} % what the heck is thus character?
+ \rename{Tswash}{twashalt}
+\fi
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/ASE2EXP.MTX b/fonts/utilities/vfinst/ASE2EXP.MTX
new file mode 100644
index 0000000000..e9b6f8c202
--- /dev/null
+++ b/fonts/utilities/vfinst/ASE2EXP.MTX
@@ -0,0 +1,187 @@
+\relax
+
+This is file ase2exp.mtx, part of the vfinst package. Its purpose is to rename the glyphs
+in an expert afm file in case they have been sloppily renamed originally, as
+in the Adobe Garamond family. `Sloppy naming' means that the expert glyphs have been
+named aa if they belonged to the ASE (Adobe Standard Encoding). For example, `Asmall'
+would be named `a'.
+
+\metrics
+
+\setcommand\Unsetglyph#1{
+ \ifisglyph{#1}\then
+ \unsetglyph{#1}
+ \fi
+}
+
+\setcommand\rename#1#2{\ifisglyph{#1}\then
+ \setglyph{#2}\glyph{#1}{1000}\endsetglyph
+ \unsetglyph{#1}
+ \fi
+}
+
+\rename{exclam}{exclamsmall} % char 33
+\rename{quotedbl}{Hungarumlautsmall} % char 34
+\rename{dollar}{dollaroldstyle} % char 36
+\rename{percent}{dollarsuperior} % char 37
+\rename{ampersand}{ampersandsmall} % char 38
+\rename{quoteright}{Acutesmall} % char 39
+\rename{parenleft}{parenleftsuperior} % char 40
+\rename{parenright}{parenrightsuperior} % char 41
+\rename{asterisk}{twodotenleader} % char 42
+\rename{plus}{onedotenleader} % char 43
+\rename{slash}{fraction} % char 47
+\rename{zero}{zerooldstyle} % char 48
+\rename{one}{oneoldstyle} % char 49
+\rename{two}{twooldstyle} % char 50
+\rename{three}{threeoldstyle} % char 51
+\rename{four}{fouroldstyle} % char 52
+\rename{five}{fiveoldstyle} % char 53
+\rename{six}{sixoldstyle} % char 54
+\rename{seven}{sevenoldstyle} % char 55
+\rename{eight}{eightoldstyle} % char 56
+\rename{nine}{nineoldstyle} % char 57
+\rename{less}{commasuperior} % char 60
+\rename{equal}{threequartersemdash} % char 61
+\rename{greater}{periodsuperior} % char 62
+\rename{question}{questionsmall} % char 63
+
+%% AFM files can besloppy in many different ways. Almost always the
+%% lowercase glyphs are called things like `a', `b', and so on
+%% instead of `Asmall', `Bsmall', etc. The uppercase letters are more
+%% problematical, since sometimes an uppercasealphabet is included.
+%% Other times, though, the letters `A', `B', and so on really
+%% represent `asuperior', `bsuperior', and so on. We can test for
+%% this by examining the existence of F, for there is no `fsuperior'.
+
+\ifisglyph{F}\then % do nothing
+\else
+ \rename{A}{asuperior} % char 65
+ \rename{B}{bsuperior} % char 66
+ \rename{C}{centsuperior} % char 67
+ \rename{D}{dsuperior} % char 68
+ \rename{E}{esuperior} % char 69
+ \rename{I}{isuperior} % char 73
+ \rename{L}{lsuperior} % char 76
+ \rename{M}{msuperior} % char 77
+ \rename{N}{nsuperior} % char 78
+ \rename{O}{osuperior} % char 79
+ \rename{R}{rsuperior} % char 82
+ \rename{S}{ssuperior} % char 83
+ \rename{T}{tsuperior} % char 84
+ \rename{V}{ff} % char 86
+ \rename{W}{fi} % char 87
+ \rename{X}{fl} % char 88
+ \rename{Y}{ffi} % char 89
+ \rename{Z}{ffl} % char 90
+\fi
+
+\rename{bracketleft}{parenleftinferior} % char 91
+\rename{bracketright}{parenrightinferior} % char 93
+\rename{asciicircum}{Circumflexsmall} % char 94
+\rename{underscore}{hyphensuperior} % char 95
+\rename{quoteleft}{Gravesmall} % char 96
+\rename{a}{Asmall} % char 97
+\rename{b}{Bsmall} % char 98
+\rename{c}{Csmall} % char 99
+\rename{d}{Dsmall} % char 100
+\rename{e}{Esmall} % char 101
+\rename{f}{Fsmall} % char 102
+\rename{g}{Gsmall} % char 103
+\rename{h}{Hsmall} % char 104
+\rename{i}{Ismall} % char 105
+\rename{j}{Jsmall} % char 106
+\rename{k}{Ksmall} % char 107
+\rename{l}{Lsmall} % char 108
+\rename{m}{Msmall} % char 109
+\rename{n}{Nsmall} % char 110
+\rename{o}{Osmall} % char 111
+\rename{p}{Psmall} % char 112
+\rename{q}{Qsmall} % char 113
+\rename{r}{Rsmall} % char 114
+\rename{s}{Ssmall} % char 115
+\rename{t}{Tsmall} % char 116
+\rename{u}{Usmall} % char 117
+\rename{v}{Vsmall} % char 118
+\rename{w}{Wsmall} % char 119
+\rename{x}{Xsmall} % char 120
+\rename{y}{Ysmall} % char 121
+\rename{z}{Zsmall} % char 122
+\rename{braceleft}{colonmonetary} % char 123
+\rename{bar}{onefitted} % char 124
+\rename{braceright}{rupiah} % char 125
+\rename{asciitilde}{Tildesmall} % char 126
+\rename{exclamdown}{exclamdownsmall} % char 161
+\rename{cent}{centoldstyle} % char 162
+\rename{sterling}{Lslashsmall} % char 163
+\rename{florin}{Scaronsmall} % char 166
+\rename{section}{Zcaronsmall} % char 167
+\rename{currency}{Dieresissmall} % char 168
+\rename{quotesingle}{Brevesmall} % char 169
+\rename{quotedblleft}{Caronsmall} % char 170
+\rename{guilsinglleft}{Dotaccentsmall} % char 172
+\rename{guilsinglright}{} % char 173
+\rename{fl}{Macronsmall} % char 175
+\rename{dagger}{figuredash} % char 178
+\rename{daggerdbl}{hypheninferior} % char 179
+\rename{paragraph}{Ogoneksmall} % char 182
+\rename{bullet}{Ringsmall} % char 183
+\rename{quotesinglbase}{Cedillasmall} % char 184
+\rename{ellipsis}{onequarter} % char 188
+\rename{perthousand}{onehalf} % char 189
+\rename{questiondown}{questiondownsmall} % char 191
+\rename{grave}{threeeighths} % char 193
+\rename{acute}{fiveeighths} % char 194
+\rename{circumflex}{seveneighths} % char 195
+\rename{tilde}{onethird} % char 196
+\rename{macron}{twothirds} % char 197
+\rename{dieresis}{zerosuperior} % char 200
+\rename{ring}{twosuperior} % char 202
+\rename{cedilla}{threesuperior} % char 203
+\rename{hungarumlaut}{fivesuperior} % char 205
+\rename{ogonek}{sixsuperior} % char 206
+\rename{caron}{sevensuperior} % char 207
+\rename{emdash}{eightsuperior} % char 208
+\rename{AE}{Aacutesmall} % char 225
+\rename{ordfeminine}{Atildesmall} % char 227
+\rename{Lslash}{Egravesmall} % char 232
+\rename{Oslash}{Eacutesmall} % char 233
+\rename{OE}{Ecircumflexsmall} % char 234
+\rename{ordmasculine}{Edieresissmall} % char 235
+\rename{ae}{Ntildesmall} % char 241
+\rename{dotlessi}{Otildesmall} % char 245
+\rename{lslash}{Oslashsmall} % char 248
+\rename{oslash}{Ugravesmall} % char 249
+\rename{oe}{Uacutesmall} % char 250
+\rename{germandbls}{Ucircumflexsmall} % char 251
+
+\Unsetglyph{space} % char 32
+\Unsetglyph{numbersign} % char 35
+\Unsetglyph{comma} % char 44
+\Unsetglyph{hyphen} % char 45
+\Unsetglyph{period} % char 46
+\Unsetglyph{colon} % char 58
+\Unsetglyph{semicolon} % char 59
+\Unsetglyph{at} % char 64
+\Unsetglyph{F} % char 70
+\Unsetglyph{G} % char 71
+\Unsetglyph{H} % char 72
+\Unsetglyph{J} % char 74
+\Unsetglyph{K} % char 75
+\Unsetglyph{P} % char 80
+\Unsetglyph{Q} % char 81
+\Unsetglyph{U} % char 85
+\Unsetglyph{backslash} % char 92
+\Unsetglyph{fraction} % char 164
+\Unsetglyph{yen} % char 165
+\Unsetglyph{guillemotleft} % char 171
+\Unsetglyph{fi} % char 174
+\Unsetglyph{endash} % char 177
+\Unsetglyph{periodcentered} % char 180
+\Unsetglyph{quotedblbase} % char 185
+\Unsetglyph{quotedblright} % char 186
+\Unsetglyph{guillemotright} % char 187
+\Unsetglyph{breve} % char 198
+\Unsetglyph{dotaccent} % char 199
+
+\endmetrics \ No newline at end of file
diff --git a/fonts/utilities/vfinst/DOA2E b/fonts/utilities/vfinst/DOA2E
new file mode 100644
index 0000000000..0f8a32e7a0
--- /dev/null
+++ b/fonts/utilities/vfinst/DOA2E
@@ -0,0 +1,354 @@
+### Now to load glyph number vs proper glyph names for expert fonts.
+
+@glyphexptable=(
+ "32 space",
+ "33 exclamsmall",
+ "34 Hungarumlautsmall",
+ "36 dollaroldstyle",
+ "37 dollarsuperior",
+ "38 ampersandsmall",
+ "39 Acutesmall",
+ "40 parenleftsuperior",
+ "41 parenrightsuperior",
+ "42 twodotenleader",
+ "43 onedotenleader",
+ "44 comma",
+ "45 hyphen",
+ "46 period",
+ "47 fraction",
+ "48 zerooldstyle",
+ "49 oneoldstyle",
+ "50 twooldstyle",
+ "51 threeoldstyle",
+ "52 fouroldstyle",
+ "53 fiveoldstyle",
+ "54 sixoldstyle",
+ "55 sevenoldstyle",
+ "56 eightoldstyle",
+ "57 nineoldstyle",
+ "58 colon",
+ "59 semicolon",
+ "60 commasuperior",
+ "61 threequartersemdash",
+ "62 periodsuperior",
+ "63 questionsmall",
+ "65 asuperior",
+ "66 bsuperior",
+ "67 centsuperior",
+ "68 dsuperior",
+ "69 esuperior",
+ "73 isuperior",
+ "76 lsuperior",
+ "77 msuperior",
+ "78 nsuperior",
+ "79 osuperior",
+ "82 rsuperior",
+ "83 ssuperior",
+ "84 tsuperior",
+ "86 ff",
+ "87 fi",
+ "88 fl",
+ "89 ffi",
+ "90 ffl",
+ "91 parenleftinferior",
+ "93 parenrightinferior",
+ "94 Circumflexsmall",
+ "95 hyphensuperior",
+ "96 Gravesmall",
+ "97 Asmall",
+ "98 Bsmall",
+ "99 Csmall",
+ "100 Dsmall",
+ "101 Esmall",
+ "102 Fsmall",
+ "103 Gsmall",
+ "104 Hsmall",
+ "105 Ismall",
+ "106 Jsmall",
+ "107 Ksmall",
+ "108 Lsmall",
+ "109 Msmall",
+ "110 Nsmall",
+ "111 Osmall",
+ "112 Psmall",
+ "113 Qsmall",
+ "114 Rsmall",
+ "115 Ssmall",
+ "116 Tsmall",
+ "117 Usmall",
+ "118 Vsmall",
+ "119 Wsmall",
+ "120 Xsmall",
+ "121 Ysmall",
+ "122 Zsmall",
+ "123 colonmonetary",
+ "124 onefitted",
+ "125 rupiah",
+ "126 Tildesmall",
+ "161 exclamdownsmall",
+ "162 centoldstyle",
+ "163 Lslashsmall",
+ "166 Scaronsmall",
+ "167 Zcaronsmall",
+ "168 Dieresissmall",
+ "169 Brevesmall",
+ "170 Caronsmall",
+ "172 Dotaccentsmall",
+ "175 Macronsmall",
+ "178 figuredash",
+ "179 hypheninferior",
+ "182 Ogoneksmall",
+ "183 Ringsmall",
+ "184 Cedillasmall",
+ "188 onequarter",
+ "189 onehalf",
+ "190 threequarters",
+ "191 questiondownsmall",
+ "192 oneeighth",
+ "193 threeeighths",
+ "194 fiveeighths",
+ "195 seveneighths",
+ "196 onethird",
+ "197 twothirds",
+ "200 zerosuperior",
+ "201 onesuperior",
+ "202 twosuperior",
+ "203 threesuperior",
+ "204 foursuperior",
+ "205 fivesuperior",
+ "206 sixsuperior",
+ "207 sevensuperior",
+ "208 eightsuperior",
+ "209 ninesuperior",
+ "210 zeroinferior",
+ "211 oneinferior",
+ "212 twoinferior",
+ "213 threeinferior",
+ "214 fourinferior",
+ "215 fiveinferior",
+ "216 sixinferior",
+ "217 seveninferior",
+ "218 eightinferior",
+ "219 nineinferior",
+ "220 centinferior",
+ "221 dollarinferior",
+ "222 periodinferior",
+ "223 commainferior",
+ "224 Agravesmall",
+ "225 Aacutesmall",
+ "226 Acircumflexsmall",
+ "227 Atildesmall",
+ "228 Adieresissmall",
+ "229 Aringsmall",
+ "230 AEsmall",
+ "231 Ccedillasmall",
+ "232 Egravesmall",
+ "233 Eacutesmall",
+ "234 Ecircumflexsmall",
+ "235 Edieresissmall",
+ "236 Igravesmall",
+ "237 Iacutesmall",
+ "238 Icircumflexsmall",
+ "239 Idieresissmall",
+ "240 Ethsmall",
+ "241 Ntildesmall",
+ "242 Ogravesmall",
+ "243 Oacutesmall",
+ "244 Ocircumflexsmall",
+ "245 Otildesmall",
+ "246 Odieresissmall",
+ "247 OEsmall",
+ "248 Oslashsmall",
+ "249 Ugravesmall",
+ "250 Uacutesmall",
+ "251 Ucircumflexsmall",
+ "252 Udieresissmall",
+ "253 Yacutesmall",
+ "254 Thornsmall",
+ "255 Ydieresissmall",
+ );
+sub loadglyphexpnames{
+ foreach $pair (@glyphexptable) {
+ local($glyphnumber, $properglyphname)=split(/ /, $pair, 2);
+ $expglyphname[$glyphnumber]=$properglyphname;
+ }
+}
+
+&loadglyphexpnames; # let 'er rip...
+
+@glyphasetable=( # This is the table of glyphs in the Adobe Stand'd Encoding (ASE)
+ "32 space",
+ "33 exclam",
+ "34 quotedbl",
+ "35 numbersign",
+ "36 dollar",
+ "37 percent",
+ "38 ampersand",
+ "39 quoteright",
+ "40 parenleft",
+ "41 parenright",
+ "42 asterisk",
+ "43 plus",
+ "44 comma",
+ "45 hyphen",
+ "46 period",
+ "47 slash",
+ "48 zero",
+ "49 one",
+ "50 two",
+ "51 three",
+ "52 four",
+ "53 five",
+ "54 six",
+ "55 seven",
+ "56 eight",
+ "57 nine",
+ "58 colon",
+ "59 semicolon",
+ "60 less",
+ "61 equal",
+ "62 greater",
+ "63 question",
+ "64 at",
+ "65 A",
+ "66 B",
+ "67 C",
+ "68 D",
+ "69 E",
+ "70 F",
+ "71 G",
+ "72 H",
+ "73 I",
+ "74 J",
+ "75 K",
+ "76 L",
+ "77 M",
+ "78 N",
+ "79 O",
+ "80 P",
+ "81 Q",
+ "82 R",
+ "83 S",
+ "84 T",
+ "85 U",
+ "86 V",
+ "87 W",
+ "88 X",
+ "89 Y",
+ "90 Z",
+ "91 bracketleft",
+ "92 backslash",
+ "93 bracketright",
+ "94 asciicircum",
+ "95 underscore",
+ "96 quoteleft",
+ "97 a",
+ "98 b",
+ "99 c",
+ "100 d",
+ "101 e",
+ "102 f",
+ "103 g",
+ "104 h",
+ "105 i",
+ "106 j",
+ "107 k",
+ "108 l",
+ "109 m",
+ "110 n",
+ "111 o",
+ "112 p",
+ "113 q",
+ "114 r",
+ "115 s",
+ "116 t",
+ "117 u",
+ "118 v",
+ "119 w",
+ "120 x",
+ "121 y",
+ "122 z",
+ "123 braceleft",
+ "124 bar",
+ "125 braceright",
+ "126 asciitilde",
+ "161 exclamdown",
+ "162 cent",
+ "163 sterling",
+ "164 fraction",
+ "165 yen",
+ "166 florin",
+ "167 section ",
+ "168 currency",
+ "169 quotesingle",
+ "170 quotedblleft",
+ "171 guillemotleft",
+ "172 guilsinglleft",
+ "173 guilsinglright",
+ "174 fi",
+ "175 fl",
+ "177 endash",
+ "178 dagger",
+ "179 daggerdbl",
+ "180 periodcentered",
+ "182 paragraph",
+ "183 bullet",
+ "184 quotesinglbase",
+ "185 quotedblbase",
+ "186 quotedblright",
+ "187 guillemotright",
+ "188 ellipsis",
+ "189 perthousand",
+ "191 questiondown",
+ "193 grave",
+ "194 acute",
+ "195 circumflex",
+ "196 tilde",
+ "197 macron",
+ "198 breve",
+ "199 dotaccent",
+ "200 dieresis",
+ "202 ring",
+ "203 cedilla",
+ "205 hungarumlaut",
+ "206 ogonek",
+ "207 caron",
+ "208 emdash",
+ "225 AE",
+ "227 ordfeminine",
+ "232 Lslash",
+ "233 Oslash",
+ "234 OE",
+ "235 ordmasculine",
+ "241 ae",
+ "245 dotlessi",
+ "248 lslash",
+ "249 oslash",
+ "250 oe",
+ "251 germandbls",
+ );
+
+sub loadglyphasenames{
+ foreach $pair (@glyphasetable) {
+ local($glyphnumber, $ASEglyphname)=split(/ /, $pair, 2);
+ $aseglyphname[$glyphnumber]=$ASEglyphname;
+ }
+}
+
+&loadglyphasenames;
+
+## The two arrays are @aseglyphname and @expglyphname.
+
+open (OUT, ">ase2exp.mtx");
+
+foreach $i (32..251) {
+ if ($aseglyphname[$i] eq $expglyphname[$i]) {
+ push @unsets, "\\unsetglyph\{$aseglyphname[$i]\} \% char $i\n";
+ } else {
+ push @renames, "\\rename\{$aseglyphname[$i]\}\{$expglyphname[$i]\} \% char $i\n";
+ }
+}
+print OUT "\\relax\n\n\\metrics\n\n";
+print OUT @renames;
+print OUT "\n";
+print OUT "@unsets\n\\endmetrics";
diff --git a/fonts/utilities/vfinst/INSTALL b/fonts/utilities/vfinst/INSTALL
new file mode 100644
index 0000000000..c1b1c92b7c
--- /dev/null
+++ b/fonts/utilities/vfinst/INSTALL
@@ -0,0 +1,36 @@
+Instructions for installing and using vfinst: (August 1998)
+===========================================================
+
+Make sure your version of TeX understands virtual fonts. Also, make
+sure TeX knows how to read input files from both the current and
+parent directories.
+
+In addtion to TeX, you'll also need Perl (widely available) and the
+file fontinst.sty (available from CTAN).
+
+1. Make a vfinst directory. Place all the vfinst files into
+this directory.
+
+2. CAREFULLY adjust the parameters in the file vfinst.par to apply to
+your system.
+
+3. Make a work directory within this directory. DO ALL YOUR WORK
+WITHIN THIS WORK DIRECTORY.
+
+4. Place all the afm + pfb files for the fonts you want to install
+into the work directory.
+
+5. Execute the command `perl ../1vfinst' from within the work
+directory.
+
+6. Execute the command `perl ../2vfinst' from within the work
+directory.
+
+7. Follow the directions which appear on your console.
+
+These directions are amplified in the file `vfinst.tex', an ordinary
+LaTeX file which is part of vfinst.
+
+---Alan Hoenig (author)
+ ajhjj@cunyvm.cuny.edu
+
diff --git a/fonts/utilities/vfinst/OT19vf.etx b/fonts/utilities/vfinst/OT19vf.etx
new file mode 100644
index 0000000000..f14e498916
--- /dev/null
+++ b/fonts/utilities/vfinst/OT19vf.etx
@@ -0,0 +1,27 @@
+\relax
+
+This file is a modified version of OT19.etx, partof the fontinst package.
+
+\encoding
+
+% We define the parameters for OT1.etx to produce a font with old
+% style digits.
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+%% Since oldstyle numerals are unfakable, let's make sure they
+%% exist before we define them as such...
+\ifisglyph{zerooldstyle}\then % good---they exist!
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1} % bad---regular digits are beter than nothing.
+\fi
+\setcommand\currency{dollar}
+
+% Then we call OT1.etx.
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/OT1c9vf.etx b/fonts/utilities/vfinst/OT1c9vf.etx
new file mode 100644
index 0000000000..abef5bf315
--- /dev/null
+++ b/fonts/utilities/vfinst/OT1c9vf.etx
@@ -0,0 +1,55 @@
+\relax
+
+Thisis a small variation of the file OT1c9.etx, part of fontinst.
+
+\encoding
+
+% We define the parameters for OT1.etx to produce a c&sc font with old
+% style digits.
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1}
+%% Since oldstyle numerals are unfakable, let's make sure they
+%% exist before we define them as such...
+\ifisglyph{zerooldstyle}\then % good---they exist!
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1} % bad---regular digits are beter than nothing.
+\fi
+\setcommand\currency{dollar}
+
+% The default letter spacing is 1/10 of the design size, with small
+% caps 80% the size of large caps.
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monoweight}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{0}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\else
+ \setint{letterspacing}{\int{smallcapsspacing}}
+\fi
+
+% Then we call OT1.etx.
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/OT1i9vf.etx b/fonts/utilities/vfinst/OT1i9vf.etx
new file mode 100644
index 0000000000..4fe55185a9
--- /dev/null
+++ b/fonts/utilities/vfinst/OT1i9vf.etx
@@ -0,0 +1,26 @@
+\relax
+
+\encoding
+
+% We define the parameters for OT1.etx to produce an italic font with old
+% style digits.
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+%% Since oldstyle numerals are unfakable, let's make sure they
+%% exist before we define them as such...
+\ifisglyph{zerooldstyle}\then % good---they exist!
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1} % bad---regular digits are better than nothing.
+\fi
+\setcommand\tty{n}
+\setcommand\currency{sterling}
+
+% Then we call OT1.etx.
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/OT1pacl.etx b/fonts/utilities/vfinst/OT1pacl.etx
new file mode 100644
index 0000000000..d74400810c
--- /dev/null
+++ b/fonts/utilities/vfinst/OT1pacl.etx
@@ -0,0 +1,789 @@
+\relax
+
+This is file OT1pacl.etx, a (slightly) modified version of
+OT1.etx (a fontinst file by Alan Jeffrey) to handle alternate
+fonts in the Adobe Garamond (pad) font family. It should be used as an
+inspiration in other font families where alternate fonts occur.
+
+With the modifications, it is part of the Vfinst package by
+Alan Hoenig. Date: July 3, 1998.
+
+For additional info, see the vfinst documentation vfinst.tex and ``TeX
+Unbound'' (Alan Hoenig, Oxford Univ Press, 1998).
+
+You'll wnat toadd lines like:
+
+ \installfont{pacrl9o}{pacr7a,pacr8x,pacr8r,dotlessj,latinx}%
+ {OT1pacl}{OT1}{pac9}{m}{l}{}
+
+ \installfont{pacril9o}{pacri7a,pacri8x,pacri8r,dotlessj,latinx}%
+ {OT1pacl}{OT1}{pac9}{m}{li}{}
+
+in your makefont.tex file. At the end, you'll have to run the vpl
+files through vptovf by hand.
+
+\encoding
+\ifisglyph{Aswash}\then
+ \setcommand\uc#1#2{#1swash}
+\else
+ \setcommand\uc#1#2{#1}
+\fi
+\ifisglyph{ampersandalt}\then
+ \setcommand\alternatechar#1{#1alt}
+\else
+ \setcommand\alternatechar#1{#1}
+\fi
+\setcommand\Ligature#1#2#3{
+ \ifisglyph{#3}\then\ligature{#1}{#2}{#3}\fi
+}
+\setcommand\atendofword#1{\Ligature{LIG}{boundarychar}{#1}}
+\setcommand\atstartofword#1#2{\Ligature{LIG}{#1}{#2}}
+
+\needsfontinstversion{1.327}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle} % oldstyle digits more compatible with alternate chars
+\ifisint{monowidth}\then
+ \setcommand\tty{y}
+\else
+ \setcommand\tty{n}
+\fi
+\setcommand\currency{dollar}
+
+\if \tty y
+ \setstr{codingscheme}{TEX TYPEWRITER TEXT}
+\else
+ \setstr{codingscheme}{TEX TEXT}
+\fi
+
+\setint{italicslant}{0}
+
+\setint{xheight}{
+ \ifisglyph{x}\then
+ \height{x}
+ \else
+ 0
+ \fi
+}
+
+\setint{interword}{
+ \ifisglyph{space}\then
+ \width{space}
+ \else
+ 0
+ \fi
+}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\fi
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `{\tt\char`\'}', for use
+ with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `{\tt\char`\ }'.}
+\endsetslot
+
+\else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `{\tt\char`\"}', included for
+ use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\else
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{\currency}
+ \comment{Either the dollar sign `\$' or the pound sign `\pounds',
+ depending on the font.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+ \Ligature{LIG}{quoteleft}{ampersandalt}
+\endsetslot
+
+\setslot{quoteright}
+ \if \tty y \else \ligature{LIG}{quoteright}{quotedblright} \fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \if \tty y \else \ligature{LIG}{hyphen}{rangedash} \fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\if \tty y
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\else
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{underscore}
+ \comment{The ASCII underline character `{\tt\char`\_}', usually set on
+ the baseline.}
+\endsetslot
+
+\else
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\fi
+
+\setslot{quoteleft}
+ \if \tty y \else \ligature{LIG}{quoteleft}{quotedblleft} \fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+ \atendofword{aswash}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \Ligature{LIG}{t}{ct}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+ \atendofword{eswash}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+\if \tty y \else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+\fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+ \atendofword{nswash}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+ \atendofword{rswash}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \Ligature{LIG}{t}{st}
+ \Ligature{LIG}{s}{longdbls}
+ \Ligature{LIG}{h}{longsh}
+ \Ligature{LIG}{i}{longsi}
+ \Ligature{LIG}{l}{longsl}
+ \Ligature{LIG}{quoteleft}{longs}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+ \atendofword{tswash}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+ \atendofword{zswash}
+\endsetslot
+
+\if \tty y
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is
+ included for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\else
+
+\setslot{rangedash}
+ \if \tty y \else \ligature{LIG}{hyphen}{punctdash} \fi
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `{\tt 1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `{\tt Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+%% Slots for alternate characters...
+
+\setslot{longdbls}\endsetslot
+\setslot{st}
+ \Ligature{LIG}{quoteleft}{longst}
+\endsetslot
+\setslot{ct}\endsetslot
+\setslot{longsh}\endsetslot
+\setslot{longsi}\endsetslot
+\setslot{longsl}\endsetslot
+\setslot{longs}\endsetslot
+\setslot{longst}\endsetslot
+\setslot{boundarychar}\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/vfinst/OT1padl.etx b/fonts/utilities/vfinst/OT1padl.etx
new file mode 100644
index 0000000000..99834af34b
--- /dev/null
+++ b/fonts/utilities/vfinst/OT1padl.etx
@@ -0,0 +1,780 @@
+\relax
+
+This is file OT1padl.etx, a (slightly) modified version of
+OT1.etx (a fontinst file by Alan Jeffrey) to handle alternate
+fonts in the Adobe Garamond (pad) font family. It should be used as an
+inspriation in other font families where alternate fonts occur.
+
+With the modifications, it is part of the Vfinst package by
+Alan Hoenig. Date: June9, 1998.
+
+For additional info, see the vfinst documentation vfinst.tex and ``TeX
+Unbound'' (Alan Hoenig, Oxford Univ Press, 1998).
+
+\encoding
+\ifisglyph{Aswash}\then
+ \setcommand\uc#1#2{#1swash}
+\else
+ \setcommand\uc#1#2{#1}
+\fi
+\ifisglyph{ampersandalt}\then
+ \setcommand\alternatechar#1{#1alt}
+\else
+ \setcommand\alternatechar#1{#1}
+\fi
+\setcommand\Ligature#1#2#3{
+ \ifisglyph{#3}\then\ligature{#1}{#2}{#3}\fi
+}
+\setcommand\atendofword#1{\Ligature{LIG}{boundarychar}{#1}}
+\setcommand\atstartofword#1#2{\Ligature{LIG}{#1}{#2}}
+
+\needsfontinstversion{1.327}
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\setcommand\digit#1{#1oldstyle} % oldstyle digits more compatible with alternate chars
+\ifisint{monowidth}\then
+ \setcommand\tty{y}
+\else
+ \setcommand\tty{n}
+\fi
+\setcommand\currency{dollar}
+
+\if \tty y
+ \setstr{codingscheme}{TEX TYPEWRITER TEXT}
+\else
+ \setstr{codingscheme}{TEX TEXT}
+\fi
+
+\setint{italicslant}{0}
+
+\setint{xheight}{
+ \ifisglyph{x}\then
+ \height{x}
+ \else
+ 0
+ \fi
+}
+
+\setint{interword}{
+ \ifisglyph{space}\then
+ \width{space}
+ \else
+ 0
+ \fi
+}
+
+\setint{fontdimen(1)}{\int{italicslant}} % italic slant
+\setint{fontdimen(2)}{\int{interword}} % interword space
+\ifisint{monowidth}\then
+ \setint{fontdimen(3)}{0} % interword stretch
+ \setint{fontdimen(4)}{0} % interword shrink
+\else
+ \setint{fontdimen(3)}{\scale{\int{interword}}{600}}% interword stretch
+ \setint{fontdimen(4)}{\scale{\int{interword}}{240}}% interword shrink
+\fi
+\setint{fontdimen(5)}{\int{xheight}} % x-height
+\setint{fontdimen(6)}{1000} % quad
+\ifisint{monowidth}\then
+ \setint{fontdimen(7)}{\int{interword}} % extra space after .
+\else
+ \setint{fontdimen(7)}{\scale{\int{interword}}{240}}% extra space after .
+\fi
+
+\setslot{Gamma}
+ \comment{The greek letter `$\Gamma$'.}
+\endsetslot
+
+\setslot{Delta}
+ \comment{The greek letter `$\Delta$'.}
+\endsetslot
+
+\setslot{Theta}
+ \comment{The greek letter `$\Theta$'.}
+\endsetslot
+
+\setslot{Lambda}
+ \comment{The greek letter `$\Lambda$'.}
+\endsetslot
+
+\setslot{Xi}
+ \comment{The greek letter `$\Xi$'.}
+\endsetslot
+
+\setslot{Pi}
+ \comment{The greek letter `$\Pi$'.}
+\endsetslot
+
+\setslot{Sigma}
+ \comment{The greek letter `$\Sigma$'.}
+\endsetslot
+
+\setslot{Upsilon1}
+ \comment{The greek letter `$\Upsilon$'.}
+\endsetslot
+
+\setslot{Phi}
+ \comment{The greek letter `$\Phi$'.}
+\endsetslot
+
+\setslot{Psi}
+ \comment{The greek letter `$\Psi$'.}
+\endsetslot
+
+\setslot{Omega}
+ \comment{The greek letter `$\Omega$'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{arrowup}
+ \comment{An upwards-facing arrow `$\uparrow$'.}
+\endsetslot
+
+\setslot{arrowdown}
+ \comment{A downwards-facing arrow `$\downarrow$'.}
+\endsetslot
+
+\setslot{quotesingle}
+ \comment{The `neutral' single quotation mark `{\tt\char`\'}', for use
+ with monowidth fonts.}
+\endsetslot
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\else
+
+\setslot{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FFI}{ffi}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FFL}{ffl}}
+ \comment{The `ff' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FI}{fi}}
+ \comment{The `fi' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FL}{fl}}
+ \comment{The `fl' ligature. It should be two characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFI}{ffi}}
+ \comment{The `ffi' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\setslot{\lclig{FFL}{ffl}}
+ \comment{The `ffl' ligature. It should be three characters wide in a
+ monowidth font.}
+\endsetslot
+
+\fi
+
+\setslot{\lc{dotlessI}{dotlessi}}
+ \comment{A dotless i `\i', used to produce accented letters such as
+ `\=\i'.}
+\endsetslot
+
+\setslot{\lc{dotlessJ}{dotlessj}}
+ \comment{A dotless j `\j', used to produce accented letters such as
+ `\=\j'. Most non-\TeX\ fonts do not have this glyph.}
+\endsetslot
+
+\setslot{grave}
+ \comment{The grave accent `\`a'.}
+\endsetslot
+
+\setslot{acute}
+ \comment{The acute accent `\'a'.}
+\endsetslot
+
+\setslot{caron}
+ \comment{The caron or h\'a\v cek accent `\v a'.}
+\endsetslot
+
+\setslot{breve}
+ \comment{The breve accent `\u a'.}
+\endsetslot
+
+\setslot{macron}
+ \comment{The macron accent `\=a'.}
+\endsetslot
+
+\setslot{ringfitted}
+ \comment{The ring accent `\aa', fitted to be the same width as an
+ upper case `A'.}
+\endsetslot
+
+\setslot{cedilla}
+ \comment{The cedilla accent `\c a'.}
+\endsetslot
+
+\setslot{\lc{SS}{germandbls}}
+ \comment{The letter `\ss'.}
+\endsetslot
+
+\setslot{\lc{AE}{ae}}
+ \comment{The letter `\ae'. This is a single letter, and should not be
+ faked with `ae'.}
+\endsetslot
+
+\setslot{\lc{OE}{oe}}
+ \comment{The letter `\oe'. This is a single letter, and should not be
+ faked with `oe'.}
+\endsetslot
+
+\setslot{\lc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\setslot{\uc{AE}{ae}}
+ \comment{The letter `\AE'. This is a single letter, and should not be
+ faked with `AE'.}
+\endsetslot
+
+\setslot{\uc{OE}{oe}}
+ \comment{The letter `\OE'. This is a single letter, and should not be
+ faked with `OE'.}
+\endsetslot
+
+\setslot{\uc{Oslash}{oslash}}
+ \comment{The letter `\o'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{visiblespace}
+ \comment{A visible space glyph `{\tt\char`\ }'.}
+\endsetslot
+
+\else
+
+\setslot{lslashslash}
+ \ligature{LIG}{\lc{L}{l}}{\lc{Lslash}{lslash}}
+ \ligature{LIG}{\uc{L}{l}}{\uc{Lslash}{lslash}}
+ \comment{The slash used to make `\l' and `\L'. Since most fonts do
+ not have a separate glyph for this, I've added ligatures to `\l'
+ and `\L'.}
+\endsetslot
+
+\fi
+
+\setslot{exclam}
+ \ligature{LIG}{quoteleft}{exclamdown}
+ \comment{The exclamation mark `!'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{quotedbl}
+ \comment{The `neutral' quotation mark `{\tt\char`\"}', included for
+ use in monowidth fonts, or for setting computer programs.}
+\endsetslot
+
+\else
+
+\setslot{quotedblright}
+ \comment{An English double closing quote mark `\,''\,'.}
+\endsetslot
+
+\fi
+
+\setslot{numbersign}
+ \comment{The hash sign `\#'.}
+\endsetslot
+
+\setslot{\currency}
+ \comment{Either the dollar sign `\$' or the pound sign `\pounds',
+ depending on the font.}
+\endsetslot
+
+\setslot{percent}
+ \comment{The percent sign `\%'.}
+\endsetslot
+
+\setslot{ampersand}
+ \comment{The ampersand sign `\&'.}
+ \Ligature{LIG}{quoteleft}{ampersandalt}
+\endsetslot
+
+\setslot{quoteright}
+ \if \tty y \else \ligature{LIG}{quoteright}{quotedblright} \fi
+ \comment{The English closing quotation mark `\,'\,'.}
+\endsetslot
+
+\setslot{parenleft}
+ \comment{The opening parenthesis `('.}
+\endsetslot
+
+\setslot{parenright}
+ \comment{The closing parenthesis `)'.}
+\endsetslot
+
+\setslot{asterisk}
+ \comment{The raised asterisk `*'.}
+\endsetslot
+
+\setslot{plus}
+ \comment{The addition sign `+'.}
+\endsetslot
+
+\setslot{comma}
+ \comment{The comma `,'.}
+\endsetslot
+
+\setslot{hyphen}
+ \if \tty y \else \ligature{LIG}{hyphen}{rangedash} \fi
+ \comment{The hyphen `-'.}
+\endsetslot
+
+\setslot{period}
+ \comment{The full point `.'.}
+\endsetslot
+
+\setslot{slash}
+ \comment{The forward oblique `/'.}
+\endsetslot
+
+\setslot{\digit{zero}}
+ \comment{The number zero `0'. This (and all the other numerals) may be
+ old style or ranging digits.}
+\endsetslot
+
+\setslot{\digit{one}}
+ \comment{The number one `1'.}
+ \Ligature{LIG}{quoteleft}{ornament1}
+\endsetslot
+
+\setslot{\digit{two}}
+ \comment{The number two `2'.}
+ \Ligature{LIG}{quoteleft}{ornament2}
+\endsetslot
+
+\setslot{\digit{three}}
+ \comment{The number three `3'.}
+\endsetslot
+
+\setslot{\digit{four}}
+ \comment{The number four `4'.}
+\endsetslot
+
+\setslot{\digit{five}}
+ \comment{The number five `5'.}
+\endsetslot
+
+\setslot{\digit{six}}
+ \comment{The number six `6'.}
+\endsetslot
+
+\setslot{\digit{seven}}
+ \comment{The number seven `7'.}
+\endsetslot
+
+\setslot{\digit{eight}}
+ \comment{The number eight `8'.}
+\endsetslot
+
+\setslot{\digit{nine}}
+ \comment{The number nine `9'.}
+\endsetslot
+
+\setslot{colon}
+ \comment{The colon punctuation mark `:'.}
+\endsetslot
+
+\setslot{semicolon}
+ \comment{The semi-colon punctuation mark `;'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{less}
+ \comment{The less-than sign `$<$'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{greater}
+ \comment{The greater-than sign `$>$'.}
+\endsetslot
+
+\else
+
+\setslot{exclamdown}
+ \comment{The Spanish punctuation mark `!`'.}
+\endsetslot
+
+\setslot{equal}
+ \comment{The equals sign `='.}
+\endsetslot
+
+\setslot{questiondown}
+ \comment{The Spanish punctuation mark `?`'.}
+\endsetslot
+
+\fi
+
+\setslot{question}
+ \ligature{LIG}{quoteleft}{questiondown}
+ \comment{The question mark `?'.}
+\endsetslot
+
+\setslot{at}
+ \comment{The at sign `@'.}
+\endsetslot
+
+\setslot{\uc{A}{a}}
+ \comment{The letter `{A}'.}
+\endsetslot
+
+\setslot{\uc{B}{b}}
+ \comment{The letter `{B}'.}
+\endsetslot
+
+\setslot{\uc{C}{c}}
+ \comment{The letter `{C}'.}
+\endsetslot
+
+\setslot{\uc{D}{d}}
+ \comment{The letter `{D}'.}
+\endsetslot
+
+\setslot{\uc{E}{e}}
+ \comment{The letter `{E}'.}
+\endsetslot
+
+\setslot{\uc{F}{f}}
+ \comment{The letter `{F}'.}
+\endsetslot
+
+\setslot{\uc{G}{g}}
+ \comment{The letter `{G}'.}
+\endsetslot
+
+\setslot{\uc{H}{h}}
+ \comment{The letter `{H}'.}
+\endsetslot
+
+\setslot{\uc{I}{i}}
+ \comment{The letter `{I}'.}
+\endsetslot
+
+\setslot{\uc{J}{j}}
+ \comment{The letter `{J}'.}
+\endsetslot
+
+\setslot{\uc{K}{k}}
+ \comment{The letter `{K}'.}
+\endsetslot
+
+\setslot{\uc{L}{l}}
+ \comment{The letter `{L}'.}
+\endsetslot
+
+\setslot{\uc{M}{m}}
+ \comment{The letter `{M}'.}
+\endsetslot
+
+\setslot{\uc{N}{n}}
+ \comment{The letter `{N}'.}
+\endsetslot
+
+\setslot{\uc{O}{o}}
+ \comment{The letter `{O}'.}
+\endsetslot
+
+\setslot{\uc{P}{p}}
+ \comment{The letter `{P}'.}
+\endsetslot
+
+\setslot{\uc{Q}{q}}
+ \comment{The letter `{Q}'.}
+\endsetslot
+
+\setslot{\uc{R}{r}}
+ \comment{The letter `{R}'.}
+\endsetslot
+
+\setslot{\uc{S}{s}}
+ \comment{The letter `{S}'.}
+\endsetslot
+
+\setslot{\uc{T}{t}}
+ \comment{The letter `{T}'.}
+\endsetslot
+
+\setslot{\uc{U}{u}}
+ \comment{The letter `{U}'.}
+\endsetslot
+
+\setslot{\uc{V}{v}}
+ \comment{The letter `{V}'.}
+\endsetslot
+
+\setslot{\uc{W}{w}}
+ \comment{The letter `{W}'.}
+\endsetslot
+
+\setslot{\uc{X}{x}}
+ \comment{The letter `{X}'.}
+\endsetslot
+
+\setslot{\uc{Y}{y}}
+ \comment{The letter `{Y}'.}
+\endsetslot
+
+\setslot{\uc{Z}{z}}
+ \comment{The letter `{Z}'.}
+\endsetslot
+
+\setslot{bracketleft}
+ \comment{The opening square bracket `['.}
+\endsetslot
+
+\if \tty y
+
+\setslot{backslash}
+ \comment{The backwards oblique `$\backslash$'.}
+\endsetslot
+
+\else
+
+\setslot{quotedblleft}
+ \comment{An English double opening quote mark `\,``\,'.}
+\endsetslot
+
+\fi
+
+\setslot{bracketright}
+ \comment{The closing square bracket `]'.}
+\endsetslot
+
+\setslot{circumflex}
+ \comment{The circumflex accent `\^ a'.}
+\endsetslot
+
+\if \tty y
+
+\setslot{underscore}
+ \comment{The ASCII underline character `{\tt\char`\_}', usually set on
+ the baseline.}
+\endsetslot
+
+\else
+
+\setslot{dotaccent}
+ \comment{The dot accent `\.a'.}
+\endsetslot
+
+\fi
+
+\setslot{quoteleft}
+ \if \tty y \else \ligature{LIG}{quoteleft}{quotedblleft} \fi
+ \comment{The English opening single quotation mark `\,`\,'.}
+\endsetslot
+
+\setslot{\lc{A}{a}}
+ \comment{The letter `{a}'.}
+ \atendofword{aswash}
+\endsetslot
+
+\setslot{\lc{B}{b}}
+ \comment{The letter `{b}'.}
+\endsetslot
+
+\setslot{\lc{C}{c}}
+ \Ligature{LIG}{t}{ct}
+ \comment{The letter `{c}'.}
+\endsetslot
+
+\setslot{\lc{D}{d}}
+ \comment{The letter `{d}'.}
+\endsetslot
+
+\setslot{\lc{E}{e}}
+ \comment{The letter `{e}'.}
+ \atendofword{eswash}
+\endsetslot
+
+\setslot{\lc{F}{f}}
+\if \tty y \else
+ \ligature{LIG}{\lc{I}{i}}{\lclig{FI}{fi}}
+ \ligature{LIG}{\lc{F}{f}}{\lclig{FF}{ff}}
+ \ligature{LIG}{\lc{L}{l}}{\lclig{FL}{fl}}
+\fi
+ \comment{The letter `{f}'.}
+\endsetslot
+
+\setslot{\lc{G}{g}}
+ \comment{The letter `{g}'.}
+\endsetslot
+
+\setslot{\lc{H}{h}}
+ \comment{The letter `{h}'.}
+\endsetslot
+
+\setslot{\lc{I}{i}}
+ \comment{The letter `{i}'.}
+\endsetslot
+
+\setslot{\lc{J}{j}}
+ \comment{The letter `{j}'.}
+\endsetslot
+
+\setslot{\lc{K}{k}}
+ \comment{The letter `{k}'.}
+\endsetslot
+
+\setslot{\lc{L}{l}}
+ \comment{The letter `{l}'.}
+\endsetslot
+
+\setslot{\lc{M}{m}}
+ \comment{The letter `{m}'.}
+\endsetslot
+
+\setslot{\lc{N}{n}}
+ \comment{The letter `{n}'.}
+ \atendofword{nswash}
+\endsetslot
+
+\setslot{\lc{O}{o}}
+ \comment{The letter `{o}'.}
+\endsetslot
+
+\setslot{\lc{P}{p}}
+ \comment{The letter `{p}'.}
+\endsetslot
+
+\setslot{\lc{Q}{q}}
+ \comment{The letter `{q}'.}
+\endsetslot
+
+\setslot{\lc{R}{r}}
+ \comment{The letter `{r}'.}
+ \atendofword{rswash}
+\endsetslot
+
+\setslot{\lc{S}{s}}
+ \Ligature{LIG}{t}{st}
+ \comment{The letter `{s}'.}
+\endsetslot
+
+\setslot{\lc{T}{t}}
+ \comment{The letter `{t}'.}
+ \atendofword{tswash}
+\endsetslot
+
+\setslot{\lc{U}{u}}
+ \comment{The letter `{u}'.}
+\endsetslot
+
+\setslot{\lc{V}{v}}
+ \comment{The letter `{v}'.}
+\endsetslot
+
+\setslot{\lc{W}{w}}
+ \comment{The letter `{w}'.}
+\endsetslot
+
+\setslot{\lc{X}{x}}
+ \comment{The letter `{x}'.}
+\endsetslot
+
+\setslot{\lc{Y}{y}}
+ \comment{The letter `{y}'.}
+\endsetslot
+
+\setslot{\lc{Z}{z}}
+ \comment{The letter `{z}'.}
+ \atendofword{zswash}
+\endsetslot
+
+\if \tty y
+
+\setslot{braceleft}
+ \comment{The opening curly brace `\{'.}
+\endsetslot
+
+\setslot{bar}
+ \comment{The ASCII vertical bar `$|$'. This is
+ included for compatibility with typewriter fonts used for computer
+ listings.}
+\endsetslot
+
+\setslot{braceright}
+ \comment{The closing curly brace `\}'.}
+\endsetslot
+
+\else
+
+\setslot{rangedash}
+ \if \tty y \else \ligature{LIG}{hyphen}{punctdash} \fi
+ \comment{The number range dash `1--9'. In a monowidth font, this
+ might be set as `{\tt 1{-}9}'.}
+\endsetslot
+
+\setslot{punctdash}
+ \comment{The punctuation dash `Oh---boy.' In a monowidth font, this
+ might be set as `{\tt Oh{-}{-}boy.}'}
+\endsetslot
+
+\setslot{hungarumlaut}
+ \comment{The long Hungarian umlaut `\H a'.}
+\endsetslot
+
+\fi
+
+\setslot{tilde}
+ \comment{The tilde accent `\~a'.}
+\endsetslot
+
+\setslot{dieresis}
+ \comment{The umlaut or dieresis accent `\"a'.}
+\endsetslot
+
+\nextslot{"8A}
+
+\setslot{\uc{Lslash}{lslash}}
+ \comment{The letter `\L'.}
+\endsetslot
+
+\nextslot{"AA}
+
+\setslot{\lc{Lslash}{lslash}}
+ \comment{The letter `\l'.}
+\endsetslot
+
+\setslot{\alternatechar{ampersand}}\endsetslot
+\setslot{ornament1}\endsetslot
+\setslot{ornament2}\endsetslot
+\setslot{Qalt}\endsetslot
+\setslot{aswash}\endsetslot
+\setslot{ct}\endsetslot
+\setslot{eswash}\endsetslot
+\setslot{nswash}\endsetslot
+\setslot{rswash}\endsetslot
+\setslot{st}\endsetslot
+\setslot{tswash}\endsetslot
+\setslot{tswashalt}\endsetslot
+\setslot{vswash}\endsetslot
+\setslot{zswash}\endsetslot
+\setslot{boundarychar}
+ \atstartofword{Q}{Qalt}
+ \atstartofword{v}{vswash}
+\endsetslot
+
+\endencoding
diff --git a/fonts/utilities/vfinst/OT1sw.etx b/fonts/utilities/vfinst/OT1sw.etx
new file mode 100644
index 0000000000..f37aa85fa9
--- /dev/null
+++ b/fonts/utilities/vfinst/OT1sw.etx
@@ -0,0 +1,28 @@
+\relax
+
+This is file OT1sw.etx, part of vfinst by Alan Hoenig (ajhjj@cunyvm.cuny.edu).
+It's for creating swash fonts in the OT1 encoding. This file is heavily based
+upon Alan Jeffrey's similarly-named files in the fontinst package.
+
+\encoding
+
+% We define the parameters for OT1.etx to produce a font with swash-like
+% characters.
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1swash}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\ifisglyph{zerooldstyle}\then % do oldstyle digits exist?
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1}
+\fi
+\setcommand\currency{dollar}
+\setcommand\tty{n}
+
+% Then we call OT1.etx.
+
+\inputetx{OT1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/README b/fonts/utilities/vfinst/README
new file mode 100644
index 0000000000..32c39982e9
--- /dev/null
+++ b/fonts/utilities/vfinst/README
@@ -0,0 +1,52 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file readme, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If you've ever wanted to set up outline fonts for use by \TeX\ or
+\LaTeX, VFinst may be of use to you. At the end of the VFinst
+process, you'll be able to typeset with your new fonts, confident that
+accents, ligatures, and the like will appear in your document with the
+usual \TeX\ conventions. Here are the fonts you get at the end of the
+process.
+
+ * For every upright font: you get the upright font, the small
+ caps font, an oblique font, and an underline font.
+ * For every italic font, you get the italic font, a small caps
+ italic, an unslanted italic, and an underline font.
+ * Additional fonts: You will also get titling (display)
+ fonts, both upright and italic, and a swash italic font,
+ if the appropriate raw fonts were present.
+
+VFinst takes care to use expert fonts to build the small caps fonts,
+if these raw fonts are present. You also get test files
+for plain TeX and NFSS (LaTeX), to both test the fonts and to provide
+examples of how to declare and use each of the fonts in a TeX
+document.
+
+Some Technical Notes: At the end of the VFinst process, you get all
+.vf and .tfm files for all fonts, which have been renamed for you
+according to the fontname2.1 conventions. All oblique and italic
+fonts use the true italic angle for the font. The dvips map file
+psfonts.map will have been updated for you. All fonts will have been
+placed in the proper area on your hard disk. You may choose original
+TeX (ot1) or Cork (t1) encodings for your fonts, which can be
+installed according to the TDS (TeX Directory Structure) or
+`traditional' standard. All raw fonts follow the 8r TeXBase1Encoding.
+
+All this and more is expanded upon in the documentation file
+vfinst.tex. PLEASE READ THE FILE vfinst.tex BEFORE ENGAGING IN ANY
+FONT INSTALLATIONS.
+
+Please feel free to get in touch with me; my email is
+ajhjj@cunyvm.cuny.edu. All comments, bugs, suggestions for
+improvement, and criticism cheerfully accepted.
+
+ Alan Hoenig
+ ajhjj@cunyvm.cuny.edu
+
+ August 1998
+
diff --git a/fonts/utilities/vfinst/T19vf.etx b/fonts/utilities/vfinst/T19vf.etx
new file mode 100644
index 0000000000..0dd37b920a
--- /dev/null
+++ b/fonts/utilities/vfinst/T19vf.etx
@@ -0,0 +1,25 @@
+\relax
+
+\encoding
+
+% We define the parameters for T1.etx to produce a font with old
+% style digits.
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+%% Since oldstyle numerals are unfakable, let's make sure they
+%% exist before we define them as such...
+\ifisglyph{zerooldstyle}\then % good---they exist!
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1} % bad---regular digits are better than nothing.
+\fi
+\setcommand\tty{n}
+
+% Then we call T1.etx.
+
+\inputetx{T1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/T1c9vf.etx b/fonts/utilities/vfinst/T1c9vf.etx
new file mode 100644
index 0000000000..43c85ec2e0
--- /dev/null
+++ b/fonts/utilities/vfinst/T1c9vf.etx
@@ -0,0 +1,54 @@
+\relax
+
+\encoding
+
+% We define the parameters for T1.etx to produce a c&sc font with old
+% style digits.
+
+\setcommand\lc#1#2{#1small}
+\setcommand\uc#1#2{#1}
+\setcommand\lctop#1#2{#1small}
+\setcommand\uctop#1#2{#1}
+\setcommand\lclig#1#2{#1small}
+\setcommand\uclig#1#2{#1spaced}
+%% Since oldstyle numerals are unfakable, let's make sure they
+%% exist before we define them as such...
+\ifisglyph{zerooldstyle}\then % good---they exist!
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1} % bad---regular digits are better than nothing.
+\fi
+
+% The default letter spacing is 1/10 of the design size, with small
+% caps 80% the size of large caps.
+
+\setint{smallcapsscale}{800}
+
+\ifisglyph{space}\then
+ \setint{interword}{\width{space}}
+\else\ifisglyph{i}\then
+ \setint{interword}{\width{i}}
+\else
+ \setint{interword}{333}
+\fi\fi
+
+\ifisint{monoweight}\then
+ \setint{smallcapsextraspace}
+ {\div{\scale{\int{interword}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+ \setint{smallcapsspacing}{0}
+\else
+ \setint{smallcapsextraspace}{0}
+ \setint{smallcapsspacing}{50}
+\fi
+
+\ifisint{capspacing}\then
+ \setint{letterspacing}{\int{capspacing}}
+\else
+ \setint{letterspacing}{\int{smallcapsspacing}}
+\fi
+
+% Then we call T1.etx.
+
+\inputetx{T1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/T1sw.etx b/fonts/utilities/vfinst/T1sw.etx
new file mode 100644
index 0000000000..529e07fcfa
--- /dev/null
+++ b/fonts/utilities/vfinst/T1sw.etx
@@ -0,0 +1,28 @@
+\relax
+
+This is file T1sw.etx, part of vfinst by Alan Hoenig (ajhjj@cunyvm.cuny.edu).
+It's for creating swash fonts in the T1 encoding. This file is heavily based
+upon Alan Jeffrey's similarly-named files in the fontinst package.
+
+\encoding
+
+% We define the parameters for T1.etx to produce a font with old
+% style digits.
+
+\setcommand\lc#1#2{#2}
+\setcommand\uc#1#2{#1swash}
+\setcommand\lclig#1#2{#2}
+\setcommand\uclig#1#2{#1}
+\ifisglyph{zerooldstyle}\then % do oldstyle digits exist?
+ \setcommand\digit#1{#1oldstyle}
+\else
+ \setcommand\digit#1{#1}
+\fi
+\setcommand\currency{dollar}
+\setcommand\tty{n}
+
+% Then we call T1.etx.
+
+\inputetx{T1}
+
+\endencoding
diff --git a/fonts/utilities/vfinst/dotlessj.mtx b/fonts/utilities/vfinst/dotlessj.mtx
new file mode 100644
index 0000000000..36c4dab97a
--- /dev/null
+++ b/fonts/utilities/vfinst/dotlessj.mtx
@@ -0,0 +1,43 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file dotlessj.mtx, part of the VFinst package
+%% (version 0.95, December, 1997) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\relax
+
+This fontinst file sets a dotless j glyph for a TeX
+math italic font. The following code is due to Thierry Bouche,
+a paper of whose on virtual math fonts can be found at
+ftp://fourier.ujf-grenoble.fr/pub/contrib-tex/gut/mathfonts-pk.ps.gz
+
+\metrics
+
+\ifisglyph{j}\then
+ \resetglyph{dotlessj}
+ \glyphspecial{ps: gsave gsave}
+ \push
+ \moveup{\neg{\depth{j}}}
+ \movert{\neg{\width{j}}}
+ \glyphspecial{ps: currentpoint /JDepth exch def /JLeft exch def}
+ \moveup{\add{\depth{j}}{\height{dotlessi}}}
+ %\movert{\mul{\width{j}}{2}}
+ \movert{\scale{\width{j}}{2500}}
+ \glyphspecial{ps: currentpoint /IHeight exch def /JRight exch def grestore}
+ \glyphspecial{ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto
+ 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0
+ rlineto 0 JDepth neg IHeight add neg rlineto closepath clip}
+ \pop
+ \glyph{j}{1000}
+ \glyphspecial{ps: grestore}
+ \resetdepth{\depth{j}}
+ \resetwidth{\width{j}}
+ \resetitalic{\italic{j}}
+ \resetheight{\height{dotlessi}}
+ \endresetglyph
+\fi
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/example/OT1put.fd b/fonts/utilities/vfinst/example/OT1put.fd
new file mode 100644
index 0000000000..093c7e3131
--- /dev/null
+++ b/fonts/utilities/vfinst/example/OT1put.fd
@@ -0,0 +1,93 @@
+%Filename: OT1put.fd
+%Created by: tex makefont
+%Created using fontinst v1.500
+
+%THIS FILE SHOULD BE PUT IN A TEX INPUTS DIRECTORY
+
+\ProvidesFile{OT1put.fd}
+ [1998/08/11 Fontinst v1.500 font definitions for OT1/put.]
+
+\DeclareFontFamily{OT1}{put}{}
+
+\DeclareFontShape{OT1}{put}{m}{n}{
+ <-> putr7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{sl}{
+ <-> putro7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{sc}{
+ <-> putrc7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{un}{
+ <-> putrn7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{it}{
+ <-> putri7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{ui}{
+ <-> putru7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{si}{
+ <-> putric7t
+}{}
+
+\DeclareFontShape{OT1}{put}{m}{ni}{
+ <-> putrni7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{n}{
+ <-> putb7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{sl}{
+ <-> putbo7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{sc}{
+ <-> putbc7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{un}{
+ <-> putbn7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{it}{
+ <-> putbi7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{ui}{
+ <-> putbu7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{si}{
+ <-> putbic7t
+}{}
+
+\DeclareFontShape{OT1}{put}{b}{ni}{
+ <-> putbni7t
+}{}
+
+\DeclareFontShape{OT1}{put}{l}{n}{<->ssub * put/m/n}{}
+\DeclareFontShape{OT1}{put}{l}{sl}{<->ssub * put/m/sl}{}
+\DeclareFontShape{OT1}{put}{l}{sc}{<->ssub * put/m/sc}{}
+\DeclareFontShape{OT1}{put}{l}{un}{<->ssub * put/m/un}{}
+\DeclareFontShape{OT1}{put}{l}{it}{<->ssub * put/m/it}{}
+\DeclareFontShape{OT1}{put}{l}{ui}{<->ssub * put/m/ui}{}
+\DeclareFontShape{OT1}{put}{l}{si}{<->ssub * put/m/si}{}
+\DeclareFontShape{OT1}{put}{l}{ni}{<->ssub * put/m/ni}{}
+\DeclareFontShape{OT1}{put}{bx}{n}{<->ssub * put/b/n}{}
+\DeclareFontShape{OT1}{put}{bx}{sl}{<->ssub * put/b/sl}{}
+\DeclareFontShape{OT1}{put}{bx}{sc}{<->ssub * put/b/sc}{}
+\DeclareFontShape{OT1}{put}{bx}{un}{<->ssub * put/b/un}{}
+\DeclareFontShape{OT1}{put}{bx}{it}{<->ssub * put/b/it}{}
+\DeclareFontShape{OT1}{put}{bx}{ui}{<->ssub * put/b/ui}{}
+\DeclareFontShape{OT1}{put}{bx}{si}{<->ssub * put/b/si}{}
+\DeclareFontShape{OT1}{put}{bx}{ni}{<->ssub * put/b/ni}{}
+
+\endinput
diff --git a/fonts/utilities/vfinst/example/cleanup.bat b/fonts/utilities/vfinst/example/cleanup.bat
new file mode 100644
index 0000000000..f7a4d1ccf6
--- /dev/null
+++ b/fonts/utilities/vfinst/example/cleanup.bat
@@ -0,0 +1,23 @@
+## This file removes files. Delete it after use.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:03:8.
+rm putr8a.pfb
+rm putr8a.afm
+rm putri8a.pfb
+rm putri8a.afm
+rm putb8a.pfb
+rm putb8a.afm
+rm putbi8a.pfb
+rm putbi8a.afm
+rm psfonts.*
+rm *.vfi
+rm makefont.tex
+rm *.mtx
+rm *.pl
+rm *.vpl
+rm *.log
+rm *.aux
+rm *.vlg
+rm *.lst
+rm *.bat
+rm *.dvi
+rm *.ps
diff --git a/fonts/utilities/vfinst/example/fonts.lst b/fonts/utilities/vfinst/example/fonts.lst
new file mode 100644
index 0000000000..7998bb21f4
--- /dev/null
+++ b/fonts/utilities/vfinst/example/fonts.lst
@@ -0,0 +1,10 @@
+## This is list of font information used by VFinst.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:01:26.
+##
+## Sort New Slant File Long Digital Foundry
+## Key Name Name Name ...
+## ========================================================================
+put300 putr8a 000 putr8a.{pfb,afm} Utopia-Regular
+put310 putri8a 230 putri8a.{pfb,afm} Utopia-Italic
+put900 putb8a 000 putb8a.{pfb,afm} Utopia-Bold
+put910 putbi8a 230 putbi8a.{pfb,afm} Utopia-BoldItalic
diff --git a/fonts/utilities/vfinst/example/makefont.tex b/fonts/utilities/vfinst/example/makefont.tex
new file mode 100644
index 0000000000..6cf8404e5e
--- /dev/null
+++ b/fonts/utilities/vfinst/example/makefont.tex
@@ -0,0 +1,48 @@
+%&plain
+
+% This is a fontinst installation file.
+% Created by vfinst1.00 at 11:03:8 on 11 Aug 98.
+
+% THIS FILE MAY BE DELETED at completion of the font installation.
+
+\input fontinst.sty
+
+\transformfont{putr8r}{\reencodefont{8r}{\fromafm{putr8a}}}
+\transformfont{putro8r}{\slantfont{230}{\frommtx{putr8r}}}
+\transformfont{putri8r}{\reencodefont{8r}{\fromafm{putri8a}}}
+\transformfont{putru8r}{\slantfont{-230}{\frommtx{putri8r}}}
+\transformfont{putb8r}{\reencodefont{8r}{\fromafm{putb8a}}}
+\transformfont{putbo8r}{\slantfont{230}{\frommtx{putb8r}}}
+\transformfont{putbi8r}{\reencodefont{8r}{\fromafm{putbi8a}}}
+\transformfont{putbu8r}{\slantfont{-230}{\frommtx{putbi8r}}}
+
+\installfonts
+\installfamily{OT1}{put}{}
+%%
+ \installfont{putr7t}{putr8r,dotlessj,latinx}{OT1}{OT1}{put}{m}{n}{}
+ \installfont{putro7t}{putro8r,dotlessj,latinx}{OT1}{OT1}{put}{m}{sl}{}
+ \installfont{putrc7t}{putr8r,dotlessj,latinx}{OT1c}{OT1}{put}{m}{sc}{}
+ \installfont{putrn7t}{putr8r,dotlessj,uline,latinx}%
+ {OT1}{OT1}{put}{m}{un}{}
+%%
+ \installfont{putri7t}{putri8r,dotlessj,latinx}{OT1i}{OT1}{put}{m}{it}{}
+ \installfont{putru7t}{putru8r,dotlessj,latinx}{OT1}{OT1}{put}{m}{ui}{}
+ \installfont{putric7t}{putri8r,dotlessj,latinx}{OT1c}{OT1}{put}{m}{si}{}
+ \installfont{putrni7t}{putri8r,dotlessj,uline,latinx}%
+ {OT1}{OT1}{put}{m}{ni}{}
+%%
+ \installfont{putb7t}{putb8r,dotlessj,latinx}{OT1}{OT1}{put}{b}{n}{}
+ \installfont{putbo7t}{putbo8r,dotlessj,latinx}{OT1}{OT1}{put}{b}{sl}{}
+ \installfont{putbc7t}{putb8r,dotlessj,latinx}{OT1c}{OT1}{put}{b}{sc}{}
+ \installfont{putbn7t}{putb8r,dotlessj,uline,latinx}%
+ {OT1}{OT1}{put}{b}{un}{}
+%%
+ \installfont{putbi7t}{putbi8r,dotlessj,latinx}{OT1i}{OT1}{put}{b}{it}{}
+ \installfont{putbu7t}{putbu8r,dotlessj,latinx}{OT1}{OT1}{put}{b}{ui}{}
+ \installfont{putbic7t}{putbi8r,dotlessj,latinx}{OT1c}{OT1}{put}{b}{si}{}
+ \installfont{putbni7t}{putbi8r,dotlessj,uline,latinx}%
+ {OT1}{OT1}{put}{b}{ni}{}
+%%
+\endinstallfonts
+
+\bye
diff --git a/fonts/utilities/vfinst/example/maketfm.bat b/fonts/utilities/vfinst/example/maketfm.bat
new file mode 100644
index 0000000000..1b14ef3428
--- /dev/null
+++ b/fonts/utilities/vfinst/example/maketfm.bat
@@ -0,0 +1,54 @@
+## This file makes tfm files. It may be deleted after use.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:03:8.
+echo "putr8a" >> maketfm.vlg
+pltotf putr8a.pl putr8a.tfm >> maketfm.vlg
+echo "putr8r" >> maketfm.vlg
+pltotf putr8r.pl putr8r.tfm >> maketfm.vlg
+pltotf putro8r.pl putro8r.tfm >> maketfm.vlg
+echo "putri8a" >> maketfm.vlg
+pltotf putri8a.pl putri8a.tfm >> maketfm.vlg
+echo "putri8r" >> maketfm.vlg
+pltotf putri8r.pl putri8r.tfm >> maketfm.vlg
+pltotf putru8r.pl putru8r.tfm >> maketfm.vlg
+echo "putb8a" >> maketfm.vlg
+pltotf putb8a.pl putb8a.tfm >> maketfm.vlg
+echo "putb8r" >> maketfm.vlg
+pltotf putb8r.pl putb8r.tfm >> maketfm.vlg
+pltotf putbo8r.pl putbo8r.tfm >> maketfm.vlg
+echo "putbi8a" >> maketfm.vlg
+pltotf putbi8a.pl putbi8a.tfm >> maketfm.vlg
+echo "putbi8r" >> maketfm.vlg
+pltotf putbi8r.pl putbi8r.tfm >> maketfm.vlg
+pltotf putbu8r.pl putbu8r.tfm >> maketfm.vlg
+echo "putr7t" >> maketfm.vlg
+vptovf putr7t.vpl putr7t.vf putr7t.tfm >> maketfm.vlg
+echo "putro7t" >> maketfm.vlg
+vptovf putro7t.vpl putro7t.vf putro7t.tfm >> maketfm.vlg
+echo "putrc7t" >> maketfm.vlg
+vptovf putrc7t.vpl putrc7t.vf putrc7t.tfm >> maketfm.vlg
+echo "putrn7t" >> maketfm.vlg
+vptovf putrn7t.vpl putrn7t.vf putrn7t.tfm >> maketfm.vlg
+echo "putri7t" >> maketfm.vlg
+vptovf putri7t.vpl putri7t.vf putri7t.tfm >> maketfm.vlg
+echo "putru7t" >> maketfm.vlg
+vptovf putru7t.vpl putru7t.vf putru7t.tfm >> maketfm.vlg
+echo "putric7t" >> maketfm.vlg
+vptovf putric7t.vpl putric7t.vf putric7t.tfm >> maketfm.vlg
+echo "putrni7t" >> maketfm.vlg
+vptovf putrni7t.vpl putrni7t.vf putrni7t.tfm >> maketfm.vlg
+echo "putb7t" >> maketfm.vlg
+vptovf putb7t.vpl putb7t.vf putb7t.tfm >> maketfm.vlg
+echo "putbo7t" >> maketfm.vlg
+vptovf putbo7t.vpl putbo7t.vf putbo7t.tfm >> maketfm.vlg
+echo "putbc7t" >> maketfm.vlg
+vptovf putbc7t.vpl putbc7t.vf putbc7t.tfm >> maketfm.vlg
+echo "putbn7t" >> maketfm.vlg
+vptovf putbn7t.vpl putbn7t.vf putbn7t.tfm >> maketfm.vlg
+echo "putbi7t" >> maketfm.vlg
+vptovf putbi7t.vpl putbi7t.vf putbi7t.tfm >> maketfm.vlg
+echo "putbu7t" >> maketfm.vlg
+vptovf putbu7t.vpl putbu7t.vf putbu7t.tfm >> maketfm.vlg
+echo "putbic7t" >> maketfm.vlg
+vptovf putbic7t.vpl putbic7t.vf putbic7t.tfm >> maketfm.vlg
+echo "putbni7t" >> maketfm.vlg
+vptovf putbni7t.vpl putbni7t.vf putbni7t.tfm >> maketfm.vlg
diff --git a/fonts/utilities/vfinst/example/mkdirs.bat b/fonts/utilities/vfinst/example/mkdirs.bat
new file mode 100644
index 0000000000..86bd8ba7a1
--- /dev/null
+++ b/fonts/utilities/vfinst/example/mkdirs.bat
@@ -0,0 +1,6 @@
+## This script makes any missing directories.
+## It may be deleted after use.
+mkdir e:/texmf/fonts/afm/adobe/utopia
+mkdir e:/texmf/fonts/type1/adobe/utopia
+mkdir e:/texmf/fonts/tfm/adobe/utopia
+mkdir e:/texmf/fonts/vf/adobe/utopia
diff --git a/fonts/utilities/vfinst/example/newnames.bat b/fonts/utilities/vfinst/example/newnames.bat
new file mode 100644
index 0000000000..18e9679bb9
--- /dev/null
+++ b/fonts/utilities/vfinst/example/newnames.bat
@@ -0,0 +1,6 @@
+## This file renames files. It may be deleted after use.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:03:8.
+rm psfonts.tmp
+rm psfonts.map
+mv psfonts.all psfonts.map
+rm psfonts.new
diff --git a/fonts/utilities/vfinst/example/psfonts.new b/fonts/utilities/vfinst/example/psfonts.new
new file mode 100644
index 0000000000..98352d18c9
--- /dev/null
+++ b/fonts/utilities/vfinst/example/psfonts.new
@@ -0,0 +1,9 @@
+
+putr8r Utopia-Regular "TeXBase1Encoding ReEncodeFont" <8r.enc <putr8a.pfb
+putro8r Utopia-Regular ".230 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <putr8a.pfb
+putri8r Utopia-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <putri8a.pfb
+putru8r Utopia-Italic "-.230 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <putri8a.pfb
+putb8r Utopia-Bold "TeXBase1Encoding ReEncodeFont" <8r.enc <putb8a.pfb
+putbo8r Utopia-Bold ".230 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <putb8a.pfb
+putbi8r Utopia-BoldItalic "TeXBase1Encoding ReEncodeFont" <8r.enc <putbi8a.pfb
+putbu8r Utopia-BoldItalic "-.230 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <putbi8a.pfb
diff --git a/fonts/utilities/vfinst/example/putb7t.vpl b/fonts/utilities/vfinst/example/putb7t.vpl
new file mode 100644
index 0000000000..ca7b071230
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putb7t.vpl
@@ -0,0 +1,2332 @@
+(VTITLE virtual font putb7t created by fontinst v1.500)
+
+(COMMENT Filename: putb7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putb7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putb7t.vpl putb7t.vf putb7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putb8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.5) (COMMENT t)
+ (KRN D 115 R -0.69995) (COMMENT s)
+ (KRN D 114 R -0.41992) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.41992) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.0) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.5) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.25) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.41992) (COMMENT w)
+ (KRN D 118 R -0.47998) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.6399) (COMMENT Y)
+ (KRN D 88 R -0.17993) (COMMENT X)
+ (KRN D 87 R -0.53992) (COMMENT W)
+ (KRN D 86 R -0.69995) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.57996) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 98 R -0.09998) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.04993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.15991) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 89 R -0.59998) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.12) (COMMENT s)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.04993) (COMMENT b)
+ (KRN D 97 R -0.03992) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.35999) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.5) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.5) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.34998) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.34998) (COMMENT e)
+ (KRN D 93 R 0.1499) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.34998) (COMMENT oe)
+ (KRN D 28 R -0.34998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.59998) (COMMENT w)
+ (KRN D 118 R -0.79993) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.35999) (COMMENT Q)
+ (KRN D 79 R -0.35999) (COMMENT O)
+ (KRN D 71 R -0.35999) (COMMENT G)
+ (KRN D 67 R -0.35999) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.35999) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.09998) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 65 R -0.84998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.31995) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.25989) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 39 R -0.1499) (COMMENT quoteright)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.29993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.73999) (COMMENT y)
+ (KRN D 119 R -0.71997) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.5) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.73999) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 41 R 0.3999) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.71997) (COMMENT m)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 44 R -0.94995) (COMMENT comma)
+ (KRN D 93 R 0.3999) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.1499) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.34998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.3999) (COMMENT g)
+ (KRN D 102 R -0.19995) (COMMENT f)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 65 R -0.5) (COMMENT A)
+ (KRN D 14 R -0.19995) (COMMENT ffi)
+ (KRN D 15 R -0.19995) (COMMENT ffl)
+ (KRN D 11 R -0.19995) (COMMENT ff)
+ (KRN D 12 R -0.19995) (COMMENT fi)
+ (KRN D 13 R -0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.75) (COMMENT r)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -1.34998) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.19995) (COMMENT i)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.34998) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.69995) (COMMENT hyphen)
+ (KRN D 104 R 0.19995) (COMMENT h)
+ (KRN D 101 R -0.59998) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.75) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.6499) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.25) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.59998) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.3999) (COMMENT Q)
+ (KRN D 79 R -0.3999) (COMMENT O)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 67 R -0.3999) (COMMENT C)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 31 R -0.3999) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.25) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.59998) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 119 R 0.09998) (COMMENT w)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.31995) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.29993) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R 0.3999) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.29993) (COMMENT ffi)
+ (KRN D 15 R -0.29993) (COMMENT ffl)
+ (KRN D 11 R -0.29993) (COMMENT ff)
+ (KRN D 12 R -0.29993) (COMMENT fi)
+ (KRN D 13 R -0.29993) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 121 R -0.04993) (COMMENT y)
+ (KRN D 120 R -0.04993) (COMMENT x)
+ (KRN D 119 R 0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 96 R -0.29993) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.34998) (COMMENT Y)
+ (KRN D 88 R 0.29993) (COMMENT X)
+ (KRN D 87 R 0.34998) (COMMENT W)
+ (KRN D 86 R 0.34998) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.04993) (COMMENT quoteright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.19995) (COMMENT y)
+ (KRN D 112 R 0.19995) (COMMENT p)
+ (KRN D 102 R 0.19995) (COMMENT f)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 14 R 0.19995) (COMMENT ffi)
+ (KRN D 15 R 0.19995) (COMMENT ffl)
+ (KRN D 11 R 0.19995) (COMMENT ff)
+ (KRN D 12 R 0.19995) (COMMENT fi)
+ (KRN D 13 R 0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.29993) (COMMENT w)
+ (KRN D 118 R 0.29993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 108 R -0.09998) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R 0.04993) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.1499) (COMMENT q)
+ (KRN D 46 R -0.75) (COMMENT period)
+ (KRN D 111 R -0.1499) (COMMENT o)
+ (KRN D 101 R -0.1499) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.1499) (COMMENT c)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 27 R -0.1499) (COMMENT oe)
+ (KRN D 28 R -0.1499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.67993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.09998) (COMMENT c)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.71997) (COMMENT period)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.31995)
+ (MOVERIGHT R -3.15991)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.33997)
+ (MOVERIGHT R 7.8999)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.43994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.06995)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.06995)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 0.50989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putb7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putb8a.afm b/fonts/utilities/vfinst/example/putb8a.afm
new file mode 100644
index 0000000000..2eaa540d63
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putb8a.afm
@@ -0,0 +1,1005 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri Jan 17 15:08:52 1992
+Comment UniqueID 37705
+Comment VMusage 33078 39970
+FontName Utopia-Bold
+FullName Utopia Bold
+FamilyName Utopia
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -155 -250 1249 916
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.002
+Notice Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 490
+Ascender 742
+Descender -230
+StartCharMetrics 228
+C 32 ; WX 210 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 47 -12 231 707 ;
+C 34 ; WX 473 ; N quotedbl ; B 71 407 402 707 ;
+C 35 ; WX 560 ; N numbersign ; B 14 0 547 668 ;
+C 36 ; WX 560 ; N dollar ; B 38 -104 524 748 ;
+C 37 ; WX 887 ; N percent ; B 40 -31 847 701 ;
+C 38 ; WX 748 ; N ampersand ; B 45 -12 734 680 ;
+C 39 ; WX 252 ; N quoteright ; B 40 387 212 707 ;
+C 40 ; WX 365 ; N parenleft ; B 99 -135 344 699 ;
+C 41 ; WX 365 ; N parenright ; B 21 -135 266 699 ;
+C 42 ; WX 442 ; N asterisk ; B 40 315 402 707 ;
+C 43 ; WX 600 ; N plus ; B 58 0 542 490 ;
+C 44 ; WX 280 ; N comma ; B 40 -167 226 180 ;
+C 45 ; WX 392 ; N hyphen ; B 65 203 328 298 ;
+C 46 ; WX 280 ; N period ; B 48 -12 232 174 ;
+C 47 ; WX 378 ; N slash ; B 34 -15 344 707 ;
+C 48 ; WX 560 ; N zero ; B 31 -12 530 680 ;
+C 49 ; WX 560 ; N one ; B 102 0 459 680 ;
+C 50 ; WX 560 ; N two ; B 30 0 539 680 ;
+C 51 ; WX 560 ; N three ; B 27 -12 519 680 ;
+C 52 ; WX 560 ; N four ; B 19 0 533 668 ;
+C 53 ; WX 560 ; N five ; B 43 -12 519 668 ;
+C 54 ; WX 560 ; N six ; B 30 -12 537 680 ;
+C 55 ; WX 560 ; N seven ; B 34 -12 530 668 ;
+C 56 ; WX 560 ; N eight ; B 27 -12 533 680 ;
+C 57 ; WX 560 ; N nine ; B 34 -12 523 680 ;
+C 58 ; WX 280 ; N colon ; B 48 -12 232 490 ;
+C 59 ; WX 280 ; N semicolon ; B 40 -167 232 490 ;
+C 60 ; WX 600 ; N less ; B 61 5 539 493 ;
+C 61 ; WX 600 ; N equal ; B 58 103 542 397 ;
+C 62 ; WX 600 ; N greater ; B 61 5 539 493 ;
+C 63 ; WX 456 ; N question ; B 20 -12 433 707 ;
+C 64 ; WX 833 ; N at ; B 45 -15 797 707 ;
+C 65 ; WX 644 ; N A ; B -28 0 663 692 ;
+C 66 ; WX 683 ; N B ; B 33 0 645 692 ;
+C 67 ; WX 689 ; N C ; B 42 -15 654 707 ;
+C 68 ; WX 777 ; N D ; B 33 0 735 692 ;
+C 69 ; WX 629 ; N E ; B 33 0 604 692 ;
+C 70 ; WX 593 ; N F ; B 37 0 568 692 ;
+C 71 ; WX 726 ; N G ; B 42 -15 709 707 ;
+C 72 ; WX 807 ; N H ; B 33 0 774 692 ;
+C 73 ; WX 384 ; N I ; B 33 0 351 692 ;
+C 74 ; WX 386 ; N J ; B 6 -114 361 692 ;
+C 75 ; WX 707 ; N K ; B 33 -6 719 692 ;
+C 76 ; WX 585 ; N L ; B 33 0 584 692 ;
+C 77 ; WX 918 ; N M ; B 23 0 885 692 ;
+C 78 ; WX 739 ; N N ; B 25 0 719 692 ;
+C 79 ; WX 768 ; N O ; B 42 -15 726 707 ;
+C 80 ; WX 650 ; N P ; B 33 0 623 692 ;
+C 81 ; WX 768 ; N Q ; B 42 -193 726 707 ;
+C 82 ; WX 684 ; N R ; B 33 0 686 692 ;
+C 83 ; WX 561 ; N S ; B 42 -15 533 707 ;
+C 84 ; WX 624 ; N T ; B 15 0 609 692 ;
+C 85 ; WX 786 ; N U ; B 29 -15 757 692 ;
+C 86 ; WX 645 ; N V ; B -16 0 679 692 ;
+C 87 ; WX 933 ; N W ; B -10 0 960 692 ;
+C 88 ; WX 634 ; N X ; B -19 0 671 692 ;
+C 89 ; WX 617 ; N Y ; B -12 0 655 692 ;
+C 90 ; WX 614 ; N Z ; B 0 0 606 692 ;
+C 91 ; WX 335 ; N bracketleft ; B 123 -128 308 692 ;
+C 92 ; WX 379 ; N backslash ; B 34 -15 345 707 ;
+C 93 ; WX 335 ; N bracketright ; B 27 -128 212 692 ;
+C 94 ; WX 600 ; N asciicircum ; B 56 215 544 668 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 252 ; N quoteleft ; B 40 399 212 719 ;
+C 97 ; WX 544 ; N a ; B 41 -12 561 502 ;
+C 98 ; WX 605 ; N b ; B 15 -12 571 742 ;
+C 99 ; WX 494 ; N c ; B 34 -12 484 502 ;
+C 100 ; WX 605 ; N d ; B 34 -12 596 742 ;
+C 101 ; WX 519 ; N e ; B 34 -12 505 502 ;
+C 102 ; WX 342 ; N f ; B 27 0 421 742 ; L i fi ; L l fl ;
+C 103 ; WX 533 ; N g ; B 25 -242 546 512 ;
+C 104 ; WX 631 ; N h ; B 19 0 622 742 ;
+C 105 ; WX 316 ; N i ; B 26 0 307 720 ;
+C 106 ; WX 316 ; N j ; B -12 -232 260 720 ;
+C 107 ; WX 582 ; N k ; B 19 0 595 742 ;
+C 108 ; WX 309 ; N l ; B 19 0 300 742 ;
+C 109 ; WX 948 ; N m ; B 26 0 939 502 ;
+C 110 ; WX 638 ; N n ; B 26 0 629 502 ;
+C 111 ; WX 585 ; N o ; B 34 -12 551 502 ;
+C 112 ; WX 615 ; N p ; B 19 -230 581 502 ;
+C 113 ; WX 597 ; N q ; B 34 -230 596 502 ;
+C 114 ; WX 440 ; N r ; B 26 0 442 502 ;
+C 115 ; WX 446 ; N s ; B 38 -12 425 502 ;
+C 116 ; WX 370 ; N t ; B 32 -12 373 616 ;
+C 117 ; WX 629 ; N u ; B 23 -12 620 502 ;
+C 118 ; WX 520 ; N v ; B -8 0 546 490 ;
+C 119 ; WX 774 ; N w ; B -10 0 802 490 ;
+C 120 ; WX 522 ; N x ; B -15 0 550 490 ;
+C 121 ; WX 524 ; N y ; B -12 -242 557 490 ;
+C 122 ; WX 483 ; N z ; B -1 0 480 490 ;
+C 123 ; WX 365 ; N braceleft ; B 74 -128 325 692 ;
+C 124 ; WX 284 ; N bar ; B 94 -250 190 750 ;
+C 125 ; WX 365 ; N braceright ; B 40 -128 291 692 ;
+C 126 ; WX 600 ; N asciitilde ; B 50 158 551 339 ;
+C 161 ; WX 278 ; N exclamdown ; B 47 -217 231 502 ;
+C 162 ; WX 560 ; N cent ; B 39 -15 546 678 ;
+C 163 ; WX 560 ; N sterling ; B 21 0 555 679 ;
+C 164 ; WX 100 ; N fraction ; B -155 -27 255 695 ;
+C 165 ; WX 560 ; N yen ; B 3 0 562 668 ;
+C 166 ; WX 560 ; N florin ; B -40 -135 562 691 ;
+C 167 ; WX 566 ; N section ; B 35 -115 531 707 ;
+C 168 ; WX 560 ; N currency ; B 21 73 539 596 ;
+C 169 ; WX 252 ; N quotesingle ; B 57 407 196 707 ;
+C 170 ; WX 473 ; N quotedblleft ; B 40 399 433 719 ;
+C 171 ; WX 487 ; N guillemotleft ; B 40 37 452 464 ;
+C 172 ; WX 287 ; N guilsinglleft ; B 40 37 252 464 ;
+C 173 ; WX 287 ; N guilsinglright ; B 35 37 247 464 ;
+C 174 ; WX 639 ; N fi ; B 27 0 630 742 ;
+C 175 ; WX 639 ; N fl ; B 27 0 630 742 ;
+C 177 ; WX 500 ; N endash ; B 0 209 500 292 ;
+C 178 ; WX 510 ; N dagger ; B 35 -125 475 707 ;
+C 179 ; WX 486 ; N daggerdbl ; B 35 -119 451 707 ;
+C 180 ; WX 280 ; N periodcentered ; B 48 156 232 342 ;
+C 182 ; WX 552 ; N paragraph ; B 35 -101 527 692 ;
+C 183 ; WX 455 ; N bullet ; B 50 174 405 529 ;
+C 184 ; WX 252 ; N quotesinglbase ; B 40 -153 212 167 ;
+C 185 ; WX 473 ; N quotedblbase ; B 40 -153 433 167 ;
+C 186 ; WX 473 ; N quotedblright ; B 40 387 433 707 ;
+C 187 ; WX 487 ; N guillemotright ; B 35 37 447 464 ;
+C 188 ; WX 1000 ; N ellipsis ; B 75 -12 925 174 ;
+C 189 ; WX 1289 ; N perthousand ; B 40 -31 1249 701 ;
+C 191 ; WX 456 ; N questiondown ; B 23 -217 436 502 ;
+C 193 ; WX 430 ; N grave ; B 40 511 312 740 ;
+C 194 ; WX 430 ; N acute ; B 119 511 391 740 ;
+C 195 ; WX 430 ; N circumflex ; B 28 520 402 747 ;
+C 196 ; WX 430 ; N tilde ; B 2 553 427 706 ;
+C 197 ; WX 430 ; N macron ; B 60 587 371 674 ;
+C 198 ; WX 430 ; N breve ; B 56 556 375 716 ;
+C 199 ; WX 430 ; N dotaccent ; B 136 561 294 710 ;
+C 200 ; WX 430 ; N dieresis ; B 16 561 414 710 ;
+C 202 ; WX 430 ; N ring ; B 96 540 334 762 ;
+C 203 ; WX 430 ; N cedilla ; B 136 -246 335 0 ;
+C 205 ; WX 430 ; N hungarumlaut ; B 64 521 446 751 ;
+C 206 ; WX 430 ; N ogonek ; B 105 -246 325 0 ;
+C 207 ; WX 430 ; N caron ; B 28 520 402 747 ;
+C 208 ; WX 1000 ; N emdash ; B 0 209 1000 292 ;
+C 225 ; WX 879 ; N AE ; B -77 0 854 692 ;
+C 227 ; WX 405 ; N ordfeminine ; B 28 265 395 590 ;
+C 232 ; WX 591 ; N Lslash ; B 30 0 590 692 ;
+C 233 ; WX 768 ; N Oslash ; B 42 -61 726 747 ;
+C 234 ; WX 1049 ; N OE ; B 42 0 1024 692 ;
+C 235 ; WX 427 ; N ordmasculine ; B 28 265 399 590 ;
+C 241 ; WX 806 ; N ae ; B 41 -12 792 502 ;
+C 245 ; WX 316 ; N dotlessi ; B 26 0 307 502 ;
+C 248 ; WX 321 ; N lslash ; B 16 0 332 742 ;
+C 249 ; WX 585 ; N oslash ; B 34 -51 551 535 ;
+C 250 ; WX 866 ; N oe ; B 34 -12 852 502 ;
+C 251 ; WX 662 ; N germandbls ; B 29 -12 647 742 ;
+C -1 ; WX 402 ; N onesuperior ; B 71 272 324 680 ;
+C -1 ; WX 600 ; N minus ; B 58 210 542 290 ;
+C -1 ; WX 396 ; N degree ; B 35 360 361 680 ;
+C -1 ; WX 585 ; N oacute ; B 34 -12 551 755 ;
+C -1 ; WX 768 ; N Odieresis ; B 42 -15 726 881 ;
+C -1 ; WX 585 ; N odieresis ; B 34 -12 551 710 ;
+C -1 ; WX 629 ; N Eacute ; B 33 0 604 904 ;
+C -1 ; WX 629 ; N ucircumflex ; B 23 -12 620 747 ;
+C -1 ; WX 900 ; N onequarter ; B 73 -27 814 695 ;
+C -1 ; WX 600 ; N logicalnot ; B 58 95 542 397 ;
+C -1 ; WX 629 ; N Ecircumflex ; B 33 0 604 905 ;
+C -1 ; WX 900 ; N onehalf ; B 53 -27 849 695 ;
+C -1 ; WX 768 ; N Otilde ; B 42 -15 726 876 ;
+C -1 ; WX 629 ; N uacute ; B 23 -12 620 740 ;
+C -1 ; WX 519 ; N eacute ; B 34 -12 505 755 ;
+C -1 ; WX 316 ; N iacute ; B 26 0 369 740 ;
+C -1 ; WX 629 ; N Egrave ; B 33 0 604 904 ;
+C -1 ; WX 316 ; N icircumflex ; B -28 0 346 747 ;
+C -1 ; WX 629 ; N mu ; B 23 -242 620 502 ;
+C -1 ; WX 284 ; N brokenbar ; B 94 -175 190 675 ;
+C -1 ; WX 609 ; N thorn ; B 13 -230 575 722 ;
+C -1 ; WX 644 ; N Aring ; B -28 0 663 872 ;
+C -1 ; WX 524 ; N yacute ; B -12 -242 557 740 ;
+C -1 ; WX 617 ; N Ydieresis ; B -12 0 655 881 ;
+C -1 ; WX 1090 ; N trademark ; B 38 277 1028 692 ;
+C -1 ; WX 800 ; N registered ; B 36 -15 764 707 ;
+C -1 ; WX 585 ; N ocircumflex ; B 34 -12 551 747 ;
+C -1 ; WX 644 ; N Agrave ; B -28 0 663 904 ;
+C -1 ; WX 561 ; N Scaron ; B 42 -15 533 916 ;
+C -1 ; WX 786 ; N Ugrave ; B 29 -15 757 904 ;
+C -1 ; WX 629 ; N Edieresis ; B 33 0 604 881 ;
+C -1 ; WX 786 ; N Uacute ; B 29 -15 757 904 ;
+C -1 ; WX 585 ; N otilde ; B 34 -12 551 706 ;
+C -1 ; WX 638 ; N ntilde ; B 26 0 629 706 ;
+C -1 ; WX 524 ; N ydieresis ; B -12 -242 557 710 ;
+C -1 ; WX 644 ; N Aacute ; B -28 0 663 904 ;
+C -1 ; WX 585 ; N eth ; B 34 -12 551 742 ;
+C -1 ; WX 544 ; N acircumflex ; B 41 -12 561 747 ;
+C -1 ; WX 544 ; N aring ; B 41 -12 561 762 ;
+C -1 ; WX 768 ; N Ograve ; B 42 -15 726 904 ;
+C -1 ; WX 494 ; N ccedilla ; B 34 -246 484 502 ;
+C -1 ; WX 600 ; N multiply ; B 75 20 525 476 ;
+C -1 ; WX 600 ; N divide ; B 58 6 542 494 ;
+C -1 ; WX 402 ; N twosuperior ; B 29 272 382 680 ;
+C -1 ; WX 739 ; N Ntilde ; B 25 0 719 876 ;
+C -1 ; WX 629 ; N ugrave ; B 23 -12 620 740 ;
+C -1 ; WX 786 ; N Ucircumflex ; B 29 -15 757 905 ;
+C -1 ; WX 644 ; N Atilde ; B -28 0 663 876 ;
+C -1 ; WX 483 ; N zcaron ; B -1 0 480 747 ;
+C -1 ; WX 316 ; N idieresis ; B -37 0 361 710 ;
+C -1 ; WX 644 ; N Acircumflex ; B -28 0 663 905 ;
+C -1 ; WX 384 ; N Icircumflex ; B 4 0 380 905 ;
+C -1 ; WX 617 ; N Yacute ; B -12 0 655 904 ;
+C -1 ; WX 768 ; N Oacute ; B 42 -15 726 904 ;
+C -1 ; WX 644 ; N Adieresis ; B -28 0 663 881 ;
+C -1 ; WX 614 ; N Zcaron ; B 0 0 606 916 ;
+C -1 ; WX 544 ; N agrave ; B 41 -12 561 755 ;
+C -1 ; WX 402 ; N threesuperior ; B 30 265 368 680 ;
+C -1 ; WX 585 ; N ograve ; B 34 -12 551 755 ;
+C -1 ; WX 900 ; N threequarters ; B 40 -27 842 695 ;
+C -1 ; WX 783 ; N Eth ; B 35 0 741 692 ;
+C -1 ; WX 600 ; N plusminus ; B 58 0 542 549 ;
+C -1 ; WX 629 ; N udieresis ; B 23 -12 620 710 ;
+C -1 ; WX 519 ; N edieresis ; B 34 -12 505 710 ;
+C -1 ; WX 544 ; N aacute ; B 41 -12 561 755 ;
+C -1 ; WX 316 ; N igrave ; B -47 0 307 740 ;
+C -1 ; WX 384 ; N Idieresis ; B -13 0 397 881 ;
+C -1 ; WX 544 ; N adieresis ; B 41 -12 561 710 ;
+C -1 ; WX 384 ; N Iacute ; B 33 0 423 904 ;
+C -1 ; WX 800 ; N copyright ; B 36 -15 764 707 ;
+C -1 ; WX 384 ; N Igrave ; B -31 0 351 904 ;
+C -1 ; WX 689 ; N Ccedilla ; B 42 -246 654 707 ;
+C -1 ; WX 446 ; N scaron ; B 38 -12 425 747 ;
+C -1 ; WX 519 ; N egrave ; B 34 -12 505 755 ;
+C -1 ; WX 768 ; N Ocircumflex ; B 42 -15 726 905 ;
+C -1 ; WX 640 ; N Thorn ; B 33 0 622 692 ;
+C -1 ; WX 544 ; N atilde ; B 41 -12 561 706 ;
+C -1 ; WX 786 ; N Udieresis ; B 29 -15 757 881 ;
+C -1 ; WX 519 ; N ecircumflex ; B 34 -12 505 747 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 685
+
+KPX A z 25
+KPX A y -40
+KPX A w -42
+KPX A v -48
+KPX A u -18
+KPX A t -12
+KPX A s 6
+KPX A quoteright -110
+KPX A quotedblright -80
+KPX A q -6
+KPX A p -18
+KPX A o -12
+KPX A e -6
+KPX A d -12
+KPX A c -12
+KPX A b -12
+KPX A a -6
+KPX A Y -64
+KPX A X -18
+KPX A W -54
+KPX A V -70
+KPX A U -40
+KPX A T -58
+KPX A Q -18
+KPX A O -18
+KPX A G -18
+KPX A C -18
+
+KPX B y -18
+KPX B u -12
+KPX B r -12
+KPX B o -6
+KPX B l -15
+KPX B k -15
+KPX B i -12
+KPX B h -15
+KPX B e -6
+KPX B b -10
+KPX B a -12
+KPX B W -20
+KPX B V -20
+KPX B U -25
+KPX B T -20
+
+KPX C z -5
+KPX C y -24
+KPX C u -18
+KPX C r -6
+KPX C o -12
+KPX C e -12
+KPX C a -16
+KPX C Q -6
+KPX C O -6
+KPX C G -6
+KPX C C -6
+
+KPX D u -12
+KPX D r -12
+KPX D period -40
+KPX D o -5
+KPX D i -12
+KPX D h -18
+KPX D e -5
+KPX D comma -40
+KPX D a -15
+KPX D Y -60
+KPX D W -40
+KPX D V -40
+
+KPX E y -30
+KPX E w -24
+KPX E v -24
+KPX E u -12
+KPX E t -18
+KPX E s -12
+KPX E r -4
+KPX E q -6
+KPX E period 10
+KPX E p -18
+KPX E o -6
+KPX E n -4
+KPX E m -4
+KPX E j -6
+KPX E i -6
+KPX E g -6
+KPX E e -6
+KPX E d -6
+KPX E comma 10
+KPX E c -6
+KPX E b -5
+KPX E a -4
+KPX E Y -6
+KPX E W -6
+KPX E V -6
+
+KPX F y -18
+KPX F u -12
+KPX F r -36
+KPX F quoteright 20
+KPX F quotedblright 20
+KPX F period -150
+KPX F o -36
+KPX F l -12
+KPX F i -22
+KPX F e -36
+KPX F comma -150
+KPX F a -48
+KPX F A -60
+
+KPX G y -12
+KPX G u -12
+KPX G r -18
+KPX G quotedblright -20
+KPX G n -18
+KPX G l -6
+KPX G i -12
+KPX G h -12
+KPX G a -12
+
+KPX H y -24
+KPX H u -26
+KPX H o -30
+KPX H i -18
+KPX H e -30
+KPX H a -25
+
+KPX I z -6
+KPX I y -6
+KPX I x -6
+KPX I w -18
+KPX I v -24
+KPX I u -26
+KPX I t -24
+KPX I s -18
+KPX I r -12
+KPX I p -26
+KPX I o -30
+KPX I n -18
+KPX I m -18
+KPX I l -6
+KPX I k -6
+KPX I h -6
+KPX I g -6
+KPX I f -6
+KPX I e -30
+KPX I d -30
+KPX I c -30
+KPX I b -6
+KPX I a -24
+
+KPX J y -20
+KPX J u -36
+KPX J o -35
+KPX J i -20
+KPX J e -35
+KPX J bracketright 15
+KPX J braceright 15
+KPX J a -36
+
+KPX K y -70
+KPX K w -60
+KPX K v -80
+KPX K u -42
+KPX K o -30
+KPX K l 10
+KPX K i 6
+KPX K h 10
+KPX K e -18
+KPX K a -6
+KPX K Q -36
+KPX K O -36
+KPX K G -36
+KPX K C -36
+KPX K A 20
+
+KPX L y -52
+KPX L w -58
+KPX L u -12
+KPX L quoteright -130
+KPX L quotedblright -130
+KPX L l 6
+KPX L j -6
+KPX L Y -70
+KPX L W -78
+KPX L V -95
+KPX L U -32
+KPX L T -80
+KPX L Q -12
+KPX L O -12
+KPX L G -12
+KPX L C -12
+KPX L A 30
+
+KPX M y -24
+KPX M u -36
+KPX M o -30
+KPX M n -6
+KPX M j -12
+KPX M i -12
+KPX M e -30
+KPX M d -30
+KPX M c -30
+KPX M a -25
+
+KPX N y -24
+KPX N u -30
+KPX N o -30
+KPX N i -24
+KPX N e -30
+KPX N a -30
+
+KPX O z -6
+KPX O u -6
+KPX O t -6
+KPX O s -6
+KPX O r -10
+KPX O q -6
+KPX O period -40
+KPX O p -10
+KPX O o -6
+KPX O n -10
+KPX O m -10
+KPX O l -15
+KPX O k -15
+KPX O i -6
+KPX O h -15
+KPX O g -6
+KPX O e -6
+KPX O d -6
+KPX O comma -40
+KPX O c -6
+KPX O b -15
+KPX O a -12
+KPX O Y -50
+KPX O X -40
+KPX O W -35
+KPX O V -35
+KPX O T -40
+KPX O A -30
+
+KPX P y 10
+KPX P u -18
+KPX P t -6
+KPX P s -30
+KPX P r -12
+KPX P quoteright 20
+KPX P quotedblright 20
+KPX P period -200
+KPX P o -36
+KPX P n -12
+KPX P l -15
+KPX P i -6
+KPX P hyphen -30
+KPX P h -15
+KPX P e -36
+KPX P comma -200
+KPX P a -36
+KPX P I -20
+KPX P H -20
+KPX P E -20
+KPX P A -85
+
+KPX Q u -6
+KPX Q a -18
+KPX Q Y -50
+KPX Q X -40
+KPX Q W -35
+KPX Q V -35
+KPX Q U -25
+KPX Q T -40
+KPX Q A -30
+
+KPX R y -20
+KPX R u -12
+KPX R t -25
+KPX R quoteright -10
+KPX R quotedblright -10
+KPX R o -12
+KPX R e -18
+KPX R a -6
+KPX R Y -32
+KPX R X 20
+KPX R W -18
+KPX R V -26
+KPX R U -30
+KPX R T -20
+KPX R Q -10
+KPX R O -10
+KPX R G -10
+KPX R C -10
+
+KPX S y -35
+KPX S w -30
+KPX S v -40
+KPX S u -24
+KPX S t -24
+KPX S r -10
+KPX S quoteright -15
+KPX S quotedblright -15
+KPX S p -24
+KPX S n -24
+KPX S m -24
+KPX S l -18
+KPX S k -24
+KPX S j -30
+KPX S i -12
+KPX S h -12
+KPX S a -18
+
+KPX T z -64
+KPX T y -74
+KPX T w -72
+KPX T u -74
+KPX T semicolon -50
+KPX T s -82
+KPX T r -74
+KPX T quoteright 24
+KPX T quotedblright 24
+KPX T period -95
+KPX T parenright 40
+KPX T o -90
+KPX T m -72
+KPX T i -28
+KPX T hyphen -110
+KPX T endash -40
+KPX T emdash -60
+KPX T e -80
+KPX T comma -95
+KPX T bracketright 40
+KPX T braceright 30
+KPX T a -90
+KPX T Y 12
+KPX T X 10
+KPX T W 15
+KPX T V 6
+KPX T T 30
+KPX T S -12
+KPX T Q -25
+KPX T O -25
+KPX T G -25
+KPX T C -25
+KPX T A -52
+
+KPX U z -35
+KPX U y -30
+KPX U x -30
+KPX U v -30
+KPX U t -36
+KPX U s -45
+KPX U r -50
+KPX U p -50
+KPX U n -50
+KPX U m -50
+KPX U l -12
+KPX U k -12
+KPX U i -22
+KPX U h -6
+KPX U g -40
+KPX U f -20
+KPX U d -40
+KPX U c -40
+KPX U b -12
+KPX U a -50
+KPX U A -50
+
+KPX V y -36
+KPX V u -50
+KPX V semicolon -45
+KPX V r -75
+KPX V quoteright 50
+KPX V quotedblright 36
+KPX V period -135
+KPX V parenright 80
+KPX V o -70
+KPX V i 20
+KPX V hyphen -90
+KPX V emdash -20
+KPX V e -70
+KPX V comma -135
+KPX V colon -45
+KPX V bracketright 80
+KPX V braceright 80
+KPX V a -70
+KPX V Q -20
+KPX V O -20
+KPX V G -20
+KPX V C -20
+KPX V A -60
+
+KPX W y -50
+KPX W u -46
+KPX W t -30
+KPX W semicolon -40
+KPX W r -50
+KPX W quoteright 40
+KPX W quotedblright 24
+KPX W period -100
+KPX W parenright 80
+KPX W o -60
+KPX W m -50
+KPX W i 5
+KPX W hyphen -70
+KPX W h 20
+KPX W e -60
+KPX W d -60
+KPX W comma -100
+KPX W colon -40
+KPX W bracketright 80
+KPX W braceright 70
+KPX W a -75
+KPX W T 30
+KPX W Q -20
+KPX W O -20
+KPX W G -20
+KPX W C -20
+KPX W A -58
+
+KPX X y -40
+KPX X u -24
+KPX X quoteright 15
+KPX X e -6
+KPX X a -6
+KPX X Q -24
+KPX X O -30
+KPX X G -30
+KPX X C -30
+KPX X A 20
+
+KPX Y v -50
+KPX Y u -65
+KPX Y t -46
+KPX Y semicolon -37
+KPX Y quoteright 50
+KPX Y quotedblright 36
+KPX Y q -100
+KPX Y period -90
+KPX Y parenright 60
+KPX Y o -90
+KPX Y l 25
+KPX Y i 15
+KPX Y hyphen -100
+KPX Y endash -30
+KPX Y emdash -50
+KPX Y e -90
+KPX Y d -90
+KPX Y comma -90
+KPX Y colon -60
+KPX Y bracketright 80
+KPX Y braceright 64
+KPX Y a -80
+KPX Y Y 12
+KPX Y X 12
+KPX Y W 12
+KPX Y V 12
+KPX Y T 30
+KPX Y Q -40
+KPX Y O -40
+KPX Y G -40
+KPX Y C -40
+KPX Y A -55
+
+KPX Z y -36
+KPX Z w -36
+KPX Z u -6
+KPX Z o -12
+KPX Z i -12
+KPX Z e -6
+KPX Z a -6
+KPX Z Q -18
+KPX Z O -18
+KPX Z G -18
+KPX Z C -18
+KPX Z A 25
+
+KPX a quoteright -45
+KPX a quotedblright -40
+
+KPX b y -15
+KPX b w -20
+KPX b v -20
+KPX b quoteright -45
+KPX b quotedblright -40
+KPX b period -10
+KPX b comma -10
+
+KPX braceleft Y 64
+KPX braceleft W 64
+KPX braceleft V 64
+KPX braceleft T 25
+KPX braceleft J 50
+
+KPX bracketleft Y 64
+KPX bracketleft W 64
+KPX bracketleft V 64
+KPX bracketleft T 35
+KPX bracketleft J 60
+
+KPX c quoteright -5
+
+KPX colon space -20
+
+KPX comma space -40
+KPX comma quoteright -100
+KPX comma quotedblright -100
+
+KPX d quoteright -24
+KPX d quotedblright -24
+
+KPX e z -4
+KPX e quoteright -25
+KPX e quotedblright -20
+
+KPX f quotesingle 70
+KPX f quoteright 68
+KPX f quotedblright 68
+KPX f period -10
+KPX f parenright 110
+KPX f comma -20
+KPX f bracketright 100
+KPX f braceright 80
+
+KPX g y 20
+KPX g p 20
+KPX g f 20
+KPX g comma 10
+
+KPX h quoteright -60
+KPX h quotedblright -60
+
+KPX i quoteright -20
+KPX i quotedblright -20
+
+KPX j quoteright -20
+KPX j quotedblright -20
+KPX j period -10
+KPX j comma -10
+
+KPX k quoteright -30
+KPX k quotedblright -30
+
+KPX l quoteright -24
+KPX l quotedblright -24
+
+KPX m quoteright -60
+KPX m quotedblright -60
+
+KPX n quoteright -60
+KPX n quotedblright -60
+
+KPX o z -12
+KPX o y -25
+KPX o x -18
+KPX o w -30
+KPX o v -30
+KPX o quoteright -45
+KPX o quotedblright -40
+KPX o period -10
+KPX o comma -10
+
+KPX p z -10
+KPX p y -15
+KPX p w -15
+KPX p quoteright -45
+KPX p quotedblright -60
+KPX p period -10
+KPX p comma -10
+
+KPX parenleft Y 64
+KPX parenleft W 64
+KPX parenleft V 64
+KPX parenleft T 50
+KPX parenleft J 50
+
+KPX period space -40
+KPX period quoteright -100
+KPX period quotedblright -100
+
+KPX q quoteright -50
+KPX q quotedblright -50
+KPX q period -10
+KPX q comma -10
+
+KPX quotedblleft z -26
+KPX quotedblleft w 10
+KPX quotedblleft u -40
+KPX quotedblleft t -40
+KPX quotedblleft s -32
+KPX quotedblleft r -40
+KPX quotedblleft q -70
+KPX quotedblleft p -40
+KPX quotedblleft o -70
+KPX quotedblleft n -40
+KPX quotedblleft m -40
+KPX quotedblleft g -50
+KPX quotedblleft f -30
+KPX quotedblleft e -70
+KPX quotedblleft d -70
+KPX quotedblleft c -70
+KPX quotedblleft a -60
+KPX quotedblleft Y 30
+KPX quotedblleft X 20
+KPX quotedblleft W 40
+KPX quotedblleft V 40
+KPX quotedblleft T 18
+KPX quotedblleft J -24
+KPX quotedblleft A -122
+
+KPX quotedblright space -40
+KPX quotedblright period -100
+KPX quotedblright comma -100
+
+KPX quoteleft z -26
+KPX quoteleft y -5
+KPX quoteleft x -5
+KPX quoteleft w 5
+KPX quoteleft v -5
+KPX quoteleft u -25
+KPX quoteleft t -25
+KPX quoteleft s -40
+KPX quoteleft r -40
+KPX quoteleft quoteleft -30
+KPX quoteleft q -70
+KPX quoteleft p -40
+KPX quoteleft o -70
+KPX quoteleft n -40
+KPX quoteleft m -40
+KPX quoteleft g -50
+KPX quoteleft f -10
+KPX quoteleft e -70
+KPX quoteleft d -70
+KPX quoteleft c -70
+KPX quoteleft a -60
+KPX quoteleft Y 35
+KPX quoteleft X 30
+KPX quoteleft W 35
+KPX quoteleft V 35
+KPX quoteleft T 35
+KPX quoteleft J -24
+KPX quoteleft A -122
+
+KPX quoteright v -20
+KPX quoteright t -50
+KPX quoteright space -40
+KPX quoteright s -70
+KPX quoteright r -42
+KPX quoteright quoteright -30
+KPX quoteright period -100
+KPX quoteright m -42
+KPX quoteright l -6
+KPX quoteright d -100
+KPX quoteright comma -100
+
+KPX r z 20
+KPX r y 18
+KPX r x 12
+KPX r w 30
+KPX r v 30
+KPX r u 8
+KPX r t 8
+KPX r semicolon 20
+KPX r quoteright -20
+KPX r quotedblright -10
+KPX r q -6
+KPX r period -60
+KPX r o -6
+KPX r n 8
+KPX r m 8
+KPX r l -10
+KPX r k -10
+KPX r i 8
+KPX r hyphen -60
+KPX r h -10
+KPX r g 5
+KPX r f 8
+KPX r emdash -20
+KPX r e -20
+KPX r d -20
+KPX r comma -80
+KPX r colon 20
+KPX r c -20
+
+KPX s quoteright -40
+KPX s quotedblright -40
+
+KPX semicolon space -20
+
+KPX space quotesinglbase -100
+KPX space quoteleft -40
+KPX space quotedblleft -40
+KPX space quotedblbase -100
+KPX space Y -60
+KPX space W -60
+KPX space V -60
+KPX space T -40
+
+KPX t period 15
+KPX t comma 10
+
+KPX u quoteright -60
+KPX u quotedblright -60
+
+KPX v semicolon 20
+KPX v quoteright 5
+KPX v quotedblright 10
+KPX v q -15
+KPX v period -75
+KPX v o -15
+KPX v e -15
+KPX v d -15
+KPX v comma -90
+KPX v colon 20
+KPX v c -15
+KPX v a -15
+
+KPX w semicolon 20
+KPX w quoteright 15
+KPX w quotedblright 20
+KPX w q -10
+KPX w period -60
+KPX w o -10
+KPX w e -10
+KPX w d -10
+KPX w comma -68
+KPX w colon 20
+KPX w c -10
+
+KPX x quoteright -25
+KPX x quotedblright -20
+KPX x q -6
+KPX x o -6
+KPX x e -12
+KPX x d -12
+KPX x c -12
+
+KPX y semicolon 20
+KPX y quoteright 5
+KPX y quotedblright 10
+KPX y period -72
+KPX y hyphen -20
+KPX y comma -72
+KPX y colon 20
+
+KPX z quoteright -20
+KPX z quotedblright -20
+KPX z o -6
+KPX z e -6
+KPX z d -6
+KPX z c -6
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/fonts/utilities/vfinst/example/putb8a.pfb b/fonts/utilities/vfinst/example/putb8a.pfb
new file mode 100644
index 0000000000..06b91085a4
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putb8a.pfb
Binary files differ
diff --git a/fonts/utilities/vfinst/example/putb8a.pl b/fonts/utilities/vfinst/example/putb8a.pl
new file mode 100644
index 0000000000..26843252c8
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putb8a.pl
@@ -0,0 +1,910 @@
+(COMMENT raw font putb8a created by fontinst v1.500)
+
+(COMMENT Filename: putb8a.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putb8a}{putb8a})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putb8a.pl putb8a.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.78992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.83997)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.57996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.7799)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 164 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 166 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.65991)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 169 (COMMENT quotesingle)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 170 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT guilsinglleft)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 173 (COMMENT guilsinglright)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 175 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 177 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT dagger)
+ (CHARWD R 5.09998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 179 (COMMENT daggerdbl)
+ (CHARWD R 4.85999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.41992)
+ (CHARDP R -1.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 183 (COMMENT bullet)
+ (CHARWD R 4.54993)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT quotesinglbase)
+ (CHARWD R 2.5199)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT quotedblbase)
+ (CHARWD R 4.72998)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT perthousand)
+ (CHARWD R 12.8899)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 195 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 196 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R -5.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 197 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R -5.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 198 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R -5.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 199 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT ring)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.62)
+ (CHARDP R -5.3999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 203 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 206 (COMMENT ogonek)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 225 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 227 (COMMENT ordfeminine)
+ (CHARWD R 4.04993)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 232 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 233 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 234 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 235 (COMMENT ordmasculine)
+ (CHARWD R 4.2699)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 241 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 245 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 248 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 249 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 251 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+
+(COMMENT END OF FILE putb8a.pl)
diff --git a/fonts/utilities/vfinst/example/putb8r.pl b/fonts/utilities/vfinst/example/putb8r.pl
new file mode 100644
index 0000000000..21155a1b17
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putb8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putb8r created by fontinst v1.500)
+
+(COMMENT Filename: putb8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putb8r}{putb8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putb8r.pl putb8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.78992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.83997)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.57996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.7799)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.65991)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.09998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.85999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.41992)
+ (CHARDP R -1.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.54993)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.5199)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.72998)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.8899)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R -5.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R -5.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R -5.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.62)
+ (CHARDP R -5.3999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.04993)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 4.2699)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 6.0)
+ (CHARHT R 2.8999)
+ (CHARDP R -2.09998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.95996)
+ (CHARHT R 6.79993)
+ (CHARDP R -3.59998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.67993)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -0.94995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.67993)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.83997)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.21997)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.71997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.3999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 6.16992)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 10.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.0)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.60999)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.28992)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.37988)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.09998)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 6.0)
+ (CHARHT R 4.75989)
+ (CHARDP R -0.19995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 6.0)
+ (CHARHT R 4.93994)
+ (CHARDP R -0.05994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.3899)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.82996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 6.16992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.1399)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 6.0)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.83997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.0)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.45996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.85999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+
+(COMMENT END OF FILE putb8r.pl)
diff --git a/fonts/utilities/vfinst/example/putbc7t.vpl b/fonts/utilities/vfinst/example/putbc7t.vpl
new file mode 100644
index 0000000000..4a29e16a6e
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbc7t.vpl
@@ -0,0 +1,2324 @@
+(VTITLE virtual font putbc7t created by fontinst v1.500)
+
+(COMMENT Filename: putbc7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1c}{putbc7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbc7t.vpl putbc7t.vf putbc7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putb8r) (FONTDSIZE R 10.0) (FONTAT R 8.0))
+(MAPFONT D 1 (FONTNAME putb8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT FFsmall)
+ (LIG D 105 D 14) (COMMENT Ismall FFIsmall)
+ (LIG D 108 D 15) (COMMENT Lsmall FFLsmall)
+ (STOP)
+ (LABEL D 17) (COMMENT dotlessJsmall)
+ (KRN D 93 R 0.12988) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 25) (COMMENT SSsmall)
+ (KRN D 39 R -0.12988) (COMMENT quoteright)
+ (KRN D 34 R -0.12988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT Oslashsmall)
+ (KRN D 46 R -0.35999) (COMMENT period)
+ (KRN D 44 R -0.35999) (COMMENT comma)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R -0.35999) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.30994) (COMMENT V)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.2699) (COMMENT A)
+ (KRN D 97 R -0.23999) (COMMENT Asmall)
+ (KRN D 116 R -0.31995) (COMMENT Tsmall)
+ (KRN D 118 R -0.2699) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.31995) (COMMENT Xsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 97 R -0.2699) (COMMENT Asmall)
+ (KRN D 116 R -0.35999) (COMMENT Tsmall)
+ (KRN D 118 R -0.30994) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.35999) (COMMENT Xsmall)
+ (KRN D 121 R -0.44995) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT Lsmall Lslashsmall)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.5) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (KRN D 106 R 0.44995) (COMMENT Jsmall)
+ (KRN D 116 R 0.44995) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.44995) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (KRN D 89 R -0.6399) (COMMENT Y)
+ (KRN D 88 R -0.17993) (COMMENT X)
+ (KRN D 87 R -0.53992) (COMMENT W)
+ (KRN D 86 R -0.69995) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.57996) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 116 R -0.5199) (COMMENT Tsmall)
+ (KRN D 117 R -0.35999) (COMMENT Usmall)
+ (KRN D 118 R -0.62988) (COMMENT Vsmall)
+ (KRN D 119 R -0.47998) (COMMENT Wsmall)
+ (KRN D 120 R -0.15991) (COMMENT Xsmall)
+ (KRN D 121 R -0.56995) (COMMENT Ysmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.21997) (COMMENT Usmall)
+ (KRN D 118 R -0.17993) (COMMENT Vsmall)
+ (KRN D 119 R -0.17993) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 99 R -0.04993) (COMMENT Csmall)
+ (KRN D 103 R -0.04993) (COMMENT Gsmall)
+ (KRN D 111 R -0.04993) (COMMENT Osmall)
+ (KRN D 113 R -0.04993) (COMMENT Qsmall)
+ (KRN D 28 R -0.04993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 89 R -0.59998) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 118 R -0.35999) (COMMENT Vsmall)
+ (KRN D 119 R -0.35999) (COMMENT Wsmall)
+ (KRN D 121 R -0.53992) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 118 R -0.04993) (COMMENT Vsmall)
+ (KRN D 119 R -0.04993) (COMMENT Wsmall)
+ (KRN D 121 R -0.04993) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.5) (COMMENT period)
+ (KRN D 44 R -1.5) (COMMENT comma)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 97 R -0.53992) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 93 R 0.1499) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 81 R -0.35999) (COMMENT Q)
+ (KRN D 79 R -0.35999) (COMMENT O)
+ (KRN D 71 R -0.35999) (COMMENT G)
+ (KRN D 67 R -0.35999) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.35999) (COMMENT Oslash)
+ (KRN D 97 R 0.17993) (COMMENT Asmall)
+ (KRN D 99 R -0.31995) (COMMENT Csmall)
+ (KRN D 103 R -0.31995) (COMMENT Gsmall)
+ (KRN D 111 R -0.31995) (COMMENT Osmall)
+ (KRN D 113 R -0.31995) (COMMENT Qsmall)
+ (KRN D 28 R -0.31995) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 97 R 0.2699) (COMMENT Asmall)
+ (KRN D 99 R -0.09998) (COMMENT Csmall)
+ (KRN D 103 R -0.09998) (COMMENT Gsmall)
+ (KRN D 111 R -0.09998) (COMMENT Osmall)
+ (KRN D 113 R -0.09998) (COMMENT Qsmall)
+ (KRN D 116 R -0.71997) (COMMENT Tsmall)
+ (KRN D 117 R -0.2799) (COMMENT Usmall)
+ (KRN D 118 R -0.84998) (COMMENT Vsmall)
+ (KRN D 119 R -0.69995) (COMMENT Wsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (KRN D 28 R -0.09998) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 97 R -0.2699) (COMMENT Asmall)
+ (KRN D 116 R -0.35999) (COMMENT Tsmall)
+ (KRN D 118 R -0.30994) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.35999) (COMMENT Xsmall)
+ (KRN D 121 R -0.44995) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 65 R -0.84998) (COMMENT A)
+ (KRN D 97 R -0.75989) (COMMENT Asmall)
+ (KRN D 101 R -0.17993) (COMMENT Esmall)
+ (KRN D 104 R -0.17993) (COMMENT Hsmall)
+ (KRN D 105 R -0.17993) (COMMENT Ismall)
+ (KRN D 16 R -0.17993) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 97 R -0.2699) (COMMENT Asmall)
+ (KRN D 116 R -0.35999) (COMMENT Tsmall)
+ (KRN D 117 R -0.21997) (COMMENT Usmall)
+ (KRN D 118 R -0.30994) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.35999) (COMMENT Xsmall)
+ (KRN D 121 R -0.44995) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.31995) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.25989) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.22998) (COMMENT Vsmall)
+ (KRN D 119 R -0.15991) (COMMENT Wsmall)
+ (KRN D 120 R 0.17993) (COMMENT Xsmall)
+ (KRN D 121 R -0.2799) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 39 R -0.1499) (COMMENT quoteright)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 59 R -0.5) (COMMENT semicolon)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 41 R 0.3999) (COMMENT parenright)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 44 R -0.94995) (COMMENT comma)
+ (KRN D 93 R 0.3999) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.1499) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 97 R -0.45996) (COMMENT Asmall)
+ (KRN D 99 R -0.21997) (COMMENT Csmall)
+ (KRN D 103 R -0.21997) (COMMENT Gsmall)
+ (KRN D 111 R -0.21997) (COMMENT Osmall)
+ (KRN D 113 R -0.21997) (COMMENT Qsmall)
+ (KRN D 115 R -0.09998) (COMMENT Ssmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 118 R 0.04993) (COMMENT Vsmall)
+ (KRN D 119 R 0.12988) (COMMENT Wsmall)
+ (KRN D 120 R 0.08997) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.21997) (COMMENT Oslashsmall)
+ (KRN D 25 R -0.09998) (COMMENT SSsmall)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 65 R -0.5) (COMMENT A)
+ (KRN D 97 R -0.44995) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -1.34998) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 44 R -1.34998) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 97 R -0.53992) (COMMENT Asmall)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 45 R -0.69995) (COMMENT hyphen)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 97 R -0.5199) (COMMENT Asmall)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R 0.17993) (COMMENT Asmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.20996) (COMMENT Qsmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.59998) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.3999) (COMMENT Q)
+ (KRN D 79 R -0.3999) (COMMENT O)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 67 R -0.3999) (COMMENT C)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 31 R -0.3999) (COMMENT Oslash)
+ (KRN D 97 R -0.48999) (COMMENT Asmall)
+ (KRN D 99 R -0.35999) (COMMENT Csmall)
+ (KRN D 103 R -0.35999) (COMMENT Gsmall)
+ (KRN D 111 R -0.35999) (COMMENT Osmall)
+ (KRN D 113 R -0.35999) (COMMENT Qsmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 118 R 0.09998) (COMMENT Vsmall)
+ (KRN D 119 R 0.09998) (COMMENT Wsmall)
+ (KRN D 120 R 0.09998) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.35999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.25) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R 0.21997) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.59998) (COMMENT J)
+ (KRN D 106 R 0.53992) (COMMENT Jsmall)
+ (KRN D 116 R 0.30994) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.53992) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R 0.3999) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 97 R -1.08997) (COMMENT Asmall)
+ (KRN D 106 R -0.20996) (COMMENT Jsmall)
+ (KRN D 116 R 0.15991) (COMMENT Tsmall)
+ (KRN D 118 R 0.35999) (COMMENT Vsmall)
+ (KRN D 119 R 0.35999) (COMMENT Wsmall)
+ (KRN D 120 R 0.17993) (COMMENT Xsmall)
+ (KRN D 121 R 0.2699) (COMMENT Ysmall)
+ (KRN D 17 R -0.20996) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 96 R -0.29993) (COMMENT quoteleft)
+ (KRN D 89 R 0.34998) (COMMENT Y)
+ (KRN D 88 R 0.29993) (COMMENT X)
+ (KRN D 87 R 0.34998) (COMMENT W)
+ (KRN D 86 R 0.34998) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 97 R -1.08997) (COMMENT Asmall)
+ (KRN D 106 R -0.20996) (COMMENT Jsmall)
+ (KRN D 116 R 0.30994) (COMMENT Tsmall)
+ (KRN D 118 R 0.30994) (COMMENT Vsmall)
+ (KRN D 119 R 0.30994) (COMMENT Wsmall)
+ (KRN D 120 R 0.2699) (COMMENT Xsmall)
+ (KRN D 121 R 0.30994) (COMMENT Ysmall)
+ (KRN D 17 R -0.20996) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 97) (COMMENT Asmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.71997) (COMMENT quotedblright)
+ (KRN D 89 R -0.56995) (COMMENT Y)
+ (KRN D 88 R -0.15991) (COMMENT X)
+ (KRN D 87 R -0.47998) (COMMENT W)
+ (KRN D 86 R -0.62988) (COMMENT V)
+ (KRN D 85 R -0.35999) (COMMENT U)
+ (KRN D 84 R -0.5199) (COMMENT T)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.15991) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 31 R -0.15991) (COMMENT Oslash)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.1399) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 116 R -0.45996) (COMMENT Tsmall)
+ (KRN D 117 R -0.31995) (COMMENT Usmall)
+ (KRN D 118 R -0.55994) (COMMENT Vsmall)
+ (KRN D 119 R -0.42993) (COMMENT Wsmall)
+ (KRN D 120 R -0.1399) (COMMENT Xsmall)
+ (KRN D 121 R -0.50989) (COMMENT Ysmall)
+ (KRN D 28 R -0.1399) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 98) (COMMENT Bsmall)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.21997) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.18994) (COMMENT Usmall)
+ (KRN D 118 R -0.15991) (COMMENT Vsmall)
+ (KRN D 119 R -0.15991) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 99) (COMMENT Csmall)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 100) (COMMENT Dsmall)
+ (KRN D 46 R -0.35999) (COMMENT period)
+ (KRN D 44 R -0.35999) (COMMENT comma)
+ (KRN D 89 R -0.53992) (COMMENT Y)
+ (KRN D 87 R -0.35999) (COMMENT W)
+ (KRN D 86 R -0.35999) (COMMENT V)
+ (KRN D 118 R -0.31995) (COMMENT Vsmall)
+ (KRN D 119 R -0.31995) (COMMENT Wsmall)
+ (KRN D 121 R -0.47998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 101) (COMMENT Esmall)
+ (KRN D 46 R 0.08997) (COMMENT period)
+ (KRN D 44 R 0.08997) (COMMENT comma)
+ (KRN D 89 R -0.04993) (COMMENT Y)
+ (KRN D 87 R -0.04993) (COMMENT W)
+ (KRN D 86 R -0.04993) (COMMENT V)
+ (KRN D 118 R -0.03992) (COMMENT Vsmall)
+ (KRN D 119 R -0.03992) (COMMENT Wsmall)
+ (KRN D 121 R -0.03992) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 102) (COMMENT Fsmall)
+ (LIG D 105 D 12) (COMMENT Ismall FIsmall)
+ (LIG D 102 D 11) (COMMENT Fsmall FFsmall)
+ (LIG D 108 D 13) (COMMENT Lsmall FLsmall)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -1.34998) (COMMENT period)
+ (KRN D 44 R -1.34998) (COMMENT comma)
+ (KRN D 65 R -0.53992) (COMMENT A)
+ (KRN D 97 R -0.47998) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 103) (COMMENT Gsmall)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT Jsmall)
+ (KRN D 93 R 0.12988) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 107) (COMMENT Ksmall)
+ (KRN D 81 R -0.31995) (COMMENT Q)
+ (KRN D 79 R -0.31995) (COMMENT O)
+ (KRN D 71 R -0.31995) (COMMENT G)
+ (KRN D 67 R -0.31995) (COMMENT C)
+ (KRN D 65 R 0.17993) (COMMENT A)
+ (KRN D 31 R -0.31995) (COMMENT Oslash)
+ (KRN D 97 R 0.15991) (COMMENT Asmall)
+ (KRN D 99 R -0.2799) (COMMENT Csmall)
+ (KRN D 103 R -0.2799) (COMMENT Gsmall)
+ (KRN D 111 R -0.2799) (COMMENT Osmall)
+ (KRN D 113 R -0.2799) (COMMENT Qsmall)
+ (KRN D 28 R -0.2799) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 108) (COMMENT Lsmall)
+ (KRN D 39 R -1.16992) (COMMENT quoteright)
+ (KRN D 34 R -1.16992) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 87 R -0.69995) (COMMENT W)
+ (KRN D 86 R -0.84998) (COMMENT V)
+ (KRN D 85 R -0.2799) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R 0.2699) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R 0.23999) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R -0.6399) (COMMENT Tsmall)
+ (KRN D 117 R -0.25) (COMMENT Usmall)
+ (KRN D 118 R -0.75989) (COMMENT Vsmall)
+ (KRN D 119 R -0.62988) (COMMENT Wsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 111) (COMMENT Osmall)
+ (KRN D 46 R -0.35999) (COMMENT period)
+ (KRN D 44 R -0.35999) (COMMENT comma)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R -0.35999) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.30994) (COMMENT V)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.2699) (COMMENT A)
+ (KRN D 97 R -0.23999) (COMMENT Asmall)
+ (KRN D 116 R -0.31995) (COMMENT Tsmall)
+ (KRN D 118 R -0.2699) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.31995) (COMMENT Xsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 112) (COMMENT Psmall)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 45 R -0.2699) (COMMENT hyphen)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 73 R -0.17993) (COMMENT I)
+ (KRN D 72 R -0.17993) (COMMENT H)
+ (KRN D 69 R -0.17993) (COMMENT E)
+ (KRN D 65 R -0.75989) (COMMENT A)
+ (KRN D 97 R -0.67993) (COMMENT Asmall)
+ (KRN D 101 R -0.15991) (COMMENT Esmall)
+ (KRN D 104 R -0.15991) (COMMENT Hsmall)
+ (KRN D 105 R -0.15991) (COMMENT Ismall)
+ (KRN D 16 R -0.15991) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 113) (COMMENT Qsmall)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R -0.35999) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.30994) (COMMENT V)
+ (KRN D 85 R -0.21997) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.2699) (COMMENT A)
+ (KRN D 97 R -0.23999) (COMMENT Asmall)
+ (KRN D 116 R -0.31995) (COMMENT Tsmall)
+ (KRN D 117 R -0.18994) (COMMENT Usmall)
+ (KRN D 118 R -0.2699) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.31995) (COMMENT Xsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 114) (COMMENT Rsmall)
+ (KRN D 39 R -0.08997) (COMMENT quoteright)
+ (KRN D 34 R -0.08997) (COMMENT quotedblright)
+ (KRN D 89 R -0.2799) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R -0.15991) (COMMENT W)
+ (KRN D 86 R -0.22998) (COMMENT V)
+ (KRN D 85 R -0.2699) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 81 R -0.08997) (COMMENT Q)
+ (KRN D 79 R -0.08997) (COMMENT O)
+ (KRN D 71 R -0.08997) (COMMENT G)
+ (KRN D 67 R -0.08997) (COMMENT C)
+ (KRN D 31 R -0.08997) (COMMENT Oslash)
+ (KRN D 99 R -0.07996) (COMMENT Csmall)
+ (KRN D 103 R -0.07996) (COMMENT Gsmall)
+ (KRN D 111 R -0.07996) (COMMENT Osmall)
+ (KRN D 113 R -0.07996) (COMMENT Qsmall)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.23999) (COMMENT Usmall)
+ (KRN D 118 R -0.19995) (COMMENT Vsmall)
+ (KRN D 119 R -0.1399) (COMMENT Wsmall)
+ (KRN D 120 R 0.15991) (COMMENT Xsmall)
+ (KRN D 121 R -0.25) (COMMENT Ysmall)
+ (KRN D 28 R -0.07996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 115) (COMMENT Ssmall)
+ (KRN D 39 R -0.12988) (COMMENT quoteright)
+ (KRN D 34 R -0.12988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT Tsmall)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 39 R 0.20996) (COMMENT quoteright)
+ (KRN D 34 R 0.20996) (COMMENT quotedblright)
+ (KRN D 46 R -0.84998) (COMMENT period)
+ (KRN D 41 R 0.35999) (COMMENT parenright)
+ (KRN D 45 R -0.98999) (COMMENT hyphen)
+ (KRN D 44 R -0.84998) (COMMENT comma)
+ (KRN D 93 R 0.35999) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.08997) (COMMENT X)
+ (KRN D 87 R 0.12988) (COMMENT W)
+ (KRN D 86 R 0.04993) (COMMENT V)
+ (KRN D 84 R 0.2699) (COMMENT T)
+ (KRN D 83 R -0.09998) (COMMENT S)
+ (KRN D 81 R -0.21997) (COMMENT Q)
+ (KRN D 79 R -0.21997) (COMMENT O)
+ (KRN D 71 R -0.21997) (COMMENT G)
+ (KRN D 67 R -0.21997) (COMMENT C)
+ (KRN D 65 R -0.45996) (COMMENT A)
+ (KRN D 31 R -0.21997) (COMMENT Oslash)
+ (KRN D 97 R -0.40991) (COMMENT Asmall)
+ (KRN D 99 R -0.18994) (COMMENT Csmall)
+ (KRN D 103 R -0.18994) (COMMENT Gsmall)
+ (KRN D 111 R -0.18994) (COMMENT Osmall)
+ (KRN D 113 R -0.18994) (COMMENT Qsmall)
+ (KRN D 115 R -0.08997) (COMMENT Ssmall)
+ (KRN D 116 R 0.23999) (COMMENT Tsmall)
+ (KRN D 118 R 0.03992) (COMMENT Vsmall)
+ (KRN D 119 R 0.10999) (COMMENT Wsmall)
+ (KRN D 120 R 0.07996) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.18994) (COMMENT Oslashsmall)
+ (KRN D 25 R -0.08997) (COMMENT SSsmall)
+ (STOP)
+ (LABEL D 117) (COMMENT Usmall)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 97 R -0.3999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 118) (COMMENT Vsmall)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.31995) (COMMENT quotedblright)
+ (KRN D 46 R -1.20996) (COMMENT period)
+ (KRN D 41 R 0.71997) (COMMENT parenright)
+ (KRN D 45 R -0.80994) (COMMENT hyphen)
+ (KRN D 44 R -1.20996) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.71997) (COMMENT bracketright)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.53992) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R -0.47998) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 119) (COMMENT Wsmall)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.20996) (COMMENT quotedblright)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.71997) (COMMENT parenright)
+ (KRN D 45 R -0.62988) (COMMENT hyphen)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.71997) (COMMENT bracketright)
+ (KRN D 84 R 0.2699) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R -0.45996) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 116 R 0.23999) (COMMENT Tsmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 120) (COMMENT Xsmall)
+ (KRN D 39 R 0.12988) (COMMENT quoteright)
+ (KRN D 81 R -0.20996) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 65 R 0.17993) (COMMENT A)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 97 R 0.15991) (COMMENT Asmall)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 121) (COMMENT Ysmall)
+ (KRN D 59 R -0.32996) (COMMENT semicolon)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.31995) (COMMENT quotedblright)
+ (KRN D 46 R -0.80994) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 44 R -0.80994) (COMMENT comma)
+ (KRN D 58 R -0.53992) (COMMENT colon)
+ (KRN D 93 R 0.71997) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.09998) (COMMENT W)
+ (KRN D 86 R 0.09998) (COMMENT V)
+ (KRN D 84 R 0.2699) (COMMENT T)
+ (KRN D 81 R -0.35999) (COMMENT Q)
+ (KRN D 79 R -0.35999) (COMMENT O)
+ (KRN D 71 R -0.35999) (COMMENT G)
+ (KRN D 67 R -0.35999) (COMMENT C)
+ (KRN D 65 R -0.48999) (COMMENT A)
+ (KRN D 31 R -0.35999) (COMMENT Oslash)
+ (KRN D 97 R -0.43994) (COMMENT Asmall)
+ (KRN D 99 R -0.31995) (COMMENT Csmall)
+ (KRN D 103 R -0.31995) (COMMENT Gsmall)
+ (KRN D 111 R -0.31995) (COMMENT Osmall)
+ (KRN D 113 R -0.31995) (COMMENT Qsmall)
+ (KRN D 116 R 0.23999) (COMMENT Tsmall)
+ (KRN D 118 R 0.08997) (COMMENT Vsmall)
+ (KRN D 119 R 0.08997) (COMMENT Wsmall)
+ (KRN D 120 R 0.08997) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.31995) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 122) (COMMENT Zsmall)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.15991) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 65 R 0.21997) (COMMENT A)
+ (KRN D 31 R -0.15991) (COMMENT Oslash)
+ (KRN D 97 R 0.18994) (COMMENT Asmall)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.1399) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 28 R -0.1399) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 97 R 0.2699) (COMMENT Asmall)
+ (KRN D 99 R -0.09998) (COMMENT Csmall)
+ (KRN D 103 R -0.09998) (COMMENT Gsmall)
+ (KRN D 111 R -0.09998) (COMMENT Osmall)
+ (KRN D 113 R -0.09998) (COMMENT Qsmall)
+ (KRN D 116 R -0.71997) (COMMENT Tsmall)
+ (KRN D 117 R -0.2799) (COMMENT Usmall)
+ (KRN D 118 R -0.84998) (COMMENT Vsmall)
+ (KRN D 119 R -0.69995) (COMMENT Wsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (KRN D 28 R -0.09998) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 170) (COMMENT Lslashsmall)
+ (KRN D 39 R -1.16992) (COMMENT quoteright)
+ (KRN D 34 R -1.16992) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 87 R -0.69995) (COMMENT W)
+ (KRN D 86 R -0.84998) (COMMENT V)
+ (KRN D 85 R -0.2799) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R 0.2699) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R 0.23999) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R -0.6399) (COMMENT Tsmall)
+ (KRN D 117 R -0.25) (COMMENT Usmall)
+ (KRN D 118 R -0.75989) (COMMENT Vsmall)
+ (KRN D 119 R -0.62988) (COMMENT Wsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 11 (COMMENT FFsmall)
+ (CHARWD R 10.47998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 12 (COMMENT FIsmall)
+ (CHARWD R 8.80994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 13 (COMMENT FLsmall)
+ (CHARWD R 10.41992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 14 (COMMENT FFIsmall)
+ (CHARWD R 14.04993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 15 (COMMENT FFLsmall)
+ (CHARWD R 15.65991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessIsmall)
+ (CHARWD R 3.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessJsmall)
+ (CHARWD R 3.57996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.15991)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.79993)
+ (CHARHT R 6.73999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.93994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (MOVERIGHT R 1.06995)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.06995)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.79993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 25 (COMMENT SSsmall)
+ (CHARWD R 9.95996)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 26 (COMMENT AEsmall)
+ (CHARWD R 7.5299)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 27 (COMMENT OEsmall)
+ (CHARWD R 8.8899)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 28 (COMMENT Oslashsmall)
+ (CHARWD R 6.6399)
+ (CHARHT R 5.96997)
+ (CHARDP R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 9.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.98999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 3.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 9.37)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 3.0199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 4.1499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 4.1499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.91992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.5)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 3.29993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 4.41992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 3.29993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 3.29993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 3.29993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 3.2799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.5)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 5.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 5.05994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.82996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 7.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 7.3899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 8.2699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 6.42993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.75989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.56995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 4.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 4.35999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.56995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.8899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 7.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 7.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 6.10999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 8.35999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.94995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.66992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.6399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 3.0199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 97 (COMMENT Asmall)
+ (CHARWD R 5.6499)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 98 (COMMENT Bsmall)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 99 (COMMENT Csmall)
+ (CHARWD R 6.00989)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 100 (COMMENT Dsmall)
+ (CHARWD R 6.70996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 101 (COMMENT Esmall)
+ (CHARWD R 5.5299)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 102 (COMMENT Fsmall)
+ (CHARWD R 5.23999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 103 (COMMENT Gsmall)
+ (CHARWD R 6.29993)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 104 (COMMENT Hsmall)
+ (CHARWD R 6.94995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 105 (COMMENT Ismall)
+ (CHARWD R 3.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 106 (COMMENT Jsmall)
+ (CHARWD R 3.57996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 107 (COMMENT Ksmall)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 108 (COMMENT Lsmall)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 109 (COMMENT Msmall)
+ (CHARWD R 7.83997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 110 (COMMENT Nsmall)
+ (CHARWD R 6.40991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 111 (COMMENT Osmall)
+ (CHARWD R 6.6399)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 112 (COMMENT Psmall)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 113 (COMMENT Qsmall)
+ (CHARWD R 6.6399)
+ (CHARHT R 5.6499)
+ (CHARDP R 1.53992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 114 (COMMENT Rsmall)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 115 (COMMENT Ssmall)
+ (CHARWD R 4.97998)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 116 (COMMENT Tsmall)
+ (CHARWD R 5.48999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 117 (COMMENT Usmall)
+ (CHARWD R 6.7799)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 118 (COMMENT Vsmall)
+ (CHARWD R 5.65991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 119 (COMMENT Wsmall)
+ (CHARWD R 7.95996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 120 (COMMENT Xsmall)
+ (CHARWD R 5.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 121 (COMMENT Ysmall)
+ (CHARWD R 5.42993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 122 (COMMENT Zsmall)
+ (CHARWD R 5.40991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.5)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.5)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 6.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putb8r at 10.0pt)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 170 (COMMENT Lslashsmall)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+
+(COMMENT END OF FILE putbc7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbi7t.vpl b/fonts/utilities/vfinst/example/putbi7t.vpl
new file mode 100644
index 0000000000..7b50cad4e5
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbi7t.vpl
@@ -0,0 +1,2424 @@
+(VTITLE virtual font putbi7t created by fontinst v1.500)
+
+(COMMENT Filename: putbi7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1i}{putbi7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbi7t.vpl putbi7t.vf putbi7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putbi8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.17993) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 120 R 0.15991) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.91992) (COMMENT quoteright)
+ (KRN D 34 R -0.91992) (COMMENT quotedblright)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.03992) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.55994) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.45996) (COMMENT W)
+ (KRN D 86 R -0.75) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.59998) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.31995) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.03992) (COMMENT e)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.12) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.6499) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 120 R 0.1499) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.25) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 106 R -0.19995) (COMMENT j)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 103 R -0.23999) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.31995) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.23999) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R 0.1499) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.5) (COMMENT Q)
+ (KRN D 79 R -0.5) (COMMENT O)
+ (KRN D 71 R -0.5) (COMMENT G)
+ (KRN D 67 R -0.5) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.5) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 106 R -0.34998) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.15991) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 46 R -1.69995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 73 R -0.44995) (COMMENT I)
+ (KRN D 72 R -0.44995) (COMMENT H)
+ (KRN D 69 R -0.44995) (COMMENT E)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.21997) (COMMENT quoteright)
+ (KRN D 34 R -0.21997) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R 0.1499) (COMMENT X)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 81 R -0.07996) (COMMENT Q)
+ (KRN D 79 R -0.07996) (COMMENT O)
+ (KRN D 71 R -0.07996) (COMMENT G)
+ (KRN D 67 R -0.07996) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.07996) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.17993) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.47998) (COMMENT z)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.53992) (COMMENT w)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 59 R -0.05994) (COMMENT semicolon)
+ (KRN D 115 R -0.59998) (COMMENT s)
+ (KRN D 114 R -0.53992) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 41 R 0.25) (COMMENT parenright)
+ (KRN D 111 R -0.7799) (COMMENT o)
+ (KRN D 109 R -0.53992) (COMMENT m)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.7799) (COMMENT e)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.7799) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.29993) (COMMENT W)
+ (KRN D 86 R 0.19995) (COMMENT V)
+ (KRN D 84 R 0.3999) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.7799) (COMMENT oe)
+ (KRN D 28 R -0.7799) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 112 R -0.29993) (COMMENT p)
+ (KRN D 110 R -0.29993) (COMMENT n)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.33997) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.54993) (COMMENT r)
+ (KRN D 39 R 0.45996) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.09998) (COMMENT t)
+ (KRN D 59 R -0.12) (COMMENT semicolon)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.41992) (COMMENT quoteright)
+ (KRN D 34 R 0.54993) (COMMENT quotedblright)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.54993) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R 0.15991) (COMMENT h)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.12) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.44995) (COMMENT Q)
+ (KRN D 79 R -0.44995) (COMMENT O)
+ (KRN D 71 R -0.44995) (COMMENT G)
+ (KRN D 67 R -0.44995) (COMMENT C)
+ (KRN D 31 R -0.44995) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.69995) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.55994) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.04993) (COMMENT parenright)
+ (KRN D 111 R -0.94995) (COMMENT o)
+ (KRN D 108 R 0.1499) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.94995) (COMMENT e)
+ (KRN D 100 R -0.84998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.19995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.84998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.94995) (COMMENT oe)
+ (KRN D 28 R -0.94995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.59998) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.29993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.59998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R 0.04993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.5) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.44995) (COMMENT X)
+ (KRN D 87 R 0.54993) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.45996) (COMMENT X)
+ (KRN D 87 R 0.45996) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.53992) (COMMENT quoteright)
+ (KRN D 34 R -0.53992) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.5) (COMMENT y)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 112 R 0.29993) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.87988) (COMMENT quoteright)
+ (KRN D 34 R -0.87988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5199) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.04993) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.05994) (COMMENT quoteright)
+ (KRN D 34 R -0.05994) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.6499) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (KRN D 46 R 0.19995) (COMMENT period)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.55994) (COMMENT period)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.55994) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.95996)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.98999)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 10.0)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.32996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.32996)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 8.31995)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.57996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.50989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 163) (COMMENT sterling)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.87988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.97998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7699)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.96997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.95996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.7799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.19995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.56995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.28992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.42993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putbi7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbi8a.afm b/fonts/utilities/vfinst/example/putbi8a.afm
new file mode 100644
index 0000000000..5e8384852c
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbi8a.afm
@@ -0,0 +1,1017 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri Jan 17 15:47:44 1992
+Comment UniqueID 37716
+Comment VMusage 34427 41319
+FontName Utopia-BoldItalic
+FullName Utopia Bold Italic
+FamilyName Utopia
+Weight Bold
+ItalicAngle -13
+IsFixedPitch false
+FontBBox -176 -250 1262 916
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.002
+Notice Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 502
+Ascender 742
+Descender -242
+StartCharMetrics 228
+C 32 ; WX 210 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 285 ; N exclam ; B 35 -12 336 707 ;
+C 34 ; WX 455 ; N quotedbl ; B 142 407 496 707 ;
+C 35 ; WX 560 ; N numbersign ; B 37 0 606 668 ;
+C 36 ; WX 560 ; N dollar ; B 32 -104 588 748 ;
+C 37 ; WX 896 ; N percent ; B 106 -31 861 702 ;
+C 38 ; WX 752 ; N ampersand ; B 62 -12 736 680 ;
+C 39 ; WX 246 ; N quoteright ; B 95 387 294 707 ;
+C 40 ; WX 350 ; N parenleft ; B 87 -135 438 699 ;
+C 41 ; WX 350 ; N parenright ; B -32 -135 319 699 ;
+C 42 ; WX 500 ; N asterisk ; B 121 315 528 707 ;
+C 43 ; WX 600 ; N plus ; B 83 0 567 490 ;
+C 44 ; WX 280 ; N comma ; B -9 -167 207 180 ;
+C 45 ; WX 392 ; N hyphen ; B 71 203 354 298 ;
+C 46 ; WX 280 ; N period ; B 32 -12 212 166 ;
+C 47 ; WX 260 ; N slash ; B -16 -15 370 707 ;
+C 48 ; WX 560 ; N zero ; B 57 -12 583 680 ;
+C 49 ; WX 560 ; N one ; B 72 0 470 680 ;
+C 50 ; WX 560 ; N two ; B 4 0 578 680 ;
+C 51 ; WX 560 ; N three ; B 21 -12 567 680 ;
+C 52 ; WX 560 ; N four ; B 28 0 557 668 ;
+C 53 ; WX 560 ; N five ; B 23 -12 593 668 ;
+C 54 ; WX 560 ; N six ; B 56 -12 586 680 ;
+C 55 ; WX 560 ; N seven ; B 112 -12 632 668 ;
+C 56 ; WX 560 ; N eight ; B 37 -12 584 680 ;
+C 57 ; WX 560 ; N nine ; B 48 -12 570 680 ;
+C 58 ; WX 280 ; N colon ; B 32 -12 280 490 ;
+C 59 ; WX 280 ; N semicolon ; B -9 -167 280 490 ;
+C 60 ; WX 600 ; N less ; B 66 5 544 495 ;
+C 61 ; WX 600 ; N equal ; B 83 103 567 397 ;
+C 62 ; WX 600 ; N greater ; B 86 5 564 495 ;
+C 63 ; WX 454 ; N question ; B 115 -12 515 707 ;
+C 64 ; WX 828 ; N at ; B 90 -15 842 707 ;
+C 65 ; WX 634 ; N A ; B -59 0 639 692 ;
+C 66 ; WX 680 ; N B ; B 5 0 689 692 ;
+C 67 ; WX 672 ; N C ; B 76 -15 742 707 ;
+C 68 ; WX 774 ; N D ; B 5 0 784 692 ;
+C 69 ; WX 622 ; N E ; B 5 0 687 692 ;
+C 70 ; WX 585 ; N F ; B 5 0 683 692 ;
+C 71 ; WX 726 ; N G ; B 76 -15 756 707 ;
+C 72 ; WX 800 ; N H ; B 5 0 880 692 ;
+C 73 ; WX 386 ; N I ; B 5 0 466 692 ;
+C 74 ; WX 388 ; N J ; B -50 -114 477 692 ;
+C 75 ; WX 688 ; N K ; B 5 -6 823 692 ;
+C 76 ; WX 586 ; N L ; B 5 0 591 692 ;
+C 77 ; WX 921 ; N M ; B 0 0 998 692 ;
+C 78 ; WX 741 ; N N ; B -5 0 838 692 ;
+C 79 ; WX 761 ; N O ; B 78 -15 768 707 ;
+C 80 ; WX 660 ; N P ; B 5 0 694 692 ;
+C 81 ; WX 761 ; N Q ; B 78 -193 768 707 ;
+C 82 ; WX 681 ; N R ; B 5 0 696 692 ;
+C 83 ; WX 551 ; N S ; B 31 -15 570 707 ;
+C 84 ; WX 616 ; N T ; B 91 0 722 692 ;
+C 85 ; WX 776 ; N U ; B 115 -15 867 692 ;
+C 86 ; WX 630 ; N V ; B 92 0 783 692 ;
+C 87 ; WX 920 ; N W ; B 80 0 1062 692 ;
+C 88 ; WX 630 ; N X ; B -56 0 744 692 ;
+C 89 ; WX 622 ; N Y ; B 92 0 765 692 ;
+C 90 ; WX 618 ; N Z ; B -30 0 714 692 ;
+C 91 ; WX 350 ; N bracketleft ; B 56 -128 428 692 ;
+C 92 ; WX 460 ; N backslash ; B 114 -15 425 707 ;
+C 93 ; WX 350 ; N bracketright ; B -22 -128 350 692 ;
+C 94 ; WX 600 ; N asciicircum ; B 79 215 567 668 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 246 ; N quoteleft ; B 114 399 313 719 ;
+C 97 ; WX 596 ; N a ; B 26 -12 612 502 ;
+C 98 ; WX 586 ; N b ; B 34 -12 592 742 ;
+C 99 ; WX 456 ; N c ; B 38 -12 498 502 ;
+C 100 ; WX 609 ; N d ; B 29 -12 651 742 ;
+C 101 ; WX 476 ; N e ; B 38 -12 497 502 ;
+C 102 ; WX 348 ; N f ; B -129 -242 553 742 ; L i fi ; L l fl ;
+C 103 ; WX 522 ; N g ; B -14 -242 609 512 ;
+C 104 ; WX 629 ; N h ; B 44 -12 631 742 ;
+C 105 ; WX 339 ; N i ; B 66 -12 357 720 ;
+C 106 ; WX 333 ; N j ; B -120 -242 364 720 ;
+C 107 ; WX 570 ; N k ; B 39 -12 604 742 ;
+C 108 ; WX 327 ; N l ; B 62 -12 360 742 ;
+C 109 ; WX 914 ; N m ; B 46 -12 917 502 ;
+C 110 ; WX 635 ; N n ; B 45 -12 639 502 ;
+C 111 ; WX 562 ; N o ; B 42 -12 556 502 ;
+C 112 ; WX 606 ; N p ; B 0 -242 613 502 ;
+C 113 ; WX 584 ; N q ; B 29 -242 604 513 ;
+C 114 ; WX 440 ; N r ; B 51 -12 497 502 ;
+C 115 ; WX 417 ; N s ; B 10 -12 432 502 ;
+C 116 ; WX 359 ; N t ; B 68 -12 428 641 ;
+C 117 ; WX 634 ; N u ; B 71 -12 643 502 ;
+C 118 ; WX 518 ; N v ; B 68 -12 547 502 ;
+C 119 ; WX 795 ; N w ; B 70 -12 826 502 ;
+C 120 ; WX 516 ; N x ; B -26 -12 546 502 ;
+C 121 ; WX 489 ; N y ; B -49 -242 532 502 ;
+C 122 ; WX 466 ; N z ; B -17 -12 506 490 ;
+C 123 ; WX 340 ; N braceleft ; B 90 -128 439 692 ;
+C 124 ; WX 265 ; N bar ; B 117 -250 221 750 ;
+C 125 ; WX 340 ; N braceright ; B -42 -128 307 692 ;
+C 126 ; WX 600 ; N asciitilde ; B 70 157 571 338 ;
+C 161 ; WX 285 ; N exclamdown ; B -13 -217 288 502 ;
+C 162 ; WX 560 ; N cent ; B 80 -21 611 668 ;
+C 163 ; WX 560 ; N sterling ; B -4 0 583 679 ;
+C 164 ; WX 100 ; N fraction ; B -176 -27 370 695 ;
+C 165 ; WX 560 ; N yen ; B 65 0 676 668 ;
+C 166 ; WX 560 ; N florin ; B -16 -135 635 691 ;
+C 167 ; WX 568 ; N section ; B 64 -115 559 707 ;
+C 168 ; WX 560 ; N currency ; B 60 73 578 596 ;
+C 169 ; WX 246 ; N quotesingle ; B 134 376 285 707 ;
+C 170 ; WX 455 ; N quotedblleft ; B 114 399 522 719 ;
+C 171 ; WX 560 ; N guillemotleft ; B 90 37 533 464 ;
+C 172 ; WX 360 ; N guilsinglleft ; B 90 37 333 464 ;
+C 173 ; WX 360 ; N guilsinglright ; B 58 37 301 464 ;
+C 174 ; WX 651 ; N fi ; B -129 -242 655 742 ;
+C 175 ; WX 652 ; N fl ; B -129 -242 685 742 ;
+C 177 ; WX 500 ; N endash ; B 12 209 531 292 ;
+C 178 ; WX 514 ; N dagger ; B 101 -125 545 707 ;
+C 179 ; WX 490 ; N daggerdbl ; B 32 -119 528 707 ;
+C 180 ; WX 280 ; N periodcentered ; B 67 161 247 339 ;
+C 182 ; WX 580 ; N paragraph ; B 110 -101 653 692 ;
+C 183 ; WX 465 ; N bullet ; B 99 174 454 529 ;
+C 184 ; WX 246 ; N quotesinglbase ; B -17 -153 182 167 ;
+C 185 ; WX 455 ; N quotedblbase ; B -17 -153 391 167 ;
+C 186 ; WX 455 ; N quotedblright ; B 95 387 503 707 ;
+C 187 ; WX 560 ; N guillemotright ; B 58 37 502 464 ;
+C 188 ; WX 1000 ; N ellipsis ; B 85 -12 931 166 ;
+C 189 ; WX 1297 ; N perthousand ; B 106 -31 1262 702 ;
+C 191 ; WX 454 ; N questiondown ; B -10 -217 391 502 ;
+C 193 ; WX 400 ; N grave ; B 109 511 381 740 ;
+C 194 ; WX 400 ; N acute ; B 186 511 458 740 ;
+C 195 ; WX 400 ; N circumflex ; B 93 520 471 747 ;
+C 196 ; WX 400 ; N tilde ; B 94 549 502 697 ;
+C 197 ; WX 400 ; N macron ; B 133 592 459 664 ;
+C 198 ; WX 400 ; N breve ; B 146 556 469 714 ;
+C 199 ; WX 402 ; N dotaccent ; B 220 561 378 710 ;
+C 200 ; WX 400 ; N dieresis ; B 106 561 504 710 ;
+C 202 ; WX 400 ; N ring ; B 166 529 423 762 ;
+C 203 ; WX 400 ; N cedilla ; B 85 -246 292 0 ;
+C 205 ; WX 400 ; N hungarumlaut ; B 158 546 482 750 ;
+C 206 ; WX 350 ; N ogonek ; B 38 -246 253 0 ;
+C 207 ; WX 400 ; N caron ; B 130 520 508 747 ;
+C 208 ; WX 1000 ; N emdash ; B 12 209 1031 292 ;
+C 225 ; WX 890 ; N AE ; B -107 0 958 692 ;
+C 227 ; WX 444 ; N ordfeminine ; B 62 265 482 590 ;
+C 232 ; WX 592 ; N Lslash ; B 11 0 597 692 ;
+C 233 ; WX 761 ; N Oslash ; B 77 -51 769 734 ;
+C 234 ; WX 1016 ; N OE ; B 76 0 1084 692 ;
+C 235 ; WX 412 ; N ordmasculine ; B 86 265 446 590 ;
+C 241 ; WX 789 ; N ae ; B 26 -12 810 509 ;
+C 245 ; WX 339 ; N dotlessi ; B 66 -12 343 502 ;
+C 248 ; WX 339 ; N lslash ; B 18 -12 420 742 ;
+C 249 ; WX 562 ; N oslash ; B 42 -69 556 549 ;
+C 250 ; WX 811 ; N oe ; B 42 -12 832 502 ;
+C 251 ; WX 628 ; N germandbls ; B -129 -242 692 742 ;
+C -1 ; WX 402 ; N onesuperior ; B 84 272 361 680 ;
+C -1 ; WX 600 ; N minus ; B 83 210 567 290 ;
+C -1 ; WX 375 ; N degree ; B 93 360 425 680 ;
+C -1 ; WX 562 ; N oacute ; B 42 -12 572 755 ;
+C -1 ; WX 761 ; N Odieresis ; B 78 -15 768 881 ;
+C -1 ; WX 562 ; N odieresis ; B 42 -12 585 710 ;
+C -1 ; WX 622 ; N Eacute ; B 5 0 687 904 ;
+C -1 ; WX 634 ; N ucircumflex ; B 71 -12 643 747 ;
+C -1 ; WX 940 ; N onequarter ; B 104 -27 849 695 ;
+C -1 ; WX 600 ; N logicalnot ; B 83 95 567 397 ;
+C -1 ; WX 622 ; N Ecircumflex ; B 5 0 687 905 ;
+C -1 ; WX 940 ; N onehalf ; B 90 -27 898 695 ;
+C -1 ; WX 761 ; N Otilde ; B 78 -15 768 876 ;
+C -1 ; WX 634 ; N uacute ; B 71 -12 643 740 ;
+C -1 ; WX 476 ; N eacute ; B 38 -12 545 755 ;
+C -1 ; WX 339 ; N iacute ; B 66 -12 438 740 ;
+C -1 ; WX 622 ; N Egrave ; B 5 0 687 904 ;
+C -1 ; WX 339 ; N icircumflex ; B 38 -12 416 747 ;
+C -1 ; WX 634 ; N mu ; B -3 -230 643 502 ;
+C -1 ; WX 265 ; N brokenbar ; B 117 -175 221 675 ;
+C -1 ; WX 600 ; N thorn ; B -6 -242 607 700 ;
+C -1 ; WX 634 ; N Aring ; B -59 0 639 879 ;
+C -1 ; WX 489 ; N yacute ; B -49 -242 553 740 ;
+C -1 ; WX 622 ; N Ydieresis ; B 92 0 765 881 ;
+C -1 ; WX 1100 ; N trademark ; B 103 277 1093 692 ;
+C -1 ; WX 824 ; N registered ; B 91 -15 819 707 ;
+C -1 ; WX 562 ; N ocircumflex ; B 42 -12 556 747 ;
+C -1 ; WX 634 ; N Agrave ; B -59 0 639 904 ;
+C -1 ; WX 551 ; N Scaron ; B 31 -15 612 916 ;
+C -1 ; WX 776 ; N Ugrave ; B 115 -15 867 904 ;
+C -1 ; WX 622 ; N Edieresis ; B 5 0 687 881 ;
+C -1 ; WX 776 ; N Uacute ; B 115 -15 867 904 ;
+C -1 ; WX 562 ; N otilde ; B 42 -12 583 697 ;
+C -1 ; WX 635 ; N ntilde ; B 45 -12 639 697 ;
+C -1 ; WX 489 ; N ydieresis ; B -49 -242 532 710 ;
+C -1 ; WX 634 ; N Aacute ; B -59 0 678 904 ;
+C -1 ; WX 562 ; N eth ; B 42 -12 558 742 ;
+C -1 ; WX 596 ; N acircumflex ; B 26 -12 612 747 ;
+C -1 ; WX 596 ; N aring ; B 26 -12 612 762 ;
+C -1 ; WX 761 ; N Ograve ; B 78 -15 768 904 ;
+C -1 ; WX 456 ; N ccedilla ; B 38 -246 498 502 ;
+C -1 ; WX 600 ; N multiply ; B 110 22 560 478 ;
+C -1 ; WX 600 ; N divide ; B 63 7 547 493 ;
+C -1 ; WX 402 ; N twosuperior ; B 29 272 423 680 ;
+C -1 ; WX 741 ; N Ntilde ; B -5 0 838 876 ;
+C -1 ; WX 634 ; N ugrave ; B 71 -12 643 740 ;
+C -1 ; WX 776 ; N Ucircumflex ; B 115 -15 867 905 ;
+C -1 ; WX 634 ; N Atilde ; B -59 0 662 876 ;
+C -1 ; WX 466 ; N zcaron ; B -17 -12 526 747 ;
+C -1 ; WX 339 ; N idieresis ; B 46 -12 444 710 ;
+C -1 ; WX 634 ; N Acircumflex ; B -59 0 639 905 ;
+C -1 ; WX 386 ; N Icircumflex ; B 5 0 506 905 ;
+C -1 ; WX 622 ; N Yacute ; B 92 0 765 904 ;
+C -1 ; WX 761 ; N Oacute ; B 78 -15 768 904 ;
+C -1 ; WX 634 ; N Adieresis ; B -59 0 652 881 ;
+C -1 ; WX 618 ; N Zcaron ; B -30 0 714 916 ;
+C -1 ; WX 596 ; N agrave ; B 26 -12 612 755 ;
+C -1 ; WX 402 ; N threesuperior ; B 59 265 421 680 ;
+C -1 ; WX 562 ; N ograve ; B 42 -12 556 755 ;
+C -1 ; WX 940 ; N threequarters ; B 95 -27 876 695 ;
+C -1 ; WX 780 ; N Eth ; B 11 0 790 692 ;
+C -1 ; WX 600 ; N plusminus ; B 83 0 567 549 ;
+C -1 ; WX 634 ; N udieresis ; B 71 -12 643 710 ;
+C -1 ; WX 476 ; N edieresis ; B 38 -12 542 710 ;
+C -1 ; WX 596 ; N aacute ; B 26 -12 621 755 ;
+C -1 ; WX 339 ; N igrave ; B 39 -12 343 740 ;
+C -1 ; WX 386 ; N Idieresis ; B 5 0 533 881 ;
+C -1 ; WX 596 ; N adieresis ; B 26 -12 612 710 ;
+C -1 ; WX 386 ; N Iacute ; B 5 0 549 904 ;
+C -1 ; WX 824 ; N copyright ; B 91 -15 819 707 ;
+C -1 ; WX 386 ; N Igrave ; B 5 0 466 904 ;
+C -1 ; WX 672 ; N Ccedilla ; B 76 -246 742 707 ;
+C -1 ; WX 417 ; N scaron ; B 10 -12 522 747 ;
+C -1 ; WX 476 ; N egrave ; B 38 -12 497 755 ;
+C -1 ; WX 761 ; N Ocircumflex ; B 78 -15 768 905 ;
+C -1 ; WX 629 ; N Thorn ; B 5 0 660 692 ;
+C -1 ; WX 596 ; N atilde ; B 26 -12 612 697 ;
+C -1 ; WX 776 ; N Udieresis ; B 115 -15 867 881 ;
+C -1 ; WX 476 ; N ecircumflex ; B 38 -12 524 747 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 697
+
+KPX A z 18
+KPX A y -40
+KPX A x 16
+KPX A w -30
+KPX A v -30
+KPX A u -18
+KPX A t -6
+KPX A s 6
+KPX A r -6
+KPX A quoteright -92
+KPX A quotedblright -92
+KPX A p -6
+KPX A o -18
+KPX A n -12
+KPX A m -12
+KPX A l -18
+KPX A h -6
+KPX A d 4
+KPX A c -6
+KPX A b -6
+KPX A a 10
+KPX A Y -56
+KPX A X -8
+KPX A W -46
+KPX A V -75
+KPX A U -50
+KPX A T -60
+KPX A Q -30
+KPX A O -30
+KPX A G -30
+KPX A C -30
+
+KPX B y -6
+KPX B u -12
+KPX B r -6
+KPX B quoteright -20
+KPX B quotedblright -32
+KPX B o 6
+KPX B l -20
+KPX B k -10
+KPX B i -12
+KPX B h -15
+KPX B e 4
+KPX B a 10
+KPX B W -30
+KPX B V -45
+KPX B U -30
+KPX B T -20
+
+KPX C z -6
+KPX C y -18
+KPX C u -12
+KPX C r -12
+KPX C quoteright 12
+KPX C quotedblright 20
+KPX C i -6
+KPX C e -6
+KPX C a -6
+KPX C Q -12
+KPX C O -12
+KPX C G -12
+KPX C C -12
+
+KPX D y 18
+KPX D quoteright -20
+KPX D quotedblright -20
+KPX D period -20
+KPX D o 6
+KPX D h -15
+KPX D e 6
+KPX D comma -20
+KPX D a 6
+KPX D Y -80
+KPX D W -40
+KPX D V -65
+
+KPX E z -6
+KPX E y -24
+KPX E x 15
+KPX E w -30
+KPX E v -18
+KPX E u -24
+KPX E t -18
+KPX E s -6
+KPX E r -6
+KPX E quoteright 10
+KPX E q 10
+KPX E period 15
+KPX E p -12
+KPX E n -12
+KPX E m -12
+KPX E l -6
+KPX E j -6
+KPX E i -12
+KPX E g -12
+KPX E d 10
+KPX E comma 15
+KPX E a 10
+
+KPX F y -12
+KPX F u -24
+KPX F r -12
+KPX F quoteright 40
+KPX F quotedblright 35
+KPX F period -120
+KPX F o -24
+KPX F i -6
+KPX F e -24
+KPX F comma -110
+KPX F a -30
+KPX F A -45
+
+KPX G y -25
+KPX G u -22
+KPX G r -22
+KPX G quoteright -30
+KPX G quotedblright -30
+KPX G n -22
+KPX G l -24
+KPX G i -12
+KPX G h -18
+KPX G e 5
+
+KPX H y -18
+KPX H u -30
+KPX H o -25
+KPX H i -25
+KPX H e -25
+KPX H a -25
+
+KPX I z -20
+KPX I y -6
+KPX I x -6
+KPX I w -30
+KPX I v -30
+KPX I u -30
+KPX I t -18
+KPX I s -18
+KPX I r -12
+KPX I p -18
+KPX I o -25
+KPX I n -18
+KPX I m -18
+KPX I l -6
+KPX I k -6
+KPX I j -20
+KPX I i -10
+KPX I g -24
+KPX I f -6
+KPX I e -25
+KPX I d -15
+KPX I c -25
+KPX I b -6
+KPX I a -15
+
+KPX J y -12
+KPX J u -32
+KPX J quoteright 6
+KPX J quotedblright 6
+KPX J o -36
+KPX J i -30
+KPX J e -30
+KPX J braceright 15
+KPX J a -36
+
+KPX K y -70
+KPX K w -36
+KPX K v -30
+KPX K u -30
+KPX K r -24
+KPX K quoteright 36
+KPX K quotedblright 36
+KPX K o -30
+KPX K n -24
+KPX K l 10
+KPX K i -12
+KPX K h 15
+KPX K e -30
+KPX K a -12
+KPX K Q -50
+KPX K O -50
+KPX K G -50
+KPX K C -50
+KPX K A 15
+
+KPX L y -70
+KPX L w -30
+KPX L u -18
+KPX L quoteright -110
+KPX L quotedblright -110
+KPX L l -16
+KPX L j -18
+KPX L i -18
+KPX L Y -80
+KPX L W -78
+KPX L V -110
+KPX L U -42
+KPX L T -100
+KPX L Q -48
+KPX L O -48
+KPX L G -48
+KPX L C -48
+KPX L A 40
+
+KPX M y -18
+KPX M u -24
+KPX M quoteright 6
+KPX M quotedblright 6
+KPX M o -25
+KPX M n -20
+KPX M j -35
+KPX M i -20
+KPX M e -25
+KPX M d -20
+KPX M c -25
+KPX M a -20
+
+KPX N y -18
+KPX N u -24
+KPX N o -18
+KPX N i -12
+KPX N e -16
+KPX N a -22
+
+KPX O z -6
+KPX O y 12
+KPX O u -6
+KPX O t -6
+KPX O s -6
+KPX O r -6
+KPX O quoteright -20
+KPX O quotedblright -20
+KPX O q 6
+KPX O period -10
+KPX O p -6
+KPX O n -6
+KPX O m -6
+KPX O l -15
+KPX O k -10
+KPX O j -6
+KPX O h -10
+KPX O g -6
+KPX O e 6
+KPX O d 6
+KPX O comma -10
+KPX O a 6
+KPX O Y -70
+KPX O X -30
+KPX O W -35
+KPX O V -50
+KPX O T -42
+KPX O A -8
+
+KPX P y 6
+KPX P u -18
+KPX P t -6
+KPX P s -24
+KPX P r -6
+KPX P quoteright -12
+KPX P period -170
+KPX P o -24
+KPX P n -12
+KPX P l -20
+KPX P h -20
+KPX P e -24
+KPX P comma -170
+KPX P a -40
+KPX P I -45
+KPX P H -45
+KPX P E -45
+KPX P A -70
+
+KPX Q u -6
+KPX Q quoteright -20
+KPX Q quotedblright -38
+KPX Q a -6
+KPX Q Y -70
+KPX Q X -12
+KPX Q W -35
+KPX Q V -50
+KPX Q U -30
+KPX Q T -36
+KPX Q A -18
+
+KPX R y -6
+KPX R u -12
+KPX R quoteright -22
+KPX R quotedblright -22
+KPX R o -20
+KPX R e -12
+KPX R Y -45
+KPX R X 15
+KPX R W -25
+KPX R V -35
+KPX R U -40
+KPX R T -18
+KPX R Q -8
+KPX R O -8
+KPX R G -8
+KPX R C -8
+KPX R A 15
+
+KPX S y -30
+KPX S w -30
+KPX S v -20
+KPX S u -18
+KPX S t -18
+KPX S r -20
+KPX S quoteright -38
+KPX S quotedblright -50
+KPX S p -18
+KPX S n -24
+KPX S m -24
+KPX S l -20
+KPX S k -18
+KPX S j -25
+KPX S i -20
+KPX S h -12
+KPX S e -6
+
+KPX T z -48
+KPX T y -52
+KPX T w -54
+KPX T u -54
+KPX T semicolon -6
+KPX T s -60
+KPX T r -54
+KPX T quoteright 36
+KPX T quotedblright 36
+KPX T period -70
+KPX T parenright 25
+KPX T o -78
+KPX T m -54
+KPX T i -22
+KPX T hyphen -100
+KPX T h 6
+KPX T endash -40
+KPX T emdash -40
+KPX T e -78
+KPX T comma -90
+KPX T bracketright 20
+KPX T braceright 30
+KPX T a -78
+KPX T Y 12
+KPX T X 18
+KPX T W 30
+KPX T V 20
+KPX T T 40
+KPX T Q -6
+KPX T O -6
+KPX T G -6
+KPX T C -6
+KPX T A -40
+
+KPX U z -18
+KPX U x -30
+KPX U v -20
+KPX U t -24
+KPX U s -40
+KPX U r -30
+KPX U p -30
+KPX U n -30
+KPX U m -30
+KPX U l -12
+KPX U k -12
+KPX U i -24
+KPX U h -6
+KPX U g -30
+KPX U f -10
+KPX U d -30
+KPX U c -30
+KPX U b -6
+KPX U a -30
+KPX U A -40
+
+KPX V y -34
+KPX V u -42
+KPX V semicolon -45
+KPX V r -55
+KPX V quoteright 46
+KPX V quotedblright 60
+KPX V period -110
+KPX V parenright 64
+KPX V o -55
+KPX V i 15
+KPX V hyphen -60
+KPX V endash -20
+KPX V emdash -20
+KPX V e -55
+KPX V comma -110
+KPX V colon -18
+KPX V bracketright 64
+KPX V braceright 64
+KPX V a -80
+KPX V T 12
+KPX V A -70
+
+KPX W y -36
+KPX W u -30
+KPX W t -10
+KPX W semicolon -12
+KPX W r -30
+KPX W quoteright 42
+KPX W quotedblright 55
+KPX W period -80
+KPX W parenright 55
+KPX W o -55
+KPX W m -30
+KPX W i 5
+KPX W hyphen -40
+KPX W h 16
+KPX W e -55
+KPX W d -60
+KPX W comma -80
+KPX W colon -12
+KPX W bracketright 64
+KPX W braceright 64
+KPX W a -60
+KPX W T 30
+KPX W Q -5
+KPX W O -5
+KPX W G -5
+KPX W C -5
+KPX W A -45
+
+KPX X y -40
+KPX X u -30
+KPX X r -6
+KPX X quoteright 24
+KPX X quotedblright 40
+KPX X i -6
+KPX X e -18
+KPX X a -6
+KPX X Y -6
+KPX X W -6
+KPX X Q -45
+KPX X O -45
+KPX X G -45
+KPX X C -45
+
+KPX Y v -60
+KPX Y u -70
+KPX Y t -32
+KPX Y semicolon -20
+KPX Y quoteright 56
+KPX Y quotedblright 70
+KPX Y q -100
+KPX Y period -80
+KPX Y parenright 5
+KPX Y o -95
+KPX Y l 15
+KPX Y i 15
+KPX Y hyphen -110
+KPX Y endash -40
+KPX Y emdash -40
+KPX Y e -95
+KPX Y d -85
+KPX Y comma -80
+KPX Y colon -20
+KPX Y bracketright 64
+KPX Y braceright 64
+KPX Y a -85
+KPX Y Y 12
+KPX Y X 12
+KPX Y W 12
+KPX Y V 6
+KPX Y T 30
+KPX Y Q -25
+KPX Y O -25
+KPX Y G -25
+KPX Y C -25
+KPX Y A -40
+
+KPX Z y -36
+KPX Z w -36
+KPX Z u -12
+KPX Z quoteright 18
+KPX Z quotedblright 18
+KPX Z o -6
+KPX Z i -12
+KPX Z e -6
+KPX Z a -6
+KPX Z Q -20
+KPX Z O -20
+KPX Z G -20
+KPX Z C -20
+KPX Z A 30
+
+KPX a quoteright -54
+KPX a quotedblright -54
+
+KPX b y -6
+KPX b w -5
+KPX b v -5
+KPX b quoteright -30
+KPX b quotedblright -30
+KPX b period -15
+KPX b comma -15
+
+KPX braceleft Y 64
+KPX braceleft W 64
+KPX braceleft V 64
+KPX braceleft T 40
+KPX braceleft J 60
+
+KPX bracketleft Y 60
+KPX bracketleft W 64
+KPX bracketleft V 64
+KPX bracketleft T 35
+KPX bracketleft J 30
+
+KPX c quoteright 5
+KPX c quotedblright 5
+
+KPX colon space -30
+
+KPX comma space -40
+KPX comma quoteright -100
+KPX comma quotedblright -100
+
+KPX d quoteright -12
+KPX d quotedblright -12
+KPX d period 15
+KPX d comma 15
+
+KPX e y 6
+KPX e x -10
+KPX e w -10
+KPX e v -10
+KPX e quoteright -25
+KPX e quotedblright -25
+
+KPX f quoteright 120
+KPX f quotedblright 120
+KPX f period -30
+KPX f parenright 100
+KPX f comma -30
+KPX f bracketright 110
+KPX f braceright 110
+
+KPX g y 50
+KPX g quotedblright -20
+KPX g p 30
+KPX g f 42
+KPX g comma 20
+
+KPX h quoteright -78
+KPX h quotedblright -78
+
+KPX i quoteright -20
+KPX i quotedblright -20
+
+KPX j quoteright -20
+KPX j quotedblright -20
+KPX j period -20
+KPX j comma -20
+
+KPX k quoteright -38
+KPX k quotedblright -38
+
+KPX l quoteright -12
+KPX l quotedblright -12
+
+KPX m quoteright -78
+KPX m quotedblright -78
+
+KPX n quoteright -88
+KPX n quotedblright -88
+
+KPX o y -12
+KPX o x -20
+KPX o w -25
+KPX o v -25
+KPX o quoteright -50
+KPX o quotedblright -50
+KPX o period -10
+KPX o comma -10
+
+KPX p w -6
+KPX p quoteright -30
+KPX p quotedblright -52
+KPX p period -15
+KPX p comma -15
+
+KPX parenleft Y 64
+KPX parenleft W 64
+KPX parenleft V 64
+KPX parenleft T 30
+KPX parenleft J 50
+
+KPX period space -40
+KPX period quoteright -100
+KPX period quotedblright -100
+
+KPX q quoteright -40
+KPX q quotedblright -40
+KPX q period -10
+KPX q comma -5
+
+KPX quotedblleft z -30
+KPX quotedblleft x -60
+KPX quotedblleft w -12
+KPX quotedblleft v -12
+KPX quotedblleft u -12
+KPX quotedblleft t 5
+KPX quotedblleft s -30
+KPX quotedblleft r -12
+KPX quotedblleft q -50
+KPX quotedblleft p -12
+KPX quotedblleft o -30
+KPX quotedblleft n -12
+KPX quotedblleft m -12
+KPX quotedblleft l 10
+KPX quotedblleft k 10
+KPX quotedblleft h 10
+KPX quotedblleft g -30
+KPX quotedblleft e -30
+KPX quotedblleft d -50
+KPX quotedblleft c -30
+KPX quotedblleft b 24
+KPX quotedblleft a -50
+KPX quotedblleft Y 30
+KPX quotedblleft X 45
+KPX quotedblleft W 55
+KPX quotedblleft V 40
+KPX quotedblleft T 36
+KPX quotedblleft A -100
+
+KPX quotedblright space -50
+KPX quotedblright period -200
+KPX quotedblright comma -200
+
+KPX quoteleft z -30
+KPX quoteleft y 30
+KPX quoteleft x -10
+KPX quoteleft w -12
+KPX quoteleft u -12
+KPX quoteleft t -30
+KPX quoteleft s -30
+KPX quoteleft r -12
+KPX quoteleft q -30
+KPX quoteleft p -12
+KPX quoteleft o -30
+KPX quoteleft n -12
+KPX quoteleft m -12
+KPX quoteleft l 10
+KPX quoteleft k 10
+KPX quoteleft h 10
+KPX quoteleft g -30
+KPX quoteleft e -30
+KPX quoteleft d -30
+KPX quoteleft c -30
+KPX quoteleft b 24
+KPX quoteleft a -30
+KPX quoteleft Y 12
+KPX quoteleft X 46
+KPX quoteleft W 46
+KPX quoteleft V 28
+KPX quoteleft T 36
+KPX quoteleft A -100
+
+KPX quoteright v -20
+KPX quoteright space -50
+KPX quoteright s -45
+KPX quoteright r -12
+KPX quoteright period -140
+KPX quoteright m -12
+KPX quoteright l -12
+KPX quoteright d -65
+KPX quoteright comma -140
+
+KPX r z 20
+KPX r y 18
+KPX r x 12
+KPX r w 6
+KPX r v 6
+KPX r t 8
+KPX r semicolon 20
+KPX r quoteright -6
+KPX r quotedblright -6
+KPX r q -24
+KPX r period -100
+KPX r o -6
+KPX r l -12
+KPX r k -12
+KPX r hyphen -40
+KPX r h -10
+KPX r f 8
+KPX r endash -20
+KPX r e -26
+KPX r d -25
+KPX r comma -100
+KPX r colon 20
+KPX r c -12
+KPX r a -25
+
+KPX s quoteright -25
+KPX s quotedblright -30
+
+KPX semicolon space -30
+
+KPX space quotesinglbase -60
+KPX space quoteleft -60
+KPX space quotedblleft -60
+KPX space quotedblbase -60
+KPX space Y -70
+KPX space W -50
+KPX space V -70
+KPX space T -50
+KPX space A -50
+
+KPX t quoteright 15
+KPX t quotedblright 15
+KPX t period 15
+KPX t comma 15
+
+KPX u quoteright -65
+KPX u quotedblright -78
+KPX u period 20
+KPX u comma 20
+
+KPX v quoteright -10
+KPX v quotedblright -10
+KPX v q -6
+KPX v period -62
+KPX v o -6
+KPX v e -6
+KPX v d -6
+KPX v comma -62
+KPX v c -6
+KPX v a -6
+
+KPX w quoteright -10
+KPX w quotedblright -10
+KPX w period -40
+KPX w comma -50
+
+KPX x y 12
+KPX x w -6
+KPX x quoteright -30
+KPX x quotedblright -30
+KPX x q -6
+KPX x o -6
+KPX x e -6
+KPX x d -6
+KPX x c -6
+
+KPX y quoteright -10
+KPX y quotedblright -10
+KPX y q -10
+KPX y period -56
+KPX y d -10
+KPX y comma -56
+
+KPX z quoteright -40
+KPX z quotedblright -40
+KPX z o -6
+KPX z e -6
+KPX z d -6
+KPX z c -6
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/fonts/utilities/vfinst/example/putbi8a.pfb b/fonts/utilities/vfinst/example/putbi8a.pfb
new file mode 100644
index 0000000000..c36689694d
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbi8a.pfb
Binary files differ
diff --git a/fonts/utilities/vfinst/example/putbi8a.pl b/fonts/utilities/vfinst/example/putbi8a.pl
new file mode 100644
index 0000000000..a4e736b880
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbi8a.pl
@@ -0,0 +1,910 @@
+(COMMENT raw font putbi8a created by fontinst v1.500)
+
+(COMMENT Filename: putbi8a.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putbi8a}{putbi8a})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putbi8a.pl putbi8a.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.50989)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.40991)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.87988)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.09998)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.71997)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.1399)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.69995)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.97998)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.29993)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.96997)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.41992)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1399)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.95996)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.7799)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.87)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.19995)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.56995)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.68994)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.28992)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.29993)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.42993)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.98999)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.6499)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.37988)
+ (CHARDP R -1.56995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.20996)
+ (CHARIC R 0.50989)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 164 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 2.69995)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.15991)
+ )
+(CHARACTER D 166 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.75)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 169 (COMMENT quotesingle)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.75989)
+ (CHARIC R 0.3899)
+ )
+(CHARACTER D 170 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT guilsinglleft)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 173 (COMMENT guilsinglright)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 175 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 177 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 178 (COMMENT dagger)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 179 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 180 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.72998)
+ )
+(CHARACTER D 183 (COMMENT bullet)
+ (CHARWD R 4.6499)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT quotesinglbase)
+ (CHARWD R 2.45996)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT quotedblbase)
+ (CHARWD R 4.54993)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT perthousand)
+ (CHARWD R 12.96997)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 195 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 196 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R -5.48999)
+ (CHARIC R 1.0199)
+ )
+(CHARACTER D 197 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R -5.91992)
+ (CHARIC R 0.58997)
+ )
+(CHARACTER D 198 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R -5.55994)
+ (CHARIC R 0.68994)
+ )
+(CHARACTER D 199 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 1.03992)
+ )
+(CHARACTER D 202 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.62)
+ (CHARDP R -5.28992)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 203 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 206 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 1.07996)
+ )
+(CHARACTER D 208 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 225 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 227 (COMMENT ordfeminine)
+ (CHARWD R 4.43994)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 232 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 233 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 234 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 235 (COMMENT ordmasculine)
+ (CHARWD R 4.12)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 241 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 245 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 248 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 249 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.68994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 251 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.6399)
+ )
+
+(COMMENT END OF FILE putbi8a.pl)
diff --git a/fonts/utilities/vfinst/example/putbi8r.pl b/fonts/utilities/vfinst/example/putbi8r.pl
new file mode 100644
index 0000000000..9a7d430d20
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbi8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putbi8r created by fontinst v1.500)
+
+(COMMENT Filename: putbi8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putbi8r}{putbi8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putbi8r.pl putbi8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.50989)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 0.40991)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.87988)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.09998)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.71997)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.1399)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.69995)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.97998)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.29993)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.96997)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.41992)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1399)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.95996)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.7799)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.41992)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.87)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.19995)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.56995)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.68994)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.28992)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.29993)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.42993)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.98999)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.6499)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.37988)
+ (CHARDP R -1.56995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.20996)
+ (CHARIC R 0.50989)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 2.69995)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.15991)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.75)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.75989)
+ (CHARIC R 0.3899)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.72998)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.6499)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.45996)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.54993)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.96997)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R -5.48999)
+ (CHARIC R 1.0199)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R -5.91992)
+ (CHARIC R 0.58997)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R -5.55994)
+ (CHARIC R 0.68994)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 1.03992)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.62)
+ (CHARDP R -5.28992)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 1.07996)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.43994)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 4.12)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.33997)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.68994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.6399)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 6.0)
+ (CHARHT R 2.8999)
+ (CHARDP R -2.09998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.75)
+ (CHARHT R 6.79993)
+ (CHARDP R -3.59998)
+ (CHARIC R 0.5)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.62)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.60999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.62)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -0.94995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.60999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.68994)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.98999)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.6499)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.0)
+ (CHARHT R 7.0)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 4.8899)
+ (CHARHT R 7.3999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.6399)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.23999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.62)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.50989)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.62)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 4.8899)
+ (CHARHT R 7.09998)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.42993)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.43994)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.62)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.41992)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 6.0)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.06995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.40991)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.96997)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.65991)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.59998)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.04993)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.19995)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.17993)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.95996)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.62)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 6.0)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.65991)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.85999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.46997)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.23999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.69995)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.16992)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.04993)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.75989)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 0.47998)
+ )
+
+(COMMENT END OF FILE putbi8r.pl)
diff --git a/fonts/utilities/vfinst/example/putbic7t.vpl b/fonts/utilities/vfinst/example/putbic7t.vpl
new file mode 100644
index 0000000000..00d0ea90b7
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbic7t.vpl
@@ -0,0 +1,2436 @@
+(VTITLE virtual font putbic7t created by fontinst v1.500)
+
+(COMMENT Filename: putbic7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1c}{putbic7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbic7t.vpl putbic7t.vf putbic7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putbi8r) (FONTDSIZE R 10.0) (FONTAT R 8.0))
+(MAPFONT D 1 (FONTNAME putbi8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT FFsmall)
+ (LIG D 105 D 14) (COMMENT Ismall FFIsmall)
+ (LIG D 108 D 15) (COMMENT Lsmall FFLsmall)
+ (STOP)
+ (LABEL D 17) (COMMENT dotlessJsmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 25) (COMMENT SSsmall)
+ (KRN D 39 R -0.33997) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT Oslashsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.08997) (COMMENT period)
+ (KRN D 44 R -0.08997) (COMMENT comma)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 88 R -0.2699) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 84 R -0.37) (COMMENT T)
+ (KRN D 65 R -0.06995) (COMMENT A)
+ (KRN D 97 R -0.05994) (COMMENT Asmall)
+ (KRN D 116 R -0.32996) (COMMENT Tsmall)
+ (KRN D 118 R -0.3999) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.23999) (COMMENT Xsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (KRN D 97 R -0.06995) (COMMENT Asmall)
+ (KRN D 116 R -0.37) (COMMENT Tsmall)
+ (KRN D 118 R -0.44995) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.2699) (COMMENT Xsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT Lsmall Lslashsmall)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (KRN D 106 R 0.44995) (COMMENT Jsmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.44995) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 39 R -0.91992) (COMMENT quoteright)
+ (KRN D 34 R -0.91992) (COMMENT quotedblright)
+ (KRN D 89 R -0.55994) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.45996) (COMMENT W)
+ (KRN D 86 R -0.75) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.59998) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.2699) (COMMENT Qsmall)
+ (KRN D 116 R -0.53992) (COMMENT Tsmall)
+ (KRN D 117 R -0.44995) (COMMENT Usmall)
+ (KRN D 118 R -0.66992) (COMMENT Vsmall)
+ (KRN D 119 R -0.40991) (COMMENT Wsmall)
+ (KRN D 120 R -0.06995) (COMMENT Xsmall)
+ (KRN D 121 R -0.5) (COMMENT Ysmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.31995) (COMMENT quotedblright)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.3999) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 39 R 0.12) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 99 R -0.09998) (COMMENT Csmall)
+ (KRN D 103 R -0.09998) (COMMENT Gsmall)
+ (KRN D 111 R -0.09998) (COMMENT Osmall)
+ (KRN D 113 R -0.09998) (COMMENT Qsmall)
+ (KRN D 28 R -0.09998) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.6499) (COMMENT V)
+ (KRN D 118 R -0.57996) (COMMENT Vsmall)
+ (KRN D 119 R -0.35999) (COMMENT Wsmall)
+ (KRN D 121 R -0.71997) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 97 R -0.3999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 81 R -0.5) (COMMENT Q)
+ (KRN D 79 R -0.5) (COMMENT O)
+ (KRN D 71 R -0.5) (COMMENT G)
+ (KRN D 67 R -0.5) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.5) (COMMENT Oslash)
+ (KRN D 97 R 0.12988) (COMMENT Asmall)
+ (KRN D 99 R -0.44995) (COMMENT Csmall)
+ (KRN D 103 R -0.44995) (COMMENT Gsmall)
+ (KRN D 111 R -0.44995) (COMMENT Osmall)
+ (KRN D 113 R -0.44995) (COMMENT Qsmall)
+ (KRN D 28 R -0.44995) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (KRN D 97 R 0.35999) (COMMENT Asmall)
+ (KRN D 99 R -0.42993) (COMMENT Csmall)
+ (KRN D 103 R -0.42993) (COMMENT Gsmall)
+ (KRN D 111 R -0.42993) (COMMENT Osmall)
+ (KRN D 113 R -0.42993) (COMMENT Qsmall)
+ (KRN D 116 R -0.8999) (COMMENT Tsmall)
+ (KRN D 117 R -0.37) (COMMENT Usmall)
+ (KRN D 118 R -0.98999) (COMMENT Vsmall)
+ (KRN D 119 R -0.69995) (COMMENT Wsmall)
+ (KRN D 121 R -0.71997) (COMMENT Ysmall)
+ (KRN D 28 R -0.42993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (KRN D 97 R -0.06995) (COMMENT Asmall)
+ (KRN D 116 R -0.37) (COMMENT Tsmall)
+ (KRN D 118 R -0.44995) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.2699) (COMMENT Xsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 46 R -1.69995) (COMMENT period)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 73 R -0.44995) (COMMENT I)
+ (KRN D 72 R -0.44995) (COMMENT H)
+ (KRN D 69 R -0.44995) (COMMENT E)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 97 R -0.62988) (COMMENT Asmall)
+ (KRN D 101 R -0.3999) (COMMENT Esmall)
+ (KRN D 104 R -0.3999) (COMMENT Hsmall)
+ (KRN D 105 R -0.3999) (COMMENT Ismall)
+ (KRN D 16 R -0.3999) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.31995) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.44995) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.09998) (COMMENT Xsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 39 R -0.21997) (COMMENT quoteright)
+ (KRN D 34 R -0.21997) (COMMENT quotedblright)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R 0.1499) (COMMENT X)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 81 R -0.07996) (COMMENT Q)
+ (KRN D 79 R -0.07996) (COMMENT O)
+ (KRN D 71 R -0.07996) (COMMENT G)
+ (KRN D 67 R -0.07996) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.07996) (COMMENT Oslash)
+ (KRN D 97 R 0.12988) (COMMENT Asmall)
+ (KRN D 99 R -0.06995) (COMMENT Csmall)
+ (KRN D 103 R -0.06995) (COMMENT Gsmall)
+ (KRN D 111 R -0.06995) (COMMENT Osmall)
+ (KRN D 113 R -0.06995) (COMMENT Qsmall)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.35999) (COMMENT Usmall)
+ (KRN D 118 R -0.30994) (COMMENT Vsmall)
+ (KRN D 119 R -0.21997) (COMMENT Wsmall)
+ (KRN D 120 R 0.12988) (COMMENT Xsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (KRN D 28 R -0.06995) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 59 R -0.05994) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 41 R 0.25) (COMMENT parenright)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.29993) (COMMENT W)
+ (KRN D 86 R 0.19995) (COMMENT V)
+ (KRN D 84 R 0.3999) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (KRN D 99 R -0.04993) (COMMENT Csmall)
+ (KRN D 103 R -0.04993) (COMMENT Gsmall)
+ (KRN D 111 R -0.04993) (COMMENT Osmall)
+ (KRN D 113 R -0.04993) (COMMENT Qsmall)
+ (KRN D 116 R 0.35999) (COMMENT Tsmall)
+ (KRN D 118 R 0.17993) (COMMENT Vsmall)
+ (KRN D 119 R 0.2699) (COMMENT Wsmall)
+ (KRN D 120 R 0.15991) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.04993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 39 R 0.45996) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 97 R -0.62988) (COMMENT Asmall)
+ (KRN D 116 R 0.09998) (COMMENT Tsmall)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 59 R -0.12) (COMMENT semicolon)
+ (KRN D 39 R 0.41992) (COMMENT quoteright)
+ (KRN D 34 R 0.54993) (COMMENT quotedblright)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.54993) (COMMENT parenright)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.12) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 97 R -0.3999) (COMMENT Asmall)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.44995) (COMMENT Q)
+ (KRN D 79 R -0.44995) (COMMENT O)
+ (KRN D 71 R -0.44995) (COMMENT G)
+ (KRN D 67 R -0.44995) (COMMENT C)
+ (KRN D 31 R -0.44995) (COMMENT Oslash)
+ (KRN D 99 R -0.3999) (COMMENT Csmall)
+ (KRN D 103 R -0.3999) (COMMENT Gsmall)
+ (KRN D 111 R -0.3999) (COMMENT Osmall)
+ (KRN D 113 R -0.3999) (COMMENT Qsmall)
+ (KRN D 119 R -0.04993) (COMMENT Wsmall)
+ (KRN D 121 R -0.04993) (COMMENT Ysmall)
+ (KRN D 28 R -0.3999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 59 R -0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.55994) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.04993) (COMMENT parenright)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.19995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (KRN D 99 R -0.21997) (COMMENT Csmall)
+ (KRN D 103 R -0.21997) (COMMENT Gsmall)
+ (KRN D 111 R -0.21997) (COMMENT Osmall)
+ (KRN D 113 R -0.21997) (COMMENT Qsmall)
+ (KRN D 116 R 0.2699) (COMMENT Tsmall)
+ (KRN D 118 R 0.04993) (COMMENT Vsmall)
+ (KRN D 119 R 0.09998) (COMMENT Wsmall)
+ (KRN D 120 R 0.09998) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.21997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 97 R 0.2699) (COMMENT Asmall)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.59998) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.29993) (COMMENT J)
+ (KRN D 106 R 0.2699) (COMMENT Jsmall)
+ (KRN D 116 R 0.30994) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.53992) (COMMENT Ysmall)
+ (KRN D 17 R 0.2699) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.44995) (COMMENT X)
+ (KRN D 87 R 0.54993) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 97 R -0.8999) (COMMENT Asmall)
+ (KRN D 116 R 0.31995) (COMMENT Tsmall)
+ (KRN D 118 R 0.35999) (COMMENT Vsmall)
+ (KRN D 119 R 0.48999) (COMMENT Wsmall)
+ (KRN D 120 R 0.3999) (COMMENT Xsmall)
+ (KRN D 121 R 0.2699) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.45996) (COMMENT X)
+ (KRN D 87 R 0.45996) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 97 R -0.8999) (COMMENT Asmall)
+ (KRN D 116 R 0.31995) (COMMENT Tsmall)
+ (KRN D 118 R 0.25) (COMMENT Vsmall)
+ (KRN D 119 R 0.40991) (COMMENT Wsmall)
+ (KRN D 120 R 0.40991) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 97) (COMMENT Asmall)
+ (KRN D 39 R -0.81995) (COMMENT quoteright)
+ (KRN D 34 R -0.81995) (COMMENT quotedblright)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.06995) (COMMENT X)
+ (KRN D 87 R -0.40991) (COMMENT W)
+ (KRN D 86 R -0.66992) (COMMENT V)
+ (KRN D 85 R -0.44995) (COMMENT U)
+ (KRN D 84 R -0.53992) (COMMENT T)
+ (KRN D 81 R -0.2699) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.23999) (COMMENT Qsmall)
+ (KRN D 116 R -0.47998) (COMMENT Tsmall)
+ (KRN D 117 R -0.3999) (COMMENT Usmall)
+ (KRN D 118 R -0.59998) (COMMENT Vsmall)
+ (KRN D 119 R -0.35999) (COMMENT Wsmall)
+ (KRN D 120 R -0.05994) (COMMENT Xsmall)
+ (KRN D 121 R -0.44995) (COMMENT Ysmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 98) (COMMENT Bsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.2799) (COMMENT quotedblright)
+ (KRN D 87 R -0.2699) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 85 R -0.2699) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.23999) (COMMENT Usmall)
+ (KRN D 118 R -0.35999) (COMMENT Vsmall)
+ (KRN D 119 R -0.23999) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 99) (COMMENT Csmall)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 100) (COMMENT Dsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.17993) (COMMENT period)
+ (KRN D 44 R -0.17993) (COMMENT comma)
+ (KRN D 89 R -0.71997) (COMMENT Y)
+ (KRN D 87 R -0.35999) (COMMENT W)
+ (KRN D 86 R -0.57996) (COMMENT V)
+ (KRN D 118 R -0.5199) (COMMENT Vsmall)
+ (KRN D 119 R -0.31995) (COMMENT Wsmall)
+ (KRN D 121 R -0.6399) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 101) (COMMENT Esmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 46 R 0.12988) (COMMENT period)
+ (KRN D 44 R 0.12988) (COMMENT comma)
+ (STOP)
+ (LABEL D 102) (COMMENT Fsmall)
+ (LIG D 105 D 12) (COMMENT Ismall FIsmall)
+ (LIG D 102 D 11) (COMMENT Fsmall FFsmall)
+ (LIG D 108 D 13) (COMMENT Lsmall FLsmall)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.30994) (COMMENT quotedblright)
+ (KRN D 46 R -1.07996) (COMMENT period)
+ (KRN D 44 R -0.98999) (COMMENT comma)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 103) (COMMENT Gsmall)
+ (KRN D 39 R -0.2699) (COMMENT quoteright)
+ (KRN D 34 R -0.2699) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT Jsmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 107) (COMMENT Ksmall)
+ (KRN D 39 R 0.31995) (COMMENT quoteright)
+ (KRN D 34 R 0.31995) (COMMENT quotedblright)
+ (KRN D 81 R -0.44995) (COMMENT Q)
+ (KRN D 79 R -0.44995) (COMMENT O)
+ (KRN D 71 R -0.44995) (COMMENT G)
+ (KRN D 67 R -0.44995) (COMMENT C)
+ (KRN D 65 R 0.12988) (COMMENT A)
+ (KRN D 31 R -0.44995) (COMMENT Oslash)
+ (KRN D 97 R 0.10999) (COMMENT Asmall)
+ (KRN D 99 R -0.3999) (COMMENT Csmall)
+ (KRN D 103 R -0.3999) (COMMENT Gsmall)
+ (KRN D 111 R -0.3999) (COMMENT Osmall)
+ (KRN D 113 R -0.3999) (COMMENT Qsmall)
+ (KRN D 28 R -0.3999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 108) (COMMENT Lsmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.98999) (COMMENT quotedblright)
+ (KRN D 89 R -0.71997) (COMMENT Y)
+ (KRN D 87 R -0.69995) (COMMENT W)
+ (KRN D 86 R -0.98999) (COMMENT V)
+ (KRN D 85 R -0.37) (COMMENT U)
+ (KRN D 84 R -0.8999) (COMMENT T)
+ (KRN D 81 R -0.42993) (COMMENT Q)
+ (KRN D 79 R -0.42993) (COMMENT O)
+ (KRN D 71 R -0.42993) (COMMENT G)
+ (KRN D 67 R -0.42993) (COMMENT C)
+ (KRN D 65 R 0.35999) (COMMENT A)
+ (KRN D 31 R -0.42993) (COMMENT Oslash)
+ (KRN D 97 R 0.31995) (COMMENT Asmall)
+ (KRN D 99 R -0.37988) (COMMENT Csmall)
+ (KRN D 103 R -0.37988) (COMMENT Gsmall)
+ (KRN D 111 R -0.37988) (COMMENT Osmall)
+ (KRN D 113 R -0.37988) (COMMENT Qsmall)
+ (KRN D 116 R -0.80994) (COMMENT Tsmall)
+ (KRN D 117 R -0.32996) (COMMENT Usmall)
+ (KRN D 118 R -0.8899) (COMMENT Vsmall)
+ (KRN D 119 R -0.62988) (COMMENT Wsmall)
+ (KRN D 121 R -0.6399) (COMMENT Ysmall)
+ (KRN D 28 R -0.37988) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 109) (COMMENT Msmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT Osmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.08997) (COMMENT period)
+ (KRN D 44 R -0.08997) (COMMENT comma)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 88 R -0.2699) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 84 R -0.37) (COMMENT T)
+ (KRN D 65 R -0.06995) (COMMENT A)
+ (KRN D 97 R -0.05994) (COMMENT Asmall)
+ (KRN D 116 R -0.32996) (COMMENT Tsmall)
+ (KRN D 118 R -0.3999) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.23999) (COMMENT Xsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 112) (COMMENT Psmall)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 46 R -1.5299) (COMMENT period)
+ (KRN D 44 R -1.5299) (COMMENT comma)
+ (KRN D 73 R -0.3999) (COMMENT I)
+ (KRN D 72 R -0.3999) (COMMENT H)
+ (KRN D 69 R -0.3999) (COMMENT E)
+ (KRN D 65 R -0.62988) (COMMENT A)
+ (KRN D 97 R -0.55994) (COMMENT Asmall)
+ (KRN D 101 R -0.35999) (COMMENT Esmall)
+ (KRN D 104 R -0.35999) (COMMENT Hsmall)
+ (KRN D 105 R -0.35999) (COMMENT Ismall)
+ (KRN D 16 R -0.35999) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 113) (COMMENT Qsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.33997) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 88 R -0.09998) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.2699) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.2799) (COMMENT Tsmall)
+ (KRN D 117 R -0.23999) (COMMENT Usmall)
+ (KRN D 118 R -0.3999) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.08997) (COMMENT Xsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 114) (COMMENT Rsmall)
+ (KRN D 39 R -0.18994) (COMMENT quoteright)
+ (KRN D 34 R -0.18994) (COMMENT quotedblright)
+ (KRN D 89 R -0.3999) (COMMENT Y)
+ (KRN D 88 R 0.12988) (COMMENT X)
+ (KRN D 87 R -0.21997) (COMMENT W)
+ (KRN D 86 R -0.30994) (COMMENT V)
+ (KRN D 85 R -0.35999) (COMMENT U)
+ (KRN D 84 R -0.15991) (COMMENT T)
+ (KRN D 81 R -0.06995) (COMMENT Q)
+ (KRN D 79 R -0.06995) (COMMENT O)
+ (KRN D 71 R -0.06995) (COMMENT G)
+ (KRN D 67 R -0.06995) (COMMENT C)
+ (KRN D 65 R 0.12988) (COMMENT A)
+ (KRN D 31 R -0.06995) (COMMENT Oslash)
+ (KRN D 97 R 0.10999) (COMMENT Asmall)
+ (KRN D 99 R -0.05994) (COMMENT Csmall)
+ (KRN D 103 R -0.05994) (COMMENT Gsmall)
+ (KRN D 111 R -0.05994) (COMMENT Osmall)
+ (KRN D 113 R -0.05994) (COMMENT Qsmall)
+ (KRN D 116 R -0.1399) (COMMENT Tsmall)
+ (KRN D 117 R -0.31995) (COMMENT Usmall)
+ (KRN D 118 R -0.2699) (COMMENT Vsmall)
+ (KRN D 119 R -0.18994) (COMMENT Wsmall)
+ (KRN D 120 R 0.10999) (COMMENT Xsmall)
+ (KRN D 121 R -0.35999) (COMMENT Ysmall)
+ (KRN D 28 R -0.05994) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 115) (COMMENT Ssmall)
+ (KRN D 39 R -0.33997) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT Tsmall)
+ (KRN D 59 R -0.04993) (COMMENT semicolon)
+ (KRN D 39 R 0.31995) (COMMENT quoteright)
+ (KRN D 34 R 0.31995) (COMMENT quotedblright)
+ (KRN D 46 R -0.62988) (COMMENT period)
+ (KRN D 41 R 0.21997) (COMMENT parenright)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 44 R -0.80994) (COMMENT comma)
+ (KRN D 93 R 0.17993) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.15991) (COMMENT X)
+ (KRN D 87 R 0.2699) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 97 R -0.31995) (COMMENT Asmall)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 116 R 0.31995) (COMMENT Tsmall)
+ (KRN D 118 R 0.15991) (COMMENT Vsmall)
+ (KRN D 119 R 0.23999) (COMMENT Wsmall)
+ (KRN D 120 R 0.1399) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 117) (COMMENT Usmall)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 97 R -0.31995) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 118) (COMMENT Vsmall)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 39 R 0.40991) (COMMENT quoteright)
+ (KRN D 34 R 0.53992) (COMMENT quotedblright)
+ (KRN D 46 R -0.98999) (COMMENT period)
+ (KRN D 41 R 0.56995) (COMMENT parenright)
+ (KRN D 45 R -0.53992) (COMMENT hyphen)
+ (KRN D 44 R -0.98999) (COMMENT comma)
+ (KRN D 58 R -0.15991) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 65 R -0.62988) (COMMENT A)
+ (KRN D 97 R -0.55994) (COMMENT Asmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (STOP)
+ (LABEL D 119) (COMMENT Wsmall)
+ (KRN D 59 R -0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.37) (COMMENT quoteright)
+ (KRN D 34 R 0.48999) (COMMENT quotedblright)
+ (KRN D 46 R -0.71997) (COMMENT period)
+ (KRN D 41 R 0.48999) (COMMENT parenright)
+ (KRN D 45 R -0.35999) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R -0.09998) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 84 R 0.2699) (COMMENT T)
+ (KRN D 81 R -0.03992) (COMMENT Q)
+ (KRN D 79 R -0.03992) (COMMENT O)
+ (KRN D 71 R -0.03992) (COMMENT G)
+ (KRN D 67 R -0.03992) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.03992) (COMMENT Oslash)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (KRN D 99 R -0.0299) (COMMENT Csmall)
+ (KRN D 103 R -0.0299) (COMMENT Gsmall)
+ (KRN D 111 R -0.0299) (COMMENT Osmall)
+ (KRN D 113 R -0.0299) (COMMENT Qsmall)
+ (KRN D 116 R 0.23999) (COMMENT Tsmall)
+ (KRN D 28 R -0.0299) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 120) (COMMENT Xsmall)
+ (KRN D 39 R 0.20996) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 89 R -0.04993) (COMMENT Y)
+ (KRN D 87 R -0.04993) (COMMENT W)
+ (KRN D 81 R -0.3999) (COMMENT Q)
+ (KRN D 79 R -0.3999) (COMMENT O)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 67 R -0.3999) (COMMENT C)
+ (KRN D 31 R -0.3999) (COMMENT Oslash)
+ (KRN D 99 R -0.35999) (COMMENT Csmall)
+ (KRN D 103 R -0.35999) (COMMENT Gsmall)
+ (KRN D 111 R -0.35999) (COMMENT Osmall)
+ (KRN D 113 R -0.35999) (COMMENT Qsmall)
+ (KRN D 119 R -0.03992) (COMMENT Wsmall)
+ (KRN D 121 R -0.03992) (COMMENT Ysmall)
+ (KRN D 28 R -0.35999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 121) (COMMENT Ysmall)
+ (KRN D 59 R -0.17993) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.62988) (COMMENT quotedblright)
+ (KRN D 46 R -0.71997) (COMMENT period)
+ (KRN D 41 R 0.03992) (COMMENT parenright)
+ (KRN D 45 R -0.98999) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.09998) (COMMENT W)
+ (KRN D 86 R 0.04993) (COMMENT V)
+ (KRN D 84 R 0.2699) (COMMENT T)
+ (KRN D 81 R -0.21997) (COMMENT Q)
+ (KRN D 79 R -0.21997) (COMMENT O)
+ (KRN D 71 R -0.21997) (COMMENT G)
+ (KRN D 67 R -0.21997) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.21997) (COMMENT Oslash)
+ (KRN D 97 R -0.31995) (COMMENT Asmall)
+ (KRN D 99 R -0.18994) (COMMENT Csmall)
+ (KRN D 103 R -0.18994) (COMMENT Gsmall)
+ (KRN D 111 R -0.18994) (COMMENT Osmall)
+ (KRN D 113 R -0.18994) (COMMENT Qsmall)
+ (KRN D 116 R 0.23999) (COMMENT Tsmall)
+ (KRN D 118 R 0.03992) (COMMENT Vsmall)
+ (KRN D 119 R 0.08997) (COMMENT Wsmall)
+ (KRN D 120 R 0.08997) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.18994) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 122) (COMMENT Zsmall)
+ (KRN D 39 R 0.15991) (COMMENT quoteright)
+ (KRN D 34 R 0.15991) (COMMENT quotedblright)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.2699) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R 0.23999) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (KRN D 97 R 0.35999) (COMMENT Asmall)
+ (KRN D 99 R -0.42993) (COMMENT Csmall)
+ (KRN D 103 R -0.42993) (COMMENT Gsmall)
+ (KRN D 111 R -0.42993) (COMMENT Osmall)
+ (KRN D 113 R -0.42993) (COMMENT Qsmall)
+ (KRN D 116 R -0.8999) (COMMENT Tsmall)
+ (KRN D 117 R -0.37) (COMMENT Usmall)
+ (KRN D 118 R -0.98999) (COMMENT Vsmall)
+ (KRN D 119 R -0.69995) (COMMENT Wsmall)
+ (KRN D 121 R -0.71997) (COMMENT Ysmall)
+ (KRN D 28 R -0.42993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 170) (COMMENT Lslashsmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.98999) (COMMENT quotedblright)
+ (KRN D 89 R -0.71997) (COMMENT Y)
+ (KRN D 87 R -0.69995) (COMMENT W)
+ (KRN D 86 R -0.98999) (COMMENT V)
+ (KRN D 85 R -0.37) (COMMENT U)
+ (KRN D 84 R -0.8999) (COMMENT T)
+ (KRN D 81 R -0.42993) (COMMENT Q)
+ (KRN D 79 R -0.42993) (COMMENT O)
+ (KRN D 71 R -0.42993) (COMMENT G)
+ (KRN D 67 R -0.42993) (COMMENT C)
+ (KRN D 65 R 0.35999) (COMMENT A)
+ (KRN D 31 R -0.42993) (COMMENT Oslash)
+ (KRN D 97 R 0.31995) (COMMENT Asmall)
+ (KRN D 99 R -0.37988) (COMMENT Csmall)
+ (KRN D 103 R -0.37988) (COMMENT Gsmall)
+ (KRN D 111 R -0.37988) (COMMENT Osmall)
+ (KRN D 113 R -0.37988) (COMMENT Qsmall)
+ (KRN D 116 R -0.80994) (COMMENT Tsmall)
+ (KRN D 117 R -0.32996) (COMMENT Usmall)
+ (KRN D 118 R -0.8899) (COMMENT Vsmall)
+ (KRN D 119 R -0.62988) (COMMENT Wsmall)
+ (KRN D 121 R -0.6399) (COMMENT Ysmall)
+ (KRN D 28 R -0.37988) (COMMENT Oslashsmall)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 11 (COMMENT FFsmall)
+ (CHARWD R 10.35999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 12 (COMMENT FIsmall)
+ (CHARWD R 8.75989)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 13 (COMMENT FLsmall)
+ (CHARWD R 10.35999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 14 (COMMENT FFIsmall)
+ (CHARWD R 13.93994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 15 (COMMENT FFLsmall)
+ (CHARWD R 15.53992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessIsmall)
+ (CHARWD R 3.57996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessJsmall)
+ (CHARWD R 3.59998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.5)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.5)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.57996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.5)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.5)
+ (CHARHT R 7.1399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.5)
+ (CHARHT R 6.6399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.58997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (MOVERIGHT R 1.16992)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 25 (COMMENT SSsmall)
+ (CHARWD R 9.79993)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 26 (COMMENT AEsmall)
+ (CHARWD R 7.62)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.53992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 27 (COMMENT OEsmall)
+ (CHARWD R 8.62)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.53992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 28 (COMMENT Oslashsmall)
+ (CHARWD R 6.57996)
+ (CHARHT R 5.87)
+ (CHARDP R 0.3999)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.65991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 8.10999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 3.34998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.50989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 5.04993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 9.45996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 8.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.95996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 4.0)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.87988)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 4.0)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.5)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.5)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 3.29993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 4.41992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 3.29993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.09998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.71997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 3.29993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 3.29993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 3.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.5)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 5.03992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 5.03992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.1399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 7.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 7.21997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 8.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.71997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.97998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.75989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.29993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 4.35999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 4.37988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.37988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 6.35999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7699)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.96997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 8.10999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 7.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.33997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 8.10999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 7.30994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.65991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.05994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 8.25989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.69995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.41992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.71997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.42993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.95996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.7799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 5.04993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.5)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.5199)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.95996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 97 (COMMENT Asmall)
+ (CHARWD R 5.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 98 (COMMENT Bsmall)
+ (CHARWD R 5.93994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 99 (COMMENT Csmall)
+ (CHARWD R 5.87)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.55994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 100 (COMMENT Dsmall)
+ (CHARWD R 6.68994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 101 (COMMENT Esmall)
+ (CHARWD R 5.46997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.5199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 102 (COMMENT Fsmall)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 103 (COMMENT Gsmall)
+ (CHARWD R 6.29993)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 104 (COMMENT Hsmall)
+ (CHARWD R 6.8999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 105 (COMMENT Ismall)
+ (CHARWD R 3.57996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 106 (COMMENT Jsmall)
+ (CHARWD R 3.59998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 107 (COMMENT Ksmall)
+ (CHARWD R 6.0)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.03992)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 108 (COMMENT Lsmall)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 109 (COMMENT Msmall)
+ (CHARWD R 7.85999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 110 (COMMENT Nsmall)
+ (CHARWD R 6.41992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.7699)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 111 (COMMENT Osmall)
+ (CHARWD R 6.57996)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 112 (COMMENT Psmall)
+ (CHARWD R 5.7799)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.2699)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 113 (COMMENT Qsmall)
+ (CHARWD R 6.57996)
+ (CHARHT R 5.6499)
+ (CHARDP R 1.53992)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 114 (COMMENT Rsmall)
+ (CHARWD R 5.93994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 115 (COMMENT Ssmall)
+ (CHARWD R 4.8999)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 116 (COMMENT Tsmall)
+ (CHARWD R 5.41992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 117 (COMMENT Usmall)
+ (CHARWD R 6.69995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.12)
+ (CHARIC R 0.71997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 118 (COMMENT Vsmall)
+ (CHARWD R 5.53992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.21997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 119 (COMMENT Wsmall)
+ (CHARWD R 7.85999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12988)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 120 (COMMENT Xsmall)
+ (CHARWD R 5.53992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 121 (COMMENT Ysmall)
+ (CHARWD R 5.46997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 122 (COMMENT Zsmall)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.75989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.5)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.5)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.5)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.5)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.5)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 6.41992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putbi8r at 10.0pt)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 170 (COMMENT Lslashsmall)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+
+(COMMENT END OF FILE putbic7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbn7t.vpl b/fonts/utilities/vfinst/example/putbn7t.vpl
new file mode 100644
index 0000000000..0e5e973589
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbn7t.vpl
@@ -0,0 +1,2764 @@
+(VTITLE virtual font putbn7t created by fontinst v1.500)
+
+(COMMENT Filename: putbn7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putbn7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbn7t.vpl putbn7t.vf putbn7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putb8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.5) (COMMENT t)
+ (KRN D 115 R -0.69995) (COMMENT s)
+ (KRN D 114 R -0.41992) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.41992) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.0) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.5) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.25) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.41992) (COMMENT w)
+ (KRN D 118 R -0.47998) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.6399) (COMMENT Y)
+ (KRN D 88 R -0.17993) (COMMENT X)
+ (KRN D 87 R -0.53992) (COMMENT W)
+ (KRN D 86 R -0.69995) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.57996) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 98 R -0.09998) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.04993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.15991) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 89 R -0.59998) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.12) (COMMENT s)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.04993) (COMMENT b)
+ (KRN D 97 R -0.03992) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.35999) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.5) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.5) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.34998) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.34998) (COMMENT e)
+ (KRN D 93 R 0.1499) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.34998) (COMMENT oe)
+ (KRN D 28 R -0.34998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.59998) (COMMENT w)
+ (KRN D 118 R -0.79993) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.35999) (COMMENT Q)
+ (KRN D 79 R -0.35999) (COMMENT O)
+ (KRN D 71 R -0.35999) (COMMENT G)
+ (KRN D 67 R -0.35999) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.35999) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.09998) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 65 R -0.84998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.31995) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.25989) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 39 R -0.1499) (COMMENT quoteright)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.29993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.73999) (COMMENT y)
+ (KRN D 119 R -0.71997) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.5) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.73999) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 41 R 0.3999) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.71997) (COMMENT m)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 44 R -0.94995) (COMMENT comma)
+ (KRN D 93 R 0.3999) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.1499) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.34998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.3999) (COMMENT g)
+ (KRN D 102 R -0.19995) (COMMENT f)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 65 R -0.5) (COMMENT A)
+ (KRN D 14 R -0.19995) (COMMENT ffi)
+ (KRN D 15 R -0.19995) (COMMENT ffl)
+ (KRN D 11 R -0.19995) (COMMENT ff)
+ (KRN D 12 R -0.19995) (COMMENT fi)
+ (KRN D 13 R -0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.75) (COMMENT r)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -1.34998) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.19995) (COMMENT i)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.34998) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.69995) (COMMENT hyphen)
+ (KRN D 104 R 0.19995) (COMMENT h)
+ (KRN D 101 R -0.59998) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.75) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.6499) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.25) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.59998) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.3999) (COMMENT Q)
+ (KRN D 79 R -0.3999) (COMMENT O)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 67 R -0.3999) (COMMENT C)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 31 R -0.3999) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.25) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.59998) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 119 R 0.09998) (COMMENT w)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.31995) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.29993) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R 0.3999) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.29993) (COMMENT ffi)
+ (KRN D 15 R -0.29993) (COMMENT ffl)
+ (KRN D 11 R -0.29993) (COMMENT ff)
+ (KRN D 12 R -0.29993) (COMMENT fi)
+ (KRN D 13 R -0.29993) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 121 R -0.04993) (COMMENT y)
+ (KRN D 120 R -0.04993) (COMMENT x)
+ (KRN D 119 R 0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 96 R -0.29993) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.34998) (COMMENT Y)
+ (KRN D 88 R 0.29993) (COMMENT X)
+ (KRN D 87 R 0.34998) (COMMENT W)
+ (KRN D 86 R 0.34998) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.04993) (COMMENT quoteright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.19995) (COMMENT y)
+ (KRN D 112 R 0.19995) (COMMENT p)
+ (KRN D 102 R 0.19995) (COMMENT f)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 14 R 0.19995) (COMMENT ffi)
+ (KRN D 15 R 0.19995) (COMMENT ffl)
+ (KRN D 11 R 0.19995) (COMMENT ff)
+ (KRN D 12 R 0.19995) (COMMENT fi)
+ (KRN D 13 R 0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.29993) (COMMENT w)
+ (KRN D 118 R 0.29993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 108 R -0.09998) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R 0.04993) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.1499) (COMMENT q)
+ (KRN D 46 R -0.75) (COMMENT period)
+ (KRN D 111 R -0.1499) (COMMENT o)
+ (KRN D 101 R -0.1499) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.1499) (COMMENT c)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 27 R -0.1499) (COMMENT oe)
+ (KRN D 28 R -0.1499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.67993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.09998) (COMMENT c)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.71997) (COMMENT period)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.41992)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.41992)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.3899)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.3899)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.41992)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.3899)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.41992)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.3899)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.15991)
+ (POP)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.15991)
+ (POP)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.31995)
+ (MOVERIGHT R -3.15991)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.33997)
+ (MOVERIGHT R 7.8999)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.29993)
+ (POP)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.43994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.06995)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.06995)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.62)
+ (POP)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.05994)
+ (POP)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.65991)
+ (POP)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.84998)
+ (POP)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.78992)
+ (POP)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 10.48999)
+ (POP)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.67993)
+ (POP)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.7799)
+ (POP)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.72998)
+ (POP)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.87)
+ (POP)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.47998)
+ (POP)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.5199)
+ (POP)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.6499)
+ (POP)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.6499)
+ (POP)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.41992)
+ (POP)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0)
+ (POP)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.91992)
+ (POP)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.7799)
+ (POP)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.7799)
+ (POP)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0)
+ (POP)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.55994)
+ (POP)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.55994)
+ (POP)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.32996)
+ (POP)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.43994)
+ (POP)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.82996)
+ (POP)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.8899)
+ (POP)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.7699)
+ (POP)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.28992)
+ (POP)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.92993)
+ (POP)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.25989)
+ (POP)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.06995)
+ (POP)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.83997)
+ (POP)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.85999)
+ (POP)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.06995)
+ (POP)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.84998)
+ (POP)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.17993)
+ (POP)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.3899)
+ (POP)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.67993)
+ (POP)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.5)
+ (POP)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.67993)
+ (POP)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.83997)
+ (POP)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.60999)
+ (POP)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.23999)
+ (POP)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.85999)
+ (POP)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.44995)
+ (POP)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.32996)
+ (POP)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.33997)
+ (POP)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.16992)
+ (POP)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.1399)
+ (POP)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.34998)
+ (POP)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.72998)
+ (POP)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.34998)
+ (POP)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.5199)
+ (POP)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.43994)
+ (POP)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.04993)
+ (POP)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.93994)
+ (POP)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.04993)
+ (POP)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.18994)
+ (POP)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.41992)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.32996)
+ (POP)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.30994)
+ (POP)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.15991)
+ (POP)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.15991)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.81995)
+ (POP)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.08997)
+ (POP)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.47998)
+ (POP)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.37988)
+ (POP)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.84998)
+ (POP)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.1499)
+ (POP)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.96997)
+ (POP)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.3999)
+ (POP)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.45996)
+ (POP)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.69995)
+ (POP)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.28992)
+ (POP)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.19995)
+ (POP)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.73999)
+ (POP)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.21997)
+ (POP)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.23999)
+ (POP)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.82996)
+ (POP)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.90991)
+ (POP)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.20996)
+ (POP)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putbn7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbni7t.vpl b/fonts/utilities/vfinst/example/putbni7t.vpl
new file mode 100644
index 0000000000..6ca4677d41
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbni7t.vpl
@@ -0,0 +1,2856 @@
+(VTITLE virtual font putbni7t created by fontinst v1.500)
+
+(COMMENT Filename: putbni7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putbni7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbni7t.vpl putbni7t.vf putbni7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putbi8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.17993) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 120 R 0.15991) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.91992) (COMMENT quoteright)
+ (KRN D 34 R -0.91992) (COMMENT quotedblright)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.03992) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.55994) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.45996) (COMMENT W)
+ (KRN D 86 R -0.75) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.59998) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.31995) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.03992) (COMMENT e)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.12) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.6499) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 120 R 0.1499) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.25) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 106 R -0.19995) (COMMENT j)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 103 R -0.23999) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.31995) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.23999) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R 0.1499) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.5) (COMMENT Q)
+ (KRN D 79 R -0.5) (COMMENT O)
+ (KRN D 71 R -0.5) (COMMENT G)
+ (KRN D 67 R -0.5) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.5) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 106 R -0.34998) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.15991) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 46 R -1.69995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 73 R -0.44995) (COMMENT I)
+ (KRN D 72 R -0.44995) (COMMENT H)
+ (KRN D 69 R -0.44995) (COMMENT E)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.21997) (COMMENT quoteright)
+ (KRN D 34 R -0.21997) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R 0.1499) (COMMENT X)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 81 R -0.07996) (COMMENT Q)
+ (KRN D 79 R -0.07996) (COMMENT O)
+ (KRN D 71 R -0.07996) (COMMENT G)
+ (KRN D 67 R -0.07996) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.07996) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.17993) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.47998) (COMMENT z)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.53992) (COMMENT w)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 59 R -0.05994) (COMMENT semicolon)
+ (KRN D 115 R -0.59998) (COMMENT s)
+ (KRN D 114 R -0.53992) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 41 R 0.25) (COMMENT parenright)
+ (KRN D 111 R -0.7799) (COMMENT o)
+ (KRN D 109 R -0.53992) (COMMENT m)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.7799) (COMMENT e)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.7799) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.29993) (COMMENT W)
+ (KRN D 86 R 0.19995) (COMMENT V)
+ (KRN D 84 R 0.3999) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.7799) (COMMENT oe)
+ (KRN D 28 R -0.7799) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 112 R -0.29993) (COMMENT p)
+ (KRN D 110 R -0.29993) (COMMENT n)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.33997) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.54993) (COMMENT r)
+ (KRN D 39 R 0.45996) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.09998) (COMMENT t)
+ (KRN D 59 R -0.12) (COMMENT semicolon)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.41992) (COMMENT quoteright)
+ (KRN D 34 R 0.54993) (COMMENT quotedblright)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.54993) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R 0.15991) (COMMENT h)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.12) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.44995) (COMMENT Q)
+ (KRN D 79 R -0.44995) (COMMENT O)
+ (KRN D 71 R -0.44995) (COMMENT G)
+ (KRN D 67 R -0.44995) (COMMENT C)
+ (KRN D 31 R -0.44995) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.69995) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.55994) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.04993) (COMMENT parenright)
+ (KRN D 111 R -0.94995) (COMMENT o)
+ (KRN D 108 R 0.1499) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.94995) (COMMENT e)
+ (KRN D 100 R -0.84998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.19995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.84998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.94995) (COMMENT oe)
+ (KRN D 28 R -0.94995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.59998) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.29993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.59998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R 0.04993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.5) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.44995) (COMMENT X)
+ (KRN D 87 R 0.54993) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.45996) (COMMENT X)
+ (KRN D 87 R 0.45996) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.53992) (COMMENT quoteright)
+ (KRN D 34 R -0.53992) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.5) (COMMENT y)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 112 R 0.29993) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.87988) (COMMENT quoteright)
+ (KRN D 34 R -0.87988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5199) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.04993) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.05994) (COMMENT quoteright)
+ (KRN D 34 R -0.05994) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.6499) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (KRN D 46 R 0.19995) (COMMENT period)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.55994) (COMMENT period)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.55994) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.95996)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.47998)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.47998)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.50989)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.5199)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.98999)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.47998)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.50989)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 10.0)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.47998)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.5199)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.3899)
+ (POP)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.32996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.32996)
+ (POP)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.32996)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 8.31995)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.57996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0)
+ (POP)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R 0.0)
+ (CHARIC R 0.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.2799)
+ (POP)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 1.5)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.8899)
+ (POP)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.10999)
+ (POP)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.62)
+ (POP)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.8999)
+ (POP)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 10.15991)
+ (POP)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 1.5)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.60999)
+ (POP)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.50989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.84998)
+ (POP)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.54993)
+ (POP)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.95996)
+ (POP)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.5199)
+ (POP)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.45996)
+ (POP)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.5)
+ (CHARIC R 0.87988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.0)
+ (POP)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0)
+ (POP)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.91992)
+ (POP)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.59998)
+ (POP)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.25989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.59998)
+ (POP)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.84998)
+ (POP)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0)
+ (POP)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.53992)
+ (POP)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.53992)
+ (POP)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.2799)
+ (POP)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.33997)
+ (POP)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.79993)
+ (POP)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.71997)
+ (POP)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.73999)
+ (POP)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.21997)
+ (POP)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.97998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.84998)
+ (POP)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.25989)
+ (POP)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.0)
+ (POP)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.79993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.85999)
+ (POP)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.87988)
+ (POP)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.87988)
+ (POP)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.85999)
+ (POP)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.7699)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.20996)
+ (POP)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.96997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.40991)
+ (POP)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.60999)
+ (POP)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.59998)
+ (POP)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.60999)
+ (POP)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.80994)
+ (POP)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.50989)
+ (POP)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.15991)
+ (POP)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.75989)
+ (POP)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.29993)
+ (POP)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.19995)
+ (POP)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.29993)
+ (POP)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.42993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.21997)
+ (POP)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.95996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.17993)
+ (POP)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.7799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R 1.5)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.54993)
+ (POP)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R 1.5)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.45996)
+ (POP)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.15991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.95996)
+ (POP)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.85999)
+ (POP)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.55994)
+ (POP)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.08997)
+ (POP)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.75989)
+ (POP)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 2.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.47998)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.21997)
+ (POP)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.28992)
+ (POP)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.3899)
+ (POP)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.32996)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.69995)
+ (POP)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.32996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.2699)
+ (POP)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.1399)
+ (POP)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.34998)
+ (POP)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.62)
+ (POP)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.05994)
+ (POP)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.19995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.83997)
+ (POP)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.56995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.3999)
+ (POP)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.16992)
+ (POP)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 1.5)
+ (CHARIC R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.58997)
+ (POP)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.33997)
+ (POP)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.28992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.17993)
+ (POP)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.94995)
+ (POP)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.15991)
+ (POP)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.42993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.8899)
+ (POP)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (CHARIC R 0.3999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.65991)
+ (POP)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.91992)
+ (POP)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.3899)
+ (POP)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putbni7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbo7t.vpl b/fonts/utilities/vfinst/example/putbo7t.vpl
new file mode 100644
index 0000000000..92a204cabf
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbo7t.vpl
@@ -0,0 +1,2449 @@
+(VTITLE virtual font putbo7t created by fontinst v1.500)
+
+(COMMENT Filename: putbo7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putbo7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbo7t.vpl putbo7t.vf putbo7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putbo8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.5) (COMMENT t)
+ (KRN D 115 R -0.69995) (COMMENT s)
+ (KRN D 114 R -0.41992) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.41992) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.0) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.5) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.25) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.41992) (COMMENT w)
+ (KRN D 118 R -0.47998) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.6399) (COMMENT Y)
+ (KRN D 88 R -0.17993) (COMMENT X)
+ (KRN D 87 R -0.53992) (COMMENT W)
+ (KRN D 86 R -0.69995) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.57996) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 98 R -0.09998) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.04993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.15991) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 89 R -0.59998) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.12) (COMMENT s)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.04993) (COMMENT b)
+ (KRN D 97 R -0.03992) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.35999) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.5) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.5) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.34998) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.34998) (COMMENT e)
+ (KRN D 93 R 0.1499) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.34998) (COMMENT oe)
+ (KRN D 28 R -0.34998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.59998) (COMMENT w)
+ (KRN D 118 R -0.79993) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.35999) (COMMENT Q)
+ (KRN D 79 R -0.35999) (COMMENT O)
+ (KRN D 71 R -0.35999) (COMMENT G)
+ (KRN D 67 R -0.35999) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.35999) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 112 R -0.09998) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.09998) (COMMENT n)
+ (KRN D 109 R -0.09998) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.1499) (COMMENT b)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.09998) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 65 R -0.84998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 88 R -0.3999) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.25) (COMMENT U)
+ (KRN D 84 R -0.3999) (COMMENT T)
+ (KRN D 65 R -0.29993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.31995) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.25989) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.09998) (COMMENT r)
+ (KRN D 39 R -0.1499) (COMMENT quoteright)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.29993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.73999) (COMMENT y)
+ (KRN D 119 R -0.71997) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.5) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.73999) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 41 R 0.3999) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.71997) (COMMENT m)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 44 R -0.94995) (COMMENT comma)
+ (KRN D 93 R 0.3999) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.1499) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.34998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.3999) (COMMENT g)
+ (KRN D 102 R -0.19995) (COMMENT f)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 65 R -0.5) (COMMENT A)
+ (KRN D 14 R -0.19995) (COMMENT ffi)
+ (KRN D 15 R -0.19995) (COMMENT ffl)
+ (KRN D 11 R -0.19995) (COMMENT ff)
+ (KRN D 12 R -0.19995) (COMMENT fi)
+ (KRN D 13 R -0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.75) (COMMENT r)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -1.34998) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.19995) (COMMENT i)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.34998) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.23999) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.79993) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.69995) (COMMENT hyphen)
+ (KRN D 104 R 0.19995) (COMMENT h)
+ (KRN D 101 R -0.59998) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.75) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.6499) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.5) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.25) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.59998) (COMMENT colon)
+ (KRN D 93 R 0.79993) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.3999) (COMMENT Q)
+ (KRN D 79 R -0.3999) (COMMENT O)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 67 R -0.3999) (COMMENT C)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 31 R -0.3999) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.25) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.59998) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 119 R 0.09998) (COMMENT w)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.31995) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.29993) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.19995) (COMMENT X)
+ (KRN D 87 R 0.3999) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.29993) (COMMENT ffi)
+ (KRN D 15 R -0.29993) (COMMENT ffl)
+ (KRN D 11 R -0.29993) (COMMENT ff)
+ (KRN D 12 R -0.29993) (COMMENT fi)
+ (KRN D 13 R -0.29993) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.25989) (COMMENT z)
+ (KRN D 121 R -0.04993) (COMMENT y)
+ (KRN D 120 R -0.04993) (COMMENT x)
+ (KRN D 119 R 0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.25) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 96 R -0.29993) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.34998) (COMMENT Y)
+ (KRN D 88 R 0.29993) (COMMENT X)
+ (KRN D 87 R 0.34998) (COMMENT W)
+ (KRN D 86 R 0.34998) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R -0.23999) (COMMENT J)
+ (KRN D 65 R -1.21997) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.04993) (COMMENT quoteright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.67993) (COMMENT quoteright)
+ (KRN D 34 R 0.67993) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 41 R 1.09998) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.19995) (COMMENT y)
+ (KRN D 112 R 0.19995) (COMMENT p)
+ (KRN D 102 R 0.19995) (COMMENT f)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 14 R 0.19995) (COMMENT ffi)
+ (KRN D 15 R 0.19995) (COMMENT ffl)
+ (KRN D 11 R 0.19995) (COMMENT ff)
+ (KRN D 12 R 0.19995) (COMMENT fi)
+ (KRN D 13 R 0.19995) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.1499) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.44995) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.29993) (COMMENT w)
+ (KRN D 118 R 0.29993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 108 R -0.09998) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R 0.04993) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.1499) (COMMENT q)
+ (KRN D 46 R -0.75) (COMMENT period)
+ (KRN D 111 R -0.1499) (COMMENT o)
+ (KRN D 101 R -0.1499) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.1499) (COMMENT c)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 27 R -0.1499) (COMMENT oe)
+ (KRN D 28 R -0.1499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.67993) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.09998) (COMMENT c)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.71997) (COMMENT period)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -1.29993) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -0.94995) (COMMENT V)
+ (KRN D 85 R -0.31995) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.80994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.31995)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.31995)
+ (MOVERIGHT R -3.15991)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.33997)
+ (MOVERIGHT R 7.8999)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.54993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.43994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (CHARIC R 1.75)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.06995)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.06995)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 0.50989)
+ (CHARIC R 1.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (CHARIC R 1.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 1.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.59998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.59998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putbo7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbo8r.pl b/fonts/utilities/vfinst/example/putbo8r.pl
new file mode 100644
index 0000000000..44b965e883
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbo8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putbo8r created by fontinst v1.500)
+
+(COMMENT Filename: putbo8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putbo8r}{putbo8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putbo8r.pl putbo8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.47998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.59998)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.59998)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R 0.40991)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.7799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 1.12988)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.04993)
+ (CHARIC R 1.12988)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.55994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.7699)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.06995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.3899)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.32996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.16992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.78992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R -0.16992)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.43994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.04993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.41992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.32996)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.16992)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.30994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.31995)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.81995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.47998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.37988)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.1499)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.45996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 1.40991)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.73999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.21997)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.23999)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.82996)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.83997)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.57996)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.7799)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.7799)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.54993)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.57996)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.65991)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R 1.37)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.5199)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.09998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.85999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.41992)
+ (CHARDP R -1.55994)
+ (CHARIC R 0.7799)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.54993)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R 1.20996)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.5199)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.72998)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R 0.37988)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.72998)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.87)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R 1.05994)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.73999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.3999)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.8899)
+ (CHARHT R 7.00989)
+ (CHARDP R 0.30994)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.05994)
+ (CHARDP R -5.5299)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.29993)
+ (CHARHT R 6.73999)
+ (CHARDP R -5.87)
+ (CHARIC R 1.54993)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.15991)
+ (CHARDP R -5.55994)
+ (CHARIC R 1.6399)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.62)
+ (CHARDP R -5.3999)
+ (CHARIC R 1.75)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.50989)
+ (CHARDP R -5.20996)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 4.29993)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.29993)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.04993)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.67993)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.60999)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 4.2699)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.20996)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.84998)
+ (CHARHT R 5.34998)
+ (CHARDP R 0.50989)
+ (CHARIC R 1.22998)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 6.0)
+ (CHARHT R 2.8999)
+ (CHARDP R -2.09998)
+ (CHARIC R 0.65991)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.95996)
+ (CHARHT R 6.79993)
+ (CHARDP R -3.59998)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.67993)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -0.94995)
+ (CHARIC R 0.90991)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 2.07996)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.67993)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.28992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.28992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.83997)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 1.54993)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.21997)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.71997)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.3999)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 6.16992)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 10.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.0)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.60999)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.09998)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.28992)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.37988)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.09998)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.62)
+ (CHARDP R 0.12)
+ (CHARIC R 1.75)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.93994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 6.0)
+ (CHARHT R 4.75989)
+ (CHARDP R -0.19995)
+ (CHARIC R 1.08997)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 6.0)
+ (CHARHT R 4.93994)
+ (CHARDP R -0.05994)
+ (CHARIC R 1.12988)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.3899)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.85999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.07996)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.82996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.43994)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 2.07996)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R 2.07996)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 6.16992)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.43994)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.1399)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.0)
+ (CHARIC R 2.09998)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.84998)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 9.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.82996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 6.0)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.25989)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.15991)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.83997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62988)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.0)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.83997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 2.06995)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.45996)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.45996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.70996)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.72998)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.67993)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.07996)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.43994)
+ (CHARHT R 7.05994)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.85999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 5.18994)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R 1.70996)
+ )
+
+(COMMENT END OF FILE putbo8r.pl)
diff --git a/fonts/utilities/vfinst/example/putbu7t.vpl b/fonts/utilities/vfinst/example/putbu7t.vpl
new file mode 100644
index 0000000000..5d466585c3
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbu7t.vpl
@@ -0,0 +1,2327 @@
+(VTITLE virtual font putbu7t created by fontinst v1.500)
+
+(COMMENT Filename: putbu7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putbu7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putbu7t.vpl putbu7t.vf putbu7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putbu8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.09998)
+ (PARAMETER D 3 R 0.68994)
+ (PARAMETER D 4 R 0.68994)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.68994)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 12) (COMMENT fi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 14) (COMMENT ffi)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 74 R 0.5) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -1.0) (COMMENT quoteright)
+ (KRN D 34 R -1.0) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.17993) (COMMENT z)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 120 R 0.15991) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.91992) (COMMENT quoteright)
+ (KRN D 34 R -0.91992) (COMMENT quotedblright)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.03992) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.55994) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.45996) (COMMENT W)
+ (KRN D 86 R -0.75) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.59998) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.31995) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.03992) (COMMENT e)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.12) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.6499) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 120 R 0.1499) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.25) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 106 R -0.19995) (COMMENT j)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 103 R -0.23999) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.1499) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.1499) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.31995) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.23999) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R 0.1499) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.5) (COMMENT Q)
+ (KRN D 79 R -0.5) (COMMENT O)
+ (KRN D 71 R -0.5) (COMMENT G)
+ (KRN D 67 R -0.5) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.5) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.05994) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 106 R -0.34998) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.25) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 99 R -0.25) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 111 R -0.17993) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.15991) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.17993) (COMMENT oe)
+ (KRN D 28 R -0.17993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R 0.05994) (COMMENT q)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.1499) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 84 R -0.41992) (COMMENT T)
+ (KRN D 65 R -0.07996) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 46 R -1.69995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 73 R -0.44995) (COMMENT I)
+ (KRN D 72 R -0.44995) (COMMENT H)
+ (KRN D 69 R -0.44995) (COMMENT E)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.21997) (COMMENT quoteright)
+ (KRN D 34 R -0.21997) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 88 R 0.1499) (COMMENT X)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 81 R -0.07996) (COMMENT Q)
+ (KRN D 79 R -0.07996) (COMMENT O)
+ (KRN D 71 R -0.07996) (COMMENT G)
+ (KRN D 67 R -0.07996) (COMMENT C)
+ (KRN D 65 R 0.1499) (COMMENT A)
+ (KRN D 31 R -0.07996) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.17993) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.47998) (COMMENT z)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.53992) (COMMENT w)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 59 R -0.05994) (COMMENT semicolon)
+ (KRN D 115 R -0.59998) (COMMENT s)
+ (KRN D 114 R -0.53992) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 41 R 0.25) (COMMENT parenright)
+ (KRN D 111 R -0.7799) (COMMENT o)
+ (KRN D 109 R -0.53992) (COMMENT m)
+ (KRN D 105 R -0.21997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.7799) (COMMENT e)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.7799) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.29993) (COMMENT W)
+ (KRN D 86 R 0.19995) (COMMENT V)
+ (KRN D 84 R 0.3999) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.7799) (COMMENT oe)
+ (KRN D 28 R -0.7799) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 112 R -0.29993) (COMMENT p)
+ (KRN D 110 R -0.29993) (COMMENT n)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 102 R -0.09998) (COMMENT f)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.09998) (COMMENT ffi)
+ (KRN D 15 R -0.09998) (COMMENT ffl)
+ (KRN D 11 R -0.09998) (COMMENT ff)
+ (KRN D 12 R -0.09998) (COMMENT fi)
+ (KRN D 13 R -0.09998) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.33997) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.54993) (COMMENT r)
+ (KRN D 39 R 0.45996) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.79993) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.09998) (COMMENT t)
+ (KRN D 59 R -0.12) (COMMENT semicolon)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.41992) (COMMENT quoteright)
+ (KRN D 34 R 0.54993) (COMMENT quotedblright)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.54993) (COMMENT parenright)
+ (KRN D 111 R -0.54993) (COMMENT o)
+ (KRN D 109 R -0.29993) (COMMENT m)
+ (KRN D 105 R 0.04993) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R 0.15991) (COMMENT h)
+ (KRN D 101 R -0.54993) (COMMENT e)
+ (KRN D 100 R -0.59998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.12) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.54993) (COMMENT oe)
+ (KRN D 28 R -0.54993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.17993) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.44995) (COMMENT Q)
+ (KRN D 79 R -0.44995) (COMMENT O)
+ (KRN D 71 R -0.44995) (COMMENT G)
+ (KRN D 67 R -0.44995) (COMMENT C)
+ (KRN D 31 R -0.44995) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.69995) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.19995) (COMMENT semicolon)
+ (KRN D 39 R 0.55994) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 41 R 0.04993) (COMMENT parenright)
+ (KRN D 111 R -0.94995) (COMMENT o)
+ (KRN D 108 R 0.1499) (COMMENT l)
+ (KRN D 105 R 0.1499) (COMMENT i)
+ (KRN D 45 R -1.09998) (COMMENT hyphen)
+ (KRN D 101 R -0.94995) (COMMENT e)
+ (KRN D 100 R -0.84998) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.19995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.84998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.29993) (COMMENT T)
+ (KRN D 81 R -0.25) (COMMENT Q)
+ (KRN D 79 R -0.25) (COMMENT O)
+ (KRN D 71 R -0.25) (COMMENT G)
+ (KRN D 67 R -0.25) (COMMENT C)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 31 R -0.25) (COMMENT Oslash)
+ (KRN D 27 R -0.94995) (COMMENT oe)
+ (KRN D 28 R -0.94995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.17993) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.19995) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.59998) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.34998) (COMMENT T)
+ (KRN D 74 R 0.29993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.59998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R 0.04993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.5) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.5) (COMMENT a)
+ (KRN D 89 R 0.29993) (COMMENT Y)
+ (KRN D 88 R 0.44995) (COMMENT X)
+ (KRN D 87 R 0.54993) (COMMENT W)
+ (KRN D 86 R 0.3999) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.45996) (COMMENT X)
+ (KRN D 87 R 0.45996) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -1.0) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.53992) (COMMENT quoteright)
+ (KRN D 34 R -0.53992) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.04993) (COMMENT w)
+ (KRN D 118 R -0.04993) (COMMENT v)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.04993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.25) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.19995) (COMMENT quoteright)
+ (KRN D 34 R 1.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (KRN D 93 R 1.09998) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.5) (COMMENT y)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 112 R 0.29993) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT i)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.37988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.7799) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.87988) (COMMENT quoteright)
+ (KRN D 34 R -0.87988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.25) (COMMENT w)
+ (KRN D 118 R -0.25) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5199) (COMMENT quotedblright)
+ (KRN D 46 R -0.1499) (COMMENT period)
+ (KRN D 44 R -0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (KRN D 44 R -0.04993) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.19995) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.19995) (COMMENT semicolon)
+ (KRN D 39 R -0.05994) (COMMENT quoteright)
+ (KRN D 34 R -0.05994) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R 0.19995) (COMMENT colon)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.25) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.25) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 46 R 0.1499) (COMMENT period)
+ (KRN D 44 R 0.1499) (COMMENT comma)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.6499) (COMMENT quoteright)
+ (KRN D 34 R -0.7799) (COMMENT quotedblright)
+ (KRN D 46 R 0.19995) (COMMENT period)
+ (KRN D 44 R 0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.55994) (COMMENT period)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.55994) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.69995) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.7799) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.3999) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.95996)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.98999)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 10.0)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.32996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.32996)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 8.31995)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.62)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.34998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putbu7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putbu8r.pl b/fonts/utilities/vfinst/example/putbu8r.pl
new file mode 100644
index 0000000000..6b78271520
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putbu8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putbu8r created by fontinst v1.500)
+
+(COMMENT Filename: putbu8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putbu8r}{putbu8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putbu8r.pl putbu8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.09998)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.84998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -4.06995)
+ (CHARIC R -1.20996)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.06995)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.59998)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.03992)
+ (CHARIC R -1.43994)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.95996)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R -1.1399)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R -0.71997)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.98999)
+ (CHARDP R 1.34998)
+ (CHARIC R -1.59998)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 5.0)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.1499)
+ (CHARIC R -1.33997)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.0)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.79993)
+ (CHARDP R 1.66992)
+ (CHARIC R -0.40991)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.97998)
+ (CHARDP R -2.0299)
+ (CHARIC R -0.67993)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.79993)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R -0.37988)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -0.5199)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.32996)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.37988)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.48999)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.19995)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.29993)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R -0.80994)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.31995)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.45996)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.66992)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R -1.12988)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -1.0299)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 6.0)
+ (CHARHT R 4.94995)
+ (CHARDP R -0.04993)
+ (CHARIC R -1.12988)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.00989)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.2799)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.47998)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.5)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -0.91992)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.48999)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.93994)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.60999)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.25989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.31995)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.78992)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.78992)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R -0.69995)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.05994)
+ (CHARIC R -0.23999)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.85999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.81995)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.62)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.25)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.80994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.43994)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.50989)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.42993)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.5299)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R -0.67993)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.05994)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.16992)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.44995)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.15991)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.62988)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -0.80994)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 6.0)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.1499)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.16992)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.98999)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.85999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.6399)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.72998)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 6.08997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.2799)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.93994)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.47998)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.34998)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R -0.29993)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.67993)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.46997)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.32996)
+ (CHARHT R 7.19995)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.33997)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.69995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.35999)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.2699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.34998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.62)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.07996)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.83997)
+ (CHARHT R 5.12988)
+ (CHARDP R 2.41992)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.57996)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.58997)
+ (CHARHT R 6.40991)
+ (CHARDP R 0.12)
+ (CHARIC R -0.7799)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.85999)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.94995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.83997)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.84998)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R -0.71997)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.65991)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R -0.71997)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -0.59998)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.6499)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R -1.71997)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 6.0)
+ (CHARHT R 3.37988)
+ (CHARDP R -1.56995)
+ (CHARIC R -0.7699)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.20996)
+ (CHARIC R -1.0199)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.78992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.32996)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.10999)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -0.37)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R -0.82996)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.67993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.59998)
+ (CHARHT R 5.95996)
+ (CHARDP R -0.72998)
+ (CHARIC R -1.18994)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.45996)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.75989)
+ (CHARIC R -1.22998)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.18994)
+ (CHARDP R -3.98999)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 3.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.50989)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.5199)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R -0.35999)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.25)
+ (CHARIC R -1.30994)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.18994)
+ (CHARIC R -1.23999)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.79993)
+ (CHARHT R 3.3899)
+ (CHARDP R -1.60999)
+ (CHARIC R -0.7699)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R -0.85999)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.6499)
+ (CHARHT R 5.28992)
+ (CHARDP R -1.73999)
+ (CHARIC R -1.20996)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.45996)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R -0.37988)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.54993)
+ (CHARHT R 1.66992)
+ (CHARDP R 1.5299)
+ (CHARIC R -0.37988)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.54993)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.87)
+ (CHARIC R -1.1399)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 5.59998)
+ (CHARHT R 4.6399)
+ (CHARDP R -0.37)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.65991)
+ (CHARDP R 0.12)
+ (CHARIC R -0.37988)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.96997)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.30994)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.53992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.3999)
+ (CHARDP R -5.10999)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.96997)
+ (CHARDP R -5.48999)
+ (CHARIC R -0.57996)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.6399)
+ (CHARDP R -5.91992)
+ (CHARIC R -0.92993)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.1399)
+ (CHARDP R -5.55994)
+ (CHARIC R -0.94995)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R -1.62988)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 7.09998)
+ (CHARDP R -5.60999)
+ (CHARIC R -0.58997)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.62)
+ (CHARDP R -5.28992)
+ (CHARIC R -1.5199)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R -0.8999)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.46997)
+ (CHARDP R -5.19995)
+ (CHARIC R -0.62988)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.91992)
+ (CHARDP R -2.08997)
+ (CHARIC R -0.35999)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.43994)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.91992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.60999)
+ (CHARHT R 7.33997)
+ (CHARDP R 0.50989)
+ (CHARIC R -1.59998)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.15991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 4.12)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R -1.00989)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.8899)
+ (CHARHT R 5.08997)
+ (CHARDP R 0.12)
+ (CHARIC R -0.95996)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -0.8899)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.62)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.68994)
+ (CHARIC R -1.25989)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.10999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.93994)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 6.0)
+ (CHARHT R 2.8999)
+ (CHARDP R -2.09998)
+ (CHARIC R -0.65991)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.75)
+ (CHARHT R 6.79993)
+ (CHARDP R -3.59998)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.62)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.62988)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.60999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.94995)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.62)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.3999)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.41992)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 6.0)
+ (CHARHT R 3.96997)
+ (CHARDP R -0.94995)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.42993)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.60999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.93994)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.03992)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R -0.70996)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.41992)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -0.93994)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.33997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.6499)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.0)
+ (CHARHT R 7.0)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.78992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.96997)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 4.8899)
+ (CHARHT R 7.3999)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.05994)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R -0.58997)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.23999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.62)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.70996)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -2.0199)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.50989)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.48999)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.15991)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.15991)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.62)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.3899)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 4.8899)
+ (CHARHT R 7.09998)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.19995)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.62988)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.62)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.62)
+ (CHARDP R 0.12)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.0)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.55994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R -0.72998)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 6.0)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R -1.08997)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 6.0)
+ (CHARHT R 4.92993)
+ (CHARDP R -0.06995)
+ (CHARIC R -1.12988)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R -1.34998)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.40991)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R -1.03992)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.75989)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.16992)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R -1.72998)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.65991)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R -0.57996)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.33997)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R -2.0299)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.0)
+ (CHARIC R -0.87988)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 6.21997)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.6399)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.0)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.33997)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R -1.83997)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.17993)
+ (CHARHT R 9.15991)
+ (CHARDP R 0.0)
+ (CHARIC R -1.1399)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.56995)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.62)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.72998)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.48999)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 6.0)
+ (CHARHT R 5.48999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.25989)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.47998)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.3899)
+ (CHARHT R 7.3999)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.85999)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.0)
+ (CHARIC R -0.54993)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.95996)
+ (CHARHT R 7.09998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.46997)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.43994)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.23999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.85999)
+ (CHARHT R 9.03992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.2699)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.71997)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.45996)
+ (CHARIC R -0.91992)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.16992)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -0.65991)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.54993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.5199)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.60999)
+ (CHARHT R 9.04993)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.00989)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.2799)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.96997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.43994)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.75989)
+ (CHARHT R 8.80994)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 4.75989)
+ (CHARHT R 7.46997)
+ (CHARDP R 0.12)
+ (CHARIC R -1.22998)
+ )
+
+(COMMENT END OF FILE putbu8r.pl)
diff --git a/fonts/utilities/vfinst/example/putfonts.bat b/fonts/utilities/vfinst/example/putfonts.bat
new file mode 100644
index 0000000000..a065c81225
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putfonts.bat
@@ -0,0 +1,11 @@
+## This file moves files. Delete it after use.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:03:8.
+mv putr8a.pfb e:/texmf/fonts/type1/adobe/utopia
+mv putr8a.afm e:/texmf/fonts/afm/adobe/utopia
+mv putri8a.pfb e:/texmf/fonts/type1/adobe/utopia
+mv putri8a.afm e:/texmf/fonts/afm/adobe/utopia
+mv putb8a.pfb e:/texmf/fonts/type1/adobe/utopia
+mv putb8a.afm e:/texmf/fonts/afm/adobe/utopia
+mv putbi8a.pfb e:/texmf/fonts/type1/adobe/utopia
+mv putbi8a.afm e:/texmf/fonts/afm/adobe/utopia
+cp psfonts.map e:/texmf/dvips/base/psfonts.map
diff --git a/fonts/utilities/vfinst/example/putr7t.vpl b/fonts/utilities/vfinst/example/putr7t.vpl
new file mode 100644
index 0000000000..79d6456288
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putr7t.vpl
@@ -0,0 +1,2358 @@
+(VTITLE virtual font putr7t created by fontinst v1.500)
+
+(COMMENT Filename: putr7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putr7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putr7t.vpl putr7t.vf putr7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putr8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 116 R -0.75) (COMMENT t)
+ (KRN D 115 R -1.09998) (COMMENT s)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R -0.71997) (COMMENT quoteright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 109 R -0.69995) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.19995) (COMMENT d)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.05994) (COMMENT z)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 119 R -0.44995) (COMMENT w)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 39 R -1.19995) (COMMENT quoteright)
+ (KRN D 34 R -1.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.05994) (COMMENT X)
+ (KRN D 87 R -0.57996) (COMMENT W)
+ (KRN D 86 R -0.71997) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.69995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 108 R 0.04993) (COMMENT l)
+ (KRN D 107 R 0.04993) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.04993) (COMMENT r)
+ (KRN D 111 R 0.04993) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R 0.04993) (COMMENT oe)
+ (KRN D 28 R 0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.09998) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.69995) (COMMENT w)
+ (KRN D 118 R -0.69995) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.41992) (COMMENT Q)
+ (KRN D 79 R -0.41992) (COMMENT O)
+ (KRN D 71 R -0.41992) (COMMENT G)
+ (KRN D 67 R -0.41992) (COMMENT C)
+ (KRN D 31 R -0.41992) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.05994) (COMMENT I)
+ (KRN D 72 R -0.12) (COMMENT H)
+ (KRN D 69 R -0.05994) (COMMENT E)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.29993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.23999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.31995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.04993) (COMMENT q)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 109 R -0.19995) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.83997) (COMMENT y)
+ (KRN D 119 R -1.0) (COMMENT w)
+ (KRN D 117 R -0.81995) (COMMENT u)
+ (KRN D 59 R -0.55994) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.81995) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -1.0) (COMMENT o)
+ (KRN D 109 R -0.81995) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -1.0) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.53992) (COMMENT bracketright)
+ (KRN D 97 R -1.0) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.6499) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -1.0) (COMMENT oe)
+ (KRN D 28 R -1.0) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 112 R -0.41992) (COMMENT p)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 100 R -0.44995) (COMMENT d)
+ (KRN D 99 R -0.44995) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.44995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.6499) (COMMENT o)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.6499) (COMMENT e)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.47998) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.6499) (COMMENT oe)
+ (KRN D 28 R -0.6499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.05994) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.5) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.67993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.31995) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.59998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.5) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 113 R -0.79993) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.79993) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.69995) (COMMENT g)
+ (KRN D 102 R -0.5) (COMMENT f)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 99 R -0.79993) (COMMENT c)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 83 R -0.19995) (COMMENT S)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.5) (COMMENT ffi)
+ (KRN D 15 R -0.5) (COMMENT ffl)
+ (KRN D 11 R -0.5) (COMMENT ff)
+ (KRN D 12 R -0.5) (COMMENT fi)
+ (KRN D 13 R -0.5) (COMMENT fl)
+ (KRN D 27 R -0.79993) (COMMENT oe)
+ (KRN D 28 R -0.79993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.3999) (COMMENT z)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 96 R -0.71997) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.6499) (COMMENT g)
+ (KRN D 102 R -0.3999) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.17993) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.3999) (COMMENT ffi)
+ (KRN D 15 R -0.3999) (COMMENT ffl)
+ (KRN D 11 R -0.3999) (COMMENT ff)
+ (KRN D 12 R -0.3999) (COMMENT fi)
+ (KRN D 13 R -0.3999) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.2799) (COMMENT quoteright)
+ (KRN D 34 R -0.2799) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.09998) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.17993) (COMMENT w)
+ (KRN D 118 R 0.17993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.09998) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.75) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.84998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.37988)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 2.79993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -2.79993)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.0)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 0.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putr7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putr8a.afm b/fonts/utilities/vfinst/example/putr8a.afm
new file mode 100644
index 0000000000..be1bb781ad
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putr8a.afm
@@ -0,0 +1,1029 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri Jan 17 13:38:17 1992
+Comment UniqueID 37674
+Comment VMusage 32991 39883
+FontName Utopia-Regular
+FullName Utopia Regular
+FamilyName Utopia
+Weight Regular
+ItalicAngle 0
+IsFixedPitch false
+FontBBox -158 -250 1158 890
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.002
+Notice Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 490
+Ascender 742
+Descender -230
+StartCharMetrics 228
+C 32 ; WX 225 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 242 ; N exclam ; B 58 -12 184 707 ;
+C 34 ; WX 458 ; N quotedbl ; B 101 464 358 742 ;
+C 35 ; WX 530 ; N numbersign ; B 11 0 519 668 ;
+C 36 ; WX 530 ; N dollar ; B 44 -102 487 743 ;
+C 37 ; WX 838 ; N percent ; B 50 -25 788 700 ;
+C 38 ; WX 706 ; N ampersand ; B 46 -12 692 680 ;
+C 39 ; WX 278 ; N quoteright ; B 72 472 207 742 ;
+C 40 ; WX 350 ; N parenleft ; B 105 -128 325 692 ;
+C 41 ; WX 350 ; N parenright ; B 25 -128 245 692 ;
+C 42 ; WX 412 ; N asterisk ; B 50 356 363 707 ;
+C 43 ; WX 570 ; N plus ; B 43 0 527 490 ;
+C 44 ; WX 265 ; N comma ; B 51 -141 193 141 ;
+C 45 ; WX 392 ; N hyphen ; B 74 216 319 286 ;
+C 46 ; WX 265 ; N period ; B 70 -12 196 116 ;
+C 47 ; WX 460 ; N slash ; B 92 -15 369 707 ;
+C 48 ; WX 530 ; N zero ; B 41 -12 489 680 ;
+C 49 ; WX 530 ; N one ; B 109 0 437 680 ;
+C 50 ; WX 530 ; N two ; B 27 0 485 680 ;
+C 51 ; WX 530 ; N three ; B 27 -12 473 680 ;
+C 52 ; WX 530 ; N four ; B 19 0 493 668 ;
+C 53 ; WX 530 ; N five ; B 40 -12 480 668 ;
+C 54 ; WX 530 ; N six ; B 44 -12 499 680 ;
+C 55 ; WX 530 ; N seven ; B 41 -12 497 668 ;
+C 56 ; WX 530 ; N eight ; B 42 -12 488 680 ;
+C 57 ; WX 530 ; N nine ; B 36 -12 477 680 ;
+C 58 ; WX 265 ; N colon ; B 70 -12 196 490 ;
+C 59 ; WX 265 ; N semicolon ; B 51 -141 196 490 ;
+C 60 ; WX 570 ; N less ; B 46 1 524 499 ;
+C 61 ; WX 570 ; N equal ; B 43 111 527 389 ;
+C 62 ; WX 570 ; N greater ; B 46 1 524 499 ;
+C 63 ; WX 389 ; N question ; B 29 -12 359 707 ;
+C 64 ; WX 793 ; N at ; B 46 -15 755 707 ;
+C 65 ; WX 635 ; N A ; B -29 0 650 692 ;
+C 66 ; WX 646 ; N B ; B 35 0 595 692 ;
+C 67 ; WX 684 ; N C ; B 48 -15 649 707 ;
+C 68 ; WX 779 ; N D ; B 35 0 731 692 ;
+C 69 ; WX 606 ; N E ; B 35 0 577 692 ;
+C 70 ; WX 580 ; N F ; B 35 0 543 692 ;
+C 71 ; WX 734 ; N G ; B 48 -15 725 707 ;
+C 72 ; WX 798 ; N H ; B 35 0 763 692 ;
+C 73 ; WX 349 ; N I ; B 35 0 314 692 ;
+C 74 ; WX 350 ; N J ; B 0 -114 323 692 ;
+C 75 ; WX 658 ; N K ; B 35 -5 671 692 ;
+C 76 ; WX 568 ; N L ; B 35 0 566 692 ;
+C 77 ; WX 944 ; N M ; B 33 0 909 692 ;
+C 78 ; WX 780 ; N N ; B 34 0 753 692 ;
+C 79 ; WX 762 ; N O ; B 48 -15 714 707 ;
+C 80 ; WX 600 ; N P ; B 35 0 574 692 ;
+C 81 ; WX 762 ; N Q ; B 48 -193 714 707 ;
+C 82 ; WX 644 ; N R ; B 35 0 638 692 ;
+C 83 ; WX 541 ; N S ; B 50 -15 504 707 ;
+C 84 ; WX 621 ; N T ; B 22 0 599 692 ;
+C 85 ; WX 791 ; N U ; B 29 -15 762 692 ;
+C 86 ; WX 634 ; N V ; B -18 0 678 692 ;
+C 87 ; WX 940 ; N W ; B -13 0 977 692 ;
+C 88 ; WX 624 ; N X ; B -19 0 657 692 ;
+C 89 ; WX 588 ; N Y ; B -12 0 632 692 ;
+C 90 ; WX 610 ; N Z ; B 9 0 594 692 ;
+C 91 ; WX 330 ; N bracketleft ; B 133 -128 292 692 ;
+C 92 ; WX 460 ; N backslash ; B 91 -15 369 707 ;
+C 93 ; WX 330 ; N bracketright ; B 38 -128 197 692 ;
+C 94 ; WX 570 ; N asciicircum ; B 56 228 514 668 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 72 478 207 748 ;
+C 97 ; WX 523 ; N a ; B 49 -12 525 502 ;
+C 98 ; WX 598 ; N b ; B 20 -12 549 742 ;
+C 99 ; WX 496 ; N c ; B 49 -12 473 502 ;
+C 100 ; WX 598 ; N d ; B 49 -12 583 742 ;
+C 101 ; WX 514 ; N e ; B 49 -12 481 502 ;
+C 102 ; WX 319 ; N f ; B 30 0 389 742 ; L i fi ; L l fl ;
+C 103 ; WX 520 ; N g ; B 42 -242 525 512 ;
+C 104 ; WX 607 ; N h ; B 21 0 592 742 ;
+C 105 ; WX 291 ; N i ; B 32 0 276 715 ;
+C 106 ; WX 280 ; N j ; B -33 -242 214 715 ;
+C 107 ; WX 524 ; N k ; B 20 -5 538 742 ;
+C 108 ; WX 279 ; N l ; B 20 0 264 742 ;
+C 109 ; WX 923 ; N m ; B 32 0 908 502 ;
+C 110 ; WX 619 ; N n ; B 32 0 604 502 ;
+C 111 ; WX 577 ; N o ; B 49 -12 528 502 ;
+C 112 ; WX 608 ; N p ; B 25 -230 559 502 ;
+C 113 ; WX 591 ; N q ; B 49 -230 583 502 ;
+C 114 ; WX 389 ; N r ; B 32 0 386 502 ;
+C 115 ; WX 436 ; N s ; B 47 -12 400 502 ;
+C 116 ; WX 344 ; N t ; B 31 -12 342 616 ;
+C 117 ; WX 606 ; N u ; B 26 -12 591 502 ;
+C 118 ; WX 504 ; N v ; B 1 0 529 490 ;
+C 119 ; WX 768 ; N w ; B -2 0 792 490 ;
+C 120 ; WX 486 ; N x ; B 1 0 509 490 ;
+C 121 ; WX 506 ; N y ; B -5 -242 528 490 ;
+C 122 ; WX 480 ; N z ; B 19 0 462 490 ;
+C 123 ; WX 340 ; N braceleft ; B 79 -128 298 692 ;
+C 124 ; WX 228 ; N bar ; B 80 -250 148 750 ;
+C 125 ; WX 340 ; N braceright ; B 42 -128 261 692 ;
+C 126 ; WX 570 ; N asciitilde ; B 73 175 497 317 ;
+C 161 ; WX 242 ; N exclamdown ; B 58 -217 184 502 ;
+C 162 ; WX 530 ; N cent ; B 37 -10 487 675 ;
+C 163 ; WX 530 ; N sterling ; B 27 0 510 680 ;
+C 164 ; WX 150 ; N fraction ; B -158 -27 308 695 ;
+C 165 ; WX 530 ; N yen ; B -2 0 525 668 ;
+C 166 ; WX 530 ; N florin ; B -2 -135 522 691 ;
+C 167 ; WX 554 ; N section ; B 46 -115 507 707 ;
+C 168 ; WX 530 ; N currency ; B 25 90 505 578 ;
+C 169 ; WX 278 ; N quotesingle ; B 93 464 185 742 ;
+C 170 ; WX 458 ; N quotedblleft ; B 72 478 387 748 ;
+C 171 ; WX 442 ; N guillemotleft ; B 41 41 401 435 ;
+C 172 ; WX 257 ; N guilsinglleft ; B 41 41 216 435 ;
+C 173 ; WX 257 ; N guilsinglright ; B 41 41 216 435 ;
+C 174 ; WX 610 ; N fi ; B 30 0 595 742 ;
+C 175 ; WX 610 ; N fl ; B 30 0 595 742 ;
+C 177 ; WX 500 ; N endash ; B 0 221 500 279 ;
+C 178 ; WX 504 ; N dagger ; B 45 -125 459 717 ;
+C 179 ; WX 488 ; N daggerdbl ; B 45 -119 443 717 ;
+C 180 ; WX 265 ; N periodcentered ; B 70 188 196 316 ;
+C 182 ; WX 555 ; N paragraph ; B 64 -101 529 692 ;
+C 183 ; WX 409 ; N bullet ; B 45 192 364 512 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 72 -125 207 145 ;
+C 185 ; WX 458 ; N quotedblbase ; B 72 -125 387 145 ;
+C 186 ; WX 458 ; N quotedblright ; B 72 472 387 742 ;
+C 187 ; WX 442 ; N guillemotright ; B 41 41 401 435 ;
+C 188 ; WX 1000 ; N ellipsis ; B 104 -12 896 116 ;
+C 189 ; WX 1208 ; N perthousand ; B 50 -25 1158 700 ;
+C 191 ; WX 389 ; N questiondown ; B 30 -217 360 502 ;
+C 193 ; WX 400 ; N grave ; B 49 542 271 723 ;
+C 194 ; WX 400 ; N acute ; B 129 542 351 723 ;
+C 195 ; WX 400 ; N circumflex ; B 47 541 353 720 ;
+C 196 ; WX 400 ; N tilde ; B 22 563 377 682 ;
+C 197 ; WX 400 ; N macron ; B 56 597 344 656 ;
+C 198 ; WX 400 ; N breve ; B 63 568 337 704 ;
+C 199 ; WX 400 ; N dotaccent ; B 140 570 260 683 ;
+C 200 ; WX 400 ; N dieresis ; B 36 570 364 683 ;
+C 202 ; WX 400 ; N ring ; B 92 550 308 752 ;
+C 203 ; WX 400 ; N cedilla ; B 163 -230 329 0 ;
+C 205 ; WX 400 ; N hungarumlaut ; B 101 546 380 750 ;
+C 206 ; WX 400 ; N ogonek ; B 103 -230 295 0 ;
+C 207 ; WX 400 ; N caron ; B 47 541 353 720 ;
+C 208 ; WX 1000 ; N emdash ; B 0 221 1000 279 ;
+C 225 ; WX 876 ; N AE ; B -63 0 847 692 ;
+C 227 ; WX 390 ; N ordfeminine ; B 40 265 364 590 ;
+C 232 ; WX 574 ; N Lslash ; B 36 0 572 692 ;
+C 233 ; WX 762 ; N Oslash ; B 48 -53 714 739 ;
+C 234 ; WX 1025 ; N OE ; B 48 0 996 692 ;
+C 235 ; WX 398 ; N ordmasculine ; B 35 265 363 590 ;
+C 241 ; WX 797 ; N ae ; B 49 -12 764 502 ;
+C 245 ; WX 291 ; N dotlessi ; B 32 0 276 502 ;
+C 248 ; WX 294 ; N lslash ; B 14 0 293 742 ;
+C 249 ; WX 577 ; N oslash ; B 49 -41 528 532 ;
+C 250 ; WX 882 ; N oe ; B 49 -12 849 502 ;
+C 251 ; WX 601 ; N germandbls ; B 22 -12 573 742 ;
+C -1 ; WX 380 ; N onesuperior ; B 81 272 307 680 ;
+C -1 ; WX 570 ; N minus ; B 43 221 527 279 ;
+C -1 ; WX 350 ; N degree ; B 37 404 313 680 ;
+C -1 ; WX 577 ; N oacute ; B 49 -12 528 723 ;
+C -1 ; WX 762 ; N Odieresis ; B 48 -15 714 841 ;
+C -1 ; WX 577 ; N odieresis ; B 49 -12 528 683 ;
+C -1 ; WX 606 ; N Eacute ; B 35 0 577 890 ;
+C -1 ; WX 606 ; N ucircumflex ; B 26 -12 591 720 ;
+C -1 ; WX 860 ; N onequarter ; B 65 -27 795 695 ;
+C -1 ; WX 570 ; N logicalnot ; B 43 102 527 389 ;
+C -1 ; WX 606 ; N Ecircumflex ; B 35 0 577 876 ;
+C -1 ; WX 860 ; N onehalf ; B 58 -27 807 695 ;
+C -1 ; WX 762 ; N Otilde ; B 48 -15 714 842 ;
+C -1 ; WX 606 ; N uacute ; B 26 -12 591 723 ;
+C -1 ; WX 514 ; N eacute ; B 49 -12 481 723 ;
+C -1 ; WX 291 ; N iacute ; B 32 0 317 723 ;
+C -1 ; WX 606 ; N Egrave ; B 35 0 577 890 ;
+C -1 ; WX 291 ; N icircumflex ; B -3 0 304 720 ;
+C -1 ; WX 606 ; N mu ; B 26 -246 591 502 ;
+C -1 ; WX 228 ; N brokenbar ; B 80 -175 148 675 ;
+C -1 ; WX 606 ; N thorn ; B 23 -230 557 722 ;
+C -1 ; WX 627 ; N Aring ; B -32 0 647 861 ;
+C -1 ; WX 506 ; N yacute ; B -5 -242 528 723 ;
+C -1 ; WX 588 ; N Ydieresis ; B -12 0 632 841 ;
+C -1 ; WX 1100 ; N trademark ; B 45 277 1048 692 ;
+C -1 ; WX 818 ; N registered ; B 45 -15 773 707 ;
+C -1 ; WX 577 ; N ocircumflex ; B 49 -12 528 720 ;
+C -1 ; WX 635 ; N Agrave ; B -29 0 650 890 ;
+C -1 ; WX 541 ; N Scaron ; B 50 -15 504 882 ;
+C -1 ; WX 791 ; N Ugrave ; B 29 -15 762 890 ;
+C -1 ; WX 606 ; N Edieresis ; B 35 0 577 841 ;
+C -1 ; WX 791 ; N Uacute ; B 29 -15 762 890 ;
+C -1 ; WX 577 ; N otilde ; B 49 -12 528 682 ;
+C -1 ; WX 619 ; N ntilde ; B 32 0 604 682 ;
+C -1 ; WX 506 ; N ydieresis ; B -5 -242 528 683 ;
+C -1 ; WX 635 ; N Aacute ; B -29 0 650 890 ;
+C -1 ; WX 577 ; N eth ; B 49 -12 528 742 ;
+C -1 ; WX 523 ; N acircumflex ; B 49 -12 525 720 ;
+C -1 ; WX 523 ; N aring ; B 49 -12 525 752 ;
+C -1 ; WX 762 ; N Ograve ; B 48 -15 714 890 ;
+C -1 ; WX 496 ; N ccedilla ; B 49 -230 473 502 ;
+C -1 ; WX 570 ; N multiply ; B 63 22 507 478 ;
+C -1 ; WX 570 ; N divide ; B 43 26 527 474 ;
+C -1 ; WX 380 ; N twosuperior ; B 32 272 348 680 ;
+C -1 ; WX 780 ; N Ntilde ; B 34 0 753 842 ;
+C -1 ; WX 606 ; N ugrave ; B 26 -12 591 723 ;
+C -1 ; WX 791 ; N Ucircumflex ; B 29 -15 762 876 ;
+C -1 ; WX 635 ; N Atilde ; B -29 0 650 842 ;
+C -1 ; WX 480 ; N zcaron ; B 19 0 462 720 ;
+C -1 ; WX 291 ; N idieresis ; B -19 0 310 683 ;
+C -1 ; WX 635 ; N Acircumflex ; B -29 0 650 876 ;
+C -1 ; WX 349 ; N Icircumflex ; B 22 0 328 876 ;
+C -1 ; WX 588 ; N Yacute ; B -12 0 632 890 ;
+C -1 ; WX 762 ; N Oacute ; B 48 -15 714 890 ;
+C -1 ; WX 635 ; N Adieresis ; B -29 0 650 841 ;
+C -1 ; WX 610 ; N Zcaron ; B 9 0 594 882 ;
+C -1 ; WX 523 ; N agrave ; B 49 -12 525 723 ;
+C -1 ; WX 380 ; N threesuperior ; B 36 265 339 680 ;
+C -1 ; WX 577 ; N ograve ; B 49 -12 528 723 ;
+C -1 ; WX 860 ; N threequarters ; B 50 -27 808 695 ;
+C -1 ; WX 785 ; N Eth ; B 20 0 737 692 ;
+C -1 ; WX 570 ; N plusminus ; B 43 0 527 556 ;
+C -1 ; WX 606 ; N udieresis ; B 26 -12 591 683 ;
+C -1 ; WX 514 ; N edieresis ; B 49 -12 481 683 ;
+C -1 ; WX 523 ; N aacute ; B 49 -12 525 723 ;
+C -1 ; WX 291 ; N igrave ; B -35 0 276 723 ;
+C -1 ; WX 349 ; N Idieresis ; B 13 0 337 841 ;
+C -1 ; WX 523 ; N adieresis ; B 49 -12 525 683 ;
+C -1 ; WX 349 ; N Iacute ; B 35 0 371 890 ;
+C -1 ; WX 818 ; N copyright ; B 45 -15 773 707 ;
+C -1 ; WX 349 ; N Igrave ; B -17 0 314 890 ;
+C -1 ; WX 680 ; N Ccedilla ; B 48 -230 649 707 ;
+C -1 ; WX 436 ; N scaron ; B 47 -12 400 720 ;
+C -1 ; WX 514 ; N egrave ; B 49 -12 481 723 ;
+C -1 ; WX 762 ; N Ocircumflex ; B 48 -15 714 876 ;
+C -1 ; WX 593 ; N Thorn ; B 35 0 556 692 ;
+C -1 ; WX 523 ; N atilde ; B 49 -12 525 682 ;
+C -1 ; WX 791 ; N Udieresis ; B 29 -15 762 841 ;
+C -1 ; WX 514 ; N ecircumflex ; B 49 -12 481 720 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 712
+
+KPX A z 6
+KPX A y -50
+KPX A w -45
+KPX A v -60
+KPX A u -25
+KPX A t -12
+KPX A quoteright -120
+KPX A quotedblright -120
+KPX A q -6
+KPX A p -18
+KPX A o -12
+KPX A e -6
+KPX A d -12
+KPX A c -12
+KPX A b -12
+KPX A Y -70
+KPX A X -6
+KPX A W -58
+KPX A V -72
+KPX A U -50
+KPX A T -70
+KPX A Q -24
+KPX A O -24
+KPX A G -24
+KPX A C -24
+
+KPX B y -18
+KPX B u -12
+KPX B r -12
+KPX B period -30
+KPX B o -6
+KPX B l -12
+KPX B i -12
+KPX B h -12
+KPX B e -6
+KPX B comma -20
+KPX B a -12
+KPX B W -25
+KPX B V -20
+KPX B U -20
+KPX B T -20
+
+KPX C z -18
+KPX C y -24
+KPX C u -18
+KPX C r -6
+KPX C o -12
+KPX C e -12
+KPX C a -12
+KPX C Q -6
+KPX C O -6
+KPX C G -6
+KPX C C -6
+
+KPX D y 6
+KPX D u -12
+KPX D r -12
+KPX D quoteright -20
+KPX D quotedblright -20
+KPX D period -60
+KPX D i -6
+KPX D h -12
+KPX D e -6
+KPX D comma -50
+KPX D a -6
+KPX D Y -45
+KPX D W -35
+KPX D V -35
+
+KPX E z -6
+KPX E y -30
+KPX E x -6
+KPX E w -24
+KPX E v -24
+KPX E u -12
+KPX E t -18
+KPX E r -4
+KPX E q -6
+KPX E p -18
+KPX E o -6
+KPX E n -4
+KPX E m -4
+KPX E l 5
+KPX E k 5
+KPX E j -6
+KPX E i -6
+KPX E g -6
+KPX E f -12
+KPX E e -6
+KPX E d -6
+KPX E c -6
+KPX E b -12
+KPX E Y -6
+KPX E W -6
+KPX E V -6
+
+KPX F y -18
+KPX F u -12
+KPX F r -20
+KPX F period -180
+KPX F o -36
+KPX F l -12
+KPX F i -10
+KPX F endash 20
+KPX F e -36
+KPX F comma -180
+KPX F a -48
+KPX F A -60
+
+KPX G y -18
+KPX G u -12
+KPX G r -5
+KPX G o 5
+KPX G n -5
+KPX G l -6
+KPX G i -12
+KPX G h -12
+KPX G e 5
+KPX G a -12
+
+KPX H y -24
+KPX H u -26
+KPX H o -30
+KPX H i -18
+KPX H e -30
+KPX H a -24
+
+KPX I z -6
+KPX I y -6
+KPX I x -6
+KPX I w -18
+KPX I v -24
+KPX I u -26
+KPX I t -24
+KPX I s -18
+KPX I r -12
+KPX I p -26
+KPX I o -30
+KPX I n -18
+KPX I m -18
+KPX I l -6
+KPX I k -6
+KPX I h -6
+KPX I g -10
+KPX I f -6
+KPX I e -30
+KPX I d -30
+KPX I c -30
+KPX I b -6
+KPX I a -24
+
+KPX J y -12
+KPX J u -36
+KPX J o -30
+KPX J i -20
+KPX J e -30
+KPX J bracketright 20
+KPX J braceright 20
+KPX J a -36
+
+KPX K y -60
+KPX K w -70
+KPX K v -70
+KPX K u -42
+KPX K o -30
+KPX K i 6
+KPX K e -24
+KPX K a -12
+KPX K Q -42
+KPX K O -42
+KPX K G -42
+KPX K C -42
+
+KPX L y -52
+KPX L w -58
+KPX L u -12
+KPX L quoteright -130
+KPX L quotedblright -50
+KPX L l 6
+KPX L j -6
+KPX L Y -70
+KPX L W -90
+KPX L V -100
+KPX L U -24
+KPX L T -100
+KPX L Q -18
+KPX L O -10
+KPX L G -18
+KPX L C -18
+KPX L A 12
+
+KPX M y -24
+KPX M u -36
+KPX M o -30
+KPX M n -6
+KPX M j -12
+KPX M i -12
+KPX M e -30
+KPX M d -30
+KPX M c -30
+KPX M a -12
+
+KPX N y -24
+KPX N u -30
+KPX N o -30
+KPX N i -24
+KPX N e -30
+KPX N a -30
+
+KPX O z -6
+KPX O u -6
+KPX O t -6
+KPX O s -6
+KPX O q -6
+KPX O period -60
+KPX O p -6
+KPX O o -6
+KPX O n -5
+KPX O m -5
+KPX O l -6
+KPX O k -6
+KPX O i -5
+KPX O h -12
+KPX O g -6
+KPX O e -6
+KPX O d -6
+KPX O comma -50
+KPX O c -6
+KPX O a -12
+KPX O Y -55
+KPX O X -24
+KPX O W -30
+KPX O V -18
+KPX O T -30
+KPX O A -18
+
+KPX P u -12
+KPX P t -6
+KPX P s -24
+KPX P r -12
+KPX P period -200
+KPX P o -30
+KPX P n -12
+KPX P l -6
+KPX P hyphen -40
+KPX P h -6
+KPX P e -30
+KPX P comma -200
+KPX P a -36
+KPX P I -6
+KPX P H -12
+KPX P E -6
+KPX P A -55
+
+KPX Q u -6
+KPX Q a -18
+KPX Q Y -30
+KPX Q X -24
+KPX Q W -24
+KPX Q V -18
+KPX Q U -30
+KPX Q T -24
+KPX Q A -18
+
+KPX R y -20
+KPX R u -12
+KPX R quoteright -20
+KPX R quotedblright -20
+KPX R o -20
+KPX R hyphen -30
+KPX R e -20
+KPX R d -20
+KPX R a -12
+KPX R Y -45
+KPX R W -24
+KPX R V -32
+KPX R U -30
+KPX R T -32
+KPX R Q -24
+KPX R O -24
+KPX R G -24
+KPX R C -24
+
+KPX S y -25
+KPX S w -30
+KPX S v -30
+KPX S u -24
+KPX S t -24
+KPX S r -20
+KPX S quoteright -10
+KPX S quotedblright -10
+KPX S q -5
+KPX S p -24
+KPX S o -12
+KPX S n -20
+KPX S m -20
+KPX S l -18
+KPX S k -24
+KPX S j -12
+KPX S i -20
+KPX S h -12
+KPX S e -12
+KPX S a -18
+
+KPX T z -64
+KPX T y -84
+KPX T w -100
+KPX T u -82
+KPX T semicolon -56
+KPX T s -82
+KPX T r -82
+KPX T quoteright 24
+KPX T period -110
+KPX T parenright 54
+KPX T o -100
+KPX T m -82
+KPX T i -34
+KPX T hyphen -100
+KPX T endash -50
+KPX T emdash -50
+KPX T e -100
+KPX T comma -110
+KPX T colon -50
+KPX T bracketright 54
+KPX T braceright 54
+KPX T a -100
+KPX T Y 12
+KPX T X 18
+KPX T W 6
+KPX T V 6
+KPX T T 12
+KPX T S -12
+KPX T Q -18
+KPX T O -18
+KPX T G -18
+KPX T C -18
+KPX T A -65
+
+KPX U z -30
+KPX U y -20
+KPX U x -30
+KPX U v -20
+KPX U t -36
+KPX U s -40
+KPX U r -40
+KPX U p -42
+KPX U n -40
+KPX U m -40
+KPX U l -12
+KPX U k -12
+KPX U i -28
+KPX U h -6
+KPX U g -50
+KPX U f -12
+KPX U d -45
+KPX U c -45
+KPX U b -12
+KPX U a -40
+KPX U A -40
+
+KPX V y -36
+KPX V u -40
+KPX V semicolon -45
+KPX V r -70
+KPX V quoteright 36
+KPX V quotedblright 20
+KPX V period -140
+KPX V parenright 85
+KPX V o -70
+KPX V i 6
+KPX V hyphen -60
+KPX V endash -20
+KPX V emdash -20
+KPX V e -70
+KPX V comma -140
+KPX V colon -45
+KPX V bracketright 64
+KPX V braceright 64
+KPX V a -60
+KPX V T 6
+KPX V Q -12
+KPX V O -12
+KPX V G -12
+KPX V C -12
+KPX V A -60
+
+KPX W y -50
+KPX W u -46
+KPX W semicolon -40
+KPX W r -45
+KPX W quoteright 36
+KPX W quotedblright 20
+KPX W period -110
+KPX W parenright 85
+KPX W o -65
+KPX W m -45
+KPX W i -10
+KPX W hyphen -40
+KPX W e -65
+KPX W d -65
+KPX W comma -100
+KPX W colon -40
+KPX W bracketright 64
+KPX W braceright 64
+KPX W a -60
+KPX W T 18
+KPX W Q -6
+KPX W O -6
+KPX W G -6
+KPX W C -6
+KPX W A -48
+
+KPX X y -18
+KPX X u -24
+KPX X quoteright 15
+KPX X e -6
+KPX X a -6
+KPX X Q -24
+KPX X O -30
+KPX X G -30
+KPX X C -30
+KPX X A 6
+
+KPX Y v -50
+KPX Y u -54
+KPX Y t -46
+KPX Y semicolon -37
+KPX Y quoteright 36
+KPX Y quotedblright 20
+KPX Y q -100
+KPX Y period -90
+KPX Y parenright 60
+KPX Y o -90
+KPX Y l 10
+KPX Y hyphen -50
+KPX Y emdash -20
+KPX Y e -90
+KPX Y d -90
+KPX Y comma -90
+KPX Y colon -50
+KPX Y bracketright 64
+KPX Y braceright 64
+KPX Y a -68
+KPX Y Y 12
+KPX Y X 12
+KPX Y W 12
+KPX Y V 12
+KPX Y T 12
+KPX Y Q -18
+KPX Y O -18
+KPX Y G -18
+KPX Y C -18
+KPX Y A -32
+
+KPX Z y -36
+KPX Z w -36
+KPX Z u -6
+KPX Z o -12
+KPX Z i -12
+KPX Z e -6
+KPX Z a -6
+KPX Z Q -20
+KPX Z O -20
+KPX Z G -30
+KPX Z C -20
+KPX Z A 20
+
+KPX a quoteright -70
+KPX a quotedblright -80
+
+KPX b y -25
+KPX b w -30
+KPX b v -35
+KPX b quoteright -70
+KPX b quotedblright -70
+KPX b period -40
+KPX b comma -40
+
+KPX braceleft Y 64
+KPX braceleft W 64
+KPX braceleft V 64
+KPX braceleft T 54
+KPX braceleft J 80
+
+KPX bracketleft Y 64
+KPX bracketleft W 64
+KPX bracketleft V 64
+KPX bracketleft T 54
+KPX bracketleft J 80
+
+KPX c quoteright -28
+KPX c quotedblright -28
+KPX c period -10
+
+KPX comma quoteright -50
+KPX comma quotedblright -50
+
+KPX d quoteright -24
+KPX d quotedblright -24
+
+KPX e z -4
+KPX e quoteright -60
+KPX e quotedblright -60
+KPX e period -20
+KPX e comma -20
+
+KPX f quotesingle 30
+KPX f quoteright 65
+KPX f quotedblright 56
+KPX f quotedbl 30
+KPX f parenright 100
+KPX f bracketright 100
+KPX f braceright 100
+
+KPX g quoteright -18
+KPX g quotedblright -10
+
+KPX h quoteright -80
+KPX h quotedblright -80
+
+KPX j quoteright -20
+KPX j quotedblright -20
+KPX j period -30
+KPX j comma -30
+
+KPX k quoteright -40
+KPX k quotedblright -40
+
+KPX l quoteright -10
+KPX l quotedblright -10
+
+KPX m quoteright -80
+KPX m quotedblright -80
+
+KPX n quoteright -80
+KPX n quotedblright -80
+
+KPX o z -12
+KPX o y -30
+KPX o x -18
+KPX o w -30
+KPX o v -30
+KPX o quoteright -70
+KPX o quotedblright -70
+KPX o period -40
+KPX o comma -40
+
+KPX p z -20
+KPX p y -25
+KPX p w -30
+KPX p quoteright -70
+KPX p quotedblright -70
+KPX p period -40
+KPX p comma -40
+
+KPX parenleft Y 64
+KPX parenleft W 64
+KPX parenleft V 64
+KPX parenleft T 64
+KPX parenleft J 80
+
+KPX period quoteright -50
+KPX period quotedblright -50
+
+KPX q quoteright -50
+KPX q quotedblright -50
+KPX q period -20
+KPX q comma -10
+
+KPX quotedblleft z -60
+KPX quotedblleft y -30
+KPX quotedblleft x -40
+KPX quotedblleft w -20
+KPX quotedblleft v -20
+KPX quotedblleft u -40
+KPX quotedblleft t -40
+KPX quotedblleft s -50
+KPX quotedblleft r -50
+KPX quotedblleft q -80
+KPX quotedblleft p -50
+KPX quotedblleft o -80
+KPX quotedblleft n -50
+KPX quotedblleft m -50
+KPX quotedblleft g -70
+KPX quotedblleft f -50
+KPX quotedblleft e -80
+KPX quotedblleft d -80
+KPX quotedblleft c -80
+KPX quotedblleft a -70
+KPX quotedblleft Z -20
+KPX quotedblleft Y 12
+KPX quotedblleft W 18
+KPX quotedblleft V 18
+KPX quotedblleft U -20
+KPX quotedblleft T 10
+KPX quotedblleft S -20
+KPX quotedblleft R -20
+KPX quotedblleft Q -20
+KPX quotedblleft P -20
+KPX quotedblleft O -30
+KPX quotedblleft N -20
+KPX quotedblleft M -20
+KPX quotedblleft L -20
+KPX quotedblleft K -20
+KPX quotedblleft J -40
+KPX quotedblleft I -20
+KPX quotedblleft H -20
+KPX quotedblleft G -30
+KPX quotedblleft F -20
+KPX quotedblleft E -20
+KPX quotedblleft D -20
+KPX quotedblleft C -30
+KPX quotedblleft B -20
+KPX quotedblleft A -130
+
+KPX quotedblright period -130
+KPX quotedblright comma -130
+
+KPX quoteleft z -40
+KPX quoteleft y -35
+KPX quoteleft x -30
+KPX quoteleft w -20
+KPX quoteleft v -20
+KPX quoteleft u -50
+KPX quoteleft t -40
+KPX quoteleft s -45
+KPX quoteleft r -50
+KPX quoteleft quoteleft -72
+KPX quoteleft q -70
+KPX quoteleft p -50
+KPX quoteleft o -70
+KPX quoteleft n -50
+KPX quoteleft m -50
+KPX quoteleft g -65
+KPX quoteleft f -40
+KPX quoteleft e -70
+KPX quoteleft d -70
+KPX quoteleft c -70
+KPX quoteleft a -60
+KPX quoteleft Z -20
+KPX quoteleft Y 18
+KPX quoteleft X 12
+KPX quoteleft W 18
+KPX quoteleft V 18
+KPX quoteleft U -20
+KPX quoteleft T 10
+KPX quoteleft R -20
+KPX quoteleft Q -20
+KPX quoteleft P -20
+KPX quoteleft O -30
+KPX quoteleft N -20
+KPX quoteleft M -20
+KPX quoteleft L -20
+KPX quoteleft K -20
+KPX quoteleft J -40
+KPX quoteleft I -20
+KPX quoteleft H -20
+KPX quoteleft G -40
+KPX quoteleft F -20
+KPX quoteleft E -20
+KPX quoteleft D -20
+KPX quoteleft C -30
+KPX quoteleft B -20
+KPX quoteleft A -130
+
+KPX quoteright v -40
+KPX quoteright t -75
+KPX quoteright s -110
+KPX quoteright r -70
+KPX quoteright quoteright -72
+KPX quoteright period -130
+KPX quoteright m -70
+KPX quoteright l -6
+KPX quoteright d -120
+KPX quoteright comma -130
+
+KPX r z 10
+KPX r y 18
+KPX r x 12
+KPX r w 18
+KPX r v 18
+KPX r u 8
+KPX r t 8
+KPX r semicolon 10
+KPX r quoteright -20
+KPX r quotedblright -20
+KPX r q -6
+KPX r period -60
+KPX r o -6
+KPX r n 8
+KPX r m 8
+KPX r k -6
+KPX r i 8
+KPX r hyphen -20
+KPX r h 6
+KPX r g -6
+KPX r f 8
+KPX r e -20
+KPX r d -20
+KPX r comma -60
+KPX r colon 10
+KPX r c -20
+KPX r a -10
+
+KPX s quoteright -40
+KPX s quotedblright -40
+KPX s period -20
+KPX s comma -10
+
+KPX space quotesinglbase -60
+KPX space quoteleft -40
+KPX space quotedblleft -40
+KPX space quotedblbase -60
+KPX space Y -60
+KPX space W -60
+KPX space V -60
+KPX space T -36
+
+KPX t quoteright -18
+KPX t quotedblright -18
+
+KPX u quoteright -30
+KPX u quotedblright -30
+
+KPX v semicolon 10
+KPX v quoteright 20
+KPX v quotedblright 20
+KPX v q -10
+KPX v period -90
+KPX v o -5
+KPX v e -5
+KPX v d -10
+KPX v comma -90
+KPX v colon 10
+KPX v c -6
+KPX v a -6
+
+KPX w semicolon 10
+KPX w quoteright 20
+KPX w quotedblright 20
+KPX w q -6
+KPX w period -80
+KPX w e -6
+KPX w d -6
+KPX w comma -75
+KPX w colon 10
+KPX w c -6
+
+KPX x quoteright -10
+KPX x quotedblright -20
+KPX x q -6
+KPX x o -6
+KPX x d -12
+KPX x c -12
+
+KPX y semicolon 10
+KPX y q -6
+KPX y period -95
+KPX y o -6
+KPX y hyphen -30
+KPX y e -6
+KPX y d -6
+KPX y comma -85
+KPX y colon 10
+KPX y c -6
+
+KPX z quoteright -20
+KPX z quotedblright -30
+KPX z o -6
+KPX z e -6
+KPX z d -6
+KPX z c -6
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/fonts/utilities/vfinst/example/putr8a.pfb b/fonts/utilities/vfinst/example/putr8a.pfb
new file mode 100644
index 0000000000..1772a3a0b7
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putr8a.pfb
Binary files differ
diff --git a/fonts/utilities/vfinst/example/putr8a.pl b/fonts/utilities/vfinst/example/putr8a.pl
new file mode 100644
index 0000000000..efa4d182d3
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putr8a.pl
@@ -0,0 +1,910 @@
+(COMMENT raw font putr8a created by fontinst v1.500)
+
+(COMMENT Filename: putr8a.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putr8a}{putr8a})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putr8a.pl putr8a.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.2799)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.16992)
+ (CHARDP R -1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.75)
+ (CHARDP R 0.09998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 164 (COMMENT fraction)
+ (CHARWD R 1.5)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 166 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 169 (COMMENT quotesingle)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 170 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT guilsinglleft)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 173 (COMMENT guilsinglright)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 175 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 177 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT dagger)
+ (CHARWD R 5.03992)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 179 (COMMENT daggerdbl)
+ (CHARWD R 4.87988)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.15991)
+ (CHARDP R -1.87988)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.54993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 183 (COMMENT bullet)
+ (CHARWD R 4.08997)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT quotesinglbase)
+ (CHARWD R 2.7799)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT quotedblbase)
+ (CHARWD R 4.57996)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT perthousand)
+ (CHARWD R 12.07996)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 195 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 196 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 197 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 198 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R -5.67993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 199 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 203 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 206 (COMMENT ogonek)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 225 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 227 (COMMENT ordfeminine)
+ (CHARWD R 3.8999)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 232 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 233 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 234 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 235 (COMMENT ordmasculine)
+ (CHARWD R 3.97998)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 241 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 245 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 248 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 249 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 251 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+
+(COMMENT END OF FILE putr8a.pl)
diff --git a/fonts/utilities/vfinst/example/putr8r.pl b/fonts/utilities/vfinst/example/putr8r.pl
new file mode 100644
index 0000000000..dbcd160d76
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putr8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putr8r created by fontinst v1.500)
+
+(COMMENT Filename: putr8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putr8r}{putr8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putr8r.pl putr8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.04993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.2799)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.16992)
+ (CHARDP R -1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.75)
+ (CHARDP R 0.09998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.5)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.03992)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.87988)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.15991)
+ (CHARDP R -1.87988)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.54993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.08997)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.7799)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.57996)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.07996)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R -5.67993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 3.8999)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 3.97998)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 5.69995)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.5)
+ (CHARHT R 6.79993)
+ (CHARDP R -4.03992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.62)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.7699)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.0199)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.62)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.2799)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.21997)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.2699)
+ (CHARHT R 8.60999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 5.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 5.87988)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.40991)
+ (CHARHT R 8.81995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.7699)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.18994)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 5.05994)
+ (CHARHT R 6.82996)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.62)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.73999)
+ (CHARDP R -0.25989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.79993)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 2.90991)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 5.87988)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.62)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.09998)
+ (CHARHT R 8.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 5.1399)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.22998)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.79993)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.35999)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.62)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.22998)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+
+(COMMENT END OF FILE putr8r.pl)
diff --git a/fonts/utilities/vfinst/example/putrc7t.vpl b/fonts/utilities/vfinst/example/putrc7t.vpl
new file mode 100644
index 0000000000..16769ca88b
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putrc7t.vpl
@@ -0,0 +1,2395 @@
+(VTITLE virtual font putrc7t created by fontinst v1.500)
+
+(COMMENT Filename: putrc7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1c}{putrc7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putrc7t.vpl putrc7t.vf putrc7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putr8r) (FONTDSIZE R 10.0) (FONTAT R 8.0))
+(MAPFONT D 1 (FONTNAME putr8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT FFsmall)
+ (LIG D 105 D 14) (COMMENT Ismall FFIsmall)
+ (LIG D 108 D 15) (COMMENT Lsmall FFLsmall)
+ (STOP)
+ (LABEL D 17) (COMMENT dotlessJsmall)
+ (KRN D 93 R 0.17993) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 25) (COMMENT SSsmall)
+ (KRN D 39 R -0.08997) (COMMENT quoteright)
+ (KRN D 34 R -0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT Oslashsmall)
+ (KRN D 46 R -0.53992) (COMMENT period)
+ (KRN D 44 R -0.44995) (COMMENT comma)
+ (KRN D 89 R -0.48999) (COMMENT Y)
+ (KRN D 88 R -0.20996) (COMMENT X)
+ (KRN D 87 R -0.2699) (COMMENT W)
+ (KRN D 86 R -0.15991) (COMMENT V)
+ (KRN D 84 R -0.2699) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.23999) (COMMENT Tsmall)
+ (KRN D 118 R -0.1399) (COMMENT Vsmall)
+ (KRN D 119 R -0.23999) (COMMENT Wsmall)
+ (KRN D 120 R -0.17993) (COMMENT Xsmall)
+ (KRN D 121 R -0.43994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.2699) (COMMENT Tsmall)
+ (KRN D 118 R -0.15991) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.20996) (COMMENT Xsmall)
+ (KRN D 121 R -0.48999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT Lsmall Lslashsmall)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 39 R -0.71997) (COMMENT quoteright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (KRN D 106 R 0.71997) (COMMENT Jsmall)
+ (KRN D 116 R 0.56995) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.71997) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 39 R -1.19995) (COMMENT quoteright)
+ (KRN D 34 R -1.19995) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.05994) (COMMENT X)
+ (KRN D 87 R -0.57996) (COMMENT W)
+ (KRN D 86 R -0.71997) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.69995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 99 R -0.20996) (COMMENT Csmall)
+ (KRN D 103 R -0.20996) (COMMENT Gsmall)
+ (KRN D 111 R -0.20996) (COMMENT Osmall)
+ (KRN D 113 R -0.20996) (COMMENT Qsmall)
+ (KRN D 116 R -0.62988) (COMMENT Tsmall)
+ (KRN D 117 R -0.44995) (COMMENT Usmall)
+ (KRN D 118 R -0.6399) (COMMENT Vsmall)
+ (KRN D 119 R -0.5199) (COMMENT Wsmall)
+ (KRN D 120 R -0.04993) (COMMENT Xsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (KRN D 28 R -0.20996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.17993) (COMMENT Usmall)
+ (KRN D 118 R -0.17993) (COMMENT Vsmall)
+ (KRN D 119 R -0.21997) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 99 R -0.04993) (COMMENT Csmall)
+ (KRN D 103 R -0.04993) (COMMENT Gsmall)
+ (KRN D 111 R -0.04993) (COMMENT Osmall)
+ (KRN D 113 R -0.04993) (COMMENT Qsmall)
+ (KRN D 28 R -0.04993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (KRN D 118 R -0.30994) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 118 R -0.04993) (COMMENT Vsmall)
+ (KRN D 119 R -0.04993) (COMMENT Wsmall)
+ (KRN D 121 R -0.04993) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 97 R -0.53992) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 81 R -0.41992) (COMMENT Q)
+ (KRN D 79 R -0.41992) (COMMENT O)
+ (KRN D 71 R -0.41992) (COMMENT G)
+ (KRN D 67 R -0.41992) (COMMENT C)
+ (KRN D 31 R -0.41992) (COMMENT Oslash)
+ (KRN D 99 R -0.37) (COMMENT Csmall)
+ (KRN D 103 R -0.37) (COMMENT Gsmall)
+ (KRN D 111 R -0.37) (COMMENT Osmall)
+ (KRN D 113 R -0.37) (COMMENT Qsmall)
+ (KRN D 28 R -0.37) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R 0.09998) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 116 R -0.8999) (COMMENT Tsmall)
+ (KRN D 117 R -0.20996) (COMMENT Usmall)
+ (KRN D 118 R -0.8999) (COMMENT Vsmall)
+ (KRN D 119 R -0.80994) (COMMENT Wsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.2699) (COMMENT Tsmall)
+ (KRN D 118 R -0.15991) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.20996) (COMMENT Xsmall)
+ (KRN D 121 R -0.48999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 73 R -0.05994) (COMMENT I)
+ (KRN D 72 R -0.12) (COMMENT H)
+ (KRN D 69 R -0.05994) (COMMENT E)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 97 R -0.48999) (COMMENT Asmall)
+ (KRN D 101 R -0.04993) (COMMENT Esmall)
+ (KRN D 104 R -0.09998) (COMMENT Hsmall)
+ (KRN D 105 R -0.04993) (COMMENT Ismall)
+ (KRN D 16 R -0.04993) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 89 R -0.29993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.23999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.20996) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.15991) (COMMENT Vsmall)
+ (KRN D 119 R -0.20996) (COMMENT Wsmall)
+ (KRN D 120 R -0.20996) (COMMENT Xsmall)
+ (KRN D 121 R -0.2699) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.31995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 99 R -0.20996) (COMMENT Csmall)
+ (KRN D 103 R -0.20996) (COMMENT Gsmall)
+ (KRN D 111 R -0.20996) (COMMENT Osmall)
+ (KRN D 113 R -0.20996) (COMMENT Qsmall)
+ (KRN D 116 R -0.2799) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.2799) (COMMENT Vsmall)
+ (KRN D 119 R -0.20996) (COMMENT Wsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (KRN D 28 R -0.20996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 59 R -0.55994) (COMMENT semicolon)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.53992) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.6499) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R -0.57996) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 115 R -0.09998) (COMMENT Ssmall)
+ (KRN D 116 R 0.09998) (COMMENT Tsmall)
+ (KRN D 118 R 0.04993) (COMMENT Vsmall)
+ (KRN D 119 R 0.04993) (COMMENT Wsmall)
+ (KRN D 120 R 0.15991) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (KRN D 25 R -0.09998) (COMMENT SSsmall)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 97 R -0.53992) (COMMENT Asmall)
+ (KRN D 99 R -0.09998) (COMMENT Csmall)
+ (KRN D 103 R -0.09998) (COMMENT Gsmall)
+ (KRN D 111 R -0.09998) (COMMENT Osmall)
+ (KRN D 113 R -0.09998) (COMMENT Qsmall)
+ (KRN D 116 R 0.04993) (COMMENT Tsmall)
+ (KRN D 28 R -0.09998) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.47998) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 97 R -0.42993) (COMMENT Asmall)
+ (KRN D 99 R -0.04993) (COMMENT Csmall)
+ (KRN D 103 R -0.04993) (COMMENT Gsmall)
+ (KRN D 111 R -0.04993) (COMMENT Osmall)
+ (KRN D 113 R -0.04993) (COMMENT Qsmall)
+ (KRN D 116 R 0.15991) (COMMENT Tsmall)
+ (KRN D 28 R -0.04993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.05994) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R 0.04993) (COMMENT Asmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.20996) (COMMENT Qsmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 45 R -0.5) (COMMENT hyphen)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.31995) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R -0.2799) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 116 R 0.09998) (COMMENT Tsmall)
+ (KRN D 118 R 0.09998) (COMMENT Vsmall)
+ (KRN D 119 R 0.09998) (COMMENT Wsmall)
+ (KRN D 120 R 0.09998) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 97 R 0.17993) (COMMENT Asmall)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (KRN D 106 R 0.71997) (COMMENT Jsmall)
+ (KRN D 116 R 0.47998) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.71997) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 83 R -0.19995) (COMMENT S)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R -1.16992) (COMMENT Asmall)
+ (KRN D 98 R -0.17993) (COMMENT Bsmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 100 R -0.17993) (COMMENT Dsmall)
+ (KRN D 101 R -0.17993) (COMMENT Esmall)
+ (KRN D 102 R -0.17993) (COMMENT Fsmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 104 R -0.17993) (COMMENT Hsmall)
+ (KRN D 105 R -0.17993) (COMMENT Ismall)
+ (KRN D 106 R -0.35999) (COMMENT Jsmall)
+ (KRN D 107 R -0.17993) (COMMENT Ksmall)
+ (KRN D 108 R -0.17993) (COMMENT Lsmall)
+ (KRN D 109 R -0.17993) (COMMENT Msmall)
+ (KRN D 110 R -0.17993) (COMMENT Nsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 112 R -0.17993) (COMMENT Psmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 114 R -0.17993) (COMMENT Rsmall)
+ (KRN D 115 R -0.17993) (COMMENT Ssmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (KRN D 117 R -0.17993) (COMMENT Usmall)
+ (KRN D 118 R 0.15991) (COMMENT Vsmall)
+ (KRN D 119 R 0.15991) (COMMENT Wsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 122 R -0.17993) (COMMENT Zsmall)
+ (KRN D 170 R -0.17993) (COMMENT Lslashsmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (KRN D 25 R -0.17993) (COMMENT SSsmall)
+ (KRN D 16 R -0.17993) (COMMENT dotlessIsmall)
+ (KRN D 17 R -0.35999) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 96 R -0.71997) (COMMENT quoteleft)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.17993) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R -1.16992) (COMMENT Asmall)
+ (KRN D 98 R -0.17993) (COMMENT Bsmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 100 R -0.17993) (COMMENT Dsmall)
+ (KRN D 101 R -0.17993) (COMMENT Esmall)
+ (KRN D 102 R -0.17993) (COMMENT Fsmall)
+ (KRN D 103 R -0.35999) (COMMENT Gsmall)
+ (KRN D 104 R -0.17993) (COMMENT Hsmall)
+ (KRN D 105 R -0.17993) (COMMENT Ismall)
+ (KRN D 106 R -0.35999) (COMMENT Jsmall)
+ (KRN D 107 R -0.17993) (COMMENT Ksmall)
+ (KRN D 108 R -0.17993) (COMMENT Lsmall)
+ (KRN D 109 R -0.17993) (COMMENT Msmall)
+ (KRN D 110 R -0.17993) (COMMENT Nsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 112 R -0.17993) (COMMENT Psmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 114 R -0.17993) (COMMENT Rsmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (KRN D 117 R -0.17993) (COMMENT Usmall)
+ (KRN D 118 R 0.15991) (COMMENT Vsmall)
+ (KRN D 119 R 0.15991) (COMMENT Wsmall)
+ (KRN D 120 R 0.09998) (COMMENT Xsmall)
+ (KRN D 121 R 0.15991) (COMMENT Ysmall)
+ (KRN D 122 R -0.17993) (COMMENT Zsmall)
+ (KRN D 170 R -0.17993) (COMMENT Lslashsmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (KRN D 16 R -0.17993) (COMMENT dotlessIsmall)
+ (KRN D 17 R -0.35999) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 97) (COMMENT Asmall)
+ (KRN D 39 R -1.07996) (COMMENT quoteright)
+ (KRN D 34 R -1.07996) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 88 R -0.04993) (COMMENT X)
+ (KRN D 87 R -0.5199) (COMMENT W)
+ (KRN D 86 R -0.6399) (COMMENT V)
+ (KRN D 85 R -0.44995) (COMMENT U)
+ (KRN D 84 R -0.62988) (COMMENT T)
+ (KRN D 81 R -0.20996) (COMMENT Q)
+ (KRN D 79 R -0.20996) (COMMENT O)
+ (KRN D 71 R -0.20996) (COMMENT G)
+ (KRN D 67 R -0.20996) (COMMENT C)
+ (KRN D 31 R -0.20996) (COMMENT Oslash)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 116 R -0.55994) (COMMENT Tsmall)
+ (KRN D 117 R -0.3999) (COMMENT Usmall)
+ (KRN D 118 R -0.56995) (COMMENT Vsmall)
+ (KRN D 119 R -0.45996) (COMMENT Wsmall)
+ (KRN D 120 R -0.03992) (COMMENT Xsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 98) (COMMENT Bsmall)
+ (KRN D 46 R -0.2699) (COMMENT period)
+ (KRN D 44 R -0.17993) (COMMENT comma)
+ (KRN D 87 R -0.21997) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.17993) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.15991) (COMMENT Usmall)
+ (KRN D 118 R -0.15991) (COMMENT Vsmall)
+ (KRN D 119 R -0.18994) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 99) (COMMENT Csmall)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 100) (COMMENT Dsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.53992) (COMMENT period)
+ (KRN D 44 R -0.44995) (COMMENT comma)
+ (KRN D 89 R -0.3999) (COMMENT Y)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.30994) (COMMENT V)
+ (KRN D 118 R -0.2699) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 121 R -0.35999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 101) (COMMENT Esmall)
+ (KRN D 89 R -0.04993) (COMMENT Y)
+ (KRN D 87 R -0.04993) (COMMENT W)
+ (KRN D 86 R -0.04993) (COMMENT V)
+ (KRN D 118 R -0.03992) (COMMENT Vsmall)
+ (KRN D 119 R -0.03992) (COMMENT Wsmall)
+ (KRN D 121 R -0.03992) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 102) (COMMENT Fsmall)
+ (LIG D 105 D 12) (COMMENT Ismall FIsmall)
+ (LIG D 102 D 11) (COMMENT Fsmall FFsmall)
+ (LIG D 108 D 13) (COMMENT Lsmall FLsmall)
+ (KRN D 46 R -1.62) (COMMENT period)
+ (KRN D 44 R -1.62) (COMMENT comma)
+ (KRN D 65 R -0.53992) (COMMENT A)
+ (KRN D 97 R -0.47998) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 106) (COMMENT Jsmall)
+ (KRN D 93 R 0.17993) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 107) (COMMENT Ksmall)
+ (KRN D 81 R -0.37) (COMMENT Q)
+ (KRN D 79 R -0.37) (COMMENT O)
+ (KRN D 71 R -0.37) (COMMENT G)
+ (KRN D 67 R -0.37) (COMMENT C)
+ (KRN D 31 R -0.37) (COMMENT Oslash)
+ (KRN D 99 R -0.32996) (COMMENT Csmall)
+ (KRN D 103 R -0.32996) (COMMENT Gsmall)
+ (KRN D 111 R -0.32996) (COMMENT Osmall)
+ (KRN D 113 R -0.32996) (COMMENT Qsmall)
+ (KRN D 28 R -0.32996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 108) (COMMENT Lsmall)
+ (KRN D 39 R -1.16992) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 87 R -0.80994) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.20996) (COMMENT U)
+ (KRN D 84 R -0.8999) (COMMENT T)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.08997) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 65 R 0.09998) (COMMENT A)
+ (KRN D 31 R -0.08997) (COMMENT Oslash)
+ (KRN D 97 R 0.08997) (COMMENT Asmall)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.07996) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 116 R -0.80994) (COMMENT Tsmall)
+ (KRN D 117 R -0.17993) (COMMENT Usmall)
+ (KRN D 118 R -0.80994) (COMMENT Vsmall)
+ (KRN D 119 R -0.71997) (COMMENT Wsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (KRN D 28 R -0.07996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 111) (COMMENT Osmall)
+ (KRN D 46 R -0.53992) (COMMENT period)
+ (KRN D 44 R -0.44995) (COMMENT comma)
+ (KRN D 89 R -0.48999) (COMMENT Y)
+ (KRN D 88 R -0.20996) (COMMENT X)
+ (KRN D 87 R -0.2699) (COMMENT W)
+ (KRN D 86 R -0.15991) (COMMENT V)
+ (KRN D 84 R -0.2699) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.23999) (COMMENT Tsmall)
+ (KRN D 118 R -0.1399) (COMMENT Vsmall)
+ (KRN D 119 R -0.23999) (COMMENT Wsmall)
+ (KRN D 120 R -0.17993) (COMMENT Xsmall)
+ (KRN D 121 R -0.43994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 112) (COMMENT Psmall)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 45 R -0.35999) (COMMENT hyphen)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 73 R -0.04993) (COMMENT I)
+ (KRN D 72 R -0.09998) (COMMENT H)
+ (KRN D 69 R -0.04993) (COMMENT E)
+ (KRN D 65 R -0.48999) (COMMENT A)
+ (KRN D 97 R -0.43994) (COMMENT Asmall)
+ (KRN D 101 R -0.03992) (COMMENT Esmall)
+ (KRN D 104 R -0.08997) (COMMENT Hsmall)
+ (KRN D 105 R -0.03992) (COMMENT Ismall)
+ (KRN D 16 R -0.03992) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 113) (COMMENT Qsmall)
+ (KRN D 89 R -0.2699) (COMMENT Y)
+ (KRN D 88 R -0.20996) (COMMENT X)
+ (KRN D 87 R -0.20996) (COMMENT W)
+ (KRN D 86 R -0.15991) (COMMENT V)
+ (KRN D 85 R -0.2699) (COMMENT U)
+ (KRN D 84 R -0.20996) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.23999) (COMMENT Usmall)
+ (KRN D 118 R -0.1399) (COMMENT Vsmall)
+ (KRN D 119 R -0.17993) (COMMENT Wsmall)
+ (KRN D 120 R -0.17993) (COMMENT Xsmall)
+ (KRN D 121 R -0.23999) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 114) (COMMENT Rsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 45 R -0.2699) (COMMENT hyphen)
+ (KRN D 89 R -0.3999) (COMMENT Y)
+ (KRN D 87 R -0.20996) (COMMENT W)
+ (KRN D 86 R -0.2799) (COMMENT V)
+ (KRN D 85 R -0.2699) (COMMENT U)
+ (KRN D 84 R -0.2799) (COMMENT T)
+ (KRN D 81 R -0.20996) (COMMENT Q)
+ (KRN D 79 R -0.20996) (COMMENT O)
+ (KRN D 71 R -0.20996) (COMMENT G)
+ (KRN D 67 R -0.20996) (COMMENT C)
+ (KRN D 31 R -0.20996) (COMMENT Oslash)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 116 R -0.25) (COMMENT Tsmall)
+ (KRN D 117 R -0.23999) (COMMENT Usmall)
+ (KRN D 118 R -0.25) (COMMENT Vsmall)
+ (KRN D 119 R -0.17993) (COMMENT Wsmall)
+ (KRN D 121 R -0.35999) (COMMENT Ysmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 115) (COMMENT Ssmall)
+ (KRN D 39 R -0.08997) (COMMENT quoteright)
+ (KRN D 34 R -0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT Tsmall)
+ (KRN D 59 R -0.5) (COMMENT semicolon)
+ (KRN D 39 R 0.20996) (COMMENT quoteright)
+ (KRN D 46 R -0.98999) (COMMENT period)
+ (KRN D 41 R 0.47998) (COMMENT parenright)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 44 R -0.98999) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.47998) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.15991) (COMMENT X)
+ (KRN D 87 R 0.04993) (COMMENT W)
+ (KRN D 86 R 0.04993) (COMMENT V)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 83 R -0.09998) (COMMENT S)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.15991) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.15991) (COMMENT Oslash)
+ (KRN D 97 R -0.5199) (COMMENT Asmall)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.1399) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 115 R -0.08997) (COMMENT Ssmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (KRN D 118 R 0.03992) (COMMENT Vsmall)
+ (KRN D 119 R 0.03992) (COMMENT Wsmall)
+ (KRN D 120 R 0.1399) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.1399) (COMMENT Oslashsmall)
+ (KRN D 25 R -0.08997) (COMMENT SSsmall)
+ (STOP)
+ (LABEL D 117) (COMMENT Usmall)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 97 R -0.31995) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 118) (COMMENT Vsmall)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 39 R 0.31995) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -1.25989) (COMMENT period)
+ (KRN D 41 R 0.75989) (COMMENT parenright)
+ (KRN D 45 R -0.53992) (COMMENT hyphen)
+ (KRN D 44 R -1.25989) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 84 R 0.04993) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.53992) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R -0.47998) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R 0.03992) (COMMENT Tsmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 119) (COMMENT Wsmall)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.31995) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.98999) (COMMENT period)
+ (KRN D 41 R 0.75989) (COMMENT parenright)
+ (KRN D 45 R -0.35999) (COMMENT hyphen)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 84 R 0.15991) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.42993) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 97 R -0.37988) (COMMENT Asmall)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 116 R 0.1399) (COMMENT Tsmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 120) (COMMENT Xsmall)
+ (KRN D 39 R 0.12988) (COMMENT quoteright)
+ (KRN D 81 R -0.20996) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 65 R 0.04993) (COMMENT A)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 97 R 0.03992) (COMMENT Asmall)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 121) (COMMENT Ysmall)
+ (KRN D 59 R -0.32996) (COMMENT semicolon)
+ (KRN D 39 R 0.31995) (COMMENT quoteright)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (KRN D 46 R -0.80994) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 45 R -0.44995) (COMMENT hyphen)
+ (KRN D 44 R -0.80994) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.09998) (COMMENT W)
+ (KRN D 86 R 0.09998) (COMMENT V)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.15991) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 65 R -0.2799) (COMMENT A)
+ (KRN D 31 R -0.15991) (COMMENT Oslash)
+ (KRN D 97 R -0.25) (COMMENT Asmall)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.1399) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (KRN D 118 R 0.08997) (COMMENT Vsmall)
+ (KRN D 119 R 0.08997) (COMMENT Wsmall)
+ (KRN D 120 R 0.08997) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.1399) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 122) (COMMENT Zsmall)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.17993) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 97 R 0.15991) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.15991) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 28 R -0.15991) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R 0.09998) (COMMENT Asmall)
+ (KRN D 99 R -0.15991) (COMMENT Csmall)
+ (KRN D 103 R -0.15991) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.15991) (COMMENT Qsmall)
+ (KRN D 116 R -0.8999) (COMMENT Tsmall)
+ (KRN D 117 R -0.20996) (COMMENT Usmall)
+ (KRN D 118 R -0.8999) (COMMENT Vsmall)
+ (KRN D 119 R -0.80994) (COMMENT Wsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 170) (COMMENT Lslashsmall)
+ (KRN D 39 R -1.16992) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 87 R -0.80994) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.20996) (COMMENT U)
+ (KRN D 84 R -0.8999) (COMMENT T)
+ (KRN D 81 R -0.15991) (COMMENT Q)
+ (KRN D 79 R -0.08997) (COMMENT O)
+ (KRN D 71 R -0.15991) (COMMENT G)
+ (KRN D 67 R -0.15991) (COMMENT C)
+ (KRN D 65 R 0.09998) (COMMENT A)
+ (KRN D 31 R -0.08997) (COMMENT Oslash)
+ (KRN D 97 R 0.08997) (COMMENT Asmall)
+ (KRN D 99 R -0.1399) (COMMENT Csmall)
+ (KRN D 103 R -0.1399) (COMMENT Gsmall)
+ (KRN D 111 R -0.07996) (COMMENT Osmall)
+ (KRN D 113 R -0.1399) (COMMENT Qsmall)
+ (KRN D 116 R -0.80994) (COMMENT Tsmall)
+ (KRN D 117 R -0.17993) (COMMENT Usmall)
+ (KRN D 118 R -0.80994) (COMMENT Vsmall)
+ (KRN D 119 R -0.71997) (COMMENT Wsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (KRN D 28 R -0.07996) (COMMENT Oslashsmall)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 11 (COMMENT FFsmall)
+ (CHARWD R 10.2799)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 12 (COMMENT FIsmall)
+ (CHARWD R 8.42993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 13 (COMMENT FLsmall)
+ (CHARWD R 10.17993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 14 (COMMENT FFIsmall)
+ (CHARWD R 13.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 15 (COMMENT FFLsmall)
+ (CHARWD R 15.31995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessIsmall)
+ (CHARWD R 3.28992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessJsmall)
+ (CHARWD R 3.29993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.5)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.5)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.5)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.5)
+ (CHARHT R 7.03992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.5)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (MOVERIGHT R 1.16992)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 25 (COMMENT SSsmall)
+ (CHARWD R 9.6399)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 26 (COMMENT AEsmall)
+ (CHARWD R 7.5)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 27 (COMMENT OEsmall)
+ (CHARWD R 8.69995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 28 (COMMENT Oslashsmall)
+ (CHARWD R 6.58997)
+ (CHARHT R 5.90991)
+ (CHARDP R 0.41992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 9.25989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 8.12)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.91992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 5.07996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.79993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.87988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.55994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 3.2799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.62)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 3.1499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 4.41992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 3.1499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 5.09998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 3.1499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 3.1499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.91992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.19995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.3899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.3899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.42993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 8.28992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.55994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 6.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.47998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.98999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.07996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 8.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 8.12)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 8.12)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.90991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 8.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.83997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.37988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 5.07996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.5)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.5)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 3.2799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 97 (COMMENT Asmall)
+ (CHARWD R 5.57996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 98 (COMMENT Bsmall)
+ (CHARWD R 5.65991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 99 (COMMENT Csmall)
+ (CHARWD R 5.96997)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 100 (COMMENT Dsmall)
+ (CHARWD R 6.72998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 101 (COMMENT Esmall)
+ (CHARWD R 5.33997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 102 (COMMENT Fsmall)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 103 (COMMENT Gsmall)
+ (CHARWD R 6.37)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 104 (COMMENT Hsmall)
+ (CHARWD R 6.87988)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 105 (COMMENT Ismall)
+ (CHARWD R 3.28992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 106 (COMMENT Jsmall)
+ (CHARWD R 3.29993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.90991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 107 (COMMENT Ksmall)
+ (CHARWD R 5.75989)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 108 (COMMENT Lsmall)
+ (CHARWD R 5.03992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 109 (COMMENT Msmall)
+ (CHARWD R 8.04993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 110 (COMMENT Nsmall)
+ (CHARWD R 6.73999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 111 (COMMENT Osmall)
+ (CHARWD R 6.58997)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 112 (COMMENT Psmall)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 113 (COMMENT Qsmall)
+ (CHARWD R 6.58997)
+ (CHARHT R 5.6499)
+ (CHARDP R 1.53992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 114 (COMMENT Rsmall)
+ (CHARWD R 5.6499)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 115 (COMMENT Ssmall)
+ (CHARWD R 4.81995)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 116 (COMMENT Tsmall)
+ (CHARWD R 5.45996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 117 (COMMENT Usmall)
+ (CHARWD R 6.81995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 118 (COMMENT Vsmall)
+ (CHARWD R 5.56995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 119 (COMMENT Wsmall)
+ (CHARWD R 8.0199)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 120 (COMMENT Xsmall)
+ (CHARWD R 5.48999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 121 (COMMENT Ysmall)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 122 (COMMENT Zsmall)
+ (CHARWD R 5.37988)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.5)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.5)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.5)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.5)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.5)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putr8r at 10.0pt)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 170 (COMMENT Lslashsmall)
+ (CHARWD R 5.08997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+
+(COMMENT END OF FILE putrc7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putri7t.vpl b/fonts/utilities/vfinst/example/putri7t.vpl
new file mode 100644
index 0000000000..b6d12891c6
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putri7t.vpl
@@ -0,0 +1,2386 @@
+(VTITLE virtual font putri7t created by fontinst v1.500)
+
+(COMMENT Filename: putri7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1i}{putri7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putri7t.vpl putri7t.vf putri7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putri8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 116 R -0.34998) (COMMENT t)
+ (KRN D 115 R -0.54993) (COMMENT s)
+ (KRN D 114 R -0.25) (COMMENT r)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.25) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.75) (COMMENT Y)
+ (KRN D 87 R 0.75) (COMMENT W)
+ (KRN D 86 R 0.75) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R 0.09998) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.1499) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 106 R 0.05994) (COMMENT j)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 89 R -0.75989) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.79993) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.59998) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.19995) (COMMENT u)
+ (KRN D 114 R -0.1499) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R -0.25) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.5) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 120 R 0.04993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R 0.04993) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.15991) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R 0.09998) (COMMENT o)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 27 R 0.09998) (COMMENT oe)
+ (KRN D 28 R 0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.25) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 46 R -2.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.25) (COMMENT l)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -2.19995) (COMMENT comma)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 73 R -0.29993) (COMMENT I)
+ (KRN D 72 R -0.29993) (COMMENT H)
+ (KRN D 69 R -0.29993) (COMMENT E)
+ (KRN D 65 R -0.75) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 85 R -0.34998) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.1399) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.05994) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.29993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 104 R -0.29993) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.69995) (COMMENT z)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.6399) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 115 R -0.71997) (COMMENT s)
+ (KRN D 114 R -0.6399) (COMMENT r)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.5) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.6399) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.09998) (COMMENT colon)
+ (KRN D 93 R 0.44995) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.55994) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 110 R -0.44995) (COMMENT n)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.34998) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.45996) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.34998) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.75) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.62) (COMMENT o)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.5199) (COMMENT e)
+ (KRN D 44 R -1.19995) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.62) (COMMENT oe)
+ (KRN D 28 R -0.62) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.41992) (COMMENT y)
+ (KRN D 117 R -0.55994) (COMMENT u)
+ (KRN D 116 R -0.19995) (COMMENT t)
+ (KRN D 59 R -0.2799) (COMMENT semicolon)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 39 R 0.54993) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.07996) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.34998) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.53992) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 44 R -1.07996) (COMMENT comma)
+ (KRN D 58 R -0.2799) (COMMENT colon)
+ (KRN D 93 R 0.54993) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.34998) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.57996) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.71997) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.94995) (COMMENT hyphen)
+ (KRN D 101 R -0.71997) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.81995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.25) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.71997) (COMMENT oe)
+ (KRN D 28 R -0.71997) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.3999) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.3999) (COMMENT e)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.09998) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 96 R -0.17993) (COMMENT quoteleft)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.44995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 118 R -0.1499) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 112 R 0.12) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.34998) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.19995) (COMMENT k)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25989) (COMMENT d)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.54993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.69995) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.29993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.21997)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.08997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.08997)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.71997)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.35999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.23999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.12)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.12)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 0.3899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (CHARIC R 0.43994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 163) (COMMENT sterling)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (CHARIC R 0.48999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.19995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.82996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.35999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.48999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.28992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.73999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.21997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.62988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.37)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.57996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putri7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putri8a.afm b/fonts/utilities/vfinst/example/putri8a.afm
new file mode 100644
index 0000000000..b3dd45b553
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putri8a.afm
@@ -0,0 +1,1008 @@
+StartFontMetrics 2.0
+Comment Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Fri Jan 17 13:15:45 1992
+Comment UniqueID 37666
+Comment VMusage 34143 41035
+FontName Utopia-Italic
+FullName Utopia Italic
+FamilyName Utopia
+Weight Regular
+ItalicAngle -13
+IsFixedPitch false
+FontBBox -201 -250 1170 890
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.002
+Notice Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.
+EncodingScheme AdobeStandardEncoding
+CapHeight 692
+XHeight 502
+Ascender 742
+Descender -242
+StartCharMetrics 228
+C 32 ; WX 225 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 240 ; N exclam ; B 34 -12 290 707 ;
+C 34 ; WX 402 ; N quotedbl ; B 171 469 454 742 ;
+C 35 ; WX 530 ; N numbersign ; B 54 0 585 668 ;
+C 36 ; WX 530 ; N dollar ; B 31 -109 551 743 ;
+C 37 ; WX 826 ; N percent ; B 98 -25 795 702 ;
+C 38 ; WX 725 ; N ampersand ; B 60 -12 703 680 ;
+C 39 ; WX 216 ; N quoteright ; B 112 482 265 742 ;
+C 40 ; WX 350 ; N parenleft ; B 106 -128 458 692 ;
+C 41 ; WX 350 ; N parenright ; B -46 -128 306 692 ;
+C 42 ; WX 412 ; N asterisk ; B 106 356 458 707 ;
+C 43 ; WX 570 ; N plus ; B 58 0 542 490 ;
+C 44 ; WX 265 ; N comma ; B 11 -134 173 142 ;
+C 45 ; WX 392 ; N hyphen ; B 82 216 341 286 ;
+C 46 ; WX 265 ; N period ; B 47 -12 169 113 ;
+C 47 ; WX 270 ; N slash ; B 0 -15 341 707 ;
+C 48 ; WX 530 ; N zero ; B 60 -12 541 680 ;
+C 49 ; WX 530 ; N one ; B 74 0 429 680 ;
+C 50 ; WX 530 ; N two ; B -2 0 538 680 ;
+C 51 ; WX 530 ; N three ; B 19 -12 524 680 ;
+C 52 ; WX 530 ; N four ; B 32 0 509 668 ;
+C 53 ; WX 530 ; N five ; B 24 -12 550 668 ;
+C 54 ; WX 530 ; N six ; B 56 -12 551 680 ;
+C 55 ; WX 530 ; N seven ; B 130 -12 600 668 ;
+C 56 ; WX 530 ; N eight ; B 46 -12 535 680 ;
+C 57 ; WX 530 ; N nine ; B 51 -12 536 680 ;
+C 58 ; WX 265 ; N colon ; B 47 -12 248 490 ;
+C 59 ; WX 265 ; N semicolon ; B 11 -134 248 490 ;
+C 60 ; WX 570 ; N less ; B 51 1 529 497 ;
+C 61 ; WX 570 ; N equal ; B 58 111 542 389 ;
+C 62 ; WX 570 ; N greater ; B 51 1 529 497 ;
+C 63 ; WX 425 ; N question ; B 115 -12 456 707 ;
+C 64 ; WX 794 ; N at ; B 88 -15 797 707 ;
+C 65 ; WX 624 ; N A ; B -58 0 623 692 ;
+C 66 ; WX 632 ; N B ; B 3 0 636 692 ;
+C 67 ; WX 661 ; N C ; B 79 -15 723 707 ;
+C 68 ; WX 763 ; N D ; B 5 0 767 692 ;
+C 69 ; WX 596 ; N E ; B 3 0 657 692 ;
+C 70 ; WX 571 ; N F ; B 3 0 660 692 ;
+C 71 ; WX 709 ; N G ; B 79 -15 737 707 ;
+C 72 ; WX 775 ; N H ; B 5 0 857 692 ;
+C 73 ; WX 345 ; N I ; B 5 0 428 692 ;
+C 74 ; WX 352 ; N J ; B -78 -119 436 692 ;
+C 75 ; WX 650 ; N K ; B 5 -5 786 692 ;
+C 76 ; WX 565 ; N L ; B 5 0 568 692 ;
+C 77 ; WX 920 ; N M ; B -4 0 1002 692 ;
+C 78 ; WX 763 ; N N ; B -4 0 855 692 ;
+C 79 ; WX 753 ; N O ; B 79 -15 754 707 ;
+C 80 ; WX 614 ; N P ; B 5 0 646 692 ;
+C 81 ; WX 753 ; N Q ; B 79 -203 754 707 ;
+C 82 ; WX 640 ; N R ; B 5 0 642 692 ;
+C 83 ; WX 533 ; N S ; B 34 -15 542 707 ;
+C 84 ; WX 606 ; N T ; B 102 0 708 692 ;
+C 85 ; WX 794 ; N U ; B 131 -15 880 692 ;
+C 86 ; WX 637 ; N V ; B 96 0 786 692 ;
+C 87 ; WX 946 ; N W ; B 86 0 1075 692 ;
+C 88 ; WX 632 ; N X ; B -36 0 735 692 ;
+C 89 ; WX 591 ; N Y ; B 96 0 744 692 ;
+C 90 ; WX 622 ; N Z ; B -20 0 703 692 ;
+C 91 ; WX 330 ; N bracketleft ; B 69 -128 414 692 ;
+C 92 ; WX 390 ; N backslash ; B 89 -15 371 707 ;
+C 93 ; WX 330 ; N bracketright ; B -21 -128 324 692 ;
+C 94 ; WX 570 ; N asciicircum ; B 83 228 547 668 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 216 ; N quoteleft ; B 130 488 283 748 ;
+C 97 ; WX 561 ; N a ; B 31 -12 563 502 ;
+C 98 ; WX 559 ; N b ; B 47 -12 557 742 ;
+C 99 ; WX 441 ; N c ; B 46 -12 465 502 ;
+C 100 ; WX 587 ; N d ; B 37 -12 612 742 ;
+C 101 ; WX 453 ; N e ; B 45 -12 471 502 ;
+C 102 ; WX 315 ; N f ; B -107 -242 504 742 ; L i fi ; L l fl ;
+C 103 ; WX 499 ; N g ; B -5 -242 573 512 ;
+C 104 ; WX 607 ; N h ; B 57 -12 588 742 ;
+C 105 ; WX 317 ; N i ; B 79 -12 328 715 ;
+C 106 ; WX 309 ; N j ; B -95 -242 330 715 ;
+C 107 ; WX 545 ; N k ; B 57 -12 567 742 ;
+C 108 ; WX 306 ; N l ; B 76 -12 331 742 ;
+C 109 ; WX 912 ; N m ; B 63 -12 894 502 ;
+C 110 ; WX 618 ; N n ; B 63 -12 600 502 ;
+C 111 ; WX 537 ; N o ; B 49 -12 522 502 ;
+C 112 ; WX 590 ; N p ; B 22 -242 586 502 ;
+C 113 ; WX 559 ; N q ; B 38 -242 567 525 ;
+C 114 ; WX 402 ; N r ; B 69 -12 448 502 ;
+C 115 ; WX 389 ; N s ; B 19 -12 397 502 ;
+C 116 ; WX 341 ; N t ; B 84 -12 404 616 ;
+C 117 ; WX 618 ; N u ; B 89 -12 609 502 ;
+C 118 ; WX 510 ; N v ; B 84 -12 528 502 ;
+C 119 ; WX 785 ; N w ; B 87 -12 808 502 ;
+C 120 ; WX 516 ; N x ; B -4 -12 531 502 ;
+C 121 ; WX 468 ; N y ; B -40 -242 505 502 ;
+C 122 ; WX 468 ; N z ; B 4 -12 483 490 ;
+C 123 ; WX 340 ; N braceleft ; B 100 -128 423 692 ;
+C 124 ; WX 270 ; N bar ; B 130 -250 198 750 ;
+C 125 ; WX 340 ; N braceright ; B -20 -128 302 692 ;
+C 126 ; WX 570 ; N asciitilde ; B 98 176 522 318 ;
+C 161 ; WX 240 ; N exclamdown ; B -18 -217 238 502 ;
+C 162 ; WX 530 ; N cent ; B 94 -21 563 669 ;
+C 163 ; WX 530 ; N sterling ; B 9 0 549 680 ;
+C 164 ; WX 100 ; N fraction ; B -201 -24 369 698 ;
+C 165 ; WX 530 ; N yen ; B 72 0 645 668 ;
+C 166 ; WX 530 ; N florin ; B 4 -135 588 691 ;
+C 167 ; WX 530 ; N section ; B 55 -115 533 707 ;
+C 168 ; WX 530 ; N currency ; B 56 90 536 578 ;
+C 169 ; WX 216 ; N quotesingle ; B 161 469 274 742 ;
+C 170 ; WX 402 ; N quotedblleft ; B 134 488 473 748 ;
+C 171 ; WX 462 ; N guillemotleft ; B 79 41 470 435 ;
+C 172 ; WX 277 ; N guilsinglleft ; B 71 41 267 435 ;
+C 173 ; WX 277 ; N guilsinglright ; B 44 41 240 435 ;
+C 174 ; WX 607 ; N fi ; B -107 -242 589 742 ;
+C 175 ; WX 603 ; N fl ; B -107 -242 628 742 ;
+C 177 ; WX 500 ; N endash ; B 12 221 524 279 ;
+C 178 ; WX 500 ; N dagger ; B 101 -125 519 717 ;
+C 179 ; WX 490 ; N daggerdbl ; B 39 -119 509 717 ;
+C 180 ; WX 265 ; N periodcentered ; B 89 187 211 312 ;
+C 182 ; WX 560 ; N paragraph ; B 109 -101 637 692 ;
+C 183 ; WX 500 ; N bullet ; B 110 192 429 512 ;
+C 184 ; WX 216 ; N quotesinglbase ; B -7 -109 146 151 ;
+C 185 ; WX 402 ; N quotedblbase ; B -7 -109 332 151 ;
+C 186 ; WX 402 ; N quotedblright ; B 107 484 446 744 ;
+C 187 ; WX 462 ; N guillemotright ; B 29 41 420 435 ;
+C 188 ; WX 1000 ; N ellipsis ; B 85 -12 873 113 ;
+C 189 ; WX 1200 ; N perthousand ; B 98 -25 1170 702 ;
+C 191 ; WX 425 ; N questiondown ; B 3 -217 344 502 ;
+C 193 ; WX 400 ; N grave ; B 146 542 368 723 ;
+C 194 ; WX 400 ; N acute ; B 214 542 436 723 ;
+C 195 ; WX 400 ; N circumflex ; B 187 546 484 720 ;
+C 196 ; WX 400 ; N tilde ; B 137 563 492 682 ;
+C 197 ; WX 400 ; N macron ; B 193 597 489 656 ;
+C 198 ; WX 400 ; N breve ; B 227 568 501 698 ;
+C 199 ; WX 402 ; N dotaccent ; B 252 570 359 680 ;
+C 200 ; WX 400 ; N dieresis ; B 172 572 487 682 ;
+C 202 ; WX 400 ; N ring ; B 186 550 402 752 ;
+C 203 ; WX 400 ; N cedilla ; B 62 -230 241 0 ;
+C 205 ; WX 400 ; N hungarumlaut ; B 176 546 455 750 ;
+C 206 ; WX 350 ; N ogonek ; B 68 -219 248 0 ;
+C 207 ; WX 400 ; N caron ; B 213 557 510 731 ;
+C 208 ; WX 1000 ; N emdash ; B 12 221 1024 279 ;
+C 225 ; WX 880 ; N AE ; B -88 0 941 692 ;
+C 227 ; WX 425 ; N ordfeminine ; B 77 265 460 590 ;
+C 232 ; WX 571 ; N Lslash ; B 11 0 574 692 ;
+C 233 ; WX 753 ; N Oslash ; B 79 -45 754 736 ;
+C 234 ; WX 1020 ; N OE ; B 79 0 1081 692 ;
+C 235 ; WX 389 ; N ordmasculine ; B 86 265 420 590 ;
+C 241 ; WX 779 ; N ae ; B 34 -12 797 514 ;
+C 245 ; WX 317 ; N dotlessi ; B 79 -12 299 502 ;
+C 248 ; WX 318 ; N lslash ; B 45 -12 376 742 ;
+C 249 ; WX 537 ; N oslash ; B 49 -39 522 529 ;
+C 250 ; WX 806 ; N oe ; B 49 -12 824 502 ;
+C 251 ; WX 577 ; N germandbls ; B -107 -242 630 742 ;
+C -1 ; WX 370 ; N onesuperior ; B 90 272 326 680 ;
+C -1 ; WX 570 ; N minus ; B 58 221 542 279 ;
+C -1 ; WX 400 ; N degree ; B 152 404 428 680 ;
+C -1 ; WX 537 ; N oacute ; B 49 -12 530 723 ;
+C -1 ; WX 753 ; N Odieresis ; B 79 -15 754 848 ;
+C -1 ; WX 537 ; N odieresis ; B 49 -12 532 682 ;
+C -1 ; WX 596 ; N Eacute ; B 3 0 657 890 ;
+C -1 ; WX 618 ; N ucircumflex ; B 89 -12 609 720 ;
+C -1 ; WX 890 ; N onequarter ; B 97 -24 805 698 ;
+C -1 ; WX 570 ; N logicalnot ; B 58 102 542 389 ;
+C -1 ; WX 596 ; N Ecircumflex ; B 3 0 657 876 ;
+C -1 ; WX 890 ; N onehalf ; B 71 -24 812 698 ;
+C -1 ; WX 753 ; N Otilde ; B 79 -15 754 842 ;
+C -1 ; WX 618 ; N uacute ; B 89 -12 609 723 ;
+C -1 ; WX 453 ; N eacute ; B 45 -12 508 723 ;
+C -1 ; WX 317 ; N iacute ; B 79 -12 398 723 ;
+C -1 ; WX 596 ; N Egrave ; B 3 0 657 890 ;
+C -1 ; WX 317 ; N icircumflex ; B 79 -12 383 720 ;
+C -1 ; WX 618 ; N mu ; B 11 -232 609 502 ;
+C -1 ; WX 270 ; N brokenbar ; B 130 -175 198 675 ;
+C -1 ; WX 584 ; N thorn ; B 16 -242 580 700 ;
+C -1 ; WX 624 ; N Aring ; B -58 0 623 861 ;
+C -1 ; WX 468 ; N yacute ; B -40 -242 505 723 ;
+C -1 ; WX 591 ; N Ydieresis ; B 96 0 744 848 ;
+C -1 ; WX 1100 ; N trademark ; B 91 277 1094 692 ;
+C -1 ; WX 836 ; N registered ; B 91 -15 819 707 ;
+C -1 ; WX 537 ; N ocircumflex ; B 49 -12 522 720 ;
+C -1 ; WX 624 ; N Agrave ; B -58 0 623 890 ;
+C -1 ; WX 533 ; N Scaron ; B 34 -15 561 888 ;
+C -1 ; WX 794 ; N Ugrave ; B 131 -15 880 890 ;
+C -1 ; WX 596 ; N Edieresis ; B 3 0 657 848 ;
+C -1 ; WX 794 ; N Uacute ; B 131 -15 880 890 ;
+C -1 ; WX 537 ; N otilde ; B 49 -12 525 682 ;
+C -1 ; WX 618 ; N ntilde ; B 63 -12 600 682 ;
+C -1 ; WX 468 ; N ydieresis ; B -40 -242 513 682 ;
+C -1 ; WX 624 ; N Aacute ; B -58 0 642 890 ;
+C -1 ; WX 537 ; N eth ; B 47 -12 521 742 ;
+C -1 ; WX 561 ; N acircumflex ; B 31 -12 563 720 ;
+C -1 ; WX 561 ; N aring ; B 31 -12 563 752 ;
+C -1 ; WX 753 ; N Ograve ; B 79 -15 754 890 ;
+C -1 ; WX 441 ; N ccedilla ; B 46 -230 465 502 ;
+C -1 ; WX 570 ; N multiply ; B 88 22 532 478 ;
+C -1 ; WX 570 ; N divide ; B 58 25 542 475 ;
+C -1 ; WX 370 ; N twosuperior ; B 35 272 399 680 ;
+C -1 ; WX 763 ; N Ntilde ; B -4 0 855 842 ;
+C -1 ; WX 618 ; N ugrave ; B 89 -12 609 723 ;
+C -1 ; WX 794 ; N Ucircumflex ; B 131 -15 880 876 ;
+C -1 ; WX 624 ; N Atilde ; B -58 0 623 842 ;
+C -1 ; WX 468 ; N zcaron ; B 4 -12 484 731 ;
+C -1 ; WX 317 ; N idieresis ; B 79 -12 398 682 ;
+C -1 ; WX 624 ; N Acircumflex ; B -58 0 623 876 ;
+C -1 ; WX 345 ; N Icircumflex ; B 5 0 453 876 ;
+C -1 ; WX 591 ; N Yacute ; B 96 0 744 890 ;
+C -1 ; WX 753 ; N Oacute ; B 79 -15 754 890 ;
+C -1 ; WX 624 ; N Adieresis ; B -58 0 623 848 ;
+C -1 ; WX 622 ; N Zcaron ; B -20 0 703 888 ;
+C -1 ; WX 561 ; N agrave ; B 31 -12 563 723 ;
+C -1 ; WX 370 ; N threesuperior ; B 59 265 389 680 ;
+C -1 ; WX 537 ; N ograve ; B 49 -12 522 723 ;
+C -1 ; WX 890 ; N threequarters ; B 105 -24 816 698 ;
+C -1 ; WX 770 ; N Eth ; B 12 0 774 692 ;
+C -1 ; WX 570 ; N plusminus ; B 58 0 542 556 ;
+C -1 ; WX 618 ; N udieresis ; B 89 -12 609 682 ;
+C -1 ; WX 453 ; N edieresis ; B 45 -12 490 682 ;
+C -1 ; WX 561 ; N aacute ; B 31 -12 571 723 ;
+C -1 ; WX 317 ; N igrave ; B 55 -12 299 723 ;
+C -1 ; WX 345 ; N Idieresis ; B 5 0 461 848 ;
+C -1 ; WX 561 ; N adieresis ; B 31 -12 563 682 ;
+C -1 ; WX 345 ; N Iacute ; B 5 0 506 890 ;
+C -1 ; WX 836 ; N copyright ; B 91 -15 819 707 ;
+C -1 ; WX 345 ; N Igrave ; B 5 0 428 890 ;
+C -1 ; WX 661 ; N Ccedilla ; B 79 -230 723 707 ;
+C -1 ; WX 389 ; N scaron ; B 19 -12 457 731 ;
+C -1 ; WX 453 ; N egrave ; B 45 -12 471 723 ;
+C -1 ; WX 753 ; N Ocircumflex ; B 79 -15 754 876 ;
+C -1 ; WX 604 ; N Thorn ; B 5 0 616 692 ;
+C -1 ; WX 561 ; N atilde ; B 31 -12 563 682 ;
+C -1 ; WX 794 ; N Udieresis ; B 131 -15 880 848 ;
+C -1 ; WX 453 ; N ecircumflex ; B 45 -12 475 720 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 690
+
+KPX A y -20
+KPX A x 10
+KPX A w -30
+KPX A v -30
+KPX A u -10
+KPX A t -6
+KPX A s 15
+KPX A r -12
+KPX A quoteright -110
+KPX A quotedblright -110
+KPX A q 10
+KPX A p -12
+KPX A o -10
+KPX A n -18
+KPX A m -18
+KPX A l -18
+KPX A j 6
+KPX A h -6
+KPX A d 10
+KPX A c -6
+KPX A b -6
+KPX A a 12
+KPX A Y -76
+KPX A X -8
+KPX A W -80
+KPX A V -90
+KPX A U -60
+KPX A T -72
+KPX A Q -30
+KPX A O -30
+KPX A G -30
+KPX A C -30
+
+KPX B y -6
+KPX B u -20
+KPX B r -15
+KPX B quoteright -40
+KPX B quotedblright -30
+KPX B o 6
+KPX B l -20
+KPX B k -15
+KPX B i -12
+KPX B h -15
+KPX B e 6
+KPX B a 12
+KPX B W -20
+KPX B V -50
+KPX B U -50
+KPX B T -20
+
+KPX C z -6
+KPX C y -18
+KPX C u -18
+KPX C quotedblright 20
+KPX C i -5
+KPX C e -6
+KPX C a -6
+
+KPX D y 18
+KPX D u -10
+KPX D quoteright -40
+KPX D quotedblright -50
+KPX D period -30
+KPX D o 6
+KPX D i 6
+KPX D h -25
+KPX D e 6
+KPX D comma -20
+KPX D a 6
+KPX D Y -70
+KPX D W -50
+KPX D V -60
+
+KPX E z -6
+KPX E y -18
+KPX E x 5
+KPX E w -20
+KPX E v -18
+KPX E u -24
+KPX E t -18
+KPX E s 5
+KPX E r -6
+KPX E quoteright 10
+KPX E quotedblright 10
+KPX E q 10
+KPX E period 10
+KPX E p -12
+KPX E o -6
+KPX E n -12
+KPX E m -12
+KPX E l -12
+KPX E k -10
+KPX E j -6
+KPX E i -12
+KPX E g -12
+KPX E e 5
+KPX E d 10
+KPX E comma 10
+KPX E b -6
+
+KPX F y -12
+KPX F u -30
+KPX F r -18
+KPX F quoteright 15
+KPX F quotedblright 35
+KPX F period -180
+KPX F o -30
+KPX F l -6
+KPX F i -12
+KPX F e -30
+KPX F comma -170
+KPX F a -30
+KPX F A -45
+
+KPX G y -16
+KPX G u -22
+KPX G r -22
+KPX G quoteright -20
+KPX G quotedblright -20
+KPX G o 10
+KPX G n -22
+KPX G l -24
+KPX G i -12
+KPX G h -18
+KPX G e 10
+KPX G a 5
+
+KPX H y -18
+KPX H u -30
+KPX H quoteright 10
+KPX H quotedblright 10
+KPX H o -12
+KPX H i -12
+KPX H e -12
+KPX H a -12
+
+KPX I z -20
+KPX I y -6
+KPX I x -6
+KPX I w -30
+KPX I v -30
+KPX I u -30
+KPX I t -18
+KPX I s -18
+KPX I r -12
+KPX I quoteright 10
+KPX I quotedblright 10
+KPX I p -18
+KPX I o -12
+KPX I n -18
+KPX I m -18
+KPX I l -6
+KPX I k -6
+KPX I g -12
+KPX I f -6
+KPX I d -6
+KPX I c -12
+KPX I b -6
+KPX I a -6
+
+KPX J y -12
+KPX J u -36
+KPX J quoteright 6
+KPX J quotedblright 15
+KPX J o -36
+KPX J i -30
+KPX J e -36
+KPX J braceright 10
+KPX J a -36
+
+KPX K y -40
+KPX K w -30
+KPX K v -20
+KPX K u -24
+KPX K r -12
+KPX K quoteright 25
+KPX K quotedblright 40
+KPX K o -24
+KPX K n -18
+KPX K i -6
+KPX K h 6
+KPX K e -12
+KPX K a -6
+KPX K Q -24
+KPX K O -24
+KPX K G -24
+KPX K C -24
+
+KPX L y -55
+KPX L w -30
+KPX L u -18
+KPX L quoteright -110
+KPX L quotedblright -110
+KPX L l -16
+KPX L j -18
+KPX L i -18
+KPX L a 10
+KPX L Y -80
+KPX L W -90
+KPX L V -110
+KPX L U -42
+KPX L T -80
+KPX L Q -48
+KPX L O -48
+KPX L G -48
+KPX L C -48
+KPX L A 30
+
+KPX M y -18
+KPX M u -24
+KPX M quoteright 6
+KPX M quotedblright 15
+KPX M o -25
+KPX M n -12
+KPX M j -18
+KPX M i -12
+KPX M e -20
+KPX M d -10
+KPX M c -20
+KPX M a -6
+
+KPX N y -18
+KPX N u -24
+KPX N quoteright 10
+KPX N quotedblright 10
+KPX N o -25
+KPX N i -12
+KPX N e -20
+KPX N a -22
+
+KPX O z -6
+KPX O y 12
+KPX O w -10
+KPX O v -10
+KPX O u -6
+KPX O t -6
+KPX O s -6
+KPX O r -6
+KPX O quoteright -40
+KPX O quotedblright -40
+KPX O q 5
+KPX O period -20
+KPX O p -6
+KPX O n -6
+KPX O m -6
+KPX O l -20
+KPX O k -10
+KPX O j -6
+KPX O h -10
+KPX O g -6
+KPX O e 5
+KPX O d 6
+KPX O comma -10
+KPX O c 5
+KPX O b -6
+KPX O a 5
+KPX O Y -75
+KPX O X -30
+KPX O W -40
+KPX O V -60
+KPX O T -48
+KPX O A -18
+
+KPX P y 6
+KPX P u -18
+KPX P t -6
+KPX P s -24
+KPX P r -6
+KPX P period -220
+KPX P o -24
+KPX P n -12
+KPX P l -25
+KPX P h -15
+KPX P e -24
+KPX P comma -220
+KPX P a -24
+KPX P I -30
+KPX P H -30
+KPX P E -30
+KPX P A -75
+
+KPX Q u -6
+KPX Q quoteright -40
+KPX Q quotedblright -50
+KPX Q a -6
+KPX Q Y -70
+KPX Q X -12
+KPX Q W -35
+KPX Q V -60
+KPX Q U -35
+KPX Q T -36
+KPX Q A -18
+
+KPX R y -14
+KPX R u -12
+KPX R quoteright -30
+KPX R quotedblright -20
+KPX R o -12
+KPX R hyphen -20
+KPX R e -12
+KPX R Y -50
+KPX R W -30
+KPX R V -40
+KPX R U -40
+KPX R T -30
+KPX R Q -10
+KPX R O -10
+KPX R G -10
+KPX R C -10
+KPX R A -6
+
+KPX S y -30
+KPX S w -30
+KPX S v -30
+KPX S u -18
+KPX S t -30
+KPX S r -20
+KPX S quoteright -38
+KPX S quotedblright -30
+KPX S p -18
+KPX S n -24
+KPX S m -24
+KPX S l -30
+KPX S k -24
+KPX S j -25
+KPX S i -30
+KPX S h -30
+KPX S e -6
+
+KPX T z -70
+KPX T y -60
+KPX T w -64
+KPX T u -74
+KPX T semicolon -36
+KPX T s -72
+KPX T r -64
+KPX T quoteright 45
+KPX T quotedblright 50
+KPX T period -100
+KPX T parenright 54
+KPX T o -90
+KPX T m -64
+KPX T i -34
+KPX T hyphen -100
+KPX T endash -60
+KPX T emdash -60
+KPX T e -90
+KPX T comma -110
+KPX T colon -10
+KPX T bracketright 45
+KPX T braceright 54
+KPX T a -90
+KPX T Y 12
+KPX T X 18
+KPX T W 6
+KPX T T 18
+KPX T Q -12
+KPX T O -12
+KPX T G -12
+KPX T C -12
+KPX T A -56
+
+KPX U z -30
+KPX U x -40
+KPX U t -24
+KPX U s -30
+KPX U r -30
+KPX U quoteright 10
+KPX U quotedblright 10
+KPX U p -40
+KPX U n -45
+KPX U m -45
+KPX U l -12
+KPX U k -12
+KPX U i -24
+KPX U h -6
+KPX U g -30
+KPX U d -40
+KPX U c -35
+KPX U b -6
+KPX U a -40
+KPX U A -45
+
+KPX V y -46
+KPX V u -42
+KPX V semicolon -35
+KPX V r -50
+KPX V quoteright 75
+KPX V quotedblright 70
+KPX V period -130
+KPX V parenright 64
+KPX V o -62
+KPX V i -10
+KPX V hyphen -60
+KPX V endash -20
+KPX V emdash -20
+KPX V e -52
+KPX V comma -120
+KPX V colon -18
+KPX V bracketright 64
+KPX V braceright 64
+KPX V a -60
+KPX V T 6
+KPX V A -70
+
+KPX W y -42
+KPX W u -56
+KPX W t -20
+KPX W semicolon -28
+KPX W r -40
+KPX W quoteright 55
+KPX W quotedblright 60
+KPX W period -108
+KPX W parenright 64
+KPX W o -60
+KPX W m -35
+KPX W i -10
+KPX W hyphen -40
+KPX W endash -2
+KPX W emdash -10
+KPX W e -54
+KPX W d -50
+KPX W comma -108
+KPX W colon -28
+KPX W bracketright 55
+KPX W braceright 64
+KPX W a -60
+KPX W T 12
+KPX W Q -10
+KPX W O -10
+KPX W G -10
+KPX W C -10
+KPX W A -58
+
+KPX X y -35
+KPX X u -30
+KPX X r -6
+KPX X quoteright 35
+KPX X quotedblright 15
+KPX X i -6
+KPX X e -10
+KPX X a 5
+KPX X Y -6
+KPX X W -6
+KPX X Q -30
+KPX X O -30
+KPX X G -30
+KPX X C -30
+KPX X A -18
+
+KPX Y v -50
+KPX Y u -58
+KPX Y t -32
+KPX Y semicolon -36
+KPX Y quoteright 65
+KPX Y quotedblright 70
+KPX Y q -100
+KPX Y period -90
+KPX Y parenright 60
+KPX Y o -72
+KPX Y l 10
+KPX Y hyphen -95
+KPX Y endash -20
+KPX Y emdash -20
+KPX Y e -72
+KPX Y d -80
+KPX Y comma -80
+KPX Y colon -36
+KPX Y bracketright 64
+KPX Y braceright 75
+KPX Y a -82
+KPX Y Y 12
+KPX Y X 12
+KPX Y W 12
+KPX Y V 6
+KPX Y T 25
+KPX Y Q -5
+KPX Y O -5
+KPX Y G -5
+KPX Y C -5
+KPX Y A -36
+
+KPX Z y -36
+KPX Z w -36
+KPX Z u -12
+KPX Z quoteright 10
+KPX Z quotedblright 10
+KPX Z o -6
+KPX Z i -12
+KPX Z e -6
+KPX Z a -6
+KPX Z Q -30
+KPX Z O -30
+KPX Z G -30
+KPX Z C -30
+KPX Z A 12
+
+KPX a quoteright -40
+KPX a quotedblright -40
+
+KPX b y -6
+KPX b w -15
+KPX b v -15
+KPX b quoteright -50
+KPX b quotedblright -50
+KPX b period -40
+KPX b comma -30
+
+KPX braceleft Y 64
+KPX braceleft W 64
+KPX braceleft V 64
+KPX braceleft T 54
+KPX braceleft J 80
+
+KPX bracketleft Y 64
+KPX bracketleft W 64
+KPX bracketleft V 64
+KPX bracketleft T 54
+KPX bracketleft J 80
+
+KPX c quoteright -20
+KPX c quotedblright -20
+
+KPX colon space -30
+
+KPX comma space -40
+KPX comma quoteright -80
+KPX comma quotedblright -80
+
+KPX d quoteright -12
+KPX d quotedblright -12
+
+KPX e x -10
+KPX e w -10
+KPX e quoteright -30
+KPX e quotedblright -30
+
+KPX f quoteright 110
+KPX f quotedblright 110
+KPX f period -20
+KPX f parenright 100
+KPX f comma -20
+KPX f bracketright 90
+KPX f braceright 90
+
+KPX g y 30
+KPX g p 12
+KPX g f 42
+
+KPX h quoteright -80
+KPX h quotedblright -80
+
+KPX j quoteright -20
+KPX j quotedblright -20
+KPX j period -35
+KPX j comma -20
+
+KPX k quoteright -30
+KPX k quotedblright -50
+
+KPX m quoteright -80
+KPX m quotedblright -80
+
+KPX n quoteright -80
+KPX n quotedblright -80
+
+KPX o z -10
+KPX o y -20
+KPX o x -20
+KPX o w -30
+KPX o v -35
+KPX o quoteright -60
+KPX o quotedblright -50
+KPX o period -30
+KPX o comma -20
+
+KPX p z -10
+KPX p w -15
+KPX p quoteright -50
+KPX p quotedblright -70
+KPX p period -30
+KPX p comma -20
+
+KPX parenleft Y 75
+KPX parenleft W 75
+KPX parenleft V 75
+KPX parenleft T 64
+KPX parenleft J 80
+
+KPX period space -40
+KPX period quoteright -80
+KPX period quotedblright -80
+
+KPX q quoteright -20
+KPX q quotedblright -30
+KPX q period -20
+KPX q comma -10
+
+KPX quotedblleft z -30
+KPX quotedblleft x -40
+KPX quotedblleft w -12
+KPX quotedblleft v -12
+KPX quotedblleft u -12
+KPX quotedblleft t -12
+KPX quotedblleft s -30
+KPX quotedblleft r -12
+KPX quotedblleft q -40
+KPX quotedblleft p -12
+KPX quotedblleft o -30
+KPX quotedblleft n -12
+KPX quotedblleft m -12
+KPX quotedblleft l 10
+KPX quotedblleft k 10
+KPX quotedblleft h 10
+KPX quotedblleft g -30
+KPX quotedblleft e -40
+KPX quotedblleft d -40
+KPX quotedblleft c -40
+KPX quotedblleft b 24
+KPX quotedblleft a -60
+KPX quotedblleft Y 12
+KPX quotedblleft X 28
+KPX quotedblleft W 28
+KPX quotedblleft V 28
+KPX quotedblleft T 36
+KPX quotedblleft A -90
+
+KPX quotedblright space -40
+KPX quotedblright period -100
+KPX quotedblright comma -100
+
+KPX quoteleft z -30
+KPX quoteleft y -10
+KPX quoteleft x -40
+KPX quoteleft w -12
+KPX quoteleft v -12
+KPX quoteleft u -12
+KPX quoteleft t -12
+KPX quoteleft s -30
+KPX quoteleft r -12
+KPX quoteleft quoteleft -18
+KPX quoteleft q -30
+KPX quoteleft p -12
+KPX quoteleft o -30
+KPX quoteleft n -12
+KPX quoteleft m -12
+KPX quoteleft l 10
+KPX quoteleft k 10
+KPX quoteleft h 10
+KPX quoteleft g -30
+KPX quoteleft e -30
+KPX quoteleft d -30
+KPX quoteleft c -30
+KPX quoteleft b 24
+KPX quoteleft a -45
+KPX quoteleft Y 12
+KPX quoteleft X 28
+KPX quoteleft W 28
+KPX quoteleft V 28
+KPX quoteleft T 36
+KPX quoteleft A -90
+
+KPX quoteright v -35
+KPX quoteright t -35
+KPX quoteright space -40
+KPX quoteright s -55
+KPX quoteright r -25
+KPX quoteright quoteright -18
+KPX quoteright period -100
+KPX quoteright m -25
+KPX quoteright l -12
+KPX quoteright d -70
+KPX quoteright comma -100
+
+KPX r y 18
+KPX r w 6
+KPX r v 6
+KPX r t 8
+KPX r quotedblright -15
+KPX r q -24
+KPX r period -120
+KPX r o -6
+KPX r l -20
+KPX r k -20
+KPX r hyphen -30
+KPX r h -20
+KPX r f 8
+KPX r emdash -20
+KPX r e -26
+KPX r d -26
+KPX r comma -110
+KPX r c -12
+KPX r a -20
+
+KPX s quoteright -40
+KPX s quotedblright -45
+
+KPX semicolon space -30
+
+KPX space quotesinglbase -30
+KPX space quoteleft -40
+KPX space quotedblleft -40
+KPX space quotedblbase -30
+KPX space Y -70
+KPX space W -70
+KPX space V -70
+
+KPX t quoteright 10
+KPX t quotedblright -10
+
+KPX u quoteright -55
+KPX u quotedblright -50
+
+KPX v quoteright -20
+KPX v quotedblright -30
+KPX v q -6
+KPX v period -70
+KPX v o -6
+KPX v e -6
+KPX v d -6
+KPX v comma -70
+KPX v c -6
+KPX v a -6
+
+KPX w quoteright -20
+KPX w quotedblright -30
+KPX w period -62
+KPX w comma -62
+
+KPX x y 12
+KPX x w -6
+KPX x quoteright -40
+KPX x quotedblright -50
+KPX x q -6
+KPX x o -6
+KPX x e -6
+KPX x d -6
+KPX x c -6
+
+KPX y quoteright -10
+KPX y quotedblright -20
+KPX y period -70
+KPX y emdash 40
+KPX y comma -60
+
+KPX z quoteright -40
+KPX z quotedblright -50
+KPX z o -6
+KPX z e -6
+KPX z d -6
+KPX z c -6
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/fonts/utilities/vfinst/example/putri8a.pfb b/fonts/utilities/vfinst/example/putri8a.pfb
new file mode 100644
index 0000000000..e33f16af90
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putri8a.pfb
Binary files differ
diff --git a/fonts/utilities/vfinst/example/putri8a.pl b/fonts/utilities/vfinst/example/putri8a.pl
new file mode 100644
index 0000000000..1264804838
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putri8a.pl
@@ -0,0 +1,910 @@
+(COMMENT raw font putri8a created by fontinst v1.500)
+
+(COMMENT Filename: putri8a.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putri8a}{putri8a})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putri8a.pl putri8a.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.5)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R 0.5199)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.54993)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (CHARIC R 0.48999)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.07996)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.19995)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.69995)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.62)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.82996)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.35999)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.31995)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.48999)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.28992)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0299)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.73999)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.21997)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.62988)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.37)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.82996)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.17993)
+ (CHARDP R -1.75989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.68994)
+ (CHARDP R 0.20996)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 164 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 2.68994)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 166 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 168 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 169 (COMMENT quotesingle)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 170 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 172 (COMMENT guilsinglleft)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 173 (COMMENT guilsinglright)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 175 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 177 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 178 (COMMENT dagger)
+ (CHARWD R 5.0)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 179 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 180 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.12)
+ (CHARDP R -1.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 183 (COMMENT bullet)
+ (CHARWD R 5.0)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 184 (COMMENT quotesinglbase)
+ (CHARWD R 2.15991)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 185 (COMMENT quotedblbase)
+ (CHARWD R 4.0199)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 186 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (CHARIC R 0.43994)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 189 (COMMENT perthousand)
+ (CHARWD R 12.0)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 193 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 194 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.35999)
+ )
+(CHARACTER D 195 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 196 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R 0.91992)
+ )
+(CHARACTER D 197 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 198 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R -5.67993)
+ (CHARIC R 1.00989)
+ )
+(CHARACTER D 199 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 200 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.71997)
+ (CHARIC R 0.87)
+ )
+(CHARACTER D 202 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 203 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 205 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.54993)
+ )
+(CHARACTER D 206 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R -5.56995)
+ (CHARIC R 1.09998)
+ )
+(CHARACTER D 208 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 225 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 227 (COMMENT ordfeminine)
+ (CHARWD R 4.25)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.34998)
+ )
+(CHARACTER D 232 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 233 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 234 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 235 (COMMENT ordmasculine)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 241 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 245 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 248 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 249 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 0.3899)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 250 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 251 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.5299)
+ )
+
+(COMMENT END OF FILE putri8a.pl)
diff --git a/fonts/utilities/vfinst/example/putri8r.pl b/fonts/utilities/vfinst/example/putri8r.pl
new file mode 100644
index 0000000000..60808acbe9
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putri8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putri8r created by fontinst v1.500)
+
+(COMMENT Filename: putri8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putri8r}{putri8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putri8r.pl putri8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.5)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R 0.5199)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.54993)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (CHARIC R 0.48999)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.07996)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.19995)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.69995)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.04993)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.62)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.82996)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.35999)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.31995)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.08997)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.48999)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.28992)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0299)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.66992)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.73999)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.21997)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.45996)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.62988)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.22998)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.37)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 0.1499)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.82996)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.17993)
+ (CHARDP R -1.75989)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.68994)
+ (CHARDP R 0.20996)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 2.68994)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R 0.05994)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.70996)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.07996)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.0)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.12)
+ (CHARDP R -1.87)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 0.7699)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 5.0)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.15991)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.0199)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (CHARIC R 0.43994)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.0)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 0.35999)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.83997)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R 0.91992)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R -5.67993)
+ (CHARIC R 1.00989)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -5.69995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.71997)
+ (CHARIC R 0.87)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.54993)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R -5.56995)
+ (CHARIC R 1.09998)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.25)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.34998)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.30994)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.57996)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 0.3899)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.5299)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 5.69995)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 4.0)
+ (CHARHT R 6.79993)
+ (CHARDP R -4.03992)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.37)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.37)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.0199)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.54993)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.65991)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.31995)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.69995)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 5.83997)
+ (CHARHT R 7.0)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.60999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 4.67993)
+ (CHARHT R 7.22998)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.37)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 5.90991)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.35999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.37)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.32996)
+ (CHARHT R 8.87988)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.2799)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.37)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 4.67993)
+ (CHARHT R 6.81995)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.44995)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.37)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.23999)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.75)
+ (CHARDP R -0.25)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 0.28992)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.62988)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.67993)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.12)
+ (CHARIC R 0.15991)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.16992)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 1.07996)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 5.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.87988)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.37)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.69995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 4.5299)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.37)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.09998)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.15991)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.60999)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.35999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 0.82996)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.62)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.12)
+ (CHARIC R 0.67993)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 0.17993)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.03992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.12)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.60999)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.0199)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.21997)
+ )
+
+(COMMENT END OF FILE putri8r.pl)
diff --git a/fonts/utilities/vfinst/example/putric7t.vpl b/fonts/utilities/vfinst/example/putric7t.vpl
new file mode 100644
index 0000000000..f9edfcbf95
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putric7t.vpl
@@ -0,0 +1,2437 @@
+(VTITLE virtual font putric7t created by fontinst v1.500)
+
+(COMMENT Filename: putric7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1c}{putric7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putric7t.vpl putric7t.vf putric7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putri8r) (FONTDSIZE R 10.0) (FONTAT R 8.0))
+(MAPFONT D 1 (FONTNAME putri8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT FFsmall)
+ (LIG D 105 D 14) (COMMENT Ismall FFIsmall)
+ (LIG D 108 D 15) (COMMENT Lsmall FFLsmall)
+ (STOP)
+ (LABEL D 16) (COMMENT dotlessIsmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 17) (COMMENT dotlessJsmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.12988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 25) (COMMENT SSsmall)
+ (KRN D 39 R -0.33997) (COMMENT quoteright)
+ (KRN D 34 R -0.2699) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT Oslashsmall)
+ (KRN D 39 R -0.35999) (COMMENT quoteright)
+ (KRN D 34 R -0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.17993) (COMMENT period)
+ (KRN D 44 R -0.08997) (COMMENT comma)
+ (KRN D 89 R -0.66992) (COMMENT Y)
+ (KRN D 88 R -0.2699) (COMMENT X)
+ (KRN D 87 R -0.35999) (COMMENT W)
+ (KRN D 86 R -0.53992) (COMMENT V)
+ (KRN D 84 R -0.42993) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.37988) (COMMENT Tsmall)
+ (KRN D 118 R -0.47998) (COMMENT Vsmall)
+ (KRN D 119 R -0.31995) (COMMENT Wsmall)
+ (KRN D 120 R -0.23999) (COMMENT Xsmall)
+ (KRN D 121 R -0.59998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.42993) (COMMENT Tsmall)
+ (KRN D 118 R -0.53992) (COMMENT Vsmall)
+ (KRN D 119 R -0.35999) (COMMENT Wsmall)
+ (KRN D 120 R -0.2699) (COMMENT Xsmall)
+ (KRN D 121 R -0.66992) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT Lsmall Lslashsmall)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.75) (COMMENT Y)
+ (KRN D 87 R 0.75) (COMMENT W)
+ (KRN D 86 R 0.75) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (KRN D 106 R 0.71997) (COMMENT Jsmall)
+ (KRN D 116 R 0.56995) (COMMENT Tsmall)
+ (KRN D 118 R 0.66992) (COMMENT Vsmall)
+ (KRN D 119 R 0.66992) (COMMENT Wsmall)
+ (KRN D 121 R 0.66992) (COMMENT Ysmall)
+ (KRN D 17 R 0.71997) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.75989) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.79993) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.59998) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.2699) (COMMENT Qsmall)
+ (KRN D 116 R -0.6399) (COMMENT Tsmall)
+ (KRN D 117 R -0.53992) (COMMENT Usmall)
+ (KRN D 118 R -0.80994) (COMMENT Vsmall)
+ (KRN D 119 R -0.71997) (COMMENT Wsmall)
+ (KRN D 120 R -0.06995) (COMMENT Xsmall)
+ (KRN D 121 R -0.67993) (COMMENT Ysmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 116 R -0.17993) (COMMENT Tsmall)
+ (KRN D 117 R -0.44995) (COMMENT Usmall)
+ (KRN D 118 R -0.44995) (COMMENT Vsmall)
+ (KRN D 119 R -0.17993) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.5) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 118 R -0.53992) (COMMENT Vsmall)
+ (KRN D 119 R -0.44995) (COMMENT Wsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 97 R -0.3999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 39 R 0.25) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 99 R -0.20996) (COMMENT Csmall)
+ (KRN D 103 R -0.20996) (COMMENT Gsmall)
+ (KRN D 111 R -0.20996) (COMMENT Osmall)
+ (KRN D 113 R -0.20996) (COMMENT Qsmall)
+ (KRN D 28 R -0.20996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (KRN D 97 R 0.2699) (COMMENT Asmall)
+ (KRN D 99 R -0.42993) (COMMENT Csmall)
+ (KRN D 103 R -0.42993) (COMMENT Gsmall)
+ (KRN D 111 R -0.42993) (COMMENT Osmall)
+ (KRN D 113 R -0.42993) (COMMENT Qsmall)
+ (KRN D 116 R -0.71997) (COMMENT Tsmall)
+ (KRN D 117 R -0.37) (COMMENT Usmall)
+ (KRN D 118 R -0.98999) (COMMENT Vsmall)
+ (KRN D 119 R -0.80994) (COMMENT Wsmall)
+ (KRN D 121 R -0.71997) (COMMENT Ysmall)
+ (KRN D 28 R -0.42993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.42993) (COMMENT Tsmall)
+ (KRN D 118 R -0.53992) (COMMENT Vsmall)
+ (KRN D 119 R -0.35999) (COMMENT Wsmall)
+ (KRN D 120 R -0.2699) (COMMENT Xsmall)
+ (KRN D 121 R -0.66992) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 46 R -2.19995) (COMMENT period)
+ (KRN D 44 R -2.19995) (COMMENT comma)
+ (KRN D 73 R -0.29993) (COMMENT I)
+ (KRN D 72 R -0.29993) (COMMENT H)
+ (KRN D 69 R -0.29993) (COMMENT E)
+ (KRN D 65 R -0.75) (COMMENT A)
+ (KRN D 97 R -0.66992) (COMMENT Asmall)
+ (KRN D 101 R -0.2699) (COMMENT Esmall)
+ (KRN D 104 R -0.2699) (COMMENT Hsmall)
+ (KRN D 105 R -0.2699) (COMMENT Ismall)
+ (KRN D 16 R -0.2699) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 85 R -0.34998) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 116 R -0.31995) (COMMENT Tsmall)
+ (KRN D 117 R -0.30994) (COMMENT Usmall)
+ (KRN D 118 R -0.53992) (COMMENT Vsmall)
+ (KRN D 119 R -0.30994) (COMMENT Wsmall)
+ (KRN D 120 R -0.09998) (COMMENT Xsmall)
+ (KRN D 121 R -0.62988) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.05994) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R -0.04993) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R -0.2699) (COMMENT Tsmall)
+ (KRN D 117 R -0.35999) (COMMENT Usmall)
+ (KRN D 118 R -0.35999) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 121 R -0.44995) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.5) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.09998) (COMMENT colon)
+ (KRN D 93 R 0.44995) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.55994) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 97 R -0.5) (COMMENT Asmall)
+ (KRN D 99 R -0.09998) (COMMENT Csmall)
+ (KRN D 103 R -0.09998) (COMMENT Gsmall)
+ (KRN D 111 R -0.09998) (COMMENT Osmall)
+ (KRN D 113 R -0.09998) (COMMENT Qsmall)
+ (KRN D 116 R 0.15991) (COMMENT Tsmall)
+ (KRN D 119 R 0.04993) (COMMENT Wsmall)
+ (KRN D 120 R 0.15991) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.09998) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 97 R -0.3999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 59 R -0.34998) (COMMENT semicolon)
+ (KRN D 39 R 0.75) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 44 R -1.19995) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 97 R -0.62988) (COMMENT Asmall)
+ (KRN D 116 R 0.04993) (COMMENT Tsmall)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 59 R -0.2799) (COMMENT semicolon)
+ (KRN D 39 R 0.54993) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.07996) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 44 R -1.07996) (COMMENT comma)
+ (KRN D 58 R -0.2799) (COMMENT colon)
+ (KRN D 93 R 0.54993) (COMMENT bracketright)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R -0.5199) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R 0.09998) (COMMENT Tsmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 39 R 0.34998) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R -0.15991) (COMMENT Asmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.2699) (COMMENT Qsmall)
+ (KRN D 119 R -0.04993) (COMMENT Wsmall)
+ (KRN D 121 R -0.04993) (COMMENT Ysmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 45 R -0.94995) (COMMENT hyphen)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.25) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 97 R -0.31995) (COMMENT Asmall)
+ (KRN D 99 R -0.03992) (COMMENT Csmall)
+ (KRN D 103 R -0.03992) (COMMENT Gsmall)
+ (KRN D 111 R -0.03992) (COMMENT Osmall)
+ (KRN D 113 R -0.03992) (COMMENT Qsmall)
+ (KRN D 116 R 0.21997) (COMMENT Tsmall)
+ (KRN D 118 R 0.04993) (COMMENT Vsmall)
+ (KRN D 119 R 0.09998) (COMMENT Wsmall)
+ (KRN D 120 R 0.09998) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (KRN D 28 R -0.03992) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 97 R 0.09998) (COMMENT Asmall)
+ (KRN D 99 R -0.2699) (COMMENT Csmall)
+ (KRN D 103 R -0.2699) (COMMENT Gsmall)
+ (KRN D 111 R -0.2699) (COMMENT Osmall)
+ (KRN D 113 R -0.2699) (COMMENT Qsmall)
+ (KRN D 28 R -0.2699) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (KRN D 106 R 0.71997) (COMMENT Jsmall)
+ (KRN D 116 R 0.47998) (COMMENT Tsmall)
+ (KRN D 118 R 0.56995) (COMMENT Vsmall)
+ (KRN D 119 R 0.56995) (COMMENT Wsmall)
+ (KRN D 121 R 0.56995) (COMMENT Ysmall)
+ (KRN D 17 R 0.71997) (COMMENT dotlessJsmall)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 97 R -0.80994) (COMMENT Asmall)
+ (KRN D 116 R 0.31995) (COMMENT Tsmall)
+ (KRN D 118 R 0.25) (COMMENT Vsmall)
+ (KRN D 119 R 0.25) (COMMENT Wsmall)
+ (KRN D 120 R 0.25) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 96 R -0.17993) (COMMENT quoteleft)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 97 R -0.80994) (COMMENT Asmall)
+ (KRN D 116 R 0.31995) (COMMENT Tsmall)
+ (KRN D 118 R 0.25) (COMMENT Vsmall)
+ (KRN D 119 R 0.25) (COMMENT Wsmall)
+ (KRN D 120 R 0.25) (COMMENT Xsmall)
+ (KRN D 121 R 0.09998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 97) (COMMENT Asmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.98999) (COMMENT quotedblright)
+ (KRN D 89 R -0.67993) (COMMENT Y)
+ (KRN D 88 R -0.06995) (COMMENT X)
+ (KRN D 87 R -0.71997) (COMMENT W)
+ (KRN D 86 R -0.80994) (COMMENT V)
+ (KRN D 85 R -0.53992) (COMMENT U)
+ (KRN D 84 R -0.6399) (COMMENT T)
+ (KRN D 81 R -0.2699) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.23999) (COMMENT Qsmall)
+ (KRN D 116 R -0.56995) (COMMENT Tsmall)
+ (KRN D 117 R -0.47998) (COMMENT Usmall)
+ (KRN D 118 R -0.71997) (COMMENT Vsmall)
+ (KRN D 119 R -0.6399) (COMMENT Wsmall)
+ (KRN D 120 R -0.05994) (COMMENT Xsmall)
+ (KRN D 121 R -0.60999) (COMMENT Ysmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 98) (COMMENT Bsmall)
+ (KRN D 39 R -0.35999) (COMMENT quoteright)
+ (KRN D 34 R -0.2699) (COMMENT quotedblright)
+ (KRN D 87 R -0.17993) (COMMENT W)
+ (KRN D 86 R -0.44995) (COMMENT V)
+ (KRN D 85 R -0.44995) (COMMENT U)
+ (KRN D 84 R -0.17993) (COMMENT T)
+ (KRN D 116 R -0.15991) (COMMENT Tsmall)
+ (KRN D 117 R -0.3999) (COMMENT Usmall)
+ (KRN D 118 R -0.3999) (COMMENT Vsmall)
+ (KRN D 119 R -0.15991) (COMMENT Wsmall)
+ (STOP)
+ (LABEL D 99) (COMMENT Csmall)
+ (KRN D 34 R 0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT Dsmall)
+ (KRN D 39 R -0.35999) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (KRN D 46 R -0.2699) (COMMENT period)
+ (KRN D 44 R -0.17993) (COMMENT comma)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 87 R -0.44995) (COMMENT W)
+ (KRN D 86 R -0.53992) (COMMENT V)
+ (KRN D 118 R -0.47998) (COMMENT Vsmall)
+ (KRN D 119 R -0.3999) (COMMENT Wsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 101) (COMMENT Esmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (KRN D 46 R 0.08997) (COMMENT period)
+ (KRN D 44 R 0.08997) (COMMENT comma)
+ (STOP)
+ (LABEL D 102) (COMMENT Fsmall)
+ (LIG D 105 D 12) (COMMENT Ismall FIsmall)
+ (LIG D 102 D 11) (COMMENT Fsmall FFsmall)
+ (LIG D 108 D 13) (COMMENT Lsmall FLsmall)
+ (KRN D 39 R 0.12988) (COMMENT quoteright)
+ (KRN D 34 R 0.30994) (COMMENT quotedblright)
+ (KRN D 46 R -1.62) (COMMENT period)
+ (KRN D 44 R -1.5299) (COMMENT comma)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 103) (COMMENT Gsmall)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 104) (COMMENT Hsmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 105) (COMMENT Ismall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT Jsmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.12988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 107) (COMMENT Ksmall)
+ (KRN D 39 R 0.21997) (COMMENT quoteright)
+ (KRN D 34 R 0.35999) (COMMENT quotedblright)
+ (KRN D 81 R -0.20996) (COMMENT Q)
+ (KRN D 79 R -0.20996) (COMMENT O)
+ (KRN D 71 R -0.20996) (COMMENT G)
+ (KRN D 67 R -0.20996) (COMMENT C)
+ (KRN D 31 R -0.20996) (COMMENT Oslash)
+ (KRN D 99 R -0.17993) (COMMENT Csmall)
+ (KRN D 103 R -0.17993) (COMMENT Gsmall)
+ (KRN D 111 R -0.17993) (COMMENT Osmall)
+ (KRN D 113 R -0.17993) (COMMENT Qsmall)
+ (KRN D 28 R -0.17993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 108) (COMMENT Lsmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.98999) (COMMENT quotedblright)
+ (KRN D 89 R -0.71997) (COMMENT Y)
+ (KRN D 87 R -0.80994) (COMMENT W)
+ (KRN D 86 R -0.98999) (COMMENT V)
+ (KRN D 85 R -0.37) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.42993) (COMMENT Q)
+ (KRN D 79 R -0.42993) (COMMENT O)
+ (KRN D 71 R -0.42993) (COMMENT G)
+ (KRN D 67 R -0.42993) (COMMENT C)
+ (KRN D 65 R 0.2699) (COMMENT A)
+ (KRN D 31 R -0.42993) (COMMENT Oslash)
+ (KRN D 97 R 0.23999) (COMMENT Asmall)
+ (KRN D 99 R -0.37988) (COMMENT Csmall)
+ (KRN D 103 R -0.37988) (COMMENT Gsmall)
+ (KRN D 111 R -0.37988) (COMMENT Osmall)
+ (KRN D 113 R -0.37988) (COMMENT Qsmall)
+ (KRN D 116 R -0.6399) (COMMENT Tsmall)
+ (KRN D 117 R -0.32996) (COMMENT Usmall)
+ (KRN D 118 R -0.8899) (COMMENT Vsmall)
+ (KRN D 119 R -0.71997) (COMMENT Wsmall)
+ (KRN D 121 R -0.6399) (COMMENT Ysmall)
+ (KRN D 28 R -0.37988) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 109) (COMMENT Msmall)
+ (KRN D 39 R 0.04993) (COMMENT quoteright)
+ (KRN D 34 R 0.12988) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT Nsmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT Osmall)
+ (KRN D 39 R -0.35999) (COMMENT quoteright)
+ (KRN D 34 R -0.35999) (COMMENT quotedblright)
+ (KRN D 46 R -0.17993) (COMMENT period)
+ (KRN D 44 R -0.08997) (COMMENT comma)
+ (KRN D 89 R -0.66992) (COMMENT Y)
+ (KRN D 88 R -0.2699) (COMMENT X)
+ (KRN D 87 R -0.35999) (COMMENT W)
+ (KRN D 86 R -0.53992) (COMMENT V)
+ (KRN D 84 R -0.42993) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.37988) (COMMENT Tsmall)
+ (KRN D 118 R -0.47998) (COMMENT Vsmall)
+ (KRN D 119 R -0.31995) (COMMENT Wsmall)
+ (KRN D 120 R -0.23999) (COMMENT Xsmall)
+ (KRN D 121 R -0.59998) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 112) (COMMENT Psmall)
+ (KRN D 46 R -1.97998) (COMMENT period)
+ (KRN D 44 R -1.97998) (COMMENT comma)
+ (KRN D 73 R -0.2699) (COMMENT I)
+ (KRN D 72 R -0.2699) (COMMENT H)
+ (KRN D 69 R -0.2699) (COMMENT E)
+ (KRN D 65 R -0.66992) (COMMENT A)
+ (KRN D 97 R -0.59998) (COMMENT Asmall)
+ (KRN D 101 R -0.23999) (COMMENT Esmall)
+ (KRN D 104 R -0.23999) (COMMENT Hsmall)
+ (KRN D 105 R -0.23999) (COMMENT Ismall)
+ (KRN D 16 R -0.23999) (COMMENT dotlessIsmall)
+ (STOP)
+ (LABEL D 113) (COMMENT Qsmall)
+ (KRN D 39 R -0.35999) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (KRN D 89 R -0.62988) (COMMENT Y)
+ (KRN D 88 R -0.09998) (COMMENT X)
+ (KRN D 87 R -0.30994) (COMMENT W)
+ (KRN D 86 R -0.53992) (COMMENT V)
+ (KRN D 85 R -0.30994) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 116 R -0.2799) (COMMENT Tsmall)
+ (KRN D 117 R -0.2699) (COMMENT Usmall)
+ (KRN D 118 R -0.47998) (COMMENT Vsmall)
+ (KRN D 119 R -0.2699) (COMMENT Wsmall)
+ (KRN D 120 R -0.08997) (COMMENT Xsmall)
+ (KRN D 121 R -0.55994) (COMMENT Ysmall)
+ (STOP)
+ (LABEL D 114) (COMMENT Rsmall)
+ (KRN D 39 R -0.2699) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (KRN D 45 R -0.17993) (COMMENT hyphen)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.2699) (COMMENT W)
+ (KRN D 86 R -0.35999) (COMMENT V)
+ (KRN D 85 R -0.35999) (COMMENT U)
+ (KRN D 84 R -0.2699) (COMMENT T)
+ (KRN D 81 R -0.08997) (COMMENT Q)
+ (KRN D 79 R -0.08997) (COMMENT O)
+ (KRN D 71 R -0.08997) (COMMENT G)
+ (KRN D 67 R -0.08997) (COMMENT C)
+ (KRN D 65 R -0.04993) (COMMENT A)
+ (KRN D 31 R -0.08997) (COMMENT Oslash)
+ (KRN D 97 R -0.03992) (COMMENT Asmall)
+ (KRN D 99 R -0.07996) (COMMENT Csmall)
+ (KRN D 103 R -0.07996) (COMMENT Gsmall)
+ (KRN D 111 R -0.07996) (COMMENT Osmall)
+ (KRN D 113 R -0.07996) (COMMENT Qsmall)
+ (KRN D 116 R -0.23999) (COMMENT Tsmall)
+ (KRN D 117 R -0.31995) (COMMENT Usmall)
+ (KRN D 118 R -0.31995) (COMMENT Vsmall)
+ (KRN D 119 R -0.23999) (COMMENT Wsmall)
+ (KRN D 121 R -0.3999) (COMMENT Ysmall)
+ (KRN D 28 R -0.07996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 115) (COMMENT Ssmall)
+ (KRN D 39 R -0.33997) (COMMENT quoteright)
+ (KRN D 34 R -0.2699) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT Tsmall)
+ (KRN D 59 R -0.31995) (COMMENT semicolon)
+ (KRN D 39 R 0.3999) (COMMENT quoteright)
+ (KRN D 34 R 0.44995) (COMMENT quotedblright)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.47998) (COMMENT parenright)
+ (KRN D 45 R -0.8999) (COMMENT hyphen)
+ (KRN D 44 R -0.98999) (COMMENT comma)
+ (KRN D 58 R -0.08997) (COMMENT colon)
+ (KRN D 93 R 0.3999) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.15991) (COMMENT X)
+ (KRN D 87 R 0.04993) (COMMENT W)
+ (KRN D 84 R 0.15991) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.5) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 97 R -0.44995) (COMMENT Asmall)
+ (KRN D 99 R -0.08997) (COMMENT Csmall)
+ (KRN D 103 R -0.08997) (COMMENT Gsmall)
+ (KRN D 111 R -0.08997) (COMMENT Osmall)
+ (KRN D 113 R -0.08997) (COMMENT Qsmall)
+ (KRN D 116 R 0.1399) (COMMENT Tsmall)
+ (KRN D 119 R 0.03992) (COMMENT Wsmall)
+ (KRN D 120 R 0.1399) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.08997) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 117) (COMMENT Usmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 97 R -0.35999) (COMMENT Asmall)
+ (STOP)
+ (LABEL D 118) (COMMENT Vsmall)
+ (KRN D 59 R -0.30994) (COMMENT semicolon)
+ (KRN D 39 R 0.66992) (COMMENT quoteright)
+ (KRN D 34 R 0.62988) (COMMENT quotedblright)
+ (KRN D 46 R -1.16992) (COMMENT period)
+ (KRN D 41 R 0.56995) (COMMENT parenright)
+ (KRN D 45 R -0.53992) (COMMENT hyphen)
+ (KRN D 44 R -1.07996) (COMMENT comma)
+ (KRN D 58 R -0.15991) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 84 R 0.04993) (COMMENT T)
+ (KRN D 65 R -0.62988) (COMMENT A)
+ (KRN D 97 R -0.55994) (COMMENT Asmall)
+ (KRN D 116 R 0.03992) (COMMENT Tsmall)
+ (STOP)
+ (LABEL D 119) (COMMENT Wsmall)
+ (KRN D 59 R -0.25) (COMMENT semicolon)
+ (KRN D 39 R 0.48999) (COMMENT quoteright)
+ (KRN D 34 R 0.53992) (COMMENT quotedblright)
+ (KRN D 46 R -0.96997) (COMMENT period)
+ (KRN D 41 R 0.56995) (COMMENT parenright)
+ (KRN D 45 R -0.35999) (COMMENT hyphen)
+ (KRN D 44 R -0.96997) (COMMENT comma)
+ (KRN D 58 R -0.25) (COMMENT colon)
+ (KRN D 93 R 0.48999) (COMMENT bracketright)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 81 R -0.08997) (COMMENT Q)
+ (KRN D 79 R -0.08997) (COMMENT O)
+ (KRN D 71 R -0.08997) (COMMENT G)
+ (KRN D 67 R -0.08997) (COMMENT C)
+ (KRN D 65 R -0.5199) (COMMENT A)
+ (KRN D 31 R -0.08997) (COMMENT Oslash)
+ (KRN D 97 R -0.45996) (COMMENT Asmall)
+ (KRN D 99 R -0.07996) (COMMENT Csmall)
+ (KRN D 103 R -0.07996) (COMMENT Gsmall)
+ (KRN D 111 R -0.07996) (COMMENT Osmall)
+ (KRN D 113 R -0.07996) (COMMENT Qsmall)
+ (KRN D 116 R 0.08997) (COMMENT Tsmall)
+ (KRN D 28 R -0.07996) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 120) (COMMENT Xsmall)
+ (KRN D 39 R 0.30994) (COMMENT quoteright)
+ (KRN D 34 R 0.12988) (COMMENT quotedblright)
+ (KRN D 89 R -0.04993) (COMMENT Y)
+ (KRN D 87 R -0.04993) (COMMENT W)
+ (KRN D 81 R -0.2699) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 65 R -0.15991) (COMMENT A)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 97 R -0.1399) (COMMENT Asmall)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.23999) (COMMENT Qsmall)
+ (KRN D 119 R -0.03992) (COMMENT Wsmall)
+ (KRN D 121 R -0.03992) (COMMENT Ysmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 121) (COMMENT Ysmall)
+ (KRN D 59 R -0.31995) (COMMENT semicolon)
+ (KRN D 39 R 0.57996) (COMMENT quoteright)
+ (KRN D 34 R 0.62988) (COMMENT quotedblright)
+ (KRN D 46 R -0.80994) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 45 R -0.84998) (COMMENT hyphen)
+ (KRN D 44 R -0.71997) (COMMENT comma)
+ (KRN D 58 R -0.31995) (COMMENT colon)
+ (KRN D 93 R 0.56995) (COMMENT bracketright)
+ (KRN D 89 R 0.09998) (COMMENT Y)
+ (KRN D 88 R 0.09998) (COMMENT X)
+ (KRN D 87 R 0.09998) (COMMENT W)
+ (KRN D 86 R 0.04993) (COMMENT V)
+ (KRN D 84 R 0.21997) (COMMENT T)
+ (KRN D 81 R -0.03992) (COMMENT Q)
+ (KRN D 79 R -0.03992) (COMMENT O)
+ (KRN D 71 R -0.03992) (COMMENT G)
+ (KRN D 67 R -0.03992) (COMMENT C)
+ (KRN D 65 R -0.31995) (COMMENT A)
+ (KRN D 31 R -0.03992) (COMMENT Oslash)
+ (KRN D 97 R -0.2799) (COMMENT Asmall)
+ (KRN D 99 R -0.0299) (COMMENT Csmall)
+ (KRN D 103 R -0.0299) (COMMENT Gsmall)
+ (KRN D 111 R -0.0299) (COMMENT Osmall)
+ (KRN D 113 R -0.0299) (COMMENT Qsmall)
+ (KRN D 116 R 0.18994) (COMMENT Tsmall)
+ (KRN D 118 R 0.03992) (COMMENT Vsmall)
+ (KRN D 119 R 0.08997) (COMMENT Wsmall)
+ (KRN D 120 R 0.08997) (COMMENT Xsmall)
+ (KRN D 121 R 0.08997) (COMMENT Ysmall)
+ (KRN D 28 R -0.0299) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 122) (COMMENT Zsmall)
+ (KRN D 39 R 0.08997) (COMMENT quoteright)
+ (KRN D 34 R 0.08997) (COMMENT quotedblright)
+ (KRN D 81 R -0.2699) (COMMENT Q)
+ (KRN D 79 R -0.2699) (COMMENT O)
+ (KRN D 71 R -0.2699) (COMMENT G)
+ (KRN D 67 R -0.2699) (COMMENT C)
+ (KRN D 65 R 0.09998) (COMMENT A)
+ (KRN D 31 R -0.2699) (COMMENT Oslash)
+ (KRN D 97 R 0.08997) (COMMENT Asmall)
+ (KRN D 99 R -0.23999) (COMMENT Csmall)
+ (KRN D 103 R -0.23999) (COMMENT Gsmall)
+ (KRN D 111 R -0.23999) (COMMENT Osmall)
+ (KRN D 113 R -0.23999) (COMMENT Qsmall)
+ (KRN D 28 R -0.23999) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (KRN D 97 R 0.2699) (COMMENT Asmall)
+ (KRN D 99 R -0.42993) (COMMENT Csmall)
+ (KRN D 103 R -0.42993) (COMMENT Gsmall)
+ (KRN D 111 R -0.42993) (COMMENT Osmall)
+ (KRN D 113 R -0.42993) (COMMENT Qsmall)
+ (KRN D 116 R -0.71997) (COMMENT Tsmall)
+ (KRN D 117 R -0.37) (COMMENT Usmall)
+ (KRN D 118 R -0.98999) (COMMENT Vsmall)
+ (KRN D 119 R -0.80994) (COMMENT Wsmall)
+ (KRN D 121 R -0.71997) (COMMENT Ysmall)
+ (KRN D 28 R -0.42993) (COMMENT Oslashsmall)
+ (STOP)
+ (LABEL D 170) (COMMENT Lslashsmall)
+ (KRN D 39 R -0.98999) (COMMENT quoteright)
+ (KRN D 34 R -0.98999) (COMMENT quotedblright)
+ (KRN D 89 R -0.71997) (COMMENT Y)
+ (KRN D 87 R -0.80994) (COMMENT W)
+ (KRN D 86 R -0.98999) (COMMENT V)
+ (KRN D 85 R -0.37) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.42993) (COMMENT Q)
+ (KRN D 79 R -0.42993) (COMMENT O)
+ (KRN D 71 R -0.42993) (COMMENT G)
+ (KRN D 67 R -0.42993) (COMMENT C)
+ (KRN D 65 R 0.2699) (COMMENT A)
+ (KRN D 31 R -0.42993) (COMMENT Oslash)
+ (KRN D 97 R 0.23999) (COMMENT Asmall)
+ (KRN D 99 R -0.37988) (COMMENT Csmall)
+ (KRN D 103 R -0.37988) (COMMENT Gsmall)
+ (KRN D 111 R -0.37988) (COMMENT Osmall)
+ (KRN D 113 R -0.37988) (COMMENT Qsmall)
+ (KRN D 116 R -0.6399) (COMMENT Tsmall)
+ (KRN D 117 R -0.32996) (COMMENT Usmall)
+ (KRN D 118 R -0.8899) (COMMENT Vsmall)
+ (KRN D 119 R -0.71997) (COMMENT Wsmall)
+ (KRN D 121 R -0.6399) (COMMENT Ysmall)
+ (KRN D 28 R -0.37988) (COMMENT Oslashsmall)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 11 (COMMENT FFsmall)
+ (CHARWD R 10.12)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 12 (COMMENT FIsmall)
+ (CHARWD R 8.31995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.65991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 13 (COMMENT FLsmall)
+ (CHARWD R 10.07996)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 14 (COMMENT FFIsmall)
+ (CHARWD R 13.37988)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.65991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 15 (COMMENT FFLsmall)
+ (CHARWD R 15.1399)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessIsmall)
+ (CHARWD R 3.25989)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.65991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessJsmall)
+ (CHARWD R 3.30994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.94995)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.5)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.5)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.35999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.5)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.5)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.00989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.5)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.73999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (MOVERIGHT R 1.12)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.12)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 25 (COMMENT SSsmall)
+ (CHARWD R 9.5199)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.5)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 26 (COMMENT AEsmall)
+ (CHARWD R 7.53992)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 27 (COMMENT OEsmall)
+ (CHARWD R 8.65991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 28 (COMMENT Oslashsmall)
+ (CHARWD R 6.5199)
+ (CHARHT R 5.87988)
+ (CHARDP R 0.35999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 9.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.69995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 8.0299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.5)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.5)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.5199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (CHARIC R 0.43994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.79993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.08997)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.75989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.75)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.65991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (CHARIC R 0.48999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 4.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.62)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 6.19995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 3.1499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 4.41992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 3.1499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 3.19995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.10999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.19995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 3.1499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 3.1499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 6.19995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.75)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.75)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 8.43994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.81995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 7.10999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.62)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 8.12988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.58997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 8.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.94995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.82996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 7.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.35999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 6.1499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.69995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 8.12988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 8.0299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.6399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.31995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 8.0299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.8999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.82996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.55994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 8.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 0.85999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.87)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.48999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.28992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.81995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 6.40991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.71997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.5199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.5)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.5199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.65991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 97 (COMMENT Asmall)
+ (CHARWD R 5.48999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 98 (COMMENT Bsmall)
+ (CHARWD R 5.54993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 99 (COMMENT Csmall)
+ (CHARWD R 5.7799)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.48999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 100 (COMMENT Dsmall)
+ (CHARWD R 6.59998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 101 (COMMENT Esmall)
+ (CHARWD R 5.25989)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.47998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 102 (COMMENT Fsmall)
+ (CHARWD R 5.05994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 103 (COMMENT Gsmall)
+ (CHARWD R 6.16992)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.21997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 104 (COMMENT Hsmall)
+ (CHARWD R 6.69995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 105 (COMMENT Ismall)
+ (CHARWD R 3.25989)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.65991)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 106 (COMMENT Jsmall)
+ (CHARWD R 3.30994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.94995)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 107 (COMMENT Ksmall)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.03992)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 108 (COMMENT Lsmall)
+ (CHARWD R 5.0199)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 109 (COMMENT Msmall)
+ (CHARWD R 7.85999)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 110 (COMMENT Nsmall)
+ (CHARWD R 6.59998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.72998)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 111 (COMMENT Osmall)
+ (CHARWD R 6.5199)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 112 (COMMENT Psmall)
+ (CHARWD R 5.40991)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 113 (COMMENT Qsmall)
+ (CHARWD R 6.5199)
+ (CHARHT R 5.6499)
+ (CHARDP R 1.62)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 114 (COMMENT Rsmall)
+ (CHARWD R 5.62)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 115 (COMMENT Ssmall)
+ (CHARWD R 4.75989)
+ (CHARHT R 5.6499)
+ (CHARDP R 0.12)
+ (CHARIC R 0.06995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 116 (COMMENT Tsmall)
+ (CHARWD R 5.33997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 117 (COMMENT Usmall)
+ (CHARWD R 6.84998)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.12)
+ (CHARIC R 0.67993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 118 (COMMENT Vsmall)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.18994)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 119 (COMMENT Wsmall)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 120 (COMMENT Xsmall)
+ (CHARWD R 5.54993)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 121 (COMMENT Ysmall)
+ (CHARWD R 5.21997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 1.21997)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 122 (COMMENT Zsmall)
+ (CHARWD R 5.46997)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.5)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.5)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.5)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.5)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.5)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.87)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SELECTFONT D 1) (COMMENT putri8r at 10.0pt)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+(CHARACTER D 170 (COMMENT Lslashsmall)
+ (CHARWD R 5.05994)
+ (CHARHT R 5.5299)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.25)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.25)
+ )
+ )
+
+(COMMENT END OF FILE putric7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putrn7t.vpl b/fonts/utilities/vfinst/example/putrn7t.vpl
new file mode 100644
index 0000000000..f98a7695d6
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putrn7t.vpl
@@ -0,0 +1,2790 @@
+(VTITLE virtual font putrn7t created by fontinst v1.500)
+
+(COMMENT Filename: putrn7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putrn7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putrn7t.vpl putrn7t.vf putrn7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putr8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 116 R -0.75) (COMMENT t)
+ (KRN D 115 R -1.09998) (COMMENT s)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R -0.71997) (COMMENT quoteright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 109 R -0.69995) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.19995) (COMMENT d)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.05994) (COMMENT z)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 119 R -0.44995) (COMMENT w)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 39 R -1.19995) (COMMENT quoteright)
+ (KRN D 34 R -1.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.05994) (COMMENT X)
+ (KRN D 87 R -0.57996) (COMMENT W)
+ (KRN D 86 R -0.71997) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.69995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 108 R 0.04993) (COMMENT l)
+ (KRN D 107 R 0.04993) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.04993) (COMMENT r)
+ (KRN D 111 R 0.04993) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R 0.04993) (COMMENT oe)
+ (KRN D 28 R 0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.09998) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.69995) (COMMENT w)
+ (KRN D 118 R -0.69995) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.41992) (COMMENT Q)
+ (KRN D 79 R -0.41992) (COMMENT O)
+ (KRN D 71 R -0.41992) (COMMENT G)
+ (KRN D 67 R -0.41992) (COMMENT C)
+ (KRN D 31 R -0.41992) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.05994) (COMMENT I)
+ (KRN D 72 R -0.12) (COMMENT H)
+ (KRN D 69 R -0.05994) (COMMENT E)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.29993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.23999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.31995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.04993) (COMMENT q)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 109 R -0.19995) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.83997) (COMMENT y)
+ (KRN D 119 R -1.0) (COMMENT w)
+ (KRN D 117 R -0.81995) (COMMENT u)
+ (KRN D 59 R -0.55994) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.81995) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -1.0) (COMMENT o)
+ (KRN D 109 R -0.81995) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -1.0) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.53992) (COMMENT bracketright)
+ (KRN D 97 R -1.0) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.6499) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -1.0) (COMMENT oe)
+ (KRN D 28 R -1.0) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 112 R -0.41992) (COMMENT p)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 100 R -0.44995) (COMMENT d)
+ (KRN D 99 R -0.44995) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.44995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.6499) (COMMENT o)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.6499) (COMMENT e)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.47998) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.6499) (COMMENT oe)
+ (KRN D 28 R -0.6499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.05994) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.5) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.67993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.31995) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.59998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.5) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 113 R -0.79993) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.79993) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.69995) (COMMENT g)
+ (KRN D 102 R -0.5) (COMMENT f)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 99 R -0.79993) (COMMENT c)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 83 R -0.19995) (COMMENT S)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.5) (COMMENT ffi)
+ (KRN D 15 R -0.5) (COMMENT ffl)
+ (KRN D 11 R -0.5) (COMMENT ff)
+ (KRN D 12 R -0.5) (COMMENT fi)
+ (KRN D 13 R -0.5) (COMMENT fl)
+ (KRN D 27 R -0.79993) (COMMENT oe)
+ (KRN D 28 R -0.79993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.3999) (COMMENT z)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 96 R -0.71997) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.6499) (COMMENT g)
+ (KRN D 102 R -0.3999) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.17993) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.3999) (COMMENT ffi)
+ (KRN D 15 R -0.3999) (COMMENT ffl)
+ (KRN D 11 R -0.3999) (COMMENT ff)
+ (KRN D 12 R -0.3999) (COMMENT fi)
+ (KRN D 13 R -0.3999) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.2799) (COMMENT quoteright)
+ (KRN D 34 R -0.2799) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.09998) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.17993) (COMMENT w)
+ (KRN D 118 R 0.17993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.09998) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.75) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.84998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.37988)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.18994)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.18994)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.09998)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.09998)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.18994)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.09998)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.18994)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.09998)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.90991)
+ (POP)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 2.79993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -2.79993)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.0)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0)
+ (POP)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.00989)
+ (POP)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.96997)
+ (POP)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.81995)
+ (POP)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.7699)
+ (POP)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.75989)
+ (POP)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 10.25)
+ (POP)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.62)
+ (POP)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.41992)
+ (POP)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.57996)
+ (POP)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.37988)
+ (POP)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.05994)
+ (POP)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.7799)
+ (POP)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.12)
+ (POP)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.69995)
+ (POP)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.91992)
+ (POP)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.59998)
+ (POP)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.41992)
+ (POP)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.69995)
+ (POP)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.8899)
+ (POP)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.8899)
+ (POP)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.92993)
+ (POP)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.34998)
+ (POP)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.45996)
+ (POP)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.83997)
+ (POP)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.78992)
+ (POP)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.05994)
+ (POP)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.79993)
+ (POP)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.33997)
+ (POP)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.97998)
+ (POP)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.48999)
+ (POP)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.57996)
+ (POP)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.67993)
+ (POP)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.43994)
+ (POP)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.79993)
+ (POP)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.62)
+ (POP)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0)
+ (POP)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.62)
+ (POP)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.43994)
+ (POP)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.40991)
+ (POP)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.20996)
+ (POP)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.90991)
+ (POP)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.33997)
+ (POP)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.3999)
+ (POP)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.23999)
+ (POP)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.87988)
+ (POP)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.09998)
+ (POP)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.29993)
+ (POP)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.57996)
+ (POP)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.29993)
+ (POP)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.7799)
+ (POP)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.22998)
+ (POP)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.97998)
+ (POP)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.95996)
+ (POP)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.97998)
+ (POP)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.1399)
+ (POP)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.18994)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.19995)
+ (POP)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.06995)
+ (POP)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.90991)
+ (POP)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.79993)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.23999)
+ (POP)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.78992)
+ (POP)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.22998)
+ (POP)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.18994)
+ (POP)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.7699)
+ (POP)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.07996)
+ (POP)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.90991)
+ (POP)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.8899)
+ (POP)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.35999)
+ (POP)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.43994)
+ (POP)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.05994)
+ (POP)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.03992)
+ (POP)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.67993)
+ (POP)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.85999)
+ (POP)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.05994)
+ (POP)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.79993)
+ (POP)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.73999)
+ (POP)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.93994)
+ (POP)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putrn7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putrni7t.vpl b/fonts/utilities/vfinst/example/putrni7t.vpl
new file mode 100644
index 0000000000..049eafcfbd
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putrni7t.vpl
@@ -0,0 +1,2818 @@
+(VTITLE virtual font putrni7t created by fontinst v1.500)
+
+(COMMENT Filename: putrni7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putrni7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putrni7t.vpl putrni7t.vf putrni7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putri8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 116 R -0.34998) (COMMENT t)
+ (KRN D 115 R -0.54993) (COMMENT s)
+ (KRN D 114 R -0.25) (COMMENT r)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.25) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.75) (COMMENT Y)
+ (KRN D 87 R 0.75) (COMMENT W)
+ (KRN D 86 R 0.75) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R 0.09998) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.1499) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 106 R 0.05994) (COMMENT j)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 89 R -0.75989) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.79993) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.59998) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.19995) (COMMENT u)
+ (KRN D 114 R -0.1499) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R -0.25) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.5) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 120 R 0.04993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R 0.04993) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.15991) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R 0.09998) (COMMENT o)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 27 R 0.09998) (COMMENT oe)
+ (KRN D 28 R 0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.25) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 46 R -2.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.25) (COMMENT l)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -2.19995) (COMMENT comma)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 73 R -0.29993) (COMMENT I)
+ (KRN D 72 R -0.29993) (COMMENT H)
+ (KRN D 69 R -0.29993) (COMMENT E)
+ (KRN D 65 R -0.75) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 85 R -0.34998) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.1399) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.05994) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.29993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 104 R -0.29993) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.69995) (COMMENT z)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.6399) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 115 R -0.71997) (COMMENT s)
+ (KRN D 114 R -0.6399) (COMMENT r)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.5) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.6399) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.09998) (COMMENT colon)
+ (KRN D 93 R 0.44995) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.55994) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 110 R -0.44995) (COMMENT n)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.34998) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.45996) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.34998) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.75) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.62) (COMMENT o)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.5199) (COMMENT e)
+ (KRN D 44 R -1.19995) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.62) (COMMENT oe)
+ (KRN D 28 R -0.62) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.41992) (COMMENT y)
+ (KRN D 117 R -0.55994) (COMMENT u)
+ (KRN D 116 R -0.19995) (COMMENT t)
+ (KRN D 59 R -0.2799) (COMMENT semicolon)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 39 R 0.54993) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.07996) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.34998) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.53992) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 44 R -1.07996) (COMMENT comma)
+ (KRN D 58 R -0.2799) (COMMENT colon)
+ (KRN D 93 R 0.54993) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.34998) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.57996) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.71997) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.94995) (COMMENT hyphen)
+ (KRN D 101 R -0.71997) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.81995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.25) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.71997) (COMMENT oe)
+ (KRN D 28 R -0.71997) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.3999) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.3999) (COMMENT e)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.09998) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 96 R -0.17993) (COMMENT quoteleft)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.44995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 118 R -0.1499) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 112 R 0.12) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.34998) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.19995) (COMMENT k)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25989) (COMMENT d)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.54993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.69995) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.29993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.1499)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.1499)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.06995)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0299)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.21997)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.1499)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.06995)
+ (POP)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.1499)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.0299)
+ (POP)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.16992)
+ (POP)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.08997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.08997)
+ (POP)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.08997)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.71997)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 0.35999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.09998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0)
+ (POP)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.23999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.12)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.12)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.7699)
+ (POP)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.78992)
+ (POP)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.05994)
+ (POP)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.37)
+ (POP)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.79993)
+ (POP)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 10.19995)
+ (POP)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 1.5)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.5299)
+ (POP)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.3999)
+ (POP)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R 1.5)
+ (CHARIC R 0.43994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0199)
+ (POP)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 8.25989)
+ (POP)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.25)
+ (POP)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.48999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.15991)
+ (POP)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5)
+ (POP)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.12)
+ (POP)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.69995)
+ (POP)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.91992)
+ (POP)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.69995)
+ (POP)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.19995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 1.5)
+ (CHARIC R 0.05994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.29993)
+ (POP)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.6499)
+ (POP)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.3999)
+ (POP)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.69995)
+ (POP)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.25)
+ (POP)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.30994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.25)
+ (POP)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.93994)
+ (POP)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.23999)
+ (POP)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.31995)
+ (POP)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.60999)
+ (POP)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.03992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.62988)
+ (POP)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.95996)
+ (POP)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.70996)
+ (POP)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.08997)
+ (POP)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.75)
+ (POP)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.82996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.44995)
+ (POP)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.5199)
+ (POP)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.35999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.5)
+ (POP)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.6499)
+ (POP)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.19995)
+ (POP)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.62988)
+ (POP)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.5299)
+ (POP)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.1399)
+ (POP)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R 0.00989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.5299)
+ (POP)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.3999)
+ (POP)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.5)
+ (CHARIC R 0.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.32996)
+ (POP)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.05994)
+ (POP)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.85999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.93994)
+ (POP)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.48999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.37)
+ (POP)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.28992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.45996)
+ (POP)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.31995)
+ (POP)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.90991)
+ (POP)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.80994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.21997)
+ (POP)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.29993)
+ (POP)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (CHARIC R 0.70996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0199)
+ (POP)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.29993)
+ (POP)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R 1.5)
+ (CHARIC R 0.66992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 2.15991)
+ (POP)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0199)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.60999)
+ (POP)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.58997)
+ (POP)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.40991)
+ (POP)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.87)
+ (POP)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.5299)
+ (POP)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.1499)
+ (POP)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.73999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.98999)
+ (POP)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.06995)
+ (POP)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 1.5)
+ (CHARIC R 0.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.16992)
+ (POP)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.20996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.08997)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.21997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.44995)
+ (POP)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.05994)
+ (POP)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 9.12)
+ (POP)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.17993)
+ (POP)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.37)
+ (POP)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.8999)
+ (POP)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.58997)
+ (POP)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.0199)
+ (POP)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.07996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.8899)
+ (POP)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 1.5)
+ (CHARIC R 0.62988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.40991)
+ (POP)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 6.17993)
+ (POP)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.17993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.09998)
+ (POP)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.22998)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 7.84998)
+ (POP)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 1.5)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.15991)
+ (POP)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.37)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.67993)
+ (POP)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.5)
+ (CHARIC R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 4.67993)
+ (POP)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.23999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 0.54993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.91992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 0.87)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 5.70996)
+ (POP)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 1.5)
+ (CHARIC R 0.57996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (PUSH)
+ (MOVEUP R -1.5)
+ (SETRULE R 0.3999 R 3.17993)
+ (POP)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putrni7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putro7t.vpl b/fonts/utilities/vfinst/example/putro7t.vpl
new file mode 100644
index 0000000000..d507cde336
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putro7t.vpl
@@ -0,0 +1,2475 @@
+(VTITLE virtual font putro7t created by fontinst v1.500)
+
+(COMMENT Filename: putro7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putro7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putro7t.vpl putro7t.vf putro7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putro8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.23)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 4.8999)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 13) (COMMENT fl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 15) (COMMENT ffl)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.3999) (COMMENT v)
+ (KRN D 116 R -0.75) (COMMENT t)
+ (KRN D 115 R -1.09998) (COMMENT s)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R -0.71997) (COMMENT quoteright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 109 R -0.69995) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 100 R -1.19995) (COMMENT d)
+ (KRN D 44 R -1.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 122 R 0.05994) (COMMENT z)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 119 R -0.44995) (COMMENT w)
+ (KRN D 118 R -0.59998) (COMMENT v)
+ (KRN D 117 R -0.25) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 39 R -1.19995) (COMMENT quoteright)
+ (KRN D 34 R -1.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.05994) (COMMENT X)
+ (KRN D 87 R -0.57996) (COMMENT W)
+ (KRN D 86 R -0.71997) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.69995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 87 R -0.25) (COMMENT W)
+ (KRN D 86 R -0.19995) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.17993) (COMMENT z)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.34998) (COMMENT V)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.23999) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 114 R -0.03992) (COMMENT r)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.03992) (COMMENT n)
+ (KRN D 109 R -0.03992) (COMMENT m)
+ (KRN D 108 R 0.04993) (COMMENT l)
+ (KRN D 107 R 0.04993) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 86 R -0.05994) (COMMENT V)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 44 R -1.79993) (COMMENT comma)
+ (KRN D 97 R -0.47998) (COMMENT a)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 114 R -0.04993) (COMMENT r)
+ (KRN D 111 R 0.04993) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R 0.04993) (COMMENT oe)
+ (KRN D 28 R 0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.17993) (COMMENT w)
+ (KRN D 118 R -0.23999) (COMMENT v)
+ (KRN D 117 R -0.25989) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 112 R -0.25989) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.09998) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 93 R 0.19995) (COMMENT bracketright)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.69995) (COMMENT w)
+ (KRN D 118 R -0.69995) (COMMENT v)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 81 R -0.41992) (COMMENT Q)
+ (KRN D 79 R -0.41992) (COMMENT O)
+ (KRN D 71 R -0.41992) (COMMENT G)
+ (KRN D 67 R -0.41992) (COMMENT C)
+ (KRN D 31 R -0.41992) (COMMENT Oslash)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.23999) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.04993) (COMMENT n)
+ (KRN D 109 R -0.04993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.5) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.54993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 46 R -2.0) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -2.0) (COMMENT comma)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 73 R -0.05994) (COMMENT I)
+ (KRN D 72 R -0.12) (COMMENT H)
+ (KRN D 69 R -0.05994) (COMMENT E)
+ (KRN D 65 R -0.54993) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 89 R -0.29993) (COMMENT Y)
+ (KRN D 88 R -0.23999) (COMMENT X)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.17993) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.23999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.19995) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 89 R -0.44995) (COMMENT Y)
+ (KRN D 87 R -0.23999) (COMMENT W)
+ (KRN D 86 R -0.31995) (COMMENT V)
+ (KRN D 85 R -0.29993) (COMMENT U)
+ (KRN D 84 R -0.31995) (COMMENT T)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.19995) (COMMENT oe)
+ (KRN D 28 R -0.19995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (KRN D 113 R -0.04993) (COMMENT q)
+ (KRN D 112 R -0.23999) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.19995) (COMMENT n)
+ (KRN D 109 R -0.19995) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.12) (COMMENT j)
+ (KRN D 105 R -0.19995) (COMMENT i)
+ (KRN D 104 R -0.12) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.17993) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.6399) (COMMENT z)
+ (KRN D 121 R -0.83997) (COMMENT y)
+ (KRN D 119 R -1.0) (COMMENT w)
+ (KRN D 117 R -0.81995) (COMMENT u)
+ (KRN D 59 R -0.55994) (COMMENT semicolon)
+ (KRN D 115 R -0.81995) (COMMENT s)
+ (KRN D 114 R -0.81995) (COMMENT r)
+ (KRN D 39 R 0.23999) (COMMENT quoteright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -1.0) (COMMENT o)
+ (KRN D 109 R -0.81995) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -1.0) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.53992) (COMMENT bracketright)
+ (KRN D 97 R -1.0) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 83 R -0.12) (COMMENT S)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.6499) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -1.0) (COMMENT oe)
+ (KRN D 28 R -1.0) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 116 R -0.35999) (COMMENT t)
+ (KRN D 115 R -0.3999) (COMMENT s)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 112 R -0.41992) (COMMENT p)
+ (KRN D 110 R -0.3999) (COMMENT n)
+ (KRN D 109 R -0.3999) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.2799) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.5) (COMMENT g)
+ (KRN D 102 R -0.12) (COMMENT f)
+ (KRN D 100 R -0.44995) (COMMENT d)
+ (KRN D 99 R -0.44995) (COMMENT c)
+ (KRN D 98 R -0.12) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.3999) (COMMENT A)
+ (KRN D 14 R -0.12) (COMMENT ffi)
+ (KRN D 15 R -0.12) (COMMENT ffl)
+ (KRN D 11 R -0.12) (COMMENT ff)
+ (KRN D 12 R -0.12) (COMMENT fi)
+ (KRN D 13 R -0.12) (COMMENT fl)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 59 R -0.44995) (COMMENT semicolon)
+ (KRN D 114 R -0.69995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.3999) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 44 R -1.3999) (COMMENT comma)
+ (KRN D 58 R -0.44995) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.59998) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.5) (COMMENT y)
+ (KRN D 117 R -0.45996) (COMMENT u)
+ (KRN D 59 R -0.3999) (COMMENT semicolon)
+ (KRN D 114 R -0.44995) (COMMENT r)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -1.09998) (COMMENT period)
+ (KRN D 41 R 0.84998) (COMMENT parenright)
+ (KRN D 111 R -0.6499) (COMMENT o)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.6499) (COMMENT e)
+ (KRN D 100 R -0.6499) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (KRN D 58 R -0.3999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.05994) (COMMENT Q)
+ (KRN D 79 R -0.05994) (COMMENT O)
+ (KRN D 71 R -0.05994) (COMMENT G)
+ (KRN D 67 R -0.05994) (COMMENT C)
+ (KRN D 65 R -0.47998) (COMMENT A)
+ (KRN D 31 R -0.05994) (COMMENT Oslash)
+ (KRN D 27 R -0.6499) (COMMENT oe)
+ (KRN D 28 R -0.6499) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.05994) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.53992) (COMMENT u)
+ (KRN D 116 R -0.45996) (COMMENT t)
+ (KRN D 59 R -0.37) (COMMENT semicolon)
+ (KRN D 39 R 0.35999) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.5) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 100 R -0.8999) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R -0.5) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.67993) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.12) (COMMENT V)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.17993) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R -0.31995) (COMMENT A)
+ (KRN D 31 R -0.17993) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 79 R -0.19995) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.19995) (COMMENT C)
+ (KRN D 65 R 0.19995) (COMMENT A)
+ (KRN D 31 R -0.19995) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.59998) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.3999) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.5) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 113 R -0.79993) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.79993) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.69995) (COMMENT g)
+ (KRN D 102 R -0.5) (COMMENT f)
+ (KRN D 101 R -0.79993) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 99 R -0.79993) (COMMENT c)
+ (KRN D 97 R -0.69995) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 83 R -0.19995) (COMMENT S)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.5) (COMMENT ffi)
+ (KRN D 15 R -0.5) (COMMENT ffl)
+ (KRN D 11 R -0.5) (COMMENT ff)
+ (KRN D 12 R -0.5) (COMMENT fi)
+ (KRN D 13 R -0.5) (COMMENT fl)
+ (KRN D 27 R -0.79993) (COMMENT oe)
+ (KRN D 28 R -0.79993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.3999) (COMMENT z)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 120 R -0.29993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.5) (COMMENT u)
+ (KRN D 116 R -0.3999) (COMMENT t)
+ (KRN D 115 R -0.44995) (COMMENT s)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 96 R -0.71997) (COMMENT quoteleft)
+ (KRN D 113 R -0.69995) (COMMENT q)
+ (KRN D 112 R -0.5) (COMMENT p)
+ (KRN D 111 R -0.69995) (COMMENT o)
+ (KRN D 110 R -0.5) (COMMENT n)
+ (KRN D 109 R -0.5) (COMMENT m)
+ (KRN D 103 R -0.6499) (COMMENT g)
+ (KRN D 102 R -0.3999) (COMMENT f)
+ (KRN D 101 R -0.69995) (COMMENT e)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 99 R -0.69995) (COMMENT c)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 90 R -0.19995) (COMMENT Z)
+ (KRN D 89 R 0.17993) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.17993) (COMMENT W)
+ (KRN D 86 R 0.17993) (COMMENT V)
+ (KRN D 85 R -0.19995) (COMMENT U)
+ (KRN D 84 R 0.09998) (COMMENT T)
+ (KRN D 82 R -0.19995) (COMMENT R)
+ (KRN D 81 R -0.19995) (COMMENT Q)
+ (KRN D 80 R -0.19995) (COMMENT P)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 78 R -0.19995) (COMMENT N)
+ (KRN D 77 R -0.19995) (COMMENT M)
+ (KRN D 76 R -0.19995) (COMMENT L)
+ (KRN D 75 R -0.19995) (COMMENT K)
+ (KRN D 74 R -0.3999) (COMMENT J)
+ (KRN D 73 R -0.19995) (COMMENT I)
+ (KRN D 72 R -0.19995) (COMMENT H)
+ (KRN D 71 R -0.3999) (COMMENT G)
+ (KRN D 70 R -0.19995) (COMMENT F)
+ (KRN D 69 R -0.19995) (COMMENT E)
+ (KRN D 68 R -0.19995) (COMMENT D)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 66 R -0.19995) (COMMENT B)
+ (KRN D 65 R -1.29993) (COMMENT A)
+ (KRN D 138 R -0.19995) (COMMENT Lslash)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 14 R -0.3999) (COMMENT ffi)
+ (KRN D 15 R -0.3999) (COMMENT ffl)
+ (KRN D 11 R -0.3999) (COMMENT ff)
+ (KRN D 12 R -0.3999) (COMMENT fi)
+ (KRN D 13 R -0.3999) (COMMENT fl)
+ (KRN D 27 R -0.69995) (COMMENT oe)
+ (KRN D 28 R -0.69995) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.2799) (COMMENT quoteright)
+ (KRN D 34 R -0.2799) (COMMENT quotedblright)
+ (KRN D 46 R -0.09998) (COMMENT period)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.23999) (COMMENT quoteright)
+ (KRN D 34 R -0.23999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 122 R -0.03992) (COMMENT z)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.55994) (COMMENT quotedblright)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 93 R 1.0) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 108) (COMMENT l)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.12) (COMMENT z)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 120 R -0.17993) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.25) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 39 R -0.69995) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.3999) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 122 R 0.09998) (COMMENT z)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 120 R 0.12) (COMMENT x)
+ (KRN D 119 R 0.17993) (COMMENT w)
+ (KRN D 118 R 0.17993) (COMMENT v)
+ (KRN D 117 R 0.07996) (COMMENT u)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.59998) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R 0.07996) (COMMENT n)
+ (KRN D 109 R 0.07996) (COMMENT m)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 105 R 0.07996) (COMMENT i)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.19995) (COMMENT d)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.09998) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 34 R -0.17993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.09998) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 111 R -0.04993) (COMMENT o)
+ (KRN D 101 R -0.04993) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 44 R -0.8999) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.04993) (COMMENT oe)
+ (KRN D 28 R -0.04993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 39 R 0.19995) (COMMENT quoteright)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.79993) (COMMENT period)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.75) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 100 R -0.12) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 59 R 0.09998) (COMMENT semicolon)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.94995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.84998) (COMMENT comma)
+ (KRN D 58 R 0.09998) (COMMENT colon)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.5199) (COMMENT y)
+ (KRN D 119 R -0.57996) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -1.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 108 R 0.05994) (COMMENT l)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.0) (COMMENT V)
+ (KRN D 85 R -0.23999) (COMMENT U)
+ (KRN D 84 R -1.0) (COMMENT T)
+ (KRN D 81 R -0.17993) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.17993) (COMMENT G)
+ (KRN D 67 R -0.17993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.37988)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.28992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 2.79993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -2.79993)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.0)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.65991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.65991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.33997)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.16992)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.16992)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 0.40991)
+ (CHARIC R 1.21997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (CHARIC R 1.68994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 1.60999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.31995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.8899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (CHARIC R 1.56995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 1.40991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (CHARIC R 0.6399)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 1.71997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (CHARIC R 1.56995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putro7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putro8r.pl b/fonts/utilities/vfinst/example/putro8r.pl
new file mode 100644
index 0000000000..7bb4aaa3f7
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putro8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putro8r created by fontinst v1.500)
+
+(COMMENT Filename: putro8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putro8r}{putro8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putro8r.pl putro8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.41992)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.0199)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.37988)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.05994)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.40991)
+ (CHARDP R 1.40991)
+ (CHARIC R 0.31995)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R 0.6499)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.40991)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 1.1399)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.98999)
+ (CHARDP R -0.00989)
+ (CHARIC R 1.1399)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.92993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.34998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.83997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.78992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.33997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.97998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.48999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.1399)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.57996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.67993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.0)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.62)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.92993)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.43994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.40991)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.20996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.33997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.87988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.09998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 4.59998)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R -0.16992)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.97998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 5.1399)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.18994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 5.19995)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.16992)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6399)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 2.79993)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.6399)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.23999)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.04993)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 2.78992)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.22998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.18994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 6.07996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 4.35999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.43994)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 1.40991)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.03992)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 4.85999)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 5.05994)
+ (CHARHT R 4.8999)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.79993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.12)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.2799)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.16992)
+ (CHARDP R -1.75)
+ (CHARIC R 0.71997)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.41992)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.75)
+ (CHARDP R 0.09998)
+ (CHARIC R 1.54993)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.5)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R 1.5299)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R 1.57996)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.53992)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R 1.31995)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.7799)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.6399)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.7799)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 1.0)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 1.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.56995)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 1.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.09998)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.6399)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.03992)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R 1.6399)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.87988)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R 1.6399)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.15991)
+ (CHARDP R -1.87988)
+ (CHARIC R 0.71997)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.54993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 4.08997)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R 1.16992)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.7799)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.57996)
+ (CHARHT R 1.44995)
+ (CHARDP R 1.25)
+ (CHARIC R 0.32996)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.57996)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.71997)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.41992)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R 1.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.15991)
+ (CHARDP R 0.12)
+ (CHARIC R 0.25989)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.07996)
+ (CHARHT R 7.0)
+ (CHARDP R 0.25)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R 1.5)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 7.03992)
+ (CHARDP R -5.67993)
+ (CHARIC R 1.60999)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.82996)
+ (CHARDP R -5.69995)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.40991)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.6399)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.75989)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 3.8999)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.73999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.62)
+ (CHARHT R 7.3899)
+ (CHARDP R 0.5299)
+ (CHARIC R 1.68994)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.25)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 3.97998)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.34998)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.96997)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 2.90991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.0)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 2.93994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.7699)
+ (CHARHT R 5.31995)
+ (CHARDP R 0.40991)
+ (CHARIC R 1.21997)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.81995)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 6.00989)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 5.69995)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R 0.6399)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 3.5)
+ (CHARHT R 6.79993)
+ (CHARDP R -4.03992)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.62)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.7699)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.0199)
+ (CHARIC R 0.8899)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.62)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.45996)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.2799)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R 1.54993)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.21997)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.2699)
+ (CHARHT R 8.60999)
+ (CHARDP R 0.0)
+ (CHARIC R 1.97998)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 5.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 5.87988)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.40991)
+ (CHARHT R 8.81995)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 6.05994)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.7699)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.18994)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 5.05994)
+ (CHARHT R 6.82996)
+ (CHARDP R 2.41992)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R 1.69995)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.12)
+ (CHARIC R 1.71997)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.62)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.95996)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.1499)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R 1.08997)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.73999)
+ (CHARDP R -0.25989)
+ (CHARIC R 1.08997)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.79993)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.05994)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.79993)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 2.90991)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.0)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 5.87988)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.62)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.34998)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.09998)
+ (CHARHT R 8.81995)
+ (CHARDP R 0.0)
+ (CHARIC R 2.0199)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 3.79993)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 8.59998)
+ (CHARHT R 6.94995)
+ (CHARDP R 0.2699)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.84998)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.55994)
+ (CHARDP R 0.0)
+ (CHARIC R 1.2699)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 5.1399)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.22998)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 2.90991)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.0)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.22998)
+ (CHARHT R 6.82996)
+ (CHARDP R 0.12)
+ (CHARIC R 1.56995)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.17993)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.48999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R 2.03992)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.79993)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.29993)
+ (CHARIC R 1.62)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 4.35999)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.6499)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R 1.65991)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.62)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R 2.00989)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 5.92993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R 1.58997)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.22998)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.55994)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.90991)
+ (CHARHT R 8.40991)
+ (CHARDP R 0.1499)
+ (CHARIC R 1.92993)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 5.1399)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R 1.6499)
+ )
+
+(COMMENT END OF FILE putro8r.pl)
diff --git a/fonts/utilities/vfinst/example/putru7t.vpl b/fonts/utilities/vfinst/example/putru7t.vpl
new file mode 100644
index 0000000000..8cfd987e79
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putru7t.vpl
@@ -0,0 +1,2301 @@
+(VTITLE virtual font putru7t created by fontinst v1.500)
+
+(COMMENT Filename: putru7t.vpl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \etxtovpl{OT1}{putru7t})
+
+(COMMENT This file can be turned into a virtual fontwith)
+(COMMENT vpltovf putru7t.vpl putru7t.vf putru7t.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+(CODINGSCHEME TEX TEXT)
+
+(MAPFONT D 0 (FONTNAME putru8r) (FONTDSIZE R 10.0) (FONTAT R 10.0))
+
+(FONTDIMEN
+ (PARAMETER D 1 R 0.0)
+ (PARAMETER D 2 R 2.25)
+ (PARAMETER D 3 R 0.73999)
+ (PARAMETER D 4 R 0.73999)
+ (PARAMETER D 5 R 5.0199)
+ (PARAMETER D 6 R 10.0)
+ (PARAMETER D 7 R 0.73999)
+ )
+
+(LIGTABLE
+ (LABEL D 11) (COMMENT ff)
+ (LIG D 105 D 14) (COMMENT i ffi)
+ (LIG D 108 D 15) (COMMENT l ffl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 27) (COMMENT oe)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 28) (COMMENT oslash)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 32) (COMMENT lslashslash)
+ (LIG D 108 D 170) (COMMENT l lslash)
+ (LIG D 76 D 138) (COMMENT L Lslash)
+ (STOP)
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 60) (COMMENT quoteleft exclamdown)
+ (STOP)
+ (LABEL D 34) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 34) (COMMENT quoteright quotedblright)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 116 R -0.34998) (COMMENT t)
+ (KRN D 115 R -0.54993) (COMMENT s)
+ (KRN D 114 R -0.25) (COMMENT r)
+ (KRN D 39 R -0.17993) (COMMENT quoteright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 109 R -0.25) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 100 R -0.69995) (COMMENT d)
+ (KRN D 44 R -1.0) (COMMENT comma)
+ (STOP)
+ (LABEL D 40) (COMMENT parenleft)
+ (KRN D 89 R 0.75) (COMMENT Y)
+ (KRN D 87 R 0.75) (COMMENT W)
+ (KRN D 86 R 0.75) (COMMENT V)
+ (KRN D 84 R 0.6399) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 44) (COMMENT comma)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 123) (COMMENT hyphen rangedash)
+ (STOP)
+ (LABEL D 46) (COMMENT period)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 62) (COMMENT quoteleft questiondown)
+ (STOP)
+ (LABEL D 65) (COMMENT A)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R 0.09998) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R 0.1499) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.09998) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.17993) (COMMENT l)
+ (KRN D 106 R 0.05994) (COMMENT j)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 89 R -0.75989) (COMMENT Y)
+ (KRN D 88 R -0.07996) (COMMENT X)
+ (KRN D 87 R -0.79993) (COMMENT W)
+ (KRN D 86 R -0.8999) (COMMENT V)
+ (KRN D 85 R -0.59998) (COMMENT U)
+ (KRN D 84 R -0.71997) (COMMENT T)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.09998) (COMMENT oe)
+ (KRN D 28 R -0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 66) (COMMENT B)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 117 R -0.19995) (COMMENT u)
+ (KRN D 114 R -0.1499) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.1499) (COMMENT k)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 97 R 0.12) (COMMENT a)
+ (KRN D 87 R -0.19995) (COMMENT W)
+ (KRN D 86 R -0.5) (COMMENT V)
+ (KRN D 85 R -0.5) (COMMENT U)
+ (KRN D 84 R -0.19995) (COMMENT T)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 67) (COMMENT C)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 34 R 0.19995) (COMMENT quotedblright)
+ (KRN D 105 R -0.04993) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (STOP)
+ (LABEL D 68) (COMMENT D)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 117 R -0.09998) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 111 R 0.05994) (COMMENT o)
+ (KRN D 105 R 0.05994) (COMMENT i)
+ (KRN D 104 R -0.25) (COMMENT h)
+ (KRN D 101 R 0.05994) (COMMENT e)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 97 R 0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 87 R -0.5) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 27 R 0.05994) (COMMENT oe)
+ (KRN D 28 R 0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 69) (COMMENT E)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 120 R 0.04993) (COMMENT x)
+ (KRN D 119 R -0.19995) (COMMENT w)
+ (KRN D 118 R -0.17993) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R 0.04993) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 113 R 0.09998) (COMMENT q)
+ (KRN D 46 R 0.09998) (COMMENT period)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.09998) (COMMENT d)
+ (KRN D 44 R 0.09998) (COMMENT comma)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 70) (COMMENT F)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.17993) (COMMENT r)
+ (KRN D 39 R 0.1499) (COMMENT quoteright)
+ (KRN D 34 R 0.34998) (COMMENT quotedblright)
+ (KRN D 46 R -1.79993) (COMMENT period)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 44 R -1.69995) (COMMENT comma)
+ (KRN D 97 R -0.29993) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 71) (COMMENT G)
+ (KRN D 121 R -0.15991) (COMMENT y)
+ (KRN D 117 R -0.21997) (COMMENT u)
+ (KRN D 114 R -0.21997) (COMMENT r)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R 0.09998) (COMMENT o)
+ (KRN D 110 R -0.21997) (COMMENT n)
+ (KRN D 108 R -0.23999) (COMMENT l)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 104 R -0.17993) (COMMENT h)
+ (KRN D 101 R 0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 27 R 0.09998) (COMMENT oe)
+ (KRN D 28 R 0.09998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 72) (COMMENT H)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.12) (COMMENT a)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 73) (COMMENT I)
+ (KRN D 122 R -0.19995) (COMMENT z)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 120 R -0.05994) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 116 R -0.17993) (COMMENT t)
+ (KRN D 115 R -0.17993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 109 R -0.17993) (COMMENT m)
+ (KRN D 108 R -0.05994) (COMMENT l)
+ (KRN D 107 R -0.05994) (COMMENT k)
+ (KRN D 103 R -0.12) (COMMENT g)
+ (KRN D 102 R -0.05994) (COMMENT f)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 14 R -0.05994) (COMMENT ffi)
+ (KRN D 15 R -0.05994) (COMMENT ffl)
+ (KRN D 11 R -0.05994) (COMMENT ff)
+ (KRN D 12 R -0.05994) (COMMENT fi)
+ (KRN D 13 R -0.05994) (COMMENT fl)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 74) (COMMENT J)
+ (KRN D 121 R -0.12) (COMMENT y)
+ (KRN D 117 R -0.35999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.35999) (COMMENT o)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 101 R -0.35999) (COMMENT e)
+ (KRN D 97 R -0.35999) (COMMENT a)
+ (KRN D 27 R -0.35999) (COMMENT oe)
+ (KRN D 28 R -0.35999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 75) (COMMENT K)
+ (KRN D 121 R -0.3999) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.19995) (COMMENT v)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 39 R 0.25) (COMMENT quoteright)
+ (KRN D 34 R 0.3999) (COMMENT quotedblright)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.17993) (COMMENT n)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 104 R 0.05994) (COMMENT h)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.23999) (COMMENT Q)
+ (KRN D 79 R -0.23999) (COMMENT O)
+ (KRN D 71 R -0.23999) (COMMENT G)
+ (KRN D 67 R -0.23999) (COMMENT C)
+ (KRN D 31 R -0.23999) (COMMENT Oslash)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 76) (COMMENT L)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 77) (COMMENT M)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.05994) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 100 R -0.09998) (COMMENT d)
+ (KRN D 99 R -0.19995) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 78) (COMMENT N)
+ (KRN D 121 R -0.17993) (COMMENT y)
+ (KRN D 117 R -0.23999) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.25) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.19995) (COMMENT e)
+ (KRN D 97 R -0.21997) (COMMENT a)
+ (KRN D 27 R -0.25) (COMMENT oe)
+ (KRN D 28 R -0.25) (COMMENT oslash)
+ (STOP)
+ (LABEL D 79) (COMMENT O)
+ (KRN D 122 R -0.05994) (COMMENT z)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 118 R -0.09998) (COMMENT v)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.05994) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (KRN D 113 R 0.04993) (COMMENT q)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 112 R -0.05994) (COMMENT p)
+ (KRN D 110 R -0.05994) (COMMENT n)
+ (KRN D 109 R -0.05994) (COMMENT m)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.09998) (COMMENT k)
+ (KRN D 106 R -0.05994) (COMMENT j)
+ (KRN D 104 R -0.09998) (COMMENT h)
+ (KRN D 103 R -0.05994) (COMMENT g)
+ (KRN D 101 R 0.04993) (COMMENT e)
+ (KRN D 100 R 0.05994) (COMMENT d)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (KRN D 99 R 0.04993) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.75) (COMMENT Y)
+ (KRN D 88 R -0.29993) (COMMENT X)
+ (KRN D 87 R -0.3999) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 84 R -0.47998) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 80) (COMMENT P)
+ (KRN D 121 R 0.05994) (COMMENT y)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.05994) (COMMENT t)
+ (KRN D 115 R -0.23999) (COMMENT s)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 46 R -2.19995) (COMMENT period)
+ (KRN D 111 R -0.23999) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 108 R -0.25) (COMMENT l)
+ (KRN D 104 R -0.1499) (COMMENT h)
+ (KRN D 101 R -0.23999) (COMMENT e)
+ (KRN D 44 R -2.19995) (COMMENT comma)
+ (KRN D 97 R -0.23999) (COMMENT a)
+ (KRN D 73 R -0.29993) (COMMENT I)
+ (KRN D 72 R -0.29993) (COMMENT H)
+ (KRN D 69 R -0.29993) (COMMENT E)
+ (KRN D 65 R -0.75) (COMMENT A)
+ (KRN D 27 R -0.23999) (COMMENT oe)
+ (KRN D 28 R -0.23999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 81) (COMMENT Q)
+ (KRN D 117 R -0.05994) (COMMENT u)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 89 R -0.69995) (COMMENT Y)
+ (KRN D 88 R -0.12) (COMMENT X)
+ (KRN D 87 R -0.34998) (COMMENT W)
+ (KRN D 86 R -0.59998) (COMMENT V)
+ (KRN D 85 R -0.34998) (COMMENT U)
+ (KRN D 84 R -0.35999) (COMMENT T)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (STOP)
+ (LABEL D 82) (COMMENT R)
+ (KRN D 121 R -0.1399) (COMMENT y)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 111 R -0.12) (COMMENT o)
+ (KRN D 45 R -0.19995) (COMMENT hyphen)
+ (KRN D 101 R -0.12) (COMMENT e)
+ (KRN D 89 R -0.5) (COMMENT Y)
+ (KRN D 87 R -0.29993) (COMMENT W)
+ (KRN D 86 R -0.3999) (COMMENT V)
+ (KRN D 85 R -0.3999) (COMMENT U)
+ (KRN D 84 R -0.29993) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.05994) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.12) (COMMENT oe)
+ (KRN D 28 R -0.12) (COMMENT oslash)
+ (STOP)
+ (LABEL D 83) (COMMENT S)
+ (KRN D 121 R -0.29993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.29993) (COMMENT v)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 116 R -0.29993) (COMMENT t)
+ (KRN D 114 R -0.19995) (COMMENT r)
+ (KRN D 39 R -0.37988) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 112 R -0.17993) (COMMENT p)
+ (KRN D 110 R -0.23999) (COMMENT n)
+ (KRN D 109 R -0.23999) (COMMENT m)
+ (KRN D 108 R -0.29993) (COMMENT l)
+ (KRN D 107 R -0.23999) (COMMENT k)
+ (KRN D 106 R -0.25) (COMMENT j)
+ (KRN D 105 R -0.29993) (COMMENT i)
+ (KRN D 104 R -0.29993) (COMMENT h)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (STOP)
+ (LABEL D 84) (COMMENT T)
+ (KRN D 122 R -0.69995) (COMMENT z)
+ (KRN D 121 R -0.59998) (COMMENT y)
+ (KRN D 119 R -0.6399) (COMMENT w)
+ (KRN D 117 R -0.73999) (COMMENT u)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 115 R -0.71997) (COMMENT s)
+ (KRN D 114 R -0.6399) (COMMENT r)
+ (KRN D 39 R 0.44995) (COMMENT quoteright)
+ (KRN D 34 R 0.5) (COMMENT quotedblright)
+ (KRN D 46 R -1.0) (COMMENT period)
+ (KRN D 41 R 0.53992) (COMMENT parenright)
+ (KRN D 111 R -0.8999) (COMMENT o)
+ (KRN D 109 R -0.6399) (COMMENT m)
+ (KRN D 105 R -0.33997) (COMMENT i)
+ (KRN D 45 R -1.0) (COMMENT hyphen)
+ (KRN D 101 R -0.8999) (COMMENT e)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 58 R -0.09998) (COMMENT colon)
+ (KRN D 93 R 0.44995) (COMMENT bracketright)
+ (KRN D 97 R -0.8999) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.17993) (COMMENT X)
+ (KRN D 87 R 0.05994) (COMMENT W)
+ (KRN D 84 R 0.17993) (COMMENT T)
+ (KRN D 81 R -0.12) (COMMENT Q)
+ (KRN D 79 R -0.12) (COMMENT O)
+ (KRN D 71 R -0.12) (COMMENT G)
+ (KRN D 67 R -0.12) (COMMENT C)
+ (KRN D 65 R -0.55994) (COMMENT A)
+ (KRN D 31 R -0.12) (COMMENT Oslash)
+ (KRN D 27 R -0.8999) (COMMENT oe)
+ (KRN D 28 R -0.8999) (COMMENT oslash)
+ (STOP)
+ (LABEL D 85) (COMMENT U)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 116 R -0.23999) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.29993) (COMMENT r)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 112 R -0.3999) (COMMENT p)
+ (KRN D 110 R -0.44995) (COMMENT n)
+ (KRN D 109 R -0.44995) (COMMENT m)
+ (KRN D 108 R -0.12) (COMMENT l)
+ (KRN D 107 R -0.12) (COMMENT k)
+ (KRN D 105 R -0.23999) (COMMENT i)
+ (KRN D 104 R -0.05994) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.34998) (COMMENT c)
+ (KRN D 98 R -0.05994) (COMMENT b)
+ (KRN D 97 R -0.3999) (COMMENT a)
+ (KRN D 65 R -0.44995) (COMMENT A)
+ (STOP)
+ (LABEL D 86) (COMMENT V)
+ (KRN D 121 R -0.45996) (COMMENT y)
+ (KRN D 117 R -0.41992) (COMMENT u)
+ (KRN D 59 R -0.34998) (COMMENT semicolon)
+ (KRN D 114 R -0.5) (COMMENT r)
+ (KRN D 39 R 0.75) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -1.29993) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.62) (COMMENT o)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.59998) (COMMENT hyphen)
+ (KRN D 101 R -0.5199) (COMMENT e)
+ (KRN D 44 R -1.19995) (COMMENT comma)
+ (KRN D 58 R -0.17993) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.05994) (COMMENT T)
+ (KRN D 65 R -0.69995) (COMMENT A)
+ (KRN D 27 R -0.62) (COMMENT oe)
+ (KRN D 28 R -0.62) (COMMENT oslash)
+ (STOP)
+ (LABEL D 87) (COMMENT W)
+ (KRN D 121 R -0.41992) (COMMENT y)
+ (KRN D 117 R -0.55994) (COMMENT u)
+ (KRN D 116 R -0.19995) (COMMENT t)
+ (KRN D 59 R -0.2799) (COMMENT semicolon)
+ (KRN D 114 R -0.3999) (COMMENT r)
+ (KRN D 39 R 0.54993) (COMMENT quoteright)
+ (KRN D 34 R 0.59998) (COMMENT quotedblright)
+ (KRN D 46 R -1.07996) (COMMENT period)
+ (KRN D 41 R 0.6399) (COMMENT parenright)
+ (KRN D 111 R -0.59998) (COMMENT o)
+ (KRN D 109 R -0.34998) (COMMENT m)
+ (KRN D 105 R -0.09998) (COMMENT i)
+ (KRN D 45 R -0.3999) (COMMENT hyphen)
+ (KRN D 101 R -0.53992) (COMMENT e)
+ (KRN D 100 R -0.5) (COMMENT d)
+ (KRN D 44 R -1.07996) (COMMENT comma)
+ (KRN D 58 R -0.2799) (COMMENT colon)
+ (KRN D 93 R 0.54993) (COMMENT bracketright)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 84 R 0.12) (COMMENT T)
+ (KRN D 81 R -0.09998) (COMMENT Q)
+ (KRN D 79 R -0.09998) (COMMENT O)
+ (KRN D 71 R -0.09998) (COMMENT G)
+ (KRN D 67 R -0.09998) (COMMENT C)
+ (KRN D 65 R -0.57996) (COMMENT A)
+ (KRN D 31 R -0.09998) (COMMENT Oslash)
+ (KRN D 27 R -0.59998) (COMMENT oe)
+ (KRN D 28 R -0.59998) (COMMENT oslash)
+ (STOP)
+ (LABEL D 88) (COMMENT X)
+ (KRN D 121 R -0.34998) (COMMENT y)
+ (KRN D 117 R -0.29993) (COMMENT u)
+ (KRN D 114 R -0.05994) (COMMENT r)
+ (KRN D 39 R 0.34998) (COMMENT quoteright)
+ (KRN D 34 R 0.1499) (COMMENT quotedblright)
+ (KRN D 105 R -0.05994) (COMMENT i)
+ (KRN D 101 R -0.09998) (COMMENT e)
+ (KRN D 97 R 0.04993) (COMMENT a)
+ (KRN D 89 R -0.05994) (COMMENT Y)
+ (KRN D 87 R -0.05994) (COMMENT W)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R -0.17993) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (STOP)
+ (LABEL D 89) (COMMENT Y)
+ (KRN D 118 R -0.5) (COMMENT v)
+ (KRN D 117 R -0.57996) (COMMENT u)
+ (KRN D 116 R -0.31995) (COMMENT t)
+ (KRN D 59 R -0.35999) (COMMENT semicolon)
+ (KRN D 39 R 0.6499) (COMMENT quoteright)
+ (KRN D 34 R 0.69995) (COMMENT quotedblright)
+ (KRN D 113 R -1.0) (COMMENT q)
+ (KRN D 46 R -0.8999) (COMMENT period)
+ (KRN D 41 R 0.59998) (COMMENT parenright)
+ (KRN D 111 R -0.71997) (COMMENT o)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 45 R -0.94995) (COMMENT hyphen)
+ (KRN D 101 R -0.71997) (COMMENT e)
+ (KRN D 100 R -0.79993) (COMMENT d)
+ (KRN D 44 R -0.79993) (COMMENT comma)
+ (KRN D 58 R -0.35999) (COMMENT colon)
+ (KRN D 93 R 0.6399) (COMMENT bracketright)
+ (KRN D 97 R -0.81995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.12) (COMMENT X)
+ (KRN D 87 R 0.12) (COMMENT W)
+ (KRN D 86 R 0.05994) (COMMENT V)
+ (KRN D 84 R 0.25) (COMMENT T)
+ (KRN D 81 R -0.04993) (COMMENT Q)
+ (KRN D 79 R -0.04993) (COMMENT O)
+ (KRN D 71 R -0.04993) (COMMENT G)
+ (KRN D 67 R -0.04993) (COMMENT C)
+ (KRN D 65 R -0.35999) (COMMENT A)
+ (KRN D 31 R -0.04993) (COMMENT Oslash)
+ (KRN D 27 R -0.71997) (COMMENT oe)
+ (KRN D 28 R -0.71997) (COMMENT oslash)
+ (STOP)
+ (LABEL D 90) (COMMENT Z)
+ (KRN D 121 R -0.35999) (COMMENT y)
+ (KRN D 119 R -0.35999) (COMMENT w)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R 0.09998) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 105 R -0.12) (COMMENT i)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 81 R -0.29993) (COMMENT Q)
+ (KRN D 79 R -0.29993) (COMMENT O)
+ (KRN D 71 R -0.29993) (COMMENT G)
+ (KRN D 67 R -0.29993) (COMMENT C)
+ (KRN D 65 R 0.12) (COMMENT A)
+ (KRN D 31 R -0.29993) (COMMENT Oslash)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 91) (COMMENT bracketleft)
+ (KRN D 89 R 0.6399) (COMMENT Y)
+ (KRN D 87 R 0.6399) (COMMENT W)
+ (KRN D 86 R 0.6399) (COMMENT V)
+ (KRN D 84 R 0.53992) (COMMENT T)
+ (KRN D 74 R 0.79993) (COMMENT J)
+ (STOP)
+ (LABEL D 92) (COMMENT quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 113 R -0.3999) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.3999) (COMMENT e)
+ (KRN D 100 R -0.3999) (COMMENT d)
+ (KRN D 99 R -0.3999) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.59998) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 92) (COMMENT quoteleft quotedblleft)
+ (KRN D 122 R -0.29993) (COMMENT z)
+ (KRN D 121 R -0.09998) (COMMENT y)
+ (KRN D 120 R -0.3999) (COMMENT x)
+ (KRN D 119 R -0.12) (COMMENT w)
+ (KRN D 118 R -0.12) (COMMENT v)
+ (KRN D 117 R -0.12) (COMMENT u)
+ (KRN D 116 R -0.12) (COMMENT t)
+ (KRN D 115 R -0.29993) (COMMENT s)
+ (KRN D 114 R -0.12) (COMMENT r)
+ (KRN D 96 R -0.17993) (COMMENT quoteleft)
+ (KRN D 113 R -0.29993) (COMMENT q)
+ (KRN D 112 R -0.12) (COMMENT p)
+ (KRN D 111 R -0.29993) (COMMENT o)
+ (KRN D 110 R -0.12) (COMMENT n)
+ (KRN D 109 R -0.12) (COMMENT m)
+ (KRN D 108 R 0.09998) (COMMENT l)
+ (KRN D 107 R 0.09998) (COMMENT k)
+ (KRN D 104 R 0.09998) (COMMENT h)
+ (KRN D 103 R -0.29993) (COMMENT g)
+ (KRN D 101 R -0.29993) (COMMENT e)
+ (KRN D 100 R -0.29993) (COMMENT d)
+ (KRN D 99 R -0.29993) (COMMENT c)
+ (KRN D 98 R 0.23999) (COMMENT b)
+ (KRN D 97 R -0.44995) (COMMENT a)
+ (KRN D 89 R 0.12) (COMMENT Y)
+ (KRN D 88 R 0.2799) (COMMENT X)
+ (KRN D 87 R 0.2799) (COMMENT W)
+ (KRN D 86 R 0.2799) (COMMENT V)
+ (KRN D 84 R 0.35999) (COMMENT T)
+ (KRN D 65 R -0.8999) (COMMENT A)
+ (KRN D 27 R -0.29993) (COMMENT oe)
+ (KRN D 28 R -0.29993) (COMMENT oslash)
+ (STOP)
+ (LABEL D 97) (COMMENT a)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.3999) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 98) (COMMENT b)
+ (KRN D 121 R -0.05994) (COMMENT y)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 118 R -0.1499) (COMMENT v)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.3999) (COMMENT period)
+ (KRN D 44 R -0.29993) (COMMENT comma)
+ (STOP)
+ (LABEL D 99) (COMMENT c)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 100) (COMMENT d)
+ (KRN D 39 R -0.12) (COMMENT quoteright)
+ (KRN D 34 R -0.12) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 101) (COMMENT e)
+ (KRN D 120 R -0.09998) (COMMENT x)
+ (KRN D 119 R -0.09998) (COMMENT w)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 102) (COMMENT f)
+ (LIG D 105 D 12) (COMMENT i fi)
+ (LIG D 102 D 11) (COMMENT f ff)
+ (LIG D 108 D 13) (COMMENT l fl)
+ (KRN D 39 R 1.09998) (COMMENT quoteright)
+ (KRN D 34 R 1.09998) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 41 R 1.0) (COMMENT parenright)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (KRN D 93 R 0.8999) (COMMENT bracketright)
+ (STOP)
+ (LABEL D 103) (COMMENT g)
+ (KRN D 121 R 0.29993) (COMMENT y)
+ (KRN D 112 R 0.12) (COMMENT p)
+ (KRN D 102 R 0.41992) (COMMENT f)
+ (KRN D 14 R 0.41992) (COMMENT ffi)
+ (KRN D 15 R 0.41992) (COMMENT ffl)
+ (KRN D 11 R 0.41992) (COMMENT ff)
+ (KRN D 12 R 0.41992) (COMMENT fi)
+ (KRN D 13 R 0.41992) (COMMENT fl)
+ (STOP)
+ (LABEL D 104) (COMMENT h)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 106) (COMMENT j)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.34998) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 107) (COMMENT k)
+ (KRN D 39 R -0.29993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 109) (COMMENT m)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 110) (COMMENT n)
+ (KRN D 39 R -0.79993) (COMMENT quoteright)
+ (KRN D 34 R -0.79993) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 111) (COMMENT o)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 121 R -0.19995) (COMMENT y)
+ (KRN D 120 R -0.19995) (COMMENT x)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 118 R -0.34998) (COMMENT v)
+ (KRN D 39 R -0.59998) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 112) (COMMENT p)
+ (KRN D 122 R -0.09998) (COMMENT z)
+ (KRN D 119 R -0.1499) (COMMENT w)
+ (KRN D 39 R -0.5) (COMMENT quoteright)
+ (KRN D 34 R -0.69995) (COMMENT quotedblright)
+ (KRN D 46 R -0.29993) (COMMENT period)
+ (KRN D 44 R -0.19995) (COMMENT comma)
+ (STOP)
+ (LABEL D 113) (COMMENT q)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.19995) (COMMENT period)
+ (KRN D 44 R -0.09998) (COMMENT comma)
+ (STOP)
+ (LABEL D 114) (COMMENT r)
+ (KRN D 121 R 0.17993) (COMMENT y)
+ (KRN D 119 R 0.05994) (COMMENT w)
+ (KRN D 118 R 0.05994) (COMMENT v)
+ (KRN D 116 R 0.07996) (COMMENT t)
+ (KRN D 34 R -0.1499) (COMMENT quotedblright)
+ (KRN D 113 R -0.23999) (COMMENT q)
+ (KRN D 46 R -1.19995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 108 R -0.19995) (COMMENT l)
+ (KRN D 107 R -0.19995) (COMMENT k)
+ (KRN D 45 R -0.29993) (COMMENT hyphen)
+ (KRN D 104 R -0.19995) (COMMENT h)
+ (KRN D 102 R 0.07996) (COMMENT f)
+ (KRN D 101 R -0.25989) (COMMENT e)
+ (KRN D 100 R -0.25989) (COMMENT d)
+ (KRN D 44 R -1.09998) (COMMENT comma)
+ (KRN D 99 R -0.12) (COMMENT c)
+ (KRN D 97 R -0.19995) (COMMENT a)
+ (KRN D 14 R 0.07996) (COMMENT ffi)
+ (KRN D 15 R 0.07996) (COMMENT ffl)
+ (KRN D 11 R 0.07996) (COMMENT ff)
+ (KRN D 12 R 0.07996) (COMMENT fi)
+ (KRN D 13 R 0.07996) (COMMENT fl)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 115) (COMMENT s)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.44995) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 116) (COMMENT t)
+ (KRN D 39 R 0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.09998) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 117) (COMMENT u)
+ (KRN D 39 R -0.54993) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (STOP)
+ (LABEL D 118) (COMMENT v)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 44 R -0.69995) (COMMENT comma)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 97 R -0.05994) (COMMENT a)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 119) (COMMENT w)
+ (KRN D 39 R -0.19995) (COMMENT quoteright)
+ (KRN D 34 R -0.29993) (COMMENT quotedblright)
+ (KRN D 46 R -0.62) (COMMENT period)
+ (KRN D 44 R -0.62) (COMMENT comma)
+ (STOP)
+ (LABEL D 120) (COMMENT x)
+ (KRN D 121 R 0.12) (COMMENT y)
+ (KRN D 119 R -0.05994) (COMMENT w)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 113 R -0.05994) (COMMENT q)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 121) (COMMENT y)
+ (KRN D 39 R -0.09998) (COMMENT quoteright)
+ (KRN D 34 R -0.19995) (COMMENT quotedblright)
+ (KRN D 46 R -0.69995) (COMMENT period)
+ (KRN D 44 R -0.59998) (COMMENT comma)
+ (STOP)
+ (LABEL D 122) (COMMENT z)
+ (KRN D 39 R -0.3999) (COMMENT quoteright)
+ (KRN D 34 R -0.5) (COMMENT quotedblright)
+ (KRN D 111 R -0.05994) (COMMENT o)
+ (KRN D 101 R -0.05994) (COMMENT e)
+ (KRN D 100 R -0.05994) (COMMENT d)
+ (KRN D 99 R -0.05994) (COMMENT c)
+ (KRN D 27 R -0.05994) (COMMENT oe)
+ (KRN D 28 R -0.05994) (COMMENT oslash)
+ (STOP)
+ (LABEL D 123) (COMMENT rangedash)
+ (LIG D 45 D 124) (COMMENT hyphen punctdash)
+ (STOP)
+ (LABEL D 138) (COMMENT Lslash)
+ (KRN D 121 R -0.54993) (COMMENT y)
+ (KRN D 119 R -0.29993) (COMMENT w)
+ (KRN D 117 R -0.17993) (COMMENT u)
+ (KRN D 39 R -1.09998) (COMMENT quoteright)
+ (KRN D 34 R -1.09998) (COMMENT quotedblright)
+ (KRN D 108 R -0.15991) (COMMENT l)
+ (KRN D 106 R -0.17993) (COMMENT j)
+ (KRN D 105 R -0.17993) (COMMENT i)
+ (KRN D 97 R 0.09998) (COMMENT a)
+ (KRN D 89 R -0.79993) (COMMENT Y)
+ (KRN D 87 R -0.8999) (COMMENT W)
+ (KRN D 86 R -1.09998) (COMMENT V)
+ (KRN D 85 R -0.41992) (COMMENT U)
+ (KRN D 84 R -0.79993) (COMMENT T)
+ (KRN D 81 R -0.47998) (COMMENT Q)
+ (KRN D 79 R -0.47998) (COMMENT O)
+ (KRN D 71 R -0.47998) (COMMENT G)
+ (KRN D 67 R -0.47998) (COMMENT C)
+ (KRN D 65 R 0.29993) (COMMENT A)
+ (KRN D 31 R -0.47998) (COMMENT Oslash)
+ (STOP)
+ )
+
+(CHARACTER D 0 (COMMENT Gamma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Gamma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 1 (COMMENT Delta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Delta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 2 (COMMENT Theta)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Theta')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 3 (COMMENT Lambda)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Lambda')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 4 (COMMENT Xi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Xi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 5 (COMMENT Pi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Pi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 6 (COMMENT Sigma)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Sigma')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 8 (COMMENT Phi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Phi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 9 (COMMENT Psi)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Psi')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 10 (COMMENT Omega)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `Omega')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 11 (COMMENT ff)
+ (CHARWD R 6.29993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 12 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 13 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 14 (COMMENT ffi)
+ (CHARWD R 9.21997)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 2) (COMMENT fi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 15 (COMMENT ffl)
+ (CHARWD R 9.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (SETCHAR D 3) (COMMENT fl)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 17) (COMMENT dotlessi)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 17 (COMMENT dotlessj)
+ (CHARWD R 3.08997)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SPECIAL ps: gsave gsave)
+ (PUSH)
+ (MOVEUP R -2.41992)
+ (MOVERIGHT R -3.08997)
+ (SPECIAL ps: currentpoint /JDepth exch def /JLeft exch def)
+ (MOVEUP R 7.43994)
+ (MOVERIGHT R 7.71997)
+ (SPECIAL ps: currentpoint /IHeight exch def /JRight exch def grestore)
+ (SPECIAL ps: JLeft JDepth moveto JLeft neg JRight add 0 rlineto 0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0 rlineto 0 JDepth neg IHeight add neg rlineto closepath clip)
+ (POP)
+ (SETCHAR D 106) (COMMENT j)
+ (SPECIAL ps: grestore)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 30) (COMMENT grave)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 180) (COMMENT acute)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 16) (COMMENT caron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 11) (COMMENT breve)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 175) (COMMENT macron)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 23 (COMMENT ringfitted)
+ (CHARWD R 6.23999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (MOVERIGHT R 1.12)
+ (SETCHAR D 9) (COMMENT ring)
+ (MOVERIGHT R 1.12)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 184) (COMMENT cedilla)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 223) (COMMENT germandbls)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 230) (COMMENT ae)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 156) (COMMENT oe)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 0.3899)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 248) (COMMENT oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 198) (COMMENT AE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 140) (COMMENT OE)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 216) (COMMENT Oslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 32 (COMMENT lslashslash)
+ (CHARWD R 5.0)
+ (CHARHT R 5.0)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETRULE R 5.0 R 5.0)
+ (SPECIAL Warning: missing glyph `lslashslash')
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 33) (COMMENT exclam)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 34 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 148) (COMMENT quotedblright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 35) (COMMENT numbersign)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.08997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 36) (COMMENT dollar)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 37) (COMMENT percent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 38) (COMMENT ampersand)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 39) (COMMENT quoteright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 40) (COMMENT parenleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 41) (COMMENT parenright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 42) (COMMENT asterisk)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 43) (COMMENT plus)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 44) (COMMENT comma)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 45) (COMMENT hyphen)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 46) (COMMENT period)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 47) (COMMENT slash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 48) (COMMENT zero)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 49) (COMMENT one)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 50) (COMMENT two)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 51) (COMMENT three)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 52) (COMMENT four)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 53) (COMMENT five)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 54) (COMMENT six)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 55) (COMMENT seven)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 56) (COMMENT eight)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 57) (COMMENT nine)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 58) (COMMENT colon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 59) (COMMENT semicolon)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 60 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 161) (COMMENT exclamdown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 61) (COMMENT equal)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 62 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 191) (COMMENT questiondown)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 63) (COMMENT question)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 64) (COMMENT at)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 65) (COMMENT A)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 66) (COMMENT B)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 67) (COMMENT C)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 68) (COMMENT D)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 69) (COMMENT E)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 70) (COMMENT F)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 71) (COMMENT G)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 72) (COMMENT H)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 73) (COMMENT I)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 74) (COMMENT J)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 75) (COMMENT K)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 76) (COMMENT L)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 77) (COMMENT M)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 78) (COMMENT N)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 79) (COMMENT O)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 80) (COMMENT P)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 81) (COMMENT Q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 82) (COMMENT R)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 83) (COMMENT S)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 84) (COMMENT T)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 85) (COMMENT U)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 86) (COMMENT V)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 87) (COMMENT W)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 88) (COMMENT X)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 89) (COMMENT Y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 90) (COMMENT Z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 91) (COMMENT bracketleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 92 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 147) (COMMENT quotedblleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 93) (COMMENT bracketright)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 136) (COMMENT circumflex)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 95 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 1) (COMMENT dotaccent)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 96) (COMMENT quoteleft)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 97) (COMMENT a)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 98) (COMMENT b)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 99) (COMMENT c)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 100) (COMMENT d)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 101) (COMMENT e)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.18994)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 102) (COMMENT f)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 103) (COMMENT g)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 104) (COMMENT h)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 105) (COMMENT i)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 106) (COMMENT j)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 107) (COMMENT k)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 108) (COMMENT l)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 109) (COMMENT m)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 110) (COMMENT n)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 111) (COMMENT o)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 112) (COMMENT p)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 113) (COMMENT q)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 114) (COMMENT r)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 115) (COMMENT s)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 116) (COMMENT t)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 117) (COMMENT u)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 118) (COMMENT v)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 119) (COMMENT w)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 120) (COMMENT x)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 121) (COMMENT y)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 122) (COMMENT z)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 123 (COMMENT rangedash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 150) (COMMENT endash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 124 (COMMENT punctdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 151) (COMMENT emdash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 125 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 5) (COMMENT hungarumlaut)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 152) (COMMENT tilde)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 168) (COMMENT dieresis)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 138 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 6) (COMMENT Lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+(CHARACTER D 170 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (MAP
+ (MOVERIGHT R 0.0)
+ (SETCHAR D 7) (COMMENT lslash)
+ (MOVERIGHT R 0.0)
+ )
+ )
+
+(COMMENT END OF FILE putru7t.vpl)
diff --git a/fonts/utilities/vfinst/example/putru8r.pl b/fonts/utilities/vfinst/example/putru8r.pl
new file mode 100644
index 0000000000..3fd34e6f7c
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putru8r.pl
@@ -0,0 +1,1384 @@
+(COMMENT raw font putru8r created by fontinst v1.500)
+
+(COMMENT Filename: putru8r.pl)
+(COMMENT Created by: tex makefont)
+(COMMENT Created using: \mtxtopl{putru8r}{putru8r})
+
+(COMMENT This file can be turned into a TeX font with)
+(COMMENT pltotfm putru8r.pl putru8r.tfm)
+
+(COMMENT THIS FILE CAN THEN BE DELETED.)
+
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 10.0)
+
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 2.25)
+ (CHARHT R 0.0)
+ (CHARDP R 0.0)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 2.3999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R -1.17993)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.42993)
+ (CHARDP R 1.08997)
+ (CHARIC R -1.48999)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 8.25989)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 7.25)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.81995)
+ (CHARIC R -1.20996)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -0.50989)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 3.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 4.12)
+ (CHARHT R 7.06995)
+ (CHARDP R -3.55994)
+ (CHARIC R -1.15991)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.41992)
+ (CHARDP R 1.33997)
+ (CHARIC R -0.31995)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 3.91992)
+ (CHARHT R 2.85999)
+ (CHARDP R -2.15991)
+ (CHARIC R -0.6499)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 2.6499)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R -0.25)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 48 (COMMENT zero)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 49 (COMMENT one)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 50 (COMMENT two)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.47998)
+ )
+(CHARACTER D 51 (COMMENT three)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 52 (COMMENT four)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 53 (COMMENT five)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.32996)
+ )
+(CHARACTER D 54 (COMMENT six)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.34998)
+ )
+(CHARACTER D 55 (COMMENT seven)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.12)
+ (CHARIC R -0.82996)
+ )
+(CHARACTER D 56 (COMMENT eight)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.50989)
+ )
+(CHARACTER D 57 (COMMENT nine)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.12)
+ (CHARIC R -1.5)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 2.6499)
+ (CHARHT R 4.8999)
+ (CHARDP R 1.33997)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R -1.1399)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.10999)
+ (CHARIC R -0.8899)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.96997)
+ (CHARDP R -0.00989)
+ (CHARIC R -1.1399)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 4.25)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.30994)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 7.93994)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 65 (COMMENT A)
+ (CHARWD R 6.23999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 66 (COMMENT B)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 67 (COMMENT C)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 68 (COMMENT D)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 69 (COMMENT E)
+ (CHARWD R 5.95996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 70 (COMMENT F)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.69995)
+ )
+(CHARACTER D 71 (COMMENT G)
+ (CHARWD R 7.08997)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.33997)
+ )
+(CHARACTER D 72 (COMMENT H)
+ (CHARWD R 7.75)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.7699)
+ )
+(CHARACTER D 73 (COMMENT I)
+ (CHARWD R 3.44995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.75989)
+ )
+(CHARACTER D 74 (COMMENT J)
+ (CHARWD R 3.5199)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.18994)
+ (CHARIC R -0.75)
+ )
+(CHARACTER D 75 (COMMENT K)
+ (CHARWD R 6.5)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.04993)
+ (CHARIC R -0.22998)
+ )
+(CHARACTER D 76 (COMMENT L)
+ (CHARWD R 5.6499)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 77 (COMMENT M)
+ (CHARWD R 9.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.7699)
+ )
+(CHARACTER D 78 (COMMENT N)
+ (CHARWD R 7.62988)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.66992)
+ )
+(CHARACTER D 79 (COMMENT O)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 80 (COMMENT P)
+ (CHARWD R 6.1399)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.2699)
+ )
+(CHARACTER D 81 (COMMENT Q)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.0299)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 82 (COMMENT R)
+ (CHARWD R 6.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.56995)
+ )
+(CHARACTER D 83 (COMMENT S)
+ (CHARWD R 5.32996)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 84 (COMMENT T)
+ (CHARWD R 6.05994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.56995)
+ )
+(CHARACTER D 85 (COMMENT U)
+ (CHARWD R 7.93994)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.1499)
+ (CHARIC R -0.72998)
+ )
+(CHARACTER D 86 (COMMENT V)
+ (CHARWD R 6.37)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.09998)
+ )
+(CHARACTER D 87 (COMMENT W)
+ (CHARWD R 9.45996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.29993)
+ )
+(CHARACTER D 88 (COMMENT X)
+ (CHARWD R 6.31995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.55994)
+ )
+(CHARACTER D 89 (COMMENT Y)
+ (CHARWD R 5.90991)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.05994)
+ )
+(CHARACTER D 90 (COMMENT Z)
+ (CHARWD R 6.21997)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.7799)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -0.75)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 3.8999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 3.29993)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 94 (COMMENT asciicircum)
+ (CHARWD R 5.69995)
+ (CHARHT R 6.67993)
+ (CHARDP R -2.2799)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 5.0)
+ (CHARHT R -0.75)
+ (CHARDP R 1.25)
+ (CHARIC R 0.16992)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R -1.04993)
+ )
+(CHARACTER D 97 (COMMENT a)
+ (CHARWD R 5.60999)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12988)
+ )
+(CHARACTER D 98 (COMMENT b)
+ (CHARWD R 5.58997)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 99 (COMMENT c)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 100 (COMMENT d)
+ (CHARWD R 5.87)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 101 (COMMENT e)
+ (CHARWD R 4.5299)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 102 (COMMENT f)
+ (CHARWD R 3.1499)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R 0.18994)
+ )
+(CHARACTER D 103 (COMMENT g)
+ (CHARWD R 4.98999)
+ (CHARHT R 5.12)
+ (CHARDP R 2.41992)
+ (CHARIC R -0.42993)
+ )
+(CHARACTER D 104 (COMMENT h)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 105 (COMMENT i)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.1499)
+ (CHARDP R 0.12)
+ (CHARIC R -1.5299)
+ )
+(CHARACTER D 106 (COMMENT j)
+ (CHARWD R 3.08997)
+ (CHARHT R 7.1499)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.42993)
+ )
+(CHARACTER D 107 (COMMENT k)
+ (CHARWD R 5.44995)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.47998)
+ )
+(CHARACTER D 108 (COMMENT l)
+ (CHARWD R 3.05994)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 109 (COMMENT m)
+ (CHARWD R 9.12)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 110 (COMMENT n)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 111 (COMMENT o)
+ (CHARWD R 5.37)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 112 (COMMENT p)
+ (CHARWD R 5.8999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 113 (COMMENT q)
+ (CHARWD R 5.58997)
+ (CHARHT R 5.25)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 114 (COMMENT r)
+ (CHARWD R 4.0199)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.68994)
+ )
+(CHARACTER D 115 (COMMENT s)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.06995)
+ )
+(CHARACTER D 116 (COMMENT t)
+ (CHARWD R 3.40991)
+ (CHARHT R 6.15991)
+ (CHARDP R 0.12)
+ (CHARIC R -0.7799)
+ )
+(CHARACTER D 117 (COMMENT u)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 118 (COMMENT v)
+ (CHARWD R 5.09998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 119 (COMMENT w)
+ (CHARWD R 7.84998)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.91992)
+ )
+(CHARACTER D 120 (COMMENT x)
+ (CHARWD R 5.15991)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 121 (COMMENT y)
+ (CHARWD R 4.67993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.41992)
+ (CHARIC R -0.7799)
+ )
+(CHARACTER D 122 (COMMENT z)
+ (CHARWD R 4.67993)
+ (CHARHT R 4.8999)
+ (CHARDP R 0.12)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -0.75989)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 2.69995)
+ (CHARHT R 7.5)
+ (CHARDP R 2.5)
+ (CHARIC R -1.71997)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 3.3999)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.2799)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 126 (COMMENT asciitilde)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.17993)
+ (CHARDP R -1.75989)
+ (CHARIC R -0.72998)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 2.3999)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.68994)
+ (CHARDP R 0.20996)
+ (CHARIC R -1.19995)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.79993)
+ (CHARDP R 0.0)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 1.0)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R 1.08997)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.67993)
+ (CHARDP R 0.0)
+ (CHARIC R -0.37988)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 5.29993)
+ (CHARHT R 6.90991)
+ (CHARDP R 1.34998)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 5.29993)
+ (CHARHT R 7.06995)
+ (CHARDP R 1.1499)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 5.29993)
+ (CHARHT R 5.7799)
+ (CHARDP R -0.8999)
+ (CHARIC R -1.25989)
+ )
+(CHARACTER D 31 (COMMENT quotesingle)
+ (CHARWD R 2.15991)
+ (CHARHT R 7.41992)
+ (CHARDP R -4.68994)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.47998)
+ (CHARDP R -4.87988)
+ (CHARIC R -1.00989)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R -0.91992)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 2.7699)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 2 (COMMENT fi)
+ (CHARWD R 6.06995)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 3 (COMMENT fl)
+ (CHARWD R 6.0299)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 5.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R -0.3999)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 5.0)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.25)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 4.8999)
+ (CHARHT R 7.16992)
+ (CHARDP R 1.18994)
+ (CHARIC R -1.44995)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 2.6499)
+ (CHARHT R 3.12)
+ (CHARDP R -1.87)
+ (CHARIC R -0.70996)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 5.59998)
+ (CHARHT R 6.91992)
+ (CHARDP R 1.00989)
+ (CHARIC R -0.81995)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 5.0)
+ (CHARHT R 5.12)
+ (CHARDP R -1.91992)
+ (CHARIC R -1.16992)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 2.15991)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R -0.33997)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 4.0199)
+ (CHARHT R 1.50989)
+ (CHARDP R 1.08997)
+ (CHARIC R -0.33997)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 4.0199)
+ (CHARHT R 7.43994)
+ (CHARDP R -4.83997)
+ (CHARIC R -1.2699)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 4.62)
+ (CHARHT R 4.34998)
+ (CHARDP R -0.40991)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 10.0)
+ (CHARHT R 1.12988)
+ (CHARDP R 0.12)
+ (CHARIC R -0.25)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 12.0)
+ (CHARHT R 7.0199)
+ (CHARDP R 0.25)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 4.25)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.16992)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 30 (COMMENT grave)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 180 (COMMENT acute)
+ (CHARWD R 4.0)
+ (CHARHT R 7.22998)
+ (CHARDP R -5.41992)
+ (CHARIC R -1.29993)
+ )
+(CHARACTER D 136 (COMMENT circumflex)
+ (CHARWD R 4.0)
+ (CHARHT R 7.19995)
+ (CHARDP R -5.45996)
+ (CHARIC R -0.80994)
+ )
+(CHARACTER D 152 (COMMENT tilde)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.62988)
+ (CHARIC R -0.6399)
+ )
+(CHARACTER D 175 (COMMENT macron)
+ (CHARWD R 4.0)
+ (CHARHT R 6.55994)
+ (CHARDP R -5.96997)
+ (CHARIC R -0.60999)
+ )
+(CHARACTER D 11 (COMMENT breve)
+ (CHARWD R 4.0)
+ (CHARHT R 6.97998)
+ (CHARDP R -5.67993)
+ (CHARIC R -0.58997)
+ )
+(CHARACTER D 1 (COMMENT dotaccent)
+ (CHARWD R 4.0199)
+ (CHARHT R 6.79993)
+ (CHARDP R -5.69995)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 168 (COMMENT dieresis)
+ (CHARWD R 4.0)
+ (CHARHT R 6.81995)
+ (CHARDP R -5.71997)
+ (CHARIC R -0.68994)
+ )
+(CHARACTER D 9 (COMMENT ring)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5199)
+ (CHARDP R -5.5)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 184 (COMMENT cedilla)
+ (CHARWD R 4.0)
+ (CHARHT R 0.0)
+ (CHARDP R 2.29993)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 5 (COMMENT hungarumlaut)
+ (CHARWD R 4.0)
+ (CHARHT R 7.5)
+ (CHARDP R -5.45996)
+ (CHARIC R -1.16992)
+ )
+(CHARACTER D 8 (COMMENT ogonek)
+ (CHARWD R 3.5)
+ (CHARHT R 0.0)
+ (CHARDP R 2.18994)
+ (CHARIC R 0.0)
+ )
+(CHARACTER D 16 (COMMENT caron)
+ (CHARWD R 4.0)
+ (CHARHT R 7.30994)
+ (CHARDP R -5.56995)
+ (CHARIC R -0.57996)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 10.0)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R -0.3999)
+ )
+(CHARACTER D 198 (COMMENT AE)
+ (CHARWD R 8.79993)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 4.25)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 6 (COMMENT Lslash)
+ (CHARWD R 5.70996)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 216 (COMMENT Oslash)
+ (CHARWD R 7.5299)
+ (CHARHT R 7.35999)
+ (CHARDP R 0.44995)
+ (CHARIC R -1.67993)
+ )
+(CHARACTER D 140 (COMMENT OE)
+ (CHARWD R 10.19995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -0.97998)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 3.8899)
+ (CHARHT R 5.8999)
+ (CHARDP R -2.6499)
+ (CHARIC R -1.03992)
+ )
+(CHARACTER D 230 (COMMENT ae)
+ (CHARWD R 7.78992)
+ (CHARHT R 5.1399)
+ (CHARDP R 0.12)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 17 (COMMENT dotlessi)
+ (CHARWD R 3.16992)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 7 (COMMENT lslash)
+ (CHARWD R 3.17993)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.12)
+ )
+(CHARACTER D 248 (COMMENT oslash)
+ (CHARWD R 5.37)
+ (CHARHT R 5.28992)
+ (CHARDP R 0.3899)
+ (CHARIC R -1.20996)
+ )
+(CHARACTER D 156 (COMMENT oe)
+ (CHARWD R 8.05994)
+ (CHARHT R 5.0199)
+ (CHARDP R 0.12)
+ (CHARIC R -0.96997)
+ )
+(CHARACTER D 223 (COMMENT germandbls)
+ (CHARWD R 5.7699)
+ (CHARHT R 7.41992)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.16992)
+ )
+(CHARACTER D 185 (COMMENT onesuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 12 (COMMENT minus)
+ (CHARWD R 5.69995)
+ (CHARHT R 2.78992)
+ (CHARDP R -2.20996)
+ (CHARIC R -0.6399)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 4.0)
+ (CHARHT R 6.79993)
+ (CHARDP R -4.03992)
+ (CHARIC R -1.2799)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 5.37)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.93994)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 5.37)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.42993)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.6499)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R -1.59998)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 5.69995)
+ (CHARHT R 3.8899)
+ (CHARDP R -1.0199)
+ (CHARIC R -0.8899)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R -1.3999)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R -1.59998)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.91992)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -0.84998)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.42993)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -0.98999)
+ )
+(CHARACTER D 181 (COMMENT mu)
+ (CHARWD R 6.17993)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.31995)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 2.69995)
+ (CHARHT R 6.75)
+ (CHARDP R 1.75)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 5.83997)
+ (CHARHT R 7.0)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.60999)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.60999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.97998)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 4.67993)
+ (CHARHT R 7.22998)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.28992)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 5.90991)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R -0.41992)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 11.0)
+ (CHARHT R 6.91992)
+ (CHARDP R -2.7699)
+ (CHARIC R -1.58997)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 8.35999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 5.37)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.6499)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -2.03992)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 5.32996)
+ (CHARHT R 8.87988)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.75989)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.17993)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 5.95996)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R -1.33997)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.17993)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 5.37)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 4.67993)
+ (CHARHT R 6.81995)
+ (CHARDP R 2.41992)
+ (CHARIC R -1.10999)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.85999)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 5.37)
+ (CHARHT R 7.41992)
+ (CHARDP R 0.12)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.62988)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.5199)
+ (CHARDP R 0.12)
+ (CHARIC R -1.69995)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.0299)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 4.40991)
+ (CHARHT R 5.0199)
+ (CHARDP R 2.29993)
+ (CHARIC R -0.90991)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.7799)
+ (CHARDP R -0.21997)
+ (CHARIC R -1.08997)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 5.69995)
+ (CHARHT R 4.75)
+ (CHARDP R -0.25)
+ (CHARIC R -1.08997)
+ )
+(CHARACTER D 178 (COMMENT twosuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.71997)
+ (CHARIC R -1.2699)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 7.62988)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.00989)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 6.17993)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.1499)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.41992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.92993)
+ )
+(CHARACTER D 15 (COMMENT zcaron)
+ (CHARWD R 4.67993)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.12)
+ (CHARIC R -1.5199)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 3.16992)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -0.75)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R -2.00989)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.0)
+ (CHARIC R -0.92993)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 5.90991)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -0.50989)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.0299)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 6.23999)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R -1.94995)
+ )
+(CHARACTER D 14 (COMMENT Zcaron)
+ (CHARWD R 6.21997)
+ (CHARHT R 8.87988)
+ (CHARDP R 0.0)
+ (CHARIC R -1.22998)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.6399)
+ )
+(CHARACTER D 179 (COMMENT threesuperior)
+ (CHARWD R 3.69995)
+ (CHARHT R 6.79993)
+ (CHARDP R -2.6499)
+ (CHARIC R -1.37)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 5.37)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 8.8999)
+ (CHARHT R 6.97998)
+ (CHARDP R 0.23999)
+ (CHARIC R -1.59998)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 7.69995)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.54993)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 5.69995)
+ (CHARHT R 5.55994)
+ (CHARDP R 0.0)
+ (CHARIC R -1.2699)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 6.17993)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 4.5299)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.18994)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 5.60999)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.55994)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 3.16992)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.65991)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.0)
+ (CHARIC R -0.78992)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 5.60999)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -0.42993)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 8.35999)
+ (CHARHT R 7.06995)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.62)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 3.44995)
+ (CHARHT R 8.8999)
+ (CHARDP R 0.0)
+ (CHARIC R -1.20996)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 6.60999)
+ (CHARHT R 7.06995)
+ (CHARDP R 2.29993)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 3.8899)
+ (CHARHT R 7.30994)
+ (CHARDP R 0.12)
+ (CHARIC R -1.0)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.22998)
+ (CHARDP R 0.12)
+ (CHARIC R -1.47998)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 7.5299)
+ (CHARHT R 8.75989)
+ (CHARDP R 0.1499)
+ (CHARIC R -2.0)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 6.03992)
+ (CHARHT R 6.91992)
+ (CHARDP R 0.0)
+ (CHARIC R -1.46997)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 5.60999)
+ (CHARHT R 6.81995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.53992)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 7.93994)
+ (CHARHT R 8.47998)
+ (CHARDP R 0.1499)
+ (CHARIC R -1.08997)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 4.5299)
+ (CHARHT R 7.19995)
+ (CHARDP R 0.12)
+ (CHARIC R -1.42993)
+ )
+
+(COMMENT END OF FILE putru8r.pl)
diff --git a/fonts/utilities/vfinst/example/putvftf.bat b/fonts/utilities/vfinst/example/putvftf.bat
new file mode 100644
index 0000000000..8c47e2e69c
--- /dev/null
+++ b/fonts/utilities/vfinst/example/putvftf.bat
@@ -0,0 +1,47 @@
+## This file moves files. Delete it after use.
+## Created by VFinst1.00 + Perl5.00307 on 11 Aug 98 at 11:03:8.
+mv putr8a.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putr8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putro8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putri8a.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putri8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putru8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putb8a.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putb8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbo8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbi8a.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbi8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbu8r.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putr7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putr7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putro7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putro7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putrc7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putrc7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putrn7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putrn7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putri7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putri7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putru7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putru7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putric7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putric7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putrni7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putrni7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putb7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putb7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbo7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbo7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbc7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbc7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbn7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbn7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbi7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbi7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbu7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbu7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbic7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbic7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv putbni7t.vf e:/texmf/fonts/vf/adobe/utopia
+mv putbni7t.tfm e:/texmf/fonts/tfm/adobe/utopia
+mv *.fd e:/texmf/tex/latex/vfinst
diff --git a/fonts/utilities/vfinst/example/testltx.tex b/fonts/utilities/vfinst/example/testltx.tex
new file mode 100644
index 0000000000..adf6a5df47
--- /dev/null
+++ b/fonts/utilities/vfinst/example/testltx.tex
@@ -0,0 +1,51 @@
+%&latex
+
+\documentclass{article}
+
+\newcommand{\tryit}{A fine flight Officiously Ruffles My Puff!
+ 12345 ,.;: \c{C}e Ph{\oe}nix Va \`a M\"unchen?\endgraf}
+
+\begin{document}
+\begin{center}
+ A \LaTeX{} Test File\\
+ Prepared by vfinst1.00 at 11:03:8, on Tues, 11 Aug 98.
+\end{center}
+The text in the left margin separated by slashes yields the NFSS
+combination of encoding, family, series, and shape that
+generated that test line.
+\vspace{1pc}
+
+\noindent\llap{\tt OT1/put/m/n\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{n}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/sl\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{sl}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/sc\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{sc}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/un\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{un}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/it\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{it}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/ui\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{ui}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/si\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{si}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/m/ni\ }{\fontfamily{put}\fontseries{m}%
+ \fontshape{ni}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/n\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{n}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/sl\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{sl}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/sc\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{sc}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/un\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{un}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/it\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{it}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/ui\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{ui}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/si\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{si}\selectfont \tryit}
+\noindent\llap{\tt OT1/put/b/ni\ }{\fontfamily{put}\fontseries{b}%
+ \fontshape{ni}\selectfont \tryit}
+
+\end{document}
diff --git a/fonts/utilities/vfinst/example/testpln.tex b/fonts/utilities/vfinst/example/testpln.tex
new file mode 100644
index 0000000000..cdeee09e2c
--- /dev/null
+++ b/fonts/utilities/vfinst/example/testpln.tex
@@ -0,0 +1,68 @@
+%&plain
+\nopagenumbers \newdimen\fontsize
+% Change \fontsize, \baselineskip for different type sizes.
+\fontsize = 12pt \baselineskip = 14pt
+
+\def\tryit{A fine flight Officiously Ruffles My Puff! 12345 ,.;:
+ \c{C}e Ph{\oe}nix Va \`a M\"unchen?\endgraf}
+\font\1=cmr6 \newcount\cno
+\def\dd{\setbox0 = \hbox{\t\char\cno}\ifdim\wd0>0pt
+ \ifdim\ht0>0pt \box0\lower3pt\hbox{\1\the\cno}\fi\fi
+ \global\advance\cno by1\relax}
+\def\showfont{\centerline{\vbox{\halign{&\dd##\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+&&&&&&&&&&&&&&&\cr
+}}}\medskip}
+ \centerline{A {\tt plain} \TeX{} Test File}
+ \centerline{Prepared by vfinst1.00 at 11:03:8, on Tues, 11 Aug 98.}
+\medskip
+
+ \font\t=putr7t at \fontsize
+ \showfont
+\noindent\llap{\tt putr7t:\ }{\t \tryit}
+ \font\t=putro7t at \fontsize
+\noindent\llap{\tt putro7t:\ }{\t \tryit}
+ \font\t=putrc7t at \fontsize
+\noindent\llap{\tt putrc7t:\ }{\t \tryit}
+ \font\t=putrn7t at \fontsize
+\noindent\llap{\tt putrn7t:\ }{\t \tryit}
+ \font\t=putri7t at \fontsize
+\noindent\llap{\tt putri7t:\ }{\t \tryit}
+ \font\t=putru7t at \fontsize
+\noindent\llap{\tt putru7t:\ }{\t \tryit}
+ \font\t=putric7t at \fontsize
+\noindent\llap{\tt putric7t:\ }{\t \tryit}
+ \font\t=putrni7t at \fontsize
+\noindent\llap{\tt putrni7t:\ }{\t \tryit}
+ \font\t=putb7t at \fontsize
+\noindent\llap{\tt putb7t:\ }{\t \tryit}
+ \font\t=putbo7t at \fontsize
+\noindent\llap{\tt putbo7t:\ }{\t \tryit}
+ \font\t=putbc7t at \fontsize
+\noindent\llap{\tt putbc7t:\ }{\t \tryit}
+ \font\t=putbn7t at \fontsize
+\noindent\llap{\tt putbn7t:\ }{\t \tryit}
+ \font\t=putbi7t at \fontsize
+\noindent\llap{\tt putbi7t:\ }{\t \tryit}
+ \font\t=putbu7t at \fontsize
+\noindent\llap{\tt putbu7t:\ }{\t \tryit}
+ \font\t=putbic7t at \fontsize
+\noindent\llap{\tt putbic7t:\ }{\t \tryit}
+ \font\t=putbni7t at \fontsize
+\noindent\llap{\tt putbni7t:\ }{\t \tryit}
+
+\bye
diff --git a/fonts/utilities/vfinst/example/vfinst.vlg b/fonts/utilities/vfinst/example/vfinst.vlg
new file mode 100644
index 0000000000..f9abe042f6
--- /dev/null
+++ b/fonts/utilities/vfinst/example/vfinst.vlg
@@ -0,0 +1,101 @@
+This is VFinst1.00 + Perl5.00307 on Tuesday, 11 Aug 98, at 11:01:26.
+
+The files
+ 1vfinst
+ 2vfinst
+ vfinst.lib
+ vfinst.par
+ vfinst.rc
+ famnames
+ map.a2d
+ map.n2a
+ map.sup
+ dotlessj.mtx
+ uline.mtx
+are properly located.
+Fonts appear to be all in order!
+
+Here are the font corrections in vfinst.rc:
+ CentaurSwashMT FullName Centaur Swash Italic MT
+ Courier Weight Roman
+ Courier-Oblique Weight Roman
+ Helvetica Weight Roman
+ JansonExpertMT-BoldItalic ItalicAngle -14
+ NewCenturySchlbk-Italic Weight Roman
+ Palatino-Italic Weight Roman
+ AGaramond-Bold Weight Bold
+ AGaramond-Semibold Weight Semibold
+ AGaramond-BoldItalic Weight Bold
+ AGaramond-SemiboldItalic Weight Semibold
+ AGaramondExp-Bold Weight Bold
+ AGaramondExp-Semibold Weight Semibold
+ AGarExpSemIta Weight Semibold
+ AGarExpSemIta FullName Adobe Garamond Expert Semibold Italic
+ AGaramondExp-BoldItalic Weight Bold
+ AGaramond-BoldItalic ItalicAngle -18.5
+ AGaramondExp-BoldItalic ItalicAngle -18.5
+ AGarExpSemIta ItalicAngle -18.5
+ AGaramond-SemiboldItalic ItalicAngle -18.5
+ AGaramond-Italic ItalicAngle -18.5
+ AGaramondExp-Italic ItalicAngle -18.5
+ AGaramondAlt-Italic ItalicAngle -18.5
+ NewsGothic-Oblique Weight Medium
+ Garamond-BookItalic Weight Book
+ NewsGothic-BoldOblique Weight bold
+
+
+Here are the fonts and their proposed new (Berry) names:
+
+## Sort New Slant File Long Digital Foundry
+## Key Name Name Name ...
+## ========================================================================
+put300 putr8a 000 putr8a.{pfb,afm} Utopia-Regular
+put310 putri8a 230 putri8a.{pfb,afm} Utopia-Italic
+put900 putb8a 000 putb8a.{pfb,afm} Utopia-Bold
+put910 putbi8a 230 putbi8a.{pfb,afm} Utopia-BoldItalic
+
+
+Here are the fontfamilies, typeface names, and suppliers
+for this installation:
+
+put utopia adobe
+No duplicate fonts found.
+Here is a list of missing directories.
+
+e:/texmf/fonts/afm/adobe/utopia
+e:/texmf/fonts/type1/adobe/utopia
+e:/texmf/fonts/tfm/adobe/utopia
+e:/texmf/fonts/vf/adobe/utopia
+
+Here is a suggested script to create the needed directories:
+
+mkdir e:/texmf/fonts/afm/adobe/utopia
+mkdir e:/texmf/fonts/type1/adobe/utopia
+mkdir e:/texmf/fonts/tfm/adobe/utopia
+mkdir e:/texmf/fonts/vf/adobe/utopia
+Here is a list of missing directories.
+
+e:/texmf/fonts/afm/adobe/utopia
+e:/texmf/fonts/type1/adobe/utopia
+e:/texmf/fonts/tfm/adobe/utopia
+e:/texmf/fonts/vf/adobe/utopia
+
+Here is a suggested script to create the needed directories:
+
+mkdir e:/texmf/fonts/afm/adobe/utopia
+mkdir e:/texmf/fonts/type1/adobe/utopia
+mkdir e:/texmf/fonts/tfm/adobe/utopia
+mkdir e:/texmf/fonts/vf/adobe/utopia
+Here is a list of missing directories.
+
+e:/texmf/fonts/afm/adobe/utopia
+e:/texmf/fonts/type1/adobe/utopia
+e:/texmf/fonts/tfm/adobe/utopia
+e:/texmf/fonts/vf/adobe/utopia
+
+Here is a suggested script to create the needed directories:
+
+mkdir e:/texmf/fonts/afm/adobe/utopia
+mkdir e:/texmf/fonts/type1/adobe/utopia
+mkdir e:/texmf/fonts/tfm/adobe/utopia
+mkdir e:/texmf/fonts/vf/adobe/utopia
diff --git a/fonts/utilities/vfinst/famnames b/fonts/utilities/vfinst/famnames
new file mode 100644
index 0000000000..f7b37011f2
--- /dev/null
+++ b/fonts/utilities/vfinst/famnames
@@ -0,0 +1,1053 @@
+LatinExtraCondensedBTRegular
+ReductoCondensedSSiCondensed
+Gothic821CondensedBTRegular
+AlternateGothicNo2BTRegular
+VictoriaTitlingMTCondensed
+FrankGothMTExtraCondensed
+CommercialScriptBTRegular
+MonotypeOldStyleMTBoldOut
+FormalScript421BTRegular
+UniversalGreekwithMathPi
+SaxNViolinsLightSSiLight
+CenturySchoolbookReprise
+KeystrokesShadowExtrasMT
+GoudyCatalogueBTRegular
+OldDreadfulNo7BTRegular
+HuxleyVerticalBTRegular
+UniversalNewswithCommPi
+WilhelmKlingsporGotisch
+PiranesiItalicBTRegular
+SchadowBTBlackCondensed
+Calligraphic421BTRomanB
+Transitional551BTMedium
+WoodcutOrnamentsOneSSi
+MTimesNewRomanCyrillic
+WoodcutOrnamentsTwoSSi
+OptimumRomanItalic-DTC
+FlemishScriptBTRegular
+CloisterBlackBTRegular
+Decorated035BTRegular
+ArabesqueOrnamentsOne
+Freehand591BTRegularA
+Freehand575BTRegularB
+ZapfCalligraphic801BT
+AmericanTextBTRegular
+HelveticaInseratRoman
+GaramondRetrospective
+AuroraBTBoldCondensed
+Staccato555BTRegularA
+Freehand521BTRegularC
+FlorentineGaramondSSi
+LetterGothic12PitchBT
+MarkerBoardDisplaySSi
+GorillaITCbyBTRegular
+GoudyRetrospectiveSSi
+PioneerITCbyBTRegular
+HandelGothicBTRegular
+MercuriusMTBoldScript
+CenturySchoolbookSSi
+MonitorSSiBoldItalic
+SymbolProportionalBT
+OCRB10PitchBTRegular
+MCenturySchoolbookPS
+WeddingTextBTRegular
+CenturyRetrospective
+Freeform710BTRegular
+BrushScriptBTRegular
+Staccato222BTRegular
+WantedPosterSSiBlack
+SquareSlabserif711BT
+Freehand471BTRegular
+SouthwestOrnamentsMT
+WitternbergerFraktMT
+QueBlackSSiExtraBold
+ThunderbirdBTRegular
+URWChanceryLMediItal
+FuturaBlackBTRegular
+TypoUprightBTRegular
+ClassicalGaramondBT
+English157BTRegular
+DavidaBoldBTRegular
+TempoHeavyCondensed
+OzHandicraftBTRoman
+EngraversLHBoldFace
+CaslonTwoTwentyFour
+MTimesNewRomanGreek
+VAGRoundedBTRegular
+StuyvesantBTRegular
+BaskervilleCyrillic
+CopperplateGothicBT
+ZapfElliptical711BT
+CenturySchoolbookBT
+ParkAvenueBTRegular
+MAvantGardeGothicPS
+MisterEarlBTRegular
+OvalFrameNegativeMT
+AmericanTypewriter
+MonasteryScriptSSi
+MCenturySchoolbook
+RococoOrnamentsTwo
+GeometricSlab712BT
+Swiss921BTRegularA
+OriginalGaramondBT
+BernardMTCondensed
+CommercialScriptMT
+EgyptianMTExtended
+GeometricSlab703BT
+KeystrokesShadowMT
+KeystrokesExtrasMT
+RococoOrnamentsOne
+DorchesterScriptMT
+Swiss924BTRegularB
+SpartanThreeFourMT
+WitternbergerFrakt
+BakerSignetBTRoman
+PlacardMTCondensed
+AlternateGothicNo2
+AmercianGaramondBT
+AmericanGaramondBT
+PetticoatScriptSSi
+Brush738BTRegularA
+ElegantGaramondBT
+ContextInseratSSi
+CenturyOldstyleBT
+Transitional521BT
+UniversityRomanBT
+TorrentGraphicSSi
+PlaybillBTRegular
+ClearfaceGothicLH
+CenturyExpandedBT
+Calligraphic421BT
+WoodtypeOrnaments
+HelveticaRoundedB
+StempelSchneidler
+DINNeuzeitGrotesk
+ZapfHumanist601BT
+ParisianBTRegular
+ItalianOldStyleMT
+FacadeMTCondensed
+FormalScript421BT
+PTBarnumBTRegular
+OrbitBbyBTRegular
+Transitional551BT
+FestivalTitlingMT
+SpartanOneThreeMT
+Calligraphic810BT
+Modern735BTRomanA
+CenturySchoolbook
+SimonciniGaramond
+Brush445BTRegular
+UniversalMath1BT
+QuantaPiThreeSSi
+SonoranSansSerif
+DINMittelschrift
+SnippetScriptSSi
+TimesSmallTextMT
+GothicBBBMedium-
+UnicornScriptSSi
+CenturySchbookMT
+KeyboardEliteSSi
+CircleFrameNegMT
+AllegroBTRegular
+SpartanTwoFourMT
+HelveticaRounded
+NuptialBTRegular
+SquareFrameNegMT
+LatinMTCondensed
+HelveticaInserat
+FormatPiThreeSSi
+UpscaleScriptSSi
+MonitorSSiNormal
+RunicMTCondensed
+EmbassyBTRegular
+MonitorSSiItalic
+AirfoilScriptSSi
+JournalScriptSSi
+OldEnglishTextMT
+CoronetScriptSSi
+LibertyBTRegular
+MonolineScriptMT
+FrakturBTRegular
+DorchesterScript
+NewCenturySchlbk
+MurrayHillBTBold
+ImpressBTRegular
+TwentiethCentury
+EgyptianExtended
+MonotypeOldStyle
+StencilBTRegular
+AmazoneBTRegular
+CommercialScript
+UniversityRoman
+PaltonLight-DTC
+EmpireBTRegular
+TimesNewRomanMT
+SophisticateSSi
+KuenstlerScript
+GoudyCatalogueM
+Flareserif821BT
+DiamondNegative
+VinetaBTRegular
+QuantaPiFourSSi
+CenturyOldStyle
+QuantaPiFiveSSi
+ItalianGaramond
+AkzidenzGrotesk
+MilestonesOneMT
+AmeliaBTRegular
+CaslonFiveForty
+BodoniCampanile
+GaramondReprise
+GoudyOldStyleBT
+IowanOldStyleBT
+MercuriusScript
+BookmanOldStyle
+ImpulsBTRegular
+MilestonesTwoMT
+SpiffyScriptSSi
+DiamondPositive
+TimesNRExpertMT
+FreestyleScript
+MZapfDingbatsPS
+PoeticaChancery
+CaslonTitlingMT
+SpartanOneTwoMT
+CourierTwelveMT
+StempelGaramond
+MZapfChanceryPS
+TimesNewRomanPS
+OCRAbyBTRegular
+ItalianOldStyle
+Industrial736BT
+TimesNewRomanSF
+CaslonOpenFace
+QuantaPiTwoSSi
+BravoScriptSSi
+GoudyOldStyleM
+ProseScriptSSi
+FrenchScriptMT
+ZapfChanceryPS
+MotifScriptSSi
+Geometric706BT
+HuxleyVertical
+FormatPiTwoSSi
+NeuzeitGrotesk
+DeutchGaramond
+AbacusThreeSSi
+GandoBTRegular
+BinnyOldStyleM
+GoudyCatalogue
+InformaticsSSi
+GothicThirteen
+CentSchlbookPS
+CompactaMTBold
+FormatPiOneSSi
+MonolineScript
+RevueBTRegular
+ZapfDingbatsPS
+NewBaskerville
+Decorated035BT
+BaubleSSiBlack
+TimesNRSevenMT
+CenturyReprise
+UmbraBTRegular
+LetterGothicMT
+FranklinGothic
+BernhardModern
+MonkeyBusiness
+ExpressDecoSSi
+Geometric231BT
+Geometric415BT
+ArnoldBoecklin
+SnellRoundhand
+AshleyScriptMT
+SassoonPrimary
+LuciaBTRegular
+ContextRounded
+QuantaPiSixSSi
+BenguiatGothic
+CommercialPiBT
+ContextReprise
+AdLibBTRegular
+PosterBodoniBT
+OldDreadfulNo7
+LibraBTRegular
+MathematicalPi
+Kuenstler480BT
+ArialRoundedMT
+HorleyOldStyle
+NewClarendonMT
+SaxNViolinsSSi
+Monospace821BT
+GrecoEuropaSSi
+QuantaPiOneSSi
+HeadlineMTBold
+TrumpMediaeval
+MonitorSSiBold
+FelixTitlingMT
+TangoBTRegular
+DINEngschrift
+OldStyleSeven
+ShotgunBlanks
+BaskervilleMT
+Humanist777BT
+RussellSquare
+PopplPontifex
+Freehand521BT
+SpartanFourMT
+AutomatonCaps
+Informal011BT
+AbacusFourSSi
+Egyptian505BT
+CaslonThreeSS
+Staccato222BT
+BlippoBTBlack
+NewsPlantinMT
+LDecorationPi
+TradeGothicLH
+GaramondThree
+CooperSSiBlac
+NewspaperPiBT
+Freehand575BT
+InFractionSSi
+HoboBTRegular
+PersuasionSSi
+TumbleweedSSi
+PrestigeElite
+Humanist970BT
+MemoScriptSSi
+CenturyGothic
+CoronetMTBold
+Freeform721BT
+Staccato555BT
+DiamondBodoni
+Lapidary333BT
+ExtensSSiBold
+HelveticaNeue
+IowanOldStyle
+GoudyOldStyle
+GrecoRecutSSi
+BaskervilleBE
+CircleFrameMT
+DomDiagonalBT
+PopplLaudatio
+Venetian301BT
+FlemishScript
+Freehand471BT
+NanoScriptSSi
+CascadeScript
+AppleChancery
+Freehand591BT
+BinnyOldStyle
+NimbusRomNo9L
+OnyxBTRegular
+PalaceScriptM
+ClerestorySSi
+Humanist521BT
+SquareFrameMT
+DellaRobbiaBT
+NewBerolinaMT
+BinghamScript
+MonotypeSorts
+TimesNewRoman
+BrushScriptMT
+Mittelschrift
+NuptialScript
+BankGothicBT
+QueSSiItalic
+AntiqueOlive
+InterfaceSSi
+SlotSSiBlack
+IntuitionSSi
+StandardSymL
+MicrofineSSi
+RyuminLight-
+OleScriptSSi
+OldStyleSeve
+CopperplateT
+ZapfChancery
+PalaceScript
+Cartographer
+NeographikMT
+ShortHaulSSi
+LucidaBright
+CheltenhamBT
+LubalinGraph
+NewCaledonia
+FetteFraktur
+MBraggadocio
+URWChanceryL
+NewClarendon
+NewsGothicMT
+URWPalladioL
+Incised901BT
+TechPhonetic
+DirectionsMT
+BundesbahnPi
+LetterGothic
+ScriptMTBold
+Installation
+FelixTitling
+ZapfDingbats
+GillAltOneMT
+BskvillExpMT
+GarthGraphic
+ScotchRomanM
+CaslonFiveSS
+LAstrologyPi
+AbacusTwoSSi
+NeuzeitSBook
+KeystrokesMT
+FrizQuadrata
+AmericanText
+ShoestringSS
+InflexMTBold
+SonoranSerif
+MediciScript
+OzHandicraft
+HandelGothic
+AbacusOneSSi
+AshleyScript
+Revival565BT
+Gothic725BTB
+RussellSquar
+Freeform721
+SwingMTBold
+FairfieldLH
+BlueprintMT
+StrayhornMT
+OceanSansMT
+Charlemagne
+QuillScript
+HoeflerText
+BookAntiqua
+OlympicLHPi
+DinosaursMT
+NewBerolina
+Gothic725BT
+ConcertoSSi
+NewsPlantin
+ClarendonBT
+Caslon540BT
+TimesEuropa
+Braggadocio
+Freeform710
+Square721BT
+CenturyOSMT
+ParallaxSSi
+ScotchRoman
+TangoScript
+Countryside
+BotanicalMT
+Copperplate
+URWBookmanL
+CenturySchL
+DomDiagonal
+ProtocolSSi
+ResourceSSi
+SportsThree
+SterlingSSi
+MGoudyModer
+Swiss721BTB
+EgyptienneF
+ClarendonMT
+BlocSSiBold
+TradeGothic
+Ribbon131BT
+BrushScript
+TransportMT
+Aldine721BT
+SerifGothic
+GoudyModern
+OvalFrameMT
+CompleatSSi
+FootlightMT
+MGloucester
+NimbusRoman
+PerrywoodMT
+EllingtonMT
+ChorusLineS
+SentinalSSi
+ReporterTwo
+CaslonThree
+AmericanaBT
+PostAntiqua
+GoudyTextMT
+TypoUpright
+Thunderbird
+BakerSignet
+Exotic350BT
+BauerBodoni
+DomCasualBT
+Aldine401BT
+Baskerville
+DellaRobbia
+Grammateus
+QuintetSSi
+MacedonSSi
+URWAntiqua
+BankGothic
+BenguiatBo
+CompactaBT
+MCastellar
+Gloucester
+ReductoSSi
+QueSSiBold
+JansonText
+SenatusSSi
+AvantGarde
+Swiss721BT
+LHolidayPi
+EuropeanPi
+Engschrift
+MurrayHill
+Versailles
+VAGRounded
+MBookmanPS
+MGoudyText
+IngenioSSi
+Dutch801BT
+NimbusSanL
+Serpentine
+Scriptoria
+KaufmannBT
+PlaytimeMT
+Palmspring
+FrontierMT
+URWGothicL
+LucidaSans
+NormandeBT
+AachenBold
+NimbusSans
+HorleyOSMT
+DucDeBerry
+Petrucchio
+Swiss921BT
+ArtDecoSSi
+DavidaBold
+NimbusMonL
+MCourierPS
+Neographik
+PioneerITC
+MisterEarl
+MatiqueSSi
+GorillaITC
+VacationMT
+OldStyleMT
+UbiqGothic
+ISILGothic
+URWGrotesk
+Palindrome
+English157
+Brush445BT
+University
+Poliphilus
+Compendium
+OldEnglish
+Cheltenham
+Herculanum
+SportsFour
+Stuyvesant
+TourinaSSi
+Modern20BT
+RecitalSSi
+Centennial
+Cottonwood
+Swiss924BT
+RotisSemiS
+CantoriaMT
+AquaLifeMT
+Typewriter
+NumbusMonL
+NewsGothic
+Brush738BT
+ClassicSSi
+NumbusSanL
+LibreSemiS
+CooperBlac
+ParkAvenue
+Swiss911BT
+GloucesMT
+ClarionMT
+Hanseatic
+News701BT
+Blackford
+Castellar
+Clarendon
+CenturyMT
+SportsTwo
+CalistoMT
+Barrister
+CortexSSi
+Excelsior
+BalloonBT
+Clairvaux
+BremenBTB
+MSymbolPS
+HubbubSSi
+Perrywood
+Eurostile
+Partition
+Zeitgeist
+Universal
+WindsorMT
+ThesisSSi
+Recognita
+VectoraLH
+TimesNRMT
+ItcSymbol
+Strayhorn
+MAlbertus
+Helvetica
+Grotesque
+Axiomatic
+DomBoldBT
+Americana
+Boulevard
+Gothic821
+HeliosSSi
+WindsorBT
+ColonnaMT
+Impressum
+DoricBold
+ManualSSi
+OctavianM
+ToucheSSi
+Usherwood
+MOldStyle
+OlympicLH
+AGaramond
+Wingdings
+LucidaFax
+Fairfield
+Ellington
+Industria
+Conquista
+Jefferson
+Clearface
+Colmcille
+LockupSSi
+CarminaBT
+MiraraeBT
+Footlight
+GoudyText
+DomCasual
+ScribeSSi
+SeagullBT
+AmerigoBT
+Blueprint
+SpartaSSi
+AlmanacMT
+MusterSSi
+SpectrumM
+RotisSemi
+OceanSans
+CharterBT
+Hiroshige
+CaslonTwo
+PhotinaMT
+Weidemann
+RaleighBT
+CalvertMT
+Modern735
+Monologue
+MZAntiqua
+Engravers
+GothicBBB
+Monospace
+SportsOne
+GiovanniB
+BonApetit
+WarningLH
+Ponderosa
+ImpactMT
+Headline
+CooperBT
+Performa
+BoffoSSi
+GrecoTen
+BangaSSi
+BodoniMT
+Caecilia
+Parisian
+BulmerMT
+Assembly
+ZurichBT
+Ensemble
+Bernhard
+ModernMT
+RomanaBT
+NewAster
+Cantoria
+Broadway
+LucianBT
+Normande
+ChessSSi
+Berkeley
+Keyboard
+Playbill
+OratorBT
+Marigold
+PepitaMT
+Spectrum
+Holidays
+AlamoSSi
+Coherent
+Olympian
+ThinxSSi
+AachenBT
+Columbus
+Garamond
+Mesouran
+Kuriakos
+NeuzeitS
+Blackoak
+ZAntiqua
+Reporter
+VanDijck
+Egyptian
+Albertus
+ItcKabel
+WeddingT
+Benguiat
+Kaufmann
+Octavian
+Cloister
+Piranesi
+Falstaff
+Terminus
+Ehrhardt
+Giovanni
+OrandaBT
+Insignia
+Acanthus
+FigaroMT
+MSpartan
+SerlioLH
+Festival
+NatureMT
+Veljovic
+BodoniBT
+GillSans
+Ironwood
+Compacta
+Glossary
+Souvenir
+Dingbats
+Mesquite
+Victoria
+Fournier
+Frutiger
+Minister
+ShotgunB
+Melodies
+PtBarnum
+MacroSSi
+BorderPi
+JoannaMT
+Novarese
+Carolina
+OldStyle
+Atlantix
+Perpetua
+DelimaMT
+Mirareae
+Slimbach
+Meridien
+Criteria
+Rockwell
+NimrodMT
+Concorde
+Palatino
+Galliard
+AmasisMT
+Commerce
+SanMarco
+Trendex
+PlugSSi
+Spartan
+SnellBT
+ItcEras
+Carmina
+Centaur
+Shotgun
+OCR1SSi
+Leawood
+AbadiMT
+Century
+Vectora
+Coronet
+Present
+Machine
+Balloon
+Parties
+Amazone
+Insight
+Spitbol
+Maximus
+Neuland
+Formata
+Windsor
+Context
+Bauhaus
+Seagull
+Electra
+Giddyup
+SignsMT
+ACaslon
+Korinna
+OCR2SSi
+Trident
+WaifSSi
+Granjon
+Tiffany
+Austere
+Cushing
+TimesNR
+Express
+Malvern
+Lutetia
+LGamePi
+Schadow
+Candida
+Memphis
+Sassoon
+Introit
+Advisor
+Plantin
+Shannon
+Embassy
+IonicMT
+Antiqua
+Impress
+Eckmann
+Calvert
+Madrone
+Diotima
+Cantina
+Bernard
+KlangMT
+Calisto
+EECLHPi
+BiffoMT
+ForteMT
+ApolloM
+Placard
+Walbaum
+Arcadia
+Charter
+Stencil
+Bookman
+Nuptial
+Mistral
+Allegro
+Mermaid
+Raleigh
+Profile
+Peignot
+Imprint
+TwCenMT
+BBodoni
+MICRSSi
+Univers
+Photina
+Juniper
+Fraktur
+Colonna
+Mandate
+Palette
+Cascade
+Berling
+AudioLH
+Liberty
+ArrusBT
+Dolores
+Clarion
+Optimum
+MaturaM
+Centric
+Courier
+Shelley
+BelweBT
+Chicago
+Amerigo
+Caxton
+Kernel
+French
+Orchid
+Charme
+Profil
+Esprit
+Ryumin
+Tiasco
+Joanna
+Poplar
+SabonM
+Activa
+Inflex
+Bodoni
+Amelia
+OrbitB
+Willow
+Sonata
+Delima
+Torino
+Auriol
+Bulmer
+Nimbus
+Minion
+RotisS
+Fenice
+Cleric
+Avenir
+Facile
+Medici
+Serifa
+Deutch
+Geneva
+Script
+Tekton
+Quorum
+Melior
+Vineta
+Matura
+Trajan
+Janson
+Decade
+Lithos
+Syntax
+Ibycus
+Nimrod
+Facade
+Utopia
+QueSSi
+Optima
+Palton
+Futura
+TimesN
+Pepita
+Speedo
+Binner
+Oranda
+Empire
+KinoMT
+Symbol
+Blippo
+Aurora
+Lucida
+Ondine
+Monaco
+Aachen
+Cochin
+LibreS
+Metron
+Minima
+Italia
+Lydian
+Modern
+Orator
+GoudyH
+Glypha
+Cooper
+Dyname
+Adsans
+Nofret
+Bremen
+Corona
+Tycoon
+Apollo
+Guardi
+Layout
+Caslon
+Stymie
+Newton
+Impact
+Romana
+Impuls
+Lucian
+Astute
+Figaro
+Amasis
+Carta
+Slate
+Boost
+Orato
+Codex
+Belwe
+Omnia
+Dante
+Kudos
+Birch
+Gando
+Runic
+Metro
+Forte
+Palma
+Brush
+Folio
+OCR-B
+Bison
+Snell
+Kabel
+MOnyx
+Arial
+Tango
+Block
+Ionic
+Aldus
+Stone
+Biffo
+Imago
+Flyer
+Blado
+Stack
+Weiss
+Euler
+Libra
+Boton
+Greco
+Abadi
+OCR-A
+Flora
+Times
+Doric
+Tempo
+Banco
+Lucia
+Rotis
+Wilke
+Umbra
+Swing
+Bembo
+Latin
+Sabon
+AdLib
+Arrus
+Revue
+Klang
+Goudy
+Creme
+Omega
+Tramp
+Gill
+Sans
+Cheq
+Kino
+OCRB
+Expo
+OCRA
+Life
+Jaak
+MICR
+Lino
+Hobo
+Skia
+Anna
+Choc
+Onyx
+Zeal
+Bell
+City
+Eras
+Dom
+Pi
diff --git a/fonts/utilities/vfinst/latinx.mtx b/fonts/utilities/vfinst/latinx.mtx
new file mode 100644
index 0000000000..040522df39
--- /dev/null
+++ b/fonts/utilities/vfinst/latinx.mtx
@@ -0,0 +1,1677 @@
+\relax
+
+%% This file is identical to the file latin.mtx, part of Alan Jeffrey's
+%% fontinst package (see above). It differs from that file in the
+%% presence of these comments and a few lines (directly following the
+%% `\metrics' statement) which reset the x-height. Too many expert
+%% fonts (and others) have improperly set this quantity to zero,
+%% thereby mucking up TeX's accent-making primitives.
+%%
+%% Alan Hoenig (ajhjj@cunyvm.cuny.edu), 19 June 1998
+
+\documentstyle[fontinst]{ltugboat}
+
+\title{The {\tt fontinst} latin glyphs}
+\author{Alan Jeffrey}
+\address{School of Cognitive and Computing Sciences \\
+ University of Sussex \\
+ Falmer \\
+ Brighton \\
+ BN1 9QH \\
+ UK}
+\netaddress{alanje@cogs.susx.ac.uk}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+This document describes the glyphs used by the {\tt fontinst}
+package when generating Latin fonts.
+
+\raggedright
+
+\metrics
+
+% Uses the fontinst package.
+
+\needsfontinstversion{1.317}
+
+%% START of modifications to latin.mtx...
+
+\ifisglyph{x}\then % for regular fonts
+ \resetint{xheight}{\height{x}}
+\fi
+\ifisglyph{Xsmall}\then % for small caps or expert fonts
+ \resetint{xheight}{\height{Xsmall}}
+\fi
+
+%% END of modifications to latin.mtx...
+
+% A top accent is set by placing the center of the accent at the given
+% position along the width of the letter, raised up by the difference
+% between the height of the letter and the xheight.
+
+\setcommand\topaccent#1#2#3{
+ \push
+ \moveup{\max{0}{\sub{\height{#1}}{\int{xheight}}}}
+ \movert{\add{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ {\scale{\sub{\height{#1}}{\int{xheight}}}{\int{italicslant}}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A bottom accent is set by placing the center of the accent at the given
+% position along the width of the letter.
+
+\setcommand\botaccent#1#2#3{
+ \push
+ \movert{\sub{\scale{\width{#1}}{#3}}{\scale{\width{#2}}{500}}}
+ \glyph{#2}{1000}
+ \pop
+ \glyph{#1}{1000}
+}
+
+% A c&sc glyph is created by shrinking the cap glyph, and adding extra
+% space.
+
+\setcommand\cscglyph#1{
+ \movert{\int{smallcapsextraspace}}
+ \glyph{#1}{\int{smallcapsscale}}
+ \movert{\int{smallcapsextraspace}}
+}
+
+% A c&sc top accent glyph is placed using the small glyphs if
+% available, and otherwise by shrinking the equivalent capital.
+
+\setcommand\csctopaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \topaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% Ditto bot accents.
+
+\setcommand\cscbotaccent#1#2#3{
+ \ifisglyph{#1small}\then
+ \botaccent{#1small}{#2small}{#3}
+ \else
+ \cscglyph{#1#2}
+ \fi
+}
+
+% A small accent is created by moving a shrunk accent up by the
+% difference between a scaled x and a scaled X.
+
+\setcommand\cscaccent#1{
+ \moveup{\scale{\int{xheight}}{\sub{1000}{\int{smallcapsscale}}}}
+ \cscglyph{#1}
+ \moveup{\scale{\int{xheight}}{\sub{\int{smallcapsscale}}{1000}}}
+}
+
+% \setleftrightkerning is \setleftkerning and \setrightkerning.
+
+\setcommand\setleftrightkerning#1#2#3{
+ \setleftkerning{#1}{#2}{#3}
+ \setrightkerning{#1}{#2}{#3}
+}
+
+% \unfakable is a glyph which can't be faked.
+
+\setcommand\unfakable#1{
+ \setglyph{#1}
+ \ifisglyph{#1-not}\then
+ \moveup{\neg{\depth{#1-not}}}
+ \glyphrule{
+ \width{#1-not}
+ }{
+ \add{\depth{#1-not}}{\height{#1-not}}
+ }
+ \resetitalic{\italic{#1-not}}
+ \moveup{\depth{#1-not}}
+ \else
+ \glyphrule{500}{500}
+ \fi
+ \glyphwarning{missing glyph `#1'}
+ \endsetglyph
+}
+
+% Use this to warnof a missing glyph, but don't fake it with \glyphrule.
+
+\setcommand\nofakeout#1{
+ \glyphwarning{missing glyph `#1'}
+}
+
+
+\comment{\section{Default values}}
+
+\setint{italicslant}{0}
+\setint{xheight}{\height{x}}
+\setint{capheight}{\height{A}}
+\setint{ascender}{\height{d}}
+\setint{descender}{\depth{g}}
+\setint{underlinethickness}{40}
+\setint{visiblespacedepth}{200}
+\setint{visiblespacewidth}{400}
+\setint{visiblespacesurround}{50}
+\setint{smallcapsscale}{800}
+\setint{smallcapskerning}{900}
+
+\ifisint{monowidth}\then
+ \setint{capspacing}{0}
+ \setint{smallcapsextraspace}
+ {\div{\scale{\width{x}}{\sub{1000}{\int{smallcapsscale}}}}{2}}
+\else
+ \setint{capspacing}{50}
+ \setint{smallcapsextraspace}{0}
+\fi
+
+\ifisint{visiblespace}\then
+ \setint{boundarychar}{\int{visiblespace}}
+\fi
+
+\comment{\section{Kerning}}
+
+\setleftrightkerning{visiblespace}{space}{1000}
+
+\setleftrightkerning{Aacute}{A}{1000}
+\setleftrightkerning{Abreve}{A}{1000}
+\setleftrightkerning{Acircumflex}{A}{1000}
+\setleftrightkerning{Adieresis}{A}{1000}
+\setleftrightkerning{Agrave}{A}{1000}
+\setleftrightkerning{Aogonek}{A}{1000}
+\setleftrightkerning{Aring}{A}{1000}
+\setleftrightkerning{Atilde}{A}{1000}
+
+\setleftrightkerning{Cacute}{C}{1000}
+\setleftrightkerning{Ccaron}{C}{1000}
+\setleftrightkerning{Ccedilla}{C}{1000}
+
+\setleftrightkerning{Dcaron}{D}{1000}
+
+\setleftrightkerning{Eacute}{E}{1000}
+\setleftrightkerning{Ecaron}{E}{1000}
+\setleftrightkerning{Ecircumflex}{E}{1000}
+\setleftrightkerning{Edieresis}{E}{1000}
+\setleftrightkerning{Egrave}{E}{1000}
+\setleftrightkerning{Eogonek}{E}{1000}
+
+\setleftrightkerning{Gbreve}{G}{1000}
+
+\setleftkerning{IJ}{I}{1000}
+
+\setleftrightkerning{Iacute}{I}{1000}
+\setleftrightkerning{Icircumflex}{I}{1000}
+\setleftrightkerning{Idieresis}{I}{1000}
+\setleftrightkerning{Idotaccent}{I}{1000}
+\setleftrightkerning{Igrave}{I}{1000}
+
+\setrightkerning{IJ}{J}{1000}
+
+\setleftrightkerning{Lacute}{L}{1000}
+\setleftrightkerning{Lslash}{L}{1000}
+\setleftkerning{Lcaron}{L}{1000}
+
+\setleftrightkerning{Nacute}{N}{1000}
+\setleftrightkerning{Ncaron}{N}{1000}
+\setleftrightkerning{Ntilde}{N}{1000}
+
+\setleftrightkerning{Oacute}{O}{1000}
+\setleftrightkerning{Ocircumflex}{O}{1000}
+\setleftrightkerning{Odieresis}{O}{1000}
+\setleftrightkerning{Ograve}{O}{1000}
+\setleftrightkerning{Ohungarumlaut}{O}{1000}
+\setleftrightkerning{Oslash}{O}{1000}
+\setleftrightkerning{Otilde}{O}{1000}
+
+\setleftrightkerning{Rcaron}{R}{1000}
+\setleftrightkerning{Racute}{R}{1000}
+
+\setleftrightkerning{SS}{S}{1000}
+\setleftrightkerning{Sacute}{S}{1000}
+\setleftrightkerning{Scaron}{S}{1000}
+\setleftrightkerning{Scedilla}{S}{1000}
+
+\setleftrightkerning{Tcaron}{T}{1000}
+\setleftrightkerning{Tcedilla}{T}{1000}
+
+\setleftrightkerning{Uacute}{U}{1000}
+\setleftrightkerning{Ucircumflex}{U}{1000}
+\setleftrightkerning{Ugrave}{U}{1000}
+\setleftrightkerning{Uhungarumlaut}{U}{1000}
+\setleftrightkerning{Uring}{U}{1000}
+
+\setleftrightkerning{Yacute}{Y}{1000}
+\setleftrightkerning{Ydieresis}{Y}{1000}
+
+\setleftrightkerning{Zacute}{Z}{1000}
+\setleftrightkerning{Zcaron}{Z}{1000}
+\setleftrightkerning{Zdotaccent}{Z}{1000}
+
+\setleftrightkerning{aogonek}{a}{1000}
+
+\setleftrightkerning{ccedilla}{c}{1000}
+
+\setleftrightkerning{eogonek}{e}{1000}
+
+\setleftkerning{ffi}{f}{1000}
+\setleftkerning{ffl}{f}{1000}
+\setleftrightkerning{ff}{f}{1000}
+\setleftkerning{fi}{f}{1000}
+\setleftkerning{fl}{f}{1000}
+
+\setleftkerning{ij}{i}{1000}
+
+\setrightkerning{fi}{i}{1000}
+\setrightkerning{ffi}{i}{1000}
+
+\setrightkerning{ij}{j}{1000}
+
+\setrightkerning{fl}{l}{1000}
+\setrightkerning{ffl}{l}{1000}
+
+\setleftkerning{oe}{o}{1000}
+\setrightkerning{oe}{e}{1000}
+\setleftrightkerning{oslash}{o}{1000}
+
+\setleftrightkerning{scedilla}{s}{1000}
+
+\setleftrightkerning{tcedilla}{t}{1000}
+
+\comment{\section{All-caps kerning}}
+
+\setleftrightkerning{dotlessI}{I}{1000}
+\setleftrightkerning{dotlessJ}{I}{1000}
+\setleftrightkerning{FFspaced}{F}{1000}
+\setleftkerning{FIspaced}{F}{1000}
+\setrightkerning{FIspaced}{I}{1000}
+\setleftkerning{FLspaced}{F}{1000}
+\setrightkerning{FLspaced}{L}{1000}
+\setleftkerning{FFIspaced}{F}{1000}
+\setrightkerning{FFIspaced}{I}{1000}
+\setleftkerning{FFLspaced}{F}{1000}
+\setrightkerning{FFLspaced}{L}{1000}
+\setleftrightkerning{Dbar}{Eth}{1000}
+\setleftkerning{IJspaced}{I}{1000}
+\setrightkerning{IJspaced}{J}{1000}
+\setleftrightkerning{SSspaced}{S}{1000}
+
+\comment{\section{Small caps kerning}}
+
+\setleftrightkerning{Asmall}{A}{\int{smallcapskerning}}
+\setleftrightkerning{Bsmall}{B}{\int{smallcapskerning}}
+\setleftrightkerning{Csmall}{C}{\int{smallcapskerning}}
+\setleftrightkerning{Dsmall}{D}{\int{smallcapskerning}}
+\setleftrightkerning{Esmall}{E}{\int{smallcapskerning}}
+\setleftrightkerning{Fsmall}{F}{\int{smallcapskerning}}
+\setleftrightkerning{Gsmall}{G}{\int{smallcapskerning}}
+\setleftrightkerning{Hsmall}{H}{\int{smallcapskerning}}
+\setleftrightkerning{Ismall}{I}{\int{smallcapskerning}}
+\setleftrightkerning{Jsmall}{J}{\int{smallcapskerning}}
+\setleftrightkerning{Ksmall}{K}{\int{smallcapskerning}}
+\setleftrightkerning{Lsmall}{L}{\int{smallcapskerning}}
+\setleftrightkerning{Msmall}{M}{\int{smallcapskerning}}
+\setleftrightkerning{Nsmall}{N}{\int{smallcapskerning}}
+\setleftrightkerning{Osmall}{O}{\int{smallcapskerning}}
+\setleftrightkerning{Psmall}{P}{\int{smallcapskerning}}
+\setleftrightkerning{Qsmall}{Q}{\int{smallcapskerning}}
+\setleftrightkerning{Rsmall}{R}{\int{smallcapskerning}}
+\setleftrightkerning{Ssmall}{S}{\int{smallcapskerning}}
+\setleftrightkerning{Tsmall}{T}{\int{smallcapskerning}}
+\setleftrightkerning{Usmall}{U}{\int{smallcapskerning}}
+\setleftrightkerning{Vsmall}{V}{\int{smallcapskerning}}
+\setleftrightkerning{Wsmall}{W}{\int{smallcapskerning}}
+\setleftrightkerning{Xsmall}{X}{\int{smallcapskerning}}
+\setleftrightkerning{Ysmall}{Y}{\int{smallcapskerning}}
+\setleftrightkerning{Zsmall}{Z}{\int{smallcapskerning}}
+\setleftrightkerning{Aacutesmall}{Aacute}{\int{smallcapskerning}}
+\setleftrightkerning{Abrevesmall}{Abreve}{\int{smallcapskerning}}
+\setleftrightkerning{Acircumflexsmall}{Acircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Adieresissmall}{Adieresis}{\int{smallcapskerning}}
+\setleftrightkerning{AEsmall}{AE}{\int{smallcapskerning}}
+\setleftrightkerning{Agravesmall}{Agrave}{\int{smallcapskerning}}
+\setleftrightkerning{Aogoneksmall}{Aogonek}{\int{smallcapskerning}}
+\setleftrightkerning{Aringsmall}{Aring}{\int{smallcapskerning}}
+\setleftrightkerning{Atildesmall}{Atilde}{\int{smallcapskerning}}
+\setleftrightkerning{Cacutesmall}{Cacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ccaronsmall}{Ccaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ccedillasmall}{Ccedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Dbarsmall}{Dbar}{\int{smallcapskerning}}
+\setleftrightkerning{Dcaronsmall}{Dcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Eacutesmall}{Eacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ecaronsmall}{Ecaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ecircumflexsmall}{Ecircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Edieresissmall}{Edieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Egravesmall}{Egrave}{\int{smallcapskerning}}
+\setleftrightkerning{Eogoneksmall}{Eogonek}{\int{smallcapskerning}}
+\setleftrightkerning{Ethsmall}{Eth}{\int{smallcapskerning}}
+\setleftrightkerning{Gbrevesmall}{Gbreve}{\int{smallcapskerning}}
+\setleftrightkerning{IJsmall}{IJ}{\int{smallcapskerning}}
+\setleftrightkerning{Iacutesmall}{Iacute}{\int{smallcapskerning}}
+\setleftrightkerning{Icircumflexsmall}{Icircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Idieresissmall}{Idieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Idotaccentsmall}{Idotaccent}{\int{smallcapskerning}}
+\setleftrightkerning{Igravesmall}{Igrave}{\int{smallcapskerning}}
+\setleftrightkerning{Lacutesmall}{Lacute}{\int{smallcapskerning}}
+\setleftrightkerning{Lcaronsmall}{Lcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Lslashsmall}{Lslash}{\int{smallcapskerning}}
+\setleftrightkerning{Nacutesmall}{Nacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ncaronsmall}{Ncaron}{\int{smallcapskerning}}
+\setleftrightkerning{Ngsmall}{Ng}{\int{smallcapskerning}}
+\setleftrightkerning{Ntildesmall}{Ntilde}{\int{smallcapskerning}}
+\setleftrightkerning{Oacutesmall}{Oacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ocircumflexsmall}{Ocircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Odieresissmall}{Odieresis}{\int{smallcapskerning}}
+\setleftrightkerning{OEsmall}{OE}{\int{smallcapskerning}}
+\setleftrightkerning{Ogravesmall}{Ograve}{\int{smallcapskerning}}
+\setleftrightkerning{Ohungarumlautsmall}{Ohungarumlaut}{\int{smallcapskerning}}
+\setleftrightkerning{Oslashsmall}{Oslash}{\int{smallcapskerning}}
+\setleftrightkerning{Otildesmall}{Otilde}{\int{smallcapskerning}}
+\setleftrightkerning{Racutesmall}{Racute}{\int{smallcapskerning}}
+\setleftrightkerning{Rcaronsmall}{Rcaron}{\int{smallcapskerning}}
+\setleftrightkerning{SSsmall}{SS}{\int{smallcapskerning}}
+\setleftrightkerning{Sacutesmall}{Sacute}{\int{smallcapskerning}}
+\setleftrightkerning{Scaronsmall}{Scaron}{\int{smallcapskerning}}
+\setleftrightkerning{Scedillasmall}{Scedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Tcaronsmall}{Tcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Tcedillasmall}{Tcedilla}{\int{smallcapskerning}}
+\setleftrightkerning{Thornsmall}{Thorn}{\int{smallcapskerning}}
+\setleftrightkerning{Uacutesmall}{Uacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ucircumflexsmall}{Ucircumflex}{\int{smallcapskerning}}
+\setleftrightkerning{Udieresissmall}{Udieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Ugravesmall}{Ugrave}{\int{smallcapskerning}}
+\setleftrightkerning{Uhungarumlautsmall}{Uhungarumlaut}{\int{smallcapskerning}}
+\setleftrightkerning{Uringsmall}{Uring}{\int{smallcapskerning}}
+\setleftrightkerning{Yacutesmall}{Yacute}{\int{smallcapskerning}}
+\setleftrightkerning{Ydieresissmall}{Ydieresis}{\int{smallcapskerning}}
+\setleftrightkerning{Zacutesmall}{Zacute}{\int{smallcapskerning}}
+\setleftrightkerning{Zcaronsmall}{Zcaron}{\int{smallcapskerning}}
+\setleftrightkerning{Zdotaccentsmall}{Zdotaccent}{\int{smallcapskerning}}
+\setleftrightkerning{dotlessIsmall}{Ismall}{1000}
+\setleftrightkerning{dotlessJsmall}{Jsmall}{1000}
+
+\comment{\section{Unfakable glyphs}}
+
+\unfakable{Gamma}
+\unfakable{Delta}
+\unfakable{Theta}
+\unfakable{Lambda}
+\unfakable{Xi}
+\unfakable{Pi}
+\unfakable{Sigma}
+\unfakable{Upsilon}
+\unfakable{Phi}
+\unfakable{Psi}
+\unfakable{Omega}
+\unfakable{grave}
+\unfakable{acute}
+\unfakable{circumflex}
+\unfakable{tilde}
+\unfakable{dieresis}
+\unfakable{hungarumlaut}
+\unfakable{ring}
+\unfakable{caron}
+\unfakable{breve}
+\unfakable{macron}
+\unfakable{dotaccent}
+\unfakable{cedilla}
+\unfakable{ogonek}
+\unfakable{guilsinglleft}
+\unfakable{guilsinglright}
+\unfakable{quotedblleft}
+\unfakable{quotedblright}
+\unfakable{quotedblbase}
+\unfakable{guillemotleft}
+\unfakable{guillemotright}
+\unfakable{endash}
+\unfakable{emdash}
+\unfakable{dotlessi}
+\unfakable{perthousandzero}
+\unfakable{exclam}
+\unfakable{quotedbl}
+\unfakable{numbersign}
+\unfakable{dollar}
+\unfakable{percent}
+\unfakable{ampersand}
+\unfakable{quoteright}
+\unfakable{parenleft}
+\unfakable{parenright}
+\unfakable{asterisk}
+\unfakable{plus}
+\unfakable{comma}
+\unfakable{hyphen}
+\unfakable{period}
+\unfakable{slash}
+\unfakable{zero}
+\unfakable{one}
+\unfakable{two}
+\unfakable{three}
+\unfakable{four}
+\unfakable{five}
+\unfakable{six}
+\unfakable{seven}
+\unfakable{eight}
+\unfakable{nine}
+\nofakeout{zerooldstyle}
+\nofakeout{oneoldstyle}
+\nofakeout{twooldstyle}
+\nofakeout{threeoldstyle}
+\nofakeout{fouroldstyle}
+\nofakeout{fiveoldstyle}
+\nofakeout{sixoldstyle}
+\nofakeout{sevenoldstyle}
+\nofakeout{eightoldstyle}
+\nofakeout{nineoldstyle}
+\unfakable{colon}
+\unfakable{semicolon}
+\unfakable{less}
+\unfakable{equal}
+\unfakable{greater}
+\unfakable{question}
+\unfakable{at}
+\unfakable{A}
+\unfakable{B}
+\unfakable{C}
+\unfakable{D}
+\unfakable{E}
+\unfakable{F}
+\unfakable{G}
+\unfakable{H}
+\unfakable{I}
+\unfakable{J}
+\unfakable{K}
+\unfakable{L}
+\unfakable{M}
+\unfakable{N}
+\unfakable{O}
+\unfakable{P}
+\unfakable{Q}
+\unfakable{R}
+\unfakable{S}
+\unfakable{T}
+\unfakable{U}
+\unfakable{V}
+\unfakable{W}
+\unfakable{X}
+\unfakable{Y}
+\unfakable{Z}
+\unfakable{bracketleft}
+\unfakable{backslash}
+\unfakable{bracketright}
+\unfakable{asciicircum}
+\unfakable{underscore}
+\unfakable{quoteleft}
+\unfakable{a}
+\unfakable{b}
+\unfakable{c}
+\unfakable{d}
+\unfakable{e}
+\unfakable{f}
+\unfakable{g}
+\unfakable{h}
+\unfakable{i}
+\unfakable{j}
+\unfakable{k}
+\unfakable{l}
+\unfakable{m}
+\unfakable{n}
+\unfakable{o}
+\unfakable{p}
+\unfakable{q}
+\unfakable{r}
+\unfakable{s}
+\unfakable{t}
+\unfakable{u}
+\unfakable{v}
+\unfakable{w}
+\unfakable{x}
+\unfakable{y}
+\unfakable{z}
+\unfakable{braceleft}
+\unfakable{bar}
+\unfakable{braceright}
+\unfakable{asciitilde}
+\unfakable{Ng}
+\unfakable{section}
+\unfakable{ng}
+\unfakable{exclamdown}
+\unfakable{questiondown}
+\unfakable{sterling}
+\unfakable{AE}
+\unfakable{Eth}
+\unfakable{OE}
+\unfakable{Oslash}
+\unfakable{Thorn}
+\unfakable{ae}
+\unfakable{eth}
+\unfakable{oe}
+\unfakable{oslash}
+\unfakable{thorn}
+\unfakable{germandbls}
+\unfakable{lslashslash}
+
+\setglyph{dotlessj}
+ \moveup{\neg{\depth{j}}}
+ \glyphrule{\width{j}}{\add{\depth{j}}{\height{dotlessi}}}
+ \resetitalic{\italic{dotlessi}}
+ \moveup{\depth{j}}
+ \glyphwarning{missing glyph `dotlessj'}
+\endsetglyph
+
+\comment{\section{Glyphs}}
+
+\setglyph{space}
+ \ifisglyph{space-not}\then
+ \movert{\width{space-not}}
+ \else
+ \movert{\width{i}}
+ \fi
+\endsetglyph
+
+\setglyph{compwordmark}
+ \movert{0}
+\endsetglyph
+
+\setglyph{quotesinglbase}
+ \glyph{comma}{1000}
+\endsetglyph
+
+\setglyph{fi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{i}}
+ \glyph{i}{1000}
+\endsetglyph
+
+\setglyph{ff}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{f}{1000}
+\endsetglyph
+
+\setglyph{fl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+
+\setglyph{ffi}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fi}{1000}
+\endsetglyph
+
+\setglyph{ffl}
+ \glyph{f}{1000}
+ \movert{\kerning{f}{f}}
+ \glyph{fl}{1000}
+\endsetglyph
+
+\setglyph{visiblespace}
+ \moveup{\neg{\int{visiblespacedepth}}}
+ \movert{\int{visiblespacesurround}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \glyphrule
+ {\int{visiblespacewidth}}
+ {\int{underlinethickness}}
+ \glyphrule
+ {\int{underlinethickness}}
+ {\int{visiblespacedepth}}
+ \movert{\int{visiblespacesurround}}
+ \moveup{\int{visiblespacedepth}}
+\endsetglyph
+
+\setglyph{rangedash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{endash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{punctdash}
+ \ifisint{monowidth}\then
+ \glyph{hyphen}{1000}
+ \glyph{hyphen}{1000}
+ \else
+ \glyph{emdash}{1000}
+ \fi
+\endsetglyph
+
+\setglyph{hyphenchar}
+ \glyph{hyphen}{1000}
+\endsetglyph
+
+\setglyph{ringfitted}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+ \glyph{ring}{1000}
+ \movert{\div{\sub{\width{A}}{\width{ring}}}{2}}
+\endsetglyph
+
+\setglyph{lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{l}}
+ \glyph{l}{1000}
+\endsetglyph
+
+\setglyph{Lslash}
+ \glyph{lslashslash}{1000}
+ \movert{\kerning{lslashslash}{L}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Abreve}
+ \topaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogonek}
+ \botaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacute}
+ \topaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaron}
+ \topaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaron}
+ \topaccent{D}{caron}{450}
+\endsetglyph
+
+\setglyph{Ecaron}
+ \topaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogonek}
+ \botaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbreve}
+ \topaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacute}
+ \topaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Lcaron}
+ \glyph{L}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-200}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{Nacute}
+ \topaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaron}
+ \topaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ohungarumlaut}
+ \topaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racute}
+ \topaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaron}
+ \topaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacute}
+ \topaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaron}
+ \topaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedilla}
+ \botaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaron}
+ \topaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedilla}
+ \botaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlaut}
+ \topaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uring}
+ \topaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresis}
+ \topaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacute}
+ \topaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaron}
+ \topaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccent}
+ \topaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{IJ}
+ \glyph{I}{1000}
+ \movert{\kerning{I}{J}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{Idotaccent}
+ \topaccent{I}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{dbar}
+ \push
+ \movert{\sub{\width{d}}{\width{macron}}}
+ \glyph{macron}{1000}
+ \pop
+ \glyph{d}{1000}
+\endsetglyph
+
+\setglyph{abreve}
+ \topaccent{a}{breve}{500}
+\endsetglyph
+
+\setglyph{aogonek}
+ \botaccent{a}{ogonek}{850}
+\endsetglyph
+
+\setglyph{cacute}
+ \topaccent{c}{acute}{500}
+\endsetglyph
+
+\setglyph{ccaron}
+ \topaccent{c}{caron}{500}
+\endsetglyph
+
+\setglyph{dcaron}
+ \glyph{d}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{ecaron}
+ \topaccent{e}{caron}{500}
+\endsetglyph
+
+\setglyph{eogonek}
+ \botaccent{e}{ogonek}{500}
+\endsetglyph
+
+\setglyph{gbreve}
+ \topaccent{g}{breve}{500}
+\endsetglyph
+
+\setglyph{lacute}
+ \topaccent{l}{acute}{500}
+\endsetglyph
+
+\setglyph{lcaron}
+ \glyph{l}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{nacute}
+ \topaccent{n}{acute}{500}
+\endsetglyph
+
+\setglyph{ncaron}
+ \topaccent{n}{caron}{500}
+\endsetglyph
+
+\setglyph{ohungarumlaut}
+ \topaccent{o}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{racute}
+ \topaccent{r}{acute}{500}
+\endsetglyph
+
+\setglyph{rcaron}
+ \topaccent{r}{caron}{500}
+\endsetglyph
+
+\setglyph{sacute}
+ \topaccent{s}{acute}{500}
+\endsetglyph
+
+\setglyph{scaron}
+ \topaccent{s}{caron}{500}
+\endsetglyph
+
+\setglyph{scedilla}
+ \botaccent{s}{cedilla}{500}
+\endsetglyph
+
+\setglyph{tcaron}
+ \glyph{t}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-75}
+ \fi
+ \glyph{quoteright}{1000}
+\endsetglyph
+
+\setglyph{tcedilla}
+ \botaccent{t}{cedilla}{500}
+\endsetglyph
+
+\setglyph{uhungarumlaut}
+ \topaccent{u}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{uring}
+ \topaccent{u}{ring}{500}
+\endsetglyph
+
+\setglyph{ydieresis}
+ \topaccent{y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{zacute}
+ \topaccent{z}{acute}{500}
+\endsetglyph
+
+\setglyph{zcaron}
+ \topaccent{z}{caron}{500}
+\endsetglyph
+
+\setglyph{zdotaccent}
+ \topaccent{z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{ij}
+ \glyph{i}{1000}
+ \movert{\kerning{i}{j}}
+ \glyph{j}{1000}
+\endsetglyph
+
+\setglyph{Agrave}
+ \topaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacute}
+ \topaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflex}
+ \topaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atilde}
+ \topaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresis}
+ \topaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aring}
+ \topaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedilla}
+ \botaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egrave}
+ \topaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacute}
+ \topaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflex}
+ \topaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresis}
+ \topaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Iacute}
+ \topaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Igrave}
+ \topaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Icircumflex}
+ \topaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresis}
+ \topaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ntilde}
+ \topaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ograve}
+ \topaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacute}
+ \topaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflex}
+ \topaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otilde}
+ \topaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresis}
+ \topaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugrave}
+ \topaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacute}
+ \topaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflex}
+ \topaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresis}
+ \topaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacute}
+ \topaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{SS}
+ \glyph{S}{1000}
+ \movert{\kerning{S}{S}}
+ \glyph{S}{1000}
+\endsetglyph
+
+\setglyph{agrave}
+ \topaccent{a}{grave}{500}
+\endsetglyph
+
+\setglyph{aacute}
+ \topaccent{a}{acute}{500}
+\endsetglyph
+
+\setglyph{acircumflex}
+ \topaccent{a}{circumflex}{500}
+\endsetglyph
+
+\setglyph{atilde}
+ \topaccent{a}{tilde}{500}
+\endsetglyph
+
+\setglyph{adieresis}
+ \topaccent{a}{dieresis}{500}
+\endsetglyph
+
+\setglyph{aring}
+ \topaccent{a}{ring}{500}
+\endsetglyph
+
+\setglyph{ccedilla}
+ \topaccent{c}{cedilla}{500}
+\endsetglyph
+
+\setglyph{egrave}
+ \topaccent{e}{grave}{500}
+\endsetglyph
+
+\setglyph{eacute}
+ \topaccent{e}{acute}{500}
+\endsetglyph
+
+\setglyph{ecircumflex}
+ \topaccent{e}{circumflex}{500}
+\endsetglyph
+
+\setglyph{edieresis}
+ \topaccent{e}{dieresis}{500}
+\endsetglyph
+
+\setglyph{igrave}
+ \topaccent{dotlessi}{grave}{500}
+\endsetglyph
+
+\setglyph{iacute}
+ \topaccent{dotlessi}{acute}{500}
+\endsetglyph
+
+\setglyph{icircumflex}
+ \topaccent{dotlessi}{circumflex}{500}
+\endsetglyph
+
+\setglyph{idieresis}
+ \topaccent{dotlessi}{dieresis}{500}
+\endsetglyph
+
+\setglyph{ntilde}
+ \topaccent{n}{tilde}{500}
+\endsetglyph
+
+\setglyph{ograve}
+ \topaccent{o}{grave}{500}
+\endsetglyph
+
+\setglyph{oacute}
+ \topaccent{o}{acute}{500}
+\endsetglyph
+
+\setglyph{ocircumflex}
+ \topaccent{o}{circumflex}{500}
+\endsetglyph
+
+\setglyph{otilde}
+ \topaccent{o}{tilde}{500}
+\endsetglyph
+
+\setglyph{odieresis}
+ \topaccent{o}{dieresis}{500}
+\endsetglyph
+
+\setglyph{ugrave}
+ \topaccent{u}{grave}{500}
+\endsetglyph
+
+\setglyph{uacute}
+ \topaccent{u}{acute}{500}
+\endsetglyph
+
+\setglyph{ucircumflex}
+ \topaccent{u}{circumflex}{500}
+\endsetglyph
+
+\setglyph{udieresis}
+ \topaccent{u}{dieresis}{500}
+\endsetglyph
+
+\setglyph{yacute}
+ \topaccent{y}{acute}{500}
+\endsetglyph
+
+\comment{\section{All-caps glyphs}}
+
+\setglyph{dotlessI}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{dotlessJ}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{FFspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{F}}
+ {\int{capspacing}}}
+ \glyph{F}{1000}
+\endsetglyph
+
+\setglyph{FIspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FLspaced}
+ \glyph{F}{1000}
+ \movert{\add{\kerning{F}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{FFIspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{I}}
+ {\int{capspacing}}}
+ \glyph{I}{1000}
+\endsetglyph
+
+\setglyph{FFLspaced}
+ \glyph{FFspaced}{1000}
+ \movert{\add{\kerning{FFspaced}{L}}
+ {\int{capspacing}}}
+ \glyph{L}{1000}
+\endsetglyph
+
+\setglyph{Dbar}
+ \glyph{Eth}{1000}
+\endsetglyph
+
+\setglyph{IJspaced}
+ \glyph{I}{1000}
+ \movert{\add{\kerning{I}{J}}{\int{capspacing}}}
+ \glyph{J}{1000}
+\endsetglyph
+
+\setglyph{SSspaced}
+ \glyph{S}{1000}
+ \movert{\add{\kerning{S}{S}}{\int{capspacing}}}
+ \glyph{S}{1000}
+\endsetglyph
+
+\comment{\section{Small caps glyphs}}
+
+\setglyph{acutesmall}
+ \cscaccent{acute}
+\endsetglyph
+
+\setglyph{gravesmall}
+ \cscaccent{grave}
+\endsetglyph
+
+\setglyph{circumflexsmall}
+ \cscaccent{circumflex}
+\endsetglyph
+
+\setglyph{tildesmall}
+ \cscaccent{tilde}
+\endsetglyph
+
+\setglyph{dieresissmall}
+ \cscaccent{dieresis}
+\endsetglyph
+
+\setglyph{brevesmall}
+ \cscaccent{breve}
+\endsetglyph
+
+\setglyph{dotaccentsmall}
+ \cscaccent{dotaccent}
+\endsetglyph
+
+\setglyph{caronsmall}
+ \cscaccent{caron}
+\endsetglyph
+
+\setglyph{hungarumlautsmall}
+ \cscaccent{hungarumlaut}
+\endsetglyph
+
+\setglyph{ringsmall}
+ \cscaccent{ring}
+\endsetglyph
+
+\setglyph{cedillasmall}
+ \cscglyph{cedilla}
+\endsetglyph
+
+\setglyph{ogoneksmall}
+ \cscglyph{ogonek}
+\endsetglyph
+
+\setglyph{Idotaccentsmall}
+ \csctopaccent{I}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Abrevesmall}
+ \csctopaccent{A}{breve}{500}
+\endsetglyph
+
+\setglyph{Aogoneksmall}
+ \cscbotaccent{A}{ogonek}{900}
+\endsetglyph
+
+\setglyph{Cacutesmall}
+ \csctopaccent{C}{acute}{500}
+\endsetglyph
+
+\setglyph{Ccaronsmall}
+ \csctopaccent{C}{caron}{500}
+\endsetglyph
+
+\setglyph{Dcaronsmall}
+ \csctopaccent{D}{caron}{500}
+\endsetglyph
+
+\setglyph{Ecaronsmall}
+ \csctopaccent{E}{caron}{500}
+\endsetglyph
+
+\setglyph{Eogoneksmall}
+ \cscbotaccent{E}{ogonek}{850}
+\endsetglyph
+
+\setglyph{Gbrevesmall}
+ \csctopaccent{G}{breve}{500}
+\endsetglyph
+
+\setglyph{Lacutesmall}
+ \csctopaccent{L}{acute}{250}
+\endsetglyph
+
+\setglyph{Nacutesmall}
+ \csctopaccent{N}{acute}{500}
+\endsetglyph
+
+\setglyph{Ncaronsmall}
+ \csctopaccent{N}{caron}{500}
+\endsetglyph
+
+\setglyph{Ngsmall}
+ \cscglyph{Ng}
+\endsetglyph
+
+\setglyph{Ohungarumlautsmall}
+ \csctopaccent{O}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Racutesmall}
+ \csctopaccent{R}{acute}{500}
+\endsetglyph
+
+\setglyph{Rcaronsmall}
+ \csctopaccent{R}{caron}{500}
+\endsetglyph
+
+\setglyph{Sacutesmall}
+ \csctopaccent{S}{acute}{500}
+\endsetglyph
+
+\setglyph{Scaronsmall}
+ \csctopaccent{S}{caron}{500}
+\endsetglyph
+
+\setglyph{Scedillasmall}
+ \cscbotaccent{S}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Tcaronsmall}
+ \csctopaccent{T}{caron}{500}
+\endsetglyph
+
+\setglyph{Tcedillasmall}
+ \cscbotaccent{T}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Uhungarumlautsmall}
+ \csctopaccent{U}{hungarumlaut}{500}
+\endsetglyph
+
+\setglyph{Uringsmall}
+ \csctopaccent{U}{ring}{500}
+\endsetglyph
+
+\setglyph{Ydieresissmall}
+ \csctopaccent{Y}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Zacutesmall}
+ \csctopaccent{Z}{acute}{500}
+\endsetglyph
+
+\setglyph{Zcaronsmall}
+ \csctopaccent{Z}{caron}{500}
+\endsetglyph
+
+\setglyph{Zdotaccentsmall}
+ \csctopaccent{Z}{dotaccent}{500}
+\endsetglyph
+
+\setglyph{Agravesmall}
+ \csctopaccent{A}{grave}{500}
+\endsetglyph
+
+\setglyph{Aacutesmall}
+ \csctopaccent{A}{acute}{500}
+\endsetglyph
+
+\setglyph{Acircumflexsmall}
+ \csctopaccent{A}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Atildesmall}
+ \csctopaccent{A}{tilde}{500}
+\endsetglyph
+
+\setglyph{Adieresissmall}
+ \csctopaccent{A}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Aringsmall}
+ \csctopaccent{A}{ring}{500}
+\endsetglyph
+
+\setglyph{Ccedillasmall}
+ \csctopaccent{C}{cedilla}{500}
+\endsetglyph
+
+\setglyph{Egravesmall}
+ \csctopaccent{E}{grave}{500}
+\endsetglyph
+
+\setglyph{Eacutesmall}
+ \csctopaccent{E}{acute}{500}
+\endsetglyph
+
+\setglyph{Ecircumflexsmall}
+ \csctopaccent{E}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Edieresissmall}
+ \csctopaccent{E}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Igravesmall}
+ \csctopaccent{I}{grave}{500}
+\endsetglyph
+
+\setglyph{Iacutesmall}
+ \csctopaccent{I}{acute}{500}
+\endsetglyph
+
+\setglyph{Icircumflexsmall}
+ \csctopaccent{I}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Idieresissmall}
+ \csctopaccent{I}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ethsmall}
+ \cscglyph{Eth}
+\endsetglyph
+
+\setglyph{Dbarsmall}
+ \glyph{Ethsmall}{1000}
+\endsetglyph
+
+\setglyph{Ntildesmall}
+ \csctopaccent{N}{tilde}{500}
+\endsetglyph
+
+\setglyph{Ogravesmall}
+ \csctopaccent{O}{grave}{500}
+\endsetglyph
+
+\setglyph{Oacutesmall}
+ \csctopaccent{O}{acute}{500}
+\endsetglyph
+
+\setglyph{Ocircumflexsmall}
+ \csctopaccent{O}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Otildesmall}
+ \csctopaccent{O}{tilde}{500}
+\endsetglyph
+
+\setglyph{Odieresissmall}
+ \csctopaccent{O}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Ugravesmall}
+ \csctopaccent{U}{grave}{500}
+\endsetglyph
+
+\setglyph{Uacutesmall}
+ \csctopaccent{U}{acute}{500}
+\endsetglyph
+
+\setglyph{Ucircumflexsmall}
+ \csctopaccent{U}{circumflex}{500}
+\endsetglyph
+
+\setglyph{Udieresissmall}
+ \csctopaccent{U}{dieresis}{500}
+\endsetglyph
+
+\setglyph{Yacutesmall}
+ \csctopaccent{Y}{acute}{500}
+\endsetglyph
+
+\setglyph{Thornsmall}
+ \cscglyph{Thorn}
+\endsetglyph
+
+\setglyph{Asmall}
+ \cscglyph{A}
+\endsetglyph
+
+\setglyph{Bsmall}
+ \cscglyph{B}
+\endsetglyph
+
+\setglyph{Csmall}
+ \cscglyph{C}
+\endsetglyph
+
+\setglyph{Dsmall}
+ \cscglyph{D}
+\endsetglyph
+
+\setglyph{Esmall}
+ \cscglyph{E}
+\endsetglyph
+
+\setglyph{Fsmall}
+ \cscglyph{F}
+\endsetglyph
+
+\setglyph{Gsmall}
+ \cscglyph{G}
+\endsetglyph
+
+\setglyph{Hsmall}
+ \cscglyph{H}
+\endsetglyph
+
+\setglyph{Ismall}
+ \cscglyph{I}
+\endsetglyph
+
+\setglyph{Jsmall}
+ \cscglyph{J}
+\endsetglyph
+
+\setglyph{Ksmall}
+ \cscglyph{K}
+\endsetglyph
+
+\setglyph{Lsmall}
+ \cscglyph{L}
+\endsetglyph
+
+\setglyph{Msmall}
+ \cscglyph{M}
+\endsetglyph
+
+\setglyph{Nsmall}
+ \cscglyph{N}
+\endsetglyph
+
+\setglyph{Osmall}
+ \cscglyph{O}
+\endsetglyph
+
+\setglyph{Psmall}
+ \cscglyph{P}
+\endsetglyph
+
+\setglyph{Qsmall}
+ \cscglyph{Q}
+\endsetglyph
+
+\setglyph{Rsmall}
+ \cscglyph{R}
+\endsetglyph
+
+\setglyph{Ssmall}
+ \cscglyph{S}
+\endsetglyph
+
+\setglyph{Tsmall}
+ \cscglyph{T}
+\endsetglyph
+
+\setglyph{Usmall}
+ \cscglyph{U}
+\endsetglyph
+
+\setglyph{Vsmall}
+ \cscglyph{V}
+\endsetglyph
+
+\setglyph{Wsmall}
+ \cscglyph{W}
+\endsetglyph
+
+\setglyph{Xsmall}
+ \cscglyph{X}
+\endsetglyph
+
+\setglyph{Ysmall}
+ \cscglyph{Y}
+\endsetglyph
+
+\setglyph{Zsmall}
+ \cscglyph{Z}
+\endsetglyph
+
+\setglyph{Lslashsmall}
+ \cscglyph{Lslash}
+\endsetglyph
+
+\setglyph{AEsmall}
+ \cscglyph{AE}
+\endsetglyph
+
+\setglyph{OEsmall}
+ \cscglyph{OE}
+\endsetglyph
+
+\setglyph{Oslashsmall}
+ \cscglyph{Oslash}
+\endsetglyph
+
+\setglyph{dotlessIsmall}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{dotlessJsmall}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{FFsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Fsmall}}
+ {\int{capspacing}}}
+ \glyph{Fsmall}{1000}
+\endsetglyph
+
+\setglyph{FIsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Ismall}}
+ {\int{capspacing}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FLsmall}
+ \glyph{Fsmall}{1000}
+ \movert{\add{\kerning{Fsmall}{Lsmall}}
+ {\int{capspacing}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{FFIsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Ismall}}
+ {\int{capspacing}}}
+ \glyph{Ismall}{1000}
+\endsetglyph
+
+\setglyph{FFLsmall}
+ \glyph{FFsmall}{1000}
+ \movert{\add{\kerning{FFsmall}{Lsmall}}
+ {\int{capspacing}}}
+ \glyph{Lsmall}{1000}
+\endsetglyph
+
+\setglyph{IJsmall}
+ \glyph{Ismall}{1000}
+ \movert{\add{\kerning{Ismall}{Jsmall}}
+ {\int{capspacing}}}
+ \glyph{Jsmall}{1000}
+\endsetglyph
+
+\setglyph{Lcaronsmall}
+ \glyph{Lsmall}{1000}
+ \ifisint{monowidth}\then\else
+ \movert{-100}
+ \fi
+ \glyph{quoteright}{\int{smallcapsscale}}
+\endsetglyph
+
+\setglyph{SSsmall}
+ \glyph{Ssmall}{1000}
+ \movert{\add{\kerning{Ssmall}{Ssmall}}
+ {\int{capspacing}}}
+ \glyph{Ssmall}{1000}
+\endsetglyph
+
+\comment{\section{Accents}
+ \TeX's math accent-positioning requires accents to have zero depth.}
+
+\setcommand\zerodepth#1{
+ \resetglyph{#1}
+ \glyph{#1}{1000}
+ \resetdepth{0}
+ \endresetglyph
+}
+
+\zerodepth{acute}
+\zerodepth{grave}
+\zerodepth{caron}
+\zerodepth{breve}
+\zerodepth{macron}
+\zerodepth{ring}
+\zerodepth{circumflex}
+\zerodepth{dotaccent}
+\zerodepth{tilde}
+\zerodepth{dieresis}
+
+\endmetrics
+
+\makesignature
+
+\end{document}
+
+
diff --git a/fonts/utilities/vfinst/map.a2d b/fonts/utilities/vfinst/map.a2d
new file mode 100644
index 0000000000..2404f75ec1
--- /dev/null
+++ b/fonts/utilities/vfinst/map.a2d
@@ -0,0 +1,433 @@
+#############################################################
+##
+## This is the file map.a2d, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+## This is file map.a2d, version 1.00.
+## It maps font abbreviations (a) to directory names (d)
+## which may be useful in placing fonts in a TDS TeX system.
+## It was compiled in February 1997 from various *.map
+## files that accompany the fontname2.1 distribution by
+## Karl Berry.
+a1 arial
+a2 amasis
+a3 adlib
+a4 altgoth2
+a5 allegro
+a6 amelia
+a7 amertext
+a8 aurora
+a9 adsans
+aa aachen
+ab aboeckli
+ac acaslon
+ad agaramon
+ag avantgar
+ah ashleysc
+ai abadi
+al albertus
+am amercana
+an anna
+ao atqolive
+ap apollo
+aq antiqua
+ar arcadia
+as aldus
+at atypewri
+au auriol
+av avenir
+az azdzgrot
+b0 blackoak
+b1 blado
+b2 binnyos
+b3 braggado
+b4 bison
+b5 binghams
+b6 block
+b7 bernhard
+b8 blippo
+b9 bremen
+bb bembo
+bc banco
+bd bodoni
+be bell
+bf biffo
+bg benguiat
+bh bauhaus
+bi birch
+bk bookman
+bl belwe
+bm bulmer
+bn bernard
+bo balloon
+bp bodocamp
+br berling
+bs bakersig
+bt boton
+bu brush
+bv baskervi
+bw broadway
+by berkeley
+c0 carolina
+c1 calisto
+c2 casln224
+c3 caslon3
+c4 chicago
+c5 casln540
+c6 clarion
+c7 compacta
+c8 calvert
+c9 codex
+ca caslon
+cb cooper
+cc cascade
+cd clarendo
+ce centenni
+cf clearfac
+cg charlema
+ch charter
+ci candida
+cl cloister
+cn century
+co cochin
+cp copperpl
+cq cheq
+cr courier
+cs cntursbk
+ct cheltenh
+cu centuros
+cv clairvx
+cw cottonwd
+cx caxton
+cy city
+cz choc
+d0 davida
+dc domcasl
+dd ducberry
+de dellarob
+di diotima
+dl dolores
+dm delima
+dr doric
+ds dorchesc
+dt dante
+e0 embassy
+e1 empire
+ea lectra
+eb baskerbe
+ec applecha
+ee egyptian
+ef egyptien
+eg stgaramo
+eh engsft
+ei esprit
+ek eckmann
+el ellingtn
+en engraver
+eo amerigo
+er eras
+es eurostil
+et ehrhardt
+eu euler
+ex exclsior
+f0 flemishs
+f1 fournier
+f2 facade
+f3 festival
+f4 footligh
+f5 french
+fa formata
+fe forte
+ff fairfld
+fg frankgth
+fi figaro
+fl flora
+fn fenice
+fo folio
+fq frizquad
+fr frutiger
+fs falstaff
+ft fettefrk
+fu futura
+fx felixttl
+fy flyer
+g0 gando
+g1 gothic13
+g2 giddyup
+g3 garamon3
+g4 gymodern
+g5 gycatalg
+g6 gorilla
+g9 ugaramon
+gb gothicbb
+ge geneva
+gg garthgra
+gj granjon
+gl galliard
+gm garamond
+go gyoldsty
+gp glypha
+gq grotesq
+gr gloucest
+gs gillsans
+gt goudytxt
+gu guardi
+gv giovanni
+gy goudy
+h0 handelgo
+hb hobo
+hc herculnm
+hd headline
+hg hiroshig
+hi hvinsera
+hm charme
+hn hvneue
+ho horleyos
+hr hvround
+hs hnseati
+ht hoeflert
+hv helvetic
+hw schadow
+hx huxleyvr
+i0 commscr
+i1 impress
+i2 impuls
+ia insignia
+ib ibycus
+ic impact
+if inflex
+ig scgaramo
+ii imprint
+il caecilia
+im imago
+in industri
+io ionic
+ip impressm
+is italnos
+it italia
+iw ironwood
+iy iowanold
+jf jeffersn
+jn janson
+jo joanna
+jp juniper
+kb kabel
+kg bankgoth
+kl klang
+kn kino
+ko bookmano
+kr korinna
+ks kuenstsc
+ku kaufmann
+l1 liberty
+l2 libra
+l3 lucia
+l4 lucian
+lb lubaling
+lc lucida
+lf life
+lg lettrgth
+lh lubright
+li latin
+ln lino
+lo lithos
+ls lucsans
+lt lutetia
+lw leawood
+lx lucidfax
+ly lydian
+m0 monospac
+m1 monolisc
+m2 metro
+m3 mirarae
+m4 mrearl
+m5 murrayhl
+m6 mittlsft
+m7 matura
+m8 monotyos
+ma mandate
+mc monaco
+md meridien
+me mercursc
+mg marigold
+mh machine
+mi medici
+ml melior
+mn minion
+mo modern
+mp memphis
+mq mesquite
+mr madrone
+ms mistral
+mt minister
+mv malvern
+mx maximus
+mz amazone
+n0 normande
+n1 binner
+na newaster
+nb nbaskerv
+nc ncntrsbk
+nd ncaledon
+nf nofret
+ng newsgth
+ni nimrod
+nk neograph
+nl neuland
+nm nimbus
+nn nclarend
+np nsplanti
+nr nberolin
+ns timesnps
+nt timesnew
+nu nuptial
+nv novarese
+nz neuzeits
+o0 oldreadf
+o1 oranda
+o2 orbitb
+o3 colonna
+o4 oceansan
+o7 oldsty7
+oa ocra
+ob ocrb
+oc concorde
+oe oldengli
+oi ondine
+ol colmcill
+om omnia
+on corona
+op optima
+or orator
+os oldstyle
+ot coronet
+ov octavian
+ox onyx
+oy olympian
+oz ozhandcr
+p0 poplar
+p1 palacesc
+p2 pepita
+p3 palette
+p4 pioneer
+p5 piranesi
+p6 blueprin
+pa parkave
+pb ptbarnum
+pc poetica
+pd placard
+pe prestige
+pf profile
+pg peignot
+ph photina
+pi pi
+pl palatino
+pn plantin
+po ponderos
+pp perpetua
+pq postatqa
+ps parisian
+pt present
+pu popplaud
+pw perrywoo
+px popplpfx
+py playbill
+pz poliphil
+qr quorum
+qt boulevar
+r0 romana
+r1 rotis
+r2 cantoria
+ra raleigh
+rm carmina
+ro rotis
+rp reporter
+rq russelsq
+rs arrus
+rt carta
+ru runic
+rv revue
+rw rockwell
+ry ryumin
+s0 sanmarco
+s1 scotchro
+s2 script
+s3 seagull
+s4 shotgun
+s5 snell
+s6 stuyvesa
+s7 sassoon
+sb sabon
+sc slimbach
+sf serifa
+sg serifgth
+sh shannon
+sk skia
+sl stencil
+sm spectrum
+sn spartan
+so sonata
+sp serpenti
+sr snellrnd
+ss stschnei
+st stone
+sv souvenir
+sw swing
+sx syntax
+sy symbol
+t0 tango
+t1 thunderb
+t2 typo
+tb bebodoni
+te timeseur
+tf tiffany
+tg tradegth
+ti techphon
+tj trajan
+tk tekton
+tl castella
+tm times
+to torino
+tp tempo
+tv trumpmed
+tw twentyc
+ty typewrit
+u0 columbus
+ub babodoni
+ug bengugth
+uh cushing
+ul universa
+um umbra
+un univers
+ur centaur
+ut utopia
+uw usherwoo
+uy universi
+v0 vineta
+va activa
+vc vectora
+vd vandijck
+vi victoria
+vj veljovic
+vl versaill
+vr vagrnd
+w0 weddingt
+wb walbaum
+wd weideman
+wg wlklgth
+wi wingding
+wk wilke
+wn windsor
+wr wittenbe
+ws weiss
+ww willow
+yg centuryg
+yh strayhor
+ym stymie
+za zantiqua
+zc zapfchan
+zd zapfding
+zg neuzeitg
+zt zeitgeis
diff --git a/fonts/utilities/vfinst/map.n2a b/fonts/utilities/vfinst/map.n2a
new file mode 100644
index 0000000000..6699a6265c
--- /dev/null
+++ b/fonts/utilities/vfinst/map.n2a
@@ -0,0 +1,1067 @@
+#############################################################
+##
+## This is the file map.n2a, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+## This is file map.n2a, version 1.00.
+## It maps fontnames (n) to
+## fontname abbreviations (a). This information was compiled
+## in February, 1997 from information gathered from the various
+## *.map files that accompany the fontname2.1 distribution
+## by Karl Berry.
+##
+ACaslon ac
+AGaramond ad
+Aachen aa
+AachenBT aa
+AachenBold aa
+AbacusFourSSi pi
+AbacusOneSSi pi
+AbacusThreeSSi pi
+AbacusTwoSSi pi
+Abadi ai
+AbadiMT ai
+Acanthus gl
+Activa va
+AdLib a3
+AdLibBTRegular a3
+Adsans a9
+Advisor lw
+AirfoilScriptSSi hm
+AkzidenzGrotesk az
+AlamoSSi cw
+Albertus al
+Aldine401BT bb
+Aldine721BT pn
+Aldus as
+Allegro a5
+AllegroBTRegular a5
+AlmanacMT pi
+AlternateGothicNo2 a4
+AlternateGothicNo2BTRegular a4
+Amasis a2
+AmasisMT a2
+Amazone mz
+AmazoneBTRegular mz
+Amelia a6
+AmeliaBTRegular a6
+AmercianGaramondBT g3
+AmericanGaramondBT g3
+AmericanText a7
+AmericanTextBTRegular a7
+AmericanTypewriter at
+Americana am
+AmericanaBT am
+Amerigo eo
+AmerigoBT eo
+Anna an
+Antiqua pq
+AntiqueOlive ao
+Apollo ap
+ApolloM ap
+AppleChancery ec
+AquaLifeMT pi
+ArabesqueOrnamentsOne pi
+Arcadia ar
+Arial a1
+ArialRoundedMT hr
+ArnoldBoecklin ab
+Arrus rs
+ArrusBT rs
+ArtDecoSSi ab
+AshleyScript ah
+AshleyScriptMT ah
+Assembly in
+Astute rw
+Atlantix mn
+AudioLH pi
+Auriol au
+Aurora a8
+AuroraBTBoldCondensed a8
+Austere lo
+AutomatonCaps mh
+AvantGarde ag
+Avenir av
+Axiomatic gg
+BBodoni tb
+BakerSignet bs
+BakerSignetBTRoman bs
+Balloon bo
+BalloonBT bo
+Banco bc
+BangaSSi dc
+BankGothic kg
+BankGothicBT kg
+Barrister bl
+Baskerville nb
+BaskervilleBE eb
+BaskervilleCyrillic bv
+BaskervilleMT bv
+BaubleSSiBlack ft
+BauerBodoni ub
+Bauhaus bh
+Bell be
+Belwe bl
+BelweBT bl
+Bembo bb
+Benguiat bg
+BenguiatBo bg
+BenguiatGothic ug
+Berkeley by
+Berling br
+Bernard bn
+BernardMTCondensed bn
+Bernhard b7
+BernhardModern b7
+Biffo bf
+BiffoMT bf
+BinghamScript b5
+Binner n1
+BinnyOldStyle b2
+BinnyOldStyleM b2
+Birch bi
+Bison b4
+Blackford tv
+Blackoak b0
+Blado b1
+Blippo b8
+BlippoBTBlack b8
+BlocSSiBold aa
+Block b6
+Blueprint p6
+BlueprintMT p6
+Bodoni bd
+BodoniBT bd
+BodoniCampanile bp
+BodoniMT bd
+BoffoSSi hb
+BonApetit pi
+BookAntiqua aq
+Bookman bk
+BookmanOldStyle ko
+Boost sp
+BorderPi pi
+BotanicalMT pi
+Boton bt
+Boulevard qt
+Braggadocio b3
+BravoScriptSSi sr
+Bremen b9
+BremenBTB b9
+Broadway bw
+Brush bu
+Brush445BT p3
+Brush445BTRegular p3
+Brush738BT b4
+Brush738BTRegularA b4
+BrushScript bu
+BrushScriptBTRegular bu
+BrushScriptMT bu
+BskvillExpMT bv
+Bulmer bm
+BulmerMT bm
+BundesbahnPi pi
+Caecilia il
+Calisto c1
+CalistoMT c1
+Calligraphic421BT c9
+Calligraphic421BTRomanB c9
+Calligraphic810BT di
+Calvert c8
+CalvertMT c8
+Candida ci
+Cantina iw
+Cantoria r2
+CantoriaMT r2
+Carmina rm
+CarminaBT rm
+Carolina c0
+Carta rt
+Cartographer rt
+Cascade cc
+CascadeScript cc
+Caslon ca
+Caslon540BT c5
+CaslonFiveForty c5
+CaslonFiveSS c5
+CaslonOpenFace ca
+CaslonThree c3
+CaslonThreeSS c3
+CaslonTitlingMT ca
+CaslonTwo c2
+CaslonTwoTwentyFour c2
+Castellar tl
+Caxton cx
+CentSchlbookPS nc
+Centaur ur
+Centennial ce
+Centric ex
+Century cn
+CenturyExpandedBT cn
+CenturyGothic yg
+CenturyMT cn
+CenturyOSMT cu
+CenturyOldStyle cu
+CenturyOldstyleBT cu
+CenturyReprise ce
+CenturyRetrospective cu
+CenturySchL nc
+CenturySchbookMT cs
+CenturySchoolbook cs
+CenturySchoolbookBT cs
+CenturySchoolbookReprise nc
+CenturySchoolbookSSi cs
+Charlemagne cg
+Charme hm
+Charter ch
+CharterBT ch
+Cheltenham ct
+CheltenhamBT ct
+Cheq cq
+ChessSSi cq
+Chicago c4
+Choc cz
+ChorusLineS rv
+CircleFrameMT pi
+CircleFrameNegMT pi
+City cy
+Clairvaux cv
+Clarendon cd
+ClarendonBT cd
+ClarendonMT cd
+Clarion c6
+ClarionMT c6
+ClassicSSi ip
+ClassicalGaramondBT sb
+Clearface cf
+ClearfaceGothicLH cf
+ClerestorySSi ln
+Cleric mt
+Cloister cl
+CloisterBlackBTRegular cl
+Cochin co
+Codex c9
+Coherent md
+Colmcille ol
+Colonna o3
+ColonnaMT o3
+Columbus u0
+Commerce tg
+CommercialPiBT pi
+CommercialScript i0
+CommercialScriptBTRegular i0
+CommercialScriptMT i0
+Compacta c7
+CompactaBT c7
+CompactaMTBold c7
+Compendium fn
+CompleatSSi pp
+ConcertoSSi so
+Concorde oc
+Conquista nf
+Context hv
+ContextInseratSSi hi
+ContextReprise hn
+ContextRounded hr
+Cooper cb
+CooperBT cb
+CooperBlac cb
+CooperSSiBlac cb
+Copperplate cp
+CopperplateGothicBT cp
+CopperplateT zpc
+Corona on
+Coronet ot
+CoronetMTBold ot
+CoronetScriptSSi ot
+CortexSSi br
+Cottonwood cw
+Countryside am
+Courier cr
+CourierTwelveMT cr
+Creme pg
+Criteria pl
+Cushing uh
+DINEngschrift eh
+DINMittelschrift ls
+DINNeuzeitGrotesk zg
+Dante dt
+DavidaBold d0
+DavidaBoldBTRegular d0
+Decade ao
+Decorated035BT pf
+Decorated035BTRegular pf
+Delima dm
+DelimaMT dm
+DellaRobbia de
+DellaRobbiaBT de
+Deutch ss
+DeutchGaramond eg
+DiamondBodoni pi
+DiamondNegative pi
+DiamondPositive pi
+Dingbats zd
+DinosaursMT pi
+Diotima di
+DirectionsMT pi
+Dolores dl
+Dom dc
+DomBoldBT dc
+DomCasual dc
+DomCasualBT dc
+DomDiagonal dc
+DomDiagonalBT dc
+DorchesterScript ds
+DorchesterScriptMT ds
+Doric dr
+DoricBold dr
+DucDeBerry dd
+Dutch801BT tm
+Dyname bh
+EECLHPi pi
+Eckmann ek
+Egyptian ee
+Egyptian505BT ee
+EgyptianExtended ee
+EgyptianMTExtended ee
+EgyptienneF ef
+Ehrhardt et
+Electra ea
+ElegantGaramondBT gj
+Ellington el
+EllingtonMT el
+Embassy e0
+EmbassyBTRegular e0
+Empire e1
+EmpireBTRegular e1
+English157 oe
+English157BTRegular oe
+Engravers en
+EngraversLHBoldFace en
+Engschrift eh
+Ensemble it
+Eras er
+Esprit ei
+Euler eu
+EuropeanPi pi
+Eurostile es
+Excelsior ex
+Exotic350BT pg
+Expo av
+Express az
+ExpressDecoSSi bg
+ExtensSSiBold dr
+Facade f2
+FacadeMTCondensed f2
+Facile sx
+Fairfield ff
+FairfieldLH ff
+Falstaff fs
+FelixTitling fx
+FelixTitlingMT fx
+Fenice fn
+Festival f3
+FestivalTitlingMT f3
+FetteFraktur ft
+Figaro fi
+FigaroMT fi
+Flareserif821BT al
+FlemishScript f0
+FlemishScriptBTRegular f0
+Flora fl
+FlorentineGaramondSSi ig
+Flyer fy
+Folio fo
+Footlight f4
+FootlightMT f4
+FormalScript421BT oi
+FormalScript421BTRegular oi
+FormatPiOneSSi pi
+FormatPiThreeSSi pi
+FormatPiTwoSSi pi
+Formata fa
+Forte fe
+ForteMT fe
+Fournier f1
+Fraktur ft
+FrakturBTRegular ft
+FrankGothMTExtraCondensed fg
+FranklinGothic fg
+Freeform710 ek
+Freeform710BTRegular ek
+Freeform721 au
+Freeform721BT au
+Freehand471BT cc
+Freehand471BTRegular cc
+Freehand521BT ma
+Freehand521BTRegularC ma
+Freehand575BT jf
+Freehand575BTRegularB jf
+Freehand591BT b5
+Freehand591BTRegularA b5
+FreestyleScript fs
+French f5
+FrenchScriptMT r5
+FrizQuadrata fq
+FrontierMT pi
+Frutiger fr
+Futura fu
+FuturaBlackBTRegular fu
+Galliard gl
+Gando g0
+GandoBTRegular g0
+Garamond gm
+GaramondReprise g3
+GaramondRetrospective sb
+GaramondThree g3
+GarthGraphic gg
+Geneva ge
+Geometric231BT kb
+Geometric415BT m2
+Geometric706BT nz
+GeometricSlab703BT mp
+GeometricSlab712BT rw
+Giddyup pi
+Gill gs
+GillAltOneMT gs
+GillSans gs
+Giovanni gv
+GiovanniB gv
+Glossary hg
+GloucesMT gr
+Gloucester gr
+Glypha gp
+GorillaITC g6
+GorillaITCbyBTRegular g6
+Gothic725BT az
+Gothic725BTB az
+Gothic821 b6
+Gothic821CondensedBTRegular b6
+GothicBBB gb
+GothicBBBMedium- zpg
+GothicThirteen g1
+Goudy gy
+GoudyCatalogue g5
+GoudyCatalogueBTRegular g5
+GoudyCatalogueM g5
+GoudyH gy
+GoudyModern g4
+GoudyOldStyle go
+GoudyOldStyleBT go
+GoudyOldStyleM go
+GoudyRetrospectiveSSi go
+GoudyText gt
+GoudyTextMT gt
+Grammateus cx
+Granjon gj
+Greco tm
+GrecoEuropaSSi te
+GrecoRecutSSi ns
+GrecoTen tt
+Grotesque gq
+Guardi gu
+HandelGothic h0
+HandelGothicBTRegular h0
+Hanseatic hs
+Headline hd
+HeadlineMTBold hd
+HeliosSSi tj
+Helvetica hv
+HelveticaInserat hi
+HelveticaInseratRoman hi
+HelveticaNeue hn
+HelveticaRounded hr
+HelveticaRoundedB hr
+Herculanum hc
+Hiroshige hg
+Hobo hb
+HoboBTRegular hb
+HoeflerText ht
+Holidays pi
+HorleyOSMT ho
+HorleyOldStyle ho
+HubbubSSi jp
+Humanist521BT gs
+Humanist777BT fr
+Humanist970BT a9
+HuxleyVertical hx
+HuxleyVerticalBTRegular hx
+ISILGothic lg
+Ibycus ib
+Imago im
+Impact ic
+ImpactMT ic
+Impress i1
+ImpressBTRegular i1
+Impressum ip
+Imprint ii
+Impuls i2
+ImpulsBTRegular i2
+InFractionSSi pi
+Incised901BT ao
+Industria in
+Industrial736BT to
+Inflex if
+InflexMTBold if
+Informal011BT nl
+InformaticsSSi oc
+IngenioSSi mx
+Insight lc
+Insignia ia
+Installation gp
+InterfaceSSi op
+Introit cd
+IntuitionSSi kr
+Ionic io
+IonicMT io
+IowanOldStyle iy
+IowanOldStyleBT iy
+Ironwood iw
+Italia it
+ItalianGaramond ig
+ItalianOldStyle is
+ItalianOldStyleMT is
+ItcEras er
+ItcKabel kb
+ItcSymbol sy
+Jaak mp
+Janson jn
+JansonText jn
+Jefferson jf
+Joanna jo
+JoannaMT jo
+JournalScriptSSi i0
+Juniper jp
+Kabel kb
+Kaufmann ku
+KaufmannBT ku
+Kernel ia
+Keyboard at
+KeyboardEliteSSi pe
+KeystrokesExtrasMT pi
+KeystrokesMT pi
+KeystrokesShadowExtrasMT pi
+KeystrokesShadowMT pi
+Kino kn
+KinoMT kn
+Klang kl
+KlangMT kl
+Korinna kr
+Kudos fu
+Kuenstler480BT tv
+KuenstlerScript ks
+Kuriakos bb
+LAstrologyPi pi
+LDecorationPi pi
+LGamePi pi
+LHolidayPi pi
+Lapidary333BT pp
+Latin li
+LatinExtraCondensedBTRegular li
+LatinMTCondensed li
+Layout fo
+Leawood lw
+LetterGothic lg
+LetterGothic12PitchBT lg
+LetterGothicMT lg
+Liberty l1
+LibertyBTRegular l1
+Libra l2
+LibraBTRegular l2
+LibreS ro
+LibreSemiS r1
+Life lf
+Lino ln
+Lithos lo
+LockupSSi on
+LubalinGraph lb
+Lucia l3
+LuciaBTRegular l3
+Lucian l4
+LucianBT l4
+Lucida lc
+LucidaBright lh
+LucidaFax lx
+LucidaSans ls
+Lutetia lt
+Lydian ly
+MAlbertus al
+MAvantGardeGothicPS ag
+MBookmanPS bk
+MBraggadocio b3
+MCastellar tl
+MCenturySchoolbook cs
+MCenturySchoolbookPS nc
+MCourierPS cr
+MGloucester gr
+MGoudyModer g4
+MGoudyText gt
+MICR zpm
+MICRSSi pm
+MOldStyle os
+MOnyx ox
+MSpartan sn
+MSymbolPS sy
+MTimesNewRomanCyrillic nt
+MTimesNewRomanGreek nt
+MZAntiqua za
+MZapfChanceryPS zc
+MZapfDingbatsPS zd
+MacedonSSi om
+Machine mh
+MacroSSi ng
+Madrone mr
+Malvern mv
+Mandate ma
+ManualSSi tk
+Marigold mg
+MarkerBoardDisplaySSi cz
+MathematicalPi pi
+MatiqueSSi ci
+Matura m7
+MaturaM m7
+Maximus mx
+Medici mi
+MediciScript mi
+Melior ml
+Melodies pi
+MemoScriptSSi hm
+Memphis mp
+MercuriusMTBoldScript me
+MercuriusScript me
+Meridien md
+Mermaid oi
+Mesouran st
+Mesquite mq
+Metro m2
+Metron sf
+MicrofineSSi lg
+MilestonesOneMT pi
+MilestonesTwoMT pi
+Minima es
+Minion mn
+Minister mt
+MiraraeBT m3
+Mirareae m3
+MisterEarl m4
+MisterEarlBTRegular m4
+Mistral ms
+Mittelschrift m6
+Modern mo
+Modern20BT mo
+Modern735 bp
+Modern735BTRomanA bp
+ModernMT mo
+Monaco mc
+MonasteryScriptSSi ln
+MonitorSSiBold b7
+MonitorSSiBoldItalic b7
+MonitorSSiItalic b7
+MonitorSSiNormal b7
+MonkeyBusiness pi
+MonolineScript m1
+MonolineScriptMT m1
+Monologue il
+Monospace m0
+Monospace821BT hv
+MonotypeOldStyle m8
+MonotypeOldStyleMTBoldOut m8
+MonotypeSorts pi
+MotifScriptSSi bu
+MurrayHill m5
+MurrayHillBTBold m5
+MusterSSi fq
+NanoScriptSSi fs
+NatureMT pi
+Neographik nk
+NeographikMT nk
+Neuland nl
+NeuzeitGrotesk zg
+NeuzeitS nz
+NeuzeitSBook nz
+NewAster na
+NewBaskerville nb
+NewBerolina nr
+NewBerolinaMT nr
+NewCaledonia nd
+NewCenturySchlbk nc
+NewClarendon nn
+NewClarendonMT nn
+News701BT io
+NewsGothic ng
+NewsGothicMT ng
+NewsPlantin np
+NewsPlantinMT np
+NewspaperPiBT pi
+Newton hv
+Nimbus nm
+NimbusMonL cr
+NimbusRomNo9L tm
+NimbusRoman tm
+NimbusSanL hv
+NimbusSans hv
+Nimrod ni
+NimrodMT ni
+Nofret nf
+Normande n0
+NormandeBT n0
+Novarese nv
+NumbusMonL cr
+NumbusSanL hv
+Nuptial nu
+NuptialBTRegular nu
+NuptialScript nu
+OCR-A oa
+OCR-B ob
+OCR1SSi oa
+OCR2SSi ob
+OCRA oa
+OCRAbyBTRegular oa
+OCRB ob
+OCRB10PitchBTRegular ob
+OceanSans o4
+OceanSansMT o4
+Octavian ov
+OctavianM ov
+OldDreadfulNo7 o0
+OldDreadfulNo7BTRegular o0
+OldEnglish oe
+OldEnglishTextMT oe
+OldStyle os
+OldStyleMT os
+OldStyleSeve o7
+OldStyleSeven o7
+OleScriptSSi cc
+Olympian oy
+OlympicLH oy
+OlympicLHPi pi
+Omega op
+Omnia om
+Ondine oi
+Onyx ox
+OnyxBTRegular ox
+Optima op
+Optimum op
+OptimumRomanItalic-DTC or
+Oranda o1
+OrandaBT o1
+Orato or
+Orator or
+OratorBT or
+OrbitB o2
+OrbitBbyBTRegular o2
+Orchid na
+OriginalGaramondBT eg
+OvalFrameMT pi
+OvalFrameNegativeMT pi
+OzHandicraft oz
+OzHandicraftBTRoman oz
+PTBarnumBTRegular pb
+PalaceScript p1
+PalaceScriptM p1
+Palatino pl
+Palette au
+Palindrome es
+Palma fr
+Palmspring pl
+Palton pl
+PaltonLight-DTC pl
+ParallaxSSi nz
+Parisian ps
+ParisianBTRegular ps
+ParkAvenue pa
+ParkAvenueBTRegular pa
+Parties pi
+Partition o7
+Peignot pg
+Pepita p2
+PepitaMT p2
+Performa kb
+Perpetua pp
+Perrywood pw
+PerrywoodMT pw
+PersuasionSSi bs
+Petrucchio pi
+PetticoatScriptSSi b7
+Photina ph
+PhotinaMT ph
+Pi pi
+PioneerITC p4
+PioneerITCbyBTRegular p4
+Piranesi p5
+PiranesiItalicBTRegular p5
+Placard pd
+PlacardMTCondensed pd
+Plantin pn
+Playbill py
+PlaybillBTRegular py
+PlaytimeMT pi
+PlugSSi mq
+PoeticaChancery pc
+Poliphilus pz
+Ponderosa po
+Poplar p0
+PopplLaudatio pu
+PopplPontifex px
+PostAntiqua pq
+PosterBodoniBT bd
+Present pt
+PrestigeElite pe
+Profil pf
+Profile pf
+ProseScriptSSi ku
+ProtocolSSi ml
+PtBarnum pb
+QuantaPiFiveSSi pi
+QuantaPiFourSSi pi
+QuantaPiOneSSi pi
+QuantaPiSixSSi pi
+QuantaPiThreeSSi pi
+QuantaPiTwoSSi pi
+QueBlackSSiExtraBold sh
+QueSSi sh
+QueSSiBold sh
+QueSSiItalic sh
+QuillScript ks
+QuintetSSi so
+Quorum qr
+Raleigh ra
+RaleighBT ra
+RecitalSSi to
+Recognita ra
+ReductoCondensedSSiCondensed eh
+ReductoSSi m6
+Reporter rp
+ReporterTwo rp
+ResourceSSi lf
+Revival565BT br
+Revue rv
+RevueBTRegular rv
+Ribbon131BT ot
+Rockwell rw
+RococoOrnamentsOne pi
+RococoOrnamentsTwo pi
+Romana r0
+RomanaBT r0
+Rotis ro
+RotisS ro
+RotisSemi r1
+RotisSemiS r1
+Runic ru
+RunicMTCondensed ru
+RussellSquar rq
+RussellSquare rq
+Ryumin ry
+RyuminLight- zpr
+Sabon sb
+SabonM sb
+SanMarco s0
+Sans hv
+Sassoon s7
+SassoonPrimary s7
+SaxNViolinsLightSSiLight so
+SaxNViolinsSSi so
+Schadow hw
+SchadowBTBlackCondensed hw
+ScotchRoman s1
+ScotchRomanM s1
+ScribeSSi or
+Script s2
+ScriptMTBold s2
+Scriptoria pc
+Seagull s3
+SeagullBT s3
+SenatusSSi cg
+SentinalSSi bi
+SerifGothic sg
+Serifa sf
+SerlioLH zps
+Serpentine sp
+Shannon sh
+Shelley zps
+ShoestringSS rq
+ShortHaulSSi ic
+Shotgun s4
+ShotgunB s4
+ShotgunBlanks s4
+SignsMT pi
+SimonciniGaramond ig
+Skia sk
+Slate rw
+Slimbach sc
+SlotSSiBlack p0
+Snell s5
+SnellBT s5
+SnellRoundhand sr
+SnippetScriptSSi pt
+Sonata so
+SonoranSansSerif hv
+SonoranSerif nt
+SophisticateSSi tf
+SouthwestOrnamentsMT pi
+Souvenir sv
+SpartaSSi hc
+Spartan sn
+SpartanFourMT sn
+SpartanOneThreeMT sn
+SpartanOneTwoMT sn
+SpartanThreeFourMT sn
+SpartanTwoFourMT sn
+Spectrum sm
+SpectrumM sm
+Speedo er
+SpiffyScriptSSi rp
+Spitbol ar
+SportsFour pi
+SportsOne pi
+SportsThree pi
+SportsTwo pi
+Square721BT es
+SquareFrameMT pi
+SquareFrameNegMT pi
+SquareSlabserif711BT cy
+Staccato222BT ms
+Staccato222BTRegular ms
+Staccato555BT cz
+Staccato555BTRegularA cz
+Stack qr
+StandardSymL sy
+StempelGaramond eg
+StempelSchneidler ss
+Stencil sl
+StencilBTRegular sl
+SterlingSSi oy
+Stone st
+Strayhorn yh
+StrayhornMT yh
+Stuyvesant s6
+StuyvesantBTRegular s6
+Stymie ym
+Swing sw
+SwingMTBold sw
+Swiss721BT hv
+Swiss721BTB hr
+Swiss911BT hv
+Swiss921BT hi
+Swiss921BTRegularA hi
+Swiss924BT hs
+Swiss924BTRegularB hs
+Symbol sy
+SymbolProportionalBT pi
+Syntax sx
+Tango t0
+TangoBTRegular t0
+TangoScript s5
+TechPhonetic ti
+Tekton tk
+Tempo tp
+TempoHeavyCondensed tp
+Terminus pn
+ThesisSSi co
+ThinxSSi sn
+Thunderbird t1
+ThunderbirdBTRegular t1
+Tiasco gj
+Tiffany tf
+Times tm
+TimesEuropa te
+TimesN ns
+TimesNR nt
+TimesNRExpertMT nt
+TimesNRMT nt
+TimesNRSevenMT nt
+TimesNewRoman nt
+TimesNewRomanMT nt
+TimesNewRomanPS ns
+TimesNewRomanSF nt
+TimesSmallTextMT tm
+Torino to
+TorrentGraphicSSi lb
+ToucheSSi ps
+TourinaSSi b7
+TradeGothic tg
+TradeGothicLH tg
+Trajan tj
+Tramp hb
+Transitional521BT ea
+Transitional551BT ff
+Transitional551BTMedium ff
+TransportMT pi
+Trendex ag
+Trident nv
+TrumpMediaeval tv
+TumbleweedSSi po
+TwCenMT tw
+TwentiethCentury tw
+Tycoon nd
+Typewriter ty
+TypoUpright t2
+TypoUprightBTRegular t2
+URWAntiqua aq
+URWBookmanL bk
+URWChanceryL zc
+URWChanceryLMediItal zc
+URWGothicL ag
+URWGrotesk gq
+URWPalladioL pl
+UbiqGothic sg
+Umbra um
+UmbraBTRegular um
+UnicornScriptSSi nu
+Univers un
+Universal ul
+UniversalGreekwithMathPi ul
+UniversalMath1BT pi
+UniversalNewswithCommPi zpu
+University uy
+UniversityRoman uy
+UniversityRomanBT uy
+UpscaleScriptSSi pa
+Usherwood uw
+Utopia ut
+VAGRounded vr
+VAGRoundedBTRegular vr
+VacationMT pi
+VanDijck vd
+Vectora vc
+VectoraLH vc
+Veljovic vj
+Venetian301BT ur
+Versailles vl
+Victoria vi
+VictoriaTitlingMTCondensed vi
+Vineta v0
+VinetaBTRegular v0
+WaifSSi ms
+Walbaum wb
+WantedPosterSSiBlack b0
+WarningLH pi
+WeddingT w0
+WeddingTextBTRegular w0
+Weidemann wd
+Weiss ws
+WilhelmKlingsporGotisch wg
+Wilke wk
+Willow ww
+Windsor wn
+WindsorBT wn
+WindsorMT wn
+Wingdings wi
+WitternbergerFrakt wr
+WitternbergerFraktMT wr
+WoodcutOrnamentsOneSSi pi
+WoodcutOrnamentsTwoSSi pi
+WoodtypeOrnaments pi
+ZAntiqua za
+ZapfCalligraphic801BT pl
+ZapfChancery zc
+ZapfChanceryPS zc
+ZapfDingbats zd
+ZapfDingbatsPS zd
+ZapfElliptical711BT ml
+ZapfHumanist601BT op
+Zeal pi
+Zeitgeist zt
+ZurichBT un
diff --git a/fonts/utilities/vfinst/map.sup b/fonts/utilities/vfinst/map.sup
new file mode 100644
index 0000000000..cbe5ace79a
--- /dev/null
+++ b/fonts/utilities/vfinst/map.sup
@@ -0,0 +1,31 @@
+#############################################################
+##
+## This is the file map.sup, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+## This file map.sup, version 1.00. It was compiled on February 1, 1997
+## from information in the file supplier.map which accompanies the
+## fontname2.1 distribution by Karl Berry. The three fields in this file
+## represent a supplier abbreviation, a directory name appropriate for
+## TDS TeX system, and a long name of the supplier.
+##
+9 unknown ----------------------
+a autologi Autologic
+b bitstrea Bitstream
+c cg Compugraphic
+d dtc Digital Typeface
+e apple Apple
+g gnu Free Software
+h bh Bigelow & Holmes
+i itc International Typeface
+k softkey SoftKey
+l linotype Linotype
+m monotype Monotype
+n ibm IBM
+o corel Corel
+p adobe Adobe
+s sun Sun
+t paragrap ParaGraph
+u urw URW
diff --git a/fonts/utilities/vfinst/minoff.mtx b/fonts/utilities/vfinst/minoff.mtx
new file mode 100644
index 0000000000..1563af4b2c
--- /dev/null
+++ b/fonts/utilities/vfinst/minoff.mtx
@@ -0,0 +1,44 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file minoff.mtx, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This file unsets all the lowercase glyphs (minoff=minuscules off).
+It is to be used with the fontinst package.
+
+\metrics
+
+\unsetglyph{a}
+\unsetglyph{b}
+\unsetglyph{c}
+\unsetglyph{d}
+\unsetglyph{e}
+\unsetglyph{f}
+\unsetglyph{g}
+\unsetglyph{h}
+\unsetglyph{i}
+\unsetglyph{j}
+\unsetglyph{k}
+\unsetglyph{l}
+\unsetglyph{m}
+\unsetglyph{n}
+\unsetglyph{o}
+\unsetglyph{p}
+\unsetglyph{q}
+\unsetglyph{r}
+\unsetglyph{s}
+\unsetglyph{t}
+\unsetglyph{u}
+\unsetglyph{v}
+\unsetglyph{w}
+\unsetglyph{x}
+\unsetglyph{y}
+\unsetglyph{z}
+
+\endmetrics
+
diff --git a/fonts/utilities/vfinst/numoff.mtx b/fonts/utilities/vfinst/numoff.mtx
new file mode 100644
index 0000000000..83b9dd7568
--- /dev/null
+++ b/fonts/utilities/vfinst/numoff.mtx
@@ -0,0 +1,26 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file numoff.mtx, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is a fontinst file to unset all the digits (numoff=numbers off).
+
+\metrics
+
+\unsetglyph{zero}
+\unsetglyph{one}
+\unsetglyph{two}
+\unsetglyph{three}
+\unsetglyph{four}
+\unsetglyph{five}
+\unsetglyph{six}
+\unsetglyph{seven}
+\unsetglyph{eight}
+\unsetglyph{nine}
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/osfon.mtx b/fonts/utilities/vfinst/osfon.mtx
new file mode 100644
index 0000000000..15cf6cad75
--- /dev/null
+++ b/fonts/utilities/vfinst/osfon.mtx
@@ -0,0 +1,34 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file osfon.mtx, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This fontints file is osfon.mtx; it turns on, so to speak,
+the Old Style Figures in a font---provided these glyphs exist!
+
+\metrics
+
+\setcommand\OldStyleFigure#1{%
+ \setglyph{#1oldstyle}
+ \glyph{#1}{1000}
+ \endsetglyph
+ \unsetglyph{#1}
+}
+
+\OldStyleFigure{zero}
+\OldStyleFigure{one}
+\OldStyleFigure{two}
+\OldStyleFigure{three}
+\OldStyleFigure{four}
+\OldStyleFigure{five}
+\OldStyleFigure{six}
+\OldStyleFigure{seven}
+\OldStyleFigure{eight}
+\OldStyleFigure{nine}
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/padalt.MTX b/fonts/utilities/vfinst/padalt.MTX
new file mode 100644
index 0000000000..02d036fde8
--- /dev/null
+++ b/fonts/utilities/vfinst/padalt.MTX
@@ -0,0 +1,35 @@
+\relax
+
+This is file padalt.mtx, part of vfinst. Its purpose is to set up acceptable
+kerning information for the alternate fonts in the Adobe Garamond (pad)
+font family. It should also serve as a template for making use of other
+alternate fonts in other font families (Acaslon, Monotype Bulmer, etc.).
+
+The alternate afm diles for this family use Adobe Standard Encoding---hiss, booo---
+instead of meaningful glyph names. That is `ct' is called `c', and so on. This
+may take additional work on the part of the user. For additional info, see either
+or both of the vinst docs and the book `TeX Unbound' (Alan Hoenig, Oxford Univ Pr,
+1998).
+
+\metrics
+
+\setcommand\Setrightkerning#1#2#3{
+ \ifisglyph{#1}\the\setrightkerning{#1}{#2}{#3}\fi}
+\setcommand\Setleftkerning#1#2#3{
+ \ifisglyph{#1}\the\setleftkerning{#1}{#2}{#3}\fi}
+
+\setleftkerning#1#2#3{
+ \ifisglyph{#1}\then\setkern{#1}{#2}{#3}\fi}
+\Setleftkerning{aswash}{a}{1000}
+\Setleftkerning{ct}{c}{1000}
+\Setrightkerning{ct}{t}{1000}
+\Setleftkerning{eswash}{e}{1000}
+\Setleftkerning{nswash}{n}{1000}
+\Setleftkerning{rswash}{r}{1000}
+\Setleftkerning{st}{s}{1000}
+\Setrightkerning{st}{t}{1000}
+\Setleftkerning{tswash}{t}{1000}
+\Setleftkerning{tswashalt}{t}{1000}
+\Setleftkerning{vswash}{v}{1000}
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/smcapon.mtx b/fonts/utilities/vfinst/smcapon.mtx
new file mode 100644
index 0000000000..656bbecc5c
--- /dev/null
+++ b/fonts/utilities/vfinst/smcapon.mtx
@@ -0,0 +1,53 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file smcapon.mtx, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This is file smcapon.mtx, a fontinst metric file to
+``turn on'' small caps in a font.
+
+\metrics
+
+\setglyph{Asmall}
+ \glyph{a}{1000}
+\endsetglyph
+
+\setcommand\SmallCapFrom#1#2{% eg., \SmallCapFrom{A}{a}
+ \setglyph{#1}
+ \glyph{#2}{1000}
+ \endsetglyph
+}
+
+\SmallCapFrom{Asmall}{a}
+\SmallCapFrom{Bsmall}{b}
+\SmallCapFrom{Csmall}{c}
+\SmallCapFrom{Dsmall}{d}
+\SmallCapFrom{Esmall}{e}
+\SmallCapFrom{Fsmall}{f}
+\SmallCapFrom{Gsmall}{g}
+\SmallCapFrom{Hsmall}{h}
+\SmallCapFrom{Ismall}{i}
+\SmallCapFrom{Jsmall}{j}
+\SmallCapFrom{Ksmall}{k}
+\SmallCapFrom{Lsmall}{l}
+\SmallCapFrom{Msmall}{m}
+\SmallCapFrom{Nsmall}{n}
+\SmallCapFrom{Osmall}{o}
+\SmallCapFrom{Psmall}{p}
+\SmallCapFrom{Qsmall}{q}
+\SmallCapFrom{Rsmall}{r}
+\SmallCapFrom{Ssmall}{s}
+\SmallCapFrom{Tsmall}{t}
+\SmallCapFrom{Usmall}{u}
+\SmallCapFrom{Vsmall}{v}
+\SmallCapFrom{Wsmall}{w}
+\SmallCapFrom{Xsmall}{x}
+\SmallCapFrom{Ysmall}{y}
+\SmallCapFrom{Zsmall}{z}
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/uline.mtx b/fonts/utilities/vfinst/uline.mtx
new file mode 100644
index 0000000000..16a7a7fecf
--- /dev/null
+++ b/fonts/utilities/vfinst/uline.mtx
@@ -0,0 +1,305 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file uline.mtx, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\relax
+
+This files underlines all the glyphs mentioned in either of the files
+OT1.etx or T1.etx.
+
+\metrics
+
+\setcommand\uline#1{% underlining
+ \ifisglyph{#1}\then
+ \resetglyph{#1}
+ \push\moveup{-150}\glyphrule{\width{#1}}{40}\pop
+ \glyph{#1}{1000}
+ \endresetglyph
+ \fi
+}
+
+\uline{AE}
+\uline{Aacute}
+\uline{Abreve}
+\uline{Acircumflex}
+\uline{Adieresis}
+\uline{Agrave}
+\uline{Aogonek}
+\uline{Aring}
+\uline{Atilde}
+\uline{A}
+\uline{B}
+\uline{Cacute}
+\uline{Ccaron}
+\uline{Ccedilla}
+\uline{C}
+\uline{Dcaron}
+\uline{Delta}
+\uline{D}
+\uline{Eacute}
+\uline{Ecaron}
+\uline{Ecircumflex}
+\uline{Edieresis}
+\uline{Egrave}
+\uline{Eogonek}
+\uline{Eth}
+\uline{E}
+\uline{F}
+\uline{Gamma}
+\uline{Gbreve}
+\uline{G}
+\uline{H}
+\uline{IJ}
+\uline{Iacute}
+\uline{Icircumflex}
+\uline{Idieresis}
+\uline{Idotaccent}
+\uline{Igrave}
+\uline{I}
+\uline{J}
+\uline{K}
+\uline{Lacute}
+\uline{Lambda}
+\uline{Lcaron}
+\uline{Lslash}
+\uline{L}
+\uline{M}
+\uline{Nacute}
+\uline{Ncaron}
+\uline{Ng}
+\uline{Ntilde}
+\uline{N}
+\uline{OE}
+\uline{Oacute}
+\uline{Ocircumflex}
+\uline{Odieresis}
+\uline{Ograve}
+\uline{Ohungarumlaut}
+\uline{Omega}
+\uline{Oslash}
+\uline{Otilde}
+\uline{O}
+\uline{Phi}
+\uline{Pi}
+\uline{Psi}
+\uline{P}
+\uline{Q}
+\uline{Racute}
+\uline{Rcaron}
+\uline{R}
+\uline{SS}
+\uline{Sacute}
+\uline{Scaron}
+\uline{Scedilla}
+\uline{Sigma}
+\uline{S}
+\uline{Tcaron}
+\uline{Tcedilla}
+\uline{Theta}
+\uline{Thorn}
+\uline{T}
+\uline{Uacute}
+\uline{Ucircumflex}
+\uline{Udieresis}
+\uline{Ugrave}
+\uline{Uhungarumlaut}
+\uline{Upsilon1}
+\uline{Uring}
+\uline{U}
+\uline{V}
+\uline{W}
+\uline{Xi}
+\uline{X}
+\uline{Yacute}
+\uline{Ydieresis}
+\uline{Y}
+\uline{Zacute}
+\uline{Zcaron}
+\uline{Zdotaccent}
+\uline{Z}
+\uline{aacute}
+\uline{abreve}
+\uline{acircumflex}
+%\uline{acute}
+\uline{adieresis}
+\uline{ae}
+\uline{agrave}
+\uline{ampersand}
+\uline{aogonek}
+\uline{aring}
+\uline{asciicircum}
+\uline{asciitilde}
+\uline{asterisk}
+\uline{atilde}
+\uline{at}
+\uline{a}
+\uline{backslash}
+\uline{bar}
+\uline{braceleft}
+\uline{braceright}
+\uline{bracketleft}
+\uline{bracketright}
+%\uline{breve}
+\uline{b}
+\uline{cacute}
+\uline{caron}
+\uline{ccaron}
+\uline{ccedilla}
+%\uline{cedilla}
+%\uline{circumflex}
+\uline{colon}
+\uline{comma}
+\uline{compwordmark}
+\uline{c}
+\uline{dbar}
+\uline{dcaron}
+%\uline{dieresis}
+\uline{dollar}
+%\uline{dotaccent}
+\uline{dotlessi}
+\uline{dotlessj}
+\uline{d}
+\uline{eacute}
+\uline{ecaron}
+\uline{ecircumflex}
+\uline{edieresis}
+\uline{egrave}
+\uline{eightoldstyle}
+\uline{eight}
+\uline{eogonek}
+\uline{equal}
+\uline{eth}
+\uline{exclamdown}
+\uline{exclam}
+\uline{e}
+\uline{ffi}
+\uline{ffl}
+\uline{ff}
+\uline{fiveoldstyle}
+\uline{five}
+\uline{fi}
+\uline{fl}
+\uline{fouroldstyle}
+\uline{four}
+\uline{f}
+\uline{gbreve}
+\uline{germandbls}
+%\uline{grave}
+\uline{greater}
+\uline{guillemotleft}
+\uline{guillemotright}
+\uline{guilsinglleft}
+\uline{guilsinglright}
+\uline{g}
+%\uline{hungarumlaut}
+\uline{hyphenchar}
+\uline{hyphen}
+\uline{h}
+\uline{iacute}
+\uline{icircumflex}
+\uline{idieresis}
+\uline{igrave}
+\uline{ij}
+\uline{i}
+\uline{j}
+\uline{k}
+\uline{lacute}
+\uline{lcaron}
+\uline{less}
+%\uline{lslashslash}
+\uline{lslash}
+\uline{l}
+%\uline{macron}
+\uline{m}
+\uline{nacute}
+\uline{ncaron}
+\uline{ng}
+\uline{nineoldstyle}
+\uline{nine}
+\uline{ntilde}
+\uline{numbersign}
+\uline{n}
+\uline{oacute}
+\uline{ocircumflex}
+\uline{odieresis}
+\uline{oe}
+\uline{ogonek}
+\uline{ograve}
+\uline{ohungarumlaut}
+\uline{oneoldstyle}
+\uline{one}
+\uline{oslash}
+\uline{otilde}
+\uline{o}
+\uline{parenleft}
+\uline{parenright}
+\uline{percent}
+\uline{period}
+\uline{perthousandzero}
+\uline{plus}
+\uline{punctdash}
+\uline{p}
+\uline{questiondown}
+\uline{question}
+\uline{quotedblbase}
+\uline{quotedblleft}
+\uline{quotedblright}
+\uline{quotedbl}
+\uline{quoteleft}
+\uline{quoteright}
+\uline{quotesinglbase}
+\uline{q}
+\uline{racute}
+\uline{rangedash}
+\uline{rcaron}
+\uline{ringfitted}
+%\uline{ring}
+\uline{r}
+\uline{sacute}
+\uline{scaron}
+\uline{scedilla}
+\uline{section}
+\uline{semicolon}
+\uline{sevenoldstyle}
+\uline{seven}
+\uline{sixoldstyle}
+\uline{six}
+\uline{slash}
+\uline{sterling}
+\uline{s}
+\uline{tcaron}
+\uline{tcedilla}
+\uline{thorn}
+\uline{threeoldstyle}
+\uline{three}
+%\uline{tilde}
+\uline{twooldstyle}
+\uline{two}
+\uline{t}
+\uline{uacute}
+\uline{ucircumflex}
+\uline{udieresis}
+\uline{ugrave}
+\uline{uhungarumlaut}
+%\uline{underscore}
+\uline{uring}
+\uline{u}
+\uline{visiblespace}
+\uline{v}
+\uline{w}
+\uline{x}
+\uline{yacute}
+\uline{ydieresis}
+\uline{y}
+\uline{zacute}
+\uline{zcaron}
+\uline{zdotaccent}
+\uline{zerooldstyle}
+\uline{zero}
+\uline{z}
+
+\endmetrics
diff --git a/fonts/utilities/vfinst/vfinst b/fonts/utilities/vfinst/vfinst
new file mode 100644
index 0000000000..964027dd72
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst
@@ -0,0 +1,52 @@
+#!/usr/local/bin/perl
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "1.00",
+### date = "August 1998",
+### filename = "vfinst",
+### address = "Department of Mathematics,
+### John Jay College,
+### 445 West 59 Street,
+### New York, NY 10019, USA",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### keywords = "AFM, virtual fonts, fonts, PostScript, TeX",
+### supported = "yes",
+### abstract = "This file prints an introduction and quick guide
+### to the use of VFinst.
+### See accompanying file vfinst.tex for
+### additional details.",
+### package = "vfinst",
+### }
+### ====================================================================
+
+ $now =<<"EndNow";
+
+
+The VFinst package helps you install (make ready to use) fonts for
+TeX and LaTeX using the virtual font (vf) mechanism. You
+need the Perl utility, the fontinst package, and TeX to use this
+package.
+
+Begin by placing copies of all outline fonts with their
+matching afm files in the VFinst work directory. Each font-afm
+pair of files must have the same file name. Start the process by
+executing the command
+
+ perl ../1vfinst
+
+or maybe just `../1vfinst' (assuming Unix conventions and that this
+material is found in the parent directory to the work directory).
+1vfinst will tell you what to do next, but please consider reading the
+file `vfinst.tex' (part of the VFinst package) for additional information.
+
+(This brief introduction is stored in the file `vfinst.go'.
+
+
+EndNow
+
+open(OUT, ">vfinst.go");
+print OUT $now;
+print $now;
+close OUT;
diff --git a/fonts/utilities/vfinst/vfinst.dos b/fonts/utilities/vfinst/vfinst.dos
new file mode 100644
index 0000000000..8ab260883b
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.dos
@@ -0,0 +1,74 @@
+#############################################################
+##
+## This is the file vfinst.par, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## These parameters need to be set for your system.
+## The statements will be read by Perl, so they require that you
+## follow Perl syntax. Fortunately, this isn't hard. Follow
+## these tips, and also use the statements in the distribution file
+## as models.
+##
+## * The Perl comment character is the hash mark #, so everything
+## following this is ignored. (It's just like the % in TeX and
+## LaTeX.)
+## * All Perl staments end with a semicolon `;'.
+## * The Perl variable names you set here must all begin with
+## the dollar sign `$'.
+## * When an alphanumeric string is assigned to a variable, the string
+## must be surrounded in double quotes, like "this".
+##
+## DOS Users: As you know, the path separator symbol is the backslash.
+## For technical reasons, this must be entered as \\ when used in
+## a variable.
+##
+
+## NONE of the path are allowed to end in a (back)slash!!!
+
+## EVERYONE needs to set these...
+
+ $vfencoding = " "; # where is the file 8r.enc?
+## If your system is smart enough to know where 8r.enc is, you don't
+## need any explicit directory.
+ $vfenc = "OT1"; # or maybe "ot1" or "T1" or "t1"
+
+## If you are running a TDS system, uncomment the
+## next statement.
+
+ $vftexmf = "e:\\texmf";
+
+## If you are running a `traditional' TeX system, you'll need to
+## supply the following information...
+
+ $vfmapdir = "\\tex\\ps"; # where is psfonts.map?
+ $vfinputs = "\\tex\\inputs"; # Where do fd files belong?
+ $vfvf = "\\tex\\fonts\\vf"; # where do vf's go?
+ $vftfm = "\\tex\\fonts\\tfm"; # and tfm's?
+ $vfpsfonts = "\\psfonts"; # where are all the outline fonts?
+ $vfafm = "\\psfonts\\afm"; # ...and the matching afm's?
+
+# The following are for `wizards only'...
+
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR UNIX:
+# ********************************************
+## $sep = "/"; # path separator
+## $copy = "cp"; # copy command
+## $del = "rm"; # file delete command
+## $mv = "mv"; # command to move files
+## $ren = "mv"; # how to rename files
+## $rem = "##"; # comments in system files
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR DOS:
+# ********************************************
+ $sep = "\\";
+ $copy = "copy";
+ $del = "del";
+ $mv = "move";
+ $ren = "ren";
+ $rem = "REM";
+# ********************************************
+
diff --git a/fonts/utilities/vfinst/vfinst.lib b/fonts/utilities/vfinst/vfinst.lib
new file mode 100644
index 0000000000..10a3a307c0
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.lib
@@ -0,0 +1,430 @@
+### ====================================================================
+### @Perl-file{
+### author = "Alan Hoenig",
+### version = "1.00",
+### date = "August 1998",
+### filename = "vfinst.lib",
+### address = "Department of Mathematics,
+### John Jay College,
+### 445 West 59 Street,
+### New York, NY 10019, USA",
+### email = "ajhjj@cunyvm.cuny.edu",
+### codetable = "ISO/ASCII",
+### keywords = "AFM, virtual fonts, fonts, PostScript, TeX",
+### supported = "yes",
+### abstract = "This is a library of common routines in
+### use by the vfinst package.
+### See accompanying file vfinst.tex for
+### additional details.",
+### package = "vfinst",
+### }
+### ====================================================================
+
+## Sloppy fonts: adjust this list CAREFULLY if necessary...
+@sloppy_afms=(
+ "pad", # Adobe Garamond
+ "pmn", # Adobe Minion
+ "bch", # Bitsteam Chiani
+ "hlh", # Lucida Bright
+ "mbu", # Monotype Bulmer: my idiosyncratic name
+ "mbm", # Monotype Bulmer: the proper d esignation!
+ );
+
+## Some misc constants and constructs ...
+
+$ver = "1.00"; # vfinst version number (DOS or Unix!)
+
+$false = 0; # these are valid for numeric tests only.
+$true = 1;
+
+$root = $sep; # the root directory for your system
+
+$vfp = "VFinst$ver + Perl$]";
+
+$pi = atan2(1,1) * 4;
+$piover180 = $pi/180;
+
+$currentlyslanted = 1; # used in 2vfinst
+$currentlyupright = 0;
+
+$defaultslant = "167"; # as per Computer Modern fonts...
+
+$eightR = "\"TeXBase1Encoding ReEncodeFont\" <8r.enc";
+
+## We need `manifests'---lists of files that belong with each module---so
+## we can verify that the package is properly installed.
+
+@VFINSTmanifest = (
+ "1vfinst",
+ "2vfinst",
+ "vfinst.lib",
+ "vfinst.par",
+ "vfinst.rc",
+ "famnames",
+ "map.a2d",
+ "map.n2a",
+ "map.sup",
+ "dotlessj.mtx",
+ "uline.mtx",
+);
+
+## Now for some common routines.
+
+## Let's get the date and time.
+
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+$curmonth =
+ (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)[$mon];
+$curday = (Sun, Mon, Tues, Wednes, Thurs, Fri, Satur)[$wday];
+$mday = "0$mday" if $mday < 10;
+$curdate = "$mday $curmonth $year";
+$today = $curdate;
+$hour = "0".$hour if $hour < 10;
+$min = "0".$min if $min < 10;
+$now = $hour.":".$min.":".$sec;
+
+sub scale{# divides two numbers, multiplies by 1000, and int's it.
+ local($temp) = 1000 * $_[0]/$_[1] + 0.5;
+ int($temp);
+}
+
+sub smul{# scaled multiplication
+ local($temp) = $_[0]/1000 * $_[1];
+ int($temp);
+}
+
+sub isTDS{
+ defined($vftexmf);
+}
+
+sub isfile{
+ -e $_[0];
+}
+
+sub isfileorlink{
+ -e $_[0] || -l $_[0];
+}
+
+sub isdir{
+ -d $_[0];
+}
+
+sub isvariable{
+ defined($_[0]);
+}
+
+sub stdin{# replaces calls to <STDIN>; checks for only word characters
+ local $value = <STDIN>; ## scalar context assumed...
+ chomp $value;
+ while ($value =~ /\W/) {# non-word char found!
+ print "\nWord characters only are allowed---please try again. >>";
+ $value = <STDIN>; chomp $value;
+ }
+ $value;
+}
+
+sub copy{
+ open(IN, $_[0]) ||
+ die "Can't find target $_[0] to copy!\n ..."; # the source
+ open(OUT, ">$_[1]"); # the target
+ while (<IN>) {print OUT $_;}
+ close IN; close OUT;
+}
+
+sub wlog{# write to a log file only
+ foreach $elem (@_) {
+ print LOG $elem;
+ }
+ print LOG "\n"; # print final newline
+}
+sub display{# print to console only
+ foreach $elem (@_) {
+ print $elem;
+ }
+ print "\n"; # print final newline
+}
+
+sub reassure{
+ print
+ "(This information appears in the log file 'vfinst.vlg' and in file(s)";
+ foreach $file (@_) {
+ print " $file";
+ }
+ print ".)\n";
+}
+
+sub dwlog{# display on console and write to log file
+ &wlog(@_);
+ &display(@_);
+}
+
+sub OpenLog{
+ open (LOG, ">vfinst.vlg");
+ &dwlog("This is VFinst$ver + Perl$] on ${curday}day, $today, at $now.\n");
+}
+sub appendlog{ # called only by script 2vfinst
+ open (LOG, ">>vfinst.vlg");
+}
+sub CloseLog{
+ close LOG;
+}
+
+sub getTDSplaces{ # derives some parameters for TDS systems...
+ $vfinputs = "$vftexmf${sep}tex${sep}latex${sep}vfinst"; # for .fd files
+ $vfmapdir = "$vftexmf${sep}dvips${sep}base";
+}
+
+sub printarray{
+ local($tmp,*foo)=@_;
+ local($tmps);
+ $tmps = join(' ',@foo);
+ $tmps = "Empty array." unless $#foo >= 0;
+ print "$tmp$tmps\n";
+}
+
+## Func listcompare takes 2 args: an original (standard) list name,
+## and an `other' one, which we will compare to the original. A
+## final array to hold the members of the other which aren't in the
+## original (orphans): @missignfonts=&listcompare(*afmfiles,*allfonts);
+
+sub listcompare{
+ local(*original, *other) = @_;
+ local($i, $j, $present, $tmp, @orphans);
+ $tmp = "";
+ foreach $i (@other) {
+ $present = $false;
+ foreach $j (@original) {
+ next unless $i eq $j;
+ $present = $true;
+ }
+ if ($present == $false) {
+ $tmp = "$tmp$i:";
+ }
+ }
+ chop $tmp;
+ split(/:/, $tmp);
+}
+
+sub verifydirs{
+ foreach $directory (@_) {
+ &verifydir($directory);
+ }
+}
+sub verifydir{
+ if (&isdir($_[0])) {} else {# missing directory
+ $errorcount++; # bump up counter
+ push(@missdirs, $_[0]);
+ }
+}
+sub verifyfile{
+ die "Aargh---I can't find file $_[0]. $!\n"
+ unless &isfileorlink($_[0]);
+}
+sub verifyfiles{
+ foreach $file (@_) {
+ &verifyfile($file);
+ }
+ &display("All files in place.");
+}
+
+## This subroutine takes 2 args---a string, and a number. It pads
+## the string with spaces on the right. The padded string has the length
+## given by the second argument. Eg: &rpad($rawfont, 10);
+
+sub rpad{# right pads $_[0] to a length of $_[2]
+ local($s,$n)=@_; local($l)=length($s);
+ $s .= " " x ($n-$l);
+ $_[0]=$s;
+}
+
+## like rpad, but pads on the left
+
+sub lpad{# left pads $_[0] to a length of $_[2]
+ local($s,$n)=@_; local($l)=length($s);
+ $s = " " x ($n-$l) . $s;
+ $_[0]=$s;
+}
+
+# This canonizes a string by removing all spaces and white space
+# from the string, and transforming all characters to lower case.
+# Eg.: &canonize($fontname);
+
+sub canonize{ # make arg lower case, and remove spaces
+ $_[0] =~ tr/A-Z/a-z/;
+ $_[0] =~ s/\s//g;
+}
+
+# This canonizes a string by removing all spaces and white space
+# from the string. Uppercase letters remain.
+# Eg.: &Canonize($fontname);
+
+sub Canonize{ # remove all white space
+ $_[0] =~ s/\s//g;
+}
+
+sub PrepareToFinish{
+ print CLN $cleanuptext;
+ open (BAT, ">finish.bat");
+ print BAT $finishtext;
+}
+
+## Here follow several tables of fontname-specific information. I hope
+## that these tabular formulations will make it easy to revise this
+## information in the event that the fontname conventions change, or
+## categories do.
+
+## Here is a table of font weights and single char
+## weight indicators. The weights were compiled from
+## the fontname weight.map file and my own analysis of
+## 927 afm files on my system. Weights on the same line have
+## the indicator given at the beginning of the line.
+## All weights are canonized by converting to lowercase and
+## removing spaces. Notice we allow for misspellings!
+
+@weights = (
+ "0 a thin hairline",
+ "1 j extralight",
+ "2 l light",
+ "3 r regular roman normal standard",
+ "4 k book",
+ "5 m medium",
+ "6 d demi demibold",
+ "7 p poster",
+ "8 s semibold",
+ "9 b bold bld blditlic boldcondensed bolditalic",
+ "A h heavy heavyface",
+ "B c black",
+ "C u ultra ultrablack",
+ "D x extrabold extrablack",
+ );
+
+@nfssweights = ( # matching fontname weights to NFSS weights
+ "a ul",
+ "j el",
+ "l l",
+ "r m",
+ "m md", # medium series = md (is this OK?)
+ "k bk", # AH book series
+ "d db",
+ "s sb",
+ "p sb", # what is poster weight?
+ "b b",
+ "h b", # how does heavy differ from bold?
+ "c bl", # AH black series
+ "x eb",
+ "u ub",
+);
+## (In the above weights, I've tried to make sure that every font
+## weight from fontname has some kind of equivalent NFSS series
+## indicator. In several cases, I've simply guessed. In other
+## cases (marked by `# AH'), I've made up my own series classes.
+## This should all be checked and/or revised.)
+
+sub loadweightinfo{
+ foreach $elem (@weights) {
+ local($sortkey, $ind, $synonymlist) = split(/ /, $elem, 3);
+ $wt{$sortkey} = $ind; # index weight abbrevs by sort key
+ local(@synonyms) = split(/ /, $synonymlist);
+ foreach $synonym (@synonyms) {
+ $weightsortkey{$synonym} = $sortkey;
+ $weightindicator{$synonym} = $ind;
+ }
+ }
+ foreach $line (@nfssweights) {
+ ($w,$tmp) = split(/ /, $line);
+ $nfssweight{$w} = $tmp;
+ }
+}
+
+@shapes=(
+ "0 r roman regular",
+ "4 di italicdisplay",
+ "1 i italic kursiv ital itlic",
+ "2 o oblique obl slanted",
+ "3 d capitals display titling caption headline",
+ "3 d tallcaps swashcaps lombardiccaps",
+ );
+
+@nfssshapes = ( # Relating fontname shapes to NFSS shapes
+ "r n", # (This table should probably be expanded.)
+ "i it",
+ "o sl",
+ "c sc",
+ "sc sc",
+ "si si", # new shape: small cap italics
+ "u ui",
+ "d t", # new shape: titling or capitals
+ "di ti", # new shape: italic display
+ "n un", # new shape: underline upright
+ "ni ni", # new shape: underline italic
+);
+
+sub loadshapeinfo{
+ foreach $elem (@shapes) {
+ local($sortkey, $ind, $synonymlist) = split(/ /, $elem, 3);
+ $shp[$sortkey] = $ind; # index shape abbrevs by sort key
+ local(@synonyms) = split(/ /, $synonymlist);
+ foreach $syn (@synonyms) {
+ $shapesortkey{$syn} = $sortkey;
+ $shapeindicator{$syn} = $ind;
+ }
+ }
+ foreach $line (@nfssshapes) {
+ ($sh, $tmp) = split(/ /, $line);
+ $nfssshape{$sh} = $tmp;
+ }
+}
+
+## Fontname 2.1 considers variant information and encoding together.
+## Here, we need to consider them together for purposes of sorting,
+## but we need to segregate them when thinking about naming the raw
+## fonts. We'll organize the raw data in tabular form (as in the
+## weight table above). An extra field will indicate whether the
+## variant is `shape-like' (like italic or oblique) which precedes the
+## encoding digit or encoding-like, in which case the variant enters
+## into combination with the encoding digit.
+
+## Each uncommented line in this table contains 3 or more
+## fields. The second categorizes the variant:
+## E = encoding-like variant
+## S = shape-like variant
+## The first gives the sorting key, and the third
+## gives the fontname2.1 symbol, and the remaining fields
+## yield keywords that might appear in a fontname to identify the type
+## of variant.
+
+## NOTE ON BITSTREAM TYPOGRAPHER FONTS: These appear not to be well-
+## known. There are no expert fonts, and small caps fonts contain
+## what you expect---small caps! Ligatures are in so-called ``extension
+## fonts,'' and these font families may also contain alternate
+## or swash fonts. On my own recognizance, I use ``8q'' as the encoding
+## for the extension fonts.
+
+@variants = (
+ "0 S r regular",
+ "1 E x expert exp",
+ "2 S c smallcap SC smcap",
+ "3 E q extension oldstyle", # for BitStream extension fonts
+ "4 E a alt alternate alternative ",
+ "5 E d osf oldstylefigure", # encoding digit is 7
+ "6 E f fraction frac", # encoding digit is 7
+ #"7 S d display titling caption headline tallcaps swashcaps lombardiccaps",
+ "8 S p ornament thing thang",
+ "9 S k greek",
+ "A E c dfr", # encoding digit is 7
+ "B S s gothic sans",
+ "C S w script handwritten swash calligraphy cursive tango",
+ );
+sub loadvariantinfo{
+ foreach $elem (@variants) {
+ $elem =~ s/\s+/ /g;
+ local($sortkey, $enc, $ind, $synonymlist) = split(/ /, $elem, 4);
+ local(@synonyms) = split(/ /, $synonymlist);
+ foreach $syn (@synonyms) {
+ $variantsortkey{$syn} = $sortkey;
+ $variantindicator{$syn} = $ind;
+ $variantenctype{$syn} = $enc;
+ }
+ }
+}
+
diff --git a/fonts/utilities/vfinst/vfinst.par b/fonts/utilities/vfinst/vfinst.par
new file mode 100644
index 0000000000..719a6adbec
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.par
@@ -0,0 +1,75 @@
+#############################################################
+##
+## This is the file vfinst.par, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## These parameters need to be set for your system.
+## The statements will be read by Perl, so they require that you
+## follow Perl syntax. Fortunately, this isn't hard. Follow
+## these tips, and also use the statements in the distribution file
+## as models.
+##
+## * The Perl comment character is the hash mark #, so everything
+## following this is ignored. (It's just like the % in TeX and
+## LaTeX.)
+## * All Perl staments end with a semicolon `;'.
+## * The Perl variable names you set here must all begin with
+## the dollar sign `$'.
+## * When an alphanumeric string is assigned to a variable, the string
+## must be surrounded in double quotes, like "this".
+##
+## DOS Users: As you know, the path separator symbol is the backslash.
+## For technical reasons, this must be entered as \\ when used in
+## a variable.
+##
+
+## NONE of the path are allowed to end in a (back)slash!!!
+
+## EVERYONE needs to set these...
+
+ $vfencoding = " "; # where is the file 8r.enc?
+## If your system is smart enough to know where 8r.enc is, you don't
+## need any explicit directory.
+ $vfenc = "OT1"; # or maybe "ot1" or "T1" or "t1"
+
+## If you are running a TDS system, uncomment the
+## next 2 statements.
+
+ $vftexmf = "e:/texmf"; # where is texmf root?
+
+## If you are running a `traditional' TeX system, you'll need to
+## supply the following information...
+
+ $vfmapdir = "e:/texmf/dvips/base"; # where is psfonts.map?
+ $myroot = "e:/texmf/tdsoff"; # some shorthand...
+ $vfinputs = "$myroot/inputs"; # Where do fd files belong?
+ $vfvf = "$myroot/vf"; # where do vf's go?
+ $vftfm = "$myroot/tfm"; # and tfm's?
+ $vfpsfonts = "$myroot/psfonts"; # where are all the outline fonts?
+ $vfafm = "$myroot/afm"; # ...and the matching afm's?
+
+# The following are for `wizards only'...
+
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR UNIX:
+# ********************************************
+ $sep = "/"; # path separator
+ $copy = "cp"; # copy command
+ $del = "rm"; # file delete command
+ $mv = "mv"; # command to move files
+ $ren = "mv"; # how to rename files
+ $rem = "##"; # comments in system files
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR DOS:
+# ********************************************
+## $sep = "\\";
+## $copy = "copy";
+## $del = "del";
+## $mv = "move";
+## $ren = "ren";
+## $rem = "REM";
+# ********************************************
+
diff --git a/fonts/utilities/vfinst/vfinst.pdf b/fonts/utilities/vfinst/vfinst.pdf
new file mode 100644
index 0000000000..b487ac3a6b
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.pdf
Binary files differ
diff --git a/fonts/utilities/vfinst/vfinst.rc b/fonts/utilities/vfinst/vfinst.rc
new file mode 100644
index 0000000000..83fee96ba8
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.rc
@@ -0,0 +1,40 @@
+## File: vfinst.rc
+## Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu
+## Date: January 5, 1998
+## Abstract: This file is part of the VFinst software package.
+##
+## Each entry in this file should consist of three fields: a FontName,
+## the name of the characteristic needing changing, and the revised
+## value for that characteristic. Lines can be commented out using
+## the `#' character.
+##
+## Any users of this package who stumble upon other errors in afm files
+## would earn this author's gratitude if they communicate these errors to
+## him. Thanks!!
+##
+CentaurSwashMT FullName Centaur Swash Italic MT
+Courier Weight Roman
+Courier-Oblique Weight Roman
+Helvetica Weight Roman
+JansonExpertMT-BoldItalic ItalicAngle -14
+NewCenturySchlbk-Italic Weight Roman
+Palatino-Italic Weight Roman
+AGaramond-Bold Weight Bold
+AGaramond-Semibold Weight Semibold
+AGaramond-BoldItalic Weight Bold
+AGaramond-SemiboldItalic Weight Semibold
+AGaramondExp-Bold Weight Bold
+AGaramondExp-Semibold Weight Semibold
+AGarExpSemIta Weight Semibold
+AGarExpSemIta FullName Adobe Garamond Expert Semibold Italic
+AGaramondExp-BoldItalic Weight Bold
+AGaramond-BoldItalic ItalicAngle -18.5
+AGaramondExp-BoldItalic ItalicAngle -18.5
+AGarExpSemIta ItalicAngle -18.5
+AGaramond-SemiboldItalic ItalicAngle -18.5
+AGaramond-Italic ItalicAngle -18.5
+AGaramondExp-Italic ItalicAngle -18.5
+AGaramondAlt-Italic ItalicAngle -18.5
+NewsGothic-Oblique Weight Medium
+Garamond-BookItalic Weight Book
+NewsGothic-BoldOblique Weight bold
diff --git a/fonts/utilities/vfinst/vfinst.tex b/fonts/utilities/vfinst/vfinst.tex
new file mode 100644
index 0000000000..64b634dfa6
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.tex
@@ -0,0 +1,882 @@
+%&latex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This is the file vfinst.tex, part of the VFinst package
+%% (version 1.00, August, 1998) for PostScript Type1 font
+%% installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% THIS IS A STANDARD \LaTeX (LaTeX2e) FILE.
+
+\documentclass{article}
+
+\def\TT#1 {{\tt #1} }
+\newcommand{\vfinst}{\texttt{VFinst}}\let\VFinst=\vfinst
+\newcommand{\CTAN}{\textsc{ctan}}
+\newcommand{\TDS}{\textsc{tds}}
+\newcommand{\helper}[2]{#2 #1}
+
+\title{The \TT VFinst virtual font installer (version 1.00)}
+\author{Alan Hoenig}
+
+\begin{document}
+
+\maketitle
+
+If you've ever wanted to set up outline fonts for use by \TeX\ or
+\LaTeX, \VFinst\ may be of use to you. \VFinst\ sets these fonts up
+for use by \TeX\ and \LaTeX, and at the end of the \VFinst\
+process, you'll be able to typeset with your new fonts, confident that
+accents, ligatures, and the like will appear in your document with the
+usual \TeX\ conventions. Here are the fonts you get at the end of the
+process.
+\begin{enumerate}
+ \item For every upright font: you get the upright font, the small
+ caps font, an oblique font, and an underline font.
+ \item For every italic font, you get the italic font, a small caps
+ italic, an unslanted italic, and an underline font.
+ \item Additional fonts: You will also get titling (display)
+ fonts, both upright and italic, and a swash italic font,
+ if the appropriate raw fonts were present.
+\end{enumerate}
+\VFinst\ takes care to use expert fonts to build the small caps fonts,
+if these raw fonts were originally present. You also get test files
+for plain \TeX\ and \textsc{NFSS} (\LaTeX), to
+both test the fonts and to provide
+examples of how to declare and use each of the fonts in a \TeX\
+document.
+
+At the end of the \VFinst\ process, you get all {\tt.vf} and {\tt.tfm}
+files for all fonts, which have been renamed for you according to the
+{\tt fontname2.1} conventions. All oblique and italic fonts use the
+true italic angle for the font. The {\it dvips\/} map file {\tt
+psfonts.map} will have been updated for you. All fonts will have been
+placed in the proper area on your hard disk. You may choose original
+\TeX\ ({\tt ot1}) or Cork ({\tt t1}) encodings for your fonts, which
+can be installed according to the \TDS\ (\TeX\ Directory Structure) or
+`traditional' standard. All raw fonts follow the {\tt 8r
+TeXBase1Encoding}.
+
+All this and more is expanded upon in the remainder of this file.
+{\bf Please read the file thoroughly.} The first
+section, a general introduction, is followed by four sections that a
+new user will need:
+\begin{itemize}
+ \item`\VFinst\ and what you'll need to run it',
+ \item`Installation and set up',
+ \item `Running \VFinst', and
+ \item `Using your new fonts'.
+\end{itemize}
+The remainder can be read later (if at all).
+
+If this software proves useful to you, you may also wish to
+investigate two other packages I wrote, both on \CTAN. {\it
+MathInst\/} helps
+install commercial math fonts with your newly installed PostScript
+fonts so that equations and such come out looking fully compatible
+with your text. {\it MathKit\/}
+does the same thing, but it uses Metafont to create symbols from the
+Computer Modern fonts that match your text fonts. These packages can
+be found in the
+\begin{verbatim}
+fonts/utilities/mathinst
+fonts/utilities/mathkit
+\end{verbatim}
+areas of \textsc{ctan}.
+
+\section{Introduction}
+One thing that {\em should\/} be easy to do with \TeX\ is make
+commercial outline fonts transparently usable by \TeX\ and \LaTeX.
+Even though a tool like \TT fontinst does make it easy to do this, \TT
+fontinst still requires inside knowledge not easily
+come by. The set of tools called \vfinst\ is my attempt
+to make the task of installing families of PostScript fonts as simple
+as possible, but {\bf only\/} for well-formed families of fonts. That
+is, I am concerned here only with {\em text\/} fonts, roman fonts
+appearing in medium and other weights, with italic variants, and
+optionally with small caps or expert fonts, and possibly a few
+additional matching fonts, like swash italic caps, display fonts, and
+so on thrown in. Special dingbat fonts, unusual families like
+Poetica, foreign language fonts, math fonts, and the like will not be
+reliably installed with this software. Neither will fonts that are
+narrow, extended, or other `width' variants. (I have prepared two
+other tools---\textit{MathInst} and \textit{MathKit}---that help
+typeset documents so that the mathematics is compatible with the text
+fonts. Both these tools are available on \textsc{ctan}; see above.)
+
+Here's the basic idea. You place copies of all the fonts you want to
+install in a special work place. Then, you activate the \vfinst\
+scripts, run all the additional scripts that \vfinst\ produces,
+and that's it! \vfinst\ does these things for you:
+\begin{itemize}
+ \item produces all \TT.vf and \TT.tfm files;
+
+ \item renames the fonts according to
+ version~2.1 of Karl Berry's \TT fontname convention;
+
+ \item automatically updates the \TT psfonts.map file for {\it dvips};
+
+ \item generates two test files, for plain \TeX\ and NFSS (\LaTeX),
+ showing how to use your new fonts; and
+
+ \item generates a script or batch file for placing all new fonts and
+ other associated files in their proper places (It also
+ generates a script for creating any needed new directories.)
+\end{itemize}
+and does these for either `traditional' or {\sc tds}-compliant systems.
+(TDS stands for `\TeX\ Directory Structure'.) Once you've executed
+all these scripts or batch files, the fonts are ready for use.
+
+Here are the fonts you get:
+
+\begin{itemize}
+ \item for each upright font (roman and bold or semibold, usually):
+ \begin{itemize}
+ \item the font itself,
+ \item matching small caps (mock or real),
+ \item a slanted (oblique) font, and
+ \item an underline font.
+ \end{itemize}
+
+ \item for each italic font (roman and bold or semibold, usually):
+ \begin{itemize}
+ \item the font itself,
+ \item matching small caps,
+ \item an unslanted italic, and
+ \item an underline font.
+ \end{itemize}
+ \item display or titling fonts (both upright and italic),
+ if they are present; and
+ \item swash italic fonts, if they are present.
+\end{itemize}
+If you have included expert or small caps fonts among your
+fonts for installation, \vfinst\ automatically takes them into
+account when building the virtual fonts.
+If you have included expert raw fonts, you actually get two font
+families at the end---both use `expertised' fonts, but one family
+contains regular digits, and the other contains old style digits.
+
+It's not well known, but the angle of inclination for an italic font
+varies quite a bit from font family to font family. The oblique and
+unslanted italic fonts that \vfinst\ creates use the true italic angle
+for that font. You also get several underline fonts, font in which
+each character is underlined so it is easy to typeset lengthy
+underlined passages without worrying about line breaks.
+
+{\fontsize{9}{10}\selectfont
+(This paragraph is for reference purposes only; it mentions things that
+will very likely not be of interest to most people.) The virtual fonts
+created use raw fonts which follow the `8r' \TT TeXBase1Encoding being
+promulgated by the international community of \TeX\ developers. (This
+encoding provides easy access to all characters in the font. Pardon
+to all for the cryptic acronyms that abound.) The
+resulting virtual fonts themselves follow either the original \TeX\
+encoding (so-called \texttt{OT1} or \texttt{ot1}) or the newer Cork
+encoding (\texttt{T1} or \texttt{t1}).\endgraf}
+
+Pierre MacKay's \TT makevf script helped inspire
+\vfinst.
+The remainder of this document describes the \vfinst\ installation
+procedure, its use, and other important details in greater detail.
+
+Although I hope this software is useful, it
+comes with no warranty whatsoever. I cannot accept responsibility for
+any harmful effects from this software.
+
+\subsection{Changes from prior versions}
+Separate \textsc{dos} versions of \vfinst\ are no longer supported.
+
+Several bug fixes are particularly important. One odd but interesting bug
+prevented \vfinst\ from working properly with New Century Schoolbook
+fonts. A second concerned the way \textit{dvips}-map entries were
+generated for \textsc{tds} systems. Both have been fixed.
+
+Speaking of \textsc{tds} systems, this version has been very
+thoroughly tested with such systems, a fact which has not been true in
+the past. Several major bugs were uncovered and fixed, and my
+apologies to all that they persisted for so long.
+
+\subsubsection{Lousy afm files}
+The major problem users may continue to have lies not with {\it
+this\/} software, but with the \texttt{afm} files that accompany the
+files. These files provide the metric and other information for a
+Type1 font analogously to \TeX's \texttt{tfm} files. Apparently,
+little software takes advantage of these files, and digital foundries
+are at best sloppy when preparing them. \vfinst\ relies on the
+\texttt{afm} files to learn things about the fonts it's processing,
+and sloppily prepared \texttt{afm}s lead to disaster. This version of
+\vfinst\ attempts to second-guess an \texttt{afm} file as much as
+possible. A variable called \verb+@sloppy_afms+ contains a list of
+particularly sloppy \texttt{afm}. Currently, it refers to Adobe
+Garamond and Minion, Monotype Bulmer, Lucida Bright, and BitStream
+Chianti. You can add to it if you feel you've discovered another
+malefactor. (See the beginning of file \texttt{vfinst.lib} for this
+variable.) Another mechanism for correcting \texttt{afm} files lies
+in the file \texttt{vfinst.rc}; see below.
+
+\subsection{Scope of testing}
+This software was tested on a Linux box and under WindowsNT~4.0 using
+both \textsc{tds} and traditional versions of \TeX. \vfinst\ was
+extensively tested on several popular font families, including the
+PostScript-resident fonts Times Roman, Palatino, and New Century
+Schoolbook, as well as Adobe Garamond, Adobe Caslon, Adobe Minion,
+Monotype Bulmer, and Monotype Baskerville, Lucida Bright, plus many
+other families of fonts that were lying around on my hard disk. They
+all installed fine for me.
+
+\subsection{Legal jargon and caveats}
+This software is distributed according to the terms of the \textsc{GNU}
+`copyleft' agreement. In addition, please note that if you make any
+alterations to any of the files in this package, you must change the
+names of the altered files. You are allowed to freely use this
+material and to pass it along (in the unaltered state!) provided you
+will not be using it to make money; otherwise, you must get in touch
+with me to secure permission.
+
+While the author hopes that it will prove useful, it is distributed
+with no guarantee or warranty whatsoever. Users should take
+\textsc{great care} to carefully back up their data before using.
+
+\section{\TT VFinst and what you'll need to run it}
+
+\vfinst\ itself consists of Perl scripts and some supporting files.
+
+%% These files are named:
+%%
+%% \begin{itemize}
+%% \item \TT 1vfinst and \TT 2vfinst;
+%% \item \TT vfinst.lib, a library of common routines;
+%% \item \TT vfinst.par, a set of parameters that everyone who uses
+%% this material will have to customize for their installation;
+%% \item \TT vfinst.rc, a file containing some non-invasive corrections
+%% to particular \TT.afm files (\vfinst\ reads this information without requiring
+%% you to modify the \TT.afm files themselves);
+%% \item several map files called \texttt{map.a2d}, \texttt{map.n2a},
+%% and \texttt{map.sup} (These have been compiled using information
+%% from several of the files provided in Karl Berry's \texttt{fontname}
+%% package.);
+%% \item example output; and
+%% \item several miscellaneous other files.
+%% \end{itemize}
+
+\subsection{Example output}
+In the subdirectory {\tt example}, you'll find the {\tt pfb} and {\tt
+afm} files for the Roman typeface Utopia, placed in the public domain
+by URW. In addition, you'll find other files that are the result of
+the {\tt vfinst} process.
+
+\subsection{What you'll need}
+Here's what you'll need to properly install your fonts using \vfinst:
+\begin{enumerate}
+\item a version of \TeX\ that understands virtual fonts (version 3 or
+better of \TeX);
+\item the \texttt{fontinst} package available from any \CTAN\ archive
+or mirror in the area
+\begin{verbatim}
+fonts/utilities/fontinst/inputs
+\end{verbatim}
+Installation of this
+package is easy---you simply take {\bf all\/} of the files in this directory
+and place them in a directory on your system that \TeX\ know how to
+read from. For traditional systems, this is apt to be a place like
+`{\tt tex/inputs}' and on a {\sc tds} system, a place like
+\begin{verbatim}
+texmf/tex/generic/fontinst
+\end{verbatim}
+is appropriate.
+(There are apparently several different versions on \CTAN.
+You want version~1.5 or greater. Versions before that may not
+work.)
+\item the {\it dvips\/} post-processor;
+\item a copy of the file \texttt{8r.enc}, part of the
+\texttt{fontname} package (this package is available from any \CTAN\
+archive from the area \texttt{info/fontname}); and
+\item a copy of Perl.
+Perl is a powerful language for text processing. I chose Perl because
+versions of Perl are freely available for every computer platform.
+You don't need to understand Perl---just get a copy of the executable
+file, place it on your computer's path, and (if necessary) make it
+executable. This material has been tested under Perl5 (the current
+version). Perl should be available from any good software archive and
+from many \textsc{cdrom} collections of software.
+\end{enumerate}
+
+This material should run on any platform on which runs Perl and \TeX.
+
+\section{Installation and set up}
+
+\subsection{Installation}
+
+To install \vfinst, create a new directory, possibly something like
+\begin{verbatim}
+ /usr/local/vfinst
+\end{verbatim}
+under Unix or
+\begin{verbatim}
+ \tex\vfinst
+\end{verbatim}
+under \textsc{dos}. Copy the all the \vfinst\ files (with the
+possible exeception of the examples) into that directory.
+
+Now create a work directory below this new directory, with a full
+pathname like
+\begin{verbatim}
+ /usr/local/vfinst/work
+\end{verbatim}
+for Unix or
+\begin{verbatim}
+ \tex\vfinst\work
+\end{verbatim}
+under \textsc{dos}.
+Switch to this lowest level \TT work subdirectory, which we
+will call the \vfinst{} {\tt work}ing directory. If you are on a
+Unix system, make sure you have permission to write files in this
+working area.
+
+Also, make sure that your implementation of \TeX\ contains
+the {\it parent\/} directory and the {\it current\/} directory on
+its own search path.
+
+There are some things that need setting in the file \TT vfinst.par,
+which is one of the files in the \vfinst{} directory.
+{\bf Everyone\/} must set these up properly---\vfinst\ won't work
+properly otherwise, and there are no default settings for these
+parameters. Take the time to doublecheck the settings for
+accuracy.
+
+Since this is a Perl file, you must follow Perl syntax in
+the setup. This isn't difficult; see below for examples of setups.
+In particular, the Perl comment character is {\tt\char`\#}, which
+can hide or expose a line to Perl as the `{\tt\char`\%}' does in a
+\TeX\ document.
+
+\subsection{Everybody must set these...}
+\begin{enumerate}
+\item \TT \$vfenc is the encoding you'll want to be using. Although
+ many in the \TeX\
+ community are pushing an encoding called \TT t1, I prefer to use the
+ original \TeX\ encoding called \TT ot1 because there is room in these
+ virtual fonts for many additional characters. Your only choice for
+ this parameter is \TT t1 or \TT ot1. Users of versions of
+ \LaTeX\ predating December 1996 might enter
+ \TT T1 or \TT OT1 instead.
+
+{\fontsize{9}{10}\selectfont
+If you use the lowercase {\tt ot1} or {\tt t1} designations, you'll
+need to {\em make sure\/} that corresponding files {\tt
+ot1\char`\*.etx} and {\tt t1\char`\*.etx} are in a \TeX\ input
+directory. If such named files do not accompany your copy of \TT
+fontinst, the simplest thing to do is make a copy of all the {\tt
+OT1\char`\*.etx} and {\tt T1\char`\*.etx} files, which are part of the
+\TT fontinst package, and give them the appropriate names, eg
+{\tt cp OT1.etx ot1.etx} (using Unix syntax).\endgraf}
+
+%% \item \TT \$vfencoding is the place which
+%% contains a copy of the file \TT 8r.enc (which describes the
+%% \TT TeXBase1Encoding promulgated by all good users of \TeX). This
+%% place merits its own variable only because I've found it convenient to
+%% place this file somewhere with a short path name---otherwise the
+%% entries in \TT psfonts.map become uncomfortably long. You don't need
+%% to set this variable; if it's not set, \vfinst\ will assume that \TT
+%% 8r.enc appears in the same directory as {\tt\$vfmapdir}.
+\end{enumerate}
+
+In earlier versions of \vfinst, a special variable contained the
+location of the file \TT 8r.enc. With this release, it is assumed
+visible to \TT dvips without any path prefix. For traditional users,
+this may mean placing it in your \TT work directory. For TDS users,
+this means nothing special, as \TT dvips will be able to find it via
+the search mechanism that accompanies the TDS installation.
+
+\subsection{TDS systems}
+\TeX\ knows it's a {\sc tds} installation if the variable \TT
+\$vftexmf is defined; it should have as
+values the root \TeX/MF directory. One advantage of
+{\sc tds} is that \vfinst\ can then figure out for itself where most
+things belong.
+
+In a {\sc tds} system, \vfinst\ will ask you later for certain
+additional information pertaining to your fonts.
+For each font family, \vfinst\ needs a typeface name (like
+`\texttt{agaramon}', `\texttt{times}', etc.) and a supplier
+(\texttt{adobe}, \texttt{monotype}, and so on). \vfinst\ tries to
+figure this out by itself, and may simply request verification from
+you. In stubborn cases, it will ask you for this information.
+
+\subsection{Traditional systems}
+On traditional systems, all {\tt.afm}'s go in one place, all
+{\tt.tfm}'s in another, and so on. Such installations need to define
+the following variables. Directories are not well-structured in these
+kinds of systems, so \vfinst\ needs lots of information from you, and
+this additional information belongs in \texttt{vfinst.par}.
+
+\begin{enumerate}
+\item \TT \$vfvf is the place where virtual fonts are kept. If you have vf's
+ on your system already, use this directory name. Otherwise, you'll
+ need to check your {\it dvips} or driver documentation to see where those
+ programs expect to find the vf's. It should be something like
+ \begin{verbatim}
+ "/usr/lib/tex/fonts/vf"
+ \end{verbatim}
+ (Unix) or perhaps
+ \begin{verbatim}
+ "\\emtex\\fonts\\vf"
+ \end{verbatim}
+ (\textsc{dos}; the backslash must be doubled as shown, or Perl will
+ misunderstand it).
+
+\item \TT \$vftfm is the place where \TeX\ looks for your \TT.tfm files.
+
+\item \TT \$vfpsfonts records the location of your outline font files, files
+ typically with extensions \TT.pfa or \TT .pfb.
+
+\item \TT \$vfafm is the directory containing all the \TT.afm files for the
+ outline font files. Unlike most software out there, \TeX\ needs these
+ files.
+
+\item \TT \$vfmapdir is the place where you keep the file \TT psfonts.map that
+ {\it dvips} uses.
+
+\item \TT \$vfinputs is the place where the \TT.fd and other input
+ files belong.
+\end{enumerate}
+
+\subsection{Sample setups}
+The first part of the \vfinst\ setup for a traditional Unix system
+might look as follows. These declarations are part of the file \TT
+vfinst.par.
+
+On a Unix {\sc tds} system, these settings might have the following form.
+\begin{verbatim}
+$vftexmf = "/usr/texmf";
+$vfencoding = "/usr"; # where is the file 8r.enc?
+$vfenc = "ot1";
+\end{verbatim}
+
+Here is a sample Unix setup for a traditional \TeX\ system.
+\begin{verbatim}
+$vfmapdir = "/usr/lib/tex/ps";
+$vfinputs = "/usr/lib/tex/inputs";
+$vfencoding = "/usr";
+$vfenc = "ot1";
+$vfvf = "/usr/lib/tex/fonts/vf";
+$vftfm = "/usr/lib/tex/fonts/tfm";
+$vfpsfonts = "/psfonts";
+$vfafm = "/psfonts/afm";
+\end{verbatim}
+On a \textsc{dos} system, these instructions
+might take the form
+\begin{verbatim}
+$vfmapdir = "\\tex\\ps";
+$vfinputs = "\\tex\\inputs";
+$vfencoding = "$vfinputs";
+$vfenc = "t1";
+$vfvf = "\\tex\\fonts\\vf";
+$vftfm = "\\tex\\fonts\\tfm";
+$vfpsfonts = "\\psfonts";
+$vfafm = "\\psfonts\\afm";
+\end{verbatim}
+(note the doubled backslashes).
+
+\subsection{Other parameters \& considerations}
+The other `wizards only' parameters should already have been set for
+you.
+
+If your system understands the `shebang' convention (whereby you type
+the name of script, and it knows to invoke Perl and run like a named
+program; the first line of the script must begin with `{\tt\#!}'),
+then all you'll need to do is adjust the initial line of files
+{\tt1vfinst} and {\tt2vfinst} to reflect the location of your Perl
+executable. On Unix systems, you'll also need to make these scripts
+executable via the {\tt\ chmod +x\ } command.
+
+If your version of \TeX\ is a
+multitasking application, such as Tom Rokicki's excellent \TeX View on
+NextStep, you'll need to make the application quit and restart it to
+make your new fonts visible to it.
+
+\section{Running \TT VFinst }
+
+To use \vfinst, simply copy all the fonts (outline file plus \TT.afm file)
+to the \vfinst\ {\tt work}ing directory. \vfinst\ won't care what filenames
+these have, nor how many font families are represented. If you have
+any expert, small caps, extension, or alternate fonts, include them
+too by all means. \vfinst\ will use them if present to make true small
+caps fonts. {\bf You MUST make sure that the outline font file
+and the matching {\tt.afm} have identical filenames.}
+
+Then, simply execute the following sequence of commands:
+\begin{itemize}
+\item {\tt1vfinst}
+\item {\tt2vfinst}
+\end{itemize}
+Under the `shebang' notation, you need simply enter something like
+{\tt../1vfinst}; otherwise, type something like {\tt perl ../1vfinst}.
+These two scripts execute rapidly, although they pause to request
+information or verification from you. They will try to figure out the
+font supplier, the font family, and some {\sc tds} directory information,
+and it is this material that needs to be verified and/or provided.
+
+Sometimes digital foundries are sloppy about naming their fonts
+consistently, and so \vfinst\ may ask you to verify or enter a font family
+abbreviation for one family more than once. For example, Monotype
+Baskerville has been assigned to the family named {\tt BaskervilleMT}
+while the matching expert font is in the family {\tt BskvillExpMT}.
+(These are the names appearing in the {\tt.afm} file.) A \TeX\ author
+clearly needs them in the same font family, so verify family {\tt mbv}
+for the first, and verify family {\tt mbv} for the second, so that
+\vfinst\ will know they are in the same family.
+
+It often pays to briefly examine the files that \TT1vfinst produces.
+There is a small file \TT duplicat.lst which contains a list of fonts
+that \vfinst\ thinks are duplicates. It will help later steps proceed
+faster if you eliminate any duplicates---and if you do, don't forget
+to remove both \TT.pfb and \TT.afm file. Entries in this file may
+also indicate a problem with the \TT.afm file; see
+page~\pageref{afm-error}\ below for more on this.
+
+The other output file is \TT fonts.lst, a list of all fonts with their
+proposed new names, old names, and some information that will be of
+interest to later steps in the \vfinst\ process. You should examine
+this list and eliminate any special-purpose fonts, such as special
+fraction or ornament fonts, from the installation
+process. It will also
+be helpful to eliminate all fonts with a width variant (such as
+Helvetica Narrow, etc.).
+
+If you remove any fonts from your working directory, make sure to
+re-run \TT1vfinst.
+
+There are several additional steps. Execute the following scripts,
+which are outputs of the previous two steps:
+\begin{itemize}
+\item {\tt mkdirs.bat}
+\item {\tt newnames.bat}
+\end{itemize}
+to create any missing directories and to rename the fonts according to
+the {\tt fontname2.1} conventions. These steps take very little time.
+
+Then, execute the command
+\begin{verbatim}
+tex makefont
+\end{verbatim}
+to create the virtual fonts; the file \TT makefont.tex is the output
+of the original Perl scripts. This step may take a long
+while. Ignore warnings about missing glyphs.
+
+Next, execute the script
+\begin{itemize}
+\item {\tt maketfm.bat}
+\end{itemize}
+to convert your Ascii property list files into the binary {\tt.tfm} and
+{\tt.vf} files that \TeX\ expects. Finally, execute the two scripts
+
+\begin{itemize}
+\item {\tt putfonts.bat}
+\item {\tt putvftv.bat}
+\end{itemize}
+These two scripts, which execute rapidly, are responsible for
+placing all files into
+places from which \TeX\ can use them for typesetting. {\bf The fonts
+cannot be said to be installed until these two steps are carried out.}
+I suppose that users on multi-user systems will have to request their system
+administrator perform these tasks.
+
+One special step is necessary for \textsc{tds} systems only! Whenever
+new fonts are added to a \textsc{tds} system, it will be necessary to
+run a small utility which accompanies \TeX. This tool may be named
+\TT texhash or \TT configure or \TT mktexlsr something else entirely,
+and is necessary to place the names of the new fonts in database that
+\textsc{tds} uses to locate files and fonts.
+
+Now, your new fonts are ready for
+use. You can test your fonts by running either of the files {\tt
+testpln.tex} or {\tt testltx.tex} through \TT plain \TeX\ or through
+\LaTeX. These files also show what commands to use to select your new
+fonts.
+
+Once the installation has been completed according to the above
+steps, everything left in the work directory may be deleted.
+
+\subsection{Installing `raw' fonts}
+\vfinst\ is intended for fonts that require auxiliary constructs
+called \textit{virtual fonts} for proper use by \TeX. This does not
+include every font you might purchase. For example, dingbat fonts,
+special alphabets (phonetic fonts, foreign languages, {\sc apl}) and
+so on don't require the virtual font mechanism. Installation to make
+these fonts usable by \TeX\ is a much simpler process, but you have to
+do the work yourself. To illustrate the process, let's suppose you
+have files {\tt foo.afm} and {\tt foo.pfb} for installation. Follow
+these steps:
+\begin{itemize}
+\item You'll need program \texttt{afm2tfm}, part of the {\it dvips\/}
+suite. Execute the command
+\begin{verbatim}
+afm2tfm foo
+\end{verbatim}
+This creates a file {\tt foo.tfm} for use by \TeX, and displays a line
+like
+\begin{verbatim}
+foo AGaramond-Regular
+\end{verbatim}
+(or whatever) on your console..
+\item Place this displayed line in the file {\tt psfonts.map}. If
+it's a non-resident font, you'll need to adjust this line as follows:
+\begin{verbatim}
+foo AGaramond-Regular <foo.pfb
+\end{verbatim}
+to automatically download the font to the printer at print time.
+\item Place the {\tt.afm} and {\tt.pfb} font files where they belong
+on your system disk. Place {\tt foo.tfm} where it belongs.
+\item To select this font in a {\tt plain} document, add a line like
+\begin{verbatim}
+\font\myfont = foo at 13pt
+\end{verbatim}
+to make \verb+\myfont+ the command that selects this font (at thirteen
+points). In \LaTeX, you can use the undocumented command
+\begin{verbatim}
+\newfont{\myfont}{foo at 13pt}
+\end{verbatim}
+to accomplish the same goal.
+\end{itemize}
+
+\section{Using your new fonts}
+The files {\tt testpln.tex} or {\tt testltx.tex} can help you test and
+preview your new fonts. These files also can be consulted to see how
+these fonts were selected; this will be most useful for users of \TT
+plain \TeX.
+
+\LaTeX\ users will, of course, select their fonts by selecting the
+proper family, series, and shape. Note that in the presence of expert
+fonts, \vfinst\ creates two families---one that is expertised but with
+standard numerals, and another that is expertised and uses old style
+figures. In the absence of expert fonts, \vfinst\ installs a single
+family (and creates small caps by means of judicious scaling of the
+font majuscules. Thus, if the font family name \TT foo has no expert
+fonts, \vfinst\ installs the raw fonts under the family {\tt foo}. In
+the presence of expert fonts, you will have two families---{\tt foox}
+and {\tt foo9}. Note too the existence of several new font shapes
+which may be available for use by {\sc nfss}:
+\begin{itemize}
+ \item {\tt si} provides italic small caps;
+ \item {\tt t} provides a titling or display font;
+ \item {\tt ti} provides a titling or display italic;
+ \item {\tt sw} provides a swash italic variant;
+ \item {\tt un} provides an underline upright font; and
+ \item {\tt ni} provides an underline italic font.
+\end{itemize}
+\vfinst\ will only provide these shapes in case the original raw fonts
+that were present support these shapes.
+
+\section{Causes for failure and other problems}
+\vfinst\ maintains an extensive log file called \TT vfinst.vlg
+which contains useful information which may be of use in case of
+disaster or other problems. (Another log file, \texttt{maketfm.vlg},
+records information about the making of the binary font files but is
+generally of less usefulness.)
+
+You may find that when you install too many fonts at once, \TeX\ won't
+have enough font memory to load all of them at once. You may have to
+compile the test documents in parts---comment out a portion, test the
+remainder, and so on.
+
+Installing too many fonts may lead to another rare error involving
+older versions of \textit{dvips}. After a while, the
+\texttt{psfonts.map} file becomes too lengthy and \textit{dvips}
+expires while complaining of being `out of string space'. The easiest
+fix is simply to comment out entries in \texttt{psfonts.map} that you
+aren't currently using. The comment character is \TeX's `{\tt\%}'
+symbol. Even better: simply update to a current version of
+\textit{dvips}.
+
+\vfinst\ warns you on the rare occasion when the {\tt fontname} name
+of a font exceeds eight characters; an example is the swash italic
+display characters in Adobe Minion. This is only a problem for
+\textsc{dos} users, who should probably remove these fonts from the
+\vfinst\ {\tt work} directory and re-run \vfinst.
+
+\subsection{Fixing {\tt.afm} files}
+Virtual fonts that are created but don't typeset as you expect may
+indicate a problem with the font {\tt.afm} files rather than with
+\vfinst. Font providers are often careless (at best!) with these
+files. Errors that I have encountered include misspelling the words
+`bold' and `italic' (now really!), improper specifying an $x$-height
+to be 0, and improperly naming the glyphs of the fonts. All these
+will effect the resulting fonts.
+
+\label{afm-error}Entries in the file \TT duplicat.lst may
+indicate other problems with the \TT.afm file. While testing, I many
+times received warning that \vfinst\ thought that one font was a
+duplicate of another when in fact one font was a regular weight and
+the second was bold. Closer inspection of the bold \TT.afm revealed
+the problem---the `Weight' entry the \TT.afm file had erroneously been
+filled in as `{\tt regular}' even though it was a bold font.
+Basically, \TT.afm problems involve correcting metric data in the body
+of the file or correcting non-metric data in the initial portion of
+the file. Both \TT fontinst and \vfinst\ provide means for correcting
+these errors. It is a bad, bad idea to make corrections to the
+\TT.afm file itself.
+
+Changes to data in the initial portion of an \TT.afm involve creating
+a file called \TT vfinst.rc each line of which records three
+items---the font name of the deficient font, the name of the
+characteristic to change, and the corrected value of that
+characteristic. Each of these fields should be separated by one or
+more spaces. The font name is the long font name that follows the
+keyword `FontName' in the first part of the \TT.afm file (within the
+the first dozen lines from the top of the file).
+
+The \TT.rc file that comes with the current distribution looks like this:
+{\fontsize{8}{9}\selectfont
+\begin{verbatim}
+CentaurSwashMT FullName Centaur Swash Italic MT
+Courier Weight Roman
+Courier-Oblique Weight Roman
+Helvetica Weight Roman
+JansonExpertMT-BoldItalic ItalicAngle -14
+NewCenturySchlbk-Italic Weight Roman
+Palatino-Italic Weight Roman
+AGaramond-Bold Weight Bold
+AGaramond-Semibold Weight Semibold
+AGaramond-BoldItalic Weight Bold
+AGaramond-SemiboldItalic Weight Semibold
+AGaramondExp-Bold Weight Bold
+AGaramondExp-Semibold Weight Semibold
+AGarExpSemIta Weight Semibold
+AGarExpSemIta FullName Adobe Garamond Expert Semibold Italic
+AGaramondExp-BoldItalic Weight Bold
+AGaramond-BoldItalic ItalicAngle -18.5
+AGaramondExp-BoldItalic ItalicAngle -18.5
+AGarExpSemIta ItalicAngle -18.5
+AGaramond-SemiboldItalic ItalicAngle -18.5
+AGaramond-Italic ItalicAngle -18.5
+AGaramondExp-Italic ItalicAngle -18.5
+AGaramondAlt-Italic ItalicAngle -18.5
+NewsGothic-Oblique Weight Medium
+Garamond-BookItalic Weight Book
+NewsGothic-BoldOblique Weight bold
+\end{verbatim}
+}%
+This file indicates, for example,
+that \vfinst\ is to regard the weight of the font
+\TT Courier as Roman, the italic angle of \TT JansonExpertMT-BoldItalic
+as $-14^{\circ}$, and the full name of \TT CentaurSwashMT as that
+given here. (The original font didn't include the
+word `italic' in the font name, so \vfinst\ assumed the swash applied
+to upright fonts.)
+
+I'd be grateful to anyone who could send me additional errors of this
+nature they encounter in using fonts, so I can encounter them in
+future revisions of this file.
+
+%% Problems with the body of the \TT.afm file can be fixed with special
+%% \TT fontinst instructions. For example, one serious yet common
+%% problem involves improper naming of the glyphs within the \TT.afm
+%% file. Suppose an expert font names its lowercase letters
+%% `a', `b', and so on instead of `Asmall', `Bsmall', etc. Then {\tt
+%% fontinst}, the engine on which \vfinst\ runs, will not use these
+%% glyphs in a small caps font. Here's how I used \TT fontinst to fix
+%% this.
+%%
+%% When installing a font via the command
+%% \begin{verbatim}
+%% \installfont{foorc9t}{foor8r,foorc8a,latin}%
+%% {OT1c}{OT1}{foox}{m}{sc}{}
+%% \end{verbatim}
+%% where the {\tt foo} fonts suffer this disability, I ``turn off'' the
+%% miniscule (lowercase) information with commands like
+%% \begin{verbatim}
+%% \unsetglyph{a}
+%% \end{verbatim}
+%% placed (together with additional syntactical necessities) in a file
+%% \TT minoff.mtx. In the same way, commands in a file \TT numoff.mtx
+%% turn off standard digit glyph information. Then, I make use of the
+%% glyph information in the small caps font (here, {\tt foorc8a}) with
+%% commands like
+%% \begin{verbatim}
+%% \SmallCapFrom{Asmall}{a}
+%% \end{verbatim}
+%% in a file {\tt smcapon.mtx} which also contains a definition of this
+%% command. In the same way, the file {\tt osfon.mtx} sets old style
+%% figures from the glyphs in this font. These four metric \TT.mtx files are
+%% part of the \vfinst\ distribution; please use them as examples for
+%% solving similar kinds of problems. We use them in this instance
+%% by modifying the above install command {\em by hand\/}:
+%% \begin{verbatim}
+%% \installfont{foorc9t}{foor8r,minoff,numoff,foorc8a,smcapon,%
+%% osfon,latin}{OT1c}{OT1}{foox}{m}{sc}{}
+%% \end{verbatim}
+%% Now, run the revised file \TT makefont.tex through \TeX, and continue
+%% the \vfinst\ process from this point.
+
+\section{Other operating systems}
+
+{\fontsize{9}{10}\selectfont
+I designed these scripts to be easy to adapt to other operating
+systems. That, in fact, motivated my choice of Perl. All of the
+testing and development work was done in Unix, however.
+
+Here are some things that need attention in going to another operating
+system. Change the three environment variables marked for `wizards only'.
+\begin{enumerate}
+\item \TT\$vfsep is the directory separator in paths; for ex, \TT/ in Unix,
+ \verb|\| in \textsc{dos}.
+\item \TT\$vfcopy is the copy command (eg, \TT cp and \TT copy in Unix
+ and \textsc{dos}. respectively)
+\item \TT\$vfdel is the delete command (for erasing files); it is \TT
+ rm in Unix and \TT del in \textsc{dos}.
+\item \TT\$mv is the move command---the command that will move one
+file onto another even if the destination file already exists. In
+Unix, this command is `\texttt{mv}'. On {\sc dos}, it is `{\tt call
+domove}' where {\tt domove.bat} is a batch file with lines
+\begin{verbatim}
+copy %1 %2
+del %1
+\end{verbatim}
+(The file {\tt domove.bat} is part of the {\sc dos} distribution. You must
+remember to copy it to the \vfinst\ working directory or to a place on your
+system's search path.)
+\item \TT\$ren is the command for renaming a file.
+\item \TT\$rem is the string that introduces comments in system {\sc
+Ascii} files. It is `{\tt\#}' and `{\tt rem}' in Unix and {\sc dos}.
+\end{enumerate}
+
+Other places in the Perl files where it seemed to me would require
+system dependent changes are marked by the phrase `system dependent'
+in comments in the code.\par}
+
+\section{Additional info; authorial communications; acknowledgments}
+I'm truly grateful for the comments, suggestions, and trapped bugs
+reported by folks who took time to wrestle with this software. I
+especially want to acknowledge
+\helper{Chang}{Andrew},
+\helper{Christian}{Burger},
+\helper{Courjon}{Daniel},
+\helper{Marquardt}{Colin},
+\helper{Ness}{David} (especially!),
+\helper{Padowitz}{Seth},
+\helper{Roggen}{Arend van },
+\helper{Sullivan}{Wayne},
+\helper{Swift}{Matt},
+\helper{Walker}{Richard}, and
+\helper{Yates}{Michael}.
+
+For some additional information, please consult the book {\it \TeX\
+Unbound: \LaTeX\ and \TeX\ Strategies for Fonts, Graphics, and More\/}
+by Alan Hoenig (New York and Oxford: Oxford University Press, 1998).
+
+I'd love to hear from anyone with comments, criticisms, suggestions
+for improvements, and (of course) bugs that need fixing.
+
+\begin{flushright}
+ Alan Hoenig\\
+ {\tt ajhjj@cunyvm.cuny.edu}\\
+ Department of Mathematics\\
+ John Jay College\\
+ 445 West 59th Street\\
+ New York, NY 10019 USA\\[1pc]
+ 24 August 1998
+\end{flushright}
+
+\end{document}
diff --git a/fonts/utilities/vfinst/vfinst.unx b/fonts/utilities/vfinst/vfinst.unx
new file mode 100644
index 0000000000..1a883ca760
--- /dev/null
+++ b/fonts/utilities/vfinst/vfinst.unx
@@ -0,0 +1,74 @@
+#############################################################
+##
+## This is the file vfinst.par, part of the VFinst package
+## (version 1.00, August, 1998) for PostScript Type1 font
+## installation. (Author: Alan Hoenig, ajhjj@cunyvm.cuny.edu)
+##
+#############################################################
+
+## These parameters need to be set for your system.
+## The statements will be read by Perl, so they require that you
+## follow Perl syntax. Fortunately, this isn't hard. Follow
+## these tips, and also use the statements in the distribution file
+## as models.
+##
+## * The Perl comment character is the hash mark #, so everything
+## following this is ignored. (It's just like the % in TeX and
+## LaTeX.)
+## * All Perl staments end with a semicolon `;'.
+## * The Perl variable names you set here must all begin with
+## the dollar sign `$'.
+## * When an alphanumeric string is assigned to a variable, the string
+## must be surrounded in double quotes, like "this".
+##
+## DOS Users: As you know, the path separator symbol is the backslash.
+## For technical reasons, this must be entered as \\ when used in
+## a variable.
+##
+
+## NONE of the path are allowed to end in a (back)slash!!!
+
+## EVERYONE needs to set these...
+
+ $vfencoding = " "; # where is the file 8r.enc?
+## If your system is smart enough to know where 8r.enc is, you don't
+## need any explicit directory.
+ $vfenc = "OT1"; # or maybe "ot1" or "T1" or "t1"
+
+## If you are running a TDS system, uncomment the
+## next statement.
+
+ $vftexmf = "e:/texmf"; # where is texmf root?
+
+## If you are running a `traditional' TeX system, you'll need to
+## supply the following information...
+
+ $vfmapdir = "/usr/lib/tex/ps"; # where is psfonts.map?
+ $vfinputs = "/usr/lib/tex/inputs"; # Where do fd files belong?
+ $vfvf = "/usr/lib/tex/fonts/vf"; # where do vf's go?
+ $vftfm = "/usr/lib/tex/fonts/tfm"; # and tfm's?
+ $vfpsfonts = "/psfonts"; # where are all the outline fonts?
+ $vfafm = "/psfonts/afm"; # ...and the matching afm's?
+
+# The following are for `wizards only'...
+
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR UNIX:
+# ********************************************
+ $sep = "/"; # path separator
+ $copy = "cp"; # copy command
+ $del = "rm"; # file delete command
+ $mv = "mv"; # command to move files
+ $ren = "mv"; # how to rename files
+ $rem = "##"; # comments in system files
+# ********************************************
+# UNCOMMENT THE FOLLOWING FOR DOS:
+# ********************************************
+## $sep = "\\";
+## $copy = "copy";
+## $del = "del";
+## $mv = "move";
+## $ren = "ren";
+## $rem = "REM";
+# ********************************************
+
diff --git a/fonts/utilities/vfinst/x.mtx b/fonts/utilities/vfinst/x.mtx
new file mode 100644
index 0000000000..4346a58983
--- /dev/null
+++ b/fonts/utilities/vfinst/x.mtx
@@ -0,0 +1,14 @@
+\relax
+
+This file x.mtx is part of vfinst. It resets some font parameters
+that sloppy afm files set improperly.
+
+\metrics
+
+\resetint{italicslant}{0}
+\resetint{underlinethickness}{50 }
+\resetint{capheight}{\height{B}}
+\resetint{xheight}{\height{x}}
+\resetint{ascender}{\height{t}}
+
+\endmetrics
diff --git a/fonts/utilities/vplutils/Makefile b/fonts/utilities/vplutils/Makefile
new file mode 100644
index 0000000000..e087500cf6
--- /dev/null
+++ b/fonts/utilities/vplutils/Makefile
@@ -0,0 +1,79 @@
+# Makefile for VPL utilities
+# AJCD 24/9/93
+
+RELEASE=1.2
+
+BINMODE=0755
+MANMODE=0644
+CHMOD=chmod
+INSTALL=install -c -m $(BINMODE)
+INSTALLMAN=install -c -m $(MANMODE)
+RM=rm -f
+MKDIR=mkdir
+
+PERL=/usr/local/bin/perl
+SCRIPTDIR=/usr/local/bin
+MANDIR=/usr/local/share/man/man1
+MANEXT=1
+PERLLIBDIR=/usr/local/share/tex/vplutils/perl
+ENCODINGDIR=/usr/local/share/tex/vplutils/encodings
+
+PERLSCRIPTS = makevpl spacevpl
+PACKAGES = paths.pl parsepl.pl parseenc.pl
+MANPAGES = makevpl.$(MANEXT) spacevpl.$(MANEXT)
+ENCODINGS = encodings/ASCII.enc encodings/CMmathex.enc encodings/CMmathit.enc\
+ encodings/CMsymbol.enc encodings/CMtext.enc encodings/CMtextit.enc\
+ encodings/CMtypewriter.enc encodings/DC.enc encodings/EC.enc\
+ encodings/extex.enc encodings/isolatin1.enc encodings/standard.enc\
+ encodings/symbol.enc
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(PACKAGES)
+
+makevpl: makevpl.pl
+ ./maketext @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+ $(CHMOD) $(BINMODE) $@
+
+makevpl.$(MANEXT): makevpl.man
+ ./maketext "@MAN@=$(MANPAGES)" @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+
+spacevpl: spacevpl.pl
+ ./maketext @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+ $(CHMOD) $(BINMODE) $@
+
+spacevpl.$(MANEXT): spacevpl.man
+ ./maketext "@MAN@=$(MANPAGES)" @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+
+clean:
+ $(RM) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.script install.packages install.man install.encodings
+
+install.script: $(PERLSCRIPTS)
+ @for i in $(PERLSCRIPTS); do \
+ echo Installing $$i; \
+ $(INSTALL) $$i $(SCRIPTDIR); \
+ done
+
+install.encodings: $(ENCODINGS)
+ -mkdir $(ENCODINGDIR)
+ @for i in $(ENCODINGS); do \
+ echo Installing $$i; \
+ $(INSTALLMAN) $$i $(ENCODINGDIR); \
+ done
+
+install.packages: $(PACKAGES)
+ -mkdir $(PERLLIBDIR)
+ @for i in $(PACKAGES); do \
+ echo Installing $$i; \
+ $(INSTALLMAN) $$i $(PERLLIBDIR); \
+ done
+
+install.man: $(MANPAGES)
+ @for i in $(MANPAGES); do \
+ echo Installing manual page for $$i; \
+ $(INSTALLMAN) $$i $(MANDIR)/$$i; \
+ done
diff --git a/fonts/utilities/vplutils/README b/fonts/utilities/vplutils/README
new file mode 100644
index 0000000000..a80def2649
--- /dev/null
+++ b/fonts/utilities/vplutils/README
@@ -0,0 +1,41 @@
+VPL Utilities Angus Duggan 25th September 1993
+
+This directory contains the first in a suite of tools to manipulate TeX
+property list and virtual property list files. More tools may be added as the
+need arises :-) These tools are copyright (C) Angus Duggan 1993, but may be
+re-distributed freely and used for any purpose (including distribution as part
+of a for-profit product) provided that:
+
+1) The original attribution of the programs is clearly displayed in the product
+ and/or documentation, even if the programs are modified and/or renamed as
+ part of the product.
+
+2) The original source code of the programs is provided free of charge (except
+ for reasonable distribution costs). For a definition of reasonable
+ distribution costs, see the Gnu General Public License or Larry Wall's
+ Artistic License (provided with the Perl 4 kit). The GPL and Artistic
+ License in NO WAY affect this license; they are merely used as examples of
+ the spirit in which it is intended.
+
+3) These programs are provided "as-is". No warranty or guarantee of their
+ fitness for any particular task is provided. Use of these programs is
+ completely at your own risk.
+
+The package contains:
+
+SCRIPTS
+ makevpl Merges PL and VPL files, creating a VPL file.
+ spacevpl Alters the spacing in a PL or VPL file.
+
+FILES
+ paths.pl Perl package for expanding and searching paths
+ parsepl.pl Perl package for parsing PL and VPL files
+ parseenc.pl Perl package for parsing encoding vectors
+ encodings/* Encoding vectors for various TeX and other encodings.
+
+INSTALLATION
+ Edit the PERL, PERLLIBDIR, SCRIPTDIR, MANDIR, MANEXT and ENCODINGDIR
+macros in the Makefile, and "make install".
+
+BUGS
+ None that I know of :-)
diff --git a/fonts/utilities/vplutils/encodings/ASCII.enc b/fonts/utilities/vplutils/encodings/ASCII.enc
new file mode 100644
index 0000000000..b6ee96db82
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/ASCII.enc
@@ -0,0 +1,50 @@
+% This is the ASCII encoding scheme
+%
+/ASCIIEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMmathex.enc b/fonts/utilities/vplutils/encodings/CMmathex.enc
new file mode 100644
index 0000000000..97f0ffb00d
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMmathex.enc
@@ -0,0 +1,66 @@
+% Computer Modern Math Extension encoding vector
+/CMMathExtensionEncoding [
+% 0x00
+ /bigparenleft /bigparenright /bigbracketleft /bigbracketright
+ /bigfloorleft /bigfloorright /bigceilingleft /bigceilingright
+ /bigbraceleft /bigbraceright /bigangleleft /bigangleright /vertex
+ /vertdblex /bigslash /bigbackslash
+% 0x10
+ /Bigparenleft /Bigparenright /biggparenleft /biggparenright
+ /biggbracketleft /biggbracketright /biggfloorleft /biggfloorright
+ /biggceilingleft /biggceilingright /biggbraceleft /biggbraceright
+ /biggangleleft /biggangleright /biggslash /biggbackslash
+% 0x20
+ /Biggparenleft /Biggparenright /Biggbracketleft /Biggbracketright
+ /Biggfloorleft /Biggfloorright /Biggceilingleft /Biggceilingright
+ /Biggbraceleft /Biggbraceright /Biggangleleft /Biggangleright
+ /Biggslash /Biggbackslash /Bigslash /Bigbackslash
+% 0x30
+ /parenlefttp /parenrighttp /bracketlefttp /bracketrighttp /bracketleftbt
+ /bracketrighttp /bracketleftex /bracketrightex /bracelefttp /bracerighttp
+ /braceleftbt /bracerightbt /braceleftmid /bracerightmid /braceex
+ /arrowvertex
+% 0x40
+ /parenleftbt /parenrightbt /parenleftex /parenrightex /Bigleftangle
+ /Bigrightangle /unionsq /bigunionsq /loopintegral /bigloopintegral
+ /circledot /bigcircledot /circleplus /bigcircleplus /circlemultiply
+ /bigcirclemultiply
+% 0x50
+ /summation /product /integral /union /intersection /unionplus /logicaland
+ /logicalor /bigsummation /bigproduct /bigintegral /bigunion
+ /bigintersection /bigunionplus /biglogicaland /biglogicalor
+% 0x60
+ /productdown /bigproductdown /bigcircumflex /Bigcircumflex /biggcircumflex
+ /bigtilde /Bigtilde /biggtilde /Bigbracketleft /Bigbracketright
+ /Bigfloorleft /Bigfloorright /Bigceilingleft /Bigceilingright /Bigbraceleft
+ /Bigbraceright
+% 0x70
+ /radical /bigradical /Bigradical /biggradical /radicalbt
+ /radicalvertex /radicalcornerex /arrowdblvertex /arrowup /arrowdown
+ /bracetopleft /bracetopright /bracebotleft /bracebotright /arrowdblup
+ /arrowdbldown
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMmathit.enc b/fonts/utilities/vplutils/encodings/CMmathit.enc
new file mode 100644
index 0000000000..ef6f374303
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMmathit.enc
@@ -0,0 +1,50 @@
+% Computer Modern Math Italic encoding vector
+/CMMathItalicEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /alpha /beta /gamma /delta /epsilon1
+% 0x10
+ /zeta /eta /theta /iota /kappa /lambda /mu /nu
+ /xi /pi /rho /sigma /tau /upsilon /phi /chi
+% 0x20
+ /psi /omega /epsilon /theta1 /omega1 /rho1 /sigma1 /phi1
+ /halfarrowtopleft /halfarrowbotleft /halfarrowtopright /halfarrowbotright
+ /lefthook /righthook /triangleright /triangleleft
+% 0x30
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle
+ /fiveoldstyle /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle
+ /period /comma /less /slash /greater /asteriskmath
+% 0x40
+ /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbot /slurtop
+% 0x60
+ /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass
+ /vectoraccent /tieaccent
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMsymbol.enc b/fonts/utilities/vplutils/encodings/CMsymbol.enc
new file mode 100644
index 0000000000..383ed8ae36
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMsymbol.enc
@@ -0,0 +1,57 @@
+% Computer Modern Symbol encoding vector
+/CMSymbolEncoding [
+% 0x00
+ /minus /dotmath /multiply /mathasterisk /divide /lozenge
+ /plusminus /minusplus /circleplus /circleminus /circlemultiply
+ /circleslash /circledot /bigcircle /smallcircle /bullet
+% 0x10
+ /asymptotic /equivalence /reflexsubset /reflexsuperset /lessequal
+ /greaterequal /precedeequal /succeedequal /similar /approxequal /propsubset
+ /propsuperset /lessless /greatergreater /precede /succeed
+% 0x20
+ /arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrowupright
+ /arrowdownright /similarequal /arrowdblleft /arrowdblright /arrowdblup
+ /arrowdbldown /arrowdblboth /arrowupleft /arrowdownleft /proportional
+% 0x30
+ /prime /infinity /element /suchthat /triangleup /triangledown /fraction
+ /mapsto /universal /existential /logicalnot /emptyset /Rfraktur /Ifraktur
+ /perpendiculardown /perpendicular
+% 0x40
+ /aleph /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection /unionplus
+ /logicaland /logicalor
+% 0x60
+ /perpendicularright /perpendicularleft /floorleft /floorright
+ /ceilingleft /ceilingright /braceleft /braceright /angleleft
+ /angleright /bar /bardbl /arrowbothvert /arrowdblbothvert /setminus
+ /wreath
+% 0x70
+ /radical /productdown /gradient /integral /unionsq /intersectionsq
+ /subseteqsq /superseteqsq /section /dagger /daggerdbl /paragraph /club
+ /diamond /heart /spade
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtext.enc b/fonts/utilities/vplutils/encodings/CMtext.enc
new file mode 100644
index 0000000000..47c0b3d8a8
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtext.enc
@@ -0,0 +1,50 @@
+% Computer Modern Text encoding vector
+/CMTextEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /slashaccent /exclam /quotedbl /numbersign /dollar /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright
+ /circumflex /dotaccent
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtextit.enc b/fonts/utilities/vplutils/encodings/CMtextit.enc
new file mode 100644
index 0000000000..8fe718cbe9
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtextit.enc
@@ -0,0 +1,50 @@
+% Computer Modern Text Italic encoding vector
+/CMTextItalicEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /slashaccent /exclam /quotedbl /numbersign /sterling /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright
+ /circumflex /dotaccent
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtypewriter.enc b/fonts/utilities/vplutils/encodings/CMtypewriter.enc
new file mode 100644
index 0000000000..906d2d7ab7
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtypewriter.enc
@@ -0,0 +1,50 @@
+% Computer Modern Typewriter encoding vector
+/CMTypewriterEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /visiblespace /exclam /quotedbl /numbersign /dollar /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /circumflex /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/DC.enc b/fonts/utilities/vplutils/encodings/DC.enc
new file mode 100644
index 0000000000..4d23e0bb03
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/DC.enc
@@ -0,0 +1,80 @@
+%
+% This is the DC encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+/DCEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /.notdef
+ /zeroinferior /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /.notdef /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lcaron /Lslash /Nacute /Ncaron /Ng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ldot /Zacute /Zcaron /Zdotaccent /IJ /Idotaccent /dbar /section
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dcaron /ecaron /eogonek /gbreve
+ /lacute /lcaron /lslash /nacute /ncaron /ng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla /tcaron /tcedilla /uhungarumlaut /uring
+ /ldot /zacute /zcaron /zdotaccent /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /SS
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
diff --git a/fonts/utilities/vplutils/encodings/EC.enc b/fonts/utilities/vplutils/encodings/EC.enc
new file mode 100644
index 0000000000..cbf1e18cbf
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/EC.enc
@@ -0,0 +1,88 @@
+%
+% This is the EC encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; 0 {} * ; * {} 0 ;
+% LIGKERN 1 {} * ; * {} 1 ; 2 {} * ; * {} 2 ; 3 {} * ; * {} 3 ;
+% LIGKERN 4 {} * ; * {} 4 ; 5 {} * ; * {} 5 ; 6 {} * ; * {} 6 ;
+% LIGKERN 7 {} * ; * {} 7 ; 8 {} * ; * {} 8 ; 9 {} * ; * {} 9 ;
+% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+% 0x18 should be a small zero which you can put after a percent sign
+% to make it look like perthousand, but since that character is not
+% available and perthousand is, we put perthousand into 0x18 and add
+% a ligature to achieve the same result.
+%
+% LIGKERN percent perthousand =: perthousand ;
+%
+/ECEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /compoundwordmark
+ /perthousand /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /visiblespace /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lquoteright /Lslash /Nacute /Ncaron /Eng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ydieresis /Zacute /Zcaron /Zdotaccent /IJ /Idotaccent /dbar /section
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dquoteright /ecaron /eogonek /gbreve
+ /lacute /lquoteright /lslash /nacute /ncaron /eng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla
+ /tquoteright /tcedilla /uhungarumlaut /uring
+ /ydieresis /zacute /zcaron /zdotaccent
+ /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /Germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
+
diff --git a/fonts/utilities/vplutils/encodings/extex.enc b/fonts/utilities/vplutils/encodings/extex.enc
new file mode 100644
index 0000000000..730479cead
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/extex.enc
@@ -0,0 +1,79 @@
+%
+% This is the extended TeX encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN comma coma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+/ExtendedTeXEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /cwm
+ /zeroinferior /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lcaron /Lslash /Nacute /Ncaron /Eng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ydieresis /Zacute /Zcaron /Zdot /IJ /Idot /dstroke /paragraph
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dcaron /ecaron /eogonek /gbreve
+ /lacute /lcaron /lslash /nacute /ncaron /eng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla /tcaron /tcedilla /uhungarumlaut /uring
+ /ydieresis /zacute /zcaron /zdot /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /Germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
diff --git a/fonts/utilities/vplutils/encodings/isolatin1.enc b/fonts/utilities/vplutils/encodings/isolatin1.enc
new file mode 100644
index 0000000000..e5c8d742ed
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/isolatin1.enc
@@ -0,0 +1,54 @@
+% This is the ISO 8859-1 (Latin-1) encoding vector
+%
+/ISOLatin1Encoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+% 0xA0
+ /space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen
+ /registered /macron
+% 0xB0
+ /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph
+ /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex
+ /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex
+% 0xF0
+ /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis
+ /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn
+ /ydieresis
+] def
diff --git a/fonts/utilities/vplutils/encodings/standard.enc b/fonts/utilities/vplutils/encodings/standard.enc
new file mode 100644
index 0000000000..028ec4e4aa
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/standard.enc
@@ -0,0 +1,52 @@
+% This is the Adobe standard encoding scheme
+%
+/StandardEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /exclamdown /cent /sterling /fraction /yen /florin /section
+ /currency /quotesingle /quotedblleft /guillemotleft /guilsinglleft
+ /guilsinglright /fi /fl
+% 0xB0
+ /.notdef /endash /dagger /daggerdbl /periodcentered /.notdef /paragraph
+ /bullet /quotesinglbase /quotedblbase /quotedblright /guillemotright
+ /ellipsis /perthousand /.notdef /questiondown
+% 0xC0
+ /.notdef /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+% 0xD0
+ /emdash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /AE /.notdef /ordfeminine /.notdef /.notdef /.notdef /.notdef
+ /Lslash /Oslash /OE /ordmasculine /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /ae /.notdef /.notdef /.notdef /dotlessi /.notdef /.notdef
+ /lslash /oslash /oe /germandbls /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/symbol.enc b/fonts/utilities/vplutils/encodings/symbol.enc
new file mode 100644
index 0000000000..40c97e08ef
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/symbol.enc
@@ -0,0 +1,58 @@
+% Adobe Symbol encoding vector
+/SymbolEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /universal /numbersign /existential /percent /ampersand
+ /suchthat /parenleft /parenright /mathasterisk /plus /comma /minus /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven /eight /nine /colon
+ /semicolon /less /equal /greater /question
+% 0x40
+ /congruent /Alpha /Beta /Chi /Delta /Epsilon /Phi /Gamma /Eta /Iota /theta1
+ /Kappa /Lambda /Mu /Nu /Omicron
+% 0x50
+ /Pi /Theta /Rho /Sigma /Tau /Upsilon /sigma1 /Omega /Xi /Psi /Zeta
+ /bracketleft /therefore /bracketright /perpendicular /underscore
+% 0x60
+ /radicalex /alpha /beta /chi /delta /epsilon /phi /gamma /eta /iota /phi1
+ /kappa /lambda /mu /nu /omicron
+% 0x70
+ /pi /theta /rho /sigma /tau /upsilon /omega1 /omega /xi /psi /zeta
+ /braceleft /bar /braceright /similar /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /Upsilon1 /minute /lessequal /fraction /infinity /florin /club
+ /diamond /heart /spade /arrowboth /arrowleft /arrowup /arrowright /arrowdown
+% 0xB0
+ /degree /plusminus /second /greaterequal /multiply /proportional
+ /partialdiff /bullet /divide /notequal /equivalence /approxequal /ellipsis
+ /arrowvertex /arrowhorizex /carriagereturn
+% 0xC0
+ /aleph /Ifraktur /Rfraktur /weierstrass /circlemultiply /circleplus
+ /emptyset /intersection /union /propsuperset /reflexsuperset /notsubset
+ /propsubset /reflexsubset /element /notelement
+% 0xD0
+ /angle /gradient /registeredserif /copyrightserif /trademarkserif /product
+ /radical /dotmath /logicalnot /logicaland /logicalor /arrowdblboth
+ /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown
+% 0xE0
+ /lozenge /angleleft /registeredsans /copyrightsans /trademarksans
+ /summation /parenlefttp /parenleftex /parenleftbt /bracketlefttp
+ /bracketleftex /bracketleftbt /bracelefttp /braceleftmid /braceleftbt
+ /braceex
+% 0xF0
+ /.notdef /angleright /integral /integraltp /integralex /integralbt
+ /parenrighttp /parenrightex /parenrightbt /bracketrighttp /bracketrightex
+ /bracketrightbt /bracerighttp /bracerightmid /bracerightbt /.notdef
+] def
diff --git a/fonts/utilities/vplutils/maketext b/fonts/utilities/vplutils/maketext
new file mode 100644
index 0000000000..152e1cd8fb
--- /dev/null
+++ b/fonts/utilities/vplutils/maketext
@@ -0,0 +1,19 @@
+#!/bin/sh
+# maketext: sed wrapper to substitute names in scripts and man pages
+# writes to standard output
+
+# get other variables from command line
+expr=
+for arg in "$@"
+do case "$arg" in
+ -debug) debug=true ;;
+ @MAN@=*) arg=`echo $arg | sed -e "s/\.\(.\)/(\1),/g" -e "s/, *$//"`
+ expr="$expr -e 's=$arg='" ;;
+ *=*) expr="$expr -e 's=$arg='" ;;
+ *) if test "$debug" = "true"
+ then echo "sed $expr $arg" 1>&2
+ fi
+ eval sed $expr $arg ;;
+ esac
+ shift
+done
diff --git a/fonts/utilities/vplutils/makevpl.man b/fonts/utilities/vplutils/makevpl.man
new file mode 100644
index 0000000000..6bc0ed28ad
--- /dev/null
+++ b/fonts/utilities/vplutils/makevpl.man
@@ -0,0 +1,187 @@
+.TH MAKEVPL 1 "VPLUtils Release @RELEASE@"
+.SH NAME
+makevpl \- mix and match TeX's PL and VPL fonts
+.SH SYNOPSIS
+.B makevpl
+[
+.B \-quiet
+] [
+.B \-enc
+.I encoding
+] [
+.B \-defenc
+.I encoding
+] [
+.B \-family
+.I famname
+] [
+.B \-face
+.I facenum
+] [
+.B \-coding
+.I scheme
+] [
+.B \-size
+.I designsize
+] [
+.B \-units
+.I designunits
+] [
+.B \-at
+.I pointsize
+] [
+.B \-normal
+] [
+.B \-replace\fR{\fBfd|ch|wd|ht|dp|ic|map\fR}\fB
+.I range
+] [
+.B \-add\fR{\fBfd|ch|wd|ht|dp|ic|map\fR}\fB
+.I range
+]
+.I font[:encoding]...
+.SH DESCRIPTION
+.I Makevpl
+constructs a Virtual Property List (VPL) file containing characters from the
+fonts specified. A property list (\fB.pl\fR) or virtual property list
+(\fB.vpl\fR) file must exist for each font specified; these files are read,
+and a new VPL file containing the merged font is written to standard output.
+.PP
+The action options
+.B \-replace\fIx\fB, \-add\fIx\fB, \-at
+and
+.B \-normal
+determine how the files are merged. These options may be specified several
+times; if they appear before the first font, they set the default action for
+all fonts. If these options appear between fonts, they set the action for the
+next font only.
+.PP
+The actions
+.B \-replace\fIx\fB
+and
+.B \-add\fIx\fB
+determine whether character information from a font is to replace or be added
+to information in the output font. A character range must be specified with
+of these options; only characters in the range are considered for replacement
+or addition. The character range is a comma separated list of numbers or
+subranges of the form
+.I low\-high.
+If
+.I low
+and/or
+.I high
+are omitted, the subrange is unbounded at the appropriate end(s).
+.PP
+There are seven variants of the
+.B \-replace\fIx\fB
+and
+.B \-add\fIx\fB
+options. These are
+.B \-addfd
+and
+.B \-replacefd,
+which add or replace font dimensions in the specified range,
+.B \-addwd, \-replacewd, \-addht, \-replaceht, \-adddp, \-replacedp, \-addic,
+.B \-replaceic, \-addmap,
+and
+.B \-replacemap,
+which add or replace the width, height, depth, italic correction or character
+map of characters in the specified range.
+The options
+.B \-addch,
+and
+.B \-replacech
+will add or replace all of the information for the characters in the specified
+range. Only characters which have a character map will be written to the
+output font; a default character map is supplied for characters in property
+list (\fB.pl\fR) files.
+.PP
+Delimiter and variable size character list information is mapped to the
+corresponding glyphs in the output font encoding, and cannot be controlled
+from the command line. Ligature and kerning information mapped across with
+characters from a font; if you want to add new ligatures or kerns to a font,
+you can merge it with a property list with the same name as the font, but with
+a different extension.
+.PP
+The actions
+.B \-at
+and
+.B \-normal
+determine how the fonts are scaled. The
+.B \-at
+option scales fonts to the point size specified, and the
+.B \-normal
+option leaves fonts at their natural size.
+.PP
+The default actions are to replace all characters, add all font dimensions,
+and leave fonts at their natural size.
+.PP
+Each font file has an associated
+.I encoding
+vector. The encoding vector is used to determine where replacement or
+additional characters are positioned in fonts. The name associated with a
+character's input encoding is used to place the character in the output font.
+Encoding vector files are PostScript fragments, containing an array of 256
+names.
+.PP
+The
+.B \-enc
+option gives the desired output encoding; the default is to use the encoding
+of the first font specified.
+.PP
+The environment variable
+.B ENCPATH
+can be used to set an encoding path which will be searched for the
+encoding files. If a null path component is specified, the default path will
+be searched at that point. The encoding files will be looked for under the
+name given, and also with
+.B .enc
+appended.
+.PP
+The
+.B \-defenc
+option can be used to specify an encoding which will be used for
+each font which does not have an encoding specified. The default encoding is
+.I standard.
+.PP
+The family, face and encoding scheme fields of the output font can be set with
+the
+.B \-family, \-face,
+and
+.B \-coding
+options. The design size and number of design units per design size can be
+specified with the
+.B \-size
+and
+.B \-units
+options.
+.PP
+Normally
+.I makevpl
+informs you about what it is doing; the
+.B \-quiet
+option prevents this behaviour.
+.SH EXAMPLES
+To create a version of Times which can be used for maths in TeX, start
+with the Computer Modern maths font, and replace characters from an obliqued
+version of the symbol font, and Times-Italic:
+.sp
+.ce
+makevpl cmmi:CMsymbol rpsyro:symbol rptmri >ptmmi.vpl
+.sp
+To add ligatures to the standard encoding form of CharterBT-Roman:
+.sp
+.ce
+makevpl rbchr rbchr.ligs >rbchl.vpl
+.sp
+.SH FILES
+@ENCODINGDIR@/*.enc \- encoding vector files
+.SH AUTHOR
+Angus Duggan
+.SH "SEE ALSO"
+@MAN@, vftovp(1), vptovf(1), tftopl(1), afm2tfm(1)
+.SH BUGS
+.I Makevpl
+expands joined kerning and ligature tables; word boundary characters in the
+kerning and ligature tables may also be treated unusually.
+.I Makevpl
+is slow.
diff --git a/fonts/utilities/vplutils/makevpl.pl b/fonts/utilities/vplutils/makevpl.pl
new file mode 100644
index 0000000000..d0812ccf10
--- /dev/null
+++ b/fonts/utilities/vplutils/makevpl.pl
@@ -0,0 +1,628 @@
+#!@PERL@
+# makevpl
+# (C) A. J. C. Duggan 1993
+# Mix and match TeX's PL and VPL files
+#
+# FONTDIMEN actions are ---
+# -replacefd <range> | -addfd <range>
+#
+# CHARACTER actions are ---
+# -replace[ch|ic|wd|ht|dp|map] <range> |
+# -add[ch|ic|wd|ht|dp|map] <range>
+# (ch = character (all), ic = italic correction, wd = width, ht = height,
+# dp = depth, map = character map)
+#
+# mapfont FONTAT actions are ---
+# -normal | -at <size>
+#
+# default actions are:
+# -addfd - -replacech - -normal
+
+# v1.1 20/9/93 AJCD
+# Fixed problems with scaling, removed redundant MAPFONTs
+#
+# v1.2 23/9/93 AJCD
+# Split into reusable packages
+
+($prog) = ($0 =~ /([^\/]*)$/);
+
+unshift(@INC, "@PERLLIBDIR@"); # set perl include directory
+
+require 'paths.pl';
+require 'parseenc.pl';
+require 'parsepl.pl';
+
+###############################################################################
+# Auxiliary routines
+###############################################################################
+
+# fatal(...)
+# causes a fatal error with the arguments given
+sub fatal {
+ print STDERR "$prog: ";
+ printf STDERR @_;
+ print STDERR "\n";
+ exit 1;
+}
+
+# inrange(num, range)
+# tests if number is in the range given
+# range = num[,range] | [num]-[num][,range] | []
+sub inrange {
+ local($number, $range) = @_;
+ foreach (split(/,/, $range)) {
+ if (/^(0x?[\da-fA-F]+)/) {
+ next if $number < oct($1);
+ } elsif (/^(\d+)/) {
+ next if $number < $1;
+ }
+ if (/(0x?[\da-fA-F]+)$/) {
+ next if $number > oct($1);
+ } elsif (/(\d+)$/) {
+ next if $number > $1;
+ }
+ return 1;
+ }
+ 0;
+}
+
+# normalise(number)
+# return real normalised to design units of font
+sub normalise {
+ local($string) = @_;
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ $string = sprintf('R %.5f', &number($string)*$designsize*$dunits/($designunits*$dsize))
+ if $dsize*$designunits != $designsize*$dunits;
+ $string;
+}
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+# PL property functions
+# called by getpl with normal arguments as parameters
+
+sub checksum { # put checksum in MAPFONT
+ local($name, $number) = @_;
+ $fontprop{$fontname,0,FONTCHECKSUM} = "(FONTCHECKSUM $number)"
+ if !defined($fontprop{$fontname,0,FONTCHECKSUM});
+ undef;
+}
+
+sub designunits { # save designunits
+ local($name, $number) = @_;
+ $designunits = &number($number);
+ undef;
+}
+
+sub designsize { # save designsize
+ local($name, $number) = @_;
+ $fontprop{$fontname,0,FONTDSIZE} = "(FONTDSIZE $number)"
+ if !defined($fontprop{$fontname,0,FONTDSIZE});
+ $designsize = &number($number);
+ undef;
+}
+
+sub codingscheme { # keep original codingscheme
+ local($name, $string) = @_;
+ $fcoding = $string if !defined($fcoding);
+ undef;
+}
+
+sub family { # keep original family
+ local($name, $string) = @_;
+ $ffamily = $string if !defined($ffamily);
+ undef;
+}
+
+sub face { # keep original face
+ local($name, $number) = @_;
+ $fface = &number($number) if !defined($fface);
+ undef;
+}
+
+sub header { # keep original header
+ local($name, $byte, $value) = @_;
+ local($index) = &number($byte);
+ $header[$index] = "$byte $value" if !defined($header[$index]);
+ undef;
+}
+
+# mapfont properties
+sub mapfontprop { # MAPFONT sub-properties
+ join(' ', @_);
+}
+
+sub fontat { # fontat property is relative to designunits
+ local($name, $number) = @_;
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ if (!$scale) {
+ $number = sprintf('R %.5f', &number($number)*$dunits/$designunits)
+ if $dunits != $designunits;
+ } else {
+ local($fontat) = $scale*$dunits/$dsize;
+ $number = sprintf('R %.5f', $fontat)
+ if $fontat != $dunits;
+ }
+ "($name $number)";
+}
+
+sub mapfont { # MAPFONT property
+ local($name, $number, @map) = @_;
+ local($value) = &number($number);
+ foreach (@map) { # put MAPFONT properties into fontprops
+ $fontprop{$fontname,$value,$1} = $_
+ if /^\((\w+)/;
+ }
+ undef;
+}
+
+# ligtable properties
+sub ligprop {
+ join(' ', @_);
+}
+
+# addligs(left, skip, ligtable)
+# put entries into current font's ligtable for left-side character after
+# skipping given number of ligs & kerns
+sub addligs {
+ local($left) = shift;
+ local($skip) = shift;
+ local($lastlabel) = !$skip;
+ local($number);
+ return if $lastlabel && defined($kernslike{$fontname,$left});
+ while ($skip && ($_ = shift)) {
+ $skip-- if /KRN/ || /LIG/;
+ }
+ while (@_) {
+ $_ = shift;
+ last if (/STOP/);
+ if (/SKIP (\S \S+)/) {
+ &addligs($left, &number($1), @_);
+ last;
+ } elsif (/(\/?LIG\/?>?>?) (\S \S+) (\S \S+)/) {
+ foreach $ligto (&mapsto(&number($2))) {
+ if (!defined($ligtable{$fontname,$left,$ligto})) {
+ ($number) = &mapsto(&number($3));
+ $ligtable{$fontname,$left,$ligto} =
+ sprintf("($1 %s %s)", &charnum($ligto), &charnum($number))
+ if defined($number);
+ print STDERR "$ligtable{$fontname,$left,$ligto}\n" if $debug;
+ }
+ }
+ $lastlabel = 0;
+ } elsif (/(KRN) (\S \S+) (\S \S+)/) {
+ foreach $krnto (&mapsto(&number($2))) {
+ if (!defined($ligtable{$fontname,$left,$krnto})) {
+ $ligtable{$fontname,$left,$krnto} =
+ sprintf("($1 %s %s)", &charnum($krnto), &normalise($3));
+ print STDERR "$ligtable{$fontname,$left,$krnto}\n" if $debug;
+ }
+ }
+ $lastlabel = 0;
+ } elsif (/LABEL BOUNDARYCHAR/) {
+ $kernslike{$fontname,BOUNDARYCHAR} = $left
+ if ($lastlabel);
+ } elsif (/LABEL (\S \S+)/) {
+ if ($lastlabel) {
+ foreach (&mapsto(&number($1))) {
+ $kernslike{$fontname,$_} = $left;
+ }
+ }
+ }
+ }
+}
+
+sub ligtable { # merge ligtables
+ local($name) = shift;
+ print STDERR '(Building ligature table...' if !$quiet;
+ while (@_) { # run through program, putting LABELs in
+ $_ = shift;
+ if (/LABEL BOUNDARYCHAR/) {
+ &addligs(BOUNDARYCHAR, 0, @_);
+ } elsif (/LABEL (\S \S+)/) {
+ foreach (&mapsto(&number($1))) { # add lig table for each remapping
+ &addligs($_, 0, @_);
+ }
+ }
+ }
+ print STDERR 'done)' if !$quiet;
+}
+
+sub boundarychar { # keep original boundarychar
+ local($name, $char) = @_;
+ ($fbchar) = &mapsto(&number($char)) if !defined($fbchar);
+ undef;
+}
+
+# list of fontdimen names -> fontdimen numbers
+%fontdimen = (SLANT, 1, SPACE, 2, STRETCH, 3, SHRINK, 4, XHEIGHT, 5, QUAD, 6,
+ EXTRASPACE, 7, NUM1, 8, NUM2, 9, NUM3, 10, DENOM1, 11,
+ DENOM2, 12, SUP1, 13, SUP2, 14, SUP3, 15, SUB1, 16, SUB2, 17,
+ SUPDROP, 18, SUBDROP, 19, DELIM1, 20, DELIM2, 21, AXISHEIGHT, 22,
+ DEFAULTRULETHICKNESS, 8, BIGOPSPACING1, 9, BIGOPSPACING2, 10,
+ BIGOPSPACING3, 11, BIGOPSPACING4, 12, BIGOPSPACING5, 13
+ );
+
+# fontdimen properties
+sub fontdimen {
+ local($name, $number) = @_;
+ local($index) = $fontdimen{$name};
+ $fontdimen[$index] = '('.join(' ', $name, &normalise($number)).')'
+ if (!defined($fontdimen[$index]) && &inrange($index, $add{fd})) ||
+ &inrange($index, $sub{fd});
+ undef;
+}
+
+sub parameter {
+ local($name, $indexstr, $number) = @_;
+ local($index) = &number($indexstr);
+ $fontdimen[$index] = join(' ', "($name", $indexstr, &normalise($number)).')'
+ if (!defined($fontdimen[$index]) && &inrange($index, $add{fd})) ||
+ &inrange($index, $sub{fd});
+ undef;
+}
+
+# character properties
+%charprop = @thismap = ();
+
+sub charprop {
+ local($name, $number) = @_;
+ $charprop{$name} = "($name ".&normalise($number).')';
+ undef;
+}
+
+sub nextlarger { # deal with NEXTLARGER lists
+ local($name, $number) = @_;
+ print STDERR "$name $number : " if $debug;
+ ($charprop{NEXTLARGER}) = &mapsto(&number($number));
+ undef $charprop{VARCHAR}; # mutually exclusive
+}
+
+sub varprop { # deal with VARCHAR lists
+ local($name, $number) = @_;
+ print STDERR "$name $number :" if $debug;
+ ($charprop{$name}) = &mapsto(&number($number));
+ undef $charprop{NEXTLARGER}; # mutually exclusive
+}
+
+sub mapprop { # MAP sub-properties
+ local($name) = shift;
+ join(' ', "($name", @_).')'; # return property
+}
+
+sub mappropn { # normalised MAP sub-properties
+ local($name) = shift;
+ foreach (@_) {
+ $_ = &normalise($_);
+ }
+ join(' ', "($name", @_).')'; # return property
+}
+
+sub map { # deal with MAP lists
+ local($name);
+ ($name, @thismap) = @_;
+ undef;
+}
+
+sub character { # add or replace character properties
+ local($name, $number) = @_;
+ local($position) = &number($number);
+ local($lastsel, $lastfont, $font) = 0;
+ foreach $ch (&mapsto($position)) {
+ $charic[$ch] = $charprop{CHARIC}
+ if (!defined($charic[$ch]) && &inrange($position, $add{ic})) ||
+ &inrange($position, $sub{ic});
+ $charwd[$ch] = $charprop{CHARWD}
+ if (!defined($charwd[$ch]) && &inrange($position, $add{wd})) ||
+ &inrange($position, $sub{wd});
+ $charht[$ch] = $charprop{CHARHT}
+ if (!defined($charht[$ch]) && &inrange($position, $add{ht})) ||
+ &inrange($position, $sub{ht});
+ $chardp[$ch] = $charprop{CHARDP}
+ if (!defined($chardp[$ch]) && &inrange($position, $add{dp})) ||
+ &inrange($position, $sub{dp});
+ if ((!defined($charmap[$ch]) && &inrange($position, $add{map})) ||
+ &inrange($position, $sub{map})) {
+ @thismap = ("(SETCHAR $number)") if !@thismap; # make default MAP
+ $charmap[$ch] = join("\n", '(MAP', @thismap, ')');
+ $charfrom[$ch] = $fontname;
+ $nextlarger[$ch] = $charprop{NEXTLARGER}
+ if defined($charprop{NEXTLARGER});
+ foreach $varprop (TOP, MID, BOT, REP) {
+ $varchar{$ch,$varprop} = $charprop{$varprop}
+ if defined($charprop{$varprop});
+ }
+ }
+ }
+ %charprop = @thismap = ();
+ undef;
+}
+
+###############################################################################
+# Parsing and tokenisation
+###############################################################################
+
+# list of property -> parameters_action
+# (N=number, S=string, P=property list, L=label or number)
+&plactions(CHECKSUM, checksum, DESIGNSIZE, designsize,
+ DESIGNUNITS, designunits, CODINGSCHEME, codingscheme,
+ FAMILY, family, FACE, family, SEVENBITSAFEFLAG, ignore,
+ HEADER, header, BOUNDARYCHAR, boundarychar,
+ VTITLE, ignore, COMMENT, ignore,
+ FONTDIMEN, ignore, # FONTDIMEN properties follow
+ SLANT, fontdimen, SPACE, fontdimen, STRETCH, fontdimen,
+ SHRINK, fontdimen, XHEIGHT, fontdimen, QUAD, fontdimen,
+ EXTRASPACE, fontdimen, NUM1, fontdimen, NUM2, fontdimen,
+ NUM3, fontdimen, DENOM1, fontdimen, DENOM2, fontdimen,
+ SUP1, fontdimen, SUP2, fontdimen, SUP3, fontdimen,
+ SUB1, fontdimen, SUB2, fontdimen, SUPDROP, fontdimen,
+ SUBDROP, fontdimen, DELIM1, fontdimen, DELIM2, fontdimen,
+ AXISHEIGHT, fontdimen, DEFAULTRULETHICKNESS, fontdimen,
+ BIGOPSPACING1, fontdimen, BIGOPSPACING2, fontdimen,
+ BIGOPSPACING3, fontdimen, BIGOPSPACING4, fontdimen,
+ BIGOPSPACING5, fontdimen, PARAMETER, parameter,
+ LIGTABLE, ligtable, # LIGTABLE properties follow
+ LABEL, ligprop, KRN, ligprop, STOP, ligprop,
+ SKIP, ligprop, LIG, ligprop, '/LIG', ligprop,
+ '/LIG>', ligprop, 'LIG/', ligprop, 'LIG/>', ligprop,
+ '/LIG/', ligprop, '/LIG/>', ligprop,
+ '/LIG/>>', ligprop,
+ MAPFONT, mapfont, # MAPFONT properties follow
+ FONTDSIZE, mapfontprop, FONTNAME, mapfontprop,
+ FONTAREA, mapfontprop, FONTCHECKSUM, mapfontprop,
+ FONTAT, fontat,
+ CHARACTER, character, # CHARACTER properties follow
+ CHARWD, charprop, CHARHT, charprop, CHARDP, charprop,
+ CHARIC, charprop, NEXTLARGER, nextlarger,
+ VARCHAR, ignore, # VARCHAR properties follow
+ TOP, varprop, MID, varprop, BOT, varprop, REP, varprop,
+ MAP, map, # MAP properties follow
+ SELECTFONT, mapprop, SETCHAR, mapprop,
+ SETRULE, mappropn, PUSH, mapprop, POP, mapprop,
+ MOVERIGHT, mappropn, MOVELEFT, mappropn, MOVEUP, mappropn,
+ MOVEDOWN, mappropn, SPECIAL, mapprop, SPECIALHEX, mapprop
+ );
+
+sub getpl {
+ local($fontname) = &fontname(@_);
+ $fontprop{$fontname,0,FONTNAME} = "(FONTNAME $fontname)";
+ &parsepl(@_);
+ if ($scale && !defined($fontprop{$fontname,0,FONTAT})) {
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ local($fontat) = $scale*$dunits/$dsize;
+ $fontprop{$fontname,0,FONTAT} = sprintf("(FONTAT R %.5f)", $fontat)
+ if $fontat != $dunits;
+ }
+}
+
+###############################################################################
+# output routines
+###############################################################################
+
+# output VPL variables
+@charic = (); # italic corrections
+@charwd = (); # character widths
+@charht = (); # character heights
+@chardp = (); # character depths
+@charmap = (); # character map
+@nextlarger = (); # nextlarger lists
+%varchar = (); # number,property -> number
+%ligtable = (); # font,left,right -> lig/kern property
+%kernslike = (); # font,number -> number
+@fontdimen = (); # array of number -> property
+%mapfont = (); # number,property -> property
+%fontprop = (); # name,select,propname -> property
+@header = (); # header byte -> value
+@charfrom = (); # number -> font
+
+$mapfont = 0; # current MAPFONT number
+
+# fontmapsto(file, select)
+# maps a font selection number to the final output number and outputs MAPFONT
+sub fontmapsto { # return final MAPFONT of fontname,selectnum
+ local($fn, $select) = @_;
+ local($fontname) = $fontprop{$fn,$select,FONTNAME};
+ local($fontarea) = $fontprop{$fn,$select,FONTAREA};
+ local($fontat) = $fontprop{$fn,$select,FONTAT};
+ if (!defined($mapfont{$fontname,$fontarea,$fontat})) {
+ local(@mapfont);
+ foreach (FONTNAME, FONTAREA, FONTCHECKSUM, FONTAT, FONTDSIZE) {
+ push(@mapfont, $fontprop{$fn,$select,$_})
+ if defined($fontprop{$fn,$select,$_});
+ }
+ &expand("(MAPFONT D $mapfont", @mapfont, ')');
+ $mapfont{$fontname,$fontarea,$fontat} = $mapfont++;
+ }
+ $mapfont{$fontname,$fontarea,$fontat};
+}
+
+# remap(file, map)
+# remaps font selections to the final output font
+sub remap { # remap fontmap to output fonts
+ local($fn) = shift;
+ local($lastsel, $lastfont, $font) = (0, 0);
+ foreach (@_) {
+ if (/\(SELECTFONT (.*)\)/) {
+ $font = &fontmapsto($fn, $lastsel = &number($1));
+ if ($font != $lastfont) { # substitute mapped font
+ $_ = "(SELECTFONT D $font)";
+ } else { # font same as last selected, and can be ignored
+ $_ = '';
+ }
+ $lastfont = $font;
+ } elsif (/SETCHAR/) {
+ $font = &fontmapsto($fn, $lastsel);
+ $_ = "(SELECTFONT D $font)\n$_"
+ if ($font != $lastfont); # substitute mapped font
+ $lastfont = $font;
+ }
+ }
+ join("\n", @_);
+}
+
+# makevpl()
+# print out tidied up vpl file
+sub makevpl {
+ local(@proplist, $index, $temp);
+ local($font, $right, $left, %outlig); # for ligtable construction
+
+ print STDERR "Creating virtual property list\n" if !$quiet;
+
+ print STDERR "...writing header\n" if !$quiet;
+ print "(VTITLE created by $vtitle)\n",
+ "(COMMENT $prog is (C) A. J. C. Duggan 1993)\n";
+
+ printf "(DESIGNSIZE R %.5f)\n", $dsize if defined($dsize);
+ printf "(DESIGNUNITS R %.5f)\n", $dunits if defined($dunits);
+ print "(FAMILY $ffamily)\n" if defined($ffamily);
+ printf "(FACE O %o)\n", $fface if defined($fface);
+ print "(CODINGSCHEME $fcoding)\n" if defined($fcoding);
+
+ for ($index = 0; $index < @header; $index++) { # output header bytes
+ print "(HEADER $header[$index])\n" if defined $header[$index];
+ }
+
+ print STDERR "...writing font dimensions\n" if !$quiet;
+ &expand('(FONTDIMEN', grep($_ ne undef, @fontdimen), ')')
+ if @fontdimen; # output fontdimens
+
+ print STDERR "...writing font mappings\n" if !$quiet;
+ for ($index = 0; $index < 256; $index++) { # remap fonts
+ $charmap[$index] = &remap($charfrom[$index],
+ split("\n", $charmap[$index]))
+ if defined($charmap[$index]);
+ }
+
+ print STDERR "...writing ligature table\n" if !$quiet;
+ printf "(BOUNDARYCHAR %s)\n", &charnum($fbchar) if defined($fbchar);
+ while (($_, $temp) = each %ligtable) { # ligtable mangling
+ ($font, $left, $right) = split($;);
+ $outlig{$left} .= "$temp\n"
+ if ($left eq BOUNDARYCHAR || $charfrom[$left] eq $font) &&
+ ((defined($fbchar) && $right == $fbchar) ||
+ $charfrom[$right] eq $font);
+ }
+ @proplist = (); # clear output LIGTABLE
+ foreach (keys(%outlig)) {
+ while (($left, $right) = each %kernslike) {
+ ($font, $left) = split($;, $left);
+ if ($right eq $_ &&
+ ($left eq BOUNDARYCHAR || $charfrom[$left] eq $font)) {
+ if ($left eq BOUNDARYCHAR) {
+ push(@proplist, "(LABEL $left)");
+ } else {
+ push(@proplist, sprintf("(LABEL %s)", &charnum($left)));
+ }
+ }
+ }
+ if ($_ eq BOUNDARYCHAR) {
+ push(@proplist, "(LABEL $_)");
+ } else {
+ push(@proplist, sprintf("(LABEL %s)", &charnum($_)));
+ }
+ push(@proplist, split("\n", $outlig{$_}));
+ push(@proplist, '(STOP)');
+ }
+ &expand('(LIGTABLE', @proplist, ')')
+ if @proplist; # output ligtable
+
+ print STDERR "...writing characters\n" if !$quiet;
+ for ($index = 0; $index < 256; $index++) { # only output chars with MAPs
+ @proplist = ();
+ foreach (TOP, MID, BOT, REP) {
+ push(@proplist, sprintf("($_ %s)", &charnum($temp)))
+ if defined($temp = $varchar{$index,$_}) &&
+ defined($charmap[$temp]);
+ }
+ &expand(sprintf("(CHARACTER %s", &charnum($index)),
+ sprintf("(COMMENT %s)", &encodeto($index)),
+ $charwd[$index], $charht[$index],
+ $chardp[$index], $charic[$index],
+ defined($temp = $nextlarger[$index]) &&
+ defined($charmap[$temp]) ?
+ sprintf("(NEXTLARGER %s)", &charnum($temp)) : '',
+ @proplist ? ('(VARCHAR', @proplist, ')') : '',
+ $charmap[$index], ')')
+ if defined($charmap[$index]);
+ }
+ print STDERR "...done\n" if !$quiet;
+}
+
+###############################################################################
+# Actions
+###############################################################################
+
+# default actions
+%add = (fd, '-'); # additions
+%sub = (wd, '-', ht, '-', dp, '-', ic, '-', map, '-'); # substitutions
+$scale = 0; # scale
+
+###############################################################################
+# Argument processing
+###############################################################################
+
+$vtitle = join(' ', $prog, @ARGV); # set VTITLE to arguments
+$defaultenc = 'standard'; # default encoding
+
+while (@ARGV) {
+ $_ = shift;
+ ARGSW:
+ {
+ /^-quiet$/ && ($quiet = 1, last ARGSW);
+ /^-defenc$/ && ($defaultenc = shift, last ARGSW);
+ /^-enc$/ && (&getencoding(shift, &pathexpand($ENV{ENCPATH},
+ '.:@ENCODINGDIR@')),
+ last ARGSW);
+ /^-debug$/ && ($debug = 1, last ARGSW);
+ /^-at$/ && ($scale = shift, last ARGSW);
+ /^-normal$/ && ($scale = 0, last ARGSW);
+ /^-replacech$/ &&
+ ($sub{wd} = $sub{ht} = $sub{dp} = $sub{ic} = $sub{map} = shift,
+ $add{wd} = $add{ht} = $add{dp} = $add{ic} = $add{map} = '',
+ last ARGSW);
+ /^-addch$/ &&
+ ($sub{wd} = $sub{ht} = $sub{dp} = $sub{ic} = $sub{map} = '',
+ $add{wd} = $add{ht} = $add{dp} = $add{ic} = $add{map} = shift,
+ last ARGSW);
+ /^-replace(ic|wd|ht|dp|fd|map)$/ &&
+ ($sub{$1} = shift, $add{$1} = '', last ARGSW);
+ /^-add(ic|wd|ht|dp|fd|map)$/ &&
+ ($sub{$1} = '', $add{$1} = shift, last ARGSW);
+ /^-size$/ && ($dsize = shift, last ARGSW);
+ /^-units$/ && ($dunits = shift, last ARGSW);
+ /^-family$/ && ($ffamily = shift, last ARGSW);
+ /^-face$/ && ($fface = shift, last ARGSW);
+ /^-coding$/ && ($fcoding = shift, last ARGSW);
+ if (/^-/) {
+ /^-v$/ && print STDERR "$prog release @RELEASE@\n";
+ print STDERR join("\n",
+ "Usage: $prog [-quiet] [-defenc defaultenc] [-enc enc] [-at size] [-normal]",
+ " [-addxx range|-replacexx range, xx=ch,fd,wd,ht,dp,ic,map]",
+ " [-size num] [-units num] [-family str] [-face num] [-coding scheme]",
+ " filename[:encoding]...\n");
+ exit 1;
+ } else { # filename[:encoding]
+ %defaultadd = %add if !defined(%defaultadd); # set default actions
+ %defaultsub = %sub if !defined(%defaultsub);
+ $defaultscale = $scale if !defined($defaultscale);
+ ($file, $encoding) = split(/:/);
+ &getencoding($encoding eq '' ? $defaultenc : $encoding,
+ &pathexpand($ENV{ENCPATH}, '.:@ENCODINGDIR@'));
+ &getpl($file); # process PL file
+ %add = %defaultadd; # restore default actions
+ %sub = %defaultsub;
+ $scale = $defaultscale;
+ }
+ }
+}
+
+&fatal('no property list files specified') if !defined($file);
+
+&makevpl; # build and print final PL
+
+exit 0; # good termination
diff --git a/fonts/utilities/vplutils/parseenc.pl b/fonts/utilities/vplutils/parseenc.pl
new file mode 100644
index 0000000000..6c2e7f86f5
--- /dev/null
+++ b/fonts/utilities/vplutils/parseenc.pl
@@ -0,0 +1,111 @@
+# -*-perl-*-
+# parseenc.pl
+# (C) A. J. C. Duggan 22/9/93
+# Parsing package for Adobe encoding vector files
+#
+# public routines are:
+# getencoding(name, path) Reads encoding file found in path
+# mapsto(charnumber) Returns character mappings in output encoding
+# charnum(charnumber) Returns character representation for output
+# encodeto(charnumber) Returns glyph name of character number
+
+###############################################################################
+# Encoding reading routines
+###############################################################################
+
+require 'paths.pl'; # needs pathopen
+
+package parseenc; # start package
+
+# default encodings
+%encodings = (); # array of name -> encoding vector
+@encodeto = (); # target encoding
+
+# readencoding(handle)
+# reads an open encoding vector file into @encoding
+sub readencoding {
+ local($file) = shift;
+ local($ordinal, $invector) = (0, 0);
+ @encoding = (); # current encoding vector
+ while (<$file>) {
+ s/%.*//; # remove comments
+ foreach (split(/[\s\/]+/)) {
+ if ($_ eq '[') {
+ $invector++;
+ } elsif ($_ eq ']') {
+ $invector--;
+ } elsif ($_ ne '' && $invector) {
+ push(@encoding, $_);
+ $ordinal++;
+ }
+ }
+ }
+ &main'fatal("encoding vector $file has %d elements, should be 256", #'
+ $ordinal) if $ordinal != 256;
+}
+
+# getencoding(file)
+# packages calls to pathopen and readencoding to get encoding vectors, if they
+# have not already been read.
+sub main'getencoding {
+ local($enc) = shift;
+ if (!defined($encodings{$enc})) {
+ print STDERR "Looking for $enc encoding file\n" if !$quiet;
+ if (&main'pathopen($enc, ',enc', @_)) {
+ &readencoding($enc); # get @encoding vector
+ $encodings{$enc} = join("\n", @encoding);
+ @encodeto = @encoding if !@encodeto; # set target encoding
+ close($enc);
+ } else {
+ &main'fatal("can't find encoding vector $enc");
+ }
+ } else {
+ @encoding = split("\n", $encodings{$enc});
+ }
+ %mapstocache = (); # clear mapping cache
+}
+
+# mapsto(char)
+# return mappings of char in target encoding
+sub main'mapsto {
+ local($number) = shift;
+ local($glyph) = $encoding[$number];
+ local(@mappings);
+ if (defined($mapstocache{$number})) {
+ @mappings = split(', ', $mapstocache{$number});
+ } else {
+ local($index) = 0;
+ grep($glyph eq $_ ? push(@mappings, $index++) : $index++, @encodeto);
+ $mapstocache{$number} = join(', ', @mappings);
+ }
+ print STDERR "Char $number -> $mapstocache{$number} ($glyph)\n"
+ if $main'debug;
+ @mappings;
+}
+
+%charnum = (); # glyph name -> print-as-char
+grep($charnum{$_}++, exclam, quotedbl, numbersign, dollar, percent,
+ ampersand, quoteright, asterisk, plus, comma, minus, period, slash, zero,
+ one, two, three, four, five, six, seven, eight, nine, colon, semicolon,
+ less, equal, greater, question, at, A, B, C, D, E, F, G, H, I, J, K, L, M,
+ N, O, P, Q, R, S, T, U, V, W, X, Y, Z, bracketleft, backslash,
+ bracketright, asciicircum, underscore, quoteleft, a, b, c, d, e, f, g, h,
+ i, j, k, l, 'm', n, o, p, 'q', r, 's', t, u, v, w, 'x', 'y', z, braceleft,
+ bar, braceright, asciitilde);
+
+# charnum(number)
+# expands to character number or code in output encoding
+sub main'charnum {
+ local($char) = shift;
+ $char > 32 && $char < 127 && $char != 40 && $char != 41 &&
+ defined($charnum{$encodeto[$char]}) ?
+ sprintf('C %c', $char) : sprintf('O %o', $char);
+}
+
+# encodeto(number)
+# returns glyph name of character in output encoding
+sub main'encodeto {
+ $encodeto[shift];
+}
+
+1;
diff --git a/fonts/utilities/vplutils/parsepl.pl b/fonts/utilities/vplutils/parsepl.pl
new file mode 100644
index 0000000000..9131730135
--- /dev/null
+++ b/fonts/utilities/vplutils/parsepl.pl
@@ -0,0 +1,254 @@
+# -*-perl-*-
+# parsepl.pl
+# (C) A. J. C. Duggan 22/9/93
+# Parsing package for TeX's PL and VPL files
+#
+# public routines are:
+# number(property) Returns numeric value of number property
+# fontname(file) Returns default font name for filename
+# plactions(name, act...) Register property actions for parsing
+# parsepl(file) Open and parse PL/VPL file using plactions
+# expand(props) Output indented property list
+# default plactions provided are:
+# ignore(props) Ignore property or property list
+# property(prop) Generate (property) form
+# list(proplist) Generate (proplist) form
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+package parsepl;
+
+# number(property)
+# returns the value of number defined by property
+sub main'number {
+ local($_, $value) = split(' ', shift);
+ local(%xerox) = (MRR, 0, MIR, 1, BRR, 2, BIR, 3, LRR, 4, LIR, 5, MRC, 6,
+ MIC, 7, BRC, 8, BIC, 9, LRC, 10, LIC, 11, MRE, 12,
+ MIE, 13, BRE, 14, BIE, 15, LRE, 16, LIE, 17);
+ NUMBER:
+ {
+ /^C$/ && (($value) = unpack(C, $value), last NUMBER);
+ /^D$/ && ($value = $value+0, last NUMBER);
+ /^F$/ && ($value = $xerox{$value}, last NUMBER);
+ /^O$/ && ($value = oct($value), last NUMBER);
+ /^H$/ && ($value = hex($value), last NUMBER);
+ /^R$/ && ($value = $value+0.0, last NUMBER);
+ &main'fatal("bad number: $_ $value");
+ }
+ $value;
+}
+
+# fontname(file)
+# return default fontname of file
+sub main'fontname {
+ local($_) = shift;
+ print STDERR "Fontname for $_ is " if $main'debug;
+ s:^.*/::; # drop directory names
+ s/\.[^\.]*$//; # drop extension
+ print STDERR "$_\n" if $main'debug;
+ $_;
+}
+
+# plactions(propname, action, ...)
+# register property list actions
+sub main'plactions {
+ local($propname, $action);
+ local($package) = caller;
+ while (@_) {
+ ($propname, $action) = (shift, shift);
+ $actions{$propname} = "${package}'$action";
+ }
+}
+
+# PL property functions
+# called by parsepl with depth and normal arguments as parameters
+sub main'ignore { # ignore
+ print STDERR join(' ', "Ignoring", @_), "\n" if $main'debug;
+ undef;
+}
+
+sub main'property { # return as property
+ '('.join(' ', @_).')';
+}
+
+sub main'list { # return as property list
+ local($name) = shift;
+ join("\n", "($name", @_, ')');
+}
+
+# list of property -> parameters
+# (N=number, S=string, P=property list, L=label or number)
+%parameters = (CHECKSUM, S, DESIGNSIZE, N, DESIGNUNITS, N, CODINGSCHEME, S,
+ FAMILY, S, FACE, N, SEVENBITSAFEFLAG, S, HEADER, NN,
+ BOUNDARYCHAR, N, VTITLE, S, COMMENT, S,
+ FONTDIMEN, P, # FONTDIMEN properties follow
+ SLANT, N, SPACE, N, STRETCH, N, SHRINK, N, XHEIGHT, N, QUAD, N,
+ EXTRASPACE, N, NUM1, N, NUM2, N, NUM3, N, DENOM1, N, DENOM2, N,
+ SUP1, N, SUP2, N, SUP3, N, SUB1, N, SUB2, N, SUPDROP, N,
+ SUBDROP, N, DELIM1, N, DELIM2, N, AXISHEIGHT, N,
+ DEFAULTRULETHICKNESS, N, BIGOPSPACING1, N, BIGOPSPACING2, N,
+ BIGOPSPACING3, N, BIGOPSPACING4, N, BIGOPSPACING5, N,
+ PARAMETER, NN,
+ LIGTABLE, P, # LIGTABLE properties follow
+ LABEL, L, KRN, NN, STOP, '', SKIP, N, LIG, NN, '/LIG', NN,
+ '/LIG>', NN, 'LIG/', NN, 'LIG/>', NN, '/LIG/', NN, '/LIG/>', NN,
+ '/LIG/>>', NN,
+ MAPFONT, NP, # MAPFONT properties follow
+ FONTDSIZE, N, FONTNAME, S, FONTAREA, S, FONTCHECKSUM, N,
+ FONTAT, N,
+ CHARACTER, NP, # CHARACTER properties follow
+ CHARWD, N, CHARHT, N, CHARDP, N, CHARIC, N, NEXTLARGER, N,
+ VARCHAR, P, # VARCHAR properties follow
+ TOP, N, MID, N, BOT, N, REP, N,
+ MAP, P, # MAP properties follow
+ SELECTFONT, N, SETCHAR, N, SETRULE, NN, PUSH, '', POP, '',
+ MOVERIGHT, N, MOVELEFT, N, MOVEUP, N, MOVEDOWN, N, SPECIAL, S,
+ SPECIALHEX, S
+ );
+
+@tokens = (); # list of tokens still to be processed
+$token = undef; # current token value
+
+# gettoken(notblank, [notrequired])
+# gets the next non-null token from the input file, causes an error if there
+# are no tokens and notrequired is false (or not present). Uses the file name
+# from ancestor functions.
+sub gettoken {
+ local($blankok, $notrequired) = @_;
+ for (;;) {
+ while (@tokens) {
+ $token = shift(@tokens);
+ return $token if $token ne '' && ($blankok || $token !~/^\s*$/);
+ }
+ if ($_ = <$file>) {
+ @tokens = split(/(\(|\)|\s+)/);
+ } else {
+ return $token = undef if $notrequired;
+ &main'fatal("property list $file ended early");
+ }
+ }
+}
+
+# getstring()
+# returns a token representing a string
+sub getstring {
+ local($string, $blanks, $paren);
+ while (&gettoken($blanks++) ne ')' || $paren) {
+ $string .= $token;
+ $paren++ if $token eq '(';
+ $paren-- if $token eq ')';
+ }
+ unshift(@tokens, $token);
+ $string;
+}
+
+# getnumber(sep)
+# returns a list representing a number
+sub getnumber {
+ join(' ', &gettoken(), &gettoken());
+}
+
+# getproperty(separator, outer)
+# returns a property, with the parts separated by the separator
+# outer determines if it is an outer-level property
+sub getproperty {
+ local($outer) = shift;
+ local(@property, $propname, $fn);
+ if (&gettoken(0, $outer) ne undef) {
+ if ($token eq '(') {
+ print STDERR '.' if !$main'debug && !$main'quiet;
+ push(@property, $propname = &gettoken()); # get property name
+ &main'fatal("unknown property name $propname in file $file")
+ if !defined($parameters{$propname});
+ $fn = $actions{$propname};
+ foreach (split(//, $parameters{$propname})) {
+ if (/N/) { # number required
+ push(@property, &getnumber());
+ } elsif (/S/) { # string required
+ push(@property, &getstring());
+ } elsif (/L/) { # label or number required
+ if (&gettoken() eq BOUNDARYCHAR) {
+ push(@property, $token);
+ } else {
+ unshift(@tokens, $token);
+ push(@property, &getnumber());
+ }
+ } elsif (/P/) { # property list required
+ push(@property, &getproplist());
+ } else { # internal table error
+ &main'fatal("this can't happen; property $propname parameter is $_");
+ }
+ }
+ &main'fatal("$propname parameter list terminated by $token in $file")
+ if &gettoken() ne ')';
+ $property = do $fn(@property)
+ if $fn ne undef;
+ } else { # token wasn't (, so restore it.
+ unshift(@tokens, $token);
+ $property = EOL;
+ }
+ } else {
+ $property = EOF;
+ }
+ $property;
+}
+
+# getproplist(separator, outer)
+# returns a property list, with the properties separated by the separator
+# outer determines if it is an outer-level property
+sub getproplist {
+ local(@proplist);
+ for (;;) {
+ &getproperty(0);
+ last if $property eq EOL;
+ push(@proplist, $property);
+ }
+ @proplist;
+}
+
+# parsepl(file)
+# parses the property list in file
+sub main'parsepl {
+ local($file) = shift;
+ local($caller) = caller;
+ foreach ("designsize = 10", "designunits = 1", "codingscheme = UNSPECIFIED",
+ "family = UNSPECIFIED") {
+ eval "\$${caller}'$_";
+ }
+ print STDERR "Looking for PL/VPL $file\n" if !$main'quiet; #'
+ if (open($file, $file) || open($file, "$file.pl") ||
+ open($file, "$file.vpl")) {
+ while (&getproperty(1) ne EOF) {
+ print STDERR '/' if !$main'debug && !$main'quiet;
+ };
+ &main'fatal("property list file $file contains extra tokens $token...")
+ if $token ne undef;
+ print STDERR "\n" if !$main'debug && !$main'quiet;
+ close($file);
+ } else {
+ &main'fatal("can't find PL or VPL file for $file");
+ }
+}
+
+###############################################################################
+# VPL output routines
+###############################################################################
+
+# expand(pl)
+# print balanced property list with proper indentation
+sub main'expand {
+ local($indent) = 0;
+ local(@list) = @_;
+ foreach (@list) {
+ foreach (split("\n")) {
+ s/^\s*//;
+ next if /^$/;
+ print ' ' x $indent, $_, "\n";
+ $indent += split('\(', $_, -1) - split('\)', $_, -1);
+ }
+ }
+}
+
+1;
diff --git a/fonts/utilities/vplutils/paths.pl b/fonts/utilities/vplutils/paths.pl
new file mode 100644
index 0000000000..8ba65a9018
--- /dev/null
+++ b/fonts/utilities/vplutils/paths.pl
@@ -0,0 +1,51 @@
+# -*-perl-*-
+# paths.pl
+# (C) A. J. C. Duggan 22/9/93
+# Path expansion and file searching package
+#
+# public routines are:
+# pathexpand(path, default, initial) Expands colon-separated path
+# pathopen(name, suffixes, path) Opens file by searching path
+
+###############################################################################
+# Path manipulation routines
+###############################################################################
+
+package paths; # start package
+
+# pathexpand(path, defaultpath, extra...)
+# expands a colon-separated path and default path to an array, inserting the
+# default path instead of null components in the path. An optional third
+# argument has extra elements to put at the start of the path.
+sub main'pathexpand {
+ local($path, $defaultpath, @path) = @_;
+ grep($_ eq '' ?
+ grep($_ ne '' ? push(@path, $_) : 0, split(/:/, $defaultpath)) :
+ push(@path, $_),
+ split(/:/, $path, -1));
+ @path;
+}
+
+# pathopen(file, suffixes, path...)
+# searches the path for file name and opens it for reading.
+# suffixes is a comma-separated list of suffixes to be applied to file.
+# returns non-zero on success, the undefined value otherwise.
+sub main'pathopen {
+ local($name, $suffixes, @path) = @_;
+ local($package) = caller;
+ print STDERR "Searching ", join(':', @path), " for $name\n",
+ "Suffixes ", join(', ', split(',', $suffixes, -1)), "\n"
+ if $main'debug;
+ foreach $dir (@path) {
+ foreach $suffix (split(',', $suffixes, -1)) {
+ $suffix = ".$suffix" if $suffix ne '';
+ print STDERR "Trying $dir/$name$suffix ...\n" if $main'debug;
+ return $value if $value = open("${package}'$name",
+ "$dir/$name$suffix");
+ }
+ }
+ print STDERR "$name not found\n" if $main'debug;
+ undef;
+}
+
+1;
diff --git a/fonts/utilities/vplutils/spacevpl.man b/fonts/utilities/vplutils/spacevpl.man
new file mode 100644
index 0000000000..1cba9ec9ca
--- /dev/null
+++ b/fonts/utilities/vplutils/spacevpl.man
@@ -0,0 +1,85 @@
+.TH SPACEVPL 1 "VPLUtils Release @RELEASE@"
+.SH NAME
+spacevpl \- alter character dimensions and shifts in TeX's PL and VPL fonts
+.SH SYNOPSIS
+.B spacevpl
+[
+.B \-quiet
+] [
+.B \-range
+.I range
+] [
+.B \-wd
+.I expr
+] [
+.B \-ht
+.I expr
+] [
+.B \-dp
+.I expr
+] [
+.B \-ic
+.I expr
+] [
+.B \-hs
+.I expr
+] [
+.B \-vs
+.I expr
+]
+.I font
+.SH DESCRIPTION
+.I Spacevpl
+alters the dimensions of characters in a property list (PL) or virtual
+property list (VPL) file.
+.PP
+The options
+.B \-wd, \-ht, \-dp, \-ic, \-hs
+and
+.B \-vs
+are used to specify how the character width, height, depth, italic correction,
+horizontal shift, and vertical shift are altered. The
+.I expr
+argument to these options is an arithmetic expression, which may include
+numeric constants (given in points) and any of
+.I wd, ht, dp, ic, hs
+and
+.I vs
+to specify the original values of the character dimensions, or
+.I ds
+to specify the design size of the font. These operands are combined with the
+operators
+.I \-, *, /, +.
+Sub-expressions may be enclosed in parentheses.
+.PP
+The
+.B \-range
+option specifies the range of characters which are modified. The range is a
+comma separated list of numbers or subranges of the form
+.I low\-high.
+If
+.I low
+and/or
+.I high
+are omitted, the subrange is unbounded at the appropriate end(s).
+.PP
+Normally
+.I spacevpl
+informs you about what it is doing; the
+.B \-quiet
+option prevents this behaviour.
+.SH EXAMPLES
+To create adjust a normal italic font so that it is more appropriate for maths
+typesetting, add the italic correction onto the character width, and remove
+the italic correction. Extra left and right sidebearings is applied too:
+.sp
+.ce
+spacevpl -wd 'ic+wd+.15*ds' -ic 0 -hs '0.02*ds' in.pl >out.vpl
+.sp
+.SH AUTHOR
+Angus Duggan
+.SH "SEE ALSO"
+@MAN@, vftovp(1), vptovf(1), tftopl(1), afm2tfm(1)
+.SH BUGS
+.I Spacevpl
+is slow.
diff --git a/fonts/utilities/vplutils/spacevpl.pl b/fonts/utilities/vplutils/spacevpl.pl
new file mode 100644
index 0000000000..f51201630f
--- /dev/null
+++ b/fonts/utilities/vplutils/spacevpl.pl
@@ -0,0 +1,349 @@
+#!@PERL@
+# spacevpl
+# (C) A. J. C. Duggan 1993
+# Alter sizes at sidebearings of VPL files
+#
+# actions are ---
+# -ht expr -wd expr -dp expr -ic expr -hs expr -vs expr
+# (ic = italic correction, wd = width, ht = height, dp = depth,
+# hs = horizontal shift, vs = vertical shift)
+# exprs combine these dimensions and constants with *, /, +, -
+
+# v1.2 23/9/93 AJCD
+# Created at vplutils release level 1.2
+
+($prog) = ($0 =~ /([^\/]*)$/);
+
+unshift(@INC, "@PERLLIBDIR@"); # set perl include directory
+
+require 'paths.pl';
+require 'parseenc.pl';
+require 'parsepl.pl';
+
+###############################################################################
+# Auxiliary routines
+###############################################################################
+
+# fatal(...)
+# causes a fatal error with the arguments given
+sub fatal {
+ print STDERR "$prog: ";
+ printf STDERR @_;
+ print STDERR "\n";
+ exit 1;
+}
+
+# inrange(num, range)
+# tests if number is in the range given
+# range = num[,range] | [num]-[num][,range] | []
+sub inrange {
+ local($number, $range) = @_;
+ foreach (split(/,/, $range)) {
+ if (/^(0x?[\da-fA-F]+)/) {
+ next if $number < oct($1);
+ } elsif (/^(\d+)/) {
+ next if $number < $1;
+ }
+ if (/(0x?[\da-fA-F]+)$/) {
+ next if $number > oct($1);
+ } elsif (/(\d+)$/) {
+ next if $number > $1;
+ }
+ return 1;
+ }
+ 0;
+}
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+# PL property functions
+# called by parsepl with normal arguments as parameters
+
+sub printprop { # print a property
+ &expand(&property(@_));
+ undef;
+}
+
+sub printlist { # print a property list
+ &expand(&list(@_));
+ undef;
+}
+
+sub mapfont { # print a property list with one previous param
+ local($first) = join(' ', shift, shift);
+ $mapfont = 1;
+ &expand(&list($first, @_));
+ undef;
+}
+
+sub vtitle {
+ &expand(&property("COMMENT", @_));
+ undef;
+}
+
+sub checksum { # save checksum
+ local($name, $number) = @_;
+ push(@fontprops, "(FONTCHECKSUM $number)");
+ &expand(&property($name, $number));
+ undef;
+}
+
+sub designunits { # save designunits
+ local($name, $number) = @_;
+ $designunits = &number($number);
+ &expand(&property($name, $number));
+ undef;
+}
+
+sub designsize { # save designsize
+ local($name, $number) = @_;
+ push(@fontprops, "(FONTDSIZE $number)");
+ $designsize = &number($number);
+ &expand(&property($name, $number));
+ undef;
+}
+
+# character properties
+%charprop = @thismap = ();
+
+sub charprop {
+ local($name, $number) = @_;
+ $charprop{$name} = &number($number)*$designsize/$designunits;
+ undef;
+}
+
+sub moveright {
+ local($name, $number) = @_;
+ if ($charprop{CHARHS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARHS} = &number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub moveleft {
+ local($name, $number) = @_;
+ if ($charprop{CHARHS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARHS} = -&number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub moveup {
+ local($name, $number) = @_;
+ if ($charprop{CHARVS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARVS} = &number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub movedown {
+ local($name, $number) = @_;
+ if ($charprop{CHARVS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARVS} = -&number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub mark { # MAP property which makes a mark
+ $charprop{MARKED} = 1;
+ &property(@_);
+}
+
+sub map { # deal with MAP lists
+ shift;
+ @thismap = @_;
+ undef;
+}
+
+sub character { # add or replace character properties
+ local($name) = shift;
+ local($number) = shift;
+ local($value) = &number($number);
+ local(%props) = %charprop;
+
+ if (!$mapfont) {
+ &expand("(MAPFONT D 0", @fontprops, ")");
+ $mapfont = 1;
+ }
+
+ if (&inrange($value, $range)) { # adjust values
+ print STDERR "Altering properties for character $number\n" if $debug;
+ foreach (CHARWD, CHARHT, CHARDP, CHARIC, CHARHS, CHARVS) {
+ $props{$_} = eval $expr{$_}
+ if defined($expr{$_});
+ }
+ }
+ foreach (CHARWD, CHARHT, CHARDP, CHARIC) {
+ if ($props{$_}) {
+ push(@_, sprintf("($_ R %.5f)", $props{$_}*$designunits/$designsize));
+ }
+ }
+ push(@thismap, "(SETCHAR $number)") # add default map if necessary
+ if !@thismap && ($props{CHARHS} || $props{CHARVS});
+ if ($props{CHARHS} > 0) {
+ unshift(@thismap, sprintf("(MOVERIGHT R %.5f)",
+ $props{CHARHS}*$designunits/$designsize));
+ } elsif ($props{CHARVS} < 0) {
+ unshift(@thismap, sprintf("(MOVELEFT R %.5f)",
+ -$props{CHARHS}*$designunits/$designsize));
+ }
+ if ($props{CHARVS} > 0) {
+ unshift(@thismap, sprintf("(MOVEUP R %.5f)",
+ $props{CHARVS}*$designunits/$designsize));
+ } elsif ($props{CHARVS} < 0) {
+ unshift(@thismap, sprintf("(MOVEDOWN R %.5f)",
+ -$props{CHARVS}*$designunits/$designsize));
+ }
+
+ @thismap = ("(MAP", @thismap, ")")
+ if @thismap;
+
+ &expand("(CHARACTER $number", @_, @thismap, ")");
+
+ %charprop = @thismap = ();
+ undef;
+}
+
+###############################################################################
+# Parsing and tokenisation
+###############################################################################
+
+# list of property -> parameters_action
+# (N=number, S=string, P=property list, L=label or number)
+&plactions(CHECKSUM, checksum, DESIGNSIZE, designsize,
+ DESIGNUNITS, designunits, CODINGSCHEME, printprop,
+ FAMILY, printprop, FACE, printprop, SEVENBITSAFEFLAG, ignore,
+ HEADER, printprop, BOUNDARYCHAR, printprop,
+ VTITLE, vtitle, COMMENT, printprop,
+ FONTDIMEN, printlist, # FONTDIMEN properties follow
+ SLANT, property, SPACE, property, STRETCH, property,
+ SHRINK, property, XHEIGHT, property, QUAD, property,
+ EXTRASPACE, property, NUM1, property, NUM2, property,
+ NUM3, property, DENOM1, property, DENOM2, property,
+ SUP1, property, SUP2, property, SUP3, property,
+ SUB1, property, SUB2, property, SUPDROP, property,
+ SUBDROP, property, DELIM1, property, DELIM2, property,
+ AXISHEIGHT, property, DEFAULTRULETHICKNESS, property,
+ BIGOPSPACING1, property, BIGOPSPACING2, property,
+ BIGOPSPACING3, property, BIGOPSPACING4, property,
+ BIGOPSPACING5, property, PARAMETER, property,
+ LIGTABLE, printlist, # LIGTABLE properties follow
+ LABEL, property, KRN, property, STOP, property,
+ SKIP, property, LIG, property, '/LIG', property,
+ '/LIG>', property, 'LIG/', property, 'LIG/>', property,
+ '/LIG/', property, '/LIG/>', property,
+ '/LIG/>>', property,
+ MAPFONT, mapfont, # MAPFONT properties follow
+ FONTDSIZE, property, FONTNAME, property, FONTAREA, property,
+ FONTCHECKSUM, property, FONTAT, property,
+ CHARACTER, character, # CHARACTER properties follow
+ CHARWD, charprop, CHARHT, charprop, CHARDP, charprop,
+ CHARIC, charprop, NEXTLARGER, property,
+ VARCHAR, list, # VARCHAR properties follow
+ TOP, property, MID, property, BOT, property, REP, property,
+ MAP, map, # MAP properties follow
+ SELECTFONT, property, SETCHAR, mark,
+ SETRULE, mark, PUSH, mark, POP, mark,
+ MOVERIGHT, moveright, MOVELEFT, moveleft, MOVEUP, moveup,
+ MOVEDOWN, movedown, SPECIAL, mark, SPECIALHEX, mark
+ );
+
+###############################################################################
+# Expression checking
+###############################################################################
+
+# compileexpr(expr)
+# sanitise and convert expression to do-form
+sub compileexpr {
+ local($expr) = shift;
+ local($paren, $operand, $newexpr) = (0, 1);
+ foreach (split(/([-()\/*+])/, $expr)) {
+ s/\s*//g; # drop spaces
+ next if /^$/; # ignore empty lines
+ if ($operand) { # operand expected
+ if (/^\d+$/ || /^\d*\.\d+$/) { # constant
+ $newexpr .= $_;
+ $operand = 0;
+ } elsif (/^wd$/ || /^ht$/ || /^dp$/ || /^ic$/ || /^hs$/ || /^vs$/) {
+ tr/a-z/A-Z/; # uppercase
+ $newexpr .= "\$charprop{CHAR$_}"; # character property
+ $operand = 0;
+ } elsif (/^ds$/) { # designsize
+ $newexpr .= "\$designsize";
+ $operand = 0;
+ } elsif (/\(/) { # open parenthesis
+ $newexpr .= $_;
+ $paren++;
+ } elsif (/-/) { # unary negation
+ $newexpr .= $_;
+ } else {
+ &fatal("Operand expected, got $_ in $expr\n");
+ }
+ } else { # operator expected
+ if (/[-+*\/]/) { # operator found
+ $newexpr .= $_;
+ $operand = 1;
+ } elsif (/\)/) { # close parenthesis
+ $newexpr .= $_;
+ &fatal("Unmatched ) in $expr\n") if --$paren < 0;
+ } else {
+ &fatal("Operator expected, got $_ in $expr\n");
+ }
+ }
+ }
+ &fatal("Unmatched ( in $expr\n") if $paren;
+ print STDERR "Compiled $expr to $newexpr\n" if $debug;
+ $newexpr;
+}
+
+###############################################################################
+# Argument processing
+###############################################################################
+
+$vtitle = join(' ', $prog, @ARGV); # set VTITLE to arguments
+%expr = (); # property -> expression
+$range = '-'; # character range
+
+while (@ARGV) {
+ $_ = shift;
+ ARGSW:
+ {
+ /^-quiet$/ && ($quiet = 1, last ARGSW);
+ /^-debug$/ && ($debug = 1, last ARGSW);
+ /^-range$/ && ($range = shift, last ARGSW);
+ /^-(ic|wd|ht|dp|hs|vs)$/ &&
+ (($prop = "CHAR$1") =~ tr/a-z/A-Z/,
+ $expr{$prop} = &compileexpr(shift), last ARGSW);
+ if (/^-/) {
+ /^-v$/ && print STDERR "$prog release @RELEASE@\n";
+ print STDERR join("\n",
+ "Usage: $prog [-quiet] [-defenc defaultenc] [-wd expr] [-ht expr] [-dp expr]",
+ " [-hs expr] [-vs expr] filename\n");
+ exit 1;
+ } else { # filename
+ &fatal('too many property list files specified') if defined($file);
+ $file = $_;
+ }
+ }
+}
+
+&fatal('no property list files specified') if !defined($file);
+
+print "(VTITLE created by $vtitle)\n",
+ "(COMMENT $prog is (C) A. J. C. Duggan 1993)\n";
+
+@fontprops = ("(FONTNAME ".&fontname($file).")");
+
+&parsepl($file); # process PL file
+
+exit 0; # good termination